[
  {
    "path": ".editorconfig",
    "content": "[*.{kt,kts}]\nindent_size=2\ninsert_final_newline=false\nktlint_standard_no-wildcard-imports=disabled\nktlint_standard_trailing-comma-on-call-site=disabled\nktlint_standard_trailing-comma-on-declaration-site=disabled\nktlint_standard_annotation=disabled\nktlint_standard_multiline-if-else=disabled\nktlint_standard_argument-list-wrapping=disabled\nktlint_standard_spacing-between-declarations-with-annotations=disabled\nktlint_standard_spacing-between-declarations-with-comments=disabled\nktlint_standard_no-empty-first-line-in-method-block=disabled\nktlint_standard_argument-list-wrapping=disabled\nktlint_standard_indent=disabled"
  },
  {
    "path": ".gitattributes",
    "content": "# Merge strategies\napp/src/main/AndroidManifest.xml merge=union\napp/src/main/res/values/example_categories.xml merge=union\napp/src/main/res/values/example_descriptions.xml merge=union\napp/src/main/res/values/example_titles.xml merge=union\nCHANGELOG.md merge=union\n\n# Mark files as generated in Github PRs\n**/generated/* linguist-generated=true\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "* @mapbox/maps-android\n*.api @mapbox/maps-android @mapbox/maps-ios"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.md",
    "content": "---\nname: Feature Request\nabout: To request a new feature, please provide detail on the outcome desired, solutions attempted and any suggested approaches.\ntitle: ''\nlabels: 'feature :green apple:'\nassignees: ''\n\n---\n\n## New Feature\n\n<- Description of the feature being requested and any outcomes desired, an example use case, and any suggestions for solution ->\n\n## Why\n<- 1-2 sentence description of why you're requesting this feature. What problem does it solve? Why is it valuable? ->\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue_template.md",
    "content": "---\nname: Bug\nabout: This template should be used for reporting bugs and defects.\nlabels: 'bug :beetle:'\nassignees: ''\n---\n\n## Environment\n\n- Android OS version:\n- Devices affected:\n- Maps SDK Version:\n\n## Observed behavior and steps to reproduce\n\n<!--- Please include as much evidence as possible (traces, videos, screenshots etc） --->\n\n## Expected behavior\n\n<!--- Please include the expected behavior and any resources supporting this expected behavior. --->\n\n## Notes / preliminary analysis\n\n<!--- include your initial analysis, if available --->\n\n## Additional links and references\n\n<!--- Links to traces, videos etc --->\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "<!--\nThanks for submitting a pull request!\nPlease fill out the sections below to complete your submission.\nWe appreciate your contributions!\n-->\n\n### Summary of changes\n\n<!--\n• If this is a new feature, include a short summary on how to use it.\n• If this is a bug fix, explain how your contribution resolves the problem.\n• Include a screenshot or gif if applicable\n-->\n\n### User impact (optional)\n\n<!--\nIf this PR introduces user-facing changes, please note them here.\n-->\n\n\n## Pull request checklist:\n - [ ] Briefly describe the changes in this PR.\n - [ ] Include before/after visuals or gifs if this PR includes visual changes.\n    <!--\n        | Before | After |\n        | ----- | ----- |\n        | <img src=\"\" width = 250/> | <img src=\"\" width = 250/> |\n        or\n        | <video src=\"\" width = 250/> | <video src=\"\" width = 250/> |\n    -->\n - [ ] Write tests for all new functionality. If tests were not written, please explain why.\n - [ ] Optimize code for java consumption (`@JvmOverloads`, `@file:JvmName`, etc).\n - [ ] Add example if relevant.\n - [ ] Document any changes to public APIs.\n - [ ] Run `make update-api` to update generated api files, if there's public API changes, otherwise the `verify-api-*` CI steps might fail.\n - [ ] Update [CHANGELOG.md](../CHANGELOG.md) or use the label 'skip changelog', otherwise `check changelog` CI step will fail.\n - [ ] If this PR is a `v10.[version]` release branch fix / enhancement, merge it to `main` firstly and then port to `v10.[version]` release branch.\n\nFixes: < Link to related issues that will be fixed by this pull request, if they exist >\n\nPRs must be submitted under the terms of our Contributor License Agreement [CLA](https://github.com/mapbox/mapbox-maps-android/blob/main/CONTRIBUTING.md#contributor-license-agreement).\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Configuration for probot-stale - https://github.com/probot/stale\n\nexemptProjects: true\nexemptMilestones: true\n\nstaleLabel: archived\n\nlimitPerRun: 1\n\n# SEMVER-MAJOR - @tobrun\nexemptLabels:\n  - SEMVER-MAJOR\n\npulls:\n  daysUntilStale: 60\n  daysUntilClose: 7\n  markComment: false\n  closeComment: >\n    This pull request has been automatically detected as stale because it has not had\n    recent activity and will be archived. Thank you for your contributions.\n\nissues:\n  daysUntilStale: 180\n  daysUntilClose: -1\n  markComment: false\n  closeComment: >\n    This issue has been automatically detected as stale because it has not had\n    recent activity and will be archived. Thank you for your contributions.\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\n#\n# ******** NOTE ********\n# We have attempted to detect the languages in your repository. Please check\n# the `language` matrix defined below to confirm you have the correct set of\n# supported CodeQL languages.\n#\nname: \"CodeQL\"\n\non:\n  push:\n    branches: [ \"main\", v*.* ]\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches: [ \"main\" ]\n  schedule:\n    - cron: '24 7 * * 6'\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n    environment: env\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ 'java', 'python' ]\n        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]\n        # Use only 'java' to analyze code written in Java, Kotlin or both\n        # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both\n        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v3\n\n    # Initializes the CodeQL tools for scanning.\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v2\n      with:\n        languages: ${{ matrix.language }}\n        # If you wish to specify custom queries, you can do so here or in a config file.\n        # By default, queries listed here will override any specified in a config file.\n        # Prefix the list here with \"+\" to use these queries and those in the config file.\n\n        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs\n        # queries: security-extended,security-and-quality\n\n\n    # Autobuild attempts to build any compiled languages  (C/C++, C#, Go, or Java).\n    # If this step fails, then you should remove it and run the build manually (see below)\n    - name: Autobuild\n      uses: github/codeql-action/autobuild@v2\n      env:\n          SDK_REGISTRY_TOKEN: ${{ secrets.SDK_REGISTRY_TOKEN}}\n\n    # ℹ️ Command-line programs to run using the OS shell.\n    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun\n\n    #   If the Autobuild fails above, remove it and uncomment the following three lines.\n    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.\n\n    # - run: |\n    #   echo \"Run, Build Application using script\"\n    #   ./location_of_script_within_repo/buildscript.sh\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v2\n      with:\n        category: \"/language:${{matrix.language}}\"\n"
  },
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/captures\n.externalNativeBuild\n.cxx\n**/build\n/.idea\napp/src/main/res/values/developer-config.xml\napp/src/androidTest/java/com/mapbox/maps/testapp/activity\n**/developer-config.xml\nnode_modules/\ngh_token.txt\nandroid-docs-repo\nexamples.zip\nrelease-docs/\nrelease-docs.zip\n/tmp/checksum.txt\napi_compat_report/\nlogs/\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog for Mapbox Maps SDK for Android\n\nMapbox welcomes participation and contributions from everyone.\n\n> **16 KB Page Size Support:** Starting with version 11.7.0 and 10.19.0, **NDK 27 is supported** with dedicated artifacts that include [support for 16 KB page sizes](https://developer.android.com/guide/practices/page-sizes). If your app does not require 16 KB page size support, you can keep using our default artifacts without `-ndk27` suffix. For more information about our NDK support, see https://docs.mapbox.com/android/maps/guides/#ndk-support\n\n# main\n\n# 11.22.0-rc.1 April 08, 2026\n## Features ✨ and improvements 🏁\n* Expose `height` and `minHeight` properties on `StandardBuildingsFeature`.\n* Deprecate `PointAnnotation.iconImage` getter. Reading this property exposes an internally generated image ID managed by the annotation manager. If you need a stable, reusable image ID, register the image in the style yourself via the Style API and pass the ID explicitly via `PointAnnotationOptions.withIconImage(String)`. In that case you are responsible for the image's lifecycle and must remove it from the style when no longer needed.\n* Internal fixes and performance improvements.\n\n## Bug fixes 🐞\n* Fix native memory leak in `AnnotationManager` where bitmap style images were not removed when annotations were deleted.\n* Fix feature ID format mismatch in JNI marshaling where whole-number `double` feature IDs (e.g. `12345.0`) were incorrectly serialized as `\"12345.000000\"` instead of `\"12345\"`, causing `setFeatureState` to fail when using IDs obtained from `queryRenderedFeatures`.\n* [compose] Fix `MapboxMap` crash (`place is called on a deactivated node`) when used inside a `LazyColumn`.\n  * [compose] **Known limitation:** on Compose Foundation 1.7+ a secondary crash (`Apply is called on deactivated node`) may still occur when `MapboxMap` is used inside a `LazyColumn` during fast scrolling/item reuse because of `LazyColumn` prefetch behavior. Workaround: pass a no-op `LazyListPrefetchStrategy` to `rememberLazyListState()`; see `LazyColumnMapActivity` for an example.\n* Fix location indicator cutout appearing in the wrong position on devices with high pixel density.\n* Fix lines with sub-pixel width being rendered thicker than intended.\n* Fix tile data decompression by properly tracking compression state in tile storage.\n* Fix potential ANR caused by a deadlock in lifecycle management.\n* Fix tile store cleanup task incorrectly deleting in-progress downloads.\n* Fix tiles failing to load on some Android devices when the server response is incomplete.\n\n## Dependencies\n* Update gl-native to [v11.22.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.22.0-rc.1), common to [v24.22.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.22.0-rc.1).\n\n\n# 11.21.0 April 02, 2026\n## Dependencies\n* Update gl-native to [v11.21.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.21.0), common to [v24.21.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.21.0).\n\n\n# 11.21.0-rc.1 March 23, 2026\n\n## Bug fixes 🐞\n* Fix intermittent rendering artifacts (reversed/large bitmaps) on Android Auto caused by stale texture ID reuse in `BitmapWidgetRenderer` after surface recreation.\n* Fix native memory leak in `AnnotationManager` where bitmap style images were not removed onDestroy.\n* Fix feature cutout rendering artifacts on some devices caused by insufficient shader precision.\n* Fix rendering of stacked underground 3D roads.\n* Fix a crash that could occur when the map is destroyed during style loading.\n* Fix underground road geometry being clipped in orthographic projection with small viewports.\n* Fix map flickering caused by stencil buffer conflicts between raster and hillshade layers.\n* Fix potential ANRs when receiving location updates under heavy system load.\n* Fix a bug in eviction logic for TileStore.\n* Internal fixes and performance improvements.\n\n## Dependencies\n* Update gl-native to [v11.21.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.21.0-rc.1), common to [v24.21.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.21.0-rc.1).\n\n# 11.20.1 March 17, 2026\n## Bug fixes 🐞\n* Internal fixes and performance improvements.\n\n## Dependencies\n* Update gl-native to [v11.20.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.20.1), common to [v24.20.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.20.1).\n\n\n# 11.20.0 March 13, 2026\n\n## Features ✨ and improvements 🏁\n* [compose] Add declarative animation API to experimental `Marker` composable with two animation triggers: `appearAnimation` and `disappearAnimation`. Each trigger accepts a list of `MarkerAnimationEffect` including `wiggle` (pendulum rotation), `scale`, `fadeIn`, and `fadeOut`. Effects can be customized with parameters (e.g., `scale(from = 0.5f, to = 1.5f)`, `fade(from = 0.5f, to = 1.0f)`) and combined for rich animations. See `MarkersActivity` example for usage.\n* Improve FPS statistics logging when `mapView.setOnFpsChangedListener()` is used with separate tracking for frame pacing skips and missed render frames for better performance debugging.\n\n## Bug fixes 🐞\n* Fix NPE crash in `PointAnnotationClusterActivity` example when the remote GeoJSON endpoint returns a non-successful HTTP response.\n* Fix `MapSurface.setMaximumFps` not working correctly on secondary displays (e.g. Android Auto). Use `Context.getDisplay()` on API 30+ to get the actual display refresh rate instead of always using the primary display's rate.\n* Fix `PointAnnotationManager.iconImageBitmap` setter not registering the bitmap image with the style, causing group-level bitmap icons to be invisible.\n* Fix intermittent rendering artifacts (reversed/large bitmaps) on Android Auto caused by stale texture ID reuse in `BitmapWidgetRenderer` after surface recreation.\n* Fix feature cutout artifacts at route overlaps.\n* Fix a data race condition for `FillExtrusion` layer.\n* Fix several issues related to runtime symbol appearances switches.\n* Fix disappearing icons after reducing memory use.\n* Fix landmark POI image loads causes relayout for unrelated layers.\n* Fix tilestore eviction logic to not block tilestore thread completely.\n* Fix out-of-bounds issue for elevated line caused by an incorrect clipping result.\n\n## Dependencies\n* Update gl-native to [v11.20.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.20.0), common to [v24.20.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.20.0).\n\n\n# 11.20.0-rc.1 March 03, 2026\n\n## Features ✨ and improvements 🏁\n* [compose] Add declarative animation API to experimental `Marker` composable with two animation triggers: `appearAnimation` and `disappearAnimation`. Each trigger accepts a list of `MarkerAnimationEffect` including `wiggle` (pendulum rotation), `scale`, `fadeIn`, and `fadeOut`. Effects can be customized with parameters (e.g., `scale(from = 0.5f, to = 1.5f)`, `fade(from = 0.5f, to = 1.0f)`) and combined for rich animations. See `MarkersActivity` example for usage.\n* Improve FPS statistics logging when `mapView.setOnFpsChangedListener()` is used with separate tracking for frame pacing skips and missed render frames for better performance debugging.\n\n## Bug fixes 🐞\n* Fix `MapSurface.setMaximumFps` not working correctly on secondary displays (e.g. Android Auto). Use `Context.getDisplay()` on API 30+ to get the actual display refresh rate instead of always using the primary display's rate.\n* Fix `PointAnnotationManager.iconImageBitmap` setter not registering the bitmap image with the style, causing group-level bitmap icons to be invisible.\n* Fix feature cutout artifacts at route overlaps.\n* Fix a data race condition for `FillExtrusion` layer.\n* Fix several issues related to runtime symbol appearances switches.\n* Fix disappearing icons after reducing memory use.\n* Fix landmark POI image loads causes relayout for unrelated layers.\n* Fix tilestore eviction logic to not block tilestore thread completely.\n* Fix out-of-bounds issue for elevated line caused by an incorrect clipping result.\n\n## Dependencies\n* Update gl-native to [v11.20.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.20.0-rc.1), common to [v24.20.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.20.0-rc.1).\n\n\n# 11.19.1 March 10, 2026\n## Bug fixes 🐞\n* Internal fixes and performance improvements.\n\n## Dependencies\n* Update gl-native to [v11.19.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.19.1), common to [v24.19.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.19.1).\n\n\n# 11.19.0 February 24, 2026\n\n## Features ✨ and improvements 🏁\n* Introduce new `AnnotationConfig#slotName` property to allow to specify a slot to position annotation layer.\n* Introduce experimental `queryRenderedRasterValues` API for querying the rendered raster values on the map at a specific screen coordinate.\n* Deprecate `Tilestore.create(path: String)` instead use `TileStore.setRootPath()`.\n* Improve data serialization speed when using `LineString` or `MultiPoint` in `GeoJsonSource`.\n* Introduce new `LineLayer.lineElevationGroundScale` property to scale elevated lines with terrain exaggeration.\n* Promote elevated lines properties to stable: `LineLayer.lineZOffset` and `LineLayer.lineElevationReference`.\n* Introduce experimental `SymbolScaleBehavior` API to automatically scale map symbols (icons and text) based on system accessibility text size settings. Set `MapboxMap.symbolScaleBehavior` property to configure: `SymbolScaleBehavior.system` (automatic scaling), `SymbolScaleBehavior.system(mapping)` (custom mapping function), or `SymbolScaleBehavior.fixed(scaleFactor)` (fixed scale, default is 1.0). Valid scale factor range is [0.8, 2.0]. Automatic scaling is opt-in; symbols default to fixed 1.0x scale.\n* General fixes and performance improvements.\n\n## Bug fixes 🐞\n* Fix rare scenario where map render surface size was wrong.\n* Respect `animationDurationMs` when custom `OverviewViewportStateOptions.animationDurationMs` is set.\n* Fix point View Annotation flickering and hiding on moving anchor out of screen.\n* Fixed a potential leak of animators, which resulted in the absence of MapIdle events.\n* Fix elevated line bevel join artifacts at sharp corners.\n* [compose] Improved reliability of attribution list updates on source change.\n* Fix duplicate name detection bug in symbol appearance conversion.\n* Fix a crash when using feature dependent appearances with images and default appearance image is empty.\n\n## Dependencies\n* Update gl-native to [v11.19.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.19.0), common to [v24.19.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.19.0).\n\n# 11.19.0-rc.1 February 12, 2026\n\n## Features ✨ and improvements 🏁\n* Improve data serialization speed when using `LineString` or `MultiPoint` in `GeoJsonSource`.\n* Introduce new `LineLayer.lineElevationGroundScale` property to scale elevated lines with terrain exaggeration.\n* Promote elevated lines properties to stable: `LineLayer.lineZOffset` and `LineLayer.lineElevationReference`.\n* Introduce experimental `SymbolScaleBehavior` API to automatically scale map symbols (icons and text) based on system accessibility text size settings. Set `MapboxMap.symbolScaleBehavior` property to configure: `SymbolScaleBehavior.system` (automatic scaling), `SymbolScaleBehavior.system(mapping)` (custom mapping function), or `SymbolScaleBehavior.fixed(scaleFactor)` (fixed scale, default is 1.0). Valid scale factor range is [0.8, 2.0]. Automatic scaling is opt-in; symbols default to fixed 1.0x scale.\n* General fixes and performance improvements.\n\n## Bug fixes 🐞\n* Fixed a potential leak of animators, which resulted in the absence of MapIdle events.\n* Fix elevated line bevel join artifacts at sharp corners.\n* [compose] Improved reliability of attribution list updates on source change.\n\n## Dependencies\n* Update gl-native to [v11.19.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.19.0-rc.1), common to [v24.19.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.19.0-rc.1).\n\n\n# 11.18.2 February 09, 2026\n\n## Bug fixes 🐞\n* Fix disappearing icons after reducing memory use.\n* Fix Point View Annotation flickering and hiding on moving anchor out of screen\n\n## Dependencies\n* Update gl-native to [v11.18.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.18.2), common to [v24.18.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.18.2).\n\n\n# 11.18.1 January 29, 2026\n## Dependencies\n* Update gl-native to [v11.18.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.18.1), common to [v24.18.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.18.1).\n\n## Features ✨ and improvements 🏁\n* Add `ModelSource` support with `ModelSourceModel`, `ModelMaterialOverride`, and `ModelNodeOverride` to enable interactive 3D models. Material overrides allow customization of color, emissive strength, opacity, and color mix intensity. Node overrides enable control of model part transformations such as rotating doors, landing gear, or propellers. Models can be updated via source-driven approach (modifying `ModelSource.models` directly) or feature-state driven approach (using expressions with feature state for dynamic control). For implementation examples, see `Interactive3DModelFeatureStateActivity` (Compose), `Interactive3DModelSourceActivity` (View), and `Animated3DModelActivity` (Compose).\n\n# 11.19.0-beta.1 January 28, 2026\n\n## Features ✨ and improvements 🏁\n* Introduce experimental `queryRenderedRasterValues` API for querying the rendered raster array value at a point on the map.\n* Introduce new `AnnotationConfig#slotName` property to allow to specify a slot to position annotation layer.\n* Introduce experimental `queryRenderedRasterValues` API for querying the rendered raster values on the map at a specific screen coordinate.\n* Introduce `StyleAttributionsChanged` event for detecting map attributions changes\n* Deprecate `Tilestore.create(path: String)` instead use `TileStore.setRootPath()`.\n\n## Bug fixes 🐞\n* Fix rare scenario where map render surface size was wrong.\n* Respect `animationDurationMs` when custom `OverviewViewportStateOptions.animationDurationMs` is set.\n* Fix point View Annotation flickering and hiding on moving anchor out of screen.\n\n## Dependencies\n* Update gl-native to [v11.19.0-beta.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.19.0-beta.1), common to [v24.19.0-beta.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.19.0-beta.1).\n\n## Features ✨ and improvements 🏁\n* Rename `IndoorManager.setOnIndoorUpdatedCallback` to `IndoorManager.subscribeOnIndoorUpdated` with returned Cancelable support. Add flow-based `val onIndoorUpdated: Flow<IndoorState>` API.\n\n# 11.18.0 January 15, 2026\n\n## Breaking changes ⚠️\n* Remove line-cutout-width and change line-cutout-opacity default to 1.0\n\n## Features ✨ and improvements 🏁\n* Add `ModelLayer.modelAllowDensityReduction` property to disable density reduction in model layers.\n* Add Standard Style color and 3D configuration options: `colorBuildings`, `colorCommercial`, `colorEducation`, `colorIndustrial`, `colorLand`, `colorMedical`, `show3dBuildings`, `show3dFacades`, `show3dLandmarks`, and `show3dTrees`.\n* Introduce experimental `AttributionControl` composable function that exposes `AttributionState` programmatically, enabling developers to build custom Attribution UI outside of the map while maintaining compliance with [Mapbox ToS](https://www.mapbox.com/legal/tos) requirements.\n* Introduce experimental indoor floor selector plugin. The plugin is not included in the default plugin list and must be explicitly added to `MapInitOptions.plugins`. It requires a style with indoor data and special access to indoor mapping features. To request more information, please use this [form](https://www.mapbox.com/forms/indoor-airport-maps).\n* Add experimental `shadowDrawBeforeLayer` property to directional light to allow specifying the position in the layer stack for drawing shadows on the ground.\n* [tile_store] Add `TileStore.setRootPath()` method to set tilestore path to be used by default.\n* Faster polygon triangulation for complex polygons.\n* Improved handling of occluded symbols with `text-occlusion-opacity` and `icon-occlusion-opacity` properties.\n* General fixes and performance improvements.\n\n## Bug fixes 🐞\n* Fix `userData` payload for `onSourceDataLoaded` event during GeoJSON partial update.\n* Fix guard rail placement.\n* Fix changes in brightness not always getting applied.\n* Fix leaking Vertex Array Objects.\n* Reset style fog, snow and rain impl when switching to a new style.\n* Fix rendering artefacts when persistent buffer mapping is enabled.\n* Fix Coercion expression possibleOutputs result for Array type.\n* Fix a crash when jumping between different projections.\n* Fixes for placements with `icon-optional`, `text-optional`, and missing parts.\n\n## Dependencies\n* Update gl-native to [v11.18.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.18.0), common to [v24.18.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.18.0).\n\n\n# 11.18.0-beta.1 December 17, 2025\n\n## Breaking changes ⚠️\n* Remove line-cutout-width and change line-cutout-opacity default to 1.0\n\n## Features ✨ and improvements 🏁\n* Add `ModelLayer.modelAllowDensityReduction` property to disable density reduction in model layers.\n* Add Standard Style color and 3D configuration options: `colorBuildings`, `colorCommercial`, `colorEducation`, `colorIndustrial`, `colorLand`, `colorMedical`, `show3dBuildings`, `show3dFacades`, `show3dLandmarks`, and `show3dTrees`.\n* Introduce experimental `AttributionControl` composable function that exposes `AttributionState` programmatically, enabling developers to build custom Attribution UI outside of the map while maintaining compliance with [Mapbox ToS](https://www.mapbox.com/legal/tos) requirements.\n* Introduce experimental indoor floor selector plugin. The plugin is not included in the default plugin list and must be explicitly added to `MapInitOptions.plugins`. It requires a style with indoor data and special access to indoor mapping features.\n* Add experimental `shadowDrawBeforeLayer` property to directional light to allow specifying the position in the layer stack for drawing shadows on the ground.\n* [tile_store] Add method to set tilestore path to be used by default.\n* Faster polygon triangulation for complex polygons.\n* General fixes and performance improvements.\n\n## Bug fixes 🐞\n* Fix `userData` payload for `onSourceDataLoaded` event during GeoJSON partial update.\n* Fix guard rail placement.\n* Fix changes in brightness not always getting applied.\n* Fix leaking Vertex Array Objects.\n* Reset style fog, snow and rain impl when switching to a new style.\n* Fix rendering artefacts when persistent buffer mapping is enabled.\n* Fix Coercion expression possibleOutputs result for Array type.\n* Fix a crash when jumping between different projections.\n\n## Dependencies\n* Update gl-native to [v11.18.0-beta.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.18.0-beta.1), common to [v24.18.0-beta.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.18.0-beta.1).\n\n\n# 11.17.2 February 24, 2026\n\n## Bug fixes 🐞\n* Avoid placing occlusion layers after location indicator layer.\n* Properly handle `CoordinateBounds` during conversion to internal type.\n\n## Dependencies\n* Update gl-native to [v11.17.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.2), common to [v24.17.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.2).\n\n\n# 11.17.1 December 11, 2025\n## Bug fixes 🐞\n* Reset style fog, snow and rain impl when switching to a new style.\n* Fix changes in brightness not always getting applied.\n* Fix occlusion of location indicator in tunnels.\n* Fix leaking Vertex Array Objects.\n\n## Dependencies\n* Update gl-native to [v11.17.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.1), common to [v24.17.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.1).\n\n# 11.17.0 December 04, 2025\n## Breaking changes ⚠️\n* Require passing required argument to the constructor of experimental `GeofencingState.Builder`, `GeofencingError.Builder`, `GeofencingEvent.Builder` and `GeofencingOptions.Builder` APIs.\n\n## Features ✨ and improvements 🏁\n* Promote Geofencing APIs to stable, remove `MapboxExperimental` annotations from Geofencing APIs.\n* Add TileStore improvements and optimizations.\n* Promote `ModelLayer` to stable.\n* Add `SymbolLayer.occlusionOpacityMode`, `SymbolLayer.iconColorBrightnessMax`, `SymbolLayer.iconColorBrightnessMin`, `SymbolLayer.iconColorContrast` properties.\n* Add `FillExtrusionLayer.castShadows` property.\n* Add `GeoJsonSource.minZoom` property.\n* Add `RasterArraySource.volatile` experimental property.\n* Make `line-emissive-strength` property data-driven.\n* Add experimental `MapboxMap.setFeatureStateExpression()`, `removeFeatureStateExpression()`, and `resetFeatureStateExpressions()` APIs to efficiently update feature state for multiple features at once using expressions.\n* Improved error reporting for offline tile region downloads on Android.\n* Enhanced reliability of network connections by improving how Cronet timeouts are handled.\n* Added experimental `MapOptions.Builder.scaleFactor()` for scaling icons and texts.\n* Add click gesture support to `Marker` composable with `onClick` parameter\n* Introduced `ScaleBarSettings.distanceUnits` property supporting metric, imperial, and nautical units, replacing the boolean `isMetricUnits` property.\n* Added `fuelingStationModePointOfInterestLabels` configuration option to Mapbox Standard and Standard Satellite styles. Control the visibility of fuel station and electric charging station POI labels with options: \"default\" (shows both), \"fuel\" (fuel stations only), \"electric\" (charging stations only), or \"none\" (hides both).\n* Introduce experimental support for Appearances. The Appearances layer property defines sets of appearance objects used to quickly change the visual styling of a layer based on a condition using feature-state. See `AppearancesActivity` in example application for further details.\n* Memory allocation improvements\n\n## Bug fixes 🐞\n* Fix config expression evaluation to properly check dependencies in nested value expressions.\n* Fix issue with shadows showing up on top of tunnel roads.\n* Fix view-aligned symbols with road elevation being cutout.\n* Fix camera listener not unsubscribed when disabling ScaleBar via `updateSettings { enabled = false }`\n* Fixed a crash when switching map styles quickly.\n* Fixed a threading bug to eliminate 3D rendering issues and instability.\n* Internal fixes and performance improvements.\n* Fix multiple crashes during style switches related to terrain rendering, texture management, and image cleanup.\n* Fix line patterns not elevating properly on HD roads.\n* Fix rendering of TileStore tiles when TileStore is used as disk cache and user is offline.\n* Fix performance regression for `distance` and `within` expressions when processing large GeoJSON datasets.\n* Fix GeoJSON tiled model disappearance during fast zoom interactions.\n* Fix rendering issues when switching between globe and mercator projections.\n* Logging improvements to reduce noise and duplication.\n\n## Dependencies\n* Update gl-native to [v11.17.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0), common to [v24.17.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0).\n\n# 11.17.0-rc.3 November 28, 2025\n## Features ✨ and improvements 🏁\n* Promote Geofencing APIs to stable, remove `MapboxExperimental` annotations from Geofencing APIs.\n\n## Dependencies\n* Update gl-native to [v11.17.0-rc.3](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-rc.3), common to [v24.17.0-rc.3](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-rc.3).\n\n\n# 11.17.0-rc.2 November 21, 2025\n## Dependencies\n* Update gl-native to [v11.17.0-rc.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-rc.2), common to [v24.17.0-rc.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-rc.2).\n\n\n# 11.17.0-rc.1 November 20, 2025\n## Features ✨ and improvements 🏁\n* Promote `ModelLayer` to stable.\n* Add `SymbolLayer.occlusionOpacityMode`, `SymbolLayer.iconColorBrightnessMax`, `SymbolLayer.iconColorBrightnessMin`, `SymbolLayer.iconColorContrast` properties.\n* Add `FillExtrusionLayer.castShadows` property.\n* Add `GeoJsonSource.minZoom` property.\n* Add `RasterArraySource.volatile` experimental property.\n* Make `line-emissive-strength` property data-driven.\n* Add experimental `MapboxMap.setFeatureStateExpression()`, `removeFeatureStateExpression()`, and `resetFeatureStateExpressions()` APIs to efficiently update feature state for multiple features at once using expressions.\n\n## Bug fixes 🐞\n* Fix camera listener not unsubscribed when disabling ScaleBar via `updateSettings { enabled = false }`\n\n## Dependencies\n* Update gl-native to [v11.17.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-rc.1), common to [v24.17.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-rc.1).\n\n\n# 11.17.0-beta.2 November 14, 2025\n## Features ✨ and improvements 🏁\n* Improved error reporting for offline tile region downloads on Android.\n* Enhanced reliability of network connections by improving how Cronet timeouts are handled.\n\n## Bug fixes 🐞\n* Fixed a crash when switching map styles quickly.\n* Fixed a threading bug to eliminate 3D rendering issues and instability.\n* Internal fixes and performance improvements.\n\n## Dependencies\n* Update gl-native to [v11.17.0-beta.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-beta.2), common to [v24.17.0-beta.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-beta.2).\n\n# 11.16.4 November 14, 2025\n## Bug fixes 🐞\n* Internal fixes and performance improvements.\n\n## Dependencies\n* Update gl-native to [v11.16.4](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.4), common to [v24.16.4](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.4).\n\n\n# 11.16.3 November 13, 2025\n## Bug fixes 🐞\n* Internal fixes and performance improvements.\n* Fix multiple crashes during style switches.\n\n## Dependencies\n* Update gl-native to [v11.16.3](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.3), common to [v24.16.3](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.3).\n\n# 11.17.0-beta.1 November 05, 2025\n## Breaking changes ⚠️\n* Require passing required argument to the constructor of experimental `GeofencingState.Builder`, `GeofencingError.Builder`, `GeofencingEvent.Builder` and `GeofencingOptions.Builder` APIs.\n\n## Features ✨ and improvements 🏁\n* Added experimental `MapOptions.Builder.scaleFactor()` for scaling icons and texts.\n* Add click gesture support to `Marker` composable with `onClick` parameter\n* Introduced `ScaleBarSettings.distanceUnits` property supporting metric, imperial, and nautical units, replacing the boolean `isMetricUnits` property.\n* Added `fuelingStationModePointOfInterestLabels` configuration option to Mapbox Standard and Standard Satellite styles. Control the visibility of fuel station and electric charging station POI labels with options: \"default\" (shows both), \"fuel\" (fuel stations only), \"electric\" (charging stations only), or \"none\" (hides both).\n* Introduce experimental support for Appearances. The Appearances layer property defines sets of appearance objects used to quickly change the visual styling of a layer based on a condition using feature-state. See `AppearancesActivity` in example application for further details.\n* Memory allocation improvements\n\n## Bug fixes 🐞\n * Fix multiple crashes during style switches related to terrain rendering, texture management, and image cleanup.\n * Fix line patterns not elevating properly on HD roads.\n * Fix rendering of TileStore tiles when TileStore is used as disk cache and user is offline.\n * Fix performance regression for `distance` and `within` expressions when processing large GeoJSON datasets.\n * Fix GeoJSON tiled model disappearance during fast zoom interactions.\n * Fix rendering issues when switching between globe and mercator projections.\n * Logging improvements to reduce noise and duplication.\n\n## Dependencies\n* Update gl-native to [v11.17.0-beta.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-beta.1), common to [v24.17.0-beta.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.17.0-beta.1).\n\n# 11.16.2 October 31, 2025\n\n## Bug fixes 🐞\n* Fix crash on 3D/satellite styles switching\n\n## Dependencies\n* Update gl-native to [v11.16.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.2), common to [v24.16.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.2).\n\n\n# 11.16.1 October 28, 2025\n\n## Bug fixes 🐞\n* Fix crash on frequent style switching\n* Fix iteration over GeoJSON children for `distance` and `within` expression to results in performance spike\n* Fix crash on day/night switch incorrect texture release order\n\n## Dependencies\n* Update gl-native to [v11.16.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.1), common to [v24.16.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.1).\n\n# 11.16.0 October 21, 2025\n## Bug fixes 🐞\n* Fix location request leak when setting custom location provider after updating settings\n\n## Dependencies\n* Update gl-native to [v11.16.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.0), common to [v24.16.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.0).\n\n\n# 11.16.0-rc.2 October 14, 2025\n\n## Features ✨ and improvements 🏁\n* Add zoom expression support for line-cutout-width property.\n* TileStore improvements.\n\n## Bug fixes 🐞\n* Fix `ConcurrentModificationException` if `detectors` list was modified in `AndroidGesturesManager` while processing events.\n* Fix 3D models disappearing randomly during fast zoom interactions.\n\n## Dependencies\n* Update gl-native to [v11.16.0-rc.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.0-rc.2), common to [v24.16.0-rc.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.0-rc.2).\n* Update Mapbox Gestures for Android to 0.9.2.\n\n# 11.16.0-rc.1 October 07, 2025\n\n## Bug fixes 🐞\n* Fix `var` expressions that did not work properly with config expressions.\n* Fix cutout disappearing at certain zoom and pitch levels with orthographic camera.\n* Fix potential crashes when updating style layer properties.\n\n## Dependencies\n* Update gl-native to [v11.16.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.0-rc.1), common to [v24.16.0-rc.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.0-rc.1).\n\n# 11.16.0-beta.1 September 23, 2025\n\n## Features ✨ and improvements 🏁\n* Update target and compile SDK version to 35\n* Added support for `LandmarkIcons` featureset in Mapbox Standard Style. Query and interact with landmark building icons that appear on the map, accessing properties including landmark ID, name, type, and localized names through the `StandardLandmarkIconsFeature` class.\n* Enhanced `MapboxStandardStyle()` and `MapboxStandardSatelliteStyle()` Compose functions with comprehensive configuration options:\n  - **Color customization**: Set custom colors for roads, motorways, water, greenspaces, administrative boundaries, and more\n  - **Landmark icons**: Control visibility of landmark building icons and labels (`showLandmarkIcons`, `showLandmarkIconLabels`)\n  - **Point-of-interest styling**: Configure POI label backgrounds, colors, and density\n  - **Road appearance**: Adjust road brightness, show/hide pedestrian roads and transit networks\n  - **Administrative boundaries**: Toggle boundary visibility and customize colors\n  - **3D objects**: Control visibility of buildings, landmarks, and trees with `show3dObjects`\n* Expose `LineLayer.lineCutoutFadeWidth` to control route line cutout fade width.\n* `com.mapbox.maps.MapboxTracing` was deprecated and moved to package `com.mapbox.common.MapboxTracing`.\n\n## Bug fixes 🐞\n* Fix incorrect color rendering for gradients and interpolations with zero alpha channel.\n* Fix incorrect positioning of map marker annotations, when coordinates do not change.\n* Fix incorrect display height for zooming gesture on secondary displays.\n* Fix some feature state-related bugs.\n* Fix precision issue in hillshade causing terrain with steps.\n* Fix incorrect Asset File Source initialization.\n* Fix an issue where `MapView#snapshot` listener was invoked twice when the map was not ready.\n\n## Dependencies\n* Update gl-native to [v11.16.0-beta.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.0-beta.1), common to [24.16.0-beta.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.16.0-beta.1).\n\n# 11.15.2 October 02, 2025\n## Features ✨ and improvements 🏁\n* Reduce number of allocations for network requests.\n\n## Dependencies\n* Update gl-native to [v11.15.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.15.2), common to [24.15.2](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.15.2).\n\n# 11.15.1 September 26, 2025\n\n# 11.15.0 September 11, 2025\n\n## Features ✨ and improvements 🏁\n* Expose `LineLayer.lineCutoutOpacity` and `LineLayer.lineCutoutWidth` to make route lines visible through obstructing 3D buildings and other aboveground features.\n* Expose experimental `MapboxMap.setStyleLayerPropertiesAsync` and `MapboxMap.setStyleLayerPropertyAsync` (also available through `Style`) to allow setting properties from a any thread and asynchronously.\n* Improve performance of the zooming-out animation\n\n## Bug fixes 🐞\n* Fix flyTo animation when zoom property is null or not changed\n* Fix `MapInteraction` for 2D and 3D location puck indicator\n* Fix ViewAnnotation disappears when interacting with location puck at different camera positions due to incorrect 2D puck bounding box calculation\n* Fix a bug where Dynamic View Annotations disappeared in corner cases\n* Fix bug where View Annotation is not displayed at zoom levels > 22\n* Fix potential crash caused by a race condition\n* Fix the alignment of the text and icon when using the text-anchor property.\n* Fix incorrect background color of icons when non-default color-theme is used\n* Fix tile border debug feature flickering on globe projection\n* Fix potential ANR (Application Not Responding) issue when retrieving display refresh rate during map initialization by offloading the system call to a background thread with proper timeout and fallback handling.\n* Fix frames skipped when calling `mapView.setMaximumFps(..)` multiple times.\n* Allow to create text-field without any text\n* Fix potential data race in mapbox token initialization\n* Fix cronet request cancel due to connect timeout & reduce objects created.\n\n## Dependencies\n* Update gl-native to [v11.15.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.15.0), common to [24.15.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.15.0).\n* Update Mapbox GeoJSON library to [v7.5.0](https://github.com/mapbox/mapbox-java/releases/tag/v7.5.0) which bumps GSON to v2.13.1 to address [CVE-2025-53864](https://nvd.nist.gov/vuln/detail/CVE-2025-53864). If your project uses AGP 7.0, you might need to add the following snippet to your `build.gradle` or upgrade to AGP 8.0+ ([more details](https://issuetracker.google.com/issues/342522142#comment8)):\n```\nconfigurations {\n    all {\n        exclude group: 'com.google.errorprone', module: 'error_prone_annotations'\n    }\n}\n```\n# 11.14.7 September 29, 2025\n\n## Dependencies\n* Update gl-native to [v11.14.7](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.14.7), common to [24.14.7](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.14.7).\n\n# 11.14.6 September 18, 2025\n\n## Dependencies\n* Update gl-native to [v11.14.6](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.14.6), common to [24.14.6](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.14.6).\n\n# 11.14.4 September 03, 2025\n\n## Features ✨ and improvements 🏁\n* Performance optimizations for View Annotations.\n\n## Dependencies\n* Update gl-native to v11.14.4, common to 24.14.4.\n\n# 11.14.3 August 29, 2025\n\n## Bug fixes 🐞\n* Fix a bug where Dynamic View Annotations disappeared in corner cases\n* Fix a bug where location indicator layer disappeared in certain configurations\n* Fix potential crash caused by a race condition\n\n## Dependencies\n* Update gl-native to v11.14.3, common to 24.14.3\n\n# 11.15.0-rc.1 August 28, 2025\n\n## Bug fixes 🐞\n* Fix bug where View Annotation is not displayed at zoom levels > 22\n* Fix potential crash caused by a race condition\n* Fix the alignment of the text and icon when using the text-anchor property.\n\n## Dependencies\n* Update gl-native to v11.15.0-rc.1, common to 24.15.0-rc.1.\n\n# 11.15.0-beta.3 August 18, 2025\n\n## Bug fixes 🐞\n* Fix incorrect background color of icons when non-default color-theme is used\n\n## Dependencies\n* Update gl-native to v11.15.0-beta.3, common to 24.15.0-beta.3.\n\n# 11.15.0-beta.2 August 15, 2025\n## Bug fixes 🐞\n* Fix tile border debug feature flickering on globe projection\n\n## Dependencies\n* Update gl-native to v11.15.0-beta.2, common to 24.15.0-beta.2.\n\n\n# 11.15.0-rc.1 August 28, 2025\n\n## Bug fixes 🐞\n* Fix frames skipped when calling `mapView.setMaximumFps(..)` multiple times.\n\n\n# 11.15.0-beta.1 August 12, 2025\n## Features ✨ and improvements 🏁\n* Improve performance during zoom out camera animations\n\n## Bug fixes 🐞\n* Fix potential ANR (Application Not Responding) issue when retrieving display refresh rate during map initialization by offloading the system call to a background thread with proper timeout and fallback handling.\n* Fix frames skipped when calling `mapView.setMaximumFps(..)` multiple times.\n* Fixed `text-field` to be created without any text but with an image only\n* Fix ViewAnnotation disappears when interacting with location puck at different camera positions due to incorrect 2D puck bounding box calculation\n* Fix potential data race in mapbox token initialization\n\n## Dependencies\n* Update gl-native to v11.15.0-beta.1, common to 24.15.0-beta.1.\n* Update Mapbox GeoJSON library to [v7.5.0](https://github.com/mapbox/mapbox-java/releases/tag/v7.5.0) which bumps GSON to v2.13.1 to address [CVE-2025-53864](https://nvd.nist.gov/vuln/detail/CVE-2025-53864). If your project uses AGP 7.0, you might need to add the following snippet to your `build.gradle` or upgrade to AGP 8.0+ ([more details](https://issuetracker.google.com/issues/342522142#comment8)):\n```\nconfigurations {\n    all {\n        exclude group: 'com.google.errorprone', module: 'error_prone_annotations'\n    }\n}\n```\n\n# 11.14.2 August 15, 2025\n\n# 11.14.1 August 07, 2025\n\n## Bug fixes 🐞\n* Fix missing map loaded event in case vector tile is not found\n\n## Dependencies\n* Update gl-native to v11.14.1, common to 24.14.1.\n\n\n# 11.14.0 July 30, 2025\n## Features ✨ and improvements 🏁\n* Added new `FillLayer.fillPatternCrossFade`, `FillExtrusionLayer.fillExtrusionPatternCrossFade`, `LineLayer.fillExtrusionPatternCrossFade` properties.\n* Provide depth range used for rendering 3D content to custom layers.\n* Added new `split` expression, which returns an array of substrings from a string, split by a delimiter parameter.\n* Added experimental `MapView.scheduleThreadServiceTypeReset()` to reset the renderer thread service type to Interactive. This experimental API is intended for edge cases involving custom lifecycle management or specific scenarios where the default lifecycle behavior is insufficient.\n* Added `setContentDescription()` method to `AttributionPlugin` and `AttributionView` interfaces to programmatically set accessibility content description for the attribution button.\n* Added `MapView.onResume()` which should be called in `onResume()` of the host activity or fragment to resume the map view if `plugin-lifecycle` is not used.\n\n## Bug fixes 🐞\n* [compose] Avoid excessive debug logging on SourceState, which can result in Out Of Memory in extreme cases. Avoid appending geojson data in `GeoJsonSourceState.toString()` override.\n* Fix exception when accessing enum properties in annotations.\n* Fix an issue where instant animation might not have been executed in case of launching multiple animations within a single frame.\n* Apply obfuscation rules for generated `@MapboxModule` with `enableConfiguration = true`\n* Handle getSharedPreferences exceptions in SettingsServiceHelper\n* Fixed placement for point symbols with symbol-z-offset\n* Fixed some icons being skipped in rare cases\n* Fixed text/icon intersections for optional texts/icons in some cases\n* Fix Dynamic View Annotations caches rebuilding on line-trim-offset updates\n* Fix symbol z-offset not working with fixed fill-extrusion-height\n* Fix potential race conditions in the sprite loader\n* Fix a crash when using `CustomRasterSourceTileRenderer`\n* Fix crashes when logging invalid data\n\n## Dependencies\n* Update gl-native to v11.14.0, common to 24.14.0.\n\n\n\n# 11.14.0-rc.1 July 16, 2025\n## Features ✨ and improvements 🏁\n* Added `setContentDescription()` method to `AttributionPlugin` and `AttributionView` interfaces to programmatically set accessibility content description for the attribution button.\n* Added `MapView.onResume()` which should be called in `onResume()` of the host activity or fragment to resume the map view if `plugin-lifecycle` is not used.\n* Improved zoom animation performance by preloading target tiles and reducing unnecessary intermediate tile processing, resulting in smoother camera transitions and reduced frame rate drops.\n* Introduce experimental `Marker` convenience API in Jetpack Compose. Use `Marker` to quickly add a `ViewAnnotation` pin at the specified coordinates with custom text, color, and stroke.\n\n## Bug fixes 🐞\n* Fix exception when accessing enum properties in annotations.\n* Fix an issue where instant animation might not have been executed in case of launching multiple animations within a single frame.\n* Fix potential data race in Mapbox token initialization\n* Minor fixes in `TileStore` service\n* Fixed an issue where View Annotations would disappear when rotating and tilting the `MapView` with `allowOverlapWithPuck=false` due to incorrect intersection calculations with off-screen location pucks.\n\n## Dependencies\n* Update gl-native to v11.14.0-rc.1 and common to 24.14.0-rc.1.\n\n# 11.14.0-beta.1 July 02, 2025\n\n## Features ✨ and improvements 🏁\n* Added new `FillLayer.fillPatternCrossFade`, `FillExtrusionLayer.fillExtrusionPatternCrossFade`, `LineLayer.fillExtrusionPatternCrossFade` properties.\n* Provide depth range used for rendering 3D content to custom layers.\n* Added new `split` expression, which returns an array of substrings from a string, split by a delimiter parameter.\n\n## Bug fixes 🐞\n* Apply obfuscation rules for generated `@MapboxModule` with `enableConfiguration = true`\n* Handle getSharedPreferences exceptions in SettingsServiceHelper\n\n## Dependencies\n* Update gl-native to v11.14.0-beta.1, common to 24.14.0-beta.1.\n* Update Mapbox Base Android library to [v0.12.0](https://github.com/mapbox/mapbox-base-android/releases/tag/v0.12.0).\n* Update Mapbox Gestures Android library to [v0.9.1](https://github.com/mapbox/mapbox-gestures-android/releases/tag/v0.9.1).\n\n\n# 11.13.1 June 18, 2025\n\n## Bug fixes 🐞\n* Apply a more robust policy for retrying failed network requests.\n\n## Dependencies\n* Update gl-native to v11.13.1, common to 24.13.1.\n\n# 11.13.0\n## Features ✨ and improvements 🏁\n* Expose `RenderThreadStatsRecorder` as experimental API.\n* Expose new experimental properties: `CircleLayer.circleElevationReference`, `FillLayer.fillConstructBridgeGuardRail`, `FillLayer.fillBridgeGuardRailColor`, `FillLayer.fillTunnelStructureColor`.\n* Promote `MapInteraction` APIs to stable, remove experimental `Style.STANDARD_EXPERIMENTAL` constant, as `Style.STANDARD` supports featuresets and map interactions by default.\n  * Add common `MapInteraction` APIs to `StandardStyleInteractionsState`: `.onFeaturesetClicked`, `.onLayerClicked`, `.onFeaturesetLongClicked`, `.onLayerLongClicked`, `.onMapClicked`, `.onMapLongClicked`.\n  * Add `StyleInteractionsState` to `MapboxStandardSatelliteStyle` so interactions can be used with the satellite style.\n* [compose] Rename experimental `ExperimentalStandardStyleState` to `StandardStyleState`, rename experimental `MapboxStandardStyleExperimental` to `MapboxStandardStyle(styleImportsContent, topSlot, middleSlot, bottomSlot, standardStyleState)`, and deprecate previous `MapboxStandardStyle` composable functions.\n* Expose new experimental camera event `MapboxMap.subscribeCameraChangedCoalesced`, `MapboxMap.cameraChangedCoalescedEvents`.\n* [compose] Expose new camera event `MapState.cameraChangedCoalescedEvents`\n* Introduce custom layer matrices API `CustomLayerMapProjection` in `CustomLayerRenderParameters` for globe projection.\n* Introduce `minZoom` and `maxZoom` properties for `CircleAnnotationManager`, `PointAnnotationManager`, `PolygonAnnotationManager`, `PolylineAnnotationManager`.\n* Introduce experimental `worldview` expression.\n* [compose] Introduce `minZoom` and `maxZoom` properties for `CircleAnnotationGroupState`, `PointAnnotationGroupState`, `PolygonAnnotationGroupState`, `PolylineAnnotationGroupState`.\n* [compose] Add config option `showLandmarkIcons` to `MapboxStandardStyle`.\n* Improve the performance of `MapboxMap.cameraForCoordinates(...)` for large amounts of points.\n\n## Bug fixes 🐞\n* Fix elevated lines rendering regression.\n* Do not write errors to logs if event was not send because events are disabled.\n* Fixed incorrect placement for symbols with symbol-z-elevate on Globe projection.\n* Elevated symbol heights now change as smooth as building heighs.\n* Fixing unstable placement for elevated symbols.\n* Respect config expressions in filter.\n* Fix symbol order with symbol-z-elevate true and symbol-z-order viewport-y.\n* Fix issue that promoteId content is missing after vector source serialization.\n* Fixed disappearing volatile tiles on camera changes in offline mode when `maximumStaleInterval` is set.\n* Resolved frequent DVA repositioning issues.\n* Fixed fill patterns for elevated roads.\n* Tiles are now properly reloaded when the language setting is removed.\n* Limited the collision grid size for view annotations to improve performance.\n* Fix location indicator bearing animation update being missing in some occasions.\n* Fix a bug where `cameraForCoordiantes` with screen box oscillates when initial zoom is close to set max zoom.\n* Skip unneeded tiles relayout when landmark icons get enabled.\n* Fix a crash in disk cache code when fetching a high-zoom (z > 16) tile.\n\n## Dependencies\n* Update gl-native to v11.13.0, common to 24.13.0.\n\n# 11.12.4 June 12, 2025\n## Bug fixes 🐞\n* Fix location indicator bearing animation update being missing in some occasions.\n\n## Dependencies\n* Update gl-native to v11.12.4 and common to v24.12.4.\n\n# 11.12.3 June 05, 2025\n## Features ✨ and improvements 🏁\n* Improve the performance of `MapboxMap.cameraForCoordinates(...)` for large amounts of points.\n\n## Bug fixes 🐞\n* Fix a crash in disk cache code when fetching a high-zoom (z > 16) tile.\n* Fix a bug where cameraForCoordiantes with screen box oscillates when initial zoom is close to set max zoom.\n## Dependencies\n* Update gl-native to v11.12.3 and common to v24.12.3.\n\n# 11.13.0-rc.1 June 03, 2025\n## Features ✨ and improvements 🏁\n* Introduce custom layer matrices API `CustomLayerMapProjection` in `CustomLayerRenderParameters` for globe projection.\n* Introduce `minZoom` and `maxZoom` properties for `CircleAnnotationManager`, `PointAnnotationManager`, `PolygonAnnotationManager`, `PolylineAnnotationManager`.\n* [compose] Introduce `minZoom` and `maxZoom` properties for `CircleAnnotationGroupState`, `PointAnnotationGroupState`, `PolygonAnnotationGroupState`, `PolylineAnnotationGroupState`.\n* [compose] Add config option `showLandmarkIcons` to `MapboxStandardStyle`.\n\n## Bug fixes 🐞\n* Fixed disappearing volatile tiles on camera changes in offline mode when `maximumStaleInterval` is set.\n* Resolved frequent DVA repositioning issues.\n* Fixed fill patterns for elevated roads.\n* Tiles are now properly reloaded when the language setting is removed.\n* Limited the collision grid size for view annotations to improve performance.\n\n## Dependencies\n* Update gl-native to v11.13.0-rc.1, common to 24.13.0-rc.1.\n\n# 11.13.0-beta.1 May 19, 2025\n## Breaking changes ⚠️\n* `PointAnnotation.iconImageCrossFade` has been deprecated and setting value to it will not have any impact. Use `PointAnnotationManager.iconImageCrossFadeTransition` instead.\n\n## Features ✨ and improvements 🏁\n* Expose `RenderThreadStatsRecorder` as experimental API.\n* Expose new experimental properties: `CircleLayer.circleElevationReference`, `FillLayer.fillConstructBridgeGuardRail`, `FillLayer.fillBridgeGuardRailColor`, `FillLayer.fillTunnelStructureColor`.\n* Promote `MapInteraction` APIs to stable, remove experimental `Style.STANDARD_EXPERIMENTAL` constant, as `Style.STANDARD` supports featuresets and map interactions by default.\n  * Add common `MapInteraction` APIs to `StandardStyleInteractionsState`: `.onFeaturesetClicked`, `.onLayerClicked`, `.onFeaturesetLongClicked`, `.onLayerLongClicked`, `.onMapClicked`, `.onMapLongClicked`.\n  * Add `StyleInteractionsState` to `MapboxStandardSatelliteStyle` so interactions can be used with the satellite style.\n* [compose] Rename experimental `ExperimentalStandardStyleState` to `StandardStyleState`, rename experimental `MapboxStandardStyleExperimental` to `MapboxStandardStyle(styleImportsContent, topSlot, middleSlot, bottomSlot, standardStyleState)`, and deprecate previous `MapboxStandardStyle` composable functions.\n* Expose new experimental camera event `MapboxMap.subscribeCameraChangedCoalesced`, `MapboxMap.cameraChangedCoalescedEvents`.\n* [compose] Expose new camera event `MapState.cameraChangedCoalescedEvents`\n\n## Bug fixes 🐞\n* Fix elevated lines rendering regression.\n* Do not write errors to logs if event was not send because events are disabled.\n* Fixed incorrect placement for symbols with symbol-z-elevate on Globe projection.\n* Elevated symbol heights now change as smooth as building heighs.\n* Fixing unstable placement for elevated symbols.\n* Respect config expressions in filter.\n* Fix symbol order with symbol-z-elevate true and symbol-z-order viewport-y.\n* Fix issue that promoteId content is missing after vector source serialization.\n\n## Dependencies\n* Update gl-native to v11.13.0-beta.1, common to 24.13.0-beta.1.\n\n\n# 11.11.1 May 16, 2025\n## Bug fixes 🐞\n* Fixed a crash that occurred when a runtime-added unused image was removed and later reused.\n\n## Dependencies\n* Update gl-native to v11.11.4.\n\n# 11.12.0 May 7, 2025\n## Features ✨ and improvements 🏁\n* Mapbox Geofencing is now available in public preview. Follow the documentation and code examples for [Android](https://docs.mapbox.com/android/maps/guides/geofencing/) and [iOS](https://docs.mapbox.com/ios/maps/guides/geofencing/) to get started.\n* Avoid fetching pixelRatio from gl-native while rendering scalebar to improve CPU usage.\n* Promote `MapView.attribution.getMapAttributionDelegate().extraAttributions` to stable.\n* Expose an experimental API to define a non-rectangular screen culling shape(`MapboxMap.get/setScreenCullingShape`)\n* Introduce experimental `colorUseTheme` API for `AmbientLight`, `DirectionalLight`, and `FlatLight` to override color theme of light.\n* [compose] Introduce experimental `colorUseTheme` API for `AmbientLightState`, `DirectionalLightState`, and `FlatLightState` to override color theme of light.\n* [compose] Introduce experimental `vignetteColorUseTheme` and `colorUseTheme` for `RainState` and `SnowState` which allows overriding color theme of precipitations.\n* [compose] Annotate `rememberGeoJsonSourceState` as delicate API due to performance implications when used with large GeoJsonData.\n* Avoid dynamic view annotation overlapping given symbol layers.\n* Vector icons can now also be retrieved via `getStyleImage` API.\n* Revert changes to `at` expression and add new `at-interpolated` expression.\n* Enable tile pack v2 format by default.\n\n## Bug fixes 🐞\n* Fixed a crash that occurred when a runtime-added unused image was removed and later reused.\n* `*-sort-key` properties now uses double, fixing incorrect sorting with big key values\n* Fix registering camera change listener every time `mapView.scalebar.enabled` is called with value `true` and it was already enabled.\n* Fix map flickering caused by the fill-extrusion pan tiles and missing stencil in 3D layers.\n* Fix semi transparent landmark icons.\n* Return null for config expression if requested config option is missing.\n* Fix clipPath and mask rendering for vector icon rasterization.\n* Fix dotted lines on tile borders.\n* Fix pattern not found when using imports.\n* Fix line layer not rendering if using `line-pattern` inside an imported style.\n* Fix ground effect gradient not working with multiple polygons.\n* Add simple bounds check to avoid crash during centroid computation.\n* Fix invisible line when interpolating line-width from 0 to 1 using line-progress.\n* Tile loading speedup.\n* Fix URL migration to DB v10.\n\n## Dependencies\n* Update gl-native to v11.12.0 and common to v24.12.0.\n\n# 11.12.0-rc.1\n## Features ✨ and improvements 🏁\n* Avoid fetching pixelRatio from gl-native while rendering scalebar to improve CPU usage.\n* Promote `MapView.attribution.getMapAttributionDelegate().extraAttributions` to stable.\n\n\n# 11.12.0-beta.1 April 09, 2025\n\n## Features ✨ and improvements 🏁\n* Introduce experimental `colorUseTheme` API for `AmbientLight`, `DirectionalLight`, and `FlatLight` to override color theme of light.\n* [compose] Introduce experimental `colorUseTheme` API for `AmbientLightState`, `DirectionalLightState`, and `FlatLightState` to override color theme of light.\n* [compose] Introduce experimental `vignetteColorUseTheme` and `colorUseTheme` for `RainState` and `SnowState` which allows overriding color theme of precipitations.\n* [compose] Annotate `rememberGeoJsonSourceState` as delicate API due to performance implications when used with large GeoJsonData.\n* Avoid dynamic view annotation overlapping given symbol layers.\n* Vector icons can now also be retrieved via `getStyleImage` API.\n* Revert changes to `at` expression and add new `at-interpolated` expression.\n* Enable tile pack v2 format by default.\n\n## Bug fixes 🐞\n* Fix semi transparent landmark icons.\n* Return null for config expression if requested config option is missing.\n* Fix clipPath and mask rendering for vector icon rasterization.\n* Fix dotted lines on tile borders.\n* Fix pattern not found when using imports.\n* Fix line layer not rendering if using `line-pattern` inside an imported style.\n* Fix ground effect gradient not working with multiple polygons.\n* Add simple bounds check to avoid crash during centroid computation.\n* Fix invisible line when interpolating line-width from 0 to 1 using line-progress.\n* Tile loading speedup.\n* Fix URL migration to DB v10.\n\n## Dependencies\n* Update gl-native to v11.12.0-beta.1 and common to v24.12.0-beta.1.\n\n\n# 11.11.0 March 26, 2025\n## Features ✨ and improvements 🏁\n* Support for landmark icons. Landmark icons are stylized, uniquely designed POI icons that indicate the most popular and recognizable landmarks on the map.\n* Support expression input for `PromoteId`.\n* Add a setting that allows geofencing users with Android <= 28 to access background locations. Add `mapbox-location-config.xml` file with the following content:\n```xml\n<resources>\n  <bool name=\"com.mapbox.common.location.sdk28_use_background_permissions\">true</bool>\n</resources>\n```\n* Add `Expression` support for `*UseTheme` style properties to override color theme for particular color properties in all layers.\n* Add experimental `*UseTheme` support for annotations and `LocationPuck3D`.\n* Introduce experimental `Style.setImportColorTheme`, which allows changing the color theme of the style import.\n* [compose] Introduce experimental `StyleImportState.styleColorTheme` which allows changing the color theme of the style import.\n* Conflate `MapboxMap.mapLoadedEvents`, `MapboxMap.mapLoadingErrorEvents`, `MapboxMap.styleLoadedEvents`, `MapboxMap.styleDataLoadedEvents`, `MapboxMap.cameraChangedEvents`, `MapboxMap.mapIdleEvents`, `MapboxMap.sourceAddedEvents`, `MapboxMap.sourceRemovedEvents`, `MapboxMap.sourceDataLoadedEvents`, `MapboxMap.styleImageMissingEvents`, `MapboxMap.styleImageRemoveUnusedEvents`, `MapboxMap.renderFrameStartedEvents`, `MapboxMap.renderFrameFinishedEvents`, `MapboxMap.resourceRequestEvents` by default to avoid blocking main thread due to slow collectors.\n\n## Bug fixes 🐞\n* Fix annotation drag being triggered when multi-finger gesture is in progress.\n* Fix missing vector images after style change.\n* Ensure background color is correctly set.\n* Fix background layer not being updated if raster image was updated in-place or if color theme changed.\n* Trigger DVA replacement if zoom diff is big.\n* Fix line placement symbol disappearing issue when in zoom level 5.\n* Place view annotation away from camera when pitch > 45.\n* Fix dark shades of gradient effect in night preset.\n* Fix Custom Raster Source behavior on re-creation.\n* Change unreachable connection retries to use exponential backoff.\n* Fixed incorrect rgba to hsla conversion for white color.\n* Fix vector images rasterization.\n* Make katakana and CJK symbol rendered correctly in vertical writing mode.\n* Fix a bug that may cause style packs to be either inaccessible or incorrect when updating an older tile store database created with Maps SDK 11.9 or earlier versions. **In systems that have already used Maps SDK 11.10.0 through 11.10.2, a re-download of style packs may be necessary.**\n* Fix a map start time regression by speed up tile loading.\n\n## Dependencies\n* Update gl-native to v11.11.0 and common to v24.11.0.\n\n\n\n# 11.10.3 March 19, 2025\n## Bug fixes 🐞\n* Fix a bug that may cause style packs to be either inaccessible or incorrect when updating an older tile store database created with Maps SDK 11.9 or earlier versions. **In systems that have already used Maps SDK 11.10.0 through 11.10.2, a re-download of style packs may be necessary.**\n* Fix a map start time regression by speed up tile loading.\n\n## Dependencies\n* Update gl-native to v11.10.3, common to v24.10.1.\n\n\n# 11.11.0-rc.1 March 12, 2025\n## Features ✨ and improvements 🏁\n* Add `Expression` support for `*UseTheme` style properties to override color theme for particular color properties in all layers.\n* Add experimental `*UseTheme` support for annotations and `LocationPuck3D`.\n* Introduce experimental `Style.setImportColorTheme`, which allows changing the color theme of the style import.\n* [compose] Introduce experimental `StyleImportState.styleColorTheme` which allows changing the color theme of the style import.\n* Conflate `MapboxMap.mapLoadedEvents`, `MapboxMap.mapLoadingErrorEvents`, `MapboxMap.styleLoadedEvents`, `MapboxMap.styleDataLoadedEvents`, `MapboxMap.cameraChangedEvents`, `MapboxMap.mapIdleEvents`, `MapboxMap.sourceAddedEvents`, `MapboxMap.sourceRemovedEvents`, `MapboxMap.sourceDataLoadedEvents`, `MapboxMap.styleImageMissingEvents`, `MapboxMap.styleImageRemoveUnusedEvents`, `MapboxMap.renderFrameStartedEvents`, `MapboxMap.renderFrameFinishedEvents`, `MapboxMap.resourceRequestEvents` by default to avoid blocking main thread due to slow collectors.\n\n## Bug fixes 🐞\n* Fixed incorrect rgba to hsla conversion for white color.\n* Fix vector images rasterization.\n* Make katakana and CJK symbol rendered correctly in vertical writing mode.\n\n## Dependencies\n* Update gl-native to v11.11.0-rc.1 and common to v24.11.0-rc.1.\n\n\n# 11.11.0-beta.1 March 03, 2025\n## Features ✨ and improvements 🏁\n* Support expression input for `PromoteId`.\n* Add a setting that allows geofencing users with Android <= 28 to access background locations. Add `mapbox-location-config.xml` file with the following content:\n```xml\n<resources>\n  <bool name=\"com.mapbox.common.location.sdk28_use_background_permissions\">true</bool>\n</resources>\n```\n\n## Bug fixes 🐞\n* Fix missing vector images after style change.\n* Ensure background color is correctly set.\n* Fix background layer not being updated if raster image was updated in-place or if color theme changed.\n* Trigger DVA replacement if zoom diff is big.\n* Fix line placement symbol disappearing issue when in zoom level 5.\n* Place view annotation away from camera when pitch > 45.\n* Fix dark shades of gradient effect in night preset.\n* Fix Custom Raster Source behavior on re-creation.\n* Change unreachable connection retries to use exponential backoff.\n\n## Dependencies\n* Update gl-native to v11.11.0-beta.1 and common to v24.11.0-beta.1.\n\n\n# 11.10.2 February 25, 2025\n## Bug fixes 🐞\n* Fixing missing vector images after style change\n\n## Dependencies\n* Update gl-native to v11.10.2.\n\n\n# 11.10.1 February 24, 2025\n## Features ✨ and improvements 🏁\n* Small performance improvements in the map initialization call chain by avoiding IPC calls on main.\n\n## Bug fixes 🐞\n* Fix LUT not being applied to in-place updated images.\n* Fix in-place updates for SDF images.\n* Fix background layer not being updated if raster image was updated in-place or if color theme changed.\n* Vector icons supported in location indicator layer.\n* Fix mipmaps for images updated inplace.\n* Ensure background color is correctly set.\n\n## Dependencies\n* Update gl-native to v11.10.1.\n\n# 11.10.0 February 13, 2025\n## Features ✨ and improvements 🏁\n* Localize geofencing attribution dialog.\n* Introduce `ViewAnnotationOptions.priority`, deprecate `ViewAnnotationOptions.selected`. Use this property to define view annotation sort order.\n* Introduce `ViewAnnotationOptions.minZoom` and `ViewAnnotationOptions.maxZoom`. Use these properties to configure zoom-level specific view annotations.\n* Introduce `SymbolLayer.iconSizeScaleRange`, `SymbolLayer.textSizeScaleRange`, `FillLayer.fillElevationReference`, `LineLayer.lineCrossSlope`, `LineLayer.lineWidthUnit`, `LineLayer.lineCrossSlope`, `LineLayer.lineElevationReference`, `DirectionalLight.shadowQuality`, `Rain.distortionStrength`, `Rain.distortionStrengthTransition`, `Rain.dropletSize`, `Rain.dropletSizeTransition`, `Rain.vignetteColor`, `Rain.vignetteColorTransition`, `Snow.flakeSize`, `Snow.flakeSizeTransition`, `Snow.vignetteColor`, `Snow.vignetteColorTransition`.\n* Introduce experimental Color Theme API, which allows changing the style of the map using `Style.setStyleColorTheme`.\n* Introduce experimental `ModelLayer.modelElevationReference` property.\n* Introduce experimental `LocationPuck3D.modelElevationReference` property.\n* Add experimental `ViewAnnotationManager.setViewAnnotationAvoidLayers` for specifying layers that view annotations should avoid. The API currently only supports line layers.\n* Add `*UseTheme` String style properties to override color theme for particular color properties in all layers and their Compose counterparts.\n* Add support for the `maxOverscaleFactorForParentTiles` property in `CustomRasterSource` and `CustomGeometrySource`, allowing greater control over tile overscaling behavior when rendering custom raster tiles.\n* Extend tilecover for elevated roads avoiding missing road segments.\n* Change default value of experimental `Rain.opacity` to 0.19, default `Rain.vignette` to 0.3, `Snow.opacity` to 0.19, default `Snow.vignette` to 0.3.\n* Update the default value of experimental properties: default `Snow.density` is updated to `[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]`; default `Snow.opacity` is updated to `1.0`; default `Snow.vignette` is updated to `[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]`; default `Snow.centerThinning` is updated to `0.4`, default `Snow.direction` is updated to `listOf(0.0, 50.0)`; default `Snow.flakeSize` is updated to `0.71`; default `Rain.density` is updated to `[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]`; default `Rain.color` is updated to `[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]`; default `Rain.opacity` is updated to `[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]`;  default `Rain.vignette` is updated to `[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]`; default `Rain.vignetteColor` is updated to `[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]`; default `Rain.centerThinning` is updated to `0.57`; default `Rain.dropletSize` is updated to `listOf(2.6, 18.2)`; default `Rain.distortionStrength` is updated to `0.7`.\n* Remove `@MapboxExperimental` from `ClipLayer.clipLayerTypes` and `ClipLayer.clipLayerScope`.\n* Remove `<profileable android:shell=true/>` flag in release manifest.\n* Remove `libandroid-tests-support-code.so` from release AAR.\n* Remove experimental `ShadowQuality` properties from direct light layer.\n* [compose] Introduce experimental `StyleState.colorTheme` state for setting `ColorTheme` for the style.\n* [compose] Introduce experimental `SymbolLayerState.iconSizeScaleRange`, `SymbolLayerState.textSizeScaleRange`, `FillLayerState.fillElevationReference`, `LineLayerState.lineCrossSlope`, `LineLayerState.lineWidthUnit`, `LineLayerState.lineCrossSlope`, `LineLayerState.lineElevationReference`, `DirectionalLightState.shadowQuality`, `RainState.distortionStrength`, `RainState.distortionStrengthTransition`, `RainState.dropletSize`, `RainState.dropletSizeTransition`, `RainState.vignetteColor`, `RainState.vignetteColorTransition`, `SnowState.flakeSize`, `SnowState.flakeSizeTransition`, `SnowState.vignetteColor`, `SnowState.vignetteColorTransition`.\n\n## Bug fixes 🐞\n* [compose] Fix wrong layer order when using `aboveLayer(..)` composable function.\n* [compose] Fix annotation composable functions not working inside `slot(...)` composable function.\n* [compose] Fix annotation composable functions rendered in wrong order.\n* Prefer last used anchor for Dynamic View Annotation placement.\n* Fix out of bound issue of gradient effect.\n* Fix hidden elements caused by flood lighting.\n* Fix parsing raster sprite images with float stretch/content coordinates.\n* Fix glyph loading issue when incorrect glyph url is used.\n* Speed up start with big old offline database.\n* Fix disappearing tiles in some rare conditions.\n* Fix rasterization of images with positive mask coordinates which caused vector icons not being rasterized correctly.\n* Place Dynamic View Annotation further away from camera when pitch > 45. This allows Dynamic View Annotation to be placed further away from the puck so it is not repositioned frequently.\n* Fix visual artifacts from `FillExtrusionLayer` for night presets.\n* Fix precision issues with 3D puck and orthographic projection when zoom is more than 17. The fix prevents puck-shadow from disappearing in lower zoom scales in 2D-views.\n* Fix road shadows issues when far away and low zoom levels.\n* Fix app crash when autoMaxZoom=true.\n* Fix an unhandled exception occurring during config expression parsing\n* Mark `BackgroundLayer.backgroundPitchAlignment` as experimental.\n* Skip any map scroll (panning) if shove gesture is already in progress preventing camera flying away.\n* Fix crash on style reload if a config referenced in the expression was missing.\n* Fix high cpu usage when map goes to background.\n* Fix missing on style loaded call if sprite is absent in cache and there is no network connection.\n* Fix background layers which used images from a mapbox-hosted style.\n* Fix images being displayed incorrectly in some cases with line patterns and `LineJoin.NONE`.\n* Fix too early sources loaded event.\n* Fix to calculate image size for max text size, not for the next zoom level text size.\n* Fix line rendering for layers with elevated and non-elevated buckets\n\n## Dependencies\n* Update gl-native to v11.10.0 and common to v24.10.0.\n\n\n\n# 11.9.2 February 05, 2025\n## Bug fixes 🐞\n* Fix exception while parsing the config expression.\n* Fix app crash when autoMaxZoom=true.\n* Fixing parsing raster sprite images with float stretch/content coordinates.\n* Fix color theme data decoding.\n* Fix glyph loading issue when incorrect glyph url is used.\n\n## Dependencies\n* Update gl-native to v11.9.3.\n\n\n# 11.10.0-rc.1 January 31, 2025\n## Features ✨ and improvements 🏁\n* Add experimental `ViewAnnotationManager.setViewAnnotationAvoidLayers` for specifying layers that view annotations should avoid. The API currently only supports line layers.\n* Add support for the `maxOverscaleFactorForParentTiles` property in `CustomRasterSource` and `CustomGeometrySource`, allowing greater control over tile overscaling behavior when rendering custom raster tiles.\n* Add `*UseTheme` String style properties to override color theme for particular color properties in all layers and their Compose counterparts.\n* Remove experimental `ShadowQuality` properties from direct light layer.\n* Extend tilecover for elevated roads avoiding missing road segments.\n* Introduce experimental Color Theme API, which allows changing the style of the map using `Style.setStyleColorTheme`.\n* [compose] Introduce experimental `StyleState.colorTheme` state for setting `ColorTheme` for the style.\n\n## Bug fixes 🐞\n* Prefer last used anchor for Dynamic View Annotation placement.\n* Fix out of bound issue of gradient effect.\n* Fix hidden elements caused by flood lighting.\n* Fix parsing raster sprite images with float stretch/content coordinates.\n* Fix glyph loading issue when incorrect glyph url is used.\n* Fix color theme data decoding.\n* Speed up start with big old offline database.\n* Fix disappearing tiles in some rare conditions.\n* Fix road shadows issues when far away and low zoom levels.\n\n## Dependencies\n* Update gl-native to v11.10.0-rc.1 and common to v24.10.0-rc.1.\n\n\n# 11.10.0-beta.1 January 20, 2025\n## Features ✨ and improvements 🏁\n* Localize geofencing attribution dialog.\n* Introduce `ViewAnnotationOptions.priority`, deprecate `ViewAnnotationOptions.selected`. Use this property to define view annotation sort order.\n* Introduce `ViewAnnotationOptions.minZoom` and `ViewAnnotationOptions.maxZoom`. Use these properties to configure zoom-level specific view annotations.\n* Introduce `SymbolLayer.iconSizeScaleRange`, `SymbolLayer.textSizeScaleRange`, `FillLayer.fillElevationReference`, `LineLayer.lineCrossSlope`, `LineLayer.lineWidthUnit`, `LineLayer.lineCrossSlope`, `LineLayer.lineElevationReference`, `DirectionalLight.shadowQuality`, `Rain.distortionStrength`, `Rain.distortionStrengthTransition`, `Rain.dropletSize`, `Rain.dropletSizeTransition`, `Rain.vignetteColor`, `Rain.vignetteColorTransition`, `Snow.flakeSize`, `Snow.flakeSizeTransition`, `Snow.vignetteColor`, `Snow.vignetteColorTransition`.\n* Change default value of experimental `Rain.opacity` to 0.19, default `Rain.vignette` to 0.3, `Snow.opacity` to 0.19, default `Snow.vignette` to 0.3.\n* [compose] Introduce experimental `SymbolLayerState.iconSizeScaleRange`, `SymbolLayerState.textSizeScaleRange`, `FillLayerState.fillElevationReference`, `LineLayerState.lineCrossSlope`, `LineLayerState.lineWidthUnit`, `LineLayerState.lineCrossSlope`, `LineLayerState.lineElevationReference`, `DirectionalLightState.shadowQuality`, `RainState.distortionStrength`, `RainState.distortionStrengthTransition`, `RainState.dropletSize`, `RainState.dropletSizeTransition`, `RainState.vignetteColor`, `RainState.vignetteColorTransition`, `SnowState.flakeSize`, `SnowState.flakeSizeTransition`, `SnowState.vignetteColor`, `SnowState.vignetteColorTransition`.\n* Remove `@MapboxExperimental` from `ClipLayer.clipLayerTypes` and `ClipLayer.clipLayerScope`.\n* Update the default value of experimental properties: default `Snow.density` is updated to `[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]`; default `Snow.opacity` is updated to `1.0`; default `Snow.vignette` is updated to `[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]`; default `Snow.centerThinning` is updated to `0.4`, default `Snow.direction` is updated to `listOf(0.0, 50.0)`; default `Snow.flakeSize` is updated to `0.71`; default `Rain.density` is updated to `[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]`; default `Rain.color` is updated to `[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]`; default `Rain.opacity` is updated to `[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]`;  default `Rain.vignette` is updated to `[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]`; default `Rain.vignetteColor` is updated to `[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]`; default `Rain.centerThinning` is updated to `0.57`; default `Rain.dropletSize` is updated to `listOf(2.6, 18.2)`; default `Rain.distortionStrength` is updated to `0.7`.\n* Introduce experimental `ModelLayer.modelElevationReference` property.\n* Introduce experimental `LocationPuck3D.modelElevationReference` property.\n* Remove `<profileable android:shell=true/>` flag in release manifest.\n* Remove `libandroid-tests-support-code.so` from release AAR.\n\n## Bug fixes 🐞\n* Mark `BackgroundLayer.backgroundPitchAlignment` as experimental.\n* Skip any map scroll (panning) if shove gesture is already in progress preventing camera flying away.\n* Fix crash on style reload if a config referenced in the expression was missing.\n* Fix high cpu usage when map goes to background.\n* Fix missing on style loaded call if sprite is absent in cache and there is no network connection.\n* Fix background layers which used images from a mapbox-hosted style.\n* Fix images being displayed incorrectly in some cases with line patterns and `LineJoin.NONE`.\n* Fix too early sources loaded event.\n\n## Known issues ⚠️\n* Disappearing tiles in some rare conditions. Fix will be available in the next release.\n\n## Dependencies\n* Update gl-native to v11.10.0-beta.2 and common to v24.10.0-beta.2.\n\n\n# 11.9.1 January 20, 2025\n## Bug fixes 🐞\n* Add missing experimental annotation to `backgroundPitchAlignment` property.\n* Fix crash on style reload if a config referenced in the expression was missing.\n* Fix high cpu usage when map goes to background.\n* Fix missing on style loaded call if sprite is absent in cache and there is no network connection.\n* Fix background layers which used images from a mapbox-hosted style.\n* Fix disappearing tiles in some rare conditions.\n\n## Dependencies\n* Update gl-native to v11.9.2.\n\n# 11.9.0 December 18, 2024\n## Known issues 🛑\nWe do not recommend using this version. Please use [11.9.1](https://github.com/mapbox/mapbox-maps-android/releases/tag/v11.9.1) or newer.\n\n* When a map is currently visible and user press home button the [MapboxRenderThread](maps-sdk/src/main/java/com/mapbox/maps/renderer/RenderHandlerThread.kt) consumes CPU (potentially keeping **one** CPU busy).\n\n## Breaking changes ⚠️\n* Expose experimental Geofencing with `com.mapbox.annotation.MapboxExperimental`.\n* Move experimental geofencing classes to `com.mapbox.common.geofencing` package from `com.mapbox.common.experimental.geofencing`.\n* Make constructor of experimental `GeofencingOptions`, `GeofencingEvent` and other geofencing classes holding data private. Associated `Builder()` classes should be used instead.\n* Remove experimental `MapboxMap.queryRenderedFeatures` and `MapboxMap.querySourceFeatures` that used `FeaturesetQueryTarget` as an argument.\n\n## Features ✨ and improvements 🏁\n* Introduce experimental `FillExtrusionLayer.fillExtrusionBaseAlignment` and `FillExtrusionLayer.fillExtrusionHeightAlignment` APIs to control the behavior of fill extrusion base over terrain and the behavior of fill extrusion height over terrain respectively.\n* Introduce experimental `FillLayer.fillZOffset` and `FillLayer.fillZOffsetTransition` APIs to specify a uniform elevation in meters and define the transition of `fillZOffset` respectively.\n* Adds support for `fillZOffset` in `PolygonAnnotation`, `PolygonAnnotationManager`, `PolygonAnnotationOptions`.\n* Introduce `BackgroundLayer.backgroundPitchAlignment` API to configure the orientation of background layer.\n* Introduce `LocationIndicatorLayer.emphasisCircleGlowRange` and `LocationIndicatorLayer.emphasisCircleGlowRangeTransition` APIs to control the glow effect of the emphasis circle from the solid start to the fully transparent end and to set the transition options for the `emphasisCircleGlowRange` property, respectively.\n* Introduce `radius` parameter for `ClickInteraction` and `LongClickInteraction` to support an extra area around the interaction.\n* Add a way to specify options for `Expression.image()`.\n* Introduce experimental `AnimatableModel`, `ModelMaterialPart`, `ModelNodePart` APIs to style the 3D location puck's overridable parts. [Implementation example](app/src/main/java/com/mapbox/maps/testapp/examples/LocationComponentModelAnimationActivity.kt).\n* Introduce `modelRotationExpression`, `modelColor`, `modelColorExpression`, `modelColorMixIntensity`, `modelColorMixIntensityExpression`, `modelOpacityExpression` on `LocationPuck3D`.\n* Introduce experimental `LocationPuck3D.materialOverrides` and `LocationPuck3D.nodeOverrides` API to allow model parts overrides.\n* Add vector icons support: SDK will now download vector icons and rasterize them locally, which will results in better icon quality for icons resized via icon-size. Changeable colors support: icon expression can now have optional parameter to change named colors described in SVG icons metadata.\n* Add support for shadows from elevated structures.\n* Add `toHsla` expression.\n* Introduce experimental `Snow` and `Rain` APIs to show the snow or rain effect on the map.\n* Expose experimental `getFeaturesets` for `MapboxMap` and `Style`.\n* Remove`MapboxExperimental` from `ClipLayer`.\n* [compose] Introduce `LocationIndicatorLayerState.emphasisCircleGlowRange` and `LocationIndicatorLayerState.emphasisCircleGlowRangeTransition` properties.\n* [compose] Introduce `FillLayerState.fillZOffset` and `FillLayerState.fillZOffsetTransition` properties.\n* [compose] Introduce `FillExtrusionLayerState.fillExtrusionBaseAlignment` and `FillExtrusionLayerState.fillExtrusionHeightAlignment` properties.\n* [compose] Introduce `BackgroundLayerState.backgroundPitchAlignment` property.\n* [compose] Adds support for `fillZOffset` in `PolygonAnnotationState`, `PolygonAnnotationGroupState`.\n* [compose] Expose `MapViewportState.cameraForCoordinates` method.\n* [compose] Introduce `radius` parameter for all relevant compose functions for interactions to support an extra area around the interaction.\n* [compose] Introduce experimental `SnowState` and `RainState` APIs to show the snow or rain effect on the map.\n\n## Bug fixes 🐞\n* Fix dark shades caused by corner case light directions when `FillLayer.fillExtrusionEmissiveStrength` is set to high values (closer to 1).\n* Fix rendering of interleaved SDF and non-SDF icons in the same layer.\n* Fix `LineLayer.lineEmissiveStrength` not being applied to patterned lines.\n* Fix map flickering on some Mali and PowerVR GPUs.\n* Fix shader fog computation being incorrectly enabled for landmarks.\n* Handle empty payloads for offline resources.\n* Encapsulate config expression in assertion expression when expected return type is known.\n* Fixes a bug which caused icon shifts in some cases.\n* Fix feature state update if layer contains data driven `measureLight` expression.\n* Fix the owning thread log error prints on legacy `OfflineRegion` creation.\n* Fix a crash in interpolate expression.\n* Resolve usage of `GeoJsonSource.autoMaxZoom` for single feature.\n* Resolve dotted line issue with very long lines.\n* Fix texture gather for shadows not being selected correctly by default.\n* Performance improvements for runtime-added images.\n* Fix `AndroidDeviceLocationProvider` reporting an error when location permissions are not granted.\n* Improve exception handling inside Cronet providers when Cronet library failed to load.\n* Improve character spacing for text offsets.\n* Fixed crash on Android API level < 26.\n* Do not load vector icons for client-provided sprites.\n* Fall back to the feature's original ID when promoteId is an object and the source layer is not specified as a key in the object.\n* Fixed crash caused by a repeated command buffer commit call.\n* Fixed invalid processing of icon-size 0, using biggest of two image sizes with interpolated icon-size during vector icons rasterization.\n\n## Dependencies\n* Update gl-native to v11.9.0 and common to v24.9.0.\n\n\n\n# 11.9.0-rc.1 December 10, 2024\n## Features ✨ and improvements 🏁\n* Add `toHsla` expression.\n* Introduce experimental `Snow` and `Rain` APIs to show the snow or rain effect on the map.\n* [compose] Introduce experimental `SnowState` and `RainState` APIs to show the snow or rain effect on the map.\n\n## Bug fixes 🐞\n* Improve character spacing for text offsets.\n* Fixed crash on Android API level < 26.\n* Do not load vector icons for client-provided sprites.\n* Fall back to the feature's original ID when promoteId is an object and the source layer is not specified as a key in the object.\n* Fixed crash caused by a repeated command buffer commit call.\n\n## Dependencies\n* Update gl-native to v11.9.0-rc.1 and common to v24.9.0-rc.1.\n\n\n# 11.8.1 December 03, 2024\n## Bug fixes 🐞\n* Fix map flickering on some Mali and PowerVR GPUs.\n\n## Dependencies\n* Update gl-native to v11.8.1.\n\n\n# 11.9.0-beta.1 November 28, 2024\n## Breaking changes ⚠️\n* Expose experimental Geofencing with `com.mapbox.annotation.MapboxExperimental`.\n* Move experimental geofencing classes to `com.mapbox.common.geofencing` package from `com.mapbox.common.experimental.geofencing`.\n* Make constructor of experimental `GeofencingOptions`, `GeofencingEvent` and other geofencing classes holding data private. Associated `Builder()` classes should be used instead.\n* Remove experimental `MapboxMap.queryRenderedFeatures` and `MapboxMap.querySourceFeatures` that used `FeaturesetQueryTarget` as an argument.\n\n## Features ✨ and improvements 🏁\n* Introduce experimental `FillExtrusionLayer.fillExtrusionBaseAlignment` and `FillExtrusionLayer.fillExtrusionHeightAlignment` APIs to control the behavior of fill extrusion base over terrain and the behavior of fill extrusion height over terrain respectively.\n* Introduce experimental `FillLayer.fillZOffset` and `FillLayer.fillZOffsetTransition` APIs to specify a uniform elevation in meters and define the transition of `fillZOffset` respectively.\n* Adds support for `fillZOffset` in `PolygonAnnotation`, `PolygonAnnotationManager`, `PolygonAnnotationOptions`.\n* Introduce `BackgroundLayer.backgroundPitchAlignment` API to configure the orientation of background layer.\n* Introduce `LocationIndicatorLayer.emphasisCircleGlowRange` and `LocationIndicatorLayer.emphasisCircleGlowRangeTransition` APIs to control the glow effect of the emphasis circle from the solid start to the fully transparent end and to set the transition options for the `emphasisCircleGlowRange` property, respectively.\n* Introduce `radius` parameter for `ClickInteraction` and `LongClickInteraction` to support an extra area around the interaction.\n* Add a way to specify options for `Expression.image()`.\n* Introduce experimental `AnimatableModel`, `ModelMaterialPart`, `ModelNodePart` APIs to style the 3D location puck's overridable parts. [Implementation example](app/src/main/java/com/mapbox/maps/testapp/examples/LocationComponentModelAnimationActivity.kt).\n* Introduce `modelRotationExpression`, `modelColor`, `modelColorExpression`, `modelColorMixIntensity`, `modelColorMixIntensityExpression`, `modelOpacityExpression` on `LocationPuck3D`.\n* Introduce experimental `LocationPuck3D.materialOverrides` and `LocationPuck3D.nodeOverrides` API to allow model parts overrides.\n* Add vector icons support: SDK will now download vector icons and rasterize them locally, which will results in better icon quality for icons resized via icon-size. Changeable colors support: icon expression can now have optional parameter to change named colors described in SVG icons metadata.\n* Add support for shadows from elevated structures.\n* [compose] Introduce `LocationIndicatorLayerState.emphasisCircleGlowRange` and `LocationIndicatorLayerState.emphasisCircleGlowRangeTransition` properties.\n* [compose] Introduce `FillLayerState.fillZOffset` and `FillLayerState.fillZOffsetTransition` properties.\n* [compose] Introduce `FillExtrusionLayerState.fillExtrusionBaseAlignment` and `FillExtrusionLayerState.fillExtrusionHeightAlignment` properties.\n* [compose] Introduce `BackgroundLayerState.backgroundPitchAlignment` property.\n* [compose] Adds support for `fillZOffset` in `PolygonAnnotationState`, `PolygonAnnotationGroupState`.\n* [compose] Expose `MapViewportState.cameraForCoordinates` method.\n* [compose] Introduce `radius` parameter for all relevant compose functions for interactions to support an extra area around the interaction.\n\n## Bug fixes 🐞\n* Fix dark shades caused by corner case light directions when `FillLayer.fillExtrusionEmissiveStrength` is set to high values (closer to 1).\n* Fix rendering of interleaved SDF and non-SDF icons in the same layer.\n* Fix `LineLayer.lineEmissiveStrength` not being applied to patterned lines.\n* Fix map flickering on some Mali and PowerVR GPUs.\n* Fix shader fog computation being incorrectly enabled for landmarks.\n* Handle empty payloads for offline resources.\n* Encapsulate config expression in assertion expression when expected return type is known.\n* Fixes a bug which caused icon shifts in some cases.\n* Fix feature state update if layer contains data driven `measureLight` expression.\n* Fix the owning thread log error prints on legacy `OfflineRegion` creation.\n* Fix a crash in interpolate expression.\n* Resolve usage of `GeoJsonSource.autoMaxZoom` for single feature.\n* Resolve dotted line issue with very long lines.\n* Fix texture gather for shadows not being selected correctly by default.\n* Performance improvements for runtime-added images.\n* Fix `AndroidDeviceLocationProvider` reporting an error when location permissions are not granted.\n* Improve exception handling inside Cronet providers when Cronet library failed to load.\n\n## Dependencies\n* Update gl-native to v11.9.0-beta.1 and common to v24.9.0-beta.1.\n\n## Known issues\n* Custom (non Mapbox-hosted) sprites could fail to load in some scenarios.\n\n\n# 11.7.3 November 19, 2024\n## Bug fixes 🐞\n* Fix map flickering on some Mali and PowerVR GPUs.\n\n## Dependencies\n* Update gl-native to v11.7.3.\n\n\n# 11.8.0 November 11, 2024\n## Breaking changes ⚠️\n* Change the signature of experimental `MapboxMap.queryRenderedFeatures(RenderedQueryGeometry, TypedFeaturesetDescriptor, Value?, QueryRenderedFeaturesetFeaturesCallback)` to `MapboxMap.queryRenderedFeatures(TypedFeaturesetDescriptor, RenderedQueryGeometry?, Value?, QueryRenderedFeaturesetFeaturesCallback)`. `RenderedQueryGeometry` being NULL is equivalent to passing a bounding box encompassing the entire map viewport.\n* [compose] Change the signature of experimental `MapState.queryRenderedFeatures(RenderedQueryGeometry, TypedFeaturesetDescriptor, Expression?): List` to `MapState.queryRenderedFeatures(TypedFeaturesetDescriptor, RenderedQueryGeometry?, Expression?): List`. `RenderedQueryGeometry` being NULL is equivalent to passing a bounding box encompassing the entire map viewport.\n\n## Features ✨ and improvements 🏁\n* Introduce `Style.STANDARD_EXPERIMENTAL` style supporting featuresets and map interactions. **Important: this style should not be used in production as the style definition on backend is a subject to change after v11.8.0 stable release!**\n* Introduce fully typed map click and long click interactions working with `Style.STANDARD_EXPERIMENTAL`: `standardPoi`, `standardPlaceLabels`, `standardBuildings`.\n* Use [Cronet](https://developer.android.com/develop/connectivity/cronet) as the default network stack. If Cronet is not available, network stack defaults to [OkHttp](https://square.github.io/okhttp/) used in previous versions. More information available [here](https://docs.mapbox.com/android/maps/guides/install/#managing-google-play).\n* Introduce `OnClusterClickListener` and `OnClusterLongClickListener` for `CircleAnnotationManager` and `PointAnnotationManager`. These callbacks receive the clicked cluster represented by a `ClusterFeature`.\n* Introduce experimental `getStyleGlyphURL` / `setStyleGlyphURL` functions for `MapboxMap` and `Style`.\n* Make `fill-extrusion-emissive-strength` property data-driven.\n* Dispatch view annotations update before rendering, so that view annotations and map layers are rendered simultaneously and thus decreasing the view annotations latency when using `ViewAnnotationUpdateMode.MAP_FIXED_DELAY` mode.\n* Overscale composited tile components in offline.\n* Skip rendering landmarks when the camera is inside them.\n* Introduce experimental Geofencing API. Implementation example: [SimpleGeofencingActivity.kt](app/src/main/java/com/mapbox/maps/testapp/examples/geofence/SimpleGeofencingActivity.kt) and [ExtendedGeofencingActivity.kt](app/src/main/java/com/mapbox/maps/testapp/examples/geofence/ExtendedGeofencingActivity.kt).\n* Introduce experimental `MapView.attribution.getMapAttributionDelegate().extraAttributions` to add custom attributions to the attribution dialog.\n* [compose] Deprecate all `Annotation` and `AnnotationGroup` composables that take `onClick` parameter. Now all annotation interactions could be set with appropriate `AnnotationInteractionsState` or `AnnotationGroupInteractionsState` stored in `AnnotationGroupState`.\n* [compose] Introduce `AnnotationInteractionsState` and `AnnotationGroupInteractionsState` states that allow to set callbacks for annotation interactions via `onClicked()` and `onLongClicked()`.`PointAnnotationGroupInteractionsState` and `CircleAnnotationGroupInteractionsState` also provide ability to set callbacks for interactions with clusters via `onClusterClicked` and `onClusterLongClicked`.\n* [compose] Introduce `remember` (e.g. `rememberPolylineAnnotationGroupInteractionsState` and `rememberPolylineAnnotationInteractionsState`) composable functions to create, init and remember all types of `AnnotationInteractionsState` and `AnnotationGroupInteractionsState`.\n* [compose] Introduce `<AnnotationType>InteractionsState.isDraggable` / `<AnnotationType>GroupInteractionsState.isDraggable` API for all annotation types allowing to drag annotations. Callbacks `onDragStarted()`, `onDragged()`,`onDragFinished()` are added as well.\n* [compose] Introduce experimental `Attribution(..., geofencingDialog)` compose function to customize Geofencing consent dialog.\n* Annotate `Bitmap.toMapboxImage()` and related as delicate API due to its native memory allocation.\n* Use fallback engine if cronet fails to load.\n\n## Bug fixes 🐞\n* Fix terrain related snapshotter crash.\n* Handle empty payloads for offline resources.\n* Improve zooming performance on dynamic Standard terrain and optimize terrain re-rendering performance on e.g routeline `line-trim-offset` change.\n* Respect polygons with holes on querying rendered features.\n* Fix self-overlap of line corners when large `line-width` is used.\n* Adjust conflation intersection test padding to fix disappearing `fill-extrusion`.\n* Fix TileCover bug with polygon horizontal edges.\n* Fix a bug with image dependent paint properties not getting a correct value after image become available.\n* Clear tile pyramid on color theme change before the tiles are updated.\n* Fix missing images notifications for images within coalesce expression when other images in coalesce are present. Image expressions with two arguments are no longer being considered present if only second image is present.\n* Return operation error for featurestate related API in case the featureset is not valid.\n* Fix crash on style pack load when no access token is set.\n* Fix crash in TerrainRenderer when using snapshotter.\n* Fix crash on re-creation of a custom raster source when different options are provided.\n* Return parsing errors if runtime added style import JSON is not valid.\n* Fix missing models in rendering result if `reduceMemoryUse` is called before taking snapshot.\n* Fix the incorrect behaviour when using `symbol-z-oder` property.\n* Fix `raster-particle` trail discontinuity at the antimeridian.\n* Fix an Android 12 specific bug where location puck custom animator options lambda without explicit `ValueAnimator.duration` resulted in `duration = 0`.\n* Fix a rare `android.content.res.Resources$NotFoundException` happening when creating a `MapView`.\n* Fix a rare `NullPointerException` happening when fling gesture event is recognized.\n* Fix `StandardPoiFeature.geometry` to have a concrete `Point` type instead of `Geometry` interface.\n* Fix a bug in `GeoJsonSource.autoMaxZoom` leading to rendering artifacts with long dotted line layers.\n* Fix a crash if Cronet failed to init on device by fallbacking to OkHttp.\n* Disable false-positive lint error \"Incorrect number of expressions\".\n* Fix possible out of memory in native heap during annotation manager annotation updates (`AnnotationManager.update(...)`).\n* Fix CronetProviderInstaller proguard missing rule.\n* Fix rare crash due to native library not loaded when receiving background locations.\n* Do not modify file description structure when reading resource files.\n* Fix lifecycle calculation in case activity destruction is in progress.\n\n## Dependencies\n* Update gl-native to v11.8.0 and common to v24.8.0.\n\n\n\n# 11.7.2 November 05, 2024\n## Bug fixes 🐞\n* Fix terrain related snapshotter crash.\n* Handle empty payloads for offline resources.\n* Do not modify file description structure when reading resource files.\n\n## Dependencies\n* Update gl-native to v11.7.2 and common to v24.7.2.\n\n\n\n# 11.8.0-rc.1 October 23, 2024\n## Bug fixes 🐞\n* Fix an Android 12 specific bug where location puck custom animator options lambda without explicit `ValueAnimator.duration` resulted in `duration = 0`.\n* Fix a rare `android.content.res.Resources$NotFoundException` happening when creating a `MapView`.\n* Fix a rare `NullPointerException` happening when fling gesture event is recognized.\n* Fix `StandardPoiFeature.geometry` to have a concrete `Point` type instead of `Geometry` interface.\n* Fix a bug in `GeoJsonSource.autoMaxZoom` leading to rendering artifacts with long dotted line layers.\n* Fix a crash if Cronet failed to init on device by fallbacking to OkHttp.\n\n## Dependencies\n* Update gl-native to v11.8.0-rc.1 and common to v24.8.0-rc.1.\n\n\n# 11.8.0-beta.1 October 14, 2024\n## Features ✨ and improvements 🏁\n* Introduce `Style.STANDARD_EXPERIMENTAL` style supporting featuresets and map interactions. **Important: this style should not be used in production as the style definition on backend is a subject to change after v11.8.0 stable release!**\n* Introduce fully typed map click and long click interactions working with `Style.STANDARD_EXPERIMENTAL`: `standardPoi`, `standardPlaceLabels`, `standardBuildings`.\n* Use [Cronet](https://developer.android.com/develop/connectivity/cronet) as the default network stack. If Cronet is not available, network stack defaults to [OkHttp](https://square.github.io/okhttp/) used in previous versions. More information available [here](https://docs.mapbox.com/android/maps/guides/install/#managing-google-play).\n* Introduce `OnClusterClickListener` and `OnClusterLongClickListener` for `CircleAnnotationManager` and `PointAnnotationManager`. These callbacks receive the clicked cluster represented by a `ClusterFeature`.\n* Introduce experimental `getStyleGlyphURL` / `setStyleGlyphURL` functions for `MapboxMap` and `Style`.\n* Make `fill-extrusion-emissive-strength` property data-driven.\n* Dispatch view annotations update before rendering, so that view annotations and map layers are rendered simultaneously and thus decreasing the view annotations latency when using `ViewAnnotationUpdateMode.MAP_FIXED_DELAY` mode.\n* Overscale composited tile components in offline.\n* Skip rendering landmarks when the camera is inside them.\n* Introduce experimental Geofencing API. Implementation example: [GeofencingActivity.kt](app/src/main/java/com/mapbox/maps/testapp/examples/geofence/GeofencingActivity.kt)\n* Introduce experimental `MapView.attribution.getMapAttributionDelegate().extraAttributions` to add custom attributions to the attribution dialog.\n* [compose] Deprecate all `Annotation` and `AnnotationGroup` composables that take `onClick` parameter. Now all annotation interactions could be set with appropriate `AnnotationInteractionsState` or `AnnotationGroupInteractionsState` stored in `AnnotationGroupState`.\n* [compose] Introduce `AnnotationInteractionsState` and `AnnotationGroupInteractionsState` states that allow to set callbacks for annotation interactions via `onClicked()` and `onLongClicked()`.`PointAnnotationGroupInteractionsState` and `CircleAnnotationGroupInteractionsState` also provide ability to set callbacks for interactions with clusters via `onClusterClicked` and `onClusterLongClicked`.\n* [compose] Introduce `remember` (e.g. `rememberPolylineAnnotationGroupInteractionsState` and `rememberPolylineAnnotationInteractionsState`) composable functions to create, init and remember all types of `AnnotationInteractionsState` and `AnnotationGroupInteractionsState`.\n* [compose] Introduce `<AnnotationType>InteractionsState.isDraggable` / `<AnnotationType>GroupInteractionsState.isDraggable` API for all annotation types allowing to drag annotations. Callbacks `onDragStarted()`, `onDragged()`,`onDragFinished()` are added as well.\n* [compose] Introduce experimental `Attribution(..., geofencingDialog)` compose function to customize Geofencing consent dialog.\n\n## Bug fixes 🐞\n* Improve zooming performance on dynamic Standard terrain and optimize terrain re-rendering performance on e.g routeline `line-trim-offset` change.\n* Respect polygons with holes on querying rendered features.\n* Fix self-overlap of line corners when large `line-width` is used.\n* Adjust conflation intersection test padding to fix disappearing `fill-extrusion`.\n* Fix TileCover bug with polygon horizontal edges.\n* Fix a bug with image dependent paint properties not getting a correct value after image become available.\n* Clear tile pyramid on color theme change before the tiles are updated.\n* Fix missing images notifications for images within coalesce expression when other images in coalesce are present. Image expressions with two arguments are no longer being considered present if only second image is present.\n* Return operation error for featurestate related API in case the featureset is not valid.\n* Fix crash on style pack load when no access token is set.\n* Fix crash in TerrainRenderer when using snapshotter.\n* Fix crash on re-creation of a custom raster source when different options are provided.\n* Return parsing errors if runtime added style import JSON is not valid.\n* Fix missing models in rendering result if `reduceMemoryUse` is called before taking snapshot.\n* Fix the incorrect behaviour when using `symbol-z-oder` property.\n* Fix `raster-particle` trail discontinuity at the antimeridian.\n\n## Dependencies\n* Update gl-native to v11.8.0-beta.1 and common to v24.8.0-beta.1.\n\n# 11.7.1 October 10, 2024\n## Bug fixes 🐞\n* Respect polygons with holes on querying rendered features.\n\n## Dependencies\n* Update gl-native to v11.7.1 and common to v24.7.1.\n\n\n# 11.7.0 September 26, 2024\n## Features ✨ and improvements 🏁\n* [compose] Introduce `PointAnnotationState.iconOcclusionOpacity`, `PointAnnotationState.textOcclusionOpacity` to control occlusion opacity for individual point annotation.\n* [compose] Remove `MapboxExperimental` from `PolylineAnnotationGroupState.lineOcclusionOpacity`, `PointAnnotationGroupState.iconOcclusionOpacity`, `PointAnnotationGroupState.textOcclusionOpacity`.\n* [compose] Expose data-driven properties on `AnnotationGroupState`s. Now it's possible to set data-driven properties globally on `AnnotationGroupState` and specify per-annotation overrides in `AnnotationState`. Setting global property value on `AnnotationGroupState` could introduce performance improvements when the amount of annotations is large.\n* [compose] Remove experimental `ModelLayerState.modelFrontCutoff`.\n* [compose] Introduce experimental `GeoJsonSourceState.autoMaxZoom` property to resolve rendering artifacts for features that use wide blur (e.g. fill extrusion ground flood light or circle layer).\n* [compose] Introduce experimental `ClipLayerState.clipLayerScope` API to remove data from certain style fragments only.\n* [compose] Introduce experimental `PointAnnotationState.symbolZOffset` property.\n* [compose] Introduce experimental `PointAnnotationGroupState.symbolElevationReference` property.\n* [compose] Introduce experimental `SymbolLayerState.symbolElevationReference` and `SymbolLayerState.symbolZOffset` properties.\n* [compose] Introduce experimental `SymbolLayerState.symbolZOffsetTransition` API.\n* [compose] Introduce experimental `StyleInteractionsState`, `StyleImportsInteractionsState`, `LayerInteractionsState` to handle interactions to the style, style imports and layers.\n* [compose] Introduce experimental `StyleImport` composable functions to accept `StyleImportsInteractionsState` as an parameter.\n* [compose] Introduce experimental `LayerInteractionsState` as part of `*LayerState` of layers that's driven by a source.\n* [compose] Introduce experimental `MapState.getFeatureState`, `MapState.setFeatureState`, `MapState.removeFeatureState` and `MapState.resetFeatureState` APIs.\n* [compose] Introduce `StyleState` that groups `StyleImportsConfig`, `StyleInteractionsState`, `Projection`, `AtmosphereState`, `TerrainState`, `LightsState`, `styleTransition`.\n* [compose] Introduce `GenericStyle` composable function that uses `StyleState` as parameter and deprecate `GenericStyle` that takes individual light/terrain/projection states.\n* [compose] Introduce `MapStyle` composable function that uses `StyleState` as parameter and deprecate `MapStyle` that takes individual light/terrain/projection states.\n* [compose] Introduce `StyleImportState` that groups `ImportConfigs` and `StyleImportInteractionsState`.\n* [compose] Introduce `StyleImport` composable function that uses `StyleImportState` as parameter and deprecate `StyleImport` that takes `ImportConfigs`.\n* Publish Mapbox Maps Android artifacts using NDK 27 and [support for 16 KB page sizes](https://developer.android.com/guide/practices/page-sizes).\n  * The new artifacts are available by appending `-ndk27` to the artifact ID (for example, `com.mapbox.maps:android-ndk27:11.7.0`).\n* Introduce experimental interactive feature elements and related APIs. Those APIs provide the convenient way to add the click / long click listener to layer / featureset / map itself with `MapboxMap.addInteraction`.\n* Expose `lineTrimColor` and `lineTrimFadeRange` on `LineLayer` which allow to set custom color for trimmed line and fade effect for trim. Update navigation example to use those properties.\n* Introduce `PointAnnotation.iconOcclusionOpacity`, `PointAnnotation.textOcclusionOpacity` to control occlusion opacity for individual point annotation.\n* Remove `MapboxExperimental` from `SymbolLayer.iconOcclusionOpacity`, `SymbolLayer.textOcclusionOpacity` and these properties are now supported on global zoom levels with default value changed to `0`.\n* Remove `MapboxExperimental` from `PolylineAnnotationManager.lineOcclusionOpacity`, `PointAnnotationManager.iconOcclusionOpacity`, `PointAnnotationManager.textOcclusionOpacity`.\n* Expose data-driven properties on `AnnotationManager`s. Now it's possible to set data-driven properties globally on `AnnotationManager` and specify per-annotation overrides. Setting global property value on `AnnotationManager` could introduce performance improvements when the amount of annotations is large.\n* Remove experimental `ModelLayer.modelFrontCutoff`.\n* Introduce experimental `GeoJsonSource.autoMaxZoom` property to resolve rendering artifacts for features that use wide blur (e.g. fill extrusion ground flood light or circle layer).\n* Introduce static `HttpServiceFactory.setCancellationCallback` API.\n* Reduce style parsing time.\n* Enable multiple meta tiling schemes for composited sources.\n* Expose experimental `ClipLayer.clipLayerScope` API to remove data from certain style fragments only.\n* Expose experimental `PointAnnotation.symbolZOffset` property.\n* Expose experimental `PointAnnotationManager.symbolElevationReference` property.\n* Expose experimental `SymbolLayer.symbolElevationReference` and `SymbolLayer.symbolZOffset` properties.\n* Expose experimental `SymbolLayer.symbolZOffsetTransition` API.\n* Introduce experimental `MapboxMap.queryRenderedFeature` allowing to get an `InteractiveFeature` for given geometry, `FeaturesetHolder` and optional filter.\n* Introduce experimental `FillExtrusionLayer.fillExtrusionLineWidth` and `FillExtrusionLayerState.fillExtrusionLineWidth` in Compose allowing to switch fill extrusion rendering into wall rendering mode. Use this property to render the feature with the given width over the outlines of the geometry.\n* Add missing experimental annotation to `PointAnnotationManager.symbolZOffset` and `PolylineAnnotationManager.lineZOffset`\n* Deprecate `PolylineAnnotationManager.lineTrimColor` in favour of `PolylineAnnotationManager.lineTrimColorString`/`PolylineAnnotationManager.lineTrimColorInt`.\n\n## Bug fixes 🐞\n* [compose] Fix `ViewAnnotation` size not being updated when content layout changes.\n* [compose] Fix `UnsatisfiedLinkError` issue when rendering preview.\n* Return parsing errors if runtime added style import JSON is not valid.\n* Fix color theme change before the tiles are updated.\n* Fix annotation issues with click / long click callback ordering and dragging. Now the order of triggering the callbacks / dragging is determined: from top-level rendered annotation to bottom-level one.\n* Fix `OnAnnotationInteractionListener` not triggered if any `OnAnnotationClickListener.onAnnotationClick` returns true.\n* Fix incorrect layer updates when using `ClipLayer.clipLayerTypes` or `ClipLayerState.clipLayerTypes` in Compose.\n* Fix shadow rendering issues when using `FillExtrusionLayer.fillExtrusionCutoffFadeRange` or `FillExtrusionLayerState.fillExtrusionCutoffFadeRange`.\n* Significantly reduce the rate at which raster-particle trails cross each other.\n* Fix normal offset to improve shadow accuracy.\n* Fix data synchronization between renderer and the main threads on map resize.\n* Regenerate location indicator mipmap on image change.\n* Fix landmark visibility issues near tile borders.\n* Fix elevated line depth occlusion issue in 2D mode.\n* Fix Dynamic View Annotation position update for annotated geojson feature with `allowZElevate` to be true.\n* Fix race condition between `setFeatureState` and `removeFeatureState` / `resetFeatureStates` resulting in feature state not being applied or removed.\n* Fix a crash when calling `CameraAnimationsPlugin.easeTo()` with empty camera options or `CameraAnimationsPlugin.playAnimatorsSequentially()` / `CameraAnimationsPlugin.playAnimatorsTogether()` with an empty array of animators.\n* Fix ongoing animations being canceled when `CameraAnimationsPlugin.flyTo()` with empty camera options is called.\n* Fix simultaneous scale and rotation gestures not working when the first registered rotation is a scale one.\n* Fix crash on Android tilestore where null data was returned.\n* Fix the incorrect behaviour when using `SymbolLayer.symbolZOrder` property.\n* Fix retrieval of tilesets for 3d tiles in offline mode.\n* Fix rendering errors of patterns on high zoom levels.\n* Fix a bug where style changes weren't reflected after the source layer of a layer was changed.\n\n## Dependencies\n* Update gl-native to v11.7.0 and common to v24.7.0.\n\n# 11.7.0-rc.1 September 16, 2024\n## Breaking changes ⚠️\n* Experimental interactive features API changes:\n    * `FeatureStateValue` was removed in favour of generic `FeatureState`.\n    * `MapboxMap.setFeatureState` takes a single `FeatureState` class instead of vararg `FeatureStateValue`.\n    * `BaseInteractiveFeature` was removed in favour of `InteractiveFeature`.\n    * `InteractiveFeature.state` is now a generic of `FeatureState`.\n    * `MapboxMap.getFeatureState` signature changed to be generic and return typed `FeatureState` in the new `FeatureStateCallback`.\n\n## Features ✨ and improvements 🏁\n* Introduce experimental `MapboxMap.queryRenderedFeature` allowing to get an `InteractiveFeature` for given geometry, `FeaturesetHolder` and optional filter.\n* Introduce experimental `FillExtrusionLayer.fillExtrusionLineWidth` and `FillExtrusionLayerState.fillExtrusionLineWidth` in Compose allowing to switch fill extrusion rendering into wall rendering mode. Use this property to render the feature with the given width over the outlines of the geometry.\n* Add missing experimental annotation to `PointAnnotationManager.symbolZOffset` and `PolylineAnnotationManager.lineZOffset`\n* Deprecate `PolylineAnnotationManager.lineTrimColor` in favour of `PolylineAnnotationManager.lineTrimColorString`/`PolylineAnnotationManager.lineTrimColorInt`.\n* [compose] Introduce experimental `StyleInteractionsState`, `StyleImportsInteractionsState`, `LayerInteractionsState` to handle interactions to the style, style imports and layers.\n* [compose] Introduce experimental `StyleImport` composable functions to accept `StyleImportsInteractionsState` as an parameter.\n* [compose] Introduce experimental `LayerInteractionsState` as part of `*LayerState` of layers that's driven by a source.\n* [compose] Introduce experimental `MapState.getFeatureState`, `MapState.setFeatureState`, `MapState.removeFeatureState` and `MapState.resetFeatureState` APIs.\n* [compose] Introduce `StyleState` that groups `StyleImportsConfig`, `StyleInteractionsState`, `Projection`, `AtmosphereState`, `TerrainState`, `LightsState`, `styleTransition`.\n* [compose] Introduce `GenericStyle` composable function that uses `StyleState` as parameter and deprecate `GenericStyle` that takes individual light/terrain/projection states.\n* [compose] Introduce `MapStyle` composable function that uses `StyleState` as parameter and deprecate `MapStyle` that takes individual light/terrain/projection states.\n* [compose] Introduce `StyleImportState` that groups `ImportConfigs` and `StyleImportInteractionsState`.\n* [compose] Introduce `StyleImport` composable function that uses `StyleImportState` as parameter and deprecate `StyleImport` that takes `ImportConfigs`.\n\n## Bug fixes 🐞\n* Fix a crash when calling `CameraAnimationsPlugin.easeTo()` with empty camera options or `CameraAnimationsPlugin.playAnimatorsSequentially()` / `CameraAnimationsPlugin.playAnimatorsTogether()` with an empty array of animators.\n* Fix ongoing animations being canceled when `CameraAnimationsPlugin.flyTo()` with empty camera options is called.\n* Fix simultaneous scale and rotation gestures not working when the first registered rotation is a scale one.\n* Fix crash on Android tilestore where null data was returned.\n* Fix the incorrect behaviour when using `SymbolLayer.symbolZOrder` property.\n* Fix retrieval of tilesets for 3d tiles in offline mode.\n* Fix rendering errors of patterns on high zoom levels.\n* Fix a bug where style changes weren't reflected after the source layer of a layer was changed.\n\n# 11.6.1 September 10, 2024\n## Bug fixes 🐞\n* Fix for offline retrieval of 3D tiles for `Style.STANDARD`.\n\n## Dependencies\n* Update gl-native to v11.6.1 and common to v24.6.1.\n\n# 11.7.0-beta.1 September 03, 2024\n## Features ✨ and improvements 🏁\n* [compose] Introduce `PointAnnotationState.iconOcclusionOpacity`, `PointAnnotationState.textOcclusionOpacity` to control occlusion opacity for individual point annotation.\n* [compose] Remove `MapboxExperimental` from `PolylineAnnotationGroupState.lineOcclusionOpacity`, `PointAnnotationGroupState.iconOcclusionOpacity`, `PointAnnotationGroupState.textOcclusionOpacity`.\n* [compose] Expose data-driven properties on `AnnotationGroupState`s. Now it's possible to set data-driven properties globally on `AnnotationGroupState` and specify per-annotation overrides in `AnnotationState`. Setting global property value on `AnnotationGroupState` could introduce performance improvements when the amount of annotations is large.\n* [compose] Remove experimental `ModelLayerState.modelFrontCutoff`.\n* [compose] Introduce experimental `GeoJsonSourceState.autoMaxZoom` property to resolve rendering artifacts for features that use wide blur (e.g. fill extrusion ground flood light or circle layer).\n* [compose] Introduce experimental `ClipLayerState.clipLayerScope` API to remove data from certain style fragments only.\n* [compose] Introduce experimental `PointAnnotationState.symbolZOffset` property.\n* [compose] Introduce experimental `PointAnnotationGroupState.symbolElevationReference` property.\n* [compose] Introduce experimental `SymbolLayerState.symbolElevationReference` and `SymbolLayerState.symbolZOffset` properties.\n* [compose] Introduce experimental `SymbolLayerState.symbolZOffsetTransition` API.\n* Introduce experimental interactive feature elements and related APIs. Those APIs provide the convenient way to add the click / long click listener to layer / featureset / map itself with `MapboxMap.addInteraction`.\n* Expose `lineTrimColor` and `lineTrimFadeRange` on `LineLayer` which allow to set custom color for trimmed line and fade effect for trim. Update navigation example to use those properties.\n* Introduce `PointAnnotation.iconOcclusionOpacity`, `PointAnnotation.textOcclusionOpacity` to control occlusion opacity for individual point annotation.\n* Remove `MapboxExperimental` from `SymbolLayer.iconOcclusionOpacity`, `SymbolLayer.textOcclusionOpacity` and these properties are now supported on global zoom levels with default value changed to `0`.\n* Remove `MapboxExperimental` from `PolylineAnnotationManager.lineOcclusionOpacity`, `PointAnnotationManager.iconOcclusionOpacity`, `PointAnnotationManager.textOcclusionOpacity`.\n* Expose data-driven properties on `AnnotationManager`s. Now it's possible to set data-driven properties globally on `AnnotationManager` and specify per-annotation overrides. Setting global property value on `AnnotationManager` could introduce performance improvements when the amount of annotations is large.\n* Remove experimental `ModelLayer.modelFrontCutoff`.\n* Introduce experimental `GeoJsonSource.autoMaxZoom` property to resolve rendering artifacts for features that use wide blur (e.g. fill extrusion ground flood light or circle layer).\n* Introduce static `HttpServiceFactory.setCancellationCallback` API.\n* Reduce style parsing time.\n* Enable multiple meta tiling schemes for composited sources.\n* Expose experimental `ClipLayer.clipLayerScope` API to remove data from certain style fragments only.\n* Expose experimental `PointAnnotation.symbolZOffset` property.\n* Expose experimental `PointAnnotationManager.symbolElevationReference` property.\n* Expose experimental `SymbolLayer.symbolElevationReference` and `SymbolLayer.symbolZOffset` properties.\n* Expose experimental `SymbolLayer.symbolZOffsetTransition` API.\n\n## Bug fixes 🐞\n* [compose] Fix `UnsatisfiedLinkError` issue when rendering preview.\n* Fix annotation issues with click / long click callback ordering and dragging. Now the order of triggering the callbacks / dragging is determined: from top-level rendered annotation to bottom-level one.\n* Fix `OnAnnotationInteractionListener` not triggered if any `OnAnnotationClickListener.onAnnotationClick` returns true.\n* Fix incorrect layer updates when using `ClipLayer.clipLayerTypes` or `ClipLayerState.clipLayerTypes` in Compose.\n* Fix shadow rendering issues when using `FillExtrusionLayer.fillExtrusionCutoffFadeRange` or `FillExtrusionLayerState.fillExtrusionCutoffFadeRange`.\n* Significantly reduce the rate at which raster-particle trails cross each other.\n* Fix normal offset to improve shadow accuracy.\n* Fix data synchronization between renderer and the main threads on map resize.\n* Regenerate location indicator mipmap on image change.\n* Fix landmark visibility issues near tile borders.\n* Fix elevated line depth occlusion issue in 2D mode.\n* Fix Dynamic View Annotation position update for annotated geojson feature with `allowZElevate` to be true.\n* Fix race condition between `setFeatureState` and `removeFeatureState` / `resetFeatureStates` resulting in feature state not being applied or removed.\n\n## Dependencies\n* Update gl-native to v11.7.0-beta.2 and common to v24.7.0-beta.2.\n\n## Known issues\n* Experimental `GeoJsonSource.autoMaxZoom` and `GeoJsonSourceState.autoMaxZoom` will return `null` value even after it's set.\n\n# 11.6.0 August 16, 2024\n## Breaking changes ⚠️\n* [compose] Remove `StyleImage` constructor with `BitmapImage`, use `rememberStyleImage` composable function to build it instead.\n* [compose] Move layer properties within `*Layer` composable functions to `*LayerState` classes, use the convenient method `*Layer(sourceState, layerId, init)` with trailing lambda for easier migration.\n* [compose] Move `onClick` listener from last parameter to the second last parameter of `Annotation` and `AnnotationGroup` composable functions.\n* [compose] Move properties within `*Annotation` and `*AnnotationGroup` composable functions to the new `*AnnotationState` and `*AnnotationGroupState` classes, use the convenient method `*Annotation(point, onClick, init)` and `*AnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda for easier migration.\n* [compose] Replace color int and color string property types in `*Annotation` with compose `Color` type.\n* [compose] Replace `PointAnnotation.iconImageBitmap` and `PointAnnotation.iconImage` with `PointAnnotationState.iconImage` with `IconImage` type, `IconImage` can be constructed with either a image id `String` or a `Bitmap`, and introduced `rememberIconImage` to build and remember a bitmap from `Painter` or from a drawable resource id.\n* [compose] Introduce `StandardStyleConfigurationState` class to hold the configurations of `MapboxStandardStyle`, and move `lightPreset` config from `MapboxStandardStyle` to `StandardStyleConfigurationState`; consider using overload method `MapboxStandardStyle` with trailing init lambda for easier migration.\n* Experimental `CustomRasterSourceOptions.Builder` now accepts `CustomRasterSourceClient` containing `CustomRasterSourceTileStatusChangedCallback` instead of `CustomRasterSourceTileStatusChangedCallback` interface directly.\n\n## Features ✨ and improvements 🏁\n* **[compose] Promote Compose Extension to stable.**\n* [compose] Mark `MapState`, `MapViewportState`, `TerrainState`, light states and source states as `Stable` as they are internally backed by `MutableState`.\n* [compose] Add more config options including `showPlaceLabels`, `showRoadLabels`, `showPointOfInterestLabels`, `showTransitLabels` and `font` to `StandardStyleConfigurationState`.\n* [compose] Introduce `StyleImage` constructor with `Image` type, and add `rememberStyleImage` composable functions to create and remember `StyleImage`.\n* [compose] Add extension function to `*AnnotationOptions` to handle compose `Color`, use it in `*AnnotationGroup` composable functions for convenience.\n* [compose] Add style transition parameter in `GenericStyle`, `MapStyle` and `MapboxStandardStyle`.\n* [compose] Extend `StandardStyleConfigurationState` with `theme: ThemeValue` and `show3dObjects: BooleanValue` properties.\n* [compose] Introduce composable function `MapboxStandardSatelliteStyle` with dedicated `StandardSatelliteStyleConfigurationState`.\n* Add new `Style.STANDARD_SATELLITE` style that combines updated satellite imagery and vector layers.\n* Introduce new import configuration properties for `Style.STANDARD`: `theme`, `show3dObjects` which could be set with `Style.setStyleImportConfigProperty`.\n* Modify `awaitCameraForCoordinates` extension function to use `MapCameraManagerDelegate` as receiver type.\n* Modify `queryRenderedFeatures` and `querySourceFeatures` extension functions to use `MapFeatureQueryDelegate` as receiver type.\n* Introduce asynchronous overloaded method `ViewAnnotationManager.cameraForAnnotations` better covering some corner cases.\n* Make use of asynchronous `MapboxMap.cameraForCoordinates` in Mapbox overlay plugin better covering some corner cases.\n* Mark synchronous methods `MapboxMap.cameraForCoordinates` and `ViewAnnotationManager.cameraForAnnotations` with `@MapboxDelicateApi`. Consider using asynchronous overloaded methods instead.\n* Deprecate `MapboxMap.getDebug()`/`MapboxMap.setDebug()` in favour of `MapView.debugOptions` taking new enhanced enum `MapViewDebugOptions` as an argument.\n* Introduce `MapViewDebugOptions.CAMERA` and `MapViewDebugOptions.PADDING` debug options to track current camera state and visualize camera paddings.\n* Expose experimental `ClipLayer` to remove 3D data (fill extrusions, landmarks, instanced trees) and symbols.\n* Enable r8 optimisations for all the Mapbox extensions and plugins in consumer proguard file, the optimisation will apply when minify is enabled in app's build settings.\n* Enable direct rendering into `CustomRasterSource` tiles.\n* Introduce a new `allowZElevate` option in `ViewAnnotationOptions`. When set to true, the annotation will be positioned on the rooftops of buildings, including both fill extrusions and models.\n* Support negative values for `CircleLayer.circleBlur` to render inner glow effect.\n* Support for model-uris as properties in geojson model layers.\n* Allow usage of the tile leveling schemes with maximum zoom exceeding 16.\n\n## Bug fixes 🐞\n* [compose] Fix minZoom/maxZoom not working for layers.\n* [compose] Fix `java.lang.UnsupportedOperationException` when setting `textWritingMode` and `textVariableAnchor`.\n* Fix compass view ignoring `enabled` option when it is set in `updateSettings()`.\n* Fix background locations not received when unregistering other providers.\n* Improve `linePattern` precision.\n* Fix local glyph rasterization to ensure the correct Typeface is used.\n* Fix `CustomRasterSource` rendering when camera shows antimeridian or multiple world copies.\n* Fix elevated line occlusion issue in 2D mode.\n* Fix blinking of layer as you are panning across the antimeridian.\n* Fix `modelFrontCutoff` property for meshopt models.\n* Align location provider default displacement for Android and Google providers.\n\n## Dependencies\n* Update gl-native to v11.6.0 and common to v24.6.0.\n\n\n# 11.6.0-rc.1 August 02, 2024\n## Features ✨ and improvements 🏁\n* Support negative values for `CircleLayer.circleBlur` to render inner glow effect.\n* Add new `Style.STANDARD_SATELLITE` style that combines updated satellite imagery and vector layers.\n* Introduce new import configuration properties for `Style.STANDARD`: `theme`, `show3dObjects` which could be set with `Style.setStyleImportConfigProperty`.\n* [compose] Extend `StandardStyleConfigurationState` with `theme: ThemeValue` and `show3dObjects: BooleanValue` properties.\n* [compose] Introduce composable function `MapboxStandardSatelliteStyle` with dedicated `StandardSatelliteStyleConfigurationState`.\n\n## Bug fixes 🐞\n* Fix elevated line occlusion issue in 2D mode.\n\n## Dependencies\n* Update gl-native to v11.6.0-rc.1 and common to v24.6.0-rc.1.\n\n## Known issues\n* Experimental `ClipLayer`'s property `clipLayerTypes` is not updated in runtime. The fix is expected to land in stable 11.6.0.\n\n\n# 11.5.1 July 25, 2024\n## Bug fixes 🐞\n* Fix local glyph rasterization to ensure the correct Typeface is used.\n* Fix map freezing and huge memory consumption issue when using 3D models.\n* Fix `CustomRasterSource` rendering when camera shows antimeridian or multiple world copies.\n* Fix shadow rendering issues with `FillExtrusionLayer.fillExtrusionCutoffFadeRange`.\n\n## Dependencies\n* Update gl-native to v11.5.2.\n\n\n# 11.6.0-beta.1 July 19, 2024\n## Breaking changes ⚠️\n* [compose] Remove `StyleImage` constructor with `BitmapImage`, use `rememberStyleImage` composable function to build it instead.\n* [compose] Move layer properties within `*Layer` composable functions to `*LayerState` classes, use the convenient method `*Layer(sourceState, layerId, init)` with trailing lambda for easier migration.\n* [compose] Move `onClick` listener from last parameter to the second last parameter of `Annotation` and `AnnotationGroup` composable functions.\n* [compose] Move properties within `*Annotation` and `*AnnotationGroup` composable functions to the new `*AnnotationState` and `*AnnotationGroupState` classes, use the convenient method `*Annotation(point, onClick, init)` and `*AnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda for easier migration.\n* [compose] Replace color int and color string property types in `*Annotation` with compose `Color` type.\n* [compose] Replace `PointAnnotation.iconImageBitmap` and `PointAnnotation.iconImage` with `PointAnnotationState.iconImage` with `IconImage` type, `IconImage` can be constructed with either a image id `String` or a `Bitmap`, and introduced `rememberIconImage` to build and remember a bitmap from `Painter` or from a drawable resource id.\n* [compose] Introduce `StandardStyleConfigurationState` class to hold the configurations of `MapboxStandardStyle`, and move `lightPreset` config from `MapboxStandardStyle` to `StandardStyleConfigurationState`; consider using overload method `MapboxStandardStyle` with trailing init lambda for easier migration.\n* Experimental `CustomRasterSourceOptions.Builder` now accepts `CustomRasterSourceClient` containing `CustomRasterSourceTileStatusChangedCallback` instead of `CustomRasterSourceTileStatusChangedCallback` interface directly.\n\n## Features ✨ and improvements 🏁\n* **[compose] Promote Compose Extension to stable.**\n* [compose] Mark `MapState`, `MapViewportState`, `TerrainState`, light states and source states as `Stable` as they are internally backed by `MutableState`.\n* [compose] Add more config options including `showPlaceLabels`, `showRoadLabels`, `showPointOfInterestLabels`, `showTransitLabels` and `font` to `StandardStyleConfigurationState`.\n* [compose] Introduce `StyleImage` constructor with `Image` type, and add `rememberStyleImage` composable functions to create and remember `StyleImage`.\n* [compose] Add extension function to `*AnnotationOptions` to handle compose `Color`, use it in `*AnnotationGroup` composable functions for convenience.\n* [compose] Add style transition parameter in `GenericStyle`, `MapStyle` and `MapboxStandardStyle`.\n* Modify `awaitCameraForCoordinates` extension function to use `MapCameraManagerDelegate` as receiver type.\n* Modify `queryRenderedFeatures` and `querySourceFeatures` extension functions to use `MapFeatureQueryDelegate` as receiver type.\n* Introduce asynchronous overloaded method `ViewAnnotationManager.cameraForAnnotations` better covering some corner cases.\n* Make use of asynchronous `MapboxMap.cameraForCoordinates` in Mapbox overlay plugin better covering some corner cases.\n* Mark synchronous methods `MapboxMap.cameraForCoordinates` and `ViewAnnotationManager.cameraForAnnotations` with `@MapboxDelicateApi`. Consider using asynchronous overloaded methods instead.\n* Deprecate `MapboxMap.getDebug()`/`MapboxMap.setDebug()` in favour of `MapView.debugOptions` taking new enhanced enum `MapViewDebugOptions` as an argument.\n* Introduce `MapViewDebugOptions.CAMERA` and `MapViewDebugOptions.PADDING` debug options to track current camera state and visualize camera paddings.\n* Expose experimental `ClipLayer` to remove 3D data (fill extrusions, landmarks, instanced trees) and symbols.\n* Enable r8 optimisations for all the Mapbox extensions and plugins in consumer proguard file, the optimisation will apply when minify is enabled in app's build settings.\n* Align default displacement for Android and Google location providers.\n* Enable direct rendering into `CustomRasterSource` tiles.\n* Introduce a new `allowZElevate` option in `ViewAnnotationOptions`. When set to true, the annotation will be positioned on the rooftops of buildings, including both fill extrusions and models.\n\n## Bug fixes 🐞\n* [compose] Fix minZoom/maxZoom not working for layers.\n* [compose] Fix `java.lang.UnsupportedOperationException` when setting `textWritingMode` and `textVariableAnchor`.\n* Fix compass view ignoring `enabled` option when it is set in `updateSettings()`.\n* Fix background locations not received when unregistering other providers.\n* Improve `linePattern` precision.\n* Fix local glyph rasterization to ensure the correct Typeface is used.\n* Fix `CustomRasterSource` rendering when camera shows antimeridian or multiple world copies.\n\n## Known issues\n* `ClipLayer.clipLayerTypes` could not be updated with a layer setter. Layer has to be re-added to update it. This is expected to be fixed in v11.6.0-rc.1.\n\n## Dependencies\n* Update gl-native to v11.6.0-beta.1 and common to v24.6.0-beta.1.\n\n\n# 11.4.2 July 17, 2024\n## Bug fixes 🐞\n* Fix local glyph rasterization to ensure the correct Typeface is used.\n\n## Dependencies\n* Update gl-native to v11.4.1.\n\n\n# 11.5.0 July 05, 2024\n## Breaking changes ⚠️\n* [compose] Make `MapboxMap.onMapClickListener` and `MapboxMap.onMapLongClickListener` nullable and default to `null`.\n* [compose] Rename `ImportConfig` to `ImportConfigs`.\n* [compose] Move `MapboxMap.mapEvents` to events flows in `MapState`.\n* [compose] Move `MapboxMap.gesturesSettings` to `MapState`.\n* [compose] Move `Projection` to `generated` package and rename `default` values to `DEFAULT`.\n* [compose] Rename `LightPreset` to `LightPresetValue`.\n* [compose] Rename `TerrainState.disabled` to `TerrainState.DISABLED`.\n* [compose] Replace terrain property `Exaggeration` with `DoubleValue`.\n* [compose] Replace concrete `AtmosphereState` properties (e.g. `HighColor`, `HorizonBlend`, `SpaceColor`, etc) with generic ones: `ColorValue`, `DoubleValue`, `DoubleRangeValue`.\n* [compose] Replace concrete Layer properties(e.g. `CircleColor`, `CircleOpacity`, `IconImage` etc) with generic ones: `ColorValue`, `DoubleValue`, `ImageValue` etc.\n* [compose] Replace concrete `GeoJsonSourceState`, `ImageSourceState`, `RasterArraySourceState`, `RasterDemSourceState`, `RasterSourceState`, `SourceProperties`, `VectorSourceState` properties with generic ones (e.g. `BooleanValue`, `StringValue`, `LongValue`...).\n* [compose] Move `GeoJSONData` outside of `generated` package.\n* Remove experimental `CustomRasterSource.invalidateRegion` and `CustomRasterSource.invalidateTile` methods and change signature of `CustomRasterSource.setTileData`.\n* Remove experimental `CustomRasterSource.tileCacheBudget` getter and setter. If needed, caching should be implemented on user's side.\n* Remove experimental `MapboxMap` and `Style` methods: `invalidateStyleCustomRasterSourceTile`, `invalidateStyleCustomRasterSourceRegion`; change signature of `setStyleCustomRasterSourceTileData` method in `MapboxMap` and `Style`.\n\n## Features ✨ and improvements 🏁\n* [compose] Enable r8 optimisations of compose extension in consumer proguard file, the optimisation will apply when minify is enabled in app's build settings.\n* [compose] Introduce `StyleImport` composable API to be used in the `GenericStyle`, `MapStyle` and `MapboxStandardStyle`.\n* [compose] Introduce `MapState` that can be hoisted to interact with map states, such as query rendered features, subscribe to map events and configure gestures settings.\n* [compose] Expose `TerrainState` and `AtmosphereState` properties as `MutableState`.\n* [compose] Introduce `AmbientLightState`, `DirectionalLightState`, `FlatLightState` as separate states; `LightsState` can be constructed by combination of `DirectionalLightState` and `AmbientLightState` or with `FlatLightState` to be set to the style.\n* [compose] Avoid recreation of objects during recomposition of `GenericStyle`.\n* Expose `LineJoin.NONE` which in conjunction with e.g. `linePattern` image allows to display repeated series of images along a line (e.g. dotted route line).\n* Expose new function `DefaultLocationProvider.locationAnimatorOptions` to allow changing the value animator properties for puck position animation.\n* Deprecate `MapboxMap.cameraForCoordinates` suspending extension function in favour of suspend `MapboxMap.awaitCameraForCoordinates`.\n* Add min/max/default values to the docs for the generated properties.\n* Add asynchronous `TileStore.create().clearAmbientCache()` API that can be used for clearing all ambient cache data.\n* Expose experimental `lineZOffset` and `lineOcclusionOpacity` for `LineLayer`.\n* Expose experimental `modelFrontCutoff` for `ModelLayer`.\n* Expose experimental `iconOcclusionOpacity` and `textOcclusionOpacity` for `SymbolLayer` and `PointAnnotationManager`.\n* Expose experimental `lineOcclusionOpacity` for `PolylineAnnotationManager`.\n* Expose experimental `lineZOffset` for `PolylineAnnotation` and `PolylineAnnotationOptions`.\n* Expose `clusterMinPoints` property for `GeoJSONSource` and for annotation's `ClusterOptions`.\n* Remove explicit main thread locking when using `CircleAnnotationManager`, `PointAnnotationManager`, `PolygonAnnotationManager`, `PolylineAnnotationManager` and dragging the map that could lead to an ANR.\n* Use dedicated thread for the tile store to increase performance.\n* [compose] Expose `TerrainState` and `AtmosphereState` properties as `MutableState`.\n\n## Bug fixes 🐞\n* [compose] Fix the layer and annotation ordering by moving the annotations/layers according to the relative position in the node tree.\n* [compose] Fix `No enum constant com.mapbox.maps.GeoJSONSourceData` crash when restoring app from background.\n* Fix transitioning to `OverviewViewportState` in corner cases when the map is not yet ready for rendering(e.g. immediately after `MapView` is created).\n* Set default minimum displacement between location updates to 0.1 meters in `DefaultLocationProvider`. Now this value is the same regardless of application using Google Play Services location library or not.\n* Fix `PointAnnotationManager` and `CircleAnnotationManager` cluster layer id collision issue, so that multiple clusters can work at the same time.\n* Fix `RasterParticleLayer.rasterParticleCount` and `RasterParticleLayer.defaultRasterParticleCount` returning `null`.\n* Fix an issue allowing view annotation to be added even if its associated layer does not exist. Now, view annotation will function correctly once the layer is added.\n* Fix feature queries for symbols above the horizon.\n* Fix the rotated icon position during the globe transition.\n* Fix Dynamic View Annotation (DVA) placement to place DVA in the center of the line geometry point, and try to avoid placing DVA near the lines' intersection point.\n* Reduce the max raster-particle animation speed. It prevents particles from moving too fast, causing a visible clipping artifact at tile boundaries.\n* `Snapshotter` methods throw `SnapshotterDestroyedException` if `destroy` was already called.\n* Fix precision issues in `ColorUtils` methods.\n* Fix NPE when parsing `rgb(...)` strings with `ColorUtils` methods.\n* Fix `ScaleBar.useContinuousRendering` not being in sync with `ScaleBar.settings.useContinuousRendering`.\n* Fix accuracy ring related location settings updates not being rendered immediately.\n* Fix a crash for Draco compressed 3D models whose geometry share indices.\n* Fix tile rendering errors when the composited source tile components are overscaled.\n* Fix transparent areas in overlapped polygons of MultiPolygon feature.\n* Fix crash on multiple style pack loading operations.\n\n## Dependencies\n* Update gl-native to v11.5.1 and common to v24.5.0.\n\n\n# 11.5.0-rc.1 June 20, 2024\n## Breaking changes ⚠️\n* [compose] Make `MapboxMap.onMapClickListener` and `MapboxMap.onMapLongClickListener` nullable and default to `null`.\n* [compose] Rename `ImportConfig` to `ImportConfigs`.\n* [compose] Move `MapboxMap.mapEvents` to events flows in `MapState`.\n* [compose] Move `MapboxMap.gesturesSettings` to `MapState`.\n* Remove experimental `CustomRasterSource.invalidateRegion` and `CustomRasterSource.invalidateTile` methods and change signature of `CustomRasterSource.setTileData`.\n* Remove experimental `CustomRasterSource.tileCacheBudget` getter and setter. If needed, caching should be implemented on user's side.\n* Remove experimental `MapboxMap` and `Style` methods: `invalidateStyleCustomRasterSourceTile`, `invalidateStyleCustomRasterSourceRegion`; change signature of `setStyleCustomRasterSourceTileData` method in `MapboxMap` and `Style`.\n\n## Features ✨ and improvements 🏁\n* [compose] Introduce `StyleImport` composable API to be used in the `GenericStyle`, `MapStyle` and `MapboxStandardStyle`.\n* [compose] Introduce `MapState` that can be hoisted to interact with map states, such as query rendered features, subscribe to map events and configure gestures settings.\n* Deprecate `MapboxMap.cameraForCoordinates` suspending extension function in favour of suspend `MapboxMap.awaitCameraForCoordinates`.\n* Add min/max/default values to the docs for the generated properties.\n* Add asynchronous `TileStore.create().clearAmbientCache()` API that can be used for clearing all ambient cache data.\n* Expose experimental `lineZOffset` and `lineOcclusionOpacity` for `LineLayer`.\n* Expose experimental `modelFrontCutoff` for `ModelLayer`.\n* Expose experimental `iconOcclusionOpacity` and `textOcclusionOpacity` for `SymbolLayer` and `PointAnnotationManager`.\n* Expose experimental `lineOcclusionOpacity` for `PolylineAnnotationManager`.\n* Expose experimental `lineZOffset` for `PolylineAnnotation` and `PolylineAnnotationOptions`.\n\n## Bug fixes 🐞\n* Fix `RasterParticleLayer.rasterParticleCount` and `RasterParticleLayer.defaultRasterParticleCount` returning `null`.\n* Fix the rotated icon position during the globe transition.\n* Fix Dynamic View Annotation (DVA) placement to place DVA in the center of the line geometry point, and try to avoid placing DVA near the lines' intersection point.\n* Reduce the max raster-particle animation speed. It prevents particles from moving too fast, causing a visible clipping artifact at tile boundaries.\n\n## Dependencies\n* Update gl-native to v11.5.0-rc.1 and common to v24.5.0-rc.1.\n\n\n# 11.5.0-beta.1 June 11, 2024\n## Breaking changes ⚠️\n* [compose] Move `Projection` to `generated` package and rename `default` values to `DEFAULT`.\n* [compose] Rename `LightPreset` to `LightPresetValue`.\n* [compose] Rename `TerrainState.disabled` to `TerrainState.DISABLED`.\n* [compose] Replace terrain property `Exaggeration` with `DoubleValue`.\n* [compose] Replace concrete `AtmosphereState` properties (e.g. `HighColor`, `HorizonBlend`, `SpaceColor`, etc) with generic ones: `ColorValue`, `DoubleValue`, `DoubleRangeValue`.\n* [compose] Replace concrete Layer properties(e.g. `CircleColor`, `CircleOpacity`, `IconImage` etc) with generic ones: `ColorValue`, `DoubleValue`, `ImageValue` etc.\n* [compose] Replace concrete `GeoJsonSourceState`, `ImageSourceState`, `RasterArraySourceState`, `RasterDemSourceState`, `RasterSourceState`, `SourceProperties`, `VectorSourceState` properties with generic ones (e.g. `BooleanValue`, `StringValue`, `LongValue`...).\n* [compose] Move `GeoJSONData` outside of `generated` package.\n\n## Features ✨ and improvements 🏁\n* Expose `clusterMinPoints` property for `GeoJSONSource` and for annotation's `ClusterOptions`.\n* Remove explicit main thread locking when using `CircleAnnotationManager`, `PointAnnotationManager`, `PolygonAnnotationManager`, `PolylineAnnotationManager` and dragging the map that could lead to an ANR.\n* Use dedicated thread for the tile store to increase performance.\n* [compose] Expose `TerrainState` and `AtmosphereState` properties as `MutableState`.\n* [compose] Introduce `AmbientLightState`, `DirectionalLightState`, `FlatLightState` as separate states; `LightsState` can be constructed by combination of `DirectionalLightState` and `AmbientLightState` or with `FlatLightState` to be set to the style.\n* [compose] Avoid recreation of objects during recomposition of `GenericStyle`.\n* Expose `TerrainState` and `AtmosphereState` properties as `MutableState`.\n\n## Bug fixes 🐞\n* [compose] Fix `No enum constant com.mapbox.maps.GeoJSONSourceData` crash when restoring app from background.\n* `Snapshotter` methods throw `SnapshotterDestroyedException` if `destroy` was already called.\n* Fix precision issues in `ColorUtils` methods.\n* Fix NPE when parsing `rgb(...)` strings with `ColorUtils` methods.\n* Fix `ScaleBar.useContinuousRendering` not being in sync with `ScaleBar.settings.useContinuousRendering`.\n* Fix accuracy ring related location settings updates not being rendered immediately.\n* Fix a crash for Draco compressed 3D models whose geometry share indices.\n* Fix tile rendering errors when the composited source tile components are overscaled.\n* Fix transparent areas in overlapped polygons of MultiPolygon feature.\n* Fix crash on multiple style pack loading operations.\n\n## Dependencies\n* Update gl-native to v11.5.0-beta.1 and common to v24.5.0-beta.4.\n\n\n# 11.4.1 June 03, 2024\n## Bug fixes 🐞\n* Fix an issue that `getLight` API always returns null.\n\n\n# 11.4.0 May 22, 2024\n## Breaking changes ⚠️\n* [compose] Remove `locationComponentSettings` from `MapboxMap` composable function, `MapEffect` with location component API should be used instead. More compose-friendly location component API will be introduced in future releases.\n* [compose] Remove `TileCacheBudget(com.mapbox.maps.TileCacheBudget)` constructor and introduce `TileCacheBudget(TileCacheBudgetInMegabytes)` and `TileCacheBudget(TileCacheBudgetInTiles)` constructor instead.\n* [compose] Remove `layoutParams` from `ViewAnnotation` composable function, the internal `ComposeView` wrapping the `ViewAnnotation.content` will always use `WRAP_CONTENT`; In case of tests where the assertion happens before the measure, user can force the content size using `ViewAnnotationOptions.width/height` APIs.\n* [compose] Constructor in `PromoteId` data class from compose now takes `PropertyName` and optional `SourceId` instead of itself.\n* [compose] Use new `SlotsContent` instead of generic `Map` to handle the style content for slots. Introduced `slotsContent` builder function.\n* [compose] Use new `LayerPositionedContent` instead of generic `Map` to handle the layer positioned style content. Introduced `layerPositionedContent` builder function.\n* [compose] Use new `StyleImportsConfig` instead of generic `Map` to handle the style import configurations. Introduced `styleImportsConfig` builder function.\n* [compose] Move `MapboxStandardStyle` to a different package and introduce `LightPreset` with available presets as constants.\n* [compose] `MapViewportState` properties `cameraState`, `mapViewportStatusChangedReason` and `mapViewportStatus` are null when the state is not attached to a map.\n* [compose] `MapViewportState` constructor parameter has been renamed to `initialCameraState`.\n\n## Features ✨ and improvements 🏁\n* [compose] Add `AtmosphereState` parameter to `GenericStyle` composable function.\n* [compose] Introduce `Projection` and `AtmosphereState` API on `MapStyle` and `MapboxStandardStyle`.\n* [compose] Add `StyleImage` to construct following image layer properties: `IconImage`, `FillPattern`, `LinePattern`, `BearingImage`, `ShadowImage`, `TopImage`.\n* [compose] Add `ModelId` constructor to add model id and uri.\n* [compose] Add `TerrainState` parameter to `GenericStyle`, `MapStyle` and `MapboxStandardStyle` composable functions.\n* Introduce `addStyleImportFromJSON`, `addStyleImportFromURI`, `updateStyleImportWithJSON`, `updateStyleImportWithURI`, `moveStyleImport` APIs to `MapboxMap` and `Style`.\n* Handle updating geo-json data exceptions and propagate them to `MapboxMap.subscribeMapLoadingError(mapLoadingErrorCallback)`.\n* Introduce `SlotLayer` in Style DSL.\n* Add statistics for graphics pipeline program creation.\n* Enable `raster-elevation` for tiled raster sources.\n* Improve tile processing performance by filtering out tiny polygon holes.\n* Reduce number of evaluations of step expression in `line-gradient` properties.\n* Add support for `line-trim-offset` with `line-pattern`.\n* Enable two dimensional data handling in Mapbox Raster tiles.\n* Trim zoom ranges for the style at tileset descriptor resolving.\n* Extend `SymbolLayer.iconColorSaturation` range from [0, 1] to [-1, 1] and change default value to 0.\n* Reduce time spent on model layer re-evaluation during light change.\n* Expose experimental `Style.styleSlots` allowing to get the ordered list of slots.\n* Deprecate `MapboxMap.cameraForCoordinateBounds`, `MapboxMap.cameraForGeometry` and some synchronous overloaded `MapboxMap.cameraForCoordinates` in favour of single synchronous, asynchronous and suspend `MapboxMap.cameraForCoordinates`. Synchronous `MapboxMap.cameraForCoordinates` returns empty camera (could be checked with `CameraOptions.isEmpty`) if the map's size is not yet calculated.\n* Add feature metrics collection. Mapbox Maps SDK collects anonymous data about which of its features are used. Mapbox uses this data to understand how our software is being used and prioritize plans to improve it. These metrics tell us whether a feature has been used (\"flyTo was called\"), but not how (\"flyTo was called with this position\"). No user-level metrics or identifiers are collected as part of this initiative.\n* Avoid locking main thread when it is not needed on map destroy.\n* Add experimental `MapView.setSnapshotLegacyMode` function to help avoiding `MapView.snapshot` native crash on some Samsung devices running Android 14.\n* Add experimental `RasterParticleLayer` in Style DSL and Compose.\n* Add `mapView.location.slot` API to assign a slot for the location indicator.\n\n## Bug fixes 🐞\n* [compose] Fix an issue with `rememberGeoJsonSourceState`, where the `Value` and `GeoJsonData` can not be serialised.\n* [compose] Remember default `ComposeMapInitOptions` and `GesturesSettings` so that we don't reconstruct these classes when `MapboxMap` recomposes.\n* [compose] Filter relevant events for `ViewAnnotation.onUpdatedListener` and skip events from other view annotations.\n* [compose] Do not consume tap event for `Compass`, so that user set `clickable` can be processed.\n* [compose] Fix slots and layerposition content not being cleaned up during recomposition.\n* [compose] Propagate onRemoved and onClear to children nodes of MapStyleNode to do proper clean up.\n* [compose] Fix lost style import config during style switch by waiting for style load event.\n* [compose] Make the initial compass visibility to be false, so the compass wouldn't show and hide initially if the user is facing north.\n* [compose] Fix `java.io.NotSerializableException: com.mapbox.bindgen.Value` for SourceState.\n* [compose] Queue viewport operations when the `MapViewportState` is no yet attached to the map, to avoid losing events.\n* Fix `Snapshotter.cameraForCoordinates` arguments `padding`, `bearing` and `pitch` to be nullable.\n* Fix config with format expression that contains text property overrides.\n* Make non-vector tile parsing cancellable.\n* Move cutoff opacity calculation to CPU side.\n* Fix icon/pattern missing issue if the missing image is only added after map gets rendered.\n* Introduce a dedicated thread for 3d landmarks parsing.\n* Fix crash on start when no free disk space left.\n* Fix TilePrefetch for GeoJSON sources.\n* Fix snapshotter latency when 3d tiles involved.\n* Fix renderer destruction being blocked by 3d models parsing completion.\n* Fix memory leak when camera animations are skipped.\n* Fix Mapbox attribution and telemetry links not opening in a browser.\n* Fix incorrect size of the tile memory budget for vector tiles when the budget is set in megabytes.\n* Fix `LogoView.logoEnabled` not being in sync with `MapView.logo.enabled` state.\n* Fix raster-particle not being visible on some Android devices.\n* Fixed invalid circle order while using `circle-sort-key`.\n* Fixed duplicate circles in static viewport mode.\n* Fixed a crash during style change.\n\n## Dependencies\n* Update gl-native to v11.4.0 and common to v24.4.0.\n\n\n# 11.4.0-rc.2 May 15, 2024\n## Breaking changes ⚠️\n* [compose] `MapViewportState` properties `cameraState`, `mapViewportStatusChangedReason` and `mapViewportStatus` are null when the state is not attached to a map.\n* [compose] `MapViewportState` constructor parameter has been renamed to `initialCameraState`.\n\n## Bug fixes 🐞\n* [compose] Queue viewport operations when the `MapViewportState` is no yet attached to the map, to avoid losing events.\n* Fix `LogoView.logoEnabled` not being in sync with `MapView.logo.enabled` state.\n* Fix raster-particle not being visible on some Android devices.\n\n## Dependencies\n* Update gl-native to v11.4.0-rc.2 and common to v24.4.0-rc.2.\n\n\n# 11.4.0-rc.1 May 08, 2024\n## Features ✨ and improvements 🏁\n* [compose] Add `StyleImage` to construct following image layer properties: `IconImage`, `FillPattern`, `LinePattern`, `BearingImage`, `ShadowImage`, `TopImage`.\n* [compose] Add `ModelId` constructor to add model id and uri.\n* [compose] Add `TerrainState` parameter to `GenericStyle`, `MapStyle` and `MapboxStandardStyle` composable functions.\n* Add experimental `RasterParticleLayer` in Style DSL and Compose.\n* Add `mapView.location.slot` API to assign a slot for the location indicator.\n\n## Bug fixes 🐞\n* Fix memory leak when camera animations are skipped.\n* Fix Mapbox attribution and telemetry links not opening in a browser.\n* Fix incorrect size of the tile memory budget for vector tiles when the budget is set in megabytes.\n* Fix known issue from 11.4.0-beta.1 where setting a RasterLayer’s rasterColor property with an expression will block the layer from rendering.\n\n## Dependencies\n* Update gl-native to v11.4.0-rc.1 and common to v24.4.0-rc.1.\n\n\n# 11.4.0-beta.3 May 06, 2024\n## Features ✨ and improvements 🏁\n* Add experimental `MapView.setSnapshotLegacyMode` function to help avoiding `MapView.snapshot` native crash on some Samsung devices running Android 14.\n\n## Bug fixes 🐞\n* [compose] Make the initial compass visibility to be false, so the compass wouldn't show and hide initially if the user is facing north.\n* [compose] Fix `java.io.NotSerializableException: com.mapbox.bindgen.Value` for SourceState.\n\n## Dependencies\n* Update common to v24.4.0-beta.3.\n\n\n# 11.4.0-beta.2 April 30, 2024\n## Features ✨ and improvements 🏁\n* Avoid locking main thread when it is not needed on map destroy.\n\n## Bug fixes 🐞\n* Fix TilePrefetch for GeoJSON sources.\n* Fix snapshotter latency when 3d tiles involved.\n* Fix renderer destruction being blocked by 3d models parsing completion.\n\n## Dependencies\n* Update gl-native to v11.4.0-beta.2 and common to v24.4.0-beta.2.\n\n\n# 11.4.0-beta.1 April 29, 2024\n## Breaking changes ⚠️\n* [compose] Remove `locationComponentSettings` from `MapboxMap` composable function, `MapEffect` with location component API should be used instead. More compose-friendly location component API will be introduced in future releases.\n* [compose] Remove `TileCacheBudget(com.mapbox.maps.TileCacheBudget)` constructor and introduce `TileCacheBudget(TileCacheBudgetInMegabytes)` and `TileCacheBudget(TileCacheBudgetInTiles)` constructor instead.\n* [compose] Remove `layoutParams` from `ViewAnnotation` composable function, the internal `ComposeView` wrapping the `ViewAnnotation.content` will always use `WRAP_CONTENT`; In case of tests where the assertion happens before the measure, user can force the content size using `ViewAnnotationOptions.width/height` APIs.\n* [compose] Constructor in `PromoteId` data class from compose now takes `PropertyName` and optional `SourceId` instead of itself.\n* [compose] Use new `SlotsContent` instead of generic `Map` to handle the style content for slots. Introduced `slotsContent` builder function.\n* [compose] Use new `LayerPositionedContent` instead of generic `Map` to handle the layer positioned style content. Introduced `layerPositionedContent` builder function.\n* [compose] Use new `StyleImportsConfig` instead of generic `Map` to handle the style import configurations. Introduced `styleImportsConfig` builder function.\n* [compose] Move `MapboxStandardStyle` to a different package and introduce `LightPreset` with available presets as constants.\n\n## Features ✨ and improvements 🏁\n* [compose] Add `AtmosphereState` parameter to `GenericStyle` composable function.\n* [compose] Introduce `Projection` and `AtmosphereState` API on `MapStyle` and `MapboxStandardStyle`.\n* Introduce `addStyleImportFromJSON`, `addStyleImportFromURI`, `updateStyleImportWithJSON`, `updateStyleImportWithURI`, `moveStyleImport` APIs to `MapboxMap` and `Style`.\n* Handle updating geo-json data exceptions and propagate them to `MapboxMap.subscribeMapLoadingError(mapLoadingErrorCallback)`.\n* Introduce `SlotLayer` in Style DSL.\n* Add statistics for graphics pipeline program creation.\n* Enable `raster-elevation` for tiled raster sources.\n* Improve tile processing performance by filtering out tiny polygon holes.\n* Reduce number of evaluations of step expression in `line-gradient` properties.\n* Add support for `line-trim-offset` with `line-pattern`.\n* Enable two dimensional data handling in Mapbox Raster tiles.\n* Trim zoom ranges for the style at tileset descriptor resolving.\n* Extend `SymbolLayer.iconColorSaturation` range from [0, 1] to [-1, 1] and change default value to 0.\n* Reduce time spent on model layer re-evaluation during light change.\n* Expose experimental `Style.styleSlots` allowing to get the ordered list of slots.\n* Deprecate `MapboxMap.cameraForCoordinateBounds`, `MapboxMap.cameraForGeometry` and some synchronous overloaded `MapboxMap.cameraForCoordinates` in favour of single synchronous, asynchronous and suspend `MapboxMap.cameraForCoordinates`. Synchronous `MapboxMap.cameraForCoordinates` returns empty camera (could be checked with `CameraOptions.isEmpty`) if the map's size is not yet calculated.\n\n## Bug fixes 🐞\n* [compose] Fix an issue with `rememberGeoJsonSourceState`, where the `Value` and `GeoJsonData` can not be serialised.\n* [compose] Remember default `ComposeMapInitOptions` and `GesturesSettings` so that we don't reconstruct these classes when `MapboxMap` recomposes.\n* [compose] Filter relevant events for `ViewAnnotation.onUpdatedListener` and skip events from other view annotations.\n* [compose] Do not consume tap event for `Compass`, so that user set `clickable` can be processed.\n* [compose] Fix slots and layerposition content not being cleaned up during recomposition.\n* [compose] Propagate onRemoved and onClear to children nodes of MapStyleNode to do proper clean up.\n* [compose] Fix lost style import config during style switch by waiting for style load event.\n* Fix `Snapshotter.cameraForCoordinates` arguments `padding`, `bearing` and `pitch` to be nullable.\n* Fix config with format expression that contains text property overrides.\n* Make non-vector tile parsing cancellable.\n* Move cutoff opacity calculation to CPU side.\n* Fix icon/pattern missing issue if the missing image is only added after map gets rendered.\n* Introduce a dedicated thread for 3d landmarks parsing.\n* Fix crash on start when no free disk space left.\n\n## Dependencies\n* Update gl-native to v11.4.0-beta.1 and common to v24.4.0-beta.1.\n\n## Known issues\n* In v11.4.0-beta.1, setting a RasterLayer’s rasterColor property with an expression will block the layer from rendering. This issue will be resolved in v11.4.0-rc.1.\n* In v11.4.0-beta.1, the map destroy might block main thread for short amount of time and cause UI to freeze. This issue will be resolved in v11.4.0-beta.2.\n\n\n# 11.3.1 April 26, 2024\n## Features ✨ and improvements 🏁\n* Reduce time spent on model layer re-evaluation during light change.\n\n## Bug fixes 🐞\n* Make non-vector tile parsing cancellable.\n* Introduce a dedicated thread for 3d landmarks parsing.\n* Fix TilePrefetch for GeoJSON sources.\n\n## Dependencies\n* Update gl-native to v11.3.2.\n\n\n# 11.3.0 April 11, 2024\n## Breaking changes ⚠️\n* [compose] Introduce experimental `ComposeMapInitOptions` and remove `mapInitOptionsFactory`.\n* [compose] Replace experimental `MapboxMap.compassSettings`, `MapboxMap.scaleBarSettings`, `MapboxMap.logoSettings`, `MapboxMap.attributionSettings` with composable functions in dedicated scopes: `MapCompassScope.Compass()`, `MapScaleBarScope.ScaleBar()`, `MapLogoScope.Logo()`, `MapAttributionScope.Attribution()`.\n\n## Features ✨ and improvements 🏁\n* [compose] Add layerPosition support in `GenericStyle` composable function.\n* [compose] Add layer transition properties.\n* [compose] Add `contentPadding` to map ornament composable functions(e.g. `Compass`, `Logo`, `Attribution`, `ScaleBar`).\n* [compose] Introduce experimental `MapStyle`, `MapboxStandardStyle`, `GenericStyle` composable functions to work with the map style.\n* [compose] Introduce experimental layer composable functions to insert layers to the map.\n* [compose] Introduce experimental source states to work with layer composable functions.\n* [compose] Add map projection support in `GenericStyle` composable function.\n* Expose `MapInitOptions.mapName` (`mapbox_mapName` in XML) property allowing to set the custom name which will be appended to map render related logs.\n* Add Attribution and Telemetry pop-up dialogs and compass view content description translations for Arabic, Bulgarian, Catalan, Chinese Simplified, Chinese Traditional, Czech, Danish, Dutch, French, Galician, German, Hebrew, Italian, Japanese, Korean, Lithuanian, Norwegian, Polish, Belarusian, Russian, Spanish, Swedish, Ukranian and Vietnamese.\n* Perform faster landmark parsing by switching tinygltf in favor of cgltf.\n* Use mipmap with pattern images.\n* Add `SdkInformationQuery` to expose sdk version information.\n* Enable `TileStore` delta updates by default for Maps domain.\n* Add `TileStore.estimateTileRegion` API for estimating Tile Region downloads and storage size.\n\n## Bug fixes 🐞\n* [compose] Fix a bug introduced in `11.3.0-beta.1` where AnnotationGroup items updates were skipped.\n* [compose] Fix `ViewAnnotation` not cleared when it leaves composition.\n* [compose] Fix the `IndexOutOfBoundsException` because of `RootNode` of `MapboxMap` node tree being shared across multiple maps.\n* Resolve the data race by ensuring that when terrain is enabled, the transform state is updated with the correct elevation instance.\n* Fix offline composited tiles fetching when the request tile zoom level is above maximum zoom for one of the composed tile packs but below maximum zoom level for another one.\n* Fix override of line-gradient textures when fill-extrusion effects are used on terrain.\n* Return `ViewAnnotationOptions.Builder` when calling `ViewAnnotationOptions.Builder.annotationAnchor` extension function.\n* Immediately add annotations and location component to the map instead of waiting for style load events.\n* Fix a bug where specifying a large negative value for padding in `MapboxMap.camera*()` methods resulted in the returned zoom value being NaN.\n* Fix location indicator models rendering issue with globe projection.\n* Offline: composite higher level tiles from their parents, when a non-standard [tile pack zoom ranges scheme](https://docs.mapbox.com/android/maps/guides/offline/#tile-count-granularity) is used.\n* Use bigger http buffers to avoid reference table overflow.\n* Fix attribution links not opening in some scenarios.\n* Fix attribution and telemetry dialogs not respecting current theme.\n* Fix map being pixelated on some devices when `ContextMode.SHARED` is used (e.g. in AndroidAuto extension).\n* Fix map being black on some zoom levels when `ContextMode.SHARED` is used (e.g. in AndroidAuto extension).\n* Fix incorrect widget position and scale when resizing the drawing surface.\n* Fix layer paint property update with feature state changes, especially if the paint property value data-driven by brightness or zoom.\n* Fix snapshotter race conditions to ensure new request could effectively trigger map rendering.\n* Fix raster array band updates glitches during the camera zoom animation.\n* Reload vector source tiles when language or worldview setting is changed.\n* Apply config expression to atmosphere properties.\n* Fix map freezing when using `queryRenderedFeatures` with 3d models in mercator projection.\n* Reduce time spent on line gradient updates on the render thread.\n* Fix network reachability status getting stuck with ReachableViaWWAN status if HTTP requests completed at the same time as network reported being disconnected.\n* Fix wrong network reachability statuses.\n* Fix double `LocationServiceObserver.onAvailabilityChanged` callback trigger.\n* Avoid bringing Kotlin 1.8 as transitive dependency, Maps SDK should use Kotlin 1.7.20.\n\n## Dependencies\n* Update gl-native to v11.3.0 and common to v24.3.1.\n* Update Mapbox Base Android library to [v0.11.0](https://github.com/mapbox/mapbox-base-android/releases/tag/v0.11.0).\n\n# 11.3.0-rc.1 March 28, 2024\n##  Known Issues ⚠️\n* The tiles fetching from the offline database is malfunctioning for the composited sources. Setting `com.mapbox.maps.experimental.offline_vt_compositing` runtime flag to `false` resolves this issue:\n```Kotlin\nval settings = SettingsServiceFactory.getInstance(SettingsServiceStorageType.NON_PERSISTENT)\nsettings.set(\"com.mapbox.maps.experimental.offline_vt_compositing\", Value.valueOf(false))\n```\n\n## Features ✨ and improvements 🏁\n* [compose] Add layerPosition support in `GenericStyle` composable function.\n* Expose `MapInitOptions.mapName` (`mapbox_mapName` in XML) property allowing to set the custom name which will be appended to map render related logs.\n* [compose] Add layer transition properties.\n* [compose] Add `contentPadding` to map ornament composable functions(e.g. `Compass`, `Logo`, `Attribution`, `ScaleBar`).\n\n## Bug fixes 🐞\n* Return `ViewAnnotationOptions.Builder` when calling `ViewAnnotationOptions.Builder.annotationAnchor` extension function.\n* [compose] Fix the `IndexOutOfBoundsException` because of `RootNode` of `MapboxMap` node tree being shared across multiple maps.\n* Immediately add annotations and location component to the map instead of waiting for style load events.\n* Fix a bug where specifying a large negative value for padding in `MapboxMap.camera*()` methods resulted in the returned zoom value being NaN.\n* Fix location indicator models rendering issue with globe projection.\n* Offline: composite higher level tiles from their parents, when a non-standard [tile pack zoom ranges scheme](https://docs.mapbox.com/android/maps/guides/offline/#tile-count-granularity) is used.\n* Use bigger http buffers to avoid reference table overflow.\n* Fix a crash in `MapView.snapshot` happening on specific devices.\n\n## Dependencies\n* Update gl-native to v11.3.0-rc.1 and common to v24.3.0-rc.1.\n\n\n# 11.2.2 March 27, 2024\n## Features ✨ and improvements 🏁\n* Expose `MapInitOptions.mapName` (`mapbox_mapName` in XML) property allowing to set the custom name which will be appended to map render related logs.\n\n## Dependencies\n* Update gl-native to v11.2.2 and common to v24.2.3.\n\n# 11.2.1 March 15, 2024\n## Bug fixes 🐞\n* Apply config expression to atmosphere properties.\n* Fix map freezing when using `queryRenderedFeatures` with 3d models in mercator projection.\n\n## Dependencies\n* Update gl-native to v11.2.1.\n\n# 11.3.0-beta.1 March 14, 2024\n## Breaking changes ⚠️\n* [compose] Replace experimental `MapboxMap.compassSettings`, `MapboxMap.scaleBarSettings`, `MapboxMap.logoSettings`, `MapboxMap.attributionSettings` with composable functions in dedicated scopes: `MapCompassScope.Compass()`, `MapScaleBarScope.ScaleBar()`, `MapLogoScope.Logo()`, `MapAttributionScope.Attribution()`.\n\n## Features ✨ and improvements 🏁\n* Added Attribution and Telemetry pop-up dialogs and compass view content description translations for Arabic, Bulgarian, Catalan, Chinese Simplified, Chinese Traditional, Czech, Danish, Dutch, French, Galician, German, Hebrew, Italian, Japanese, Korean, Lithuanian, Norwegian, Polish, Belarusian, Russian, Spanish, Swedish, Ukranian and Vietnamese.\n* Faster landmark parsing by switching tinygltf in favor of cgltf.\n* Use mipmap with pattern images .\n* Add `SdkInformationQuery` to expose sdk version information.\n* Enable `TileStore` delta updates by default for Maps domain.\n* Add `TileStore.estimateTileRegion` API for estimating Tile Region downloads and storage size.\n* [compose] Introduce experimental `MapStyle`, `MapboxStandardStyle`, `GenericStyle` composable functions to work with the map style.\n* [compose] Added experimental layer and source composable functions to insert layer/sources to the map.\n* [compose] Improve annotation group update speed.\n\n## Bug fixes 🐞\n* [compose] Fix `ViewAnnotation` not cleared when it leaves composition.\n* Fix attribution links not opening in some scenarios.\n* Fix attribution and telemetry dialogs not respecting current theme.\n* Fix map being pixelated on some devices when `ContextMode.SHARED` is used (e.g. in AndroidAuto extension).\n* Fix incorrect widget position and scale when resizing the drawing surface.\n* Fix layer paint property update with feature state changes, especially if the paint property value data-driven by brightness or zoom.\n* Fix snapshotter race conditions to ensure new request could effectively trigger map rendering.\n* Fix raster array band updates glitches during the camera zoom animation.\n* Reload vector source tiles when language or worldview setting is changed.\n* Apply config expression to atmosphere properties.\n* Fix map freezing when using `queryRenderedFeatures` with 3d models in mercator projection.\n* Reduce time spent on line gradient updates on the render thread.\n* Fix network reachability status getting stuck with ReachableViaWWAN status if HTTP requests completed at the same time as network reported being disconnected.\n* Fix wrong network reachability statuses.\n* Fix double `LocationServiceObserver.onAvailabilityChanged` callback trigger.\n* Avoid bringing Kotlin 1.8 as transitive dependency, Maps SDK should use Kotlin 1.7.20.\n\n## Dependencies\n* Update gl-native to v11.3.0-beta.1 and common to v24.3.0-beta.1.\n\n\n# 11.2.0 February 29, 2024\n## Features ✨ and improvements 🏁\n* Introduce better way of SDK initialization to avoid `java.lang.UnsatisfiedLinkError` exception on process startup. If the native library is still not found when actual Mapbox API is called, meaningful `MapboxInitializerException` is thrown and could be caught and processed on user's side.\n* Introduce `MapboxMap.getCenterAltitudeMode` API.\n* Add `useShortestPath` option to `CameraAnimationPlugin.createCenterAnimator`, when enabled, shortest path will be applied when the start and end camera  center is across the antimeridian, for example from -170 to 170 longitude. Defaults to true.\n* Introduce `SymbolLayer.iconColorSaturation` API.\n* Introduce experimental `RasterLayer.rasterElevation` API.\n* Introduce experimental `MapboxMap.startPerformanceStatisticsCollection` / `MapboxMap.stopPerformanceStatisticsCollection` APIs allowing to start / stop collecting map rendering performance statistics.\n* Introduce `GeoJsonSource.tileCacheBudget`, `RasterSource.tileCacheBudget`, `RasterDemSource.tileCacheBudget`, `RasterArraySource.tileCacheBudget`, `VectorSource.tileCacheBudget`, `CustomGeometrySource.tileCacheBudget`, `CustomRasterSource.tileCacheBudget`.\n* Skip unneeded layers properties re-evaluation on zoom change.\n* Add the possibility to use constant expressions for `model-emissive-strength` when rendering 3D model layers using 2D sources.\n* Introduce static `HttpServiceFactory.setMaxRequestsPerHost` API.\n* `TileStoreOptions.DiskQuota` is now an abort threshold for tilestore size. When we have more than this amount of bytes stored, new downloads will fail. `Tilestore` starts to evict tiles with closest expiration date 50Mb (or 10% of DiskQuota, whatever is smaller) before this abort threshold is reached.\n* Speedup preparing tiled sources for rendering.\n* Uploading model resources to GPU in continuous map mode is now limited by fixed time per frame.\n* Modify `FillExtrusionLayer.fillExtrusionCutoffFadeRange` to scale down and remove buildings in a staggered fashion, instead of fading opacity.\n* [compose] Introduce `DisposableMapEffect` API.\n* [compose] Add default value for `MapViewportState.transitionToFollowPuckState.followPuckViewportStateOptions`.\n\n## Bug fixes 🐞\n* Retain previous `CenterAltitudeMode` after gestures are finished.\n* Avoid marking whole `LayerDsl` as experimental when only a part of the layer properties are experimental.\n* Fix R8 error due to missing class `com.tobrun.datacompat.annotation.Default`.\n* `EaseTo` and `MoveBy` camera animation and `DefaultViewportTransition` now will use shortest path when the start and end camera center is across the antimeridian, for example from -170 to 170 longitude.\n* Remove extra image padding from text shaping offset.\n* Address crashes on certain Android devices by disabling the texture pool.\n* Fix elevated rasters with coordinates not aligned to the longitude/latitude grid.\n* Fix a bug that was causing absence of `MapLoaded` event and never ending background task processing.\n* Fix a bug that heatmap layer wasn't updating visuals after feature state change.\n* Fix a bug where scientific notation is not supported when parse JSON numbers to `Value`.\n* Fix a crash occurring when clicking on the \"Telemetry settings\" option in the attribution dialog when not using the `AppCompat` theme.\n* Fix `ModelLayer.modelCutoffFadeRange` calculation on low zoom levels.\n* Fix `RasterArray` rendering on Android.\n* Fix rare null pointer dereference crash.\n* Fix a bug with disappearing models during light changes.\n* Fix rendering artifacts on long fill outlines on pitched map view.\n* Fix style parsing when the style and import's urls are both empty.\n* Fix config expression evaluation if the expected type is formatted but the actual value is string.\n* Fix not taking `line-trim-offset` into account for Dynamic View Annotation placement.\n* Fix issue that View Annotation stays visible when the associated layer's visibility is none.\n* Fix camera framing on globe with padding.\n* [compose] Fix a warning that using UI composable where Mapbox Map composable is expected.\n* [compose] Fix losing some location component settings during wrapping.\n\n## Dependencies\n* Update gl-native to v11.2.0 and common to v24.2.0.\n* Upgrade to [Kotlin Data compat v0.8.0](https://github.com/tobrun/kotlin-data-compat/releases/tag/v0.8.0).\n\n\n# 11.2.0-rc.1 February 15, 2024\n## Features ✨ and improvements 🏁\n* [compose] Introduce `DisposableMapEffect` API.\n* Speedup preparing tiled sources for rendering.\n* Uploading model resources to GPU in continuous map mode is now limited by fixed time per frame.\n* Modify `FillExtrusionLayer.fillExtrusionCutoffFadeRange` to scale down and remove buildings in a staggered fashion, instead of fading opacity.\n\n## Bug fixes 🐞\n* [compose] Fix a warning that using UI composable where Mapbox Map composable is expected.\n* Fix a crash occurring when clicking on the \"Telemetry settings\" option in the attribution dialog when not using the `AppCompat` theme.\n* Fix `ModelLayer.modelCutoffFadeRange` calculation on low zoom levels.\n* Fix `RasterArray` rendering on Android.\n* Fix rare null pointer dereference crash.\n\n## Dependencies\n* Update gl-native to v11.2.0-rc.1 and common to v24.2.0-rc.2.\n\n\n# 11.2.0-beta.1 February 01, 2024\n## Features ✨ and improvements 🏁\n* Introduce better way of SDK initialization to avoid `java.lang.UnsatisfiedLinkError` exception on process startup. If the native library is still not found when actual Mapbox API is called, meaningful `MapboxInitializerException` is thrown and could be caught and processed on user's side.\n* Introduce `MapboxMap.getCenterAltitudeMode` API.\n* Add `useShortestPath` option to `CameraAnimationPlugin.createCenterAnimator`, when enabled, shortest path will be applied when the start and end camera  center is across the antimeridian, for example from -170 to 170 longitude. Defaults to true.\n* Introduce `SymbolLayer.iconColorSaturation` API.\n* Introduce experimental `RasterLayer.rasterElevation` API.\n* Introduce experimental `MapboxMap.startPerformanceStatisticsCollection` / `MapboxMap.stopPerformanceStatisticsCollection` APIs allowing to start / stop collecting map rendering performance statistics.\n* Introduce `GeoJsonSource.tileCacheBudget`, `RasterSource.tileCacheBudget`, `RasterDemSource.tileCacheBudget`, `RasterArraySource.tileCacheBudget`, `VectorSource.tileCacheBudget`, `CustomGeometrySource.tileCacheBudget`, `CustomRasterSource.tileCacheBudget`.\n* Skip unneeded layers properties re-evaluation on zoom change.\n* Add the possibility to use constant expressions for `model-emissive-strength` when rendering 3D model layers using 2D sources.\n* Introduce static `HttpServiceFactory.setMaxRequestsPerHost` API.\n* `TileStoreOptions.DiskQuota` is now an abort threshold for tilestore size. When we have more than this amount of bytes stored, new downloads will fail. `Tilestore` starts to evict tiles with closest expiration date 50Mb (or 10% of DiskQuota, whatever is smaller) before this abort threshold is reached.\n\n## Bug fixes 🐞\n* Retain previous `CenterAltitudeMode` after gestures are finished.\n* Avoid marking whole `LayerDsl` as experimental when only a part of the layer properties are experimental.\n* Fix R8 error due to missing class `com.tobrun.datacompat.annotation.Default`.\n* `EaseTo` and `MoveBy` camera animation and `DefaultViewportTransition` now will use shortest path when the start and end camera center is across the antimeridian, for example from -170 to 170 longitude.\n* Remove extra image padding from text shaping offset.\n* Address crashes on certain Android devices by disabling the texture pool.\n* Fix elevated rasters with coordinates not aligned to the longitude/latitude grid.\n* Fix a bug that was causing absence of `MapLoaded` event and never ending background task processing.\n* Fix a bug that heatmap layer wasn't updating visuals after feature state change.\n* Fix a bug where scientific notation is not supported when parse JSON numbers to `Value`.\n\n## Dependencies\n* Upgrade to [Kotlin Data compat v0.8.0](https://github.com/tobrun/kotlin-data-compat/releases/tag/v0.8.0).\n* Update gl-native to v11.2.0-beta.1 and common to v24.2.0-beta.1.\n\n## Known issues\nWith the new way of Mapbox SDK initialization, your application __unit tests__ may start failing when interacting with Mapbox APIs, even if mocked.\nThe error may look like:\n```\nException java.lang.NoClassDefFoundError: Could not initialize class com.mapbox.common.location.Location\n```\nor\n```\nCaused by: java.lang.RuntimeException: Method w in android.util.Log not mocked. See https://developer.android.com/r/studio-ui/build/not-mocked for details.\n  at android.util.Log.w(Log.java)\n  at com.mapbox.common.BaseMapboxInitializer$Companion.init(BaseMapboxInitializer.kt:116)\n  at com.mapbox.common.BaseMapboxInitializer.init(BaseMapboxInitializer.kt)\n  at com.mapbox.common.location.Location.<clinit>(Location.java:442)\n```\n\nTo fix above errors, `BaseMapboxInitializer` should be properly mocked before accessing the failing Mapbox class. For example, when using Kotlin [MockK](https://mockk.io/) you should add the following code:\n```kotlin\nmockkObject(BaseMapboxInitializer)\nevery { BaseMapboxInitializer.init<Any>(any()) } just Runs\n// your test code\nunmockkObject(BaseMapboxInitializer)\n```\nAlternative solution is to apply [`unitTests.returnDefaultValues`](https://developer.android.com/training/testing/local-tests#error).\n\n\n# 11.1.0 January 17, 2024\n## Features ✨ and improvements 🏁\n* From v11.1.0, Mapbox Android Auto Extension for Android is released as a separate module following the same release cadence with the main SDK, please refer to [this guide](extension-androidauto/README.md) to get started with Android Auto, and [v0.5.0 changelog](extension-androidauto/CHANGELOG-v0.5.0.md) for previous changelogs.\n* Define minCompileSdkVersion=31 for Maps SDK libraries.\n* Introduce `FillExtrusionLayer.fillExtrusionEmissiveStrength`, `HillshadeLayer.hillshadeEmissiveStrength` and `RasterLayer.rasterEmissiveStrength` properties.\n* Introduce `RasterLayer.rasterArrayBand` property.\n* Improve performance of `StyleInterface.localizeLabels` method.\n* Introduce `RasterArraySource` with read only property `RasterArraySource.rasterLayers`, which can be used in combination with `RasterLayer.sourceLayer` and `RasterLayer.rasterArrayBand`.\n* Improve error handling for `UnknownNativeException`, more specific error message will be thrown instead.\n* Support landmark tilesets with compressed textures for improved tile load performance.\n* Improve performance of changing layers' properties.\n\n## Bug fixes 🐞\n* Fix `MapSurface` rendering issue when widgets are used.\n* Fix `coordinateBoundsForCameraUnwrapped` returning wrapped coordinates.\n* Fix inconsistent behavior in fill-extrusion color when using directional and ambient lights.\n* Downloaded but corrupted style is now invalidated and will be downloaded again on the next load.\n* Fixed missing tiles in the bottom part of the screen when looking from the mountain down to the valley.\n* Do not emit slot missing warnings if style imports are not fully loaded.\n* Fixed wrong dem tile selection from elevation snapshots in rare cases.\n* Fixed tile flickering with enabled terrain.\n* Add missing properties, i.e. `array`, `values`, `maxValue`, `minValue`, `stepValue`, `metadata` when using `getStyleImportSchema` API, if they are present in the original schema.\n* Exclude duplicated `tileID` in `MapboxMap.tileCover` querying results.\n* Fix race condition on repeated style transitions, when the transition fails for some layers.\n* Allow style schema to control imported fragment configs.\n* Fix possible rendering artifacts on startup when `ContextMode.SHARED` is used.\n* Fix wrong camera positions while using `setBounds`.\n* Fix missing IDs of flat light types when configured through the `setLights` API.\n* Reload image dependent tiles when sprites are loaded.\n* Fix an issue where memory use would grow continuously with Z-offset enabled symbol layers.\n* Fix crash when using Dynamic View Annotation with location indicator enabled but visibility is turned from visible to none.\n* Fix `getStyleSourceProperties()` API for `RasterArray` source.\n* Fix unreliable position update of View Annotations.\n* Fix GeoJSON partial updates when there is an error during update followed by multiple update calls.\n\n## Dependencies\n* Update gl-native to v11.1.0 and common to v24.1.0.\n\n# 11.1.0-rc.1 January 04, 2024\n## Bug fixes 🐞\n* Fix possible rendering artifacts on startup when `ContextMode.SHARED` is used.\n* Fix regression introduced in v11.1.0-beta.1 where only last added widget was rendered.\n* Fix wrong camera positions while using `setBounds`.\n* Fix missing IDs of flat light types when configured through the `setLights` API.\n* Reload image dependent tiles when sprites are loaded.\n* Fix an issue where memory use would grow continuously with Z-offset enabled symbol layers.\n* Fix crash when using Dynamic View Annotation with location indicator enabled but visibility is turned from visible to none.\n* Fix `getStyleSourceProperties()` API for `RasterArray` source.\n* Fix unreliable position update of View Annotations.\n\n## Dependencies\n* Update gl-native to v11.1.0-rc.1 and common to v24.1.0-rc.1.\n\n\n# 11.1.0-beta.1 December 19, 2023\n## Features ✨ and improvements 🏁\n* Define minCompileSdkVersion=31 for Maps SDK libraries.\n* Introduce `FillExtrusionLayer.fillExtrusionEmissiveStrength`, `HillshadeLayer.hillshadeEmissiveStrength` and `RasterLayer.rasterEmissiveStrength` properties.\n* Introduce `RasterLayer.rasterArrayBand` property.\n* Improve performance of `StyleInterface.localizeLabels` method.\n* Introduce `RasterArraySource` with read only property `RasterArraySource.rasterLayers`, which can be used in combination with `RasterLayer.sourceLayer` and `RasterLayer.rasterArrayBand`.\n* Improve error handling for `UnknownNativeException`, more specific error message will be thrown instead.\n* Support landmark tilesets with compressed textures for improved tile load performance.\n\n## Bug fixes 🐞\n* Fix a `MapSurface` rendering issue when widgets are used.\n* Fix `coordinateBoundsForCameraUnwrapped` returning wrapped coordinates.\n* Fix inconsistent behavior in fill-extrusion color when using directional and ambient lights.\n* Downloaded but corrupted style is now invalidated and will be downloaded again on the next load.\n* Fixed missing tiles in the bottom part of the screen when looking from the mountain down to the valley.\n* Do not emit slot missing warnings if style imports are not fully loaded.\n* Fixed wrong dem tile selection from elevation snapshots in rare cases.\n* Fixed tile flickering with enabled terrain.\n* Add missing properties, i.e. `array`, `values`, `maxValue`, `minValue`, `stepValue`, `metadata` when using `getStyleImportSchema` API, if they are present in the original schema.\n* Exclude duplicated tileID in tileCover querying results.\n* Fix race condition on repeated style transitions, when the transition fails for some layers.\n* Allow style schema to control imported fragment configs.\n\n## Dependencies\n* Update gl-native to v11.1.0-beta.1 and common to v24.1.0-beta.2.\n\n\n# 11.0.0 November 29, 2023\n## Breaking changes ⚠️\n* **Minimum OpenGL ES version is now 3.0**.\n* **Update SDK's `targetSdkVersion` and `compileSdkVersion` to 33**.\n* Remove deprecated `GeoJsonSource` public constructor, builder should be used instead.\n* Remove deprecated `MapboxMap.queryRenderedFeatures` methods.\n* Remove `Snapshotter.setTileMode`, `Snapshotter.isInTileMode` methods.\n* Remove deprecated `MapStyleStateDelegate` and `isFullyLoaded` method.\n* Remove experimental `setRenderCacheOptions`, `getRenderCacheOptions` apis.\n* Add `callback` argument to the `MapboxMap` methods `getFeatureState`, `setFeatureState`, `removeFeatureState`.\n* Use different callback types for the `MapboxMap.queryRenderedFeatures` and the `MapboxMap.querySourceFeatures` methods.\n* Return `cancelable` from the `MapboxMap` methods : `getFeatureState`, `setFeatureState`, `removeFeatureState`, `querySourceFeatures`, `getGeoJsonClusterLeaves`, `getGeoJsonClusterChildren`, `getGeoJsonClusterExpansionZoom`.\n* Remove the deprecated `MapboxMap.queryFeatureExtensions` method.\n* Remove `MapAnimationOptions.animatorListener` property. In order to subscribe to animations, provide `Animator.animatorListener` with `flyTo`, `easeTo`, `pitchBy`, `scaleBy`, `moveBy`, `rotateBy` apis.\n* Replace `LocationEngine` use with `LocationService` in `DefaultProvider`.\n* Add new `LocationConsumer.onError` method to allow consumers handle location errors.\n* Remove `MapView.location2` related interfaces and move `showAccuracyRing`, `accuracyRingColor`, `accuracyRingBorderColor`, `puckBearingEnabled` and `puckBearingSource` to `MapView.location`.\n* Make `AttributionSettings`, `CompassSettings`, `GesturesSettings`, `LocationComponentSettings`, `LogoSettings`, `ScaleBarSettings` not Kotlin `data class`, better binary compatible and implementing `Parcelable`.\n* Change `CompassSettings.image`, `LocationPuck2D.topImage`, `LocationPuck2D.bearingImage`, `LocationPuck2D.shadowImage` to `ImageHolder` allowing to pass either drawable id or `Bitmap`.\n* Remove deprecated `backgroundPatternTransition`, `lineDasharrayTransition`, `linePatternTransition`, `fillPatternTransition` properties.\n* Replace `MapSnapshotInterface` interface with `MapSnapshotResult` abstract class and remove `image()` method, `bitmap()` should be used instead.\n* Change `Annotation.id` from monotonically increasing `Long` to UUID represented as `String`.\n* Remove `Annotation.featureIdentifier` used to connect with View Annotations, now `Annotation.id` should be used instead.\n* Rename `PuckBearingSource` to `PuckBearing` in location component plugin.\n* Remove deprecated overloaded `Style.setStyleGeoJSONSourceData(sourceId: String, data: GeoJSONSourceData)` method.\n* Rename `MapboxMap.setMemoryBudget` to `MapboxMap.setTileCacheBudget` and make it non-experimental.\n* Remove `ResourceOptions` and `ResourceOptionsManager`. Introduce `MapboxOptions` and `MapboxMapsOptions` to handle application-level access token and other generic options.\n* Removed XML attributes `mapbox_resourcesAccessToken` and `mapbox_resourcesBaseUrl`.\n* Update Mapbox styles to latest versions:\n\n| Style             | Before                                       | After                                        |\n|-------------------|----------------------------------------------|----------------------------------------------|\n| MAPBOX_STREETS    | mapbox://styles/mapbox/streets-v11           | mapbox://styles/mapbox/streets-v12           |\n| SATELLITE_STREETS | mapbox://styles/mapbox/satellite-streets-v11 | mapbox://styles/mapbox/satellite-streets-v12 |\n| OUTDOORS          | mapbox://styles/mapbox/outdoors-v11          | mapbox://styles/mapbox/outdoors-v12          |\n| LIGHT             | mapbox://styles/mapbox/light-v10             | mapbox://styles/mapbox/light-v11             |\n| DARK              | mapbox://styles/mapbox/dark-v10              | mapbox://styles/mapbox/dark-v11              |\n\n\n* Remove native interfaces `StyleManagerInterface`, `StyleInterface`, `CameraManagerInterface`, `MapInterface`, `ObservableInterface` and use only `Map` object to access native methods.\n* Make map events typed-safe, events are now have their own subscription methods.\n  Following events are added as typed-safe, `CameraChanged`, `MapIdle`, `MapLoadingError`, `MapLoaded`, `StyleDataLoaded`, `StyleLoaded`, `StyleImageMissing`, `StyleImageRemovedUnunsed`,\n  `RenderFrameStarted`, `RenderFrameFinished`, `SourceAdded`, `SourceDataLoaded`, `SourceRemoved`, `ReourceRequest`.\n  All `subscribe` methods return `Cancelable` object, which users could store and call `cancel` when subscription is no longer needed.\n  `MapboxMap.unsubscribe` methods were removed.\n* Rename `LocationConsumer.onAccuracyRadiusUpdated` to `onHorizontalAccuracyRadiusUpdated`.\n* Deprecate `MapboxMap.loadStyleUri`, `MapboxMap.loadStyleJson` and `MapboxMap.loadStyle` methods and introduce one `MapboxMap.loadStyle` accepting either URI / JSON or Style DSL block.\n* Replace `com.mapbox.maps.plugin.animation.Cancelable` with `com.mapbox.common.Cancelable`.\n* Remove `TileStoreOptions.MAPBOX_ACCESS_TOKEN` used e.g. in `TileStore.setOption(TileStoreOptions.MAPBOX_ACCESS_TOKEN, someDomain, someValue)` as it has become redundant.\n* Introduce `MapboxTracing` object allowing to enable Android traces to measure performance of the SDK. More details and instructions could be found in `Working with traces` section in `DEVELOPING.md`.\n* Remove Mapbox plugin implementations from public API surface.\n* Remove `HttpServiceFactory.getInstance`, `HttpServiceFactory.reset`, `HttpServiceFactory.setUserDefined` methods.\n* Replace `HttpServiceFactory.getInstance().setInterceptor` with `HttpServiceFactory.setHttpServiceInterceptor`.\n* Argument `dataId` of the `GeoJson.feature`, `GeoJson.featureCollection`, `GeoJson.geometry`, `GeoJson.url`, `GeoJson.data` became non-nullable.\n* Remove `Style.getStyleSourcesAttribution`. `MapboxMap.getAttributions` should be used instead.\n* (Kotlin only) Remove `Style.getStyleSources()` / `Style.getStyleLayers()`. Properties `Style.styleSources` / `Style.styleLayers` should be used instead.\n* Replace style related enum classes with regular classes.\n* Migrate from `android.app.AlertDialog` to `androidx.appcompat.app.AlertDialog` for attribution plugin.\n* Rename `MapboxMap.subscribeStyleImageUnused` to `MapboxMap.subscribeStyleImageRemoveUnused`.\n* The `MapCameraPlugin`'s `onCameraMove` method now uses `Point` for camera center and `EdgeInsets` for padding.\n* Remove `MapInitOptions.optimizeForTerrain` as whenever terrain is present layer order is automatically adjusted for better performance.\n* Replace `MapboxMap` and `MapCameraManagerDelegate` APIs `dragStart`, `dragEnd`, `getDragCameraOptions` with `cameraForDrag`, `setCenterAltitudeMode`.\n* Remove setter functions for `Style.styleURI` and `Style.styleJSON` as loading the style should happen only with `MapboxMap.loadStyle`.\n* Rename `StyleImageMissing.getStyleImageMissingEventData` to `StyleImageMissing.toStyleImageMissingEventData`.\n* Rename `MapCameraManagerDelegate` properties for methods `cameraForCoordinateBounds`, `cameraForCoordinates` and `cameraForGeometry` to align them with `MapboxMap` methods.\n* Consolidate `FetchTileFunctionCallback` and `CancelTileFunctionCallback` by single type `TileFunctionCallback`.\n* Make `Image` parameter nullable in `setStyleCustomRasterSourceTileData()` method.\n* Extension function `Style.getProjection()` return type changed from `Projection` to `Projection?`.\n* Extension function `LocationComponentPlugin.createDefault2DPuck` in `LocationComponentUtils.kt` is now stand-alone `createDefault2DPuck`.\n* Extension function `LocationComponentPlugin.createDefault2DPuck` in `LocationComponentUtils` is now stand-alone `createDefault2DPuck`.\n* Function `createDefault2DPuck` does not require a `context` parameter.\n* Increase minimum location puck bearing threshold needed to trigger an animation to 1 degree (previously 0.01 degrees) to reduce the CPU usage.\n* Location component puck bearing enabled property (`MapView.location.puckBearingEanbled`) has been changed to `false` by default.\n* `ViewAnnotationManager.getViewAnnotationByFeatureId` is renamed to `ViewAnnotationManager.getViewAnnotation`,\n* `ViewAnnotationManager.getViewAnnotationByFeatureId` is renamed to `ViewAnnotationManager.getViewAnnotation`.\n* `ViewAnnotationManager.getViewAnnotationOptionsByView` is renamed to `ViewAnnotationManager.getViewAnnotationOptions`.\n* `ViewAnnotationManager.getViewAnnotationOptionsByFeatureId` is renamed to `ViewAnnotationManager.getViewAnnotationOptions`.\n* `ViewAnnotationAnchorConfig` fields `offsetX`/`offsetY` are now of type Double instead of Int.\n* `ViewAnnotationOptions` accepts list of anchors `variableAnchors` instead of `anchor`/`offsetX`/`offsetY`.\n* `ViewAnnotationOptions` fields `width`/`height` are now of type Double instead of Int.\n* `OnViewAnnotationUpdatedListener.onViewAnnotationPositionUpdated` arguments `width`/`height` are now of type Double instead of Int.\n* Add `getName` method to `DeviceLocationProvider` interface.\n* Add boolean parameter `allowUserDefined` to `getDeviceLocationProvider` method in `LocationService` interface.\n* Add `LocationService.getDeviceLocationProvider` method that accepts `ExtendedLocationProviderParameters` to `LocationService` interface.\n\n## Features ✨ and improvements 🏁\n* Introduce new Mapbox 3D style `Style.STANDARD` and make it default.\n* Add dynamic view annotations that can be attached to complex feature geometries and reposition itself based on the current camera viewport. To create dynamic view annotation use `AnnotatedFeature` of type `ANNOTATED_LAYER_FEATURE`. Multiple dynamic view annotations can be attached to the same feature. Also additional options `ViewAnnotationOptions.allowOverlapWithPuck` and `ViewAnnotationOptions.ignoreCameraPadding` introduced to configure the dynamic view annotation's behaviour.\n* The Map Overlay plugin and related APIs have been promoted to stable.\n* From v11.0.0-rc.1, Mapbox Compose Extension for Android is released as a separate module following the same release cadence with the main SDK, please refer to [this guide](extension-compose/README.md) to get started with Jetpack Compose, and [v0.1.0 changelog](extension-compose/CHANGELOG-v0.1.0.md) for previous changelogs.\n* Avoid creating unnecessary objects during animation under some conditions.\n* Improve map camera and gestures when terrain is used to fix camera bumpiness and map flickering.\n* Use a fallback glyph URL if a style does not define one. This enables the addition of Symbol layers to an empty style or to the style that doesn't use Symbol layers.\n* Use ETC2 compression for raster tiles to support transparency.\n* Introduce experimental `MapboxMapRecorder` allowing to record and replay custom scenarios.\n* Add Mapbox Privacy Policy to attribution links.\n* Add clustering support for `CircleAnnotationManager`.\n* Improve ergonomics of `Snapshotter.start` method to align with iOS and allow to re-use `Canvas` for user drawing.\n* Add `MapboxMap.coordinateBoundsForRect` returning `CoordinateBounds` for given `RectF` of screen coordinates.\n* Add optional `maxZoom` and `offset` parameters to `MapboxMap.cameraForCoordinateBounds`.\n* Mark `GeoJsonSource.url` / `GeoJsonSource.Builder.url` methods as deprecated, `GeoJsonSource.data` / `GeoJsonSource.Builder.data` should be used instead.\n* Refactor style Light APIs: introduce `AmbientLight`, `DirectionalLight`, `FlatLight` and methods to set them to style.\n* Expose new APIs to import and configure styles: `getStyleImports`, `removeStyleImport`, `getStyleImportSchema`, `getStyleImportConfigProperties`, `setStyleImportConfigProperties`, `getStyleImportConfigProperty`, `setStyleImportConfigProperty`\n* Expose `slot` property for all `Layer`s to link layers from imported styles.\n* Add expression support for visibility layer property.\n* Add the `MapboxMap.resetFeatureState` method.\n* Make padding optional for `MapboxMap.cameraForCoordinateBounds`, `MapboxMap.cameraForCoordinates`, `MapboxMap.cameraForGeometry` methods.\n* Add `FreeCameraOptions.getLocation` and `FreeCameraOptions.getAltitude` methods.\n* Add `MapboxMap.coordinatesForRect(rectF: RectF)` to support rectangle parameters.\n* Add `suspend` variants for the async `MapboxMap` functions : `queryRenderedFeatures`, `querySourceFeatures`, `setFeatureState`, `getFeatureState`, `removeFeatureState`, `getGeoJsonClusterLeaves`, `getGeoJsonClusterChildren`, `getGeoJsonClusterExpansionZoom`.\n* Add `MapboxMap.mapLoadedEvents`, `MapboxMap.mapLoadingErrorEvents`, `MapboxMap.styleLoadedEvents`, `MapboxMap.styleDataLoadedEvents`, `MapboxMap.cameraChangedEvents`, `MapboxMap.mapIdleEvents`, `MapboxMap.sourceAddedEvents`, `MapboxMap.sourceRemovedEvents`, `MapboxMap.sourceDataLoadedEvents`, `MapboxMap.styleImageMissingEvents`, `MapboxMap.styleImageRemoveUnusedEvents`, `MapboxMap.renderFrameStartedEvents`, `MapboxMap.renderFrameFinishedEvents`, `MapboxMap.resourceRequestEvents` returning Flow of events.\n* Introduce custom lint rules to check illegal usage of literals in Expression DSL and suggest auto fix.\n* Introduce custom lint rules to check illegal number of arguments within given Expression DSL.\n* Introduce custom lint rules to check unused layer/source/light/terrain/atmosphere/projection objects in the Style DSL, and suggest auto fix to add it to the style using unaryPlus(+) operator.\n* Improve performance for `Snapshotter` when obtaining the bitmap.\n* Add `ImageSource.updateImage(Bitmap)` method.\n* Introduce Expression overload functions `linearInterpolator`, `exponentialInterpolator`, `cubicBezierInterpolator`, `step`, `match` and `switchCase` to construct these expressions with strongly typed parameters.\n* Introduce `ImageExtensionImpl.Builder(imageId, image)`, `ImageExtensionImpl.Builder(imageId, image)` constructors and deprecated `ImageExtensionImpl.Builder(imageId)`, `ImageExtensionImpl.Builder.image(image)`, `ImageExtensionImpl.Builder.bitmap(bitmap)`, as image/bitmap is required for `ImageExtensionImpl.Builder`; DSL functions are updated to reflect these changes as well.\n* Deprecate `PointAnnotationManager.iconTextFit` and `PointAnnotationManager.iconTextFitPadding` in favor of `PointAnnotation.iconTextFit` and `PointAnnotation.iconTextFitPadding`.\n* Introduce `LineLayer.lineDepthOcclusionFactor`, `PolylineAnnotationManager.lineDepthOcclusionFactor` API.\n* Introduce experimental `Expression.activeAnchor` API.\n* Introduce experimental `ModelLayer` API to render 3D models on the map.\n* Introduce experimental `MapboxMap.addStyleModel`, `MapboxMap.removeStyleModel`, `MapboxMap.hasStyleModel` APIs.\n* Introduce experimental `LocationPuck3D.modelCastShadows`, `LocationPuck3D.modelReceiveShadows`, `LocationPuck3D.modelScaleMode` APIs. Note: `LocationPuck3D.modelScaleMode` API brings behavioral changes for LocationPuck3d scale and `model-scale` property needs to be adjusted to correctly render the puck.\n* Introduce `Expression.hsl`, `Expression.hsla` color expression.\n* Introduce `Expression.measureLight` lights configuration property.\n* Introduce `LineLayer.lineBorderColor`, `LineLayer.lineBorderWidth` APIs.\n* Introduce `BackgroundLayer.backgroundEmissiveStrength`, `CircleLayer.circleEmissiveStrength`, `FillLayer.fillEmissiveStrength`, `LineLayer.lineEmissiveStrength`, `SymbolLayer.iconImageCrossFade`, `SymbolLayer.iconEmissiveStrength`, `SymbolLayer.textEmissiveStrength` APIs.\n* Introduce Annotation plugin APIs: `CircleAnnotationManager.circleEmissiveStrength`, `PolygonAnnotationManager.fillEmissiveStrength`, `PolylineAnnotationManager.lineDepthOcclusionFactor`, `PolylineAnnotationManager.lineEmissiveStrength`.\n* Introduce experimental `FillExtrusionLayer.fillExtrusionRoundedRoof`, `FillExtrusionLayer.fillExtrusionEdgeRadius`, `FillExtrusionLayer.fillExtrusionAmbientOcclusionWallRadius`, `FillExtrusionLayer.fillExtrusionAmbientOcclusionGroundRadius`, `FillExtrusionLayer.fillExtrusionAmbientOcclusionGroundAttenuation`, `FillExtrusionLayer.fillExtrusionFloodLightColor`, `FillExtrusionLayer.fillExtrusionFloodLightIntensity`, `FillExtrusionLayer.fillExtrusionFloodLightWallRadius`, `FillExtrusionLayer.fillExtrusionFloodLightGroundRadius`, `FillExtrusionLayer.fillExtrusionFloodLightGroundAttenuation`, `FillExtrusionLayer.fillExtrusionVerticalScale` APIs.\n* Introduce GeoJSONSource partial update APIs `GeoJsonSource.addGeoJSONSourceFeatures`, `GeoJsonSource.updateGeoJSONSourceFeatures`, `GeoJsonSource.removeGeoJSONSourceFeatures`.\n* Introduce raster colorization via `raster-color` expression and `RasterLayer.rasterColor`, `RasterLayer.rasterColorMix`, `RasterLayer.rasterColorRange` layer properties.\n* Make both `Style` and `MapboxMap` implement `MapboxStyleManager` exposing all style related methods for the map and providing better alignment with iOS and GL-JS.\n* Add `FillExtrusionLayer.fillExtrusionCutoffFadeRange` and `ModelLayer.modelCutoffFadeRange` to control fade out of the layers when pitch is used.\n* Improve atmosphere rendering performance.\n* Improve fill layer and model layer rendering performance on high pitch views.\n* Improve GPU performance by drawing opaque 3D geometry without blending.\n* Introduce `SymbolLayer.symbolZElevate` property to elevate symbols along with the buildings that are in the same place. The feature is supported for symbols with point placement only.\n* Add `Atmosphere.verticalRange` property.\n* Add `GeoJsonSource.data(..)` overloads to allow Java to call with and without `dataId`.\n* Add a new layer type `CustomLayer` and style DSL to create it. `CustomLayer` allows to use custom OpenGL ES rendering through `CustomLayerHost`. `CustomLayer` contains the `slot` property allowing using it with the Standard style.\n* Improve the caching model for the custom raster source.\n* Optimize custom raster source data update.\n* Increase rendering performance of shadows.\n* Print warning log message for unknown style layer properties instead of causing fatal errors.\n* Optimise memory usage in the `FillExtrusionLayer`.\n* Improve the rendering performance of a `SymbolLayer` that uses `SymbolLayer.symbolSortKey` property.\n* Reduce memory usage in fill-extrusion flood light and ground ambient occlusion.\n* (Kotlin only) Deprecated `MapboxMap.getStyle()` function. Please use property `MapboxMap.style`.\n* (Kotlin only) Deprecated `MapView.getMapboxMap()` function. Please use property `MapView.mapboxMap`.\n* (Kotlin only) Deprecated `MapSurface.getMapboxMap()` function. Please use property `MapSurface.mapboxMap`.\n* Handle zero duration map camera animators more efficiently resulting in performance improvements for gestures / viewport / locationcomponent.\n* Function `DefaultLocationProvider.updatePuckBearing` now accepts null to stop listening for heading/course.\n* Add `keep-legacy-style-pack` style pack load extra option that prevents the style package removal from the legacy storage.\n* Enable rendering of fill extrusion flood lights on the ground with fully transparent fill extrusions.\n* Add `cameraForCoordinates` overload so that the padding for map and geometry can be specified separately.\n* Disable terrain when zoom-dependent exaggeration expression evaluates to zero.\n* Add support for `glb` 3D tiles.\n* Align hill shade illumination direction with 3D lights.\n* [compose] Add experimental `MapEvents` to handle all events emitted by `MapboxMap`.\n* [compose] Expose `PointAnnotationGroup.symbolZElevate` property.\n* [compose] Add `ViewAnnotation.layoutParams` property.\n* Introduce `ExtendedLocationProviderParameters` to specify `DeviceLocationProvider` parameters.\n* Add `coordinatesPadding`, `maxZoom` and `offset` parameters to `OverviewViewportStateOptions` to allow more granular control of `OverviewViewportState`.\n* Add `CircleAnnotationManager.slot`, `PointAnnotationManager.slot`, `PolygonAnnotationManager.slot`, `PolylineAnnotationManager.slot` to place the associated layer of the `AnnotationManager` to the correct position of the map.\n* Introduce experimental APIs to work with Custom Raster Sources: `MapboxStyleManager.addStyleCustomRasterSource`, `MapboxStyleManager.setStyleCustomRasterSourceTileData`, `MapboxStyleManager.invalidateStyleCustomRasterSourceTile`, `MapboxStyleManager.invalidateStyleCustomRasterSourceRegion`.\n* Expose experimental `CustomRasterSource` and non-experimental `CustomGeometrySource` as regular `Source`'s providing a better way to work with them and also allowing using them in Style DSL.\n* Deprecate `CustomGeometrySource.invalidTile` and `CustomGeometrySource.invalidRegion`; `CustomGeometrySource.invalidateTile` and `CustomGeometrySource.invalidateRegion` should be used instead.\n* Add `LocationPuck3D.modelEmissiveStrength` and `LocationPuck3D.modelEmissiveStrengthExpression` properties to LocationComponent plugin to control the strength of the light emission.\n\n## Bug fixes 🐞\n* Fix scale bar receives camera changes after being disabled the first time.\n* Fix camera flying away on pitch gesture after some other animations.\n* Fix map not being rendered when EGL exception happens but Android surface is still valid.\n* Fix terrain rendering for the Terrarium-encoded tiles.\n* Cancel pending style url loading request when loading a new style json.\n* Fixes an issue that causes view annotations to be placed on the sky when high pitch and mercator projection is used.\n* Fix the CustomGeometrySource `fetchTileFunction` and `cancelTileFunction` callbacks being invoked on the wrong thread.\n* Fix a rendering error that broke symbol layers on Samsung S22 devices.\n* Cache featureState for newly added source in case it is not available in renderer.\n* Fix issue with model layer blending with geometry tile source.\n* Fix incorrectly set begin timestamp for the `RenderFrameFinished` event.\n* Hide methods and properties from Java in `MapView`, `MapboxMap` and `Snapshotter` that are not supposed to be public.\n* Fix flood light not working by changing default EGL config to RGBA_8888.\n* Fix a bug where the map would not zoom above a certain threshold on high-pitched views.\n* Fix crashes if 3D layers are used alone on terrain or globe without any other layer types.\n* Fix `LineLayer` leaking if placed behind the satellite layer.\n* Fix line and raster layers interop for draped mode.\n* Fix a crash when consecutive snapshot requests were made.\n* Fix erroneous shadow map sampling of distant landmarks.\n* Fix incorrect level-of-detail model being chosen for trees in some scenarios.\n* Fix the style layer minimum and maximum zoom default values from infinity to actual ones.\n* Fix widgets not showing on some zoom levels.\n* Fix widgets flickering due to race condition if they are animated.\n* Avoid listening for heading/course when location component puck bearing is disabled.\n* Do not overwrite style URL when setting invalid style JSON.\n* Do not store SDK version in TileStore.\n* Fixed an issue where the camera padding is not calculated properly for `OverviewViewportState`.\n* [compose] Fix the bug where wrong pixel ratio could be used in a dual display setup.\n* [compose] Fix a lifecycle handling issue for `MapboxMap` which results in potential memory leak.\n* Fix rendering of large/complex fill extrusion features.\n* Fix a crash because of non-exported runtime-registered broadcasts receivers for apps targeting SDK 34.\n* Fix a StackOverflow crash when `MultiGeometry` is used for `OverviewViewportStateOptions`.\n* Fix flickering and wrong positions in elevated symbols.\n* Update style layer's source should trigger repaint.\n* Fix failure to load a 3D model when it uses a 32-bit index buffer.\n* Fix rendering of the updated content on the map after a feature state change if terrain or globe were enabled.\n* Fix a bug where snapshot is rendered without 3D content.\n\n## Dependencies\n* Update gl-native to v11.0.0 and common to v24.0.0.\n* Update dependencies :\n\n| Dependency                                       | Before       | After        |\n|--------------------------------------------------|--------------|--------------|\n| Android Gradle Plugin                            | 7.0.4        | 7.4.2        |\n| Kotlin                                           | 1.5.31       | 1.7.20       |\n| NDK                                              | 21.4.7075529 | 23.2.8568313 |\n| EGL                                              | 1.0          | 1.4          |\n| org.jetbrains.kotlin:kotlin-stdlib-jdk7          | 1.5.31       |              |\n| org.jetbrains.kotlin:kotlin-stdlib-jdk8          |              | 1.7.20       |\n| Dokka plugin                                     | 1.5.31       | 1.7.20       |\n| androidx.core:core-ktx                           | 1.7.0        | 1.9.0        |\n| androidx.appcompat:appcompat                     | 1.3.0        | 1.6.1        |\n| androidx.test:rules                              | 1.4.0        | 1.5.0        |\n| androidx.test:core                               | 1.4.0        | 1.5.0        |\n| androidx.test:runner                             | 1.4.0        | 1.5.2        |\n| androidx.test:orchestrator                       | 1.4.0        | 1.4.2        |\n| androidx.test:monitor                            | 1.4.0        | 1.6.1        |\n| androidx.test.espresso:espresso-core             | 3.4.0        | 3.5.1        |\n| androidx.test.ext:junit                          | 1.1.3        | 1.1.5        |\n| org.jetbrains.kotlinx:kotlinx-coroutines-core    | 1.3.9        | 1.6.1        |\n| org.jetbrains.kotlinx:kotlinx-coroutines-test    | 1.3.9        | 1.6.1        |\n| io.mockk:mockk                                   | 1.12.3       | 1.13.4       |\n| io.mockk:mockk-agent-api                         | 1.12.3       | 1.13.4       |\n| io.mockk:mockk-agent-jvm                         | 1.12.3       | 1.13.4       |\n| org.robolectric:robolectric                      | 4.8.1        | 4.9.2        |\n| com.android.tools.lint:lint-api                  | 30.0.4       | 30.4.2       |\n| com.android.tools.lint:lint-checks               | 30.0.4       | 30.4.2       |\n| com.android.tools.lint:lint                      | 30.0.4       | 30.4.2       |\n| com.android.tools.lint:lint-tests                | 30.0.4       | 30.4.2       |\n| com.android.tools:testutils                      | 30.0.4       | 30.4.2       |\n| nl.jqno.equalsverifier:equalsverifier            | 3.10.1       | 3.14         |\n| io.gitlab.arturbosch.detekt:detekt-formatting    | 1.20.0       | 1.22.0       |\n| composeOptions -> kotlinCompilerExtensionVersion | 1.1.0-beta03 | 1.4.3        |\n| androidx.compose:compose-bom                     |              | 2023.01.00   |\n| androidx.compose.compiler:compiler               |              | 1.3.2        |\n| com.pinterest:ktlint                             | 0.39.0       | 0.48.2       |\n\n\n# 11.0.0-rc.2 November 17, 2023\n## Breaking changes ⚠️\n* Minimum OpenGL ES version is now 3.0\n\n## Features ✨ and improvements 🏁\n* Promote [Mapbox Standard](https://www.mapbox.com/blog/standard-core-style) style to stable.\n* Introduce `ViewAnnotationOptions.allowOverlapWithPuck` and `ViewAnnotationOptions.ignoreCameraPadding` to configure the dynamic view annotation's behaviour.\n* Avoid placing view annotation on overlapped line geometries, if the current bound layer is below other annotated line layers.\n\n## Bug fixes 🐞\n* [compose] Fix a lifecycle handling issue for `MapboxMap` which results in potential memory leak.\n* Fix a StackOverflow crash when `MultiGeometry` is used for `OverviewViewportStateOptions`.\n* Fix flickering and wrong positions in elevated symbols.\n* Update style layer's source should trigger repaint.\n* Fix failure to load a 3D model when it uses a 32-bit index buffer.\n* Fix rendering of the updated content on the map after a feature state change if terrain or globe were enabled.\n* Fix view annotation disappearing on the upper parts of the screen when terrain is enabled.\n* Trigger view annotation replacement if the associated layer/source gets changed.\n* Fix a bug where snapshot is rendered without 3D content.\n\n## Dependencies\n* Update gl-native to v11.0.0-rc.2 and common to v24.0.0-rc.3.\n\n## Known issues\n* When adding a view annotation with `ViewAnnotationOptions.allowOverlapWithPuck` or `ViewAnnotationOptions.ignoreCameraPadding` set to true, the same option for all the view annotations added previously will be overwritten to true. The fix will land in the next release.\n\n\n# 11.0.0-rc.1 November 03, 2023\n\n## Breaking changes ⚠️\n* Add `LocationService.getDeviceLocationProvider` method that accepts `ExtendedLocationProviderParameters` to `LocationService` interface.\n\n## Features ✨ and improvements 🏁\n* From v11.0.0-rc.1, Mapbox Compose Extension for Android is released as a separate module following the same release cadence with the main SDK, please refer to [this guide](extension-compose/README.md) to get started with Jetpack Compose, and [v0.1.0 changelog](extension-compose/CHANGELOG-v0.1.0.md) for previous changelogs.\n* [compose] Add experimental `MapEvents` to handle all events emitted by `MapboxMap`.\n* [compose] Expose `PointAnnotationGroup.symbolZElevate` property.\n* [compose] Add `ViewAnnotation.layoutParams` property.\n* Introduce `ExtendedLocationProviderParameters` to specify `DeviceLocationProvider` parameters.\n* Add `coordinatesPadding`, `maxZoom` and `offset` parameters to `OverviewViewportStateOptions` to allow more granular control of `OverviewViewportState`.\n* Add `CircleAnnotationManager.slot`, `PointAnnotationManager.slot`, `PolygonAnnotationManager.slot`, `PolylineAnnotationManager.slot` to place the associated layer of the `AnnotationManager` to the correct position of the map.\n* Expose experimental `CustomRasterSource` and non-experimental `CustomGeometrySource` as regular `Source`'s providing a better way to work with them and also allowing using them in Style DSL.\n* Deprecate `CustomGeometrySource.invalidTile` and `CustomGeometrySource.invalidRegion`; `CustomGeometrySource.invalidateTile` and `CustomGeometrySource.invalidateRegion` should be used instead.\n* Add `LocationPuck3D.modelEmissiveStrength` and `LocationPuck3D.modelEmissiveStrengthExpression` properties to LocationComponent plugin to control the strength of the light emission.\n\n## Bug fixes 🐞\n* Fixed an issue where the camera padding is not calculated properly for `OverviewViewportState`.\n* [compose] Fix the bug where wrong pixel ratio could be used in a dual display setup.\n* Fix the line label flickering issue by eliminating the anchor rounding error.\n* Fix rendering of large/complex fill extrusion features.\n* Fix a crash because of non-exported runtime-registered broadcasts receivers for apps targeting SDK 34.\n\n## Dependencies\n* Update gl-native to v11.0.0-rc.1 and common to v24.0.0-rc.2.\n\n\n# 11.0.0-beta.6 October 24, 2023\n## Breaking changes ⚠️\n* Extension function `Style.getProjection()` return type changed from `Projection` to `Projection?`.\n* Extension function `LocationComponentPlugin.createDefault2DPuck` in `LocationComponentUtils.kt` is now stand-alone `createDefault2DPuck`.\n* Extension function `LocationComponentPlugin.createDefault2DPuck` in `LocationComponentUtils` is now stand-alone `createDefault2DPuck`.\n* `createDefault2DPuck` does not require a `context` parameter.\n* Increase minimum location puck bearing threshold needed to trigger an animation to 1 degree (previously 0.01 degrees) to reduce the CPU usage.\n* Location component puck bearing enabled property (`MapView.location.puckBearingEanbled`) has been changed to `false` by default.\n* `ViewAnnotationManager.getViewAnnotationByFeatureId` is renamed to `ViewAnnotationManager.getViewAnnotation`,\n* `ViewAnnotationManager.getViewAnnotationByFeatureId` is renamed to `ViewAnnotationManager.getViewAnnotation`.\n* `ViewAnnotationManager.getViewAnnotationOptionsByView` is renamed to `ViewAnnotationManager.getViewAnnotationOptions`.\n* `ViewAnnotationManager.getViewAnnotationOptionsByFeatureId` is renamed to `ViewAnnotationManager.getViewAnnotationOptions`.\n* `ViewAnnotationAnchorConfig` fields `offsetX`/`offsetY` are now of type Double instead of Int.\n* `ViewAnnotationOptions` accepts list of anchors `variableAnchors` instead of `anchor`/`offsetX`/`offsetY`.\n* `ViewAnnotationOptions` fields `width`/`height` are now of type Double instead of Int.\n* `OnViewAnnotationUpdatedListener.onViewAnnotationPositionUpdated` arguments `width`/`height` are now of type Double instead of Int.\n* Add `getName` method to `DeviceLocationProvider` interface.\n* Add boolean parameter `allowUserDefined` to `getDeviceLocationProvider` method in `LocationService` interface.\n\n## Features ✨ and improvements 🏁\n* Add dynamic view annotations that can be attached to complex feature geometries and reposition itself based on the current camera viewport. To create dynamic view annotation use `AnnotatedFeature` of type `ANNOTATED_LAYER_FEATURE`. Multiple dynamic view annotations can be attached to the same feature.\n* The following APIs have been promoted to stable:\n  - `LineLayer.lineDepthOcclusionFactor`, `LineLayer.lineDepthOcclusionFactorTransition`, `LineLayer.lineEmissiveStrength` and `LineLayer.lineEmissiveStrengthTransition`\n  - `SymbolLayer.iconImageCrossFade`, `SymbolLayer.iconImageCrossFadeTransition`, `SymbolLayer.iconEmissiveStrength`, `SymbolLayer.iconEmissiveStrengthTransition`, `SymbolLayer.textEmissiveStrength` and `SymbolLayer.textEmissiveStrengthTransition`\n  - `BackgroundLayer.backgroundEmissiveStrength` and `BackgroundLayer.backgroundEmissiveStrengthTransition`\n  - `CircleLayer.circleEmissiveStrength` and `CircleLayer.circleEmissiveStrengthTransition`\n  - `FillLayer.fillEmissiveStrength` and `FillLayer.fillEmissiveStrengthTransition`\n  - `FlatLight`, `AmbientLight`, `DirectionalLight` and related APIs\n  - `slot` for all the layers\n  - Style Import APIs: `getStyleImports`, `removeStyleImport`, `getStyleImportSchema`, `getStyleImportConfigProperties`, `getStyleImportConfigProperty`, `setStyleImportConfigProperties`, `setStyleImportConfigProperty`\n  - Annotation plugin APIs: `CircleAnnotationManager.circleEmissiveStrength`, `PolygonAnnotationManager.fillEmissiveStrength`, `PolylineAnnotationManager.lineDepthOcclusionFactor`, `PolylineAnnotationManager.lineEmissiveStrength`\n  - Map Overlay plugin and related APIs\n* (Kotlin only) Deprecated `MapboxMap.getStyle()` function. Please use property `MapboxMap.style`.\n* (Kotlin only) Deprecated `MapView.getMapboxMap()` function. Please use property `MapView.mapboxMap`.\n* (Kotlin only) Deprecated `MapSurface.getMapboxMap()` function. Please use property `MapSurface.mapboxMap`.\n* Handle zero duration map camera animators more efficiently resulting in performance improvements for gestures / viewport / locationcomponent.\n* `DefaultLocationProvider.updatePuckBearing` now accepts null to stop listening for heading/course.\n* Add `keep-legacy-style-pack` style pack load extra option that prevents the style package removal from the legacy storage.\n* Enable rendering of fill extrusion flood lights on the ground with fully transparent fill extrusions.\n* Add `cameraForCoordinates` overload so that the padding for map and geometry can be specified separately.\n* Disable terrain when zoom-dependent exaggeration expression evaluates to zero.\n* Add support for `glb` 3D tiles.\n* Align hillshade illumination direction with 3D lights.\n\n## Bug fixes 🐞\n* Fix widgets not showing on some zoom levels.\n* Fix widgets flickering due to race condition if they are animated.\n* Fix crash when setting `mapbox:mapbox_locationComponentLocationPuck = \"location_puck_2_d\"` in map view XML without specifying all images.\n* Fix changing location bearing from `HEADING` to `COURSE` not working.\n* Avoid listening for heading/course when location component puck bearing is disabled.\n* Fix the crash clicking on attribution when not using the `AppCompat` theme.\n* Do not overwrite style URL when setting invalid style JSON.\n* Do not store SDK version in TileStore.\n\n## Dependencies\n* Update gl-native to v11.0.0-beta.7 and common to v24.0.0-beta.7.\n\n\n\n# 11.0.0-beta.5 October 09, 2023\n## Breaking changes ⚠️\n* Rename `MapCameraManagerDelegate` properties for methods `cameraForCoordinateBounds`, `cameraForCoordinates` and `cameraForGeometry` to align them with `MapboxMap` methods.\n* Consolidate `FetchTileFunctionCallback` and `CancelTileFunctionCallback` by single type `TileFunctionCallback`.\n* Make `Image` parameter nullable in `setStyleCustomRasterSourceTileData()` method.\n\n## Features ✨ and improvements 🏁\n* Add `GeoJsonSource.data(..)` overloads to allow Java to call with and without `dataId`.\n* Add a new layer type `CustomLayer` and style DSL to create it. `CustomLayer` allows to use custom OpenGL ES rendering through `CustomLayerHost`. `CustomLayer` contains the `slot` property allowing using it with the Standard style.\n* Improve the caching model for the custom raster source.\n* Optimize custom raster source data update.\n* Increase rendering performance of shadows.\n* Print warning log message for unknown style layer properties instead of causing fatal errors.\n* Optimise memory usage in the `FillExtrusionLayer`.\n* Improve the rendering performance of a `SymbolLayer` that uses `SymbolLayer.symbolSortKey` property.\n* Reduce memory usage in fill-extrusion flood light and ground ambient occlusion.\n\n## Bug fixes 🐞\n* Hide methods and properties from Java in `MapView`, `MapboxMap` and `Snapshotter` that are not supposed to be public.\n* Fix `Style` docs for methods `setStyleImportConfigProperties`, `setStyleImportConfigProperty`, `removeGeoJSONSourceFeatures`.\n* Fix flood light not working by changing default EGL config to RGBA_8888.\n* Fix a bug where the map would not zoom above a certain threshold on high-pitched views.\n* Fix crashes if 3D layers are used alone on terrain or globe without any other layer types.\n* Fix `LineLayer` leaking if placed behind the satellite layer.\n* Fix line and raster layers interop for draped mode.\n* Fix a crash when consecutive snapshot requests were made.\n* Fix erroneous shadow map sampling of distant landmarks.\n* Fix incorrect level-of-detail model being chosen for trees in some scenarios.\n* Fix the style layer minimum and maximum zoom default values from infinity to actual ones.\n\n## Dependencies\n* Update gl-native to v11.0.0-beta.6 and common to v24.0.0-beta.6.\n\n\n# 11.0.0-beta.4 September 21, 2023\n## Breaking changes ⚠️\n* Remove setter functions for `Style.styleURI` and `Style.styleJSON` as loading the style should happen only with `MapboxMap.loadStyle`.\n* Rename `StyleImageMissing.getStyleImageMissingEventData` to `StyleImageMissing.toStyleImageMissingEventData`.\n\n## Features ✨ and improvements 🏁\n* Introduce experimental APIs to work with Custom Raster Sources: `MapboxMap.addCustomRasterSource`, `MapboxMap.setCustomRasterSourceTileData`, `MapboxMap.invalidateCustomRasterSourceTile`, `MapboxMap.invalidateCustomRasterSourceRegion`.\n* Copy relevant `Style` methods to `MapboxMap` providing better alignment with iOS and GL-JS.\n* Add `FillExtrusionLayer.fillExtrusionCutoffFadeRange` and `ModelLayer.modelCutoffFadeRange` to control fade out of the layers when pitch is used.\n* Improve atmosphere rendering performance.\n* Improve fill layer and model layer rendering performance on high pitch views.\n* Improve GPU performance by drawing opaque 3D geometry without blending.\n* Introduce experimental `SymbolLayer.symbolZElevate` property to elevate symbols along with the buildings that are in the same place. The feature is supported for symbols with point placement only.\n* Add `Atmosphere.verticalRange` property.\n\n## Bug fixes 🐞\n* Free resources immediately after map event subscription is canceled.\n* Fix map event listeners not being removed when `MapboxMap.remove*Listener` is called.\n* Fix issue where the terrain didn't work if defined within a style fragment.\n* The Custom Geometry Source `fetchTileFunction` and `cancelTileFunction` callbacks are invoked on the client thread.\n* Fixes a rendering error that broke symbol layers on Samsung S22 devices.\n* Cache featureState for newly added source in case it is not available in renderer.\n* Fix issue with model layer blending with geometry tile source.\n* Fix incorrectly set begin timestamp for the RenderFrameFinished event.\n\n## Dependencies\n* Update gl-native to v11.0.0-beta.5 and common to v24.0.0-beta.5.\n\n\n\n# 11.0.0-beta.3 September 08, 2023\n## Breaking changes ⚠️\n* The `MapCameraPlugin`'s `onCameraMove` method now uses `Point` for camera center and `EdgeInsets` for padding.\n* Remove `MapInitOptions.optimizeForTerrain` as whenever terrain is present layer order is automatically adjusted for better performance.\n* Replace `MapboxMap` and `MapCameraManagerDelegate` APIs `dragStart`, `dragEnd`, `getDragCameraOptions` with `cameraForDrag`, `setCenterAltitudeMode`.\n\n## Features ✨ and improvements 🏁\n* Avoid creating unnecessary objects during animation under some conditions.\n* Improve map camera and gestures when terrain is used to fix camera bumpiness and map flickering.\n* Use a fallback glyph URL if a style does not define one. This enables the addition of Symbol layers to an empty style or to the style that doesn't use Symbol layers.\n* Use ETC2 compression for raster tiles to support transparency.\n\n## Bug fixes 🐞\n* Fix scale bar receives camera changes after being disabled the first time.\n* Fix camera flying away on pitch gesture after some other animations.\n* Fix map not being rendered when EGL exception happens but Android surface is still valid.\n* Fix fallback rules for the style's transition property. The change fixes style transitions when style imports are modified for the Standard style.\n* Fix terrain rendering for the Terrarium-encoded tiles.\n* Cancel pending style url loading request when loading a new style json.\n* Fixes an issue that causes view annotations to be placed on the sky when high pitch and mercator projection is used.\n\n## Dependencies\n* Update gl-native to v11.0.0-beta.4 and common to v24.0.0-beta.4.\n\n\n# 11.0.0-beta.2 August 24, 2023\n## Breaking changes ⚠️\n* Replace style related enum classes with regular classes.\n* Migrate from `android.app.AlertDialog` to `androidx.appcompat.app.AlertDialog` for attribution plugin.\n* Rename `MapboxMap.subscribeStyleImageUnused` to `MapboxMap.subscribeStyleImageRemoveUnused`.\n\n## Features ✨ and improvements 🏁\n* Introduce experimental `MapboxMapRecorder` allowing to record and replay custom scenarios.\n* New compose example `MulitDisplayActiviy` ported from XML test app.\n* Add Mapbox Privacy Policy to attribution links.\n\n## Bug fixes 🐞\n* Fix the bug when anchor was not reset after gestures leading to an unexpected map camera animation result with incorrect `CameraState.center`.\n* Fix a rounding error when point lies at the edge of the screen by using `rountToInt` for limiting `MapboxMap.pixelsForCoordinates` to the bounds of MapView.\n* Fix the bug when `MapboxMap.getStyle` returned NULL if `MapboxMap.subscribeStyleLoaded` called before `MapboxMap.loadStyle`.\n* Fix NPE when animating edge insets types (e.g. map padding).\n* Reduce segment overlap in flood lighting to improve rendering performance.\n* Enable offline support for the Standard style.\n* Add wireframe rendering debug feature `MapDebugOptions.LAYERS3_DWIREFRAME` and `MapDebugOptions.LAYERS2_DWIREFRAME`.\n\n## Dependencies\nUpdate dependencies:\n\n| Dependency | Before        | After         |\n|------------|---------------|---------------|\n| NDK        | 21.4.7075529  | 23.2.8568313  |\n| gl-native  | 11.0.0-beta.2 | 11.0.0-beta.3 |\n| common     | 24.0.0-beta.2 | 24.0.0-beta.3 |\n\n\n# 11.0.0-beta.1 August 2, 2023\n## Breaking changes ⚠️\n* Remove deprecated `GeoJsonSource` public constructor, builder should be used instead.\n* Remove deprecated `MapboxMap.queryRenderedFeatures` methods.\n* Remove `Snapshotter.setTileMode`, `Snapshotter.isInTileMode` methods.\n* Remove deprecated `MapStyleStateDelegate` and `isFullyLoaded` method.\n* Remove experimental `setRenderCacheOptions`, `getRenderCacheOptions` apis.\n* Update SDK's `targetSdkVersion` and `compileSdkVersion` to 33.\n* Add `callback` argument to the `MapboxMap` methods `getFeatureState`, `setFeatureState`, `removeFeatureState`.\n* Use different callback types for the `MapboxMap.queryRenderedFeatures` and the `MapboxMap.querySourceFeatures` methods.\n* Return `cancelable` from the `MapboxMap` methods : `getFeatureState`, `setFeatureState`, `removeFeatureState`, `querySourceFeatures`, `getGeoJsonClusterLeaves`, `getGeoJsonClusterChildren`, `getGeoJsonClusterExpansionZoom`.\n* Remove the deprecated `MapboxMap.queryFeatureExtensions` method.\n* Remove `MapAnimationOptions.animatorListener` property. In order to subscribe to animations, provide `Animator.animatorListener` with `flyTo`, `easeTo`, `pitchBy`, `scaleBy`, `moveBy`, `rotateBy` apis.\n* Replace `LocationEngine` use with `LocationService` in `DefaultProvider`.\n* Add new `LocationConsumer.onError` method to allow consumers handle location errors.\n* Remove `MapView#location2` related interfaces and move `showAccuracyRing`, `accuracyRingColor`, `accuracyRingBorderColor`, `puckBearingEnabled` and `puckBearingSource` to `MapView#location`.\n* Make `AttributionSettings`, `CompassSettings`, `GesturesSettings`, `LocationComponentSettings`, `LogoSettings`, `ScaleBarSettings` not Kotlin `data class`, better binary compatible and implementing `Parcelable`.\n* Change `CompassSettings#image`, `LocationPuck2D#topImage`, `LocationPuck2D#bearingImage`, `LocationPuck2D#shadowImage` to `ImageHolder` allowing to pass either drawable id or `Bitmap`.\n* Remove deprecated `backgroundPatternTransition`, `lineDasharrayTransition`, `linePatternTransition`, `fillPatternTransition` properties.\n* Replace `MapSnapshotInterface` interface with `MapSnapshotResult` abstract class and remove `image()` method, `bitmap()` should be used instead.\n* Change `Annotation.id` from monotonically increasing `Long` to UUID represented as `String`.\n* Remove `Annotation.featureIdentifier` used to connect with View Annotations, now `Annotation.id` should be used instead.\n* Rename `PuckBearingSource` to `PuckBearing` in location component plugin.\n* Remove deprecated overloaded `Style.setStyleGeoJSONSourceData(sourceId: String, data: GeoJSONSourceData)` method.\n* Rename `MapboxMap.setMemoryBudget` to `MapboxMap.setTileCacheBudget` and make it non-experimental.\n* Update Mapbox styles to latest versions.\n* Remove `ResourceOptions` and `ResourceOptionsManager`. Introduce `MapboxOptions` and `MapboxMapsOptions` to handle application-level access token and other generic options.\n* Removed XML attributes `mapbox_resourcesAccessToken` and `mapbox_resourcesBaseUrl`.\n\n| Style             | Before                                       | After                                        |\n|-------------------|----------------------------------------------|----------------------------------------------|\n| MAPBOX_STREETS    | mapbox://styles/mapbox/streets-v11           | mapbox://styles/mapbox/streets-v12           |\n| SATELLITE_STREETS | mapbox://styles/mapbox/satellite-streets-v11 | mapbox://styles/mapbox/satellite-streets-v12 |\n| OUTDOORS          | mapbox://styles/mapbox/outdoors-v11          | mapbox://styles/mapbox/outdoors-v12          |\n| LIGHT             | mapbox://styles/mapbox/light-v10             | mapbox://styles/mapbox/light-v11             |\n| DARK              | mapbox://styles/mapbox/dark-v10              | mapbox://styles/mapbox/dark-v11              |\n\n\n* Remove native interfaces `StyleManagerInterface`, `StyleInterface`, `CameraManagerInterface`, `MapInterface`, `ObservableInterface` and use only `Map` object to access native methods.\n* Make map events typed-safe, events are now have their own subscription methods.\n  Following events are added as typed-safe, `CameraChanged`, `MapIdle`, `MapLoadingError`, `MapLoaded`, `StyleDataLoaded`, `StyleLoaded`, `StyleImageMissing`, `StyleImageRemovedUnunsed`,\n  `RenderFrameStarted`, `RenderFrameFinished`, `SourceAdded`, `SourceDataLoaded`, `SourceRemoved`, `ReourceRequest`.\n  All `subscribe` methods return `Cancelable` object, which users could store and call `cancel` when subscription is no longer needed.\n  `MapboxMap.unsubscribe` methods were removed.\n* Rename `LocationConsumer.onAccuracyRadiusUpdated` to `onHorizontalAccuracyRadiusUpdated`.\n* Deprecate `MapboxMap.loadStyleUri`, `MapboxMap.loadStyleJson` and `MapboxMap.loadStyle` methods and introduce one `MapboxMap.loadStyle` accepting either URI / JSON or Style DSL block.\n* Replace `com.mapbox.maps.plugin.animation.Cancelable` with `com.mapbox.common.Cancelable`.\n* Remove `TileStoreOptions.MAPBOX_ACCESS_TOKEN` used e.g. in `TileStore.setOption(TileStoreOptions.MAPBOX_ACCESS_TOKEN, someDomain, someValue)` as it has become redundant.\n* Introduce `MapboxTracing` object allowing to enable Android traces to measure performance of the SDK. More details and instructions could be found in `Working with traces` section in `DEVELOPING.md`.\n* Remove Mapbox plugin implementations from public API surface.\n* Remove `HttpServiceFactory.getInstance`, `HttpServiceFactory.reset`, `HttpServiceFactory.setUserDefined` methods.\n* Replace `HttpServiceFactory.getInstance().setInterceptor` with `HttpServiceFactory.setHttpServiceInterceptor`.\n* Argument `dataId` of the `GeoJson.feature`, `GeoJson.featureCollection`, `GeoJson.geometry`, `GeoJson.url`, `GeoJson.data` became non-nullable.\n* Remove `Style.getStyleSourcesAttribution`. `MapboxMap.getAttributions` should be used instead.\n\n## Features ✨ and improvements 🏁\n* Add clustering support for CircleAnnotationManager.\n* Update Kotlin version to v1.7.20 and compose compiler version to 1.3.2.\n* Improve ergonomics of `Snapshotter.start` method to align with iOS and allow to re-use `Canvas` for user drawing.\n* Add `MapboxMap.coordinateBoundsForRect` returning `CoordinateBounds` for given `RectF` of screen coordinates.\n* Add optional `maxZoom` and `offset` parameters to `MapboxMap.cameraForCoordinateBounds`.\n* Mark `GeoJsonSource.url` / `GeoJsonSource.Builder.url` methods as deprecated, `GeoJsonSource.data` / `GeoJsonSource.Builder.data` should be used instead.\n* Refactor style Light APIs: introduce `AmbientLight`, `DirectionalLight`, `FlatLight` and methods to set them to style.\n* Expose new APIs to import and configure styles: `getStyleImports`, `removeStyleImport`, `getStyleImportSchema`, `getStyleImportConfigProperties`, `setStyleImportConfigProperties`, `getStyleImportConfigProperty`, `setStyleImportConfigProperty`\n* Expose `slot` property for all `Layer`s to link layers from imported styles.\n* Add expression support for visibility layer property.\n* Add the `MapboxMap.resetFeatureState` method.\n* Make padding optional for `MapboxMap.cameraForCoordinateBounds`, `MapboxMap.cameraForCoordinates`, `MapboxMap.cameraForGeometry` methods.\n* Add `FreeCameraOptions.getLocation` and `FreeCameraOptions.getAltitude` methods.\n* Add `MapboxMap.coordinatesForRect(rectF: RectF)` to support rectangle parameters.\n* Add `suspend` variants for the async `MapboxMap` functions : `queryRenderedFeatures`, `querySourceFeatures`, `setFeatureState`, `getFeatureState`, `removeFeatureState`, `getGeoJsonClusterLeaves`, `getGeoJsonClusterChildren`, `getGeoJsonClusterExpansionZoom`.\n* Add `MapboxMap.mapLoadedEvents`, `MapboxMap.mapLoadingErrorEvents`, `MapboxMap.styleLoadedEvents`, `MapboxMap.styleDataLoadedEvents`, `MapboxMap.cameraChangedEvents`, `MapboxMap.mapIdleEvents`, `MapboxMap.sourceAddedEvents`, `MapboxMap.sourceRemovedEvents`, `MapboxMap.sourceDataLoadedEvents`, `MapboxMap.styleImageMissingEvents`, `MapboxMap.styleImageRemoveUnusedEvents`, `MapboxMap.renderFrameStartedEvents`, `MapboxMap.renderFrameFinishedEvents`, `MapboxMap.resourceRequestEvents` returning Flow of events.\n* Introduce custom lint rules to check illegal usage of literals in Expression DSL and suggest auto fix.\n* Introduce custom lint rules to check illegal number of arguments within given Expression DSL.\n* Introduce custom lint rules to check unused layer/source/light/terrain/atmosphere/projection objects in the Style DSL, and suggest auto fix to add it to the style using unaryPlus(+) operator.\n* Improve performance for `Snapshotter` when obtaining the bitmap.\n* Add `ImageSource.updateImage(Bitmap)` method.\n* Introduce Expression overload functions `linearInterpolator`, `exponentialInterpolator`, `cubicBezierInterpolator`, `step`, `match` and `switchCase` to construct these expressions with strongly typed parameters.\n* Introduce `ImageExtensionImpl.Builder(imageId, image)`, `ImageExtensionImpl.Builder(imageId, image)` constructors and deprecated `ImageExtensionImpl.Builder(imageId)`, `ImageExtensionImpl.Builder.image(image)`, `ImageExtensionImpl.Builder.bitmap(bitmap)`, as image/bitmap is required for `ImageExtensionImpl.Builder`; DSL functions are updated to reflect these changes as well.\n* Deprecate `PointAnnotationManager.iconTextFit` and `PointAnnotationManager.iconTextFitPadding` in favor of `PointAnnotation.iconTextFit` and `PointAnnotation.iconTextFitPadding`.\n* Introduce experimental lights API to enable a uniform 3D lighting across the map. Use `Style.addLights3D` or `Style.setup3DLights` to enable `Ambient` and `Directional` light.\n* Introduce `LineLayer.lineDepthOcclusionFactor`, `PolylineAnnotationManager.lineDepthOcclusionFactor` API.\n* Introduce experimental `Expression.activeAnchor` API.\n* Introduce experimental `ModelLayer` API to render 3D models on the map.\n* Introduce experimental `MapboxMap.addStyleModel`, `MapboxMap.removeStyleModel`, `MapboxMap.hasStyleModel` APIs.\n* Introduce experimental `LocationPuck3D.modelCastShadows`, `LocationPuck3D.modelReceiveShadows`, `LocationPuck3D.modelScaleMode` APIs.\n  Note: `LocationPuck3D.modelScaleMode` API brings behavioral changes for LocationPuck3d scale and `model-scale` property needs to be adjusted to correctly render the puck.\n* Introduce `Expression.hsl`, `Expression.hsla` color expression.\n* Introduce `Expression.measureLight` lights configuration property.\n* Introduce `LineLayer.lineBorderColor`, `LineLayer.lineBorderWidth` APIs.\n* Introduce experimental `BackgroundLayer.backgroundEmissiveStrength`, `CircleLayer.circleEmissiveStrength`, `FillLayer.fillEmissiveStrength`, `LineLayer.lineEmissiveStrength`, `SymbolLayer.iconEmissiveStrength`, `SymbolLayer.textEmissiveStrength` APIs.\n* Introduce experimental `FillExtrusionLayer.fillExtrusionRoundedRoof`, `FillExtrusionLayer.fillExtrusionEdgeRadius`, `FillExtrusionLayer.fillExtrusionAmbientOcclusionWallRadius`, `FillExtrusionLayer.fillExtrusionAmbientOcclusionGroundRadius`, `FillExtrusionLayer.fillExtrusionAmbientOcclusionGroundAttenuation`, `FillExtrusionLayer.fillExtrusionFloodLightColor`, `FillExtrusionLayer.fillExtrusionFloodLightIntensity`, `FillExtrusionLayer.fillExtrusionFloodLightWallRadius`, `FillExtrusionLayer.fillExtrusionFloodLightGroundRadius`, `FillExtrusionLayer.fillExtrusionFloodLightGroundAttenuation`, `FillExtrusionLayer.fillExtrusionVerticalScale` APIs.\n* Introduce new Mapbox 3D style `Style.STANDARD` and make it default.\n* Introduce GeoJSONSource partial update APIs `GeoJsonSource.addGeoJSONSourceFeatures`, `GeoJsonSource.updateGeoJSONSourceFeatures`, `GeoJsonSource.removeGeoJSONSourceFeatures`.\n* Introduce raster colorization via `raster-color` expression and `RasterLayer.rasterColor`, `RasterLayer.rasterColorMix`, `RasterLayer.rasterColorRange` layer properties.\n\n## Dependencies\n* Update gl-native to v11.0.0-beta.2 and common to v24.0.0-beta.2.\n* Instantiate OpenGL ES context 3.0, if available, otherwise fallback to 2.0.\n* Use EGL 1.4 instead of EGL 1.0.\n* Update dependencies :\n\n| Dependency                                       | Before       | After      |\n|--------------------------------------------------|--------------|------------|\n| Android Gradle Plugin                            | 7.0.4        | 7.4.2      |\n| Kotlin                                           | 1.5.31       | 1.7.20     |\n| org.jetbrains.kotlin:kotlin-stdlib-jdk7          | 1.5.31       |            |\n| org.jetbrains.kotlin:kotlin-stdlib-jdk8          |              | 1.7.20     |\n| Dokka plugin                                     | 1.5.31       | 1.7.20     |\n| androidx.core:core-ktx                           | 1.7.0        | 1.9.0      |\n| androidx.appcompat:appcompat                     | 1.3.0        | 1.6.1      |\n| androidx.test:rules                              | 1.4.0        | 1.5.0      |\n| androidx.test:core                               | 1.4.0        | 1.5.0      |\n| androidx.test:runner                             | 1.4.0        | 1.5.2      |\n| androidx.test:orchestrator                       | 1.4.0        | 1.4.2      |\n| androidx.test:monitor                            | 1.4.0        | 1.6.1      |\n| androidx.test.espresso:espresso-core             | 3.4.0        | 3.5.1      |\n| androidx.test.ext:junit                          | 1.1.3        | 1.1.5      |\n| org.jetbrains.kotlinx:kotlinx-coroutines-core    | 1.3.9        | 1.6.1      |\n| org.jetbrains.kotlinx:kotlinx-coroutines-test    | 1.3.9        | 1.6.1      |\n| io.mockk:mockk                                   | 1.12.3       | 1.13.4     |\n| io.mockk:mockk-agent-api                         | 1.12.3       | 1.13.4     |\n| io.mockk:mockk-agent-jvm                         | 1.12.3       | 1.13.4     |\n| org.robolectric:robolectric                      | 4.8.1        | 4.9.2      |\n| com.android.tools.lint:lint-api                  | 30.0.4       | 30.4.2     |\n| com.android.tools.lint:lint-checks               | 30.0.4       | 30.4.2     |\n| com.android.tools.lint:lint                      | 30.0.4       | 30.4.2     |\n| com.android.tools.lint:lint-tests                | 30.0.4       | 30.4.2     |\n| com.android.tools:testutils                      | 30.0.4       | 30.4.2     |\n| nl.jqno.equalsverifier:equalsverifier            | 3.10.1       | 3.14       |\n| io.gitlab.arturbosch.detekt:detekt-formatting    | 1.20.0       | 1.22.0     |\n| composeOptions -> kotlinCompilerExtensionVersion | 1.1.0-beta03 | 1.4.3      |\n| androidx.compose:compose-bom                     |              | 2023.01.00 |\n| androidx.compose.compiler:compiler               |              | 1.3.2      |\n| com.pinterest:ktlint                             | 0.39.0       | 0.48.2     |\n\n# 11.0.0-alpha.2 June 27, 2023\n## Breaking changes ⚠️\n* Remove deprecated `MapboxMap.queryRenderedFeatures` methods.\n* Remove `Snapshotter.setTileMode`, `Snapshotter.isInTileMode` methods.\n* Remove deprecated `MapStyleStateDelegate` and `isFullyLoaded` method.\n* Remove experimental `setRenderCacheOptions`, `getRenderCacheOptions` apis.\n* Update SDK's `targetSdkVersion` and `compileSdkVersion` to 33.\n* Add `callback` argument to the `MapboxMap` methods `getFeatureState`, `setFeatureState`, `removeFeatureState`.\n* Use different callback types for the `MapboxMap.queryRenderedFeatures` and the `MapboxMap.querySourceFeatures` methods.\n* Return `cancelable` from the `MapboxMap` methods : `getFeatureState`, `setFeatureState`, `removeFeatureState`, `querySourceFeatures`, `getGeoJsonClusterLeaves`, `getGeoJsonClusterChildren`, `getGeoJsonClusterExpansionZoom`.\n* Remove the deprecated `MapboxMap.queryFeatureExtensions` method.\n* Remove `MapAnimationOptions.animatorListener` property. In order to subscribe to animations, provide `Animator.animatorListener` with `flyTo`, `easeTo`, `pitchBy`, `scaleBy`, `moveBy`, `rotateBy` apis.\n* Replace `LocationEngine` use with `LocationService` in `DefaultProvider`.\n* Add new `LocationConsumer.onError` method to allow consumers handle location errors.\n* Remove `MapView#location2` related interfaces and move `showAccuracyRing`, `accuracyRingColor`, `accuracyRingBorderColor`, `puckBearingEnabled` and `puckBearingSource` to `MapView#location`.\n* Make `AttributionSettings`, `CompassSettings`, `GesturesSettings`, `LocationComponentSettings`, `LogoSettings`, `ScaleBarSettings` not Kotlin `data class`, better binary compatible and implementing `Parcelable`.\n* Change `CompassSettings#image`, `LocationPuck2D#topImage`, `LocationPuck2D#bearingImage`, `LocationPuck2D#shadowImage` to `ImageHolder` allowing to pass either drawable id or `Bitmap`.\n* Remove deprecated `backgroundPatternTransition`, `lineDasharrayTransition`, `linePatternTransition`, `fillPatternTransition` properties.\n* Replace `MapSnapshotInterface` interface with `MapSnapshotResult` abstract class and remove `image()` method, `bitmap()` should be used instead.\n* Change `Annotation.id` from monotonically increasing `Long` to UUID represented as `String`.\n* Remove `Annotation.featureIdentifier` used to connect with View Annotations, now `Annotation.id` should be used instead.\n* Rename `PuckBearingSource` to `PuckBearing` in location component plugin.\n* Remove deprecated overloaded `Style.setStyleGeoJSONSourceData(sourceId: String, data: GeoJSONSourceData)` method.\n* Rename `MapboxMap.setMemoryBudget` to `MapboxMap.setTileCacheBudget` and make it non-experimental.\n* Update Mapbox styles to latest versions.\n* Remove `ResourceOptions` and `ResourceOptionsManager`. Introduce `MapboxOptions` and `MapboxMapsOptions` to handle application-level access token and other generic options.\n* Removed XML attributes `mapbox_resourcesAccessToken` and `mapbox_resourcesBaseUrl`.\n\n| Style             | Before                                       | After                                        |\n|-------------------|----------------------------------------------|----------------------------------------------|\n| MAPBOX_STREETS    | mapbox://styles/mapbox/streets-v11           | mapbox://styles/mapbox/streets-v12           |\n| SATELLITE_STREETS | mapbox://styles/mapbox/satellite-streets-v11 | mapbox://styles/mapbox/satellite-streets-v12 |\n| OUTDOORS          | mapbox://styles/mapbox/outdoors-v11          | mapbox://styles/mapbox/outdoors-v12          |\n| LIGHT             | mapbox://styles/mapbox/light-v10             | mapbox://styles/mapbox/light-v11             |\n| DARK              | mapbox://styles/mapbox/dark-v10              | mapbox://styles/mapbox/dark-v11              |\n\n\n* Remove native interfaces `StyleManagerInterface`, `StyleInterface`, `CameraManagerInterface`, `MapInterface`, `ObservableInterface` and use only `Map` object to access native methods.\n* Make map events typed-safe, events are now have their own subscription methods.\n  Following events are added as typed-safe, `CameraChanged`, `MapIdle`, `MapLoadingError`, `MapLoaded`, `StyleDataLoaded`, `StyleLoaded`, `StyleImageMissing`, `StyleImageRemovedUnunsed`,\n  `RenderFrameStarted`, `RenderFrameFinished`, `SourceAdded`, `SourceDataLoaded`, `SourceRemoved`, `ReourceRequest`.\n  All `subscribe` methods return `Cancelable` object, which users could store and call `cancel` when subscription is no longer needed.\n  `MapboxMap.unsubscribe` methods were removed.\n* Rename `LocationConsumer.onAccuracyRadiusUpdated` to `onHorizontalAccuracyRadiusUpdated`.\n* Deprecate `MapboxMap.loadStyleUri`, `MapboxMap.loadStyleJson` and `MapboxMap.loadStyle` methods and introduce one `MapboxMap.loadStyle` accepting either URI / JSON or Style DSL block.\n* Replace `com.mapbox.maps.plugin.animation.Cancelable` with `com.mapbox.common.Cancelable`.\n* Remove `TileStoreOptions.MAPBOX_ACCESS_TOKEN` used e.g. in `TileStore.setOption(TileStoreOptions.MAPBOX_ACCESS_TOKEN, someDomain, someValue)` as it has become redundant.\n* Introduce `MapboxTracing` object allowing to enable Android traces to measure performance of the SDK. More details and instructions could be found in `Working with traces` section in `DEVELOPING.md`.\n* Remove Mapbox plugin implementations from public API surface.\n* Remove `HttpServiceFactory.getInstance`, `HttpServiceFactory.reset`, `HttpServiceFactory.setUserDefined` methods.\n* Replace `HttpServiceFactory.getInstance().setInterceptor` with `HttpServiceFactory.setHttpServiceInterceptor`.\n* Argument `dataId` of the `GeoJson.feature`, `GeoJson.featureCollection`, `GeoJson.geometry`, `GeoJson.url`, `GeoJson.data` became non-nullable.\n\n## Features ✨ and improvements 🏁\n* Add the `MapboxMap.resetFeatureState` method.\n* Make padding optional for `MapboxMap.cameraForCoordinateBounds`, `MapboxMap.cameraForCoordinates`, `MapboxMap.cameraForGeometry` methods.\n* Add `FreeCameraOptions.getLocation` and `FreeCameraOptions.getAltitude` methods.\n* Add `MapboxMap.coordinatesForRect(rectF: RectF)` to support rectangle parameters.\n* Add `suspend` variants for the async `MapboxMap` functions : `queryRenderedFeatures`, `querySourceFeatures`, `setFeatureState`, `getFeatureState`, `removeFeatureState`, `getGeoJsonClusterLeaves`, `getGeoJsonClusterChildren`, `getGeoJsonClusterExpansionZoom`.\n* Add `MapboxMap.mapLoadedEvents`, `MapboxMap.mapLoadingErrorEvents`, `MapboxMap.styleLoadedEvents`, `MapboxMap.styleDataLoadedEvents`, `MapboxMap.cameraChangedEvents`, `MapboxMap.mapIdleEvents`, `MapboxMap.sourceAddedEvents`, `MapboxMap.sourceRemovedEvents`, `MapboxMap.sourceDataLoadedEvents`, `MapboxMap.styleImageMissingEvents`, `MapboxMap.styleImageRemoveUnusedEvents`, `MapboxMap.renderFrameStartedEvents`, `MapboxMap.renderFrameFinishedEvents`, `MapboxMap.resourceRequestEvents` returning Flow of events.\n* Introduce custom lint rules to check illegal usage of literals in Expression DSL and suggest auto fix.\n* Introduce custom lint rules to check illegal number of arguments within given Expression DSL.\n* Introduce custom lint rules to check unused layer/source/light/terrain/atmosphere/projection objects in the Style DSL, and suggest auto fix to add it to the style using unaryPlus(+) operator.\n* Improve performance for `Snapshotter` when obtaining the bitmap.\n* Add `ImageSource.updateImage(Bitmap)` method.\n* Introduce Expression overload functions `linearInterpolator`, `exponentialInterpolator`, `cubicBezierInterpolator`, `step`, `match` and `switchCase` to construct these expressions with strongly typed parameters.\n* Introduce `ImageExtensionImpl.Builder(imageId, image)`, `ImageExtensionImpl.Builder(imageId, image)` constructors and deprecated `ImageExtensionImpl.Builder(imageId)`, `ImageExtensionImpl.Builder.image(image)`, `ImageExtensionImpl.Builder.bitmap(bitmap)`, as image/bitmap is required for `ImageExtensionImpl.Builder`; DSL functions are updated to reflect these changes as well.\n* Deprecate `PointAnnotationManager.iconTextFit` and `PointAnnotationManager.iconTextFitPadding` in favor of `PointAnnotation.iconTextFit` and `PointAnnotation.iconTextFitPadding`.\n* Introduce experimental lights API to enable a uniform 3D lighting across the map. Use `Style.addLights3D` or `Style.setup3DLights` to enable `Ambient` and `Directional` light.\n* Introduce `LineLayer.lineDepthOcclusionFactor`, `PolylineAnnotationManager.lineDepthOcclusionFactor` API.\n* Introduce experimental `Expression.activeAnchor` API.\n* Introduce experimental `ModelLayer` API to render 3D models on the map.\n* Introduce experimental `MapboxMap.addStyleModel`, `MapboxMap.removeStyleModel`, `MapboxMap.hasStyleModel` APIs.\n* Introduce experimental `LocationPuck3D.modelCastShadows`, `LocationPuck3D.modelReceiveShadows`, `LocationPuck3D.modelScaleMode` APIs.\n  Note: `LocationPuck3D.modelScaleMode` API brings behavioral changes for LocationPuck3d scale and `model-scale` property needs to be adjusted to correctly render the puck.\n* Introduce `Expression.hsl`, `Expression.hsla` color expression.\n* Introduce `Expression.measureLight` lights configuration property.\n* Introduce `LineLayer.lineBorderColor`, `LineLayer.lineBorderWidth` APIs.\n* Introduce experimental `BackgroundLayer.backgroundEmissiveStrength`, `CircleLayer.circleEmissiveStrength`, `FillLayer.fillEmissiveStrength`, `LineLayer.lineEmissiveStrength`, `SymbolLayer.iconEmissiveStrength`, `SymbolLayer.textEmissiveStrength` APIs.\n* Introduce experimental `FillExtrusionLayer.fillExtrusionRoundedRoof`, `FillExtrusionLayer.fillExtrusionEdgeRadius`, `FillExtrusionLayer.fillExtrusionAmbientOcclusionWallRadius`, `FillExtrusionLayer.fillExtrusionAmbientOcclusionGroundRadius`, `FillExtrusionLayer.fillExtrusionAmbientOcclusionGroundAttenuation`, `FillExtrusionLayer.fillExtrusionFloodLightColor`, `FillExtrusionLayer.fillExtrusionFloodLightIntensity`, `FillExtrusionLayer.fillExtrusionFloodLightWallRadius`, `FillExtrusionLayer.fillExtrusionFloodLightGroundRadius`, `FillExtrusionLayer.fillExtrusionFloodLightGroundAttenuation`, `FillExtrusionLayer.fillExtrusionVerticalScale` APIs.\n* Introduce new Mapbox 3D style `Style.STANDARD` and make it default.\n* Introduce GeoJSONSource partial update APIs `GeoJsonSource.addGeoJSONSourceFeatures`, `GeoJsonSource.updateGeoJSONSourceFeatures`, `GeoJsonSource.removeGeoJSONSourceFeatures`.\n\n## Bug fixes 🐞\n* Fix 3d location layer properties `model-scale-transition` and `model-rotation-transition`, made them non-transitionable.\n* Fix crash when running animations (e.g. gestures) on Android 14 beta.\n* Fix view port not following puck if viewport `bearing` option was set to `null` even though new locations were available.\n\n## Dependencies\n* Update gl-native to v11.0.0-SNAPSHOT.0608T0508Z.a85336d and common to v24.0.0-SNAPSHOT.0616T0900Z.e0319e0.\n* Instantiate OpenGL ES context 3.0, if available, otherwise fallback to 2.0.\n* Use EGL 1.4 instead of EGL 1.0.\n* Update dependencies :\n\n| Dependency                                       | Before       | After      |\n|--------------------------------------------------|--------------|------------|\n| Android Gradle Plugin                            | 7.0.4        | 7.4.2      |\n| Kotlin                                           | 1.5.31       | 1.7.20     |\n| org.jetbrains.kotlin:kotlin-stdlib-jdk7          | 1.5.31       |            |\n| org.jetbrains.kotlin:kotlin-stdlib-jdk8          |              | 1.7.20     |\n| Dokka plugin                                     | 1.5.31       | 1.7.20     |\n| androidx.core:core-ktx                           | 1.7.0        | 1.9.0      |\n| androidx.appcompat:appcompat                     | 1.3.0        | 1.6.1      |\n| androidx.test:rules                              | 1.4.0        | 1.5.0      |\n| androidx.test:core                               | 1.4.0        | 1.5.0      |\n| androidx.test:runner                             | 1.4.0        | 1.5.2      |\n| androidx.test:orchestrator                       | 1.4.0        | 1.4.2      |\n| androidx.test:monitor                            | 1.4.0        | 1.6.1      |\n| androidx.test.espresso:espresso-core             | 3.4.0        | 3.5.1      |\n| androidx.test.ext:junit                          | 1.1.3        | 1.1.5      |\n| org.jetbrains.kotlinx:kotlinx-coroutines-core    | 1.3.9        | 1.6.1      |\n| org.jetbrains.kotlinx:kotlinx-coroutines-test    | 1.3.9        | 1.6.1      |\n| io.mockk:mockk                                   | 1.12.3       | 1.13.4     |\n| io.mockk:mockk-agent-api                         | 1.12.3       | 1.13.4     |\n| io.mockk:mockk-agent-jvm                         | 1.12.3       | 1.13.4     |\n| org.robolectric:robolectric                      | 4.8.1        | 4.9.2      |\n| com.android.tools.lint:lint-api                  | 30.0.4       | 30.4.2     |\n| com.android.tools.lint:lint-checks               | 30.0.4       | 30.4.2     |\n| com.android.tools.lint:lint                      | 30.0.4       | 30.4.2     |\n| com.android.tools.lint:lint-tests                | 30.0.4       | 30.4.2     |\n| com.android.tools:testutils                      | 30.0.4       | 30.4.2     |\n| nl.jqno.equalsverifier:equalsverifier            | 3.10.1       | 3.14       |\n| io.gitlab.arturbosch.detekt:detekt-formatting    | 1.20.0       | 1.22.0     |\n| composeOptions -> kotlinCompilerExtensionVersion | 1.1.0-beta03 | 1.4.3      |\n| androidx.compose:compose-bom                     |              | 2023.01.00 |\n| androidx.compose.compiler:compiler               |              | 1.3.2      |\n| com.pinterest:ktlint                             | 0.39.0       | 0.48.2     |\n\n# 11.0.0-alpha.1 March 2, 2023\n## Features ✨ and improvements 🏁\n* Enable raster colorization via `raster-color` expression and `RasterLayer.rasterColor`, `RasterLayer.rasterColorMix`, `RasterLayer.rasterColorRange` layer properties.\n\n# 10.15.0 July 27, 2023\n## Bug fixes 🐞\n* Fix a security exception when fine location permission is not granted when using `DefaultLocationProvider`.\n* Fix camera animations jitter noticeable on high zoom levels using location puck following mode.\n* Fix view port not following puck if viewport `bearing` option was set to `null` even though new locations were available.\n* Fix the issue of tiles displaying redundant images during a style switch, when both styles include similarly named sprites.\n* Fix crash in offline download when no-content responses are received.\n* Fix the issue of rendering sky layers behind the globe when the atmosphere is disabled.\n* Resolve the issue with tile rendering when the tile pack's levelling scheme has a maximum zoom level of less than 16, and the camera zoom surpasses the maximum zoom value defined by the tile pack's levelling scheme.\n* Fix the HTTP resources expiration time being reset when the Expires header defined the expiration time and the Cache-Control header was present but did not define the expiration time.\n* Fix the latency during the style switch of fill extrusion layers that have data-driven paint properties.\n* Fix a rounding error when point lies at the edge of the screen by using `rountToInt` for limiting `MapboxMap#pixelForCoordinate` to the bounds of MapView.\n\n## Dependencies\n* Update gl-native to v10.15.0 and common to v23.7.0.\n\n\n# 10.15.0-rc.1 July 13, 2023\n## Bug fixes 🐞\n* Fix view port not following puck if viewport `bearing` option was set to `null` even though new locations were available.\n* Fix the issue of tiles displaying redundant images during a style switch, when both styles include similarly named sprites.\n* Fix crash in offline download when no-content responses are received.\n* Fix the issue of rendering sky layers behind the globe when the atmosphere is disabled.\n\n## Dependencies\n* Update gl-native to v10.15.0-rc.1 and common to v23.7.0-rc.1.\n\n\n# 10.15.0-beta.1 June 29, 2023\n## Bug fixes 🐞\n* Fix a security exception when fine location permission is not granted when using DefaultLocationProvider.\n* Fix camera animations jitter noticeable on high zoom levels using location puck following mode.\n* Resolve the missing tile rendering issue when the tile pack's leveling scheme has a maximum zoom level of less than 16.\n* Fix the issue that HTTP resources expiration time being incorrectly reset, which caused excessive network requests.\n* Fix the style change latency for fill extrusion layers(in case the layers have data-driven paint properties) during the style switches.\n\n## Dependencies\n* Update gl-native to v10.15.0-beta.1 and common to v23.7.0-beta.1.\n\n\n\n# 10.14.1 June 22, 2023\n## Bug fixes 🐞\n* Fix the latency during the style switch of fill extrusion layers that have data-driven paint properties.\n\n## Dependencies\n* Update gl-native to v10.14.1.\n\n\n# 10.14.0 June 14, 2023\n## Features ✨ and improvements 🏁\n* Improve performance of setting puck style properties by removing redundant check if layer / source exists.\n* Improve performance of symbol layers with identical or no text.\n* Hide line labels with too large an angle between two neighboring glyphs.\n* Introduce `MapboxMap.tileCover` and `Snapshotter.tileCover` experimental API to get the tileIDs that cover current map camera.\n\n## Bug fixes 🐞\n* Fix layer zoom range check so that the layer will be hidden when the zoom equals to layer's max zoom.\n* Fixes occasional rendering errors caused by long line layers and vertex data overflow.\n* Fix crash when running animations (e.g. gestures) on Android 14 beta.\n* Fix image and zoom dependent expression evaluation errors during style switching.\n* Avoid re-use of raw icon atlas buffers when images point to the different location in the atlas.\n* Fix flickering of symbols on high zoom level.\n* Fix ineffective `tilesize` setting in `CustomGeometrySourceOptions`. Now the generated tiles accurately reflect the specified `tilesize` setting.\n\n## Dependencies\n* Update gl-native to v10.14.0 and common to v23.6.0.\n\n\n# 10.14.0-rc.1 May 31, 2023\n## Features ✨ and improvements 🏁\n* Introduce `MapboxMap.tileCover` experimental API to get the tileIDs that cover current map camera.\n\n## Bug fixes 🐞\n* Fix crash when running animations (e.g. gestures) on Android 14 beta.\n* Fix image and zoom dependent expression evaluation errors during style switching.\n* Avoid re-use of raw icon atlas buffers when images point to the different location in the atlas.\n\n## Dependencies\n* Update gl-native to v10.14.0-rc.1 and common to v23.6.0-rc.1.\n\n\n# 10.14.0-beta.1 May 17, 2023\n## Features ✨ and improvements 🏁\n* Improve performance of setting puck style properties by removing redundant check if layer / source exists.\n* Improve performance of symbol layers with identical or no text.\n* Hide line labels with too large an angle between two neighboring glyphs.\n\n## Bug fixes 🐞\n* Fix layer zoom range check so that the layer will be hidden when the zoom equals to layer's max zoom.\n* Fixes occasional rendering errors caused by long line layers and vertex data overflow.\n\n## Dependencies\n* Update gl-native to v10.14.0-beta.1 and common to v23.6.0-beta.1.\n\n\n# 10.13.0 May 05, 2023\n## Features ✨ and improvements 🏁\n* Add overloaded methods to `CameraAnimatorsFactory` allowing to set camera animator owner.\n* Improve startup performance by calculating the style expressions dependencies lazily.\n* Introduce a new APIs `coordinateInfoForPixel(pixel: ScreenCoordinate): CoordinateInfo` and `coordinatesInfoForPixels(pixels: List<ScreenCoordinate>): List<CoordinateInfo>` which will return record(s) containing both `coordinate` and `isOnSurface` info.\n* Deprecate `Snapshotter.setTileMode` and `Snapshotter.isInTileMode`.\n* Deprecate `Style.setStyleGeoJSONSourceData(sourceId, data)`.\n* Deprecate `isMapLoaded` method.\n* Share similar image and glyph atlases across tiles and thus avoid unnecessary textures creation.\n* Render single color gradient as solid line.\n* Use flat screen coordinate conversion functions with zero exaggeration terrain.\n* Deprecate qRF APIs that use specific geometry types, which also are not cancelable.\n\n## Bug fixes 🐞\n* Fix rare issue in renderer which could freeze the device when bringing the `MapView` back to front.\n* Fix artefacts caused by a race condition when style layers got updated during pending tiles layout.\n* Fix missing return unexpected result in model_loader processing, so the client could be aware of the error.\n* Fix text flickering while symbol layer update if text-field contains text-color property.\n* Fix 3d location layer properties `model-scale-transition` and `model-rotation-transition`, made them non-transitionable.\n* Fix raw expression parsing for list literal.\n* Fix text flickering while symbol layer update if `text-field` contains `text-color` property inside the format expression.\n* Fix a crash when a hillshade bucket was created with disabled terrain, but the terrain got enabled afterwards.\n* Fix the crash when identifying if device is connected to WiFi.\n* Fix jumpy gestures when external `AndroidGestureManager` is added with `setGesturesManager`.\n* Fix a bug that accidentally cleared icon images when `setMemoryBudget` was used with megabyte values.\n* Fix handling of Unicode characters in `slice`, `index-of`, `in` and `length` expressions.\n\n## Dependencies\n* Update gl-native to v10.13.1 and common to v23.5.0.\n\n\n\n\n# 10.13.0-rc.1 April 20, 2023\n## Features ✨ and improvements 🏁\n* Add overloaded methods to `CameraAnimatorsFactory` allowing to set camera animator owner.\n* Improve startup performance by calculating the style expressions dependencies lazily.\n* Introduce a new APIs `coordinateInfoForPixel(pixel: ScreenCoordinate): CoordinateInfo` and `coordinatesInfoForPixels(pixels: List<ScreenCoordinate>): List<CoordinateInfo>` which will return record(s) containing both `coordinate` and `isOnSurface` info.\n\n## Bug fixes 🐞\n* Fix 3d location layer properties `model-scale-transition` and `model-rotation-transition`, made them non-transitionable.\n* Fix raw expression parsing for list literal.\n* Fix text flickering while symbol layer update if `text-field` contains `text-color` property inside the format expression.\n\n## Dependencies\n* Update gl-native to v10.13.0-rc.1 and common to v23.5.0-rc.1.\n\n\n\n# 10.13.0-beta.1 April 05, 2023\n## Features ✨ and improvements 🏁\n* Deprecate `Snapshotter.setTileMode` and `Snapshotter.isInTileMode`.\n* Deprecate `Style.setStyleGeoJSONSourceData(sourceId, data)`.\n* Use flat screen coordinate conversion functions with zero exaggeration terrain.\n* Share similar image and glyph atlases across tiles and thus avoid unnecessary textures creation.\n* Render single color gradient as solid line.\n\n## Bug fixes 🐞\n* Fix the crash when identifying if device is connected to WiFi.\n* Fix a crash when a hillshade bucket was created with disabled terrain, but the terrain got enabled afterwards.\n\n## Dependencies\n* Update gl-native to v10.13.0-beta.1 and common to v23.5.0-beta.1.\n\n\n\n# 10.12.1 March 28, 2023\n## Bug fixes 🐞\n* Fix missing data id in `source-data-loaded` event for empty GeoJSON data.\n\n## Dependencies\n* Update gl-native to v10.12.1.\n\n\n# 10.12.0 March 23, 2023\n## Features ✨ and improvements 🏁\n* Add `data-id` argument to `GeoJsonSource` data update methods. `data-id` is later attached to the `SourceDataLoadedEventData` event and allows to track the specific `GeoJsonSource` update.\n* Reduce line gradient texture size if there is no color change.\n\n## Bug fixes 🐞\n* Fix regression from `v10.11.0` when applying geojson from loaded style to the new style could cause the crash or no data applied.\n* Fix regression from `v10.11.0` when applying geojson data was not working when no style was available.\n* Do not fail on parsing vector tile when there are duplicate keys encoded in the tile data.\n* Fix a bug where camera change event is not emitted when using free camera options to set camera.\n* Fix network usage for the case when multiple access tokens are used.\n* Fix rendering glitches for symbols when animating the map caused by image atlas interfering.\n* Fix set geojson source data with null value.\n* Interrupt blocking disk cache database operations on application exit, so that the application does not hang.\n* Fix a bug where continuously dragging and changing zoom would lead to either very slow or very fast map dragging.\n* Avoid generation of the unneeded glyph textures.\n* Fix rendering errors when the closing point is missing in GeoJSON polygon features.\n* Fix a bug where taking consecutive snapshots had missing tiles.\n* Fix a bug where fill extrusions would flicker when crossing a certain zoom threshold.\n\n## Dependencies\n* Update gl-native to v10.12.0 and common to v23.4.0.\n\n\n# 10.11.2 March 10, 2023\n## Bug fixes 🐞\n* Fix missing terrain on some GPUs (e.g. Mali). ([2038](https://github.com/mapbox/mapbox-maps-android/pull/2038))\n\n## Dependencies\n* Update gl-native to v10.11.2. ([2038](https://github.com/mapbox/mapbox-maps-android/pull/2038))\n\n\n# 10.12.0-rc.1 March 09, 2023\n## Bug fixes 🐞\n* Fix regression from `v10.11.0` when applying geojson data was not working when no style was available.\n* Interrupt blocking disk cache database operations on application exit so that the application does not hang.\n* Fix a bug where continuously dragging and changing zoom would lead to either very slow or fast map dragging.\n* Fix missing terrain on some GPUs (e.g. Mali).\n\n## Dependencies\n* Update gl-native to v10.12.0-rc.1 and common to v23.4.0-rc.1.\n\n\n# 10.12.0-beta.1 February 22, 2023\n## Features ✨ and improvements 🏁\n* Add `data-id` argument to `GeoJsonSource` data update methods. `data-id` is later attached to the\n`SourceDataLoadedEventData` event and allows to track the specific `GeoJsonSource` update. ([1991](https://github.com/mapbox/mapbox-maps-android/pull/1991))\n* Reduce line gradient texture size if there is no color change.\n\n## Bug fixes 🐞\n* Avoid generation of the unneeded glyph textures.\n* Fixes rendering errors when the closing point is missing in GeoJSON polygon features.\n* Fix a bug where taking consecutive snapshots had missing tiles.\n* Fix a bug where fill extrusions would flicker when crossing a certain zoom threshold.\n\n## Dependencies\n* Update gl-native to v10.12.0-beta.1 and common to v23.4.0-beta.1.\n\n\n# 10.10.2 February 16, 2023\n## Bug fixes 🐞\n* [tile store] Remove token from TileStore Logs. ([2011](https://github.com/mapbox/mapbox-maps-android/pull/2011))\n\n## Dependencies\n* Update common to v23.2.3. ([2011](https://github.com/mapbox/mapbox-maps-android/pull/2011))\n\n# 10.11.0 February 09, 2023\n## Features ✨ and improvements 🏁\n* Skip redundant `MapboxMap.setCamera` updates in `CameraAnimationsPlugin`. ([1909](https://github.com/mapbox/mapbox-maps-android/pull/1909))\n* Improve performance by setting geojson data directly. ([1920](https://github.com/mapbox/mapbox-maps-android/pull/1920))\n* Fix viewport hang when transition to `FollowPuckViewportState` and no new location update is available. ([1929](https://github.com/mapbox/mapbox-maps-android/pull/1929))\n* Avoid unneeded tiles relayout on style change. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Enable the usage of expressions in array values during style parsing, where the member expressions in the array is evaluated to the same type. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Slightly improve quality and performance of the terrain. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Improve performance for style switch use cases by avoiding unneeded tiles re-layout. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n\n## Bug fixes 🐞\n* Fix a bug where `flyTo` animation request invalid tiles from map engine. ([1949](https://github.com/mapbox/mapbox-maps-android/pull/1949))\n* Deprecate `pattern` and `dash` transition properties for layer (e.g. `BackgroundLayer.backgroundPatternTransition`, `FillExtrusionLayer.fillExtrusionPatternTransition`, `FillLayer.fillPatternTransition`, `LineLayer.lineDasharrayTransition`, `LineLayer.linePatternTransition`, ...).  ([1941](https://github.com/mapbox/mapbox-maps-android/pull/1941))\n* Fix terrain tiles missing issue when running in the emulator and some android devices. ([1953](https://github.com/mapbox/mapbox-maps-android/pull/1953))\n* Fix wrong `onLongTouch` event detected on any map gesture after clicks on ViewAnnotation. ([1954](https://github.com/mapbox/mapbox-maps-android/pull/1954))\n* Fix a known issue where `NullPointerException` was thrown when last location was not available. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix flickering issues for the symbols that allow overlap (have text(icon)-allow-overlap: true) with skipping fade-in animation for them. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix data queueing issue when calling API 'setStyleGeoJSONSourceData'. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix flickering terrain on high pitched views. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Clamp inputs in DEMData::get() to prevent OOB Access. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix asset file source threading model - do not use legacy RunLoop, thus do not use ALooper and get rid of an extra thread. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix text visualization when in orthographic mode. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix terrain elevation when a padded dem source is used. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fixes visible tile borders when msaa enabled. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix distance-to-center filtering of symbols when terrain is enabled. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix color transitions in model ligthing. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix terrain placement for model layer when model scale is set to zero. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix geometry tile model layer paint property transition. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix camera bumpiness at the beginning of a drag operation when terrain is enabled. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix disappearing tiles when terrain with a high exaggeration is enabled. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix line-border-color when used with line-trim-offset. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fixes an issue when allow-overlap, ignore-placement , and map rotation-alignment of icon breaks the rendering of symbols on the globe. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Mitigate symbol flickering on source data change during camera animation. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Mitigate OOM caused by Snapshotter API usage. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fixes rare crashes during render feature queries, if the features are located close to each other. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix an issue where the camera would start flickering during subsequent calls to `Map::jumpTo` / `Map::easeTo` with terrain enabled.. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix redundant snapshot capturing that caused excessive memory usage. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Fix incorrect resource type being specified map loading error event data. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n* Original gesture settings should be maintained after map operations (such as panning the map) complete. ([1989](https://github.com/mapbox/mapbox-maps-android/pull/1989))\n\n## Dependencies\n* Update gl-native to v10.11.1, common to v23.3.1. ([1984](https://github.com/mapbox/mapbox-maps-android/pull/1984))\n\n\n# 10.11.0-rc.1 January 26, 2023\n## Features ✨ and improvements 🏁\n* Improve performance for style switch use cases by avoiding unneeded tiles re-layout. ([1953](https://github.com/mapbox/mapbox-maps-android/pull/1953))\n\n## Bug fixes 🐞\n* Fix a bug where `flyTo` animation request invalid tiles from map engine. ([1949](https://github.com/mapbox/mapbox-maps-android/pull/1949))\n* Deprecate `pattern` and `dash` transition properties for layer (e.g. `BackgroundLayer.backgroundPatternTransition`, `FillExtrusionLayer.fillExtrusionPatternTransition`, `FillLayer.fillPatternTransition`, `LineLayer.lineDasharrayTransition`, `LineLayer.linePatternTransition`, ...).  ([1941](https://github.com/mapbox/mapbox-maps-android/pull/1941))\n* Fix terrain tiles missing issue when running in the emulator and some android devices. ([1953](https://github.com/mapbox/mapbox-maps-android/pull/1953))\n* Fix wrong `onLongTouch` event detected on any map gesture after clicks on ViewAnnotation. ([1954](https://github.com/mapbox/mapbox-maps-android/pull/1954))\n\n## Dependencies\n* Update gl-native to v10.11.0-rc.1 and common to v23.3.0-rc.1. ([1953](https://github.com/mapbox/mapbox-maps-android/pull/1953))\n\n## Known issues\n* If last location is not available, `LocationEngine` will throw a `NullPointerException`.\n\n\n# 10.11.0-beta.1 January 11, 2023\n## Features ✨ and improvements 🏁\n* Skip redundant `MapboxMap.setCamera` updates in `CameraAnimationsPlugin`. ([1909](https://github.com/mapbox/mapbox-maps-android/pull/1909))\n* Improve performance by setting geojson data directly. ([1920](https://github.com/mapbox/mapbox-maps-android/pull/1920))\n* Update license to reflect latest version of the Mapbox TOS. ([1927](https://github.com/mapbox/mapbox-maps-android/pull/1927))\n* Fix viewport hang when transition to `FollowPuckViewportState` and no new location update is available. ([1929](https://github.com/mapbox/mapbox-maps-android/pull/1929))\n* Optimize shadow rendering memory use and performance. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Enable the usage of expressions in array values during style parsing, where the member expressions in the array is evaluated to the same type. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Slightly improve quality and performance of the terrain. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n\n## Bug fixes 🐞\n* Fix crash due to invalid distance when panning the map. ([1906](https://github.com/mapbox/mapbox-maps-android/pull/1906))\n* Fix asset file source threading model. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Fix terrain elevation when a padded dem source is used. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Fix distance-to-center filtering of symbols when terrain is enabled. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Fix camera bumpiness at the beginning of a drag operation when terrain is enabled. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Fix disappearing tiles when terrain with a high exaggeration is enabled. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Mitigate symbol flickering on source data change during camera animation. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Fixes rare crashes during render feature queries, if the features are located close to each other. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Fix redundant snapshot capturing that caused excessive memory usage. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Fixes an issue when allow-overlap, ignore-placement , and map rotation-alignment of icon breaks the rendering of symbols on the globe. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Mitigate symbol flickering on source data change during camera animation. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Mitigate OOM caused by Snapshotter API usage. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n* Fix an issue where the camera would start flickering during subsequent calls to `Map::jumpTo` / `Map::easeTo` with terrain enabled. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n\n## Dependencies\n* Update gl-native to v10.11.0-beta.1 and common to v23.3.0-beta.1. ([1934](https://github.com/mapbox/mapbox-maps-android/pull/1934))\n\n## Known issues\n* Using `pattern` and `dash` transition properties for layer (e.g. `BackgroundLayer.backgroundPatternTransition`, `FillExtrusionLayer.fillExtrusionPatternTransition`, `FillLayer.fillPatternTransition`, `LineLayer.lineDasharrayTransition`, `LineLayer.linePatternTransition`, ...) will result in an invalid layer.\n\n\n# 10.10.1 January 25, 2023\n## Features ✨ and improvements 🏁\n* Add custom header x-mapbox-app-info to requests. ([1957](https://github.com/mapbox/mapbox-maps-android/pull/1957))\n\n## Bug fixes 🐞\n* Fix a bug where taking consecutive snapshots had missing tiles. ([1957](https://github.com/mapbox/mapbox-maps-android/pull/1957))\n\n## Dependencies\n* Update gl-native to v10.10.1 and common to v23.2.2. ([1957](https://github.com/mapbox/mapbox-maps-android/pull/1957))\n\n\n\n# 10.10.0 December 07, 2022\n## Features ✨ and improvements 🏁\n* Introduce view annotation `ViewAnnotationManager.annotations` API to access list of added view annotations. ([1751](https://github.com/mapbox/mapbox-maps-android/pull/1751))\n* Introduce view annotation `ViewAnnotationManager.cameraForAnnotations` API to get camera options for given view annotations list. ([1753](https://github.com/mapbox/mapbox-maps-android/pull/1753))\n* Unify the `margin`/`translation` `Widget` APIs into the `WidgetPosition.offset`, rename `WidgetPosition.horizontal`/`WidgetPosition.vertical` to `WidgetPosition.horizontalAlignment`/`WidgetPosition.verticalAlignment`; Deprecate the original constructors and `setTranslation` APIs. ([1782](https://github.com/mapbox/mapbox-maps-android/pull/1782))\n* Add API for removing atmosphere. ([1841](https://github.com/mapbox/mapbox-maps-android/pull/1841))\n* Introduce `MapTelemetry.getUserTelemetryRequestState` API. ([1877](https://github.com/mapbox/mapbox-maps-android/pull/1877))\n* Eliminate tiles re-creation and re-layout on zooming map with globe, when the camera is trespassing the zoom projection border. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Avoid tiles re-layout on enabling terrain with zero exaggeration. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Added API to enable/disable rendering of world copies in mercator mode. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Improve symbol filtering performance when `distance-from-camera` and `pitch` expressions are used. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Reduce number of operations when terrain is used with zero exaggeration. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n\n## Bug fixes 🐞\n* Fix an issue when touch events didn't pass through clickable view annotations. ([1745](https://github.com/mapbox/mapbox-maps-android/pull/1745))\n* Trigger repaint after `BitmapWidget` is updated. ([1797](https://github.com/mapbox/mapbox-maps-android/pull/1797))\n* Fix a crash after removing the view annotation if view has an attached animation or transition. ([1831](https://github.com/mapbox/mapbox-maps-android/pull/1831))\n* Emit the last indicator state when new listeners are added to the location component. ([1827](https://github.com/mapbox/mapbox-maps-android/pull/1827))\n* Fix an issue where queried symbol features did not contain the associated feature state. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Throw understandable exception when using widgets with the `MapView` or `MapSurface` and not specifying `MapInitOptions.MapOptions.contextMode = ContextMode.SHARED` preventing hard-catching runtime crashes or artifacts. ([1834](https://github.com/mapbox/mapbox-maps-android/pull/1834))\n* Fix an issue where location updates were not provided on correct thread/looper. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Dispatch location updates as a location event when the app is moving to background. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Fix `LocationEngine` to support multiple concurrent clients. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Fix immediate camera animation on API level 23 or below. ([1842](https://github.com/mapbox/mapbox-maps-android/pull/1842))\n* Fix loss of `Widget` during background/foreground transition. ([1864](https://github.com/mapbox/mapbox-maps-android/pull/1864))\n* Fix displaying MapView in Android Studio Layout Preview. ([1881](https://github.com/mapbox/mapbox-maps-android/pull/1881))\n* Fix a bug where `ViewAnnotationManager.cameraForAnnotations` API doesn't return correct camera bounds. ([1861](https://github.com/mapbox/mapbox-maps-android/pull/1861))\n* Handle OOB when getting DEM Data ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fix a rare precision issue with symbol and circle layer occlusion when terrain is enabled. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fixes a rare crash caused by a race condition during gesture handling. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Disable location indicator occlusion testing with the terrain when exaggeration is set to 0. This fixes occasional location indicator disappearance. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fix an issue where queried symbol features did not contain associated feature state. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Clear geojson tiles after the source is updated with empty features in order to eliminate \"phantom tile\" artefacts and to obviate extra work for keeping empty tiles. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Eliminate duplicated tile async upload requests - fix a race condition causing a tile rendering the previous layout result. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Truncate long single line text in symbol layers to prevent rendering artifact. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fixes an issue when the mixed usage of patterns and icons caused bleeding of textures. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fixes visible tile borders when MSAA enabled. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fix LOD and prevent from flickering on enabling terrain with zero exaggeration. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Setting empty value for a style layer filter now clears the filter. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fixes rendering artifacts near tile borders when using terrain with zero exaggeration. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fixes fog rendering when terrain is used with zero exaggeration. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fix `distance-to-center` filtering of symbols when terrain is enabled. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Improved `cameraForCoordinate` result quality with pitch and with terrain. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891))\n* Fix a crash on Android 10 and below, when Google Play Location Service is not present. ([1898](https://github.com/mapbox/mapbox-maps-android/pull/1898))\n\n## Dependencies\n* Update gl-native to v10.10.0 and common to v23.2.1. ([1891](https://github.com/mapbox/mapbox-maps-android/pull/1891) [1898](https://github.com/mapbox/mapbox-maps-android/pull/1898))\n* Remove `mapbox-android-core` dependency, it is now part of Mapbox Common library.\n    **NOTE:**: You need to remove any explicit dependency declaration to `com.mapbox.mapboxsdk:mapbox-android-core:<version>` from the project to avoid duplicated class definition errors related to location APIs. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n\n\n# 10.10.0-rc.1 November 18, 2022\n## Features ✨ and improvements 🏁\n* Improve symbol filtering performance when distance-from-camera and pitch expressions are used. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Add API for removing atmosphere. ([1841](https://github.com/mapbox/mapbox-maps-android/pull/1841))\n\n## Bug fixes 🐞\n* Trigger repaint after `BitmapWidget` is updated. ([1797](https://github.com/mapbox/mapbox-maps-android/pull/1797))\n* Fix a crash after removing the view annotation if view has an attached animation or transition. ([1831](https://github.com/mapbox/mapbox-maps-android/pull/1831))\n* Emit the last indicator state when new listeners are added to the location component. ([1827](https://github.com/mapbox/mapbox-maps-android/pull/1827))\n* Fix an issue where queried symbol features did not contain the associated feature state. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Clear geojson tiles after the source is updated with empty features in order to eliminate \"phantom tile\" artifacts and to obviate extra work for keeping empty tiles. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Fix a regression from v10.10.0-beta.1 release, the BitmapWidget.setTranslation API should offset relative to its original position. ([1833](https://github.com/mapbox/mapbox-maps-android/pull/1833))\n* Throw understandable exception when using widgets with the `MapView` or `MapSurface` and not specifying `MapInitOptions.MapOptions.contextMode = ContextMode.SHARED` preventing hard-catching runtime crashes or artifacts. ([1834](https://github.com/mapbox/mapbox-maps-android/pull/1834))\n* Fix an issue where location updates were not provided on correct thread/looper. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* [telemetry] Dispatch location updates as a location event when the app is moving to background. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Fix `LocationEngine` to support multiple concurrent clients. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Fix immediate camera animation on API level 23 or below. ([1842](https://github.com/mapbox/mapbox-maps-android/pull/1842))\n\n## Dependencies\n* Update gl-native to v10.10.0-rc.1 and common to v23.2.0-rc.3. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n* Remove `mapbox-android-core` dependency, it is now part of Mapbox Common library.\n  **NOTE:**: You need to remove any explicit dependency declaration to `com.mapbox.mapboxsdk:mapbox-android-core:<version>` from the project to avoid duplicated class definition errors related to location APIs. ([1836](https://github.com/mapbox/mapbox-maps-android/pull/1836))\n\n\n\n# 10.9.1 November 7, 2022\n\n## Bug fixes 🐞\n* Handle OOB when getting DEM Data. ([#1808](https://github.com/mapbox/mapbox-maps-android/pull/1808))\n\n# 10.10.0-beta.1 November 03, 2022\n## Features ✨ and improvements 🏁\n* Introduce view annotation `ViewAnnotationManager.annotations` API to access list of added view annotations. ([1751](https://github.com/mapbox/mapbox-maps-android/pull/1751))\n* Introduce view annotation `ViewAnnotationManager.cameraForAnnotations` API to get camera options for given view annotations list. ([1753](https://github.com/mapbox/mapbox-maps-android/pull/1753))\n* Eliminate tiles re-creation and re-layout on zooming map with globe, when the camera is trespassing the zoom projection border. ([1791](https://github.com/mapbox/mapbox-maps-android/pull/1791))\n* Avoid tiles re-layout on enabling terrain with zero exaggeration. ([1791](https://github.com/mapbox/mapbox-maps-android/pull/1791))\n* Unify the `margin`/`translation` `Widget` APIs into the `WidgetPosition.offset`, rename `WidgetPosition.horizontal`/`WidgetPosition.vertical` to `WidgetPosition.horizontalAlignment`/`WidgetPosition.verticalAlignment`; Deprecate the original constructors and `setTranslation` APIs. ([1782](https://github.com/mapbox/mapbox-maps-android/pull/1782))\n* Add APIs to enable/disable rendering of world copies. ([1794](https://github.com/mapbox/mapbox-maps-android/pull/1794), [1791](https://github.com/mapbox/mapbox-maps-android/pull/1791))\n\n## Bug fixes 🐞\n* Fix an issue when touch events didn't pass through clickable view annotations. ([1745](https://github.com/mapbox/mapbox-maps-android/pull/1745))\n* Handle OOB when getting DEM Data. ([1791](https://github.com/mapbox/mapbox-maps-android/pull/1791))\n* Fix a rare precision issue with symbol and circle layer occlusion when terrain is enabled. ([1791](https://github.com/mapbox/mapbox-maps-android/pull/1791))\n* Fixes a rare crash caused by a race condition during gesture handling. ([1791](https://github.com/mapbox/mapbox-maps-android/pull/1791))\n* Disable location indicator occlusion testing with the terrain when exaggeration is set to 0. This fixes occasional location indicator disappearance. ([1791](https://github.com/mapbox/mapbox-maps-android/pull/1791))\n* Exclude map disk cache files from cloud backups. ([1791](https://github.com/mapbox/mapbox-maps-android/pull/1791))\n\n## Dependencies\n* Update gl-native to v10.10.0-beta.1 and common to v23.2.0-beta.1. ([1791](https://github.com/mapbox/mapbox-maps-android/pull/1791))\n\n\n\n# 10.9.0 October 21, 2022\n\n## Features ✨ and improvements 🏁\n* Rendering performance improvements for fast paced camera changes. ([1760](https://github.com/mapbox/mapbox-maps-android/pull/1760))\n* Eliminate tiles re-creation and re-layout on zooming map with globe, when the camera is trespassing the zoom projection border. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n* Deprecate gesture settings `increaseRotateThresholdWhenPinchingToZoom` property. ([1632](https://github.com/mapbox/mapbox-maps-android/pull/1632))\n* Enable asynchronous tile uploader by default to improve animation performance. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Vector tiles without symbols are not hold for fade-out animation so that less amount of vector tiles are managed at a time. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Add support to set location puck opacity. ([1659](https://github.com/mapbox/mapbox-maps-android/pull/1659))\n* Support `pitch` and `distanceFromCenter` filters in symbol layers. ([1662](https://github.com/mapbox/mapbox-maps-android/pull/1662))\n* Migrate telemetry APIs from [mobile-events-android](https://github.com/mapbox/mapbox-events-android) to common SDK implementation. ([1672](https://github.com/mapbox/mapbox-maps-android/pull/1672))\n\n## Bug fixes 🐞\n* Fix frequent layout invalidation caused by view annotations calling `View.bringToFront()`. ([1744](https://github.com/mapbox/mapbox-maps-android/pull/1744))\n* Fix flickering of vertically shifted line labels on style change, caused by the wrong initial placement. ([1760](https://github.com/mapbox/mapbox-maps-android/pull/1760))\n* Fix location indicator rendering as a rectangle on low zoom levels. ([1760](https://github.com/mapbox/mapbox-maps-android/pull/1760))\n* Fix crash caused by using of invalid paint property binders. ([1760](https://github.com/mapbox/mapbox-maps-android/pull/1760))\n* Fix \"phantom tiles\" artefacts after GeoJSON source update when asynchronous tile loading is enabled. ([1760](https://github.com/mapbox/mapbox-maps-android/pull/1760))\n* Fix a bug in cameraForGeometry when called on a map with padding set. ([1760](https://github.com/mapbox/mapbox-maps-android/pull/1760))\n* Fix scale bar text being cut. ([1716](https://github.com/mapbox/mapbox-maps-android/pull/1716))\n* Fix possible crash when adding terrain using Style DSL after consecutive style changes. ([1717](https://github.com/mapbox/mapbox-maps-android/pull/1717))\n* Fix scale bar text overlapping. ([1728](https://github.com/mapbox/mapbox-maps-android/pull/1728))\n* Fix issue where `Widget` is not immediately rendered when added to the `MapView`. ([1708](https://github.com/mapbox/mapbox-maps-android/pull/1708))\n* Mitigate symbol flickering on zooming out globe map. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n* Fix random crash on tiles update when asynchronous uploading is enabled. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n* Make telemetry a single instance. Avoids module recreation when coming from background. ([#1695](https://github.com/mapbox/mapbox-maps-android/pull/1695))\n* Fix scale bar truncated at high zoom levels near the poles. ([1620](https://github.com/mapbox/mapbox-maps-android/pull/1620))\n* Fix broken view annotation positioning when marking them `View.INVISIBLE` and then making `View.VISIBLE`. ([1616](https://github.com/mapbox/mapbox-maps-android/pull/1616))\n* Snap puck to north if `puckBearingEnabled` is set to false. ([1635](https://github.com/mapbox/mapbox-maps-android/pull/1635))\n* Preserve cached properties if applied to the layer before during the `Style#getLayer` call. ([1622](https://github.com/mapbox/mapbox-maps-android/pull/1622))\n* Fix a `NullPointerException` in `StandardGestureListener`, where `MotionEvent` should be nullable. ([1645](https://github.com/mapbox/mapbox-maps-android/pull/1645)), ([1677](https://github.com/mapbox/mapbox-maps-android/pull/1677))\n* Fix incorrect `MapView` dimensions after background orientation change. ([1658](https://github.com/mapbox/mapbox-maps-android/pull/1658))\n* Fix wrong `BitmapWidget` position when using `WidgetPosition.Horizontal.CENTER` or `WidgetPosition.Vertical.CENTER` property. ([1651](https://github.com/mapbox/mapbox-maps-android/pull/1651))\n* Fix pixel flickering between tiles on darker styles in globe view. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Fix incorrect shading of rounded corners in fill extrusions when ambient occlusion and/or shadow is enabled. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Fix shadows when the light radial coordinate is zero. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Location indicator layer is occluded by terrain to align rendering behavior with other location indicator rendering types. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Symbol flickering after runtime styling caused by using outdated symbol placement on updated symbol buckets. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Allow Light intensity and Light shadow intensity to accept expressions when using setStyleLight API call. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Fix a bug in `cameraForGeometry` when called on a map with padding set. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Throw an exception with the meaningful stack trace when constructing `Value` from an infinite or NaN number. ([1681](https://github.com/mapbox/mapbox-maps-android/pull/1681))\n\n## Dependencies\n* Update mapbox-gestures-android dependency to [v0.8.0](https://github.com/mapbox/mapbox-gestures-android/releases/tag/v0.8.0). ([1645](https://github.com/mapbox/mapbox-maps-android/pull/1645))\n* Update gl-native to v10.9.0 and common to v23.1.1. ([1760](https://github.com/mapbox/mapbox-maps-android/pull/1760))\n\n\n\n# 10.9.0-rc.1 October 07, 2022\n\n## Features ✨ and improvements 🏁\n* Eliminate tiles re-creation and re-layout on zooming map with globe, when the camera is trespassing the zoom projection border. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n\n## Bug fixes 🐞\n* Fix scale bar text being cut. ([1716](https://github.com/mapbox/mapbox-maps-android/pull/1716))\n* Fix possible crash when adding terrain using Style DSL after consecutive style changes. ([1717](https://github.com/mapbox/mapbox-maps-android/pull/1717))\n* Fix scale bar text overlapping. ([1728](https://github.com/mapbox/mapbox-maps-android/pull/1728))\n* Fix issue where `Widget` is not immediately rendered when added to the `MapView`. ([1708](https://github.com/mapbox/mapbox-maps-android/pull/1708))\n* Fix \"phantom tiles\" artefacts after GeoJSON source update when asynchronous tile loading is enabled. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n* Mitigate symbol flickering on zooming out globe map. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n* Fix random crash on tiles update when asynchronous uploading is enabled. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n* Fix a crash when Google location service is started in background but stopped in foreground. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n* Fix an issue where mock field is missing from the LocationEngine updates. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n\n## Dependencies\n* Update gl-native to v10.9.0-rc.1 and common to v23.1.0-rc.2. ([1729](https://github.com/mapbox/mapbox-maps-android/pull/1729))\n\n\n# 10.8.1 September 30, 2022\n\n## Bug fixes 🐞\n\n* Fix incorrect `MapView` dimensions after background orientation change. ([1658](https://github.com/mapbox/mapbox-maps-android/pull/1658))\n* Throw an exception with the meaningful stacktrace when constructing `Value` from an infinite or NaN number. ([1681](https://github.com/mapbox/mapbox-maps-android/pull/1681))\n* Make telemetry a single instance. Avoids module recreation when coming from background. ([1695](https://github.com/mapbox/mapbox-maps-android/pull/1695))\n* Fix a potential style load error when non-ASCII characters are used in the version name, by escaping non US ASCII characters in user-agent header. ([1709](https://github.com/mapbox/mapbox-maps-android/pull/1709))\n\n## Dependencies\n* Bump common to v23.0.1. ([1709](https://github.com/mapbox/mapbox-maps-android/pull/1709))\n\n# 10.9.0-beta.2 September 28, 2022\n\n## Bug fixes 🐞\n* Make telemetry a single instance. Avoids module recreation when coming from background. ([#1695](https://github.com/mapbox/mapbox-maps-android/pull/1695))\n* Fix an issue where location engine doesn't produce bearing/accuracy/speed information with the location updates. ([1696](https://github.com/mapbox/mapbox-maps-android/pull/1696))\n\n## Dependencies\n* Bump common sdk to v23.1.0-beta.2. ([1696](https://github.com/mapbox/mapbox-maps-android/pull/1696))\n\n\n# 10.9.0-beta.1 September 22, 2022\n\n## Features ✨ and improvements 🏁\n* Deprecated gesture settings `increaseRotateThresholdWhenPinchingToZoom` property. ([1632](https://github.com/mapbox/mapbox-maps-android/pull/1632))\n* Enable asynchronous tile uploader by default to improve animation performance. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Vector tiles without symbols are not hold for fade-out animation so that less amount of vector tiles are managed at a time. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Add support to set location puck opacity. ([1659](https://github.com/mapbox/mapbox-maps-android/pull/1659))\n* Support `pitch` and `distanceFromCenter` filters in symbol layers. ([1662](https://github.com/mapbox/mapbox-maps-android/pull/1662))\n* Migrated telemetry APIs from [mobile-events-android](https://github.com/mapbox/mapbox-events-android) to common SDK implementation. ([1672](https://github.com/mapbox/mapbox-maps-android/pull/1672))\n\n## Bug fixes 🐞\n* Fix scale bar truncated at high zoom levels near the poles. ([1620](https://github.com/mapbox/mapbox-maps-android/pull/1620))\n* Fix broken view annotation positioning when marking them `View.INVISIBLE` and then making `View.VISIBLE`. ([1616](https://github.com/mapbox/mapbox-maps-android/pull/1616))\n* Snap puck to north if `puckBearingEnabled` is set to false. ([1635](https://github.com/mapbox/mapbox-maps-android/pull/1635))\n* Preserve cached properties if applied to the layer before during the `Style#getLayer` call. ([1622](https://github.com/mapbox/mapbox-maps-android/pull/1622))\n* Fix a `NullPointerException` in `StandardGestureListener`, where `MotionEvent` should be nullable. ([1645](https://github.com/mapbox/mapbox-maps-android/pull/1645)), ([1677](https://github.com/mapbox/mapbox-maps-android/pull/1677))\n* Fix incorrect `MapView` dimensions after background orientation change. ([1658](https://github.com/mapbox/mapbox-maps-android/pull/1658))\n* Fix wrong `BitmapWidget` position when using `WidgetPosition.Horizontal.CENTER` or `WidgetPosition.Vertical.CENTER` property. ([1651](https://github.com/mapbox/mapbox-maps-android/pull/1651))\n* Fix pixel flickering between tiles on darker styles in globe view. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Fix incorrect shading of rounded corners in fill extrusions when ambient occlusion and/or shadow is enabled. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Fix shadows when the light radial coordinate is zero. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Location indicator layer is occluded by terrain to align rendering behavior with other location indicator rendering types. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Symbol flickering after runtime styling caused by using outdated symbol placement on updated symbol buckets. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Allow Light intensity and Light shadow intensity to accept expressions when using setStyleLight API call. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Fix a bug in `cameraForGeometry` when called on a map with padding set. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n* Throw an exception with the meaningful stack trace when constructing `Value` from an infinite or NaN number. ([1681](https://github.com/mapbox/mapbox-maps-android/pull/1681))\n\n## Dependencies\n* Update mapbox-gestures-android dependency to [v0.8.0](https://github.com/mapbox/mapbox-gestures-android/releases/tag/v0.8.0). ([1645](https://github.com/mapbox/mapbox-maps-android/pull/1645))\n* Update gl-native to v10.9.0-beta.1 and common to v23.1.0-beta.1. ([1679](https://github.com/mapbox/mapbox-maps-android/pull/1679))\n\n\n\n# 10.8.0 September 7, 2022\n## Features ✨ and improvements 🏁\n* Introduce a callback to be invoked when the device compass sensors need to be re-calibrated. ([1513](https://github.com/mapbox/mapbox-maps-android/pull/1513))\n* Add support for `LocationComponentSettingsInterface.pulsingMaxRadius` to follow location's accuracy radius. ([1561](https://github.com/mapbox/mapbox-maps-android/pull/1561))\n* Avoid map content disappearing on the sides of the screen when LOD is enabled. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n\n## Bug fixes 🐞\n* Support altitude interpolation in location component, and pass through GPS altitude information from the DefaultLocationProvider. ([1478](https://github.com/mapbox/mapbox-maps-android/pull/1478))\n* Fix edge cases for renderer that could result in map not rendered. ([1538](https://github.com/mapbox/mapbox-maps-android/pull/1538))\n* Fix onAnnotationDragStarted event is still fired when annotation is not draggable. ([1552](https://github.com/mapbox/mapbox-maps-android/pull/1552))\n* Fix camera flying away when pitching. ([1560](https://github.com/mapbox/mapbox-maps-android/pull/1560))\n* Deliver style to the plugin registry on map start if a new one was loaded after map stop. ([1558](https://github.com/mapbox/mapbox-maps-android/pull/1558))\n* Fix default viewport bearing transition doesn't follow shortest path. ([1541](https://github.com/mapbox/mapbox-maps-android/pull/1541))\n* Fix `OnFpsChangedListener` listener to count number of frames rendered over the last second instead of immediate time for render call. ([1477](https://github.com/mapbox/mapbox-maps-android/pull/1477))\n* Fix `MapView.setMaximumFps` method to apply exact FPS value for rendering the map. ([1477](https://github.com/mapbox/mapbox-maps-android/pull/1477))\n* Fix Android memory leak when destroying platform view annotation manager. ([1568](https://github.com/mapbox/mapbox-maps-android/pull/1568))\n* Fix style getters for terrain, light and atmosphere resetting properties. ([1573](https://github.com/mapbox/mapbox-maps-android/pull/1573))\n* Fix possible ANR when destroying renderer. ([1567](https://github.com/mapbox/mapbox-maps-android/pull/1567))\n* Fix `MapSurface#surfaceChanged` to update dimensions for plugins. ([1575](https://github.com/mapbox/mapbox-maps-android/pull/1575))\n* Try recreate EGL surface when it throws exception. ([1589](https://github.com/mapbox/mapbox-maps-android/pull/1589))\n* Fix `MapboxMap` extension plugin functions throwing exceptions. ([1591](https://github.com/mapbox/mapbox-maps-android/pull/1591))\n* Fix concurrent modification exception when using widgets. ([1597](https://github.com/mapbox/mapbox-maps-android/pull/1597))\n* User-specified minimum and maximum zoom now correctly adjusted for map size. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Avoid placement of line labels with overlapping glyphs. Fix collision algorithm for the line labels with vertical shift. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Fix flickering when a vector layer is added on top of a raster layer. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Fix a rare case when black rectangles appear instead of the images of symbol layers. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Fix tiles disappearing when high pitch is used and atmosphere is turned on and off. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Fixes an issue which prevents the usage of tile cache when changing zoom levels. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Relax LOD requirements for maps with insets and zero terrain exaggeration. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Make CameraManager.setCamera method exception free. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Fix black holes in the globe view when edge insets are used. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Fix elevation of pole geometry when exaggerated terrain is used. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n* Fix a bug in cameraForGeometry returning incorrect camera options when pitch  > 0. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n\n## Dependencies\n\n* Bump gl-native to v10.8.0, common to v23.0.0. ([1650](https://github.com/mapbox/mapbox-maps-android/pull/1650))\n\n\n# 10.8.0-rc.1 August 24, 2022\n## Bug fixes 🐞\n* Try recreate EGL surface when it throws exception. ([1589](https://github.com/mapbox/mapbox-maps-android/pull/1589))\n* Fix `MapboxMap` extension plugin functions throwing exceptions. ([1591](https://github.com/mapbox/mapbox-maps-android/pull/1591))\n* Fix concurrent modification exception when using widgets. ([1597](https://github.com/mapbox/mapbox-maps-android/pull/1597))\n* Relax LOD requirements for maps with insets and zero terrain exaggeration, leading to more content shown in easily readable map areas. ([1623](https://github.com/mapbox/mapbox-maps-android/pull/1623))\n* Make CameraManager.setCamera method exception free. In cases when incorrect CameraOptions are provided, error would be logged. ([1623](https://github.com/mapbox/mapbox-maps-android/pull/1623))\n* Fix black holes in the globe view when edge insets are used. ([1623](https://github.com/mapbox/mapbox-maps-android/pull/1623))\n\n## Dependencies\nBump gl-native to v10.8.0-rc.1 and common to v23.0.0-rc.2. ([1623](https://github.com/mapbox/mapbox-maps-android/pull/1623))\n\n# 10.8.0-beta.1 August 11, 2022\n## Features ✨ and improvements 🏁\n* Introduce a callback to be invoked when the device compass sensors need to be re-calibrated. ([1513](https://github.com/mapbox/mapbox-maps-android/pull/1513))\n* Add support for `LocationComponentSettingsInterface.pulsingMaxRadius` to follow location's accuracy radius. ([1561](https://github.com/mapbox/mapbox-maps-android/pull/1561))\n\n## Bug fixes 🐞\n* Support altitude interpolation in location component, and pass through GPS altitude information from the DefaultLocationProvider. ([1478](https://github.com/mapbox/mapbox-maps-android/pull/1478))\n* Fix edge cases for renderer that could result in map not rendered. ([1538](https://github.com/mapbox/mapbox-maps-android/pull/1538))\n* Fix onAnnotationDragStarted event is still fired when annotation is not draggable. ([1552](https://github.com/mapbox/mapbox-maps-android/pull/1552))\n* Fix camera flying away when pitching. ([1560](https://github.com/mapbox/mapbox-maps-android/pull/1560))\n* Deliver style to the plugin registry on map start if a new one was loaded after map stop. ([1558](https://github.com/mapbox/mapbox-maps-android/pull/1558))\n* Fix default viewport bearing transition doesn't follow shortest path. ([1541](https://github.com/mapbox/mapbox-maps-android/pull/1541))\n* Fix `OnFpsChangedListener` listener to count number of frames rendered over the last second instead of immediate time for render call. ([1477](https://github.com/mapbox/mapbox-maps-android/pull/1477))\n* Fix `MapView.setMaximumFps` method to apply exact FPS value for rendering the map. ([1477](https://github.com/mapbox/mapbox-maps-android/pull/1477))\n* Fix a bug in cameraForGeometry returning incorrect camera options when pitch > 0. ([1568](https://github.com/mapbox/mapbox-maps-android/pull/1568))\n* Fix Android memory leak when destroying platform view annotation manager. ([1568](https://github.com/mapbox/mapbox-maps-android/pull/1568))\n* Fix style getters for terrain, light and atmosphere resetting properties. ([1573](https://github.com/mapbox/mapbox-maps-android/pull/1573))\n* Fix possible ANR when destroying renderer. ([1567](https://github.com/mapbox/mapbox-maps-android/pull/1567))\n* Fix elevation of pole geometry when exaggerated terrain is used. ([1574](https://github.com/mapbox/mapbox-maps-android/pull/1574))\n* Fix `MapSurface#surfaceChanged` to update dimensions for plugins. ([1575](https://github.com/mapbox/mapbox-maps-android/pull/1575))\n\n## Dependencies\nBump gl-native to v10.8.0-beta.2 and common to v23.0.0-beta.1. ([1574](https://github.com/mapbox/mapbox-maps-android/pull/1574), [1568](https://github.com/mapbox/mapbox-maps-android/pull/1568))\n\n# 10.7.0 July 29, 2022\n[Changes](https://github.com/mapbox/mapbox-maps-android/compare/android-v10.6.0...android-v10.7.0) since [Mapbox Maps SDK for Android 10.6.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/android-v10.6.0)\n## Breaking changes ⚠️\n* Remove deprecated `FollowPuckViewportStateOptions.animationDurationMs` from experimental viewport plugin. ([1421](https://github.com/mapbox/mapbox-maps-android/pull/1421))\n* Remove experimental ModelLayer APIs. ([1545](https://github.com/mapbox/mapbox-maps-android/pull/1545))\n\n# Features ✨ and improvements 🏁\n* Optimise the bearing update frequency for the location puck animator. ([1398](https://github.com/mapbox/mapbox-maps-android/pull/1398))\n* Use `orientation` model source property to update the 3D puck's bearing, as it is more efficient than updating the `model-rotation` layer property. ([1407](https://github.com/mapbox/mapbox-maps-android/pull/1407))\n* Optimize `MapboxMap.loadStyle()` to apply images and models earlier. [1378](https://github.com/mapbox/mapbox-maps-android/pull/1378)\n* Remove `MapboxExperimental` annotation from viewport plugin and promote viewport plugin as stable API. ([1425](https://github.com/mapbox/mapbox-maps-android/pull/1425))\n* Introduce `addRendererSetupErrorListener`/`removeRendererSetupErrorListener` methods for `MapView` and `MapSurface` to listen to renderer setup errors and give opportunity to control some edge cases. ([1427](https://github.com/mapbox/mapbox-maps-android/pull/1427))\n* Introduce transition properties for atmosphere and terrain. ([1451](https://github.com/mapbox/mapbox-maps-android/pull/1451))\n* Enable main thread checking on the map/style object when running applications in debug build. This utility class will crash the application if these objects are accessed from a worked thread. It's required to call these object functions on the main thread, otherwise you can hit edge case crashes. This configurations is advised but can be opted out with a Manifest metadata entry of `com.mapbox.maps.ThreadChecker` and corresponding false value. ([1316](https://github.com/mapbox/mapbox-maps-android/pull/1316)).\n* Introduce view annotation `ViewAnnotationManager.setViewAnnotationUpdateMode` / `ViewAnnotationManager.getViewAnnotationUpdateMode` API with following synchronization modes: MAP_SYNCHRONIZED (used by default) and MAP_FIXED_DELAY. ([1415](https://github.com/mapbox/mapbox-maps-android/pull/1415))\n* Introduce `FillExtrusionLayer.fillExtrusionAmbientOcclusionIntensity` and `FillExtrusionLayer.fillExtrusionAmbientOcclusionRadius` properties for FillExtrusionLayer. ([1458](https://github.com/mapbox/mapbox-maps-android/pull/1458))\n* Introduce `PointAnnotation.textLineHeight` and deprecated `PointAnnotationManager.textLineHeight`, as `text-line-height` is data-driven property now. ([1458](https://github.com/mapbox/mapbox-maps-android/pull/1458))\n* Method `MapboxMap.cameraForCoordinates` now allows to ignore edges of framing box dynamically depending on the position of the principal point of the camera. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Synchronize volatile data (like traffic tiles) in multi-map environment. Decrease network traffic. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Make uploading of large graphics data asynchronous to improve rendering speed in particular on zooming in/out. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Reuse single index buffer in symbol layer rendering. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Use shared index buffers per tile to reduce the time spent in the upload pass. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Reduce geometry on globe tile to increase rendering performance. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Improve rendering performance with deleting layer render data on a worker thread. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* The deprecated Settings API is using the same non-persistent storage as the SettingsService API from Common SDK so that all settings consolidated in a single place. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Support using `line-trim-offset` property with pure line color. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Render cache and terrain can now have mipmapping enabled to reduce aliasing. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fast ambient occlusion support for fill extrusion layer. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Add API to create tileset descriptor from a tilesets list. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Add API `OfflineManager::createTilesetDescriptor(TileDescriptorOptionsForTilesets)` to create tileset descriptor from a tilesets list. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n\n## Bug fixes 🐞\n* Fix lifecycle edge cases not being handled properly by introducing internal `ViewLifecycleOwner` to have granular control over MapView's lifecycle. ([1330](https://github.com/mapbox/mapbox-maps-android/pull/1330))\n* Fix an issue when `literal` array expression is used as output inside the `match` expression. ([1444](https://github.com/mapbox/mapbox-maps-android/pull/1444))\n* Fix skipping gesture updates resulting in slower gestures on low-end devices. ([#1440](https://github.com/mapbox/mapbox-maps-android/pull/1440))\n* Fix excessive logs appearing sometimes after `onStop` lifecycle event. ([1527](https://github.com/mapbox/mapbox-maps-android/pull/1527))\n* Fix `com.mapbox.maps.MapboxMapException` crash on style load. ([1532](https://github.com/mapbox/mapbox-maps-android/pull/1532))\n* Avoid NaN when converting screen coordinates to geographical coordinates executed as part of gesture. [1491](https://github.com/mapbox/mapbox-maps-android/pull/1491)\n* Remove android.permission.WAKE_LOCK permission from the SDK. ([1494](https://github.com/mapbox/mapbox-maps-android/pull/1494))\n* Fixes a bug when map aligned symbol layers are placed on top of other layers if draping is active. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix tile flickering with globe on rapid zooming in/out. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fixed `cameraForCoordinateBounds` method returning different values for the same input. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix setting `exaggeration-transition` property via `setStyleTerrain` API. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix SDK fragment format in turnstile user agent. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix view annotation occlusion issue when terrain enabled. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix symbol flickering issue when  `textAllowOverlap` or `iconAllowOverlap` is true. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fixes rendering issues with the globe on unsupported hardware by falling back to mercator projection. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fixed feature states not being applied on new tiles when zoom doesn't change. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Disable MapBuffer OpenGL extension on PowerVR SGX 544MP GPUs to fix incorrect usage of unimplemented methods. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix incorrect image source rendering with terrain enabled. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix possible crash bug in image processing. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix some cpu-updated symbols being invisible in globe view. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix zoom constraining issue when the input `maxZoom` is smaller than the current `minZoom` value. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix crash on calling Query Rendered Features API from renderer thread before initialising the renderer. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix tile pre-fetching for the globe map projection. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Relayout tiles after recovering from Metal rendering errors. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n* Fix a bug where changing size of the map would lead map center getting changed as well. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n\n## Dependencies\n* Bump telemetry to [v8.1.5](https://github.com/mapbox/mapbox-events-android/releases/tag/telem-8.1.5-core-5.0.2). ([1494](https://github.com/mapbox/mapbox-maps-android/pull/1494))\n  Also bumps [WorkManager 2.7.1](https://developer.android.com/jetpack/androidx/releases/work#2.7.1) that enforces compileSdk 31 or newer.\n* Bump gl-native to v10.7.0, common to 22.1.0. ([1543](https://github.com/mapbox/mapbox-maps-android/pull/1543))\n\n# 10.7.0-rc.1 July 14, 2022\n## Features ✨ and improvements 🏁\n* Reuse single index buffer in symbol layer rendering. ([1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n* Use shared index buffers per tile to reduce the time spent in the upload pass. ([1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n\n## Bug fixes 🐞\n* Remove android.permission.WAKE_LOCK permission from the SDK. ([1494](https://github.com/mapbox/mapbox-maps-android/pull/1494))\n* Fix setting 'exaggeration-transition' property via 'setStyleTerrain' API. ([1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n* Fix SDK fragment format in turnstile useragent. ([1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n* Fix view annotation occlusion issue when Terrain enabled. ([1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n* Fix symbol flickering issue when 'textAllowOverlap' or 'iconAllowOverlap' is true. ([1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n* Fixes rendering issues with the globe on unsupported hardware by falling back to mercator projection. ([1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n* Fixed feature states not being applied on new tiles when zoom doesn't change. ([1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n* Disable MapBuffer OpenGL extension on PowerVR SGX 544MP GPUs to fix incorrect usage of unimplemented methods. ([1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n* Avoid NaN when converting screen coordinates to geographical coordinates executed as part of gesture. [#1491](https://github.com/mapbox/mapbox-maps-android/pull/1491)\n\n## Dependencies\n* Bump telemetry to [v8.1.5](https://github.com/mapbox/mapbox-events-android/releases/tag/telem-8.1.5-core-5.0.2). ([#1494](https://github.com/mapbox/mapbox-maps-android/pull/1494))\n  Also bumps [WorkManager 2.7.1](https://developer.android.com/jetpack/androidx/releases/work#2.7.1) that enforces compileSdk 31 or newer.\n* Bump gl-native to v10.7.0-rc.1, common to 22.1.0-rc.1. ([#1497](https://github.com/mapbox/mapbox-maps-android/pull/1497))\n\n# 10.7.0-beta.1 June 29, 2022\n## Breaking changes ⚠️\n* Remove deprecated `FollowPuckViewportStateOptions.animationDurationMs` from experimental viewport plugin. ([1421](https://github.com/mapbox/mapbox-maps-android/pull/1421))\n\n## Features ✨ and improvements 🏁\n* Optimise the bearing update frequency for the location puck animator. ([1398](https://github.com/mapbox/mapbox-maps-android/pull/1398))\n* Use `orientation` model source property to update the 3D puck's bearing, as it is more efficient than updating the `model-rotation` layer property. ([1407](https://github.com/mapbox/mapbox-maps-android/pull/1407))\n* Optimize `MapboxMap.loadStyle()` to apply images and models earlier. [#1378](https://github.com/mapbox/mapbox-maps-android/pull/1378)\n* Remove `MapboxExperimental` annotation from viewport plugin and promote viewport plugin as stable API. ([1425](https://github.com/mapbox/mapbox-maps-android/pull/1425))\n* Introduce `addRendererSetupErrorListener`/`removeRendererSetupErrorListener` methods for `MapView` and `MapSurface` to listen to renderer setup errors and give opportunity to control some edge cases. ([1427](https://github.com/mapbox/mapbox-maps-android/pull/1427))\n* Introduce transition properties for atmosphere and terrain. ([1451](https://github.com/mapbox/mapbox-maps-android/pull/1451))\n* Enable main thread checking on the map/style object when running applications in debug build. This utility class will crash the application if these objects are accessed from a worked thread. It's required to call these object functions on the main thread, otherwise you can hit edge case crashes. This configurations is advised but can be opted out with a Manifest metadata entry of `com.mapbox.maps.ThreadChecker` and corresponding false value. ([#1316](https://github.com/mapbox/mapbox-maps-android/pull/1316)).\n* Introduce view annotation `ViewAnnotationManager.setViewAnnotationUpdateMode` / `ViewAnnotationManager.getViewAnnotationUpdateMode` API with following synchronization modes: MAP_SYNCHRONIZED (used by default) and MAP_FIXED_DELAY. ([1415](https://github.com/mapbox/mapbox-maps-android/pull/1415))\n* Reduce geometry on globe tile to increase rendering performance. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Improve rendering performance with deleting layer render data on a worker thread. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Support using `line-trim-offset` property with pure line color. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Render cache and Terrain can now have mipmapping enabled to reduce aliasing. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Fast ambient occlusion support for fill extrusion layer. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Refactor view annotation implementation to align map and annotation movement better when camera changes. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Add API `OfflineManager::createTilesetDescriptor(TileDescriptorOptionsForTilesets)` to create tileset descriptor from a tilesets list. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Introduce `FillExtrusionLayer.fillExtrusionAmbientOcclusionIntensity` and `FillExtrusionLayer.fillExtrusionAmbientOcclusionRadius` properties for FillExtrusionLayer. ([1458](https://github.com/mapbox/mapbox-maps-android/pull/1458))\n* Introduce `PointAnnotation.textLineHeight` and deprecated `PointAnnotationManager.textLineHeight`, as `text-line-height` is data-driven property now. ([1458](https://github.com/mapbox/mapbox-maps-android/pull/1458))\n\n## Bug fixes 🐞\n* Fix lifecycle edge cases not being handled properly by introducing internal `ViewLifecycleOwner` to have granular control over MapView's lifecycle. ([1330](https://github.com/mapbox/mapbox-maps-android/pull/1330))\n* Fix an issue when `literal` array expression is used as output inside the `match` expression. ([1444](https://github.com/mapbox/mapbox-maps-android/pull/1444))\n* Fix skipping gesture updates resulting in slower gestures on low-end devices. ([#1440](https://github.com/mapbox/mapbox-maps-android/pull/1440))\n* Fix incorrect image source rendering with terrain enabled. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Fix possible crash bug in image processing. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Fix some cpu-updated symbols being invisible in globe view. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Add support for terrain transition properties. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Fix zoom constraining issue when the input 'maxZoom' is smaller than the current 'minZoom' value. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Fix crash on calling Query Rendered Features API from renderer thread before initialising the renderer. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Fix tile pre-fetching for the globe map projection. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n* Fix a bug where changing size of the map would lead map center getting changed as well. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n\n## Dependencies\n* Bump gl-native to v10.7.0-beta.1, common to 22.1.0-beta.1. ([#1462](https://github.com/mapbox/mapbox-maps-android/pull/1462))\n\n# 10.6.0 - June 16, 2022\n[Changes](https://github.com/mapbox/mapbox-maps-android/compare/android-v10.5.0...android-v10.6.0) since [Mapbox Maps SDK for Android 10.5.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/android-v10.5.0)\n## Breaking changes ⚠️\n* Remove deprecated (since `v10.5.0`) experimental methods `MapboxMap.setMapProjection`/`MapboxMap.getMapProjection`. Those methods should be replaced with setting projection as part of Style DSL to achieve the same behavior. ([1420](https://github.com/mapbox/mapbox-maps-android/pull/1420))\n\n## Features ✨ and improvements 🏁\n* Enable support for incremental annotation processing. ([#1323](https://github.com/mapbox/mapbox-maps-android/pull/1323))\n* Make use of non-deprecated common Mapbox logger. ([#1327](https://github.com/mapbox/mapbox-maps-android/pull/1327))\n* Expose factory methods for high-level camera animators. ([#1338](https://github.com/mapbox/mapbox-maps-android/pull/1338))\n* Introduce map atmosphere and fog. Setting atmosphere and fog supports Style DSL as well. ([#1344](https://github.com/mapbox/mapbox-maps-android/pull/1344))\n* Introduce experimental 3D model support. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Use a single shared buffer across all globe tiles to increase globe rendering performance. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Re-introduce partial tile loading feature that decreases map load times. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* The `TilesetDescriptorOptions.pixelRatio` parameter is now passed to the TileStore and considered for the raster tile pack loading. This enables loading of a raster tilepacks for retina displays. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Introduce pinchScrollEnabled configuration to enable/disable 2-finger map panning, default to true. ([#1343](https://github.com/mapbox/mapbox-maps-android/pull/1343))\n* Re-throw native exceptions `jni::PendingJavaException` as readable Java exceptions with detailed exception text. ([#1363](https://github.com/mapbox/mapbox-maps-android/pull/1363))\n* Add static `MapView.isTerrainRenderingSupported()` method to validate if 3D terrain rendering is supported on given device. ([1368](https://github.com/mapbox/mapbox-maps-android/pull/1368))\n* Optimize `MapboxMap.loadStyle()` to apply styling properties earlier. [#1362](https://github.com/mapbox/mapbox-maps-android/pull/1362)\n* Update SDK name in attribution action sheet. ([1375](https://github.com/mapbox/mapbox-maps-android/pull/1375))\n* Introduce experimental ModelLayer API to render 3D models on the map. ([#1369](https://github.com/mapbox/mapbox-maps-android/pull/1369))\n* Minimise tiles relayout on camera zooming with globe view. Improve the overall performance and reduce latency of the cached tiles appearance. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Add minimum and maximum range check for sky layer property `sky-atmosphere-sun` and `sky-gradient-center`. If the input is invalid, the default property value will be used. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Share render data between vector render tiles referring to the same logical tile. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Reduce geometry on globe tile to increase rendering performance. ([#1432](https://github.com/mapbox/mapbox-maps-android/pull/1432))\n\n## Bug fixes 🐞\n* Enable two finger pan gesture. ([#1280](https://github.com/mapbox/mapbox-maps-android/pull/1280))\n* Fix a bug that scale bar is shorter than it should be; trigger `invalidateScaleBar` while updating settings to make scale keep the latest status. ([#1336](https://github.com/mapbox/mapbox-maps-android/pull/1336))\n* Keep the original animator owner for `CameraAnimationsPlugin.playAnimatorsTogether` and `CameraAnimationsPlugin.playAnimatorsSequentially`. ([#1345](https://github.com/mapbox/mapbox-maps-android/pull/1345))\n* Fix for momentary appearing of a lower zoom level tile labels during camera movement.  ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Fix for location indicator not being rendered at the horizon when terrain is enabled. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Fix for loading gltf models with interleaved buffers. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Fix a bug that `line-trim-offset` input may lose precision via shader calculation. ([#1359](https://github.com/mapbox/mapbox-maps-android/pull/1359))\n* Add mercator scale factor to 3D location puck, so that the 3D puck size won't increase as latitude increases. ([#1350](https://github.com/mapbox/mapbox-maps-android/pull/1350)\n* Fix a crash due to invalid focal point when panning the map. ([#1364](https://github.com/mapbox/mapbox-maps-android/pull/1364))\n* Fix compass is not showing in \"edge-to-edge\" mode. ([1391](https://github.com/mapbox/mapbox-maps-android/pull/1391))\n* Fix an unexpected request update delay for tiles taken from in-memory cache when minimumTileUpdateInterval is set. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix a rare bug where some tiles would not show up correctly on globe. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix a bug where features could be queried without cursor intersecting the globe. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix view annotations disappearing on the globe. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix symbols ignoring both collision and placement on the globe. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Add anti-aliasing on the globe on low zoom levels. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix globe controls when map orientation is something else than \"north\". ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix circle and heatmap layers not being aligned with globe's surface. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Optimise the frequency to update location layer's visibility. ([1399](https://github.com/mapbox/mapbox-maps-android/pull/1399))\n* Fix the delay in the first appearance of the location puck. ([1403](https://github.com/mapbox/mapbox-maps-android/pull/1403))\n* Remove `android.permission.GET_TASKS` permission from the SDK. ([1430](https://github.com/mapbox/mapbox-maps-android/pull/1430))\n* Fix lag during night/day style switching when globe is enabled. ([#1432](https://github.com/mapbox/mapbox-maps-android/pull/1432))\n* Fix crash on globe symbol placement that happens during style change. ([#1432](https://github.com/mapbox/mapbox-maps-android/pull/1432))\n* Fix incorrect image source rendering with terrain enabled. ([#1432](https://github.com/mapbox/mapbox-maps-android/pull/1432))\n* Fix in-memory tile cache for non-geometry tiles when the map projection changes. Before, the tiles cached while the previous projection was active could not be used with the new projection active. ([#1432](https://github.com/mapbox/mapbox-maps-android/pull/1432))\n\n## Dependencies\n* Bump Mapbox Android base library to v0.8.0. ([#1323](https://github.com/mapbox/mapbox-maps-android/pull/1323))\n* Bump gl-native to v10.6.0, common to 22.0.0. ([#1432](https://github.com/mapbox/mapbox-maps-android/pull/1432))\n* Bump telemetry to [v8.1.3](https://github.com/mapbox/mapbox-events-android/releases/tag/telem-8.1.3-core-5.0.2), android core to [5.0.2](https://github.com/mapbox/mapbox-events-android/releases/tag/core-5.0.2). ([1430](https://github.com/mapbox/mapbox-maps-android/pull/1430))\n\n# 10.6.0-rc.1 June 2, 2022\n\n## Features ✨ and improvements 🏁\n* Minimise tiles relayout on camera zooming with globe view. Improve the overall performance and reduce latency of the cached tiles appearance. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Add minimum and maximum range check for sky layer property `sky-atmosphere-sun` and `sky-gradient-center`. If the input is invalid, the default property value will be used. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Share render data between vector render tiles referring to the same logical tile. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n\n## Bug fixes 🐞\n* Fix compass is not showing in \"edge-to-edge\" mode. ([1391](https://github.com/mapbox/mapbox-maps-android/pull/1391))\n* Fix an unexpected request update delay for tiles taken from in-memory cache when minimumTileUpdateInterval is set. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix a rare bug where some tiles would not show up correctly on globe. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix a bug where features could be queried without cursor intersecting the globe. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix view annotations disappearing on the globe. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix symbols ignoring both collision and placement on the globe. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Add anti-aliasing on the globe on low zoom levels. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix globe controls when map orientation is something else than \"north\". ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n* Fix circle and heatmap layers not being aligned with globe's surface. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n\n## Dependencies\n* Bump gl-native to v10.6.0-rc.1, common to 22.0.0-rc.2. ([#1396](https://github.com/mapbox/mapbox-maps-android/pull/1396))\n\n# 10.6.0-beta.2 May 25, 2022\n\n## Features ✨ and improvements 🏁\n* Update SDK name in attribution action sheet. ([1375](https://github.com/mapbox/mapbox-maps-android/pull/1375))\n* Introduce experimental ModelLayer API to render 3D models on the map. ([#1369](https://github.com/mapbox/mapbox-maps-android/pull/1369))\n\n# 10.6.0-beta.1 May 19, 2022\n\n## Features ✨ and improvements 🏁\n* Enable support for incremental annotation processing. ([#1323](https://github.com/mapbox/mapbox-maps-android/pull/1323))\n* Make use of non-deprecated common Mapbox logger. ([#1327](https://github.com/mapbox/mapbox-maps-android/pull/1327))\n* Expose factory methods for high-level camera animators. ([#1338](https://github.com/mapbox/mapbox-maps-android/pull/1338))\n* Introduce map atmosphere and fog. Setting atmosphere and fog supports Style DSL as well. ([#1344](https://github.com/mapbox/mapbox-maps-android/pull/1344))\n* Introduce experimental 3D model support. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Use a single shared buffer across all globe tiles to increase globe rendering performance. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Re-introduce partial tile loading feature that decreases map load times. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* The `TilesetDescriptorOptions.pixelRatio` parameter is now passed to the TileStore and considered for the raster tile pack loading. This enables loading of a raster tilepacks for retina displays. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Introduce pinchScrollEnabled configuration to enable/disable 2-finger map panning, default to true. ([#1343](https://github.com/mapbox/mapbox-maps-android/pull/1343))\n* Re-throw native exceptions `jni::PendingJavaException` as readable Java exceptions with detailed exception text. ([#1363](https://github.com/mapbox/mapbox-maps-android/pull/1363))\n* Add static `MapView.isTerrainRenderingSupported()` method to validate if 3D terrain rendering is supported on given device. ([1368](https://github.com/mapbox/mapbox-maps-android/pull/1368))\n* Optimize `MapboxMap.loadStyle()` to apply styling properties earlier. [#1362](https://github.com/mapbox/mapbox-maps-android/pull/1362)\n\n## Bug fixes 🐞\n* Enable two finger pan gesture. ([#1280](https://github.com/mapbox/mapbox-maps-android/pull/1280))\n* Fix a bug that scale bar is shorter than it should be; trigger `invalidateScaleBar` while updating settings to make scale keep the latest status. ([#1336](https://github.com/mapbox/mapbox-maps-android/pull/1336))\n* Keep the original animator owner for `CameraAnimationsPlugin.playAnimatorsTogether` and `CameraAnimationsPlugin.playAnimatorsSequentially`. ([#1345](https://github.com/mapbox/mapbox-maps-android/pull/1345))\n* Fix for momentary appearing of a lower zoom level tile labels during camera movement.  ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Fix for location indicator not being rendered at the horizon when terrain is enabled. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Fix for loading gltf models with interleaved buffers. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351))\n* Fix a bug that `line-trim-offset` input may lose precision via shader calculation. ([#1359](https://github.com/mapbox/mapbox-maps-android/pull/1359))\n* Add mercator scale factor to 3D location puck, so that the 3D puck size won't increase as latitude increases. ([#1350](https://github.com/mapbox/mapbox-maps-android/pull/1350)\n* Fix a crash due to invalid focal point when panning the map. ([#1364](https://github.com/mapbox/mapbox-maps-android/pull/1364))\n\n## Dependencies\n* Bump Mapbox Android base library to v0.8.0. ([#1323](https://github.com/mapbox/mapbox-maps-android/pull/1323))\n* Bump gl-native to v10.6.0-beta.3, common to 22.0.0-beta.1. ([#1351](https://github.com/mapbox/mapbox-maps-android/pull/1351), [#1354](https://github.com/mapbox/mapbox-maps-android/pull/1354), [#1359](https://github.com/mapbox/mapbox-maps-android/pull/1359))\n\n# 10.4.4 May 12, 2022\n\n### Bug fixes 🐞\n* Fix NaN latitude native crash rarely happening during `MapboxMap#flyTo`. ([#1271](https://github.com/mapbox/mapbox-maps-android/pull/1271))\n\n# 10.5.0 May 4, 2022\n\n## Features ✨ and improvements 🏁\n* Make map projection part of the style-spec and introduce new methods `StyleInterface.setProjection` / `StyleInterface.getProjection`. Setting projection supports Style DSL as well. ([#1255](https://github.com/mapbox/mapbox-maps-android/pull/1255), [#1314](https://github.com/mapbox/mapbox-maps-android/pull/1314))\n* Automatic transition between the globe and mercator projection updated to appear visually more subtle. ([#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315))\n* Avoid repeated tile loading from network (or repeated tile decompression when the tile is fetched from the cache database) and repeated vector tile data allocation and parsing when loading render tiles referring to the same logical tile. ([#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315))\n* Switch to use shader to calculate the 'line-trim-offset' property update. ([#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315))\n* Layer properties transitions performance improved if the layer is transitioning to the same constant value or if transitioning from/to data-driven property. ([#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315))\n* New line layer paint property introduced: '{\"line-trim-offset\", [trim-start, trim-end]}', to take the line trim-off percentage range based on the whole line range [0.0, 1.0]. The property will only be effective when 'line-gradient' property is set. The line part between [trim-start, trim-end] will be marked as transparent to make a line gradient a vanishing effect. If either 'trim-start' or 'trim-end' offset is out of valid range, the default range [0.0, 0.0] will be set. ([#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315))\n* Globe view controls revamped for more intuitive interaction with touch controls. ([#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315))\n* OfflineRegion::getStatus() API added to get the completion status and the local size of the existing legacy offline regions. ([#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315))\n* Refactor all Mapbox logs so that Logcat tag will always be 'Mapbox' allowing easier filtering. Previous log tag will become part of the log message now. ([#1276](https://github.com/mapbox/mapbox-maps-android/pull/1276))\n* Optimize how plugins handle settings changes. Call `applySettings` only when settings value changes. ([#1189](https://github.com/mapbox/mapbox-maps-android/pull/1189))\n* Add `MapboxMap.isValid()` and `Style.isValid()` methods. `MapboxMap` becomes invalid when `MapView.onDestroy()` is called. `Style` becomes invalid when `MapView.onDestroy()` is called or new style has been loaded. Accessing any method on invalid object will print an error log. Also unsubscribe map observers automatically when `MapboxMap.onDestroy()` is invoked. ([1193](https://github.com/mapbox/mapbox-maps-android/pull/1193)) ([1202](https://github.com/mapbox/mapbox-maps-android/pull/1202) ([1230](https://github.com/mapbox/mapbox-maps-android/pull/1230)) ([1241](https://github.com/mapbox/mapbox-maps-android/pull/1241)))\n* Add `MapboxMap.coordinateBoundsForCameraUnwrapped` method for API consistency. ([1222](https://github.com/mapbox/mapbox-maps-android/pull/1222))\n* Add `LocationIndicatorLayer.bearingTransition` API to control transition of bearing property. ([1207](https://github.com/mapbox/mapbox-maps-android/pull/1207))\n* Add `MapboxConcurrentGeometryModificationException` with detailed information instead of `ConcurrentModificationException` that is thrown when GeoJson data is mutated. ([1248](https://github.com/mapbox/mapbox-maps-android/pull/1248))\n* Introduce `line-trim-offset` property for LineLayer. ([1252](https://github.com/mapbox/mapbox-maps-android/pull/1252))\n* Deprecate `FollowPuckViewportStateOptions.animationDurationMs`, the initial transition will be handled properly by the Viewport plugin internally. ([1256](https://github.com/mapbox/mapbox-maps-android/pull/1256), [1261](https://github.com/mapbox/mapbox-maps-android/pull/1261), [1262](https://github.com/mapbox/mapbox-maps-android/pull/1262))\n* Mark `MapView.viewAnnotationManager` as non-experimental meaning View Annotation API will not have breaking changes in upcoming minor releases. ([1260](https://github.com/mapbox/mapbox-maps-android/pull/1260))\n\n## Bug fixes 🐞\n* Fix geojson missing updates with persistent layer after style change. ([#1324](https://github.com/mapbox/mapbox-maps-android/pull/1324))\n* Fix render tasks being skipped when creating the map that could lead to missing tiles. ([#1304](https://github.com/mapbox/mapbox-maps-android/pull/1304))\n* The legacy offline region observer instance is not unnecessarily retained inside the engine. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Fix a bug of querying rendered feature for circle layer with map-pitch-alignment when the pitch is zero. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Fix a bug where zooming was not possible with terrain enabled and exaggeration 0. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Fix an issue where internal hsla() function was converted to an invalid rgba expression. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Fix a bug that 'line-trim-offset' calculation did not property cover 'round' or 'square' line cap in line ends. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Dispatched in-flight events will not be delivered if 'unsubscribe' is called before an event is delivered. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Fix an issue where some of the visible tiles could be erroneously culled during transition between globe and mercator projection. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Fixes issues where camera appears under terrain, or map gets bumpy repositioning after exaggeration change. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Disable terrain rendering if GPU does not support Vertex Texture Fetch. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Fixed a bug that occasionally prevents symbols from loading. [#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315)\n* Fixed a bug that causes line layers to flicker. [#1325](https://github.com/mapbox/mapbox-maps-android/pull/1325)\n* Fix NaN latitude native crash rarely happening during `MapboxMap.flyTo`. ([#1271](https://github.com/mapbox/mapbox-maps-android/pull/1271))\n* Limit `MapboxMap.pixelForCoordinate` to the bounds of MapView. ([#1226](https://github.com/mapbox/mapbox-maps-android/pull/1226))\n* Fix PolygonAnnotation and PolylineAnnotation being distorted while dragging with 3D terrain. ([#1223](https://github.com/mapbox/mapbox-maps-android/pull/1223))\n\n## Dependencies\n* Bump gl-native to v10.5.1, mapbox-common to v21.3.1 ([#1315](https://github.com/mapbox/mapbox-maps-android/pull/1315), [#1325](https://github.com/mapbox/mapbox-maps-android/pull/1325))\n\n# 10.4.3 April 27, 2022\n\n### Bug fixes 🐞\n* Fix render tasks being skipped when creating the map that could lead to missing tiles. ([#1304](https://github.com/mapbox/mapbox-maps-android/pull/1304))\n\n# 10.5.0-rc.1 April 20, 2022\n## Features ✨ and improvements 🏁\n* Refactor all Mapbox logs so that Logcat tag will always be 'Mapbox' allowing easier filtering. Previous log tag will become part of the log message now. ([#1276](https://github.com/mapbox/mapbox-maps-android/pull/1276))\n* Avoid repeated tile loading from network (or repeated tile decompression when the tile is fetched from the cache database) and repeated vector tile data allocation and parsing when loading render tiles referring to the same logical tile. ([#1282](https://github.com/mapbox/mapbox-maps-android/pull/1282))\n* Switch to use shader to calculate the 'line-trim-offset' property update. ([#1282](https://github.com/mapbox/mapbox-maps-android/pull/1282))\n\n## Bug fixes 🐞\n* Fix issue where internal hsla() function was converted to an invalid rgba expression. ([#1282](https://github.com/mapbox/mapbox-maps-android/pull/1282))\n* Fix a bug that 'line-trim-offset' calculation did not property cover 'round' or 'square' line cap in line ends. ([#1282](https://github.com/mapbox/mapbox-maps-android/pull/1282))\n* Fix NaN latitude native crash rarely happening during `MapboxMap#flyTo`. ([#1271](https://github.com/mapbox/mapbox-maps-android/pull/1271))\n* Limit `MapboxMap#pixelForCoordinate` to the bounds of MapView. ([#1226](https://github.com/mapbox/mapbox-maps-android/pull/1226))\n\n## Dependencies\n* Bump gl-native to v10.5.0-rc.1, mapbox-common to v21.3.0-rc.2. ([#1282](https://github.com/mapbox/mapbox-maps-android/pull/1282))\n\n# 10.4.2 April 13, 2022\n### Bug fixes 🐞\n* [tile store] Correctly decode compressed content if loaded from the cache. ([#1279](https://github.com/mapbox/mapbox-maps-android/pull/1279))\n* [tile store] Fixed issue that prevented data blobs larger than 1 MB to be transferred via the service. ([#1279](https://github.com/mapbox/mapbox-maps-android/pull/1279))\n\n# 10.5.0-beta.1 April 7, 2022\n## Breaking changes ⚠️\n* Experimental methods `MapboxMap#setMapProjection` / `MapboxMap#getMapProjection` are removed and should be replaced with `StyleInterface#setProjection` / `StyleInterface#getProjection`. Setting projection supports Style DSL as well. ([#1255](https://github.com/mapbox/mapbox-maps-android/pull/1255))\n\n## Features ✨ and improvements 🏁\n* Optimize how plugins handle settings changes. Call `applySettings` only when settings value changes. ([#1189](https://github.com/mapbox/mapbox-maps-android/pull/1189))\n* Add `MapboxMap.isValid()` and `Style.isValid()` methods. `MapboxMap` becomes invalid when `MapView.onDestroy()` is called. `Style` becomes invalid when `MapView.onDestroy()` is called or new style has been loaded. Accessing any method on invalid object will print an error log. Also unsubscribe map observers automatically when `MapboxMap.onDestroy()` is invoked. ([1193](https://github.com/mapbox/mapbox-maps-android/pull/1193)) ([1202](https://github.com/mapbox/mapbox-maps-android/pull/1202) ([1230](https://github.com/mapbox/mapbox-maps-android/pull/1230)) ([1241](https://github.com/mapbox/mapbox-maps-android/pull/1241)))\n* Add `MapboxMap#coordinateBoundsForCameraUnwrapped` method for API consistency. ([1222](https://github.com/mapbox/mapbox-maps-android/pull/1222))\n* Add `LocationIndicatorLayer.bearingTransition` API to control transition of bearing property. ([1207](https://github.com/mapbox/mapbox-maps-android/pull/1207))\n* Add `MapboxConcurrentGeometryModificationException` with detailed information instead of `ConcurrentModificationException` that is thrown when GeoJson data is mutated. ([1248](https://github.com/mapbox/mapbox-maps-android/pull/1248))\n* Introduce `line-trim-offset` property for LineLayer. ([1252](https://github.com/mapbox/mapbox-maps-android/pull/1252))\n* Deprecate `FollowPuckViewportStateOptions.animationDurationMs`, the initial transition will be handled properly by the Viewport plugin internally. ([1256](https://github.com/mapbox/mapbox-maps-android/pull/1256), [1261](https://github.com/mapbox/mapbox-maps-android/pull/1261), [1262](https://github.com/mapbox/mapbox-maps-android/pull/1262))\n* Mark `MapView#viewAnnotationManager` as non-experimental meaning View Annotation API will not have breaking changes in upcoming minor releases. ([1260](https://github.com/mapbox/mapbox-maps-android/pull/1260))\n* Map render call optimized further by further reducing computational overhead. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* Layer properties transitions performance improved if the layer is transitioning to the same constant value or if transitioning from/to data-driven property. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* New line layer paint property introduced: '{\"line-trim-offset\", [trim-start, trim-end]}', to take the line trim-off percentage range based on the whole line range [0.0, 1.0]. The property will only be effective when 'line-gradient' property is set. The line part between [trim-start, trim-end] will be marked as transparent to make a line gradient a vanishing effect. If either 'trim-start' or 'trim-end' offset is out of valid range, the default range [0.0, 0.0] will be set. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* Globe view controls revamped for more intuitive interaction with touch controls. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* OfflineRegion::getStatus() API added to get the completion status and the local size of the existing legacy offline regions. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* Automatic transition between the globe and mercator projection updated to appear visually more subtle. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n\n## Bug fixes 🐞\n* Dispatched in-flight events will not be delivered if 'unsubscribe' is called before an event is delivered. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* Transitions between globe and mercator projection do not cull tiles incorrectly anymore. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* Map LOD disabled for camera pitch less than 30 degrees to avoid map content missing on maps with insets. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* Terrain-related camera issues fixed, previously making it appear under terrain, or incorrectly repositioned after exaggeration change. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* Terrain rendering disabled on GPUs not supporting Vertex Texture Fetch. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* Fixed a bug that occasionally prevented symbols from loading. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n* Fix PolygonAnnotation and PolylineAnnotation being distorted while dragging with 3D terrain. ([#1223](https://github.com/mapbox/mapbox-maps-android/pull/1223))\n\n## Dependencies\n* Bump gl-native to v10.5.0-beta.1, mapbox-common to v21.3.0-beta.2. ([#1244](https://github.com/mapbox/mapbox-maps-android/pull/1244))\n\n# 10.4.1 April 7, 2022\n## Bug fixes 🐞\n* Re-introduce the API to get the status of the existing offline regions, so that the clients can get the completion status and the local size of the existing legacy offline regions. ([#1263](https://github.com/mapbox/mapbox-maps-android/pull/1263))\n* Fix a bug that occasionally prevents symbols from loading. ([#1263](https://github.com/mapbox/mapbox-maps-android/pull/1263))\n\n## Dependencies\n* Bump gl-native to v10.4.2 ([#1263](https://github.com/mapbox/mapbox-maps-android/pull/1263))\n\n# 10.4.0 March 23, 2022\n[Changes](https://github.com/mapbox/mapbox-maps-android/compare/android-v10.3.0...android-v10.4.0) since [Mapbox Maps SDK for Android 10.3.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/android-v10.3.0)\n## Features ✨ and improvements 🏁\n* Refactor scheduling logic for render thread improving rendering performance. ([#1068](https://github.com/mapbox/mapbox-maps-android/pull/1068))\n* Add LocationCompassEngine and accuracy radius support for location component plugin. ([#1016](https://github.com/mapbox/mapbox-maps-android/pull/1016)) ([#1131](https://github.com/mapbox/mapbox-maps-android/pull/1131))\nInorder to avoid breaking api changes, interface location2 is introduced for updating `puckBearingSource`, `puckBearingEnabled` and `showAccuracyRing` properties.\n```\n// Change the puck bearing source.\nmapView.location2.puckBearingSource = PuckBearingSource.HEADING\nmapView.location2.puckBearingSource = PuckBearingSource.COURSE\n// Change the visibility of accuracy ring.\nmapView.location2.showAccuracyRing = true\nmapView.location2.showAccuracyRing = false\n// Change the puck bearing enabled.\nmapView.location2.puckBearingEnabled = true\nmapView.location2.puckBearingEnabled = false\n```\n* Add support for custom widgets rendered on top of the map. ([#1036](https://github.com/mapbox/mapbox-maps-android/pull/1036))\n* Expose DefaultLocationProvider as public class. ([#1168](https://github.com/mapbox/mapbox-maps-android/pull/1168))\n* Add new methods to View Annotation API: `ViewAnnotationManager.removeAllViewAnnotations()` and `ViewAnnotationManager.addOnViewAnnotationUpdatedListener(listener: OnViewAnnotationUpdatedListener)` / `ViewAnnotationManager.removeOnViewAnnotationUpdatedListener(listener: OnViewAnnotationUpdatedListener)`. ([#1165](https://github.com/mapbox/mapbox-maps-android/pull/1165))\n* Add optional `TransitionOptions` parameter to `MapboxMap.loadStyleUri`, `MapboxMap.loadStyleJson`, `MapboxMap.loadStyle` to apply transition to style being loaded. ([#1174](https://github.com/mapbox/mapbox-maps-android/pull/1174))\n* Rendering performance improvements. ([1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n* Add support for 3D terrain tilepacks. ([1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n* Add `Style#hasStyleImage` method that checks whether an image is in the style. ([1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n\n## Bug fixes 🐞\n* Fix skipping / crashing user events scheduled on a render thread with `MapView#queueEvent`. ([#1068](https://github.com/mapbox/mapbox-maps-android/pull/1068))\n* Fix location puck not being shown if map is created without initial style (e.g. MapInitOptions.styleUri == null) and then loaded asynchronously. ([#1114](https://github.com/mapbox/mapbox-maps-android/pull/1114))\n* Fix crash within location plugin that happens when style is reloaded simultaneously with location plugin updates. ([#1112](https://github.com/mapbox/mapbox-maps-android/pull/1112))\n* Fix memory leak in location component. ([#1093](https://github.com/mapbox/mapbox-maps-android/pull/1093), [#1172](https://github.com/mapbox/mapbox-maps-android/pull/1172))\n* Fix bearing of the puck reseted on settings change. ([#1144](https://github.com/mapbox/mapbox-maps-android/pull/1144))\n* Fix an issue when user subscribe sdk listeners multiple times, by changing CopyOnWriteArrayList to CopyOnWriteArraySet in the sdk to hold listeners. ([1183](https://github.com/mapbox/mapbox-maps-android/pull/1183))\n* Fix an issue when label list is used within the match expression DSL. ([1204](https://github.com/mapbox/mapbox-maps-android/pull/1204))\n* Fix too small bounds returned by `Map#latLngBoundsZoomForCamera` with tilted view and `Map#latLngBoundsZoomForCameraUnwrapped` when viewing >360° longitude. ([1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n* Fix screen coordinate queries when using zero pitch and high zoom values. ([1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n* Fix crash for the case when a map event is handled by an Observer of a destructed Map. ([1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n* Fix shimmering artifact when pitched raster tiles with compressed textures are rendered. ([1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n* Avoid possible crash at program exit caused by dummy tracer accessed after the destruction. ([1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n* Clearing diffuse shaded flag for 3D puck when set by batched 3D rendering. ([1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n\n## Dependencies\n* Bump gl-native to v10.4.1, mapbox-common to v21.2.0 ([#1215](https://github.com/mapbox/mapbox-maps-android/pull/1215))\n* Update android gradle plugin to v7.0.4, gradle version to v7.0.2, Gradle licence plugin to 0.8.80, Kotlin gradle plugin to 1.5.31, Jacoco to 0.8.7. ([#1118](https://github.com/mapbox/mapbox-maps-android/pull/1118))\n\n# 10.4.0-rc.1 March 9, 2022\n\n## Bug fixes 🐞\n* Fix an issue when user subscribe sdk listeners multiple times, by changing CopyOnWriteArrayList to CopyOnWriteArraySet in the sdk to hold listeners. ([1183](https://github.com/mapbox/mapbox-maps-android/pull/1183))\n* Fix an issue when label list is used within the match expression DSL. ([1204](https://github.com/mapbox/mapbox-maps-android/pull/1204))\n* Fixed an issue where small bounds returned by Map::latLngBoundsZoomForCamera with tilted view and Map::latLngBoundsZoomForCameraUnwrapped when viewing >360° longitude. ([#1208](https://github.com/mapbox/mapbox-maps-android/pull/1208))\n\n## Dependencies\n* Bump gl-native to 10.4.0-rc.1, mapbox-common to v21.2.0-rc.1 ([#1208](https://github.com/mapbox/mapbox-maps-android/pull/1208))\n\n# 10.4.0-beta.1 February 24, 2022\n\n## Features ✨ and improvements 🏁\n* Refactor scheduling logic for render thread improving rendering performance. ([#1068](https://github.com/mapbox/mapbox-maps-android/pull/1068))\n* Add LocationCompassEngine and accuracy radius support for location component plugin. ([#1016](https://github.com/mapbox/mapbox-maps-android/pull/1016)) ([#1131](https://github.com/mapbox/mapbox-maps-android/pull/1131))\nInorder to avoid breaking api changes, interface location2 is introduced for updating `puckBearingSource`, `puckBearingEnabled` and `showAccuracyRing` properties.\n```\n// Change the puck bearing source.\nmapView.location2.puckBearingSource = PuckBearingSource.HEADING\nmapView.location2.puckBearingSource = PuckBearingSource.COURSE\n// Change the visibility of accuracy ring.\nmapView.location2.showAccuracyRing = true\nmapView.location2.showAccuracyRing = false\n// Change the puck bearing enabled.\nmapView.location2.puckBearingEnabled = true\nmapView.location2.puckBearingEnabled = false\n```\n* Add support for custom widgets rendered on top of the map. ([#1036](https://github.com/mapbox/mapbox-maps-android/pull/1036))\n* Expose DefaultLocationProvider as public class. ([#1168](https://github.com/mapbox/mapbox-maps-android/pull/1168))\n* Add new methods to View Annotation API: `ViewAnnotationManager.removeAllViewAnnotations()` and `ViewAnnotationManager.addOnViewAnnotationUpdatedListener(listener: OnViewAnnotationUpdatedListener)` / `ViewAnnotationManager.removeOnViewAnnotationUpdatedListener(listener: OnViewAnnotationUpdatedListener)`. ([#1165](https://github.com/mapbox/mapbox-maps-android/pull/1165))\n* Improve rendering performance by coalescing map updates when possible. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Add `StyleManager::hasStyleImage` API that checks whether an image is in the style or not. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Improve Snapshotter performance by using a lightweight scheduler instead of platform runloop. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Map now waits on sprite sheet loading before rendering. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Improve map rendering performance by avoiding calculations for all the non-transitional style layer paint properties. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Enable using of tile pack scheme from TileJSON. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Improve map rendering performance by decreasing de/allocations in map placement code. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Avoid style layer properties transition calculation when `TransitionOptions::duration` is set to 0. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Enable tile packs for DEM terrain tiles, it includes both Offline API and `TileStoreUsageMode::ReadAndUpdate` resource option. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Render tiles with partial content while the glyph dependencies are loading. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Canonicalize URLs and enable Offline API usage for the 3dtiles/v1 tiles. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Add optional `TransitionOptions` parameter to `MapboxMap.loadStyleUri`, `MapboxMap.loadStyleJson`, `MapboxMap.loadStyle` to apply transition to style being loaded. ([#1174](https://github.com/mapbox/mapbox-maps-android/pull/1174))\n\n## Bug fixes 🐞\n* Fix skipping / crashing user events scheduled on a render thread with `MapView#queueEvent`. ([#1068](https://github.com/mapbox/mapbox-maps-android/pull/1068))\n* Fix location puck not being shown if map is created without initial style (e.g. MapInitOptions.styleUri == null) and then loaded asynchronously. ([#1114](https://github.com/mapbox/mapbox-maps-android/pull/1114))\n* Fix crash within location plugin that happens when style is reloaded simultaneously with location plugin updates. ([#1112](https://github.com/mapbox/mapbox-maps-android/pull/1112))\n* Fix memory leak in location component. ([#1093](https://github.com/mapbox/mapbox-maps-android/pull/1093), [#1172](https://github.com/mapbox/mapbox-maps-android/pull/1172))\n* Fix screen coordinate queries when using zero pitch and high zoom values. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Avoid possible crash at program exit caused by dummy tracer accessed after the destruction. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Fix crash for the case when a map event is handled by an Observer of a destructed map. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Fix shimmering artifact when pitched raster tiles with compressed textures are rendered. ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160))\n* Fix bearing of the puck reseted on settings change. ([#1144](https://github.com/mapbox/mapbox-maps-android/pull/1144))\n\n## Dependencies\n* Bump gl-native to 10.4.0-beta.2, mapbox-common to v21.2.0-beta.1 ([#1160](https://github.com/mapbox/mapbox-maps-android/pull/1160), [#1175](https://github.com/mapbox/mapbox-maps-android/pull/1175))\n* Update android gradle plugin to v7.0.4, gradle version to v7.0.2, Gradle licence plugin to 0.8.80, Kotlin gradle plugin to 1.5.31, Jacoco to 0.8.7. ([#1118](https://github.com/mapbox/mapbox-maps-android/pull/1118))\n\n# 10.3.0 February 10, 2022\n[Changes](https://github.com/mapbox/mapbox-maps-android/compare/android-v10.2.0...android-v10.3.0) since [Mapbox Maps SDK for Android 10.2.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/android-v10.2.0)\n## Features ✨ and improvements 🏁\n* Improve performance for symbol layout rendering in continuous mode. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Introduce metadata setter API for the legacy offline region. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Optimize zooming on terrain and globe. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Thin out repeated line labels at overscaled tiles in order to avoid excessive memory usage. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Remove experimental designation from persistent layer APIs. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Avoid re-creation of the available sprites set. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Limit the delayed network request maximum time in the scheduler task queue, and thus avoid excessive memory usage. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Fill extrusion layer support for globe view. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Increase priority of a renderer thread. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Introduce viewport plugin. ([#1033](https://github.com/mapbox/mapbox-maps-android/pull/1033), [#1069](https://github.com/mapbox/mapbox-maps-android/pull/1069))\n* Add `Style#removeTerrain` method. ([#906](https://github.com/mapbox/mapbox-maps-android/pull/906))\n* Introduce ability to specify `startDelay` property as part of `mapAnimationOptions` for high-level animations. ([#932](https://github.com/mapbox/mapbox-maps-android/pull/932))\n* Deprecate map extension function to get gesture settings. ([#952](https://github.com/mapbox/mapbox-maps-android/pull/952))\n* Introduce Mapbox exceptions instead of regular runtime exceptions allowing more precise control of catching them from user's end. ([#964](https://github.com/mapbox/mapbox-maps-android/pull/964))\n* Add `tile-requests-delay` and `tile-network-requests-delay` source properties for tile requests delay. ([#960](https://github.com/mapbox/mapbox-maps-android/pull/960))\n* Expose unique annotation feature identifier that could be used to link view annotation to any annotation. ([#994](https://github.com/mapbox/mapbox-maps-android/pull/994))\n* Remove json serialization in observable extension improving overall performance by saving CPU cycles. ([#1001](https://github.com/mapbox/mapbox-maps-android/pull/1001))\n* Add wrap content dimension support for view annotations. ([#1021](https://github.com/mapbox/mapbox-maps-android/pull/1021))\n* Add extension function for location component to support show / hide arrow bearing image. ([#1012](https://github.com/mapbox/mapbox-maps-android/pull/1012))\n\n\n## Bug fixes 🐞\n* Include geometry data buffer size when calculating total size of a tile. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Fix screen coordinate queries when using zero pitch and high zoom values. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* View Annotation API: move internal Java files to the corresponding package. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Reduces drag sensitivity around and above horizon. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Erase corrupt tiles from TileStore. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Add perspective correction for non-rectangular images. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Fix rendering artifacts when compressed and un-compresed raster tiles are rendered. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Avoid creating new symbol instances if the feature is outside of tile boundaries to avoid incorrect symbol cross tile indexing. In the meanwhile, disable draping for this layer otherwise symbol will only be shown on the tile that has the symbol instance created. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105))\n* Avoid possible crash at program exit caused by dummy tracer accessed after destruction. ([#1116](https://github.com/mapbox/mapbox-maps-android/pull/1116))\n* Fix crash for the case when a map event is handled by an Observer of a destructed map. ([#1116](https://github.com/mapbox/mapbox-maps-android/pull/1116))\n* Fix an issue where 3D puck used to scale when changing coordinate bounds. ([#1067](https://github.com/mapbox/mapbox-maps-android/pull/1067))\n* Fix map not rendering on emulators when MSAA is enabled. ([#1077](https://github.com/mapbox/mapbox-maps-android/pull/1077))\n* Fix issue with map rendering when limiting max FPS. ([#1100](https://github.com/mapbox/mapbox-maps-android/pull/1100))\n* Revert \"Add LocationCompassEngine for location component (#970)\" that was introduced in v10.3.0-beta.1, as it accidentally introduced an API breaking change. ([#1115](https://github.com/mapbox/mapbox-maps-android/pull/1115))\n* Fix an issue where source attribution was not populated in attribution dialog. ([#1087](https://github.com/mapbox/mapbox-maps-android/pull/1087))\n* Fix an issue that causes transition to following viewport state not being fired when the bearing is set to constant. ([#1064](https://github.com/mapbox/mapbox-maps-android/pull/1064))\n* Fix default viewport transition's anchor point. ([#1070](https://github.com/mapbox/mapbox-maps-android/pull/1070))\n* Fix crash on destruction with ongoing tile-store downloads. ([#1071](https://github.com/mapbox/mapbox-maps-android/pull/1071))\n* Fix not allowing loading empty style uri. ([#904](https://github.com/mapbox/mapbox-maps-android/pull/904))\n* Fix black `MapView#snapshot` returned on some devices (e.g. Huawei). ([#966](https://github.com/mapbox/mapbox-maps-android/pull/966))\n* Enable drag annotation while changing the annotation to draggable on long click. ([#990](https://github.com/mapbox/mapbox-maps-android/pull/990))\n* Send turnstile events for snapshotter usage. ([#920](https://github.com/mapbox/mapbox-maps-android/pull/920))\n* Allow localizing non-mapbox street sources, align localization logic with iOS implementation. ([#968](https://github.com/mapbox/mapbox-maps-android/pull/968))\n* Remove observer after it's not needed anymore from map renderer resulting in slightly better CPU consumption. ([#1014](https://github.com/mapbox/mapbox-maps-android/pull/1014))\n* Fix memory leak in view annotations caused by not removing properly global layout listener properly. ([#1037](https://github.com/mapbox/mapbox-maps-android/pull/1037))\n* Update vector-tile to v1.0.4, fixing an end of buffer exception. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n* Fix terrain occluding 3D location indicator. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n* Fix location indicator layer rendering when SwiftShader is used. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n\n## Dependencies\n* Update gl-native to v10.3.2, common to v21.1.0. ([#1105](https://github.com/mapbox/mapbox-maps-android/pull/1105), [#1116](https://github.com/mapbox/mapbox-maps-android/pull/1116), [#1134](https://github.com/mapbox/mapbox-maps-android/pull/1134))\n* Add sdk versions plugin v1.1.3. ([#1123](https://github.com/mapbox/mapbox-maps-android/pull/1123))\n\n# 10.3.0-rc.1 January 26, 2022\n\n## Features ✨ and improvements 🏁\n* Refine viewport plugin's public APIs. ([#1069](https://github.com/mapbox/mapbox-maps-android/pull/1069))\n* Reintroduce missing `OfflineRegion#setMetadata` API for parity with `OfflineRegion#updateMetadata` in v9. ([#1071](https://github.com/mapbox/mapbox-maps-android/pull/1071))\n* Improved frame rate when zooming in and out over terrain and globe. ([#1071](https://github.com/mapbox/mapbox-maps-android/pull/1071))\n* Thin out repeated line labels at overscaled tiles in order to avoid excessive memory usage. ([#1071](https://github.com/mapbox/mapbox-maps-android/pull/1071))\n\n## Bug fixes 🐞\n* Fix an issue that causes transition to following viewport state not being fired when the bearing is set to constant. ([#1064](https://github.com/mapbox/mapbox-maps-android/pull/1064))\n* Fix an issue where 3D puck used to scale when changing coordinate bounds. ([#1067](https://github.com/mapbox/mapbox-maps-android/pull/1067))\n* Fix default viewport transition's anchor point. ([#1070](https://github.com/mapbox/mapbox-maps-android/pull/1070))\n* Fix screen coordinate queries when using zero pitch and high zoom values. ([#1071](https://github.com/mapbox/mapbox-maps-android/pull/1071))\n* Fix crash on destruction with ongoing tile-store downloads. ([#1071](https://github.com/mapbox/mapbox-maps-android/pull/1071))\n* Fix map not rendering on emulators when MSAA is enabled. ([#1077](https://github.com/mapbox/mapbox-maps-android/pull/1077))\n\n## Dependencies\n* Bump gl-native to v10.3.0-rc.1, common to v21.1.0-rc.1. ([#1071](https://github.com/mapbox/mapbox-maps-android/pull/1071))\n\n# 10.3.0-beta.1 January 12, 2022\n\n## Features ✨ and improvements 🏁\n* Introduce viewport plugin. ([#1033](https://github.com/mapbox/mapbox-maps-android/pull/1033))\n* Promote persistent style layer APIs to be production-ready. ([#879](https://github.com/mapbox/mapbox-maps-android/pull/879))\n* Add `Style#removeTerrain` method. ([#906](https://github.com/mapbox/mapbox-maps-android/pull/906))\n* Introduce ability to specify `startDelay` property as part of `mapAnimationOptions` for high-level animations. ([#932](https://github.com/mapbox/mapbox-maps-android/pull/932))\n* Deprecate map extension function to get gesture settings. ([#952](https://github.com/mapbox/mapbox-maps-android/pull/952))\n* Introduce Mapbox exceptions instead of regular runtime exceptions allowing more precise control of catching them from user's end. ([#964](https://github.com/mapbox/mapbox-maps-android/pull/964))\n* Add `tile-requests-delay` and `tile-network-requests-delay` source properties for tile requests delay. ([#960](https://github.com/mapbox/mapbox-maps-android/pull/960))\n* Expose unique annotation feature identifier that could be used to link view annotation to any annotation. ([#994](https://github.com/mapbox/mapbox-maps-android/pull/994))\n* Add `LocationComponentSettings.puckBearingSource` property to control location puck bearing to be either GPS or compass. ([#970](https://github.com/mapbox/mapbox-maps-android/pull/970))\n* Remove json serialization in observable extension improving overall performance by saving CPU cycles. ([#1001](https://github.com/mapbox/mapbox-maps-android/pull/1001))\n* Add wrap content dimension support for view annotations. ([#1021](https://github.com/mapbox/mapbox-maps-android/pull/1021))\n* Add extension function for location component to support show / hide arrow bearing image. ([#1012](https://github.com/mapbox/mapbox-maps-android/pull/1012))\n* Fill extrusion layer support for globe view. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n\n## Bug fixes 🐞\n* Fix not allowing loading empty style uri. ([#904](https://github.com/mapbox/mapbox-maps-android/pull/904))\n* Fix black `MapView#snapshot` returned on some devices (e.g. Huawei). ([#966](https://github.com/mapbox/mapbox-maps-android/pull/966))\n* Enable drag annotation while changing the annotation to draggable on long click. ([#990](https://github.com/mapbox/mapbox-maps-android/pull/990))\n* Send turnstile events for snapshotter usage. ([#920](https://github.com/mapbox/mapbox-maps-android/pull/920))\n* Allow localizing non-mapbox street sources, align localization logic with iOS implementation. ([#968](https://github.com/mapbox/mapbox-maps-android/pull/968))\n* Remove observer after it's not needed anymore from map renderer resulting in slightly better CPU consumption. ([#1014](https://github.com/mapbox/mapbox-maps-android/pull/1014))\n* Fix memory leak in view annotations caused by not removing properly global layout listener properly. ([#1037](https://github.com/mapbox/mapbox-maps-android/pull/1037))\n* Update vector-tile to v1.0.4, fixing an end of buffer exception. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n* Erase corrupt tiles from TileStore. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n* Fix rendering artifacts when compressed and un-compressed raster tiles are rendered. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n* Fix terrain occluding 3D location indicator. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n* Fix location indicator layer rendering when SwiftShader is used. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n\n## Dependencies\n* Bump gl-native to v10.3.0-beta.1, common to v21.1.0-beta.1. ([#1035](https://github.com/mapbox/mapbox-maps-android/pull/1035))\n\n# 10.2.0 December 15, 2021\n[Changes](https://github.com/mapbox/mapbox-maps-android/compare/android-v10.1.0...android-v10.2.0) since [Mapbox Maps SDK for Android 10.1.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/android-v10.1.0)\n## Features ✨ and improvements 🏁\n* Introduce view annotation support which allows adding Android views on top of the `MapView` anchored to geo-point. ([#834](https://github.com/mapbox/mapbox-maps-android/pull/834))\n* Remove `MapView` argument when constructing `AnnotationManager`. Constructor taking `MapView` as parameter is marked as deprecated. ([#766](https://github.com/mapbox/mapbox-maps-android/pull/766))\n* Implement cluster API on top of `MapboxMap.queryFeatureExtensions` making it easier to use and providing better alignment with Mapbox Maps v9. ([#773](https://github.com/mapbox/mapbox-maps-android/pull/773))\n* Add heatmap and circle layer support to globe view. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Add cancelable Query Rendered Features API to `MapboxMap`. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Improve `MapboxMap.queryRenderedFeatures` performance especially when querying large number of features. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Cache layer layout key inside layer, so that it is not re-evaluated at every parse of the every tile improving rendering performance. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Core renderer prints its version on initialization. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Introduce experimental `MapboxMap.setMemoryBudget` method for setting memory budget for the map and runtime \"resource-budget\" property for data sources. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Improve performance by avoiding re-layout of invisible fading tiles. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Add utility methods to `CoordinateBounds`. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n\n## Bug fixes 🐞\n* Fix black screen issue on some devices caused by incorrect EGL config. ([#980](https://github.com/mapbox/mapbox-maps-android/pull/980))\n* Fix `replaceWith` template to replace deprecated `queryRenderFeatures` overloaded methods. ([#878](https://github.com/mapbox/mapbox-maps-android/pull/878))\n* Do not allow to use one `associatedFeatureId` with multiple view annotations. ([#896](https://github.com/mapbox/mapbox-maps-android/pull/896))\n* Fix an issue where shove gesture was not detected when angle between touch points are not horizontal. ([#875](https://github.com/mapbox/mapbox-maps-android/pull/875))\n* Fix gestures at high camera pitch near horizon line. ([#927](https://github.com/mapbox/mapbox-maps-android/pull/927), [#925](https://github.com/mapbox/mapbox-maps-android/pull/925))\n* Fix fading tiles layout visibility issue on globe view projection zooming in/out. ([#925](https://github.com/mapbox/mapbox-maps-android/pull/925))\n* Allow simultaneous zoom and rotate gesture by default and add `GesturesSettings#simultaneousRotateAndPinchToZoomEnabled` config option. ([#885](https://github.com/mapbox/mapbox-maps-android/pull/885))\n* Fix `MapView.onLowMemory` not being called on low resources. ([#780](https://github.com/mapbox/mapbox-maps-android/pull/780))\n* Fix scale bar ratio setting not applied correctly. ([#827](https://github.com/mapbox/mapbox-maps-android/pull/827))\n* Fix scale bar text missing for Android API 23. ([#839](https://github.com/mapbox/mapbox-maps-android/pull/839))\n* Fix scale bar text being overlapped and clipped. ([#856](https://github.com/mapbox/mapbox-maps-android/pull/856))\n* Fix puck jump to nullisland when location plugin settings are changed. ([#846](https://github.com/mapbox/mapbox-maps-android/pull/846))\n* Fix scale listener events not being called for quick zoom doubleTap and doubleTouch gestures. ([#858](https://github.com/mapbox/mapbox-maps-android/pull/858))\n* Release all unused resources when `MapboxMap.reduceMemoryUse` is invoked. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix crash for the case when an empty fill extrusion bucket is tried to be rendered. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix transparency issues with value < 0.5 for 3D puck models. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix regression where setting the same geojson source URL did not refresh the data. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix symbol layers with variable anchor placement not being placed correctly on globe view. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix crash in symbol reprojection code caused by division by zero. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix issue with bounds constraining behavior when terrain is enabled. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n\n## Dependencies\n* Bump common to v21.0.1. ([#937](https://github.com/mapbox/mapbox-maps-android/pull/937))\n* Bump gl-native to v10.2.0. ([#989](https://github.com/mapbox/mapbox-maps-android/pull/989))\n\n# 10.1.2 December 13, 2021\n\n## Bug fixes 🐞\n* Fix billing issue when upgrading Mapbox Maps SDK from v9 to v10.\n\n## Dependencies\n* Bump common to 20.1.2. ([#979](https://github.com/mapbox/mapbox-maps-android/pull/979))\n\n# 10.0.2 December 13, 2021\n\n## Bug fixes 🐞\n* Fix billing issue when upgrading Mapbox Maps SDK from v9 to v10.\n\n## Dependencies\n* Bump common to v20.0.3.([#978](https://github.com/mapbox/mapbox-maps-android/pull/978))\n\n# 10.2.0-rc.1 December 2, 2021\n\n## Bug fixes 🐞\n* Fix `replaceWith` template to replace deprecated `queryRenderFeatures` overloaded methods. ([#878](https://github.com/mapbox/mapbox-maps-android/pull/878))\n* Do not allow to use one `associatedFeatureId` with multiple view annotations. ([#896](https://github.com/mapbox/mapbox-maps-android/pull/896))\n* Fix an issue where shove gesture was not detected when angle between touch points are not horizontal. ([#875](https://github.com/mapbox/mapbox-maps-android/pull/875))\n* Fix gestures at high camera pitch near horizon line. ([#927](https://github.com/mapbox/mapbox-maps-android/pull/927), [#925](https://github.com/mapbox/mapbox-maps-android/pull/925))\n* Fix fading tiles layout visibility issue on globe view projection zooming in/out. ([#925](https://github.com/mapbox/mapbox-maps-android/pull/925))\n* Allow simultaneous zoom and rotate gesture by default and add `GesturesSettings#simultaneousRotateAndPinchToZoomEnabled` config option. ([#885](https://github.com/mapbox/mapbox-maps-android/pull/885))\n\n## Dependencies\n* Bump gl-native to v10.2.0-rc.1, common to v21.0.0-rc.2. ([#925](https://github.com/mapbox/mapbox-maps-android/pull/925))\n\n# 10.1.1 December 1, 2021\n\n**NOTE:** As of December 3, 2021, this release is no longer available due to a new bug that was introduced while fixing the billing issue. A new patch will be issued shortly.\n\n## Bug fixes 🐞\n* Fix billing issue when upgrading Mapbox Maps SDK from v9 to v10.\n\n## Dependencies\n* Bump gl-native to 10.1.1, common to 20.1.1.\n\n# 10.0.1 November 26, 2021\n\n**NOTE:** As of December 3, 2021, this release is no longer available due to a new bug that was introduced while fixing the billing issue. A new patch will be issued shortly.\n\n## Bug fixes 🐞\n* Fix billing issue when upgrading Mapbox Maps SDK from v9 to v10.\n\n## Dependencies\n* Bump common to v20.0.2.\n\n# 10.2.0-beta.1 November 18, 2021\n\n## Features ✨ and improvements 🏁\n* Introduce view annotation support which allows adding Android views on top of the `MapView` anchored to geo-point. ([#834](https://github.com/mapbox/mapbox-maps-android/pull/834))\n* Remove `MapView` argument when constructing `AnnotationManager`. Constructor taking `MapView` as parameter is marked as deprecated. ([#766](https://github.com/mapbox/mapbox-maps-android/pull/766))\n* Implement cluster API on top of `MapboxMap.queryFeatureExtensions` making it easier to use and providing better alignment with Mapbox Maps v9. ([#773](https://github.com/mapbox/mapbox-maps-android/pull/773))\n* Add heatmap and circle layer support to globe view. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Add cancelable Query Rendered Features API to `MapboxMap`. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Improve `MapboxMap.queryRenderedFeatures` performance especially when querying large number of features. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Cache layer layout key inside layer, so that it is not re-evaluated at every parse of the every tile improving rendering performance. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Core renderer prints its version on initialization. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Introduce experimental `MapboxMap.setMemoryBudget` method for setting memory budget for the map and runtime \"resource-budget\" property for data sources. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Improve performance by avoiding re-layout of invisible fading tiles. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Add utility methods to `CoordinateBounds`. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n\n## Bug fixes 🐞\n* Fix `MapView.onLowMemory` not being called on low resources. ([#780](https://github.com/mapbox/mapbox-maps-android/pull/780))\n* Fix scale bar ratio setting not applied correctly. ([#827](https://github.com/mapbox/mapbox-maps-android/pull/827))\n* Fix scale bar text missing for Android API 23. ([#839](https://github.com/mapbox/mapbox-maps-android/pull/839))\n* Fix scale bar text being overlapped and clipped. ([#856](https://github.com/mapbox/mapbox-maps-android/pull/856))\n* Fix puck jump to nullisland when location plugin settings are changed. ([#846](https://github.com/mapbox/mapbox-maps-android/pull/846))\n* Fix scale listener events not being called for quick zoom doubleTap and doubleTouch gestures. ([#858](https://github.com/mapbox/mapbox-maps-android/pull/858))\n* Release all unused resources when `MapboxMap.reduceMemoryUse` is invoked. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix crash for the case when an empty fill extrusion bucket is tried to be rendered. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix transparency issues with value < 0.5 for 3D puck models. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix regression where setting the same geojson source URL did not refresh the data. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix symbol layers with variable anchor placement not being placed correctly on globe view. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix crash in symbol reprojection code caused by division by zero. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n* Fix issue with bounds constraining behavior when terrain is enabled. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n\n## Dependencies\n* Bump gl-native to v10.2.0-beta.2 and common to v21.0.0-rc.1. ([#852](https://github.com/mapbox/mapbox-maps-android/pull/852))\n\n# 10.1.0 November 4, 2021\n[Changes](https://github.com/mapbox/mapbox-maps-android/compare/android-v10.0.0...android-v10.1.0) since [Mapbox Maps SDK for Android 10.0.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/android-v10.0.0)\n## Features ✨ and improvements 🏁\n* Set thread priorities and set thread CPU affinity based on the thread's priority to improve overall map performance.([#810](https://github.com/mapbox/mapbox-maps-android/pull/810))\n* Introduce option to enable multisample anti-aliasing (MSAA) for map rendering. ([#741](https://github.com/mapbox/mapbox-maps-android/pull/741))\n* Add convenience methods for `stop` expression in Style DSL. ([#698](https://github.com/mapbox/mapbox-maps-android/pull/698), [#764](https://github.com/mapbox/mapbox-maps-android/pull/764))\n\n## Bug fixes 🐞\n* Avoid spawning extra AssetManagerFileSource threads when multiple instances of a MapView is created during application lifecycle. ([#810](https://github.com/mapbox/mapbox-maps-android/pull/810))\n* Fix rendering artifact when some of the model layer models may have wrong placement when globe view projection is used. ([#810](https://github.com/mapbox/mapbox-maps-android/pull/810))\n* Fix rare heatmap flickering when zooming the map. ([#810](https://github.com/mapbox/mapbox-maps-android/pull/810))\n* Fix an issue where an Observable event could be dispatched on a thread, different from the subscription thread. ([#810](https://github.com/mapbox/mapbox-maps-android/pull/810))\n* Fix an issue where promoteId parameter for VectorSource was overwritten when source tilejson is loaded ([#810](https://github.com/mapbox/mapbox-maps-android/pull/810))\n* Fix android glyph drawing issue when 'high contrast' text accessibility feature is turned on. ([#810](https://github.com/mapbox/mapbox-maps-android/pull/810))\n* Fix unexpectedly rapid map panning at high pitch level. ([#775](https://github.com/mapbox/mapbox-maps-android/pull/775))\n* Fix map move using faster map offsetting after zoom-in or zoom-out gesture. ([#738](https://github.com/mapbox/mapbox-maps-android/pull/738))\n* Fix annotation flickering and disappearing during dragging. ([#732](https://github.com/mapbox/mapbox-maps-android/pull/732))\n* Fix logo and attribution margin update. ([#744](https://github.com/mapbox/mapbox-maps-android/pull/744))\n* Fix `NullPointerException` while querying annotations. ([#746](https://github.com/mapbox/mapbox-maps-android/pull/746))\n* Limit fast fling gesture in a downwards direction when map is highly pitched. ([#754](https://github.com/mapbox/mapbox-maps-android/pull/754))\n* Fix an issue that caused annotations not being updated when style is loading other resources. ([#753](https://github.com/mapbox/mapbox-maps-android/pull/753))\n* Restore the fling factor for slightly pitched maps. ([#762](https://github.com/mapbox/mapbox-maps-android/pull/762))\n\n## Dependencies\n* Bump gl-native to 10.1.0, common to 20.1.0. ([#810](https://github.com/mapbox/mapbox-maps-android/pull/810))\n\n# 10.1.0-rc.1 October 28, 2021\n\n## Bug fixes 🐞\n* Fix unexpectedly rapid map panning at high pitch level. ([#775](https://github.com/mapbox/mapbox-maps-android/pull/775))\n* Improve rendering performance by setting thread priorities and set thread CPU affinity based on the thread's priority. ([#774](https://github.com/mapbox/mapbox-maps-android/pull/774))\n\n## Dependencies\n* Bump gl-native to v10.1.0-rc, and common to v20.1.0-rc.2 ([#774](https://github.com/mapbox/mapbox-maps-android/pull/774))\n\n# 10.1.0-beta.1 October 21, 2021\n\n## Features ✨ and improvements 🏁\n* Introduce option to enable Multisample anti-aliasing (MSAA) for map rendering. ([#741](https://github.com/mapbox/mapbox-maps-android/pull/741))\n* Add convenience methods for stop expression. ([#698](https://github.com/mapbox/mapbox-maps-android/pull/698), [#764](https://github.com/mapbox/mapbox-maps-android/pull/764))\n\n## Bug fixes 🐞\n* Fix map move using faster map offsetting after zoom-in or zoom-out gesture. ([#738](https://github.com/mapbox/mapbox-maps-android/pull/738))\n* Fix annotation flickering and disappearing during dragging. ([#732](https://github.com/mapbox/mapbox-maps-android/pull/732))\n* Fix logo and attribution margin update. ([#744](https://github.com/mapbox/mapbox-maps-android/pull/744))\n* Fix `NullPointerException` while querying annotations. ([#746](https://github.com/mapbox/mapbox-maps-android/pull/746))\n* Limit fast fling gesture in a downwards direction when map is highly pitched. ([#754](https://github.com/mapbox/mapbox-maps-android/pull/754))\n* Fixed an issue that caused annotations not being updated in some cases.. ([#753](https://github.com/mapbox/mapbox-maps-android/pull/753))\n* Fix glyph drawing issue when the 'high contrast' text feature is turned on. ([#752](https://github.com/mapbox/mapbox-maps-android/pull/752))\n* Fix `promoteId` parameter for VectorSource overwritten when source tilejson is loaded. ([#752](https://github.com/mapbox/mapbox-maps-android/pull/752))\n* Avoid spawning extra AssetManagerFileSource threads. ([#752](https://github.com/mapbox/mapbox-maps-android/pull/752))\n* Fix `NullPointerException` in `HttpResponseCallback`, when get an error message from the Exception. ([#752](https://github.com/mapbox/mapbox-maps-android/pull/752))\n* Restore the fling factor for slightly pitched maps. ([#762](https://github.com/mapbox/mapbox-maps-android/pull/762))\n\n## Dependencies\n* Bump gl-native to v10.1.0-beta, and common to v20.1.0-rc.1 ([#752](https://github.com/mapbox/mapbox-maps-android/pull/752))\n\n\n# 10.0.0 October 6, 2021\n\n## Breaking changes ⚠️\n* Add `@JvmOverloads` where applicable to provide better experience for Java users. ([#656](https://github.com/mapbox/mapbox-maps-android/pull/656))\n* Refactor gestures configuration options to be aligned better across platforms. ([#672](https://github.com/mapbox/mapbox-maps-android/pull/672))\n* Apply geojson data (using `data`, `url`, `feature`, `featureCollection`, `geometry` functions) is fully async now. ([#699](https://github.com/mapbox/mapbox-maps-android/pull/699))\n* Update `getLayerAs` function to return nullable `Layer` type. ([#673](https://github.com/mapbox/mapbox-maps-android/pull/673))\n* Update map events data models. ([#712](https://github.com/mapbox/mapbox-maps-android/pull/712))\n* Refactor MapEvents listeners, so that each listener will include one event data property. ([#718](https://github.com/mapbox/mapbox-maps-android/pull/718))\n* Abstract classes `CustomLayerHost`, `ElevationData`, `MapClient`, `Observer`, `OfflineRegionObserver`, `HttpServiceInterceptorInterface`, `HttpServiceInterface`, `LogWriterBackend`, `OfflineSwitchObserver`, `ReachabilityInterface`, `TileStoreObserver` have become interfaces. ([#697](https://github.com/mapbox/mapbox-maps-android/pull/697))\n\n## Features ✨ and improvements 🏁\n* Introduce 3D globe (experimental). ([#667](https://github.com/mapbox/mapbox-maps-android/pull/667))\n* Append gl-native and common API reference documentation to the output of Dokka documentation generation. ([#711](https://github.com/mapbox/mapbox-maps-android/pull/711))\n* Set `Process.THREAD_PRIORITY_DISPLAY` as render thread priority to improve overall performance. ([#701](https://github.com/mapbox/mapbox-maps-android/pull/701))\n* Add `HttpServiceFactory.reset()` to release the HTTP service implementation. ([#697](https://github.com/mapbox/mapbox-maps-android/pull/697))\n\n## Bug fixes 🐞\n* Throw exception when gestures plugin functionality is used but plugin was not created. ([#653](https://github.com/mapbox/mapbox-maps-android/pull/653))\n* Throw exception when camera plugin functionality is used but plugin was not created. ([#668](https://github.com/mapbox/mapbox-maps-android/pull/668))\n* Fix black screen when resuming activity with `MapView` on x86 emulator, Android API <= 23. ([#671](https://github.com/mapbox/mapbox-maps-android/pull/671))\n* Fix map render deadlock on Android 8 on power on button. ([#688](https://github.com/mapbox/mapbox-maps-android/pull/688))\n* Fix context leak in `LocationProviderImpl`. ([#690](https://github.com/mapbox/mapbox-maps-android/pull/690))\n* Fix native memory leak by explicitly nulling map reference from renderer. ([#687](https://github.com/mapbox/mapbox-maps-android/pull/687))\n* Fix wrong attribute reference in runtime exception text when token is missing. ([#708](https://github.com/mapbox/mapbox-maps-android/pull/708))\n* Fix applying position property to scale bar plugin. ([#677](https://github.com/mapbox/mapbox-maps-android/pull/677))\n* Fix initialisation location puck when no style loaded from code by changing `Plugin#onStart()` call after style loaded started. ([#680](https://github.com/mapbox/mapbox-maps-android/pull/680))\n* Fix attribution/logo jumble when RTL layout is configured. ([#674](https://github.com/mapbox/mapbox-maps-android/pull/674))\n* Fix rendering artifacts for a model layer when `model-opacity` property is used. ([#697](https://github.com/mapbox/mapbox-maps-android/pull/697))\n* Improve rendering performance by avoiding unnecessary re-layout for cached tiles. ([#697](https://github.com/mapbox/mapbox-maps-android/pull/697))\n* Fix `onResponse` callback for `HttpInterceptor` never being called. ([#697](https://github.com/mapbox/mapbox-maps-android/pull/697))\n\n## Dependencies\n* Bump gl-native to v10.0.0, common to v20.0.0. ([#697](https://github.com/mapbox/mapbox-maps-android/pull/697))\n\n# 10.0.0-rc.9 September 22, 2021\n\n## Features ✨ and improvements 🏁\n* Fix documentation for `OnMapIdleListener` and `CameraChangeListeners`. ([#645](https://github.com/mapbox/mapbox-maps-android/pull/645))\n* Add support for `SymbolZOrder` property in PointAnnotationManager. ([#638](https://github.com/mapbox/mapbox-maps-android/pull/638))\n* Add support for `PromoteId` to be used with Feature State API. ([#636](https://github.com/mapbox/mapbox-maps-android/pull/636))\n* Expose `optimizeForTerrain` flag (default to true) that could be applied to the `MapView` in xml. When optimizeForTerrain is enabled, layers could get reordered to achieve the best performance. ([#654](https://github.com/mapbox/mapbox-maps-android/pull/654))\n* Enable instant transitions for data driven symbol layer properties. ([#646](https://github.com/mapbox/mapbox-maps-android/pull/646))\n\n## Bug fixes 🐞\n* `OnStyleLoaded` / `OnMapLoaded` callbacks are invoked even if hosting fragment/activity is in stopped state. ([#629](https://github.com/mapbox/mapbox-maps-android/pull/629))\n* Fix drag annotation blink when drag ends. ([#639](https://github.com/mapbox/mapbox-maps-android/pull/639))\n* Apply annotation manager properties to the drag layer to keep annotations the same while dragging. ([#640](https://github.com/mapbox/mapbox-maps-android/pull/640))\n* Fix point annotation updating all same content bitmaps instead of one particular. ([#633](https://github.com/mapbox/mapbox-maps-android/pull/633))\n* Fix `MapboxMap#getStyle` returning null after adding a new source when style was loaded before. ([#643](https://github.com/mapbox/mapbox-maps-android/pull/643))\n* Allow setting null explicitly to annotation nullable properties. ([#650](https://github.com/mapbox/mapbox-maps-android/pull/650))\n* Fix `std::exception` happing rarely when `MapboxMap#setCamera()` is called inside animation plugin. ([#652](https://github.com/mapbox/mapbox-maps-android/pull/652))\n* Fix memory leak in renderer destroy. ([#657](https://github.com/mapbox/mapbox-maps-android/pull/657))\n* Fix transition between layers with all constant properties. ([#646](https://github.com/mapbox/mapbox-maps-android/pull/646))\n* Fix rendering artifact for a line layer, when its `line-gradient` property is set at runtime. ([#646](https://github.com/mapbox/mapbox-maps-android/pull/646))\n* Don't draw SDF images in `text-field` and issue warning for it. ([#646](https://github.com/mapbox/mapbox-maps-android/pull/646))\n* Fix incorrect return from StyleManager#getStyleLayerPropertyDefaultValue for `text-field`, now the default value is set to `[\"format\", \"\" , {}]`. ([#646](https://github.com/mapbox/mapbox-maps-android/pull/646))\n\n## Dependencies\n* Bump gl-native to 10.0.0-rc.9, common to 19.0.0. ([#646](https://github.com/mapbox/mapbox-maps-android/pull/646))\n\n# 10.0.0-rc.8 September 8, 2021\n\n## Breaking changes ⚠️\n* In offline mode (set by either mapbox::common::OfflineSwitch API or on platform side), the error notifications are send if the required resources are not present locally. The volatile tiles are not considered to be required in offline.([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n* Adapt setBounds to gl-js behavior: constraining of coordinates and zoom level is now stricter to prevent out of bounds map area to be visible in the viewport.([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n* Add HTTP interceptor API - for anyone who is using HttpServiceInterface; there is a new method called setInterceptor that should be overridden([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n\n## Features ✨ and improvements 🏁\n* Make 3D puck always over (in front of) 3D layers (buildings, landmarks, custom layer) but behind hill (terrain). ([#601](https://github.com/mapbox/mapbox-maps-android/pull/601))\n* Integrate value marshalling performance improvement ([#606](https://github.com/mapbox/mapbox-maps-android/pull/606))\n* Introduce drag layer/source for annotation plugin to improve drag performance. ([#582](https://github.com/mapbox/mapbox-maps-android/pull/582))\n* Update prefetch zoom delta documentation to match actual behavior ([#609](https://github.com/mapbox/mapbox-maps-android/pull/609))\n* Add support for the index-of and slice expressions ([#616](https://github.com/mapbox/mapbox-maps-android/pull/616))\n* Improve collision detection by using runtime calculated sizes for collision boxes. Previously collision boxes' sizes are constant, they are calculated during symbol layout time by using constant zoom level([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n* Improve collision detection by using runtime calculated pixelated sizes for collision circles. Previously collision circles' sizes are constant, they are calculated during symbol layout time by using constant zoom level([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n* Implement 'promoteId' feature for geojson and vector sources. The feature allows to promote feature's property to a feature id, so that promoted id can be used with FeatureState API.([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n* Enable instant transitions for data driven paint layer properties([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n\n## Bug fixes 🐞\n* Use touch focal point to calculate the correct scroll displacement when the map is pitched. ([#593](https://github.com/mapbox/mapbox-maps-android/pull/593))\n* Use touch focal point to calculate the correct fling displacement. ([#599](https://github.com/mapbox/mapbox-maps-android/pull/599))\n* Allow geojson source to initialise with empty data. ([#602](https://github.com/mapbox/mapbox-maps-android/pull/602))\n* Preserve EGL setup on renderer stop. This fixes full map reloading when map is brought out from background. ([#598](https://github.com/mapbox/mapbox-maps-android/pull/598))\n* Fix issue with camera animators ordering on Android 6 and lower by revisiting overall approach of applying accumulated camera changes. ([#597](https://github.com/mapbox/mapbox-maps-android/pull/597))\n* Enable update bitmap for annotations  ([#615](https://github.com/mapbox/mapbox-maps-android/pull/615))\n* Fix volatile tiles disappearing on \"not modified\" response([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n* Prioritize addition of a persistent layer whose id is used for other persistent layer positions([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n* Only do line breaking process for point placement labels. And if text-max-width is 0, still do general ideographic beaking checks for point labels.([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n* Fix collision box's 'dynamicVerticesExt' updating in placement stage([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n* Trigger map redraw when feature state changes ([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n\n## Dependencies\n* Bump gl-native to 10.0.0-rc.8, common to 18.0.0 ([#604](https://github.com/mapbox/mapbox-maps-android/pull/604))\n\n# 10.0.0-rc.7 August 25, 2021\n\n## Breaking changes ⚠️\n* Remove the expression getter/setters for source properties. ([#568](https://github.com/mapbox/mapbox-maps-android/pull/568))\n\n## Features ✨ and improvements 🏁\n* Add generateId property for GeoJsonSource. ([#538](https://github.com/mapbox/mapbox-maps-android/pull/538))\n* Add default value to improve usability of FeatureState API. ([#588](https://github.com/mapbox/mapbox-maps-android/pull/588))\n* Add Style#moveStyleLayer(layerId: String, layerPosition: LayerPosition?): Expected<String, None> API ([#563](https://github.com/mapbox/mapbox-maps-android/pull/563))\n* Allow using combination of line-dasharray and line-gradient for line layer. ([#563](https://github.com/mapbox/mapbox-maps-android/pull/563))\n\n## Bug fixes 🐞\n* Remove strong ref dependency in snapshotter that was leading to a memory leak if Snapshotter#destroy was not called explicitly. ([#571](https://github.com/mapbox/mapbox-maps-android/pull/571))\n* Fix get annotation enum property crash ([#579](https://github.com/mapbox/mapbox-maps-android/pull/579))\n* Fix rendering issue for round line-join in line gradients ([#565](https://github.com/mapbox/mapbox-maps-android/pull/565))\n* A fix of the layer paint property evaluation while transitioning from a data-driven value. It snaps immediately to the new value thus preventing of drawing stale data during the animation.([#563](https://github.com/mapbox/mapbox-maps-android/pull/563))\n* Reduced memory consumption when using raster layers by deleting CPU side tile bitmap copy after uploading to GPU texture.([#563](https://github.com/mapbox/mapbox-maps-android/pull/563))\n* Fix crash on Android when using tile requests delay API([#563](https://github.com/mapbox/mapbox-maps-android/pull/563))\n\n## Dependencies\n* Bump gl-native to v10.0.0-rc.7, common to v17.0.0 ([#563](https://github.com/mapbox/mapbox-maps-android/pull/563))\n* Bump gl-native to v10.0.0-rc.7.1. ([#565](https://github.com/mapbox/mapbox-maps-android/pull/565))\n* Bump gl-native to v10.0.0-rc.7.2, common to 17.1.0 ([#575](https://github.com/mapbox/mapbox-maps-android/pull/575))\n* Bump targetSDKVersion and compileSDKVersion to 30, robolectric version to 4.6.1. ([#514](https://github.com/mapbox/mapbox-maps-android/pull/514))\n\n# 10.0.0-rc.6 August 11, 2021\n\n## Breaking changes ⚠️\n* Update extension function signatures making them easier to use from Java. ([#539](https://github.com/mapbox/mapbox-maps-android/pull/539))\n* Rename `mapView#overlay()` to `mapView#mapboxOverlay`. ([#539](https://github.com/mapbox/mapbox-maps-android/pull/539))\n\n## Features ✨ and improvements 🏁\n* Support adding 9-patch images to the style. ([#536](https://github.com/mapbox/mapbox-maps-android/pull/536))\n* Outdated data for volatile sources gets hidden if cannot be updated due to no Internet connection. ([#543](https://github.com/mapbox/mapbox-maps-android/pull/543))\n\n## Bug fixes 🐞\n* Fix several memory leaks: clean up OnFpsChangeListener on render thread destroy / introduce Snapshotter#destroy method that must be called in Activity#onDestroy ([#546](https://github.com/mapbox/mapbox-maps-android/pull/546))\n* Add layer and source check when creating annotations and init them if not initiated before which creates `AnnotationManager` before loading style. ([#549](https://github.com/mapbox/mapbox-maps-android/pull/549))\n* Fix error messages returned by `Style#removeStyleSource` method. ([#543](https://github.com/mapbox/mapbox-maps-android/pull/543))\n* Store persistent layer's LayerPosition, so that layer can be re-added to correct position if LayerPosition.above or LayerPosition.at is used. ([#543](https://github.com/mapbox/mapbox-maps-android/pull/543))\n\n## Dependencies\n* Update gl-native to v10.0.0-rc.6 and common to v16.2.0. ([#543](https://github.com/mapbox/mapbox-maps-android/pull/543))\n* Remove turf dependency of location component plugin. ([#551](https://github.com/mapbox/mapbox-maps-android/pull/551))\n\n# 10.0.0-rc.5 July 28, 2021\n\n## Breaking changes ⚠️\n* Improve camera API consumption from java programming language by adding `CameraAnimationsUtils` and `getCamera` JvmName annotations. ([#495](https://github.com/mapbox/mapbox-maps-android/pull/495))\n* Rename `AttributionView#setOnClickListener` to `setViewOnClickListener` to avoid overloading the Android SDK method. Results in compilation on Android P and above. Adjust codebase to changes in enforced nullability of Android SDK code. ([#497](https://github.com/mapbox/mapbox-maps-android/pull/497))\n* Get rid of using reflection when creating plugins which should decrease `MapView` startup time if plugins are enabled. ([#519](https://github.com/mapbox/mapbox-maps-android/pull/519))\n\n## Features ✨ and improvements 🏁\n* Add `showLogo` and `showAttributes` config for snapshotter which are defaulted to true. User can now hide logo and attributions in a snapshotter by changing this config ([#496](https://github.com/mapbox/mapbox-maps-android/pull/496))\n* Add lifecycle plugin so there is no need to call `onStart`/`onStop`/`onDestroy`/`onLowMemory` methods explicitly, if the appcompact 1.3.0+ is used. ([#485](https://github.com/mapbox/mapbox-maps-android/pull/485))\n* Add a minimum Android Auto test app and an optional Android Auto extension that provide convenient extension function to initialise the MapSurface from a Car App Session. ([#488](https://github.com/mapbox/mapbox-maps-android/pull/488))\n* Add lint check for lifecycle methods ([#516](https://github.com/mapbox/mapbox-maps-android/pull/516))\n\n## Bug fixes 🐞\n* Fix issues with MapView#snapshot methods that could cause black snapshot or ANR in some cases. ([#508](https://github.com/mapbox/mapbox-maps-android/pull/508))\n\n# 10.0.0-rc.4 July 14, 2021\n\n**The Mapbox Maps SDK for Android has moved to release candidate status and is now ready for production use.**\n\n## Features ✨ and improvements 🏁\n* Add new param to allow users localize selected layers. ([#461](https://github.com/mapbox/mapbox-maps-android/pull/461))\n* Add API to control logging for animation plugin and disable debug logs by default. ([#474](https://github.com/mapbox/mapbox-maps-android/pull/474))\n* Introduce option to use continuous rendering for scale bar. Continuous render mode will fix gfxinfo profiling. ([#458](https://github.com/mapbox/mapbox-maps-android/pull/458))\n* Add shortest bearing path option for animators. ([#473](https://github.com/mapbox/mapbox-maps-android/pull/473))\n* Add modelTranslation support for LocationPuck3D ([#493](https://github.com/mapbox/mapbox-maps-android/pull/493))\n* Add default parameters to coordinate conversion functions of MapCameraManagerDelegate#cameraForCoordinates, MapCameraManagerDelegate#cameraForCoordinateBounds and MapCameraManagerDelegate#cameraForGeometry. This overloads the functions to have a more simple API surface for developers to hook into. ([#491](https://github.com/mapbox/mapbox-maps-android/pull/491))\n* Support text-writing-mode property for line symbol-placement text labels (#1766)\n  Note: This change will bring following changes for CJK text block:\n  - For vertical CJK text, all the characters including Latin and Numbers will be vertically placed now. Previously, Latin and Numbers are horizontally placed.\n  - For horizontal CJK text, it may have a slight horizontal shift due to the anchor shift.\n* Session SKU generation is now available\n* Add getSKUTokenIfValid to get a SKU token for a SKU identifier if it exists and is not expired, return empty string if not.\n* Allow filtering of log messages by categories.\n* Expose isFiltered for checking logging category settings\n\n## Bug fixes 🐞\n* Fix flyTo crash when using single-pixel paddings. ([#478](https://github.com/mapbox/mapbox-maps-android/pull/478))\n* Fixed regression in map gestures on devices with Android 6 and lower. ([#484](https://github.com/mapbox/mapbox-maps-android/pull/484))\n* Fix overwriting sync geojson data with getSourceAs by async. ([#482](https://github.com/mapbox/mapbox-maps-android/pull/482))\n* Clean up network listener after http file source gets out of scope\n* Fix line-center anchor calculation when the anchor is very near to the line geometry point\n* Fix crash when a Feature State API is used with dedicated rendering thread\n* Fix threading issues in HTTP file source\n* Fix volatile tilesets handling\n\n## Dependencies\n* Update gl-native to v10.0.0-rc.5 and common to v16.0.0. ([#487](https://github.com/mapbox/mapbox-maps-android/pull/487))\n\n# 10.0.0-rc.3 June 30, 2021\n\n**The Mapbox Maps SDK for Android has moved to release candidate status and is now ready for production use.**\n\n## Breaking changes ⚠️\n* Perform annotation click synchronously and change AnnotationManagerImpl#queryMapForFeatures function to be synchronous. ([#455](https://github.com/mapbox/mapbox-maps-android/pull/455))\n\n## Features ✨ and improvements 🏁\n* Introduce static MapboxMap.clearData(resourceOptions: ResourceOptions, callback: AsyncOperationResultCallback) API and MapboxMap#clearData(callback: AsyncOperationResultCallback), Snapshotter#clearData(callback: AsyncOperationResultCallback) APIs. ([#442](https://github.com/mapbox/mapbox-maps-android/pull/442))\n* Optimise the Style#getLayer and Style#getSource APIs' performance. ([#449](https://github.com/mapbox/mapbox-maps-android/pull/449))\n* MapEvents#MAP_LOADING_ERROR events now include source and tile information where appropriate. New fields would allow developers to understand what source or tile has failed to load and the reason for a failure. ([#457](https://github.com/mapbox/mapbox-maps-android/pull/457))\n\n## Bug fixes 🐞\n* Fix dropping annotation source updates if those were emitted rapidly without handler. ([#441](https://github.com/mapbox/mapbox-maps-android/pull/441))\n* Fix raster/v1 terrain tiles fetch failures caused by appending pixel ratio to the URLs when tile size is equal to 512. ([#457](https://github.com/mapbox/mapbox-maps-android/pull/457))\n* Fixed an issue that the LayerPosition is not persisted across the style change, when using persistent layer based annotation plugin and location component plugin. ([#457](https://github.com/mapbox/mapbox-maps-android/pull/457))\n* Disable MapboxTelemetryInitProvider if the telemetry is disabled via app's manifest reducing startup time. ([#442](https://github.com/mapbox/mapbox-maps-android/pull/442))\n\n## Dependencies\n* Bump gl-native to v10.0.0-rc.3, common to v14.2.0. ([#442](https://github.com/mapbox/mapbox-maps-android/pull/442))\n* Bump telemetry to 8.1.0. ([#457](https://github.com/mapbox/mapbox-maps-android/pull/457))\n\n# 10.0.0-rc.2 June 23, 2021\n\n## Features ✨ and improvements 🏁\n* Introduce experimental `Style#addPersistentLayer`, `Layer#isPersistent`, `Style#addPersistentStyleLayer`, `Style#addPersistentStyleCustomLayer` and `Style#isStyleLayerPersistent` APIs, so that the tagged layer and its associated resources would remain when a style is reloaded. This improves performance of Annotation and Location Component Plugin during the style change. ([#368](https://github.com/mapbox/mapbox-maps-android/pull/368), ([#422](https://github.com/mapbox/mapbox-maps-android/pull/422)))\n* Add Localization API to apply languages to the style by provided locale. ([#379](https://github.com/mapbox/mapbox-maps-android/pull/379))\n* Reduce unnecessary render cache texture updates by introducing a small delay after zoom has changed.\n* Save and read application state on a background thread, to avoid delays (~3-5ms) on the main thread.\n\n## Bug fixes 🐞\n* Introduce size check for render cache. ([#425](https://github.com/mapbox/mapbox-maps-android/pull/425))\n* Fix memory leak on render destroy. ([#426](https://github.com/mapbox/mapbox-maps-android/pull/426))\n* Changes the visibility of jsonObject in annotation to protected, fix ConcurrentModificationException ([#427](https://github.com/mapbox/mapbox-maps-android/pull/427))\n* Fix camera deadlock use-case. ([#439](https://github.com/mapbox/mapbox-maps-android/pull/439))\n* Tileset descriptor resolving fixes:\n  - Operation completes even if the offline manager instance gets out of scope\n  - Fixes leaking TilesetResolverObserver instance\n  - Fixes possible crash on cancellation of pending style pack download operation\n* Fix text rendering when both 'text-rotate' and 'text-offset' are set.\n* Fix Android 12 compatibility to support [pending intents mutability](https://developer.android.com/about/versions/12/behavior-changes-12#pending-intent-mutability).\n\n## Dependencies\n* Bump gl-native to v10.0.0-rc.2 ([#422](https://github.com/mapbox/mapbox-maps-android/pull/422))\n* Bump telemetry to v8.0.0, android core to v5.0.0 ([#423](https://github.com/mapbox/mapbox-maps-android/pull/423))\n\n# 10.0.0-rc.1 June 10, 2021\n\n## Breaking changes ⚠️\n* Rename setter for `Light` object from `add` to `set`. This matches API from GL-JS and clarifies there is only 1 Light object. ([#387](https://github.com/mapbox/mapbox-maps-android/pull/387))\n* Rename setter for `Terrain` object from `add` to `set`. ([#391](https://github.com/mapbox/mapbox-maps-android/pull/391))\n* Remove `CacheManager`. In the following releases, an API to control temporary map data may be provided. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n* Remove `ResourceOptions::cacheSize` and `DefaultAmbientCacheSize` constant. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n* Replace `ResourceOptions::cachePath` with `ResourceOptions::dataPath` that accepts a folder in which the map stores offline style packages and temporary map data. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n* Rename `TileStore::getInstance()` to `TileStore::create()`. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n* Remove the `MapView#setRenderCache` and `MapSurface#setRenderCache` API and replaced them with experimental `MapboxMap#setRenderCacheOptions` and `MapboxMap#getRenderCacheOptions` APIs. ([#401](https://github.com/mapbox/mapbox-maps-android/pull/401))\n* Change the default `ResourceOptions#dataPath` to `${context.filesDir.absolutePath}/.mapbox/map_data/` and the database name from `ambient_cache.db` to `map_data.db`. ([#403](https://github.com/mapbox/mapbox-maps-android/pull/403))\n\n## Features ✨ and improvements 🏁\n* The amount of the unique maps tile packs used in the offline regions is capped by the maximum amount equal to 750. The tile region loading is not be performed if it would cause exceeding of the tile pack limit. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n\n## Bug fixes 🐞\n* Fix a typo in `MapboxMapUtils` jvm name. ([#396](https://github.com/mapbox/mapbox-maps-android/pull/396))\n* Fix an issue that vertical text was not positioned correctly if the `text-offset` property was used. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n* Emit `MapLoadingError` when an empty token is provided for accessing Mapbox data sources. Before the fix, the application may crash if an empty token was provided and map tries to load data from Mapbox data source. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n* Create folder structure for provided `ResourceOptions#dataPath` when a provided folder doesn't exist. Before the fix, map expected the folder to exist, and in case it didn't, it was difficult to report an error to the application. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n* Do not emit `MapLoadingError` when an empty URL is set to GeoJSON source. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n* Avoid packaging `gms-play-services-location` by default as part of the Android SDK. ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n* Fix an issue that causes public resource definitions not generated in public.txt file. ([#404](https://github.com/mapbox/mapbox-maps-android/pull/404))\n\n## Dependencies\n* Bump gl-native to v10.0.0-rc.1, common to v14.0.1 ([#399](https://github.com/mapbox/mapbox-maps-android/pull/399))\n\n# 10.0.0-beta.21- June 3, 2021\n## Breaking changes ⚠️\n* Align load style functions for MapboxMap and Snapshotter. ([#371](https://github.com/mapbox/mapbox-maps-android/pull/371))\n* Change the default ambient cache path to `.mapbox/maps/ambient_cache.db` ([#373](https://github.com/mapbox/mapbox-maps-android/pull/373))\n* Move text-font property from PointAnnotation to PointAnnotationManager ([#375](https://github.com/mapbox/mapbox-maps-android/pull/375))\n* Remove CredentialsManager in favour of ResourceOptionsManager ([#365](https://github.com/mapbox/mapbox-maps-android/pull/365))\n* Introduce separate minZoom/maxZoom fields into CustomGeometrySourceOptions API instead of the formerly used \"zoomRange\"\n\n## Features ✨ and improvements 🏁\n* Rework setPrefetchZoomDelta to reduce loading of expensive tiles and optimize zoom use-case (#1850)\n* Send billing event when Map is loaded\n\n## Bug fixes 🐞\n* Fixed an issue that causes OnStyleLoaded callback not fired when there's a sprite loading error. ([#358](https://github.com/mapbox/mapbox-maps-android/pull/358))\n* Update map camera on first animator update. ([#352](https://github.com/mapbox/mapbox-maps-android/pull/352))\n* Fix crash due to missing access token ([#365](https://github.com/mapbox/mapbox-maps-android/pull/365))\n* Call style loaded callback if data set directly to geojson. ([#377](https://github.com/mapbox/mapbox-maps-android/pull/377))\n* Geojson async data parsing: fixes and improvements. ([#380](https://github.com/mapbox/mapbox-maps-android/pull/380))\n* Fix terrain transparency issue when a sky layer is not used\n* Make style pack resources immutable protecting the style pack from getting out of sync in case the style is updated remotely\n\n## Dependencies\n* Bump glNative to 10.0.0-beta.23, common to 13.0.0 ([#362](https://github.com/mapbox/mapbox-maps-android/pull/362))\n* Bump mapbox-events-android to latest releases telem-7.0.3 and core-4.0.2 ([#370](https://github.com/mapbox/mapbox-maps-android/pull/370))\n\n# 10.0.0-beta.20 - May 20, 2021\n## Breaking changes ⚠️\n* Introduce ResourceOptionsManager to configure the default resource options, and removed the xml configuration options for cache path and tile store path. ([#339](https://github.com/mapbox/mapbox-maps-android/pull/339))\n* Rename default ambient cache database to mapbox/maps/ambient_cache.db  ([#314](https://github.com/mapbox/mapbox-maps-android/pull/314))\n* Remove the usage of asset path from the codebase, as it is not useful in Android Maps SDK. ([#334](https://github.com/mapbox/mapbox-maps-android/pull/334))\n* Rename `NetworkConnectivity` to `OfflineSwitch`.\n* Remove `TileLoadOptions` from `TileRegionLoadOptions`. `networkRestriction` and `acceptExpired` can now be specified directly in `TileRegionLoadOptions`.\n* Add `totalBytes` and `transferredBytes` to TileStoreLoadResult.\n* `MapboxMap.setBounds` return type changed from Void to Expected.\n* Expose tileset version for sources that use TileJSON metadata.\n* ResourceRequest `offline-data` boolean field is replaced with the `source` string field, which whether the response came from network, cache or tile store.\n* Remove `Style.getStyleGeoJSONSourceClusterLeaves`, `Style.getStyleGeoJSONSourceClusterExpansionZoom`, `Style.getStyleGeoJSONSourceClusterChildren`. All those can be fully replaced by `MapboxMap.queryFeatureExtensions`.\n* Parsing geojson on a worker thread. Using DSL GeoJsonSource builders with the following functions `GeoJsonSource.Builder#feature`, `GeoJsonSource.Builder#featureCollection`, `GeoJsonSource.Builder#geometry` will immediately returns GeoJsonSource with no data set and starts preparing actual data using a worker thread. The data will be set to the GeoJsonSource once parsed. ([#327](https://github.com/mapbox/mapbox-maps-android/pull/327))\n\n## Features ✨ and improvements 🏁\n* Add a `cameraOptions(cameraState, builderBlock)` inline method that helps mutate an existing `CameraState` object. ([#317](https://github.com/mapbox/mapbox-maps-android/pull/317))\n* Add selected state handling to annotation plugin ([#316](https://github.com/mapbox/mapbox-maps-android/pull/316))\n* Add API for disabling vertical/horizontal scroll gestures ([#319](https://github.com/mapbox/mapbox-maps-android/pull/319))\n* Introduce API to enable render cache feature that could bring up rendering performance improvement. ([#326](https://github.com/mapbox/mapbox-maps-android/pull/326))\n* Add `removeAnnotationManager` API. ([#330](https://github.com/mapbox/mapbox-maps-android/pull/330))\n* Improve terrain's rendering performance\n* Set `begin` and `end` timestamps for StyleLoaded and MapLoaded events, so that developers could check how much time it takes to load style and map, respectively\n* Added `tile-requests-delay` and `tile-network-requests-delay` runtime source properties - an API for tile requests delay\n* Introduce MapOptions.optimizeForTerrain option that allow style rendering optimizations for terrain rendering\n* The `text-line-height` is now data-driven property\n* MapLoaded, StyleLoaded and StyleDataLoaded events now contain begin and end timestamps reflecting the effective duration timespan\n* When line lablels are inside the flip state retaining range (+/- 5 degrees around the vertical direction), the lables' flip state will be kept the same\n* Improve rendering quality of fill outlines when using render cache\n\n## Bug fixes 🐞\n* Fix scalebar doesn't refresh issue. ([#331](https://github.com/mapbox/mapbox-maps-android/pull/331))\n* Trigger nested high-level animator listener correctly. ([#335](https://github.com/mapbox/mapbox-maps-android/pull/335))\n* Make compass visible when camera was mutated while compass was disabled. ([#322](https://github.com/mapbox/mapbox-maps-android/pull/322))\n* Enable LocationComponent automatically when style loaded; fix null island location puck ([#333](https://github.com/mapbox/mapbox-maps-android/pull/333))\n* Fix crash if the belowLayerId doesn't exist on the current style ([#330](https://github.com/mapbox/mapbox-maps-android/pull/330))\n* Fixed an issue that style pack download cancels pending tileset descriptor resolving, now tile region loading and style pack loading can work in parallel.\n* Fixed the excessive network usage during map browsing caused by losing of the expiration date and the etag for the cached files\n* Fix excessive network usage for delayed tile requests\n* On style pack update we reset only glyphs and only when the updated options require less glyphs than currently available and we make sure ambient cache size limit is never exceeded\n* Emit `StyleDataLoaded` and `SourceDataLoaded` synchronously if possible, so that developers could modify style and sources before map starts rendering style\n* Fix occasional Adreno 640 and 620 driver warnings and deadlock when terrain is used\n* Fix rendering order of transparent terrain proxy tiles\n\n## Dependencies\n* Update telemetry (v7.0.1) and core (v4.0.1) dependencies to latest major version releases ([#337](https://github.com/mapbox/mapbox-maps-android/pull/337))\n* Bump gl-native to v10.0.0-beta.22 and common to v12.0.0. ([#338](https://github.com/mapbox/mapbox-maps-android/pull/338))\n\n# 10.0.0-beta.19 - May 5, 2021\n## Breaking changes ⚠️\n* Remove temporary CustomMapInterface used for testing, obsolete with having interface inheritance from upstream. ([#296](https://github.com/mapbox/mapbox-maps-android/pull/296))\n* Align MapCameraManagerDelegate with MapCameraManagerInterface ([#293](https://github.com/mapbox/mapbox-maps-android/pull/293))\n* Refactor CameraOptions and change `MapboxMap.getCameraState` method to return non-nullable CameraState record\n* Remove `MapboxMap.getMinZoom`, `MapboxMap.getMaxZoom` and `MapboxMap.getScale` methods that are duplicate of functionality provided by `MapboxMap.getBounds`. `MapboxMap.getBounds` returns new CameraBounds type with non-nullable fields.\n* Remove `MapboxMap.setDefaultFramebufferObject`.\n* Remove `MapboxMap.dumpDebugLog`.\n* Remove `isPanning`, `isRotating`, `isScaling` and `cancelTransitions` methods from MapboxMap. Controlling map animations should be done with camera animation plugin.\n* Remove following methods from MapCameraManagerDelegate (formerly MapCameraDelegate): getLan(), getLon(), getPitch(), getBearing(), getPadding(), setBearing(double). Those properties could be accessed now from MapCameraManagerDelegate.cameraState directly.\n\n### OfflineManager and CacheManager\n* Introduce TileStoreUsageMode enum and use it in resource options. New enum allows to set tile store usage mode in an non ambiguous way.\n* Cache manager asynchronous  calls complete even after the cache manager instance gets out of scope on the client side. Fix possible crash on setDatabasePath() call\n* CacheManager::prefetchAmbientCache() semantics is updated\n\n\n## Features ✨ and improvements 🏁\n* Add styleUri property in MapInitOptions ([#287](https://github.com/mapbox/mapbox-maps-android/pull/287))\n* Refactored plugin system to have more granular control over which plugins are loaded when creating a MapView programmatically. ([#231](https://github.com/mapbox/mapbox-maps-android/pull/231))\n* Instrument tests for offline ([#290](https://github.com/mapbox/mapbox-maps-android/pull/290))\n* Cleanup kdoc documentation, remove html tags ([#305](https://github.com/mapbox/mapbox-maps-android/pull/305))\n* Reduce GPU memory usage by reusing depth stencil buffer for terrain rendering\n\n\n## Bug fixes 🐞\n* Request layout when updating ornaments margins, making updates immediate ([#292](https://github.com/mapbox/mapbox-maps-android/pull/292))\n* Remove runtime plugin dependency for legacy location plugin. ([#295](https://github.com/mapbox/mapbox-maps-android/pull/295))\n* Fix an issue that causes the extension functions not discoverable from downstream projects. ([#299](https://github.com/mapbox/mapbox-maps-android/pull/299))\n* Style and map error loading listeners are only called for the style that was associated to the listeners when style loading started. This avoid calling the wrong listeners with multiple style loads. Renamed Style#isStyleLoadInited to Style#isStyleLoadInitiated. ([#300](https://github.com/mapbox/mapbox-maps-android/pull/300))\n* Fix crash if doing setCamera during map loading ([#310](https://github.com/mapbox/mapbox-maps-android/pull/310))\n* Fix map rendering issue when `text-field`'s inline images used with complex case expressions\n* Fix erroneous font eviction when `text-field`'s formatted sections have `text-font` overrides\n* Fix Adreno specific crash that happens when terrain is enabled\n* Fix OfflineManager network errors handling\n* Fix map rendering issue when feature-state and terrain features are enabled\n* The ResourceRequest event response.offline-data field now indicates whether or not the response came from tile store\n\n\n## Dependencies\n* Bump to gl-native v10.0.0-beta.21, update common v11.0.2. ([#304](https://github.com/mapbox/mapbox-maps-android/pull/304))\n\n# 10.0.0-beta.18 - April 22, 2021\n## Breaking changes ⚠️\n* Rename MapView plugin extension functions. ([#272](https://github.com/mapbox/mapbox-maps-android/pull/272))\n  - mapView.getAnnotationPlugin() -> mapView.annotations\n  - mapView.getGesturesPlugin() -> mapView.gestures\n  - mapView.getOverlayPlugin() -> mapView.overlay() // using function here because of experimental annotation\n  - mapView.getLocationComponentPlugin() -> mapView.location\n  - mapView.getCameraAnimationsPlugin() -> mapView.camera\n  - mapView.getAttributionPlugin() -> mapView.attribution\n  - mapView.getCompassPlugin() -> mapView.compass\n  - mapView.getLogoPlugin() -> mapView.logo\n  - mapView.getScaleBarPlugin() -> mapView.scalebar\n* Remove deprecated location plugin ([#276](https://github.com/mapbox/mapbox-maps-android/pull/276))\n* Add feature sdk initialisation ([#269](https://github.com/mapbox/mapbox-maps-android/pull/269))\n  - Load the Mapbox Street style by default if user doesn't load any style before the onStart lifecycle event.\n  - Introduce `CredentialsManager` to manage mapbox access token, when all `MapView`s should use same token could be handled by using `CredentialsManager.shared` static object.\n  - Introduce `MapInitOptions` to replace MapboxMapOptions.\n## Features ✨ and improvements 🏁\n* High-level animations return cancelable interface ([#262](https://github.com/mapbox/mapbox-maps-android/pull/262))\n* Introduce OfflineManager API that manages style packs and produces tileset descriptors for the tile store.\n  - By default, users may download up to 250MB of data for offline use without incurring additional charges. This limit is subject to change during the beta.\n  - The new API replaces the deprecated OfflineRegionManager API. The OfflineManager API can be used to create offline style packs that contain style data, such as: style definition, sprites, fonts and other resources. Tileset descriptors created by the OfflineManager API are used to create tile packs via TileStore API. Mobile maps SDKs use tile packs for rendering map content.\n* Add offline activity example. ([#259](https://github.com/mapbox/mapbox-maps-android/pull/259))\n* Load the Mapbox Street style by default if user doesn't load any style before the onStart lifecycle event([#248](https://github.com/mapbox/mapbox-maps-android/pull/248))\n\n## Bug fixes 🐞\n* Keep CompassPlugin enabled/disabled state after other properties update ([#252](https://github.com/mapbox/mapbox-maps-android/pull/252))\n* Fix disabling logo in xml. ([#273](https://github.com/mapbox/mapbox-maps-android/pull/273))\n* Introduce StyleInterface that include the current display's pixel ratio, and fix Style#addImage to take the correct pixel ratio from display.  ([#228](https://github.com/mapbox/mapbox-maps-android/pull/228))\n* Properly reset anchor after some gestures。 ([#279](https://github.com/mapbox/mapbox-maps-android/pull/279))\n* Remove animator cancel listeners logic duplicating end listeners logic. ([#280](https://github.com/mapbox/mapbox-maps-android/pull/280))\n\n## Dependencies\n* Bump gl-native to v10.0.0-beta.20, common to v11.0.1 ([#261](https://github.com/mapbox/mapbox-maps-android/pull/261))\n\n# 10.0.0-beta.17 - April 14, 2021\n## Breaking changes ⚠️\n* [Annotation plugin] Rename annotation classes, the rules are as follows and applied for Annotations/Options/Managers ([#227](https://github.com/mapbox/mapbox-maps-android/pull/227))\n    - Symbol -> PointAnnotation\n    - Circle -> CircleAnnotation\n    - Line -> PolylineAnnotation\n    - Fill -> PolygonAnnotation\n* mapboxMap.queryRenderedFeatures will return a new data class QueriedFeature which will contain additional properties ([#247](https://github.com/mapbox/mapbox-maps-android/pull/247)):\n    - source (id of the source)\n    - sourceLayer (id of the source's layer)\n    - state (feature's state)\n* Rename Style#isStyleFullyLoaded to Style#isStyleLoaded\n* Remove old map#drag API and the AnimationOptions API\n* Don't emit MapIdle event when there is gesture and / or user animation in progress\n* Make overlay plugin experimental ([#233](https://github.com/mapbox/mapbox-maps-android/pull/233))\n\n## Features ✨ and improvements 🏁\n* Introducing NetworkConnectivity API (offline switch). If setting setMapboxStackConnected(false), the Reachability API will report NotReachable, http requests are being blocked and if running, cancelled.\n* Added new CameraManager.cameraForCoordinates overload\n* Added support for query rendered features for Circle Layer on Terrain\n* Enable identical code folding and -lto-O3 optimizations to reduce binary size of native map shared library\n\n## Bug fixes 🐞\n* Fix runtime crash if logo / attribution not enabled ([#240](https://github.com/mapbox/mapbox-maps-android/pull/240))\n* Fixed a bug that causes map not loading when connected through ethernet.\n* Fix distance expression parsing for geometries containing over 20k points\n* Fixed holes in the ground for terrain with negative elevation\n* Make StyleImageMissing callback a no-op after ImageManager destruction\n* Reset unprocessed event queue for destructed renderer\n* Fix clipping of fill-extrusions on near plane\n* Set 'clusterMaxZoom' to be 'maxZoom-1' when it is not provided\n* Fix crash for the case when MapSnapshotter object is destructed from within user provided callback\n* Terrain render cache now disabled during property transitions\n* Fix missing terrain tiles when camera is on mountain peak\n* Black screen not used during loading anymore, prefering platform background\n* Emit CameraChanged, SourceAdded(Removed) and StyleImageMissing events synchronously\n\n## Dependencies\n* [deps] Bump gl-native to v10.0.0-beta.19, common to v11.0.0 ([#247](https://github.com/mapbox/mapbox-maps-android/pull/247))\n\n# 10.0.0-beta.16 - March 25, 2021\n\n## Breaking changes ⚠️\n* Remove ModelLayer and ModelSource API ([#128](https://github.com/mapbox/mapbox-maps-android/pull/128))\n* Refactor Event API into new Observers. ([#166](https://github.com/mapbox/mapbox-maps-android/pull/166))\n* Bump minSdkVersion of the SDK to 21, and bumped okhttp dependency to v4.9.0. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* Rename jumpTo(options: CameraOptions) to setCamera(options: CameraOptions), rename setFreeCameraOptions (options: FreeCameraOptions) to setCamera(options: FreeCameraOptions). ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* Rename OnMapLoadingFinishedListener to OnMapLoadedListener. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* Introduce OnStyleDataLoadedListener to replace OnStyleLoadingFinishedListener, and introduce OnSourceDataLoadedListener to replace OnSourceChangedListener. So that developers have granular control of style/source loading status. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* Introduce coordinateBoundsForCamera() API to replace the getRegion() API. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* Remove MapObserver from MapSurface's constructor. ([#200](https://github.com/mapbox/mapbox-maps-android/pull/200))\n\n## Features ✨ and improvements 🏁\n* [Annotation plugin] Add symbol cluster support ([#122](https://github.com/mapbox/mapbox-maps-android/pull/122))\n* [map] Make public API entry points as MapView and Snapshotter ([#149](https://github.com/mapbox/mapbox-maps-android/pull/149))\n* [plugins] Remove PluginRequirementException ([#158](https://github.com/mapbox/mapbox-maps-android/pull/158))\n* Use String protocol for passing GeoJSON data  ([#162](https://github.com/mapbox/mapbox-maps-android/pull/162))\n* [Annotation plugin] Set default values for annotation option properties to null. ([#173](https://github.com/mapbox/mapbox-maps-android/pull/173))\n* [rendering] Schedule non-rendering tasks on Android's scheduler to improve render performance. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* [rendering] Query rendered features now work for fill-extrusions when terrain is enabled. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* [rendering] Improved terrain rendering performance due to reduction of loaded tiles. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* [doc] Change http link to markdown style in doc  ([#187](https://github.com/mapbox/mapbox-maps-android/pull/187))\n* [rendering] Differentiate render tasks and non-render tasks ([#192](https://github.com/mapbox/mapbox-maps-android/pull/192))\n* [gestures] Introduce platform-driven drag API to move a map ([#201](https://github.com/mapbox/mapbox-maps-android/pull/201))\n\n## Bug fixes 🐞\n* [Annotation plugin] Implement MapStyleObserverPlugin to listen style load event to reload layer and source ([#161](https://github.com/mapbox/mapbox-maps-android/pull/161))\n* [gestures] Fix crash if zooming for SDK less than 23 ([#171](https://github.com/mapbox/mapbox-maps-android/pull/171))\n* Fix an issue that will result in map not rendering on a device with Ethernet connection. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* Fix the crash when running maps on the emulator. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* Patch scroll gesture with a pitched camera ([#184](https://github.com/mapbox/mapbox-maps-android/pull/184))\n* [locationcomponent] Fix jitter animations if interrupting animations ([#185](https://github.com/mapbox/mapbox-maps-android/pull/185))\n* [animation] Fix zero duration animators, fix medium-level animators to use only CameraAnimators ([#198](https://github.com/mapbox/mapbox-maps-android/pull/198))\n* [animations] Fix interpolation for flyTo ([#202](https://github.com/mapbox/mapbox-maps-android/pull/202))\n\n## Dependencies\n* Update minSdkVersion of the SDK to 21, and bumped okhttp dependency to v4.9.0. ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n* Update gl-native to v10.0.0-beta.17, common to v10.0.2 ([#176](https://github.com/mapbox/mapbox-maps-android/pull/176))\n\n# 10.0.0-beta.15 - March 5, 2021\n\n## Bugs\n* [annotation] Fix text-font issue in annotation plugin. ([#144](https://github.com/mapbox/mapbox-maps-android/pull/144))\n\n## Dependencies\n* [gl-native] Update to v10.0.0-beta.16, common to beta.12 ([#137](https://github.com/mapbox/mapbox-maps-android/pull/137))\n\n# 10.0.0-beta.14 - February 24, 2021\n\n## Breaking changes\n* [map] Change signature of Map#getElevation from Float to Double [#120](https://github.com/mapbox/mapbox-maps-android/pull/120)\n* [map] Fixed text-field strings are now returned as formatted expressions [#120](https://github.com/mapbox/mapbox-maps-android/pull/120)\n* [annotation] Rename getAnnotationManger to createAnnotationManager [#105](https://github.com/mapbox/mapbox-maps-android/pull/105)\n* [style] GeoJsonSource data property can't be empty [#120](https://github.com/mapbox/mapbox-maps-android/pull/120)\n\n## Features\n* [location-component] Add isLocatedAt API to location component plugin [#99](https://github.com/mapbox/mapbox-maps-android/pull/99)\n* [snapshot] Introduce interfaces for style events and snapshot result [#124](https://github.com/mapbox/mapbox-maps-android/pull/124)\n* [annotation] Process anchor animators correctly [#109](https://github.com/mapbox/mapbox-maps-android/pull/109)\n* [annotation] Limit adding style images multiple times for annotations [#118](https://github.com/mapbox/mapbox-maps-android/pull/118)\n* [annotation] Add GeoJSONOptions configuration [#79](https://github.com/mapbox/mapbox-maps-android/pull/79)\n* [annotation] Show all icons and text from annotation manager by default [#115](https://github.com/mapbox/mapbox-maps-android/pull/115)\n* [animation] Add kotlin dsl builder for CameraOptions and java builders for CameraAnimatorOptions and MapAnimationOptions [#90](https://github.com/mapbox/mapbox-maps-android/pull/90)\n* [map] Better use of Choreographer inside renderer resulting to smoother map animations [#107](https://github.com/mapbox/mapbox-maps-android/pull/107)\n* [gestures] change default interpolator from Decelerate to LinearOutSlowIn [#103](https://github.com/mapbox/mapbox-maps-android/pull/103)\n\n## Bugs\n* [compass] Hide the compass on startup when facing north [#116](https://github.com/mapbox/mapbox-maps-android/pull/116)\n* [annotation] Change default value of text font for symbols to null [#111](https://github.com/mapbox/mapbox-maps-android/pull/111)\n* [map] Remove renderStill from public API [#104](https://github.com/mapbox/mapbox-maps-android/pull/104)\n* [style]  Rename reference to style plugin and converting them to style extension [#123](https://github.com/mapbox/mapbox-maps-android/pull/123)\n* [annotation] Expose collection of annotations as a List instead of Map [#121](https://github.com/mapbox/mapbox-maps-android/pull/121)\n* [camera] Trigger map camera change updates immediately, Fix order of animation callbacks in camera animation plugin [#125](https://github.com/mapbox/mapbox-maps-android/pull/125)\n\n## Dependencies\n* [gl-native] update to v10.0.0-beta.15 [#120](https://github.com/mapbox/mapbox-maps-android/pull/120)\n* [common] update to v10.0.0-beta.11 [#120](https://github.com/mapbox/mapbox-maps-android/pull/120)\n\n# 10.0.0-beta.13 - February 10, 2021\n\n## Features\n* [map] Expose FPS listener [#80](https://github.com/mapbox/mapbox-maps-android/pull/80)\n* [annotation] Add convenience color int API [#76](https://github.com/mapbox/mapbox-maps-android/pull/76)\n* [annotation] Add convenience bitmap API for symbols [#67](https://github.com/mapbox/mapbox-maps-android/pull/67)\n* [annotation] Make getting annotation manager configurable [#47](https://github.com/mapbox/mapbox-maps-android/pull/47)\n* [location] Improve the default location provider and improve handling of location updates [#58](https://github.com/mapbox/mapbox-maps-android/pull/58)\n* [location] Add OnIndicatorPositionChangedListener and OnIndicatorBearingChangedListener [#56](https://github.com/mapbox/mapbox-maps-android/pull/56)\n\n## Bugs\n* [map] allow getSourceAs returning null values, handle cast gracefully [#88](https://github.com/mapbox/mapbox-maps-android/pull/88)\n* [animation] remove internal plugin singleton, support multi display maps [#70](https://github.com/mapbox/mapbox-maps-android/pull/70)\n* [telemetry] correct versioning of BuildConfig [#65](https://github.com/mapbox/mapbox-maps-android/pull/65)\n* [annotation] Fix offset array not working issue [#60](https://github.com/mapbox/mapbox-maps-android/pull/60)\n* [plugin] make xml attribute parsers internal [#81](https://github.com/mapbox/mapbox-maps-android/pull/81)\n\n## Dependencies\n* [gl-native] update to v10.0.0-beta.14 [#87](https://github.com/mapbox/mapbox-maps-android/pull/87)\n* [common] update to v10.0.0-beta.9.1 [#87](https://github.com/mapbox/mapbox-maps-android/pull/87)\n\n# 10.0.0-beta.12 - January 27, 2021\n\n## Announcement\n\nV10 is the latest version of the Mapbox Maps SDK for Android. v10 brings substantial performance improvements, new features like 3D terrain and a more powerful camera, modern technical foundations, and a better developer experience.\n\nTo get started with v10, please refer to our [migration guide](https://docs.mapbox.com/android/beta/maps/guides/migrate-to-v10/).\n\n## Known Issues\n\n### Style\n\n* Currently there is no compile-time validation of the Style DSL, exceptions will be thrown in runtime.\n\n### Location\n\n* Location component plugin is still under active development and the interfaces are subject to change.\n\n### 3D Terrain\n\n* 3D Terrain is in an experimental state\n* 3D Terrain crashes on specific GPU hardware:\n    * Qualcomm Adreno 640\n\n### Other\n* Annotation plugin is not feature complete with the old implementation\n* Restricting the map to a bounds that includes the antemeridian will result in an invalid jump to the left side of the bounds.\n* Known deficiencies with max and min zoom map properties\n* An invalid LatLng conversion can occur and produce a native crash\n* Native crash when resuming the map in specific situations\n* Native crash when performing a camera transition using Map#jumpTo\n"
  },
  {
    "path": "CODE-OF-CONDUCT.md",
    "content": "# Code of conduct\n\nEveryone is invited to participate in this project and public discussions: we want to create a welcoming and friendly environment. Harassment of participants or other unethical and unprofessional behavior will not be tolerated in our spaces.\n\nThe [Contributor Covenant](https://contributor-covenant.org) applies to [all projects under the Mapbox organization](https://github.com/mapbox) and we ask that you please read [the full text](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html).\n\nPlease report any instances of behavior violating this code to conduct@mapbox.com. Our team will handle any such report confidentially, and promptly review and investigate the situation and act to [enforce](https://www.contributor-covenant.org/version/2/0/code_of_conduct#enforcement) this code of conduct as needed."
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nWe welcome contributions to this project.\n\nIf you have a usage question about the Mapbox Maps SDK for Android, please visit https://www.mapbox.com/help/.\n\nIf you'd like to contribute code:\n\n1. Please familiarize yourself with the [install process](README.md), the [development process](DEVELOPING.md), and the contributor license agreement (CLA) at the bottom of this document. All contributions to the project must reflect its development standards and be offered under the terms of the CLA.\n\n2. Ensure that existing [pull requests](https://github.com/mapbox/mapbox-maps-android/pulls) and [issues](https://github.com/mapbox/mapbox-maps-android/issues) don’t already cover your contribution or question. If your planned contribution involves significant changes to the SDK, consider opening a new issue to discuss your design before beginning work.\n\n3. Pull requests are gladly accepted. If your PR makes changes to the SDK that developers should be aware of, please be sure to update [CHANGELOG.md](CHANGELOG.md)\n\n4. Prefix your commit messages with the relavent labels that your changes affect: `[sdk]`, `[gestures]`, `[telemetry]`, `[animation]`, `[location]`, ...\n\n### GitHub issue labels\n\nOur labeling system is:\n\n * **minimalistic:** Labels’ usefulness are inversely proportional to how many we have.\n * **objective:** Labels should be objective enough that any two people would agree on a labeling decision.\n * **useful:** Labels should track state or capture semantic meaning that would otherwise be hard to search for.\n\n# Contributor License Agreement\n\nThank you for contributing to the Mapbox Maps SDK for Android (\"the SDK\")! This Contributor License Agreement (“Agreement”) sets out the terms governing any source code, object code, bug fixes, configuration changes, tools, specifications, documentation, data, materials, feedback, information or other works of authorship that you submit, beginning January 25, 2021, in any form and in any manner, to the SDK (https://github.com/mapbox/mapbox-maps-android) (collectively “Contributions”).\n\nYou agree that the following terms apply to all of your Contributions beginning January 25, 2021. Except for the licenses you grant under this Agreement, you retain all of your right, title and interest in and to your Contributions.\n\n**Disclaimer.** To the fullest extent permitted under applicable law, you provide your Contributions on an \"as-is\" basis, without any warranties or conditions, express or implied, including, without limitation, any implied warranties or conditions of non-infringement, merchantability or fitness for a particular purpose. You have no obligation to provide support for your Contributions, but you may offer support to the extent you desire.\n\n\n**Copyright License.** You hereby grant, and agree to grant, to Mapbox, Inc. (“Mapbox”) a non-exclusive, perpetual, irrevocable, worldwide, fully-paid, royalty-free, transferable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, and distribute your Contributions and such derivative works, with the right to sublicense the foregoing rights through multiple tiers of sublicensees.\n\n\n**Patent License.** To the extent you have or will have patent rights to grant, you hereby grant, and agree to grant, to Mapbox a non-exclusive, perpetual, irrevocable, worldwide, fully-paid, royalty-free, transferable patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer your Contributions, for any patent claims infringed by your Contributions alone or by combination of your Contributions with the SDK, with the right to sublicense these rights through multiple tiers of sublicensees.\n\n\n**Moral Rights.** To the fullest extent permitted under applicable law, you hereby waive, and agree not to assert, all of your “moral rights” in or relating to your Contributions for the benefit of Mapbox, its assigns, and their respective direct and indirect sublicensees.\n\n\n**Third Party Content/Rights.** If your Contribution includes or is based on any source code, object code, bug fixes, configuration changes, tools, specifications, documentation, data, materials, feedback, information, or other works of authorship that you did not author (“Third Party Content”), or if you are aware of any third party intellectual property or proprietary rights in your Contribution (“Third Party Rights”), then you agree to include with the submission of your Contribution full details on such Third Party Content and Third Party Rights, including, without limitation, identification of which aspects of your Contribution contain Third Party Content or are associated with Third Party Rights, the owner/author of the Third Party Content and/or Third Party Rights, where you obtained the Third Party Content, and any applicable third party license terms or restrictions for the Third Party Content and/or Third Party Rights. (You need not identify material from the Mapbox Web SDK project as “Third Party Content” to fulfill the obligations in this paragraph.)\n\n\n**Representations.** You represent that, other than the Third Party Content and Third Party Rights you identify in your Contributions in accordance with this Agreement, you are the sole author of your Contributions and are legally entitled to grant the licenses and waivers in this Agreement. If your Contributions were created in the course of your employment with your past or present employer(s), you represent that such employer(s) has authorized you to make your Contributions on behalf of such employer(s) or such employer(s) has waived all of their right, title or interest in or to your Contributions.\n\n\n**No Obligation.** You acknowledge that Mapbox is under no obligation to use or incorporate your Contributions into the SDK. Mapbox has sole discretion in deciding whether to use or incorporate your Contributions.\n\n\n**Disputes.** These Terms are governed by and construed in accordance with the laws of California, without giving effect to any principles of conflicts of law. Any action arising out of or relating to these Terms must be filed in the state or federal courts for San Francisco County, California, USA, and you hereby consent and submit to the exclusive personal jurisdiction and venue of these courts for the purposes of litigating any such action.\n.\n\n**Assignment.** You agree that Mapbox may assign this Agreement, and all of its rights, obligations and licenses hereunder.\n"
  },
  {
    "path": "DEVELOPING.md",
    "content": "# Developing\n\nWelcome to the Mapbox Maps SDK for Android project. This document describes every step\nof the development cycle of our project and make sure you have everything you\nneed to get your pull request (PR) landed. Your contributions are appreciated.\n\n## Building\n\nThe buildsystem of Mapbox Maps SDK for Android is [Gradle](https://gradle.org/) but there is a [Make](https://www.gnu.org/software/make/manual/make.html)\nfile to make some tasks more convenient and discoverable to execute.\nFamiliarity with `make` is a plus but not a requirement.\nThis document will assume you are familiar with\n[git](https://git-scm.com/) and will not get into details about `git` commands.\n\nWhen not explicitly specified, commands described are assumed to be executed from\nthe root of the project tree.\n\n### Setting up the repository\n\nClone the git repository:\n\n```\n$ git clone git@github.com:mapbox/mapbox-maps-android.git && cd mapbox-maps-android\n```\n\n### Installing the dependencies\n\nThe only requirement is to install the latest version of\n[Android Studio](https://developer.android.com/studio). After installed, run the\n[`sdkmanager`](https://developer.android.com/studio/command-line/sdkmanager) command line or\nthrough the GUI interface to make sure the extra requirements to build Android are met.\n\nNote: Android Gradle Plugin v7.0+ is used to build the project. That requires JDK 11 or higher installed\nand `JAVA_HOME` environment variable pointing on it.\n\n```\n$ ${ANDROID_HOME}/tools/bin/sdkmanager \\\n      \"platform-tools\" \\\n      \"platforms;android-33\" \\\n      \"build-tools;30.0.3\" \\\n      \"build-tools;33.0.0\" \\\n      \"extras;android;m2repository\" \\\n      \"patcher;v4\" \\\n      \"extras;google;m2repository\" \\\n      \"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2\" \\\n      \"ndk;23.2.8568313\"\\\n      \"cmake;3.22.1\"\n```\nOptional : In case of errors related to ndk version, make sure the ndk path is set in Android Studio.\nYou can set ndk path manually by navigating to `File -> Project Structure -> Android NDK Location`\nor follow the official guide [Install and configure NDK](https://developer.android.com/studio/projects/install-ndk)\n\n### Opening the Maps SDK\n\nThis repository is a regular Android Studio project. Open Android Studio and import this repository’s root `mapbox-maps-android` folder.\n\n### Configuring the project\n\nBefore building, the project needs to be configured. A couple of configurations need to be in place before\na successful build and test run can be made. Either export the following values as environement variables\nor update them inline in the source code:\n\n#### SDK Registry token\n\nThe SDK_REGISTRY_TOKEN is a Mapbox access token, used during compile time, with a scope set to `DOWNLOADS:READ`.\nThis token allows to download all required Mapbox dependencies from a Mapbox Maven instance.\nThe DOWNLOADS:READ scope can be set when creating a new access token on https://account.mapbox.com/.\nThe token configuration can be found in the root `build.gradle.kts` of the project.\n\n#### Mapbox Access token\n\nThe MAPBOX_ACCESS_TOKEN is a mapbox access token, packaged as part of test application, to load Mapbox tiles and resources.\nThis token can be configured on https://account.mapbox.com/ and doesn't require any specific scopes.\nAfter first compilation, a gitignored file, is generated in `app/src/main/res/values/developer-config.xml`.\n\n### Initial build\n\nTo verify if everything has been correctly setup so far, you can run the following make command to compile the project:\n\n```\n$ make sdk-build\n```\n\n## Checks\n\nBefore pushing your code and triggering the CI, it is important that all the\nchecks are passing. Checks are mostly code formatters and code generators. In\norder to run the checks you need to execute the `check` target.\n\n```\n$ make check\n```\n\nThis target encapsulates validating:\n - ktlint\n - lint\n - kdoc validation\n - code generation\n\nAs a convenience, the CI will run the checks again and will let you know if the\ncode is completely formatted and if everything that was supposed to be generated\nwas generated.\n\n### Secret shield\n\nThis project uses [secret-shield](https://github.com/mapbox/secret-shield) to help block secrets such\nas access tokens from being exposed.\n\nInstall `secret-shield` by entering `npm install -g @mapbox/secret-shield`.\nInstall the pre-commit hook by running `scripts/install-pre-commit/install-pre-commit.sh`\n\n### Code formatting\n\nWe follow [Kotlin Coding Conventions](https://kotlinlang.org/docs/reference/coding-conventions.html) \nand official [Kotlin Style Guide](https://developer.android.com/kotlin/style-guide).\n\nAll the projects are configured with `kotlin.code.style=official` in gradle.properties, so you \nmay autoformat the code in Android Studio by default.\n\n#### ktlint\nWe use `ktlint` to validate formatting and there's a check on CI preventing PR from merge \nif `ktlint` fails.\n\nCheck if format is correct with `ktlint` or `./gradlew ktlint`.\nRun `ktlintFormat` or `./gradlew ktlintFormat` or `make fix` to automatically reformat everything and \nfix all the issues.\n\n### Public API changes tracking\nWe use [binary-compatibility-validator](https://github.com/Kotlin/binary-compatibility-validator) and\n[Metalava](https://android.googlesource.com/platform/tools/metalava/) for tracking binary and source\ncompatibility of the APIs we ship.\n\n* When doing code changes that do not imply any changes in public API, no additional actions need to\nbe performed. The bots named `check-api-*` will validate if there's any API breaking changes.\n* When doing code changes that imply changes in public API, whether it is a new API or adjustments to\nthe existing one, `check-api-*` tasks will start to fail. `make update-api` should be executed manually,\nthe resulting diff in `.api` file should be verified: only signatures you expected to change should be changed.\n* Commit the resulting `.api` diff along with code changes.\n\n## Code\n\n### Project overview\nThe Mapbox Maps SDK for Android is a multi module gradle project with Android Libraries and Android\napplications.\n\n#### sdk-base\nThis module is the shared dependency across modules and contains primarily interfaces.\nThis module enables us to independently develop other modules against interfaces and not rely\non any concrete implementation. By having this strict decoupling, we makes sure we think well about\nthe contracts a module has with other and what public API it exposes to consumers.\n\n#### maps-sdk\nThe maps-sdk module is the main module developers integrate in their project. It contains the most\nimportant building blocks of the product that couldn't have been decoupled from the underlying\nc++ implementation at this time.\n\n#### module\nIf a module is prefixed with the name `module-` it indicates it's a required module and will\nbe enforced to be available during compilation time. This enforcement is enabled and configured\nthrough the annotation processor of [mapbox-base-android](https://github.com/mapbox/mapbox-base-android).\n\n#### plugin\nIf a module is prefixed with the name `plugin-` it indicates it's an optional module that will\nbe loaded automatically at runtime if it's part of the compilation classpath. Plugins can be\nexcluded with a gradle exclusion to disable a plugin fully and to save binary size. By\ndefault we package the majority of the plugins found in this repository.\n\n#### extension\nIf a module is prefxied with the name `extension-` it indicates it's a collection of extension\nfunctions that makes it more easy and fluent to integrate with an existing, low-level, API.s The code in those\nmodules use [Kotlin extension functions](https://kotlinlang.org/docs/reference/extensions.html) to\nadd APIs to existing classes.\n\n#### app\nThe app module is the internal test and development application. It hosts a variety of different\nexample use-cases to test the code from all the other modules. This module can be referenced when\nbuilding out other examples.\n\n### Generated code\nThe project contains a large number of code generated files that should not be touched manually.\nThese can be recognised with a top file comment as `// This file is generated.`. Code generators\nare hosted externally from this repository and generated code requires to be up-to-date when making a\npull request.\n\n## Testing\n\nMapbox Maps SDK for Android relies on unit, instrumentation, robo and benchmark test to verify our\ncode correctness. No code is accepted by our CI if any of these tests are failing. When developing\na new feature, you are required to write a test and make sure that the test coverage will not go\ndown. A feature will be considered tested if an unit test is provided that verifies the\nbusiness logic and a instrumentation test is provided that executes the codepath down to the C++\ncode and back.\n\nWhen fixing a bug, you are also required to provide a test that fails if the fix\nfor the bug is not applied. The test in this case, triggers the faulty behavior\nand will make sure the bug is not going to be reintroduced and our code regresses.\n\n### Unit tests\n\nUnit tests are the tests that validate the business logic of the SDK. Since unit test on Android\nare executed on the JVM of the development machine, we aren't able to load native libraries and\ncall into our C++ stack. Any of those interactions will need to be either mocked or shadowed. To\nachieve this we are using a couple of frameworks as [Mockk](https://mockk.io/) and\n[Robolectric](http://robolectric.org/).\n\nUnit tests, for all modules, can be run locally with:\n\n```\n$ make unit-tests\n```\n\n### Instrumentation tests\n\nInstrumentation tests are integration test that validate the integration with the Android OS and\nour C++ code. It allows to render the actual Map on an Android device or emulator. It's important\nthat features are accompanied by a instrumentation test as C++ issues will only show at runtime.\n\nInstrumentation tests are run on [Firebase TestLab](https://firebase.google.com/docs/test-lab).\nThe CI push a test application and an application with the tests to a physical device on the\nFirebase device farm. This device is fully allocated to our test at the moment the test is running.\n\nThe build step that pushes the app to Firebase will give you an URL that can be\nused for checking the phone logs in case of a crash or test failure. If you\ndon't have access to Firebase, please ask a member of the Maps team.\n\nIn order to run tests on multiple devices, the last commit in a branch must have\n`multiple_devices` message. We also run tests on multiple device automatically\nwhen the release tag is added.\n\nThe CircleCI bot will wait for the Firebase test to finish, collect the results,\npublish them as build artifact and fail/succeed accordingly.\n\nInstrumentation tests are divided across 3 modules:\n - maps-sdk: contains instrumentation tests that validate C++ integration of the SDK\n - app: contains instrumentation tests that validate specific feature integrations\n - extension-style-app: contains instrumentation tests for validating the style integration\n\nInstrumentation tests can be run locally on a device or emulator with:\n\n```\n$ make instrumentation-tests\n```\n\n#### Generated Instrumentation tests\n\nNext to hand written tests, we generate a large bulk of our tests. Either these are generated as\npart of a code generator which will generate a test specific to a feature or we generate smoke test\nthat validate integration of a feature within our test application.\n\nGeneration of the latter, the sanity smoke tests, can be done with:\n\n```\n$ make generate-sanity-test\n```\n\nThe source code of this generator is found under `scripts/sanity-test` and uses\n[ejs templates](https://ejs.co/).\n\n### Robo tests\n\n[Firebase Robo tests](https://firebase.google.com/docs/test-lab/android/robo-ux-test) are\nintegration tests that involves providing invalid, unexpected, or random data as inputs to the\ntest application. This allows us to find bugs that arise in edge-cases situations. Robo tests are\nexecuted as part of a CI run and run for 10 minutes.\n\n## Commit messages\n\nCommit messages should read as prose. A commit message should tell a story about\nthe what, how and why a change is happening. All commit messages should be pre fixed with the\nmodule their are changing, omitting the type of module.\n\n```\n[logo] Rename visibility feature to enabled.\nThis is to align plugin vocabulary across the codebase and the plugin system.\nEnabled is now made part of the Plugin interface and removed from the Logo specific interface.\nAll tests and referneces in the SDK and test applications have been updated to resemble this change.\n```\n\n## Changelog\n\nIf your change is not trivial, it deserves a changelog entry, so we can tell\nour users about it on the next release. Please include a changelog entry\nas shown by the PR template. If no changelog needs to be added, please include\n`skip changelog` label.\n\n## API documentation\n\nKotlin API documentation can be generated with [Dokka](https://github.com/Kotlin/dokka) in `build/dokka/htmlCollector` with running\n\n```\n$ make dokka-html\n```\n\n## Code review\n\nCongratulations, you made a pull request. You most certainly added tests,\na good PR description and commit message and all the bots are happy about your contribution.\n\nThe humans working on the project might have a constructive feedback to your\ncode. You will need the approval of at least one team member of the Maps SDK team to land your\npatch. It is a rare occasion, except for trivial changes, that a patch will get approved with no\ncomments.\n\nPlease take a moment to appreciate the reviewer feedback. Reviewing pull\nrequests is an arduous and time consuming task. You can make the life of the\nreviewing easier by making small pull requests. It is easier to land a feature\none small self contained functionality at a time. It is also OK to disagree with\nthe reviewer or ask for more details on why a change is needed.\n\nSometimes we will approve with a \"nit\" or trivial request. One example is, \"PR\nlooks good but please fix that typo or let's use a more descriptive name for\nvariable foobar\". In this case you can fix your PR, push it again and land it\nas soon as the bots are green.\n\nA reviewer will always trust the developer. It is the developer responsibility\nto test the feature end-to-end and make sure we can ship a state of the art map\nrendering engine to our users.\n\nAnd as always, everyone is invited to review code.\n\n## Making releases\n\n### Versioning\n\nThe SDK, the default extensions and the default plugins use the same versioning, which is defined by the\n`VERSION_NAME` variable in the root project's gradle.properties. However, the project also allows to use\nseparate versioning for individual subprojects/modules. Subprojects can define the `MODULE_VERSION_NAME`\nin the subproject-level gradle.properties to overwrite the `VERSION_NAME` defined in the root project.\n\n### Publish new releases\n\nThe CI is setup to publish new releases when new tag that follows the release tag pattern is created.\n\n* To publish a Maps SDK release with all the default plugins/extensions, create a release git tag `v*`.\n\n## Opening tickets\n\nEveryone is welcome to open issues or make feature requests on the Mapbox Maps SDK for Android\nrepository. Make sure, in case of an issue, it can be reproduced with\nthe latest version of Mapbox Maps SDK for Android, otherwise it is very likely it was\nalready fixed. Search our issue tracker for similar issues, if you found a problem,\nmaybe someone else also found the same problem and you may contribute to the issue\nreport. Same goes for feature requests, it might be that someone else already\nrequested the feature you want.\n\n### Issue checklist\n\nA great bug report will have many of the following:\n\n - Detailed steps to reproduce the issue.\n - The version of the SDK causing the problem.\n - The hardware in use when the problem was detected (i.e. Samsung Galaxy A71).\n - The version of the operating system (i.e. Android KitKat).\n - The style JSON or URL used as the map style.\n - The camera configuration (coordinates, zoom, bearing and pitch).\n - When adding a GeoJSON source to the map, the URL for the GeoJSON.\n - If customizations such as overlays and custom layers are in use and how.\n - If using runtime styling, a list of changes used to mutate the style.\n - A symbolicated backtrace in case of a crash.\n - Screenshot or video demonstrating the problem.\n - A test reduction, meaning a code example that can reproduce the problem.\n\n## Symbolicating native crashes\n\nThe Mapbox Maps SDK for Android uses C++ code under the hood. By default, the used C++ binary\nwill be stripped from symbols which means that stacktraces produced are not readable. To symbolicate\nC++ traces you can use [ndk-stack](https://developer.android.com/ndk/guides/ndk-stack) and a binary that has the symbols attached.\n\n### Download the unstripped binary\n\nNext to Mapbox Maven distribution mechanism, Mapbox Android binaries can be downloaded as a zipped\narchive. This zipped version contains the additional shared objects with debug symbols.\nReplace in following command the SDK_REGISTRY_TOKEN and VERSION with the appropriate values:\n\n```\n$ curl --user mapbox:{SDK_REGISTRY_TOKEN} https://api.mapbox.com/downloads/v2/mobile-maps-android-core/releases/android/{VERSION}/android-core-all.zip --output android-core-all.zip\n```\n\n### Running NDK stack\n\nAfter unzipping the archive you can run ndk-stack on the unstripped native binary and your\nstacktrace that was saved as a txt file.\n\n```\n$ ndk-stack -sym obj/arm64-v8a -dump trace.txt\n```\n\nNote that the stacktrace _must_ be formatted properly, otherwise ndk-stack will not be able to symbolicate\nthe stacktrace. Different crash reporting tools often format stacktraces differently, so you might need to reformat the stacktrace.\nThe stacktrace should be formatted as follows:\n\n```\n*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\n  #00 pc acfed libmapbox-maps.so\n  ...\n  #12 pc 51f408 libmapbox-maps.so (BuildId: 331a309c6d4e90a8)\n```\n\ne.g. start with asterisks line, followed by stack entries. \nStack entries should start with at least one space, then a hash sign with a stack entry number, \nthen `pc`, then the address (_without_ the `0x` prefix), then the library name.\n\n## Working with snapshots\n\nThe Mapbox Maps SDK for Android publishes snapshot releases to our API downloads infrastructure. These\nsnapshots can be used in downstream project to verify bug fixes or preview new features. However, we\ndo not recommend using snapshot releases in production environment.\n\n### Automatic snapshot releases\n\nSnapshot releases are automatically published once a day and the main branch points to the latest snapshot.\n\n### Use snapshot releases in your app\n\nSnapshot releases are distributed from a different Downloads API endpoint, you will need to add\nthis API endpoint to your project's `build.gradle` as follows:\n\n```gradle\nallprojects {\n  repositories {\n    maven {\n      url 'https://api.mapbox.com/downloads/v2/snapshots/maven'\n      authentication {\n          basic(BasicAuthentication)\n      }\n      credentials {\n        // Do not change the username below.\n        // This should always be `mapbox` (not your username).\n          username = 'mapbox'\n          // Use the secret token you stored in gradle.properties as the password\n          password = project.properties['MAPBOX_DOWNLOADS_TOKEN'] ?: \"\"\n      }\n    }\n  }\n}\n```\n\nWhere the password is the secret token and can be configured following the [installation guide](https://docs.mapbox.com/android/beta/maps/guides/install/#configure-credentials)\n\nAnd then update the Mapbox Maps SDK's version name to the snapshot version in your app's `build.gradle`.\n\n## Working with traces\n\nIf you're experiencing performance problems, enabling and analyzing traces is a crucial step for diagnosis. For step-by-step instructions on how to enable tracing and interpret the collected data, please consult the [tracing guide](https://docs.mapbox.com/android/maps/guides/debugging-and-profiling/tracing/).\n\n## Logging\n\nThe Maps SDK for Android logs are handled by [MapboxLogger](https://github.com/mapbox/mapbox-maps-android/blob/main/sdk-base/src/main/java/com/mapbox/maps/MapboxLogger.kt), which provides a unified logging interface for all SDK components. It uses `com.mapbox.common.Log` from the Mapbox Common SDK under the hood.\n\nExample usage:\n```kotlin\nimport com.mapbox.maps.logD\n// ...\nlogD(TAG, \"Debug message\")\n```\n"
  },
  {
    "path": "LICENSE.md",
    "content": "### License\n\nMapbox Maps for Android version 11.23.0-SNAPSHOT-04-09--02-04.git-8a87ed7\nMapbox Maps Android SDK\n\nCopyright &copy; 2021 - 2026 Mapbox, Inc. All rights reserved.\n\nThe software and files in this repository (collectively, “Software”) are licensed under the Mapbox TOS for use only with the relevant Mapbox product(s) listed at www.mapbox.com/pricing. This license allows developers with a current active Mapbox account to use and modify the authorized portions of the Software as needed for use only with the relevant Mapbox product(s) through their Mapbox account in accordance with the Mapbox TOS.  This license terminates automatically if a developer no longer has a Mapbox account in good standing or breaches the Mapbox TOS. For the license terms, please see the Mapbox TOS at https://www.mapbox.com/legal/tos/ which incorporates the Mapbox Product Terms at www.mapbox.com/legal/service-terms.  If this Software is a SDK, modifications that change or interfere with marked portions of the code related to billing, accounting, or data collection are not authorized and the SDK sends limited de-identified location and usage data which is used in accordance with the Mapbox TOS. [Updated 2023-01]\n\n## Additional Mapbox Maps Android licenses\nMapbox Maps Android uses portions of the Activity.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/activity#1.6.0](https://developer.android.com/jetpack/androidx/releases/activity#1.6.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android App Startup Runtime.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/startup#1.1.1](https://developer.android.com/jetpack/androidx/releases/startup#1.1.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android AppCompat Library.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/appcompat#1.6.1](https://developer.android.com/jetpack/androidx/releases/appcompat#1.6.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Arch-Common.\n\nURL: [https://developer.android.com/topic/libraries/architecture/index.html](https://developer.android.com/topic/libraries/architecture/index.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Arch-Runtime.\n\nURL: [https://developer.android.com/topic/libraries/architecture/index.html](https://developer.android.com/topic/libraries/architecture/index.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Emoji2 Compat.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/emoji2#1.2.0](https://developer.android.com/jetpack/androidx/releases/emoji2#1.2.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Emoji2 Compat view helpers.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/emoji2#1.2.0](https://developer.android.com/jetpack/androidx/releases/emoji2#1.2.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Lifecycle LiveData.\n\nURL: [https://developer.android.com/topic/libraries/architecture/index.html](https://developer.android.com/topic/libraries/architecture/index.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Lifecycle LiveData Core.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Lifecycle Process.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/lifecycle#2.4.1](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.4.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Lifecycle Runtime.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Lifecycle ViewModel.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Lifecycle ViewModel with SavedState.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Lifecycle-Common.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Resource Inspection - Annotations.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/resourceinspection#1.0.1](https://developer.android.com/jetpack/androidx/releases/resourceinspection#1.0.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Resources Library.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/appcompat#1.6.1](https://developer.android.com/jetpack/androidx/releases/appcompat#1.6.1)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support AnimatedVectorDrawable.\n\nURL: [https://developer.android.com/jetpack/androidx](https://developer.android.com/jetpack/androidx)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library Annotations.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/annotation#1.3.0](https://developer.android.com/jetpack/androidx/releases/annotation#1.3.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library collections.\n\nURL: [http://developer.android.com/tools/extras/support-library.html](http://developer.android.com/tools/extras/support-library.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library compat.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/core#1.9.0](https://developer.android.com/jetpack/androidx/releases/core#1.9.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library Cursor Adapter.\n\nURL: [http://developer.android.com/tools/extras/support-library.html](http://developer.android.com/tools/extras/support-library.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library Custom View.\n\nURL: [http://developer.android.com/tools/extras/support-library.html](http://developer.android.com/tools/extras/support-library.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library Drawer Layout.\n\nURL: [http://developer.android.com/tools/extras/support-library.html](http://developer.android.com/tools/extras/support-library.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library fragment.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/fragment#1.3.6](https://developer.android.com/jetpack/androidx/releases/fragment#1.3.6)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library Interpolators.\n\nURL: [http://developer.android.com/tools/extras/support-library.html](http://developer.android.com/tools/extras/support-library.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library loader.\n\nURL: [http://developer.android.com/tools/extras/support-library.html](http://developer.android.com/tools/extras/support-library.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support Library View Pager.\n\nURL: [http://developer.android.com/tools/extras/support-library.html](http://developer.android.com/tools/extras/support-library.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Support VectorDrawable.\n\nURL: [https://developer.android.com/jetpack/androidx](https://developer.android.com/jetpack/androidx)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Android Tracing.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/tracing#1.0.0](https://developer.android.com/jetpack/androidx/releases/tracing#1.0.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the AndroidX Futures.\n\nURL: [https://developer.android.com/topic/libraries/architecture/index.html](https://developer.android.com/topic/libraries/architecture/index.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Annotation.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/annotation#1.7.0](https://developer.android.com/jetpack/androidx/releases/annotation#1.7.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Core Kotlin Extensions.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/core#1.9.0](https://developer.android.com/jetpack/androidx/releases/core#1.9.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Cronet.\n\nLicense: [Chromium and built-in dependencies](https://storage.cloud.google.com/chromium-cronet/android/119.0.6045.31/Release/cronet/LICENSE)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the error-prone annotations.\n\nLicense: [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Experimental annotation.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/annotation#1.3.0](https://developer.android.com/jetpack/androidx/releases/annotation#1.3.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Gradle License Plugin.\n\nURL: [https://github.com/jaredsburrows/gradle-license-plugin](https://github.com/jaredsburrows/gradle-license-plugin)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Gson.\n\nLicense: [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Guava ListenableFuture only.\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the IntelliJ IDEA Annotations.\n\nURL: [http://www.jetbrains.org](http://www.jetbrains.org)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Kotlin Android Extensions Runtime.\n\nURL: [https://kotlinlang.org/](https://kotlinlang.org/)\n\nLicense: [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Kotlin Stdlib.\n\nURL: [https://kotlinlang.org/](https://kotlinlang.org/)\n\nLicense: [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Kotlin Stdlib Common.\n\nURL: [https://kotlinlang.org/](https://kotlinlang.org/)\n\nLicense: [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Kotlin Stdlib Jdk7.\n\nURL: [https://kotlinlang.org/](https://kotlinlang.org/)\n\nLicense: [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Kotlin Stdlib Jdk8.\n\nURL: [https://kotlinlang.org/](https://kotlinlang.org/)\n\nLicense: [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the kotlinx-coroutines-android.\n\nURL: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)\n\nLicense: [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the kotlinx-coroutines-core.\n\nURL: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)\n\nLicense: [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Mapbox Android Gestures Library.\n\nURL: [https://github.com/mapbox/mapbox-gestures-android](https://github.com/mapbox/mapbox-gestures-android)\n\nLicense: [BSD](https://opensource.org/licenses/BSD-2-Clause)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Mapbox Annotations.\n\nURL: [https://github.com/mapbox/mapbox-base-android](https://github.com/mapbox/mapbox-base-android)\n\nLicense: [Mapbox Terms of Service](https://www.mapbox.com/legal/tos/)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Mapbox Common.\n\nURL: [https://github.com/mapbox/mapbox-base-android](https://github.com/mapbox/mapbox-base-android)\n\nLicense: [Mapbox Terms of Service](https://www.mapbox.com/legal/tos/)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Mapbox Java SDK.\n\nURL: [https://github.com/mapbox/mapbox-java](https://github.com/mapbox/mapbox-java)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Mapbox LibraryLoader.\n\nURL: [https://github.com/mapbox/mapbox-base-android](https://github.com/mapbox/mapbox-base-android)\n\nLicense: [Mapbox Terms of Service](https://www.mapbox.com/legal/tos/)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Mapbox Logger.\n\nURL: [https://github.com/mapbox/mapbox-base-android](https://github.com/mapbox/mapbox-base-android)\n\nLicense: [Mapbox Terms of Service](https://www.mapbox.com/legal/tos/)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the mapbox-base-annotation.\n\nURL: [https://github.com/mapbox/mapbox-maps-android](https://github.com/mapbox/mapbox-maps-android)\n\nLicense: [Mapbox Terms of Service](https://www.mapbox.com/legal/tos/)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the okhttp.\n\nURL: [https://square.github.io/okhttp/](https://square.github.io/okhttp/)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the okio.\n\nURL: [https://github.com/square/okio/](https://github.com/square/okio/)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Parcelize Runtime.\n\nURL: [https://kotlinlang.org/](https://kotlinlang.org/)\n\nLicense: [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the play-services-base.\n\nLicense: [Android Software Development Kit License](https://developer.android.com/studio/terms.html)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the play-services-basement.\n\nLicense: [Android Software Development Kit License](https://developer.android.com/studio/terms.html)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the play-services-cronet.\n\nLicense: [Android Software Development Kit License](https://developer.android.com/studio/terms.html)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the play-services-tasks.\n\nLicense: [Android Software Development Kit License](https://developer.android.com/studio/terms.html)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the Saved State.\n\nURL: [https://developer.android.com/jetpack/androidx/releases/savedstate#1.2.0](https://developer.android.com/jetpack/androidx/releases/savedstate#1.2.0)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\nMapbox Maps Android uses portions of the VersionedParcelable.\n\nURL: [http://developer.android.com/tools/extras/support-library.html](http://developer.android.com/tools/extras/support-library.html)\n\nLicense: [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)\n\n===========================================================================\n\n### MapboxCoreMaps,11.23.0-SNAPSHOT-04-09--02-04.git-8a87ed7,Mapbox ToS,Mapbox,https://www.mapbox.com/\n\n```\nMapbox Core Maps version 11.0\nMapbox Core Maps SDK\n\nCopyright (c) 2026 Mapbox\n\nAll rights reserved.\n\nMapbox Core Maps version 10.0 (\"Mapbox Core Maps SDK\") or higher must\nbe used according to the Mapbox Terms of Service. This license allows\ndevelopers with a current active Mapbox account to use and modify the\nMapbox Core Maps. Developers may modify the Mapbox Core Maps SDK code\nso long as the modifications do not change or interfere with marked\nportions of the code related to billing, accounting, and anonymized\ndata collection. The Mapbox Core Maps SDK sends anonymized location\nand usage data, which Mapbox uses for fixing bugs and errors,\naccounting, and generating aggregated anonymized statistics. This\nlicense terminates automatically if a user no longer has an active\nMapbox account.\n\nFor the full license terms, please see the Mapbox Terms of Service at\nhttps://www.mapbox.com/legal/tos/\n\n```\n\n---\n\n### jni-hpp-internal,4.0.1,ISC,Mapbox,https://github.com/mapbox/jni-hpp-internal\n\n```\nCopyright © 2016, Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n\n\nThe above license excludes the files test/android/jni.h and test/openjdk/jni.h, which are\nincluded for testing purposes and covered by their respective copyrights and licenses.\n\n```\n\n---\n\n### etcpak,0.7,BSD-3-Clause,Bartosz Taudul <wolf@nereid.pl>,https://github.com/wolfpld/etcpak\n\n```\netcpak, an extremely fast ETC compression utility (https://github.com/wolfpld/etcpak)\n\nCopyright (c) 2013-2021, Bartosz Taudul <wolf@nereid.pl>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES\nLOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n```\n\n---\n\n### icu,75.1,Unicode-3.0,Unicode Inc,https://github.com/unicode-org/icu\n\n```\nUNICODE LICENSE V3\n\nCOPYRIGHT AND PERMISSION NOTICE\n\nCopyright © 2016-2024 Unicode, Inc.\n\nNOTICE TO USER: Carefully read the following legal agreement. BY\nDOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR\nSOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE\nTERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT\nDOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of data files and any associated documentation (the \"Data Files\") or\nsoftware and any associated documentation (the \"Software\") to deal in the\nData Files or Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, and/or sell\ncopies of the Data Files or Software, and to permit persons to whom the\nData Files or Software are furnished to do so, provided that either (a)\nthis copyright and permission notice appear with all copies of the Data\nFiles or Software, or (b) this copyright and permission notice appear in\nassociated Documentation.\n\nTHE DATA FILES AND SOFTWARE ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY\nKIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF\nTHIRD PARTY RIGHTS.\n\nIN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE\nBE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,\nOR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\nARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA\nFILES OR SOFTWARE.\n\nExcept as contained in this notice, the name of a copyright holder shall\nnot be used in advertising or otherwise to promote the sale, use or other\ndealings in these Data Files or Software without prior written\nauthorization of the copyright holder.\n\nSPDX-License-Identifier: Unicode-3.0\n\n```\n\n---\n\n### filesystem,1.5.10,MIT,Steffen Schümann,https://github.com/gulrak/filesystem/\n\n```\nCopyright (c) 2018, Steffen Schümann <s.schuemann@pobox.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n```\n\n---\n\n### kdbush.hpp,0.1.3,ISC,Vladimir Agafonkin,https://github.com/mourner/kdbush.hpp\n\n```\nCopyright (c) 2016, Vladimir Agafonkin\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n```\n\n---\n\n### cheap-ruler-cpp-internal,2.5.4,ISC,Mapbox,https://github.com/mapbox/cheap-ruler-cpp-internal\n\n```\nISC License\n\nCopyright (c) 2017, Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\nOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\nTHIS SOFTWARE.\n\n```\n\n---\n\n### supercluster-hpp-internal,0.5.0,ISC,Mapbox,https://github.com/mapbox/supercluster-hpp-internal\n\n```\nCopyright (c) 2016, Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n```\n\n---\n\n### fmt,7.1.3,MIT,Victor Zverovich,https://fmt.dev/latest/index.html\n\n```\nCopyright (c) 2012 - present, Victor Zverovich\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--- Optional exception to the license ---\n\nAs an exception, if, as a result of your compiling your source code, portions\nof this Software are embedded into a machine-executable object form of such\nsource code, you may redistribute such embedded portions in such object form\nwithout including the above copyright and permission notices.\n\n```\n\n---\n\n### basis_universal,dev,Apache-2.0,Binomial LLC,https://github.com/BinomialLLC/basis_universal\n\n```\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works within the Source form or\n          documentation, if provided along with the Derivative Works or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\")\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n```\n\n---\n\n### Boost C++ Libraries,1.89.0,BSL-1.0,Boost authors,https://www.boost.org\n\n```\nBoost Software License - Version 1.0 - August 17th, 2003\n\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n```\n\n---\n\n### csscolorparser,dev,MIT,Dean McNamee and Konstantin Käfer,https://github.com/mapbox/css-color-parser-cpp\n\n```\n(c) Dean McNamee <dean@gmail.com>, 2012.\n(c) Konstantin Käfer <mail@kkaefer.com>, 2014.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\n```\n\n---\n\n### earcut.hpp,2.2.4,ISC,Mapbox,https://github.com/mapbox/earcut.hpp\n\n```\nISC License\n\nCopyright (c) 2015, Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\nOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\nTHIS SOFTWARE.\n\n```\n\n---\n\n### dreieck,1.0.0,PROPRIETARY,Mapbox,https://github.com/mapbox/dreieck\n\n```\nMapbox Dreieck\n\nAll rights reserved.\n\nCopyright (c) 2025 Mapbox\n\n```\n\n---\n\n### eternal,1.0.1,ISC,Mapbox,https://github.com/mapbox/eternal\n\n```\nISC License\n\nCopyright (c) 2018, Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\nOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\nTHIS SOFTWARE.\n\n```\n\n---\n\n### geojson-vt-cpp,6.6.5,ISC,Mapbox,https://github.com/mapbox/geojson-vt-cpp\n\n```\nISC License\n\nCopyright (c) 2015, Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\nOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\nTHIS SOFTWARE.\n\n```\n\n---\n\n### parsedate,dev,curl,Daniel Stenberg and others,https://curl.haxx.se\n\n```\nCOPYRIGHT AND PERMISSION NOTICE\n\nCopyright (c) 1996 - 2020, Daniel Stenberg, <daniel@haxx.se>, and many\ncontributors, see the THANKS file.\n\nAll rights reserved.\n\nPermission to use, copy, modify, and distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright\nnotice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN\nNO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\nOR OTHER DEALINGS IN THE SOFTWARE.\n\nExcept as contained in this notice, the name of a copyright holder shall not\nbe used in advertising or otherwise to promote the sale, use or other dealings\nin this Software without prior written authorization of the copyright holder.\n\n```\n\n---\n\n### polylabel,1.0.3,ISC,Mapbox,https://github.com/mapbox/polylabel\n\n```\nISC License\nCopyright (c) 2016 Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO\nTHIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.\nIN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\nCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA\nOR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS\nACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS\nSOFTWARE.\n\n```\n\n---\n\n### protozero,1.7.1,BSD-2-Clause,Mapbox,https://github.com/mapbox/protozero\n\n```\nCopyright (C) 2022, Mapbox.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in\n   the documentation and/or other materials provided with the\n   distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR\nPROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n```\n\n---\n\n### unique_resource,dev,BSL-1.0,Shintarou Okada,https://github.com/okdshin/unique_resource\n\n```\nBoost Software License - Version 1.0 - August 17th, 2003\n\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n```\n\n---\n\n### vector-tile-internal,1.0.4,ISC,Mapbox,https://github.com/mapbox/vector-tile-internal\n\n```\nCopyright (c) 2016, Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n```\n\n---\n\n### wagyu,0.5.0,BSL-1.0,Angus Johnson and Mapbox,https://github.com/mapbox/wagyu.git\n\n```\nParts of the code in the Wagyu Library are derived from the version of the \nClipper Library by Angus Johnson listed below.\n\nAuthor    :  Angus Johnson\nVersion   :  6.4.0\nDate      :  2 July 2015\nWebsite   :  http://www.angusj.com\n\nCopyright for portions of the derived code in the Wagyu library are held \nby Angus Johnson, 2010-2015. Copyright for the \"include/mapbox/geometry/wagyu/almost_equal.hpp\" \nfile is held by Google Inc and its license is listed at the top of that file.\nAll other copyright for the Wagyu Library are held by Mapbox, 2016. This code \nis published in accordance with, and retains the same license as the Clipper \nLibrary by Angus Johnson.\n\nCopyright (c) 2010-2015, Angus Johnson\nCopyright (c) 2016-2020, Mapbox\n\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n```\n\n---\n\n### vtzero,1.1.0,BSD-2-Clause,Mapbox,https://github.com/mapbox/vtzero\n\n```\nBSD 2-Clause License\n\nCopyright (c) 2017, Mapbox\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n```\n\n---\n\n### draco,1.5.7,Apache-2.0,Google,https://github.com/google/draco\n\n```\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works within the Source form or\n          documentation, if provided along with the Derivative Works or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\")\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n--------------------------------------------------------------------------------\nFiles: docs/assets/js/ASCIIMathML.js\n\nCopyright (c) 2014 Peter Jipsen and other ASCIIMathML.js contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nFiles: docs/assets/css/pygments/*\n\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or\ndistribute this software, either in source code form or as a compiled\nbinary, for any purpose, commercial or non-commercial, and by any\nmeans.\n\nIn jurisdictions that recognize copyright laws, the author or authors\nof this software dedicate any and all copyright interest in the\nsoftware to the public domain. We make this dedication for the benefit\nof the public at large and to the detriment of our heirs and\nsuccessors. We intend this dedication to be an overt act of\nrelinquishment in perpetuity of all present and future rights to this\nsoftware under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <http://unlicense.org>\n\n```\n\n---\n\n### cgltf,1.13,MIT,Johannes Kuhlmann,https://github.com/jkuhlmann/cgltf\n\n```\nCopyright (c) 2018-2021 Johannes Kuhlmann\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n```\n\n---\n\n### meshoptimizer,0.20,MIT,zeux,https://github.com/zeux/meshoptimizer\n\n```\nMIT License\n\nCopyright (c) 2016-2023 Arseny Kapoulkine\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n```\n\n---\n\n### spatial-algorithms,0.1.0,Mapbox ToS,Mapbox,https://github.com/mapbox/spatial-algorithms\n\n```\nMapbox spatial-algorithms version 0.1.0\n\nCopyright © 2017 - 2024 Mapbox, Inc. All rights reserved.\n\nThe software and files in this repository (collectively, \"Software\") are\nlicensed under the Mapbox TOS for use only with the relevant Mapbox product(s)\nlisted at www.mapbox.com/pricing. This license allows developers with a\ncurrent active Mapbox account to use and modify the authorized portions of the\nSoftware as needed for use only with the relevant Mapbox product(s) through\ntheir Mapbox account in accordance with the Mapbox TOS.  This license\nterminates automatically if a developer no longer has a Mapbox account in good\nstanding or breaches the Mapbox TOS. For the license terms, please see the\nMapbox TOS at https://www.mapbox.com/legal/tos/ which incorporates the Mapbox\nProduct Terms at www.mapbox.com/legal/service-terms.  If this Software is a\nSDK, modifications that change or interfere with marked portions of the code\nrelated to billing, accounting, or data collection are not authorized and the\nSDK sends limited de-identified location and usage data which is used in\naccordance with the Mapbox TOS. [Updated 2023-01]\n```\n\n---\n\n### vtcomposite,2.1.0,CC0,Mapbox,https://github.com/mapbox/vtcomposite\n\n```\nCC0 1.0 Universal\n\nStatement of Purpose\n\nThe laws of most jurisdictions throughout the world automatically confer\nexclusive Copyright and Related Rights (defined below) upon the creator and\nsubsequent owner(s) (each and all, an \"owner\") of an original work of\nauthorship and/or a database (each, a \"Work\").\n\nCertain owners wish to permanently relinquish those rights to a Work for the\npurpose of contributing to a commons of creative, cultural and scientific\nworks (\"Commons\") that the public can reliably and without fear of later\nclaims of infringement build upon, modify, incorporate in other works, reuse\nand redistribute as freely as possible in any form whatsoever and for any\npurposes, including without limitation commercial purposes. These owners may\ncontribute to the Commons to promote the ideal of a free culture and the\nfurther production of creative, cultural and scientific works, or to gain\nreputation or greater distribution for their Work in part through the use and\nefforts of others.\n\nFor these and/or other purposes and motivations, and without any expectation\nof additional consideration or compensation, the person associating CC0 with a\nWork (the \"Affirmer\"), to the extent that he or she is an owner of Copyright\nand Related Rights in the Work, voluntarily elects to apply CC0 to the Work\nand publicly distribute the Work under its terms, with knowledge of his or her\nCopyright and Related Rights in the Work and the meaning and intended legal\neffect of CC0 on those rights.\n\n1. Copyright and Related Rights. A Work made available under CC0 may be\nprotected by copyright and related or neighboring rights (\"Copyright and\nRelated Rights\"). Copyright and Related Rights include, but are not limited\nto, the following:\n\n  i. the right to reproduce, adapt, distribute, perform, display, communicate,\n  and translate a Work\n\n  ii. moral rights retained by the original author(s) and/or performer(s)\n\n  iii. publicity and privacy rights pertaining to a person's image or likeness\n  depicted in a Work\n\n  iv. rights protecting against unfair competition in regards to a Work,\n  subject to the limitations in paragraph 4(a), below\n\n  v. rights protecting the extraction, dissemination, use and reuse of data in\n  a Work\n\n  vi. database rights (such as those arising under Directive 96/9/EC of the\n  European Parliament and of the Council of 11 March 1996 on the legal\n  protection of databases, and under any national implementation thereof,\n  including any amended or successor version of such directive) and\n\n  vii. other similar, equivalent or corresponding rights throughout the world\n  based on applicable law or treaty, and any national implementations thereof.\n\n2. Waiver. To the greatest extent permitted by, but not in contravention of,\napplicable law, Affirmer hereby overtly, fully, permanently, irrevocably and\nunconditionally waives, abandons, and surrenders all of Affirmer's Copyright\nand Related Rights and associated claims and causes of action, whether now\nknown or unknown (including existing as well as future claims and causes of\naction), in the Work (i) in all territories worldwide, (ii) for the maximum\nduration provided by applicable law or treaty (including future time\nextensions), (iii) in any current or future medium and for any number of\ncopies, and (iv) for any purpose whatsoever, including without limitation\ncommercial, advertising or promotional purposes (the \"Waiver\"). Affirmer makes\nthe Waiver for the benefit of each member of the public at large and to the\ndetriment of Affirmer's heirs and successors, fully intending that such Waiver\nshall not be subject to revocation, rescission, cancellation, termination, or\nany other legal or equitable action to disrupt the quiet enjoyment of the Work\nby the public as contemplated by Affirmer's express Statement of Purpose.\n\n3. Public License Fallback. Should any part of the Waiver for any reason be\njudged legally invalid or ineffective under applicable law, then the Waiver\nshall be preserved to the maximum extent permitted taking into account\nAffirmer's express Statement of Purpose. In addition, to the extent the Waiver\nis so judged Affirmer hereby grants to each affected person a royalty-free,\nnon transferable, non sublicensable, non exclusive, irrevocable and\nunconditional license to exercise Affirmer's Copyright and Related Rights in\nthe Work (i) in all territories worldwide, (ii) for the maximum duration\nprovided by applicable law or treaty (including future time extensions), (iii)\nin any current or future medium and for any number of copies, and (iv) for any\npurpose whatsoever, including without limitation commercial, advertising or\npromotional purposes (the \"License\"). The License shall be deemed effective as\nof the date CC0 was applied by Affirmer to the Work. Should any part of the\nLicense for any reason be judged legally invalid or ineffective under\napplicable law, such partial invalidity or ineffectiveness shall not\ninvalidate the remainder of the License, and in such case Affirmer hereby\naffirms that he or she will not (i) exercise any of his or her remaining\nCopyright and Related Rights in the Work or (ii) assert any associated claims\nand causes of action with respect to the Work, in either case contrary to\nAffirmer's express Statement of Purpose.\n\n4. Limitations and Disclaimers.\n\n  a. No trademark or patent rights held by Affirmer are waived, abandoned,\n  surrendered, licensed or otherwise affected by this document.\n\n  b. Affirmer offers the Work as-is and makes no representations or warranties\n  of any kind concerning the Work, express, implied, statutory or otherwise,\n  including without limitation warranties of title, merchantability, fitness\n  for a particular purpose, non infringement, or the absence of latent or\n  other defects, accuracy, or the present or absence of errors, whether or not\n  discoverable, all to the greatest extent permissible under applicable law.\n\n  c. Affirmer disclaims responsibility for clearing rights of other persons\n  that may apply to the Work or any use thereof, including without limitation\n  any person's Copyright and Related Rights in the Work. Further, Affirmer\n  disclaims responsibility for obtaining any necessary consents, permissions\n  or other rights required for any use of the Work.\n\n  d. Affirmer understands and acknowledges that Creative Commons is not a\n  party to this document and has no duty or obligation with respect to this\n  CC0 or use of the Work.\n\nFor more information, please see\n<http://creativecommons.org/publicdomain/zero/1.0/>\n```\n\n---\n\n### building-gen,1.0.0,ISC,Mapbox,https://github.com/mapbox/building-gen\n\n```\nCopyright (c) 2025 Mapbox\n\nAll rights reserved.\n```\n\n---\n\n### plf_list,v2.7.24,zlib,Matt Bentle,https://github.com/mattreecebentley/plf_list\n\n```\nzlib License\n\n(C) 2019 mattreecebentley\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n\n```\n\n---\n\n### shaderc,v2025.2,Apache-2.0,google,https://github.com/google/shaderc\n\n```\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works within the Source form or\n          documentation, if provided along with the Derivative Works or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\")\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n```\n\n---\n\n### spirv-cross-cpp,vulkan-sdk-1.4.313.0,Apache-2.0,KhronosGroup,https://github.com/KhronosGroup/SPIRV-Cross\n\n```\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works within the Source form or\n          documentation, if provided along with the Derivative Works or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\")\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n```\n\n---\n\n### spirv-reflect,vulkan-sdk-1.4.321.0,Apache-2.0,KhronosGroup,https://github.com/KhronosGroup/SPIRV-Reflect\n\n```\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works within the Source form or\n          documentation, if provided along with the Derivative Works or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\")\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n```\n\n---\n\n### mapbox-common,dev,Mapbox ToS,Mapbox,https://www.mapbox.com/\n\n```\nMapbox Common SDK\n\nCopyright (c) 2021 - Mapbox, Inc.\n\nYou may use this code with your Mapbox account and under the\nMapbox Terms of Service (https://www.mapbox.com/tos/).\n\nAll other rights reserved.\n\n===========================================================================\n\n\n```\n\n---\n\n### mapbox-base-internal,dev,BSD-3-Clause,Mapbox,https://www.mapbox.com/\n\n```\nCopyright (c) MapBox\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n- Redistributions in binary form must reproduce the above copyright notice, this\n  list of conditions and the following disclaimer in the documentation and/or\n  other materials provided with the distribution.\n- Neither the name \"MapBox\" nor the names of its contributors may be\n  used to endorse or promote products derived from this software without\n  specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES\nLOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n```\n\n---\n\n### expected-lite,0.4.0,BSL-1.0,Martin Moene,https://github.com/martinmoene/expected-lite\n\n```\nBoost Software License - Version 1.0 - August 17th, 2003\n\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n```\n\n---\n\n### RapidJSON,1.1.0,MIT,THL A29 Limited and Milo Yip,https://rapidjson.org\n\n```\nTencent is pleased to support the open source community by making RapidJSON available. \n \nCopyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.  All rights reserved.\n\nIf you have downloaded a copy of the RapidJSON binary from Tencent, please note that the RapidJSON binary is licensed under the MIT License.\nIf you have downloaded a copy of the RapidJSON source code from Tencent, please note that RapidJSON source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms.  Your integration of RapidJSON into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within RapidJSON. To avoid the problematic JSON license in your own projects, it's sufficient to exclude the bin/jsonchecker/ directory, as it's the only code under the JSON license.\nA copy of the MIT License is included in this file.\n\nOther dependencies and licenses:\n\nOpen Source Software Licensed Under the BSD License:\n--------------------------------------------------------------------\n\nThe msinttypes r29 \nCopyright (c) 2006-2013 Alexander Chemeris \nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. \n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n* Neither the name of  copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nOpen Source Software Licensed Under the JSON License:\n--------------------------------------------------------------------\n\njson.org \nCopyright (c) 2002 JSON.org\nAll Rights Reserved.\n\nJSON_checker\nCopyright (c) 2002 JSON.org\nAll Rights Reserved.\n\n\t\nTerms of the JSON License:\n---------------------------------------------------\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nThe Software shall be used for Good, not Evil.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\nTerms of the MIT License:\n--------------------------------------------------------------------\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n```\n\n---\n\n### geojson-cpp-internal,0.5.1,ISC,Mapbox,https://github.com/mapbox/geojson-cpp-internal\n\n```\nCopyright (c) 2016, Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n```\n\n---\n\n### geometry-hpp-internal,1.1.0,ISC,Mapbox,https://github.com/mapbox/geometry-hpp-internal\n\n```\nCopyright (c) 2016, Mapbox\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n```\n\n---\n\n### glm,1.0.0,MIT,g-truc,https://github.com/g-truc/glm\n\n```\n================================================================================\nThe MIT License\n--------------------------------------------------------------------------------\nCopyright (c) 2005 - G-Truc Creation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n```\n\n---\n\n### glad,2.0,MIT,glad,https://github.com/Dav1dde/glad\n\n```\nThe glad source code:\n\n    The MIT License (MIT)\n\n    Copyright (c) 2013-2022 David Herberth\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy of\n    this software and associated documentation files (the \"Software\"), to deal in\n    the Software without restriction, including without limitation the rights to\n    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n    the Software, and to permit persons to whom the Software is furnished to do so,\n    subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\nThe Khronos Specifications:\n\n    Copyright (c) 2013-2020 The Khronos Group Inc.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\")\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n\nThe EGL Specification and various headers:\n\n    Copyright (c) 2007-2016 The Khronos Group Inc.\n\n    Permission is hereby granted, free of charge, to any person obtaining a\n    copy of this software and/or associated documentation files (the\n    \"Materials\"), to deal in the Materials without restriction, including\n    without limitation the rights to use, copy, modify, merge, publish,\n    distribute, sublicense, and/or sell copies of the Materials, and to\n    permit persons to whom the Materials are furnished to do so, subject to\n    the following conditions:\n\n    The above copyright notice and this permission notice shall be included\n    in all copies or substantial portions of the Materials.\n\n    THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n    MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n```\n\n---\n\n### abseil-containers,76bb2432,Apache-2.0,Google,https://github.com/abseil/abseil-cpp.git\n\n```\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        https://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works within the Source form or\n          documentation, if provided along with the Derivative Works or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\")\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       https://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n\n```\n\n---\n\n### vulkan,1.4.314,MIT,KhronosGroup,https://github.com/KhronosGroup/Vulkan-Headers\n\n```\nMIT License\n\nCopyright (c) 2015-2023 The Khronos Group Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n```\n\n---\n\n### volk,1.4.304.1,MIT,zeux,https://github.com/zeux/volk\n\n```\nCopyright (c) 2018-2024 Arseny Kapoulkine\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n```\n\n---\n\n### vk-bootstrap,1.4.315,MIT,Charles Giessen,https://github.com/charles-lunarg/vk-bootstrap\n\n```\nCopyright © 2020 Charles Giessen (charles@lunarg.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n```\n\n---\n\n### vma,3.3.0,MIT,Advanced Micro Devices,https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator\n\n```\nCopyright (c) 2017-2025 Advanced Micro Devices, Inc. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n```\n\n---\n\n### msgpack,6.1.0,boost,FURUHASHI Sadayuki,https://github.com/msgpack/msgpack-c.git\n\n```\nBoost Software License - Version 1.0 - August 17th, 2003\n\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n```\n\n---\n\n"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: check\ncheck:\n\t./gradlew ktlint lint;\n\t./gradlew clean dokkaHtml -Pmapbox.dokkaHtmlFlavor=release\n\n.PHONY: test\ntest:\n\t./gradlew test -i\n\n.PHONY: sdk-build\nsdk-build:\n\t./gradlew assembleRelease -x app:assembleRelease -x android-auto-app:assembleRelease\\\n\t\t-x compose-app:assembleRelease -x extension-style-app:assembleRelease\n\n.PHONY: proguard\nproguard:\n\t./gradlew clean;\n\t./gradlew app:installRelease;\n\tadb shell am start -n com.mapbox.maps.testapp/.examples.SimpleMapActivity;\n\txdg-open app/build/outputs/mapping/release/mapping.txt;\n\n.PHONY: fix\nfix:\n\t./gradlew ktlintFormat\n\n.PHONY: clean\nclean:\n\t./gradlew clean\n\n.PHONY: codecoverage\ncodecoverage:\n\t./gradlew maps-sdk:jacocoTestDebugUnitTestReport && google-chrome maps-sdk/build/jacoco/jacocoHtml/index.html\n\n.PHONY: unit-tests\nunit-tests:\n\t./gradlew test -i\n\n.PHONY: instrumentation-tests\ninstrumentation-tests:\n\t./gradlew maps-sdk:connectedDebugAndroidTest && ./gradlew app:connectedDebugAndroidTest\n\n.PHONY: instrumentation-clean\ninstrumentation-clean:\n\tadb uninstall com.mapbox.maps.testapp || true;\n\tadb uninstall com.mapbox.maps.testapp.test || true;\n\n# Generates Activity sanity tests\n.PHONY: generate-sanity-test\ngenerate-sanity-test:\n\tnode scripts/sanity-test/generate-sanity-test.js\n\n# Metalava & kotlin binary compatibility validator: check API\n.PHONY: check-api\ncheck-api:\n\t# validate api surface for both metalava and kotlin binary compatibility validator\n\t./gradlew checkApi;\n\n# Metalava & kotlin binary compatibility validator: update API\n.PHONY: update-api\nupdate-api:\n\t# generate api file for both metalava and kotlin binary compatibility validator\n\t./gradlew updateApi;\n\n# Metalava: update metalava version\n.PHONY: update-metalava\nupdate-metalava:\n\tsh ./metalava/update.sh\n\n.PHONY: start-android-auto-dhu\nstart-android-auto-dhu:\n\tadb forward tcp:5277 tcp:5277;\n\t$(ANDROID_HOME)/extras/google/auto/desktop-head-unit;\n\n\n# Check permissions app module, requires app:assembleDebug first\n.PHONY: check-permissions\ncheck-permissions:\n\t python3 scripts/check-permissions.py \\\n\t \t--apk app/build/outputs/apk/release/app-release.apk \\\n\t\t--file app/permission.json\n\n# Update permissions app module, requires app:assembleDebug first\n.PHONY: update-permissions\nupdate-permissions:\n\t python3 scripts/check-permissions.py \\\n\t \t--apk app/build/outputs/apk/debug/app-debug.apk \\\n\t\t--file app/permission.json \\\n\t\t--update True\n"
  },
  {
    "path": "README.md",
    "content": "## Mapbox Maps SDK for Android\n\n[![CLA assistant](https://cla-assistant.io/readme/badge/mapbox/mapbox-maps-android)](https://cla-assistant.io/mapbox/mapbox-maps-android)\n\n![](https://user-images.githubusercontent.com/4394910/66942701-7ed30100-effe-11e9-9948-14012d4c3289.png)\n\nThe Mapbox Maps SDK for Android is a public library for displaying interactive, thoroughly customizable maps in native Android. It takes map styles that conform to the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/), applies them to vector tiles that conform to the [Mapbox Vector Tile Specification](https://github.com/mapbox/vector-tile-spec), and renders them using OpenGL.\n\n## Getting Started\nThis README is intended for developers who are interested in contributing to the Mapbox Maps SDK for Android. Please visit https://docs.mapbox.com/android/maps/guides/ for general information and instructions on using the Maps SDK in your Android application.\n\n## 16 KB Page Size Support\nStarting with version 11.7.0 and 10.19.0, **NDK 27 is supported** with dedicated artifacts that include [support for 16 KB page sizes](https://developer.android.com/guide/practices/page-sizes). If your app does not require 16 KB page size support, you can keep using our default artifacts without `-ndk27` suffix.\n\nFor more information about our NDK support, see https://docs.mapbox.com/android/maps/guides/#ndk-support\n\n## Developing\nIf you are interested in contributing to the Maps SDK, please see the [DEVELOPING.md](DEVELOPING.md) file for information on setting up, running and building the SDK.\n\n## Migrating from previous versions\nTo ensure a smooth transition for developers upgrading from previous versions of the Mapbox SDK, we've prepared comprehensive migration guides. If you're upgrading from version 10 to 11, please refer to our [v11 migration guide](https://docs.mapbox.com/android/maps/guides/migrate-to-v11/) for detailed instructions. For those moving from version 9 to 10, the [v10 migration guide](https://docs.mapbox.com/android/maps/guides/old-versions/migrate-to-v10/) is available to facilitate your upgrade process.\n\n## Reporting issues / Need help?\n\n#### Report a bug :beetle:\nPlease use our [bug template](https://github.com/mapbox/mapbox-maps-android/issues/new?labels=bug%20%3Abeetle%3A&template=bug.md) to report any issues.\n\n#### Request a new feature or enhancement :green_apple:\nPlease use our [feature template](https://github.com/mapbox/mapbox-maps-android/issues/new?labels=feature%20%3Agreen_apple%3A&template=feature.md) to request new features or enhancements.\n\n#### Other questions\nIf you have any questions about how to use the SDK or if you need help with specific features, you can reach out to our support team [via our website](https://docs.mapbox.com/help/) or connect with our developer community by joining our [Discord channel](https://discord.gg/UshjQYyDFw). We kindly ask you to avoid using the issue tracker in this repository for questions and instead use our support channels.\n\n## Historical Note\nThis repository is a continuation of the Mapbox Maps SDK for Android available at [mapbox/mapbox-gl-native-android](https://github.com/mapbox/mapbox-gl-native-android).\n"
  },
  {
    "path": "android-auto-app/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.application\")\n}\n\nandroid {\n  compileSdk = libs.versions.autoCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.testapp.auto\"\n  defaultConfig {\n    minSdk = libs.versions.autoMinSdkVersion.get().toInt()\n    targetSdk = libs.versions.autoTargetSdkVersion.get().toInt()\n    applicationId = \"com.mapbox.maps.testapp.auto\"\n    versionCode = 1\n    versionName = \"0.1.0\"\n    multiDexEnabled = true\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    testInstrumentationRunnerArguments[\"clearPackageData\"] = \"true\"\n  }\n\n  compileOptions {\n    sourceCompatibility = JavaVersion.VERSION_1_8\n    targetCompatibility = JavaVersion.VERSION_1_8\n  }\n\n  testOptions {\n    if (!project.hasProperty(\"android.injected.invoked.from.ide\")) {\n      execution = \"ANDROIDX_TEST_ORCHESTRATOR\"\n    }\n  }\n}\n\ndependencies {\n  implementation(project(\":extension-androidauto\"))\n  implementation(libs.googleCarAppLibrary)\n\n  // Please review the compatibility guide. This app is showcasing the latest features with latest Maps SDK main branch.\n  // https://github.com/mapbox/mapbox-maps-android/tree/main/extension-androidauto#compatibility-with-maps-sdk-v11\n  implementation(project(\":maps-sdk\"))\n\n  implementation(libs.kotlin)\n  implementation(libs.androidx.appCompat)\n  implementation(libs.androidx.coreKtx)\n  implementation(appsLibs.googleMaterialDesign)\n  implementation(appsLibs.androidx.constraintLayout)\n  implementation(appsLibs.androidx.startup)\n\n  // By default, the Maps SDK uses the Android Location Provider to obtain raw location updates.\n  // And with Android 11, the raw location updates might suffer from precision issue.\n  // The Maps SDK also comes pre-compiled with support for the [Google's Fused Location Provider](https://developers.google.com/location-context/fused-location-provider)\n  // if that dependency is available. This means, that if your target devices support Google Play\n  // Services, [we recommend adding the Google Play Location Services dependency to your project](https://developers.google.com/android/guides/setup).\n  implementation(appsLibs.googlePlayServicesLocation)\n\n  androidTestUtil(libs.androidx.orchestrator)\n\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n  androidTestImplementation(libs.androidx.jUnitTestRules)\n  androidTestImplementation(libs.androidx.testJUnit)\n  androidTestImplementation(libs.androidx.uiAutomator)\n  testImplementation(libs.junit)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "android-auto-app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n    <uses-permission android:name=\"androidx.car.app.NAVIGATION_TEMPLATES\" />\n\n    <application\n        android:allowBackup=\"true\"\n        android:extractNativeLibs=\"false\"\n        android:icon=\"@mipmap/ic_launcher_round\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity\n            android:name=\".app.MainActivity\"\n            android:exported=\"true\" >\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <meta-data\n            android:name=\"com.google.android.gms.car.application\"\n            android:resource=\"@xml/automotive_app_desc\"\n            tools:ignore=\"MetadataTagInsideApplicationTag\" />\n        <meta-data\n            android:name=\"androidx.car.app.theme\"\n            android:resource=\"@style/CarTheme\"\n            tools:ignore=\"MetadataTagInsideApplicationTag\" />\n        <meta-data\n            android:name=\"androidx.car.app.minCarApiLevel\"\n            android:value=\"1\"\n            tools:ignore=\"MetadataTagInsideApplicationTag\" />\n\n        <service\n            android:name=\".service.MapboxCarAppService\"\n            android:exported=\"true\"\n            tools:ignore=\"ExportedService\">\n            <intent-filter>\n                <action android:name=\"androidx.car.app.CarAppService\" />\n\n                <category android:name=\"androidx.car.app.category.NAVIGATION\" />\n            </intent-filter>\n        </service>\n    </application>\n\n</manifest>"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/app/MainActivity.kt",
    "content": "package com.mapbox.maps.testapp.auto.app\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.testapp.auto.R\n\nclass MainActivity : AppCompatActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContentView(R.layout.activity_main)\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/CarAnimationThreadController.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport android.os.Build\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapObserver\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapSurface\nimport com.mapbox.maps.threading.AnimationThreadController\n\n/**\n * This class is needed for Xiaomi devices. When the mobile app has been backgrounded and you are\n * using android auto, Xiaomi MIUI will stop animations that are called from the main thread.\n *\n * https://github.com/mapbox/mapbox-maps-android/issues/1413\n */\n@OptIn(MapboxExperimental::class)\nclass CarAnimationThreadController : MapboxCarMapObserver {\n  override fun onAttached(mapboxCarMapSurface: MapboxCarMapSurface) {\n    if (deviceRequiresBackgroundThreadAnimations()) {\n      AnimationThreadController.useBackgroundThread()\n    }\n  }\n\n  override fun onDetached(mapboxCarMapSurface: MapboxCarMapSurface) {\n    AnimationThreadController.useMainThread()\n  }\n\n  private fun deviceRequiresBackgroundThreadAnimations(): Boolean {\n    return impactedManufacturer.contains(Build.MANUFACTURER)\n  }\n\n  private companion object {\n    private val impactedManufacturer = setOf(\"Xiaomi\")\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/CarCameraController.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport android.graphics.Rect\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.androidauto.DefaultMapboxCarMapGestureHandler\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapObserver\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapSurface\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.location\n\n/**\n * Controller class to handle map camera changes.\n */\nclass CarCameraController : MapboxCarMapObserver {\n\n  private var lastGpsLocation: Point = HELSINKI\n  private var previousCameraState: CameraState? = null\n  private var isTrackingPuck = true\n\n  private var surface: MapboxCarMapSurface? = null\n  private var insets: EdgeInsets = EdgeInsets(0.0, 0.0, 0.0, 0.0)\n\n  private val changePositionListener = OnIndicatorPositionChangedListener { point ->\n    lastGpsLocation = point\n    if (isTrackingPuck) {\n      surface?.mapSurface?.mapboxMap?.setCamera(\n        cameraOptions {\n          center(point)\n          padding(insets)\n        }\n      )\n    }\n  }\n\n  private val changeBearingListener = OnIndicatorBearingChangedListener { bearing ->\n    if (isTrackingPuck) {\n      surface?.mapSurface?.mapboxMap?.setCamera(\n        cameraOptions {\n          bearing(bearing)\n        }\n      )\n    }\n  }\n\n  val gestureHandler = object : DefaultMapboxCarMapGestureHandler() {\n    override fun onScroll(\n      mapboxCarMapSurface: MapboxCarMapSurface,\n      visibleCenter: ScreenCoordinate,\n      distanceX: Float,\n      distanceY: Float\n    ) {\n      super.onScroll(mapboxCarMapSurface, visibleCenter, distanceX, distanceY)\n      isTrackingPuck = false\n    }\n  }\n\n  /**\n   * Initialise the car camera controller with a map surface.\n   */\n  override fun onAttached(mapboxCarMapSurface: MapboxCarMapSurface) {\n    super.onAttached(mapboxCarMapSurface)\n    this.surface = mapboxCarMapSurface\n    mapboxCarMapSurface.mapSurface.mapboxMap.setCamera(\n      cameraOptions {\n        pitch(previousCameraState?.pitch ?: INITIAL_PITCH)\n        zoom(previousCameraState?.zoom ?: INITIAL_ZOOM)\n        center(lastGpsLocation)\n      }\n    )\n    with(mapboxCarMapSurface.mapSurface.location) {\n      // Show a 3D location puck\n      locationPuck = CarLocationPuck.duckLocationPuckConstantSize\n      enabled = true\n      puckBearing = PuckBearing.HEADING\n      addOnIndicatorPositionChangedListener(changePositionListener)\n      addOnIndicatorBearingChangedListener(changeBearingListener)\n    }\n  }\n\n  override fun onDetached(mapboxCarMapSurface: MapboxCarMapSurface) {\n    previousCameraState = mapboxCarMapSurface.mapSurface.mapboxMap.cameraState\n    with(mapboxCarMapSurface.mapSurface.location) {\n      removeOnIndicatorPositionChangedListener(changePositionListener)\n      removeOnIndicatorBearingChangedListener(changeBearingListener)\n    }\n    super.onDetached(mapboxCarMapSurface)\n  }\n\n  override fun onVisibleAreaChanged(visibleArea: Rect, edgeInsets: EdgeInsets) {\n    insets = edgeInsets\n  }\n\n  /**\n   * Make camera center to location puck and track the location puck's position.\n   */\n  fun focusOnLocationPuck() {\n    surface?.mapSurface?.camera?.flyTo(\n      cameraOptions {\n        center(lastGpsLocation)\n      }\n    )\n    isTrackingPuck = true\n  }\n\n  /**\n   * Function dedicated to zoom in map action buttons.\n   */\n  fun zoomInAction() = scaleEaseBy(ZOOM_ACTION_DELTA)\n\n  /**\n   * Function dedicated to zoom in map action buttons.\n   */\n  fun zoomOutAction() = scaleEaseBy(-ZOOM_ACTION_DELTA)\n\n  private fun scaleEaseBy(delta: Double) {\n    val mapSurface = surface?.mapSurface\n    val fromZoom = mapSurface?.mapboxMap?.cameraState?.zoom ?: return\n    val toZoom = (fromZoom + delta).coerceIn(MIN_ZOOM_OUT, MAX_ZOOM_IN)\n    mapSurface.camera.easeTo(cameraOptions { zoom(toZoom) })\n  }\n\n  companion object {\n    /**\n     * Default location for the demo.\n     */\n    private val HELSINKI = Point.fromLngLat(24.9384, 60.1699)\n\n    /**\n     * Default zoom for the demo.\n     */\n    private const val INITIAL_ZOOM = 16.0\n\n    /**\n     * Constant camera pitch for the demo.\n     */\n    private const val INITIAL_PITCH = 75.0\n\n    /**\n     * When zooming the camera by a delta, this will prevent the camera from zooming further.\n     */\n    private const val MIN_ZOOM_OUT = 0.0\n\n    /**\n     * When zooming the camera by a delta, this will prevent the camera from zooming further.\n     */\n    private const val MAX_ZOOM_IN = 20.0\n\n    /**\n     * Simple zoom delta to associate with the zoom action buttons.\n     */\n    private const val ZOOM_ACTION_DELTA = 0.5\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/CarLocationPuck.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport android.annotation.SuppressLint\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.R\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport com.mapbox.maps.plugin.ModelScaleMode\n\n/**\n * Provides car location puck definitions.\n */\ninternal object CarLocationPuck {\n  /**\n   * 3D location puck with the real world size.\n   */\n  @OptIn(MapboxExperimental::class)\n  val duckLocationPuckRealWorld = LocationPuck3D(\n    modelUri = \"https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Embedded/Duck.gltf\",\n    modelScale = listOf(20f, 20f, 20f),\n    modelScaleMode = ModelScaleMode.MAP,\n    modelRotation = listOf(0f, 0f, -90f)\n  )\n\n  /**\n   * 3D location puck with a constant size across zoom levels.\n   */\n  @OptIn(MapboxExperimental::class)\n  val duckLocationPuckConstantSize = LocationPuck3D(\n    modelUri = \"https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Embedded/Duck.gltf\",\n    modelScale = listOf(20f, 20f, 20f),\n    modelScaleMode = ModelScaleMode.VIEWPORT,\n    modelRotation = listOf(0f, 0f, -90f)\n  )\n\n  /**\n   * Classic 2D location puck with blue dot and arrow.\n   */\n  @SuppressLint(\"UseCompatLoadingForDrawables\")\n  val classicLocationPuck2D = LocationPuck2D(\n    topImage = ImageHolder.Companion.from(R.drawable.mapbox_user_icon),\n    bearingImage = ImageHolder.Companion.from(R.drawable.mapbox_user_bearing_icon),\n    shadowImage = ImageHolder.Companion.from(R.drawable.mapbox_user_stroke_icon)\n  )\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/CarMapShowcase.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport androidx.car.app.CarContext\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapObserver\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapSurface\nimport com.mapbox.maps.logE\n\n/**\n * Example showing how you can add a sky layer that has a sun direction,\n * and adding a terrain layer to show mountains.\n */\nclass CarMapShowcase : MapboxCarMapObserver {\n\n  private var mapboxCarMapSurface: MapboxCarMapSurface? = null\n\n  override fun onAttached(mapboxCarMapSurface: MapboxCarMapSurface) {\n    this.mapboxCarMapSurface = mapboxCarMapSurface\n    loadMapStyle(mapboxCarMapSurface.carContext)\n  }\n\n  override fun onDetached(mapboxCarMapSurface: MapboxCarMapSurface) {\n    this.mapboxCarMapSurface = null\n  }\n\n  fun loadMapStyle(carContext: CarContext) {\n    val lightPreset = if (carContext.isDarkMode) LightPresets.NIGHT else LightPresets.DAY\n\n    mapboxCarMapSurface?.mapSurface?.mapboxMap?.loadStyle(Style.STANDARD) { style ->\n      style.setStyleImportConfigProperty(\n        \"basemap\",\n        \"lightPreset\",\n        Value.valueOf(lightPreset.toString().lowercase())\n      ).error?.let {\n        logE(TAG, it)\n      }\n    }\n  }\n\n  private enum class LightPresets {\n    DAY,\n    DAWN,\n    DUSK,\n    NIGHT\n  }\n\n  companion object {\n    private const val TAG = \"CarMapShowcase\"\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/CarMapWidgets.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapObserver\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapSurface\nimport com.mapbox.maps.extension.androidauto.widgets.CompassWidget\nimport com.mapbox.maps.extension.androidauto.widgets.LogoWidget\n\n/**\n * Note that the Widgets are only available when using android auto extension together with the\n * Android Maps SDK v10.4.0 and above, otherwise you will get compilation errors.\n */\n@OptIn(MapboxExperimental::class)\nclass CarMapWidgets : MapboxCarMapObserver {\n  private lateinit var logoWidget: LogoWidget\n  private lateinit var compassWidget: CompassWidget\n  private var cancellable: Cancelable? = null\n  override fun onAttached(mapboxCarMapSurface: MapboxCarMapSurface) {\n    super.onAttached(mapboxCarMapSurface)\n    with(mapboxCarMapSurface) {\n      logoWidget = LogoWidget(carContext)\n      compassWidget = CompassWidget(\n        carContext,\n        marginX = 26f,\n        marginY = 120f,\n      )\n      mapSurface.addWidget(logoWidget)\n      mapSurface.addWidget(compassWidget)\n      cancellable = mapSurface.mapboxMap.subscribeCameraChanged {\n        compassWidget.setRotation(-mapSurface.mapboxMap.cameraState.bearing.toFloat())\n      }\n    }\n  }\n\n  override fun onDetached(mapboxCarMapSurface: MapboxCarMapSurface) {\n    super.onDetached(mapboxCarMapSurface)\n    with(mapboxCarMapSurface) {\n      cancellable?.cancel()\n      cancellable = null\n      mapSurface.removeWidget(logoWidget)\n      mapSurface.removeWidget(compassWidget)\n    }\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/MapScreen.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport androidx.car.app.CarToast\nimport androidx.car.app.Screen\nimport androidx.car.app.model.Action\nimport androidx.car.app.model.ActionStrip\nimport androidx.car.app.model.CarColor\nimport androidx.car.app.model.CarIcon\nimport androidx.car.app.model.Template\nimport androidx.car.app.navigation.model.NavigationTemplate\nimport androidx.core.graphics.drawable.IconCompat\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.androidauto.MapboxCarMap\nimport com.mapbox.maps.extension.androidauto.mapboxMapInstaller\nimport com.mapbox.maps.testapp.auto.R\n\n/**\n * Simple demo of how to show a Mapbox Map on the Android Auto screen.\n */\n@OptIn(MapboxExperimental::class)\nclass MapScreen(\n  mapboxCarMap: MapboxCarMap\n) : Screen(mapboxCarMap.carContext) {\n  private var isInPanMode: Boolean = false\n  private val carCameraController = CarCameraController()\n\n  init {\n    mapboxMapInstaller(mapboxCarMap)\n      .onCreated(carCameraController)\n      .gestureHandler(carCameraController.gestureHandler)\n      .install()\n  }\n\n  override fun onGetTemplate(): Template {\n    val builder = NavigationTemplate.Builder()\n      .setBackgroundColor(CarColor.SECONDARY)\n\n    builder.setActionStrip(\n      ActionStrip.Builder()\n        .addAction(\n          Action.Builder()\n            .setIcon(\n              CarIcon.Builder(\n                IconCompat.createWithResource(\n                  carContext,\n                  android.R.drawable.ic_menu_mylocation\n                )\n              ).build()\n            )\n            .setOnClickListener {\n              carCameraController.focusOnLocationPuck()\n            }\n            .build()\n        )\n        .addAction(\n          Action.Builder()\n            .setIcon(\n              CarIcon.Builder(\n                IconCompat.createWithResource(\n                  carContext,\n                  android.R.drawable.ic_menu_search\n                )\n              ).build()\n            )\n            .setOnClickListener {\n              screenManager.push(SearchScreen(carContext))\n            }\n            .build()\n        )\n        .build()\n    )\n    // Set the map action strip with the pan and zoom buttons.\n    val panIconBuilder = CarIcon.Builder(\n      IconCompat.createWithResource(\n        carContext,\n        R.drawable.ic_pan_24\n      )\n    )\n    if (isInPanMode) {\n      panIconBuilder.setTint(CarColor.BLUE)\n    }\n    builder.setMapActionStrip(\n      ActionStrip.Builder()\n        .addAction(\n          Action.Builder(Action.PAN)\n            .setIcon(panIconBuilder.build())\n            .build()\n        )\n        .addAction(\n          Action.Builder()\n            .setIcon(\n              CarIcon.Builder(\n                IconCompat.createWithResource(\n                  carContext,\n                  R.drawable.ic_zoom_out_24\n                )\n              ).build()\n            )\n            .setOnClickListener {\n              // handle zoom out\n              carCameraController.zoomOutAction()\n            }\n            .build()\n        )\n        .addAction(\n          Action.Builder()\n            .setIcon(\n              CarIcon.Builder(\n                IconCompat.createWithResource(\n                  carContext,\n                  R.drawable.ic_zoom_in_24\n                )\n              ).build()\n            )\n            .setOnClickListener {\n              carCameraController.zoomInAction()\n            }\n            .build()\n        )\n        .build()\n    )\n\n    // When the user enters the pan mode, remind the user that they can exit the pan mode by\n    // pressing the select button again.\n    builder.setPanModeListener { isInPanMode: Boolean ->\n      if (isInPanMode) {\n        CarToast.makeText(\n          carContext,\n          \"Press Select to exit the pan mode\",\n          CarToast.LENGTH_LONG\n        ).show()\n      }\n      this.isInPanMode = isInPanMode\n      invalidate()\n    }\n\n    return builder.build()\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/MapSession.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport android.Manifest.permission.ACCESS_FINE_LOCATION\nimport android.content.Intent\nimport android.content.pm.PackageManager.PERMISSION_GRANTED\nimport android.content.res.Configuration\nimport androidx.car.app.Screen\nimport androidx.car.app.ScreenManager\nimport androidx.car.app.Session\nimport com.mapbox.common.BaseMapboxInitializer\nimport com.mapbox.maps.ContextMode\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapObserver\nimport com.mapbox.maps.extension.androidauto.mapboxMapInstaller\nimport com.mapbox.maps.loader.MapboxMapsInitializerImpl\n\n/**\n * Session class for the Mapbox Map sample app for Android Auto.\n */\nclass MapSession : Session() {\n  private val carMapShowcase = CarMapShowcase()\n  override fun onCreateScreen(intent: Intent): Screen {\n    // The onCreate is guaranteed to be called before onCreateScreen. You can pass the\n    // mapboxCarMap to other screens. Each screen can register and unregister observers.\n    // This allows you to scope behaviors to sessions, screens, or events.\n\n    // Also we cover the use-case if native libraries could not yet be loaded and show\n    // RetryScreen in that case with UI to retry init on a button click\n    val screen = tryInit(carMapShowcase)\n      ?: RetryScreen(\n        carContext,\n        this,\n        carMapShowcase,\n        \"Map not available\"\n      )\n\n    return if (carContext.checkSelfPermission(ACCESS_FINE_LOCATION) != PERMISSION_GRANTED) {\n      carContext.getCarService(ScreenManager::class.java)\n        .push(screen)\n      RequestPermissionScreen(carContext)\n    } else screen\n  }\n\n  override fun onCarConfigurationChanged(newConfiguration: Configuration) {\n    carMapShowcase.loadMapStyle(carContext)\n  }\n}\n@OptIn(MapboxExperimental::class)\ninternal fun MapSession.tryInit(carMapShowcase: MapboxCarMapObserver): MapScreen? = try {\n  // if Mapbox was init before successful - this is no-op\n  BaseMapboxInitializer.init(MapboxMapsInitializerImpl::class.java)\n  val mapboxCarMap = mapboxMapInstaller()\n    .onCreated(CarAnimationThreadController(), CarMapWidgets(), carMapShowcase)\n    .install { carContext ->\n      val mapOptions = MapInitOptions(carContext).mapOptions.toBuilder()\n        .contextMode(ContextMode.SHARED)\n        .build()\n      MapInitOptions(carContext, mapOptions = mapOptions)\n    }\n  MapScreen(mapboxCarMap)\n} catch (e: Throwable) {\n  null\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/RequestPermissionScreen.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport android.Manifest.permission\nimport androidx.car.app.CarContext\nimport androidx.car.app.CarToast\nimport androidx.car.app.Screen\nimport androidx.car.app.model.*\n\n/* Screen for asking the user to grant location permission. */\nclass RequestPermissionScreen(carContext: CarContext) :\n  Screen(carContext) {\n  override fun onGetTemplate(): Template {\n    val permissions = listOf(permission.ACCESS_FINE_LOCATION)\n    val listener = ParkedOnlyOnClickListener.create {\n      carContext.requestPermissions(permissions) { approved, rejected ->\n        CarToast.makeText(\n          carContext,\n          \"Approved: $approved, Rejected: $rejected\",\n          CarToast.LENGTH_LONG\n        ).show()\n        if (approved.isNotEmpty()) {\n          finish()\n        }\n      }\n    }\n    val action = Action.Builder()\n      .setTitle(\"Grant Permission\")\n      .setBackgroundColor(CarColor.GREEN)\n      .setOnClickListener(listener)\n      .build()\n    return MessageTemplate.Builder(\"This app requires location permission to work\")\n      .addAction(action)\n      .setHeaderAction(Action.BACK)\n      .build()\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/RetryScreen.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport androidx.car.app.CarContext\nimport androidx.car.app.Screen\nimport androidx.car.app.ScreenManager\nimport androidx.car.app.model.Action\nimport androidx.car.app.model.CarColor\nimport androidx.car.app.model.MessageTemplate\nimport androidx.car.app.model.ParkedOnlyOnClickListener\nimport androidx.car.app.model.Template\n\n/* Retry screen if the map failed to load. */\nclass RetryScreen(\n  carContext: CarContext,\n  private val session: MapSession,\n  private val carMapShowcase: CarMapShowcase,\n  private val message: String\n) : Screen(carContext) {\n\n  override fun onGetTemplate(): Template {\n    val listener = ParkedOnlyOnClickListener.create {\n      val screen = session.tryInit(carMapShowcase)\n        ?: RetryScreen(carContext, session, carMapShowcase, \"Map not yet loaded...\")\n      carContext.getCarService(ScreenManager::class.java)\n        .push(screen)\n      finish()\n    }\n    val action = Action.Builder()\n      .setTitle(\"Retry loading the map\")\n      .setBackgroundColor(CarColor.GREEN)\n      .setOnClickListener(listener)\n      .build()\n    return MessageTemplate.Builder(message)\n      .addAction(action)\n      .setHeaderAction(Action.BACK)\n      .build()\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/SearchScreen.kt",
    "content": "package com.mapbox.maps.testapp.auto.car\n\nimport androidx.car.app.CarContext\nimport androidx.car.app.Screen\nimport androidx.car.app.SurfaceContainer\nimport androidx.car.app.model.Action\nimport androidx.car.app.model.SearchTemplate\nimport androidx.car.app.model.Template\nimport com.mapbox.maps.extension.androidauto.MapboxCarMap\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapObserver\n\n/**\n * This screen is to demonstrate a behavior where the map surface is destroyed and re-created.\n *\n * Android Auto can transition between [Template]s that do not include a [SurfaceContainer] for\n * rendering the map. The [SearchTemplate] is one example template to reproduce this behavior.\n * The [MapboxCarMap] does not need to be re-created, but when the surface is destroyed the\n * [MapboxCarMap] will detach all registered [MapboxCarMapObserver]s. The observers will be\n * attached after a new surface is created.\n */\nclass SearchScreen(carContext: CarContext) : Screen(carContext) {\n\n  override fun onGetTemplate(): Template {\n    val searchCallback = object : SearchTemplate.SearchCallback {\n      override fun onSearchTextChanged(searchText: String) {}\n\n      override fun onSearchSubmitted(searchText: String) {}\n    }\n    return SearchTemplate.Builder(searchCallback)\n      .setHeaderAction(Action.BACK)\n      .build()\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/service/MapboxCarAppService.kt",
    "content": "package com.mapbox.maps.testapp.auto.service\n\nimport androidx.car.app.CarAppService\nimport androidx.car.app.Session\nimport androidx.car.app.validation.HostValidator\nimport com.mapbox.maps.testapp.auto.car.MapSession\n\n/**\n * Entry point for the templated app.\n *\n * CarAppService is the main interface between the app and Android Auto.\n *\n * For more details, see the [Android for Cars Library developer guide](https://developer.android.com/training/cars/navigation).\n */\nclass MapboxCarAppService : CarAppService() {\n  override fun createHostValidator(): HostValidator {\n    return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR\n  }\n\n  override fun onCreateSession(): Session {\n    return MapSession()\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/testing/CarJavaInterfaceChecker.java",
    "content": "package com.mapbox.maps.testapp.auto.testing;\n\nimport android.graphics.Rect;\n\nimport androidx.annotation.NonNull;\nimport androidx.car.app.CarContext;\nimport androidx.car.app.Screen;\nimport androidx.car.app.Session;\nimport androidx.car.app.SurfaceContainer;\n\nimport com.mapbox.maps.EdgeInsets;\nimport com.mapbox.maps.MapInitOptions;\nimport com.mapbox.maps.MapSurface;\nimport com.mapbox.maps.MapboxExperimental;\nimport com.mapbox.maps.ScreenCoordinate;\nimport com.mapbox.maps.extension.androidauto.DefaultMapboxCarMapGestureHandler;\nimport com.mapbox.maps.extension.androidauto.MapboxCarMap;\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapEx;\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapGestureHandler;\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapObserver;\nimport com.mapbox.maps.extension.androidauto.MapboxCarMapSurface;\n\n@MapboxExperimental\nclass CarJavaInterfaceChecker {\n\n  void constructorMapboxCarMap(MapInitOptions mapInitOptions) {\n    new MapboxCarMap();\n  }\n\n  void getters(MapboxCarMap mapboxCarMap) {\n    CarContext carContext = mapboxCarMap.getCarContext();\n    Rect visibleArea = mapboxCarMap.getVisibleArea();\n    EdgeInsets edgeInsets = mapboxCarMap.getVisibleEdgeInsets();\n    Rect stableArea = mapboxCarMap.getStableArea();\n    EdgeInsets stableEdgeInsets = mapboxCarMap.getStableEdgeInsets();\n    MapboxCarMapSurface mapboxCarMapSurface = mapboxCarMap.getCarMapSurface();\n  }\n\n  void getters(MapboxCarMapSurface mapboxCarMapSurface) {\n    CarContext carContext = mapboxCarMapSurface.getCarContext();\n    MapSurface mapSurface = mapboxCarMapSurface.getMapSurface();\n    SurfaceContainer surfaceContainer = mapboxCarMapSurface.getSurfaceContainer();\n  }\n\n  private MapboxCarMapObserver createObserver() {\n    return new MapboxCarMapObserver() {\n\n      @Override\n      public void onVisibleAreaChanged(@NonNull Rect visibleArea, @NonNull EdgeInsets edgeInsets) {\n\n      }\n\n      @Override\n      public void onStableAreaChanged(@NonNull Rect stableArea, @NonNull EdgeInsets edgeInsets) {\n\n      }\n\n      @Override\n      public void onDetached(@NonNull MapboxCarMapSurface mapboxCarMapSurface) {\n\n      }\n\n      @Override\n      public void onAttached(@NonNull MapboxCarMapSurface mapboxCarMapSurface) {\n\n      }\n    };\n  }\n\n  private void observers(MapboxCarMap mapboxCarMap) {\n    MapboxCarMapObserver emptyObserver = new MapboxCarMapObserver() { };\n    MapboxCarMapObserver observer = createObserver();\n    mapboxCarMap.registerObserver(emptyObserver);\n    mapboxCarMap.registerObserver(observer);\n    mapboxCarMap.unregisterObserver(observer);\n    mapboxCarMap.unregisterObserver(emptyObserver);\n    mapboxCarMap.clearObservers();\n  }\n\n  private void gestures(MapboxCarMap mapboxCarMap) {\n    MapboxCarMapGestureHandler emptyGestures = new MapboxCarMapGestureHandler() { };\n    mapboxCarMap.setGestureHandler(emptyGestures);\n    MapboxCarMapGestureHandler gestures = new MapboxCarMapGestureHandler() {\n      @Override\n      public void onScale(@NonNull MapboxCarMapSurface mapboxCarMapSurface, float focusX, float focusY, float scaleFactor) {}\n\n      @Override\n      public void onFling(@NonNull MapboxCarMapSurface mapboxCarMapSurface, float velocityX, float velocityY) {}\n\n      @Override\n      public void onScroll(@NonNull MapboxCarMapSurface mapboxCarMapSurface, @NonNull ScreenCoordinate visibleCenter, float distanceX, float distanceY) {}\n    };\n    mapboxCarMap.setGestureHandler(gestures);\n    mapboxCarMap.setGestureHandler(new DefaultMapboxCarMapGestureHandler());\n    mapboxCarMap.setGestureHandler(null);\n  }\n\n  private void sessionDefaultInstaller(Session session) {\n    MapboxCarMapObserver observer1 = createObserver();\n    MapboxCarMapObserver observer2 = createObserver();\n    MapboxCarMapEx.mapboxMapInstaller(session)\n            .onCreated(observer1, observer2)\n            .onStarted(observer1, observer2)\n            .onResumed(observer1, observer2)\n            .install();\n  }\n\n  private void sessionInstaller(Session session) {\n    MapboxCarMapObserver observer1 = createObserver();\n    MapboxCarMapObserver observer2 = createObserver();\n    MapboxCarMapEx.mapboxMapInstaller(session)\n            .onCreated(observer1, observer2)\n            .onStarted(observer1, observer2)\n            .onResumed(observer1, observer2)\n            .install(MapInitOptions::new);\n  }\n\n  private void screenInstaller(Screen screen, MapboxCarMap mapboxCarMap) {\n    MapboxCarMapObserver observer1 = createObserver();\n    MapboxCarMapObserver observer2 = createObserver();\n    MapboxCarMapEx.mapboxMapInstaller(screen, mapboxCarMap)\n            .onCreated(observer1, observer2)\n            .onStarted(observer1, observer2)\n            .onResumed(observer1, observer2)\n            .install();\n  }\n}"
  },
  {
    "path": "android-auto-app/src/main/res/drawable/ic_pan_24.xml",
    "content": "<!--\n  Copyright 2021 The Android Open Source Project\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M15.54,5.54L13.77,7.3 12,5.54 10.23,7.3 8.46,5.54 12,2zM18.46,15.54l-1.76,-1.77L18.46,12l-1.76,-1.77 1.76,-1.77L22,12zM8.46,18.46l1.77,-1.76L12,18.46l1.77,-1.76 1.77,1.76L12,22zM5.54,8.46l1.76,1.77L5.54,12l1.76,1.77 -1.76,1.77L2,12z\"/>\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M12,12m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0\"/>\n</vector>\n"
  },
  {
    "path": "android-auto-app/src/main/res/drawable/ic_zoom_in_24.xml",
    "content": "<!--\n  Copyright 2021 The Android Open Source Project\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\n</vector>\n"
  },
  {
    "path": "android-auto-app/src/main/res/drawable/ic_zoom_out_24.xml",
    "content": "<!--\n  Copyright 2021 The Android Open Source Project\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M19,13H5v-2h14v2z\"/>\n</vector>\n"
  },
  {
    "path": "android-auto-app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    tools:context=\".app.MainActivity\">\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        android:text=\"Android Auto testing activity\"\n        tools:ignore=\"HardcodedText\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "android-auto-app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "android-auto-app/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#000000</color>\n</resources>"
  },
  {
    "path": "android-auto-app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\" translatable=\"false\">Mapbox Map for Android Auto</string>\n</resources>"
  },
  {
    "path": "android-auto-app/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <style name=\"AppTheme\" parent=\"@style/Theme.AppCompat.NoActionBar\">\n    <item name=\"colorPrimary\">#ff41af6a</item>\n    <item name=\"colorOnPrimary\">#ff41af6a</item>\n    <item name=\"colorSecondary\">#fff3b713</item>\n    <item name=\"colorOnSecondary\">#fff3b713</item>\n  </style>\n\n  <style name=\"CarTheme\">\n    <item name=\"carColorPrimary\">#ff41af6a</item>\n    <item name=\"carColorPrimaryDark\">#ff41af6a</item>\n    <item name=\"carColorSecondary\">#fff3b713</item>\n    <item name=\"carColorSecondaryDark\">#fff3b713</item>\n  </style>\n</resources>\n"
  },
  {
    "path": "android-auto-app/src/main/res/xml/automotive_app_desc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<automotiveApp xmlns:tools=\"http://schemas.android.com/tools\">\n  <uses name=\"template\" tools:ignore=\"InvalidUsesTagAttribute\"/>\n</automotiveApp>"
  },
  {
    "path": "app/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.application\")\n  id(\"com.mapbox.gradle.plugins.ndk\")\n}\n\napply {\n  from(\"$rootDir/gradle/script-git-version.gradle\")\n  from(\"$rootDir/gradle/play-publisher.gradle\")\n}\n\nandroid {\n  compileSdk = libs.versions.exampleCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.testapp\"\n  signingConfigs {\n    create(\"release\") {\n      storeFile = rootProject.file(\"$rootDir/testapp-release.keystore\")\n      storePassword = if (project.hasProperty(\"APP_KEYSTORE_PASSWORD\")) {\n        project.property(\"APP_KEYSTORE_PASSWORD\") as String\n      } else {\n        System.getenv(\"APP_KEYSTORE_PASSWORD\")\n      }\n      keyAlias = if (project.hasProperty(\"APP_KEYSTORE_ALIAS\")) {\n        project.property(\"APP_KEYSTORE_ALIAS\") as String\n      } else {\n        System.getenv(\"APP_KEYSTORE_ALIAS\")\n      }\n      keyPassword = if (project.hasProperty(\"APP_KEY_PASSWORD\")) {\n        project.property(\"APP_KEY_PASSWORD\") as String\n      } else {\n        System.getenv(\"APP_KEY_PASSWORD\")\n      }\n    }\n  }\n  defaultConfig {\n    minSdk = libs.versions.exampleMinSdkVersion.get().toInt()\n    targetSdk = libs.versions.exampleTargetSdkVersion.get().toInt()\n    applicationId = \"com.mapbox.maps.testapp\"\n    versionCode = if (project.hasProperty(\"gitVersionCode\")) project.property(\"gitVersionCode\") as Int else 1\n    versionName = project.property(\"TEST_APP_VERSION_NAME\") as String\n    multiDexEnabled = true\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    testInstrumentationRunnerArguments[\"clearPackageData\"] = \"true\"\n    ndk {\n      val abi: String =\n        if (System.getenv(\"ANDROID_ABI\") != null) System.getenv(\"ANDROID_ABI\") else \"\"\n      if (abi.isNotBlank() && !project.hasProperty(\"android.injected.invoked.from.ide\")) {\n        abiFilters.add(abi)\n      }\n    }\n  }\n  buildTypes {\n    getByName(\"release\") {\n      isMinifyEnabled = true\n      signingConfig = if (rootProject.file(\"$rootDir/testapp-release.keystore\").exists()) {\n        signingConfigs.getByName(\"release\")\n      } else {\n        signingConfigs.getByName(\"debug\")\n      }\n      proguardFiles(\n        getDefaultProguardFile(\"proguard-android.txt\"),\n        \"proguard-rules.pro\",\n        \"mapbox-services-proguard-rules.pro\",\n        \"retrofit2-proguard-rules.pro\"\n      )\n    }\n    getByName(\"debug\") {\n      isMinifyEnabled = false\n      signingConfig = signingConfigs.getByName(\"debug\")\n    }\n  }\n\n  compileOptions {\n    sourceCompatibility = JavaVersion.VERSION_1_8\n    targetCompatibility = JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = JavaVersion.VERSION_1_8.toString()\n  }\n\n  buildFeatures {\n    viewBinding = true\n    buildConfig = true\n  }\n\n  testOptions {\n    animationsDisabled = true\n    if (!project.hasProperty(\"android.injected.invoked.from.ide\")) {\n      execution = \"ANDROIDX_TEST_ORCHESTRATOR\"\n    }\n  }\n\n  externalNativeBuild {\n    cmake {\n      path = file(\"src/main/cpp/CMakeLists.txt\")\n    }\n  }\n}\n\ndependencies {\n  implementation(project(\":maps-sdk\"))\n  implementation(libs.kotlin)\n  implementation(libs.androidx.appCompat)\n  implementation(libs.androidx.coreKtx)\n  implementation(appsLibs.androidx.recyclerView)\n  implementation(appsLibs.androidx.constraintLayout)\n  implementation(appsLibs.androidx.lifecycleKtx)\n  implementation(appsLibs.googleMaterialDesign)\n  implementation(appsLibs.androidx.fragmentTest)\n  implementation(appsLibs.mapbox.turf)\n  implementation(appsLibs.mapbox.services)\n  implementation(appsLibs.square.retrofit)\n  implementation(appsLibs.square.retrofit.gsonConverter)\n\n  // By default, the Maps SDK uses the Android Location Provider to obtain raw location updates.\n  // And with Android 11, the raw location updates might suffer from precision issue.\n\n  // The Maps SDK also comes pre-compiled with support for the [Google's Fused Location Provider](https://developers.google.com/location-context/fused-location-provider)\n  // if that dependency is available. This means, that if your target devices support Google Play\n  // Services, [we recommend adding the Google Play Location Services dependency to your project](https://developers.google.com/android/guides/setup).\n  implementation(appsLibs.googlePlayServicesLocation)\n\n  // Maps SDK does not provide this dependency so adding explicitly to make use of\n  // async view inflation for view annotation manager example\n  implementation(libs.asyncInflater)\n\n  debugImplementation(appsLibs.squareLeakCanary)\n  debugImplementation(libs.androidx.testMonitor)\n  androidTestUtil(libs.androidx.orchestrator)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n  androidTestImplementation(libs.androidx.jUnitTestRules)\n  androidTestImplementation(libs.androidx.testJUnit)\n  androidTestImplementation(libs.androidx.uiAutomator)\n  testImplementation(libs.junit)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "app/lint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<lint>\n    <!-- Disable the given check in this project -->\n    <issue id=\"IconDensities\" severity=\"ignore\" />\n</lint>"
  },
  {
    "path": "app/mapbox-services-proguard-rules.pro",
    "content": "# AutoValue are required by com.mapbox.api.directions.v5.MapboxDirections\n-dontwarn com.google.auto.value.AutoValue$Builder\n-dontwarn com.google.auto.value.AutoValue"
  },
  {
    "path": "app/permission.json",
    "content": "[\n    \"android.permission.ACCESS_BACKGROUND_LOCATION\",\n    \"android.permission.ACCESS_COARSE_LOCATION\",\n    \"android.permission.ACCESS_FINE_LOCATION\",\n    \"android.permission.ACCESS_NETWORK_STATE\",\n    \"android.permission.ACCESS_WIFI_STATE\",\n    \"android.permission.INTERNET\",\n    \"android.permission.POST_NOTIFICATIONS\",\n    \"android.permission.REORDER_TASKS\",\n    \"com.mapbox.maps.testapp.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION\"\n]"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": ""
  },
  {
    "path": "app/retrofit2-proguard-rules.pro",
    "content": "# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and\n# EnclosingMethod is required to use InnerClasses.\n-keepattributes Signature, InnerClasses, EnclosingMethod\n\n# Retrofit does reflection on method and parameter annotations.\n-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations\n\n# Keep annotation default values (e.g., retrofit2.http.Field.encoded).\n-keepattributes AnnotationDefault\n\n# Retain service method parameters when optimizing.\n-keepclassmembers,allowshrinking,allowobfuscation interface * {\n    @retrofit2.http.* <methods>;\n}\n\n# Ignore annotation used for build tooling.\n-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement\n\n# Ignore JSR 305 annotations for embedding nullability information.\n-dontwarn javax.annotation.**\n\n# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.\n-dontwarn kotlin.Unit\n\n# Top-level functions that can only be used by Kotlin.\n-dontwarn retrofit2.KotlinExtensions\n-dontwarn retrofit2.KotlinExtensions$*\n\n# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy\n# and replaces all potential values with null. Explicitly keeping the interfaces prevents this.\n-if interface * { @retrofit2.http.* <methods>; }\n-keep,allowobfuscation interface <1>\n\n# Keep inherited services.\n-if interface * { @retrofit2.http.* <methods>; }\n-keep,allowobfuscation interface * extends <1>\n\n# With R8 full mode generic signatures are stripped for classes that are not\n# kept. Suspend functions are wrapped in continuations where the type argument\n# is used.\n-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation\n\n# R8 full mode strips generic signatures from return types if not kept.\n-if interface * { @retrofit2.http.* public *** *(...); }\n-keep,allowoptimization,allowshrinking,allowobfuscation class <3>\n\n# With R8 full mode generic signatures are stripped for classes that are not kept.\n-keep,allowobfuscation,allowshrinking class retrofit2.Response\n"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/BaseMapTest.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport android.content.Context\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.mapbox.maps.*\nimport com.mapbox.maps.R\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.runner.RunWith\n\n/**\n * Instrumentation test for Layers to test Layer properties.\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nabstract class BaseMapTest {\n  protected lateinit var mapView: MapView\n  protected lateinit var mapboxMap: MapboxMap\n  protected lateinit var style: Style\n  protected lateinit var context: Context\n  protected var pixelRatio: Float = 1.0f\n\n  @get:Rule\n  var rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  @Before\n  fun before() {\n    context = InstrumentationRegistry.getInstrumentation().targetContext\n    pixelRatio = context.resources.displayMetrics.density\n    initialiseMapView()\n    loadMap()\n  }\n\n  protected open fun initialiseMapView() {\n    withLatch(\n      timeoutMillis = 10000\n    ) { latch ->\n      rule.runOnUiThread {\n        mapView = MapView(context)\n        mapView.id = R.id.mapView\n        it.setContentView(mapView)\n        mapView.onStart()\n        latch.countDown()\n      }\n    }\n  }\n\n  protected open fun loadMap() {\n    withLatch(\n      timeoutMillis = 10000\n    ) { latch ->\n      rule.runOnUiThread {\n        mapboxMap = mapView.mapboxMap\n        mapboxMap.loadStyle(\n          Style.DARK\n        ) { style ->\n          this@BaseMapTest.style = style\n\n          latch.countDown()\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/CameraForCoordinatesTest.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport android.widget.FrameLayout\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapSnapshotOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Size\nimport com.mapbox.maps.Snapshotter\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.util.isEmpty\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n@RunWith(AndroidJUnit4::class)\nclass CameraForCoordinatesTest {\n\n  @get:Rule\n  var testActivity = ActivityScenarioRule(EmptyActivity::class.java)\n\n  private val initialCamera = cameraOptions {\n    center(Point.fromLngLat(24.9384, 60.1699))\n    zoom(4.0)\n  }\n  private val firstCoordinate = Point.fromLngLat(21.9384, 57.1699)\n  private val secondCoordinate = Point.fromLngLat(23.9384, 59.1699)\n  private val expectedBearing = 60.0\n  private val expectedPitch = 60.0\n  private val targetCamera = cameraOptions {\n    zoom(10.0)\n    bearing(expectedBearing)\n    pitch(expectedPitch)\n  }\n  private val expectedPoint = Point.fromLngLat(22.9384, 58.183962708517015)\n\n  @Test\n  fun cameraForCoordinatesBeforeMapSizeCalculated() {\n    val latch = CountDownLatch(1)\n    var actualCamera: CameraOptions? = null\n    testActivity.scenario.onActivity { activity ->\n      val mapView = MapView(activity, MapInitOptions(activity, cameraOptions = initialCamera))\n      activity.setContentView(mapView)\n      mapView.mapboxMap.cameraForCoordinates(\n        coordinates = listOf(firstCoordinate, secondCoordinate),\n        camera = targetCamera,\n        coordinatesPadding = null,\n        maxZoom = null,\n        offset = null\n      ) {\n        actualCamera = it\n        latch.countDown()\n      }\n      assert(\n        mapView.mapboxMap.cameraForCoordinates(\n          coordinates = listOf(firstCoordinate, secondCoordinate),\n          camera = targetCamera,\n          coordinatesPadding = null,\n          maxZoom = null,\n          offset = null\n        ).isEmpty\n      )\n    }\n    if (!latch.await(LATCH_TIMEOUT_MS, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    Assert.assertEquals(expectedBearing, actualCamera!!.bearing!!, EPS)\n    Assert.assertEquals(expectedPitch, actualCamera!!.pitch!!, EPS)\n    Assert.assertEquals(expectedPoint.latitude(), actualCamera!!.center!!.latitude(), EPS)\n    Assert.assertEquals(expectedPoint.longitude(), actualCamera!!.center!!.longitude(), EPS)\n  }\n\n  @Test\n  fun snapshotterCameraForCoordinates() {\n    var actualCamera: CameraOptions? = null\n    val snapshotterOptions = MapSnapshotOptions.Builder()\n      .size(Size(512.0f, 512.0f))\n      .pixelRatio(1.0f)\n      .build()\n\n    testActivity.scenario.onActivity { activity ->\n      val mapSnapshotter = Snapshotter(activity, snapshotterOptions).apply {\n        setStyleUri(Style.STANDARD)\n        setCamera(initialCamera)\n      }\n      actualCamera = mapSnapshotter.cameraForCoordinates(\n        coordinates = listOf(firstCoordinate, secondCoordinate),\n        padding = null,\n        bearing = expectedBearing,\n        pitch = expectedPitch,\n      )\n    }\n    Assert.assertEquals(expectedBearing, actualCamera!!.bearing!!, EPS)\n    Assert.assertEquals(expectedPitch, actualCamera!!.pitch!!, EPS)\n    Assert.assertEquals(expectedPoint.latitude(), actualCamera!!.center!!.latitude(), EPS)\n    Assert.assertEquals(expectedPoint.longitude(), actualCamera!!.center!!.longitude(), EPS)\n  }\n\n  @Test\n  fun cameraForCoordinatesMultipleCallsBeforeMapSizeCalculated() {\n    val latch = CountDownLatch(2)\n    var actualCamera: CameraOptions? = null\n    var secondActualCamera: CameraOptions? = null\n    testActivity.scenario.onActivity { activity ->\n      val mapView = MapView(activity, MapInitOptions(activity, cameraOptions = initialCamera))\n      activity.setContentView(mapView)\n      mapView.mapboxMap.cameraForCoordinates(\n        coordinates = listOf(firstCoordinate, secondCoordinate),\n        camera = targetCamera,\n        coordinatesPadding = null,\n        maxZoom = null,\n        offset = null\n      ) {\n        actualCamera = it\n        latch.countDown()\n      }\n      mapView.mapboxMap.cameraForCoordinates(\n        coordinates = listOf(\n          Point.fromLngLat(17.9384, 53.1699),\n          Point.fromLngLat(19.9384, 55.1699),\n        ),\n        camera = targetCamera,\n        coordinatesPadding = null,\n        maxZoom = null,\n        offset = null\n      ) {\n        secondActualCamera = it\n        latch.countDown()\n      }\n    }\n    if (!latch.await(LATCH_TIMEOUT_MS, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    Assert.assertEquals(expectedBearing, actualCamera!!.bearing!!, EPS)\n    Assert.assertEquals(expectedPitch, actualCamera!!.pitch!!, EPS)\n    Assert.assertEquals(expectedPoint.latitude(), actualCamera!!.center!!.latitude(), EPS)\n    Assert.assertEquals(expectedPoint.longitude(), actualCamera!!.center!!.longitude(), EPS)\n\n    Assert.assertEquals(expectedBearing, secondActualCamera!!.bearing!!, EPS)\n    Assert.assertEquals(expectedPitch, secondActualCamera!!.pitch!!, EPS)\n    Assert.assertEquals(54.181989706019365, secondActualCamera!!.center!!.latitude(), EPS)\n    Assert.assertEquals(18.9384, secondActualCamera!!.center!!.longitude(), EPS)\n  }\n\n  @Test\n  fun cameraForCoordinatesAfterMapSizeCalculated() {\n    val latch = CountDownLatch(1)\n    var actualAsyncCamera: CameraOptions? = null\n    var actualSyncCamera: CameraOptions? = null\n    testActivity.scenario.onActivity { activity ->\n      val mapView = MapView(activity, MapInitOptions(activity, cameraOptions = initialCamera))\n      activity.setContentView(mapView)\n      mapView.queueEvent(\n        {\n          activity.runOnUiThread {\n            actualSyncCamera = mapView.mapboxMap.cameraForCoordinates(\n              coordinates = listOf(firstCoordinate, secondCoordinate),\n              camera = targetCamera,\n              coordinatesPadding = null,\n              maxZoom = null,\n              offset = null\n            )\n            mapView.mapboxMap.cameraForCoordinates(\n              coordinates = listOf(firstCoordinate, secondCoordinate),\n              camera = targetCamera,\n              coordinatesPadding = null,\n              maxZoom = null,\n              offset = null\n            ) {\n              actualAsyncCamera = it\n              latch.countDown()\n            }\n          }\n        },\n        needRender = true\n      )\n    }\n    if (!latch.await(LATCH_TIMEOUT_MS, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    Assert.assertEquals(expectedBearing, actualAsyncCamera!!.bearing!!, EPS)\n    Assert.assertEquals(expectedPitch, actualAsyncCamera!!.pitch!!, EPS)\n    Assert.assertEquals(expectedPoint.latitude(), actualAsyncCamera!!.center!!.latitude(), EPS)\n    Assert.assertEquals(expectedPoint.longitude(), actualAsyncCamera!!.center!!.longitude(), EPS)\n\n    Assert.assertEquals(actualAsyncCamera, actualSyncCamera)\n  }\n\n  @Test\n  fun cameraForCoordinatesViewResize() {\n    val latch = CountDownLatch(1)\n    var actualAsyncCamera: CameraOptions? = null\n    testActivity.scenario.onActivity { activity ->\n      val mapView = MapView(activity, MapInitOptions(activity, cameraOptions = initialCamera))\n      val root = FrameLayout(activity)\n      activity.setContentView(root)\n\n      root.addView(mapView)\n      mapView.layoutParams.height = 400\n      mapView.layoutParams.width = 300\n\n      mapView.queueEvent(\n        {\n          activity.runOnUiThread {\n            // trigger this manually for test for reliability\n            // in reality MapView will be resized when calling `requestLayout`\n            mapView.onSizeChanged(root.width, root.height)\n            assert(\n              mapView.mapboxMap.cameraForCoordinates(\n                coordinates = listOf(firstCoordinate, secondCoordinate),\n                camera = targetCamera,\n                coordinatesPadding = null,\n                maxZoom = null,\n                offset = null\n              ).isEmpty\n            )\n            mapView.queueEvent(\n              {\n                activity.runOnUiThread {\n                  mapView.mapboxMap.cameraForCoordinates(\n                    coordinates = listOf(firstCoordinate, secondCoordinate),\n                    camera = targetCamera,\n                    coordinatesPadding = null,\n                    maxZoom = null,\n                    offset = null\n                  ) {\n                    actualAsyncCamera = it\n                    latch.countDown()\n                  }\n                }\n              },\n              needRender = true\n            )\n          }\n        },\n        needRender = true\n      )\n    }\n    if (!latch.await(LATCH_TIMEOUT_MS, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    Assert.assertEquals(expectedBearing, actualAsyncCamera!!.bearing!!, EPS)\n    Assert.assertEquals(expectedPitch, actualAsyncCamera!!.pitch!!, EPS)\n    Assert.assertEquals(expectedPoint.latitude(), actualAsyncCamera!!.center!!.latitude(), EPS)\n    Assert.assertEquals(expectedPoint.longitude(), actualAsyncCamera!!.center!!.longitude(), EPS)\n  }\n\n  private companion object {\n    private const val EPS = 0.0001\n    private const val LATCH_TIMEOUT_MS = 5L\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/ExampleOverviewActivityTest.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.action.ViewActions.*\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.matcher.ViewMatchers.isDisplayed\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumentation test for [ExampleOverviewActivity] to test whether\n * the RecyclerView is displayed.\n */\n@RunWith(AndroidJUnit4::class)\nclass ExampleOverviewActivityTest {\n\n  @Rule\n  @JvmField\n  var rule = ActivityScenarioRule(ExampleOverviewActivity::class.java)\n\n  @Test\n  fun checkRecyclerViewIsDisplayed() {\n    onView(withId(R.id.recyclerView)).check(matches(isDisplayed()))\n  }\n\n  @Test\n  fun checkRecyclerViewClick() {\n    onView(withId(R.id.recyclerView)).check(matches(isDisplayed()))\n    onView(withId(R.id.recyclerView)).perform(click())\n  }\n\n  @Test\n  fun checkRecyclerViewSwipeUpAndDown() {\n    onView(withId(R.id.recyclerView)).perform(swipeUp()).check(matches(isDisplayed()))\n    onView(withId(R.id.recyclerView)).perform(swipeDown()).check(matches(isDisplayed()))\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/GeoJsonSourceMutateTest.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.R\nimport com.mapbox.maps.extension.style.sources.addGeoJSONSourceFeatures\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.extension.style.sources.removeGeoJSONSourceFeatures\nimport com.mapbox.maps.extension.style.sources.updateGeoJSONSourceFeatures\nimport com.mapbox.maps.plugin.compass.compass\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n@RunWith(Parameterized::class)\nclass GeoJsonSourceMutateTest(\n  private val initialFeatureCount: Int,\n  private val updatedFeatureCount: Int,\n  private val commandType: CommandType,\n) : BaseMapTest() {\n\n  private lateinit var initialFeatures: List<Feature>\n\n  override fun initialiseMapView() {\n    withLatch(\n      timeoutMillis = 10000\n    ) { latch ->\n      rule.runOnUiThread {\n        mapView = MapView(context)\n        mapboxMap = mapView.mapboxMap\n        mapView.id = R.id.mapView\n        // We don't need any style, nor compass nor scalebar\n        mapView.mapboxMap.loadStyle(\"\")\n        mapView.compass.enabled = false\n        mapView.scalebar.enabled = false\n        it.setContentView(mapView)\n        latch.countDown()\n      }\n    }\n  }\n\n  override fun loadMap() {\n    withLatch { latch ->\n      initialFeatures = generateFeatures(initialFeatureCount)\n\n      rule.runOnUiThread {\n        var cancelable: Cancelable? = null\n        cancelable = mapboxMap.subscribeSourceDataLoaded {\n          if (it.sourceId == SOURCE_ID && it.dataId == DATA_ID) {\n            cancelable?.cancel()\n            latch.countDown()\n          }\n        }\n\n        mapboxMap.getStyle {\n          this.style = it\n          this.style.addSource(\n            geoJsonSource(SOURCE_ID).featureCollection(\n              FeatureCollection.fromFeatures(initialFeatures),\n              DATA_ID\n            )\n          )\n        }\n      }\n    }\n  }\n\n  @Test\n  fun testMutateGeoJson() {\n    val featureList = when (commandType) {\n      CommandType.ADD_FULL -> {\n        generateFeatures(updatedFeatureCount)\n      }\n\n      CommandType.ADD_PARTIAL -> {\n        generateFeatures(updatedFeatureCount, namePrefix = \"Partial_\")\n      }\n\n      CommandType.UPDATE -> {\n        generateUpdateFeatures(updatedFeatureCount)\n      }\n\n      CommandType.REMOVE -> {\n        generateRemoveFeatures(updatedFeatureCount)\n      }\n    }\n\n    withLatch(\n      timeoutMillis = 10_000L\n    ) { latch ->\n      println(\"With latch\")\n      rule.runOnUiThread {\n        var cancelable: Cancelable? = null\n        cancelable = mapboxMap.subscribeSourceDataLoaded {\n          println(\"Source data loaded, source id : ${it.sourceId} / data id : ${it.dataId}\")\n          if (it.sourceId == SOURCE_ID && it.dataId == DATA_ID) {\n            println(\"Finish latch\")\n            cancelable?.cancel()\n            latch.countDown()\n          }\n        }\n\n        mutateGeoJson(featureList, commandType)\n      }\n    }\n  }\n\n  private fun mutateGeoJson(\n    featureList: List<Feature>,\n    commandType: CommandType\n  ) {\n    println(\"Mutate geojson (command $commandType), data id : $DATA_ID\")\n    val geoJsonSource = this.style.getSourceAs<GeoJsonSource>(SOURCE_ID)!!\n    when (commandType) {\n      CommandType.ADD_PARTIAL -> {\n        geoJsonSource.addGeoJSONSourceFeatures(featureList, DATA_ID)\n      }\n\n      CommandType.UPDATE -> {\n        geoJsonSource.updateGeoJSONSourceFeatures(featureList, DATA_ID)\n      }\n\n      CommandType.REMOVE -> {\n        geoJsonSource.removeGeoJSONSourceFeatures(featureList.map { it.id()!! }, DATA_ID)\n      }\n\n      CommandType.ADD_FULL -> {\n        geoJsonSource.featureCollection(FeatureCollection.fromFeatures(initialFeatures + featureList), DATA_ID)\n      }\n    }\n    println(\"Geojson updated, wait for the source data loaded event\")\n  }\n\n  companion object {\n\n    enum class CommandType {\n      ADD_FULL,\n      ADD_PARTIAL,\n      UPDATE,\n      REMOVE\n    }\n\n    private const val SOURCE_ID = \"source\"\n    private const val DATA_ID = \"update_id\"\n    private val INITIAL_FEATURE_COUNT = listOf(100, 10000)\n    private val UPDATE_FEATURE_COUNT = listOf(1, 100, 1000, 10000)\n\n    private fun generateFeatures(size: Int, namePrefix: String = \"\") =\n      (1..size).map {\n        Feature.fromGeometry(\n          Point.fromLngLat(0.01 * it, 0.01 * it),\n          null,\n          featureId(it, namePrefix)\n        )\n      }\n\n    private fun generateUpdateFeatures(size: Int) =\n      (1..size).map {\n        Feature.fromGeometry(\n          Point.fromLngLat(15.0 + 0.01 * it, 0.0 + 0.01 * it),\n          null,\n          featureId(it)\n        )\n      }\n\n    private fun generateRemoveFeatures(size: Int) =\n      (1..size).map {\n        Feature.fromGeometry(\n          Point.fromLngLat(0.001 * it, 0.001 * it),\n          null,\n          featureId(it)\n        )\n      }\n\n    private fun featureId(id: Int, namePrefix: String = \"\") = \"${namePrefix}_$id\"\n\n    @JvmStatic\n    @Parameterized.Parameters(name = \"{1}, {0}, {2}\")\n    fun data() = INITIAL_FEATURE_COUNT.flatMap { initialFeatureCount ->\n      UPDATE_FEATURE_COUNT.filter { it <= initialFeatureCount }.flatMap { updatedFeatureCount ->\n        listOf(\n          arrayOf(\n            initialFeatureCount,\n            updatedFeatureCount,\n            CommandType.ADD_PARTIAL,\n          ),\n          arrayOf(\n            initialFeatureCount,\n            updatedFeatureCount,\n            CommandType.ADD_FULL,\n          ),\n          arrayOf(\n            initialFeatureCount,\n            updatedFeatureCount,\n            CommandType.UPDATE,\n          ),\n          arrayOf(\n            initialFeatureCount,\n            updatedFeatureCount,\n            CommandType.REMOVE,\n          ),\n        )\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/LoadStyleCallbackTest.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport android.app.Activity\nimport androidx.lifecycle.Lifecycle\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.Style\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass LoadStyleCallbackTest {\n\n  @get:Rule\n  var testActivity = ActivityScenarioRule(TestMapActivity::class.java)\n\n  @Test\n  fun loadStyleWhileStarted() {\n    val activity = testActivity.getActivity()\n\n    if (!activity.startLatch.await(2, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n\n    val latch = CountDownLatch(1)\n    testActivity.scenario.onActivity {\n      activity.mapView.mapboxMap.apply {\n        subscribeMapLoadingError {\n          throw AssertionError(\"onMapLoadError: $it\")\n        }\n        loadStyle(\n          style = Style.LIGHT,\n          onStyleLoaded = {\n            latch.countDown()\n          }\n        )\n      }\n    }\n\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @Test\n  fun stopAfterLoadStyle() {\n    val activity = testActivity.getActivity()\n\n    if (!activity.startLatch.await(2, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n\n    val latch = CountDownLatch(1)\n    testActivity.scenario.onActivity {\n      activity.mapView.mapboxMap.apply {\n        subscribeMapLoadingError {\n          throw AssertionError(\"onMapLoadError: $it\")\n        }\n        loadStyle(\n          style = Style.LIGHT,\n          onStyleLoaded = {\n            latch.countDown()\n          }\n        )\n      }\n\n      activity.mapView.onStop()\n    }\n\n    testActivity.scenario.moveToState(Lifecycle.State.CREATED)\n\n    if (!activity.stopLatch.await(2, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n\n    testActivity.scenario.moveToState(Lifecycle.State.RESUMED)\n\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @Test\n  fun loadStyleWhileStopped() {\n    val activity = testActivity.getActivity()\n\n    if (!activity.startLatch.await(2, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n\n    testActivity.scenario.moveToState(Lifecycle.State.CREATED)\n\n    if (!activity.stopLatch.await(2, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n\n    val latch = CountDownLatch(1)\n    testActivity.scenario.onActivity {\n      activity.mapView.mapboxMap.apply {\n        subscribeMapLoadingError {\n          throw AssertionError(\"onMapLoadError: $it\")\n        }\n        loadStyle(\n          style = Style.LIGHT,\n          onStyleLoaded = {\n            latch.countDown()\n          }\n        )\n      }\n    }\n\n    Thread.sleep(100)\n\n    testActivity.scenario.moveToState(Lifecycle.State.RESUMED)\n\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  private fun <T : Activity> ActivityScenarioRule<T>.getActivity(): T {\n    var activity: T? = null\n    scenario.onActivity { activity = it }\n    return activity!!\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/Utils.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\nfun withLatch(\n  count: Int = 1,\n  timeoutMillis: Long = 3000,\n  lambda: (CountDownLatch) -> Unit\n) {\n  val latch = CountDownLatch(count)\n  lambda(latch)\n  if (!latch.await(timeoutMillis, TimeUnit.MILLISECONDS)) {\n    throw TimeoutException()\n  }\n}\n\nfun ActivityScenarioRule<EmptyActivity>.runOnUiThread(action: (EmptyActivity) -> Unit) {\n  this.scenario.onActivity { activity ->\n    activity.runOnUiThread { action(activity) }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/annotation/InteractionsTest.kt",
    "content": "package com.mapbox.maps.testapp.annotation\n\nimport android.graphics.Color\nimport androidx.test.espresso.Espresso\nimport androidx.test.espresso.matcher.ViewMatchers\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.DragInteraction\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.R\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createCircleAnnotationManager\nimport com.mapbox.maps.plugin.gestures.OnMoveListener\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.testapp.BaseMapTest\nimport com.mapbox.maps.testapp.gestures.GesturesUiTestUtils\nimport org.junit.Assert\nimport org.junit.Test\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\n\nclass InteractionsTest : BaseMapTest() {\n\n  private lateinit var circleAnnotation: CircleAnnotation\n\n  override fun loadMap() {\n    super.loadMap()\n    rule.scenario.onActivity {\n      mapboxMap.setCamera(INITIAL_CAMERA)\n    }\n  }\n\n  /**\n   * Instrument test to make sure Interaction API works as expected.\n   */\n  @Test\n  fun dragAnnotationTest() {\n    val latch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      mapView.annotations.createCircleAnnotationManager().apply {\n        val circleAnnotationOptions: CircleAnnotationOptions = CircleAnnotationOptions()\n          .withPoint(INITIAL_CAMERA.center!!)\n          .withCircleColor(Color.YELLOW)\n          .withCircleRadius(12.0)\n          .withDraggable(true)\n        circleAnnotation = create(circleAnnotationOptions)\n      }\n      mapView.mapboxMap.subscribeMapIdle {\n        latch.countDown()\n      }\n      mapView.gestures.addOnMoveListener(object : OnMoveListener {\n        override fun onMoveBegin(detector: MoveGestureDetector) {\n          // Make sure this user defined map surface `onMoveBegin` is not called due to the\n          // `circleAnnotation` consuming it and not dispatching further\n          throw RuntimeException(\"User defined map onMoveBegin must not be called!\")\n        }\n\n        override fun onMove(detector: MoveGestureDetector): Boolean {\n          // Make sure this user defined map surface `onMove` is not called due to the\n          // `circleAnnotation` consuming all the `onMove` events\n          throw RuntimeException(\"User defined map onMove must not be called!\")\n        }\n\n        override fun onMoveEnd(detector: MoveGestureDetector) {\n        }\n      })\n    }\n    Assert.assertTrue(latch.await(10_000, TimeUnit.MILLISECONDS))\n    // simulate 1-finger pan gesture starting from the center of the MapView\n    // to make sure we click the annotation\n    val shiftX = 10f * pixelRatio\n    Espresso\n      .onView(ViewMatchers.withId(R.id.mapView))\n      .perform(\n        GesturesUiTestUtils.move(\n          shiftX,\n          0f\n        )\n      )\n    // check that map camera did not change\n    rule.scenario.onActivity {\n      Assert.assertEquals(\n        mapboxMap.cameraState.center.longitude(),\n        INITIAL_CAMERA.center!!.longitude(),\n        EPS\n      )\n      Assert.assertEquals(\n        mapboxMap.cameraState.center.latitude(),\n        INITIAL_CAMERA.center!!.latitude(),\n        EPS\n      )\n    }\n    // check that circle annotation was dragged\n    Assert.assertEquals(\n      24.938827583733797,\n      circleAnnotation.point.longitude(),\n      EPS\n    )\n    Assert.assertEquals(\n      INITIAL_CAMERA.center!!.latitude(),\n      circleAnnotation.point.latitude(),\n      EPS\n    )\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun mapMoveListenersTest() {\n    val listOfMoveBeginEvents = mutableListOf<String>()\n    rule.scenario.onActivity {\n      mapView.gestures.addOnMoveListener(object : OnMoveListener {\n        override fun onMoveBegin(detector: MoveGestureDetector) {\n          listOfMoveBeginEvents.add(\"1_gesture\")\n        }\n\n        override fun onMove(detector: MoveGestureDetector): Boolean {\n          return false\n        }\n\n        override fun onMoveEnd(detector: MoveGestureDetector) {}\n      })\n      mapView.gestures.addOnMoveListener(object : OnMoveListener {\n        override fun onMoveBegin(detector: MoveGestureDetector) {\n          listOfMoveBeginEvents.add(\"2_gesture\")\n        }\n\n        override fun onMove(detector: MoveGestureDetector): Boolean {\n          return false\n        }\n\n        override fun onMoveEnd(detector: MoveGestureDetector) {}\n      })\n      mapView.mapboxMap.addInteraction(\n        DragInteraction(\n          onDragBegin = {\n            listOfMoveBeginEvents.add(\"1_map_interaction\")\n            return@DragInteraction false\n          },\n          onDrag = { },\n          onDragEnd = { }\n        )\n      )\n      mapView.mapboxMap.addInteraction(\n        DragInteraction(\n          onDragBegin = {\n            listOfMoveBeginEvents.add(\"2_map_interaction\")\n            return@DragInteraction false\n          },\n          onDrag = { },\n          onDragEnd = { }\n        )\n      )\n    }\n    Espresso\n      .onView(ViewMatchers.withId(R.id.mapView))\n      .perform(\n        GesturesUiTestUtils.move(\n          200f,\n          0f\n        )\n      )\n    // interactions are LIFO while map gesture listeners are FIFO\n    // also user defined interactions are always triggered before map gesture listeners\n    Assert.assertArrayEquals(\n      arrayOf(\"2_map_interaction\", \"1_map_interaction\", \"1_gesture\", \"2_gesture\"),\n      listOfMoveBeginEvents.toTypedArray()\n    )\n  }\n\n  private companion object {\n    private val INITIAL_CAMERA = cameraOptions {\n      center(Point.fromLngLat(24.9384, 60.1699))\n      zoom(14.0)\n      pitch(0.0)\n      bearing(0.0)\n    }\n    private const val EPS = 0.0001\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/annotation/UpdateAnnotationTest.kt",
    "content": "package com.mapbox.maps.testapp.annotation\n\nimport android.graphics.Color\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextJustify\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextTransform\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\nimport com.mapbox.maps.testapp.BaseMapTest\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport org.junit.Assert\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Instrumented test for verifying annotation updating while changing style\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass UpdateAnnotationTest : BaseMapTest() {\n  private val updateDelay = 100L\n  private var index = 0\n  private val latch = CountDownLatch(AnnotationUtils.STYLES.size * 3)\n  private lateinit var pointAnnotationManager: PointAnnotationManager\n  private lateinit var pointAnnotation: PointAnnotation\n  private lateinit var handler: Handler\n  private val runnable = Runnable {\n    if (mapboxMap.isValid()) {\n      mapboxMap.loadStyle(AnnotationUtils.STYLES[index++ % AnnotationUtils.STYLES.size]) {\n        runRunnable()\n      }\n    }\n  }\n\n  @Test\n  fun testUpdateAnnotation() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        handler = Handler(it.mainLooper)\n        // Move the position of annotation and update it.\n        pointAnnotation.geometry = Point.fromLngLat(pointAnnotation.geometry.longitude() + 0.1, pointAnnotation.geometry.latitude())\n        pointAnnotationManager.update(pointAnnotation)\n        // Change to the next style\n        handler.post(runnable)\n      }\n    }\n    if (!latch.await(30000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    handler.removeCallbacksAndMessages(null)\n  }\n\n  override fun loadMap() {\n    super.loadMap()\n    val latch = CountDownLatch(1)\n    handler = Handler(Looper.getMainLooper())\n    handler.post {\n      pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textFont = listOf(\"Open Sans Regular\")\n\n      pointAnnotation = pointAnnotationManager.create(\n        PointAnnotationOptions()\n          .withIconColor(ColorUtils.colorToRgbaString(Color.RED))\n          .withIconImage(\"car-15\")\n          .withDraggable(true)\n          .withIconAnchor(IconAnchor.CENTER)\n          .withIconHaloBlur(1.0)\n          .withIconHaloColor(ColorUtils.colorToRgbaString(Color.YELLOW))\n          .withIconHaloWidth(2.0)\n          .withIconOffset(listOf(1.0, 2.0))\n          .withIconOpacity(0.8)\n          .withIconRotate(0.5)\n          .withIconSize(5.0)\n          .withIconHaloColor(ColorUtils.colorToRgbaString(Color.WHITE))\n          .withSymbolSortKey(1.0)\n          .withTextAnchor(TextAnchor.TOP)\n          .withTextColor(ColorUtils.colorToRgbaString(Color.YELLOW))\n          .withTextField(\"Car\")\n          .withTextHaloBlur(1.0)\n          .withTextHaloWidth(5.0)\n          .withTextJustify(TextJustify.CENTER)\n          .withTextLetterSpacing(2.0)\n          .withTextRotate(5.0)\n          .withTextTransform(TextTransform.UPPERCASE)\n          .withTextSize(15.0)\n          .withTextRadialOffset(1.0)\n          .withTextOffset(listOf(1.0, 2.0))\n          .withTextMaxWidth(10.0)\n          .withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      for (i in 0..100) {\n        // Verify there is no ConcurrentModificationException https://github.com/mapbox/mapbox-maps-android/issues/383\n        pointAnnotation.textOpacity = 0.8\n        Thread.sleep(0, 2000)\n      }\n      latch.countDown()\n    }\n    if (!latch.await(3000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    Assert.assertEquals(pointAnnotation, pointAnnotationManager.annotations[0])\n  }\n\n  private fun runRunnable() {\n    latch.countDown()\n    handler.postDelayed(runnable, updateDelay)\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/annotation/UpdateAnnotationWithMultiManagersTest.kt",
    "content": "package com.mapbox.maps.testapp.annotation\n\nimport android.graphics.Color\nimport android.os.Handler\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.google.gson.JsonPrimitive\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.*\nimport com.mapbox.maps.testapp.BaseMapTest\nimport junit.framework.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Instrumented test for verifying annotation updating while changing style\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass UpdateAnnotationWithMultiManagersTest : BaseMapTest() {\n  private val latch = CountDownLatch(4)\n  private lateinit var pointAnnotationManager: PointAnnotationManager\n  private lateinit var circleAnnotationManager: CircleAnnotationManager\n  private lateinit var polygonAnnotationManager: PolygonAnnotationManager\n  private lateinit var polylineAnnotationManager: PolylineAnnotationManager\n  private lateinit var pointAnnotation: PointAnnotation\n  private lateinit var circleAnnotation: CircleAnnotation\n  private lateinit var polylineAnnotation: PolylineAnnotation\n  private lateinit var polygonAnnotation: PolygonAnnotation\n  private lateinit var handler: Handler\n  private val updateTimes = 100\n  private val updateSteps = 0.1\n  private val delta = 0.0001\n  private val points = mutableListOf(\n    mutableListOf(\n      Point.fromLngLat(-3.363937, -10.733102),\n      Point.fromLngLat(1.754703, -19.716317),\n      Point.fromLngLat(-15.747196, -21.085074),\n      Point.fromLngLat(-3.363937, -10.733102)\n    )\n  )\n  private val polylinePoints = mutableListOf(\n    Point.fromLngLat(-4.375974, -2.178992),\n    Point.fromLngLat(-7.639772, -4.107888),\n    Point.fromLngLat(-11.439207, 2.798737),\n  )\n\n  @Test\n  fun testUpdateAnnotation() {\n    rule.scenario.onActivity {\n      handler = Handler(it.mainLooper)\n      it.runOnUiThread {\n        mapboxMap.loadStyle(Style.MAPBOX_STREETS) {\n          pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n          pointAnnotationManager.textFont = listOf(\"Open Sans Regular\")\n          pointAnnotation = pointAnnotationManager.create(\n            PointAnnotationOptions()\n              .withIconColor(ColorUtils.colorToRgbaString(Color.RED))\n              .withIconImage(\"car-15\")\n              .withPoint(Point.fromLngLat(0.0, 0.0))\n          )\n          circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n          circleAnnotation = circleAnnotationManager.create(\n            CircleAnnotationOptions()\n              .withCircleColor(Color.RED)\n              .withCircleRadius(5.0)\n              .withPoint(Point.fromLngLat(0.0, 0.0))\n          )\n\n          polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n          polygonAnnotation = polygonAnnotationManager.create(\n            PolygonAnnotationOptions()\n              .withPoints(points)\n              .withData(JsonPrimitive(\"Foobar\"))\n              .withFillColor(Color.RED)\n          )\n\n          polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n          polylineAnnotation = polylineAnnotationManager.create(\n            PolylineAnnotationOptions()\n              .withPoints(polylinePoints)\n              .withLineColor(Color.RED)\n              .withLineWidth(5.0)\n          )\n\n          Thread {\n            for (i in 1..updateTimes) {\n              handler.post {\n                pointAnnotation.point = Point.fromLngLat(\n                  pointAnnotation.point.longitude() + updateSteps,\n                  pointAnnotation.point.latitude() + updateSteps\n                )\n                pointAnnotationManager.update(pointAnnotation)\n              }\n              Thread.sleep(10)\n            }\n            latch.countDown()\n          }.start()\n\n          Thread {\n            for (i in 1..updateTimes) {\n              handler.post {\n                circleAnnotation.point = Point.fromLngLat(\n                  circleAnnotation.point.longitude() + updateSteps,\n                  circleAnnotation.point.latitude() + updateSteps\n                )\n                circleAnnotationManager.update(circleAnnotation)\n              }\n              Thread.sleep(10)\n            }\n            latch.countDown()\n          }.start()\n\n          Thread {\n            for (i in 1..updateTimes) {\n              handler.post {\n                points[0][0] = Point.fromLngLat(\n                  points[0][0].longitude() + updateSteps,\n                  points[0][0].latitude() + updateSteps\n                )\n                polygonAnnotation.points = points\n                polygonAnnotationManager.update(polygonAnnotation)\n              }\n              Thread.sleep(10)\n            }\n            latch.countDown()\n          }.start()\n          Thread {\n            for (i in 1..updateTimes) {\n              handler.post {\n                polylinePoints[0] = Point.fromLngLat(\n                  polylinePoints[0].longitude() + updateSteps,\n                  polylinePoints[0].latitude() + updateSteps\n                )\n                polylineAnnotation.points = polylinePoints\n                polylineAnnotationManager.update(polylineAnnotation)\n              }\n              Thread.sleep(10)\n            }\n            latch.countDown()\n          }.start()\n        }\n      }\n    }\n    if (!latch.await(3000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    assertEquals(pointAnnotation.point.latitude(), updateSteps * updateTimes, delta)\n    assertEquals(pointAnnotation.point.longitude(), updateSteps * updateTimes, delta)\n    assertEquals(circleAnnotation.point.longitude(), updateSteps * updateTimes, delta)\n    assertEquals(circleAnnotation.point.latitude(), updateSteps * updateTimes, delta)\n    assertEquals(polylineAnnotation.points[0].longitude(), polylinePoints[0].longitude(), delta)\n    assertEquals(polylineAnnotation.points[0].latitude(), polylinePoints[0].latitude(), delta)\n    assertEquals(polygonAnnotation.points[0][0].longitude(), points[0][0].longitude(), delta)\n    assertEquals(polygonAnnotation.points[0][0].latitude(), points[0][0].latitude(), delta)\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/annotation/generated/CircleAnnotationManagerAndroidTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.annotation.generated\n\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.R\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createCircleAnnotationManager\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.*\n\n/**\n * Basic smoke tests for CircleAnnotationManager\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass CircleAnnotationManagerAndroidTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_attribution)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testCircleElevationReference() {\n    rule.runOnUiThread {\n      val expectedValue = CircleElevationReference.NONE\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleElevationReference = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleElevationReference)\n      circleAnnotationManager.circleElevationReference = null\n      val expectedDefaultValue = CircleElevationReference.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-elevation-reference\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, circleAnnotationManager.circleElevationReference)\n    }\n  }\n\n  @Test\n  fun testCircleSortKey() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleSortKey = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleSortKey)\n      circleAnnotationManager.circleSortKey = null\n      assertEquals(null, circleAnnotationManager.circleSortKey)\n    }\n  }\n\n  @Test\n  fun testCircleBlur() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleBlur = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleBlur)\n      circleAnnotationManager.circleBlur = null\n      assertEquals(null, circleAnnotationManager.circleBlur)\n    }\n  }\n\n  @Test\n  fun testCircleColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleColorString = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleColorString)\n      circleAnnotationManager.circleColorString = null\n      assertEquals(\n        null,\n        circleAnnotationManager.circleColorString\n      )\n    }\n  }\n\n  @Test\n  fun testCircleEmissiveStrength() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleEmissiveStrength = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleEmissiveStrength)\n      circleAnnotationManager.circleEmissiveStrength = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-emissive-strength\").silentUnwrap(), circleAnnotationManager.circleEmissiveStrength)\n    }\n  }\n\n  @Test\n  fun testCircleOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleOpacity = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleOpacity)\n      circleAnnotationManager.circleOpacity = null\n      assertEquals(null, circleAnnotationManager.circleOpacity)\n    }\n  }\n\n  @Test\n  fun testCirclePitchAlignment() {\n    rule.runOnUiThread {\n      val expectedValue = CirclePitchAlignment.MAP\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circlePitchAlignment = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circlePitchAlignment)\n      circleAnnotationManager.circlePitchAlignment = null\n      val expectedDefaultValue = CirclePitchAlignment.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-alignment\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, circleAnnotationManager.circlePitchAlignment)\n    }\n  }\n\n  @Test\n  fun testCirclePitchScale() {\n    rule.runOnUiThread {\n      val expectedValue = CirclePitchScale.MAP\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circlePitchScale = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circlePitchScale)\n      circleAnnotationManager.circlePitchScale = null\n      val expectedDefaultValue = CirclePitchScale.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-scale\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, circleAnnotationManager.circlePitchScale)\n    }\n  }\n\n  @Test\n  fun testCircleRadius() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleRadius = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleRadius)\n      circleAnnotationManager.circleRadius = null\n      assertEquals(null, circleAnnotationManager.circleRadius)\n    }\n  }\n\n  @Test\n  fun testCircleStrokeColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleStrokeColorString = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleStrokeColorString)\n      circleAnnotationManager.circleStrokeColorString = null\n      assertEquals(\n        null,\n        circleAnnotationManager.circleStrokeColorString\n      )\n    }\n  }\n\n  @Test\n  fun testCircleStrokeOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleStrokeOpacity = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleStrokeOpacity)\n      circleAnnotationManager.circleStrokeOpacity = null\n      assertEquals(null, circleAnnotationManager.circleStrokeOpacity)\n    }\n  }\n\n  @Test\n  fun testCircleStrokeWidth() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleStrokeWidth = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleStrokeWidth)\n      circleAnnotationManager.circleStrokeWidth = null\n      assertEquals(null, circleAnnotationManager.circleStrokeWidth)\n    }\n  }\n\n  @Test\n  fun testCircleTranslate() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.0, 1.0)\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleTranslate = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleTranslate)\n      circleAnnotationManager.circleTranslate = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate\").silentUnwrap(), circleAnnotationManager.circleTranslate)\n    }\n  }\n\n  @Test\n  fun testCircleTranslateAnchor() {\n    rule.runOnUiThread {\n      val expectedValue = CircleTranslateAnchor.MAP\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleTranslateAnchor = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleTranslateAnchor)\n      circleAnnotationManager.circleTranslateAnchor = null\n      val expectedDefaultValue = CircleTranslateAnchor.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate-anchor\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, circleAnnotationManager.circleTranslateAnchor)\n    }\n  }\n\n  @Test\n  fun testSlot() {\n    rule.runOnUiThread {\n      val expectedValue = \"abc\"\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.slot = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.slot)\n      circleAnnotationManager.slot = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"slot\").silentUnwrap(), circleAnnotationManager.slot)\n    }\n  }\n\n  @Test\n  fun testMaxZoom() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.maxZoom = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.maxZoom)\n      circleAnnotationManager.maxZoom = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"maxzoom\").silentUnwrap(), circleAnnotationManager.maxZoom)\n    }\n  }\n\n  @Test\n  fun testMinZoom() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.minZoom = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.minZoom)\n      circleAnnotationManager.minZoom = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"minzoom\").silentUnwrap(), circleAnnotationManager.minZoom)\n    }\n  }\n\n  @Test\n  fun testCircleColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleColorUseTheme = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleColorUseTheme)\n      circleAnnotationManager.circleColorUseTheme = null\n      assertEquals(null, circleAnnotationManager.circleColorUseTheme)\n    }\n  }\n\n  @Test\n  fun testCircleStrokeColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      circleAnnotationManager.circleStrokeColorUseTheme = expectedValue\n      assertEquals(expectedValue, circleAnnotationManager.circleStrokeColorUseTheme)\n      circleAnnotationManager.circleStrokeColorUseTheme = null\n      assertEquals(null, circleAnnotationManager.circleStrokeColorUseTheme)\n    }\n  }\n\n  @Test\n  fun create() {\n    rule.runOnUiThread {\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      val annotation = circleAnnotationManager.create(\n        CircleAnnotationOptions()\n          .withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      assertEquals(annotation, circleAnnotationManager.annotations[0])\n    }\n  }\n\n  @Test\n  fun createFromFeature() {\n    rule.runOnUiThread {\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      val featureCollection =\n        FeatureCollection.fromFeature(Feature.fromGeometry(Point.fromLngLat(0.0, 0.0)))\n      val annotations = circleAnnotationManager.create(featureCollection.toJson())\n      assertEquals(annotations.first(), circleAnnotationManager.annotations[0])\n      val annotations1 = circleAnnotationManager.create(featureCollection)\n      assertEquals(annotations1.first(), circleAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun createList() {\n    rule.runOnUiThread {\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      val list = listOf(\n        CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n        CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      val annotations = circleAnnotationManager.create(list)\n      assertEquals(annotations[0], circleAnnotationManager.annotations[0])\n      assertEquals(annotations[1], circleAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun update() {\n    rule.runOnUiThread {\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      val annotation = circleAnnotationManager.create(CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)))\n      assertEquals(annotation, circleAnnotationManager.annotations[0])\n      annotation.point = Point.fromLngLat(1.0, 1.0)\n      circleAnnotationManager.update(annotation)\n      assertEquals(annotation, circleAnnotationManager.annotations[0])\n    }\n  }\n\n  @Test\n  fun updateList() {\n    rule.runOnUiThread {\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      val list = listOf(\n        CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n        CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      val annotations = circleAnnotationManager.create(list)\n      assertEquals(annotations[0], circleAnnotationManager.annotations[0])\n      assertEquals(annotations[1], circleAnnotationManager.annotations[1])\n      annotations[0].point = Point.fromLngLat(1.0, 1.0)\n      annotations[1].point = Point.fromLngLat(1.0, 1.0)\n      circleAnnotationManager.update(annotations)\n      assertEquals(annotations[0], circleAnnotationManager.annotations[0])\n      assertEquals(annotations[1], circleAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun delete() {\n    rule.runOnUiThread {\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      val annotation = circleAnnotationManager.create(\n        CircleAnnotationOptions()\n          .withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      assertEquals(annotation, circleAnnotationManager.annotations[0])\n      circleAnnotationManager.delete(annotation)\n      assertTrue(circleAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  @Test\n  fun deleteList() {\n    rule.runOnUiThread {\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      val list = listOf(\n        CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n        CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      val annotations = circleAnnotationManager.create(list)\n      assertEquals(annotations[0], circleAnnotationManager.annotations[0])\n      assertEquals(annotations[1], circleAnnotationManager.annotations[1])\n\n      circleAnnotationManager.delete(annotations)\n      assertTrue(circleAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  @Test\n  fun deleteAll() {\n    rule.runOnUiThread {\n      val circleAnnotationManager = mapView.annotations.createCircleAnnotationManager()\n      val list = listOf(\n        CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n        CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      val annotations = circleAnnotationManager.create(list)\n      assertEquals(annotations[0], circleAnnotationManager.annotations[0])\n      assertEquals(annotations[1], circleAnnotationManager.annotations[1])\n\n      circleAnnotationManager.deleteAll()\n      assertTrue(circleAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  fun ActivityScenarioRule<*>.runOnUiThread(block: () -> Unit) {\n    this.scenario.onActivity {\n      it.runOnUiThread(block)\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/annotation/generated/PointAnnotationManagerAndroidTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.annotation.generated\n\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.R\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.*\n\n/**\n * Basic smoke tests for PointAnnotationManager\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass PointAnnotationManagerAndroidTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_attribution)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testIconAllowOverlap() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconAllowOverlap = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconAllowOverlap)\n      pointAnnotationManager.iconAllowOverlap = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-allow-overlap\").silentUnwrap(), pointAnnotationManager.iconAllowOverlap)\n    }\n  }\n\n  @Test\n  fun testIconAnchor() {\n    rule.runOnUiThread {\n      val expectedValue = IconAnchor.CENTER\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconAnchor = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconAnchor)\n      pointAnnotationManager.iconAnchor = null\n      assertEquals(null, pointAnnotationManager.iconAnchor)\n    }\n  }\n\n  @Test\n  fun testIconIgnorePlacement() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconIgnorePlacement = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconIgnorePlacement)\n      pointAnnotationManager.iconIgnorePlacement = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-ignore-placement\").silentUnwrap(), pointAnnotationManager.iconIgnorePlacement)\n    }\n  }\n\n  @Test\n  fun testIconImage() {\n    rule.runOnUiThread {\n      val expectedValue = \"abc\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconImage = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconImage)\n      pointAnnotationManager.iconImage = null\n      assertEquals(null, pointAnnotationManager.iconImage)\n    }\n  }\n\n  @Test\n  fun testIconKeepUpright() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconKeepUpright = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconKeepUpright)\n      pointAnnotationManager.iconKeepUpright = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-keep-upright\").silentUnwrap(), pointAnnotationManager.iconKeepUpright)\n    }\n  }\n\n  @Test\n  fun testIconOffset() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.0, 1.0)\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconOffset = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconOffset)\n      pointAnnotationManager.iconOffset = null\n      assertEquals(null, pointAnnotationManager.iconOffset)\n    }\n  }\n\n  @Test\n  fun testIconOptional() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconOptional = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconOptional)\n      pointAnnotationManager.iconOptional = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-optional\").silentUnwrap(), pointAnnotationManager.iconOptional)\n    }\n  }\n\n  @Test\n  fun testIconPadding() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconPadding = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconPadding)\n      pointAnnotationManager.iconPadding = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-padding\").silentUnwrap(), pointAnnotationManager.iconPadding)\n    }\n  }\n\n  @Test\n  fun testIconPitchAlignment() {\n    rule.runOnUiThread {\n      val expectedValue = IconPitchAlignment.MAP\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconPitchAlignment = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconPitchAlignment)\n      pointAnnotationManager.iconPitchAlignment = null\n      val expectedDefaultValue = IconPitchAlignment.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-pitch-alignment\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.iconPitchAlignment)\n    }\n  }\n\n  @Test\n  fun testIconRotate() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconRotate = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconRotate)\n      pointAnnotationManager.iconRotate = null\n      assertEquals(null, pointAnnotationManager.iconRotate)\n    }\n  }\n\n  @Test\n  fun testIconRotationAlignment() {\n    rule.runOnUiThread {\n      val expectedValue = IconRotationAlignment.MAP\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconRotationAlignment = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconRotationAlignment)\n      pointAnnotationManager.iconRotationAlignment = null\n      val expectedDefaultValue = IconRotationAlignment.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotation-alignment\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.iconRotationAlignment)\n    }\n  }\n\n  @Test\n  fun testIconSize() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconSize = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconSize)\n      pointAnnotationManager.iconSize = null\n      assertEquals(null, pointAnnotationManager.iconSize)\n    }\n  }\n\n  @Test\n  fun testIconSizeScaleRange() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(5.0, 5.0)\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconSizeScaleRange = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconSizeScaleRange)\n      pointAnnotationManager.iconSizeScaleRange = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size-scale-range\").silentUnwrap(), pointAnnotationManager.iconSizeScaleRange)\n    }\n  }\n\n  @Test\n  fun testIconTextFit() {\n    rule.runOnUiThread {\n      val expectedValue = IconTextFit.NONE\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconTextFit = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconTextFit)\n      pointAnnotationManager.iconTextFit = null\n      assertEquals(null, pointAnnotationManager.iconTextFit)\n    }\n  }\n\n  @Test\n  fun testIconTextFitPadding() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.0, 1.0, 2.0, 3.0)\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconTextFitPadding = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconTextFitPadding)\n      pointAnnotationManager.iconTextFitPadding = null\n      assertEquals(null, pointAnnotationManager.iconTextFitPadding)\n    }\n  }\n\n  @Test\n  fun testSymbolAvoidEdges() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.symbolAvoidEdges = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.symbolAvoidEdges)\n      pointAnnotationManager.symbolAvoidEdges = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-avoid-edges\").silentUnwrap(), pointAnnotationManager.symbolAvoidEdges)\n    }\n  }\n\n  @Test\n  fun testSymbolElevationReference() {\n    rule.runOnUiThread {\n      val expectedValue = SymbolElevationReference.SEA\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.symbolElevationReference = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.symbolElevationReference)\n      pointAnnotationManager.symbolElevationReference = null\n      val expectedDefaultValue = SymbolElevationReference.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-elevation-reference\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.symbolElevationReference)\n    }\n  }\n\n  @Test\n  fun testSymbolPlacement() {\n    rule.runOnUiThread {\n      val expectedValue = SymbolPlacement.POINT\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.symbolPlacement = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.symbolPlacement)\n      pointAnnotationManager.symbolPlacement = null\n      val expectedDefaultValue = SymbolPlacement.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-placement\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.symbolPlacement)\n    }\n  }\n\n  @Test\n  fun testSymbolSortKey() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.symbolSortKey = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.symbolSortKey)\n      pointAnnotationManager.symbolSortKey = null\n      assertEquals(null, pointAnnotationManager.symbolSortKey)\n    }\n  }\n\n  @Test\n  fun testSymbolSpacing() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.symbolSpacing = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.symbolSpacing)\n      pointAnnotationManager.symbolSpacing = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-spacing\").silentUnwrap(), pointAnnotationManager.symbolSpacing)\n    }\n  }\n\n  @Test\n  fun testSymbolZElevate() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.symbolZElevate = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.symbolZElevate)\n      pointAnnotationManager.symbolZElevate = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-elevate\").silentUnwrap(), pointAnnotationManager.symbolZElevate)\n    }\n  }\n\n  @Test\n  fun testSymbolZOrder() {\n    rule.runOnUiThread {\n      val expectedValue = SymbolZOrder.AUTO\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.symbolZOrder = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.symbolZOrder)\n      pointAnnotationManager.symbolZOrder = null\n      val expectedDefaultValue = SymbolZOrder.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-order\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.symbolZOrder)\n    }\n  }\n\n  @Test\n  fun testTextAllowOverlap() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textAllowOverlap = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textAllowOverlap)\n      pointAnnotationManager.textAllowOverlap = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-allow-overlap\").silentUnwrap(), pointAnnotationManager.textAllowOverlap)\n    }\n  }\n\n  @Test\n  fun testTextAnchor() {\n    rule.runOnUiThread {\n      val expectedValue = TextAnchor.CENTER\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textAnchor = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textAnchor)\n      pointAnnotationManager.textAnchor = null\n      assertEquals(null, pointAnnotationManager.textAnchor)\n    }\n  }\n\n  @Test\n  fun testTextField() {\n    rule.runOnUiThread {\n      val expectedValue = \"test text\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textField = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textField)\n      pointAnnotationManager.textField = null\n      assertEquals(null, pointAnnotationManager.textField)\n    }\n  }\n\n  @Test\n  fun testTextFont() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(\"a\", \"b\", \"c\")\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textFont = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textFont)\n      pointAnnotationManager.textFont = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-font\").silentUnwrap(), pointAnnotationManager.textFont)\n    }\n  }\n\n  @Test\n  fun testTextIgnorePlacement() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textIgnorePlacement = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textIgnorePlacement)\n      pointAnnotationManager.textIgnorePlacement = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-ignore-placement\").silentUnwrap(), pointAnnotationManager.textIgnorePlacement)\n    }\n  }\n\n  @Test\n  fun testTextJustify() {\n    rule.runOnUiThread {\n      val expectedValue = TextJustify.AUTO\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textJustify = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textJustify)\n      pointAnnotationManager.textJustify = null\n      assertEquals(null, pointAnnotationManager.textJustify)\n    }\n  }\n\n  @Test\n  fun testTextKeepUpright() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textKeepUpright = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textKeepUpright)\n      pointAnnotationManager.textKeepUpright = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-keep-upright\").silentUnwrap(), pointAnnotationManager.textKeepUpright)\n    }\n  }\n\n  @Test\n  fun testTextLetterSpacing() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textLetterSpacing = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textLetterSpacing)\n      pointAnnotationManager.textLetterSpacing = null\n      assertEquals(null, pointAnnotationManager.textLetterSpacing)\n    }\n  }\n\n  @Test\n  fun testTextLineHeight() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textLineHeight = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textLineHeight)\n      pointAnnotationManager.textLineHeight = null\n      assertEquals(null, pointAnnotationManager.textLineHeight)\n    }\n  }\n\n  @Test\n  fun testTextMaxAngle() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textMaxAngle = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textMaxAngle)\n      pointAnnotationManager.textMaxAngle = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-angle\").silentUnwrap(), pointAnnotationManager.textMaxAngle)\n    }\n  }\n\n  @Test\n  fun testTextMaxWidth() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textMaxWidth = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textMaxWidth)\n      pointAnnotationManager.textMaxWidth = null\n      assertEquals(null, pointAnnotationManager.textMaxWidth)\n    }\n  }\n\n  @Test\n  fun testTextOffset() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.0, 1.0)\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textOffset = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textOffset)\n      pointAnnotationManager.textOffset = null\n      assertEquals(null, pointAnnotationManager.textOffset)\n    }\n  }\n\n  @Test\n  fun testTextOptional() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textOptional = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textOptional)\n      pointAnnotationManager.textOptional = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-optional\").silentUnwrap(), pointAnnotationManager.textOptional)\n    }\n  }\n\n  @Test\n  fun testTextPadding() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textPadding = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textPadding)\n      pointAnnotationManager.textPadding = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-padding\").silentUnwrap(), pointAnnotationManager.textPadding)\n    }\n  }\n\n  @Test\n  fun testTextPitchAlignment() {\n    rule.runOnUiThread {\n      val expectedValue = TextPitchAlignment.MAP\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textPitchAlignment = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textPitchAlignment)\n      pointAnnotationManager.textPitchAlignment = null\n      val expectedDefaultValue = TextPitchAlignment.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-pitch-alignment\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.textPitchAlignment)\n    }\n  }\n\n  @Test\n  fun testTextRadialOffset() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textRadialOffset = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textRadialOffset)\n      pointAnnotationManager.textRadialOffset = null\n      assertEquals(null, pointAnnotationManager.textRadialOffset)\n    }\n  }\n\n  @Test\n  fun testTextRotate() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textRotate = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textRotate)\n      pointAnnotationManager.textRotate = null\n      assertEquals(null, pointAnnotationManager.textRotate)\n    }\n  }\n\n  @Test\n  fun testTextRotationAlignment() {\n    rule.runOnUiThread {\n      val expectedValue = TextRotationAlignment.MAP\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textRotationAlignment = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textRotationAlignment)\n      pointAnnotationManager.textRotationAlignment = null\n      val expectedDefaultValue = TextRotationAlignment.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotation-alignment\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.textRotationAlignment)\n    }\n  }\n\n  @Test\n  fun testTextSize() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textSize = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textSize)\n      pointAnnotationManager.textSize = null\n      assertEquals(null, pointAnnotationManager.textSize)\n    }\n  }\n\n  @Test\n  fun testTextSizeScaleRange() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(5.0, 5.0)\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textSizeScaleRange = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textSizeScaleRange)\n      pointAnnotationManager.textSizeScaleRange = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size-scale-range\").silentUnwrap(), pointAnnotationManager.textSizeScaleRange)\n    }\n  }\n\n  @Test\n  fun testTextTransform() {\n    rule.runOnUiThread {\n      val expectedValue = TextTransform.NONE\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textTransform = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textTransform)\n      pointAnnotationManager.textTransform = null\n      assertEquals(null, pointAnnotationManager.textTransform)\n    }\n  }\n\n  @Test\n  fun testTextVariableAnchor() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(\"center\", \"left\")\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textVariableAnchor = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textVariableAnchor)\n      pointAnnotationManager.textVariableAnchor = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-variable-anchor\").silentUnwrap(), pointAnnotationManager.textVariableAnchor)\n    }\n  }\n\n  @Test\n  fun testTextWritingMode() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(\"horizontal\", \"vertical\")\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textWritingMode = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textWritingMode)\n      pointAnnotationManager.textWritingMode = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-writing-mode\").silentUnwrap(), pointAnnotationManager.textWritingMode)\n    }\n  }\n\n  @Test\n  fun testIconColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconColorString = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconColorString)\n      pointAnnotationManager.iconColorString = null\n      assertEquals(\n        null,\n        pointAnnotationManager.iconColorString\n      )\n    }\n  }\n\n  @Test\n  fun testIconColorBrightnessMax() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconColorBrightnessMax = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconColorBrightnessMax)\n      pointAnnotationManager.iconColorBrightnessMax = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-max\").silentUnwrap(), pointAnnotationManager.iconColorBrightnessMax)\n    }\n  }\n\n  @Test\n  fun testIconColorBrightnessMin() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconColorBrightnessMin = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconColorBrightnessMin)\n      pointAnnotationManager.iconColorBrightnessMin = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-min\").silentUnwrap(), pointAnnotationManager.iconColorBrightnessMin)\n    }\n  }\n\n  @Test\n  fun testIconColorContrast() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconColorContrast = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconColorContrast)\n      pointAnnotationManager.iconColorContrast = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-contrast\").silentUnwrap(), pointAnnotationManager.iconColorContrast)\n    }\n  }\n\n  @Test\n  fun testIconColorSaturation() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconColorSaturation = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconColorSaturation)\n      pointAnnotationManager.iconColorSaturation = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-saturation\").silentUnwrap(), pointAnnotationManager.iconColorSaturation)\n    }\n  }\n\n  @Test\n  fun testIconEmissiveStrength() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconEmissiveStrength = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconEmissiveStrength)\n      pointAnnotationManager.iconEmissiveStrength = null\n      assertEquals(null, pointAnnotationManager.iconEmissiveStrength)\n    }\n  }\n\n  @Test\n  fun testIconHaloBlur() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconHaloBlur = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconHaloBlur)\n      pointAnnotationManager.iconHaloBlur = null\n      assertEquals(null, pointAnnotationManager.iconHaloBlur)\n    }\n  }\n\n  @Test\n  fun testIconHaloColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconHaloColorString = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconHaloColorString)\n      pointAnnotationManager.iconHaloColorString = null\n      assertEquals(\n        null,\n        pointAnnotationManager.iconHaloColorString\n      )\n    }\n  }\n\n  @Test\n  fun testIconHaloWidth() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconHaloWidth = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconHaloWidth)\n      pointAnnotationManager.iconHaloWidth = null\n      assertEquals(null, pointAnnotationManager.iconHaloWidth)\n    }\n  }\n\n  @Test\n  fun testIconImageCrossFade() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconImageCrossFade = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconImageCrossFade)\n      pointAnnotationManager.iconImageCrossFade = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image-cross-fade\").silentUnwrap(), pointAnnotationManager.iconImageCrossFade)\n    }\n  }\n\n  @Test\n  fun testIconOcclusionOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconOcclusionOpacity = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconOcclusionOpacity)\n      pointAnnotationManager.iconOcclusionOpacity = null\n      assertEquals(null, pointAnnotationManager.iconOcclusionOpacity)\n    }\n  }\n\n  @Test\n  fun testIconOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconOpacity = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconOpacity)\n      pointAnnotationManager.iconOpacity = null\n      assertEquals(null, pointAnnotationManager.iconOpacity)\n    }\n  }\n\n  @Test\n  fun testIconTranslate() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.0, 1.0)\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconTranslate = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconTranslate)\n      pointAnnotationManager.iconTranslate = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate\").silentUnwrap(), pointAnnotationManager.iconTranslate)\n    }\n  }\n\n  @Test\n  fun testIconTranslateAnchor() {\n    rule.runOnUiThread {\n      val expectedValue = IconTranslateAnchor.MAP\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconTranslateAnchor = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconTranslateAnchor)\n      pointAnnotationManager.iconTranslateAnchor = null\n      val expectedDefaultValue = IconTranslateAnchor.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate-anchor\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.iconTranslateAnchor)\n    }\n  }\n\n  @Test\n  fun testOcclusionOpacityMode() {\n    rule.runOnUiThread {\n      val expectedValue = OcclusionOpacityMode.ANCHOR\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.occlusionOpacityMode = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.occlusionOpacityMode)\n      pointAnnotationManager.occlusionOpacityMode = null\n      val expectedDefaultValue = OcclusionOpacityMode.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"occlusion-opacity-mode\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.occlusionOpacityMode)\n    }\n  }\n\n  @Test\n  fun testSymbolZOffset() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.symbolZOffset = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.symbolZOffset)\n      pointAnnotationManager.symbolZOffset = null\n      assertEquals(null, pointAnnotationManager.symbolZOffset)\n    }\n  }\n\n  @Test\n  fun testTextColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textColorString = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textColorString)\n      pointAnnotationManager.textColorString = null\n      assertEquals(\n        null,\n        pointAnnotationManager.textColorString\n      )\n    }\n  }\n\n  @Test\n  fun testTextEmissiveStrength() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textEmissiveStrength = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textEmissiveStrength)\n      pointAnnotationManager.textEmissiveStrength = null\n      assertEquals(null, pointAnnotationManager.textEmissiveStrength)\n    }\n  }\n\n  @Test\n  fun testTextHaloBlur() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textHaloBlur = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textHaloBlur)\n      pointAnnotationManager.textHaloBlur = null\n      assertEquals(null, pointAnnotationManager.textHaloBlur)\n    }\n  }\n\n  @Test\n  fun testTextHaloColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textHaloColorString = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textHaloColorString)\n      pointAnnotationManager.textHaloColorString = null\n      assertEquals(\n        null,\n        pointAnnotationManager.textHaloColorString\n      )\n    }\n  }\n\n  @Test\n  fun testTextHaloWidth() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textHaloWidth = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textHaloWidth)\n      pointAnnotationManager.textHaloWidth = null\n      assertEquals(null, pointAnnotationManager.textHaloWidth)\n    }\n  }\n\n  @Test\n  fun testTextOcclusionOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textOcclusionOpacity = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textOcclusionOpacity)\n      pointAnnotationManager.textOcclusionOpacity = null\n      assertEquals(null, pointAnnotationManager.textOcclusionOpacity)\n    }\n  }\n\n  @Test\n  fun testTextOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textOpacity = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textOpacity)\n      pointAnnotationManager.textOpacity = null\n      assertEquals(null, pointAnnotationManager.textOpacity)\n    }\n  }\n\n  @Test\n  fun testTextTranslate() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.0, 1.0)\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textTranslate = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textTranslate)\n      pointAnnotationManager.textTranslate = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate\").silentUnwrap(), pointAnnotationManager.textTranslate)\n    }\n  }\n\n  @Test\n  fun testTextTranslateAnchor() {\n    rule.runOnUiThread {\n      val expectedValue = TextTranslateAnchor.MAP\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textTranslateAnchor = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textTranslateAnchor)\n      pointAnnotationManager.textTranslateAnchor = null\n      val expectedDefaultValue = TextTranslateAnchor.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate-anchor\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, pointAnnotationManager.textTranslateAnchor)\n    }\n  }\n\n  @Test\n  fun testSlot() {\n    rule.runOnUiThread {\n      val expectedValue = \"abc\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.slot = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.slot)\n      pointAnnotationManager.slot = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"slot\").silentUnwrap(), pointAnnotationManager.slot)\n    }\n  }\n\n  @Test\n  fun testMaxZoom() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.maxZoom = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.maxZoom)\n      pointAnnotationManager.maxZoom = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"maxzoom\").silentUnwrap(), pointAnnotationManager.maxZoom)\n    }\n  }\n\n  @Test\n  fun testMinZoom() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.minZoom = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.minZoom)\n      pointAnnotationManager.minZoom = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"minzoom\").silentUnwrap(), pointAnnotationManager.minZoom)\n    }\n  }\n\n  @Test\n  fun testIconColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconColorUseTheme = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconColorUseTheme)\n      pointAnnotationManager.iconColorUseTheme = null\n      assertEquals(null, pointAnnotationManager.iconColorUseTheme)\n    }\n  }\n\n  @Test\n  fun testIconHaloColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.iconHaloColorUseTheme = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.iconHaloColorUseTheme)\n      pointAnnotationManager.iconHaloColorUseTheme = null\n      assertEquals(null, pointAnnotationManager.iconHaloColorUseTheme)\n    }\n  }\n\n  @Test\n  fun testTextColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textColorUseTheme = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textColorUseTheme)\n      pointAnnotationManager.textColorUseTheme = null\n      assertEquals(null, pointAnnotationManager.textColorUseTheme)\n    }\n  }\n\n  @Test\n  fun testTextHaloColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      pointAnnotationManager.textHaloColorUseTheme = expectedValue\n      assertEquals(expectedValue, pointAnnotationManager.textHaloColorUseTheme)\n      pointAnnotationManager.textHaloColorUseTheme = null\n      assertEquals(null, pointAnnotationManager.textHaloColorUseTheme)\n    }\n  }\n\n  @Test\n  fun create() {\n    rule.runOnUiThread {\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      val annotation = pointAnnotationManager.create(\n        PointAnnotationOptions()\n          .withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      assertEquals(annotation, pointAnnotationManager.annotations[0])\n    }\n  }\n\n  @Test\n  fun createFromFeature() {\n    rule.runOnUiThread {\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      val featureCollection =\n        FeatureCollection.fromFeature(Feature.fromGeometry(Point.fromLngLat(0.0, 0.0)))\n      val annotations = pointAnnotationManager.create(featureCollection.toJson())\n      assertEquals(annotations.first(), pointAnnotationManager.annotations[0])\n      val annotations1 = pointAnnotationManager.create(featureCollection)\n      assertEquals(annotations1.first(), pointAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun createList() {\n    rule.runOnUiThread {\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      val list = listOf(\n        PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n        PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      val annotations = pointAnnotationManager.create(list)\n      assertEquals(annotations[0], pointAnnotationManager.annotations[0])\n      assertEquals(annotations[1], pointAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun update() {\n    rule.runOnUiThread {\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      val annotation = pointAnnotationManager.create(PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)))\n      assertEquals(annotation, pointAnnotationManager.annotations[0])\n      annotation.point = Point.fromLngLat(1.0, 1.0)\n      annotation.iconAnchor = IconAnchor.CENTER\n      annotation.iconTextFit = IconTextFit.NONE\n      annotation.textAnchor = TextAnchor.CENTER\n      annotation.textJustify = TextJustify.AUTO\n      annotation.textTransform = TextTransform.NONE\n      pointAnnotationManager.update(annotation)\n      assertEquals(annotation, pointAnnotationManager.annotations[0])\n      assertEquals(IconAnchor.CENTER, annotation.iconAnchor)\n      assertEquals(IconTextFit.NONE, annotation.iconTextFit)\n      assertEquals(TextAnchor.CENTER, annotation.textAnchor)\n      assertEquals(TextJustify.AUTO, annotation.textJustify)\n      assertEquals(TextTransform.NONE, annotation.textTransform)\n    }\n  }\n\n  @Test\n  fun updateList() {\n    rule.runOnUiThread {\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      val list = listOf(\n        PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n        PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      val annotations = pointAnnotationManager.create(list)\n      assertEquals(annotations[0], pointAnnotationManager.annotations[0])\n      assertEquals(annotations[1], pointAnnotationManager.annotations[1])\n      annotations[0].point = Point.fromLngLat(1.0, 1.0)\n      annotations[1].point = Point.fromLngLat(1.0, 1.0)\n      pointAnnotationManager.update(annotations)\n      assertEquals(annotations[0], pointAnnotationManager.annotations[0])\n      assertEquals(annotations[1], pointAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun delete() {\n    rule.runOnUiThread {\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      val annotation = pointAnnotationManager.create(\n        PointAnnotationOptions()\n          .withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      assertEquals(annotation, pointAnnotationManager.annotations[0])\n      pointAnnotationManager.delete(annotation)\n      assertTrue(pointAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  @Test\n  fun deleteList() {\n    rule.runOnUiThread {\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      val list = listOf(\n        PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n        PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      val annotations = pointAnnotationManager.create(list)\n      assertEquals(annotations[0], pointAnnotationManager.annotations[0])\n      assertEquals(annotations[1], pointAnnotationManager.annotations[1])\n\n      pointAnnotationManager.delete(annotations)\n      assertTrue(pointAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  @Test\n  fun deleteAll() {\n    rule.runOnUiThread {\n      val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()\n      val list = listOf(\n        PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n        PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      val annotations = pointAnnotationManager.create(list)\n      assertEquals(annotations[0], pointAnnotationManager.annotations[0])\n      assertEquals(annotations[1], pointAnnotationManager.annotations[1])\n\n      pointAnnotationManager.deleteAll()\n      assertTrue(pointAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  fun ActivityScenarioRule<*>.runOnUiThread(block: () -> Unit) {\n    this.scenario.onActivity {\n      it.runOnUiThread(block)\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/annotation/generated/PolygonAnnotationManagerAndroidTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.annotation.generated\n\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.R\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPolygonAnnotationManager\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.*\n\n/**\n * Basic smoke tests for PolygonAnnotationManager\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass PolygonAnnotationManagerAndroidTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_attribution)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testFillConstructBridgeGuardRail() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillConstructBridgeGuardRail = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillConstructBridgeGuardRail)\n      polygonAnnotationManager.fillConstructBridgeGuardRail = null\n      assertEquals(null, polygonAnnotationManager.fillConstructBridgeGuardRail)\n    }\n  }\n\n  @Test\n  fun testFillElevationReference() {\n    rule.runOnUiThread {\n      val expectedValue = FillElevationReference.NONE\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillElevationReference = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillElevationReference)\n      polygonAnnotationManager.fillElevationReference = null\n      val expectedDefaultValue = FillElevationReference.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-elevation-reference\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, polygonAnnotationManager.fillElevationReference)\n    }\n  }\n\n  @Test\n  fun testFillSortKey() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillSortKey = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillSortKey)\n      polygonAnnotationManager.fillSortKey = null\n      assertEquals(null, polygonAnnotationManager.fillSortKey)\n    }\n  }\n\n  @Test\n  fun testFillAntialias() {\n    rule.runOnUiThread {\n      val expectedValue = true\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillAntialias = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillAntialias)\n      polygonAnnotationManager.fillAntialias = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-antialias\").silentUnwrap(), polygonAnnotationManager.fillAntialias)\n    }\n  }\n\n  @Test\n  fun testFillBridgeGuardRailColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillBridgeGuardRailColorString = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillBridgeGuardRailColorString)\n      polygonAnnotationManager.fillBridgeGuardRailColorString = null\n      assertEquals(\n        null,\n        polygonAnnotationManager.fillBridgeGuardRailColorString\n      )\n    }\n  }\n\n  @Test\n  fun testFillColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillColorString = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillColorString)\n      polygonAnnotationManager.fillColorString = null\n      assertEquals(\n        null,\n        polygonAnnotationManager.fillColorString\n      )\n    }\n  }\n\n  @Test\n  fun testFillEmissiveStrength() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillEmissiveStrength = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillEmissiveStrength)\n      polygonAnnotationManager.fillEmissiveStrength = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-emissive-strength\").silentUnwrap(), polygonAnnotationManager.fillEmissiveStrength)\n    }\n  }\n\n  @Test\n  fun testFillOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillOpacity = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillOpacity)\n      polygonAnnotationManager.fillOpacity = null\n      assertEquals(null, polygonAnnotationManager.fillOpacity)\n    }\n  }\n\n  @Test\n  fun testFillOutlineColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillOutlineColorString = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillOutlineColorString)\n      polygonAnnotationManager.fillOutlineColorString = null\n      assertEquals(\n        null,\n        polygonAnnotationManager.fillOutlineColorString\n      )\n    }\n  }\n\n  @Test\n  fun testFillPattern() {\n    rule.runOnUiThread {\n      val expectedValue = \"abc\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillPattern = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillPattern)\n      polygonAnnotationManager.fillPattern = null\n      assertEquals(null, polygonAnnotationManager.fillPattern)\n    }\n  }\n\n  @Test\n  fun testFillPatternCrossFade() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillPatternCrossFade = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillPatternCrossFade)\n      polygonAnnotationManager.fillPatternCrossFade = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern-cross-fade\").silentUnwrap(), polygonAnnotationManager.fillPatternCrossFade)\n    }\n  }\n\n  @Test\n  fun testFillTranslate() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.0, 1.0)\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillTranslate = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillTranslate)\n      polygonAnnotationManager.fillTranslate = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate\").silentUnwrap(), polygonAnnotationManager.fillTranslate)\n    }\n  }\n\n  @Test\n  fun testFillTranslateAnchor() {\n    rule.runOnUiThread {\n      val expectedValue = FillTranslateAnchor.MAP\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillTranslateAnchor = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillTranslateAnchor)\n      polygonAnnotationManager.fillTranslateAnchor = null\n      val expectedDefaultValue = FillTranslateAnchor.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate-anchor\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, polygonAnnotationManager.fillTranslateAnchor)\n    }\n  }\n\n  @Test\n  fun testFillTunnelStructureColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillTunnelStructureColorString = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillTunnelStructureColorString)\n      polygonAnnotationManager.fillTunnelStructureColorString = null\n      assertEquals(\n        null,\n        polygonAnnotationManager.fillTunnelStructureColorString\n      )\n    }\n  }\n\n  @Test\n  fun testFillZOffset() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillZOffset = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillZOffset)\n      polygonAnnotationManager.fillZOffset = null\n      assertEquals(null, polygonAnnotationManager.fillZOffset)\n    }\n  }\n\n  @Test\n  fun testSlot() {\n    rule.runOnUiThread {\n      val expectedValue = \"abc\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.slot = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.slot)\n      polygonAnnotationManager.slot = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"slot\").silentUnwrap(), polygonAnnotationManager.slot)\n    }\n  }\n\n  @Test\n  fun testMaxZoom() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.maxZoom = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.maxZoom)\n      polygonAnnotationManager.maxZoom = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"maxzoom\").silentUnwrap(), polygonAnnotationManager.maxZoom)\n    }\n  }\n\n  @Test\n  fun testMinZoom() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.minZoom = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.minZoom)\n      polygonAnnotationManager.minZoom = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"minzoom\").silentUnwrap(), polygonAnnotationManager.minZoom)\n    }\n  }\n\n  @Test\n  fun testFillBridgeGuardRailColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillBridgeGuardRailColorUseTheme = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillBridgeGuardRailColorUseTheme)\n      polygonAnnotationManager.fillBridgeGuardRailColorUseTheme = null\n      assertEquals(null, polygonAnnotationManager.fillBridgeGuardRailColorUseTheme)\n    }\n  }\n\n  @Test\n  fun testFillColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillColorUseTheme = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillColorUseTheme)\n      polygonAnnotationManager.fillColorUseTheme = null\n      assertEquals(null, polygonAnnotationManager.fillColorUseTheme)\n    }\n  }\n\n  @Test\n  fun testFillOutlineColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillOutlineColorUseTheme = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillOutlineColorUseTheme)\n      polygonAnnotationManager.fillOutlineColorUseTheme = null\n      assertEquals(null, polygonAnnotationManager.fillOutlineColorUseTheme)\n    }\n  }\n\n  @Test\n  fun testFillTunnelStructureColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      polygonAnnotationManager.fillTunnelStructureColorUseTheme = expectedValue\n      assertEquals(expectedValue, polygonAnnotationManager.fillTunnelStructureColorUseTheme)\n      polygonAnnotationManager.fillTunnelStructureColorUseTheme = null\n      assertEquals(null, polygonAnnotationManager.fillTunnelStructureColorUseTheme)\n    }\n  }\n\n  @Test\n  fun create() {\n    rule.runOnUiThread {\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      val annotation = polygonAnnotationManager.create(\n        PolygonAnnotationOptions()\n          .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(0.0, 1.0), Point.fromLngLat(1.0, 0.0))))\n      )\n      assertEquals(annotation, polygonAnnotationManager.annotations[0])\n    }\n  }\n\n  @Test\n  fun createFromFeature() {\n    rule.runOnUiThread {\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      val featureCollection =\n        FeatureCollection.fromFeature(Feature.fromGeometry(Polygon.fromLngLats(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(0.0, 1.0), Point.fromLngLat(1.0, 0.0))))))\n      val annotations = polygonAnnotationManager.create(featureCollection.toJson())\n      assertEquals(annotations.first(), polygonAnnotationManager.annotations[0])\n      val annotations1 = polygonAnnotationManager.create(featureCollection)\n      assertEquals(annotations1.first(), polygonAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun createList() {\n    rule.runOnUiThread {\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      val list = listOf(\n        PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(1.0, 0.0), Point.fromLngLat(0.0, 1.0)))),\n        PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(0.0, 1.0), Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      )\n      val annotations = polygonAnnotationManager.create(list)\n      assertEquals(annotations[0], polygonAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polygonAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun update() {\n    rule.runOnUiThread {\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      val annotation = polygonAnnotationManager.create(PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(0.0, 1.0), Point.fromLngLat(1.0, 0.0)))))\n      assertEquals(annotation, polygonAnnotationManager.annotations[0])\n      annotation.points = listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(0.0, 1.0), Point.fromLngLat(1.0, 0.0)))\n      polygonAnnotationManager.update(annotation)\n      assertEquals(annotation, polygonAnnotationManager.annotations[0])\n    }\n  }\n\n  @Test\n  fun updateList() {\n    rule.runOnUiThread {\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      val list = listOf(\n        PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(1.0, 0.0), Point.fromLngLat(0.0, 1.0)))),\n        PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(0.0, 1.0), Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      )\n      val annotations = polygonAnnotationManager.create(list)\n      assertEquals(annotations[0], polygonAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polygonAnnotationManager.annotations[1])\n      annotations[0].points = listOf(listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(1.0, 0.0), Point.fromLngLat(0.0, 1.0)))\n      annotations[1].points = listOf(listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))\n      polygonAnnotationManager.update(annotations)\n      assertEquals(annotations[0], polygonAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polygonAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun delete() {\n    rule.runOnUiThread {\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      val annotation = polygonAnnotationManager.create(\n        PolygonAnnotationOptions()\n          .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(0.0, 1.0), Point.fromLngLat(1.0, 0.0))))\n      )\n      assertEquals(annotation, polygonAnnotationManager.annotations[0])\n      polygonAnnotationManager.delete(annotation)\n      assertTrue(polygonAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  @Test\n  fun deleteList() {\n    rule.runOnUiThread {\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      val list = listOf(\n        PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(1.0, 0.0), Point.fromLngLat(0.0, 1.0)))),\n        PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(0.0, 1.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(0.0, 0.0))))\n      )\n      val annotations = polygonAnnotationManager.create(list)\n      assertEquals(annotations[0], polygonAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polygonAnnotationManager.annotations[1])\n\n      polygonAnnotationManager.delete(annotations)\n      assertTrue(polygonAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  @Test\n  fun deleteAll() {\n    rule.runOnUiThread {\n      val polygonAnnotationManager = mapView.annotations.createPolygonAnnotationManager()\n      val list = listOf(\n        PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(1.0, 0.0), Point.fromLngLat(0.0, 1.0)))),\n        PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(0.0, 1.0), Point.fromLngLat(1.0, 1.0), Point.fromLngLat(0.0, 0.0))))\n      )\n      val annotations = polygonAnnotationManager.create(list)\n      assertEquals(annotations[0], polygonAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polygonAnnotationManager.annotations[1])\n\n      polygonAnnotationManager.deleteAll()\n      assertTrue(polygonAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  fun ActivityScenarioRule<*>.runOnUiThread(block: () -> Unit) {\n    this.scenario.onActivity {\n      it.runOnUiThread(block)\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/annotation/generated/PolylineAnnotationManagerAndroidTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.annotation.generated\n\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.R\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPolylineAnnotationManager\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.*\n\n/**\n * Basic smoke tests for PolylineAnnotationManager\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass PolylineAnnotationManagerAndroidTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_attribution)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testLineCap() {\n    rule.runOnUiThread {\n      val expectedValue = LineCap.BUTT\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineCap = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineCap)\n      polylineAnnotationManager.lineCap = null\n      val expectedDefaultValue = LineCap.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cap\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, polylineAnnotationManager.lineCap)\n    }\n  }\n\n  @Test\n  fun testLineCrossSlope() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineCrossSlope = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineCrossSlope)\n      polylineAnnotationManager.lineCrossSlope = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cross-slope\").silentUnwrap(), polylineAnnotationManager.lineCrossSlope)\n    }\n  }\n\n  @Test\n  fun testLineElevationGroundScale() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineElevationGroundScale = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineElevationGroundScale)\n      polylineAnnotationManager.lineElevationGroundScale = null\n      assertEquals(null, polylineAnnotationManager.lineElevationGroundScale)\n    }\n  }\n\n  @Test\n  fun testLineElevationReference() {\n    rule.runOnUiThread {\n      val expectedValue = LineElevationReference.NONE\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineElevationReference = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineElevationReference)\n      polylineAnnotationManager.lineElevationReference = null\n      val expectedDefaultValue = LineElevationReference.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-reference\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, polylineAnnotationManager.lineElevationReference)\n    }\n  }\n\n  @Test\n  fun testLineJoin() {\n    rule.runOnUiThread {\n      val expectedValue = LineJoin.BEVEL\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineJoin = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineJoin)\n      polylineAnnotationManager.lineJoin = null\n      assertEquals(null, polylineAnnotationManager.lineJoin)\n    }\n  }\n\n  @Test\n  fun testLineMiterLimit() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineMiterLimit = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineMiterLimit)\n      polylineAnnotationManager.lineMiterLimit = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-miter-limit\").silentUnwrap(), polylineAnnotationManager.lineMiterLimit)\n    }\n  }\n\n  @Test\n  fun testLineRoundLimit() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineRoundLimit = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineRoundLimit)\n      polylineAnnotationManager.lineRoundLimit = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-round-limit\").silentUnwrap(), polylineAnnotationManager.lineRoundLimit)\n    }\n  }\n\n  @Test\n  fun testLineSortKey() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineSortKey = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineSortKey)\n      polylineAnnotationManager.lineSortKey = null\n      assertEquals(null, polylineAnnotationManager.lineSortKey)\n    }\n  }\n\n  @Test\n  fun testLineWidthUnit() {\n    rule.runOnUiThread {\n      val expectedValue = LineWidthUnit.PIXELS\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineWidthUnit = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineWidthUnit)\n      polylineAnnotationManager.lineWidthUnit = null\n      val expectedDefaultValue = LineWidthUnit.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width-unit\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, polylineAnnotationManager.lineWidthUnit)\n    }\n  }\n\n  @Test\n  fun testLineZOffset() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineZOffset = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineZOffset)\n      polylineAnnotationManager.lineZOffset = null\n      assertEquals(null, polylineAnnotationManager.lineZOffset)\n    }\n  }\n\n  @Test\n  fun testLineBlur() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineBlur = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineBlur)\n      polylineAnnotationManager.lineBlur = null\n      assertEquals(null, polylineAnnotationManager.lineBlur)\n    }\n  }\n\n  @Test\n  fun testLineBorderColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineBorderColorString = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineBorderColorString)\n      polylineAnnotationManager.lineBorderColorString = null\n      assertEquals(\n        null,\n        polylineAnnotationManager.lineBorderColorString\n      )\n    }\n  }\n\n  @Test\n  fun testLineBorderWidth() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineBorderWidth = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineBorderWidth)\n      polylineAnnotationManager.lineBorderWidth = null\n      assertEquals(null, polylineAnnotationManager.lineBorderWidth)\n    }\n  }\n\n  @Test\n  fun testLineColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineColorString = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineColorString)\n      polylineAnnotationManager.lineColorString = null\n      assertEquals(\n        null,\n        polylineAnnotationManager.lineColorString\n      )\n    }\n  }\n\n  @Test\n  fun testLineCutoutFadeWidth() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineCutoutFadeWidth = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineCutoutFadeWidth)\n      polylineAnnotationManager.lineCutoutFadeWidth = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-fade-width\").silentUnwrap(), polylineAnnotationManager.lineCutoutFadeWidth)\n    }\n  }\n\n  @Test\n  fun testLineCutoutOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineCutoutOpacity = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineCutoutOpacity)\n      polylineAnnotationManager.lineCutoutOpacity = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-opacity\").silentUnwrap(), polylineAnnotationManager.lineCutoutOpacity)\n    }\n  }\n\n  @Test\n  fun testLineDasharray() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(1.0, 2.0)\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineDasharray = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineDasharray)\n      polylineAnnotationManager.lineDasharray = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-dasharray\").silentUnwrap(), polylineAnnotationManager.lineDasharray)\n    }\n  }\n\n  @Test\n  fun testLineDepthOcclusionFactor() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineDepthOcclusionFactor = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineDepthOcclusionFactor)\n      polylineAnnotationManager.lineDepthOcclusionFactor = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-depth-occlusion-factor\").silentUnwrap(), polylineAnnotationManager.lineDepthOcclusionFactor)\n    }\n  }\n\n  @Test\n  fun testLineEmissiveStrength() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineEmissiveStrength = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineEmissiveStrength)\n      polylineAnnotationManager.lineEmissiveStrength = null\n      assertEquals(null, polylineAnnotationManager.lineEmissiveStrength)\n    }\n  }\n\n  @Test\n  fun testLineGapWidth() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineGapWidth = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineGapWidth)\n      polylineAnnotationManager.lineGapWidth = null\n      assertEquals(null, polylineAnnotationManager.lineGapWidth)\n    }\n  }\n\n  @Test\n  fun testLineOcclusionOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineOcclusionOpacity = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineOcclusionOpacity)\n      polylineAnnotationManager.lineOcclusionOpacity = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-occlusion-opacity\").silentUnwrap(), polylineAnnotationManager.lineOcclusionOpacity)\n    }\n  }\n\n  @Test\n  fun testLineOffset() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineOffset = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineOffset)\n      polylineAnnotationManager.lineOffset = null\n      assertEquals(null, polylineAnnotationManager.lineOffset)\n    }\n  }\n\n  @Test\n  fun testLineOpacity() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineOpacity = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineOpacity)\n      polylineAnnotationManager.lineOpacity = null\n      assertEquals(null, polylineAnnotationManager.lineOpacity)\n    }\n  }\n\n  @Test\n  fun testLinePattern() {\n    rule.runOnUiThread {\n      val expectedValue = \"abc\"\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.linePattern = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.linePattern)\n      polylineAnnotationManager.linePattern = null\n      assertEquals(null, polylineAnnotationManager.linePattern)\n    }\n  }\n\n  @Test\n  fun testLinePatternCrossFade() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.linePatternCrossFade = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.linePatternCrossFade)\n      polylineAnnotationManager.linePatternCrossFade = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern-cross-fade\").silentUnwrap(), polylineAnnotationManager.linePatternCrossFade)\n    }\n  }\n\n  @Test\n  fun testLineTranslate() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.0, 1.0)\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineTranslate = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineTranslate)\n      polylineAnnotationManager.lineTranslate = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate\").silentUnwrap(), polylineAnnotationManager.lineTranslate)\n    }\n  }\n\n  @Test\n  fun testLineTranslateAnchor() {\n    rule.runOnUiThread {\n      val expectedValue = LineTranslateAnchor.MAP\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineTranslateAnchor = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineTranslateAnchor)\n      polylineAnnotationManager.lineTranslateAnchor = null\n      val expectedDefaultValue = LineTranslateAnchor.valueOf(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate-anchor\").silentUnwrap<String>()!!.uppercase(Locale.US).replace('-', '_'))\n      assertEquals(expectedDefaultValue, polylineAnnotationManager.lineTranslateAnchor)\n    }\n  }\n\n  @Test\n  fun testLineTrimColor() {\n    rule.runOnUiThread {\n      val expectedValue = \"rgba(0, 0, 0, 1)\"\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineTrimColorString = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineTrimColorString)\n      polylineAnnotationManager.lineTrimColorString = null\n      assertEquals(\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color\")\n          .silentUnwrap<Expression>()\n          ?.let { ColorUtils.rgbaExpressionToColorString(it) },\n        polylineAnnotationManager.lineTrimColorString\n      )\n    }\n  }\n\n  @Test\n  fun testLineTrimFadeRange() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.5, 0.5)\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineTrimFadeRange = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineTrimFadeRange)\n      polylineAnnotationManager.lineTrimFadeRange = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-fade-range\").silentUnwrap(), polylineAnnotationManager.lineTrimFadeRange)\n    }\n  }\n\n  @Test\n  fun testLineTrimOffset() {\n    rule.runOnUiThread {\n      val expectedValue = listOf(0.5, 0.5)\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineTrimOffset = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineTrimOffset)\n      polylineAnnotationManager.lineTrimOffset = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-offset\").silentUnwrap(), polylineAnnotationManager.lineTrimOffset)\n    }\n  }\n\n  @Test\n  fun testLineWidth() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineWidth = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineWidth)\n      polylineAnnotationManager.lineWidth = null\n      assertEquals(null, polylineAnnotationManager.lineWidth)\n    }\n  }\n\n  @Test\n  fun testSlot() {\n    rule.runOnUiThread {\n      val expectedValue = \"abc\"\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.slot = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.slot)\n      polylineAnnotationManager.slot = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"slot\").silentUnwrap(), polylineAnnotationManager.slot)\n    }\n  }\n\n  @Test\n  fun testMaxZoom() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.maxZoom = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.maxZoom)\n      polylineAnnotationManager.maxZoom = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"maxzoom\").silentUnwrap(), polylineAnnotationManager.maxZoom)\n    }\n  }\n\n  @Test\n  fun testMinZoom() {\n    rule.runOnUiThread {\n      val expectedValue = 1.0\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.minZoom = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.minZoom)\n      polylineAnnotationManager.minZoom = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"minzoom\").silentUnwrap(), polylineAnnotationManager.minZoom)\n    }\n  }\n\n  @Test\n  fun testLineBorderColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineBorderColorUseTheme = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineBorderColorUseTheme)\n      polylineAnnotationManager.lineBorderColorUseTheme = null\n      assertEquals(null, polylineAnnotationManager.lineBorderColorUseTheme)\n    }\n  }\n\n  @Test\n  fun testLineColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineColorUseTheme = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineColorUseTheme)\n      polylineAnnotationManager.lineColorUseTheme = null\n      assertEquals(null, polylineAnnotationManager.lineColorUseTheme)\n    }\n  }\n\n  @Test\n  fun testLineGradientUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineGradientUseTheme = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineGradientUseTheme)\n      polylineAnnotationManager.lineGradientUseTheme = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gradient-use-theme\").silentUnwrap(), polylineAnnotationManager.lineGradientUseTheme)\n    }\n  }\n\n  @Test\n  fun testLineTrimColorUseTheme() {\n    rule.runOnUiThread {\n      val expectedValue = \"default\"\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      polylineAnnotationManager.lineTrimColorUseTheme = expectedValue\n      assertEquals(expectedValue, polylineAnnotationManager.lineTrimColorUseTheme)\n      polylineAnnotationManager.lineTrimColorUseTheme = null\n      assertEquals(StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color-use-theme\").silentUnwrap(), polylineAnnotationManager.lineTrimColorUseTheme)\n    }\n  }\n\n  @Test\n  fun create() {\n    rule.runOnUiThread {\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      val annotation = polylineAnnotationManager.create(\n        PolylineAnnotationOptions()\n          .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      )\n      assertEquals(annotation, polylineAnnotationManager.annotations[0])\n    }\n  }\n\n  @Test\n  fun createFromFeature() {\n    rule.runOnUiThread {\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      val featureCollection =\n        FeatureCollection.fromFeature(Feature.fromGeometry(LineString.fromLngLats(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))))\n      val annotations = polylineAnnotationManager.create(featureCollection.toJson())\n      assertEquals(annotations.first(), polylineAnnotationManager.annotations[0])\n      val annotations1 = polylineAnnotationManager.create(featureCollection)\n      assertEquals(annotations1.first(), polylineAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun createList() {\n    rule.runOnUiThread {\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      val list = listOf(\n        PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))),\n        PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      )\n      val annotations = polylineAnnotationManager.create(list)\n      assertEquals(annotations[0], polylineAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polylineAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun update() {\n    rule.runOnUiThread {\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      val annotation = polylineAnnotationManager.create(PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))))\n      assertEquals(annotation, polylineAnnotationManager.annotations[0])\n      annotation.points = listOf(Point.fromLngLat(1.0, 1.0), Point.fromLngLat(1.0, 1.0))\n      annotation.lineJoin = LineJoin.BEVEL\n      polylineAnnotationManager.update(annotation)\n      assertEquals(annotation, polylineAnnotationManager.annotations[0])\n      assertEquals(LineJoin.BEVEL, annotation.lineJoin)\n    }\n  }\n\n  @Test\n  fun updateList() {\n    rule.runOnUiThread {\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      val list = listOf(\n        PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))),\n        PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      )\n      val annotations = polylineAnnotationManager.create(list)\n      assertEquals(annotations[0], polylineAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polylineAnnotationManager.annotations[1])\n      annotations[0].points = listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(1.0, 0.0))\n      annotations[1].points = listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(1.0, 0.0))\n      polylineAnnotationManager.update(annotations)\n      assertEquals(annotations[0], polylineAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polylineAnnotationManager.annotations[1])\n    }\n  }\n\n  @Test\n  fun delete() {\n    rule.runOnUiThread {\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      val annotation = polylineAnnotationManager.create(\n        PolylineAnnotationOptions()\n          .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      )\n      assertEquals(annotation, polylineAnnotationManager.annotations[0])\n      polylineAnnotationManager.delete(annotation)\n      assertTrue(polylineAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  @Test\n  fun deleteList() {\n    rule.runOnUiThread {\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      val list = listOf(\n        PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))),\n        PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      )\n      val annotations = polylineAnnotationManager.create(list)\n      assertEquals(annotations[0], polylineAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polylineAnnotationManager.annotations[1])\n\n      polylineAnnotationManager.delete(annotations)\n      assertTrue(polylineAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  @Test\n  fun deleteAll() {\n    rule.runOnUiThread {\n      val polylineAnnotationManager = mapView.annotations.createPolylineAnnotationManager()\n      val list = listOf(\n        PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))),\n        PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      )\n      val annotations = polylineAnnotationManager.create(list)\n      assertEquals(annotations[0], polylineAnnotationManager.annotations[0])\n      assertEquals(annotations[1], polylineAnnotationManager.annotations[1])\n\n      polylineAnnotationManager.deleteAll()\n      assertTrue(polylineAnnotationManager.annotations.isEmpty())\n    }\n  }\n\n  fun ActivityScenarioRule<*>.runOnUiThread(block: () -> Unit) {\n    this.scenario.onActivity {\n      it.runOnUiThread(block)\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/attribution/AttributionAppCompatThemeTest.kt",
    "content": "package com.mapbox.maps.testapp.attribution\n\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.testapp.TestMapActivity\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\nclass AttributionAppCompatThemeTest : BaseAttributionThemeTest() {\n\n  @get:Rule\n  var activityRule: ActivityScenarioRule<TestMapActivity> = ActivityScenarioRule(\n    TestMapActivity::class.java\n  )\n  @Test\n  fun testAppCompatTheme() {\n    clickAttribution()\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/attribution/AttributionMaterialThemeTest.kt",
    "content": "package com.mapbox.maps.testapp.attribution\n\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.testapp.EmptyFragmentActivity\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\nclass AttributionMaterialThemeTest : BaseAttributionThemeTest() {\n\n  @get:Rule\n  var activityRule: ActivityScenarioRule<EmptyFragmentActivity> = ActivityScenarioRule(\n    EmptyFragmentActivity::class.java\n  )\n  @Test\n  fun testMaterialTheme() {\n    clickAttribution()\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/attribution/BaseAttributionThemeTest.kt",
    "content": "package com.mapbox.maps.testapp.attribution\n\nimport androidx.test.espresso.Espresso\nimport androidx.test.espresso.action.ViewActions\nimport androidx.test.espresso.matcher.ViewMatchers\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.test.uiautomator.UiDevice\nimport org.hamcrest.core.Is\n\nabstract class BaseAttributionThemeTest {\n\n  protected fun clickAttribution() {\n    val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())\n    device.waitForIdle()\n    Thread.sleep(2_000)\n    Espresso.onView(\n      ViewMatchers.withClassName(Is.`is`(\"com.mapbox.maps.plugin.attribution.AttributionViewImpl\"))\n    ).perform(\n      ViewActions.click()\n    )\n    device.waitForIdle()\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/attribution/generated/AttributionAttributeParserDefaultValueTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.attribution.generated\n\nimport android.graphics.Color\nimport android.view.Gravity\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.plugin.attribution.attribution\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass AttributionAttributeParserDefaultValueTest : BaseMapTest() {\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      true,\n      mapView.attribution.getSettings().enabled\n    )\n    assertEquals(\n      \"iconColor test failed..\",\n      Color.parseColor(\"#FF1E8CAB\"),\n      mapView.attribution.getSettings().iconColor\n    )\n    assertEquals(\n      \"position test failed..\",\n      Gravity.BOTTOM or Gravity.START,\n      mapView.attribution.getSettings().position\n    )\n    assertEquals(\n      \"marginLeft test failed..\",\n      92f * pixelRatio,\n      mapView.attribution.getSettings().marginLeft\n    )\n    assertEquals(\n      \"marginTop test failed..\",\n      4f * pixelRatio,\n      mapView.attribution.getSettings().marginTop\n    )\n    assertEquals(\n      \"marginRight test failed..\",\n      4f * pixelRatio,\n      mapView.attribution.getSettings().marginRight\n    )\n    assertEquals(\n      \"marginBottom test failed..\",\n      4f * pixelRatio,\n      mapView.attribution.getSettings().marginBottom\n    )\n    assertEquals(\n      \"clickable test failed..\",\n      true,\n      mapView.attribution.getSettings().clickable\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/attribution/generated/AttributionAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.attribution.generated\n\nimport android.graphics.Color\nimport android.view.Gravity\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.R\nimport com.mapbox.maps.plugin.attribution.attribution\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass AttributionAttributeParserTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_attribution)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      false,\n      mapView.attribution.getSettings().enabled\n    )\n    assertEquals(\n      \"iconColor test failed..\",\n      Color.BLACK,\n      mapView.attribution.getSettings().iconColor\n    )\n    assertEquals(\n      \"position test failed..\",\n      Gravity.BOTTOM or Gravity.END,\n      mapView.attribution.getSettings().position\n    )\n    assertEquals(\n      \"marginLeft test failed..\",\n      10.0f * pixelRatio,\n      mapView.attribution.getSettings().marginLeft\n    )\n    assertEquals(\n      \"marginTop test failed..\",\n      10.0f * pixelRatio,\n      mapView.attribution.getSettings().marginTop\n    )\n    assertEquals(\n      \"marginRight test failed..\",\n      10.0f * pixelRatio,\n      mapView.attribution.getSettings().marginRight\n    )\n    assertEquals(\n      \"marginBottom test failed..\",\n      10.0f * pixelRatio,\n      mapView.attribution.getSettings().marginBottom\n    )\n    assertEquals(\n      \"clickable test failed..\",\n      false,\n      mapView.attribution.getSettings().clickable\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/compass/generated/CompassAttributeParserDefaultValueTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.compass.generated\n\nimport android.view.Gravity\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.plugin.compass.compass\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass CompassAttributeParserDefaultValueTest : BaseMapTest() {\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      true,\n      mapView.compass.getSettings().enabled\n    )\n    assertEquals(\n      \"position test failed..\",\n      Gravity.TOP or Gravity.END,\n      mapView.compass.getSettings().position\n    )\n    assertEquals(\n      \"marginLeft test failed..\",\n      4f * pixelRatio,\n      mapView.compass.getSettings().marginLeft\n    )\n    assertEquals(\n      \"marginTop test failed..\",\n      4f * pixelRatio,\n      mapView.compass.getSettings().marginTop\n    )\n    assertEquals(\n      \"marginRight test failed..\",\n      4f * pixelRatio,\n      mapView.compass.getSettings().marginRight\n    )\n    assertEquals(\n      \"marginBottom test failed..\",\n      4f * pixelRatio,\n      mapView.compass.getSettings().marginBottom\n    )\n    assertEquals(\n      \"opacity test failed..\",\n      1f,\n      mapView.compass.getSettings().opacity\n    )\n    assertEquals(\n      \"rotation test failed..\",\n      0f,\n      mapView.compass.getSettings().rotation\n    )\n    assertEquals(\n      \"visibility test failed..\",\n      true,\n      mapView.compass.getSettings().visibility\n    )\n    assertEquals(\n      \"fadeWhenFacingNorth test failed..\",\n      true,\n      mapView.compass.getSettings().fadeWhenFacingNorth\n    )\n    assertEquals(\n      \"clickable test failed..\",\n      true,\n      mapView.compass.getSettings().clickable\n    )\n    assertEquals(\n      \"image test failed..\",\n      -1,\n      mapView.compass.getSettings().image?.drawableId\n  )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/compass/generated/CompassAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.compass.generated\n\nimport android.view.Gravity\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.R\nimport com.mapbox.maps.plugin.compass.compass\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass CompassAttributeParserTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_compass)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      false,\n      mapView.compass.getSettings().enabled\n    )\n    assertEquals(\n      \"position test failed..\",\n      Gravity.BOTTOM or Gravity.END,\n      mapView.compass.getSettings().position\n    )\n    assertEquals(\n      \"marginLeft test failed..\",\n      10.0f * pixelRatio,\n      mapView.compass.getSettings().marginLeft\n    )\n    assertEquals(\n      \"marginTop test failed..\",\n      10.0f * pixelRatio,\n      mapView.compass.getSettings().marginTop\n    )\n    assertEquals(\n      \"marginRight test failed..\",\n      10.0f * pixelRatio,\n      mapView.compass.getSettings().marginRight\n    )\n    assertEquals(\n      \"marginBottom test failed..\",\n      10.0f * pixelRatio,\n      mapView.compass.getSettings().marginBottom\n    )\n    assertEquals(\n      \"opacity test failed..\",\n      0.9f,\n      mapView.compass.getSettings().opacity\n    )\n    assertEquals(\n      \"rotation test failed..\",\n      0.9f,\n      mapView.compass.getSettings().rotation\n    )\n    assertEquals(\n      \"visibility test failed..\",\n      false,\n      mapView.compass.getSettings().visibility\n    )\n    assertEquals(\n      \"fadeWhenFacingNorth test failed..\",\n      false,\n      mapView.compass.getSettings().fadeWhenFacingNorth\n    )\n    assertEquals(\n      \"clickable test failed..\",\n      false,\n      mapView.compass.getSettings().clickable\n    )\n    assertEquals(\n      \"image test failed..\",\n      R.drawable.mapbox_logo_icon,\n      mapView.compass.getSettings().image?.drawableId\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/featurestate/FeatureStateTest.kt",
    "content": "package com.mapbox.maps.testapp.featurestate\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.BaseMapTest\nimport com.mapbox.maps.testapp.runOnUiThread\nimport com.mapbox.maps.testapp.withLatch\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test for FeatureState api.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass FeatureStateTest : BaseMapTest() {\n\n  override fun loadMap() {\n    withLatch { latch ->\n      rule.runOnUiThread {\n        mapboxMap = mapView.mapboxMap\n        mapboxMap.loadStyle(\n          style(Style.MAPBOX_STREETS) {\n            +geoJsonSource(SOURCE_ID) {\n              feature(\n                Feature.fromGeometry(\n                  Point.fromLngLat(0.0, 0.0),\n                  null,\n                  FEATURE_ID\n                )\n              )\n            }\n            +circleLayer(\"layer\", SOURCE_ID) {\n              circleColor(\"#000000\")\n              circleRadius(10.0)\n            }\n          }\n        )\n        mapboxMap.subscribeSourceDataLoaded {\n          if (it.loaded == true && it.sourceId == SOURCE_ID) {\n            latch.countDown()\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * set feature state {hover : true} to test.\n   */\n  @Test\n  fun testEmptyFeatureState() {\n    rule.runOnUiThread {\n      mapboxMap.getFeatureState(\n        sourceId = SOURCE_ID,\n        featureId = FEATURE_ID,\n      ) { stateMap ->\n        assertEquals(STATE_EMPTY, stateMap.value)\n      }\n    }\n  }\n\n  /**\n   * verify feature state value.\n   */\n  @Test\n  fun testSetFeatureState() {\n    withLatch { latch ->\n      rule.runOnUiThread {\n        mapboxMap.setFeatureState(\n          sourceId = SOURCE_ID,\n          featureId = FEATURE_ID,\n          state = Value(hashMapOf(\"hover\" to Value(true)))\n        ) {\n          mapboxMap.getFeatureState(\n            sourceId = SOURCE_ID,\n            featureId = FEATURE_ID\n          ) { stateMap ->\n            assertEquals(STATE_HOVER, stateMap.value)\n\n            latch.countDown()\n          }\n        }\n      }\n    }\n  }\n\n  @Test\n  fun testRemoveFeatureState() {\n    withLatch { latch ->\n      rule.runOnUiThread {\n        mapboxMap.setFeatureState(\n          sourceId = SOURCE_ID,\n          featureId = FEATURE_ID,\n          state = Value(hashMapOf(\"hover\" to Value(true)))\n        ) {\n          mapboxMap.removeFeatureState(\n            sourceId = SOURCE_ID,\n            featureId = FEATURE_ID\n          ) {\n            mapboxMap.getFeatureState(\n              sourceId = SOURCE_ID,\n              featureId = FEATURE_ID\n            ) { stateMap ->\n              assertEquals(STATE_EMPTY, stateMap.value)\n\n              latch.countDown()\n            }\n\n            latch.countDown()\n          }\n        }\n      }\n    }\n  }\n\n  @Test\n  fun testResetFeatureState() {\n    withLatch { latch ->\n      rule.runOnUiThread {\n        mapboxMap.setFeatureState(\n          sourceId = SOURCE_ID,\n          featureId = FEATURE_ID,\n          state = Value(hashMapOf(\"hover\" to Value(true)))\n        ) {\n          mapboxMap.resetFeatureStates(\n            sourceId = SOURCE_ID,\n          ) {\n            mapboxMap.getFeatureState(\n              sourceId = SOURCE_ID,\n              featureId = FEATURE_ID\n            ) { stateMap ->\n              assertEquals(STATE_EMPTY, stateMap.value)\n\n              latch.countDown()\n            }\n\n            latch.countDown()\n          }\n        }\n      }\n    }\n  }\n\n  companion object {\n    private const val FEATURE_ID = \"0\"\n    private const val SOURCE_ID = \"source\"\n    private val STATE_EMPTY = Value(hashMapOf())\n    private val STATE_HOVER = Value(hashMapOf(\"hover\" to Value(true)))\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/featurestate/StandardBuildingsFeatureStateTest.kt",
    "content": "package com.mapbox.maps.testapp.featurestate\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.interactions.standard.generated.StandardBuildings\nimport com.mapbox.maps.interactions.standard.generated.StandardBuildingsState\nimport com.mapbox.maps.testapp.BaseMapTest\nimport com.mapbox.maps.testapp.runOnUiThread\nimport com.mapbox.maps.testapp.withLatch\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test verifying that feature IDs returned by [com.mapbox.maps.MapboxMap.queryRenderedFeatures]\n * for StandardBuildings are compatible with [com.mapbox.maps.MapboxMap.setFeatureState] and\n * [com.mapbox.maps.MapboxMap.getFeatureState].\n *\n * Regression test for: double feature IDs being formatted as \"12345.000000\" instead of \"12345\"\n * due to a format mismatch in JNI marshaling (feature.hpp).\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass StandardBuildingsFeatureStateTest : BaseMapTest() {\n\n  override fun loadMap() {\n    withLatch(timeoutMillis = 30000) { latch ->\n      rule.runOnUiThread {\n        mapboxMap = mapView.mapboxMap\n        mapboxMap.setCamera(\n          cameraOptions {\n            center(Point.fromLngLat(24.94180921290157, 60.171227338006844))\n            zoom(16.0)\n          }\n        )\n        mapboxMap.loadStyle(Style.STANDARD) { style ->\n          this@StandardBuildingsFeatureStateTest.style = style\n          // Wait for the map to finish rendering tiles before querying features\n          mapboxMap.subscribeMapIdle {\n            latch.countDown()\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Verifies that a building queried via [com.mapbox.maps.MapboxMap.queryRenderedFeatures] can\n   * have its state set and retrieved using the typed featureset API.\n   *\n   * If the feature ID format is wrong (e.g. \"12345.000000\"), setFeatureState will target a\n   * different feature and getFeatureState will return null for select, causing the assertion\n   * to fail.\n   */\n  @Test\n  fun testQueryRenderedBuildingIdCompatibleWithSetFeatureState() {\n    withLatch(timeoutMillis = 10000) { latch ->\n      rule.runOnUiThread {\n        mapboxMap.queryRenderedFeatures(StandardBuildings()) { buildings ->\n          val building = buildings.firstOrNull { it.id != null }\n          assertNotNull(\"Expected at least one rendered building with an ID\", building)\n          building!!\n\n          mapboxMap.setFeatureState(building, StandardBuildingsState { select(true) }) {\n            mapboxMap.getFeatureState(building) { state ->\n              assertEquals(true, state.select)\n              latch.countDown()\n            }\n          }\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/gestures/GestureActivityTest.kt",
    "content": "package com.mapbox.maps.testapp.gestures\n\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.android.gestures.StandardScaleGestureDetector\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.R\nimport com.mapbox.maps.plugin.gestures.OnScaleListener\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.testapp.BaseMapTest\nimport com.mapbox.maps.testapp.gestures.GesturesUiTestUtils.move\nimport com.mapbox.maps.testapp.gestures.GesturesUiTestUtils.quickScale\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass GestureActivityTest : BaseMapTest() {\n\n  private var maxWidth: Int = 0\n  private var maxHeight: Int = 0\n\n  @Before\n  fun setUp() {\n    super.before()\n    maxWidth = mapView.measuredWidth\n    maxHeight = mapView.measuredHeight\n  }\n\n  @Test\n  fun sanity_quickZoom() {\n    var initialZoom = 0.0\n    val latch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        initialZoom = mapboxMap.cameraState.zoom\n        latch.countDown()\n      }\n    }\n    if (!latch.await(3000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    onView(withId(R.id.mapView)).perform(quickScale(maxHeight / 2f, withVelocity = false))\n    val resultLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertTrue(mapboxMap.cameraState.zoom > initialZoom)\n        resultLatch.countDown()\n      }\n    }\n    if (!resultLatch.await(3000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @Test\n  fun quickZoomDisabled_phantomQuickZoom_moveStillEnabled_15091() {\n    // regression test for https://github.com/mapbox/mapbox-gl-native/issues/15091\n    var initialCameraPosition: CameraState? = null\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        // zoom in so we can move vertically\n        mapboxMap.setCamera(CameraOptions.Builder().zoom(4.0).build())\n        initialCameraPosition = mapboxMap.cameraState\n        mapView.gestures.quickZoomEnabled = false\n      }\n    }\n\n    onView(withId(R.id.mapView)).perform(quickScale(maxHeight / 2f))\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        // camera did not move\n        assertEquals(initialCameraPosition!!.zoom, mapboxMap.cameraState.zoom, 0.0001)\n      }\n    }\n\n    // move to expected target\n    onView(withId(R.id.mapView)).perform(\n      move(\n        -maxWidth / 2f,\n        -maxHeight / 2f,\n        withVelocity = false\n      )\n    )\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertNotEquals(\n          initialCameraPosition!!.center.latitude(),\n          mapboxMap.cameraState.center.latitude(),\n          1.0\n        )\n        assertNotEquals(\n          initialCameraPosition!!.center.longitude(),\n          mapboxMap.cameraState.center.longitude(),\n          1.0\n        )\n      }\n    }\n  }\n\n  @Test\n  fun quickZoom_doNotMove_14227() {\n    // test for https://github.com/mapbox/mapbox-gl-native/issues/14227\n    var initialTarget: Point? = null\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        initialTarget = mapboxMap.cameraState.center\n      }\n    }\n\n    onView(withId(R.id.mapView)).perform(quickScale(maxHeight / 2f))\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        // camera did not move\n        assertEquals(\n          initialTarget!!.latitude(),\n          mapboxMap.cameraState.center.latitude(),\n          1.0\n        )\n        assertEquals(\n          initialTarget!!.longitude(),\n          mapboxMap.cameraState.center.longitude(),\n          1.0\n        )\n      }\n    }\n  }\n\n  @Test\n  fun quickZoom_interrupted_moveStillEnabled_14598() {\n    // test for https://github.com/mapbox/mapbox-gl-native/issues/14598\n    onView(withId(R.id.mapView)).perform(quickScale(maxHeight / 2f, interrupt = true))\n\n    var initialCameraPosition: CameraState? = null\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        // zoom in so we can move vertically\n        mapboxMap.setCamera(CameraOptions.Builder().zoom(4.0).build())\n        initialCameraPosition = mapboxMap.cameraState\n        mapView.gestures.quickZoomEnabled = false\n      }\n    }\n\n    // move to expected target\n    onView(withId(R.id.mapView)).perform(\n      move(\n        -maxWidth / 2f,\n        -maxHeight / 2f,\n        withVelocity = false\n      )\n    )\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertNotEquals(\n          initialCameraPosition!!.center.latitude(),\n          mapboxMap.cameraState.center.latitude(),\n          1.0\n        )\n        assertNotEquals(\n          initialCameraPosition!!.center.longitude(),\n          mapboxMap.cameraState.center.longitude(),\n          1.0\n        )\n      }\n    }\n  }\n\n  @Test\n  fun quickZoom_ignoreDoubleTap() {\n    // test for https://github.com/mapbox/mapbox-gl-native/issues/14013\n    var initialZoom: Double? = null\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.setCamera(CameraOptions.Builder().zoom(4.0).build())\n        initialZoom = mapboxMap.cameraState.zoom\n      }\n    }\n    onView(withId(R.id.mapView)).perform(\n      quickScale(\n        -10000.0f,\n        withVelocity = false,\n        duration = 1000L\n      )\n    )\n    R.id.mapView.loopFor(3000)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertTrue(mapboxMap.cameraState.zoom < initialZoom!!)\n      }\n    }\n  }\n\n  @Test\n  fun doubleTap_minimalMovement() {\n    var initialZoom: Double? = null\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        initialZoom = mapboxMap.cameraState.zoom\n      }\n    }\n    onView(withId(R.id.mapView)).perform(\n      quickScale(\n        5.0f,\n        withVelocity = false,\n        duration = 50L\n      )\n    )\n    R.id.mapView.loopFor(3000)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertEquals(initialZoom!! + 1, mapboxMap.cameraState.zoom, 0.1)\n      }\n    }\n  }\n\n  @Test\n  fun doubleTap_overMaxThreshold_ignore_14013() {\n    // test for https://github.com/mapbox/mapbox-gl-native/issues/14013\n    var initialZoom: Double? = null\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        initialZoom = mapboxMap.cameraState.zoom\n        mapView.gestures.quickZoomEnabled = false\n      }\n    }\n    onView(withId(R.id.mapView)).perform(\n      quickScale(\n        10000000.0f,\n        withVelocity = false,\n        duration = 50L\n      )\n    )\n    R.id.mapView.loopFor(3000)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertEquals(initialZoom!!, mapboxMap.cameraState.zoom, 0.01)\n      }\n    }\n  }\n\n  @Test\n  fun doubleTap_interrupted_moveStillEnabled() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.setCamera(CameraOptions.Builder().zoom(4.0).build())\n      }\n    }\n\n    onView(withId(R.id.mapView)).perform(\n      quickScale(\n        10000.0f,\n        withVelocity = false,\n        duration = 50L,\n        interrupt = true\n      )\n    )\n\n    var initialCameraPosition: CameraState? = null\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        // zoom in so we can move vertically\n        mapboxMap.setCamera(CameraOptions.Builder().zoom(4.0).build())\n        initialCameraPosition = mapboxMap.cameraState\n        mapView.gestures.quickZoomEnabled = false\n      }\n    }\n\n    // move to expected target\n    onView(withId(R.id.mapView)).perform(\n      move(\n        -maxWidth / 2f,\n        -maxHeight / 2f,\n        withVelocity = false\n      )\n    )\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertNotEquals(\n          initialCameraPosition!!.center.latitude(),\n          mapboxMap.cameraState.center.latitude(),\n          1.0\n        )\n        assertNotEquals(\n          initialCameraPosition!!.center.longitude(),\n          mapboxMap.cameraState.center.longitude(),\n          1.0\n        )\n      }\n    }\n  }\n\n  @Test\n  fun quickZoom_roundTripping() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.setCamera(CameraOptions.Builder().zoom(3.0).build())\n      }\n    }\n    onView(withId(R.id.mapView)).perform(quickScale(300f, withVelocity = false, duration = 750L))\n    onView(withId(R.id.mapView)).perform(quickScale(-300f, withVelocity = false, duration = 750L))\n\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertEquals(3.0, mapboxMap.cameraState.zoom, 0.0001)\n      }\n    }\n  }\n\n  @Test\n  fun doubleTap_scaleListener_test() {\n    var onScaleBegin = false\n    var onScale = false\n    var onScaleEnd = false\n    val scaleListener = object : OnScaleListener {\n      override fun onScaleBegin(detector: StandardScaleGestureDetector) {\n        onScaleBegin = true\n      }\n\n      override fun onScale(detector: StandardScaleGestureDetector) {\n        onScale = true\n      }\n\n      override fun onScaleEnd(detector: StandardScaleGestureDetector) {\n        onScaleEnd = true\n      }\n    }\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.gestures.addOnScaleListener(scaleListener)\n      }\n    }\n    onView(withId(R.id.mapView)).perform(\n      quickScale(\n        300.0f,\n        withVelocity = false,\n        duration = 50L\n      )\n    )\n    R.id.mapView.loopFor(2000)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertTrue(onScaleBegin)\n        assertTrue(onScale)\n        assertTrue(onScaleEnd)\n        mapView.gestures.removeOnScaleListener(scaleListener)\n      }\n    }\n  }\n\n  /**\n   * test for quick zoom out gesture, when user click on map with double finger.\n   */\n  @Test\n  fun doubleFingerTap_scaleListener_test() {\n    var onScaleBegin = false\n    var onScale = false\n    var onScaleEnd = false\n    val scaleListener = object : OnScaleListener {\n      override fun onScaleBegin(detector: StandardScaleGestureDetector) {\n        onScaleBegin = true\n      }\n\n      override fun onScale(detector: StandardScaleGestureDetector) {\n        onScale = true\n      }\n\n      override fun onScaleEnd(detector: StandardScaleGestureDetector) {\n        onScaleEnd = true\n      }\n    }\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.gestures.addOnScaleListener(scaleListener)\n      }\n    }\n    onView(withId(R.id.mapView)).perform(\n      quickScale(\n        -300.0f,\n        withVelocity = false,\n        duration = 50L\n      )\n    )\n    R.id.mapView.loopFor(2000)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertTrue(onScaleBegin)\n        assertTrue(onScale)\n        assertTrue(onScaleEnd)\n        mapView.gestures.removeOnScaleListener(scaleListener)\n      }\n    }\n  }\n\n  @Test\n  fun doubleTap_interrupted_scaleListener_test() {\n    var onScaleBegin = false\n    var onScale = false\n    var onScaleEnd = false\n    val scaleListener = object : OnScaleListener {\n      override fun onScaleBegin(detector: StandardScaleGestureDetector) {\n        onScaleBegin = true\n      }\n\n      override fun onScale(detector: StandardScaleGestureDetector) {\n        onScale = true\n      }\n\n      override fun onScaleEnd(detector: StandardScaleGestureDetector) {\n        onScaleEnd = true\n      }\n    }\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.gestures.addOnScaleListener(scaleListener)\n      }\n    }\n\n    onView(withId(R.id.mapView)).perform(\n      quickScale(\n        10000.0f,\n        withVelocity = false,\n        duration = 1500L,\n        interrupt = true\n      )\n    )\n\n    // interrupt doubleTap with move gesture.\n    onView(withId(R.id.mapView)).perform(\n      move(\n        -maxWidth / 2f,\n        -maxHeight / 2f,\n        withVelocity = false\n      )\n    )\n    R.id.mapView.loopFor(2000)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        assertTrue(onScaleBegin)\n        assertTrue(onScale)\n        assertTrue(onScaleEnd)\n        mapView.gestures.removeOnScaleListener(scaleListener)\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/gestures/GestureInterceptedOnViewAnnotationTest.kt",
    "content": "package com.mapbox.maps.testapp.gestures\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.testapp.BaseMapTest\nimport com.mapbox.maps.testapp.test.R\nimport com.mapbox.maps.viewannotation.OnViewAnnotationUpdatedListener\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Tests gestures intercepted on view annotations.\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass GestureInterceptedOnViewAnnotationTest : BaseMapTest() {\n\n  private fun withLatch(\n    count: Int = 1,\n    timeoutMillis: Long = 3000,\n    lambda: (CountDownLatch) -> Unit\n  ) {\n    val latch = CountDownLatch(count)\n    lambda(latch)\n    if (!latch.await(timeoutMillis, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @Test\n  fun clickableViewAnnotationDoesNotTriggerLongTouchAfterwards() {\n    val cameraCenter = Point.fromLngLat(-122.44121, 37.76132)\n\n    var longClicks = 0\n\n    withLatch { latch ->\n      rule.scenario.onActivity {\n        it.runOnUiThread {\n          mapView.gestures.addOnMapLongClickListener {\n            longClicks++\n            return@addOnMapLongClickListener true\n          }\n\n          mapboxMap.setCamera(\n            cameraOptions {\n              center(cameraCenter)\n            }\n          )\n\n          mapView.viewAnnotationManager.apply {\n\n            // xml layout resource is only available within instrumentationContext,\n            // while mapView uses targetContext hence fails to inflate if used via resId\n            val viewAnnotation = LayoutInflater.from(InstrumentationRegistry.getInstrumentation().context).inflate(R.layout.view_annotation, mapView, false)\n\n            addViewAnnotation(\n              view = viewAnnotation,\n              options = viewAnnotationOptions {\n                geometry(cameraCenter)\n              }\n            )\n\n            viewAnnotation.setOnClickListener { _ ->\n              removeViewAnnotation(viewAnnotation)\n            }\n\n            addOnViewAnnotationUpdatedListener(\n              object : OnViewAnnotationUpdatedListener {\n                override fun onViewAnnotationPositionUpdated(\n                  view: View,\n                  leftTopCoordinate: ScreenCoordinate,\n                  width: Double,\n                  height: Double\n                ) {}\n\n                override fun onViewAnnotationVisibilityUpdated(view: View, visible: Boolean) {\n                  if (view == viewAnnotation && visible) {\n                    latch.countDown()\n                  }\n                }\n              }\n            )\n          }\n        }\n      }\n    }\n\n    // click on view annotation - triggers closing on onClickListener\n    onView(withId(R.id.view_annotation)).perform(GesturesUiTestUtils.click())\n\n    // sleep to check that long-touch wont be triggered after next gestures\n    Thread.sleep(2000)\n\n    // scroll map\n    onView(withId(com.mapbox.maps.R.id.mapView)).perform(\n      GesturesUiTestUtils.move(\n        deltaX = 100f,\n        deltaY = 200f,\n        withVelocity = false,\n      )\n    )\n\n    // click on map\n    onView(withId(com.mapbox.maps.R.id.mapView)).perform(GesturesUiTestUtils.click())\n\n    // sleep to make sure things settle down\n    Thread.sleep(2000)\n\n    assertEquals(0, longClicks)\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/gestures/GestureMapIdleTest.kt",
    "content": "package com.mapbox.maps.testapp.gestures\n\nimport androidx.test.espresso.Espresso\nimport androidx.test.espresso.matcher.ViewMatchers\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.mapbox.maps.BuildConfig\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.animation.easeTo\nimport com.mapbox.maps.testapp.BaseMapTest\nimport com.mapbox.maps.testapp.runOnUiThread\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Set of tests making sure we trigger needed amount of MapIdle events when using gestures / animations.\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass GestureMapIdleTest : BaseMapTest() {\n\n  private var maxWidth = 0\n  private var maxHeight = 0\n\n  private val latch = CountDownLatch(1)\n  @Volatile\n  private var idleCount = 0\n\n  @Before\n  fun setUp() {\n    super.before()\n    maxWidth = mapView.measuredWidth\n    maxHeight = mapView.measuredHeight\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.subscribeMapIdle {\n          latch.countDown()\n          idleCount++\n        }\n        mapboxMap.setCamera(\n          cameraOptions {\n            pitch(0.0)\n            zoom(5.0)\n          }\n        )\n      }\n    }\n    if (!BuildConfig.RUN_FROM_IDE) {\n      with(InstrumentationRegistry.getInstrumentation().uiAutomation) {\n        executeShellCommand(\"settings put global window_animation_scale 1\")\n        executeShellCommand(\"settings put global transition_animation_scale 1\")\n        executeShellCommand(\"settings put global animator_duration_scale 1\")\n      }\n    }\n  }\n\n  @Test\n  fun idleTestOnClickNoMovement() {\n    if (!latch.await(EMPIRIC_IDLE_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException(\"Initial map style load IDLE event not called!\")\n    }\n    Espresso.onView(ViewMatchers.withId(com.mapbox.maps.R.id.mapView)).perform(GesturesUiTestUtils.click())\n    Thread.sleep(EMPIRIC_IDLE_TIMEOUT_MS)\n    assert(idleCount == 1)\n  }\n\n  @Test\n  fun idleTestPanWithFlingMovement() {\n    if (!latch.await(EMPIRIC_IDLE_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException(\"Initial map style load IDLE event not called!\")\n    }\n    Espresso.onView(ViewMatchers.withId(com.mapbox.maps.R.id.mapView)).perform(\n      GesturesUiTestUtils.move(\n        -maxWidth * 2f,\n        0f,\n        withVelocity = true,\n      )\n    )\n    Thread.sleep(EMPIRIC_IDLE_TIMEOUT_MS)\n    assert(idleCount == 2)\n  }\n\n  @Test\n  fun idleTestPanWithoutFlingMovement() {\n    if (!latch.await(EMPIRIC_IDLE_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException(\"Initial map style load IDLE event not called!\")\n    }\n    Espresso.onView(ViewMatchers.withId(com.mapbox.maps.R.id.mapView)).perform(\n      GesturesUiTestUtils.move(\n        -maxWidth / 2f,\n        0f,\n        withVelocity = true,\n      )\n    )\n    Thread.sleep(EMPIRIC_IDLE_TIMEOUT_MS)\n    assert(idleCount == 2)\n  }\n\n  @Test\n  fun idleTestPanMovementWithAnimationAfter() {\n    if (!latch.await(EMPIRIC_IDLE_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException(\"Initial map style load IDLE event not called!\")\n    }\n    Espresso.onView(ViewMatchers.withId(com.mapbox.maps.R.id.mapView)).perform(\n      GesturesUiTestUtils.move(\n        -maxWidth / 2f,\n        0f,\n        withVelocity = true,\n      )\n    )\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.easeTo(\n          cameraOptions {\n            pitch(mapboxMap.cameraState.pitch + 30.0)\n            zoom(mapboxMap.cameraState.zoom + 2.0)\n          }\n        )\n      }\n    }\n    Thread.sleep(EMPIRIC_IDLE_TIMEOUT_MS)\n    assert(idleCount == 2)\n  }\n\n  @Test\n  fun idleTestNoGestureJustAnimation() {\n    if (!latch.await(EMPIRIC_IDLE_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException(\"Initial map style load IDLE event not called!\")\n    }\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.easeTo(\n          cameraOptions {\n            pitch(mapboxMap.cameraState.pitch + 30.0)\n            zoom(mapboxMap.cameraState.zoom + 2.0)\n          }\n        )\n      }\n    }\n    Thread.sleep(EMPIRIC_IDLE_TIMEOUT_MS)\n    assert(idleCount == 2)\n  }\n\n  @After\n  fun cleanUp() {\n    val latch = CountDownLatch(1)\n    rule.runOnUiThread {\n      mapView.onDestroy()\n      latch.countDown()\n    }\n    idleCount = 0\n    if (!BuildConfig.RUN_FROM_IDE) {\n      with(InstrumentationRegistry.getInstrumentation().uiAutomation) {\n        executeShellCommand(\"settings put global window_animation_scale 0\")\n        executeShellCommand(\"settings put global transition_animation_scale 0\")\n        executeShellCommand(\"settings put global animator_duration_scale 0\")\n      }\n    }\n  }\n\n  private companion object {\n    private const val EMPIRIC_IDLE_TIMEOUT_MS = 5_000L\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/gestures/GestureUiUtils.kt",
    "content": "package com.mapbox.maps.testapp.gestures\n\nimport android.graphics.PointF\nimport android.os.SystemClock\nimport android.view.MotionEvent\nimport android.view.View\nimport androidx.test.espresso.Espresso\nimport androidx.test.espresso.InjectEventSecurityException\nimport androidx.test.espresso.UiController\nimport androidx.test.espresso.ViewAction\nimport androidx.test.espresso.matcher.ViewMatchers\nimport org.hamcrest.Matcher\n\nobject GesturesUiTestUtils {\n\n  private const val DEFAULT_GESTURE_DURATION = 500L\n\n  fun pinch(\n    startSpan: Float,\n    endSpan: Float,\n    center: PointF? = null,\n    duration: Long = DEFAULT_GESTURE_DURATION\n  ): ViewAction {\n    return object : ViewAction {\n      override fun getConstraints(): Matcher<View> {\n        return ViewMatchers.isEnabled()\n      }\n\n      override fun getDescription(): String = \"Pinch $startSpan -> $endSpan\"\n\n      override fun perform(uiController: UiController, view: View) {\n        var middlePosition = center\n        if (middlePosition == null) {\n          middlePosition = getCenterPointF(view)\n        }\n\n        val startPoint1 = PointF(middlePosition.x - startSpan / 2f, middlePosition.y)\n        val startPoint2 = PointF(middlePosition.x + startSpan / 2f, middlePosition.y)\n        val endPoint1 = PointF(middlePosition.x - endSpan / 2f, middlePosition.y)\n        val endPoint2 = PointF(middlePosition.x + endSpan / 2f, middlePosition.y)\n\n        performPinch(uiController, startPoint1, startPoint2, endPoint1, endPoint2, duration)\n      }\n    }\n  }\n\n  fun quickScale(\n    deltaY: Float,\n    startPoint: PointF? = null,\n    withVelocity: Boolean = true,\n    duration: Long = DEFAULT_GESTURE_DURATION,\n    interrupt: Boolean = false\n  ): ViewAction {\n    return object : ViewAction {\n      override fun getConstraints(): Matcher<View> = ViewMatchers.isEnabled()\n\n      override fun getDescription(): String = \"quick scale ${deltaY}Y\"\n\n      override fun perform(uiController: UiController, view: View) {\n        var middlePosition = startPoint\n        if (middlePosition == null) {\n          middlePosition = getCenterPointF(view)\n        }\n\n        val endPoint = PointF(middlePosition.x, middlePosition.y + deltaY)\n\n        performQuickScale(uiController, middlePosition, endPoint, withVelocity, duration, interrupt)\n      }\n    }\n  }\n\n  fun move(\n    deltaX: Float,\n    deltaY: Float,\n    startPoint: PointF? = null,\n    withVelocity: Boolean = true,\n    duration: Long = DEFAULT_GESTURE_DURATION\n  ): ViewAction {\n    return object : ViewAction {\n      override fun getConstraints(): Matcher<View> = ViewMatchers.isEnabled()\n\n      override fun getDescription(): String = \"move ${deltaX}X, ${deltaY}Y\"\n\n      override fun perform(uiController: UiController, view: View) {\n        var middlePosition = startPoint\n        if (middlePosition == null) {\n          middlePosition = getCenterPointF(view)\n        }\n\n        val endPoint = PointF(middlePosition.x + deltaX, middlePosition.y + deltaY)\n\n        performMove(uiController, middlePosition, endPoint, withVelocity, duration)\n      }\n    }\n  }\n\n  fun click() = move(\n    deltaX = 0f,\n    deltaY = 0f,\n    startPoint = null,\n    withVelocity = false,\n    duration = 0\n  )\n\n  private fun getCenterPointF(view: View): PointF {\n    val locationOnScreen = IntArray(2)\n    view.getLocationOnScreen(locationOnScreen)\n    val viewHeight = view.height * view.scaleY\n    val viewWidth = view.width * view.scaleX\n    return PointF(\n      (locationOnScreen[0] + viewWidth / 2).toInt().toFloat(),\n      (locationOnScreen[1] + viewHeight / 2).toInt().toFloat()\n    )\n  }\n\n  // https://stackoverflow.com/a/46443628/9126211\n  private fun performPinch(\n    uiController: UiController,\n    startPoint1: PointF,\n    startPoint2: PointF,\n    endPoint1: PointF,\n    endPoint2: PointF,\n    duration: Long\n  ) {\n    val eventMinInterval: Long = 10\n    val startTime = SystemClock.uptimeMillis()\n    var eventTime = startTime\n    var event: MotionEvent\n    var eventX1: Float = startPoint1.x\n    var eventY1: Float = startPoint1.y\n    var eventX2: Float = startPoint2.x\n    var eventY2: Float = startPoint2.y\n\n    // Specify the property for the two touch points\n    val properties = arrayOfNulls<MotionEvent.PointerProperties>(2)\n    val pp1 = MotionEvent.PointerProperties()\n    pp1.id = 0\n    pp1.toolType = MotionEvent.TOOL_TYPE_FINGER\n    val pp2 = MotionEvent.PointerProperties()\n    pp2.id = 1\n    pp2.toolType = MotionEvent.TOOL_TYPE_FINGER\n\n    properties[0] = pp1\n    properties[1] = pp2\n\n    // Specify the coordinations of the two touch points\n    // NOTE: you MUST set the pressure and size value, or it doesn't work\n    val pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(2)\n    val pc1 = MotionEvent.PointerCoords()\n    pc1.x = eventX1\n    pc1.y = eventY1\n    pc1.pressure = 1f\n    pc1.size = 1f\n    val pc2 = MotionEvent.PointerCoords()\n    pc2.x = eventX2\n    pc2.y = eventY2\n    pc2.pressure = 1f\n    pc2.size = 1f\n    pointerCoords[0] = pc1\n    pointerCoords[1] = pc2\n\n    /*\n     * Events sequence of zoom gesture:\n     *\n     * 1. Send ACTION_DOWN event of one start point\n     * 2. Send ACTION_POINTER_DOWN of two start points\n     * 3. Send ACTION_MOVE of two middle points\n     * 4. Repeat step 3 with updated middle points (x,y), until reach the end points\n     * 5. Send ACTION_POINTER_UP of two end points\n     * 6. Send ACTION_UP of one end point\n     */\n\n    try {\n      // Step 1\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_DOWN, 1, properties,\n        pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n\n      // Step 2\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_POINTER_DOWN + (pp2.id shl MotionEvent.ACTION_POINTER_INDEX_SHIFT), 2,\n        properties, pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n\n      // Step 3, 4\n      val moveEventNumber = duration / eventMinInterval\n\n      val stepX1: Float\n      val stepY1: Float\n      val stepX2: Float\n      val stepY2: Float\n\n      stepX1 = (endPoint1.x - startPoint1.x) / moveEventNumber\n      stepY1 = (endPoint1.y - startPoint1.y) / moveEventNumber\n      stepX2 = (endPoint2.x - startPoint2.x) / moveEventNumber\n      stepY2 = (endPoint2.y - startPoint2.y) / moveEventNumber\n\n      for (i in 0 until moveEventNumber) {\n        // Update the move events\n        eventTime += eventMinInterval\n        eventX1 += stepX1\n        eventY1 += stepY1\n        eventX2 += stepX2\n        eventY2 += stepY2\n\n        pc1.x = eventX1\n        pc1.y = eventY1\n        pc2.x = eventX2\n        pc2.y = eventY2\n\n        pointerCoords[0] = pc1\n        pointerCoords[1] = pc2\n\n        event = MotionEvent.obtain(\n          startTime, eventTime,\n          MotionEvent.ACTION_MOVE, 2, properties,\n          pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n        )\n        injectMotionEventToUiController(uiController, event)\n      }\n\n      // Step 5\n      pc1.x = endPoint1.x\n      pc1.y = endPoint1.y\n      pc2.x = endPoint2.x\n      pc2.y = endPoint2.y\n      pointerCoords[0] = pc1\n      pointerCoords[1] = pc2\n\n      eventTime += eventMinInterval\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_POINTER_UP + (pp2.id shl MotionEvent.ACTION_POINTER_INDEX_SHIFT), 2, properties,\n        pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n\n      // Step 6\n      eventTime += eventMinInterval\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_UP, 1, properties,\n        pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n    } catch (ex: InjectEventSecurityException) {\n      throw RuntimeException(\"Could not perform pinch\", ex)\n    }\n  }\n\n  private fun performQuickScale(\n    uiController: UiController,\n    startPoint: PointF,\n    endPoint: PointF,\n    withVelocity: Boolean,\n    duration: Long,\n    interrupt: Boolean\n  ) {\n    val eventMinInterval: Long = 10\n    val tapDownMinInterval: Long = 40 // ViewConfiguration#DOUBLE_TAP_MIN_TIME = 40\n    val startTime = SystemClock.uptimeMillis()\n    var eventTime = startTime\n    var event: MotionEvent\n    var eventX1: Float = startPoint.x\n    var eventY1: Float = startPoint.y\n\n    var properties = arrayOfNulls<MotionEvent.PointerProperties>(1)\n    val pp1 = MotionEvent.PointerProperties()\n    pp1.id = 0\n    pp1.toolType = MotionEvent.TOOL_TYPE_FINGER\n    properties[0] = pp1\n\n    var pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(1)\n    val pc1 = MotionEvent.PointerCoords()\n    pc1.x = eventX1\n    pc1.y = eventY1\n    pc1.pressure = 1f\n    pc1.size = 1f\n    pointerCoords[0] = pc1\n\n    /*\n     * Events sequence of quick scale gesture:\n     *\n     * 1. Send ACTION_DOWN\n     * 2. Send ACTION_UP\n     * 3. Send ACTION_DOWN\n     * 4. Send ACTION_MOVE with updated middle points (x,y), until reach the end points\n     * 5. Send ACTION_UP of one end point\n     */\n    try {\n      // Step 1\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_DOWN, 1, properties,\n        pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n\n      // Step 2\n      eventTime += eventMinInterval\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_UP, 1, properties,\n        pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n\n      // Step 3\n      eventTime += tapDownMinInterval\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_DOWN, 1, properties,\n        pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n\n      // Step 4\n      val moveEventNumber = duration / eventMinInterval\n\n      val stepX1: Float\n      val stepY1: Float\n\n      stepX1 = (endPoint.x - startPoint.x) / moveEventNumber\n      stepY1 = (endPoint.y - startPoint.y) / moveEventNumber\n\n      var interrupted = false\n\n      for (i in 0 until moveEventNumber) {\n        // Update the move events\n        eventTime += eventMinInterval\n        eventX1 += stepX1\n        eventY1 += stepY1\n\n        pc1.x = eventX1\n        pc1.y = eventY1\n\n        pointerCoords[0] = pc1\n\n        event = MotionEvent.obtain(\n          startTime, eventTime,\n          MotionEvent.ACTION_MOVE, if (interrupted) 2 else 1, properties,\n          pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n        )\n        injectMotionEventToUiController(uiController, event)\n\n        if (interrupt && i == moveEventNumber / 2) {\n          // Specify the property for the two touch points\n          properties = arrayOfNulls<MotionEvent.PointerProperties>(2)\n          val pp2 = MotionEvent.PointerProperties()\n          pp2.id = 1\n          pp2.toolType = MotionEvent.TOOL_TYPE_FINGER\n\n          properties[0] = pp1\n          properties[1] = pp2\n\n          // Specify the coordinations of the two touch points\n          // NOTE: you MUST set the pressure and size value, or it doesn't work\n          pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(2)\n          val pc2 = MotionEvent.PointerCoords()\n          pc2.x = startPoint.x\n          pc2.y = startPoint.y\n          pc2.pressure = 1f\n          pc2.size = 1f\n          pointerCoords[0] = pc1\n          pointerCoords[1] = pc2\n\n          eventTime += eventMinInterval\n          event = MotionEvent.obtain(\n            startTime, eventTime,\n            MotionEvent.ACTION_POINTER_DOWN + (pp2.id shl MotionEvent.ACTION_POINTER_INDEX_SHIFT), 2,\n            properties, pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n          )\n          injectMotionEventToUiController(uiController, event)\n          interrupted = true\n        }\n      }\n\n      if (!withVelocity) {\n        eventTime += eventMinInterval\n        event = MotionEvent.obtain(\n          startTime, eventTime,\n          MotionEvent.ACTION_MOVE, 1, properties,\n          pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n        )\n        injectMotionEventToUiController(uiController, event)\n      }\n\n      // Step 5\n      eventTime += eventMinInterval\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_UP, 1, properties,\n        pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n    } catch (ex: InjectEventSecurityException) {\n      throw RuntimeException(\"Could not perform quick scale\", ex)\n    }\n  }\n\n  private fun performMove(\n    uiController: UiController,\n    startPoint: PointF,\n    endPoint: PointF,\n    withVelocity: Boolean,\n    duration: Long\n  ) {\n    val eventMinInterval: Long = 10\n    val startTime = SystemClock.uptimeMillis()\n    var eventTime = startTime\n    var event: MotionEvent\n    var eventX1: Float = startPoint.x\n    var eventY1: Float = startPoint.y\n\n    val properties = arrayOfNulls<MotionEvent.PointerProperties>(1)\n    val pp1 = MotionEvent.PointerProperties()\n    pp1.id = 0\n    pp1.toolType = MotionEvent.TOOL_TYPE_FINGER\n    properties[0] = pp1\n\n    val pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(1)\n    val pc1 = MotionEvent.PointerCoords()\n    pc1.x = eventX1\n    pc1.y = eventY1\n    pc1.pressure = 1f\n    pc1.size = 1f\n    pointerCoords[0] = pc1\n\n    /*\n     * Events sequence of move gesture:\n     *\n     * 1. Send ACTION_DOWN\n     * 2. Send ACTION_MOVE with updated middle points (x,y), until reach the end points\n     * 3. Send ACTION_UP\n     */\n    try {\n      // Step 1\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_DOWN, 1, properties,\n        pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n\n      // Step 2\n      val moveEventNumber = duration / eventMinInterval\n\n      val stepX1: Float\n      val stepY1: Float\n\n      stepX1 = (endPoint.x - startPoint.x) / moveEventNumber\n      stepY1 = (endPoint.y - startPoint.y) / moveEventNumber\n\n      for (i in 0 until moveEventNumber) {\n        // Update the move events\n        eventTime += eventMinInterval\n        eventX1 += stepX1\n        eventY1 += stepY1\n\n        pc1.x = eventX1\n        pc1.y = eventY1\n\n        pointerCoords[0] = pc1\n\n        event = MotionEvent.obtain(\n          startTime, eventTime,\n          MotionEvent.ACTION_MOVE, 1, properties,\n          pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n        )\n        injectMotionEventToUiController(uiController, event)\n      }\n\n      if (!withVelocity) {\n        eventTime += eventMinInterval\n        event = MotionEvent.obtain(\n          startTime, eventTime,\n          MotionEvent.ACTION_MOVE, 1, properties,\n          pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n        )\n        injectMotionEventToUiController(uiController, event)\n      }\n\n      // Step 3\n      eventTime += eventMinInterval\n      event = MotionEvent.obtain(\n        startTime, eventTime,\n        MotionEvent.ACTION_UP, 1, properties,\n        pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0\n      )\n      injectMotionEventToUiController(uiController, event)\n    } catch (ex: InjectEventSecurityException) {\n      throw RuntimeException(\"Could not perform quick scale\", ex)\n    }\n  }\n\n  /**\n   * Safely call uiController.injectMotionEvent(event): Detect any error and \"convert\" it to an\n   * IllegalStateException\n   */\n  @Throws(InjectEventSecurityException::class)\n  private fun injectMotionEventToUiController(uiController: UiController, event: MotionEvent) {\n    val injectEventSucceeded = uiController.injectMotionEvent(event)\n    if (!injectEventSucceeded) {\n      throw IllegalStateException(\"Error performing event $event\")\n    }\n  }\n}\n\nfun Int.loopFor(millis: Long) {\n  Espresso.onView(ViewMatchers.withId(this)).perform(object : ViewAction {\n    override fun getDescription(): String = \"waiting for $millis\"\n\n    override fun getConstraints(): Matcher<View> = ViewMatchers.isEnabled()\n\n    override fun perform(uiController: UiController?, view: View?) {\n      uiController?.loopMainThreadForAtLeast(millis)\n    }\n  })\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/gestures/generated/GesturesAttributeParserDefaultValueTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.gestures.generated\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.plugin.ScrollMode\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass GesturesAttributeParserDefaultValueTest : BaseMapTest() {\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"rotateEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().rotateEnabled\n    )\n    assertEquals(\n      \"pinchToZoomEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().pinchToZoomEnabled\n    )\n    assertEquals(\n      \"scrollEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().scrollEnabled\n    )\n    assertEquals(\n      \"simultaneousRotateAndPinchToZoomEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().simultaneousRotateAndPinchToZoomEnabled\n    )\n    assertEquals(\n      \"pitchEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().pitchEnabled\n    )\n    assertEquals(\n      \"scrollMode test failed..\",\n      ScrollMode.HORIZONTAL_AND_VERTICAL,\n      mapView.gestures.getSettings().scrollMode\n    )\n    assertEquals(\n      \"doubleTapToZoomInEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().doubleTapToZoomInEnabled\n    )\n    assertEquals(\n      \"doubleTouchToZoomOutEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().doubleTouchToZoomOutEnabled\n    )\n    assertEquals(\n      \"quickZoomEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().quickZoomEnabled\n    )\n    assertEquals(\n      \"focalPoint test failed..\",\n      null,\n      mapView.gestures.getSettings().focalPoint\n    )\n    assertEquals(\n      \"pinchToZoomDecelerationEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().pinchToZoomDecelerationEnabled\n    )\n    assertEquals(\n      \"rotateDecelerationEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().rotateDecelerationEnabled\n    )\n    assertEquals(\n      \"scrollDecelerationEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().scrollDecelerationEnabled\n    )\n    assertEquals(\n      \"increaseRotateThresholdWhenPinchingToZoom test failed..\",\n      true,\n      mapView.gestures.getSettings().increaseRotateThresholdWhenPinchingToZoom\n    )\n    assertEquals(\n      \"increasePinchToZoomThresholdWhenRotating test failed..\",\n      true,\n      mapView.gestures.getSettings().increasePinchToZoomThresholdWhenRotating\n    )\n    assertEquals(\n      \"zoomAnimationAmount test failed..\",\n      1f,\n      mapView.gestures.getSettings().zoomAnimationAmount\n    )\n    assertEquals(\n      \"pinchScrollEnabled test failed..\",\n      true,\n      mapView.gestures.getSettings().pinchScrollEnabled\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/gestures/generated/GesturesAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.gestures.generated\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.R\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.ScrollMode\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass GesturesAttributeParserTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_gestures)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"rotateEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().rotateEnabled\n    )\n    assertEquals(\n      \"pinchToZoomEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().pinchToZoomEnabled\n    )\n    assertEquals(\n      \"scrollEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().scrollEnabled\n    )\n    assertEquals(\n      \"simultaneousRotateAndPinchToZoomEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().simultaneousRotateAndPinchToZoomEnabled\n    )\n    assertEquals(\n      \"pitchEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().pitchEnabled\n    )\n    assertEquals(\n      \"scrollMode test failed..\",\n      ScrollMode.HORIZONTAL_AND_VERTICAL,\n      mapView.gestures.getSettings().scrollMode\n    )\n    assertEquals(\n      \"doubleTapToZoomInEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().doubleTapToZoomInEnabled\n    )\n    assertEquals(\n      \"doubleTouchToZoomOutEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().doubleTouchToZoomOutEnabled\n    )\n    assertEquals(\n      \"quickZoomEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().quickZoomEnabled\n    )\n    assertEquals(\n      \"focalPoint test failed..\",\n      ScreenCoordinate(10.0, 20.0),\n      mapView.gestures.getSettings().focalPoint\n    )\n    assertEquals(\n      \"pinchToZoomDecelerationEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().pinchToZoomDecelerationEnabled\n    )\n    assertEquals(\n      \"rotateDecelerationEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().rotateDecelerationEnabled\n    )\n    assertEquals(\n      \"scrollDecelerationEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().scrollDecelerationEnabled\n    )\n    assertEquals(\n      \"increaseRotateThresholdWhenPinchingToZoom test failed..\",\n      false,\n      mapView.gestures.getSettings().increaseRotateThresholdWhenPinchingToZoom\n    )\n    assertEquals(\n      \"increasePinchToZoomThresholdWhenRotating test failed..\",\n      false,\n      mapView.gestures.getSettings().increasePinchToZoomThresholdWhenRotating\n    )\n    assertEquals(\n      \"zoomAnimationAmount test failed..\",\n      0.9f,\n      mapView.gestures.getSettings().zoomAnimationAmount\n    )\n    assertEquals(\n      \"pinchScrollEnabled test failed..\",\n      false,\n      mapView.gestures.getSettings().pinchScrollEnabled\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/BaseReuseIntegrationTest.kt",
    "content": "package com.mapbox.maps.testapp.integration\n\nimport android.app.Activity\nimport android.view.KeyEvent\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.filters.LargeTest\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.test.uiautomator.UiDevice\nimport org.junit.Rule\nimport org.junit.Test\n\nabstract class BaseReuseIntegrationTest(activityClass: Class<out Activity>) {\n  protected val device: UiDevice by lazy { UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) }\n  private val testRepeatCount = 5\n\n  @get:Rule\n  var activityRule = ActivityScenarioRule(activityClass)\n\n  @Test\n  @LargeTest\n  fun reopenActivityWithHomeButton() {\n    repeat(testRepeatCount) {\n      device.waitForIdle()\n      device.pressHome()\n      device.waitForIdle()\n      // double click restores last opened application\n      device.pressKeyCode(KeyEvent.KEYCODE_APP_SWITCH)\n      device.waitForIdle()\n      device.pressKeyCode(KeyEvent.KEYCODE_APP_SWITCH)\n      // some time to set things up\n      Thread.sleep(1_000L)\n    }\n  }\n\n  @Test\n  @LargeTest\n  fun reopenActivityWithPowerButton() {\n    repeat(testRepeatCount) {\n      device.waitForIdle()\n      device.sleep()\n      Thread.sleep(2_000)\n      device.waitForIdle()\n      device.wakeUp()\n      Thread.sleep(2_000)\n    }\n  }\n\n  @Test\n  @LargeTest\n  fun rotateActivity() {\n    device.waitForIdle()\n    device.setOrientationLeft()\n    Thread.sleep(1_000)\n    device.waitForIdle()\n    device.setOrientationNatural()\n    Thread.sleep(1_000)\n    device.waitForIdle()\n    device.setOrientationRight()\n    Thread.sleep(1_000)\n    device.waitForIdle()\n    device.setOrientationNatural()\n    Thread.sleep(1_000)\n    device.waitForIdle()\n    device.setOrientationLeft()\n    Thread.sleep(1_000)\n    device.waitForIdle()\n    device.setOrientationNatural()\n    Thread.sleep(1_000)\n    device.waitForIdle()\n    device.setOrientationRight()\n    Thread.sleep(1_000)\n    device.waitForIdle()\n    device.setOrientationNatural()\n    Thread.sleep(1_000)\n    device.waitForIdle()\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/events/StyleLoadedEventTest.kt",
    "content": "package com.mapbox.maps.testapp.integration.events\n\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.R\nimport com.mapbox.maps.testapp.EmptyActivity\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Test that the style loaded event is fired even when the sprites loading is failed.\n */\n@RunWith(AndroidJUnit4::class)\nclass StyleLoadedEventTest {\n  @get:Rule\n  var rule: ActivityScenarioRule<EmptyActivity> = ActivityScenarioRule(EmptyActivity::class.java)\n\n  lateinit var mapView: MapView\n  lateinit var countDownLatch: CountDownLatch\n\n  @Before\n  fun setUp() {\n    rule.scenario.onActivity {\n      mapView = MapView(it)\n      mapView.id = R.id.mapView\n      it.setContentView(mapView)\n    }\n  }\n\n  @After\n  fun cleanUp() {\n    rule.scenario.onActivity {\n      mapView.onStop()\n      mapView.onDestroy()\n    }\n  }\n\n  @Test\n  fun testStyleLoadedEventWhenSpritesLoadFails() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      mapView.mapboxMap.loadStyle(\n        \"\"\"\n      {\n        \"version\": 8,\n        \"name\": \"Land\",\n        \"metadata\": {\n          \"mapbox:autocomposite\": true\n        },\n        \"sources\": {\n          \"composite\": {\n            \"url\": \"mapbox://mapbox.mapbox-terrain-v2\",\n            \"type\": \"vector\"\n          }\n        },\n        \"glyphs\": \"mapbox://fonts/mapbox/{fontstack}/{range}.pbf\",\n        \"layers\": [\n          {\n            \"layout\": {\n              \"visibility\": \"visible\"\n            },\n            \"type\": \"fill\",\n            \"source\": \"composite\",\n            \"id\": \"admin\",\n            \"paint\": {\n              \"fill-color\": \"hsl(359, 100%, 50%)\",\n              \"fill-opacity\": 1\n            },\n            \"source-layer\": \"landcover\"\n          },\n          {\n            \"layout\": {\n              \"visibility\": \"visible\"\n            },\n            \"type\": \"fill\",\n            \"source\": \"composite\",\n            \"id\": \"layer-0\",\n            \"paint\": {\n              \"fill-opacity\": 1,\n              \"fill-color\": \"hsl(359, 100%, 50%)\"\n            },\n            \"source-layer\": \"Layer_0\"\n          }\n        ]\n      }\n        \"\"\".trimIndent()\n      ) {\n        countDownLatch.countDown()\n      }\n      mapView.onStart()\n    }\n\n    if (!countDownLatch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/fragment/EmptyFragment.kt",
    "content": "package com.mapbox.maps.testapp.integration.fragment\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.fragment.app.Fragment\n\nclass EmptyFragment : Fragment() {\n\n  var onViewCreated: OnFragmentResumed? = null\n\n  override fun onCreateView(\n    inflater: LayoutInflater,\n    container: ViewGroup?,\n    savedInstanceState: Bundle?\n  ): View? {\n    val view = FrameLayout(inflater.context)\n    view.setBackgroundColor(android.R.color.white)\n    return view\n  }\n\n  override fun onResume() {\n    super.onResume()\n    onViewCreated?.onResume()\n  }\n\n  fun interface OnFragmentResumed {\n    fun onResume()\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/fragment/FragmentScenarioTest.kt",
    "content": "package com.mapbox.maps.testapp.integration.fragment\n\nimport androidx.fragment.app.testing.launchFragmentInContainer\nimport androidx.lifecycle.Lifecycle\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Integration tests using fragment and the AndroidX fragment test library.\n */\n@RunWith(AndroidJUnit4::class)\nclass FragmentScenarioTest {\n\n  @Test\n  fun resumed() {\n    val latch = CountDownLatch(1)\n    val scenario = launchFragmentInContainer<MapFragment>()\n    scenario.onFragment {\n      it.activity!!.runOnUiThread {\n        it.loadMap {\n          latch.countDown()\n        }\n      }\n    }\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @Test\n  fun backToCreated() {\n    val latch = CountDownLatch(1)\n    val scenario = launchFragmentInContainer<MapFragment>()\n    scenario.onFragment {\n      it.activity!!.runOnUiThread {\n        it.loadMap {\n          latch.countDown()\n        }\n      }\n    }\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    scenario.moveToState(Lifecycle.State.CREATED)\n  }\n\n  @Test\n  fun backToResumed() {\n    val latch = CountDownLatch(1)\n    val scenario = launchFragmentInContainer<MapFragment>()\n    scenario.onFragment {\n      it.activity!!.runOnUiThread {\n        it.loadMap {\n          latch.countDown()\n        }\n      }\n    }\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    scenario.moveToState(Lifecycle.State.CREATED)\n    scenario.moveToState(Lifecycle.State.RESUMED)\n  }\n\n  @Test\n  fun recreated() {\n    val latch = CountDownLatch(1)\n    val scenario = launchFragmentInContainer<MapFragment>()\n    scenario.onFragment {\n      it.activity!!.runOnUiThread {\n        it.loadMap {\n          latch.countDown()\n        }\n      }\n    }\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    scenario.recreate()\n  }\n\n  @Test\n  fun destroyed() {\n    val latch = CountDownLatch(1)\n    val scenario = launchFragmentInContainer<MapFragment>()\n    scenario.onFragment {\n      it.activity!!.runOnUiThread {\n        it.loadMap {\n          latch.countDown()\n        }\n      }\n    }\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    scenario.moveToState(Lifecycle.State.DESTROYED)\n  }\n\n  @Test\n  fun stressTestRecreate() {\n    val latch = CountDownLatch(1)\n    val scenario = launchFragmentInContainer<MapFragment>()\n    scenario.onFragment {\n      it.activity!!.runOnUiThread {\n        it.loadMap {\n          latch.countDown()\n        }\n      }\n    }\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    repeat(10) {\n      scenario.recreate()\n    }\n  }\n\n  @Test\n  fun stressTestRecreateWithLoad() {\n    val scenario = launchFragmentInContainer<MapFragment>()\n    repeat(10) {\n      val latch = CountDownLatch(1)\n      scenario.onFragment {\n        it.activity!!.runOnUiThread {\n          it.loadMap {\n            latch.countDown()\n          }\n        }\n      }\n      if (!latch.await(10, TimeUnit.SECONDS)) {\n        throw TimeoutException()\n      }\n      scenario.recreate()\n    }\n  }\n\n  @Test\n  fun stressTestResumed() {\n    val scenario = launchFragmentInContainer<MapFragment>()\n    scenario.recreate()\n    repeat(20) {\n      scenario.moveToState(Lifecycle.State.CREATED)\n      scenario.moveToState(Lifecycle.State.RESUMED)\n    }\n    scenario.recreate()\n    scenario.moveToState(Lifecycle.State.DESTROYED)\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/fragment/FragmentTest.kt",
    "content": "package com.mapbox.maps.testapp.integration.fragment\n\nimport android.R\nimport android.widget.FrameLayout\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentTransaction\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport com.mapbox.maps.testapp.EmptyActivity\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Integration test for fragments\n */\nclass FragmentTest {\n\n  @get:Rule\n  var rule: ActivityScenarioRule<EmptyActivity> = ActivityScenarioRule(EmptyActivity::class.java)\n\n  lateinit var container: FrameLayout\n  lateinit var countDownLatch: CountDownLatch\n\n  @Before\n  fun setUp() {\n    rule.scenario.onActivity {\n      container = FrameLayout(it)\n      container.id = R.id.content\n      it.setContentView(container)\n    }\n  }\n\n  @Test\n  fun transactionAdd() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      val fragment = addMapFragment(it)\n      fragment.getViewAsync {\n        fragment.loadMap {\n          countDownLatch.countDown()\n        }\n      }\n    }\n    if (!countDownLatch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @Test\n  fun transactionRemove() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      val fragment = addMapFragment(it)\n      fragment.getViewAsync {\n        fragment.loadMap {\n          val fragmentTransaction = it.supportFragmentManager.beginTransaction()\n          fragmentTransaction.remove(fragment)\n          fragmentTransaction.commit()\n          countDownLatch.countDown()\n        }\n      }\n    }\n    if (!countDownLatch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @Test\n  fun transactionReplace() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      val fragment = addMapFragment(it)\n      fragment.getViewAsync {\n        fragment.loadMap {\n          val emptyFragment = EmptyFragment()\n          emptyFragment.onViewCreated = EmptyFragment.OnFragmentResumed {\n            countDownLatch.countDown()\n          }\n          val fragmentTransaction = it.supportFragmentManager.beginTransaction()\n          fragmentTransaction.replace(R.id.content, emptyFragment)\n          fragmentTransaction.commit()\n        }\n      }\n    }\n    if (!countDownLatch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @Test\n  fun transactionBackstack() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      val fragment = addMapFragment(it)\n      fragment.getViewAsync {\n        fragment.loadMap {\n          val mapFragment = MapFragment()\n          val fragmentTransaction: FragmentTransaction = it.supportFragmentManager.beginTransaction()\n          fragmentTransaction.replace(R.id.content, mapFragment)\n          fragmentTransaction.addToBackStack(FRAGMENT_TAG)\n          fragmentTransaction.commit()\n\n          mapFragment.getViewAsync {\n            mapFragment.loadMap {\n              it.supportFragmentManager.popBackStack(FRAGMENT_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)\n              countDownLatch.countDown()\n            }\n          }\n        }\n      }\n    }\n    if (!countDownLatch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  private fun addMapFragment(activity: AppCompatActivity): MapFragment {\n    val fragment = MapFragment()\n    val fragmentTransaction: FragmentTransaction =\n      activity.supportFragmentManager.beginTransaction()\n    fragmentTransaction.add(R.id.content, fragment)\n    fragmentTransaction.commit()\n    return fragment\n  }\n\n  companion object {\n    const val FRAGMENT_TAG = \"foo\"\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/fragment/MapFragment.kt",
    "content": "package com.mapbox.maps.testapp.integration.fragment\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\n\nclass MapFragment : Fragment() {\n\n  private var viewCreated: OnViewCreated? = null\n  lateinit var mapView: MapView\n\n  override fun onCreateView(\n    inflater: LayoutInflater,\n    container: ViewGroup?,\n    savedInstanceState: Bundle?\n  ): View {\n    mapView = MapView(inflater.context)\n    return mapView\n  }\n\n  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n    super.onViewCreated(view, savedInstanceState)\n    viewCreated?.onViewCreated()\n  }\n\n  override fun onStart() {\n    super.onStart()\n    mapView.onStart()\n  }\n\n  override fun onStop() {\n    super.onStop()\n    mapView.onStop()\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    mapView.onDestroy()\n  }\n\n  fun getViewAsync(onViewCreated: OnViewCreated) {\n    this.viewCreated = onViewCreated\n  }\n\n  fun loadMap(idleListener: OnMapIdle) {\n    val map = mapView.mapboxMap\n    map.loadStyle(Style.MAPBOX_STREETS)\n    map.subscribeMapIdle {\n      idleListener.onIdle()\n    }\n  }\n\n  fun interface OnViewCreated {\n    fun onViewCreated()\n  }\n\n  fun interface OnMapIdle {\n    fun onIdle()\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/surface/MapViewSurfaceModeTest.kt",
    "content": "package com.mapbox.maps.testapp.integration.surface\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.testapp.examples.SimpleMapActivity\nimport com.mapbox.maps.testapp.integration.BaseReuseIntegrationTest\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\nclass MapViewSurfaceModeTest : BaseReuseIntegrationTest(SimpleMapActivity::class.java)"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/surface/MapViewSurfaceModeWithRecyclerViewTest.kt",
    "content": "package com.mapbox.maps.testapp.integration.surface\n\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.ViewAssertion\nimport androidx.test.espresso.assertion.ViewAssertions.doesNotExist\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.matcher.ViewMatchers.isDisplayed\nimport androidx.test.espresso.matcher.ViewMatchers.withClassName\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.uiautomator.By\nimport androidx.test.uiautomator.Direction\nimport androidx.test.uiautomator.UiObject2\nimport com.mapbox.maps.testapp.examples.SurfaceRecyclerViewActivity\nimport com.mapbox.maps.testapp.integration.BaseReuseIntegrationTest\nimport org.hamcrest.core.Is\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Regression test that validates if a SurfaceView surface in a recycler view can be recreated\n * without crashing.\n */\n@RunWith(AndroidJUnit4::class)\nclass MapViewSurfaceModeWithRecyclerViewTest : BaseReuseIntegrationTest(SurfaceRecyclerViewActivity::class.java) {\n\n  @Test\n  @LargeTest\n  fun scrollSurfaceRecyclerView() {\n    // wait extra seconds to make sure recycler view is indeed added to hierarchy\n    Thread.sleep(2_000)\n    device.waitForIdle()\n    val recyclerObject = By.clazz(RecyclerView::class.java)\n    val recyclerView: UiObject2 = device.findObject(recyclerObject)\n    // we set gesture margin to keep touches at least 100 pixels away from the edges\n    recyclerView.setGestureMargin(100)\n    repeat(2) {\n      onMapView(matches(isDisplayed()))\n      recyclerView.scroll(Direction.DOWN, 100.0f)\n      device.waitForIdle()\n      onMapView(doesNotExist())\n      recyclerView.scroll(Direction.UP, 100.0f)\n      device.waitForIdle()\n      // Repeat up. Sometimes it didn't scroll all the way to first row\n      recyclerView.scroll(Direction.UP, 100.0f)\n      device.waitForIdle()\n      onMapView(matches(isDisplayed()))\n    }\n  }\n\n  private fun onMapView(matches: ViewAssertion?) {\n    onView(withClassName(Is.`is`(\"com.mapbox.maps.MapView\")))\n      .check(matches)\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/surface/SurfaceTest.kt",
    "content": "package com.mapbox.maps.testapp.integration.surface\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.testapp.examples.SurfaceActivity\nimport com.mapbox.maps.testapp.integration.BaseReuseIntegrationTest\nimport org.junit.runner.RunWith\n\n/**\n * Regression test that validates reopening an Activity with a surface using ContextMode.SHARED\n */\n@RunWith(AndroidJUnit4::class)\nclass SurfaceTest : BaseReuseIntegrationTest(SurfaceActivity::class.java)"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/integration/texture/MapViewTextureModeTest.kt",
    "content": "package com.mapbox.maps.testapp.integration.texture\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.testapp.examples.TextureViewActivity\nimport com.mapbox.maps.testapp.integration.BaseReuseIntegrationTest\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\nclass MapViewTextureModeTest : BaseReuseIntegrationTest(TextureViewActivity::class.java)"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/locationcomponent/generated/LocationComponentAttributeParserDefaultValueTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.locationcomponent.generated\n\nimport android.graphics.Color\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass LocationComponentAttributeParserDefaultValueTest : BaseMapTest() {\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      false,\n      mapView.location.getSettings().enabled\n    )\n    assertEquals(\n      \"pulsingEnabled test failed..\",\n      false,\n      mapView.location.getSettings().pulsingEnabled\n    )\n    assertEquals(\n      \"pulsingColor test failed..\",\n      Color.parseColor(\"#4A90E2\"),\n      mapView.location.getSettings().pulsingColor\n    )\n    assertEquals(\n      \"pulsingMaxRadius test failed..\",\n      10f * pixelRatio,\n      mapView.location.getSettings().pulsingMaxRadius\n    )\n    assertEquals(\n      \"showAccuracyRing test failed..\",\n      false,\n      mapView.location.getSettings().showAccuracyRing\n    )\n    assertEquals(\n      \"accuracyRingColor test failed..\",\n      Color.parseColor(\"#4d89cff0\"),\n      mapView.location.getSettings().accuracyRingColor\n    )\n    assertEquals(\n      \"accuracyRingBorderColor test failed..\",\n      Color.parseColor(\"#4d89cff0\"),\n      mapView.location.getSettings().accuracyRingBorderColor\n    )\n    assertEquals(\n      \"layerAbove test failed..\",\n      null,\n      mapView.location.getSettings().layerAbove\n    )\n    assertEquals(\n      \"layerBelow test failed..\",\n      null,\n      mapView.location.getSettings().layerBelow\n    )\n    assertEquals(\n      \"puckBearingEnabled test failed..\",\n      false,\n      mapView.location.getSettings().puckBearingEnabled\n    )\n    assertEquals(\n      \"puckBearing test failed..\",\n      PuckBearing.HEADING,\n      mapView.location.getSettings().puckBearing\n    )\n    assertEquals(\n      \"slot test failed..\",\n      null,\n      mapView.location.getSettings().slot\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/locationcomponent/generated/LocationComponentAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.locationcomponent.generated\n\nimport android.graphics.Color\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.R\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass LocationComponentAttributeParserTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_locationcomponent)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      false,\n      mapView.location.getSettings().enabled\n    )\n    assertEquals(\n      \"pulsingEnabled test failed..\",\n      false,\n      mapView.location.getSettings().pulsingEnabled\n    )\n    assertEquals(\n      \"pulsingColor test failed..\",\n      Color.BLACK,\n      mapView.location.getSettings().pulsingColor\n    )\n    assertEquals(\n      \"pulsingMaxRadius test failed..\",\n      10.0f * pixelRatio,\n      mapView.location.getSettings().pulsingMaxRadius\n    )\n    assertEquals(\n      \"showAccuracyRing test failed..\",\n      false,\n      mapView.location.getSettings().showAccuracyRing\n    )\n    assertEquals(\n      \"accuracyRingColor test failed..\",\n      Color.BLACK,\n      mapView.location.getSettings().accuracyRingColor\n    )\n    assertEquals(\n      \"accuracyRingBorderColor test failed..\",\n      Color.BLACK,\n      mapView.location.getSettings().accuracyRingBorderColor\n    )\n    assertEquals(\n      \"layerAbove test failed..\",\n      \"testString\",\n      mapView.location.getSettings().layerAbove\n    )\n    assertEquals(\n      \"layerBelow test failed..\",\n      \"testString\",\n      mapView.location.getSettings().layerBelow\n    )\n    assertEquals(\n      \"puckBearingEnabled test failed..\",\n      false,\n      mapView.location.getSettings().puckBearingEnabled\n    )\n    assertEquals(\n      \"puckBearing test failed..\",\n      PuckBearing.HEADING,\n      mapView.location.getSettings().puckBearing\n    )\n    assertEquals(\n      \"slot test failed..\",\n      \"testString\",\n      mapView.location.getSettings().slot\n    )\n    // TODO, test for location puck.\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/logo/generated/LogoAttributeParserDefaultValueTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.logo.generated\n\nimport android.view.Gravity\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.plugin.logo.logo\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass LogoAttributeParserDefaultValueTest : BaseMapTest() {\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      true,\n      mapView.logo.getSettings().enabled\n    )\n    assertEquals(\n      \"position test failed..\",\n      Gravity.BOTTOM or Gravity.START,\n      mapView.logo.getSettings().position\n    )\n    assertEquals(\n      \"marginLeft test failed..\",\n      4f * pixelRatio,\n      mapView.logo.getSettings().marginLeft\n    )\n    assertEquals(\n      \"marginTop test failed..\",\n      4f * pixelRatio,\n      mapView.logo.getSettings().marginTop\n    )\n    assertEquals(\n      \"marginRight test failed..\",\n      4f * pixelRatio,\n      mapView.logo.getSettings().marginRight\n    )\n    assertEquals(\n      \"marginBottom test failed..\",\n      4f * pixelRatio,\n      mapView.logo.getSettings().marginBottom\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/logo/generated/LogoAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.logo.generated\n\nimport android.view.Gravity\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.R\nimport com.mapbox.maps.plugin.logo.logo\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass LogoAttributeParserTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_logo)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      false,\n      mapView.logo.getSettings().enabled\n    )\n    assertEquals(\n      \"position test failed..\",\n      Gravity.BOTTOM or Gravity.END,\n      mapView.logo.getSettings().position\n    )\n    assertEquals(\n      \"marginLeft test failed..\",\n      10.0f * pixelRatio,\n      mapView.logo.getSettings().marginLeft\n    )\n    assertEquals(\n      \"marginTop test failed..\",\n      10.0f * pixelRatio,\n      mapView.logo.getSettings().marginTop\n    )\n    assertEquals(\n      \"marginRight test failed..\",\n      10.0f * pixelRatio,\n      mapView.logo.getSettings().marginRight\n    )\n    assertEquals(\n      \"marginBottom test failed..\",\n      10.0f * pixelRatio,\n      mapView.logo.getSettings().marginBottom\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/observable/ObservableEventsTest.kt",
    "content": "package com.mapbox.maps.testapp.observable\n\nimport androidx.annotation.UiThread\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.bindgen.DataRef\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.BaseMapTest\nimport com.mapbox.maps.testapp.R\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass ObservableEventsTest : BaseMapTest() {\n\n  private val targetCameraOptions =\n    CameraOptions.Builder().center(Point.fromLngLat(0.0, 0.0)).zoom(16.0).build()\n\n  private lateinit var cancelable: Cancelable\n\n  @Before\n  fun setUp() {\n    super.before()\n  }\n\n  private fun loadTestStyle(styleUri: String = Style.MAPBOX_STREETS) {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.loadStyle(styleUri) { style ->\n          this.style = style\n        }\n        mapView.onStart()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeResourceRequest() {\n    val latch = CountDownLatch(1)\n\n    val resourceRequestCallback = ResourceRequestCallback { event ->\n      assertNotNull(event.request)\n      assertNotNull(event.timeInterval.begin)\n      assertNotNull(event.timeInterval.end)\n      cancelable.cancel()\n      latch.countDown()\n    }\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        cancelable = mapboxMap.subscribeResourceRequest(resourceRequestCallback)\n        mapboxMap.setCamera(targetCameraOptions)\n      }\n    }\n    loadTestStyle()\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeMapLoadedEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = MapLoadedCallback {\n      assertNotNull(it.timeInterval.begin)\n      assertNotNull(it.timeInterval.end)\n      latch.countDown()\n    }\n\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeMapLoaded(listener)\n          setCamera(targetCameraOptions)\n        }\n      }\n    }\n    loadTestStyle()\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeMapLoadingErrorEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = MapLoadingErrorCallback { eventData ->\n      assertNotNull(eventData.type)\n      assertNotNull(eventData.message)\n      assertNotNull(eventData.timestamp.time)\n      assertEquals(MapLoadingErrorType.STYLE, eventData.type)\n      assertEquals(\n        \"Failed to load style 'https://wrongurl': Couldn't connect to server: Exception in CronetUrlRequest: net::ERR_NAME_NOT_RESOLVED, ErrorCode=1, InternalErrorCode=-105, Retryable=false\",\n        eventData.message\n      )\n      latch.countDown()\n    }\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeMapLoadingError(listener)\n        }\n      }\n    }\n    loadTestStyle(\"https://wrongurl\")\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeMapIdleEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = MapIdleCallback {\n      assertNotNull(it.timestamp.time)\n      latch.countDown()\n    }\n\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeMapIdle(listener)\n          setCamera(targetCameraOptions)\n        }\n      }\n    }\n    loadTestStyle()\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeStyleDataLoadedEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = StyleDataLoadedCallback {\n      assertNotNull(it.type)\n      assertNotNull(it.timeInterval.begin)\n      assertNotNull(it.timeInterval.end)\n      latch.countDown()\n    }\n\n    loadTestStyle()\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeStyleDataLoaded(listener)\n          setCamera(targetCameraOptions)\n        }\n      }\n    }\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeStyleLoadedEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = StyleLoadedCallback {\n      assertNotNull(it.timeInterval.begin)\n      assertNotNull(it.timeInterval.end)\n      latch.countDown()\n    }\n\n    loadTestStyle()\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeStyleLoaded(listener)\n          setCamera(targetCameraOptions)\n        }\n      }\n    }\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeStyleImageMissingEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = StyleImageMissingCallback {\n      assertNotNull(it.timestamp.time)\n      assertEquals(IMAGE_ID, it.imageId)\n      latch.countDown()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeStyleImageMissing(listener)\n          setCamera(targetCameraOptions)\n          loadStyle(\n            style(Style.MAPBOX_STREETS) {\n              +geoJsonSource(SOURCE_ID) {\n                geometry(Point.fromLngLat(0.0, 0.0))\n              }\n              +symbolLayer(LAYER_ID, SOURCE_ID) {\n                iconImage(IMAGE_ID)\n              }\n            }\n          )\n        }\n      }\n    }\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeStyleImageRemoveUnusedEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = StyleImageRemoveUnusedCallback {\n      assertNotNull(it.timestamp.time)\n      assertEquals(IMAGE_ID, it.imageId)\n      latch.countDown()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        mapboxMap.apply {\n          setCamera(targetCameraOptions)\n          cancelable = subscribeStyleImageMissing {\n            getStyle {\n              it.addImage(IMAGE_ID, Image(2048, 2048, DataRef.allocateNative(2048 * 2048 * 4)))\n              setCamera(cameraOptions { center(Point.fromLngLat(60.1733244, 24.9410248)) })\n            }\n          }\n          subscribeStyleImageRemoveUnused(listener)\n          loadStyle(\n            style(Style.MAPBOX_STREETS) {\n              +geoJsonSource(SOURCE_ID) {\n                geometry(Point.fromLngLat(0.0, 0.0))\n              }\n              +symbolLayer(LAYER_ID, SOURCE_ID) {\n                iconImage(IMAGE_ID)\n              }\n            }\n          )\n        }\n      }\n    }\n\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeSourceDataLoadedEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = SourceDataLoadedCallback { eventData ->\n      assertNotNull(eventData.sourceId)\n      assertNotNull(eventData.type)\n      assertNotNull(eventData.timeInterval.begin)\n      assertNotNull(eventData.timeInterval.end)\n      latch.countDown()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setCamera(targetCameraOptions)\n          loadTestStyle()\n        }\n      }\n    }\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeSourceAddedEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = SourceAddedCallback {\n      assertNotNull(it.timestamp.time)\n      assertEquals(SOURCE_ID, it.sourceId)\n      latch.countDown()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeSourceAdded(listener)\n          setCamera(targetCameraOptions)\n          loadStyle(\n            style(Style.MAPBOX_STREETS) {\n              +image(\n                IMAGE_ID,\n                ContextCompat.getDrawable(\n                  activity,\n                  R.drawable.ic_blue_marker\n                )!!.toBitmap()\n              )\n              +geoJsonSource(SOURCE_ID) {\n                geometry(Point.fromLngLat(0.0, 0.0))\n              }\n              +symbolLayer(LAYER_ID, SOURCE_ID) {\n                iconImage(IMAGE_ID)\n              }\n            }\n          )\n        }\n      }\n    }\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  fun subscribeSourceRemovedEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = SourceRemovedCallback {\n      assertNotNull(it.timestamp.time)\n      assertEquals(SOURCE_ID, it.sourceId)\n      latch.countDown()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeSourceRemoved(listener)\n          setCamera(targetCameraOptions)\n          loadStyle(\n            style(Style.MAPBOX_STREETS) {\n              +image(\n                IMAGE_ID,\n                ContextCompat.getDrawable(\n                  activity,\n                  R.drawable.ic_blue_marker\n                )!!.toBitmap()\n              )\n              +geoJsonSource(SOURCE_ID) {\n                geometry(Point.fromLngLat(0.0, 0.0))\n              }\n              +symbolLayer(LAYER_ID, SOURCE_ID) {\n                iconImage(IMAGE_ID)\n              }\n            }\n          )\n          subscribeMapIdle {\n            getStyle { style ->\n              style.removeStyleLayer(LAYER_ID)\n              style.removeStyleSource(SOURCE_ID)\n            }\n          }\n        }\n      }\n    }\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  @UiThread\n  fun subscribeRenderFrameStartedEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = RenderFrameStartedCallback {\n      assertNotNull(it.timestamp.time)\n      latch.countDown()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeRenderFrameStarted(listener)\n          setCamera(targetCameraOptions)\n        }\n      }\n    }\n    loadTestStyle()\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @Test\n  @UiThread\n  fun subscribeRenderFrameFinishedEvent() {\n    val latch = CountDownLatch(1)\n\n    val listener = RenderFrameFinishedCallback { eventData ->\n      assertNotNull(eventData.timeInterval.begin)\n      assertNotNull(eventData.timeInterval.end)\n      assertNotNull(eventData.renderMode)\n      assertNotNull(eventData.needsRepaint)\n      assertNotNull(eventData.placementChanged)\n      latch.countDown()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        mapboxMap.apply {\n          cancelable = subscribeRenderFrameFinished(listener)\n          setCamera(targetCameraOptions)\n        }\n      }\n    }\n    loadTestStyle()\n    if (!latch.await(20000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        cancelable.cancel()\n      }\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  @UiThread\n  fun subscribeCameraChangedEvent() {\n    var latch = CountDownLatch(2)\n    val targetCameraOptions2 = cameraOptions {\n        center(Point.fromLngLat(1.0, 2.0))\n        zoom(16.0)\n        bearing(18.0)\n        pitch(85.0)\n        anchor(ScreenCoordinate(1.0, 2.0))\n        padding(EdgeInsets(1.0, 2.0, 3.0, 4.0))\n      }\n\n    val cameraChangedResults = mutableListOf<CameraChanged>()\n    val listener = CameraChangedCallback {\n      cameraChangedResults.add(it)\n      latch.countDown()\n    }\n\n    val coalescedLatch = CountDownLatch(1)\n    val cameraChangedCoalescedResults = mutableListOf<CameraChangedCoalesced>()\n    val listenerCoalesced = CameraChangedCoalescedCallback {\n      cameraChangedCoalescedResults.add(it)\n      coalescedLatch.countDown()\n    }\n\n    var cancelableCoalesced: Cancelable? = null\n\n    try {\n      rule.scenario.onActivity { activity ->\n        activity.runOnUiThread {\n          mapboxMap.apply {\n            cancelable = subscribeCameraChanged(listener)\n            cancelableCoalesced = subscribeCameraChangedCoalesced(listenerCoalesced)\n            setCamera(targetCameraOptions)\n            setCamera(targetCameraOptions2)\n          }\n        }\n      }\n      loadTestStyle()\n\n      // For normal camera changed events we should get 2 events (same as `setCamera` calls)\n      assertTrue(latch.await(20_000, TimeUnit.MILLISECONDS))\n      assertEquals(2, cameraChangedResults.size)\n      assertNotNull(cameraChangedResults[0].timestamp.time)\n      with(cameraChangedResults[0].cameraState) {\n        assertEquals(targetCameraOptions.center!!.longitude(), center.longitude(), EPS)\n        assertEquals(targetCameraOptions.center!!.latitude(), center.latitude(), EPS)\n        assertEquals(targetCameraOptions.zoom, zoom)\n      }\n      with(cameraChangedResults[1].cameraState) {\n        assertEquals(targetCameraOptions2.center!!.longitude(), center.longitude(), EPS)\n        assertEquals(targetCameraOptions2.center!!.latitude(), center.latitude(), EPS)\n        assertEquals(targetCameraOptions2.zoom, zoom)\n        assertEquals(targetCameraOptions2.bearing, bearing)\n        assertEquals(targetCameraOptions2.pitch, pitch)\n        assertEquals(targetCameraOptions2.anchor, ScreenCoordinate(1.0, 2.0))\n        assertEquals(targetCameraOptions2.padding, EdgeInsets(1.0, 2.0, 3.0, 4.0))\n      }\n\n      // We should only get one coalesced event instead of 2 like the normal camera changed event\n      assertEquals(1, cameraChangedCoalescedResults.size)\n      assertNotNull(cameraChangedCoalescedResults[0].timestamp.time)\n      with(cameraChangedCoalescedResults[0].cameraState) {\n        assertEquals(targetCameraOptions2.center!!.longitude(), center.longitude(), EPS)\n        assertEquals(targetCameraOptions2.center!!.latitude(), center.latitude(), EPS)\n        assertEquals(targetCameraOptions2.zoom, zoom)\n        assertEquals(targetCameraOptions2.bearing, bearing)\n        assertEquals(targetCameraOptions2.pitch, pitch)\n        assertEquals(targetCameraOptions2.anchor, ScreenCoordinate(1.0, 2.0))\n        assertEquals(targetCameraOptions2.padding, EdgeInsets(1.0, 2.0, 3.0, 4.0))\n      }\n\n      latch = CountDownLatch(1)\n      rule.scenario.onActivity { activity ->\n        activity.runOnUiThread {\n          mapboxMap.apply {\n            setCamera(targetCameraOptions2)\n          }\n        }\n      }\n      assertTrue(latch.await(20_000, TimeUnit.MILLISECONDS))\n      assertEquals(3, cameraChangedResults.size)\n      assertNotNull(cameraChangedResults[2].timestamp.time)\n      with(cameraChangedResults[2].cameraState) {\n        assertEquals(targetCameraOptions2.center!!.longitude(), center.longitude(), EPS)\n        assertEquals(targetCameraOptions2.center!!.latitude(), center.latitude(), EPS)\n        assertEquals(targetCameraOptions2.zoom, zoom)\n        assertEquals(targetCameraOptions2.bearing, bearing)\n        assertEquals(targetCameraOptions2.pitch, pitch)\n        assertEquals(targetCameraOptions2.anchor, ScreenCoordinate(1.0, 2.0))\n        assertEquals(targetCameraOptions2.padding, EdgeInsets(1.0, 2.0, 3.0, 4.0))\n      }\n\n      // The camera changed coalesced event should not be called again because we pushed the same\n      // camera than last time.\n      assertEquals(1, cameraChangedCoalescedResults.size)\n    } finally {\n      rule.scenario.onActivity { activity ->\n        activity.runOnUiThread {\n          cancelable.cancel()\n          cancelableCoalesced?.cancel()\n        }\n      }\n    }\n  }\n\n  companion object {\n    private const val EPS = 0.0001\n    private const val LAYER_ID = \"layer_id\"\n    private const val SOURCE_ID = \"source_id\"\n    private const val IMAGE_ID = \"image_id\"\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/overlay/MapOverlayPluginTest.kt",
    "content": "package com.mapbox.maps.testapp.overlay\n\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.test.filters.LargeTest\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.plugin.overlay.MapOverlayPlugin\nimport com.mapbox.maps.plugin.overlay.mapboxOverlay\nimport com.mapbox.maps.testapp.BaseMapTest\nimport junit.framework.Assert.*\nimport org.junit.Before\nimport org.junit.Test\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@LargeTest\nclass MapOverlayPluginTest : BaseMapTest() {\n\n  private lateinit var mapOverlayPlugin: MapOverlayPlugin\n\n  @Before\n  fun setUp() {\n    super.before()\n    mapOverlayPlugin = mapView.mapboxOverlay\n  }\n\n  @Test\n  fun setMargins() {\n    mapOverlayPlugin.setDisplayingAreaMargins(10, 20, 30, 40)\n    val edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(\n      EdgeInsets(10.0, 20.0, 30.0, 40.0),\n      edgeInsets\n    )\n  }\n\n  @Test\n  fun registerOverlay() {\n    var edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      edgeInsets\n    )\n\n    val leftTop = View(context)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.addView(leftTop)\n        val leftTopParams = FrameLayout.LayoutParams(leftTop.layoutParams)\n        leftTopParams.setMargins(0, 0, 300, (mapView.height - 50.0).toInt())\n        leftTop.layoutParams = leftTopParams\n      }\n    }\n\n    val rightTop = View(context)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.addView(rightTop)\n        val rightTopParams = FrameLayout.LayoutParams(rightTop.layoutParams)\n        rightTopParams.setMargins(300, 0, 0, (mapView.height - 50.0).toInt())\n        rightTop.layoutParams = rightTopParams\n      }\n    }\n\n    mapOverlayPlugin.registerOverlay(leftTop)\n    mapOverlayPlugin.registerOverlay(rightTop)\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(\n      EdgeInsets(50.0, 0.0, 0.0, 0.0),\n      edgeInsets\n    )\n\n    val leftBottom = View(context)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.addView(leftBottom)\n        val leftBottomParams = FrameLayout.LayoutParams(leftBottom.layoutParams)\n        leftBottomParams.setMargins(300, (mapView.height - 50.0).toInt(), 300, 0)\n        leftBottom.layoutParams = leftBottomParams\n      }\n    }\n\n    val rightBottom = View(context)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.addView(rightBottom)\n        val rightBottomParams = FrameLayout.LayoutParams(rightBottom.layoutParams)\n        rightBottomParams.setMargins(300, (mapView.height - 50.0).toInt(), 0, 0)\n        rightBottom.layoutParams = rightBottomParams\n      }\n    }\n\n    mapOverlayPlugin.registerOverlay(leftBottom)\n    mapOverlayPlugin.registerOverlay(rightBottom)\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(\n      EdgeInsets(50.0, 0.0, 50.0, 0.0),\n      edgeInsets\n    )\n\n    mapOverlayPlugin.unregisterOverlay(leftTop)\n    mapOverlayPlugin.unregisterOverlay(leftBottom)\n    mapOverlayPlugin.unregisterOverlay(rightTop)\n    mapOverlayPlugin.unregisterOverlay(rightBottom)\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      edgeInsets\n    )\n  }\n\n  @Test\n  fun getReframeCameraOption() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapOverlayPlugin.reframe { reframedCamera ->\n          assertNull(reframedCamera)\n        }\n        mapOverlayPlugin.registerMapOverlayCoordinatesProvider {\n          listOf(\n            Point.fromLngLat(0.0, 0.0),\n            Point.fromLngLat(10.0, 20.0)\n          )\n        }\n\n        mapOverlayPlugin.reframe { reframedCamera ->\n          assertNotNull(reframedCamera)\n        }\n      }\n    }\n  }\n\n  @Test\n  fun reframe() {\n    mapOverlayPlugin.registerMapOverlayCoordinatesProvider {\n      listOf(\n        Point.fromLngLat(0.0, 0.0),\n        Point.fromLngLat(10.0, 20.0)\n      )\n    }\n    val leftTop = View(context)\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        mapView.addView(leftTop)\n        val leftTopParams = FrameLayout.LayoutParams(leftTop.layoutParams)\n        leftTopParams.setMargins(0, 0, 300, (mapView.height - 50.0).toInt())\n        leftTop.layoutParams = leftTopParams\n      }\n\n      activity.runOnUiThread {\n        mapOverlayPlugin.reframe { reframedCamera ->\n          assertNotNull(reframedCamera)\n          mapboxMap.setCamera(reframedCamera!!)\n          val currentCameraOptions = mapboxMap.cameraState\n          assertEquals(currentCameraOptions.center.latitude(), reframedCamera.center!!.latitude(), 0.01)\n          assertEquals(currentCameraOptions.center.longitude(), reframedCamera.center!!.longitude(), 0.01)\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/scalebar/generated/ScaleBarAttributeParserDefaultValueTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.scalebar.generated\n\nimport android.graphics.Color\nimport android.view.Gravity\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.plugin.scalebar.LocaleUnitResolver\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass ScaleBarAttributeParserDefaultValueTest : BaseMapTest() {\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      true,\n      mapView.scalebar.getSettings().enabled\n    )\n    assertEquals(\n      \"position test failed..\",\n      Gravity.TOP or Gravity.START,\n      mapView.scalebar.getSettings().position\n    )\n    assertEquals(\n      \"marginLeft test failed..\",\n      4f * pixelRatio,\n      mapView.scalebar.getSettings().marginLeft\n    )\n    assertEquals(\n      \"marginTop test failed..\",\n      4f * pixelRatio,\n      mapView.scalebar.getSettings().marginTop\n    )\n    assertEquals(\n      \"marginRight test failed..\",\n      4f * pixelRatio,\n      mapView.scalebar.getSettings().marginRight\n    )\n    assertEquals(\n      \"marginBottom test failed..\",\n      4f * pixelRatio,\n      mapView.scalebar.getSettings().marginBottom\n    )\n    assertEquals(\n      \"textColor test failed..\",\n      Color.BLACK,\n      mapView.scalebar.getSettings().textColor\n    )\n    assertEquals(\n      \"primaryColor test failed..\",\n      Color.BLACK,\n      mapView.scalebar.getSettings().primaryColor\n    )\n    assertEquals(\n      \"secondaryColor test failed..\",\n      Color.WHITE,\n      mapView.scalebar.getSettings().secondaryColor\n    )\n    assertEquals(\n      \"borderWidth test failed..\",\n      2f * pixelRatio,\n      mapView.scalebar.getSettings().borderWidth\n    )\n    assertEquals(\n      \"height test failed..\",\n      2f * pixelRatio,\n      mapView.scalebar.getSettings().height\n    )\n    assertEquals(\n      \"textBarMargin test failed..\",\n      8f * pixelRatio,\n      mapView.scalebar.getSettings().textBarMargin\n    )\n    assertEquals(\n      \"textBorderWidth test failed..\",\n      2f * pixelRatio,\n      mapView.scalebar.getSettings().textBorderWidth\n    )\n    assertEquals(\n      \"textSize test failed..\",\n      8f * pixelRatio,\n      mapView.scalebar.getSettings().textSize\n    )\n    assertEquals(\n      \"isMetricUnits test failed..\",\n      LocaleUnitResolver.isMetricSystem,\n      mapView.scalebar.getSettings().isMetricUnits\n    )\n    assertEquals(\n      \"distanceUnits test failed..\",\n      LocaleUnitResolver.distanceUnits,\n      mapView.scalebar.getSettings().distanceUnits\n    )\n    assertEquals(\n      \"refreshInterval test failed..\",\n      15,\n      mapView.scalebar.getSettings().refreshInterval\n    )\n    assertEquals(\n      \"showTextBorder test failed..\",\n      true,\n      mapView.scalebar.getSettings().showTextBorder\n    )\n    assertEquals(\n      \"ratio test failed..\",\n      0.5f,\n      mapView.scalebar.getSettings().ratio\n    )\n    assertEquals(\n      \"useContinuousRendering test failed..\",\n      false,\n      mapView.scalebar.getSettings().useContinuousRendering\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/scalebar/generated/ScaleBarAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.scalebar.generated\n\nimport android.graphics.Color\nimport android.view.Gravity\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.R\nimport com.mapbox.maps.plugin.DistanceUnits\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass ScaleBarAttributeParserTest : BaseMapTest() {\n  override fun initialiseMapView() {\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        it.setContentView(com.mapbox.maps.testapp.R.layout.generated_test_scalebar)\n        mapView = it.findViewById(R.id.mapView)\n      }\n    }\n  }\n\n  @Test\n  fun testAttributeParser() {\n    assertEquals(\n      \"enabled test failed..\",\n      false,\n      mapView.scalebar.getSettings().enabled\n    )\n    assertEquals(\n      \"position test failed..\",\n      Gravity.BOTTOM or Gravity.END,\n      mapView.scalebar.getSettings().position\n    )\n    assertEquals(\n      \"marginLeft test failed..\",\n      10.0f * pixelRatio,\n      mapView.scalebar.getSettings().marginLeft\n    )\n    assertEquals(\n      \"marginTop test failed..\",\n      10.0f * pixelRatio,\n      mapView.scalebar.getSettings().marginTop\n    )\n    assertEquals(\n      \"marginRight test failed..\",\n      10.0f * pixelRatio,\n      mapView.scalebar.getSettings().marginRight\n    )\n    assertEquals(\n      \"marginBottom test failed..\",\n      10.0f * pixelRatio,\n      mapView.scalebar.getSettings().marginBottom\n    )\n    assertEquals(\n      \"textColor test failed..\",\n      Color.BLACK,\n      mapView.scalebar.getSettings().textColor\n    )\n    assertEquals(\n      \"primaryColor test failed..\",\n      Color.BLACK,\n      mapView.scalebar.getSettings().primaryColor\n    )\n    assertEquals(\n      \"secondaryColor test failed..\",\n      Color.BLACK,\n      mapView.scalebar.getSettings().secondaryColor\n    )\n    assertEquals(\n      \"borderWidth test failed..\",\n      10.0f * pixelRatio,\n      mapView.scalebar.getSettings().borderWidth\n    )\n    assertEquals(\n      \"height test failed..\",\n      10.0f * pixelRatio,\n      mapView.scalebar.getSettings().height\n    )\n    assertEquals(\n      \"textBarMargin test failed..\",\n      10.0f * pixelRatio,\n      mapView.scalebar.getSettings().textBarMargin\n    )\n    assertEquals(\n      \"textBorderWidth test failed..\",\n      10.0f * pixelRatio,\n      mapView.scalebar.getSettings().textBorderWidth\n    )\n    assertEquals(\n      \"textSize test failed..\",\n      10.0f * pixelRatio,\n      mapView.scalebar.getSettings().textSize\n    )\n    assertEquals(\n      \"isMetricUnits test failed..\",\n      false,\n      mapView.scalebar.getSettings().isMetricUnits\n    )\n    assertEquals(\n      \"distanceUnits test failed..\",\n      DistanceUnits.IMPERIAL,\n      mapView.scalebar.getSettings().distanceUnits\n    )\n    assertEquals(\n      \"refreshInterval test failed..\",\n      1000000L,\n      mapView.scalebar.getSettings().refreshInterval\n    )\n    assertEquals(\n      \"showTextBorder test failed..\",\n      false,\n      mapView.scalebar.getSettings().showTextBorder\n    )\n    assertEquals(\n      \"ratio test failed..\",\n      0.9f,\n      mapView.scalebar.getSettings().ratio\n    )\n    assertEquals(\n      \"useContinuousRendering test failed..\",\n      false,\n      mapView.scalebar.getSettings().useContinuousRendering\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "app/src/androidTest/java/com/mapbox/maps/testapp/viewport/ViewportPluginTest.kt",
    "content": "package com.mapbox.maps.testapp.viewport\n\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.LocationConsumer\nimport com.mapbox.maps.plugin.locationcomponent.LocationProvider\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.transition.ViewportTransition\nimport com.mapbox.maps.plugin.viewport.viewport\nimport com.mapbox.maps.testapp.BaseMapTest\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.*\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass ViewportPluginTest : BaseMapTest() {\n\n  private val handler = Handler(Looper.getMainLooper())\n  private lateinit var viewportPlugin: ViewportPlugin\n  private lateinit var immediateViewportTransition: ViewportTransition\n\n  private val locationProvider = object : LocationProvider {\n    val locationConsumers = CopyOnWriteArraySet<LocationConsumer>()\n    override fun registerLocationConsumer(locationConsumer: LocationConsumer) {\n      locationConsumers.add(locationConsumer)\n    }\n\n    override fun unRegisterLocationConsumer(locationConsumer: LocationConsumer) {\n      locationConsumers.remove(locationConsumer)\n    }\n  }\n\n  @Before\n  fun setUp() {\n    super.before()\n    rule.scenario.onActivity { activity ->\n      activity.runOnUiThread {\n        viewportPlugin = mapView.viewport\n        immediateViewportTransition = viewportPlugin.makeImmediateViewportTransition()\n        mapView.mapboxMap.setCamera(START_CAMERA_OPTION)\n        mapView.location.apply {\n          setLocationProvider(locationProvider)\n          puckBearingEnabled = true\n          puckBearing = PuckBearing.COURSE\n          enabled = true\n        }\n      }\n    }\n  }\n\n  @After\n  fun cleanUp() {\n    locationProvider.locationConsumers.clear()\n  }\n\n  @Test\n  fun transitionToDefaultTransition() {\n    val latch = CountDownLatch(1)\n    handler.post {\n      assertEquals(0.0, mapView.mapboxMap.cameraState.bearing, EPS)\n      mapView.mapboxMap.cameraState.center.assertEquals(NULL_ISLAND)\n      // immediate update location puck to test location.\n      locationProvider.locationConsumers.forEach {\n        it.onLocationUpdated(\n          TEST_POINT,\n          options = { duration = 0 }\n        )\n      }\n      locationProvider.locationConsumers.forEach {\n        it.onBearingUpdated(\n          TEST_BEARING,\n          options = { duration = 0 }\n        )\n      }\n      // transition to the followPuckViewportState with default transition\n      viewportPlugin.transitionTo(viewportPlugin.makeFollowPuckViewportState()) {\n        latch.countDown()\n      }\n    }\n\n    // Wait for 5 seconds since the default transition time is 3.5 seconds\n    if (!latch.await(5, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n    handler.post {\n      val cameraState = mapView.mapboxMap.cameraState\n      cameraState.center.assertEquals(TEST_POINT)\n      assertEquals(TEST_BEARING, cameraState.bearing, EPS)\n    }\n  }\n\n  @Test\n  fun transitionToImmediateTransition() {\n    val latch = CountDownLatch(1)\n    handler.post {\n      assertEquals(0.0, mapView.mapboxMap.cameraState.bearing, EPS)\n      mapView.mapboxMap.cameraState.center.assertEquals(NULL_ISLAND)\n      // immediate update location puck to test location.\n      locationProvider.locationConsumers.forEach {\n        it.onLocationUpdated(\n          TEST_POINT,\n          options = { duration = 0 }\n        )\n      }\n      locationProvider.locationConsumers.forEach {\n        it.onBearingUpdated(\n          TEST_BEARING,\n          options = { duration = 0 }\n        )\n      }\n      // immediately transition to the followPuckViewportState\n      viewportPlugin.transitionTo(viewportPlugin.makeFollowPuckViewportState(), immediateViewportTransition) {\n        latch.countDown()\n      }\n    }\n\n    if (!latch.await(200, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    handler.post {\n      val cameraState = mapView.mapboxMap.cameraState\n      cameraState.center.assertEquals(TEST_POINT)\n      assertEquals(TEST_BEARING, cameraState.bearing, EPS)\n    }\n  }\n\n  @Test\n  fun testFollowPuckViewportState() {\n    val latch = CountDownLatch(1)\n    handler.post {\n      assertEquals(0.0, mapView.mapboxMap.cameraState.bearing, EPS)\n      mapView.mapboxMap.cameraState.center.assertEquals(NULL_ISLAND)\n      // immediate update location puck to test location.\n      locationProvider.locationConsumers.forEach {\n        it.onLocationUpdated(\n          TEST_POINT,\n          options = { duration = 0 }\n        )\n      }\n      locationProvider.locationConsumers.forEach {\n        it.onBearingUpdated(\n          TEST_BEARING,\n          options = { duration = 0 }\n        )\n      }\n      // immediately transition to the followPuckViewportState\n      viewportPlugin.transitionTo(viewportPlugin.makeFollowPuckViewportState(), immediateViewportTransition) {\n        latch.countDown()\n      }\n    }\n\n    if (!latch.await(200, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n\n    val latch2 = CountDownLatch(1)\n    handler.post {\n      // emit new bearing and location updates, location component plugin should be driving the animation.\n      // and viewport plugin should do animation with 0 duration on each animated location puck position\n      locationProvider.locationConsumers.forEach {\n        it.onBearingUpdated(\n          TEST_BEARING + 90.0,\n          options = { duration = 1000 }\n        )\n      }\n      locationProvider.locationConsumers.forEach {\n        it.onLocationUpdated(\n          TEST_POINT_MOVED,\n          options = { duration = 1000 }\n        )\n      }\n    }\n\n    // The location update will be animated with 1 second duration, we wait for 2 seconds for the animation to finish\n    latch2.await(2, TimeUnit.SECONDS)\n\n    // validate the camera is at the moved location\n    handler.post {\n      val cameraState = mapView.mapboxMap.cameraState\n      cameraState.center.assertEquals(TEST_POINT_MOVED)\n      assertEquals(TEST_BEARING + 90.0, cameraState.bearing, EPS)\n    }\n  }\n\n  private fun Point.assertEquals(other: Point) {\n    assertEquals(other.longitude(), this.longitude(), EPS)\n    assertEquals(other.latitude(), this.latitude(), EPS)\n    assertEquals(other.altitude(), this.altitude(), EPS)\n  }\n\n  private companion object {\n    val TEST_POINT: Point = Point.fromLngLat(24.9384, 60.1699)\n    val TEST_POINT_MOVED: Point = Point.fromLngLat(24.94284, 60.1699)\n    val NULL_ISLAND: Point = Point.fromLngLat(0.0, 0.0)\n    val START_CAMERA_OPTION = cameraOptions {\n      center(NULL_ISLAND)\n      // The default style (i.e. standard) has bearing different than 0 so let's reset it\n      bearing(0.0)\n    }\n    const val EPS = 0.000001\n    const val TEST_BEARING = 45.0\n  }\n}"
  },
  {
    "path": "app/src/androidTest/res/layout/view_annotation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/view_annotation\"\n    android:layout_width=\"200dp\"\n    android:layout_height=\"200dp\"\n    android:clickable=\"true\"\n    android:background=\"@android:color/black\">\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n    <uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\n    <uses-permission android:name=\"android.permission.ACCESS_BACKGROUND_LOCATION\" />\n\n    <application\n        android:name=\".MapboxApplication\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher_round\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\"\n        android:usesCleartextTraffic=\"true\"\n        tools:ignore=\"GoogleAppIndexingWarning,UnusedAttribute\">\n        <profileable android:shell=\"true\" />\n\n        <activity\n            android:name=\".ExampleOverviewActivity\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTop\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".EmptyActivity\"\n            android:exported=\"true\"\n            android:screenOrientation=\"portrait\"\n            tools:ignore=\"LockedOrientationActivity\" />\n        <activity\n            android:name=\".examples.SimpleMapActivity\"\n            android:description=\"@string/description_simple_map\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_simple_map\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.StandardStyleActivity\"\n            android:description=\"@string/description_standard_style\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_standard_style\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.MapboxStudioStyleActivity\"\n            android:description=\"@string/description_studio_style_map\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_studio_style\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.MapOverlayActivity\"\n            android:description=\"@string/description_map_overlay\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_overlay\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.localization.LocalizationActivity\"\n            android:description=\"@string/description_localization\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_localization\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.RuntimeStylingActivity\"\n            android:description=\"@string/description_runtime_styling\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_runtime_styling\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.TintFillPatternActivity\"\n            android:description=\"@string/description_tint_fill\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_tint_fill\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.DSLStylingActivity\"\n            android:description=\"@string/description_dsl_styling\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_dsl_styling\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.java.DSLStylingJavaActivity\"\n            android:description=\"@string/description_dsl_styling\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_java_dsl_styling\">\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.java.RuntimeStylingJavaActivity\"\n            android:description=\"@string/description_dsl_styling\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_java_runtime_dsl_styling\">\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.globe.HeatmapLayerGlobeActivity\"\n            android:description=\"@string/description_heatmap_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_heatmap_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_globe\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.StyleSwitchActivity\"\n            android:description=\"@string/description_default_styles\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_default_styles\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.SurfaceRecyclerViewActivity\"\n            android:description=\"@string/description_map_recycle\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_map_recycle\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_integration\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.GesturesActivity\"\n            android:description=\"@string/description_gestures\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_gestures\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_gestures\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.RawGeoJsonActivity\"\n            android:description=\"@string/description_raw_geojson\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_raw_geojson\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.RawExpressionActivity\"\n            android:description=\"@string/description_raw_expression\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_raw_expression\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.RawSourceLayerActivity\"\n            android:description=\"@string/description_raw_source_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_raw_souce_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.FragmentBackStackActivity\"\n            android:description=\"@string/description_map_fragment\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_map_fragment\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_integration\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.ViewPagerActivity\"\n            android:description=\"@string/description_map_viewpager\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_map_viewpager\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_integration\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.MultiMapActivity\"\n            android:description=\"@string/description_map_multi\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_map_multi\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_integration\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.DebugModeActivity\"\n            android:description=\"@string/description_debug_mode\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_debug_mode\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.MapboxMapRecorderActivity\"\n            android:description=\"@string/description_mapbox_recorder\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_mapbox_recorder\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.snapshotter.MapSnapshotterActivity\"\n            android:description=\"@string/description_snapshotter\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_snapshotter\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_snapshot\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.snapshotter.DataDrivenMapSnapshotterActivity\"\n            android:description=\"@string/description_snapshotter_dds\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_snapshotter_dds\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_snapshot\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.snapshotter.LocalStyleMapSnapshotterActivity\"\n            android:description=\"@string/description_snapshotter_local\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_snapshotter_local\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_snapshot\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.terrain3D.FillExtrusionActivity\"\n            android:description=\"@string/description_fill_extrusion\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_fill_extrusion\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_3D\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.terrain3D.Lights3DActivity\"\n            android:description=\"@string/description_lights3d\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_lights3d\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_3D\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.IconPropertyActivity\"\n            android:description=\"@string/description_icon_property\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_icon_property\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.LocationTrackingActivity\"\n            android:description=\"@string/description_location_tracking\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_location_tracking\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.SimulateNavigationRouteActivity\"\n            android:description=\"@string/description_simulate_navigation_route\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_simulate_navigation_route\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.BasicLocationPulsingCircleActivity\"\n            android:description=\"@string/description_location_basic_pulsing_circle\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_basic_location_pulsing_circle\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.geofence.SimpleGeofencingActivity\"\n            android:description=\"@string/description_simple_geofencing\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_simple_geofencing\"\n            android:launchMode=\"singleTask\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.geofence.ExtendedGeofencingActivity\"\n            android:description=\"@string/description_extended_geofencing\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_extended_geofencing\"\n            android:launchMode=\"singleTask\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.camera.RestrictBoundsActivity\"\n            android:description=\"@string/description_restrict_bounds\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_restrict_bounds\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_config\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.GeoJsonLayerInStackActivity\"\n            android:description=\"@string/description_geojson_layer_in_stack\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_geojson_in_stack\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.AnimatedImageSourceActivity\"\n            android:description=\"@string/description_animated_image_source\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_animated_image_source\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.StyleCirclesCategoricallyActivity\"\n            android:description=\"@string/description_style_circles_categorically\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_style_circles_categorically\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.SpaceStationLocationActivity\"\n            android:description=\"@string/description_space_station_location\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_space_station_location_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.InsetMapActivity\"\n            android:description=\"@string/description_inset_map\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_inset_map_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.TextureViewActivity\"\n            android:description=\"@string/description_texture_view\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_texture_view\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.TextureViewAnimateActivity\"\n            android:description=\"@string/description_texture_view_animation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_texture_view_animation\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_integration\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.linesandpolygons.LineGradientActivity\"\n            android:description=\"@string/description_dds_gradient_line\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_dds_gradient_line_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lines_and_polygons\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.linesandpolygons.PolygonHolesActivity\"\n            android:description=\"@string/description_dds_polygon_holes\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_dds_polygon_holes_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lines_and_polygons\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.linesandpolygons.DrawPolygonActivity\"\n            android:description=\"@string/description_dds_polygon\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_dds_polygon_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lines_and_polygons\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.linesandpolygons.DrawGeoJsonLineActivity\"\n            android:description=\"@string/description_dds_geojson_line\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_dds_geojson_line_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lines_and_polygons\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.globe.GlobeFlyToActivity\"\n            android:description=\"@string/activity_camera_animate_description\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_camera_animate_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_globe\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.camera.CameraPredefinedAnimatorsActivity\"\n            android:description=\"@string/activity_camera_predefined_animators_description\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_camera_predefined_animators_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_camera\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.camera.LowLevelCameraAnimatorActivity\"\n            android:description=\"@string/description_camera_low_level\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_camera_low_level\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_camera\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.OngoingAnimationActivity\"\n            android:description=\"@string/description_animate_camera_during_gesture\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_camera_animate_during_gesture\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_camera\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.MultipleGeometriesActivity\"\n            android:description=\"@string/description_dds_multiple_geometries\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_dds_multiple_geometries_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.WithinExpressionActivity\"\n            android:description=\"@string/description_within\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_within\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.DistanceExpressionActivity\"\n            android:description=\"@string/description_distance_style\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_distance_style\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.VectorTileSourceActivity\"\n            android:description=\"@string/description_vector_tile_source\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_vector_tile_source\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.WmsSourceActivity\"\n            android:description=\"@string/description_wms_source\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_wms_source\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.linesandpolygons.MovingIconWithTrailingLineActivity\"\n            android:description=\"@string/description_lab_moving_icon_with_trailing_line_title\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_lab_moving_icon_with_trailing_line_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lines_and_polygons\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.AnimatedMarkerActivity\"\n            android:description=\"@string/description_animate_marker_position\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_animate_marker_position\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.linesandpolygons.SnakingDirectionsRouteActivity\"\n            android:description=\"@string/description_labs_snaking_directions_route_title\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_labs_snaking_directions_route_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lines_and_polygons\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.ShowHideLayersActivity\"\n            android:description=\"@string/description_styles_show_hide_layers\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_styles_show_hide_layers_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.CircleLayerClusteringActivity\"\n            android:description=\"@string/description_styles_dds_geojson_circle_layer_clusters_description\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_styles_dds_geojson_circle_layer_clusters_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.AddMarkersSymbolActivity\"\n            android:description=\"@string/description_add_marker_symbol\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_basic_add_marker_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.AddOneMarkerSymbolActivity\"\n            android:description=\"@string/description_add_one_marker_symbol\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_basic_add_one_marker_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.ImageSourceActivity\"\n            android:description=\"@string/description_style_image_source\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_style_image_source_title\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.LegacyOfflineActivity\"\n            android:description=\"@string/description_legacy_offline\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_legacy_offline\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_offline\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.customlayer.CustomLayerActivity\"\n            android:description=\"@string/description_custom_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_custom_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_custom_layer\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.sky.SkyLayerShowcaseActivity\"\n            android:description=\"@string/description_sky_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_sky_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_sky\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.sky.SkyLayerSnapshotterActivity\"\n            android:description=\"@string/description_sky_snapshotter\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_sky_snapshotter\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_sky\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.customlayer.NativeCustomLayerActivity\"\n            android:description=\"@string/description_native_custom_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_native_custom_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_custom_layer\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.snapshotter.MapViewSnapshotActivity\"\n            android:description=\"@string/description_view_snapshot\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_view_snapshot\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_snapshot\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.customlayer.TriangleCustomLayerActivity\"\n            android:description=\"@string/description_triangle_custom_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_triangle_custom_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_custom_layer\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.customlayer.globe.GlobeCustomLayerActivity\"\n            android:description=\"@string/description_globe_custom_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_globe_custom_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_custom_layer\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.TransparentBackgroundActivity\"\n            android:description=\"@string/description_transparent_bg\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_transparent_bg\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.SurfaceActivity\"\n            android:description=\"@string/description_surface\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_mapsurface\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_integration\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n\n        <service\n            android:name=\".wallpaper.MapWallpaper\"\n            android:exported=\"true\"\n            android:label=\"Mapbox Wallpaper\"\n            android:permission=\"android.permission.BIND_WALLPAPER\">\n            <intent-filter>\n                <action android:name=\"android.service.wallpaper.WallpaperService\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.service.wallpaper\"\n                android:resource=\"@xml/map_wallpaper\" />\n        </service>\n\n        <activity\n            android:name=\".examples.CustomAttributionActivity\"\n            android:description=\"@string/description_custom_attribution\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_custom_attribution\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.PolygonAnnotationActivity\"\n            android:description=\"@string/description_annotation_fill\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_fill\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.CircleAnnotationActivity\"\n            android:description=\"@string/description_annotation_circle\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_circle\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.PointAnnotationActivity\"\n            android:description=\"@string/description_annotation_symbol\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_symbol\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.AnimatePointAnnotationActivity\"\n            android:description=\"@string/description_animate_annotation_symbol\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_animate_symbol\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.PointAnnotationClusterActivity\"\n            android:description=\"@string/description_annotation_symbol_cluster\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_symbol_cluster\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.PolylineAnnotationActivity\"\n            android:description=\"@string/description_annotation_line\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_line\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.terrain3D.Terrain3DShowcaseActivity\"\n            android:description=\"@string/description_terrain_showcase\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_terrain_showcase\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_3D\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.LocationComponentActivity\"\n            android:description=\"@string/description_location_component\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_location_component\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.LocationComponentAnimationActivity\"\n            android:description=\"@string/description_location_component_animation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_location_component_animation\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.terrain3D.SantaCatalinaActivity\"\n            android:description=\"@string/description_santa_catalina\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_santa_catalina\"\n            android:screenOrientation=\"landscape\"\n            android:theme=\"@style/Theme.AppCompat.Light.NoActionBar\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_3D\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.MultiDisplayActivity\"\n            android:description=\"@string/description_multiple_display\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_multiple_display\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.SecondaryDisplayActivity\"\n            android:launchMode=\"singleTask\">\n            <meta-data\n                android:name=\"android.allow_multiple_resumed_activities\"\n                android:value=\"true\" />\n        </activity>\n        <activity\n            android:name=\".examples.MapViewCustomizationActivity\"\n            android:description=\"@string/description_map_view_customization\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_map_view_customization\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.OfflineActivity\"\n            android:description=\"@string/description_offline\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_offline\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_offline\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.OrnamentMarginActivity\"\n            android:description=\"@string/description_ornaments_margin\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_ornaments\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_config\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.ScaleBarActivity\"\n            android:description=\"@string/description_scale_bar\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_scale_bar\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_config\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.LargeGeojsonPerformanceActivity\"\n            android:description=\"@string/description_large_geojson\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_large_geojson\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.NinePatchImageActivity\"\n            android:description=\"@string/description_nine_patch\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_nine_patch\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.coroutines.featurestate.FeatureStateActivity\"\n            android:description=\"@string/description_feature_state\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_feature_state\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.globe.GlobeActivity\"\n            android:description=\"@string/description_3d_globe\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_globe\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_globe\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.globe.SpinningGlobeActivity\"\n            android:description=\"@string/description_spinning_globe\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_spinning_globe\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_globe\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.TileJsonActivity\"\n            android:description=\"@string/description_osm\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_osm\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity> <!-- View annotations -->\n        <activity\n            android:name=\".examples.markersandcallouts.viewannotation.ViewAnnotationShowcaseActivity\"\n            android:description=\"@string/description_view_annotation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_view_annotations\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.viewannotation.ViewAnnotationBasicAddActivity\"\n            android:description=\"@string/description_view_annotation_basic\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_view_annotations_basic\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.viewannotation.ViewAnnotationAnimationActivity\"\n            android:description=\"@string/description_view_annotation_animation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_view_annotations_animation\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.viewannotation.ViewAnnotationWithPointAnnotationActivity\"\n            android:description=\"@string/description_view_annotation_point_annotation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_view_annotations_point_annotation\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.viewannotation.DynamicViewAnnotationActivity\"\n            android:description=\"@string/description_dynamic_view_annotations\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_dynamic_view_annotations\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity> <!--  -->\n        <activity\n            android:name=\".examples.viewport.ViewportShowcaseActivity\"\n            android:description=\"@string/description_viewport\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_viewport\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_viewport\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.viewport.AdvancedViewportGesturesExample\"\n            android:description=\"@string/description_advanced_viewport\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_advanced_viewport\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_viewport\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.markersandcallouts.infowindow.InfoWindowActivity\"\n            android:description=\"@string/description_info_window\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_info_window\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_markers_and_callouts\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.ThirdPartyVectorSourceActivity\"\n            android:description=\"@string/description_third_party_source\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_third_party_source\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".TestMapActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\".EmptyFragmentActivity\"\n            android:exported=\"true\"\n            android:theme=\"@android:style/Theme.Material.Light\" />\n        <activity\n            android:name=\".examples.SecondaryDisplayPresentationActivity\"\n            android:description=\"@string/description_secondary_display_presentation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_secondary_display_presentation\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.RasterColorizationActivity\"\n            android:description=\"@string/description_raster_colorization\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_raster_colorization\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n\n        <meta-data\n            android:name=\"com.mapbox.maps.ThreadChecker\"\n            android:value=\"true\" />\n\n        <activity\n            android:name=\".examples.terrain3D.ModelLayerActivity\"\n            android:description=\"@string/description_model_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_model_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_3D\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.CustomRasterSourceActivity\"\n            android:description=\"@string/description_custom_raster_source\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_custom_raster_source\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.SlotLayerActivity\"\n            android:description=\"@string/description_slot_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/actvity_slot_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.RasterParticlesActivity\"\n            android:description=\"@string/description_raster_particles\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_raster_particles\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.ClipLayerActivity\"\n            android:description=\"@string/description_clip_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_clip_layer\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.StandardStyleInteractionsActivity\"\n            android:description=\"@string/description_standard_interactions\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_standard_interactions\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.LocationComponentModelAnimationActivity\"\n            android:description=\"@string/description_location_component_model_animation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_location_component_model_animation\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.PrecipitationActivity\"\n            android:description=\"@string/description_precipitation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_precipitation\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.ColorThemeActivity\"\n            android:description=\"@string/description_color_theme\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_color_theme\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.ElevatedLineActivity\"\n            android:description=\"@string/description_elevated_line\"\n            android:label=\"@string/activity_elevated_line\"\n            android:exported=\"true\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_3D\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.datajoin.DataJoinActivity\"\n            android:description=\"@string/description_data_join\"\n            android:label=\"@string/activity_join_data\"\n            android:exported=\"true\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_data_visualization\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity\n            android:name=\".examples.IndoorExampleActivity\"\n            android:description=\"@string/description_indoor_example\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_indoor_example\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n        <activity android:name=\".examples.Interactive3DModelSourceActivity\"\n            android:description=\"@string/description_3d_model_source_interactions\"\n            android:label=\"@string/description_3d_model_source_interactions_label\"\n            android:exported=\"true\">\n            <meta-data\n                android:name=\"category\"\n                android:value=\"@string/category_3D\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".examples.Interactive3DModelSourceActivity\" />\n        </activity>\n        <activity android:name=\".examples.EdgeToEdgeActivity\"\n            android:description=\"@string/description_edge_to_edge\"\n            android:label=\"@string/activity_edge_to_edge\"\n            android:exported=\"true\"\n            android:theme=\"@style/Theme.AppCompat.Light.NoActionBar\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".ExampleOverviewActivity\" />\n        </activity>\n    </application>\n</manifest>\n"
  },
  {
    "path": "app/src/main/assets/annotations.json",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          12.5,\n          41.9\n        ]\n      },\n      \"properties\": {\n        \"icon-image\": \"cafe-15\",\n        \"is-draggable\": true\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          10.5,\n          35.9\n        ]\n      },\n      \"properties\": {\n        \"circle-color\": \"rgba(255, 255, 255, 1)\",\n        \"circle-radius\": \"25\",\n        \"is-draggable\": true\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"geometry\": {\n        \"type\": \"LineString\",\n        \"coordinates\": [\n          [\n            10.5,\n            35.9\n          ],\n          [\n            12.5,\n            41.9\n          ]\n        ]\n      },\n      \"properties\": {\n        \"line-color\": \"rgba(255, 255, 255, 1)\",\n        \"line-width\": \"15\",\n        \"is-draggable\": true\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          [\n            [\n              12.5,\n              41.9\n            ],\n            [\n              10.5,\n              35.9\n            ],\n            [\n              41.9,\n              35.9\n            ],\n            [\n              12.5,\n              41.9\n            ]\n          ]\n        ]\n      },\n      \"properties\": {\n        \"fill-color\": \"rgba(255, 255, 255, 1)\",\n        \"fill-outline-color\": \"rgba(255, 0, 0, 1)\",\n        \"is-draggable\": true\n      }\n    }\n  ]\n}"
  },
  {
    "path": "app/src/main/assets/countries_hdi.json",
    "content": "// Data: UN Human Development Index 2017 Europe extract\n// Source: https://ourworldindata.org/human-development-index\n[\n  { \"code\": \"ROU\", \"hdi\": 0.811 },\n  { \"code\": \"RUS\", \"hdi\": 0.816 },\n  { \"code\": \"SRB\", \"hdi\": 0.787 },\n  { \"code\": \"SVK\", \"hdi\": 0.855 },\n  { \"code\": \"SVN\", \"hdi\": 0.896 },\n  { \"code\": \"ESP\", \"hdi\": 0.891 },\n  { \"code\": \"SWE\", \"hdi\": 0.933 },\n  { \"code\": \"CHE\", \"hdi\": 0.944 },\n  { \"code\": \"HRV\", \"hdi\": 0.831 },\n  { \"code\": \"CZE\", \"hdi\": 0.888 },\n  { \"code\": \"DNK\", \"hdi\": 0.929 },\n  { \"code\": \"EST\", \"hdi\": 0.871 },\n  { \"code\": \"FIN\", \"hdi\": 0.92 },\n  { \"code\": \"FRA\", \"hdi\": 0.901 },\n  { \"code\": \"DEU\", \"hdi\": 0.936 },\n  { \"code\": \"GRC\", \"hdi\": 0.87 },\n  { \"code\": \"ALB\", \"hdi\": 0.785 },\n  { \"code\": \"AND\", \"hdi\": 0.858 },\n  { \"code\": \"AUT\", \"hdi\": 0.908 },\n  { \"code\": \"BLR\", \"hdi\": 0.808 },\n  { \"code\": \"BEL\", \"hdi\": 0.916 },\n  { \"code\": \"BIH\", \"hdi\": 0.768 },\n  { \"code\": \"BGR\", \"hdi\": 0.813 },\n  { \"code\": \"MKD\", \"hdi\": 0.757 },\n  { \"code\": \"MLT\", \"hdi\": 0.878 },\n  { \"code\": \"MDA\", \"hdi\": 0.7 },\n  { \"code\": \"MNE\", \"hdi\": 0.814 },\n  { \"code\": \"NLD\", \"hdi\": 0.931 },\n  { \"code\": \"NOR\", \"hdi\": 0.953 },\n  { \"code\": \"POL\", \"hdi\": 0.865 },\n  { \"code\": \"PRT\", \"hdi\": 0.847 },\n  { \"code\": \"HUN\", \"hdi\": 0.838 },\n  { \"code\": \"ISL\", \"hdi\": 0.935 },\n  { \"code\": \"IRL\", \"hdi\": 0.938 },\n  { \"code\": \"ITA\", \"hdi\": 0.88 },\n  { \"code\": \"LVA\", \"hdi\": 0.847 },\n  { \"code\": \"LIE\", \"hdi\": 0.916 },\n  { \"code\": \"LTU\", \"hdi\": 0.858 },\n  { \"code\": \"LUX\", \"hdi\": 0.904 },\n  { \"code\": \"UKR\", \"hdi\": 0.751 },\n  { \"code\": \"GBR\", \"hdi\": 0.922 }\n]"
  },
  {
    "path": "app/src/main/assets/dva-sf-construction.geojson",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"id\": \"construction-1\",\n      \"properties\": {},\n      \"geometry\": {\n        \"coordinates\": [\n          -122.41444169500868,\n          37.6344580806383\n        ],\n        \"type\": \"Point\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "app/src/main/assets/dva-sf-parkings.geojson",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"id\": \"parking-1\",\n      \"properties\": {},\n      \"geometry\": {\n        \"coordinates\": [\n          [\n            [\n              -122.3990874275777,\n              37.631443435105766\n            ],\n            [\n              -122.40109800352596,\n              37.62571512403454\n            ],\n            [\n              -122.39624128759871,\n              37.62534287193719\n            ],\n            [\n              -122.39665906961409,\n              37.630823061723746\n            ],\n            [\n              -122.3990874275777,\n              37.631443435105766\n            ]\n          ]\n        ],\n        \"type\": \"Polygon\"\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"parking-2\",\n      \"properties\": {},\n      \"geometry\": {\n        \"coordinates\": [\n          [\n            [\n              -122.40255715731259,\n              37.63562891958904\n            ],\n            [\n              -122.40219921691639,\n              37.63472700673118\n            ],\n            [\n              -122.40075660865297,\n              37.63514790076043\n            ],\n            [\n              -122.4016243429468,\n              37.63669402162793\n            ],\n            [\n              -122.40255715731259,\n              37.63562891958904\n            ]\n          ]\n        ],\n        \"type\": \"Polygon\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "app/src/main/assets/dva-sf-route-alternative.geojson",
    "content": "{\n  \"type\": \"Feature\",\n  \"id\": \"route-sf-2\",\n  \"properties\": {},\n  \"geometry\": {\n    \"coordinates\": [\n      [\n        -122.407122,\n        37.652918\n      ],\n      [\n        -122.40703,\n        37.651854\n      ],\n      [\n        -122.406994,\n        37.651448\n      ],\n      [\n        -122.406878,\n        37.650131\n      ],\n      [\n        -122.406851,\n        37.649815\n      ],\n      [\n        -122.406772,\n        37.648917\n      ],\n      [\n        -122.406733,\n        37.648485\n      ],\n      [\n        -122.406676,\n        37.647823\n      ],\n      [\n        -122.406364,\n        37.644247\n      ],\n      [\n        -122.406231,\n        37.642768\n      ],\n      [\n        -122.406206,\n        37.642476\n      ],\n      [\n        -122.406181,\n        37.642169\n      ],\n      [\n        -122.406169,\n        37.642037\n      ],\n      [\n        -122.406155,\n        37.641901\n      ],\n      [\n        -122.406134,\n        37.641737\n      ],\n      [\n        -122.406113,\n        37.641594\n      ],\n      [\n        -122.406124,\n        37.640978\n      ],\n      [\n        -122.406109,\n        37.640702\n      ],\n      [\n        -122.406071,\n        37.640439\n      ],\n      [\n        -122.406003,\n        37.64011\n      ],\n      [\n        -122.405936,\n        37.639844\n      ],\n      [\n        -122.405864,\n        37.639579\n      ],\n      [\n        -122.405791,\n        37.639341\n      ],\n      [\n        -122.4057,\n        37.639076\n      ],\n      [\n        -122.405616,\n        37.638864\n      ],\n      [\n        -122.40506,\n        37.637567\n      ],\n      [\n        -122.404993,\n        37.637389\n      ],\n      [\n        -122.404954,\n        37.637253\n      ],\n      [\n        -122.404929,\n        37.637124\n      ],\n      [\n        -122.404911,\n        37.636997\n      ],\n      [\n        -122.404902,\n        37.636848\n      ],\n      [\n        -122.404905,\n        37.636681\n      ],\n      [\n        -122.404921,\n        37.636531\n      ],\n      [\n        -122.40495,\n        37.636375\n      ],\n      [\n        -122.404989,\n        37.63623\n      ],\n      [\n        -122.405049,\n        37.636066\n      ],\n      [\n        -122.405131,\n        37.635897\n      ],\n      [\n        -122.405231,\n        37.635737\n      ],\n      [\n        -122.405342,\n        37.635578\n      ],\n      [\n        -122.405473,\n        37.635425\n      ],\n      [\n        -122.40565,\n        37.635254\n      ],\n      [\n        -122.405853,\n        37.635083\n      ],\n      [\n        -122.406059,\n        37.63494\n      ],\n      [\n        -122.406273,\n        37.63481\n      ],\n      [\n        -122.406478,\n        37.634695\n      ],\n      [\n        -122.406679,\n        37.634598\n      ],\n      [\n        -122.406877,\n        37.634515\n      ],\n      [\n        -122.407049,\n        37.634453\n      ],\n      [\n        -122.407305,\n        37.634373\n      ],\n      [\n        -122.40756,\n        37.634306\n      ],\n      [\n        -122.407819,\n        37.63425\n      ],\n      [\n        -122.40807,\n        37.634205\n      ],\n      [\n        -122.408326,\n        37.634167\n      ],\n      [\n        -122.408554,\n        37.634143\n      ],\n      [\n        -122.408857,\n        37.634115\n      ],\n      [\n        -122.409329,\n        37.634083\n      ],\n      [\n        -122.409639,\n        37.634089\n      ],\n      [\n        -122.409887,\n        37.634099\n      ],\n      [\n        -122.410988,\n        37.634155\n      ],\n      [\n        -122.411571,\n        37.634204\n      ],\n      [\n        -122.412807,\n        37.634316\n      ],\n      [\n        -122.413372,\n        37.634363\n      ],\n      [\n        -122.413698,\n        37.63438\n      ],\n      [\n        -122.414031,\n        37.634389\n      ],\n      [\n        -122.414365,\n        37.634387\n      ],\n      [\n        -122.414673,\n        37.634374\n      ],\n      [\n        -122.414974,\n        37.634355\n      ],\n      [\n        -122.415253,\n        37.634327\n      ],\n      [\n        -122.415592,\n        37.634282\n      ],\n      [\n        -122.415918,\n        37.634227\n      ],\n      [\n        -122.416237,\n        37.634162\n      ],\n      [\n        -122.416566,\n        37.634085\n      ],\n      [\n        -122.41688,\n        37.634\n      ],\n      [\n        -122.417181,\n        37.633906\n      ],\n      [\n        -122.417482,\n        37.6338\n      ],\n      [\n        -122.417774,\n        37.633685\n      ],\n      [\n        -122.418057,\n        37.633564\n      ],\n      [\n        -122.418915,\n        37.633186\n      ],\n      [\n        -122.419464,\n        37.632942\n      ],\n      [\n        -122.420803,\n        37.632342\n      ],\n      [\n        -122.422168,\n        37.63173\n      ],\n      [\n        -122.423618,\n        37.631112\n      ],\n      [\n        -122.424039,\n        37.630935\n      ],\n      [\n        -122.424416,\n        37.630779\n      ],\n      [\n        -122.424821,\n        37.630624\n      ],\n      [\n        -122.426551,\n        37.629969\n      ],\n      [\n        -122.426657,\n        37.629934\n      ],\n      [\n        -122.426756,\n        37.629903\n      ],\n      [\n        -122.426872,\n        37.62987\n      ],\n      [\n        -122.426979,\n        37.629843\n      ],\n      [\n        -122.427159,\n        37.629804\n      ],\n      [\n        -122.427316,\n        37.629776\n      ],\n      [\n        -122.428386,\n        37.629594\n      ],\n      [\n        -122.428621,\n        37.62956\n      ],\n      [\n        -122.428861,\n        37.629531\n      ],\n      [\n        -122.430099,\n        37.629379\n      ],\n      [\n        -122.430261,\n        37.629359\n      ],\n      [\n        -122.430348,\n        37.629347\n      ],\n      [\n        -122.430423,\n        37.629337\n      ],\n      [\n        -122.430506,\n        37.629324\n      ],\n      [\n        -122.430584,\n        37.629309\n      ],\n      [\n        -122.430661,\n        37.629292\n      ],\n      [\n        -122.430734,\n        37.629273\n      ],\n      [\n        -122.430813,\n        37.629247\n      ],\n      [\n        -122.430892,\n        37.629219\n      ],\n      [\n        -122.43097,\n        37.629189\n      ],\n      [\n        -122.431041,\n        37.629158\n      ],\n      [\n        -122.43111,\n        37.629125\n      ],\n      [\n        -122.431176,\n        37.62909\n      ],\n      [\n        -122.431247,\n        37.629051\n      ],\n      [\n        -122.431311,\n        37.629011\n      ],\n      [\n        -122.431372,\n        37.62897\n      ],\n      [\n        -122.431435,\n        37.628924\n      ],\n      [\n        -122.431499,\n        37.628873\n      ],\n      [\n        -122.431562,\n        37.628819\n      ],\n      [\n        -122.431606,\n        37.628777\n      ],\n      [\n        -122.431644,\n        37.628738\n      ],\n      [\n        -122.431693,\n        37.628682\n      ],\n      [\n        -122.431736,\n        37.628631\n      ],\n      [\n        -122.431781,\n        37.628572\n      ],\n      [\n        -122.431822,\n        37.628515\n      ],\n      [\n        -122.43186,\n        37.628455\n      ],\n      [\n        -122.431891,\n        37.628399\n      ],\n      [\n        -122.431924,\n        37.628334\n      ],\n      [\n        -122.431952,\n        37.628272\n      ],\n      [\n        -122.431976,\n        37.628207\n      ],\n      [\n        -122.431996,\n        37.628145\n      ],\n      [\n        -122.432014,\n        37.628074\n      ],\n      [\n        -122.432026,\n        37.628009\n      ],\n      [\n        -122.432036,\n        37.627942\n      ],\n      [\n        -122.432042,\n        37.627878\n      ],\n      [\n        -122.432046,\n        37.627813\n      ],\n      [\n        -122.432046,\n        37.627747\n      ],\n      [\n        -122.432042,\n        37.627679\n      ],\n      [\n        -122.432036,\n        37.627612\n      ],\n      [\n        -122.432026,\n        37.62755\n      ],\n      [\n        -122.432013,\n        37.627488\n      ],\n      [\n        -122.431992,\n        37.627415\n      ],\n      [\n        -122.431971,\n        37.627349\n      ],\n      [\n        -122.431946,\n        37.627285\n      ],\n      [\n        -122.43192,\n        37.627224\n      ],\n      [\n        -122.431887,\n        37.627159\n      ],\n      [\n        -122.431854,\n        37.6271\n      ],\n      [\n        -122.431816,\n        37.627041\n      ],\n      [\n        -122.431777,\n        37.626984\n      ],\n      [\n        -122.431732,\n        37.626925\n      ],\n      [\n        -122.431687,\n        37.626872\n      ],\n      [\n        -122.431648,\n        37.62683\n      ],\n      [\n        -122.431613,\n        37.626794\n      ],\n      [\n        -122.431587,\n        37.626769\n      ],\n      [\n        -122.431527,\n        37.626714\n      ],\n      [\n        -122.431461,\n        37.626659\n      ],\n      [\n        -122.431401,\n        37.626613\n      ],\n      [\n        -122.431333,\n        37.626565\n      ],\n      [\n        -122.431268,\n        37.626522\n      ],\n      [\n        -122.431202,\n        37.62648\n      ],\n      [\n        -122.429964,\n        37.625695\n      ],\n      [\n        -122.429899,\n        37.625653\n      ],\n      [\n        -122.429834,\n        37.625609\n      ],\n      [\n        -122.429778,\n        37.625569\n      ],\n      [\n        -122.429717,\n        37.625524\n      ],\n      [\n        -122.429662,\n        37.62548\n      ],\n      [\n        -122.429604,\n        37.625431\n      ],\n      [\n        -122.429549,\n        37.625383\n      ],\n      [\n        -122.429496,\n        37.625333\n      ],\n      [\n        -122.429445,\n        37.625283\n      ],\n      [\n        -122.429396,\n        37.625231\n      ],\n      [\n        -122.429346,\n        37.625176\n      ],\n      [\n        -122.4293,\n        37.625122\n      ],\n      [\n        -122.429256,\n        37.625069\n      ],\n      [\n        -122.42921,\n        37.625012\n      ],\n      [\n        -122.429081,\n        37.624849\n      ],\n      [\n        -122.428994,\n        37.624735\n      ],\n      [\n        -122.428904,\n        37.624616\n      ],\n      [\n        -122.428855,\n        37.62455\n      ],\n      [\n        -122.428805,\n        37.62448\n      ],\n      [\n        -122.428539,\n        37.624103\n      ],\n      [\n        -122.427542,\n        37.622764\n      ],\n      [\n        -122.426218,\n        37.620714\n      ],\n      [\n        -122.425555,\n        37.619685\n      ],\n      [\n        -122.425332,\n        37.619341\n      ],\n      [\n        -122.425186,\n        37.619113\n      ],\n      [\n        -122.425115,\n        37.618999\n      ],\n      [\n        -122.425045,\n        37.618881\n      ],\n      [\n        -122.424981,\n        37.618767\n      ],\n      [\n        -122.424919,\n        37.618648\n      ],\n      [\n        -122.424859,\n        37.618529\n      ],\n      [\n        -122.424803,\n        37.618411\n      ],\n      [\n        -122.424749,\n        37.618288\n      ],\n      [\n        -122.424699,\n        37.618168\n      ],\n      [\n        -122.424652,\n        37.618045\n      ],\n      [\n        -122.424602,\n        37.617904\n      ],\n      [\n        -122.424569,\n        37.617801\n      ],\n      [\n        -122.42453,\n        37.617671\n      ],\n      [\n        -122.424497,\n        37.617545\n      ],\n      [\n        -122.424464,\n        37.617414\n      ],\n      [\n        -122.424433,\n        37.617271\n      ],\n      [\n        -122.424405,\n        37.617118\n      ],\n      [\n        -122.424385,\n        37.61699\n      ],\n      [\n        -122.424368,\n        37.616861\n      ],\n      [\n        -122.424355,\n        37.616732\n      ],\n      [\n        -122.424345,\n        37.616609\n      ],\n      [\n        -122.424338,\n        37.616482\n      ],\n      [\n        -122.424336,\n        37.616351\n      ],\n      [\n        -122.424336,\n        37.616216\n      ],\n      [\n        -122.42434,\n        37.616082\n      ],\n      [\n        -122.424346,\n        37.615952\n      ],\n      [\n        -122.424357,\n        37.615823\n      ],\n      [\n        -122.424371,\n        37.615694\n      ],\n      [\n        -122.424389,\n        37.61556\n      ],\n      [\n        -122.424409,\n        37.61543\n      ],\n      [\n        -122.424432,\n        37.615305\n      ],\n      [\n        -122.424459,\n        37.615176\n      ],\n      [\n        -122.424492,\n        37.615042\n      ],\n      [\n        -122.424509,\n        37.614972\n      ],\n      [\n        -122.424546,\n        37.614843\n      ],\n      [\n        -122.424587,\n        37.614713\n      ],\n      [\n        -122.424628,\n        37.614588\n      ],\n      [\n        -122.424674,\n        37.614463\n      ],\n      [\n        -122.424723,\n        37.614341\n      ],\n      [\n        -122.424776,\n        37.614216\n      ],\n      [\n        -122.424831,\n        37.614095\n      ],\n      [\n        -122.424892,\n        37.613968\n      ],\n      [\n        -122.424954,\n        37.613849\n      ],\n      [\n        -122.425006,\n        37.613754\n      ],\n      [\n        -122.425089,\n        37.613608\n      ],\n      [\n        -122.42516,\n        37.613491\n      ],\n      [\n        -122.425236,\n        37.613373\n      ],\n      [\n        -122.425315,\n        37.613256\n      ],\n      [\n        -122.425395,\n        37.613143\n      ],\n      [\n        -122.425478,\n        37.613028\n      ],\n      [\n        -122.425559,\n        37.612914\n      ],\n      [\n        -122.425644,\n        37.612796\n      ],\n      [\n        -122.425726,\n        37.61268\n      ],\n      [\n        -122.426297,\n        37.611883\n      ],\n      [\n        -122.42638,\n        37.611765\n      ],\n      [\n        -122.426457,\n        37.611654\n      ],\n      [\n        -122.426536,\n        37.611536\n      ],\n      [\n        -122.426611,\n        37.611419\n      ],\n      [\n        -122.426685,\n        37.611302\n      ],\n      [\n        -122.42676,\n        37.611183\n      ],\n      [\n        -122.426833,\n        37.611062\n      ],\n      [\n        -122.4269,\n        37.610948\n      ],\n      [\n        -122.42697,\n        37.610826\n      ],\n      [\n        -122.427035,\n        37.610707\n      ],\n      [\n        -122.427099,\n        37.61059\n      ],\n      [\n        -122.427162,\n        37.61047\n      ],\n      [\n        -122.427225,\n        37.610348\n      ],\n      [\n        -122.427286,\n        37.610224\n      ],\n      [\n        -122.427344,\n        37.610102\n      ],\n      [\n        -122.427402,\n        37.609979\n      ],\n      [\n        -122.427456,\n        37.609856\n      ],\n      [\n        -122.42751,\n        37.609732\n      ],\n      [\n        -122.427563,\n        37.609607\n      ],\n      [\n        -122.427614,\n        37.609481\n      ],\n      [\n        -122.427664,\n        37.609354\n      ],\n      [\n        -122.427711,\n        37.609228\n      ],\n      [\n        -122.427756,\n        37.609104\n      ],\n      [\n        -122.427798,\n        37.60898\n      ],\n      [\n        -122.427842,\n        37.608851\n      ],\n      [\n        -122.427882,\n        37.608724\n      ],\n      [\n        -122.42792,\n        37.608597\n      ],\n      [\n        -122.427958,\n        37.608468\n      ],\n      [\n        -122.427995,\n        37.608339\n      ],\n      [\n        -122.428028,\n        37.608209\n      ],\n      [\n        -122.428061,\n        37.608079\n      ],\n      [\n        -122.428092,\n        37.607947\n      ],\n      [\n        -122.428121,\n        37.607814\n      ],\n      [\n        -122.428149,\n        37.607684\n      ],\n      [\n        -122.428174,\n        37.607554\n      ],\n      [\n        -122.428197,\n        37.607428\n      ],\n      [\n        -122.428219,\n        37.607294\n      ],\n      [\n        -122.428237,\n        37.607164\n      ],\n      [\n        -122.428253,\n        37.607033\n      ],\n      [\n        -122.428267,\n        37.606899\n      ],\n      [\n        -122.428277,\n        37.606777\n      ],\n      [\n        -122.428284,\n        37.606645\n      ],\n      [\n        -122.428288,\n        37.606514\n      ],\n      [\n        -122.428291,\n        37.606384\n      ],\n      [\n        -122.428291,\n        37.606254\n      ],\n      [\n        -122.428286,\n        37.606122\n      ],\n      [\n        -122.42828,\n        37.605992\n      ],\n      [\n        -122.428269,\n        37.605859\n      ],\n      [\n        -122.428256,\n        37.605731\n      ],\n      [\n        -122.428241,\n        37.605604\n      ],\n      [\n        -122.428223,\n        37.605476\n      ],\n      [\n        -122.4282,\n        37.605334\n      ],\n      [\n        -122.428176,\n        37.605208\n      ],\n      [\n        -122.428149,\n        37.605078\n      ],\n      [\n        -122.428119,\n        37.604952\n      ],\n      [\n        -122.428086,\n        37.604822\n      ],\n      [\n        -122.428055,\n        37.604704\n      ],\n      [\n        -122.428017,\n        37.604573\n      ],\n      [\n        -122.427971,\n        37.604434\n      ],\n      [\n        -122.427927,\n        37.604308\n      ],\n      [\n        -122.42788,\n        37.604181\n      ],\n      [\n        -122.42783,\n        37.604055\n      ],\n      [\n        -122.427779,\n        37.603931\n      ],\n      [\n        -122.42772,\n        37.603799\n      ],\n      [\n        -122.427662,\n        37.603677\n      ],\n      [\n        -122.427603,\n        37.603555\n      ],\n      [\n        -122.42754,\n        37.603433\n      ],\n      [\n        -122.427477,\n        37.603318\n      ],\n      [\n        -122.427408,\n        37.603197\n      ],\n      [\n        -122.427339,\n        37.603082\n      ],\n      [\n        -122.427266,\n        37.602966\n      ],\n      [\n        -122.427189,\n        37.602848\n      ],\n      [\n        -122.427112,\n        37.602735\n      ],\n      [\n        -122.427031,\n        37.602619\n      ],\n      [\n        -122.426945,\n        37.602502\n      ],\n      [\n        -122.426859,\n        37.602392\n      ],\n      [\n        -122.426771,\n        37.602281\n      ],\n      [\n        -122.426683,\n        37.602174\n      ],\n      [\n        -122.426588,\n        37.602063\n      ],\n      [\n        -122.426495,\n        37.601958\n      ],\n      [\n        -122.426395,\n        37.601852\n      ],\n      [\n        -122.426296,\n        37.601748\n      ],\n      [\n        -122.426194,\n        37.601644\n      ],\n      [\n        -122.426088,\n        37.601541\n      ],\n      [\n        -122.425982,\n        37.601442\n      ],\n      [\n        -122.425874,\n        37.601343\n      ],\n      [\n        -122.425761,\n        37.601245\n      ],\n      [\n        -122.425648,\n        37.60115\n      ],\n      [\n        -122.425532,\n        37.601055\n      ],\n      [\n        -122.425415,\n        37.600961\n      ],\n      [\n        -122.425298,\n        37.600867\n      ],\n      [\n        -122.425185,\n        37.600775\n      ],\n      [\n        -122.425069,\n        37.600683\n      ],\n      [\n        -122.424837,\n        37.600498\n      ],\n      [\n        -122.422635,\n        37.598721\n      ],\n      [\n        -122.420554,\n        37.59703\n      ],\n      [\n        -122.420442,\n        37.596938\n      ],\n      [\n        -122.420327,\n        37.596843\n      ],\n      [\n        -122.420211,\n        37.596746\n      ],\n      [\n        -122.420099,\n        37.59665\n      ],\n      [\n        -122.419992,\n        37.596556\n      ],\n      [\n        -122.419879,\n        37.596456\n      ],\n      [\n        -122.419769,\n        37.596357\n      ],\n      [\n        -122.419661,\n        37.596257\n      ],\n      [\n        -122.419546,\n        37.596148\n      ],\n      [\n        -122.419433,\n        37.596039\n      ],\n      [\n        -122.419329,\n        37.59594\n      ],\n      [\n        -122.419239,\n        37.595853\n      ],\n      [\n        -122.419137,\n        37.595754\n      ],\n      [\n        -122.419032,\n        37.59565\n      ],\n      [\n        -122.418929,\n        37.595545\n      ],\n      [\n        -122.416797,\n        37.593379\n      ],\n      [\n        -122.413741,\n        37.590279\n      ],\n      [\n        -122.412737,\n        37.58926\n      ],\n      [\n        -122.412633,\n        37.589155\n      ],\n      [\n        -122.41254,\n        37.58906\n      ],\n      [\n        -122.411298,\n        37.587802\n      ],\n      [\n        -122.411193,\n        37.587697\n      ],\n      [\n        -122.411089,\n        37.587596\n      ],\n      [\n        -122.410982,\n        37.587495\n      ],\n      [\n        -122.410875,\n        37.587397\n      ],\n      [\n        -122.410764,\n        37.587297\n      ],\n      [\n        -122.410653,\n        37.5872\n      ],\n      [\n        -122.41054,\n        37.587105\n      ],\n      [\n        -122.410425,\n        37.587013\n      ],\n      [\n        -122.410307,\n        37.586918\n      ],\n      [\n        -122.410188,\n        37.586825\n      ],\n      [\n        -122.410069,\n        37.586736\n      ],\n      [\n        -122.409946,\n        37.586643\n      ],\n      [\n        -122.409833,\n        37.586559\n      ],\n      [\n        -122.409708,\n        37.586466\n      ],\n      [\n        -122.40959,\n        37.586378\n      ],\n      [\n        -122.40887,\n        37.585841\n      ],\n      [\n        -122.408264,\n        37.585388\n      ],\n      [\n        -122.408144,\n        37.585297\n      ],\n      [\n        -122.408027,\n        37.585207\n      ],\n      [\n        -122.407908,\n        37.585114\n      ],\n      [\n        -122.407793,\n        37.585023\n      ],\n      [\n        -122.407676,\n        37.584928\n      ],\n      [\n        -122.407561,\n        37.584833\n      ],\n      [\n        -122.407449,\n        37.584738\n      ],\n      [\n        -122.407338,\n        37.584642\n      ],\n      [\n        -122.407228,\n        37.584545\n      ],\n      [\n        -122.407116,\n        37.584445\n      ],\n      [\n        -122.407009,\n        37.584347\n      ],\n      [\n        -122.406902,\n        37.584248\n      ],\n      [\n        -122.406797,\n        37.584148\n      ],\n      [\n        -122.406692,\n        37.584047\n      ],\n      [\n        -122.406585,\n        37.583943\n      ],\n      [\n        -122.406484,\n        37.58384\n      ],\n      [\n        -122.406382,\n        37.583735\n      ],\n      [\n        -122.406287,\n        37.583635\n      ],\n      [\n        -122.406186,\n        37.583528\n      ],\n      [\n        -122.406091,\n        37.583423\n      ],\n      [\n        -122.405997,\n        37.58332\n      ],\n      [\n        -122.405903,\n        37.583212\n      ],\n      [\n        -122.405808,\n        37.583103\n      ],\n      [\n        -122.405715,\n        37.582993\n      ],\n      [\n        -122.405623,\n        37.582883\n      ],\n      [\n        -122.405532,\n        37.58277\n      ],\n      [\n        -122.405443,\n        37.582659\n      ],\n      [\n        -122.405356,\n        37.582547\n      ],\n      [\n        -122.40527,\n        37.582434\n      ],\n      [\n        -122.40519,\n        37.582325\n      ],\n      [\n        -122.405105,\n        37.582208\n      ],\n      [\n        -122.405022,\n        37.582092\n      ],\n      [\n        -122.404944,\n        37.581979\n      ],\n      [\n        -122.404866,\n        37.581864\n      ],\n      [\n        -122.404789,\n        37.581748\n      ],\n      [\n        -122.404712,\n        37.581632\n      ],\n      [\n        -122.404637,\n        37.581515\n      ],\n      [\n        -122.404564,\n        37.581395\n      ],\n      [\n        -122.404492,\n        37.581274\n      ],\n      [\n        -122.404422,\n        37.581156\n      ],\n      [\n        -122.404353,\n        37.581036\n      ],\n      [\n        -122.404293,\n        37.580933\n      ],\n      [\n        -122.404116,\n        37.580627\n      ],\n      [\n        -122.402009,\n        37.576976\n      ],\n      [\n        -122.400426,\n        37.574232\n      ],\n      [\n        -122.400356,\n        37.574113\n      ],\n      [\n        -122.400282,\n        37.573993\n      ],\n      [\n        -122.400209,\n        37.573879\n      ],\n      [\n        -122.40013,\n        37.573763\n      ],\n      [\n        -122.40005,\n        37.57365\n      ],\n      [\n        -122.399966,\n        37.573536\n      ],\n      [\n        -122.39988,\n        37.573426\n      ],\n      [\n        -122.39979,\n        37.573313\n      ],\n      [\n        -122.3997,\n        37.573206\n      ],\n      [\n        -122.399606,\n        37.573098\n      ],\n      [\n        -122.399507,\n        37.57299\n      ],\n      [\n        -122.399408,\n        37.572886\n      ],\n      [\n        -122.399307,\n        37.572782\n      ],\n      [\n        -122.395326,\n        37.568764\n      ],\n      [\n        -122.39522,\n        37.568658\n      ],\n      [\n        -122.395119,\n        37.568558\n      ],\n      [\n        -122.395015,\n        37.568457\n      ],\n      [\n        -122.394908,\n        37.568358\n      ],\n      [\n        -122.394799,\n        37.568259\n      ],\n      [\n        -122.394686,\n        37.568162\n      ],\n      [\n        -122.394571,\n        37.568066\n      ],\n      [\n        -122.394455,\n        37.567973\n      ],\n      [\n        -122.394339,\n        37.567884\n      ],\n      [\n        -122.394216,\n        37.567794\n      ],\n      [\n        -122.394093,\n        37.567706\n      ],\n      [\n        -122.393968,\n        37.56762\n      ],\n      [\n        -122.39384,\n        37.567535\n      ],\n      [\n        -122.393712,\n        37.567453\n      ],\n      [\n        -122.393581,\n        37.567374\n      ],\n      [\n        -122.39345,\n        37.567297\n      ],\n      [\n        -122.393314,\n        37.56722\n      ],\n      [\n        -122.393178,\n        37.567147\n      ],\n      [\n        -122.393042,\n        37.567076\n      ],\n      [\n        -122.3929,\n        37.567005\n      ],\n      [\n        -122.392756,\n        37.566936\n      ],\n      [\n        -122.392616,\n        37.566871\n      ],\n      [\n        -122.392468,\n        37.566807\n      ],\n      [\n        -122.392324,\n        37.566747\n      ],\n      [\n        -122.392175,\n        37.566688\n      ],\n      [\n        -122.392026,\n        37.566631\n      ],\n      [\n        -122.391874,\n        37.566576\n      ],\n      [\n        -122.391723,\n        37.566524\n      ],\n      [\n        -122.390811,\n        37.566217\n      ],\n      [\n        -122.390269,\n        37.566034\n      ],\n      [\n        -122.390119,\n        37.565983\n      ],\n      [\n        -122.38997,\n        37.565932\n      ],\n      [\n        -122.389823,\n        37.565879\n      ],\n      [\n        -122.389672,\n        37.565822\n      ],\n      [\n        -122.389528,\n        37.565763\n      ],\n      [\n        -122.389382,\n        37.565699\n      ],\n      [\n        -122.38924,\n        37.565634\n      ],\n      [\n        -122.389097,\n        37.565565\n      ],\n      [\n        -122.38896,\n        37.565494\n      ],\n      [\n        -122.388824,\n        37.565421\n      ],\n      [\n        -122.388689,\n        37.565344\n      ],\n      [\n        -122.388556,\n        37.565264\n      ],\n      [\n        -122.388429,\n        37.565183\n      ],\n      [\n        -122.388302,\n        37.565099\n      ],\n      [\n        -122.388179,\n        37.565013\n      ],\n      [\n        -122.388059,\n        37.564926\n      ],\n      [\n        -122.38794,\n        37.564834\n      ],\n      [\n        -122.387825,\n        37.564741\n      ],\n      [\n        -122.387713,\n        37.564646\n      ],\n      [\n        -122.387603,\n        37.564548\n      ],\n      [\n        -122.387494,\n        37.564446\n      ],\n      [\n        -122.387391,\n        37.564346\n      ],\n      [\n        -122.387289,\n        37.564245\n      ],\n      [\n        -122.382253,\n        37.559212\n      ],\n      [\n        -122.382152,\n        37.559109\n      ],\n      [\n        -122.382049,\n        37.559002\n      ],\n      [\n        -122.38195,\n        37.558895\n      ],\n      [\n        -122.381854,\n        37.55879\n      ],\n      [\n        -122.381755,\n        37.558679\n      ],\n      [\n        -122.381666,\n        37.558577\n      ],\n      [\n        -122.381572,\n        37.558465\n      ],\n      [\n        -122.381479,\n        37.558353\n      ],\n      [\n        -122.381391,\n        37.558242\n      ],\n      [\n        -122.381306,\n        37.558132\n      ],\n      [\n        -122.381225,\n        37.558026\n      ],\n      [\n        -122.381141,\n        37.557913\n      ],\n      [\n        -122.381056,\n        37.557795\n      ],\n      [\n        -122.380975,\n        37.557679\n      ],\n      [\n        -122.380895,\n        37.557561\n      ],\n      [\n        -122.38082,\n        37.557449\n      ],\n      [\n        -122.378211,\n        37.553502\n      ],\n      [\n        -122.378133,\n        37.553387\n      ],\n      [\n        -122.378054,\n        37.553269\n      ],\n      [\n        -122.377975,\n        37.553153\n      ],\n      [\n        -122.377896,\n        37.55304\n      ],\n      [\n        -122.377814,\n        37.552926\n      ],\n      [\n        -122.377731,\n        37.552814\n      ],\n      [\n        -122.377649,\n        37.552702\n      ],\n      [\n        -122.377563,\n        37.55259\n      ],\n      [\n        -122.377474,\n        37.552476\n      ],\n      [\n        -122.377386,\n        37.552365\n      ],\n      [\n        -122.377293,\n        37.552252\n      ],\n      [\n        -122.377203,\n        37.552143\n      ],\n      [\n        -122.377111,\n        37.552035\n      ],\n      [\n        -122.377017,\n        37.551927\n      ],\n      [\n        -122.376923,\n        37.55182\n      ],\n      [\n        -122.376825,\n        37.551712\n      ],\n      [\n        -122.376728,\n        37.551606\n      ],\n      [\n        -122.376288,\n        37.551134\n      ],\n      [\n        -122.376232,\n        37.551074\n      ],\n      [\n        -122.372783,\n        37.547371\n      ],\n      [\n        -122.372562,\n        37.547134\n      ],\n      [\n        -122.370154,\n        37.544547\n      ],\n      [\n        -122.368581,\n        37.542858\n      ],\n      [\n        -122.368484,\n        37.542753\n      ],\n      [\n        -122.368387,\n        37.542647\n      ],\n      [\n        -122.368292,\n        37.542541\n      ],\n      [\n        -122.368195,\n        37.542433\n      ],\n      [\n        -122.3681,\n        37.542324\n      ],\n      [\n        -122.368006,\n        37.542216\n      ],\n      [\n        -122.367911,\n        37.542105\n      ],\n      [\n        -122.367821,\n        37.541998\n      ],\n      [\n        -122.36773,\n        37.541889\n      ],\n      [\n        -122.36764,\n        37.541781\n      ],\n      [\n        -122.36755,\n        37.541671\n      ],\n      [\n        -122.367461,\n        37.541558\n      ],\n      [\n        -122.36737,\n        37.541444\n      ],\n      [\n        -122.367284,\n        37.541334\n      ],\n      [\n        -122.367197,\n        37.541222\n      ],\n      [\n        -122.367112,\n        37.54111\n      ],\n      [\n        -122.367029,\n        37.540998\n      ],\n      [\n        -122.366944,\n        37.540885\n      ],\n      [\n        -122.366859,\n        37.54077\n      ],\n      [\n        -122.366777,\n        37.540655\n      ],\n      [\n        -122.366694,\n        37.540539\n      ],\n      [\n        -122.366615,\n        37.540426\n      ],\n      [\n        -122.366533,\n        37.540308\n      ],\n      [\n        -122.366452,\n        37.540189\n      ],\n      [\n        -122.363065,\n        37.535193\n      ],\n      [\n        -122.362987,\n        37.535077\n      ],\n      [\n        -122.362909,\n        37.534962\n      ],\n      [\n        -122.362833,\n        37.534848\n      ],\n      [\n        -122.362753,\n        37.534722\n      ],\n      [\n        -122.36268,\n        37.534607\n      ],\n      [\n        -122.362608,\n        37.534487\n      ],\n      [\n        -122.362537,\n        37.534367\n      ],\n      [\n        -122.362465,\n        37.534243\n      ],\n      [\n        -122.362401,\n        37.53413\n      ],\n      [\n        -122.362334,\n        37.534007\n      ],\n      [\n        -122.362267,\n        37.533884\n      ],\n      [\n        -122.362204,\n        37.533762\n      ],\n      [\n        -122.362142,\n        37.533641\n      ],\n      [\n        -122.362083,\n        37.53352\n      ],\n      [\n        -122.362024,\n        37.533397\n      ],\n      [\n        -122.361967,\n        37.533274\n      ],\n      [\n        -122.36191,\n        37.533151\n      ],\n      [\n        -122.361855,\n        37.533025\n      ],\n      [\n        -122.361802,\n        37.532903\n      ],\n      [\n        -122.361745,\n        37.53277\n      ],\n      [\n        -122.361691,\n        37.532642\n      ],\n      [\n        -122.36164,\n        37.532521\n      ],\n      [\n        -122.361185,\n        37.531454\n      ],\n      [\n        -122.361112,\n        37.531284\n      ],\n      [\n        -122.359819,\n        37.528253\n      ],\n      [\n        -122.359742,\n        37.52807\n      ],\n      [\n        -122.359687,\n        37.527941\n      ],\n      [\n        -122.359634,\n        37.527816\n      ],\n      [\n        -122.359584,\n        37.5277\n      ],\n      [\n        -122.35953,\n        37.527575\n      ],\n      [\n        -122.359471,\n        37.527442\n      ],\n      [\n        -122.359413,\n        37.527315\n      ],\n      [\n        -122.359351,\n        37.527188\n      ],\n      [\n        -122.35929,\n        37.52707\n      ],\n      [\n        -122.359224,\n        37.526944\n      ],\n      [\n        -122.359091,\n        37.52673\n      ],\n      [\n        -122.358942,\n        37.526501\n      ],\n      [\n        -122.358731,\n        37.526208\n      ],\n      [\n        -122.358495,\n        37.52591\n      ],\n      [\n        -122.357159,\n        37.524423\n      ],\n      [\n        -122.356929,\n        37.524157\n      ],\n      [\n        -122.356719,\n        37.523891\n      ],\n      [\n        -122.356526,\n        37.523634\n      ],\n      [\n        -122.356338,\n        37.523353\n      ],\n      [\n        -122.356172,\n        37.523085\n      ],\n      [\n        -122.356004,\n        37.522786\n      ],\n      [\n        -122.355169,\n        37.521156\n      ],\n      [\n        -122.354981,\n        37.520785\n      ],\n      [\n        -122.354812,\n        37.520471\n      ],\n      [\n        -122.354625,\n        37.520149\n      ],\n      [\n        -122.354418,\n        37.519813\n      ],\n      [\n        -122.354212,\n        37.519494\n      ],\n      [\n        -122.353994,\n        37.519186\n      ],\n      [\n        -122.353777,\n        37.518901\n      ],\n      [\n        -122.353546,\n        37.518603\n      ],\n      [\n        -122.353278,\n        37.518284\n      ],\n      [\n        -122.353021,\n        37.517988\n      ],\n      [\n        -122.352742,\n        37.517682\n      ],\n      [\n        -122.352396,\n        37.51733\n      ],\n      [\n        -122.352183,\n        37.517128\n      ],\n      [\n        -122.34916,\n        37.514313\n      ],\n      [\n        -122.349158,\n        37.514311\n      ],\n      [\n        -122.348295,\n        37.513508\n      ],\n      [\n        -122.348078,\n        37.513306\n      ],\n      [\n        -122.347863,\n        37.513109\n      ],\n      [\n        -122.347639,\n        37.51291\n      ],\n      [\n        -122.347416,\n        37.512714\n      ],\n      [\n        -122.347193,\n        37.512524\n      ],\n      [\n        -122.346967,\n        37.512331\n      ],\n      [\n        -122.346734,\n        37.512138\n      ],\n      [\n        -122.346504,\n        37.511951\n      ],\n      [\n        -122.346266,\n        37.511762\n      ],\n      [\n        -122.346033,\n        37.511581\n      ],\n      [\n        -122.345794,\n        37.511396\n      ],\n      [\n        -122.345556,\n        37.511217\n      ],\n      [\n        -122.345313,\n        37.511036\n      ],\n      [\n        -122.345072,\n        37.510863\n      ],\n      [\n        -122.344817,\n        37.510682\n      ],\n      [\n        -122.344567,\n        37.510508\n      ],\n      [\n        -122.344313,\n        37.510334\n      ],\n      [\n        -122.344058,\n        37.510165\n      ],\n      [\n        -122.343805,\n        37.509997\n      ],\n      [\n        -122.343622,\n        37.50988\n      ],\n      [\n        -122.343551,\n        37.509834\n      ],\n      [\n        -122.343319,\n        37.509688\n      ],\n      [\n        -122.34289,\n        37.509421\n      ],\n      [\n        -122.341187,\n        37.508385\n      ],\n      [\n        -122.340327,\n        37.507859\n      ],\n      [\n        -122.339612,\n        37.507421\n      ],\n      [\n        -122.339482,\n        37.507342\n      ],\n      [\n        -122.338544,\n        37.506771\n      ],\n      [\n        -122.338493,\n        37.50674\n      ],\n      [\n        -122.337514,\n        37.506142\n      ],\n      [\n        -122.337191,\n        37.505944\n      ],\n      [\n        -122.336936,\n        37.50579\n      ],\n      [\n        -122.336675,\n        37.505628\n      ],\n      [\n        -122.336414,\n        37.505467\n      ],\n      [\n        -122.336153,\n        37.505304\n      ],\n      [\n        -122.335896,\n        37.50514\n      ],\n      [\n        -122.33564,\n        37.504974\n      ],\n      [\n        -122.335391,\n        37.50481\n      ],\n      [\n        -122.335137,\n        37.50464\n      ],\n      [\n        -122.334885,\n        37.504469\n      ],\n      [\n        -122.334635,\n        37.504297\n      ],\n      [\n        -122.332513,\n        37.502815\n      ],\n      [\n        -122.332388,\n        37.502726\n      ],\n      [\n        -122.332272,\n        37.502643\n      ],\n      [\n        -122.331661,\n        37.502202\n      ],\n      [\n        -122.331402,\n        37.502037\n      ],\n      [\n        -122.33114,\n        37.50188\n      ],\n      [\n        -122.330869,\n        37.50173\n      ],\n      [\n        -122.330589,\n        37.501585\n      ],\n      [\n        -122.330308,\n        37.501449\n      ],\n      [\n        -122.330028,\n        37.501323\n      ],\n      [\n        -122.329719,\n        37.501196\n      ],\n      [\n        -122.329408,\n        37.501078\n      ],\n      [\n        -122.329095,\n        37.500966\n      ],\n      [\n        -122.328695,\n        37.500833\n      ],\n      [\n        -122.32811,\n        37.50067\n      ],\n      [\n        -122.327558,\n        37.500548\n      ],\n      [\n        -122.326959,\n        37.500446\n      ],\n      [\n        -122.326361,\n        37.500367\n      ],\n      [\n        -122.325782,\n        37.500318\n      ],\n      [\n        -122.325187,\n        37.500297\n      ],\n      [\n        -122.323247,\n        37.500282\n      ],\n      [\n        -122.322673,\n        37.500264\n      ],\n      [\n        -122.322086,\n        37.500228\n      ],\n      [\n        -122.321491,\n        37.50017\n      ],\n      [\n        -122.320855,\n        37.500077\n      ],\n      [\n        -122.320231,\n        37.499965\n      ],\n      [\n        -122.319669,\n        37.49983\n      ],\n      [\n        -122.319339,\n        37.49974\n      ],\n      [\n        -122.318859,\n        37.499596\n      ],\n      [\n        -122.318471,\n        37.499462\n      ],\n      [\n        -122.318115,\n        37.499328\n      ],\n      [\n        -122.317734,\n        37.499175\n      ],\n      [\n        -122.317399,\n        37.49903\n      ],\n      [\n        -122.317038,\n        37.498858\n      ],\n      [\n        -122.31668,\n        37.498672\n      ],\n      [\n        -122.316276,\n        37.498448\n      ],\n      [\n        -122.315982,\n        37.498284\n      ],\n      [\n        -122.314428,\n        37.497426\n      ],\n      [\n        -122.314031,\n        37.497202\n      ],\n      [\n        -122.313616,\n        37.496977\n      ],\n      [\n        -122.31319,\n        37.496764\n      ],\n      [\n        -122.312745,\n        37.496561\n      ],\n      [\n        -122.312309,\n        37.496373\n      ],\n      [\n        -122.312048,\n        37.496254\n      ],\n      [\n        -122.311228,\n        37.495946\n      ],\n      [\n        -122.310623,\n        37.495736\n      ],\n      [\n        -122.309981,\n        37.495551\n      ],\n      [\n        -122.309593,\n        37.495447\n      ],\n      [\n        -122.309197,\n        37.495349\n      ],\n      [\n        -122.307588,\n        37.494965\n      ],\n      [\n        -122.305761,\n        37.494516\n      ],\n      [\n        -122.305391,\n        37.494414\n      ],\n      [\n        -122.305052,\n        37.494313\n      ],\n      [\n        -122.304742,\n        37.494215\n      ],\n      [\n        -122.304442,\n        37.494112\n      ],\n      [\n        -122.304137,\n        37.493996\n      ],\n      [\n        -122.303843,\n        37.493871\n      ],\n      [\n        -122.303561,\n        37.493742\n      ],\n      [\n        -122.30329,\n        37.493608\n      ],\n      [\n        -122.303013,\n        37.493462\n      ],\n      [\n        -122.302751,\n        37.493314\n      ],\n      [\n        -122.302491,\n        37.493159\n      ],\n      [\n        -122.302246,\n        37.493004\n      ],\n      [\n        -122.301998,\n        37.492833\n      ],\n      [\n        -122.301766,\n        37.49267\n      ],\n      [\n        -122.301532,\n        37.492489\n      ],\n      [\n        -122.301312,\n        37.492308\n      ],\n      [\n        -122.301097,\n        37.492121\n      ],\n      [\n        -122.300884,\n        37.491925\n      ],\n      [\n        -122.300683,\n        37.491725\n      ],\n      [\n        -122.300493,\n        37.491524\n      ],\n      [\n        -122.300308,\n        37.491316\n      ],\n      [\n        -122.300127,\n        37.4911\n      ],\n      [\n        -122.299959,\n        37.490876\n      ],\n      [\n        -122.299802,\n        37.490652\n      ],\n      [\n        -122.299743,\n        37.490563\n      ],\n      [\n        -122.299651,\n        37.490425\n      ],\n      [\n        -122.299514,\n        37.490199\n      ],\n      [\n        -122.299378,\n        37.489967\n      ],\n      [\n        -122.29925,\n        37.489727\n      ],\n      [\n        -122.299134,\n        37.489486\n      ],\n      [\n        -122.299031,\n        37.489253\n      ],\n      [\n        -122.299023,\n        37.489234\n      ],\n      [\n        -122.298913,\n        37.488976\n      ],\n      [\n        -122.298822,\n        37.488725\n      ],\n      [\n        -122.298747,\n        37.488479\n      ],\n      [\n        -122.29868,\n        37.488234\n      ],\n      [\n        -122.298625,\n        37.487976\n      ],\n      [\n        -122.298579,\n        37.487716\n      ],\n      [\n        -122.29854,\n        37.487417\n      ],\n      [\n        -122.298513,\n        37.487148\n      ],\n      [\n        -122.298502,\n        37.486885\n      ],\n      [\n        -122.298501,\n        37.486619\n      ],\n      [\n        -122.29851,\n        37.486364\n      ],\n      [\n        -122.298525,\n        37.486097\n      ],\n      [\n        -122.298555,\n        37.48584\n      ],\n      [\n        -122.298595,\n        37.485579\n      ],\n      [\n        -122.298678,\n        37.485065\n      ],\n      [\n        -122.299173,\n        37.482099\n      ],\n      [\n        -122.299447,\n        37.480314\n      ],\n      [\n        -122.29957,\n        37.479585\n      ],\n      [\n        -122.299603,\n        37.479329\n      ],\n      [\n        -122.299632,\n        37.479062\n      ],\n      [\n        -122.29965,\n        37.478804\n      ],\n      [\n        -122.299652,\n        37.478543\n      ],\n      [\n        -122.299644,\n        37.478283\n      ],\n      [\n        -122.299624,\n        37.478024\n      ],\n      [\n        -122.299596,\n        37.477757\n      ],\n      [\n        -122.299556,\n        37.477503\n      ],\n      [\n        -122.299505,\n        37.477244\n      ],\n      [\n        -122.299444,\n        37.476984\n      ],\n      [\n        -122.29937,\n        37.47672\n      ],\n      [\n        -122.299293,\n        37.476474\n      ],\n      [\n        -122.299203,\n        37.47622\n      ],\n      [\n        -122.299102,\n        37.475971\n      ],\n      [\n        -122.298988,\n        37.475716\n      ],\n      [\n        -122.298873,\n        37.475474\n      ],\n      [\n        -122.298747,\n        37.475236\n      ],\n      [\n        -122.29861,\n        37.474997\n      ],\n      [\n        -122.298466,\n        37.474766\n      ],\n      [\n        -122.29831,\n        37.474536\n      ],\n      [\n        -122.298146,\n        37.474311\n      ],\n      [\n        -122.297969,\n        37.474086\n      ],\n      [\n        -122.297785,\n        37.47387\n      ],\n      [\n        -122.297599,\n        37.473665\n      ],\n      [\n        -122.297401,\n        37.473462\n      ],\n      [\n        -122.297196,\n        37.473259\n      ],\n      [\n        -122.296882,\n        37.472963\n      ],\n      [\n        -122.29665,\n        37.472754\n      ],\n      [\n        -122.296413,\n        37.472543\n      ],\n      [\n        -122.296179,\n        37.472328\n      ],\n      [\n        -122.29432,\n        37.470577\n      ],\n      [\n        -122.294107,\n        37.470376\n      ],\n      [\n        -122.2939,\n        37.470173\n      ],\n      [\n        -122.293698,\n        37.469966\n      ],\n      [\n        -122.293498,\n        37.469749\n      ],\n      [\n        -122.293305,\n        37.469532\n      ],\n      [\n        -122.293115,\n        37.469309\n      ],\n      [\n        -122.29293,\n        37.469082\n      ],\n      [\n        -122.29276,\n        37.468859\n      ],\n      [\n        -122.292602,\n        37.468646\n      ],\n      [\n        -122.292542,\n        37.468557\n      ],\n      [\n        -122.292457,\n        37.468431\n      ],\n      [\n        -122.292437,\n        37.468401\n      ],\n      [\n        -122.292436,\n        37.468399\n      ],\n      [\n        -122.292355,\n        37.46827\n      ],\n      [\n        -122.292286,\n        37.46816\n      ],\n      [\n        -122.292172,\n        37.467966\n      ],\n      [\n        -122.292072,\n        37.467791\n      ],\n      [\n        -122.291954,\n        37.467571\n      ],\n      [\n        -122.291836,\n        37.467331\n      ],\n      [\n        -122.29172,\n        37.467081\n      ],\n      [\n        -122.291612,\n        37.466834\n      ],\n      [\n        -122.291517,\n        37.466588\n      ],\n      [\n        -122.291424,\n        37.466331\n      ],\n      [\n        -122.291343,\n        37.466078\n      ],\n      [\n        -122.291261,\n        37.465794\n      ],\n      [\n        -122.291217,\n        37.465639\n      ],\n      [\n        -122.29118,\n        37.465487\n      ],\n      [\n        -122.291133,\n        37.465264\n      ],\n      [\n        -122.291087,\n        37.46503\n      ],\n      [\n        -122.291048,\n        37.464778\n      ],\n      [\n        -122.291009,\n        37.464493\n      ],\n      [\n        -122.290986,\n        37.464237\n      ],\n      [\n        -122.290972,\n        37.464006\n      ],\n      [\n        -122.290949,\n        37.4635\n      ],\n      [\n        -122.290901,\n        37.462065\n      ],\n      [\n        -122.290889,\n        37.461779\n      ],\n      [\n        -122.290868,\n        37.461476\n      ],\n      [\n        -122.290831,\n        37.461188\n      ],\n      [\n        -122.290781,\n        37.460878\n      ],\n      [\n        -122.290723,\n        37.460605\n      ],\n      [\n        -122.290644,\n        37.460293\n      ],\n      [\n        -122.290584,\n        37.460104\n      ],\n      [\n        -122.290523,\n        37.459927\n      ],\n      [\n        -122.290436,\n        37.459691\n      ],\n      [\n        -122.290347,\n        37.459468\n      ],\n      [\n        -122.290227,\n        37.459194\n      ],\n      [\n        -122.290088,\n        37.458907\n      ],\n      [\n        -122.289928,\n        37.458616\n      ],\n      [\n        -122.289739,\n        37.458307\n      ],\n      [\n        -122.289508,\n        37.457975\n      ],\n      [\n        -122.289285,\n        37.457676\n      ],\n      [\n        -122.28905,\n        37.457391\n      ],\n      [\n        -122.2888,\n        37.457109\n      ],\n      [\n        -122.288548,\n        37.456852\n      ],\n      [\n        -122.288284,\n        37.456601\n      ],\n      [\n        -122.288022,\n        37.456373\n      ],\n      [\n        -122.287728,\n        37.456134\n      ],\n      [\n        -122.287407,\n        37.455896\n      ],\n      [\n        -122.287086,\n        37.455673\n      ],\n      [\n        -122.280366,\n        37.451252\n      ],\n      [\n        -122.277735,\n        37.449531\n      ],\n      [\n        -122.277231,\n        37.449195\n      ],\n      [\n        -122.276769,\n        37.44888\n      ],\n      [\n        -122.276168,\n        37.448467\n      ],\n      [\n        -122.272679,\n        37.446025\n      ],\n      [\n        -122.272313,\n        37.445772\n      ],\n      [\n        -122.271923,\n        37.445523\n      ],\n      [\n        -122.271518,\n        37.445289\n      ],\n      [\n        -122.271108,\n        37.445072\n      ],\n      [\n        -122.270697,\n        37.444874\n      ],\n      [\n        -122.270314,\n        37.444703\n      ],\n      [\n        -122.269933,\n        37.444545\n      ],\n      [\n        -122.269583,\n        37.444413\n      ],\n      [\n        -122.269305,\n        37.444313\n      ],\n      [\n        -122.26901,\n        37.444216\n      ],\n      [\n        -122.268687,\n        37.444118\n      ],\n      [\n        -122.268322,\n        37.44402\n      ],\n      [\n        -122.267978,\n        37.443934\n      ],\n      [\n        -122.267503,\n        37.443832\n      ],\n      [\n        -122.267031,\n        37.443747\n      ],\n      [\n        -122.266544,\n        37.443673\n      ],\n      [\n        -122.26605,\n        37.443615\n      ],\n      [\n        -122.265572,\n        37.443575\n      ],\n      [\n        -122.265134,\n        37.443554\n      ],\n      [\n        -122.264666,\n        37.443545\n      ],\n      [\n        -122.264208,\n        37.443547\n      ],\n      [\n        -122.26406,\n        37.443551\n      ],\n      [\n        -122.263935,\n        37.443555\n      ],\n      [\n        -122.263834,\n        37.44356\n      ],\n      [\n        -122.263765,\n        37.443564\n      ],\n      [\n        -122.263655,\n        37.44357\n      ],\n      [\n        -122.263539,\n        37.443578\n      ],\n      [\n        -122.263348,\n        37.443591\n      ],\n      [\n        -122.263035,\n        37.44362\n      ],\n      [\n        -122.260005,\n        37.44395\n      ],\n      [\n        -122.259514,\n        37.444\n      ],\n      [\n        -122.259046,\n        37.444033\n      ],\n      [\n        -122.258603,\n        37.444046\n      ],\n      [\n        -122.258142,\n        37.44404\n      ],\n      [\n        -122.257713,\n        37.444025\n      ],\n      [\n        -122.257265,\n        37.443991\n      ],\n      [\n        -122.256817,\n        37.44394\n      ],\n      [\n        -122.256382,\n        37.443874\n      ],\n      [\n        -122.255913,\n        37.443786\n      ],\n      [\n        -122.255462,\n        37.443686\n      ],\n      [\n        -122.255031,\n        37.443567\n      ],\n      [\n        -122.254593,\n        37.443437\n      ],\n      [\n        -122.254183,\n        37.443294\n      ],\n      [\n        -122.253767,\n        37.44313\n      ],\n      [\n        -122.253341,\n        37.442943\n      ],\n      [\n        -122.252933,\n        37.442743\n      ],\n      [\n        -122.252539,\n        37.442526\n      ],\n      [\n        -122.252163,\n        37.442298\n      ],\n      [\n        -122.251807,\n        37.442066\n      ],\n      [\n        -122.251477,\n        37.441825\n      ],\n      [\n        -122.249017,\n        37.43994\n      ],\n      [\n        -122.248322,\n        37.439401\n      ],\n      [\n        -122.247451,\n        37.4387\n      ],\n      [\n        -122.246531,\n        37.437945\n      ],\n      [\n        -122.243639,\n        37.435517\n      ],\n      [\n        -122.243085,\n        37.43505\n      ],\n      [\n        -122.241987,\n        37.434126\n      ],\n      [\n        -122.239324,\n        37.43189\n      ],\n      [\n        -122.238902,\n        37.431549\n      ],\n      [\n        -122.238398,\n        37.431149\n      ],\n      [\n        -122.237923,\n        37.430795\n      ],\n      [\n        -122.237425,\n        37.430433\n      ],\n      [\n        -122.233967,\n        37.427934\n      ],\n      [\n        -122.233382,\n        37.427506\n      ],\n      [\n        -122.23277,\n        37.427048\n      ],\n      [\n        -122.230212,\n        37.425096\n      ],\n      [\n        -122.229855,\n        37.424834\n      ],\n      [\n        -122.229404,\n        37.424517\n      ],\n      [\n        -122.226652,\n        37.422606\n      ],\n      [\n        -122.226043,\n        37.422072\n      ],\n      [\n        -122.22534,\n        37.421492\n      ],\n      [\n        -122.225072,\n        37.421286\n      ],\n      [\n        -122.224039,\n        37.420545\n      ],\n      [\n        -122.223396,\n        37.420152\n      ],\n      [\n        -122.222905,\n        37.419863\n      ],\n      [\n        -122.222484,\n        37.419645\n      ],\n      [\n        -122.222031,\n        37.419441\n      ],\n      [\n        -122.221602,\n        37.419257\n      ],\n      [\n        -122.221307,\n        37.419153\n      ],\n      [\n        -122.220981,\n        37.419048\n      ],\n      [\n        -122.220649,\n        37.418957\n      ],\n      [\n        -122.220311,\n        37.418885\n      ],\n      [\n        -122.219971,\n        37.418817\n      ],\n      [\n        -122.219696,\n        37.418753\n      ],\n      [\n        -122.219188,\n        37.418634\n      ],\n      [\n        -122.219067,\n        37.418587\n      ],\n      [\n        -122.218965,\n        37.418521\n      ],\n      [\n        -122.21889,\n        37.418438\n      ],\n      [\n        -122.218844,\n        37.418348\n      ],\n      [\n        -122.218823,\n        37.418248\n      ],\n      [\n        -122.218828,\n        37.418148\n      ],\n      [\n        -122.218858,\n        37.41805\n      ],\n      [\n        -122.218917,\n        37.417958\n      ],\n      [\n        -122.219013,\n        37.417871\n      ],\n      [\n        -122.219137,\n        37.417801\n      ],\n      [\n        -122.219282,\n        37.41776\n      ],\n      [\n        -122.219421,\n        37.41775\n      ],\n      [\n        -122.219569,\n        37.417767\n      ],\n      [\n        -122.219687,\n        37.417807\n      ],\n      [\n        -122.219794,\n        37.417867\n      ],\n      [\n        -122.21988,\n        37.417948\n      ],\n      [\n        -122.219944,\n        37.418046\n      ],\n      [\n        -122.219982,\n        37.418144\n      ],\n      [\n        -122.219984,\n        37.418233\n      ],\n      [\n        -122.219965,\n        37.41834\n      ],\n      [\n        -122.219915,\n        37.418438\n      ],\n      [\n        -122.219837,\n        37.418525\n      ],\n      [\n        -122.219739,\n        37.418636\n      ],\n      [\n        -122.217942,\n        37.419215\n      ],\n      [\n        -122.217027,\n        37.419501\n      ],\n      [\n        -122.216651,\n        37.419622\n      ],\n      [\n        -122.21575,\n        37.419912\n      ],\n      [\n        -122.214929,\n        37.420178\n      ],\n      [\n        -122.214641,\n        37.420261\n      ],\n      [\n        -122.214349,\n        37.420321\n      ],\n      [\n        -122.214046,\n        37.420361\n      ],\n      [\n        -122.21374,\n        37.420378\n      ],\n      [\n        -122.213449,\n        37.420378\n      ],\n      [\n        -122.211867,\n        37.420344\n      ],\n      [\n        -122.211681,\n        37.42034\n      ],\n      [\n        -122.211444,\n        37.420336\n      ],\n      [\n        -122.211195,\n        37.42034\n      ],\n      [\n        -122.210956,\n        37.42035\n      ],\n      [\n        -122.21085,\n        37.420352\n      ],\n      [\n        -122.210709,\n        37.420359\n      ],\n      [\n        -122.210551,\n        37.420365\n      ],\n      [\n        -122.210218,\n        37.420385\n      ],\n      [\n        -122.209883,\n        37.42041\n      ],\n      [\n        -122.209553,\n        37.42044\n      ],\n      [\n        -122.209205,\n        37.420478\n      ],\n      [\n        -122.208867,\n        37.420525\n      ],\n      [\n        -122.208513,\n        37.420578\n      ],\n      [\n        -122.208177,\n        37.42064\n      ],\n      [\n        -122.20782,\n        37.420715\n      ],\n      [\n        -122.207265,\n        37.42084\n      ],\n      [\n        -122.206957,\n        37.420902\n      ],\n      [\n        -122.206597,\n        37.420968\n      ],\n      [\n        -122.20623,\n        37.421024\n      ],\n      [\n        -122.205838,\n        37.421077\n      ],\n      [\n        -122.205455,\n        37.421124\n      ],\n      [\n        -122.20508,\n        37.421161\n      ],\n      [\n        -122.205051,\n        37.421164\n      ],\n      [\n        -122.20438,\n        37.421232\n      ],\n      [\n        -122.204275,\n        37.421242\n      ],\n      [\n        -122.204147,\n        37.421255\n      ],\n      [\n        -122.201533,\n        37.421537\n      ],\n      [\n        -122.201107,\n        37.421588\n      ],\n      [\n        -122.200678,\n        37.421648\n      ],\n      [\n        -122.200278,\n        37.421714\n      ],\n      [\n        -122.19986,\n        37.421795\n      ],\n      [\n        -122.199519,\n        37.421863\n      ],\n      [\n        -122.199213,\n        37.421932\n      ],\n      [\n        -122.199178,\n        37.42194\n      ],\n      [\n        -122.198883,\n        37.422018\n      ],\n      [\n        -122.198561,\n        37.422108\n      ],\n      [\n        -122.198474,\n        37.422139\n      ],\n      [\n        -122.198425,\n        37.422156\n      ],\n      [\n        -122.19825,\n        37.422219\n      ],\n      [\n        -122.197896,\n        37.422349\n      ],\n      [\n        -122.197548,\n        37.422485\n      ],\n      [\n        -122.197186,\n        37.42264\n      ],\n      [\n        -122.196845,\n        37.4228\n      ],\n      [\n        -122.196499,\n        37.422973\n      ],\n      [\n        -122.196177,\n        37.42315\n      ],\n      [\n        -122.196094,\n        37.4232\n      ],\n      [\n        -122.195885,\n        37.423328\n      ],\n      [\n        -122.195579,\n        37.423522\n      ],\n      [\n        -122.195313,\n        37.423703\n      ],\n      [\n        -122.195225,\n        37.423768\n      ],\n      [\n        -122.195027,\n        37.423914\n      ],\n      [\n        -122.194766,\n        37.424106\n      ],\n      [\n        -122.194498,\n        37.424304\n      ],\n      [\n        -122.193153,\n        37.425214\n      ],\n      [\n        -122.192575,\n        37.42561\n      ],\n      [\n        -122.19256,\n        37.425619\n      ],\n      [\n        -122.192405,\n        37.42572\n      ],\n      [\n        -122.192282,\n        37.425805\n      ],\n      [\n        -122.19216,\n        37.42589\n      ],\n      [\n        -122.191762,\n        37.426167\n      ],\n      [\n        -122.191563,\n        37.426312\n      ],\n      [\n        -122.191375,\n        37.426482\n      ],\n      [\n        -122.191241,\n        37.426644\n      ],\n      [\n        -122.191149,\n        37.426777\n      ],\n      [\n        -122.191129,\n        37.426806\n      ],\n      [\n        -122.190952,\n        37.427104\n      ],\n      [\n        -122.19026,\n        37.428271\n      ],\n      [\n        -122.190215,\n        37.428335\n      ],\n      [\n        -122.190208,\n        37.428345\n      ],\n      [\n        -122.190096,\n        37.428462\n      ],\n      [\n        -122.189939,\n        37.428643\n      ],\n      [\n        -122.189722,\n        37.428852\n      ],\n      [\n        -122.189509,\n        37.429051\n      ],\n      [\n        -122.189337,\n        37.4292\n      ],\n      [\n        -122.189138,\n        37.429349\n      ],\n      [\n        -122.188893,\n        37.429529\n      ],\n      [\n        -122.188533,\n        37.429792\n      ],\n      [\n        -122.188524,\n        37.429799\n      ],\n      [\n        -122.188418,\n        37.429874\n      ],\n      [\n        -122.188319,\n        37.429947\n      ],\n      [\n        -122.188,\n        37.430182\n      ],\n      [\n        -122.186839,\n        37.431034\n      ],\n      [\n        -122.186485,\n        37.431281\n      ],\n      [\n        -122.186284,\n        37.431428\n      ],\n      [\n        -122.186063,\n        37.43159\n      ],\n      [\n        -122.185817,\n        37.43177\n      ],\n      [\n        -122.185654,\n        37.43189\n      ],\n      [\n        -122.185552,\n        37.431966\n      ],\n      [\n        -122.184702,\n        37.432608\n      ],\n      [\n        -122.183286,\n        37.433649\n      ],\n      [\n        -122.182827,\n        37.433971\n      ],\n      [\n        -122.182634,\n        37.434112\n      ],\n      [\n        -122.182513,\n        37.434202\n      ],\n      [\n        -122.182166,\n        37.434457\n      ],\n      [\n        -122.18214,\n        37.434476\n      ],\n      [\n        -122.182126,\n        37.434486\n      ],\n      [\n        -122.181998,\n        37.434592\n      ],\n      [\n        -122.181882,\n        37.434681\n      ],\n      [\n        -122.181665,\n        37.434834\n      ],\n      [\n        -122.181345,\n        37.435062\n      ],\n      [\n        -122.180965,\n        37.435357\n      ],\n      [\n        -122.178991,\n        37.43681\n      ],\n      [\n        -122.178669,\n        37.43705\n      ],\n      [\n        -122.178411,\n        37.43725\n      ],\n      [\n        -122.178231,\n        37.437383\n      ],\n      [\n        -122.178125,\n        37.437455\n      ],\n      [\n        -122.178033,\n        37.437514\n      ],\n      [\n        -122.177808,\n        37.437668\n      ],\n      [\n        -122.177521,\n        37.437894\n      ],\n      [\n        -122.176832,\n        37.438394\n      ],\n      [\n        -122.176418,\n        37.438698\n      ],\n      [\n        -122.17632,\n        37.438768\n      ],\n      [\n        -122.176186,\n        37.438864\n      ],\n      [\n        -122.176054,\n        37.43896\n      ],\n      [\n        -122.176026,\n        37.43898\n      ],\n      [\n        -122.175893,\n        37.439076\n      ],\n      [\n        -122.175795,\n        37.439148\n      ],\n      [\n        -122.175016,\n        37.439717\n      ],\n      [\n        -122.174925,\n        37.439791\n      ],\n      [\n        -122.174726,\n        37.439978\n      ],\n      [\n        -122.174614,\n        37.440109\n      ],\n      [\n        -122.174533,\n        37.440215\n      ],\n      [\n        -122.174491,\n        37.440273\n      ],\n      [\n        -122.174394,\n        37.440424\n      ],\n      [\n        -122.174352,\n        37.440496\n      ],\n      [\n        -122.174341,\n        37.440515\n      ],\n      [\n        -122.1743,\n        37.44059\n      ],\n      [\n        -122.174209,\n        37.440557\n      ],\n      [\n        -122.173548,\n        37.440299\n      ],\n      [\n        -122.173114,\n        37.440158\n      ],\n      [\n        -122.172817,\n        37.440052\n      ],\n      [\n        -122.172788,\n        37.440041\n      ],\n      [\n        -122.172673,\n        37.44\n      ],\n      [\n        -122.1726,\n        37.439972\n      ],\n      [\n        -122.171888,\n        37.439701\n      ],\n      [\n        -122.171322,\n        37.439484\n      ],\n      [\n        -122.171295,\n        37.439474\n      ],\n      [\n        -122.171193,\n        37.439438\n      ],\n      [\n        -122.171069,\n        37.439398\n      ],\n      [\n        -122.171022,\n        37.439511\n      ],\n      [\n        -122.170978,\n        37.43961\n      ],\n      [\n        -122.170854,\n        37.439888\n      ],\n      [\n        -122.170636,\n        37.440392\n      ],\n      [\n        -122.170463,\n        37.440781\n      ],\n      [\n        -122.170458,\n        37.440792\n      ],\n      [\n        -122.170422,\n        37.440861\n      ],\n      [\n        -122.17038,\n        37.441018\n      ],\n      [\n        -122.170353,\n        37.441062\n      ],\n      [\n        -122.170277,\n        37.441179\n      ],\n      [\n        -122.170257,\n        37.441204\n      ],\n      [\n        -122.170162,\n        37.441316\n      ],\n      [\n        -122.169916,\n        37.441521\n      ],\n      [\n        -122.169533,\n        37.44184\n      ],\n      [\n        -122.169256,\n        37.442069\n      ],\n      [\n        -122.169091,\n        37.442204\n      ],\n      [\n        -122.168977,\n        37.442298\n      ],\n      [\n        -122.168948,\n        37.442321\n      ],\n      [\n        -122.168933,\n        37.442334\n      ],\n      [\n        -122.168817,\n        37.442429\n      ],\n      [\n        -122.168893,\n        37.442547\n      ],\n      [\n        -122.16896,\n        37.4426\n      ],\n      [\n        -122.169369,\n        37.442909\n      ],\n      [\n        -122.169588,\n        37.443091\n      ],\n      [\n        -122.169599,\n        37.4431\n      ],\n      [\n        -122.169614,\n        37.443111\n      ],\n      [\n        -122.169649,\n        37.443139\n      ],\n      [\n        -122.169562,\n        37.443224\n      ],\n      [\n        -122.169546,\n        37.443239\n      ],\n      [\n        -122.169517,\n        37.443266\n      ],\n      [\n        -122.169457,\n        37.44332\n      ],\n      [\n        -122.169396,\n        37.443375\n      ]\n    ],\n    \"type\": \"LineString\"\n  }\n}"
  },
  {
    "path": "app/src/main/assets/dva-sf-route-main.geojson",
    "content": "{\n  \"type\": \"Feature\",\n  \"id\": \"route-sf-1\",\n  \"properties\": {},\n  \"geometry\": {\n    \"coordinates\": [\n      [\n        -122.407122,\n        37.652918\n      ],\n      [\n        -122.40703,\n        37.651854\n      ],\n      [\n        -122.406994,\n        37.651448\n      ],\n      [\n        -122.406878,\n        37.650131\n      ],\n      [\n        -122.406851,\n        37.649815\n      ],\n      [\n        -122.406772,\n        37.648917\n      ],\n      [\n        -122.406733,\n        37.648485\n      ],\n      [\n        -122.406676,\n        37.647823\n      ],\n      [\n        -122.406364,\n        37.644247\n      ],\n      [\n        -122.406231,\n        37.642768\n      ],\n      [\n        -122.406206,\n        37.642476\n      ],\n      [\n        -122.406181,\n        37.642169\n      ],\n      [\n        -122.406169,\n        37.642037\n      ],\n      [\n        -122.406155,\n        37.641901\n      ],\n      [\n        -122.406134,\n        37.641737\n      ],\n      [\n        -122.406113,\n        37.641594\n      ],\n      [\n        -122.406092,\n        37.641458\n      ],\n      [\n        -122.406066,\n        37.641299\n      ],\n      [\n        -122.406039,\n        37.641152\n      ],\n      [\n        -122.406009,\n        37.641006\n      ],\n      [\n        -122.40598,\n        37.640867\n      ],\n      [\n        -122.405949,\n        37.640727\n      ],\n      [\n        -122.405908,\n        37.64057\n      ],\n      [\n        -122.405868,\n        37.640419\n      ],\n      [\n        -122.405827,\n        37.640276\n      ],\n      [\n        -122.405785,\n        37.640137\n      ],\n      [\n        -122.405741,\n        37.639993\n      ],\n      [\n        -122.405692,\n        37.639838\n      ],\n      [\n        -122.405648,\n        37.639713\n      ],\n      [\n        -122.405599,\n        37.639576\n      ],\n      [\n        -122.405539,\n        37.639419\n      ],\n      [\n        -122.405483,\n        37.639279\n      ],\n      [\n        -122.405426,\n        37.639136\n      ],\n      [\n        -122.405366,\n        37.638994\n      ],\n      [\n        -122.405306,\n        37.638854\n      ],\n      [\n        -122.405243,\n        37.638712\n      ],\n      [\n        -122.405181,\n        37.638577\n      ],\n      [\n        -122.405114,\n        37.638439\n      ],\n      [\n        -122.405045,\n        37.638299\n      ],\n      [\n        -122.404974,\n        37.63816\n      ],\n      [\n        -122.404901,\n        37.63802\n      ],\n      [\n        -122.404323,\n        37.636939\n      ],\n      [\n        -122.404251,\n        37.636803\n      ],\n      [\n        -122.404184,\n        37.636672\n      ],\n      [\n        -122.404117,\n        37.636538\n      ],\n      [\n        -122.404064,\n        37.636428\n      ],\n      [\n        -122.404002,\n        37.636293\n      ],\n      [\n        -122.40395,\n        37.636178\n      ],\n      [\n        -122.403894,\n        37.63605\n      ],\n      [\n        -122.403843,\n        37.635931\n      ],\n      [\n        -122.403789,\n        37.6358\n      ],\n      [\n        -122.403732,\n        37.635658\n      ],\n      [\n        -122.403684,\n        37.635533\n      ],\n      [\n        -122.40364,\n        37.63541\n      ],\n      [\n        -122.403595,\n        37.635288\n      ],\n      [\n        -122.403551,\n        37.635157\n      ],\n      [\n        -122.403508,\n        37.635026\n      ],\n      [\n        -122.403468,\n        37.6349\n      ],\n      [\n        -122.40343,\n        37.634774\n      ],\n      [\n        -122.403391,\n        37.634642\n      ],\n      [\n        -122.403353,\n        37.63451\n      ],\n      [\n        -122.403318,\n        37.634376\n      ],\n      [\n        -122.403285,\n        37.634245\n      ],\n      [\n        -122.403253,\n        37.634111\n      ],\n      [\n        -122.403221,\n        37.633966\n      ],\n      [\n        -122.403193,\n        37.63384\n      ],\n      [\n        -122.40317,\n        37.633726\n      ],\n      [\n        -122.403138,\n        37.633567\n      ],\n      [\n        -122.403111,\n        37.633403\n      ],\n      [\n        -122.40309,\n        37.633268\n      ],\n      [\n        -122.403064,\n        37.633087\n      ],\n      [\n        -122.403047,\n        37.632951\n      ],\n      [\n        -122.40303,\n        37.632806\n      ],\n      [\n        -122.402911,\n        37.63176\n      ],\n      [\n        -122.402811,\n        37.63089\n      ],\n      [\n        -122.402642,\n        37.629404\n      ],\n      [\n        -122.402623,\n        37.629241\n      ],\n      [\n        -122.402607,\n        37.629108\n      ],\n      [\n        -122.402587,\n        37.628957\n      ],\n      [\n        -122.402566,\n        37.628812\n      ],\n      [\n        -122.402544,\n        37.628667\n      ],\n      [\n        -122.402517,\n        37.628512\n      ],\n      [\n        -122.402492,\n        37.628367\n      ],\n      [\n        -122.402465,\n        37.628224\n      ],\n      [\n        -122.402436,\n        37.628087\n      ],\n      [\n        -122.402403,\n        37.627941\n      ],\n      [\n        -122.402369,\n        37.627793\n      ],\n      [\n        -122.402331,\n        37.627639\n      ],\n      [\n        -122.402296,\n        37.627503\n      ],\n      [\n        -122.40226,\n        37.627369\n      ],\n      [\n        -122.402213,\n        37.627208\n      ],\n      [\n        -122.402174,\n        37.627078\n      ],\n      [\n        -122.402127,\n        37.626933\n      ],\n      [\n        -122.402079,\n        37.626785\n      ],\n      [\n        -122.402028,\n        37.626631\n      ],\n      [\n        -122.40198,\n        37.626488\n      ],\n      [\n        -122.401772,\n        37.625875\n      ],\n      [\n        -122.401515,\n        37.625117\n      ],\n      [\n        -122.40142,\n        37.624803\n      ],\n      [\n        -122.401324,\n        37.624488\n      ],\n      [\n        -122.400341,\n        37.621582\n      ],\n      [\n        -122.399869,\n        37.620178\n      ],\n      [\n        -122.398952,\n        37.617466\n      ],\n      [\n        -122.398743,\n        37.616845\n      ],\n      [\n        -122.398701,\n        37.616722\n      ],\n      [\n        -122.398663,\n        37.616608\n      ],\n      [\n        -122.398618,\n        37.616485\n      ],\n      [\n        -122.39857,\n        37.61636\n      ],\n      [\n        -122.398508,\n        37.616213\n      ],\n      [\n        -122.3984,\n        37.615968\n      ],\n      [\n        -122.398284,\n        37.61573\n      ],\n      [\n        -122.39816,\n        37.615493\n      ],\n      [\n        -122.398022,\n        37.615251\n      ],\n      [\n        -122.397882,\n        37.615023\n      ],\n      [\n        -122.397725,\n        37.614781\n      ],\n      [\n        -122.397568,\n        37.614549\n      ],\n      [\n        -122.397402,\n        37.614317\n      ],\n      [\n        -122.397228,\n        37.614089\n      ],\n      [\n        -122.397051,\n        37.61387\n      ],\n      [\n        -122.396867,\n        37.613653\n      ],\n      [\n        -122.39667,\n        37.613431\n      ],\n      [\n        -122.39646,\n        37.613209\n      ],\n      [\n        -122.396245,\n        37.612995\n      ],\n      [\n        -122.396045,\n        37.612802\n      ],\n      [\n        -122.395829,\n        37.612604\n      ],\n      [\n        -122.395603,\n        37.612407\n      ],\n      [\n        -122.395394,\n        37.612232\n      ],\n      [\n        -122.395166,\n        37.61205\n      ],\n      [\n        -122.39493,\n        37.611869\n      ],\n      [\n        -122.394687,\n        37.611692\n      ],\n      [\n        -122.394458,\n        37.611531\n      ],\n      [\n        -122.394185,\n        37.61135\n      ],\n      [\n        -122.393921,\n        37.611179\n      ],\n      [\n        -122.393654,\n        37.611007\n      ],\n      [\n        -122.393397,\n        37.610841\n      ],\n      [\n        -122.393147,\n        37.610683\n      ],\n      [\n        -122.392891,\n        37.610521\n      ],\n      [\n        -122.392612,\n        37.610347\n      ],\n      [\n        -122.39236,\n        37.61019\n      ],\n      [\n        -122.392101,\n        37.610026\n      ],\n      [\n        -122.391844,\n        37.609862\n      ],\n      [\n        -122.391581,\n        37.609692\n      ],\n      [\n        -122.39133,\n        37.60953\n      ],\n      [\n        -122.389329,\n        37.608223\n      ],\n      [\n        -122.388638,\n        37.607793\n      ],\n      [\n        -122.387492,\n        37.607043\n      ],\n      [\n        -122.3848,\n        37.605286\n      ],\n      [\n        -122.383524,\n        37.604454\n      ],\n      [\n        -122.381873,\n        37.603398\n      ],\n      [\n        -122.378533,\n        37.601208\n      ],\n      [\n        -122.376497,\n        37.599876\n      ],\n      [\n        -122.375465,\n        37.599208\n      ],\n      [\n        -122.374245,\n        37.598423\n      ],\n      [\n        -122.373929,\n        37.598218\n      ],\n      [\n        -122.373674,\n        37.598053\n      ],\n      [\n        -122.373418,\n        37.597889\n      ],\n      [\n        -122.373162,\n        37.597724\n      ],\n      [\n        -122.372907,\n        37.597561\n      ],\n      [\n        -122.37265,\n        37.597395\n      ],\n      [\n        -122.372394,\n        37.597228\n      ],\n      [\n        -122.368822,\n        37.594894\n      ],\n      [\n        -122.367297,\n        37.593897\n      ],\n      [\n        -122.365383,\n        37.592646\n      ],\n      [\n        -122.360976,\n        37.589762\n      ],\n      [\n        -122.360722,\n        37.589597\n      ],\n      [\n        -122.360468,\n        37.589432\n      ],\n      [\n        -122.360219,\n        37.589274\n      ],\n      [\n        -122.359957,\n        37.589115\n      ],\n      [\n        -122.359695,\n        37.588967\n      ],\n      [\n        -122.359427,\n        37.588824\n      ],\n      [\n        -122.35915,\n        37.588687\n      ],\n      [\n        -122.358867,\n        37.588555\n      ],\n      [\n        -122.358581,\n        37.588431\n      ],\n      [\n        -122.358289,\n        37.588311\n      ],\n      [\n        -122.357994,\n        37.5882\n      ],\n      [\n        -122.357698,\n        37.588091\n      ],\n      [\n        -122.357402,\n        37.587989\n      ],\n      [\n        -122.357098,\n        37.587889\n      ],\n      [\n        -122.356792,\n        37.587796\n      ],\n      [\n        -122.356484,\n        37.587708\n      ],\n      [\n        -122.356163,\n        37.587624\n      ],\n      [\n        -122.355841,\n        37.587546\n      ],\n      [\n        -122.355524,\n        37.587478\n      ],\n      [\n        -122.355205,\n        37.587414\n      ],\n      [\n        -122.354873,\n        37.587356\n      ],\n      [\n        -122.354553,\n        37.587305\n      ],\n      [\n        -122.354231,\n        37.587261\n      ],\n      [\n        -122.353893,\n        37.587222\n      ],\n      [\n        -122.353563,\n        37.58719\n      ],\n      [\n        -122.353235,\n        37.587165\n      ],\n      [\n        -122.352907,\n        37.587146\n      ],\n      [\n        -122.352572,\n        37.587134\n      ],\n      [\n        -122.352244,\n        37.587126\n      ],\n      [\n        -122.351913,\n        37.587117\n      ],\n      [\n        -122.350092,\n        37.587071\n      ],\n      [\n        -122.348434,\n        37.587029\n      ],\n      [\n        -122.342158,\n        37.586869\n      ],\n      [\n        -122.338352,\n        37.586771\n      ],\n      [\n        -122.334706,\n        37.586675\n      ],\n      [\n        -122.334539,\n        37.58667\n      ],\n      [\n        -122.334374,\n        37.586666\n      ],\n      [\n        -122.334208,\n        37.58666\n      ],\n      [\n        -122.334043,\n        37.586654\n      ],\n      [\n        -122.333876,\n        37.586644\n      ],\n      [\n        -122.333713,\n        37.586632\n      ],\n      [\n        -122.333549,\n        37.586616\n      ],\n      [\n        -122.333401,\n        37.586599\n      ],\n      [\n        -122.333238,\n        37.586578\n      ],\n      [\n        -122.333073,\n        37.586554\n      ],\n      [\n        -122.332912,\n        37.586527\n      ],\n      [\n        -122.332757,\n        37.586499\n      ],\n      [\n        -122.332598,\n        37.586467\n      ],\n      [\n        -122.332439,\n        37.586432\n      ],\n      [\n        -122.332284,\n        37.586394\n      ],\n      [\n        -122.332129,\n        37.586353\n      ],\n      [\n        -122.331973,\n        37.586307\n      ],\n      [\n        -122.331819,\n        37.586259\n      ],\n      [\n        -122.331668,\n        37.586208\n      ],\n      [\n        -122.331517,\n        37.586154\n      ],\n      [\n        -122.331368,\n        37.586097\n      ],\n      [\n        -122.33122,\n        37.586036\n      ],\n      [\n        -122.331076,\n        37.585974\n      ],\n      [\n        -122.330939,\n        37.585911\n      ],\n      [\n        -122.330797,\n        37.585841\n      ],\n      [\n        -122.330659,\n        37.585771\n      ],\n      [\n        -122.330522,\n        37.585697\n      ],\n      [\n        -122.330388,\n        37.585619\n      ],\n      [\n        -122.330255,\n        37.58554\n      ],\n      [\n        -122.330128,\n        37.585459\n      ],\n      [\n        -122.33,\n        37.585373\n      ],\n      [\n        -122.329877,\n        37.585286\n      ],\n      [\n        -122.329755,\n        37.585196\n      ],\n      [\n        -122.329637,\n        37.585105\n      ],\n      [\n        -122.329528,\n        37.585016\n      ],\n      [\n        -122.329416,\n        37.584919\n      ],\n      [\n        -122.329307,\n        37.584822\n      ],\n      [\n        -122.329199,\n        37.584723\n      ],\n      [\n        -122.32909,\n        37.584624\n      ],\n      [\n        -122.328981,\n        37.584525\n      ],\n      [\n        -122.328761,\n        37.584324\n      ],\n      [\n        -122.32855,\n        37.58413\n      ],\n      [\n        -122.32586,\n        37.581655\n      ],\n      [\n        -122.322973,\n        37.578998\n      ],\n      [\n        -122.322116,\n        37.578206\n      ],\n      [\n        -122.320062,\n        37.576311\n      ],\n      [\n        -122.320017,\n        37.57627\n      ],\n      [\n        -122.319869,\n        37.576134\n      ],\n      [\n        -122.316743,\n        37.573261\n      ],\n      [\n        -122.315547,\n        37.572164\n      ],\n      [\n        -122.314233,\n        37.570954\n      ],\n      [\n        -122.313924,\n        37.57067\n      ],\n      [\n        -122.310821,\n        37.567812\n      ],\n      [\n        -122.307349,\n        37.564604\n      ],\n      [\n        -122.303966,\n        37.561465\n      ],\n      [\n        -122.303806,\n        37.561318\n      ],\n      [\n        -122.303563,\n        37.561094\n      ],\n      [\n        -122.303229,\n        37.560786\n      ],\n      [\n        -122.302745,\n        37.560339\n      ],\n      [\n        -122.302578,\n        37.560184\n      ],\n      [\n        -122.302221,\n        37.559834\n      ],\n      [\n        -122.301877,\n        37.559462\n      ],\n      [\n        -122.301503,\n        37.559045\n      ],\n      [\n        -122.300259,\n        37.557614\n      ],\n      [\n        -122.299811,\n        37.557113\n      ],\n      [\n        -122.299097,\n        37.556349\n      ],\n      [\n        -122.298297,\n        37.555496\n      ],\n      [\n        -122.297836,\n        37.554994\n      ],\n      [\n        -122.297302,\n        37.554435\n      ],\n      [\n        -122.296463,\n        37.55358\n      ],\n      [\n        -122.296045,\n        37.553142\n      ],\n      [\n        -122.29561,\n        37.552672\n      ],\n      [\n        -122.295214,\n        37.552246\n      ],\n      [\n        -122.293655,\n        37.550567\n      ],\n      [\n        -122.293004,\n        37.549875\n      ],\n      [\n        -122.292169,\n        37.548986\n      ],\n      [\n        -122.291948,\n        37.548743\n      ],\n      [\n        -122.289392,\n        37.54597\n      ],\n      [\n        -122.288405,\n        37.544944\n      ],\n      [\n        -122.287796,\n        37.544278\n      ],\n      [\n        -122.286169,\n        37.542512\n      ],\n      [\n        -122.285673,\n        37.541977\n      ],\n      [\n        -122.285448,\n        37.541735\n      ],\n      [\n        -122.285224,\n        37.541487\n      ],\n      [\n        -122.284387,\n        37.54056\n      ],\n      [\n        -122.283855,\n        37.53998\n      ],\n      [\n        -122.281894,\n        37.537856\n      ],\n      [\n        -122.278507,\n        37.534197\n      ],\n      [\n        -122.278221,\n        37.533889\n      ],\n      [\n        -122.276436,\n        37.53196\n      ],\n      [\n        -122.276115,\n        37.531611\n      ],\n      [\n        -122.27579,\n        37.531271\n      ],\n      [\n        -122.275406,\n        37.530884\n      ],\n      [\n        -122.275046,\n        37.530531\n      ],\n      [\n        -122.274708,\n        37.530208\n      ],\n      [\n        -122.274342,\n        37.529869\n      ],\n      [\n        -122.273655,\n        37.529205\n      ],\n      [\n        -122.273154,\n        37.528815\n      ],\n      [\n        -122.272342,\n        37.528105\n      ],\n      [\n        -122.272189,\n        37.527971\n      ],\n      [\n        -122.270415,\n        37.526418\n      ],\n      [\n        -122.269845,\n        37.52592\n      ],\n      [\n        -122.266637,\n        37.523089\n      ],\n      [\n        -122.264819,\n        37.521483\n      ],\n      [\n        -122.264759,\n        37.52143\n      ],\n      [\n        -122.264614,\n        37.521302\n      ],\n      [\n        -122.262626,\n        37.51954\n      ],\n      [\n        -122.261998,\n        37.518984\n      ],\n      [\n        -122.260906,\n        37.518025\n      ],\n      [\n        -122.259427,\n        37.516714\n      ],\n      [\n        -122.258951,\n        37.516295\n      ],\n      [\n        -122.258289,\n        37.515711\n      ],\n      [\n        -122.256591,\n        37.51421\n      ],\n      [\n        -122.255976,\n        37.513661\n      ],\n      [\n        -122.254131,\n        37.512029\n      ],\n      [\n        -122.252182,\n        37.510308\n      ],\n      [\n        -122.251133,\n        37.509364\n      ],\n      [\n        -122.247718,\n        37.506343\n      ],\n      [\n        -122.246359,\n        37.505143\n      ],\n      [\n        -122.24495,\n        37.5039\n      ],\n      [\n        -122.242977,\n        37.502159\n      ],\n      [\n        -122.241503,\n        37.500843\n      ],\n      [\n        -122.240626,\n        37.500077\n      ],\n      [\n        -122.239936,\n        37.49948\n      ],\n      [\n        -122.23961,\n        37.499205\n      ],\n      [\n        -122.239275,\n        37.498933\n      ],\n      [\n        -122.238925,\n        37.49867\n      ],\n      [\n        -122.238549,\n        37.498412\n      ],\n      [\n        -122.238179,\n        37.498179\n      ],\n      [\n        -122.237781,\n        37.497947\n      ],\n      [\n        -122.237643,\n        37.497874\n      ],\n      [\n        -122.237525,\n        37.497812\n      ],\n      [\n        -122.237316,\n        37.497702\n      ],\n      [\n        -122.236836,\n        37.497476\n      ],\n      [\n        -122.236428,\n        37.497294\n      ],\n      [\n        -122.236015,\n        37.497131\n      ],\n      [\n        -122.235562,\n        37.496967\n      ],\n      [\n        -122.235117,\n        37.496826\n      ],\n      [\n        -122.234679,\n        37.496692\n      ],\n      [\n        -122.233317,\n        37.496306\n      ],\n      [\n        -122.232849,\n        37.496174\n      ],\n      [\n        -122.231907,\n        37.495907\n      ],\n      [\n        -122.228972,\n        37.495072\n      ],\n      [\n        -122.227971,\n        37.494786\n      ],\n      [\n        -122.227474,\n        37.494646\n      ],\n      [\n        -122.226952,\n        37.494495\n      ],\n      [\n        -122.22654,\n        37.494367\n      ],\n      [\n        -122.226136,\n        37.494237\n      ],\n      [\n        -122.225754,\n        37.494108\n      ],\n      [\n        -122.225217,\n        37.493918\n      ],\n      [\n        -122.224802,\n        37.493767\n      ],\n      [\n        -122.224342,\n        37.493593\n      ],\n      [\n        -122.2239,\n        37.493416\n      ],\n      [\n        -122.223464,\n        37.493236\n      ],\n      [\n        -122.223043,\n        37.493054\n      ],\n      [\n        -122.222589,\n        37.492856\n      ],\n      [\n        -122.219022,\n        37.49127\n      ],\n      [\n        -122.218915,\n        37.491223\n      ],\n      [\n        -122.218667,\n        37.491016\n      ],\n      [\n        -122.218287,\n        37.490841\n      ],\n      [\n        -122.217089,\n        37.490211\n      ],\n      [\n        -122.216943,\n        37.490137\n      ],\n      [\n        -122.216767,\n        37.490056\n      ],\n      [\n        -122.21625,\n        37.489824\n      ],\n      [\n        -122.215678,\n        37.489556\n      ],\n      [\n        -122.21556,\n        37.4895\n      ],\n      [\n        -122.215443,\n        37.48944\n      ],\n      [\n        -122.215323,\n        37.489376\n      ],\n      [\n        -122.215209,\n        37.489308\n      ],\n      [\n        -122.215104,\n        37.489236\n      ],\n      [\n        -122.215016,\n        37.489169\n      ],\n      [\n        -122.214926,\n        37.489094\n      ],\n      [\n        -122.214847,\n        37.48902\n      ],\n      [\n        -122.214767,\n        37.488942\n      ],\n      [\n        -122.214698,\n        37.488867\n      ],\n      [\n        -122.214621,\n        37.488776\n      ],\n      [\n        -122.214555,\n        37.488684\n      ],\n      [\n        -122.21447,\n        37.488563\n      ],\n      [\n        -122.214334,\n        37.488336\n      ],\n      [\n        -122.214307,\n        37.488277\n      ],\n      [\n        -122.214295,\n        37.488247\n      ],\n      [\n        -122.214267,\n        37.488169\n      ],\n      [\n        -122.21425,\n        37.488091\n      ],\n      [\n        -122.21424,\n        37.488022\n      ],\n      [\n        -122.214235,\n        37.487956\n      ],\n      [\n        -122.214233,\n        37.487888\n      ],\n      [\n        -122.214238,\n        37.487805\n      ],\n      [\n        -122.214277,\n        37.48743\n      ],\n      [\n        -122.214289,\n        37.487265\n      ],\n      [\n        -122.214258,\n        37.487107\n      ],\n      [\n        -122.214226,\n        37.487011\n      ],\n      [\n        -122.214242,\n        37.486949\n      ],\n      [\n        -122.214349,\n        37.486538\n      ],\n      [\n        -122.214483,\n        37.485984\n      ],\n      [\n        -122.214552,\n        37.485753\n      ],\n      [\n        -122.214665,\n        37.485488\n      ],\n      [\n        -122.214706,\n        37.485392\n      ],\n      [\n        -122.214767,\n        37.485278\n      ],\n      [\n        -122.214801,\n        37.485214\n      ],\n      [\n        -122.214865,\n        37.485139\n      ],\n      [\n        -122.214904,\n        37.485092\n      ],\n      [\n        -122.215076,\n        37.484894\n      ],\n      [\n        -122.215308,\n        37.484683\n      ],\n      [\n        -122.215548,\n        37.484513\n      ],\n      [\n        -122.215745,\n        37.484384\n      ],\n      [\n        -122.215994,\n        37.484247\n      ],\n      [\n        -122.216226,\n        37.484125\n      ],\n      [\n        -122.216647,\n        37.483914\n      ],\n      [\n        -122.217136,\n        37.483614\n      ],\n      [\n        -122.217325,\n        37.483498\n      ],\n      [\n        -122.217488,\n        37.483369\n      ],\n      [\n        -122.217668,\n        37.483212\n      ],\n      [\n        -122.217848,\n        37.483015\n      ],\n      [\n        -122.218003,\n        37.482797\n      ],\n      [\n        -122.218468,\n        37.482138\n      ],\n      [\n        -122.21858,\n        37.48198\n      ],\n      [\n        -122.218728,\n        37.481757\n      ],\n      [\n        -122.218895,\n        37.481507\n      ],\n      [\n        -122.218943,\n        37.481437\n      ],\n      [\n        -122.219068,\n        37.481255\n      ],\n      [\n        -122.219133,\n        37.481162\n      ],\n      [\n        -122.219207,\n        37.481063\n      ],\n      [\n        -122.219258,\n        37.480995\n      ],\n      [\n        -122.219381,\n        37.480828\n      ],\n      [\n        -122.219599,\n        37.480447\n      ],\n      [\n        -122.220208,\n        37.479485\n      ],\n      [\n        -122.220388,\n        37.479186\n      ],\n      [\n        -122.220642,\n        37.478779\n      ],\n      [\n        -122.220783,\n        37.478562\n      ],\n      [\n        -122.221435,\n        37.47764\n      ],\n      [\n        -122.221572,\n        37.477428\n      ],\n      [\n        -122.221667,\n        37.477265\n      ],\n      [\n        -122.221817,\n        37.476852\n      ],\n      [\n        -122.22183,\n        37.476781\n      ],\n      [\n        -122.221873,\n        37.476604\n      ],\n      [\n        -122.222001,\n        37.47623\n      ],\n      [\n        -122.222044,\n        37.476066\n      ],\n      [\n        -122.222087,\n        37.47593\n      ],\n      [\n        -122.22213,\n        37.475848\n      ],\n      [\n        -122.22219,\n        37.475773\n      ],\n      [\n        -122.222268,\n        37.475726\n      ],\n      [\n        -122.222353,\n        37.475705\n      ],\n      [\n        -122.222448,\n        37.475698\n      ],\n      [\n        -122.222517,\n        37.475713\n      ],\n      [\n        -122.222542,\n        37.475719\n      ],\n      [\n        -122.222628,\n        37.47576\n      ],\n      [\n        -122.222825,\n        37.475903\n      ],\n      [\n        -122.222912,\n        37.475969\n      ],\n      [\n        -122.222947,\n        37.476045\n      ],\n      [\n        -122.222946,\n        37.476121\n      ],\n      [\n        -122.222928,\n        37.47627\n      ],\n      [\n        -122.22263,\n        37.47652\n      ],\n      [\n        -122.222594,\n        37.47655\n      ],\n      [\n        -122.222491,\n        37.476584\n      ],\n      [\n        -122.222388,\n        37.476597\n      ],\n      [\n        -122.222319,\n        37.476604\n      ],\n      [\n        -122.222225,\n        37.476597\n      ],\n      [\n        -122.222096,\n        37.476584\n      ],\n      [\n        -122.221332,\n        37.476032\n      ],\n      [\n        -122.22085,\n        37.475689\n      ],\n      [\n        -122.220826,\n        37.475671\n      ],\n      [\n        -122.220491,\n        37.475426\n      ],\n      [\n        -122.220111,\n        37.475153\n      ],\n      [\n        -122.219933,\n        37.475031\n      ],\n      [\n        -122.219426,\n        37.474642\n      ],\n      [\n        -122.219111,\n        37.474418\n      ],\n      [\n        -122.218984,\n        37.474329\n      ],\n      [\n        -122.218438,\n        37.473942\n      ],\n      [\n        -122.218246,\n        37.473806\n      ],\n      [\n        -122.217956,\n        37.473599\n      ],\n      [\n        -122.217753,\n        37.473453\n      ],\n      [\n        -122.217597,\n        37.473341\n      ],\n      [\n        -122.217293,\n        37.473124\n      ],\n      [\n        -122.217201,\n        37.473056\n      ],\n      [\n        -122.216937,\n        37.472866\n      ],\n      [\n        -122.216873,\n        37.472818\n      ],\n      [\n        -122.216781,\n        37.472753\n      ],\n      [\n        -122.216497,\n        37.472549\n      ],\n      [\n        -122.216231,\n        37.472364\n      ],\n      [\n        -122.21616,\n        37.472314\n      ],\n      [\n        -122.215981,\n        37.47218\n      ],\n      [\n        -122.215688,\n        37.47196\n      ],\n      [\n        -122.21551,\n        37.471831\n      ],\n      [\n        -122.215298,\n        37.47168\n      ],\n      [\n        -122.214841,\n        37.471347\n      ],\n      [\n        -122.214388,\n        37.471018\n      ],\n      [\n        -122.214135,\n        37.470836\n      ],\n      [\n        -122.213987,\n        37.470729\n      ],\n      [\n        -122.213938,\n        37.470694\n      ],\n      [\n        -122.21374,\n        37.47055\n      ],\n      [\n        -122.213118,\n        37.470071\n      ],\n      [\n        -122.212899,\n        37.469903\n      ],\n      [\n        -122.212764,\n        37.469802\n      ],\n      [\n        -122.211952,\n        37.469198\n      ],\n      [\n        -122.211189,\n        37.468636\n      ],\n      [\n        -122.210886,\n        37.468403\n      ],\n      [\n        -122.210823,\n        37.468356\n      ],\n      [\n        -122.210787,\n        37.46833\n      ],\n      [\n        -122.209994,\n        37.467759\n      ],\n      [\n        -122.209111,\n        37.467113\n      ],\n      [\n        -122.209036,\n        37.467059\n      ],\n      [\n        -122.208672,\n        37.466796\n      ],\n      [\n        -122.207682,\n        37.466081\n      ],\n      [\n        -122.207634,\n        37.46605\n      ],\n      [\n        -122.207348,\n        37.46586\n      ],\n      [\n        -122.207012,\n        37.465631\n      ],\n      [\n        -122.205867,\n        37.46491\n      ],\n      [\n        -122.205539,\n        37.46472\n      ],\n      [\n        -122.204714,\n        37.46432\n      ],\n      [\n        -122.204381,\n        37.464152\n      ],\n      [\n        -122.202995,\n        37.463452\n      ],\n      [\n        -122.202472,\n        37.463172\n      ],\n      [\n        -122.201557,\n        37.462724\n      ],\n      [\n        -122.201411,\n        37.462652\n      ],\n      [\n        -122.20133,\n        37.462613\n      ],\n      [\n        -122.201141,\n        37.462519\n      ],\n      [\n        -122.200654,\n        37.462275\n      ],\n      [\n        -122.200446,\n        37.462171\n      ],\n      [\n        -122.199618,\n        37.461727\n      ],\n      [\n        -122.199131,\n        37.461504\n      ],\n      [\n        -122.198617,\n        37.461246\n      ],\n      [\n        -122.198202,\n        37.461053\n      ],\n      [\n        -122.197882,\n        37.460903\n      ],\n      [\n        -122.197571,\n        37.460753\n      ],\n      [\n        -122.196942,\n        37.460444\n      ],\n      [\n        -122.196618,\n        37.460277\n      ],\n      [\n        -122.196329,\n        37.460129\n      ],\n      [\n        -122.195924,\n        37.459924\n      ],\n      [\n        -122.195921,\n        37.459922\n      ],\n      [\n        -122.195644,\n        37.459787\n      ],\n      [\n        -122.19511,\n        37.459519\n      ],\n      [\n        -122.19475,\n        37.459341\n      ],\n      [\n        -122.194172,\n        37.459052\n      ],\n      [\n        -122.193782,\n        37.45886\n      ],\n      [\n        -122.192701,\n        37.458335\n      ],\n      [\n        -122.192625,\n        37.458297\n      ],\n      [\n        -122.192049,\n        37.458007\n      ],\n      [\n        -122.191368,\n        37.457658\n      ],\n      [\n        -122.191114,\n        37.457533\n      ],\n      [\n        -122.190972,\n        37.457464\n      ],\n      [\n        -122.190877,\n        37.457417\n      ],\n      [\n        -122.190749,\n        37.45735\n      ],\n      [\n        -122.188289,\n        37.456126\n      ],\n      [\n        -122.187751,\n        37.455859\n      ],\n      [\n        -122.187711,\n        37.455841\n      ],\n      [\n        -122.187618,\n        37.455797\n      ],\n      [\n        -122.18752,\n        37.45575\n      ],\n      [\n        -122.187341,\n        37.455668\n      ],\n      [\n        -122.187015,\n        37.455511\n      ],\n      [\n        -122.186836,\n        37.455421\n      ],\n      [\n        -122.186443,\n        37.455228\n      ],\n      [\n        -122.185899,\n        37.45496\n      ],\n      [\n        -122.18546,\n        37.454744\n      ],\n      [\n        -122.185238,\n        37.454633\n      ],\n      [\n        -122.185154,\n        37.454591\n      ],\n      [\n        -122.185028,\n        37.454527\n      ],\n      [\n        -122.184786,\n        37.454405\n      ],\n      [\n        -122.184634,\n        37.454333\n      ],\n      [\n        -122.184583,\n        37.45431\n      ],\n      [\n        -122.184561,\n        37.454299\n      ],\n      [\n        -122.184454,\n        37.454243\n      ],\n      [\n        -122.18437,\n        37.454199\n      ],\n      [\n        -122.184146,\n        37.454092\n      ],\n      [\n        -122.18412,\n        37.454079\n      ],\n      [\n        -122.183666,\n        37.45386\n      ],\n      [\n        -122.183433,\n        37.453742\n      ],\n      [\n        -122.18319,\n        37.453619\n      ],\n      [\n        -122.183141,\n        37.453594\n      ],\n      [\n        -122.183127,\n        37.453589\n      ],\n      [\n        -122.182998,\n        37.453527\n      ],\n      [\n        -122.182907,\n        37.453483\n      ],\n      [\n        -122.18276,\n        37.453408\n      ],\n      [\n        -122.18259,\n        37.453321\n      ],\n      [\n        -122.182114,\n        37.453092\n      ],\n      [\n        -122.181892,\n        37.452989\n      ],\n      [\n        -122.181876,\n        37.452982\n      ],\n      [\n        -122.181819,\n        37.452956\n      ],\n      [\n        -122.18174,\n        37.452914\n      ],\n      [\n        -122.181604,\n        37.452843\n      ],\n      [\n        -122.180831,\n        37.45245\n      ],\n      [\n        -122.180626,\n        37.452346\n      ],\n      [\n        -122.180224,\n        37.452134\n      ],\n      [\n        -122.180135,\n        37.452084\n      ],\n      [\n        -122.179883,\n        37.45195\n      ],\n      [\n        -122.179796,\n        37.451902\n      ],\n      [\n        -122.179728,\n        37.451864\n      ],\n      [\n        -122.179527,\n        37.451756\n      ],\n      [\n        -122.179273,\n        37.451614\n      ],\n      [\n        -122.178833,\n        37.451367\n      ],\n      [\n        -122.178453,\n        37.451156\n      ],\n      [\n        -122.177805,\n        37.450771\n      ],\n      [\n        -122.177636,\n        37.450668\n      ],\n      [\n        -122.177325,\n        37.450473\n      ],\n      [\n        -122.177314,\n        37.450465\n      ],\n      [\n        -122.17723,\n        37.450409\n      ],\n      [\n        -122.177044,\n        37.45029\n      ],\n      [\n        -122.176814,\n        37.450146\n      ],\n      [\n        -122.176559,\n        37.449983\n      ],\n      [\n        -122.176216,\n        37.449744\n      ],\n      [\n        -122.175957,\n        37.449576\n      ],\n      [\n        -122.175489,\n        37.449279\n      ],\n      [\n        -122.175471,\n        37.449267\n      ],\n      [\n        -122.175313,\n        37.44916\n      ],\n      [\n        -122.175275,\n        37.449134\n      ],\n      [\n        -122.175101,\n        37.449013\n      ],\n      [\n        -122.174987,\n        37.448939\n      ],\n      [\n        -122.174854,\n        37.448853\n      ],\n      [\n        -122.174724,\n        37.448764\n      ],\n      [\n        -122.174514,\n        37.448626\n      ],\n      [\n        -122.174456,\n        37.448585\n      ],\n      [\n        -122.174235,\n        37.44844\n      ],\n      [\n        -122.174214,\n        37.448427\n      ],\n      [\n        -122.17414,\n        37.448378\n      ],\n      [\n        -122.173788,\n        37.448139\n      ],\n      [\n        -122.173724,\n        37.448096\n      ],\n      [\n        -122.173252,\n        37.447803\n      ],\n      [\n        -122.173125,\n        37.447721\n      ],\n      [\n        -122.172867,\n        37.447556\n      ],\n      [\n        -122.172704,\n        37.447446\n      ],\n      [\n        -122.172548,\n        37.447337\n      ],\n      [\n        -122.172379,\n        37.447219\n      ],\n      [\n        -122.172238,\n        37.447122\n      ],\n      [\n        -122.17198,\n        37.446936\n      ],\n      [\n        -122.171784,\n        37.446802\n      ],\n      [\n        -122.17157,\n        37.446657\n      ],\n      [\n        -122.17147,\n        37.446588\n      ],\n      [\n        -122.171426,\n        37.446553\n      ],\n      [\n        -122.171342,\n        37.446485\n      ],\n      [\n        -122.171325,\n        37.446471\n      ],\n      [\n        -122.171294,\n        37.446447\n      ],\n      [\n        -122.171135,\n        37.446322\n      ],\n      [\n        -122.171128,\n        37.446316\n      ],\n      [\n        -122.171065,\n        37.446265\n      ],\n      [\n        -122.171055,\n        37.446257\n      ],\n      [\n        -122.170988,\n        37.446208\n      ],\n      [\n        -122.170274,\n        37.445654\n      ],\n      [\n        -122.169405,\n        37.444985\n      ],\n      [\n        -122.169492,\n        37.444918\n      ],\n      [\n        -122.169512,\n        37.444904\n      ],\n      [\n        -122.169937,\n        37.444555\n      ],\n      [\n        -122.169907,\n        37.444532\n      ],\n      [\n        -122.1699,\n        37.444528\n      ],\n      [\n        -122.169889,\n        37.444518\n      ],\n      [\n        -122.169773,\n        37.444425\n      ],\n      [\n        -122.169636,\n        37.444319\n      ],\n      [\n        -122.169486,\n        37.444209\n      ],\n      [\n        -122.16944,\n        37.44417\n      ],\n      [\n        -122.169341,\n        37.444094\n      ],\n      [\n        -122.169185,\n        37.443983\n      ],\n      [\n        -122.169035,\n        37.443864\n      ],\n      [\n        -122.169019,\n        37.443821\n      ],\n      [\n        -122.169084,\n        37.443758\n      ],\n      [\n        -122.169323,\n        37.443542\n      ],\n      [\n        -122.169363,\n        37.44341\n      ],\n      [\n        -122.169396,\n        37.443375\n      ]\n    ],\n    \"type\": \"LineString\"\n  }\n}"
  },
  {
    "path": "app/src/main/assets/fragment-realestate-NY.json",
    "content": "{\n    \"imports\": [\n        {\n            \"id\": \"standard\",\n            \"url\": \"mapbox://styles/mapbox/standard\",\n            \"config\": {\n                \"font\": \"Montserrat\",\n                \"lightPreset\": \"dusk\",\n                \"showLandmarkIcons\": true,\n                \"showPointOfInterestLabels\": true,\n                \"showTransitLabels\": false,\n                \"showPlaceLabels\": true,\n                \"showRoadLabels\": false,\n                \"theme\": \"monochrome\",\n                \"show3dObjects\": true\n            }\n        }\n    ],\n    \"version\": 8,\n    \"sprite\": \"mapbox://sprites/examples/clkiip5x600b501pb4al5g7wv/du1h5vs55f48z8rgjod0dggl9\",\n    \"projection\": { \"name\": \"globe\" },\n    \"sources\": {\n        \"water_source\": {\n            \"type\": \"vector\",\n            \"url\": \"mapbox://mapbox.mapbox-streets-v8\"\n        },\n        \"ny_subway\": {\n            \"url\": \"mapbox://examples.clkicyt9103ld2hnxxfo3vpnm-3wmoh\",\n            \"type\": \"vector\"\n        },\n        \"hotels_data\": {\n            \"type\": \"vector\",\n            \"url\": \"mapbox://examples.clkiiizwk04l62jo3rjx61lgj-7xsxp\"\n        }\n    },\n    \"featuresets\": {\n      \"hotels-price\": {\n          \"selectors\": [\n              {\n                  \"layer\": \"NY-hotels-price\",\n                  \"properties\": {\n                      \"price\": [\"get\", \"price\"]\n                  }\n              }\n          ]\n        }\n    },\n    \"layers\": [\n        {\n            \"id\": \"water\",\n            \"type\": \"fill\",\n            \"slot\": \"bottom\",\n            \"source\": \"water_source\",\n            \"source-layer\": \"water\",\n            \"layout\": { },\n            \"paint\": {\n                \"fill-emissive-strength\": 1,\n                \"fill-color\": [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"measure-light\", \"brightness\" ],\n                    0.1,\n                    \"hsl(250, 50%, 40%)\",\n                    0.4,\n                    \"hsl(250, 50%, 80%)\"\n                ]\n            }\n        },\n        {\n            \"id\": \"subway-lines\",\n            \"type\": \"line\",\n            \"slot\": \"middle\",\n            \"source\": \"ny_subway\",\n            \"source-layer\": \"NY_subway\",\n            \"minzoom\": 9,\n            \"layout\": {},\n            \"paint\": {\n                \"line-emissive-strength\": 1,\n                \"line-depth-occlusion-factor\": 0.9,\n                \"line-color\": [\n                    \"match\",\n                    [\"get\", \"name\"],\n                    [\"A\", \"C\", \"E\"],\n                    \"#0039a6\",\n                    [\"B\", \"D\", \"F\", \"M\"],\n                    \"#ff6319\",\n                    [\"N-Q-R-W\"],\n                    \"hsl(245, 65%, 55%)\",\n                    [\"N-R\", \"Q\", \"W\"],\n                    \"#fccc0a\",\n                    [\"1\", \"2-3\"],\n                    \"#EE352e\",\n                    [\"G\"],\n                    \"#6cbe45\",\n                    [\"L\"],\n                    \"#a7a9ac\",\n                    [\"6\", \"4-5\"],\n                    \"#00933c\",\n                    [\"7\"],\n                    \"#b933ad\",\n                    [\"J-Z\"],\n                    \"#996333\",\n                    [\"S\"],\n                    \"#808183\",\n                    [\"T\"],\n                    \"#00add0\",\n                    \"#000000\"\n                ],\n                \"line-opacity\": [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"zoom\" ],\n                    9,\n                    0,\n                    10,\n                    1\n                ],\n                \"line-width\": [\n                    \"interpolate\",\n                    [\"linear\"],\n                    [\"zoom\"],\n                    9,\n                    1,\n                    13,\n                    2,\n                    22,\n                    7\n                ]\n            }\n        },\n        {\n            \"id\": \"subway-entrances\",\n            \"type\": \"symbol\",\n            \"slot\": \"top\",\n            \"source\": \"ny_subway\",\n            \"source-layer\": \"NY_subway\",\n            \"minzoom\":16,\n            \"filter\":[\n                \"all\",\n                [\n                    \"match\",\n                    [\"geometry-type\"],\n                    [\"Point\"],\n                    true,\n                    false\n                ]\n            ],\n            \"layout\": {\n                \"text-size\": 12,\n                \"icon-image\": \"new-york-subway\",\n                \"text-font\": [\n                    \"DIN Pro Medium\",\n                    \"Arial Unicode MS Regular\"\n                ],\n                \"text-justify\": [\n                    \"match\",\n                    [\n                        \"get\",\n                        \"stop_type\"\n                    ],\n                    \"entrance\",\n                    \"left\",\n                    \"center\"\n                ],\n                \"text-offset\": [\n                    \"match\",\n                    [\n                        \"get\",\n                        \"stop_type\"\n                    ],\n                    \"entrance\",\n                    [\n                        \"literal\",\n                        [\n                            1,\n                            0\n                        ]\n                    ],\n                    [\n                        \"literal\",\n                        [\n                            0,\n                            0.8\n                        ]\n                    ]\n                ],\n                \"text-anchor\": [\n                    \"match\",\n                    [\n                        \"get\",\n                        \"stop_type\"\n                    ],\n                    \"entrance\",\n                    \"left\",\n                    \"top\"\n                ],\n                \"text-field\": [\n                    \"to-string\",\n                    [\n                        \"get\",\n                        \"name\"\n                    ]\n                ],\n                \"text-letter-spacing\": 0.01,\n                \"text-max-width\": [\n                    \"match\",\n                    [\n                        \"get\",\n                        \"stop_type\"\n                    ],\n                    \"entrance\",\n                    15,\n                    9\n                ]\n            },\n            \"paint\": {\n                \"text-halo-color\": [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"measure-light\", \"brightness\" ],\n                    0.25,\n                    \"hsl(0, 0%, 0%)\",\n                    0.3,\n                    \"hsl(0, 0%, 100%)\"\n                ],\n                \"text-halo-blur\": 0.5,\n                \"text-halo-width\": 0.5,\n                \"text-color\":\n                [ \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"measure-light\", \"brightness\" ],\n                    0.25,\n                    \"hsl(225, 80%, 90%)\",\n                    0.3,\n                \"hsl(225, 60%, 58%)\" ]\n            }\n        },\n        {\n            \"id\": \"subway-lines-text\",\n            \"type\": \"symbol\",\n            \"slot\": \"middle\",\n            \"source\": \"ny_subway\",\n            \"source-layer\": \"NY_subway\",\n            \"minzoom\": 12,\n            \"layout\": {\n                \"text-field\": [\"to-string\", [\"get\", \"name\"]],\n                \"text-font\": [\"Montserrat Bold\", \"Arial Unicode MS Regular\"],\n                \"text-size\": [\n                    \"interpolate\",\n                    [\"linear\"],\n                    [\"zoom\"],\n                    12,\n                    8,\n                    22,\n                    12\n                ],\n                \"text-opacity\": [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"zoom\" ],\n                    11.5,\n                    0,\n                    12,\n                    1\n                ],\n                \"symbol-placement\": \"line\",\n                \"symbol-spacing\": [\n                    \"interpolate\",\n                    [\"linear\"],\n                    [\"zoom\"],\n                    0,\n                    50,\n                    16,\n                    200\n                ],\n                \"text-pitch-alignment\": \"viewport\"\n            },\n            \"paint\": {\n                \"text-halo-color\": [\n                    \"match\",\n                    [\"get\", \"name\"],\n                    [\"A\", \"C\", \"E\"],\n                    \"#0039a6\",\n                    [\"B\", \"D\", \"F\", \"M\"],\n                    \"#ff6319\",\n                    [\"N-Q-R-W\"],\n                    \"hsl(245, 65%, 55%)\",\n                    [\"N-R\", \"Q\", \"W\"],\n                    \"#fccc0a\",\n                    [\"1\", \"2-3\"],\n                    \"#EE352e\",\n                    [\"G\"],\n                    \"#6cbe45\",\n                    [\"L\"],\n                    \"#a7a9ac\",\n                    [\"6\", \"4-5\"],\n                    \"#00933c\",\n                    [\"7\"],\n                    \"#b933ad\",\n                    [\"J-Z\"],\n                    \"#996333\",\n                    [\"S\"],\n                    \"#808183\",\n                    [\"T\"],\n                    \"#00add0\",\n                    \"#000000\"\n                ],\n                \"text-halo-width\": 40,\n                \"text-color\": \"#ffffff\"\n            }\n        },\n        {\n            \"id\": \"NY-hotels\",\n            \"type\": \"circle\",\n            \"slot\": \"top\",\n            \"source\": \"hotels_data\",\n            \"source-layer\": \"NY_hotels\",\n            \"minzoom\": 9,\n            \"paint\": {\n                \"circle-emissive-strength\": 1,\n                \"circle-radius\": [\n                    \"interpolate\",\n                    [\"linear\"],\n                    [\"zoom\"],\n                    8,\n                    2,\n                    22,\n                    4\n                ],\n                \"circle-color\": \"hsl(220, 100%, 100%)\",\n                \"circle-stroke-color\":\n                [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"measure-light\", \"brightness\" ],\n                    0.25,\n                    \"hsl(0, 0%, 0%)\",\n                    0.3,\n                    \"hsl(220, 100%, 20%)\"\n                ],\n                \"circle-stroke-width\": 1\n            }\n        },\n        {\n            \"id\": \"NY-hotels-price\",\n            \"type\": \"symbol\",\n            \"slot\": \"top\",\n            \"source\": \"hotels_data\",\n            \"source-layer\": \"NY_hotels\",\n            \"minzoom\": 9,\n            \"layout\": {\n                \"text-field\": [\"to-string\", [\"concat\", \"$ \", [\"get\", \"price\"]]],\n                \"text-offset\": [0, -0.2],\n                \"text-size\": 14,\n                \"icon-image\": \"price_1.2\",\n                \"text-font\": [\"Open Sans ExtraBold\", \"Arial Unicode MS Regular\"]\n            },\n            \"paint\": {\n                \"text-color\": [\n                    \"case\",\n                    [\"to-boolean\", [\"feature-state\", \"active\"]],\n                    \"red\",\n                    \"hsl(220, 100%, 20%)\"\n                ]\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "app/src/main/assets/from_crema_to_council_crest.geojson",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"name\": \"Crema to Council Crest\"\n      },\n      \"geometry\": {\n        \"type\": \"LineString\",\n        \"coordinates\": [\n          [-122.483696, 37.833818],\n          [-122.483482, 37.833174],\n          [-122.483396, 37.8327],\n          [-122.483568, 37.832056],\n          [-122.48404, 37.831141],\n          [-122.48404, 37.830497],\n          [-122.483482, 37.82992],\n          [-122.483568, 37.829548],\n          [-122.48507, 37.829446],\n          [-122.4861, 37.828802],\n          [-122.486958, 37.82931],\n          [-122.487001, 37.830802],\n          [-122.487516, 37.831683],\n          [-122.488031, 37.832158],\n          [-122.488889, 37.832971],\n          [-122.489876, 37.832632],\n          [-122.490434, 37.832937],\n          [-122.49125, 37.832429],\n          [-122.491636, 37.832564],\n          [-122.492237, 37.833378],\n          [-122.493782, 37.833683]\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "app/src/main/assets/long_route.json",
    "content": "{\"type\":\"Feature\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-8.581071,41.162668],[-8.581098,41.162802],[-8.581146,41.163018],[-8.581209,41.163181],[-8.581415,41.163621],[-8.582343,41.165323],[-8.582427,41.165455],[-8.582544,41.165614],[-8.582663,41.165749],[-8.58299,41.166039],[-8.583229,41.166201],[-8.583484,41.166337],[-8.583702,41.166443],[-8.583956,41.166533],[-8.584218,41.1666],[-8.584427,41.166644],[-8.584641,41.166668],[-8.585209,41.166702],[-8.585413,41.166713],[-8.585851,41.166753],[-8.586234,41.166825],[-8.586669,41.166966],[-8.587283,41.167278],[-8.587785,41.167565],[-8.588505,41.167963],[-8.589442,41.168497],[-8.589606,41.168595],[-8.590094,41.168888],[-8.590448,41.169101],[-8.591228,41.169591],[-8.592064,41.170129],[-8.593543,41.171123],[-8.593886,41.171353],[-8.594038,41.17148],[-8.594142,41.171562],[-8.59426,41.171662],[-8.594363,41.171764],[-8.594454,41.171867],[-8.594533,41.171977],[-8.594604,41.172089],[-8.594659,41.17221],[-8.594706,41.172331],[-8.59474,41.172456],[-8.594759,41.17258],[-8.594767,41.172707],[-8.594761,41.172865],[-8.594719,41.17311],[-8.594438,41.173754],[-8.594164,41.174359],[-8.593964,41.174809],[-8.593763,41.175297],[-8.593673,41.175541],[-8.593557,41.175907],[-8.593493,41.176146],[-8.593434,41.176402],[-8.593349,41.176812],[-8.593324,41.176956],[-8.593304,41.177101],[-8.593293,41.177271],[-8.593181,41.178422],[-8.593001,41.179984],[-8.592943,41.180553],[-8.59293,41.1808],[-8.592923,41.181045],[-8.592928,41.181356],[-8.592939,41.181529],[-8.592952,41.181692],[-8.592972,41.181843],[-8.593025,41.182182],[-8.593085,41.182465],[-8.593185,41.182887],[-8.593267,41.183157],[-8.593382,41.183515],[-8.593586,41.184138],[-8.593859,41.18492],[-8.593973,41.185261],[-8.594073,41.185563],[-8.594307,41.186281],[-8.594474,41.186793],[-8.594588,41.187152],[-8.594623,41.187271],[-8.594653,41.187392],[-8.594684,41.187536],[-8.594707,41.187645],[-8.594719,41.187736],[-8.594735,41.187863],[-8.594745,41.187988],[-8.594747,41.188118],[-8.594744,41.188243],[-8.59474,41.188371],[-8.59473,41.188501],[-8.594711,41.188619],[-8.594687,41.188745],[-8.594658,41.188869],[-8.594624,41.188998],[-8.594586,41.18912],[-8.594541,41.18924],[-8.594491,41.18936],[-8.594437,41.189482],[-8.594379,41.189599],[-8.594313,41.18972],[-8.594244,41.189833],[-8.594171,41.189949],[-8.594096,41.190057],[-8.594015,41.190162],[-8.593926,41.190271],[-8.593838,41.190376],[-8.59374,41.190481],[-8.593642,41.190581],[-8.593419,41.190802],[-8.592913,41.191286],[-8.592676,41.191539],[-8.592519,41.191728],[-8.592412,41.191867],[-8.592304,41.192017],[-8.592212,41.192152],[-8.592131,41.192293],[-8.592067,41.192404],[-8.592014,41.192513],[-8.591725,41.193171],[-8.591624,41.193385],[-8.591509,41.193591],[-8.591377,41.193797],[-8.591278,41.193932],[-8.591194,41.19404],[-8.591066,41.194191],[-8.590891,41.194377],[-8.590606,41.194684],[-8.590304,41.194984],[-8.590056,41.195222],[-8.589803,41.195479],[-8.589483,41.195823],[-8.589239,41.196079],[-8.589124,41.196218],[-8.588968,41.196416],[-8.588725,41.196755],[-8.588539,41.197041],[-8.588255,41.197511],[-8.588053,41.197849],[-8.58763,41.198509],[-8.587492,41.198722],[-8.587363,41.198899],[-8.587238,41.199059],[-8.587049,41.199304],[-8.586849,41.199535],[-8.586471,41.199917],[-8.585762,41.200579],[-8.585483,41.200831],[-8.584832,41.201478],[-8.584655,41.201674],[-8.584483,41.201877],[-8.584322,41.202094],[-8.584177,41.202306],[-8.58404,41.202524],[-8.58391,41.202749],[-8.583799,41.202979],[-8.583697,41.203212],[-8.583649,41.203329],[-8.583563,41.203563],[-8.583384,41.204154],[-8.583177,41.204868],[-8.582967,41.205583],[-8.582832,41.206052],[-8.582713,41.206415],[-8.582634,41.206645],[-8.582543,41.20688],[-8.582444,41.207126],[-8.582372,41.207298],[-8.582294,41.207454],[-8.582172,41.207681],[-8.582109,41.207793],[-8.581969,41.208018],[-8.58183,41.208238],[-8.58168,41.208455],[-8.581527,41.208666],[-8.581281,41.208978],[-8.581101,41.209189],[-8.58092,41.209392],[-8.58074,41.209592],[-8.580554,41.209793],[-8.578336,41.212186],[-8.577231,41.213382],[-8.57697,41.213688],[-8.576715,41.214],[-8.576559,41.214213],[-8.576413,41.214427],[-8.576272,41.214649],[-8.576145,41.214876],[-8.576022,41.2151],[-8.575906,41.215329],[-8.575805,41.215555],[-8.575708,41.21579],[-8.575626,41.216019],[-8.575548,41.21626],[-8.575482,41.216496],[-8.575425,41.216736],[-8.575375,41.216976],[-8.575333,41.217215],[-8.575253,41.2177],[-8.575205,41.218017],[-8.575007,41.21919],[-8.574916,41.219685],[-8.574886,41.219841],[-8.574854,41.219991],[-8.57479,41.220229],[-8.574715,41.220463],[-8.574622,41.220704],[-8.574527,41.220928],[-8.574417,41.221152],[-8.574283,41.221378],[-8.574147,41.221595],[-8.573996,41.221812],[-8.573599,41.22234],[-8.573359,41.222658],[-8.573209,41.222872],[-8.573065,41.22309],[-8.572935,41.223313],[-8.572821,41.223535],[-8.572716,41.223762],[-8.572624,41.223997],[-8.572548,41.224229],[-8.572403,41.22471],[-8.572266,41.225182],[-8.572122,41.225657],[-8.572007,41.226004],[-8.571922,41.226242],[-8.571778,41.226609],[-8.571686,41.22682],[-8.571579,41.227055],[-8.571468,41.227282],[-8.571348,41.227508],[-8.571228,41.227728],[-8.571096,41.22795],[-8.570957,41.228171],[-8.57074,41.228496],[-8.570587,41.22871],[-8.570429,41.228924],[-8.570263,41.229135],[-8.57001,41.229438],[-8.569829,41.229647],[-8.56965,41.229847],[-8.569464,41.230035],[-8.569171,41.230329],[-8.56863,41.230854],[-8.567933,41.231557],[-8.567516,41.231968],[-8.567377,41.232118],[-8.56715,41.232366],[-8.56695,41.23258],[-8.566768,41.232793],[-8.566373,41.233297],[-8.566155,41.233601],[-8.565953,41.233891],[-8.565765,41.234167],[-8.565601,41.234437],[-8.56544,41.234725],[-8.565293,41.235005],[-8.565139,41.235317],[-8.564989,41.235706],[-8.564844,41.236103],[-8.564759,41.236334],[-8.564676,41.236569],[-8.564559,41.236936],[-8.564461,41.237289],[-8.564376,41.237642],[-8.564323,41.237893],[-8.564279,41.23813],[-8.564241,41.238371],[-8.564208,41.238615],[-8.564181,41.238855],[-8.564157,41.239093],[-8.564131,41.23946],[-8.564126,41.239818],[-8.564122,41.240142],[-8.564131,41.240429],[-8.564115,41.240734],[-8.564113,41.241016],[-8.564159,41.241255],[-8.564423,41.242363],[-8.564485,41.242607],[-8.564552,41.242841],[-8.564614,41.243033],[-8.564677,41.243239],[-8.564844,41.243694],[-8.564897,41.243836],[-8.565321,41.244637],[-8.565507,41.244961],[-8.565726,41.245416],[-8.565971,41.245839],[-8.566207,41.246273],[-8.566839,41.247402],[-8.567243,41.248121],[-8.567429,41.248505],[-8.567824,41.249509],[-8.568106,41.250542],[-8.568205,41.251035],[-8.568284,41.25159],[-8.568341,41.252829],[-8.568267,41.254067],[-8.568085,41.25511],[-8.567867,41.25584],[-8.567613,41.256563],[-8.567172,41.257558],[-8.566686,41.2585],[-8.566276,41.259248],[-8.565522,41.260572],[-8.565133,41.261273],[-8.564612,41.262208],[-8.562243,41.266453],[-8.561778,41.267281],[-8.561429,41.267909],[-8.560971,41.268724],[-8.56062,41.269365],[-8.560348,41.269944],[-8.559987,41.270859],[-8.559825,41.271525],[-8.559734,41.2722],[-8.559726,41.272846],[-8.559768,41.273486],[-8.560023,41.274556],[-8.560654,41.276301],[-8.560857,41.276932],[-8.561007,41.277538],[-8.561138,41.278662],[-8.561144,41.279264],[-8.561099,41.279839],[-8.561032,41.280292],[-8.560909,41.28083],[-8.560789,41.281292],[-8.560656,41.281645],[-8.560314,41.282453],[-8.55985,41.283259],[-8.559543,41.2837],[-8.559262,41.284062],[-8.558877,41.284528],[-8.558481,41.284948],[-8.558003,41.285389],[-8.557478,41.285829],[-8.556718,41.286373],[-8.556142,41.286735],[-8.555537,41.287058],[-8.552831,41.288398],[-8.550347,41.289619],[-8.54732,41.291106],[-8.545309,41.292098],[-8.543394,41.293041],[-8.54239,41.29357],[-8.541329,41.294277],[-8.540378,41.295127],[-8.539553,41.296109],[-8.538958,41.297051],[-8.538686,41.297662],[-8.538467,41.298288],[-8.538324,41.298958],[-8.538243,41.299596],[-8.538187,41.300224],[-8.538092,41.300748],[-8.537984,41.301161],[-8.537829,41.301541],[-8.537587,41.301969],[-8.537331,41.302319],[-8.536797,41.302877],[-8.536233,41.303312],[-8.535841,41.303562],[-8.535264,41.303845],[-8.534576,41.304106],[-8.533957,41.304264],[-8.532634,41.304521],[-8.531979,41.304664],[-8.531219,41.304895],[-8.530792,41.30507],[-8.530304,41.305283],[-8.529828,41.305535],[-8.529382,41.305805],[-8.528937,41.306125],[-8.528436,41.306547],[-8.528049,41.306941],[-8.527694,41.307379],[-8.527279,41.308007],[-8.527139,41.308308],[-8.526871,41.308928],[-8.526603,41.309567],[-8.526356,41.310056],[-8.526125,41.310409],[-8.525704,41.31092],[-8.525311,41.311339],[-8.524942,41.311647],[-8.524467,41.311989],[-8.52396,41.312308],[-8.523393,41.312603],[-8.5228,41.312847],[-8.522192,41.313065],[-8.520748,41.313489],[-8.519558,41.31395],[-8.518503,41.31456],[-8.517543,41.315349],[-8.517111,41.315818],[-8.516751,41.316282],[-8.516429,41.316866],[-8.516178,41.31745],[-8.516024,41.317984],[-8.515942,41.318519],[-8.515922,41.319142],[-8.515986,41.319738],[-8.516124,41.320272],[-8.516306,41.320797],[-8.517122,41.322434],[-8.517515,41.323516],[-8.517733,41.324723],[-8.517728,41.325639],[-8.517595,41.326515],[-8.517346,41.327387],[-8.517045,41.328098],[-8.516646,41.328807],[-8.516104,41.329567],[-8.515518,41.330218],[-8.514841,41.330813],[-8.514089,41.331392],[-8.513424,41.33182],[-8.51188,41.332731],[-8.511124,41.33327],[-8.510526,41.333786],[-8.51023,41.334079],[-8.509802,41.33455],[-8.509499,41.334926],[-8.509141,41.335486],[-8.508775,41.336134],[-8.508501,41.336759],[-8.508083,41.33804],[-8.507959,41.338421],[-8.507812,41.338839],[-8.507519,41.339637],[-8.507263,41.340273],[-8.50602,41.343106],[-8.505722,41.343928],[-8.505566,41.34471],[-8.505519,41.345458],[-8.505582,41.346227],[-8.505734,41.346927],[-8.505957,41.34756],[-8.506244,41.348172],[-8.506684,41.349156],[-8.506916,41.349884],[-8.507047,41.350572],[-8.507082,41.351217],[-8.507036,41.351965],[-8.506913,41.352594],[-8.50668,41.353325],[-8.506405,41.353889],[-8.50612,41.354396],[-8.505761,41.354871],[-8.505301,41.355402],[-8.504772,41.355904],[-8.504169,41.356378],[-8.502613,41.357448],[-8.502016,41.357935],[-8.501488,41.35846],[-8.501041,41.358997],[-8.500682,41.359546],[-8.500386,41.360108],[-8.500175,41.360639],[-8.50002,41.361203],[-8.499933,41.361709],[-8.499895,41.362274],[-8.499919,41.362827],[-8.500009,41.363388],[-8.500163,41.363957],[-8.500392,41.364538],[-8.500676,41.365119],[-8.501618,41.36688],[-8.50222,41.368024],[-8.502715,41.368973],[-8.503063,41.369808],[-8.503202,41.370323],[-8.503291,41.370921],[-8.503302,41.371437],[-8.503295,41.371659],[-8.503274,41.371934],[-8.503249,41.372136],[-8.503225,41.372294],[-8.503051,41.372588],[-8.502879,41.372835],[-8.502771,41.372936],[-8.502624,41.373038],[-8.50243,41.373143],[-8.501836,41.373357],[-8.501702,41.373425],[-8.501619,41.373485],[-8.501521,41.373616],[-8.501492,41.373708],[-8.501487,41.373804],[-8.501517,41.373904],[-8.501576,41.374003],[-8.501772,41.374164],[-8.502063,41.374328],[-8.502684,41.374667],[-8.502807,41.374739],[-8.503048,41.374924],[-8.503157,41.37507],[-8.503218,41.375235],[-8.503229,41.37535],[-8.503214,41.375467],[-8.503097,41.375741],[-8.502309,41.37712],[-8.502285,41.377193],[-8.502214,41.37747],[-8.502169,41.37782],[-8.502185,41.378178],[-8.502246,41.378509],[-8.502495,41.379596],[-8.502663,41.380345],[-8.502683,41.380568],[-8.502714,41.380761],[-8.502708,41.38088],[-8.502636,41.381117],[-8.50248,41.381339],[-8.502234,41.381532],[-8.502045,41.381623],[-8.501727,41.381703],[-8.501497,41.38172],[-8.501142,41.38171],[-8.500911,41.381685],[-8.500801,41.381695],[-8.50063,41.381674],[-8.500469,41.381654],[-8.500272,41.381635],[-8.500099,41.381621],[-8.49936,41.381602],[-8.49864,41.381619],[-8.498329,41.381647],[-8.498008,41.381675],[-8.497335,41.381785],[-8.496392,41.382006],[-8.495519,41.38227],[-8.494855,41.382495],[-8.494677,41.382565],[-8.493341,41.383032],[-8.491279,41.383754],[-8.490588,41.383996],[-8.488545,41.384711],[-8.486663,41.38551],[-8.485395,41.386133],[-8.484248,41.386799],[-8.483073,41.387558],[-8.481716,41.388563],[-8.478552,41.390963],[-8.477454,41.391718],[-8.476462,41.392386],[-8.465404,41.399974],[-8.464637,41.400434],[-8.464157,41.400733],[-8.463842,41.400904],[-8.463477,41.401082],[-8.463106,41.401251],[-8.462416,41.401493],[-8.461848,41.401655],[-8.461207,41.401792],[-8.460711,41.40187],[-8.460227,41.401922],[-8.459461,41.401972],[-8.458596,41.401965],[-8.456596,41.401939],[-8.456074,41.401934],[-8.454898,41.401922],[-8.450279,41.40184],[-8.449759,41.401843],[-8.449102,41.401888],[-8.448616,41.401946],[-8.448082,41.402049],[-8.447573,41.402168],[-8.447045,41.402328],[-8.446578,41.402503],[-8.446177,41.402675],[-8.445762,41.402891],[-8.445398,41.403098],[-8.444637,41.403561],[-8.444091,41.403867],[-8.443646,41.404091],[-8.443267,41.404247],[-8.442823,41.404404],[-8.442301,41.404553],[-8.441765,41.404678],[-8.441289,41.404761],[-8.440388,41.404832],[-8.439484,41.404846],[-8.438592,41.40491],[-8.438043,41.404968],[-8.437193,41.405103],[-8.436276,41.405325],[-8.435817,41.40545],[-8.434832,41.405741],[-8.434326,41.405889],[-8.433605,41.406037],[-8.433056,41.406133],[-8.432438,41.406211],[-8.431966,41.406249],[-8.431313,41.406281],[-8.429932,41.406346],[-8.428653,41.406468],[-8.428001,41.406567],[-8.427385,41.406689],[-8.426911,41.406792],[-8.426055,41.407007],[-8.425457,41.407155],[-8.425008,41.407256],[-8.424539,41.407337],[-8.424109,41.407395],[-8.423777,41.407421],[-8.423391,41.40744],[-8.422602,41.407447],[-8.422181,41.407408],[-8.421632,41.407331],[-8.420799,41.407176],[-8.4191,41.406861],[-8.418576,41.40679],[-8.418147,41.406764],[-8.417658,41.406751],[-8.417057,41.406764],[-8.41643,41.406803],[-8.415709,41.406899],[-8.41528,41.407002],[-8.414748,41.407125],[-8.414285,41.407286],[-8.41377,41.407466],[-8.413246,41.407627],[-8.412542,41.407839],[-8.412165,41.407962],[-8.41171,41.408084],[-8.411178,41.408206],[-8.41068,41.408296],[-8.410268,41.408354],[-8.409581,41.408419],[-8.408543,41.408425],[-8.407864,41.408387],[-8.407135,41.40829],[-8.406139,41.408129],[-8.405264,41.407968],[-8.404586,41.407859],[-8.403813,41.407794],[-8.40329,41.407769],[-8.402483,41.407749],[-8.400308,41.4077],[-8.399166,41.407672],[-8.397913,41.407653],[-8.396658,41.407563],[-8.395511,41.407428],[-8.394861,41.407323],[-8.394243,41.407186],[-8.392879,41.406865],[-8.389796,41.406092],[-8.389309,41.40597],[-8.38868,41.405812],[-8.387891,41.405615],[-8.387576,41.405541],[-8.387255,41.405473],[-8.386932,41.405412],[-8.386616,41.405362],[-8.386336,41.40532],[-8.386069,41.405288],[-8.385798,41.405262],[-8.385577,41.405246],[-8.385409,41.405235],[-8.385246,41.405227],[-8.384914,41.405219],[-8.384583,41.405219],[-8.384255,41.405226],[-8.383929,41.40524],[-8.383599,41.405264],[-8.383436,41.405279],[-8.383112,41.405314],[-8.382956,41.405335],[-8.382795,41.405358],[-8.382636,41.405382],[-8.382477,41.405409],[-8.382322,41.405438],[-8.382102,41.405481],[-8.381751,41.405565],[-8.380962,41.40578],[-8.380012,41.406125],[-8.379142,41.406551],[-8.378445,41.406951],[-8.377679,41.4075],[-8.3771,41.407993],[-8.376435,41.40859],[-8.375954,41.408978],[-8.375707,41.409128],[-8.375345,41.409331],[-8.37478,41.409595],[-8.374179,41.409791],[-8.373544,41.409934],[-8.372718,41.410016],[-8.370666,41.410001],[-8.369936,41.410056],[-8.369388,41.410146],[-8.368578,41.410352],[-8.367731,41.410659],[-8.367159,41.410963],[-8.366644,41.411293],[-8.366148,41.411687],[-8.364705,41.413079],[-8.364083,41.41358],[-8.36344,41.413989],[-8.362703,41.414355],[-8.361757,41.414753],[-8.360894,41.41503],[-8.359656,41.415311],[-8.357475,41.41574],[-8.356526,41.415992],[-8.355608,41.416295],[-8.354548,41.416719],[-8.352572,41.417661],[-8.351837,41.417943],[-8.351103,41.418135],[-8.350268,41.418262],[-8.349458,41.418294],[-8.34869,41.418255],[-8.34682,41.41803],[-8.345955,41.417997],[-8.345227,41.418055],[-8.344508,41.418177],[-8.34381,41.418381],[-8.343139,41.41866],[-8.342505,41.419027],[-8.341993,41.419417],[-8.341494,41.419907],[-8.34106,41.420538],[-8.339506,41.423314],[-8.339261,41.423862],[-8.339156,41.424251],[-8.339113,41.424495],[-8.339105,41.424857],[-8.339038,41.424956],[-8.339045,41.425351],[-8.339218,41.426475],[-8.339214,41.42684],[-8.339116,41.427216],[-8.339019,41.427591],[-8.338845,41.427946],[-8.338587,41.428221],[-8.33824,41.428426],[-8.337836,41.428553],[-8.334997,41.428845],[-8.33461,41.428858],[-8.334216,41.428848],[-8.333814,41.42881],[-8.333438,41.428743],[-8.333198,41.428729],[-8.332671,41.428563],[-8.332449,41.428464],[-8.332012,41.428233],[-8.331671,41.428005],[-8.331338,41.427717],[-8.331075,41.427443],[-8.33086,41.427147],[-8.330693,41.426845],[-8.330571,41.426553],[-8.330498,41.426252],[-8.33046,41.425904],[-8.330465,41.425512],[-8.330583,41.424576],[-8.330634,41.424073],[-8.330631,41.423685],[-8.330592,41.423308],[-8.330513,41.422961],[-8.330433,41.422743],[-8.330121,41.422086],[-8.329701,41.42151],[-8.329098,41.420941],[-8.32713,41.419431],[-8.326302,41.418775],[-8.325729,41.418184],[-8.325215,41.417454],[-8.324935,41.416848],[-8.324761,41.416225],[-8.324696,41.415573],[-8.324761,41.413903],[-8.324698,41.413237],[-8.324486,41.412446],[-8.324195,41.411852],[-8.323743,41.411203],[-8.323267,41.410714],[-8.322524,41.410122],[-8.321784,41.409687],[-8.320697,41.409223],[-8.319831,41.408974],[-8.318937,41.408818],[-8.318118,41.408748],[-8.317217,41.408771],[-8.316294,41.408901],[-8.315371,41.409108],[-8.308641,41.411206],[-8.305533,41.412227],[-8.304679,41.412425],[-8.303868,41.412587],[-8.30279,41.412696],[-8.301845,41.412719],[-8.300767,41.412626],[-8.29988,41.41246],[-8.298975,41.412207],[-8.296658,41.411459],[-8.295519,41.411136],[-8.294327,41.410854],[-8.292908,41.410587],[-8.291545,41.410392],[-8.289993,41.410243],[-8.288499,41.410138],[-8.287317,41.410013],[-8.2865,41.409873],[-8.285687,41.409653],[-8.284922,41.409377],[-8.28421,41.409047],[-8.283548,41.408667],[-8.282772,41.408146],[-8.281929,41.407554],[-8.281212,41.407106],[-8.280479,41.406728],[-8.279686,41.406412],[-8.278924,41.406177],[-8.278097,41.405988],[-8.277276,41.405873],[-8.276369,41.405811],[-8.273825,41.405854],[-8.273054,41.405817],[-8.272266,41.405708],[-8.271473,41.405518],[-8.270725,41.405271],[-8.270015,41.404935],[-8.269297,41.404529],[-8.268551,41.404107],[-8.267721,41.403712],[-8.266722,41.403389],[-8.266175,41.403249],[-8.265277,41.403113],[-8.264475,41.403086],[-8.263582,41.403134],[-8.262718,41.403258],[-8.262075,41.403381],[-8.261901,41.403448],[-8.2609,41.403626],[-8.260044,41.403724],[-8.258932,41.403762],[-8.257835,41.403687],[-8.256912,41.403544],[-8.25584,41.403266],[-8.254861,41.402916],[-8.253497,41.402342],[-8.253038,41.402142],[-8.252572,41.401958],[-8.25111,41.401361],[-8.246774,41.399484],[-8.244247,41.398411],[-8.243116,41.397996],[-8.242522,41.397812],[-8.241182,41.397525],[-8.240136,41.397425],[-8.239041,41.397423],[-8.237955,41.39752],[-8.236824,41.397716],[-8.2358,41.398004],[-8.234868,41.398369],[-8.234097,41.39876],[-8.23336,41.399221],[-8.232631,41.399798],[-8.228417,41.403964],[-8.228115,41.404263],[-8.22717,41.405197],[-8.226518,41.405741],[-8.226272,41.405908],[-8.225848,41.406196],[-8.225039,41.406656],[-8.224127,41.407054],[-8.223121,41.407384],[-8.222121,41.407627],[-8.221096,41.407789],[-8.22081,41.407813],[-8.220515,41.407838],[-8.219954,41.407844],[-8.219259,41.407836],[-8.218341,41.40776],[-8.213153,41.407167],[-8.211713,41.407058],[-8.210524,41.407097],[-8.209558,41.407249],[-8.208562,41.40753],[-8.207594,41.407932],[-8.206642,41.408516],[-8.20597,41.409081],[-8.205409,41.409761],[-8.20503,41.410379],[-8.204747,41.411138],[-8.204604,41.411801],[-8.204335,41.413519],[-8.204134,41.414272],[-8.203815,41.414998],[-8.203417,41.41564],[-8.202959,41.416209],[-8.202359,41.416815],[-8.199062,41.419794],[-8.198853,41.419981],[-8.197357,41.421355],[-8.196793,41.421816],[-8.196165,41.422252],[-8.195554,41.422609],[-8.194876,41.422953],[-8.194158,41.42325],[-8.193336,41.423518],[-8.192581,41.423698],[-8.191779,41.423847],[-8.190804,41.423955],[-8.188319,41.424076],[-8.187254,41.424234],[-8.186194,41.424512],[-8.185346,41.424835],[-8.184519,41.425256],[-8.183821,41.425746],[-8.183245,41.426232],[-8.182644,41.426877],[-8.182175,41.427652],[-8.181873,41.428301],[-8.181704,41.428883],[-8.181435,41.430154],[-8.181256,41.430757],[-8.181116,41.431098],[-8.180965,41.431421],[-8.180506,41.432134],[-8.180007,41.432674],[-8.179629,41.433022],[-8.179039,41.433483],[-8.178386,41.433883],[-8.177758,41.434194],[-8.17705,41.434472],[-8.176288,41.434685],[-8.175471,41.434839],[-8.173183,41.435155],[-8.172316,41.435334],[-8.171419,41.435585],[-8.170623,41.435865],[-8.169344,41.436335],[-8.16837,41.436696],[-8.166526,41.437412],[-8.165672,41.437812],[-8.1648,41.438286],[-8.164191,41.438675],[-8.162182,41.440086],[-8.161239,41.440686],[-8.160796,41.440932],[-8.160312,41.441164],[-8.159724,41.44139],[-8.158873,41.441665],[-8.158158,41.441828],[-8.15743,41.441938],[-8.156878,41.441996],[-8.156277,41.44202],[-8.155918,41.442018],[-8.154872,41.441946],[-8.153785,41.441767],[-8.152792,41.441498],[-8.151807,41.441101],[-8.151065,41.440712],[-8.150268,41.44019],[-8.14959,41.439644],[-8.146793,41.436961],[-8.145993,41.436277],[-8.14523,41.435755],[-8.144406,41.435306],[-8.14368,41.434985],[-8.142379,41.434575],[-8.14125,41.434345],[-8.140003,41.43423],[-8.138803,41.434242],[-8.137639,41.434363],[-8.136493,41.434608],[-8.135468,41.434925],[-8.127015,41.438224],[-8.125629,41.438731],[-8.124274,41.439167],[-8.122891,41.439548],[-8.121582,41.439863],[-8.120257,41.440126],[-8.097556,41.444352],[-8.096166,41.44455],[-8.095099,41.444625],[-8.094837,41.444632],[-8.094517,41.444641],[-8.093259,41.444615],[-8.092063,41.444516],[-8.090921,41.444351],[-8.09007,41.444197],[-8.089863,41.444159],[-8.088543,41.443919],[-8.087283,41.443748],[-8.085934,41.443656],[-8.084794,41.443652],[-8.083669,41.443722],[-8.082593,41.443841],[-8.081475,41.444033],[-8.080171,41.444348],[-8.078597,41.444864],[-8.072082,41.447211],[-8.070955,41.447571],[-8.069796,41.447843],[-8.068707,41.44802],[-8.067516,41.44812],[-8.066314,41.448132],[-8.065174,41.448054],[-8.06399,41.447886],[-8.062783,41.447629],[-8.061108,41.447229],[-8.060048,41.447035],[-8.058932,41.446927],[-8.057941,41.446918],[-8.05687,41.447007],[-8.055722,41.447207],[-8.054617,41.447524],[-8.053696,41.447892],[-8.052748,41.448339],[-8.044025,41.453012],[-8.043112,41.453451],[-8.042138,41.45379],[-8.041206,41.454023],[-8.040232,41.454187],[-8.038407,41.454456],[-8.037408,41.454677],[-8.036533,41.454957],[-8.035775,41.455323],[-8.035106,41.455746],[-8.033717,41.456777],[-8.033043,41.457409],[-8.032519,41.458024],[-8.032047,41.458617],[-8.031605,41.459185],[-8.031024,41.459776],[-8.030259,41.460405],[-8.029341,41.461003],[-8.028297,41.461537],[-8.027274,41.461916],[-8.026168,41.462215],[-8.025177,41.462407],[-8.008983,41.46497],[-8.007469,41.465255],[-8.006014,41.465611],[-8.004586,41.466043],[-8.003219,41.466548],[-8.001698,41.467214],[-7.996937,41.469658],[-7.995898,41.470106],[-7.994698,41.470497],[-7.99337,41.470788],[-7.992207,41.470939],[-7.991273,41.470984],[-7.989384,41.470984],[-7.988378,41.470984],[-7.987264,41.471075],[-7.98615,41.471259],[-7.98524,41.471476],[-7.983714,41.471818],[-7.982692,41.471981],[-7.981758,41.472053],[-7.980738,41.472035],[-7.979822,41.471941],[-7.976877,41.471384],[-7.975578,41.471213],[-7.974481,41.47118],[-7.973523,41.471222],[-7.972576,41.47134],[-7.971591,41.471538],[-7.970531,41.471835],[-7.96955,41.47222],[-7.968368,41.472867],[-7.965872,41.474387],[-7.964934,41.47486],[-7.963897,41.475273],[-7.962824,41.475602],[-7.961869,41.47583],[-7.960875,41.47599],[-7.959872,41.476086],[-7.958736,41.476121],[-7.957766,41.476079],[-7.956926,41.476002],[-7.956114,41.475873],[-7.955008,41.475637],[-7.954104,41.475384],[-7.951492,41.474593],[-7.949982,41.474128],[-7.949537,41.473987],[-7.947807,41.473461],[-7.947686,41.473406],[-7.94542,41.472724],[-7.943343,41.47209],[-7.942515,41.471882],[-7.941601,41.471727],[-7.940782,41.471664],[-7.940634,41.471661],[-7.939778,41.471655],[-7.938966,41.471714],[-7.937982,41.471857],[-7.936975,41.472118],[-7.936162,41.472382],[-7.935476,41.472656],[-7.934639,41.473063],[-7.934237,41.473304],[-7.933677,41.473688],[-7.933002,41.474272],[-7.928316,41.478751],[-7.927661,41.479308],[-7.926892,41.479846],[-7.926339,41.480171],[-7.925593,41.480537],[-7.924913,41.480821],[-7.92422,41.481063],[-7.923493,41.481269],[-7.922692,41.481434],[-7.921893,41.481558],[-7.921225,41.481626],[-7.920216,41.481658],[-7.919432,41.481637],[-7.918603,41.481565],[-7.917642,41.481422],[-7.90536,41.479211],[-7.904123,41.479028],[-7.903279,41.478942],[-7.902385,41.478918],[-7.901546,41.478965],[-7.900714,41.479073],[-7.899499,41.479276],[-7.898765,41.479377],[-7.898043,41.479439],[-7.897267,41.47946],[-7.896586,41.47944],[-7.895859,41.479373],[-7.895108,41.479258],[-7.894428,41.479109],[-7.89373,41.478916],[-7.893064,41.478694],[-7.892417,41.478391],[-7.89135,41.477784],[-7.890703,41.477451],[-7.890018,41.477153],[-7.889344,41.47695],[-7.888566,41.476815],[-7.887668,41.476729],[-7.886895,41.476703],[-7.886251,41.476706],[-7.885561,41.47677],[-7.884817,41.476904],[-7.883602,41.477177],[-7.883023,41.477304],[-7.882434,41.477388],[-7.881813,41.477428],[-7.881268,41.477423],[-7.88055,41.47736],[-7.878828,41.477104],[-7.877941,41.477025],[-7.876966,41.477002],[-7.87624,41.477024],[-7.875343,41.477107],[-7.874451,41.477244],[-7.873598,41.477431],[-7.872878,41.477644],[-7.872139,41.477907],[-7.871468,41.478185],[-7.870742,41.478545],[-7.870072,41.478926],[-7.869509,41.479315],[-7.868942,41.47976],[-7.8684,41.48026],[-7.867891,41.480808],[-7.867473,41.481376],[-7.867237,41.481789],[-7.866369,41.483439],[-7.866075,41.483893],[-7.865664,41.484398],[-7.865307,41.48478],[-7.864871,41.485162],[-7.864434,41.485487],[-7.863899,41.485825],[-7.8634,41.486091],[-7.862835,41.486341],[-7.862223,41.486558],[-7.861546,41.486758],[-7.861065,41.486862],[-7.860597,41.486931],[-7.859941,41.486996],[-7.859093,41.487019],[-7.858223,41.48702],[-7.857515,41.487045],[-7.85686,41.487109],[-7.856237,41.487221],[-7.855561,41.487403],[-7.855001,41.487594],[-7.853602,41.488232],[-7.853089,41.488463],[-7.852503,41.488666],[-7.851895,41.488831],[-7.851271,41.488956],[-7.850617,41.48903],[-7.84998,41.489071],[-7.848982,41.489074],[-7.848105,41.489079],[-7.847033,41.489151],[-7.846181,41.489265],[-7.845328,41.489437],[-7.844518,41.489637],[-7.843678,41.489909],[-7.843041,41.490179],[-7.842226,41.490616],[-7.840583,41.491541],[-7.840035,41.491792],[-7.838888,41.4922],[-7.837925,41.492455],[-7.837051,41.492645],[-7.836019,41.492784],[-7.835207,41.492828],[-7.834212,41.492797],[-7.83219,41.492611],[-7.831434,41.492604],[-7.830674,41.492679],[-7.830081,41.492789],[-7.8292,41.492989],[-7.82775,41.493502],[-7.826819,41.493761],[-7.826131,41.493882],[-7.824984,41.493947],[-7.823861,41.494002],[-7.822911,41.494124],[-7.822201,41.494268],[-7.82095,41.494632],[-7.820228,41.494804],[-7.819621,41.4949],[-7.819028,41.494941],[-7.818328,41.494938],[-7.816643,41.494821],[-7.8159,41.494814],[-7.815173,41.494865],[-7.814499,41.494962],[-7.813835,41.4951],[-7.811727,41.495751],[-7.811022,41.495929],[-7.810071,41.496082],[-7.805392,41.496432],[-7.804419,41.496493],[-7.802682,41.496613],[-7.802301,41.496639],[-7.800148,41.496792],[-7.79998,41.496771],[-7.799032,41.496857],[-7.798859,41.496879],[-7.798115,41.497003],[-7.797395,41.497142],[-7.79607,41.497509],[-7.795105,41.497856],[-7.79419,41.498273],[-7.793319,41.498719],[-7.787231,41.502035],[-7.786338,41.502478],[-7.785385,41.502865],[-7.784475,41.503132],[-7.783588,41.503325],[-7.782694,41.503445],[-7.781708,41.503509],[-7.780819,41.503492],[-7.780149,41.503442],[-7.779322,41.503342],[-7.775174,41.502736],[-7.774237,41.502641],[-7.773177,41.502563],[-7.772193,41.50255],[-7.770328,41.502558],[-7.769277,41.502556],[-7.76839,41.502488],[-7.767668,41.502398],[-7.766953,41.502244],[-7.766401,41.502089],[-7.765305,41.501718],[-7.76398,41.501307],[-7.762867,41.501026],[-7.762029,41.50086],[-7.761205,41.500745],[-7.760231,41.500652],[-7.759291,41.500613],[-7.758186,41.500627],[-7.757019,41.500715],[-7.755986,41.500858],[-7.754882,41.501081],[-7.753775,41.501373],[-7.752726,41.501735],[-7.751842,41.502098],[-7.751046,41.50249],[-7.747373,41.504622],[-7.744755,41.50613],[-7.744019,41.506512],[-7.743405,41.506786],[-7.742746,41.507044],[-7.742189,41.507231],[-7.741604,41.507403],[-7.740968,41.507563],[-7.740298,41.50769],[-7.739701,41.50778],[-7.738889,41.507868],[-7.738222,41.507911],[-7.737794,41.507915],[-7.737162,41.507916],[-7.73634,41.507859],[-7.735089,41.507712],[-7.734501,41.507613],[-7.73365,41.507417],[-7.732661,41.507124],[-7.72785,41.505527],[-7.726891,41.505209],[-7.723262,41.504023],[-7.722767,41.503856],[-7.721832,41.503603],[-7.72081,41.503399],[-7.719538,41.503178],[-7.718908,41.503097],[-7.718227,41.503033],[-7.71712,41.502944],[-7.715903,41.502934],[-7.714816,41.502981],[-7.711742,41.50316],[-7.710882,41.503181],[-7.710077,41.503171],[-7.709334,41.503109],[-7.70861,41.503009],[-7.707812,41.502859],[-7.706988,41.502658],[-7.706241,41.502413],[-7.705628,41.502187],[-7.705085,41.501943],[-7.704491,41.501639],[-7.703944,41.50132],[-7.703288,41.500876],[-7.702814,41.500507],[-7.702384,41.500125],[-7.701903,41.499637],[-7.701404,41.49901],[-7.701049,41.498458],[-7.700765,41.49795],[-7.699294,41.494838],[-7.69897,41.494256],[-7.698564,41.493637],[-7.698106,41.493086],[-7.697679,41.49265],[-7.697128,41.492168],[-7.69669,41.491838],[-7.69616,41.491507],[-7.695605,41.491198],[-7.695037,41.490921],[-7.694492,41.490693],[-7.693773,41.490448],[-7.69316,41.490278],[-7.692636,41.490163],[-7.69169,41.49001],[-7.691054,41.48995],[-7.690394,41.489922],[-7.689684,41.489921],[-7.689058,41.489961],[-7.688285,41.490043],[-7.687624,41.490163],[-7.686466,41.490436],[-7.676516,41.49332],[-7.674611,41.493876],[-7.674317,41.493967],[-7.672346,41.494537],[-7.667635,41.495906],[-7.666816,41.4962],[-7.666146,41.496506],[-7.665487,41.496879],[-7.664835,41.497343],[-7.664211,41.497914],[-7.663758,41.498437],[-7.663129,41.499374],[-7.662577,41.500211],[-7.6621,41.500761],[-7.661587,41.50123],[-7.661268,41.501462],[-7.660889,41.501688],[-7.66035,41.501963],[-7.658924,41.502603],[-7.656679,41.50361],[-7.656096,41.503868],[-7.655568,41.504112],[-7.655108,41.504421],[-7.654801,41.504722],[-7.654622,41.504967],[-7.654499,41.505179],[-7.654383,41.505482],[-7.654327,41.505842],[-7.654353,41.506173],[-7.654425,41.506468],[-7.654542,41.506739],[-7.654688,41.506978],[-7.654926,41.507252],[-7.655171,41.50746],[-7.655579,41.507739],[-7.655898,41.507957],[-7.656236,41.50822],[-7.656551,41.508533],[-7.656794,41.508854],[-7.657048,41.509317],[-7.657133,41.509562],[-7.657238,41.510058],[-7.657309,41.510456],[-7.657404,41.510572],[-7.657444,41.510961],[-7.657468,41.511489],[-7.65747,41.511949],[-7.657451,41.512305],[-7.657392,41.51264],[-7.657303,41.512989],[-7.6572,41.513327],[-7.657057,41.513688],[-7.65691,41.513992],[-7.656725,41.514316],[-7.65651,41.514633],[-7.656308,41.514883],[-7.656073,41.515184],[-7.655917,41.515326],[-7.655549,41.515685],[-7.655118,41.516064],[-7.6548,41.516302],[-7.654204,41.516668],[-7.653871,41.516844],[-7.65346,41.517038],[-7.653072,41.517212],[-7.652506,41.517434],[-7.651953,41.517627],[-7.651431,41.517793],[-7.650846,41.517956],[-7.650212,41.518139],[-7.64949,41.518348],[-7.648923,41.518534],[-7.648363,41.518727],[-7.64799,41.518864],[-7.647469,41.519089],[-7.646922,41.519355],[-7.646464,41.519622],[-7.646174,41.519797],[-7.645674,41.520141],[-7.645272,41.520474],[-7.644843,41.52085],[-7.644421,41.521297],[-7.644131,41.521656],[-7.643839,41.522061],[-7.643604,41.522448],[-7.643404,41.522821],[-7.643181,41.523313],[-7.643024,41.523698],[-7.642833,41.524236],[-7.642664,41.524709],[-7.642483,41.525186],[-7.642332,41.525573],[-7.642119,41.525999],[-7.641857,41.526448],[-7.641556,41.526872],[-7.641191,41.527273],[-7.640888,41.527584],[-7.640622,41.527825],[-7.640296,41.528082],[-7.639891,41.52836],[-7.63947,41.528628],[-7.639058,41.528863],[-7.638616,41.52909],[-7.638044,41.52937],[-7.637491,41.529655],[-7.637056,41.529872],[-7.636493,41.530178],[-7.635991,41.530469],[-7.635432,41.530832],[-7.634754,41.531334],[-7.634475,41.531562],[-7.633989,41.53198],[-7.63355,41.532455],[-7.633192,41.532945],[-7.632773,41.533654],[-7.632564,41.534047],[-7.632346,41.534553],[-7.632114,41.535205],[-7.631977,41.535633],[-7.631761,41.536302],[-7.631577,41.536787],[-7.631372,41.537241],[-7.63119,41.537575],[-7.631011,41.537859],[-7.630816,41.538135],[-7.630604,41.538411],[-7.630357,41.538695],[-7.630101,41.538962],[-7.629739,41.539327],[-7.629424,41.539627],[-7.629166,41.539882],[-7.628891,41.540157],[-7.628563,41.540519],[-7.628297,41.540842],[-7.62809,41.541124],[-7.627926,41.541366],[-7.627772,41.54165],[-7.627615,41.541963],[-7.627494,41.54225],[-7.627403,41.542512],[-7.6273,41.542867],[-7.627231,41.543201],[-7.627177,41.543559],[-7.627153,41.543852],[-7.627155,41.544158],[-7.627161,41.544563],[-7.627244,41.546163],[-7.627197,41.547246],[-7.627126,41.54782],[-7.627064,41.548208],[-7.626955,41.548713],[-7.626868,41.549056],[-7.626766,41.54941],[-7.626669,41.549726],[-7.626534,41.550174],[-7.626391,41.550608],[-7.62618,41.551299],[-7.625955,41.55201],[-7.625556,41.553287],[-7.625356,41.55401],[-7.625207,41.554779],[-7.625156,41.555224],[-7.625145,41.555629],[-7.625158,41.555879],[-7.625202,41.556309],[-7.625262,41.556612],[-7.625315,41.556892],[-7.625407,41.557198],[-7.625513,41.557491],[-7.625633,41.557774],[-7.625782,41.558086],[-7.625948,41.558383],[-7.626129,41.558673],[-7.626309,41.558929],[-7.62651,41.55918],[-7.626743,41.55945],[-7.626977,41.559703],[-7.627302,41.560006],[-7.627642,41.560297],[-7.627962,41.560537],[-7.628293,41.560769],[-7.628593,41.560966],[-7.629104,41.561281],[-7.629468,41.561489],[-7.630228,41.561904],[-7.630723,41.562179],[-7.63117,41.562426],[-7.631615,41.562689],[-7.632097,41.563022],[-7.632495,41.563342],[-7.63284,41.563686],[-7.633055,41.563931],[-7.633294,41.564243],[-7.633493,41.564563],[-7.633661,41.564883],[-7.633795,41.565152],[-7.633944,41.565459],[-7.634119,41.565788],[-7.634269,41.566023],[-7.634428,41.566264],[-7.634618,41.566511],[-7.634815,41.566738],[-7.63509,41.567019],[-7.635443,41.567336],[-7.635905,41.567692],[-7.636165,41.567893],[-7.636513,41.568184],[-7.63681,41.56846],[-7.637076,41.568759],[-7.637241,41.568985],[-7.637428,41.569293],[-7.637593,41.569658],[-7.63773,41.570032],[-7.637842,41.570412],[-7.637963,41.570832],[-7.638125,41.571291],[-7.638262,41.571636],[-7.638399,41.571907],[-7.638587,41.572258],[-7.638753,41.572525],[-7.639076,41.572976],[-7.639614,41.573618],[-7.640002,41.574054],[-7.640428,41.574551],[-7.640914,41.575195],[-7.641157,41.575574],[-7.641441,41.576117],[-7.641668,41.576679],[-7.641801,41.577196],[-7.64188,41.577685],[-7.641891,41.578123],[-7.641876,41.578597],[-7.641799,41.579147],[-7.641725,41.579412],[-7.641636,41.579724],[-7.641508,41.580063],[-7.641325,41.58046],[-7.641179,41.58075],[-7.640789,41.58146],[-7.640186,41.582596],[-7.639861,41.583185],[-7.639719,41.583477],[-7.639519,41.583826],[-7.639243,41.584292],[-7.639017,41.584649],[-7.638712,41.58509],[-7.638213,41.585725],[-7.637591,41.586455],[-7.635559,41.588572],[-7.63505,41.589142],[-7.634001,41.590513],[-7.633321,41.591563],[-7.632432,41.593163],[-7.631811,41.594328],[-7.631306,41.595121],[-7.63015,41.59653],[-7.627863,41.598833],[-7.627051,41.599796],[-7.62649,41.60062],[-7.626279,41.601005],[-7.625932,41.601739],[-7.625778,41.602125],[-7.625615,41.602629],[-7.625504,41.603072],[-7.625427,41.60344],[-7.625354,41.603888],[-7.62533,41.60421],[-7.625309,41.604958],[-7.625366,41.605887],[-7.625473,41.606836],[-7.625566,41.607448],[-7.625668,41.608232],[-7.625726,41.608881],[-7.625748,41.609552],[-7.625719,41.610032],[-7.625645,41.610536],[-7.625523,41.611031],[-7.625354,41.611489],[-7.625123,41.611974],[-7.624906,41.612339],[-7.624668,41.612671],[-7.624207,41.613204],[-7.624035,41.613404],[-7.623678,41.613727],[-7.622978,41.614265],[-7.621732,41.614955],[-7.620336,41.615466],[-7.619269,41.615706],[-7.61819,41.615855],[-7.616551,41.615942],[-7.612329,41.615829],[-7.611005,41.615847],[-7.609781,41.615989],[-7.608798,41.616231],[-7.608356,41.616388],[-7.607624,41.616719],[-7.607027,41.617088],[-7.606679,41.617361],[-7.606084,41.617928],[-7.604468,41.619779],[-7.60351,41.620629],[-7.602491,41.621317],[-7.599545,41.622878],[-7.598259,41.623698],[-7.597772,41.624101],[-7.596875,41.625024],[-7.596164,41.626067],[-7.595736,41.627037],[-7.595593,41.627542],[-7.595448,41.628451],[-7.595442,41.629565],[-7.59562,41.63206],[-7.595585,41.632854],[-7.595446,41.633624],[-7.59521,41.634375],[-7.594814,41.635249],[-7.594332,41.636141],[-7.59386,41.636875],[-7.593029,41.637998],[-7.590724,41.641017],[-7.590369,41.641491],[-7.590011,41.641953],[-7.589727,41.642287],[-7.589379,41.642651],[-7.588929,41.643072],[-7.588523,41.643414],[-7.588398,41.643515],[-7.587709,41.644007],[-7.587228,41.64431],[-7.586665,41.644655],[-7.585838,41.645127],[-7.585045,41.64559],[-7.584616,41.645881],[-7.584323,41.646094],[-7.583894,41.646417],[-7.583218,41.646994],[-7.58287,41.647344],[-7.582424,41.647862],[-7.582095,41.648325],[-7.581771,41.648846],[-7.581503,41.649364],[-7.581286,41.649888],[-7.581131,41.65033],[-7.581007,41.650727],[-7.580902,41.651104],[-7.580671,41.651838],[-7.580415,41.652618],[-7.57975,41.654845],[-7.579046,41.657167],[-7.578703,41.65823],[-7.578463,41.65883],[-7.578161,41.659386],[-7.577825,41.659912],[-7.577533,41.660286],[-7.57713,41.660723],[-7.576732,41.661104],[-7.576264,41.661487],[-7.575667,41.661915],[-7.575319,41.662141],[-7.574798,41.662476],[-7.574217,41.662853],[-7.573678,41.663233],[-7.573149,41.663676],[-7.572775,41.664043],[-7.572362,41.664533],[-7.571998,41.665051],[-7.571692,41.665605],[-7.571456,41.666159],[-7.571281,41.66664],[-7.570904,41.667696],[-7.570592,41.66849],[-7.570235,41.669254],[-7.569957,41.669773],[-7.569673,41.670253],[-7.569389,41.670697],[-7.569064,41.671152],[-7.568656,41.671702],[-7.568518,41.671882],[-7.56824,41.672247],[-7.567667,41.673032],[-7.56729,41.673593],[-7.56702,41.674065],[-7.56678,41.674538],[-7.566575,41.675074],[-7.566427,41.675587],[-7.566325,41.676112],[-7.566279,41.676673],[-7.566293,41.677192],[-7.56637,41.677956],[-7.566584,41.679346],[-7.566629,41.679993],[-7.566573,41.680807],[-7.566517,41.681181],[-7.56635,41.681742],[-7.566129,41.682244],[-7.565885,41.682717],[-7.565491,41.683284],[-7.565315,41.683461],[-7.564996,41.683811],[-7.564685,41.684142],[-7.564331,41.684471],[-7.563895,41.684892],[-7.563537,41.685236],[-7.563169,41.685601],[-7.562786,41.686031],[-7.562489,41.686402],[-7.562223,41.686766],[-7.561945,41.687199],[-7.561703,41.687614],[-7.561454,41.688055],[-7.561228,41.688453],[-7.561023,41.688811],[-7.56078,41.689182],[-7.560479,41.689562],[-7.560136,41.689943],[-7.559774,41.690284],[-7.559467,41.690535],[-7.559038,41.690864],[-7.558663,41.691112],[-7.558094,41.691447],[-7.557574,41.691745],[-7.557021,41.692065],[-7.556544,41.692349],[-7.556156,41.692595],[-7.555852,41.692798],[-7.555577,41.692988],[-7.555048,41.693423],[-7.554653,41.693798],[-7.554299,41.694175],[-7.554017,41.694518],[-7.553747,41.694892],[-7.553514,41.69527],[-7.553333,41.6956],[-7.553139,41.69604],[-7.552884,41.696609],[-7.552656,41.697148],[-7.552215,41.698112],[-7.551904,41.698745],[-7.551574,41.699311],[-7.551433,41.699544],[-7.551076,41.700078],[-7.550867,41.700389],[-7.550622,41.700713],[-7.550272,41.701155],[-7.549921,41.701565],[-7.549493,41.70205],[-7.549256,41.702312],[-7.548687,41.702934],[-7.547994,41.703702],[-7.547612,41.704148],[-7.547256,41.704582],[-7.54685,41.705118],[-7.546379,41.705799],[-7.546048,41.706347],[-7.54561,41.707142],[-7.545229,41.707935],[-7.544895,41.708767],[-7.544722,41.709217],[-7.544284,41.710578],[-7.544224,41.710786],[-7.543651,41.71246],[-7.543408,41.713193],[-7.542911,41.71489],[-7.542751,41.715641],[-7.542663,41.716297],[-7.542632,41.716852],[-7.542653,41.717533],[-7.54274,41.718228],[-7.542903,41.719081],[-7.543037,41.719877],[-7.543142,41.720872],[-7.543132,41.721364],[-7.543066,41.72191],[-7.542953,41.722346],[-7.542877,41.722583],[-7.542791,41.722812],[-7.542641,41.72315],[-7.542471,41.723478],[-7.542229,41.723853],[-7.541958,41.724223],[-7.541631,41.724602],[-7.54134,41.724891],[-7.540969,41.725217],[-7.540579,41.72552],[-7.5402,41.725775],[-7.539695,41.726078],[-7.539319,41.726285],[-7.538757,41.726561],[-7.538276,41.726794],[-7.537855,41.726991],[-7.537203,41.727278],[-7.536544,41.727597],[-7.535971,41.727893],[-7.535569,41.728131],[-7.535016,41.728492],[-7.534586,41.728798],[-7.534208,41.729094],[-7.533677,41.729574],[-7.533164,41.730063],[-7.52998,41.733227],[-7.529098,41.734108],[-7.52852,41.734679],[-7.527945,41.735278],[-7.527374,41.735903],[-7.526997,41.736365],[-7.526576,41.736923],[-7.526151,41.737564],[-7.525773,41.738214],[-7.525485,41.738797],[-7.525216,41.739423],[-7.52502,41.739964],[-7.52484,41.740486],[-7.524716,41.7409],[-7.524265,41.742369],[-7.523752,41.744066],[-7.523434,41.74511],[-7.523221,41.745779],[-7.522959,41.746509],[-7.522694,41.747093],[-7.522439,41.747567],[-7.522157,41.748042],[-7.521838,41.748515],[-7.521585,41.748849],[-7.521287,41.74922],[-7.52076,41.749802],[-7.520245,41.750343],[-7.519435,41.751179],[-7.5174,41.753305],[-7.5168,41.753925],[-7.516203,41.754497],[-7.515671,41.75498],[-7.515123,41.755434],[-7.514546,41.755883],[-7.513936,41.756326],[-7.513427,41.756667],[-7.512805,41.757056],[-7.5123,41.757352],[-7.511891,41.757588],[-7.511445,41.757826],[-7.51074,41.758179],[-7.510087,41.758489],[-7.509534,41.758748],[-7.508805,41.759077],[-7.502985,41.761732],[-7.501979,41.762232],[-7.50061,41.762939],[-7.499176,41.763738],[-7.498229,41.764236],[-7.497067,41.764868],[-7.494753,41.76621],[-7.492891,41.767375],[-7.492374,41.767698],[-7.490281,41.768998],[-7.489767,41.769311],[-7.48882,41.769815],[-7.487671,41.770342],[-7.486742,41.770721],[-7.485921,41.771013],[-7.484886,41.771391],[-7.48399,41.77171],[-7.483204,41.77206],[-7.48253,41.772373],[-7.482182,41.772544],[-7.481555,41.772893],[-7.48092,41.773314],[-7.480393,41.773699],[-7.479891,41.77412],[-7.479438,41.77455],[-7.478912,41.775131],[-7.478437,41.775748],[-7.478118,41.776222],[-7.47695,41.778143],[-7.475698,41.780181],[-7.475304,41.780732],[-7.474792,41.781359],[-7.474305,41.78187],[-7.47379,41.782324],[-7.473199,41.782796],[-7.472588,41.783211],[-7.472056,41.783526],[-7.47131,41.783919],[-7.470559,41.78425],[-7.469807,41.784528],[-7.469173,41.784733],[-7.468387,41.784935],[-7.467574,41.78511],[-7.466791,41.785256],[-7.465797,41.785419],[-7.46367,41.785734],[-7.462347,41.785927],[-7.46119,41.786099],[-7.459996,41.786305],[-7.459213,41.786483],[-7.458463,41.786696],[-7.457852,41.786903],[-7.457283,41.787129],[-7.456663,41.787398],[-7.455986,41.787735],[-7.455176,41.788152],[-7.454502,41.788489],[-7.453893,41.788755],[-7.453157,41.789045],[-7.452387,41.78931],[-7.451573,41.789542],[-7.450687,41.789747],[-7.449543,41.790047],[-7.446416,41.790834],[-7.445079,41.791178],[-7.444151,41.791417],[-7.443589,41.791562],[-7.442736,41.791807],[-7.442056,41.792037],[-7.441607,41.792203],[-7.440961,41.792463],[-7.440232,41.792783],[-7.439718,41.793028],[-7.439223,41.793287],[-7.438576,41.793649],[-7.437898,41.794053],[-7.436749,41.794771],[-7.436137,41.795142],[-7.435645,41.795425],[-7.435171,41.795673],[-7.43465,41.795923],[-7.434201,41.796116],[-7.433765,41.796288],[-7.433185,41.796488],[-7.432659,41.796641],[-7.432078,41.796788],[-7.431545,41.796905],[-7.431073,41.79699],[-7.430542,41.797069],[-7.43019,41.79711],[-7.429461,41.797176],[-7.428635,41.797216],[-7.425176,41.797283],[-7.423568,41.797305],[-7.422948,41.797321],[-7.422761,41.797331],[-7.422148,41.797375],[-7.421399,41.797458],[-7.420589,41.79761],[-7.419922,41.797781],[-7.419204,41.79802],[-7.418582,41.798283],[-7.418003,41.798572],[-7.417551,41.79884],[-7.417239,41.799047],[-7.416786,41.799384],[-7.416474,41.799656],[-7.416174,41.79994],[-7.415776,41.800384],[-7.415496,41.800749],[-7.415263,41.801106],[-7.414993,41.801583],[-7.414807,41.801959],[-7.414648,41.80234],[-7.414468,41.802827],[-7.414385,41.80305],[-7.414177,41.803663],[-7.41387,41.804584],[-7.413765,41.804901],[-7.413192,41.80667],[-7.412876,41.807697],[-7.412727,41.808304],[-7.412651,41.808692],[-7.412588,41.809202],[-7.412558,41.809749],[-7.412568,41.810198],[-7.412602,41.810605],[-7.412675,41.811079],[-7.412775,41.811533],[-7.41292,41.812031],[-7.413072,41.812436],[-7.413143,41.812598],[-7.413304,41.812967],[-7.413527,41.813384],[-7.413826,41.813871],[-7.414027,41.814164],[-7.414145,41.814319],[-7.414316,41.814544],[-7.415508,41.816086],[-7.416244,41.817091],[-7.416685,41.817742],[-7.416954,41.818163],[-7.417572,41.819231],[-7.418552,41.821195],[-7.418848,41.821871],[-7.419055,41.822343],[-7.419549,41.823574],[-7.419927,41.824661],[-7.42028,41.825741],[-7.420594,41.826849],[-7.420882,41.827987],[-7.421136,41.829167],[-7.421387,41.830611],[-7.421536,41.831665],[-7.4216,41.832383],[-7.421618,41.833132],[-7.421502,41.834161],[-7.421409,41.834633],[-7.421322,41.835017],[-7.421258,41.835222],[-7.421153,41.835599],[-7.420986,41.836076],[-7.420775,41.836559],[-7.420563,41.837],[-7.420039,41.837903],[-7.419716,41.838369],[-7.419362,41.838823],[-7.419037,41.839216],[-7.418502,41.839785],[-7.418129,41.840146],[-7.417433,41.840741],[-7.416906,41.841147],[-7.416307,41.841563],[-7.415257,41.842218],[-7.41485,41.842505],[-7.414383,41.842872],[-7.41399,41.843242],[-7.413533,41.843737],[-7.4133,41.844037],[-7.413064,41.84437],[-7.412813,41.844803],[-7.412541,41.845398],[-7.4124,41.845834],[-7.412292,41.846274],[-7.412232,41.846723],[-7.412215,41.847179],[-7.412233,41.84765],[-7.412301,41.848147],[-7.412507,41.848972],[-7.412696,41.849392],[-7.412924,41.849847],[-7.413154,41.850215],[-7.413425,41.850591],[-7.41372,41.850946],[-7.41399,41.85123],[-7.414543,41.85173],[-7.414785,41.851921],[-7.415093,41.852137],[-7.415756,41.852555],[-7.416633,41.852988],[-7.417554,41.853343],[-7.418629,41.853715],[-7.419566,41.854079],[-7.420301,41.854423],[-7.420983,41.854793],[-7.421642,41.855204],[-7.421971,41.855443],[-7.422298,41.855696],[-7.422632,41.855972],[-7.422994,41.856302],[-7.423496,41.856811],[-7.42405,41.857486],[-7.424295,41.857845],[-7.42459,41.858315],[-7.425801,41.860648],[-7.426523,41.861841],[-7.426946,41.86244],[-7.427398,41.863041],[-7.428518,41.864312],[-7.429172,41.864961],[-7.429873,41.865609],[-7.430604,41.866253],[-7.431304,41.866911],[-7.431885,41.86761],[-7.432277,41.868207],[-7.432549,41.86872],[-7.432774,41.869268],[-7.432941,41.869883],[-7.433052,41.87049],[-7.433076,41.871176],[-7.433055,41.871568],[-7.432996,41.872006],[-7.432825,41.872689],[-7.432714,41.87303],[-7.432548,41.873414],[-7.432197,41.874054],[-7.431875,41.874539],[-7.431544,41.874948],[-7.431134,41.875429],[-7.430533,41.876178],[-7.430177,41.876699],[-7.429923,41.877126],[-7.429734,41.877506],[-7.429552,41.877909],[-7.429216,41.878806],[-7.428615,41.880524],[-7.427369,41.884082],[-7.426743,41.885874],[-7.426309,41.887114],[-7.425979,41.888041],[-7.425069,41.890627],[-7.424623,41.891947],[-7.424436,41.89262],[-7.424293,41.893232],[-7.424149,41.894131],[-7.42411,41.895005],[-7.424149,41.895975],[-7.424201,41.89645],[-7.424259,41.89689],[-7.424547,41.898077],[-7.424787,41.898801],[-7.42508,41.899506],[-7.425379,41.90011],[-7.425739,41.900749],[-7.426023,41.901184],[-7.426308,41.901593],[-7.426606,41.902005],[-7.42765,41.903215],[-7.429017,41.904803],[-7.429434,41.905301],[-7.429997,41.905949],[-7.430166,41.906154],[-7.430325,41.906361],[-7.430484,41.906604],[-7.430605,41.90682],[-7.430711,41.907027],[-7.430807,41.907249],[-7.430893,41.907512],[-7.43098,41.907854],[-7.43103,41.908295],[-7.431036,41.908642],[-7.430942,41.909272],[-7.430747,41.909862],[-7.430531,41.910285],[-7.430264,41.910699],[-7.429869,41.911155],[-7.429516,41.911486],[-7.429156,41.911757],[-7.428709,41.912044],[-7.428327,41.912247],[-7.427968,41.912416],[-7.427404,41.912674],[-7.42667,41.913025],[-7.425545,41.913617],[-7.424975,41.913939],[-7.42463,41.914151],[-7.415218,41.919157],[-7.414342,41.919663],[-7.41378,41.920028],[-7.413245,41.920415],[-7.412541,41.921032],[-7.412078,41.921472],[-7.411678,41.921909],[-7.411312,41.922353],[-7.410698,41.92329],[-7.410562,41.923533],[-7.410198,41.924292],[-7.41,41.924813],[-7.409598,41.926117],[-7.409333,41.926878],[-7.409117,41.927373],[-7.40886,41.927855],[-7.40871,41.928085],[-7.408366,41.928516],[-7.408002,41.928958],[-7.407595,41.929363],[-7.40717,41.929759],[-7.406717,41.930123],[-7.406091,41.930568],[-7.405449,41.930947],[-7.404618,41.931358],[-7.40292,41.932122],[-7.402368,41.932417],[-7.401844,41.932728],[-7.401299,41.933086],[-7.400823,41.933439],[-7.400341,41.933843],[-7.39987,41.934287],[-7.399484,41.934703],[-7.399027,41.935228],[-7.398575,41.935875],[-7.398341,41.936284],[-7.397803,41.937352],[-7.396906,41.939115],[-7.396536,41.939822],[-7.396181,41.940534],[-7.395875,41.94105],[-7.395519,41.941556],[-7.395248,41.941874],[-7.394843,41.94227],[-7.394607,41.942493],[-7.394083,41.942903],[-7.39349,41.943285],[-7.393157,41.943475],[-7.392498,41.9438],[-7.39181,41.944063],[-7.390749,41.944405],[-7.387887,41.945171],[-7.385416,41.945779],[-7.383875,41.946179],[-7.382853,41.946447],[-7.382282,41.946602],[-7.38167,41.946805],[-7.381089,41.947037],[-7.380465,41.947339],[-7.38008,41.947551],[-7.379703,41.947781],[-7.378952,41.948307],[-7.378274,41.948805],[-7.377934,41.949048],[-7.377596,41.94926],[-7.377166,41.949523],[-7.376662,41.949787],[-7.376133,41.950053],[-7.375475,41.950323],[-7.37445,41.950677],[-7.373705,41.950885],[-7.373004,41.95104],[-7.372536,41.951132],[-7.371865,41.951228],[-7.371226,41.951291],[-7.370546,41.951332],[-7.369686,41.95134],[-7.368803,41.951301],[-7.368096,41.951241],[-7.367124,41.951098],[-7.366284,41.950923],[-7.365112,41.950631],[-7.363686,41.950289],[-7.362899,41.950156],[-7.361838,41.950031],[-7.361071,41.94999],[-7.360415,41.949988],[-7.359943,41.950003],[-7.359557,41.95002],[-7.358721,41.950097],[-7.356874,41.950319],[-7.356108,41.950375],[-7.355332,41.950412],[-7.354571,41.950395],[-7.353825,41.950352],[-7.353081,41.950265],[-7.35241,41.950166],[-7.350752,41.949851],[-7.349921,41.949721],[-7.349004,41.949644],[-7.348418,41.949624],[-7.347695,41.949662],[-7.346957,41.949723],[-7.346199,41.949833],[-7.345355,41.950013],[-7.344408,41.950282],[-7.343738,41.950513],[-7.342777,41.950815],[-7.341826,41.951077],[-7.341109,41.951231],[-7.340298,41.951368],[-7.339455,41.951487],[-7.338619,41.951551],[-7.337714,41.951585],[-7.336668,41.951579],[-7.336462,41.951569],[-7.334312,41.951457],[-7.333804,41.951459],[-7.333325,41.951483],[-7.332913,41.951513],[-7.332168,41.951607],[-7.331815,41.951674],[-7.331432,41.95175],[-7.330723,41.951948],[-7.330051,41.952186],[-7.329354,41.952496],[-7.328722,41.952836],[-7.328383,41.953051],[-7.32783,41.953443],[-7.327317,41.953891],[-7.326878,41.954361],[-7.326486,41.954863],[-7.326151,41.955401],[-7.325878,41.955949],[-7.325683,41.95654],[-7.325568,41.957074],[-7.325503,41.957711],[-7.325524,41.958289],[-7.325613,41.958847],[-7.325949,41.960114],[-7.326274,41.961418],[-7.326563,41.962865],[-7.326743,41.964053],[-7.32688,41.965118],[-7.326922,41.965738],[-7.326931,41.966518],[-7.326858,41.967352],[-7.326763,41.967915],[-7.326597,41.968485],[-7.326108,41.969887],[-7.325683,41.970717],[-7.325315,41.971258],[-7.324754,41.972027],[-7.32433,41.972538],[-7.323858,41.973022],[-7.323355,41.973485],[-7.322818,41.973928],[-7.322221,41.974335],[-7.321629,41.974738],[-7.320982,41.975125],[-7.320331,41.975474],[-7.318708,41.976288],[-7.31767,41.976783],[-7.31661,41.97725],[-7.314797,41.978008],[-7.31332,41.978582],[-7.312577,41.978852],[-7.31183,41.979102],[-7.311078,41.979333],[-7.30999,41.9796],[-7.309189,41.979774],[-7.308412,41.979911],[-7.307261,41.980067],[-7.306459,41.980144],[-7.30528,41.980206],[-7.304101,41.98021],[-7.301433,41.980092],[-7.300647,41.980072],[-7.30003,41.980095],[-7.29954,41.980118],[-7.298802,41.98018],[-7.298071,41.980293],[-7.297338,41.980434],[-7.296631,41.980604],[-7.295582,41.980884],[-7.294583,41.981138],[-7.293758,41.98132],[-7.293028,41.981449],[-7.292116,41.981556],[-7.290998,41.981643],[-7.29019,41.981668],[-7.289633,41.981682],[-7.288804,41.981648],[-7.287741,41.981574],[-7.286634,41.981505],[-7.285893,41.981492],[-7.28528,41.981529],[-7.284713,41.981581],[-7.283903,41.981717],[-7.283353,41.981837],[-7.28266,41.982042],[-7.28251,41.982098],[-7.281992,41.98229],[-7.281667,41.98243],[-7.281047,41.982738],[-7.280497,41.983072],[-7.280145,41.983325],[-7.279945,41.983469],[-7.279683,41.983684],[-7.279187,41.984147],[-7.278816,41.98457],[-7.278454,41.985049],[-7.278198,41.985477],[-7.277855,41.986051],[-7.277568,41.986533],[-7.277093,41.987227],[-7.276645,41.987731],[-7.276304,41.988057],[-7.275836,41.988469],[-7.275585,41.988656],[-7.275019,41.989066],[-7.274983,41.989088],[-7.274127,41.989605],[-7.273487,41.989911],[-7.27288,41.990167],[-7.272464,41.990321],[-7.271751,41.990552],[-7.271058,41.990732],[-7.270453,41.990876],[-7.269955,41.990973],[-7.269444,41.991067],[-7.268789,41.991169],[-7.267872,41.991274],[-7.266858,41.991347],[-7.265631,41.991365],[-7.264828,41.991347],[-7.263582,41.99127],[-7.262755,41.99117],[-7.261935,41.991042],[-7.261128,41.990888],[-7.259931,41.990591],[-7.257614,41.989955],[-7.256473,41.989612],[-7.254639,41.989018],[-7.252811,41.98838],[-7.252142,41.988145],[-7.251528,41.987963],[-7.251133,41.987876],[-7.25085,41.987813],[-7.250438,41.987753],[-7.249719,41.98769],[-7.249141,41.987674],[-7.248753,41.987683],[-7.248415,41.987705],[-7.247939,41.987754],[-7.247406,41.987833],[-7.246843,41.987958],[-7.246262,41.988126],[-7.245727,41.988313],[-7.245103,41.988582],[-7.244609,41.988857],[-7.244194,41.989127],[-7.243804,41.989408],[-7.243099,41.989964],[-7.242559,41.99036],[-7.242033,41.990711],[-7.241447,41.991032],[-7.241004,41.991247],[-7.240365,41.99151],[-7.239752,41.991767],[-7.23846,41.99219],[-7.237445,41.992586],[-7.23636,41.993074],[-7.23529,41.993655],[-7.234637,41.994083],[-7.234113,41.994447],[-7.233605,41.994827],[-7.233135,41.995227],[-7.232225,41.996107],[-7.231333,41.997063],[-7.230478,41.998085],[-7.229023,41.999927],[-7.228565,42.00043],[-7.22831,42.000663],[-7.227675,42.001119],[-7.227476,42.00124],[-7.227088,42.001459],[-7.226413,42.001771],[-7.226044,42.001915],[-7.225402,42.002108],[-7.224738,42.002246],[-7.224072,42.002346],[-7.223524,42.002383],[-7.223137,42.002392],[-7.222382,42.002373],[-7.221779,42.002317],[-7.220884,42.002173],[-7.21968,42.001976],[-7.218773,42.001864],[-7.218163,42.001822],[-7.2169,42.001767],[-7.215814,42.001805],[-7.214813,42.001886],[-7.213934,42.001994],[-7.212995,42.002149],[-7.212397,42.002284],[-7.212367,42.002292],[-7.211907,42.002412],[-7.21118,42.002622],[-7.210513,42.002859],[-7.209795,42.003127],[-7.208902,42.003484],[-7.207991,42.00397],[-7.207419,42.004311],[-7.206921,42.004653],[-7.206193,42.005184],[-7.20556,42.005686],[-7.205246,42.005946],[-7.204752,42.00646],[-7.204366,42.006923],[-7.20411,42.007275],[-7.203819,42.007725],[-7.203519,42.008226],[-7.203474,42.0083],[-7.202985,42.0092],[-7.202297,42.010728],[-7.202052,42.011223],[-7.201783,42.011702],[-7.201477,42.012167],[-7.201127,42.012623],[-7.200737,42.013067],[-7.20031,42.013488],[-7.199847,42.013892],[-7.199357,42.014272],[-7.198548,42.014797],[-7.197973,42.01512],[-7.197378,42.015423],[-7.195857,42.016127],[-7.194968,42.016565],[-7.194103,42.017037],[-7.19356,42.017379],[-7.193036,42.017742],[-7.192501,42.018109],[-7.19175,42.018715],[-7.190398,42.019894],[-7.189036,42.021117],[-7.188343,42.02172],[-7.187005,42.022675],[-7.185654,42.023639],[-7.184755,42.024296],[-7.183983,42.024861],[-7.18345,42.02528],[-7.182949,42.025703],[-7.182503,42.026128],[-7.182057,42.026568],[-7.181633,42.027023],[-7.181232,42.02749],[-7.180968,42.027801],[-7.18083,42.027969],[-7.180498,42.028465],[-7.180002,42.02925],[-7.17974,42.029717],[-7.179405,42.030244],[-7.179003,42.030743],[-7.178587,42.031207],[-7.178108,42.031635],[-7.177852,42.031837],[-7.177305,42.032217],[-7.177017,42.032398],[-7.176408,42.032738],[-7.175765,42.033042],[-7.175425,42.033173],[-7.174728,42.033402],[-7.174018,42.033585],[-7.172305,42.033968],[-7.171665,42.03416],[-7.171053,42.03439],[-7.170462,42.034653],[-7.169897,42.03495],[-7.169375,42.035282],[-7.168897,42.035643],[-7.167377,42.037008],[-7.166903,42.037378],[-7.16613,42.037897],[-7.165575,42.038212],[-7.16499,42.038502],[-7.164067,42.038885],[-7.163432,42.039103],[-7.1619,42.039595],[-7.161313,42.03981],[-7.16047,42.040177],[-7.159942,42.040457],[-7.159187,42.040918],[-7.158477,42.041425],[-7.15804,42.041793],[-7.157632,42.042187],[-7.157265,42.04259],[-7.156938,42.043007],[-7.156664,42.043473],[-7.156403,42.043926],[-7.156154,42.044447],[-7.156031,42.044723],[-7.155899,42.045107],[-7.155784,42.045517],[-7.155703,42.045891],[-7.155499,42.04732],[-7.155283,42.048038],[-7.155071,42.048509],[-7.154905,42.048772],[-7.154805,42.048943],[-7.154747,42.049043],[-7.154545,42.049339],[-7.154106,42.049839],[-7.153865,42.050065],[-7.153676,42.050242],[-7.153354,42.050509],[-7.153049,42.05072],[-7.15252,42.051041],[-7.151981,42.051319],[-7.151591,42.051501],[-7.151061,42.0517],[-7.150578,42.051857],[-7.150018,42.05203],[-7.149385,42.052229],[-7.148674,42.052522],[-7.148081,42.052817],[-7.147719,42.053046],[-7.147108,42.053468],[-7.146569,42.053918],[-7.146252,42.054245],[-7.145876,42.054693],[-7.145415,42.055312],[-7.145037,42.055768],[-7.144479,42.05636],[-7.14431,42.056519],[-7.143849,42.056891],[-7.143245,42.057328],[-7.142862,42.057535],[-7.142293,42.057845],[-7.141702,42.058123],[-7.141088,42.05837],[-7.140488,42.058562],[-7.140064,42.058672],[-7.139577,42.058788],[-7.138834,42.05891],[-7.138034,42.059008],[-7.137178,42.059051],[-7.136499,42.059039],[-7.135567,42.058964],[-7.135096,42.058908],[-7.13444,42.058788],[-7.13391,42.058671],[-7.13336,42.058517],[-7.132806,42.058329],[-7.132138,42.058077],[-7.131287,42.057781],[-7.130733,42.057632],[-7.13016,42.057513],[-7.129762,42.057448],[-7.129342,42.057396],[-7.128783,42.057363],[-7.128488,42.057353],[-7.12785,42.057366],[-7.12759,42.057389],[-7.127341,42.057411],[-7.127129,42.057437],[-7.126963,42.057459],[-7.126709,42.057495],[-7.126033,42.05764],[-7.124979,42.057945],[-7.123862,42.058223],[-7.123348,42.058342],[-7.1228,42.058435],[-7.122196,42.058507],[-7.12142,42.058572],[-7.120638,42.058588],[-7.11989,42.058562],[-7.119174,42.058509],[-7.118759,42.058457],[-7.118135,42.058361],[-7.117454,42.058214],[-7.116637,42.057986],[-7.115967,42.057779],[-7.114636,42.057276],[-7.113645,42.056906],[-7.112927,42.056682],[-7.112129,42.056458],[-7.111418,42.05628],[-7.110827,42.056152],[-7.109878,42.05598],[-7.109175,42.055875],[-7.107782,42.05572],[-7.106343,42.055616],[-7.105272,42.055498],[-7.104545,42.055407],[-7.103815,42.055295],[-7.10308,42.055157],[-7.102019,42.054897],[-7.101252,42.054686],[-7.100308,42.054382],[-7.098453,42.053775],[-7.097437,42.053462],[-7.096753,42.053272],[-7.094303,42.052655],[-7.093612,42.05245],[-7.092978,42.052217],[-7.092047,42.051835],[-7.091508,42.051594],[-7.090821,42.051208],[-7.090273,42.050894],[-7.089239,42.050237],[-7.088393,42.049741],[-7.087459,42.049266],[-7.086916,42.049038],[-7.086075,42.048735],[-7.085358,42.048512],[-7.084997,42.048415],[-7.084255,42.048247],[-7.083505,42.048118],[-7.082373,42.047987],[-7.081995,42.047962],[-7.080858,42.047937],[-7.08011,42.047963],[-7.079372,42.048027],[-7.078635,42.048123],[-7.077928,42.048256],[-7.07714,42.04844],[-7.076035,42.048741],[-7.075233,42.048969],[-7.074796,42.049065],[-7.074012,42.049192],[-7.073272,42.049257],[-7.072537,42.04928],[-7.071834,42.049246],[-7.071098,42.049171],[-7.070403,42.049051],[-7.069772,42.048902],[-7.069367,42.048784],[-7.068712,42.048546],[-7.068321,42.048384],[-7.067668,42.048059],[-7.067228,42.047791],[-7.066726,42.047446],[-7.066441,42.047235],[-7.065492,42.046506],[-7.064897,42.046102],[-7.064259,42.04574],[-7.063733,42.045483],[-7.063407,42.045328],[-7.062727,42.045043],[-7.06201,42.044792],[-7.061262,42.04457],[-7.059357,42.044063],[-7.058622,42.043838],[-7.0565,42.043107],[-7.055957,42.042925],[-7.05545,42.042773],[-7.055214,42.042711],[-7.054727,42.042582],[-7.053987,42.042418],[-7.052875,42.042248],[-7.052,42.042149],[-7.051221,42.042104],[-7.050331,42.042081],[-7.049629,42.042091],[-7.047557,42.042205],[-7.04675,42.042217],[-7.045997,42.042162],[-7.045292,42.042095],[-7.044948,42.042047],[-7.044273,42.041922],[-7.043612,42.041753],[-7.04297,42.041552],[-7.04204,42.041185],[-7.040585,42.040518],[-7.039878,42.040285],[-7.039241,42.040091],[-7.038512,42.039925],[-7.037837,42.039809],[-7.035678,42.039577],[-7.034877,42.039435],[-7.034183,42.039287],[-7.031688,42.038692],[-7.029987,42.038286],[-7.027687,42.037762],[-7.02679,42.037583],[-7.02589,42.037462],[-7.025278,42.037424],[-7.024588,42.037405],[-7.024009,42.037404],[-7.023401,42.037441],[-7.02278,42.037495],[-7.022041,42.037592],[-7.021281,42.037742],[-7.020739,42.03788],[-7.020277,42.03801],[-7.019576,42.038247],[-7.018996,42.038464],[-7.017183,42.039253],[-7.016669,42.039453],[-7.015868,42.039732],[-7.015419,42.039857],[-7.015042,42.039945],[-7.014429,42.040076],[-7.013053,42.040308],[-7.011195,42.040633],[-7.01056,42.040767],[-7.00993,42.040927],[-7.009303,42.041112],[-7.007522,42.041707],[-7.007273,42.041786],[-7.006706,42.041947],[-7.00638,42.042026],[-7.005528,42.042198],[-7.004754,42.042302],[-7.00399,42.042358],[-7.002893,42.042388],[-7.002198,42.042352],[-7.001084,42.042231],[-7.000353,42.042103],[-6.999636,42.041929],[-6.998905,42.041709],[-6.998088,42.041411],[-6.997674,42.041249],[-6.997546,42.04119],[-6.997173,42.041021],[-6.996366,42.040567],[-6.995041,42.039673],[-6.993589,42.038635],[-6.992936,42.03825],[-6.992362,42.037959],[-6.991853,42.037727],[-6.991262,42.037482],[-6.990647,42.037265],[-6.989687,42.036978],[-6.98903,42.036823],[-6.988017,42.036638],[-6.987024,42.03653],[-6.985941,42.036444],[-6.984922,42.036423],[-6.982535,42.036425],[-6.981897,42.036405],[-6.979047,42.036223],[-6.978612,42.036225],[-6.977637,42.036225],[-6.976524,42.036293],[-6.975553,42.036382],[-6.974297,42.036559],[-6.970492,42.037473],[-6.969169,42.037773],[-6.967984,42.038036],[-6.967042,42.038192],[-6.965902,42.038358],[-6.96487,42.038498],[-6.964183,42.038607],[-6.962906,42.03879],[-6.961877,42.038945],[-6.96073,42.039113],[-6.960312,42.039168],[-6.959666,42.039264],[-6.958966,42.039332],[-6.958537,42.039358],[-6.957987,42.039368],[-6.957258,42.039341],[-6.956996,42.039327],[-6.956761,42.039316],[-6.956312,42.039295],[-6.95587,42.039282],[-6.9554,42.039275],[-6.954911,42.039278],[-6.954145,42.039306],[-6.953286,42.039328],[-6.952736,42.039319],[-6.95207,42.039267],[-6.951602,42.039215],[-6.950895,42.039099],[-6.950487,42.039022],[-6.950023,42.038913],[-6.949132,42.038717],[-6.948682,42.038625],[-6.948181,42.038551],[-6.9477,42.038492],[-6.947296,42.038461],[-6.946675,42.038433],[-6.945972,42.038414],[-6.944251,42.038378],[-6.943181,42.038351],[-6.94236,42.038324],[-6.941886,42.038295],[-6.941488,42.038263],[-6.940962,42.038202],[-6.940483,42.03813],[-6.939823,42.038005],[-6.939182,42.037853],[-6.938558,42.037667],[-6.938361,42.037596],[-6.937955,42.03745],[-6.937529,42.037273],[-6.937062,42.03706],[-6.936497,42.036772],[-6.936015,42.036491],[-6.934688,42.03566],[-6.934121,42.035328],[-6.933644,42.035079],[-6.933344,42.034945],[-6.933051,42.034825],[-6.932424,42.034603],[-6.931856,42.03443],[-6.931229,42.034282],[-6.930442,42.034119],[-6.930088,42.034049],[-6.929722,42.033974],[-6.929344,42.033884],[-6.929036,42.033801],[-6.928599,42.033668],[-6.92795,42.033429],[-6.927938,42.033424],[-6.92757,42.033268],[-6.927166,42.033079],[-6.926698,42.032838],[-6.925885,42.032357],[-6.925445,42.032083],[-6.925338,42.032017],[-6.924481,42.031511],[-6.923828,42.031188],[-6.923352,42.030967],[-6.92267,42.030684],[-6.921916,42.030422],[-6.920964,42.030161],[-6.920407,42.030024],[-6.919837,42.029901],[-6.919291,42.0298],[-6.918372,42.029653],[-6.917565,42.029568],[-6.916917,42.029514],[-6.915825,42.029443],[-6.915366,42.029413],[-6.912605,42.029231],[-6.910052,42.029064],[-6.90875,42.028975],[-6.904091,42.028663],[-6.903253,42.028598],[-6.902687,42.028531],[-6.901847,42.028413],[-6.901185,42.028303],[-6.900554,42.028198],[-6.89997,42.028128],[-6.899611,42.028095],[-6.899153,42.028056],[-6.898637,42.028038],[-6.898122,42.028038],[-6.897501,42.028058],[-6.896722,42.02812],[-6.894657,42.028344],[-6.892726,42.028551],[-6.89223,42.028601],[-6.891692,42.028649],[-6.891079,42.028691],[-6.890518,42.028715],[-6.890078,42.028728],[-6.889298,42.028748],[-6.886893,42.028736],[-6.885008,42.02872],[-6.88426,42.028721],[-6.883701,42.028738],[-6.8832,42.028774],[-6.882704,42.028822],[-6.882341,42.028869],[-6.881827,42.028967],[-6.881469,42.029054],[-6.880975,42.029183],[-6.880621,42.029296],[-6.880227,42.029442],[-6.879782,42.029629],[-6.879175,42.029916],[-6.878143,42.030471],[-6.876606,42.031301],[-6.874971,42.032188],[-6.873425,42.033029],[-6.8733,42.033088],[-6.872222,42.033687],[-6.871488,42.03404],[-6.87074,42.034342],[-6.870244,42.034514],[-6.869723,42.034663],[-6.869008,42.03486],[-6.868533,42.034983],[-6.868034,42.035097],[-6.867533,42.035195],[-6.866777,42.035341],[-6.866402,42.035398],[-6.865635,42.035505],[-6.864848,42.035606],[-6.864077,42.035658],[-6.862918,42.035748],[-6.862108,42.03576],[-6.861545,42.035762],[-6.860912,42.035755],[-6.860051,42.035721],[-6.859047,42.035653],[-6.858093,42.035551],[-6.857241,42.035437],[-6.856405,42.035303],[-6.855796,42.035182],[-6.855279,42.035083],[-6.854261,42.034863],[-6.853305,42.034644],[-6.852649,42.034509],[-6.852051,42.034415],[-6.851465,42.03435],[-6.850865,42.034308],[-6.850395,42.034288],[-6.849911,42.034285],[-6.849284,42.034294],[-6.848148,42.034321],[-6.847264,42.034335],[-6.846533,42.034318],[-6.845913,42.034276],[-6.845312,42.03421],[-6.844816,42.034139],[-6.844315,42.034059],[-6.843816,42.033949],[-6.843373,42.033846],[-6.842974,42.03374],[-6.842459,42.033574],[-6.841971,42.033408],[-6.841041,42.033047],[-6.841038,42.033046],[-6.840265,42.032745],[-6.839756,42.032544],[-6.839199,42.032345],[-6.838609,42.032145],[-6.838134,42.032009],[-6.837713,42.031905],[-6.83704,42.031755],[-6.836347,42.031638],[-6.8356,42.031534],[-6.835226,42.031503],[-6.834662,42.031469],[-6.834222,42.031463],[-6.833751,42.031465],[-6.833183,42.031475],[-6.832512,42.031518],[-6.831912,42.031585],[-6.831335,42.03167],[-6.830809,42.031769],[-6.830231,42.031909],[-6.829596,42.032094],[-6.829106,42.032266],[-6.828558,42.032465],[-6.8272,42.032959],[-6.827188,42.032963],[-6.826735,42.033122],[-6.825438,42.033605],[-6.824113,42.034114],[-6.822038,42.034987],[-6.819692,42.035925],[-6.812966,42.038663],[-6.812198,42.038928],[-6.81163,42.039073],[-6.811042,42.039227],[-6.810535,42.039336],[-6.810078,42.039422],[-6.809631,42.039489],[-6.809135,42.039566],[-6.808731,42.039607],[-6.808377,42.039635],[-6.80782,42.039682],[-6.807225,42.03972],[-6.806711,42.03974],[-6.806008,42.039761],[-6.805335,42.039758],[-6.804542,42.039729],[-6.803949,42.039692],[-6.803156,42.039617],[-6.802254,42.039503],[-6.800903,42.039301],[-6.799973,42.039164],[-6.799349,42.039089],[-6.798822,42.039044],[-6.798352,42.039023],[-6.797638,42.039013],[-6.797203,42.039025],[-6.796708,42.039048],[-6.79609,42.039107],[-6.795473,42.03919],[-6.79455,42.039372],[-6.793688,42.039607],[-6.792753,42.03992],[-6.791607,42.040366],[-6.79031,42.040875],[-6.789561,42.041135],[-6.789117,42.041287],[-6.788208,42.041536],[-6.787432,42.041703],[-6.786791,42.04181],[-6.786267,42.041884],[-6.785697,42.041935],[-6.785231,42.041962],[-6.784782,42.041979],[-6.784196,42.041978],[-6.783663,42.041963],[-6.783067,42.041922],[-6.782638,42.041878],[-6.782142,42.041808],[-6.781526,42.041712],[-6.781015,42.041609],[-6.780603,42.041507],[-6.780159,42.041388],[-6.779639,42.041238],[-6.779175,42.041065],[-6.778613,42.040845],[-6.778113,42.040628],[-6.777468,42.040318],[-6.776965,42.040053],[-6.775968,42.039518],[-6.773749,42.038294],[-6.772546,42.037627],[-6.771509,42.037066],[-6.771051,42.036828],[-6.77061,42.036608],[-6.770206,42.036424],[-6.769668,42.03619],[-6.769125,42.035971],[-6.768461,42.03574],[-6.767966,42.035582],[-6.767219,42.035371],[-6.766717,42.035251],[-6.766218,42.035144],[-6.765585,42.035015],[-6.765056,42.03494],[-6.764485,42.034865],[-6.763939,42.034809],[-6.76338,42.034766],[-6.762399,42.034721],[-6.760443,42.034677],[-6.759654,42.034655],[-6.759096,42.034611],[-6.758646,42.034558],[-6.757965,42.034457],[-6.757608,42.034398],[-6.756913,42.034255],[-6.756342,42.034107],[-6.754286,42.033485],[-6.753331,42.033241],[-6.752849,42.033143],[-6.752378,42.033069],[-6.751738,42.033001],[-6.75034,42.033004],[-6.749954,42.033033],[-6.749568,42.03307],[-6.74909,42.03314],[-6.748758,42.033205],[-6.74834,42.033288],[-6.746812,42.033622],[-6.745956,42.033785],[-6.745266,42.033894],[-6.744449,42.033969],[-6.743881,42.034003],[-6.74348,42.034014],[-6.742974,42.034015],[-6.742557,42.034003],[-6.742051,42.033966],[-6.741427,42.033914],[-6.740454,42.033804],[-6.739442,42.033698],[-6.738456,42.033598],[-6.737868,42.033572],[-6.737299,42.033555],[-6.736438,42.033557],[-6.735765,42.033591],[-6.735205,42.033635],[-6.734601,42.033702],[-6.73407,42.033772],[-6.733584,42.033856],[-6.732939,42.03398],[-6.732289,42.034127],[-6.731403,42.034387],[-6.731026,42.034513],[-6.73057,42.034671],[-6.729977,42.034897],[-6.729403,42.035148],[-6.728876,42.035386],[-6.728298,42.0357],[-6.727132,42.036334],[-6.726346,42.036779],[-6.725593,42.037185],[-6.724987,42.037487],[-6.724485,42.03772],[-6.72376,42.038031],[-6.723068,42.038292],[-6.722482,42.038501],[-6.721903,42.038684],[-6.721264,42.038867],[-6.720573,42.039037],[-6.719896,42.039191],[-6.719324,42.039304],[-6.718739,42.039397],[-6.718237,42.039464],[-6.717583,42.039549],[-6.715156,42.039803],[-6.71435,42.03989],[-6.713525,42.040002],[-6.712686,42.040133],[-6.711971,42.040268],[-6.711348,42.040389],[-6.710656,42.04055],[-6.710014,42.040712],[-6.709394,42.040882],[-6.708548,42.041139],[-6.70788,42.041356],[-6.707311,42.041552],[-6.706729,42.041774],[-6.706387,42.041916],[-6.705828,42.042157],[-6.70527,42.042408],[-6.704642,42.042711],[-6.703711,42.043187],[-6.701783,42.044228],[-6.699929,42.045207],[-6.699206,42.045587],[-6.698598,42.045885],[-6.697867,42.046237],[-6.697073,42.0466],[-6.695877,42.047129],[-6.694719,42.047595],[-6.693758,42.047971],[-6.692848,42.048304],[-6.691616,42.048739],[-6.690624,42.049071],[-6.689175,42.049552],[-6.68829,42.049847],[-6.687493,42.050121],[-6.686886,42.050346],[-6.686348,42.050561],[-6.685732,42.050806],[-6.685262,42.051005],[-6.68495,42.051157],[-6.684392,42.051423],[-6.683943,42.051645],[-6.683053,42.052123],[-6.681611,42.052933],[-6.680641,42.053471],[-6.680294,42.053649],[-6.679777,42.053917],[-6.679748,42.053932],[-6.67929,42.054162],[-6.678785,42.054407],[-6.678117,42.054727],[-6.676739,42.055307],[-6.676213,42.055512],[-6.675616,42.055729],[-6.675128,42.055901],[-6.674514,42.056094],[-6.673978,42.056256],[-6.673432,42.05642],[-6.672902,42.05657],[-6.672098,42.056807],[-6.669711,42.057376],[-6.668387,42.057684],[-6.667766,42.057836],[-6.667146,42.058003],[-6.666476,42.058205],[-6.665963,42.058357],[-6.665463,42.058527],[-6.664635,42.058818],[-6.663737,42.059177],[-6.663202,42.059406],[-6.661898,42.05999],[-6.66097,42.060411],[-6.660364,42.060685],[-6.659577,42.061032],[-6.659227,42.061146],[-6.658685,42.061341],[-6.658243,42.061491],[-6.657543,42.0617],[-6.656765,42.061906],[-6.656373,42.062005],[-6.655818,42.062117],[-6.655138,42.062246],[-6.654568,42.062335],[-6.65398,42.062416],[-6.653432,42.06248],[-6.652816,42.062527],[-6.652323,42.062556],[-6.65183,42.06258],[-6.651374,42.062583],[-6.650712,42.062583],[-6.650285,42.062575],[-6.649776,42.06255],[-6.649324,42.062522],[-6.648889,42.062486],[-6.647886,42.062382],[-6.647222,42.062285],[-6.646003,42.062111],[-6.644643,42.061928],[-6.643921,42.061845],[-6.643296,42.061781],[-6.642454,42.061731],[-6.642026,42.061714],[-6.641191,42.061702],[-6.640275,42.061734],[-6.639453,42.061776],[-6.638787,42.061836],[-6.638214,42.061903],[-6.637542,42.061996],[-6.635921,42.062268],[-6.633106,42.062746],[-6.630506,42.063188],[-6.629575,42.063344],[-6.628979,42.063424],[-6.628257,42.0635],[-6.627649,42.063551],[-6.627466,42.063563],[-6.62712,42.063565],[-6.626642,42.063573],[-6.625945,42.063561],[-6.625321,42.063535],[-6.624568,42.063487],[-6.624054,42.063435],[-6.623618,42.063362],[-6.623016,42.063254],[-6.622263,42.063102],[-6.62158,42.062933],[-6.620857,42.062721],[-6.620152,42.062492],[-6.619483,42.062228],[-6.618935,42.061984],[-6.618443,42.061747],[-6.61797,42.061492],[-6.61749,42.061225],[-6.616899,42.060847],[-6.615134,42.059698],[-6.61422,42.059128],[-6.613832,42.058905],[-6.613033,42.058448],[-6.612449,42.058171],[-6.611881,42.057907],[-6.611421,42.057708],[-6.610789,42.057458],[-6.610188,42.057244],[-6.609657,42.057071],[-6.609074,42.056889],[-6.608375,42.056699],[-6.60719,42.056413],[-6.60647,42.056273],[-6.605662,42.056153],[-6.604903,42.056051],[-6.604171,42.055978],[-6.603546,42.055929],[-6.60239,42.055864],[-6.601398,42.055822],[-6.599825,42.055759],[-6.597627,42.055669],[-6.593811,42.055509],[-6.590563,42.055384],[-6.588289,42.055283],[-6.586508,42.055209],[-6.581451,42.054994],[-6.580336,42.054954],[-6.579391,42.054926],[-6.578413,42.054927],[-6.5776,42.054939],[-6.576837,42.054986],[-6.576207,42.055017],[-6.575277,42.055114],[-6.574516,42.055197],[-6.571348,42.05564],[-6.570662,42.055723],[-6.569952,42.055783],[-6.569281,42.055832],[-6.568681,42.055856],[-6.568051,42.055865],[-6.567375,42.055854],[-6.566472,42.05581],[-6.565649,42.055752],[-6.564627,42.055615],[-6.563843,42.055487],[-6.563281,42.055387],[-6.562739,42.055266],[-6.561995,42.055088],[-6.561192,42.054861],[-6.559393,42.054298],[-6.55779,42.053793],[-6.556907,42.053543],[-6.556617,42.053465],[-6.556325,42.053392],[-6.555618,42.053229],[-6.554989,42.053093],[-6.554596,42.053011],[-6.553822,42.052877],[-6.553089,42.052771],[-6.552323,42.052668],[-6.550761,42.052514],[-6.548363,42.052313],[-6.546854,42.052172],[-6.545567,42.052029],[-6.544512,42.051898],[-6.54374,42.05179],[-6.543073,42.05168],[-6.542233,42.051553],[-6.541239,42.051383],[-6.540294,42.051197],[-6.539243,42.050981],[-6.53826,42.050757],[-6.537042,42.050458],[-6.535848,42.050142],[-6.534373,42.04973],[-6.532801,42.049284],[-6.531782,42.048995],[-6.530937,42.048772],[-6.530229,42.048605],[-6.529696,42.048487],[-6.529075,42.048367],[-6.52823,42.048211],[-6.527447,42.0481],[-6.526683,42.048002],[-6.525917,42.047928],[-6.525043,42.047862],[-6.522587,42.047704],[-6.520858,42.04758],[-6.5198,42.04747],[-6.518902,42.047359],[-6.5181,42.047248],[-6.51731,42.047121],[-6.51618,42.046902],[-6.515122,42.046678],[-6.514132,42.046457],[-6.512183,42.046015],[-6.511578,42.045896],[-6.51098,42.04578],[-6.510303,42.045671],[-6.50977,42.0456],[-6.509278,42.045547],[-6.508752,42.045496],[-6.508274,42.04546],[-6.507584,42.045428],[-6.507099,42.045418],[-6.506434,42.045423],[-6.505663,42.045436],[-6.504309,42.045484],[-6.502452,42.045561],[-6.501616,42.045581],[-6.500895,42.045595],[-6.500115,42.045592],[-6.499348,42.045572],[-6.498704,42.045548],[-6.498012,42.04551],[-6.497354,42.045456],[-6.496724,42.045406],[-6.495765,42.045295],[-6.494867,42.045179],[-6.493525,42.044979],[-6.491019,42.044579],[-6.489832,42.044389],[-6.488317,42.044157],[-6.486997,42.043976],[-6.485902,42.043834],[-6.484782,42.043709],[-6.48384,42.043616],[-6.482589,42.043507],[-6.481968,42.04346],[-6.480673,42.043375],[-6.479838,42.043326],[-6.476866,42.043177],[-6.475161,42.04309],[-6.474133,42.043032],[-6.473125,42.042949],[-6.472355,42.042882],[-6.471308,42.042748],[-6.470684,42.042655],[-6.469929,42.042537],[-6.469189,42.042406],[-6.468437,42.042248],[-6.467783,42.042109],[-6.466832,42.041876],[-6.465761,42.041586],[-6.464196,42.041142],[-6.46296,42.040773],[-6.461773,42.040437],[-6.46083,42.040186],[-6.459969,42.039976],[-6.459321,42.039837],[-6.45879,42.039717],[-6.458075,42.03959],[-6.457513,42.039495],[-6.456548,42.039344],[-6.455594,42.039222],[-6.45463,42.039106],[-6.452282,42.038859],[-6.45089,42.03871],[-6.449564,42.038554],[-6.448207,42.038388],[-6.446992,42.038218],[-6.445882,42.038047],[-6.444674,42.037843],[-6.443285,42.037582],[-6.442176,42.037368],[-6.441108,42.037133],[-6.439674,42.036796],[-6.439028,42.036634],[-6.437107,42.036115],[-6.435998,42.035797],[-6.43481,42.035439],[-6.433736,42.035081],[-6.432668,42.034707],[-6.43171,42.034359],[-6.430066,42.033742],[-6.428643,42.033175],[-6.426939,42.032486],[-6.426398,42.032267],[-6.424445,42.031485],[-6.42385,42.031261],[-6.42325,42.031038],[-6.422449,42.030762],[-6.421598,42.030489],[-6.420889,42.030273],[-6.420152,42.030062],[-6.419494,42.029886],[-6.41867,42.029679],[-6.417583,42.029427],[-6.415422,42.028946],[-6.414284,42.028684],[-6.41346,42.028489],[-6.412653,42.028291],[-6.411895,42.028083],[-6.411223,42.027884],[-6.410532,42.027669],[-6.409793,42.027418],[-6.409143,42.027186],[-6.408178,42.026817],[-6.406264,42.026047],[-6.405001,42.025538],[-6.404023,42.025159],[-6.402728,42.024694],[-6.401762,42.024392],[-6.401322,42.024261],[-6.400795,42.024105],[-6.400083,42.02392],[-6.398951,42.023647],[-6.398145,42.02348],[-6.397354,42.02333],[-6.396493,42.023181],[-6.395894,42.023091],[-6.394954,42.022972],[-6.394164,42.022883],[-6.393356,42.022818],[-6.392547,42.022763],[-6.391527,42.022715],[-6.3906,42.022691],[-6.387199,42.022651],[-6.382664,42.022611],[-6.378174,42.022571],[-6.374266,42.022542],[-6.372151,42.022524],[-6.37078,42.022487],[-6.36906,42.022411],[-6.367331,42.022292],[-6.366486,42.022225],[-6.365613,42.022143],[-6.364285,42.021997],[-6.363557,42.021911],[-6.362624,42.021789],[-6.361702,42.021658],[-6.359932,42.021377],[-6.35812,42.021041],[-6.3579,42.021],[-6.356446,42.020731],[-6.355961,42.020643],[-6.352582,42.020021],[-6.352352,42.019978],[-6.351038,42.019735],[-6.349268,42.019409],[-6.347472,42.019078],[-6.343681,42.018382],[-6.343319,42.018324],[-6.341975,42.018072],[-6.341079,42.017926],[-6.34008,42.017774],[-6.339257,42.017678],[-6.338308,42.017581],[-6.337469,42.017517],[-6.33673,42.017464],[-6.335901,42.01743],[-6.334724,42.017412],[-6.333544,42.017431],[-6.332479,42.017473],[-6.331012,42.01757],[-6.330538,42.017605],[-6.330495,42.017608],[-6.328036,42.017819],[-6.32662,42.017915],[-6.325709,42.017959],[-6.324938,42.017984],[-6.323863,42.017991],[-6.323267,42.017984],[-6.32225,42.017957],[-6.321463,42.017915],[-6.320519,42.017843],[-6.319884,42.017779],[-6.318995,42.017677],[-6.318185,42.017568],[-6.317429,42.017449],[-6.316198,42.017237],[-6.314869,42.01699],[-6.312718,42.01658],[-6.310364,42.016137],[-6.307783,42.015644],[-6.306243,42.015348],[-6.305356,42.015178],[-6.303983,42.014895],[-6.302624,42.014579],[-6.301315,42.014255],[-6.300274,42.01398],[-6.299192,42.013678],[-6.298369,42.013433],[-6.297597,42.013195],[-6.295615,42.01255],[-6.29405,42.012022],[-6.291699,42.011231],[-6.290852,42.010945],[-6.289798,42.010605],[-6.287915,42.010048],[-6.287133,42.00984],[-6.286327,42.009648],[-6.284788,42.009305],[-6.283735,42.009116],[-6.28281,42.008961],[-6.281579,42.008777],[-6.279117,42.008469],[-6.277815,42.008299],[-6.276127,42.008054],[-6.274706,42.007815],[-6.273587,42.007603],[-6.269855,42.006833],[-6.26656,42.006145],[-6.26561,42.00597],[-6.26433,42.005744],[-6.263435,42.005614],[-6.262536,42.005533],[-6.261464,42.005461],[-6.259953,42.005436],[-6.258493,42.005507],[-6.257552,42.005583],[-6.25666,42.005695],[-6.25582,42.00584],[-6.255054,42.005993],[-6.253637,42.006308],[-6.25243,42.00669],[-6.251595,42.00699],[-6.2508,42.007306],[-6.248742,42.008151],[-6.24736,42.008728],[-6.246615,42.009008],[-6.245767,42.009314],[-6.24497,42.009561],[-6.244197,42.009778],[-6.243129,42.010025],[-6.242609,42.010129],[-6.242159,42.010209],[-6.241014,42.010376],[-6.240135,42.010469],[-6.239491,42.010516],[-6.238774,42.010551],[-6.238157,42.010563],[-6.237588,42.01055],[-6.236723,42.010535],[-6.235547,42.010451],[-6.234588,42.010345],[-6.232909,42.010109],[-6.225729,42.008973],[-6.221539,42.008313],[-6.217773,42.007722],[-6.214178,42.007175],[-6.212172,42.006927],[-6.211026,42.006832],[-6.209779,42.00675],[-6.208766,42.006716],[-6.207534,42.006694],[-6.20693,42.006692],[-6.205404,42.00674],[-6.202544,42.006879],[-6.201407,42.006925],[-6.200237,42.006967],[-6.198612,42.00698],[-6.198064,42.006964],[-6.197323,42.006926],[-6.196094,42.006837],[-6.195535,42.006771],[-6.194809,42.006683],[-6.193523,42.006478],[-6.192433,42.006281],[-6.190289,42.005851],[-6.189382,42.00569],[-6.188227,42.005502],[-6.187443,42.005403],[-6.186262,42.005293],[-6.185048,42.005235],[-6.184207,42.005223],[-6.182916,42.005244],[-6.182064,42.005292],[-6.180125,42.00546],[-6.17925,42.00555],[-6.178209,42.005654],[-6.177173,42.005708],[-6.176373,42.005743],[-6.175573,42.005748],[-6.174775,42.005727],[-6.173585,42.005653],[-6.171218,42.005433],[-6.169655,42.005312],[-6.168435,42.005258],[-6.16718,42.005268],[-6.165892,42.005337],[-6.165039,42.005426],[-6.164118,42.005537],[-6.162512,42.005747],[-6.160625,42.006002],[-6.159665,42.006103],[-6.158848,42.006148],[-6.158,42.006187],[-6.157124,42.006204],[-6.155935,42.006191],[-6.154663,42.006115],[-6.153814,42.006053],[-6.151897,42.005879],[-6.151715,42.005862],[-6.150493,42.005769],[-6.149651,42.005731],[-6.148465,42.005737],[-6.147652,42.005767],[-6.146852,42.005832],[-6.146063,42.00592],[-6.145283,42.00603],[-6.144522,42.006162],[-6.14341,42.0064],[-6.142677,42.00659],[-6.140988,42.00709],[-6.140752,42.00716],[-6.139204,42.007628],[-6.138159,42.007925],[-6.137639,42.008052],[-6.137028,42.008183],[-6.136227,42.008342],[-6.135408,42.008477],[-6.134832,42.008549],[-6.134178,42.008629],[-6.132924,42.008719],[-6.131852,42.008758],[-6.131269,42.008757],[-6.130735,42.008749],[-6.125037,42.008514],[-6.1221,42.008375],[-6.120013,42.008312],[-6.118993,42.008304],[-6.11803,42.008322],[-6.116792,42.008373],[-6.115542,42.008465],[-6.114702,42.008548],[-6.113154,42.008782],[-6.112857,42.00883],[-6.112206,42.008938],[-6.111455,42.00908],[-6.109025,42.009576],[-6.108202,42.009735],[-6.106945,42.009962],[-6.106093,42.01008],[-6.105216,42.010196],[-6.104314,42.010278],[-6.103455,42.010335],[-6.102256,42.010365],[-6.101375,42.01037],[-6.100395,42.010353],[-6.099057,42.010266],[-6.096797,42.010048],[-6.091651,42.00951],[-6.089055,42.009241],[-6.085284,42.008838],[-6.083866,42.008695],[-6.077756,42.008049],[-6.076401,42.007893],[-6.075536,42.007762],[-6.074948,42.007645],[-6.074061,42.007446],[-6.07322,42.007235],[-6.07224,42.006948],[-6.071132,42.006546],[-6.070321,42.006215],[-6.069155,42.005675],[-6.067682,42.004958],[-6.066596,42.00445],[-6.065863,42.004135],[-6.06512,42.00385],[-6.064358,42.003593],[-6.063227,42.003238],[-6.06208,42.002937],[-6.06132,42.002788],[-6.060503,42.002625],[-6.059641,42.002504],[-6.058829,42.002406],[-6.057988,42.002324],[-6.056224,42.002236],[-6.045396,42.001968],[-6.040198,42.00185],[-6.038825,42.00184],[-6.037995,42.001859],[-6.036167,42.001949],[-6.035459,42.002018],[-6.035005,42.002062],[-6.033457,42.00225],[-6.033093,42.002307],[-6.032915,42.002335],[-6.031708,42.002541],[-6.03079,42.002708],[-6.027927,42.003272],[-6.025667,42.003703],[-6.025025,42.003813],[-6.023709,42.00407],[-6.021295,42.00454],[-6.020903,42.00462],[-6.019908,42.004786],[-6.01879,42.004969],[-6.01742,42.00513],[-6.016985,42.005166],[-6.016034,42.005233],[-6.015337,42.005266],[-6.014607,42.005279],[-6.013075,42.005266],[-6.011157,42.005219],[-6.009255,42.005186],[-6.008088,42.005223],[-6.006923,42.005283],[-6.00614,42.005347],[-6.004965,42.005473],[-6.004183,42.005585],[-6.003012,42.005793],[-6.001848,42.006043],[-6.001075,42.006233],[-5.999916,42.006573],[-5.998826,42.006937],[-5.99693,42.007587],[-5.994901,42.008281],[-5.99343,42.008705],[-5.991979,42.009095],[-5.991739,42.009152],[-5.990768,42.009377],[-5.989355,42.009642],[-5.988638,42.009775],[-5.987307,42.009978],[-5.985348,42.010196],[-5.984339,42.010287],[-5.983589,42.010332],[-5.982488,42.010384],[-5.977317,42.010535],[-5.976348,42.01058],[-5.975372,42.010627],[-5.973375,42.010808],[-5.972362,42.010918],[-5.971052,42.011093],[-5.969453,42.01134],[-5.955586,42.013703],[-5.953042,42.014086],[-5.950874,42.014318],[-5.949528,42.014432],[-5.948026,42.014494],[-5.947244,42.014539],[-5.946289,42.014567],[-5.944963,42.014573],[-5.943378,42.014553],[-5.910612,42.014051],[-5.909764,42.014043],[-5.908528,42.014067],[-5.907294,42.014114],[-5.906105,42.014192],[-5.905262,42.014248],[-5.903655,42.014392],[-5.901282,42.014637],[-5.899326,42.014827],[-5.898456,42.014896],[-5.897564,42.014942],[-5.896457,42.014986],[-5.895707,42.014997],[-5.89481,42.014999],[-5.894118,42.014988],[-5.893402,42.014964],[-5.892547,42.014925],[-5.891496,42.014853],[-5.890473,42.014766],[-5.889242,42.014624],[-5.888073,42.014484],[-5.886204,42.014225],[-5.88147,42.013592],[-5.88022,42.013451],[-5.879237,42.013368],[-5.87836,42.013322],[-5.877097,42.013294],[-5.875887,42.013312],[-5.875067,42.013353],[-5.873864,42.013448],[-5.872114,42.013662],[-5.870936,42.013862],[-5.869697,42.01413],[-5.868855,42.014338],[-5.868027,42.014573],[-5.86689,42.014929],[-5.866145,42.015187],[-5.85692,42.018606],[-5.855097,42.019288],[-5.85415,42.019635],[-5.852476,42.020262],[-5.850882,42.020852],[-5.849352,42.02142],[-5.848889,42.021593],[-5.848444,42.02176],[-5.847124,42.022246],[-5.845519,42.022844],[-5.845258,42.02294],[-5.844175,42.023353],[-5.842728,42.023902],[-5.840338,42.024784],[-5.839253,42.025181],[-5.837153,42.025958],[-5.836509,42.026168],[-5.835821,42.026375],[-5.835096,42.026557],[-5.834443,42.026713],[-5.833719,42.02686],[-5.833016,42.026975],[-5.832298,42.02707],[-5.831725,42.02713],[-5.831151,42.027178],[-5.830522,42.027214],[-5.830035,42.027231],[-5.829562,42.027237],[-5.829053,42.027236],[-5.828238,42.027203],[-5.827356,42.027147],[-5.826493,42.027066],[-5.824564,42.026861],[-5.82164,42.026555],[-5.816076,42.025974],[-5.813581,42.025718],[-5.813004,42.025664],[-5.812214,42.025603],[-5.811777,42.025581],[-5.81092,42.025562],[-5.810151,42.025573],[-5.809397,42.025598],[-5.808507,42.025663],[-5.80769,42.025745],[-5.806883,42.025871],[-5.805866,42.026063],[-5.804942,42.026272],[-5.804277,42.026458],[-5.803661,42.026642],[-5.802915,42.026891],[-5.802346,42.027101],[-5.801671,42.027378],[-5.800913,42.027722],[-5.799072,42.028631],[-5.797582,42.029385],[-5.796045,42.030155],[-5.793463,42.031459],[-5.790101,42.03315],[-5.789088,42.033653],[-5.788535,42.033899],[-5.787352,42.034395],[-5.786398,42.034749],[-5.78558,42.035019],[-5.784758,42.035265],[-5.783998,42.035478],[-5.78309,42.035694],[-5.781823,42.035951],[-5.780978,42.03609],[-5.780105,42.036214],[-5.779323,42.036302],[-5.778626,42.036363],[-5.777478,42.036439],[-5.775471,42.036552],[-5.774494,42.036613],[-5.773443,42.036693],[-5.772052,42.036849],[-5.771195,42.03698],[-5.77049,42.037118],[-5.769918,42.037235],[-5.769115,42.037418],[-5.767908,42.037733],[-5.767117,42.037968],[-5.766383,42.038211],[-5.765642,42.038468],[-5.764864,42.038776],[-5.764167,42.039067],[-5.762131,42.039965],[-5.760838,42.040521],[-5.759921,42.040877],[-5.759168,42.041153],[-5.758011,42.041513],[-5.7572,42.041734],[-5.756445,42.041917],[-5.755748,42.042078],[-5.754957,42.042232],[-5.754128,42.042373],[-5.752966,42.04254],[-5.752384,42.04259],[-5.751571,42.042666],[-5.75071,42.042724],[-5.750009,42.042739],[-5.749447,42.042755],[-5.748571,42.042748],[-5.747317,42.042698],[-5.745451,42.042571],[-5.744495,42.042502],[-5.743553,42.042445],[-5.742726,42.042414],[-5.741566,42.042403],[-5.740919,42.042419],[-5.740458,42.042425],[-5.739565,42.042482],[-5.738677,42.042583],[-5.73771,42.042709],[-5.736773,42.042863],[-5.735952,42.043022],[-5.73505,42.043224],[-5.733424,42.043616],[-5.732313,42.043886],[-5.731052,42.044164],[-5.730632,42.04424],[-5.729928,42.044369],[-5.729177,42.044496],[-5.728379,42.044604],[-5.727367,42.044727],[-5.726653,42.044787],[-5.72575,42.044864],[-5.724769,42.04491],[-5.723611,42.044942],[-5.722492,42.044951],[-5.722272,42.044952],[-5.720852,42.044965],[-5.719991,42.04497],[-5.719125,42.044984],[-5.718531,42.045],[-5.717822,42.04505],[-5.716776,42.045125],[-5.715849,42.045201],[-5.714995,42.045319],[-5.713914,42.045486],[-5.712926,42.045656],[-5.711693,42.045901],[-5.710496,42.046188],[-5.708977,42.046602],[-5.707367,42.047123],[-5.706643,42.047397],[-5.705521,42.047824],[-5.701748,42.04933],[-5.699069,42.0504],[-5.695856,42.05169],[-5.69397,42.052442],[-5.692723,42.052933],[-5.690892,42.053674],[-5.690026,42.054021],[-5.688925,42.054462],[-5.687228,42.055136],[-5.684572,42.056203],[-5.682928,42.056862],[-5.682059,42.057206],[-5.680765,42.057723],[-5.679055,42.058411],[-5.676459,42.059449],[-5.673808,42.060506],[-5.672566,42.061031],[-5.671688,42.061438],[-5.671588,42.061484],[-5.671465,42.061541],[-5.670927,42.061793],[-5.670378,42.062077],[-5.669874,42.06235],[-5.669283,42.062676],[-5.668478,42.063191],[-5.667697,42.063719],[-5.666802,42.064359],[-5.666422,42.064684],[-5.666181,42.064889],[-5.665849,42.065155],[-5.665017,42.065921],[-5.664176,42.066793],[-5.663456,42.067659],[-5.662768,42.068519],[-5.660829,42.071225],[-5.658871,42.073903],[-5.657696,42.075592],[-5.657103,42.076541],[-5.656401,42.077817],[-5.656002,42.078686],[-5.655654,42.079551],[-5.655313,42.080746],[-5.655119,42.08158],[-5.655014,42.082317],[-5.654877,42.083559],[-5.654962,42.085619],[-5.655134,42.086704],[-5.655404,42.087929],[-5.655744,42.089186],[-5.656405,42.091383],[-5.65706,42.093542],[-5.658365,42.097898],[-5.658918,42.099615],[-5.659378,42.101363],[-5.659661,42.102554],[-5.660004,42.104534],[-5.660088,42.105582],[-5.660099,42.106623],[-5.66003,42.107654],[-5.659798,42.109406],[-5.659594,42.110274],[-5.65946,42.11078],[-5.659223,42.111532],[-5.658743,42.112755],[-5.658374,42.113595],[-5.657481,42.115244],[-5.65694,42.116078],[-5.656586,42.116613],[-5.656056,42.11741],[-5.655387,42.118307],[-5.652412,42.122269],[-5.649421,42.126252],[-5.647387,42.129021],[-5.646261,42.130625],[-5.645748,42.131357],[-5.644478,42.133305],[-5.643199,42.13538],[-5.642317,42.136971],[-5.641027,42.13949],[-5.639884,42.142011],[-5.638719,42.145004],[-5.638032,42.147071],[-5.637617,42.148468],[-5.637162,42.150196],[-5.636745,42.15205],[-5.636643,42.152557],[-5.636405,42.153832],[-5.636193,42.155036],[-5.636041,42.15603],[-5.635783,42.158887],[-5.635603,42.161133],[-5.63556,42.162316],[-5.63538,42.165135],[-5.635282,42.166197],[-5.635117,42.167368],[-5.634899,42.168538],[-5.634633,42.169645],[-5.634537,42.169945],[-5.63448,42.170125],[-5.634049,42.171477],[-5.633543,42.172718],[-5.632762,42.174359],[-5.632169,42.175472],[-5.630951,42.177329],[-5.630067,42.1785],[-5.629183,42.179562],[-5.627715,42.181126],[-5.626616,42.182163],[-5.625785,42.182886],[-5.625578,42.183066],[-5.624225,42.184093],[-5.621938,42.185675],[-5.621011,42.18625],[-5.619084,42.187326],[-5.616583,42.18859],[-5.614028,42.189841],[-5.612083,42.190899],[-5.610992,42.191563],[-5.609579,42.192522],[-5.607935,42.193796],[-5.607008,42.194582],[-5.605383,42.196173],[-5.603771,42.198073],[-5.602978,42.199181],[-5.602137,42.20051],[-5.601262,42.202137],[-5.600326,42.204458],[-5.599992,42.205609],[-5.599502,42.208006],[-5.599425,42.208826],[-5.599375,42.210436],[-5.599422,42.21164],[-5.599511,42.212692],[-5.59991,42.216162],[-5.599957,42.217497],[-5.599923,42.218647],[-5.599843,42.219486],[-5.599683,42.220611],[-5.59939,42.221889],[-5.599013,42.223186],[-5.598575,42.224264],[-5.598155,42.22522],[-5.597577,42.226287],[-5.596927,42.227387],[-5.594316,42.231083],[-5.593674,42.232128],[-5.592945,42.233424],[-5.592473,42.234524],[-5.592061,42.235566],[-5.591726,42.236672],[-5.591383,42.23821],[-5.591306,42.238762],[-5.59116,42.240732],[-5.591177,42.242118],[-5.591241,42.243042],[-5.591465,42.244489],[-5.591693,42.245396],[-5.59199,42.246422],[-5.592168,42.246938],[-5.592982,42.249152],[-5.59336,42.250179],[-5.59364,42.251095],[-5.594009,42.252556],[-5.594301,42.254475],[-5.594357,42.256404],[-5.594275,42.25774],[-5.593992,42.259652],[-5.593735,42.260586],[-5.593297,42.26192],[-5.59256,42.263653],[-5.591284,42.266256],[-5.59037,42.268475],[-5.589949,42.269942],[-5.589555,42.272108],[-5.589452,42.273626],[-5.58946,42.274661],[-5.589555,42.275919],[-5.589718,42.276973],[-5.59045,42.280358],[-5.590694,42.281977],[-5.590791,42.283457],[-5.590771,42.284766],[-5.59061,42.286327],[-5.590229,42.288163],[-5.589809,42.28999],[-5.589477,42.291756],[-5.589358,42.292884],[-5.589322,42.294018],[-5.589317,42.294159],[-5.589381,42.295497],[-5.589488,42.296417],[-5.589638,42.29732],[-5.589855,42.298197],[-5.590166,42.29928],[-5.590704,42.300782],[-5.591328,42.302147],[-5.591966,42.30331],[-5.59252,42.30414],[-5.593241,42.305159],[-5.594074,42.306193],[-5.595719,42.307963],[-5.597705,42.30999],[-5.599523,42.311832],[-5.599714,42.312035],[-5.602627,42.315084],[-5.603888,42.316481],[-5.604935,42.317813],[-5.605751,42.318956],[-5.606403,42.320003],[-5.607158,42.321418],[-5.607314,42.321727],[-5.607653,42.322442],[-5.607916,42.323156],[-5.608351,42.324318],[-5.608799,42.325803],[-5.608898,42.326242],[-5.609358,42.329018],[-5.60939,42.330575],[-5.609424,42.330873],[-5.60937,42.331591],[-5.609336,42.332343],[-5.60915,42.333963],[-5.608849,42.335505],[-5.608609,42.336393],[-5.608103,42.337891],[-5.607493,42.339394],[-5.606996,42.340422],[-5.605777,42.342623],[-5.604527,42.344716],[-5.60309,42.347121],[-5.601142,42.350426],[-5.599781,42.352987],[-5.598867,42.354784],[-5.597868,42.356974],[-5.597065,42.35897],[-5.596421,42.36086],[-5.595812,42.36294],[-5.595331,42.365007],[-5.59485,42.367772],[-5.594519,42.371247],[-5.594471,42.373885],[-5.59455,42.375958],[-5.594653,42.378076],[-5.595013,42.381728],[-5.595537,42.386432],[-5.59576,42.388664],[-5.595837,42.389862],[-5.595872,42.390629],[-5.595863,42.39222],[-5.595803,42.39345],[-5.595623,42.395079],[-5.595422,42.396233],[-5.595262,42.397152],[-5.594799,42.398901],[-5.594224,42.40067],[-5.593717,42.401905],[-5.593358,42.40263],[-5.592627,42.404105],[-5.59176,42.405695],[-5.590112,42.408402],[-5.589486,42.409416],[-5.588267,42.411412],[-5.587501,42.412747],[-5.586912,42.413974],[-5.5864,42.415223],[-5.586044,42.416285],[-5.585589,42.418249],[-5.5854,42.419751],[-5.585349,42.420885],[-5.585392,42.422608],[-5.585807,42.426756],[-5.585812,42.426809],[-5.585984,42.428824],[-5.586062,42.430569],[-5.586056,42.431269],[-5.586014,42.431996],[-5.585962,42.432774],[-5.585864,42.433486],[-5.585787,42.434039],[-5.585603,42.435039],[-5.585383,42.435973],[-5.585131,42.436881],[-5.584729,42.438075],[-5.584311,42.439222],[-5.584163,42.439638],[-5.582866,42.442916],[-5.582721,42.443279],[-5.581744,42.446167],[-5.581298,42.447713],[-5.580868,42.450005],[-5.580696,42.451497],[-5.580611,42.45283],[-5.580637,42.454565],[-5.580723,42.455774],[-5.58086,42.456857],[-5.58116,42.458409],[-5.581574,42.460066],[-5.582559,42.462784],[-5.58292,42.463601],[-5.583787,42.465349],[-5.584419,42.46639],[-5.585692,42.468318],[-5.587246,42.470306],[-5.592687,42.476561],[-5.593717,42.47784],[-5.595073,42.479663],[-5.596464,42.481885],[-5.597703,42.484373],[-5.598145,42.485406],[-5.599025,42.488043],[-5.599659,42.490696],[-5.599921,42.492733],[-5.600009,42.495436],[-5.59994,42.497068],[-5.599785,42.498424],[-5.599475,42.499807],[-5.599342,42.500306],[-5.599292,42.500498],[-5.599035,42.50108],[-5.598681,42.501656],[-5.59812,42.502352],[-5.597442,42.502953],[-5.596653,42.503453],[-5.59558,42.503959],[-5.594979,42.504149],[-5.593893,42.504362],[-5.592663,42.504531],[-5.592215,42.504561],[-5.591356,42.504584],[-5.587346,42.504732],[-5.583831,42.504881],[-5.583504,42.504895],[-5.583298,42.504908],[-5.583136,42.504918],[-5.582683,42.50496],[-5.581903,42.504982],[-5.581151,42.50498],[-5.580678,42.504938],[-5.57963,42.504847],[-5.579364,42.504804],[-5.578711,42.504699],[-5.577934,42.50452],[-5.577362,42.504357],[-5.576895,42.504209],[-5.576499,42.504058],[-5.576002,42.503859],[-5.574692,42.50331],[-5.572848,42.50252],[-5.572251,42.502255],[-5.570954,42.50165],[-5.570547,42.50145],[-5.569675,42.500996],[-5.567754,42.499891],[-5.566603,42.499125],[-5.565683,42.498457],[-5.564573,42.497569],[-5.563545,42.496643],[-5.562895,42.49601],[-5.562221,42.495319],[-5.56088,42.493793],[-5.55972,42.492391],[-5.55808,42.490404],[-5.557265,42.489404],[-5.556379,42.488319],[-5.555673,42.487427],[-5.555094,42.486638],[-5.554664,42.486024],[-5.55415,42.48525],[-5.553634,42.484366],[-5.553143,42.483472],[-5.552699,42.4826],[-5.55233,42.481733],[-5.552015,42.481015],[-5.551738,42.480239],[-5.551354,42.478971],[-5.55069,42.476605],[-5.550347,42.475212],[-5.549755,42.473237],[-5.549025,42.471376],[-5.548176,42.469774],[-5.54718,42.468426],[-5.54627,42.467413],[-5.545094,42.466368],[-5.544227,42.465684],[-5.543335,42.46507],[-5.542356,42.464475],[-5.541026,42.463778],[-5.539653,42.463164],[-5.538674,42.462772],[-5.536657,42.462018],[-5.533343,42.460902],[-5.529523,42.459509],[-5.52798,42.458865],[-5.525104,42.457554],[-5.524354,42.457217],[-5.520787,42.455622],[-5.51877,42.454818],[-5.516358,42.453957],[-5.514719,42.453476],[-5.512882,42.452975],[-5.511122,42.452608],[-5.509157,42.452272],[-5.505913,42.451878],[-5.50468,42.451793],[-5.503446,42.451747],[-5.501638,42.451728],[-5.500076,42.451785],[-5.498679,42.451864],[-5.496694,42.452127],[-5.494737,42.45244],[-5.493106,42.452791],[-5.491727,42.453171],[-5.490327,42.453551],[-5.489834,42.453712],[-5.487746,42.454402],[-5.487548,42.454465],[-5.484318,42.455547],[-5.481236,42.456528],[-5.480063,42.456841],[-5.478756,42.457161],[-5.477649,42.45737],[-5.475777,42.457668],[-5.473374,42.45794],[-5.472027,42.458029],[-5.469718,42.458073],[-5.466602,42.45801],[-5.463246,42.457921],[-5.459882,42.457833],[-5.456208,42.457725],[-5.451633,42.457611],[-5.449136,42.457579],[-5.447711,42.457624],[-5.446363,42.457706],[-5.445093,42.457814],[-5.443754,42.457985],[-5.442458,42.458168],[-5.440038,42.458516],[-5.438685,42.458699],[-5.437946,42.458742],[-5.435946,42.458753],[-5.43437,42.458654],[-5.432876,42.458523],[-5.430559,42.458282],[-5.428502,42.45813],[-5.426897,42.458086],[-5.425043,42.458105],[-5.423266,42.458212],[-5.421733,42.458366],[-5.420451,42.458529],[-5.417816,42.458909],[-5.416614,42.459055],[-5.415653,42.459143],[-5.414263,42.459213],[-5.412992,42.459181],[-5.412134,42.459156],[-5.410829,42.459036],[-5.409338,42.458795],[-5.408405,42.458596],[-5.408209,42.458554],[-5.407919,42.458492],[-5.406503,42.458155],[-5.404521,42.457579],[-5.402349,42.456864],[-5.400495,42.456167],[-5.398453,42.4553],[-5.397268,42.454654],[-5.396192,42.453953],[-5.395551,42.453505],[-5.393346,42.451785],[-5.391466,42.450252],[-5.390573,42.449587],[-5.388659,42.448308],[-5.387372,42.447542],[-5.38605,42.446883],[-5.384788,42.446275],[-5.383355,42.445686],[-5.382373,42.445373],[-5.381255,42.445045],[-5.381139,42.445015],[-5.379889,42.444733],[-5.379727,42.444699],[-5.379518,42.444659],[-5.379334,42.444625],[-5.378928,42.444552],[-5.378664,42.444511],[-5.378347,42.444463],[-5.37683,42.44429],[-5.375364,42.444205],[-5.373345,42.444193],[-5.372225,42.444243],[-5.369543,42.444401],[-5.368705,42.444436],[-5.367479,42.444452],[-5.366658,42.444435],[-5.365842,42.444386],[-5.365022,42.444319],[-5.364208,42.44422],[-5.363464,42.444107],[-5.362205,42.443893],[-5.36103,42.443628],[-5.359877,42.443307],[-5.359135,42.44306],[-5.358023,42.442662],[-5.357001,42.442233],[-5.355893,42.44176],[-5.353407,42.440699],[-5.351836,42.440026],[-5.340467,42.435159],[-5.337339,42.433827],[-5.335565,42.433138],[-5.334842,42.432885],[-5.333721,42.432537],[-5.332994,42.432338],[-5.332217,42.432145],[-5.331451,42.431974],[-5.33023,42.431748],[-5.329444,42.431626],[-5.328663,42.431524],[-5.327848,42.431432],[-5.327032,42.431374],[-5.326193,42.431324],[-5.324988,42.431301],[-5.323244,42.431312],[-5.321565,42.431359],[-5.316094,42.431487],[-5.315569,42.431493],[-5.312704,42.431573],[-5.311806,42.431576],[-5.310804,42.431538],[-5.309979,42.431486],[-5.30934,42.431436],[-5.30864,42.431365],[-5.307582,42.431223],[-5.306143,42.430983],[-5.305599,42.43087],[-5.304748,42.430676],[-5.30375,42.430414],[-5.302322,42.429979],[-5.301197,42.429605],[-5.299791,42.429027],[-5.299097,42.428712],[-5.297724,42.428054],[-5.288214,42.423385],[-5.285917,42.422329],[-5.285239,42.422044],[-5.284186,42.421649],[-5.283096,42.421289],[-5.282351,42.421062],[-5.281594,42.420859],[-5.280824,42.420677],[-5.280046,42.420517],[-5.278469,42.420245],[-5.277276,42.420087],[-5.276472,42.420007],[-5.275667,42.419949],[-5.274459,42.419899],[-5.273858,42.419892],[-5.273656,42.41989],[-5.272052,42.419929],[-5.270457,42.42001],[-5.255297,42.420919],[-5.251262,42.421145],[-5.250056,42.421189],[-5.249259,42.4212],[-5.247677,42.421177],[-5.246894,42.421145],[-5.245732,42.42107],[-5.244177,42.42092],[-5.243406,42.420824],[-5.242252,42.420647],[-5.240724,42.420349],[-5.239204,42.419997],[-5.237701,42.419595],[-5.234687,42.418707],[-5.231661,42.417835],[-5.230147,42.417419],[-5.228242,42.416919],[-5.225528,42.416304],[-5.224332,42.416049],[-5.223141,42.415817],[-5.221633,42.415539],[-5.220938,42.415417],[-5.21993,42.415255],[-5.219174,42.415138],[-5.218526,42.415046],[-5.216553,42.414785],[-5.215272,42.414642],[-5.213929,42.414503],[-5.212922,42.41441],[-5.211669,42.414306],[-5.207996,42.414023],[-5.205941,42.413888],[-5.204851,42.413812],[-5.204271,42.413766],[-5.203708,42.413712],[-5.203051,42.413647],[-5.20232,42.413568],[-5.201687,42.413483],[-5.200767,42.413344],[-5.200084,42.413219],[-5.199033,42.41301],[-5.198233,42.412832],[-5.197687,42.412699],[-5.197043,42.412531],[-5.196459,42.412366],[-5.195893,42.41219],[-5.195238,42.411991],[-5.194761,42.411833],[-5.19394,42.41154],[-5.193303,42.4113],[-5.191491,42.410585],[-5.184535,42.407762],[-5.177525,42.404953],[-5.173833,42.403558],[-5.172748,42.403135],[-5.171656,42.40269],[-5.16773,42.401007],[-5.16079,42.398188],[-5.158935,42.397453],[-5.153318,42.395183],[-5.151402,42.394448],[-5.150217,42.39404],[-5.14915,42.39372],[-5.147275,42.3933],[-5.146398,42.393138],[-5.145503,42.393002],[-5.144588,42.392895],[-5.143205,42.392825],[-5.142279,42.392798],[-5.140966,42.392802],[-5.140279,42.392816],[-5.13959,42.392836],[-5.13808,42.392858],[-5.13727,42.392865],[-5.136457,42.392848],[-5.135248,42.392778],[-5.135033,42.392758],[-5.134771,42.392733],[-5.134047,42.392663],[-5.132872,42.392495],[-5.132097,42.392357],[-5.13133,42.3922],[-5.11549,42.388452],[-5.113877,42.388087],[-5.11226,42.387762],[-5.11104,42.387568],[-5.109413,42.387367],[-5.108598,42.38729],[-5.107776,42.387246],[-5.104123,42.387092],[-5.103313,42.387045],[-5.101295,42.38689],[-5.099673,42.386732],[-5.098055,42.386545],[-5.096437,42.38632],[-5.094418,42.385997],[-5.089168,42.385199],[-5.082503,42.384165],[-5.080695,42.383896],[-5.075964,42.38325],[-5.074795,42.383072],[-5.073629,42.382892],[-5.072418,42.382696],[-5.07024,42.382301],[-5.0699,42.382257],[-5.068131,42.381962],[-5.058765,42.380495],[-5.057195,42.380273],[-5.056408,42.380178],[-5.055618,42.380103],[-5.054827,42.38005],[-5.05403,42.380022],[-5.053235,42.380018],[-5.052438,42.380045],[-5.05184,42.380084],[-5.051242,42.380123],[-5.050448,42.380205],[-5.049272,42.380378],[-5.048497,42.380522],[-5.047732,42.38069],[-5.0466,42.380983],[-5.045895,42.381192],[-5.043234,42.381948],[-5.042434,42.382177],[-5.039205,42.383073],[-5.038098,42.383368],[-5.036975,42.383637],[-5.036212,42.383792],[-5.035442,42.383927],[-5.034678,42.384033],[-5.033203,42.384177],[-5.032467,42.384222],[-5.03136,42.38424],[-5.030806,42.384228],[-5.029888,42.38419],[-5.029165,42.384138],[-5.028448,42.384062],[-5.027387,42.383917],[-5.026015,42.383658],[-5.025025,42.383423],[-5.024387,42.38324],[-5.023466,42.382922],[-5.022837,42.382722],[-5.021758,42.382299],[-5.020412,42.381756],[-5.016545,42.380128],[-5.014808,42.379402],[-5.012633,42.378535],[-5.011885,42.378257],[-5.009978,42.377615],[-5.008063,42.377045],[-5.006528,42.37663],[-5.005375,42.376347],[-4.996171,42.374222],[-4.995427,42.374016],[-4.994083,42.3736],[-4.993032,42.373192],[-4.992342,42.372907],[-4.991673,42.372597],[-4.991028,42.372263],[-4.987712,42.370378],[-4.986593,42.369718],[-4.984708,42.368605],[-4.983425,42.367868],[-4.982581,42.367409],[-4.981784,42.367026],[-4.981273,42.366839],[-4.980433,42.366527],[-4.97907,42.36623],[-4.978198,42.366121],[-4.977023,42.366072],[-4.97253,42.366164],[-4.970519,42.366235],[-4.96656,42.366333],[-4.965212,42.366364],[-4.963257,42.366378],[-4.961441,42.366389],[-4.959799,42.366364],[-4.957704,42.366301],[-4.955449,42.366183],[-4.954989,42.366151],[-4.954275,42.366117],[-4.952851,42.365986],[-4.951002,42.365803],[-4.949481,42.36563],[-4.9475,42.365394],[-4.944626,42.365013],[-4.94146,42.364601],[-4.93776,42.364116],[-4.934925,42.363809],[-4.931932,42.363549],[-4.92844,42.363338],[-4.926415,42.363255],[-4.924255,42.363211],[-4.920692,42.363219],[-4.918003,42.36328],[-4.915646,42.363388],[-4.913364,42.363502],[-4.909497,42.363739],[-4.904808,42.364003],[-4.902,42.36419],[-4.900363,42.364323],[-4.89881,42.364472],[-4.897531,42.364618],[-4.89564,42.364895],[-4.894423,42.365074],[-4.891669,42.36551],[-4.888933,42.365946],[-4.886904,42.36626],[-4.884773,42.366553],[-4.883411,42.366717],[-4.881841,42.366879],[-4.880106,42.367022],[-4.879651,42.367046],[-4.879134,42.367076],[-4.878243,42.367111],[-4.876733,42.367153],[-4.875202,42.367153],[-4.874122,42.367131],[-4.873566,42.367113],[-4.872852,42.367085],[-4.871489,42.367006],[-4.870534,42.366936],[-4.870193,42.366905],[-4.868904,42.366781],[-4.86776,42.366657],[-4.866839,42.366527],[-4.866061,42.366412],[-4.864877,42.366225],[-4.862527,42.365778],[-4.861088,42.365472],[-4.858118,42.364767],[-4.854798,42.363924],[-4.853265,42.363534],[-4.85054,42.362842],[-4.845698,42.361667],[-4.843643,42.361193],[-4.840854,42.360611],[-4.839347,42.360309],[-4.83817,42.360098],[-4.836473,42.359805],[-4.833786,42.35938],[-4.832978,42.359248],[-4.830185,42.358923],[-4.828562,42.358755],[-4.826528,42.358561],[-4.82404,42.35837],[-4.822021,42.358265],[-4.82039,42.358198],[-4.818328,42.358142],[-4.817206,42.358109],[-4.81674,42.358095],[-4.81619,42.358096],[-4.814573,42.358098],[-4.812369,42.358098],[-4.810109,42.358118],[-4.807909,42.358155],[-4.80435,42.358212],[-4.801975,42.358255],[-4.799202,42.358287],[-4.796577,42.358297],[-4.795052,42.358268],[-4.7927,42.358215],[-4.790333,42.358118],[-4.786717,42.357878],[-4.785117,42.357743],[-4.783535,42.357582],[-4.781192,42.357302],[-4.778482,42.356925],[-4.776592,42.356628],[-4.7747,42.356292],[-4.772837,42.355937],[-4.771358,42.355635],[-4.76837,42.354983],[-4.760589,42.353158],[-4.75751,42.352456],[-4.756351,42.3522],[-4.753033,42.351522],[-4.751014,42.351171],[-4.74815,42.350713],[-4.745508,42.350352],[-4.743228,42.35011],[-4.742082,42.349983],[-4.740303,42.349838],[-4.738572,42.34969],[-4.734971,42.349448],[-4.731033,42.349207],[-4.727417,42.348966],[-4.724265,42.348675],[-4.722672,42.348493],[-4.719452,42.348072],[-4.710095,42.346735],[-4.70805,42.346463],[-4.705618,42.346163],[-4.703995,42.345982],[-4.701123,42.345717],[-4.698677,42.345503],[-4.69703,42.345403],[-4.695375,42.345322],[-4.692875,42.34524],[-4.690793,42.345215],[-4.688712,42.345225],[-4.686213,42.345282],[-4.684133,42.345372],[-4.682065,42.345492],[-4.68042,42.34561],[-4.679262,42.345713],[-4.677582,42.345867],[-4.675588,42.346083],[-4.672833,42.346413],[-4.668533,42.346997],[-4.666731,42.347259],[-4.666145,42.347352],[-4.663077,42.347806],[-4.658658,42.348445],[-4.65469,42.348972],[-4.653095,42.349155],[-4.649892,42.349477],[-4.648285,42.349605],[-4.646678,42.349713],[-4.644278,42.34983],[-4.642187,42.349881],[-4.639601,42.349928],[-4.639288,42.349933],[-4.639076,42.349933],[-4.638687,42.349931],[-4.638249,42.349926],[-4.635038,42.349885],[-4.627768,42.349633],[-4.624682,42.349537],[-4.622468,42.349521],[-4.619729,42.349472],[-4.613979,42.349758],[-4.611896,42.349916],[-4.609802,42.350137],[-4.605703,42.350714],[-4.596441,42.352324],[-4.594617,42.352607],[-4.592806,42.352826],[-4.590346,42.353051],[-4.587781,42.353217],[-4.584579,42.35345],[-4.582905,42.353599],[-4.581606,42.353758],[-4.580022,42.353995],[-4.57842,42.354274],[-4.576516,42.354709],[-4.575548,42.354968],[-4.574559,42.355254],[-4.573559,42.355562],[-4.572602,42.355868],[-4.571556,42.356249],[-4.569628,42.357025],[-4.568397,42.357578],[-4.567201,42.358153],[-4.566852,42.358312],[-4.564278,42.359489],[-4.559541,42.361731],[-4.558632,42.362188],[-4.556455,42.363229],[-4.554316,42.364157],[-4.552841,42.364789],[-4.550418,42.365717],[-4.54742,42.366802],[-4.545433,42.36748],[-4.543749,42.367996],[-4.541688,42.368573],[-4.540007,42.369014],[-4.538209,42.369455],[-4.535331,42.370145],[-4.530587,42.371279],[-4.529085,42.3717],[-4.528766,42.371776],[-4.526696,42.372341],[-4.524169,42.373079],[-4.520972,42.374084],[-4.51901,42.374735],[-4.515458,42.376024],[-4.51253,42.377148],[-4.509465,42.378434],[-4.506133,42.379836],[-4.502681,42.381267],[-4.501577,42.381684],[-4.499007,42.382624],[-4.496823,42.383267],[-4.495219,42.383678],[-4.488976,42.38519],[-4.486517,42.385877],[-4.484237,42.386567],[-4.481605,42.387466],[-4.479262,42.388332],[-4.476616,42.389368],[-4.476204,42.389527],[-4.474931,42.38997],[-4.474355,42.39017],[-4.473242,42.390533],[-4.472413,42.390772],[-4.471457,42.391041],[-4.470359,42.391308],[-4.469221,42.39157],[-4.468162,42.391769],[-4.467614,42.391887],[-4.466669,42.392033],[-4.466318,42.392085],[-4.466039,42.392121],[-4.464711,42.3923],[-4.463717,42.392444],[-4.461065,42.392616],[-4.457537,42.392666],[-4.452652,42.392467],[-4.449735,42.392413],[-4.446439,42.392552],[-4.444565,42.392727],[-4.442525,42.393002],[-4.440395,42.393368],[-4.438526,42.39377],[-4.436031,42.394343],[-4.431874,42.395306],[-4.423833,42.39716],[-4.417446,42.398593],[-4.415849,42.398878],[-4.410304,42.399512],[-4.408337,42.399689],[-4.405364,42.399989],[-4.403903,42.400161],[-4.400111,42.40087],[-4.396975,42.401692],[-4.393274,42.40282],[-4.391475,42.403363],[-4.389662,42.403838],[-4.389099,42.40396],[-4.38775,42.404208],[-4.387189,42.404304],[-4.386425,42.40442],[-4.385362,42.404538],[-4.38362,42.404677],[-4.38229,42.404715],[-4.381166,42.404717],[-4.37967,42.404662],[-4.377106,42.404469],[-4.376633,42.40443],[-4.371834,42.403982],[-4.369584,42.403778],[-4.366101,42.403453],[-4.36575,42.403422],[-4.365361,42.403391],[-4.361611,42.403036],[-4.360875,42.40297],[-4.359591,42.402863],[-4.357971,42.402714],[-4.356191,42.402558],[-4.355647,42.402513],[-4.355067,42.402451],[-4.353777,42.402326],[-4.352947,42.402236],[-4.351423,42.402061],[-4.350343,42.401934],[-4.348827,42.401752],[-4.347689,42.401608],[-4.346218,42.401442],[-4.345363,42.401345],[-4.344339,42.401246],[-4.343304,42.401161],[-4.342442,42.40109],[-4.341108,42.400994],[-4.340149,42.400933],[-4.338807,42.400869],[-4.337399,42.400808],[-4.336495,42.400784],[-4.334856,42.400763],[-4.333708,42.400753],[-4.331889,42.400769],[-4.33051,42.400799],[-4.330318,42.400805],[-4.32961,42.400828],[-4.328804,42.400863],[-4.328113,42.400892],[-4.327115,42.400943],[-4.326464,42.400987],[-4.325713,42.401028],[-4.325241,42.401065],[-4.324799,42.401098],[-4.323512,42.401209],[-4.321956,42.401357],[-4.321074,42.401454],[-4.320625,42.401503],[-4.319976,42.401582],[-4.319346,42.401659],[-4.318693,42.401741],[-4.318069,42.401828],[-4.317031,42.401976],[-4.315985,42.402137],[-4.31514,42.402269],[-4.314319,42.402409],[-4.313136,42.402617],[-4.312011,42.40281],[-4.310941,42.402993],[-4.309694,42.403211],[-4.308559,42.403405],[-4.308258,42.403456],[-4.307803,42.403534],[-4.306958,42.403681],[-4.306357,42.403784],[-4.305517,42.403942],[-4.304699,42.404101],[-4.304062,42.404234],[-4.303288,42.404402],[-4.302636,42.404552],[-4.301829,42.404743],[-4.301217,42.404895],[-4.300587,42.405056],[-4.299781,42.40527],[-4.298971,42.405498],[-4.298184,42.405719],[-4.297571,42.405893],[-4.297316,42.40596],[-4.296283,42.406244],[-4.295132,42.40655],[-4.294333,42.406748],[-4.293314,42.406991],[-4.292657,42.407137],[-4.292043,42.407264],[-4.291433,42.407387],[-4.290839,42.407498],[-4.289753,42.407684],[-4.288795,42.407832],[-4.287928,42.407946],[-4.287244,42.408029],[-4.286642,42.408097],[-4.286156,42.408147],[-4.285382,42.408212],[-4.284316,42.40829],[-4.28347,42.408334],[-4.282761,42.408365],[-4.282161,42.408387],[-4.281655,42.408398],[-4.280932,42.408411],[-4.280311,42.408419],[-4.279231,42.408423],[-4.278193,42.408425],[-4.277363,42.408427],[-4.277035,42.408425],[-4.276856,42.408425],[-4.275858,42.408422],[-4.275036,42.408428],[-4.27419,42.40844],[-4.273758,42.408452],[-4.273119,42.408474],[-4.272505,42.408501],[-4.271874,42.408543],[-4.271236,42.408591],[-4.2704,42.408671],[-4.269763,42.408743],[-4.269117,42.408831],[-4.268556,42.408918],[-4.267898,42.409024],[-4.267474,42.409097],[-4.267012,42.409183],[-4.266208,42.409344],[-4.265755,42.409447],[-4.265165,42.409584],[-4.264346,42.409791],[-4.263481,42.410015],[-4.26173,42.410492],[-4.261054,42.410676],[-4.260255,42.410892],[-4.259724,42.411029],[-4.259223,42.411154],[-4.258592,42.411299],[-4.257959,42.411437],[-4.257136,42.411604],[-4.256694,42.411678],[-4.25626,42.411753],[-4.255665,42.411842],[-4.255202,42.411903],[-4.254651,42.411971],[-4.254231,42.412015],[-4.253703,42.412061],[-4.253063,42.412106],[-4.252537,42.412138],[-4.251997,42.412164],[-4.25152,42.412177],[-4.250848,42.412185],[-4.249987,42.412181],[-4.24952,42.412163],[-4.24927,42.412151],[-4.248669,42.412125],[-4.247885,42.412072],[-4.247401,42.412032],[-4.247044,42.411996],[-4.246598,42.411947],[-4.245971,42.411871],[-4.245378,42.411779],[-4.244791,42.411685],[-4.244196,42.411584],[-4.243763,42.411497],[-4.242934,42.411324],[-4.242158,42.411136],[-4.241746,42.411029],[-4.241364,42.410924],[-4.240749,42.410744],[-4.240132,42.410559],[-4.239594,42.410377],[-4.239152,42.410222],[-4.238418,42.40995],[-4.237856,42.409726],[-4.237504,42.409581],[-4.236975,42.409348],[-4.236387,42.40908],[-4.235872,42.408832],[-4.235348,42.408572],[-4.234495,42.408134],[-4.233953,42.407849],[-4.233357,42.407539],[-4.233183,42.407445],[-4.232745,42.407217],[-4.232258,42.406962],[-4.231709,42.406683],[-4.2312,42.406424],[-4.230825,42.406237],[-4.230467,42.406059],[-4.230098,42.405883],[-4.229758,42.405722],[-4.229413,42.405559],[-4.229031,42.405386],[-4.228684,42.405232],[-4.228408,42.405111],[-4.228096,42.40498],[-4.227746,42.404835],[-4.227369,42.404687],[-4.227008,42.404543],[-4.226687,42.404417],[-4.226312,42.404285],[-4.225939,42.404152],[-4.225517,42.404001],[-4.225099,42.403862],[-4.224715,42.403736],[-4.222883,42.403173],[-4.221549,42.402839],[-4.221099,42.402727],[-4.220107,42.40251],[-4.219512,42.402392],[-4.218911,42.402277],[-4.218483,42.402201],[-4.217869,42.402098],[-4.217252,42.402003],[-4.216624,42.401916],[-4.215998,42.401836],[-4.21539,42.401769],[-4.214753,42.401708],[-4.214133,42.401651],[-4.213494,42.401597],[-4.213058,42.401567],[-4.212426,42.401538],[-4.211776,42.401511],[-4.210959,42.40149],[-4.21055,42.401484],[-4.209909,42.401479],[-4.20926,42.40149],[-4.208613,42.401506],[-4.208,42.401526],[-4.207785,42.401538],[-4.206928,42.401586],[-4.206298,42.401628],[-4.205876,42.401664],[-4.205452,42.401705],[-4.204826,42.401767],[-4.204527,42.401802],[-4.204196,42.40184],[-4.203582,42.401917],[-4.203077,42.401983],[-4.202594,42.402048],[-4.202085,42.402126],[-4.20168,42.402184],[-4.201247,42.402259],[-4.200707,42.402343],[-4.199769,42.40249],[-4.198805,42.402649],[-4.197942,42.402791],[-4.197014,42.402938],[-4.195923,42.4031],[-4.194854,42.403252],[-4.194033,42.403362],[-4.193194,42.403463],[-4.192334,42.403552],[-4.191912,42.403591],[-4.191485,42.403624],[-4.191059,42.40366],[-4.190409,42.403702],[-4.189774,42.403738],[-4.188934,42.403776],[-4.188273,42.403795],[-4.187199,42.403813],[-4.186615,42.403812],[-4.185734,42.403803],[-4.185091,42.403782],[-4.184448,42.40376],[-4.183881,42.403727],[-4.183621,42.403715],[-4.183184,42.403691],[-4.182535,42.403644],[-4.181896,42.403592],[-4.181272,42.403534],[-4.180455,42.403446],[-4.179581,42.403339],[-4.178763,42.403229],[-4.177915,42.4031],[-4.177391,42.403019],[-4.176619,42.402888],[-4.175807,42.40274],[-4.175013,42.402592],[-4.17396,42.402395],[-4.173458,42.402301],[-4.172715,42.402158],[-4.172096,42.402039],[-4.171469,42.401922],[-4.170854,42.401811],[-4.170392,42.401728],[-4.169696,42.401613],[-4.168809,42.401469],[-4.167906,42.401329],[-4.167276,42.401241],[-4.166709,42.401158],[-4.166122,42.401075],[-4.16562,42.401007],[-4.165034,42.400936],[-4.164329,42.400847],[-4.163713,42.400779],[-4.16308,42.400704],[-4.162206,42.400615],[-4.161835,42.400577],[-4.161218,42.400513],[-4.160513,42.400451],[-4.159869,42.400393],[-4.15944,42.40036],[-4.158786,42.400305],[-4.158135,42.400267],[-4.157738,42.400236],[-4.157317,42.400211],[-4.156878,42.400185],[-4.156464,42.400161],[-4.155917,42.400133],[-4.155295,42.400103],[-4.15474,42.400078],[-4.154152,42.400056],[-4.153588,42.400038],[-4.152607,42.400012],[-4.151775,42.399995],[-4.151149,42.399986],[-4.150543,42.399978],[-4.149924,42.399977],[-4.149455,42.399977],[-4.148674,42.39998],[-4.148006,42.399987],[-4.147255,42.4],[-4.146391,42.400022],[-4.145572,42.400041],[-4.144945,42.400053],[-4.144139,42.400062],[-4.143502,42.400064],[-4.142686,42.400061],[-4.141904,42.400056],[-4.140414,42.400024],[-4.139661,42.400001],[-4.138981,42.399977],[-4.138131,42.399942],[-4.137498,42.39991],[-4.136898,42.399876],[-4.136343,42.399844],[-4.135606,42.399795],[-4.135053,42.399756],[-4.134406,42.399712],[-4.133813,42.39966],[-4.133211,42.399608],[-4.132617,42.399555],[-4.13197,42.399489],[-4.131387,42.399428],[-4.130755,42.399363],[-4.130161,42.399293],[-4.129742,42.399242],[-4.129331,42.399191],[-4.128734,42.399114],[-4.12809,42.399029],[-4.127492,42.398946],[-4.126897,42.39886],[-4.126073,42.398737],[-4.125304,42.398612],[-4.124617,42.3985],[-4.123936,42.398385],[-4.123347,42.398278],[-4.122888,42.398193],[-4.121849,42.398],[-4.121137,42.397855],[-4.120432,42.397712],[-4.1198,42.397581],[-4.119013,42.397408],[-4.118291,42.397245],[-4.117427,42.397044],[-4.116726,42.396885],[-4.115991,42.396713],[-4.114997,42.39648],[-4.114172,42.396291],[-4.113074,42.39604],[-4.111961,42.395777],[-4.110786,42.395504],[-4.109471,42.395204],[-4.108627,42.395011],[-4.107885,42.394842],[-4.107421,42.394743],[-4.106923,42.394636],[-4.106073,42.394464],[-4.105404,42.394328],[-4.104901,42.394235],[-4.104288,42.394127],[-4.103493,42.394],[-4.102146,42.393799],[-4.101241,42.393681],[-4.100789,42.393627],[-4.10005,42.393548],[-4.09955,42.393502],[-4.098935,42.393447],[-4.098245,42.39339],[-4.097679,42.393348],[-4.097081,42.393313],[-4.096464,42.393278],[-4.095837,42.393252],[-4.095233,42.393231],[-4.094606,42.393216],[-4.093791,42.393206],[-4.092968,42.393204],[-4.09211,42.393212],[-4.091607,42.393222],[-4.090892,42.393249],[-4.089973,42.393286],[-4.089458,42.393316],[-4.088897,42.393352],[-4.087744,42.393443],[-4.087207,42.393488],[-4.086775,42.393529],[-4.086196,42.393588],[-4.085343,42.39368],[-4.084472,42.39378],[-4.083317,42.393921],[-4.082881,42.393976],[-4.082104,42.394071],[-4.081076,42.394199],[-4.080218,42.394306],[-4.079642,42.394375],[-4.079009,42.394456],[-4.077994,42.394581],[-4.076961,42.39471],[-4.076354,42.394783],[-4.075806,42.394849],[-4.075213,42.394924],[-4.074933,42.394958],[-4.074475,42.395014],[-4.074113,42.395059],[-4.072915,42.395209],[-4.072138,42.395305],[-4.071056,42.395438],[-4.070481,42.395509],[-4.069789,42.395595],[-4.069088,42.395682],[-4.068421,42.395761],[-4.067706,42.395853],[-4.066614,42.395986],[-4.065796,42.396089],[-4.065004,42.396188],[-4.063961,42.396315],[-4.063054,42.396426],[-4.062525,42.396489],[-4.06134,42.396636],[-4.060212,42.396777],[-4.059726,42.396842],[-4.059193,42.396913],[-4.058634,42.396997],[-4.058185,42.397067],[-4.057629,42.397155],[-4.057027,42.397253],[-4.056436,42.397361],[-4.055817,42.397476],[-4.055253,42.397582],[-4.054641,42.397704],[-4.054003,42.397839],[-4.053264,42.397996],[-4.052898,42.398078],[-4.052483,42.398175],[-4.051745,42.39835],[-4.051077,42.398515],[-4.050392,42.398689],[-4.049766,42.398855],[-4.049328,42.398977],[-4.048938,42.399089],[-4.04835,42.399257],[-4.047622,42.399477],[-4.046925,42.399687],[-4.046255,42.399904],[-4.045634,42.400112],[-4.04513,42.400281],[-4.044731,42.40041],[-4.044398,42.400509],[-4.044092,42.400603],[-4.043761,42.400689],[-4.04324,42.400824],[-4.04278,42.400922],[-4.042171,42.401034],[-4.041759,42.401103],[-4.04116,42.401179],[-4.040768,42.401222],[-4.040342,42.40126],[-4.039932,42.401285],[-4.039525,42.401301],[-4.039282,42.401308],[-4.038894,42.40131],[-4.038501,42.401306],[-4.038306,42.401303],[-4.038092,42.401295],[-4.037678,42.401271],[-4.037434,42.401253],[-4.037122,42.401231],[-4.03677,42.401192],[-4.036396,42.401147],[-4.036019,42.401094],[-4.035609,42.401026],[-4.035227,42.400958],[-4.03483,42.400875],[-4.034438,42.400783],[-4.034047,42.400685],[-4.033455,42.400519],[-4.032883,42.400335],[-4.032486,42.400191],[-4.031973,42.399995],[-4.031578,42.399827],[-4.031071,42.399602],[-4.030552,42.399356],[-4.029867,42.399022],[-4.029353,42.398774],[-4.028656,42.398437],[-4.0283,42.398269],[-4.027787,42.398018],[-4.027168,42.397721],[-4.026406,42.39735],[-4.025708,42.397013],[-4.02486,42.396604],[-4.024491,42.396428],[-4.023961,42.396173],[-4.023625,42.396022],[-4.02326,42.395866],[-4.022928,42.395729],[-4.02266,42.39562],[-4.022275,42.395473],[-4.021967,42.395366],[-4.0216,42.395247],[-4.021305,42.395151],[-4.021016,42.395065],[-4.020447,42.39491],[-4.020067,42.394813],[-4.01944,42.394667],[-4.019059,42.394593],[-4.018645,42.394516],[-4.018059,42.39442],[-4.017654,42.394365],[-4.017447,42.394341],[-4.017054,42.394297],[-4.016626,42.39426],[-4.016213,42.394231],[-4.015809,42.394207],[-4.015403,42.394191],[-4.01499,42.394184],[-4.014583,42.394182],[-4.014145,42.39419],[-4.013551,42.394214],[-4.012931,42.394248],[-4.012319,42.39429],[-4.011876,42.394319],[-4.011285,42.39436],[-4.010884,42.394388],[-4.010471,42.394412],[-4.009861,42.394437],[-4.009229,42.394455],[-4.008442,42.394457],[-4.007757,42.394446],[-4.006979,42.394415],[-4.00655,42.394389],[-4.00595,42.394345],[-4.005332,42.394289],[-4.005125,42.394265],[-4.004718,42.394217],[-4.004318,42.394166],[-4.003921,42.394108],[-4.003496,42.394042],[-4.002908,42.393942],[-4.0023,42.393825],[-4.00181,42.393723],[-4.001352,42.393618],[-4.000713,42.393461],[-4.000129,42.393303],[-3.999559,42.393138],[-3.998999,42.392964],[-3.998669,42.392858],[-3.998313,42.392743],[-3.997877,42.392591],[-3.997546,42.392475],[-3.997133,42.392324],[-3.996579,42.39212],[-3.996177,42.391967],[-3.995832,42.391834],[-3.995535,42.391718],[-3.995293,42.391623],[-3.995096,42.391546],[-3.994798,42.391427],[-3.994504,42.39131],[-3.994173,42.391178],[-3.993888,42.391068],[-3.993646,42.390975],[-3.993312,42.390845],[-3.992942,42.390704],[-3.992565,42.390562],[-3.992214,42.390435],[-3.99181,42.390292],[-3.991335,42.390129],[-3.990884,42.389982],[-3.990502,42.389862],[-3.990137,42.38975],[-3.989823,42.389658],[-3.989486,42.389558],[-3.989142,42.38946],[-3.988757,42.389355],[-3.988401,42.38926],[-3.98783,42.389116],[-3.987194,42.388963],[-3.986606,42.388832],[-3.985984,42.388701],[-3.985421,42.38859],[-3.984847,42.38848],[-3.984199,42.388361],[-3.983549,42.388246],[-3.98294,42.388142],[-3.982397,42.388049],[-3.981779,42.387941],[-3.981362,42.38787],[-3.980783,42.387765],[-3.980365,42.38769],[-3.979976,42.387619],[-3.979597,42.387543],[-3.97915,42.38745],[-3.978391,42.387293],[-3.977779,42.387154],[-3.977169,42.387003],[-3.976429,42.38681],[-3.975658,42.386596],[-3.975092,42.386429],[-3.974722,42.386315],[-3.974195,42.386145],[-3.973916,42.386054],[-3.973545,42.385929],[-3.973015,42.385743],[-3.972467,42.385546],[-3.972109,42.385413],[-3.971722,42.385258],[-3.971249,42.385073],[-3.970651,42.384832],[-3.970208,42.38465],[-3.969694,42.384438],[-3.969244,42.384249],[-3.968617,42.383984],[-3.968095,42.38377],[-3.967493,42.383527],[-3.966918,42.383295],[-3.966461,42.383118],[-3.966054,42.382964],[-3.965649,42.382811],[-3.964926,42.382556],[-3.964419,42.382383],[-3.964036,42.382262],[-3.963557,42.382109],[-3.963067,42.381964],[-3.962682,42.381852],[-3.962091,42.381688],[-3.961544,42.381545],[-3.960951,42.381395],[-3.960349,42.381249],[-3.959739,42.381116],[-3.959278,42.381021],[-3.958714,42.380911],[-3.958167,42.380809],[-3.957597,42.380708],[-3.95712,42.380623],[-3.956521,42.380539],[-3.955944,42.380461],[-3.955285,42.380381],[-3.954713,42.380317],[-3.954093,42.380255],[-3.953486,42.380201],[-3.95306,42.380169],[-3.952669,42.380141],[-3.952125,42.38011],[-3.951621,42.380085],[-3.951022,42.380065],[-3.950556,42.380055],[-3.950406,42.38005],[-3.94977,42.380043],[-3.949361,42.380039],[-3.94873,42.38004],[-3.948128,42.380043],[-3.947509,42.380046],[-3.946878,42.380056],[-3.946045,42.380063],[-3.945054,42.380066],[-3.944626,42.38006],[-3.944226,42.38005],[-3.943802,42.380034],[-3.943195,42.379998],[-3.942992,42.379982],[-3.942591,42.379943],[-3.941752,42.37984],[-3.941193,42.379754],[-3.940657,42.379653],[-3.940323,42.379582],[-3.93976,42.37945],[-3.939361,42.379345],[-3.938785,42.379174],[-3.938381,42.379042],[-3.93784,42.378853],[-3.937311,42.378645],[-3.936788,42.378428],[-3.936318,42.378218],[-3.935741,42.377948],[-3.935362,42.37777],[-3.935185,42.377682],[-3.934678,42.377437],[-3.933865,42.377038],[-3.933439,42.376836],[-3.93319,42.376712],[-3.932832,42.376544],[-3.932471,42.376374],[-3.93212,42.376219],[-3.931793,42.376077],[-3.931555,42.375988],[-3.931232,42.375862],[-3.930869,42.375733],[-3.930451,42.375616],[-3.930134,42.375523],[-3.929578,42.375365],[-3.928826,42.375184],[-3.928716,42.375162],[-3.928217,42.375059],[-3.927828,42.37499],[-3.927417,42.374926],[-3.927009,42.374874],[-3.926613,42.374822],[-3.926161,42.374781],[-3.925766,42.374753],[-3.925365,42.374731],[-3.925002,42.374717],[-3.924551,42.37471],[-3.924154,42.374714],[-3.923848,42.374718],[-3.923528,42.374731],[-3.923058,42.374754],[-3.922486,42.374801],[-3.92188,42.374866],[-3.921475,42.374922],[-3.920993,42.374987],[-3.920479,42.375068],[-3.920046,42.375142],[-3.919469,42.375244],[-3.918881,42.375355],[-3.918469,42.375431],[-3.917884,42.375536],[-3.917279,42.375646],[-3.91687,42.37571],[-3.91627,42.375807],[-3.916071,42.375831],[-3.915455,42.375917],[-3.91505,42.375963],[-3.914644,42.376004],[-3.914227,42.376038],[-3.913826,42.376063],[-3.9134,42.376078],[-3.912782,42.376087],[-3.912378,42.376082],[-3.911969,42.376071],[-3.911565,42.376053],[-3.911144,42.376023],[-3.910745,42.375986],[-3.91033,42.375937],[-3.910127,42.375913],[-3.90973,42.375855],[-3.909319,42.375786],[-3.908921,42.375718],[-3.908522,42.375633],[-3.908126,42.375541],[-3.907727,42.375441],[-3.907349,42.375337],[-3.906966,42.37522],[-3.906599,42.375104],[-3.906143,42.374947],[-3.905851,42.374839],[-3.905479,42.37469],[-3.905117,42.374541],[-3.904588,42.374311],[-3.904057,42.374067],[-3.903653,42.373873],[-3.902667,42.373391],[-3.901245,42.372683],[-3.900448,42.372295],[-3.899747,42.371958],[-3.899227,42.371717],[-3.898519,42.371389],[-3.897451,42.370929],[-3.896967,42.370732],[-3.896493,42.370545],[-3.895827,42.370298],[-3.895441,42.370159],[-3.89489,42.369973],[-3.894322,42.369794],[-3.89394,42.369681],[-3.89355,42.369572],[-3.893168,42.369463],[-3.892768,42.369357],[-3.892187,42.369214],[-3.891592,42.369084],[-3.890789,42.368919],[-3.890383,42.368842],[-3.889996,42.368775],[-3.889382,42.368675],[-3.888779,42.368591],[-3.887968,42.368493],[-3.887351,42.368433],[-3.886527,42.368365],[-3.886125,42.36834],[-3.885295,42.368303],[-3.884689,42.368288],[-3.883859,42.36828],[-3.883032,42.368296],[-3.882416,42.368317],[-3.881999,42.368339],[-3.881177,42.368395],[-3.880568,42.368446],[-3.880132,42.368492],[-3.879934,42.368514],[-3.879326,42.368583],[-3.878928,42.368633],[-3.878499,42.368691],[-3.877907,42.368778],[-3.877484,42.36884],[-3.876885,42.368932],[-3.876283,42.369027],[-3.875479,42.369165],[-3.874671,42.369307],[-3.87406,42.369415],[-3.873266,42.369551],[-3.87265,42.369661],[-3.871254,42.369909],[-3.869834,42.370158],[-3.868435,42.370408],[-3.86782,42.370514],[-3.866808,42.370697],[-3.866416,42.370761],[-3.866002,42.370834],[-3.865212,42.370961],[-3.864589,42.371056],[-3.863991,42.371138],[-3.863365,42.371215],[-3.86296,42.371259],[-3.86248,42.371303],[-3.86214,42.371332],[-3.861688,42.371361],[-3.861525,42.371369],[-3.861282,42.371381],[-3.860907,42.371394],[-3.860482,42.371398],[-3.859864,42.371399],[-3.859036,42.371371],[-3.858424,42.371334],[-3.857815,42.371276],[-3.857189,42.371206],[-3.85659,42.371121],[-3.856164,42.37105],[-3.855775,42.370978],[-3.855378,42.370902],[-3.855178,42.37086],[-3.854781,42.370771],[-3.854376,42.370673],[-3.854,42.370571],[-3.853619,42.370461],[-3.853225,42.370343],[-3.852835,42.370213],[-3.852459,42.370084],[-3.8521,42.369951],[-3.85174,42.369815],[-3.851189,42.369587],[-3.850829,42.36943],[-3.850316,42.369195],[-3.849798,42.368948],[-3.849448,42.368768],[-3.848958,42.368516],[-3.848461,42.368243],[-3.848117,42.368052],[-3.847615,42.367773],[-3.845631,42.366663],[-3.844986,42.366295],[-3.844653,42.366106],[-3.844159,42.365826],[-3.843174,42.365276],[-3.842513,42.364917],[-3.841843,42.364567],[-3.841474,42.364378],[-3.840987,42.364139],[-3.840795,42.36404],[-3.840451,42.363878],[-3.840129,42.363719],[-3.839575,42.363477],[-3.839213,42.363318],[-3.838853,42.363165],[-3.83831,42.362941],[-3.837793,42.362739],[-3.837398,42.362592],[-3.837032,42.362459],[-3.836102,42.362132],[-3.835148,42.361824],[-3.834778,42.361714],[-3.834381,42.361598],[-3.833804,42.361446],[-3.833584,42.361388],[-3.833196,42.361298],[-3.832629,42.361164],[-3.832025,42.361038],[-3.831454,42.360926],[-3.830777,42.360799],[-3.829921,42.360661],[-3.82955,42.360602],[-3.828686,42.360496],[-3.827985,42.360419],[-3.827366,42.360366],[-3.826602,42.360304],[-3.825449,42.360236],[-3.825128,42.360228],[-3.824517,42.36022],[-3.823923,42.360206],[-3.822474,42.360219],[-3.821441,42.36025],[-3.820607,42.360281],[-3.819993,42.360308],[-3.819586,42.360331],[-3.817518,42.360456],[-3.816282,42.360538],[-3.814851,42.360624],[-3.814429,42.360651],[-3.814016,42.360668],[-3.812997,42.360707],[-3.812381,42.360713],[-3.811778,42.360715],[-3.811335,42.360705],[-3.810919,42.360692],[-3.810507,42.360675],[-3.810108,42.360645],[-3.809678,42.360611],[-3.809268,42.360569],[-3.80886,42.360519],[-3.808465,42.360458],[-3.807666,42.360317],[-3.807067,42.360188],[-3.806673,42.36009],[-3.806284,42.359986],[-3.8059,42.359866],[-3.805527,42.359746],[-3.804604,42.359399],[-3.804253,42.359244],[-3.803906,42.359084],[-3.803555,42.35892],[-3.803035,42.35865],[-3.802542,42.358376],[-3.802054,42.358086],[-3.80173,42.357887],[-3.801437,42.35769],[-3.801299,42.357588],[-3.801003,42.357382],[-3.800565,42.357045],[-3.800095,42.356629],[-3.799396,42.355963],[-3.798948,42.35548],[-3.798398,42.354857],[-3.79779,42.354125],[-3.797348,42.353533],[-3.796957,42.352983],[-3.796436,42.352219],[-3.796005,42.351575],[-3.795828,42.351288],[-3.795627,42.350959],[-3.794831,42.349709],[-3.794644,42.349432],[-3.794473,42.34917],[-3.793961,42.348377],[-3.793786,42.348108],[-3.792394,42.345985],[-3.791494,42.344551],[-3.791096,42.34396],[-3.790635,42.343254],[-3.790086,42.342451],[-3.78964,42.341745],[-3.789376,42.341335],[-3.78858,42.340197],[-3.78809,42.339537],[-3.787651,42.338983],[-3.786929,42.338166],[-3.786793,42.338018],[-3.786304,42.337506],[-3.785753,42.336996],[-3.785299,42.336603],[-3.784857,42.336218],[-3.784455,42.335891],[-3.783646,42.335266],[-3.783226,42.334974],[-3.782602,42.334548],[-3.781847,42.334034],[-3.780875,42.333425],[-3.779881,42.332851],[-3.778256,42.331869],[-3.777443,42.331354],[-3.776801,42.330955],[-3.776005,42.330435],[-3.775371,42.330007],[-3.7746,42.329459],[-3.773845,42.328904],[-3.772258,42.327657],[-3.770864,42.326477],[-3.768737,42.324362],[-3.767435,42.323006],[-3.766317,42.321588],[-3.765366,42.3203],[-3.764502,42.319053],[-3.764005,42.318287],[-3.763796,42.317989],[-3.762832,42.316538],[-3.762453,42.316008],[-3.761946,42.315368],[-3.76161,42.314967],[-3.761136,42.314449],[-3.760466,42.313785],[-3.75984,42.313201],[-3.759313,42.312743],[-3.758756,42.312263],[-3.758477,42.312014],[-3.758087,42.311665],[-3.757819,42.311408],[-3.757449,42.311018],[-3.757224,42.310775],[-3.757001,42.310512],[-3.756684,42.310095],[-3.756481,42.309813],[-3.756297,42.309536],[-3.756121,42.309251],[-3.756033,42.309083],[-3.755914,42.308835],[-3.755792,42.308522],[-3.755701,42.308211],[-3.755631,42.30792],[-3.75558,42.307595],[-3.755568,42.307439],[-3.755559,42.307126],[-3.755577,42.306485],[-3.75559,42.306214],[-3.755596,42.306046],[-3.755584,42.305708],[-3.755568,42.305544],[-3.755514,42.30524],[-3.755432,42.304946],[-3.755304,42.304649],[-3.755219,42.304483],[-3.755057,42.304228],[-3.754956,42.304087],[-3.754837,42.303941],[-3.754724,42.303828],[-3.754617,42.303723],[-3.754409,42.303546],[-3.754226,42.30341],[-3.754081,42.303306],[-3.753948,42.303227],[-3.753797,42.303146],[-3.753553,42.303028],[-3.753284,42.302908],[-3.753038,42.302825],[-3.75273,42.302735],[-3.752439,42.302668],[-3.752317,42.302647],[-3.752089,42.302617],[-3.751819,42.302582],[-3.751648,42.302575],[-3.751439,42.302574],[-3.751066,42.302591],[-3.75079,42.302624],[-3.750397,42.30269],[-3.750121,42.302752],[-3.749608,42.302919],[-3.749408,42.303001],[-3.749151,42.303112],[-3.748839,42.303262],[-3.748237,42.30356],[-3.747922,42.303708],[-3.747707,42.303804],[-3.747455,42.303919],[-3.747153,42.304022],[-3.746931,42.304094],[-3.746766,42.304142],[-3.746543,42.304202],[-3.746336,42.304244],[-3.746171,42.304277],[-3.745905,42.304322],[-3.745374,42.304444],[-3.742879,42.304896],[-3.740966,42.305302],[-3.73968,42.305606],[-3.73841,42.305935],[-3.73807,42.306031],[-3.736885,42.306337],[-3.735918,42.306593],[-3.734534,42.30693],[-3.733332,42.3072],[-3.732632,42.307353],[-3.731593,42.307555],[-3.730566,42.307738],[-3.728269,42.30811],[-3.727907,42.308164],[-3.726729,42.308324],[-3.725675,42.308455],[-3.724212,42.308639],[-3.723033,42.308808],[-3.721685,42.309024],[-3.720096,42.309317],[-3.719859,42.309373],[-3.718304,42.309697],[-3.717284,42.309923],[-3.716267,42.310157],[-3.715629,42.31031],[-3.714907,42.310499],[-3.713731,42.31082],[-3.712776,42.311102],[-3.711766,42.311406],[-3.710509,42.31181],[-3.709776,42.312059],[-3.709239,42.312277],[-3.708884,42.312435],[-3.708494,42.312628],[-3.708152,42.31281],[-3.707711,42.313078],[-3.707371,42.313319],[-3.707085,42.313515],[-3.705852,42.314569],[-3.705592,42.314782],[-3.705289,42.315003],[-3.70497,42.315198],[-3.704812,42.315285],[-3.704616,42.315367],[-3.704189,42.315529],[-3.703791,42.315645],[-3.70366,42.315674],[-3.703347,42.315734],[-3.703003,42.31577],[-3.702666,42.315793],[-3.70228,42.315803],[-3.701918,42.315799],[-3.701553,42.315793],[-3.701322,42.315807],[-3.700437,42.315832],[-3.700002,42.315859],[-3.699582,42.3159],[-3.699128,42.315946],[-3.698766,42.316008],[-3.698393,42.316084],[-3.697651,42.316291],[-3.697288,42.316409],[-3.696771,42.316605],[-3.69657,42.316646],[-3.695931,42.316936],[-3.695542,42.317162],[-3.695183,42.317375],[-3.694823,42.317615],[-3.69444,42.317905],[-3.694328,42.31799],[-3.694065,42.31822],[-3.693781,42.318444],[-3.693524,42.318673],[-3.693173,42.319007],[-3.6929,42.319326],[-3.692598,42.319714],[-3.692444,42.319926],[-3.691846,42.320704],[-3.691524,42.321117],[-3.691518,42.321125],[-3.691164,42.321534],[-3.690956,42.321763],[-3.690581,42.322145],[-3.690176,42.322504],[-3.689835,42.322787],[-3.689459,42.323063],[-3.689153,42.323277],[-3.688805,42.323501],[-3.688463,42.323702],[-3.687957,42.323975],[-3.687624,42.324142],[-3.687297,42.324294],[-3.687041,42.324405],[-3.686724,42.324528],[-3.686437,42.324647],[-3.686173,42.32474],[-3.685645,42.324912],[-3.684898,42.325135],[-3.684619,42.325215],[-3.684321,42.325294],[-3.68374,42.325441],[-3.683047,42.325596],[-3.68236,42.325741],[-3.681553,42.325885],[-3.680948,42.325977],[-3.680286,42.326063],[-3.679762,42.326123],[-3.679141,42.326182],[-3.678307,42.326247],[-3.677759,42.326273],[-3.67694,42.326302],[-3.675955,42.3263],[-3.675429,42.326292],[-3.675093,42.326281],[-3.67434,42.326243],[-3.67342,42.326177],[-3.67305,42.326149],[-3.67202,42.32602],[-3.671009,42.325874],[-3.668623,42.32542],[-3.667898,42.325282],[-3.667492,42.325215],[-3.66703,42.325146],[-3.666727,42.325105],[-3.666438,42.325078],[-3.666069,42.32504],[-3.66566,42.325014],[-3.665151,42.325002],[-3.664529,42.325001],[-3.663929,42.32502],[-3.663541,42.325048],[-3.663204,42.325078],[-3.662816,42.32512],[-3.66244,42.325173],[-3.662032,42.325241],[-3.661642,42.325312],[-3.661207,42.32541],[-3.660465,42.325595],[-3.66002,42.32573],[-3.659718,42.325834],[-3.659364,42.325958],[-3.659107,42.326056],[-3.658801,42.326182],[-3.658393,42.326361],[-3.657023,42.32704],[-3.655752,42.327686],[-3.655039,42.328013],[-3.654509,42.328252],[-3.653995,42.328468],[-3.653436,42.32868],[-3.652956,42.328864],[-3.652293,42.329086],[-3.651771,42.329247],[-3.651205,42.329413],[-3.650754,42.329528],[-3.650238,42.329655],[-3.649263,42.329866],[-3.648673,42.329976],[-3.647925,42.330091],[-3.647446,42.330164],[-3.646696,42.330249],[-3.646126,42.330298],[-3.645409,42.330342],[-3.644634,42.330382],[-3.643712,42.330418],[-3.642815,42.330447],[-3.64195,42.33047],[-3.64092,42.330508],[-3.639709,42.330558],[-3.639028,42.330593],[-3.638321,42.33064],[-3.637375,42.330712],[-3.63652,42.330793],[-3.6357,42.330886],[-3.635257,42.330939],[-3.634842,42.331003],[-3.634285,42.331086],[-3.633859,42.33116],[-3.633389,42.331242],[-3.632881,42.331344],[-3.632322,42.331455],[-3.631323,42.331683],[-3.630666,42.33185],[-3.629388,42.332193],[-3.628983,42.332311],[-3.62843,42.332468],[-3.628115,42.332578],[-3.62782,42.33267],[-3.627404,42.332816],[-3.626627,42.333105],[-3.626149,42.333281],[-3.625322,42.33362],[-3.623849,42.334229],[-3.622797,42.334653],[-3.622471,42.334781],[-3.621388,42.335176],[-3.621023,42.335309],[-3.620229,42.335578],[-3.620109,42.33562],[-3.619463,42.335859],[-3.618425,42.336222],[-3.618163,42.336313],[-3.617454,42.336549],[-3.615313,42.337281],[-3.614956,42.337411],[-3.614355,42.337635],[-3.613892,42.33782],[-3.613345,42.338044],[-3.612904,42.338243],[-3.612472,42.338449],[-3.611723,42.338824],[-3.611125,42.339156],[-3.610366,42.339613],[-3.609905,42.339916],[-3.609322,42.340322],[-3.609031,42.340524],[-3.608426,42.341006],[-3.608046,42.341336],[-3.607529,42.3418],[-3.606974,42.342343],[-3.60662,42.342721],[-3.606239,42.343157],[-3.60591,42.343565],[-3.605702,42.343826],[-3.605426,42.344212],[-3.60523,42.344501],[-3.604994,42.344863],[-3.604813,42.345169],[-3.60449,42.345729],[-3.604281,42.346152],[-3.604087,42.346571],[-3.603867,42.347103],[-3.603744,42.347439],[-3.603597,42.34786],[-3.603506,42.34818],[-3.603395,42.348613],[-3.603184,42.349621],[-3.603072,42.350278],[-3.602874,42.351471],[-3.602786,42.351885],[-3.602664,42.352342],[-3.602562,42.352652],[-3.602454,42.352936],[-3.602353,42.353171],[-3.602259,42.353377],[-3.602041,42.3538],[-3.601885,42.354065],[-3.601715,42.354336],[-3.601529,42.354598],[-3.601342,42.354853],[-3.601128,42.35511],[-3.600908,42.355367],[-3.600668,42.35562],[-3.600363,42.355925],[-3.599557,42.356601],[-3.599077,42.356948],[-3.5986,42.357277],[-3.598287,42.357486],[-3.597559,42.357976],[-3.596909,42.358422],[-3.596267,42.358878],[-3.595813,42.35921],[-3.595407,42.359528],[-3.595111,42.359758],[-3.594729,42.360087],[-3.594211,42.360552],[-3.59383,42.360908],[-3.593328,42.361411],[-3.592766,42.36203],[-3.592322,42.362549],[-3.592005,42.362956],[-3.591682,42.363392],[-3.591432,42.36375],[-3.591174,42.364142],[-3.590874,42.364632],[-3.590662,42.364993],[-3.590477,42.365339],[-3.590246,42.365794],[-3.590048,42.366232],[-3.589884,42.366605],[-3.58974,42.366952],[-3.589628,42.367275],[-3.589487,42.367694],[-3.589353,42.368146],[-3.589197,42.368702],[-3.58905,42.369375],[-3.588956,42.369815],[-3.588828,42.37051],[-3.588689,42.37126],[-3.588599,42.371694],[-3.588489,42.372149],[-3.588396,42.372452],[-3.588285,42.372767],[-3.588193,42.373009],[-3.587992,42.373457],[-3.587779,42.373846],[-3.587509,42.374301],[-3.587327,42.374556],[-3.587071,42.374903],[-3.586811,42.375222],[-3.585878,42.37618],[-3.585398,42.376654],[-3.584925,42.377132],[-3.584528,42.377563],[-3.58427,42.377886],[-3.584081,42.378145],[-3.583805,42.378539],[-3.583463,42.379102],[-3.583304,42.37944],[-3.583197,42.379667],[-3.58307,42.37998],[-3.58297,42.380264],[-3.582891,42.380535],[-3.582824,42.380793],[-3.582745,42.381096],[-3.582683,42.381446],[-3.582629,42.381917],[-3.582577,42.382484],[-3.582537,42.383066],[-3.582502,42.38352],[-3.582432,42.383975],[-3.58238,42.384263],[-3.582345,42.384421],[-3.582253,42.384763],[-3.582184,42.384984],[-3.582113,42.385214],[-3.581961,42.385591],[-3.581702,42.386146],[-3.581483,42.386535],[-3.581324,42.386778],[-3.581144,42.387043],[-3.580959,42.387303],[-3.580732,42.387578],[-3.58053,42.387816],[-3.58026,42.388105],[-3.579969,42.388392],[-3.579613,42.388717],[-3.579262,42.389008],[-3.578975,42.389222],[-3.57841,42.389615],[-3.578009,42.389859],[-3.577518,42.390136],[-3.577071,42.390363],[-3.576737,42.39052],[-3.576234,42.390746],[-3.57552,42.391049],[-3.574622,42.391431],[-3.573516,42.391929],[-3.573077,42.392152],[-3.572687,42.392352],[-3.572366,42.392524],[-3.572092,42.392677],[-3.571622,42.39296],[-3.570671,42.393593],[-3.57022,42.393929],[-3.569934,42.394157],[-3.569405,42.394598],[-3.568971,42.394977],[-3.568529,42.395377],[-3.568088,42.395787],[-3.567667,42.396174],[-3.566974,42.396813],[-3.566509,42.397227],[-3.566009,42.39765],[-3.565472,42.398101],[-3.564951,42.398517],[-3.564508,42.398854],[-3.564081,42.399167],[-3.563563,42.399528],[-3.562934,42.399954],[-3.562211,42.400401],[-3.561697,42.400705],[-3.561249,42.400951],[-3.560896,42.401143],[-3.560537,42.401328],[-3.560055,42.401567],[-3.559542,42.401807],[-3.558966,42.402063],[-3.558403,42.402292],[-3.557921,42.402479],[-3.557391,42.402673],[-3.556772,42.402887],[-3.556026,42.403125],[-3.555536,42.40327],[-3.555025,42.403409],[-3.554555,42.403527],[-3.553973,42.403664],[-3.553367,42.403801],[-3.552781,42.403915],[-3.55229,42.403997],[-3.551599,42.404104],[-3.55108,42.404176],[-3.550561,42.404239],[-3.549809,42.404325],[-3.549,42.404403],[-3.548053,42.404493],[-3.547215,42.404565],[-3.5467,42.404623],[-3.546357,42.404666],[-3.545936,42.404724],[-3.545342,42.404825],[-3.544927,42.40491],[-3.544422,42.40503],[-3.544006,42.40514],[-3.543616,42.405255],[-3.543212,42.405385],[-3.542697,42.405576],[-3.542393,42.405696],[-3.541989,42.405881],[-3.541723,42.406004],[-3.541356,42.406185],[-3.540927,42.406414],[-3.540629,42.406592],[-3.540374,42.406757],[-3.539882,42.407081],[-3.539376,42.407448],[-3.538822,42.407861],[-3.538235,42.4083],[-3.537782,42.408639],[-3.537255,42.409012],[-3.536773,42.409348],[-3.536253,42.409689],[-3.535918,42.409902],[-3.535529,42.410135],[-3.535144,42.41036],[-3.534322,42.410808],[-3.533602,42.411178],[-3.532613,42.411662],[-3.530622,42.412618],[-3.529514,42.413157],[-3.528357,42.413728],[-3.527659,42.414088],[-3.52712,42.414367],[-3.526343,42.414781],[-3.525296,42.415364],[-3.524442,42.415861],[-3.523887,42.416205],[-3.52341,42.416526],[-3.522929,42.416866],[-3.52254,42.417165],[-3.522101,42.417526],[-3.521607,42.417957],[-3.521078,42.418472],[-3.520591,42.418988],[-3.520187,42.419439],[-3.519619,42.420111],[-3.519149,42.42067],[-3.518817,42.421044],[-3.518614,42.421265],[-3.518326,42.421549],[-3.517976,42.421862],[-3.517669,42.422123],[-3.517373,42.422354],[-3.517074,42.422574],[-3.516641,42.422857],[-3.516339,42.423044],[-3.515914,42.423292],[-3.515779,42.423361],[-3.515383,42.423563],[-3.514725,42.423858],[-3.51422,42.424054],[-3.513709,42.424239],[-3.513077,42.424427],[-3.512533,42.424567],[-3.512148,42.424653],[-3.511621,42.424757],[-3.510881,42.424879],[-3.509957,42.425003],[-3.508989,42.425137],[-3.508377,42.425236],[-3.507796,42.425353],[-3.507182,42.425496],[-3.506852,42.425584],[-3.50644,42.425709],[-3.505958,42.42587],[-3.505448,42.426061],[-3.504959,42.426261],[-3.504434,42.426505],[-3.504023,42.426713],[-3.503588,42.426966],[-3.503184,42.427209],[-3.50275,42.427501],[-3.50218,42.427926],[-3.501813,42.428238],[-3.501495,42.428534],[-3.501305,42.428721],[-3.501095,42.428946],[-3.500767,42.429325],[-3.500456,42.429716],[-3.500188,42.430101],[-3.499875,42.430622],[-3.499627,42.431093],[-3.499402,42.431632],[-3.499321,42.431854],[-3.499247,42.432084],[-3.49918,42.432297],[-3.499079,42.432683],[-3.498941,42.433302],[-3.498749,42.434063],[-3.498617,42.434516],[-3.498496,42.434855],[-3.498322,42.435279],[-3.498135,42.435656],[-3.49793,42.436031],[-3.497741,42.436328],[-3.497499,42.436678],[-3.497308,42.436925],[-3.49707,42.437222],[-3.496742,42.43758],[-3.496526,42.437801],[-3.496305,42.43802],[-3.495998,42.438289],[-3.49565,42.438574],[-3.495256,42.438873],[-3.494289,42.439551],[-3.492977,42.440483],[-3.492512,42.440815],[-3.492226,42.441035],[-3.491875,42.441291],[-3.49092,42.442009],[-3.490208,42.442557],[-3.489273,42.443286],[-3.488419,42.443964],[-3.487744,42.444514],[-3.487178,42.444962],[-3.486733,42.445297],[-3.486433,42.445508],[-3.486143,42.445699],[-3.485907,42.445844],[-3.485625,42.446017],[-3.485223,42.446237],[-3.484923,42.446396],[-3.484613,42.446549],[-3.484086,42.446784],[-3.483233,42.447124],[-3.482616,42.447347],[-3.481673,42.44769],[-3.48117,42.447884],[-3.480584,42.448138],[-3.48012,42.448357],[-3.479764,42.448547],[-3.479443,42.448725],[-3.479104,42.448929],[-3.478777,42.449137],[-3.478341,42.449427],[-3.477408,42.450064],[-3.476814,42.450446],[-3.476162,42.450821],[-3.475671,42.451075],[-3.475236,42.451275],[-3.474775,42.451474],[-3.474325,42.451641],[-3.473686,42.451854],[-3.473274,42.451974],[-3.472695,42.452122],[-3.472051,42.452263],[-3.471268,42.452393],[-3.470702,42.452457],[-3.470131,42.452507],[-3.469675,42.452529],[-3.469097,42.452536],[-3.46858,42.452538],[-3.467802,42.452516],[-3.466962,42.452487],[-3.465941,42.452472],[-3.465106,42.452492],[-3.46467,42.452527],[-3.464168,42.452575],[-3.463647,42.452639],[-3.46308,42.452734],[-3.462468,42.452854],[-3.461783,42.453021],[-3.461242,42.453184],[-3.460722,42.453354],[-3.460093,42.453587],[-3.459464,42.453866],[-3.458581,42.454287],[-3.457775,42.454717],[-3.457069,42.455122],[-3.456354,42.455557],[-3.455811,42.455923],[-3.455062,42.456458],[-3.454669,42.456759],[-3.454323,42.457029],[-3.453753,42.45751],[-3.453269,42.457944],[-3.452906,42.458287],[-3.452409,42.458815],[-3.452004,42.459279],[-3.451693,42.459674],[-3.451363,42.460117],[-3.451051,42.460578],[-3.450716,42.461145],[-3.450475,42.461593],[-3.45026,42.462034],[-3.450049,42.462531],[-3.449836,42.463086],[-3.449562,42.463838],[-3.449445,42.464174],[-3.44922,42.464806],[-3.449084,42.465175],[-3.448964,42.465484],[-3.44885,42.465752],[-3.448585,42.46633],[-3.448437,42.466626],[-3.448206,42.467037],[-3.44802,42.46735],[-3.447877,42.467573],[-3.447722,42.467805],[-3.447571,42.468011],[-3.447309,42.468372],[-3.446997,42.468759],[-3.446444,42.469384],[-3.445957,42.469881],[-3.445512,42.470289],[-3.445082,42.470668],[-3.444678,42.470988],[-3.444267,42.471295],[-3.443667,42.471712],[-3.443182,42.472029],[-3.442629,42.472353],[-3.442048,42.47267],[-3.441554,42.472923],[-3.441186,42.473096],[-3.440803,42.473268],[-3.44027,42.473497],[-3.439759,42.473704],[-3.439042,42.473994],[-3.438463,42.474222],[-3.437931,42.47443],[-3.437412,42.474651],[-3.436881,42.474896],[-3.436361,42.475163],[-3.435862,42.47545],[-3.435354,42.475768],[-3.435001,42.47601],[-3.434429,42.476421],[-3.433815,42.476868],[-3.433395,42.47716],[-3.433133,42.477334],[-3.432787,42.477544],[-3.432331,42.4778],[-3.431959,42.477999],[-3.431597,42.478176],[-3.431286,42.478317],[-3.430848,42.478497],[-3.430398,42.478665],[-3.42977,42.478871],[-3.429353,42.478983],[-3.428697,42.479152],[-3.42817,42.479261],[-3.42783,42.479324],[-3.42757,42.479366],[-3.42703,42.479444],[-3.426094,42.479569],[-3.425346,42.479676],[-3.424647,42.479782],[-3.424114,42.479867],[-3.423701,42.479941],[-3.423153,42.480056],[-3.4227,42.480159],[-3.422253,42.480269],[-3.421716,42.480414],[-3.421149,42.480582],[-3.420353,42.480842],[-3.419159,42.481268],[-3.417716,42.481791],[-3.41693,42.482055],[-3.416404,42.482221],[-3.415828,42.482391],[-3.415009,42.482602],[-3.414434,42.48273],[-3.414072,42.482805],[-3.41343,42.482914],[-3.412847,42.482998],[-3.412281,42.483081],[-3.411747,42.483138],[-3.411073,42.48318],[-3.410366,42.483224],[-3.409664,42.483251],[-3.408454,42.483283],[-3.407414,42.483314],[-3.405757,42.483368],[-3.404462,42.483427],[-3.403244,42.483506],[-3.402424,42.483575],[-3.401583,42.483661],[-3.400926,42.48374],[-3.400372,42.48381],[-3.399564,42.483925],[-3.398891,42.484029],[-3.398202,42.484152],[-3.397387,42.484304],[-3.396674,42.484453],[-3.39561,42.484682],[-3.394941,42.484838],[-3.394004,42.485063],[-3.392955,42.485333],[-3.391965,42.485599],[-3.391177,42.485821],[-3.390233,42.486102],[-3.389422,42.486354],[-3.388149,42.486769],[-3.386891,42.487199],[-3.385917,42.487559],[-3.385193,42.487828],[-3.384263,42.488197],[-3.383444,42.488528],[-3.382393,42.488978],[-3.381325,42.489457],[-3.380205,42.489986],[-3.379098,42.490522],[-3.378343,42.490907],[-3.37743,42.491383],[-3.376704,42.491768],[-3.375865,42.492231],[-3.374265,42.493127],[-3.372628,42.494054],[-3.371704,42.494587],[-3.370965,42.495006],[-3.370304,42.495357],[-3.369868,42.495575],[-3.369415,42.495787],[-3.368994,42.495972],[-3.368397,42.496227],[-3.367815,42.496444],[-3.3672,42.496657],[-3.36668,42.496824],[-3.366169,42.496968],[-3.365487,42.497141],[-3.36447,42.497374],[-3.363553,42.497568],[-3.362705,42.497741],[-3.361744,42.497952],[-3.361146,42.498088],[-3.360694,42.4982],[-3.36022,42.498333],[-3.359813,42.49845],[-3.359406,42.498583],[-3.358974,42.498724],[-3.35829,42.498974],[-3.357845,42.499151],[-3.357411,42.499337],[-3.357017,42.499517],[-3.356491,42.499769],[-3.355984,42.500035],[-3.355518,42.500292],[-3.355066,42.500562],[-3.354518,42.500911],[-3.354201,42.501125],[-3.35388,42.501353],[-3.353481,42.501662],[-3.353194,42.501885],[-3.352771,42.502242],[-3.352235,42.502719],[-3.351847,42.503077],[-3.351349,42.503562],[-3.35097,42.503947],[-3.35064,42.504289],[-3.350166,42.504808],[-3.34969,42.505353],[-3.349352,42.50576],[-3.348925,42.506296],[-3.348525,42.506821],[-3.34814,42.507358],[-3.347761,42.507921],[-3.347403,42.508475],[-3.347078,42.508988],[-3.346675,42.509678],[-3.346179,42.510532],[-3.345717,42.511358],[-3.345192,42.512285],[-3.344829,42.512916],[-3.344492,42.513499],[-3.344225,42.513957],[-3.343895,42.514517],[-3.34355,42.515092],[-3.343133,42.515768],[-3.342861,42.516207],[-3.342452,42.516837],[-3.342136,42.517311],[-3.341855,42.517728],[-3.341573,42.518129],[-3.341172,42.518701],[-3.340755,42.519259],[-3.340355,42.519797],[-3.339929,42.520346],[-3.339854,42.52044],[-3.339607,42.52075],[-3.339253,42.52119],[-3.338919,42.521591],[-3.338508,42.52208],[-3.337649,42.523059],[-3.336983,42.523797],[-3.336574,42.52423],[-3.33624,42.524573],[-3.335874,42.524941],[-3.335354,42.525427],[-3.334894,42.525843],[-3.334073,42.526545],[-3.333579,42.526949],[-3.332927,42.527447],[-3.332332,42.527886],[-3.331883,42.528195],[-3.331397,42.528514],[-3.330705,42.528925],[-3.330364,42.529116],[-3.329961,42.529334],[-3.329234,42.529695],[-3.328526,42.530016],[-3.327885,42.530274],[-3.327482,42.530426],[-3.32713,42.530553],[-3.326543,42.530744],[-3.326331,42.530812],[-3.325883,42.530953],[-3.325384,42.53109],[-3.325056,42.531176],[-3.323987,42.531412],[-3.323429,42.53153],[-3.322984,42.531605],[-3.322593,42.531664],[-3.322164,42.531719],[-3.321519,42.5318],[-3.32091,42.53186],[-3.320355,42.531912],[-3.320001,42.531942],[-3.318956,42.532023],[-3.318447,42.532066],[-3.317861,42.532128],[-3.317241,42.532206],[-3.316733,42.532292],[-3.316372,42.532359],[-3.316018,42.532437],[-3.315385,42.532589],[-3.314952,42.532722],[-3.314137,42.532996],[-3.313527,42.533241],[-3.312909,42.533519],[-3.312344,42.533816],[-3.311904,42.534057],[-3.31155,42.534284],[-3.311267,42.534472],[-3.310449,42.535053],[-3.309795,42.535527],[-3.308944,42.536137],[-3.308427,42.536495],[-3.307902,42.536838],[-3.307417,42.537143],[-3.306903,42.537451],[-3.306225,42.53783],[-3.305425,42.538244],[-3.304533,42.538668],[-3.303778,42.538996],[-3.302956,42.539337],[-3.302082,42.539695],[-3.300937,42.540149],[-3.299627,42.540686],[-3.298706,42.54107],[-3.297663,42.541527],[-3.296596,42.542027],[-3.296033,42.542306],[-3.295494,42.542583],[-3.29485,42.542928],[-3.294157,42.543313],[-3.293428,42.543743],[-3.292855,42.544102],[-3.292255,42.54449],[-3.291394,42.545081],[-3.290593,42.545659],[-3.289859,42.546227],[-3.289361,42.546627],[-3.288785,42.547113],[-3.288085,42.547743],[-3.287561,42.548238],[-3.287196,42.548586],[-3.286723,42.549068],[-3.286105,42.549704],[-3.285649,42.550193],[-3.285111,42.550773],[-3.284619,42.551305],[-3.284226,42.551734],[-3.283768,42.552225],[-3.283416,42.552588],[-3.283147,42.552867],[-3.282975,42.553045],[-3.282577,42.553418],[-3.282286,42.553688],[-3.281987,42.553951],[-3.281616,42.55426],[-3.281206,42.554591],[-3.280675,42.555003],[-3.280199,42.555339],[-3.279566,42.555773],[-3.27913,42.556047],[-3.278692,42.556305],[-3.278166,42.556612],[-3.277592,42.556946],[-3.27707,42.557228],[-3.276186,42.557713],[-3.275367,42.558152],[-3.274477,42.558643],[-3.27379,42.559024],[-3.273054,42.559448],[-3.272551,42.559742],[-3.271921,42.560137],[-3.271221,42.560578],[-3.270654,42.560957],[-3.270115,42.561333],[-3.269354,42.561888],[-3.268476,42.56257],[-3.267925,42.563028],[-3.267219,42.563652],[-3.266875,42.563963],[-3.266365,42.564443],[-3.265829,42.564976],[-3.265265,42.565564],[-3.264646,42.566247],[-3.26399,42.566996],[-3.263454,42.567628],[-3.262801,42.568422],[-3.262123,42.569236],[-3.261424,42.57006],[-3.260782,42.570811],[-3.260205,42.57148],[-3.259936,42.571777],[-3.259774,42.571973],[-3.25947,42.572309],[-3.2589,42.57294],[-3.258387,42.573496],[-3.258048,42.57385],[-3.257492,42.574426],[-3.256937,42.574974],[-3.25634,42.575551],[-3.255661,42.57618],[-3.255244,42.576555],[-3.2546,42.577123],[-3.254034,42.5776],[-3.253525,42.578027],[-3.252681,42.578702],[-3.252067,42.579168],[-3.251441,42.579644],[-3.250634,42.580236],[-3.249779,42.580836],[-3.249183,42.581235],[-3.248469,42.581702],[-3.247644,42.582223],[-3.246845,42.582718],[-3.246012,42.583214],[-3.245574,42.58347],[-3.244889,42.583864],[-3.24383,42.584459],[-3.243479,42.584649],[-3.242873,42.584978],[-3.240268,42.586385],[-3.238806,42.587158],[-3.237596,42.587825],[-3.236417,42.588495],[-3.235568,42.588984],[-3.234727,42.589492],[-3.233952,42.589968],[-3.233406,42.590314],[-3.232927,42.590632],[-3.232391,42.591003],[-3.231715,42.591487],[-3.231309,42.591781],[-3.230956,42.592051],[-3.230623,42.592327],[-3.229841,42.593011],[-3.229579,42.593249],[-3.229231,42.593597],[-3.228663,42.594189],[-3.228327,42.594559],[-3.22793,42.595025],[-3.227511,42.595526],[-3.227167,42.595976],[-3.226798,42.596457],[-3.226188,42.597258],[-3.225794,42.597761],[-3.225622,42.597972],[-3.225377,42.598265],[-3.225145,42.598525],[-3.224922,42.598759],[-3.224749,42.598938],[-3.224559,42.599128],[-3.224388,42.599293],[-3.223976,42.599678],[-3.223642,42.599964],[-3.22325,42.600278],[-3.223028,42.600463],[-3.222626,42.600748],[-3.222121,42.601095],[-3.221836,42.601282],[-3.221511,42.601486],[-3.22112,42.601716],[-3.220631,42.601981],[-3.220148,42.602223],[-3.219594,42.602487],[-3.219187,42.602668],[-3.218822,42.602821],[-3.218296,42.603029],[-3.217807,42.60321],[-3.217159,42.603439],[-3.2163,42.603717],[-3.214953,42.60415],[-3.213746,42.604553],[-3.213009,42.604819],[-3.212192,42.605138],[-3.211444,42.605453],[-3.2107,42.605787],[-3.210149,42.606055],[-3.209709,42.606286],[-3.209174,42.606576],[-3.208768,42.606809],[-3.208318,42.607075],[-3.207754,42.607431],[-3.207148,42.607832],[-3.206748,42.608122],[-3.206461,42.608334],[-3.206011,42.608681],[-3.205513,42.60909],[-3.205084,42.609462],[-3.204734,42.609776],[-3.204365,42.610121],[-3.203993,42.610479],[-3.203121,42.611337],[-3.202535,42.611918],[-3.202089,42.612338],[-3.201703,42.612685],[-3.201442,42.612898],[-3.201105,42.61316],[-3.200785,42.613398],[-3.200343,42.613704],[-3.200021,42.613906],[-3.199758,42.614065],[-3.199507,42.614208],[-3.199174,42.614394],[-3.198831,42.614571],[-3.198546,42.61471],[-3.198302,42.614822],[-3.198006,42.614956],[-3.197422,42.615194],[-3.197045,42.615335],[-3.196651,42.615465],[-3.196283,42.615583],[-3.195927,42.61569],[-3.195347,42.615847],[-3.194658,42.616024],[-3.193529,42.616283],[-3.19262,42.616506],[-3.191498,42.616781],[-3.190478,42.617056],[-3.189816,42.617255],[-3.189371,42.617396],[-3.188865,42.61757],[-3.188091,42.617854],[-3.186975,42.618303],[-3.185728,42.618852],[-3.1848,42.61927],[-3.183721,42.619754],[-3.183134,42.62001],[-3.182383,42.620328],[-3.182138,42.620428],[-3.181548,42.620651],[-3.181198,42.620779],[-3.180593,42.620992],[-3.180292,42.621088],[-3.179358,42.621379],[-3.178487,42.621613],[-3.177875,42.621764],[-3.177379,42.621874],[-3.176457,42.622071],[-3.176155,42.622113],[-3.175626,42.622211],[-3.175036,42.622287],[-3.174815,42.622315],[-3.173925,42.622422],[-3.173418,42.622477],[-3.173001,42.622514],[-3.172304,42.622552],[-3.17147,42.622597],[-3.17053,42.622628],[-3.168393,42.622653],[-3.167475,42.622666],[-3.166846,42.622692],[-3.165462,42.622756],[-3.164396,42.622849],[-3.164076,42.622883],[-3.163892,42.622902],[-3.163335,42.622963],[-3.162768,42.623046],[-3.162243,42.623113],[-3.161534,42.62325],[-3.161097,42.62332],[-3.159783,42.623618],[-3.158881,42.623839],[-3.157747,42.624146],[-3.156855,42.624376],[-3.156561,42.624448],[-3.156121,42.624548],[-3.155686,42.624638],[-3.155238,42.62472],[-3.154859,42.624772],[-3.154498,42.624821],[-3.154095,42.624861],[-3.15342,42.624911],[-3.153226,42.624913],[-3.152713,42.62492],[-3.152304,42.624924],[-3.15166,42.624888],[-3.15138,42.624864],[-3.151024,42.624836],[-3.150464,42.62478],[-3.150054,42.624713],[-3.149753,42.624673],[-3.148937,42.624499],[-3.147774,42.624192],[-3.146954,42.623976],[-3.146687,42.623916],[-3.145853,42.623727],[-3.145473,42.623656],[-3.145259,42.623635],[-3.144349,42.623496],[-3.143836,42.623453],[-3.143332,42.62343],[-3.14249,42.623409],[-3.141991,42.623421],[-3.141418,42.623439],[-3.140273,42.623524],[-3.139409,42.623591],[-3.138988,42.62362],[-3.138517,42.623632],[-3.138115,42.623635],[-3.137189,42.623601],[-3.136738,42.62357],[-3.136154,42.623509],[-3.135438,42.623401],[-3.135186,42.623362],[-3.134413,42.623202],[-3.133296,42.622923],[-3.131813,42.622548],[-3.13104,42.622353],[-3.130479,42.622224],[-3.129511,42.622026],[-3.128661,42.621876],[-3.128411,42.621836],[-3.127358,42.621693],[-3.126717,42.621629],[-3.126459,42.621596],[-3.125377,42.621501],[-3.124562,42.621463],[-3.123682,42.621454],[-3.122803,42.621454],[-3.122266,42.621463],[-3.121479,42.6215],[-3.120574,42.621562],[-3.119749,42.621642],[-3.119129,42.621719],[-3.117461,42.621988],[-3.117114,42.622054],[-3.116659,42.622148],[-3.116457,42.622187],[-3.115716,42.622379],[-3.115319,42.622503],[-3.115257,42.622522],[-3.115009,42.622599],[-3.114557,42.622769],[-3.114336,42.622845],[-3.113718,42.623124],[-3.113148,42.623423],[-3.112798,42.623619],[-3.112177,42.624015],[-3.111763,42.624321],[-3.111391,42.624625],[-3.110927,42.625043],[-3.110626,42.625361],[-3.110335,42.625685],[-3.110034,42.62607],[-3.109818,42.626383],[-3.109708,42.626578],[-3.109486,42.626971],[-3.109305,42.627338],[-3.10908,42.627929],[-3.108925,42.628436],[-3.108825,42.62894],[-3.108764,42.629526],[-3.10876,42.629659],[-3.108749,42.630051],[-3.108782,42.630627],[-3.108821,42.631238],[-3.108832,42.631554],[-3.108842,42.631844],[-3.108785,42.632339],[-3.108664,42.632773],[-3.108485,42.633425],[-3.108021,42.634819],[-3.107763,42.635442],[-3.10755,42.635897],[-3.107274,42.636421],[-3.106827,42.636929],[-3.106389,42.637284],[-3.105975,42.637539],[-3.105706,42.637678],[-3.105457,42.63779],[-3.105245,42.637871],[-3.10498,42.637961],[-3.104583,42.638069],[-3.104176,42.63815],[-3.103756,42.638205],[-3.103401,42.638225],[-3.103002,42.638236],[-3.101952,42.638226],[-3.101426,42.638237],[-3.100992,42.638269],[-3.100573,42.638339],[-3.10024,42.638408],[-3.099646,42.638575],[-3.099131,42.638773],[-3.098669,42.638999],[-3.098248,42.639259],[-3.09599,42.640814],[-3.094985,42.641592],[-3.094749,42.641784],[-3.094362,42.6421],[-3.093657,42.642705],[-3.093041,42.643238],[-3.092682,42.643555],[-3.092524,42.643672],[-3.092327,42.643815],[-3.09188,42.644092],[-3.091341,42.644336],[-3.091058,42.644433],[-3.090616,42.644583],[-3.089969,42.644686],[-3.089517,42.644713],[-3.088796,42.644709],[-3.087981,42.644632],[-3.087357,42.644556],[-3.086754,42.644516],[-3.086073,42.644519],[-3.085331,42.644588],[-3.08457,42.644742],[-3.083818,42.645013],[-3.083226,42.645306],[-3.082733,42.64567],[-3.082324,42.646029],[-3.082037,42.646358],[-3.081875,42.646596],[-3.081507,42.647232],[-3.081059,42.648015],[-3.080821,42.64834],[-3.080626,42.648551],[-3.080189,42.648984],[-3.079672,42.649372],[-3.079095,42.64972],[-3.078418,42.650009],[-3.078028,42.650134],[-3.077821,42.650208],[-3.077128,42.650371],[-3.076316,42.650489],[-3.075707,42.650539],[-3.073879,42.650631],[-3.073605,42.650654],[-3.072545,42.650715],[-3.071686,42.650791],[-3.07116,42.650837],[-3.070478,42.650916],[-3.069566,42.651045],[-3.068647,42.651206],[-3.067848,42.651363],[-3.067162,42.651522],[-3.066496,42.651688],[-3.065723,42.651907],[-3.065136,42.652094],[-3.064507,42.65233],[-3.064158,42.65247],[-3.063851,42.6526],[-3.063323,42.652848],[-3.062444,42.653276],[-3.061468,42.653784],[-3.060727,42.654142],[-3.060005,42.654433],[-3.059311,42.654669],[-3.058677,42.654846],[-3.057831,42.655044],[-3.056971,42.655201],[-3.055776,42.655352],[-3.054897,42.655455],[-3.053804,42.655593],[-3.052864,42.65576],[-3.051936,42.65599],[-3.051012,42.656276],[-3.05013,42.656602],[-3.049259,42.656973],[-3.048335,42.657342],[-3.047392,42.657686],[-3.046437,42.657939],[-3.045613,42.658112],[-3.044761,42.658256],[-3.043777,42.65838],[-3.042927,42.658469],[-3.041928,42.658591],[-3.041457,42.658674],[-3.041122,42.658734],[-3.04045,42.658887],[-3.039726,42.659082],[-3.039116,42.65928],[-3.038506,42.659494],[-3.038019,42.65972],[-3.03756,42.659934],[-3.037062,42.660189],[-3.036653,42.66042],[-3.036177,42.660708],[-3.035584,42.661124],[-3.035287,42.661359],[-3.03481,42.661776],[-3.034341,42.662208],[-3.033825,42.662794],[-3.033446,42.66325],[-3.033182,42.66367],[-3.032924,42.664101],[-3.032621,42.664703],[-3.032352,42.665399],[-3.032082,42.666177],[-3.031822,42.666973],[-3.031447,42.667731],[-3.031168,42.668301],[-3.030734,42.668953],[-3.030287,42.669529],[-3.029723,42.670151],[-3.029022,42.670757],[-3.028513,42.671139],[-3.028013,42.671484],[-3.027447,42.671818],[-3.026816,42.672148],[-3.026071,42.672495],[-3.025136,42.672859],[-3.024027,42.673271],[-3.023142,42.67361],[-3.022077,42.67404],[-3.021051,42.674499],[-3.020081,42.674955],[-3.019212,42.675429],[-3.018099,42.676083],[-3.017081,42.676748],[-3.016342,42.677215],[-3.015221,42.677932],[-3.014249,42.678529],[-3.013194,42.679191],[-3.012102,42.67984],[-3.011164,42.680394],[-3.010292,42.680896],[-3.008938,42.681646],[-3.007854,42.682268],[-3.007751,42.682327],[-3.006354,42.683073],[-3.005048,42.683737],[-3.003686,42.684431],[-3.002068,42.685205],[-3.000828,42.68578],[-2.999315,42.68648],[-2.997779,42.687169],[-2.996169,42.687883],[-2.994635,42.688606],[-2.993053,42.689349],[-2.99119,42.690308],[-2.989247,42.691289],[-2.987514,42.692225],[-2.987434,42.692268],[-2.986681,42.692691],[-2.985946,42.693103],[-2.98465,42.693829],[-2.983359,42.694624],[-2.982146,42.695364],[-2.980953,42.696105],[-2.979144,42.697259],[-2.978071,42.697928],[-2.977319,42.698362],[-2.976443,42.698868],[-2.975954,42.69912],[-2.975398,42.699408],[-2.975186,42.699521],[-2.974871,42.699676],[-2.97413,42.700047],[-2.973296,42.700429],[-2.972541,42.700748],[-2.971788,42.701053],[-2.971238,42.701269],[-2.970696,42.701464],[-2.97002,42.70171],[-2.969445,42.701899],[-2.968855,42.702093],[-2.968293,42.702266],[-2.967654,42.702454],[-2.967211,42.70257],[-2.966857,42.702668],[-2.966187,42.702846],[-2.965278,42.703054],[-2.96431,42.70326],[-2.963132,42.703479],[-2.961926,42.703683],[-2.960766,42.703846],[-2.959318,42.704025],[-2.957867,42.704174],[-2.956343,42.704303],[-2.955047,42.704408],[-2.953203,42.704551],[-2.952003,42.704629],[-2.950999,42.704685],[-2.949657,42.704752],[-2.948369,42.704805],[-2.946895,42.704856],[-2.945169,42.704896],[-2.944036,42.704915],[-2.942464,42.704928],[-2.941888,42.704932],[-2.938935,42.704897],[-2.937328,42.704855],[-2.936062,42.70482],[-2.933906,42.704719],[-2.933027,42.704677],[-2.931292,42.704571],[-2.929745,42.704469],[-2.928076,42.704333],[-2.927293,42.704262],[-2.925996,42.704133],[-2.925262,42.704065],[-2.924192,42.703965],[-2.923476,42.703897],[-2.922428,42.703796],[-2.921622,42.70373],[-2.920641,42.70367],[-2.920126,42.703641],[-2.919548,42.703615],[-2.918836,42.703597],[-2.917955,42.703589],[-2.917126,42.703599],[-2.916862,42.7036],[-2.91629,42.703628],[-2.915431,42.703658],[-2.914708,42.703695],[-2.914085,42.703735],[-2.913346,42.703799],[-2.912578,42.703874],[-2.911886,42.703948],[-2.911297,42.704024],[-2.910126,42.704191],[-2.90963,42.70427],[-2.908907,42.704397],[-2.907882,42.704595],[-2.906558,42.704892],[-2.905499,42.705153],[-2.904388,42.705443],[-2.903332,42.705734],[-2.902218,42.706047],[-2.901203,42.706334],[-2.900153,42.706619],[-2.89935,42.706837],[-2.898654,42.707012],[-2.898047,42.70714],[-2.897396,42.707275],[-2.896552,42.707426],[-2.895745,42.707555],[-2.89479,42.707675],[-2.893923,42.707751],[-2.893165,42.707805],[-2.892314,42.707844],[-2.891762,42.707856],[-2.891081,42.707866],[-2.890414,42.707853],[-2.889487,42.707815],[-2.888638,42.707759],[-2.887736,42.707675],[-2.88671,42.707547],[-2.885936,42.707433],[-2.885079,42.707288],[-2.883484,42.707008],[-2.883228,42.706963],[-2.882184,42.706792],[-2.881558,42.706716],[-2.880963,42.706658],[-2.880297,42.706618],[-2.87973,42.706608],[-2.878948,42.706624],[-2.878155,42.706675],[-2.877416,42.706761],[-2.876581,42.706902],[-2.875838,42.707065],[-2.874925,42.707314],[-2.874092,42.707594],[-2.873582,42.707807],[-2.873368,42.707896],[-2.872846,42.708141],[-2.872394,42.708376],[-2.871997,42.708599],[-2.871565,42.708865],[-2.871235,42.709087],[-2.870623,42.709541],[-2.870178,42.709923],[-2.869698,42.710387],[-2.869325,42.710757],[-2.86835,42.711967],[-2.867715,42.712852],[-2.867286,42.713607],[-2.867162,42.713837],[-2.867078,42.714028],[-2.866993,42.714336],[-2.866957,42.714609],[-2.866945,42.71485],[-2.86699,42.715248],[-2.867063,42.715534],[-2.86713,42.715743],[-2.86729,42.716292],[-2.867356,42.716588],[-2.867402,42.716901],[-2.86742,42.717156],[-2.867419,42.717404],[-2.867396,42.717652],[-2.867373,42.717848],[-2.86733,42.718092],[-2.867263,42.718354],[-2.867108,42.718993],[-2.866999,42.719451],[-2.866803,42.720154],[-2.866599,42.720959],[-2.866365,42.721843],[-2.866299,42.722128],[-2.866263,42.72231],[-2.866233,42.72253],[-2.866222,42.722657],[-2.86622,42.722784],[-2.866232,42.722955],[-2.86624,42.723135],[-2.866287,42.723415],[-2.866354,42.723626],[-2.866412,42.723798],[-2.866483,42.723967],[-2.866633,42.72426],[-2.867919,42.726521],[-2.868577,42.727684],[-2.868888,42.72822],[-2.869154,42.728646],[-2.869336,42.728891],[-2.869536,42.72912],[-2.869767,42.729342],[-2.870072,42.729646],[-2.870233,42.729814],[-2.870444,42.730069],[-2.870617,42.730325],[-2.870763,42.730587],[-2.870957,42.731091],[-2.871009,42.731396],[-2.87105,42.731678],[-2.871059,42.732098],[-2.871055,42.732703],[-2.871067,42.733226],[-2.871049,42.733679],[-2.870999,42.734019],[-2.870935,42.734326],[-2.870851,42.734609],[-2.87055,42.735405],[-2.87021,42.735981],[-2.869494,42.736976],[-2.868777,42.737847],[-2.868064,42.738612],[-2.867212,42.739389],[-2.866759,42.739764],[-2.866372,42.740064],[-2.865913,42.740404],[-2.865522,42.740682],[-2.864871,42.741098],[-2.864264,42.741457],[-2.86377,42.741742],[-2.86308,42.742105],[-2.862448,42.742408],[-2.861921,42.742646],[-2.861356,42.742893],[-2.860772,42.743131],[-2.859903,42.743466],[-2.859102,42.743759],[-2.857948,42.744155],[-2.856705,42.744561],[-2.855588,42.744915],[-2.853267,42.745653],[-2.848559,42.74714],[-2.848213,42.74724],[-2.844565,42.748402],[-2.841787,42.749286],[-2.840435,42.749735],[-2.839135,42.750188],[-2.837321,42.750865],[-2.836928,42.751023],[-2.835525,42.751589],[-2.834595,42.751981],[-2.833702,42.752367],[-2.832978,42.752693],[-2.832027,42.753135],[-2.83118,42.753538],[-2.830402,42.753925],[-2.829402,42.754453],[-2.828652,42.754881],[-2.827906,42.755339],[-2.827209,42.755812],[-2.826524,42.756332],[-2.825975,42.756789],[-2.825513,42.757226],[-2.82516,42.757573],[-2.824624,42.758179],[-2.82427,42.758628],[-2.823957,42.759045],[-2.823664,42.759495],[-2.823432,42.759891],[-2.82306,42.7606],[-2.822911,42.760922],[-2.822679,42.761544],[-2.822431,42.762285],[-2.822388,42.762451],[-2.822222,42.763323],[-2.822171,42.76377],[-2.822128,42.764238],[-2.822122,42.765392],[-2.822138,42.765906],[-2.822201,42.766695],[-2.822301,42.767481],[-2.822401,42.768209],[-2.822878,42.771612],[-2.822967,42.772269],[-2.823282,42.774434],[-2.823543,42.77642],[-2.823634,42.777342],[-2.823686,42.778285],[-2.823715,42.779204],[-2.823719,42.78012],[-2.823656,42.781649],[-2.823606,42.782364],[-2.823548,42.783056],[-2.823484,42.783716],[-2.823148,42.786126],[-2.822762,42.788165],[-2.822543,42.789129],[-2.822506,42.789292],[-2.822253,42.790303],[-2.822053,42.790991],[-2.821693,42.792162],[-2.821462,42.792841],[-2.821148,42.793717],[-2.820659,42.794929],[-2.820265,42.7958],[-2.819841,42.796622],[-2.819406,42.797319],[-2.819126,42.797715],[-2.818887,42.798027],[-2.818423,42.798577],[-2.817978,42.799038],[-2.817469,42.799517],[-2.816978,42.799932],[-2.816462,42.800325],[-2.815758,42.800814],[-2.815016,42.801279],[-2.812395,42.802838],[-2.810265,42.804081],[-2.809574,42.804452],[-2.808541,42.804891],[-2.806576,42.805673],[-2.80475,42.8064],[-2.803666,42.806848],[-2.802982,42.80713],[-2.80258,42.807313],[-2.801903,42.807637],[-2.801257,42.807986],[-2.800714,42.808299],[-2.800247,42.808588],[-2.798907,42.809485],[-2.797976,42.810125],[-2.796976,42.810774],[-2.796386,42.811127],[-2.795832,42.811447],[-2.795823,42.811452],[-2.795231,42.811776],[-2.794089,42.812404],[-2.792752,42.813068],[-2.792371,42.813252],[-2.790104,42.814225],[-2.784732,42.81653],[-2.77983,42.81879],[-2.774574,42.82126],[-2.772495,42.822237],[-2.768541,42.824113],[-2.767849,42.824485],[-2.766427,42.82515],[-2.764807,42.825922],[-2.763327,42.826659],[-2.762277,42.827222],[-2.761168,42.827872],[-2.760361,42.828372],[-2.759584,42.828882],[-2.758717,42.829488],[-2.75791,42.830089],[-2.757128,42.830712],[-2.756375,42.831343],[-2.755575,42.832071],[-2.754849,42.832786],[-2.75438,42.833293],[-2.753894,42.833873],[-2.753424,42.834501],[-2.752996,42.835159],[-2.752659,42.835749],[-2.752412,42.836244],[-2.752211,42.836693],[-2.752008,42.83721],[-2.751823,42.837774],[-2.751723,42.838124],[-2.751622,42.838534],[-2.751529,42.839041],[-2.751483,42.839336],[-2.751453,42.839572],[-2.751402,42.840175],[-2.751381,42.840633],[-2.751378,42.841055],[-2.75136,42.842239],[-2.751321,42.84291],[-2.751244,42.843516],[-2.751148,42.843998],[-2.751019,42.844457],[-2.750879,42.844851],[-2.750724,42.845236],[-2.75057,42.845557],[-2.750171,42.846261],[-2.749783,42.846811],[-2.749021,42.847742],[-2.748513,42.848366],[-2.748216,42.848775],[-2.747949,42.849194],[-2.747778,42.849509],[-2.747588,42.849877],[-2.747401,42.850317],[-2.747242,42.850752],[-2.74709,42.851301],[-2.746971,42.851887],[-2.746873,42.852439],[-2.746781,42.852855],[-2.746689,42.853212],[-2.746543,42.853628],[-2.746443,42.85388],[-2.746354,42.854082],[-2.746079,42.85465],[-2.74582,42.855079],[-2.745477,42.855564],[-2.745116,42.856021],[-2.744686,42.856484],[-2.744172,42.856972],[-2.743598,42.857462],[-2.74227,42.858527],[-2.741583,42.859177],[-2.740651,42.860092],[-2.740121,42.8606],[-2.739636,42.861049],[-2.739042,42.861551],[-2.73848,42.862003],[-2.738014,42.862354],[-2.737405,42.862785],[-2.736633,42.863287],[-2.736099,42.863616],[-2.735406,42.864005],[-2.734651,42.864392],[-2.734135,42.864651],[-2.733583,42.864903],[-2.733123,42.865109],[-2.732604,42.865322],[-2.731645,42.86569],[-2.730909,42.865947],[-2.730136,42.866191],[-2.729231,42.866463],[-2.727956,42.86684],[-2.727174,42.867083],[-2.726495,42.867311],[-2.725383,42.867736],[-2.724799,42.867988],[-2.724166,42.868299],[-2.72351,42.868657],[-2.723101,42.868909],[-2.722681,42.869183],[-2.722103,42.869593],[-2.721572,42.87],[-2.720955,42.870553],[-2.72029,42.871241],[-2.719619,42.872008],[-2.718966,42.872774],[-2.718388,42.873459],[-2.717825,42.874079],[-2.71734,42.874559],[-2.716819,42.875056],[-2.716378,42.875441],[-2.715573,42.876083],[-2.71501,42.876484],[-2.714376,42.876913],[-2.713163,42.877664],[-2.711794,42.878394],[-2.710768,42.87884],[-2.710257,42.879047],[-2.709403,42.87937],[-2.708377,42.879704],[-2.707591,42.879923],[-2.7068,42.8801],[-2.705993,42.880256],[-2.70518,42.880375],[-2.704629,42.88044],[-2.703932,42.8805],[-2.703271,42.88053],[-2.702472,42.880543],[-2.701848,42.880541],[-2.701403,42.880524],[-2.700434,42.880461],[-2.698475,42.880211],[-2.697267,42.88013],[-2.696544,42.88013],[-2.695778,42.880144],[-2.695298,42.880176],[-2.694804,42.880226],[-2.694374,42.880272],[-2.694096,42.880317],[-2.693924,42.880313],[-2.693793,42.880297],[-2.693638,42.880265],[-2.693516,42.880227],[-2.6934,42.88018],[-2.69331,42.880125],[-2.693234,42.880061],[-2.693156,42.879955],[-2.693122,42.87986],[-2.693108,42.879773],[-2.693136,42.879654],[-2.693186,42.879565],[-2.693268,42.879478],[-2.693355,42.879406],[-2.693468,42.879358],[-2.693584,42.879327],[-2.693706,42.879316],[-2.693875,42.879322],[-2.694013,42.879356],[-2.694157,42.87942],[-2.69423,42.879465],[-2.694309,42.879537],[-2.694383,42.879629],[-2.694513,42.879963],[-2.694788,42.880791],[-2.694874,42.881083],[-2.694942,42.881299],[-2.695017,42.881509],[-2.695247,42.882116],[-2.69542,42.88272],[-2.695663,42.883386],[-2.695704,42.883559],[-2.695968,42.884405],[-2.69601,42.884539],[-2.696342,42.885519],[-2.696681,42.886384],[-2.697019,42.887163],[-2.697259,42.887682],[-2.697459,42.888093],[-2.697786,42.888729],[-2.69815,42.88939],[-2.698446,42.889896],[-2.698865,42.890574],[-2.699175,42.891065],[-2.699665,42.891886],[-2.700183,42.892552],[-2.700713,42.893227],[-2.701142,42.893738],[-2.701569,42.894194],[-2.701967,42.894592],[-2.70324,42.895885],[-2.70396,42.896606],[-2.705134,42.897787],[-2.706291,42.89897],[-2.707232,42.89995],[-2.708666,42.901451],[-2.708804,42.901618],[-2.708914,42.90178],[-2.709029,42.901979],[-2.709118,42.902176],[-2.709187,42.902361],[-2.709237,42.902531],[-2.709288,42.902792],[-2.709318,42.903053],[-2.709311,42.903252],[-2.7093,42.903425],[-2.709268,42.903637],[-2.709216,42.903852],[-2.709137,42.904081],[-2.709041,42.904289],[-2.70895,42.904457],[-2.708812,42.904694],[-2.708658,42.904893],[-2.708465,42.905102],[-2.708186,42.90536],[-2.707876,42.905603],[-2.707408,42.905916],[-2.706628,42.906433],[-2.706257,42.906728],[-2.70591,42.906987],[-2.705648,42.907193],[-2.705321,42.907446],[-2.705005,42.90773],[-2.704804,42.907923],[-2.704658,42.90806],[-2.70434,42.908381],[-2.703865,42.908973],[-2.70347,42.909459],[-2.702866,42.910242],[-2.702212,42.91098],[-2.702012,42.911256],[-2.701843,42.911502],[-2.701553,42.911817],[-2.7011,42.912281],[-2.700795,42.912601],[-2.700519,42.912848],[-2.70032,42.91303],[-2.700033,42.913274],[-2.699847,42.913432],[-2.699418,42.913761],[-2.699029,42.91404],[-2.698616,42.914325],[-2.698298,42.914527],[-2.698021,42.914686],[-2.697162,42.915165],[-2.697079,42.915209],[-2.696999,42.915252],[-2.695859,42.915839],[-2.695635,42.915934],[-2.694662,42.916325],[-2.693292,42.916794],[-2.692139,42.917096],[-2.691257,42.917292],[-2.690336,42.917457],[-2.689476,42.917583],[-2.68883,42.917655],[-2.688046,42.917722],[-2.687159,42.917764],[-2.686196,42.917799],[-2.685354,42.917814],[-2.681955,42.917874],[-2.680427,42.917946],[-2.679717,42.917988],[-2.678516,42.918071],[-2.677022,42.918194],[-2.675433,42.918369],[-2.673951,42.918551],[-2.672995,42.918692],[-2.671657,42.918892],[-2.670473,42.919096],[-2.669399,42.919295],[-2.668157,42.919544],[-2.66695,42.919805],[-2.66537,42.920176],[-2.663828,42.920575],[-2.662648,42.920904],[-2.661368,42.921282],[-2.659641,42.921832],[-2.658645,42.922174],[-2.657374,42.922614],[-2.655347,42.923262],[-2.654153,42.923613],[-2.652911,42.923959],[-2.651707,42.924269],[-2.650624,42.924527],[-2.64862,42.925008],[-2.647849,42.925204],[-2.647107,42.925398],[-2.645951,42.925744],[-2.645177,42.925996],[-2.644658,42.926175],[-2.643723,42.926539],[-2.643182,42.926765],[-2.642668,42.926989],[-2.642226,42.927194],[-2.64157,42.927519],[-2.640655,42.928004],[-2.639994,42.928393],[-2.639369,42.928774],[-2.638688,42.92923],[-2.63843,42.929408],[-2.637737,42.92993],[-2.637282,42.930299],[-2.636523,42.930936],[-2.635801,42.931623],[-2.635368,42.932074],[-2.635075,42.932392],[-2.634467,42.933103],[-2.633899,42.933838],[-2.633549,42.934324],[-2.633256,42.934765],[-2.63281,42.935486],[-2.631969,42.937196],[-2.631313,42.93889],[-2.630614,42.941003],[-2.630176,42.942358],[-2.629768,42.943538],[-2.629287,42.94494],[-2.628802,42.946354],[-2.627782,42.949291],[-2.627366,42.950338],[-2.627178,42.950745],[-2.626973,42.951168],[-2.626848,42.951395],[-2.626531,42.951941],[-2.626084,42.952582],[-2.625689,42.953082],[-2.625462,42.953348],[-2.625251,42.953582],[-2.624807,42.954038],[-2.624163,42.954622],[-2.623791,42.954928],[-2.623476,42.955168],[-2.622854,42.955609],[-2.622419,42.955887],[-2.621921,42.956189],[-2.621483,42.956432],[-2.620877,42.956737],[-2.620139,42.957075],[-2.61931,42.957425],[-2.618388,42.957779],[-2.617528,42.958092],[-2.616223,42.958558],[-2.615574,42.958804],[-2.614944,42.959053],[-2.614722,42.95915],[-2.614018,42.959476],[-2.613525,42.959738],[-2.613031,42.960029],[-2.61272,42.960229],[-2.612382,42.960457],[-2.611965,42.960778],[-2.611537,42.961135],[-2.611196,42.961443],[-2.610914,42.961723],[-2.610552,42.962107],[-2.610337,42.96237],[-2.610001,42.962775],[-2.608477,42.964766],[-2.608056,42.96528],[-2.607705,42.965709],[-2.607245,42.966247],[-2.606885,42.966655],[-2.606192,42.967379],[-2.605723,42.967858],[-2.60501,42.968549],[-2.604194,42.969357],[-2.60369,42.969852],[-2.603137,42.970409],[-2.602221,42.971215],[-2.600372,42.972747],[-2.59857,42.974219],[-2.583748,42.986346],[-2.582826,42.987129],[-2.582396,42.987519],[-2.582045,42.987871],[-2.581476,42.988498],[-2.581009,42.989044],[-2.580618,42.989585],[-2.580207,42.990234],[-2.579696,42.991119],[-2.57937,42.991696],[-2.579054,42.992217],[-2.578681,42.992734],[-2.578146,42.993339],[-2.577603,42.993862],[-2.576994,42.994413],[-2.576369,42.994977],[-2.575694,42.995651],[-2.575258,42.996117],[-2.57501,42.996433],[-2.57482,42.996698],[-2.574644,42.996966],[-2.574467,42.997254],[-2.574214,42.997727],[-2.57394,42.998267],[-2.573668,42.998881],[-2.573296,42.999705],[-2.572864,43.000623],[-2.57249,43.001415],[-2.572241,43.001864],[-2.571991,43.00227],[-2.571656,43.002779],[-2.571385,43.003136],[-2.571112,43.003442],[-2.570825,43.003742],[-2.570549,43.004017],[-2.570259,43.004271],[-2.569691,43.004725],[-2.569025,43.005213],[-2.568607,43.005468],[-2.568215,43.005695],[-2.567866,43.00588],[-2.567432,43.006076],[-2.567056,43.006238],[-2.565823,43.006689],[-2.565003,43.006955],[-2.564078,43.007221],[-2.561585,43.007951],[-2.560217,43.0084],[-2.558962,43.008886],[-2.558125,43.00929],[-2.557459,43.00965],[-2.556677,43.010158],[-2.55624,43.01048],[-2.555571,43.011021],[-2.555021,43.011542],[-2.553951,43.012646],[-2.552967,43.013711],[-2.552529,43.014147],[-2.552167,43.014489],[-2.551839,43.014772],[-2.551539,43.015013],[-2.551116,43.015324],[-2.550806,43.015521],[-2.550491,43.015711],[-2.550149,43.015895],[-2.549807,43.016064],[-2.549428,43.016233],[-2.549044,43.016387],[-2.548844,43.01646],[-2.548447,43.016595],[-2.547928,43.016737],[-2.547531,43.016834],[-2.547271,43.016884],[-2.546917,43.016949],[-2.546514,43.01701],[-2.546068,43.017059],[-2.54562,43.017092],[-2.545226,43.017107],[-2.544787,43.017108],[-2.54433,43.017098],[-2.543961,43.01708],[-2.543549,43.01705],[-2.542921,43.016992],[-2.542132,43.0169],[-2.541459,43.016811],[-2.540701,43.016708],[-2.540211,43.016647],[-2.539648,43.01658],[-2.538967,43.016507],[-2.538575,43.016477],[-2.538153,43.016448],[-2.537431,43.016423],[-2.536854,43.016429],[-2.536224,43.016465],[-2.535766,43.016507],[-2.535323,43.01656],[-2.534802,43.016645],[-2.534359,43.016728],[-2.533758,43.016873],[-2.533377,43.01698],[-2.532972,43.017105],[-2.532585,43.017243],[-2.532236,43.017376],[-2.531943,43.017498],[-2.531569,43.017667],[-2.531189,43.01785],[-2.530638,43.018153],[-2.530539,43.018214],[-2.530019,43.018541],[-2.529472,43.018886],[-2.528937,43.019251],[-2.528392,43.019682],[-2.527929,43.02005],[-2.527033,43.020747],[-2.525747,43.021803],[-2.52513,43.02233],[-2.524703,43.022662],[-2.5243,43.022922],[-2.523819,43.0232],[-2.52352,43.02337],[-2.523217,43.023523],[-2.522923,43.023654],[-2.522406,43.023856],[-2.521929,43.024022],[-2.520981,43.024271],[-2.520317,43.024445],[-2.519733,43.024614],[-2.519322,43.02475],[-2.518816,43.024947],[-2.518399,43.025125],[-2.518057,43.025292],[-2.51773,43.025474],[-2.517349,43.0257],[-2.516951,43.025973],[-2.51664,43.026209],[-2.515833,43.02682],[-2.51505,43.027403],[-2.514297,43.027935],[-2.513516,43.028482],[-2.512587,43.029108],[-2.512012,43.029538],[-2.511701,43.029802],[-2.511464,43.030025],[-2.511162,43.030335],[-2.510943,43.030586],[-2.51061,43.031031],[-2.510365,43.031439],[-2.51023,43.031692],[-2.510098,43.032004],[-2.509998,43.032245],[-2.509891,43.032584],[-2.509815,43.032888],[-2.509759,43.033194],[-2.509727,43.033511],[-2.509714,43.033927],[-2.509757,43.034479],[-2.509825,43.035],[-2.509995,43.035648],[-2.510219,43.036692],[-2.510272,43.037123],[-2.510281,43.037523],[-2.510278,43.037779],[-2.51024,43.038168],[-2.510192,43.038475],[-2.510087,43.038908],[-2.509983,43.039217],[-2.509875,43.039506],[-2.509754,43.039776],[-2.509631,43.040016],[-2.509485,43.040275],[-2.50931,43.040541],[-2.509119,43.040799],[-2.508679,43.041333],[-2.508275,43.041772],[-2.507827,43.042153],[-2.507327,43.042493],[-2.506752,43.042858],[-2.506439,43.043041],[-2.506153,43.043192],[-2.505644,43.043437],[-2.505166,43.043638],[-2.504652,43.043821],[-2.503705,43.044121],[-2.503059,43.044334],[-2.502191,43.044631],[-2.501653,43.044828],[-2.501096,43.045068],[-2.500593,43.045309],[-2.500068,43.045576],[-2.499609,43.04583],[-2.499206,43.046086],[-2.498832,43.04633],[-2.498079,43.046884],[-2.496599,43.048009],[-2.495814,43.048605],[-2.495118,43.049126],[-2.494065,43.049932],[-2.493644,43.050271],[-2.493282,43.050577],[-2.492871,43.050955],[-2.492417,43.051419],[-2.49194,43.051954],[-2.491667,43.052293],[-2.490514,43.053672],[-2.489662,43.05466],[-2.489132,43.055199],[-2.488658,43.055651],[-2.487622,43.056457],[-2.486462,43.057263],[-2.485426,43.057914],[-2.484372,43.058465],[-2.48186,43.059722],[-2.480902,43.060199],[-2.48022,43.060555],[-2.479841,43.060775],[-2.479486,43.061],[-2.478945,43.061364],[-2.47835,43.061831],[-2.477762,43.062382],[-2.477213,43.062978],[-2.476753,43.06356],[-2.476348,43.064205],[-2.476042,43.064821],[-2.475612,43.065736],[-2.475407,43.066338],[-2.475138,43.066985],[-2.474872,43.067601],[-2.474706,43.067945],[-2.474555,43.06822],[-2.474331,43.068566],[-2.474048,43.068934],[-2.474036,43.06895],[-2.473706,43.069303],[-2.473289,43.069693],[-2.472911,43.069995],[-2.472472,43.070288],[-2.471955,43.070592],[-2.471589,43.070772],[-2.471134,43.070975],[-2.470637,43.071164],[-2.469998,43.071352],[-2.469366,43.071501],[-2.468262,43.071714],[-2.467654,43.071828],[-2.467066,43.071962],[-2.466638,43.07209],[-2.466197,43.072238],[-2.465783,43.072407],[-2.465342,43.072607],[-2.465142,43.072704],[-2.464807,43.072872],[-2.464292,43.073137],[-2.463936,43.073311],[-2.463419,43.07354],[-2.463061,43.073697],[-2.462681,43.073855],[-2.462268,43.074013],[-2.461698,43.074197],[-2.461152,43.074354],[-2.450881,43.077355],[-2.450302,43.07756],[-2.44966,43.077824],[-2.448959,43.078199],[-2.448238,43.078704],[-2.448048,43.078839],[-2.446539,43.079986],[-2.445777,43.080607],[-2.445111,43.081116],[-2.444951,43.081239],[-2.444663,43.081424],[-2.444321,43.081635],[-2.443989,43.081829],[-2.443936,43.081857],[-2.44348,43.082093],[-2.443325,43.082164],[-2.443119,43.082257],[-2.442593,43.082468],[-2.44203,43.082669],[-2.441655,43.082793],[-2.441287,43.082914],[-2.440935,43.083048],[-2.440668,43.083145],[-2.440373,43.083269],[-2.440075,43.083389],[-2.43966,43.08358],[-2.439415,43.083702],[-2.439051,43.083896],[-2.438737,43.084073],[-2.437946,43.084584],[-2.437349,43.08504],[-2.436837,43.085503],[-2.436422,43.08593],[-2.436021,43.086413],[-2.435918,43.086562],[-2.435724,43.086861],[-2.435561,43.087125],[-2.435408,43.087391],[-2.435245,43.087669],[-2.435065,43.088093],[-2.43494,43.088402],[-2.434842,43.088714],[-2.434727,43.089119],[-2.434706,43.089207],[-2.434693,43.08926],[-2.434619,43.089667],[-2.434598,43.089873],[-2.434588,43.089974],[-2.434571,43.09029],[-2.434574,43.090597],[-2.434581,43.090911],[-2.434614,43.091242],[-2.434626,43.091377],[-2.434716,43.092042],[-2.434772,43.092418],[-2.434801,43.092792],[-2.434797,43.093505],[-2.434752,43.093882],[-2.434659,43.094267],[-2.434542,43.094658],[-2.434389,43.095052],[-2.43401,43.095889],[-2.433701,43.096735],[-2.433549,43.097426],[-2.433499,43.098121],[-2.433507,43.098511],[-2.433543,43.098889],[-2.433598,43.099274],[-2.433694,43.099677],[-2.433941,43.10042],[-2.43411,43.100908],[-2.43423,43.101254],[-2.434263,43.101348],[-2.434404,43.101796],[-2.434544,43.10229],[-2.43462,43.102644],[-2.434685,43.10303],[-2.434736,43.103389],[-2.434783,43.10378],[-2.434798,43.104513],[-2.43478,43.105252],[-2.434738,43.105641],[-2.434671,43.106051],[-2.434594,43.106436],[-2.434444,43.107377],[-2.434146,43.108571],[-2.433771,43.109572],[-2.43306,43.110703],[-2.429584,43.115],[-2.42881,43.11613],[-2.42829,43.117482],[-2.427966,43.118812],[-2.427993,43.119312],[-2.428071,43.119827],[-2.428354,43.121318],[-2.428426,43.121941],[-2.428436,43.122568],[-2.428386,43.123203],[-2.428275,43.123833],[-2.428134,43.124351],[-2.427971,43.124855],[-2.427811,43.125211],[-2.42763,43.125583],[-2.427253,43.126218],[-2.42714,43.126375],[-2.426693,43.126993],[-2.426393,43.127383],[-2.426106,43.127755],[-2.425857,43.128094],[-2.425594,43.128504],[-2.425432,43.128818],[-2.425352,43.128968],[-2.425249,43.129195],[-2.42512,43.12954],[-2.425017,43.129892],[-2.424896,43.130599],[-2.424867,43.130954],[-2.424865,43.131303],[-2.42489,43.131625],[-2.424899,43.131753],[-2.424974,43.132235],[-2.425187,43.133166],[-2.425438,43.13408],[-2.425529,43.134676],[-2.425549,43.135268],[-2.42561,43.136105],[-2.425767,43.137132],[-2.426312,43.13944],[-2.42707,43.142926],[-2.428015,43.146279],[-2.428195,43.146895],[-2.428335,43.147516],[-2.428434,43.148114],[-2.428488,43.148619],[-2.428513,43.149002],[-2.428519,43.149339],[-2.428501,43.150003],[-2.425082,43.171236],[-2.425052,43.171424],[-2.424824,43.172892],[-2.424756,43.17338],[-2.424694,43.174899],[-2.425025,43.176644],[-2.425751,43.178224],[-2.426471,43.179793],[-2.427308,43.181009],[-2.427886,43.181978],[-2.428118,43.182464],[-2.428225,43.182726],[-2.428311,43.18298],[-2.428467,43.183557],[-2.428547,43.184029],[-2.428589,43.184406],[-2.428606,43.184768],[-2.428618,43.185174],[-2.428609,43.185575],[-2.428619,43.186141],[-2.428673,43.186851],[-2.428716,43.187163],[-2.428783,43.187645],[-2.428912,43.188122],[-2.429071,43.188488],[-2.429211,43.1888],[-2.429513,43.189317],[-2.429739,43.18965],[-2.430116,43.190027],[-2.430536,43.190479],[-2.430988,43.190856],[-2.431451,43.191169],[-2.431995,43.191489],[-2.432872,43.191954],[-2.433346,43.192234],[-2.433733,43.192493],[-2.434125,43.192813],[-2.434308,43.192989],[-2.434594,43.193343],[-2.434799,43.193656],[-2.434954,43.193998],[-2.435115,43.194478],[-2.435153,43.194683],[-2.435179,43.19488],[-2.435178,43.195121],[-2.435156,43.195326],[-2.435123,43.195497],[-2.435037,43.195804],[-2.434944,43.196052],[-2.434849,43.196249],[-2.434742,43.196447],[-2.434565,43.196715],[-2.434455,43.196875],[-2.434258,43.197117],[-2.434065,43.197345],[-2.433971,43.197446],[-2.433784,43.19767],[-2.433629,43.197858],[-2.433475,43.198062],[-2.433288,43.198341],[-2.433154,43.198677],[-2.432839,43.19915],[-2.432737,43.199313],[-2.432558,43.199522],[-2.432334,43.199758],[-2.432067,43.199998],[-2.431748,43.200219],[-2.431451,43.200383],[-2.431113,43.200544],[-2.430771,43.200693],[-2.430456,43.200807],[-2.430092,43.200946],[-2.429803,43.201065],[-2.429534,43.201172],[-2.429243,43.201328],[-2.428958,43.201512],[-2.428756,43.201683],[-2.42852,43.201896],[-2.428309,43.202079],[-2.427972,43.20234],[-2.427637,43.202571],[-2.427358,43.202728],[-2.427082,43.202853],[-2.426779,43.202981],[-2.426459,43.203094],[-2.426134,43.203191],[-2.425912,43.203262],[-2.425638,43.203343],[-2.425287,43.203452],[-2.42491,43.203567],[-2.424471,43.203721],[-2.424084,43.203881],[-2.423737,43.204036],[-2.423393,43.204189],[-2.423049,43.204368],[-2.42278,43.204507],[-2.422489,43.204677],[-2.422219,43.204843],[-2.421948,43.205039],[-2.421606,43.205312],[-2.421248,43.205644],[-2.420927,43.205942],[-2.420493,43.206335],[-2.420192,43.206577],[-2.420087,43.206658],[-2.420005,43.206715],[-2.419871,43.206803],[-2.419704,43.20691],[-2.419489,43.207027],[-2.419191,43.207166],[-2.418761,43.207338],[-2.418332,43.207498],[-2.418028,43.207618],[-2.417773,43.207726],[-2.417515,43.207856],[-2.41735,43.20795],[-2.417185,43.208068],[-2.417022,43.208194],[-2.416898,43.208312],[-2.416771,43.20847],[-2.416646,43.208648],[-2.416529,43.208831],[-2.416453,43.208989],[-2.416405,43.209115],[-2.416355,43.20928],[-2.416321,43.20948],[-2.416297,43.209707],[-2.416282,43.210163],[-2.416272,43.210397],[-2.416249,43.210591],[-2.4162,43.210826],[-2.416138,43.211024],[-2.416078,43.211163],[-2.415984,43.211347],[-2.415911,43.211469],[-2.415789,43.211626],[-2.415616,43.211813],[-2.415467,43.211955],[-2.415262,43.212112],[-2.415069,43.212244],[-2.414773,43.212397],[-2.414536,43.212505],[-2.414295,43.212593],[-2.414021,43.212668],[-2.413737,43.212729],[-2.413294,43.212804],[-2.413078,43.212841],[-2.412514,43.212936],[-2.412321,43.212979],[-2.412128,43.213023],[-2.411703,43.213134],[-2.411324,43.213261],[-2.410869,43.213433],[-2.410605,43.213556],[-2.41018,43.213777],[-2.409712,43.214068],[-2.409449,43.214281],[-2.409236,43.214464],[-2.409071,43.214635],[-2.408879,43.214838],[-2.408711,43.215046],[-2.408542,43.215283],[-2.408356,43.215583],[-2.408014,43.216162],[-2.407912,43.216317],[-2.407813,43.216473],[-2.407687,43.216646],[-2.407556,43.216823],[-2.407393,43.217001],[-2.407234,43.217166],[-2.406988,43.217388],[-2.40664,43.217652],[-2.406353,43.21785],[-2.406101,43.217998],[-2.405757,43.218192],[-2.405472,43.21835],[-2.405332,43.218432],[-2.405111,43.218568],[-2.404815,43.218753],[-2.404599,43.218897],[-2.404339,43.219083],[-2.40408,43.219307],[-2.403812,43.219559],[-2.403652,43.219746],[-2.403437,43.220006],[-2.403333,43.220163],[-2.40319,43.220408],[-2.403061,43.220654],[-2.402966,43.220876],[-2.402881,43.22114],[-2.402818,43.221403],[-2.402791,43.221598],[-2.402738,43.221903],[-2.402731,43.222237],[-2.402725,43.222621],[-2.402742,43.223009],[-2.402772,43.223369],[-2.402857,43.223807],[-2.402935,43.22425],[-2.402984,43.224553],[-2.403031,43.224922],[-2.403045,43.225311],[-2.403051,43.225611],[-2.403052,43.22589],[-2.403015,43.226261],[-2.402968,43.226564],[-2.402937,43.226842],[-2.402896,43.227433],[-2.402889,43.228002],[-2.402924,43.22848],[-2.402999,43.228911],[-2.403053,43.229203],[-2.403135,43.229487],[-2.403189,43.229665],[-2.403266,43.229863],[-2.403295,43.22994],[-2.40334,43.230061],[-2.40353,43.230496],[-2.403728,43.230842],[-2.403901,43.231164],[-2.403956,43.23125],[-2.404029,43.231364],[-2.404228,43.231692],[-2.404328,43.231866],[-2.404354,43.231911],[-2.404384,43.231983],[-2.40448,43.232185],[-2.404546,43.232349],[-2.404609,43.232517],[-2.404623,43.232612],[-2.404634,43.232686],[-2.404649,43.232836],[-2.404668,43.233023],[-2.404663,43.233199],[-2.404648,43.233318],[-2.404633,43.233499],[-2.404585,43.233687],[-2.404529,43.233862],[-2.404458,43.234032],[-2.404397,43.234167],[-2.404267,43.234395],[-2.404172,43.234543],[-2.404044,43.234689],[-2.403932,43.234821],[-2.40382,43.234933],[-2.403702,43.235049],[-2.403513,43.235216],[-2.403274,43.235406],[-2.402961,43.23563],[-2.402599,43.235868],[-2.402366,43.236018],[-2.402092,43.236186],[-2.40171,43.236404],[-2.401391,43.236585],[-2.401074,43.236753],[-2.400731,43.236939],[-2.400376,43.23714],[-2.40007,43.237339],[-2.399837,43.237516],[-2.399699,43.237634],[-2.399572,43.23776],[-2.399426,43.237911],[-2.399295,43.238083],[-2.399162,43.238293],[-2.399042,43.238531],[-2.398956,43.238765],[-2.398905,43.238979],[-2.398877,43.239224],[-2.39887,43.239421],[-2.398892,43.239673],[-2.398947,43.239923],[-2.399034,43.240208],[-2.399114,43.240491],[-2.399174,43.240698],[-2.399214,43.240934],[-2.399232,43.241129],[-2.399227,43.241307],[-2.399207,43.241493],[-2.399178,43.241668],[-2.399079,43.241962],[-2.398935,43.242244],[-2.398768,43.242478],[-2.398606,43.242672],[-2.398412,43.242869],[-2.398072,43.243133],[-2.397425,43.243576],[-2.397009,43.243871],[-2.396661,43.244136],[-2.396137,43.244581],[-2.395783,43.24493],[-2.395521,43.245214],[-2.395274,43.245504],[-2.395055,43.245793],[-2.394875,43.246042],[-2.394574,43.246525],[-2.394426,43.246806],[-2.394324,43.247017],[-2.394183,43.247352],[-2.394041,43.247735],[-2.393908,43.248145],[-2.393769,43.248552],[-2.393629,43.248925],[-2.393427,43.249321],[-2.393262,43.249559],[-2.393057,43.24981],[-2.392844,43.250042],[-2.392561,43.250303],[-2.392124,43.250641],[-2.391478,43.25105],[-2.391171,43.251233],[-2.39091,43.251425],[-2.390629,43.251664],[-2.39048,43.251813],[-2.390349,43.251964],[-2.39023,43.252131],[-2.390134,43.252293],[-2.390061,43.252447],[-2.389986,43.252602],[-2.389936,43.252765],[-2.389882,43.252992],[-2.389859,43.253166],[-2.389851,43.253385],[-2.389863,43.253606],[-2.389903,43.254213],[-2.389894,43.254444],[-2.38986,43.254707],[-2.38973,43.255095],[-2.389629,43.255283],[-2.389516,43.255474],[-2.38937,43.255665],[-2.389229,43.255817],[-2.388871,43.256145],[-2.38854,43.256356],[-2.388281,43.256497],[-2.387804,43.256691],[-2.387346,43.256825],[-2.386814,43.256944],[-2.386304,43.257053],[-2.385835,43.257176],[-2.385236,43.257383],[-2.384704,43.25762],[-2.383993,43.258015],[-2.383457,43.258317],[-2.383075,43.258529],[-2.382612,43.258778],[-2.382162,43.259],[-2.381804,43.259165],[-2.381305,43.259362],[-2.380853,43.259579],[-2.380198,43.259869],[-2.379784,43.260055],[-2.379437,43.260211],[-2.379131,43.260379],[-2.378722,43.260623],[-2.378373,43.260861],[-2.378086,43.26107],[-2.377866,43.261242],[-2.377655,43.261427],[-2.377463,43.261598],[-2.377277,43.261774],[-2.376952,43.262099],[-2.376729,43.26233],[-2.37647,43.262589],[-2.376117,43.26288],[-2.375885,43.263025],[-2.375568,43.263194],[-2.375163,43.263354],[-2.374904,43.263457],[-2.374658,43.263542],[-2.37427,43.263681],[-2.373934,43.263824],[-2.373563,43.264008],[-2.373229,43.264206],[-2.372882,43.264441],[-2.372504,43.264771],[-2.372275,43.26501],[-2.372046,43.265287],[-2.37186,43.26557],[-2.371709,43.265831],[-2.371577,43.2661],[-2.371464,43.266412],[-2.371385,43.266689],[-2.371312,43.267108],[-2.371287,43.267428],[-2.371286,43.267837],[-2.371294,43.268182],[-2.371288,43.268442],[-2.371245,43.268758],[-2.371149,43.269071],[-2.371007,43.269376],[-2.370783,43.269663],[-2.370577,43.269892],[-2.370089,43.270257],[-2.369774,43.270449],[-2.36945,43.270639],[-2.369068,43.270887],[-2.368895,43.271014],[-2.368706,43.271173],[-2.36853,43.271346],[-2.368322,43.271593],[-2.36809,43.271978],[-2.367785,43.272517],[-2.367503,43.272908],[-2.367229,43.273176],[-2.36695,43.273401],[-2.366459,43.273765],[-2.366199,43.273975],[-2.365992,43.274157],[-2.365797,43.274368],[-2.365653,43.274567],[-2.365542,43.274751],[-2.365397,43.275044],[-2.365185,43.27551],[-2.364974,43.27595],[-2.3648,43.276258],[-2.364407,43.276808],[-2.364072,43.277245],[-2.363707,43.277624],[-2.363385,43.2779],[-2.363235,43.278045],[-2.362925,43.278344],[-2.362503,43.278733],[-2.361968,43.27922],[-2.361176,43.279917],[-2.360784,43.280257],[-2.360377,43.280623],[-2.36004,43.280921],[-2.359618,43.281314],[-2.359222,43.281719],[-2.358889,43.282085],[-2.358637,43.282376],[-2.358326,43.282765],[-2.358071,43.283111],[-2.357826,43.283472],[-2.357641,43.283733],[-2.35741,43.284056],[-2.357212,43.28432],[-2.356942,43.284635],[-2.356622,43.284957],[-2.356223,43.285274],[-2.355854,43.285519],[-2.355649,43.285645],[-2.355371,43.285786],[-2.355139,43.285885],[-2.354885,43.285963],[-2.354599,43.286042],[-2.35428,43.286101],[-2.353965,43.286139],[-2.353647,43.286156],[-2.353277,43.286159],[-2.352905,43.286125],[-2.352517,43.286058],[-2.352246,43.285988],[-2.351878,43.285873],[-2.351587,43.285773],[-2.351189,43.285631],[-2.350875,43.285542],[-2.350558,43.285464],[-2.350276,43.285416],[-2.349891,43.285375],[-2.349552,43.28537],[-2.349068,43.285382],[-2.348739,43.28539],[-2.348415,43.285391],[-2.348088,43.28538],[-2.347788,43.28535],[-2.347504,43.285304],[-2.347238,43.285248],[-2.34688,43.285144],[-2.346603,43.285056],[-2.346295,43.284942],[-2.3458,43.284752],[-2.345493,43.284636],[-2.345097,43.284496],[-2.344674,43.284357],[-2.344281,43.284248],[-2.343755,43.284129],[-2.343363,43.284061],[-2.34292,43.284006],[-2.342382,43.283964],[-2.340897,43.283918],[-2.339227,43.28403],[-2.336742,43.284336],[-2.335756,43.284373],[-2.335188,43.284397],[-2.334575,43.284427],[-2.33393,43.284461],[-2.333341,43.284496],[-2.332553,43.284548],[-2.331967,43.284581],[-2.331491,43.284617],[-2.330775,43.284659],[-2.330096,43.28468],[-2.329659,43.284685],[-2.32917,43.28468],[-2.328642,43.284666],[-2.328389,43.284653],[-2.327961,43.284633],[-2.327678,43.284618],[-2.327412,43.284597],[-2.327255,43.284585],[-2.326733,43.284531],[-2.326343,43.284484],[-2.326092,43.284457],[-2.325759,43.284412],[-2.325361,43.284356],[-2.324937,43.284289],[-2.324549,43.284217],[-2.324105,43.284133],[-2.323728,43.284048],[-2.323415,43.283975],[-2.323105,43.283903],[-2.32277,43.283824],[-2.322318,43.283705],[-2.321811,43.283561],[-2.321547,43.283479],[-2.321011,43.283311],[-2.320782,43.283234],[-2.320368,43.283089],[-2.32002,43.282959],[-2.31972,43.282841],[-2.319178,43.28262],[-2.318771,43.282448],[-2.318077,43.282136],[-2.317163,43.281709],[-2.316975,43.281618],[-2.316636,43.28146],[-2.316242,43.281276],[-2.315822,43.281078],[-2.315496,43.280936],[-2.315171,43.2808],[-2.314946,43.280702],[-2.314599,43.280539],[-2.314234,43.280352],[-2.313897,43.280164],[-2.313669,43.280026],[-2.313435,43.279878],[-2.313182,43.279701],[-2.313,43.279571],[-2.31288,43.279476],[-2.312748,43.27937],[-2.312614,43.279257],[-2.312431,43.279104],[-2.312151,43.278839],[-2.311913,43.278595],[-2.311706,43.278365],[-2.311541,43.278165],[-2.311388,43.277968],[-2.311263,43.277785],[-2.31111,43.277558],[-2.311004,43.277394],[-2.310915,43.277243],[-2.31082,43.277073],[-2.310745,43.27694],[-2.31063,43.276725],[-2.310521,43.276504],[-2.310436,43.276316],[-2.310338,43.276104],[-2.310249,43.275902],[-2.310172,43.275713],[-2.31009,43.27551],[-2.310014,43.275314],[-2.309917,43.275058],[-2.309806,43.274753],[-2.309715,43.274505],[-2.309615,43.274246],[-2.309523,43.274023],[-2.309424,43.273801],[-2.309302,43.273549],[-2.309192,43.273354],[-2.309085,43.273174],[-2.308943,43.272953],[-2.308786,43.272734],[-2.308632,43.272524],[-2.30837,43.272218],[-2.308219,43.27205],[-2.308051,43.271878],[-2.307863,43.271696],[-2.307634,43.271489],[-2.30743,43.271317],[-2.307187,43.271126],[-2.306985,43.270982],[-2.306808,43.270855],[-2.306612,43.270723],[-2.306376,43.270576],[-2.306101,43.270408],[-2.305824,43.27025],[-2.305496,43.270064],[-2.305166,43.269876],[-2.304849,43.269691],[-2.304524,43.269504],[-2.304271,43.269352],[-2.304002,43.269187],[-2.303501,43.268882],[-2.303224,43.268706],[-2.302938,43.268526],[-2.302644,43.268337],[-2.302258,43.268084],[-2.301784,43.267773],[-2.301434,43.26753],[-2.301273,43.267421],[-2.301125,43.267318],[-2.300895,43.267157],[-2.300547,43.266921],[-2.300356,43.266786],[-2.300085,43.266611],[-2.299857,43.266464],[-2.299617,43.26632],[-2.299378,43.266179],[-2.299108,43.266032],[-2.298864,43.265907],[-2.298567,43.265755],[-2.298213,43.265588],[-2.297889,43.265434],[-2.297642,43.265318],[-2.297424,43.265212],[-2.297133,43.26507],[-2.296822,43.264915],[-2.296523,43.264752],[-2.296207,43.264572],[-2.295974,43.264425],[-2.295739,43.26427],[-2.295497,43.264095],[-2.295132,43.263802],[-2.294939,43.263635],[-2.294706,43.26342],[-2.294501,43.263209],[-2.294328,43.263023],[-2.29415,43.262826],[-2.293981,43.262633],[-2.293786,43.262412],[-2.293613,43.262213],[-2.293404,43.26199],[-2.293235,43.261831],[-2.29301,43.261633],[-2.292857,43.261507],[-2.292713,43.261399],[-2.292539,43.261276],[-2.292322,43.261137],[-2.292129,43.261022],[-2.291931,43.260913],[-2.291678,43.260787],[-2.291494,43.260704],[-2.291208,43.260578],[-2.290626,43.260349],[-2.290263,43.260212],[-2.289925,43.260091],[-2.289573,43.259971],[-2.289148,43.259829],[-2.288856,43.259748],[-2.28854,43.259648],[-2.288245,43.259564],[-2.287796,43.259462],[-2.287333,43.259377],[-2.286735,43.259308],[-2.286367,43.25929],[-2.285867,43.259285],[-2.285403,43.259313],[-2.285374,43.259315],[-2.284919,43.259362],[-2.284377,43.259456],[-2.283978,43.259551],[-2.283645,43.259636],[-2.283328,43.25975],[-2.282989,43.259876],[-2.282639,43.260026],[-2.282296,43.260187],[-2.281858,43.260423],[-2.281549,43.260608],[-2.281184,43.260844],[-2.280792,43.261116],[-2.280238,43.261486],[-2.27988,43.261721],[-2.279454,43.261976],[-2.278871,43.262289],[-2.278382,43.262525],[-2.278022,43.262682],[-2.277721,43.262807],[-2.27739,43.262939],[-2.277082,43.263056],[-2.276781,43.263166],[-2.276518,43.263268],[-2.276177,43.263399],[-2.275981,43.263475],[-2.275664,43.263601],[-2.275424,43.2637],[-2.275196,43.263801],[-2.274949,43.263912],[-2.2747,43.264029],[-2.274462,43.264147],[-2.274245,43.26426],[-2.273975,43.264402],[-2.273669,43.264572],[-2.273272,43.264806],[-2.273,43.264973],[-2.272696,43.26518],[-2.27239,43.265389],[-2.272131,43.265584],[-2.271944,43.265724],[-2.271771,43.265852],[-2.271629,43.265977],[-2.271497,43.266085],[-2.271392,43.266183],[-2.271157,43.266403],[-2.271081,43.266487],[-2.270983,43.266587],[-2.270843,43.266745],[-2.270648,43.266967],[-2.270473,43.267176],[-2.270373,43.267305],[-2.270262,43.267447],[-2.270185,43.267545],[-2.27009,43.267672],[-2.269982,43.267811],[-2.269752,43.268119],[-2.269581,43.268335],[-2.269418,43.268535],[-2.269281,43.268701],[-2.2692,43.268795],[-2.269087,43.268924],[-2.268958,43.269058],[-2.268826,43.269193],[-2.268705,43.269309],[-2.268573,43.269431],[-2.268385,43.269589],[-2.268214,43.269726],[-2.268086,43.26982],[-2.267907,43.269949],[-2.267679,43.270099],[-2.267428,43.270246],[-2.267191,43.270376],[-2.26701,43.270469],[-2.26682,43.270559],[-2.26663,43.270645],[-2.266474,43.27071],[-2.266337,43.270764],[-2.2662,43.270815],[-2.266021,43.270881],[-2.265844,43.270938],[-2.265672,43.27099],[-2.265342,43.271083],[-2.265001,43.271163],[-2.264655,43.271235],[-2.264413,43.271273],[-2.264169,43.271307],[-2.263904,43.271338],[-2.263658,43.27136],[-2.263401,43.271376],[-2.263162,43.27139],[-2.262774,43.271405],[-2.26261,43.271413],[-2.262323,43.271422],[-2.261985,43.27143],[-2.261626,43.271442],[-2.261291,43.271459],[-2.26101,43.271474],[-2.260713,43.271498],[-2.26049,43.271521],[-2.260283,43.271545],[-2.260093,43.271575],[-2.259862,43.271612],[-2.259677,43.271648],[-2.259419,43.271705],[-2.259266,43.271747],[-2.259008,43.271815],[-2.258815,43.27187],[-2.258641,43.271929],[-2.258463,43.27199],[-2.258284,43.272059],[-2.257972,43.272193],[-2.257764,43.272287],[-2.257564,43.272384],[-2.257387,43.272479],[-2.257202,43.272589],[-2.256947,43.272742],[-2.256769,43.272867],[-2.256611,43.272986],[-2.256465,43.273106],[-2.256345,43.273218],[-2.256206,43.273355],[-2.256091,43.273475],[-2.256006,43.273573],[-2.255922,43.273677],[-2.255849,43.273772],[-2.255778,43.273876],[-2.255704,43.273991],[-2.255641,43.274099],[-2.255548,43.274286],[-2.255483,43.27444],[-2.255423,43.274594],[-2.255386,43.274699],[-2.255335,43.27489],[-2.255295,43.275028],[-2.255261,43.275167],[-2.255223,43.275317],[-2.255183,43.275479],[-2.255128,43.275679],[-2.25509,43.275788],[-2.255038,43.275935],[-2.25497,43.276076],[-2.254893,43.276219],[-2.254788,43.276374],[-2.254716,43.276468],[-2.254591,43.276613],[-2.254463,43.276744],[-2.254326,43.276884],[-2.254058,43.277077],[-2.253764,43.277259],[-2.253473,43.27741],[-2.253137,43.27755],[-2.252956,43.277609],[-2.252767,43.277656],[-2.252604,43.277692],[-2.252409,43.277731],[-2.25222,43.277762],[-2.252038,43.277783],[-2.25181,43.277797],[-2.251603,43.277804],[-2.251411,43.277803],[-2.251202,43.277795],[-2.250981,43.277778],[-2.250695,43.27775],[-2.250499,43.277728],[-2.250225,43.277698],[-2.24981,43.277657],[-2.249508,43.277642],[-2.249021,43.277614],[-2.248539,43.277601],[-2.248063,43.277614],[-2.247584,43.277636],[-2.24715,43.277665],[-2.246679,43.277712],[-2.246262,43.277761],[-2.245891,43.277812],[-2.245485,43.277871],[-2.245017,43.277954],[-2.244534,43.278044],[-2.244,43.278161],[-2.243519,43.27828],[-2.24302,43.278408],[-2.242546,43.278549],[-2.242056,43.278703],[-2.241616,43.278866],[-2.241259,43.279021],[-2.240829,43.279226],[-2.240391,43.279462],[-2.240048,43.279691],[-2.239808,43.279858],[-2.239491,43.280096],[-2.239203,43.280322],[-2.238599,43.280868],[-2.238504,43.280957],[-2.23838,43.281072],[-2.237971,43.281454],[-2.237924,43.281498],[-2.237476,43.281905],[-2.236988,43.282312],[-2.236695,43.282543],[-2.236331,43.282808],[-2.235898,43.28309],[-2.235573,43.283281],[-2.235247,43.283461],[-2.234804,43.283681],[-2.23428,43.283918],[-2.233853,43.284086],[-2.233433,43.284244],[-2.232821,43.28443],[-2.232345,43.284561],[-2.231718,43.284706],[-2.231301,43.284789],[-2.230872,43.284855],[-2.230454,43.284911],[-2.230004,43.284958],[-2.229461,43.284995],[-2.229074,43.285012],[-2.22844,43.28503],[-2.227865,43.285034],[-2.227419,43.285047],[-2.226853,43.285072],[-2.226538,43.285095],[-2.226023,43.285132],[-2.2258,43.285149],[-2.225236,43.285216],[-2.224602,43.285294],[-2.223952,43.285393],[-2.223402,43.285488],[-2.222928,43.28556],[-2.222372,43.285617],[-2.221799,43.285638],[-2.22141,43.285619],[-2.221023,43.285587],[-2.220475,43.285503],[-2.219952,43.285385],[-2.219568,43.285267],[-2.219259,43.285155],[-2.218906,43.285003],[-2.218491,43.284785],[-2.218263,43.284651],[-2.218022,43.284495],[-2.217803,43.284342],[-2.21716,43.28387],[-2.216804,43.283639],[-2.216463,43.283445],[-2.215991,43.283219],[-2.215632,43.283083],[-2.21512,43.282916],[-2.214619,43.282769],[-2.214374,43.282687],[-2.214059,43.282573],[-2.213705,43.282429],[-2.213384,43.282275],[-2.213084,43.282116],[-2.212303,43.281697],[-2.211892,43.281484],[-2.210913,43.281057],[-2.209675,43.280646],[-2.208293,43.280527],[-2.20698,43.280608],[-2.206209,43.280713],[-2.205291,43.280881],[-2.204881,43.280967],[-2.204308,43.281078],[-2.203213,43.28124],[-2.202587,43.281303],[-2.202068,43.28133],[-2.201187,43.281355],[-2.200274,43.281351],[-2.199584,43.281341],[-2.198896,43.28132],[-2.198063,43.281277],[-2.197461,43.281238],[-2.196795,43.281177],[-2.19627,43.281127],[-2.195615,43.281059],[-2.195088,43.281016],[-2.194571,43.280993],[-2.194051,43.280992],[-2.193589,43.281005],[-2.193078,43.281038],[-2.192306,43.281114],[-2.191672,43.281185],[-2.191175,43.281224],[-2.190673,43.281249],[-2.190167,43.281259],[-2.189637,43.281241],[-2.189391,43.281231],[-2.189077,43.281211],[-2.188504,43.281165],[-2.187981,43.281133],[-2.187623,43.281121],[-2.187218,43.281128],[-2.186864,43.281145],[-2.186475,43.28119],[-2.186102,43.281251],[-2.185752,43.281325],[-2.185369,43.281425],[-2.185059,43.281523],[-2.184304,43.281776],[-2.183814,43.281915],[-2.183384,43.282024],[-2.183148,43.282069],[-2.182876,43.28211],[-2.182611,43.282139],[-2.182263,43.282168],[-2.181833,43.282179],[-2.181548,43.282166],[-2.181181,43.282142],[-2.180681,43.282077],[-2.180289,43.281999],[-2.179845,43.281883],[-2.179578,43.281807],[-2.179272,43.281697],[-2.178893,43.281526],[-2.17871,43.281445],[-2.178234,43.281159],[-2.177701,43.28079],[-2.177243,43.280444],[-2.176843,43.280177],[-2.176364,43.279881],[-2.175992,43.279672],[-2.175619,43.279476],[-2.175321,43.279336],[-2.175027,43.27921],[-2.174586,43.279045],[-2.174077,43.278864],[-2.173722,43.278762],[-2.173288,43.278648],[-2.172893,43.278559],[-2.172476,43.278484],[-2.172121,43.278426],[-2.171873,43.278391],[-2.171506,43.278347],[-2.171131,43.278317],[-2.17061,43.278286],[-2.170124,43.278285],[-2.169842,43.278286],[-2.169441,43.278301],[-2.169102,43.278327],[-2.168751,43.278356],[-2.168382,43.278403],[-2.167994,43.27846],[-2.167648,43.278527],[-2.16749,43.278557],[-2.167372,43.278579],[-2.166978,43.27867],[-2.166681,43.278744],[-2.166572,43.278778],[-2.165601,43.279078],[-2.165119,43.279233],[-2.164337,43.279461],[-2.163934,43.279546],[-2.163609,43.279608],[-2.163327,43.279655],[-2.163011,43.279711],[-2.162619,43.279757],[-2.162254,43.27977],[-2.161715,43.279787],[-2.1611,43.279769],[-2.160138,43.279662],[-2.159098,43.279455],[-2.158296,43.279341],[-2.157391,43.279322],[-2.156198,43.279162],[-2.155407,43.279066],[-2.155013,43.279026],[-2.154658,43.278996],[-2.154287,43.278968],[-2.15388,43.278941],[-2.153243,43.278917],[-2.152819,43.27891],[-2.152327,43.278912],[-2.151881,43.278921],[-2.151401,43.278941],[-2.150947,43.278969],[-2.150318,43.279037],[-2.149715,43.27914],[-2.149384,43.279216],[-2.14906,43.279298],[-2.148515,43.279477],[-2.148099,43.279639],[-2.147828,43.279767],[-2.147574,43.27989],[-2.147247,43.280078],[-2.146748,43.280403],[-2.146484,43.280601],[-2.146426,43.280652],[-2.146182,43.280866],[-2.145809,43.281235],[-2.14574,43.281304],[-2.145429,43.281617],[-2.144922,43.282091],[-2.144598,43.282321],[-2.14427,43.282533],[-2.144001,43.282683],[-2.143568,43.282885],[-2.143249,43.283007],[-2.142949,43.283107],[-2.142462,43.28324],[-2.141976,43.283342],[-2.141509,43.283401],[-2.141155,43.283426],[-2.140719,43.283435],[-2.14027,43.283412],[-2.139743,43.283356],[-2.138424,43.283181],[-2.137856,43.283127],[-2.137353,43.283109],[-2.136912,43.283117],[-2.135907,43.283158],[-2.13532,43.283168],[-2.134855,43.283162],[-2.13438,43.283145],[-2.133928,43.283112],[-2.133314,43.283056],[-2.13192,43.2829],[-2.129391,43.282637],[-2.128302,43.282528],[-2.126469,43.282331],[-2.125237,43.282213],[-2.124635,43.282159],[-2.124085,43.282116],[-2.123471,43.282112],[-2.123005,43.282119],[-2.12239,43.28215],[-2.121943,43.282181],[-2.121453,43.282234],[-2.120967,43.282271],[-2.120485,43.282302],[-2.120094,43.282305],[-2.119677,43.282289],[-2.119267,43.282257],[-2.118773,43.282175],[-2.118189,43.282037],[-2.11767,43.281869],[-2.117251,43.281721],[-2.116898,43.281599],[-2.116485,43.281464],[-2.115995,43.281336],[-2.115504,43.281235],[-2.115084,43.281179],[-2.114682,43.281133],[-2.114362,43.281119],[-2.113784,43.281111],[-2.113078,43.281147],[-2.112802,43.281165],[-2.112711,43.28117],[-2.112083,43.28124],[-2.111546,43.281308],[-2.111416,43.281327],[-2.110977,43.281394],[-2.110322,43.281507],[-2.107738,43.282142],[-2.1054,43.282848],[-2.103799,43.283189],[-2.102815,43.283461],[-2.100996,43.284133],[-2.099826,43.284562],[-2.097889,43.285061],[-2.097209,43.285252],[-2.096006,43.285766],[-2.094703,43.286358],[-2.094279,43.286499],[-2.09382,43.28662],[-2.093427,43.286691],[-2.093084,43.286734],[-2.092669,43.286771],[-2.092268,43.286782],[-2.091811,43.286768],[-2.091309,43.286724],[-2.090803,43.286661],[-2.090199,43.286581],[-2.089593,43.286526],[-2.088997,43.286513],[-2.088596,43.286536],[-2.088067,43.286585],[-2.087644,43.286654],[-2.087235,43.286746],[-2.086845,43.286858],[-2.085964,43.287113],[-2.085397,43.287274],[-2.084772,43.287423],[-2.083973,43.287585],[-2.083113,43.287737],[-2.082256,43.287878],[-2.081082,43.288085],[-2.080003,43.288356],[-2.079279,43.288569],[-2.078202,43.288925],[-2.075037,43.290271],[-2.074284,43.290519],[-2.072639,43.290996],[-2.070547,43.291414],[-2.069362,43.291652],[-2.067856,43.292069],[-2.066989,43.292362],[-2.065572,43.293004],[-2.064178,43.293765],[-2.063429,43.294161],[-2.062996,43.294359],[-2.062471,43.294557],[-2.061911,43.294725],[-2.061458,43.294832],[-2.061373,43.294852],[-2.060619,43.294974],[-2.060244,43.295011],[-2.05971,43.295055],[-2.058914,43.295027],[-2.058187,43.294982],[-2.057727,43.294943],[-2.05719,43.294898],[-2.056559,43.294866],[-2.056067,43.294868],[-2.055553,43.294885],[-2.054581,43.294934],[-2.053978,43.294924],[-2.05356,43.294884],[-2.05311,43.294798],[-2.052663,43.29468],[-2.052228,43.294513],[-2.051457,43.294171],[-2.051082,43.294025],[-2.050636,43.293879],[-2.050192,43.293784],[-2.049743,43.293719],[-2.049308,43.293685],[-2.048675,43.293702],[-2.04778,43.293763],[-2.047285,43.293792],[-2.04657,43.293764],[-2.046114,43.293696],[-2.045505,43.293569],[-2.044776,43.293353],[-2.044584,43.293296],[-2.044,43.29312],[-2.043394,43.292987],[-2.042735,43.292915],[-2.041781,43.292809],[-2.040834,43.292703],[-2.040201,43.292579],[-2.039679,43.292442],[-2.039153,43.292227],[-2.038507,43.291842],[-2.038086,43.291484],[-2.037748,43.29109],[-2.037477,43.29055],[-2.037367,43.290272],[-2.037258,43.289951],[-2.037222,43.289817],[-2.036952,43.288819],[-2.0367,43.288105],[-2.036355,43.287532],[-2.035998,43.287074],[-2.035385,43.28649],[-2.034936,43.286176],[-2.034558,43.285951],[-2.034257,43.285789],[-2.033589,43.285476],[-2.032753,43.28517],[-2.031831,43.284882],[-2.031084,43.284634],[-2.029909,43.284309],[-2.028963,43.284017],[-2.027705,43.283626],[-2.027161,43.283424],[-2.026576,43.283164],[-2.025958,43.282843],[-2.025329,43.282476],[-2.024421,43.281801],[-2.023482,43.281048],[-2.023005,43.280718],[-2.022533,43.280434],[-2.022149,43.280232],[-2.021725,43.280033],[-2.02125,43.27984],[-2.02098,43.279742],[-2.020672,43.279643],[-2.020271,43.279527],[-2.019882,43.279426],[-2.018552,43.279094],[-2.017568,43.278825],[-2.017039,43.278671],[-2.016609,43.278535],[-2.016042,43.278331],[-2.014933,43.277839],[-2.014477,43.277635],[-2.013827,43.277394],[-2.01307,43.277117],[-2.01238,43.276872],[-2.011725,43.276651],[-2.010848,43.276412],[-2.010207,43.276254],[-2.009235,43.276044],[-2.007896,43.275818],[-2.006046,43.275648],[-2.005183,43.275623],[-2.003874,43.275617],[-2.002853,43.275707],[-2.002027,43.27578],[-2.001724,43.275807],[-2.000744,43.275933],[-2.000523,43.275962],[-1.999266,43.276193],[-1.998186,43.276447],[-1.997362,43.27667],[-1.996554,43.276928],[-1.995689,43.277233],[-1.993589,43.277985],[-1.993138,43.27814],[-1.992809,43.27825],[-1.992168,43.278443],[-1.991355,43.278648],[-1.990509,43.278847],[-1.989666,43.278995],[-1.988941,43.279109],[-1.988094,43.279207],[-1.987315,43.279261],[-1.986564,43.279313],[-1.985779,43.279336],[-1.984575,43.279319],[-1.983663,43.279253],[-1.983255,43.279223],[-1.982088,43.279101],[-1.980822,43.278878],[-1.979319,43.278581],[-1.977987,43.278315],[-1.976962,43.278112],[-1.97637,43.277989],[-1.974897,43.277687],[-1.973203,43.277351],[-1.972102,43.277119],[-1.971665,43.277034],[-1.969911,43.276784],[-1.969195,43.276757],[-1.968532,43.276771],[-1.967763,43.276824],[-1.967266,43.276889],[-1.966792,43.276969],[-1.966014,43.277135],[-1.965308,43.277303],[-1.964348,43.277657],[-1.963747,43.277991],[-1.963508,43.27816],[-1.963111,43.278443],[-1.96253,43.278892],[-1.96213,43.279298],[-1.961832,43.279572],[-1.961559,43.279864],[-1.96113,43.280361],[-1.96081,43.280763],[-1.960341,43.281356],[-1.960232,43.281494],[-1.960092,43.281669],[-1.959869,43.281915],[-1.959429,43.282419],[-1.958998,43.282846],[-1.958806,43.283031],[-1.958606,43.283214],[-1.958328,43.283468],[-1.957975,43.283742],[-1.957615,43.284024],[-1.957289,43.284245],[-1.957009,43.284435],[-1.956623,43.284694],[-1.956002,43.285088],[-1.955572,43.28535],[-1.955002,43.285659],[-1.954381,43.285969],[-1.953811,43.286221],[-1.953407,43.286388],[-1.952439,43.286745],[-1.951701,43.286988],[-1.950962,43.287198],[-1.95016,43.287401],[-1.949226,43.287595],[-1.948368,43.287746],[-1.947304,43.287926],[-1.946321,43.288078],[-1.945101,43.288266],[-1.94466,43.288337],[-1.943113,43.288592],[-1.942454,43.288687],[-1.941867,43.288748],[-1.941774,43.288754],[-1.941296,43.288786],[-1.9404,43.288802],[-1.940374,43.288803],[-1.939075,43.288795],[-1.938057,43.288771],[-1.936893,43.288724],[-1.935491,43.288627],[-1.934817,43.288589],[-1.934121,43.288514],[-1.933486,43.288415],[-1.932921,43.288303],[-1.93232,43.288142],[-1.931416,43.287852],[-1.930438,43.287489],[-1.929705,43.287166],[-1.929161,43.286923],[-1.928693,43.286686],[-1.927839,43.286236],[-1.927017,43.285795],[-1.926445,43.285466],[-1.92594,43.2852],[-1.925357,43.28492],[-1.924634,43.284605],[-1.923834,43.284287],[-1.922946,43.284013],[-1.922311,43.283834],[-1.921206,43.283561],[-1.920223,43.283389],[-1.919866,43.283345],[-1.919518,43.283301],[-1.919389,43.283289],[-1.918885,43.28324],[-1.918185,43.283181],[-1.917365,43.28315],[-1.916548,43.283156],[-1.915999,43.283165],[-1.915193,43.283219],[-1.914413,43.2833],[-1.913426,43.283443],[-1.912604,43.283601],[-1.912295,43.283668],[-1.911028,43.283994],[-1.909988,43.28432],[-1.90922,43.28464],[-1.908444,43.284997],[-1.907731,43.285343],[-1.906934,43.285791],[-1.905847,43.286558],[-1.90491,43.287307],[-1.903952,43.288238],[-1.903426,43.288835],[-1.902847,43.289605],[-1.902608,43.289978],[-1.902055,43.291085],[-1.90175,43.29181],[-1.901622,43.292304],[-1.901517,43.292764],[-1.901375,43.293444],[-1.901296,43.29405],[-1.901279,43.294595],[-1.901327,43.295189],[-1.901338,43.295748],[-1.901345,43.296345],[-1.901326,43.296913],[-1.901205,43.297432],[-1.900988,43.298026],[-1.900718,43.298539],[-1.900455,43.298915],[-1.900061,43.299417],[-1.899633,43.299845],[-1.899086,43.300244],[-1.898254,43.300953],[-1.897675,43.301692],[-1.897243,43.30235],[-1.897002,43.302668],[-1.896931,43.302749],[-1.896729,43.302982],[-1.89642,43.303276],[-1.896043,43.303577],[-1.895784,43.303736],[-1.895558,43.303868],[-1.89536,43.303977],[-1.895167,43.304071],[-1.894971,43.304156],[-1.894832,43.304209],[-1.894731,43.304247],[-1.894485,43.304327],[-1.894437,43.304341],[-1.894241,43.304399],[-1.894001,43.304463],[-1.893767,43.304518],[-1.893608,43.304547],[-1.893548,43.304558],[-1.89321,43.304608],[-1.892726,43.304671],[-1.892556,43.304698],[-1.89218,43.304757],[-1.891732,43.304847],[-1.891316,43.304986],[-1.891014,43.305071],[-1.890709,43.305165],[-1.890362,43.305298],[-1.889968,43.305474],[-1.889547,43.305699],[-1.888878,43.306121],[-1.888577,43.306313],[-1.888234,43.306506],[-1.887687,43.306795],[-1.887174,43.307013],[-1.886628,43.307193],[-1.886078,43.307336],[-1.885514,43.307428],[-1.88507,43.30746],[-1.884718,43.307482],[-1.884469,43.307488],[-1.8842,43.307477],[-1.883874,43.307461],[-1.883583,43.307428],[-1.883349,43.307398],[-1.883019,43.307355],[-1.882445,43.307252],[-1.882083,43.307164],[-1.881699,43.307072],[-1.881192,43.306961],[-1.880722,43.306885],[-1.880416,43.306848],[-1.880153,43.306832],[-1.879928,43.306822],[-1.879636,43.306815],[-1.879459,43.306827],[-1.879113,43.306841],[-1.878782,43.306879],[-1.878444,43.306929],[-1.878066,43.307001],[-1.877476,43.307157],[-1.877101,43.307293],[-1.876795,43.307416],[-1.876269,43.307677],[-1.87594,43.307881],[-1.875688,43.308062],[-1.875392,43.308297],[-1.875097,43.308581],[-1.874889,43.308813],[-1.874758,43.308982],[-1.874616,43.30918],[-1.87448,43.309417],[-1.874339,43.309669],[-1.874222,43.309894],[-1.874075,43.310159],[-1.87388,43.310509],[-1.873726,43.310767],[-1.873509,43.311082],[-1.873293,43.311365],[-1.873089,43.311622],[-1.872857,43.311871],[-1.872575,43.312165],[-1.872287,43.312436],[-1.871921,43.312754],[-1.871508,43.31307],[-1.87113,43.313325],[-1.870806,43.313524],[-1.870515,43.313698],[-1.870124,43.313901],[-1.869625,43.314152],[-1.869208,43.31433],[-1.868685,43.314532],[-1.868283,43.314676],[-1.867748,43.314842],[-1.867225,43.314974],[-1.866717,43.315091],[-1.866115,43.315201],[-1.865448,43.315293],[-1.864832,43.315348],[-1.864216,43.315372],[-1.863667,43.315394],[-1.863076,43.315418],[-1.862716,43.315444],[-1.862214,43.315488],[-1.861824,43.31555],[-1.861374,43.315647],[-1.860949,43.315758],[-1.860486,43.315907],[-1.860061,43.316056],[-1.859547,43.316235],[-1.859068,43.316398],[-1.858502,43.316551],[-1.858086,43.316634],[-1.857541,43.316706],[-1.857274,43.316725],[-1.856951,43.316738],[-1.8565,43.316742],[-1.856267,43.31674],[-1.856102,43.316731],[-1.855883,43.316715],[-1.855629,43.316686],[-1.855284,43.316648],[-1.855037,43.31662],[-1.854756,43.316585],[-1.854532,43.316561],[-1.854301,43.316537],[-1.854101,43.31652],[-1.853851,43.316511],[-1.853567,43.316503],[-1.853362,43.316499],[-1.853166,43.316504],[-1.853011,43.316508],[-1.852797,43.316526],[-1.852629,43.316544],[-1.852468,43.316564],[-1.852293,43.31659],[-1.852078,43.316624],[-1.851825,43.316671],[-1.85159,43.316721],[-1.851254,43.316808],[-1.850965,43.316891],[-1.850732,43.31696],[-1.850468,43.317046],[-1.850226,43.317128],[-1.849946,43.317218],[-1.849688,43.317294],[-1.849368,43.317384],[-1.849028,43.317468],[-1.848721,43.317533],[-1.84847,43.317577],[-1.84822,43.317611],[-1.847968,43.317632],[-1.847682,43.317647],[-1.847436,43.317655],[-1.847163,43.317657],[-1.846924,43.317649],[-1.846646,43.317632],[-1.846354,43.317598],[-1.846111,43.317562],[-1.84585,43.317523],[-1.845556,43.31747],[-1.845323,43.317424],[-1.845086,43.317371],[-1.844952,43.317338],[-1.844744,43.317297],[-1.844476,43.317242],[-1.844243,43.317196],[-1.844012,43.317156],[-1.843762,43.317117],[-1.843473,43.317082],[-1.843219,43.317057],[-1.842972,43.317041],[-1.842658,43.317034],[-1.842309,43.317036],[-1.842078,43.317041],[-1.841759,43.317069],[-1.841424,43.317106],[-1.841166,43.317145],[-1.840893,43.317198],[-1.840639,43.317251],[-1.840436,43.317307],[-1.84016,43.317385],[-1.839891,43.317469],[-1.839639,43.31756],[-1.839282,43.317687],[-1.838749,43.317884],[-1.838212,43.318093],[-1.837756,43.318217],[-1.837338,43.318316],[-1.837021,43.318383],[-1.836409,43.318491],[-1.835982,43.318529],[-1.83538,43.318568],[-1.834432,43.318723],[-1.833548,43.318845],[-1.83233,43.319014],[-1.831229,43.319193],[-1.831031,43.31923],[-1.830643,43.3193],[-1.830071,43.319407],[-1.829738,43.31949],[-1.829419,43.31958],[-1.829038,43.319712],[-1.828708,43.319846],[-1.828394,43.319981],[-1.828143,43.320108],[-1.827884,43.320256],[-1.827652,43.320401],[-1.827438,43.320549],[-1.827253,43.320686],[-1.826984,43.320911],[-1.826778,43.321103],[-1.826462,43.321434],[-1.825758,43.322173],[-1.825389,43.322498],[-1.82502,43.322791],[-1.824559,43.323104],[-1.823968,43.323429],[-1.823613,43.323586],[-1.823139,43.323779],[-1.82256,43.323963],[-1.82181,43.324148],[-1.82105,43.324299],[-1.820197,43.324474],[-1.819452,43.324638],[-1.818778,43.324819],[-1.818064,43.325041],[-1.817676,43.325172],[-1.817605,43.325196],[-1.81722,43.325341],[-1.816799,43.325508],[-1.816523,43.325634],[-1.816101,43.325831],[-1.815909,43.325922],[-1.815285,43.326225],[-1.8145,43.3266],[-1.814034,43.326793],[-1.813578,43.326957],[-1.8131,43.327112],[-1.812433,43.327291],[-1.81206,43.327368],[-1.811368,43.327501],[-1.810686,43.327581],[-1.810084,43.327614],[-1.809406,43.327631],[-1.808753,43.327655],[-1.80828,43.327668],[-1.807704,43.327719],[-1.80714,43.3278],[-1.806594,43.327906],[-1.806181,43.328022],[-1.80584,43.328122],[-1.805395,43.328293],[-1.805192,43.328382],[-1.805073,43.328434],[-1.804766,43.328583],[-1.804353,43.3288],[-1.803949,43.329038],[-1.803527,43.329262],[-1.803051,43.329509],[-1.802575,43.329731],[-1.802178,43.329893],[-1.801593,43.330107],[-1.801256,43.330214],[-1.800891,43.330329],[-1.800496,43.330439],[-1.800192,43.330514],[-1.799997,43.330558],[-1.799784,43.330605],[-1.799624,43.330636],[-1.799505,43.33066],[-1.799103,43.330723],[-1.798686,43.330774],[-1.79812,43.330827],[-1.797659,43.330857],[-1.797233,43.330869],[-1.796749,43.330876],[-1.79624,43.330864],[-1.79571,43.330834],[-1.795059,43.330773],[-1.79414,43.330642],[-1.793507,43.330552],[-1.792863,43.330471],[-1.792296,43.330444],[-1.791828,43.330445],[-1.791396,43.330461],[-1.790914,43.330504],[-1.790528,43.330567],[-1.790235,43.33062],[-1.78983,43.330714],[-1.789379,43.330833],[-1.788958,43.330976],[-1.788623,43.331089],[-1.788258,43.331221],[-1.787812,43.331363],[-1.787472,43.331454],[-1.787113,43.331553],[-1.786772,43.331625],[-1.786328,43.331704],[-1.785843,43.331774],[-1.785395,43.331812],[-1.784929,43.331849],[-1.784435,43.331867],[-1.783847,43.331871],[-1.783255,43.331873],[-1.782694,43.33189],[-1.782347,43.331929],[-1.781925,43.331972],[-1.781367,43.332073],[-1.780864,43.332222],[-1.780425,43.332358],[-1.779869,43.332588],[-1.779413,43.332817],[-1.778835,43.333167],[-1.778369,43.333455],[-1.777892,43.333739],[-1.777593,43.333918],[-1.777213,43.334104],[-1.776393,43.334464],[-1.775862,43.334662],[-1.775472,43.334798],[-1.775196,43.33488],[-1.774869,43.334972],[-1.774484,43.335066],[-1.774083,43.335154],[-1.773691,43.335231],[-1.773309,43.335294],[-1.772979,43.335338],[-1.772564,43.335391],[-1.772169,43.335418],[-1.771719,43.335447],[-1.771236,43.335462],[-1.77081,43.335469],[-1.770481,43.33547],[-1.770048,43.33548],[-1.769519,43.335511],[-1.769133,43.335557],[-1.768772,43.335613],[-1.768367,43.335689],[-1.767959,43.335786],[-1.767581,43.335894],[-1.767238,43.33601],[-1.766969,43.336116],[-1.766688,43.336236],[-1.766379,43.336388],[-1.766006,43.336584],[-1.765709,43.336746],[-1.765371,43.336921],[-1.765008,43.337106],[-1.764585,43.337294],[-1.764133,43.337462],[-1.763632,43.337617],[-1.763339,43.337687],[-1.762999,43.337755],[-1.762717,43.337804],[-1.762243,43.337867],[-1.761822,43.337907],[-1.761512,43.337941],[-1.761096,43.337976],[-1.760645,43.338037],[-1.760193,43.338095],[-1.759848,43.338153],[-1.759315,43.338257],[-1.758741,43.338387],[-1.758127,43.338521],[-1.75738,43.338684],[-1.756892,43.338803],[-1.756496,43.338886],[-1.756041,43.338985],[-1.755626,43.339094],[-1.755118,43.339217],[-1.754659,43.339316],[-1.754332,43.33939],[-1.753254,43.339637],[-1.752588,43.339785],[-1.752011,43.339917],[-1.751453,43.340041],[-1.750729,43.340321],[-1.749978,43.340688],[-1.74968,43.34083],[-1.749552,43.340897],[-1.749389,43.340984],[-1.749237,43.341053],[-1.748631,43.341327],[-1.748338,43.341404],[-1.747978,43.341448],[-1.747596,43.341466],[-1.746806,43.341417],[-1.746621,43.341405],[-1.746265,43.34138],[-1.744406,43.341253],[-1.742512,43.341113],[-1.738314,43.340812],[-1.736897,43.340838],[-1.735458,43.340937],[-1.733909,43.341007],[-1.732614,43.340969],[-1.731409,43.340983],[-1.730082,43.341192],[-1.728865,43.341545],[-1.727254,43.34209],[-1.725578,43.34283],[-1.724218,43.343561],[-1.723386,43.344171],[-1.722644,43.344923],[-1.721755,43.346088],[-1.721164,43.346801],[-1.720303,43.347609],[-1.718568,43.348989],[-1.717926,43.34984],[-1.717655,43.350661],[-1.717572,43.351434],[-1.71753,43.353063],[-1.717438,43.353853],[-1.717198,43.354639],[-1.716816,43.35532],[-1.716184,43.356057],[-1.715354,43.356723],[-1.714474,43.357228],[-1.713221,43.357715],[-1.711095,43.358176],[-1.709565,43.358435],[-1.708308,43.358521],[-1.707025,43.3585],[-1.705664,43.358424],[-1.704157,43.358393],[-1.703264,43.358421],[-1.702314,43.358496],[-1.701389,43.358581],[-1.700669,43.358725],[-1.698951,43.359134],[-1.698204,43.359358],[-1.697337,43.359666],[-1.695484,43.360404],[-1.693584,43.361347],[-1.692706,43.361828],[-1.692183,43.362136],[-1.691633,43.362458],[-1.691315,43.362668],[-1.690151,43.363489],[-1.687798,43.365295],[-1.685831,43.366788],[-1.683933,43.368091],[-1.682284,43.369109],[-1.680727,43.370014],[-1.679911,43.370418],[-1.679023,43.370829],[-1.678096,43.371192],[-1.676866,43.371649],[-1.67571,43.372115],[-1.674399,43.372562],[-1.671706,43.373519],[-1.669839,43.374182],[-1.668746,43.374508],[-1.667634,43.37472],[-1.666348,43.374882],[-1.665188,43.374892],[-1.663959,43.374812],[-1.662748,43.374631],[-1.661533,43.374382],[-1.66043,43.374049],[-1.65929,43.373769],[-1.658113,43.37356],[-1.657076,43.373434],[-1.656559,43.373397],[-1.655741,43.373409],[-1.655073,43.373451],[-1.654233,43.373571],[-1.653472,43.373712],[-1.652789,43.373867],[-1.651868,43.374162],[-1.650929,43.374527],[-1.650018,43.375026],[-1.649161,43.375597],[-1.647242,43.377165],[-1.646289,43.378125],[-1.645455,43.379218],[-1.64495,43.380143],[-1.644583,43.380903],[-1.644256,43.381867],[-1.643859,43.383172],[-1.64355,43.383901],[-1.643074,43.384918],[-1.641547,43.387572],[-1.640909,43.388632],[-1.640441,43.389323],[-1.639394,43.390652],[-1.638838,43.39135],[-1.638188,43.392309],[-1.637941,43.392797],[-1.637642,43.393413],[-1.637447,43.394129],[-1.637256,43.394995],[-1.637099,43.396489],[-1.637027,43.39702],[-1.636913,43.397628],[-1.636765,43.398236],[-1.636452,43.399059],[-1.635975,43.399984],[-1.635327,43.400867],[-1.634707,43.401569],[-1.633938,43.402298],[-1.633109,43.402961],[-1.632171,43.403665],[-1.631389,43.404166],[-1.630539,43.404687],[-1.62934,43.405322],[-1.627532,43.406258],[-1.626236,43.406896],[-1.625196,43.407401],[-1.624287,43.407912],[-1.623404,43.408462],[-1.622297,43.409176],[-1.621487,43.409684],[-1.620908,43.409985],[-1.620207,43.410323],[-1.619549,43.410606],[-1.618394,43.411036],[-1.61714,43.411504],[-1.616537,43.411763],[-1.615979,43.412051],[-1.615239,43.41247],[-1.613998,43.413295],[-1.612323,43.414381],[-1.611809,43.414661],[-1.611218,43.414932],[-1.610524,43.415185],[-1.609795,43.4154],[-1.607563,43.41599],[-1.606605,43.416258],[-1.605625,43.416628],[-1.604797,43.417046],[-1.603817,43.417608],[-1.601978,43.418712],[-1.601165,43.419313],[-1.600549,43.41985],[-1.600237,43.420178],[-1.599441,43.42095],[-1.598593,43.421772],[-1.598114,43.422205],[-1.597611,43.422625],[-1.597202,43.422933],[-1.596759,43.423251],[-1.596363,43.423523],[-1.595962,43.423774],[-1.595341,43.424146],[-1.594634,43.42453],[-1.5931,43.425325],[-1.591606,43.426105],[-1.590572,43.426646],[-1.589535,43.427223],[-1.589168,43.427458],[-1.587585,43.4286],[-1.586483,43.429314],[-1.585424,43.429841],[-1.584398,43.430237],[-1.583444,43.430532],[-1.583383,43.430551],[-1.57885,43.431716],[-1.577704,43.432045],[-1.576626,43.432419],[-1.576093,43.432659],[-1.574913,43.433331],[-1.574201,43.433819],[-1.573663,43.434255],[-1.573077,43.434807],[-1.572554,43.435402],[-1.572031,43.436124],[-1.571463,43.436941],[-1.571012,43.43759],[-1.570585,43.438087],[-1.569939,43.438722],[-1.569058,43.439561],[-1.568324,43.440337],[-1.567739,43.441106],[-1.567256,43.441883],[-1.566801,43.442805],[-1.56643,43.443557],[-1.566006,43.444201],[-1.565451,43.444911],[-1.564897,43.445494],[-1.564094,43.446199],[-1.563372,43.446715],[-1.562639,43.447163],[-1.561827,43.447571],[-1.561138,43.447852],[-1.560389,43.448101],[-1.559802,43.448271],[-1.559084,43.448433],[-1.558416,43.448547],[-1.556834,43.448689],[-1.556051,43.448709],[-1.554807,43.448607],[-1.55336,43.448417],[-1.551494,43.448305],[-1.549898,43.448098],[-1.548729,43.447942],[-1.544846,43.44726],[-1.543658,43.447101],[-1.542851,43.447059],[-1.542068,43.447064],[-1.541065,43.447136],[-1.540024,43.447294],[-1.539121,43.447497],[-1.538371,43.447724],[-1.537656,43.448012],[-1.536979,43.448335],[-1.536337,43.448698],[-1.535651,43.449173],[-1.5351,43.449637],[-1.534414,43.450255],[-1.533661,43.450963],[-1.532999,43.451508],[-1.53231,43.452043],[-1.531673,43.452485],[-1.531223,43.452768],[-1.531136,43.452823],[-1.530249,43.453321],[-1.529182,43.453843],[-1.528019,43.45432],[-1.526128,43.455029],[-1.525386,43.455343],[-1.524625,43.455714],[-1.523872,43.456142],[-1.523062,43.456688],[-1.522287,43.457305],[-1.520942,43.458496],[-1.520238,43.459038],[-1.519519,43.459527],[-1.51872,43.459977],[-1.518064,43.460286],[-1.517194,43.460651],[-1.516504,43.460881],[-1.515766,43.461081],[-1.514975,43.461249],[-1.514233,43.461369],[-1.513413,43.461474],[-1.5126,43.46152],[-1.511339,43.461528],[-1.507411,43.461419],[-1.506181,43.461367],[-1.505063,43.461282],[-1.504009,43.461212],[-1.500679,43.46094],[-1.500046,43.460885],[-1.498714,43.460798],[-1.498035,43.460777],[-1.497536,43.460781],[-1.497155,43.460798],[-1.496369,43.460859],[-1.495775,43.460941],[-1.495003,43.461107],[-1.494303,43.461286],[-1.492681,43.461735],[-1.49028,43.462455],[-1.488054,43.463171],[-1.487172,43.463522],[-1.486372,43.463868],[-1.483561,43.465286],[-1.482104,43.466019],[-1.477722,43.468272],[-1.476344,43.468812],[-1.475002,43.469241],[-1.473618,43.46956],[-1.472483,43.469703],[-1.471774,43.469773],[-1.471306,43.469805],[-1.470501,43.469846],[-1.46972,43.469877],[-1.468888,43.46991],[-1.468454,43.469932],[-1.468103,43.46996],[-1.467012,43.470111],[-1.465887,43.470402],[-1.464809,43.470828],[-1.463745,43.471401],[-1.46265,43.472119],[-1.462138,43.472455],[-1.462003,43.472544],[-1.461919,43.472599],[-1.4609,43.473156],[-1.459986,43.473553],[-1.458925,43.473878],[-1.457909,43.474074],[-1.455402,43.474534],[-1.454636,43.474725],[-1.453348,43.475173],[-1.452125,43.475668],[-1.451486,43.475987],[-1.450895,43.476282],[-1.450619,43.476424],[-1.450275,43.476614],[-1.449504,43.477139],[-1.448693,43.477688],[-1.447966,43.478453],[-1.447565,43.479038],[-1.447289,43.479683],[-1.447162,43.480041],[-1.447079,43.480403],[-1.447033,43.480712],[-1.447005,43.481099],[-1.447006,43.481455],[-1.447038,43.481774],[-1.44708,43.482011],[-1.447189,43.482416],[-1.447404,43.483134],[-1.4475,43.483397],[-1.447713,43.484071],[-1.448732,43.487279],[-1.448875,43.487688],[-1.449133,43.488418],[-1.449377,43.489228],[-1.449433,43.489436],[-1.449554,43.489887],[-1.449631,43.490365],[-1.449645,43.49105],[-1.449633,43.491315],[-1.449499,43.491924],[-1.44935,43.492557],[-1.449051,43.493378],[-1.448709,43.494093],[-1.447901,43.495186],[-1.447239,43.495856],[-1.445968,43.496817],[-1.444767,43.497486],[-1.443366,43.498273],[-1.442383,43.498994],[-1.441594,43.499751],[-1.440888,43.500669],[-1.440417,43.501535],[-1.44009,43.502457],[-1.43994,43.503438],[-1.439953,43.504298],[-1.440105,43.505172],[-1.440417,43.506042],[-1.440713,43.506655],[-1.441285,43.507474],[-1.441626,43.507911],[-1.442317,43.508812],[-1.442727,43.509476],[-1.443234,43.510516],[-1.4435,43.511459],[-1.443601,43.51236],[-1.443597,43.512897],[-1.443509,43.513627],[-1.443256,43.51466],[-1.442823,43.515787],[-1.442454,43.516993],[-1.442229,43.518149],[-1.442022,43.519361],[-1.441929,43.519818],[-1.441838,43.52016],[-1.441738,43.520534],[-1.441486,43.521329],[-1.441344,43.521712],[-1.4411,43.522323],[-1.440864,43.522838],[-1.440555,43.523434],[-1.440365,43.52379],[-1.440172,43.524116],[-1.439984,43.524425],[-1.439748,43.524781],[-1.439426,43.525254],[-1.439006,43.525784],[-1.438185,43.526697],[-1.437203,43.527557],[-1.435989,43.528486],[-1.434822,43.529283],[-1.433874,43.530041],[-1.432903,43.530894],[-1.432185,43.531783],[-1.431701,43.532503],[-1.431399,43.533164],[-1.431205,43.533767],[-1.431087,43.53443],[-1.431137,43.535375],[-1.431442,43.536602],[-1.431649,43.537397],[-1.431749,43.537967],[-1.431819,43.538427],[-1.431858,43.539314],[-1.431838,43.539884],[-1.431783,43.540385],[-1.431628,43.541366],[-1.431483,43.542277],[-1.431441,43.542772],[-1.431432,43.54354],[-1.431548,43.544755],[-1.432076,43.546826],[-1.432422,43.548247],[-1.432476,43.549476],[-1.432332,43.551946],[-1.43227,43.55276],[-1.432208,43.553522],[-1.43216,43.553914],[-1.432117,43.554617],[-1.432042,43.55533],[-1.431935,43.555867],[-1.431801,43.556357],[-1.431591,43.556942],[-1.431221,43.557793],[-1.431094,43.558086],[-1.43092,43.558522],[-1.430788,43.558865],[-1.430634,43.559341],[-1.430532,43.559694],[-1.430456,43.56002],[-1.430368,43.560454],[-1.430296,43.560938],[-1.430258,43.561273],[-1.430236,43.561743],[-1.430228,43.562107],[-1.430245,43.562575],[-1.43026,43.562805],[-1.430309,43.563275],[-1.430383,43.563735],[-1.430473,43.5642],[-1.430567,43.564654],[-1.430661,43.565131],[-1.430749,43.565596],[-1.430781,43.565832],[-1.430831,43.566251],[-1.430843,43.56643],[-1.43085,43.56676],[-1.430846,43.567115],[-1.430825,43.567477],[-1.430814,43.567701],[-1.430756,43.568167],[-1.430716,43.568365],[-1.430553,43.569283],[-1.430395,43.570086],[-1.430214,43.570846],[-1.430122,43.571167],[-1.429998,43.571505],[-1.429871,43.571845],[-1.429718,43.572203],[-1.429585,43.572473],[-1.429454,43.572715],[-1.429117,43.573305],[-1.428291,43.574455],[-1.427463,43.575311],[-1.426268,43.5765],[-1.425234,43.577414],[-1.424387,43.578243],[-1.423557,43.579173],[-1.422536,43.580519],[-1.422492,43.580577],[-1.421995,43.581367],[-1.42165,43.581965],[-1.421421,43.582416],[-1.421146,43.583012],[-1.420936,43.583498],[-1.420702,43.58411],[-1.420393,43.585086],[-1.420066,43.586098],[-1.419766,43.587124],[-1.419619,43.587577],[-1.419578,43.587661],[-1.419452,43.58799],[-1.419253,43.588396],[-1.419119,43.588705],[-1.418789,43.589336],[-1.418205,43.590367],[-1.417306,43.59191],[-1.416608,43.593237],[-1.416362,43.593831],[-1.416052,43.594666],[-1.415906,43.595169],[-1.415748,43.595764],[-1.415622,43.596327],[-1.415533,43.596828],[-1.415471,43.597285],[-1.415423,43.597809],[-1.415394,43.598419],[-1.415402,43.598901],[-1.415429,43.59952],[-1.415535,43.600242],[-1.415796,43.601494],[-1.416,43.602456],[-1.416059,43.602941],[-1.416141,43.603654],[-1.416163,43.60453],[-1.416118,43.60527],[-1.416011,43.606039],[-1.415749,43.607048],[-1.415227,43.608632],[-1.414102,43.611522],[-1.413323,43.613086],[-1.412385,43.614342],[-1.411259,43.615479],[-1.410094,43.616393],[-1.408376,43.617475],[-1.407602,43.61793],[-1.406829,43.618415],[-1.406344,43.618742],[-1.405175,43.619628],[-1.405166,43.619635],[-1.404274,43.62037],[-1.403578,43.620966],[-1.402049,43.622456],[-1.401008,43.623349],[-1.400317,43.623938],[-1.399532,43.6247],[-1.397939,43.626362],[-1.396549,43.627518],[-1.395753,43.628143],[-1.39275,43.63075],[-1.391849,43.631511],[-1.390064,43.633128],[-1.3861,43.636465],[-1.384531,43.637797],[-1.383204,43.638812],[-1.381728,43.63984],[-1.380307,43.640687],[-1.378951,43.641412],[-1.377509,43.642101],[-1.375954,43.642791],[-1.37517,43.643139],[-1.374416,43.643473],[-1.372961,43.644217],[-1.371311,43.645106],[-1.370043,43.64588],[-1.368908,43.646547],[-1.367373,43.647277],[-1.365677,43.647965],[-1.364039,43.648377],[-1.362273,43.648741],[-1.360189,43.648918],[-1.358637,43.648889],[-1.356708,43.648812],[-1.355593,43.648809],[-1.354062,43.648908],[-1.352514,43.649134],[-1.350984,43.64948],[-1.349581,43.64992],[-1.348021,43.650559],[-1.346661,43.651223],[-1.345243,43.651887],[-1.343518,43.652461],[-1.34191,43.652852],[-1.340162,43.653203],[-1.338524,43.653617],[-1.336591,43.654242],[-1.334569,43.655143],[-1.333969,43.655471],[-1.333465,43.655775],[-1.333054,43.656026],[-1.332601,43.656335],[-1.331974,43.656791],[-1.331638,43.657069],[-1.3308,43.657717],[-1.329978,43.658428],[-1.329204,43.6591],[-1.327592,43.660644],[-1.326229,43.662131],[-1.324964,43.663651],[-1.323397,43.665708],[-1.322034,43.66752],[-1.320543,43.669366],[-1.319085,43.671011],[-1.317433,43.67261],[-1.315919,43.673831],[-1.315045,43.674528],[-1.314308,43.675115],[-1.31256,43.676313],[-1.310832,43.677315],[-1.308641,43.678319],[-1.306502,43.679052],[-1.30566,43.679304],[-1.304382,43.679687],[-1.302292,43.680106],[-1.300066,43.680409],[-1.297957,43.680562],[-1.293459,43.680698],[-1.291312,43.680787],[-1.289198,43.68096],[-1.287627,43.681106],[-1.28672,43.681238],[-1.283305,43.681817],[-1.281821,43.682036],[-1.280465,43.682191],[-1.279141,43.682306],[-1.277862,43.682392],[-1.275118,43.682495],[-1.271692,43.68262],[-1.269638,43.682786],[-1.268122,43.682968],[-1.266703,43.683194],[-1.265322,43.683459],[-1.26404,43.683749],[-1.262498,43.684164],[-1.26117,43.684578],[-1.258035,43.685663],[-1.255333,43.686566],[-1.252486,43.687362],[-1.248691,43.688356],[-1.246214,43.689098],[-1.243137,43.690209],[-1.24084,43.691061],[-1.239503,43.691518],[-1.238255,43.691916],[-1.235399,43.692833],[-1.234272,43.693319],[-1.233221,43.693883],[-1.232227,43.69456],[-1.231278,43.695364],[-1.230196,43.696527],[-1.230196,43.696527],[-1.229624,43.697417],[-1.229196,43.698311],[-1.228893,43.69942],[-1.228781,43.699923],[-1.228689,43.700433],[-1.228551,43.70171],[-1.228493,43.702502],[-1.228327,43.705566],[-1.228216,43.707543],[-1.227924,43.712363],[-1.227822,43.714604],[-1.227158,43.72557],[-1.226511,43.736543],[-1.226401,43.737799],[-1.225461,43.742356],[-1.220634,43.764047],[-1.220033,43.76666],[-1.219533,43.768725],[-1.219013,43.770081],[-1.218721,43.770606],[-1.218385,43.771125],[-1.21798,43.771692],[-1.217557,43.772192],[-1.216975,43.772794],[-1.216583,43.773158],[-1.215604,43.773929],[-1.213807,43.775364],[-1.213656,43.775493],[-1.213072,43.776032],[-1.212467,43.77667],[-1.211883,43.777429],[-1.211559,43.77793],[-1.211452,43.778144],[-1.211305,43.778423],[-1.21122,43.778607],[-1.210938,43.779276],[-1.210792,43.779665],[-1.210076,43.781563],[-1.209806,43.782324],[-1.209523,43.783097],[-1.209404,43.783462],[-1.209376,43.783549],[-1.209327,43.783698],[-1.209139,43.784529],[-1.209046,43.785361],[-1.209032,43.785974],[-1.209118,43.78736],[-1.209242,43.788906],[-1.209245,43.789875],[-1.209145,43.790843],[-1.208996,43.791522],[-1.208689,43.792464],[-1.208427,43.793075],[-1.208244,43.793428],[-1.207783,43.794206],[-1.205896,43.797014],[-1.200986,43.804288],[-1.190396,43.820015],[-1.183896,43.829665],[-1.182901,43.831128],[-1.182111,43.832327],[-1.180138,43.835118],[-1.179385,43.836355],[-1.178817,43.837146],[-1.17866,43.837365],[-1.176889,43.840055],[-1.175826,43.841602],[-1.167838,43.853449],[-1.165593,43.856785],[-1.163265,43.860099],[-1.162227,43.86155],[-1.161334,43.862804],[-1.160511,43.863931],[-1.160026,43.864527],[-1.159473,43.86511],[-1.158475,43.865986],[-1.157326,43.866808],[-1.156132,43.867499],[-1.154929,43.868065],[-1.153606,43.868555],[-1.15208,43.868982],[-1.150244,43.869331],[-1.144991,43.870025],[-1.14291,43.870309],[-1.141914,43.870478],[-1.141512,43.870556],[-1.140773,43.87074],[-1.139649,43.87108],[-1.139131,43.871261],[-1.13867,43.871442],[-1.137996,43.871733],[-1.13737,43.872031],[-1.136602,43.872448],[-1.135937,43.872861],[-1.135111,43.873433],[-1.134735,43.873735],[-1.134177,43.874199],[-1.133852,43.874504],[-1.133671,43.874676],[-1.133119,43.875294],[-1.132631,43.875913],[-1.132214,43.876529],[-1.131899,43.87708],[-1.131641,43.877622],[-1.131423,43.87815],[-1.131315,43.878462],[-1.131204,43.878812],[-1.131114,43.879163],[-1.130992,43.879887],[-1.130929,43.880619],[-1.130929,43.881352],[-1.130961,43.881761],[-1.13099,43.882048],[-1.131008,43.882212],[-1.131094,43.882642],[-1.131194,43.88307],[-1.131425,43.883782],[-1.13174,43.884537],[-1.132568,43.886326],[-1.133447,43.888151],[-1.133944,43.889355],[-1.134231,43.890604],[-1.134333,43.891888],[-1.134214,43.893186],[-1.133896,43.894409],[-1.133261,43.895832],[-1.132155,43.897484],[-1.116912,43.917581],[-1.116241,43.918368],[-1.115275,43.91943],[-1.114406,43.920166],[-1.110313,43.92319],[-1.106181,43.926207],[-1.095441,43.934081],[-1.093112,43.935776],[-1.086946,43.940262],[-1.086179,43.940818],[-1.083969,43.94247],[-1.082577,43.943489],[-1.075229,43.948836],[-1.070955,43.951965],[-1.069088,43.953337],[-1.068241,43.953991],[-1.067628,43.954557],[-1.06723,43.954924],[-1.066601,43.955633],[-1.066163,43.956209],[-1.065405,43.957472],[-1.064999,43.958418],[-1.064777,43.959119],[-1.064593,43.960035],[-1.064489,43.961141],[-1.064342,43.96669],[-1.064341,43.966734],[-1.064286,43.967402],[-1.064025,43.968686],[-1.06381,43.969329],[-1.063539,43.969936],[-1.063197,43.970591],[-1.062745,43.971293],[-1.061948,43.972301],[-1.061451,43.972815],[-1.060883,43.973333],[-1.060234,43.973815],[-1.059864,43.974076],[-1.058693,43.974861],[-1.057344,43.975537],[-1.057256,43.975581],[-1.054231,43.976856],[-1.052726,43.97763],[-1.051517,43.978414],[-1.050555,43.97918],[-1.049376,43.980369],[-1.040759,43.990604],[-1.026167,44.007924],[-1.02071,44.014387],[-1.019971,44.015256],[-1.019294,44.015949],[-1.018539,44.01669],[-1.017733,44.01747],[-1.016853,44.018528],[-1.016227,44.019539],[-1.015698,44.02064],[-1.015366,44.021668],[-1.015168,44.022716],[-1.015107,44.023691],[-1.015166,44.024563],[-1.015318,44.0255],[-1.015606,44.026697],[-1.016734,44.031324],[-1.016944,44.032632],[-1.016925,44.033848],[-1.016763,44.034929],[-1.016434,44.036002],[-1.015874,44.037209],[-1.014764,44.039089],[-1.009613,44.047709],[-1.008281,44.049954],[-1.007658,44.050993],[-1.006985,44.05211],[-1.005909,44.053928],[-1.005442,44.054851],[-1.005104,44.055745],[-1.004878,44.056583],[-1.004736,44.05764],[-1.004717,44.058596],[-1.004844,44.059635],[-1.005522,44.063333],[-1.005728,44.064882],[-1.005693,44.066376],[-1.005056,44.074532],[-1.004831,44.075614],[-1.004424,44.076853],[-1.003803,44.078301],[-1.001603,44.083447],[-0.998846,44.089791],[-0.995635,44.097167],[-0.991176,44.107405],[-0.987574,44.115693],[-0.982715,44.126726],[-0.980387,44.132079],[-0.97946,44.133739],[-0.978707,44.134755],[-0.978181,44.135354],[-0.97762,44.135947],[-0.977347,44.136206],[-0.977043,44.136481],[-0.976101,44.137322],[-0.975105,44.138191],[-0.973786,44.139326],[-0.973219,44.139822],[-0.972522,44.140468],[-0.972088,44.140908],[-0.97148,44.141631],[-0.971114,44.142133],[-0.970419,44.143176],[-0.969515,44.144591],[-0.969396,44.144754],[-0.96904,44.145233],[-0.968576,44.145778],[-0.968022,44.146336],[-0.96749,44.146814],[-0.966935,44.147246],[-0.966526,44.147557],[-0.966022,44.147893],[-0.964703,44.14868],[-0.964137,44.149006],[-0.96312,44.149643],[-0.962446,44.150116],[-0.962084,44.150395],[-0.961771,44.150653],[-0.961276,44.151094],[-0.960966,44.151398],[-0.960685,44.151693],[-0.960179,44.152276],[-0.959449,44.153258],[-0.959204,44.153689],[-0.954684,44.161285],[-0.953939,44.162547],[-0.953626,44.163087],[-0.949926,44.169293],[-0.948959,44.170925],[-0.948284,44.172052],[-0.944389,44.178586],[-0.938535,44.188423],[-0.937133,44.190769],[-0.934762,44.194743],[-0.932387,44.198706],[-0.930396,44.202188],[-0.930093,44.202772],[-0.929065,44.204413],[-0.928099,44.206095],[-0.927645,44.206907],[-0.927269,44.207857],[-0.927066,44.208497],[-0.926957,44.208959],[-0.926556,44.211214],[-0.925899,44.21419],[-0.925894,44.214214],[-0.925873,44.214301],[-0.9256,44.215448],[-0.925216,44.216867],[-0.92507,44.217385],[-0.924923,44.217793],[-0.92467,44.218353],[-0.924381,44.218905],[-0.924005,44.219534],[-0.923472,44.220271],[-0.922903,44.220934],[-0.922338,44.2216],[-0.921746,44.222149],[-0.921108,44.222692],[-0.920346,44.223271],[-0.919754,44.223685],[-0.918794,44.22432],[-0.917275,44.225281],[-0.916233,44.225952],[-0.915347,44.226584],[-0.914718,44.22709],[-0.914126,44.227603],[-0.913492,44.228248],[-0.912886,44.228919],[-0.912156,44.22988],[-0.911823,44.230426],[-0.911439,44.231089],[-0.911247,44.231471],[-0.910822,44.23245],[-0.906525,44.243574],[-0.9042,44.249717],[-0.901761,44.2561],[-0.901677,44.25632],[-0.901355,44.257174],[-0.895617,44.272549],[-0.882543,44.30757],[-0.882116,44.308909],[-0.881931,44.30969],[-0.881788,44.310479],[-0.881709,44.311203],[-0.881667,44.311964],[-0.881688,44.312711],[-0.88174,44.313442],[-0.881985,44.315234],[-0.88209,44.316029],[-0.882091,44.316819],[-0.882049,44.317431],[-0.881951,44.318043],[-0.881778,44.318737],[-0.881579,44.319317],[-0.881334,44.319897],[-0.880953,44.320568],[-0.880475,44.321373],[-0.880308,44.321595],[-0.879934,44.322056],[-0.879518,44.32252],[-0.879261,44.322783],[-0.878706,44.323292],[-0.878272,44.323655],[-0.877812,44.324007],[-0.877316,44.324359],[-0.876339,44.325028],[-0.875394,44.325696],[-0.874931,44.326047],[-0.874473,44.326419],[-0.873795,44.327002],[-0.873185,44.327575],[-0.871812,44.329123],[-0.870687,44.33069],[-0.865887,44.33817],[-0.864297,44.340611],[-0.86429,44.340622],[-0.862905,44.342915],[-0.859988,44.346937],[-0.859521,44.347735],[-0.858741,44.349191],[-0.857943,44.350529],[-0.856817,44.352252],[-0.855145,44.354799],[-0.854488,44.355818],[-0.852851,44.358357],[-0.852573,44.358787],[-0.849439,44.363651],[-0.849162,44.364073],[-0.848684,44.36481],[-0.845724,44.369376],[-0.8361,44.384257],[-0.835003,44.386108],[-0.834077,44.387891],[-0.833574,44.388812],[-0.832437,44.390577],[-0.83145,44.391616],[-0.830109,44.392712],[-0.82642,44.395367],[-0.823532,44.397427],[-0.823119,44.397714],[-0.821872,44.398679],[-0.821086,44.399396],[-0.820473,44.400047],[-0.819585,44.401236],[-0.819129,44.402006],[-0.818919,44.402437],[-0.818679,44.403046],[-0.818461,44.403677],[-0.818299,44.404545],[-0.818257,44.404897],[-0.818208,44.405282],[-0.818204,44.406035],[-0.818273,44.406933],[-0.818576,44.408529],[-0.818896,44.410132],[-0.819777,44.414378],[-0.820378,44.417666],[-0.820411,44.418117],[-0.820407,44.418506],[-0.820391,44.418914],[-0.820348,44.41932],[-0.82015,44.420339],[-0.819907,44.421091],[-0.819543,44.42199],[-0.817748,44.426252],[-0.813824,44.435597],[-0.811704,44.440757],[-0.81083,44.443266],[-0.810498,44.444578],[-0.810167,44.446439],[-0.810033,44.448147],[-0.810044,44.449912],[-0.810261,44.451965],[-0.810641,44.453972],[-0.811133,44.455555],[-0.811867,44.457441],[-0.812943,44.459387],[-0.814024,44.461037],[-0.816457,44.464056],[-0.816462,44.464062],[-0.821652,44.469844],[-0.829932,44.479229],[-0.831711,44.481413],[-0.833712,44.484141],[-0.834755,44.485787],[-0.835308,44.486659],[-0.837024,44.489842],[-0.838411,44.492989],[-0.839344,44.495604],[-0.839735,44.496967],[-0.840092,44.498332],[-0.840743,44.500898],[-0.841452,44.50349],[-0.84177,44.504811],[-0.841928,44.505539],[-0.842054,44.506121],[-0.842186,44.507303],[-0.842236,44.508204],[-0.842229,44.509217],[-0.842129,44.510315],[-0.841753,44.511995],[-0.8415,44.512789],[-0.841206,44.513571],[-0.840473,44.515386],[-0.840224,44.515997],[-0.839483,44.517788],[-0.838533,44.520215],[-0.837933,44.522186],[-0.83754,44.524375],[-0.837065,44.529085],[-0.836914,44.53054],[-0.836395,44.533237],[-0.83622,44.534207],[-0.83606,44.535389],[-0.835851,44.536583],[-0.835564,44.537702],[-0.835061,44.53974],[-0.834143,44.543008],[-0.833342,44.545818],[-0.832823,44.547831],[-0.832425,44.549502],[-0.832164,44.551197],[-0.831938,44.552976],[-0.831788,44.555001],[-0.831765,44.555667],[-0.831744,44.557328],[-0.831826,44.560196],[-0.83215,44.563183],[-0.832709,44.566641],[-0.833113,44.569238],[-0.833637,44.572233],[-0.833861,44.57335],[-0.834248,44.575035],[-0.834816,44.577231],[-0.835601,44.579479],[-0.836383,44.5815],[-0.837405,44.583594],[-0.838215,44.585162],[-0.838331,44.585389],[-0.839665,44.58775],[-0.840145,44.588564],[-0.840329,44.588875],[-0.841367,44.59063],[-0.841944,44.591593],[-0.843175,44.593644],[-0.843459,44.594118],[-0.844268,44.595451],[-0.845289,44.59717],[-0.84628,44.598912],[-0.847545,44.601285],[-0.848291,44.602892],[-0.848798,44.604499],[-0.849279,44.605961],[-0.849692,44.60762],[-0.850082,44.609498],[-0.850343,44.611624],[-0.850493,44.61371],[-0.850498,44.614675],[-0.850471,44.615636],[-0.850402,44.616691],[-0.850303,44.617725],[-0.84998,44.61996],[-0.849857,44.620683],[-0.849659,44.621569],[-0.84915,44.623573],[-0.848296,44.626288],[-0.847648,44.627991],[-0.846984,44.629585],[-0.846382,44.630921],[-0.845751,44.632238],[-0.845065,44.633624],[-0.844686,44.634372],[-0.843255,44.63707],[-0.842038,44.639296],[-0.840818,44.641513],[-0.839933,44.643113],[-0.838553,44.645451],[-0.838346,44.645838],[-0.838305,44.645915],[-0.837596,44.647112],[-0.836843,44.648173],[-0.835693,44.64982],[-0.834134,44.651797],[-0.833358,44.652701],[-0.832541,44.653605],[-0.831328,44.654859],[-0.830185,44.655947],[-0.829002,44.657038],[-0.82708,44.65864],[-0.825751,44.659665],[-0.824887,44.660301],[-0.822704,44.661846],[-0.821675,44.662539],[-0.819974,44.66365],[-0.818227,44.664757],[-0.815765,44.666288],[-0.812893,44.668057],[-0.807398,44.671436],[-0.80596,44.672318],[-0.801795,44.674858],[-0.801005,44.675326],[-0.800164,44.675818],[-0.799184,44.676377],[-0.798194,44.676929],[-0.797207,44.677459],[-0.79617,44.677999],[-0.795033,44.678569],[-0.791737,44.680175],[-0.789599,44.681216],[-0.785401,44.683233],[-0.782081,44.684828],[-0.780695,44.685499],[-0.779089,44.686284],[-0.777357,44.687154],[-0.776411,44.687656],[-0.775617,44.688069],[-0.773591,44.68918],[-0.771364,44.690504],[-0.770385,44.691117],[-0.769383,44.691764],[-0.767086,44.693342],[-0.766535,44.693749],[-0.765429,44.694578],[-0.763023,44.696495],[-0.760558,44.6987],[-0.760155,44.699079],[-0.758459,44.700674],[-0.743587,44.715418],[-0.741565,44.717287],[-0.739969,44.718721],[-0.738715,44.719843],[-0.736913,44.721458],[-0.733397,44.724545],[-0.731333,44.726219],[-0.730127,44.727171],[-0.728849,44.728146],[-0.720823,44.733923],[-0.715732,44.737533],[-0.714274,44.738531],[-0.712448,44.739712],[-0.709579,44.741437],[-0.709174,44.741672],[-0.708162,44.74225],[-0.707099,44.742853],[-0.706253,44.743333],[-0.706087,44.743426],[-0.705027,44.744021],[-0.703552,44.744857],[-0.703523,44.744873],[-0.70199,44.745747],[-0.700663,44.746567],[-0.698739,44.747785],[-0.691975,44.752208],[-0.690198,44.753377],[-0.68936,44.753922],[-0.687451,44.755183],[-0.686224,44.755981],[-0.685807,44.756254],[-0.683006,44.758098],[-0.680028,44.760055],[-0.67641,44.762409],[-0.67424,44.763777],[-0.673494,44.764232],[-0.672531,44.764817],[-0.670709,44.765884],[-0.669941,44.766325],[-0.669605,44.76651],[-0.667998,44.767369],[-0.666946,44.767914],[-0.66586,44.76846],[-0.6642,44.769257],[-0.662555,44.770019],[-0.660439,44.77097],[-0.658312,44.771894],[-0.65738,44.772293],[-0.64897,44.77587],[-0.642421,44.778663],[-0.640757,44.77939],[-0.639997,44.779728],[-0.638361,44.780427],[-0.636573,44.781185],[-0.632269,44.783072],[-0.631873,44.783267],[-0.63138,44.783519],[-0.630889,44.783781],[-0.63044,44.784044],[-0.63,44.78432],[-0.628788,44.785148],[-0.628317,44.785451],[-0.627812,44.785751],[-0.627388,44.785987],[-0.626983,44.786194],[-0.626432,44.786422],[-0.625937,44.786638],[-0.625588,44.78678],[-0.625402,44.786856],[-0.625211,44.78693],[-0.624883,44.787043],[-0.624458,44.787217],[-0.624132,44.78737],[-0.62383,44.787522],[-0.621575,44.78873],[-0.621076,44.788899],[-0.620494,44.789044],[-0.619869,44.789156],[-0.617597,44.789369],[-0.615569,44.789556],[-0.61529,44.789656],[-0.613021,44.789872],[-0.611852,44.789966],[-0.610942,44.790012],[-0.610264,44.790032],[-0.609562,44.790034],[-0.608684,44.790004],[-0.608191,44.789981],[-0.607738,44.789939],[-0.606818,44.789851],[-0.606104,44.789754],[-0.605447,44.789642],[-0.604749,44.789509],[-0.60307,44.789099],[-0.602634,44.788978],[-0.602065,44.788799],[-0.60173,44.788684],[-0.600796,44.788344],[-0.599514,44.78784],[-0.597673,44.787069],[-0.596855,44.786733],[-0.596127,44.786431],[-0.593305,44.785272],[-0.592733,44.785042],[-0.591563,44.784579],[-0.590344,44.784119],[-0.589177,44.783689],[-0.588951,44.783613],[-0.588704,44.78352],[-0.587891,44.783239],[-0.586348,44.782735],[-0.585129,44.782346],[-0.583462,44.781841],[-0.582924,44.781695],[-0.580877,44.781147],[-0.580355,44.781009],[-0.579616,44.780817],[-0.578874,44.780638],[-0.577133,44.780241],[-0.575521,44.779915],[-0.573877,44.779582],[-0.57038,44.77895],[-0.570111,44.778903],[-0.567582,44.778458],[-0.564916,44.777977],[-0.564354,44.777888],[-0.563302,44.777711],[-0.56313,44.777685],[-0.561663,44.777577],[-0.561048,44.777552],[-0.560379,44.777555],[-0.559945,44.777573],[-0.559051,44.77764],[-0.558395,44.777709],[-0.557615,44.777829],[-0.556815,44.777978],[-0.55261,44.778881],[-0.551237,44.779186],[-0.550693,44.77931],[-0.550161,44.779422],[-0.548501,44.779778],[-0.547013,44.780123],[-0.545663,44.780605],[-0.544436,44.781251],[-0.543676,44.781843],[-0.542986,44.78248],[-0.54276,44.782745],[-0.542385,44.783288],[-0.54215,44.783725],[-0.542005,44.784041],[-0.541823,44.784586],[-0.541707,44.784989],[-0.541101,44.787657],[-0.54086,44.78874],[-0.54061,44.789851],[-0.540308,44.791172],[-0.54013,44.791909],[-0.539937,44.792643],[-0.539632,44.793581],[-0.539396,44.794203],[-0.539258,44.79454],[-0.538878,44.795328],[-0.538598,44.79585],[-0.538299,44.796347],[-0.538026,44.796785],[-0.53753,44.797499],[-0.537031,44.798145],[-0.536508,44.798782],[-0.536284,44.799043],[-0.535453,44.800001],[-0.534134,44.801481],[-0.533696,44.802],[-0.533483,44.802255],[-0.533287,44.802519],[-0.533029,44.802893],[-0.532719,44.803378],[-0.53257,44.803618],[-0.53232,44.80399],[-0.532176,44.804173],[-0.53202,44.804348],[-0.531851,44.804524],[-0.53166,44.804699],[-0.531454,44.804857],[-0.531248,44.805015],[-0.53076,44.805363],[-0.530556,44.805504],[-0.530286,44.805683],[-0.53027,44.805693],[-0.525888,44.808607],[-0.524314,44.809653],[-0.524132,44.809767],[-0.523226,44.810376],[-0.522823,44.810677],[-0.522354,44.811082],[-0.521956,44.811491],[-0.521695,44.811797],[-0.521372,44.812244],[-0.521198,44.812535],[-0.521069,44.812765],[-0.520961,44.812998],[-0.520856,44.813248],[-0.520677,44.813854],[-0.520573,44.814388],[-0.520551,44.814703],[-0.520557,44.815051],[-0.520579,44.81541],[-0.52063,44.81583],[-0.520749,44.816383],[-0.520806,44.816907],[-0.520802,44.817314],[-0.520761,44.817627],[-0.520662,44.81807],[-0.520518,44.81846],[-0.520256,44.818972],[-0.520058,44.819259],[-0.519803,44.819589],[-0.519555,44.81986],[-0.519168,44.820219],[-0.51891,44.82042],[-0.518592,44.820643],[-0.518252,44.820846],[-0.517904,44.821044],[-0.517609,44.821183],[-0.517341,44.821289],[-0.516788,44.821488],[-0.5162,44.821663],[-0.515842,44.821764],[-0.515488,44.821866],[-0.514993,44.822018],[-0.514873,44.822056],[-0.514234,44.822294],[-0.513803,44.822482],[-0.513255,44.82275],[-0.513035,44.822868],[-0.512821,44.823001],[-0.512635,44.823105],[-0.511965,44.82354],[-0.511814,44.823654],[-0.511535,44.823886],[-0.511155,44.824223],[-0.51021,44.8252],[-0.50985,44.825534],[-0.509345,44.825944],[-0.508962,44.826213],[-0.508229,44.826667],[-0.507899,44.82684],[-0.507192,44.827183],[-0.50659,44.82743],[-0.505307,44.827841],[-0.504634,44.828073],[-0.504119,44.828285],[-0.503694,44.828496],[-0.503274,44.828742],[-0.502842,44.829035],[-0.502382,44.829408],[-0.501938,44.829862],[-0.501684,44.83018],[-0.501368,44.83065],[-0.50113,44.831073],[-0.500925,44.8315],[-0.50035,44.832808],[-0.500143,44.833365],[-0.500042,44.833674],[-0.499947,44.83403],[-0.49989,44.834368],[-0.499846,44.834787],[-0.499861,44.835326],[-0.499904,44.835703],[-0.500043,44.836221],[-0.500133,44.836496],[-0.500373,44.837033],[-0.500822,44.837887],[-0.501106,44.83852],[-0.501318,44.839145],[-0.50146,44.839712],[-0.501524,44.8401],[-0.501527,44.840115],[-0.501563,44.840489],[-0.501587,44.840863],[-0.501572,44.841368],[-0.501497,44.842329],[-0.501483,44.842716],[-0.501494,44.843126],[-0.501533,44.843532],[-0.501597,44.84396],[-0.501693,44.844385],[-0.501801,44.844761],[-0.501926,44.845133],[-0.50208,44.845538],[-0.502307,44.846116],[-0.502437,44.846434],[-0.503174,44.848251],[-0.503886,44.850015],[-0.504145,44.850656],[-0.50467,44.851957],[-0.504897,44.852639],[-0.505049,44.853266],[-0.505123,44.853719],[-0.505172,44.854168],[-0.505197,44.854638],[-0.505192,44.855127],[-0.505152,44.855637],[-0.505064,44.856207],[-0.504938,44.856587],[-0.5041,44.860221],[-0.503957,44.861091],[-0.50383,44.862309],[-0.503793,44.863335],[-0.503818,44.864618],[-0.503873,44.865264],[-0.503927,44.865805],[-0.503994,44.866257],[-0.504076,44.866787],[-0.504204,44.867437],[-0.504348,44.86802],[-0.504555,44.868766],[-0.504779,44.869468],[-0.505046,44.870194],[-0.50536,44.870962],[-0.50563,44.871525],[-0.506035,44.872332],[-0.506735,44.87362],[-0.507365,44.874778],[-0.509335,44.878424],[-0.509685,44.879061],[-0.509989,44.879623],[-0.510409,44.880346],[-0.510603,44.880706],[-0.510836,44.881125],[-0.511005,44.881478],[-0.511124,44.881759],[-0.511231,44.882035],[-0.511296,44.882244],[-0.51133,44.882347],[-0.511344,44.882398],[-0.51139,44.882556],[-0.511402,44.882612],[-0.511412,44.88266],[-0.511445,44.882814],[-0.511464,44.882929],[-0.511473,44.882983],[-0.511482,44.883035],[-0.511491,44.883089],[-0.5115,44.883142],[-0.511528,44.883309],[-0.511541,44.883583],[-0.511538,44.883727],[-0.511507,44.883855],[-0.511456,44.883975],[-0.51139,44.884103],[-0.511112,44.88441],[-0.510992,44.884493],[-0.510763,44.884617],[-0.510549,44.884695],[-0.51027,44.884769],[-0.509769,44.884893],[-0.509109,44.885092],[-0.508581,44.88529],[-0.508384,44.885371],[-0.507945,44.885573],[-0.507662,44.885719],[-0.507319,44.885915],[-0.507004,44.886118],[-0.506739,44.886308],[-0.506485,44.886508],[-0.506227,44.886735],[-0.505998,44.886943],[-0.50569,44.887273],[-0.50553,44.887444],[-0.505287,44.887756],[-0.504859,44.888224],[-0.504536,44.888566],[-0.504072,44.889058],[-0.503277,44.889831],[-0.501437,44.891482],[-0.500618,44.892213],[-0.498356,44.89425],[-0.497885,44.894652],[-0.49728,44.895214],[-0.496752,44.895785],[-0.49624,44.896437],[-0.49581,44.897028],[-0.495577,44.897438],[-0.49536,44.897822],[-0.495142,44.898259],[-0.494929,44.898713],[-0.492249,44.905343],[-0.491846,44.906243],[-0.491713,44.906495],[-0.491495,44.906865],[-0.491296,44.90717],[-0.491025,44.907529],[-0.490855,44.907748],[-0.49062,44.908026],[-0.490013,44.908652],[-0.489549,44.909098],[-0.489077,44.909429],[-0.488534,44.909804],[-0.487643,44.910333],[-0.487066,44.910625],[-0.484701,44.911831],[-0.483691,44.912329],[-0.481383,44.913499],[-0.480491,44.913987],[-0.479889,44.914381],[-0.479367,44.914761],[-0.478721,44.915338],[-0.478241,44.915763],[-0.477792,44.916272],[-0.477321,44.916894],[-0.476875,44.917627],[-0.476401,44.918483],[-0.475097,44.920977],[-0.47423,44.9226],[-0.473416,44.923949],[-0.47209,44.925911],[-0.47005,44.928987],[-0.469017,44.930557],[-0.468564,44.931355],[-0.468233,44.932008],[-0.468013,44.932542],[-0.46782,44.933101],[-0.467743,44.933372],[-0.467516,44.934401],[-0.467389,44.935111],[-0.467077,44.936784],[-0.466942,44.937623],[-0.466598,44.939708],[-0.46652,44.94014],[-0.466451,44.940555],[-0.465831,44.944232],[-0.465617,44.945259],[-0.465459,44.945829],[-0.465223,44.946561],[-0.464953,44.947159],[-0.464668,44.94769],[-0.464348,44.948195],[-0.464026,44.948647],[-0.46386,44.948883],[-0.463439,44.949321],[-0.462955,44.949853],[-0.462637,44.950159],[-0.462224,44.950557],[-0.461401,44.951176],[-0.460606,44.951702],[-0.459916,44.952098],[-0.459491,44.952328],[-0.458298,44.952921],[-0.452729,44.955661],[-0.449448,44.957308],[-0.447984,44.958119],[-0.447112,44.958665],[-0.44615,44.959288],[-0.445614,44.959665],[-0.445061,44.960088],[-0.444227,44.960785],[-0.443496,44.961457],[-0.442008,44.96292],[-0.438641,44.966415],[-0.438593,44.966465],[-0.437749,44.967359],[-0.437091,44.968152],[-0.436349,44.969175],[-0.435973,44.969742],[-0.4357,44.970255],[-0.435291,44.971085],[-0.434942,44.971881],[-0.434561,44.972749],[-0.43416,44.973609],[-0.433624,44.9747],[-0.433212,44.97541],[-0.432324,44.976693],[-0.431572,44.977719],[-0.431057,44.978449],[-0.430396,44.979424],[-0.429446,44.981056],[-0.429005,44.981927],[-0.428631,44.982751],[-0.428327,44.98349],[-0.428166,44.983984],[-0.427395,44.986596],[-0.427209,44.987535],[-0.427148,44.98832],[-0.427109,44.988714],[-0.427061,44.989196],[-0.426939,44.991426],[-0.426861,44.993511],[-0.426733,44.996763],[-0.42671,44.998394],[-0.426718,44.9989],[-0.426737,44.999984],[-0.426739,45.000777],[-0.42681,45.001712],[-0.426851,45.00216],[-0.427048,45.003843],[-0.427148,45.004509],[-0.427271,45.005175],[-0.427364,45.005652],[-0.427476,45.006177],[-0.427579,45.00661],[-0.427903,45.007865],[-0.428319,45.0093],[-0.42846,45.009806],[-0.428755,45.01063],[-0.428912,45.010905],[-0.429046,45.011219],[-0.42939,45.012046],[-0.429496,45.012339],[-0.429642,45.012667],[-0.429764,45.012956],[-0.429883,45.013208],[-0.431826,45.016965],[-0.432787,45.018668],[-0.433301,45.019541],[-0.434059,45.0209],[-0.434298,45.02135],[-0.434493,45.021863],[-0.435041,45.023608],[-0.435079,45.023686],[-0.435119,45.023749],[-0.435435,45.024128],[-0.435992,45.024794],[-0.436582,45.025501],[-0.436827,45.02589],[-0.438,45.02794],[-0.438968,45.029509],[-0.4392,45.02988],[-0.440258,45.031496],[-0.440482,45.031839],[-0.443067,45.035568],[-0.445629,45.039299],[-0.446532,45.040601],[-0.447351,45.041889],[-0.448215,45.043293],[-0.449553,45.045632],[-0.450893,45.048155],[-0.453396,45.052962],[-0.45465,45.055332],[-0.455509,45.056933],[-0.455913,45.057651],[-0.456314,45.058351],[-0.457275,45.059953],[-0.458657,45.06207],[-0.459572,45.063386],[-0.462079,45.06698],[-0.463896,45.06965],[-0.464539,45.070663],[-0.465196,45.071769],[-0.465685,45.072661],[-0.466335,45.073947],[-0.466809,45.074988],[-0.467263,45.076082],[-0.467673,45.077193],[-0.468015,45.07824],[-0.468438,45.079654],[-0.468797,45.081005],[-0.469592,45.084023],[-0.470115,45.085836],[-0.470457,45.086862],[-0.470773,45.087764],[-0.47103,45.088428],[-0.471117,45.088654],[-0.471536,45.089621],[-0.472056,45.090699],[-0.4724,45.091378],[-0.47271,45.091968],[-0.473139,45.092721],[-0.473608,45.0935],[-0.474122,45.09429],[-0.474669,45.095182],[-0.475441,45.096251],[-0.476375,45.097559],[-0.478394,45.100363],[-0.479402,45.101846],[-0.48036,45.103352],[-0.481009,45.104451],[-0.481224,45.104862],[-0.481536,45.105426],[-0.482039,45.106401],[-0.482448,45.10726],[-0.482811,45.108074],[-0.483152,45.108889],[-0.48346,45.109658],[-0.483851,45.110717],[-0.484187,45.11174],[-0.484453,45.112657],[-0.484727,45.11367],[-0.484949,45.114597],[-0.485167,45.115678],[-0.485334,45.116576],[-0.485471,45.117598],[-0.485595,45.118742],[-0.485697,45.119825],[-0.485742,45.120774],[-0.485765,45.121239],[-0.485765,45.121932],[-0.485752,45.123072],[-0.485715,45.124113],[-0.485624,45.125216],[-0.485494,45.126227],[-0.485341,45.127358],[-0.485158,45.128455],[-0.484951,45.12942],[-0.484697,45.13046],[-0.484412,45.131506],[-0.484094,45.132553],[-0.483728,45.133651],[-0.483314,45.134795],[-0.482673,45.136476],[-0.481333,45.139997],[-0.480822,45.141494],[-0.480417,45.142788],[-0.479862,45.145026],[-0.479619,45.146041],[-0.479409,45.147261],[-0.479188,45.148625],[-0.47904,45.149828],[-0.478892,45.151864],[-0.478863,45.153405],[-0.478901,45.155752],[-0.478975,45.156912],[-0.479013,45.15751],[-0.479232,45.159207],[-0.479441,45.16055],[-0.479662,45.161732],[-0.479937,45.162979],[-0.480227,45.164085],[-0.48056,45.16521],[-0.480948,45.166451],[-0.48152,45.167957],[-0.482145,45.169534],[-0.482883,45.171039],[-0.483637,45.172589],[-0.48748,45.180003],[-0.489107,45.183134],[-0.489566,45.184031],[-0.489739,45.184441],[-0.489991,45.184951],[-0.49023,45.185438],[-0.490821,45.186682],[-0.491174,45.187492],[-0.491873,45.189181],[-0.492404,45.19057],[-0.493011,45.192356],[-0.494074,45.195194],[-0.494465,45.196227],[-0.494832,45.197151],[-0.495453,45.198639],[-0.496285,45.200123],[-0.49732,45.201759],[-0.4983,45.203055],[-0.501577,45.207003],[-0.50286,45.208633],[-0.504082,45.210455],[-0.504983,45.21205],[-0.505541,45.213201],[-0.505612,45.213347],[-0.506942,45.216351],[-0.507658,45.217819],[-0.508407,45.21911],[-0.50938,45.220506],[-0.510498,45.221731],[-0.511704,45.22283],[-0.513265,45.224029],[-0.514754,45.224995],[-0.516471,45.225965],[-0.521294,45.228507],[-0.523194,45.229747],[-0.524655,45.230858],[-0.525887,45.231978],[-0.527035,45.233199],[-0.527828,45.23418],[-0.527986,45.234377],[-0.528056,45.234463],[-0.539272,45.250344],[-0.539589,45.250789],[-0.540252,45.251724],[-0.54059,45.252208],[-0.54092,45.252682],[-0.542597,45.255088],[-0.543628,45.25655],[-0.544486,45.257845],[-0.54528,45.259144],[-0.545859,45.260163],[-0.546466,45.261276],[-0.547071,45.262487],[-0.547544,45.263546],[-0.547965,45.264637],[-0.548353,45.265683],[-0.54886,45.26717],[-0.549277,45.268581],[-0.549603,45.269961],[-0.549811,45.271032],[-0.549963,45.272064],[-0.550107,45.27322],[-0.550154,45.273858],[-0.550617,45.280133],[-0.550684,45.281125],[-0.550777,45.282263],[-0.550865,45.2834],[-0.550976,45.284528],[-0.551138,45.285683],[-0.551308,45.28679],[-0.551572,45.288049],[-0.551893,45.289345],[-0.552302,45.290738],[-0.552806,45.292183],[-0.553233,45.293305],[-0.55531,45.298319],[-0.555635,45.299124],[-0.555902,45.299801],[-0.55623,45.300672],[-0.556448,45.301275],[-0.556721,45.302092],[-0.556874,45.302715],[-0.557016,45.303225],[-0.557321,45.304314],[-0.55767,45.305855],[-0.557973,45.307388],[-0.558356,45.31041],[-0.558589,45.312516],[-0.558718,45.31357],[-0.558897,45.314616],[-0.559152,45.315833],[-0.559249,45.316223],[-0.559392,45.316772],[-0.559656,45.317688],[-0.560161,45.319129],[-0.560916,45.320722],[-0.56164,45.322071],[-0.562599,45.323496],[-0.563527,45.324773],[-0.566434,45.328479],[-0.567276,45.329667],[-0.568073,45.330974],[-0.568813,45.332378],[-0.569351,45.333559],[-0.569818,45.334804],[-0.571058,45.338452],[-0.571094,45.338559],[-0.571481,45.339579],[-0.571993,45.340589],[-0.572556,45.341566],[-0.573313,45.342619],[-0.573985,45.343496],[-0.574844,45.344345],[-0.575663,45.345153],[-0.576031,45.345516],[-0.576368,45.345848],[-0.577132,45.346634],[-0.579777,45.349248],[-0.5807,45.350215],[-0.58143,45.351033],[-0.582184,45.351946],[-0.582886,45.352859],[-0.583459,45.353641],[-0.58465,45.355477],[-0.585822,45.357637],[-0.588833,45.363999],[-0.589682,45.365819],[-0.59049,45.367379],[-0.59117,45.368617],[-0.591919,45.369778],[-0.593484,45.37188],[-0.595324,45.373964],[-0.597392,45.376227],[-0.5985,45.377475],[-0.599533,45.378719],[-0.600456,45.379962],[-0.600738,45.38036],[-0.601079,45.38085],[-0.601696,45.381899],[-0.602237,45.382923],[-0.602955,45.38455],[-0.603478,45.385948],[-0.60387,45.387396],[-0.604213,45.389081],[-0.604379,45.390565],[-0.604403,45.392393],[-0.604327,45.393726],[-0.604176,45.394682],[-0.604163,45.394768],[-0.604135,45.395117],[-0.603885,45.39645],[-0.603599,45.397567],[-0.601957,45.403643],[-0.601607,45.405082],[-0.601483,45.406126],[-0.601306,45.407573],[-0.601242,45.409061],[-0.601325,45.410664],[-0.601526,45.412186],[-0.601916,45.413897],[-0.604259,45.42254],[-0.604619,45.424407],[-0.604911,45.426372],[-0.605109,45.428558],[-0.605259,45.430734],[-0.605381,45.432624],[-0.60556,45.434847],[-0.605772,45.436554],[-0.6063,45.438581],[-0.606517,45.439284],[-0.607048,45.440729],[-0.607773,45.442265],[-0.608788,45.444111],[-0.609141,45.444685],[-0.614062,45.452707],[-0.615992,45.455853],[-0.617558,45.458568],[-0.618472,45.460579],[-0.618488,45.460614],[-0.619245,45.462644],[-0.619858,45.464748],[-0.620219,45.466591],[-0.620487,45.468777],[-0.620555,45.470439],[-0.620516,45.472491],[-0.620453,45.473072],[-0.620403,45.473542],[-0.620337,45.474153],[-0.620008,45.476099],[-0.619435,45.478224],[-0.618897,45.479938],[-0.615751,45.487691],[-0.615112,45.489389],[-0.614516,45.491353],[-0.61444,45.491656],[-0.614037,45.493277],[-0.613667,45.495234],[-0.613445,45.497132],[-0.613303,45.499257],[-0.613075,45.507059],[-0.612961,45.508784],[-0.612868,45.509994],[-0.612523,45.513042],[-0.612199,45.515226],[-0.612037,45.516173],[-0.611832,45.517112],[-0.611563,45.518436],[-0.608527,45.531241],[-0.603719,45.551517],[-0.603326,45.553262],[-0.60294,45.555093],[-0.602579,45.55699],[-0.602179,45.559394],[-0.601305,45.565645],[-0.601232,45.566171],[-0.6003,45.573167],[-0.60025,45.573468],[-0.600033,45.574901],[-0.599914,45.575551],[-0.599786,45.576162],[-0.599625,45.57683],[-0.599409,45.577622],[-0.599162,45.578418],[-0.598835,45.579343],[-0.598464,45.58026],[-0.598331,45.58057],[-0.598198,45.580863],[-0.597768,45.581786],[-0.597126,45.582965],[-0.597081,45.583047],[-0.596526,45.583956],[-0.595972,45.584815],[-0.592594,45.589513],[-0.591523,45.591037],[-0.590641,45.592529],[-0.589997,45.594119],[-0.589619,45.595623],[-0.589506,45.597002],[-0.589528,45.59825],[-0.589845,45.599941],[-0.590367,45.601503],[-0.59128,45.603223],[-0.592458,45.604648],[-0.593444,45.605706],[-0.594517,45.606656],[-0.595134,45.607163],[-0.595912,45.607752],[-0.596503,45.60818],[-0.597062,45.608591],[-0.597939,45.609219],[-0.599159,45.610105],[-0.599735,45.610527],[-0.600447,45.611069],[-0.600843,45.611383],[-0.601425,45.611863],[-0.602189,45.612535],[-0.602738,45.613064],[-0.603663,45.61403],[-0.60417,45.614623],[-0.604632,45.615204],[-0.605163,45.615939],[-0.605691,45.616732],[-0.605967,45.61718],[-0.609346,45.623269],[-0.610177,45.624624],[-0.610938,45.625758],[-0.611818,45.626956],[-0.612676,45.627982],[-0.613771,45.629183],[-0.614936,45.630327],[-0.616008,45.631282],[-0.622236,45.636636],[-0.623337,45.637653],[-0.624291,45.638603],[-0.625389,45.639691],[-0.626392,45.640777],[-0.627336,45.641893],[-0.628197,45.642985],[-0.629019,45.644086],[-0.629732,45.645115],[-0.630346,45.646069],[-0.631052,45.647225],[-0.631642,45.648317],[-0.63223,45.649503],[-0.632796,45.650736],[-0.633253,45.651892],[-0.63377,45.653337],[-0.634172,45.654574],[-0.634571,45.656027],[-0.634836,45.657037],[-0.634898,45.657274],[-0.635533,45.659996],[-0.636629,45.664691],[-0.636963,45.666016],[-0.637323,45.667331],[-0.637779,45.668949],[-0.638223,45.670152],[-0.638674,45.671271],[-0.639255,45.672605],[-0.639816,45.673807],[-0.640415,45.675044],[-0.643422,45.680867],[-0.644624,45.683345],[-0.645335,45.685135],[-0.646168,45.687364],[-0.646301,45.687782],[-0.650144,45.699904],[-0.650271,45.700323],[-0.650516,45.701077],[-0.650885,45.702151],[-0.651359,45.703416],[-0.651879,45.704669],[-0.6524,45.705815],[-0.652706,45.706443],[-0.65293,45.706893],[-0.653127,45.707279],[-0.653295,45.707659],[-0.653631,45.708338],[-0.654004,45.709005],[-0.654389,45.709673],[-0.654697,45.710213],[-0.657233,45.71465],[-0.657384,45.714903],[-0.657969,45.715995],[-0.658482,45.717067],[-0.658793,45.717716],[-0.659276,45.718942],[-0.659538,45.719618],[-0.659708,45.720116],[-0.660223,45.721697],[-0.660582,45.723141],[-0.661429,45.726917],[-0.661819,45.728423],[-0.662229,45.729776],[-0.66266,45.730965],[-0.66314,45.732027],[-0.663554,45.732915],[-0.663721,45.733244],[-0.663871,45.733534],[-0.663977,45.733727],[-0.664192,45.734126],[-0.664417,45.734526],[-0.66513,45.735829],[-0.666776,45.738445],[-0.667574,45.739692],[-0.668304,45.740927],[-0.668894,45.742066],[-0.66939,45.743172],[-0.669673,45.743839],[-0.669963,45.744578],[-0.670234,45.745397],[-0.670577,45.746452],[-0.670908,45.747809],[-0.671192,45.749061],[-0.671343,45.749828],[-0.671471,45.750521],[-0.671669,45.751767],[-0.671844,45.753023],[-0.671985,45.754357],[-0.67208,45.755308],[-0.672117,45.755834],[-0.672141,45.756492],[-0.672159,45.757511],[-0.672156,45.758115],[-0.67214,45.75865],[-0.672114,45.759162],[-0.672082,45.759731],[-0.672028,45.760227],[-0.671927,45.760928],[-0.671853,45.761348],[-0.671774,45.761725],[-0.671643,45.762277],[-0.671499,45.762828],[-0.671383,45.763213],[-0.671191,45.763823],[-0.67098,45.764475],[-0.670767,45.765087],[-0.67055,45.765645],[-0.670293,45.766276],[-0.670032,45.766869],[-0.669493,45.768151],[-0.668989,45.769446],[-0.668754,45.770096],[-0.668539,45.770755],[-0.668376,45.771283],[-0.668227,45.77179],[-0.668105,45.772252],[-0.667993,45.772735],[-0.667855,45.773429],[-0.667767,45.773942],[-0.667687,45.774474],[-0.667629,45.774926],[-0.667579,45.775407],[-0.667533,45.775971],[-0.667506,45.776458],[-0.667503,45.776933],[-0.667501,45.777449],[-0.66752,45.778366],[-0.667544,45.778856],[-0.667574,45.779311],[-0.667678,45.780885],[-0.667733,45.781807],[-0.667765,45.78284],[-0.667769,45.782956],[-0.667802,45.783444],[-0.667779,45.784251],[-0.667737,45.784854],[-0.667686,45.785432],[-0.667634,45.785806],[-0.667575,45.786149],[-0.667513,45.786494],[-0.667396,45.786957],[-0.667281,45.787377],[-0.667151,45.787766],[-0.667044,45.788071],[-0.666931,45.788351],[-0.66663,45.789049],[-0.6663,45.789712],[-0.665945,45.790332],[-0.665651,45.790791],[-0.665351,45.791221],[-0.665039,45.791634],[-0.664702,45.792053],[-0.664345,45.792461],[-0.663878,45.79299],[-0.663567,45.793328],[-0.66312,45.793765],[-0.662627,45.79424],[-0.662125,45.794711],[-0.660506,45.796203],[-0.65946,45.797212],[-0.658752,45.797945],[-0.65841,45.798307],[-0.658063,45.798683],[-0.657443,45.799411],[-0.657199,45.799722],[-0.656955,45.800047],[-0.656492,45.800687],[-0.655777,45.801798],[-0.65555,45.802136],[-0.655193,45.802808],[-0.654827,45.803551],[-0.654528,45.804312],[-0.654264,45.805051],[-0.654006,45.805849],[-0.653743,45.806833],[-0.65353,45.807813],[-0.653178,45.809777],[-0.653027,45.810761],[-0.652868,45.81175],[-0.652669,45.812699],[-0.652437,45.813642],[-0.652144,45.814523],[-0.6518,45.815379],[-0.651491,45.815991],[-0.65115,45.816569],[-0.650762,45.817168],[-0.650346,45.81772],[-0.649846,45.818321],[-0.649372,45.818831],[-0.648778,45.819413],[-0.648121,45.819958],[-0.647503,45.820437],[-0.646851,45.820903],[-0.646171,45.821358],[-0.645438,45.821792],[-0.644714,45.822204],[-0.644034,45.822577],[-0.642689,45.823282],[-0.641879,45.823707],[-0.641026,45.824137],[-0.63928,45.825056],[-0.638078,45.825688],[-0.637138,45.826212],[-0.63614,45.826766],[-0.635158,45.827352],[-0.63467,45.827661],[-0.634226,45.827954],[-0.633615,45.828388],[-0.633212,45.828691],[-0.632839,45.828989],[-0.632789,45.829029],[-0.63262,45.829169],[-0.632353,45.829389],[-0.631951,45.82974],[-0.631527,45.830133],[-0.631081,45.830561],[-0.630618,45.831036],[-0.630108,45.831619],[-0.629776,45.832035],[-0.629357,45.832571],[-0.629,45.833076],[-0.628879,45.83326],[-0.628638,45.833628],[-0.628303,45.834174],[-0.627945,45.834879],[-0.627562,45.835707],[-0.627424,45.836051],[-0.627336,45.836271],[-0.62712,45.836906],[-0.626976,45.83736],[-0.626659,45.838491],[-0.626186,45.84072],[-0.625788,45.842497],[-0.625546,45.843674],[-0.625264,45.844877],[-0.624891,45.846452],[-0.624813,45.846749],[-0.624757,45.84701],[-0.624452,45.847937],[-0.624004,45.849481],[-0.623532,45.850898],[-0.622234,45.854754],[-0.621851,45.855939],[-0.621561,45.857029],[-0.621369,45.858003],[-0.621245,45.858921],[-0.621169,45.859777],[-0.621151,45.860675],[-0.62121,45.861865],[-0.621351,45.862991],[-0.621421,45.86351],[-0.621467,45.863824],[-0.6215,45.864047],[-0.621754,45.865569],[-0.622067,45.86774],[-0.622521,45.870448],[-0.622666,45.871492],[-0.62276,45.872444],[-0.622802,45.873535],[-0.622785,45.874338],[-0.622687,45.875193],[-0.622492,45.876211],[-0.622264,45.877125],[-0.621949,45.878059],[-0.621638,45.878804],[-0.621232,45.879641],[-0.620809,45.880404],[-0.620086,45.881475],[-0.619533,45.882187],[-0.61883,45.883026],[-0.617959,45.883906],[-0.61711,45.884675],[-0.616009,45.885555],[-0.615035,45.886268],[-0.613847,45.887061],[-0.612733,45.887755],[-0.611542,45.888499],[-0.610286,45.889274],[-0.608921,45.890104],[-0.608811,45.890165],[-0.606635,45.891531],[-0.599849,45.895666],[-0.598138,45.896749],[-0.59698,45.897452],[-0.595488,45.898378],[-0.594258,45.899168],[-0.593299,45.899826],[-0.59251,45.900403],[-0.591753,45.900997],[-0.590602,45.901977],[-0.589709,45.902787],[-0.58899,45.903514],[-0.588238,45.904341],[-0.587427,45.905305],[-0.58679,45.906164],[-0.586236,45.906975],[-0.585706,45.907823],[-0.585271,45.908589],[-0.58481,45.909509],[-0.584277,45.910836],[-0.583988,45.91164],[-0.583783,45.912335],[-0.583489,45.913367],[-0.583289,45.914097],[-0.583084,45.914911],[-0.582495,45.917054],[-0.582174,45.918157],[-0.581929,45.918961],[-0.581623,45.919804],[-0.581243,45.920714],[-0.581042,45.921118],[-0.580814,45.921548],[-0.580454,45.922145],[-0.580221,45.922511],[-0.579967,45.922885],[-0.579699,45.923254],[-0.579424,45.923614],[-0.578809,45.924354],[-0.57824,45.924998],[-0.577448,45.925788],[-0.576592,45.926545],[-0.576062,45.926981],[-0.575178,45.927618],[-0.5744,45.928134],[-0.573603,45.92864],[-0.572547,45.929267],[-0.567677,45.931935],[-0.566465,45.932651],[-0.566226,45.932802],[-0.565507,45.933258],[-0.564432,45.934006],[-0.563725,45.934542],[-0.563055,45.935108],[-0.562364,45.935746],[-0.561809,45.936306],[-0.561217,45.936951],[-0.560541,45.93781],[-0.559955,45.938583],[-0.559394,45.939461],[-0.558908,45.940352],[-0.558678,45.940859],[-0.558538,45.941167],[-0.558114,45.942187],[-0.557711,45.943384],[-0.557366,45.944561],[-0.555451,45.951223],[-0.555424,45.951318],[-0.554877,45.952958],[-0.554776,45.953253],[-0.554432,45.954219],[-0.554109,45.95517],[-0.553997,45.955476],[-0.553225,45.957554],[-0.553114,45.957853],[-0.552002,45.960853],[-0.551308,45.962848],[-0.550537,45.964922],[-0.550038,45.966163],[-0.548737,45.969733],[-0.548225,45.971185],[-0.547994,45.97187],[-0.547333,45.973932],[-0.546818,45.975809],[-0.546389,45.977551],[-0.546128,45.978732],[-0.545906,45.979794],[-0.545602,45.981491],[-0.545364,45.982977],[-0.545099,45.984924],[-0.544535,45.990284],[-0.544387,45.991456],[-0.544232,45.992757],[-0.544066,45.993879],[-0.544033,45.994097],[-0.543802,45.995328],[-0.543548,45.996321],[-0.543293,45.997278],[-0.543019,45.998254],[-0.541419,46.003277],[-0.541147,46.004477],[-0.540896,46.005599],[-0.540724,46.006844],[-0.540645,46.007937],[-0.540613,46.009134],[-0.540682,46.010299],[-0.540799,46.011605],[-0.540979,46.01286],[-0.541335,46.015401],[-0.541462,46.01656],[-0.541555,46.017683],[-0.541583,46.018899],[-0.541534,46.020139],[-0.541397,46.021351],[-0.541199,46.022588],[-0.540847,46.023882],[-0.540493,46.025],[-0.540194,46.025844],[-0.538737,46.029722],[-0.53823,46.031173],[-0.537779,46.032711],[-0.537481,46.033879],[-0.537218,46.035192],[-0.537006,46.036491],[-0.536891,46.037752],[-0.536791,46.039021],[-0.536746,46.04032],[-0.536741,46.041666],[-0.537055,46.050652],[-0.537051,46.051909],[-0.536985,46.053318],[-0.536736,46.055369],[-0.536457,46.056978],[-0.53612,46.058578],[-0.535746,46.060021],[-0.535719,46.060127],[-0.532079,46.073232],[-0.531727,46.074739],[-0.531475,46.076008],[-0.531362,46.07669],[-0.531273,46.077364],[-0.531199,46.078011],[-0.531136,46.078666],[-0.531077,46.079983],[-0.531057,46.081264],[-0.531103,46.082573],[-0.531252,46.084137],[-0.531478,46.085621],[-0.53175,46.087032],[-0.532153,46.088732],[-0.532575,46.090326],[-0.534032,46.095332],[-0.534396,46.096778],[-0.534762,46.098302],[-0.535007,46.099773],[-0.535165,46.101211],[-0.535289,46.102723],[-0.535333,46.10409],[-0.535336,46.104179],[-0.535288,46.105748],[-0.535184,46.107231],[-0.534998,46.108738],[-0.534722,46.1104],[-0.534181,46.112953],[-0.533341,46.116647],[-0.532528,46.12015],[-0.532295,46.121186],[-0.531948,46.122699],[-0.531115,46.12634],[-0.530051,46.130926],[-0.529701,46.132334],[-0.529345,46.133708],[-0.52892,46.135087],[-0.528436,46.136413],[-0.527959,46.137573],[-0.527404,46.138804],[-0.526911,46.139835],[-0.526824,46.140017],[-0.526223,46.141125],[-0.52523,46.142818],[-0.524231,46.144386],[-0.52031,46.150274],[-0.51947,46.151626],[-0.518611,46.153044],[-0.517941,46.154213],[-0.517307,46.155396],[-0.516698,46.156624],[-0.515977,46.158167],[-0.513138,46.164244],[-0.512542,46.165497],[-0.51188,46.166702],[-0.511181,46.167935],[-0.510365,46.169242],[-0.509618,46.170379],[-0.508757,46.171597],[-0.507894,46.172789],[-0.506893,46.174008],[-0.505843,46.175235],[-0.504551,46.17667],[-0.503401,46.177861],[-0.502274,46.178985],[-0.501107,46.180084],[-0.499293,46.181696],[-0.492736,46.187531],[-0.490766,46.189287],[-0.484331,46.194954],[-0.484282,46.194997],[-0.482958,46.196136],[-0.481589,46.197212],[-0.480225,46.198273],[-0.478837,46.199301],[-0.477503,46.200274],[-0.476123,46.201225],[-0.474524,46.202276],[-0.472995,46.203251],[-0.470139,46.204997],[-0.463492,46.209061],[-0.462009,46.210001],[-0.460662,46.210912],[-0.459211,46.211944],[-0.4578,46.212997],[-0.456218,46.214248],[-0.454918,46.21539],[-0.453488,46.216702],[-0.452261,46.217938],[-0.451147,46.219173],[-0.450089,46.220383],[-0.448759,46.221992],[-0.446022,46.225572],[-0.442229,46.230533],[-0.44085,46.232315],[-0.439822,46.233651],[-0.439553,46.233983],[-0.439494,46.234055],[-0.438672,46.235069],[-0.438304,46.235531],[-0.438126,46.235735],[-0.437605,46.236357],[-0.437229,46.236805],[-0.436758,46.237353],[-0.436415,46.237732],[-0.435924,46.238284],[-0.435286,46.238984],[-0.434554,46.239767],[-0.433971,46.240377],[-0.432839,46.241556],[-0.432402,46.241992],[-0.43071,46.243774],[-0.428923,46.245778],[-0.428077,46.246758],[-0.42762,46.2473],[-0.427143,46.247874],[-0.42619,46.249062],[-0.425738,46.249635],[-0.42528,46.25023],[-0.42479,46.250871],[-0.424366,46.251439],[-0.423995,46.251947],[-0.423601,46.252496],[-0.42321,46.253046],[-0.422317,46.25436],[-0.421946,46.254889],[-0.421011,46.256256],[-0.420082,46.257534],[-0.419518,46.258265],[-0.41893,46.259],[-0.418509,46.259517],[-0.418343,46.259711],[-0.417871,46.260273],[-0.417194,46.261045],[-0.416501,46.261804],[-0.415866,46.262474],[-0.415619,46.26273],[-0.415341,46.263016],[-0.414929,46.263429],[-0.414486,46.263864],[-0.413946,46.264384],[-0.413424,46.264874],[-0.411994,46.266161],[-0.41117,46.266867],[-0.41036,46.267556],[-0.409542,46.268254],[-0.409055,46.268669],[-0.408733,46.268948],[-0.408254,46.269374],[-0.407409,46.270153],[-0.406271,46.271236],[-0.405185,46.272302],[-0.404615,46.272912],[-0.404046,46.273525],[-0.403542,46.274082],[-0.402847,46.274874],[-0.401784,46.276158],[-0.400977,46.27718],[-0.400633,46.277635],[-0.400369,46.277995],[-0.399979,46.278534],[-0.399739,46.278872],[-0.39956,46.279137],[-0.398099,46.281247],[-0.39789,46.281551],[-0.397485,46.282117],[-0.396664,46.283238],[-0.396166,46.28386],[-0.395717,46.2844],[-0.395226,46.284955],[-0.394744,46.285475],[-0.394222,46.286012],[-0.393503,46.286699],[-0.392725,46.287397],[-0.392322,46.287741],[-0.391912,46.288084],[-0.391066,46.288745],[-0.390181,46.289396],[-0.389766,46.289698],[-0.388657,46.290441],[-0.388221,46.2907],[-0.387675,46.291032],[-0.386993,46.291429],[-0.386086,46.291929],[-0.385158,46.292411],[-0.38445,46.292757],[-0.383618,46.293146],[-0.382677,46.293561],[-0.381829,46.293917],[-0.379997,46.294656],[-0.375375,46.296393],[-0.374488,46.296732],[-0.373432,46.297142],[-0.372673,46.29744],[-0.371735,46.297819],[-0.370647,46.298279],[-0.369758,46.298672],[-0.369151,46.298959],[-0.368548,46.299246],[-0.368146,46.29944],[-0.367328,46.299854],[-0.366444,46.300323],[-0.366054,46.300536],[-0.365673,46.30075],[-0.36524,46.300998],[-0.364049,46.30171],[-0.363723,46.301914],[-0.363049,46.302338],[-0.362575,46.302653],[-0.362009,46.303035],[-0.361142,46.303644],[-0.360312,46.304266],[-0.360171,46.304373],[-0.36003,46.30448],[-0.359584,46.304833],[-0.359155,46.305185],[-0.358325,46.30588],[-0.357958,46.306204],[-0.35741,46.306699],[-0.357209,46.306884],[-0.356311,46.307743],[-0.355969,46.30809],[-0.355185,46.308912],[-0.354425,46.309733],[-0.3523,46.312163],[-0.35108,46.313566],[-0.349979,46.314827],[-0.348956,46.315994],[-0.348877,46.316084],[-0.348304,46.316726],[-0.347692,46.317398],[-0.347336,46.317781],[-0.346958,46.318183],[-0.346532,46.318625],[-0.346099,46.319064],[-0.345314,46.319832],[-0.344757,46.320353],[-0.344169,46.320883],[-0.343232,46.321692],[-0.342269,46.322483],[-0.341129,46.323364],[-0.340531,46.32381],[-0.339752,46.32437],[-0.338711,46.325085],[-0.337411,46.325931],[-0.336834,46.326284],[-0.335848,46.32688],[-0.334866,46.327455],[-0.332859,46.328591],[-0.330832,46.32972],[-0.330535,46.329886],[-0.313882,46.339105],[-0.311755,46.340182],[-0.30965,46.341193],[-0.307776,46.342065],[-0.306094,46.342806],[-0.305766,46.342944],[-0.305283,46.343151],[-0.304628,46.343423],[-0.304265,46.343581],[-0.30321,46.34401],[-0.302731,46.344201],[-0.302249,46.344386],[-0.300933,46.344891],[-0.300512,46.345045],[-0.299717,46.345339],[-0.298917,46.345628],[-0.29815,46.345901],[-0.297376,46.346165],[-0.29686,46.346348],[-0.296206,46.346563],[-0.295797,46.346699],[-0.295382,46.346835],[-0.29514,46.346914],[-0.294655,46.347068],[-0.294306,46.34718],[-0.293872,46.347313],[-0.293461,46.347442],[-0.292926,46.347607],[-0.292277,46.347805],[-0.290272,46.348419],[-0.289774,46.348571],[-0.289275,46.348731],[-0.288287,46.349044],[-0.287222,46.349397],[-0.286171,46.349753],[-0.285557,46.349961],[-0.285259,46.350067],[-0.284963,46.350176],[-0.28451,46.350343],[-0.283933,46.350562],[-0.283482,46.350741],[-0.283045,46.350921],[-0.28247,46.351164],[-0.282041,46.351347],[-0.281688,46.351502],[-0.281337,46.35166],[-0.280639,46.351979],[-0.280491,46.352048],[-0.279919,46.352313],[-0.279575,46.352481],[-0.279234,46.35265],[-0.278155,46.353209],[-0.27752,46.353548],[-0.276854,46.353916],[-0.276056,46.354377],[-0.275645,46.354622],[-0.275241,46.354866],[-0.274545,46.355307],[-0.27382,46.355767],[-0.272605,46.356577],[-0.272174,46.356899],[-0.269272,46.35888],[-0.268323,46.359532],[-0.267824,46.35986],[-0.267322,46.360187],[-0.266701,46.360585],[-0.266331,46.360812],[-0.265945,46.361045],[-0.265683,46.361194],[-0.26542,46.361347],[-0.265084,46.361536],[-0.264747,46.361721],[-0.264417,46.361896],[-0.264084,46.362069],[-0.26381,46.362207],[-0.263531,46.362343],[-0.263041,46.362577],[-0.262489,46.362832],[-0.262021,46.363042],[-0.261587,46.363226],[-0.261033,46.363454],[-0.260587,46.363626],[-0.260132,46.363798],[-0.259686,46.36396],[-0.259233,46.364119],[-0.258775,46.364272],[-0.258239,46.364441],[-0.257707,46.364607],[-0.257429,46.364691],[-0.257146,46.364773],[-0.256661,46.364908],[-0.256364,46.364989],[-0.256048,46.36507],[-0.255514,46.365206],[-0.2552,46.365278],[-0.254887,46.365348],[-0.254384,46.365458],[-0.253799,46.365581],[-0.253146,46.365706],[-0.252818,46.365765],[-0.252492,46.365821],[-0.251977,46.365901],[-0.251468,46.365978],[-0.250956,46.366053],[-0.250658,46.366093],[-0.25036,46.366131],[-0.249713,46.366208],[-0.248692,46.366321],[-0.248168,46.366374],[-0.247644,46.366424],[-0.246383,46.366541],[-0.246049,46.366568],[-0.244997,46.36666],[-0.242336,46.366899],[-0.237126,46.36737],[-0.231808,46.367842],[-0.229101,46.368083],[-0.22661,46.368315],[-0.22593,46.368389],[-0.225257,46.368469],[-0.224469,46.36857],[-0.223973,46.368639],[-0.223473,46.368718],[-0.222971,46.368804],[-0.222472,46.368894],[-0.222023,46.368989],[-0.221569,46.369088],[-0.221093,46.369207],[-0.220767,46.369293],[-0.220525,46.36936],[-0.220283,46.36943],[-0.219816,46.36957],[-0.219177,46.369773],[-0.2184,46.37005],[-0.217818,46.37027],[-0.217548,46.370381],[-0.217284,46.370505],[-0.216494,46.370883],[-0.2161,46.371097],[-0.215855,46.371237],[-0.215661,46.371349],[-0.21547,46.371463],[-0.215091,46.371704],[-0.214894,46.371832],[-0.214702,46.371962],[-0.214317,46.372225],[-0.21395,46.372492],[-0.213625,46.372742],[-0.213314,46.372993],[-0.213,46.37326],[-0.212703,46.373527],[-0.212415,46.373795],[-0.212146,46.374063],[-0.211879,46.374344],[-0.211622,46.374629],[-0.211364,46.374929],[-0.211115,46.375228],[-0.210892,46.375509],[-0.210621,46.375853],[-0.210431,46.376106],[-0.210248,46.376362],[-0.209866,46.376897],[-0.209526,46.377384],[-0.209194,46.377871],[-0.207806,46.379926],[-0.206431,46.381954],[-0.206102,46.382439],[-0.205741,46.382952],[-0.205362,46.383476],[-0.205188,46.383714],[-0.205011,46.383951],[-0.204875,46.38413],[-0.204736,46.384307],[-0.204478,46.384626],[-0.204316,46.384825],[-0.204149,46.385024],[-0.203884,46.385331],[-0.203634,46.385594],[-0.203446,46.385792],[-0.203171,46.386086],[-0.202888,46.386367],[-0.202591,46.386651],[-0.202278,46.386934],[-0.201952,46.387222],[-0.201645,46.387477],[-0.20132,46.387742],[-0.201041,46.387959],[-0.200791,46.388149],[-0.200535,46.38834],[-0.200265,46.388538],[-0.19991,46.388784],[-0.199329,46.389165],[-0.19908,46.389324],[-0.198566,46.389635],[-0.198307,46.389784],[-0.198043,46.389931],[-0.197781,46.390076],[-0.197511,46.390219],[-0.197244,46.390358],[-0.19697,46.390497],[-0.196698,46.390633],[-0.196422,46.390765],[-0.196,46.39096],[-0.195566,46.391154],[-0.195134,46.391339],[-0.194697,46.391519],[-0.194257,46.391689],[-0.193804,46.391857],[-0.193353,46.392016],[-0.192907,46.392167],[-0.192601,46.392267],[-0.192294,46.392365],[-0.191831,46.392501],[-0.191361,46.392629],[-0.191052,46.392712],[-0.190743,46.392792],[-0.190267,46.39291],[-0.1898,46.393016],[-0.189481,46.393086],[-0.189163,46.393153],[-0.188841,46.393218],[-0.188518,46.39328],[-0.188188,46.393341],[-0.187705,46.393422],[-0.187374,46.393476],[-0.187044,46.393527],[-0.18656,46.3936],[-0.186073,46.393672],[-0.185708,46.393722],[-0.185342,46.393771],[-0.184582,46.393865],[-0.183002,46.394055],[-0.181475,46.394235],[-0.179816,46.394442],[-0.178837,46.39457],[-0.178328,46.394641],[-0.177823,46.394716],[-0.177347,46.394788],[-0.176982,46.394849],[-0.176018,46.395014],[-0.175997,46.395018],[-0.175505,46.39511],[-0.175014,46.395207],[-0.174526,46.395306],[-0.174114,46.395395],[-0.173795,46.395465],[-0.173474,46.395539],[-0.172839,46.395696],[-0.172205,46.395855],[-0.171888,46.395937],[-0.171573,46.396021],[-0.170843,46.396224],[-0.170275,46.396391],[-0.169538,46.396622],[-0.168939,46.396816],[-0.168467,46.396976],[-0.168169,46.39708],[-0.167872,46.397186],[-0.167421,46.39735],[-0.167137,46.397457],[-0.166859,46.397564],[-0.166308,46.39778],[-0.16591,46.397944],[-0.164946,46.398353],[-0.164395,46.398597],[-0.163974,46.398793],[-0.163019,46.39925],[-0.162209,46.399646],[-0.161096,46.40021],[-0.159991,46.400778],[-0.159629,46.400967],[-0.158657,46.401479],[-0.155087,46.403338],[-0.152925,46.404456],[-0.151849,46.405012],[-0.1513,46.405294],[-0.150747,46.405571],[-0.150333,46.405774],[-0.149917,46.405976],[-0.149505,46.406176],[-0.149084,46.406372],[-0.148099,46.406829],[-0.147254,46.407203],[-0.146543,46.407517],[-0.146112,46.407699],[-0.145682,46.40788],[-0.145256,46.408058],[-0.144828,46.408235],[-0.143967,46.408576],[-0.142952,46.40897],[-0.142068,46.409301],[-0.141625,46.409462],[-0.141179,46.409622],[-0.140595,46.409829],[-0.140011,46.410035],[-0.139398,46.410245],[-0.138952,46.410392],[-0.138505,46.410536],[-0.138049,46.410683],[-0.137591,46.410828],[-0.136687,46.411108],[-0.136296,46.411225],[-0.135902,46.411342],[-0.135138,46.411566],[-0.134828,46.411657],[-0.134516,46.411746],[-0.133746,46.411952],[-0.133279,46.412077],[-0.13281,46.412199],[-0.131218,46.412595],[-0.130582,46.412747],[-0.129944,46.412898],[-0.129441,46.413012],[-0.128929,46.413125],[-0.127909,46.413344],[-0.126625,46.413601],[-0.12602,46.413719],[-0.125462,46.413828],[-0.123923,46.414135],[-0.118496,46.415204],[-0.116681,46.415562],[-0.116505,46.415598],[-0.115677,46.415767],[-0.114854,46.415936],[-0.114023,46.416125],[-0.113059,46.416348],[-0.112583,46.416463],[-0.112111,46.416582],[-0.111169,46.416825],[-0.110694,46.416952],[-0.110221,46.417084],[-0.109748,46.41722],[-0.109279,46.417359],[-0.108355,46.417646],[-0.107892,46.417795],[-0.10743,46.417954],[-0.106529,46.418261],[-0.105997,46.418451],[-0.105476,46.418646],[-0.105001,46.418825],[-0.104531,46.419009],[-0.103643,46.419368],[-0.102763,46.419738],[-0.102343,46.419921],[-0.101927,46.420107],[-0.10106,46.420512],[-0.09996,46.421047],[-0.099469,46.421291],[-0.098496,46.421796],[-0.097252,46.422458],[-0.095555,46.423377],[-0.093956,46.424242],[-0.092355,46.425107],[-0.09155,46.425532],[-0.091008,46.425811],[-0.090608,46.426013],[-0.090334,46.426146],[-0.089901,46.426355],[-0.089466,46.426562],[-0.089196,46.426687],[-0.088633,46.426943],[-0.088204,46.427125],[-0.087773,46.427307],[-0.087343,46.427483],[-0.087191,46.427542],[-0.087056,46.427593],[-0.08609,46.427948],[-0.08583,46.428036],[-0.08538,46.428187],[-0.085066,46.428288],[-0.084759,46.428382],[-0.084449,46.428473],[-0.084142,46.428563],[-0.083832,46.428651],[-0.083591,46.428716],[-0.083348,46.42878],[-0.082225,46.429071],[-0.081613,46.429226],[-0.081009,46.42937],[-0.077277,46.430233],[-0.07616,46.430484],[-0.072298,46.431373],[-0.071647,46.431528],[-0.071238,46.431626],[-0.070838,46.431727],[-0.070193,46.43189],[-0.069565,46.432053],[-0.06911,46.432171],[-0.068783,46.432256],[-0.068452,46.432348],[-0.068147,46.432431],[-0.067363,46.432651],[-0.066879,46.432791],[-0.065952,46.433066],[-0.065331,46.433256],[-0.064707,46.433449],[-0.064085,46.433648],[-0.063234,46.433925],[-0.062388,46.434208],[-0.060746,46.434791],[-0.060295,46.434958],[-0.059846,46.435126],[-0.058965,46.435463],[-0.058077,46.435814],[-0.057637,46.435989],[-0.057199,46.436169],[-0.056595,46.43642],[-0.055992,46.436677],[-0.054891,46.437152],[-0.033234,46.446779],[-0.033221,46.446785],[-0.031762,46.447394],[-0.030892,46.447748],[-0.030295,46.447986],[-0.029421,46.448328],[-0.028548,46.448659],[-0.028106,46.448826],[-0.027658,46.44899],[-0.026751,46.449316],[-0.026155,46.449529],[-0.025544,46.44974],[-0.02493,46.449948],[-0.024314,46.450153],[-0.023702,46.450354],[-0.023086,46.450551],[-0.022119,46.450852],[-0.02154,46.45103],[-0.02091,46.451218],[-0.019954,46.451498],[-0.018405,46.45193],[-0.01677,46.452371],[-0.011515,46.453792],[-0.010272,46.454127],[-0.009733,46.454274],[-0.006837,46.455048],[-0.003635,46.45591],[-0.003009,46.456083],[-0.002387,46.45626],[-0.001771,46.456438],[-0.001175,46.456616],[-6.35E-4,46.456783],[2.25E-4,46.45706],[2.65E-4,46.457073],[8.88E-4,46.457274],[0.001494,46.457471],[0.002118,46.457683],[0.002722,46.457889],[0.003988,46.458339],[0.00458,46.458557],[0.005478,46.458894],[0.006072,46.459122],[0.006664,46.459355],[0.007323,46.45962],[0.007979,46.459888],[0.008293,46.460018],[0.008605,46.460155],[0.009163,46.460397],[0.009865,46.460707],[0.010423,46.460958],[0.01173,46.461559],[0.013093,46.462221],[0.01444,46.462894],[0.014975,46.463166],[0.015502,46.463429],[0.015781,46.463565],[0.01606,46.463699],[0.016547,46.46393],[0.016991,46.464142],[0.017425,46.464344],[0.017858,46.464544],[0.018409,46.46479],[0.018863,46.464987],[0.019411,46.465226],[0.019601,46.465313],[0.019905,46.465443],[0.02053,46.465706],[0.021147,46.465962],[0.021798,46.466222],[0.022556,46.466522],[0.023145,46.466749],[0.023973,46.46706],[0.024314,46.467186],[0.024615,46.467294],[0.025367,46.467562],[0.026051,46.4678],[0.026518,46.467961],[0.026989,46.468117],[0.027603,46.468319],[0.028355,46.468561],[0.029114,46.468797],[0.029493,46.468911],[0.029874,46.469023],[0.030637,46.469246],[0.031247,46.469425],[0.032175,46.469683],[0.032951,46.469891],[0.033726,46.470096],[0.034983,46.470408],[0.035616,46.470558],[0.036251,46.470705],[0.036568,46.470777],[0.036887,46.47085],[0.037208,46.470921],[0.037684,46.471022],[0.03816,46.471116],[0.040738,46.471649],[0.043347,46.472188],[0.044715,46.472479],[0.04533,46.472603],[0.045669,46.472671],[0.045941,46.472724],[0.047254,46.472996],[0.047999,46.473155],[0.048736,46.47332],[0.049729,46.473541],[0.050331,46.473683],[0.050932,46.473828],[0.052042,46.474108],[0.052668,46.474275],[0.053275,46.474447],[0.053795,46.474599],[0.054312,46.474755],[0.054774,46.4749],[0.055232,46.475047],[0.055693,46.475201],[0.056146,46.475362],[0.05674,46.475576],[0.057195,46.475747],[0.057987,46.476052],[0.058363,46.476202],[0.058657,46.476323],[0.058946,46.476448],[0.059515,46.476697],[0.059941,46.476886],[0.060363,46.477083],[0.060929,46.477351],[0.06134,46.477553],[0.061749,46.477757],[0.062087,46.477932],[0.062418,46.47811],[0.062667,46.478242],[0.06291,46.478375],[0.063436,46.478674],[0.063696,46.478821],[0.063948,46.478969],[0.064456,46.47928],[0.064829,46.479515],[0.065199,46.47975],[0.065692,46.480072],[0.066171,46.480394],[0.0664,46.48055],[0.066879,46.480889],[0.067813,46.481566],[0.068955,46.482426],[0.069861,46.483126],[0.071675,46.484562],[0.071835,46.484687],[0.072004,46.484822],[0.074293,46.486618],[0.0752,46.487311],[0.075663,46.487656],[0.076247,46.488082],[0.077186,46.488763],[0.077675,46.489108],[0.078159,46.489443],[0.079123,46.490104],[0.080182,46.490813],[0.084434,46.493535],[0.086518,46.494868],[0.08758,46.495546],[0.088652,46.496222],[0.089406,46.496683],[0.089786,46.496912],[0.090172,46.497136],[0.090953,46.497585],[0.091348,46.49781],[0.091745,46.498032],[0.092149,46.498259],[0.092557,46.498484],[0.092957,46.498701],[0.093359,46.498918],[0.094172,46.499339],[0.094945,46.499732],[0.095779,46.500143],[0.096195,46.500346],[0.096615,46.500544],[0.09704,46.500742],[0.097467,46.50094],[0.097889,46.501133],[0.098316,46.501325],[0.099036,46.501646],[0.09961,46.501895],[0.100925,46.50246],[0.103612,46.503621],[0.10446,46.503977],[0.105309,46.504318],[0.105799,46.504511],[0.106241,46.504682],[0.107152,46.505018],[0.108052,46.505336],[0.108511,46.505499],[0.108973,46.505654],[0.109749,46.505909],[0.110661,46.506193],[0.111602,46.506477],[0.112076,46.506616],[0.112552,46.50675],[0.113,46.506874],[0.113449,46.506996],[0.11429,46.507212],[0.11541,46.507488],[0.116007,46.507633],[0.116956,46.507848],[0.117615,46.507988],[0.118264,46.508123],[0.118912,46.508252],[0.119571,46.508375],[0.120224,46.508492],[0.12122,46.508662],[0.122215,46.508817],[0.122882,46.508918],[0.123372,46.508987],[0.123709,46.509032],[0.124047,46.509075],[0.125048,46.509195],[0.125717,46.509274],[0.126385,46.509344],[0.127889,46.509499],[0.130772,46.509797],[0.137863,46.510532],[0.139167,46.510658],[0.139671,46.510704],[0.140175,46.510745],[0.141034,46.510811],[0.141385,46.510838],[0.142035,46.510874],[0.142686,46.510908],[0.143533,46.51095],[0.14391,46.510968],[0.144407,46.510986],[0.144829,46.510997],[0.145343,46.511011],[0.146334,46.511029],[0.146843,46.511036],[0.147348,46.511039],[0.148209,46.511038],[0.148642,46.511035],[0.149074,46.51103],[0.149368,46.511023],[0.149882,46.511012],[0.150471,46.510997],[0.151057,46.510977],[0.151631,46.510957],[0.151995,46.51094],[0.152358,46.510921],[0.153411,46.51086],[0.154084,46.510817],[0.154753,46.510769],[0.155435,46.510715],[0.156117,46.510655],[0.156873,46.510584],[0.157627,46.510504],[0.158143,46.510447],[0.158659,46.510389],[0.159316,46.510311],[0.159972,46.510229],[0.162964,46.509851],[0.167091,46.509337],[0.174653,46.508387],[0.174963,46.508348],[0.190645,46.50638],[0.191304,46.506305],[0.191944,46.506237],[0.192273,46.506203],[0.192607,46.506172],[0.193092,46.506132],[0.193593,46.506093],[0.193872,46.506076],[0.194153,46.506061],[0.19448,46.506044],[0.194808,46.506031],[0.195305,46.506017],[0.195978,46.506006],[0.196296,46.506004],[0.19662,46.506007],[0.196979,46.506014],[0.197548,46.506027],[0.198046,46.506049],[0.198558,46.506077],[0.19889,46.506096],[0.199224,46.506119],[0.199717,46.50616],[0.200052,46.50619],[0.200387,46.506223],[0.200876,46.506278],[0.20121,46.506316],[0.201542,46.506363],[0.202039,46.506435],[0.20253,46.506511],[0.203027,46.506596],[0.203497,46.50668],[0.20399,46.506774],[0.204478,46.506878],[0.204956,46.506987],[0.205404,46.507094],[0.205811,46.507196],[0.206279,46.507317],[0.206742,46.507447],[0.207209,46.507586],[0.207668,46.50773],[0.208259,46.507922],[0.208719,46.508082],[0.20917,46.508246],[0.209608,46.508418],[0.210049,46.508591],[0.210321,46.508699],[0.210617,46.508821],[0.211044,46.50901],[0.211516,46.509218],[0.211742,46.509325],[0.212165,46.509531],[0.212601,46.509755],[0.213003,46.509967],[0.2134,46.510186],[0.213941,46.510489],[0.214136,46.510599],[0.214325,46.510712],[0.214687,46.51094],[0.215276,46.511331],[0.215672,46.511579],[0.215909,46.511741],[0.216134,46.511907],[0.216512,46.512182],[0.216737,46.512351],[0.216955,46.512522],[0.217369,46.512852],[0.21778,46.513194],[0.218135,46.513511],[0.218481,46.51383],[0.218841,46.514188],[0.219168,46.514541],[0.219536,46.51494],[0.219892,46.51535],[0.22016,46.515683],[0.220481,46.516093],[0.220793,46.516509],[0.221086,46.516924],[0.221225,46.517132],[0.221359,46.517342],[0.221556,46.517656],[0.221765,46.517995],[0.222012,46.518446],[0.222821,46.51995],[0.223679,46.521572],[0.224117,46.522389],[0.224539,46.523143],[0.224733,46.523471],[0.224963,46.523848],[0.22517,46.524166],[0.225377,46.52447],[0.225595,46.524766],[0.225816,46.525062],[0.226045,46.525353],[0.226281,46.525639],[0.226541,46.525945],[0.226796,46.526232],[0.227016,46.526473],[0.227297,46.526764],[0.227438,46.526906],[0.227583,46.527049],[0.22773,46.52719],[0.22788,46.527331],[0.228172,46.527599],[0.228385,46.527788],[0.228594,46.527968],[0.228807,46.528148],[0.229026,46.528326],[0.229249,46.528502],[0.229582,46.52876],[0.229923,46.529014],[0.230283,46.529272],[0.230649,46.529524],[0.230839,46.529651],[0.231033,46.529776],[0.23122,46.529897],[0.231409,46.530016],[0.231791,46.530246],[0.231984,46.53036],[0.232176,46.53047],[0.232436,46.530616],[0.232698,46.530761],[0.23296,46.530902],[0.233234,46.531047],[0.233501,46.531185],[0.233769,46.531322],[0.234176,46.53152],[0.234587,46.531719],[0.236808,46.532773],[0.237963,46.533317],[0.239074,46.533853],[0.239628,46.534127],[0.240178,46.534407],[0.240709,46.53468],[0.24124,46.534959],[0.241777,46.535248],[0.242307,46.535539],[0.242826,46.535831],[0.243339,46.536126],[0.243915,46.536466],[0.244488,46.536808],[0.247706,46.538751],[0.248335,46.539134],[0.248967,46.539515],[0.251933,46.541296],[0.252184,46.541448],[0.254721,46.542978],[0.255603,46.543509],[0.25601,46.543753],[0.256421,46.543994],[0.256737,46.544175],[0.25705,46.544358],[0.257378,46.544539],[0.257845,46.544788],[0.258253,46.544998],[0.258517,46.54513],[0.259068,46.545391],[0.259344,46.545515],[0.259637,46.545641],[0.259921,46.545761],[0.260209,46.545878],[0.260501,46.545991],[0.260796,46.546099],[0.261102,46.546206],[0.261409,46.54631],[0.261716,46.546408],[0.262037,46.546509],[0.26237,46.546609],[0.26284,46.546737],[0.263149,46.54682],[0.263452,46.546897],[0.263795,46.546979],[0.264027,46.547031],[0.264261,46.54708],[0.264585,46.54715],[0.26504,46.547246],[0.265437,46.547323],[0.265837,46.547398],[0.266638,46.547544],[0.267448,46.547688],[0.268235,46.547826],[0.270307,46.548207],[0.270947,46.548329],[0.271425,46.548425],[0.271901,46.548528],[0.272384,46.54864],[0.272695,46.548714],[0.273007,46.54879],[0.273345,46.548878],[0.273658,46.54897],[0.274121,46.549107],[0.274599,46.549256],[0.275005,46.549393],[0.275357,46.549517],[0.275648,46.549624],[0.275936,46.549732],[0.276204,46.549837],[0.276488,46.549953],[0.27677,46.550075],[0.277057,46.550204],[0.277337,46.550337],[0.277605,46.550467],[0.278014,46.550674],[0.278395,46.550879],[0.278677,46.551031],[0.278821,46.551108],[0.279069,46.551261],[0.279409,46.551474],[0.280002,46.55185],[0.280292,46.552047],[0.280635,46.552296],[0.280854,46.552467],[0.281269,46.552805],[0.281524,46.553018],[0.28179,46.553257],[0.282119,46.553557],[0.282312,46.553747],[0.282502,46.553937],[0.282841,46.554292],[0.282963,46.554431],[0.283123,46.554611],[0.283281,46.554796],[0.283388,46.554931],[0.283702,46.555334],[0.28388,46.555585],[0.284055,46.555837],[0.284202,46.556058],[0.28438,46.556345],[0.284524,46.556591],[0.284659,46.556839],[0.284858,46.557224],[0.284946,46.557412],[0.285065,46.557662],[0.285299,46.558215],[0.285434,46.558545],[0.285552,46.558856],[0.28556,46.558876],[0.285741,46.559397],[0.285953,46.559987],[0.286437,46.56145],[0.286581,46.561907],[0.286807,46.562653],[0.286923,46.563036],[0.287026,46.563421],[0.287361,46.564682],[0.287677,46.565947],[0.288004,46.567243],[0.288354,46.568519],[0.288514,46.569074],[0.288664,46.569642],[0.288972,46.570838],[0.289639,46.57343],[0.289842,46.574221],[0.289933,46.574626],[0.290093,46.57523],[0.290256,46.575821],[0.290506,46.576699],[0.290654,46.577172],[0.29081,46.577638],[0.290883,46.577862],[0.290973,46.57809],[0.291162,46.578546],[0.29138,46.579024],[0.291599,46.579499],[0.291777,46.579848],[0.291953,46.580174],[0.292136,46.580506],[0.292333,46.580831],[0.292546,46.581178],[0.292769,46.581526],[0.292994,46.581861],[0.293225,46.582191],[0.293454,46.582514],[0.293686,46.582825],[0.293931,46.583138],[0.294173,46.583452],[0.294423,46.583761],[0.294676,46.584071],[0.295194,46.584682],[0.29575,46.585319],[0.296034,46.585634],[0.296326,46.585949],[0.296827,46.586483],[0.297071,46.586741],[0.297324,46.586999],[0.297917,46.587607],[0.298522,46.58821],[0.298818,46.588511],[0.299121,46.588812],[0.299416,46.589106],[0.299717,46.589399],[0.30031,46.589981],[0.300904,46.590561],[0.301502,46.591143],[0.302094,46.591716],[0.3029,46.592484],[0.303719,46.593257],[0.305177,46.594585],[0.305919,46.595242],[0.306676,46.595899],[0.30696,46.596145],[0.307247,46.596389],[0.307866,46.596905],[0.308252,46.59722],[0.308641,46.597535],[0.3093,46.598062],[0.310064,46.598664],[0.310396,46.598925],[0.31073,46.599182],[0.311862,46.600046],[0.312404,46.600456],[0.312954,46.600861],[0.314579,46.602026],[0.314902,46.60226],[0.315756,46.602844],[0.316237,46.603167],[0.316715,46.603491],[0.317193,46.603813],[0.317917,46.604289],[0.318403,46.604605],[0.31889,46.604918],[0.319343,46.605204],[0.319898,46.605554],[0.320963,46.606213],[0.321418,46.606486],[0.323116,46.607495],[0.323565,46.607755],[0.324018,46.608011],[0.324924,46.608524],[0.325441,46.608814],[0.325968,46.609101],[0.326438,46.609358],[0.326911,46.609615],[0.32727,46.609805],[0.327633,46.609997],[0.327966,46.610176],[0.328301,46.610354],[0.329111,46.61077],[0.329906,46.611173],[0.330452,46.611445],[0.33072,46.611578],[0.331111,46.611773],[0.331401,46.611912],[0.332088,46.612252],[0.334226,46.6133],[0.336413,46.614369],[0.336965,46.614637],[0.337512,46.614908],[0.338581,46.615456],[0.339094,46.615726],[0.339604,46.615997],[0.339849,46.616132],[0.340089,46.616269],[0.340511,46.616513],[0.340887,46.61674],[0.341258,46.616971],[0.341626,46.617206],[0.341991,46.617442],[0.342338,46.61768],[0.342683,46.61792],[0.343273,46.618359],[0.343626,46.618627],[0.343976,46.618899],[0.344381,46.619226],[0.344748,46.619532],[0.345249,46.619966],[0.345637,46.620334],[0.346009,46.620695],[0.346373,46.621059],[0.346761,46.621472],[0.347109,46.621854],[0.34744,46.622235],[0.347762,46.622624],[0.347774,46.622643],[0.348341,46.623389],[0.348879,46.624136],[0.34911,46.624488],[0.349332,46.624841],[0.349489,46.625098],[0.34964,46.625357],[0.349857,46.625747],[0.35005,46.626113],[0.350232,46.626482],[0.350348,46.626723],[0.35046,46.626967],[0.350557,46.627191],[0.350654,46.627417],[0.35079,46.627754],[0.350957,46.628201],[0.351112,46.628652],[0.351186,46.628882],[0.351255,46.629111],[0.351321,46.629341],[0.351383,46.62957],[0.35147,46.629905],[0.351471,46.62991],[0.35163,46.630587],[0.351779,46.631268],[0.352074,46.632597],[0.352235,46.633276],[0.352291,46.633507],[0.352353,46.63374],[0.352489,46.634196],[0.352525,46.634326],[0.352635,46.634719],[0.352731,46.635085],[0.352836,46.635494],[0.352927,46.635835],[0.35302,46.636167],[0.353078,46.636388],[0.353142,46.636609],[0.353242,46.636947],[0.353386,46.637396],[0.353491,46.63772],[0.35357,46.637947],[0.353645,46.638178],[0.354097,46.63965],[0.354237,46.640103],[0.354372,46.640557],[0.35447,46.640896],[0.354573,46.641238],[0.35473,46.641811],[0.354876,46.642385],[0.354938,46.642636],[0.354995,46.642887],[0.355073,46.643234],[0.355142,46.643582],[0.355274,46.644265],[0.35535,46.644733],[0.355403,46.645081],[0.355453,46.64543],[0.3555,46.645777],[0.35554,46.646125],[0.355597,46.646712],[0.355644,46.647291],[0.355668,46.647753],[0.355685,46.648216],[0.355699,46.648684],[0.355701,46.649039],[0.355701,46.649417],[0.355692,46.649793],[0.355681,46.650171],[0.355663,46.65057],[0.355644,46.650926],[0.355621,46.651285],[0.355566,46.651973],[0.355492,46.65288],[0.355457,46.653273],[0.355427,46.653665],[0.355393,46.654137],[0.355375,46.654412],[0.35536,46.654689],[0.355344,46.655077],[0.355325,46.655509],[0.355309,46.656087],[0.355314,46.656546],[0.355352,46.657393],[0.355377,46.657901],[0.355392,46.658138],[0.355403,46.65829],[0.355403,46.658384],[0.355428,46.658622],[0.355445,46.658855],[0.355505,46.659394],[0.35554,46.659692],[0.355579,46.659989],[0.355619,46.660269],[0.355663,46.66055],[0.355738,46.661002],[0.355819,46.661462],[0.35591,46.661945],[0.356024,46.662514],[0.356256,46.663646],[0.356493,46.664751],[0.356608,46.665305],[0.356732,46.66586],[0.356764,46.665985],[0.356937,46.666857],[0.357114,46.667709],[0.357477,46.669464],[0.357665,46.670437],[0.358189,46.672939],[0.358283,46.67337],[0.358619,46.675007],[0.358861,46.676084],[0.358954,46.676508],[0.359108,46.677115],[0.359268,46.67772],[0.359373,46.678111],[0.359501,46.678533],[0.359652,46.678992],[0.359771,46.679345],[0.359926,46.679777],[0.359933,46.679797],[0.360097,46.680242],[0.360264,46.680676],[0.360439,46.68111],[0.360561,46.681398],[0.360684,46.681686],[0.360942,46.682268],[0.361154,46.682728],[0.361377,46.683195],[0.361697,46.683813],[0.361852,46.684101],[0.362011,46.68439],[0.362295,46.684893],[0.36258,46.685389],[0.363241,46.686458],[0.363936,46.687517],[0.365354,46.689635],[0.365778,46.690287],[0.365978,46.690605],[0.366173,46.690925],[0.366379,46.691258],[0.366575,46.691592],[0.366772,46.69193],[0.366963,46.692269],[0.367306,46.692923],[0.367676,46.693668],[0.367837,46.693996],[0.367994,46.694324],[0.368157,46.694665],[0.368312,46.695006],[0.368515,46.695485],[0.368711,46.695964],[0.368842,46.696301],[0.368968,46.696639],[0.369188,46.697246],[0.369526,46.698287],[0.369956,46.699688],[0.370434,46.701202],[0.370571,46.701608],[0.370711,46.702014],[0.37099,46.702779],[0.37116,46.703222],[0.371338,46.703665],[0.371527,46.704111],[0.371714,46.704544],[0.372012,46.705191],[0.37216,46.705506],[0.372342,46.705882],[0.372519,46.706234],[0.372723,46.706633],[0.372921,46.707005],[0.373126,46.707376],[0.373335,46.707751],[0.373547,46.708124],[0.373777,46.708514],[0.374017,46.7089],[0.374257,46.709284],[0.374501,46.709656],[0.374765,46.710055],[0.375025,46.710445],[0.375302,46.710842],[0.375574,46.711225],[0.376095,46.711936],[0.376641,46.712647],[0.376875,46.712946],[0.377245,46.713401],[0.377625,46.713855],[0.378015,46.714318],[0.378417,46.714781],[0.378806,46.71521],[0.379001,46.715427],[0.379202,46.715636],[0.380001,46.716487],[0.380411,46.716887],[0.380823,46.717286],[0.381662,46.718079],[0.38216,46.718527],[0.382664,46.718974],[0.383031,46.719292],[0.383403,46.719609],[0.38378,46.719925],[0.38416,46.720235],[0.38456,46.720562],[0.384965,46.720884],[0.385782,46.721528],[0.390595,46.725208],[0.395404,46.72889],[0.397043,46.730136],[0.397932,46.730809],[0.398377,46.731143],[0.398828,46.731476],[0.399138,46.7317],[0.399452,46.731922],[0.400075,46.732358],[0.40063,46.732735],[0.401185,46.7331],[0.401722,46.733447],[0.402256,46.733783],[0.402823,46.734128],[0.403394,46.734467],[0.404417,46.73506],[0.40474,46.73524],[0.405071,46.73542],[0.405729,46.735774],[0.406359,46.736109],[0.406688,46.736278],[0.40702,46.736445],[0.407576,46.736718],[0.408138,46.736986],[0.408724,46.73726],[0.409306,46.737529],[0.409738,46.737721],[0.410173,46.737911],[0.410616,46.738106],[0.411052,46.738289],[0.411458,46.738458],[0.411676,46.738551],[0.411901,46.738641],[0.412348,46.738821],[0.412811,46.738998],[0.413575,46.739287],[0.414454,46.739606],[0.414894,46.739764],[0.415335,46.739917],[0.415763,46.740064],[0.416269,46.740235],[0.416891,46.740441],[0.417515,46.740643],[0.418851,46.741073],[0.421683,46.741986],[0.421987,46.742087],[0.423003,46.742428],[0.424088,46.74281],[0.424999,46.743142],[0.425754,46.74343],[0.426488,46.743715],[0.427198,46.743997],[0.427971,46.74432],[0.428749,46.744649],[0.429438,46.744952],[0.430122,46.745258],[0.43076,46.745552],[0.431394,46.745848],[0.431914,46.7461],[0.432445,46.746363],[0.432899,46.746588],[0.433359,46.746823],[0.433803,46.747052],[0.434254,46.74729],[0.435204,46.747805],[0.436045,46.748278],[0.436646,46.748621],[0.437065,46.748867],[0.43746,46.749104],[0.437853,46.749344],[0.43968,46.750474],[0.441208,46.751451],[0.442723,46.752434],[0.445788,46.754428],[0.446792,46.755079],[0.447825,46.755722],[0.448354,46.756049],[0.448871,46.756362],[0.449133,46.756524],[0.449399,46.756683],[0.449929,46.756995],[0.450199,46.757154],[0.450469,46.757309],[0.451015,46.757623],[0.451571,46.757933],[0.451852,46.75809],[0.452138,46.758246],[0.452693,46.75854],[0.453239,46.758825],[0.453808,46.759117],[0.454469,46.759445],[0.455057,46.75973],[0.455599,46.759987],[0.456183,46.760257],[0.456769,46.760526],[0.457401,46.760813],[0.457712,46.760949],[0.458038,46.761091],[0.45866,46.761358],[0.459212,46.761586],[0.460796,46.762239],[0.461174,46.762396],[0.461564,46.762548],[0.462335,46.762854],[0.462604,46.762963],[0.467127,46.764728],[0.469403,46.765622],[0.470529,46.76607],[0.471099,46.766296],[0.47167,46.766518],[0.472295,46.766757],[0.472924,46.767003],[0.473552,46.767251],[0.47418,46.767497],[0.476687,46.768484],[0.481702,46.770454],[0.482371,46.77073],[0.483034,46.770999],[0.4837,46.771264],[0.484375,46.771538],[0.485022,46.771809],[0.485665,46.772088],[0.486297,46.772367],[0.486926,46.772651],[0.487361,46.772846],[0.487782,46.773045],[0.48821,46.773246],[0.488625,46.773451],[0.48948,46.773883],[0.490328,46.774319],[0.49102,46.774695],[0.49171,46.775084],[0.492456,46.775511],[0.492827,46.775723],[0.49319,46.775936],[0.493826,46.776326],[0.494467,46.776727],[0.494971,46.777055],[0.495474,46.777387],[0.495928,46.777696],[0.496374,46.778005],[0.496876,46.778358],[0.49737,46.778715],[0.49743,46.778758],[0.498879,46.779867],[0.49926,46.780169],[0.499632,46.780472],[0.500254,46.780994],[0.500831,46.781494],[0.501291,46.781907],[0.502761,46.783297],[0.503538,46.784062],[0.503789,46.784343],[0.504054,46.784628],[0.50444,46.785051],[0.504819,46.785475],[0.505199,46.785911],[0.505568,46.786349],[0.505951,46.786818],[0.506321,46.787292],[0.506767,46.787883],[0.506989,46.788184],[0.507208,46.788473],[0.507553,46.788949],[0.507879,46.789427],[0.508213,46.789932],[0.508536,46.79044],[0.508906,46.791049],[0.508979,46.791176],[0.509817,46.79267],[0.510114,46.79325],[0.5104,46.793833],[0.51071,46.794509],[0.511005,46.795189],[0.511184,46.795622],[0.511356,46.796057],[0.511522,46.796499],[0.511681,46.796944],[0.511876,46.797509],[0.51197,46.797795],[0.512058,46.79808],[0.512196,46.798538],[0.512328,46.798997],[0.51246,46.799503],[0.512581,46.800009],[0.512668,46.800403],[0.512683,46.800473],[0.512779,46.800938],[0.512877,46.801438],[0.512955,46.801942],[0.513023,46.8024],[0.513092,46.802848],[0.51321,46.803703],[0.51407,46.811334],[0.514106,46.811653],[0.514143,46.811969],[0.514181,46.812266],[0.514216,46.812563],[0.514265,46.812923],[0.514321,46.813278],[0.514411,46.813752],[0.514506,46.814177],[0.514607,46.814602],[0.514727,46.815062],[0.514792,46.815293],[0.514863,46.815528],[0.514952,46.815795],[0.515064,46.81613],[0.515188,46.816471],[0.515329,46.816838],[0.515475,46.817209],[0.515726,46.817794],[0.515849,46.818087],[0.515982,46.818379],[0.516123,46.818687],[0.516266,46.818994],[0.516411,46.819303],[0.516559,46.819609],[0.51679,46.820067],[0.517028,46.820524],[0.518126,46.82274],[0.5192,46.824912],[0.519403,46.82534],[0.519617,46.825777],[0.520023,46.82657],[0.52114,46.828826],[0.521904,46.830363],[0.522268,46.831125],[0.522455,46.83151],[0.522643,46.831888],[0.522958,46.832543],[0.523252,46.833198],[0.523445,46.833641],[0.523625,46.834083],[0.523652,46.834176],[0.52405,46.835228],[0.524415,46.836262],[0.524672,46.837117],[0.524774,46.837507],[0.52488,46.837891],[0.525064,46.838622],[0.525225,46.839357],[0.525355,46.840005],[0.525427,46.840408],[0.525496,46.84081],[0.525591,46.841402],[0.525677,46.841996],[0.525758,46.842621],[0.525834,46.843245],[0.525966,46.844563],[0.526002,46.84493],[0.526029,46.845295],[0.526083,46.846029],[0.52612,46.846577],[0.526151,46.847124],[0.52618,46.84777],[0.526205,46.848415],[0.526235,46.849706],[0.526229,46.851039],[0.526197,46.852313],[0.526181,46.852732],[0.526161,46.853152],[0.526116,46.853991],[0.526063,46.8549],[0.525989,46.855786],[0.52593,46.856455],[0.525856,46.857122],[0.525815,46.857452],[0.525771,46.857779],[0.525691,46.858433],[0.5256,46.859067],[0.525507,46.859694],[0.525314,46.860827],[0.52519,46.861516],[0.525048,46.862198],[0.524959,46.862581],[0.524867,46.862961],[0.524757,46.863391],[0.524641,46.863819],[0.524449,46.864505],[0.524281,46.865059],[0.524172,46.865398],[0.524057,46.865737],[0.523948,46.866046],[0.523836,46.866353],[0.523603,46.866963],[0.523493,46.867246],[0.523378,46.867529],[0.523258,46.867811],[0.523139,46.868082],[0.522901,46.868616],[0.522656,46.869149],[0.522411,46.869653],[0.52216,46.870158],[0.521817,46.87083],[0.521467,46.871501],[0.520764,46.87284],[0.520471,46.873401],[0.520186,46.873964],[0.519937,46.874462],[0.519698,46.874963],[0.519533,46.875323],[0.519398,46.875629],[0.519272,46.875933],[0.519161,46.876219],[0.519053,46.876505],[0.518848,46.877073],[0.518746,46.877361],[0.518659,46.877651],[0.518572,46.877939],[0.518489,46.878229],[0.518307,46.878947],[0.518228,46.87932],[0.518126,46.879837],[0.518042,46.88035],[0.518001,46.880613],[0.517968,46.880875],[0.517935,46.881134],[0.517907,46.881394],[0.517871,46.881848],[0.517839,46.882299],[0.517822,46.882819],[0.517817,46.883074],[0.517817,46.88333],[0.517827,46.8838],[0.517849,46.884269],[0.517864,46.884514],[0.517885,46.88476],[0.517933,46.885252],[0.517995,46.885743],[0.518065,46.886235],[0.518143,46.886721],[0.518232,46.887207],[0.518448,46.888268],[0.519531,46.893402],[0.520108,46.896116],[0.520389,46.897435],[0.52053,46.898095],[0.520679,46.898753],[0.520714,46.898891],[0.520814,46.899407],[0.520926,46.899922],[0.521035,46.900439],[0.521149,46.90095],[0.52134,46.90174],[0.52144,46.902137],[0.521545,46.90253],[0.521643,46.90288],[0.521724,46.90317],[0.521826,46.903478],[0.521906,46.903725],[0.522078,46.904219],[0.522231,46.904625],[0.522417,46.905105],[0.522657,46.90568],[0.522919,46.90625],[0.523048,46.906528],[0.523184,46.906801],[0.523464,46.90734],[0.523664,46.907711],[0.523888,46.908123],[0.524057,46.908397],[0.524249,46.908716],[0.524647,46.909352],[0.524856,46.909662],[0.525067,46.909969],[0.52528,46.910274],[0.525501,46.910579],[0.525741,46.910913],[0.525993,46.911243],[0.526248,46.911575],[0.526511,46.911905],[0.527151,46.912691],[0.529085,46.915025],[0.529212,46.915173],[0.529597,46.91566],[0.529992,46.916138],[0.530782,46.917099],[0.532325,46.918965],[0.532366,46.919014],[0.533664,46.920595],[0.534969,46.922168],[0.536281,46.92375],[0.536937,46.92454],[0.537591,46.925324],[0.537965,46.925775],[0.53833,46.92623],[0.539043,46.927155],[0.539652,46.928017],[0.540332,46.928955],[0.540976,46.929922],[0.541601,46.93093],[0.54205,46.931712],[0.542491,46.932476],[0.542887,46.933221],[0.543268,46.933983],[0.543495,46.934463],[0.543715,46.934945],[0.543947,46.935476],[0.544172,46.936008],[0.544409,46.936597],[0.544641,46.937188],[0.544974,46.938116],[0.545304,46.939043],[0.545606,46.939977],[0.545904,46.940911],[0.546136,46.941618],[0.54636,46.942326],[0.546677,46.943333],[0.546805,46.94374],[0.547373,46.94554],[0.547932,46.947341],[0.548172,46.948129],[0.548397,46.948918],[0.548615,46.949716],[0.548706,46.950111],[0.548802,46.95051],[0.548883,46.950873],[0.548955,46.951235],[0.549019,46.951595],[0.549078,46.951954],[0.54914,46.952416],[0.549194,46.952877],[0.549234,46.953258],[0.54927,46.95364],[0.549313,46.954164],[0.549345,46.954688],[0.549371,46.955212],[0.549378,46.95573],[0.54937,46.956205],[0.549359,46.956678],[0.54934,46.957153],[0.549317,46.957627],[0.549274,46.958196],[0.549222,46.958761],[0.549162,46.959277],[0.549106,46.959788],[0.54904,46.960321],[0.548961,46.960856],[0.548795,46.961947],[0.548493,46.963749],[0.548224,46.965292],[0.548199,46.965437],[0.547071,46.971907],[0.546968,46.972521],[0.546872,46.973128],[0.546778,46.973818],[0.546694,46.974507],[0.546678,46.974684],[0.546643,46.975278],[0.546624,46.975871],[0.546622,46.9763],[0.546627,46.976728],[0.546654,46.97724],[0.54669,46.977749],[0.54673,46.978163],[0.546783,46.978575],[0.546844,46.979027],[0.546922,46.979478],[0.546995,46.979916],[0.547074,46.980352],[0.547158,46.9808],[0.547246,46.981246],[0.54734,46.981693],[0.54744,46.982139],[0.547825,46.983925],[0.548193,46.985699],[0.548379,46.986583],[0.548569,46.987474],[0.548693,46.988084],[0.54881,46.98869],[0.548941,46.989296],[0.549078,46.989893],[0.54919,46.990359],[0.549306,46.990825],[0.549429,46.991295],[0.549559,46.991763],[0.549772,46.992508],[0.549998,46.993249],[0.550091,46.993559],[0.550191,46.993869],[0.550391,46.994487],[0.550584,46.995046],[0.550781,46.995603],[0.550982,46.99616],[0.551187,46.996715],[0.551628,46.997823],[0.551867,46.998401],[0.551931,46.998556],[0.552235,46.999278],[0.552389,46.9996],[0.552502,46.999858],[0.552812,47.00051],[0.552976,47.000847],[0.553195,47.001288],[0.553523,47.001953],[0.553752,47.002411],[0.553941,47.002817],[0.554236,47.00337],[0.554419,47.003711],[0.555166,47.005059],[0.556038,47.006511],[0.556968,47.008081],[0.558681,47.011032],[0.560141,47.01352],[0.561575,47.016018],[0.562629,47.017805],[0.565674,47.022978],[0.566628,47.024595],[0.567625,47.026289],[0.568123,47.027138],[0.568633,47.027984],[0.568848,47.028352],[0.569482,47.029364],[0.569726,47.029723],[0.570042,47.030201],[0.570279,47.030566],[0.570577,47.030998],[0.570807,47.031311],[0.571264,47.031939],[0.571495,47.032246],[0.571732,47.032553],[0.571997,47.032893],[0.572272,47.033231],[0.572408,47.033391],[0.572988,47.034068],[0.573278,47.034403],[0.573578,47.034737],[0.573802,47.034982],[0.57403,47.035227],[0.574495,47.035711],[0.574728,47.035955],[0.574969,47.036197],[0.575454,47.036678],[0.575941,47.037152],[0.576432,47.037623],[0.577086,47.038232],[0.577747,47.038838],[0.579079,47.040049],[0.5804,47.041263],[0.581056,47.041876],[0.581695,47.042491],[0.581989,47.042781],[0.58228,47.043073],[0.582805,47.043608],[0.58327,47.0441],[0.583776,47.044659],[0.584031,47.044948],[0.584411,47.045401],[0.584742,47.045818],[0.584895,47.046015],[0.585436,47.046739],[0.585735,47.04716],[0.586022,47.047585],[0.586262,47.047957],[0.586495,47.048331],[0.586718,47.048708],[0.586932,47.049086],[0.58716,47.049506],[0.587375,47.04993],[0.587561,47.050316],[0.587739,47.050703],[0.587982,47.051258],[0.588164,47.05171],[0.588292,47.052047],[0.588489,47.052615],[0.58859,47.052927],[0.588685,47.05324],[0.588818,47.053715],[0.588943,47.054193],[0.589014,47.054499],[0.589079,47.054804],[0.589206,47.055485],[0.589267,47.055868],[0.589322,47.056253],[0.589362,47.056599],[0.589396,47.056945],[0.589426,47.057299],[0.589447,47.057653],[0.589458,47.057884],[0.589465,47.058115],[0.589469,47.058577],[0.589463,47.05905],[0.589457,47.059283],[0.589447,47.059516],[0.589429,47.05981],[0.589406,47.060102],[0.589349,47.060687],[0.589308,47.061032],[0.589261,47.061378],[0.589227,47.061614],[0.589191,47.061848],[0.589142,47.062151],[0.589088,47.062456],[0.58894,47.063248],[0.588784,47.064042],[0.588736,47.064282],[0.587209,47.071843],[0.58704,47.072764],[0.586883,47.073698],[0.586812,47.074157],[0.586646,47.075314],[0.586552,47.076069],[0.586465,47.076823],[0.586388,47.077594],[0.586326,47.078281],[0.586273,47.07895],[0.586228,47.079619],[0.586192,47.08029],[0.58616,47.080962],[0.586137,47.081636],[0.586121,47.082311],[0.586108,47.083667],[0.58612,47.084605],[0.586145,47.085542],[0.586193,47.086657],[0.586261,47.08775],[0.586343,47.088788],[0.586395,47.089367],[0.586454,47.089949],[0.586595,47.091172],[0.586679,47.09181],[0.58677,47.092447],[0.586896,47.093261],[0.587032,47.094073],[0.587135,47.09465],[0.587245,47.095228],[0.587312,47.095573],[0.587383,47.095918],[0.587527,47.096605],[0.587659,47.097179],[0.587796,47.097752],[0.587924,47.098268],[0.588061,47.098783],[0.5882,47.099298],[0.588348,47.099814],[0.58851,47.100344],[0.588553,47.100489],[0.588734,47.10106],[0.588922,47.101625],[0.589058,47.10203],[0.589203,47.102436],[0.589305,47.10272],[0.589412,47.103007],[0.589552,47.103368],[0.589696,47.103731],[0.589846,47.1041],[0.59,47.104469],[0.59016,47.10484],[0.590325,47.105211],[0.590553,47.105709],[0.59076,47.106143],[0.590988,47.106607],[0.591229,47.107071],[0.591397,47.107392],[0.59157,47.107712],[0.591751,47.108038],[0.591934,47.108363],[0.592138,47.108711],[0.592348,47.109058],[0.592682,47.109597],[0.592902,47.109944],[0.593128,47.110291],[0.593312,47.110567],[0.593498,47.110843],[0.593883,47.111395],[0.594209,47.11185],[0.594545,47.112302],[0.594707,47.112513],[0.594875,47.112723],[0.595214,47.113141],[0.595998,47.114089],[0.596348,47.114496],[0.596699,47.114901],[0.597063,47.115313],[0.597379,47.115656],[0.597602,47.115914],[0.598016,47.116357],[0.598228,47.116578],[0.598446,47.116798],[0.598841,47.11719],[0.599133,47.117476],[0.599429,47.11776],[0.599621,47.117941],[0.599813,47.11812],[0.600112,47.118397],[0.600413,47.118672],[0.600825,47.119035],[0.601252,47.119407],[0.601516,47.119634],[0.601782,47.11986],[0.602052,47.120084],[0.602327,47.120307],[0.60278,47.120668],[0.603234,47.12103],[0.603484,47.121227],[0.603737,47.121421],[0.604251,47.121808],[0.604865,47.122261],[0.605487,47.122714],[0.606738,47.123617],[0.607327,47.124037],[0.607911,47.124458],[0.608495,47.124879],[0.609073,47.125306],[0.609388,47.125539],[0.609698,47.125776],[0.610007,47.126015],[0.61031,47.126255],[0.610723,47.126587],[0.611014,47.126835],[0.611296,47.127087],[0.611853,47.127595],[0.612131,47.127851],[0.612396,47.128109],[0.612825,47.128549],[0.613078,47.128817],[0.613324,47.129088],[0.613563,47.129359],[0.613799,47.12963],[0.614028,47.129907],[0.614251,47.130187],[0.614468,47.130467],[0.614682,47.130748],[0.614886,47.131032],[0.615083,47.131318],[0.615247,47.13156],[0.615405,47.131802],[0.615701,47.13229],[0.616063,47.132882],[0.616232,47.133186],[0.616391,47.133486],[0.617057,47.134751],[0.618086,47.136615],[0.618392,47.137153],[0.618693,47.137702],[0.619253,47.138803],[0.619455,47.139197],[0.61966,47.139588],[0.620045,47.140369],[0.620414,47.141218],[0.620588,47.141628],[0.620751,47.142037],[0.620921,47.142439],[0.621082,47.14284],[0.621299,47.14344],[0.621441,47.14387],[0.621608,47.144389],[0.621764,47.14491],[0.622062,47.145942],[0.622586,47.148032],[0.622907,47.149376],[0.62324,47.150717],[0.623561,47.151982],[0.623644,47.152304],[0.623737,47.152625],[0.623922,47.153236],[0.624062,47.153691],[0.624209,47.154147],[0.624368,47.154616],[0.624485,47.154958],[0.624609,47.155298],[0.624861,47.155975],[0.625132,47.156643],[0.625417,47.15731],[0.625564,47.157643],[0.625717,47.157973],[0.625898,47.158363],[0.626084,47.158754],[0.62627,47.159128],[0.626468,47.1595],[0.626603,47.15975],[0.626642,47.159822],[0.62727,47.160936],[0.627459,47.161261],[0.627656,47.161585],[0.628063,47.162236],[0.628304,47.162603],[0.628551,47.162968],[0.628672,47.163151],[0.628975,47.163616],[0.629277,47.164023],[0.629709,47.164614],[0.629995,47.164995],[0.630288,47.165374],[0.630816,47.16604],[0.631409,47.166762],[0.632084,47.167561],[0.632944,47.168557],[0.633568,47.169257],[0.634276,47.170055],[0.634985,47.170843],[0.636127,47.172129],[0.636655,47.17273],[0.637169,47.173336],[0.637469,47.17369],[0.637764,47.174044],[0.638036,47.174379],[0.638303,47.174714],[0.638686,47.175197],[0.639064,47.175684],[0.639494,47.176261],[0.639917,47.176837],[0.640361,47.177466],[0.640794,47.178099],[0.641279,47.178844],[0.641752,47.179595],[0.642234,47.180397],[0.6427,47.181203],[0.643106,47.181944],[0.643493,47.182695],[0.643941,47.183569],[0.644318,47.184324],[0.644901,47.185555],[0.645463,47.186786],[0.646237,47.188533],[0.646998,47.190283],[0.648526,47.193796],[0.651595,47.200866],[0.651819,47.201375],[0.654558,47.207682],[0.654923,47.208581],[0.655275,47.209478],[0.655527,47.210161],[0.655761,47.210837],[0.656059,47.211747],[0.656275,47.212416],[0.656481,47.213092],[0.656662,47.213732],[0.656837,47.214373],[0.657153,47.21563],[0.65728,47.2162],[0.657355,47.216531],[0.65751,47.217182],[0.657591,47.217737],[0.657716,47.218453],[0.657824,47.219144],[0.65794,47.219859],[0.65799,47.220159],[0.658008,47.220296],[0.658063,47.220736],[0.658091,47.221114],[0.658154,47.221833],[0.658178,47.222057],[0.658259,47.223062],[0.658323,47.224069],[0.658341,47.224475],[0.658448,47.22582],[0.658716,47.230404],[0.658784,47.231217],[0.658853,47.231911],[0.658933,47.232612],[0.658994,47.233066],[0.659061,47.233522],[0.659174,47.234221],[0.659305,47.234916],[0.659402,47.235374],[0.659503,47.235832],[0.659729,47.236754],[0.659852,47.237212],[0.659981,47.237668],[0.66012,47.23812],[0.660264,47.238571],[0.660502,47.239253],[0.660621,47.239591],[0.660741,47.239929],[0.660942,47.240486],[0.661105,47.240938],[0.661276,47.241389],[0.66145,47.24184],[0.661626,47.242289],[0.662519,47.244546],[0.662822,47.24533],[0.663118,47.246116],[0.663362,47.246796],[0.663595,47.247476],[0.663816,47.248155],[0.663939,47.248549],[0.664331,47.249952],[0.664618,47.251175],[0.66486,47.252282],[0.665183,47.253857],[0.665412,47.254973],[0.665515,47.255457],[0.665622,47.255941],[0.665726,47.256402],[0.665833,47.256862],[0.665936,47.25728],[0.666073,47.257811],[0.666159,47.25813],[0.666251,47.258451],[0.666377,47.258859],[0.666508,47.259267],[0.666635,47.259656],[0.666774,47.260055],[0.666936,47.260501],[0.667041,47.260781],[0.667075,47.260867],[0.667151,47.261061],[0.667263,47.261342],[0.667379,47.261622],[0.667567,47.262067],[0.667764,47.262511],[0.667969,47.262952],[0.668181,47.263394],[0.668348,47.263723],[0.668515,47.264051],[0.668687,47.26438],[0.668864,47.264708],[0.669169,47.265251],[0.669323,47.265522],[0.669483,47.265793],[0.669745,47.266217],[0.670009,47.266641],[0.670144,47.266854],[0.670282,47.267067],[0.670423,47.267279],[0.670566,47.26749],[0.670782,47.267807],[0.671002,47.268124],[0.671377,47.268644],[0.671763,47.269163],[0.67231,47.269883],[0.672873,47.2706],[0.674012,47.272028],[0.675153,47.273453],[0.675799,47.274284],[0.676431,47.275121],[0.676691,47.275475],[0.676952,47.275841],[0.677211,47.276208],[0.677464,47.276576],[0.677955,47.27732],[0.678194,47.277694],[0.678427,47.278069],[0.678926,47.278906],[0.678948,47.278943],[0.679254,47.279486],[0.679551,47.280032],[0.679756,47.280416],[0.679949,47.280801],[0.680332,47.281574],[0.681063,47.283013],[0.681817,47.284609],[0.68216,47.28535],[0.682511,47.28609],[0.682553,47.286183],[0.682672,47.286433],[0.68282,47.28675],[0.683075,47.287301],[0.683188,47.287527],[0.683302,47.28775],[0.683417,47.287961],[0.683537,47.288171],[0.683732,47.288496],[0.683857,47.288696],[0.683987,47.288895],[0.684093,47.289059],[0.684333,47.289407],[0.684517,47.289657],[0.684694,47.289891],[0.684904,47.29016],[0.685105,47.290409],[0.685342,47.290693],[0.685608,47.290996],[0.685904,47.291315],[0.686206,47.291633],[0.688109,47.293518],[0.688257,47.293669],[0.688562,47.293991],[0.688917,47.294372],[0.689264,47.294767],[0.689595,47.295165],[0.689907,47.295579],[0.690231,47.296038],[0.690356,47.296224],[0.690478,47.29641],[0.69062,47.296632],[0.690755,47.296855],[0.69089,47.297078],[0.691014,47.297296],[0.691187,47.297623],[0.691295,47.297844],[0.691392,47.298064],[0.691533,47.2984],[0.691666,47.298736],[0.691791,47.29908],[0.691909,47.299423],[0.691961,47.299593],[0.692011,47.299764],[0.692058,47.299936],[0.692101,47.300108],[0.692157,47.300336],[0.692209,47.300565],[0.692257,47.300793],[0.692296,47.30102],[0.692348,47.301365],[0.692391,47.301717],[0.69241,47.301956],[0.692445,47.302777],[0.692447,47.302891],[0.692445,47.303005],[0.692435,47.303359],[0.692415,47.303716],[0.692395,47.303952],[0.692372,47.304189],[0.692341,47.304416],[0.692303,47.304643],[0.692262,47.304875],[0.692216,47.305108],[0.692147,47.305455],[0.692109,47.305628],[0.692066,47.305801],[0.691972,47.306129],[0.691872,47.306456],[0.691746,47.306819],[0.691612,47.307182],[0.691393,47.307716],[0.691168,47.308246],[0.690937,47.308775],[0.690649,47.309406],[0.690398,47.309987],[0.690257,47.310317],[0.69016,47.310544],[0.690065,47.310771],[0.689976,47.311],[0.689892,47.31123],[0.689808,47.311462],[0.689726,47.311696],[0.689652,47.311923],[0.689583,47.312151],[0.689457,47.312612],[0.689397,47.312846],[0.689344,47.31308],[0.689295,47.313323],[0.689254,47.313566],[0.689186,47.313995],[0.689134,47.314475],[0.689096,47.314983],[0.689084,47.315216],[0.689078,47.315452],[0.689073,47.315688],[0.689076,47.315925],[0.68909,47.316278],[0.689105,47.316514],[0.689128,47.31675],[0.689141,47.316924],[0.689161,47.317099],[0.689202,47.317448],[0.689245,47.317738],[0.689301,47.318029],[0.689373,47.318375],[0.689456,47.318721],[0.689612,47.3193],[0.689692,47.319586],[0.689781,47.319873],[0.6901,47.320847],[0.690735,47.322661],[0.690877,47.323054],[0.691275,47.324181],[0.691612,47.325122],[0.691906,47.326003],[0.692043,47.326402],[0.692137,47.326709],[0.69219,47.32686],[0.692297,47.327139],[0.692377,47.327364],[0.692481,47.327625],[0.692561,47.327825],[0.692625,47.327999],[0.692731,47.328293],[0.693024,47.328944],[0.693066,47.329048],[0.693829,47.330889],[0.693871,47.330988],[0.694038,47.331395],[0.694212,47.331802],[0.694594,47.332711],[0.695529,47.334924],[0.69609,47.33626],[0.696607,47.337449],[0.696815,47.337884],[0.697022,47.338317],[0.697238,47.338757],[0.697464,47.339193],[0.69767,47.339594],[0.697845,47.339928],[0.697968,47.340148],[0.698261,47.340686],[0.698445,47.341016],[0.698631,47.341342],[0.698758,47.34156],[0.69894,47.341869],[0.699207,47.342305],[0.699409,47.34263],[0.699605,47.342952],[0.699796,47.343269],[0.699936,47.343484],[0.700153,47.343813],[0.700423,47.344226],[0.701079,47.345169],[0.701658,47.34598],[0.702106,47.346647],[0.70239,47.347077],[0.702735,47.347602],[0.702911,47.347863],[0.703094,47.348125],[0.703793,47.349183],[0.703799,47.349193],[0.704292,47.349942],[0.704571,47.350365],[0.704856,47.35079],[0.70619,47.35277],[0.706572,47.353292],[0.70733,47.354423],[0.70774,47.355025],[0.708129,47.355605],[0.708718,47.356512],[0.709006,47.356962],[0.709293,47.357416],[0.71059,47.359505],[0.711959,47.361705],[0.712063,47.361884],[0.71256,47.362696],[0.713,47.363448],[0.713254,47.363897],[0.7135,47.364352],[0.713736,47.36481],[0.713951,47.365267],[0.714138,47.365662],[0.714455,47.366341],[0.714711,47.366966],[0.714879,47.367418],[0.714986,47.367734],[0.715089,47.368051],[0.715191,47.368402],[0.715311,47.368855],[0.715383,47.369178],[0.715444,47.369445],[0.715483,47.369712],[0.715524,47.369985],[0.715561,47.370249],[0.715599,47.370602],[0.715626,47.370955],[0.715639,47.371224],[0.715648,47.371492],[0.715642,47.371758],[0.715632,47.37203],[0.71562,47.372303],[0.715601,47.372579],[0.715575,47.372854],[0.71555,47.373136],[0.715518,47.373397],[0.71548,47.373652],[0.715439,47.373911],[0.715402,47.37416],[0.715335,47.374518],[0.715256,47.37485],[0.715179,47.375132],[0.715097,47.375415],[0.71493,47.375923],[0.714746,47.376441],[0.714516,47.376992],[0.714199,47.377625],[0.713932,47.378129],[0.713654,47.378624],[0.713068,47.379615],[0.712438,47.380678],[0.711816,47.381745],[0.710576,47.383897],[0.709436,47.385909],[0.708604,47.387341],[0.707171,47.389802],[0.706469,47.391083],[0.706162,47.391608],[0.706094,47.391759],[0.706035,47.39191],[0.705993,47.392051],[0.705957,47.392195],[0.705931,47.392335],[0.705913,47.392474],[0.705903,47.392611],[0.705898,47.392747],[0.705899,47.392906],[0.705904,47.393059],[0.705922,47.393273],[0.705959,47.393479],[0.705983,47.393609],[0.706008,47.393737],[0.706042,47.39385],[0.706075,47.39397],[0.706116,47.394097],[0.70616,47.394218],[0.706225,47.394381],[0.706277,47.394489],[0.70633,47.394598],[0.706393,47.394718],[0.706481,47.394867],[0.706615,47.395064],[0.706769,47.395285],[0.706882,47.395438],[0.707154,47.395784],[0.707342,47.396019],[0.707711,47.396471],[0.707948,47.396756],[0.708898,47.397926],[0.711932,47.401645],[0.712315,47.402118],[0.712607,47.40248],[0.713251,47.403277],[0.713929,47.404111],[0.714244,47.404502],[0.714486,47.404785],[0.714735,47.405048],[0.714853,47.40517],[0.714988,47.405293],[0.715105,47.405397],[0.715226,47.405493],[0.715335,47.405576],[0.715465,47.405673],[0.715614,47.405774],[0.715741,47.405863],[0.7159,47.40596],[0.716056,47.406057],[0.716193,47.406137],[0.716343,47.406219],[0.716487,47.406295],[0.716644,47.406372],[0.716795,47.406442],[0.716956,47.406518],[0.717125,47.406592],[0.717291,47.406664],[0.717486,47.406742],[0.717676,47.406814],[0.718101,47.406968],[0.718373,47.407061],[0.718646,47.40715],[0.719271,47.407348],[0.71963,47.407456],[0.720702,47.407761],[0.721595,47.408024],[0.721659,47.408041],[0.722516,47.40832],[0.722916,47.408463],[0.723376,47.408643],[0.723851,47.408843],[0.724235,47.409022],[0.72459,47.409198],[0.724974,47.409402],[0.725394,47.409639],[0.725616,47.409778],[0.725849,47.409929],[0.72622,47.410185],[0.726573,47.41045],[0.726901,47.410712],[0.727219,47.410992],[0.727481,47.411237],[0.727747,47.411505],[0.727971,47.411751],[0.728194,47.412008],[0.728386,47.412253],[0.728569,47.412499],[0.728777,47.412805],[0.728958,47.413112],[0.729126,47.413413],[0.729277,47.413724],[0.729372,47.413937],[0.729456,47.414144],[0.72962,47.414563],[0.730605,47.417286],[0.73075,47.417698],[0.731654,47.420226],[0.732677,47.423056],[0.733189,47.42447],[0.733686,47.425888],[0.734286,47.427652],[0.73456,47.428494],[0.734826,47.429339],[0.735464,47.431412],[0.735767,47.432454],[0.736062,47.433493],[0.736404,47.434731],[0.736837,47.436391],[0.737041,47.437218],[0.737103,47.437475],[0.737159,47.437702],[0.737244,47.438047],[0.737632,47.439682],[0.737999,47.441322],[0.73807,47.441639],[0.738147,47.441958],[0.738234,47.44228],[0.738332,47.442598],[0.738405,47.44282],[0.738482,47.443032],[0.738567,47.443255],[0.73865,47.44347],[0.738717,47.443623],[0.738788,47.443772],[0.73886,47.443926],[0.738933,47.444075],[0.739014,47.444232],[0.739101,47.444389],[0.739229,47.444612],[0.739362,47.444836],[0.739527,47.445094],[0.739743,47.445412],[0.739989,47.44575],[0.740108,47.445903],[0.740231,47.446053],[0.740452,47.446317],[0.740721,47.446613],[0.740969,47.446878],[0.741229,47.44714],[0.741499,47.447398],[0.741673,47.447555],[0.741846,47.447709],[0.742013,47.447853],[0.742185,47.447993],[0.742368,47.448142],[0.742552,47.448286],[0.742833,47.4485],[0.743161,47.448735],[0.743356,47.448867],[0.743555,47.448998],[0.743863,47.449195],[0.744087,47.449333],[0.744318,47.449467],[0.744705,47.449693],[0.745133,47.449935],[0.747445,47.451176],[0.748285,47.451634],[0.748704,47.451867],[0.749112,47.4521],[0.749767,47.45248],[0.750534,47.452936],[0.750857,47.453136],[0.75117,47.453336],[0.751781,47.453738],[0.752501,47.454232],[0.753321,47.454827],[0.753667,47.455088],[0.754,47.455351],[0.754546,47.45579],[0.755091,47.456247],[0.755612,47.456704],[0.756128,47.457173],[0.756725,47.457738],[0.757309,47.458316],[0.757878,47.458893],[0.758436,47.459479],[0.759079,47.460168],[0.760267,47.46146],[0.760854,47.462105],[0.761452,47.462749],[0.761804,47.463132],[0.762315,47.463675],[0.762839,47.464222],[0.763218,47.464614],[0.763603,47.465005],[0.764043,47.465431],[0.764483,47.465854],[0.765127,47.466456],[0.765785,47.467048],[0.766632,47.467781],[0.766961,47.468056],[0.767728,47.468678],[0.768502,47.469293],[0.768901,47.469602],[0.769303,47.469905],[0.769707,47.470206],[0.770119,47.470504],[0.771075,47.471175],[0.771463,47.471442],[0.771851,47.471705],[0.772246,47.471967],[0.772645,47.472225],[0.773754,47.472933],[0.774549,47.473427],[0.775311,47.473878],[0.775766,47.474146],[0.776221,47.474411],[0.77715,47.47494],[0.777909,47.47536],[0.778682,47.475781],[0.779278,47.476098],[0.779885,47.476418],[0.780779,47.476881],[0.781881,47.477437],[0.782931,47.477948],[0.783982,47.478455],[0.784912,47.47889],[0.78542,47.479126],[0.785936,47.479357],[0.786963,47.479816],[0.787376,47.480012],[0.787801,47.480197],[0.788242,47.480386],[0.788686,47.480575],[0.789486,47.48091],[0.790294,47.481237],[0.790999,47.481528],[0.791713,47.481812],[0.793129,47.482363],[0.793852,47.482637],[0.794578,47.48291],[0.79527,47.483164],[0.79597,47.483415],[0.796578,47.483629],[0.797189,47.48384],[0.797794,47.484048],[0.798406,47.484256],[0.799636,47.484662],[0.800247,47.48486],[0.800863,47.485056],[0.801967,47.4854],[0.803125,47.485745],[0.804183,47.486058],[0.805233,47.486358],[0.806231,47.486637],[0.807225,47.486913],[0.809238,47.487456],[0.810283,47.487735],[0.811086,47.487947],[0.811328,47.48801],[0.812971,47.488441],[0.813418,47.488559],[0.814915,47.488948],[0.81566,47.48915],[0.81643,47.489325],[0.818689,47.489885],[0.819546,47.490108],[0.819841,47.490186],[0.821319,47.490586],[0.822383,47.490909],[0.823456,47.491202],[0.824529,47.491473],[0.824744,47.49153],[0.825883,47.49183],[0.827032,47.492128],[0.828176,47.492428],[0.829328,47.492727],[0.833309,47.493773],[0.836405,47.49459],[0.837952,47.495004],[0.839488,47.495428],[0.84079,47.495787],[0.842085,47.496158],[0.843367,47.496535],[0.84465,47.496922],[0.845632,47.49723],[0.846609,47.49754],[0.848247,47.498082],[0.849855,47.498626],[0.85272,47.499642],[0.854714,47.500338],[0.85575,47.500691],[0.856794,47.501039],[0.857254,47.501192],[0.857718,47.501343],[0.858644,47.501637],[0.859698,47.501963],[0.860225,47.502125],[0.860752,47.502285],[0.861561,47.502525],[0.861969,47.502642],[0.862381,47.502759],[0.863194,47.50299],[0.864011,47.503217],[0.86477,47.503424],[0.865534,47.503628],[0.866288,47.503827],[0.867039,47.504021],[0.868536,47.50439],[0.870058,47.504752],[0.870804,47.504923],[0.871554,47.50509],[0.872308,47.505258],[0.873064,47.505421],[0.873678,47.505553],[0.874295,47.50568],[0.874921,47.505808],[0.875556,47.505934],[0.876844,47.506184],[0.878139,47.506423],[0.879306,47.50663],[0.879451,47.506656],[0.880767,47.506887],[0.883375,47.507349],[0.88473,47.507603],[0.885426,47.507739],[0.88612,47.507879],[0.8868,47.508024],[0.887481,47.508173],[0.888942,47.508511],[0.890293,47.508848],[0.890978,47.509024],[0.891657,47.50921],[0.892443,47.509423],[0.892832,47.509534],[0.89322,47.509649],[0.893843,47.509833],[0.8945,47.510033],[0.895769,47.510434],[0.89615,47.510554],[0.896528,47.510684],[0.897298,47.510943],[0.898031,47.511199],[0.898756,47.511462],[0.900174,47.511995],[0.901451,47.512494],[0.902781,47.513031],[0.90497,47.513926],[0.905902,47.514306],[0.910225,47.516079],[0.914581,47.517864],[0.916195,47.518512],[0.9178,47.519152],[0.918339,47.519362],[0.918881,47.51957],[0.919969,47.519982],[0.920319,47.520111],[0.920601,47.520211],[0.920971,47.520344],[0.921975,47.5207],[0.922945,47.521027],[0.923427,47.52119],[0.923914,47.521351],[0.92443,47.521516],[0.924954,47.521679],[0.926206,47.52206],[0.926704,47.522209],[0.927718,47.522504],[0.934518,47.524308],[0.935254,47.524504],[0.935934,47.524696],[0.936345,47.524812],[0.936756,47.524931],[0.937202,47.525061],[0.937641,47.525193],[0.938463,47.525444],[0.93928,47.525698],[0.940206,47.526002],[0.941135,47.526312],[0.942713,47.526868],[0.943511,47.527161],[0.944305,47.52746],[0.944766,47.527634],[0.945224,47.527816],[0.946089,47.52816],[0.946867,47.528476],[0.947635,47.528799],[0.948537,47.529189],[0.949432,47.529586],[0.950119,47.5299],[0.950803,47.53022],[0.959496,47.534317],[0.964056,47.536463],[0.970513,47.539506],[0.973575,47.540946],[0.975107,47.541667],[0.975873,47.542027],[0.976647,47.542379],[0.977141,47.542602],[0.977643,47.542822],[0.978147,47.543043],[0.978654,47.543261],[0.979568,47.54364],[0.980489,47.544015],[0.981202,47.544292],[0.982543,47.544803],[0.983799,47.545259],[0.984426,47.545484],[0.985058,47.545707],[0.986124,47.546073],[0.987222,47.546442],[0.99079,47.547624],[0.992116,47.548061],[0.993447,47.548497],[0.99831,47.55009],[1.00043,47.550783],[1.010297,47.554021],[1.016312,47.555994],[1.019319,47.556978],[1.022322,47.557971],[1.025223,47.558959],[1.026638,47.559463],[1.027337,47.559711],[1.028038,47.55997],[1.029532,47.560527],[1.031017,47.561106],[1.032227,47.561588],[1.032832,47.561829],[1.033433,47.562075],[1.03407,47.562347],[1.034709,47.562625],[1.035984,47.563175],[1.037108,47.563676],[1.037669,47.56393],[1.038232,47.564186],[1.039633,47.56484],[1.040326,47.565177],[1.04102,47.565517],[1.041616,47.565805],[1.042201,47.5661],[1.04337,47.566694],[1.044457,47.567261],[1.045536,47.567841],[1.046731,47.568488],[1.047317,47.56881],[1.047901,47.56914],[1.049449,47.570046],[1.049602,47.570135],[1.051301,47.571154],[1.053152,47.57231],[1.053413,47.572473],[1.055517,47.573809],[1.056564,47.574476],[1.057617,47.575145],[1.058672,47.575801],[1.05973,47.576456],[1.060989,47.577222],[1.061677,47.577626],[1.062361,47.578026],[1.063621,47.57873],[1.064286,47.579102],[1.064957,47.579468],[1.065926,47.579988],[1.066902,47.580504],[1.067922,47.581026],[1.068432,47.581287],[1.068947,47.581545],[1.070154,47.582137],[1.070761,47.58243],[1.071372,47.582722],[1.072555,47.583273],[1.073747,47.583824],[1.076383,47.58501],[1.07889,47.586135],[1.08014,47.586705],[1.081376,47.587283],[1.082038,47.587589],[1.082691,47.5879],[1.083346,47.588215],[1.084003,47.588533],[1.084895,47.588975],[1.085776,47.589424],[1.086393,47.589741],[1.08701,47.590063],[1.088229,47.590713],[1.089211,47.591245],[1.090183,47.591785],[1.092133,47.592867],[1.093106,47.593409],[1.094081,47.593947],[1.095056,47.594478],[1.096045,47.595007],[1.096505,47.595252],[1.096961,47.595491],[1.097884,47.595971],[1.09973,47.596909],[1.100714,47.597394],[1.101694,47.597872],[1.102682,47.598344],[1.103664,47.598808],[1.104622,47.599255],[1.105593,47.599697],[1.106075,47.599917],[1.106567,47.600134],[1.107549,47.600571],[1.108825,47.601121],[1.109139,47.601259],[1.109458,47.601395],[1.110097,47.601663],[1.110775,47.601947],[1.111453,47.602229],[1.11282,47.602785],[1.114226,47.603343],[1.114926,47.603616],[1.115637,47.603892],[1.116981,47.604399],[1.117698,47.604666],[1.118661,47.605023],[1.119782,47.605424],[1.120893,47.605816],[1.122021,47.606211],[1.123603,47.606745],[1.124859,47.607157],[1.126123,47.607563],[1.126799,47.60778],[1.127471,47.607985],[1.128146,47.608201],[1.128826,47.60841],[1.12996,47.60875],[1.1311,47.609085],[1.131691,47.609257],[1.132269,47.60942],[1.132856,47.609587],[1.133441,47.609749],[1.134691,47.610095],[1.135315,47.610263],[1.135942,47.610429],[1.136572,47.610595],[1.137206,47.610758],[1.138476,47.611083],[1.139748,47.611395],[1.140384,47.611552],[1.141026,47.611706],[1.142316,47.612006],[1.143604,47.612301],[1.144263,47.612449],[1.144923,47.612595],[1.145586,47.612739],[1.146238,47.61288],[1.14757,47.613157],[1.148908,47.613425],[1.150131,47.613666],[1.151354,47.613898],[1.152631,47.614134],[1.15326,47.61425],[1.153887,47.614358],[1.155172,47.614579],[1.155829,47.614688],[1.156487,47.614793],[1.157139,47.6149],[1.157788,47.615001],[1.159095,47.615202],[1.160366,47.615384],[1.161001,47.615477],[1.161642,47.615562],[1.162286,47.615649],[1.162933,47.615734],[1.163754,47.615837],[1.16423,47.615897],[1.164813,47.615966],[1.165398,47.616031],[1.165985,47.616097],[1.166576,47.616159],[1.167763,47.61628],[1.168947,47.61639],[1.16979,47.616468],[1.170215,47.616503],[1.170637,47.616533],[1.171476,47.6166],[1.172327,47.616661],[1.172973,47.616703],[1.173619,47.616743],[1.17484,47.616808],[1.175458,47.616836],[1.176074,47.616861],[1.176625,47.616883],[1.177178,47.616903],[1.17839,47.616936],[1.17935,47.616954],[1.180325,47.616965],[1.18131,47.616966],[1.181812,47.616966],[1.182314,47.616962],[1.183321,47.616948],[1.183836,47.616937],[1.184353,47.616923],[1.184886,47.616907],[1.185416,47.616888],[1.186489,47.616845],[1.186874,47.61683],[1.187254,47.616814],[1.188027,47.616768],[1.188784,47.616725],[1.189545,47.616679],[1.190307,47.616634],[1.191066,47.616584],[1.192592,47.616484],[1.194359,47.61638],[1.19613,47.616279],[1.196899,47.616248],[1.197667,47.616217],[1.19843,47.616192],[1.199192,47.616171],[1.199571,47.616161],[1.199959,47.616156],[1.200744,47.616149],[1.201513,47.616147],[1.20228,47.616151],[1.202729,47.616155],[1.20318,47.616162],[1.20408,47.616184],[1.204952,47.616213],[1.205824,47.616248],[1.206276,47.616265],[1.206727,47.616289],[1.20764,47.616345],[1.208553,47.616407],[1.209476,47.616477],[1.210281,47.616544],[1.211088,47.61662],[1.2119,47.616705],[1.212715,47.616797],[1.213541,47.616898],[1.214384,47.617009],[1.215214,47.617123],[1.215628,47.617184],[1.216041,47.61725],[1.216716,47.617355],[1.217525,47.617481],[1.218249,47.61761],[1.218968,47.617741],[1.21972,47.617876],[1.220473,47.618018],[1.221226,47.618149],[1.221984,47.618278],[1.222497,47.618363],[1.223008,47.618443],[1.223532,47.618525],[1.224055,47.618601],[1.224618,47.618679],[1.22518,47.618755],[1.225755,47.618828],[1.22604,47.618864],[1.226325,47.618897],[1.227593,47.619041],[1.228247,47.619107],[1.228904,47.619166],[1.229466,47.619218],[1.230025,47.619265],[1.230112,47.619271],[1.23059,47.619306],[1.231154,47.619347],[1.231646,47.619381],[1.232139,47.619411],[1.232641,47.61944],[1.233142,47.619466],[1.233648,47.619489],[1.234152,47.619509],[1.235163,47.619542],[1.23584,47.619555],[1.236519,47.619568],[1.237192,47.619575],[1.237862,47.619575],[1.238633,47.619576],[1.239011,47.61957],[1.239393,47.619562],[1.240163,47.619549],[1.240548,47.619543],[1.24093,47.619535],[1.24168,47.619508],[1.242419,47.619481],[1.243167,47.619451],[1.243918,47.619418],[1.244478,47.61939],[1.245039,47.619359],[1.245326,47.619345],[1.245612,47.619329],[1.246181,47.619294],[1.247304,47.619228],[1.24787,47.619191],[1.248433,47.619151],[1.249478,47.61908],[1.250527,47.619007],[1.25262,47.618855],[1.25471,47.618704],[1.255757,47.618629],[1.256802,47.618549],[1.260959,47.618249],[1.263037,47.618096],[1.26512,47.617945],[1.269287,47.617637],[1.271371,47.617486],[1.273453,47.617333],[1.275535,47.617183],[1.276577,47.617109],[1.277617,47.617028],[1.281787,47.616729],[1.283159,47.61663],[1.283844,47.616582],[1.28453,47.616537],[1.285942,47.616443],[1.286649,47.616398],[1.287359,47.616355],[1.288672,47.61628],[1.28999,47.61621],[1.291326,47.616144],[1.29267,47.616085],[1.293625,47.616049],[1.294587,47.616014],[1.295566,47.615988],[1.296551,47.615963],[1.29717,47.615952],[1.297793,47.615943],[1.298329,47.615932],[1.299041,47.615927],[1.300294,47.615922],[1.301618,47.615929],[1.302287,47.615933],[1.303315,47.615949],[1.304394,47.615973],[1.305465,47.615998],[1.30654,47.616032],[1.307,47.61605],[1.307709,47.616075],[1.308412,47.616105],[1.309504,47.616155],[1.3106,47.616212],[1.311686,47.616277],[1.312761,47.616349],[1.314954,47.616515],[1.316047,47.616612],[1.31714,47.616709],[1.319265,47.616927],[1.320329,47.617047],[1.320852,47.617107],[1.321379,47.617168],[1.322471,47.617302],[1.323001,47.61737],[1.323532,47.617441],[1.324631,47.617589],[1.325165,47.617662],[1.325699,47.617739],[1.326805,47.617906],[1.327911,47.618077],[1.328979,47.61825],[1.329509,47.618343],[1.330041,47.618439],[1.330684,47.618564],[1.331326,47.618696],[1.33202,47.618848],[1.3327,47.619005],[1.333348,47.619161],[1.334009,47.619333],[1.334707,47.619527],[1.335382,47.619719],[1.336113,47.619945],[1.336829,47.620173],[1.337555,47.620413],[1.338288,47.620672],[1.338765,47.620851],[1.339239,47.621032],[1.34018,47.621405],[1.340579,47.621572],[1.340976,47.621741],[1.341377,47.621917],[1.341775,47.622097],[1.342279,47.622333],[1.342783,47.622574],[1.343037,47.622699],[1.343854,47.623114],[1.34431,47.62336],[1.344771,47.62361],[1.345204,47.623851],[1.345627,47.624102],[1.346083,47.624372],[1.346527,47.624645],[1.347338,47.625164],[1.348242,47.625777],[1.348592,47.626034],[1.348968,47.62631],[1.349334,47.62658],[1.349877,47.627006],[1.350388,47.627418],[1.350869,47.62782],[1.351341,47.628234],[1.35176,47.62862],[1.352154,47.628995],[1.352505,47.629342],[1.352839,47.629688],[1.353305,47.630184],[1.353739,47.630661],[1.354183,47.631178],[1.354604,47.631695],[1.354928,47.632105],[1.355248,47.632516],[1.355873,47.633359],[1.357112,47.63505],[1.35716,47.635115],[1.357808,47.635995],[1.358133,47.636432],[1.358461,47.636866],[1.359017,47.637582],[1.359304,47.637939],[1.35959,47.638291],[1.360169,47.638982],[1.360457,47.639321],[1.360749,47.639659],[1.36131,47.640285],[1.361896,47.640921],[1.362321,47.641375],[1.36254,47.641601],[1.362756,47.64182],[1.363196,47.642267],[1.36364,47.64271],[1.364078,47.643136],[1.364522,47.643557],[1.364969,47.643973],[1.365417,47.644382],[1.365834,47.644758],[1.366257,47.645131],[1.366684,47.645498],[1.367118,47.645863],[1.36801,47.646602],[1.368901,47.647318],[1.369666,47.64791],[1.370048,47.648204],[1.370434,47.648495],[1.371208,47.649082],[1.371973,47.649664],[1.375045,47.652016],[1.375931,47.652722],[1.376355,47.653069],[1.376774,47.653419],[1.377194,47.653772],[1.377406,47.65395],[1.377612,47.654128],[1.378424,47.65486],[1.378771,47.655161],[1.379108,47.655471],[1.379453,47.655792],[1.379769,47.656095],[1.380422,47.656718],[1.381062,47.657355],[1.381398,47.657689],[1.381725,47.658031],[1.382045,47.658368],[1.382363,47.658708],[1.382986,47.659392],[1.383603,47.660082],[1.383899,47.660419],[1.384194,47.660752],[1.384748,47.66138],[1.387398,47.664343],[1.388668,47.665749],[1.389695,47.666836],[1.39042,47.667574],[1.390992,47.668119],[1.391531,47.668643],[1.392174,47.669251],[1.392506,47.669559],[1.392839,47.669859],[1.393177,47.670154],[1.393519,47.670445],[1.393867,47.670745],[1.394216,47.67104],[1.395128,47.671791],[1.396058,47.672529],[1.396524,47.672894],[1.396992,47.673251],[1.397485,47.67362],[1.397964,47.673967],[1.398403,47.674289],[1.398837,47.674593],[1.39929,47.674913],[1.399739,47.675224],[1.400196,47.675534],[1.400654,47.675836],[1.401122,47.676143],[1.401599,47.676449],[1.402061,47.676742],[1.402528,47.677033],[1.40347,47.677611],[1.403958,47.677898],[1.404445,47.678181],[1.404932,47.678466],[1.40542,47.678743],[1.405852,47.678982],[1.406037,47.679084],[1.406288,47.679222],[1.406725,47.679457],[1.407167,47.679689],[1.407605,47.679923],[1.40805,47.680156],[1.408935,47.680606],[1.409343,47.680811],[1.409756,47.681012],[1.410579,47.681412],[1.411042,47.681628],[1.411501,47.681839],[1.412108,47.682113],[1.412872,47.682454],[1.413633,47.68279],[1.415415,47.683572],[1.415858,47.683769],[1.416306,47.683963],[1.417205,47.684351],[1.420772,47.685922],[1.424303,47.687465],[1.425204,47.687859],[1.426099,47.688257],[1.426989,47.688668],[1.427875,47.689084],[1.429047,47.68966],[1.429643,47.689959],[1.430239,47.690261],[1.430834,47.690572],[1.431423,47.690887],[1.431999,47.691202],[1.432574,47.691519],[1.433118,47.691824],[1.433654,47.692135],[1.434187,47.692444],[1.434717,47.692755],[1.435255,47.693084],[1.435793,47.693408],[1.436824,47.694065],[1.437499,47.694505],[1.438184,47.694963],[1.438589,47.695241],[1.438859,47.695426],[1.439526,47.695892],[1.440847,47.696836],[1.442165,47.697779],[1.445944,47.700486],[1.446902,47.701172],[1.447379,47.70151],[1.44786,47.701849],[1.448338,47.702191],[1.448813,47.702529],[1.449293,47.70286],[1.449778,47.70319],[1.450249,47.703499],[1.450722,47.703803],[1.451186,47.704101],[1.451661,47.704397],[1.452146,47.704693],[1.452635,47.704989],[1.45313,47.705281],[1.453626,47.705562],[1.454743,47.706186],[1.455878,47.7068],[1.456468,47.707102],[1.457051,47.707389],[1.45763,47.707675],[1.458211,47.707957],[1.458805,47.708233],[1.459403,47.708519],[1.46,47.70879],[1.460608,47.709052],[1.461213,47.709311],[1.461824,47.709565],[1.462439,47.709817],[1.46306,47.710066],[1.463608,47.71028],[1.464161,47.710495],[1.465284,47.710905],[1.46585,47.711106],[1.466418,47.711302],[1.467566,47.711692],[1.46975,47.712429],[1.47194,47.713163],[1.473036,47.713534],[1.47414,47.713902],[1.475244,47.714284],[1.476344,47.714677],[1.476951,47.714899],[1.477553,47.715125],[1.478737,47.715582],[1.479937,47.716063],[1.481102,47.716554],[1.481947,47.716916],[1.482785,47.717285],[1.483735,47.71772],[1.484453,47.718051],[1.484927,47.718282],[1.485752,47.718687],[1.486531,47.719079],[1.487596,47.719627],[1.488109,47.719898],[1.488616,47.72017],[1.490016,47.720951],[1.490707,47.72135],[1.491396,47.721759],[1.491741,47.721962],[1.492082,47.722167],[1.49276,47.722582],[1.494104,47.723424],[1.497016,47.725255],[1.497159,47.725343],[1.498451,47.726154],[1.499744,47.726963],[1.500571,47.727473],[1.501294,47.727907],[1.501971,47.728306],[1.502536,47.728635],[1.503103,47.728958],[1.503622,47.729251],[1.504146,47.72954],[1.504732,47.729859],[1.505327,47.730178],[1.505922,47.730494],[1.506518,47.730805],[1.50755,47.731323],[1.508582,47.731833],[1.509047,47.73206],[1.509522,47.732285],[1.510102,47.732554],[1.510685,47.732822],[1.51127,47.73309],[1.511857,47.733354],[1.514012,47.734289],[1.516177,47.735226],[1.517646,47.735869],[1.519119,47.736512],[1.52059,47.737163],[1.521322,47.737496],[1.522044,47.737837],[1.523068,47.738324],[1.524085,47.738814],[1.525109,47.739331],[1.52562,47.73959],[1.526126,47.739851],[1.52676,47.74018],[1.527375,47.74051],[1.528608,47.741184],[1.52983,47.741869],[1.531037,47.742563],[1.532326,47.74333],[1.532967,47.743716],[1.533601,47.744113],[1.534846,47.74491],[1.53547,47.745313],[1.536078,47.745719],[1.536601,47.74607],[1.537118,47.746422],[1.537634,47.746779],[1.538144,47.747134],[1.538662,47.747499],[1.539177,47.747872],[1.540189,47.748619],[1.540903,47.749155],[1.541379,47.74952],[1.542552,47.750431],[1.544903,47.752287],[1.546802,47.753783],[1.546885,47.753848],[1.547878,47.754626],[1.548375,47.755015],[1.548879,47.755406],[1.549365,47.755778],[1.549853,47.756149],[1.550098,47.756335],[1.550344,47.756518],[1.550843,47.756884],[1.551348,47.757255],[1.551854,47.757622],[1.552365,47.757987],[1.552893,47.758358],[1.553276,47.758626],[1.553933,47.759084],[1.555003,47.759806],[1.556062,47.760515],[1.556596,47.760865],[1.557135,47.761213],[1.557366,47.761359],[1.557898,47.761698],[1.558435,47.762037],[1.558879,47.762315],[1.559323,47.762589],[1.559887,47.762933],[1.560442,47.763268],[1.561577,47.763939],[1.56233,47.764378],[1.562709,47.764597],[1.563095,47.764815],[1.563861,47.76525],[1.564641,47.765681],[1.565026,47.765894],[1.565414,47.766106],[1.565801,47.766317],[1.566192,47.766526],[1.566582,47.766735],[1.566976,47.766943],[1.567766,47.767355],[1.568257,47.76761],[1.568744,47.767858],[1.569066,47.768021],[1.569228,47.768104],[1.569708,47.768346],[1.571683,47.769321],[1.571929,47.769441],[1.575628,47.771256],[1.576449,47.771661],[1.576946,47.771906],[1.578268,47.772552],[1.578927,47.772879],[1.57958,47.77321],[1.580866,47.773873],[1.581447,47.774181],[1.581971,47.774461],[1.582019,47.774487],[1.582598,47.774801],[1.583172,47.775117],[1.584316,47.775763],[1.584879,47.776087],[1.585439,47.776415],[1.586012,47.776755],[1.586579,47.777093],[1.587136,47.77743],[1.587689,47.777773],[1.588808,47.778482],[1.589369,47.778839],[1.589918,47.779198],[1.590395,47.779515],[1.590869,47.779833],[1.591806,47.78048],[1.59228,47.780806],[1.592745,47.781137],[1.593213,47.781467],[1.593677,47.781803],[1.594986,47.782778],[1.595643,47.783278],[1.596291,47.783781],[1.596925,47.784284],[1.597551,47.784787],[1.598178,47.785306],[1.598788,47.785814],[1.599953,47.786814],[1.600522,47.787315],[1.601081,47.787818],[1.601631,47.788323],[1.60217,47.788834],[1.603255,47.789854],[1.60645,47.792875],[1.607346,47.793726],[1.60825,47.794579],[1.608698,47.795007],[1.608924,47.795221],[1.609152,47.795433],[1.609605,47.795858],[1.610064,47.796282],[1.611136,47.797302],[1.613654,47.799696],[1.615329,47.801279],[1.616271,47.802167],[1.617009,47.802864],[1.618689,47.804447],[1.619523,47.80524],[1.619941,47.805634],[1.620378,47.806026],[1.62104,47.806623],[1.621725,47.807238],[1.621852,47.807353],[1.622073,47.807551],[1.622426,47.807862],[1.622787,47.808161],[1.62315,47.808458],[1.623511,47.808752],[1.623878,47.809047],[1.624608,47.809632],[1.624983,47.809925],[1.625365,47.810216],[1.626125,47.810798],[1.626498,47.811074],[1.62687,47.811345],[1.62762,47.811886],[1.628002,47.812158],[1.628384,47.812425],[1.628773,47.812694],[1.629159,47.812956],[1.629567,47.813237],[1.62998,47.813518],[1.630393,47.813793],[1.630811,47.81407],[1.631243,47.814345],[1.631674,47.814615],[1.632112,47.814889],[1.632548,47.815156],[1.632978,47.815419],[1.633408,47.815679],[1.633839,47.815935],[1.634275,47.81619],[1.634723,47.81645],[1.635166,47.816703],[1.635616,47.816961],[1.636066,47.817215],[1.636578,47.817497],[1.638401,47.818475],[1.638741,47.818652],[1.639441,47.819008],[1.639793,47.819187],[1.64015,47.819363],[1.640859,47.819716],[1.642766,47.820677],[1.644672,47.821635],[1.645311,47.821958],[1.649364,47.823985],[1.650383,47.824501],[1.651406,47.825013],[1.652435,47.825531],[1.653455,47.826054],[1.654472,47.82659],[1.655475,47.827129],[1.656484,47.827689],[1.65748,47.828254],[1.657837,47.828463],[1.658192,47.828674],[1.658897,47.829098],[1.659601,47.829529],[1.660301,47.829962],[1.661676,47.83085],[1.661848,47.830972],[1.663475,47.832057],[1.66396,47.832396],[1.664922,47.833086],[1.665707,47.833661],[1.668187,47.835575],[1.670318,47.837281],[1.675242,47.841222],[1.676485,47.842213],[1.677713,47.843199],[1.67833,47.843688],[1.678956,47.844176],[1.679593,47.844663],[1.680248,47.845149],[1.681001,47.845704],[1.681765,47.846249],[1.682548,47.846793],[1.682664,47.846874],[1.68294,47.847064],[1.68334,47.847332],[1.683837,47.847665],[1.684332,47.84799],[1.685358,47.84865],[1.685612,47.848813],[1.685868,47.848973],[1.686386,47.84929],[1.687418,47.849918],[1.688011,47.85027],[1.688589,47.850611],[1.68919,47.850948],[1.689792,47.851286],[1.690396,47.851622],[1.690697,47.851787],[1.691001,47.851952],[1.691613,47.852279],[1.692231,47.852602],[1.692759,47.852874],[1.693286,47.853144],[1.694341,47.853671],[1.695016,47.853996],[1.696518,47.854707],[1.698025,47.85539],[1.698767,47.855722],[1.699517,47.856055],[1.702843,47.857565],[1.704712,47.858423],[1.706389,47.859199],[1.707235,47.859597],[1.707648,47.859797],[1.708059,47.859998],[1.708848,47.860386],[1.709636,47.860782],[1.710409,47.861175],[1.711177,47.861571],[1.71272,47.862392],[1.71349,47.862812],[1.714255,47.863236],[1.715792,47.864103],[1.716533,47.864537],[1.717267,47.864975],[1.718015,47.865423],[1.718757,47.865876],[1.719485,47.866327],[1.720203,47.86679],[1.720957,47.867271],[1.721702,47.867755],[1.722305,47.86816],[1.724757,47.86984],[1.726306,47.870927],[1.727983,47.872097],[1.732633,47.875345],[1.733606,47.876023],[1.734075,47.87635],[1.73455,47.876678],[1.734878,47.876909],[1.735504,47.877351],[1.736462,47.878018],[1.738369,47.879345],[1.738858,47.879681],[1.739345,47.880011],[1.739833,47.880339],[1.740078,47.880502],[1.740324,47.880661],[1.74098,47.881081],[1.741641,47.881497],[1.741968,47.881705],[1.7423,47.88191],[1.742635,47.882116],[1.742972,47.882319],[1.743316,47.882525],[1.743658,47.882728],[1.744002,47.882929],[1.744349,47.883131],[1.745044,47.88353],[1.745745,47.883928],[1.746114,47.884132],[1.746481,47.884331],[1.747217,47.884725],[1.747965,47.885122],[1.748707,47.885511],[1.749088,47.885704],[1.749473,47.885894],[1.750236,47.886273],[1.751018,47.886655],[1.751793,47.887027],[1.752473,47.887339],[1.753155,47.88765],[1.753836,47.887955],[1.754532,47.888263],[1.755226,47.888564],[1.755933,47.88886],[1.756635,47.889153],[1.756945,47.88928],[1.757341,47.889441],[1.758069,47.889731],[1.758809,47.890019],[1.759553,47.890304],[1.760294,47.890582],[1.76106,47.89086],[1.761822,47.891132],[1.762605,47.891408],[1.763399,47.89168],[1.76429,47.891973],[1.76504,47.89222],[1.766399,47.892646],[1.767804,47.893069],[1.768281,47.893212],[1.768749,47.893348],[1.769461,47.893544],[1.770176,47.893747],[1.770879,47.893933],[1.771241,47.894031],[1.771597,47.894125],[1.772635,47.894386],[1.773376,47.894575],[1.774132,47.894757],[1.774888,47.894935],[1.775503,47.895075],[1.776122,47.895212],[1.776748,47.89535],[1.777374,47.895483],[1.778634,47.895742],[1.779371,47.895888],[1.779737,47.895961],[1.780103,47.896029],[1.781623,47.896305],[1.782507,47.896461],[1.783442,47.896607],[1.784346,47.896756],[1.78527,47.896898],[1.785795,47.896968],[1.78632,47.897041],[1.78683,47.897116],[1.787341,47.897187],[1.789405,47.897453],[1.79429,47.898066],[1.802898,47.899159],[1.806647,47.899631],[1.808483,47.899853],[1.80941,47.899962],[1.810335,47.900063],[1.811577,47.900192],[1.812202,47.900251],[1.81283,47.900299],[1.81331,47.90034],[1.813787,47.900375],[1.814786,47.900443],[1.815295,47.900468],[1.815806,47.900492],[1.816521,47.900525],[1.816888,47.90054],[1.817258,47.900553],[1.817988,47.90057],[1.818711,47.900586],[1.819225,47.900592],[1.819731,47.900596],[1.820246,47.900595],[1.820757,47.900591],[1.821799,47.900581],[1.822313,47.900567],[1.822826,47.900552],[1.823934,47.900508],[1.824498,47.900485],[1.825058,47.900456],[1.826141,47.900384],[1.827247,47.900303],[1.82764,47.900272],[1.828031,47.900238],[1.828812,47.900161],[1.82959,47.900086],[1.830374,47.900006],[1.832141,47.89981],[1.833911,47.899611],[1.834293,47.899574],[1.834676,47.899543],[1.835003,47.899523],[1.835381,47.899507],[1.83585,47.899495],[1.836111,47.89949],[1.836318,47.89949],[1.83654,47.899493],[1.836823,47.899499],[1.837152,47.899512],[1.837508,47.899534],[1.837829,47.899558],[1.83817,47.899585],[1.838468,47.899616],[1.838814,47.899657],[1.839156,47.899706],[1.839484,47.899759],[1.839826,47.899818],[1.840182,47.899885],[1.840491,47.899951],[1.840828,47.900031],[1.84116,47.900115],[1.841483,47.900201],[1.8418,47.900294],[1.842093,47.900385],[1.842353,47.90047],[1.8426,47.900558],[1.842896,47.90067],[1.843188,47.900787],[1.843489,47.900911],[1.843784,47.901041],[1.844064,47.901172],[1.844344,47.901309],[1.844633,47.901457],[1.844899,47.901601],[1.845162,47.901753],[1.845418,47.901913],[1.845592,47.902022],[1.845797,47.902159],[1.846037,47.902325],[1.84627,47.902497],[1.846381,47.902582],[1.846499,47.902673],[1.846728,47.902853],[1.846945,47.903041],[1.847148,47.903226],[1.847337,47.903408],[1.84752,47.90359],[1.847732,47.903817],[1.847917,47.904027],[1.848138,47.904291],[1.848319,47.904528],[1.848429,47.904681],[1.848533,47.904835],[1.848685,47.905073],[1.848999,47.905538],[1.849131,47.90581],[1.84919,47.905943],[1.849245,47.906076],[1.849298,47.90622],[1.849348,47.906364],[1.849444,47.906651],[1.849495,47.90682],[1.849535,47.906981],[1.849576,47.907153],[1.849612,47.907319],[1.849646,47.907494],[1.84967,47.907668],[1.849696,47.907846],[1.849715,47.908016],[1.849725,47.908174],[1.849732,47.908329],[1.849736,47.908637],[1.849733,47.908798],[1.849728,47.908957],[1.849721,47.909116],[1.849709,47.909275],[1.849677,47.909615],[1.849638,47.909959],[1.849591,47.910333],[1.849541,47.910707],[1.849329,47.912311],[1.849108,47.914048],[1.849029,47.914732],[1.848959,47.915424],[1.84892,47.915915],[1.848888,47.916404],[1.848838,47.917138],[1.848804,47.917867],[1.848794,47.918338],[1.848784,47.91881],[1.848775,47.919283],[1.848781,47.919748],[1.848786,47.919989],[1.8488,47.92023],[1.848827,47.920713],[1.848867,47.921345],[1.848892,47.921688],[1.848923,47.922077],[1.848968,47.922631],[1.849075,47.923609],[1.849115,47.923985],[1.849306,47.925896],[1.849331,47.926174],[1.849436,47.927409],[1.849472,47.927917],[1.8495,47.92847],[1.84952,47.928928],[1.849528,47.929509],[1.849534,47.93011],[1.849532,47.930704],[1.849519,47.931299],[1.849474,47.932144],[1.84941,47.93298],[1.849339,47.93371],[1.849257,47.934434],[1.849172,47.935154],[1.849083,47.935874],[1.848891,47.937327],[1.848799,47.938056],[1.848709,47.938782],[1.84864,47.939385],[1.848564,47.940147],[1.84852,47.940624],[1.848484,47.941101],[1.848445,47.941708],[1.848419,47.942319],[1.848407,47.942634],[1.848402,47.942946],[1.848401,47.943567],[1.848407,47.944051],[1.848423,47.944547],[1.848444,47.945037],[1.848476,47.945521],[1.848517,47.946045],[1.848572,47.946575],[1.8488,47.948236],[1.84889,47.948771],[1.848959,47.949151],[1.849035,47.949521],[1.849126,47.949949],[1.849224,47.950375],[1.849361,47.950936],[1.849509,47.951492],[1.849692,47.952135],[1.84999,47.95308],[1.850272,47.953898],[1.850398,47.954242],[1.850598,47.954769],[1.85077,47.955196],[1.850947,47.955625],[1.851055,47.955874],[1.851165,47.956128],[1.851274,47.956371],[1.851381,47.95661],[1.851608,47.957089],[1.851837,47.957556],[1.851999,47.957883],[1.852166,47.958208],[1.852502,47.958846],[1.852678,47.95918],[1.852849,47.959492],[1.853198,47.960115],[1.853876,47.961326],[1.854558,47.96253],[1.854899,47.963138],[1.855232,47.963746],[1.855559,47.964357],[1.855873,47.964963],[1.856104,47.965431],[1.856328,47.965901],[1.856542,47.966367],[1.856744,47.966833],[1.856987,47.967405],[1.857215,47.967986],[1.85743,47.968551],[1.857635,47.969133],[1.857872,47.969839],[1.858083,47.970542],[1.858405,47.971762],[1.858496,47.972148],[1.858734,47.973256],[1.858794,47.973607],[1.858849,47.973915],[1.858943,47.974529],[1.859016,47.975071],[1.859074,47.975607],[1.859134,47.976207],[1.85918,47.976796],[1.859196,47.977094],[1.859207,47.977391],[1.859226,47.977989],[1.859239,47.978616],[1.859232,47.979244],[1.859211,47.979816],[1.85917,47.98056],[1.859134,47.981065],[1.859051,47.981915],[1.858906,47.982984],[1.858767,47.983809],[1.858608,47.984601],[1.858518,47.984996],[1.858427,47.985385],[1.858354,47.98569],[1.858273,47.985994],[1.858201,47.986247],[1.85807,47.986714],[1.857934,47.98718],[1.857694,47.987924],[1.857442,47.988652],[1.857305,47.989015],[1.857163,47.989375],[1.85703,47.989709],[1.85702,47.989735],[1.856873,47.990098],[1.856723,47.990452],[1.856565,47.990809],[1.856409,47.991154],[1.85625,47.991495],[1.855914,47.992179],[1.855559,47.992861],[1.85509,47.993735],[1.85361,47.996331],[1.851596,47.999802],[1.849584,48.003275],[1.849331,48.003709],[1.849081,48.004143],[1.848832,48.004579],[1.848588,48.005014],[1.848349,48.005447],[1.848116,48.005881],[1.847885,48.006317],[1.847655,48.006752],[1.847477,48.007098],[1.847299,48.007444],[1.846951,48.008135],[1.846616,48.008827],[1.846447,48.009172],[1.846286,48.00952],[1.846007,48.010127],[1.845738,48.010739],[1.845407,48.011517],[1.845215,48.011967],[1.84505,48.012362],[1.84489,48.01276],[1.844573,48.013562],[1.84442,48.013957],[1.84427,48.014353],[1.843975,48.01515],[1.843709,48.015915],[1.843446,48.016685],[1.843183,48.01749],[1.842927,48.018304],[1.842687,48.01911],[1.842452,48.019935],[1.842217,48.02081],[1.842066,48.021405],[1.84192,48.021998],[1.841639,48.023213],[1.841492,48.023922],[1.841349,48.024628],[1.841216,48.02534],[1.841091,48.026054],[1.840966,48.0268],[1.840892,48.027277],[1.840823,48.027756],[1.840695,48.028715],[1.840643,48.029144],[1.840593,48.029579],[1.840504,48.030438],[1.840463,48.030887],[1.840425,48.031336],[1.840404,48.031565],[1.840389,48.031798],[1.840356,48.032221],[1.840316,48.032862],[1.840262,48.03397],[1.84024,48.034688],[1.840233,48.035099],[1.840223,48.035765],[1.840331,48.035992],[1.840375,48.036575],[1.840415,48.036921],[1.840447,48.037128],[1.840452,48.037151],[1.840489,48.037339],[1.84055,48.037583],[1.840686,48.037986],[1.84075,48.038129],[1.84085,48.03834],[1.840946,48.03853],[1.841054,48.038716],[1.841123,48.038823],[1.84117,48.038896],[1.841276,48.039051],[1.841392,48.039202],[1.84152,48.039361],[1.841631,48.039494],[1.841743,48.039616],[1.841932,48.039808],[1.842151,48.040009],[1.842319,48.040155],[1.842483,48.040293],[1.842689,48.040448],[1.84285,48.040565],[1.843107,48.04073],[1.843391,48.0409],[1.843724,48.04108],[1.84399,48.041215],[1.844295,48.041359],[1.844574,48.041479],[1.844871,48.041599],[1.845142,48.041697],[1.845385,48.041778],[1.845611,48.041852],[1.845836,48.041921],[1.846205,48.042036],[1.846551,48.042153],[1.846885,48.042274],[1.847233,48.042414],[1.847551,48.042555],[1.847862,48.042707],[1.848124,48.042836],[1.848385,48.04297],[1.848916,48.043242],[1.849352,48.043462],[1.849621,48.043589],[1.849756,48.043651],[1.849893,48.043711],[1.850146,48.043815],[1.8504,48.043917],[1.850667,48.044017],[1.850938,48.044115],[1.851175,48.044194],[1.851417,48.044272],[1.85166,48.044344],[1.851908,48.044416],[1.852161,48.044484],[1.852412,48.044549],[1.852702,48.04462],[1.852987,48.044687],[1.853311,48.044753],[1.85364,48.044815],[1.853984,48.044871],[1.854332,48.044923],[1.854592,48.044957],[1.854851,48.044989],[1.855125,48.045019],[1.855401,48.045045],[1.855671,48.045065],[1.855953,48.045084],[1.856229,48.045096],[1.856507,48.045104],[1.85681,48.045109],[1.857114,48.04511],[1.857418,48.045107],[1.857724,48.045102],[1.858177,48.045089],[1.863729,48.044851],[1.869735,48.044586],[1.870127,48.044572],[1.870524,48.044561],[1.870925,48.044557],[1.871327,48.044562],[1.871753,48.04457],[1.872176,48.044584],[1.872643,48.044607],[1.873102,48.044637],[1.873593,48.044672],[1.874134,48.044718],[1.874471,48.044744],[1.878818,48.045086],[1.879226,48.045119],[1.880484,48.045232],[1.881745,48.045353],[1.88301,48.045485],[1.88427,48.045616],[1.889304,48.04615],[1.890608,48.046286],[1.899343,48.047201],[1.904329,48.047707],[1.909325,48.048214],[1.919366,48.049233],[1.920129,48.049311],[1.920889,48.049393],[1.921248,48.049435],[1.921607,48.049481],[1.921963,48.049528],[1.922323,48.049578],[1.922695,48.049634],[1.923066,48.049694],[1.923809,48.04982],[1.924157,48.049882],[1.924504,48.049945],[1.924851,48.050012],[1.925198,48.050082],[1.925789,48.050208],[1.926374,48.050339],[1.926931,48.050469],[1.927476,48.050601],[1.928051,48.050752],[1.928625,48.050908],[1.929175,48.051066],[1.929723,48.05123],[1.93007,48.051335],[1.930414,48.051446],[1.930755,48.051561],[1.931095,48.051676],[1.931819,48.051932],[1.93254,48.052197],[1.932873,48.052323],[1.933117,48.052418],[1.933204,48.052452],[1.933862,48.052723],[1.934535,48.053018],[1.935205,48.053319],[1.935647,48.053526],[1.936088,48.053739],[1.93654,48.053965],[1.936991,48.054194],[1.93741,48.054418],[1.937824,48.054647],[1.938683,48.055133],[1.940385,48.05611],[1.941217,48.056592],[1.94206,48.057074],[1.945481,48.059051],[1.947199,48.060041],[1.948923,48.061028],[1.949768,48.061533],[1.95061,48.062029],[1.952329,48.063022],[1.955765,48.064988],[1.959199,48.066963],[1.962638,48.068936],[1.96606,48.070911],[1.966917,48.071405],[1.967778,48.071895],[1.969533,48.072859],[1.970057,48.073145],[1.970588,48.073429],[1.971652,48.07399],[1.972733,48.074546],[1.973276,48.074823],[1.97382,48.075099],[1.976666,48.076479],[1.977444,48.076839],[1.978208,48.077197],[1.980003,48.078004],[1.98091,48.0784],[1.981363,48.078599],[1.981818,48.078794],[1.985442,48.080325],[1.994747,48.084252],[2.000204,48.086549],[2.021803,48.095639],[2.0221,48.095763],[2.022475,48.095914],[2.022858,48.096062],[2.023189,48.096187],[2.023556,48.096322],[2.02393,48.096455],[2.02424,48.096563],[2.024551,48.096672],[2.024864,48.096777],[2.025178,48.09688],[2.025494,48.09698],[2.025811,48.097079],[2.02613,48.097175],[2.026451,48.097269],[2.026774,48.097361],[2.027096,48.097451],[2.02742,48.09754],[2.027745,48.097626],[2.027989,48.097691],[2.028236,48.097753],[2.028483,48.097814],[2.028732,48.097874],[2.02923,48.097988],[2.029731,48.098097],[2.030298,48.098219],[2.030717,48.098302],[2.031193,48.098394],[2.031695,48.098482],[2.032,48.098536],[2.032307,48.098585],[2.032628,48.098634],[2.032951,48.098682],[2.033605,48.098775],[2.033934,48.098821],[2.034261,48.098863],[2.034917,48.098941],[2.035227,48.098974],[2.035538,48.099005],[2.036163,48.099062],[2.036811,48.099114],[2.03746,48.099159],[2.037745,48.099179],[2.03803,48.099194],[2.038595,48.09922],[2.039156,48.099237],[2.03973,48.099252],[2.040028,48.099261],[2.040328,48.099265],[2.040627,48.099267],[2.040926,48.099267],[2.041519,48.099262],[2.042114,48.099255],[2.055379,48.099097],[2.055932,48.099089],[2.056485,48.099079],[2.056869,48.099067],[2.057255,48.099052],[2.057518,48.099042],[2.057772,48.099029],[2.058021,48.099012],[2.058447,48.098982],[2.058871,48.098947],[2.059288,48.098909],[2.05971,48.098867],[2.060202,48.098809],[2.060692,48.098747],[2.061205,48.098676],[2.061716,48.098597],[2.062164,48.09852],[2.062608,48.09844],[2.063057,48.098356],[2.063499,48.098267],[2.063925,48.098177],[2.064341,48.098081],[2.064778,48.097973],[2.065209,48.09786],[2.06561,48.097751],[2.066011,48.097639],[2.066423,48.097518],[2.06683,48.097392],[2.067302,48.097249],[2.067759,48.097108],[2.075245,48.09479],[2.07626,48.094488],[2.076822,48.094336],[2.07739,48.094189],[2.077968,48.094046],[2.078552,48.093907],[2.078913,48.093824],[2.079277,48.093743],[2.079991,48.093598],[2.080782,48.093449],[2.081581,48.093309],[2.08245,48.093168],[2.083052,48.09308],[2.083662,48.093001],[2.084281,48.09293],[2.084904,48.092865],[2.085474,48.092809],[2.086049,48.092755],[2.086626,48.092712],[2.087208,48.092675],[2.087755,48.092649],[2.088312,48.092627],[2.089466,48.09259],[2.090079,48.092584],[2.09053,48.092587],[2.090651,48.092588],[2.090921,48.092592],[2.091196,48.092595],[2.091739,48.092607],[2.092814,48.092642],[2.093086,48.092654],[2.093358,48.092668],[2.093631,48.092686],[2.093904,48.092704],[2.094498,48.09275],[2.095094,48.092798],[2.095687,48.092854],[2.096284,48.092911],[2.096798,48.092973],[2.097313,48.09304],[2.097822,48.093111],[2.098331,48.093185],[2.098918,48.093276],[2.099506,48.093374],[2.10003,48.09347],[2.100552,48.09357],[2.101065,48.093674],[2.101581,48.093784],[2.102062,48.093892],[2.10254,48.094003],[2.103107,48.094141],[2.103671,48.094284],[2.104242,48.094437],[2.104808,48.094599],[2.105428,48.094786],[2.106043,48.09498],[2.10661,48.095162],[2.107174,48.095352],[2.10899,48.095955],[2.109019,48.095965],[2.110281,48.096375],[2.110751,48.096531],[2.11171,48.096872],[2.112226,48.097061],[2.112733,48.097255],[2.113161,48.097424],[2.113582,48.097598],[2.114007,48.097778],[2.11421,48.097866],[2.114429,48.09796],[2.11478,48.098117],[2.115129,48.09828],[2.115481,48.098443],[2.115834,48.098613],[2.116204,48.098794],[2.116574,48.098981],[2.116975,48.099193],[2.117378,48.099409],[2.117707,48.099591],[2.118033,48.099774],[2.118373,48.099974],[2.11871,48.100175],[2.119445,48.100628],[2.119823,48.10087],[2.120195,48.101114],[2.120559,48.101365],[2.12108,48.101733],[2.121336,48.10192],[2.122424,48.102758],[2.124904,48.10469],[2.126143,48.105653],[2.12739,48.106619],[2.127731,48.106887],[2.128073,48.107154],[2.128432,48.107432],[2.128434,48.107433],[2.128798,48.107708],[2.129178,48.107985],[2.12937,48.10812],[2.129568,48.108257],[2.129953,48.108519],[2.130345,48.108781],[2.130712,48.10902],[2.131086,48.109257],[2.131472,48.109491],[2.131864,48.109722],[2.132094,48.109856],[2.132326,48.109989],[2.132796,48.110249],[2.133281,48.110503],[2.133771,48.110756],[2.134038,48.110891],[2.134306,48.111025],[2.134575,48.111156],[2.134846,48.111286],[2.135338,48.111512],[2.135836,48.111735],[2.136167,48.111878],[2.1365,48.112018],[2.136837,48.112157],[2.137176,48.112295],[2.137498,48.11242],[2.137821,48.112544],[2.138148,48.112666],[2.138475,48.112785],[2.138802,48.112903],[2.13913,48.113017],[2.139468,48.113132],[2.139809,48.113243],[2.140489,48.113456],[2.140825,48.11356],[2.141167,48.113662],[2.141552,48.113774],[2.141944,48.113882],[2.142335,48.113987],[2.14273,48.114089],[2.143133,48.114192],[2.143534,48.114291],[2.143939,48.114387],[2.144348,48.114479],[2.144893,48.114595],[2.145162,48.114651],[2.145433,48.114704],[2.145719,48.11476],[2.146005,48.114814],[2.146293,48.114865],[2.146583,48.114915],[2.147154,48.115007],[2.147726,48.115097],[2.148303,48.11518],[2.148883,48.115257],[2.149371,48.115317],[2.149862,48.115374],[2.156281,48.116107],[2.161125,48.116651],[2.163209,48.116891],[2.163891,48.116967],[2.164232,48.117007],[2.164926,48.117081],[2.165623,48.117149],[2.166313,48.117211],[2.166663,48.117239],[2.167013,48.117267],[2.167367,48.117292],[2.167706,48.117316],[2.168053,48.117338],[2.16839,48.117359],[2.168748,48.117379],[2.1691,48.117397],[2.169794,48.117428],[2.170491,48.117453],[2.171198,48.117473],[2.171889,48.117486],[2.172244,48.11749],[2.172599,48.117498],[2.172944,48.1175],[2.173289,48.117501],[2.173636,48.117499],[2.173992,48.117497],[2.174344,48.117491],[2.174697,48.117485],[2.175049,48.117477],[2.175392,48.117467],[2.175746,48.117456],[2.17609,48.117441],[2.176435,48.117425],[2.176779,48.117408],[2.177129,48.117389],[2.17748,48.117369],[2.177827,48.117351],[2.178189,48.11733],[2.178538,48.117309],[2.178884,48.117285],[2.179235,48.11726],[2.17958,48.117232],[2.179931,48.117203],[2.180273,48.11717],[2.180617,48.117135],[2.18096,48.1171],[2.181302,48.117065],[2.181648,48.117027],[2.181995,48.116988],[2.182334,48.116947],[2.182679,48.116906],[2.183027,48.116863],[2.183401,48.116816],[2.183785,48.116764],[2.184603,48.116648],[2.185281,48.116544],[2.185961,48.116434],[2.186653,48.116322],[2.187342,48.116208],[2.188028,48.116095],[2.188734,48.115978],[2.189415,48.115861],[2.190103,48.115743],[2.19078,48.115627],[2.191499,48.115503],[2.192089,48.115398],[2.193146,48.115222],[2.19479,48.114948],[2.196185,48.11471],[2.198543,48.114306],[2.199221,48.114191],[2.199897,48.114073],[2.201466,48.113807],[2.204179,48.11335],[2.20486,48.113237],[2.205547,48.113129],[2.206229,48.113025],[2.206923,48.112922],[2.207605,48.112825],[2.208287,48.112733],[2.208976,48.112642],[2.209669,48.112558],[2.210359,48.112478],[2.211055,48.112399],[2.211743,48.112326],[2.212432,48.112256],[2.213132,48.112191],[2.21382,48.112132],[2.214529,48.112075],[2.215231,48.112024],[2.21593,48.111976],[2.216627,48.111931],[2.217324,48.111891],[2.218023,48.111853],[2.21872,48.11182],[2.219498,48.111777],[2.220192,48.111754],[2.220896,48.111736],[2.221595,48.111721],[2.222295,48.111709],[2.222991,48.111701],[2.223698,48.111699],[2.224401,48.1117],[2.225116,48.111706],[2.225813,48.111713],[2.226157,48.111718],[2.226501,48.111725],[2.226855,48.111734],[2.227208,48.111745],[2.227912,48.111766],[2.228613,48.111791],[2.229319,48.111822],[2.241197,48.112373],[2.245392,48.112573],[2.249536,48.112767],[2.254827,48.113009],[2.255532,48.11304],[2.256235,48.113066],[2.256938,48.113092],[2.257706,48.113117],[2.258679,48.113145],[2.259379,48.11316],[2.260079,48.113173],[2.260774,48.113187],[2.261474,48.113195],[2.262165,48.113203],[2.262872,48.113207],[2.263585,48.113211],[2.264264,48.113209],[2.264967,48.113206],[2.265669,48.113201],[2.266369,48.113195],[2.267078,48.113188],[2.267781,48.113179],[2.268476,48.113163],[2.269181,48.113145],[2.26988,48.113126],[2.270574,48.113105],[2.271286,48.113083],[2.271984,48.113055],[2.27268,48.113028],[2.273387,48.112996],[2.274073,48.112961],[2.27478,48.112925],[2.275468,48.112887],[2.276169,48.112845],[2.27686,48.1128],[2.277532,48.112756],[2.278198,48.112707],[2.278851,48.11266],[2.279552,48.112609],[2.28025,48.112554],[2.280947,48.112499],[2.281644,48.112439],[2.28234,48.112373],[2.283029,48.112305],[2.284424,48.112169],[2.285777,48.112037],[2.285812,48.112034],[2.28859,48.111762],[2.289975,48.111627],[2.291534,48.111474],[2.293092,48.111319],[2.295863,48.111045],[2.298647,48.110777],[2.29931,48.110709],[2.299961,48.11064],[2.300649,48.110566],[2.301355,48.110485],[2.302037,48.110402],[2.302731,48.110314],[2.303415,48.110221],[2.304095,48.110122],[2.304777,48.110021],[2.305477,48.109912],[2.30583,48.109855],[2.30618,48.109797],[2.30653,48.109737],[2.306867,48.109679],[2.307208,48.10962],[2.307548,48.109561],[2.308216,48.109437],[2.308894,48.109315],[2.309577,48.10919],[2.310246,48.109066],[2.310922,48.10893],[2.311259,48.108863],[2.311597,48.108793],[2.31193,48.108724],[2.312272,48.10865],[2.312608,48.108577],[2.313269,48.108426],[2.313926,48.108273],[2.314586,48.108117],[2.315257,48.107953],[2.315909,48.107791],[2.316562,48.107626],[2.317217,48.107452],[2.31787,48.107277],[2.318518,48.107099],[2.319165,48.106918],[2.319803,48.106731],[2.320287,48.106584],[2.320921,48.10639],[2.321506,48.106208],[2.322032,48.10604],[2.322663,48.105837],[2.323294,48.10563],[2.323605,48.105524],[2.323916,48.105416],[2.324534,48.105201],[2.325164,48.104986],[2.325789,48.104773],[2.327029,48.104343],[2.32765,48.104128],[2.328275,48.103914],[2.328896,48.103698],[2.329205,48.103589],[2.329518,48.103483],[2.329833,48.103378],[2.330152,48.103275],[2.330469,48.103174],[2.330787,48.103075],[2.331107,48.102978],[2.331428,48.102884],[2.33175,48.10279],[2.332076,48.102698],[2.332402,48.102608],[2.332727,48.102522],[2.333056,48.102437],[2.333381,48.102354],[2.333713,48.102271],[2.334046,48.102191],[2.334372,48.102114],[2.334705,48.102036],[2.335043,48.101961],[2.335369,48.10189],[2.335704,48.101819],[2.33604,48.101749],[2.336378,48.101682],[2.33672,48.101617],[2.337055,48.101556],[2.337395,48.101497],[2.337736,48.101438],[2.338082,48.101382],[2.338423,48.101326],[2.339112,48.10122],[2.339793,48.101118],[2.341158,48.100918],[2.343892,48.10051],[2.346627,48.100105],[2.352125,48.099287],[2.35998,48.098121],[2.361346,48.097916],[2.362715,48.097714],[2.363404,48.097613],[2.364093,48.097515],[2.364777,48.097422],[2.365462,48.097329],[2.366147,48.097238],[2.367528,48.097065],[2.36896,48.096896],[2.370639,48.09671],[2.372023,48.09657],[2.373401,48.096437],[2.374792,48.096315],[2.375487,48.096257],[2.37618,48.096203],[2.376874,48.096152],[2.377567,48.096101],[2.378261,48.096052],[2.378963,48.096007],[2.379669,48.095962],[2.38037,48.095923],[2.381074,48.095885],[2.381776,48.095848],[2.382482,48.095815],[2.38319,48.095784],[2.384589,48.095728],[2.386017,48.095684],[2.38675,48.095666],[2.387483,48.095648],[2.388197,48.095634],[2.388899,48.095625],[2.389602,48.095617],[2.390477,48.095609],[2.391195,48.095607],[2.392664,48.095611],[2.39297,48.095613],[2.394366,48.095626],[2.39507,48.095632],[2.39649,48.095647],[2.402242,48.09571],[2.402938,48.095718],[2.40364,48.095723],[2.403994,48.095723],[2.404345,48.095721],[2.404696,48.095716],[2.405042,48.09571],[2.405391,48.095701],[2.40574,48.095689],[2.406084,48.095678],[2.406438,48.09566],[2.40679,48.095642],[2.407142,48.095623],[2.407486,48.095598],[2.407833,48.095575],[2.408172,48.095548],[2.40853,48.095517],[2.408871,48.095485],[2.409212,48.09545],[2.409581,48.095413],[2.409949,48.095372],[2.410426,48.095316],[2.410768,48.095271],[2.411121,48.095223],[2.411461,48.095175],[2.4118,48.095126],[2.412383,48.095035],[2.412659,48.094987],[2.412991,48.09493],[2.413332,48.094868],[2.413666,48.094805],[2.41401,48.094741],[2.414348,48.094672],[2.414676,48.094604],[2.415012,48.094532],[2.415347,48.094457],[2.415676,48.094382],[2.416011,48.094302],[2.416341,48.094221],[2.416665,48.094139],[2.416988,48.094057],[2.417319,48.093969],[2.417642,48.093879],[2.417965,48.093789],[2.418295,48.093692],[2.418612,48.0936],[2.418935,48.0935],[2.419251,48.093403],[2.419569,48.093301],[2.419884,48.093197],[2.4202,48.09309],[2.420514,48.092982],[2.420826,48.092872],[2.42113,48.092763],[2.421435,48.09265],[2.421748,48.09253],[2.422047,48.092416],[2.422345,48.092297],[2.422648,48.092174],[2.422946,48.092052],[2.423242,48.091927],[2.423535,48.091801],[2.42383,48.09167],[2.424121,48.091538],[2.424409,48.091406],[2.424697,48.091272],[2.424986,48.091133],[2.425267,48.090996],[2.42555,48.090855],[2.426112,48.090575],[2.426674,48.090295],[2.427234,48.090017],[2.427799,48.089735],[2.428362,48.089455],[2.428925,48.089175],[2.429489,48.088895],[2.430054,48.088615],[2.430617,48.088334],[2.431183,48.088053],[2.431749,48.087771],[2.432315,48.087499],[2.432894,48.087231],[2.433479,48.08697],[2.434074,48.086716],[2.434673,48.086471],[2.435274,48.086236],[2.435888,48.086006],[2.436568,48.085764],[2.437224,48.085542],[2.437852,48.085339],[2.438502,48.085141],[2.439139,48.084955],[2.43979,48.084776],[2.440459,48.084602],[2.441122,48.08444],[2.441783,48.084287],[2.442468,48.08414],[2.443136,48.084006],[2.44381,48.083877],[2.444499,48.083759],[2.44518,48.08365],[2.445525,48.083598],[2.445869,48.083549],[2.446214,48.083502],[2.446568,48.083457],[2.446906,48.083415],[2.447253,48.083375],[2.4476,48.083337],[2.447948,48.083301],[2.448293,48.083269],[2.448644,48.083236],[2.448987,48.083208],[2.449334,48.083184],[2.449683,48.083159],[2.450033,48.083136],[2.450383,48.083116],[2.450735,48.083099],[2.451089,48.083085],[2.451439,48.08307],[2.451789,48.083059],[2.452489,48.083046],[2.453193,48.083034],[2.453895,48.083026],[2.459462,48.082934],[2.461959,48.082905],[2.462708,48.082895],[2.46371,48.082881],[2.465119,48.08286],[2.466512,48.082839],[2.467254,48.08282],[2.469712,48.082782],[2.470518,48.082775],[2.470871,48.082771],[2.471226,48.082763],[2.471924,48.082751],[2.472625,48.082742],[2.47333,48.082732],[2.474029,48.08272],[2.475428,48.082703],[2.476133,48.082691],[2.476484,48.082685],[2.476837,48.082682],[2.477184,48.08268],[2.477535,48.082681],[2.477885,48.082686],[2.478239,48.082693],[2.47859,48.082704],[2.478942,48.082719],[2.479299,48.082736],[2.479649,48.082758],[2.479998,48.082781],[2.480351,48.082807],[2.480708,48.082838],[2.481058,48.082872],[2.481407,48.082908],[2.481755,48.082945],[2.482107,48.082987],[2.482457,48.083032],[2.482803,48.083081],[2.483145,48.083133],[2.483489,48.083186],[2.483829,48.08324],[2.484181,48.083301],[2.484521,48.083363],[2.484853,48.083428],[2.485192,48.083497],[2.485531,48.083569],[2.485863,48.083644],[2.486198,48.08372],[2.486532,48.083801],[2.486862,48.083884],[2.487186,48.083971],[2.487516,48.08406],[2.487841,48.084151],[2.488162,48.084244],[2.488805,48.084443],[2.49012,48.084865],[2.491347,48.085252],[2.492619,48.085662],[2.493256,48.085863],[2.493895,48.086062],[2.494534,48.086263],[2.494853,48.086362],[2.495173,48.086459],[2.495498,48.086557],[2.495818,48.08665],[2.496148,48.086739],[2.496479,48.086827],[2.496812,48.086913],[2.497129,48.086997],[2.497462,48.087083],[2.497787,48.087164],[2.498122,48.087244],[2.498454,48.087321],[2.498787,48.087393],[2.499122,48.087466],[2.499452,48.087536],[2.499793,48.087607],[2.500132,48.087676],[2.500464,48.087739],[2.50081,48.087804],[2.501147,48.087866],[2.501479,48.087924],[2.502161,48.088043],[2.502501,48.088101],[2.502846,48.088156],[2.503187,48.088207],[2.503876,48.088309],[2.504219,48.088357],[2.504563,48.0884],[2.504906,48.088443],[2.505256,48.088484],[2.505946,48.088562],[2.507341,48.088724],[2.508813,48.088886],[2.510459,48.089075],[2.511852,48.089233],[2.516359,48.089746],[2.519126,48.090058],[2.526833,48.090928],[2.530974,48.091407],[2.532693,48.091617],[2.534644,48.091847],[2.562747,48.095283],[2.563087,48.095324],[2.563435,48.095364],[2.563784,48.095398],[2.564129,48.09543],[2.564482,48.095459],[2.56483,48.095488],[2.565177,48.095512],[2.565527,48.095532],[2.565879,48.095551],[2.566228,48.095573],[2.566573,48.095588],[2.566929,48.0956],[2.567281,48.095607],[2.567629,48.095611],[2.567984,48.095616],[2.568287,48.095616],[2.568591,48.095613],[2.569034,48.095604],[2.569384,48.095593],[2.569736,48.095577],[2.570083,48.095559],[2.570439,48.095544],[2.570787,48.095524],[2.571134,48.095503],[2.571486,48.095478],[2.57183,48.095449],[2.572174,48.095418],[2.572525,48.095383],[2.572877,48.095346],[2.573226,48.095308],[2.573564,48.095268],[2.57391,48.095221],[2.574257,48.095172],[2.574597,48.095121],[2.574937,48.095068],[2.575281,48.095011],[2.575617,48.094953],[2.575956,48.094891],[2.576293,48.094826],[2.576632,48.094758],[2.576968,48.094689],[2.577306,48.094614],[2.577641,48.094539],[2.57797,48.094461],[2.578333,48.094368],[2.578666,48.094285],[2.578979,48.094202],[2.579307,48.094113],[2.579605,48.09403],[2.580053,48.093901],[2.580426,48.093787],[2.580756,48.093684],[2.581065,48.093583],[2.581382,48.093478],[2.581696,48.093373],[2.582006,48.093264],[2.582314,48.093151],[2.58262,48.093036],[2.582921,48.092919],[2.583228,48.092799],[2.583526,48.092679],[2.583826,48.092557],[2.58412,48.092429],[2.58441,48.092299],[2.585004,48.092035],[2.589717,48.089953],[2.594421,48.087881],[2.599124,48.085808],[2.603824,48.083733],[2.604121,48.083601],[2.604421,48.08347],[2.604712,48.083343],[2.605006,48.083218],[2.605308,48.08309],[2.605612,48.082964],[2.605912,48.082843],[2.606211,48.082724],[2.606513,48.082605],[2.606812,48.082489],[2.607117,48.082371],[2.607426,48.082253],[2.608041,48.08202],[2.608665,48.081795],[2.609296,48.081574],[2.609928,48.081363],[2.610216,48.081266],[2.610549,48.081163],[2.610865,48.081064],[2.611181,48.080963],[2.611498,48.080867],[2.611813,48.080772],[2.612135,48.080674],[2.612459,48.080579],[2.612784,48.080484],[2.61311,48.08039],[2.613438,48.080298],[2.613767,48.080204],[2.614096,48.080112],[2.614416,48.080026],[2.614755,48.079938],[2.615085,48.079855],[2.615415,48.079773],[2.615751,48.079692],[2.616069,48.079617],[2.616483,48.079521],[2.61709,48.079386],[2.617778,48.079239],[2.618429,48.079105],[2.619121,48.07897],[2.620284,48.078746],[2.62232,48.078361],[2.622664,48.078297],[2.623001,48.078234],[2.623336,48.078169],[2.623672,48.078101],[2.624007,48.078033],[2.624342,48.077963],[2.624678,48.077888],[2.625014,48.077812],[2.625345,48.077737],[2.625701,48.077654],[2.626047,48.07757],[2.626385,48.077484],[2.626708,48.077403],[2.627039,48.077318],[2.627368,48.077231],[2.627692,48.077144],[2.628021,48.077054],[2.628347,48.076964],[2.628672,48.076872],[2.628993,48.076779],[2.629313,48.076686],[2.629638,48.076591],[2.629959,48.076496],[2.630278,48.076398],[2.630596,48.0763],[2.630914,48.076198],[2.631232,48.076095],[2.63155,48.075991],[2.631869,48.075885],[2.63218,48.07578],[2.632489,48.075674],[2.632804,48.075566],[2.633117,48.075456],[2.633425,48.075347],[2.633731,48.075236],[2.634041,48.075121],[2.634349,48.075004],[2.634654,48.074886],[2.635262,48.074649],[2.63556,48.074532],[2.635855,48.074413],[2.636162,48.074283],[2.636334,48.074209],[2.636459,48.074156],[2.636755,48.074028],[2.63705,48.073899],[2.637349,48.073768],[2.637642,48.073637],[2.63793,48.073505],[2.638219,48.073371],[2.6388,48.073106],[2.639379,48.072839],[2.639967,48.072568],[2.640535,48.072308],[2.641695,48.07177],[2.642799,48.071257],[2.643375,48.07099],[2.643953,48.070721],[2.64454,48.070446],[2.645112,48.070182],[2.645697,48.069914],[2.646278,48.069654],[2.646868,48.069398],[2.647468,48.069145],[2.648066,48.068899],[2.648683,48.068656],[2.649286,48.068423],[2.6499,48.068193],[2.650522,48.067966],[2.65114,48.067749],[2.651768,48.067536],[2.652403,48.067326],[2.65304,48.067123],[2.653678,48.066928],[2.654326,48.066735],[2.654967,48.066552],[2.655625,48.06637],[2.656281,48.066195],[2.656945,48.066025],[2.65761,48.065864],[2.658287,48.065704],[2.658958,48.065548],[2.659877,48.065333],[2.661575,48.064937],[2.663491,48.064489],[2.664886,48.064162],[2.66624,48.063845],[2.667415,48.06357],[2.667845,48.063469],[2.66916,48.063162],[2.670483,48.062851],[2.671881,48.062522],[2.672636,48.062348],[2.674803,48.06184],[2.677462,48.061223],[2.67813,48.061063],[2.678785,48.0609],[2.679435,48.06073],[2.680094,48.060552],[2.680571,48.060417],[2.681216,48.060232],[2.68186,48.06004],[2.682507,48.059842],[2.683128,48.059642],[2.683755,48.059434],[2.684388,48.059218],[2.685004,48.059002],[2.685626,48.058775],[2.686237,48.058546],[2.686843,48.058311],[2.687444,48.058071],[2.68804,48.057827],[2.688338,48.057702],[2.688636,48.057575],[2.688931,48.057448],[2.689225,48.057319],[2.689512,48.057189],[2.689805,48.057058],[2.690101,48.056922],[2.691247,48.056388],[2.692401,48.05585],[2.694719,48.054771],[2.695029,48.05463],[2.695358,48.054488],[2.695678,48.054355],[2.695983,48.054232],[2.696289,48.054115],[2.696598,48.054001],[2.69691,48.053891],[2.697229,48.053784],[2.697551,48.05368],[2.69787,48.053581],[2.698195,48.053487],[2.698521,48.053393],[2.698847,48.053307],[2.699175,48.053223],[2.699509,48.053143],[2.699842,48.053067],[2.700184,48.052994],[2.70052,48.052927],[2.70086,48.052863],[2.701198,48.052803],[2.701544,48.052747],[2.701891,48.052694],[2.702241,48.052646],[2.702587,48.052602],[2.702938,48.052563],[2.703287,48.052527],[2.703626,48.052496],[2.703989,48.052468],[2.70434,48.052444],[2.704688,48.052425],[2.705013,48.052411],[2.705393,48.052399],[2.705746,48.052391],[2.706089,48.052389],[2.706449,48.05239],[2.706805,48.052396],[2.707156,48.052406],[2.707518,48.052418],[2.707868,48.052437],[2.70822,48.052458],[2.708569,48.052483],[2.708922,48.052514],[2.709266,48.052548],[2.709612,48.052587],[2.70996,48.052629],[2.710303,48.052675],[2.710659,48.052727],[2.710992,48.052781],[2.711325,48.052838],[2.711672,48.052902],[2.712048,48.052975],[2.712411,48.053053],[2.712753,48.05313],[2.713092,48.05321],[2.713428,48.053296],[2.713762,48.053384],[2.714075,48.053473],[2.719275,48.054954],[2.719598,48.055042],[2.719922,48.055131],[2.720243,48.055216],[2.720572,48.055303],[2.720902,48.055386],[2.721235,48.055468],[2.721563,48.055547],[2.721892,48.055624],[2.722222,48.055701],[2.722894,48.05585],[2.723231,48.055921],[2.723569,48.05599],[2.723913,48.05606],[2.724242,48.056126],[2.724559,48.056187],[2.724908,48.056251],[2.72558,48.056371],[2.726768,48.056587],[2.72966,48.057091],[2.73587,48.058186],[2.737334,48.058446],[2.740058,48.058927],[2.74145,48.059172],[2.742128,48.059292],[2.74281,48.059411],[2.743486,48.059522],[2.744193,48.059631],[2.744874,48.059729],[2.745564,48.059822],[2.745911,48.059867],[2.746258,48.059911],[2.746604,48.059953],[2.74695,48.059994],[2.747294,48.060032],[2.747639,48.060069],[2.747981,48.060103],[2.748733,48.06018],[2.762043,48.061406],[2.762789,48.061476],[2.763483,48.061545],[2.766072,48.061869],[2.768178,48.062161],[2.770042,48.062417],[2.773136,48.062844],[2.779039,48.063668],[2.782486,48.064142],[2.784913,48.064476],[2.785247,48.064522],[2.78869,48.064996],[2.790753,48.065279],[2.791441,48.065374],[2.791788,48.065419],[2.792136,48.065463],[2.792479,48.065504],[2.792826,48.065544],[2.793169,48.065581],[2.79352,48.065615],[2.793872,48.065649],[2.794222,48.065679],[2.794566,48.065707],[2.794922,48.065732],[2.795265,48.065755],[2.795611,48.065776],[2.795961,48.065795],[2.796312,48.065812],[2.796663,48.065827],[2.797012,48.065838],[2.797368,48.065848],[2.797713,48.065855],[2.798072,48.065861],[2.798419,48.065862],[2.798769,48.065864],[2.799119,48.065862],[2.79947,48.065858],[2.79982,48.065851],[2.800171,48.065842],[2.800694,48.065825],[2.801042,48.065811],[2.801391,48.065794],[2.801741,48.065775],[2.802085,48.065754],[2.802432,48.065731],[2.802781,48.065704],[2.803127,48.065676],[2.803471,48.065648],[2.803822,48.065615],[2.804172,48.06558],[2.80452,48.065544],[2.804868,48.065504],[2.805216,48.065463],[2.805564,48.065419],[2.805906,48.065373],[2.806246,48.065326],[2.806593,48.065276],[2.806929,48.065222],[2.807274,48.065168],[2.807615,48.06511],[2.807953,48.06505],[2.808293,48.064989],[2.808624,48.064927],[2.808962,48.06486],[2.809299,48.064792],[2.809634,48.064722],[2.809965,48.06465],[2.810299,48.064576],[2.810635,48.064498],[2.810963,48.06442],[2.811289,48.064338],[2.811615,48.064255],[2.811941,48.06417],[2.812264,48.064085],[2.812592,48.063995],[2.81292,48.063903],[2.813243,48.06381],[2.813567,48.063713],[2.813882,48.063616],[2.8142,48.063516],[2.814517,48.063415],[2.814901,48.063288],[2.815295,48.063152],[2.815606,48.06304],[2.815912,48.062929],[2.816219,48.062815],[2.816519,48.062701],[2.816826,48.062584],[2.817127,48.062465],[2.817427,48.062344],[2.817725,48.062221],[2.818023,48.062096],[2.81832,48.061968],[2.818617,48.061839],[2.81891,48.061709],[2.819201,48.061578],[2.819499,48.061439],[2.820064,48.061167],[2.820628,48.060887],[2.820907,48.060744],[2.821179,48.060598],[2.821724,48.060304],[2.822809,48.05971],[2.824984,48.058524],[2.825535,48.058225],[2.826091,48.057928],[2.826646,48.057645],[2.827209,48.057367],[2.827777,48.057093],[2.828349,48.056821],[2.828647,48.056687],[2.828927,48.056561],[2.829218,48.05643],[2.829525,48.056303],[2.82982,48.056175],[2.830122,48.056053],[2.830422,48.05593],[2.830729,48.055806],[2.831042,48.055688],[2.83133,48.055578],[2.831646,48.055455],[2.831955,48.05534],[2.832248,48.05523],[2.832555,48.055116],[2.832876,48.055],[2.833657,48.054727],[2.834288,48.054525],[2.834929,48.054325],[2.835571,48.054134],[2.836216,48.053951],[2.836865,48.053774],[2.837521,48.053604],[2.838192,48.05344],[2.838852,48.053286],[2.839524,48.053136],[2.840239,48.052986],[2.841761,48.052699],[2.84219,48.052619],[2.842553,48.052556],[2.842893,48.052502],[2.84324,48.052446],[2.843578,48.052396],[2.843927,48.052345],[2.844623,48.052248],[2.845316,48.052162],[2.8481,48.051822],[2.850095,48.051578],[2.851284,48.051436],[2.852661,48.051274],[2.853354,48.051195],[2.854047,48.051113],[2.854741,48.051026],[2.855436,48.050935],[2.856821,48.05076],[2.858215,48.050591],[2.859593,48.050433],[2.860968,48.050267],[2.862349,48.050099],[2.863043,48.050016],[2.863735,48.049931],[2.864426,48.049843],[2.865112,48.049758],[2.865805,48.049666],[2.866494,48.04957],[2.86718,48.049472],[2.867871,48.049369],[2.868554,48.049266],[2.869241,48.049157],[2.869924,48.049045],[2.870608,48.048929],[2.871973,48.048687],[2.872313,48.048626],[2.872652,48.048564],[2.87299,48.048501],[2.873326,48.048436],[2.874008,48.048304],[2.874688,48.048168],[2.875026,48.0481],[2.875364,48.048031],[2.875697,48.047964],[2.876029,48.047897],[2.876364,48.047827],[2.876697,48.047757],[2.877375,48.047613],[2.877709,48.04754],[2.878042,48.047465],[2.878698,48.047318],[2.879366,48.047167],[2.88003,48.047011],[2.880365,48.046932],[2.881027,48.046773],[2.881356,48.046695],[2.881686,48.046616],[2.882012,48.046534],[2.882669,48.046368],[2.883321,48.046203],[2.884183,48.045973],[2.885124,48.045723],[2.885779,48.045546],[2.887096,48.045185],[2.887429,48.045097],[2.887753,48.045017],[2.888087,48.044941],[2.888418,48.044867],[2.88875,48.044797],[2.889089,48.04473],[2.88943,48.044666],[2.889767,48.044606],[2.890113,48.044547],[2.890452,48.044492],[2.890795,48.044437],[2.891142,48.044384],[2.891482,48.044335],[2.891833,48.04429],[2.892183,48.04425],[2.892532,48.044214],[2.892879,48.044184],[2.893232,48.044156],[2.89358,48.044133],[2.893924,48.044114],[2.894277,48.044098],[2.894632,48.044084],[2.894986,48.04407],[2.895335,48.044061],[2.895688,48.044052],[2.896049,48.044048],[2.896397,48.044045],[2.896755,48.044047],[2.897108,48.044053],[2.89746,48.044063],[2.897818,48.044079],[2.898514,48.044118],[2.899216,48.044152],[2.900639,48.044214],[2.90207,48.044284],[2.902306,48.044295],[2.906587,48.044497],[2.907286,48.044537],[2.907988,48.044573],[2.909389,48.04464],[2.910783,48.04471],[2.911141,48.044726],[2.911491,48.044741],[2.911839,48.044753],[2.912188,48.044762],[2.912545,48.044768],[2.912895,48.044772],[2.913242,48.044773],[2.913595,48.04477],[2.913945,48.04477],[2.914297,48.044765],[2.914642,48.044757],[2.915006,48.044747],[2.915353,48.044735],[2.915701,48.044721],[2.916053,48.044705],[2.916401,48.044687],[2.916756,48.044667],[2.917103,48.044644],[2.91745,48.04462],[2.917798,48.044593],[2.918151,48.044563],[2.918493,48.044531],[2.918845,48.044497],[2.919188,48.04446],[2.919533,48.044422],[2.919884,48.04438],[2.920232,48.044336],[2.920575,48.044291],[2.920916,48.044243],[2.921261,48.044194],[2.921599,48.044143],[2.921939,48.044089],[2.922282,48.044032],[2.922624,48.043973],[2.923302,48.043844],[2.923981,48.043715],[2.926694,48.043191],[2.928052,48.04293],[2.929412,48.042671],[2.932107,48.042162],[2.933466,48.0419],[2.933797,48.041837],[2.934137,48.041778],[2.934481,48.041722],[2.934828,48.04167],[2.935175,48.041621],[2.935513,48.041576],[2.93587,48.041533],[2.936219,48.041498],[2.936573,48.041469],[2.936921,48.041443],[2.937611,48.041395],[2.940412,48.041182],[2.940764,48.041159],[2.941116,48.041133],[2.941461,48.041108],[2.941826,48.041078],[2.942168,48.041044],[2.942508,48.041006],[2.942861,48.040962],[2.943194,48.040918],[2.943546,48.040864],[2.94388,48.040809],[2.944219,48.040746],[2.944563,48.040679],[2.944899,48.04061],[2.945198,48.040545],[2.945283,48.040523],[2.946042,48.040347],[2.946368,48.04026],[2.946699,48.040168],[2.947012,48.040078],[2.947335,48.039982],[2.947651,48.039884],[2.947967,48.03978],[2.948277,48.039676],[2.948578,48.039567],[2.948882,48.039454],[2.949189,48.039334],[2.949485,48.039215],[2.94978,48.039091],[2.950092,48.038954],[2.950508,48.038763],[2.950798,48.038623],[2.951075,48.038486],[2.951355,48.038339],[2.951903,48.038046],[2.952437,48.037756],[2.953274,48.037308],[2.953826,48.037011],[2.9541,48.036864],[2.954384,48.036716],[2.954656,48.036578],[2.954947,48.036436],[2.955237,48.036298],[2.955527,48.036164],[2.95582,48.036033],[2.956119,48.035901],[2.956418,48.035773],[2.95672,48.035649],[2.957018,48.03553],[2.957324,48.03541],[2.957634,48.035294],[2.957945,48.035181],[2.958252,48.035072],[2.958568,48.034963],[2.958879,48.034859],[2.959195,48.034758],[2.959515,48.034659],[2.959838,48.034561],[2.960156,48.03447],[2.960488,48.034376],[2.960821,48.034286],[2.961137,48.034205],[2.961468,48.034121],[2.961801,48.034041],[2.962135,48.033966],[2.96247,48.033894],[2.962802,48.033824],[2.963142,48.033758],[2.963481,48.033693],[2.963818,48.033631],[2.964159,48.033571],[2.964502,48.033516],[2.964844,48.033465],[2.965187,48.033416],[2.96557,48.033365],[2.965937,48.033319],[2.966306,48.033277],[2.966655,48.03324],[2.967005,48.033207],[2.967359,48.033177],[2.967716,48.033149],[2.96806,48.033125],[2.968404,48.033104],[2.968762,48.033085],[2.969113,48.03307],[2.969464,48.033057],[2.969812,48.033049],[2.970172,48.033044],[2.970529,48.033042],[2.970872,48.03304],[2.971228,48.033043],[2.971582,48.03305],[2.971927,48.033059],[2.973333,48.033113],[2.974738,48.033169],[2.976142,48.03323],[2.977548,48.033287],[2.97895,48.033351],[2.980357,48.033402],[2.981762,48.033448],[2.984576,48.033541],[2.987385,48.033649],[2.99012,48.033757],[2.990194,48.03376],[2.990896,48.033789],[2.991605,48.033822],[2.992302,48.033861],[2.993003,48.033906],[2.993689,48.033956],[2.994402,48.034011],[2.995109,48.034068],[2.995805,48.034129],[2.996511,48.03419],[2.997208,48.034261],[2.997906,48.034338],[3.00205,48.034795],[3.006219,48.035255],[3.008996,48.035571],[3.011079,48.035811],[3.012463,48.035975],[3.013161,48.036062],[3.013854,48.036153],[3.014573,48.036248],[3.016676,48.036572],[3.017217,48.036663],[3.017764,48.036758],[3.018329,48.036857],[3.018831,48.036952],[3.019171,48.037015],[3.019509,48.037081],[3.020188,48.037215],[3.02083,48.037344],[3.021538,48.037495],[3.022401,48.03769],[3.023712,48.037996],[3.026415,48.038623],[3.02707,48.038773],[3.027406,48.038851],[3.02774,48.038931],[3.028066,48.03901],[3.028399,48.039094],[3.02873,48.039183],[3.029054,48.039272],[3.03011,48.039577],[3.030808,48.03978],[3.031131,48.039875],[3.031452,48.039972],[3.031776,48.040069],[3.032109,48.040175],[3.032418,48.040279],[3.032732,48.040388],[3.033086,48.040516],[3.033448,48.040658],[3.033957,48.040873],[3.034239,48.041002],[3.034604,48.041173],[3.034664,48.041204],[3.034944,48.041347],[3.035285,48.041533],[3.035687,48.041764],[3.036153,48.042037],[3.036662,48.042359],[3.036925,48.042512],[3.037175,48.042673],[3.037439,48.042836],[3.037715,48.042989],[3.037995,48.04314],[3.038281,48.043282],[3.038549,48.043413],[3.03877,48.043515],[3.038972,48.043605],[3.039273,48.043724],[3.03957,48.043836],[3.039729,48.043892],[3.039878,48.043943],[3.040029,48.043994],[3.040189,48.044046],[3.040346,48.044093],[3.040505,48.044141],[3.040668,48.044186],[3.04083,48.044228],[3.040991,48.044272],[3.041146,48.044312],[3.041311,48.044351],[3.041479,48.044388],[3.041643,48.044425],[3.041805,48.044457],[3.041971,48.044487],[3.042148,48.044519],[3.042322,48.044548],[3.042658,48.044598],[3.042994,48.044641],[3.043336,48.044678],[3.043685,48.044715],[3.044368,48.044775],[3.045766,48.044892],[3.047138,48.045007],[3.048509,48.045126],[3.049724,48.045231],[3.050395,48.04529],[3.051074,48.045348],[3.05179,48.045404],[3.05251,48.045457],[3.053212,48.045513],[3.053918,48.045569],[3.054598,48.045626],[3.055298,48.045689],[3.058014,48.045914],[3.058275,48.045936],[3.060341,48.046093],[3.060686,48.046123],[3.061038,48.046155],[3.061379,48.046187],[3.061735,48.046222],[3.062078,48.046266],[3.062416,48.046313],[3.06276,48.046367],[3.063096,48.046427],[3.063434,48.046494],[3.063753,48.046565],[3.06408,48.046646],[3.064401,48.046731],[3.064719,48.04682],[3.065038,48.046915],[3.065361,48.047015],[3.065674,48.047117],[3.065995,48.047228],[3.066304,48.047341],[3.066614,48.047458],[3.06723,48.047692],[3.068457,48.048164],[3.069658,48.048636],[3.070851,48.049109],[3.072058,48.049583],[3.073246,48.05006],[3.073544,48.050176],[3.073817,48.050283],[3.074355,48.050492],[3.074621,48.050589],[3.074769,48.050641],[3.07492,48.050694],[3.075091,48.050751],[3.075263,48.050808],[3.075423,48.05086],[3.075577,48.050909],[3.075735,48.050956],[3.076047,48.051046],[3.078253,48.051663],[3.078662,48.051775],[3.078949,48.051856],[3.081452,48.05257],[3.081728,48.052649],[3.082051,48.052738],[3.082208,48.052781],[3.082365,48.052823],[3.082523,48.052864],[3.082681,48.052903],[3.082842,48.052942],[3.083008,48.05298],[3.083169,48.053016],[3.083331,48.05305],[3.083499,48.053084],[3.083669,48.053115],[3.084,48.053174],[3.084327,48.053227],[3.085018,48.053336],[3.092123,48.054426],[3.093117,48.054501],[3.09331,48.054518],[3.093468,48.054529],[3.093604,48.054532],[3.09377,48.05453],[3.093944,48.054522],[3.094077,48.054511],[3.094277,48.054489],[3.094492,48.054454],[3.094689,48.054415],[3.09491,48.054362],[3.095474,48.054219],[3.095651,48.054172],[3.095818,48.054132],[3.095981,48.054096],[3.096158,48.054058],[3.096327,48.054029],[3.096496,48.054],[3.096665,48.053978],[3.09684,48.053961],[3.097008,48.053949],[3.097186,48.053944],[3.097362,48.053942],[3.097533,48.05395],[3.097654,48.053957],[3.09779,48.053973],[3.097958,48.053994],[3.098171,48.054028],[3.098418,48.054083],[3.09869,48.054156],[3.100106,48.05458],[3.102702,48.055356],[3.103586,48.055635],[3.104215,48.055825],[3.106171,48.056395],[3.106794,48.056583],[3.107009,48.056662],[3.107217,48.056745],[3.107456,48.056865],[3.107643,48.056975],[3.107814,48.057095],[3.10797,48.057222],[3.108115,48.057357],[3.108245,48.057513],[3.108346,48.057645],[3.108434,48.057803],[3.108497,48.057942],[3.108548,48.058091],[3.108586,48.058232],[3.108603,48.058356],[3.108611,48.058479],[3.108609,48.058599],[3.1086,48.058735],[3.108581,48.058867],[3.108553,48.059002],[3.108519,48.059115],[3.108469,48.059271],[3.108385,48.059478],[3.108219,48.059844],[3.108135,48.060036],[3.108072,48.060199],[3.108038,48.060319],[3.108011,48.060439],[3.107993,48.060575],[3.107993,48.060695],[3.108,48.060825],[3.108018,48.060961],[3.108046,48.061123],[3.108143,48.061721],[3.10818,48.061998],[3.108263,48.062226],[3.108351,48.06245],[3.108444,48.062672],[3.108547,48.062906],[3.108646,48.063127],[3.10875,48.063346],[3.108862,48.063575],[3.108969,48.06378],[3.109093,48.064009],[3.109226,48.064239],[3.109345,48.064441],[3.109482,48.064662],[3.109615,48.064872],[3.109757,48.065086],[3.109896,48.06529],[3.11004,48.065494],[3.110214,48.065725],[3.110337,48.065888],[3.110466,48.066048],[3.110632,48.066255],[3.1108,48.066462],[3.110975,48.066666],[3.111151,48.066864],[3.111334,48.067063],[3.111519,48.067259],[3.111711,48.067455],[3.111905,48.067652],[3.112143,48.067885],[3.112443,48.068186],[3.112608,48.068332],[3.112768,48.068474],[3.112935,48.068619],[3.113104,48.068763],[3.113255,48.06889],[3.113408,48.069012],[3.113727,48.069261],[3.114273,48.06969],[3.11673,48.071436],[3.119158,48.073196],[3.120313,48.074089],[3.12153,48.07506],[3.122595,48.075956],[3.123648,48.076897],[3.125437,48.078608],[3.126311,48.079457],[3.127113,48.080327],[3.127737,48.081006],[3.128341,48.081664],[3.129148,48.082601],[3.129926,48.083549],[3.130711,48.084552],[3.131474,48.085552],[3.134457,48.089383],[3.135086,48.090206],[3.135666,48.091037],[3.136086,48.091692],[3.136447,48.092286],[3.13679,48.092901],[3.137147,48.093595],[3.137454,48.094334],[3.137714,48.095073],[3.137898,48.09573],[3.138083,48.096538],[3.138199,48.097315],[3.138267,48.098091],[3.138263,48.098802],[3.138224,48.099459],[3.138148,48.100022],[3.138054,48.100629],[3.137938,48.101169],[3.13779,48.101692],[3.137644,48.102226],[3.137452,48.102744],[3.137249,48.103265],[3.137015,48.103788],[3.136756,48.104306],[3.136516,48.104769],[3.136107,48.105539],[3.13587,48.105985],[3.135537,48.106638],[3.13525,48.10732],[3.135013,48.107924],[3.13497,48.108034],[3.134841,48.108414],[3.13473,48.108796],[3.134625,48.109178],[3.13454,48.10957],[3.134421,48.110271],[3.134353,48.110887],[3.134319,48.111691],[3.134336,48.112377],[3.134367,48.112993],[3.134525,48.113975],[3.134781,48.115065],[3.134999,48.115687],[3.135237,48.116295],[3.135948,48.117688],[3.136267,48.118217],[3.136636,48.11875],[3.136959,48.11919],[3.137318,48.119637],[3.137761,48.120155],[3.138266,48.120682],[3.138794,48.121199],[3.139352,48.121713],[3.139866,48.122138],[3.141537,48.123448],[3.142364,48.124106],[3.143175,48.124772],[3.144124,48.125601],[3.145127,48.126518],[3.146095,48.127483],[3.147042,48.128492],[3.148476,48.130147],[3.149916,48.131791],[3.153859,48.136057],[3.157281,48.139774],[3.160591,48.143566],[3.161274,48.144323],[3.161975,48.145062],[3.162363,48.145435],[3.162433,48.145502],[3.162701,48.145762],[3.16318,48.146236],[3.164631,48.147622],[3.165464,48.148387],[3.1665,48.149361],[3.16714,48.149963],[3.167902,48.150702],[3.16821,48.151],[3.169068,48.151897],[3.169427,48.152295],[3.169819,48.152729],[3.170358,48.153374],[3.171048,48.154276],[3.171534,48.154916],[3.171999,48.155555],[3.172447,48.156218],[3.172881,48.156889],[3.173452,48.157823],[3.173969,48.158543],[3.174588,48.159934],[3.174948,48.160723],[3.175291,48.161522],[3.175593,48.162319],[3.175873,48.163125],[3.176199,48.164231],[3.176405,48.165101],[3.176586,48.16605],[3.17672,48.167048],[3.176779,48.167822],[3.176808,48.168607],[3.176807,48.169091],[3.176784,48.170454],[3.176344,48.173518],[3.176234,48.174314],[3.176148,48.175133],[3.17614,48.176199],[3.176173,48.176818],[3.17624,48.177467],[3.176414,48.178388],[3.176545,48.178929],[3.176905,48.179993],[3.177269,48.180852],[3.177618,48.181518],[3.17786,48.181956],[3.17838,48.182743],[3.178917,48.183469],[3.179281,48.183906],[3.179587,48.184263],[3.18007,48.184769],[3.180872,48.185542],[3.181414,48.186007],[3.182087,48.186551],[3.18276,48.187058],[3.183589,48.187649],[3.185056,48.188662],[3.186368,48.189574],[3.188071,48.190755],[3.190488,48.192423],[3.192546,48.193838],[3.195106,48.19545],[3.198497,48.19749],[3.201558,48.199161],[3.203492,48.200182],[3.204364,48.200584],[3.206044,48.201416],[3.207461,48.202052],[3.208906,48.20268],[3.21142,48.203727],[3.214051,48.204787],[3.215867,48.205528],[3.217315,48.206141],[3.217913,48.206407],[3.21993,48.207344],[3.221907,48.208307],[3.22388,48.209341],[3.225594,48.21029],[3.227277,48.211286],[3.228587,48.212098],[3.22993,48.212984],[3.23088,48.213675],[3.2317,48.214309],[3.233088,48.215494],[3.234268,48.216663],[3.234822,48.21727],[3.235385,48.217926],[3.235821,48.218491],[3.236575,48.219531],[3.237082,48.220293],[3.238053,48.221794],[3.239194,48.223564],[3.240594,48.225722],[3.241074,48.226443],[3.241598,48.22718],[3.242187,48.227944],[3.242843,48.228731],[3.243929,48.229904],[3.244525,48.23049],[3.245034,48.230968],[3.245761,48.231618],[3.246279,48.232058],[3.246967,48.23262],[3.247662,48.233162],[3.248608,48.233844],[3.249589,48.234504],[3.250427,48.235028],[3.251505,48.23565],[3.25667,48.238552],[3.257566,48.239052],[3.257784,48.239175],[3.260481,48.240771],[3.261417,48.241396],[3.262333,48.242064],[3.26284,48.242451],[3.263346,48.242843],[3.264085,48.243455],[3.26485,48.244037],[3.267528,48.246738],[3.268697,48.247928],[3.269571,48.248671],[3.270354,48.249337],[3.271614,48.250273],[3.272947,48.251134],[3.281652,48.25601],[3.283287,48.256925],[3.283604,48.257104],[3.284197,48.257453],[3.285125,48.258024],[3.286405,48.258907],[3.2869,48.25929],[3.287834,48.260072],[3.288597,48.260773],[3.289316,48.261515],[3.289981,48.262275],[3.290384,48.262785],[3.29076,48.263295],[3.29103,48.263693],[3.291305,48.264124],[3.29198,48.26511],[3.292326,48.265686],[3.292558,48.266054],[3.292672,48.266219],[3.292791,48.266373],[3.29291,48.26651],[3.293006,48.266617],[3.293124,48.266727],[3.293271,48.26685],[3.293421,48.266951],[3.293592,48.267059],[3.293779,48.267161],[3.293942,48.267235],[3.294162,48.267326],[3.294386,48.267399],[3.294601,48.267456],[3.29482,48.267503],[3.295063,48.267543],[3.295276,48.267567],[3.295493,48.267579],[3.295733,48.267584],[3.295956,48.267574],[3.296207,48.267554],[3.296404,48.267527],[3.296628,48.267487],[3.296852,48.267436],[3.297069,48.26738],[3.297307,48.267309],[3.297757,48.267159],[3.29886,48.266803],[3.300547,48.266141],[3.302263,48.265448],[3.304086,48.264723],[3.30635,48.263822],[3.307561,48.263347],[3.308638,48.262955],[3.310059,48.262475],[3.311628,48.262003],[3.312554,48.261744],[3.313303,48.261551],[3.314589,48.261242],[3.315917,48.26095],[3.317264,48.260689],[3.318281,48.260512],[3.321523,48.259972],[3.322816,48.259761],[3.324164,48.259496],[3.325724,48.25911],[3.325953,48.259052],[3.327046,48.258753],[3.32818,48.258393],[3.329312,48.257979],[3.330884,48.257326],[3.332427,48.256582],[3.33362,48.255926],[3.334728,48.255234],[3.335807,48.254482],[3.339503,48.251651],[3.34043,48.250973],[3.341383,48.25033],[3.342469,48.249657],[3.343224,48.249229],[3.344391,48.24861],[3.346297,48.247712],[3.347022,48.2474],[3.348052,48.246987],[3.349398,48.246497],[3.350728,48.246069],[3.352732,48.24546],[3.354349,48.244988],[3.355894,48.24453],[3.35911,48.243615],[3.361342,48.242932],[3.363982,48.24201],[3.365286,48.241505],[3.366656,48.240938],[3.375742,48.237167],[3.377053,48.236659],[3.37838,48.236213],[3.380054,48.235758],[3.381749,48.235389],[3.383437,48.235086],[3.385154,48.234855],[3.38647,48.234734],[3.387682,48.234654],[3.388874,48.234592],[3.390489,48.234596],[3.392071,48.234642],[3.392429,48.23466],[3.393233,48.234699],[3.404884,48.235256],[3.408225,48.235339],[3.411146,48.235326],[3.412594,48.23528],[3.41945,48.234974],[3.42203,48.234884],[3.423192,48.234879],[3.425096,48.23487],[3.427307,48.23491],[3.429761,48.235007],[3.437405,48.235371],[3.438359,48.235439],[3.440237,48.235575],[3.442701,48.235867],[3.445115,48.236266],[3.453082,48.237787],[3.455209,48.238129],[3.456996,48.238325],[3.45994,48.23861],[3.46171,48.238822],[3.463843,48.239145],[3.468928,48.240076],[3.470231,48.240276],[3.471576,48.240428],[3.472937,48.240542],[3.476841,48.240676],[3.478807,48.240755],[3.480325,48.240849],[3.482448,48.241122],[3.484697,48.24154],[3.486146,48.2419],[3.48933,48.242715],[3.491207,48.243181],[3.492219,48.243411],[3.49327,48.24363],[3.494499,48.243835],[3.495726,48.244008],[3.49658,48.244101],[3.497422,48.244177],[3.498866,48.244258],[3.500238,48.24429],[3.501657,48.244303],[3.504463,48.244322],[3.507247,48.244342],[3.508615,48.244356],[3.510034,48.244377],[3.510833,48.24441],[3.511652,48.244454],[3.512418,48.244519],[3.513253,48.244594],[3.514296,48.244721],[3.515034,48.244831],[3.515371,48.244881],[3.516388,48.245069],[3.517367,48.245262],[3.518502,48.245535],[3.519677,48.245837],[3.522027,48.246497],[3.524056,48.247025],[3.525293,48.247285],[3.526387,48.247481],[3.527197,48.247612],[3.528111,48.247735],[3.529987,48.247924],[3.531454,48.247997],[3.532092,48.248018],[3.532704,48.248029],[3.533329,48.248023],[3.533991,48.248008],[3.534724,48.24798],[3.535391,48.247945],[3.536193,48.247886],[3.537042,48.247811],[3.538243,48.247662],[3.539442,48.247497],[3.542532,48.246989],[3.547097,48.246212],[3.548651,48.24596],[3.54952,48.24583],[3.550651,48.245677],[3.551735,48.245543],[3.55287,48.245422],[3.553916,48.24532],[3.556272,48.24511],[3.558476,48.244914],[3.560544,48.244723],[3.561306,48.244647],[3.561996,48.244566],[3.563104,48.244435],[3.56405,48.244309],[3.565071,48.24417],[3.565955,48.244032],[3.58222,48.241394],[3.584997,48.241021],[3.587614,48.240802],[3.589207,48.24071],[3.589982,48.240665],[3.592391,48.240611],[3.59455,48.240603],[3.595143,48.240604],[3.596436,48.240609],[3.598332,48.240693],[3.600672,48.240875],[3.601352,48.240935],[3.602447,48.241057],[3.603789,48.241219],[3.605166,48.241409],[3.605457,48.241453],[3.606823,48.241677],[3.608696,48.242071],[3.609965,48.242402],[3.611384,48.24282],[3.61168,48.242921],[3.612709,48.243273],[3.614055,48.243815],[3.615425,48.244422],[3.615642,48.244525],[3.617568,48.245575],[3.618834,48.246376],[3.620103,48.24733],[3.622619,48.249438],[3.623275,48.249988],[3.625153,48.251428],[3.626667,48.252425],[3.626822,48.252513],[3.627908,48.253132],[3.629123,48.253736],[3.630399,48.254301],[3.631703,48.254821],[3.633014,48.255293],[3.634334,48.255703],[3.635696,48.256077],[3.636986,48.256389],[3.639262,48.256809],[3.640899,48.257013],[3.648059,48.257657],[3.650956,48.257846],[3.652999,48.257899],[3.655077,48.257881],[3.658832,48.257741],[3.66162,48.257719],[3.66416,48.257847],[3.666561,48.258128],[3.669127,48.258606],[3.671041,48.25907],[3.6728,48.259612],[3.674366,48.260168],[3.675985,48.260844],[3.677552,48.261595],[3.681307,48.26354],[3.683089,48.264375],[3.684911,48.265131],[3.686694,48.265787],[3.688507,48.26638],[3.690444,48.266953],[3.693084,48.267592],[3.694859,48.267952],[3.697524,48.268371],[3.698877,48.268534],[3.709249,48.269459],[3.71099,48.269589],[3.71281,48.269659],[3.714587,48.269672],[3.716381,48.269638],[3.718719,48.269513],[3.721209,48.269268],[3.722191,48.269135],[3.722671,48.269063],[3.73068,48.267802],[3.73241,48.26754],[3.73415,48.26732],[3.735963,48.26714],[3.737477,48.267037],[3.739023,48.26697],[3.742086,48.266967],[3.745023,48.267079],[3.746159,48.267173],[3.748134,48.267379],[3.750501,48.267712],[3.785091,48.2742],[3.788596,48.274909],[3.791377,48.275581],[3.796223,48.276854],[3.798149,48.277278],[3.799903,48.277564],[3.801822,48.27777],[3.80357,48.277882],[3.8056,48.277884],[3.807452,48.277809],[3.809424,48.277605],[3.810616,48.27743],[3.811893,48.277194],[3.812965,48.276959],[3.814162,48.276656],[3.814464,48.276567],[3.814577,48.276536],[3.815282,48.276326],[3.819669,48.274893],[3.821491,48.274416],[3.822835,48.274135],[3.82436,48.273878],[3.825338,48.273757],[3.82628,48.273661],[3.827732,48.273556],[3.829321,48.273517],[3.830715,48.273566],[3.832122,48.273651],[3.841327,48.274303],[3.844273,48.274475],[3.84708,48.274509],[3.850065,48.274394],[3.852391,48.274216],[3.85535,48.273847],[3.855876,48.273758],[3.860059,48.273094],[3.862124,48.272859],[3.863465,48.272727],[3.864729,48.272636],[3.866073,48.272557],[3.866075,48.272557],[3.867761,48.272519],[3.868936,48.272516],[3.869959,48.272528],[3.872098,48.272616],[3.874261,48.272761],[3.876864,48.272934],[3.878068,48.273019],[3.880289,48.273115],[3.882001,48.273131],[3.89499,48.27305],[3.897584,48.273077],[3.899563,48.273153],[3.901389,48.273305],[3.908922,48.274084],[3.911621,48.274273],[3.914288,48.274338],[3.915759,48.274326],[3.917318,48.274259],[3.919186,48.274138],[3.920376,48.27402],[3.921756,48.273859],[3.923496,48.27361],[3.925028,48.27336],[3.926505,48.273069],[3.929903,48.272295],[3.930837,48.272093],[3.931832,48.271897],[3.932599,48.271764],[3.933296,48.27166],[3.93481,48.271489],[3.93596,48.271409],[3.936189,48.271393],[3.937241,48.271351],[3.938298,48.271337],[3.939258,48.271345],[3.940462,48.27139],[3.943128,48.271512],[3.944983,48.271573],[3.946023,48.27159],[3.947072,48.271577],[3.948249,48.271526],[3.948788,48.271495],[3.949295,48.271458],[3.950663,48.27132],[3.951677,48.271194],[3.952747,48.271035],[3.953834,48.270838],[3.955116,48.270569],[3.956296,48.270276],[3.957492,48.269935],[3.958506,48.269622],[3.959423,48.269299],[3.960534,48.26888],[3.961362,48.268532],[3.962333,48.268085],[3.963441,48.267535],[3.964611,48.266876],[3.96559,48.266275],[3.966,48.265998],[3.966539,48.265636],[3.967553,48.264857],[3.968105,48.264396],[3.969541,48.263168],[3.978812,48.255045],[3.980602,48.253497],[3.982296,48.252198],[3.983733,48.2512],[3.986044,48.249771],[3.996651,48.243433],[3.999116,48.242236],[4.000308,48.241671],[4.001523,48.241126],[4.004035,48.240121],[4.005963,48.239419],[4.007983,48.238754],[4.009554,48.238293],[4.010249,48.23809],[4.012752,48.237417],[4.01554,48.236852],[4.022583,48.235415],[4.025729,48.23495],[4.028554,48.234628],[4.031421,48.234422],[4.032329,48.234379],[4.034778,48.234256],[4.038199,48.234083],[4.040218,48.233978],[4.040744,48.233949],[4.041035,48.233935],[4.041555,48.233903],[4.042435,48.23383],[4.043336,48.233748],[4.044227,48.233649],[4.044897,48.233565],[4.045586,48.23347],[4.046459,48.23335],[4.047742,48.233125],[4.049189,48.232845],[4.049917,48.232683],[4.050899,48.232456],[4.052104,48.232159],[4.052912,48.231935],[4.053333,48.231813],[4.053746,48.231693],[4.054673,48.231411],[4.055664,48.23108],[4.057497,48.230423],[4.057913,48.230276],[4.058429,48.230078],[4.059818,48.22957],[4.064179,48.227943],[4.068058,48.226567],[4.070098,48.225977],[4.07292,48.225298],[4.075923,48.224743],[4.078533,48.224314],[4.080357,48.224144],[4.080881,48.224095],[4.08361,48.223883],[4.086048,48.223776],[4.088914,48.223707],[4.090045,48.223673],[4.091208,48.223604],[4.092605,48.2235],[4.094143,48.223355],[4.097627,48.223001],[4.101172,48.222653],[4.103517,48.222496],[4.10525,48.222421],[4.107723,48.222393],[4.11116,48.222458],[4.113194,48.222505],[4.115271,48.222513],[4.117754,48.222443],[4.120136,48.2223],[4.12105,48.22222],[4.121773,48.222148],[4.122186,48.222106],[4.122349,48.222087],[4.1225,48.222069],[4.123149,48.221994],[4.123902,48.221898],[4.124628,48.221795],[4.125727,48.221626],[4.127682,48.221317],[4.132729,48.22051],[4.134783,48.22024],[4.136214,48.22008],[4.136689,48.220036],[4.13786,48.219927],[4.139436,48.219824],[4.140964,48.219763],[4.141415,48.219747],[4.141878,48.219741],[4.142564,48.219732],[4.14327,48.219733],[4.144028,48.219747],[4.144244,48.219754],[4.144798,48.219772],[4.145532,48.219812],[4.146041,48.219848],[4.146521,48.219883],[4.147238,48.219951],[4.147584,48.219988],[4.148119,48.220053],[4.148632,48.220125],[4.149187,48.220207],[4.149802,48.220313],[4.150453,48.220435],[4.150819,48.220511],[4.15117,48.220586],[4.151527,48.220668],[4.152301,48.220857],[4.153097,48.221073],[4.153842,48.221298],[4.154549,48.221529],[4.154933,48.221662],[4.155766,48.22197],[4.156371,48.222217],[4.156972,48.222473],[4.157537,48.222725],[4.158075,48.222976],[4.159057,48.223447],[4.162168,48.225013],[4.162738,48.225292],[4.163682,48.225747],[4.164603,48.226166],[4.165287,48.226457],[4.165946,48.226723],[4.166408,48.226902],[4.166847,48.227063],[4.167541,48.227302],[4.168125,48.227491],[4.169033,48.227765],[4.169818,48.227981],[4.17071,48.228198],[4.17153,48.228383],[4.17235,48.228545],[4.173395,48.228725],[4.174381,48.228868],[4.175153,48.228962],[4.175906,48.229034],[4.17669,48.229101],[4.177536,48.229153],[4.178481,48.22919],[4.178951,48.229203],[4.179461,48.229205],[4.180327,48.229197],[4.181128,48.229177],[4.181583,48.229159],[4.181762,48.229095],[4.181899,48.229084],[4.182151,48.229055],[4.182288,48.229033],[4.182436,48.229006],[4.182547,48.228975],[4.182682,48.228938],[4.182824,48.228878],[4.182881,48.228852],[4.182961,48.228806],[4.183048,48.228735],[4.183086,48.2287],[4.183129,48.228647],[4.183168,48.228585],[4.183189,48.228532],[4.183204,48.228464],[4.183198,48.228381],[4.183177,48.228312],[4.183142,48.228245],[4.183096,48.228181],[4.183028,48.228124],[4.18296,48.22808],[4.182868,48.228034],[4.182786,48.228003],[4.182701,48.22798],[4.182615,48.227965],[4.182531,48.22796],[4.182444,48.22796],[4.182347,48.227968],[4.18224,48.227985],[4.182107,48.228015],[4.181883,48.228086],[4.181616,48.22818],[4.181344,48.228287],[4.181085,48.228407],[4.18073,48.228592],[4.180382,48.228815],[4.180185,48.228962],[4.180009,48.229105],[4.17983,48.229269],[4.179659,48.229446],[4.179317,48.229845],[4.178975,48.230262],[4.178529,48.230811],[4.178308,48.231084],[4.178088,48.231348],[4.177977,48.23152],[4.177149,48.232561],[4.176367,48.233516],[4.175692,48.234378],[4.175152,48.235102],[4.174786,48.235608],[4.174219,48.236399],[4.17343,48.23759],[4.172851,48.238501],[4.171898,48.240128],[4.171458,48.240925],[4.171224,48.241371],[4.170927,48.24194],[4.170013,48.243903],[4.169386,48.245404],[4.168543,48.247817],[4.16822,48.248897],[4.167775,48.250673],[4.167252,48.252989],[4.166667,48.255636],[4.166063,48.258377],[4.165549,48.260737],[4.165495,48.261035],[4.165124,48.263216],[4.164904,48.264717],[4.164671,48.266772],[4.16452,48.268625],[4.1644,48.270842],[4.16436,48.271476],[4.164167,48.274903],[4.164151,48.275221],[4.164102,48.276012],[4.164009,48.278028],[4.164018,48.279599],[4.164051,48.280264],[4.164099,48.280931],[4.16416,48.281664],[4.164244,48.282371],[4.164339,48.283094],[4.164458,48.283789],[4.164655,48.285061],[4.165203,48.288443],[4.16539,48.28957],[4.165488,48.290177],[4.165685,48.291416],[4.165775,48.291985],[4.166009,48.293492],[4.16613,48.294168],[4.166628,48.297273],[4.166742,48.298406],[4.166779,48.299949],[4.166696,48.301301],[4.166536,48.302574],[4.16634,48.303537],[4.166043,48.304734],[4.164471,48.31014],[4.164182,48.311757],[4.164066,48.313005],[4.164037,48.314399],[4.164131,48.315949],[4.164334,48.317302],[4.164589,48.318513],[4.16496,48.319828],[4.165451,48.321515],[4.166146,48.323832],[4.166478,48.325106],[4.166785,48.326578],[4.16703,48.328105],[4.167179,48.329376],[4.167286,48.331107],[4.167305,48.332577],[4.167231,48.334357],[4.16707,48.335943],[4.166917,48.336948],[4.166582,48.339075],[4.165942,48.343018],[4.165587,48.345248],[4.165539,48.345547],[4.165206,48.34759],[4.164954,48.349131],[4.164579,48.351464],[4.164205,48.353779],[4.163924,48.355155],[4.163572,48.356554],[4.162991,48.35844],[4.162254,48.360404],[4.161829,48.36149],[4.160476,48.364906],[4.160143,48.365764],[4.159378,48.367755],[4.158933,48.369073],[4.158565,48.370325],[4.158281,48.371459],[4.158033,48.372631],[4.15784,48.373841],[4.157661,48.375168],[4.15735,48.377656],[4.157013,48.379542],[4.156718,48.380745],[4.156461,48.381685],[4.156069,48.382963],[4.15585,48.383629],[4.154177,48.388735],[4.153281,48.39147],[4.14854,48.405935],[4.14716,48.410121],[4.146854,48.411115],[4.146556,48.412067],[4.146257,48.413256],[4.146219,48.413442],[4.146124,48.41395],[4.146073,48.41421],[4.145901,48.415576],[4.145868,48.415976],[4.145823,48.416738],[4.145843,48.418138],[4.145954,48.419406],[4.146118,48.420518],[4.146355,48.4216],[4.146619,48.422525],[4.146945,48.423497],[4.147566,48.425066],[4.148104,48.426166],[4.148324,48.426565],[4.148589,48.42701],[4.149511,48.428525],[4.151614,48.43173],[4.153138,48.43407],[4.154144,48.435713],[4.154802,48.436961],[4.15537,48.438227],[4.155918,48.439746],[4.156226,48.440862],[4.156476,48.441983],[4.156693,48.443524],[4.156903,48.446227],[4.157069,48.448845],[4.157194,48.450111],[4.157335,48.451116],[4.157649,48.452818],[4.157961,48.454234],[4.158166,48.455161],[4.15861,48.457236],[4.158636,48.457357],[4.159182,48.459818],[4.159608,48.461506],[4.160037,48.462801],[4.160752,48.464485],[4.161812,48.466659],[4.162881,48.468823],[4.16358,48.470269],[4.164053,48.471389],[4.164426,48.472403],[4.164783,48.473584],[4.165103,48.475076],[4.165291,48.47641],[4.165385,48.478048],[4.165373,48.480329],[4.165268,48.485839],[4.16516,48.489928],[4.165046,48.492305],[4.165044,48.492412],[4.164911,48.495841],[4.164947,48.496951],[4.165066,48.498359],[4.165316,48.499823],[4.165676,48.501218],[4.166115,48.502525],[4.166886,48.504326],[4.16799,48.506295],[4.168491,48.507071],[4.169184,48.508045],[4.171189,48.510651],[4.172917,48.512887],[4.174487,48.515038],[4.175539,48.516644],[4.176246,48.517809],[4.176716,48.518632],[4.177131,48.519381],[4.177861,48.520816],[4.178486,48.522154],[4.178595,48.522406],[4.180647,48.527246],[4.181467,48.529183],[4.182111,48.53065],[4.183512,48.533687],[4.184102,48.534931],[4.184685,48.536144],[4.185518,48.537805],[4.185801,48.538363],[4.186297,48.539353],[4.187307,48.541297],[4.188119,48.542819],[4.188392,48.543322],[4.188814,48.544094],[4.18954,48.545383],[4.189871,48.546026],[4.189946,48.546161],[4.190851,48.547773],[4.192268,48.550531],[4.192997,48.552328],[4.193339,48.55327],[4.193698,48.55456],[4.194095,48.556374],[4.19427,48.557725],[4.194376,48.559304],[4.194365,48.560725],[4.194215,48.562597],[4.193972,48.564087],[4.193541,48.565754],[4.19294,48.567574],[4.192224,48.569366],[4.192138,48.569581],[4.192112,48.569646],[4.191104,48.571985],[4.189904,48.574721],[4.188753,48.577234],[4.188746,48.57725],[4.187498,48.579949],[4.185953,48.583173],[4.184438,48.586241],[4.183061,48.589018],[4.182163,48.590878],[4.181641,48.592031],[4.181232,48.593112],[4.181021,48.593673],[4.180464,48.595422],[4.180356,48.595913],[4.180297,48.596182],[4.18002,48.597446],[4.179761,48.599198],[4.179659,48.600435],[4.17962,48.602078],[4.17975,48.60406],[4.179946,48.605686],[4.18044,48.608543],[4.180935,48.611267],[4.181551,48.614716],[4.182057,48.618101],[4.182221,48.619458],[4.1823,48.620713],[4.182265,48.622298],[4.182112,48.623823],[4.181621,48.626808],[4.181076,48.630028],[4.181043,48.63021],[4.180594,48.632713],[4.180476,48.633373],[4.179773,48.636897],[4.179306,48.638691],[4.178929,48.640065],[4.17851,48.64159],[4.177568,48.644949],[4.177042,48.647228],[4.17643,48.649996],[4.176038,48.651448],[4.175402,48.653402],[4.174315,48.656172],[4.173834,48.657239],[4.17315,48.658741],[4.172217,48.660783],[4.171428,48.662641],[4.170839,48.664481],[4.170518,48.665764],[4.170326,48.666798],[4.170149,48.668552],[4.17016,48.669819],[4.170208,48.670995],[4.170351,48.672114],[4.170401,48.672373],[4.170693,48.673888],[4.171038,48.675064],[4.171322,48.675874],[4.171371,48.675993],[4.171933,48.677325],[4.17239,48.678266],[4.172985,48.679321],[4.173899,48.680757],[4.175172,48.682422],[4.176635,48.684036],[4.177819,48.685176],[4.17867,48.685932],[4.180108,48.687098],[4.181377,48.688012],[4.183151,48.689196],[4.184994,48.690362],[4.185163,48.690469],[4.187243,48.691784],[4.189814,48.693414],[4.191942,48.694788],[4.194788,48.696674],[4.197696,48.698545],[4.200623,48.700453],[4.201991,48.701418],[4.203974,48.702879],[4.205453,48.704029],[4.2077,48.705933],[4.209415,48.707564],[4.211173,48.709642],[4.211839,48.710536],[4.212494,48.711491],[4.213415,48.713076],[4.215277,48.716693],[4.21637,48.718839],[4.21764,48.721116],[4.218552,48.722631],[4.219226,48.723657],[4.219248,48.723691],[4.219696,48.724341],[4.219834,48.724542],[4.220746,48.725855],[4.221457,48.726898],[4.22311,48.729276],[4.223921,48.730482],[4.224028,48.730652],[4.224685,48.731688],[4.225203,48.732621],[4.225375,48.732945],[4.225465,48.733108],[4.22571,48.733595],[4.226132,48.734508],[4.226512,48.735424],[4.227012,48.736823],[4.227483,48.738643],[4.227653,48.739394],[4.227669,48.739466],[4.228229,48.741943],[4.229017,48.74554],[4.229511,48.747494],[4.229659,48.747967],[4.229891,48.748705],[4.230296,48.749799],[4.230934,48.751249],[4.231478,48.752308],[4.232437,48.753936],[4.233489,48.755463],[4.234194,48.756372],[4.235248,48.757631],[4.236158,48.758622],[4.236949,48.759405],[4.237822,48.760231],[4.239079,48.761325],[4.240385,48.762349],[4.240588,48.762501],[4.24159,48.763234],[4.242651,48.76397],[4.243452,48.764514],[4.244076,48.76492],[4.245656,48.765967],[4.247723,48.767303],[4.249599,48.768561],[4.251347,48.769795],[4.252789,48.770923],[4.254224,48.772114],[4.254754,48.772595],[4.254972,48.772793],[4.255231,48.773028],[4.25674,48.774522],[4.25803,48.775929],[4.25975,48.778081],[4.260976,48.779732],[4.262316,48.781588],[4.267168,48.788126],[4.268522,48.789839],[4.270237,48.791782],[4.271566,48.793189],[4.273488,48.795101],[4.27492,48.796523],[4.276401,48.797986],[4.278083,48.799607],[4.27995,48.801338],[4.282094,48.803328],[4.283492,48.804733],[4.28473,48.806151],[4.285885,48.807702],[4.285956,48.807797],[4.286874,48.809242],[4.287607,48.810585],[4.288192,48.812014],[4.288634,48.813213],[4.288802,48.813734],[4.289084,48.814745],[4.28924,48.815298],[4.289485,48.816728],[4.289584,48.818192],[4.289584,48.819882],[4.289013,48.828298],[4.288833,48.83098],[4.288597,48.834511],[4.288243,48.837373],[4.287925,48.839412],[4.287502,48.842257],[4.287021,48.845577],[4.286439,48.849214],[4.286099,48.851336],[4.285716,48.853966],[4.285536,48.855369],[4.285474,48.856214],[4.285488,48.857775],[4.285489,48.857893],[4.285502,48.858286],[4.285504,48.858367],[4.285554,48.859581],[4.285655,48.860772],[4.286013,48.862824],[4.286302,48.863925],[4.287231,48.867195],[4.28803,48.869869],[4.288434,48.871405],[4.289327,48.875209],[4.289898,48.877793],[4.290151,48.879405],[4.290261,48.880782],[4.290339,48.882288],[4.290314,48.883027],[4.290195,48.884396],[4.290021,48.88577],[4.28958,48.887883],[4.288915,48.889972],[4.288559,48.890982],[4.288077,48.892374],[4.287209,48.894817],[4.286298,48.897792],[4.285836,48.899719],[4.284979,48.904037],[4.284487,48.90631],[4.284029,48.909076],[4.283742,48.911137],[4.283664,48.911694],[4.283466,48.913805],[4.283386,48.915188],[4.283328,48.917694],[4.283326,48.919711],[4.283325,48.920467],[4.283325,48.92048],[4.283332,48.92294],[4.283437,48.925037],[4.283664,48.927279],[4.284008,48.92939],[4.28446,48.931563],[4.284915,48.933294],[4.285338,48.934702],[4.285876,48.936312],[4.286404,48.937722],[4.287113,48.939498],[4.287763,48.941127],[4.288262,48.942328],[4.288779,48.94371],[4.289325,48.945386],[4.289617,48.946668],[4.289751,48.947591],[4.289896,48.948852],[4.289914,48.949993],[4.289896,48.95114],[4.289794,48.952169],[4.289661,48.953146],[4.289497,48.953922],[4.289219,48.95493],[4.288856,48.956069],[4.288455,48.957144],[4.288159,48.957822],[4.287737,48.958681],[4.286697,48.960579],[4.286261,48.96136],[4.286006,48.961871],[4.285726,48.962447],[4.285448,48.963065],[4.285247,48.963549],[4.284972,48.964264],[4.284768,48.964856],[4.284594,48.965388],[4.284406,48.966099],[4.28431,48.966514],[4.284208,48.966972],[4.284142,48.96731],[4.284112,48.967478],[4.284069,48.967726],[4.284043,48.967874],[4.283928,48.968947],[4.283913,48.969833],[4.283997,48.970895],[4.284081,48.971472],[4.28421,48.972121],[4.284393,48.972853],[4.284524,48.973255],[4.284937,48.974393],[4.285288,48.975157],[4.285729,48.976021],[4.286146,48.976737],[4.286557,48.977409],[4.2868,48.977796],[4.287095,48.978238],[4.287587,48.978935],[4.288266,48.979812],[4.28926,48.981012],[4.289863,48.981759],[4.290673,48.982749],[4.292275,48.984555],[4.293182,48.985797],[4.293898,48.987042],[4.294573,48.988508],[4.294695,48.98888],[4.294733,48.988994],[4.295032,48.989909],[4.295759,48.992822],[4.295982,48.993729],[4.296677,48.99609],[4.297404,48.998599],[4.29748,48.998878],[4.297747,48.999851],[4.298106,49.000844],[4.298295,49.001548],[4.298469,49.00224],[4.298606,49.002842],[4.298709,49.003454],[4.298732,49.003594],[4.298805,49.004442],[4.298816,49.004868],[4.298818,49.005264],[4.298801,49.005635],[4.298759,49.006182],[4.298575,49.007462],[4.29841,49.008197],[4.298195,49.008923],[4.297985,49.009524],[4.297714,49.010194],[4.297449,49.010778],[4.297139,49.011374],[4.296789,49.011968],[4.295901,49.013275],[4.2948,49.014901],[4.292645,49.018019],[4.288152,49.024806],[4.287707,49.025478],[4.28434,49.030202],[4.28396,49.030826],[4.283283,49.032094],[4.282909,49.032894],[4.282584,49.033662],[4.282297,49.034441],[4.281856,49.035863],[4.281558,49.03726],[4.281555,49.037273],[4.281335,49.038934],[4.281274,49.039942],[4.281268,49.040906],[4.281315,49.041794],[4.28141,49.042706],[4.281562,49.043663],[4.281695,49.044328],[4.281959,49.045378],[4.282604,49.047295],[4.282774,49.047892],[4.282935,49.048632],[4.283028,49.049194],[4.283125,49.049647],[4.283236,49.050051],[4.283432,49.05054],[4.283646,49.050934],[4.283786,49.051174],[4.283917,49.05137],[4.28407,49.051565],[4.284204,49.051721],[4.284335,49.051865],[4.28443,49.051964],[4.285126,49.052626],[4.285284,49.052685],[4.285726,49.053018],[4.285955,49.05319],[4.286169,49.053322],[4.286376,49.053423],[4.286582,49.053511],[4.286804,49.053587],[4.287116,49.053674],[4.287427,49.053726],[4.287771,49.053753],[4.288074,49.053762],[4.288371,49.053738],[4.288658,49.053704],[4.288932,49.053644],[4.289169,49.053571],[4.289477,49.05344],[4.289657,49.053352],[4.290091,49.053126],[4.29017,49.053085],[4.291474,49.052399],[4.291635,49.05237],[4.293224,49.051525],[4.293493,49.051388],[4.294526,49.050902],[4.296609,49.049995],[4.297599,49.049604],[4.298606,49.049222],[4.299701,49.048843],[4.300814,49.048467],[4.30232,49.048016],[4.303744,49.047621],[4.305647,49.047165],[4.310514,49.046084],[4.311836,49.045752],[4.313069,49.045425],[4.318422,49.04394],[4.323104,49.042622],[4.323257,49.04258],[4.32344,49.04253],[4.323976,49.042382],[4.324869,49.042157],[4.324941,49.042139],[4.325875,49.041925],[4.326695,49.041746],[4.327113,49.041654],[4.327645,49.041552],[4.328149,49.041458],[4.329389,49.041228],[4.330719,49.041019],[4.331922,49.040851],[4.333493,49.040674],[4.334956,49.04053],[4.337788,49.040307],[4.339207,49.040186],[4.340462,49.040061],[4.341541,49.039918],[4.342514,49.039761],[4.343573,49.039553],[4.344587,49.039333],[4.345566,49.039072],[4.345632,49.039053],[4.34653,49.038787],[4.347249,49.038563],[4.348058,49.038283],[4.348833,49.037989],[4.350118,49.037459],[4.350712,49.037201],[4.352244,49.036543],[4.353109,49.036193],[4.354156,49.035812],[4.354768,49.035609],[4.355476,49.035389],[4.356209,49.035172],[4.357741,49.034792],[4.358987,49.034545],[4.360232,49.034337],[4.36159,49.034162],[4.363023,49.034029],[4.363806,49.033986],[4.364584,49.033956],[4.366175,49.033942],[4.367614,49.033989],[4.369325,49.034105],[4.374834,49.034515],[4.376279,49.034603],[4.377395,49.034653],[4.378632,49.034677],[4.379765,49.034682],[4.381399,49.034651],[4.383307,49.034562],[4.385615,49.034403],[4.389722,49.034044],[4.391923,49.033857],[4.39358,49.033744],[4.393815,49.033728],[4.395754,49.033652],[4.397349,49.033629],[4.398842,49.033637],[4.40035,49.033681],[4.402047,49.033772],[4.403759,49.033916],[4.405068,49.034061],[4.406207,49.034192],[4.414157,49.035236],[4.416013,49.035444],[4.417065,49.035548],[4.418291,49.035652],[4.419629,49.035742],[4.421698,49.035833],[4.422695,49.035865],[4.423653,49.035877],[4.42381,49.035876],[4.424895,49.035883],[4.426157,49.035863],[4.427468,49.035827],[4.428404,49.035793],[4.429404,49.035744],[4.431037,49.035629],[4.432711,49.035475],[4.434801,49.035254],[4.435257,49.035199],[4.437092,49.034966],[4.441262,49.034447],[4.442943,49.034248],[4.443726,49.034163],[4.444581,49.034085],[4.445767,49.033994],[4.446499,49.033948],[4.446939,49.033927],[4.449273,49.033845],[4.455403,49.03373],[4.457075,49.033666],[4.458764,49.033572],[4.460508,49.033423],[4.462138,49.033242],[4.46384,49.033009],[4.465619,49.032715],[4.467559,49.032333],[4.469631,49.031883],[4.471531,49.031469],[4.472627,49.031229],[4.473823,49.030985],[4.475467,49.030675],[4.477146,49.03041],[4.478427,49.030242],[4.479723,49.030096],[4.488643,49.029359],[4.490844,49.029139],[4.492496,49.028916],[4.494776,49.028568],[4.496045,49.028365],[4.500861,49.027595],[4.502072,49.027422],[4.504252,49.027164],[4.505249,49.027066],[4.507134,49.02693],[4.508538,49.026847],[4.510619,49.026792],[4.511776,49.026783],[4.512933,49.026794],[4.515252,49.026873],[4.516513,49.026945],[4.517853,49.027048],[4.518839,49.027135],[4.519965,49.027259],[4.521964,49.027508],[4.524679,49.027909],[4.526678,49.028214],[4.528258,49.02844],[4.529785,49.028634],[4.53224,49.028916],[4.53394,49.02908],[4.534399,49.029119],[4.542303,49.029764],[4.544047,49.029936],[4.546136,49.030193],[4.548196,49.030516],[4.554636,49.031736],[4.555144,49.031825],[4.555644,49.031904],[4.556675,49.03207],[4.557543,49.032191],[4.55845,49.032309],[4.561494,49.032669],[4.563526,49.032932],[4.56517,49.033182],[4.566478,49.033397],[4.568114,49.033685],[4.568211,49.033702],[4.574406,49.034906],[4.57574,49.03515],[4.576834,49.035331],[4.577851,49.035481],[4.579059,49.035634],[4.580453,49.035787],[4.58136,49.035861],[4.582293,49.035927],[4.583327,49.03599],[4.584453,49.036034],[4.585478,49.036055],[4.587275,49.036058],[4.587801,49.036047],[4.588838,49.036021],[4.58913,49.036016],[4.602849,49.035603],[4.603643,49.035586],[4.605966,49.035549],[4.607114,49.03555],[4.608301,49.035556],[4.610341,49.035601],[4.611443,49.035644],[4.612546,49.035699],[4.614546,49.035831],[4.615704,49.035919],[4.616852,49.036025],[4.617409,49.036078],[4.617965,49.036135],[4.619352,49.03629],[4.620963,49.036503],[4.622695,49.036755],[4.624035,49.036972],[4.625399,49.037215],[4.627288,49.037584],[4.629107,49.037973],[4.629128,49.037978],[4.630568,49.038311],[4.632143,49.03871],[4.634581,49.039367],[4.636256,49.039882],[4.637938,49.040425],[4.638381,49.040576],[4.643605,49.042406],[4.649238,49.044412],[4.650524,49.044851],[4.651711,49.045224],[4.653094,49.045624],[4.654702,49.046038],[4.656607,49.046474],[4.658464,49.046847],[4.660369,49.047219],[4.662089,49.047557],[4.663345,49.047829],[4.664654,49.048119],[4.666113,49.048474],[4.667351,49.048794],[4.66873,49.049163],[4.671398,49.049965],[4.673126,49.05052],[4.674155,49.050876],[4.675856,49.051487],[4.677548,49.052142],[4.683662,49.054581],[4.685062,49.055124],[4.686116,49.055504],[4.687477,49.055964],[4.688307,49.056229],[4.688886,49.056397],[4.690297,49.056786],[4.69096,49.056958],[4.69193,49.057189],[4.693255,49.057494],[4.704461,49.059891],[4.718898,49.062987],[4.720479,49.063353],[4.721762,49.063681],[4.723012,49.064038],[4.725048,49.064675],[4.729304,49.066134],[4.730844,49.066644],[4.732105,49.067043],[4.733302,49.067387],[4.734465,49.067696],[4.735448,49.067937],[4.736531,49.06819],[4.737559,49.068403],[4.738566,49.068595],[4.73993,49.068835],[4.740754,49.06896],[4.741641,49.069085],[4.742343,49.069172],[4.743546,49.069307],[4.744784,49.069426],[4.745929,49.06951],[4.746706,49.069555],[4.74671,49.069555],[4.747312,49.06959],[4.747785,49.069608],[4.748001,49.069616],[4.749017,49.069643],[4.750259,49.069655],[4.751207,49.069652],[4.752076,49.069628],[4.752958,49.069596],[4.754003,49.069551],[4.758165,49.06936],[4.759232,49.069326],[4.760317,49.069309],[4.761235,49.0693],[4.762807,49.069319],[4.764305,49.069357],[4.765689,49.069418],[4.766837,49.06949],[4.768214,49.069589],[4.769947,49.069756],[4.771467,49.069933],[4.772822,49.07011],[4.774255,49.070331],[4.777513,49.070894],[4.777701,49.070926],[4.78247,49.071779],[4.783062,49.071879],[4.792323,49.073529],[4.796824,49.07433],[4.797024,49.074365],[4.804015,49.0756],[4.805219,49.075795],[4.806451,49.075985],[4.807719,49.076149],[4.808998,49.0763],[4.809861,49.076389],[4.811763,49.076556],[4.821807,49.077428],[4.82303,49.077515],[4.824063,49.077569],[4.825107,49.077582],[4.825923,49.077566],[4.826847,49.077517],[4.828031,49.077415],[4.828699,49.07734],[4.829425,49.07723],[4.830025,49.077126],[4.830482,49.077043],[4.831077,49.076917],[4.831509,49.076819],[4.832366,49.07661],[4.834665,49.075958],[4.835807,49.075666],[4.836709,49.075475],[4.83763,49.075314],[4.838825,49.075153],[4.839635,49.07507],[4.84049,49.075008],[4.841335,49.07497],[4.841876,49.074957],[4.842885,49.074963],[4.850441,49.075047],[4.852054,49.07503],[4.852852,49.075011],[4.853696,49.074982],[4.854686,49.074932],[4.855771,49.074858],[4.856799,49.074772],[4.858092,49.074639],[4.859193,49.0745],[4.860064,49.074382],[4.861558,49.074162],[4.865401,49.073577],[4.867313,49.073328],[4.868595,49.073187],[4.870273,49.073048],[4.873115,49.072874],[4.874682,49.072771],[4.87937,49.072467],[4.884823,49.072123],[4.886799,49.071991],[4.887574,49.07194],[4.890167,49.071784],[4.891084,49.07176],[4.892005,49.071741],[4.892928,49.071747],[4.893846,49.071773],[4.8948,49.071817],[4.895766,49.071884],[4.897069,49.071997],[4.897793,49.072081],[4.898514,49.072176],[4.899229,49.072283],[4.899937,49.072396],[4.901053,49.072601],[4.901664,49.072735],[4.902177,49.072847],[4.904151,49.073325],[4.910727,49.074962],[4.91407,49.075782],[4.914388,49.075859],[4.915194,49.076038],[4.916018,49.076192],[4.916701,49.076289],[4.917407,49.076371],[4.918332,49.076425],[4.919252,49.076458],[4.920922,49.076481],[4.921636,49.076508],[4.921781,49.076514],[4.922577,49.07656],[4.923662,49.076668],[4.92473,49.076796],[4.927704,49.077167],[4.933125,49.077898],[4.939496,49.078758],[4.940395,49.078897],[4.941326,49.079056],[4.943449,49.079489],[4.946248,49.08016],[4.954715,49.082274],[4.960144,49.083643],[4.962475,49.084222],[4.966493,49.085231],[4.967901,49.085587],[4.969041,49.085921],[4.969804,49.086176],[4.970558,49.086453],[4.971319,49.086767],[4.972024,49.087086],[4.972963,49.087578],[4.973801,49.088063],[4.974763,49.088671],[4.975812,49.089376],[4.97642,49.089755],[4.976941,49.090057],[4.977389,49.0903],[4.97797,49.090581],[4.978414,49.090788],[4.979108,49.091074],[4.979966,49.091396],[4.980319,49.091513],[4.980749,49.091646],[4.981418,49.091831],[4.982093,49.091997],[4.982738,49.092133],[4.983188,49.092221],[4.983884,49.092337],[4.984704,49.092452],[4.985517,49.092529],[4.986367,49.092582],[4.987053,49.092604],[4.987766,49.092605],[4.98852,49.092589],[4.989479,49.092531],[4.990956,49.092398],[4.993433,49.092148],[4.996479,49.091847],[4.999084,49.091582],[5.001615,49.091325],[5.004321,49.091058],[5.005161,49.091009],[5.005914,49.090982],[5.00666,49.09099],[5.007548,49.091036],[5.008466,49.091117],[5.00929,49.091231],[5.00991,49.091332],[5.010802,49.091529],[5.011631,49.091746],[5.01247,49.092007],[5.013035,49.092211],[5.013481,49.092389],[5.013905,49.092571],[5.014562,49.092882],[5.015221,49.093236],[5.015787,49.09357],[5.016335,49.093932],[5.017052,49.094484],[5.018352,49.095548],[5.019028,49.096096],[5.019605,49.096529],[5.019959,49.096792],[5.020396,49.097069],[5.020851,49.097331],[5.021485,49.097675],[5.022326,49.098063],[5.022922,49.098302],[5.023513,49.09851],[5.024188,49.098723],[5.024899,49.09891],[5.025415,49.099027],[5.026144,49.099173],[5.026946,49.099297],[5.027662,49.099385],[5.028534,49.099448],[5.0291,49.099475],[5.029783,49.099487],[5.030739,49.099459],[5.031698,49.099388],[5.03251,49.099289],[5.033345,49.099157],[5.034173,49.098981],[5.035339,49.098692],[5.043804,49.096428],[5.047467,49.095468],[5.048216,49.095301],[5.048925,49.095162],[5.049781,49.095004],[5.050677,49.094866],[5.051625,49.094738],[5.05248,49.094652],[5.05337,49.094584],[5.054231,49.094532],[5.05545,49.094501],[5.056587,49.094498],[5.057447,49.094526],[5.0585,49.094584],[5.059256,49.094649],[5.060138,49.09474],[5.060925,49.094834],[5.06212,49.095014],[5.063204,49.095201],[5.070045,49.096452],[5.070836,49.096583],[5.071511,49.096683],[5.072367,49.096782],[5.073067,49.096844],[5.073706,49.096886],[5.074345,49.096914],[5.075371,49.096931],[5.076319,49.096909],[5.077164,49.096868],[5.077945,49.096808],[5.078864,49.096706],[5.079603,49.096604],[5.080149,49.096518],[5.08112,49.096332],[5.082174,49.096092],[5.082751,49.09594],[5.083358,49.095758],[5.083996,49.09555],[5.085173,49.095136],[5.089485,49.093497],[5.090478,49.093151],[5.09138,49.092865],[5.092242,49.092622],[5.093123,49.092406],[5.093814,49.092248],[5.094564,49.092099],[5.095186,49.091992],[5.095902,49.091886],[5.0968,49.091778],[5.097848,49.091675],[5.098589,49.09163],[5.099361,49.09159],[5.100549,49.091563],[5.10181,49.091546],[5.104215,49.091508],[5.105209,49.091494],[5.108391,49.091442],[5.109002,49.091436],[5.114793,49.091357],[5.115508,49.091359],[5.116662,49.091397],[5.117377,49.091442],[5.118371,49.091535],[5.11936,49.091663],[5.123758,49.092304],[5.124642,49.092419],[5.125542,49.092523],[5.126328,49.092579],[5.127208,49.092622],[5.128043,49.092631],[5.128763,49.092629],[5.129597,49.092599],[5.130504,49.092546],[5.137857,49.091956],[5.143927,49.091462],[5.146833,49.091228],[5.14757,49.091145],[5.148299,49.091049],[5.149035,49.090937],[5.149891,49.090784],[5.150751,49.090604],[5.151713,49.090368],[5.152838,49.090053],[5.159544,49.087936],[5.160154,49.087767],[5.160795,49.087606],[5.161638,49.087436],[5.162408,49.087309],[5.16313,49.087219],[5.163852,49.087152],[5.164551,49.087118],[5.165197,49.087101],[5.165746,49.087108],[5.166452,49.087132],[5.167333,49.087201],[5.167985,49.087272],[5.168672,49.087376],[5.169219,49.087474],[5.170188,49.087678],[5.173073,49.088369],[5.173895,49.088551],[5.17477,49.08871],[5.175589,49.088821],[5.176367,49.088899],[5.177099,49.088941],[5.177784,49.088953],[5.17845,49.088949],[5.179952,49.088879],[5.184981,49.088593],[5.186423,49.088546],[5.187177,49.088537],[5.188168,49.088558],[5.188532,49.08857],[5.189603,49.088626],[5.190799,49.088711],[5.192315,49.088878],[5.193499,49.089042],[5.201895,49.090379],[5.203431,49.090579],[5.204967,49.090742],[5.206665,49.090893],[5.20698,49.090916],[5.208326,49.09098],[5.209752,49.091023],[5.211767,49.091045],[5.215624,49.091031],[5.216481,49.091041],[5.21767,49.091086],[5.218568,49.091153],[5.219746,49.091248],[5.224405,49.091672],[5.22561,49.091768],[5.226288,49.091801],[5.227218,49.091804],[5.227959,49.091788],[5.228864,49.091721],[5.229695,49.091629],[5.230767,49.091468],[5.237469,49.090376],[5.23813,49.09029],[5.238782,49.090227],[5.239369,49.090191],[5.239981,49.090163],[5.240709,49.090161],[5.241327,49.09018],[5.241899,49.09021],[5.242653,49.090275],[5.24323,49.090348],[5.243826,49.090435],[5.244688,49.090597],[5.245529,49.090798],[5.247597,49.091379],[5.249497,49.091929],[5.250307,49.092148],[5.250941,49.092298],[5.252008,49.092507],[5.25281,49.092624],[5.253692,49.092728],[5.254433,49.092802],[5.257096,49.093039],[5.258333,49.093178],[5.258981,49.093267],[5.260038,49.093439],[5.261286,49.093681],[5.265154,49.09456],[5.266078,49.094757],[5.267479,49.095039],[5.268306,49.095194],[5.269516,49.095394],[5.271332,49.095651],[5.272869,49.095833],[5.273358,49.095884],[5.27771,49.096333],[5.277929,49.096356],[5.281372,49.096712],[5.285239,49.0971],[5.288012,49.097387],[5.288663,49.097452],[5.292608,49.097847],[5.293545,49.097923],[5.294176,49.097967],[5.294947,49.098014],[5.295988,49.098057],[5.29734,49.098099],[5.300068,49.098139],[5.300853,49.098165],[5.301575,49.098205],[5.30216,49.098248],[5.303006,49.098337],[5.303857,49.098452],[5.304972,49.098642],[5.305768,49.098813],[5.306551,49.098999],[5.307295,49.099197],[5.307599,49.099285],[5.308017,49.099417],[5.308811,49.099687],[5.309696,49.100022],[5.31211,49.101021],[5.312947,49.10134],[5.31362,49.101573],[5.314196,49.101747],[5.314721,49.101879],[5.315331,49.10202],[5.316276,49.102202],[5.317524,49.102382],[5.32033,49.102731],[5.32142,49.102892],[5.322369,49.103052],[5.323306,49.103223],[5.32421,49.103407],[5.325103,49.103615],[5.326036,49.10385],[5.326914,49.104088],[5.329211,49.104748],[5.330108,49.104987],[5.331494,49.105345],[5.332202,49.105518],[5.332461,49.105579],[5.333483,49.105803],[5.334608,49.106039],[5.336016,49.106314],[5.337427,49.106557],[5.343351,49.107519],[5.345186,49.107833],[5.346471,49.108075],[5.349264,49.108611],[5.349987,49.108744],[5.350453,49.10883],[5.351794,49.10904],[5.352764,49.109174],[5.354039,49.109326],[5.354239,49.109346],[5.35867,49.109752],[5.359562,49.109847],[5.360165,49.109919],[5.360849,49.110014],[5.361744,49.110153],[5.362556,49.110299],[5.363331,49.110452],[5.363977,49.110595],[5.364957,49.110837],[5.365776,49.111056],[5.366463,49.111258],[5.36701,49.11143],[5.367734,49.111673],[5.368515,49.111954],[5.369279,49.112248],[5.370204,49.112638],[5.370949,49.112976],[5.372074,49.113529],[5.377022,49.116085],[5.377533,49.11633],[5.378069,49.116572],[5.378647,49.116813],[5.379247,49.117041],[5.379836,49.11725],[5.380664,49.117515],[5.381257,49.117694],[5.38214,49.117938],[5.382729,49.118087],[5.383562,49.118281],[5.384241,49.118423],[5.384795,49.118534],[5.385856,49.118718],[5.386319,49.118789],[5.38652,49.118818],[5.386999,49.118881],[5.387732,49.118969],[5.388262,49.119025],[5.388968,49.119077],[5.389612,49.11911],[5.390237,49.119127],[5.390909,49.119128],[5.391324,49.119114],[5.391809,49.119092],[5.392326,49.119051],[5.392552,49.119032],[5.39306,49.118973],[5.393686,49.118889],[5.394427,49.118754],[5.394983,49.118636],[5.395665,49.118466],[5.396244,49.118305],[5.396863,49.118102],[5.397428,49.117897],[5.398041,49.117646],[5.398577,49.117401],[5.399082,49.117145],[5.399302,49.117029],[5.399749,49.116774],[5.400267,49.116446],[5.400797,49.116075],[5.401489,49.115521],[5.402588,49.114592],[5.402968,49.114277],[5.403511,49.113856],[5.403842,49.113621],[5.404367,49.113281],[5.404688,49.113083],[5.405402,49.112682],[5.405842,49.112457],[5.406297,49.112238],[5.406697,49.112058],[5.40728,49.111817],[5.407932,49.111578],[5.408522,49.111377],[5.411088,49.110486],[5.411684,49.110276],[5.411864,49.110212],[5.412112,49.110125],[5.413578,49.109613],[5.414107,49.10943],[5.414732,49.109214],[5.417379,49.108305],[5.418373,49.107994],[5.419273,49.107765],[5.42019,49.107576],[5.421228,49.10742],[5.422322,49.10731],[5.423481,49.107261],[5.424591,49.107267],[5.425843,49.107361],[5.426703,49.107463],[5.427555,49.107598],[5.428398,49.10778],[5.429221,49.107989],[5.430009,49.108225],[5.430793,49.108501],[5.431889,49.108934],[5.432676,49.109283],[5.434152,49.110023],[5.435478,49.110759],[5.437839,49.112125],[5.439026,49.1128],[5.440252,49.113459],[5.440999,49.113832],[5.441879,49.11424],[5.442686,49.114581],[5.44338,49.114844],[5.444199,49.115109],[5.444724,49.115261],[5.445438,49.115446],[5.446213,49.115619],[5.446837,49.115736],[5.447451,49.11583],[5.448499,49.115955],[5.450805,49.116174],[5.452769,49.116357],[5.45374,49.116464],[5.454702,49.116605],[5.455608,49.116763],[5.456485,49.116974],[5.457312,49.117214],[5.458121,49.117484],[5.458769,49.117746],[5.459249,49.117963],[5.459833,49.118227],[5.46085,49.11872],[5.461877,49.119177],[5.462648,49.119467],[5.463394,49.119709],[5.464314,49.119964],[5.46521,49.120157],[5.46623,49.120329],[5.467298,49.120451],[5.468377,49.120513],[5.469456,49.120523],[5.470536,49.120478],[5.471617,49.120387],[5.473605,49.120166],[5.474496,49.120086],[5.475397,49.120044],[5.476297,49.120039],[5.477197,49.120079],[5.478287,49.120177],[5.479362,49.12033],[5.479989,49.12045],[5.480615,49.120583],[5.48207,49.120928],[5.483238,49.12119],[5.484286,49.121375],[5.485084,49.121479],[5.485862,49.121548],[5.48661,49.121584],[5.487352,49.121594],[5.488311,49.121572],[5.489065,49.121521],[5.490151,49.121397],[5.490829,49.121292],[5.491781,49.121105],[5.494944,49.120375],[5.496379,49.120053],[5.49768,49.119792],[5.498582,49.119637],[5.499538,49.11949],[5.500791,49.119335],[5.502296,49.119202],[5.502993,49.119161],[5.503783,49.119127],[5.505614,49.119096],[5.509698,49.119144],[5.509875,49.119146],[5.512662,49.119179],[5.513946,49.119191],[5.515731,49.119175],[5.517691,49.119128],[5.520546,49.118979],[5.521859,49.118886],[5.523177,49.118778],[5.52677,49.118481],[5.52766,49.118426],[5.528909,49.118375],[5.529843,49.118365],[5.530781,49.118365],[5.531922,49.118403],[5.533068,49.118459],[5.538653,49.118867],[5.53979,49.118931],[5.540927,49.118941],[5.541911,49.118902],[5.542655,49.118839],[5.543404,49.118752],[5.544141,49.118639],[5.544975,49.118468],[5.545718,49.118288],[5.546664,49.118005],[5.547508,49.117716],[5.548388,49.117378],[5.549261,49.116994],[5.550708,49.116309],[5.551186,49.116069],[5.554156,49.114549],[5.557676,49.11274],[5.55855,49.112307],[5.558921,49.11213],[5.55974,49.111792],[5.560353,49.111566],[5.561148,49.111316],[5.56182,49.111138],[5.562359,49.111012],[5.562887,49.110905],[5.563307,49.110829],[5.564186,49.110701],[5.564895,49.11063],[5.56561,49.110574],[5.566436,49.110547],[5.567151,49.110551],[5.56792,49.110575],[5.56885,49.110649],[5.56933,49.110705],[5.570007,49.110801],[5.570864,49.110961],[5.571686,49.111154],[5.572405,49.111352],[5.573216,49.11161],[5.573794,49.111821],[5.57447,49.112106],[5.574895,49.112302],[5.575777,49.11276],[5.576231,49.11303],[5.576661,49.113306],[5.577207,49.113681],[5.578157,49.114391],[5.579101,49.115142],[5.580927,49.11652],[5.581634,49.117035],[5.581991,49.117279],[5.582693,49.117737],[5.583443,49.118183],[5.584296,49.118665],[5.584895,49.118973],[5.585374,49.119215],[5.586287,49.119634],[5.586964,49.119927],[5.587651,49.1202],[5.588289,49.120442],[5.588736,49.120601],[5.588877,49.120651],[5.589893,49.120984],[5.590418,49.121143],[5.59199,49.121566],[5.592898,49.121778],[5.593786,49.121963],[5.594951,49.122186],[5.597529,49.122654],[5.598318,49.122812],[5.599716,49.12312],[5.600941,49.123413],[5.602361,49.123798],[5.604364,49.124384],[5.605334,49.124647],[5.606081,49.124835],[5.606907,49.125035],[5.60808,49.125293],[5.609005,49.12548],[5.610865,49.125832],[5.612028,49.126024],[5.612923,49.126154],[5.614072,49.126306],[5.615202,49.126434],[5.61597,49.126511],[5.616919,49.126598],[5.618222,49.126692],[5.618459,49.126709],[5.618959,49.12674],[5.619211,49.126754],[5.620347,49.1268],[5.621213,49.126823],[5.622585,49.126843],[5.62359,49.126844],[5.624217,49.126836],[5.626854,49.126818],[5.627325,49.126813],[5.629628,49.126787],[5.630465,49.126788],[5.631544,49.126809],[5.632676,49.126841],[5.634234,49.126923],[5.635299,49.126995],[5.636441,49.127092],[5.640729,49.127519],[5.642415,49.127659],[5.644001,49.127766],[5.645718,49.127853],[5.648175,49.127933],[5.65237,49.128034],[5.653646,49.128092],[5.654922,49.128163],[5.655833,49.128231],[5.657191,49.128358],[5.658265,49.128483],[5.658965,49.128569],[5.659094,49.128586],[5.660192,49.128739],[5.660882,49.128838],[5.662244,49.129062],[5.663172,49.12923],[5.66436,49.129464],[5.665697,49.129756],[5.667044,49.130076],[5.668023,49.130332],[5.669491,49.130745],[5.671271,49.131295],[5.676269,49.133006],[5.681167,49.134677],[5.682881,49.135235],[5.684525,49.13572],[5.686228,49.136195],[5.692129,49.137841],[5.694511,49.138588],[5.696869,49.139389],[5.697734,49.139692],[5.699214,49.140226],[5.70003,49.140537],[5.70147,49.141117],[5.702932,49.141724],[5.704542,49.142427],[5.708492,49.144224],[5.711396,49.14554],[5.713685,49.146519],[5.716388,49.147607],[5.722259,49.149884],[5.72331,49.150287],[5.725959,49.151372],[5.726885,49.151776],[5.72867,49.152589],[5.728775,49.152637],[5.731226,49.153835],[5.7327,49.154602],[5.733959,49.155292],[5.734499,49.155597],[5.736156,49.156549],[5.738516,49.15801],[5.740708,49.159472],[5.741671,49.16016],[5.746865,49.164051],[5.747634,49.164635],[5.750206,49.166558],[5.751606,49.167608],[5.752397,49.168178],[5.752937,49.168557],[5.755266,49.170049],[5.756077,49.170532],[5.757187,49.171165],[5.757884,49.171546],[5.758777,49.17201],[5.759565,49.172407],[5.760613,49.172911],[5.761844,49.173469],[5.76264,49.173814],[5.763479,49.174165],[5.764745,49.174666],[5.76604,49.175151],[5.767363,49.175612],[5.768586,49.176013],[5.769883,49.17641],[5.77086,49.176693],[5.772143,49.177042],[5.773592,49.177405],[5.774791,49.177685],[5.784242,49.179794],[5.785491,49.180098],[5.786685,49.180411],[5.787763,49.180709],[5.789551,49.181216],[5.798473,49.183764],[5.799745,49.184113],[5.800469,49.184302],[5.800569,49.184328],[5.801435,49.184544],[5.802197,49.184722],[5.803113,49.184926],[5.804221,49.18516],[5.805529,49.185411],[5.80617,49.185528],[5.807356,49.185726],[5.808577,49.185909],[5.809505,49.186037],[5.810455,49.186157],[5.811522,49.186278],[5.816505,49.186764],[5.817444,49.186871],[5.818573,49.18701],[5.819789,49.187181],[5.820962,49.187366],[5.821784,49.187506],[5.822677,49.187666],[5.825575,49.188237],[5.82679,49.188469],[5.827818,49.188659],[5.828821,49.188821],[5.829856,49.188977],[5.831025,49.189129],[5.831943,49.189228],[5.832807,49.189317],[5.833684,49.189389],[5.834574,49.189449],[5.835361,49.189494],[5.837842,49.189605],[5.838576,49.189644],[5.839432,49.189701],[5.840292,49.189773],[5.841015,49.189839],[5.841865,49.189922],[5.842702,49.190023],[5.842785,49.190035],[5.843539,49.190138],[5.844111,49.190223],[5.844836,49.190341],[5.845653,49.190477],[5.846928,49.190719],[5.847576,49.190852],[5.848353,49.191021],[5.848819,49.191129],[5.853125,49.192213],[5.853368,49.192274],[5.853797,49.192382],[5.858327,49.19352],[5.8627,49.194628],[5.863732,49.194883],[5.864835,49.195132],[5.86594,49.195377],[5.866996,49.195584],[5.868134,49.195793],[5.869293,49.195985],[5.87067,49.196197],[5.872569,49.196451],[5.874141,49.19662],[5.875922,49.196783],[5.876943,49.196853],[5.878417,49.196937],[5.879386,49.196977],[5.880719,49.19702],[5.884353,49.19708],[5.885126,49.197103],[5.886623,49.197178],[5.887409,49.197235],[5.888655,49.197344],[5.890111,49.197496],[5.893454,49.197858],[5.898151,49.19837],[5.899514,49.198517],[5.900284,49.198587],[5.901021,49.198641],[5.901773,49.198685],[5.902537,49.198723],[5.903254,49.198752],[5.904005,49.198767],[5.904594,49.198769],[5.905218,49.198769],[5.906155,49.19875],[5.90698,49.198718],[5.907935,49.198664],[5.909034,49.198589],[5.911819,49.198372],[5.912511,49.198317],[5.913179,49.198271],[5.913905,49.198246],[5.914544,49.198236],[5.915385,49.198245],[5.916033,49.198266],[5.917015,49.198319],[5.918994,49.198453],[5.920177,49.198529],[5.924016,49.198825],[5.925304,49.198903],[5.927507,49.199035],[5.928357,49.199086],[5.930121,49.19921],[5.932087,49.199344],[5.933981,49.199476],[5.935133,49.199572],[5.93582,49.199652],[5.936409,49.199745],[5.937146,49.199904],[5.937659,49.200043],[5.938236,49.200225],[5.93889,49.200468],[5.939351,49.200665],[5.939889,49.20092],[5.942868,49.202374],[5.943691,49.202757],[5.944135,49.202942],[5.944645,49.203124],[5.945198,49.203308],[5.945963,49.203525],[5.946476,49.203651],[5.947055,49.203773],[5.947707,49.203881],[5.948428,49.203974],[5.949109,49.204035],[5.949601,49.204065],[5.950249,49.204082],[5.951171,49.204077],[5.954912,49.203963],[5.956566,49.203894],[5.957322,49.203847],[5.958082,49.203788],[5.958972,49.203693],[5.959862,49.203575],[5.96065,49.203452],[5.961432,49.203311],[5.962321,49.203123],[5.96324,49.202907],[5.964431,49.202569],[5.96529,49.202304],[5.966119,49.202024],[5.972171,49.199912],[5.973142,49.199588],[5.973754,49.1994],[5.974631,49.199177],[5.975535,49.198982],[5.976408,49.198815],[5.977195,49.1987],[5.977331,49.19868],[5.980253,49.198314],[5.981502,49.198098],[5.982117,49.197964],[5.982771,49.197797],[5.983162,49.197692],[5.983332,49.197647],[5.984118,49.197396],[5.984721,49.197186],[5.985255,49.19698],[5.986507,49.196445],[5.987623,49.195835],[5.988337,49.195377],[5.989222,49.194727],[5.989953,49.194132],[5.990393,49.193704],[5.991965,49.192146],[5.992829,49.191334],[5.993871,49.190437],[5.994639,49.189839],[5.995205,49.189419],[5.99555,49.189166],[5.996365,49.188618],[5.997164,49.188111],[5.998026,49.187603],[5.998875,49.187126],[5.999808,49.186635],[6.000312,49.186381],[6.000869,49.186115],[6.001673,49.18575],[6.002528,49.185383],[6.003429,49.185016],[6.0046,49.184584],[6.005686,49.18421],[6.006841,49.18385],[6.007765,49.183581],[6.008926,49.183273],[6.009869,49.183048],[6.010508,49.182906],[6.011152,49.182774],[6.012098,49.182588],[6.012808,49.182464],[6.0138,49.182309],[6.014592,49.182199],[6.015461,49.182088],[6.016338,49.181996],[6.017097,49.181926],[6.017793,49.181871],[6.018545,49.181821],[6.019175,49.181793],[6.019864,49.181761],[6.027445,49.181519],[6.028773,49.181455],[6.029544,49.181396],[6.030176,49.181339],[6.030978,49.181253],[6.031604,49.181177],[6.032422,49.181058],[6.032999,49.180962],[6.033678,49.180841],[6.034358,49.180706],[6.038784,49.179777],[6.040148,49.179493],[6.041004,49.17934],[6.041866,49.179212],[6.042729,49.179128],[6.04347,49.179089],[6.044417,49.179077],[6.045143,49.17909],[6.046024,49.179148],[6.046683,49.179206],[6.047082,49.179249],[6.0567,49.180239],[6.058365,49.1804],[6.05996,49.180567],[6.061016,49.180716],[6.061783,49.180862],[6.062705,49.181082],[6.063363,49.181271],[6.063959,49.18146],[6.0655,49.18198],[6.069408,49.183302],[6.070152,49.183489],[6.070743,49.183616],[6.071368,49.183725],[6.072011,49.183796],[6.072665,49.183845],[6.075793,49.183993],[6.076469,49.184046],[6.077116,49.184111],[6.077944,49.184247],[6.078772,49.184434],[6.079693,49.184711],[6.080513,49.185041],[6.081097,49.185311],[6.081639,49.185624],[6.082248,49.186039],[6.082779,49.186473],[6.083419,49.187137],[6.084769,49.188979],[6.085167,49.189447],[6.085662,49.189934],[6.086116,49.190294],[6.086636,49.190654],[6.087207,49.190985],[6.087679,49.191219],[6.088173,49.191443],[6.090538,49.19243],[6.09137,49.192825],[6.092095,49.193206],[6.092615,49.193546],[6.093067,49.193881],[6.093377,49.194167],[6.094951,49.195806],[6.095513,49.196293],[6.096161,49.196741],[6.096881,49.197146],[6.097627,49.197483],[6.098113,49.197666],[6.098567,49.197817],[6.100072,49.198279],[6.100851,49.198563],[6.101417,49.198811],[6.102023,49.199125],[6.102651,49.19951],[6.104211,49.200592],[6.104744,49.200899],[6.105254,49.201156],[6.105792,49.201391],[6.106335,49.201591],[6.106905,49.201782],[6.10864,49.202281],[6.109275,49.202498],[6.110144,49.202847],[6.111924,49.203676],[6.112388,49.203871],[6.112997,49.204083],[6.113368,49.204196],[6.113685,49.204292],[6.114309,49.204443],[6.114969,49.204581],[6.117561,49.205081],[6.118838,49.205346],[6.120717,49.205789],[6.123877,49.206603],[6.124304,49.206702],[6.125057,49.20686],[6.125529,49.206947],[6.126082,49.207031],[6.126913,49.20711],[6.127577,49.207152],[6.128241,49.207174],[6.128839,49.20717],[6.129412,49.207144],[6.129955,49.207106],[6.130497,49.207055],[6.131094,49.206975],[6.131704,49.206878],[6.132344,49.206747],[6.132901,49.206614],[6.133396,49.206477],[6.133974,49.206292],[6.13429,49.206184],[6.134606,49.206068],[6.134912,49.20595],[6.135254,49.205806],[6.135702,49.205599],[6.13627,49.205307],[6.136681,49.205071],[6.137309,49.204667],[6.137677,49.204407],[6.138279,49.20393],[6.13878,49.203453],[6.139847,49.202435],[6.14132,49.201033],[6.142412,49.200013],[6.143209,49.19934],[6.143747,49.198944],[6.144415,49.198502],[6.145193,49.198055],[6.145923,49.197676],[6.14638,49.197463],[6.147056,49.197175],[6.147753,49.196917],[6.148648,49.196642],[6.149179,49.196496],[6.149744,49.196357],[6.150056,49.196288],[6.15033,49.196228],[6.15128,49.196053],[6.151992,49.19595],[6.152423,49.195899],[6.152849,49.195854],[6.153678,49.195799],[6.154844,49.19577],[6.155918,49.195798],[6.156725,49.195852],[6.157491,49.19593],[6.158127,49.196012],[6.158777,49.196116],[6.15962,49.196277],[6.160614,49.196516],[6.161558,49.196791],[6.162258,49.197021],[6.166906,49.198649],[6.169265,49.199482],[6.170618,49.199944],[6.171977,49.200359],[6.172645,49.200528],[6.173354,49.200686],[6.174029,49.200815],[6.174786,49.200928],[6.175806,49.201053],[6.176329,49.201106],[6.176999,49.201149],[6.177659,49.201171],[6.178568,49.201179],[6.179561,49.201155],[6.180839,49.201092],[6.185811,49.200835],[6.18907,49.200654],[6.191765,49.200486],[6.191966,49.200471],[6.192628,49.200417],[6.194447,49.200241],[6.198317,49.199628],[6.201058,49.199157],[6.202804,49.198836],[6.205181,49.198351],[6.206179,49.198087],[6.208428,49.197423],[6.210303,49.196773],[6.211617,49.196245],[6.212857,49.195705],[6.213498,49.195392],[6.214074,49.195097],[6.215174,49.194519],[6.216325,49.193894],[6.218495,49.192606],[6.221383,49.190803],[6.222374,49.190196],[6.223393,49.189616],[6.224474,49.189022],[6.225373,49.188563],[6.226098,49.188223],[6.226813,49.187903],[6.227912,49.187461],[6.2291,49.187027],[6.229954,49.186747],[6.230731,49.186517],[6.23173,49.186232],[6.233241,49.18585],[6.235014,49.185413],[6.235553,49.185288],[6.235719,49.18525],[6.236932,49.184964],[6.238111,49.184647],[6.239196,49.184316],[6.239942,49.184063],[6.240683,49.183774],[6.24205,49.183182],[6.242921,49.182737],[6.243947,49.182151],[6.244691,49.18167],[6.24536,49.181194],[6.245779,49.180867],[6.246403,49.18035],[6.247038,49.17977],[6.247975,49.178738],[6.248542,49.178019],[6.249118,49.177111],[6.24957,49.17625],[6.249908,49.175447],[6.250142,49.174713],[6.25033,49.173813],[6.250472,49.172616],[6.250501,49.171229],[6.250494,49.169856],[6.250537,49.168361],[6.25064,49.167548],[6.250871,49.166517],[6.251239,49.165465],[6.251746,49.164132],[6.252314,49.162663],[6.252641,49.161616],[6.252905,49.160515],[6.25309,49.159416],[6.253133,49.158086],[6.25304,49.156785],[6.252901,49.15584],[6.25262,49.154751],[6.252237,49.153712],[6.252204,49.153629],[6.252086,49.153344],[6.251798,49.152644],[6.251434,49.15195],[6.250363,49.150147],[6.248422,49.147071],[6.247975,49.146347],[6.247576,49.145567],[6.247181,49.144662],[6.246777,49.143526],[6.246649,49.143054],[6.246505,49.142398],[6.246337,49.141339],[6.246294,49.140878],[6.246252,49.140023],[6.246266,49.139488],[6.24633,49.138809],[6.246458,49.137941],[6.246526,49.137553],[6.246636,49.137114],[6.246752,49.136801],[6.246877,49.136478],[6.247193,49.135751],[6.247825,49.134759],[6.248459,49.133978],[6.249218,49.133154],[6.25022,49.13219],[6.250492,49.131946],[6.250815,49.131669],[6.251765,49.130854],[6.252712,49.130093],[6.253209,49.129727],[6.253986,49.129239],[6.254647,49.128889],[6.255347,49.128589],[6.2559,49.128397],[6.256576,49.128224],[6.257733,49.128034],[6.258693,49.127999],[6.260074,49.12807],[6.262501,49.128328],[6.2637,49.128414],[6.2644,49.128422],[6.265132,49.128383],[6.266103,49.128246],[6.267216,49.128032],[6.267976,49.127834],[6.26931,49.127499],[6.269398,49.127476],[6.269937,49.127318],[6.27117,49.126977],[6.272176,49.126737],[6.272678,49.126642],[6.273217,49.126541],[6.274782,49.126314],[6.275588,49.126228],[6.276386,49.126157],[6.27735,49.126121],[6.278348,49.126112],[6.279752,49.126161],[6.282319,49.126412],[6.283793,49.126596],[6.284919,49.126729],[6.287069,49.126893],[6.289428,49.126928],[6.291543,49.126825],[6.294848,49.126625],[6.296546,49.126581],[6.298152,49.126593],[6.300095,49.126724],[6.301819,49.126881],[6.30303,49.127053],[6.303588,49.127139],[6.304144,49.127234],[6.304707,49.12734],[6.305261,49.127451],[6.30582,49.127571],[6.306378,49.127699],[6.308493,49.12827],[6.310545,49.128882],[6.31271,49.129504],[6.314953,49.13012],[6.318143,49.130924],[6.31846,49.130997],[6.318842,49.131084],[6.321496,49.131692],[6.323895,49.132196],[6.324078,49.132234],[6.329658,49.133243],[6.333371,49.133822],[6.337202,49.134321],[6.341033,49.134734],[6.34381,49.134974],[6.346662,49.135174],[6.349598,49.13532],[6.35193,49.135424],[6.354252,49.135479],[6.357702,49.135505],[6.361121,49.135465],[6.364346,49.135403],[6.366232,49.13543],[6.368135,49.135537],[6.370569,49.135806],[6.372764,49.136182],[6.374176,49.136493],[6.37558,49.136856],[6.378741,49.137698],[6.379043,49.137781],[6.380808,49.138265],[6.382608,49.138755],[6.383855,49.139079],[6.385133,49.13937],[6.386267,49.139573],[6.387413,49.139723],[6.388416,49.139815],[6.38926,49.139869],[6.389972,49.139883],[6.390555,49.139893],[6.391405,49.13987],[6.392151,49.139824],[6.393158,49.139741],[6.394151,49.13962],[6.395334,49.139424],[6.396509,49.139166],[6.397531,49.13889],[6.398693,49.13855],[6.399858,49.138183],[6.401184,49.137781],[6.402163,49.137516],[6.403178,49.13727],[6.404165,49.137092],[6.40524,49.136931],[6.406492,49.136805],[6.407662,49.136743],[6.40861,49.13674],[6.409637,49.136766],[6.410631,49.136834],[6.411629,49.136957],[6.412814,49.137132],[6.413856,49.137356],[6.414853,49.137599],[6.415897,49.137916],[6.417875,49.138636],[6.420352,49.139628],[6.422356,49.140341],[6.424299,49.140884],[6.42617,49.141292],[6.427381,49.141499],[6.428518,49.141652],[6.430305,49.141807],[6.431485,49.141865],[6.432645,49.141881],[6.43458,49.141825],[6.436633,49.141638],[6.43827,49.141411],[6.439849,49.141147],[6.443902,49.140451],[6.44504,49.140292],[6.445547,49.140232],[6.447421,49.140052],[6.44921,49.139967],[6.45078,49.139955],[6.451548,49.139962],[6.453869,49.140059],[6.456229,49.140178],[6.463213,49.140539],[6.464434,49.140599],[6.466308,49.140696],[6.467986,49.140779],[6.468524,49.140806],[6.472512,49.140992],[6.473598,49.14102],[6.475104,49.141004],[6.476228,49.140957],[6.477383,49.140889],[6.478369,49.140795],[6.48029,49.140545],[6.48094,49.140442],[6.481765,49.140293],[6.482966,49.14005],[6.484092,49.139769],[6.485546,49.139354],[6.486286,49.139115],[6.48695,49.138885],[6.489349,49.138037],[6.493105,49.136687],[6.495598,49.135812],[6.498036,49.135033],[6.499432,49.134625],[6.500851,49.134245],[6.502257,49.133893],[6.503553,49.133598],[6.503679,49.133569],[6.505666,49.13316],[6.506886,49.132934],[6.508575,49.13266],[6.509785,49.132477],[6.510822,49.132342],[6.512061,49.132204],[6.513953,49.132015],[6.515871,49.131877],[6.517861,49.131774],[6.521896,49.131719],[6.524062,49.131767],[6.524793,49.131799],[6.527485,49.131964],[6.529356,49.132144],[6.531321,49.132372],[6.532424,49.132524],[6.533413,49.132649],[6.536262,49.133084],[6.537509,49.133295],[6.539362,49.133586],[6.540441,49.133721],[6.541228,49.133781],[6.541773,49.133819],[6.543407,49.133839],[6.544417,49.1338],[6.544998,49.13376],[6.545941,49.133662],[6.546847,49.133539],[6.547772,49.133383],[6.548651,49.133231],[6.550057,49.132946],[6.551826,49.132604],[6.553479,49.132331],[6.554972,49.132122],[6.55638,49.132005],[6.558283,49.131925],[6.560091,49.131941],[6.561267,49.132],[6.563053,49.132157],[6.566663,49.132559],[6.56702,49.132602],[6.569747,49.132752],[6.572532,49.132774],[6.574418,49.132843],[6.576285,49.133022],[6.57849,49.133344],[6.589329,49.135647],[6.593886,49.136632],[6.596173,49.137044],[6.597817,49.137219],[6.599134,49.137287],[6.600948,49.137251],[6.602933,49.137071],[6.605188,49.13666],[6.606925,49.136163],[6.60834,49.135759],[6.609221,49.135508],[6.609829,49.135366],[6.61114,49.135093],[6.611952,49.134954],[6.613016,49.134825],[6.614015,49.134742],[6.614614,49.134708],[6.615437,49.134691],[6.616098,49.134696],[6.617071,49.134729],[6.617638,49.134766],[6.618183,49.134821],[6.619014,49.134926],[6.619703,49.135021],[6.620614,49.135198],[6.621604,49.135423],[6.622129,49.135557],[6.62316,49.135858],[6.625989,49.136764],[6.627934,49.137262],[6.629512,49.137578],[6.631038,49.137746],[6.632645,49.137827],[6.634714,49.13777],[6.635863,49.13767],[6.637131,49.137492],[6.639278,49.137083],[6.64339,49.136157],[6.646894,49.135417],[6.652174,49.13442],[6.653842,49.134124],[6.656402,49.133707],[6.658371,49.133408],[6.659781,49.133198],[6.662364,49.132849],[6.664342,49.132619],[6.665265,49.132508],[6.666643,49.132351],[6.668728,49.13212],[6.6705,49.131944],[6.67185,49.131826],[6.673517,49.131775],[6.675278,49.131833],[6.677528,49.132056],[6.67864,49.132216],[6.678647,49.132217],[6.679763,49.132437],[6.680907,49.13272],[6.681861,49.133],[6.684306,49.133833],[6.685755,49.134374],[6.686673,49.134699],[6.688002,49.135092],[6.688666,49.135252],[6.689338,49.135395],[6.690803,49.13562],[6.691326,49.13568],[6.691914,49.135743],[6.692761,49.13581],[6.693578,49.135839],[6.694568,49.135857],[6.695589,49.135864],[6.696888,49.135863],[6.697282,49.135859],[6.697631,49.135853],[6.700038,49.13583],[6.701634,49.135815],[6.702262,49.135818],[6.704338,49.135828],[6.704534,49.135829],[6.706715,49.135916],[6.712376,49.135973],[6.716587,49.135999],[6.718921,49.135999],[6.72049,49.136],[6.720845,49.135992],[6.721187,49.135976],[6.721416,49.135955],[6.721733,49.135926],[6.722247,49.135862],[6.722775,49.135778],[6.723108,49.135719],[6.723417,49.135655],[6.723856,49.135552],[6.724448,49.135396],[6.725056,49.135222],[6.726826,49.134695],[6.727564,49.134489],[6.727978,49.134387],[6.728394,49.134298],[6.728807,49.134216],[6.729252,49.13414],[6.729664,49.134083],[6.730124,49.134037],[6.730582,49.133998],[6.731063,49.133971],[6.731532,49.133957],[6.731947,49.133958],[6.7325,49.133977],[6.732939,49.134007],[6.733341,49.134043],[6.733739,49.134092],[6.734173,49.134151],[6.734544,49.134212],[6.735035,49.1343],[6.735693,49.134438],[6.736516,49.134625],[6.738376,49.135069],[6.743903,49.136411],[6.749441,49.137746],[6.750628,49.138045],[6.751714,49.138289],[6.753542,49.138668],[6.75518,49.138858],[6.756677,49.138936],[6.758876,49.138905],[6.759863,49.138851],[6.761099,49.138699],[6.762717,49.138426],[6.764444,49.138],[6.768886,49.13648],[6.773958,49.134669],[6.774554,49.134502],[6.77544,49.134274],[6.77665,49.134064],[6.777921,49.133947],[6.77912,49.133924],[6.780474,49.134005],[6.781817,49.134185],[6.783139,49.13442],[6.784038,49.134631],[6.785077,49.134878],[6.78735,49.135457],[6.791076,49.136488],[6.792393,49.136871],[6.793068,49.137034],[6.794497,49.137282],[6.798864,49.137706],[6.799131,49.13766],[6.80057,49.137752],[6.801454,49.137752],[6.802134,49.137743],[6.803313,49.137707],[6.804,49.137694],[6.804475,49.137695],[6.804972,49.137709],[6.805306,49.137732],[6.805722,49.137778],[6.806037,49.137822],[6.806407,49.137888],[6.807235,49.138093],[6.807763,49.138279],[6.807886,49.138299],[6.808575,49.138611],[6.80914,49.138916],[6.809656,49.139264],[6.810126,49.13962],[6.811164,49.140329],[6.81124,49.140416],[6.81192,49.140791],[6.813112,49.14135],[6.814307,49.141908],[6.814348,49.141927],[6.815738,49.142559],[6.817983,49.143464],[6.818368,49.143607],[6.819788,49.144077],[6.821205,49.14452],[6.82231,49.144888],[6.823599,49.1454],[6.825041,49.146099],[6.825889,49.146556],[6.827005,49.147159],[6.829919,49.148672],[6.831103,49.149205],[6.834273,49.150482],[6.836556,49.151345],[6.8389,49.152246],[6.840245,49.152744],[6.840265,49.152751],[6.841326,49.153113],[6.842457,49.153472],[6.84386,49.153851],[6.846369,49.154433],[6.847219,49.154628],[6.848316,49.154875],[6.849166,49.155122],[6.849644,49.155274],[6.850076,49.155439],[6.850538,49.155663],[6.851206,49.156016],[6.851758,49.156397],[6.852006,49.15659],[6.852289,49.156824],[6.852953,49.157531],[6.853459,49.158222],[6.853856,49.158838],[6.854338,49.159547],[6.854713,49.160022],[6.854926,49.16026],[6.854991,49.160337],[6.855453,49.160739],[6.855881,49.16107],[6.856404,49.161401],[6.856988,49.161723],[6.857815,49.162131],[6.858661,49.162524],[6.858968,49.16266],[6.859457,49.162878],[6.860178,49.163168],[6.860972,49.163476],[6.862365,49.163916],[6.863721,49.164217],[6.864645,49.164338],[6.865529,49.164398],[6.866201,49.164436],[6.866799,49.164466],[6.868175,49.164527],[6.869523,49.164591],[6.870298,49.164656],[6.871225,49.164781],[6.872037,49.164954],[6.872702,49.165133],[6.873446,49.165389],[6.874121,49.165693],[6.874624,49.165954],[6.875339,49.166383],[6.875974,49.166818],[6.879285,49.169141],[6.880806,49.17025],[6.883043,49.171796],[6.883433,49.17207],[6.884201,49.172592],[6.884649,49.172897],[6.885706,49.173545],[6.886311,49.173876],[6.886861,49.174155],[6.888014,49.17467],[6.888525,49.174877],[6.889725,49.175307],[6.89132,49.175764],[6.892086,49.175952],[6.893015,49.17614],[6.893801,49.176267],[6.894415,49.176358],[6.895028,49.176422],[6.895317,49.176454],[6.896352,49.176513],[6.896744,49.176534],[6.897464,49.176553],[6.898951,49.176559],[6.901764,49.176504],[6.903059,49.176501],[6.904298,49.176515],[6.905619,49.176537],[6.906274,49.176566],[6.90692,49.17661],[6.908153,49.17673],[6.909035,49.176844],[6.909888,49.176963],[6.911277,49.177219],[6.91245,49.177452],[6.91309,49.177606],[6.91371,49.177783],[6.914327,49.177985],[6.914618,49.1781],[6.915465,49.178468],[6.916019,49.178788],[6.916687,49.179268],[6.916994,49.17954],[6.917312,49.1799],[6.917583,49.180268],[6.917808,49.180667],[6.918,49.181145],[6.918113,49.181567],[6.918203,49.181995],[6.918285,49.18259],[6.9184,49.183413],[6.918575,49.184054],[6.918738,49.184493],[6.918916,49.184873],[6.919209,49.185388],[6.919556,49.185843],[6.919858,49.186176],[6.920218,49.18655],[6.920808,49.18705],[6.921444,49.187492],[6.922078,49.187859],[6.923046,49.188364],[6.925796,49.189721],[6.927908,49.190814],[6.929105,49.191541],[6.930102,49.192263],[6.931094,49.193165],[6.932109,49.194282],[6.933166,49.195473],[6.933969,49.196321],[6.934682,49.196963],[6.935403,49.19753],[6.935591,49.197667],[6.936092,49.198004],[6.936569,49.1983],[6.937115,49.198595],[6.937267,49.198671],[6.937625,49.19885],[6.938446,49.199222],[6.939356,49.199576],[6.94094,49.200063],[6.941673,49.200254],[6.942478,49.200467],[6.943713,49.200759],[6.945798,49.201256],[6.947379,49.201631],[6.948926,49.201996],[6.949612,49.202136],[6.949862,49.202191],[6.950263,49.202267],[6.951035,49.202396],[6.951742,49.20249],[6.952954,49.202628],[6.954121,49.202767],[6.954843,49.202857],[6.955321,49.202927],[6.955784,49.203008],[6.956271,49.203118],[6.95666,49.203212],[6.95717,49.203368],[6.957388,49.203434],[6.957791,49.203573],[6.958109,49.203692],[6.958361,49.203787],[6.958893,49.204014],[6.959229,49.204172],[6.959527,49.204315],[6.95988,49.204497],[6.960231,49.204685],[6.960471,49.204824],[6.96083,49.20503],[6.961217,49.205263],[6.961906,49.205673],[6.962669,49.206155],[6.962959,49.206334],[6.963219,49.206492],[6.963378,49.206595],[6.964063,49.207008],[6.964147,49.207061],[6.964284,49.20715],[6.964401,49.207225],[6.965241,49.207722],[6.965286,49.207748],[6.965401,49.207822],[6.965651,49.207964],[6.966095,49.208217],[6.966567,49.208476],[6.966821,49.208615],[6.967343,49.208878],[6.967704,49.20905],[6.968427,49.209383],[6.968699,49.209503],[6.968986,49.209619],[6.96958,49.209849],[6.969965,49.209992],[6.97031,49.210114],[6.970703,49.210245],[6.971254,49.210411],[6.971778,49.210549],[6.972187,49.210654],[6.972555,49.210735],[6.973117,49.210844],[6.973689,49.210943],[6.974325,49.211024],[6.974867,49.211083],[6.975462,49.211127],[6.975875,49.211151],[6.976262,49.211166],[6.976727,49.211172],[6.977316,49.211166],[6.97771,49.211151],[6.978169,49.211125],[6.978441,49.211108],[6.978869,49.211067],[6.979378,49.211011],[6.979992,49.210922],[6.980624,49.210817],[6.981208,49.210701],[6.981672,49.210599],[6.982533,49.210397],[6.983277,49.210208],[6.98468,49.209835],[6.985429,49.209642],[6.986078,49.209483],[6.986667,49.209343],[6.987149,49.209242],[6.987676,49.209141],[6.988335,49.209036],[6.988735,49.208979],[6.989299,49.208912],[6.989952,49.208862],[6.990261,49.208844],[6.990556,49.20883],[6.990908,49.208818],[6.991256,49.208815],[6.991657,49.208817],[6.992035,49.208827],[6.992407,49.208842],[6.992778,49.208864],[6.993331,49.208909],[6.993885,49.208969],[6.994369,49.209034],[6.994872,49.209112],[6.995355,49.2092],[6.995863,49.209306],[6.996279,49.209395],[6.996715,49.2095],[6.997598,49.209729],[6.998213,49.209896],[6.999408,49.210239],[7.000336,49.21051],[7.00125,49.210768],[7.001726,49.210899],[7.002278,49.211039],[7.002774,49.211154],[7.003145,49.211233],[7.003616,49.211333],[7.004166,49.211431],[7.004537,49.21149],[7.004928,49.211542],[7.005444,49.211601],[7.005908,49.21165],[7.006391,49.211684],[7.006913,49.211708],[7.007616,49.211726],[7.008131,49.211726],[7.008555,49.211713],[7.00907,49.21169],[7.009443,49.211666],[7.00981,49.211636],[7.010308,49.211586],[7.010765,49.211528],[7.011263,49.211461],[7.011814,49.211376],[7.012251,49.211293],[7.012491,49.211245],[7.012816,49.211174],[7.013102,49.211113],[7.013595,49.210997],[7.014026,49.210892],[7.014286,49.210822],[7.014723,49.2107],[7.015218,49.21056],[7.015858,49.210362],[7.016403,49.210186],[7.016758,49.210067],[7.017211,49.209916],[7.017557,49.209801],[7.018405,49.20951],[7.019551,49.209111],[7.020408,49.208831],[7.021353,49.20851],[7.022273,49.208214],[7.02271,49.208078],[7.022872,49.208027],[7.023466,49.207858],[7.023967,49.20772],[7.024546,49.207574],[7.025245,49.207417],[7.025706,49.207316],[7.026037,49.207256],[7.026917,49.207089],[7.027298,49.207024],[7.027829,49.206944],[7.028413,49.206866],[7.028904,49.206808],[7.029539,49.20675],[7.029849,49.20673],[7.030472,49.206687],[7.031128,49.206656],[7.031201,49.206648],[7.032052,49.206545],[7.032372,49.206514],[7.033187,49.206417],[7.033897,49.20633],[7.034535,49.206244],[7.035211,49.206148],[7.035929,49.206033],[7.036528,49.205925],[7.037031,49.205825],[7.037643,49.205702],[7.038354,49.205549],[7.038616,49.20549],[7.039671,49.205248],[7.040792,49.204995],[7.041772,49.204783],[7.042498,49.204637],[7.042904,49.204556],[7.043001,49.204539],[7.043527,49.204447],[7.04423,49.204336],[7.045091,49.204229],[7.0456,49.204179],[7.046069,49.204144],[7.046617,49.204109],[7.047023,49.204095],[7.047479,49.204086],[7.048355,49.204103],[7.049083,49.204134],[7.049687,49.204186],[7.050284,49.204242],[7.050658,49.204295],[7.050867,49.204324],[7.051311,49.204406],[7.05185,49.20451],[7.052348,49.204618],[7.052859,49.204746],[7.053734,49.204993],[7.054593,49.205295],[7.05505,49.205461],[7.056076,49.205856],[7.056679,49.206111],[7.057078,49.206289],[7.057474,49.20648],[7.058038,49.206791],[7.058596,49.207167],[7.059522,49.207856],[7.060085,49.20834],[7.060679,49.208962],[7.061898,49.210347],[7.062627,49.211193],[7.062832,49.21138],[7.063419,49.212083],[7.064038,49.212777],[7.064294,49.213046],[7.06456,49.213302],[7.065142,49.213801],[7.065812,49.214318],[7.066515,49.214794],[7.067376,49.215301],[7.068191,49.215793],[7.068744,49.216101],[7.070433,49.217024],[7.072263,49.218016],[7.073347,49.218668],[7.073857,49.218946],[7.074688,49.219443],[7.074975,49.219642],[7.07526,49.219842],[7.075895,49.220337],[7.076517,49.220858],[7.077066,49.22137],[7.077226,49.221534],[7.077605,49.221921],[7.077961,49.222329],[7.078316,49.222768],[7.07851,49.223009],[7.078655,49.223206],[7.078919,49.223595],[7.079167,49.223995],[7.079468,49.224532],[7.079686,49.224974],[7.079897,49.225475],[7.080056,49.225882],[7.080254,49.22651],[7.080385,49.22699],[7.080517,49.227662],[7.080614,49.228374],[7.080717,49.229281],[7.080801,49.230153],[7.080899,49.231501],[7.080944,49.232165],[7.080997,49.232766],[7.081122,49.23366],[7.081224,49.234314],[7.08135,49.234964],[7.081433,49.235281],[7.081533,49.235598],[7.081715,49.2361],[7.081942,49.2366],[7.082163,49.237025],[7.082362,49.237349],[7.082564,49.237655],[7.082793,49.237965],[7.08304,49.23828],[7.083269,49.238532],[7.083496,49.238768],[7.083837,49.239114],[7.084435,49.239644],[7.085049,49.240167],[7.085731,49.240748],[7.086357,49.241267],[7.086779,49.241657],[7.087173,49.242021],[7.087513,49.242406],[7.087943,49.242897],[7.088303,49.243392],[7.088627,49.243902],[7.088849,49.244294],[7.089048,49.244692],[7.089217,49.245072],[7.089488,49.245826],[7.09004,49.247573],[7.090283,49.248328],[7.090391,49.248642],[7.090525,49.249035],[7.090752,49.249631],[7.090996,49.250202],[7.091336,49.250889],[7.091871,49.251763],[7.091955,49.2519],[7.09227,49.252342],[7.092589,49.252749],[7.092845,49.253051],[7.093103,49.253343],[7.09345,49.253704],[7.0938,49.254044],[7.093987,49.254217],[7.094173,49.254389],[7.094578,49.254739],[7.095109,49.255165],[7.095649,49.255547],[7.096138,49.255888],[7.09639,49.256051],[7.096639,49.256202],[7.097242,49.256557],[7.097844,49.256891],[7.098574,49.257269],[7.099304,49.257619],[7.100811,49.258324],[7.101054,49.258437],[7.103886,49.259749],[7.104185,49.259892],[7.104513,49.260049],[7.105381,49.260476],[7.105894,49.260726],[7.106556,49.261068],[7.107224,49.261439],[7.108525,49.26221],[7.10931,49.26268],[7.109956,49.263065],[7.110289,49.263262],[7.110832,49.263577],[7.111331,49.263855],[7.111732,49.26407],[7.112092,49.264252],[7.112363,49.264389],[7.112676,49.264542],[7.113256,49.264795],[7.113787,49.265005],[7.114182,49.265149],[7.114611,49.265295],[7.115025,49.265425],[7.115597,49.265583],[7.116091,49.265707],[7.116496,49.265799],[7.116998,49.265895],[7.117604,49.266002],[7.118081,49.266065],[7.118719,49.266135],[7.119366,49.266184],[7.119727,49.266207],[7.120277,49.266221],[7.120921,49.266225],[7.121512,49.266212],[7.121972,49.266199],[7.122446,49.266173],[7.122939,49.266139],[7.125515,49.265933],[7.126113,49.265888],[7.126698,49.265858],[7.127445,49.265837],[7.127933,49.265832],[7.128447,49.265839],[7.128988,49.265857],[7.129517,49.265894],[7.130145,49.265952],[7.130415,49.265986],[7.130673,49.266018],[7.131119,49.266089],[7.131838,49.266219],[7.132369,49.266334],[7.132963,49.266476],[7.133273,49.266567],[7.13399,49.26678],[7.134557,49.266975],[7.135007,49.267142],[7.13546,49.267328],[7.135798,49.267469],[7.136347,49.267745],[7.136895,49.268028],[7.137546,49.268386],[7.138524,49.26897],[7.139128,49.269322],[7.139621,49.269611],[7.140146,49.269907],[7.140799,49.27027],[7.141612,49.270682],[7.142154,49.270935],[7.142807,49.271202],[7.143362,49.271412],[7.143905,49.271598],[7.144261,49.271711],[7.144985,49.271915],[7.145535,49.272061],[7.146079,49.272189],[7.146824,49.272338],[7.147722,49.27248],[7.148371,49.272565],[7.14929,49.272662],[7.150473,49.272735],[7.15137,49.272765],[7.152186,49.272784],[7.153034,49.272778],[7.153862,49.272764],[7.154821,49.272734],[7.156014,49.272689],[7.156429,49.272677],[7.158906,49.272567],[7.160688,49.272515],[7.161449,49.27251],[7.162408,49.272517],[7.16304,49.272536],[7.163706,49.272563],[7.164416,49.272603],[7.16508,49.272658],[7.165784,49.272728],[7.166493,49.272817],[7.167249,49.272936],[7.168078,49.273096],[7.168932,49.273309],[7.16959,49.273493],[7.170141,49.27367],[7.170716,49.273879],[7.171418,49.274164],[7.171924,49.274397],[7.172524,49.274707],[7.172879,49.274905],[7.173337,49.275165],[7.173896,49.275531],[7.17454,49.275985],[7.175005,49.276338],[7.175316,49.276586],[7.175946,49.277121],[7.176834,49.277946],[7.177048,49.278146],[7.177076,49.278174],[7.177503,49.278616],[7.177913,49.27904],[7.179118,49.280322],[7.180193,49.281454],[7.180508,49.281777],[7.18101,49.282282],[7.181569,49.282811],[7.182185,49.283357],[7.182411,49.283547],[7.182684,49.28378],[7.182987,49.284023],[7.183375,49.284327],[7.183816,49.284653],[7.184265,49.284958],[7.184611,49.285186],[7.184802,49.285304],[7.185542,49.285747],[7.186021,49.286016],[7.186488,49.286256],[7.187115,49.286566],[7.187884,49.286909],[7.18853,49.287183],[7.189173,49.287431],[7.189805,49.287657],[7.190445,49.287869],[7.19114,49.288091],[7.191925,49.288334],[7.193299,49.288712],[7.194644,49.289066],[7.197538,49.289807],[7.200128,49.290456],[7.201428,49.29078],[7.20274,49.291113],[7.204932,49.29167],[7.207835,49.2924],[7.211235,49.293259],[7.215482,49.294338],[7.219962,49.295472],[7.223102,49.296257],[7.226466,49.297104],[7.231993,49.298503],[7.232365,49.298597],[7.234965,49.299254],[7.236403,49.299615],[7.237915,49.300026],[7.238696,49.300243],[7.239391,49.300448],[7.239984,49.300632],[7.240758,49.300889],[7.241407,49.301116],[7.242064,49.301364],[7.242625,49.301584],[7.243247,49.301849],[7.243581,49.301997],[7.24397,49.302178],[7.244545,49.302447],[7.245263,49.30281],[7.245957,49.303187],[7.246684,49.303606],[7.247312,49.304002],[7.248103,49.304526],[7.248481,49.304795],[7.248892,49.305098],[7.249236,49.305357],[7.250064,49.306005],[7.251279,49.307025],[7.252206,49.307829],[7.253248,49.308723],[7.25423,49.309561],[7.254481,49.309787],[7.255843,49.310962],[7.257079,49.312031],[7.258035,49.312864],[7.258314,49.313094],[7.258643,49.313381],[7.259392,49.314025],[7.262633,49.316815],[7.263862,49.317875],[7.265613,49.319387],[7.2668,49.320404],[7.267026,49.320594],[7.26907,49.322318],[7.269842,49.322951],[7.271152,49.324012],[7.271916,49.324624],[7.272687,49.32522],[7.273792,49.326082],[7.27446,49.326583],[7.274682,49.326751],[7.275851,49.327607],[7.27677,49.328268],[7.277917,49.329063],[7.279135,49.329881],[7.280242,49.3306],[7.281258,49.331247],[7.282107,49.331773],[7.282843,49.332217],[7.283598,49.33267],[7.284161,49.332995],[7.284454,49.333168],[7.286706,49.334457],[7.288236,49.335292],[7.289676,49.33607],[7.289994,49.336237],[7.291321,49.336944],[7.292582,49.337601],[7.293058,49.337848],[7.294304,49.338495],[7.294599,49.338646],[7.296226,49.33948],[7.298557,49.340663],[7.300525,49.341667],[7.300915,49.341864],[7.301266,49.342039],[7.301951,49.342391],[7.302883,49.34287],[7.303019,49.342939],[7.304098,49.343494],[7.305061,49.343989],[7.306672,49.344806],[7.307873,49.345415],[7.310786,49.346902],[7.312846,49.347951],[7.314348,49.348723],[7.316354,49.349757],[7.317187,49.350179],[7.318636,49.350913],[7.320505,49.351861],[7.320808,49.352015],[7.322745,49.353002],[7.325086,49.354189],[7.327232,49.355277],[7.328164,49.355757],[7.328638,49.355995],[7.329141,49.356256],[7.330476,49.356932],[7.33193,49.35768],[7.332742,49.358099],[7.33658,49.360042],[7.33765,49.360586],[7.339639,49.361608],[7.339974,49.361781],[7.342262,49.362927],[7.343279,49.363451],[7.34434,49.363982],[7.345342,49.364486],[7.346384,49.364991],[7.347452,49.365503],[7.348312,49.365897],[7.349244,49.366317],[7.349625,49.366482],[7.350475,49.366844],[7.351306,49.367187],[7.35265,49.367713],[7.353645,49.368078],[7.354344,49.368316],[7.355017,49.368544],[7.355742,49.368783],[7.35645,49.369005],[7.357548,49.369332],[7.357904,49.369436],[7.358663,49.369645],[7.35942,49.369848],[7.360815,49.3702],[7.362277,49.370525],[7.363548,49.370782],[7.36485,49.371037],[7.36576,49.371191],[7.366768,49.371352],[7.368187,49.371556],[7.369201,49.371685],[7.370131,49.371791],[7.370904,49.371874],[7.371845,49.371961],[7.373095,49.372069],[7.374597,49.372179],[7.375476,49.37223],[7.377008,49.372318],[7.378585,49.372399],[7.379647,49.372449],[7.381729,49.372541],[7.382821,49.372595],[7.383253,49.372615],[7.385389,49.372722],[7.386857,49.372808],[7.388099,49.37289],[7.389305,49.372988],[7.390402,49.373088],[7.391736,49.373227],[7.392924,49.373359],[7.393989,49.373494],[7.395077,49.373645],[7.395856,49.373757],[7.396722,49.373889],[7.398045,49.374108],[7.399342,49.374341],[7.400537,49.374574],[7.401467,49.374763],[7.401944,49.374861],[7.403868,49.375295],[7.405509,49.375699],[7.407112,49.37612],[7.409105,49.376689],[7.410705,49.377186],[7.412201,49.377674],[7.414194,49.378361],[7.416533,49.379221],[7.417476,49.37959],[7.419306,49.380313],[7.421058,49.381034],[7.4225,49.381651],[7.423418,49.382046],[7.423424,49.382049],[7.424739,49.382616],[7.425441,49.382919],[7.426225,49.383263],[7.428862,49.384434],[7.430833,49.385317],[7.432362,49.385984],[7.434865,49.387102],[7.436889,49.388],[7.438802,49.388824],[7.440763,49.389673],[7.440813,49.389694],[7.441496,49.38998],[7.442499,49.390409],[7.443695,49.390913],[7.445398,49.391611],[7.447952,49.392627],[7.449776,49.393341],[7.451552,49.394012],[7.453465,49.394729],[7.454063,49.394941],[7.456302,49.395722],[7.45794,49.396311],[7.460042,49.397024],[7.460889,49.397306],[7.462384,49.397796],[7.463883,49.398273],[7.466152,49.398977],[7.467611,49.399428],[7.469935,49.400136],[7.471933,49.400727],[7.473488,49.401185],[7.474049,49.401341],[7.474407,49.401448],[7.475382,49.401731],[7.479513,49.402929],[7.483039,49.403945],[7.490542,49.406099],[7.491041,49.406244],[7.493136,49.406865],[7.495232,49.407468],[7.499401,49.408663],[7.504146,49.410038],[7.504488,49.410139],[7.506093,49.410593],[7.511288,49.412094],[7.515479,49.413298],[7.51583,49.4134],[7.518368,49.414129],[7.52131,49.414976],[7.523568,49.41562],[7.525715,49.416225],[7.527895,49.41682],[7.52865,49.417021],[7.529861,49.417344],[7.531207,49.417697],[7.532568,49.418037],[7.533916,49.418371],[7.535429,49.418738],[7.535822,49.418824],[7.536727,49.419029],[7.538106,49.419328],[7.539542,49.419623],[7.540914,49.419887],[7.542701,49.420209],[7.544573,49.420512],[7.545793,49.42069],[7.546982,49.420853],[7.548317,49.421014],[7.54961,49.421162],[7.550866,49.421281],[7.55231,49.421406],[7.553878,49.421513],[7.554244,49.421535],[7.554632,49.421558],[7.555015,49.42158],[7.555855,49.421615],[7.55737,49.421666],[7.558885,49.421696],[7.560047,49.421707],[7.56062,49.421704],[7.561557,49.421701],[7.562302,49.421692],[7.563278,49.421669],[7.563358,49.421668],[7.563967,49.421647],[7.564751,49.421616],[7.56509,49.421603],[7.565435,49.421589],[7.565538,49.421583],[7.565932,49.421564],[7.566906,49.421517],[7.569043,49.421386],[7.574396,49.421011],[7.578433,49.420739],[7.581191,49.420591],[7.584363,49.420442],[7.58655,49.420391],[7.588598,49.420387],[7.590496,49.420418],[7.591816,49.420468],[7.593146,49.42055],[7.595386,49.420719],[7.597056,49.420923],[7.59928,49.421214],[7.600579,49.421417],[7.601926,49.421652],[7.603189,49.421886],[7.604438,49.42215],[7.606254,49.422569],[7.607229,49.422817],[7.608182,49.423079],[7.609072,49.423327],[7.610467,49.423754],[7.611312,49.424018],[7.612184,49.424313],[7.613271,49.424704],[7.613664,49.424843],[7.614138,49.425025],[7.615237,49.42546],[7.616333,49.4259],[7.617715,49.426502],[7.619461,49.427266],[7.62118,49.428083],[7.625538,49.430278],[7.628343,49.431691],[7.631143,49.433076],[7.633264,49.434117],[7.635429,49.435113],[7.635841,49.435303],[7.637922,49.436205],[7.6383,49.436367],[7.640209,49.437156],[7.642039,49.437872],[7.643878,49.438556],[7.646409,49.439425],[7.647537,49.439777],[7.649194,49.440265],[7.649454,49.440336],[7.650388,49.440582],[7.651791,49.440951],[7.654218,49.441508],[7.654664,49.441601],[7.656043,49.441881],[7.657432,49.442138],[7.658921,49.442385],[7.659233,49.442436],[7.660214,49.442586],[7.66114,49.442721],[7.662221,49.442864],[7.664228,49.443094],[7.665742,49.443238],[7.668542,49.443448],[7.671195,49.44361],[7.676571,49.443878],[7.678167,49.443964],[7.679668,49.444044],[7.682575,49.444207],[7.684753,49.444367],[7.685824,49.444453],[7.687066,49.444578],[7.688233,49.444721],[7.690264,49.445006],[7.691376,49.44518],[7.693315,49.445503],[7.695012,49.445848],[7.696053,49.446069],[7.69625,49.44611],[7.696643,49.446191],[7.697559,49.446407],[7.699535,49.446851],[7.701342,49.447223],[7.70372,49.44766],[7.704316,49.447758],[7.705517,49.447946],[7.706784,49.448135],[7.70899,49.448413],[7.711283,49.448657],[7.712887,49.448795],[7.714424,49.448906],[7.715182,49.448951],[7.717129,49.449045],[7.718934,49.449108],[7.720615,49.449175],[7.722287,49.449275],[7.72375,49.449419],[7.725295,49.449613],[7.725638,49.449664],[7.727242,49.449966],[7.728467,49.450247],[7.729267,49.450451],[7.729937,49.45064],[7.730639,49.450857],[7.731625,49.451184],[7.732735,49.451585],[7.733649,49.451952],[7.734745,49.452409],[7.734751,49.452411],[7.735332,49.452632],[7.737214,49.453453],[7.737928,49.453762],[7.739343,49.454338],[7.739856,49.454524],[7.740342,49.454685],[7.741013,49.454874],[7.741654,49.455033],[7.742492,49.45521],[7.743564,49.455371],[7.743852,49.455414],[7.745046,49.455561],[7.748974,49.456042],[7.749838,49.456141],[7.750713,49.456235],[7.751753,49.456319],[7.752586,49.456369],[7.753765,49.456468],[7.755119,49.456549],[7.757306,49.456637],[7.759456,49.456682],[7.763075,49.456793],[7.764005,49.456827],[7.764643,49.456868],[7.765024,49.456902],[7.76543,49.456947],[7.765716,49.45699],[7.766448,49.457111],[7.767031,49.457225],[7.76784,49.457411],[7.771591,49.458335],[7.772633,49.458592],[7.780876,49.46062],[7.781423,49.460757],[7.783194,49.46119],[7.783971,49.461364],[7.784845,49.461529],[7.784954,49.461548],[7.785321,49.461611],[7.785817,49.461688],[7.786296,49.461755],[7.786635,49.4618],[7.787142,49.461854],[7.787492,49.461886],[7.787927,49.461925],[7.788279,49.461952],[7.788759,49.461984],[7.789269,49.462006],[7.789733,49.462023],[7.790263,49.462034],[7.790692,49.462036],[7.791084,49.462031],[7.791426,49.462025],[7.792143,49.462],[7.792357,49.461987],[7.793613,49.461899],[7.793982,49.461865],[7.794733,49.461783],[7.79511,49.461731],[7.79587,49.46153],[7.796397,49.46136],[7.797141,49.461076],[7.79795,49.460782],[7.798431,49.460652],[7.798955,49.460538],[7.799512,49.460457],[7.799883,49.460421],[7.800131,49.460406],[7.800426,49.460394],[7.800812,49.460392],[7.801217,49.460408],[7.801302,49.460413],[7.801587,49.460445],[7.802187,49.460525],[7.802616,49.460609],[7.803201,49.460758],[7.804024,49.461006],[7.805655,49.461524],[7.806469,49.461752],[7.806898,49.461855],[7.807719,49.462016],[7.808202,49.46209],[7.808631,49.46214],[7.808909,49.462159],[7.809461,49.462202],[7.809614,49.462208],[7.810151,49.46223],[7.810672,49.462232],[7.811188,49.462216],[7.811669,49.462187],[7.812217,49.462141],[7.812853,49.462059],[7.813386,49.461992],[7.814165,49.461884],[7.815071,49.46177],[7.815544,49.461723],[7.815699,49.461708],[7.816425,49.461663],[7.817096,49.461657],[7.817699,49.461682],[7.818309,49.46174],[7.818851,49.461818],[7.819293,49.461894],[7.8197,49.461983],[7.820025,49.462065],[7.820523,49.462213],[7.821166,49.462442],[7.821936,49.46278],[7.82242,49.463044],[7.823071,49.463465],[7.823508,49.463815],[7.823932,49.464209],[7.824241,49.464536],[7.824531,49.464931],[7.824797,49.465383],[7.824966,49.465742],[7.825075,49.466055],[7.825152,49.466373],[7.825204,49.466694],[7.825244,49.467015],[7.825269,49.4675],[7.825249,49.468445],[7.825239,49.469252],[7.82526,49.469747],[7.82531,49.47028],[7.825376,49.470604],[7.825454,49.47093],[7.825549,49.47126],[7.825676,49.471564],[7.825783,49.471793],[7.826117,49.472355],[7.826374,49.472707],[7.826521,49.472899],[7.826907,49.473311],[7.827299,49.473663],[7.827713,49.473999],[7.82806,49.474266],[7.828676,49.474709],[7.829394,49.475217],[7.830344,49.475862],[7.831644,49.47676],[7.832278,49.477194],[7.833556,49.478083],[7.835097,49.479264],[7.835666,49.479736],[7.836202,49.480207],[7.837049,49.481002],[7.837689,49.481657],[7.838259,49.482308],[7.838782,49.482942],[7.839411,49.483775],[7.839789,49.484328],[7.840015,49.48467],[7.840524,49.485549],[7.84089,49.486253],[7.841174,49.486855],[7.841362,49.487288],[7.841491,49.487597],[7.841821,49.488545],[7.84202,49.489272],[7.842154,49.489803],[7.842226,49.490164],[7.842398,49.49109],[7.842632,49.493003],[7.842648,49.493129],[7.842861,49.494889],[7.843056,49.496528],[7.843285,49.498539],[7.843287,49.498554],[7.843418,49.499821],[7.843628,49.501563],[7.843871,49.503524],[7.843942,49.504002],[7.844068,49.504762],[7.84412,49.505096],[7.844227,49.505715],[7.844416,49.506697],[7.844515,49.507195],[7.844596,49.50757],[7.844654,49.507841],[7.844776,49.508419],[7.844847,49.508753],[7.844987,49.509327],[7.84503,49.509484],[7.845093,49.509731],[7.845409,49.510957],[7.845695,49.512087],[7.845781,49.512436],[7.846045,49.5137],[7.846195,49.514564],[7.846253,49.515043],[7.846335,49.516195],[7.846346,49.517444],[7.846278,49.518563],[7.846177,49.519699],[7.845908,49.521992],[7.845758,49.523241],[7.845688,49.524223],[7.845601,49.525164],[7.845589,49.525783],[7.845613,49.526764],[7.845645,49.527253],[7.845676,49.52768],[7.845828,49.52865],[7.845949,49.529186],[7.846091,49.529746],[7.846379,49.530587],[7.846585,49.531078],[7.846794,49.531512],[7.847064,49.532011],[7.847417,49.532633],[7.847788,49.533213],[7.848095,49.533665],[7.848414,49.534078],[7.848751,49.534477],[7.84913,49.534908],[7.84968,49.53548],[7.850359,49.536108],[7.850995,49.536684],[7.852084,49.537593],[7.852594,49.538034],[7.853224,49.538629],[7.853856,49.539245],[7.854468,49.53994],[7.854936,49.540573],[7.855375,49.54152],[7.855601,49.542251],[7.8559,49.543609],[7.85606,49.544214],[7.856306,49.544806],[7.856505,49.54524],[7.856708,49.545577],[7.857109,49.54618],[7.857577,49.546735],[7.858091,49.547259],[7.858564,49.547666],[7.859015,49.548],[7.859531,49.548363],[7.860269,49.548801],[7.86161,49.549483],[7.862629,49.549966],[7.863269,49.550271],[7.86485,49.551024],[7.865851,49.551488],[7.86671,49.551893],[7.868266,49.552626],[7.869513,49.553212],[7.870661,49.553753],[7.871405,49.554102],[7.87189,49.554336],[7.872935,49.554785],[7.873534,49.555018],[7.874022,49.555188],[7.874729,49.555416],[7.875177,49.55555],[7.876045,49.555775],[7.877002,49.555978],[7.87788,49.556133],[7.87835,49.556203],[7.87956,49.55636],[7.881974,49.556635],[7.883014,49.556774],[7.883957,49.556922],[7.885068,49.557132],[7.88592,49.557327],[7.8865,49.557482],[7.887172,49.557666],[7.888427,49.558062],[7.889406,49.558423],[7.890191,49.558746],[7.890642,49.558949],[7.891131,49.55917],[7.891899,49.559564],[7.89283,49.560093],[7.893527,49.560545],[7.89403,49.560873],[7.894567,49.561279],[7.895331,49.561897],[7.895893,49.562412],[7.896443,49.562973],[7.896845,49.563415],[7.89723,49.563889],[7.897546,49.564303],[7.898023,49.565048],[7.898317,49.565542],[7.898551,49.566],[7.898973,49.566916],[7.899234,49.567532],[7.899572,49.568301],[7.899827,49.568857],[7.900101,49.569379],[7.900324,49.569765],[7.900739,49.570404],[7.901309,49.571155],[7.901968,49.571909],[7.902834,49.572754],[7.903422,49.573257],[7.904207,49.573853],[7.904827,49.574277],[7.905225,49.574534],[7.905713,49.574826],[7.906506,49.57527],[7.907425,49.575734],[7.908438,49.576183],[7.90913,49.576455],[7.909482,49.576581],[7.909667,49.576647],[7.910207,49.576841],[7.91109,49.577113],[7.912009,49.577364],[7.912844,49.57757],[7.913621,49.577739],[7.914333,49.577883],[7.915217,49.578045],[7.916157,49.578203],[7.91744,49.578404],[7.919342,49.578676],[7.921014,49.578903],[7.922685,49.579146],[7.924342,49.579418],[7.925453,49.579622],[7.926219,49.579785],[7.927151,49.579993],[7.928064,49.58022],[7.929574,49.580637],[7.930909,49.58105],[7.932,49.581417],[7.932687,49.581679],[7.933739,49.582091],[7.934775,49.582521],[7.935754,49.582974],[7.93669,49.583437],[7.937512,49.583871],[7.93844,49.584381],[7.939369,49.584913],[7.940636,49.58566],[7.941138,49.585955],[7.941371,49.586091],[7.942041,49.586481],[7.943147,49.587114],[7.944275,49.587728],[7.94524,49.588221],[7.946103,49.588614],[7.9471,49.589063],[7.947734,49.589329],[7.948356,49.589572],[7.949155,49.589865],[7.949869,49.590113],[7.950877,49.590454],[7.952449,49.590922],[7.954055,49.591334],[7.955203,49.591596],[7.956182,49.591799],[7.957772,49.59211],[7.959308,49.592384],[7.959753,49.592462],[7.960607,49.592616],[7.961815,49.592834],[7.962945,49.593057],[7.965102,49.593529],[7.966732,49.593958],[7.967039,49.594054],[7.967867,49.594298],[7.968975,49.594656],[7.970286,49.595116],[7.971797,49.595669],[7.97355,49.596315],[7.974814,49.596774],[7.976162,49.597279],[7.977305,49.597707],[7.979187,49.59841],[7.980318,49.598829],[7.981099,49.599112],[7.982033,49.59946],[7.984174,49.600263],[7.985339,49.600699],[7.986575,49.601155],[7.98879,49.601983],[7.991125,49.602848],[7.994132,49.603972],[7.995662,49.604539],[7.998766,49.605692],[7.999121,49.605825],[8.000699,49.606418],[8.00391,49.607629],[8.004399,49.607812],[8.005957,49.608412],[8.007568,49.60907],[8.008975,49.609643],[8.010018,49.610092],[8.010027,49.610096],[8.011471,49.610738],[8.012684,49.611294],[8.013712,49.611789],[8.014711,49.612275],[8.015624,49.612759],[8.016629,49.613294],[8.017925,49.61404],[8.018669,49.614478],[8.019388,49.614929],[8.020685,49.615772],[8.021977,49.616703],[8.022795,49.617329],[8.023422,49.61783],[8.024669,49.618898],[8.025623,49.619785],[8.026425,49.62059],[8.027079,49.621275],[8.027719,49.621981],[8.02835,49.622741],[8.02891,49.623465],[8.029411,49.624173],[8.029928,49.624914],[8.030504,49.625813],[8.031033,49.626721],[8.031524,49.627653],[8.03195,49.628529],[8.032421,49.62966],[8.032817,49.630743],[8.033154,49.631844],[8.033387,49.632756],[8.033568,49.633593],[8.033689,49.634347],[8.033795,49.635128],[8.033861,49.635784],[8.033905,49.636505],[8.033929,49.637168],[8.033924,49.637779],[8.033874,49.638987],[8.033785,49.639785],[8.033691,49.640587],[8.033308,49.642497],[8.033084,49.643316],[8.032888,49.64396],[8.032619,49.644741],[8.032366,49.645395],[8.03181,49.646723],[8.031378,49.647654],[8.030967,49.648503],[8.030142,49.650102],[8.02983,49.650688],[8.029297,49.651682],[8.028471,49.653223],[8.027694,49.654729],[8.027063,49.656016],[8.026479,49.657307],[8.026035,49.658387],[8.025635,49.659503],[8.025265,49.660753],[8.024976,49.662014],[8.024708,49.663676],[8.024612,49.664712],[8.024578,49.665475],[8.024575,49.665614],[8.024573,49.666446],[8.024593,49.667113],[8.024633,49.667769],[8.024697,49.6684],[8.024751,49.668742],[8.024805,49.669133],[8.024922,49.669886],[8.025098,49.670753],[8.025198,49.671177],[8.025305,49.671573],[8.025558,49.67244],[8.025952,49.673521],[8.026281,49.674347],[8.026685,49.675224],[8.027142,49.676109],[8.027636,49.677026],[8.028382,49.678243],[8.028733,49.678781],[8.029146,49.679347],[8.029566,49.67991],[8.030021,49.680472],[8.031045,49.681629],[8.03216,49.682753],[8.032963,49.68347],[8.033365,49.683823],[8.034578,49.684821],[8.034939,49.685104],[8.036579,49.686376],[8.03932,49.688487],[8.039603,49.688701],[8.041003,49.689783],[8.042632,49.691033],[8.044693,49.692622],[8.04643,49.693968],[8.047474,49.694766],[8.048037,49.695198],[8.049311,49.696177],[8.050785,49.69732],[8.051831,49.698128],[8.053153,49.699161],[8.053664,49.699553],[8.054856,49.700465],[8.056122,49.701409],[8.057584,49.702554],[8.059046,49.703666],[8.059609,49.704104],[8.061393,49.705487],[8.062994,49.706719],[8.064456,49.707852],[8.065531,49.708674],[8.06664,49.709528],[8.067544,49.710226],[8.068665,49.711146],[8.069355,49.711716],[8.069857,49.71216],[8.070295,49.712539],[8.071046,49.713211],[8.07215,49.714252],[8.072821,49.714909],[8.073402,49.715504],[8.073492,49.715602],[8.074696,49.716922],[8.074788,49.717032],[8.075462,49.717836],[8.075969,49.718482],[8.076457,49.719131],[8.076869,49.719704],[8.077858,49.721203],[8.078577,49.722462],[8.078907,49.723063],[8.079367,49.724002],[8.079695,49.724714],[8.079697,49.724717],[8.080146,49.725822],[8.080616,49.727133],[8.0809,49.728071],[8.08125,49.729274],[8.082158,49.732841],[8.082874,49.73571],[8.083474,49.738114],[8.08377,49.739331],[8.08405,49.740436],[8.084832,49.743637],[8.085389,49.745878],[8.085705,49.74715],[8.086092,49.748714],[8.086299,49.749545],[8.08645,49.750171],[8.086828,49.751656],[8.087238,49.753136],[8.087497,49.753983],[8.087978,49.755408],[8.088462,49.75665],[8.08883,49.75751],[8.089134,49.758141],[8.089481,49.758785],[8.089923,49.759575],[8.090386,49.760327],[8.090674,49.760781],[8.091082,49.761354],[8.091589,49.76205],[8.092024,49.762622],[8.092423,49.763104],[8.092758,49.763468],[8.09326,49.764037],[8.093947,49.764761],[8.094723,49.765518],[8.095501,49.766233],[8.096355,49.766963],[8.09703,49.76751],[8.097826,49.768122],[8.098674,49.768724],[8.099824,49.769512],[8.100771,49.770107],[8.101693,49.770651],[8.103002,49.771404],[8.103812,49.771831],[8.105334,49.772625],[8.108321,49.774085],[8.110302,49.775037],[8.11101,49.77539],[8.112674,49.776179],[8.11285,49.776267],[8.113055,49.776366],[8.113272,49.776474],[8.114304,49.776965],[8.114613,49.777112],[8.11498,49.777293],[8.116053,49.777814],[8.118039,49.778765],[8.118466,49.778968],[8.120298,49.779857],[8.122469,49.780911],[8.123963,49.781639],[8.12501,49.782152],[8.12607,49.782702],[8.127374,49.783392],[8.129232,49.784419],[8.130307,49.785057],[8.131412,49.785737],[8.132312,49.786331],[8.132936,49.786753],[8.133844,49.787399],[8.134751,49.788089],[8.13584,49.788985],[8.136478,49.789544],[8.137034,49.790059],[8.137674,49.790698],[8.137901,49.79093],[8.138611,49.791705],[8.139347,49.792546],[8.139498,49.792736],[8.140128,49.793547],[8.140582,49.794199],[8.140992,49.794826],[8.141412,49.795505],[8.141855,49.796274],[8.142169,49.796895],[8.142454,49.797474],[8.142682,49.797986],[8.143134,49.79909],[8.143428,49.800011],[8.143714,49.801087],[8.143931,49.802097],[8.14411,49.803208],[8.144207,49.804112],[8.144277,49.804966],[8.14433,49.806039],[8.144339,49.806569],[8.144349,49.807134],[8.144326,49.808119],[8.1443,49.808981],[8.144274,49.809646],[8.14421,49.810864],[8.144154,49.811827],[8.144088,49.813009],[8.143886,49.816171],[8.143668,49.819511],[8.143548,49.821108],[8.14344,49.82275],[8.143432,49.822874],[8.143334,49.824499],[8.143294,49.825132],[8.143146,49.827876],[8.143127,49.829984],[8.14317,49.831246],[8.143204,49.83205],[8.143382,49.834166],[8.143577,49.835749],[8.143647,49.836229],[8.143787,49.837131],[8.144074,49.838699],[8.14429,49.839687],[8.144503,49.840495],[8.144625,49.841016],[8.144882,49.842001],[8.145139,49.842905],[8.145359,49.843647],[8.145866,49.845179],[8.146625,49.847228],[8.147217,49.848642],[8.147628,49.849564],[8.148112,49.850594],[8.148588,49.851556],[8.149448,49.8532],[8.149896,49.854002],[8.150511,49.855058],[8.151149,49.856114],[8.151621,49.856857],[8.152176,49.857711],[8.15281,49.858636],[8.153333,49.859384],[8.154507,49.860978],[8.154604,49.861102],[8.154841,49.861415],[8.155139,49.861798],[8.155637,49.862418],[8.156175,49.863082],[8.156692,49.863693],[8.15705,49.864126],[8.157662,49.864822],[8.158248,49.865478],[8.158671,49.865948],[8.159397,49.866723],[8.160179,49.867545],[8.161525,49.868893],[8.162254,49.869598],[8.16291,49.870217],[8.163333,49.870607],[8.163524,49.870789],[8.164918,49.872091],[8.166337,49.873405],[8.167883,49.874852],[8.169496,49.876355],[8.173503,49.8801],[8.175881,49.882378],[8.176968,49.883444],[8.178036,49.884519],[8.178971,49.885476],[8.180027,49.886592],[8.18062,49.887234],[8.181273,49.887957],[8.181933,49.888704],[8.182515,49.889384],[8.183029,49.890001],[8.183291,49.890316],[8.184197,49.891456],[8.185101,49.892645],[8.185296,49.892925],[8.186287,49.894346],[8.186506,49.89467],[8.18723,49.895815],[8.187883,49.896915],[8.188203,49.897477],[8.188459,49.897966],[8.188693,49.898414],[8.188928,49.898888],[8.189166,49.899377],[8.189414,49.899907],[8.189683,49.900495],[8.189885,49.900953],[8.190221,49.901784],[8.190744,49.903165],[8.191126,49.904328],[8.191284,49.904913],[8.191525,49.905771],[8.191721,49.906571],[8.192014,49.907839],[8.192149,49.908448],[8.1924,49.909574],[8.192661,49.910868],[8.192875,49.911988],[8.193029,49.912723],[8.193222,49.913579],[8.193251,49.913701],[8.193284,49.913846],[8.193348,49.914152],[8.193601,49.915243],[8.193831,49.916146],[8.194064,49.916927],[8.194366,49.917904],[8.194706,49.918901],[8.195104,49.919959],[8.195211,49.920244],[8.195378,49.920661],[8.195693,49.921408],[8.195747,49.921526],[8.196131,49.922433],[8.196502,49.923219],[8.196953,49.924156],[8.197361,49.924909],[8.198212,49.926578],[8.198822,49.927714],[8.19948,49.928902],[8.200574,49.930798],[8.201178,49.931804],[8.201734,49.932813],[8.202119,49.933677],[8.202257,49.934008],[8.202425,49.934512],[8.202528,49.93482],[8.202657,49.935324],[8.20298,49.936597],[8.20323,49.93758],[8.20339,49.9381],[8.203625,49.938738],[8.203918,49.93936],[8.20413,49.939747],[8.204277,49.93999],[8.204562,49.940421],[8.20513,49.941155],[8.205496,49.941566],[8.205825,49.941897],[8.206351,49.942384],[8.206899,49.942832],[8.207719,49.943422],[8.208448,49.943874],[8.209151,49.944271],[8.210089,49.944731],[8.211007,49.94512],[8.212115,49.945536],[8.212658,49.945721],[8.213762,49.946082],[8.215357,49.946575],[8.216484,49.946947],[8.217534,49.947304],[8.218728,49.947767],[8.219085,49.947919],[8.21957,49.948131],[8.220369,49.948527],[8.221165,49.948939],[8.222054,49.949463],[8.222795,49.949938],[8.223619,49.950502],[8.22408,49.950848],[8.22408,49.950848],[8.224583,49.951244],[8.225015,49.951594],[8.225399,49.951913],[8.225886,49.952336],[8.227238,49.953593],[8.228548,49.9549],[8.228803,49.955159],[8.229882,49.956265],[8.230854,49.957263],[8.231581,49.957967],[8.232104,49.958457],[8.232642,49.958939],[8.233431,49.959614],[8.234139,49.960204],[8.234947,49.960887],[8.236406,49.962073],[8.236602,49.962173],[8.236758,49.962271],[8.236958,49.962401],[8.237131,49.962506],[8.237309,49.962613],[8.237472,49.962694],[8.237727,49.962793],[8.238075,49.962885],[8.240956,49.963598],[8.241151,49.963678],[8.241357,49.963798],[8.241702,49.964091],[8.241812,49.964189],[8.241986,49.9643],[8.242201,49.964389],[8.242448,49.964457],[8.242919,49.964528],[8.244137,49.964742],[8.244781,49.964844],[8.245492,49.96497],[8.245938,49.965059],[8.24637,49.96514],[8.247548,49.965423],[8.248722,49.965726],[8.249878,49.966051],[8.251108,49.966419],[8.251212,49.966453],[8.254407,49.96742],[8.255814,49.967845],[8.256146,49.967946],[8.2584,49.968622],[8.260137,49.969141],[8.263496,49.97017],[8.265968,49.970917],[8.269114,49.971864],[8.269772,49.972046],[8.27147,49.972554],[8.272382,49.972826],[8.273436,49.973141],[8.274361,49.973417],[8.27514,49.97363],[8.275765,49.973787],[8.276255,49.973899],[8.276867,49.974026],[8.277345,49.974121],[8.278126,49.974264],[8.278655,49.974347],[8.279396,49.974444],[8.280074,49.974524],[8.280822,49.974596],[8.281655,49.974662],[8.282144,49.974686],[8.282867,49.974712],[8.283569,49.974727],[8.284396,49.974726],[8.28543,49.974688],[8.286145,49.974655],[8.286646,49.974621],[8.28739,49.974552],[8.288055,49.974482],[8.28855,49.974424],[8.28939,49.974306],[8.289792,49.974236],[8.290534,49.974105],[8.291088,49.973995],[8.291965,49.973796],[8.292758,49.9736],[8.29366,49.973345],[8.294271,49.973155],[8.294746,49.972998],[8.295418,49.972764],[8.295861,49.972601],[8.297008,49.972173],[8.298294,49.971684],[8.299553,49.971255],[8.300304,49.971021],[8.301001,49.970832],[8.301709,49.970665],[8.302798,49.970448],[8.303034,49.970407],[8.30352,49.970332],[8.303807,49.97029],[8.304437,49.970217],[8.305066,49.970163],[8.305628,49.970121],[8.306371,49.970091],[8.307084,49.970076],[8.307919,49.970086],[8.309222,49.970147],[8.309547,49.970175],[8.310128,49.970241],[8.310719,49.970316],[8.311674,49.970468],[8.311967,49.970518],[8.31251,49.970631],[8.312699,49.970671],[8.313181,49.970789],[8.313494,49.970865],[8.313947,49.970991],[8.314371,49.971112],[8.314646,49.971199],[8.314792,49.971245],[8.315477,49.971496],[8.316149,49.97176],[8.316718,49.972011],[8.317112,49.972182],[8.318314,49.972776],[8.319165,49.9732],[8.321313,49.974344],[8.323643,49.975531],[8.325122,49.976282],[8.326487,49.976992],[8.328168,49.97785],[8.328831,49.978181],[8.329805,49.978676],[8.330749,49.979177],[8.332861,49.980221],[8.334494,49.980962],[8.335338,49.981315],[8.33591,49.981537],[8.336343,49.98169],[8.336758,49.981828],[8.337105,49.981929],[8.337459,49.982021],[8.337819,49.982101],[8.338184,49.982171],[8.338555,49.982229],[8.338929,49.982277],[8.339306,49.982313],[8.339706,49.982337],[8.340085,49.982358],[8.340447,49.982361],[8.340896,49.982353],[8.34125,49.98234],[8.341598,49.98232],[8.342085,49.98228],[8.342475,49.982232],[8.342853,49.982171],[8.343199,49.982099],[8.343505,49.98202],[8.34389,49.981922],[8.344386,49.981769],[8.34475,49.981641],[8.345424,49.981374],[8.346075,49.981089],[8.346349,49.98096],[8.346551,49.98086],[8.346934,49.980651],[8.347557,49.980305],[8.347982,49.980054],[8.348217,49.979923],[8.349561,49.979105],[8.349957,49.978877],[8.350427,49.978603],[8.350986,49.978298],[8.35152,49.978029],[8.352369,49.977625],[8.35275,49.977457],[8.35421,49.976877],[8.355389,49.976488],[8.356189,49.976267],[8.357129,49.97603],[8.358518,49.975718],[8.360203,49.975373],[8.363325,49.974801],[8.364788,49.974569],[8.36649,49.974318],[8.368018,49.974111],[8.36924,49.973957],[8.370401,49.973818],[8.372388,49.973616],[8.373611,49.9735],[8.37522,49.973377],[8.37642,49.973293],[8.378901,49.973172],[8.380256,49.973111],[8.382182,49.973068],[8.383156,49.97305],[8.385145,49.97305],[8.387414,49.973081],[8.39006,49.973163],[8.391308,49.973228],[8.392251,49.973281],[8.393182,49.97334],[8.393728,49.973375],[8.395641,49.973526],[8.397585,49.973702],[8.397792,49.973719],[8.399307,49.973863],[8.400766,49.974012],[8.402972,49.974224],[8.404681,49.974381],[8.406628,49.974533],[8.407686,49.9746],[8.408738,49.974656],[8.410079,49.974725],[8.411556,49.974772],[8.412573,49.97479],[8.414513,49.974812],[8.415443,49.974808],[8.417728,49.974773],[8.420022,49.974726],[8.423396,49.974648],[8.425376,49.974633],[8.426616,49.974626],[8.428095,49.974641],[8.429578,49.974671],[8.430082,49.974692],[8.4308,49.974716],[8.431545,49.974756],[8.432533,49.974803],[8.433323,49.974849],[8.433582,49.974865],[8.43412,49.974908],[8.434963,49.97497],[8.435349,49.975003],[8.436098,49.975064],[8.436663,49.975121],[8.437557,49.975208],[8.438499,49.975314],[8.439104,49.975382],[8.439595,49.975441],[8.440615,49.975564],[8.441759,49.975701],[8.442358,49.975775],[8.44328,49.975883],[8.444722,49.976026],[8.4457,49.97611],[8.446456,49.976165],[8.447007,49.9762],[8.447685,49.976234],[8.448567,49.976269],[8.449482,49.976292],[8.450578,49.976305],[8.451606,49.976297],[8.452633,49.97628],[8.453443,49.976259],[8.454306,49.976229],[8.455213,49.976195],[8.456223,49.976157],[8.457219,49.976137],[8.458329,49.976138],[8.458627,49.976143],[8.459166,49.976166],[8.459702,49.97621],[8.460233,49.976272],[8.460758,49.976354],[8.461275,49.976455],[8.461781,49.976574],[8.462137,49.976671],[8.462579,49.976816],[8.463003,49.976983],[8.463407,49.977169],[8.463789,49.977373],[8.464148,49.977593],[8.464482,49.977829],[8.464773,49.978067],[8.465039,49.978317],[8.465279,49.978578],[8.465491,49.978849],[8.465664,49.979111],[8.465811,49.97938],[8.46593,49.979654],[8.466023,49.979933],[8.466088,49.980215],[8.466125,49.980499],[8.466135,49.980784],[8.466116,49.981068],[8.466069,49.981351],[8.465995,49.981632],[8.465975,49.981712],[8.465828,49.982319],[8.465757,49.982616],[8.46572,49.982904],[8.465706,49.98308],[8.465698,49.983275],[8.465703,49.983423],[8.465657,49.983757],[8.465744,49.984128],[8.465903,49.984721],[8.466065,49.985258],[8.466324,49.986062],[8.466806,49.987296],[8.467143,49.988089],[8.46749,49.988807],[8.467673,49.989156],[8.467938,49.989654],[8.468261,49.99023],[8.468685,49.990933],[8.468836,49.991179],[8.469295,49.99188],[8.469773,49.992569],[8.470323,49.993315],[8.470833,49.993941],[8.471613,49.99487],[8.472225,49.995547],[8.472924,49.996281],[8.473555,49.996908],[8.474806,49.998051],[8.475325,49.998511],[8.475918,49.998992],[8.47719,49.999992],[8.477865,50.000487],[8.47855,50.000969],[8.478888,50.001199],[8.479556,50.001639],[8.480148,50.002028],[8.481375,50.002801],[8.482474,50.00346],[8.484488,50.004656],[8.48484,50.004863],[8.486422,50.005793],[8.487578,50.006501],[8.488646,50.00718],[8.489595,50.007819],[8.490332,50.008353],[8.490843,50.008726],[8.491461,50.009227],[8.492086,50.009757],[8.49283,50.010467],[8.493669,50.011357],[8.494049,50.011817],[8.494534,50.012445],[8.49485,50.012913],[8.495036,50.013179],[8.495423,50.013819],[8.495719,50.014352],[8.495951,50.014826],[8.49631,50.015658],[8.49648,50.016147],[8.496618,50.016583],[8.496861,50.017567],[8.497019,50.018612],[8.497063,50.019446],[8.497063,50.01966],[8.497068,50.020116],[8.49703,50.020733],[8.49697,50.021266],[8.496884,50.021799],[8.496908,50.022412],[8.496897,50.022654],[8.496878,50.022958],[8.496855,50.02372],[8.496868,50.02434],[8.496906,50.024737],[8.496969,50.025128],[8.497006,50.025284],[8.497089,50.025617],[8.497264,50.026102],[8.497415,50.026419],[8.497595,50.026735],[8.498048,50.027364],[8.498607,50.027926],[8.498995,50.02824],[8.499528,50.028616],[8.499829,50.0288],[8.500363,50.029091],[8.501022,50.029425],[8.501371,50.02957],[8.501853,50.029761],[8.50286,50.030167],[8.503096,50.030263],[8.503905,50.030578],[8.504518,50.030827],[8.505404,50.031186],[8.505851,50.03136],[8.506711,50.031705],[8.507444,50.031999],[8.509493,50.032815],[8.511537,50.033629],[8.513212,50.034301],[8.515185,50.035087],[8.515675,50.035278],[8.516668,50.035665],[8.517666,50.036086],[8.518809,50.036561],[8.51967,50.036911],[8.520197,50.037121],[8.520518,50.037252],[8.523052,50.038272],[8.525002,50.039032],[8.525504,50.039237],[8.526856,50.039782],[8.529241,50.040739],[8.531666,50.04168],[8.532774,50.042122],[8.534263,50.042719],[8.535751,50.043319],[8.536372,50.043561],[8.536735,50.043702],[8.539237,50.044703],[8.539621,50.044859],[8.53991,50.044976],[8.541009,50.04542],[8.541652,50.045682],[8.542625,50.04607],[8.543113,50.046262],[8.543973,50.046591],[8.544917,50.046931],[8.545804,50.047232],[8.546107,50.04733],[8.54715,50.047647],[8.547797,50.047835],[8.548502,50.048017],[8.549163,50.048191],[8.549892,50.048361],[8.550526,50.048509],[8.556581,50.049748],[8.558432,50.050121],[8.560325,50.050499],[8.562279,50.050876],[8.564173,50.051241],[8.566092,50.05161],[8.567416,50.051863],[8.567989,50.051971],[8.568957,50.052151],[8.56963,50.052282],[8.570664,50.052468],[8.571091,50.052548],[8.572308,50.052775],[8.573333,50.052963],[8.573994,50.053083],[8.574686,50.053193],[8.575412,50.053307],[8.576175,50.053407],[8.576636,50.053464],[8.577139,50.053519],[8.577546,50.05356],[8.577889,50.053597],[8.578617,50.053654],[8.579139,50.053688],[8.579673,50.053717],[8.580156,50.05374],[8.580668,50.053761],[8.581145,50.053774],[8.58164,50.053784],[8.582117,50.053787],[8.582593,50.053786],[8.583106,50.053779],[8.583605,50.053765],[8.584101,50.05375],[8.584457,50.053739],[8.584856,50.053721],[8.585207,50.053707],[8.586106,50.053659],[8.586612,50.053639],[8.587843,50.053578],[8.588568,50.053547],[8.590294,50.053473],[8.591631,50.053405],[8.592822,50.053346],[8.593324,50.053323],[8.593816,50.0533],[8.594531,50.053269],[8.595352,50.053229],[8.596281,50.053183],[8.596525,50.053174],[8.597302,50.05315],[8.598906,50.053068],[8.599558,50.053034],[8.600382,50.053004],[8.601031,50.052977],[8.602352,50.052919],[8.603387,50.052869],[8.60479,50.052783],[8.605955,50.052736],[8.606933,50.052687],[8.608377,50.052625],[8.609775,50.052557],[8.611241,50.052484],[8.612741,50.052414],[8.612769,50.052413],[8.614019,50.052357],[8.614693,50.052325],[8.615245,50.052304],[8.615873,50.052275],[8.616245,50.052252],[8.61697,50.052221],[8.61768,50.052194],[8.618706,50.052157],[8.619929,50.05213],[8.620666,50.05213],[8.621428,50.052142],[8.621858,50.052158],[8.622448,50.052188],[8.623182,50.052233],[8.623804,50.052287],[8.624585,50.052351],[8.625414,50.052455],[8.626155,50.052557],[8.626799,50.05266],[8.627215,50.052734],[8.628196,50.052927],[8.628925,50.053095],[8.629377,50.0532],[8.632242,50.053973],[8.632854,50.054138],[8.637299,50.055407],[8.639175,50.055949],[8.641312,50.056568],[8.644281,50.057413],[8.648999,50.058771],[8.651373,50.059453],[8.652296,50.059686],[8.653221,50.0599],[8.654429,50.060159],[8.655104,50.060295],[8.656129,50.060465],[8.656597,50.06053],[8.657315,50.060626],[8.65875,50.060774],[8.659695,50.060847],[8.660633,50.0609],[8.661611,50.060938],[8.662855,50.060975],[8.663899,50.061002],[8.665089,50.061036],[8.666416,50.061069],[8.66702,50.061082],[8.669985,50.061116],[8.670453,50.061122],[8.677816,50.061175],[8.688265,50.061132],[8.688797,50.061133],[8.690371,50.06114],[8.691188,50.061144],[8.694584,50.061185],[8.695166,50.06119],[8.697283,50.061223],[8.698624,50.061277],[8.70006,50.061374],[8.701019,50.061473],[8.70179,50.061552],[8.702755,50.061674],[8.703605,50.061804],[8.704674,50.061983],[8.705879,50.062189],[8.707864,50.062572],[8.709175,50.062834],[8.711068,50.063215],[8.712212,50.063435],[8.713652,50.063714],[8.715105,50.063961],[8.716065,50.064107],[8.716974,50.064231],[8.717567,50.0643],[8.718387,50.064401],[8.719251,50.064478],[8.720116,50.064541],[8.720547,50.064564],[8.720859,50.06458],[8.721969,50.064621],[8.722516,50.064635],[8.723002,50.06464],[8.724265,50.064638],[8.726137,50.064601],[8.728017,50.06453],[8.72989,50.064441],[8.731412,50.064368],[8.732934,50.064298],[8.734269,50.064242],[8.735597,50.064198],[8.736705,50.064168],[8.73754,50.064153],[8.73848,50.064144],[8.739365,50.064147],[8.74025,50.064156],[8.741123,50.064174],[8.741145,50.064174],[8.741806,50.064198],[8.742022,50.064208],[8.742242,50.064218],[8.74227,50.064219],[8.742842,50.06425],[8.743939,50.064317],[8.746188,50.064497],[8.746878,50.064566],[8.748021,50.064673],[8.748776,50.064758],[8.752132,50.065133],[8.753822,50.065334],[8.755236,50.065508],[8.758391,50.065845],[8.759308,50.065954],[8.761508,50.066215],[8.7641,50.066489],[8.765469,50.066629],[8.767382,50.0668],[8.767732,50.066826],[8.769321,50.066951],[8.770862,50.067049],[8.772353,50.067133],[8.773237,50.067169],[8.773984,50.067198],[8.775396,50.06725],[8.776759,50.067287],[8.779522,50.067341],[8.782425,50.067384],[8.784365,50.067412],[8.785436,50.067424],[8.786649,50.067448],[8.787951,50.067465],[8.790643,50.067501],[8.790658,50.067501],[8.793423,50.067537],[8.796145,50.067573],[8.801681,50.067646],[8.802311,50.067654],[8.805506,50.067699],[8.808055,50.067733],[8.812016,50.067788],[8.815974,50.067832],[8.81854,50.067824],[8.819805,50.0678],[8.821111,50.06775],[8.822031,50.067702],[8.822922,50.067638],[8.82341,50.067597],[8.823753,50.067567],[8.824549,50.067483],[8.825305,50.067392],[8.82594,50.067308],[8.827056,50.06713],[8.827795,50.066997],[8.828955,50.066769],[8.829695,50.066618],[8.830445,50.066448],[8.830655,50.066401],[8.830867,50.066349],[8.83203,50.066064],[8.832538,50.065929],[8.834019,50.065548],[8.836659,50.064825],[8.836755,50.064799],[8.842155,50.063337],[8.843255,50.063048],[8.844408,50.062763],[8.845786,50.062444],[8.847196,50.062139],[8.848188,50.061944],[8.849278,50.061756],[8.850329,50.061592],[8.851289,50.061458],[8.852532,50.06131],[8.853737,50.061181],[8.854917,50.06107],[8.856149,50.060969],[8.857226,50.060894],[8.858329,50.060819],[8.860694,50.060664],[8.865206,50.06037],[8.867864,50.060201],[8.868404,50.060166],[8.87063,50.06002],[8.871235,50.059981],[8.871866,50.059936],[8.873362,50.059838],[8.875269,50.059722],[8.875409,50.059713],[8.875764,50.059691],[8.879815,50.0594],[8.882065,50.05924],[8.883998,50.059083],[8.886996,50.058819],[8.888119,50.058714],[8.888879,50.058495],[8.889258,50.058426],[8.889545,50.058383],[8.889826,50.058349],[8.890115,50.058342],[8.890443,50.058314],[8.890716,50.058286],[8.891075,50.058253],[8.892171,50.058134],[8.892287,50.058118],[8.892395,50.058099],[8.892495,50.058077],[8.892625,50.05803],[8.892715,50.057987],[8.892785,50.057949],[8.892864,50.057876],[8.892916,50.05781],[8.892948,50.057741],[8.892962,50.057669],[8.892966,50.057608],[8.892954,50.05754],[8.892924,50.057484],[8.892895,50.057435],[8.892858,50.057382],[8.892806,50.057335],[8.892769,50.057301],[8.892683,50.057258],[8.892609,50.057224],[8.892521,50.057191],[8.892437,50.057175],[8.892349,50.057162],[8.892247,50.057156],[8.89217,50.057156],[8.892082,50.057163],[8.891978,50.057181],[8.891896,50.057205],[8.891839,50.057226],[8.891773,50.057257],[8.891715,50.057289],[8.891665,50.057326],[8.891621,50.057365],[8.891571,50.057422],[8.891533,50.05747],[8.891502,50.057561],[8.891489,50.05767],[8.891421,50.058006],[8.89142,50.058065],[8.891432,50.058857],[8.891435,50.059817],[8.891435,50.060371],[8.891439,50.061303],[8.891435,50.061725],[8.891428,50.062797],[8.8914,50.063828],[8.891347,50.064604],[8.89129,50.065083],[8.891218,50.065516],[8.891126,50.065987],[8.891001,50.066477],[8.890797,50.067224],[8.890344,50.068635],[8.890151,50.069229],[8.889866,50.070127],[8.889665,50.07081],[8.889492,50.071509],[8.889366,50.072087],[8.889278,50.072621],[8.889179,50.07327],[8.889103,50.074094],[8.889086,50.074773],[8.889096,50.07523],[8.88912,50.075583],[8.889167,50.076104],[8.88923,50.076567],[8.889314,50.07704],[8.88938,50.077348],[8.889504,50.07784],[8.889587,50.078132],[8.889708,50.078526],[8.889812,50.078827],[8.889952,50.079202],[8.890056,50.079439],[8.890319,50.080035],[8.890651,50.080696],[8.890911,50.081173],[8.891069,50.081424],[8.891456,50.08208],[8.891766,50.082572],[8.89221,50.083285],[8.89266,50.08381],[8.892931,50.084184],[8.894018,50.08564],[8.894894,50.08682],[8.895384,50.087453],[8.895778,50.087935],[8.896054,50.088233],[8.896293,50.088455],[8.896895,50.088945],[8.897009,50.089028],[8.897099,50.089092],[8.897345,50.089243],[8.897701,50.089444],[8.898042,50.089623],[8.898412,50.089793],[8.898809,50.089955],[8.8992,50.09011],[8.899851,50.090354],[8.900538,50.090631],[8.900836,50.090758],[8.901159,50.090898],[8.901362,50.09099],[8.901489,50.091049],[8.901629,50.091114],[8.901832,50.091215],[8.902286,50.091451],[8.902562,50.091601],[8.90284,50.091757],[8.903313,50.092051],[8.903961,50.092486],[8.904297,50.09274],[8.904504,50.092908],[8.904941,50.093327],[8.905083,50.093466],[8.905257,50.093661],[8.905431,50.093862],[8.905568,50.094048],[8.905697,50.094219],[8.905891,50.094517],[8.905984,50.094691],[8.906111,50.094919],[8.906256,50.09521],[8.906429,50.095599],[8.906736,50.096326],[8.906882,50.096642],[8.907033,50.096961],[8.907195,50.097283],[8.907413,50.097661],[8.907572,50.097906],[8.907765,50.098187],[8.90787,50.098326],[8.908077,50.098591],[8.908219,50.098754],[8.908365,50.098919],[8.90861,50.099173],[8.908863,50.099426],[8.909031,50.099569],[8.909339,50.099841],[8.909576,50.100028],[8.909854,50.100247],[8.910137,50.100449],[8.910845,50.100916],[8.91115,50.1011],[8.912029,50.101645],[8.912611,50.101989],[8.914077,50.102866],[8.916022,50.104037],[8.91747,50.104905],[8.924792,50.10928],[8.926763,50.110453],[8.927051,50.110626],[8.92762,50.110968],[8.930068,50.112441],[8.930379,50.112641],[8.931393,50.113249],[8.932447,50.11387],[8.933511,50.114498],[8.933955,50.11479],[8.934423,50.115073],[8.93526,50.115563],[8.936303,50.116108],[8.936482,50.116198],[8.936674,50.11629],[8.936875,50.116384],[8.937093,50.116482],[8.937401,50.116606],[8.937732,50.116727],[8.938032,50.116824],[8.938394,50.116929],[8.938716,50.11701],[8.939111,50.1171],[8.939611,50.117189],[8.93998,50.117244],[8.940358,50.117285],[8.940753,50.11732],[8.941176,50.117345],[8.941714,50.117357],[8.942235,50.117355],[8.942996,50.117348],[8.943607,50.117337],[8.943946,50.117337],[8.944324,50.117353],[8.944582,50.117365],[8.94497,50.117395],[8.945264,50.117427],[8.945474,50.117453],[8.945892,50.11751],[8.946653,50.117668],[8.947018,50.117758],[8.947369,50.117864],[8.947726,50.117979],[8.948056,50.118094],[8.948405,50.118232],[8.948915,50.118463],[8.94925,50.118642],[8.949538,50.118805],[8.949752,50.118939],[8.949988,50.119095],[8.950112,50.119185],[8.950227,50.119272],[8.951109,50.119988],[8.951569,50.120361],[8.951936,50.120631],[8.952399,50.120957],[8.952693,50.12115],[8.953078,50.121381],[8.953726,50.121746],[8.95454,50.122131],[8.95695,50.123263],[8.960415,50.124941],[8.961823,50.125603],[8.963608,50.126466],[8.966242,50.127713],[8.966261,50.127722],[8.96793,50.128515],[8.970452,50.129715],[8.971763,50.130339],[8.975104,50.131991],[8.975732,50.132312],[8.976508,50.132721],[8.977068,50.133024],[8.977613,50.133325],[8.979802,50.134587],[8.981127,50.135422],[8.982481,50.136234],[8.98304,50.136565],[8.983422,50.136774],[8.983769,50.136951],[8.98415,50.137125],[8.984526,50.137279],[8.985034,50.13747],[8.985791,50.137735],[8.986041,50.137823],[8.986485,50.137979],[8.986798,50.138107],[8.987424,50.138338],[8.988135,50.138619],[8.988448,50.138765],[8.988709,50.1389],[8.989071,50.139089],[8.989402,50.139289],[8.98966,50.139449],[8.989855,50.139569],[8.990081,50.139739],[8.990547,50.140098],[8.990866,50.140385],[8.991069,50.140583],[8.991226,50.140739],[8.991574,50.141141],[8.991849,50.141464],[8.992088,50.141775],[8.992212,50.141939],[8.992444,50.142241],[8.992668,50.1425],[8.992908,50.142746],[8.993077,50.14292],[8.993226,50.143064],[8.99352,50.143319],[8.993856,50.143588],[8.994174,50.143824],[8.994566,50.144102],[8.994931,50.144373],[8.996118,50.145007],[8.998624,50.146281],[9.001008,50.147465],[9.002145,50.148047],[9.002649,50.148315],[9.003281,50.148671],[9.004118,50.14914],[9.004921,50.149597],[9.006523,50.150538],[9.007836,50.151359],[9.009429,50.152395],[9.010122,50.152863],[9.010904,50.153411],[9.011645,50.153941],[9.012843,50.154831],[9.013478,50.15534],[9.014074,50.155836],[9.014573,50.156284],[9.015026,50.156712],[9.015775,50.157512],[9.016135,50.157938],[9.016477,50.158379],[9.017051,50.159233],[9.017392,50.159836],[9.017689,50.16044],[9.017878,50.160875],[9.017897,50.160922],[9.017949,50.16107],[9.018044,50.161375],[9.018247,50.16209],[9.018353,50.16258],[9.018481,50.163473],[9.018672,50.164127],[9.018724,50.164306],[9.018796,50.164543],[9.018878,50.164738],[9.018964,50.16492],[9.019104,50.165173],[9.019206,50.165336],[9.019328,50.165516],[9.019445,50.165675],[9.019775,50.166082],[9.020037,50.166393],[9.020202,50.166593],[9.020314,50.16675],[9.020457,50.166954],[9.020539,50.167092],[9.020608,50.167226],[9.02069,50.167397],[9.020767,50.16759],[9.020876,50.167919],[9.020981,50.1682],[9.021064,50.168374],[9.021154,50.16853],[9.021249,50.168691],[9.021355,50.168831],[9.021463,50.16897],[9.021579,50.169091],[9.021713,50.169226],[9.021848,50.169342],[9.021986,50.169455],[9.02212,50.169548],[9.022404,50.169729],[9.022724,50.1699],[9.023,50.170023],[9.023357,50.170155],[9.023646,50.170251],[9.023849,50.170305],[9.024048,50.170359],[9.024405,50.170438],[9.024667,50.170481],[9.025109,50.170554],[9.025494,50.170618],[9.026264,50.170728],[9.027803,50.170955],[9.028721,50.171095],[9.029187,50.171162],[9.029691,50.171227],[9.030084,50.171266],[9.030851,50.171315],[9.031386,50.171336],[9.037118,50.171429],[9.038597,50.171452],[9.040058,50.171475],[9.041488,50.171494],[9.04221,50.171519],[9.043105,50.171568],[9.0437,50.171616],[9.04433,50.17169],[9.045124,50.171809],[9.045622,50.171899],[9.046066,50.171997],[9.046539,50.172111],[9.046976,50.172229],[9.047427,50.172361],[9.047741,50.172463],[9.048141,50.172603],[9.048508,50.172741],[9.048842,50.172879],[9.049549,50.173196],[9.049872,50.173371],[9.050219,50.173559],[9.050492,50.173718],[9.05078,50.173896],[9.051105,50.174106],[9.051449,50.174344],[9.051728,50.174534],[9.052705,50.175263],[9.053714,50.176014],[9.054219,50.176348],[9.054465,50.176512],[9.054744,50.176673],[9.054978,50.176803],[9.055101,50.176871],[9.055449,50.177048],[9.055922,50.177263],[9.056331,50.177426],[9.05674,50.177568],[9.057178,50.17771],[9.057636,50.177837],[9.058124,50.177953],[9.058775,50.178086],[9.059464,50.178214],[9.060917,50.178476],[9.062441,50.178749],[9.064101,50.179052],[9.067417,50.179642],[9.070372,50.180161],[9.071416,50.180336],[9.072951,50.180568],[9.073731,50.180687],[9.074508,50.180812],[9.074964,50.180889],[9.075417,50.180979],[9.075844,50.181077],[9.076291,50.18119],[9.076683,50.18131],[9.07706,50.181429],[9.077415,50.181562],[9.077775,50.181701],[9.078191,50.181888],[9.078395,50.181981],[9.078645,50.182105],[9.078935,50.182258],[9.079205,50.182412],[9.079569,50.182635],[9.079954,50.1829],[9.080535,50.18336],[9.080935,50.18372],[9.082012,50.184728],[9.082447,50.185126],[9.082853,50.185508],[9.083406,50.186028],[9.083965,50.186553],[9.084347,50.186902],[9.084498,50.18704],[9.084636,50.187152],[9.084757,50.187261],[9.084891,50.187369],[9.085068,50.187497],[9.085298,50.187667],[9.08551,50.187809],[9.085732,50.187939],[9.085961,50.188071],[9.086193,50.188195],[9.0864,50.188298],[9.086664,50.188421],[9.086989,50.188559],[9.087238,50.188656],[9.08748,50.188742],[9.087812,50.188853],[9.088091,50.188941],[9.093527,50.190554],[9.095538,50.191153],[9.09651,50.191442],[9.097457,50.191717],[9.097988,50.191865],[9.098508,50.192001],[9.099114,50.192144],[9.099728,50.19227],[9.1003,50.19237],[9.10072,50.192434],[9.101165,50.192492],[9.101626,50.192543],[9.102034,50.192576],[9.10256,50.192614],[9.102878,50.192627],[9.103541,50.192646],[9.104291,50.192652],[9.105042,50.192644],[9.105929,50.192632],[9.10641,50.192625],[9.107017,50.192613],[9.107836,50.192609],[9.108483,50.19261],[9.109723,50.19263],[9.11024,50.192651],[9.110719,50.192674],[9.111245,50.192711],[9.111721,50.192746],[9.112368,50.192796],[9.112771,50.19284],[9.113355,50.192901],[9.113953,50.192977],[9.114577,50.193061],[9.115403,50.193193],[9.116231,50.193338],[9.11699,50.19349],[9.117753,50.193653],[9.118356,50.1938],[9.118925,50.193942],[9.119307,50.194046],[9.119599,50.194127],[9.12019,50.194297],[9.120495,50.194388],[9.120877,50.19451],[9.12123,50.194621],[9.121792,50.194817],[9.122278,50.194987],[9.12271,50.195153],[9.123147,50.195322],[9.123576,50.195496],[9.124001,50.195671],[9.12471,50.195975],[9.125419,50.196289],[9.126314,50.196692],[9.127232,50.197105],[9.127765,50.197341],[9.128317,50.197581],[9.12891,50.197833],[9.129256,50.197977],[9.129621,50.198121],[9.130212,50.198348],[9.130728,50.198539],[9.131207,50.198696],[9.131581,50.198826],[9.13198,50.198949],[9.132371,50.199062],[9.13319,50.199279],[9.133676,50.199392],[9.134082,50.199478],[9.134491,50.199556],[9.134946,50.199636],[9.135388,50.199703],[9.135754,50.199757],[9.136091,50.1998],[9.13642,50.199835],[9.136741,50.199866],[9.137099,50.199897],[9.137961,50.199942],[9.138709,50.199966],[9.13925,50.199967],[9.139513,50.199966],[9.140028,50.199959],[9.140347,50.199947],[9.140622,50.199932],[9.141107,50.199899],[9.141556,50.199862],[9.142103,50.199802],[9.142561,50.199735],[9.143139,50.199662],[9.143513,50.1996],[9.143831,50.199542],[9.144086,50.199492],[9.144792,50.199337],[9.145353,50.1992],[9.145757,50.199093],[9.146196,50.198966],[9.146688,50.198817],[9.147174,50.198659],[9.147626,50.198503],[9.14827,50.198265],[9.148695,50.198101],[9.149129,50.197926],[9.149607,50.197725],[9.150098,50.197514],[9.150637,50.197271],[9.151182,50.197019],[9.152325,50.196468],[9.153455,50.195907],[9.154558,50.195356],[9.155143,50.195064],[9.15567,50.194801],[9.156875,50.1942],[9.158275,50.193501],[9.159055,50.193114],[9.159449,50.192927],[9.159866,50.19273],[9.160306,50.192531],[9.160693,50.19236],[9.161039,50.192213],[9.161422,50.19206],[9.161939,50.19186],[9.162177,50.191777],[9.162494,50.191668],[9.162777,50.191572],[9.163122,50.191467],[9.163467,50.191366],[9.164237,50.191162],[9.164912,50.191006],[9.165606,50.190865],[9.166272,50.190752],[9.166946,50.190644],[9.167314,50.1906],[9.167665,50.190564],[9.168099,50.190532],[9.168583,50.190494],[9.169168,50.190462],[9.169779,50.190444],[9.170489,50.190438],[9.171097,50.190448],[9.171805,50.190481],[9.172528,50.190532],[9.172851,50.190563],[9.173203,50.1906],[9.173898,50.190686],[9.174295,50.190747],[9.174661,50.190807],[9.175052,50.190874],[9.17543,50.190948],[9.176408,50.191153],[9.177413,50.191373],[9.179547,50.191828],[9.181354,50.192219],[9.182035,50.192354],[9.183274,50.19257],[9.183833,50.192668],[9.184143,50.192717],[9.186368,50.193045],[9.186924,50.193126],[9.189565,50.193524],[9.192453,50.193948],[9.192836,50.193998],[9.193265,50.194052],[9.193985,50.194146],[9.194765,50.194239],[9.19641,50.194417],[9.196781,50.194456],[9.198353,50.194607],[9.199148,50.194672],[9.199976,50.194735],[9.201054,50.194815],[9.202407,50.194896],[9.203107,50.194935],[9.203794,50.194969],[9.204343,50.194993],[9.204749,50.195011],[9.205006,50.195019],[9.205942,50.19505],[9.206866,50.19508],[9.207383,50.195102],[9.207848,50.195132],[9.208355,50.195169],[9.208843,50.195214],[9.209298,50.195264],[9.20979,50.195333],[9.210303,50.195417],[9.210806,50.195514],[9.2113,50.195621],[9.211766,50.195735],[9.212221,50.195857],[9.212387,50.195904],[9.212714,50.196005],[9.213124,50.196139],[9.213541,50.196279],[9.214018,50.196455],[9.214538,50.196655],[9.215122,50.196887],[9.215615,50.197086],[9.216486,50.197448],[9.217695,50.197947],[9.220125,50.198957],[9.221137,50.199382],[9.22225,50.199862],[9.223258,50.200345],[9.223694,50.200583],[9.224008,50.200768],[9.224316,50.200959],[9.224803,50.201286],[9.225238,50.201617],[9.225496,50.201829],[9.225717,50.202024],[9.226017,50.202307],[9.226297,50.202607],[9.226578,50.202925],[9.226824,50.20324],[9.227033,50.203539],[9.227239,50.203879],[9.227401,50.204172],[9.227556,50.204469],[9.227866,50.205058],[9.228061,50.205427],[9.228292,50.205784],[9.228435,50.205994],[9.228613,50.206232],[9.22879,50.206445],[9.228974,50.206655],[9.229397,50.207099],[9.229592,50.207268],[9.229779,50.207435],[9.230034,50.207641],[9.230282,50.207829],[9.230542,50.20802],[9.230858,50.208234],[9.231191,50.20845],[9.231749,50.208789],[9.232336,50.20914],[9.233939,50.210081],[9.234654,50.210515],[9.234998,50.210735],[9.235344,50.210959],[9.23581,50.211286],[9.236274,50.211627],[9.236703,50.211971],[9.237155,50.21235],[9.237379,50.212553],[9.237647,50.212804],[9.237975,50.213131],[9.238299,50.213473],[9.238533,50.213736],[9.238654,50.21388],[9.238987,50.214292],[9.239146,50.214497],[9.239299,50.214707],[9.239588,50.215123],[9.240365,50.216408],[9.240806,50.217176],[9.241074,50.217623],[9.241258,50.217922],[9.241455,50.218219],[9.2416,50.218432],[9.241783,50.218692],[9.24211,50.219112],[9.242361,50.219413],[9.242612,50.219682],[9.242867,50.219941],[9.243148,50.220206],[9.243502,50.220511],[9.243818,50.220764],[9.244162,50.221014],[9.244435,50.221204],[9.2448,50.221441],[9.245218,50.22169],[9.245578,50.22189],[9.245937,50.222073],[9.246362,50.222279],[9.246652,50.222408],[9.247009,50.222559],[9.247406,50.222715],[9.24768,50.222816],[9.247947,50.22291],[9.248356,50.223044],[9.248791,50.223176],[9.249238,50.223296],[9.249494,50.223362],[9.249895,50.223458],[9.25033,50.223551],[9.250819,50.223642],[9.251127,50.223692],[9.251623,50.223767],[9.252146,50.223835],[9.252769,50.223904],[9.253607,50.223974],[9.254116,50.224009],[9.254623,50.22404],[9.255626,50.224096],[9.260774,50.224367],[9.265717,50.224627],[9.266625,50.224676],[9.267454,50.224731],[9.267876,50.224765],[9.268299,50.224802],[9.268788,50.224853],[9.269272,50.224913],[9.269688,50.224971],[9.270011,50.22502],[9.270342,50.225077],[9.270664,50.225134],[9.271287,50.225261],[9.271863,50.225394],[9.272404,50.225532],[9.272868,50.225662],[9.273482,50.225849],[9.274016,50.226031],[9.27442,50.226177],[9.274832,50.226331],[9.275684,50.226668],[9.276155,50.226865],[9.27653,50.227022],[9.277194,50.227311],[9.277973,50.227655],[9.27857,50.227934],[9.279387,50.228324],[9.27987,50.22856],[9.28065,50.228953],[9.281351,50.229321],[9.28167,50.229487],[9.281983,50.229661],[9.282415,50.229915],[9.282882,50.230193],[9.283315,50.230476],[9.283735,50.230771],[9.284098,50.231042],[9.284575,50.231429],[9.28499,50.231802],[9.285321,50.232117],[9.285842,50.232652],[9.286392,50.233246],[9.287345,50.234296],[9.287645,50.234602],[9.287764,50.234716],[9.288079,50.235024],[9.288397,50.235325],[9.288583,50.235496],[9.289435,50.236189],[9.289793,50.236457],[9.2901,50.236675],[9.290308,50.236817],[9.290628,50.237035],[9.291124,50.237354],[9.291523,50.237595],[9.292289,50.238023],[9.292741,50.23826],[9.293245,50.238508],[9.293952,50.238838],[9.294522,50.23908],[9.29584,50.239582],[9.297009,50.239988],[9.298148,50.240351],[9.299182,50.240658],[9.300347,50.240971],[9.301438,50.241247],[9.302571,50.241503],[9.303379,50.241673],[9.304158,50.241821],[9.30516,50.242],[9.306161,50.242161],[9.307209,50.242309],[9.308545,50.242467],[9.309241,50.242536],[9.309864,50.242585],[9.310398,50.242617],[9.310895,50.242638],[9.311756,50.242657],[9.312725,50.242648],[9.315966,50.242552],[9.315984,50.242551],[9.317246,50.242547],[9.317973,50.24258],[9.3187,50.24263],[9.319157,50.242675],[9.319645,50.242732],[9.320185,50.242812],[9.32072,50.242905],[9.32116,50.24299],[9.321634,50.243091],[9.322472,50.243308],[9.323162,50.243514],[9.323825,50.243743],[9.324708,50.244097],[9.325332,50.244384],[9.325869,50.244652],[9.326477,50.245009],[9.327147,50.245437],[9.327691,50.245831],[9.328264,50.246311],[9.328773,50.246801],[9.329531,50.247553],[9.330192,50.248165],[9.330533,50.248461],[9.330927,50.248764],[9.331413,50.249122],[9.331989,50.2495],[9.332607,50.249875],[9.33315,50.250176],[9.333748,50.250477],[9.334096,50.250641],[9.335964,50.251482],[9.336941,50.25197],[9.337325,50.25217],[9.337521,50.252282],[9.338003,50.252574],[9.338462,50.252868],[9.339817,50.25381],[9.340494,50.254272],[9.341184,50.254726],[9.34232,50.255457],[9.34307,50.255911],[9.343867,50.256383],[9.344198,50.256579],[9.34552,50.257352],[9.346994,50.258212],[9.348133,50.25888],[9.349283,50.259547],[9.349974,50.259934],[9.350661,50.260295],[9.351305,50.260606],[9.351972,50.260903],[9.35253,50.261132],[9.353018,50.26132],[9.353891,50.261635],[9.354575,50.261867],[9.356172,50.26241],[9.35709,50.262734],[9.35773,50.262975],[9.358182,50.263154],[9.358722,50.263385],[9.359352,50.263677],[9.360025,50.264016],[9.360504,50.264285],[9.360976,50.264558],[9.361471,50.264879],[9.36182,50.265117],[9.362206,50.265396],[9.362639,50.265727],[9.362958,50.265988],[9.363274,50.266247],[9.363722,50.266645],[9.364071,50.266956],[9.364505,50.26735],[9.365003,50.267796],[9.365286,50.268044],[9.365515,50.268232],[9.365711,50.26838],[9.365857,50.268493],[9.366019,50.268608],[9.36636,50.268841],[9.366546,50.268963],[9.366748,50.269089],[9.367303,50.269421],[9.368466,50.270101],[9.368836,50.270327],[9.369334,50.270647],[9.369704,50.270897],[9.369996,50.271108],[9.370043,50.271142],[9.370408,50.271425],[9.370571,50.271558],[9.370928,50.271869],[9.371241,50.272164],[9.371662,50.272597],[9.372055,50.273043],[9.372454,50.273539],[9.373341,50.27464],[9.373595,50.274971],[9.373638,50.275024],[9.374247,50.275784],[9.374774,50.276434],[9.375937,50.277889],[9.376831,50.279007],[9.378904,50.2816],[9.379753,50.282659],[9.380602,50.283724],[9.381441,50.284773],[9.381807,50.285233],[9.382248,50.285789],[9.383058,50.286796],[9.383746,50.287657],[9.383784,50.287707],[9.384231,50.288272],[9.384594,50.288728],[9.385033,50.289251],[9.386267,50.2908],[9.389263,50.294561],[9.391544,50.297424],[9.392316,50.29839],[9.393156,50.299397],[9.393441,50.299716],[9.393842,50.300138],[9.39436,50.300647],[9.394933,50.301171],[9.395529,50.301672],[9.39595,50.302007],[9.396427,50.30237],[9.39688,50.302694],[9.397352,50.303015],[9.397782,50.303293],[9.398323,50.303633],[9.398684,50.303848],[9.399211,50.304149],[9.399759,50.304444],[9.400343,50.304745],[9.400972,50.305049],[9.401386,50.305238],[9.401793,50.305408],[9.402169,50.305558],[9.402578,50.305705],[9.403018,50.305854],[9.403551,50.306014],[9.404026,50.306144],[9.404474,50.306254],[9.404878,50.306345],[9.405288,50.306427],[9.405615,50.306483],[9.405961,50.306539],[9.406302,50.306591],[9.406643,50.306632],[9.407121,50.306686],[9.407387,50.306712],[9.407631,50.306733],[9.408037,50.306762],[9.408287,50.306776],[9.408669,50.306794],[9.409418,50.306817],[9.410154,50.306831],[9.411198,50.306847],[9.412048,50.306865],[9.412528,50.306878],[9.413236,50.306912],[9.413779,50.306947],[9.414471,50.306998],[9.415471,50.307091],[9.41622,50.307171],[9.416742,50.307237],[9.417437,50.307339],[9.418177,50.307456],[9.418706,50.307552],[9.41945,50.307699],[9.419586,50.307727],[9.420139,50.307842],[9.420645,50.307961],[9.421114,50.308081],[9.421291,50.308132],[9.421583,50.308217],[9.421994,50.308344],[9.422434,50.308494],[9.422866,50.308652],[9.423278,50.308816],[9.423699,50.308997],[9.424099,50.309179],[9.424335,50.309299],[9.424546,50.309409],[9.4249,50.309601],[9.425105,50.309723],[9.425557,50.309992],[9.425844,50.310176],[9.426147,50.310384],[9.426365,50.310539],[9.42662,50.310733],[9.426767,50.310846],[9.42699,50.311033],[9.427258,50.311262],[9.427442,50.311432],[9.427616,50.311606],[9.42777,50.311767],[9.427952,50.311973],[9.428102,50.31216],[9.428276,50.312399],[9.428475,50.312681],[9.428603,50.312881],[9.429212,50.313834],[9.429456,50.314199],[9.429577,50.314383],[9.429821,50.314763],[9.429943,50.314949],[9.43038,50.315522],[9.43079,50.315997],[9.430991,50.316212],[9.43129,50.3165],[9.43172,50.316877],[9.432033,50.317141],[9.432184,50.317251],[9.432624,50.317561],[9.433061,50.317851],[9.433638,50.318191],[9.43401,50.318395],[9.43458,50.318675],[9.434791,50.318774],[9.435211,50.318953],[9.435876,50.319218],[9.436492,50.319442],[9.436969,50.319601],[9.437628,50.319818],[9.439256,50.320332],[9.440996,50.320881],[9.442345,50.321345],[9.443072,50.321609],[9.443669,50.32183],[9.444097,50.322004],[9.444489,50.322164],[9.445377,50.322547],[9.446606,50.323108],[9.447069,50.323327],[9.447649,50.323598],[9.447987,50.323761],[9.448321,50.323918],[9.449082,50.324263],[9.449512,50.324448],[9.449719,50.324531],[9.450309,50.324767],[9.450404,50.324804],[9.451122,50.325053],[9.451738,50.325264],[9.452199,50.325421],[9.452442,50.325498],[9.452898,50.325627],[9.453552,50.325796],[9.45426,50.32596],[9.454898,50.326102],[9.455383,50.326191],[9.455794,50.326257],[9.456396,50.326346],[9.456721,50.326391],[9.457073,50.326435],[9.457553,50.326488],[9.457884,50.326518],[9.458172,50.326541],[9.458584,50.326573],[9.458935,50.32659],[9.459356,50.326607],[9.4602,50.326631],[9.461157,50.326645],[9.462529,50.326658],[9.46331,50.326667],[9.463774,50.32668],[9.464207,50.326694],[9.464679,50.326711],[9.465405,50.32675],[9.466131,50.32681],[9.466516,50.326846],[9.466922,50.326886],[9.467595,50.326971],[9.468399,50.327074],[9.469267,50.327214],[9.46995,50.327333],[9.470721,50.327485],[9.471333,50.327612],[9.471909,50.327748],[9.472324,50.327855],[9.472915,50.32801],[9.473393,50.328142],[9.474301,50.328428],[9.475109,50.328704],[9.475784,50.328955],[9.476128,50.32909],[9.476268,50.329141],[9.476463,50.329222],[9.476905,50.329418],[9.477641,50.329746],[9.478471,50.330128],[9.479069,50.330409],[9.480112,50.33092],[9.480616,50.331175],[9.481136,50.331434],[9.481573,50.331667],[9.482117,50.331976],[9.482554,50.332242],[9.482976,50.332502],[9.483303,50.332729],[9.483598,50.332941],[9.483937,50.333212],[9.484261,50.333491],[9.484534,50.333743],[9.484783,50.333992],[9.48502,50.334247],[9.485284,50.334546],[9.485601,50.334959],[9.485824,50.33526],[9.486025,50.335552],[9.486237,50.335876],[9.486502,50.336258],[9.48675,50.336609],[9.48696,50.336889],[9.487106,50.337071],[9.487413,50.337431],[9.487693,50.33773],[9.488038,50.338064],[9.488406,50.338388],[9.48888,50.338761],[9.489194,50.338991],[9.48951,50.339204],[9.489965,50.339497],[9.490454,50.339797],[9.491513,50.340438],[9.492001,50.340732],[9.49201,50.340737],[9.492586,50.341096],[9.493172,50.341501],[9.493575,50.34181],[9.493994,50.342165],[9.494274,50.342418],[9.494543,50.342683],[9.494854,50.343024],[9.495181,50.343399],[9.49577,50.344104],[9.496029,50.344393],[9.496286,50.344665],[9.496542,50.344914],[9.49683,50.345182],[9.497129,50.345447],[9.497437,50.345678],[9.497971,50.346073],[9.498597,50.346523],[9.499191,50.346965],[9.499619,50.347325],[9.50012,50.347777],[9.500561,50.348239],[9.500805,50.34854],[9.501121,50.34896],[9.501426,50.34942],[9.501684,50.349873],[9.50195,50.350431],[9.502165,50.351084],[9.502248,50.351422],[9.502312,50.351736],[9.502354,50.352025],[9.502382,50.35237],[9.50239,50.352688],[9.502381,50.353119],[9.502345,50.353476],[9.502271,50.35392],[9.502183,50.354294],[9.502088,50.354613],[9.501953,50.354996],[9.501801,50.355388],[9.501634,50.355796],[9.501435,50.356245],[9.501074,50.357094],[9.500901,50.357535],[9.500767,50.357936],[9.500677,50.358259],[9.500592,50.358607],[9.500557,50.358807],[9.500498,50.35921],[9.500467,50.359501],[9.500454,50.359755],[9.50045,50.360072],[9.500463,50.360449],[9.500485,50.36072],[9.500554,50.361245],[9.500666,50.361708],[9.500775,50.362154],[9.50089,50.362469],[9.501021,50.362801],[9.501156,50.363115],[9.501366,50.363515],[9.501556,50.36385],[9.501749,50.364158],[9.502004,50.364533],[9.502266,50.364881],[9.502624,50.365306],[9.502983,50.365697],[9.503396,50.366098],[9.503718,50.366392],[9.504299,50.366875],[9.504888,50.367334],[9.505508,50.367785],[9.506121,50.368215],[9.506461,50.368444],[9.507527,50.369165],[9.508107,50.369555],[9.508672,50.369943],[9.509268,50.37035],[9.509888,50.370771],[9.510173,50.370968],[9.510558,50.371235],[9.511361,50.371821],[9.51176,50.372133],[9.512162,50.372459],[9.512518,50.372768],[9.512821,50.373048],[9.513162,50.373366],[9.51343,50.373637],[9.51397,50.374209],[9.514348,50.374648],[9.51475,50.375143],[9.515108,50.375619],[9.515439,50.376065],[9.515869,50.376648],[9.51632,50.377216],[9.51661,50.377554],[9.516942,50.377887],[9.517227,50.378156],[9.517527,50.378429],[9.518022,50.378866],[9.518427,50.379183],[9.518776,50.379437],[9.51933,50.37981],[9.519655,50.380018],[9.519993,50.380224],[9.520579,50.380544],[9.52115,50.380821],[9.521638,50.381059],[9.522081,50.381243],[9.522595,50.381453],[9.524071,50.382042],[9.524536,50.382237],[9.524821,50.382361],[9.525582,50.382732],[9.526116,50.383026],[9.526576,50.383294],[9.526987,50.383565],[9.527405,50.383858],[9.527664,50.384045],[9.527905,50.384243],[9.52815,50.384459],[9.528438,50.384717],[9.528894,50.385136],[9.530122,50.386257],[9.53116,50.387224],[9.532849,50.388768],[9.533396,50.389271],[9.534946,50.390689],[9.535874,50.39149],[9.536341,50.391869],[9.536652,50.392114],[9.536814,50.392232],[9.537132,50.392451],[9.537741,50.392876],[9.5382,50.39318],[9.538679,50.393476],[9.539291,50.393842],[9.539875,50.394166],[9.540437,50.394462],[9.541022,50.394759],[9.541466,50.394966],[9.542042,50.395234],[9.542891,50.395601],[9.5444,50.39619],[9.54661,50.397022],[9.547351,50.397295],[9.550234,50.398362],[9.551172,50.398766],[9.552112,50.399252],[9.553092,50.399825],[9.554217,50.400479],[9.555009,50.400891],[9.555951,50.401292],[9.556784,50.40159],[9.556805,50.401597],[9.557464,50.401798],[9.558079,50.40197],[9.559177,50.402236],[9.561251,50.402692],[9.56235,50.402967],[9.563091,50.403183],[9.563821,50.403428],[9.564481,50.403675],[9.564949,50.403879],[9.565173,50.403977],[9.56605,50.404419],[9.566678,50.404788],[9.567427,50.405295],[9.568043,50.405784],[9.568465,50.406161],[9.568883,50.406594],[9.569234,50.407],[9.569524,50.407393],[9.569796,50.407803],[9.569968,50.408103],[9.570331,50.408864],[9.570527,50.409437],[9.570717,50.410167],[9.571019,50.411602],[9.571586,50.414384],[9.571771,50.415057],[9.57198,50.415646],[9.57221,50.416171],[9.572437,50.416578],[9.572563,50.416786],[9.572842,50.417188],[9.573168,50.417595],[9.573456,50.417917],[9.573845,50.418296],[9.573988,50.418425],[9.574465,50.418818],[9.574999,50.419208],[9.575415,50.419487],[9.576197,50.41998],[9.577799,50.420912],[9.579524,50.421924],[9.581442,50.423112],[9.582376,50.423763],[9.583534,50.424677],[9.584082,50.425151],[9.584693,50.42572],[9.585817,50.426834],[9.58809,50.429201],[9.588405,50.429503],[9.589856,50.430976],[9.59262,50.433762],[9.5931,50.43423],[9.593761,50.434785],[9.594312,50.435173],[9.595108,50.4357],[9.596014,50.436293],[9.596318,50.436483],[9.597935,50.437549],[9.598379,50.437841],[9.599577,50.438617],[9.599845,50.438799],[9.600078,50.438949],[9.601277,50.439705],[9.602519,50.440368],[9.603341,50.44079],[9.604344,50.441266],[9.604615,50.441394],[9.604975,50.441563],[9.605611,50.44186],[9.606429,50.442265],[9.606606,50.44235],[9.60666,50.442373],[9.607294,50.442679],[9.607962,50.442991],[9.608608,50.443277],[9.609136,50.44352],[9.610603,50.444208],[9.610685,50.444244],[9.611336,50.444566],[9.611557,50.444676],[9.611841,50.444813],[9.61263,50.445273],[9.613712,50.445856],[9.614843,50.446634],[9.61611,50.447652],[9.616924,50.448494],[9.61747,50.449093],[9.617847,50.449566],[9.618404,50.450326],[9.618929,50.451158],[9.619692,50.452211],[9.621377,50.454552],[9.621986,50.455421],[9.622575,50.456227],[9.623386,50.45717],[9.624054,50.457803],[9.624186,50.457928],[9.62462,50.458294],[9.625098,50.458674],[9.625863,50.459201],[9.626468,50.459564],[9.627147,50.459949],[9.627658,50.460219],[9.629013,50.460806],[9.630646,50.461494],[9.632266,50.462141],[9.632478,50.462228],[9.63714,50.464105],[9.637433,50.464225],[9.6393,50.464932],[9.640226,50.465323],[9.641026,50.465629],[9.642965,50.466453],[9.643774,50.466805],[9.644518,50.46711],[9.645961,50.467762],[9.647442,50.468418],[9.64789,50.468614],[9.649451,50.469355],[9.650714,50.46996],[9.652019,50.470602],[9.652371,50.470774],[9.653271,50.471223],[9.653407,50.471289],[9.654153,50.471633],[9.654932,50.471977],[9.656005,50.472407],[9.657152,50.472859],[9.659737,50.473907],[9.66207,50.474848],[9.662541,50.475037],[9.663044,50.47526],[9.663926,50.475655],[9.664262,50.475815],[9.664704,50.476035],[9.665349,50.476367],[9.665722,50.476563],[9.666267,50.476857],[9.667098,50.477341],[9.667932,50.477861],[9.668752,50.478389],[9.66889,50.478475],[9.670999,50.479907],[9.671407,50.480188],[9.673897,50.481966],[9.674574,50.482456],[9.67467,50.482525],[9.675254,50.482921],[9.675847,50.48328],[9.676251,50.48351],[9.676743,50.483778],[9.677375,50.484086],[9.677741,50.484251],[9.678398,50.484528],[9.678767,50.48468],[9.679155,50.484814],[9.680181,50.485154],[9.680979,50.48539],[9.681653,50.485578],[9.682217,50.485708],[9.682793,50.485829],[9.683457,50.485962],[9.684277,50.486114],[9.684892,50.486222],[9.685451,50.486317],[9.686479,50.486508],[9.687789,50.486788],[9.688925,50.487046],[9.689592,50.487211],[9.690507,50.487435],[9.691113,50.487577],[9.693637,50.488104],[9.695142,50.488418],[9.700236,50.489487],[9.701388,50.489722],[9.701732,50.489786],[9.701856,50.489805],[9.702106,50.48984],[9.702779,50.489919],[9.703088,50.489948],[9.703377,50.489972],[9.703626,50.489983],[9.703946,50.489996],[9.70436,50.490006],[9.704776,50.490002],[9.705031,50.489995],[9.705276,50.489986],[9.705525,50.489971],[9.705807,50.489952],[9.70622,50.489918],[9.706616,50.489874],[9.707026,50.489818],[9.707472,50.489745],[9.707801,50.489685],[9.708132,50.489616],[9.708526,50.489524],[9.709003,50.48939],[9.709758,50.489153],[9.710063,50.489046],[9.710325,50.488942],[9.710847,50.48873],[9.711325,50.488517],[9.71218,50.488132],[9.712686,50.48792],[9.71318,50.487746],[9.713568,50.487631],[9.713958,50.487538],[9.714329,50.487469],[9.714677,50.487426],[9.714929,50.487404],[9.715286,50.487388],[9.715702,50.487394],[9.716084,50.487418],[9.716389,50.487453],[9.716707,50.487503],[9.717003,50.487563],[9.717344,50.487656],[9.717617,50.487744],[9.717953,50.487873],[9.718272,50.488023],[9.718513,50.488148],[9.71878,50.488322],[9.719029,50.4885],[9.719233,50.488683],[9.719412,50.488859],[9.719575,50.489069],[9.71971,50.48928],[9.719815,50.489478],[9.71989,50.489675],[9.719943,50.489899],[9.719971,50.490121],[9.719964,50.490569],[9.719972,50.490738],[9.719991,50.490865],[9.720082,50.491185],[9.72019,50.491428],[9.720278,50.491597],[9.720427,50.491837],[9.720583,50.492038],[9.720843,50.492304],[9.721177,50.492575],[9.721518,50.492868],[9.722209,50.493332],[9.722787,50.493704],[9.722931,50.493796],[9.723635,50.49423],[9.724355,50.494659],[9.727084,50.496301],[9.727904,50.496803],[9.72873,50.497327],[9.729551,50.497885],[9.730859,50.498834],[9.732098,50.499804],[9.73421,50.501692],[9.735858,50.503543],[9.736412,50.504241],[9.737448,50.505622],[9.738167,50.506723],[9.738878,50.508159],[9.739345,50.509166],[9.739881,50.510555],[9.740112,50.511289],[9.740267,50.511947],[9.740445,50.512759],[9.740447,50.512769],[9.740583,50.513579],[9.740798,50.515082],[9.740828,50.51595],[9.740826,50.516176],[9.740781,50.517409],[9.740545,50.519087],[9.740423,50.519948],[9.740101,50.52117],[9.739734,50.522285],[9.739269,50.523479],[9.73879,50.524493],[9.738384,50.525273],[9.737898,50.526094],[9.737013,50.52748],[9.736408,50.528341],[9.73592,50.52896],[9.734938,50.530205],[9.733854,50.531575],[9.732813,50.533007],[9.732163,50.534032],[9.731563,50.535163],[9.731033,50.536422],[9.730689,50.537731],[9.730402,50.539051],[9.730305,50.540347],[9.730382,50.542188],[9.730554,50.543492],[9.730636,50.544014],[9.73104,50.546279],[9.731221,50.547392],[9.731326,50.548206],[9.731439,50.549125],[9.731499,50.549996],[9.731533,50.550825],[9.731515,50.551634],[9.731477,50.552946],[9.731404,50.553724],[9.731348,50.554181],[9.731216,50.55509],[9.73115,50.555467],[9.731097,50.555771],[9.730875,50.556765],[9.730759,50.557227],[9.730554,50.557938],[9.73032,50.558687],[9.729918,50.559811],[9.729463,50.560918],[9.729162,50.561682],[9.728986,50.56203],[9.728088,50.56371],[9.726938,50.565558],[9.72474,50.568539],[9.723173,50.570249],[9.721588,50.571905],[9.720125,50.573315],[9.718556,50.57472],[9.71759,50.575545],[9.716414,50.576535],[9.715491,50.577295],[9.714359,50.578138],[9.713501,50.57875],[9.711054,50.580408],[9.709227,50.581582],[9.708277,50.58216],[9.707927,50.582382],[9.707482,50.582652],[9.705644,50.583688],[9.703665,50.584758],[9.702792,50.585196],[9.699271,50.586961],[9.697784,50.587641],[9.694709,50.589157],[9.693012,50.590011],[9.692153,50.590472],[9.68977,50.591843],[9.688547,50.592585],[9.687167,50.593524],[9.686044,50.59433],[9.683766,50.596322],[9.68295,50.597242],[9.682212,50.598201],[9.681639,50.599162],[9.681175,50.600142],[9.680897,50.600863],[9.680692,50.601608],[9.680559,50.602359],[9.680486,50.603125],[9.680477,50.603719],[9.680531,50.604493],[9.680554,50.604626],[9.680656,50.605183],[9.680889,50.606113],[9.681393,50.607455],[9.681904,50.608785],[9.682265,50.609852],[9.682541,50.610887],[9.68269,50.611812],[9.682762,50.612594],[9.682731,50.613461],[9.68265,50.614144],[9.68254,50.614767],[9.682355,50.615421],[9.681997,50.61635],[9.681426,50.617462],[9.680622,50.618726],[9.67918,50.620918],[9.678183,50.622387],[9.677878,50.622888],[9.677583,50.623331],[9.677252,50.62393],[9.677004,50.624506],[9.676534,50.625856],[9.676323,50.626637],[9.676184,50.627379],[9.676121,50.627813],[9.676103,50.628257],[9.676117,50.628769],[9.676159,50.629256],[9.676186,50.629524],[9.676244,50.629897],[9.676315,50.630254],[9.676453,50.630791],[9.676611,50.631305],[9.676781,50.631795],[9.67698,50.632236],[9.677196,50.632701],[9.677481,50.63322],[9.677804,50.633763],[9.678389,50.634642],[9.678916,50.635371],[9.679433,50.63607],[9.680477,50.637509],[9.680778,50.637961],[9.681318,50.63882],[9.681642,50.639426],[9.681942,50.640044],[9.682127,50.640468],[9.68237,50.64112],[9.682592,50.641776],[9.682754,50.642394],[9.682875,50.64301],[9.682964,50.643604],[9.682997,50.643866],[9.683042,50.644684],[9.683044,50.645394],[9.68302,50.645933],[9.682965,50.646433],[9.682905,50.646907],[9.682815,50.647365],[9.682685,50.647906],[9.682573,50.648334],[9.682367,50.648968],[9.682167,50.649541],[9.681942,50.650114],[9.68169,50.650678],[9.681205,50.651725],[9.680405,50.653275],[9.680102,50.653833],[9.678993,50.655941],[9.67837,50.65725],[9.677998,50.658176],[9.677809,50.65869],[9.677368,50.660038],[9.677245,50.660461],[9.677139,50.660877],[9.676947,50.661776],[9.676854,50.662343],[9.676723,50.663373],[9.676677,50.663961],[9.676656,50.66435],[9.676646,50.665561],[9.676679,50.666307],[9.676773,50.667273],[9.676837,50.667776],[9.676913,50.668289],[9.67704,50.668935],[9.677176,50.66955],[9.677462,50.670555],[9.677792,50.671555],[9.678015,50.672139],[9.678268,50.672744],[9.678794,50.67391],[9.67934,50.675023],[9.679416,50.675191],[9.680038,50.676312],[9.681067,50.678384],[9.681204,50.678659],[9.682343,50.681332],[9.682732,50.682367],[9.682998,50.683397],[9.683242,50.684707],[9.68345,50.685823],[9.68354,50.686742],[9.683552,50.686999],[9.683577,50.68754],[9.683577,50.687574],[9.683584,50.687807],[9.683623,50.688393],[9.68344,50.690861],[9.683219,50.692127],[9.68296,50.693354],[9.682287,50.695571],[9.681847,50.696656],[9.681365,50.697731],[9.680699,50.698941],[9.679968,50.70012],[9.679617,50.700643],[9.67933,50.701034],[9.679023,50.701431],[9.678699,50.701832],[9.678472,50.702103],[9.678232,50.702377],[9.677223,50.703456],[9.676207,50.704433],[9.675844,50.704756],[9.675039,50.705473],[9.673997,50.706271],[9.673417,50.706681],[9.672859,50.707076],[9.671649,50.707838],[9.670306,50.708611],[9.667724,50.70994],[9.66772,50.709942],[9.666571,50.71053],[9.665197,50.711228],[9.664933,50.711356],[9.664289,50.711673],[9.664071,50.711775],[9.660738,50.713447],[9.657872,50.715054],[9.656761,50.715758],[9.654528,50.717342],[9.653524,50.718179],[9.652621,50.71905],[9.65183,50.719885],[9.651069,50.720808],[9.650177,50.721966],[9.649369,50.723184],[9.648824,50.724204],[9.64836,50.725072],[9.648014,50.725833],[9.647567,50.726932],[9.647209,50.727866],[9.646053,50.730744],[9.64569,50.731614],[9.645256,50.732567],[9.644811,50.733479],[9.644093,50.7349],[9.642999,50.736584],[9.64299,50.736598],[9.640884,50.739315],[9.640727,50.739482],[9.638873,50.741448],[9.636681,50.743548],[9.634507,50.745326],[9.633234,50.74627],[9.631607,50.74745],[9.630382,50.748328],[9.627604,50.750113],[9.626711,50.750667],[9.623663,50.75238],[9.620516,50.753989],[9.61718,50.755519],[9.614586,50.756586],[9.61283,50.757242],[9.610997,50.757891],[9.607344,50.759079],[9.605031,50.759766],[9.604257,50.759986],[9.603509,50.760192],[9.603109,50.760315],[9.601761,50.76066],[9.600333,50.761032],[9.599086,50.761364],[9.598431,50.761547],[9.597249,50.761907],[9.596563,50.762131],[9.595902,50.76237],[9.595468,50.76254],[9.595081,50.7627],[9.594575,50.76293],[9.594004,50.763209],[9.593492,50.763488],[9.593063,50.763745],[9.592612,50.764037],[9.592207,50.764328],[9.591846,50.764613],[9.591504,50.764897],[9.590897,50.765474],[9.590429,50.766013],[9.589882,50.766777],[9.589699,50.767083],[9.58953,50.767404],[9.58936,50.767755],[9.589215,50.768123],[9.589025,50.768795],[9.588739,50.770236],[9.588557,50.771437],[9.588452,50.772049],[9.588267,50.77263],[9.587944,50.773293],[9.587581,50.773889],[9.587373,50.774164],[9.587125,50.774458],[9.586893,50.774717],[9.586631,50.774975],[9.58647,50.775137],[9.586256,50.775317],[9.585719,50.775733],[9.585343,50.775991],[9.585101,50.776147],[9.58493,50.776249],[9.584595,50.776447],[9.584375,50.77657],[9.584131,50.776693],[9.583738,50.776883],[9.583287,50.777069],[9.582979,50.777192],[9.582606,50.777326],[9.581971,50.777538],[9.581556,50.777657],[9.580929,50.777816],[9.580556,50.777898],[9.58016,50.777979],[9.579683,50.778059],[9.579236,50.778123],[9.578765,50.778179],[9.578084,50.778249],[9.576963,50.778365],[9.576348,50.778429],[9.575669,50.778523],[9.574981,50.778644],[9.574406,50.778766],[9.573852,50.778913],[9.573517,50.779011],[9.573059,50.779158],[9.572652,50.779305],[9.572272,50.779458],[9.571846,50.779642],[9.57143,50.779837],[9.570943,50.780099],[9.570434,50.780389],[9.56995,50.780682],[9.568956,50.781299],[9.568486,50.781562],[9.567989,50.781819],[9.567525,50.782035],[9.566975,50.782263],[9.566479,50.782445],[9.565976,50.782609],[9.565501,50.782749],[9.56498,50.782881],[9.564441,50.782995],[9.56389,50.783092],[9.563396,50.783168],[9.562818,50.783239],[9.562326,50.783282],[9.561847,50.783316],[9.561048,50.78336],[9.560253,50.783399],[9.559566,50.783446],[9.558933,50.783497],[9.558378,50.783554],[9.55802,50.783604],[9.557728,50.783651],[9.557334,50.783722],[9.556905,50.783809],[9.556541,50.78389],[9.556157,50.78399],[9.555702,50.784123],[9.555251,50.784267],[9.554804,50.784434],[9.554382,50.784602],[9.553892,50.784823],[9.553751,50.784888],[9.553257,50.785136],[9.552528,50.785565],[9.551886,50.786039],[9.551212,50.78664],[9.55087,50.786955],[9.550571,50.787289],[9.550302,50.78764],[9.550046,50.787995],[9.549588,50.78882],[9.54928,50.789437],[9.549122,50.789889],[9.548997,50.79031],[9.548797,50.791042],[9.548657,50.79156],[9.548496,50.792106],[9.548344,50.792543],[9.548167,50.792982],[9.548067,50.793194],[9.547934,50.793475],[9.547762,50.793774],[9.547566,50.794082],[9.547344,50.794408],[9.547101,50.794727],[9.546881,50.794981],[9.546607,50.79529],[9.546297,50.795604],[9.54613,50.795767],[9.545509,50.796302],[9.545037,50.79665],[9.544465,50.797029],[9.544003,50.797311],[9.54335,50.797673],[9.542606,50.798026],[9.54192,50.798303],[9.541225,50.798592],[9.540288,50.798923],[9.539418,50.799241],[9.538571,50.799575],[9.537898,50.799884],[9.53754,50.800074],[9.537177,50.800293],[9.536863,50.80051],[9.536676,50.80065],[9.536478,50.800799],[9.536145,50.801108],[9.535845,50.801444],[9.535557,50.801813],[9.535349,50.802125],[9.535183,50.802417],[9.535086,50.802633],[9.53499,50.802894],[9.534922,50.803119],[9.534868,50.803387],[9.534838,50.803719],[9.534838,50.80411],[9.53486,50.804345],[9.534927,50.804656],[9.53502,50.804955],[9.535102,50.805173],[9.535244,50.80546],[9.535394,50.805739],[9.53554,50.805989],[9.535796,50.806321],[9.536039,50.806634],[9.537026,50.807739],[9.537432,50.808167],[9.537911,50.808623],[9.538975,50.809708],[9.53921,50.809925],[9.539545,50.810251],[9.540601,50.811207],[9.541551,50.812007],[9.542433,50.812726],[9.54286,50.813069],[9.543238,50.813425],[9.543275,50.813452],[9.543557,50.813667],[9.544037,50.813978],[9.544473,50.814269],[9.544768,50.814464],[9.54513,50.814693],[9.54567,50.815021],[9.546514,50.815483],[9.54997,50.817369],[9.550558,50.817654],[9.55119,50.817898],[9.551957,50.81813],[9.552487,50.818266],[9.552847,50.818338],[9.553232,50.818409],[9.553586,50.818455],[9.554106,50.818514],[9.554742,50.818549],[9.555359,50.818558],[9.555772,50.81855],[9.556246,50.818517],[9.556879,50.818457],[9.557502,50.818379],[9.558673,50.818245],[9.559219,50.8182],[9.559802,50.818179],[9.560429,50.818179],[9.560766,50.818192],[9.56125,50.81821],[9.561654,50.818252],[9.562151,50.818311],[9.562637,50.818391],[9.563042,50.818469],[9.563349,50.818536],[9.563762,50.81865],[9.564409,50.81886],[9.565109,50.819131],[9.566004,50.819495],[9.566826,50.819847],[9.567255,50.820047],[9.568046,50.820451],[9.56863,50.820788],[9.569175,50.82115],[9.569544,50.821419],[9.570011,50.82181],[9.570441,50.822235],[9.570801,50.822637],[9.571028,50.822926],[9.571274,50.823297],[9.571415,50.82354],[9.571586,50.823877],[9.571853,50.824441],[9.572095,50.824917],[9.572651,50.825988],[9.572993,50.826619],[9.573382,50.82733],[9.573574,50.827656],[9.573764,50.827949],[9.574061,50.828395],[9.574475,50.828954],[9.575081,50.829723],[9.575712,50.830539],[9.576238,50.831203],[9.576401,50.831408],[9.576858,50.832001],[9.576994,50.832172],[9.577085,50.832283],[9.577523,50.832854],[9.578074,50.833553],[9.578241,50.833767],[9.578399,50.833983],[9.578549,50.834201],[9.57869,50.834422],[9.578822,50.834645],[9.578944,50.83487],[9.579002,50.834977],[9.579104,50.83517],[9.579329,50.835594],[9.579408,50.835743],[9.580068,50.836614],[9.580294,50.836923],[9.580499,50.83719],[9.580731,50.837494],[9.581058,50.837863],[9.58128,50.838088],[9.581558,50.83831],[9.581806,50.838469],[9.582126,50.838637],[9.582457,50.838787],[9.582821,50.838924],[9.583186,50.839029],[9.58363,50.839136],[9.584487,50.839323],[9.584998,50.839433],[9.585277,50.839476],[9.585822,50.839572],[9.586418,50.839668],[9.587189,50.839812],[9.587942,50.839967],[9.58956,50.840351],[9.590821,50.84062],[9.592133,50.840799],[9.59345,50.84086],[9.594743,50.840787],[9.596041,50.840563],[9.597187,50.840278],[9.598624,50.839905],[9.600061,50.839634],[9.600784,50.839538],[9.601511,50.839462],[9.602267,50.839429],[9.603009,50.839407],[9.604002,50.839463],[9.60479,50.839534],[9.605766,50.839656],[9.60679,50.839824],[9.607886,50.840067],[9.608985,50.840322],[9.609916,50.840516],[9.610621,50.840663],[9.611189,50.840757],[9.611787,50.840831],[9.612693,50.840917],[9.613422,50.840958],[9.614265,50.840976],[9.615062,50.840987],[9.616263,50.840995],[9.616992,50.841013],[9.617728,50.841067],[9.61883,50.841212],[9.619789,50.841406],[9.620699,50.841674],[9.621204,50.841871],[9.621746,50.842114],[9.622719,50.842622],[9.623374,50.842981],[9.623984,50.843301],[9.625425,50.844144],[9.627526,50.845296],[9.628551,50.845837],[9.629446,50.846255],[9.629762,50.846392],[9.630078,50.846529],[9.630657,50.846772],[9.631483,50.847067],[9.632459,50.84738],[9.633956,50.847768],[9.635867,50.848128],[9.637088,50.848362],[9.637983,50.848536],[9.638324,50.848592],[9.639303,50.848764],[9.640045,50.84888],[9.640542,50.848944],[9.641063,50.848983],[9.641537,50.849007],[9.642056,50.849011],[9.642627,50.848999],[9.643454,50.848928],[9.644224,50.848809],[9.644703,50.848705],[9.645137,50.848582],[9.645598,50.848436],[9.647001,50.847919],[9.647006,50.847917],[9.647965,50.847534],[9.648921,50.847187],[9.649439,50.847033],[9.649902,50.846906],[9.650446,50.84678],[9.650905,50.846691],[9.652129,50.846523],[9.653349,50.846397],[9.655808,50.846163],[9.657164,50.84604],[9.658288,50.845957],[9.659988,50.84586],[9.661032,50.845828],[9.661958,50.845828],[9.662629,50.845839],[9.663356,50.845884],[9.664862,50.845989],[9.666595,50.8461],[9.667337,50.846158],[9.667857,50.846193],[9.668702,50.84625],[9.66871,50.846251],[9.669778,50.846337],[9.670446,50.846386],[9.672808,50.846561],[9.673375,50.846624],[9.674026,50.846726],[9.674596,50.846821],[9.675307,50.846985],[9.675781,50.847103],[9.676438,50.847301],[9.676795,50.847423],[9.677822,50.847826],[9.679085,50.848355],[9.680345,50.848863],[9.681056,50.849096],[9.681692,50.849274],[9.682237,50.849409],[9.682738,50.849502],[9.683651,50.849687],[9.68444,50.849837],[9.685452,50.850029],[9.686701,50.850266],[9.687833,50.85049],[9.691066,50.851116],[9.692387,50.851376],[9.694691,50.85181],[9.695815,50.852029],[9.697308,50.852329],[9.69841,50.852533],[9.699199,50.852686],[9.699846,50.852802],[9.700337,50.852886],[9.700931,50.852961],[9.701871,50.853059],[9.702091,50.85307],[9.70294,50.853113],[9.703409,50.853118],[9.703851,50.853121],[9.704422,50.85312],[9.706239,50.85312],[9.70811,50.853127],[9.709011,50.853131],[9.709385,50.853132],[9.710869,50.853143],[9.711748,50.853151],[9.712551,50.853176],[9.71498,50.853245],[9.715378,50.853255],[9.715743,50.853265],[9.718466,50.853362],[9.71885,50.853374],[9.71929,50.853389],[9.720439,50.853424],[9.721263,50.853452],[9.721788,50.853468],[9.722042,50.853475],[9.722592,50.853491],[9.723032,50.853508],[9.724288,50.853538],[9.724589,50.85355],[9.724807,50.853554],[9.726809,50.853634],[9.727318,50.853671],[9.728085,50.853772],[9.728589,50.853866],[9.729181,50.853998],[9.729528,50.854091],[9.730106,50.854266],[9.730621,50.854466],[9.731537,50.854867],[9.732954,50.855523],[9.733315,50.85568],[9.733527,50.855772],[9.733986,50.855935],[9.734632,50.856128],[9.735393,50.856302],[9.736026,50.85641],[9.736565,50.856488],[9.737257,50.856537],[9.737912,50.856557],[9.738566,50.856545],[9.739233,50.856494],[9.739867,50.856424],[9.740514,50.856308],[9.742444,50.855915],[9.743669,50.855662],[9.744659,50.855458],[9.745143,50.855368],[9.745648,50.855299],[9.746166,50.855236],[9.746675,50.855184],[9.7477,50.855133],[9.748742,50.855154],[9.749902,50.855242],[9.751007,50.855392],[9.75173,50.855534],[9.752472,50.85571],[9.754079,50.856202],[9.754989,50.856481],[9.755854,50.856743],[9.756388,50.856885],[9.756788,50.856974],[9.75729,50.857062],[9.757833,50.857137],[9.75833,50.857177],[9.75881,50.857208],[9.759308,50.857218],[9.759782,50.857203],[9.76028,50.857182],[9.761372,50.857135],[9.763074,50.857062],[9.763652,50.857062],[9.764163,50.857078],[9.764827,50.857125],[9.765413,50.857187],[9.765834,50.857252],[9.766323,50.857348],[9.766786,50.857443],[9.767251,50.857554],[9.767797,50.857712],[9.76832,50.857879],[9.768857,50.858089],[9.76949,50.858372],[9.770091,50.858689],[9.770512,50.858937],[9.771015,50.859289],[9.771514,50.859657],[9.773278,50.860988],[9.773824,50.861403],[9.774288,50.861726],[9.774845,50.862046],[9.775441,50.862339],[9.776088,50.8626],[9.776551,50.862762],[9.77728,50.862953],[9.778473,50.863199],[9.779655,50.863431],[9.780995,50.863697],[9.781496,50.863842],[9.781961,50.863989],[9.78266,50.864253],[9.78325,50.864522],[9.7837,50.864768],[9.784148,50.865053],[9.784585,50.865375],[9.78498,50.865706],[9.785304,50.866025],[9.785526,50.866271],[9.78579,50.866606],[9.786085,50.867106],[9.786229,50.86741],[9.786361,50.867819],[9.786422,50.868051],[9.786475,50.868343],[9.786499,50.868611],[9.786494,50.868892],[9.78649,50.869182],[9.786463,50.869898],[9.786445,50.870371],[9.786476,50.870898],[9.78652,50.871223],[9.786629,50.871661],[9.786804,50.872101],[9.787,50.872469],[9.787184,50.872773],[9.787389,50.87306],[9.787625,50.873351],[9.787882,50.873632],[9.788305,50.874041],[9.788717,50.874385],[9.789259,50.8748],[9.790441,50.875746],[9.791635,50.876697],[9.792912,50.877682],[9.793209,50.877888],[9.793503,50.878083],[9.793879,50.878303],[9.794308,50.878527],[9.794798,50.878763],[9.795631,50.879118],[9.797735,50.880016],[9.79979,50.8809],[9.800765,50.881304],[9.802116,50.881863],[9.803577,50.882481],[9.805104,50.883083],[9.805855,50.883348],[9.807499,50.883896],[9.809267,50.884433],[9.810324,50.8847],[9.811157,50.884913],[9.812413,50.885185],[9.8136,50.885426],[9.814513,50.885607],[9.815567,50.88576],[9.816565,50.885904],[9.817787,50.886023],[9.819794,50.886194],[9.821194,50.886306],[9.822564,50.886396],[9.824854,50.886507],[9.82641,50.886564],[9.828153,50.886649],[9.831043,50.886775],[9.833152,50.886914],[9.835213,50.887132],[9.837429,50.887498],[9.838055,50.887617],[9.840078,50.888037],[9.841478,50.888349],[9.84231,50.888545],[9.84325,50.888835],[9.843277,50.888843],[9.844011,50.889056],[9.845167,50.889446],[9.845808,50.889685],[9.846688,50.890016],[9.847889,50.890505],[9.849441,50.891205],[9.850513,50.891682],[9.851228,50.892051],[9.852251,50.89261],[9.853762,50.893456],[9.854256,50.893729],[9.854501,50.893864],[9.854813,50.894036],[9.855186,50.894242],[9.85563,50.89448],[9.855983,50.894668],[9.85632,50.89485],[9.856875,50.895153],[9.857353,50.89544],[9.857734,50.895631],[9.858505,50.896018],[9.859229,50.896371],[9.860625,50.896985],[9.861085,50.897169],[9.863606,50.898092],[9.864722,50.898499],[9.865499,50.8988],[9.866184,50.899075],[9.867133,50.89946],[9.868922,50.900213],[9.869817,50.900617],[9.870981,50.901196],[9.871454,50.901418],[9.874111,50.902583],[9.874511,50.902757],[9.875296,50.903103],[9.87588,50.903377],[9.876349,50.903636],[9.876852,50.903923],[9.877074,50.904072],[9.877476,50.904351],[9.877844,50.904646],[9.878153,50.904918],[9.878635,50.905393],[9.878972,50.905771],[9.87937,50.906243],[9.879707,50.906651],[9.880526,50.907631],[9.880981,50.90814],[9.881328,50.908493],[9.881838,50.908924],[9.882352,50.909295],[9.882845,50.909609],[9.88308,50.909741],[9.883468,50.90995],[9.883887,50.910152],[9.884321,50.91035],[9.884761,50.910528],[9.885701,50.910881],[9.887445,50.911533],[9.889201,50.9122],[9.890094,50.912532],[9.890895,50.912858],[9.891781,50.913297],[9.892169,50.913513],[9.892723,50.913867],[9.893757,50.914577],[9.894635,50.915179],[9.895482,50.915763],[9.895873,50.916012],[9.896289,50.916255],[9.896851,50.916529],[9.897433,50.916771],[9.897949,50.91695],[9.898405,50.917081],[9.898875,50.917198],[9.900158,50.917508],[9.901252,50.917767],[9.901979,50.917958],[9.902871,50.918257],[9.903676,50.918565],[9.905057,50.919082],[9.90584,50.919405],[9.90634,50.919635],[9.906739,50.919812],[9.907752,50.920294],[9.908666,50.920768],[9.909318,50.921117],[9.909659,50.921293],[9.909932,50.921436],[9.91055,50.921715],[9.91106,50.921958],[9.91144,50.922189],[9.911729,50.922395],[9.912116,50.922692],[9.912342,50.922936],[9.912626,50.923273],[9.912882,50.923608],[9.91312,50.923946],[9.913391,50.92441],[9.913528,50.924669],[9.913663,50.924967],[9.913972,50.925814],[9.914362,50.92697],[9.914598,50.927526],[9.914883,50.927983],[9.915234,50.928438],[9.91568,50.928886],[9.915985,50.929157],[9.916453,50.929489],[9.916811,50.929719],[9.917248,50.929968],[9.917819,50.930235],[9.918947,50.930735],[9.919585,50.931018],[9.920468,50.93141],[9.920863,50.93159],[9.921912,50.932062],[9.922561,50.932353],[9.923148,50.932613],[9.9238,50.932905],[9.924349,50.933198],[9.924718,50.93341],[9.925242,50.933757],[9.925744,50.934122],[9.926115,50.934433],[9.926668,50.934963],[9.927627,50.9359],[9.928513,50.93676],[9.928846,50.937094],[9.929578,50.937805],[9.929866,50.938092],[9.930163,50.938371],[9.930909,50.939035],[9.931678,50.939664],[9.932415,50.94026],[9.934432,50.941879],[9.934633,50.942041],[9.935176,50.942443],[9.935523,50.942674],[9.935901,50.942908],[9.936474,50.943218],[9.937075,50.943509],[9.937662,50.94376],[9.938166,50.943953],[9.938614,50.944111],[9.939081,50.944261],[9.939547,50.944397],[9.940015,50.944513],[9.940503,50.944622],[9.940996,50.944717],[9.941485,50.944803],[9.941986,50.944874],[9.942671,50.944946],[9.943431,50.945002],[9.944026,50.945026],[9.944779,50.945035],[9.945543,50.945023],[9.946229,50.945012],[9.948362,50.944983],[9.949644,50.944961],[9.951097,50.944936],[9.952158,50.944923],[9.953223,50.944911],[9.953993,50.944917],[9.95468,50.944936],[9.955531,50.944983],[9.956215,50.945029],[9.957041,50.945106],[9.957802,50.945206],[9.958562,50.945317],[9.959289,50.945436],[9.960026,50.945575],[9.96075,50.945738],[9.961489,50.945917],[9.962429,50.946175],[9.963294,50.946439],[9.964018,50.946691],[9.964687,50.946941],[9.965317,50.947196],[9.966071,50.947547],[9.966541,50.947777],[9.96713,50.94807],[9.967725,50.948377],[9.968445,50.948752],[9.96987,50.949467],[9.971529,50.950312],[9.972525,50.950818],[9.97307,50.951091],[9.973546,50.9513],[9.973966,50.951465],[9.974413,50.951631],[9.975012,50.951823],[9.975555,50.951984],[9.977189,50.952433],[9.979068,50.952938],[9.98,50.953209],[9.980622,50.953417],[9.981059,50.953569],[9.981554,50.953771],[9.98199,50.953948],[9.982631,50.954206],[9.983638,50.954616],[9.984362,50.954912],[9.984798,50.955083],[9.985403,50.955288],[9.985941,50.955454],[9.986411,50.955583],[9.986887,50.955694],[9.987385,50.955802],[9.988039,50.955921],[9.988546,50.956001],[9.989051,50.95606],[9.989878,50.956132],[9.990394,50.956162],[9.991157,50.956182],[9.991936,50.956188],[9.993218,50.956201],[9.994433,50.956221],[9.995704,50.956239],[9.996049,50.956241],[9.996524,50.956256],[9.997043,50.956289],[9.997547,50.956328],[9.998057,50.956379],[9.998736,50.956465],[9.999298,50.956552],[10.000027,50.956698],[10.000766,50.956871],[10.001468,50.957057],[10.004207,50.957923],[10.005575,50.95835],[10.00646,50.95863],[10.006487,50.958639],[10.00691,50.958778],[10.007066,50.958825],[10.007511,50.958963],[10.009161,50.959487],[10.00976,50.959677],[10.011207,50.960136],[10.011923,50.960361],[10.012355,50.960481],[10.012603,50.960549],[10.013088,50.960662],[10.013884,50.960817],[10.014649,50.960933],[10.014901,50.960967],[10.015258,50.960999],[10.015418,50.961014],[10.016408,50.961058],[10.017134,50.961063],[10.017656,50.961045],[10.018419,50.960998],[10.019072,50.960929],[10.019641,50.96084],[10.020085,50.960765],[10.020564,50.960661],[10.021044,50.960552],[10.021511,50.960432],[10.021937,50.9603],[10.022319,50.960169],[10.022702,50.960034],[10.023145,50.959847],[10.023903,50.959517],[10.024523,50.959232],[10.025135,50.958947],[10.025764,50.958671],[10.026268,50.958457],[10.026857,50.958247],[10.0276,50.958009],[10.028304,50.957817],[10.02879,50.957697],[10.029355,50.957581],[10.029611,50.95753],[10.030497,50.957398],[10.031174,50.957319],[10.032014,50.957261],[10.032459,50.95725],[10.033022,50.957234],[10.033538,50.957238],[10.034498,50.957287],[10.035565,50.957383],[10.036542,50.957531],[10.037391,50.957704],[10.038178,50.957911],[10.038987,50.958126],[10.0392,50.958194],[10.039292,50.958223],[10.040038,50.958444],[10.041145,50.958777],[10.041656,50.958941],[10.045638,50.960146],[10.048796,50.961082],[10.050079,50.961478],[10.05161,50.961927],[10.052204,50.96211],[10.053305,50.962453],[10.054301,50.962798],[10.05503,50.963099],[10.055677,50.9634],[10.056543,50.963872],[10.057623,50.964572],[10.058738,50.965371],[10.061688,50.967479],[10.063309,50.968636],[10.065106,50.969933],[10.065858,50.970476],[10.066809,50.971144],[10.067631,50.971754],[10.068274,50.972327],[10.068682,50.972732],[10.069147,50.973291],[10.069461,50.97375],[10.069695,50.974148],[10.069948,50.974682],[10.070193,50.975351],[10.07032,50.975942],[10.07041,50.976574],[10.070625,50.978864],[10.070726,50.979898],[10.07082,50.980856],[10.070875,50.981372],[10.070937,50.981722],[10.071106,50.982322],[10.071274,50.982742],[10.071463,50.983111],[10.071738,50.983562],[10.072026,50.983958],[10.072401,50.984375],[10.07281,50.984779],[10.073265,50.985168],[10.073659,50.985469],[10.074142,50.985785],[10.074575,50.98604],[10.074964,50.98625],[10.075282,50.986405],[10.075509,50.986504],[10.076298,50.98683],[10.077159,50.987154],[10.078922,50.987809],[10.080669,50.98846],[10.081779,50.988886],[10.08226,50.989086],[10.082812,50.989344],[10.083386,50.989665],[10.084086,50.990125],[10.084712,50.990641],[10.085296,50.991226],[10.08612,50.99216],[10.086872,50.993016],[10.087718,50.99399],[10.088089,50.994469],[10.088465,50.99502],[10.088647,50.995353],[10.088857,50.99577],[10.089602,50.997531],[10.089898,50.998254],[10.090154,50.998848],[10.090754,51.000306],[10.091201,51.001381],[10.091534,51.001947],[10.09175,51.002316],[10.092108,51.002796],[10.09262,51.003344],[10.092796,51.003511],[10.093164,51.003844],[10.093475,51.004094],[10.093953,51.004443],[10.094353,51.004693],[10.09499,51.005057],[10.095606,51.005355],[10.096425,51.005736],[10.097534,51.006223],[10.097841,51.006358],[10.098989,51.006871],[10.099769,51.00723],[10.100364,51.007545],[10.10066,51.00772],[10.101074,51.007964],[10.101539,51.008278],[10.102122,51.008727],[10.102717,51.009212],[10.10395,51.010197],[10.104731,51.010739],[10.105512,51.011196],[10.105972,51.011424],[10.10639,51.011611],[10.107059,51.011919],[10.107617,51.012191],[10.109528,51.013082],[10.111281,51.013921],[10.112321,51.014409],[10.113183,51.014828],[10.113373,51.01492],[10.113594,51.015027],[10.114578,51.015487],[10.115925,51.016095],[10.11632,51.016245],[10.116716,51.016382],[10.11712,51.01651],[10.117531,51.016628],[10.117949,51.016737],[10.118374,51.016835],[10.118803,51.016923],[10.119238,51.017001],[10.119677,51.017069],[10.120118,51.017126],[10.120762,51.017185],[10.121339,51.017221],[10.121871,51.017235],[10.12263,51.017224],[10.123806,51.017168],[10.125391,51.017076],[10.126531,51.017012],[10.127869,51.016953],[10.128655,51.016898],[10.12991,51.016813],[10.130944,51.01675],[10.131813,51.016697],[10.132207,51.016676],[10.133976,51.016579],[10.135512,51.016493],[10.136259,51.016443],[10.13704,51.016375],[10.137586,51.016313],[10.138784,51.016125],[10.140125,51.015815],[10.141618,51.015403],[10.14517,51.014422],[10.147936,51.01366],[10.149944,51.013122],[10.152068,51.012609],[10.159191,51.010896],[10.160918,51.010491],[10.162865,51.010039],[10.164337,51.009715],[10.165237,51.00953],[10.166888,51.009265],[10.169205,51.008935],[10.170649,51.008724],[10.172124,51.008511],[10.173154,51.008362],[10.174215,51.008229],[10.17627,51.007912],[10.178782,51.007548],[10.179031,51.007511],[10.181845,51.00711],[10.184809,51.006675],[10.18825,51.006181],[10.189343,51.006023],[10.191741,51.005726],[10.19253,51.005654],[10.193049,51.005627],[10.193834,51.005615],[10.194352,51.005625],[10.19486,51.005649],[10.194877,51.00565],[10.195387,51.005695],[10.195892,51.005751],[10.196417,51.005831],[10.197131,51.005963],[10.197628,51.006082],[10.198106,51.00621],[10.198801,51.006431],[10.199688,51.006755],[10.200347,51.007028],[10.201618,51.00758],[10.202711,51.008051],[10.203212,51.008265],[10.203461,51.008371],[10.203941,51.00857],[10.204616,51.008839],[10.205678,51.009235],[10.206359,51.009464],[10.206786,51.009597],[10.206989,51.009661],[10.207271,51.009748],[10.207956,51.009938],[10.208471,51.010063],[10.209147,51.010238],[10.209867,51.010402],[10.210594,51.010549],[10.211799,51.010748],[10.212594,51.010869],[10.213068,51.010927],[10.214072,51.011042],[10.215012,51.011116],[10.216106,51.011177],[10.216869,51.0112],[10.21738,51.011213],[10.218384,51.011213],[10.218892,51.011202],[10.219644,51.011175],[10.220938,51.011095],[10.221689,51.011035],[10.222392,51.010969],[10.223133,51.010898],[10.223887,51.01082],[10.224543,51.010746],[10.22578,51.010614],[10.228707,51.010289],[10.235479,51.009537],[10.236213,51.009456],[10.236477,51.009428],[10.23717,51.009338],[10.237976,51.009246],[10.238731,51.009152],[10.239728,51.009027],[10.240676,51.008902],[10.243058,51.008532],[10.243399,51.00847],[10.243941,51.00838],[10.244476,51.008292],[10.245176,51.008173],[10.245627,51.008087],[10.246708,51.007884],[10.248379,51.007576],[10.249476,51.007369],[10.251545,51.006979],[10.254755,51.006373],[10.256193,51.006114],[10.256738,51.006018],[10.256981,51.005975],[10.257705,51.005861],[10.258835,51.005702],[10.259438,51.005629],[10.26037,51.005531],[10.260972,51.005476],[10.261806,51.005408],[10.263071,51.005339],[10.263757,51.005315],[10.264517,51.005294],[10.265014,51.005291],[10.265261,51.00529],[10.265578,51.005288],[10.265811,51.005288],[10.266341,51.005295],[10.267191,51.005318],[10.267594,51.005331],[10.268369,51.005373],[10.269073,51.005414],[10.269372,51.005436],[10.269889,51.005485],[10.270396,51.005532],[10.271152,51.005606],[10.271901,51.005692],[10.272657,51.005799],[10.273594,51.005942],[10.274626,51.00612],[10.275164,51.006221],[10.27565,51.006317],[10.275958,51.006386],[10.276795,51.006575],[10.27772,51.006799],[10.277758,51.006808],[10.27917,51.007198],[10.280728,51.007684],[10.283232,51.00854],[10.284337,51.008928],[10.284701,51.009049],[10.285728,51.009389],[10.287043,51.009822],[10.288663,51.010321],[10.289435,51.010547],[10.289792,51.010649],[10.290032,51.010721],[10.290109,51.010743],[10.291684,51.011184],[10.293098,51.011541],[10.294297,51.011837],[10.295713,51.01217],[10.296955,51.01245],[10.298864,51.012843],[10.300352,51.013122],[10.301817,51.013381],[10.304043,51.013744],[10.305781,51.013983],[10.307516,51.014207],[10.30805,51.014268],[10.308549,51.014325],[10.308991,51.01438],[10.310533,51.014532],[10.3107,51.014548],[10.312253,51.014692],[10.314312,51.01484],[10.316348,51.014954],[10.317455,51.014999],[10.318841,51.015054],[10.320712,51.015085],[10.322934,51.01509],[10.32497,51.015061],[10.325506,51.015047],[10.326498,51.015022],[10.327561,51.014978],[10.32858,51.014926],[10.329798,51.014864],[10.331906,51.01475],[10.332895,51.014696],[10.334697,51.014596],[10.335971,51.014557],[10.337248,51.014528],[10.338768,51.014542],[10.340567,51.014617],[10.3416,51.014685],[10.342369,51.014746],[10.343125,51.014819],[10.343861,51.014899],[10.34487,51.01503],[10.346372,51.015248],[10.347867,51.015508],[10.350504,51.016002],[10.352001,51.016268],[10.35348,51.016514],[10.354111,51.016606],[10.35475,51.016699],[10.355987,51.016854],[10.357014,51.016956],[10.358263,51.017056],[10.359288,51.017111],[10.360288,51.017154],[10.361072,51.017175],[10.362124,51.017175],[10.363153,51.017167],[10.364071,51.01714],[10.364497,51.017122],[10.365213,51.017089],[10.36619,51.017015],[10.367037,51.016944],[10.367958,51.016851],[10.369008,51.01672],[10.36996,51.016587],[10.370692,51.016473],[10.370812,51.016454],[10.372211,51.016188],[10.373165,51.015995],[10.374174,51.015763],[10.374507,51.015679],[10.375548,51.015418],[10.376745,51.015072],[10.377879,51.014717],[10.378857,51.014372],[10.380314,51.013822],[10.381184,51.013466],[10.382023,51.013108],[10.382849,51.012724],[10.383538,51.012372],[10.384421,51.011906],[10.385386,51.01136],[10.386294,51.010826],[10.386396,51.010764],[10.387235,51.010254],[10.388544,51.009464],[10.389649,51.008791],[10.391338,51.007817],[10.391551,51.007704],[10.391788,51.00758],[10.39253,51.007174],[10.393501,51.006666],[10.394312,51.00625],[10.396071,51.005385],[10.397502,51.004731],[10.398143,51.004438],[10.400035,51.003637],[10.403091,51.002351],[10.40313,51.002335],[10.403569,51.002154],[10.405569,51.001319],[10.406164,51.001065],[10.406542,51.000909],[10.408086,51.00027],[10.408548,51.00008],[10.409101,50.999849],[10.410121,50.99944],[10.410716,50.999207],[10.411118,50.999058],[10.412442,50.998583],[10.413658,50.998184],[10.414801,50.997854],[10.414939,50.997814],[10.416092,50.997505],[10.4181,50.997035],[10.420316,50.996595],[10.421601,50.99636],[10.422494,50.996196],[10.423721,50.995974],[10.424761,50.995773],[10.425976,50.995552],[10.427349,50.995291],[10.42768,50.995231],[10.430172,50.994778],[10.432303,50.99438],[10.43253,50.99434],[10.432863,50.994276],[10.434445,50.993989],[10.435305,50.993829],[10.43622,50.993658],[10.436572,50.993595],[10.437659,50.993398],[10.439127,50.993126],[10.441109,50.99276],[10.441972,50.992601],[10.44229,50.992543],[10.442816,50.992446],[10.443491,50.99232],[10.445596,50.991927],[10.448711,50.991356],[10.44882,50.991336],[10.450544,50.991021],[10.451585,50.990828],[10.451816,50.990785],[10.454517,50.990289],[10.458503,50.98955],[10.460763,50.989133],[10.46176,50.988942],[10.462196,50.988856],[10.463015,50.988695],[10.464237,50.988438],[10.465411,50.98818],[10.466619,50.987878],[10.467822,50.987561],[10.468984,50.987213],[10.469123,50.987166],[10.470113,50.986836],[10.471278,50.986427],[10.472596,50.985916],[10.473889,50.985365],[10.474924,50.984889],[10.475353,50.984666],[10.475955,50.984354],[10.4769,50.983854],[10.477843,50.983304],[10.4789,50.982642],[10.479451,50.982267],[10.480051,50.981837],[10.48013,50.98178],[10.481037,50.981108],[10.48146,50.980771],[10.482048,50.980281],[10.482327,50.980033],[10.482524,50.979852],[10.483704,50.978683],[10.484452,50.977872],[10.484711,50.977559],[10.485457,50.976619],[10.485819,50.976106],[10.486169,50.975618],[10.486605,50.97488],[10.487106,50.973958],[10.487468,50.973192],[10.487849,50.972249],[10.488187,50.971284],[10.488436,50.970355],[10.488531,50.969853],[10.488652,50.969215],[10.488751,50.968412],[10.488797,50.9676],[10.488801,50.966632],[10.488771,50.966159],[10.488733,50.965684],[10.488659,50.965138],[10.488603,50.964719],[10.488385,50.963605],[10.488239,50.963019],[10.488206,50.962896],[10.488099,50.962501],[10.487643,50.96085],[10.487137,50.959005],[10.486805,50.957777],[10.486796,50.957744],[10.486395,50.956283],[10.486376,50.956216],[10.48618,50.9555],[10.486075,50.955038],[10.486,50.954703],[10.485896,50.954183],[10.485785,50.953451],[10.485711,50.952757],[10.485696,50.952096],[10.485703,50.951475],[10.485722,50.95101],[10.485758,50.950577],[10.485805,50.950233],[10.48585,50.949926],[10.485914,50.949564],[10.48598,50.949238],[10.486051,50.948945],[10.486186,50.94843],[10.486272,50.948151],[10.486427,50.947677],[10.48651,50.947463],[10.486636,50.947136],[10.486756,50.946861],[10.487316,50.945672],[10.488136,50.944262],[10.488676,50.943503],[10.489177,50.942879],[10.489568,50.942407],[10.490222,50.941679],[10.490838,50.941053],[10.491416,50.940512],[10.492181,50.939851],[10.49239,50.939687],[10.492979,50.939226],[10.493793,50.938636],[10.494678,50.938046],[10.49528,50.937659],[10.496483,50.936921],[10.497596,50.936247],[10.499045,50.935356],[10.500478,50.934439],[10.502041,50.933394],[10.502525,50.933061],[10.503613,50.93231],[10.505371,50.931053],[10.506615,50.930194],[10.506903,50.929993],[10.507417,50.929662],[10.508153,50.929187],[10.509443,50.928408],[10.510793,50.927652],[10.511976,50.927033],[10.512659,50.92669],[10.512969,50.926534],[10.514188,50.925968],[10.515274,50.925495],[10.516322,50.925066],[10.517226,50.924701],[10.518294,50.924313],[10.518682,50.924175],[10.519624,50.92384],[10.520764,50.923479],[10.522225,50.923046],[10.523529,50.922674],[10.524146,50.922518],[10.525122,50.92227],[10.525563,50.92217],[10.526662,50.92192],[10.527972,50.921643],[10.529083,50.921443],[10.530337,50.921231],[10.531592,50.921035],[10.532067,50.920971],[10.5327,50.920885],[10.534549,50.92066],[10.536075,50.92051],[10.537416,50.920398],[10.538811,50.920295],[10.539178,50.920272],[10.539871,50.92023],[10.54095,50.920168],[10.541151,50.920156],[10.541522,50.920136],[10.541795,50.920123],[10.544056,50.920019],[10.546019,50.919954],[10.549226,50.919875],[10.549789,50.919862],[10.551949,50.91981],[10.552657,50.919794],[10.553079,50.919783],[10.55566,50.919721],[10.559678,50.919631],[10.56338,50.919541],[10.564632,50.91949],[10.566064,50.9194],[10.567426,50.919269],[10.56854,50.919134],[10.569741,50.918949],[10.5709,50.918741],[10.571655,50.918586],[10.572118,50.918483],[10.57291,50.918299],[10.573839,50.918052],[10.573994,50.918009],[10.574075,50.917986],[10.574171,50.91796],[10.574418,50.917885],[10.574973,50.917717],[10.575656,50.917497],[10.576478,50.917211],[10.577315,50.916884],[10.577744,50.916721],[10.57848,50.916415],[10.579292,50.916061],[10.580086,50.915677],[10.580703,50.915363],[10.581101,50.915144],[10.581897,50.914704],[10.582803,50.91417],[10.585538,50.912588],[10.587149,50.911657],[10.588268,50.911002],[10.589231,50.910464],[10.59001,50.910048],[10.590637,50.909743],[10.590791,50.90967],[10.591428,50.909374],[10.592492,50.908913],[10.593153,50.908655],[10.593993,50.908355],[10.59467,50.908112],[10.595338,50.907902],[10.596332,50.907613],[10.59733,50.907339],[10.597585,50.90728],[10.598684,50.907021],[10.599666,50.906821],[10.600561,50.906668],[10.601611,50.906504],[10.60287,50.906345],[10.603937,50.906233],[10.604121,50.906219],[10.605095,50.906145],[10.605956,50.906103],[10.607228,50.906064],[10.607538,50.906063],[10.607966,50.906057],[10.608243,50.906057],[10.608798,50.90607],[10.609034,50.906072],[10.610011,50.906106],[10.610221,50.906116],[10.610596,50.906131],[10.611197,50.906152],[10.611447,50.906164],[10.612592,50.90623],[10.613842,50.906292],[10.617133,50.90646],[10.618199,50.906512],[10.619324,50.906577],[10.619782,50.906603],[10.621,50.906661],[10.622514,50.906727],[10.625131,50.906809],[10.625353,50.906814],[10.627646,50.906861],[10.630495,50.906908],[10.6327,50.906948],[10.632854,50.906951],[10.634286,50.906988],[10.635537,50.907038],[10.637062,50.907122],[10.639525,50.907283],[10.639825,50.907304],[10.639933,50.907312],[10.64019,50.907332],[10.640387,50.907344],[10.643186,50.907557],[10.647257,50.907851],[10.648188,50.907917],[10.650815,50.908101],[10.65233,50.908178],[10.653323,50.908202],[10.653852,50.908216],[10.65515,50.908187],[10.655893,50.908173],[10.656703,50.908131],[10.657686,50.908059],[10.658931,50.907937],[10.659693,50.907855],[10.66058,50.907728],[10.661062,50.907655],[10.661933,50.907497],[10.663137,50.907263],[10.663909,50.90709],[10.665073,50.906823],[10.666979,50.906365],[10.667857,50.906156],[10.668911,50.905905],[10.671055,50.905388],[10.674227,50.90463],[10.675094,50.904422],[10.677025,50.903955],[10.679094,50.903464],[10.679461,50.903377],[10.681676,50.902876],[10.683305,50.902535],[10.684734,50.902265],[10.685726,50.9021],[10.686422,50.901993],[10.686965,50.901915],[10.687073,50.901901],[10.68794,50.901784],[10.689003,50.901653],[10.689956,50.90156],[10.691735,50.901391],[10.693115,50.901308],[10.694936,50.901222],[10.696429,50.901189],[10.698366,50.901189],[10.700191,50.901196],[10.700892,50.901198],[10.701455,50.901204],[10.702693,50.901215],[10.705025,50.901237],[10.707891,50.90126],[10.708824,50.901268],[10.708922,50.901269],[10.70972,50.901275],[10.713469,50.901313],[10.715758,50.90133],[10.716772,50.901338],[10.718353,50.901347],[10.722906,50.901386],[10.722939,50.901386],[10.723477,50.90139],[10.726039,50.901412],[10.728984,50.901441],[10.729417,50.901443],[10.729759,50.901443],[10.73003,50.901446],[10.731171,50.901456],[10.732164,50.901458],[10.733104,50.901445],[10.73347,50.901436],[10.734192,50.901411],[10.73603,50.901304],[10.736909,50.901223],[10.737324,50.901185],[10.738485,50.901046],[10.739687,50.900871],[10.740962,50.900641],[10.742178,50.900396],[10.743641,50.900037],[10.74403,50.899929],[10.744827,50.899709],[10.745131,50.899625],[10.74694,50.89902],[10.747541,50.898808],[10.748495,50.898426],[10.748944,50.898236],[10.749638,50.897932],[10.750153,50.897692],[10.750468,50.897545],[10.75132,50.897118],[10.752735,50.896375],[10.753928,50.89569],[10.755238,50.894909],[10.755851,50.894521],[10.756944,50.89383],[10.759536,50.892157],[10.760196,50.891721],[10.760411,50.891589],[10.760846,50.891321],[10.761879,50.890679],[10.763213,50.88991],[10.764268,50.889348],[10.764821,50.889057],[10.765307,50.888824],[10.766111,50.888435],[10.766914,50.888071],[10.767432,50.887854],[10.768224,50.887523],[10.769065,50.887187],[10.769964,50.886841],[10.771004,50.886478],[10.771786,50.886211],[10.772519,50.885969],[10.773605,50.885631],[10.774248,50.885435],[10.777167,50.884556],[10.778344,50.884202],[10.780523,50.883546],[10.784345,50.882388],[10.786323,50.881789],[10.787142,50.88154],[10.788864,50.881033],[10.790677,50.880499],[10.791994,50.880152],[10.793723,50.879746],[10.79586,50.879365],[10.797146,50.879183],[10.797787,50.879115],[10.798705,50.879019],[10.800127,50.87891],[10.801264,50.87883],[10.803883,50.878656],[10.804708,50.8786],[10.805789,50.878529],[10.806462,50.878487],[10.807063,50.878448],[10.807712,50.878405],[10.807958,50.878391],[10.811185,50.878173],[10.811642,50.878146],[10.811763,50.878138],[10.812453,50.878095],[10.815016,50.877926],[10.815463,50.877898],[10.815962,50.877865],[10.81759,50.87776],[10.819022,50.877667],[10.819465,50.877638],[10.821051,50.877535],[10.822794,50.877422],[10.823282,50.877389],[10.824218,50.877332],[10.826153,50.877204],[10.826566,50.877178],[10.82717,50.877142],[10.827608,50.877115],[10.828533,50.877052],[10.829204,50.877005],[10.829636,50.876971],[10.830334,50.876939],[10.830371,50.876937],[10.830975,50.8769],[10.832347,50.87681],[10.833856,50.876721],[10.83606,50.876591],[10.837306,50.876565],[10.838269,50.876591],[10.839011,50.876626],[10.84009,50.876713],[10.840732,50.876781],[10.841297,50.876854],[10.84163,50.876908],[10.842041,50.876974],[10.842779,50.877116],[10.843476,50.877261],[10.844218,50.877432],[10.845152,50.877699],[10.846204,50.878033],[10.846765,50.878241],[10.847025,50.878343],[10.847132,50.878386],[10.847586,50.878578],[10.848325,50.878889],[10.849243,50.879303],[10.850227,50.87975],[10.851648,50.880392],[10.852367,50.880731],[10.853268,50.881129],[10.854894,50.88187],[10.856324,50.882517],[10.856712,50.882691],[10.857132,50.882886],[10.857768,50.883173],[10.858504,50.88351],[10.859006,50.88374],[10.863759,50.885888],[10.865049,50.88647],[10.866053,50.886923],[10.867302,50.88749],[10.86856,50.888056],[10.869575,50.888494],[10.87061,50.888901],[10.871032,50.889057],[10.871527,50.889239],[10.872448,50.88955],[10.873835,50.889956],[10.87484,50.890224],[10.875966,50.890488],[10.876985,50.890684],[10.877507,50.890778],[10.87776,50.890825],[10.878298,50.890917],[10.878939,50.891014],[10.879957,50.891147],[10.880941,50.891257],[10.882974,50.891456],[10.884018,50.89156],[10.885418,50.8917],[10.887501,50.891907],[10.889638,50.892113],[10.890262,50.892176],[10.890628,50.892213],[10.892788,50.892424],[10.893799,50.892522],[10.894786,50.892624],[10.89544,50.89269],[10.896023,50.892747],[10.897676,50.892908],[10.89818,50.892957],[10.898555,50.892993],[10.899603,50.893095],[10.901001,50.893229],[10.901532,50.89328],[10.903118,50.893441],[10.904635,50.893579],[10.905705,50.893674],[10.905858,50.893688],[10.907083,50.893774],[10.908165,50.893832],[10.909132,50.893868],[10.910173,50.893886],[10.911104,50.893897],[10.911515,50.893896],[10.911852,50.893889],[10.912393,50.893878],[10.91342,50.89385],[10.914249,50.893816],[10.914931,50.893787],[10.915491,50.89375],[10.916482,50.89369],[10.917754,50.893609],[10.919094,50.893525],[10.919973,50.89347],[10.9233,50.89325],[10.92598,50.893076],[10.926126,50.893066],[10.927581,50.892969],[10.928977,50.892882],[10.929379,50.892855],[10.929983,50.892815],[10.931667,50.892702],[10.932156,50.892669],[10.932599,50.892641],[10.932904,50.892622],[10.93296,50.892619],[10.933348,50.892594],[10.934416,50.892526],[10.935941,50.89243],[10.937151,50.892357],[10.938693,50.89229],[10.938953,50.892288],[10.939966,50.892277],[10.940845,50.892281],[10.941289,50.892283],[10.942823,50.892327],[10.944092,50.8924],[10.945261,50.89249],[10.946437,50.892609],[10.947109,50.892689],[10.947394,50.892727],[10.947658,50.892759],[10.948258,50.892845],[10.948968,50.892949],[10.949337,50.893015],[10.950557,50.893234],[10.951826,50.893484],[10.952798,50.893696],[10.954335,50.894052],[10.955103,50.894231],[10.956244,50.894495],[10.957158,50.894704],[10.958382,50.894997],[10.960028,50.895383],[10.960773,50.895559],[10.961726,50.895783],[10.963253,50.896143],[10.963421,50.896181],[10.964572,50.896447],[10.965388,50.896633],[10.966076,50.896794],[10.966402,50.896878],[10.966771,50.896968],[10.967805,50.897204],[10.968708,50.897414],[10.970569,50.897848],[10.973246,50.898473],[10.977066,50.899375],[10.978775,50.899755],[10.980592,50.900182],[10.980928,50.900259],[10.981448,50.900378],[10.98707,50.901692],[10.987615,50.90182],[10.991863,50.902807],[10.992232,50.902893],[10.993874,50.903286],[10.995939,50.903764],[10.997164,50.904051],[10.998424,50.904315],[10.999755,50.904562],[11.000418,50.904671],[11.001114,50.904772],[11.001831,50.90487],[11.004,50.905111],[11.004712,50.905185],[11.00579,50.905298],[11.007698,50.905491],[11.007816,50.905503],[11.008441,50.905568],[11.008984,50.905626],[11.011182,50.905863],[11.011606,50.905908],[11.012366,50.905986],[11.014741,50.90623],[11.020454,50.906828],[11.020672,50.90685],[11.021804,50.906969],[11.023224,50.907117],[11.028565,50.907685],[11.029629,50.907797],[11.030184,50.907854],[11.031872,50.908033],[11.036476,50.908469],[11.036777,50.908498],[11.039999,50.908753],[11.042814,50.908923],[11.045734,50.909068],[11.050402,50.909284],[11.053449,50.909385],[11.056983,50.909552],[11.058044,50.909603],[11.058913,50.909635],[11.061575,50.909749],[11.063662,50.909837],[11.064686,50.909886],[11.06552,50.909926],[11.06586,50.909944],[11.066561,50.909984],[11.067103,50.91002],[11.068843,50.910143],[11.069501,50.910211],[11.070854,50.910361],[11.071023,50.910379],[11.072283,50.910546],[11.073961,50.910812],[11.074373,50.910884],[11.074845,50.910968],[11.075621,50.911112],[11.077655,50.911472],[11.077834,50.911505],[11.07878,50.911672],[11.081613,50.912186],[11.084359,50.9127],[11.08573,50.912995],[11.086379,50.913134],[11.089788,50.913897],[11.091507,50.914345],[11.095326,50.915341],[11.098508,50.91616],[11.104594,50.917726],[11.104907,50.917808],[11.106997,50.918355],[11.108065,50.918644],[11.108382,50.918727],[11.108971,50.918889],[11.111811,50.919723],[11.112483,50.919939],[11.113113,50.920137],[11.114816,50.920686],[11.116503,50.921247],[11.117643,50.921591],[11.118089,50.921715],[11.118614,50.921837],[11.119595,50.922053],[11.120427,50.922217],[11.121563,50.922391],[11.122853,50.922553],[11.124466,50.922735],[11.124876,50.922785],[11.127423,50.923079],[11.129077,50.923291],[11.130062,50.923453],[11.130906,50.92362],[11.131856,50.923848],[11.132521,50.924023],[11.133466,50.924297],[11.134076,50.924483],[11.134441,50.924604],[11.135043,50.924825],[11.136112,50.925244],[11.136466,50.925398],[11.136612,50.925461],[11.136932,50.925597],[11.137114,50.925679],[11.138998,50.926489],[11.143076,50.928216],[11.144134,50.928692],[11.145143,50.929172],[11.145958,50.929612],[11.146477,50.929929],[11.147072,50.930293],[11.147379,50.930497],[11.14766,50.930691],[11.147931,50.930889],[11.148422,50.931257],[11.148901,50.93165],[11.149499,50.932162],[11.150106,50.932706],[11.150499,50.933063],[11.150722,50.933265],[11.151414,50.933886],[11.151848,50.934291],[11.152284,50.934671],[11.152743,50.935078],[11.153349,50.935588],[11.153587,50.935772],[11.153826,50.935957],[11.154341,50.936321],[11.154869,50.936671],[11.155464,50.937041],[11.155798,50.937233],[11.156172,50.937434],[11.156567,50.937646],[11.157159,50.937948],[11.15779,50.93824],[11.158555,50.938606],[11.161461,50.939997],[11.163774,50.941103],[11.164417,50.941408],[11.164984,50.941674],[11.165835,50.94206],[11.166153,50.942191],[11.167071,50.942587],[11.167718,50.942834],[11.168203,50.943017],[11.168811,50.943223],[11.169243,50.943372],[11.170016,50.943607],[11.170528,50.943759],[11.171484,50.944026],[11.172302,50.944225],[11.173183,50.944437],[11.173688,50.944553],[11.173839,50.944586],[11.175464,50.944946],[11.175797,50.945018],[11.176868,50.94525],[11.179776,50.945896],[11.180049,50.945957],[11.181488,50.946284],[11.18276,50.946555],[11.183096,50.94663],[11.185797,50.947231],[11.18703,50.947503],[11.188454,50.947816],[11.189555,50.948039],[11.189981,50.948125],[11.191473,50.948375],[11.191995,50.948454],[11.192842,50.948562],[11.193844,50.94867],[11.194936,50.948766],[11.196018,50.948837],[11.196409,50.948859],[11.19717,50.948896],[11.199838,50.94902],[11.201368,50.949081],[11.20217,50.949134],[11.20293,50.949168],[11.203337,50.949187],[11.20374,50.949204],[11.204458,50.94923],[11.210897,50.94953],[11.217151,50.949816],[11.220088,50.949948],[11.220488,50.949967],[11.224218,50.950131],[11.226587,50.950244],[11.227744,50.950281],[11.22876,50.950299],[11.229297,50.9503],[11.230778,50.9503],[11.231499,50.950284],[11.232198,50.950254],[11.233894,50.950171],[11.235848,50.950021],[11.23823,50.949818],[11.239615,50.949705],[11.24068,50.949622],[11.241728,50.949523],[11.242036,50.949497],[11.243602,50.94936],[11.244806,50.949263],[11.245894,50.949168],[11.246519,50.94912],[11.249119,50.948897],[11.252406,50.948618],[11.255099,50.948392],[11.256642,50.948291],[11.25806,50.948216],[11.25868,50.948182],[11.25909,50.948166],[11.26098,50.948098],[11.262854,50.948019],[11.266265,50.947899],[11.269563,50.947776],[11.27011,50.947755],[11.273626,50.947627],[11.273827,50.94762],[11.274972,50.947556],[11.276015,50.947469],[11.277108,50.947354],[11.278466,50.947161],[11.280757,50.946797],[11.281975,50.946605],[11.28483,50.946136],[11.28663,50.94584],[11.28735,50.945723],[11.288854,50.945474],[11.290148,50.945257],[11.292361,50.944898],[11.292708,50.944841],[11.294643,50.944527],[11.29527,50.944428],[11.296615,50.944207],[11.297023,50.944137],[11.298174,50.943949],[11.300121,50.943631],[11.300662,50.943542],[11.301445,50.943417],[11.301866,50.943357],[11.302961,50.943229],[11.303731,50.943175],[11.304251,50.943152],[11.305337,50.943143],[11.307727,50.943154],[11.307817,50.943154],[11.309163,50.943159],[11.31083,50.94317],[11.314,50.943167],[11.315537,50.943131],[11.316002,50.943113],[11.317293,50.943053],[11.318583,50.942968],[11.319821,50.942868],[11.321056,50.94275],[11.322752,50.942556],[11.323417,50.942472],[11.32494,50.94224],[11.326461,50.941987],[11.326955,50.941887],[11.327443,50.941793],[11.32761,50.94176],[11.328337,50.94162],[11.329055,50.941465],[11.329777,50.941315],[11.330336,50.941178],[11.330776,50.941076],[11.331182,50.94098],[11.336034,50.939849],[11.339322,50.93908],[11.339495,50.939039],[11.339684,50.938996],[11.341292,50.93863],[11.341983,50.938471],[11.342381,50.938384],[11.342897,50.938269],[11.3434,50.938158],[11.344368,50.93798],[11.34632,50.937725],[11.348868,50.937507],[11.349742,50.937467],[11.350411,50.937451],[11.351933,50.937439],[11.352076,50.93744],[11.352412,50.937445],[11.354033,50.937509],[11.355258,50.93756],[11.356886,50.937619],[11.358011,50.937661],[11.35878,50.937691],[11.361309,50.937792],[11.362476,50.937837],[11.364422,50.937907],[11.365279,50.937939],[11.366152,50.937949],[11.367292,50.937923],[11.368679,50.937851],[11.369442,50.937786],[11.37055,50.937644],[11.371028,50.937579],[11.371183,50.937556],[11.372884,50.937251],[11.376521,50.93653],[11.378853,50.936062],[11.379316,50.935961],[11.38007,50.935786],[11.380717,50.935596],[11.38165,50.935326],[11.382892,50.934898],[11.383595,50.934616],[11.384196,50.934355],[11.384491,50.934217],[11.384968,50.933993],[11.38614,50.933373],[11.386441,50.933194],[11.38713,50.932787],[11.387864,50.932325],[11.388154,50.932143],[11.388772,50.931764],[11.389027,50.931604],[11.389661,50.931197],[11.390257,50.930814],[11.390535,50.930636],[11.391484,50.930027],[11.393495,50.928785],[11.394548,50.928123],[11.395651,50.927438],[11.397247,50.926451],[11.397938,50.926015],[11.398178,50.925864],[11.398667,50.925556],[11.399699,50.924915],[11.400972,50.924111],[11.401838,50.923544],[11.402677,50.922957],[11.403732,50.922163],[11.40475,50.921347],[11.405548,50.920644],[11.40627,50.919974],[11.407576,50.918739],[11.408602,50.917775],[11.409215,50.9172],[11.410363,50.916128],[11.411194,50.915321],[11.411387,50.915143],[11.412892,50.91375],[11.413306,50.913361],[11.415296,50.911523],[11.415467,50.911364],[11.41566,50.911185],[11.416693,50.910232],[11.417263,50.909706],[11.418788,50.908444],[11.419623,50.907808],[11.4198,50.907688],[11.421238,50.906686],[11.423113,50.905528],[11.424615,50.904702],[11.424983,50.904511],[11.426428,50.903796],[11.427069,50.903478],[11.428287,50.902904],[11.429572,50.902278],[11.430737,50.901722],[11.432225,50.900995],[11.432566,50.900822],[11.433255,50.900492],[11.433839,50.900204],[11.434592,50.899838],[11.434957,50.899662],[11.437136,50.898631],[11.437479,50.898464],[11.43935,50.89755],[11.439997,50.897237],[11.440593,50.896958],[11.440946,50.896788],[11.441771,50.896405],[11.44246,50.896081],[11.443177,50.895777],[11.443824,50.895511],[11.444316,50.895315],[11.444838,50.895115],[11.445147,50.895005],[11.445992,50.894684],[11.448589,50.893839],[11.448696,50.893804],[11.449814,50.893499],[11.450517,50.893306],[11.451062,50.893159],[11.453089,50.892693],[11.453676,50.892561],[11.454623,50.892336],[11.45499,50.892259],[11.459773,50.891247],[11.462651,50.890604],[11.464211,50.890224],[11.465667,50.889876],[11.466915,50.889555],[11.468069,50.889233],[11.468139,50.889214],[11.468881,50.88901],[11.47049,50.888534],[11.472049,50.888049],[11.472599,50.887878],[11.473225,50.887672],[11.474514,50.88722],[11.475689,50.88681],[11.477801,50.886007],[11.479342,50.885406],[11.480834,50.884813],[11.484239,50.883456],[11.486051,50.882733],[11.488511,50.881747],[11.489163,50.881484],[11.490988,50.880754],[11.491415,50.880583],[11.49215,50.880284],[11.494556,50.879312],[11.498052,50.877905],[11.500083,50.877097],[11.501205,50.87669],[11.501946,50.876442],[11.503008,50.876131],[11.503776,50.87593],[11.504732,50.875704],[11.505331,50.875581],[11.506157,50.875428],[11.507105,50.875279],[11.508137,50.875148],[11.509437,50.875019],[11.510059,50.874979],[11.511097,50.874928],[11.511379,50.874919],[11.511696,50.874912],[11.512631,50.874907],[11.513446,50.874924],[11.514356,50.874972],[11.515098,50.87502],[11.515915,50.875091],[11.516717,50.875187],[11.517217,50.875258],[11.517715,50.875333],[11.518321,50.875434],[11.519004,50.875554],[11.519799,50.875722],[11.52059,50.875918],[11.521743,50.876222],[11.52246,50.876439],[11.524723,50.877134],[11.525212,50.877283],[11.525567,50.877392],[11.526819,50.877741],[11.527765,50.877978],[11.528692,50.878174],[11.529458,50.878311],[11.529919,50.878391],[11.530888,50.878527],[11.531474,50.878599],[11.532468,50.878691],[11.53306,50.878736],[11.5337,50.878772],[11.534469,50.878802],[11.535302,50.878813],[11.535486,50.878813],[11.535752,50.878811],[11.536184,50.878806],[11.536526,50.878798],[11.537467,50.878761],[11.538628,50.878639],[11.539976,50.878438],[11.540929,50.878282],[11.54556,50.877423],[11.553013,50.87604],[11.554946,50.875681],[11.556571,50.875379],[11.558107,50.875094],[11.558404,50.875039],[11.559823,50.874772],[11.566657,50.873485],[11.573472,50.872202],[11.578414,50.871271],[11.57952,50.871081],[11.580246,50.870946],[11.582349,50.87057],[11.583264,50.870445],[11.583664,50.870395],[11.584315,50.870327],[11.585023,50.870282],[11.586426,50.870259],[11.587296,50.870292],[11.587561,50.870307],[11.587931,50.870342],[11.588864,50.870443],[11.589745,50.87058],[11.590366,50.870697],[11.591092,50.870874],[11.59181,50.871068],[11.592476,50.871278],[11.593334,50.871592],[11.593844,50.8718],[11.594076,50.871907],[11.594292,50.872005],[11.594693,50.872205],[11.595046,50.872389],[11.595119,50.872435],[11.59634,50.873119],[11.597514,50.873772],[11.598046,50.874068],[11.600045,50.875165],[11.60426,50.877477],[11.604437,50.877569],[11.604545,50.877624],[11.604964,50.877849],[11.606119,50.878467],[11.606688,50.87876],[11.607385,50.879094],[11.607925,50.879317],[11.607951,50.879328],[11.608616,50.879581],[11.609276,50.879782],[11.609799,50.879912],[11.610421,50.880038],[11.61111,50.880151],[11.611751,50.880247],[11.611828,50.880254],[11.612304,50.880296],[11.612726,50.880319],[11.61322,50.880333],[11.613826,50.88033],[11.61437,50.880315],[11.61499,50.880277],[11.615215,50.880258],[11.615894,50.880196],[11.616641,50.880108],[11.616941,50.88007],[11.61852,50.879844],[11.622481,50.879245],[11.623325,50.879116],[11.624104,50.878993],[11.624247,50.878971],[11.624882,50.878875],[11.626912,50.878566],[11.629769,50.878136],[11.631852,50.877811],[11.634986,50.877344],[11.636897,50.877049],[11.637999,50.876882],[11.63832,50.876834],[11.638764,50.876765],[11.640199,50.876553],[11.641678,50.876378],[11.642906,50.876251],[11.644008,50.876149],[11.645433,50.87604],[11.646685,50.875976],[11.647906,50.875922],[11.649144,50.875887],[11.650771,50.875881],[11.652353,50.875896],[11.653664,50.875938],[11.655069,50.876017],[11.657539,50.876203],[11.658004,50.876243],[11.659325,50.876371],[11.659592,50.876397],[11.66153,50.876632],[11.666548,50.87739],[11.668373,50.877665],[11.669934,50.877839],[11.670591,50.87788],[11.671069,50.8779],[11.672132,50.877927],[11.673229,50.877908],[11.673831,50.877881],[11.67498,50.877789],[11.676858,50.87763],[11.681068,50.877275],[11.681204,50.877264],[11.688214,50.876676],[11.690082,50.87652],[11.695034,50.876098],[11.695472,50.876061],[11.69598,50.876016],[11.696535,50.875967],[11.69935,50.875734],[11.701966,50.875515],[11.702768,50.87545],[11.70499,50.875262],[11.705428,50.875222],[11.708372,50.87497],[11.708898,50.874926],[11.709218,50.874899],[11.712634,50.874611],[11.712966,50.874583],[11.712996,50.87458],[11.713339,50.874555],[11.71373,50.874523],[11.715689,50.874351],[11.716161,50.874311],[11.723253,50.873719],[11.724594,50.873584],[11.725446,50.873486],[11.726114,50.873377],[11.727314,50.873148],[11.728641,50.872818],[11.729365,50.872599],[11.729467,50.872567],[11.729988,50.872404],[11.730781,50.872118],[11.731622,50.871768],[11.732878,50.871151],[11.734063,50.870518],[11.735784,50.869643],[11.737388,50.868828],[11.73951,50.867735],[11.740608,50.867203],[11.741707,50.866729],[11.742011,50.866618],[11.743518,50.866084],[11.745287,50.865585],[11.747012,50.865202],[11.748397,50.864976],[11.74867,50.864936],[11.750023,50.864773],[11.752126,50.864646],[11.753924,50.864636],[11.755733,50.86473],[11.757506,50.864922],[11.757946,50.86498],[11.760289,50.865354],[11.763999,50.866093],[11.764627,50.866222],[11.76713,50.866711],[11.770268,50.867322],[11.772954,50.867848],[11.773505,50.867956],[11.774459,50.868145],[11.77469,50.868191],[11.774959,50.868244],[11.775785,50.868409],[11.776693,50.868587],[11.777167,50.86868],[11.777845,50.868816],[11.778631,50.86897],[11.779399,50.869128],[11.77986,50.869224],[11.780408,50.86934],[11.780928,50.869456],[11.781343,50.869555],[11.78175,50.869657],[11.782227,50.869782],[11.782698,50.869909],[11.783156,50.87004],[11.783636,50.870185],[11.784269,50.87039],[11.784889,50.870593],[11.78715,50.871384],[11.789347,50.872153],[11.794354,50.873942],[11.794939,50.874151],[11.797216,50.874868],[11.797724,50.875003],[11.799095,50.875313],[11.800011,50.875499],[11.800348,50.875556],[11.801469,50.875752],[11.802509,50.875893],[11.803264,50.875978],[11.803621,50.876009],[11.804624,50.876099],[11.806089,50.87622],[11.806698,50.876272],[11.807041,50.876301],[11.810539,50.876586],[11.810856,50.87661],[11.811185,50.876634],[11.812333,50.876721],[11.813141,50.876794],[11.814374,50.876897],[11.815076,50.876956],[11.818849,50.877258],[11.820287,50.877379],[11.82154,50.877484],[11.821606,50.87749],[11.824242,50.877728],[11.827781,50.878081],[11.828844,50.878197],[11.829246,50.87824],[11.830661,50.878397],[11.832053,50.878552],[11.832469,50.878599],[11.834601,50.878857],[11.834821,50.87888],[11.836443,50.879078],[11.837637,50.87922],[11.838171,50.879279],[11.843023,50.879843],[11.846114,50.880204],[11.847136,50.880322],[11.849541,50.880595],[11.849739,50.880618],[11.853559,50.881062],[11.855499,50.881293],[11.855995,50.881365],[11.856478,50.881433],[11.857123,50.88155],[11.859517,50.882044],[11.860175,50.882181],[11.86059,50.882292],[11.861068,50.882436],[11.861356,50.882529],[11.861815,50.88268],[11.862112,50.882783],[11.862631,50.88298],[11.863159,50.883194],[11.864017,50.883587],[11.864978,50.884068],[11.866037,50.884632],[11.868739,50.886068],[11.868992,50.886203],[11.869331,50.886393],[11.870693,50.887127],[11.874132,50.888981],[11.875151,50.88953],[11.875416,50.889668],[11.875706,50.889825],[11.876534,50.890271],[11.877345,50.890679],[11.878213,50.891096],[11.87875,50.891331],[11.879262,50.891532],[11.879507,50.891628],[11.87982,50.891753],[11.880755,50.892077],[11.881619,50.892343],[11.882453,50.892572],[11.882946,50.892691],[11.884302,50.892983],[11.886339,50.893296],[11.887795,50.89344],[11.889294,50.893518],[11.891117,50.893523],[11.89372,50.893387],[11.900327,50.893039],[11.900514,50.893029],[11.901134,50.892995],[11.907925,50.892615],[11.911843,50.892394],[11.913998,50.892184],[11.914707,50.892072],[11.916228,50.891831],[11.921293,50.890995],[11.924816,50.890433],[11.928532,50.889846],[11.930765,50.889492],[11.932065,50.889323],[11.933378,50.889177],[11.934647,50.889065],[11.936127,50.888951],[11.937796,50.888859],[11.939504,50.888821],[11.94197,50.888843],[11.94226,50.888856],[11.943355,50.888911],[11.944849,50.888987],[11.945709,50.889045],[11.946768,50.889153],[11.948202,50.88931],[11.948804,50.889395],[11.95018,50.889594],[11.950976,50.889727],[11.951621,50.889843],[11.951735,50.889861],[11.952576,50.890022],[11.954074,50.890329],[11.95536,50.890632],[11.955633,50.890698],[11.957351,50.89117],[11.958934,50.891645],[11.9612,50.892378],[11.962465,50.892824],[11.963691,50.893256],[11.964205,50.893442],[11.966637,50.894296],[11.968806,50.895061],[11.969143,50.89518],[11.971109,50.895868],[11.971579,50.896019],[11.97208,50.896172],[11.972556,50.896306],[11.973064,50.896443],[11.973841,50.896624],[11.974398,50.896742],[11.974924,50.896843],[11.975747,50.896978],[11.976415,50.89708],[11.976629,50.897111],[11.977519,50.89722],[11.978023,50.897285],[11.978547,50.897353],[11.979239,50.897434],[11.981335,50.897688],[11.981723,50.897736],[11.982495,50.897826],[11.983444,50.897936],[11.984477,50.898063],[11.985039,50.898136],[11.985871,50.898245],[11.986577,50.898342],[11.987275,50.898447],[11.987953,50.89857],[11.98869,50.898728],[11.989314,50.898877],[11.989647,50.898967],[11.991517,50.899505],[11.995061,50.900617],[11.999919,50.902141],[12.001512,50.902484],[12.001786,50.90254],[12.002292,50.902644],[12.00439,50.903053],[12.008538,50.903853],[12.012306,50.904612],[12.012609,50.904675],[12.013154,50.904785],[12.013946,50.904927],[12.014883,50.905101],[12.016056,50.90529],[12.017266,50.905429],[12.018244,50.905532],[12.019541,50.905628],[12.020447,50.905681],[12.021196,50.905707],[12.022536,50.905763],[12.02354,50.905806],[12.024794,50.905851],[12.026043,50.905903],[12.02691,50.905946],[12.027072,50.905955],[12.02805,50.906003],[12.029172,50.906057],[12.030006,50.906097],[12.030482,50.906121],[12.030848,50.90614],[12.031836,50.906193],[12.032711,50.906242],[12.03424,50.906325],[12.035314,50.906385],[12.035771,50.906404],[12.037243,50.906483],[12.038166,50.906529],[12.039006,50.906569],[12.040723,50.90665],[12.041709,50.906693],[12.042523,50.906724],[12.043833,50.906786],[12.046303,50.906901],[12.046733,50.906923],[12.048193,50.906995],[12.048243,50.906999],[12.049695,50.907106],[12.052219,50.907395],[12.054437,50.907654],[12.056859,50.907923],[12.057648,50.908011],[12.058438,50.908102],[12.061796,50.908492],[12.061838,50.908498],[12.064179,50.90881],[12.065131,50.908937],[12.065541,50.908988],[12.066408,50.909113],[12.066776,50.909167],[12.069672,50.909597],[12.070528,50.909715],[12.070896,50.909766],[12.071463,50.909849],[12.071989,50.909926],[12.072823,50.910045],[12.074638,50.910314],[12.075498,50.910443],[12.076359,50.910569],[12.077164,50.910684],[12.07798,50.910804],[12.078777,50.910917],[12.07972,50.911062],[12.080835,50.911215],[12.081803,50.911351],[12.082764,50.91149],[12.084576,50.911711],[12.084778,50.911729],[12.085301,50.911778],[12.086983,50.911884],[12.088427,50.911916],[12.089808,50.911918],[12.091013,50.911877],[12.092145,50.911808],[12.092754,50.911756],[12.092972,50.911734],[12.093271,50.911698],[12.093794,50.911637],[12.094151,50.9116],[12.095065,50.911493],[12.097096,50.911147],[12.097301,50.911109],[12.097841,50.911007],[12.098388,50.910899],[12.098929,50.910796],[12.09907,50.910769],[12.099395,50.910709],[12.099872,50.910616],[12.100365,50.910527],[12.101023,50.910394],[12.101778,50.910249],[12.102406,50.91012],[12.103051,50.909997],[12.103712,50.909867],[12.104354,50.909742],[12.104917,50.909632],[12.105478,50.909516],[12.106258,50.909368],[12.106837,50.909254],[12.107141,50.909194],[12.107293,50.909165],[12.108898,50.908853],[12.113064,50.908033],[12.114835,50.907628],[12.116502,50.907164],[12.117549,50.906835],[12.118123,50.906635],[12.118977,50.906322],[12.120135,50.905838],[12.120365,50.905742],[12.120702,50.905595],[12.1213,50.905332],[12.121794,50.905089],[12.123021,50.904486],[12.124068,50.903975],[12.124671,50.903681],[12.126442,50.902812],[12.1297,50.901214],[12.130376,50.900886],[12.13188,50.900143],[12.132454,50.899859],[12.133021,50.899586],[12.133739,50.899207],[12.13443,50.898818],[12.134714,50.898653],[12.135517,50.898131],[12.135693,50.898014],[12.136704,50.89726],[12.137764,50.896396],[12.138042,50.896179],[12.138267,50.896003],[12.140245,50.894409],[12.144552,50.89094],[12.149114,50.887263],[12.150239,50.886337],[12.150764,50.885933],[12.150973,50.885757],[12.151275,50.885522],[12.152034,50.884906],[12.152119,50.88484],[12.152587,50.884462],[12.153042,50.884096],[12.153759,50.883515],[12.155476,50.882171],[12.156518,50.881438],[12.157472,50.880823],[12.15794,50.880558],[12.158335,50.880334],[12.15987,50.879544],[12.16124,50.878943],[12.162834,50.878332],[12.163658,50.878053],[12.164397,50.877796],[12.166371,50.877237],[12.16789,50.876894],[12.169251,50.876645],[12.170643,50.876447],[12.170987,50.876398],[12.173188,50.876161],[12.17762,50.875749],[12.184243,50.875129],[12.185071,50.875051],[12.1864,50.874927],[12.186775,50.874891],[12.191854,50.874419],[12.198561,50.873812],[12.205875,50.873117],[12.20945,50.872785],[12.211804,50.872567],[12.212323,50.872515],[12.213103,50.87244],[12.216504,50.872112],[12.217412,50.872036],[12.218143,50.871984],[12.219103,50.871906],[12.220023,50.87185],[12.221818,50.871755],[12.222435,50.871725],[12.223002,50.87169],[12.223902,50.871644],[12.224477,50.871619],[12.225155,50.871589],[12.227476,50.871472],[12.228674,50.871404],[12.231322,50.87128],[12.23379,50.871153],[12.233923,50.871148],[12.236907,50.870994],[12.239673,50.870853],[12.241047,50.870788],[12.24259,50.870716],[12.244929,50.870601],[12.245357,50.870577],[12.247108,50.870476],[12.248131,50.870402],[12.248912,50.870346],[12.250926,50.870201],[12.252282,50.870096],[12.255341,50.869817],[12.256547,50.869707],[12.256861,50.869669],[12.258563,50.869445],[12.259026,50.869384],[12.260074,50.869198],[12.261527,50.868937],[12.262634,50.868677],[12.263349,50.868517],[12.264548,50.868211],[12.265935,50.867823],[12.266886,50.867563],[12.268462,50.867102],[12.269416,50.866852],[12.271259,50.866361],[12.272285,50.866098],[12.273211,50.865883],[12.274692,50.865568],[12.275045,50.865497],[12.275322,50.86544],[12.276851,50.865147],[12.278346,50.864881],[12.279807,50.864606],[12.281748,50.864243],[12.282745,50.864066],[12.285424,50.863578],[12.286401,50.863397],[12.287375,50.863228],[12.288473,50.863046],[12.290093,50.862778],[12.29582,50.861997],[12.298551,50.86158],[12.301347,50.861078],[12.302497,50.860832],[12.302985,50.860727],[12.303261,50.86067],[12.305828,50.860047],[12.307703,50.859548],[12.308174,50.859423],[12.309542,50.859005],[12.310988,50.858542],[12.311616,50.858335],[12.312509,50.85805],[12.314278,50.857428],[12.315642,50.856946],[12.317435,50.856307],[12.317854,50.856158],[12.31849,50.855935],[12.320658,50.855197],[12.32228,50.85468],[12.324979,50.853905],[12.327727,50.853133],[12.328448,50.852904],[12.329823,50.852469],[12.331376,50.851924],[12.332902,50.851314],[12.334049,50.850807],[12.334647,50.850515],[12.335319,50.850187],[12.335563,50.850054],[12.336641,50.849439],[12.336983,50.849238],[12.337439,50.848965],[12.338172,50.848523],[12.338534,50.848308],[12.339265,50.847867],[12.340955,50.846902],[12.342146,50.846286],[12.343106,50.845819],[12.344111,50.845379],[12.344832,50.845087],[12.345012,50.845014],[12.350364,50.842854],[12.354818,50.841068],[12.356119,50.840546],[12.356926,50.840223],[12.35937,50.839242],[12.361002,50.838595],[12.362657,50.837959],[12.362974,50.837848],[12.363666,50.837604],[12.364695,50.837274],[12.364697,50.837274],[12.36669,50.836716],[12.368097,50.836394],[12.36942,50.836136],[12.369546,50.836111],[12.371401,50.835836],[12.373284,50.835633],[12.374484,50.83555],[12.3766,50.835405],[12.383627,50.834945],[12.38941,50.834566],[12.390726,50.834479],[12.394028,50.834262],[12.397352,50.834043],[12.397858,50.834009],[12.400281,50.833845],[12.401739,50.833748],[12.404595,50.83356],[12.406057,50.833433],[12.406903,50.833336],[12.407519,50.833248],[12.40891,50.833028],[12.410417,50.832722],[12.411611,50.832435],[12.412493,50.832192],[12.413367,50.831927],[12.414107,50.831685],[12.414831,50.831429],[12.416252,50.830893],[12.417822,50.830255],[12.419044,50.829752],[12.419386,50.829604],[12.422305,50.8284],[12.423534,50.827926],[12.424808,50.827473],[12.425649,50.827194],[12.426713,50.826878],[12.427697,50.826605],[12.428704,50.826346],[12.430157,50.826037],[12.430411,50.825987],[12.432932,50.825525],[12.434357,50.825338],[12.434824,50.825291],[12.436704,50.82512],[12.43802,50.825027],[12.439041,50.824971],[12.439844,50.824927],[12.442018,50.824827],[12.444208,50.824717],[12.444617,50.824696],[12.446424,50.824591],[12.448361,50.824506],[12.449937,50.824425],[12.451672,50.824343],[12.453228,50.824277],[12.454818,50.824261],[12.455876,50.824263],[12.456225,50.824263],[12.45784,50.824345],[12.458768,50.824409],[12.458857,50.824415],[12.460109,50.824533],[12.461517,50.8247],[12.462683,50.824867],[12.463596,50.825015],[12.464338,50.82516],[12.465679,50.825415],[12.466763,50.825613],[12.468458,50.825935],[12.469291,50.826099],[12.46982,50.8262],[12.470968,50.826424],[12.47211,50.82664],[12.472876,50.826784],[12.473385,50.826884],[12.4742,50.827053],[12.475101,50.827239],[12.476007,50.827464],[12.476904,50.827704],[12.477828,50.827972],[12.478765,50.828274],[12.479712,50.828607],[12.479738,50.828616],[12.480554,50.828916],[12.481412,50.829268],[12.482267,50.829654],[12.48324,50.830131],[12.483802,50.830419],[12.484659,50.830905],[12.48513,50.831171],[12.486145,50.831821],[12.48724,50.832576],[12.488101,50.833196],[12.488406,50.833417],[12.489279,50.834048],[12.489552,50.834242],[12.489965,50.834523],[12.490511,50.834867],[12.492122,50.835844],[12.492847,50.836249],[12.493662,50.83666],[12.494071,50.836856],[12.494793,50.837172],[12.495221,50.837358],[12.496006,50.837681],[12.496642,50.837931],[12.497532,50.838245],[12.49845,50.838545],[12.499246,50.838783],[12.500049,50.839006],[12.500797,50.8392],[12.500847,50.839212],[12.501131,50.83928],[12.502075,50.839489],[12.502904,50.839655],[12.503573,50.839779],[12.504122,50.83987],[12.504873,50.839983],[12.506292,50.840161],[12.506827,50.840217],[12.507297,50.840262],[12.508662,50.840365],[12.510301,50.840466],[12.511335,50.840531],[12.51213,50.840577],[12.514435,50.840725],[12.515193,50.840773],[12.516124,50.840833],[12.517663,50.840923],[12.518082,50.840954],[12.520051,50.841081],[12.521426,50.841181],[12.522077,50.841229],[12.525856,50.841556],[12.528883,50.841859],[12.529641,50.841939],[12.533626,50.842343],[12.535827,50.842571],[12.538929,50.842893],[12.540184,50.843023],[12.542724,50.843284],[12.542919,50.843304],[12.543968,50.843408],[12.545152,50.843513],[12.546089,50.843583],[12.547539,50.843649],[12.548442,50.84368],[12.549898,50.843709],[12.550618,50.84372],[12.556072,50.843796],[12.556977,50.843809],[12.559724,50.843847],[12.563613,50.843917],[12.563921,50.843922],[12.564092,50.843925],[12.569964,50.843999],[12.571085,50.843997],[12.57224,50.843966],[12.573173,50.843926],[12.57411,50.843859],[12.575229,50.843746],[12.576365,50.843619],[12.577101,50.843525],[12.577841,50.843409],[12.578805,50.843235],[12.579464,50.843101],[12.580508,50.842864],[12.581894,50.842521],[12.583662,50.841986],[12.585137,50.841448],[12.586515,50.840884],[12.588004,50.840207],[12.589389,50.839471],[12.590017,50.839105],[12.59063,50.838722],[12.591275,50.8383],[12.591902,50.837869],[12.595119,50.835599],[12.595246,50.835509],[12.598837,50.832971],[12.599568,50.832473],[12.600027,50.832176],[12.600319,50.831986],[12.601593,50.831227],[12.602478,50.830755],[12.603395,50.830304],[12.604533,50.829794],[12.605632,50.829351],[12.606436,50.829052],[12.60803,50.828524],[12.609658,50.828065],[12.61079,50.827791],[12.611935,50.827539],[12.616988,50.82649],[12.622413,50.82536],[12.623873,50.825062],[12.625135,50.824775],[12.625962,50.824566],[12.62697,50.824301],[12.628136,50.823963],[12.629578,50.823493],[12.630991,50.822982],[12.634258,50.82173],[12.63579,50.82116],[12.63737,50.820637],[12.638969,50.820149],[12.639956,50.819874],[12.640959,50.819615],[12.641775,50.81942],[12.6426,50.819235],[12.644042,50.818943],[12.645522,50.818681],[12.646036,50.818599],[12.647043,50.818449],[12.647325,50.818408],[12.648367,50.818259],[12.651703,50.817763],[12.652671,50.817609],[12.65421,50.817343],[12.65686,50.816856],[12.658785,50.816465],[12.664271,50.8153],[12.667647,50.814583],[12.668145,50.814478],[12.669553,50.814177],[12.671026,50.813895],[12.672424,50.813681],[12.673317,50.813572],[12.674217,50.813486],[12.675068,50.813428],[12.675931,50.813383],[12.676596,50.813364],[12.677264,50.813355],[12.678627,50.813346],[12.679972,50.813333],[12.681319,50.81331],[12.68232,50.813274],[12.68332,50.813221],[12.684607,50.813123],[12.68564,50.81302],[12.686115,50.812967],[12.687529,50.812779],[12.688951,50.812546],[12.689917,50.812361],[12.690881,50.812159],[12.69215,50.811859],[12.693247,50.811567],[12.695376,50.81093],[12.697488,50.810281],[12.698424,50.810027],[12.69937,50.809798],[12.700265,50.809611],[12.701176,50.80945],[12.702239,50.809295],[12.703314,50.809174],[12.704097,50.809107],[12.704786,50.809063],[12.705826,50.809028],[12.706581,50.80902],[12.707337,50.809029],[12.708158,50.809058],[12.708979,50.809106],[12.709754,50.80917],[12.710527,50.809254],[12.711381,50.809366],[12.712227,50.8095],[12.712965,50.809637],[12.713695,50.809791],[12.714411,50.80996],[12.715115,50.810141],[12.716008,50.810401],[12.716887,50.81069],[12.717921,50.811072],[12.718926,50.811489],[12.721543,50.812676],[12.72416,50.813868],[12.725367,50.814422],[12.726534,50.814948],[12.727655,50.815429],[12.728303,50.815688],[12.728961,50.815938],[12.729955,50.816283],[12.730755,50.81654],[12.731002,50.816616],[12.732137,50.816937],[12.733315,50.81723],[12.734544,50.817496],[12.735839,50.817735],[12.737286,50.817958],[12.740771,50.818421],[12.744264,50.818879],[12.745708,50.819065],[12.746135,50.819121],[12.747933,50.81935],[12.750577,50.819711],[12.751228,50.819795],[12.753441,50.820086],[12.754111,50.820182],[12.755169,50.820339],[12.755363,50.820364],[12.757676,50.820719],[12.758118,50.820792],[12.758631,50.820876],[12.760386,50.821172],[12.761364,50.821356],[12.762819,50.821654],[12.763976,50.821926],[12.765127,50.822232],[12.766532,50.822655],[12.767199,50.822877],[12.768067,50.823186],[12.769225,50.823637],[12.769649,50.823817],[12.770959,50.824404],[12.77153,50.824687],[12.77273,50.825295],[12.773586,50.825736],[12.774462,50.82617],[12.775175,50.826496],[12.775915,50.826803],[12.776495,50.827028],[12.777129,50.827253],[12.777329,50.82732],[12.777822,50.827484],[12.778531,50.827693],[12.779144,50.827862],[12.779765,50.828019],[12.781433,50.828415],[12.782286,50.828619],[12.783136,50.828834],[12.784131,50.829117],[12.785219,50.829477],[12.786281,50.829875],[12.787423,50.83037],[12.787975,50.830634],[12.788513,50.830908],[12.789142,50.831254],[12.789442,50.831428],[12.790326,50.831989],[12.791575,50.832875],[12.792492,50.833671],[12.793503,50.834745],[12.793816,50.835118],[12.794141,50.835536],[12.794779,50.836465],[12.795383,50.837407],[12.796047,50.838417],[12.796353,50.838858],[12.796807,50.839465],[12.79727,50.840027],[12.79758,50.840371],[12.797904,50.840709],[12.798343,50.841133],[12.798938,50.841661],[12.799385,50.84202],[12.799857,50.842379],[12.800289,50.842685],[12.800738,50.842978],[12.801356,50.843363],[12.802007,50.843731],[12.802509,50.844001],[12.803028,50.844255],[12.803406,50.844428],[12.804605,50.844944],[12.805173,50.845162],[12.805333,50.845226],[12.806057,50.845505],[12.806996,50.845842],[12.807863,50.84614],[12.808435,50.846322],[12.809899,50.846789],[12.810553,50.846985],[12.812106,50.84741],[12.812181,50.847431],[12.813132,50.84768],[12.814795,50.848063],[12.815778,50.848277],[12.816713,50.848461],[12.81771,50.848652],[12.818583,50.8488],[12.81996,50.849012],[12.821792,50.849263],[12.82389,50.849489],[12.82738,50.84987],[12.830848,50.850252],[12.831403,50.850312],[12.832125,50.850391],[12.832503,50.850431],[12.833056,50.85049],[12.833929,50.850582],[12.83736,50.850953],[12.84004,50.851244],[12.841128,50.85136],[12.845964,50.851883],[12.84763,50.852065],[12.848004,50.852106],[12.849634,50.852281],[12.850839,50.852427],[12.85212,50.85262],[12.853608,50.852902],[12.854928,50.853227],[12.855763,50.853459],[12.85646,50.853677],[12.85719,50.853909],[12.858224,50.854292],[12.859316,50.854735],[12.859664,50.854889],[12.860127,50.855104],[12.860819,50.855437],[12.861221,50.855634],[12.86175,50.855923],[12.862693,50.856471],[12.863631,50.857064],[12.864892,50.857917],[12.865004,50.857994],[12.867033,50.859461],[12.867459,50.859768],[12.868425,50.860462],[12.869585,50.861281],[12.870864,50.862185],[12.871638,50.862714],[12.872509,50.863255],[12.873487,50.863846],[12.874442,50.864381],[12.87461,50.864472],[12.875209,50.864796],[12.875828,50.865109],[12.876787,50.865572],[12.878045,50.866142],[12.879183,50.866622],[12.880443,50.867101],[12.880782,50.867223],[12.881426,50.867439],[12.882078,50.867647],[12.882559,50.86779],[12.883181,50.867969],[12.8839,50.868158],[12.885299,50.868502],[12.887674,50.869062],[12.88888,50.869349],[12.890078,50.86963],[12.894518,50.870675],[12.89895,50.871719],[12.902475,50.872545],[12.903371,50.872755],[12.904277,50.87297],[12.905609,50.873296],[12.907126,50.873712],[12.907569,50.873839],[12.908075,50.873993],[12.90854,50.874134],[12.908952,50.874267],[12.91005,50.874619],[12.911206,50.875037],[12.912505,50.875532],[12.912794,50.875649],[12.912957,50.875716],[12.913762,50.876058],[12.914553,50.87641],[12.915747,50.876972],[12.915874,50.877032],[12.916538,50.877352],[12.918233,50.878251],[12.919009,50.878689],[12.924351,50.881681],[12.925687,50.88243],[12.926448,50.882879],[12.927194,50.883345],[12.92769,50.883677],[12.928176,50.884024],[12.929104,50.88474],[12.92922,50.884835],[12.930869,50.886251],[12.932613,50.887751],[12.933569,50.888514],[12.933841,50.888714],[12.935154,50.889613],[12.935981,50.890119],[12.936848,50.890605],[12.937739,50.891064],[12.938671,50.891508],[12.939125,50.891703],[12.93974,50.891967],[12.940837,50.892408],[12.941984,50.892859],[12.943116,50.893306],[12.944309,50.893772],[12.945638,50.894299],[12.947163,50.894894],[12.95058,50.896242],[12.950801,50.896329],[12.952633,50.897047],[12.954737,50.897874],[12.956501,50.898576],[12.958921,50.89961],[12.96054,50.900418],[12.961203,50.900783],[12.961851,50.901159],[12.962352,50.901469],[12.963072,50.901936],[12.963755,50.902401],[12.964264,50.90276],[12.965709,50.9038],[12.966363,50.904263],[12.967024,50.904713],[12.967744,50.905176],[12.968742,50.905767],[12.969823,50.906345],[12.970916,50.906856],[12.972138,50.907397],[12.973426,50.907894],[12.974408,50.908235],[12.97525,50.908507],[12.975503,50.908585],[12.975987,50.908729],[12.976972,50.909004],[12.977593,50.90917],[12.978248,50.909336],[12.978892,50.909506],[12.980008,50.909798],[12.981148,50.910077],[12.981845,50.910242],[12.983555,50.91064],[12.984581,50.910874],[12.985376,50.911048],[12.985766,50.911129],[12.986673,50.911318],[12.987746,50.911532],[12.989153,50.911801],[12.990809,50.912118],[12.99153,50.912246],[12.991908,50.91231],[12.992241,50.912368],[12.992864,50.912475],[12.99396,50.912655],[12.994847,50.912793],[12.996141,50.912974],[12.997012,50.913088],[12.997753,50.91317],[12.99842,50.913233],[12.999014,50.913282],[12.999601,50.913325],[13.000067,50.913355],[13.001531,50.913432],[13.001905,50.913449],[13.003316,50.913514],[13.005509,50.91361],[13.005855,50.913625],[13.00616,50.913639],[13.00936,50.913783],[13.01041,50.913828],[13.011773,50.913896],[13.012947,50.913973],[13.013257,50.913997],[13.014119,50.914074],[13.014744,50.91414],[13.015556,50.914239],[13.01648,50.914376],[13.017215,50.914499],[13.018087,50.914666],[13.019518,50.914984],[13.020331,50.915188],[13.020906,50.915345],[13.022812,50.915892],[13.02319,50.916005],[13.023568,50.916115],[13.024663,50.916446],[13.026182,50.916901],[13.026852,50.917101],[13.027031,50.917155],[13.028175,50.917496],[13.028696,50.91765],[13.029111,50.917773],[13.02958,50.917914],[13.029967,50.91803],[13.03206,50.918652],[13.032396,50.918754],[13.033192,50.918999],[13.033576,50.919118],[13.034235,50.919333],[13.035299,50.919699],[13.036171,50.920026],[13.037368,50.92051],[13.038175,50.920869],[13.038955,50.921219],[13.039186,50.921322],[13.04005,50.921701],[13.041039,50.922168],[13.042038,50.922648],[13.042623,50.92292],[13.043436,50.923316],[13.04433,50.923751],[13.045286,50.924191],[13.046665,50.924842],[13.04806,50.925508],[13.049117,50.926011],[13.049744,50.926321],[13.049903,50.926403],[13.050725,50.926822],[13.051514,50.927263],[13.05227,50.927702],[13.052865,50.928069],[13.053262,50.928327],[13.053413,50.928428],[13.054355,50.929079],[13.0552,50.929728],[13.055969,50.930355],[13.05657,50.930881],[13.057018,50.931283],[13.057288,50.931566],[13.057837,50.932115],[13.058225,50.932544],[13.058713,50.933097],[13.059297,50.933835],[13.059511,50.934113],[13.059918,50.9347],[13.060237,50.935162],[13.060588,50.935763],[13.061085,50.936673],[13.061505,50.937612],[13.062179,50.939334],[13.062838,50.941075],[13.063668,50.943277],[13.064156,50.944462],[13.064777,50.94583],[13.065472,50.947182],[13.066958,50.950012],[13.067497,50.951031],[13.067718,50.951459],[13.068237,50.952421],[13.068811,50.953512],[13.06984,50.955491],[13.070432,50.956566],[13.070587,50.956847],[13.071024,50.957575],[13.071569,50.958392],[13.07158,50.958408],[13.072022,50.959015],[13.072355,50.959427],[13.072842,50.96002],[13.07322,50.960453],[13.073868,50.961146],[13.074422,50.961707],[13.075024,50.962316],[13.075263,50.962545],[13.075595,50.962861],[13.076758,50.963985],[13.077234,50.964447],[13.0781,50.965291],[13.079151,50.9663],[13.079754,50.966883],[13.081113,50.968196],[13.081514,50.968584],[13.081693,50.968756],[13.083983,50.970975],[13.084428,50.971406],[13.085407,50.972346],[13.089022,50.975841],[13.089225,50.976041],[13.090132,50.97691],[13.091728,50.978459],[13.095572,50.982171],[13.096886,50.98344],[13.097742,50.984266],[13.09848,50.984945],[13.099053,50.985446],[13.099607,50.98592],[13.09996,50.986213],[13.100291,50.986466],[13.100949,50.986946],[13.101477,50.987302],[13.102489,50.987921],[13.103131,50.988273],[13.103779,50.988594],[13.104778,50.989045],[13.105104,50.989179],[13.105756,50.989433],[13.106773,50.989786],[13.108112,50.99019],[13.109067,50.990435],[13.109811,50.990596],[13.110781,50.990784],[13.111438,50.990891],[13.112029,50.990975],[13.11298,50.991087],[13.11381,50.991162],[13.114935,50.991226],[13.115518,50.991247],[13.118253,50.991349],[13.119389,50.991382],[13.121645,50.991428],[13.125583,50.991459],[13.125864,50.991462],[13.126067,50.991464],[13.128429,50.991491],[13.129448,50.991539],[13.129954,50.991575],[13.130467,50.991623],[13.131276,50.991709],[13.131777,50.99178],[13.132275,50.991858],[13.132386,50.991875],[13.13267,50.99192],[13.133741,50.992135],[13.134432,50.992295],[13.135609,50.99261],[13.13653,50.992895],[13.137435,50.993187],[13.139651,50.993896],[13.139819,50.99395],[13.144502,50.995457],[13.148314,50.996686],[13.149449,50.997042],[13.151277,50.997571],[13.151439,50.997617],[13.151619,50.997665],[13.156004,50.998827],[13.158025,50.999359],[13.160437,50.999995],[13.162823,51.00062],[13.164526,51.001067],[13.165215,51.001226],[13.165906,51.001373],[13.166634,51.001506],[13.167365,51.001622],[13.167979,51.001704],[13.168607,51.001773],[13.169644,51.001855],[13.170762,51.001903],[13.1711,51.001908],[13.171648,51.00191],[13.172241,51.001898],[13.172952,51.001871],[13.173881,51.001813],[13.175857,51.001649],[13.176966,51.001562],[13.17814,51.001498],[13.178907,51.001467],[13.180557,51.001437],[13.182531,51.001442],[13.182571,51.001442],[13.186383,51.001472],[13.1884,51.00147],[13.190303,51.001442],[13.190623,51.001435],[13.194807,51.001325],[13.199111,51.001205],[13.200497,51.001166],[13.200726,51.00116],[13.201954,51.00113],[13.204733,51.001054],[13.207182,51.00099],[13.208573,51.000972],[13.210135,51.000981],[13.210994,51.001006],[13.211849,51.001042],[13.213617,51.001175],[13.21472,51.001284],[13.215972,51.001437],[13.217128,51.001611],[13.218266,51.001802],[13.219205,51.001989],[13.220785,51.002336],[13.221508,51.002509],[13.222551,51.002788],[13.223753,51.003136],[13.224165,51.003266],[13.225459,51.003694],[13.226528,51.004087],[13.227318,51.004397],[13.228099,51.004718],[13.229383,51.005295],[13.23025,51.005719],[13.231116,51.006166],[13.233197,51.007347],[13.237054,51.009596],[13.238567,51.010477],[13.243658,51.013449],[13.24877,51.01643],[13.251332,51.017924],[13.253742,51.019319],[13.254043,51.019499],[13.256703,51.02105],[13.259306,51.022566],[13.26059,51.023317],[13.262545,51.024458],[13.26355,51.025046],[13.264473,51.025607],[13.265345,51.026203],[13.265704,51.026465],[13.266157,51.026828],[13.268561,51.028935],[13.268926,51.02924],[13.269325,51.029549],[13.270092,51.030099],[13.270877,51.03058],[13.271502,51.030928],[13.272072,51.031219],[13.272784,51.031551],[13.273504,51.031854],[13.274098,51.032084],[13.274318,51.032162],[13.275083,51.03242],[13.275788,51.032628],[13.276252,51.032766],[13.276943,51.032925],[13.277412,51.033022],[13.278072,51.033138],[13.27875,51.033239],[13.279464,51.033325],[13.280181,51.033382],[13.280903,51.033418],[13.28178,51.033447],[13.282938,51.03346],[13.284177,51.033474],[13.285057,51.033486],[13.28584,51.033517],[13.286423,51.033539],[13.287105,51.033602],[13.287887,51.033664],[13.288646,51.033753],[13.289409,51.033857],[13.290466,51.034036],[13.291537,51.03425],[13.293585,51.034717],[13.294246,51.034871],[13.294912,51.035017],[13.295092,51.035052],[13.295605,51.035153],[13.296293,51.035275],[13.296919,51.035373],[13.297993,51.035502],[13.299151,51.035619],[13.300957,51.035792],[13.301635,51.035861],[13.303985,51.036073],[13.30538,51.036208],[13.308809,51.036529],[13.313214,51.036955],[13.315915,51.037211],[13.319642,51.037554],[13.320354,51.037619],[13.320788,51.037667],[13.321633,51.037765],[13.322586,51.037904],[13.322693,51.037922],[13.323191,51.038004],[13.323858,51.038136],[13.324645,51.038299],[13.325655,51.038557],[13.326295,51.038738],[13.326995,51.03895],[13.327369,51.039074],[13.328057,51.039309],[13.328997,51.039687],[13.329309,51.039824],[13.329527,51.03992],[13.33017,51.040226],[13.330801,51.04055],[13.33168,51.041068],[13.332323,51.041497],[13.332931,51.041937],[13.333639,51.042495],[13.334336,51.04306],[13.334921,51.043532],[13.336036,51.044436],[13.336967,51.045172],[13.337351,51.045473],[13.337787,51.045773],[13.338181,51.046006],[13.338546,51.046204],[13.338797,51.046335],[13.339387,51.046637],[13.339853,51.046858],[13.340376,51.047079],[13.341079,51.04736],[13.341761,51.04759],[13.342371,51.047782],[13.342933,51.047936],[13.343506,51.048076],[13.344126,51.048213],[13.344742,51.048334],[13.345326,51.048435],[13.345913,51.048529],[13.346352,51.048598],[13.348792,51.048973],[13.35024,51.049189],[13.35165,51.049402],[13.353717,51.049715],[13.355569,51.049995],[13.356433,51.050145],[13.35773,51.050397],[13.358357,51.050539],[13.358941,51.050683],[13.359924,51.050954],[13.360786,51.051226],[13.36184,51.051597],[13.362893,51.052013],[13.363951,51.052464],[13.36445,51.052672],[13.364652,51.052763],[13.366673,51.053643],[13.367296,51.053913],[13.367817,51.054134],[13.368416,51.05439],[13.370385,51.055256],[13.37044,51.055281],[13.372466,51.056158],[13.37381,51.056726],[13.374679,51.057065],[13.37556,51.057382],[13.376535,51.057692],[13.376764,51.057755],[13.37729,51.057899],[13.378025,51.058076],[13.378655,51.058212],[13.379301,51.05834],[13.379722,51.05841],[13.380258,51.058492],[13.381022,51.058594],[13.38181,51.058679],[13.383033,51.05876],[13.383617,51.058783],[13.384258,51.058795],[13.384728,51.0588],[13.385545,51.05878],[13.386266,51.058747],[13.387547,51.058667],[13.388837,51.05857],[13.390039,51.058488],[13.391578,51.058405],[13.393273,51.058395],[13.394621,51.058423],[13.395757,51.058476],[13.39721,51.058586],[13.397795,51.058647],[13.398912,51.058777],[13.399613,51.05887],[13.400306,51.05897],[13.402007,51.059238],[13.403283,51.059453],[13.40478,51.059715],[13.40691,51.060068],[13.408977,51.06037],[13.409953,51.06049],[13.410929,51.060594],[13.411514,51.06065],[13.412423,51.060727],[13.413335,51.060797],[13.414397,51.060854],[13.415062,51.060875],[13.415515,51.060882],[13.415951,51.060884],[13.416987,51.060855],[13.417821,51.060802],[13.418638,51.06073],[13.419449,51.060629],[13.420257,51.0605],[13.421061,51.060346],[13.421764,51.060191],[13.422504,51.060011],[13.423177,51.059826],[13.424168,51.059539],[13.425143,51.059244],[13.426367,51.058887],[13.427182,51.058665],[13.428031,51.058461],[13.428721,51.058315],[13.429426,51.058184],[13.430415,51.058024],[13.431062,51.057938],[13.432009,51.057834],[13.432558,51.05779],[13.433342,51.057741],[13.434121,51.057716],[13.434886,51.057707],[13.435516,51.057716],[13.436179,51.057736],[13.436851,51.057771],[13.437708,51.057837],[13.438811,51.05796],[13.439623,51.058074],[13.440437,51.058209],[13.440983,51.058315],[13.441522,51.058434],[13.442063,51.058559],[13.442596,51.058691],[13.443411,51.058919],[13.444099,51.059116],[13.445569,51.059532],[13.44668,51.059814],[13.447546,51.059998],[13.448417,51.060164],[13.449168,51.060278],[13.449922,51.060375],[13.450679,51.060455],[13.451364,51.06051],[13.452151,51.060555],[13.452951,51.060578],[13.453744,51.060586],[13.454598,51.060567],[13.455473,51.060531],[13.45635,51.060479],[13.458208,51.060356],[13.459591,51.060273],[13.463253,51.060045],[13.465166,51.059924],[13.468294,51.059726],[13.471444,51.059529],[13.473424,51.059418],[13.474635,51.059366],[13.476308,51.059305],[13.477984,51.059263],[13.479441,51.05924],[13.480936,51.059228],[13.482578,51.05924],[13.483443,51.059248],[13.48526,51.059284],[13.486845,51.059332],[13.488031,51.05938],[13.489604,51.059457],[13.490269,51.059493],[13.490933,51.059533],[13.492123,51.059611],[13.493974,51.059753],[13.495122,51.059846],[13.496039,51.059932],[13.497535,51.060086],[13.499031,51.060249],[13.500998,51.060484],[13.502158,51.060623],[13.50353,51.06077],[13.504912,51.060905],[13.506112,51.06099],[13.507341,51.061052],[13.508491,51.061083],[13.509566,51.061085],[13.510321,51.061072],[13.510929,51.061055],[13.511734,51.061017],[13.51278,51.060948],[13.51419,51.060832],[13.516024,51.060666],[13.517732,51.060522],[13.518554,51.060472],[13.518991,51.060451],[13.520128,51.060414],[13.521148,51.060403],[13.522092,51.060423],[13.523448,51.060459],[13.52466,51.060491],[13.526052,51.06052],[13.528269,51.060588],[13.530031,51.060642],[13.530282,51.060649],[13.532027,51.060706],[13.533287,51.060746],[13.533303,51.060747],[13.537352,51.060867],[13.541213,51.060982],[13.549228,51.061222],[13.552853,51.061333],[13.556164,51.061423],[13.556985,51.061457],[13.559955,51.061546],[13.560564,51.061565],[13.561396,51.0616],[13.563605,51.061656],[13.565823,51.061726],[13.567462,51.061744],[13.568168,51.061751],[13.570386,51.06177],[13.573935,51.061785],[13.574146,51.061789],[13.576565,51.06183],[13.578444,51.061856],[13.579868,51.061916],[13.58096,51.061949],[13.584376,51.062015],[13.587547,51.062128],[13.588781,51.062162],[13.589874,51.06219],[13.592379,51.062275],[13.594004,51.062311],[13.595425,51.062354],[13.59569,51.062362],[13.597898,51.062434],[13.598774,51.062459],[13.600717,51.062529],[13.601591,51.062577],[13.601822,51.062594],[13.602248,51.062625],[13.603112,51.062688],[13.604537,51.062832],[13.6053,51.062909],[13.605916,51.063001],[13.606469,51.063089],[13.607328,51.063233],[13.608224,51.063391],[13.608653,51.063471],[13.609509,51.063646],[13.610759,51.063922],[13.615619,51.065051],[13.616578,51.065273],[13.618923,51.065845],[13.621239,51.06637],[13.621591,51.066458],[13.622053,51.066578],[13.622439,51.066669],[13.622828,51.066761],[13.623294,51.066874],[13.625894,51.067493],[13.628418,51.068079],[13.629223,51.068269],[13.631756,51.068862],[13.63178,51.068868],[13.635412,51.069689],[13.635763,51.069763],[13.637068,51.070038],[13.638764,51.070354],[13.639657,51.070512],[13.640574,51.07065],[13.641973,51.070853],[13.643395,51.071022],[13.645903,51.071261],[13.649346,51.071442],[13.649725,51.071463],[13.649945,51.071468],[13.651672,51.071517],[13.652251,51.071531],[13.652355,51.071534],[13.655047,51.071586],[13.655652,51.071598],[13.656949,51.071613],[13.657576,51.071621],[13.662007,51.071687],[13.662649,51.071704],[13.663083,51.071718],[13.663536,51.071738],[13.664031,51.071767],[13.664579,51.07181],[13.665059,51.071857],[13.665568,51.071912],[13.666073,51.071982],[13.666364,51.072027],[13.667303,51.072188],[13.668668,51.072464],[13.669977,51.072729],[13.670454,51.072826],[13.675383,51.073833],[13.676361,51.074036],[13.677329,51.074261],[13.678029,51.074448],[13.678836,51.074697],[13.679758,51.075022],[13.680568,51.075353],[13.681006,51.075548],[13.681487,51.075777],[13.682037,51.076062],[13.682493,51.076312],[13.683031,51.076636],[13.683173,51.076728],[13.683563,51.076988],[13.684242,51.07748],[13.68506,51.078138],[13.686267,51.07913],[13.686489,51.079313],[13.687232,51.079921],[13.68774,51.080382],[13.687943,51.080589],[13.688326,51.081006],[13.688669,51.081438],[13.689042,51.081978],[13.689228,51.082295],[13.689451,51.082702],[13.689617,51.083028],[13.69039,51.084544],[13.69076,51.085266],[13.691126,51.085997],[13.692311,51.088287],[13.692419,51.088497],[13.693088,51.089721],[13.693442,51.090308],[13.693725,51.09068],[13.694283,51.091449],[13.694853,51.092149],[13.695323,51.092673],[13.695605,51.092967],[13.696229,51.093619],[13.696654,51.093999],[13.697352,51.094599],[13.699512,51.096177],[13.699908,51.096441],[13.700052,51.096538],[13.701658,51.097433],[13.703179,51.098175],[13.703746,51.098381],[13.704868,51.098829],[13.705641,51.099077],[13.70643,51.09933],[13.7118,51.100595],[13.712242,51.100698],[13.71327,51.100937],[13.714061,51.101124],[13.714309,51.101181],[13.71595,51.101576],[13.71754,51.101927],[13.71819,51.102093],[13.721929,51.102941],[13.722977,51.103185],[13.724405,51.103536],[13.725077,51.103715],[13.725673,51.103879],[13.726047,51.103987],[13.727114,51.104319],[13.727651,51.104492],[13.728455,51.10477],[13.729124,51.105017],[13.730006,51.105358],[13.730729,51.105658],[13.731555,51.106017],[13.732317,51.106367],[13.732978,51.106682],[13.734189,51.107273],[13.734503,51.107427],[13.735737,51.108045],[13.736726,51.108551],[13.73709,51.108744],[13.737321,51.108867],[13.738086,51.109298],[13.738874,51.109783],[13.73922,51.110013],[13.739817,51.110439],[13.740207,51.110746],[13.740482,51.110972],[13.740681,51.111147],[13.740964,51.111405],[13.741375,51.111809],[13.74172,51.112175],[13.741883,51.112358],[13.742327,51.112898],[13.742744,51.113485],[13.743032,51.113918],[13.743261,51.114271],[13.743589,51.114831],[13.743849,51.115263],[13.744018,51.115568],[13.74434,51.116187],[13.744489,51.11648],[13.744797,51.11709],[13.745016,51.117545],[13.745174,51.117893],[13.745326,51.118185],[13.745594,51.118738],[13.745759,51.119111],[13.746061,51.119846],[13.746206,51.120195],[13.746356,51.120601],[13.746415,51.12078],[13.746616,51.121391],[13.746972,51.122555],[13.747299,51.123636],[13.747405,51.123987],[13.747542,51.124438],[13.747799,51.125286],[13.748314,51.12699],[13.748363,51.127151],[13.748626,51.128022],[13.748989,51.129232],[13.749144,51.129709],[13.749363,51.130441],[13.749912,51.132256],[13.750058,51.132694],[13.750483,51.133668],[13.750763,51.134152],[13.750879,51.134351],[13.751038,51.13459],[13.751461,51.135192],[13.751872,51.135699],[13.752574,51.136408],[13.753073,51.136853],[13.753598,51.137284],[13.754423,51.13792],[13.754467,51.137955],[13.754687,51.138115],[13.755563,51.138729],[13.756055,51.139069],[13.756656,51.139467],[13.75829,51.140595],[13.759162,51.141188],[13.759779,51.141607],[13.761617,51.142852],[13.762323,51.143319],[13.762788,51.14359],[13.763418,51.143967],[13.764148,51.144351],[13.764264,51.144408],[13.765325,51.144922],[13.766704,51.145571],[13.76928,51.14681],[13.769932,51.147121],[13.771812,51.148019],[13.772794,51.148502],[13.773762,51.149014],[13.773996,51.149142],[13.775451,51.150034],[13.775694,51.150193],[13.775979,51.150381],[13.77638,51.150644],[13.776862,51.150961],[13.776946,51.151015],[13.781143,51.153797],[13.78148,51.154031],[13.783402,51.155311],[13.785842,51.156818],[13.786099,51.156971],[13.789069,51.158789],[13.790056,51.159387],[13.793254,51.161288],[13.793742,51.161587],[13.795261,51.16251],[13.795791,51.162832],[13.796199,51.163087],[13.797782,51.164087],[13.799841,51.165398],[13.800557,51.165851],[13.801433,51.166405],[13.80227,51.166933],[13.802855,51.167303],[13.805084,51.1687],[13.805575,51.169002],[13.806159,51.169333],[13.807294,51.169894],[13.808055,51.170229],[13.808548,51.170446],[13.809013,51.170624],[13.809737,51.170875],[13.810323,51.171056],[13.811287,51.171328],[13.812148,51.17153],[13.813048,51.171717],[13.813927,51.171867],[13.814602,51.171963],[13.815121,51.172029],[13.815839,51.172093],[13.81646,51.172136],[13.817151,51.17217],[13.817842,51.17219],[13.818485,51.172196],[13.8196,51.172163],[13.8201,51.172137],[13.820742,51.172091],[13.821698,51.172002],[13.823013,51.171847],[13.824701,51.171633],[13.825099,51.171582],[13.82624,51.17145],[13.827915,51.171259],[13.828688,51.171182],[13.82956,51.171118],[13.830978,51.171044],[13.831775,51.171033],[13.832567,51.171022],[13.834276,51.17107],[13.834541,51.171079],[13.834977,51.171099],[13.835222,51.171109],[13.835786,51.171135],[13.837668,51.171223],[13.839531,51.171311],[13.843351,51.171491],[13.844041,51.171524],[13.844901,51.171564],[13.846401,51.171634],[13.847303,51.171676],[13.849566,51.171783],[13.850801,51.171822],[13.852695,51.171837],[13.853667,51.171831],[13.853877,51.171829],[13.855929,51.171782],[13.858126,51.171774],[13.859525,51.171749],[13.859793,51.171748],[13.860313,51.171742],[13.860857,51.171733],[13.861415,51.171723],[13.864264,51.171688],[13.865782,51.17167],[13.867061,51.171652],[13.867885,51.171632],[13.869555,51.171583],[13.869908,51.171572],[13.874946,51.17143],[13.875493,51.171414],[13.877955,51.171311],[13.878565,51.171296],[13.878965,51.171287],[13.88189,51.171208],[13.882391,51.171195],[13.88301,51.171175],[13.88529,51.171106],[13.88534,51.171104],[13.889264,51.170995],[13.89049,51.17096],[13.890854,51.170948],[13.899102,51.170696],[13.900531,51.170653],[13.900874,51.17064],[13.902597,51.170589],[13.904052,51.170545],[13.905307,51.170506],[13.910037,51.17034],[13.91066,51.170305],[13.911061,51.170268],[13.912101,51.170131],[13.913092,51.169961],[13.914073,51.169729],[13.915224,51.169404],[13.916287,51.169033],[13.916628,51.168887],[13.917075,51.168689],[13.917274,51.168602],[13.91802,51.168217],[13.918726,51.167797],[13.91998,51.166912],[13.921898,51.165296],[13.924096,51.163444],[13.924909,51.162805],[13.925808,51.162247],[13.926131,51.162058],[13.926493,51.161867],[13.92675,51.161731],[13.928213,51.161095],[13.929787,51.160589],[13.931442,51.160198],[13.932854,51.159984],[13.9332,51.159946],[13.933547,51.159916],[13.933673,51.159905],[13.934224,51.159858],[13.93498,51.159826],[13.936068,51.159819],[13.940597,51.159943],[13.948387,51.160148],[13.954858,51.160327],[13.957041,51.160381],[13.960675,51.160479],[13.961142,51.160481],[13.962063,51.160484],[13.962712,51.160455],[13.963539,51.160396],[13.964006,51.160352],[13.964555,51.160283],[13.965102,51.160195],[13.965774,51.160069],[13.966437,51.159924],[13.967379,51.159679],[13.968207,51.159448],[13.96844,51.159377],[13.969191,51.15915],[13.970971,51.158639],[13.971425,51.158509],[13.971722,51.158424],[13.974788,51.157544],[13.975038,51.157472],[13.978221,51.156553],[13.978925,51.156352],[13.98078,51.155817],[13.98212,51.15545],[13.984044,51.154994],[13.986237,51.154605],[13.987087,51.154482],[13.987948,51.154381],[13.988031,51.154371],[13.98812,51.154361],[13.989636,51.154212],[13.991724,51.154113],[13.993826,51.154095],[13.995289,51.154157],[13.998336,51.154344],[14.002006,51.154594],[14.00231,51.154615],[14.005722,51.154838],[14.008017,51.154985],[14.009498,51.155095],[14.010145,51.155156],[14.010841,51.155232],[14.011778,51.155354],[14.012791,51.155517],[14.013583,51.155681],[14.014365,51.155857],[14.014869,51.155983],[14.015371,51.156119],[14.015781,51.156241],[14.016427,51.156429],[14.016883,51.156565],[14.022898,51.158362],[14.023189,51.158443],[14.02438,51.158745],[14.025566,51.158975],[14.026934,51.159213],[14.027555,51.159291],[14.02818,51.159357],[14.029646,51.15948],[14.036228,51.159976],[14.036845,51.160043],[14.037304,51.160099],[14.037789,51.160172],[14.037936,51.160194],[14.038709,51.160318],[14.039477,51.160464],[14.040557,51.160705],[14.041627,51.160983],[14.042686,51.161309],[14.043456,51.161577],[14.04366,51.161655],[14.044105,51.161825],[14.04561,51.162408],[14.048426,51.163499],[14.049376,51.163888],[14.051531,51.164723],[14.051904,51.164869],[14.054426,51.165854],[14.054704,51.165961],[14.05505,51.166097],[14.05565,51.166333],[14.05749,51.167054],[14.05956,51.167858],[14.060673,51.168261],[14.061166,51.168426],[14.061855,51.168631],[14.062175,51.168722],[14.062705,51.168861],[14.063409,51.169036],[14.064283,51.169222],[14.064537,51.169274],[14.064993,51.169354],[14.065616,51.169455],[14.066592,51.169593],[14.067651,51.169726],[14.06857,51.169854],[14.071676,51.170257],[14.072624,51.170381],[14.073662,51.170517],[14.075602,51.170772],[14.077578,51.17102],[14.077856,51.171056],[14.080844,51.171454],[14.082373,51.171653],[14.082638,51.17169],[14.083828,51.171859],[14.085005,51.172066],[14.08619,51.172333],[14.087329,51.17266],[14.088403,51.173033],[14.089213,51.173328],[14.090194,51.173686],[14.091869,51.174314],[14.093548,51.174944],[14.093836,51.175052],[14.094227,51.175186],[14.0945,51.175282],[14.095187,51.175473],[14.09542,51.175531],[14.096443,51.175751],[14.097037,51.175842],[14.097364,51.175884],[14.098203,51.175965],[14.099171,51.176013],[14.100138,51.176003],[14.100488,51.175983],[14.100872,51.175961],[14.101187,51.175934],[14.10189,51.175856],[14.102394,51.175781],[14.102726,51.175717],[14.103486,51.175574],[14.106795,51.17481],[14.108659,51.174387],[14.109174,51.174284],[14.110277,51.174089],[14.11185,51.173918],[14.112496,51.173867],[14.113425,51.173802],[14.114142,51.173759],[14.114559,51.173733],[14.11703,51.173569],[14.117448,51.173544],[14.119364,51.173409],[14.121935,51.173242],[14.122804,51.173201],[14.123262,51.173191],[14.124067,51.173198],[14.125008,51.173249],[14.126131,51.173381],[14.126967,51.173514],[14.128908,51.173883],[14.130321,51.174123],[14.131208,51.174232],[14.132033,51.174285],[14.134101,51.174406],[14.134927,51.174451],[14.136293,51.17456],[14.137048,51.174662],[14.13733,51.174711],[14.1379,51.17482],[14.138851,51.175054],[14.13974,51.175328],[14.140085,51.175448],[14.140331,51.175549],[14.141113,51.17587],[14.141643,51.176137],[14.142067,51.176379],[14.142729,51.176799],[14.143053,51.177024],[14.143592,51.177444],[14.144223,51.177928],[14.14483,51.178385],[14.145149,51.178628],[14.145449,51.17885],[14.145668,51.179006],[14.145903,51.179164],[14.146206,51.17935],[14.146515,51.179542],[14.146901,51.179741],[14.147308,51.179934],[14.147689,51.180103],[14.148047,51.18025],[14.148297,51.180345],[14.14866,51.180472],[14.149054,51.180598],[14.149551,51.18073],[14.149936,51.180828],[14.150624,51.181006],[14.151387,51.181142],[14.15442,51.181514],[14.160276,51.182256],[14.161033,51.182348],[14.165364,51.182892],[14.165896,51.18296],[14.166746,51.183079],[14.16732,51.18317],[14.168049,51.183312],[14.168521,51.183412],[14.169222,51.183577],[14.169949,51.183774],[14.17084,51.184053],[14.171711,51.184368],[14.172333,51.184618],[14.172942,51.184886],[14.174048,51.18544],[14.176415,51.186676],[14.177065,51.187018],[14.177725,51.187349],[14.178386,51.187666],[14.179068,51.187968],[14.179957,51.188326],[14.180877,51.188654],[14.181848,51.188955],[14.182798,51.189214],[14.183614,51.189407],[14.184432,51.189578],[14.186141,51.189913],[14.189765,51.190641],[14.190187,51.190749],[14.190958,51.190946],[14.191937,51.191219],[14.192605,51.191439],[14.192934,51.191548],[14.195601,51.192521],[14.198601,51.193611],[14.199344,51.193863],[14.200019,51.194071],[14.201283,51.194435],[14.203912,51.195183],[14.206612,51.195953],[14.207799,51.196281],[14.209547,51.196691],[14.209989,51.19677],[14.21139,51.196977],[14.212791,51.197142],[14.2157,51.197446],[14.219568,51.197856],[14.220109,51.197911],[14.220528,51.197955],[14.222141,51.198134],[14.225217,51.198462],[14.226305,51.19857],[14.227641,51.198714],[14.22794,51.198746],[14.229053,51.198861],[14.232827,51.199258],[14.234199,51.19941],[14.234687,51.199462],[14.235574,51.19957],[14.236564,51.19972],[14.237635,51.199923],[14.238705,51.200169],[14.240939,51.200745],[14.241051,51.200775],[14.241409,51.200872],[14.244087,51.201592],[14.244385,51.201664],[14.247884,51.20261],[14.249595,51.203054],[14.250001,51.203157],[14.251994,51.20354],[14.253245,51.203709],[14.254519,51.20385],[14.255736,51.20392],[14.256955,51.203952],[14.25808,51.203946],[14.259205,51.2039],[14.260379,51.203808],[14.260672,51.203785],[14.261491,51.203711],[14.262118,51.203648],[14.264031,51.203462],[14.269036,51.202974],[14.271753,51.202706],[14.272127,51.202671],[14.276096,51.202283],[14.279495,51.201938],[14.281645,51.201742],[14.283174,51.201609],[14.283708,51.201571],[14.285005,51.201505],[14.285633,51.201496],[14.286337,51.201484],[14.287258,51.201492],[14.288122,51.201512],[14.289007,51.201554],[14.28989,51.201613],[14.290342,51.201656],[14.291613,51.201782],[14.292871,51.201922],[14.295405,51.202215],[14.297422,51.20245],[14.298217,51.202542],[14.298834,51.202614],[14.301431,51.202917],[14.302731,51.203062],[14.304033,51.203194],[14.304451,51.203227],[14.30543,51.20329],[14.306226,51.203327],[14.306986,51.203351],[14.308313,51.203371],[14.308731,51.203354],[14.310391,51.203289],[14.310844,51.203262],[14.311501,51.203209],[14.312241,51.203144],[14.313697,51.202979],[14.314882,51.202803],[14.316022,51.202599],[14.318009,51.202165],[14.319953,51.201642],[14.322109,51.200966],[14.324659,51.200164],[14.32497,51.200075],[14.325069,51.200046],[14.326678,51.199619],[14.328232,51.199278],[14.329448,51.199051],[14.330672,51.198842],[14.331625,51.198682],[14.332965,51.198448],[14.334874,51.198125],[14.335564,51.198008],[14.335932,51.197946],[14.336543,51.197842],[14.337249,51.197725],[14.338518,51.19751],[14.33949,51.197343],[14.343128,51.196734],[14.343585,51.196654],[14.345444,51.196329],[14.345957,51.196236],[14.347241,51.19597],[14.348476,51.195669],[14.350145,51.195195],[14.351812,51.194711],[14.351991,51.194661],[14.352193,51.194601],[14.353794,51.194132],[14.355754,51.193556],[14.356638,51.193297],[14.356918,51.193213],[14.358465,51.192762],[14.359616,51.192427],[14.359913,51.192339],[14.359949,51.192328],[14.361009,51.19201],[14.361236,51.191942],[14.361459,51.191876],[14.362874,51.191465],[14.364994,51.19085],[14.365649,51.19066],[14.365974,51.190563],[14.369486,51.189543],[14.37069,51.189215],[14.371478,51.189031],[14.371919,51.188938],[14.374004,51.188578],[14.375233,51.18844],[14.376471,51.188345],[14.377495,51.188301],[14.37852,51.18828],[14.382596,51.188227],[14.383265,51.188202],[14.383516,51.18819],[14.384382,51.188123],[14.385261,51.18803],[14.385487,51.187998],[14.386126,51.1879],[14.392981,51.186645],[14.393954,51.186464],[14.394605,51.186345],[14.395609,51.186196],[14.396619,51.186087],[14.397641,51.186024],[14.397924,51.186015],[14.398722,51.186011],[14.399844,51.186057],[14.400217,51.186092],[14.400979,51.186161],[14.40204,51.186315],[14.402215,51.186341],[14.402827,51.186455],[14.403437,51.186592],[14.403812,51.186675],[14.404681,51.186891],[14.405453,51.187085],[14.40715,51.18751],[14.408435,51.187833],[14.409245,51.188023],[14.4098,51.188172],[14.410143,51.188277],[14.410739,51.188464],[14.411308,51.188667],[14.411885,51.18889],[14.412605,51.18921],[14.412804,51.189302],[14.413245,51.189531],[14.413503,51.189676],[14.413636,51.189751],[14.414182,51.190073],[14.414407,51.19022],[14.414789,51.190471],[14.415321,51.190817],[14.415529,51.190975],[14.415803,51.191161],[14.416527,51.191646],[14.417758,51.192457],[14.418448,51.19293],[14.419428,51.193582],[14.420106,51.194037],[14.421379,51.194888],[14.421899,51.195238],[14.422413,51.195574],[14.422753,51.195788],[14.423149,51.196018],[14.423802,51.196356],[14.424563,51.196712],[14.425037,51.196911],[14.425512,51.197088],[14.42615,51.197307],[14.42682,51.197505],[14.427433,51.197666],[14.427926,51.197782],[14.428459,51.197893],[14.428973,51.197982],[14.429487,51.19806],[14.430184,51.198147],[14.430892,51.198212],[14.431658,51.198257],[14.43243,51.198276],[14.433194,51.198267],[14.43393,51.198232],[14.434335,51.198207],[14.435452,51.198126],[14.437123,51.198001],[14.438969,51.197864],[14.439352,51.197833],[14.441165,51.197698],[14.441847,51.197646],[14.44279,51.197562],[14.443729,51.197456],[14.444233,51.197398],[14.444874,51.197322],[14.44734,51.197028],[14.447903,51.196961],[14.448436,51.196901],[14.448956,51.196835],[14.449968,51.196694],[14.450942,51.19654],[14.451959,51.19638],[14.452767,51.196249],[14.454899,51.195903],[14.456441,51.195664],[14.457219,51.195557],[14.457613,51.195513],[14.457885,51.195486],[14.458005,51.195475],[14.458865,51.1954],[14.459891,51.19534],[14.460399,51.195326],[14.460899,51.195322],[14.461474,51.195322],[14.462084,51.195333],[14.462689,51.195361],[14.463125,51.195386],[14.463693,51.195429],[14.464634,51.195521],[14.464894,51.195551],[14.46527,51.195593],[14.466127,51.195718],[14.466719,51.195833],[14.467704,51.196032],[14.468721,51.196275],[14.469194,51.19641],[14.469965,51.196634],[14.470296,51.196742],[14.47138,51.197124],[14.471689,51.19724],[14.471957,51.197351],[14.472117,51.197417],[14.473038,51.19782],[14.47459,51.198583],[14.477367,51.20006],[14.477843,51.20032],[14.479763,51.201348],[14.482807,51.202979],[14.484106,51.203668],[14.485431,51.204339],[14.486124,51.20467],[14.486833,51.20499],[14.487547,51.205292],[14.488279,51.205579],[14.488539,51.205672],[14.488945,51.205818],[14.489692,51.20607],[14.490419,51.206296],[14.491161,51.20651],[14.491809,51.20668],[14.492504,51.206849],[14.493917,51.207149],[14.495229,51.207375],[14.496589,51.207558],[14.497513,51.20766],[14.498461,51.20774],[14.499849,51.207812],[14.500429,51.20783],[14.501409,51.207836],[14.502299,51.207822],[14.503343,51.207783],[14.503865,51.207756],[14.504383,51.207722],[14.50634,51.207575],[14.508293,51.207396],[14.509382,51.2073],[14.512205,51.207049],[14.513284,51.206957],[14.513839,51.20691],[14.514554,51.206836],[14.516168,51.206681],[14.516408,51.206661],[14.517017,51.206609],[14.518851,51.206448],[14.519771,51.206377],[14.520694,51.206319],[14.521221,51.206293],[14.522347,51.206254],[14.523308,51.206242],[14.523536,51.206246],[14.524371,51.206264],[14.525436,51.206312],[14.526397,51.206376],[14.527227,51.20646],[14.527356,51.206473],[14.528217,51.206582],[14.529079,51.206702],[14.529942,51.206841],[14.530806,51.206993],[14.532583,51.207324],[14.533237,51.207452],[14.537452,51.208286],[14.54403,51.209572],[14.54475,51.209708],[14.54596,51.209925],[14.546311,51.209982],[14.548308,51.210286],[14.549886,51.210431],[14.551259,51.210542],[14.552276,51.210614],[14.553149,51.210674],[14.555294,51.210809],[14.557758,51.210981],[14.558535,51.211034],[14.55894,51.211058],[14.56018,51.21114],[14.561891,51.211251],[14.564351,51.211407],[14.566085,51.211479],[14.56774,51.211489],[14.568334,51.211476],[14.56942,51.211422],[14.570712,51.211298],[14.571376,51.211229],[14.571668,51.211193],[14.572297,51.211104],[14.572758,51.211036],[14.573908,51.210838],[14.574538,51.21072],[14.57619,51.210398],[14.576626,51.210314],[14.579393,51.209783],[14.580687,51.209553],[14.58109,51.209485],[14.581689,51.209393],[14.583683,51.209079],[14.584441,51.208986],[14.58571,51.208817],[14.586274,51.208751],[14.587636,51.208612],[14.588875,51.208502],[14.589905,51.208422],[14.590311,51.208397],[14.590997,51.208357],[14.592152,51.208296],[14.593312,51.208256],[14.594999,51.208219],[14.596774,51.20822],[14.597816,51.208236],[14.599298,51.208284],[14.600417,51.208331],[14.601695,51.208407],[14.603126,51.208518],[14.604403,51.208634],[14.605804,51.208773],[14.606284,51.208825],[14.60712,51.208929],[14.608464,51.209097],[14.610238,51.209336],[14.611931,51.209566],[14.612212,51.209606],[14.613603,51.209796],[14.619919,51.21066],[14.620738,51.210761],[14.621823,51.210874],[14.622662,51.210945],[14.623156,51.210976],[14.623627,51.210998],[14.624184,51.211015],[14.624701,51.211015],[14.625146,51.211012],[14.625805,51.210998],[14.626565,51.21096],[14.627466,51.210876],[14.627804,51.210843],[14.628565,51.210754],[14.629563,51.210611],[14.630273,51.210492],[14.630909,51.21038],[14.631497,51.21027],[14.631995,51.210174],[14.632999,51.20996],[14.634679,51.209581],[14.635393,51.20942],[14.639685,51.20844],[14.641799,51.20795],[14.644548,51.207323],[14.645091,51.207212],[14.645635,51.207114],[14.646273,51.207004],[14.646784,51.206934],[14.647687,51.206838],[14.648372,51.206784],[14.648824,51.206755],[14.649353,51.206725],[14.652978,51.206588],[14.65369,51.206564],[14.655961,51.206465],[14.656701,51.206433],[14.657826,51.206395],[14.660621,51.206279],[14.661822,51.206237],[14.662818,51.206201],[14.663302,51.206182],[14.663583,51.206172],[14.664541,51.206134],[14.666407,51.206056],[14.668248,51.205982],[14.670511,51.205898],[14.671961,51.205844],[14.672434,51.205827],[14.673416,51.205803],[14.674879,51.205808],[14.675414,51.205821],[14.676193,51.205856],[14.67697,51.205906],[14.677692,51.205965],[14.678231,51.206018],[14.67868,51.206066],[14.679496,51.206174],[14.68073,51.206359],[14.681554,51.206515],[14.684581,51.207153],[14.686821,51.207647],[14.687807,51.207865],[14.689232,51.208179],[14.69015,51.208384],[14.69031,51.208419],[14.691404,51.208663],[14.69536,51.209532],[14.698165,51.210156],[14.699998,51.210564],[14.701174,51.210822],[14.704883,51.211642],[14.705047,51.211679],[14.705195,51.211711],[14.70773,51.212267],[14.709345,51.212594],[14.710897,51.21288],[14.712153,51.213083],[14.713408,51.213244],[14.714345,51.213343],[14.715118,51.213402],[14.715884,51.213442],[14.716904,51.213467],[14.717688,51.21346],[14.718206,51.21344],[14.718397,51.213432],[14.718753,51.21341],[14.719297,51.213372],[14.720237,51.213279],[14.720815,51.213207],[14.721573,51.213084],[14.722556,51.212898],[14.723263,51.212734],[14.723971,51.212549],[14.724845,51.212287],[14.725434,51.212089],[14.725809,51.211955],[14.726315,51.211762],[14.726816,51.21156],[14.728097,51.211021],[14.729427,51.210436],[14.731351,51.209618],[14.73258,51.20912],[14.73372,51.208682],[14.734832,51.208277],[14.735964,51.207888],[14.737256,51.207457],[14.738629,51.207025],[14.740735,51.206413],[14.742371,51.205979],[14.744132,51.205546],[14.744623,51.205433],[14.746461,51.205033],[14.749403,51.20447],[14.750368,51.204301],[14.751335,51.204146],[14.752149,51.20403],[14.754474,51.203715],[14.756399,51.203506],[14.75778,51.203377],[14.758363,51.203335],[14.758959,51.203291],[14.759473,51.20326],[14.759981,51.203231],[14.761494,51.203182],[14.763281,51.203151],[14.763973,51.203144],[14.764646,51.203144],[14.765285,51.203162],[14.766149,51.203186],[14.766853,51.203212],[14.767555,51.203246],[14.768722,51.203315],[14.769886,51.203401],[14.771009,51.203504],[14.771629,51.203565],[14.772274,51.203636],[14.773004,51.203726],[14.77379,51.203828],[14.774537,51.203935],[14.776716,51.20427],[14.779251,51.204796],[14.78049,51.205079],[14.781824,51.205407],[14.783124,51.205759],[14.784334,51.206115],[14.785535,51.206493],[14.786723,51.206893],[14.787673,51.207235],[14.78861,51.207591],[14.790072,51.208172],[14.791884,51.208967],[14.794101,51.209973],[14.794412,51.210114],[14.795414,51.210568],[14.795615,51.21066],[14.797088,51.211308],[14.797804,51.211611],[14.798222,51.21178],[14.799159,51.212152],[14.800066,51.212486],[14.800951,51.212789],[14.802183,51.213176],[14.803268,51.213471],[14.804061,51.213671],[14.804867,51.213855],[14.805511,51.21399],[14.806162,51.214114],[14.806975,51.214258],[14.807794,51.214384],[14.808311,51.214454],[14.809122,51.214549],[14.809936,51.214628],[14.810941,51.214706],[14.810961,51.214707],[14.811776,51.214743],[14.812986,51.214768],[14.818047,51.21483],[14.825147,51.214806],[14.826559,51.214846],[14.827964,51.214904],[14.829368,51.214981],[14.830768,51.215076],[14.832165,51.215191],[14.833919,51.215361],[14.835666,51.215561],[14.837403,51.215789],[14.839135,51.216048],[14.845417,51.217213],[14.845947,51.217308],[14.85279,51.218538],[14.853438,51.218633],[14.854094,51.21872],[14.854752,51.218798],[14.85541,51.218867],[14.858264,51.219092],[14.859139,51.21916],[14.860406,51.219253],[14.862214,51.219351],[14.863648,51.219404],[14.865551,51.219445],[14.866079,51.219445],[14.867039,51.219452],[14.868557,51.219449],[14.871562,51.219429],[14.8741,51.219435],[14.874281,51.219435],[14.875366,51.219455],[14.876934,51.219504],[14.877247,51.219515],[14.878449,51.21958],[14.878912,51.219611],[14.879821,51.219689],[14.880697,51.219784],[14.881236,51.219847],[14.881648,51.219901],[14.882335,51.219998],[14.883093,51.220118],[14.883858,51.220245],[14.884651,51.220403],[14.885388,51.220561],[14.886217,51.22075],[14.888864,51.221385],[14.890189,51.221697],[14.891531,51.221994],[14.892675,51.222227],[14.893465,51.222376],[14.894147,51.222492],[14.894758,51.222585],[14.895518,51.222694],[14.896085,51.222768],[14.896851,51.222855],[14.897619,51.22293],[14.898367,51.223002],[14.899115,51.223062],[14.900098,51.223127],[14.901505,51.223192],[14.902686,51.223222],[14.90361,51.22323],[14.904118,51.223232],[14.905603,51.223206],[14.906374,51.223176],[14.906656,51.223163],[14.907396,51.223121],[14.907987,51.223078],[14.908606,51.223034],[14.908864,51.223013],[14.909666,51.222938],[14.91016,51.22289],[14.911254,51.22276],[14.911786,51.222694],[14.912902,51.222529],[14.913333,51.22246],[14.914135,51.222323],[14.915326,51.2221],[14.915737,51.222016],[14.916032,51.221953],[14.916693,51.22181],[14.91735,51.221657],[14.918013,51.221494],[14.918673,51.221324],[14.91925,51.22117],[14.919822,51.221005],[14.920905,51.220679],[14.921697,51.220424],[14.92229,51.220224],[14.92247,51.22016],[14.923154,51.219915],[14.923833,51.21966],[14.925262,51.219084],[14.926346,51.218605],[14.927428,51.21812],[14.928258,51.217718],[14.928585,51.217556],[14.929591,51.21704],[14.931284,51.216125],[14.932255,51.215581],[14.933252,51.215001],[14.93344,51.214889],[14.933569,51.214811],[14.935272,51.213779],[14.937089,51.212637],[14.938646,51.211644],[14.939787,51.210916],[14.942551,51.209147],[14.942564,51.209139],[14.943624,51.20846],[14.943831,51.208325],[14.945163,51.207464],[14.946372,51.206699],[14.94867,51.205259],[14.950091,51.204383],[14.95155,51.203517],[14.952879,51.202756],[14.954229,51.202004],[14.955463,51.201356],[14.956472,51.200834],[14.957615,51.200261],[14.95829,51.199944],[14.958862,51.19967],[14.959669,51.199287],[14.960901,51.198722],[14.962367,51.198057],[14.963569,51.197524],[14.963908,51.197377],[14.965117,51.196849],[14.965671,51.196603],[14.967658,51.19574],[14.969454,51.194966],[14.970839,51.194375],[14.972743,51.193547],[14.976577,51.191895],[14.976944,51.191735],[14.978481,51.19107],[14.981183,51.189908],[14.981878,51.189609],[14.982832,51.189205],[14.983304,51.188987],[14.985134,51.18821],[14.986188,51.187773],[14.987264,51.187356],[14.988031,51.187074],[14.988828,51.186806],[14.989566,51.18656],[14.990441,51.186295],[14.992301,51.185785],[14.993527,51.185467],[14.995063,51.185069],[14.99545,51.184966],[14.997814,51.184336],[14.99901,51.184008],[15.001188,51.183372],[15.001452,51.183291],[15.001741,51.183199],[15.003137,51.182741],[15.004118,51.182412],[15.005168,51.182051],[15.005772,51.181833],[15.006385,51.181606],[15.007391,51.181225],[15.007933,51.181019],[15.008663,51.180726],[15.00934,51.180432],[15.010105,51.180108],[15.017612,51.176973],[15.019358,51.176243],[15.023405,51.174559],[15.024881,51.173989],[15.025974,51.17362],[15.027108,51.173272],[15.028269,51.172955],[15.029556,51.172653],[15.030515,51.17246],[15.031534,51.172279],[15.032795,51.17209],[15.032882,51.172076],[15.033374,51.172018],[15.033664,51.171983],[15.034542,51.171888],[15.036015,51.171766],[15.03664,51.171714],[15.036659,51.171712],[15.0383,51.17158],[15.039663,51.17147],[15.040519,51.171407],[15.058798,51.169947],[15.059208,51.169917],[15.059409,51.169901],[15.059473,51.169896],[15.061028,51.169804],[15.062595,51.169774],[15.063875,51.1698],[15.065159,51.169877],[15.06704,51.170073],[15.068927,51.170382],[15.070167,51.170653],[15.071411,51.170962],[15.072597,51.171342],[15.073766,51.171757],[15.075028,51.172286],[15.076237,51.172848],[15.078633,51.174024],[15.084895,51.177085],[15.088669,51.178941],[15.08873,51.178971],[15.094794,51.181943],[15.105368,51.187124],[15.107721,51.188271],[15.107862,51.18834],[15.108471,51.188637],[15.109733,51.189262],[15.112034,51.190389],[15.114349,51.191521],[15.115517,51.192095],[15.115815,51.192242],[15.118174,51.193385],[15.119491,51.194036],[15.12086,51.194712],[15.121674,51.1951],[15.122987,51.195723],[15.123679,51.196038],[15.124335,51.196327],[15.125082,51.196643],[15.125783,51.196936],[15.126742,51.19731],[15.127694,51.197667],[15.128812,51.198067],[15.129922,51.198432],[15.130451,51.198588],[15.13168,51.198976],[15.132934,51.19933],[15.134099,51.199632],[15.135275,51.199919],[15.13655,51.200213],[15.137863,51.200498],[15.140466,51.201037],[15.148048,51.202599],[15.15183,51.20338],[15.153745,51.203776],[15.155606,51.204158],[15.1745,51.208051],[15.178559,51.208887],[15.181926,51.209577],[15.186647,51.210552],[15.187204,51.210667],[15.189248,51.211088],[15.189929,51.211229],[15.192493,51.211754],[15.196489,51.212581],[15.204792,51.214294],[15.207779,51.2149],[15.209212,51.215189],[15.210781,51.21549],[15.212606,51.215798],[15.214354,51.216039],[15.216049,51.216237],[15.216949,51.216317],[15.217526,51.216363],[15.218034,51.216401],[15.218558,51.216432],[15.219053,51.216461],[15.22007,51.216511],[15.221064,51.216544],[15.221936,51.216564],[15.222864,51.216578],[15.224625,51.216593],[15.227125,51.216611],[15.230594,51.216638],[15.235167,51.216663],[15.235607,51.216668],[15.235788,51.216669],[15.239004,51.216688],[15.241576,51.216704],[15.242469,51.216713],[15.245343,51.216732],[15.249702,51.216761],[15.251906,51.216783],[15.253043,51.216803],[15.254114,51.216829],[15.255404,51.216868],[15.256676,51.216921],[15.258009,51.216991],[15.25924,51.217071],[15.260181,51.217142],[15.261054,51.217212],[15.262088,51.217306],[15.262896,51.217385],[15.263689,51.21747],[15.264445,51.217555],[15.265212,51.217648],[15.265966,51.217745],[15.266799,51.217858],[15.267622,51.217976],[15.268362,51.218085],[15.269106,51.218201],[15.270257,51.218392],[15.271443,51.218604],[15.2726,51.218824],[15.27378,51.219059],[15.274552,51.219224],[15.275259,51.219378],[15.27682,51.219737],[15.27825,51.22009],[15.28023,51.220612],[15.281273,51.220901],[15.284824,51.221946],[15.285326,51.222099],[15.28892,51.223181],[15.29073,51.223727],[15.291887,51.224075],[15.29252,51.224265],[15.295048,51.225028],[15.297133,51.225656],[15.306897,51.228598],[15.310782,51.229767],[15.315398,51.231155],[15.317512,51.231805],[15.317923,51.231933],[15.319988,51.232618],[15.321016,51.232984],[15.322008,51.23335],[15.323001,51.23374],[15.32401,51.234147],[15.325009,51.23457],[15.325989,51.235005],[15.326895,51.235425],[15.327799,51.235861],[15.328721,51.236329],[15.329613,51.236796],[15.330408,51.237231],[15.331294,51.237734],[15.333156,51.238863],[15.333878,51.23933],[15.334984,51.240077],[15.336055,51.240836],[15.338144,51.24236],[15.340445,51.244058],[15.341425,51.244783],[15.343734,51.246484],[15.344276,51.246885],[15.347594,51.249332],[15.350301,51.251329],[15.350432,51.251421],[15.350778,51.25168],[15.352939,51.253275],[15.3538,51.253909],[15.354566,51.254472],[15.354749,51.254607],[15.355076,51.254849],[15.356219,51.255693],[15.357127,51.256362],[15.358132,51.257103],[15.361067,51.259263],[15.362484,51.260312],[15.363222,51.260852],[15.363966,51.261386],[15.364723,51.261916],[15.36515,51.262203],[15.365558,51.262468],[15.365974,51.262737],[15.366409,51.26301],[15.367282,51.263531],[15.368083,51.263986],[15.368498,51.264211],[15.3689,51.264421],[15.369348,51.264655],[15.369671,51.264816],[15.370588,51.265265],[15.371359,51.265619],[15.37224,51.266005],[15.373128,51.266376],[15.374008,51.266721],[15.374689,51.266979],[15.375389,51.267231],[15.376121,51.267485],[15.376836,51.26772],[15.377701,51.267989],[15.378799,51.268313],[15.379445,51.268489],[15.38005,51.268648],[15.380721,51.268819],[15.381458,51.268996],[15.382305,51.26919],[15.383473,51.269432],[15.384049,51.269544],[15.384651,51.269653],[15.385322,51.269769],[15.386615,51.269974],[15.38776,51.270132],[15.388571,51.270232],[15.389052,51.270283],[15.389809,51.270361],[15.390371,51.270416],[15.390931,51.270465],[15.391521,51.270508],[15.392179,51.270551],[15.392741,51.270584],[15.39331,51.270611],[15.394154,51.270646],[15.394968,51.270666],[15.395264,51.270673],[15.395778,51.27068],[15.396914,51.27068],[15.397894,51.270667],[15.398588,51.270648],[15.399108,51.27063],[15.399688,51.270603],[15.40068,51.270546],[15.401346,51.270503],[15.401807,51.270468],[15.402346,51.270424],[15.402956,51.270367],[15.403522,51.27031],[15.404131,51.270243],[15.404967,51.270147],[15.405813,51.270044],[15.407502,51.269828],[15.41095,51.269384],[15.411636,51.269296],[15.412331,51.269207],[15.415007,51.268862],[15.416727,51.268638],[15.418498,51.268409],[15.419138,51.268339],[15.420014,51.268244],[15.420662,51.268185],[15.421289,51.268141],[15.421913,51.268107],[15.422524,51.268082],[15.423239,51.268068],[15.424004,51.268069],[15.424492,51.268079],[15.424969,51.268094],[15.425504,51.268117],[15.426082,51.268152],[15.426439,51.268178],[15.426777,51.268207],[15.427155,51.26824],[15.427661,51.268295],[15.428337,51.268375],[15.429183,51.268499],[15.429984,51.268635],[15.430807,51.268792],[15.431621,51.268974],[15.432417,51.269167],[15.43305,51.269341],[15.433652,51.269517],[15.434632,51.269829],[15.435364,51.270081],[15.436918,51.27064],[15.438323,51.271147],[15.441216,51.272187],[15.441961,51.272454],[15.464301,51.280508],[15.464865,51.280711],[15.471639,51.28315],[15.477252,51.285176],[15.478312,51.285562],[15.479878,51.286156],[15.481416,51.286763],[15.482031,51.287024],[15.482772,51.287349],[15.483451,51.287653],[15.484136,51.287975],[15.486245,51.289006],[15.488044,51.28997],[15.492877,51.292554],[15.49418,51.293245],[15.494833,51.293597],[15.495631,51.294032],[15.49973,51.29621],[15.503631,51.298292],[15.507566,51.300373],[15.507666,51.300423],[15.50829,51.300739],[15.509583,51.301368],[15.510295,51.301698],[15.510841,51.301944],[15.511829,51.302376],[15.512728,51.302751],[15.513681,51.303132],[15.514483,51.303441],[15.514919,51.303602],[15.516133,51.30404],[15.51722,51.304411],[15.518326,51.304769],[15.519259,51.305059],[15.520202,51.305347],[15.522263,51.305954],[15.527672,51.307528],[15.531,51.308496],[15.531476,51.308634],[15.534119,51.309404],[15.536614,51.310118],[15.537082,51.310243],[15.537479,51.310347],[15.537892,51.310447],[15.538636,51.310618],[15.539352,51.310763],[15.540006,51.310889],[15.540426,51.310961],[15.540841,51.311027],[15.541528,51.311129],[15.541957,51.311186],[15.542351,51.311234],[15.542931,51.311297],[15.543708,51.311369],[15.544246,51.31141],[15.544856,51.311448],[15.54538,51.311472],[15.545916,51.311491],[15.546632,51.311505],[15.547326,51.311506],[15.547748,51.3115],[15.548149,51.311492],[15.548506,51.311482],[15.548856,51.311468],[15.549532,51.311437],[15.550129,51.311406],[15.553654,51.311204],[15.555653,51.31109],[15.556524,51.311039],[15.557024,51.311011],[15.557647,51.310975],[15.559039,51.310906],[15.560005,51.310872],[15.560961,51.310863],[15.56213,51.310878],[15.563261,51.310925],[15.564453,51.311009],[15.565466,51.31111],[15.566945,51.311277],[15.569342,51.311564],[15.569699,51.311606],[15.57173,51.311852],[15.572933,51.311999],[15.573013,51.312007],[15.57375,51.312099],[15.574681,51.312211],[15.578782,51.312709],[15.579599,51.312818],[15.57976,51.31284],[15.580374,51.312932],[15.580973,51.313031],[15.581548,51.313132],[15.582159,51.31325],[15.582772,51.313378],[15.583623,51.313571],[15.584356,51.313754],[15.584996,51.313926],[15.585663,51.314116],[15.586296,51.314308],[15.587574,51.314728],[15.588839,51.315165],[15.590042,51.315585],[15.592171,51.316325],[15.593358,51.316739],[15.593629,51.31683],[15.59502,51.317318],[15.596406,51.317801],[15.598008,51.318362],[15.599956,51.319035],[15.603103,51.320099],[15.60368,51.320293],[15.604773,51.32065],[15.606522,51.321199],[15.608125,51.321676],[15.608691,51.32184],[15.610034,51.322209],[15.610572,51.322353],[15.611236,51.322529],[15.611948,51.322712],[15.613024,51.322978],[15.614168,51.32325],[15.614987,51.323438],[15.615791,51.323617],[15.617049,51.32389],[15.618805,51.324257],[15.620827,51.324661],[15.62502,51.325494],[15.629886,51.326456],[15.634776,51.327424],[15.637736,51.327994],[15.63891,51.32821],[15.639269,51.328269],[15.639605,51.328319],[15.639891,51.328358],[15.640118,51.328386],[15.64056,51.328438],[15.640957,51.328473],[15.641346,51.328502],[15.6418,51.328524],[15.642342,51.328541],[15.642919,51.328539],[15.643534,51.328522],[15.644172,51.328488],[15.644783,51.328436],[15.644785,51.328436],[15.645481,51.328347],[15.646132,51.328242],[15.646573,51.328153],[15.647027,51.328052],[15.647356,51.327972],[15.647529,51.327928],[15.647981,51.327807],[15.648177,51.327748],[15.64841,51.327676],[15.648799,51.327548],[15.649172,51.327413],[15.649479,51.327296],[15.649945,51.327104],[15.650216,51.326981],[15.650476,51.326856],[15.650634,51.326778],[15.650807,51.32669],[15.65111,51.326527],[15.651397,51.326365],[15.651692,51.326187],[15.652164,51.325883],[15.652713,51.325505],[15.653523,51.3249],[15.654254,51.324344],[15.65476,51.323958],[15.655233,51.323593],[15.655769,51.323195],[15.656087,51.322965],[15.656404,51.322739],[15.656903,51.322395],[15.657502,51.32201],[15.657873,51.321788],[15.658232,51.321581],[15.658502,51.321433],[15.659162,51.321081],[15.659659,51.320832],[15.659817,51.320753],[15.66012,51.320601],[15.660945,51.320203],[15.661663,51.319855],[15.66315,51.319131],[15.664627,51.318412],[15.666084,51.317703],[15.66755,51.316991],[15.668972,51.316296],[15.670407,51.315609],[15.673391,51.31415],[15.676369,51.312701],[15.678001,51.311904],[15.679126,51.311356],[15.680219,51.310859],[15.680811,51.310608],[15.681414,51.310357],[15.682267,51.310038],[15.683389,51.309652],[15.68429,51.309367],[15.684934,51.309182],[15.685578,51.309004],[15.686232,51.308837],[15.687042,51.308649],[15.687691,51.308511],[15.689014,51.308254],[15.690996,51.307881],[15.695979,51.306949],[15.699447,51.306294],[15.703432,51.305547],[15.704765,51.305294],[15.71184,51.303964],[15.717977,51.302809],[15.721967,51.302062],[15.722318,51.301988],[15.723051,51.301854],[15.723499,51.30177],[15.72427,51.301626],[15.724734,51.301539],[15.724746,51.301537],[15.727061,51.3011],[15.728747,51.300783],[15.730409,51.300471],[15.733743,51.299845],[15.740485,51.298573],[15.743454,51.29801],[15.74423,51.297852],[15.744989,51.297695],[15.746392,51.297388],[15.747416,51.29715],[15.748428,51.296901],[15.750396,51.296385],[15.75279,51.295699],[15.753027,51.295625],[15.755156,51.294964],[15.757199,51.294271],[15.759192,51.293533],[15.76124,51.292717],[15.763226,51.291853],[15.764883,51.291111],[15.766457,51.290347],[15.767899,51.289603],[15.769107,51.288951],[15.769139,51.288934],[15.769312,51.28884],[15.770055,51.288423],[15.770834,51.287973],[15.771564,51.287538],[15.772346,51.287059],[15.774006,51.286039],[15.776217,51.28468],[15.781344,51.281534],[15.781603,51.281373],[15.784677,51.279487],[15.78551,51.278978],[15.786556,51.278337],[15.788472,51.277163],[15.789499,51.276554],[15.791794,51.275261],[15.792858,51.274709],[15.793386,51.274434],[15.793414,51.27442],[15.793606,51.274324],[15.793931,51.274165],[15.795447,51.27343],[15.795928,51.273206],[15.796431,51.272978],[15.79693,51.272752],[15.797304,51.272589],[15.7977,51.272417],[15.79809,51.27225],[15.798592,51.272036],[15.799419,51.271696],[15.801754,51.270746],[15.802751,51.27034],[15.806342,51.268877],[15.811234,51.266883],[15.816081,51.264908],[15.816097,51.264901],[15.821589,51.262663],[15.823092,51.26205],[15.827093,51.260418],[15.83067,51.25896],[15.831222,51.258735],[15.833219,51.257921],[15.834212,51.257516],[15.834462,51.257415],[15.83471,51.257315],[15.834963,51.257215],[15.835222,51.257113],[15.835445,51.257027],[15.835676,51.256938],[15.835905,51.256853],[15.836138,51.256767],[15.836397,51.256673],[15.836571,51.256611],[15.836782,51.256537],[15.836878,51.256504],[15.837004,51.256463],[15.837155,51.256413],[15.837311,51.256362],[15.837469,51.256312],[15.837617,51.256265],[15.837906,51.256177],[15.838172,51.256098],[15.838354,51.256045],[15.838529,51.255994],[15.83871,51.255942],[15.838946,51.255876],[15.839381,51.255757],[15.839828,51.255638],[15.840649,51.255423],[15.841605,51.255174],[15.844575,51.254401],[15.846079,51.25401],[15.849159,51.253208],[15.849234,51.253189],[15.849669,51.253077],[15.850119,51.25296],[15.850457,51.25287],[15.850761,51.252794],[15.856466,51.251309],[15.866139,51.24879],[15.871206,51.247471],[15.872494,51.247135],[15.873012,51.246998],[15.873509,51.246864],[15.874117,51.246697],[15.874412,51.246614],[15.874703,51.246533],[15.875126,51.246411],[15.875544,51.246289],[15.876008,51.246151],[15.876464,51.246014],[15.876915,51.245875],[15.877359,51.245737],[15.877751,51.245612],[15.878137,51.245488],[15.878525,51.245361],[15.878906,51.245234],[15.879655,51.244982],[15.885743,51.242928],[15.887771,51.242246],[15.889788,51.241565],[15.892882,51.240521],[15.893239,51.240399],[15.893606,51.240276],[15.893981,51.240151],[15.894768,51.239885],[15.895697,51.239571],[15.899856,51.238166],[15.903811,51.236831],[15.90778,51.235489],[15.910993,51.234405],[15.91422,51.233317],[15.918443,51.231898],[15.919165,51.23167],[15.920155,51.231385],[15.921272,51.231088],[15.922436,51.230824],[15.923735,51.230563],[15.925064,51.230343],[15.925973,51.230214],[15.926763,51.230118],[15.927852,51.229983],[15.930072,51.229707],[15.930564,51.229655],[15.930995,51.229604],[15.93139,51.229556],[15.931876,51.229497],[15.933171,51.229341],[15.933226,51.229334],[15.933746,51.229275],[15.934008,51.229245],[15.934427,51.229192],[15.934861,51.229139],[15.934912,51.229133],[15.938696,51.228673],[15.941625,51.228324],[15.947809,51.227577],[15.953883,51.22684],[15.958451,51.226291],[15.959583,51.226155],[15.960417,51.226042],[15.960717,51.226002],[15.961835,51.225832],[15.962937,51.225635],[15.964029,51.225407],[15.965099,51.225147],[15.966291,51.224828],[15.967439,51.224469],[15.968599,51.224074],[15.969175,51.223857],[15.969653,51.223667],[15.970133,51.223471],[15.971132,51.223042],[15.973806,51.221845],[15.974176,51.221687],[15.974188,51.221682],[15.974523,51.22154],[15.975524,51.22109],[15.975947,51.220903],[15.975959,51.220897],[15.976604,51.22061],[15.977146,51.220371],[15.979717,51.219229],[15.98,51.219099],[15.981009,51.218634],[15.982284,51.217991],[15.983505,51.217299],[15.983869,51.217072],[15.984374,51.21675],[15.984709,51.216523],[15.985053,51.216283],[15.985724,51.215795],[15.986663,51.215039],[15.987775,51.21402],[15.987892,51.213903],[15.988994,51.212807],[15.991412,51.210381],[15.991641,51.210153],[15.993501,51.208294],[15.993993,51.207802],[15.994837,51.206985],[15.995244,51.206608],[15.995678,51.206223],[15.996166,51.205828],[15.997708,51.2047],[15.998903,51.203942],[16.000322,51.20315],[16.001171,51.202724],[16.00206,51.202316],[16.004246,51.201434],[16.007457,51.200257],[16.008607,51.199837],[16.010485,51.199156],[16.013519,51.198051],[16.013531,51.198046],[16.014121,51.197823],[16.014529,51.197668],[16.014898,51.197517],[16.015117,51.197427],[16.016225,51.196947],[16.01669,51.196724],[16.017261,51.196451],[16.017572,51.196285],[16.018362,51.195858],[16.022843,51.193213],[16.027297,51.190562],[16.03616,51.185298],[16.039267,51.18345],[16.040945,51.182452],[16.04331,51.181046],[16.044178,51.180532],[16.045654,51.179659],[16.045662,51.179655],[16.047357,51.178726],[16.04859,51.178131],[16.049801,51.177611],[16.05035,51.177387],[16.051344,51.177003],[16.052296,51.176698],[16.053254,51.176408],[16.053269,51.176404],[16.053646,51.176291],[16.054059,51.176177],[16.054476,51.17607],[16.055015,51.175933],[16.05519,51.175892],[16.055623,51.175789],[16.055639,51.175786],[16.056942,51.175515],[16.058158,51.175282],[16.062516,51.174482],[16.065523,51.173926],[16.072199,51.1727],[16.083256,51.170661],[16.087259,51.169922],[16.088705,51.169656],[16.090891,51.169252],[16.091469,51.169145],[16.093855,51.168704],[16.095319,51.168435],[16.09778,51.167981],[16.098196,51.167904],[16.098318,51.167882],[16.101628,51.167269],[16.102939,51.167027],[16.104211,51.166792],[16.10774,51.16614],[16.116254,51.164569],[16.120208,51.163839],[16.122175,51.163476],[16.125138,51.162929],[16.12662,51.162657],[16.128111,51.162401],[16.129439,51.16221],[16.130097,51.162132],[16.130759,51.162065],[16.132177,51.161957],[16.133613,51.161891],[16.150262,51.161395],[16.150777,51.161379],[16.156222,51.161214],[16.162709,51.161027],[16.164972,51.160954],[16.168418,51.160846],[16.168468,51.160845],[16.168937,51.16083],[16.170931,51.160769],[16.171329,51.16075],[16.17135,51.160748],[16.17506,51.160645],[16.175751,51.160625],[16.179291,51.160516],[16.181693,51.160444],[16.183107,51.1604],[16.184123,51.160369],[16.185804,51.160314],[16.187048,51.160246],[16.188291,51.160137],[16.19016,51.159909],[16.191948,51.159627],[16.194551,51.159192],[16.197139,51.158759],[16.201729,51.157992],[16.215982,51.155611],[16.216605,51.155507],[16.220313,51.154887],[16.222493,51.154522],[16.22549,51.154016],[16.229105,51.153413],[16.232013,51.152925],[16.235709,51.152309],[16.237299,51.152041],[16.240482,51.151502],[16.241103,51.1514],[16.242168,51.151218],[16.24276,51.151118],[16.242783,51.151114],[16.246295,51.150532],[16.250434,51.149842],[16.250731,51.149792],[16.252821,51.149438],[16.254831,51.149102],[16.25604,51.148901],[16.258549,51.148482],[16.259797,51.148264],[16.26103,51.148024],[16.261133,51.148001],[16.262199,51.147757],[16.263355,51.147454],[16.264594,51.147082],[16.265788,51.146679],[16.266868,51.146281],[16.267931,51.145863],[16.26979,51.145121],[16.272554,51.144023],[16.273728,51.143565],[16.27555,51.142832],[16.276594,51.142422],[16.278442,51.141685],[16.278485,51.141667],[16.27883,51.141531],[16.279275,51.141356],[16.27975,51.141153],[16.279767,51.141146],[16.28405,51.13944],[16.288591,51.137642],[16.289165,51.137413],[16.301248,51.132606],[16.301855,51.132364],[16.303375,51.131783],[16.304126,51.131519],[16.304895,51.131266],[16.30567,51.131029],[16.306477,51.130799],[16.307817,51.130463],[16.309213,51.130163],[16.311323,51.129804],[16.312535,51.129651],[16.31376,51.129525],[16.315226,51.12942],[16.316694,51.129341],[16.327391,51.128805],[16.328803,51.128734],[16.336713,51.128335],[16.33773,51.128284],[16.340284,51.128152],[16.341044,51.12811],[16.341074,51.128108],[16.341525,51.128086],[16.341882,51.128068],[16.342185,51.128053],[16.342206,51.128052],[16.345111,51.127907],[16.346933,51.127811],[16.348117,51.127751],[16.348802,51.12771],[16.349648,51.127655],[16.35096,51.12753],[16.352321,51.127356],[16.353663,51.12714],[16.354567,51.126967],[16.35502,51.126873],[16.356351,51.126569],[16.360948,51.125427],[16.361593,51.125265],[16.363612,51.124755],[16.364743,51.12444],[16.36586,51.124081],[16.366971,51.123689],[16.368051,51.123258],[16.369009,51.122843],[16.369958,51.122388],[16.371501,51.121638],[16.374421,51.120196],[16.375467,51.119679],[16.380921,51.116989],[16.390576,51.11222],[16.391284,51.111871],[16.392534,51.11125],[16.393768,51.110617],[16.394601,51.110149],[16.395402,51.109671],[16.396095,51.109208],[16.396772,51.108731],[16.397393,51.108266],[16.397981,51.107784],[16.399032,51.106831],[16.399867,51.105997],[16.400875,51.104968],[16.401272,51.10456],[16.403006,51.102776],[16.403517,51.10218],[16.403653,51.102005],[16.40399,51.101573],[16.404443,51.100938],[16.404853,51.100291],[16.407217,51.096104],[16.407291,51.095987],[16.407383,51.095838],[16.407707,51.095318],[16.408272,51.094525],[16.408779,51.093891],[16.409328,51.093264],[16.409864,51.092705],[16.410438,51.092154],[16.411231,51.09147],[16.412069,51.090803],[16.416397,51.087596],[16.41673,51.087355],[16.417357,51.086918],[16.418206,51.086361],[16.418787,51.085998],[16.418795,51.085993],[16.419207,51.085766],[16.420496,51.085056],[16.420789,51.084895],[16.420812,51.084884],[16.421618,51.084523],[16.422351,51.084199],[16.423058,51.083905],[16.423901,51.083583],[16.4248,51.083263],[16.426295,51.082792],[16.427719,51.082377],[16.42831,51.082207],[16.431317,51.081349],[16.438607,51.079274],[16.443127,51.077983],[16.444941,51.077464],[16.454052,51.074862],[16.455953,51.074277],[16.457835,51.073663],[16.460392,51.072756],[16.461946,51.072179],[16.464741,51.071166],[16.464804,51.071143],[16.465087,51.071041],[16.465708,51.070815],[16.466063,51.070686],[16.466077,51.070681],[16.469275,51.06952],[16.472867,51.068242],[16.474099,51.067845],[16.475381,51.067468],[16.476578,51.06717],[16.477811,51.0669],[16.478992,51.066688],[16.480669,51.066439],[16.483446,51.066092],[16.490918,51.065157],[16.502208,51.063757],[16.507653,51.063082],[16.50886,51.06291],[16.510056,51.062708],[16.511228,51.062487],[16.512143,51.062265],[16.512383,51.062216],[16.513233,51.062],[16.51542,51.061463],[16.516516,51.061181],[16.516543,51.061174],[16.516731,51.061128],[16.518269,51.06075],[16.519855,51.060348],[16.52004,51.060301],[16.520064,51.060295],[16.521875,51.059838],[16.521921,51.059826],[16.522065,51.059793],[16.522643,51.059649],[16.523029,51.059553],[16.523048,51.059548],[16.526539,51.058674],[16.530538,51.057686],[16.534446,51.056704],[16.54421,51.054261],[16.547875,51.053341],[16.550842,51.052602],[16.555056,51.05155],[16.557042,51.051077],[16.558543,51.050752],[16.559806,51.050496],[16.561529,51.050168],[16.563592,51.049778],[16.56849,51.048851],[16.569404,51.048684],[16.574105,51.047794],[16.576851,51.047269],[16.578744,51.046916],[16.580644,51.046544],[16.582404,51.04616],[16.584459,51.045666],[16.587106,51.044973],[16.58738,51.044897],[16.589623,51.044275],[16.592154,51.043566],[16.594172,51.043003],[16.59549,51.04264],[16.595529,51.042629],[16.595892,51.042528],[16.597364,51.042119],[16.597822,51.041992],[16.597844,51.041983],[16.601365,51.041004],[16.606923,51.039462],[16.610641,51.038425],[16.615596,51.037047],[16.618377,51.036274],[16.622769,51.035057],[16.624184,51.034709],[16.625582,51.034415],[16.628297,51.033923],[16.633193,51.033032],[16.641955,51.031437],[16.642847,51.031274],[16.6444,51.030989],[16.647873,51.030364],[16.651054,51.029779],[16.653509,51.02933],[16.653649,51.029305],[16.654453,51.029158],[16.657395,51.028604],[16.658946,51.028287],[16.660486,51.027936],[16.663153,51.027275],[16.666131,51.026447],[16.66948,51.025497],[16.6809,51.022256],[16.681745,51.022016],[16.682716,51.021741],[16.683752,51.021447],[16.685822,51.020871],[16.686879,51.020588],[16.687965,51.020323],[16.688943,51.020116],[16.689926,51.019927],[16.690746,51.01979],[16.691424,51.019698],[16.692661,51.019542],[16.694028,51.019408],[16.69472,51.019361],[16.695406,51.019326],[16.696299,51.019291],[16.697942,51.01928],[16.698882,51.019286],[16.703451,51.019317],[16.704531,51.019328],[16.712064,51.019393],[16.713272,51.019402],[16.719225,51.019448],[16.720017,51.019455],[16.728513,51.019528],[16.737158,51.019599],[16.739229,51.019634],[16.740078,51.01966],[16.740377,51.01967],[16.741535,51.019719],[16.743788,51.019853],[16.746052,51.020021],[16.747869,51.020187],[16.749058,51.020288],[16.749314,51.020309],[16.752625,51.020601],[16.754933,51.020805],[16.75747,51.021034],[16.758856,51.02115],[16.763146,51.021531],[16.766874,51.021843],[16.769059,51.022051],[16.77114,51.022218],[16.772983,51.022387],[16.773704,51.022461],[16.774404,51.022544],[16.775228,51.022659],[16.776039,51.022782],[16.776986,51.022956],[16.777863,51.02313],[16.778656,51.023306],[16.779623,51.023544],[16.780578,51.023804],[16.781358,51.024041],[16.781982,51.024243],[16.782712,51.024491],[16.783514,51.02479],[16.784324,51.025111],[16.785105,51.025442],[16.786061,51.025886],[16.786985,51.026348],[16.788101,51.026967],[16.789196,51.027617],[16.791404,51.028955],[16.793477,51.030199],[16.794555,51.030798],[16.795229,51.031143],[16.795933,51.031482],[16.79666,51.031819],[16.797315,51.032085],[16.798732,51.032631],[16.800304,51.033152],[16.801167,51.03341],[16.802041,51.033648],[16.802921,51.033865],[16.803559,51.03401],[16.803954,51.03409],[16.804709,51.034244],[16.805192,51.034335],[16.806377,51.03452],[16.807573,51.034677],[16.8078,51.034702],[16.809719,51.034875],[16.810162,51.034905],[16.811244,51.034952],[16.81147,51.034959],[16.812352,51.034987],[16.813419,51.034987],[16.817601,51.034976],[16.83581,51.034928],[16.853562,51.034885],[16.855901,51.034879],[16.858238,51.034896],[16.859728,51.034935],[16.861597,51.035013],[16.863504,51.03512],[16.865028,51.03523],[16.866733,51.03538],[16.867342,51.035434],[16.869428,51.03563],[16.870351,51.035717],[16.870433,51.035725],[16.881679,51.036772],[16.887326,51.037305],[16.889354,51.037488],[16.892544,51.037787],[16.892586,51.037791],[16.893078,51.037837],[16.893344,51.037862],[16.893846,51.03791],[16.893878,51.037913],[16.897443,51.03824],[16.899454,51.038428],[16.902888,51.038748],[16.905915,51.03903],[16.907427,51.039183],[16.907792,51.039226],[16.90895,51.039363],[16.909798,51.039471],[16.910635,51.039584],[16.912398,51.039844],[16.913675,51.040054],[16.914956,51.040277],[16.915953,51.040464],[16.916929,51.040656],[16.917326,51.040737],[16.91851,51.040985],[16.919686,51.041251],[16.920872,51.04153],[16.92298,51.042033],[16.924069,51.04229],[16.924203,51.042321],[16.925032,51.042441],[16.925324,51.042484],[16.925876,51.042562],[16.926451,51.042676],[16.927085,51.042802],[16.929318,51.043326],[16.929509,51.043371],[16.929814,51.043451],[16.930192,51.043529],[16.930415,51.043572],[16.930699,51.043642],[16.93082,51.043666],[16.930911,51.043681],[16.931011,51.043694],[16.931104,51.043706],[16.931203,51.043714],[16.931305,51.043721],[16.931402,51.043726],[16.931509,51.043726],[16.931667,51.043728],[16.931777,51.043726],[16.931866,51.043723],[16.931968,51.043718],[16.932078,51.043708],[16.932195,51.043694],[16.932289,51.043681],[16.932399,51.043662],[16.932518,51.04364],[16.93262,51.043619],[16.932867,51.043565],[16.93306,51.043521],[16.933201,51.043488],[16.933293,51.043468],[16.933419,51.043445],[16.933563,51.043421],[16.933685,51.043404],[16.933816,51.043391],[16.933939,51.043379],[16.934022,51.043374],[16.934051,51.043372],[16.93421,51.043367],[16.934322,51.043367],[16.934427,51.04337],[16.934537,51.043377],[16.934639,51.043386],[16.934779,51.043403],[16.934966,51.043433],[16.935077,51.043452],[16.935202,51.043475],[16.935344,51.043505],[16.935482,51.043543],[16.935505,51.043548],[16.935586,51.043568],[16.935661,51.043593],[16.935791,51.043635],[16.93593,51.043685],[16.936072,51.043738],[16.936208,51.043796],[16.936303,51.043838],[16.93644,51.043903],[16.936574,51.043974],[16.936694,51.044041],[16.936782,51.044094],[16.936897,51.044169],[16.937006,51.044252],[16.937094,51.044322],[16.937169,51.044394],[16.937248,51.044468],[16.937312,51.044539],[16.937374,51.044617],[16.937425,51.044691],[16.937468,51.044762],[16.937503,51.044831],[16.937529,51.044887],[16.937556,51.044959],[16.937577,51.045027],[16.937595,51.045103],[16.937607,51.045174],[16.937613,51.045242],[16.937614,51.045328],[16.937609,51.045414],[16.937599,51.045482],[16.937585,51.045551],[16.937573,51.045596],[16.937554,51.045659],[16.937526,51.045736],[16.937496,51.0458],[16.93747,51.045856],[16.937432,51.045916],[16.937398,51.045966],[16.937346,51.046036],[16.937311,51.046081],[16.937282,51.04612],[16.937211,51.046192],[16.937146,51.046254],[16.937067,51.046321],[16.937006,51.046371],[16.936957,51.046415],[16.936908,51.046454],[16.936865,51.046483],[16.936823,51.04651],[16.936732,51.04656],[16.936662,51.046594],[16.936609,51.046618],[16.936517,51.046656],[16.936406,51.046696],[16.936129,51.046787],[16.935913,51.046883],[16.935881,51.046894],[16.935802,51.046923],[16.935681,51.046972],[16.935591,51.047008],[16.935504,51.047046],[16.935435,51.047078],[16.935341,51.047122],[16.935259,51.047163],[16.935169,51.047212],[16.935099,51.047252],[16.93502,51.047297],[16.934896,51.047374],[16.934795,51.04744],[16.934689,51.047518],[16.934594,51.047591],[16.934522,51.047651],[16.934451,51.047713],[16.93437,51.04779],[16.934296,51.047863],[16.934225,51.047936],[16.934155,51.048019],[16.93409,51.048101],[16.934047,51.048161],[16.933995,51.048237],[16.933895,51.048405],[16.933834,51.048523],[16.933793,51.048617],[16.93377,51.04867],[16.933658,51.04901],[16.933492,51.049353],[16.933489,51.049367],[16.932464,51.053313],[16.931971,51.055215],[16.931516,51.056973],[16.931499,51.057037],[16.931484,51.057103],[16.931465,51.057187],[16.931402,51.057431],[16.930404,51.061219],[16.929873,51.063238],[16.929764,51.063667],[16.929484,51.064797],[16.929402,51.065118],[16.929314,51.06539],[16.92922,51.065763],[16.928983,51.066681],[16.928859,51.067156],[16.928594,51.068206],[16.928544,51.068434],[16.928539,51.068453],[16.928068,51.070182],[16.927983,51.070588],[16.927836,51.071117],[16.927753,51.071452],[16.927654,51.071877],[16.927569,51.072317],[16.92742,51.073189],[16.927329,51.073993],[16.927291,51.074446],[16.927261,51.075115],[16.927255,51.075793],[16.927297,51.076736],[16.927323,51.077075],[16.927353,51.07741],[16.92743,51.078],[16.927535,51.078631],[16.927664,51.079262],[16.927712,51.079461],[16.927991,51.080629],[16.928991,51.084152],[16.929133,51.084653],[16.929613,51.086348],[16.930179,51.088318],[16.930946,51.091058],[16.9311,51.091594],[16.9313,51.092304],[16.931653,51.093554],[16.931843,51.094199],[16.931974,51.094679],[16.932425,51.096275],[16.933002,51.09831],[16.933121,51.098721],[16.933525,51.10018],[16.93382,51.101227],[16.934119,51.102481],[16.934121,51.102487],[16.934171,51.102765],[16.93423,51.103191],[16.934308,51.103777],[16.934334,51.104237],[16.934363,51.10467],[16.934365,51.104755],[16.934372,51.1051],[16.934364,51.105701],[16.934359,51.105958],[16.934355,51.106153],[16.934354,51.106159],[16.93429,51.107019],[16.934101,51.108307],[16.933953,51.109023],[16.933588,51.111266],[16.933529,51.111631],[16.932638,51.116977],[16.932538,51.117594],[16.93244,51.11822],[16.93223,51.119468],[16.932068,51.120555],[16.932023,51.121148],[16.931997,51.121735],[16.931998,51.122371],[16.932022,51.122784],[16.932058,51.123194],[16.932107,51.123602],[16.93218,51.124008],[16.932328,51.124764],[16.932516,51.125426],[16.932732,51.126084],[16.933238,51.127505],[16.934147,51.130016],[16.93415,51.130023],[16.934239,51.130272],[16.9345,51.131001],[16.93491,51.132131],[16.935058,51.13252],[16.935191,51.132914],[16.935488,51.133643],[16.9362,51.135282],[16.936444,51.135835],[16.936687,51.13631],[16.936869,51.136667],[16.937069,51.137037],[16.937277,51.137413],[16.937713,51.138167],[16.938176,51.138916],[16.939141,51.140376],[16.940044,51.141665],[16.940094,51.141735],[16.9409,51.142898],[16.941587,51.14382],[16.941752,51.144041],[16.942688,51.145136],[16.943422,51.145887],[16.94457,51.146948],[16.944909,51.147234],[16.945259,51.147515],[16.945983,51.148077],[16.946584,51.148506],[16.947529,51.149148],[16.948597,51.149831],[16.948971,51.150071],[16.950922,51.151299],[16.951034,51.15137],[16.953016,51.152609],[16.956855,51.155016],[16.960506,51.157308],[16.964196,51.159601],[16.966097,51.160716],[16.967159,51.161279],[16.968252,51.161837],[16.969033,51.162209],[16.969163,51.162266],[16.970552,51.162891],[16.972217,51.163561],[16.972926,51.163834],[16.973479,51.164039],[16.974812,51.164502],[16.976228,51.164952],[16.977059,51.165203],[16.977934,51.165449],[16.978874,51.165697],[16.979836,51.165936],[16.980841,51.166168],[16.98186,51.16639],[16.983461,51.166698],[16.984317,51.166851],[16.985184,51.166983],[16.986049,51.167113],[16.986928,51.167229],[16.988344,51.167397],[16.989324,51.167497],[16.990312,51.167581],[16.991364,51.167655],[16.992407,51.167709],[16.993659,51.167762],[16.994908,51.167788],[16.996447,51.167797],[16.998562,51.167787],[17.002204,51.167753],[17.002411,51.16775],[17.005905,51.167716],[17.006746,51.167708],[17.010585,51.167669],[17.014015,51.16763],[17.014382,51.167632],[17.014742,51.167632],[17.01604,51.167628],[17.016614,51.167623],[17.017307,51.167614],[17.017709,51.167612],[17.018835,51.167599],[17.019692,51.16759],[17.02025,51.167583],[17.021013,51.167574],[17.021333,51.167574],[17.021846,51.167568],[17.022531,51.167561],[17.023213,51.167555],[17.024069,51.167546],[17.02538,51.167533],[17.025534,51.167532],[17.025602,51.167531],[17.025728,51.16753],[17.026349,51.167522],[17.026595,51.167521],[17.026779,51.16752],[17.028484,51.167502],[17.029711,51.16749],[17.030143,51.167485],[17.031312,51.167474],[17.031736,51.167469],[17.040655,51.167376],[17.041109,51.167371],[17.045502,51.167327],[17.048192,51.167299],[17.054482,51.167233],[17.054921,51.167228],[17.058071,51.167196],[17.05953,51.167193],[17.059795,51.167195],[17.060229,51.1672],[17.061275,51.167223],[17.062551,51.167285],[17.063883,51.167392],[17.064304,51.167435],[17.064724,51.167479],[17.065554,51.167578],[17.066523,51.167718],[17.067209,51.167831],[17.06785,51.167944],[17.068305,51.16803],[17.069298,51.16824],[17.070403,51.168501],[17.071491,51.168794],[17.072424,51.169075],[17.07336,51.169377],[17.074019,51.169611],[17.074653,51.169847],[17.075041,51.17],[17.075619,51.170234],[17.076171,51.170473],[17.077129,51.170915],[17.078443,51.171561],[17.079635,51.172174],[17.079694,51.172204],[17.082433,51.173619],[17.083244,51.174038],[17.083954,51.174401],[17.084983,51.174915],[17.085321,51.175079],[17.085372,51.175101],[17.08596,51.175385],[17.087005,51.175872],[17.087366,51.176038],[17.088228,51.176427],[17.08903,51.176779],[17.089969,51.177188],[17.090271,51.177318],[17.090898,51.177587],[17.095145,51.179407],[17.09616,51.179845],[17.09802,51.180648],[17.098677,51.180945],[17.099164,51.181169],[17.099642,51.181396],[17.100193,51.181666],[17.100731,51.181942],[17.101401,51.182303],[17.101549,51.18239],[17.101905,51.182592],[17.102265,51.182804],[17.102664,51.183047],[17.103141,51.183348],[17.103633,51.183673],[17.104108,51.184001],[17.104624,51.184375],[17.105054,51.184699],[17.105411,51.184983],[17.105792,51.185295],[17.106085,51.185542],[17.106374,51.185797],[17.106616,51.186016],[17.106977,51.186357],[17.107231,51.186606],[17.107492,51.186861],[17.107859,51.187241],[17.108078,51.187474],[17.108321,51.187737],[17.108503,51.187936],[17.108759,51.188218],[17.111719,51.191493],[17.112055,51.191864],[17.112366,51.192212],[17.112985,51.192892],[17.114167,51.19421],[17.11536,51.195522],[17.117162,51.197518],[17.117397,51.197782],[17.117666,51.198076],[17.118188,51.198657],[17.119238,51.199821],[17.11996,51.200615],[17.122167,51.203058],[17.123184,51.204189],[17.124269,51.205386],[17.125304,51.206521],[17.125733,51.206985],[17.126359,51.207644],[17.126905,51.208208],[17.127435,51.208728],[17.127718,51.209006],[17.128004,51.209275],[17.128406,51.209646],[17.128868,51.210066],[17.129572,51.210668],[17.129987,51.21102],[17.130406,51.211358],[17.130807,51.211679],[17.131293,51.212059],[17.131789,51.212432],[17.132264,51.212777],[17.132842,51.213195],[17.133323,51.213529],[17.133924,51.213934],[17.134423,51.214262],[17.134829,51.214523],[17.135545,51.214969],[17.13607,51.215289],[17.136399,51.215483],[17.13684,51.215739],[17.137222,51.215959],[17.137713,51.216235],[17.138238,51.21652],[17.138912,51.216879],[17.13959,51.217228],[17.140618,51.217739],[17.141199,51.218013],[17.141829,51.218306],[17.142366,51.21855],[17.142915,51.218789],[17.143438,51.219014],[17.144105,51.219294],[17.144713,51.219541],[17.145394,51.219811],[17.146176,51.220109],[17.146762,51.220326],[17.147359,51.220541],[17.147947,51.220748],[17.149012,51.221107],[17.150208,51.221486],[17.151341,51.221828],[17.151825,51.221969],[17.152709,51.222217],[17.153947,51.22254],[17.154918,51.222785],[17.155836,51.222997],[17.156595,51.22317],[17.157337,51.223329],[17.158015,51.223468],[17.158641,51.223594],[17.159269,51.223711],[17.159912,51.223829],[17.160454,51.22392],[17.161033,51.22402],[17.161657,51.22412],[17.162302,51.224218],[17.162611,51.224263],[17.162874,51.224301],[17.163461,51.224381],[17.164027,51.224458],[17.164468,51.224511],[17.164773,51.22455],[17.16554,51.224636],[17.166256,51.224714],[17.166906,51.224774],[17.167385,51.224821],[17.168047,51.224879],[17.168754,51.224935],[17.169509,51.224988],[17.17046,51.225047],[17.17068,51.225059],[17.171435,51.225095],[17.172182,51.225126],[17.172955,51.225154],[17.174285,51.225187],[17.175692,51.225215],[17.177413,51.225243],[17.183208,51.225319],[17.186108,51.225357],[17.189004,51.225397],[17.194462,51.225469],[17.197074,51.225508],[17.199158,51.225536],[17.200425,51.225559],[17.20167,51.225596],[17.203189,51.225656],[17.204052,51.2257],[17.204847,51.225745],[17.205499,51.225785],[17.206766,51.225872],[17.208164,51.225984],[17.209184,51.226074],[17.210048,51.226158],[17.210544,51.226209],[17.211057,51.226262],[17.212176,51.226389],[17.212213,51.226393],[17.227101,51.228182],[17.228417,51.22834],[17.229989,51.228528],[17.233004,51.228891],[17.234707,51.229096],[17.235574,51.229191],[17.236384,51.22927],[17.237581,51.229372],[17.238538,51.229437],[17.239449,51.229491],[17.24061,51.229543],[17.241491,51.229572],[17.242374,51.22959],[17.243072,51.229596],[17.243727,51.229597],[17.24433,51.229593],[17.244931,51.229583],[17.246165,51.229552],[17.247362,51.229501],[17.248082,51.22946],[17.248521,51.229433],[17.249076,51.229393],[17.24994,51.229328],[17.250768,51.229253],[17.251577,51.229172],[17.253127,51.228994],[17.254667,51.228807],[17.257029,51.228533],[17.265087,51.227588],[17.279826,51.225857],[17.281884,51.225617],[17.283925,51.225377],[17.287958,51.224902],[17.292195,51.224401],[17.294254,51.224162],[17.296284,51.223924],[17.299323,51.223565],[17.304744,51.222929],[17.305748,51.222809],[17.307613,51.222588],[17.309319,51.222385],[17.3102,51.222285],[17.310945,51.222207],[17.31165,51.222138],[17.312367,51.222074],[17.312989,51.22202],[17.313907,51.221953],[17.314693,51.221898],[17.315437,51.221852],[17.31687,51.221786],[17.317624,51.221758],[17.318345,51.221738],[17.319055,51.221723],[17.320014,51.221708],[17.320814,51.221704],[17.321763,51.221707],[17.322441,51.221715],[17.323658,51.221742],[17.324223,51.22176],[17.324845,51.22178],[17.325759,51.221821],[17.326335,51.221851],[17.326872,51.22188],[17.327496,51.221923],[17.328273,51.221977],[17.328892,51.222024],[17.329523,51.222077],[17.330129,51.222129],[17.330792,51.222195],[17.331378,51.222256],[17.332046,51.22233],[17.332552,51.222387],[17.33325,51.222473],[17.333951,51.222564],[17.334749,51.222675],[17.335709,51.222818],[17.336566,51.222952],[17.337435,51.223098],[17.338078,51.223211],[17.338592,51.223304],[17.341846,51.223912],[17.348438,51.225146],[17.357023,51.226752],[17.359048,51.227129],[17.361184,51.227527],[17.362102,51.227698],[17.362983,51.227864],[17.364619,51.228172],[17.366707,51.228556],[17.366988,51.228608],[17.367912,51.228782],[17.369693,51.229125],[17.370248,51.229228],[17.371097,51.22939],[17.374364,51.229998],[17.375443,51.230197],[17.3792,51.230902],[17.380525,51.23115],[17.381826,51.231393],[17.384333,51.231859],[17.387584,51.232468],[17.392028,51.233298],[17.393036,51.233482],[17.393882,51.23363],[17.394713,51.233767],[17.395401,51.233869],[17.396037,51.233954],[17.396549,51.234019],[17.397183,51.234088],[17.397988,51.234165],[17.398753,51.234223],[17.399245,51.234254],[17.399599,51.234272],[17.399947,51.234287],[17.400547,51.234309],[17.401347,51.234324],[17.401999,51.234324],[17.40249,51.23432],[17.402529,51.23432],[17.403019,51.234309],[17.403546,51.234291],[17.404023,51.234272],[17.40442,51.234251],[17.40476,51.234228],[17.40512,51.234203],[17.405495,51.234175],[17.405876,51.234142],[17.406422,51.23409],[17.406806,51.234048],[17.407186,51.234004],[17.407653,51.233946],[17.408316,51.233854],[17.408974,51.233756],[17.40942,51.233682],[17.40991,51.233601],[17.410633,51.233473],[17.411238,51.233364],[17.412312,51.233164],[17.41343,51.232956],[17.417391,51.23222],[17.419084,51.231904],[17.419649,51.231797],[17.420061,51.231721],[17.426746,51.230478],[17.427289,51.230372],[17.427767,51.230286],[17.428511,51.230148],[17.429085,51.230039],[17.429491,51.229953],[17.429871,51.22987],[17.430397,51.229741],[17.430687,51.229663],[17.431057,51.229555],[17.431483,51.229424],[17.432102,51.229225],[17.433159,51.22887],[17.434536,51.228414],[17.435298,51.228169],[17.435777,51.228021],[17.436099,51.227923],[17.436548,51.227791],[17.437021,51.227657],[17.43738,51.22756],[17.437842,51.227441],[17.438339,51.227321],[17.438753,51.227222],[17.439178,51.227131],[17.439587,51.227045],[17.439849,51.226993],[17.440116,51.226942],[17.440606,51.22685],[17.440985,51.226785],[17.441527,51.226697],[17.442069,51.226615],[17.442502,51.226553],[17.442902,51.226501],[17.443299,51.226453],[17.443714,51.226409],[17.444086,51.22637],[17.444421,51.22634],[17.44478,51.226309],[17.445177,51.226277],[17.445627,51.226247],[17.446078,51.226221],[17.446391,51.226207],[17.446905,51.226186],[17.447572,51.226167],[17.448122,51.22616],[17.448506,51.226158],[17.449045,51.226161],[17.449597,51.226169],[17.450059,51.226185],[17.450587,51.226205],[17.451096,51.22623],[17.451583,51.226263],[17.452113,51.2263],[17.452438,51.226328],[17.452773,51.226358],[17.453299,51.226412],[17.45395,51.226484],[17.454642,51.226576],[17.455203,51.226656],[17.455834,51.226756],[17.456559,51.226877],[17.457334,51.227013],[17.467112,51.228795],[17.468158,51.228982],[17.468899,51.229123],[17.469504,51.229244],[17.470051,51.22936],[17.470811,51.229522],[17.471669,51.229706],[17.472151,51.229833],[17.472693,51.229963],[17.473164,51.230082],[17.473763,51.230237],[17.474333,51.230387],[17.475505,51.230713],[17.476148,51.2309],[17.476851,51.231112],[17.4774,51.231283],[17.478043,51.231488],[17.478715,51.231709],[17.479247,51.231893],[17.479892,51.232116],[17.48041,51.2323],[17.481731,51.232796],[17.482469,51.233085],[17.482819,51.233226],[17.485278,51.234243],[17.487613,51.235207],[17.493117,51.237482],[17.495538,51.238482],[17.499342,51.240054],[17.501942,51.241128],[17.504848,51.242329],[17.513343,51.245835],[17.514002,51.246104],[17.515932,51.246907],[17.52208,51.249446],[17.522607,51.249663],[17.533315,51.254083],[17.534005,51.254373],[17.53473,51.254679],[17.53546,51.254995],[17.536171,51.255313],[17.536856,51.255627],[17.537543,51.255958],[17.538225,51.256299],[17.538918,51.256658],[17.53967,51.257069],[17.540267,51.257404],[17.54092,51.257794],[17.541665,51.258251],[17.542257,51.258637],[17.54274,51.258961],[17.54318,51.259265],[17.543647,51.2596],[17.544201,51.260009],[17.544822,51.260492],[17.545387,51.260944],[17.546158,51.261605],[17.546595,51.261999],[17.546947,51.262323],[17.547339,51.262705],[17.547741,51.263099],[17.548366,51.26375],[17.548721,51.264129],[17.549079,51.26452],[17.549645,51.265146],[17.55008,51.26563],[17.551248,51.266936],[17.55184,51.267598],[17.552352,51.268171],[17.553782,51.269771],[17.554723,51.270823],[17.555255,51.2714],[17.555512,51.271677],[17.555967,51.272141],[17.556243,51.272421],[17.556666,51.272824],[17.557024,51.273153],[17.557245,51.273351],[17.557537,51.273604],[17.557842,51.273851],[17.558382,51.274291],[17.558719,51.274559],[17.559138,51.274874],[17.560045,51.27552],[17.560907,51.276108],[17.56185,51.276731],[17.562588,51.277219],[17.56367,51.277937],[17.565311,51.279024],[17.566056,51.27952],[17.566778,51.279995],[17.568217,51.280952],[17.569638,51.281893],[17.570096,51.282195],[17.571006,51.282813],[17.571606,51.283242],[17.572117,51.28362],[17.572689,51.284061],[17.57312,51.284408],[17.573568,51.28479],[17.573943,51.28512],[17.57453,51.285662],[17.574904,51.286023],[17.575196,51.286318],[17.575498,51.286633],[17.575802,51.286966],[17.576304,51.28753],[17.576811,51.288128],[17.577876,51.289414],[17.577884,51.289424],[17.580044,51.292038],[17.580918,51.293095],[17.581558,51.293847],[17.581936,51.294272],[17.582356,51.294732],[17.582709,51.295097],[17.583091,51.295473],[17.583471,51.295836],[17.583891,51.296223],[17.584502,51.296751],[17.585139,51.297269],[17.585887,51.297836],[17.586514,51.298285],[17.587278,51.298803],[17.587861,51.299175],[17.588701,51.299688],[17.589536,51.300161],[17.590329,51.300587],[17.591294,51.301068],[17.591988,51.301393],[17.592682,51.301703],[17.593361,51.301994],[17.594004,51.302255],[17.594669,51.302512],[17.595341,51.30276],[17.595948,51.302974],[17.596691,51.30322],[17.597288,51.303411],[17.598024,51.30363],[17.598679,51.303819],[17.599224,51.303964],[17.599838,51.304123],[17.600432,51.304269],[17.600927,51.304383],[17.601467,51.304503],[17.60213,51.304642],[17.602625,51.304741],[17.603139,51.304836],[17.603642,51.304925],[17.604249,51.305027],[17.604842,51.305119],[17.605429,51.305204],[17.605973,51.305276],[17.606525,51.305345],[17.607059,51.305403],[17.607527,51.305451],[17.608013,51.305498],[17.608541,51.305543],[17.609197,51.305592],[17.609635,51.305622],[17.610188,51.305651],[17.610701,51.305676],[17.611145,51.305693],[17.611617,51.305706],[17.612117,51.305719],[17.612867,51.305727],[17.613356,51.305724],[17.613882,51.305725],[17.614451,51.30571],[17.615057,51.305692],[17.615608,51.305671],[17.616034,51.305655],[17.616524,51.305628],[17.617001,51.305597],[17.617523,51.305557],[17.618009,51.305518],[17.618449,51.305478],[17.618885,51.305434],[17.619363,51.305383],[17.61992,51.305315],[17.620496,51.305246],[17.621045,51.305169],[17.621664,51.305076],[17.622182,51.304997],[17.622696,51.304911],[17.623252,51.304815],[17.623837,51.304709],[17.625402,51.30442],[17.630097,51.303536],[17.634417,51.302725],[17.636686,51.302299],[17.638824,51.301897],[17.644405,51.300846],[17.647218,51.300319],[17.649891,51.299815],[17.651488,51.299513],[17.653033,51.299226],[17.655676,51.298728],[17.657049,51.298469],[17.658381,51.29822],[17.660718,51.297779],[17.664009,51.29716],[17.665224,51.29693],[17.666492,51.296703],[17.667124,51.296594],[17.667627,51.296512],[17.668174,51.296422],[17.668733,51.29634],[17.669251,51.296268],[17.669734,51.2962],[17.670276,51.29613],[17.670659,51.296087],[17.671163,51.296031],[17.671632,51.295981],[17.672111,51.295934],[17.672618,51.295888],[17.673073,51.295852],[17.673735,51.295799],[17.674543,51.295742],[17.676401,51.295629],[17.67892,51.295488],[17.679574,51.295456],[17.682872,51.29527],[17.6843,51.295189],[17.686062,51.295088],[17.687148,51.295028],[17.68873,51.294938],[17.69006,51.294864],[17.691131,51.294803],[17.691673,51.294773],[17.701359,51.294228],[17.706228,51.293952],[17.708617,51.293817],[17.70915,51.293788],[17.709548,51.293768],[17.710202,51.293739],[17.710735,51.293722],[17.711036,51.293714],[17.711434,51.293705],[17.711953,51.293697],[17.712296,51.293692],[17.712714,51.29369],[17.720718,51.293702],[17.72416,51.293707],[17.724852,51.293712],[17.72537,51.293719],[17.725717,51.293728],[17.726012,51.293737],[17.726409,51.293753],[17.726994,51.293784],[17.727613,51.293829],[17.727956,51.293858],[17.728297,51.293891],[17.728982,51.293968],[17.729492,51.294034],[17.729774,51.294075],[17.730299,51.294155],[17.730721,51.294228],[17.731328,51.294334],[17.732265,51.294512],[17.734747,51.294993],[17.737057,51.295441],[17.740326,51.29607],[17.746814,51.297325],[17.7488,51.297712],[17.749514,51.297849],[17.75005,51.297946],[17.750586,51.298042],[17.751123,51.298136],[17.751707,51.29823],[17.752386,51.298339],[17.753256,51.298475],[17.753906,51.29857],[17.753935,51.298574],[17.755576,51.298801],[17.757186,51.299017],[17.760005,51.299403],[17.761321,51.29958],[17.762825,51.299784],[17.763527,51.29988],[17.763859,51.299925],[17.764254,51.299978],[17.765917,51.300202],[17.767448,51.300411],[17.7681,51.300498],[17.768808,51.300603],[17.769524,51.300718],[17.770114,51.300824],[17.770563,51.300914],[17.77095,51.300994],[17.771379,51.301086],[17.771845,51.301195],[17.772262,51.301298],[17.772599,51.301382],[17.773497,51.301622],[17.774834,51.301981],[17.775767,51.302232],[17.77661,51.302442],[17.77721,51.302587],[17.777784,51.302717],[17.778426,51.302855],[17.779497,51.303064],[17.780281,51.303194],[17.780952,51.303295],[17.781603,51.303383],[17.782106,51.303445],[17.78262,51.303503],[17.783206,51.303559],[17.783767,51.303606],[17.784297,51.303646],[17.784806,51.303678],[17.785279,51.303702],[17.785723,51.303725],[17.786255,51.30374],[17.786879,51.303749],[17.787429,51.303747],[17.787892,51.303744],[17.788352,51.303738],[17.788889,51.303722],[17.789427,51.303699],[17.78999,51.303671],[17.790532,51.303638],[17.790906,51.303609],[17.791407,51.303565],[17.791956,51.303514],[17.792412,51.303464],[17.792922,51.303403],[17.793297,51.303353],[17.793769,51.303287],[17.79426,51.303216],[17.794758,51.303133],[17.795273,51.303046],[17.79586,51.302934],[17.796304,51.302842],[17.796712,51.302757],[17.79725,51.302636],[17.797685,51.302532],[17.797903,51.302478],[17.798223,51.302398],[17.798861,51.302225],[17.799432,51.302065],[17.799954,51.301906],[17.800373,51.301776],[17.800991,51.30157],[17.8016,51.301357],[17.802183,51.301139],[17.802635,51.300969],[17.803173,51.300756],[17.807104,51.299175],[17.808121,51.298768],[17.808733,51.298524],[17.809186,51.298349],[17.809613,51.29819],[17.810188,51.297982],[17.810711,51.297804],[17.811173,51.29765],[17.811876,51.297434],[17.812487,51.297257],[17.813087,51.297092],[17.813744,51.296926],[17.814187,51.29682],[17.814822,51.29668],[17.814981,51.296646],[17.815213,51.296597],[17.815444,51.296548],[17.816054,51.296428],[17.816726,51.296308],[17.817323,51.29621],[17.817891,51.296125],[17.818393,51.296057],[17.819058,51.295972],[17.819492,51.295927],[17.819952,51.29588],[17.82047,51.295833],[17.821008,51.295792],[17.821551,51.295756],[17.822012,51.29573],[17.822571,51.295705],[17.823226,51.295686],[17.823829,51.295676],[17.824443,51.295675],[17.825024,51.29568],[17.825817,51.295693],[17.830173,51.295817],[17.840517,51.296118],[17.843864,51.296216],[17.844959,51.296261],[17.845951,51.296308],[17.846873,51.296361],[17.847527,51.296405],[17.848189,51.296456],[17.848942,51.296519],[17.849878,51.296612],[17.850703,51.2967],[17.851525,51.296798],[17.852412,51.296912],[17.853212,51.297026],[17.853855,51.297122],[17.854548,51.297232],[17.855313,51.297361],[17.855994,51.297483],[17.857034,51.297678],[17.857981,51.297862],[17.859996,51.298268],[17.860233,51.298314],[17.860768,51.29842],[17.861681,51.2986],[17.863058,51.29886],[17.863796,51.298994],[17.86455,51.299122],[17.865328,51.299244],[17.86599,51.299342],[17.866649,51.299436],[17.867297,51.299521],[17.8683,51.299642],[17.86915,51.299734],[17.869746,51.299792],[17.87028,51.29984],[17.871083,51.299909],[17.871913,51.299969],[17.872598,51.300009],[17.873105,51.300038],[17.873674,51.300065],[17.874568,51.300102],[17.875283,51.300121],[17.875852,51.300133],[17.876735,51.300143],[17.877835,51.300146],[17.878371,51.300138],[17.878959,51.300126],[17.879753,51.300106],[17.881193,51.300056],[17.883027,51.299978],[17.884899,51.299892],[17.88861,51.299725],[17.891907,51.299576],[17.892872,51.299537],[17.893598,51.299514],[17.894052,51.299505],[17.894525,51.299498],[17.895174,51.299499],[17.895867,51.299508],[17.8965,51.299528],[17.897074,51.299553],[17.897629,51.299586],[17.898244,51.29963],[17.898804,51.299676],[17.899397,51.299732],[17.899954,51.299797],[17.900509,51.299866],[17.9011,51.299948],[17.901711,51.300042],[17.902326,51.300147],[17.902814,51.300238],[17.903254,51.300324],[17.903728,51.300421],[17.904231,51.300533],[17.904714,51.300645],[17.905168,51.30076],[17.905695,51.300897],[17.906188,51.301034],[17.906663,51.301173],[17.90727,51.301359],[17.908054,51.301619],[17.908489,51.301772],[17.909606,51.302183],[17.910541,51.302544],[17.91145,51.302896],[17.911883,51.303065],[17.913803,51.303806],[17.917104,51.305084],[17.918762,51.305729],[17.920459,51.306383],[17.921905,51.30694],[17.922681,51.307237],[17.923565,51.307564],[17.924143,51.307775],[17.924674,51.307958],[17.925334,51.308182],[17.92609,51.30843],[17.926792,51.308649],[17.927476,51.308856],[17.92807,51.309026],[17.928616,51.309183],[17.929048,51.309301],[17.929241,51.309354],[17.92985,51.309511],[17.930419,51.309657],[17.931061,51.30981],[17.931571,51.309933],[17.932114,51.310055],[17.932712,51.310188],[17.933303,51.310308],[17.93399,51.310446],[17.934552,51.310555],[17.935298,51.310691],[17.93592,51.310802],[17.936567,51.31091],[17.937494,51.311066],[17.938478,51.311226],[17.962893,51.31521],[17.966989,51.315876],[17.969063,51.316213],[17.97011,51.316377],[17.970941,51.316501],[17.971388,51.316565],[17.971629,51.3166],[17.972455,51.316705],[17.973018,51.316773],[17.973711,51.316854],[17.974382,51.316924],[17.975032,51.316986],[17.975488,51.317026],[17.976018,51.31707],[17.976819,51.31713],[17.977609,51.317182],[17.978354,51.317223],[17.979203,51.317261],[17.979825,51.317281],[17.980328,51.317297],[17.981009,51.317311],[17.981685,51.317317],[17.982487,51.31732],[17.983224,51.317314],[17.983843,51.317306],[17.984527,51.317289],[17.985237,51.317265],[17.986059,51.317231],[17.986738,51.317198],[17.987412,51.317161],[17.988626,51.317084],[17.990254,51.316972],[17.991631,51.316875],[17.992635,51.316805],[17.99362,51.316736],[17.994528,51.31667],[17.995197,51.316623],[17.995755,51.316584],[17.99743,51.316465],[17.999556,51.316315],[18.004261,51.315987],[18.006442,51.315842],[18.007225,51.315787],[18.008994,51.315696],[18.010181,51.31566],[18.010689,51.315646],[18.012137,51.315634],[18.013949,51.315648],[18.014274,51.315656],[18.014666,51.315665],[18.016055,51.31572],[18.016676,51.315748],[18.017473,51.315796],[18.01821,51.315848],[18.019769,51.315973],[18.02115,51.316098],[18.023103,51.316283],[18.025857,51.316563],[18.028203,51.31679],[18.030521,51.317014],[18.035187,51.317466],[18.038398,51.317776],[18.039845,51.317916],[18.0406,51.317989],[18.044482,51.318365],[18.049771,51.318878],[18.052715,51.319164],[18.053586,51.319255],[18.054596,51.319362],[18.055619,51.319481],[18.056202,51.319554],[18.056661,51.319615],[18.057243,51.319694],[18.057838,51.319782],[18.058554,51.319893],[18.059218,51.319998],[18.060093,51.320151],[18.060717,51.320265],[18.061648,51.320448],[18.062219,51.320563],[18.062933,51.320716],[18.06366,51.320877],[18.064216,51.321005],[18.06525,51.321259],[18.065973,51.321449],[18.066637,51.321629],[18.067409,51.321847],[18.068045,51.322034],[18.068714,51.322242],[18.069395,51.322458],[18.069962,51.322641],[18.070555,51.32284],[18.071082,51.323024],[18.07234,51.323486],[18.072923,51.323713],[18.073647,51.324002],[18.074329,51.324281],[18.075097,51.324603],[18.075733,51.324872],[18.076457,51.325184],[18.077792,51.325762],[18.079925,51.326701],[18.082113,51.327651],[18.082528,51.32783],[18.084222,51.328567],[18.084828,51.328831],[18.087103,51.329823],[18.08905,51.330669],[18.090588,51.33134],[18.092395,51.332122],[18.09368,51.332682],[18.094349,51.332971],[18.094973,51.333237],[18.095873,51.333611],[18.096647,51.333929],[18.097151,51.334125],[18.097537,51.334276],[18.098038,51.334464],[18.098641,51.334683],[18.099195,51.334876],[18.099782,51.335074],[18.100375,51.335266],[18.100973,51.33545],[18.10168,51.335658],[18.1024,51.335863],[18.10319,51.336071],[18.103821,51.336229],[18.104271,51.336335],[18.104704,51.336437],[18.105249,51.336555],[18.105798,51.336672],[18.105857,51.336685],[18.106391,51.336795],[18.106737,51.336862],[18.107782,51.337051],[18.108226,51.337124],[18.108843,51.337225],[18.109437,51.337311],[18.109827,51.337365],[18.110327,51.337433],[18.110891,51.337504],[18.111261,51.337546],[18.11164,51.337588],[18.112179,51.337645],[18.112927,51.337715],[18.113444,51.337757],[18.113895,51.337789],[18.114304,51.337817],[18.11478,51.337846],[18.115252,51.33787],[18.115838,51.337898],[18.116515,51.337921],[18.117253,51.337941],[18.11773,51.337949],[18.118215,51.337953],[18.118658,51.337955],[18.119093,51.337951],[18.119646,51.337939],[18.120295,51.337919],[18.12093,51.337897],[18.121676,51.337863],[18.122303,51.33783],[18.122837,51.337794],[18.123372,51.337752],[18.123726,51.337723],[18.124152,51.337689],[18.124686,51.337637],[18.125162,51.337587],[18.125667,51.337531],[18.126489,51.33743],[18.127242,51.337327],[18.12776,51.337252],[18.128117,51.337196],[18.128546,51.337128],[18.128973,51.337055],[18.129509,51.336961],[18.129986,51.336874],[18.130514,51.33677],[18.131313,51.336603],[18.131711,51.33652],[18.132259,51.336396],[18.132739,51.336281],[18.133338,51.336135],[18.133931,51.335983],[18.134501,51.335827],[18.135346,51.335587],[18.135886,51.335426],[18.136439,51.335254],[18.137016,51.335066],[18.137424,51.334931],[18.137847,51.334784],[18.13851,51.334551],[18.139156,51.33431],[18.139788,51.334063],[18.140418,51.33381],[18.141143,51.333505],[18.141641,51.333293],[18.142174,51.333047],[18.142735,51.332784],[18.143286,51.332515],[18.143786,51.332259],[18.144276,51.332005],[18.144749,51.33175],[18.145324,51.331429],[18.145824,51.331137],[18.146265,51.330875],[18.14678,51.330556],[18.147344,51.330194],[18.147796,51.3299],[18.148396,51.329495],[18.149225,51.328924],[18.149702,51.328591],[18.151517,51.327316],[18.15226,51.326795],[18.152881,51.326359],[18.155257,51.324692],[18.157636,51.323023],[18.158618,51.322327],[18.159743,51.321541],[18.160897,51.320732],[18.161311,51.320438],[18.162094,51.31989],[18.164451,51.318238],[18.165519,51.317486],[18.166393,51.316869],[18.167262,51.31627],[18.167957,51.3158],[18.16845,51.315466],[18.168996,51.315105],[18.169589,51.314723],[18.170059,51.314432],[18.170434,51.314197],[18.170751,51.31401],[18.171279,51.313701],[18.172009,51.313284],[18.172822,51.312841],[18.17327,51.312605],[18.173711,51.312378],[18.174196,51.312134],[18.174737,51.311867],[18.17525,51.311624],[18.175752,51.311388],[18.176278,51.31115],[18.176837,51.310901],[18.177299,51.310702],[18.177971,51.310422],[18.178429,51.310233],[18.178793,51.310089],[18.179159,51.30994],[18.179977,51.309631],[18.180422,51.309466],[18.180732,51.309353],[18.18141,51.309116],[18.182128,51.308871],[18.182796,51.308653],[18.183571,51.308412],[18.184136,51.308238],[18.184695,51.308073],[18.185826,51.307757],[18.186492,51.307577],[18.187395,51.307349],[18.187904,51.307224],[18.188618,51.307055],[18.189182,51.306929],[18.189881,51.306776],[18.190471,51.306653],[18.190969,51.306555],[18.191302,51.306492],[18.191919,51.306372],[18.192733,51.306232],[18.193326,51.306132],[18.193842,51.306047],[18.194564,51.305939],[18.195175,51.305851],[18.195918,51.305752],[18.196487,51.305681],[18.197136,51.305604],[18.197844,51.305527],[18.198426,51.305467],[18.199333,51.305382],[18.200325,51.305302],[18.201335,51.305235],[18.202012,51.305194],[18.202672,51.305162],[18.203356,51.305133],[18.203987,51.305112],[18.204594,51.305097],[18.205153,51.305087],[18.205813,51.305079],[18.206431,51.305077],[18.207033,51.305079],[18.20768,51.305084],[18.208271,51.305096],[18.208813,51.305109],[18.209438,51.305129],[18.210304,51.305168],[18.211219,51.305212],[18.21302,51.305341],[18.213865,51.305409],[18.214663,51.305488],[18.215444,51.30557],[18.216098,51.305646],[18.216741,51.305726],[18.217466,51.305821],[18.218161,51.305922],[18.21883,51.306023],[18.219775,51.306176],[18.220538,51.306305],[18.221349,51.306455],[18.222121,51.306602],[18.222896,51.306755],[18.223856,51.306954],[18.224834,51.307166],[18.22581,51.307378],[18.226774,51.307592],[18.228763,51.308033],[18.229736,51.308251],[18.230459,51.308408],[18.234848,51.309382],[18.236701,51.309789],[18.238145,51.310111],[18.241034,51.310749],[18.243343,51.31126],[18.24625,51.311904],[18.247382,51.312155],[18.249015,51.312515],[18.255456,51.31394],[18.256388,51.314144],[18.257378,51.314352],[18.257885,51.314456],[18.258405,51.314559],[18.258917,51.31466],[18.259522,51.314777],[18.260203,51.314901],[18.260852,51.315018],[18.261487,51.315128],[18.262396,51.315283],[18.263158,51.315406],[18.263684,51.315489],[18.264384,51.315595],[18.265341,51.315734],[18.267886,51.316093],[18.274808,51.317072],[18.277784,51.317494],[18.280089,51.317819],[18.281112,51.317962],[18.288776,51.319047],[18.29892,51.320478],[18.302602,51.320998],[18.304352,51.321246],[18.316283,51.322925],[18.31707,51.323033],[18.317603,51.323105],[18.318116,51.32317],[18.318723,51.323237],[18.319313,51.323295],[18.319821,51.323344],[18.320438,51.323397],[18.321111,51.323447],[18.321792,51.323489],[18.322374,51.323522],[18.322992,51.323549],[18.323499,51.323565],[18.324003,51.32358],[18.324407,51.323588],[18.324715,51.323596],[18.325228,51.323595],[18.325777,51.323596],[18.326278,51.323592],[18.326795,51.323585],[18.327334,51.323572],[18.328025,51.323548],[18.328669,51.323519],[18.329236,51.323488],[18.329976,51.323443],[18.330517,51.323401],[18.33115,51.323348],[18.33186,51.323282],[18.332524,51.32321],[18.333102,51.323143],[18.333572,51.323084],[18.33407,51.323016],[18.334758,51.322918],[18.335594,51.322787],[18.336161,51.322692],[18.336728,51.322592],[18.337317,51.322482],[18.338001,51.322344],[18.338612,51.322213],[18.340839,51.321722],[18.343096,51.32123],[18.348261,51.320081],[18.34905,51.319907],[18.349699,51.319763],[18.350389,51.319616],[18.350993,51.319493],[18.351569,51.319379],[18.352317,51.319238],[18.352982,51.319119],[18.353861,51.318967],[18.354339,51.318889],[18.3553,51.318741],[18.356014,51.318639],[18.35666,51.318552],[18.357336,51.318465],[18.358257,51.318355],[18.358874,51.318288],[18.359427,51.31823],[18.360081,51.318166],[18.360859,51.318097],[18.362111,51.317996],[18.363958,51.317846],[18.369553,51.317391],[18.371626,51.317222],[18.37348,51.317075],[18.376098,51.316863],[18.392611,51.315532],[18.400342,51.314901],[18.401273,51.314834],[18.402014,51.31479],[18.402716,51.314754],[18.403177,51.314734],[18.403738,51.314717],[18.404285,51.3147],[18.404876,51.314691],[18.405653,51.314685],[18.406355,51.314687],[18.407105,51.314692],[18.40776,51.314708],[18.408533,51.314734],[18.409245,51.314767],[18.409957,51.314809],[18.410681,51.314855],[18.411272,51.3149],[18.411754,51.314941],[18.412178,51.314981],[18.412713,51.31503],[18.413198,51.315083],[18.413794,51.315149],[18.414387,51.31522],[18.414934,51.315292],[18.415538,51.315377],[18.41616,51.315469],[18.416708,51.315556],[18.417374,51.315665],[18.417841,51.315748],[18.418338,51.31584],[18.418868,51.315943],[18.419505,51.316078],[18.420099,51.316207],[18.420607,51.316319],[18.421207,51.316463],[18.422063,51.316673],[18.422628,51.31682],[18.423225,51.31698],[18.423759,51.317135],[18.424306,51.317292],[18.424776,51.317433],[18.425212,51.317569],[18.425701,51.317725],[18.426254,51.317908],[18.426862,51.318119],[18.427369,51.318296],[18.428022,51.318534],[18.42847,51.318708],[18.428881,51.318867],[18.429645,51.319177],[18.430412,51.319502],[18.430887,51.319705],[18.431302,51.319889],[18.431849,51.32015],[18.432356,51.320385],[18.43284,51.320626],[18.433341,51.320879],[18.433838,51.321141],[18.434658,51.32159],[18.435281,51.32195],[18.435879,51.322306],[18.436446,51.322654],[18.437013,51.323013],[18.437461,51.323311],[18.438217,51.323832],[18.439903,51.325029],[18.440424,51.325379],[18.440956,51.325728],[18.441472,51.326051],[18.442009,51.326375],[18.442859,51.326864],[18.443641,51.327285],[18.444187,51.327566],[18.444614,51.327785],[18.445227,51.328083],[18.445831,51.328365],[18.446631,51.328728],[18.44749,51.329093],[18.44817,51.329365],[18.448879,51.329637],[18.449688,51.329935],[18.450285,51.330143],[18.450825,51.330326],[18.451564,51.330562],[18.452212,51.330763],[18.452819,51.330939],[18.453687,51.331177],[18.454472,51.331383],[18.455186,51.331558],[18.455931,51.331734],[18.456653,51.33189],[18.457433,51.332051],[18.458109,51.332183],[18.458804,51.332309],[18.460392,51.332565],[18.462308,51.332867],[18.465262,51.333334],[18.466268,51.333484],[18.467964,51.333752],[18.469304,51.333962],[18.473278,51.334588],[18.474502,51.334778],[18.475021,51.334863],[18.475819,51.334995],[18.476472,51.335109],[18.477071,51.335223],[18.477719,51.335341],[18.478333,51.335462],[18.478936,51.33558],[18.479557,51.335711],[18.480274,51.335865],[18.481078,51.33604],[18.48189,51.336226],[18.482496,51.336369],[18.483173,51.336535],[18.48416,51.336784],[18.484803,51.33695],[18.485751,51.337207],[18.486404,51.337388],[18.487291,51.337643],[18.488515,51.338012],[18.488717,51.338073],[18.489899,51.338448],[18.490463,51.338628],[18.491027,51.33882],[18.491699,51.339054],[18.492209,51.339233],[18.492923,51.339487],[18.493642,51.339754],[18.494405,51.340043],[18.494997,51.340271],[18.495891,51.340628],[18.496595,51.340916],[18.497426,51.341268],[18.498099,51.341561],[18.498656,51.341807],[18.499359,51.342127],[18.499837,51.342349],[18.500699,51.342765],[18.50121,51.343016],[18.501863,51.343343],[18.50246,51.343645],[18.50296,51.343903],[18.503344,51.344106],[18.504327,51.344637],[18.504991,51.345008],[18.505707,51.345419],[18.506247,51.345733],[18.506914,51.346135],[18.507498,51.346496],[18.508123,51.346887],[18.509664,51.34788],[18.51147,51.349051],[18.512555,51.349753],[18.513457,51.350337],[18.515306,51.351542],[18.516146,51.352092],[18.517189,51.352757],[18.519555,51.354291],[18.521457,51.355537],[18.52239,51.356139],[18.523436,51.356807],[18.524118,51.35725],[18.524773,51.357685],[18.52545,51.358144],[18.526321,51.358748],[18.527209,51.359401],[18.527838,51.359869],[18.528472,51.360364],[18.529108,51.360873],[18.529553,51.361203],[18.530068,51.361622],[18.530566,51.362065],[18.531081,51.362525],[18.531662,51.363069],[18.532296,51.363631],[18.533111,51.364387],[18.534006,51.365218],[18.534447,51.365623],[18.535257,51.366361],[18.535459,51.366549],[18.53555,51.366633],[18.537123,51.368069],[18.53831,51.369148],[18.539143,51.369912],[18.541128,51.371736],[18.544427,51.374743],[18.546446,51.376582],[18.546667,51.376783],[18.547767,51.377804],[18.548431,51.378387],[18.54869,51.378611],[18.54911,51.378965],[18.549613,51.379365],[18.54994,51.379623],[18.550561,51.380095],[18.551045,51.380456],[18.551528,51.380805],[18.551956,51.381109],[18.552446,51.381445],[18.553107,51.381889],[18.553611,51.382223],[18.553988,51.38246],[18.554645,51.382868],[18.555567,51.383422],[18.556416,51.383908],[18.557064,51.384262],[18.557638,51.384574],[18.558297,51.384912],[18.558758,51.38515],[18.559348,51.385444],[18.559921,51.385721],[18.560476,51.385983],[18.561211,51.386317],[18.562025,51.386679],[18.562694,51.386965],[18.563344,51.387235],[18.563989,51.387494],[18.564478,51.387686],[18.564947,51.387865],[18.565545,51.388092],[18.566267,51.388353],[18.566918,51.388581],[18.567529,51.388792],[18.568043,51.38896],[18.568725,51.38918],[18.569143,51.389314],[18.569588,51.389453],[18.570172,51.389627],[18.570735,51.38979],[18.571322,51.389958],[18.57205,51.390155],[18.572704,51.39033],[18.573479,51.390525],[18.573965,51.390647],[18.57466,51.390811],[18.575281,51.390953],[18.575966,51.391107],[18.576523,51.391225],[18.57711,51.391344],[18.577749,51.39147],[18.578336,51.391581],[18.579031,51.391708],[18.57972,51.391827],[18.582813,51.392362],[18.583885,51.392538],[18.586288,51.392966],[18.588744,51.393392],[18.591151,51.393808],[18.593585,51.394231],[18.595429,51.394553],[18.597119,51.394841],[18.597467,51.394901],[18.6,51.395342],[18.601397,51.395589],[18.603609,51.395968],[18.605974,51.396377],[18.606609,51.396487],[18.607265,51.396608],[18.607838,51.39672],[18.609289,51.39703],[18.610834,51.397374],[18.611249,51.397468],[18.611709,51.397579],[18.612197,51.397706],[18.612687,51.397841],[18.613653,51.398117],[18.614366,51.398321],[18.615266,51.398592],[18.616062,51.398841],[18.61686,51.399099],[18.617584,51.399342],[18.618581,51.399696],[18.619528,51.400045],[18.620923,51.40059],[18.621732,51.400928],[18.622208,51.401128],[18.622828,51.401395],[18.623345,51.401624],[18.624253,51.402035],[18.62509,51.402436],[18.625723,51.402754],[18.626594,51.403211],[18.627356,51.403626],[18.628006,51.403989],[18.62867,51.40437],[18.629178,51.404671],[18.629775,51.405034],[18.630083,51.405226],[18.6304,51.405428],[18.630744,51.405651],[18.631108,51.405893],[18.631472,51.406135],[18.631923,51.406446],[18.632591,51.406922],[18.632863,51.407118],[18.63314,51.407323],[18.633616,51.407682],[18.633899,51.407897],[18.634239,51.408165],[18.634503,51.408375],[18.634914,51.40871],[18.63528,51.409016],[18.636059,51.409694],[18.636295,51.409909],[18.636578,51.410167],[18.63681,51.410379],[18.637124,51.41068],[18.637529,51.411075],[18.637901,51.411448],[18.638274,51.411836],[18.638634,51.412224],[18.638945,51.412563],[18.639425,51.41311],[18.63991,51.413681],[18.640212,51.414056],[18.640515,51.414442],[18.64081,51.414826],[18.641085,51.415202],[18.641367,51.415596],[18.64172,51.416111],[18.641933,51.416435],[18.642171,51.416805],[18.642351,51.41709],[18.642532,51.417394],[18.642775,51.417804],[18.64294,51.418094],[18.643127,51.418444],[18.643446,51.41906],[18.643793,51.41976],[18.64401,51.420247],[18.644211,51.420709],[18.644403,51.421179],[18.644585,51.421669],[18.644784,51.422246],[18.645067,51.423113],[18.645215,51.423642],[18.64534,51.424114],[18.645456,51.424602],[18.645577,51.42518],[18.645656,51.425595],[18.645733,51.426031],[18.645818,51.42665],[18.645891,51.427269],[18.645968,51.42797],[18.645975,51.428657],[18.645989,51.42975],[18.645992,51.431154],[18.645996,51.434994],[18.646002,51.4377],[18.646003,51.438112],[18.646004,51.438426],[18.646009,51.439645],[18.646008,51.4415],[18.64601,51.443249],[18.646018,51.443734],[18.64603,51.44407],[18.646049,51.44448],[18.646081,51.44494],[18.646119,51.445385],[18.646171,51.445823],[18.646208,51.446143],[18.646259,51.44651],[18.64634,51.446974],[18.646441,51.447539],[18.646514,51.447888],[18.646591,51.448244],[18.646669,51.448556],[18.646735,51.448826],[18.646853,51.449263],[18.646951,51.449611],[18.647088,51.450066],[18.647252,51.450571],[18.647394,51.450974],[18.647554,51.451408],[18.647759,51.451933],[18.647907,51.45229],[18.648032,51.452583],[18.64822,51.453009],[18.648385,51.453362],[18.648546,51.453696],[18.648754,51.454109],[18.648945,51.454471],[18.649208,51.454968],[18.649352,51.455233],[18.649601,51.455656],[18.649777,51.455944],[18.649952,51.45622],[18.650378,51.456869],[18.650594,51.457193],[18.650833,51.457531],[18.650983,51.457746],[18.651149,51.457976],[18.651666,51.458672],[18.652119,51.459245],[18.652425,51.459624],[18.652907,51.460191],[18.65318,51.460501],[18.653435,51.460788],[18.653816,51.461199],[18.654261,51.461671],[18.65466,51.46208],[18.65522,51.462624],[18.655667,51.463053],[18.656289,51.46363],[18.656696,51.463992],[18.658358,51.46541],[18.658601,51.465617],[18.659174,51.466112],[18.661275,51.467912],[18.662373,51.468864],[18.662957,51.469385],[18.663354,51.469744],[18.663776,51.470141],[18.66431,51.470642],[18.664702,51.471023],[18.665234,51.471548],[18.665693,51.472011],[18.666135,51.472459],[18.666568,51.472914],[18.666975,51.473343],[18.667549,51.473964],[18.668562,51.475126],[18.676862,51.4849],[18.677103,51.485185],[18.677919,51.486145],[18.678298,51.486595],[18.678599,51.486952],[18.678922,51.487308],[18.679159,51.487589],[18.679508,51.488022],[18.679846,51.488428],[18.680854,51.48961],[18.681386,51.490236],[18.682002,51.490958],[18.682412,51.491449],[18.682783,51.491905],[18.683123,51.492316],[18.683463,51.492746],[18.683802,51.493178],[18.684338,51.49388],[18.684803,51.494507],[18.685168,51.495014],[18.685435,51.495389],[18.685906,51.496062],[18.686134,51.496405],[18.686398,51.496798],[18.686835,51.497474],[18.687208,51.498063],[18.687426,51.498414],[18.68773,51.498918],[18.688123,51.499589],[18.688482,51.500215],[18.688804,51.500787],[18.688962,51.501088],[18.689179,51.501495],[18.689435,51.501981],[18.689948,51.503008],[18.690131,51.503387],[18.690352,51.503859],[18.6906,51.5044],[18.690852,51.504984],[18.690987,51.505282],[18.691112,51.50559],[18.691374,51.506235],[18.691565,51.506726],[18.691877,51.507555],[18.692009,51.507919],[18.692275,51.508684],[18.692527,51.509456],[18.692688,51.509977],[18.692866,51.510581],[18.693035,51.511186],[18.693228,51.5119],[18.69336,51.512419],[18.693572,51.513338],[18.693658,51.513739],[18.693755,51.514208],[18.693835,51.514624],[18.694025,51.515686],[18.694145,51.516487],[18.69429,51.517541],[18.6947,51.520618],[18.694994,51.522778],[18.695046,51.523191],[18.69524,51.52462],[18.695341,51.525364],[18.695704,51.528089],[18.695955,51.5299],[18.696142,51.531344],[18.696242,51.532112],[18.696311,51.532622],[18.696524,51.534185],[18.696611,51.53483],[18.696672,51.535212],[18.696748,51.535621],[18.696839,51.536055],[18.696938,51.536486],[18.69704,51.536884],[18.697179,51.537382],[18.697344,51.537917],[18.697489,51.538348],[18.697698,51.53891],[18.697926,51.539471],[18.698097,51.539865],[18.698293,51.540291],[18.698507,51.540733],[18.698696,51.541097],[18.69903,51.541708],[18.699444,51.542424],[18.6998,51.542983],[18.700308,51.543739],[18.700733,51.544322],[18.701277,51.545028],[18.701788,51.545644],[18.702302,51.546232],[18.702927,51.546906],[18.703529,51.54751],[18.703792,51.547769],[18.704078,51.548039],[18.704663,51.548572],[18.705335,51.54916],[18.706062,51.54976],[18.706423,51.550043],[18.706799,51.550333],[18.707499,51.550856],[18.708252,51.551391],[18.709066,51.551934],[18.70986,51.552443],[18.71067,51.552936],[18.711378,51.553352],[18.712156,51.553779],[18.712985,51.55422],[18.713782,51.554623],[18.714512,51.554978],[18.715273,51.55533],[18.715833,51.555584],[18.716328,51.555796],[18.717102,51.556121],[18.717981,51.556474],[18.718925,51.556834],[18.719914,51.557189],[18.720711,51.557464],[18.721597,51.557745],[18.722431,51.558001],[18.72324,51.55824],[18.723781,51.558396],[18.724472,51.558582],[18.724945,51.558706],[18.725579,51.558865],[18.726005,51.558968],[18.726461,51.559074],[18.72693,51.559182],[18.727381,51.559283],[18.727779,51.559368],[18.728169,51.559449],[18.728799,51.559575],[18.729578,51.559719],[18.730362,51.559858],[18.731034,51.559967],[18.731551,51.56005],[18.732109,51.56013],[18.73272,51.560215],[18.733259,51.560284],[18.733978,51.560374],[18.734542,51.560435],[18.735148,51.5605],[18.735771,51.560558],[18.736965,51.560658],[18.738389,51.56076],[18.743795,51.56115],[18.749942,51.561588],[18.750994,51.561664],[18.751738,51.561726],[18.752398,51.561785],[18.753018,51.561844],[18.753713,51.561919],[18.754376,51.561988],[18.755102,51.562073],[18.75579,51.562158],[18.756517,51.562253],[18.757165,51.562341],[18.757789,51.56243],[18.758313,51.56251],[18.758914,51.562602],[18.75993,51.562769],[18.760491,51.562868],[18.760975,51.562953],[18.761786,51.563107],[18.762489,51.563243],[18.763204,51.563386],[18.764068,51.563569],[18.7652,51.563821],[18.7656,51.563914],[18.766445,51.564115],[18.767078,51.56427],[18.767908,51.564482],[18.768452,51.564625],[18.768889,51.564742],[18.769504,51.564913],[18.770123,51.565089],[18.770644,51.565238],[18.771287,51.565429],[18.771832,51.565597],[18.772384,51.565773],[18.772936,51.565949],[18.773513,51.566139],[18.774008,51.566305],[18.774505,51.566479],[18.775032,51.566661],[18.775519,51.566837],[18.776638,51.567251],[18.777495,51.567583],[18.778008,51.567785],[18.778555,51.568007],[18.779441,51.568376],[18.779883,51.568566],[18.780427,51.568803],[18.780971,51.569045],[18.781871,51.569457],[18.782722,51.569861],[18.783504,51.570247],[18.78441,51.570704],[18.785214,51.571127],[18.785987,51.57154],[18.786629,51.571899],[18.787461,51.572375],[18.788467,51.572978],[18.788988,51.573301],[18.789518,51.573632],[18.790442,51.574234],[18.790833,51.574501],[18.791642,51.575072],[18.792472,51.575667],[18.793347,51.576328],[18.794029,51.576864],[18.794896,51.577565],[18.799019,51.581003],[18.801741,51.583278],[18.802614,51.583963],[18.803532,51.584658],[18.803989,51.58498],[18.804471,51.585315],[18.805313,51.585876],[18.805747,51.586149],[18.806182,51.586415],[18.806623,51.586674],[18.807105,51.586948],[18.808132,51.587507],[18.809061,51.587986],[18.809992,51.588439],[18.810965,51.58888],[18.811474,51.589101],[18.811937,51.589299],[18.812468,51.589516],[18.812965,51.589716],[18.813485,51.589918],[18.813989,51.590107],[18.814836,51.590415],[18.815532,51.590654],[18.816263,51.590895],[18.81677,51.591055],[18.817276,51.59121],[18.817717,51.591341],[18.819287,51.591776],[18.819935,51.591942],[18.820484,51.592078],[18.820986,51.592196],[18.822028,51.592428],[18.823071,51.592647],[18.824005,51.592822],[18.824818,51.592963],[18.826561,51.593265],[18.827844,51.593484],[18.830042,51.593866],[18.833017,51.59438],[18.834562,51.594649],[18.836193,51.594939],[18.840236,51.595644],[18.840921,51.595761],[18.843959,51.59628],[18.848565,51.597072],[18.850879,51.597461],[18.851446,51.597557],[18.852013,51.597652],[18.852617,51.597747],[18.853051,51.59781],[18.853465,51.597869],[18.853962,51.597933],[18.854496,51.598001],[18.855285,51.598088],[18.855744,51.598137],[18.856215,51.598183],[18.856666,51.598222],[18.857133,51.598259],[18.857652,51.598297],[18.858188,51.598332],[18.858778,51.598364],[18.859241,51.598387],[18.859682,51.598406],[18.860042,51.598419],[18.860447,51.598431],[18.860944,51.598442],[18.861465,51.598449],[18.861999,51.598453],[18.862687,51.598449],[18.86314,51.598444],[18.863679,51.598434],[18.864223,51.598419],[18.864922,51.598392],[18.865462,51.598365],[18.86594,51.59834],[18.86651,51.598303],[18.867209,51.598252],[18.867774,51.598203],[18.868296,51.598156],[18.868843,51.598099],[18.86929,51.598052],[18.869654,51.598008],[18.86993,51.597973],[18.870453,51.597909],[18.870811,51.597859],[18.871302,51.59779],[18.871815,51.597713],[18.872614,51.597584],[18.873547,51.59742],[18.873814,51.597369],[18.874329,51.597266],[18.87469,51.597196],[18.875217,51.597087],[18.875761,51.596966],[18.876456,51.596805],[18.877081,51.596656],[18.878345,51.596325],[18.879122,51.596105],[18.880373,51.595724],[18.881136,51.595477],[18.881875,51.595222],[18.882293,51.595065],[18.883059,51.594786],[18.884012,51.594413],[18.884873,51.594054],[18.885586,51.593743],[18.886537,51.593305],[18.887499,51.592843],[18.888397,51.592373],[18.889265,51.591893],[18.890168,51.591362],[18.89101,51.590835],[18.892041,51.590151],[18.897796,51.586233],[18.898646,51.585661],[18.899516,51.585104],[18.900696,51.584392],[18.901911,51.583698],[18.902801,51.583223],[18.903703,51.582761],[18.904516,51.582366],[18.905346,51.581975],[18.906164,51.58161],[18.906723,51.581368],[18.907476,51.581051],[18.908206,51.580754],[18.908918,51.580478],[18.909699,51.580187],[18.910367,51.579947],[18.911036,51.579714],[18.911509,51.579555],[18.912177,51.579335],[18.912652,51.579184],[18.913194,51.579019],[18.913762,51.578846],[18.91437,51.578671],[18.915149,51.578459],[18.915785,51.578285],[18.916305,51.57815],[18.916859,51.578015],[18.917607,51.577836],[18.918238,51.577692],[18.918974,51.57753],[18.919821,51.577352],[18.920432,51.577231],[18.921275,51.577073],[18.921996,51.576947],[18.92258,51.576849],[18.923492,51.57671],[18.924305,51.576593],[18.925086,51.576487],[18.925864,51.576392],[18.926707,51.576296],[18.927228,51.576241],[18.927668,51.576198],[18.928299,51.576138],[18.929459,51.576038],[18.929928,51.575997],[18.933036,51.57573],[18.936976,51.575385],[18.940556,51.575075],[18.941584,51.574984],[18.942384,51.574908],[18.942992,51.574846],[18.943571,51.574783],[18.944101,51.574718],[18.944692,51.574644],[18.945669,51.574515],[18.946219,51.574438],[18.946833,51.57435],[18.947723,51.574213],[18.948568,51.574073],[18.949358,51.573928],[18.950828,51.573642],[18.951498,51.573496],[18.952435,51.573288],[18.956549,51.572344],[18.959442,51.571674],[18.962315,51.571017],[18.962963,51.570867],[18.967932,51.569703],[18.96968,51.569301],[18.972384,51.568679],[18.974153,51.568274],[18.974735,51.568139],[18.978164,51.567341],[18.980267,51.56685],[18.981783,51.566477],[18.983379,51.566075],[18.983986,51.565919],[18.986245,51.565321],[18.98863,51.564658],[18.991019,51.563998],[18.997216,51.562273],[19.00058,51.561344],[19.001285,51.56115],[19.002011,51.560955],[19.002776,51.560767],[19.003432,51.560608],[19.00416,51.560442],[19.004733,51.560319],[19.005506,51.560164],[19.006245,51.56003],[19.007039,51.559893],[19.007704,51.559785],[19.008376,51.559688],[19.009005,51.559601],[19.009484,51.559539],[19.010149,51.55946],[19.010662,51.559404],[19.011214,51.559347],[19.011869,51.559285],[19.012523,51.559233],[19.013213,51.559186],[19.013878,51.559146],[19.014586,51.55911],[19.015185,51.559084],[19.015925,51.559061],[19.016848,51.559042],[19.017342,51.55904],[19.017769,51.559032],[19.01845,51.559044],[19.019172,51.559056],[19.019892,51.559081],[19.020296,51.559097],[19.020737,51.559118],[19.021239,51.559142],[19.021757,51.559175],[19.022025,51.559189],[19.022314,51.55921],[19.022896,51.559259],[19.023644,51.559326],[19.024368,51.559406],[19.024896,51.559465],[19.025837,51.559575],[19.026109,51.559609],[19.026624,51.559669],[19.027306,51.559742],[19.028077,51.559814],[19.028718,51.559872],[19.029338,51.559926],[19.030027,51.559977],[19.030533,51.560013],[19.031431,51.560073],[19.032291,51.560116],[19.032959,51.56014],[19.033652,51.560162],[19.034702,51.560184],[19.035004,51.560187],[19.035616,51.560193],[19.036753,51.560191],[19.037134,51.560183],[19.037588,51.560174],[19.038466,51.560157],[19.039279,51.560127],[19.040094,51.560092],[19.040782,51.560056],[19.041721,51.559998],[19.042455,51.559943],[19.043179,51.559883],[19.043868,51.559821],[19.044539,51.559752],[19.045223,51.55968],[19.045941,51.559597],[19.046681,51.559506],[19.047465,51.559402],[19.048353,51.559273],[19.049244,51.559136],[19.049913,51.559026],[19.050576,51.558911],[19.051262,51.558785],[19.052291,51.558589],[19.053344,51.558381],[19.056734,51.557726],[19.061192,51.556851],[19.067402,51.555646],[19.070513,51.555038],[19.071968,51.554756],[19.072702,51.55462],[19.073696,51.554449],[19.074617,51.554298],[19.075239,51.554194],[19.075919,51.554098],[19.076543,51.55401],[19.077208,51.553922],[19.078031,51.553823],[19.07868,51.553748],[19.079265,51.553683],[19.080064,51.553602],[19.080939,51.55352],[19.08176,51.553456],[19.082327,51.553414],[19.083416,51.553343],[19.084273,51.553295],[19.085194,51.553256],[19.086495,51.553209],[19.087364,51.553191],[19.088356,51.553175],[19.089135,51.553174],[19.089807,51.553177],[19.090609,51.553188],[19.091498,51.553212],[19.092647,51.553256],[19.093456,51.553286],[19.094062,51.553317],[19.095214,51.553388],[19.096209,51.553462],[19.096862,51.55352],[19.097991,51.553623],[19.098546,51.553678],[19.099409,51.553773],[19.100178,51.553862],[19.100953,51.553963],[19.10174,51.554067],[19.102549,51.554183],[19.103418,51.554319],[19.104096,51.55443],[19.104716,51.554536],[19.106045,51.554779],[19.107082,51.554991],[19.107698,51.555116],[19.108526,51.555299],[19.108967,51.5554],[19.109466,51.555517],[19.110335,51.55573],[19.11093,51.555878],[19.111567,51.556044],[19.112594,51.556327],[19.114064,51.556759],[19.117033,51.557653],[19.118967,51.558226],[19.119466,51.558377],[19.120021,51.558534],[19.12138,51.558913],[19.122754,51.559271],[19.123556,51.559476],[19.12435,51.559674],[19.125157,51.559869],[19.125793,51.560022],[19.126412,51.560162],[19.127019,51.560303],[19.127593,51.560428],[19.128351,51.560587],[19.129215,51.560766],[19.130134,51.560947],[19.132716,51.561443],[19.137844,51.562427],[19.1478,51.56433],[19.152391,51.56521],[19.15468,51.565646],[19.155446,51.565795],[19.156171,51.565946],[19.156938,51.566114],[19.157827,51.566312],[19.158682,51.566514],[19.159511,51.566721],[19.160191,51.566897],[19.160351,51.566938],[19.16129,51.567194],[19.161968,51.567387],[19.162828,51.567637],[19.16363,51.567886],[19.164274,51.568089],[19.166068,51.568694],[19.166744,51.568932],[19.167516,51.569197],[19.168183,51.569453],[19.168787,51.569693],[19.169339,51.569917],[19.169931,51.570162],[19.17059,51.570447],[19.171247,51.570735],[19.171976,51.571065],[19.17232,51.571224],[19.172697,51.5714],[19.173622,51.571851],[19.174299,51.57219],[19.175036,51.572571],[19.176423,51.573293],[19.178144,51.5742],[19.179334,51.57481],[19.181075,51.575716],[19.18478,51.57765],[19.192618,51.58173],[19.195169,51.583062],[19.196487,51.58374],[19.197126,51.584062],[19.19777,51.584381],[19.198929,51.584939],[19.200103,51.58548],[19.200679,51.585739],[19.201276,51.586004],[19.201902,51.586277],[19.202496,51.58653],[19.203109,51.586786],[19.203811,51.587076],[19.204513,51.58736],[19.205251,51.587649],[19.205879,51.587892],[19.206509,51.58813],[19.206731,51.588214],[19.207525,51.588509],[19.208304,51.58879],[19.209107,51.589066],[19.209842,51.589318],[19.211665,51.589918],[19.212203,51.590087],[19.213003,51.590333],[19.213815,51.590579],[19.214621,51.590814],[19.215417,51.591043],[19.21622,51.591267],[19.216887,51.591447],[19.217543,51.591621],[19.218219,51.591796],[19.218852,51.591959],[19.22014,51.592272],[19.220757,51.592419],[19.221622,51.592617],[19.22224,51.592756],[19.223161,51.592955],[19.22378,51.593084],[19.224438,51.593213],[19.225029,51.593325],[19.225598,51.593431],[19.226192,51.593532],[19.226816,51.593637],[19.227445,51.593735],[19.228106,51.593835],[19.228536,51.593898],[19.229312,51.594003],[19.230105,51.5941],[19.231326,51.594244],[19.232986,51.594445],[19.233817,51.594545],[19.234646,51.594644],[19.236475,51.594864],[19.238303,51.595083],[19.240903,51.595395],[19.243545,51.595708],[19.244178,51.595783],[19.246887,51.596111],[19.248251,51.596272],[19.249612,51.596436],[19.251317,51.59664],[19.252315,51.596758],[19.253859,51.596937],[19.254245,51.596988],[19.254702,51.597044],[19.255373,51.597123],[19.256745,51.597286],[19.259365,51.5976],[19.260292,51.59771],[19.261219,51.59782],[19.262329,51.597953],[19.263331,51.59807],[19.264343,51.598193],[19.266845,51.598487],[19.268676,51.59871],[19.270176,51.59888],[19.272771,51.5992],[19.273343,51.599268],[19.273923,51.599337],[19.274651,51.599425],[19.275375,51.599512],[19.276228,51.599626],[19.276872,51.59972],[19.277597,51.599833],[19.278191,51.599926],[19.278881,51.600044],[19.279465,51.60015],[19.280174,51.600282],[19.280941,51.600435],[19.281726,51.6006],[19.282313,51.600728],[19.282967,51.60088],[19.283658,51.601043],[19.284396,51.601227],[19.285066,51.601401],[19.28561,51.601551],[19.286159,51.601704],[19.286626,51.601838],[19.287016,51.601952],[19.287371,51.602059],[19.288096,51.602282],[19.288459,51.602398],[19.288826,51.602518],[19.289472,51.602737],[19.290168,51.602975],[19.291665,51.603497],[19.292394,51.603749],[19.292891,51.603913],[19.293371,51.604067],[19.294033,51.604273],[19.294485,51.604409],[19.294928,51.604538],[19.295554,51.604716],[19.296335,51.604928],[19.296955,51.605089],[19.297604,51.605249],[19.298103,51.605367],[19.298568,51.605473],[19.299009,51.605571],[19.299365,51.605649],[19.299981,51.605777],[19.30047,51.605875],[19.300982,51.605974],[19.301459,51.606061],[19.301936,51.606146],[19.302492,51.60624],[19.302924,51.60631],[19.303451,51.606391],[19.304,51.606472],[19.304615,51.606557],[19.305122,51.606622],[19.305654,51.606689],[19.306223,51.606754],[19.306693,51.606804],[19.307153,51.606852],[19.307849,51.606915],[19.308437,51.606965],[19.308923,51.607001],[19.309553,51.607045],[19.310869,51.60712],[19.312314,51.607201],[19.318919,51.607561],[19.321098,51.607682],[19.321777,51.607717],[19.327947,51.608053],[19.333569,51.60836],[19.339396,51.608677],[19.339464,51.608681],[19.341157,51.608796],[19.34182,51.608847],[19.342481,51.608906],[19.343321,51.608982],[19.343893,51.609038],[19.344123,51.609061],[19.344904,51.609142],[19.345457,51.609205],[19.34622,51.609294],[19.346956,51.609381],[19.34772,51.609483],[19.348445,51.609584],[19.349144,51.609682],[19.349881,51.609796],[19.350605,51.609909],[19.351286,51.610024],[19.352025,51.610149],[19.352709,51.610273],[19.353502,51.610422],[19.354599,51.610628],[19.355647,51.610841],[19.356393,51.611004],[19.357157,51.611174],[19.357882,51.61134],[19.358521,51.611491],[19.359303,51.611685],[19.36011,51.611887],[19.360844,51.612077],[19.361595,51.612282],[19.361972,51.612384],[19.362583,51.612555],[19.363167,51.612723],[19.364403,51.613095],[19.365632,51.61348],[19.36617,51.613653],[19.367083,51.613969],[19.36813,51.614324],[19.369295,51.61474],[19.370449,51.615175],[19.371275,51.61549],[19.371893,51.615744],[19.372309,51.615916],[19.374111,51.616676],[19.374837,51.616996],[19.375565,51.617326],[19.3762,51.617623],[19.377014,51.618009],[19.37705,51.618026],[19.377658,51.618331],[19.378402,51.618705],[19.379062,51.619045],[19.379737,51.619402],[19.380363,51.619743],[19.381983,51.62064],[19.3828,51.621077],[19.3835,51.621441],[19.384149,51.621766],[19.384854,51.622104],[19.385562,51.622439],[19.386342,51.622793],[19.386813,51.622999],[19.387326,51.623221],[19.388036,51.623518],[19.388604,51.623751],[19.389142,51.623963],[19.38995,51.624275],[19.390756,51.624574],[19.391289,51.624765],[19.391855,51.624965],[19.39257,51.62521],[19.392995,51.625352],[19.393562,51.62554],[19.394303,51.625777],[19.395065,51.626018],[19.396793,51.626569],[19.398384,51.62707],[19.399958,51.627568],[19.400437,51.627721],[19.401086,51.627925],[19.401701,51.628111],[19.402185,51.628251],[19.402779,51.628417],[19.403372,51.628577],[19.403884,51.62871],[19.404363,51.628829],[19.405015,51.628985],[19.405677,51.629137],[19.406338,51.629281],[19.406966,51.629408],[19.407644,51.629539],[19.408339,51.629669],[19.4089,51.629766],[19.409457,51.629858],[19.409976,51.629937],[19.410489,51.630014],[19.411191,51.630114],[19.415951,51.6308],[19.416224,51.630841],[19.417293,51.630994],[19.418368,51.631149],[19.420508,51.631459],[19.421732,51.631636],[19.424188,51.631989],[19.425386,51.632159],[19.426574,51.632334],[19.429274,51.632721],[19.429717,51.632783],[19.430219,51.632851],[19.430794,51.632921],[19.431181,51.632968],[19.431702,51.633025],[19.432285,51.633084],[19.432956,51.633144],[19.433655,51.6332],[19.434104,51.633232],[19.435117,51.633297],[19.435718,51.633326],[19.43627,51.633349],[19.437105,51.633377],[19.437686,51.633388],[19.438247,51.633397],[19.438808,51.633401],[19.439341,51.633399],[19.439914,51.633394],[19.440613,51.633379],[19.441178,51.633363],[19.441637,51.633346],[19.441956,51.633333],[19.442252,51.633318],[19.442565,51.633302],[19.443013,51.633278],[19.443489,51.633249],[19.444064,51.633208],[19.444763,51.633154],[19.446165,51.633047],[19.4468,51.633003],[19.447494,51.632959],[19.44823,51.63292],[19.448741,51.632895],[19.449256,51.632873],[19.449557,51.63286],[19.449968,51.632843],[19.450552,51.632825],[19.45113,51.632809],[19.451818,51.63279],[19.452541,51.632779],[19.453297,51.632771],[19.454055,51.632766],[19.454787,51.632766],[19.455526,51.632774],[19.456272,51.632784],[19.456898,51.632797],[19.457552,51.632813],[19.458282,51.632837],[19.459164,51.632872],[19.459981,51.632909],[19.461143,51.632973],[19.461954,51.633026],[19.462791,51.633086],[19.463577,51.633144],[19.464368,51.633211],[19.465843,51.63335],[19.466729,51.633443],[19.467627,51.633548],[19.470531,51.633897],[19.474206,51.634348],[19.479713,51.635014],[19.482527,51.635356],[19.484145,51.635552],[19.484802,51.635631],[19.487322,51.635942],[19.489319,51.636186],[19.490806,51.636374],[19.491592,51.63649],[19.492393,51.636615],[19.493257,51.636762],[19.493675,51.636838],[19.494082,51.636915],[19.494407,51.636978],[19.494735,51.637043],[19.495403,51.637181],[19.495909,51.637292],[19.496678,51.637469],[19.497475,51.637662],[19.49825,51.63786],[19.498966,51.638055],[19.499111,51.638099],[19.499823,51.638316],[19.499966,51.63836],[19.501383,51.638795],[19.50279,51.639264],[19.503906,51.639668],[19.50522,51.640146],[19.506535,51.640595],[19.507348,51.640869],[19.508182,51.641137],[19.50865,51.641273],[19.509115,51.641401],[19.509597,51.641532],[19.510082,51.641657],[19.510683,51.64181],[19.511282,51.641953],[19.511312,51.64196],[19.512032,51.642126],[19.512728,51.642279],[19.513691,51.642471],[19.514762,51.642675],[19.515794,51.642853],[19.516569,51.642974],[19.517373,51.643077],[19.51814,51.643175],[19.518898,51.643263],[19.519996,51.643381],[19.52109,51.643477],[19.521758,51.643528],[19.522416,51.643571],[19.523772,51.64364],[19.524301,51.643659],[19.524819,51.643675],[19.525877,51.643691],[19.527392,51.643692],[19.528598,51.643666],[19.529202,51.643648],[19.529783,51.643624],[19.530327,51.643597],[19.530799,51.643568],[19.531322,51.643535],[19.531823,51.643499],[19.532609,51.643435],[19.533371,51.643365],[19.53363,51.643335],[19.533898,51.643295],[19.534406,51.643233],[19.534962,51.643137],[19.535927,51.642962],[19.536406,51.642875],[19.53664,51.642835],[19.538769,51.642595],[19.539109,51.642572],[19.54029,51.642521],[19.540896,51.642496],[19.541194,51.642484],[19.541486,51.642466],[19.541751,51.64244],[19.542031,51.642412],[19.542638,51.642345],[19.543113,51.642294],[19.547796,51.641785],[19.550111,51.64153],[19.551293,51.641401],[19.552293,51.641287],[19.556618,51.640822],[19.558774,51.640587],[19.559767,51.640473],[19.560905,51.640336],[19.562965,51.640113],[19.564244,51.639969],[19.565365,51.639827],[19.565793,51.639739],[19.566162,51.639655],[19.566571,51.639528],[19.566877,51.639419],[19.567172,51.639301],[19.567648,51.639076],[19.567906,51.638921],[19.56808,51.638808],[19.568469,51.638471],[19.568871,51.638141],[19.568975,51.638057],[19.569063,51.638008],[19.569152,51.637957],[19.569248,51.637912],[19.569367,51.637871],[19.569485,51.637836],[19.569611,51.637805],[19.56969,51.637791],[19.569765,51.637779],[19.569873,51.637766],[19.570003,51.637758],[19.570126,51.637755],[19.570228,51.637761],[19.570312,51.637765],[19.570417,51.637779],[19.570524,51.637795],[19.570641,51.63782],[19.570737,51.637848],[19.570824,51.637875],[19.570913,51.637907],[19.57102,51.637956],[19.571102,51.638],[19.571182,51.638048],[19.571244,51.638091],[19.571313,51.638148],[19.571353,51.638183],[19.571396,51.638225],[19.571437,51.638267],[19.571469,51.638312],[19.571501,51.638356],[19.571563,51.638458],[19.571689,51.638704],[19.571889,51.639093],[19.572302,51.639906],[19.572587,51.640468],[19.572862,51.641029],[19.573015,51.641383],[19.573168,51.641746],[19.573322,51.642109],[19.573478,51.642453],[19.573557,51.642606],[19.573716,51.642919],[19.573874,51.643233],[19.574195,51.643853],[19.574311,51.644092],[19.574368,51.644213],[19.574421,51.644336],[19.574489,51.644558],[19.574547,51.644782],[19.574706,51.645245],[19.574896,51.64573],[19.575523,51.646959],[19.576124,51.648133],[19.576454,51.648773],[19.576711,51.649333],[19.576978,51.64986],[19.577532,51.650938],[19.577672,51.651192],[19.578218,51.652287],[19.578747,51.653347],[19.579469,51.654754],[19.580755,51.657278],[19.58361,51.662848],[19.58646,51.668439],[19.589213,51.673811],[19.590407,51.676133],[19.591471,51.678207],[19.591868,51.679],[19.592661,51.680525],[19.593074,51.681356],[19.594254,51.683659],[19.597137,51.689281],[19.600006,51.69488],[19.601428,51.697658],[19.602119,51.699002],[19.602806,51.700345],[19.603098,51.700917],[19.604818,51.704273],[19.605268,51.705167],[19.605719,51.70606],[19.606041,51.706745],[19.606186,51.70706],[19.606327,51.707378],[19.606486,51.70774],[19.606631,51.708088],[19.606732,51.708343],[19.606849,51.708634],[19.60694,51.708879],[19.607052,51.709186],[19.607113,51.709369],[19.607223,51.70969],[19.607327,51.710014],[19.607446,51.710403],[19.607558,51.710794],[19.607698,51.711307],[19.607826,51.711834],[19.607942,51.712366],[19.608035,51.712843],[19.608118,51.713321],[19.608184,51.713759],[19.608244,51.7142],[19.6083,51.714691],[19.608344,51.715185],[19.608379,51.715707],[19.608402,51.716231],[19.608411,51.71662],[19.608415,51.71701],[19.608407,51.717537],[19.608388,51.718067],[19.608349,51.718668],[19.608297,51.719273],[19.60822,51.719914],[19.608138,51.720475],[19.608047,51.721004],[19.607944,51.721533],[19.607874,51.721881],[19.607794,51.722228],[19.607718,51.722525],[19.607638,51.722836],[19.607535,51.723211],[19.60734,51.723848],[19.607177,51.724372],[19.606928,51.725067],[19.606614,51.725893],[19.606569,51.725999],[19.606459,51.726273],[19.606445,51.726303],[19.605882,51.727644],[19.605304,51.728982],[19.604666,51.730433],[19.603407,51.733326],[19.603367,51.733415],[19.601876,51.736828],[19.601864,51.736858],[19.601718,51.737203],[19.601687,51.737272],[19.601138,51.738523],[19.600576,51.739809],[19.600293,51.740454],[19.600011,51.741104],[19.599975,51.741187],[19.599872,51.741422],[19.59984,51.741508],[19.599217,51.742936],[19.599156,51.743081],[19.598835,51.743804],[19.598341,51.744935],[19.597854,51.746066],[19.597811,51.746166],[19.597617,51.74661],[19.597353,51.747242],[19.597077,51.747927],[19.596822,51.748601],[19.596587,51.749275],[19.596552,51.749375],[19.59643,51.749763],[19.596305,51.750158],[19.596098,51.750922],[19.595921,51.751687],[19.595834,51.75209],[19.595759,51.752483],[19.595633,51.753222],[19.595571,51.7536],[19.59553,51.753995],[19.595453,51.754758],[19.595432,51.754966],[19.595402,51.755371],[19.59537,51.75616],[19.595368,51.756716],[19.595382,51.75741],[19.595399,51.757817],[19.595427,51.758244],[19.59546,51.758628],[19.595496,51.758996],[19.595542,51.759382],[19.595591,51.759758],[19.595671,51.760275],[19.595765,51.760798],[19.595833,51.761145],[19.595907,51.761497],[19.595977,51.761804],[19.596055,51.762109],[19.596137,51.762432],[19.596226,51.762765],[19.596317,51.763075],[19.596411,51.763389],[19.596457,51.763528],[19.596544,51.7638],[19.596633,51.764065],[19.596702,51.764265],[19.596766,51.764441],[19.596887,51.764766],[19.596953,51.764938],[19.597019,51.765109],[19.597155,51.765446],[19.597258,51.7657],[19.597367,51.765947],[19.597507,51.766269],[19.597664,51.766606],[19.597836,51.766967],[19.598007,51.767315],[19.598221,51.767729],[19.598442,51.768141],[19.598863,51.768885],[19.599178,51.769408],[19.599504,51.769923],[19.599893,51.770512],[19.600214,51.770978],[19.600504,51.77137],[19.600846,51.771838],[19.601183,51.772279],[19.601925,51.773192],[19.602203,51.773522],[19.602341,51.773676],[19.602611,51.773976],[19.603194,51.774618],[19.60354,51.774983],[19.604135,51.775591],[19.605131,51.776556],[19.605997,51.777366],[19.607244,51.778513],[19.607867,51.779089],[19.608427,51.7796],[19.608495,51.779662],[19.609402,51.780519],[19.610288,51.781384],[19.610579,51.781681],[19.610873,51.781983],[19.611355,51.782495],[19.611828,51.783016],[19.612279,51.783534],[19.612718,51.784055],[19.61311,51.784542],[19.613492,51.785034],[19.613885,51.785563],[19.614268,51.786098],[19.614794,51.786882],[19.615021,51.78723],[19.61543,51.787896],[19.615625,51.788226],[19.615815,51.788561],[19.616123,51.789125],[19.616424,51.789694],[19.616839,51.790524],[19.617244,51.79136],[19.61771,51.792355],[19.618649,51.794335],[19.619209,51.79544],[19.619565,51.796103],[19.619944,51.796763],[19.620092,51.797012],[19.620327,51.797401],[19.6209,51.798274],[19.621258,51.798792],[19.621826,51.799572],[19.622367,51.800274],[19.62293,51.80097],[19.623439,51.80156],[19.623828,51.801992],[19.624237,51.802432],[19.624905,51.803131],[19.625596,51.803813],[19.626318,51.80449],[19.6271,51.805192],[19.628041,51.805991],[19.62902,51.806788],[19.630586,51.808018],[19.63215,51.809231],[19.638765,51.81436],[19.640294,51.815553],[19.641874,51.816756],[19.643943,51.818506],[19.645588,51.819962],[19.646575,51.820873],[19.647603,51.821911],[19.64857,51.822943],[19.649753,51.824249],[19.650759,51.825443],[19.651426,51.826287],[19.65204,51.827119],[19.653219,51.828651],[19.653626,51.829269],[19.654421,51.830522],[19.654919,51.831345],[19.655874,51.833062],[19.656293,51.83386],[19.657107,51.835557],[19.657857,51.837358],[19.657858,51.83736],[19.658397,51.838895],[19.658758,51.840019],[19.65919,51.841602],[19.65947,51.842814],[19.659655,51.843746],[19.660007,51.845911],[19.660041,51.846209],[19.660057,51.846341],[19.660088,51.846716],[19.66011,51.846974],[19.660196,51.848244],[19.660231,51.849501],[19.660218,51.850986],[19.660182,51.851797],[19.660114,51.852742],[19.659946,51.854295],[19.659832,51.855115],[19.659707,51.855868],[19.659014,51.859134],[19.658356,51.861212],[19.657283,51.86393],[19.656061,51.866464],[19.655499,51.867485],[19.655068,51.868259],[19.654319,51.869493],[19.653482,51.870802],[19.651931,51.872987],[19.649841,51.875493],[19.64841,51.877089],[19.647797,51.877761],[19.647188,51.878429],[19.645928,51.879811],[19.645044,51.880788],[19.644557,51.881319],[19.643029,51.883],[19.642597,51.883476],[19.642312,51.883786],[19.642086,51.884103],[19.641861,51.884405],[19.641712,51.884579],[19.641556,51.884756],[19.641416,51.884926],[19.641288,51.885092],[19.641134,51.885284],[19.640905,51.885574],[19.639951,51.886644],[19.639502,51.887137],[19.639121,51.887735],[19.638973,51.887975],[19.638906,51.888116],[19.638848,51.888263],[19.638801,51.88844],[19.638779,51.888632],[19.638774,51.888803],[19.638788,51.888973],[19.638809,51.889095],[19.638842,51.889225],[19.638877,51.88935],[19.638935,51.889484],[19.639006,51.889618],[19.639086,51.889758],[19.639191,51.889899],[19.63931,51.890044],[19.639431,51.890174],[19.639584,51.890317],[19.639777,51.890472],[19.639993,51.890621],[19.640201,51.890745],[19.640429,51.890867],[19.64079,51.891023],[19.641195,51.891166],[19.641447,51.891243],[19.641769,51.891328],[19.642239,51.891444],[19.642743,51.891566],[19.644104,51.89189],[19.644637,51.89201],[19.644703,51.892023],[19.64516,51.892115],[19.645833,51.892243],[19.64654,51.892366],[19.646982,51.892437],[19.648395,51.892665],[19.649558,51.892875],[19.650877,51.89307],[19.651721,51.89321],[19.65233,51.893311],[19.652719,51.89338],[19.654112,51.893632],[19.654738,51.893751],[19.655434,51.893883],[19.657094,51.894194],[19.658773,51.894501],[19.6594,51.894616],[19.661332,51.894973],[19.662455,51.895166],[19.663573,51.89535],[19.66474,51.895531],[19.665512,51.895645],[19.666422,51.895766],[19.667342,51.895881],[19.668457,51.896008],[19.669574,51.896123],[19.67189,51.896307],[19.674344,51.896449],[19.676109,51.896523],[19.678299,51.896594],[19.679663,51.896635],[19.681448,51.896686],[19.684153,51.896771],[19.686954,51.896877],[19.687144,51.896885],[19.689428,51.896993],[19.689487,51.896996],[19.691888,51.897135],[19.694331,51.897313],[19.695469,51.897409],[19.696604,51.897515],[19.698784,51.897733],[19.700386,51.897916],[19.701985,51.898109],[19.703743,51.898345],[19.7052,51.898556],[19.706633,51.898777],[19.709133,51.899188],[19.710178,51.899382],[19.711332,51.899589],[19.714125,51.900158],[19.716156,51.900601],[19.716255,51.900624],[19.718306,51.901104],[19.71998,51.901515],[19.721823,51.902],[19.723608,51.90249],[19.725308,51.902982],[19.727348,51.903606],[19.729228,51.904207],[19.729789,51.904392],[19.730031,51.904474],[19.730857,51.904758],[19.732049,51.905174],[19.733361,51.905647],[19.734583,51.906107],[19.735397,51.906414],[19.735833,51.906589],[19.737024,51.907059],[19.738233,51.907553],[19.739415,51.908058],[19.74061,51.908573],[19.741929,51.909157],[19.742997,51.909645],[19.744172,51.910185],[19.745488,51.910799],[19.746704,51.911362],[19.74804,51.911991],[19.749822,51.912838],[19.751174,51.913483],[19.752584,51.914137],[19.753993,51.914799],[19.755432,51.915465],[19.756811,51.916092],[19.758374,51.916796],[19.759942,51.917487],[19.761655,51.918216],[19.762803,51.918685],[19.763875,51.919126],[19.764256,51.91927],[19.76544,51.919739],[19.766631,51.920196],[19.767648,51.920573],[19.768959,51.921056],[19.770459,51.921596],[19.771626,51.922002],[19.772864,51.922412],[19.77432,51.922902],[19.776044,51.923452],[19.777574,51.923942],[19.778333,51.924182],[19.779078,51.924415],[19.780909,51.924982],[19.78342,51.925755],[19.785856,51.926516],[19.788215,51.927259],[19.78977,51.927768],[19.791676,51.928403],[19.793438,51.929028],[19.795513,51.929802],[19.796208,51.930069],[19.796484,51.930177],[19.797477,51.930572],[19.799212,51.931278],[19.800555,51.931842],[19.801446,51.932217],[19.802327,51.932594],[19.80391,51.933272],[19.806507,51.934399],[19.808588,51.935292],[19.811121,51.936387],[19.813409,51.937377],[19.815436,51.938247],[19.816106,51.938538],[19.816354,51.938645],[19.819347,51.939935],[19.822169,51.941152],[19.825995,51.942805],[19.828514,51.943925],[19.830354,51.9448],[19.831642,51.945469],[19.832796,51.946096],[19.833582,51.946552],[19.83452,51.94709],[19.835171,51.94748],[19.835971,51.948],[19.836815,51.948562],[19.837837,51.949278],[19.83871,51.94992],[19.839401,51.950443],[19.839578,51.950585],[19.84026,51.951123],[19.840932,51.951682],[19.841571,51.952238],[19.842262,51.952851],[19.842781,51.953348],[19.843423,51.953931],[19.844019,51.954517],[19.84466,51.955127],[19.84539,51.955823],[19.84597,51.956376],[19.846688,51.957049],[19.847257,51.957563],[19.847944,51.95817],[19.848664,51.958764],[19.848763,51.958844],[19.849223,51.959215],[19.84939,51.959349],[19.850186,51.95994],[19.851046,51.960583],[19.852084,51.961301],[19.852977,51.961901],[19.853955,51.962517],[19.854996,51.963154],[19.856075,51.963764],[19.856995,51.964272],[19.858111,51.964863],[19.859707,51.96567],[19.861027,51.966339],[19.862113,51.966877],[19.863322,51.967483],[19.863358,51.967501],[19.864603,51.968131],[19.865388,51.968559],[19.86561,51.968672],[19.867114,51.969476],[19.868207,51.970084],[19.869387,51.970775],[19.870446,51.971396],[19.871375,51.971977],[19.872378,51.972606],[19.873242,51.973179],[19.875815,51.974921],[19.881789,51.97916],[19.884653,51.981155],[19.886082,51.982155],[19.88798,51.983408],[19.889856,51.984549],[19.890965,51.985163],[19.891956,51.985748],[19.893537,51.986577],[19.894142,51.986892],[19.894771,51.98721],[19.895189,51.987416],[19.896865,51.988219],[19.898648,51.989001],[19.899528,51.989375],[19.900467,51.989754],[19.901536,51.990175],[19.902616,51.990585],[19.9036,51.990945],[19.904579,51.991294],[19.906386,51.991895],[19.908205,51.992469],[19.910107,51.993033],[19.912093,51.993602],[19.914215,51.994199],[19.916306,51.994784],[19.917351,51.995074],[19.918011,51.995257],[19.92242,51.996503],[19.926855,51.997742],[19.929326,51.998428],[19.931786,51.999125],[19.936248,52.000388],[19.937986,52.000908],[19.939271,52.001316],[19.941089,52.001914],[19.942448,52.002401],[19.944314,52.003091],[19.945742,52.003658],[19.947039,52.004202],[19.948344,52.004764],[19.950118,52.005577],[19.951576,52.006291],[19.953206,52.007117],[19.954679,52.007913],[19.956032,52.008663],[19.957419,52.009445],[19.958726,52.010191],[19.959205,52.010457],[19.960492,52.011197],[19.961678,52.011857],[19.962823,52.012466],[19.964047,52.013095],[19.965204,52.013661],[19.966226,52.014134],[19.967197,52.01456],[19.968244,52.015007],[19.969481,52.015493],[19.970744,52.015974],[19.972015,52.016434],[19.973752,52.017005],[19.974365,52.017203],[19.97549,52.01755],[19.977567,52.018165],[19.982349,52.019553],[19.984269,52.020116],[19.985892,52.020606],[19.986461,52.020781],[19.986927,52.020929],[19.988291,52.021366],[19.989655,52.021826],[19.991052,52.022316],[19.992566,52.022885],[19.993834,52.023382],[19.994749,52.023753],[19.99592,52.024247],[19.996779,52.024629],[19.997766,52.025074],[19.999029,52.025666],[19.999124,52.025712],[19.999482,52.025885],[20.000199,52.026248],[20.000547,52.026423],[20.001207,52.026757],[20.00242,52.027387],[20.003517,52.027981],[20.004737,52.02863],[20.007086,52.02988],[20.007661,52.030202],[20.008344,52.030556],[20.009427,52.03109],[20.010125,52.031443],[20.011032,52.031853],[20.011753,52.032177],[20.012748,52.032619],[20.013721,52.033028],[20.014667,52.033396],[20.01577,52.033828],[20.016729,52.034178],[20.018286,52.034721],[20.019384,52.035091],[20.020548,52.035487],[20.02242,52.03609],[20.024244,52.036703],[20.025319,52.037084],[20.02585,52.037258],[20.027571,52.037825],[20.029353,52.038423],[20.030899,52.038911],[20.031607,52.039144],[20.032484,52.039421],[20.034443,52.040023],[20.03604,52.040501],[20.037725,52.040985],[20.037755,52.040994],[20.039317,52.04142],[20.040939,52.041856],[20.042601,52.042277],[20.044363,52.04271],[20.04535,52.042944],[20.046357,52.043177],[20.049167,52.043794],[20.051444,52.044258],[20.053058,52.044567],[20.054056,52.044737],[20.054782,52.044864],[20.055924,52.045061],[20.057886,52.045387],[20.059398,52.045627],[20.060752,52.045841],[20.061492,52.045951],[20.063029,52.04616],[20.064939,52.046402],[20.065571,52.046481],[20.065685,52.046496],[20.068435,52.046847],[20.071226,52.047155],[20.073507,52.04739],[20.076568,52.047746],[20.079643,52.04809],[20.083086,52.048474],[20.083816,52.048554],[20.085519,52.048748],[20.08724,52.048943],[20.089995,52.049262],[20.093006,52.049615],[20.094752,52.0498],[20.096485,52.049997],[20.09836,52.050234],[20.099276,52.050348],[20.100105,52.050446],[20.100564,52.050499],[20.101933,52.050684],[20.103525,52.050896],[20.104772,52.051066],[20.105914,52.051227],[20.106982,52.051374],[20.109936,52.051818],[20.112442,52.052187],[20.112472,52.052191],[20.115308,52.052589],[20.117584,52.052965],[20.120067,52.053375],[20.122271,52.053749],[20.12286,52.053849],[20.123606,52.053979],[20.124608,52.054147],[20.125987,52.054389],[20.127371,52.05464],[20.129835,52.055089],[20.132956,52.055686],[20.1343,52.055945],[20.134817,52.056046],[20.138768,52.056844],[20.141819,52.057484],[20.14454,52.058073],[20.146219,52.058443],[20.147905,52.058824],[20.149229,52.059127],[20.150554,52.059431],[20.153079,52.060024],[20.154116,52.060272],[20.155139,52.060518],[20.156772,52.060914],[20.158431,52.061319],[20.162127,52.06224],[20.164361,52.062803],[20.166771,52.063413],[20.168831,52.063944],[20.169515,52.064121],[20.170934,52.064488],[20.172483,52.064887],[20.174505,52.065413],[20.176195,52.065855],[20.177957,52.066311],[20.178675,52.066495],[20.181445,52.067217],[20.184164,52.067921],[20.186884,52.068606],[20.188134,52.068918],[20.189212,52.069178],[20.190744,52.069549],[20.192203,52.069888],[20.193791,52.070246],[20.195404,52.070595],[20.197363,52.070999],[20.199064,52.071337],[20.200883,52.071676],[20.202481,52.071961],[20.203429,52.072126],[20.204369,52.07228],[20.206665,52.072647],[20.208521,52.072923],[20.209657,52.073084],[20.2108,52.073239],[20.212067,52.073404],[20.213329,52.07356],[20.215957,52.073863],[20.215971,52.073865],[20.217931,52.074068],[20.218788,52.074152],[20.219223,52.074194],[20.219545,52.074223],[20.220515,52.074308],[20.22187,52.074423],[20.223226,52.074528],[20.225435,52.074684],[20.227286,52.074795],[20.228211,52.074841],[20.229146,52.07489],[20.230034,52.074931],[20.231089,52.074973],[20.233332,52.075046],[20.233897,52.075064],[20.234704,52.075083],[20.235508,52.075099],[20.237149,52.075126],[20.238218,52.075132],[20.239261,52.075134],[20.240978,52.07513],[20.242146,52.07512],[20.243231,52.075106],[20.243773,52.075095],[20.244982,52.075069],[20.246277,52.075034],[20.24795,52.07498],[20.250298,52.07488],[20.252442,52.074758],[20.254207,52.074655],[20.256511,52.074513],[20.259184,52.074342],[20.262597,52.074127],[20.265933,52.0739],[20.268899,52.073703],[20.272459,52.073467],[20.276576,52.073211],[20.281609,52.072884],[20.286372,52.07265],[20.289066,52.072577],[20.291481,52.072541],[20.294251,52.072541],[20.296481,52.072567],[20.29893,52.07264],[20.300533,52.072709],[20.30246,52.072812],[20.30369,52.072889],[20.305439,52.073015],[20.306623,52.073114],[20.30778,52.073212],[20.309436,52.073374],[20.310991,52.07354],[20.312675,52.073737],[20.314263,52.073937],[20.316345,52.074222],[20.318172,52.074504],[20.320131,52.074824],[20.322088,52.075168],[20.323926,52.075521],[20.325813,52.075903],[20.327129,52.076185],[20.328633,52.076525],[20.330362,52.076928],[20.332541,52.07748],[20.334623,52.078037],[20.335454,52.078268],[20.336563,52.078589],[20.338011,52.079016],[20.340337,52.079745],[20.342805,52.080567],[20.344614,52.081206],[20.345653,52.081592],[20.347347,52.082232],[20.349099,52.082925],[20.351037,52.083729],[20.351742,52.084034],[20.353835,52.084946],[20.354703,52.085326],[20.357482,52.086553],[20.358885,52.087167],[20.360341,52.087784],[20.360975,52.088046],[20.361691,52.088345],[20.362527,52.088677],[20.363341,52.088995],[20.364709,52.089512],[20.365556,52.089818],[20.367121,52.090365],[20.369188,52.091051],[20.37022,52.091375],[20.371335,52.091713],[20.372563,52.092071],[20.37382,52.092422],[20.376181,52.093022],[20.378484,52.093574],[20.38051,52.094024],[20.382813,52.094496],[20.383512,52.094634],[20.385602,52.094994],[20.387396,52.095291],[20.388953,52.095529],[20.389948,52.095688],[20.390465,52.09577],[20.392143,52.096],[20.393839,52.096234],[20.395673,52.096489],[20.397819,52.09678],[20.399855,52.09706],[20.402168,52.097389],[20.405208,52.097821],[20.4077,52.098193],[20.411009,52.0987],[20.413688,52.099141],[20.41611,52.099549],[20.418285,52.099942],[20.420863,52.100424],[20.423153,52.100881],[20.426389,52.101544],[20.429247,52.102161],[20.432079,52.102799],[20.436002,52.103745],[20.440057,52.104765],[20.440308,52.104829],[20.443743,52.1057],[20.446459,52.106402],[20.449194,52.107132],[20.452371,52.107953],[20.453595,52.108267],[20.455563,52.108758],[20.456961,52.109092],[20.457839,52.109302],[20.460819,52.109984],[20.463069,52.110476],[20.465209,52.110914],[20.465876,52.111059],[20.467689,52.111421],[20.469145,52.111704],[20.469464,52.111764],[20.470071,52.111878],[20.471257,52.112101],[20.473276,52.112479],[20.475546,52.112895],[20.478232,52.113388],[20.479696,52.113659],[20.481159,52.113928],[20.482842,52.114238],[20.484377,52.114522],[20.485845,52.114793],[20.487431,52.115084],[20.489092,52.115391],[20.49072,52.115694],[20.492305,52.11599],[20.493561,52.116228],[20.495308,52.116562],[20.496867,52.116865],[20.497702,52.11703],[20.498994,52.117285],[20.500294,52.117554],[20.501624,52.117828],[20.503398,52.118205],[20.505448,52.118661],[20.505821,52.118739],[20.50757,52.119139],[20.507943,52.119227],[20.509542,52.119608],[20.511824,52.120161],[20.514927,52.120962],[20.517584,52.121678],[20.519364,52.122182],[20.521166,52.122695],[20.52346,52.123376],[20.524915,52.123819],[20.526352,52.124267],[20.527992,52.124792],[20.529635,52.125325],[20.531208,52.125848],[20.531601,52.125983],[20.532782,52.12638],[20.535017,52.127147],[20.538579,52.128333],[20.539709,52.128705],[20.540818,52.129057],[20.542688,52.129619],[20.545114,52.130286],[20.5471,52.130798],[20.549388,52.131352],[20.551299,52.131813],[20.552984,52.132217],[20.555501,52.132822],[20.558076,52.133442],[20.559978,52.133895],[20.561713,52.134309],[20.563776,52.134809],[20.565928,52.135323],[20.566004,52.135341],[20.568762,52.136003],[20.571214,52.13659],[20.572529,52.136904],[20.574952,52.137485],[20.577386,52.138067],[20.57914,52.138489],[20.58119,52.138979],[20.583414,52.139507],[20.585043,52.139893],[20.586628,52.14026],[20.588287,52.140644],[20.590009,52.141037],[20.591829,52.141444],[20.594232,52.141975],[20.596651,52.142488],[20.599246,52.143016],[20.600996,52.143368],[20.603528,52.143856],[20.60394,52.143935],[20.606994,52.144487],[20.609955,52.144993],[20.610077,52.145013],[20.610461,52.14508],[20.613056,52.1455],[20.614331,52.145695],[20.616578,52.146034],[20.618106,52.146252],[20.618888,52.146364],[20.620728,52.146617],[20.62157,52.146727],[20.621889,52.146766],[20.623192,52.146937],[20.625742,52.147251],[20.628483,52.147561],[20.631426,52.147879],[20.633678,52.1481],[20.63682,52.148398],[20.640004,52.148685],[20.642695,52.148933],[20.644882,52.149139],[20.647523,52.149422],[20.649245,52.149636],[20.652458,52.150066],[20.653381,52.150199],[20.656154,52.150593],[20.660044,52.151145],[20.663773,52.151686],[20.667041,52.152136],[20.670395,52.152629],[20.674127,52.153171],[20.678304,52.153819],[20.679554,52.154018],[20.681039,52.154256],[20.681605,52.154346],[20.683131,52.154596],[20.686389,52.155156],[20.690093,52.155817],[20.693416,52.156417],[20.695935,52.156875],[20.699373,52.157503],[20.702966,52.158149],[20.705495,52.158597],[20.70641,52.158766],[20.706813,52.15884],[20.711737,52.159729],[20.715373,52.160404],[20.715407,52.16041],[20.717612,52.16083],[20.718997,52.161102],[20.720112,52.161328],[20.722683,52.161864],[20.725556,52.162496],[20.729348,52.163426],[20.730023,52.163599],[20.734048,52.164652],[20.734201,52.164697],[20.734645,52.16482],[20.735286,52.165002],[20.735899,52.165178],[20.73653,52.16536],[20.737168,52.165547],[20.737786,52.165732],[20.738096,52.165824],[20.738275,52.16588],[20.738582,52.165972],[20.73921,52.166162],[20.740299,52.166503],[20.741205,52.166792],[20.741354,52.166839],[20.742438,52.167192],[20.743508,52.167547],[20.744438,52.16786],[20.745632,52.168276],[20.746552,52.1686],[20.747743,52.169029],[20.748646,52.169362],[20.749535,52.169689],[20.751149,52.170305],[20.752625,52.170876],[20.754527,52.171622],[20.755412,52.171973],[20.757165,52.172671],[20.758331,52.173142],[20.759785,52.173724],[20.76138,52.174366],[20.762707,52.174898],[20.763307,52.17514],[20.764197,52.175499],[20.76493,52.1758],[20.765374,52.17599],[20.766077,52.176311],[20.766479,52.176511],[20.7669,52.176725],[20.767281,52.176936],[20.767687,52.17717],[20.768062,52.177401],[20.768528,52.177705],[20.768879,52.177952],[20.769229,52.178214],[20.769425,52.178361],[20.769717,52.1786],[20.769939,52.178788],[20.770177,52.178999],[20.770382,52.179187],[20.770658,52.17946],[20.77093,52.179742],[20.771212,52.18006],[20.771402,52.180287],[20.771588,52.180511],[20.77174,52.180707],[20.771957,52.181015],[20.772119,52.181251],[20.772275,52.181496],[20.772462,52.181791],[20.772992,52.182681],[20.773482,52.183458],[20.774039,52.18426],[20.774577,52.184927],[20.774826,52.185198],[20.775285,52.185646],[20.775911,52.186196],[20.776628,52.186718],[20.777441,52.187221],[20.777821,52.187441],[20.778371,52.187724],[20.779021,52.188031],[20.779856,52.188371],[20.780769,52.188686],[20.781846,52.189007],[20.782948,52.189269],[20.784205,52.189524],[20.785049,52.189679],[20.786019,52.189837],[20.787084,52.189997],[20.787583,52.190058],[20.788209,52.190131],[20.789414,52.190312],[20.790874,52.19052],[20.79231,52.190726],[20.796337,52.191312],[20.797318,52.191459],[20.799415,52.191759],[20.800773,52.191935],[20.801948,52.192069],[20.803285,52.192207],[20.804662,52.192328],[20.806224,52.192437],[20.808316,52.192543],[20.810568,52.192642],[20.811587,52.192706],[20.812826,52.192807],[20.814224,52.192966],[20.815196,52.193096],[20.816704,52.19334],[20.818193,52.19364],[20.819613,52.193979],[20.821264,52.194433],[20.822878,52.19496],[20.825768,52.195963],[20.82707,52.196399],[20.828364,52.196835],[20.830727,52.197624],[20.831682,52.197944],[20.832456,52.198206],[20.83374,52.198561],[20.834273,52.19872],[20.834616,52.198812],[20.834983,52.198902],[20.835433,52.198991],[20.835825,52.199063],[20.836218,52.199128],[20.837176,52.199262],[20.838167,52.199401],[20.839128,52.199542],[20.839723,52.199633],[20.840026,52.199689],[20.840282,52.199744],[20.840539,52.199814],[20.840781,52.19989],[20.841218,52.200045],[20.841657,52.200239],[20.841974,52.200408],[20.842195,52.200549],[20.842411,52.200691],[20.842607,52.200845],[20.843271,52.201431],[20.843541,52.201644],[20.843782,52.20181],[20.844096,52.202],[20.84441,52.202174],[20.84478,52.202368],[20.845502,52.20274],[20.846229,52.203117],[20.847314,52.203691],[20.848208,52.204166],[20.849225,52.204724],[20.850035,52.205212],[20.85083,52.2057],[20.851458,52.206101],[20.851944,52.206431],[20.853034,52.207195],[20.853292,52.207377],[20.854033,52.207943],[20.854641,52.208423],[20.856338,52.209857],[20.856496,52.209989],[20.857793,52.211075],[20.85969,52.212726],[20.860563,52.213474],[20.861116,52.213947],[20.861251,52.214064],[20.8625,52.215125],[20.863363,52.215866],[20.863964,52.21638],[20.865172,52.217412],[20.866681,52.218724],[20.867741,52.219605],[20.869284,52.220951],[20.871753,52.223309],[20.873539,52.225058],[20.874941,52.226427],[20.877971,52.229403],[20.88068,52.232053],[20.882206,52.23355],[20.884954,52.236211],[20.886259,52.23749],[20.887213,52.238446],[20.888003,52.239217],[20.888599,52.239792],[20.889162,52.240339],[20.889576,52.240728],[20.890038,52.241143],[20.890657,52.241628],[20.891766,52.242367],[20.892338,52.242685],[20.892737,52.242883],[20.893359,52.243152],[20.893752,52.243313],[20.893843,52.24335],[20.894205,52.243477],[20.89507,52.243755],[20.895881,52.243964],[20.896645,52.24413],[20.897374,52.244264],[20.898127,52.244363],[20.898927,52.244444],[20.900349,52.244528],[20.90171,52.244613],[20.902794,52.244699],[20.903927,52.244798],[20.904673,52.244877],[20.905422,52.244968],[20.906613,52.245138],[20.909367,52.24553],[20.911505,52.245838],[20.912007,52.245907],[20.912038,52.245911],[20.915111,52.246351],[20.916823,52.246586],[20.917812,52.246721],[20.920497,52.247087],[20.921844,52.247256],[20.923079,52.247411],[20.923252,52.247435],[20.924305,52.247568],[20.928401,52.248085],[20.928461,52.248092],[20.932263,52.248521],[20.933259,52.248636],[20.934268,52.248782],[20.935339,52.249],[20.936221,52.249213],[20.936807,52.249372],[20.937435,52.249575],[20.938137,52.249817],[20.939418,52.250281],[20.940179,52.250558],[20.941023,52.250868],[20.941812,52.251198],[20.942515,52.251531],[20.94318,52.251919],[20.943753,52.252296],[20.944329,52.252733],[20.944562,52.252933],[20.944805,52.253152],[20.945228,52.253585],[20.945649,52.254035],[20.945979,52.254463],[20.946576,52.255142],[20.947182,52.255815],[20.947326,52.255968],[20.947356,52.256],[20.947436,52.256087],[20.947516,52.256174],[20.94786,52.256539],[20.948384,52.257123],[20.949178,52.257959],[20.950144,52.258936],[20.951737,52.26048],[20.95204,52.260788],[20.953226,52.26196],[20.954512,52.263214],[20.955393,52.264054],[20.957263,52.265788],[20.958875,52.267263],[20.959904,52.268169],[20.960941,52.269046],[20.961691,52.269641],[20.962453,52.270216],[20.963855,52.271231],[20.964997,52.271993],[20.966048,52.272677],[20.966403,52.272901],[20.966727,52.273094],[20.96773,52.273689],[20.968403,52.274088],[20.968936,52.274404],[20.970262,52.275145],[20.97087,52.275478],[20.971259,52.275692],[20.971939,52.276057],[20.972307,52.276253],[20.974412,52.277379],[20.975662,52.278031],[20.976857,52.278643],[20.978483,52.279452],[20.978726,52.279571],[20.982156,52.2812],[20.983391,52.281809],[20.985037,52.282563],[20.986098,52.28306],[20.986586,52.283286],[20.988189,52.284027],[20.990072,52.284915],[20.991451,52.285546],[20.992777,52.286158],[20.994216,52.286834],[20.99666,52.287943],[20.997634,52.288362],[20.998161,52.288568],[20.99881,52.288861],[20.999141,52.289009],[20.999682,52.289258],[21.000225,52.289474],[21.00063,52.289633],[21.000937,52.289754],[21.001374,52.289906],[21.001685,52.290005],[21.001814,52.290046],[21.003964,52.290725],[21.005072,52.291051],[21.009547,52.292502],[21.013892,52.293911],[21.014517,52.294114],[21.015504,52.29442],[21.016611,52.294781],[21.017353,52.295014],[21.019779,52.295783],[21.021112,52.29621],[21.022202,52.296558],[21.026809,52.298029],[21.028872,52.298606],[21.029807,52.298867],[21.031609,52.299371],[21.03263,52.299626],[21.032941,52.299704],[21.036156,52.300521],[21.038044,52.30099],[21.041864,52.301954],[21.048037,52.30351],[21.048232,52.303559],[21.049232,52.303815],[21.051355,52.304358],[21.051564,52.304411],[21.052063,52.304539],[21.056042,52.305558],[21.058381,52.306133],[21.060118,52.306499],[21.061641,52.306768],[21.062767,52.306913],[21.063636,52.307026],[21.064936,52.307154],[21.066438,52.307247],[21.06742,52.307293],[21.068668,52.307325],[21.068932,52.307322],[21.074081,52.307322],[21.07618,52.307321],[21.080331,52.307323],[21.080841,52.307319],[21.08283,52.307308],[21.083742,52.307309],[21.085186,52.307312],[21.08798,52.307308],[21.091368,52.307306],[21.092902,52.307301],[21.097772,52.307293],[21.099398,52.30729],[21.100282,52.307283],[21.101692,52.307293],[21.103105,52.307347],[21.10333,52.307358],[21.104252,52.307423],[21.104863,52.307491],[21.105405,52.307547],[21.105773,52.307594],[21.106208,52.307654],[21.106449,52.307688],[21.10763,52.307872],[21.108307,52.307991],[21.110391,52.308407],[21.114315,52.309174],[21.11447,52.309205],[21.115832,52.30948],[21.118051,52.309925],[21.118743,52.310079],[21.119387,52.310229],[21.120009,52.310409],[21.121286,52.310773],[21.12199,52.310997],[21.122556,52.311202],[21.123012,52.311373],[21.123551,52.311588],[21.12363,52.31162],[21.124603,52.312046],[21.125909,52.31267],[21.127,52.313168],[21.12895,52.314126],[21.129166,52.314235],[21.130233,52.314745],[21.132456,52.315804],[21.133534,52.316319],[21.134194,52.316635],[21.136324,52.317668],[21.138235,52.318576],[21.138931,52.318907],[21.140507,52.319667],[21.141961,52.320376],[21.142522,52.320649],[21.144641,52.321665],[21.14582,52.322236],[21.147059,52.322825],[21.148125,52.323339],[21.149836,52.324159],[21.150635,52.32455],[21.151084,52.324778],[21.151536,52.325023],[21.15196,52.325269],[21.152431,52.325569],[21.152965,52.325934],[21.153364,52.326229],[21.153749,52.326556],[21.154092,52.326856],[21.154277,52.327022],[21.15449,52.327226],[21.15482,52.327563],[21.155005,52.327764],[21.155165,52.327944],[21.155464,52.328312],[21.155677,52.328591],[21.155705,52.328631],[21.155971,52.329031],[21.156193,52.329397],[21.156369,52.329728],[21.156528,52.329996],[21.156592,52.330115],[21.15666,52.330293],[21.156768,52.330577],[21.156916,52.331015],[21.15701,52.331385],[21.157073,52.331658],[21.157107,52.331971],[21.157125,52.332176],[21.157161,52.332583],[21.15717,52.332777],[21.157173,52.333024],[21.157153,52.333663],[21.157111,52.33427],[21.156986,52.335644],[21.156799,52.337778],[21.156574,52.340333],[21.156504,52.34113],[21.156426,52.342019],[21.156367,52.342742],[21.156333,52.343212],[21.15631,52.34379],[21.156325,52.344301],[21.156359,52.344677],[21.156377,52.344819],[21.156406,52.345017],[21.156436,52.345161],[21.156487,52.345398],[21.156545,52.345627],[21.156605,52.345814],[21.156708,52.346115],[21.156859,52.346485],[21.157024,52.346779],[21.157324,52.347315],[21.157716,52.347872],[21.157966,52.34824],[21.158345,52.348666],[21.15854,52.348866],[21.158825,52.349144],[21.159255,52.349482],[21.159596,52.349768],[21.160158,52.35017],[21.160531,52.35043],[21.160911,52.350664],[21.161437,52.350953],[21.16184,52.351175],[21.162299,52.351406],[21.162758,52.351614],[21.163288,52.351855],[21.163789,52.352044],[21.164191,52.352182],[21.164854,52.352395],[21.165536,52.352586],[21.166189,52.352734],[21.166936,52.352905],[21.167746,52.353078],[21.168476,52.353226],[21.171825,52.353895],[21.172184,52.35397],[21.173006,52.354132],[21.173143,52.354158],[21.174133,52.354376],[21.175344,52.354615],[21.176098,52.354789],[21.177375,52.355132],[21.178119,52.355362],[21.178924,52.355623],[21.17948,52.355832],[21.180314,52.356184],[21.181387,52.356666],[21.18235,52.357159],[21.182985,52.357515],[21.183758,52.357984],[21.184734,52.358682],[21.184996,52.358884],[21.185671,52.359474],[21.186355,52.360109],[21.186706,52.360471],[21.187055,52.360873],[21.187396,52.361276],[21.187659,52.361636],[21.187875,52.361944],[21.188116,52.362321],[21.188298,52.362627],[21.188592,52.363149],[21.188823,52.363647],[21.189023,52.364166],[21.189142,52.364534],[21.18928,52.365037],[21.189411,52.365659],[21.189465,52.36614],[21.189495,52.366576],[21.189517,52.366981],[21.189518,52.367197],[21.189517,52.367245],[21.189499,52.367659],[21.189471,52.368082],[21.189388,52.36866],[21.189288,52.369273],[21.189279,52.36931],[21.189044,52.370902],[21.18892,52.371678],[21.188819,52.372415],[21.188614,52.373509],[21.188437,52.374499],[21.18836,52.37508],[21.188281,52.375682],[21.188269,52.376134],[21.188273,52.376591],[21.188305,52.377156],[21.188382,52.377606],[21.188473,52.378023],[21.188581,52.378449],[21.188734,52.378885],[21.188898,52.379332],[21.188919,52.379378],[21.188961,52.379478],[21.18919,52.379974],[21.189407,52.380406],[21.189692,52.380902],[21.18998,52.381364],[21.190373,52.38189],[21.190799,52.382442],[21.191601,52.383445],[21.191678,52.383542],[21.191745,52.383625],[21.194221,52.386815],[21.195783,52.388768],[21.19649,52.389726],[21.197083,52.390621],[21.199071,52.393495],[21.199733,52.394484],[21.200358,52.395421],[21.200743,52.396093],[21.200972,52.396552],[21.201177,52.397019],[21.201276,52.397259],[21.201473,52.397826],[21.20162,52.398335],[21.201725,52.398839],[21.201794,52.399294],[21.201914,52.400339],[21.201996,52.400907],[21.202254,52.402785],[21.202311,52.403205],[21.202409,52.403714],[21.202569,52.40424],[21.202839,52.404927],[21.203087,52.405418],[21.203414,52.405955],[21.203703,52.406356],[21.204042,52.406802],[21.204437,52.407244],[21.204861,52.407662],[21.205452,52.408163],[21.206221,52.408771],[21.208433,52.410482],[21.210496,52.41207],[21.211012,52.412433],[21.211554,52.412797],[21.212642,52.413498],[21.213462,52.413993],[21.21432,52.41449],[21.216234,52.415543],[21.217647,52.416324],[21.218126,52.416588],[21.218714,52.41695],[21.219278,52.417335],[21.219922,52.417823],[21.22046,52.4183],[21.220891,52.418735],[21.22128,52.41918],[21.221543,52.419525],[21.221785,52.419874],[21.222009,52.42023],[21.22221,52.420587],[21.223421,52.422703],[21.22461,52.424816],[21.225261,52.425918],[21.225874,52.427036],[21.226694,52.428588],[21.226971,52.429121],[21.227306,52.429743],[21.227698,52.430505],[21.228083,52.431241],[21.228483,52.431978],[21.228831,52.432516],[21.229114,52.432887],[21.229415,52.433257],[21.22973,52.433591],[21.230071,52.433929],[21.230399,52.434214],[21.230731,52.43449],[21.231011,52.434699],[21.231303,52.434911],[21.231815,52.435245],[21.232396,52.435594],[21.233039,52.435926],[21.233433,52.436116],[21.233844,52.436303],[21.234662,52.436662],[21.236314,52.437367],[21.238198,52.438184],[21.238268,52.438214],[21.239084,52.438569],[21.240676,52.439258],[21.242016,52.439843],[21.24288,52.440218],[21.244716,52.441013],[21.245053,52.441157],[21.245819,52.441489],[21.246331,52.44171],[21.247587,52.442244],[21.248914,52.442773],[21.249131,52.442858],[21.250089,52.443232],[21.251175,52.443635],[21.251529,52.443749],[21.253691,52.444539],[21.25682,52.445662],[21.257907,52.44605],[21.260878,52.44711],[21.261789,52.447449],[21.264713,52.448501],[21.26648,52.449133],[21.268096,52.449717],[21.269175,52.450112],[21.269183,52.450115],[21.272777,52.4514],[21.277967,52.453267],[21.283472,52.455244],[21.289445,52.457386],[21.290624,52.457809],[21.291946,52.45829],[21.295706,52.45964],[21.297146,52.460155],[21.2986,52.460677],[21.299397,52.460963],[21.304548,52.462818],[21.311742,52.465401],[21.314708,52.466466],[21.317664,52.467531],[21.318254,52.467751],[21.318835,52.467968],[21.319388,52.468192],[21.319959,52.468423],[21.320376,52.468598],[21.321342,52.469022],[21.322668,52.469644],[21.323343,52.469983],[21.325782,52.471269],[21.327491,52.47219],[21.330482,52.473794],[21.331846,52.474518],[21.33497,52.476191],[21.336507,52.477016],[21.338053,52.477843],[21.343692,52.480864],[21.343953,52.481002],[21.347448,52.482871],[21.347449,52.482871],[21.348119,52.483235],[21.351568,52.485206],[21.352302,52.485617],[21.353069,52.486035],[21.354591,52.486848],[21.355376,52.487267],[21.356153,52.487685],[21.357724,52.48852],[21.360059,52.489766],[21.364156,52.491953],[21.365878,52.492878],[21.367859,52.493939],[21.369889,52.495026],[21.372841,52.4966],[21.37385,52.497134],[21.374795,52.497654],[21.375742,52.498198],[21.377039,52.498971],[21.377675,52.499365],[21.378298,52.49976],[21.379999,52.500875],[21.381686,52.501998],[21.383767,52.503383],[21.386446,52.505168],[21.389139,52.506952],[21.390681,52.508063],[21.391289,52.50853],[21.392229,52.509307],[21.393205,52.510084],[21.393656,52.510434],[21.394115,52.510782],[21.394539,52.5111],[21.395092,52.511491],[21.3953,52.511649],[21.395863,52.512046],[21.396096,52.512205],[21.397159,52.512924],[21.398787,52.51397],[21.399963,52.514679],[21.400612,52.515057],[21.401274,52.515437],[21.401668,52.515658],[21.402368,52.516051],[21.402618,52.516191],[21.403024,52.516429],[21.403456,52.516693],[21.404301,52.517226],[21.405414,52.51797],[21.40576,52.518204],[21.406105,52.518436],[21.408411,52.519997],[21.409039,52.52042],[21.410019,52.521082],[21.411977,52.522405],[21.412642,52.522854],[21.415413,52.524729],[21.415788,52.524978],[21.417112,52.525872],[21.418435,52.526762],[21.420957,52.528467],[21.423474,52.530169],[21.425828,52.531748],[21.426322,52.532092],[21.428372,52.53347],[21.429729,52.534391],[21.430765,52.535087],[21.432979,52.536588],[21.433746,52.537099],[21.434537,52.537634],[21.435321,52.538172],[21.435699,52.538439],[21.436091,52.538726],[21.436455,52.539012],[21.436806,52.539312],[21.437087,52.539575],[21.437355,52.53984],[21.437603,52.540111],[21.437837,52.54038],[21.438024,52.540623],[21.4382,52.540865],[21.438517,52.541355],[21.438706,52.541691],[21.438869,52.542033],[21.439016,52.542381],[21.439124,52.542692],[21.439217,52.543007],[21.439291,52.54332],[21.439357,52.543637],[21.439474,52.544322],[21.439577,52.545005],[21.439708,52.545834],[21.439845,52.546669],[21.439899,52.546951],[21.43996,52.547234],[21.440032,52.547513],[21.440111,52.54779],[21.440177,52.547988],[21.440246,52.548191],[21.440329,52.548387],[21.440417,52.548585],[21.440487,52.548733],[21.440573,52.548898],[21.440748,52.549209],[21.440988,52.549586],[21.441118,52.549768],[21.441245,52.54994],[21.441421,52.550162],[21.441612,52.550386],[21.441848,52.550643],[21.442083,52.550881],[21.442289,52.551075],[21.442504,52.551268],[21.442646,52.551389],[21.44281,52.551526],[21.443136,52.55178],[21.443334,52.551926],[21.44354,52.552072],[21.443753,52.552214],[21.443977,52.552359],[21.444262,52.552534],[21.444563,52.552708],[21.444915,52.552902],[21.445268,52.553081],[21.445397,52.553146],[21.445446,52.553171],[21.445638,52.55326],[21.446065,52.55345],[21.446287,52.553544],[21.446521,52.553639],[21.446817,52.553754],[21.447112,52.553862],[21.447473,52.553987],[21.447881,52.554119],[21.448394,52.554271],[21.448957,52.55442],[21.449332,52.554511],[21.449698,52.554595],[21.449972,52.554656],[21.45025,52.554714],[21.450817,52.554829],[21.451376,52.554937],[21.451949,52.555044],[21.45757,52.556098],[21.459415,52.556445],[21.459908,52.556547],[21.460383,52.556648],[21.460812,52.556749],[21.461245,52.556859],[21.461622,52.556964],[21.461994,52.557074],[21.462387,52.557205],[21.462931,52.557406],[21.463263,52.557549],[21.463582,52.557692],[21.464156,52.557969],[21.464751,52.558307],[21.464993,52.558461],[21.465228,52.558617],[21.465377,52.558722],[21.465664,52.558937],[21.466004,52.559221],[21.466201,52.559399],[21.466384,52.559579],[21.466557,52.559757],[21.466718,52.559934],[21.466886,52.560138],[21.467001,52.560285],[21.467155,52.560503],[21.467295,52.560719],[21.46739,52.560879],[21.467478,52.561042],[21.467565,52.561216],[21.467644,52.561387],[21.467731,52.561607],[21.467807,52.561827],[21.46787,52.562034],[21.467923,52.562242],[21.46796,52.562402],[21.468013,52.56265],[21.46807,52.562996],[21.468121,52.563343],[21.468266,52.564429],[21.468289,52.564607],[21.468322,52.564852],[21.468359,52.565133],[21.468446,52.56566],[21.4685,52.565933],[21.468567,52.56621],[21.468684,52.566621],[21.468845,52.567039],[21.46897,52.56731],[21.469117,52.567584],[21.469256,52.567811],[21.469411,52.568036],[21.469573,52.568255],[21.469752,52.568473],[21.469952,52.568695],[21.470157,52.568904],[21.470432,52.569155],[21.470716,52.569399],[21.470901,52.569545],[21.471103,52.569693],[21.471321,52.569844],[21.471553,52.569997],[21.471783,52.570138],[21.47201,52.570268],[21.472477,52.570523],[21.472996,52.570775],[21.473262,52.570897],[21.473549,52.571021],[21.473905,52.571174],[21.474223,52.571304],[21.47486,52.57156],[21.476761,52.572303],[21.478543,52.572997],[21.481463,52.574138],[21.482025,52.574356],[21.483361,52.574879],[21.484701,52.575402],[21.487372,52.576443],[21.488438,52.576868],[21.488912,52.577065],[21.48937,52.577261],[21.489826,52.577461],[21.490269,52.577661],[21.490866,52.577953],[21.491449,52.578253],[21.4925,52.578856],[21.493028,52.579192],[21.493292,52.579366],[21.493533,52.579533],[21.493996,52.579873],[21.494444,52.580213],[21.494853,52.580553],[21.495243,52.580899],[21.495596,52.581229],[21.49576,52.581392],[21.495922,52.581553],[21.496263,52.581916],[21.496577,52.582286],[21.496876,52.582657],[21.497158,52.583036],[21.497459,52.583478],[21.497742,52.583935],[21.49793,52.584288],[21.498112,52.584645],[21.498271,52.585004],[21.49842,52.585364],[21.498529,52.585674],[21.498596,52.585883],[21.498658,52.586092],[21.498706,52.586264],[21.498746,52.586436],[21.498784,52.586601],[21.49881,52.586711],[21.498866,52.586993],[21.498911,52.587293],[21.498947,52.58759],[21.498974,52.587949],[21.498983,52.588002],[21.498993,52.588386],[21.498982,52.588742],[21.498963,52.589089],[21.498952,52.589233],[21.498913,52.589605],[21.498913,52.589605],[21.498862,52.589975],[21.498806,52.590319],[21.49879,52.590417],[21.498735,52.590717],[21.498677,52.591026],[21.498549,52.591659],[21.498298,52.592898],[21.497967,52.594502],[21.497644,52.596109],[21.497591,52.596338],[21.497381,52.597371],[21.496505,52.601657],[21.496054,52.603865],[21.496021,52.604026],[21.495934,52.604454],[21.495702,52.60559],[21.495471,52.606727],[21.495266,52.607838],[21.495179,52.608394],[21.495109,52.60895],[21.495062,52.609407],[21.495027,52.609862],[21.495015,52.610134],[21.495009,52.610418],[21.495009,52.610697],[21.495017,52.610976],[21.495024,52.611178],[21.495034,52.611381],[21.495066,52.611784],[21.495114,52.612191],[21.495169,52.612601],[21.495242,52.612985],[21.495323,52.613372],[21.495417,52.613755],[21.495521,52.614136],[21.495668,52.614609],[21.495748,52.614843],[21.495836,52.615079],[21.495923,52.615313],[21.496018,52.615547],[21.49622,52.616014],[21.49646,52.616514],[21.496586,52.616758],[21.49672,52.61701],[21.496888,52.617306],[21.497063,52.617603],[21.49745,52.618208],[21.497919,52.618885],[21.498431,52.619547],[21.498707,52.619883],[21.498996,52.620217],[21.499398,52.620655],[21.49982,52.621086],[21.500371,52.621628],[21.501021,52.622214],[21.501436,52.622568],[21.501827,52.622882],[21.502198,52.623176],[21.502558,52.623445],[21.502993,52.623767],[21.503323,52.624003],[21.503659,52.624228],[21.503908,52.624397],[21.504197,52.624584],[21.504965,52.625055],[21.505499,52.625386],[21.507139,52.626271],[21.50875,52.627078],[21.509343,52.627359],[21.510999,52.62813],[21.51555,52.630168],[21.517127,52.630894],[21.518662,52.63161],[21.520448,52.632432],[21.522034,52.633171],[21.52283,52.633536],[21.52418,52.634202],[21.525456,52.634885],[21.526604,52.635551],[21.52882,52.636919],[21.529903,52.637589],[21.531455,52.638523],[21.53224,52.638922],[21.532741,52.639176],[21.533739,52.639664],[21.534575,52.640037],[21.535514,52.640451],[21.535585,52.640483],[21.537008,52.641043],[21.53858,52.641609],[21.539584,52.641957],[21.541032,52.642466],[21.542462,52.642977],[21.543584,52.643401],[21.545377,52.644129],[21.549029,52.645811],[21.550193,52.646335],[21.550669,52.646558],[21.553986,52.648114],[21.554767,52.648475],[21.555005,52.648586],[21.555693,52.648906],[21.556233,52.649156],[21.557896,52.649924],[21.558351,52.650134],[21.56002,52.650922],[21.572407,52.656681],[21.573162,52.657038],[21.578824,52.659681],[21.583534,52.661893],[21.584379,52.662271],[21.592487,52.666025],[21.594827,52.667155],[21.597034,52.668348],[21.59845,52.66901],[21.600154,52.669731],[21.601918,52.670467],[21.603415,52.671145],[21.606086,52.672388],[21.607401,52.673004],[21.607643,52.673117],[21.612946,52.675599],[21.61355,52.675882],[21.617069,52.677487],[21.618341,52.678086],[21.620285,52.679],[21.620401,52.679055],[21.626013,52.681643],[21.633485,52.685032],[21.639435,52.687731],[21.641727,52.688768],[21.643247,52.68949],[21.64538,52.690458],[21.647156,52.691262],[21.648822,52.69202],[21.649785,52.692448],[21.65166,52.693306],[21.654429,52.69455],[21.659803,52.696982],[21.661929,52.697942],[21.667286,52.700391],[21.675852,52.704285],[21.677921,52.705246],[21.678565,52.705537],[21.684866,52.708386],[21.691777,52.711527],[21.694032,52.712535],[21.69515,52.713057],[21.695762,52.713327],[21.696538,52.713685],[21.698765,52.714728],[21.699336,52.715021],[21.700094,52.715417],[21.700767,52.715799],[21.70142,52.71619],[21.702697,52.716972],[21.704025,52.717831],[21.70462,52.718214],[21.705925,52.719049],[21.706386,52.719337],[21.707262,52.719845],[21.708347,52.72043],[21.708804,52.720686],[21.709264,52.720929],[21.710488,52.721474],[21.711449,52.72187],[21.712324,52.722234],[21.714886,52.723193],[21.715265,52.723347],[21.716167,52.723671],[21.717113,52.723999],[21.719906,52.724924],[21.722136,52.725659],[21.724307,52.726359],[21.725616,52.72681],[21.726586,52.727134],[21.727219,52.727361],[21.72762,52.727514],[21.728159,52.727729],[21.728739,52.727975],[21.731566,52.729222],[21.73242,52.729592],[21.73506,52.730735],[21.739605,52.732717],[21.744152,52.734679],[21.748223,52.736469],[21.749078,52.736841],[21.751601,52.737937],[21.754999,52.739406],[21.759807,52.741493],[21.760887,52.741949],[21.764614,52.743558],[21.772269,52.746859],[21.773317,52.747316],[21.776501,52.74869],[21.780366,52.750361],[21.784227,52.752025],[21.787163,52.753294],[21.78794,52.753644],[21.790381,52.754721],[21.792148,52.755484],[21.795909,52.757097],[21.796371,52.757296],[21.799662,52.7587],[21.802236,52.759817],[21.804716,52.760894],[21.80564,52.76129],[21.811654,52.763891],[21.818576,52.766881],[21.822945,52.768771],[21.827289,52.770651],[21.828441,52.771151],[21.829104,52.771438],[21.829199,52.771479],[21.830283,52.77194],[21.833834,52.773477],[21.840292,52.776264],[21.844137,52.77793],[21.84483,52.778224],[21.847926,52.779565],[21.851098,52.780945],[21.85373,52.782091],[21.855292,52.782769],[21.857011,52.783512],[21.857844,52.783881],[21.85869,52.784262],[21.859146,52.784477],[21.859769,52.784785],[21.86032,52.785074],[21.860882,52.785387],[21.861396,52.785701],[21.861906,52.78603],[21.862351,52.786334],[21.862793,52.78666],[21.863185,52.786964],[21.863713,52.787412],[21.864218,52.787876],[21.864512,52.788172],[21.864859,52.788547],[21.865155,52.788874],[21.86535,52.789112],[21.865542,52.789359],[21.865757,52.789648],[21.865941,52.789918],[21.86607,52.790118],[21.866206,52.790343],[21.866331,52.790555],[21.866454,52.790777],[21.866583,52.791021],[21.866695,52.791265],[21.866804,52.791506],[21.866917,52.791757],[21.86708,52.792161],[21.86716,52.792392],[21.867249,52.792641],[21.867403,52.793128],[21.867552,52.793608],[21.867631,52.793887],[21.86797,52.795033],[21.868245,52.795923],[21.868523,52.796741],[21.86862,52.797014],[21.868783,52.797413],[21.869045,52.798014],[21.869296,52.79856],[21.869587,52.799134],[21.869864,52.799646],[21.870248,52.800288],[21.870643,52.800903],[21.870983,52.8014],[21.871355,52.801917],[21.871732,52.802405],[21.87175,52.802429],[21.872163,52.802933],[21.87265,52.80351],[21.874134,52.805196],[21.87447,52.805591],[21.874807,52.805994],[21.875124,52.806404],[21.875433,52.806812],[21.875662,52.807149],[21.875891,52.807495],[21.876102,52.807845],[21.876313,52.808201],[21.876517,52.808579],[21.876701,52.808955],[21.876787,52.809143],[21.876878,52.809344],[21.87704,52.809725],[21.877297,52.810404],[21.877529,52.81109],[21.877771,52.8118],[21.878017,52.812451],[21.878127,52.812676],[21.878235,52.812885],[21.878465,52.813283],[21.878609,52.813498],[21.878761,52.813708],[21.879136,52.814175],[21.879367,52.814425],[21.87961,52.814671],[21.879876,52.814914],[21.880143,52.815145],[21.88041,52.815355],[21.880669,52.815551],[21.880952,52.815752],[21.881316,52.815986],[21.881407,52.816047],[21.881951,52.816359],[21.882258,52.816524],[21.882657,52.81672],[21.882966,52.816864],[21.883267,52.816993],[21.883679,52.817162],[21.88389,52.817241],[21.883947,52.817263],[21.884394,52.81742],[21.884815,52.817556],[21.885358,52.817714],[21.885759,52.817816],[21.886172,52.817919],[21.88701,52.818093],[21.891538,52.818933],[21.894669,52.819505],[21.896086,52.819741],[21.897408,52.819939],[21.898012,52.820019],[21.898897,52.82013],[21.899763,52.820225],[21.900655,52.820312],[21.901889,52.820414],[21.903109,52.820495],[21.903898,52.820536],[21.90467,52.820567],[21.905853,52.820598],[21.907058,52.820616],[21.907842,52.820614],[21.908606,52.820604],[21.910171,52.820577],[21.913211,52.820517],[21.915578,52.820471],[21.91676,52.820453],[21.917354,52.820452],[21.91794,52.820461],[21.918658,52.820482],[21.919333,52.820518],[21.920262,52.820597],[21.920903,52.820663],[21.92176,52.820774],[21.922411,52.82088],[21.922986,52.820984],[21.923586,52.8211],[21.924124,52.821221],[21.924673,52.821355],[21.925084,52.821463],[21.925496,52.821579],[21.92629,52.821816],[21.92683,52.821993],[21.927388,52.822194],[21.927916,52.822396],[21.928427,52.822606],[21.928969,52.82285],[21.92951,52.823092],[21.930374,52.823517],[21.930726,52.823675],[21.931418,52.824017],[21.932094,52.824363],[21.932427,52.824538],[21.934147,52.825425],[21.935072,52.825905],[21.938227,52.827547],[21.939494,52.828208],[21.942334,52.829657],[21.943594,52.830307],[21.945351,52.831217],[21.947076,52.83211],[21.947812,52.832484],[21.948757,52.832967],[21.952421,52.834852],[21.959221,52.83837],[21.961567,52.839588],[21.966931,52.842374],[21.971853,52.844927],[21.974621,52.846368],[21.974692,52.846405],[21.976046,52.84711],[21.977276,52.847747],[21.978214,52.848217],[21.98163,52.849997],[21.984839,52.851663],[21.989419,52.854037],[21.99426,52.856546],[21.996631,52.85778],[21.999106,52.859063],[22.001763,52.860466],[22.002149,52.860665],[22.002389,52.860789],[22.004113,52.86168],[22.005748,52.862529],[22.008893,52.864153],[22.010933,52.865206],[22.012913,52.866245],[22.013782,52.866694],[22.016249,52.867946],[22.021262,52.870552],[22.022168,52.871013],[22.023571,52.871726],[22.026025,52.873013],[22.028284,52.874196],[22.029451,52.874844],[22.030585,52.875495],[22.032052,52.876297],[22.033352,52.876975],[22.033657,52.877127],[22.035349,52.877995],[22.037607,52.879174],[22.038702,52.879757],[22.039834,52.880375],[22.040826,52.880955],[22.041728,52.881525],[22.041906,52.881642],[22.042249,52.881865],[22.042988,52.882345],[22.043961,52.883008],[22.044419,52.883337],[22.044936,52.883705],[22.045418,52.884071],[22.045879,52.884421],[22.046757,52.885117],[22.04765,52.885855],[22.048567,52.886638],[22.049388,52.887279],[22.049883,52.887646],[22.050335,52.887959],[22.050912,52.888336],[22.051364,52.888627],[22.052441,52.889252],[22.052993,52.889549],[22.053525,52.889825],[22.054084,52.890099],[22.054658,52.890368],[22.055315,52.890661],[22.055931,52.890914],[22.056534,52.891153],[22.057176,52.89139],[22.058445,52.891837],[22.060047,52.892371],[22.063596,52.893522],[22.066169,52.894371],[22.066486,52.894482],[22.067212,52.894739],[22.06829,52.895125],[22.068307,52.895131],[22.069124,52.895444],[22.069135,52.895449],[22.070114,52.895835],[22.071223,52.896298],[22.07182,52.896552],[22.072658,52.896923],[22.073608,52.897363],[22.074761,52.897924],[22.075923,52.898513],[22.081414,52.901348],[22.08413,52.902764],[22.086864,52.904174],[22.089832,52.905714],[22.091739,52.906699],[22.094803,52.908289],[22.096457,52.909151],[22.098431,52.91017],[22.100248,52.911113],[22.10145,52.911704],[22.102008,52.912019],[22.103674,52.912888],[22.105278,52.913734],[22.106332,52.914314],[22.107269,52.914837],[22.10801,52.915253],[22.108513,52.915554],[22.109593,52.916211],[22.111682,52.917483],[22.112527,52.918066],[22.113708,52.918798],[22.114751,52.919423],[22.115893,52.920078],[22.116993,52.920693],[22.118059,52.921265],[22.119467,52.922],[22.120837,52.922714],[22.123606,52.924153],[22.127412,52.926128],[22.129429,52.927182],[22.131334,52.928173],[22.132036,52.928549],[22.132563,52.928834],[22.133745,52.9295],[22.134714,52.930086],[22.135783,52.930786],[22.135848,52.930831],[22.136657,52.931399],[22.137361,52.931901],[22.137909,52.932316],[22.138402,52.932704],[22.13888,52.933093],[22.139723,52.933802],[22.14067,52.934594],[22.141212,52.935107],[22.142985,52.936634],[22.144614,52.938044],[22.145027,52.938404],[22.145544,52.938846],[22.146355,52.939543],[22.147213,52.940273],[22.147685,52.940644],[22.148114,52.940965],[22.148126,52.940974],[22.148638,52.941347],[22.149139,52.94169],[22.149641,52.942015],[22.150141,52.942314],[22.150747,52.942654],[22.151424,52.943017],[22.152478,52.943509],[22.153681,52.944057],[22.154929,52.944564],[22.155575,52.944807],[22.156214,52.94503],[22.157507,52.945454],[22.158814,52.945812],[22.160184,52.946174],[22.160588,52.946278],[22.161189,52.946435],[22.162783,52.946836],[22.165399,52.947521],[22.166929,52.94792],[22.168197,52.948258],[22.169042,52.948492],[22.170106,52.948804],[22.170915,52.949051],[22.17198,52.949396],[22.172924,52.949729],[22.17385,52.950071],[22.175115,52.950566],[22.176163,52.951007],[22.176744,52.951265],[22.177337,52.951534],[22.17849,52.952081],[22.179697,52.952691],[22.180968,52.953349],[22.182926,52.954369],[22.186445,52.9562],[22.189994,52.958042],[22.191473,52.958811],[22.193197,52.959708],[22.196605,52.961484],[22.197727,52.962098],[22.198311,52.962417],[22.198889,52.96271],[22.199775,52.96324],[22.200337,52.963572],[22.200811,52.963862],[22.201161,52.964087],[22.201439,52.964269],[22.201828,52.964548],[22.202101,52.964753],[22.202371,52.964957],[22.20269,52.965213],[22.202984,52.965454],[22.20359,52.965987],[22.203915,52.966302],[22.204152,52.966541],[22.204289,52.966682],[22.204458,52.966857],[22.20469,52.96712],[22.204916,52.967381],[22.205143,52.967655],[22.20549,52.968115],[22.205825,52.968575],[22.206254,52.969232],[22.20721,52.970837],[22.207542,52.971382],[22.207662,52.971585],[22.208169,52.972416],[22.209263,52.974306],[22.209317,52.974397],[22.209648,52.974935],[22.209976,52.975492],[22.210185,52.975836],[22.210392,52.976198],[22.210573,52.97648],[22.212525,52.979742],[22.213639,52.9816],[22.214623,52.983208],[22.215335,52.984198],[22.215696,52.984671],[22.216061,52.985041],[22.216586,52.985619],[22.217231,52.986222],[22.217538,52.986508],[22.217924,52.986844],[22.218706,52.987443],[22.219142,52.987754],[22.219948,52.988294],[22.220565,52.988666],[22.221465,52.989171],[22.222657,52.989777],[22.224054,52.990385],[22.224921,52.990721],[22.226317,52.991229],[22.228101,52.991856],[22.229652,52.992397],[22.235883,52.994569],[22.240011,52.995991],[22.241586,52.996542],[22.243547,52.99722],[22.247704,52.99861],[22.248606,52.998903],[22.249919,52.999302],[22.251938,52.999844],[22.254055,53.000356],[22.255922,53.000763],[22.257885,53.001154],[22.268407,53.003119],[22.274504,53.004276],[22.282454,53.005727],[22.284496,53.006115],[22.287707,53.006702],[22.289765,53.007081],[22.290645,53.007244],[22.293106,53.007706],[22.293715,53.007829],[22.295354,53.008197],[22.296291,53.008444],[22.297118,53.008683],[22.298395,53.009085],[22.299372,53.009433],[22.300495,53.009883],[22.301574,53.010357],[22.302146,53.010624],[22.303167,53.011152],[22.304033,53.011642],[22.305179,53.012363],[22.306149,53.013043],[22.306846,53.013583],[22.307878,53.01446],[22.307887,53.014468],[22.309353,53.015794],[22.31025,53.016593],[22.311065,53.017263],[22.311951,53.017901],[22.31299,53.018558],[22.313922,53.0191],[22.314625,53.01947],[22.315303,53.019792],[22.316224,53.020253],[22.319072,53.021522],[22.320944,53.022376],[22.321912,53.022826],[22.329428,53.026321],[22.330329,53.026727],[22.334583,53.028693],[22.335104,53.028935],[22.340461,53.031461],[22.345465,53.033786],[22.3497,53.035764],[22.351297,53.036524],[22.352493,53.037088],[22.35534,53.038432],[22.355974,53.038732],[22.358274,53.039891],[22.360525,53.041132],[22.362578,53.042297],[22.363751,53.042921],[22.364887,53.043508],[22.366123,53.044107],[22.367238,53.044639],[22.368415,53.045184],[22.370465,53.046127],[22.374315,53.047897],[22.376693,53.048966],[22.378594,53.04978],[22.381655,53.050991],[22.383998,53.051991],[22.387043,53.053403],[22.388125,53.053893],[22.391017,53.055234],[22.394993,53.057091],[22.397711,53.058363],[22.401149,53.059941],[22.404885,53.061682],[22.4053,53.061873],[22.407923,53.063153],[22.408537,53.06348],[22.409977,53.064232],[22.412121,53.065347],[22.413198,53.065879],[22.414037,53.066275],[22.421626,53.069821],[22.428683,53.073103],[22.429737,53.073557],[22.431064,53.074117],[22.433634,53.07515],[22.436066,53.076076],[22.437451,53.07664],[22.438638,53.077133],[22.441039,53.078156],[22.445242,53.080133],[22.446906,53.080867],[22.448198,53.081362],[22.44952,53.08182],[22.4511,53.082301],[22.451988,53.082547],[22.453404,53.08289],[22.454762,53.083166],[22.456231,53.083422],[22.457685,53.083628],[22.459195,53.08379],[22.460496,53.083888],[22.462041,53.083966],[22.463392,53.083995],[22.464764,53.083995],[22.467844,53.083971],[22.469595,53.083973],[22.470593,53.084003],[22.471393,53.08404],[22.471912,53.084068],[22.473006,53.084147],[22.473741,53.08422],[22.474634,53.084316],[22.47578,53.084457],[22.47714,53.084677],[22.478462,53.084923],[22.479851,53.085235],[22.48138,53.085627],[22.482934,53.086091],[22.484689,53.086692],[22.486119,53.087266],[22.487155,53.087733],[22.488754,53.088513],[22.49094,53.089792],[22.494025,53.091745],[22.495119,53.092391],[22.495929,53.092839],[22.496543,53.093172],[22.497662,53.093718],[22.498766,53.094199],[22.500612,53.094922],[22.501625,53.095278],[22.50241,53.095539],[22.503709,53.095902],[22.505517,53.09635],[22.506972,53.096619],[22.511518,53.0974],[22.513525,53.09772],[22.515186,53.097925],[22.524415,53.099164],[22.525405,53.099305],[22.530376,53.100073],[22.53558,53.100924],[22.542914,53.102141],[22.551134,53.10351],[22.553062,53.103841],[22.554965,53.104186],[22.555602,53.104304],[22.558149,53.104807],[22.558952,53.104971],[22.562414,53.105692],[22.563699,53.105956],[22.565653,53.106327],[22.567541,53.106662],[22.571514,53.107338],[22.572616,53.107526],[22.578722,53.108503],[22.580291,53.108758],[22.58507,53.109536],[22.586328,53.10977],[22.587728,53.110057],[22.589764,53.110515],[22.591877,53.111088],[22.594331,53.111867],[22.595561,53.112307],[22.599076,53.113655],[22.599779,53.113918],[22.600876,53.114284],[22.602206,53.114684],[22.60331,53.114975],[22.604264,53.115218],[22.604901,53.115357],[22.605832,53.115537],[22.606612,53.115681],[22.607549,53.115834],[22.608544,53.115973],[22.609192,53.116054],[22.610238,53.116163],[22.61128,53.116254],[22.612013,53.116297],[22.614083,53.116355],[22.615768,53.11639],[22.620219,53.116468],[22.623212,53.116545],[22.624401,53.116604],[22.625612,53.116675],[22.626332,53.11672],[22.627003,53.116772],[22.628159,53.116864],[22.629768,53.117019],[22.631649,53.117233],[22.633813,53.117527],[22.635141,53.117717],[22.637827,53.118129],[22.641979,53.118802],[22.644656,53.119292],[22.64976,53.120363],[22.651596,53.12074],[22.652304,53.120875],[22.655007,53.121321],[22.658283,53.121841],[22.659349,53.12201],[22.664234,53.122785],[22.668533,53.123472],[22.669017,53.123547],[22.671739,53.123983],[22.676,53.124554],[22.677369,53.124733],[22.679355,53.124952],[22.684166,53.125488],[22.687318,53.125906],[22.689153,53.126162],[22.690861,53.126419],[22.693894,53.12694],[22.697079,53.127556],[22.698119,53.127771],[22.69952,53.128043],[22.701365,53.128396],[22.706547,53.129288],[22.709053,53.129687],[22.712165,53.130193],[22.717448,53.13104],[22.720934,53.1316],[22.727628,53.132678],[22.735836,53.134009],[22.741586,53.134941],[22.75752,53.137509],[22.760707,53.138025],[22.771534,53.139782],[22.785941,53.142121],[22.786851,53.142266],[22.804341,53.145103],[22.827378,53.14883],[22.828621,53.149022],[22.836724,53.150342],[22.837214,53.150418],[22.852483,53.152862],[22.855514,53.153358],[22.857594,53.15375],[22.86042,53.154275],[22.865867,53.155141],[22.86863,53.155587],[22.872398,53.156197],[22.873111,53.156311],[22.87383,53.156417],[22.875668,53.15666],[22.876705,53.156792],[22.878154,53.156986],[22.89579,53.159802],[22.92167,53.163935],[22.92272,53.1641],[22.923423,53.164189],[22.9243,53.164283],[22.925191,53.164358],[22.925688,53.164389],[22.926377,53.164414],[22.927361,53.164429],[22.928298,53.164425],[22.935348,53.164309],[22.938803,53.164234],[22.942668,53.164171],[22.944493,53.164144],[22.946457,53.164153],[22.948295,53.164146],[22.949313,53.16416],[22.950831,53.16417],[22.95294,53.164153],[22.958651,53.164055],[22.961642,53.164006],[22.96299,53.163973],[22.963899,53.163938],[22.964813,53.163874],[22.965648,53.163801],[22.96648,53.163705],[22.967311,53.163593],[22.968238,53.163426],[22.969318,53.163214],[22.970419,53.162959],[22.971333,53.162736],[22.973912,53.162095],[22.974614,53.161937],[22.976036,53.161644],[22.977562,53.161398],[22.979206,53.161183],[22.980282,53.16109],[22.981401,53.161029],[22.983499,53.160961],[22.986912,53.16086],[22.987877,53.160814],[22.989339,53.160704],[22.990479,53.160565],[22.991713,53.160366],[22.993638,53.160046],[22.995911,53.159628],[22.996117,53.159597],[22.996759,53.159484],[22.999502,53.158976],[23.001826,53.158569],[23.00808,53.157459],[23.009955,53.157113],[23.01179,53.156804],[23.013949,53.156488],[23.016008,53.156168],[23.018313,53.155767],[23.018314,53.155767],[23.027439,53.154128],[23.02944,53.153766],[23.035079,53.152747],[23.040535,53.15179],[23.045343,53.150944],[23.050319,53.150036],[23.052949,53.149563],[23.053744,53.149424],[23.055093,53.149197],[23.055861,53.149087],[23.056458,53.149019],[23.057058,53.148973],[23.057581,53.148947],[23.058225,53.148926],[23.05872,53.148922],[23.059246,53.148939],[23.059801,53.148971],[23.060695,53.149058],[23.061223,53.14912],[23.061611,53.14918],[23.061965,53.149248],[23.0624,53.149334],[23.062647,53.149385],[23.06287,53.149437],[23.062959,53.149457],[23.063546,53.149605],[23.065791,53.15021],[23.066579,53.150403],[23.067294,53.150539],[23.068696,53.150807],[23.069378,53.150966],[23.070074,53.151152],[23.070753,53.151337],[23.07181,53.151634],[23.073429,53.152073],[23.074087,53.152261],[23.076274,53.152871],[23.078589,53.153512],[23.081489,53.154313],[23.082198,53.154512],[23.083242,53.154797],[23.085589,53.155451],[23.087743,53.156096],[23.090168,53.15686],[23.090894,53.157089],[23.091505,53.157274],[23.092732,53.157668],[23.093694,53.157965],[23.096183,53.158678],[23.097216,53.158976],[23.099216,53.159533],[23.100013,53.159733],[23.100752,53.159885],[23.101526,53.160007],[23.102006,53.160062],[23.102483,53.160088],[23.102799,53.160102],[23.103179,53.160105],[23.103607,53.160099],[23.105571,53.160028],[23.106701,53.159981],[23.10728,53.15996],[23.107613,53.159946],[23.109668,53.159864],[23.113519,53.159719],[23.114259,53.159695],[23.118473,53.159523],[23.118953,53.159504],[23.121254,53.159415],[23.126936,53.159191],[23.129335,53.15911],[23.129857,53.159107],[23.130606,53.159112],[23.131338,53.159147],[23.13317,53.159248],[23.133632,53.159274],[23.134042,53.159293],[23.134218,53.159299],[23.134479,53.159307],[23.135319,53.159319],[23.136089,53.159333],[23.136692,53.159339],[23.139974,53.159394],[23.142544,53.159435],[23.145243,53.159492],[23.146612,53.159515],[23.147036,53.159483],[23.147433,53.159477],[23.147882,53.159435],[23.148217,53.159398],[23.148613,53.159351],[23.148962,53.159316],[23.149375,53.159276],[23.149888,53.15921],[23.150231,53.159163],[23.150647,53.159081],[23.150919,53.159002],[23.151235,53.158894],[23.151304,53.15887],[23.15183,53.158611],[23.151903,53.158814],[23.151917,53.158921],[23.151917,53.159016],[23.151901,53.159154],[23.151874,53.159262],[23.151831,53.159413],[23.151804,53.159549],[23.151791,53.159621],[23.151792,53.159717],[23.151802,53.159826],[23.15183,53.15997],[23.15186,53.160149],[23.151995,53.161144],[23.152028,53.161512],[23.152037,53.161728],[23.15203,53.161847],[23.152028,53.161915],[23.152014,53.162057],[23.151984,53.16223],[23.151939,53.162411],[23.151899,53.162543],[23.151845,53.162693],[23.151776,53.16284],[23.15173,53.162939],[23.15166,53.163068],[23.151585,53.163192],[23.151481,53.163349],[23.151393,53.163465],[23.151311,53.163574],[23.151184,53.163718],[23.151048,53.163853],[23.15084,53.164055],[23.150654,53.164217],[23.150442,53.164395],[23.149733,53.164967],[23.14949,53.165161],[23.14935,53.165283],[23.14912,53.1655],[23.148938,53.165701],[23.148784,53.165902],[23.148665,53.166078],[23.148575,53.166231],[23.148494,53.166386],[23.148432,53.166523],[23.148363,53.166701],[23.148306,53.166886],[23.14825,53.167101],[23.148113,53.167649],[23.147968,53.168239],[23.147869,53.168628],[23.147695,53.169329],[23.147395,53.170534],[23.147125,53.171631],[23.146906,53.172481],[23.146842,53.172774],[23.146813,53.172899],[23.146791,53.173005],[23.146778,53.173123],[23.146773,53.17318],[23.146759,53.173442],[23.146766,53.173585],[23.146773,53.17369],[23.146788,53.173829],[23.146885,53.174436],[23.147,53.1751],[23.147025,53.175245],[23.147158,53.176044],[23.147372,53.177333],[23.147486,53.178169],[23.1476,53.179088],[23.14767,53.179663],[23.14781,53.180881],[23.147873,53.181472],[23.147937,53.181993],[23.148008,53.182593],[23.148076,53.18305],[23.148123,53.183352],[23.148167,53.183592],[23.148217,53.183785],[23.148251,53.183919],[23.148315,53.184116],[23.148383,53.184309],[23.148465,53.184494],[23.148543,53.184661],[23.148669,53.184902],[23.148786,53.185112],[23.149064,53.185555],[23.149557,53.186318],[23.1506,53.187907],[23.151746,53.189656],[23.152116,53.190221],[23.153365,53.192121],[23.15393,53.19298],[23.154424,53.193742],[23.154642,53.194101],[23.154858,53.19448],[23.154972,53.194689],[23.155061,53.194877],[23.155182,53.195144],[23.1553,53.195438],[23.155417,53.195758],[23.155496,53.196017],[23.155552,53.196233],[23.155604,53.196456],[23.15566,53.196727],[23.155701,53.196991],[23.155733,53.197268],[23.155746,53.197463],[23.155755,53.197718],[23.155746,53.197949],[23.155726,53.198178],[23.155705,53.198349],[23.155665,53.198541],[23.155632,53.198694],[23.155562,53.198942],[23.155484,53.199161],[23.155409,53.199344],[23.155311,53.199549],[23.155121,53.199904],[23.155014,53.200065],[23.154753,53.200476],[23.154575,53.200756],[23.154433,53.200992],[23.154303,53.201222],[23.154215,53.20141],[23.154143,53.201551],[23.15409,53.201683],[23.153992,53.201939],[23.153934,53.202128],[23.153888,53.202326],[23.153849,53.202518],[23.153815,53.202759],[23.153787,53.202977],[23.153776,53.203183],[23.153765,53.203413],[23.153739,53.205162],[23.153697,53.208182],[23.153694,53.208374],[23.153704,53.208575],[23.153723,53.208767],[23.153738,53.208946],[23.153759,53.209124],[23.153796,53.209308],[23.153829,53.209469],[23.153862,53.209592],[23.153903,53.209718],[23.153961,53.209884],[23.154024,53.210039],[23.154091,53.210185],[23.154162,53.210326],[23.154203,53.210406],[23.154298,53.210583],[23.154393,53.210748],[23.154568,53.21103],[23.154749,53.21131],[23.154965,53.211625],[23.155207,53.212007],[23.15535,53.212244],[23.155439,53.212401],[23.155518,53.212548],[23.155667,53.212866],[23.155749,53.213062],[23.155816,53.213239],[23.155869,53.213398],[23.155897,53.213485],[23.156012,53.213959],[23.156036,53.214085],[23.156061,53.214267],[23.156091,53.214484],[23.156106,53.214692],[23.156113,53.214953],[23.156111,53.215218],[23.156105,53.215454],[23.156176,53.215674],[23.156239,53.215894],[23.156305,53.216014],[23.156374,53.216093],[23.156468,53.216195],[23.156565,53.216267],[23.156708,53.216351],[23.156873,53.216429],[23.157353,53.216634],[23.157555,53.216732],[23.157779,53.216863],[23.157919,53.216958],[23.158064,53.217078],[23.158185,53.217192],[23.15831,53.217335],[23.15842,53.217485],[23.158618,53.217876],[23.158705,53.21801],[23.158794,53.218105],[23.158937,53.218225],[23.159087,53.218321],[23.159227,53.218374],[23.159659,53.218548],[23.162665,53.219073],[23.164358,53.219403],[23.16703,53.219917],[23.167529,53.220025],[23.167784,53.220059],[23.169205,53.220229],[23.170165,53.220314],[23.170899,53.220375],[23.171896,53.220437],[23.172591,53.220463],[23.174634,53.220486],[23.176407,53.220442],[23.177279,53.220405],[23.177667,53.22038],[23.179073,53.220263],[23.181036,53.220061],[23.183969,53.219756],[23.187068,53.219426],[23.189302,53.219182],[23.192624,53.21883],[23.195667,53.218513],[23.197344,53.218377],[23.197925,53.218345],[23.198441,53.218319],[23.199161,53.218295],[23.19949,53.21829],[23.199793,53.218285],[23.200497,53.218288],[23.201247,53.218297],[23.202677,53.218348],[23.203642,53.218418],[23.203706,53.218423],[23.204519,53.218494],[23.205462,53.218595],[23.206449,53.218729],[23.206973,53.218809],[23.207233,53.218828],[23.208706,53.219048],[23.209533,53.219187],[23.210195,53.219334],[23.21083,53.219492],[23.21135,53.219623],[23.212,53.219797],[23.21264,53.219986],[23.214169,53.220518],[23.215664,53.221098],[23.216212,53.221337],[23.217366,53.221878],[23.21817,53.222288],[23.218501,53.222469],[23.219182,53.222871],[23.220135,53.223466],[23.220554,53.223737],[23.220992,53.224047],[23.22154,53.224443],[23.22186,53.224706],[23.222255,53.225032],[23.222712,53.225416],[23.22301,53.225704],[23.223281,53.226],[23.223807,53.226623],[23.223855,53.226747],[23.224808,53.2279],[23.226581,53.230132],[23.228417,53.232443],[23.229697,53.234047],[23.230959,53.235614],[23.231879,53.236754],[23.233934,53.239307],[23.235899,53.241723],[23.236662,53.242661],[23.237808,53.244089],[23.238955,53.24552],[23.241226,53.24834],[23.241897,53.249174],[23.242569,53.250006],[23.243204,53.250783],[23.243453,53.251092],[23.24357,53.25124],[23.243673,53.251358],[23.24374,53.251432],[23.243889,53.251586],[23.244021,53.251715],[23.244149,53.25183],[23.244514,53.252147],[23.24589,53.253332],[23.247933,53.25505],[23.250684,53.25737],[23.250807,53.257476],[23.251562,53.258116],[23.252677,53.259061],[23.254506,53.260607],[23.25829,53.26384],[23.260262,53.265529],[23.262215,53.267194],[23.266846,53.271156],[23.267016,53.271302],[23.275215,53.278338],[23.279411,53.281928],[23.281532,53.283743],[23.28364,53.285549],[23.284649,53.286418],[23.288232,53.289505],[23.290318,53.291319],[23.290775,53.291715],[23.290868,53.291795],[23.293222,53.29384],[23.29503,53.295411],[23.296044,53.296294],[23.296142,53.296376],[23.296184,53.296413],[23.296317,53.296528],[23.297083,53.297185],[23.297134,53.29723],[23.29759,53.297623],[23.298224,53.29817],[23.298351,53.29828],[23.298677,53.298564],[23.298865,53.298713],[23.299017,53.298822],[23.299167,53.298919],[23.299361,53.299036],[23.299605,53.299173],[23.302147,53.300543],[23.303101,53.301053],[23.303586,53.301317],[23.304683,53.301916],[23.305198,53.302197],[23.305595,53.302409],[23.306226,53.30275],[23.308449,53.303952],[23.309046,53.304275],[23.312472,53.306135],[23.315283,53.307654],[23.317603,53.3089],[23.31812,53.309178],[23.323751,53.312215],[23.328569,53.314798],[23.333373,53.317373],[23.342954,53.322506],[23.344615,53.323388],[23.346253,53.324268],[23.350538,53.326585],[23.354334,53.328646],[23.356335,53.329736],[23.358219,53.330741],[23.358528,53.33091],[23.35853,53.330911],[23.358741,53.331026],[23.358905,53.331108],[23.359066,53.331184],[23.359252,53.331263],[23.359431,53.331331],[23.359606,53.33139],[23.359742,53.33143],[23.359931,53.331482],[23.360095,53.331519],[23.360268,53.331554],[23.360476,53.331588],[23.360663,53.331614],[23.360851,53.331634],[23.361017,53.331647],[23.361182,53.331655],[23.361382,53.331658],[23.361601,53.331655],[23.361872,53.331645],[23.363207,53.331566],[23.364513,53.331482],[23.366231,53.331381],[23.367933,53.331276],[23.368739,53.331239],[23.369125,53.331222],[23.369446,53.331212],[23.369648,53.331207],[23.370185,53.331202],[23.370675,53.331197],[23.371311,53.331199],[23.372017,53.331216],[23.373011,53.331256],[23.373819,53.331306],[23.37443,53.331353],[23.375062,53.33141],[23.37545,53.331451],[23.376671,53.331601],[23.376967,53.331644],[23.377121,53.331667],[23.377803,53.331771],[23.378254,53.331848],[23.378776,53.331938],[23.379274,53.332026],[23.380381,53.332222],[23.381882,53.332483],[23.382962,53.332675],[23.384153,53.332887],[23.385838,53.333178],[23.38629,53.333258],[23.386779,53.333336],[23.387019,53.333373],[23.387237,53.333404],[23.387635,53.333449],[23.389166,53.333598],[23.394162,53.334087],[23.395045,53.334179],[23.395263,53.334206],[23.395453,53.334235],[23.395661,53.334273],[23.39584,53.33431],[23.396026,53.334357],[23.396205,53.334411],[23.396465,53.334498],[23.396621,53.334561],[23.396759,53.334621],[23.396923,53.334699],[23.397074,53.33478],[23.397211,53.334861],[23.397322,53.334937],[23.39745,53.335034],[23.397612,53.335174],[23.397731,53.335289],[23.397852,53.335415],[23.397998,53.33558],[23.399608,53.337477],[23.400509,53.338537],[23.401223,53.339376],[23.402021,53.340309],[23.402063,53.340359],[23.402364,53.340711],[23.404222,53.342884],[23.405563,53.344471],[23.407387,53.346629],[23.407598,53.346879],[23.407638,53.346926],[23.407813,53.347131],[23.408208,53.347598],[23.409093,53.348645],[23.40922,53.348794],[23.409446,53.34906],[23.410037,53.349758],[23.410323,53.350096],[23.412504,53.352678],[23.413473,53.353826],[23.416314,53.357164],[23.418377,53.359622],[23.419469,53.360903],[23.42046,53.362067],[23.421618,53.363448],[23.421884,53.363761],[23.42246,53.364429],[23.424764,53.367141],[23.426441,53.369099],[23.426884,53.369615],[23.428114,53.371051],[23.428847,53.371905],[23.429075,53.372172],[23.429262,53.372376],[23.429485,53.372603],[23.429638,53.372729],[23.429794,53.372846],[23.429877,53.372911],[23.429983,53.372985],[23.430147,53.373081],[23.43031,53.373172],[23.431059,53.373566],[23.431286,53.373681],[23.431671,53.373878],[23.431808,53.373948],[23.432609,53.374361],[23.435751,53.375964],[23.438426,53.377341],[23.439561,53.377927],[23.440666,53.378497],[23.442461,53.379423],[23.442781,53.379588],[23.444591,53.380522],[23.44569,53.381085],[23.447786,53.38216],[23.449873,53.383234],[23.451465,53.38405],[23.453081,53.38487],[23.457072,53.386922],[23.457074,53.386923],[23.457138,53.386956],[23.459372,53.388104],[23.461211,53.389048],[23.461604,53.389249],[23.461916,53.389408],[23.462871,53.389896],[23.463996,53.390476],[23.465038,53.391006],[23.465985,53.391489],[23.467289,53.392158],[23.467612,53.392324],[23.468793,53.392911],[23.470944,53.393999],[23.47108,53.394059],[23.471946,53.394502],[23.472254,53.394656],[23.472754,53.394895],[23.473825,53.395418],[23.47393,53.39547],[23.474896,53.395945],[23.475539,53.396261],[23.475592,53.396288],[23.476931,53.396947],[23.478433,53.397694],[23.478599,53.397777],[23.480219,53.398571],[23.480392,53.398658],[23.483149,53.400018],[23.483353,53.400118],[23.483561,53.400225],[23.484134,53.400507],[23.484203,53.400541],[23.484787,53.400833],[23.48507,53.400975],[23.48585,53.401353],[23.486009,53.401435],[23.486178,53.401518],[23.486299,53.401579],[23.486534,53.401698],[23.487605,53.402236],[23.48767,53.402267],[23.488014,53.402436],[23.488294,53.402567],[23.488576,53.402674],[23.489465,53.402977],[23.489717,53.40306],[23.490479,53.403313],[23.491823,53.403768],[23.49254,53.404009],[23.492677,53.404056],[23.492901,53.404133],[23.493231,53.404246],[23.49363,53.40438],[23.494187,53.404568],[23.494757,53.404764],[23.494945,53.404822],[23.495048,53.40486],[23.495517,53.405],[23.496004,53.40514],[23.496213,53.405195],[23.496668,53.405306],[23.496875,53.405352],[23.497056,53.40539],[23.49743,53.40548],[23.497582,53.405515],[23.497933,53.405599],[23.49871,53.405779],[23.498846,53.405805],[23.498954,53.405824],[23.499057,53.405836],[23.499153,53.405847],[23.49924,53.405852],[23.499362,53.405852],[23.499519,53.405847],[23.500184,53.405828],[23.500399,53.405821],[23.50071,53.405813],[23.500902,53.40581],[23.501054,53.405812],[23.50118,53.40582],[23.501346,53.405835],[23.501502,53.405851],[23.50161,53.405869],[23.501738,53.405893],[23.502196,53.40599],[23.502297,53.406011],[23.503227,53.406166],[23.503445,53.406216],[23.503641,53.406262],[23.50385,53.406308],[23.504524,53.406505],[23.504628,53.406531],[23.505061,53.406633],[23.505434,53.406722],[23.505649,53.406766],[23.50584,53.406799],[23.505938,53.406816],[23.50609,53.406842],[23.506701,53.406939],[23.508583,53.407241],[23.509273,53.407355],[23.509454,53.407385],[23.509574,53.407406],[23.50972,53.407434],[23.512107,53.407927],[23.513052,53.408123],[23.513214,53.408163],[23.513359,53.4082],[23.513521,53.408254],[23.513631,53.408292],[23.513747,53.408343],[23.513855,53.408397],[23.51401,53.408491],[23.514071,53.408529],[23.514188,53.408609],[23.514353,53.408723],[23.514807,53.409064],[23.515626,53.409708],[23.515922,53.409944],[23.517236,53.410995],[23.518381,53.411917],[23.519691,53.412971],[23.51979,53.413051],[23.519955,53.413187],[23.520451,53.413586],[23.521348,53.414309],[23.522794,53.415463],[23.522872,53.415524],[23.523734,53.416221],[23.52424,53.416631],[23.524847,53.417111],[23.525133,53.41734],[23.525171,53.417371],[23.525204,53.417398],[23.52566,53.417762],[23.52753,53.419269],[23.528601,53.420131],[23.530283,53.42147],[23.536912,53.426793],[23.539262,53.428685],[23.539828,53.429157],[23.54181,53.430743],[23.543475,53.432081],[23.543605,53.432186],[23.54599,53.434096],[23.546334,53.434375],[23.548114,53.435807],[23.551926,53.438874],[23.556266,53.442363],[23.560957,53.446109],[23.56114,53.44626],[23.563468,53.448135],[23.563664,53.448293],[23.566392,53.450487],[23.566695,53.450723],[23.569323,53.452832],[23.569545,53.45301],[23.573829,53.456437],[23.574114,53.456663],[23.57789,53.459676],[23.578988,53.460552],[23.580092,53.461434],[23.581175,53.462299],[23.58371,53.464335],[23.584531,53.464986],[23.586559,53.466608],[23.587118,53.467056],[23.588783,53.46839],[23.588974,53.468543],[23.590915,53.470102],[23.59604,53.474192],[23.596215,53.474335],[23.598283,53.475982],[23.599317,53.476805],[23.601733,53.478733],[23.604079,53.480607],[23.60517,53.481479],[23.60744,53.483292],[23.609893,53.485256],[23.610921,53.486082],[23.611178,53.486287],[23.612468,53.487318],[23.614761,53.489149],[23.616887,53.490841],[23.62005,53.49337],[23.62049,53.493721],[23.621612,53.494613],[23.621925,53.494865],[23.622121,53.495013],[23.622349,53.495179],[23.622562,53.495322],[23.622756,53.495442],[23.622807,53.495473],[23.623014,53.495598],[23.623245,53.495725],[23.623679,53.495958],[23.624742,53.496507],[23.625402,53.496847],[23.625921,53.497116],[23.628744,53.498573],[23.631445,53.499967],[23.635042,53.501837],[23.635976,53.502327],[23.63645,53.502576],[23.636709,53.502713],[23.638299,53.503543],[23.638963,53.503893],[23.639489,53.504172],[23.639582,53.504224],[23.6403,53.504596],[23.641423,53.505182],[23.64159,53.505265],[23.641739,53.50534],[23.642058,53.505505],[23.642351,53.505666],[23.642562,53.505779],[23.642777,53.505906],[23.643032,53.50607],[23.643302,53.506246],[23.645795,53.508051],[23.64718,53.509057],[23.647673,53.50941],[23.64814,53.509752],[23.649436,53.510692],[23.649579,53.510788],[23.649718,53.51091],[23.649981,53.511156],[23.650185,53.511365],[23.650394,53.511596],[23.6506,53.511825],[23.650833,53.512143],[23.650974,53.512355],[23.651093,53.512559],[23.651196,53.512745],[23.651287,53.512944],[23.651381,53.513167],[23.651467,53.513426],[23.651585,53.513848],[23.651652,53.514074],[23.652257,53.516226],[23.652652,53.517611],[23.652684,53.517733],[23.652719,53.517819],[23.652827,53.518019],[23.652932,53.518177],[23.653049,53.518313],[23.653162,53.518432],[23.653311,53.51856],[23.653473,53.518689],[23.653652,53.518804],[23.653819,53.518907],[23.653989,53.518997],[23.654153,53.519072],[23.654388,53.519181],[23.654901,53.519344],[23.655067,53.519409],[23.655179,53.519457],[23.655359,53.519538],[23.655446,53.519577],[23.655612,53.51965],[23.655798,53.519738],[23.655874,53.519774],[23.656006,53.519846],[23.656061,53.519876],[23.656406,53.520049],[23.656654,53.520149],[23.656747,53.52029],[23.656952,53.52043],[23.657188,53.520543],[23.657222,53.520557],[23.657278,53.520579],[23.657767,53.520782],[23.65849,53.521091],[23.658764,53.521076],[23.658969,53.52116],[23.659073,53.521202],[23.659109,53.521218],[23.659201,53.521257],[23.659233,53.521274],[23.659288,53.521298],[23.659324,53.521313],[23.659537,53.521409],[23.659642,53.521457],[23.659876,53.521563],[23.660162,53.521693],[23.660578,53.52189],[23.660796,53.521987],[23.66139,53.522251],[23.662987,53.522962],[23.664316,53.523553],[23.66445,53.523581],[23.665475,53.523509],[23.665725,53.523597],[23.666109,53.523745],[23.666239,53.523786],[23.666419,53.52379],[23.667151,53.523734],[23.667223,53.523697],[23.66727,53.52365],[23.667418,53.523494],[23.667521,53.523385],[23.667658,53.523315],[23.667902,53.523293],[23.667967,53.523287],[23.668082,53.523276],[23.668269,53.523289],[23.669224,53.523732],[23.669363,53.523802],[23.669478,53.523836],[23.669958,53.524054],[23.670675,53.524387],[23.670797,53.524438],[23.670828,53.524452],[23.671139,53.524596],[23.672466,53.525212],[23.674235,53.52606],[23.674605,53.526244],[23.674689,53.526286],[23.677121,53.527496],[23.678387,53.52812],[23.681664,53.529734],[23.682567,53.530175],[23.682612,53.530148],[23.682669,53.530132],[23.682732,53.530127],[23.682794,53.530135],[23.682834,53.530148],[23.682849,53.530153],[23.682892,53.530181],[23.682918,53.530215],[23.682924,53.530253],[23.68291,53.530289],[23.682878,53.530322],[23.683416,53.530584],[23.684098,53.530907],[23.684221,53.530972],[23.685632,53.531719],[23.686565,53.532256],[23.687494,53.532848],[23.687566,53.532897],[23.688588,53.533582],[23.689871,53.534454],[23.689945,53.534509],[23.691001,53.535296],[23.691738,53.535898],[23.692122,53.536243],[23.693416,53.537479],[23.694219,53.538286],[23.695003,53.539092],[23.695443,53.539559],[23.696582,53.540745],[23.697578,53.541772],[23.697862,53.542051],[23.698963,53.543205],[23.699839,53.544105],[23.700863,53.54517],[23.701578,53.545919],[23.702605,53.546992],[23.703336,53.547753],[23.703995,53.548421],[23.704196,53.548704],[23.704879,53.549411],[23.705103,53.549635],[23.705399,53.549901],[23.70574,53.550198],[23.7062,53.550538],[23.706713,53.550903],[23.707244,53.551228],[23.707633,53.55145],[23.707895,53.551594],[23.708178,53.55174],[23.708496,53.551894],[23.708914,53.55209],[23.709719,53.55242],[23.710224,53.552614],[23.710694,53.55277],[23.71108,53.552897],[23.711887,53.553093],[23.712549,53.553244],[23.713298,53.553394],[23.713731,53.553465],[23.714308,53.55356],[23.715059,53.553677],[23.716174,53.553812],[23.716885,53.553866],[23.717647,53.553888],[23.718556,53.553855],[23.719821,53.55379],[23.721785,53.553669],[23.72765,53.553271],[23.728219,53.553236],[23.729921,53.553133],[23.731003,53.553038],[23.732019,53.552902],[23.733412,53.552686],[23.735208,53.552364],[23.737048,53.552041],[23.739679,53.551609],[23.740676,53.551445],[23.74159,53.551298],[23.742414,53.551177],[23.743228,53.551058],[23.74686,53.550713],[23.7539,53.550102],[23.75618,53.549872],[23.75702,53.54978],[23.758395,53.549653],[23.761924,53.549331],[23.763478,53.549192],[23.764913,53.548995],[23.766404,53.548772],[23.76748,53.548603],[23.769215,53.548297],[23.770937,53.547981],[23.773801,53.547457],[23.77544,53.547169],[23.777589,53.546788],[23.778967,53.546538],[23.780692,53.546238],[23.781737,53.546054],[23.782619,53.54593],[23.78336,53.545846],[23.783847,53.545811],[23.784385,53.545784],[23.785331,53.545759],[23.785956,53.545745],[23.786632,53.545736],[23.786915,53.545737],[23.787411,53.545752],[23.787509,53.54576],[23.788059,53.545797],[23.788628,53.54585],[23.789154,53.545911],[23.78989,53.546001],[23.7906,53.546112],[23.791456,53.546264],[23.792337,53.546444],[23.792977,53.546597],[23.794934,53.547107],[23.79797,53.547854],[23.799496,53.548216],[23.800599,53.548467],[23.80171,53.548685],[23.802455,53.548826],[23.802936,53.548917],[23.804259,53.54914],[23.805269,53.5493],[23.806122,53.549409],[23.807021,53.549513],[23.808403,53.549643],[23.809949,53.549733],[23.81119,53.549798],[23.814234,53.549959],[23.815515,53.550027],[23.816041,53.550055],[23.817104,53.550106],[23.82091,53.550289],[23.823824,53.550418],[23.826044,53.550533],[23.828936,53.550662],[23.830334,53.550731],[23.832284,53.55082],[23.833111,53.550859],[23.834645,53.55092],[23.836106,53.550988],[23.839211,53.551163],[23.841383,53.551298],[23.843312,53.551418],[23.844241,53.551497],[23.845138,53.551596],[23.846868,53.551765],[23.850702,53.552099],[23.853032,53.552321],[23.855401,53.552543],[23.857573,53.55274],[23.859469,53.552902],[23.860581,53.552991],[23.861301,53.55303],[23.861744,53.553054],[23.862949,53.553103],[23.86371,53.553118],[23.864261,53.553124],[23.864563,53.553124],[23.864972,53.553124],[23.865789,53.553107],[23.866275,53.553096],[23.866752,53.553082],[23.867399,53.553062],[23.869763,53.553007],[23.872499,53.552951],[23.872619,53.552948],[23.873715,53.552919],[23.873892,53.552913],[23.8769,53.55285],[23.878532,53.552783],[23.879706,53.552768],[23.880424,53.552774],[23.880877,53.552785],[23.881568,53.552817],[23.8823,53.552866],[23.883056,53.552942],[23.884434,53.553122],[23.88568,53.553322],[23.886183,53.553414],[23.88654,53.553491],[23.887056,53.553608],[23.887496,53.553716],[23.888343,53.55398],[23.888945,53.55418],[23.88977,53.554478],[23.890086,53.554608],[23.890908,53.55497],[23.891395,53.555185],[23.891954,53.555459],[23.892485,53.555751],[23.89326,53.556224],[23.893872,53.556623],[23.894429,53.557046],[23.894863,53.557405],[23.896424,53.558709],[23.898087,53.560109],[23.898928,53.560802],[23.899039,53.560894],[23.900345,53.561984],[23.902305,53.563621],[23.904055,53.565068],[23.905041,53.565872],[23.906773,53.567303],[23.908971,53.569126],[23.909387,53.569488],[23.910432,53.570353],[23.91403,53.573343],[23.917609,53.576309],[23.918988,53.577451],[23.920592,53.578774],[23.921887,53.579807],[23.922519,53.580308],[23.922677,53.580428],[23.923279,53.580873],[23.923396,53.580974],[23.923951,53.581396],[23.924685,53.581932],[23.925426,53.582465],[23.926211,53.583037],[23.926315,53.583112],[23.926327,53.583122],[23.92635,53.583142],[23.926732,53.583415],[23.926906,53.583538],[23.926937,53.583561],[23.927005,53.583605],[23.927468,53.583929],[23.928972,53.58499],[23.929979,53.585632],[23.930075,53.585699],[23.931273,53.586477],[23.931763,53.586794],[23.933636,53.587968],[23.935315,53.58902],[23.936855,53.589999],[23.938634,53.591103],[23.940019,53.591941],[23.941219,53.592644],[23.941979,53.593088],[23.94386,53.594185],[23.945855,53.595355],[23.946856,53.595943],[23.9473,53.596205],[23.948743,53.597044],[23.948899,53.597136],[23.950377,53.598003],[23.950978,53.598353],[23.951839,53.598855],[23.953938,53.600079],[23.955629,53.601068],[23.957074,53.601921],[23.960067,53.603666],[23.960433,53.603881],[23.961566,53.604576],[23.961654,53.60463],[23.962321,53.605072],[23.963038,53.605571],[23.963845,53.606159],[23.964619,53.606782],[23.965241,53.607301],[23.966024,53.608025],[23.966581,53.608581],[23.967208,53.60925],[23.967798,53.609933],[23.968357,53.610625],[23.968865,53.61131],[23.969276,53.611923],[23.969467,53.612251],[23.969695,53.612645],[23.970672,53.614381],[23.971464,53.615835],[23.971831,53.616496],[23.972241,53.617161],[23.972603,53.617704],[23.973078,53.618361],[23.97353,53.618913],[23.973878,53.619344],[23.974319,53.619824],[23.974895,53.620432],[23.975084,53.620619],[23.975449,53.620979],[23.976017,53.62149],[23.976397,53.621833],[23.976788,53.622185],[23.977124,53.62245],[23.977508,53.622754],[23.978294,53.623336],[23.978702,53.62363],[23.979456,53.624126],[23.979799,53.624351],[23.980519,53.6248],[23.981165,53.625175],[23.981784,53.625522],[23.982509,53.625915],[23.983503,53.626446],[23.984129,53.626781],[23.984413,53.626933],[23.987239,53.628476],[23.987665,53.628698],[23.988063,53.628901],[23.988657,53.62921],[23.9892,53.629505],[23.990608,53.630269],[23.99195,53.630997],[23.993052,53.631599],[23.994346,53.632307],[23.994469,53.632374],[23.995024,53.632681],[23.995487,53.632952],[23.996131,53.633342],[23.996527,53.633577],[23.997054,53.633883],[23.997914,53.634486],[23.998606,53.634977],[23.999165,53.635396],[23.999527,53.635663],[24.000273,53.636269],[24.000802,53.636722],[24.001299,53.637174],[24.001749,53.637584],[24.002171,53.638002],[24.002586,53.638424],[24.003236,53.639122],[24.004063,53.639964],[24.004888,53.640835],[24.00522,53.64118],[24.005769,53.641566],[24.00604,53.641701],[24.00636,53.64181],[24.006843,53.641937],[24.007655,53.642108],[24.008096,53.642175],[24.008484,53.642206],[24.008889,53.642199],[24.009215,53.642158],[24.009504,53.642097],[24.009871,53.641986],[24.010227,53.641873],[24.010499,53.641791],[24.011478,53.641377],[24.012996,53.640735],[24.017593,53.638763],[24.018655,53.638311],[24.021558,53.637064],[24.023687,53.636153],[24.025036,53.635577],[24.026844,53.634805],[24.027243,53.634624],[24.032941,53.632182],[24.033542,53.631924],[24.035628,53.631029],[24.037146,53.630378],[24.037945,53.630033],[24.040365,53.628952],[24.042234,53.628189],[24.048348,53.62557],[24.04882,53.62537],[24.050872,53.624486],[24.052607,53.623741],[24.055186,53.622628],[24.058199,53.62133],[24.059071,53.620963],[24.059945,53.620595],[24.060928,53.620229],[24.061717,53.61995],[24.062586,53.619658],[24.062955,53.619545],[24.064305,53.61913],[24.065848,53.618698],[24.066997,53.618341],[24.068129,53.617963],[24.068419,53.617869],[24.068702,53.617776],[24.070342,53.617243],[24.072312,53.616601],[24.073022,53.616368],[24.073446,53.616229],[24.074288,53.615952],[24.075632,53.615514],[24.076098,53.615362],[24.078336,53.614633],[24.081641,53.613536],[24.082002,53.613417],[24.083979,53.612763],[24.084198,53.612691],[24.084382,53.61263],[24.084431,53.612614],[24.084752,53.612507],[24.085183,53.612354],[24.086141,53.612039],[24.08657,53.611885],[24.086671,53.611849],[24.086886,53.611771],[24.087259,53.611634],[24.088338,53.611234],[24.088864,53.611035],[24.089616,53.61075],[24.090611,53.610409],[24.09172,53.610047],[24.091844,53.610006],[24.094421,53.609144],[24.099607,53.607417],[24.10307,53.606263],[24.104017,53.605958],[24.104612,53.60579],[24.108175,53.604809],[24.111737,53.603833],[24.113122,53.603446],[24.115145,53.602881],[24.118421,53.601978],[24.122791,53.600771],[24.124552,53.600285],[24.125208,53.600104],[24.125976,53.599891],[24.12683,53.599654],[24.129455,53.598926],[24.130668,53.598589],[24.132042,53.598219],[24.132802,53.598014],[24.134878,53.597482],[24.138104,53.596631],[24.14109,53.595849],[24.141361,53.595779],[24.143051,53.595322],[24.143975,53.595072],[24.145862,53.594562],[24.14871,53.593817],[24.150494,53.593366],[24.151781,53.593049],[24.153197,53.592692],[24.15462,53.592346],[24.155934,53.592026],[24.157852,53.591547],[24.160492,53.590912],[24.163514,53.590191],[24.165596,53.58971],[24.166314,53.58954],[24.168587,53.589003],[24.169926,53.588687],[24.171891,53.588199],[24.17379,53.587696],[24.175361,53.587272],[24.176772,53.586876],[24.178883,53.586268],[24.181592,53.585482],[24.182362,53.585258],[24.182981,53.585081],[24.184163,53.584753],[24.184319,53.584709],[24.185255,53.584472],[24.185821,53.584338],[24.186556,53.584194],[24.187377,53.584052],[24.188174,53.583942],[24.188974,53.583863],[24.189652,53.583812],[24.190345,53.58378],[24.190993,53.583751],[24.192631,53.583733],[24.193093,53.583732],[24.1941,53.583752],[24.195664,53.583802],[24.197197,53.583857],[24.197934,53.583878],[24.198936,53.583908],[24.200609,53.583959],[24.201769,53.584003],[24.202904,53.584031],[24.203744,53.584056],[24.206159,53.584127],[24.207781,53.584182],[24.209262,53.584214],[24.209832,53.584218],[24.210856,53.584222],[24.211609,53.584211],[24.211729,53.584209],[24.212831,53.58418],[24.21355,53.58415],[24.214543,53.584096],[24.216416,53.583962],[24.217237,53.583893],[24.218085,53.583809],[24.219598,53.58365],[24.22141,53.583384],[24.222757,53.583168],[24.223932,53.582956],[24.224864,53.582778],[24.225993,53.582535],[24.227324,53.582249],[24.228868,53.581865],[24.23021,53.581494],[24.231773,53.581062],[24.235221,53.580149],[24.236446,53.57985],[24.237208,53.579681],[24.238606,53.579401],[24.239829,53.579175],[24.240447,53.579076],[24.241314,53.578945],[24.242196,53.578822],[24.24422,53.578579],[24.245205,53.578454],[24.246287,53.578356],[24.246825,53.578311],[24.248375,53.578206],[24.249192,53.578171],[24.250108,53.578143],[24.251417,53.578114],[24.252402,53.578105],[24.253279,53.57811],[24.254134,53.578125],[24.254763,53.578146],[24.255487,53.578176],[24.256334,53.578216],[24.257011,53.578251],[24.257278,53.578264],[24.257569,53.578285],[24.258541,53.578356],[24.259387,53.578433],[24.260428,53.578532],[24.261169,53.578615],[24.261915,53.578723],[24.263017,53.578862],[24.26426,53.579052],[24.265202,53.579204],[24.266246,53.579394],[24.267265,53.579599],[24.26744,53.579634],[24.268687,53.579909],[24.269795,53.580182],[24.270139,53.580272],[24.27076,53.580435],[24.271944,53.58076],[24.273578,53.581223],[24.27425,53.58141],[24.274918,53.581578],[24.275571,53.581732],[24.276219,53.581871],[24.276884,53.581986],[24.27763,53.5821],[24.278575,53.582218],[24.27929,53.582287],[24.280299,53.582347],[24.281271,53.582384],[24.282174,53.582385],[24.283212,53.582348],[24.283898,53.582301],[24.284253,53.582277],[24.285566,53.582128],[24.287007,53.581947],[24.288408,53.581754],[24.289831,53.581574],[24.294429,53.580978],[24.298104,53.580508],[24.299509,53.580324],[24.301709,53.580036],[24.307098,53.579343],[24.312733,53.578613],[24.313529,53.57851],[24.314916,53.57833],[24.315221,53.57829],[24.323684,53.577185],[24.324391,53.577101],[24.324518,53.577084],[24.325021,53.577017],[24.326129,53.576877],[24.327126,53.576751],[24.329794,53.576399],[24.335186,53.575696],[24.340492,53.575009],[24.341814,53.574836],[24.344033,53.574546],[24.345591,53.574345],[24.346656,53.574257],[24.347554,53.574201],[24.348567,53.574185],[24.34918,53.574184],[24.349766,53.574198],[24.350958,53.574256],[24.351822,53.574329],[24.352853,53.574447],[24.354218,53.574612],[24.355615,53.574781],[24.356779,53.574916],[24.358306,53.575101],[24.360912,53.575416],[24.362659,53.575627],[24.365613,53.57599],[24.368526,53.576342],[24.373246,53.576917],[24.373609,53.576961],[24.378495,53.577554],[24.381107,53.577877],[24.383739,53.578185],[24.384941,53.578326],[24.38706,53.578576],[24.387969,53.578687],[24.390039,53.578941],[24.39102,53.579058],[24.393977,53.579409],[24.397905,53.579894],[24.403105,53.5805],[24.403372,53.580531],[24.405579,53.580788],[24.407471,53.581007],[24.409316,53.581233],[24.411148,53.581444],[24.412532,53.581611],[24.413678,53.581749],[24.414206,53.581811],[24.417247,53.582169],[24.418758,53.582344],[24.42024,53.582523],[24.424081,53.582975],[24.424739,53.583052],[24.426165,53.583214],[24.427835,53.583374],[24.429243,53.583482],[24.430953,53.583588],[24.432629,53.583668],[24.432666,53.58367],[24.434609,53.583749],[24.442512,53.584067],[24.445758,53.584188],[24.447398,53.584259],[24.449101,53.584331],[24.451549,53.584456],[24.452571,53.584522],[24.453626,53.584601],[24.454662,53.584675],[24.455857,53.584767],[24.459045,53.585012],[24.462345,53.585279],[24.464563,53.585459],[24.468144,53.585753],[24.470173,53.585919],[24.472261,53.58609],[24.472749,53.586125],[24.476585,53.586431],[24.477316,53.586492],[24.478063,53.586553],[24.480545,53.586758],[24.480806,53.586779],[24.485931,53.58718],[24.491401,53.587618],[24.495368,53.58794],[24.495912,53.587992],[24.496948,53.588107],[24.497487,53.588187],[24.497994,53.588275],[24.500341,53.588673],[24.503594,53.589328],[24.50702,53.589999],[24.508343,53.590256],[24.510035,53.590584],[24.510841,53.590739],[24.513123,53.591176],[24.513583,53.591268],[24.519105,53.592309],[24.519193,53.592327],[24.522438,53.592894],[24.522861,53.592972],[24.525736,53.593505],[24.529029,53.594116],[24.530478,53.594411],[24.531313,53.594569],[24.534363,53.595147],[24.537117,53.595689],[24.538289,53.59592],[24.541916,53.596603],[24.543252,53.596906],[24.54349,53.59696],[24.544667,53.59725],[24.546077,53.597629],[24.547606,53.598058],[24.551015,53.598986],[24.551292,53.599059],[24.552725,53.599436],[24.553866,53.599762],[24.555192,53.600117],[24.556198,53.60039],[24.557142,53.600637],[24.557865,53.600824],[24.558607,53.600998],[24.559689,53.601233],[24.560772,53.601448],[24.562033,53.601661],[24.563025,53.601813],[24.564274,53.602001],[24.565411,53.602131],[24.568241,53.602401],[24.571344,53.602686],[24.573545,53.602892],[24.575518,53.603085],[24.580086,53.603517],[24.584466,53.60393],[24.588304,53.604292],[24.590227,53.60447],[24.591656,53.60458],[24.593329,53.604686],[24.594286,53.604737],[24.595309,53.604774],[24.596943,53.604834],[24.599639,53.604924],[24.60707,53.605175],[24.610244,53.605274],[24.610734,53.605289],[24.61441,53.605422],[24.619453,53.605583],[24.623904,53.605744],[24.625293,53.60579],[24.627992,53.60588],[24.629905,53.605965],[24.631117,53.606044],[24.63252,53.606169],[24.634206,53.606362],[24.635563,53.606517],[24.637115,53.606696],[24.638382,53.606846],[24.638695,53.606883],[24.639081,53.606928],[24.63919,53.606941],[24.639298,53.606954],[24.639419,53.606968],[24.640637,53.607114],[24.643121,53.607412],[24.64386,53.607498],[24.646774,53.60784],[24.648804,53.608087],[24.651739,53.608429],[24.653454,53.608634],[24.655383,53.608864],[24.658293,53.609217],[24.663404,53.609821],[24.665865,53.61011],[24.667998,53.610361],[24.668081,53.610367],[24.668568,53.610427],[24.673005,53.610949],[24.674894,53.61118],[24.677015,53.611504],[24.678458,53.611743],[24.679452,53.611956],[24.681686,53.612532],[24.6828,53.61286],[24.685722,53.613719],[24.687691,53.614298],[24.689469,53.614822],[24.69074,53.615182],[24.695266,53.616509],[24.695986,53.616722],[24.698096,53.617347],[24.700926,53.618186],[24.701294,53.618295],[24.701533,53.618366],[24.704527,53.619256],[24.705427,53.619524],[24.709167,53.620636],[24.709305,53.620677],[24.709986,53.620887],[24.717613,53.623177],[24.720166,53.623919],[24.720685,53.62407],[24.723397,53.624898],[24.723495,53.62492],[24.726487,53.625794],[24.72838,53.626367],[24.730935,53.627102],[24.734628,53.628179],[24.737012,53.628874],[24.739436,53.62958],[24.741539,53.630217],[24.742662,53.630572],[24.746073,53.631646],[24.746673,53.631846],[24.74815,53.632354],[24.7489,53.632595],[24.74967,53.63283],[24.750415,53.63302],[24.751055,53.633192],[24.752055,53.633453],[24.753851,53.633923],[24.758028,53.635016],[24.764042,53.63657],[24.766267,53.637141],[24.768549,53.637739],[24.769211,53.637907],[24.772501,53.638863],[24.773215,53.639106],[24.774136,53.639466],[24.775052,53.639845],[24.776615,53.640544],[24.77737,53.640977],[24.781385,53.643281],[24.784253,53.644852],[24.785053,53.645291],[24.786,53.645854],[24.787943,53.646994],[24.788323,53.64722],[24.789153,53.647713],[24.79018,53.648312],[24.791533,53.6491],[24.79201,53.649379],[24.792145,53.649459],[24.792168,53.649472],[24.792275,53.649534],[24.792343,53.649573],[24.792431,53.649624],[24.795232,53.651242],[24.795555,53.651428],[24.798033,53.652859],[24.798966,53.653398],[24.801601,53.654922],[24.803536,53.656039],[24.804097,53.656383],[24.806721,53.657893],[24.809919,53.659733],[24.809947,53.659749],[24.810067,53.659818],[24.81018,53.659883],[24.810332,53.659972],[24.811235,53.660492],[24.811525,53.66066],[24.814793,53.662565],[24.817504,53.66413],[24.818778,53.664796],[24.819633,53.665243],[24.821038,53.665962],[24.821131,53.66601],[24.823145,53.666977],[24.826391,53.668536],[24.828423,53.669499],[24.829624,53.670222],[24.83196,53.671664],[24.832218,53.671831],[24.840273,53.677028],[24.840771,53.677333],[24.841753,53.677998],[24.842427,53.67844],[24.843879,53.679392],[24.84458,53.679852],[24.846469,53.680884],[24.847495,53.681344],[24.849712,53.682238],[24.851213,53.682822],[24.851564,53.682959],[24.851846,53.683047],[24.854339,53.683828],[24.855228,53.684106],[24.856141,53.684392],[24.856832,53.68461],[24.856984,53.684658],[24.858942,53.685285],[24.866352,53.687653],[24.867649,53.688068],[24.869082,53.688526],[24.873196,53.689853],[24.880953,53.692356],[24.881867,53.692651],[24.889881,53.695117],[24.891614,53.69566],[24.891795,53.695717],[24.89196,53.695769],[24.892024,53.695789],[24.892124,53.69582],[24.892187,53.69584],[24.892832,53.696045],[24.894493,53.696571],[24.89667,53.69726],[24.898211,53.697739],[24.902805,53.69921],[24.911396,53.701995],[24.913489,53.702675],[24.913812,53.70278],[24.914252,53.702931],[24.914294,53.702946],[24.916064,53.703514],[24.918102,53.704156],[24.929406,53.707749],[24.929565,53.707799],[24.929765,53.707863],[24.929959,53.707925],[24.935821,53.70982],[24.939017,53.710892],[24.94162,53.711724],[24.94198,53.711839],[24.942757,53.712085],[24.943847,53.712399],[24.945754,53.712959],[24.950837,53.714483],[24.952984,53.715258],[24.954572,53.715919],[24.955839,53.716554],[24.956095,53.716682],[24.956222,53.716757],[24.957742,53.717665],[24.959002,53.718409],[24.960598,53.719373],[24.964664,53.721578],[24.964678,53.721585],[24.966706,53.722664],[24.969902,53.724335],[24.974647,53.726831],[24.975263,53.727156],[24.975991,53.727551],[24.976669,53.72792],[24.976781,53.727981],[24.977466,53.728344],[24.97809,53.728665],[24.979383,53.72933],[24.984566,53.732016],[24.985372,53.73243],[24.988148,53.733878],[24.989462,53.734572],[24.999462,53.739851],[25.000395,53.74033],[25.000739,53.740483],[25.001287,53.740726],[25.006617,53.742785],[25.013403,53.745409],[25.014319,53.74575],[25.017393,53.746934],[25.017478,53.746966],[25.017765,53.747073],[25.017927,53.747139],[25.019673,53.747805],[25.020918,53.748383],[25.021578,53.74869],[25.021584,53.748693],[25.022925,53.749389],[25.024346,53.750209],[25.025436,53.750972],[25.025557,53.751057],[25.025727,53.751174],[25.026188,53.751505],[25.026497,53.751726],[25.03505,53.757854],[25.040336,53.761673],[25.044688,53.764828],[25.049373,53.768213],[25.054147,53.771685],[25.056641,53.773506],[25.058793,53.775111],[25.058934,53.775212],[25.061694,53.777195],[25.063517,53.778523],[25.064267,53.779043],[25.065796,53.780141],[25.066367,53.780558],[25.06658,53.780713],[25.066771,53.780852],[25.073352,53.78563],[25.079661,53.79023],[25.083092,53.792731],[25.089257,53.797224],[25.090357,53.797914],[25.090684,53.798119],[25.091222,53.798453],[25.091499,53.798622],[25.092997,53.799533],[25.095192,53.800849],[25.096172,53.801457],[25.103346,53.805923],[25.106432,53.807823],[25.107877,53.808718],[25.109769,53.809892],[25.109875,53.809957],[25.110101,53.810097],[25.110359,53.810256],[25.113395,53.812121],[25.113754,53.812341],[25.115589,53.813468],[25.116406,53.814027],[25.117258,53.814713],[25.117841,53.815295],[25.12191,53.819668],[25.122676,53.82042],[25.122913,53.820612],[25.123879,53.82139],[25.124769,53.822033],[25.125341,53.822438],[25.126241,53.823088],[25.12648,53.823224],[25.12653,53.823252],[25.128086,53.824123],[25.129454,53.824879],[25.130522,53.825382],[25.13151,53.825795],[25.132815,53.826284],[25.134007,53.826729],[25.135203,53.827184],[25.140953,53.829226],[25.145228,53.830871],[25.145667,53.83104],[25.145802,53.831092],[25.145976,53.831159],[25.146118,53.831211],[25.146511,53.83136],[25.158557,53.835902],[25.162762,53.837487],[25.170297,53.840297],[25.171123,53.840606],[25.172621,53.841162],[25.176286,53.842563],[25.177444,53.843001],[25.180648,53.844219],[25.181878,53.844666],[25.183857,53.845436],[25.184004,53.845494],[25.185474,53.846072],[25.186251,53.84638],[25.186539,53.846494],[25.188006,53.847051],[25.188484,53.847227],[25.189556,53.847649],[25.190572,53.847991],[25.191267,53.84819],[25.191764,53.848321],[25.192564,53.848527],[25.193809,53.848799],[25.195135,53.849039],[25.195532,53.849109],[25.195833,53.849143],[25.197384,53.849366],[25.197823,53.849408],[25.198927,53.849502],[25.200013,53.849553],[25.200835,53.849582],[25.201247,53.849586],[25.202337,53.849584],[25.203248,53.849559],[25.204085,53.849519],[25.205086,53.849444],[25.206314,53.849311],[25.206464,53.849295],[25.20664,53.849268],[25.206771,53.849249],[25.20804,53.84906],[25.211427,53.848527],[25.212485,53.84836],[25.221572,53.846935],[25.224784,53.84643],[25.225619,53.846299],[25.2272,53.846051],[25.229126,53.845748],[25.239361,53.844138],[25.240416,53.843971],[25.241641,53.843779],[25.244023,53.843402],[25.247922,53.842813],[25.253806,53.841924],[25.256507,53.8415],[25.263801,53.840356],[25.266709,53.839898],[25.266868,53.839874],[25.267066,53.839843],[25.270834,53.839249],[25.270992,53.839224],[25.274809,53.838622],[25.285689,53.836957],[25.287811,53.836633],[25.288337,53.83655],[25.288691,53.836494],[25.297323,53.835113],[25.297724,53.835049],[25.298064,53.834996],[25.29849,53.83493],[25.300427,53.834631],[25.31509,53.832276],[25.315161,53.832265],[25.320895,53.831445],[25.326741,53.830756],[25.329587,53.830478],[25.330341,53.830413],[25.332101,53.830268],[25.334329,53.830086],[25.335919,53.829989],[25.336685,53.829941],[25.336864,53.82993],[25.33699,53.829925],[25.338435,53.829868],[25.340881,53.8298],[25.344354,53.829715],[25.345336,53.829691],[25.345422,53.829689],[25.346182,53.829677],[25.350758,53.82961],[25.351476,53.829606],[25.352421,53.829593],[25.353996,53.829556],[25.359182,53.829481],[25.361343,53.829444],[25.362038,53.829432],[25.363374,53.829408],[25.364144,53.829393],[25.367239,53.829332],[25.370815,53.829258],[25.373944,53.829201],[25.374707,53.829191],[25.376603,53.829156],[25.377001,53.829154],[25.380019,53.829106],[25.391899,53.828918],[25.392251,53.828913],[25.407305,53.828671],[25.4201,53.828408],[25.420761,53.828406],[25.42143,53.828395],[25.421955,53.828382],[25.422479,53.828364],[25.424036,53.828351],[25.427303,53.828366],[25.428814,53.828403],[25.430631,53.828455],[25.432225,53.828532],[25.433843,53.828635],[25.43453,53.828678],[25.434876,53.828706],[25.435021,53.828717],[25.435501,53.828756],[25.435902,53.828789],[25.436033,53.828797],[25.436777,53.828869],[25.437597,53.828947],[25.439101,53.829124],[25.440496,53.829302],[25.442997,53.829637],[25.445405,53.829988],[25.445988,53.830083],[25.447249,53.830315],[25.44938,53.830722],[25.449635,53.830778],[25.452092,53.831294],[25.45418,53.831789],[25.456182,53.832303],[25.458733,53.833016],[25.460339,53.833505],[25.461851,53.833984],[25.463342,53.834485],[25.464788,53.835005],[25.465838,53.835396],[25.467685,53.836084],[25.46996,53.836915],[25.470321,53.837046],[25.470527,53.837121],[25.470689,53.837184],[25.470954,53.837287],[25.472705,53.837987],[25.476528,53.839423],[25.477286,53.839721],[25.478622,53.840242],[25.479856,53.840675],[25.482097,53.841398],[25.483623,53.841819],[25.485471,53.842295],[25.487198,53.842708],[25.487246,53.842719],[25.489005,53.84309],[25.490985,53.843449],[25.49258,53.843705],[25.493506,53.843838],[25.496469,53.844191],[25.498761,53.844401],[25.500437,53.844515],[25.502065,53.844595],[25.503269,53.844636],[25.504181,53.84464],[25.504623,53.844643],[25.505462,53.844655],[25.506196,53.844655],[25.507628,53.844678],[25.508741,53.844667],[25.511188,53.84457],[25.513146,53.844423],[25.516475,53.844059],[25.517277,53.843971],[25.517688,53.843926],[25.518072,53.843876],[25.518617,53.843818],[25.521567,53.843469],[25.522564,53.843353],[25.53752,53.841683],[25.540166,53.841395],[25.542458,53.841146],[25.542756,53.841113],[25.543046,53.841083],[25.546504,53.840738],[25.5496,53.840527],[25.552517,53.840384],[25.555351,53.840245],[25.555735,53.840229],[25.558716,53.840109],[25.55981,53.840065],[25.561211,53.840008],[25.563567,53.83996],[25.565994,53.839935],[25.567664,53.839994],[25.568965,53.840084],[25.570165,53.840207],[25.571999,53.840484],[25.572326,53.840533],[25.57262,53.840579],[25.573274,53.840679],[25.575143,53.841021],[25.582177,53.842308],[25.582552,53.842376],[25.588832,53.843524],[25.59592,53.844864],[25.596117,53.844902],[25.597698,53.845209],[25.598037,53.845274],[25.600644,53.845774],[25.602224,53.846112],[25.60239,53.846148],[25.602573,53.846187],[25.602713,53.846217],[25.605241,53.846758],[25.605575,53.846829],[25.609239,53.847785],[25.611023,53.848292],[25.612639,53.848752],[25.613371,53.849006],[25.6149,53.849535],[25.617889,53.850601],[25.62059,53.851682],[25.623433,53.853012],[25.623676,53.853125],[25.626399,53.854405],[25.628133,53.855322],[25.635155,53.859338],[25.646199,53.865652],[25.646411,53.865773],[25.656059,53.871494],[25.657271,53.872213],[25.658388,53.872866],[25.664168,53.876144],[25.665441,53.876853],[25.666875,53.877565],[25.669348,53.878713],[25.671029,53.879443],[25.67342,53.880316],[25.676578,53.881235],[25.679893,53.882071],[25.681932,53.882495],[25.683836,53.882804],[25.686155,53.883113],[25.6891,53.88343],[25.69129,53.883586],[25.693018,53.883656],[25.694626,53.883689],[25.697302,53.883648],[25.70145,53.883516],[25.709874,53.883232],[25.714462,53.883078],[25.716303,53.883015],[25.716683,53.883003],[25.716894,53.882996],[25.717083,53.882989],[25.717943,53.882959],[25.719675,53.8829],[25.725155,53.882711],[25.730929,53.882512],[25.732939,53.882443],[25.736864,53.882301],[25.740388,53.882159],[25.740808,53.882142],[25.744306,53.882039],[25.745629,53.882003],[25.747538,53.881952],[25.752426,53.881822],[25.754501,53.881764],[25.755402,53.881738],[25.760559,53.881586],[25.762179,53.881551],[25.763903,53.881549],[25.765837,53.881649],[25.767993,53.881833],[25.769408,53.881994],[25.769806,53.88204],[25.770106,53.882081],[25.770275,53.882109],[25.77055,53.882155],[25.772033,53.882402],[25.774522,53.8829],[25.776399,53.883382],[25.778044,53.883813],[25.779501,53.884246],[25.779931,53.884372],[25.781548,53.884917],[25.78324,53.885573],[25.784005,53.885895],[25.784113,53.88594],[25.784478,53.886093],[25.785777,53.886693],[25.787419,53.887523],[25.788834,53.888324],[25.790241,53.889204],[25.792226,53.890649],[25.79305,53.891296],[25.794134,53.892166],[25.794204,53.892227],[25.794379,53.892378],[25.794444,53.892432],[25.794576,53.892543],[25.794797,53.892729],[25.796096,53.893823],[25.796919,53.894482],[25.79887,53.896019],[25.800398,53.897073],[25.801752,53.897909],[25.803086,53.898658],[25.804246,53.899227],[25.80451,53.899357],[25.805944,53.89997],[25.808036,53.900823],[25.809094,53.901205],[25.809655,53.901384],[25.81012,53.901536],[25.811467,53.901942],[25.812862,53.902332],[25.814718,53.90279],[25.816013,53.903048],[25.817486,53.903325],[25.818147,53.903455],[25.818514,53.903514],[25.819319,53.903623],[25.819833,53.903694],[25.823449,53.90412],[25.827528,53.904585],[25.832636,53.905162],[25.833229,53.905227],[25.839953,53.906013],[25.839954,53.906013],[25.843474,53.906416],[25.845028,53.906606],[25.847488,53.906885],[25.848301,53.906978],[25.849449,53.90711],[25.850355,53.907215],[25.851691,53.90737],[25.854397,53.907683],[25.855345,53.907795],[25.856901,53.907972],[25.857894,53.908093],[25.862065,53.908567],[25.862223,53.908585],[25.862436,53.908614],[25.862975,53.908677],[25.866504,53.90909],[25.871,53.909611],[25.872491,53.909779],[25.8727,53.909797],[25.874144,53.909915],[25.874902,53.909976],[25.874974,53.90998],[25.876126,53.910046],[25.877212,53.910102],[25.878135,53.91013],[25.880602,53.910174],[25.881615,53.910165],[25.88277,53.910136],[25.88441,53.910066],[25.886562,53.909937],[25.887823,53.909839],[25.888898,53.909723],[25.892514,53.909305],[25.894327,53.909095],[25.896362,53.908827],[25.900414,53.908349],[25.901816,53.90817],[25.903455,53.907915],[25.90525,53.90758],[25.907069,53.90721],[25.908954,53.906794],[25.915206,53.905369],[25.92132,53.903985],[25.926923,53.902716],[25.932878,53.901364],[25.935509,53.900778],[25.936791,53.900486],[25.937642,53.900292],[25.940575,53.89963],[25.94304,53.899071],[25.946281,53.898364],[25.949272,53.897828],[25.949915,53.897743],[25.951242,53.897599],[25.952401,53.897521],[25.954057,53.897474],[25.955181,53.897493],[25.955847,53.897531],[25.956638,53.897592],[25.957504,53.897687],[25.958805,53.897859],[25.959744,53.898018],[25.960767,53.89823],[25.964303,53.89925],[25.964586,53.899335],[25.966399,53.899965],[25.971976,53.901908],[25.977789,53.903933],[25.981789,53.905298],[25.98378,53.905988],[25.984697,53.906306],[25.98548,53.906558],[25.986282,53.906791],[25.987573,53.907136],[25.989073,53.907519],[25.990466,53.90784],[25.991396,53.908022],[25.991788,53.908099],[25.993064,53.9083],[25.994829,53.908549],[25.996377,53.908723],[25.998057,53.908895],[25.998474,53.908928],[25.999984,53.909011],[26.001578,53.909075],[26.003328,53.909087],[26.005146,53.909047],[26.006133,53.909007],[26.006819,53.908976],[26.008639,53.908832],[26.009764,53.908715],[26.013673,53.908329],[26.015254,53.908177],[26.018035,53.907964],[26.021107,53.907754],[26.023183,53.907627],[26.024583,53.907525],[26.028199,53.907234],[26.03296,53.90682],[26.033932,53.906749],[26.034993,53.906671],[26.035551,53.90663],[26.036089,53.906607],[26.036296,53.906597],[26.036404,53.906591],[26.036619,53.906588],[26.036785,53.906586],[26.037102,53.906582],[26.037239,53.90658],[26.039186,53.906574],[26.040807,53.906607],[26.042243,53.906681],[26.044209,53.906833],[26.046165,53.907041],[26.048349,53.907341],[26.049393,53.907529],[26.051047,53.907863],[26.051121,53.90788],[26.051866,53.908057],[26.055778,53.908951],[26.064097,53.910878],[26.06578,53.9113],[26.068068,53.911831],[26.071785,53.912684],[26.074381,53.913229],[26.076517,53.913617],[26.079276,53.914006],[26.079929,53.914081],[26.080963,53.914205],[26.081314,53.914247],[26.081541,53.914268],[26.08192,53.914304],[26.081957,53.914308],[26.088066,53.914985],[26.094422,53.915697],[26.09792,53.916106],[26.100208,53.916452],[26.102591,53.916902],[26.104431,53.917325],[26.105352,53.917537],[26.108687,53.918489],[26.10914,53.918618],[26.109566,53.918755],[26.112439,53.919771],[26.116372,53.921449],[26.119018,53.922803],[26.120893,53.923949],[26.121343,53.924231],[26.122543,53.925047],[26.124401,53.926437],[26.130591,53.931122],[26.139862,53.938174],[26.144415,53.941639],[26.145206,53.942241],[26.146666,53.943352],[26.148164,53.944437],[26.149202,53.945189],[26.149481,53.945392],[26.149602,53.945485],[26.15046,53.946058],[26.151331,53.946595],[26.152224,53.947114],[26.15303,53.947544],[26.154193,53.948112],[26.155374,53.948651],[26.155516,53.948712],[26.157721,53.949647],[26.158898,53.950049],[26.159394,53.950226],[26.160121,53.950454],[26.161194,53.950792],[26.162476,53.951146],[26.174866,53.9541],[26.175161,53.954164],[26.177405,53.954676],[26.181859,53.955718],[26.182471,53.95586],[26.186059,53.956691],[26.187509,53.957028],[26.189309,53.957445],[26.193688,53.95846],[26.194882,53.958736],[26.196935,53.959236],[26.199879,53.959971],[26.203574,53.96099],[26.204988,53.96138],[26.206179,53.961709],[26.2065,53.961797],[26.206988,53.961932],[26.207456,53.962062],[26.211947,53.963309],[26.213291,53.963682],[26.214056,53.963892],[26.216786,53.964656],[26.217396,53.964826],[26.21966,53.965459],[26.22186,53.96605],[26.228593,53.967745],[26.23135,53.968522],[26.235809,53.969779],[26.244927,53.972299],[26.251279,53.974041],[26.252917,53.974501],[26.258163,53.975854],[26.25884,53.976018],[26.264241,53.977321],[26.266033,53.977709],[26.268249,53.978164],[26.271784,53.978861],[26.273215,53.979124],[26.275553,53.979559],[26.280229,53.980274],[26.284776,53.980949],[26.287708,53.981311],[26.290444,53.981623],[26.297408,53.982328],[26.300127,53.982603],[26.300754,53.982666],[26.302348,53.982827],[26.302907,53.982883],[26.303557,53.982949],[26.30404,53.982999],[26.304139,53.983007],[26.306225,53.983218],[26.307453,53.983344],[26.308349,53.983436],[26.311788,53.983789],[26.314864,53.984178],[26.316334,53.984363],[26.31706,53.984454],[26.318671,53.984675],[26.319953,53.984912],[26.321859,53.985309],[26.326642,53.986306],[26.329598,53.986987],[26.330408,53.98723],[26.337183,53.989262],[26.344024,53.991281],[26.346823,53.992128],[26.347971,53.992532],[26.348985,53.992936],[26.351992,53.994226],[26.356564,53.996186],[26.357395,53.996565],[26.359277,53.997422],[26.360537,53.998065],[26.361533,53.998499],[26.362869,53.999007],[26.36401,53.999406],[26.36414,53.999453],[26.364452,53.999568],[26.364959,53.999753],[26.368273,54.000814],[26.369151,54.001143],[26.371115,54.001876],[26.371801,54.002133],[26.372453,54.002384],[26.374105,54.003021],[26.374947,54.003404],[26.375634,54.003749],[26.376838,54.004427],[26.377696,54.004996],[26.378536,54.005656],[26.379381,54.006385],[26.379872,54.006854],[26.380352,54.007304],[26.380465,54.007406],[26.380898,54.007817],[26.381292,54.008197],[26.381311,54.008215],[26.382793,54.009634],[26.38702,54.01368],[26.388237,54.014768],[26.388444,54.014935],[26.389195,54.015542],[26.389996,54.01607],[26.39122,54.01677],[26.392089,54.017156],[26.392584,54.017328],[26.39362,54.01771],[26.394658,54.018067],[26.395853,54.018478],[26.398512,54.01926],[26.399313,54.019496],[26.400156,54.019716],[26.40084,54.019881],[26.401933,54.020145],[26.40322,54.020367],[26.40362,54.020434],[26.404077,54.020506],[26.404579,54.020576],[26.404998,54.02063],[26.406844,54.020813],[26.41285,54.02141],[26.415619,54.021668],[26.422595,54.022319],[26.424766,54.022549],[26.427033,54.022839],[26.429833,54.023256],[26.430237,54.023316],[26.43065,54.023377],[26.430748,54.02339],[26.431305,54.023496],[26.431576,54.023547],[26.431742,54.023588],[26.432293,54.023723],[26.433193,54.024001],[26.434096,54.024317],[26.434774,54.024612],[26.435445,54.024922],[26.440425,54.027672],[26.44088,54.027924],[26.44136,54.028189],[26.44168,54.028366],[26.442711,54.028935],[26.448078,54.031932],[26.453479,54.034955],[26.453661,54.035054],[26.455288,54.035947],[26.455539,54.036085],[26.4558,54.036229],[26.458315,54.037617],[26.464267,54.040899],[26.464718,54.041148],[26.46576,54.041723],[26.46615,54.041938],[26.467276,54.042559],[26.467801,54.042855],[26.470037,54.044083],[26.470688,54.04444],[26.475852,54.047285],[26.480856,54.050042],[26.484932,54.052285],[26.486943,54.053395],[26.489825,54.054986],[26.498262,54.059609],[26.501038,54.061131],[26.503224,54.062329],[26.503413,54.062432],[26.50391,54.062705],[26.504522,54.063039],[26.505672,54.063645],[26.506793,54.064173],[26.508158,54.064726],[26.5095,54.0652],[26.509758,54.065268],[26.510552,54.065475],[26.51199,54.065747],[26.51297,54.065892],[26.51379,54.06595],[26.514893,54.066023],[26.5161,54.06604],[26.51808,54.06595],[26.519393,54.065791],[26.52071,54.065601],[26.521573,54.065431],[26.52269,54.065118],[26.523413,54.064865],[26.524245,54.064515],[26.524535,54.064393],[26.524832,54.064262],[26.525317,54.06405],[26.526743,54.063426],[26.529212,54.062346],[26.531001,54.061563],[26.536106,54.05933],[26.53663,54.059101],[26.54033,54.057482],[26.541496,54.056963],[26.543182,54.056212],[26.546744,54.054658],[26.548866,54.053819],[26.551286,54.052756],[26.553697,54.051704],[26.558688,54.049493],[26.561331,54.048357],[26.562642,54.047792],[26.56446,54.046997],[26.565227,54.046659],[26.566614,54.046065],[26.567458,54.045688],[26.568553,54.045215],[26.569864,54.044643],[26.571033,54.044141],[26.572608,54.043557],[26.573527,54.043218],[26.575935,54.042443],[26.576233,54.042357],[26.577481,54.042004],[26.578752,54.041674],[26.580432,54.041277],[26.58225,54.040941],[26.585197,54.040491],[26.588042,54.040214],[26.590831,54.040059],[26.594936,54.039874],[26.599026,54.03968],[26.601503,54.039561],[26.602417,54.039508],[26.603173,54.039478],[26.604293,54.039417],[26.604522,54.039409],[26.604709,54.039395],[26.604853,54.03938],[26.605066,54.039379],[26.605145,54.039377],[26.607739,54.039267],[26.609085,54.039203],[26.613028,54.039027],[26.618448,54.038713],[26.626433,54.03834],[26.629057,54.038209],[26.631578,54.038083],[26.631786,54.038073],[26.633412,54.037991],[26.634766,54.037924],[26.636672,54.037876],[26.638301,54.03788],[26.640011,54.037932],[26.640619,54.037943],[26.646714,54.038381],[26.648686,54.038523],[26.65338,54.03886],[26.65374,54.038885],[26.662654,54.039497],[26.664064,54.039592],[26.664807,54.039642],[26.666997,54.039789],[26.668492,54.039896],[26.669649,54.039975],[26.671004,54.040077],[26.672719,54.040169],[26.673289,54.040223],[26.674963,54.04033],[26.678823,54.040578],[26.685335,54.041039],[26.686111,54.041087],[26.686853,54.041132],[26.688698,54.041245],[26.690093,54.041331],[26.691201,54.041411],[26.693993,54.04157],[26.694432,54.041597],[26.695005,54.041632],[26.700347,54.042005],[26.703422,54.042219],[26.70793,54.042518],[26.708702,54.042569],[26.709465,54.04262],[26.709542,54.042626],[26.709875,54.042646],[26.709948,54.042651],[26.710143,54.042666],[26.710207,54.04267],[26.711359,54.042747],[26.713815,54.042912],[26.720496,54.043369],[26.721513,54.043467],[26.723715,54.043714],[26.724527,54.043831],[26.727766,54.044298],[26.729929,54.044602],[26.731807,54.044884],[26.733533,54.045155],[26.734343,54.0453],[26.735649,54.045614],[26.737671,54.046129],[26.737737,54.046143],[26.738239,54.046253],[26.739276,54.046486],[26.741016,54.046904],[26.748886,54.048777],[26.751038,54.049251],[26.753228,54.049649],[26.755557,54.05004],[26.757229,54.050267],[26.757687,54.05033],[26.760012,54.050656],[26.761264,54.050792],[26.763076,54.05099],[26.763474,54.051017],[26.764598,54.051092],[26.764845,54.051108],[26.767484,54.051272],[26.768561,54.051313],[26.769841,54.051345],[26.771255,54.051392],[26.772457,54.051402],[26.775111,54.051451],[26.777404,54.05143],[26.778115,54.051425],[26.7806,54.051343],[26.784164,54.051101],[26.784945,54.051033],[26.787449,54.050814],[26.789954,54.050546],[26.791908,54.050299],[26.793979,54.050017],[26.796063,54.049682],[26.798943,54.049138],[26.800809,54.048785],[26.803756,54.048138],[26.805506,54.047662],[26.806685,54.047342],[26.806973,54.047253],[26.808379,54.046819],[26.809921,54.046368],[26.813253,54.045309],[26.82175,54.04252],[26.824682,54.041517],[26.825908,54.041097],[26.826468,54.040905],[26.828035,54.040378],[26.829895,54.039757],[26.831933,54.039076],[26.83599,54.037721],[26.836334,54.037604],[26.838141,54.036991],[26.838465,54.036882],[26.839115,54.036672],[26.845342,54.034657],[26.852049,54.032439],[26.852839,54.032175],[26.862934,54.028806],[26.865674,54.027896],[26.865955,54.027797],[26.866644,54.027567],[26.867895,54.02715],[26.869164,54.026726],[26.869997,54.026448],[26.871599,54.02592],[26.871957,54.025798],[26.872899,54.025493],[26.875636,54.024605],[26.879119,54.023444],[26.879205,54.023415],[26.895022,54.018142],[26.90164,54.015943],[26.905088,54.014653],[26.907603,54.013694],[26.907977,54.013552],[26.920254,54.008899],[26.920731,54.008719],[26.921605,54.008399],[26.92229,54.008135],[26.922348,54.008113],[26.924171,54.007458],[26.925575,54.006953],[26.926264,54.006694],[26.926946,54.006437],[26.93143,54.004742],[26.94165,54.000881],[26.943914,54.000034],[26.94506,53.999606],[26.947326,53.998706],[26.948408,53.998325],[26.955152,53.995763],[26.956273,53.995336],[26.968515,53.990668],[26.971111,53.989671],[26.971384,53.989569],[26.97376,53.98868],[26.976343,53.987737],[26.976692,53.987614],[26.977665,53.987272],[26.978478,53.987035],[26.979846,53.986664],[26.98162,53.986238],[26.983102,53.985878],[26.984082,53.98567],[26.984813,53.985515],[26.986028,53.985301],[26.986561,53.985207],[26.987647,53.985041],[26.987755,53.985024],[26.988398,53.984924],[26.990079,53.984667],[26.990558,53.984592],[26.991256,53.984482],[26.994823,53.983974],[26.999919,53.983221],[27.003697,53.982662],[27.006877,53.982194],[27.007084,53.982163],[27.012441,53.981374],[27.014591,53.981053],[27.02705,53.97919],[27.029213,53.978875],[27.030841,53.978638],[27.032396,53.978467],[27.033902,53.978325],[27.03503,53.97823],[27.036144,53.978136],[27.037482,53.978074],[27.040085,53.978039],[27.042102,53.978017],[27.044654,53.978036],[27.048128,53.978062],[27.048996,53.978048],[27.049937,53.978017],[27.05154,53.977939],[27.052545,53.977891],[27.053851,53.977806],[27.055172,53.977683],[27.057163,53.977443],[27.058453,53.977272],[27.059383,53.977125],[27.059798,53.977059],[27.061033,53.976839],[27.062275,53.97659],[27.064758,53.976059],[27.06757,53.97542],[27.068982,53.975098],[27.070323,53.974796],[27.070399,53.974779],[27.071535,53.974491],[27.072709,53.974152],[27.073673,53.973854],[27.07427,53.97367],[27.075816,53.973098],[27.076426,53.972821],[27.078223,53.971973],[27.079019,53.971603],[27.079412,53.971405],[27.08058,53.970765],[27.081082,53.970463],[27.081567,53.97013],[27.081728,53.970015],[27.082583,53.969408],[27.083116,53.969038],[27.083377,53.968841],[27.084561,53.967884],[27.084774,53.967724],[27.085644,53.967071],[27.08642,53.966532],[27.087199,53.966064],[27.08818,53.965467],[27.089079,53.964951],[27.089643,53.964665],[27.090002,53.964305],[27.090083,53.964189],[27.090123,53.96402],[27.090079,53.963836],[27.089978,53.963698],[27.089838,53.963579],[27.089671,53.963491],[27.089446,53.963414],[27.089211,53.963365],[27.088964,53.96334],[27.088663,53.963366],[27.08837,53.963433],[27.088132,53.963534],[27.087993,53.963649],[27.087883,53.963783],[27.087821,53.963977],[27.087824,53.964312],[27.088328,53.964949],[27.088864,53.965658],[27.089346,53.966305],[27.090771,53.968315],[27.090833,53.968404],[27.091282,53.969042],[27.091427,53.969474],[27.091854,53.97006],[27.092562,53.971022],[27.0937,53.97259],[27.095925,53.975657],[27.099308,53.979946],[27.102872,53.983655],[27.103868,53.984656],[27.105556,53.986127],[27.108434,53.988656],[27.112357,53.992041],[27.11455,53.993891],[27.117067,53.996071],[27.120629,53.999105],[27.121208,53.999647],[27.122034,54.000366],[27.12352,54.001679],[27.124961,54.002961],[27.125291,54.00326],[27.126569,54.004377],[27.128299,54.005909],[27.129378,54.006864],[27.129906,54.007348],[27.131957,54.009237],[27.133216,54.010468],[27.134991,54.012271],[27.135783,54.013098],[27.138168,54.015627],[27.138843,54.016353],[27.139659,54.017214],[27.14097,54.018522],[27.141565,54.019053],[27.1428,54.02003],[27.143396,54.020462],[27.143873,54.020831],[27.145566,54.022055],[27.146594,54.022707],[27.14876,54.023929],[27.152238,54.025772],[27.156732,54.028252],[27.160857,54.030533],[27.164682,54.032656],[27.166908,54.033977],[27.167153,54.034118],[27.1677,54.034463],[27.168452,54.034994],[27.169555,54.035816],[27.170699,54.036699],[27.173522,54.039219],[27.176172,54.041664],[27.178854,54.04412],[27.181406,54.046311],[27.182569,54.047324],[27.183298,54.047905],[27.184339,54.048622],[27.185471,54.049356],[27.187065,54.050264],[27.18732,54.050405],[27.187506,54.050504],[27.188132,54.050822],[27.188848,54.051153],[27.190089,54.051706],[27.191598,54.05233],[27.19351,54.052983],[27.194803,54.053358],[27.19602,54.053651],[27.198316,54.05411],[27.200226,54.05446],[27.20345,54.054935],[27.206792,54.055427],[27.212664,54.056234],[27.215704,54.05668],[27.216425,54.056791],[27.218244,54.057094],[27.218677,54.057171],[27.220534,54.057549],[27.223311,54.058168],[27.225715,54.05875],[27.226885,54.05907],[27.22795,54.0594],[27.227994,54.059414],[27.229825,54.059994],[27.231339,54.060477],[27.232828,54.060989],[27.23553,54.061959],[27.238743,54.063108],[27.239682,54.063444],[27.242151,54.064337],[27.246925,54.066136],[27.248067,54.066558],[27.249028,54.066866],[27.251824,54.067907],[27.253694,54.06858],[27.255642,54.069262],[27.259076,54.070506],[27.259801,54.070744],[27.260433,54.070925],[27.261046,54.071073],[27.261696,54.071227],[27.263015,54.071436],[27.264885,54.071691],[27.266334,54.071834],[27.26775,54.071887],[27.270139,54.071861],[27.272636,54.071663],[27.274455,54.071376],[27.27512,54.071239],[27.275311,54.0712],[27.276564,54.070944],[27.279953,54.070251],[27.283341,54.069565],[27.286944,54.068798],[27.289191,54.068319],[27.292508,54.06764],[27.294271,54.067273],[27.295881,54.066941],[27.296371,54.066841],[27.297616,54.066608],[27.298846,54.066424],[27.300006,54.066273],[27.301168,54.066128],[27.302647,54.065973],[27.303667,54.065879],[27.306067,54.065696],[27.309737,54.065417],[27.320339,54.064687],[27.325475,54.064393],[27.336843,54.06393],[27.341886,54.063779],[27.345213,54.063732],[27.347295,54.063703],[27.362112,54.063534],[27.365034,54.063516],[27.379387,54.063431],[27.384242,54.063569],[27.38695,54.063662],[27.389783,54.06366],[27.393495,54.063464],[27.394341,54.063407],[27.397066,54.063185],[27.399733,54.062822],[27.403384,54.062305],[27.406162,54.061981],[27.407932,54.061836],[27.410396,54.061731],[27.412955,54.061735],[27.415716,54.061868],[27.41799,54.06206],[27.422379,54.062743],[27.428576,54.064216],[27.435518,54.065933],[27.439859,54.066904],[27.443447,54.067382],[27.446109,54.06762],[27.447544,54.067684],[27.448837,54.067718],[27.451319,54.067783],[27.452483,54.067847],[27.453588,54.067868],[27.455513,54.067882],[27.456208,54.067887],[27.457129,54.067896],[27.45949,54.067894],[27.461385,54.067867],[27.463164,54.06779],[27.464346,54.06775],[27.466194,54.067687],[27.471011,54.067409],[27.475736,54.067041],[27.478751,54.066756],[27.479237,54.066703],[27.48127,54.066483],[27.485293,54.065967],[27.489809,54.065296],[27.494352,54.064592],[27.499306,54.063824],[27.500287,54.063706],[27.501605,54.063549],[27.502851,54.0634],[27.504332,54.063223],[27.507361,54.062859],[27.508348,54.062774],[27.508971,54.062722],[27.511251,54.062534],[27.514225,54.062282],[27.51519,54.062199],[27.51786,54.06197],[27.521739,54.061551],[27.524142,54.061228],[27.524544,54.061174],[27.527431,54.060746],[27.530765,54.060166],[27.534055,54.059496],[27.534109,54.059485],[27.537312,54.058769],[27.538608,54.058452],[27.538898,54.058382],[27.540332,54.057999],[27.541395,54.057712],[27.542419,54.057434],[27.545945,54.056435],[27.547845,54.0559],[27.549179,54.055562],[27.550384,54.055288],[27.551656,54.055005],[27.552672,54.054833],[27.552917,54.054791],[27.555026,54.054521],[27.558634,54.054125],[27.561299,54.053786],[27.561887,54.053698],[27.5639,54.053396],[27.564331,54.053322],[27.565895,54.053064],[27.56881,54.052525],[27.571951,54.051858],[27.574791,54.051266],[27.577373,54.050704],[27.57998,54.050134],[27.581441,54.049815],[27.584948,54.049047],[27.588367,54.048265],[27.591949,54.04756],[27.593842,54.047234],[27.595827,54.046948],[27.597325,54.046837],[27.599033,54.046661],[27.600691,54.046508],[27.603007,54.046319],[27.604714,54.046175],[27.606303,54.046107],[27.607921,54.046069],[27.609843,54.046048],[27.611783,54.046076],[27.613474,54.046123],[27.615166,54.046165],[27.620191,54.046373],[27.622783,54.046458],[27.628146,54.046693],[27.630809,54.046837],[27.633566,54.047104],[27.63619,54.047462],[27.638782,54.047963],[27.643813,54.04907],[27.646515,54.049687],[27.649341,54.050319],[27.652493,54.051023],[27.65357,54.051258],[27.654726,54.051511],[27.656978,54.051929],[27.658839,54.052222],[27.660069,54.052402],[27.661556,54.052559],[27.662705,54.052667],[27.663904,54.052746],[27.668457,54.052957],[27.671466,54.053136],[27.674568,54.053325],[27.677772,54.053581],[27.683532,54.054129],[27.686785,54.054355],[27.687504,54.054398],[27.688918,54.054486],[27.689205,54.054487],[27.690068,54.0545],[27.690551,54.054515],[27.690625,54.054504],[27.690742,54.054496],[27.690908,54.054491],[27.691469,54.054602],[27.692137,54.054707],[27.692258,54.054716],[27.692427,54.054719],[27.692619,54.054721],[27.693143,54.054718],[27.693475,54.054713],[27.697047,54.054658],[27.698284,54.054645],[27.699211,54.054631],[27.699285,54.054629],[27.699371,54.054628],[27.700198,54.054615],[27.702101,54.054597],[27.702644,54.054589],[27.705271,54.054557],[27.708899,54.054512],[27.710557,54.054488],[27.710687,54.054486],[27.711448,54.054464],[27.711534,54.054462],[27.713865,54.05449],[27.715229,54.054621],[27.717115,54.054959],[27.718645,54.05528],[27.72026,54.055658],[27.720561,54.055728],[27.723651,54.056485],[27.729068,54.057527],[27.730182,54.057707],[27.731214,54.057822],[27.732688,54.057913],[27.732851,54.057919],[27.733567,54.057947],[27.734691,54.057953],[27.73496,54.057935],[27.735286,54.057914],[27.736079,54.057846],[27.736979,54.057726],[27.743292,54.056568],[27.745261,54.056108],[27.746346,54.055846],[27.747836,54.055494],[27.749301,54.055193],[27.750142,54.055045],[27.75076,54.054944],[27.751715,54.054792],[27.752255,54.054717],[27.753018,54.054613],[27.754124,54.054495],[27.755041,54.054385],[27.757576,54.053946],[27.759016,54.053596],[27.760856,54.053144],[27.762783,54.052672],[27.763713,54.052507],[27.766823,54.052049],[27.766909,54.052036],[27.773624,54.051058],[27.782758,54.049754],[27.78446,54.049498],[27.785585,54.049255],[27.787956,54.048542],[27.788581,54.048306],[27.793378,54.046493],[27.793523,54.046438],[27.794131,54.046204],[27.794842,54.04595],[27.795733,54.045613],[27.804077,54.042452],[27.80589,54.041736],[27.817176,54.037467],[27.818899,54.036917],[27.820528,54.036505],[27.822123,54.036252],[27.824047,54.036073],[27.825462,54.036039],[27.834684,54.036086],[27.837078,54.035967],[27.843793,54.035101],[27.847026,54.034616],[27.848902,54.034331],[27.850711,54.034136],[27.853775,54.034053],[27.859247,54.033957],[27.860882,54.033787],[27.861298,54.033721],[27.862337,54.033554],[27.863502,54.033383],[27.864605,54.033083],[27.865818,54.032685],[27.8676,54.031899],[27.870198,54.030549],[27.873326,54.028889],[27.876085,54.027349],[27.880191,54.025278],[27.884283,54.023231],[27.886239,54.022205],[27.886464,54.022075],[27.88692,54.021779],[27.887334,54.021474],[27.88771,54.021108],[27.88803,54.020704],[27.888428,54.02004],[27.888555,54.019741],[27.888695,54.019367],[27.888823,54.018668],[27.888905,54.018327],[27.88904,54.018],[27.889453,54.017277],[27.889694,54.016939],[27.890081,54.016474],[27.890196,54.016367],[27.890581,54.016045],[27.891478,54.015204],[27.891902,54.014857],[27.892353,54.014459],[27.892635,54.014226],[27.893011,54.013929],[27.893604,54.013515],[27.894016,54.013273],[27.894199,54.013184],[27.894562,54.013017],[27.894874,54.012883],[27.895556,54.012594],[27.895946,54.012431],[27.896384,54.012224],[27.896773,54.012045],[27.897165,54.011845],[27.897407,54.011701],[27.897624,54.011568],[27.898037,54.011295],[27.898896,54.01072],[27.900208,54.009838],[27.901526,54.008973],[27.901568,54.008945],[27.901851,54.008757],[27.903043,54.007967],[27.903775,54.007472],[27.904488,54.006938],[27.906233,54.00561],[27.907509,54.004569],[27.908918,54.003306],[27.910006,54.00224],[27.913739,53.998249],[27.913988,53.997983],[27.917954,53.993743],[27.918608,53.993053],[27.919823,53.991743],[27.92078,53.990738],[27.921772,53.989744],[27.921951,53.989558],[27.923498,53.988112],[27.924071,53.987599],[27.92464,53.987088],[27.925172,53.98667],[27.925602,53.986316],[27.926792,53.985389],[27.928273,53.984307],[27.92875,53.98395],[27.929249,53.983612],[27.93025,53.98295],[27.930716,53.982625],[27.931021,53.982412],[27.934167,53.980342],[27.937242,53.978268],[27.938098,53.977708],[27.938455,53.97747],[27.949673,53.969975],[27.949804,53.96988],[27.950606,53.96935],[27.9521,53.968393],[27.953558,53.967418],[27.955492,53.966092],[27.956743,53.965258],[27.957986,53.964453],[27.960382,53.962813],[27.962185,53.96161],[27.962572,53.961351],[27.96433,53.96021],[27.965242,53.959597],[27.966322,53.958899],[27.966819,53.958577],[27.967288,53.958238],[27.967844,53.957825],[27.969097,53.956939],[27.969125,53.956919],[27.97033,53.956],[27.970975,53.95547],[27.97314,53.953597],[27.973738,53.952971],[27.974262,53.952432],[27.974815,53.951849],[27.975089,53.951545],[27.975342,53.951241],[27.975731,53.950785],[27.976133,53.950304],[27.976513,53.949823],[27.976865,53.949344],[27.977421,53.948568],[27.977844,53.947955],[27.977888,53.947819],[27.977883,53.947647],[27.977823,53.947484],[27.977679,53.94734],[27.977466,53.947224],[27.977192,53.94714],[27.976799,53.947126],[27.976452,53.947203],[27.976156,53.947355],[27.976031,53.947537],[27.975995,53.947757],[27.976034,53.947921],[27.976108,53.948062],[27.976207,53.948192],[27.976357,53.948322],[27.97687,53.948626],[27.977901,53.949239],[27.978358,53.949479],[27.979925,53.950317],[27.981614,53.951141],[27.982884,53.951674],[27.983737,53.952042],[27.984728,53.95247],[27.985814,53.952913],[27.988565,53.953924],[27.990247,53.954503],[27.990813,53.954688],[27.991345,53.954861],[27.99249,53.955204],[27.99394,53.95566],[27.995001,53.955964],[27.996131,53.956287],[27.996851,53.956493],[28.010716,53.960443],[28.019141,53.962843],[28.020919,53.963349],[28.02353,53.96414],[28.024631,53.964442],[28.02611,53.964846],[28.028421,53.965494],[28.031604,53.966423],[28.033592,53.967003],[28.036379,53.967817],[28.037314,53.968085],[28.038276,53.968361],[28.040971,53.969136],[28.04475,53.970222],[28.044958,53.970281],[28.047323,53.970968],[28.051212,53.972173],[28.051791,53.972366],[28.054751,53.973352],[28.056885,53.974088],[28.059951,53.975201],[28.063454,53.976547],[28.065084,53.977179],[28.071403,53.979631],[28.076873,53.981741],[28.077669,53.98205],[28.081568,53.983462],[28.083626,53.984179],[28.08552,53.984814],[28.087803,53.985523],[28.088591,53.985766],[28.090408,53.986344],[28.090791,53.98646],[28.091718,53.986739],[28.093031,53.987111],[28.093619,53.987276],[28.094806,53.987616],[28.096027,53.987946],[28.097899,53.98845],[28.099677,53.988899],[28.102446,53.989582],[28.102942,53.989707],[28.103406,53.989819],[28.104775,53.990152],[28.107622,53.990843],[28.110486,53.991539],[28.115461,53.992742],[28.11995,53.993821],[28.124093,53.994817],[28.125713,53.995207],[28.1277,53.995684],[28.127933,53.995742],[28.129142,53.996038],[28.130382,53.996326],[28.133281,53.997042],[28.133512,53.997099],[28.137757,53.998187],[28.139458,53.998658],[28.144878,54.000225],[28.14684,54.000849],[28.14863,54.001418],[28.152461,54.002707],[28.154784,54.00352],[28.157559,54.004522],[28.159173,54.005095],[28.159577,54.005238],[28.160264,54.005483],[28.161524,54.005929],[28.16714,54.00793],[28.169334,54.008688],[28.171598,54.009449],[28.17316,54.009934],[28.173923,54.010171],[28.178386,54.011466],[28.181208,54.012243],[28.182704,54.012655],[28.184849,54.013202],[28.18568,54.01342],[28.18638,54.013585],[28.186829,54.013692],[28.188797,54.014161],[28.192052,54.01489],[28.19615,54.01575],[28.200692,54.01663],[28.203223,54.017076],[28.206221,54.017565],[28.208612,54.017944],[28.212292,54.018462],[28.216051,54.018939],[28.219845,54.019352],[28.222654,54.01963],[28.227061,54.019978],[28.229476,54.020168],[28.230026,54.020211],[28.230533,54.020251],[28.230918,54.020281],[28.232955,54.020442],[28.240138,54.021007],[28.240992,54.021073],[28.259212,54.022492],[28.260853,54.022617],[28.264577,54.022901],[28.266468,54.023045],[28.2688,54.023235],[28.271074,54.023418],[28.272272,54.023505],[28.274107,54.023638],[28.274693,54.023683],[28.276119,54.023794],[28.290905,54.024947],[28.291581,54.025],[28.301119,54.025744],[28.306902,54.026287],[28.309491,54.02653],[28.314146,54.027125],[28.321614,54.028098],[28.329852,54.029172],[28.336949,54.030111],[28.34156,54.030722],[28.349869,54.031817],[28.351614,54.032047],[28.357265,54.032792],[28.361193,54.033308],[28.365062,54.033863],[28.365948,54.034001],[28.367822,54.034293],[28.370627,54.034759],[28.372602,54.035116],[28.374622,54.035502],[28.37868,54.036333],[28.380722,54.036779],[28.384171,54.037531],[28.391147,54.03935],[28.398238,54.041359],[28.406065,54.043552],[28.408051,54.04412],[28.410061,54.044694],[28.413908,54.045767],[28.418033,54.046968],[28.420689,54.047815],[28.421057,54.047948],[28.425419,54.04953],[28.427617,54.050421],[28.429002,54.051037],[28.431526,54.052228],[28.435128,54.054074],[28.443154,54.058194],[28.444301,54.05879],[28.444495,54.058891],[28.446115,54.059743],[28.448144,54.06081],[28.448298,54.060902],[28.448923,54.06122],[28.449162,54.061336],[28.4515,54.06252],[28.453149,54.063409],[28.454924,54.064364],[28.456506,54.06526],[28.458962,54.066681],[28.460822,54.067803],[28.462177,54.068634],[28.463752,54.069659],[28.465388,54.070723],[28.467157,54.071956],[28.467559,54.072244],[28.469958,54.073964],[28.471522,54.075139],[28.472835,54.076173],[28.474052,54.077133],[28.47651,54.079193],[28.476878,54.079509],[28.476886,54.079516],[28.477727,54.080238],[28.478895,54.081324],[28.479884,54.082244],[28.480701,54.083004],[28.481612,54.083864],[28.481926,54.084161],[28.482149,54.084374],[28.483612,54.08577],[28.484801,54.086904],[28.484852,54.086953],[28.488399,54.090338],[28.490908,54.092725],[28.492521,54.094263],[28.493426,54.095127],[28.497824,54.099327],[28.499822,54.101247],[28.500715,54.102093],[28.506828,54.10789],[28.508619,54.109592],[28.512873,54.113633],[28.515817,54.116524],[28.517142,54.117763],[28.519025,54.119523],[28.520043,54.120407],[28.52175,54.121887],[28.523547,54.123381],[28.525029,54.124541],[28.525341,54.124783],[28.525753,54.125103],[28.52676,54.125886],[28.527431,54.126378],[28.528434,54.12713],[28.530258,54.128498],[28.532215,54.129966],[28.533074,54.130589],[28.534721,54.131842],[28.535438,54.132387],[28.535853,54.132703],[28.538675,54.134974],[28.54029,54.136293],[28.54188,54.13762],[28.54384,54.139315],[28.544262,54.13968],[28.546653,54.141829],[28.548436,54.143516],[28.550171,54.145226],[28.551986,54.147083],[28.553089,54.148211],[28.555623,54.150902],[28.557959,54.153605],[28.558961,54.154791],[28.559639,54.155593],[28.561239,54.157606],[28.563147,54.160071],[28.563212,54.160155],[28.565035,54.162523],[28.565668,54.163345],[28.565988,54.163792],[28.567977,54.166359],[28.569392,54.168203],[28.569507,54.168356],[28.571102,54.170416],[28.571352,54.170739],[28.57241,54.172109],[28.572523,54.172255],[28.574521,54.17482],[28.575889,54.176706],[28.576349,54.177225],[28.578172,54.179637],[28.578309,54.179818],[28.579965,54.181931],[28.580061,54.182046],[28.581654,54.183944],[28.582895,54.185328],[28.584434,54.186878],[28.584629,54.187063],[28.591594,54.19362],[28.593412,54.195392],[28.593623,54.195599],[28.599881,54.201487],[28.601152,54.202681],[28.606137,54.207363],[28.607126,54.208245],[28.607703,54.208746],[28.608079,54.209072],[28.608399,54.209342],[28.609323,54.210102],[28.609782,54.210479],[28.610752,54.211283],[28.611413,54.21183],[28.612979,54.212979],[28.614365,54.214063],[28.616993,54.215938],[28.618844,54.217195],[28.619669,54.217756],[28.623451,54.220199],[28.629073,54.223868],[28.632317,54.225986],[28.632779,54.226269],[28.634353,54.227231],[28.636058,54.228323],[28.638091,54.22962],[28.63842,54.229831],[28.639543,54.230555],[28.648576,54.236374],[28.65005,54.237342],[28.650755,54.237805],[28.651856,54.238609],[28.652562,54.239167],[28.654174,54.240458],[28.65601,54.242146],[28.656744,54.242844],[28.658057,54.244301],[28.659318,54.245812],[28.660773,54.247867],[28.661743,54.249422],[28.662567,54.250891],[28.663012,54.251762],[28.663624,54.252946],[28.665769,54.257099],[28.666225,54.257943],[28.66669,54.258704],[28.667543,54.259847],[28.668246,54.260674],[28.66908,54.26147],[28.66972,54.262022],[28.670408,54.262564],[28.67119,54.263141],[28.6719,54.263614],[28.672829,54.264144],[28.673635,54.264581],[28.674554,54.265065],[28.675515,54.265504],[28.676368,54.26587],[28.677875,54.266475],[28.678723,54.266775],[28.679435,54.267014],[28.680237,54.267248],[28.680625,54.267346],[28.682144,54.267729],[28.686024,54.268559],[28.687355,54.268852],[28.688466,54.269071],[28.689607,54.26925],[28.690569,54.269362],[28.691879,54.269553],[28.694232,54.269891],[28.694748,54.269937],[28.695516,54.270006],[28.696695,54.270061],[28.698632,54.27008],[28.704909,54.2701],[28.70708,54.270115],[28.708283,54.270134],[28.709272,54.270167],[28.709817,54.2702],[28.710498,54.270289],[28.710732,54.27032],[28.711226,54.270379],[28.71207,54.270507],[28.712894,54.270663],[28.713817,54.270863],[28.714671,54.271085],[28.715536,54.271348],[28.716142,54.271551],[28.716815,54.271782],[28.717571,54.272062],[28.718321,54.272377],[28.719643,54.273012],[28.72349,54.274994],[28.72442,54.275474],[28.725458,54.276008],[28.735114,54.280963],[28.738602,54.282752],[28.745693,54.286407],[28.74631,54.286719],[28.749279,54.28822],[28.751052,54.289139],[28.751948,54.28959],[28.752848,54.289986],[28.753795,54.290351],[28.75513,54.290777],[28.756305,54.291116],[28.756601,54.291182],[28.757471,54.291377],[28.75828,54.291545],[28.759188,54.291678],[28.760514,54.291814],[28.761066,54.291845],[28.762114,54.291887],[28.76268,54.291881],[28.763267,54.291891],[28.76514,54.291858],[28.766781,54.29177],[28.767722,54.29172],[28.769495,54.291625],[28.770359,54.291586],[28.77443,54.2914],[28.775314,54.291359],[28.77652,54.291304],[28.780636,54.291116],[28.789501,54.290712],[28.796464,54.290395],[28.799596,54.290253],[28.801715,54.290145],[28.8048,54.290016],[28.805042,54.290006],[28.805964,54.289966],[28.808388,54.289843],[28.809938,54.28978],[28.810838,54.28974],[28.814976,54.289552],[28.819904,54.289328],[28.823947,54.289145],[28.824487,54.289117],[28.825938,54.289043],[28.827163,54.288999],[28.827784,54.288985],[28.829034,54.289027],[28.829865,54.289073],[28.833271,54.289352],[28.833938,54.289407],[28.838327,54.289784],[28.839452,54.289884],[28.842156,54.290123],[28.84422,54.290306],[28.84768,54.290613],[28.849262,54.290748],[28.850855,54.290823],[28.853149,54.290873],[28.857436,54.290966],[28.863167,54.29109],[28.864057,54.29111],[28.866003,54.291154],[28.867393,54.291185],[28.870999,54.291258],[28.872252,54.2913],[28.873707,54.291355],[28.874725,54.2914],[28.875577,54.291455],[28.876329,54.291533],[28.876917,54.2916],[28.877504,54.291678],[28.880664,54.292193],[28.881165,54.292275],[28.884612,54.292837],[28.894069,54.294371],[28.896293,54.294732],[28.897914,54.294995],[28.901629,54.295607],[28.902656,54.295785],[28.90425,54.29603],[28.905762,54.296258],[28.909734,54.296846],[28.910829,54.297008],[28.9163,54.297817],[28.919638,54.29823],[28.921176,54.298384],[28.922954,54.298509],[28.925135,54.29867],[28.926087,54.298748],[28.927762,54.298886],[28.929106,54.298995],[28.93019,54.299068],[28.933701,54.299228],[28.93792,54.299549],[28.938125,54.299565],[28.94,54.299709],[28.940835,54.299768],[28.945892,54.300126],[28.946875,54.300213],[28.948612,54.30039],[28.950161,54.30052],[28.950215,54.300524],[28.956274,54.300968],[28.96333,54.301485],[28.965865,54.301671],[28.970348,54.302055],[28.972144,54.302203],[28.973092,54.302282],[28.973632,54.30234],[28.974923,54.302483],[28.976487,54.302703],[28.9773,54.302824],[28.978696,54.303017],[28.980575,54.303345],[28.981795,54.303562],[28.983524,54.303894],[28.984201,54.304024],[28.985416,54.304209],[28.986046,54.304347],[28.986505,54.304458],[28.986632,54.304489],[28.99057,54.305228],[28.997865,54.306629],[29.000897,54.307249],[29.002802,54.307637],[29.002844,54.307646],[29.004419,54.307947],[29.00734,54.30842],[29.016666,54.309789],[29.018942,54.310107],[29.021851,54.310513],[29.026288,54.311118],[29.029844,54.311698],[29.03035,54.311782],[29.033734,54.312345],[29.036658,54.312845],[29.038863,54.313268],[29.04104,54.313761],[29.043459,54.314328],[29.045342,54.314831],[29.046757,54.315209],[29.049367,54.315959],[29.051353,54.316618],[29.055373,54.318035],[29.056326,54.318369],[29.057873,54.318917],[29.058454,54.319122],[29.058962,54.319302],[29.062424,54.320507],[29.071012,54.32355],[29.071391,54.323684],[29.08499,54.328503],[29.092703,54.331236],[29.094125,54.331804],[29.095596,54.332426],[29.098438,54.333708],[29.098503,54.333737],[29.099653,54.33428],[29.100888,54.334929],[29.101264,54.335128],[29.102496,54.335811],[29.104069,54.336713],[29.105322,54.337459],[29.106068,54.337903],[29.108405,54.33939],[29.10971,54.340339],[29.110628,54.341005],[29.116325,54.34533],[29.118585,54.346933],[29.12012,54.34799],[29.121181,54.348664],[29.122201,54.349283],[29.12375,54.350129],[29.124666,54.350603],[29.125127,54.350841],[29.126539,54.351587],[29.128531,54.352544],[29.1296,54.353014],[29.130749,54.35352],[29.132437,54.35423],[29.133656,54.35472],[29.134656,54.355087],[29.136635,54.355805],[29.14166,54.357505],[29.150708,54.360566],[29.15334,54.361439],[29.155661,54.36216],[29.156237,54.362333],[29.157255,54.362639],[29.158688,54.363042],[29.159681,54.363302],[29.161813,54.363817],[29.16416,54.364365],[29.165921,54.364757],[29.167181,54.365007],[29.168666,54.365274],[29.169308,54.36539],[29.170493,54.365604],[29.171164,54.365725],[29.173585,54.366101],[29.17643,54.366548],[29.183029,54.367611],[29.185235,54.367961],[29.194185,54.369379],[29.200399,54.370359],[29.200496,54.370374],[29.203157,54.370793],[29.205406,54.371131],[29.206128,54.371237],[29.2093,54.37168],[29.211784,54.371974],[29.213344,54.372118],[29.214989,54.372225],[29.217442,54.372372],[29.219867,54.372492],[29.222248,54.372569],[29.224487,54.372575],[29.227521,54.372528],[29.230556,54.372475],[29.238675,54.372333],[29.243513,54.372218],[29.246104,54.372169],[29.248504,54.372124],[29.261513,54.371875],[29.264885,54.37181],[29.276684,54.371577],[29.279331,54.371525],[29.281057,54.371491],[29.282263,54.371477],[29.286086,54.371384],[29.287544,54.371363],[29.288484,54.371352],[29.289087,54.371342],[29.290408,54.371312],[29.291767,54.371312],[29.292304,54.371332],[29.293625,54.371381],[29.295186,54.371454],[29.296497,54.371533],[29.297803,54.371656],[29.298928,54.371774],[29.300041,54.371916],[29.301531,54.372106],[29.303815,54.372465],[29.305746,54.372818],[29.307099,54.373107],[29.307455,54.37319],[29.308302,54.37339],[29.309272,54.373649],[29.309976,54.373846],[29.310548,54.374006],[29.311162,54.374175],[29.311784,54.374363],[29.312425,54.374549],[29.313239,54.374819],[29.316427,54.375842],[29.318902,54.376619],[29.320129,54.37696],[29.321599,54.377368],[29.322937,54.377722],[29.324877,54.378211],[29.327704,54.378862],[29.33045,54.379442],[29.333585,54.38003],[29.33453,54.380188],[29.335802,54.380401],[29.336487,54.380515],[29.33899,54.38087],[29.339761,54.380977],[29.340298,54.381052],[29.343538,54.38147],[29.347184,54.381956],[29.349098,54.38221],[29.350706,54.382419],[29.354628,54.382929],[29.359618,54.383605],[29.361452,54.383864],[29.363147,54.384137],[29.365014,54.38444],[29.365501,54.384526],[29.36754,54.384886],[29.369231,54.385226],[29.370752,54.385519],[29.372933,54.38598],[29.375182,54.386466],[29.379722,54.387455],[29.385106,54.388628],[29.394184,54.390597],[29.39521,54.39082],[29.405632,54.393102],[29.408796,54.393781],[29.410815,54.394214],[29.413439,54.394766],[29.41602,54.395275],[29.420236,54.396046],[29.422684,54.396461],[29.423394,54.396573],[29.425826,54.396956],[29.428155,54.397315],[29.431432,54.397744],[29.437748,54.398497],[29.449067,54.399846],[29.451025,54.40008],[29.452505,54.40026],[29.453193,54.400356],[29.454064,54.400478],[29.456429,54.400821],[29.457848,54.401052],[29.459933,54.401392],[29.463122,54.401985],[29.464903,54.402319],[29.467199,54.402793],[29.467939,54.402951],[29.468659,54.403104],[29.470502,54.403474],[29.482805,54.405975],[29.484227,54.406265],[29.487418,54.40691],[29.489087,54.407257],[29.490858,54.407671],[29.492512,54.408093],[29.494074,54.408513],[29.495805,54.409002],[29.496646,54.409252],[29.497516,54.40951],[29.499591,54.410193],[29.502335,54.41121],[29.505793,54.412527],[29.507534,54.413229],[29.509129,54.413917],[29.509643,54.414141],[29.515408,54.41665],[29.516564,54.417157],[29.518701,54.418094],[29.519307,54.418354],[29.521027,54.419104],[29.521924,54.419462],[29.522713,54.419777],[29.523509,54.420112],[29.524332,54.4204],[29.525949,54.420948],[29.528209,54.421666],[29.530312,54.422283],[29.532233,54.422779],[29.534411,54.423314],[29.535555,54.423565],[29.536015,54.423666],[29.537717,54.424051],[29.539511,54.424432],[29.541124,54.424791],[29.545438,54.425748],[29.54615,54.425906],[29.549756,54.426714],[29.551166,54.42703],[29.557937,54.428534],[29.560594,54.429109],[29.56385,54.429765],[29.564236,54.429834],[29.567484,54.430413],[29.570353,54.43089],[29.577718,54.43191],[29.579273,54.432125],[29.579842,54.432204],[29.583536,54.432713],[29.584276,54.432816],[29.588184,54.433311],[29.589685,54.433496],[29.591108,54.4337],[29.594088,54.434126],[29.596943,54.434534],[29.599907,54.434944],[29.602451,54.435297],[29.60507,54.43562],[29.609038,54.436188],[29.610066,54.436335],[29.61408,54.43691],[29.615188,54.437076],[29.616383,54.437243],[29.618195,54.437529],[29.62148,54.438145],[29.623094,54.438482],[29.62432,54.438759],[29.625157,54.438948],[29.627612,54.439568],[29.628816,54.439895],[29.630275,54.440302],[29.633756,54.441365],[29.637185,54.442452],[29.63819,54.442775],[29.643998,54.444644],[29.64905,54.446246],[29.64993,54.446525],[29.651454,54.44701],[29.65207,54.447206],[29.65351,54.447664],[29.656801,54.448668],[29.657858,54.448998],[29.660238,54.449728],[29.661906,54.45018],[29.665401,54.451112],[29.66573,54.451199],[29.679332,54.454408],[29.686958,54.456206],[29.691288,54.457197],[29.693951,54.457741],[29.695852,54.458092],[29.697971,54.45843],[29.698769,54.458556],[29.699818,54.458721],[29.703013,54.459123],[29.703954,54.4592],[29.708618,54.459655],[29.70976,54.459767],[29.711516,54.459923],[29.715793,54.460237],[29.716669,54.460314],[29.717592,54.460395],[29.721235,54.460698],[29.723646,54.460911],[29.726408,54.461155],[29.728636,54.461341],[29.729972,54.461464],[29.734943,54.461924],[29.738408,54.462292],[29.739537,54.46242],[29.740766,54.462559],[29.743931,54.463023],[29.746371,54.463413],[29.747327,54.463579],[29.748948,54.46388],[29.751524,54.464382],[29.753671,54.464863],[29.753883,54.464911],[29.754345,54.465014],[29.7599,54.46627],[29.768295,54.468177],[29.768317,54.468182],[29.782367,54.471374],[29.79578,54.47442],[29.796408,54.47456],[29.803086,54.476043],[29.80384,54.476211],[29.80602,54.47668],[29.80663,54.476794],[29.806961,54.476866],[29.808415,54.477129],[29.8104,54.477435],[29.811026,54.477518],[29.811516,54.477583],[29.813005,54.477781],[29.820404,54.478627],[29.823478,54.478949],[29.825986,54.479179],[29.826813,54.479227],[29.828796,54.479344],[29.831283,54.479438],[29.833391,54.479438],[29.835602,54.479393],[29.837537,54.479301],[29.839473,54.479128],[29.841599,54.478899],[29.842028,54.478843],[29.843247,54.478685],[29.844426,54.478498],[29.845663,54.478302],[29.84716,54.478027],[29.848964,54.477663],[29.851399,54.477182],[29.852075,54.477047],[29.855907,54.47628],[29.856565,54.476151],[29.857561,54.475956],[29.859086,54.475656],[29.860086,54.475459],[29.862382,54.475057],[29.86367,54.47485],[29.864893,54.474657],[29.866325,54.474458],[29.86685,54.474385],[29.868784,54.474147],[29.870477,54.473957],[29.87127,54.473879],[29.87176,54.47384],[29.873691,54.473687],[29.875343,54.473564],[29.877126,54.473461],[29.878828,54.473381],[29.881302,54.473298],[29.881342,54.473297],[29.883671,54.473262],[29.885445,54.473275],[29.886813,54.473313],[29.887096,54.473322],[29.887909,54.473342],[29.889718,54.4734],[29.891707,54.47351],[29.893939,54.47366],[29.896347,54.473858],[29.8982,54.474065],[29.900222,54.474298],[29.901879,54.474536],[29.90582,54.4751],[29.911415,54.475917],[29.912176,54.476029],[29.912951,54.47614],[29.915816,54.47655],[29.917021,54.476729],[29.921495,54.47739],[29.923959,54.477745],[29.927509,54.478257],[29.929808,54.478588],[29.931454,54.478832],[29.933829,54.479184],[29.934566,54.479293],[29.938634,54.479895],[29.942284,54.48043],[29.946856,54.4811],[29.952715,54.481959],[29.955877,54.482418],[29.958974,54.482867],[29.961671,54.483246],[29.96179,54.483266],[29.962667,54.483392],[29.969655,54.484413],[29.97312,54.484926],[29.975581,54.485276],[29.976319,54.485381],[29.97877,54.48573],[29.98335,54.48639],[29.991909,54.48762],[30.000757,54.488891],[30.001012,54.488928],[30.006708,54.489763],[30.015925,54.491113],[30.0179,54.491403],[30.019759,54.491672],[30.021392,54.491909],[30.022045,54.492035],[30.022227,54.492068],[30.024981,54.492483],[30.025728,54.492624],[30.026449,54.492768],[30.027263,54.492961],[30.028327,54.493256],[30.029698,54.493665],[30.030962,54.494048],[30.032057,54.494377],[30.033263,54.494738],[30.033654,54.494851],[30.035756,54.49543],[30.03983,54.496643],[30.044996,54.498198],[30.04639,54.498618],[30.047802,54.499019],[30.048452,54.499193],[30.048761,54.499276],[30.049922,54.499519],[30.050506,54.499617],[30.051188,54.499711],[30.052413,54.499864],[30.053815,54.499964],[30.055382,54.500071],[30.05801,54.500227],[30.06112,54.500411],[30.064315,54.500613],[30.071076,54.501039],[30.074127,54.501225],[30.075825,54.501329],[30.080515,54.501661],[30.081663,54.501742],[30.082393,54.501792],[30.086887,54.502051],[30.087923,54.502135],[30.089766,54.502307],[30.090829,54.502423],[30.09433,54.502887],[30.100106,54.503684],[30.101794,54.503917],[30.104123,54.504258],[30.10519,54.504398],[30.106894,54.504651],[30.107704,54.504763],[30.110777,54.505191],[30.114018,54.505642],[30.114967,54.505772],[30.11643,54.50594],[30.117451,54.506105],[30.119137,54.506361],[30.120546,54.506583],[30.12211,54.50687],[30.123882,54.507356],[30.125157,54.507728],[30.125345,54.507794],[30.126213,54.508098],[30.127314,54.508539],[30.128466,54.509058],[30.136532,54.513142],[30.137717,54.513741],[30.138985,54.514383],[30.142638,54.51625],[30.143174,54.516539],[30.146589,54.518258],[30.148631,54.519306],[30.148773,54.519379],[30.15601,54.52309],[30.157224,54.523687],[30.157329,54.523738],[30.159201,54.524659],[30.162531,54.526309],[30.163124,54.526603],[30.166722,54.528386],[30.168178,54.52912],[30.170792,54.530436],[30.172272,54.531177],[30.176048,54.533068],[30.18303,54.536574],[30.183984,54.537048],[30.1841,54.537105],[30.187644,54.538865],[30.189021,54.539554],[30.19044,54.540256],[30.193219,54.541653],[30.194033,54.542002],[30.195287,54.542482],[30.19566,54.542597],[30.196283,54.542788],[30.197931,54.543215],[30.198996,54.543437],[30.199812,54.543569],[30.200554,54.543689],[30.203395,54.544126],[30.207601,54.544728],[30.208223,54.544811],[30.209243,54.544949],[30.213282,54.545497],[30.215405,54.545776],[30.217297,54.546026],[30.221292,54.546581],[30.224907,54.547083],[30.226475,54.547298],[30.227461,54.547434],[30.228802,54.547618],[30.230718,54.547891],[30.235435,54.548545],[30.238506,54.548973],[30.241362,54.549372],[30.24197,54.549457],[30.24453,54.549804],[30.252042,54.550831],[30.255979,54.551376],[30.261524,54.552145],[30.269662,54.553328],[30.270369,54.553428],[30.270593,54.55346],[30.271821,54.553709],[30.27357,54.554199],[30.274656,54.55456],[30.275147,54.554743],[30.275614,54.554943],[30.277011,54.555571],[30.278036,54.556094],[30.279529,54.556855],[30.28099,54.557643],[30.281836,54.558118],[30.282359,54.558404],[30.282834,54.558665],[30.283655,54.559113],[30.286092,54.56043],[30.286579,54.560696],[30.288212,54.56155],[30.289645,54.562231],[30.290723,54.562701],[30.292702,54.563491],[30.293628,54.563856],[30.29485,54.564277],[30.296354,54.564777],[30.29875,54.565553],[30.30118,54.566334],[30.302871,54.566875],[30.30677,54.568179],[30.307551,54.568427],[30.310073,54.569208],[30.311648,54.569718],[30.3142,54.57055],[30.31609,54.57132],[30.317893,54.572166],[30.318005,54.572219],[30.32129,54.573892],[30.324897,54.575728],[30.325512,54.57606],[30.32621,54.57647],[30.32733,54.57725],[30.330925,54.580231],[30.340352,54.588048],[30.341447,54.588956],[30.343208,54.590416],[30.344394,54.591402],[30.345777,54.592543],[30.346102,54.592811],[30.348556,54.594835],[30.349128,54.595315],[30.350028,54.596071],[30.351324,54.597139],[30.352123,54.597798],[30.354661,54.59989],[30.35582,54.600767],[30.356755,54.601381],[30.357114,54.601589],[30.357492,54.601793],[30.35778,54.601942],[30.357827,54.601966],[30.358139,54.602127],[30.358546,54.602322],[30.358593,54.602344],[30.358792,54.60244],[30.360272,54.603023],[30.362893,54.6039],[30.364909,54.6046],[30.365542,54.604815],[30.366522,54.605161],[30.36702,54.605329],[30.368097,54.605671],[30.37108,54.606699],[30.373036,54.607359],[30.378316,54.609162],[30.3796,54.6096],[30.384965,54.611497],[30.385921,54.611828],[30.391347,54.613672],[30.391905,54.613871],[30.392776,54.614206],[30.398917,54.616331],[30.399901,54.616672],[30.400492,54.616876],[30.403442,54.617881],[30.404074,54.6181],[30.405631,54.618667],[30.406048,54.618817],[30.406377,54.618911],[30.407768,54.619319],[30.408704,54.619553],[30.409954,54.619851],[30.409966,54.619854],[30.411118,54.620073],[30.412519,54.620273],[30.412928,54.620332],[30.419661,54.621077],[30.423706,54.621543],[30.424205,54.6216],[30.424869,54.621676],[30.425693,54.621781],[30.427006,54.621951],[30.427304,54.621992],[30.42791,54.622075],[30.429565,54.622307],[30.431298,54.622541],[30.432627,54.62272],[30.434652,54.622971],[30.434748,54.622984],[30.434944,54.62301],[30.435428,54.623074],[30.438348,54.623477],[30.439422,54.623623],[30.440118,54.623709],[30.441544,54.623886],[30.446702,54.624544],[30.448954,54.624819],[30.450381,54.624988],[30.458651,54.626026],[30.461676,54.626421],[30.466976,54.627077],[30.467163,54.6271],[30.467989,54.627202],[30.469073,54.627338],[30.471784,54.627678],[30.475953,54.628202],[30.481003,54.628837],[30.48572,54.62943],[30.489299,54.62988],[30.492443,54.630284],[30.497823,54.630973],[30.502753,54.631604],[30.506926,54.632145],[30.507335,54.632195],[30.508264,54.632307],[30.509682,54.63249],[30.513938,54.633039],[30.527143,54.634694],[30.527475,54.63473],[30.532453,54.635351],[30.532968,54.635416],[30.535204,54.635677],[30.535614,54.63573],[30.535959,54.635774],[30.541286,54.636454],[30.547504,54.637217],[30.558807,54.638589],[30.562253,54.638977],[30.564647,54.639262],[30.565448,54.639354],[30.565739,54.639388],[30.566054,54.639421],[30.569435,54.639867],[30.573308,54.640334],[30.575615,54.640604],[30.58319,54.64153],[30.586721,54.641955],[30.586756,54.641959],[30.591282,54.642503],[30.592038,54.6426],[30.592836,54.642721],[30.593388,54.642821],[30.593891,54.642934],[30.595349,54.643265],[30.597166,54.643698],[30.601797,54.644802],[30.604304,54.645377],[30.616187,54.648221],[30.624154,54.650109],[30.630699,54.651649],[30.635189,54.652719],[30.637458,54.653243],[30.640392,54.653939],[30.642807,54.654504],[30.645858,54.65521],[30.650515,54.656312],[30.652375,54.656746],[30.656653,54.657741],[30.657998,54.658036],[30.658317,54.658105],[30.662101,54.658997],[30.663067,54.659219],[30.663838,54.659394],[30.664612,54.659562],[30.66522,54.659694],[30.667486,54.660186],[30.669927,54.66084],[30.687185,54.66487],[30.689662,54.665449],[30.694962,54.666697],[30.703364,54.668675],[30.703961,54.66882],[30.704289,54.668894],[30.706806,54.669478],[30.708145,54.669789],[30.719432,54.672464],[30.721614,54.672966],[30.722257,54.673117],[30.722489,54.673164],[30.722564,54.673179],[30.723506,54.673371],[30.724583,54.673556],[30.729658,54.674426],[30.731721,54.674782],[30.734458,54.675248],[30.737251,54.675726],[30.740848,54.676347],[30.743425,54.676783],[30.752859,54.678395],[30.768401,54.681061],[30.769176,54.681194],[30.769361,54.681226],[30.769541,54.681257],[30.7784,54.682783],[30.780772,54.683191],[30.781361,54.683279],[30.781954,54.683351],[30.782786,54.683434],[30.783629,54.68349],[30.785842,54.683599],[30.800279,54.684348],[30.800572,54.684364],[30.809068,54.68481],[30.810846,54.684903],[30.812484,54.684989],[30.814323,54.685083],[30.815073,54.685122],[30.815354,54.685137],[30.815894,54.685165],[30.816562,54.6852],[30.820714,54.685418],[30.823523,54.685565],[30.831956,54.686042],[30.85407,54.687396],[30.859796,54.687745],[30.864369,54.688019],[30.872231,54.688483],[30.873382,54.688539],[30.883483,54.689172],[30.88499,54.689243],[30.886478,54.689278],[30.889538,54.689318],[30.891375,54.689361],[30.895868,54.689428],[30.903124,54.689529],[30.906132,54.689571],[30.925229,54.689856],[30.931638,54.689957],[30.935637,54.69002],[30.938976,54.690053],[30.94038,54.690067],[30.941855,54.690081],[30.942924,54.690102],[30.945658,54.690139],[30.946782,54.690156],[30.948268,54.690177],[30.954554,54.690268],[30.957197,54.690331],[30.962326,54.690402],[30.962804,54.690408],[30.966913,54.690463],[30.967884,54.69047],[30.970945,54.690509],[30.971271,54.690515],[30.973543,54.690552],[30.982741,54.690699],[30.983962,54.690714],[30.988479,54.690772],[30.989128,54.690781],[30.989617,54.690787],[30.990337,54.690796],[30.992596,54.690829],[30.997285,54.690898],[30.998108,54.69091],[30.998917,54.690921],[30.999861,54.690933],[31.001497,54.690956],[31.003491,54.690976],[31.009823,54.691059],[31.011802,54.691084],[31.013753,54.69111],[31.014383,54.691119],[31.01528,54.691131],[31.015933,54.691133],[31.016478,54.691134],[31.016532,54.691134],[31.016717,54.691135],[31.016964,54.691135],[31.018242,54.691164],[31.018416,54.691163],[31.020112,54.691122],[31.022087,54.691036],[31.022599,54.69102],[31.023308,54.690982],[31.027075,54.690818],[31.028459,54.690761],[31.035363,54.690475],[31.037152,54.690389],[31.04054,54.690258],[31.041232,54.69022],[31.041503,54.690207],[31.044125,54.690089],[31.045106,54.690047],[31.048089,54.689891],[31.048678,54.689861],[31.05053,54.689776],[31.051097,54.689747],[31.052844,54.689694],[31.053685,54.689713],[31.054631,54.689734],[31.057441,54.689797],[31.059038,54.689833],[31.060721,54.689864],[31.061144,54.689872],[31.062362,54.689895],[31.063894,54.689953],[31.065012,54.690037],[31.066075,54.690141],[31.069388,54.690487],[31.074704,54.691016],[31.075069,54.691048],[31.08039,54.691578],[31.087445,54.69227],[31.089556,54.692475],[31.091781,54.692692],[31.093872,54.69291],[31.114455,54.694924],[31.118401,54.695291],[31.12694,54.696132],[31.127485,54.696185],[31.173661,54.700731],[31.174947,54.700858],[31.178563,54.701213],[31.181176,54.701456],[31.181541,54.70149],[31.184195,54.701739],[31.184488,54.701765],[31.18815,54.702131],[31.199588,54.703248],[31.20155,54.703495],[31.20217,54.703572],[31.202969,54.703686],[31.208159,54.704457],[31.210705,54.704834],[31.244178,54.709802],[31.245498,54.7101],[31.267686,54.716501],[31.278002,54.719478],[31.27875,54.719694],[31.279441,54.719889],[31.281713,54.720536],[31.283437,54.721046],[31.284367,54.721296],[31.286963,54.722024],[31.28829,54.722338],[31.297824,54.724011],[31.297915,54.724027],[31.307462,54.725665],[31.321691,54.728067],[31.326832,54.728935],[31.329862,54.729363],[31.330236,54.729404],[31.330806,54.729473],[31.332895,54.729811],[31.333843,54.729973],[31.334085,54.730014],[31.334929,54.730161],[31.335793,54.73032],[31.336401,54.73043],[31.337279,54.730628],[31.339401,54.731137],[31.340517,54.731434],[31.343702,54.732254],[31.34991,54.733666],[31.353039,54.734369],[31.356048,54.73504],[31.356458,54.73513],[31.37285,54.738881],[31.373745,54.739028],[31.374701,54.739132],[31.37655,54.739311],[31.400473,54.741615],[31.403573,54.741913],[31.40396,54.74195],[31.406302,54.742156],[31.408008,54.742329],[31.411167,54.742649],[31.412018,54.74273],[31.428719,54.744337],[31.428962,54.744363],[31.429192,54.744385],[31.478294,54.749085],[31.479353,54.749199],[31.480407,54.749367],[31.481522,54.749596],[31.482446,54.749837],[31.483283,54.750096],[31.484056,54.750356],[31.484855,54.750663],[31.488116,54.751963],[31.513807,54.762626],[31.514227,54.762802],[31.516378,54.763705],[31.533576,54.770889],[31.535168,54.771554],[31.538826,54.773094],[31.568281,54.785484],[31.570378,54.786369],[31.571412,54.786853],[31.575489,54.789089],[31.581433,54.792325],[31.583868,54.793651],[31.584948,54.794238],[31.585594,54.79459],[31.586272,54.79496],[31.586945,54.795327],[31.58908,54.796491],[31.590721,54.797385],[31.599857,54.802345],[31.606531,54.80601],[31.607564,54.806513],[31.608289,54.806821],[31.609997,54.807446],[31.612206,54.807985],[31.622835,54.810311],[31.623052,54.810361],[31.624638,54.810714],[31.631075,54.812191],[31.634384,54.81295],[31.636406,54.813576],[31.637956,54.814227],[31.639343,54.814965],[31.640595,54.815793],[31.64437,54.819341],[31.645007,54.81994],[31.651936,54.826775],[31.652234,54.827079],[31.655594,54.830428],[31.65773,54.832555],[31.663251,54.838024],[31.665501,54.840231],[31.666244,54.840843],[31.666647,54.841151],[31.668185,54.842103],[31.669824,54.842806],[31.670382,54.842999],[31.671496,54.84335],[31.672408,54.843591],[31.673081,54.843752],[31.673751,54.843892],[31.67511,54.844132],[31.676177,54.844278],[31.67639,54.844297],[31.677032,54.844352],[31.679333,54.844445],[31.681947,54.844549],[31.684407,54.844646],[31.700765,54.845202],[31.741004,54.846729],[31.741207,54.846737],[31.778266,54.848197],[31.789571,54.848642],[31.798881,54.84901],[31.800579,54.849077],[31.806862,54.849325],[31.834788,54.850446],[31.836891,54.850517],[31.837715,54.850547],[31.839022,54.850608],[31.839267,54.850616],[31.839338,54.850618],[31.840747,54.850668],[31.843905,54.850788],[31.844082,54.850798],[31.844988,54.850834],[31.846528,54.850897],[31.847556,54.850947],[31.848638,54.850991],[31.850277,54.851064],[31.851026,54.851094],[31.852505,54.851139],[31.852945,54.851149],[31.854268,54.851177],[31.855141,54.851217],[31.855423,54.85123],[31.856092,54.851272],[31.856975,54.851337],[31.857606,54.851391],[31.858254,54.851447],[31.858821,54.851516],[31.859412,54.851593],[31.860188,54.851708],[31.860406,54.851746],[31.860584,54.85178],[31.861895,54.852078],[31.868822,54.853675],[31.879422,54.856085],[31.881418,54.856537],[31.885758,54.857525],[31.893639,54.859338],[31.895219,54.859702],[31.896554,54.859978],[31.896853,54.860036],[31.898266,54.860222],[31.898436,54.860245],[31.898631,54.860263],[31.899995,54.860372],[31.900136,54.86038],[31.901452,54.860436],[31.9035,54.860531],[31.905066,54.86056],[31.90733,54.860632],[31.907793,54.860648],[31.910416,54.860815],[31.912256,54.860916],[31.91284,54.860938],[31.930809,54.861742],[31.931707,54.861781],[31.936191,54.86198],[31.938803,54.862076],[31.938808,54.862076],[31.940502,54.862123],[31.941734,54.862171],[31.945427,54.862396],[31.956041,54.862866],[31.957556,54.862933],[31.959965,54.863002],[31.96499,54.863243],[31.968088,54.863382],[31.971242,54.863522],[31.971551,54.863537],[31.971695,54.863545],[31.972961,54.863606],[31.97481,54.863703],[31.97806,54.863902],[31.978733,54.863943],[31.979213,54.863978],[31.98204,54.864186],[31.984178,54.86435],[31.989258,54.864689],[31.989931,54.864736],[32.003442,54.865683],[32.003477,54.865685],[32.00411,54.865725],[32.004918,54.865803],[32.005846,54.865932],[32.006964,54.866129],[32.009782,54.866848],[32.011815,54.867365],[32.012712,54.867609],[32.017464,54.868876],[32.019626,54.869448],[32.021913,54.870045],[32.024054,54.870655],[32.025332,54.870986],[32.025398,54.871003],[32.029551,54.87209],[32.031179,54.872516],[32.036526,54.873949],[32.037945,54.874312],[32.043456,54.875756],[32.046661,54.876634],[32.049207,54.87731],[32.050527,54.877649],[32.051318,54.877858],[32.05215,54.878077],[32.064868,54.881449],[32.066554,54.88189],[32.067925,54.882234],[32.068548,54.882379],[32.070149,54.882788],[32.071404,54.883118],[32.072613,54.883433],[32.072791,54.883479],[32.073915,54.883755],[32.074107,54.883796],[32.074494,54.883876],[32.075285,54.884012],[32.075382,54.884029],[32.079355,54.884648],[32.080971,54.884894],[32.081217,54.884938],[32.081555,54.885006],[32.082562,54.885227],[32.084188,54.885623],[32.084903,54.885807],[32.093851,54.888117],[32.097771,54.889125],[32.099988,54.889683],[32.100695,54.889893],[32.101355,54.890092],[32.102541,54.890489],[32.104011,54.890998],[32.107678,54.892284],[32.107823,54.892328],[32.111283,54.893518],[32.112114,54.893806],[32.112541,54.893965],[32.113001,54.894138],[32.113612,54.894383],[32.113689,54.894418],[32.113902,54.894517],[32.114112,54.894628],[32.115264,54.895231],[32.115692,54.895477],[32.115886,54.895604],[32.116363,54.895932],[32.11765,54.896998],[32.118284,54.897746],[32.11887,54.898584],[32.119282,54.899278],[32.120144,54.900731],[32.124653,54.908991],[32.126194,54.911143],[32.12731,54.912054],[32.130298,54.914176],[32.139493,54.920627],[32.140049,54.920978],[32.144413,54.924023],[32.144987,54.924424],[32.147102,54.925899],[32.147883,54.926332],[32.149518,54.927122],[32.151856,54.928208],[32.157411,54.930775],[32.161215,54.932529],[32.161955,54.932876],[32.165772,54.934655],[32.168208,54.935717],[32.172682,54.937792],[32.175189,54.938955],[32.179697,54.941001],[32.180991,54.941681],[32.182156,54.942369],[32.190319,54.947949],[32.195797,54.951596],[32.203742,54.95582],[32.205267,54.956579],[32.205934,54.957035],[32.21369,54.961967],[32.217573,54.964441],[32.220755,54.966471],[32.221433,54.966888],[32.224863,54.969103],[32.233103,54.974326],[32.238866,54.977991],[32.238956,54.978048],[32.241858,54.979907],[32.243317,54.980837],[32.244734,54.981749],[32.245906,54.982471],[32.247051,54.98319],[32.248419,54.984085],[32.249641,54.984882],[32.259617,54.991219],[32.264658,54.994424],[32.268873,54.997093],[32.26956,54.997524],[32.271912,54.999018],[32.277758,55.002704],[32.288156,55.009337],[32.291076,55.011134],[32.292088,55.011784],[32.293346,55.012592],[32.294297,55.013201],[32.295559,55.01401],[32.295898,55.01423],[32.297388,55.015248],[32.298396,55.015841],[32.298681,55.016013],[32.299312,55.016348],[32.300183,55.016768],[32.300887,55.017057],[32.301546,55.017298],[32.302078,55.017478],[32.303002,55.017752],[32.304496,55.018194],[32.304999,55.018343],[32.307292,55.019019],[32.307861,55.019186],[32.31054,55.019935],[32.313853,55.020963],[32.315632,55.021455],[32.315945,55.021538],[32.316965,55.021822],[32.318145,55.022172],[32.319927,55.02269],[32.323309,55.023652],[32.325124,55.024132],[32.326314,55.024475],[32.327587,55.024895],[32.32898,55.025335],[32.331939,55.026222],[32.340836,55.028829],[32.342505,55.029299],[32.342611,55.029329],[32.344508,55.029736],[32.345975,55.029981],[32.34759,55.030147],[32.356797,55.030921],[32.361447,55.031354],[32.363784,55.031572],[32.366075,55.031786],[32.372443,55.032287],[32.380196,55.032987],[32.38238,55.033113],[32.402454,55.033699],[32.402721,55.033693],[32.4033,55.033709],[32.403805,55.03373],[32.404677,55.033755],[32.405555,55.033846],[32.406319,55.033972],[32.407607,55.034183],[32.499918,55.055249],[32.50213,55.055737],[32.503523,55.055959],[32.503955,55.056003],[32.504556,55.056047],[32.506824,55.056167],[32.508187,55.056207],[32.508814,55.056227],[32.50993,55.056279],[32.510176,55.05629],[32.517345,55.056623],[32.517377,55.056624],[32.520165,55.056744],[32.526318,55.056984],[32.52735,55.057024],[32.53028,55.057139],[32.550378,55.057958],[32.552946,55.058062],[32.554789,55.05814],[32.555531,55.058172],[32.55667,55.05822],[32.557879,55.058269],[32.56132,55.058409],[32.572534,55.058862],[32.576727,55.059032],[32.581497,55.059207],[32.582323,55.059246],[32.586097,55.059407],[32.592698,55.059655],[32.595951,55.05982],[32.597314,55.059961],[32.598678,55.060195],[32.599334,55.060333],[32.601084,55.060766],[32.602025,55.061011],[32.602728,55.061195],[32.609881,55.063064],[32.611138,55.063343],[32.612818,55.063791],[32.61864,55.065279],[32.620456,55.065748],[32.62163,55.066072],[32.621783,55.066112],[32.623573,55.066555],[32.625605,55.067121],[32.62622,55.06727],[32.62941,55.068043],[32.630234,55.068255],[32.631917,55.068686],[32.633425,55.069073],[32.634677,55.069434],[32.647798,55.072857],[32.650475,55.073553],[32.651971,55.073881],[32.660678,55.075573],[32.661763,55.075784],[32.663564,55.07613],[32.663907,55.076202],[32.664864,55.076368],[32.665964,55.076583],[32.668009,55.076977],[32.668521,55.07707],[32.66925,55.077205],[32.670322,55.077406],[32.670983,55.07752],[32.671524,55.07764],[32.672463,55.077849],[32.674471,55.07817],[32.675813,55.078343],[32.678494,55.078667],[32.678936,55.078699],[32.681402,55.078891],[32.682769,55.078962],[32.684127,55.079014],[32.685859,55.079046],[32.686233,55.079037],[32.6869,55.079046],[32.687209,55.079051],[32.689949,55.078976],[32.692431,55.078943],[32.693841,55.078944],[32.694135,55.078949],[32.694429,55.07895],[32.695582,55.078995],[32.697318,55.079083],[32.697475,55.079093],[32.697764,55.079111],[32.703007,55.079437],[32.705763,55.079586],[32.707658,55.079656],[32.708398,55.079661],[32.708851,55.079661],[32.709431,55.079645],[32.710078,55.07963],[32.712261,55.079633],[32.716008,55.079591],[32.7247,55.079442],[32.733273,55.079359],[32.733627,55.079353],[32.735233,55.079298],[32.739096,55.079225],[32.74315,55.079205],[32.7444,55.079233],[32.745693,55.079325],[32.749035,55.079751],[32.751961,55.080161],[32.752225,55.080198],[32.754052,55.080443],[32.754968,55.080566],[32.75543,55.080628],[32.756011,55.080717],[32.757805,55.080934],[32.760307,55.081273],[32.763633,55.081731],[32.763987,55.081775],[32.765286,55.081968],[32.766692,55.082177],[32.767708,55.082327],[32.768794,55.082488],[32.770469,55.082721],[32.773718,55.08319],[32.792406,55.085809],[32.812901,55.088675],[32.847984,55.093544],[32.852506,55.094231],[32.853729,55.094395],[32.855884,55.094691],[32.861865,55.095524],[32.872423,55.097001],[32.888881,55.0993],[32.891914,55.099707],[32.894964,55.100114],[32.895693,55.100211],[32.896212,55.100277],[32.896732,55.100344],[32.898443,55.100593],[32.900776,55.10095],[32.902618,55.101204],[32.908757,55.102039],[32.911949,55.102484],[32.914254,55.102815],[32.915476,55.102965],[32.915984,55.10304],[32.91619,55.10307],[32.917636,55.103303],[32.917693,55.103311],[32.918688,55.103447],[32.920218,55.103656],[32.92121,55.103792],[32.921908,55.103888],[32.923089,55.104054],[32.929325,55.104932],[32.93188,55.105291],[32.952909,55.107576],[32.962409,55.108586],[32.98341,55.110819],[32.993251,55.111866],[32.998678,55.112443],[33.000791,55.112667],[33.006309,55.113251],[33.013837,55.114045],[33.016678,55.114345],[33.02126,55.114776],[33.038515,55.116626],[33.040727,55.11685],[33.041928,55.116975],[33.043471,55.117138],[33.043886,55.117182],[33.043902,55.117184],[33.047815,55.117626],[33.05229,55.118084],[33.052887,55.118143],[33.056843,55.118529],[33.059113,55.118772],[33.060973,55.119031],[33.067201,55.119637],[33.073386,55.120237],[33.074823,55.120377],[33.097221,55.122751],[33.105255,55.123567],[33.117251,55.124785],[33.129634,55.126038],[33.135871,55.126655],[33.142058,55.127267],[33.14467,55.127532],[33.146261,55.127693],[33.148071,55.127876],[33.150503,55.128122],[33.155818,55.128655],[33.160031,55.129058],[33.164082,55.129408],[33.165659,55.129499],[33.167302,55.129594],[33.168566,55.129697],[33.168744,55.129713],[33.16952,55.129785],[33.171899,55.130002],[33.172837,55.130082],[33.173584,55.130167],[33.173926,55.130215],[33.175055,55.130327],[33.175944,55.130408],[33.176644,55.130471],[33.190777,55.131723],[33.192097,55.13184],[33.193273,55.131937],[33.195657,55.132135],[33.196514,55.132276],[33.196626,55.132294],[33.197992,55.132582],[33.198375,55.132676],[33.199229,55.13289],[33.200167,55.133149],[33.200349,55.133195],[33.201308,55.133436],[33.202195,55.133625],[33.203001,55.133805],[33.205695,55.134413],[33.2069,55.13471],[33.210675,55.135639],[33.212309,55.136086],[33.213511,55.136413],[33.214441,55.136636],[33.215279,55.13681],[33.216461,55.13701],[33.217508,55.137156],[33.221555,55.137641],[33.226899,55.138356],[33.234565,55.139345],[33.234849,55.139394],[33.234957,55.139412],[33.236486,55.139608],[33.236541,55.139615],[33.23717,55.139686],[33.237799,55.139772],[33.238578,55.139874],[33.239088,55.139942],[33.24346,55.140465],[33.246487,55.140842],[33.247761,55.141019],[33.25018,55.141326],[33.253267,55.141738],[33.255372,55.141922],[33.258752,55.142247],[33.260007,55.142381],[33.260527,55.142433],[33.261245,55.142484],[33.263284,55.14268],[33.264334,55.142759],[33.272944,55.143605],[33.273635,55.14367],[33.275527,55.143849],[33.283451,55.144628],[33.287001,55.144981],[33.290566,55.145426],[33.294646,55.145927],[33.320048,55.149302],[33.334268,55.151211],[33.336181,55.151467],[33.340099,55.151954],[33.344666,55.152559],[33.345984,55.152742],[33.34668,55.152854],[33.347057,55.152918],[33.347364,55.152976],[33.348843,55.153335],[33.35018,55.153656],[33.350836,55.153813],[33.352733,55.154245],[33.354411,55.154641],[33.359211,55.155718],[33.363532,55.156763],[33.365067,55.157102],[33.367426,55.157665],[33.370944,55.158506],[33.374641,55.15931],[33.375901,55.159605],[33.377507,55.159992],[33.381605,55.160923],[33.388568,55.162528],[33.390039,55.162872],[33.391217,55.163156],[33.393765,55.16374],[33.39789,55.164675],[33.397972,55.164694],[33.400176,55.165206],[33.40139,55.165489],[33.402721,55.16582],[33.404587,55.16624],[33.407323,55.1669],[33.408655,55.167171],[33.410609,55.167604],[33.414147,55.168413],[33.415139,55.168652],[33.416858,55.169067],[33.418328,55.169427],[33.419789,55.169766],[33.421469,55.170143],[33.422397,55.170349],[33.423833,55.170694],[33.424534,55.170866],[33.426186,55.171243],[33.430714,55.17224],[33.433844,55.172977],[33.436947,55.173695],[33.438217,55.173966],[33.439219,55.174247],[33.443171,55.175398],[33.44733,55.176636],[33.450276,55.177498],[33.452135,55.178039],[33.454386,55.178709],[33.456643,55.179358],[33.459257,55.180124],[33.460359,55.18045],[33.462206,55.181018],[33.462803,55.181197],[33.463027,55.181264],[33.463178,55.181309],[33.464865,55.181815],[33.465908,55.18213],[33.466965,55.182438],[33.467833,55.182675],[33.468494,55.182831],[33.469501,55.18303],[33.470451,55.183187],[33.471355,55.183302],[33.472093,55.183359],[33.472913,55.183405],[33.473609,55.183432],[33.474149,55.18344],[33.474581,55.183441],[33.474816,55.183437],[33.475132,55.183432],[33.475386,55.183429],[33.475556,55.183426],[33.476022,55.183419],[33.47938,55.183368],[33.483095,55.183316],[33.484161,55.183299],[33.492617,55.183168],[33.499529,55.183031],[33.501555,55.182991],[33.502787,55.182969],[33.50297,55.182965],[33.503277,55.182958],[33.504257,55.182926],[33.505888,55.182898],[33.508659,55.18285],[33.513972,55.182746],[33.516846,55.182685],[33.517416,55.182673],[33.521042,55.182622],[33.528272,55.182458],[33.532758,55.18236],[33.535779,55.182346],[33.545506,55.182111],[33.549144,55.182047],[33.551625,55.181996],[33.561278,55.181874],[33.562526,55.181856],[33.564254,55.18183],[33.565993,55.181803],[33.567996,55.181773],[33.586762,55.181496],[33.60366,55.181222],[33.605793,55.181126],[33.606109,55.181111],[33.608442,55.180996],[33.610443,55.180898],[33.611299,55.180856],[33.613303,55.180752],[33.61405,55.180713],[33.616758,55.180576],[33.617246,55.180557],[33.619478,55.180473],[33.624817,55.180272],[33.634935,55.179787],[33.642976,55.179416],[33.645651,55.179325],[33.646088,55.17931],[33.647663,55.179342],[33.650717,55.179572],[33.658024,55.180253],[33.661675,55.180617],[33.665516,55.180946],[33.675165,55.181818],[33.686865,55.182858],[33.688792,55.183026],[33.69302,55.183394],[33.698718,55.18389],[33.707327,55.184667],[33.708265,55.184752],[33.722266,55.186016],[33.733401,55.186994],[33.750145,55.188453],[33.752783,55.188664],[33.753217,55.188704],[33.755553,55.188919],[33.758441,55.189211],[33.758835,55.189248],[33.765877,55.189871],[33.769773,55.19026],[33.798052,55.192772],[33.79892,55.192849],[33.816309,55.194394],[33.834385,55.19596],[33.83664,55.196157],[33.841201,55.196563],[33.843999,55.196806],[33.846716,55.197042],[33.849605,55.197295],[33.853026,55.197594],[33.854931,55.197765],[33.857563,55.198],[33.860452,55.198251],[33.8626,55.198442],[33.865177,55.198673],[33.868836,55.19899],[33.870172,55.199044],[33.873329,55.199101],[33.876454,55.199158],[33.876484,55.199158],[33.878222,55.199193],[33.879826,55.199218],[33.882666,55.199277],[33.88553,55.199345],[33.887249,55.19938],[33.890185,55.199421],[33.893841,55.199492],[33.897147,55.199556],[33.899157,55.199575],[33.900238,55.199573],[33.902519,55.199518],[33.903417,55.199477],[33.905067,55.199371],[33.906316,55.199262],[33.908039,55.199084],[33.910442,55.198847],[33.912952,55.198443],[33.918059,55.197595],[33.926276,55.19616],[33.927065,55.196026],[33.944985,55.192989],[33.953454,55.191535],[33.954167,55.191423],[33.955281,55.191265],[33.955661,55.191225],[33.956004,55.191196],[33.956369,55.191169],[33.956847,55.19114],[33.95726,55.191125],[33.959828,55.191024],[33.967426,55.190807],[33.970575,55.190726],[33.972193,55.190676],[33.972974,55.190653],[33.973659,55.190632],[33.97464,55.1906],[33.984124,55.190315],[33.986667,55.190235],[33.988468,55.190183],[33.989189,55.190162],[33.990745,55.190114],[33.99232,55.190061],[33.992348,55.19006],[33.993301,55.190031],[33.994212,55.190002],[33.99578,55.189952],[33.998406,55.189905],[34.000916,55.18983],[34.003036,55.189764],[34.007962,55.189615],[34.009092,55.189588],[34.010405,55.18955],[34.012599,55.189496],[34.016146,55.189379],[34.016667,55.189362],[34.02006,55.189225],[34.020727,55.189192],[34.021075,55.189173],[34.022773,55.18909],[34.023205,55.189076],[34.025273,55.188986],[34.036405,55.188393],[34.0369,55.188368],[34.037739,55.188321],[34.042993,55.188086],[34.048598,55.187815],[34.05506,55.18747],[34.057101,55.187383],[34.057785,55.187366],[34.058426,55.187364],[34.05898,55.187375],[34.059492,55.187397],[34.060316,55.187454],[34.061362,55.187556],[34.062281,55.187684],[34.062838,55.187777],[34.063373,55.187882],[34.083679,55.191938],[34.087021,55.192603],[34.090569,55.193256],[34.091463,55.193441],[34.092913,55.193757],[34.09667,55.194508],[34.100837,55.195335],[34.101555,55.195477],[34.101786,55.195523],[34.116238,55.198438],[34.116272,55.198445],[34.120474,55.199251],[34.13508,55.202148],[34.139957,55.202932],[34.142988,55.203503],[34.143837,55.203703],[34.144937,55.203973],[34.145762,55.204239],[34.146721,55.204608],[34.147193,55.204796],[34.147681,55.205013],[34.148025,55.205179],[34.148986,55.205664],[34.149862,55.206086],[34.155136,55.208612],[34.156422,55.209249],[34.157098,55.209558],[34.157385,55.209682],[34.158107,55.209958],[34.159429,55.210401],[34.160074,55.210573],[34.160535,55.21067],[34.161077,55.210777],[34.163542,55.211197],[34.165126,55.211472],[34.170884,55.212424],[34.185135,55.21477],[34.196632,55.216675],[34.197032,55.216741],[34.21477,55.219632],[34.216181,55.21986],[34.216613,55.219932],[34.217773,55.220126],[34.22201,55.220765],[34.231889,55.221451],[34.234133,55.221622],[34.235564,55.22179],[34.237067,55.222108],[34.238113,55.222366],[34.24077,55.223103],[34.241426,55.223298],[34.24727,55.224982],[34.2555,55.227356],[34.25656,55.227624],[34.25722,55.227828],[34.258704,55.228276],[34.258854,55.228322],[34.26055,55.228805],[34.263286,55.229616],[34.264327,55.229886],[34.265285,55.230185],[34.271512,55.231986],[34.271595,55.23201],[34.299263,55.239371],[34.30034,55.239659],[34.304954,55.24089],[34.306187,55.241219],[34.306853,55.241396],[34.307423,55.24155],[34.307498,55.24157],[34.309021,55.24197],[34.309135,55.242001],[34.310413,55.242362],[34.310814,55.24246],[34.312264,55.242839],[34.312849,55.243006],[34.313086,55.243069],[34.313312,55.24313],[34.313517,55.243186],[34.313961,55.243296],[34.314518,55.243429],[34.318191,55.244417],[34.319397,55.244746],[34.322541,55.24557],[34.32355,55.245863],[34.324171,55.246016],[34.325697,55.246408],[34.329553,55.247449],[34.33132,55.247927],[34.334397,55.248765],[34.334626,55.248825],[34.335473,55.249046],[34.336575,55.249337],[34.338354,55.249809],[34.34023,55.2503],[34.358495,55.255957],[34.359732,55.25634],[34.373443,55.260553],[34.374085,55.260748],[34.388066,55.265101],[34.388108,55.265113],[34.389109,55.265408],[34.389123,55.265413],[34.389813,55.265634],[34.391579,55.266203],[34.392585,55.266528],[34.393557,55.266867],[34.399484,55.26896],[34.400201,55.269218],[34.400366,55.269275],[34.400546,55.269339],[34.434782,55.281497],[34.434903,55.28154],[34.437205,55.282382],[34.437914,55.282639],[34.438295,55.282774],[34.438468,55.282835],[34.439139,55.283072],[34.441901,55.284067],[34.444257,55.28489],[34.446011,55.285487],[34.447044,55.285842],[34.449927,55.286881],[34.453235,55.288057],[34.453307,55.288083],[34.454896,55.288627],[34.47274,55.294122],[34.475194,55.294985],[34.527459,55.313868],[34.531621,55.31537],[34.535591,55.316556],[34.559729,55.323317],[34.561323,55.323757],[34.562108,55.324003],[34.562844,55.324279],[34.581792,55.332227],[34.582386,55.332477],[34.582655,55.332583],[34.604115,55.341687],[34.625557,55.350719],[34.629473,55.35238],[34.639746,55.356681],[34.641857,55.357475],[34.649283,55.359965],[34.653014,55.361214],[34.65665,55.362435],[34.656998,55.362551],[34.661339,55.364006],[34.667183,55.365973],[34.668389,55.366417],[34.668425,55.366432],[34.675093,55.369193],[34.677157,55.370048],[34.685905,55.373698],[34.686745,55.374049],[34.687702,55.37451],[34.68868,55.374992],[34.692456,55.377017],[34.695051,55.378407],[34.695677,55.378755],[34.696435,55.37916],[34.696747,55.379322],[34.704285,55.383382],[34.705652,55.384192],[34.708381,55.385928],[34.709886,55.38688],[34.712606,55.388599],[34.714197,55.389479],[34.715846,55.390198],[34.717211,55.390735],[34.718519,55.391269],[34.736485,55.398484],[34.758495,55.407281],[34.758978,55.407475],[34.762463,55.408868],[34.76445,55.409669],[34.767661,55.410952],[34.769814,55.411837],[34.770878,55.412293],[34.773146,55.41333],[34.778901,55.415943],[34.780467,55.416662],[34.78189,55.417305],[34.786881,55.419415],[34.801496,55.425469],[34.8173,55.43203],[34.82021,55.43322],[34.820503,55.433341],[34.820533,55.433354],[34.822306,55.434088],[34.822344,55.434104],[34.822743,55.434276],[34.823556,55.434624],[34.825048,55.435241],[34.825588,55.435466],[34.826185,55.435712],[34.826999,55.436045],[34.82789,55.436418],[34.829167,55.436944],[34.831392,55.437866],[34.834484,55.439142],[34.835005,55.439356],[34.835594,55.439598],[34.837783,55.440499],[34.842513,55.442452],[34.845475,55.443676],[34.847212,55.444395],[34.850726,55.445884],[34.854529,55.447428],[34.854801,55.447539],[34.855594,55.447863],[34.859351,55.449391],[34.860002,55.449655],[34.864023,55.45132],[34.864322,55.451444],[34.864432,55.451489],[34.887068,55.460801],[34.888334,55.461321],[34.89988,55.466076],[34.903917,55.467718],[34.906739,55.468896],[34.907961,55.469433],[34.908933,55.469826],[34.90948,55.470047],[34.912113,55.471174],[34.912176,55.471202],[34.912716,55.471442],[34.913643,55.471858],[34.91527,55.472592],[34.922069,55.475658],[34.922677,55.475931],[34.923015,55.476083],[34.931331,55.479822],[34.934294,55.481151],[34.934675,55.481321],[34.943961,55.485496],[34.944846,55.485905],[34.946065,55.486447],[34.946535,55.486642],[34.947135,55.486875],[34.947523,55.487011],[34.948162,55.487227],[34.948761,55.487411],[34.949168,55.487523],[34.949675,55.487644],[34.950382,55.487805],[34.959187,55.489568],[34.95982,55.489697],[34.961193,55.48997],[34.962331,55.490194],[34.965039,55.490683],[34.967341,55.491085],[34.968019,55.491216],[34.970154,55.491702],[34.972546,55.492232],[34.976457,55.492996],[34.977103,55.493099],[34.977516,55.493156],[34.979448,55.493369],[34.981497,55.49359],[34.983546,55.493811],[34.985371,55.494019],[34.987156,55.494221],[34.98897,55.494425],[34.990311,55.49457],[34.994268,55.494975],[34.996418,55.495201],[34.996988,55.495266],[34.998456,55.495415],[34.999465,55.495519],[35.001028,55.495673],[35.003301,55.495904],[35.007292,55.496338],[35.007908,55.496404],[35.008878,55.496506],[35.009832,55.496616],[35.011099,55.496762],[35.011937,55.496851],[35.014246,55.49709],[35.015031,55.497171],[35.015554,55.497229],[35.016206,55.497312],[35.016735,55.497378],[35.016756,55.497381],[35.01713,55.497421],[35.02644,55.498419],[35.027563,55.498545],[35.030489,55.49887],[35.031862,55.499024],[35.033518,55.49923],[35.035021,55.4994],[35.036535,55.49954],[35.037278,55.499598],[35.037831,55.49964],[35.038394,55.499675],[35.038591,55.499683],[35.039766,55.499735],[35.04108,55.499806],[35.042164,55.499873],[35.043107,55.499933],[35.043988,55.499979],[35.04539,55.500046],[35.048945,55.500231],[35.058038,55.500724],[35.072374,55.501513],[35.075648,55.501698],[35.075993,55.501713],[35.078951,55.501871],[35.082145,55.502028],[35.082547,55.50205],[35.086519,55.50229],[35.087947,55.502373],[35.090158,55.502488],[35.091191,55.50254],[35.092515,55.5026],[35.093461,55.502659],[35.094797,55.502733],[35.095632,55.502778],[35.098327,55.502922],[35.099548,55.502989],[35.100568,55.503042],[35.100861,55.503057],[35.101151,55.503076],[35.101427,55.503102],[35.101799,55.503132],[35.102005,55.503153],[35.102322,55.503191],[35.102557,55.503224],[35.103132,55.503308],[35.106728,55.503854],[35.107711,55.504011],[35.108642,55.504154],[35.109691,55.50432],[35.112086,55.504714],[35.113074,55.504881],[35.114263,55.505073],[35.11557,55.505272],[35.116405,55.50539],[35.116692,55.505427],[35.116975,55.505457],[35.117216,55.505482],[35.117458,55.505505],[35.117944,55.505547],[35.11824,55.505571],[35.118526,55.505588],[35.119292,55.505618],[35.119527,55.505624],[35.1198,55.505628],[35.120016,55.505629],[35.120654,55.505624],[35.120868,55.505617],[35.121006,55.505612],[35.121149,55.505606],[35.121436,55.505588],[35.12167,55.505574],[35.125152,55.505276],[35.126685,55.505133],[35.127519,55.505058],[35.127984,55.505014],[35.129182,55.504898],[35.130736,55.504766],[35.131179,55.504731],[35.13435,55.504416],[35.135523,55.504311],[35.136041,55.504264],[35.137785,55.504107],[35.141636,55.503766],[35.144177,55.503541],[35.146046,55.503368],[35.147143,55.50326],[35.149024,55.503082],[35.149666,55.503024],[35.151252,55.502873],[35.152095,55.502793],[35.155012,55.502536],[35.155526,55.502489],[35.160604,55.502026],[35.161732,55.501906],[35.162089,55.501877],[35.165133,55.501613],[35.174289,55.500762],[35.180038,55.500233],[35.180495,55.500195],[35.185892,55.499687],[35.186407,55.499639],[35.188663,55.499428],[35.189152,55.499395],[35.190569,55.4993],[35.192893,55.499304],[35.202307,55.499578],[35.207313,55.499728],[35.20901,55.499778],[35.212935,55.499893],[35.213874,55.499921],[35.215969,55.499928],[35.228552,55.499482],[35.234849,55.499259],[35.241147,55.499028],[35.248943,55.498719],[35.252606,55.498313],[35.26465,55.496975],[35.280432,55.495197],[35.298978,55.493121],[35.303841,55.49258],[35.308047,55.492096],[35.310568,55.491813],[35.312046,55.491658],[35.312481,55.491616],[35.312723,55.491595],[35.313195,55.491559],[35.313489,55.491542],[35.313746,55.491529],[35.314328,55.491509],[35.314686,55.491502],[35.315147,55.4915],[35.315907,55.491497],[35.316486,55.491495],[35.318897,55.491492],[35.31954,55.491495],[35.326008,55.491479],[35.348674,55.491404],[35.348676,55.491404],[35.351622,55.491387],[35.351989,55.491387],[35.354156,55.491389],[35.356687,55.491377],[35.361666,55.491364],[35.364519,55.491349],[35.36775,55.491334],[35.388113,55.491358],[35.395882,55.491362],[35.396824,55.491357],[35.397337,55.49135],[35.39764,55.491341],[35.397999,55.491328],[35.398326,55.491312],[35.39865,55.491289],[35.398981,55.491267],[35.399426,55.491225],[35.399766,55.491184],[35.400057,55.49115],[35.400611,55.491075],[35.401068,55.491003],[35.401233,55.490976],[35.401646,55.490897],[35.401965,55.490833],[35.402451,55.490735],[35.402911,55.490616],[35.407335,55.489569],[35.408475,55.489303],[35.409504,55.489064],[35.412833,55.488267],[35.416134,55.48751],[35.416537,55.48741],[35.417274,55.487232],[35.418964,55.486833],[35.418989,55.486827],[35.422055,55.486106],[35.438496,55.48221],[35.439057,55.482076],[35.440679,55.481693],[35.44361,55.480999],[35.444653,55.480752],[35.44609,55.480414],[35.447821,55.480029],[35.448002,55.479995],[35.448215,55.479956],[35.448426,55.47992],[35.448937,55.479835],[35.449429,55.47976],[35.450051,55.479675],[35.451444,55.479491],[35.452817,55.479307],[35.45559,55.478943],[35.457787,55.478652],[35.457901,55.478637],[35.460386,55.478304],[35.464843,55.477709],[35.468766,55.477173],[35.491603,55.474216],[35.492221,55.474138],[35.493188,55.474011],[35.495118,55.473758],[35.498344,55.473336],[35.501704,55.472896],[35.508356,55.472039],[35.511578,55.471609],[35.514992,55.471175],[35.516591,55.470969],[35.518306,55.470719],[35.519592,55.470574],[35.519797,55.470552],[35.519976,55.470537],[35.520496,55.470499],[35.521739,55.470429],[35.525216,55.470261],[35.526049,55.470224],[35.526898,55.47019],[35.527326,55.470167],[35.527887,55.470132],[35.528359,55.470105],[35.529066,55.470061],[35.529604,55.470033],[35.530395,55.469994],[35.547946,55.469085],[35.551411,55.468924],[35.558119,55.468568],[35.572278,55.467823],[35.575505,55.46767],[35.593763,55.466726],[35.59419,55.466704],[35.607456,55.466005],[35.609534,55.465897],[35.611405,55.465811],[35.613311,55.465721],[35.613569,55.465707],[35.614418,55.465668],[35.615212,55.465633],[35.616273,55.465573],[35.616293,55.465572],[35.618943,55.46544],[35.645507,55.464143],[35.64959,55.463947],[35.671923,55.462928],[35.67423,55.462821],[35.674587,55.462802],[35.676396,55.462709],[35.676644,55.462699],[35.67693,55.462685],[35.680251,55.462527],[35.680295,55.462525],[35.684891,55.462321],[35.688045,55.46217],[35.690979,55.46203],[35.694845,55.461844],[35.695782,55.4618],[35.696929,55.461739],[35.697176,55.461727],[35.697721,55.461704],[35.698518,55.461676],[35.698695,55.461672],[35.698872,55.461672],[35.69911,55.46167],[35.699381,55.461671],[35.699695,55.461677],[35.699922,55.46168],[35.70034,55.46169],[35.7005,55.461696],[35.70073,55.461709],[35.702761,55.461825],[35.704537,55.461933],[35.70811,55.462141],[35.714406,55.462514],[35.717241,55.462674],[35.717499,55.462688],[35.7244,55.46309],[35.726151,55.463192],[35.727898,55.463293],[35.733344,55.463613],[35.738931,55.463938],[35.744294,55.464248],[35.747879,55.464451],[35.749619,55.464547],[35.751127,55.464623],[35.752576,55.464686],[35.755531,55.464825],[35.756118,55.464859],[35.757346,55.464941],[35.757566,55.464957],[35.75844,55.465031],[35.76003,55.465154],[35.760347,55.465178],[35.760546,55.465191],[35.760977,55.465219],[35.760993,55.46522],[35.761193,55.465231],[35.761698,55.465255],[35.761931,55.465264],[35.76194,55.465264],[35.762463,55.465279],[35.764187,55.465294],[35.765911,55.465296],[35.769391,55.465284],[35.771401,55.465264],[35.773559,55.465255],[35.777213,55.465235],[35.779662,55.465232],[35.781345,55.46522],[35.783141,55.465203],[35.786724,55.465174],[35.800267,55.465076],[35.806987,55.465028],[35.812209,55.464975],[35.81923,55.464906],[35.82344,55.464856],[35.826507,55.464816],[35.829305,55.464785],[35.830854,55.464758],[35.831411,55.464756],[35.832081,55.46475],[35.832203,55.464749],[35.833007,55.464739],[35.834041,55.464726],[35.834356,55.464724],[35.836772,55.46469],[35.838444,55.46467],[35.839158,55.464662],[35.839397,55.46466],[35.840379,55.46465],[35.842712,55.464627],[35.847686,55.464571],[35.850047,55.464545],[35.851121,55.464538],[35.852313,55.464536],[35.852615,55.46454],[35.853728,55.464553],[35.85929,55.464652],[35.859544,55.464655],[35.871592,55.464859],[35.882221,55.465046],[35.887424,55.465128],[35.887692,55.46513],[35.887865,55.465133],[35.888147,55.46514],[35.890019,55.46517],[35.892016,55.465203],[35.896009,55.465266],[35.896817,55.465277],[35.897849,55.465296],[35.898684,55.465311],[35.899505,55.465322],[35.901232,55.465348],[35.903137,55.465373],[35.903751,55.465383],[35.905671,55.465412],[35.907848,55.465448],[35.913112,55.465523],[35.913491,55.465524],[35.91388,55.465523],[35.914286,55.465515],[35.914544,55.465508],[35.915135,55.465485],[35.915334,55.465478],[35.917406,55.465373],[35.917536,55.465366],[35.92018,55.465229],[35.921485,55.465156],[35.931378,55.464647],[35.933341,55.464546],[35.934899,55.464461],[35.935872,55.464409],[35.936696,55.464354],[35.937978,55.464271],[35.93854,55.46423],[35.939063,55.464183],[35.939764,55.464118],[35.94044,55.464057],[35.940628,55.464046],[35.940812,55.464038],[35.941036,55.464028],[35.941176,55.464023],[35.941663,55.464008],[35.941745,55.464005],[35.943145,55.463952],[35.943954,55.463918],[35.944434,55.463898],[35.947185,55.463804],[35.948554,55.463744],[35.950454,55.463643],[35.951259,55.4636],[35.960253,55.463129],[35.963993,55.462936],[35.980132,55.462106],[35.980393,55.462094],[35.989686,55.461609],[35.992515,55.461461],[35.999104,55.46111],[35.999163,55.461106],[35.999586,55.461083],[35.999949,55.461066],[36.002334,55.460938],[36.011867,55.460442],[36.016725,55.460189],[36.018233,55.460105],[36.021004,55.459936],[36.023136,55.459802],[36.023199,55.459798],[36.025537,55.459648],[36.026599,55.459582],[36.027321,55.45954],[36.028111,55.459504],[36.028628,55.459474],[36.028886,55.459461],[36.029213,55.459447],[36.032374,55.459277],[36.03512,55.459099],[36.035273,55.459089],[36.035687,55.459062],[36.035896,55.459048],[36.036406,55.459013],[36.037882,55.458922],[36.039335,55.458848],[36.048566,55.458299],[36.049928,55.458224],[36.052614,55.458058],[36.054094,55.457964],[36.055273,55.457891],[36.056046,55.457848],[36.05706,55.457795],[36.057961,55.457736],[36.05869,55.457695],[36.059703,55.457633],[36.060097,55.457614],[36.06044,55.457604],[36.060834,55.457595],[36.061292,55.457594],[36.061687,55.457593],[36.061998,55.4576],[36.062485,55.457618],[36.062869,55.457635],[36.063279,55.457663],[36.063605,55.45769],[36.064046,55.457733],[36.064602,55.457794],[36.064929,55.457833],[36.065237,55.457874],[36.065385,55.457897],[36.065619,55.45793],[36.066027,55.458003],[36.066417,55.458083],[36.067244,55.458265],[36.067811,55.458405],[36.068177,55.458502],[36.068649,55.458636],[36.069056,55.458761],[36.069437,55.458887],[36.069716,55.458988],[36.070133,55.459138],[36.070477,55.459262],[36.075983,55.461332],[36.082104,55.463624],[36.088953,55.466226],[36.091265,55.467088],[36.09333,55.467858],[36.095241,55.468583],[36.096037,55.468877],[36.097428,55.469405],[36.103776,55.471769],[36.105811,55.472545],[36.107603,55.473207],[36.109227,55.4738],[36.110226,55.474156],[36.110437,55.474232],[36.110561,55.474275],[36.113272,55.475162],[36.116557,55.476195],[36.122136,55.477928],[36.1237,55.478418],[36.123766,55.478439],[36.132787,55.48123],[36.132918,55.48127],[36.136822,55.482479],[36.142893,55.484362],[36.148991,55.486228],[36.151167,55.486894],[36.15149,55.486995],[36.158177,55.489058],[36.161072,55.489958],[36.16184,55.490197],[36.163154,55.490598],[36.166955,55.491778],[36.167556,55.491965],[36.168463,55.49225],[36.169802,55.492653],[36.171231,55.493097],[36.172236,55.493404],[36.173291,55.493722],[36.173815,55.493883],[36.174351,55.494043],[36.174542,55.494097],[36.174747,55.494154],[36.174919,55.494203],[36.175195,55.494276],[36.17551,55.494355],[36.175805,55.494427],[36.176105,55.494498],[36.176409,55.494566],[36.176724,55.494635],[36.177778,55.494868],[36.180735,55.495498],[36.182401,55.495862],[36.183998,55.496208],[36.185579,55.49655],[36.187064,55.496875],[36.188581,55.4972],[36.18939,55.49737],[36.18944,55.49738],[36.189896,55.497471],[36.190448,55.497588],[36.191537,55.497823],[36.194056,55.498367],[36.198531,55.499334],[36.201335,55.499933],[36.202162,55.500106],[36.203006,55.500287],[36.204683,55.500651],[36.206635,55.501067],[36.207165,55.50118],[36.22234,55.504433],[36.222653,55.5045],[36.231265,55.506353],[36.242483,55.508747],[36.245021,55.509296],[36.24995,55.510349],[36.250931,55.510558],[36.251913,55.510778],[36.264095,55.513385],[36.2658,55.513738],[36.266136,55.513805],[36.267213,55.514021],[36.268158,55.514209],[36.268694,55.514311],[36.269571,55.514471],[36.272503,55.514999],[36.274671,55.515411],[36.275807,55.515626],[36.281018,55.516577],[36.298865,55.519907],[36.302671,55.520638],[36.304814,55.521047],[36.306335,55.521336],[36.308125,55.521667],[36.309765,55.521982],[36.31062,55.522133],[36.311578,55.522309],[36.311744,55.522339],[36.312483,55.522477],[36.32279,55.524394],[36.326766,55.525144],[36.327713,55.525315],[36.328253,55.525413],[36.329164,55.525585],[36.331298,55.526013],[36.331448,55.526043],[36.331626,55.526077],[36.334037,55.526518],[36.334944,55.526694],[36.335876,55.52687],[36.33771,55.527204],[36.337762,55.527214],[36.337971,55.527255],[36.339174,55.527483],[36.339882,55.52761],[36.342409,55.528073],[36.343001,55.528176],[36.343718,55.528299],[36.344359,55.528412],[36.344628,55.528463],[36.345053,55.528545],[36.34689,55.528894],[36.350791,55.529612],[36.350925,55.529637],[36.353322,55.530094],[36.356528,55.530686],[36.358097,55.530976],[36.358502,55.531052],[36.358573,55.531066],[36.359336,55.531214],[36.359385,55.531221],[36.359793,55.531293],[36.360281,55.531381],[36.362138,55.531726],[36.364915,55.532246],[36.371347,55.533445],[36.374616,55.534069],[36.376408,55.534413],[36.377783,55.53467],[36.379028,55.534903],[36.379661,55.535021],[36.38171,55.535401],[36.384613,55.53594],[36.384913,55.535995],[36.388161,55.536589],[36.388818,55.536711],[36.391016,55.537128],[36.392909,55.537483],[36.393683,55.537628],[36.395673,55.538],[36.396551,55.538172],[36.398077,55.538443],[36.398848,55.53858],[36.39914,55.538632],[36.39948,55.538694],[36.401418,55.539027],[36.402356,55.539206],[36.40333,55.539399],[36.404725,55.539656],[36.405542,55.539816],[36.406676,55.540033],[36.407972,55.54027],[36.41067,55.540758],[36.413977,55.541341],[36.414777,55.541472],[36.415199,55.541543],[36.415783,55.541649],[36.416561,55.541793],[36.416998,55.541877],[36.41765,55.542],[36.419513,55.542372],[36.420912,55.542635],[36.423625,55.543136],[36.425547,55.543491],[36.42766,55.543893],[36.429501,55.54426],[36.43075,55.54449],[36.431993,55.544718],[36.43335,55.544972],[36.433916,55.545078],[36.434657,55.545212],[36.436047,55.545463],[36.437918,55.545798],[36.439905,55.546163],[36.440965,55.546356],[36.441916,55.546534],[36.44397,55.546917],[36.444571,55.547021],[36.445196,55.547132],[36.446197,55.547323],[36.447196,55.547523],[36.447412,55.547565],[36.447632,55.547606],[36.448162,55.547704],[36.449148,55.547886],[36.450711,55.548183],[36.45149,55.548332],[36.452275,55.548474],[36.452829,55.548572],[36.453563,55.548699],[36.453968,55.548763],[36.454309,55.548814],[36.45485,55.548887],[36.455332,55.548946],[36.455766,55.548991],[36.456211,55.549031],[36.457059,55.549095],[36.459275,55.549233],[36.460383,55.549317],[36.461481,55.549396],[36.463311,55.549532],[36.464147,55.549596],[36.466347,55.549747],[36.468266,55.54989],[36.470303,55.550042],[36.472148,55.550183],[36.472328,55.550198],[36.473609,55.550304],[36.47508,55.550413],[36.481342,55.550904],[36.482966,55.551011],[36.484242,55.551111],[36.485515,55.551234],[36.487712,55.551403],[36.488523,55.551459],[36.489266,55.55151],[36.490812,55.55163],[36.49286,55.551808],[36.509391,55.553105],[36.509628,55.553121],[36.517812,55.553766],[36.51888,55.553851],[36.520679,55.553987],[36.522531,55.554135],[36.523498,55.554208],[36.52437,55.554274],[36.529015,55.554639],[36.53133,55.554822],[36.532435,55.554907],[36.533634,55.555002],[36.536008,55.555188],[36.538916,55.555417],[36.53995,55.555501],[36.540965,55.555579],[36.543366,55.555775],[36.544573,55.555868],[36.545764,55.555952],[36.547603,55.556099],[36.547992,55.556124],[36.548739,55.556186],[36.552964,55.556508],[36.554756,55.556654],[36.555853,55.55674],[36.556991,55.55683],[36.560548,55.557106],[36.565193,55.557488],[36.565238,55.557492],[36.567598,55.557665],[36.570753,55.557916],[36.570925,55.557931],[36.571132,55.557949],[36.571211,55.557955],[36.571909,55.558015],[36.574084,55.55819],[36.582134,55.55885],[36.583613,55.55897],[36.584464,55.559052],[36.587027,55.559329],[36.588616,55.559504],[36.590186,55.559671],[36.592273,55.559901],[36.594366,55.560124],[36.597762,55.560484],[36.604599,55.561236],[36.605196,55.561299],[36.606041,55.561391],[36.607206,55.561504],[36.608481,55.561644],[36.611908,55.562011],[36.614521,55.562298],[36.625009,55.563433],[36.631961,55.564172],[36.632529,55.564233],[36.632896,55.564276],[36.633523,55.564349],[36.633761,55.564375],[36.635976,55.564621],[36.638465,55.56488],[36.646526,55.565738],[36.647743,55.565864],[36.648605,55.565953],[36.648955,55.565989],[36.653435,55.566471],[36.658519,55.567],[36.660207,55.567166],[36.660416,55.567191],[36.6623,55.567392],[36.667581,55.567966],[36.669161,55.568135],[36.669625,55.568187],[36.678396,55.569115],[36.678959,55.569145],[36.679482,55.569146],[36.680276,55.569104],[36.681027,55.568964],[36.681585,55.568779],[36.682105,55.56854],[36.682582,55.568303],[36.683017,55.56813],[36.683505,55.568063],[36.683865,55.568063],[36.684186,55.568127],[36.684476,55.568236],[36.684771,55.56843],[36.685259,55.568837],[36.685635,55.569089],[36.686262,55.569271],[36.686976,55.569395],[36.689771,55.569723],[36.690516,55.569838],[36.691536,55.570017],[36.692169,55.570087],[36.692806,55.570108],[36.69348,55.570105],[36.693974,55.570066],[36.69432,55.569997],[36.695016,55.569783],[36.696036,55.569393],[36.696604,55.569092],[36.696992,55.568819],[36.69739,55.568531],[36.697584,55.568319],[36.697778,55.568107],[36.697975,55.567918],[36.698057,55.567877],[36.698352,55.567732],[36.69875,55.567621],[36.698995,55.567594],[36.699531,55.567603],[36.699856,55.567644],[36.700297,55.567728],[36.700698,55.567869],[36.701159,55.568165],[36.701463,55.56856],[36.701563,55.568922],[36.701534,55.569612],[36.701385,55.57036],[36.701391,55.570666],[36.701561,55.570904],[36.701848,55.571138],[36.70198,55.571204],[36.70236,55.571332],[36.703158,55.571455],[36.706681,55.57183],[36.707499,55.571999],[36.70775,55.572013],[36.708586,55.572084],[36.710315,55.572266],[36.710642,55.572304],[36.710994,55.572343],[36.711234,55.572377],[36.711337,55.572391],[36.712441,55.572519],[36.71346,55.572612],[36.717756,55.573013],[36.723459,55.573601],[36.734833,55.574761],[36.734964,55.574774],[36.742086,55.575471],[36.7469,55.575945],[36.751474,55.576431],[36.757993,55.577079],[36.769841,55.578501],[36.770241,55.578542],[36.77035,55.578553],[36.772409,55.578771],[36.77365,55.578893],[36.77634,55.579185],[36.778816,55.579445],[36.782174,55.579765],[36.784672,55.579978],[36.785318,55.579976],[36.785987,55.579911],[36.786656,55.579904],[36.787163,55.579923],[36.790097,55.580194],[36.79253,55.580435],[36.798856,55.581084],[36.806052,55.581778],[36.80846,55.582035],[36.822429,55.583443],[36.823014,55.583578],[36.823548,55.583721],[36.823949,55.583847],[36.824419,55.583933],[36.824994,55.583996],[36.832329,55.584674],[36.833316,55.584648],[36.834598,55.584662],[36.83665,55.584857],[36.842348,55.585443],[36.848946,55.586103],[36.853097,55.586523],[36.854803,55.5867],[36.85617,55.586838],[36.85673,55.586898],[36.858638,55.587089],[36.860589,55.587283],[36.865028,55.587726],[36.867167,55.587939],[36.869286,55.58815],[36.871213,55.588342],[36.872495,55.58847],[36.873287,55.588549],[36.875453,55.588765],[36.882023,55.58942],[36.888451,55.590061],[36.8916,55.590375],[36.892579,55.590472],[36.89823,55.591036],[36.900891,55.591301],[36.903243,55.591535],[36.917099,55.592922],[36.93093,55.594323],[36.935889,55.594916],[36.937494,55.595142],[36.938158,55.595235],[36.938697,55.595317],[36.938969,55.595357],[36.939208,55.595391],[36.93952,55.59544],[36.93977,55.595477],[36.942248,55.595801],[36.943975,55.596],[36.945796,55.59618],[36.947571,55.596329],[36.954585,55.59705],[36.9577,55.597417],[36.958496,55.597515],[36.95947,55.597632],[36.961394,55.597863],[36.962605,55.598002],[36.967921,55.598627],[36.969089,55.598757],[36.970402,55.598912],[36.971768,55.599071],[36.97739,55.599703],[36.981766,55.600228],[36.984712,55.600639],[36.985902,55.600812],[36.987167,55.601009],[36.987618,55.601068],[36.987955,55.601113],[36.988206,55.601147],[36.988463,55.601176],[36.988726,55.601207],[36.989209,55.601266],[36.99011,55.601404],[36.990207,55.601418],[36.990318,55.601433],[36.990501,55.601457],[36.991207,55.601571],[36.992116,55.601702],[36.993075,55.601832],[36.995637,55.602177],[36.995811,55.602197],[36.996183,55.602244],[36.996255,55.602252],[36.996844,55.602324],[36.997391,55.602389],[36.998761,55.602552],[36.999657,55.602659],[37.001221,55.602854],[37.002267,55.602983],[37.002872,55.603055],[37.00506,55.60331],[37.005501,55.603329],[37.005617,55.603335],[37.005908,55.603357],[37.006148,55.603383],[37.006253,55.603394],[37.006345,55.603404],[37.006427,55.603409],[37.006513,55.603413],[37.006615,55.603415],[37.006701,55.603415],[37.006769,55.603412],[37.006836,55.603408],[37.006903,55.603401],[37.006972,55.603392],[37.007047,55.60338],[37.00713,55.603363],[37.007186,55.603349],[37.007246,55.60333],[37.007293,55.603313],[37.00736,55.603285],[37.007417,55.603256],[37.007459,55.603232],[37.007501,55.603206],[37.007541,55.603182],[37.007583,55.603147],[37.007619,55.603111],[37.007646,55.60308],[37.00768,55.603038],[37.007725,55.602953],[37.007736,55.602909],[37.007742,55.602872],[37.007742,55.602833],[37.007734,55.602791],[37.007724,55.602754],[37.007709,55.602718],[37.00769,55.602675],[37.007663,55.60263],[37.007635,55.602591],[37.007596,55.602546],[37.007546,55.602499],[37.00749,55.602454],[37.007394,55.602398],[37.007275,55.602343],[37.007126,55.602298],[37.006989,55.602268],[37.006881,55.602255],[37.006748,55.602248],[37.00663,55.602252],[37.006536,55.60226],[37.006454,55.602275],[37.00636,55.602295],[37.006252,55.60233],[37.006179,55.602355],[37.006093,55.602393],[37.006034,55.602426],[37.00601,55.60244],[37.005981,55.602459],[37.005897,55.602526],[37.005837,55.602582],[37.005803,55.602619],[37.005717,55.602714],[37.005594,55.602877],[37.005506,55.603026],[37.005368,55.603259],[37.005227,55.603491],[37.00511,55.603673],[37.004984,55.603861],[37.004949,55.603911],[37.004702,55.60428],[37.004601,55.604472],[37.004522,55.604717],[37.004494,55.605008],[37.004485,55.605215],[37.004576,55.605733],[37.004823,55.606221],[37.004997,55.606457],[37.005271,55.606713],[37.006054,55.607286],[37.00691,55.607833],[37.007526,55.608233],[37.007623,55.608296],[37.009433,55.609472],[37.01034,55.610112],[37.010853,55.610635],[37.01118,55.611108],[37.011314,55.611563],[37.011341,55.611959],[37.011266,55.612414],[37.011073,55.612917],[37.010676,55.613656],[37.010493,55.614189],[37.01045,55.614659],[37.010508,55.615109],[37.010766,55.615692],[37.011255,55.616402],[37.011621,55.616836],[37.011738,55.61693],[37.012191,55.617294],[37.014158,55.61886],[37.017416,55.621456],[37.017998,55.621933],[37.018462,55.622292],[37.018912,55.622667],[37.019252,55.622936],[37.019292,55.622967],[37.019578,55.623191],[37.019665,55.623261],[37.020099,55.623607],[37.020165,55.623663],[37.020185,55.623681],[37.020202,55.623701],[37.020214,55.623719],[37.020222,55.623736],[37.020229,55.623752],[37.020233,55.623766],[37.020237,55.623782],[37.020237,55.6238],[37.020238,55.62382],[37.020237,55.623839],[37.020234,55.623859],[37.020229,55.623873],[37.020224,55.623887],[37.020216,55.623903],[37.020195,55.623936],[37.02014,55.624022],[37.020121,55.62405],[37.020077,55.624115],[37.020045,55.624168],[37.020025,55.624204],[37.020011,55.624238],[37.02,55.62427],[37.019991,55.6243],[37.019986,55.624327],[37.019983,55.624349],[37.019979,55.624405],[37.01998,55.62442],[37.019981,55.624441],[37.019986,55.62447],[37.020007,55.624565],[37.020052,55.624745],[37.02052,55.626458],[37.020678,55.627033],[37.020709,55.627144],[37.02094,55.627997],[37.021252,55.629138],[37.021299,55.629356],[37.021324,55.629488],[37.021331,55.629541],[37.021357,55.629709],[37.020851,55.629725],[37.019633,55.629742],[37.018131,55.629763],[37.015597,55.629798],[37.013956,55.629823],[37.012259,55.629839],[37.011749,55.629836],[37.011634,55.629837],[37.01111,55.629836],[37.010126,55.629843],[37.009829,55.629844],[37.008972,55.62985],[37.006815,55.629863],[37.004708,55.629885],[37.004704,55.63001],[37.004698,55.630219],[37.004668,55.631139],[37.004631,55.631836],[37.00456,55.633296],[37.004514,55.634117],[37.004484,55.634919],[37.00446,55.635566],[37.004405,55.635857],[37.004287,55.636161],[37.004087,55.636493],[37.003805,55.636777],[37.003607,55.63692],[37.003336,55.637092],[37.00322,55.637154],[37.003093,55.637222],[37.002471,55.637516],[36.999821,55.638576],[36.999264,55.638847],[36.998109,55.639428],[36.996834,55.640211],[36.996114,55.640704],[36.994905,55.641544],[36.992793,55.643262],[36.990844,55.644918],[36.988976,55.646505],[36.988679,55.646834],[36.988298,55.647313],[36.987952,55.647819],[36.987555,55.648639],[36.987324,55.64952],[36.987271,55.650328],[36.987308,55.65117],[36.987287,55.651848],[36.987196,55.652595],[36.98696,55.653291],[36.986616,55.653951],[36.98608,55.654629],[36.985522,55.65518],[36.984701,55.655815],[36.983639,55.656433],[36.982245,55.657039],[36.98101,55.657465],[36.979369,55.657855],[36.977668,55.658128],[36.976598,55.658227],[36.976023,55.658257],[36.974493,55.658305],[36.9707,55.658305],[36.969053,55.658321],[36.968303,55.658366],[36.967896,55.658396],[36.967586,55.658427],[36.967103,55.658476],[36.966334,55.658577],[36.964748,55.658869],[36.962782,55.659347],[36.957192,55.660739],[36.952257,55.661853],[36.946335,55.663287],[36.935889,55.666083],[36.908129,55.673513],[36.906102,55.67416],[36.904245,55.674856],[36.90158,55.676095],[36.899302,55.677354],[36.899216,55.677402],[36.897545,55.678579],[36.895895,55.679816],[36.895145,55.680454],[36.894708,55.680821],[36.891478,55.683951],[36.888759,55.68644],[36.887686,55.687423],[36.887102,55.68798],[36.885803,55.689219],[36.88231,55.692454],[36.881554,55.693213],[36.880953,55.693908],[36.880529,55.694658],[36.880272,55.695438],[36.880186,55.69614],[36.880272,55.696765],[36.880487,55.697428],[36.880905,55.698198],[36.881447,55.698897],[36.881825,55.699472],[36.881978,55.699775],[36.88208,55.700062],[36.882147,55.700392],[36.882163,55.700706],[36.882116,55.701073],[36.882005,55.701391],[36.881852,55.701679],[36.881628,55.702014],[36.881428,55.702234],[36.881138,55.702524],[36.880568,55.703005],[36.879175,55.704176],[36.878244,55.704959],[36.877916,55.705234],[36.877795,55.705337],[36.877149,55.705886],[36.876537,55.706454],[36.875696,55.707234],[36.87529,55.707687],[36.87487,55.708226],[36.874679,55.708578],[36.873619,55.711058],[36.87306,55.712283],[36.872659,55.71311],[36.872568,55.713299],[36.871807,55.715022],[36.871582,55.715643],[36.871477,55.716034],[36.871413,55.71643],[36.871394,55.716835],[36.871426,55.717377],[36.871504,55.717823],[36.871686,55.718383],[36.871869,55.71874],[36.872156,55.719253],[36.872349,55.719534],[36.872708,55.719983],[36.873226,55.72053],[36.87362,55.720871],[36.87399,55.721167],[36.875742,55.722479],[36.876858,55.723346],[36.877499,55.723872],[36.878046,55.724387],[36.878566,55.724976],[36.879035,55.725618],[36.879381,55.726242],[36.879668,55.726885],[36.879931,55.727769],[36.880009,55.728447],[36.879988,55.729042],[36.879915,55.729524],[36.879765,55.730007],[36.879588,55.730453],[36.879111,55.731487],[36.878799,55.732026],[36.87804,55.733225],[36.877523,55.734095],[36.877225,55.734711],[36.877064,55.735183],[36.876947,55.735631],[36.876896,55.735978],[36.87688,55.736382],[36.876903,55.736848],[36.876975,55.737282],[36.877024,55.737496],[36.877155,55.737898],[36.877372,55.738404],[36.87752,55.738689],[36.877643,55.738926],[36.878008,55.739371],[36.878695,55.74017],[36.881779,55.743345],[36.882196,55.743774],[36.882751,55.744277],[36.884502,55.746062],[36.885314,55.74689],[36.885785,55.747394],[36.886071,55.747701],[36.887938,55.749685],[36.888576,55.750406],[36.893554,55.756245],[36.89703,55.760374],[36.905192,55.769917],[36.905308,55.770053],[36.920409,55.787664],[36.920822,55.78822],[36.921138,55.788715],[36.921424,55.78926],[36.921712,55.789988],[36.921862,55.790508],[36.922038,55.791414],[36.922082,55.791915],[36.922082,55.792197],[36.922055,55.792485],[36.92196,55.793128],[36.921406,55.796328],[36.921078,55.798217],[36.917863,55.817734],[36.917565,55.819289],[36.917546,55.819626],[36.917546,55.819838],[36.917573,55.820279],[36.917607,55.820624],[36.917646,55.820891],[36.917659,55.820965],[36.91786,55.821902],[36.918159,55.822773],[36.918544,55.824049],[36.919041,55.825793],[36.91923,55.826569],[36.919852,55.828824],[36.921822,55.835519],[36.923558,55.841607],[36.924228,55.84379],[36.924563,55.845017],[36.925306,55.847157],[36.925735,55.848099],[36.926245,55.848951],[36.926921,55.849882],[36.927403,55.850445],[36.928043,55.851077],[36.930503,55.853483],[36.931904,55.854856],[36.932692,55.855628],[36.933181,55.856107],[36.933259,55.85618],[36.934293,55.857143],[36.935198,55.857981],[36.935979,55.858737],[36.937009,55.85974],[36.937456,55.860166],[36.937853,55.860545],[36.938718,55.861448],[36.939539,55.862495],[36.939825,55.863005],[36.940109,55.863649],[36.940222,55.863983],[36.940337,55.864326],[36.941029,55.866956],[36.941229,55.867807],[36.941446,55.868729],[36.941588,55.869333],[36.942682,55.87341],[36.942727,55.87358],[36.94278,55.873781],[36.9432,55.87568],[36.943486,55.876906],[36.943574,55.87764],[36.943672,55.87853],[36.943719,55.879265],[36.943796,55.880543],[36.943927,55.882943],[36.943938,55.883145],[36.944237,55.887888],[36.944396,55.890373],[36.94444,55.891053],[36.944544,55.892017],[36.944666,55.893536],[36.944755,55.894837],[36.94483,55.896067],[36.944952,55.898267],[36.944984,55.899101],[36.945004,55.899704],[36.945067,55.901517],[36.945155,55.903725],[36.945159,55.903801],[36.945166,55.903938],[36.945173,55.904022],[36.945181,55.904212],[36.945214,55.904999],[36.945377,55.906759],[36.945394,55.906996],[36.945771,55.912933],[36.945986,55.917375],[36.946104,55.919036],[36.946275,55.921936],[36.946427,55.922855],[36.946848,55.924118],[36.947316,55.925148],[36.947898,55.926046],[36.948475,55.926813],[36.948795,55.927181],[36.95062,55.928786],[36.95122,55.929345],[36.952042,55.930129],[36.952239,55.93033],[36.952773,55.930874],[36.953254,55.93134],[36.953709,55.931766],[36.954773,55.932805],[36.957887,55.935826],[36.959693,55.937577],[36.959805,55.93769],[36.960068,55.937944],[36.960114,55.937986],[36.960237,55.938099],[36.962891,55.940591],[36.968207,55.945715],[36.970525,55.947948],[36.972213,55.949551],[36.974331,55.951603],[36.976609,55.953847],[36.978349,55.95556],[36.978892,55.956093],[36.983554,55.960474],[36.984466,55.961313],[36.985507,55.962337],[36.989352,55.966121],[36.990804,55.967438],[36.992474,55.968994],[36.992674,55.96918],[36.996763,55.973087],[36.997574,55.973893],[36.998202,55.974517],[36.999591,55.975708],[37.000419,55.97636],[37.001509,55.977147],[37.004666,55.979399],[37.006486,55.980698],[37.010694,55.983699],[37.019196,55.989983],[37.020423,55.990977],[37.020521,55.991062],[37.021141,55.991696],[37.021765,55.992562],[37.022322,55.993537],[37.024295,55.999532],[37.024826,56.000865],[37.025364,56.002208],[37.025804,56.003252],[37.02636,56.004719],[37.026555,56.005291],[37.026794,56.006066],[37.027327,56.00812],[37.027791,56.010501],[37.028007,56.011297],[37.02808,56.011541],[37.028113,56.011677],[37.028685,56.013981],[37.028953,56.014651],[37.029284,56.015288],[37.029608,56.015783],[37.029914,56.016288],[37.030182,56.016662],[37.030636,56.017189],[37.031256,56.017721],[37.031988,56.018271],[37.032395,56.018591],[37.03311,56.019034],[37.034389,56.019761],[37.035553,56.020323],[37.036237,56.020599],[37.038783,56.021487],[37.040019,56.021923],[37.043032,56.022987],[37.047837,56.024636],[37.048973,56.025035],[37.054203,56.026868],[37.05536,56.027271],[37.056099,56.027528],[37.057489,56.027999],[37.059042,56.028525],[37.060314,56.028956],[37.061498,56.029372],[37.063253,56.02997],[37.068363,56.031736],[37.069712,56.032206],[37.06978,56.03223],[37.078403,56.035194],[37.08401,56.037152],[37.084098,56.037182],[37.096035,56.041327],[37.09793,56.04201],[37.099993,56.042734],[37.1014,56.043216],[37.105139,56.04448],[37.105882,56.044731],[37.105994,56.044769],[37.106253,56.044857],[37.107934,56.045411],[37.112659,56.047002],[37.116909,56.048473],[37.124954,56.051259],[37.130223,56.053101],[37.13329,56.054154],[37.13467,56.054641],[37.137021,56.055534],[37.138328,56.056102],[37.139635,56.056677],[37.14102,56.057406],[37.141816,56.057832],[37.143304,56.058703],[37.143858,56.059016],[37.144683,56.05947],[37.145446,56.059888],[37.145911,56.060086],[37.146527,56.060295],[37.147545,56.060572],[37.150689,56.061222],[37.153471,56.061828],[37.154442,56.062039],[37.158351,56.062876],[37.159693,56.063155],[37.160592,56.063339],[37.162468,56.063724],[37.163229,56.063884],[37.165594,56.064358],[37.170844,56.065548],[37.172649,56.066083],[37.174242,56.066685],[37.17638,56.067764],[37.182146,56.071387],[37.187844,56.074967],[37.187862,56.074978],[37.19044,56.076605],[37.192068,56.077656],[37.195202,56.079692],[37.196534,56.080558],[37.197442,56.081148],[37.201107,56.08353],[37.202611,56.084513],[37.204423,56.085697],[37.205511,56.086309],[37.206206,56.086738],[37.210141,56.089103],[37.210958,56.089594],[37.215205,56.091817],[37.216375,56.092408],[37.218281,56.093297],[37.22698,56.097355],[37.231873,56.099478],[37.236347,56.101558],[37.23891,56.102847],[37.241119,56.103824],[37.242329,56.104362],[37.246853,56.106454],[37.24718,56.106611],[37.249317,56.107604],[37.254518,56.109868],[37.261422,56.112592],[37.265646,56.114251],[37.265703,56.114273],[37.268419,56.115254],[37.271322,56.116195],[37.27428,56.117066],[37.277626,56.11797],[37.280668,56.11872],[37.284173,56.11943],[37.287126,56.119969],[37.290166,56.120451],[37.294958,56.121119],[37.297876,56.121532],[37.300663,56.122066],[37.304061,56.122834],[37.30503,56.123076],[37.30558,56.123214],[37.30719,56.123618],[37.309668,56.124383],[37.310131,56.124534],[37.311378,56.125005],[37.313615,56.125895],[37.315777,56.126851],[37.317713,56.127815],[37.319239,56.128656],[37.320905,56.129681],[37.3225,56.130733],[37.324092,56.131941],[37.325343,56.132957],[37.326602,56.134153],[37.327859,56.135445],[37.328114,56.13574],[37.331044,56.139124],[37.333333,56.141548],[37.336153,56.144433],[37.337697,56.145918],[37.338999,56.147121],[37.341038,56.148905],[37.343336,56.150845],[37.345623,56.152754],[37.347441,56.154137],[37.348717,56.155107],[37.352268,56.157698],[37.352893,56.158124],[37.35498,56.159547],[37.356555,56.160622],[37.359867,56.162701],[37.362447,56.164301],[37.362822,56.164519],[37.364668,56.165581],[37.366157,56.166426],[37.369121,56.168111],[37.372894,56.170033],[37.377163,56.17218],[37.38153,56.174219],[37.384152,56.175386],[37.388267,56.177126],[37.392386,56.178802],[37.39778,56.180847],[37.40124,56.182045],[37.40157,56.182162],[37.40654,56.183821],[37.40945,56.184759],[37.412375,56.185641],[37.417138,56.186944],[37.422559,56.188279],[37.42596,56.18903],[37.428585,56.189556],[37.431525,56.190115],[37.434481,56.190646],[37.437751,56.191137],[37.437875,56.191156],[37.441626,56.191689],[37.445851,56.192221],[37.449857,56.1926],[37.453109,56.192887],[37.456405,56.193129],[37.460768,56.193373],[37.463037,56.193467],[37.46355,56.193488],[37.475304,56.193973],[37.480062,56.194144],[37.482256,56.194195],[37.484595,56.194191],[37.487165,56.19413],[37.489235,56.194021],[37.49114,56.193854],[37.493483,56.193604],[37.499042,56.192878],[37.503122,56.192435],[37.505549,56.192219],[37.508005,56.192078],[37.510709,56.192009],[37.513659,56.192014],[37.522812,56.19219],[37.527527,56.192235],[37.545396,56.192408],[37.556889,56.19247],[37.563774,56.192529],[37.56651,56.192554],[37.567049,56.192549],[37.568621,56.192527],[37.570018,56.192485],[37.572899,56.192281],[37.575672,56.192024],[37.577534,56.191783],[37.578923,56.191592],[37.580119,56.191415],[37.582147,56.191069],[37.584277,56.19063],[37.585682,56.190305],[37.587603,56.18981],[37.589185,56.189344],[37.596531,56.187032],[37.598684,56.186333],[37.601159,56.185657],[37.604006,56.185007],[37.606622,56.184565],[37.609835,56.184191],[37.612762,56.183735],[37.614621,56.183353],[37.614683,56.18334],[37.653454,56.173595],[37.669303,56.169593],[37.669568,56.169526],[37.683358,56.166048],[37.692242,56.16385],[37.692614,56.163761],[37.71301,56.158903],[37.714779,56.158539],[37.718446,56.157986],[37.719221,56.157893],[37.722174,56.157651],[37.724036,56.157588],[37.726906,56.157549],[37.729545,56.157445],[37.731423,56.157319],[37.733252,56.157146],[37.735693,56.15685],[37.742406,56.155965],[37.749629,56.155012],[37.750031,56.154956],[37.759248,56.153755],[37.761133,56.153504],[37.761656,56.153436],[37.792189,56.149398],[37.792629,56.14934],[37.803081,56.147967],[37.805816,56.147549],[37.807778,56.147183],[37.810337,56.146666],[37.811959,56.146282],[37.813528,56.145892],[37.816535,56.145016],[37.818337,56.1444],[37.821502,56.143193],[37.823079,56.142515],[37.824597,56.141797],[37.827086,56.140503],[37.829763,56.138907],[37.832386,56.13752],[37.834902,56.136378],[37.836576,56.135694],[37.838019,56.135153],[37.840492,56.134346],[37.842976,56.133634],[37.845787,56.132947],[37.848405,56.1324],[37.84972,56.132161],[37.850263,56.132091],[37.853576,56.131663],[37.857288,56.131394],[37.861633,56.131125],[37.866912,56.130993],[37.87235,56.130728],[37.876911,56.130394],[37.877316,56.130357],[37.880792,56.129985],[37.884046,56.129636],[37.889625,56.128793],[37.893783,56.128061],[37.899228,56.126965],[37.90059,56.126691],[37.901047,56.126599],[37.912166,56.124362],[37.920702,56.122738],[37.922341,56.122409],[37.928595,56.121164],[37.928874,56.121108],[37.931073,56.12067],[37.933082,56.12024],[37.933329,56.120187],[37.934385,56.119888],[37.935238,56.119543],[37.935657,56.119374],[37.936939,56.118665],[37.939138,56.117289],[37.942024,56.115549],[37.944535,56.114301],[37.948721,56.112508],[37.951697,56.111522],[37.952582,56.111228],[37.954049,56.110741],[37.95528,56.11037],[37.955627,56.110256],[37.955929,56.110157],[37.956781,56.109834],[37.959949,56.108521],[37.963432,56.106804],[37.965006,56.106031],[37.966486,56.10508],[37.968632,56.103587],[37.969101,56.103237],[37.96926,56.103063],[37.969367,56.102893],[37.969383,56.102755],[37.969302,56.102641],[37.969233,56.102606],[37.969112,56.102545],[37.968758,56.102487],[37.968399,56.102478],[37.96799,56.102539],[37.967699,56.10268],[37.96654,56.103353],[37.966293,56.103572],[37.965774,56.104005],[37.965874,56.104321],[37.966034,56.104547],[37.966013,56.104646],[37.965796,56.104811],[37.964231,56.104305],[37.963824,56.104527],[37.963392,56.104997],[37.963269,56.105155],[37.963132,56.105345],[37.963071,56.105588],[37.963012,56.106159],[37.962997,56.107699],[37.963025,56.107915],[37.963081,56.108074],[37.963164,56.108211],[37.963294,56.108417],[37.963831,56.10874],[37.96426,56.109016],[37.964883,56.109417],[37.965227,56.109645],[37.965506,56.109852],[37.965842,56.110144],[37.966626,56.110682],[37.967397,56.111237],[37.967398,56.111237],[37.97055,56.113611],[37.975259,56.117155],[37.975299,56.117186],[37.983444,56.123317],[37.983942,56.123682],[37.984353,56.123985],[37.98965,56.127888],[37.989791,56.127992],[37.993271,56.130556],[37.993513,56.130731],[37.995845,56.13241],[37.997637,56.1337],[37.998133,56.134058],[37.998184,56.134095],[38.001072,56.136178],[38.002328,56.137081],[38.003352,56.137817],[38.00399,56.138276],[38.004986,56.139019],[38.005724,56.139586],[38.006359,56.140101],[38.007028,56.140694],[38.007538,56.141195],[38.008027,56.141714],[38.008525,56.142332],[38.008891,56.142857],[38.009135,56.143317],[38.009374,56.143899],[38.009577,56.144472],[38.009829,56.145368],[38.009835,56.145392],[38.010007,56.145985],[38.012341,56.15404],[38.012472,56.154484],[38.012569,56.154815],[38.012751,56.155437],[38.013209,56.156997],[38.013343,56.157453],[38.015164,56.163752],[38.015185,56.163826],[38.017125,56.170533],[38.017388,56.171312],[38.017611,56.171984],[38.017836,56.172561],[38.017898,56.172719],[38.018277,56.17342],[38.018649,56.173934],[38.018992,56.174426],[38.019369,56.174897],[38.019774,56.175322],[38.020239,56.175762],[38.020725,56.176182],[38.021231,56.17658],[38.021847,56.177048],[38.023023,56.177879],[38.024203,56.178678],[38.02453,56.178903],[38.025386,56.179503],[38.02642,56.1802],[38.02964,56.182369],[38.03141,56.183559],[38.031492,56.183617],[38.032201,56.184105],[38.032902,56.184588],[38.033664,56.185126],[38.034163,56.185478],[38.034647,56.185815],[38.036421,56.187069],[38.037487,56.18784],[38.038334,56.188469],[38.038766,56.188776],[38.039636,56.189397],[38.041786,56.190903],[38.046159,56.194015],[38.047626,56.195058],[38.048034,56.195348],[38.050417,56.197021],[38.052166,56.19825],[38.052486,56.198491],[38.052811,56.19874],[38.053428,56.199149],[38.054361,56.19969],[38.055383,56.200232],[38.056538,56.200804],[38.059386,56.202215],[38.061066,56.203037],[38.061398,56.203199],[38.063054,56.204009],[38.066598,56.205748],[38.066697,56.205796],[38.067019,56.205954],[38.068359,56.206611],[38.072019,56.208399],[38.073643,56.209192],[38.074532,56.209646],[38.075317,56.210047],[38.075709,56.210257],[38.078306,56.211717],[38.078998,56.212183],[38.079345,56.212426],[38.079878,56.212821],[38.082731,56.214975],[38.083704,56.21571],[38.084456,56.216266],[38.084934,56.216635],[38.085568,56.217103],[38.085826,56.217299],[38.086837,56.218034],[38.087028,56.218173],[38.087686,56.218524],[38.088036,56.218687],[38.088409,56.218831],[38.088752,56.21895],[38.089139,56.219066],[38.089877,56.219246],[38.090969,56.219483],[38.093338,56.219998],[38.098255,56.221071],[38.099668,56.221355],[38.100583,56.221495],[38.101259,56.221577],[38.102153,56.221653],[38.105604,56.22191],[38.106552,56.222006],[38.106717,56.222022],[38.109558,56.22237],[38.111333,56.222716],[38.113109,56.223098],[38.115538,56.223775],[38.118396,56.224733],[38.120022,56.225403],[38.121208,56.225924],[38.121351,56.225987],[38.121719,56.226148],[38.122011,56.226287],[38.132473,56.231271],[38.132966,56.231505],[38.134699,56.232332],[38.135554,56.232741],[38.135703,56.232812],[38.136417,56.23315],[38.137191,56.233517],[38.137946,56.233874],[38.139872,56.234811],[38.142493,56.236026],[38.142505,56.236031],[38.145242,56.237301],[38.145537,56.237447],[38.150349,56.239841],[38.152314,56.241006],[38.154233,56.242215],[38.156781,56.244017],[38.158981,56.24581],[38.159779,56.24653],[38.160468,56.247151],[38.160878,56.247508],[38.161275,56.247846],[38.161388,56.247944],[38.16214,56.248596],[38.163103,56.24943],[38.163336,56.249632],[38.165235,56.251285],[38.167284,56.253112],[38.168866,56.254473],[38.170329,56.255748],[38.170405,56.255816],[38.1711,56.256441],[38.172133,56.257329],[38.174022,56.258986],[38.174586,56.259498],[38.175249,56.260067],[38.175544,56.260321],[38.176951,56.261393],[38.177281,56.261644],[38.179143,56.262988],[38.180421,56.263825],[38.18311,56.265426],[38.183925,56.265886],[38.184698,56.266295],[38.186153,56.26702],[38.187244,56.267544],[38.187299,56.267571],[38.188483,56.268108],[38.189266,56.268459],[38.19099,56.269174],[38.191608,56.269425],[38.192227,56.269694],[38.193288,56.270197],[38.193884,56.270499],[38.194618,56.270882],[38.195345,56.271296],[38.196082,56.271734],[38.196678,56.272094],[38.197322,56.272525],[38.197926,56.272965],[38.198504,56.273419],[38.199078,56.273898],[38.199553,56.274309],[38.200027,56.274738],[38.200444,56.275161],[38.200839,56.275587],[38.201181,56.275971],[38.201905,56.276849],[38.202374,56.277429],[38.203016,56.278206],[38.20401,56.279452],[38.205332,56.281111],[38.206269,56.28227],[38.206777,56.282856],[38.207289,56.283427],[38.208008,56.284185],[38.208708,56.284834],[38.20932,56.285378],[38.209775,56.285731],[38.21117,56.286778],[38.212245,56.287525],[38.212857,56.287962],[38.214124,56.288799],[38.214763,56.289194],[38.215582,56.289639],[38.21621,56.290003],[38.217737,56.290773],[38.219688,56.291696],[38.223776,56.293393],[38.224345,56.293631],[38.225702,56.29421],[38.227277,56.294958],[38.229145,56.295885],[38.231293,56.297164],[38.232316,56.297823],[38.233342,56.298529],[38.234897,56.299693],[38.23523,56.299944],[38.235299,56.299996],[38.236629,56.301146],[38.237938,56.30247],[38.238567,56.303133],[38.239175,56.303827],[38.239326,56.304007],[38.240059,56.30496],[38.241781,56.307725],[38.242066,56.308164],[38.242483,56.308806],[38.245541,56.31386],[38.245899,56.314439],[38.247479,56.316961],[38.248207,56.318123],[38.248325,56.318304],[38.249312,56.319806],[38.249781,56.32049],[38.250123,56.321013],[38.252248,56.324258],[38.253025,56.325433],[38.253093,56.325535],[38.253863,56.3267],[38.254561,56.327769],[38.255562,56.329241],[38.256714,56.331016],[38.257886,56.332753],[38.258585,56.333787],[38.259102,56.334543],[38.259489,56.335152],[38.259757,56.33555],[38.260593,56.336811],[38.26164,56.338323],[38.26187,56.338678],[38.26204,56.33893],[38.262132,56.339066],[38.262548,56.339665],[38.262945,56.340264],[38.262976,56.340306],[38.263523,56.340958],[38.263899,56.341394],[38.264176,56.341701],[38.264491,56.342045],[38.264892,56.342457],[38.265063,56.342627],[38.266323,56.343824],[38.266576,56.344044],[38.267034,56.344426],[38.267483,56.344796],[38.26802,56.34528],[38.268701,56.345833],[38.269077,56.346093],[38.269407,56.346346],[38.27318,56.348914],[38.276355,56.351077],[38.284195,56.356495],[38.285757,56.357569],[38.28749,56.358768],[38.290441,56.360751],[38.291887,56.361717],[38.292765,56.362255],[38.294753,56.363386],[38.294873,56.363454],[38.30027,56.366524],[38.305156,56.36929],[38.311765,56.373031],[38.315276,56.375018],[38.316562,56.375736],[38.317235,56.376111],[38.318814,56.377061],[38.319784,56.377717],[38.321571,56.379127],[38.321656,56.379194],[38.32295,56.380376],[38.323459,56.38084],[38.323901,56.381342],[38.32432,56.381902],[38.324521,56.382231],[38.324706,56.382532],[38.3249,56.382886],[38.32496,56.382996],[38.325148,56.383365],[38.325812,56.384666],[38.326063,56.385377],[38.326368,56.386118],[38.326576,56.387062],[38.326685,56.388265],[38.326721,56.388786],[38.326893,56.390887],[38.326898,56.390951],[38.326933,56.391708],[38.326978,56.392167],[38.327009,56.392488],[38.327028,56.392607],[38.327054,56.392907],[38.327099,56.393263],[38.327144,56.393785],[38.327196,56.395074],[38.327373,56.397884],[38.327577,56.400667],[38.328108,56.4079],[38.328138,56.408278],[38.328186,56.408866],[38.328312,56.409799],[38.328328,56.409915],[38.328501,56.410876],[38.328718,56.411812],[38.329171,56.413331],[38.329751,56.414836],[38.330442,56.416346],[38.33162,56.418366],[38.332866,56.420242],[38.333681,56.421333],[38.334596,56.422346],[38.336204,56.423913],[38.337709,56.425325],[38.339204,56.426739],[38.339942,56.427439],[38.340157,56.427643],[38.340552,56.428018],[38.341817,56.429338],[38.342731,56.430425],[38.343451,56.431363],[38.34459,56.433064],[38.345212,56.434237],[38.34572,56.435392],[38.346129,56.436505],[38.346487,56.437788],[38.346664,56.438671],[38.346829,56.439629],[38.346903,56.440588],[38.346764,56.444174],[38.346565,56.449274],[38.346507,56.45098],[38.346663,56.452396],[38.34669,56.452581],[38.346729,56.452818],[38.346832,56.453313],[38.346966,56.453852],[38.347203,56.454459],[38.347419,56.454918],[38.348074,56.456159],[38.34907,56.457507],[38.349723,56.458304],[38.350147,56.458822],[38.351079,56.459765],[38.351483,56.460149],[38.351881,56.460501],[38.35254,56.461031],[38.353036,56.461383],[38.353566,56.461758],[38.354626,56.462388],[38.355776,56.463064],[38.355787,56.46307],[38.356603,56.463467],[38.35773,56.46394],[38.357901,56.464005],[38.359931,56.464799],[38.360976,56.465181],[38.36133,56.465308],[38.361799,56.465464],[38.362653,56.465724],[38.363164,56.465864],[38.363662,56.465989],[38.364379,56.466154],[38.365115,56.466304],[38.365867,56.466437],[38.36677,56.466584],[38.367902,56.466755],[38.36889,56.466895],[38.369995,56.467055],[38.371296,56.467271],[38.372037,56.467416],[38.37239,56.467486],[38.37276,56.467571],[38.37314,56.467662],[38.373517,56.467758],[38.375815,56.468356],[38.381792,56.469946],[38.385247,56.470881],[38.387115,56.471386],[38.392091,56.472956],[38.394311,56.473785],[38.397568,56.475217],[38.3989,56.475915],[38.401075,56.477056],[38.406597,56.480043],[38.408437,56.480952],[38.41033,56.48177],[38.414713,56.483405],[38.417325,56.484247],[38.417965,56.484453],[38.419622,56.485014],[38.424599,56.486699],[38.430171,56.488515],[38.43329,56.489527],[38.436771,56.49057],[38.439604,56.491313],[38.442824,56.492057],[38.444668,56.492388],[38.446539,56.49269],[38.451677,56.493439],[38.459022,56.494469],[38.464221,56.495213],[38.472516,56.496403],[38.47535,56.496871],[38.475778,56.496945],[38.482819,56.498358],[38.486671,56.499288],[38.49166,56.500789],[38.4947,56.501817],[38.497362,56.502716],[38.497545,56.502778],[38.502202,56.50451],[38.507045,56.50631],[38.510629,56.507583],[38.513933,56.508601],[38.51786,56.509566],[38.522173,56.510443],[38.531103,56.512067],[38.531686,56.512178],[38.542875,56.51427],[38.54645,56.515021],[38.549663,56.515846],[38.551763,56.51648],[38.553323,56.517016],[38.555362,56.517829],[38.556596,56.518379],[38.558241,56.519208],[38.560889,56.520715],[38.561333,56.520967],[38.564219,56.522831],[38.569305,56.526518],[38.573703,56.529642],[38.575193,56.530764],[38.575939,56.531312],[38.577404,56.532357],[38.578854,56.533378],[38.580259,56.534391],[38.581435,56.535238],[38.581918,56.535587],[38.584434,56.537385],[38.585245,56.537997],[38.585308,56.538042],[38.588094,56.540072],[38.589486,56.541111],[38.591592,56.542745],[38.593475,56.544573],[38.594044,56.545433],[38.594223,56.54606],[38.594287,56.546335],[38.594313,56.546598],[38.594299,56.54684],[38.594266,56.547053],[38.594196,56.547313],[38.594128,56.547512],[38.594056,56.547689],[38.593952,56.547902],[38.593824,56.548108],[38.593714,56.548251],[38.593583,56.5484],[38.593379,56.548598],[38.593188,56.548776],[38.593024,56.548905],[38.592721,56.549109],[38.592463,56.549267],[38.592022,56.54954],[38.591657,56.549766],[38.591423,56.549919],[38.591076,56.550158],[38.590705,56.550431],[38.590359,56.550728],[38.589969,56.551058],[38.589705,56.551322],[38.589387,56.551638],[38.589141,56.551907],[38.588939,56.552171],[38.588659,56.552604],[38.588515,56.55287],[38.588331,56.553239],[38.588145,56.553654],[38.587957,56.554073],[38.587625,56.554804],[38.587389,56.555364],[38.587325,56.555528],[38.587237,56.555747],[38.58708,56.556072],[38.587024,56.556186],[38.586977,56.556299],[38.586905,56.556496],[38.586844,56.556708],[38.586782,56.556895],[38.586703,56.557129],[38.586659,56.557238],[38.58661,56.557332],[38.586438,56.557609],[38.585957,56.558382],[38.585808,56.558617],[38.585622,56.558878],[38.585451,56.55912],[38.585224,56.559423],[38.585224,56.559423],[38.584999,56.559717],[38.584337,56.560513],[38.583769,56.561197],[38.58344,56.561597],[38.583187,56.561866],[38.582612,56.562481],[38.58224,56.562952],[38.582784,56.563361],[38.583968,56.564249],[38.586969,56.566508],[38.58816,56.567384],[38.589561,56.568414],[38.591225,56.569723],[38.591507,56.570032],[38.592364,56.570974],[38.592459,56.571079],[38.593414,56.572031],[38.594268,56.57278],[38.595315,56.573627],[38.595387,56.573692],[38.597168,56.575219],[38.59787,56.575831],[38.601779,56.579196],[38.605435,56.582341],[38.60601,56.58284],[38.606213,56.583013],[38.606608,56.583348],[38.610818,56.586976],[38.61755,56.592777],[38.621432,56.59612],[38.621993,56.596617],[38.622229,56.596826],[38.622566,56.597112],[38.622785,56.597298],[38.623641,56.598004],[38.624588,56.598717],[38.625133,56.59912],[38.625576,56.599447],[38.626775,56.600334],[38.627699,56.600989],[38.628017,56.601214],[38.628586,56.601656],[38.628732,56.601771],[38.628892,56.601902],[38.628954,56.601966],[38.629029,56.602042],[38.629216,56.602233],[38.630089,56.603314],[38.630342,56.603556],[38.630437,56.603633],[38.630567,56.603739],[38.630909,56.60395],[38.630964,56.603979],[38.633482,56.60529],[38.63445,56.605794],[38.635126,56.606146],[38.637579,56.607453],[38.638244,56.607842],[38.638985,56.608331],[38.639037,56.608368],[38.640371,56.60934],[38.640636,56.609533],[38.641424,56.610127],[38.643453,56.611611],[38.650594,56.616838],[38.651016,56.617146],[38.658644,56.622728],[38.659041,56.623018],[38.661419,56.624758],[38.663645,56.626389],[38.664549,56.627052],[38.664899,56.627308],[38.668454,56.629913],[38.668506,56.629951],[38.678133,56.637003],[38.678373,56.63718],[38.687781,56.644111],[38.688113,56.644355],[38.688562,56.644685],[38.695012,56.649428],[38.695297,56.649631],[38.695744,56.649959],[38.696853,56.650771],[38.69739,56.651164],[38.697665,56.651366],[38.697998,56.65161],[38.698339,56.651923],[38.698748,56.652379],[38.699142,56.652959],[38.699376,56.653359],[38.699525,56.653742],[38.699572,56.653935],[38.699653,56.654269],[38.699775,56.654532],[38.699963,56.654761],[38.700323,56.65505],[38.700636,56.655276],[38.701739,56.656041],[38.702556,56.656608],[38.702913,56.656855],[38.703268,56.657092],[38.703713,56.657408],[38.704678,56.658093],[38.704981,56.658309],[38.705472,56.658659],[38.706019,56.659059],[38.706259,56.659235],[38.706847,56.659663],[38.70701,56.659782],[38.707371,56.660027],[38.708358,56.660735],[38.708465,56.660811],[38.708657,56.660942],[38.709328,56.661401],[38.71473,56.665258],[38.715718,56.665964],[38.71806,56.667608],[38.722514,56.670799],[38.724657,56.672307],[38.726002,56.673252],[38.731249,56.676978],[38.736043,56.680331],[38.741734,56.684313],[38.742909,56.685155],[38.743988,56.685928],[38.74539,56.686947],[38.745729,56.687226],[38.746028,56.687472],[38.746376,56.687758],[38.746591,56.6879],[38.746721,56.687964],[38.746925,56.688065],[38.747253,56.688193],[38.748124,56.688507],[38.750551,56.689383],[38.751801,56.689834],[38.752305,56.690016],[38.75502,56.691037],[38.755801,56.691331],[38.756465,56.691575],[38.757223,56.691834],[38.757668,56.691987],[38.760422,56.692949],[38.762273,56.693596],[38.762584,56.693709],[38.772314,56.697261],[38.77429,56.697973],[38.781469,56.700565],[38.78239,56.700901],[38.783314,56.701235],[38.78346,56.701288],[38.784045,56.701505],[38.784627,56.701719],[38.785427,56.702014],[38.786236,56.702309],[38.787059,56.702612],[38.787481,56.702764],[38.787888,56.70291],[38.788369,56.703007],[38.788903,56.70313],[38.789491,56.703256],[38.789877,56.70333],[38.790282,56.703397],[38.790676,56.703449],[38.791086,56.703496],[38.791592,56.703543],[38.791959,56.703579],[38.7923,56.703605],[38.792641,56.703629],[38.792882,56.703647],[38.793089,56.703658],[38.793435,56.703675],[38.793722,56.703687],[38.793989,56.703691],[38.794288,56.703694],[38.794542,56.703692],[38.794794,56.703679],[38.795041,56.703664],[38.795592,56.703625],[38.796039,56.703585],[38.796505,56.703541],[38.797142,56.703463],[38.797786,56.703377],[38.798473,56.703261],[38.799027,56.703153],[38.799559,56.703028],[38.799897,56.702945],[38.800231,56.702847],[38.800773,56.702678],[38.80093,56.702622],[38.801087,56.70256],[38.801401,56.702431],[38.801721,56.7023],[38.802032,56.70216],[38.802754,56.701819],[38.803125,56.701619],[38.803469,56.701425],[38.803745,56.701256],[38.803961,56.701119],[38.805599,56.699984],[38.805886,56.699795],[38.80617,56.699613],[38.806645,56.699322],[38.806835,56.699214],[38.807063,56.69909],[38.807359,56.698936],[38.808026,56.698639],[38.808496,56.698454],[38.80881,56.698335],[38.809122,56.698221],[38.809628,56.698052],[38.81034,56.697847],[38.81086,56.697715],[38.811269,56.697623],[38.811693,56.697541],[38.812113,56.697475],[38.812534,56.697417],[38.812924,56.697375],[38.813338,56.697335],[38.814095,56.697271],[38.814636,56.697236],[38.815099,56.697216],[38.815611,56.697208],[38.816182,56.697213],[38.816979,56.697238],[38.818035,56.697277],[38.818952,56.697317],[38.820077,56.69737],[38.820322,56.697381],[38.822703,56.697498],[38.822916,56.697509],[38.823975,56.697561],[38.825732,56.697645],[38.828759,56.697782],[38.82976,56.697833],[38.830844,56.697881],[38.834778,56.698073],[38.836986,56.698186],[38.84228,56.698443],[38.843727,56.69851],[38.845224,56.698617],[38.846061,56.6987],[38.846862,56.698797],[38.846899,56.698802],[38.848163,56.698967],[38.849525,56.6992],[38.85021,56.699325],[38.850895,56.69945],[38.851405,56.699553],[38.851931,56.69967],[38.853019,56.69992],[38.853878,56.700126],[38.854585,56.700306],[38.855273,56.700498],[38.856537,56.70086],[38.858629,56.70146],[38.85984,56.701809],[38.861056,56.702165],[38.861872,56.7024],[38.862663,56.702624],[38.863994,56.70299],[38.865067,56.703268],[38.866823,56.703692],[38.869713,56.704354],[38.871898,56.704855],[38.874252,56.705397],[38.876597,56.705944],[38.877697,56.706205],[38.878763,56.706483],[38.879994,56.706807],[38.88111,56.707113],[38.88192,56.707349],[38.882784,56.707597],[38.883483,56.70781],[38.884671,56.70819],[38.886364,56.708739],[38.888043,56.709272],[38.890037,56.709913],[38.89151,56.710383],[38.892787,56.7108],[38.894275,56.711275],[38.894936,56.711488],[38.896887,56.712101],[38.899201,56.712799],[38.899733,56.712961],[38.900933,56.713293],[38.901968,56.71358],[38.904215,56.714195],[38.905925,56.714668],[38.906522,56.714835],[38.907194,56.715017],[38.909191,56.715574],[38.910074,56.715817],[38.912877,56.716587],[38.915493,56.717312],[38.920393,56.718683],[38.921547,56.719006],[38.922248,56.719204],[38.928384,56.720926],[38.930577,56.721528],[38.93098,56.721638],[38.93371,56.722409],[38.935654,56.722985],[38.93702,56.723437],[38.937716,56.723694],[38.938457,56.723999],[38.939065,56.724269],[38.939453,56.724468],[38.939712,56.724603],[38.940018,56.724779],[38.940647,56.72517],[38.941131,56.725513],[38.942002,56.726139],[38.942444,56.726482],[38.942756,56.726746],[38.943063,56.727021],[38.943581,56.727543],[38.943866,56.727866],[38.944131,56.728183],[38.944409,56.728538],[38.944668,56.728906],[38.944834,56.729159],[38.944982,56.729419],[38.945229,56.729985],[38.947051,56.734954],[38.947182,56.735284],[38.948339,56.738203],[38.948878,56.739846],[38.948919,56.740058],[38.948947,56.740278],[38.948946,56.740489],[38.948932,56.740703],[38.94888,56.741042],[38.948809,56.741308],[38.94871,56.741596],[38.948611,56.741877],[38.948478,56.742159],[38.948308,56.742433],[38.948141,56.742661],[38.948064,56.742764],[38.947895,56.742985],[38.947403,56.743559],[38.946834,56.744151],[38.946626,56.744344],[38.946386,56.744533],[38.946129,56.74471],[38.945922,56.744842],[38.945629,56.745008],[38.945129,56.745259],[38.944125,56.745707],[38.94378,56.745848],[38.943434,56.745978],[38.942945,56.746147],[38.942576,56.746262],[38.941593,56.746613],[38.941328,56.746744],[38.941171,56.74687],[38.941191,56.74692],[38.941196,56.747001],[38.941171,56.747075],[38.941058,56.747203],[38.940942,56.747259],[38.940867,56.747286],[38.940751,56.747315],[38.940577,56.747332],[38.940379,56.747318],[38.940142,56.747269],[38.939806,56.747279],[38.939461,56.74734],[38.93623,56.748426],[38.930935,56.750199],[38.930885,56.750216],[38.921256,56.753486],[38.919617,56.754051],[38.919107,56.754224],[38.91864,56.754392],[38.918152,56.754585],[38.917381,56.754927],[38.917084,56.755068],[38.916805,56.755209],[38.916522,56.755361],[38.916322,56.755483],[38.916131,56.755608],[38.915786,56.755869],[38.915355,56.756267],[38.915156,56.756507],[38.914966,56.756748],[38.914625,56.757231],[38.914467,56.757492],[38.914313,56.757752],[38.914232,56.75792],[38.914164,56.758074],[38.914122,56.758181],[38.914099,56.758285],[38.914076,56.75846],[38.91407,56.758648],[38.914094,56.758962],[38.914121,56.759263],[38.914178,56.759589],[38.914249,56.759902],[38.914443,56.760582],[38.915638,56.764365],[38.916368,56.766556],[38.916636,56.767597],[38.916719,56.768173],[38.916723,56.768554],[38.916698,56.768931],[38.916631,56.769224],[38.916567,56.76949],[38.916496,56.769766],[38.916419,56.770025],[38.916329,56.770204],[38.916222,56.770389],[38.916023,56.770618],[38.91579,56.770848],[38.91528,56.771263],[38.914924,56.771529],[38.91451,56.771801],[38.913653,56.772319],[38.913179,56.772572],[38.912691,56.772796],[38.912135,56.773024],[38.911423,56.773276],[38.910733,56.773502],[38.905935,56.774913],[38.905077,56.775178],[38.904214,56.775435],[38.902569,56.775934],[38.901539,56.776244],[38.897896,56.777335],[38.896758,56.777676],[38.896262,56.777837],[38.894259,56.778429],[38.892305,56.779008],[38.890168,56.779635],[38.887777,56.780346],[38.884507,56.781332],[38.883743,56.781564],[38.883088,56.781762],[38.882836,56.781901],[38.882783,56.781933],[38.882731,56.781968],[38.882696,56.781998],[38.882666,56.782029],[38.882641,56.782074],[38.882631,56.782105],[38.88263,56.782133],[38.882637,56.782194],[38.882642,56.782252],[38.882651,56.782292],[38.882661,56.782334],[38.882634,56.782477],[38.886974,56.789802],[38.888172,56.79171],[38.888636,56.792472],[38.88876,56.792681],[38.892769,56.799464],[38.893409,56.800536],[38.897265,56.806992],[38.900509,56.812425],[38.904039,56.818217],[38.904114,56.818346],[38.905304,56.820355],[38.905533,56.820721],[38.905842,56.821176],[38.905984,56.821368],[38.906124,56.821551],[38.906295,56.82175],[38.906824,56.822308],[38.908157,56.82369],[38.915376,56.831107],[38.915835,56.831577],[38.916308,56.832062],[38.91931,56.835183],[38.923783,56.839768],[38.924752,56.840705],[38.925037,56.841005],[38.925198,56.84117],[38.925378,56.841349],[38.925688,56.841707],[38.925748,56.841763],[38.925949,56.841979],[38.92626,56.842306],[38.929215,56.845321],[38.931527,56.847622],[38.931535,56.84763],[38.93594,56.852118],[38.937693,56.853839],[38.937848,56.853956],[38.937955,56.854033],[38.938999,56.854691],[38.939684,56.855064],[38.951531,56.86151],[38.960735,56.866518],[38.962064,56.867237],[38.964228,56.868404],[38.9644,56.8685],[38.965259,56.868977],[38.965596,56.869161],[38.965947,56.869335],[38.966175,56.869433],[38.966362,56.869507],[38.966548,56.869573],[38.966807,56.869663],[38.967048,56.86974],[38.967289,56.869815],[38.967475,56.869867],[38.967629,56.869904],[38.967792,56.869941],[38.968063,56.869991],[38.968344,56.870036],[38.968653,56.870068],[38.969002,56.870094],[38.969352,56.870112],[38.969743,56.870122],[38.970773,56.870115],[38.978314,56.870049],[38.987582,56.869955],[38.993991,56.869888],[38.994165,56.869886],[38.995062,56.869877],[38.995924,56.869868],[38.99904,56.86984],[38.999508,56.869836],[39.000918,56.869818],[39.002444,56.869797],[39.006978,56.869753],[39.01145,56.869712],[39.019697,56.869629],[39.021298,56.869613],[39.022162,56.869603],[39.023349,56.869591],[39.025325,56.869571],[39.026371,56.869563],[39.027208,56.869556],[39.027685,56.869552],[39.028704,56.869544],[39.032558,56.8695],[39.032995,56.869496],[39.033043,56.869495],[39.035841,56.869461],[39.03698,56.86945],[39.037757,56.869437],[39.038611,56.869427],[39.039515,56.869417],[39.044994,56.869359],[39.050259,56.869305],[39.050744,56.869298],[39.052531,56.86928],[39.054303,56.869262],[39.058707,56.869216],[39.059032,56.869215],[39.059403,56.869211],[39.059886,56.869208],[39.061798,56.869187],[39.062079,56.869185],[39.065891,56.869152],[39.06621,56.86915],[39.06655,56.869155],[39.066842,56.869164],[39.067093,56.86918],[39.067354,56.869201],[39.067662,56.869239],[39.06795,56.869277],[39.068219,56.869325],[39.068541,56.869388],[39.068917,56.869475],[39.069121,56.869526],[39.069357,56.869585],[39.069528,56.86963],[39.069706,56.869677],[39.069908,56.869734],[39.070118,56.869796],[39.07031,56.869856],[39.070443,56.869897],[39.070634,56.869963],[39.070826,56.87003],[39.070976,56.870087],[39.07113,56.870149],[39.071298,56.87022],[39.071399,56.870263],[39.071516,56.870315],[39.071648,56.870375],[39.071753,56.870427],[39.071878,56.870492],[39.071973,56.870541],[39.072089,56.870607],[39.072174,56.87066],[39.072236,56.870703],[39.072319,56.87076],[39.072411,56.870822],[39.0725,56.87089],[39.075974,56.873577],[39.079383,56.876217],[39.08008,56.87675],[39.080935,56.877403],[39.081831,56.878111],[39.083407,56.879303],[39.084453,56.880118],[39.08537,56.880804],[39.086185,56.881434],[39.087468,56.882382],[39.087492,56.882399],[39.087674,56.882538],[39.089493,56.883912],[39.089729,56.884088],[39.090696,56.884849],[39.09234,56.886131],[39.092751,56.886419],[39.092756,56.886422],[39.093125,56.88669],[39.093388,56.886888],[39.093728,56.887164],[39.094048,56.887413],[39.094594,56.887849],[39.095524,56.888583],[39.095582,56.88863],[39.095975,56.888935],[39.095989,56.888947],[39.096477,56.889311],[39.096905,56.889627],[39.097975,56.890436],[39.098901,56.891148],[39.099887,56.891891],[39.100674,56.892476],[39.10097,56.892698],[39.102201,56.893612],[39.102775,56.894048],[39.103045,56.894252],[39.103331,56.894457],[39.103904,56.894898],[39.104376,56.895253],[39.104825,56.895605],[39.105146,56.895854],[39.105411,56.896053],[39.105687,56.89626],[39.106104,56.896573],[39.106828,56.897113],[39.107369,56.897536],[39.107933,56.897966],[39.108264,56.898218],[39.108559,56.898465],[39.109167,56.898932],[39.109771,56.899397],[39.110078,56.899629],[39.110252,56.899763],[39.110793,56.90016],[39.111358,56.900587],[39.11189,56.901],[39.112412,56.901421],[39.116033,56.904165],[39.122024,56.908657],[39.13176,56.915956],[39.142497,56.924004],[39.143853,56.92502],[39.145031,56.925903],[39.148399,56.928495],[39.149634,56.929456],[39.150887,56.93039],[39.151145,56.930581],[39.151936,56.931178],[39.15221,56.931385],[39.153932,56.932669],[39.154847,56.933364],[39.155131,56.93358],[39.155577,56.933915],[39.156773,56.934816],[39.159733,56.937068],[39.160008,56.937277],[39.160079,56.93733],[39.160558,56.937682],[39.161153,56.938121],[39.161792,56.938597],[39.162002,56.938751],[39.162711,56.939311],[39.170247,56.944968],[39.170941,56.945489],[39.172706,56.946813],[39.173685,56.947545],[39.178648,56.95128],[39.178973,56.951524],[39.17927,56.951749],[39.181742,56.953614],[39.183134,56.954666],[39.183385,56.954857],[39.183686,56.955087],[39.183984,56.955315],[39.184292,56.95555],[39.189591,56.959517],[39.196025,56.964333],[39.196555,56.96473],[39.197935,56.965758],[39.198362,56.966092],[39.198468,56.966175],[39.198635,56.966304],[39.198848,56.966466],[39.199033,56.966606],[39.199107,56.966661],[39.199128,56.966677],[39.199354,56.966839],[39.20084,56.967932],[39.202884,56.969451],[39.204878,56.970984],[39.205731,56.971626],[39.206267,56.972023],[39.20886,56.973981],[39.213135,56.977177],[39.217614,56.980526],[39.218565,56.981238],[39.220448,56.982645],[39.220724,56.982851],[39.221111,56.983138],[39.222688,56.984304],[39.222963,56.984529],[39.223287,56.98481],[39.223483,56.98499],[39.224343,56.985853],[39.224371,56.985879],[39.224695,56.986183],[39.224926,56.986386],[39.225174,56.986588],[39.225389,56.986748],[39.226219,56.987337],[39.226678,56.987676],[39.227152,56.988031],[39.227374,56.988207],[39.227606,56.988396],[39.227682,56.988482],[39.227821,56.988615],[39.228083,56.988893],[39.228563,56.989402],[39.22933,56.990214],[39.229575,56.990471],[39.229679,56.990571],[39.229823,56.990692],[39.230042,56.990876],[39.23038,56.991127],[39.230804,56.991406],[39.231304,56.991735],[39.231511,56.991871],[39.233297,56.992983],[39.237689,56.995722],[39.237732,56.995749],[39.237995,56.995914],[39.241324,56.998001],[39.241489,56.998108],[39.24308,56.999111],[39.243505,56.999375],[39.244159,56.999772],[39.244546,56.999994],[39.245071,57.000279],[39.245496,57.000502],[39.24578,57.000658],[39.246461,57.001015],[39.247129,57.001364],[39.247662,57.00164],[39.248214,57.001918],[39.248443,57.002033],[39.24862,57.002127],[39.248823,57.002232],[39.252066,57.003925],[39.25246,57.004132],[39.252726,57.004272],[39.253122,57.004477],[39.253679,57.004776],[39.254239,57.005071],[39.25473,57.005319],[39.25482,57.005365],[39.254984,57.005451],[39.2552,57.005576],[39.255342,57.005663],[39.255481,57.00576],[39.255719,57.005935],[39.255991,57.006149],[39.257181,57.007251],[39.257225,57.007293],[39.257288,57.007347],[39.258558,57.008525],[39.260443,57.010251],[39.260734,57.010513],[39.261956,57.011642],[39.262156,57.011833],[39.26227,57.011934],[39.26279,57.0124],[39.263226,57.012829],[39.263288,57.012914],[39.263336,57.012996],[39.263359,57.013043],[39.263489,57.013385],[39.263553,57.013522],[39.263627,57.013637],[39.263677,57.013698],[39.263745,57.013758],[39.263828,57.01382],[39.26393,57.01388],[39.264192,57.014018],[39.26438,57.014115],[39.264495,57.014181],[39.264594,57.014245],[39.264674,57.014301],[39.264783,57.014385],[39.264906,57.014494],[39.265358,57.014914],[39.26586,57.01539],[39.265968,57.015486],[39.266632,57.016107],[39.267285,57.016732],[39.267462,57.016905],[39.267551,57.016984],[39.267609,57.017035],[39.268383,57.017771],[39.268587,57.017966],[39.268747,57.018126],[39.268858,57.018226],[39.26905,57.018408],[39.269218,57.018565],[39.269856,57.019168],[39.27049,57.019758],[39.270918,57.020149],[39.27147,57.020636],[39.272412,57.02146],[39.272879,57.021873],[39.273347,57.022289],[39.274271,57.023136],[39.275008,57.023797],[39.277603,57.026113],[39.279245,57.027591],[39.279656,57.027972],[39.280168,57.028442],[39.282191,57.030254],[39.283025,57.031354],[39.285884,57.036204],[39.287091,57.03833],[39.28761,57.039228],[39.287993,57.039877],[39.288418,57.040601],[39.288424,57.040611],[39.288763,57.041182],[39.289092,57.041732],[39.289242,57.041965],[39.289395,57.042191],[39.289781,57.042732],[39.290334,57.043477],[39.290983,57.044339],[39.291479,57.045002],[39.292384,57.0462],[39.292704,57.046625],[39.292962,57.046971],[39.293059,57.047105],[39.294035,57.048437],[39.294168,57.048613],[39.296106,57.051214],[39.296521,57.051788],[39.297343,57.052919],[39.298126,57.053963],[39.298288,57.054178],[39.298783,57.054828],[39.29898,57.055091],[39.299017,57.055143],[39.299486,57.055795],[39.299949,57.056425],[39.301525,57.058553],[39.302183,57.05944],[39.303121,57.060694],[39.303445,57.061138],[39.303608,57.061372],[39.30376,57.061609],[39.303935,57.061897],[39.304095,57.062214],[39.304226,57.062511],[39.304363,57.062878],[39.304522,57.063379],[39.304659,57.063825],[39.30475,57.064129],[39.304905,57.064619],[39.305039,57.065064],[39.305156,57.065462],[39.305241,57.065802],[39.305271,57.065958],[39.305291,57.0661],[39.305316,57.066355],[39.305323,57.066625],[39.30532,57.066801],[39.305311,57.066951],[39.305305,57.067043],[39.305294,57.067123],[39.305259,57.067349],[39.305211,57.067586],[39.305164,57.067783],[39.305078,57.068058],[39.304969,57.068351],[39.304866,57.068645],[39.304784,57.068878],[39.304695,57.069121],[39.304675,57.069193],[39.304661,57.06925],[39.304636,57.069369],[39.304623,57.069484],[39.304618,57.069618],[39.304623,57.069738],[39.304647,57.069875],[39.304702,57.070007],[39.30476,57.070144],[39.30482,57.070263],[39.304915,57.070407],[39.304993,57.070512],[39.305008,57.070532],[39.305129,57.070685],[39.305263,57.070845],[39.305404,57.070995],[39.305597,57.071169],[39.305849,57.071379],[39.306392,57.071832],[39.306686,57.072076],[39.306874,57.072239],[39.307142,57.072493],[39.30726,57.072625],[39.307329,57.072719],[39.307388,57.072824],[39.307466,57.073],[39.307677,57.07356],[39.307793,57.073848],[39.308056,57.074691],[39.308406,57.075726],[39.308457,57.075892],[39.30851,57.076069],[39.308877,57.077258],[39.308914,57.077389],[39.309132,57.078117],[39.309584,57.079505],[39.309785,57.080188],[39.310975,57.083954],[39.311179,57.084629],[39.311464,57.085471],[39.311724,57.086277],[39.312187,57.087658],[39.31222,57.087762],[39.312403,57.088356],[39.313086,57.090719],[39.313246,57.091331],[39.313265,57.091414],[39.313305,57.09156],[39.31337,57.091782],[39.313456,57.092072],[39.313494,57.0922],[39.313517,57.092277],[39.313596,57.092523],[39.313763,57.093049],[39.313828,57.093262],[39.314186,57.094342],[39.314429,57.095145],[39.31453,57.095451],[39.314632,57.095792],[39.314895,57.096629],[39.315211,57.097679],[39.315444,57.098428],[39.315573,57.098825],[39.315681,57.099176],[39.31591,57.099907],[39.316059,57.100364],[39.316316,57.101177],[39.31644,57.101591],[39.316508,57.10182],[39.316569,57.101999],[39.316645,57.102226],[39.316699,57.102424],[39.316743,57.102632],[39.316766,57.10278],[39.316787,57.103041],[39.316789,57.103303],[39.316765,57.103759],[39.31677,57.103958],[39.316771,57.104389],[39.316781,57.10494],[39.316765,57.105317],[39.316751,57.105664],[39.316694,57.106911],[39.316657,57.108105],[39.316643,57.108701],[39.316639,57.108948],[39.316649,57.109119],[39.316672,57.109288],[39.31671,57.109474],[39.31679,57.109752],[39.31702,57.11034],[39.317265,57.110965],[39.317416,57.111344],[39.317556,57.111706],[39.317699,57.112052],[39.317841,57.112405],[39.317997,57.112774],[39.318138,57.11312],[39.318392,57.113739],[39.318469,57.11393],[39.318785,57.114735],[39.319878,57.117499],[39.320736,57.119586],[39.321238,57.120837],[39.321581,57.121675],[39.321914,57.122485],[39.322007,57.122707],[39.322108,57.1229],[39.322204,57.123052],[39.322284,57.123165],[39.32243,57.123361],[39.322578,57.123541],[39.32286,57.123833],[39.323124,57.124104],[39.323395,57.124377],[39.323837,57.124818],[39.324253,57.125236],[39.324623,57.125597],[39.324991,57.125969],[39.325183,57.126163],[39.325437,57.126403],[39.32558,57.126528],[39.325796,57.12671],[39.32625,57.127047],[39.326727,57.127394],[39.32867,57.128786],[39.329259,57.129215],[39.329908,57.129699],[39.330361,57.130051],[39.330705,57.130327],[39.331013,57.130596],[39.331209,57.13079],[39.331383,57.130975],[39.331469,57.131073],[39.331635,57.131274],[39.331887,57.131602],[39.332164,57.131967],[39.332548,57.132485],[39.332759,57.132766],[39.332975,57.133053],[39.333153,57.133296],[39.333488,57.133751],[39.333852,57.13425],[39.334438,57.135049],[39.33467,57.135348],[39.334916,57.135674],[39.335241,57.136114],[39.335485,57.136441],[39.33552,57.136488],[39.335768,57.136821],[39.335874,57.136968],[39.33594,57.13706],[39.336026,57.137178],[39.336303,57.137548],[39.336582,57.137955],[39.336681,57.138118],[39.336765,57.138267],[39.336795,57.138321],[39.336855,57.138446],[39.336954,57.138664],[39.337025,57.138848],[39.337089,57.13902],[39.337127,57.139136],[39.337167,57.139257],[39.337242,57.139492],[39.337378,57.139937],[39.337388,57.139974],[39.337404,57.140024],[39.337551,57.140486],[39.337698,57.140954],[39.337917,57.141622],[39.33803,57.141917],[39.338201,57.14232],[39.338421,57.142824],[39.338581,57.143186],[39.338738,57.143543],[39.338827,57.143761],[39.338941,57.144033],[39.33905,57.144303],[39.339153,57.144559],[39.339224,57.144726],[39.339293,57.144869],[39.339383,57.145027],[39.339483,57.145173],[39.339626,57.145373],[39.339661,57.145421],[39.339808,57.145614],[39.339951,57.14579],[39.340107,57.145965],[39.340318,57.146184],[39.340535,57.146403],[39.34154,57.147423],[39.341743,57.147626],[39.342024,57.147906],[39.342564,57.148455],[39.342973,57.148865],[39.343961,57.149867],[39.344305,57.150218],[39.344624,57.150544],[39.344936,57.15087],[39.345116,57.151051],[39.345156,57.151092],[39.34521,57.15115],[39.345455,57.151395],[39.346303,57.152275],[39.346587,57.15257],[39.346873,57.152856],[39.347217,57.153201],[39.347518,57.153525],[39.347812,57.153815],[39.34818,57.154193],[39.348624,57.154642],[39.348833,57.154852],[39.349016,57.155042],[39.349157,57.155182],[39.349537,57.155557],[39.349758,57.155789],[39.349969,57.156024],[39.350111,57.156188],[39.350233,57.156338],[39.350355,57.1565],[39.350447,57.156637],[39.350564,57.15683],[39.350668,57.157027],[39.350867,57.15748],[39.351005,57.157803],[39.351252,57.158528],[39.351424,57.158984],[39.35151,57.159198],[39.351562,57.159329],[39.351668,57.159553],[39.35181,57.159857],[39.351907,57.160039],[39.351944,57.160107],[39.352096,57.160386],[39.352389,57.160893],[39.352427,57.160956],[39.352587,57.161221],[39.352809,57.161559],[39.352938,57.161731],[39.353075,57.161932],[39.35336,57.162328],[39.353969,57.163145],[39.354818,57.164309],[39.355544,57.165277],[39.356905,57.167072],[39.357125,57.16735],[39.357385,57.167711],[39.357498,57.167881],[39.357628,57.168087],[39.357688,57.168225],[39.357707,57.168273],[39.357725,57.168311],[39.357762,57.168403],[39.357824,57.168601],[39.357851,57.168761],[39.35787,57.168899],[39.357892,57.169362],[39.357899,57.169784],[39.357903,57.169871],[39.357894,57.170308],[39.357891,57.170427],[39.357893,57.171108],[39.357894,57.172264],[39.357866,57.173329],[39.357858,57.173604],[39.357869,57.173972],[39.35791,57.17435],[39.35797,57.174697],[39.358022,57.174943],[39.358073,57.175139],[39.358136,57.175313],[39.358206,57.17547],[39.358305,57.175642],[39.3584,57.175789],[39.358515,57.175952],[39.358663,57.176152],[39.358792,57.176312],[39.358922,57.176464],[39.359092,57.176658],[39.359282,57.176868],[39.35959,57.177184],[39.359768,57.177353],[39.359955,57.177518],[39.360097,57.177627],[39.360241,57.177732],[39.360376,57.177829],[39.36064,57.178006],[39.360905,57.17817],[39.361207,57.178351],[39.361655,57.17861],[39.362735,57.179203],[39.363674,57.179713],[39.365031,57.18044],[39.36638,57.181159],[39.367479,57.181722],[39.367668,57.181811],[39.368374,57.182121],[39.368651,57.182235],[39.368823,57.182304],[39.369882,57.182726],[39.370026,57.182783],[39.371868,57.183519],[39.37379,57.184276],[39.373961,57.184342],[39.377669,57.185774],[39.377679,57.185778],[39.379283,57.186418],[39.379998,57.186701],[39.380663,57.186982],[39.381676,57.187341],[39.382427,57.18764],[39.383098,57.187915],[39.383569,57.1881],[39.384639,57.188509],[39.384984,57.188648],[39.385456,57.188837],[39.386161,57.189127],[39.386763,57.189378],[39.387816,57.189789],[39.388967,57.190246],[39.389541,57.190473],[39.389768,57.19056],[39.390737,57.190939],[39.391583,57.191262],[39.392694,57.191692],[39.393392,57.191961],[39.394183,57.192267],[39.394271,57.192299],[39.394366,57.192331],[39.394474,57.192368],[39.394592,57.192408],[39.394741,57.192454],[39.394904,57.192501],[39.395023,57.192532],[39.395146,57.19256],[39.395255,57.192582],[39.395389,57.192604],[39.395532,57.192624],[39.395633,57.192635],[39.395747,57.192647],[39.395866,57.192653],[39.395984,57.192653],[39.396138,57.192652],[39.396286,57.192644],[39.396485,57.19263],[39.396702,57.192606],[39.396878,57.192581],[39.396948,57.19257],[39.397025,57.192557],[39.397125,57.192542],[39.397227,57.192529],[39.39734,57.192523],[39.397444,57.192517],[39.39757,57.192515],[39.397744,57.192515],[39.397795,57.192517],[39.397889,57.192525],[39.398038,57.192538],[39.398104,57.192544],[39.398266,57.192566],[39.398425,57.192591],[39.398531,57.192612],[39.398631,57.192637],[39.398779,57.19268],[39.398949,57.192746],[39.399034,57.192783],[39.399196,57.192869],[39.399958,57.193315],[39.400151,57.193427],[39.400641,57.193728],[39.400761,57.193798],[39.400842,57.193845],[39.401035,57.193958],[39.40142,57.194183],[39.401916,57.194477],[39.401982,57.194514],[39.402282,57.194684],[39.40249,57.194789],[39.402625,57.194856],[39.402958,57.195021],[39.403127,57.195104],[39.403355,57.19521],[39.403856,57.195442],[39.404367,57.195656],[39.405171,57.19597],[39.405816,57.196209],[39.405902,57.19624],[39.406625,57.196507],[39.407576,57.196876],[39.407695,57.196922],[39.407861,57.196986],[39.408084,57.197083],[39.408436,57.197227],[39.409435,57.197653],[39.409892,57.197838],[39.410299,57.197994],[39.410454,57.198046],[39.410727,57.19813],[39.410946,57.198187],[39.411147,57.198236],[39.411398,57.198284],[39.411626,57.198324],[39.411914,57.198368],[39.412297,57.198424],[39.412939,57.198513],[39.41364,57.198606],[39.41407,57.198671],[39.414152,57.198683],[39.415044,57.198813],[39.415242,57.198843],[39.415541,57.198892],[39.415751,57.198932],[39.4159,57.198971],[39.416135,57.199041],[39.41637,57.199122],[39.416605,57.199209],[39.417042,57.199383],[39.417386,57.199517],[39.417773,57.199699],[39.418823,57.200113],[39.418867,57.20013],[39.418979,57.200173],[39.42056,57.200788],[39.422145,57.201406],[39.423184,57.201809],[39.423434,57.201907],[39.423739,57.202026],[39.426217,57.202977],[39.427347,57.203411],[39.42859,57.203886],[39.429002,57.204031],[39.429193,57.204133],[39.429251,57.204175],[39.429351,57.204289],[39.429395,57.204381],[39.429404,57.204422],[39.429414,57.204479],[39.429416,57.204533],[39.429405,57.204677],[39.429403,57.204707],[39.429383,57.205063],[39.429386,57.205183],[39.429394,57.205292],[39.429405,57.205369],[39.429409,57.205397],[39.42944,57.205512],[39.429474,57.205628],[39.429524,57.205743],[39.429592,57.205861],[39.429685,57.20599],[39.429772,57.206089],[39.429892,57.206204],[39.429996,57.206285],[39.430143,57.206386],[39.43021,57.206433],[39.430328,57.206504],[39.430497,57.206596],[39.430674,57.20668],[39.430858,57.20676],[39.434306,57.208196],[39.435597,57.208752],[39.435985,57.208914],[39.436241,57.209005],[39.437137,57.209384],[39.437514,57.209543],[39.442478,57.211647],[39.443742,57.212173],[39.443812,57.212202],[39.446237,57.213221],[39.447243,57.213654],[39.447627,57.213816],[39.448111,57.214023],[39.448449,57.214167],[39.449545,57.214614],[39.450729,57.215095],[39.45198,57.2156],[39.452138,57.215664],[39.453092,57.216049],[39.454557,57.216641],[39.455421,57.21699],[39.455714,57.217114],[39.455963,57.217231],[39.456274,57.217388],[39.456555,57.217543],[39.456843,57.21771],[39.457166,57.217906],[39.457376,57.218055],[39.45752,57.218167],[39.457667,57.218276],[39.45875,57.219216],[39.459007,57.219442],[39.45921,57.219636],[39.45941,57.219824],[39.459756,57.22026],[39.459983,57.220552],[39.460669,57.221454],[39.461006,57.22189],[39.461205,57.222147],[39.46193,57.223123],[39.462678,57.224131],[39.471916,57.236446],[39.472172,57.236775],[39.47469,57.240142],[39.47563,57.241397],[39.47648,57.242533],[39.479461,57.246517],[39.48028,57.247613],[39.480324,57.247669],[39.480354,57.247708],[39.48054,57.24795],[39.480559,57.247974],[39.481286,57.248926],[39.481413,57.249093],[39.483335,57.251649],[39.483561,57.251854],[39.484192,57.252702],[39.48501,57.25379],[39.485733,57.254757],[39.486711,57.256055],[39.48697,57.256391],[39.487412,57.256988],[39.488101,57.257907],[39.488566,57.258536],[39.488961,57.259059],[39.489406,57.25964],[39.489725,57.260043],[39.489978,57.260323],[39.490266,57.260611],[39.490507,57.260852],[39.490929,57.261241],[39.491431,57.261722],[39.491942,57.262204],[39.49259,57.262822],[39.49312,57.263322],[39.493593,57.263769],[39.495119,57.26519],[39.496079,57.266106],[39.496597,57.266603],[39.496806,57.266797],[39.497793,57.267727],[39.498785,57.268659],[39.500755,57.270509],[39.501212,57.27094],[39.501898,57.271582],[39.502606,57.272252],[39.503324,57.272924],[39.503671,57.27325],[39.503837,57.273407],[39.503861,57.273429],[39.504599,57.274123],[39.505499,57.274968],[39.506306,57.275729],[39.507189,57.276558],[39.507696,57.277037],[39.507996,57.277319],[39.508082,57.2774],[39.508597,57.277884],[39.509295,57.278544],[39.509886,57.279101],[39.510293,57.27948],[39.510794,57.279949],[39.511294,57.280422],[39.511689,57.280791],[39.511816,57.280911],[39.512177,57.281254],[39.512778,57.281823],[39.513365,57.282375],[39.513782,57.282765],[39.513947,57.282923],[39.513998,57.282973],[39.51454,57.283478],[39.514772,57.283698],[39.514993,57.283906],[39.515309,57.2842],[39.515695,57.284563],[39.5161,57.284943],[39.516499,57.285321],[39.516669,57.28548],[39.517193,57.285973],[39.517708,57.286455],[39.518303,57.28702],[39.518896,57.287577],[39.519395,57.288042],[39.519779,57.288405],[39.520264,57.288867],[39.521611,57.290128],[39.521741,57.29025],[39.522551,57.29101],[39.522733,57.29118],[39.52299,57.29142],[39.52336,57.291764],[39.523538,57.291931],[39.524216,57.292565],[39.524442,57.292768],[39.524643,57.292949],[39.524855,57.293143],[39.524952,57.293233],[39.525076,57.293333],[39.525204,57.293431],[39.525434,57.293616],[39.525585,57.293725],[39.526129,57.294124],[39.526487,57.294382],[39.526867,57.294652],[39.527244,57.294924],[39.527606,57.295188],[39.527742,57.295287],[39.527936,57.295427],[39.528516,57.29585],[39.528886,57.296112],[39.529205,57.296341],[39.52941,57.296484],[39.530613,57.297362],[39.532042,57.2984],[39.532716,57.298883],[39.533426,57.299384],[39.534042,57.299806],[39.534783,57.300306],[39.535533,57.300808],[39.536014,57.301126],[39.536113,57.301187],[39.536248,57.301277],[39.536403,57.30138],[39.53669,57.301574],[39.537547,57.302144],[39.538179,57.302563],[39.53867,57.30289],[39.538792,57.302971],[39.539543,57.303471],[39.540282,57.303961],[39.541399,57.304705],[39.541914,57.305051],[39.542495,57.30544],[39.54296,57.305749],[39.543004,57.305779],[39.543153,57.305885],[39.543269,57.306008],[39.543792,57.306353],[39.544649,57.306923],[39.547211,57.308618],[39.547492,57.308801],[39.54777,57.308987],[39.549353,57.31003],[39.550219,57.310601],[39.550662,57.310892],[39.551749,57.311597],[39.551771,57.311611],[39.554884,57.313687],[39.556917,57.315043],[39.557265,57.315282],[39.557524,57.315482],[39.557773,57.315692],[39.558047,57.315976],[39.560479,57.31873],[39.560969,57.319318],[39.561108,57.319485],[39.561621,57.3201],[39.561855,57.320352],[39.562062,57.320532],[39.562307,57.320723],[39.562554,57.320877],[39.562899,57.321061],[39.563358,57.321289],[39.563945,57.321612],[39.564188,57.321767],[39.564398,57.321911],[39.56456,57.322048],[39.564713,57.322187],[39.564893,57.322373],[39.566257,57.3238],[39.566688,57.324257],[39.566842,57.324413],[39.566912,57.324491],[39.567755,57.325359],[39.56824,57.32587],[39.568484,57.326126],[39.568492,57.326134],[39.570639,57.328374],[39.571519,57.329292],[39.571698,57.329479],[39.573759,57.331674],[39.573904,57.331829],[39.57511,57.333126],[39.575898,57.333974],[39.576063,57.334151],[39.578722,57.337028],[39.579177,57.337523],[39.57961,57.33803],[39.579843,57.338359],[39.580017,57.338669],[39.580227,57.339098],[39.580889,57.340657],[39.580934,57.340763],[39.581432,57.341968],[39.581755,57.342749],[39.582004,57.343351],[39.582491,57.344505],[39.58261,57.344786],[39.582752,57.345123],[39.583274,57.346147],[39.583376,57.346347],[39.583609,57.346774],[39.583844,57.347214],[39.584128,57.347693],[39.584371,57.34808],[39.58521,57.349363],[39.585315,57.349524],[39.585726,57.350117],[39.585888,57.350315],[39.586026,57.350485],[39.586291,57.350775],[39.58667,57.351165],[39.587061,57.35155],[39.591145,57.355594],[39.591699,57.356137],[39.59234,57.356731],[39.593139,57.357435],[39.593514,57.357786],[39.593757,57.358012],[39.593873,57.358119],[39.593968,57.358208],[39.594363,57.358619],[39.595024,57.359344],[39.595175,57.359525],[39.595787,57.36026],[39.595867,57.360357],[39.595973,57.360495],[39.596253,57.360858],[39.596545,57.361254],[39.596746,57.361567],[39.596914,57.36185],[39.596988,57.361995],[39.597093,57.362203],[39.597457,57.362894],[39.599582,57.3673],[39.599984,57.368095],[39.600104,57.368332],[39.60043,57.368923],[39.600518,57.369067],[39.600795,57.369513],[39.601116,57.370011],[39.601305,57.370343],[39.601418,57.370581],[39.601499,57.370801],[39.601618,57.37114],[39.601643,57.371226],[39.601653,57.371261],[39.601693,57.3714],[39.60182,57.371796],[39.602044,57.372571],[39.602083,57.372718],[39.602253,57.373397],[39.60237,57.373796],[39.602536,57.374163],[39.602685,57.37443],[39.602894,57.374741],[39.603085,57.375008],[39.603257,57.37523],[39.603545,57.375539],[39.603848,57.375835],[39.604135,57.376084],[39.604486,57.376351],[39.60483,57.376597],[39.605192,57.376834],[39.605614,57.377102],[39.605761,57.377183],[39.606681,57.37766],[39.607695,57.3782],[39.608729,57.378746],[39.611034,57.379935],[39.612569,57.380748],[39.613521,57.381238],[39.614651,57.38183],[39.615034,57.382036],[39.615406,57.382227],[39.615986,57.382533],[39.617087,57.383116],[39.618259,57.383736],[39.619222,57.384237],[39.620345,57.384814],[39.62151,57.385415],[39.622678,57.386011],[39.62326,57.386311],[39.626487,57.388006],[39.62959,57.389588],[39.63015,57.389868],[39.630745,57.390158],[39.633542,57.391487],[39.634158,57.391775],[39.634983,57.392185],[39.635927,57.392651],[39.636896,57.393154],[39.637805,57.393641],[39.638549,57.394036],[39.639466,57.394552],[39.640424,57.395106],[39.641111,57.395524],[39.641863,57.396],[39.642357,57.396321],[39.643652,57.39716],[39.644488,57.397717],[39.645162,57.398166],[39.646022,57.398728],[39.647219,57.399515],[39.647981,57.400019],[39.648529,57.400381],[39.648968,57.400676],[39.649824,57.401236],[39.650727,57.401825],[39.651405,57.402273],[39.652059,57.402713],[39.652963,57.403328],[39.653841,57.40391],[39.654639,57.404415],[39.655147,57.404737],[39.655606,57.405028],[39.656105,57.405343],[39.656699,57.405729],[39.659789,57.407715],[39.659797,57.40772],[39.660797,57.408365],[39.662709,57.409599],[39.66403,57.410445],[39.66534,57.411262],[39.666917,57.41228],[39.668784,57.413488],[39.670932,57.414883],[39.672149,57.415661],[39.673284,57.416384],[39.674672,57.417271],[39.676093,57.418172],[39.677017,57.418758],[39.677796,57.419253],[39.677946,57.419349],[39.689295,57.426551],[39.698067,57.432149],[39.702935,57.435248],[39.706456,57.43749],[39.71383,57.442171],[39.713831,57.442172],[39.724447,57.448911],[39.732122,57.453782],[39.733954,57.454963],[39.734485,57.455304],[39.736401,57.456539],[39.73694,57.456888],[39.738458,57.457872],[39.74462,57.461792],[39.745225,57.462177],[39.745672,57.462459],[39.7467,57.463107],[39.751566,57.46619],[39.752643,57.466873],[39.753978,57.467692],[39.756092,57.46902],[39.758544,57.470733],[39.762239,57.473837],[39.76974,57.48007],[39.773593,57.48327],[39.776169,57.48541],[39.77734,57.486396],[39.779035,57.487815],[39.779976,57.488657],[39.78074,57.489355],[39.781851,57.490544],[39.782735,57.491687],[39.783735,57.493505],[39.783989,57.49427],[39.784349,57.495358],[39.785164,57.499032],[39.785192,57.49916],[39.78529,57.499603],[39.785831,57.50204],[39.786012,57.50286],[39.786724,57.50607],[39.788258,57.512984],[39.788409,57.514016],[39.788473,57.515054],[39.788033,57.516884],[39.785782,57.520959],[39.784544,57.523198],[39.78402,57.524511],[39.783937,57.524821],[39.783895,57.525048],[39.78384,57.525369],[39.783801,57.525692],[39.783781,57.526129],[39.783802,57.526565],[39.783845,57.526995],[39.783937,57.527529],[39.784004,57.527859],[39.784082,57.528178],[39.784156,57.528456],[39.784453,57.529551],[39.784597,57.529995],[39.784854,57.530788],[39.78513,57.531446],[39.785398,57.531982],[39.785695,57.532451],[39.786171,57.533031],[39.786654,57.533535],[39.787806,57.534531],[39.788151,57.534806],[39.79071,57.536662],[39.791322,57.537106],[39.792315,57.537826],[39.793675,57.538813],[39.794652,57.539525],[39.79505,57.539817],[39.795133,57.539876],[39.795245,57.539956],[39.795969,57.540478],[39.796258,57.540687],[39.800104,57.543465],[39.801219,57.544296],[39.80376,57.546122],[39.804632,57.546761],[39.804771,57.546862],[39.804906,57.54696],[39.805617,57.547476],[39.807175,57.548606],[39.807339,57.548725],[39.809594,57.55036],[39.810204,57.550803],[39.811224,57.551545],[39.812025,57.552121],[39.812717,57.552618],[39.813537,57.553212],[39.813865,57.55345],[39.814028,57.553568],[39.816814,57.555621],[39.817689,57.556243],[39.818962,57.55715],[39.819548,57.557567],[39.820155,57.558001],[39.820962,57.558594],[39.821976,57.55934],[39.822943,57.560048],[39.823999,57.560826],[39.824187,57.56096],[39.824432,57.561133],[39.824713,57.561336],[39.826122,57.562337],[39.826395,57.562512],[39.826932,57.56282],[39.827705,57.563271],[39.827914,57.563413],[39.828213,57.563633],[39.828374,57.563747],[39.828463,57.563812],[39.828658,57.563858],[39.82873,57.563902],[39.828806,57.563938],[39.828872,57.563964],[39.828926,57.56398],[39.828979,57.563993],[39.829046,57.564005],[39.829133,57.564011],[39.829212,57.564013],[39.829298,57.564009],[39.829364,57.564004],[39.82942,57.563997],[39.829543,57.563988],[39.830954,57.56373],[39.831399,57.563649],[39.835052,57.563026],[39.835592,57.562927],[39.836466,57.562766],[39.838769,57.562361],[39.838811,57.562353],[39.84045,57.562049],[39.841812,57.561788],[39.842129,57.56173],[39.842641,57.561636],[39.849146,57.560451],[39.854707,57.559406],[39.855692,57.559219],[39.85597,57.559162],[39.856504,57.559044],[39.857136,57.558907],[39.857756,57.558772],[39.858198,57.558676],[39.858777,57.558552],[39.874314,57.555206],[39.875691,57.554845],[39.883591,57.552414],[39.885648,57.551835],[39.889683,57.550932],[39.890432,57.550764],[39.891145,57.550617],[39.89148,57.550547],[39.911787,57.546335],[39.91193,57.546305],[39.917083,57.545228],[39.919474,57.54472],[39.92087,57.544465],[39.92136,57.5444],[39.922484,57.544276],[39.929076,57.543875],[39.932519,57.543694],[39.935594,57.543499],[39.936158,57.543474],[39.936883,57.543442],[39.937033,57.543434],[39.940948,57.543228],[39.94193,57.54317],[39.942644,57.543121],[39.943962,57.543036],[39.945052,57.542975],[39.945633,57.542943],[39.946271,57.542907],[39.947472,57.542847],[39.947752,57.542833],[39.948926,57.542756],[39.950023,57.542693],[39.950755,57.542648],[39.951099,57.542626],[39.952911,57.542537],[39.95334,57.542514],[39.954087,57.542473],[39.954701,57.542439],[39.957477,57.542282],[39.95766,57.542271],[39.960812,57.542103],[39.964646,57.541894],[39.965047,57.54187],[39.96555,57.541839],[39.966272,57.541807],[39.968724,57.541675],[39.969837,57.541611],[39.970169,57.541576],[39.970458,57.541539],[39.97081,57.541488],[39.971339,57.541369],[39.971377,57.541324],[39.971527,57.541239],[39.971722,57.541187],[39.971939,57.541173],[39.97201,57.541182],[39.972151,57.5412],[39.972307,57.541254],[39.972638,57.541191],[39.972898,57.541153],[39.973097,57.541129],[39.973302,57.541111],[39.973505,57.541102],[39.973803,57.541087],[39.973933,57.54108],[39.974018,57.541076],[39.974336,57.54106],[39.975048,57.541034],[39.978524,57.540904],[39.979135,57.540887],[39.979319,57.540882],[39.981724,57.540781],[39.984505,57.540631],[39.9869,57.540502],[39.987245,57.540483],[39.997434,57.539923],[39.998899,57.539782],[40.000846,57.539509],[40.003266,57.539111],[40.004543,57.538892],[40.004978,57.538809],[40.005448,57.538731],[40.006743,57.538517],[40.007935,57.538305],[40.008651,57.538236],[40.0089,57.538192],[40.009127,57.538151],[40.009448,57.538094],[40.009791,57.538032],[40.010694,57.537871],[40.011255,57.537773],[40.012031,57.537633],[40.013242,57.537436],[40.013812,57.537345],[40.015386,57.537118],[40.017868,57.536787],[40.02067,57.536408],[40.023005,57.536062],[40.024954,57.535782],[40.027366,57.535465],[40.028668,57.535275],[40.029623,57.535171],[40.031002,57.535086],[40.03193,57.535081],[40.032433,57.535084],[40.034,57.535137],[40.035128,57.535221],[40.03659,57.535401],[40.037832,57.535588],[40.041598,57.536199],[40.045214,57.53681],[40.048839,57.537408],[40.049262,57.537474],[40.051949,57.537855],[40.052405,57.537913],[40.053284,57.538014],[40.054829,57.53821],[40.055424,57.53828],[40.055941,57.538346],[40.056621,57.538439],[40.057811,57.538574],[40.061816,57.539064],[40.063687,57.539348],[40.065514,57.53966],[40.069623,57.540438],[40.073712,57.541241],[40.076117,57.541696],[40.081907,57.542791],[40.081921,57.542794],[40.082965,57.542965],[40.086008,57.543493],[40.089895,57.544093],[40.091846,57.544377],[40.095167,57.544836],[40.09811,57.545195],[40.099545,57.545271],[40.101157,57.545286],[40.102859,57.545224],[40.104904,57.545142],[40.10669,57.545033],[40.107943,57.544932],[40.10911,57.544771],[40.110281,57.544571],[40.112631,57.544065],[40.114837,57.5436],[40.11547,57.543401],[40.115818,57.543272],[40.11673,57.542722],[40.117669,57.542078],[40.118356,57.541663],[40.118592,57.541521],[40.119196,57.541281],[40.119875,57.541133],[40.120552,57.541034],[40.121032,57.540991],[40.121346,57.540964],[40.122088,57.540941],[40.122618,57.540944],[40.123382,57.540957],[40.12427,57.540974],[40.125437,57.540992],[40.125693,57.540999],[40.126973,57.54102],[40.128368,57.541058],[40.128609,57.541064],[40.129055,57.541075],[40.129315,57.541081],[40.132667,57.541159],[40.133727,57.541201],[40.134405,57.541228],[40.134797,57.541261],[40.134882,57.541268],[40.135843,57.541382],[40.137332,57.541711],[40.138633,57.542007],[40.139749,57.54226],[40.141151,57.542583],[40.144028,57.543189],[40.152234,57.544995],[40.153387,57.545257],[40.157535,57.546177],[40.159016,57.546471],[40.162395,57.547145],[40.164196,57.547507],[40.166345,57.547924],[40.168816,57.548389],[40.174438,57.549386],[40.185176,57.551475],[40.191933,57.552726],[40.191965,57.552732],[40.19214,57.552765],[40.193165,57.552961],[40.193194,57.552967],[40.193748,57.553072],[40.194943,57.5533],[40.195067,57.553324],[40.195717,57.553448],[40.196814,57.553657],[40.197614,57.55381],[40.197954,57.553875],[40.198383,57.553958],[40.198511,57.553981],[40.198683,57.554014],[40.200471,57.554346],[40.20133,57.554506],[40.203432,57.554905],[40.207802,57.555762],[40.217647,57.557633],[40.229923,57.559966],[40.23098,57.560172],[40.23126,57.560218],[40.232625,57.56048],[40.233785,57.560701],[40.239514,57.561791],[40.2403,57.561941],[40.242105,57.56229],[40.250045,57.563778],[40.251531,57.564064],[40.252443,57.564267],[40.253287,57.564495],[40.254514,57.564916],[40.256514,57.565822],[40.256895,57.566],[40.257884,57.566497],[40.265532,57.570063],[40.268919,57.571663],[40.269264,57.571826],[40.270579,57.572528],[40.273859,57.574546],[40.274388,57.574879],[40.279733,57.578177],[40.280034,57.578362],[40.28104,57.578984],[40.292673,57.586179],[40.303968,57.59316],[40.309771,57.596727],[40.312373,57.598343],[40.314704,57.599655],[40.31736,57.601025],[40.325395,57.605024],[40.332482,57.608572],[40.332976,57.608819],[40.339576,57.612093],[40.347255,57.615929],[40.35147,57.618014],[40.352134,57.618343],[40.370883,57.627676],[40.375731,57.630081],[40.379206,57.631873],[40.380515,57.632501],[40.38238,57.633487],[40.382965,57.633797],[40.384422,57.634519],[40.384533,57.634574],[40.384555,57.634585],[40.384623,57.634618],[40.386273,57.635372],[40.386769,57.63557],[40.387826,57.635993],[40.388768,57.636353],[40.389287,57.636543],[40.389962,57.636726],[40.390753,57.636898],[40.3915,57.63703],[40.392498,57.637149],[40.393269,57.637198],[40.394254,57.637218],[40.395194,57.637159],[40.396267,57.63707],[40.397278,57.636947],[40.400747,57.636449],[40.401907,57.636295],[40.403294,57.636089],[40.403996,57.635993],[40.404374,57.635941],[40.405326,57.63581],[40.406267,57.63567],[40.408435,57.635374],[40.408667,57.635338],[40.409252,57.635266],[40.40987,57.635203],[40.410489,57.635158],[40.41124,57.635132],[40.413148,57.635132],[40.417892,57.635074],[40.419764,57.635056],[40.420733,57.635042],[40.421671,57.635089],[40.422778,57.635165],[40.424899,57.635377],[40.426993,57.635608],[40.433154,57.636247],[40.439114,57.636819],[40.451181,57.638065],[40.456134,57.638581],[40.460608,57.639048],[40.46519,57.639525],[40.466848,57.639693],[40.482537,57.641281],[40.489464,57.641997],[40.48973,57.642025],[40.495513,57.642622],[40.502109,57.64334],[40.506473,57.643784],[40.507006,57.643831],[40.508026,57.643935],[40.508942,57.64399],[40.509746,57.643994],[40.511378,57.643915],[40.51272,57.643791],[40.513383,57.643749],[40.513759,57.643724],[40.518214,57.643352],[40.519359,57.643252],[40.520266,57.643172],[40.522389,57.643001],[40.522945,57.642952],[40.523165,57.642933],[40.524046,57.64287],[40.52484,57.642821],[40.52495,57.642822],[40.525258,57.642821],[40.525348,57.642822],[40.525774,57.64285],[40.526068,57.642883],[40.526421,57.642936],[40.526798,57.643002],[40.527577,57.643142],[40.528027,57.643223],[40.528537,57.643322],[40.528863,57.643392],[40.529694,57.643575],[40.530299,57.643707],[40.530991,57.643876],[40.532057,57.644101],[40.532339,57.64417],[40.53265,57.644236],[40.533352,57.644384],[40.53425,57.644573],[40.535125,57.644746],[40.535903,57.644902],[40.536429,57.645011],[40.537092,57.645151],[40.538036,57.645343],[40.538866,57.645517],[40.540282,57.645815],[40.541756,57.646126],[40.542197,57.646228],[40.542492,57.646302],[40.54276,57.646376],[40.543036,57.646458],[40.543328,57.646553],[40.543534,57.646625],[40.543791,57.64672],[40.544101,57.646845],[40.544608,57.647069],[40.545173,57.647333],[40.546084,57.647779],[40.550513,57.649924],[40.55075,57.650045],[40.551477,57.650401],[40.557197,57.65316],[40.558797,57.65389],[40.561866,57.655361],[40.562596,57.655752],[40.563807,57.656776],[40.565411,57.6581],[40.565749,57.658387],[40.566147,57.658726],[40.571821,57.663463],[40.572252,57.663823],[40.575441,57.666543],[40.576151,57.667137],[40.57801,57.668592],[40.57967,57.669979],[40.579746,57.670042],[40.580553,57.670661],[40.581235,57.6712],[40.581854,57.671646],[40.581965,57.671731],[40.58248,57.672097],[40.584042,57.67321],[40.584621,57.673593],[40.588538,57.676065],[40.594925,57.680177],[40.597207,57.681656],[40.599659,57.683163],[40.600741,57.683719],[40.601711,57.684224],[40.602895,57.684738],[40.604053,57.685203],[40.605185,57.685601],[40.606213,57.685982],[40.606249,57.685995],[40.607581,57.686394],[40.608886,57.686767],[40.61018,57.687095],[40.611459,57.687367],[40.615437,57.688169],[40.61991,57.689071],[40.625433,57.69017],[40.630979,57.69124],[40.631672,57.691375],[40.641436,57.693272],[40.649425,57.694801],[40.651716,57.695227],[40.653946,57.695656],[40.656693,57.696177],[40.657364,57.696308],[40.658566,57.696542],[40.661142,57.697044],[40.662911,57.697388],[40.667367,57.698262],[40.676314,57.69999],[40.677173,57.700155],[40.681418,57.700969],[40.685263,57.701706],[40.686155,57.70188],[40.687019,57.702046],[40.68711,57.702064],[40.68773,57.702184],[40.688118,57.702259],[40.688233,57.702281],[40.692277,57.703066],[40.692465,57.703102],[40.692701,57.703145],[40.692743,57.703153],[40.6942,57.703435],[40.696036,57.703793],[40.696276,57.70384],[40.703125,57.705169],[40.703135,57.705171],[40.706984,57.705918],[40.711894,57.706872],[40.712959,57.707079],[40.716606,57.707803],[40.718774,57.708211],[40.72005,57.708462],[40.721116,57.70865],[40.7221,57.708796],[40.722902,57.708899],[40.72369,57.708994],[40.725201,57.709161],[40.731128,57.709808],[40.731682,57.709869],[40.731838,57.709886],[40.732212,57.709926],[40.735097,57.710241],[40.738819,57.710644],[40.73973,57.710742],[40.743559,57.711168],[40.747405,57.711595],[40.751229,57.712011],[40.752773,57.71217],[40.753169,57.712214],[40.755044,57.712425],[40.758377,57.712804],[40.759655,57.712968],[40.760621,57.713123],[40.760737,57.713145],[40.761703,57.713331],[40.762516,57.713527],[40.763091,57.71368],[40.763975,57.713951],[40.764549,57.714148],[40.766058,57.71472],[40.766178,57.714767],[40.767126,57.715136],[40.767365,57.715229],[40.768403,57.715633],[40.769848,57.716195],[40.771919,57.716987],[40.784365,57.721775],[40.784458,57.721811],[40.787683,57.72304],[40.790662,57.724206],[40.792218,57.724812],[40.793853,57.725435],[40.795166,57.725908],[40.796062,57.726203],[40.797017,57.726518],[40.797753,57.726746],[40.798939,57.727097],[40.799087,57.727141],[40.800073,57.727414],[40.80274,57.728096],[40.805362,57.728788],[40.809128,57.729747],[40.813985,57.731005],[40.815275,57.73133],[40.816102,57.731543],[40.819985,57.732548],[40.820314,57.732633],[40.830147,57.735175],[40.830468,57.735258],[40.832196,57.735706],[40.833529,57.736059],[40.834167,57.736221],[40.837732,57.737137],[40.840896,57.73795],[40.841489,57.738102],[40.848796,57.739999],[40.848952,57.740039],[40.849163,57.740094],[40.852452,57.74092],[40.852913,57.740996],[40.853606,57.741082],[40.854138,57.741138],[40.854629,57.741174],[40.855082,57.741193],[40.855716,57.741194],[40.856247,57.741171],[40.856878,57.741117],[40.857501,57.741055],[40.8581,57.740974],[40.858697,57.74087],[40.859372,57.74071],[40.85997,57.740556],[40.860722,57.740337],[40.861485,57.740109],[40.86215,57.739889],[40.862748,57.739681],[40.863371,57.739421],[40.863934,57.739152],[40.864326,57.73893],[40.864674,57.7387],[40.865013,57.738457],[40.865332,57.738193],[40.865616,57.73793],[40.865693,57.737854],[40.865801,57.737747],[40.865895,57.737654],[40.866251,57.737275],[40.866315,57.737207],[40.86635,57.737158],[40.866633,57.736756],[40.86679,57.736476],[40.866935,57.73619],[40.86719,57.735616],[40.868039,57.733728],[40.868177,57.733472],[40.868346,57.733218],[40.868547,57.732937],[40.868793,57.732673],[40.86903,57.732438],[40.869529,57.732023],[40.869811,57.731798],[40.870036,57.731636],[40.870255,57.731473],[40.870873,57.731053],[40.871493,57.730705],[40.871866,57.730516],[40.872256,57.730337],[40.873066,57.730003],[40.874005,57.729663],[40.875065,57.729328],[40.875309,57.729251],[40.876294,57.728919],[40.877426,57.728524],[40.879754,57.727722],[40.88087,57.727343],[40.881279,57.727217],[40.881829,57.727072],[40.882584,57.726902],[40.883476,57.726753],[40.884103,57.726679],[40.884751,57.726625],[40.885421,57.726598],[40.886095,57.726585],[40.887613,57.726566],[40.891252,57.726553],[40.892232,57.726522],[40.893465,57.726555],[40.894211,57.726596],[40.894866,57.726662],[40.895329,57.726734],[40.896179,57.726932],[40.896734,57.727101],[40.897082,57.727235],[40.897417,57.727378],[40.897957,57.727642],[40.897983,57.727656],[40.898296,57.727819],[40.89847,57.72793],[40.89917,57.728389],[40.89971,57.7288],[40.901031,57.729689],[40.90147,57.729992],[40.903305,57.731223],[40.904595,57.732106],[40.904682,57.732166],[40.904896,57.732309],[40.904995,57.732376],[40.907294,57.733922],[40.908608,57.734821],[40.909022,57.735084],[40.909225,57.735213],[40.909268,57.735242],[40.910068,57.735777],[40.910271,57.735919],[40.910531,57.736102],[40.910651,57.736184],[40.910769,57.736264],[40.91112,57.736499],[40.911397,57.736685],[40.912626,57.7375],[40.912822,57.73763],[40.914215,57.738553],[40.91466,57.738754],[40.914971,57.738896],[40.91558,57.739135],[40.915903,57.739266],[40.91635,57.739427],[40.916752,57.739612],[40.917046,57.739762],[40.917312,57.739925],[40.91777,57.74031],[40.917942,57.740449],[40.91813,57.740605],[40.918436,57.740869],[40.918592,57.741003],[40.918855,57.741182],[40.919158,57.74136],[40.919683,57.741713],[40.920736,57.742245],[40.921102,57.742429],[40.921223,57.742487],[40.921352,57.742548],[40.922196,57.74295],[40.922815,57.743227],[40.923521,57.743535],[40.924085,57.743789],[40.924611,57.744019],[40.925625,57.744488],[40.926418,57.744854],[40.927051,57.74514],[40.927992,57.745575],[40.928673,57.745927],[40.928915,57.746073],[40.929383,57.746359],[40.929498,57.746429],[40.92978,57.746608],[40.932221,57.748268],[40.932338,57.748343],[40.937973,57.752082],[40.94359,57.755852],[40.944327,57.75633],[40.945356,57.757023],[40.945618,57.757197],[40.946203,57.757584],[40.948407,57.759067],[40.950047,57.76016],[40.950474,57.760493],[40.950649,57.760667],[40.950836,57.760949],[40.951022,57.761205],[40.951155,57.761376],[40.951279,57.76153],[40.951497,57.761845],[40.951578,57.761971],[40.951628,57.762078],[40.951644,57.762188],[40.951636,57.762356],[40.951587,57.762763],[40.951501,57.763465],[40.951492,57.763539],[40.951477,57.763652],[40.951375,57.764407],[40.951307,57.764906],[40.951288,57.765045],[40.95121,57.765603],[40.9512,57.765753],[40.951194,57.765828],[40.951161,57.766028],[40.951091,57.766797],[40.951084,57.766882],[40.951075,57.76696],[40.950901,57.768483],[40.950765,57.769649],[40.950728,57.769963],[40.9507,57.770173],[40.950683,57.770424],[40.950518,57.771269],[40.950482,57.771557],[40.950477,57.7716],[40.95023,57.771834],[40.948861,57.772679],[40.946987,57.773798],[40.94741,57.774],[40.947514,57.774047],[40.948024,57.774277],[40.948675,57.774578],[40.950348,57.775359],[40.951967,57.776085],[40.952097,57.776143],[40.952191,57.776187],[40.95549,57.777698],[40.955615,57.777755],[40.955858,57.777866],[40.958404,57.779031],[40.958878,57.779248],[40.959816,57.779465],[40.961393,57.779588],[40.962531,57.779621],[40.962993,57.779634],[40.963739,57.779636],[40.963857,57.779635],[40.96414,57.779633],[40.964572,57.779629],[40.96502,57.779626],[40.965055,57.779625],[40.96552,57.779622],[40.966061,57.779617],[40.966771,57.779612],[40.967006,57.77961],[40.967458,57.779606],[40.96794,57.779602],[40.968526,57.779598],[40.968974,57.779596],[40.969018,57.779597],[40.969556,57.779613],[40.969672,57.779617],[40.970251,57.779622],[40.97053,57.779623],[40.972139,57.779594],[40.973426,57.77961],[40.974306,57.779658],[40.9746,57.77969],[40.975832,57.779832],[40.977002,57.779971],[40.977592,57.780041],[40.978172,57.780103],[40.978505,57.78014],[40.980765,57.780381],[40.982481,57.78055],[40.982552,57.780557],[40.984061,57.78067],[40.984481,57.780702],[40.984846,57.780734],[40.985622,57.780786],[40.989106,57.781086],[40.989966,57.781162],[40.990933,57.781252],[40.992891,57.781439],[40.994783,57.78162],[40.995346,57.78167],[40.997905,57.781868],[40.998722,57.781952],[40.999984,57.782081],[41.005022,57.782736],[41.008028,57.783104],[41.00863,57.783178],[41.009088,57.783232],[41.009335,57.783261],[41.010089,57.783351],[41.011139,57.783414],[41.015768,57.783562],[41.018162,57.783592],[41.019853,57.783642],[41.021141,57.783688],[41.022278,57.783728],[41.022484,57.783733],[41.023242,57.783765],[41.023735,57.783792],[41.024103,57.783824],[41.025096,57.783936],[41.026054,57.784065],[41.029653,57.784493],[41.033219,57.784906],[41.034165,57.785017],[41.034297,57.785032],[41.034564,57.785069],[41.034947,57.785097],[41.034991,57.785098],[41.035344,57.785105],[41.037533,57.785153],[41.038322,57.78517],[41.039183,57.785189],[41.041365,57.785198],[41.043672,57.785234],[41.047531,57.785304],[41.048594,57.785321],[41.050789,57.785346],[41.052726,57.785358],[41.055227,57.785386],[41.057792,57.785468],[41.058658,57.78551],[41.05911,57.785539],[41.05988,57.7856],[41.062814,57.785832],[41.065428,57.786039],[41.066199,57.786103],[41.07065,57.786451],[41.071992,57.786555],[41.075594,57.786816],[41.077041,57.786865],[41.078168,57.786869],[41.078572,57.78687],[41.079528,57.786876],[41.080559,57.786881],[41.081124,57.786872],[41.08291,57.786829],[41.084594,57.786752],[41.08509,57.786731],[41.087057,57.786616],[41.095151,57.786139],[41.098819,57.785916],[41.100279,57.785827],[41.102089,57.785676],[41.104832,57.785315],[41.10863,57.784734],[41.111709,57.784265],[41.112454,57.784162],[41.113345,57.784073],[41.114246,57.784013],[41.115078,57.784005],[41.115845,57.784028],[41.116741,57.784088],[41.118033,57.784265],[41.118844,57.784417],[41.119873,57.784683],[41.124816,57.786315],[41.125199,57.786442],[41.129603,57.787904],[41.132022,57.788706],[41.134468,57.789472],[41.135965,57.789802],[41.137355,57.790034],[41.139023,57.790225],[41.140589,57.790347],[41.146962,57.790569],[41.153553,57.790791],[41.15426,57.790826],[41.154966,57.790901],[41.155594,57.791007],[41.156213,57.791126],[41.157443,57.791401],[41.159354,57.791833],[41.16235,57.792485],[41.165433,57.793169],[41.168473,57.793874],[41.17009,57.794223],[41.174625,57.795218],[41.177682,57.795916],[41.17846,57.796078],[41.179234,57.79624],[41.180772,57.796578],[41.182058,57.796835],[41.183356,57.797074],[41.18503,57.797369],[41.186086,57.797553],[41.186526,57.79763],[41.191167,57.798441],[41.192518,57.798659],[41.193109,57.798724],[41.193784,57.798776],[41.194428,57.798799],[41.195147,57.798796],[41.195898,57.798779],[41.196542,57.79873],[41.196837,57.798699],[41.197679,57.798581],[41.199372,57.798277],[41.19966,57.798216],[41.201215,57.797887],[41.201845,57.797781],[41.202532,57.797725],[41.203364,57.797715],[41.204729,57.797729],[41.207147,57.797765],[41.207395,57.797769],[41.207727,57.797772],[41.223262,57.797922],[41.225177,57.797949],[41.227377,57.797981],[41.232937,57.798061],[41.234351,57.798083],[41.235992,57.798114],[41.238715,57.798153],[41.241099,57.798177],[41.243722,57.798204],[41.248062,57.798254],[41.25347,57.798316],[41.256217,57.798342],[41.259207,57.798375],[41.261334,57.798473],[41.263063,57.798627],[41.264352,57.798843],[41.265536,57.799086],[41.265808,57.799142],[41.267355,57.799548],[41.269729,57.800195],[41.270513,57.800417],[41.271913,57.800813],[41.274121,57.801423],[41.275173,57.801686],[41.276114,57.801861],[41.277086,57.801988],[41.278126,57.802077],[41.279423,57.802177],[41.280364,57.802259],[41.281074,57.802394],[41.283765,57.802988],[41.286406,57.803586],[41.286923,57.803685],[41.287617,57.803818],[41.288638,57.804013],[41.28998,57.804219],[41.294297,57.804788],[41.300089,57.805517],[41.300521,57.805578],[41.302687,57.80588],[41.310358,57.806852],[41.310796,57.806909],[41.320557,57.808189],[41.322672,57.808469],[41.324338,57.808772],[41.325925,57.809145],[41.327055,57.809483],[41.327922,57.809801],[41.328338,57.809961],[41.329508,57.810473],[41.331209,57.811402],[41.331923,57.811787],[41.334813,57.813448],[41.336418,57.814228],[41.338444,57.814953],[41.34087,57.815723],[41.342276,57.816045],[41.344025,57.816308],[41.345234,57.816404],[41.346741,57.816446],[41.348128,57.816409],[41.350216,57.816274],[41.352975,57.816094],[41.358,57.815719],[41.359725,57.815582],[41.364033,57.815287],[41.369102,57.81495],[41.372333,57.814701],[41.375707,57.81443],[41.378885,57.814208],[41.380634,57.814056],[41.3859,57.813656],[41.388629,57.813394],[41.390395,57.813119],[41.39164,57.812896],[41.392992,57.812565],[41.393242,57.812502],[41.399074,57.811047],[41.40425,57.809737],[41.405265,57.80948],[41.407281,57.808978],[41.409406,57.808424],[41.415575,57.806858],[41.429648,57.803316],[41.43228,57.802747],[41.43382,57.802536],[41.435606,57.802336],[41.43777,57.802201],[41.43899,57.80221],[41.440498,57.802262],[41.44244,57.802422],[41.443396,57.802518],[41.445076,57.802782],[41.446635,57.80305],[41.448338,57.803436],[41.449344,57.803717],[41.450798,57.804171],[41.452455,57.804768],[41.454735,57.805646],[41.457892,57.806924],[41.459587,57.807602],[41.461199,57.808238],[41.464241,57.809556],[41.464789,57.809793],[41.469155,57.811704],[41.472985,57.813366],[41.473081,57.813408],[41.487612,57.819782],[41.495514,57.823255],[41.500176,57.82528],[41.501733,57.825804],[41.503043,57.826162],[41.504804,57.826539],[41.505685,57.826696],[41.506503,57.826842],[41.507675,57.826979],[41.509617,57.827135],[41.511588,57.827203],[41.515368,57.82725],[41.517727,57.827317],[41.519991,57.827356],[41.521398,57.827333],[41.524181,57.827197],[41.525788,57.827131],[41.52703,57.827108],[41.527831,57.82712],[41.529358,57.827173],[41.530967,57.827316],[41.532324,57.827488],[41.53331,57.827668],[41.534479,57.827899],[41.535953,57.828259],[41.536922,57.828539],[41.537805,57.828844],[41.540699,57.829963],[41.549186,57.833242],[41.551918,57.834258],[41.552053,57.83431],[41.554087,57.83514],[41.559597,57.837258],[41.56539,57.839472],[41.581234,57.845583],[41.590983,57.849385],[41.596207,57.85172],[41.60246,57.854551],[41.613705,57.859597],[41.613842,57.859657],[41.614796,57.860093],[41.616511,57.860876],[41.617454,57.861279],[41.618202,57.861569],[41.619781,57.862137],[41.620385,57.862359],[41.621435,57.862745],[41.622526,57.863147],[41.623807,57.863624],[41.624979,57.864038],[41.625674,57.864271],[41.631214,57.866026],[41.634395,57.867024],[41.638207,57.868245],[41.644793,57.870349],[41.646302,57.870803],[41.646606,57.870866],[41.647002,57.870948],[41.647595,57.87104],[41.647657,57.871048],[41.648113,57.871108],[41.649433,57.871255],[41.649951,57.871305],[41.653458,57.871688],[41.656562,57.872029],[41.658107,57.872222],[41.66015,57.872527],[41.66027,57.872547],[41.662827,57.872964],[41.665562,57.873399],[41.667585,57.873742],[41.667817,57.873785],[41.667958,57.873808],[41.672396,57.874532],[41.673089,57.874658],[41.673435,57.874732],[41.673827,57.87481],[41.674367,57.874935],[41.674875,57.875073],[41.67587,57.875391],[41.676994,57.875755],[41.681152,57.877096],[41.682907,57.877671],[41.684373,57.87817],[41.68477,57.878378],[41.685213,57.878698],[41.685418,57.878873],[41.685626,57.879109],[41.685742,57.879388],[41.685868,57.880064],[41.686025,57.880523],[41.686145,57.880885],[41.686281,57.88117],[41.686424,57.881426],[41.686679,57.881735],[41.686951,57.882015],[41.687211,57.882268],[41.6875,57.882497],[41.68782,57.882713],[41.688134,57.882876],[41.688487,57.883038],[41.689739,57.883655],[41.693811,57.885694],[41.698886,57.888206],[41.699417,57.888493],[41.700404,57.889],[41.701584,57.889555],[41.702183,57.889822],[41.702833,57.890112],[41.703355,57.890311],[41.704067,57.890542],[41.705033,57.890849],[41.70608,57.891131],[41.70663,57.891258],[41.707303,57.891375],[41.710702,57.891893],[41.712444,57.892157],[41.713237,57.892267],[41.713889,57.892344],[41.714375,57.89238],[41.714862,57.892378],[41.715258,57.892347],[41.715681,57.892305],[41.716236,57.892206],[41.716579,57.89212],[41.71689,57.892021],[41.717187,57.891901],[41.717525,57.89173],[41.717824,57.89153],[41.718162,57.891254],[41.718377,57.89106],[41.718708,57.890696],[41.718937,57.890419],[41.719082,57.890265],[41.719403,57.889998],[41.719455,57.889961],[41.720261,57.889381],[41.720868,57.888941],[41.722293,57.887761],[41.724297,57.885984],[41.724745,57.885709],[41.72524,57.885437],[41.725717,57.885216],[41.726079,57.884961],[41.726357,57.884715],[41.727052,57.884042],[41.729652,57.881625],[41.731156,57.880228],[41.731439,57.879967],[41.73172,57.879688],[41.731949,57.87942],[41.732039,57.879207],[41.732045,57.879148],[41.73205,57.879101],[41.732024,57.878863],[41.731947,57.878753],[41.731733,57.878587],[41.731461,57.87846],[41.729276,57.877739],[41.728895,57.877594],[41.728675,57.877453],[41.728622,57.877328],[41.728668,57.877164],[41.72886,57.877018],[41.729476,57.876789],[41.731396,57.876076],[41.731668,57.875975],[41.733216,57.875402],[41.734486,57.874932],[41.736731,57.874069],[41.736983,57.873972],[41.737211,57.873884],[41.737483,57.873781],[41.73852,57.873385],[41.740033,57.872858],[41.742338,57.871996],[41.743149,57.87167],[41.747471,57.870066],[41.748354,57.869697],[41.756021,57.866812],[41.76164,57.864733],[41.765211,57.863518],[41.771497,57.861372],[41.781859,57.857784],[41.789958,57.854986],[41.794464,57.853409],[41.794764,57.853308],[41.795697,57.852988],[41.798017,57.852241],[41.80168,57.851199],[41.808742,57.849203],[41.81656,57.84697],[41.818555,57.846418],[41.821073,57.845769],[41.823362,57.845269],[41.831291,57.843538],[41.841261,57.841346],[41.856145,57.838113],[41.858905,57.837522],[41.860099,57.837304],[41.867786,57.836071],[41.871637,57.835344],[41.873604,57.834899],[41.875619,57.834368],[41.877032,57.833965],[41.879486,57.833185],[41.880553,57.832796],[41.881814,57.832259],[41.882997,57.831719],[41.883236,57.831601],[41.884246,57.831105],[41.885129,57.830648],[41.885739,57.830324],[41.886849,57.829736],[41.886954,57.82968],[41.888051,57.829098],[41.890502,57.827788],[41.893824,57.826052],[41.895682,57.825086],[41.897489,57.824127],[41.898706,57.823535],[41.899675,57.823131],[41.90067,57.822782],[41.90162,57.822487],[41.903125,57.822124],[41.904326,57.821893],[41.905478,57.821717],[41.907344,57.821508],[41.91189,57.821015],[41.917803,57.820391],[41.924671,57.819674],[41.932843,57.818792],[41.938611,57.818114],[41.941597,57.817759],[41.944401,57.81749],[41.945999,57.817385],[41.94831,57.817221],[41.953764,57.816865],[41.959792,57.816487],[41.961993,57.816351],[41.964126,57.816182],[41.965919,57.815997],[41.974166,57.814925],[41.977157,57.814449],[41.979428,57.814166],[41.981466,57.813977],[41.984092,57.813836],[41.98955,57.813918],[41.99104,57.813934],[41.993855,57.813966],[42.00256,57.814062],[42.03153,57.814423],[42.048932,57.814633],[42.061757,57.814806],[42.072504,57.814951],[42.085776,57.815094],[42.095705,57.815261],[42.097746,57.81538],[42.098135,57.815403],[42.100076,57.815595],[42.103038,57.81602],[42.104273,57.816236],[42.107055,57.816773],[42.113971,57.818192],[42.119114,57.819207],[42.124657,57.820066],[42.131408,57.821134],[42.139991,57.822495],[42.141895,57.822818],[42.143821,57.823145],[42.152335,57.824614],[42.155377,57.825076],[42.157698,57.825291],[42.159515,57.825327],[42.161676,57.825302],[42.163643,57.825225],[42.1703,57.824992],[42.172686,57.824906],[42.174027,57.824822],[42.175585,57.824679],[42.177498,57.824478],[42.17806,57.824418],[42.179,57.824317],[42.17956,57.824258],[42.180052,57.824204],[42.182587,57.823898],[42.186818,57.823434],[42.189265,57.823157],[42.190927,57.822912],[42.192306,57.822624],[42.193367,57.822383],[42.194874,57.821901],[42.195148,57.821801],[42.196267,57.821394],[42.197781,57.820842],[42.199244,57.820304],[42.200963,57.819693],[42.201376,57.819543],[42.202397,57.819212],[42.211243,57.816352],[42.212935,57.815857],[42.216232,57.815237],[42.220576,57.814292],[42.222542,57.813905],[42.223703,57.813722],[42.225312,57.813526],[42.225899,57.813444],[42.227081,57.813279],[42.227865,57.813181],[42.228633,57.813084],[42.229613,57.812955],[42.231602,57.812713],[42.232118,57.812651],[42.2334,57.812527],[42.234298,57.812472],[42.234871,57.812452],[42.235134,57.812451],[42.235512,57.812448],[42.236482,57.812469],[42.237532,57.812522],[42.238561,57.8126],[42.24036,57.812801],[42.243948,57.813223],[42.246929,57.813572],[42.24733,57.813608],[42.248346,57.813693],[42.249535,57.81376],[42.250782,57.813769],[42.2517,57.813733],[42.253067,57.813652],[42.253713,57.813587],[42.254212,57.813536],[42.255228,57.813391],[42.255923,57.813275],[42.256674,57.813126],[42.257109,57.813041],[42.258472,57.812696],[42.258761,57.812623],[42.261333,57.811953],[42.261693,57.81186],[42.263411,57.811434],[42.264821,57.811059],[42.266476,57.810627],[42.268837,57.809993],[42.270973,57.809494],[42.272263,57.809272],[42.273266,57.809141],[42.274374,57.809043],[42.275629,57.808973],[42.278188,57.808877],[42.283236,57.808721],[42.286165,57.80862],[42.287367,57.808531],[42.28927,57.80837],[42.294861,57.807831],[42.300537,57.807268],[42.311467,57.80618],[42.313065,57.806019],[42.315224,57.805825],[42.320701,57.805276],[42.32788,57.804557],[42.335288,57.803854],[42.337481,57.803741],[42.338796,57.803687],[42.340027,57.803663],[42.341483,57.803684],[42.343299,57.80374],[42.344857,57.803841],[42.34857,57.804133],[42.353372,57.804521],[42.353641,57.804543],[42.355254,57.804641],[42.357024,57.804685],[42.359872,57.804699],[42.361425,57.804687],[42.36216,57.804685],[42.362792,57.804677],[42.366017,57.804696],[42.366663,57.8047],[42.368531,57.804697],[42.371814,57.804664],[42.376914,57.804675],[42.378777,57.804727],[42.380106,57.804792],[42.381796,57.80492],[42.383648,57.805124],[42.386907,57.805559],[42.387982,57.805681],[42.389267,57.805737],[42.394055,57.805791],[42.396505,57.80605],[42.401988,57.806925],[42.414501,57.808543],[42.416025,57.808839],[42.424101,57.811967],[42.426341,57.812687],[42.430669,57.81368],[42.437976,57.814933],[42.444868,57.816031],[42.447482,57.816459],[42.450565,57.816945],[42.453994,57.817446],[42.457124,57.81784],[42.457543,57.817888],[42.462982,57.818568],[42.464242,57.818729],[42.468719,57.819274],[42.47062,57.819426],[42.472416,57.81951],[42.473834,57.819508],[42.475044,57.81947],[42.476587,57.819391],[42.478152,57.819255],[42.481187,57.818955],[42.483731,57.818688],[42.488966,57.818128],[42.494497,57.817512],[42.496994,57.817235],[42.50304,57.816554],[42.5066,57.816184],[42.508956,57.815838],[42.514353,57.814914],[42.518236,57.814256],[42.523295,57.813422],[42.538174,57.810993],[42.538828,57.810884],[42.549609,57.809098],[42.551,57.808868],[42.55352,57.80845],[42.555159,57.808206],[42.564195,57.807392],[42.572364,57.806691],[42.580724,57.805999],[42.585459,57.805628],[42.588785,57.805323],[42.590071,57.805137],[42.599549,57.803533],[42.605555,57.802531],[42.606994,57.802298],[42.608612,57.802167],[42.60931,57.802134],[42.610149,57.802093],[42.614213,57.801998],[42.648211,57.80136],[42.660012,57.801126],[42.662943,57.801101],[42.664753,57.801122],[42.665771,57.801144],[42.666505,57.801179],[42.669755,57.801335],[42.680466,57.801851],[42.687996,57.802248],[42.695998,57.802613],[42.700595,57.802819],[42.703121,57.802934],[42.709867,57.803255],[42.71262,57.803387],[42.717406,57.803605],[42.720214,57.803733],[42.720665,57.803753],[42.722717,57.803857],[42.736964,57.804559],[42.743074,57.804869],[42.751342,57.805254],[42.754344,57.805371],[42.756016,57.805396],[42.75788,57.805352],[42.760742,57.805182],[42.767522,57.804733],[42.777384,57.804007],[42.786411,57.803351],[42.797347,57.802537],[42.801548,57.80218],[42.805712,57.801699],[42.812503,57.800836],[42.819961,57.79984],[42.825303,57.799121],[42.835893,57.797732],[42.839358,57.797274],[42.842211,57.796892],[42.84351,57.79677],[42.845044,57.796719],[42.847518,57.796697],[42.849271,57.796725],[42.850851,57.796773],[42.852505,57.796895],[42.864915,57.797726],[42.867498,57.797903],[42.870134,57.798079],[42.871626,57.798133],[42.87303,57.798149],[42.874366,57.79816],[42.875992,57.798118],[42.877788,57.798057],[42.883495,57.79782],[42.90237,57.796967],[42.916065,57.796374],[42.92732,57.795873],[42.948775,57.794885],[42.959495,57.794384],[42.975072,57.79368],[42.991668,57.792946],[42.997877,57.792687],[43.000451,57.79258],[43.009112,57.792184],[43.010046,57.792127],[43.010726,57.792051],[43.012164,57.791853],[43.018908,57.79064],[43.022324,57.790032],[43.025674,57.789455],[43.031822,57.788385],[43.035205,57.787804],[43.037004,57.787493],[43.039129,57.787122],[43.041351,57.786745],[43.044445,57.786209],[43.047398,57.785693],[43.050332,57.785192],[43.053915,57.784567],[43.055273,57.784284],[43.05649,57.783993],[43.057626,57.783708],[43.059355,57.783266],[43.062275,57.782508],[43.063736,57.782151],[43.065727,57.781808],[43.070994,57.780956],[43.075708,57.780221],[43.077321,57.779929],[43.079214,57.779491],[43.082908,57.77866],[43.086182,57.777939],[43.087616,57.777646],[43.089192,57.777393],[43.08965,57.777319],[43.091127,57.777133],[43.092945,57.776986],[43.098672,57.776635],[43.102789,57.776383],[43.116231,57.775534],[43.117642,57.775466],[43.118545,57.775478],[43.119337,57.775562],[43.120302,57.775726],[43.124196,57.776532],[43.131754,57.778051],[43.139239,57.779572],[43.140843,57.780012],[43.142618,57.780607],[43.144013,57.781182],[43.145747,57.781928],[43.146402,57.78223],[43.150799,57.784211],[43.152242,57.784783],[43.153477,57.785206],[43.154353,57.785476],[43.155832,57.785875],[43.157775,57.786349],[43.165693,57.788282],[43.166361,57.788445],[43.175991,57.790786],[43.177001,57.791034],[43.177899,57.791255],[43.178136,57.791314],[43.178373,57.791372],[43.178599,57.791428],[43.180387,57.791868],[43.180584,57.791916],[43.181412,57.79212],[43.18197,57.792258],[43.182861,57.792482],[43.183866,57.792723],[43.184065,57.792771],[43.184897,57.792979],[43.188938,57.793956],[43.193651,57.795159],[43.195511,57.795759],[43.197236,57.796401],[43.200403,57.797693],[43.201275,57.798051],[43.202704,57.798629],[43.203293,57.798947],[43.203761,57.799193],[43.205472,57.800091],[43.206914,57.800904],[43.22066,57.808713],[43.225908,57.811681],[43.232928,57.815609],[43.238317,57.81871],[43.239942,57.819557],[43.241898,57.82044],[43.243091,57.820911],[43.244731,57.821495],[43.246097,57.821923],[43.251546,57.823512],[43.25881,57.825764],[43.260827,57.826383],[43.262204,57.826854],[43.263085,57.827191],[43.265602,57.828238],[43.266714,57.828626],[43.268028,57.828995],[43.269274,57.829299],[43.270379,57.829494],[43.271037,57.8296],[43.271857,57.829687],[43.272602,57.829747],[43.273408,57.829773],[43.274644,57.829767],[43.27594,57.829707],[43.2772,57.829566],[43.277869,57.829487],[43.280129,57.829124],[43.283774,57.828555],[43.284544,57.828435],[43.285943,57.828229],[43.287385,57.82804],[43.288656,57.827918],[43.293105,57.827645],[43.296963,57.82742],[43.297437,57.827396],[43.299066,57.82729],[43.302477,57.827116],[43.304183,57.827059],[43.305665,57.827067],[43.307795,57.827142],[43.309275,57.827231],[43.310709,57.827358],[43.313402,57.827667],[43.318713,57.828244],[43.319379,57.828308],[43.325248,57.828961],[43.330104,57.829499],[43.333947,57.829931],[43.338042,57.830376],[43.341291,57.830722],[43.344165,57.831071],[43.34996,57.831691],[43.355627,57.832317],[43.359684,57.832779],[43.362681,57.833095],[43.369778,57.833898],[43.377659,57.834749],[43.386808,57.835724],[43.400558,57.837226],[43.404944,57.837708],[43.408532,57.838102],[43.416307,57.838967],[43.420189,57.839365],[43.432099,57.840674],[43.444114,57.842],[43.446164,57.842256],[43.447193,57.842418],[43.449065,57.842824],[43.454852,57.844194],[43.460695,57.845564],[43.471774,57.848172],[43.484442,57.851138],[43.488855,57.852137],[43.490723,57.852554],[43.491739,57.852756],[43.492576,57.852809],[43.493444,57.852823],[43.494892,57.852778],[43.495717,57.852743],[43.508711,57.8522],[43.522487,57.851538],[43.549377,57.85033],[43.565316,57.849631],[43.57715,57.849129],[43.587675,57.848656],[43.587954,57.848643],[43.606326,57.847815],[43.608337,57.847727],[43.612214,57.847558],[43.614557,57.847453],[43.615018,57.847432],[43.622319,57.847108],[43.634386,57.846605],[43.635143,57.846578],[43.635502,57.846565],[43.636455,57.846533],[43.638359,57.846524],[43.638883,57.84653],[43.640791,57.846582],[43.641065,57.846595],[43.654142,57.847562],[43.656263,57.847707],[43.659615,57.84792],[43.6609,57.847978],[43.665367,57.848063],[43.675586,57.848245],[43.681834,57.848357],[43.68508,57.848411],[43.68918,57.848469],[43.693747,57.848548],[43.70225,57.84868],[43.703958,57.848726],[43.706213,57.848786],[43.70823,57.848928],[43.709291,57.849043],[43.710061,57.849125],[43.710769,57.849201],[43.713098,57.849576],[43.715021,57.849943],[43.716821,57.850375],[43.719124,57.850998],[43.721127,57.851647],[43.726187,57.853534],[43.727087,57.853871],[43.734209,57.856486],[43.741587,57.859191],[43.749197,57.86201],[43.75226,57.863115],[43.753955,57.863729],[43.764273,57.867546],[43.768961,57.869275],[43.770079,57.86973],[43.77133,57.87024],[43.772684,57.87088],[43.773084,57.871097],[43.773822,57.871497],[43.775116,57.872285],[43.776504,57.873203],[43.780037,57.876214],[43.780501,57.876609],[43.784624,57.880197],[43.785932,57.881389],[43.78795,57.883057],[43.789585,57.884464],[43.791655,57.886245],[43.792101,57.886621],[43.792362,57.886841],[43.793661,57.887881],[43.794829,57.888682],[43.795943,57.889403],[43.798038,57.89058],[43.799727,57.891528],[43.800655,57.892086],[43.801607,57.892628],[43.802087,57.892902],[43.803822,57.893893],[43.804019,57.894004],[43.804924,57.894515],[43.806399,57.895358],[43.807666,57.896096],[43.808388,57.896516],[43.808869,57.896775],[43.810185,57.897531],[43.811983,57.898565],[43.813057,57.899182],[43.814014,57.899732],[43.814901,57.900249],[43.816378,57.901075],[43.81793,57.901971],[43.819487,57.902872],[43.820793,57.90362],[43.821335,57.90393],[43.823966,57.905436],[43.826106,57.9067],[43.83113,57.909547],[43.832878,57.910491],[43.834733,57.911331],[43.836244,57.911926],[43.836836,57.912138],[43.843977,57.91482],[43.853979,57.91856],[43.868594,57.924073],[43.871199,57.925047],[43.892904,57.933123],[43.903183,57.936959],[43.906051,57.938043],[43.910121,57.939581],[43.912366,57.940471],[43.913444,57.940968],[43.914891,57.941677],[43.916541,57.942646],[43.917865,57.943497],[43.918997,57.944343],[43.9254,57.94961],[43.929687,57.953145],[43.933064,57.955901],[43.934013,57.956745],[43.934928,57.957632],[43.935748,57.958448],[43.945049,57.967971],[43.95462,57.977722],[43.955194,57.978308],[43.955209,57.978323],[43.961959,57.985183],[43.965568,57.988845],[43.971939,57.995337],[43.975829,57.999296],[43.979149,58.002686],[43.984516,58.008148],[43.98583,58.009441],[43.986801,58.010467],[43.993449,58.017277],[43.993874,58.017708],[43.994327,58.018139],[43.994785,58.018523],[43.995153,58.018805],[43.995425,58.019013],[43.995996,58.019444],[43.996541,58.019841],[43.997594,58.020542],[43.999048,58.021396],[44.000817,58.02236],[44.005963,58.025055],[44.006714,58.025465],[44.007182,58.02572],[44.009461,58.026941],[44.028081,58.036755],[44.038557,58.042283],[44.046094,58.046285],[44.048572,58.047511],[44.051075,58.04853],[44.0621,58.052341],[44.072987,58.056103],[44.07507,58.056817],[44.083361,58.059699],[44.083804,58.05985],[44.087782,58.061228],[44.088529,58.061486],[44.088574,58.061502],[44.089357,58.061773],[44.093398,58.063173],[44.094861,58.063679],[44.10655,58.06772],[44.10861,58.068432],[44.109754,58.068828],[44.119102,58.072052],[44.125324,58.074197],[44.126669,58.074662],[44.127744,58.075034],[44.129226,58.075546],[44.134077,58.077223],[44.136834,58.078175],[44.143285,58.080411],[44.143549,58.080503],[44.148457,58.082207],[44.148784,58.082316],[44.150482,58.082881],[44.152419,58.083428],[44.154409,58.083904],[44.154731,58.08398],[44.154839,58.084006],[44.157578,58.084523],[44.160111,58.0849],[44.176708,58.087375],[44.189408,58.089268],[44.206765,58.091856],[44.213851,58.092912],[44.223421,58.094339],[44.223743,58.094387],[44.237352,58.096416],[44.243903,58.097391],[44.244269,58.097447],[44.252797,58.098718],[44.253288,58.098791],[44.255899,58.09918],[44.257707,58.099464],[44.259671,58.099852],[44.26106,58.100166],[44.261658,58.100302],[44.26388,58.100918],[44.265667,58.101509],[44.267829,58.102339],[44.269733,58.103228],[44.270861,58.103794],[44.271426,58.104111],[44.272068,58.104471],[44.273611,58.105473],[44.290546,58.116872],[44.292128,58.117849],[44.292452,58.11805],[44.292552,58.118111],[44.294032,58.118946],[44.295546,58.119689],[44.296492,58.120089],[44.29802,58.120697],[44.299446,58.121215],[44.309101,58.124481],[44.312335,58.125578],[44.312419,58.125607],[44.313472,58.125964],[44.317157,58.127214],[44.326796,58.130484],[44.327142,58.130601],[44.331191,58.131965],[44.331381,58.13203],[44.338549,58.134446],[44.342782,58.135877],[44.343753,58.136214],[44.344378,58.136431],[44.349337,58.138112],[44.351274,58.138759],[44.3518,58.138934],[44.352307,58.139102],[44.353682,58.13955],[44.355203,58.140064],[44.355883,58.140352],[44.356534,58.140677],[44.361257,58.143455],[44.363442,58.144718],[44.363917,58.144993],[44.36431,58.145221],[44.367274,58.146951],[44.370225,58.148702],[44.373411,58.150537],[44.375825,58.151926],[44.378009,58.153219],[44.378911,58.153718],[44.379548,58.154043],[44.380804,58.154636],[44.382896,58.155558],[44.386262,58.157069],[44.389568,58.158546],[44.392369,58.159799],[44.396422,58.161616],[44.398408,58.162507],[44.400141,58.163297],[44.401937,58.164133],[44.403047,58.164613],[44.404255,58.1651],[44.405383,58.165501],[44.406529,58.165839],[44.409877,58.166751],[44.414519,58.167919],[44.418043,58.168851],[44.423818,58.170358],[44.43464,58.173151],[44.436301,58.173522],[44.438696,58.173972],[44.442262,58.174665],[44.445553,58.175276],[44.453025,58.176679],[44.460167,58.178038],[44.460865,58.17817],[44.465931,58.179124],[44.471206,58.180118],[44.474071,58.18066],[44.476247,58.181066],[44.479664,58.181675],[44.484021,58.182544],[44.491098,58.183863],[44.497372,58.185059],[44.49845,58.185276],[44.500759,58.185716],[44.507747,58.187017],[44.512647,58.187958],[44.514675,58.188332],[44.51599,58.18857],[44.523036,58.189701],[44.529885,58.190747],[44.534257,58.191462],[44.534518,58.191501],[44.536752,58.191851],[44.537878,58.192027],[44.542326,58.192689],[44.545022,58.193127],[44.547805,58.193572],[44.552304,58.194282],[44.555615,58.194805],[44.558454,58.195255],[44.559183,58.195371],[44.560168,58.195527],[44.564176,58.196161],[44.568572,58.196818],[44.573109,58.197546],[44.576733,58.198103],[44.578733,58.19841],[44.581125,58.198789],[44.582783,58.199094],[44.583991,58.199346],[44.585416,58.199674],[44.586683,58.200012],[44.588019,58.200383],[44.589957,58.201043],[44.592053,58.201861],[44.593636,58.202552],[44.59513,58.20333],[44.59571,58.203632],[44.597264,58.204606],[44.598486,58.205464],[44.601748,58.207889],[44.602943,58.208798],[44.603133,58.208947],[44.604984,58.210396],[44.609673,58.213873],[44.610077,58.214173],[44.621826,58.222948],[44.628682,58.228035],[44.635411,58.233059],[44.635925,58.233437],[44.636072,58.233546],[44.638528,58.235415],[44.641651,58.237696],[44.642841,58.238601],[44.643381,58.23899],[44.643924,58.239317],[44.64472,58.239728],[44.646051,58.240425],[44.648676,58.241821],[44.648703,58.241835],[44.651367,58.243208],[44.652038,58.243579],[44.653406,58.244327],[44.653503,58.244378],[44.659572,58.247562],[44.660253,58.247928],[44.662548,58.249136],[44.664079,58.249951],[44.666218,58.251056],[44.669149,58.252612],[44.671757,58.253994],[44.673745,58.255043],[44.675118,58.255713],[44.676459,58.256448],[44.678094,58.257323],[44.680936,58.258866],[44.684108,58.260514],[44.685605,58.26127],[44.686447,58.261683],[44.687204,58.262011],[44.687251,58.262031],[44.690667,58.263422],[44.695216,58.265245],[44.698537,58.266608],[44.700907,58.267583],[44.702078,58.26812],[44.703154,58.268685],[44.704179,58.269256],[44.705614,58.270086],[44.706617,58.270773],[44.706911,58.270991],[44.707532,58.271451],[44.708354,58.272175],[44.709564,58.273354],[44.711321,58.275264],[44.71363,58.277856],[44.716356,58.28083],[44.717554,58.282146],[44.720189,58.28508],[44.723598,58.288812],[44.723843,58.289088],[44.724685,58.290005],[44.728121,58.293828],[44.731517,58.297534],[44.732562,58.298662],[44.732987,58.299119],[44.733037,58.299279],[44.733037,58.299372],[44.732967,58.299501],[44.732852,58.299609],[44.732681,58.299724],[44.732475,58.299809],[44.731886,58.300005],[44.731578,58.300131],[44.731326,58.300243],[44.731092,58.300391],[44.730962,58.300489],[44.729189,58.302546],[44.727507,58.304464],[44.726893,58.30522],[44.725621,58.306663],[44.72438,58.308076],[44.722439,58.31025],[44.72225,58.310515],[44.721636,58.311328],[44.721038,58.312279],[44.720658,58.312953],[44.720379,58.313418],[44.720351,58.313472],[44.719784,58.314594],[44.719274,58.315694],[44.71898,58.316638],[44.718614,58.318785],[44.717981,58.322141],[44.717753,58.323353],[44.717706,58.323604],[44.71749,58.324774],[44.717294,58.325669],[44.716613,58.329218],[44.716524,58.3298],[44.715836,58.333471],[44.715765,58.334437],[44.71584,58.335845],[44.715908,58.336288],[44.715947,58.336502],[44.716106,58.337236],[44.716342,58.337993],[44.716574,58.338689],[44.716966,58.33944],[44.717401,58.340156],[44.718099,58.341149],[44.718747,58.341969],[44.719385,58.342735],[44.7201,58.34346],[44.720723,58.343998],[44.721626,58.344703],[44.722644,58.345413],[44.724555,58.346673],[44.72862,58.349141],[44.729508,58.349651],[44.730701,58.350402],[44.733869,58.352294],[44.739313,58.355635],[44.739322,58.355641],[44.741873,58.35713],[44.742523,58.357553],[44.747274,58.360423],[44.750074,58.362039],[44.75157,58.36292],[44.752879,58.363607],[44.754199,58.364206],[44.755437,58.364769],[44.757489,58.365629],[44.758709,58.366119],[44.760444,58.366725],[44.762514,58.367417],[44.76465,58.368031],[44.767532,58.368795],[44.770295,58.369511],[44.774506,58.370563],[44.775234,58.37075],[44.77779,58.37146],[44.778952,58.371823],[44.781354,58.372607],[44.783549,58.373377],[44.785023,58.373922],[44.786252,58.374401],[44.787638,58.375024],[44.789306,58.375829],[44.790965,58.376643],[44.792537,58.377595],[44.794264,58.378659],[44.794903,58.379083],[44.79502,58.379153],[44.796784,58.380512],[44.7976,58.381177],[44.798828,58.382232],[44.800351,58.383817],[44.801464,58.385087],[44.802158,58.386085],[44.8024,58.386074],[44.805987,58.385537],[44.814256,58.384331],[44.815602,58.384116],[44.816781,58.383841],[44.817648,58.383524],[44.823054,58.38127],[44.825052,58.380438],[44.826994,58.379651],[44.82802,58.379352],[44.829174,58.379181],[44.829868,58.379106],[44.831979,58.379066],[44.834221,58.379056],[44.835312,58.37905],[44.836021,58.379032],[44.837169,58.378927],[44.838102,58.378786],[44.838935,58.37866],[44.839642,58.378561],[44.84044,58.378465],[44.84122,58.378408],[44.841636,58.378387],[44.842427,58.378346],[44.84575,58.378267],[44.847431,58.378217],[44.849176,58.378108],[44.852941,58.37768],[44.85568,58.377388],[44.857113,58.377241],[44.859236,58.377032],[44.860427,58.376966],[44.861674,58.37694],[44.863667,58.37694],[44.868553,58.376938],[44.869813,58.376941],[44.877828,58.376954],[44.887034,58.376973],[44.889126,58.37697],[44.890365,58.377036],[44.895525,58.377489],[44.898212,58.377742],[44.899432,58.377911],[44.900502,58.37812],[44.901525,58.378405],[44.902309,58.378708],[44.906155,58.380176],[44.907739,58.380791],[44.910957,58.382041],[44.911803,58.382324],[44.912608,58.382531],[44.913631,58.382733],[44.914362,58.382842],[44.915172,58.382932],[44.916001,58.382982],[44.917047,58.382999],[44.920713,58.382979],[44.922248,58.383013],[44.923452,58.383079],[44.925347,58.383251],[44.930333,58.383665],[44.934366,58.384013],[44.939266,58.384445],[44.942529,58.384737],[44.944032,58.384826],[44.945107,58.384818],[44.946106,58.384741],[44.947424,58.384579],[44.948389,58.384387],[44.949441,58.384125],[44.950365,58.383819],[44.951208,58.383478],[44.951939,58.383105],[44.952599,58.382697],[44.953254,58.382238],[44.958878,58.378236],[44.962988,58.375306],[44.964664,58.374048],[44.966025,58.372984],[44.967387,58.371873],[44.969537,58.369996],[44.970801,58.368867],[44.971837,58.36799],[44.97313,58.366788],[44.973427,58.366542],[44.974289,58.365843],[44.975156,58.365095],[44.975517,58.364833],[44.975874,58.364571],[44.97648,58.364256],[44.976931,58.364015],[44.977568,58.36374],[44.978089,58.363517],[44.978574,58.36333],[44.979159,58.36314],[44.979734,58.362977],[44.980479,58.362794],[44.98113,58.362643],[44.981872,58.362494],[44.982516,58.362386],[44.983093,58.362323],[44.984067,58.362235],[44.987195,58.362084],[44.990961,58.36189],[44.991023,58.361887],[45.003363,58.361307],[45.007701,58.361092],[45.009779,58.360977],[45.01089,58.360926],[45.013825,58.360796],[45.019044,58.360539],[45.022402,58.360336],[45.024547,58.360185],[45.062962,58.356737],[45.06527,58.356556],[45.066469,58.356516],[45.067663,58.35653],[45.068701,58.356557],[45.069668,58.35664],[45.070689,58.356732],[45.071945,58.356909],[45.07287,58.357076],[45.074161,58.357334],[45.075313,58.357644],[45.081694,58.359381],[45.088146,58.361173],[45.090185,58.361698],[45.091224,58.361922],[45.09239,58.362141],[45.0935,58.36229],[45.094692,58.36243],[45.09597,58.362513],[45.097248,58.362545],[45.098582,58.362522],[45.099498,58.362471],[45.100651,58.362377],[45.106728,58.361795],[45.136653,58.358937],[45.155267,58.357178],[45.159612,58.356773],[45.16567,58.3562],[45.167387,58.356033],[45.172975,58.355485],[45.172986,58.355484],[45.176605,58.35519],[45.177428,58.355154],[45.178177,58.355122],[45.179854,58.355086],[45.181622,58.355104],[45.183073,58.355145],[45.184958,58.355236],[45.187579,58.355483],[45.192765,58.35597],[45.194472,58.35613],[45.196938,58.356362],[45.199715,58.356636],[45.201271,58.356789],[45.201574,58.356819],[45.202567,58.356913],[45.207168,58.357347],[45.217412,58.358309],[45.224886,58.359015],[45.227555,58.359267],[45.241041,58.360538],[45.252747,58.361647],[45.261766,58.362494],[45.27679,58.363904],[45.282582,58.364447],[45.285621,58.364737],[45.287145,58.364826],[45.288149,58.364855],[45.289474,58.364844],[45.289505,58.364842],[45.290703,58.36476],[45.292078,58.364614],[45.293235,58.36445],[45.294625,58.364192],[45.295999,58.363892],[45.297122,58.363573],[45.298244,58.363172],[45.299049,58.362848],[45.299955,58.36241],[45.300689,58.362016],[45.301598,58.361468],[45.302789,58.360658],[45.303586,58.360084],[45.307527,58.357285],[45.310717,58.355011],[45.312696,58.353545],[45.314917,58.351979],[45.317929,58.349818],[45.344744,58.330779],[45.346194,58.329748],[45.347528,58.328842],[45.349146,58.327831],[45.351362,58.326641],[45.353446,58.325664],[45.356303,58.324459],[45.360724,58.322678],[45.365027,58.320982],[45.369137,58.319312],[45.370789,58.318595],[45.372022,58.317987],[45.37308,58.317453],[45.37435,58.316793],[45.375431,58.316194],[45.376339,58.31565],[45.377054,58.315206],[45.37776,58.314732],[45.379324,58.313617],[45.382703,58.311137],[45.386247,58.308593],[45.388483,58.306943],[45.388848,58.306671],[45.389168,58.30642],[45.389969,58.305756],[45.391567,58.305978],[45.392633,58.30611],[45.394443,58.306336],[45.397444,58.306721],[45.399641,58.306995],[45.402901,58.307382],[45.405251,58.307668],[45.409591,58.308211],[45.411705,58.308462],[45.412439,58.308541],[45.413179,58.308608],[45.414118,58.308694],[45.414932,58.308753],[45.415878,58.308808],[45.416839,58.308866],[45.417904,58.308909],[45.418934,58.308945],[45.42009,58.308957],[45.421509,58.308959],[45.42277,58.308954],[45.425398,58.308926],[45.428417,58.308889],[45.42872,58.308885],[45.434662,58.308844],[45.437439,58.308829],[45.439936,58.308824],[45.442418,58.308808],[45.444427,58.308811],[45.445705,58.308831],[45.446954,58.308861],[45.448006,58.308901],[45.4489,58.308934],[45.45005,58.308993],[45.451062,58.309083],[45.452265,58.309178],[45.452945,58.309246],[45.453838,58.309349],[45.45464,58.309474],[45.455536,58.309632],[45.456625,58.309848],[45.457869,58.310147],[45.458804,58.310407],[45.459995,58.310781],[45.462443,58.311585],[45.465006,58.312422],[45.468824,58.313638],[45.47719,58.31639],[45.477354,58.316438],[45.478944,58.316957],[45.48125,58.317716],[45.483977,58.318616],[45.485566,58.319099],[45.487866,58.319817],[45.493181,58.321393],[45.498726,58.323053],[45.50437,58.324717],[45.505588,58.325082],[45.506511,58.325358],[45.509444,58.326235],[45.509588,58.326278],[45.510138,58.326442],[45.512665,58.327162],[45.515252,58.327959],[45.518736,58.328997],[45.520188,58.329463],[45.521383,58.329875],[45.523776,58.330756],[45.525912,58.331566],[45.525945,58.331578],[45.530816,58.333429],[45.53539,58.335146],[45.538456,58.336289],[45.541198,58.337319],[45.54358,58.338189],[45.546754,58.339385],[45.549145,58.340302],[45.552021,58.341387],[45.553985,58.342117],[45.556494,58.343056],[45.559854,58.344333],[45.562289,58.345242],[45.564337,58.346003],[45.566373,58.346752],[45.567755,58.347271],[45.569261,58.347839],[45.570267,58.348222],[45.571165,58.348563],[45.571581,58.348734],[45.572016,58.348921],[45.572131,58.348971],[45.572806,58.349275],[45.573322,58.349527],[45.573861,58.349797],[45.574379,58.350081],[45.574825,58.350355],[45.575453,58.350752],[45.576028,58.351165],[45.576396,58.351445],[45.576841,58.351821],[45.577399,58.352337],[45.577865,58.352798],[45.578208,58.353198],[45.578497,58.353562],[45.578872,58.354081],[45.579164,58.354541],[45.579447,58.355067],[45.579577,58.355372],[45.579585,58.35539],[45.579727,58.355761],[45.579893,58.356308],[45.580057,58.356978],[45.580368,58.358512],[45.580482,58.359055],[45.580843,58.360769],[45.581095,58.361851],[45.581342,58.363069],[45.581782,58.365307],[45.58191,58.365937],[45.582715,58.370104],[45.58275,58.370283],[45.582941,58.370802],[45.583179,58.371823],[45.583244,58.372023],[45.583311,58.372179],[45.583399,58.372329],[45.583494,58.372466],[45.583606,58.372604],[45.583722,58.372723],[45.583866,58.372863],[45.584007,58.372976],[45.584202,58.373113],[45.584418,58.373246],[45.584922,58.373532],[45.585495,58.373829],[45.586658,58.37441],[45.587109,58.374616],[45.587414,58.374749],[45.587641,58.374841],[45.58797,58.37496],[45.588309,58.375063],[45.588681,58.375166],[45.589102,58.375259],[45.58955,58.37534],[45.590008,58.375407],[45.590397,58.375455],[45.590764,58.37549],[45.591158,58.375509],[45.593495,58.375575],[45.594611,58.375604],[45.595395,58.375658],[45.597634,58.375702],[45.610733,58.375929],[45.620156,58.376026],[45.625287,58.376119],[45.629198,58.376134],[45.63063,58.376147],[45.631909,58.376169],[45.633691,58.376211],[45.635706,58.376279],[45.63703,58.376313],[45.638594,58.376335],[45.639782,58.376363],[45.641054,58.37644],[45.642133,58.376545],[45.643431,58.376731],[45.645794,58.377103],[45.64596,58.377136],[45.646653,58.377275],[45.647354,58.377391],[45.648366,58.377496],[45.649245,58.37756],[45.649936,58.377594],[45.651636,58.377654],[45.65559,58.377829],[45.659427,58.378007],[45.66239,58.378167],[45.663987,58.378255],[45.666772,58.378346],[45.668227,58.378368],[45.669982,58.378316],[45.676447,58.378081],[45.682014,58.377865],[45.684095,58.377784],[45.698342,58.377221],[45.698886,58.377193],[45.700288,58.377119],[45.712229,58.376681],[45.712276,58.376679],[45.71625,58.376511],[45.717245,58.376516],[45.718371,58.376562],[45.719332,58.376628],[45.720159,58.376711],[45.720995,58.376825],[45.721964,58.376985],[45.7228,58.377181],[45.723868,58.377445],[45.725293,58.377869],[45.730066,58.379296],[45.736092,58.381096],[45.738352,58.381701],[45.739674,58.381988],[45.740629,58.382165],[45.741991,58.382388],[45.743969,58.382634],[45.748865,58.383085],[45.749438,58.38314],[45.75078,58.383256],[45.753119,58.383453],[45.754844,58.383609],[45.758348,58.383964],[45.760361,58.384178],[45.760654,58.384211],[45.76119,58.384264],[45.763537,58.384486],[45.765578,58.384698],[45.766541,58.384784],[45.767353,58.384845],[45.768133,58.3849],[45.768563,58.38492],[45.768946,58.384933],[45.769546,58.384946],[45.770353,58.384946],[45.77099,58.384941],[45.771649,58.384927],[45.772452,58.384892],[45.773249,58.384851],[45.773893,58.384823],[45.774454,58.384797],[45.777893,58.384603],[45.778788,58.384558],[45.779433,58.384515],[45.780028,58.384466],[45.780684,58.384404],[45.781143,58.384358],[45.781544,58.384314],[45.781973,58.384252],[45.782342,58.384196],[45.782757,58.384125],[45.783168,58.384041],[45.78377,58.383893],[45.784301,58.383753],[45.784778,58.383613],[45.78523,58.383459],[45.786058,58.383155],[45.786671,58.382866],[45.786978,58.38271],[45.787261,58.382559],[45.787804,58.382252],[45.789081,58.38136],[45.790689,58.380141],[45.792705,58.37865],[45.793726,58.377885],[45.79706,58.37542],[45.798423,58.374418],[45.799009,58.373997],[45.799673,58.373568],[45.800237,58.373258],[45.800875,58.372945],[45.801965,58.372515],[45.80272,58.372275],[45.803723,58.372017],[45.804703,58.371813],[45.805561,58.37168],[45.806378,58.371583],[45.807194,58.371522],[45.807439,58.371511],[45.807975,58.371493],[45.808596,58.371474],[45.80973,58.371439],[45.810972,58.37141],[45.815287,58.371319],[45.820121,58.371224],[45.822104,58.37118],[45.822121,58.37118],[45.828526,58.371033],[45.835189,58.370948],[45.836744,58.37093],[45.841665,58.370837],[45.844839,58.370766],[45.849855,58.370617],[45.858732,58.370425],[45.868401,58.370231],[45.878223,58.369975],[45.878243,58.369974],[45.889033,58.369686],[45.899041,58.36942],[45.899687,58.369405],[45.901238,58.369415],[45.902899,58.369462],[45.910529,58.369675],[45.911123,58.369693],[45.91165,58.369706],[45.914964,58.369784],[45.916986,58.369832],[45.922957,58.369974],[45.924609,58.37],[45.925528,58.369998],[45.926252,58.369984],[45.92687,58.369951],[45.927517,58.369897],[45.928257,58.369812],[45.929001,58.369701],[45.929828,58.369566],[45.930662,58.369417],[45.931794,58.369208],[45.932974,58.368994],[45.933949,58.368819],[45.934902,58.368642],[45.935768,58.368485],[45.937,58.368251],[45.9385,58.367985],[45.939456,58.367808],[45.940298,58.36764],[45.941106,58.367454],[45.941718,58.3673],[45.942352,58.367108],[45.943064,58.366874],[45.943725,58.366618],[45.944359,58.366346],[45.944837,58.366111],[45.945277,58.36588],[45.945689,58.365637],[45.946078,58.365377],[45.946355,58.365185],[45.946665,58.36497],[45.946952,58.364747],[45.947279,58.36444],[45.94748,58.364255],[45.947649,58.364064],[45.947927,58.363747],[45.948228,58.363331],[45.94847,58.362957],[45.948607,58.362694],[45.948725,58.362438],[45.948842,58.362187],[45.948934,58.361933],[45.949115,58.361462],[45.949408,58.360609],[45.950507,58.35745],[45.952429,58.351998],[45.952821,58.350713],[45.953349,58.349003],[45.953595,58.348174],[45.953751,58.347649],[45.953916,58.347124],[45.954139,58.346411],[45.954342,58.34594],[45.954547,58.345547],[45.954788,58.34513],[45.955142,58.344672],[45.955462,58.344332],[45.955986,58.343825],[45.956557,58.343381],[45.957259,58.34292],[45.957891,58.34256],[45.958683,58.342146],[45.959626,58.341759],[45.960377,58.341483],[45.961352,58.341194],[45.962425,58.340935],[45.963224,58.340774],[45.963879,58.340663],[45.964649,58.340556],[45.965478,58.340478],[45.966493,58.34041],[45.967677,58.340372],[45.969606,58.340359],[45.973532,58.340314],[45.979723,58.340242],[45.986092,58.340166],[45.989255,58.340132],[45.99581,58.34006],[45.996745,58.340049],[46.004636,58.339953],[46.010235,58.339883],[46.030378,58.339656],[46.039423,58.339533],[46.047876,58.33944],[46.052969,58.339377],[46.055845,58.33932],[46.058146,58.339304],[46.06965,58.339161],[46.072881,58.339136],[46.076284,58.33909],[46.081909,58.339012],[46.083454,58.339009],[46.085912,58.338982],[46.088969,58.338948],[46.091783,58.338922],[46.103168,58.33879],[46.106492,58.338737],[46.109536,58.338691],[46.116793,58.338617],[46.117489,58.338607],[46.122374,58.338548],[46.12389,58.338519],[46.126161,58.338476],[46.131066,58.338387],[46.135537,58.338303],[46.141206,58.338203],[46.147766,58.338083],[46.153155,58.338002],[46.158352,58.337938],[46.15851,58.337937],[46.167494,58.337836],[46.172422,58.337788],[46.175504,58.337727],[46.179087,58.337671],[46.18226,58.337629],[46.188317,58.337535],[46.194753,58.337425],[46.195742,58.337425],[46.19646,58.337425],[46.19763,58.337449],[46.198114,58.337465],[46.20008,58.337563],[46.202477,58.33773],[46.206417,58.338002],[46.208263,58.338111],[46.21462,58.338563],[46.215419,58.338613],[46.232705,58.339696],[46.253231,58.340913],[46.260866,58.341387],[46.26883,58.341864],[46.271009,58.341977],[46.271409,58.341998],[46.272432,58.342067],[46.273016,58.342105],[46.275054,58.342236],[46.27976,58.342567],[46.28398,58.342839],[46.284551,58.342852],[46.285107,58.342868],[46.28582,58.342872],[46.286411,58.342864],[46.286934,58.342847],[46.287702,58.342788],[46.288764,58.342654],[46.289785,58.342435],[46.28999,58.342384],[46.290339,58.342299],[46.290775,58.342175],[46.290925,58.342127],[46.291404,58.341973],[46.292173,58.341679],[46.292601,58.341484],[46.293057,58.341265],[46.294065,58.340706],[46.296207,58.339536],[46.298512,58.338258],[46.30004,58.337495],[46.301585,58.336732],[46.302308,58.336376],[46.302795,58.336151],[46.303248,58.335951],[46.303774,58.335739],[46.304283,58.335565],[46.30471,58.335433],[46.305357,58.335263],[46.306066,58.335109],[46.306708,58.334993],[46.307459,58.334893],[46.308216,58.334819],[46.308843,58.334783],[46.309581,58.334766],[46.310202,58.334774],[46.310786,58.334798],[46.311413,58.334842],[46.312074,58.334904],[46.316778,58.335371],[46.317484,58.33545],[46.320152,58.335749],[46.322863,58.336048],[46.324409,58.336197],[46.343257,58.338094],[46.343806,58.338149],[46.34662,58.33843],[46.350072,58.338759],[46.351319,58.338862],[46.352114,58.338907],[46.352875,58.338932],[46.3533,58.338935],[46.353662,58.338939],[46.354383,58.338923],[46.35526,58.338867],[46.35633,58.338774],[46.357356,58.338651],[46.358474,58.338488],[46.370814,58.336522],[46.383413,58.334508],[46.391759,58.333165],[46.393039,58.332985],[46.39373,58.332904],[46.394464,58.332836],[46.395077,58.332791],[46.395674,58.332768],[46.396264,58.332755],[46.396817,58.332755],[46.397658,58.332773],[46.399257,58.33283],[46.399929,58.332854],[46.402045,58.332927],[46.406941,58.33299],[46.411703,58.333025],[46.420706,58.333129],[46.430247,58.333188],[46.437191,58.333273],[46.438031,58.333275],[46.438831,58.333251],[46.439488,58.33322],[46.440095,58.333171],[46.440829,58.333087],[46.44143,58.332984],[46.442494,58.332801],[46.443785,58.33256],[46.446169,58.332064],[46.446907,58.331901],[46.447747,58.331674],[46.448499,58.331461],[46.449222,58.331233],[46.450002,58.330975],[46.451765,58.330356],[46.453612,58.329725],[46.460999,58.327208],[46.461932,58.326902],[46.462678,58.326671],[46.464044,58.32628],[46.464871,58.326071],[46.466488,58.325701],[46.468376,58.325317],[46.470911,58.324888],[46.473247,58.324579],[46.475053,58.324383],[46.476631,58.324252],[46.4784,58.324152],[46.479431,58.324094],[46.482385,58.324015],[46.509865,58.32359],[46.536567,58.323107],[46.548445,58.32289],[46.558923,58.322734],[46.565838,58.322612],[46.571784,58.322521],[46.573739,58.32253],[46.575031,58.322556],[46.576066,58.322593],[46.577283,58.322657],[46.577531,58.32267],[46.579072,58.322776],[46.613722,58.326208],[46.624065,58.327222],[46.62543,58.327316],[46.627198,58.327267],[46.62808,58.327186],[46.629292,58.32699],[46.631129,58.326568],[46.646756,58.322139],[46.649096,58.321472],[46.657405,58.319105],[46.659287,58.318593],[46.660582,58.318283],[46.662745,58.317826],[46.665649,58.317354],[46.684828,58.314553],[46.695232,58.313018],[46.702005,58.312016],[46.704303,58.311706],[46.705886,58.311533],[46.707075,58.311438],[46.708523,58.311378],[46.709965,58.31136],[46.71125,58.311382],[46.712599,58.311438],[46.714022,58.311549],[46.71603,58.311767],[46.718006,58.312074],[46.724159,58.31322],[46.728033,58.313921],[46.729754,58.314183],[46.731702,58.314437],[46.734532,58.31467],[46.735979,58.31474],[46.737531,58.31476],[46.739511,58.314782],[46.748761,58.314679],[46.753126,58.314658],[46.754676,58.314694],[46.756192,58.314761],[46.757899,58.314876],[46.759681,58.315025],[46.761949,58.315241],[46.766955,58.315722],[46.77601,58.316608],[46.789673,58.317942],[46.797637,58.318704],[46.803941,58.319328],[46.807929,58.319723],[46.809767,58.319851],[46.810925,58.319918],[46.811837,58.319948],[46.813185,58.319943],[46.824314,58.31968],[46.83502,58.319477],[46.858107,58.319059],[46.86734,58.318934],[46.876323,58.318813],[46.904422,58.318434],[46.907236,58.318391],[46.909897,58.318281],[46.911576,58.318153],[46.913529,58.31798],[46.915733,58.317714],[46.933605,58.315445],[46.935199,58.315245],[46.936396,58.315136],[46.937501,58.315099],[46.938474,58.315095],[46.939604,58.315133],[46.941181,58.315254],[46.943531,58.315457],[46.952739,58.316221],[46.959949,58.316863],[46.972351,58.318178],[46.973375,58.318255],[46.975091,58.318304],[46.976951,58.318316],[46.984272,58.318362],[46.986268,58.318365],[46.987772,58.318298],[46.989417,58.318127],[46.99112,58.31787],[46.992023,58.317675],[46.992475,58.317588],[46.994124,58.317144],[47.013649,58.311856],[47.017962,58.310624],[47.0204,58.309873],[47.027447,58.307537],[47.040951,58.302997],[47.042215,58.302612],[47.043633,58.302217],[47.045123,58.301843],[47.047008,58.301406],[47.054841,58.299833],[47.056576,58.29949],[47.05824,58.299164],[47.060564,58.298693],[47.064369,58.297931],[47.065795,58.297639],[47.067039,58.297388],[47.067969,58.2972],[47.068514,58.297092],[47.072315,58.296344],[47.073981,58.296],[47.075422,58.295716],[47.076405,58.295551],[47.07686,58.295479],[47.077558,58.295385],[47.07814,58.295317],[47.078777,58.295257],[47.079356,58.295216],[47.080205,58.295175],[47.082107,58.295114],[47.084307,58.295047],[47.087665,58.294932],[47.091581,58.294795],[47.094133,58.2947],[47.09817,58.294557],[47.101645,58.294446],[47.103052,58.29438],[47.104886,58.294257],[47.106294,58.294127],[47.109846,58.293616],[47.113067,58.29308],[47.115845,58.292599],[47.118139,58.292292],[47.119568,58.292121],[47.12025,58.292039],[47.121378,58.291924],[47.122567,58.291815],[47.127036,58.29155],[47.128752,58.291478],[47.130447,58.291444],[47.132929,58.29143],[47.135269,58.291469],[47.138017,58.29153],[47.14096,58.291576],[47.143505,58.29163],[47.146731,58.291709],[47.148726,58.291754],[47.151156,58.291815],[47.157892,58.292055],[47.164079,58.292234],[47.170637,58.292419],[47.170644,58.292419],[47.172207,58.292434],[47.173807,58.292382],[47.207526,58.289211],[47.241508,58.285892],[47.242171,58.285827],[47.250721,58.284995],[47.253113,58.284798],[47.255122,58.284664],[47.256941,58.284566],[47.259799,58.284438],[47.262617,58.284322],[47.286072,58.283352],[47.287076,58.283304],[47.288032,58.283203],[47.289414,58.283005],[47.296935,58.281665],[47.297277,58.281606],[47.301583,58.280869],[47.305355,58.280209],[47.305697,58.280149],[47.308379,58.279731],[47.310924,58.27945],[47.312909,58.279287],[47.339667,58.27737],[47.341502,58.277259],[47.353265,58.276362],[47.361401,58.275781],[47.363015,58.275701],[47.36415,58.27569],[47.364875,58.275686],[47.384344,58.27602],[47.385109,58.276056],[47.386014,58.276094],[47.387958,58.276233],[47.390432,58.276469],[47.405531,58.277828],[47.408247,58.277974],[47.410283,58.277981],[47.410941,58.277982],[47.416236,58.277961],[47.425548,58.277961],[47.42896,58.277944],[47.438884,58.277928],[47.439898,58.277881],[47.442725,58.277844],[47.445885,58.277669],[47.448886,58.277373],[47.457636,58.276189],[47.465019,58.275135],[47.465967,58.274956],[47.467223,58.274695],[47.468236,58.274437],[47.469507,58.274076],[47.476666,58.271895],[47.48264,58.270071],[47.483516,58.269823],[47.483636,58.26979],[47.484654,58.269548],[47.4853,58.269419],[47.486107,58.269289],[47.486931,58.269186],[47.487883,58.269087],[47.499829,58.268277],[47.504932,58.267934],[47.508679,58.267682],[47.510479,58.267608],[47.513353,58.267478],[47.514288,58.267447],[47.523036,58.267202],[47.526232,58.267113],[47.533908,58.266892],[47.53915,58.266731],[47.54521,58.266539],[47.558073,58.266353],[47.570273,58.266179],[47.570683,58.266176],[47.574258,58.266149],[47.577409,58.266327],[47.577817,58.266357],[47.582086,58.266672],[47.584346,58.266782],[47.584478,58.266783],[47.585427,58.266776],[47.586315,58.266741],[47.587369,58.266684],[47.587967,58.266646],[47.590199,58.2665],[47.590525,58.26648],[47.5959,58.266165],[47.602673,58.265857],[47.603275,58.265846],[47.604126,58.26583],[47.605503,58.265843],[47.607608,58.265999],[47.609824,58.266151],[47.609983,58.266162],[47.610905,58.266225],[47.614729,58.266571],[47.617756,58.2669],[47.621962,58.267395],[47.6237,58.267615],[47.625543,58.26786],[47.62632,58.267951],[47.626833,58.26801],[47.626869,58.268015],[47.628857,58.268249],[47.639865,58.269585],[47.642685,58.269933],[47.644126,58.270105],[47.644496,58.270136],[47.644821,58.270137],[47.645545,58.270181],[47.645862,58.270217],[47.647366,58.270379],[47.649232,58.270613],[47.651214,58.270852],[47.654318,58.271227],[47.655503,58.271386],[47.657119,58.271581],[47.657801,58.271661],[47.659313,58.271825],[47.661133,58.271966],[47.662427,58.272039],[47.664322,58.272185],[47.666774,58.272198],[47.669541,58.27214],[47.691141,58.271317],[47.696961,58.271091],[47.699626,58.271003],[47.711922,58.270486],[47.713916,58.270447],[47.716436,58.270434],[47.717902,58.270445],[47.719421,58.270501],[47.721492,58.270613],[47.723861,58.270803],[47.726435,58.271065],[47.73126,58.271593],[47.736147,58.272149],[47.737195,58.27227],[47.737673,58.272323],[47.747798,58.273458],[47.750171,58.273691],[47.750509,58.273706],[47.753191,58.273859],[47.754348,58.273886],[47.755399,58.273881],[47.756643,58.273837],[47.773524,58.273172],[47.774408,58.273138],[47.785044,58.272727],[47.788257,58.272618],[47.791031,58.27251],[47.792876,58.272399],[47.793606,58.272327],[47.794366,58.272242],[47.794968,58.272156],[47.798822,58.27155],[47.807944,58.270142],[47.810826,58.269657],[47.811453,58.269556],[47.818999,58.268389],[47.831178,58.266575],[47.836331,58.265918],[47.840177,58.265497],[47.846743,58.264858],[47.84902,58.26461],[47.850998,58.264317],[47.852903,58.263966],[47.854493,58.26363],[47.855959,58.263272],[47.857647,58.262833],[47.85887,58.262451],[47.860038,58.262061],[47.867088,58.259483],[47.868971,58.258802],[47.870498,58.258296],[47.872997,58.257603],[47.874623,58.25722],[47.875906,58.256967],[47.878509,58.256581],[47.878963,58.256513],[47.880056,58.25639],[47.880479,58.256351],[47.882714,58.256163],[47.884232,58.256022],[47.888294,58.255801],[47.892245,58.255757],[47.89501,58.255906],[47.899086,58.256127],[47.91216,58.256774],[47.913869,58.256906],[47.915484,58.257087],[47.918251,58.25745],[47.921311,58.257961],[47.923537,58.258448],[47.924664,58.258772],[47.925976,58.259164],[47.926718,58.259385],[47.932124,58.261458],[47.936149,58.263002],[47.93857,58.263829],[47.942046,58.264785],[47.945157,58.265362],[47.948315,58.265833],[47.950769,58.26611],[47.951749,58.266235],[47.953146,58.266392],[47.955681,58.266641],[47.958766,58.266778],[47.96199,58.266799],[47.965601,58.266519],[47.966611,58.266357],[47.966778,58.26633],[47.966976,58.266297],[47.968107,58.266116],[47.96889,58.26599],[47.969996,58.265812],[47.970483,58.265734],[47.972598,58.265393],[47.974744,58.265054],[47.978039,58.264535],[47.981364,58.264134],[47.981859,58.264095],[47.982375,58.264055],[47.983798,58.264011],[47.986438,58.26395],[47.988753,58.263792],[47.991625,58.263371],[47.999497,58.261734],[48.004955,58.260598],[48.00585,58.260412],[48.011666,58.259195],[48.014047,58.258767],[48.016507,58.258562],[48.018373,58.258574],[48.019525,58.258619],[48.022295,58.258919],[48.024827,58.259412],[48.02884,58.260379],[48.036398,58.262201],[48.038053,58.262586],[48.047582,58.264891],[48.050673,58.265641],[48.054024,58.266456],[48.057089,58.267339],[48.063646,58.269123],[48.067614,58.270305],[48.069151,58.270682],[48.069685,58.270789],[48.070626,58.270938],[48.071821,58.271099],[48.072932,58.271224],[48.074309,58.271303],[48.094543,58.271025],[48.0967,58.271001],[48.098869,58.271028],[48.100779,58.271102],[48.102636,58.271202],[48.103888,58.271327],[48.107892,58.271848],[48.112704,58.272561],[48.115251,58.272931],[48.116875,58.273058],[48.118299,58.273086],[48.120948,58.273035],[48.130207,58.272839],[48.131644,58.272844],[48.133684,58.2729],[48.134754,58.272953],[48.135819,58.273032],[48.137344,58.273161],[48.140141,58.273525],[48.143132,58.273943],[48.144664,58.274178],[48.145521,58.274314],[48.146386,58.274467],[48.148002,58.27483],[48.148913,58.275073],[48.149975,58.275438],[48.151097,58.2759],[48.15199,58.276354],[48.152862,58.276851],[48.153583,58.277368],[48.154299,58.277943],[48.155286,58.278964],[48.160179,58.285244],[48.16113,58.28629],[48.161653,58.28674],[48.162112,58.287102],[48.162905,58.287565],[48.164002,58.288113],[48.165375,58.28865],[48.166122,58.288906],[48.166943,58.289149],[48.168025,58.289394],[48.182505,58.292044],[48.184731,58.292415],[48.186079,58.292581],[48.187188,58.292703],[48.188402,58.29277],[48.188693,58.292776],[48.190073,58.292803],[48.196232,58.292925],[48.197641,58.292976],[48.198066,58.292992],[48.201032,58.2931],[48.203631,58.293333],[48.206385,58.293724],[48.208063,58.293999],[48.210607,58.294465],[48.213323,58.295031],[48.215757,58.295646],[48.218191,58.296412],[48.224422,58.298635],[48.225912,58.299327],[48.22736,58.300051],[48.230975,58.302081],[48.23182,58.302498],[48.23306,58.303001],[48.233931,58.303291],[48.23505,58.303614],[48.235363,58.303705],[48.236877,58.304042],[48.238157,58.304312],[48.246862,58.306015],[48.249343,58.306536],[48.251871,58.307131],[48.259646,58.309001],[48.260813,58.309282],[48.262199,58.309615],[48.263257,58.309911],[48.264025,58.310182],[48.264658,58.310459],[48.265291,58.310774],[48.265833,58.311108],[48.26637,58.311474],[48.266894,58.311884],[48.267369,58.312471],[48.267728,58.313055],[48.268171,58.314216],[48.269284,58.318548],[48.269357,58.31883],[48.269565,58.319579],[48.269841,58.320535],[48.269879,58.320664],[48.269927,58.320818],[48.270032,58.321079],[48.27011,58.321271],[48.270193,58.321478],[48.270373,58.321823],[48.270552,58.322168],[48.269616,58.322637],[48.268917,58.32299],[48.268489,58.32329],[48.268135,58.323569],[48.267781,58.323848],[48.266504,58.32518],[48.266028,58.325712],[48.264705,58.327237],[48.264112,58.327921],[48.263646,58.328481],[48.263413,58.328915],[48.264186,58.329004],[48.266939,58.329009],[48.269205,58.32904],[48.276099,58.329162],[48.277198,58.329238],[48.278228,58.329418],[48.279086,58.329671],[48.279801,58.330043],[48.280026,58.330159],[48.280241,58.330276],[48.281877,58.331136],[48.28544,58.33297],[48.288002,58.334157],[48.290211,58.335026],[48.291271,58.335361],[48.292359,58.335672],[48.294189,58.336168],[48.294536,58.336262],[48.295948,58.336625],[48.297159,58.336908],[48.298132,58.337108],[48.299015,58.337248],[48.299948,58.337314],[48.300861,58.33735],[48.301763,58.337326],[48.309018,58.337027],[48.314322,58.336809],[48.329823,58.33617],[48.331123,58.336056],[48.331992,58.335862],[48.332936,58.335502],[48.33316,58.335404],[48.333372,58.335296],[48.333546,58.335211],[48.335068,58.334422],[48.336024,58.333971],[48.337411,58.333394],[48.339331,58.3326],[48.342017,58.331506],[48.345852,58.329931],[48.346116,58.329822],[48.346688,58.329585],[48.354374,58.326404],[48.359046,58.324648],[48.361844,58.323551],[48.362874,58.323172],[48.364402,58.322847],[48.36634,58.32263],[48.381016,58.320979],[48.395118,58.319419],[48.395559,58.319368],[48.396809,58.319227],[48.397342,58.319173],[48.397793,58.319129],[48.398444,58.319794],[48.399564,58.320888],[48.401328,58.322483],[48.403044,58.323921],[48.403243,58.324092],[48.404986,58.325597],[48.406026,58.326495],[48.406555,58.326973],[48.406834,58.327193],[48.406989,58.327314],[48.407165,58.327451],[48.409929,58.329456],[48.411651,58.33071],[48.412172,58.331067],[48.415637,58.333214],[48.416453,58.333724],[48.417318,58.334208],[48.419566,58.335597],[48.421646,58.336807],[48.422215,58.337159],[48.422933,58.33766],[48.423395,58.338046],[48.423897,58.33863],[48.424283,58.33912],[48.424588,58.339674],[48.425068,58.340599],[48.425391,58.34127],[48.425584,58.341666],[48.426155,58.342774],[48.42651,58.343534],[48.426894,58.344252],[48.427109,58.344716],[48.427804,58.34611],[48.429202,58.348956],[48.429388,58.349336],[48.430166,58.350671],[48.430552,58.351171],[48.431104,58.351877],[48.438356,58.359947],[48.439779,58.36153],[48.440768,58.36263],[48.440824,58.362693],[48.448571,58.371382],[48.45045,58.373219],[48.454359,58.376968],[48.454543,58.377145],[48.455128,58.377697],[48.458198,58.38065],[48.459146,58.381559],[48.460508,58.383044],[48.461487,58.384543],[48.462796,58.387718],[48.462872,58.387872],[48.462914,58.387957],[48.463789,58.389479],[48.464243,58.390381],[48.464709,58.39159],[48.464746,58.391696],[48.465799,58.394675],[48.466273,58.396016],[48.466392,58.396351],[48.466551,58.3968],[48.466752,58.397368],[48.466979,58.398047],[48.467042,58.398235],[48.467122,58.398474],[48.467646,58.399987],[48.467829,58.400528],[48.467989,58.401006],[48.468043,58.401167],[48.46819,58.401585],[48.468305,58.401818],[48.468471,58.402043],[48.468671,58.402267],[48.469179,58.402795],[48.473358,58.406709],[48.473753,58.407196],[48.474207,58.40779],[48.474418,58.408067],[48.475172,58.409072],[48.475811,58.409748],[48.476555,58.410488],[48.477625,58.411377],[48.477935,58.411636],[48.478129,58.4118],[48.479402,58.412739],[48.479863,58.413055],[48.480195,58.413319],[48.480452,58.413585],[48.48062,58.413834],[48.480697,58.413967],[48.482437,58.417013],[48.482717,58.417503],[48.483538,58.41877],[48.483607,58.418861],[48.483872,58.419207],[48.484672,58.420244],[48.486004,58.421781],[48.489148,58.425407],[48.489357,58.425647],[48.489731,58.426002],[48.490035,58.426223],[48.490503,58.426481],[48.490991,58.426716],[48.495031,58.428384],[48.495184,58.42845],[48.496954,58.429192],[48.504517,58.432366],[48.504828,58.432489],[48.510735,58.435008],[48.511006,58.43513],[48.512332,58.435727],[48.51275,58.435941],[48.513442,58.436317],[48.514018,58.436641],[48.515393,58.437447],[48.515559,58.43755],[48.516462,58.438103],[48.517501,58.438727],[48.518078,58.439072],[48.519022,58.439704],[48.519694,58.440316],[48.519944,58.440563],[48.520146,58.440764],[48.520474,58.441086],[48.529019,58.449505],[48.529618,58.450095],[48.532166,58.452632],[48.532843,58.453303],[48.533249,58.453714],[48.536606,58.456957],[48.545788,58.466068],[48.546407,58.466514],[48.547286,58.467147],[48.553115,58.470344],[48.5632,58.475874],[48.567105,58.477866],[48.572463,58.480646],[48.579573,58.484335],[48.580613,58.48486],[48.582279,58.485779],[48.584657,58.487264],[48.587707,58.489816],[48.5894,58.491238],[48.589469,58.491297],[48.590612,58.492706],[48.591007,58.493283],[48.591624,58.494164],[48.591872,58.494544],[48.591933,58.49464],[48.593457,58.497032],[48.594129,58.499098],[48.594606,58.501072],[48.595095,58.503356],[48.595654,58.504386],[48.596583,58.505041],[48.597909,58.505592],[48.599588,58.506008],[48.600044,58.506121],[48.602146,58.506316],[48.606538,58.506516],[48.606654,58.506522],[48.626438,58.507424],[48.629698,58.507758],[48.630296,58.507816],[48.630951,58.507852],[48.631786,58.50782],[48.634138,58.507609],[48.635082,58.507546],[48.635771,58.507521],[48.636488,58.507528],[48.637162,58.507562],[48.639067,58.507732],[48.639725,58.50777],[48.645219,58.507764],[48.645728,58.50781],[48.646125,58.507886],[48.64656,58.508012],[48.647263,58.508259],[48.651483,58.509829],[48.652334,58.510084],[48.65332,58.510265],[48.654372,58.510417],[48.657426,58.510783],[48.661037,58.511196],[48.66716,58.511996],[48.667669,58.512063],[48.668415,58.512169],[48.669014,58.512271],[48.669632,58.512421],[48.670233,58.512616],[48.671127,58.51302],[48.671622,58.513264],[48.678704,58.516763],[48.679937,58.517485],[48.680953,58.518295],[48.681665,58.51925],[48.68263,58.521054],[48.683621,58.522354],[48.684953,58.523625],[48.686887,58.524944],[48.696483,58.530845],[48.698105,58.531847],[48.698219,58.5319],[48.700209,58.532818],[48.703077,58.533868],[48.715911,58.537835],[48.716011,58.537866],[48.725419,58.540774],[48.726991,58.541193],[48.728289,58.541503],[48.729524,58.541744],[48.730965,58.541993],[48.732069,58.542151],[48.733221,58.54229],[48.734189,58.542395],[48.73638,58.542592],[48.744207,58.543142],[48.745088,58.543206],[48.749304,58.543481],[48.749677,58.543505],[48.750114,58.543535],[48.75282,58.543757],[48.75424,58.543862],[48.757001,58.544065],[48.759618,58.544268],[48.765021,58.544629],[48.765705,58.544661],[48.766407,58.544666],[48.767091,58.544615],[48.767694,58.544539],[48.768337,58.54442],[48.76942,58.544192],[48.78021,58.541484],[48.785799,58.54014],[48.786153,58.540054],[48.78984,58.539167],[48.794282,58.538128],[48.795713,58.537779],[48.795937,58.537738],[48.79638,58.537658],[48.797214,58.537552],[48.797925,58.537492],[48.799106,58.537448],[48.800187,58.537438],[48.801703,58.537464],[48.805736,58.537576],[48.807683,58.537621],[48.809009,58.537668],[48.819266,58.538368],[48.819579,58.538387],[48.82629,58.538861],[48.83344,58.53931],[48.835703,58.539581],[48.843334,58.54077],[48.853007,58.542187],[48.8579,58.543221],[48.861205,58.543958],[48.864891,58.544787],[48.868617,58.545599],[48.870637,58.546037],[48.873642,58.546705],[48.887919,58.549782],[48.892451,58.550768],[48.893713,58.551042],[48.89634,58.551613],[48.898821,58.552278],[48.898881,58.552293],[48.899709,58.552515],[48.900114,58.552647],[48.900526,58.552766],[48.900605,58.552792],[48.900685,58.552817],[48.900848,58.552873],[48.901557,58.553101],[48.902327,58.553377],[48.903915,58.554017],[48.904355,58.554195],[48.905521,58.554682],[48.907477,58.555535],[48.915361,58.558839],[48.918734,58.560248],[48.919475,58.56057],[48.922516,58.561894],[48.924818,58.562977],[48.925631,58.563407],[48.927034,58.564228],[48.92726,58.56439],[48.929171,58.565766],[48.934536,58.57053],[48.935439,58.571351],[48.939198,58.574709],[48.939726,58.575194],[48.93986,58.575313],[48.941866,58.577093],[48.942137,58.577334],[48.944704,58.579601],[48.954702,58.588478],[48.957323,58.590772],[48.957388,58.590829],[48.964005,58.596647],[48.964699,58.597304],[48.965113,58.597719],[48.965377,58.597984],[48.966368,58.599173],[48.967328,58.600481],[48.971573,58.606437],[48.971741,58.606687],[48.971896,58.606918],[48.972651,58.607962],[48.973116,58.608625],[48.9735,58.609197],[48.974022,58.610064],[48.97444,58.610769],[48.975013,58.611753],[48.975419,58.612423],[48.977531,58.615869],[48.97784,58.616382],[48.980197,58.620248],[48.982482,58.624027],[48.984463,58.627335],[48.984841,58.627967],[48.98565,58.629128],[48.986055,58.629583],[48.986475,58.629982],[48.986913,58.630381],[48.987859,58.63117],[48.988329,58.631561],[48.99004,58.633003],[48.995206,58.637541],[48.995944,58.638192],[48.99678,58.638929],[48.998474,58.640422],[49.006041,58.646952],[49.006774,58.647507],[49.007586,58.648095],[49.008588,58.648675],[49.009657,58.649235],[49.01291,58.650747],[49.013605,58.651083],[49.019136,58.653604],[49.020357,58.654161],[49.026302,58.65687],[49.029735,58.658424],[49.030654,58.658853],[49.030965,58.658996],[49.035012,58.660846],[49.036536,58.661542],[49.047705,58.666653],[49.055624,58.670237],[49.056998,58.670829],[49.057279,58.670946],[49.058862,58.671604],[49.059502,58.671853],[49.065831,58.674346],[49.06801,58.675175],[49.069616,58.67572],[49.071941,58.676481],[49.072855,58.676756],[49.073526,58.676939],[49.076113,58.677577],[49.082483,58.679122],[49.083377,58.679338],[49.099307,58.68321],[49.101596,58.683773],[49.103478,58.684282],[49.107094,58.685309],[49.107236,58.685351],[49.107483,58.685429],[49.108469,58.68574],[49.10996,58.686223],[49.112861,58.6872],[49.117708,58.688861],[49.121742,58.690219],[49.123644,58.690837],[49.125078,58.691269],[49.126535,58.69166],[49.128632,58.692233],[49.129476,58.692452],[49.129952,58.692575],[49.13398,58.693543],[49.135785,58.693969],[49.147693,58.696779],[49.149536,58.69721],[49.161843,58.700087],[49.166087,58.701084],[49.16627,58.701127],[49.170169,58.702037],[49.186056,58.705747],[49.192658,58.70729],[49.197456,58.708397],[49.199575,58.708897],[49.200576,58.709172],[49.201282,58.709385],[49.201946,58.709618],[49.202869,58.709971],[49.203408,58.710213],[49.204226,58.710616],[49.20469,58.710864],[49.20518,58.711158],[49.20564,58.711468],[49.206036,58.711749],[49.207127,58.71264],[49.208482,58.713786],[49.21041,58.715402],[49.213177,58.717655],[49.213501,58.71791],[49.213739,58.718098],[49.214784,58.718892],[49.215452,58.719346],[49.216128,58.719777],[49.21681,58.720169],[49.217714,58.720657],[49.218548,58.721093],[49.219174,58.721394],[49.221668,58.722484],[49.224631,58.723762],[49.2253,58.724064],[49.226061,58.724409],[49.228154,58.7255],[49.228739,58.725836],[49.229629,58.726381],[49.230401,58.726892],[49.232841,58.728576],[49.234028,58.729327],[49.235139,58.729948],[49.235947,58.730375],[49.236716,58.73077],[49.240702,58.732744],[49.242142,58.73348],[49.243652,58.73425],[49.244589,58.734725],[49.245105,58.734991],[49.245538,58.735203],[49.247038,58.73585],[49.248323,58.736323],[49.249248,58.736602],[49.250188,58.736839],[49.251108,58.73705],[49.258869,58.738728],[49.273094,58.74176],[49.280094,58.743261],[49.281647,58.743624],[49.283222,58.744016],[49.28457,58.744397],[49.286894,58.745126],[49.290374,58.746332],[49.29121,58.74663],[49.29755,58.748913],[49.297718,58.748974],[49.300446,58.749975],[49.306373,58.752122],[49.315742,58.755591],[49.318402,58.756543],[49.320647,58.757238],[49.32201,58.757618],[49.323484,58.758006],[49.326198,58.75865],[49.328616,58.759179],[49.332964,58.760114],[49.338861,58.761363],[49.354579,58.76478],[49.362854,58.76658],[49.367986,58.767714],[49.382502,58.771217],[49.38828,58.772597],[49.388716,58.772701],[49.388873,58.772739],[49.394123,58.773984],[49.394565,58.774092],[49.398368,58.775017],[49.399625,58.775313],[49.40085,58.775596],[49.401963,58.775822],[49.403091,58.776015],[49.404165,58.776187],[49.405377,58.776369],[49.406053,58.776458],[49.407193,58.776608],[49.408801,58.776792],[49.410941,58.776978],[49.412699,58.777094],[49.414271,58.777169],[49.415613,58.777207],[49.417025,58.777223],[49.418263,58.777221],[49.419466,58.777186],[49.420616,58.777143],[49.421952,58.777069],[49.423364,58.776971],[49.424787,58.776856],[49.434564,58.77588],[49.436988,58.775645],[49.438784,58.775472],[49.440462,58.775318],[49.445447,58.774825],[49.445749,58.774795],[49.456228,58.773761],[49.468611,58.772538],[49.472567,58.772144],[49.47407,58.771961],[49.475269,58.771792],[49.476439,58.771584],[49.476641,58.771547],[49.477772,58.77129],[49.478056,58.771218],[49.478103,58.771199],[49.478156,58.771184],[49.478213,58.771175],[49.478272,58.771171],[49.478781,58.771078],[49.47921,58.771005],[49.479978,58.770801],[49.480099,58.770771],[49.481418,58.770437],[49.482956,58.769995],[49.484615,58.769439],[49.486185,58.768903],[49.486608,58.768759],[49.487939,58.7683],[49.488717,58.768038],[49.490442,58.767453],[49.490596,58.7674],[49.496916,58.765219],[49.497035,58.765178],[49.49763,58.764972],[49.505938,58.762104],[49.506287,58.761984],[49.509497,58.760913],[49.510429,58.760617],[49.513181,58.759622],[49.513321,58.759571],[49.515805,58.758461],[49.516092,58.758337],[49.518701,58.756868],[49.520844,58.755385],[49.523041,58.753693],[49.533777,58.745724],[49.534063,58.745527],[49.538637,58.742117],[49.541073,58.740328],[49.542395,58.739513],[49.543681,58.738962],[49.545038,58.738557],[49.552951,58.736922],[49.553726,58.736761],[49.561748,58.735006],[49.563003,58.73475],[49.563265,58.734692],[49.563457,58.734646],[49.563657,58.734595],[49.563831,58.734544],[49.563974,58.734495],[49.564134,58.734436],[49.564281,58.734371],[49.564466,58.734287],[49.564672,58.734177],[49.564889,58.734054],[49.565086,58.733925],[49.565291,58.733778],[49.565436,58.733654],[49.565591,58.73353],[49.566493,58.732692],[49.567575,58.731668],[49.574544,58.725072],[49.57743,58.72234],[49.578845,58.721098],[49.579066,58.720897],[49.580888,58.719206],[49.583869,58.716441],[49.584748,58.715625],[49.585825,58.714611],[49.586005,58.714478],[49.586638,58.71404],[49.587203,58.713675],[49.588623,58.713006],[49.590753,58.712344],[49.593155,58.711692],[49.595561,58.710866],[49.595945,58.710719],[49.597712,58.710026],[49.599466,58.709211],[49.603548,58.706712],[49.609363,58.703205],[49.610981,58.702112],[49.612246,58.70111],[49.612718,58.700737],[49.617414,58.695842],[49.619878,58.693267],[49.620768,58.692546],[49.621563,58.69202],[49.622591,58.691459],[49.623635,58.690978],[49.624819,58.690491],[49.626015,58.69007],[49.626798,58.689802],[49.630291,58.688593],[49.633673,58.687386],[49.636598,58.686354],[49.637373,58.686027],[49.638499,58.685487],[49.638547,58.685465],[49.640189,58.684531],[49.640543,58.684333],[49.640831,58.684124],[49.641356,58.683717],[49.641827,58.683263],[49.642364,58.682745],[49.64335,58.681795],[49.644615,58.680575],[49.645489,58.679733],[49.645783,58.679445],[49.645809,58.67941],[49.646773,58.678462],[49.647706,58.677536],[49.647929,58.67734],[49.648571,58.676718],[49.64877,58.676539],[49.648954,58.67641],[49.649174,58.676279],[49.649577,58.676088],[49.649897,58.675955],[49.650145,58.675857],[49.652258,58.675137],[49.654118,58.674508],[49.655336,58.674097],[49.655685,58.673979],[49.655912,58.673828],[49.656047,58.673714],[49.656087,58.673604],[49.656089,58.673482],[49.656034,58.673354],[49.655917,58.673238],[49.655766,58.673154],[49.655556,58.673095],[49.655314,58.67305],[49.655038,58.673039],[49.654794,58.673053],[49.654592,58.67309],[49.654389,58.673158],[49.654211,58.673252],[49.654095,58.67335],[49.654036,58.673458],[49.654036,58.673584],[49.654093,58.673689],[49.654353,58.673928],[49.655525,58.674625],[49.656539,58.675219],[49.657232,58.675665],[49.658305,58.67636],[49.658341,58.676383],[49.658592,58.676539],[49.658772,58.67669],[49.65905,58.676868],[49.659268,58.677007],[49.659377,58.677076],[49.659458,58.677125],[49.659513,58.677159],[49.659616,58.677232],[49.660343,58.677748],[49.661339,58.678485],[49.661793,58.67886],[49.662014,58.679044],[49.662739,58.679611],[49.662808,58.679665],[49.663536,58.68026],[49.66442,58.680987],[49.66518,58.681579],[49.667587,58.683541],[49.668083,58.683944],[49.668859,58.684538],[49.669276,58.684855],[49.669689,58.685169],[49.670091,58.685457],[49.670504,58.685699],[49.670883,58.685917],[49.67134,58.686158],[49.671853,58.686395],[49.672468,58.686648],[49.67296,58.686856],[49.676826,58.688347],[49.679135,58.689237],[49.679443,58.689354],[49.680252,58.689659],[49.681212,58.689998],[49.682504,58.690393],[49.683514,58.690634],[49.684778,58.690875],[49.686089,58.691079],[49.687493,58.691216],[49.688518,58.691294],[49.689958,58.691351],[49.691211,58.691333],[49.692951,58.691221],[49.694613,58.691019],[49.696541,58.690699],[49.69793,58.690412],[49.699337,58.690099],[49.700484,58.689845],[49.701316,58.689662],[49.702657,58.689372],[49.704652,58.688929],[49.705706,58.688696],[49.70763,58.688274],[49.709055,58.687965],[49.710989,58.687543],[49.712524,58.687205],[49.714202,58.686843],[49.716025,58.686445],[49.71798,58.686018],[49.719755,58.685629],[49.721661,58.685213],[49.723427,58.684824],[49.725022,58.68448],[49.726609,58.684132],[49.728172,58.683794],[49.729779,58.683446],[49.731142,58.683149],[49.731781,58.68301],[49.732651,58.682821],[49.734165,58.682486],[49.735689,58.682155],[49.737089,58.681852],[49.738588,58.681524],[49.739936,58.681227],[49.741283,58.680929],[49.74292,58.680574],[49.744554,58.680222],[49.74589,58.679936],[49.74724,58.679643],[49.74959,58.679137],[49.751953,58.678638],[49.754034,58.678167],[49.755986,58.677746],[49.756846,58.677555],[49.758359,58.677237],[49.759903,58.676852],[49.761331,58.676447],[49.761972,58.676266],[49.762722,58.676026],[49.763947,58.675603],[49.765245,58.675139],[49.76681,58.674492],[49.767874,58.673953],[49.769001,58.67341],[49.769845,58.672884],[49.77047,58.672519],[49.770992,58.672214],[49.772087,58.671511],[49.772934,58.670919],[49.773729,58.670309],[49.774625,58.669576],[49.776203,58.668056],[49.776802,58.667479],[49.777713,58.666555],[49.778479,58.665829],[49.779149,58.665169],[49.77936,58.66495],[49.780175,58.664116],[49.781348,58.662914],[49.782353,58.66191],[49.783195,58.66103],[49.783537,58.660682],[49.784605,58.659613],[49.78523,58.65903],[49.78571,58.658519],[49.786279,58.657958],[49.787045,58.657191],[49.787723,58.65652],[49.788194,58.656055],[49.788306,58.655944],[49.788575,58.655678],[49.789374,58.654891],[49.790149,58.654139],[49.790909,58.653384],[49.791574,58.652736],[49.792215,58.652104],[49.792458,58.651863],[49.792746,58.651577],[49.793299,58.651018],[49.793906,58.650416],[49.794537,58.649796],[49.795028,58.649321],[49.795486,58.648871],[49.796097,58.648314],[49.796773,58.647731],[49.797329,58.647269],[49.797844,58.646867],[49.799,58.645998],[49.79954,58.645621],[49.800218,58.645163],[49.800803,58.644789],[49.801556,58.64433],[49.802131,58.644007],[49.802707,58.643664],[49.803474,58.643228],[49.804029,58.642924],[49.804825,58.642513],[49.805799,58.642036],[49.806755,58.641598],[49.80901,58.640626],[49.809719,58.64034],[49.810394,58.640084],[49.811068,58.639824],[49.811879,58.639563],[49.813703,58.638915],[49.81607,58.638088],[49.817722,58.637494],[49.821308,58.636236],[49.824288,58.635217],[49.826699,58.634358],[49.826989,58.634242],[49.827252,58.634102],[49.827527,58.633903],[49.828452,58.634107],[49.829959,58.634484],[49.831787,58.63503],[49.833774,58.635699],[49.83381,58.635711],[49.834931,58.636088],[49.835709,58.636348],[49.837856,58.637062],[49.839592,58.637638],[49.840109,58.637812],[49.840213,58.637847],[49.841333,58.638225],[49.841999,58.638459],[49.842995,58.638784],[49.843529,58.638962],[49.843766,58.639042],[49.844147,58.639172],[49.844293,58.639222],[49.845327,58.639573],[49.845785,58.639729],[49.845843,58.639749],[49.845979,58.639794],[49.84645,58.639949],[49.84709,58.640161],[49.847786,58.640391],[49.848482,58.640621],[49.84924,58.640879],[49.85061,58.641338],[49.85186,58.641809],[49.853353,58.642574],[49.853836,58.642822],[49.856139,58.644068],[49.856979,58.644523],[49.86021,58.646246],[49.862308,58.647376],[49.862905,58.647598],[49.864515,58.648007],[49.866699,58.648465],[49.869139,58.648979],[49.871099,58.649384],[49.871707,58.64951],[49.87595,58.650369],[49.876519,58.650473],[49.876967,58.650564],[49.878435,58.650841],[49.878919,58.65093],[49.88019,58.651153],[49.880986,58.651271],[49.881523,58.651341],[49.881809,58.651364],[49.882164,58.651381],[49.882606,58.651383],[49.88314,58.651371],[49.883859,58.651347],[49.884541,58.651325],[49.885155,58.651311],[49.88562,58.651314],[49.886035,58.651325],[49.886428,58.651349],[49.886849,58.651388],[49.887199,58.651435],[49.887588,58.651505],[49.88805,58.651609],[49.89011,58.652116],[49.891485,58.652459],[49.893061,58.652853],[49.893473,58.652976],[49.893926,58.653146],[49.89535,58.653771],[49.896818,58.654389],[49.898227,58.654919],[49.90056,58.655631],[49.902581,58.656131],[49.904922,58.656475],[49.907471,58.656843],[49.908224,58.656952],[49.908465,58.656986],[49.91011,58.657279],[49.912071,58.657628],[49.912681,58.657751],[49.915813,58.658388],[49.917471,58.658775],[49.919291,58.659281],[49.919509,58.659339],[49.92173,58.659934],[49.922924,58.660454],[49.923103,58.660543],[49.924275,58.661218],[49.92487,58.661607],[49.925368,58.662027],[49.926407,58.663093],[49.927675,58.66442],[49.928598,58.66507],[49.929299,58.665439],[49.930547,58.666125],[49.932658,58.666986],[49.934956,58.667928],[49.935714,58.668203],[49.938767,58.669424],[49.941526,58.670749],[49.94387,58.671926],[49.944687,58.672327],[49.945157,58.672542],[49.945542,58.672665],[49.945956,58.672763],[49.946797,58.672941],[49.949382,58.673457],[49.951885,58.673852],[49.955994,58.674444],[49.959439,58.67504],[49.964458,58.675986],[49.968622,58.676883],[49.970134,58.677121],[49.970523,58.677182],[49.972316,58.677345],[49.975236,58.677441],[49.976576,58.677456],[49.978838,58.677501],[49.982084,58.677476],[49.982404,58.677474],[49.983263,58.677483],[49.984309,58.67758],[49.9872,58.677956],[49.988741,58.678149],[49.991066,58.678349],[49.992688,58.678406],[49.993944,58.678326],[49.997613,58.677959],[49.998756,58.677843],[50.000472,58.677679],[50.000509,58.677675],[50.001092,58.67762],[50.002235,58.677417],[50.002616,58.677333],[50.003424,58.677164],[50.004274,58.676975],[50.005265,58.676763],[50.005614,58.676689],[50.006367,58.67656],[50.006713,58.676501],[50.00689,58.67647],[50.007065,58.676453],[50.007919,58.676371],[50.010751,58.676195],[50.011383,58.676194],[50.011857,58.676252],[50.012049,58.676275],[50.015129,58.676673],[50.015352,58.676704],[50.015873,58.676777],[50.016629,58.676903],[50.016852,58.67694],[50.017444,58.677051],[50.017908,58.677147],[50.018257,58.677226],[50.0197,58.677561],[50.019927,58.677621],[50.020461,58.677778],[50.021329,58.678049],[50.023666,58.678807],[50.023891,58.678882],[50.024042,58.678929],[50.0249,58.679214],[50.026004,58.679581],[50.026227,58.679652],[50.026443,58.679723],[50.026919,58.679892],[50.02792,58.6803],[50.02914,58.680983],[50.029226,58.681023],[50.02952,58.681199],[50.030665,58.681845],[50.03071,58.681872],[50.032101,58.682667],[50.03252,58.682906],[50.032642,58.682976],[50.034172,58.68385],[50.034231,58.683884],[50.035419,58.68459],[50.036212,58.68509],[50.036514,58.685335],[50.037146,58.685916],[50.037715,58.686422],[50.039393,58.687912],[50.039594,58.688084],[50.039623,58.688112],[50.03966,58.688147],[50.04118,58.689605],[50.041293,58.6897],[50.041477,58.689855],[50.041845,58.690091],[50.042074,58.690192],[50.042565,58.690392],[50.043287,58.690637],[50.045729,58.691507],[50.04664,58.691729],[50.047661,58.691861],[50.048164,58.691907],[50.050976,58.692099],[50.051364,58.692119],[50.051909,58.692147],[50.054473,58.69228],[50.056127,58.692304],[50.056608,58.692317],[50.056881,58.692325],[50.057244,58.69234],[50.057989,58.692372],[50.060272,58.692469],[50.061789,58.692602],[50.06415,58.692949],[50.067138,58.693501],[50.070465,58.694253],[50.073055,58.694872],[50.074134,58.695122],[50.07467,58.695214],[50.074889,58.695251],[50.076603,58.695483],[50.078897,58.69571],[50.079912,58.695847],[50.080831,58.695997],[50.08152,58.696147],[50.082218,58.696377],[50.082919,58.696621],[50.083626,58.696921],[50.084818,58.697447],[50.085615,58.697874],[50.086404,58.698309],[50.088265,58.699339],[50.088927,58.699708],[50.089696,58.700137],[50.09049,58.700666],[50.09062,58.700771],[50.091217,58.701254],[50.091715,58.701694],[50.091744,58.701717],[50.092422,58.702334],[50.093933,58.703777],[50.093978,58.703815],[50.095548,58.705097],[50.096537,58.705842],[50.09703,58.70616],[50.09754,58.706451],[50.099303,58.707265],[50.102052,58.708318],[50.105388,58.709538],[50.106109,58.70978],[50.109797,58.711061],[50.113058,58.711824],[50.114902,58.71232],[50.117009,58.712826],[50.11758,58.712963],[50.119146,58.713323],[50.119853,58.713497],[50.120527,58.713677],[50.122639,58.714191],[50.123826,58.714448],[50.124354,58.714623],[50.125636,58.715087],[50.126394,58.715373],[50.126965,58.71561],[50.128329,58.716242],[50.128855,58.716485],[50.129787,58.716885],[50.130345,58.717113],[50.132508,58.718015],[50.132998,58.718192],[50.134117,58.71859],[50.134373,58.718663],[50.135297,58.718888],[50.136408,58.719105],[50.13944,58.719644],[50.139691,58.719691],[50.140478,58.719864],[50.141739,58.72023],[50.143518,58.720814],[50.144374,58.72111],[50.144464,58.721141],[50.145592,58.721521],[50.145733,58.721576],[50.146367,58.721753],[50.147908,58.722014],[50.148487,58.72208],[50.149412,58.722154],[50.149941,58.722221],[50.151459,58.722412],[50.151859,58.722502],[50.152608,58.722702],[50.152808,58.722755],[50.15417,58.72325],[50.155798,58.72378],[50.155874,58.723797],[50.156029,58.723833],[50.156739,58.723886],[50.156933,58.72389],[50.158544,58.723922],[50.159006,58.72393],[50.159138,58.723933],[50.159982,58.723945],[50.160424,58.723952],[50.160492,58.723953],[50.160545,58.723954],[50.161303,58.723966],[50.162473,58.723985],[50.163568,58.724003],[50.164045,58.724011],[50.164137,58.724012],[50.165899,58.724041],[50.166109,58.724044],[50.166973,58.724058],[50.167265,58.724063],[50.167908,58.724074],[50.170118,58.724106],[50.171751,58.72413],[50.174277,58.724167],[50.174936,58.724177],[50.175617,58.724189],[50.176512,58.724205],[50.176774,58.72421],[50.17847,58.724241],[50.179968,58.724268],[50.180854,58.724284],[50.181444,58.724295],[50.181736,58.7243],[50.182887,58.724315],[50.183416,58.724322],[50.18443,58.724335],[50.185253,58.724345],[50.187095,58.724366],[50.18899,58.724448],[50.196571,58.724855],[50.19801,58.724946],[50.198568,58.72498],[50.199147,58.725017],[50.202108,58.725203],[50.203457,58.725294],[50.203837,58.725315],[50.204431,58.725348],[50.20468,58.72536],[50.206341,58.725441],[50.210374,58.725679],[50.215086,58.725968],[50.220187,58.726273],[50.225153,58.726582],[50.235632,58.727239],[50.243186,58.727703],[50.247721,58.727986],[50.251204,58.728285],[50.254014,58.728663],[50.257041,58.729168],[50.258112,58.729347],[50.269952,58.73104],[50.272732,58.731434],[50.273285,58.731513],[50.280035,58.732509],[50.283362,58.733015],[50.284172,58.733172],[50.28504,58.733425],[50.285572,58.73358],[50.287088,58.734146],[50.2901,58.735969],[50.291748,58.736967],[50.292567,58.737485],[50.295802,58.739445],[50.297709,58.740599],[50.297929,58.740742],[50.298043,58.740812],[50.301,58.742612],[50.301442,58.742897],[50.302218,58.743369],[50.303264,58.744033],[50.305898,58.745674],[50.306883,58.746276],[50.309016,58.747577],[50.309583,58.747923],[50.309905,58.748132],[50.311906,58.749373],[50.312651,58.749843],[50.312726,58.749888],[50.312846,58.749961],[50.314169,58.750764],[50.314861,58.751154],[50.315307,58.751346],[50.31572,58.751474],[50.316701,58.751697],[50.321946,58.75234],[50.322452,58.752476],[50.322694,58.752595],[50.322951,58.752801],[50.323221,58.753322],[50.323681,58.754062],[50.324398,58.754949],[50.325888,58.756309],[50.326609,58.756805],[50.327215,58.757138],[50.328251,58.757604],[50.328893,58.75794],[50.329387,58.758242],[50.329946,58.758675],[50.330719,58.759567],[50.332169,58.761421],[50.332961,58.762413],[50.333463,58.762774],[50.334024,58.763064],[50.334855,58.763285],[50.340086,58.764059],[50.346063,58.764928],[50.351261,58.76568],[50.358442,58.766682],[50.360191,58.766932],[50.361961,58.767205],[50.362948,58.76739],[50.363615,58.767553],[50.364307,58.767777],[50.367185,58.768936],[50.372248,58.77089],[50.376499,58.772543],[50.380132,58.773996],[50.381562,58.774547],[50.383669,58.775028],[50.38734,58.775869],[50.39335,58.777171],[50.401273,58.778864],[50.402928,58.77922],[50.403906,58.77943],[50.406723,58.780036],[50.41177,58.78112],[50.413365,58.781462],[50.414213,58.781623],[50.414912,58.781715],[50.415621,58.781782],[50.416349,58.781826],[50.417741,58.781855],[50.419905,58.781876],[50.422351,58.781878],[50.424243,58.781899],[50.424268,58.781899],[50.425437,58.781905],[50.4263,58.781903],[50.427296,58.781887],[50.427648,58.781882],[50.428633,58.781847],[50.429526,58.781807],[50.430586,58.781742],[50.431467,58.781675],[50.432327,58.781586],[50.433626,58.781431],[50.434992,58.78124],[50.436134,58.781051],[50.438051,58.780708],[50.440841,58.780228],[50.441969,58.780072],[50.443155,58.779902],[50.444195,58.779806],[50.444768,58.779777],[50.445043,58.779763],[50.445784,58.779753],[50.447372,58.779759],[50.45128,58.77989],[50.458579,58.780137],[50.465725,58.780374],[50.472199,58.780551],[50.480649,58.780817],[50.483167,58.780876],[50.483924,58.780952],[50.485475,58.781165],[50.487126,58.781594],[50.490406,58.782521],[50.492963,58.783258],[50.493505,58.783414],[50.49766,58.784521],[50.503293,58.786048],[50.50892,58.787626],[50.511065,58.78837],[50.512517,58.789039],[50.514625,58.790101],[50.517005,58.791308],[50.518201,58.791922],[50.520074,58.792883],[50.52412,58.794961],[50.529133,58.79752],[50.532145,58.799049],[50.534426,58.800209],[50.53681,58.801433],[50.536822,58.801439],[50.537932,58.80201],[50.538188,58.802148],[50.538731,58.80244],[50.53886,58.802522],[50.539168,58.802717],[50.539636,58.803015],[50.540849,58.803744],[50.541642,58.80417],[50.541713,58.804197],[50.542104,58.804341],[50.54344,58.804711],[50.545472,58.805298],[50.546912,58.805677],[50.547827,58.805845],[50.549996,58.806162],[50.560709,58.807743],[50.567382,58.808695],[50.572119,58.80938],[50.5732,58.809595],[50.574152,58.809815],[50.575163,58.810099],[50.576295,58.810455],[50.577608,58.810925],[50.58034,58.811958],[50.582696,58.812852],[50.585674,58.813957],[50.591755,58.81624],[50.592914,58.816657],[50.593834,58.816944],[50.594718,58.817166],[50.595821,58.817396],[50.599121,58.818059],[50.602393,58.818778],[50.60357,58.819074],[50.604775,58.819417],[50.607875,58.820378],[50.613491,58.82211],[50.616286,58.822967],[50.618546,58.823687],[50.620546,58.824304],[50.625354,58.825801],[50.628341,58.826821],[50.630828,58.827723],[50.633061,58.828535],[50.634442,58.82903],[50.635096,58.829195],[50.635775,58.829291],[50.636515,58.829338],[50.639536,58.82938],[50.645697,58.829457],[50.651995,58.829565],[50.653236,58.829586],[50.656804,58.829608],[50.657047,58.829609],[50.657657,58.829619],[50.659083,58.829643],[50.666535,58.829757],[50.668462,58.829703],[50.669411,58.829637],[50.670425,58.829516],[50.671751,58.829217],[50.671983,58.829164],[50.673248,58.828896],[50.67415,58.82877],[50.675231,58.828734],[50.676512,58.828755],[50.677803,58.828802],[50.678338,58.828847],[50.678756,58.828922],[50.679218,58.82903],[50.679723,58.829213],[50.680321,58.829481],[50.684209,58.83129],[50.689054,58.833552],[50.689537,58.833783],[50.689831,58.833949],[50.690016,58.834098],[50.690134,58.834269],[50.690162,58.834494],[50.690129,58.834669],[50.690017,58.83484],[50.689858,58.835028],[50.688602,58.836119],[50.6879,58.836729],[50.687461,58.837108],[50.687203,58.837353],[50.687039,58.837532],[50.686929,58.837691],[50.686836,58.837866],[50.68679,58.838008],[50.686766,58.838171],[50.686771,58.838353],[50.686814,58.838503],[50.68689,58.838679],[50.687441,58.839619],[50.687935,58.840382],[50.688098,58.840576],[50.688343,58.840818],[50.688671,58.841063],[50.689173,58.841335],[50.689694,58.841539],[50.690276,58.841693],[50.69073,58.84177],[50.691179,58.841828],[50.691643,58.841853],[50.692249,58.841853],[50.694337,58.841775],[50.694914,58.841758],[50.695442,58.841779],[50.695906,58.841825],[50.696555,58.84196],[50.697122,58.84212],[50.699188,58.842821],[50.703768,58.844271],[50.704251,58.844423],[50.705131,58.844727],[50.705973,58.845017],[50.708118,58.84565],[50.713961,58.847304],[50.715833,58.847891],[50.717819,58.848604],[50.724869,58.851148],[50.728541,58.85246],[50.729088,58.852652],[50.72944,58.85276],[50.729719,58.85284],[50.73005,58.85291],[50.730333,58.852957],[50.730617,58.852994],[50.730943,58.853016],[50.731218,58.853024],[50.731527,58.853014],[50.731812,58.852989],[50.732197,58.852935],[50.732579,58.852872],[50.740854,58.851398],[50.753304,58.849226],[50.756201,58.848754],[50.756954,58.848586],[50.757611,58.848414],[50.758438,58.848156],[50.759899,58.847542],[50.761837,58.846617],[50.763746,58.845732],[50.765242,58.845017],[50.766455,58.844468],[50.768815,58.843651],[50.771869,58.842606],[50.77317,58.842181],[50.774498,58.841778],[50.776983,58.841147],[50.77989,58.840406],[50.780712,58.840277],[50.781432,58.840231],[50.782189,58.840249],[50.782997,58.840332],[50.791319,58.841231],[50.797769,58.841889],[50.803176,58.842446],[50.804396,58.84263],[50.805132,58.84278],[50.811958,58.84456],[50.814452,58.845201],[50.815291,58.845417],[50.815862,58.845555],[50.817313,58.845905],[50.817829,58.846048],[50.818759,58.846284],[50.820285,58.84667],[50.821117,58.846885],[50.821381,58.846953],[50.821751,58.847049],[50.821935,58.847101],[50.82249,58.847256],[50.823388,58.847477],[50.823634,58.847538],[50.824267,58.847701],[50.82443,58.847743],[50.824945,58.84787],[50.825398,58.847983],[50.82569,58.848069],[50.825962,58.848148],[50.826282,58.848282],[50.826575,58.848446],[50.826979,58.848754],[50.828229,58.849826],[50.828245,58.849841],[50.828406,58.849981],[50.828549,58.850106],[50.828769,58.850298],[50.829417,58.850835],[50.82952,58.850917],[50.830033,58.851324],[50.830202,58.851459],[50.831202,58.852002],[50.832036,58.852396],[50.833417,58.852969],[50.834242,58.85322],[50.835886,58.853616],[50.836886,58.853874],[50.83705,58.853927],[50.837419,58.854048],[50.837731,58.854188],[50.837956,58.854306],[50.838097,58.854407],[50.838359,58.854657],[50.838583,58.854932],[50.839181,58.855665],[50.839675,58.856287],[50.840438,58.857339],[50.840561,58.857509],[50.841044,58.85808],[50.84153,58.858655],[50.841741,58.858923],[50.842005,58.859246],[50.842237,58.85977],[50.842292,58.860011],[50.842476,58.860661],[50.842599,58.861097],[50.84266,58.861556],[50.842643,58.861716],[50.842613,58.861987],[50.842498,58.862355],[50.842172,58.863518],[50.842159,58.86397],[50.84222,58.864524],[50.842655,58.866046],[50.843194,58.867865],[50.843264,58.868101],[50.843446,58.868707],[50.843575,58.869013],[50.843722,58.869315],[50.843926,58.869654],[50.844198,58.869898],[50.844693,58.870147],[50.845851,58.870624],[50.845902,58.870645],[50.845953,58.870667],[50.846162,58.870752],[50.846814,58.871021],[50.848292,58.871633],[50.849145,58.871986],[50.849721,58.872224],[50.850733,58.872618],[50.851241,58.872762],[50.851986,58.872902],[50.853003,58.87299],[50.856955,58.873134],[50.857651,58.873207],[50.858376,58.873337],[50.859007,58.873522],[50.859623,58.873778],[50.861114,58.874567],[50.861948,58.875009],[50.86527,58.87676],[50.868969,58.878602],[50.870611,58.879396],[50.870899,58.879567],[50.871145,58.879781],[50.871542,58.880351],[50.873223,58.884295],[50.874203,58.886655],[50.87491,58.88836],[50.875659,58.89013],[50.875744,58.890372],[50.875852,58.89058],[50.875947,58.890764],[50.876005,58.890839],[50.876157,58.891037],[50.876461,58.891299],[50.877214,58.891667],[50.877797,58.891825],[50.87903,58.892094],[50.881578,58.89263],[50.881917,58.892701],[50.882518,58.892795],[50.884783,58.893148],[50.888061,58.893633],[50.894032,58.894524],[50.897541,58.894837],[50.915121,58.89627],[50.917442,58.896499],[50.91888,58.896703],[50.920481,58.897019],[50.921656,58.897327],[50.940681,58.903962],[50.942002,58.904423],[50.942563,58.904612],[50.943058,58.904739],[50.943544,58.904831],[50.944149,58.904898],[50.944537,58.904917],[50.945018,58.904922],[50.945427,58.904887],[50.945951,58.904815],[50.946543,58.904684],[50.947278,58.904508],[50.948222,58.904238],[50.948674,58.904129],[50.94966,58.903889],[50.950384,58.90377],[50.950999,58.903695],[50.951751,58.903695],[50.953266,58.903856],[50.956137,58.904276],[50.983846,58.908336],[50.986021,58.908621],[50.987038,58.908659],[50.98822,58.908652],[50.99055,58.908541],[51.008889,58.907153],[51.028137,58.905648],[51.03057,58.905458],[51.032736,58.905312],[51.0336,58.905295],[51.034549,58.905391],[51.036402,58.905731],[51.05694,58.909585],[51.068306,58.911724],[51.07138,58.912295],[51.093796,58.916542],[51.109119,58.919595],[51.114899,58.920774],[51.116002,58.920937],[51.117094,58.920968],[51.117789,58.920919],[51.118666,58.920802],[51.14195,58.917028],[51.166463,58.913019],[51.167468,58.912825],[51.168495,58.912595],[51.169331,58.912344],[51.17039,58.911956],[51.178944,58.908548],[51.18657,58.905577],[51.186976,58.905414],[51.188676,58.904687],[51.189639,58.904333],[51.190621,58.904058],[51.191426,58.903913],[51.192849,58.903769],[51.194171,58.903703],[51.195068,58.903699],[51.196336,58.90374],[51.199051,58.903982],[51.200807,58.904138],[51.221405,58.905974],[51.224548,58.906262],[51.24637,58.908257],[51.247402,58.908281],[51.248571,58.908137],[51.251146,58.907748],[51.289182,58.902044],[51.305853,58.899451],[51.312225,58.898498],[51.316236,58.897911],[51.317812,58.897649],[51.321244,58.896817],[51.341175,58.891939],[51.342179,58.891782],[51.348404,58.891081],[51.382145,58.887274],[51.422607,58.882543],[51.443806,58.880093],[51.462551,58.877885],[51.463856,58.877728],[51.465017,58.877596],[51.4678,58.877324],[51.477543,58.876527],[51.481964,58.876092],[51.484183,58.875758],[51.488148,58.875026],[51.490153,58.874758],[51.492203,58.874603],[51.502199,58.873939],[51.508496,58.873489],[51.509486,58.873394],[51.515094,58.872927],[51.519237,58.872583],[51.52336,58.872221],[51.528661,58.87167],[51.53618,58.870867],[51.53799,58.870674],[51.544135,58.86999],[51.545218,58.869869],[51.552791,58.869046],[51.558096,58.86848],[51.561882,58.868088],[51.563189,58.867904],[51.574056,58.865944],[51.575653,58.865645],[51.577308,58.865391],[51.587587,58.864057],[51.600572,58.862382],[51.612267,58.860897],[51.614048,58.860671],[51.626465,58.859006],[51.628941,58.858669],[51.629191,58.858655],[51.629851,58.85863],[51.63387,58.858668],[51.637628,58.858739],[51.639358,58.858725],[51.63998,58.858721],[51.651897,58.858821],[51.663332,58.858896],[51.680099,58.858991],[51.686871,58.859032],[51.689679,58.859058],[51.690447,58.859059],[51.693321,58.859081],[51.695622,58.859053],[51.697639,58.858958],[51.698216,58.85893],[51.703475,58.858655],[51.705704,58.85853],[51.708916,58.85835],[51.709748,58.85831],[51.713773,58.858116],[51.716124,58.857973],[51.717161,58.857835],[51.718343,58.857639],[51.719949,58.857223],[51.722502,58.856538],[51.72872,58.85487],[51.734236,58.853389],[51.735987,58.8529],[51.736149,58.852842],[51.736735,58.852666],[51.738001,58.852111],[51.739342,58.851427],[51.739744,58.851186],[51.740526,58.850717],[51.741311,58.850128],[51.741989,58.849472],[51.744547,58.846833],[51.752096,58.839096],[51.758138,58.832877],[51.758906,58.83209],[51.759272,58.831756],[51.759818,58.831384],[51.760446,58.830998],[51.760992,58.830725],[51.761938,58.83032],[51.762985,58.829981],[51.764086,58.829712],[51.765246,58.82948],[51.781167,58.826446],[51.786496,58.825431],[51.805629,58.821743],[51.806846,58.821486],[51.80812,58.821165],[51.80938,58.820771],[51.83354,58.81147],[51.849431,58.805438],[51.869561,58.797731],[51.889699,58.790016],[51.904779,58.78425],[51.919861,58.778447],[51.924008,58.776849],[51.925537,58.776336],[51.926484,58.776064],[51.927547,58.775838],[51.929295,58.775517],[51.944621,58.772711],[51.944881,58.772664],[51.967681,58.768479],[51.969949,58.768059],[51.997562,58.762978],[52.012885,58.760153],[52.029332,58.757048],[52.03566,58.755914],[52.043823,58.754384],[52.04518,58.75411],[52.046545,58.753822],[52.05007,58.752755],[52.055736,58.750945],[52.056586,58.750646],[52.057823,58.750127],[52.059156,58.749413],[52.060077,58.748727],[52.061182,58.747682],[52.063862,58.744703],[52.06843,58.739805],[52.077347,58.730238],[52.0806,58.726732],[52.080869,58.726433],[52.085036,58.721936],[52.085872,58.721034],[52.086588,58.720374],[52.088757,58.71851],[52.091802,58.715961],[52.095689,58.712568],[52.0987,58.709974],[52.099493,58.709277],[52.100256,58.708636],[52.102007,58.707468],[52.103695,58.706445],[52.105749,58.705225],[52.109631,58.702963],[52.111296,58.702074],[52.113073,58.701259],[52.11349,58.701092],[52.116494,58.699892],[52.117155,58.699628],[52.117733,58.699403],[52.118171,58.699233],[52.118475,58.699114],[52.123063,58.697328],[52.124848,58.696633],[52.125699,58.696287],[52.126551,58.695886],[52.127236,58.695436],[52.128041,58.694811],[52.128887,58.694072],[52.129008,58.693964],[52.12947,58.693547],[52.130143,58.692967],[52.132324,58.69111],[52.136763,58.687257],[52.137637,58.686554],[52.138513,58.685953],[52.1394,58.685467],[52.141513,58.684427],[52.143313,58.683587],[52.143395,58.683548],[52.148248,58.685251],[52.149307,58.685645],[52.150914,58.686185],[52.151817,58.686464],[52.152464,58.686649],[52.1531,58.686775],[52.155708,58.687284],[52.155986,58.687337],[52.160921,58.68829],[52.163871,58.68886],[52.165087,58.689094],[52.165894,58.689217],[52.166465,58.689225],[52.167215,58.689203],[52.168792,58.689074],[52.169481,58.689045],[52.16982,58.689044],[52.170192,58.689058],[52.171106,58.689133],[52.173461,58.689323],[52.174534,58.689401],[52.175713,58.689414],[52.178208,58.689331],[52.178958,58.689316],[52.179865,58.689289],[52.181864,58.689228],[52.181997,58.689224],[52.18294,58.689196],[52.18325,58.689197],[52.184534,58.689203],[52.184904,58.689214],[52.186455,58.689274],[52.187596,58.689351],[52.187857,58.689388],[52.188521,58.689483],[52.189291,58.689632],[52.189898,58.689789],[52.191263,58.690338],[52.193152,58.691058],[52.194443,58.691621],[52.197505,58.692964],[52.198119,58.693184],[52.198465,58.693261],[52.199046,58.693333],[52.199427,58.693328],[52.200224,58.693271],[52.201279,58.693173],[52.202919,58.693021],[52.204454,58.692878],[52.205561,58.692771],[52.205604,58.692767],[52.20701,58.692654],[52.207038,58.692652],[52.208427,58.69253],[52.209698,58.692419],[52.209712,58.692417],[52.210266,58.692369],[52.212361,58.692185],[52.213435,58.692087],[52.213521,58.692079],[52.213579,58.692074],[52.216499,58.691828],[52.216627,58.691829],[52.216767,58.691853],[52.216869,58.691897],[52.216954,58.692004],[52.217123,58.692292],[52.217184,58.692396],[52.217245,58.6925],[52.217716,58.693301],[52.21797,58.693655],[52.218109,58.693849],[52.218126,58.693866],[52.218383,58.694143],[52.218757,58.694436],[52.219364,58.694791],[52.219459,58.694846],[52.219602,58.694924],[52.220274,58.695288],[52.220388,58.69535],[52.220778,58.695574],[52.221894,58.696217],[52.222548,58.696593],[52.222723,58.69669],[52.222754,58.696707],[52.222975,58.696828],[52.223274,58.696978],[52.223497,58.697079],[52.223636,58.697139],[52.223678,58.697157],[52.223703,58.697166],[52.223874,58.697224],[52.22405,58.697279],[52.224286,58.69734],[52.225016,58.697482],[52.226618,58.697785],[52.228221,58.698089],[52.233081,58.699014],[52.234097,58.699228],[52.236228,58.699801],[52.236612,58.699904],[52.236713,58.699931],[52.23851,58.700414],[52.239146,58.700609],[52.239781,58.700803],[52.240504,58.701099],[52.241185,58.701489],[52.242019,58.702067],[52.243103,58.702782],[52.243938,58.703164],[52.245077,58.703629],[52.254957,58.70752],[52.255602,58.707764],[52.256262,58.707935],[52.256679,58.708016],[52.257093,58.708052],[52.257461,58.708058],[52.257824,58.70804],[52.258236,58.707997],[52.258666,58.707938],[52.259117,58.707872],[52.259589,58.707789],[52.260386,58.707622],[52.261208,58.707483],[52.263012,58.707258],[52.263952,58.707219],[52.264874,58.707188],[52.26564,58.707221],[52.266389,58.707283],[52.267836,58.707459],[52.268914,58.707637],[52.270199,58.707879],[52.271436,58.708183],[52.272503,58.708507],[52.273926,58.709164],[52.274042,58.709217],[52.274272,58.709323],[52.278409,58.711418],[52.284031,58.714233],[52.285788,58.714989],[52.286763,58.715325],[52.287248,58.715457],[52.288138,58.715598],[52.291163,58.715857],[52.295629,58.71617],[52.296451,58.716174],[52.297376,58.716119],[52.298394,58.715975],[52.29954,58.715757],[52.311635,58.713242],[52.312402,58.71311],[52.312813,58.713051],[52.313285,58.712999],[52.313806,58.712965],[52.314209,58.712938],[52.315141,58.712913],[52.316953,58.712863],[52.31794,58.71285],[52.322658,58.712786],[52.323546,58.712774],[52.324242,58.712827],[52.326756,58.713309],[52.326764,58.713311],[52.327392,58.713471],[52.327759,58.713616],[52.328062,58.713794],[52.328266,58.713927],[52.328369,58.713994],[52.328844,58.714361],[52.329016,58.714514],[52.329504,58.714948],[52.329615,58.715032],[52.32982,58.715187],[52.330155,58.715439],[52.33113,58.715994],[52.331785,58.716278],[52.332352,58.716467],[52.33294,58.716645],[52.333684,58.716863],[52.334103,58.717006],[52.334547,58.717195],[52.334878,58.71744],[52.335099,58.717767],[52.335195,58.718008],[52.335265,58.718328],[52.335243,58.718848],[52.335149,58.720737],[52.33474,58.725148],[52.334343,58.729518],[52.334431,58.729851],[52.334636,58.73022],[52.334992,58.730645],[52.335339,58.730987],[52.335775,58.731366],[52.338435,58.733504],[52.34264,58.736931],[52.344522,58.738476],[52.344913,58.738926],[52.345153,58.739323],[52.345366,58.739761],[52.345678,58.740705],[52.34574,58.741073],[52.345713,58.741442],[52.345607,58.741811],[52.345462,58.742169],[52.343669,58.745249],[52.343057,58.746375],[52.34283,58.746923],[52.341979,58.749639],[52.341774,58.750372],[52.341755,58.750729],[52.341817,58.751052],[52.341986,58.751477],[52.343112,58.753439],[52.343454,58.753752],[52.343979,58.754126],[52.344757,58.754537],[52.345007,58.754651],[52.345652,58.754943],[52.346871,58.755501],[52.349317,58.756494],[52.350426,58.756904],[52.353212,58.757564],[52.354497,58.757913],[52.355337,58.758222],[52.355871,58.758502],[52.356185,58.758688],[52.356418,58.7589],[52.356682,58.7592],[52.35728,58.759892],[52.357864,58.760613],[52.359448,58.762567],[52.360628,58.76431],[52.360889,58.7646],[52.361195,58.76484],[52.361707,58.765111],[52.362086,58.765294],[52.364533,58.766557],[52.365845,58.767301],[52.366502,58.767722],[52.366935,58.768108],[52.367677,58.768673],[52.370724,58.7711],[52.371469,58.771694],[52.371867,58.772011],[52.372553,58.772612],[52.372767,58.772799],[52.373186,58.773165],[52.378699,58.77747],[52.38671,58.783785],[52.393289,58.788971],[52.394176,58.789647],[52.397932,58.792512],[52.404429,58.79791],[52.405604,58.798827],[52.406497,58.799322],[52.407162,58.799639],[52.407354,58.799707],[52.407937,58.799931],[52.408559,58.800118],[52.409414,58.800337],[52.409868,58.800429],[52.41069,58.800568],[52.411891,58.800744],[52.414737,58.801154],[52.417633,58.801594],[52.423382,58.802473],[52.434876,58.8042],[52.460252,58.807993],[52.461405,58.808179],[52.46223,58.808254],[52.462997,58.808287],[52.463615,58.808284],[52.464215,58.808259],[52.465544,58.808173],[52.468622,58.807888],[52.479706,58.806863],[52.487772,58.806153],[52.492747,58.805696],[52.493007,58.805661],[52.493874,58.805546],[52.504647,58.803834],[52.510102,58.802966],[52.515504,58.802134],[52.522759,58.801016],[52.524191,58.800811],[52.526032,58.80064],[52.527891,58.800583],[52.529816,58.800612],[52.549286,58.801108],[52.556711,58.801268],[52.574876,58.801658],[52.579171,58.80175],[52.580411,58.801794],[52.581655,58.801835],[52.582091,58.801875],[52.582809,58.801985],[52.583368,58.802095],[52.583914,58.80225],[52.584412,58.802419],[52.584837,58.802586],[52.585369,58.802865],[52.58586,58.803174],[52.586638,58.803798],[52.588972,58.805972],[52.590596,58.807531],[52.591095,58.808107],[52.591365,58.80852],[52.591604,58.808976],[52.591792,58.809566],[52.591931,58.810126],[52.591895,58.810996],[52.591711,58.812045],[52.591159,58.813827],[52.590992,58.81468],[52.590945,58.815202],[52.591,58.815631],[52.591124,58.816095],[52.591351,58.816705],[52.591746,58.817437],[52.592178,58.818027],[52.592764,58.818657],[52.593235,58.819062],[52.594042,58.81965],[52.59494,58.820158],[52.595953,58.820648],[52.597317,58.821196],[52.599293,58.821996],[52.605971,58.824636],[52.607174,58.825073],[52.608223,58.825388],[52.609227,58.825663],[52.61034,58.825913],[52.611365,58.8261],[52.612623,58.826271],[52.613792,58.826367],[52.619859,58.826726],[52.623544,58.826949],[52.624657,58.827002],[52.626138,58.827079],[52.628098,58.827216],[52.629184,58.827321],[52.630261,58.827459],[52.631176,58.827598],[52.632229,58.827815],[52.643095,58.830189],[52.646409,58.830913],[52.649812,58.831652],[52.651154,58.8319],[52.652544,58.83215],[52.654834,58.832501],[52.656839,58.832756],[52.665309,58.833738],[52.669672,58.834284],[52.679748,58.835656],[52.683079,58.83611],[52.68314,58.836118],[52.685343,58.836312],[52.687331,58.836429],[52.689083,58.836478],[52.690261,58.836463],[52.691556,58.836422],[52.692441,58.836342],[52.692551,58.836332],[52.693437,58.836229],[52.69437,58.836098],[52.695387,58.835937],[52.696367,58.835754],[52.697168,58.835576],[52.70232,58.834177],[52.706016,58.83313],[52.708071,58.832422],[52.714161,58.830201],[52.716476,58.829402],[52.717823,58.828987],[52.719475,58.828523],[52.72605,58.826808],[52.727378,58.8265],[52.728055,58.826369],[52.730977,58.825858],[52.748321,58.823862],[52.754541,58.823147],[52.765652,58.821814],[52.771896,58.82124],[52.776077,58.820907],[52.778244,58.820735],[52.781581,58.820643],[52.782783,58.820609],[52.784786,58.820518],[52.785465,58.820504],[52.801783,58.820085],[52.803033,58.82005],[52.805648,58.819729],[52.808111,58.819314],[52.808836,58.819133],[52.809525,58.818926],[52.810141,58.818699],[52.810799,58.818393],[52.817037,58.814957],[52.823362,58.811545],[52.831278,58.807277],[52.836106,58.804607],[52.841475,58.80169],[52.850565,58.796781],[52.851128,58.796484],[52.851857,58.796172],[52.85243,58.795978],[52.853368,58.795736],[52.85443,58.795509],[52.855311,58.795321],[52.856544,58.795157],[52.873192,58.793818],[52.875813,58.793608],[52.876772,58.793585],[52.877767,58.793596],[52.878733,58.793682],[52.879643,58.793808],[52.885099,58.795015],[52.885332,58.795066],[52.886874,58.795408],[52.887094,58.795466],[52.88818,58.795752],[52.888529,58.795861],[52.888594,58.795881],[52.8894,58.796143],[52.890507,58.796502],[52.892073,58.7971],[52.892657,58.797323],[52.893098,58.797459],[52.893378,58.797545],[52.894713,58.797956],[52.895504,58.798175],[52.897017,58.798594],[52.903603,58.800419],[52.907434,58.80145],[52.91152,58.802485],[52.912594,58.802836],[52.913718,58.803322],[52.926339,58.80924],[52.927185,58.809593],[52.929587,58.810323],[52.94353,58.814103],[52.945687,58.814687],[52.961689,58.819104],[52.968899,58.821059],[52.990339,58.825072],[52.993028,58.825589],[52.997667,58.826456],[52.997824,58.826487],[53.002525,58.827413],[53.009045,58.828759],[53.013726,58.82966],[53.017942,58.830475],[53.02092,58.831031],[53.025762,58.831841],[53.02685,58.832046],[53.028511,58.83231],[53.030234,58.832626],[53.033187,58.833202],[53.036644,58.833884],[53.040404,58.834562],[53.043872,58.835214],[53.047714,58.835915],[53.050033,58.836384],[53.051228,58.836578],[53.052431,58.836832],[53.059849,58.838229],[53.069374,58.840014],[53.071781,58.840517],[53.072808,58.840739],[53.073522,58.840929],[53.074101,58.841139],[53.074758,58.84139],[53.075282,58.841657],[53.077126,58.842716],[53.078307,58.843387],[53.078848,58.843718],[53.07924,58.843947],[53.08448,58.846915],[53.088647,58.849293],[53.089989,58.85003],[53.090616,58.850413],[53.091156,58.850704],[53.092243,58.851356],[53.101003,58.856369],[53.102348,58.857131],[53.103233,58.857616],[53.103927,58.85801],[53.104528,58.858281],[53.105122,58.858494],[53.106756,58.858923],[53.11205,58.860072],[53.116017,58.860904],[53.119981,58.861735],[53.122935,58.862344],[53.130239,58.863873],[53.132529,58.864319],[53.13329,58.864448],[53.134029,58.864534],[53.134587,58.864567],[53.13866,58.864542],[53.142911,58.864576],[53.14698,58.864561],[53.148872,58.864546],[53.150694,58.864519],[53.151597,58.864474],[53.152059,58.864444],[53.152769,58.864362],[53.15361,58.864213],[53.159322,58.86302],[53.1631,58.862249],[53.172021,58.860412],[53.173124,58.860186],[53.174518,58.859901],[53.176119,58.859579],[53.179091,58.858927],[53.180811,58.858583],[53.182646,58.858217],[53.182913,58.858161],[53.185775,58.857568],[53.186255,58.857468],[53.188706,58.856958],[53.193104,58.856024],[53.194096,58.855833],[53.194867,58.855691],[53.195569,58.855582],[53.196542,58.85543],[53.197136,58.855347],[53.19777,58.855272],[53.198338,58.855215],[53.199566,58.855112],[53.200642,58.855038],[53.203843,58.854858],[53.206933,58.854701],[53.20957,58.854549],[53.210774,58.854484],[53.211182,58.854454],[53.211518,58.854414],[53.211844,58.854357],[53.212122,58.8543],[53.212345,58.85425],[53.212816,58.854119],[53.21312,58.85403],[53.214727,58.85349],[53.215791,58.853125],[53.216269,58.852961],[53.217558,58.852558],[53.21791,58.852473],[53.218309,58.8524],[53.218613,58.852354],[53.218999,58.852317],[53.219378,58.852287],[53.219661,58.852268],[53.220106,58.852257],[53.220507,58.852253],[53.220908,58.852265],[53.221249,58.852284],[53.221661,58.852315],[53.222092,58.852351],[53.224332,58.852705],[53.227353,58.853182],[53.227584,58.85322],[53.235668,58.854518],[53.237175,58.854765],[53.2386,58.855021],[53.240936,58.855434],[53.242457,58.855718],[53.242791,58.85578],[53.242965,58.855813],[53.243236,58.855859],[53.244,58.85599],[53.244225,58.856021],[53.244392,58.856032],[53.244571,58.856023],[53.244743,58.856006],[53.245283,58.855922],[53.245575,58.855877],[53.246328,58.85576],[53.246467,58.855738],[53.248486,58.85544],[53.248987,58.855368],[53.250419,58.855165],[53.25369,58.854687],[53.256913,58.854231],[53.258759,58.853953],[53.259036,58.853907],[53.259446,58.853835],[53.259831,58.853753],[53.260222,58.853652],[53.260558,58.85355],[53.26094,58.853412],[53.262544,58.852782],[53.264383,58.852074],[53.264817,58.851936],[53.265081,58.851869],[53.265403,58.8518],[53.266201,58.851658],[53.267861,58.851392],[53.268149,58.851364],[53.268616,58.851325],[53.269457,58.851272],[53.27021,58.85123],[53.271903,58.851149],[53.274913,58.851058],[53.27586,58.851029],[53.276347,58.851006],[53.277824,58.850915],[53.279151,58.850828],[53.281607,58.850651],[53.283804,58.850489],[53.285383,58.850385],[53.286443,58.850316],[53.287212,58.850263],[53.28785,58.850208],[53.288324,58.850146],[53.288877,58.850053],[53.289204,58.850008],[53.289591,58.849966],[53.290168,58.849915],[53.290853,58.849847],[53.291579,58.849752],[53.29274,58.8496],[53.293213,58.849538],[53.293985,58.849439],[53.294251,58.849401],[53.294436,58.849375],[53.29487,58.849301],[53.295191,58.849229],[53.295493,58.849148],[53.295827,58.849031],[53.296097,58.848929],[53.296404,58.848786],[53.296687,58.848651],[53.296943,58.848511],[53.297188,58.848348],[53.297346,58.848225],[53.29743,58.848142],[53.297605,58.847966],[53.297835,58.847694],[53.299244,58.845923],[53.300381,58.844483],[53.300578,58.844237],[53.300947,58.843655],[53.301362,58.842998],[53.301634,58.842565],[53.3018,58.842285],[53.301927,58.842016],[53.302263,58.841234],[53.302581,58.840508],[53.302996,58.839631],[53.303421,58.838777],[53.304948,58.835534],[53.305214,58.835032],[53.305536,58.834488],[53.307655,58.831115],[53.309922,58.827552],[53.310116,58.827257],[53.310443,58.826758],[53.310515,58.826648],[53.310731,58.826289],[53.311087,58.825647],[53.311246,58.82536],[53.311341,58.825133],[53.311491,58.824766],[53.311632,58.824421],[53.312013,58.823022],[53.312134,58.822625],[53.312306,58.822147],[53.312586,58.821662],[53.312932,58.82116],[53.313118,58.8209],[53.313461,58.820632],[53.313705,58.820434],[53.314053,58.820187],[53.314459,58.81993],[53.315073,58.819585],[53.315955,58.819166],[53.316904,58.818826],[53.317922,58.818533],[53.31844,58.818401],[53.318954,58.818296],[53.324334,58.817381],[53.32671,58.816937],[53.328772,58.816646],[53.329794,58.816557],[53.330094,58.816548],[53.330872,58.816524],[53.332144,58.816563],[53.333039,58.816621],[53.333707,58.816694],[53.33462,58.816857],[53.336604,58.817272],[53.341935,58.818452],[53.34903,58.819984],[53.352037,58.820647],[53.359287,58.822245],[53.363213,58.823085],[53.367325,58.823992],[53.369478,58.824492],[53.372133,58.82514],[53.374113,58.825635],[53.375077,58.825862],[53.377229,58.826448],[53.377811,58.826604],[53.379756,58.827126],[53.382398,58.827806],[53.384263,58.828305],[53.385301,58.828584],[53.38603,58.828762],[53.386851,58.82894],[53.387826,58.829145],[53.388768,58.829259],[53.39058,58.829449],[53.393411,58.829736],[53.396554,58.830068],[53.399287,58.830387],[53.401099,58.830564],[53.402812,58.830691],[53.403539,58.830714],[53.404229,58.830766],[53.405063,58.830777],[53.406248,58.830783],[53.407262,58.8307],[53.408115,58.8306],[53.408895,58.830503],[53.409865,58.830326],[53.411014,58.829986],[53.412406,58.829448],[53.415018,58.828473],[53.415817,58.828243],[53.417132,58.827973],[53.418147,58.827801],[53.420969,58.827453],[53.422973,58.827192],[53.424122,58.827072],[53.424907,58.827026],[53.425548,58.826999],[53.426349,58.826993],[53.42736,58.827027],[53.428434,58.827087],[53.429528,58.827216],[53.431172,58.827434],[53.439346,58.828666],[53.439848,58.828742],[53.442021,58.829057],[53.443961,58.829376],[53.455545,58.831152],[53.46163,58.83207],[53.463621,58.832399],[53.464741,58.832562],[53.466045,58.832765],[53.46771,58.833022],[53.469127,58.833203],[53.470288,58.83332],[53.471642,58.83343],[53.472867,58.83352],[53.474435,58.833591],[53.476297,58.83363],[53.479432,58.833651],[53.484487,58.833704],[53.487083,58.833716],[53.490015,58.833749],[53.491986,58.833779],[53.494495,58.833809],[53.495715,58.833811],[53.497046,58.833779],[53.498361,58.833725],[53.49886,58.833694],[53.5002,58.833596],[53.502344,58.833362],[53.504018,58.83315],[53.507052,58.832763],[53.507865,58.832667],[53.515097,58.831688],[53.518946,58.831201],[53.522576,58.830712],[53.52579,58.830307],[53.528508,58.82993],[53.529853,58.82974],[53.53095,58.829529],[53.531754,58.829323],[53.532514,58.829119],[53.533322,58.828852],[53.534148,58.828515],[53.534939,58.82817],[53.542311,58.82439],[53.545081,58.822976],[53.546778,58.822088],[53.548038,58.821449],[53.548971,58.821035],[53.549578,58.820763],[53.550377,58.820469],[53.551152,58.820205],[53.55207,58.819977],[53.552996,58.819781],[53.553936,58.819632],[53.555602,58.819409],[53.55896,58.818992],[53.562438,58.81856],[53.569672,58.817674],[53.574669,58.817065],[53.576675,58.816829],[53.578374,58.816583],[53.579779,58.816348],[53.580952,58.816128],[53.582379,58.815846],[53.584092,58.815446],[53.585478,58.81506],[53.586428,58.814775],[53.587967,58.814301],[53.588495,58.814123],[53.589562,58.813734],[53.590468,58.8134],[53.591263,58.813127],[53.591823,58.8129],[53.592196,58.812737],[53.592573,58.812557],[53.593042,58.81232],[53.593377,58.812135],[53.593704,58.81193],[53.59405,58.811677],[53.594332,58.811447],[53.594819,58.810964],[53.595403,58.81024],[53.595609,58.809836],[53.595826,58.809256],[53.596132,58.80777],[53.596381,58.806236],[53.596587,58.805071],[53.596987,58.802937],[53.597155,58.801894],[53.597185,58.801689],[53.597292,58.800968],[53.597572,58.799491],[53.597739,58.798635],[53.597846,58.798162],[53.598163,58.79744],[53.598451,58.796863],[53.598743,58.796167],[53.599372,58.794801],[53.600132,58.793203],[53.601097,58.791118],[53.602034,58.789048],[53.60394,58.784927],[53.60464,58.783424],[53.60496,58.782738],[53.605806,58.78085],[53.606445,58.779531],[53.607336,58.777598],[53.608224,58.775735],[53.608675,58.774685],[53.608926,58.774012],[53.609158,58.773326],[53.609378,58.772409],[53.609575,58.771287],[53.60963,58.770812],[53.609657,58.770238],[53.609683,58.769544],[53.609715,58.768639],[53.609702,58.767238],[53.609727,58.765012],[53.609773,58.762787],[53.609812,58.761425],[53.609835,58.76063],[53.609858,58.758885],[53.609918,58.757949],[53.609949,58.756348],[53.609973,58.755136],[53.61,58.753752],[53.610076,58.752239],[53.610156,58.75177],[53.610315,58.751345],[53.610517,58.750977],[53.610786,58.750592],[53.611672,58.749627],[53.611717,58.749578],[53.616506,58.745117],[53.617943,58.743785],[53.619876,58.742007],[53.622168,58.739919],[53.623135,58.739029],[53.624804,58.737543],[53.625362,58.737146],[53.626036,58.736725],[53.626664,58.736392],[53.627616,58.73601],[53.628545,58.735695],[53.640455,58.732142],[53.651003,58.729005],[53.653726,58.728204],[53.654545,58.727926],[53.655294,58.727613],[53.655995,58.727277],[53.662786,58.723457],[53.662832,58.723431],[53.665534,58.72191],[53.672154,58.718171],[53.674061,58.717073],[53.674923,58.716585],[53.675772,58.716186],[53.676981,58.71575],[53.678357,58.715317],[53.680077,58.714828],[53.682735,58.714064],[53.683462,58.713854],[53.69497,58.710525],[53.700762,58.708861],[53.711696,58.705692],[53.712563,58.70546],[53.713456,58.705268],[53.714402,58.705123],[53.71531,58.70502],[53.71611,58.704977],[53.71723,58.704937],[53.718287,58.704908],[53.724911,58.704709],[53.725656,58.704685],[53.726736,58.704621],[53.7275,58.704541],[53.728185,58.704435],[53.728855,58.70431],[53.729689,58.704122],[53.730421,58.703904],[53.731188,58.703628],[53.731505,58.703499],[53.73186,58.703355],[53.73272,58.702949],[53.734809,58.701927],[53.736543,58.701066],[53.738485,58.700127],[53.740232,58.699223],[53.740914,58.698742],[53.741408,58.698377],[53.741917,58.69794],[53.742336,58.697487],[53.742731,58.696999],[53.743083,58.696457],[53.74334,58.695875],[53.743453,58.695499],[53.743573,58.694754],[53.743557,58.694261],[53.743529,58.693832],[53.743437,58.693435],[53.74317,58.692775],[53.74274,58.692068],[53.742204,58.691431],[53.741644,58.690899],[53.74024,58.689639],[53.739544,58.688963],[53.738866,58.688028],[53.738413,58.687156],[53.738147,58.686276],[53.738078,58.685721],[53.738051,58.685112],[53.738087,58.684651],[53.738277,58.683788],[53.738339,58.683492],[53.738666,58.68288],[53.739108,58.6821],[53.739603,58.681515],[53.740295,58.680843],[53.741147,58.680117],[53.747983,58.674873],[53.75481,58.669618],[53.760564,58.665162],[53.761599,58.664303],[53.766205,58.660826],[53.771691,58.656564],[53.773421,58.655302],[53.774695,58.65453],[53.776107,58.653851],[53.777562,58.653309],[53.778969,58.652864],[53.78344,58.65178],[53.788509,58.650627],[53.789853,58.650222],[53.791262,58.649729],[53.792551,58.649161],[53.793909,58.64839],[53.794683,58.647907],[53.795618,58.647154],[53.796811,58.645913],[53.798155,58.644345],[53.798829,58.643705],[53.799637,58.643011],[53.800679,58.642351],[53.801303,58.642],[53.802013,58.641675],[53.803359,58.641162],[53.804846,58.640723],[53.806365,58.640405],[53.807567,58.640209],[53.808994,58.640054],[53.811249,58.640014],[53.813702,58.640222],[53.820185,58.641121],[53.823688,58.641619],[53.826201,58.641842],[53.827962,58.641926],[53.829654,58.641962],[53.831275,58.641913],[53.832381,58.641868],[53.833421,58.641788],[53.834734,58.641634],[53.836207,58.641435],[53.837395,58.641229],[53.83884,58.640945],[53.840142,58.640637],[53.841522,58.640289],[53.843038,58.639829],[53.848506,58.637822],[53.85155,58.636691],[53.853456,58.635928],[53.85534,58.635079],[53.857393,58.634032],[53.857852,58.63378],[53.859653,58.632794],[53.860923,58.632081],[53.861072,58.632],[53.864908,58.629931],[53.867675,58.628426],[53.868518,58.627964],[53.869065,58.627636],[53.869571,58.6273],[53.869814,58.627138],[53.870511,58.626586],[53.870912,58.626236],[53.871338,58.625842],[53.871724,58.625377],[53.872098,58.624887],[53.872388,58.624407],[53.872657,58.623895],[53.872832,58.623479],[53.872974,58.623039],[53.873084,58.62223],[53.87309,58.621504],[53.872895,58.620395],[53.867627,58.608592],[53.867318,58.607417],[53.867238,58.606485],[53.867609,58.605254],[53.868003,58.604688],[53.868801,58.603656],[53.86995,58.602729],[53.872362,58.601264],[53.874637,58.599744],[53.876439,58.598132],[53.877823,58.596627],[53.878808,58.595277],[53.879518,58.593729],[53.883031,58.584391],[53.883752,58.582409],[53.884388,58.580699],[53.885823,58.576865],[53.886173,58.575974],[53.888072,58.571043],[53.88891,58.568855],[53.891911,58.561015],[53.892564,58.559525],[53.89347,58.558266],[53.894088,58.557477],[53.895149,58.556459],[53.897072,58.555067],[53.898591,58.554195],[53.903356,58.552059],[53.905432,58.551111],[53.907132,58.550176],[53.907996,58.549717],[53.909729,58.548657],[53.91088,58.547917],[53.911026,58.547823],[53.911141,58.547752],[53.915052,58.545312],[53.915463,58.545066],[53.920581,58.541938],[53.92245,58.541063],[53.925732,58.540023],[53.928376,58.539553],[53.929993,58.539348],[53.930724,58.539285],[53.931567,58.539221],[53.932555,58.539181],[53.933279,58.539181],[53.934027,58.539208],[53.934754,58.539248],[53.935453,58.539313],[53.936764,58.53944],[53.938623,58.53967],[53.93996,58.539839],[53.941536,58.540042],[53.944168,58.540398],[53.945077,58.540529],[53.946065,58.540656],[53.947707,58.540835],[53.948988,58.54095],[53.950464,58.540998],[53.951377,58.541005],[53.952668,58.540924],[53.954637,58.540763],[53.957986,58.540152],[53.961635,58.538917],[53.963077,58.53822],[53.963328,58.538098],[53.965069,58.537223],[53.966109,58.536707],[53.967234,58.536183],[53.969507,58.535032],[53.971791,58.533935],[53.974033,58.532817],[53.975725,58.531983],[53.97682,58.531465],[53.978375,58.530714],[53.980488,58.529665],[53.983096,58.528549],[53.984026,58.528203],[53.984619,58.527982],[53.985269,58.527764],[53.986087,58.527487],[53.987023,58.527195],[53.988723,58.526701],[53.989989,58.526374],[53.993623,58.525502],[53.996689,58.524569],[53.998378,58.524056],[54.002453,58.52248],[54.005986,58.520776],[54.014101,58.516963],[54.015223,58.516444],[54.015564,58.516286],[54.019231,58.514555],[54.022907,58.512999],[54.02765,58.511173],[54.028193,58.510964],[54.034533,58.508588],[54.035475,58.508235],[54.03879,58.506531],[54.041133,58.504904],[54.042881,58.503167],[54.044232,58.501432],[54.046835,58.497862],[54.049011,58.495578],[54.049635,58.49504],[54.050538,58.494261],[54.053215,58.492314],[54.055344,58.491032],[54.058679,58.489296],[54.062039,58.487857],[54.067161,58.486185],[54.069625,58.485499],[54.071767,58.485114],[54.071794,58.485111],[54.073881,58.484873],[54.07512,58.4848],[54.076585,58.484758],[54.077779,58.484793],[54.078966,58.484868],[54.079782,58.484943],[54.081037,58.4851],[54.084529,58.485616],[54.085296,58.485717],[54.093841,58.486993],[54.102943,58.488379],[54.110365,58.489483],[54.112667,58.489691],[54.114657,58.489782],[54.11657,58.489791],[54.118378,58.489739],[54.119993,58.489637],[54.121387,58.489472],[54.123513,58.48914],[54.126049,58.488639],[54.129486,58.487731],[54.131802,58.487106],[54.133749,58.486682],[54.135591,58.486358],[54.137359,58.486122],[54.140056,58.485846],[54.142745,58.48566],[54.144856,58.485624],[54.148807,58.485887],[54.152874,58.486272],[54.155102,58.486512],[54.165715,58.487676],[54.175586,58.488749],[54.17762,58.489019],[54.186659,58.49022],[54.195264,58.491365],[54.19971,58.491961],[54.201914,58.492323],[54.211141,58.494214],[54.220358,58.496202],[54.222126,58.496572],[54.224296,58.496939],[54.227211,58.497297],[54.229612,58.497545],[54.233569,58.497715],[54.237202,58.497812],[54.239678,58.497877],[54.251448,58.498154],[54.256845,58.498276],[54.261167,58.498521],[54.26251,58.498646],[54.264283,58.498858],[54.266579,58.499211],[54.270882,58.499941],[54.271076,58.499972],[54.273566,58.500366],[54.275634,58.500619],[54.275849,58.500631],[54.277836,58.500734],[54.280347,58.500743],[54.282255,58.500642],[54.284168,58.500457],[54.285832,58.500195],[54.2882,58.499665],[54.292787,58.498295],[54.294974,58.497741],[54.296961,58.497365],[54.298965,58.49712],[54.300992,58.496946],[54.30387,58.496932],[54.312904,58.497154],[54.313251,58.497163],[54.322426,58.497333],[54.326807,58.497352],[54.3296,58.497264],[54.333653,58.496922],[54.3356,58.496729],[54.338633,58.496324],[54.342473,58.495564],[54.34645,58.494595],[54.348027,58.494082],[54.351381,58.492944],[54.360762,58.489366],[54.365595,58.487469],[54.370171,58.485828],[54.37507,58.48451],[54.376278,58.484256],[54.377147,58.484091],[54.378478,58.48383],[54.380001,58.483575],[54.380865,58.483443],[54.381975,58.483292],[54.383569,58.483076],[54.384985,58.482905],[54.386288,58.482736],[54.387809,58.482516],[54.388999,58.482301],[54.390692,58.481952],[54.391766,58.48168],[54.393847,58.481129],[54.394831,58.480841],[54.396082,58.48047],[54.396535,58.48029],[54.397606,58.47982],[54.398042,58.479611],[54.399249,58.478999],[54.400456,58.47834],[54.40142,58.477664],[54.402245,58.477047],[54.403658,58.475782],[54.404508,58.474836],[54.405054,58.473846],[54.405475,58.472995],[54.406048,58.471558],[54.406412,58.470213],[54.406409,58.466631],[54.406482,58.465364],[54.406669,58.464485],[54.40681,58.463798],[54.407191,58.462721],[54.408158,58.460747],[54.409487,58.458729],[54.410855,58.457462],[54.41319,58.455697],[54.424657,58.447743],[54.424759,58.447672],[54.42639,58.446437],[54.428148,58.444865],[54.429062,58.443916],[54.429869,58.442947],[54.431694,58.440406],[54.431935,58.440053],[54.432802,58.438829],[54.433742,58.437745],[54.434716,58.436712],[54.436269,58.435316],[54.438836,58.433387],[54.441384,58.431871],[54.446945,58.429152],[54.449444,58.427795],[54.451882,58.426197],[54.457601,58.421496],[54.466075,58.414537],[54.466527,58.414159],[54.468806,58.412248],[54.470057,58.41125],[54.470918,58.410526],[54.47158,58.409973],[54.472237,58.409447],[54.472983,58.408884],[54.473573,58.408496],[54.474182,58.408115],[54.474761,58.407756],[54.475222,58.407472],[54.476336,58.406855],[54.477889,58.406037],[54.479722,58.405122],[54.481327,58.404436],[54.483696,58.403528],[54.486641,58.402594],[54.490278,58.401683],[54.490285,58.401681],[54.51043,58.397123],[54.515266,58.396028],[54.518284,58.395399],[54.532097,58.392796],[54.539034,58.391463],[54.545952,58.390226],[54.551127,58.389553],[54.562219,58.38799],[54.565559,58.387541],[54.567237,58.387316],[54.568671,58.387093],[54.573932,58.386362],[54.577186,58.385909],[54.590943,58.38429],[54.595596,58.383773],[54.599142,58.383378],[54.603029,58.382951],[54.605821,58.382571],[54.608564,58.382117],[54.611136,58.381603],[54.614598,58.380739],[54.617036,58.379966],[54.63041,58.375738],[54.631629,58.375334],[54.634707,58.374415],[54.636577,58.373942],[54.63888,58.373458],[54.642184,58.372864],[54.645343,58.372355],[54.651603,58.371363],[54.656662,58.370521],[54.656727,58.37051],[54.670843,58.368218],[54.673868,58.367619],[54.678682,58.36633],[54.681547,58.365336],[54.683294,58.3646],[54.68497,58.363887],[54.689276,58.361624],[54.694745,58.358636],[54.697385,58.357186],[54.697776,58.356971],[54.699474,58.356029],[54.701343,58.354848],[54.701402,58.354811],[54.703618,58.35318],[54.705935,58.351051],[54.713544,58.343543],[54.717621,58.33949],[54.720702,58.336432],[54.724115,58.333164],[54.727508,58.329956],[54.731862,58.325831],[54.736721,58.321192],[54.750442,58.307643],[54.757207,58.300991],[54.757912,58.300443],[54.759188,58.299732],[54.760221,58.299334],[54.76089,58.299138],[54.76615,58.297935],[54.772286,58.296595],[54.773953,58.296346],[54.783962,58.295396],[54.793002,58.294546],[54.797327,58.294128],[54.802467,58.293646],[54.803963,58.293405],[54.805801,58.29296],[54.807264,58.292431],[54.807487,58.292319],[54.808296,58.291915],[54.812241,58.289405],[54.813936,58.288323],[54.816672,58.286834],[54.820104,58.285373],[54.822163,58.284602],[54.824519,58.283876],[54.827058,58.28321],[54.830508,58.282573],[54.834228,58.282085],[54.835532,58.281937],[54.840282,58.281552],[54.842709,58.28137],[54.845475,58.281142],[54.846454,58.281098],[54.848427,58.280834],[54.850273,58.280438],[54.85065,58.280349],[54.85129,58.280176],[54.852877,58.279649],[54.854255,58.279134],[54.856335,58.277972],[54.85823,58.276582],[54.859584,58.27558],[54.860801,58.274679],[54.861309,58.274279],[54.867437,58.26967],[54.87015,58.267612],[54.874884,58.264076],[54.87611,58.263091],[54.878222,58.261583],[54.879729,58.260674],[54.881745,58.259752],[54.88318,58.259174],[54.885547,58.25835],[54.887422,58.257884],[54.887841,58.257781],[54.900238,58.254721],[54.906304,58.253218],[54.908958,58.25256],[54.910448,58.252191],[54.918789,58.250127],[54.924406,58.248754],[54.930481,58.247229],[54.936503,58.245807],[54.94089,58.244721],[54.943096,58.244199],[54.944852,58.243669],[54.946497,58.243096],[54.948037,58.242444],[54.948696,58.242081],[54.949669,58.241499],[54.950556,58.240897],[54.951811,58.239783],[54.952764,58.23872],[54.954266,58.237027],[54.957031,58.233717],[54.962746,58.227179],[54.96405,58.225452],[54.964978,58.223654],[54.967704,58.213426],[54.968215,58.211402],[54.968673,58.209435],[54.969272,58.206829],[54.969578,58.205546],[54.969923,58.204253],[54.970434,58.202568],[54.970539,58.202212],[54.970938,58.201033],[54.97138,58.200005],[54.971713,58.199344],[54.972074,58.198735],[54.972255,58.198409],[54.972855,58.197535],[54.973467,58.196752],[54.974309,58.195924],[54.975147,58.195125],[54.977598,58.192992],[54.980039,58.190923],[54.980822,58.190239],[54.981135,58.189981],[54.981235,58.189899],[54.982455,58.188851],[54.982964,58.188415],[54.982978,58.188402],[54.983696,58.187786],[54.98431,58.187279],[54.984849,58.186834],[54.984876,58.186812],[54.984989,58.186719],[54.985833,58.185958],[54.986601,58.185312],[54.987497,58.184557],[54.987846,58.184263],[54.98882,58.183415],[54.989495,58.182814],[54.989641,58.182673],[54.989769,58.182548],[54.989959,58.182323],[54.990789,58.181334],[54.990859,58.181254],[54.990926,58.181184],[54.990969,58.181149],[54.991056,58.181105],[54.991122,58.181072],[54.991231,58.181045],[54.99128,58.181036],[54.991402,58.181021],[54.991724,58.18101],[54.991904,58.181004],[54.991987,58.180995],[54.992078,58.180974],[54.992173,58.180947],[54.992494,58.180844],[54.993351,58.180575],[54.994399,58.180268],[54.996441,58.179689],[54.997217,58.179555],[54.998055,58.179452],[54.998813,58.179426],[54.999454,58.179435],[55.000857,58.179499],[55.002392,58.179613],[55.003253,58.179672],[55.004817,58.179722],[55.006136,58.179716],[55.006964,58.179663],[55.007622,58.179568],[55.008428,58.179426],[55.009211,58.179244],[55.009976,58.179034],[55.010827,58.178761],[55.012512,58.178191],[55.013895,58.177739],[55.01437,58.177522],[55.014811,58.177253],[55.015291,58.176846],[55.01565,58.176483],[55.016133,58.175801],[55.016418,58.175226],[55.016473,58.175099],[55.016719,58.17437],[55.017381,58.172572],[55.018122,58.170797],[55.018265,58.170385],[55.01915,58.168096],[55.019721,58.166751],[55.021183,58.162806],[55.021798,58.161225],[55.022205,58.160199],[55.023121,58.15841],[55.023789,58.157328],[55.024504,58.156344],[55.026462,58.153904],[55.03001,58.149434],[55.033529,58.145038],[55.038458,58.138877],[55.040135,58.13679],[55.042763,58.134395],[55.046107,58.132301],[55.047388,58.131616],[55.049607,58.130422],[55.050459,58.130061],[55.053555,58.128791],[55.061812,58.126185],[55.066333,58.12477],[55.071058,58.123234],[55.092387,58.116495],[55.092499,58.116462],[55.098925,58.114396],[55.099253,58.114292],[55.103699,58.11271],[55.111481,58.109473],[55.11638,58.107384],[55.116782,58.1072],[55.119122,58.106128],[55.119469,58.105956],[55.120139,58.105625],[55.120541,58.105417],[55.120781,58.105309],[55.121141,58.105108],[55.121727,58.104779],[55.121839,58.104708],[55.122765,58.104123],[55.123006,58.103971],[55.123034,58.103952],[55.123346,58.103756],[55.123668,58.103547],[55.12393,58.103354],[55.123954,58.103336],[55.126824,58.101289],[55.127151,58.101051],[55.127603,58.100727],[55.127898,58.100517],[55.128521,58.100076],[55.132047,58.097513],[55.146825,58.086843],[55.149534,58.084885],[55.160578,58.077009],[55.160659,58.076941],[55.166011,58.072976],[55.169762,58.07027],[55.171725,58.068602],[55.172806,58.067531],[55.174049,58.066145],[55.175376,58.064158],[55.178863,58.059174],[55.182074,58.054439],[55.182568,58.053696],[55.185734,58.048939],[55.187517,58.046712],[55.188183,58.045944],[55.19093,58.043122],[55.194185,58.039881],[55.199659,58.034362],[55.200383,58.033627],[55.200524,58.033484],[55.200973,58.033035],[55.201857,58.032108],[55.206348,58.027643],[55.211574,58.022342],[55.214578,58.01934],[55.217058,58.016808],[55.217654,58.016199],[55.218775,58.015071],[55.219451,58.014391],[55.224227,58.009664],[55.227282,58.006431],[55.232917,58.000385],[55.233169,58.000156],[55.234437,57.998975],[55.235859,57.997849],[55.236609,57.997333],[55.237669,57.996609],[55.239714,57.995477],[55.242483,57.994153],[55.243079,57.993893],[55.243638,57.99366],[55.24414,57.993453],[55.244651,57.993251],[55.24511,57.993076],[55.245588,57.992906],[55.246038,57.992757],[55.246431,57.992631],[55.247274,57.992368],[55.248188,57.992099],[55.249029,57.991858],[55.249817,57.991633],[55.250009,57.991572],[55.250176,57.991517],[55.250312,57.991466],[55.250412,57.991409],[55.250507,57.991354],[55.250545,57.991332],[55.250568,57.991318],[55.250637,57.991274],[55.250684,57.991237],[55.250715,57.991207],[55.25074,57.991162],[55.250796,57.991026],[55.250812,57.990977],[55.250821,57.990934],[55.250839,57.990846],[55.250991,57.990839],[55.251495,57.990803],[55.252095,57.990757],[55.252809,57.990689],[55.253591,57.9906],[55.253725,57.990581],[55.254312,57.990502],[55.254962,57.990406],[55.255702,57.990297],[55.255894,57.990268],[55.257477,57.989976],[55.260263,57.989422],[55.263467,57.988775],[55.272747,57.986901],[55.273977,57.986653],[55.288561,57.983704],[55.291712,57.983067],[55.295426,57.982302],[55.307067,57.979905],[55.30897,57.97955],[55.309349,57.979479],[55.311344,57.979207],[55.311805,57.979153],[55.312651,57.979057],[55.312981,57.979019],[55.31402,57.978901],[55.315744,57.978728],[55.318417,57.978583],[55.321341,57.978493],[55.324548,57.978487],[55.332755,57.97852],[55.367954,57.978537],[55.369377,57.978538],[55.369551,57.978538],[55.369765,57.978538],[55.390538,57.97855],[55.396862,57.978554],[55.397782,57.978552],[55.398323,57.978551],[55.398932,57.978549],[55.400953,57.978588],[55.402283,57.978631],[55.403481,57.978693],[55.405034,57.978773],[55.407712,57.978965],[55.409633,57.97918],[55.411555,57.979436],[55.413429,57.979734],[55.415264,57.980058],[55.417155,57.980443],[55.41887,57.980829],[55.421139,57.981334],[55.422767,57.981724],[55.425169,57.982199],[55.428154,57.982672],[55.430954,57.982993],[55.433502,57.983257],[55.439656,57.98364],[55.443173,57.983984],[55.44588,57.984338],[55.445882,57.984338],[55.449071,57.984864],[55.45079,57.985147],[55.45444,57.985938],[55.457625,57.98675],[55.458048,57.986873],[55.45873,57.98707],[55.459031,57.987157],[55.459296,57.987234],[55.459337,57.987246],[55.459779,57.987374],[55.461047,57.987742],[55.463173,57.988464],[55.467927,57.99045],[55.47596,57.994416],[55.480838,57.996681],[55.488314,57.999427],[55.490155,58.000137],[55.490817,58.000393],[55.491221,58.000541],[55.491981,58.000819],[55.494002,58.001559],[55.496768,58.002573],[55.497656,58.002896],[55.501727,58.004453],[55.504029,58.005333],[55.509427,58.007509],[55.513506,58.009607],[55.515644,58.010714],[55.520141,58.013039],[55.520509,58.013229],[55.526589,58.016359],[55.53624,58.021326],[55.536512,58.021466],[55.536668,58.021547],[55.536989,58.021712],[55.537379,58.021913],[55.547799,58.027286],[55.547808,58.02729],[55.54827,58.027528],[55.548494,58.027643],[55.549038,58.027923],[55.550608,58.028733],[55.551449,58.029166],[55.553647,58.030312],[55.554589,58.030797],[55.556016,58.031533],[55.55639,58.031727],[55.556763,58.031921],[55.557322,58.03221],[55.569006,58.038251],[55.569599,58.038551],[55.571516,58.039521],[55.574149,58.040876],[55.574447,58.041024],[55.575731,58.041671],[55.577819,58.042767],[55.578341,58.043038],[55.579276,58.043522],[55.579384,58.043578],[55.579675,58.043729],[55.579986,58.043891],[55.582314,58.045098],[55.589344,58.048743],[55.59322,58.050728],[55.593379,58.05081],[55.605959,58.057218],[55.624495,58.066708],[55.626792,58.06787],[55.627626,58.068291],[55.628196,58.068555],[55.631054,58.070083],[55.631349,58.070232],[55.631458,58.070287],[55.631745,58.070432],[55.632032,58.070577],[55.632205,58.070664],[55.635736,58.072448],[55.637916,58.073472],[55.641092,58.074718],[55.6438,58.075582],[55.645207,58.075942],[55.645312,58.075968],[55.645482,58.076012],[55.646931,58.07634],[55.648124,58.076568],[55.648234,58.076589],[55.649923,58.076894],[55.65002,58.076911],[55.650907,58.077027],[55.652263,58.077182],[55.653177,58.077283],[55.653621,58.077332],[55.654921,58.077451],[55.655004,58.077457],[55.655546,58.077498],[55.655906,58.077517],[55.656028,58.077524],[55.656783,58.077556],[55.65737,58.077574],[55.657607,58.077584],[55.657735,58.077593],[55.657847,58.0776],[55.657951,58.077623],[55.658038,58.077661],[55.6581,58.07771],[55.658134,58.077767],[55.658135,58.077827],[55.658164,58.077987],[55.658186,58.078053],[55.658237,58.078142],[55.65829,58.078219],[55.65839,58.078297],[55.658571,58.078422],[55.659533,58.079116],[55.659824,58.079313],[55.660597,58.079837],[55.661456,58.080391],[55.662387,58.080928],[55.663306,58.081407],[55.665905,58.082702],[55.672163,58.085775],[55.67353,58.086429],[55.674952,58.08701],[55.676441,58.087494],[55.678002,58.087922],[55.679532,58.088239],[55.68136,58.08851],[55.682719,58.088627],[55.684396,58.088668],[55.686877,58.088591],[55.689982,58.088349],[55.698374,58.087656],[55.702809,58.087298],[55.703834,58.08725],[55.705023,58.087253],[55.706634,58.08729],[55.709434,58.087414],[55.712185,58.087581],[55.71369,58.087719],[55.715033,58.087901],[55.716478,58.088173],[55.718508,58.088601],[55.720814,58.089169],[55.722763,58.089685],[55.724148,58.090097],[55.726228,58.090845],[55.727912,58.091489],[55.729392,58.092156],[55.730979,58.092948],[55.73251,58.093814],[55.733884,58.094755],[55.73537,58.095921],[55.735917,58.096358],[55.737029,58.097247],[55.737901,58.097903],[55.738579,58.098332],[55.739369,58.098753],[55.740052,58.099072],[55.740973,58.09947],[55.741773,58.099765],[55.74268,58.100056],[55.743549,58.10029],[55.744602,58.100521],[55.745848,58.100769],[55.747373,58.101039],[55.74773,58.101102],[55.751369,58.101725],[55.752375,58.101902],[55.753296,58.102049],[55.753903,58.102149],[55.757767,58.102785],[55.768429,58.10454],[55.777304,58.106034],[55.779903,58.106529],[55.783779,58.107325],[55.787273,58.108023],[55.790544,58.108647],[55.790852,58.108706],[55.792453,58.109009],[55.79332,58.109166],[55.794244,58.109313],[55.795071,58.109422],[55.795953,58.109516],[55.796796,58.109572],[55.79758,58.109605],[55.798366,58.109606],[55.79926,58.10958],[55.800083,58.10952],[55.800919,58.109435],[55.801915,58.109319],[55.802899,58.10918],[55.803757,58.109032],[55.804559,58.108868],[55.805241,58.108703],[55.805923,58.108515],[55.806407,58.108372],[55.806825,58.108238],[55.807526,58.107984],[55.808276,58.107701],[55.808993,58.107397],[55.809675,58.107082],[55.810371,58.106703],[55.810914,58.106384],[55.811669,58.105877],[55.812252,58.105436],[55.812747,58.105016],[55.813242,58.104574],[55.81393,58.103952],[55.814712,58.103244],[55.814787,58.103176],[55.815163,58.10284],[55.816625,58.101543],[55.817433,58.100808],[55.818681,58.099667],[55.824559,58.094325],[55.826047,58.092917],[55.827047,58.091921],[55.827996,58.090863],[55.829985,58.088447],[55.832798,58.085052],[55.833594,58.084123],[55.834178,58.083561],[55.834721,58.083021],[55.835696,58.082146],[55.836388,58.08156],[55.837019,58.081085],[55.84065,58.078451],[55.843903,58.076022],[55.843997,58.075952],[55.844712,58.075378],[55.845143,58.074989],[55.845578,58.074537],[55.845956,58.07409],[55.846262,58.073672],[55.846528,58.073264],[55.84677,58.072823],[55.847023,58.072257],[55.847197,58.071716],[55.847318,58.071169],[55.847367,58.070541],[55.847346,58.069742],[55.847262,58.06892],[55.846886,58.066511],[55.846208,58.062134],[55.845914,58.060235],[55.845842,58.059645],[55.845766,58.058906],[55.845771,58.058562],[55.845795,58.058318],[55.845855,58.058016],[55.845954,58.057674],[55.846045,58.057402],[55.846139,58.057177],[55.846272,58.056894],[55.846439,58.056601],[55.846638,58.056303],[55.846752,58.056146],[55.846851,58.056023],[55.846991,58.055859],[55.847338,58.055436],[55.847473,58.055296],[55.847633,58.055145],[55.847826,58.054973],[55.848076,58.054771],[55.848322,58.05459],[55.848746,58.054302],[55.84918,58.054022],[55.849352,58.053914],[55.84968,58.053715],[55.850175,58.053474],[55.850639,58.053258],[55.851173,58.053028],[55.85184,58.052742],[55.853425,58.052054],[55.854742,58.051487],[55.861419,58.048578],[55.86201,58.048321],[55.862903,58.047945],[55.868139,58.04574],[55.871136,58.044584],[55.872381,58.044114],[55.87288,58.043921],[55.873427,58.043708],[55.87426,58.043413],[55.874552,58.043305],[55.874957,58.043175],[55.87553,58.043011],[55.876103,58.04286],[55.876622,58.042734],[55.87705,58.042645],[55.877602,58.042547],[55.878271,58.042443],[55.87903,58.04234],[55.879527,58.042287],[55.880007,58.042243],[55.881488,58.04212],[55.883006,58.041994],[55.883974,58.041909],[55.885134,58.041807],[55.886018,58.041742],[55.888197,58.041601],[55.889115,58.041542],[55.890095,58.041479],[55.893073,58.041268],[55.893524,58.041232],[55.894349,58.041166],[55.895382,58.041075],[55.898878,58.040775],[55.898898,58.040773],[55.900652,58.040621],[55.901834,58.040521],[55.902606,58.040441],[55.903345,58.04036],[55.904174,58.040256],[55.905156,58.040118],[55.906501,58.039906],[55.908428,58.039595],[55.909186,58.039458],[55.90993,58.039326],[55.910522,58.039204],[55.911035,58.039087],[55.911843,58.0389],[55.912262,58.038806],[55.912639,58.03873],[55.913158,58.038637],[55.913663,58.038549],[55.914135,58.038465],[55.915974,58.038045],[55.916621,58.037874],[55.919315,58.036994],[55.921053,58.036502],[55.922024,58.036284],[55.922871,58.036125],[55.923742,58.036002],[55.924423,58.035936],[55.92511,58.035893],[55.926872,58.03582],[55.929011,58.035765],[55.930836,58.035855],[55.932351,58.035981],[55.933228,58.036043],[55.942736,58.036355],[55.947561,58.036527],[55.95128,58.036646],[55.95419,58.036741],[55.956319,58.036807],[55.959556,58.036917],[55.961446,58.036964],[55.963719,58.037035],[55.966466,58.037118],[55.968956,58.037192],[55.970584,58.037247],[55.972547,58.037302],[55.976313,58.037407],[55.981424,58.037561],[55.982538,58.037599],[55.983447,58.037652],[55.984201,58.037721],[55.985084,58.037822],[55.98642,58.038012],[55.987358,58.038164],[55.988383,58.038364],[55.989366,58.038595],[55.990153,58.03879],[55.990791,58.038963],[55.991814,58.039254],[55.993593,58.039774],[56.001077,58.041958],[56.002897,58.042416],[56.0049,58.042954],[56.006861,58.043645],[56.008401,58.044131],[56.008689,58.044219],[56.010389,58.044741],[56.011768,58.045097],[56.013151,58.045386],[56.014284,58.045555],[56.015564,58.045672],[56.016885,58.045735],[56.017841,58.045734],[56.01878,58.045696],[56.019926,58.045625],[56.021199,58.04553],[56.023064,58.045388],[56.024774,58.045253],[56.025916,58.045146],[56.026808,58.045021],[56.027746,58.044844],[56.028704,58.044626],[56.029517,58.044415],[56.032493,58.043433],[56.037343,58.041799],[56.039107,58.041232],[56.039704,58.041024],[56.04279,58.039981],[56.046766,58.038679],[56.049238,58.037848],[56.050267,58.037496],[56.051545,58.036947],[56.052257,58.036581],[56.052955,58.03616],[56.053428,58.035838],[56.054122,58.03528],[56.054451,58.034948],[56.054754,58.034613],[56.055009,58.034281],[56.055227,58.033933],[56.055505,58.033354],[56.05569,58.03289],[56.055829,58.032352],[56.05587,58.031578],[56.055795,58.030901],[56.055194,58.028075],[56.055175,58.027987],[56.054375,58.024056],[56.054315,58.02376],[56.053361,58.019106],[56.052022,58.012489],[56.051669,58.010468],[56.051656,58.009408],[56.05166,58.009198],[56.051722,58.008768],[56.052131,58.007646],[56.052305,58.007239],[56.052656,58.006678],[56.053933,58.004847],[56.056593,58.001262],[56.056968,58.000756],[56.059958,57.996651],[56.062578,57.993083],[56.065218,57.989515],[56.066824,57.987357],[56.067131,57.986985],[56.067462,57.986601],[56.068043,57.986042],[56.068724,57.985456],[56.069149,57.98513],[56.06943,57.984919],[56.069974,57.984554],[56.069994,57.984541],[56.07058,57.984166],[56.080109,57.978378],[56.082475,57.976944],[56.083462,57.976334],[56.091267,57.971613],[56.102453,57.964844],[56.110428,57.960018],[56.111614,57.959431],[56.112397,57.959097],[56.113499,57.95872],[56.114133,57.958525],[56.116572,57.957838],[56.117617,57.957539],[56.118847,57.957182],[56.11939,57.957002],[56.120036,57.956746],[56.120508,57.9565],[56.120943,57.956221],[56.121286,57.955943],[56.121651,57.955572],[56.121781,57.955408],[56.121976,57.955152],[56.122107,57.954843],[56.122213,57.954528],[56.122251,57.954352],[56.1223,57.953884],[56.122321,57.952821],[56.122354,57.951557],[56.122357,57.950914],[56.122359,57.950337],[56.122383,57.949883],[56.122422,57.949326],[56.122488,57.94885],[56.122547,57.948598],[56.122628,57.948349],[56.122764,57.948064],[56.122985,57.947713],[56.12327,57.947331],[56.123673,57.946837],[56.124225,57.946359],[56.124797,57.945967],[56.125539,57.945562],[56.126316,57.945197],[56.126803,57.944992],[56.127243,57.944843],[56.127945,57.944632],[56.128602,57.944451],[56.128997,57.944364],[56.129671,57.944246],[56.140799,57.942296],[56.142317,57.942019],[56.145759,57.941426],[56.14885,57.940894],[56.150197,57.940656],[56.151231,57.940451],[56.152159,57.940197],[56.152955,57.939923],[56.153716,57.939604],[56.154364,57.939288],[56.155136,57.938813],[56.156465,57.937887],[56.157589,57.937103],[56.158471,57.936462],[56.158927,57.936158],[56.159202,57.935975],[56.160185,57.935275],[56.164996,57.931887],[56.16745,57.930084],[56.171238,57.927181],[56.171979,57.926612],[56.172626,57.926112],[56.173832,57.925181],[56.175,57.92429],[56.175515,57.923884],[56.177789,57.922124],[56.178732,57.921439],[56.180462,57.920115],[56.181548,57.919284],[56.186519,57.915525],[56.189608,57.913122],[56.189731,57.913028],[56.194024,57.909735],[56.197397,57.907131],[56.19986,57.905225],[56.200959,57.904568],[56.202203,57.903985],[56.203791,57.903474],[56.205207,57.9032],[56.206994,57.902901],[56.214417,57.901659],[56.216796,57.901249],[56.222288,57.900304],[56.222958,57.900217],[56.227266,57.899652],[56.232919,57.898979],[56.239253,57.898132],[56.23971,57.898074],[56.240959,57.897914],[56.246077,57.897262],[56.247865,57.897032],[56.248351,57.896965],[56.24879,57.896909],[56.24928,57.896845],[56.249922,57.896761],[56.250698,57.896664],[56.261297,57.895339],[56.261945,57.895259],[56.262616,57.895179],[56.263592,57.89507],[56.264143,57.894957],[56.264617,57.894813],[56.26495,57.894674],[56.265246,57.894495],[56.265413,57.894354],[56.265537,57.894212],[56.26562,57.89409],[56.2657,57.893922],[56.265722,57.893729],[56.265782,57.893231],[56.265929,57.892789],[56.265994,57.891859],[56.265995,57.891845],[56.266499,57.886769],[56.266531,57.886201],[56.266605,57.884566],[56.266673,57.883326],[56.266722,57.882711],[56.266747,57.882025],[56.266697,57.881244],[56.266622,57.880584],[56.266512,57.879927],[56.266412,57.879422],[56.266107,57.878491],[56.265755,57.877582],[56.26528,57.876585],[56.264751,57.875602],[56.263487,57.873472],[56.262865,57.872387],[56.261805,57.870598],[56.26087,57.869004],[56.260289,57.867986],[56.259766,57.867008],[56.2595,57.866326],[56.259273,57.865619],[56.259119,57.86507],[56.259029,57.864521],[56.258958,57.863629],[56.258948,57.86301],[56.259007,57.862387],[56.259093,57.861769],[56.259241,57.861155],[56.259372,57.860681],[56.259576,57.86012],[56.259869,57.859441],[56.260391,57.858512],[56.260866,57.857802],[56.261464,57.857054],[56.26214,57.856313],[56.262885,57.855598],[56.263691,57.854909],[56.26442,57.854345],[56.265202,57.853797],[56.266174,57.853181],[56.267208,57.852585],[56.268496,57.851939],[56.269842,57.85133],[56.270777,57.850955],[56.271652,57.850611],[56.273024,57.850152],[56.274591,57.849696],[56.276066,57.84933],[56.277589,57.848989],[56.278764,57.848771],[56.27996,57.848577],[56.282573,57.848199],[56.284505,57.847866],[56.285394,57.847686],[56.286275,57.847466],[56.287711,57.847063],[56.289166,57.846605],[56.290169,57.84621],[56.290882,57.845899],[56.291594,57.845555],[56.292318,57.845175],[56.292967,57.84479],[56.293833,57.844211],[56.294568,57.84368],[56.295243,57.843026],[56.295887,57.842378],[56.296359,57.841806],[56.296676,57.841345],[56.296938,57.840914],[56.297289,57.840233],[56.297533,57.83956],[56.297617,57.839197],[56.297754,57.838604],[56.297812,57.837524],[56.297751,57.836746],[56.297708,57.836057],[56.297711,57.834994],[56.297835,57.83375],[56.29809,57.832859],[56.298165,57.832479],[56.298098,57.83221],[56.298038,57.83194],[56.298095,57.831681],[56.298151,57.831517],[56.298239,57.83131],[56.298377,57.831137],[56.29853,57.831],[56.298786,57.830822],[56.299011,57.830653],[56.299211,57.830434],[56.3002,57.828902],[56.301472,57.82746],[56.302797,57.826023],[56.304732,57.823928],[56.308735,57.819595],[56.311127,57.816981],[56.312201,57.815827],[56.31356,57.814365],[56.314463,57.813367],[56.314945,57.81286],[56.316052,57.811657],[56.31632,57.811349],[56.317587,57.810026],[56.319236,57.8082],[56.319783,57.807622],[56.32035,57.807022],[56.32086,57.806478],[56.322181,57.805031],[56.323171,57.803953],[56.323663,57.803432],[56.324371,57.802652],[56.3249,57.802074],[56.32554,57.801368],[56.326208,57.800631],[56.327239,57.799592],[56.331194,57.795772],[56.335438,57.791798],[56.336902,57.790403],[56.337701,57.78966],[56.338159,57.789206],[56.338604,57.788715],[56.339004,57.788207],[56.339555,57.787359],[56.339906,57.786787],[56.340211,57.786241],[56.34041,57.785859],[56.340746,57.785172],[56.340861,57.78486],[56.341033,57.78426],[56.341245,57.783396],[56.341323,57.782796],[56.341368,57.782408],[56.341384,57.782144],[56.341373,57.781579],[56.341281,57.780667],[56.341156,57.780011],[56.340938,57.779231],[56.340662,57.778473],[56.340353,57.77779],[56.339971,57.777108],[56.338969,57.775399],[56.338418,57.774481],[56.337421,57.77282],[56.336119,57.770603],[56.335029,57.768792],[56.334254,57.767281],[56.333873,57.76647],[56.333626,57.765822],[56.333331,57.76486],[56.33305,57.763486],[56.332925,57.762675],[56.332915,57.760467],[56.332922,57.758737],[56.332883,57.756821],[56.33296,57.754293],[56.333001,57.753042],[56.333084,57.75214],[56.333171,57.751137],[56.333234,57.750652],[56.333356,57.750177],[56.333569,57.749445],[56.33383,57.748682],[56.334055,57.747971],[56.334255,57.747471],[56.334567,57.746727],[56.334893,57.746135],[56.33524,57.74556],[56.335665,57.744767],[56.336171,57.74393],[56.336732,57.743169],[56.337148,57.742624],[56.337771,57.741873],[56.33854,57.741002],[56.339418,57.740008],[56.340021,57.739289],[56.341832,57.737069],[56.342577,57.736181],[56.343269,57.73539],[56.344058,57.734412],[56.344446,57.733977],[56.346113,57.731923],[56.346846,57.730996],[56.34762,57.729978],[56.348881,57.728524],[56.34966,57.727728],[56.350662,57.726784],[56.351264,57.726218],[56.351916,57.725674],[56.352753,57.725048],[56.353273,57.72458],[56.354003,57.723832],[56.355116,57.722485],[56.355955,57.721435],[56.356824,57.72029],[56.357523,57.719313],[56.357764,57.71894],[56.358604,57.717705],[56.359305,57.716832],[56.360338,57.715404],[56.361228,57.714157],[56.362348,57.712663],[56.363425,57.71132],[56.364997,57.709579],[56.366348,57.708225],[56.367682,57.706997],[56.368479,57.706322],[56.369342,57.705537],[56.370684,57.704497],[56.370703,57.704483],[56.372368,57.703305],[56.373564,57.702534],[56.375017,57.701654],[56.376455,57.700888],[56.377835,57.700165],[56.378899,57.699617],[56.380013,57.699098],[56.381295,57.698488],[56.382205,57.698073],[56.384495,57.697102],[56.386423,57.696352],[56.388553,57.69556],[56.390675,57.694799],[56.391062,57.694661],[56.394144,57.693525],[56.395934,57.69286],[56.39888,57.691801],[56.400882,57.691058],[56.407383,57.688701],[56.413682,57.686392],[56.420109,57.684015],[56.421765,57.683415],[56.42259,57.683083],[56.424901,57.682216],[56.425895,57.681764],[56.426699,57.681363],[56.427442,57.680958],[56.428463,57.680373],[56.429292,57.679817],[56.430555,57.678836],[56.431315,57.678125],[56.431932,57.677454],[56.43239,57.676871],[56.432805,57.676284],[56.433037,57.675906],[56.433332,57.675336],[56.433506,57.674954],[56.433894,57.674063],[56.434198,57.67333],[56.43486,57.671776],[56.435054,57.671297],[56.435427,57.670431],[56.436185,57.668654],[56.436941,57.666876],[56.438287,57.663719],[56.438827,57.662479],[56.439836,57.659876],[56.440942,57.657266],[56.442025,57.654704],[56.443277,57.65176],[56.444052,57.649888],[56.444383,57.64908],[56.445141,57.647272],[56.446184,57.644848],[56.446525,57.644159],[56.447035,57.643302],[56.447215,57.643021],[56.44776,57.642139],[56.448054,57.641727],[56.448834,57.640731],[56.449674,57.63976],[56.449827,57.639582],[56.450825,57.638571],[56.451222,57.638163],[56.451511,57.637891],[56.452941,57.636684],[56.456038,57.634389],[56.456806,57.633915],[56.457793,57.633322],[56.460304,57.631917],[56.46067,57.631724],[56.464855,57.62954],[56.468711,57.627552],[56.469002,57.627389],[56.469468,57.627205],[56.470169,57.626989],[56.471689,57.626168],[56.47406,57.624937],[56.474591,57.624654],[56.475623,57.624109],[56.478347,57.622703],[56.482361,57.620608],[56.482711,57.620423],[56.489043,57.617087],[56.497229,57.612773],[56.50012,57.611333],[56.500274,57.611258],[56.500691,57.611069],[56.500927,57.610962],[56.502376,57.610344],[56.504596,57.609384],[56.5106,57.606902],[56.511663,57.606463],[56.512543,57.606092],[56.521927,57.602127],[56.523103,57.601633],[56.52335,57.601524],[56.52379,57.60134],[56.528293,57.599426],[56.53199,57.59782],[56.536011,57.596064],[56.538454,57.594978],[56.539392,57.594526],[56.540386,57.594048],[56.54249,57.592762],[56.544048,57.591657],[56.546078,57.590035],[56.546605,57.589587],[56.547602,57.588672],[56.5486,57.587599],[56.549964,57.586071],[56.556415,57.578922],[56.556503,57.578824],[56.556661,57.578649],[56.567191,57.56701],[56.576227,57.556965],[56.580673,57.552078],[56.581595,57.551099],[56.582007,57.550661],[56.583624,57.549189],[56.585528,57.547759],[56.586783,57.546867],[56.588391,57.545838],[56.589211,57.545346],[56.594814,57.542159],[56.595574,57.541672],[56.598061,57.540148],[56.598197,57.540064],[56.602968,57.537278],[56.607725,57.534474],[56.612181,57.531846],[56.633264,57.519241],[56.634328,57.518611],[56.637066,57.516985],[56.638984,57.515733],[56.64067,57.514392],[56.640799,57.514282],[56.641155,57.513975],[56.641485,57.513719],[56.641559,57.513661],[56.642725,57.51262],[56.644967,57.510346],[56.648526,57.506874],[56.649307,57.506085],[56.649881,57.505506],[56.650234,57.50515],[56.650287,57.50509],[56.650607,57.504783],[56.651003,57.504387],[56.651202,57.504202],[56.658367,57.497205],[56.658731,57.496856],[56.661972,57.493631],[56.662125,57.493479],[56.662338,57.493267],[56.664454,57.491162],[56.668631,57.48712],[56.669997,57.48614],[56.672129,57.485078],[56.674616,57.484193],[56.677808,57.483483],[56.681178,57.483192],[56.691358,57.483234],[56.69285,57.483121],[56.697277,57.482542],[56.700524,57.482022],[56.703583,57.481185],[56.703965,57.48111],[56.708856,57.479901],[56.709002,57.479866],[56.713286,57.478848],[56.717838,57.478027],[56.720756,57.477708],[56.723148,57.477487],[56.723487,57.477456],[56.723858,57.477428],[56.727077,57.477188],[56.73014,57.476864],[56.734067,57.476188],[56.737046,57.475494],[56.738403,57.475124],[56.739788,57.474666],[56.741736,57.473954],[56.744903,57.472526],[56.747917,57.470682],[56.74868,57.470169],[56.749717,57.469378],[56.750739,57.468602],[56.751109,57.468338],[56.753587,57.466509],[56.755481,57.46509],[56.76405,57.458666],[56.76665,57.456728],[56.767319,57.456213],[56.768793,57.455107],[56.769951,57.454373],[56.771255,57.453752],[56.772489,57.45325],[56.773063,57.453078],[56.774152,57.452752],[56.774874,57.452593],[56.775785,57.452393],[56.777523,57.452124],[56.779282,57.451912],[56.781075,57.451817],[56.782744,57.451853],[56.784415,57.451953],[56.788432,57.45221],[56.79418,57.452535],[56.797058,57.452742],[56.797545,57.45277],[56.798223,57.452813],[56.799203,57.452837],[56.799508,57.452845],[56.800229,57.452851],[56.800906,57.452824],[56.802104,57.452702],[56.802986,57.452574],[56.803498,57.452474],[56.804173,57.452304],[56.80483,57.452114],[56.805457,57.451892],[56.805642,57.451819],[56.806192,57.451594],[56.806436,57.45148],[56.806626,57.451392],[56.807471,57.450887],[56.808354,57.450204],[56.810917,57.447722],[56.817117,57.441732],[56.821499,57.437504],[56.82284,57.436201],[56.825205,57.433902],[56.827157,57.432123],[56.827215,57.43207],[56.82925,57.430414],[56.832935,57.427843],[56.835344,57.426391],[56.838278,57.424835],[56.840778,57.423621],[56.843952,57.422279],[56.864733,57.413807],[56.877009,57.408802],[56.877111,57.40876],[56.877976,57.408416],[56.878343,57.408264],[56.879006,57.407989],[56.879228,57.407897],[56.880052,57.407555],[56.88127,57.407051],[56.88407,57.405953],[56.888624,57.404087],[56.888996,57.403902],[56.890562,57.403072],[56.891736,57.40247],[56.89367,57.401237],[56.894308,57.40081],[56.896623,57.399043],[56.898022,57.397636],[56.898461,57.397125],[56.899379,57.396055],[56.901115,57.393984],[56.902277,57.392183],[56.903358,57.389917],[56.904126,57.387845],[56.905003,57.384683],[56.905485,57.382931],[56.905713,57.382065],[56.906225,57.380724],[56.906266,57.380648],[56.906926,57.379422],[56.908143,57.377669],[56.909259,57.376214],[56.909997,57.375447],[56.911278,57.37432],[56.912033,57.373696],[56.912546,57.37328],[56.913627,57.372414],[56.915792,57.37104],[56.92098,57.367623],[56.92373,57.36574],[56.925488,57.364326],[56.927105,57.362896],[56.928774,57.361189],[56.929507,57.360439],[56.93047,57.359279],[56.931784,57.357695],[56.933037,57.356088],[56.934213,57.35448],[56.939797,57.346083],[56.942318,57.342327],[56.943487,57.340622],[56.943753,57.340235],[56.944518,57.339281],[56.944796,57.33892],[56.946507,57.33704],[56.948391,57.335204],[56.953036,57.331225],[56.956669,57.328156],[56.957701,57.327284],[56.96051,57.324913],[56.967033,57.318981],[56.97549,57.310233],[56.975659,57.310047],[56.975896,57.309787],[56.976243,57.309438],[56.978901,57.306774],[56.981303,57.304195],[56.983546,57.301641],[56.992199,57.291583],[56.99489,57.288327],[56.99637,57.286524],[56.998225,57.284343],[56.999364,57.283014],[57.000933,57.281171],[57.001858,57.280116],[57.002746,57.279137],[57.003722,57.278152],[57.004519,57.277383],[57.004865,57.277074],[57.005205,57.27673],[57.009777,57.273071],[57.016422,57.268416],[57.018701,57.26682],[57.019525,57.26619],[57.02047,57.265469],[57.020553,57.265405],[57.021415,57.264745],[57.022581,57.26385],[57.027973,57.258962],[57.02904,57.258245],[57.031158,57.256822],[57.031953,57.256295],[57.047474,57.245998],[57.059531,57.238019],[57.06212,57.236288],[57.065593,57.233788],[57.065633,57.233759],[57.072028,57.2288],[57.073016,57.228016],[57.082198,57.220734],[57.084148,57.219189],[57.08743,57.216589],[57.092961,57.212175],[57.098512,57.207682],[57.100929,57.205725],[57.113282,57.195633],[57.119447,57.190179],[57.120298,57.189438],[57.125503,57.184886],[57.129165,57.18184],[57.132819,57.179039],[57.138361,57.175243],[57.144011,57.171623],[57.144779,57.171142],[57.146378,57.169945],[57.14736,57.16927],[57.149036,57.168054],[57.150678,57.166828],[57.151815,57.165929],[57.153915,57.164137],[57.157789,57.160933],[57.158752,57.160546],[57.159544,57.160242],[57.160119,57.16008],[57.160579,57.159969],[57.161558,57.159794],[57.162431,57.159674],[57.164517,57.159507],[57.16662,57.159424],[57.168949,57.159334],[57.169711,57.159343],[57.170623,57.15936],[57.181338,57.15988],[57.182872,57.159953],[57.18739,57.160124],[57.188927,57.160163],[57.193242,57.160223],[57.195686,57.160232],[57.197914,57.160197],[57.207702,57.160045],[57.217487,57.159952],[57.223813,57.160311],[57.233668,57.161024],[57.244912,57.161824],[57.245615,57.161828],[57.246264,57.161802],[57.247041,57.161703],[57.247886,57.161531],[57.248287,57.161412],[57.248783,57.161225],[57.253023,57.159156],[57.255321,57.15813],[57.257808,57.157122],[57.258719,57.156805],[57.2611,57.156026],[57.263431,57.155337],[57.265412,57.154794],[57.266628,57.154453],[57.268446,57.1539],[57.269916,57.153352],[57.27426,57.151519],[57.275526,57.150986],[57.278125,57.149889],[57.278254,57.149835],[57.283405,57.147662],[57.290027,57.1457],[57.290869,57.145399],[57.292099,57.144776],[57.292701,57.144428],[57.293108,57.144141],[57.293819,57.143647],[57.294495,57.143073],[57.295049,57.142446],[57.295519,57.141736],[57.295793,57.141153],[57.29655,57.139123],[57.296682,57.138792],[57.297667,57.136147],[57.29819,57.134886],[57.29869,57.133817],[57.300054,57.131218],[57.300262,57.130849],[57.301799,57.127925],[57.302566,57.126828],[57.303609,57.125748],[57.30561,57.124031],[57.305883,57.1238],[57.307271,57.122593],[57.30765,57.122175],[57.307997,57.121711],[57.308416,57.121096],[57.308782,57.119991],[57.308859,57.119094],[57.308816,57.118368],[57.307917,57.111051],[57.307434,57.108394],[57.307528,57.106427],[57.307802,57.105426],[57.308276,57.104183],[57.309186,57.102712],[57.310412,57.10128],[57.312207,57.099722],[57.314424,57.098305],[57.316269,57.097363],[57.316691,57.097198],[57.318887,57.096339],[57.319584,57.096107],[57.327258,57.093606],[57.32865,57.093348],[57.329071,57.09328],[57.329784,57.093213],[57.331896,57.093012],[57.334723,57.092951],[57.3369,57.09311],[57.33912,57.093348],[57.347039,57.094768],[57.349369,57.094928],[57.350915,57.094875],[57.352413,57.09478],[57.35447,57.094454],[57.357771,57.093554],[57.36082,57.092749],[57.362376,57.092432],[57.363476,57.092269],[57.364482,57.092143],[57.366058,57.092079],[57.367352,57.092017],[57.368325,57.092042],[57.369897,57.092077],[57.379208,57.092431],[57.388579,57.092463],[57.390404,57.092477],[57.390919,57.092419],[57.391335,57.092314],[57.391466,57.092253],[57.391627,57.092219],[57.391706,57.092211],[57.391957,57.092079],[57.392185,57.091946],[57.393937,57.090121],[57.394109,57.089942],[57.396534,57.087572],[57.397617,57.086515],[57.400504,57.084918],[57.400952,57.084711],[57.403095,57.083526],[57.405176,57.082233],[57.406298,57.081385],[57.407173,57.080401],[57.410286,57.075072],[57.411103,57.074384],[57.412996,57.073305],[57.417855,57.070839],[57.41975,57.069682],[57.420801,57.068858],[57.422309,57.067511],[57.423186,57.066499],[57.423652,57.065852],[57.423862,57.065447],[57.424264,57.064674],[57.424679,57.063726],[57.424791,57.063469],[57.425137,57.062594],[57.425201,57.06239],[57.425425,57.061708],[57.425524,57.060875],[57.425518,57.060479],[57.425524,57.059773],[57.425334,57.057409],[57.425327,57.057317],[57.425371,57.056561],[57.425438,57.056257],[57.42549,57.056018],[57.425758,57.05494],[57.425817,57.054703],[57.426056,57.054016],[57.426253,57.053367],[57.426374,57.052971],[57.426443,57.052725],[57.426464,57.052593],[57.426459,57.052375],[57.426406,57.052048],[57.426243,57.051464],[57.42626,57.051233],[57.42639,57.051028],[57.426636,57.050863],[57.427153,57.050596],[57.427993,57.050163],[57.42849,57.049906],[57.429619,57.049315],[57.434185,57.046938],[57.435023,57.046552],[57.435973,57.046085],[57.437343,57.045372],[57.438786,57.044477],[57.439395,57.043988],[57.440024,57.043406],[57.441314,57.041917],[57.441343,57.041884],[57.44442,57.03827],[57.450394,57.031417],[57.451157,57.030589],[57.451614,57.030174],[57.467709,57.015844],[57.468245,57.015367],[57.471487,57.012464],[57.472474,57.011529],[57.473086,57.010776],[57.473612,57.009864],[57.474373,57.008287],[57.47565,57.005658],[57.477034,57.00283],[57.477368,57.002148],[57.478676,56.999476],[57.479158,56.998594],[57.479845,56.997641],[57.480684,56.996803],[57.480757,56.99673],[57.481763,56.995957],[57.482084,56.995776],[57.483393,56.995038],[57.489042,56.991994],[57.500616,56.985706],[57.511361,56.979867],[57.512697,56.979141],[57.513813,56.978422],[57.515111,56.977097],[57.515888,56.975515],[57.516314,56.974462],[57.51672,56.973516],[57.519638,56.966575],[57.520413,56.965013],[57.523544,56.958702],[57.525835,56.954438],[57.526313,56.953564],[57.526561,56.953099],[57.531357,56.944677],[57.532601,56.943273],[57.53462,56.941219],[57.536391,56.939658],[57.537367,56.938935],[57.53855,56.938099],[57.540937,56.936502],[57.541228,56.936308],[57.54551,56.93352],[57.546811,56.932673],[57.552849,56.929755],[57.555013,56.92872],[57.555415,56.928512],[57.557754,56.927072],[57.55902,56.926258],[57.560072,56.925629],[57.560688,56.92527],[57.562404,56.924362],[57.563286,56.923925],[57.565811,56.922636],[57.570838,56.920035],[57.573613,56.918586],[57.576315,56.917176],[57.584756,56.912801],[57.586085,56.912064],[57.587123,56.911457],[57.588209,56.910764],[57.589495,56.909867],[57.590896,56.908803],[57.592118,56.907775],[57.593958,56.905974],[57.597367,56.902224],[57.60387,56.895008],[57.605414,56.89339],[57.606452,56.892423],[57.607975,56.891168],[57.60957,56.889947],[57.611249,56.888796],[57.613899,56.887201],[57.615818,56.886115],[57.618418,56.884817],[57.621068,56.883657],[57.62361,56.882682],[57.627071,56.881518],[57.628659,56.880993],[57.628773,56.880955],[57.67794,56.865021],[57.683242,56.863344],[57.690144,56.861242],[57.692062,56.860717],[57.695101,56.859884],[57.697189,56.859326],[57.697516,56.859238],[57.698224,56.859046],[57.699006,56.858838],[57.699223,56.858781],[57.699571,56.858694],[57.701701,56.858135],[57.703849,56.857566],[57.705042,56.857246],[57.708329,56.856384],[57.711632,56.855504],[57.713883,56.854876],[57.716042,56.854223],[57.717437,56.853809],[57.719069,56.853322],[57.720981,56.852711],[57.723114,56.852039],[57.725095,56.851375],[57.727286,56.85062],[57.730093,56.849564],[57.730099,56.849562],[57.732441,56.848687],[57.759895,56.838211],[57.765774,56.835982],[57.7706,56.834508],[57.776558,56.833114],[57.780396,56.832218],[57.784313,56.831099],[57.787742,56.830018],[57.791694,56.828563],[57.799248,56.825182],[57.806552,56.821542],[57.826249,56.811725],[57.837834,56.805949],[57.840757,56.804492],[57.843606,56.803094],[57.845897,56.802016],[57.848509,56.800929],[57.850789,56.800115],[57.853868,56.799181],[57.85618,56.79857],[57.858331,56.798068],[57.860413,56.797636],[57.863749,56.79704],[57.865516,56.796669],[57.867268,56.796248],[57.868588,56.795872],[57.870215,56.795356],[57.871296,56.794967],[57.872531,56.794485],[57.873227,56.794188],[57.873617,56.794021],[57.875097,56.793315],[57.876222,56.792718],[57.877262,56.792102],[57.877809,56.791764],[57.879595,56.79058],[57.880888,56.789755],[57.881357,56.789487],[57.882319,56.788931],[57.882987,56.78857],[57.884461,56.787832],[57.885386,56.787412],[57.886379,56.786997],[57.886945,56.786767],[57.888305,56.786248],[57.889543,56.785815],[57.890786,56.785396],[57.892619,56.78486],[57.894289,56.784421],[57.895636,56.784109],[57.89791,56.783642],[57.900057,56.78327],[57.902048,56.783001],[57.902709,56.782926],[57.905055,56.782698],[57.906943,56.782549],[57.908366,56.782436],[57.908824,56.782399],[57.910223,56.782296],[57.910358,56.782286],[57.913495,56.782054],[57.918564,56.781652],[57.924886,56.781173],[57.931175,56.780682],[57.9385,56.780115],[57.941368,56.779915],[57.942841,56.779837],[57.944206,56.779795],[57.946338,56.779761],[57.94842,56.779787],[57.950278,56.779849],[57.952313,56.779961],[57.95506,56.780184],[57.959275,56.780655],[57.963473,56.781145],[57.965977,56.781408],[57.967835,56.781541],[57.969215,56.781598],[57.970664,56.781618],[57.972404,56.781562],[57.97394,56.781458],[57.975589,56.781295],[57.977079,56.781092],[57.9784,56.780853],[57.98005,56.780492],[57.981508,56.780118],[57.982904,56.779693],[57.986927,56.778317],[57.989453,56.777448],[57.991203,56.776882],[57.993695,56.776164],[57.994713,56.775887],[57.995678,56.775641],[57.997115,56.775311],[57.99831,56.775053],[58.000798,56.774598],[58.003237,56.774212],[58.009011,56.77349],[58.009217,56.773464],[58.013476,56.772927],[58.017091,56.77253],[58.02064,56.772253],[58.023249,56.772124],[58.025903,56.772051],[58.029541,56.772035],[58.032493,56.772106],[58.035664,56.772253],[58.039431,56.772555],[58.0469,56.773229],[58.04965,56.77346],[58.051535,56.773567],[58.05323,56.773637],[58.055809,56.773679],[58.058318,56.773679],[58.061247,56.773564],[58.062831,56.773461],[58.064663,56.773314],[58.069815,56.772767],[58.077732,56.77195],[58.08022,56.771686],[58.08307,56.771375],[58.085341,56.77112],[58.088211,56.770798],[58.089824,56.770665],[58.091302,56.770573],[58.093596,56.770508],[58.094933,56.770495],[58.096366,56.770499],[58.09698,56.770516],[58.10216,56.770851],[58.107444,56.771349],[58.110877,56.77149],[58.1174,56.771114],[58.122636,56.770267],[58.12564,56.769561],[58.133977,56.766575],[58.135508,56.765994],[58.138324,56.764962],[58.139728,56.764464],[58.14123,56.764036],[58.142346,56.76378],[58.143114,56.763606],[58.144847,56.763321],[58.146607,56.763065],[58.147396,56.762981],[58.148166,56.762912],[58.149084,56.762853],[58.149965,56.762817],[58.151118,56.762797],[58.152094,56.762798],[58.153157,56.762819],[58.154234,56.762895],[58.155286,56.762974],[58.15631,56.763074],[58.157517,56.763209],[58.159153,56.763471],[58.160741,56.763785],[58.163,56.764382],[58.16492,56.764982],[58.167332,56.765827],[58.16878,56.766268],[58.169934,56.766568],[58.171269,56.766862],[58.172702,56.767109],[58.17422,56.767318],[58.176001,56.767482],[58.177186,56.767562],[58.178581,56.767594],[58.182292,56.767556],[58.182309,56.767556],[58.184278,56.767538],[58.18607,56.76755],[58.187711,56.767579],[58.1899,56.767682],[58.190985,56.767744],[58.19174,56.767803],[58.193693,56.767976],[58.19425,56.76804],[58.195897,56.768229],[58.197807,56.7685],[58.201219,56.769088],[58.203772,56.76962],[58.206535,56.770299],[58.209802,56.771242],[58.213831,56.772459],[58.214674,56.772712],[58.216722,56.773326],[58.218417,56.773844],[58.219522,56.774135],[58.220879,56.774464],[58.221952,56.774684],[58.223218,56.774914],[58.224779,56.775149],[58.226255,56.775316],[58.227687,56.775437],[58.229318,56.77551],[58.230707,56.775537],[58.232322,56.775513],[58.233813,56.775457],[58.237064,56.775211],[58.238496,56.775096],[58.239843,56.77502],[58.241232,56.77499],[58.24245,56.775008],[58.24371,56.775061],[58.245207,56.775178],[58.247181,56.775405],[58.248318,56.775575],[58.250507,56.776019],[58.252057,56.776413],[58.253399,56.776804],[58.254761,56.777277],[58.25636,56.777909],[58.257937,56.778667],[58.260281,56.780028],[58.26167,56.78083],[58.262936,56.781374],[58.26394,56.781741],[58.264927,56.782056],[58.265705,56.78227],[58.266836,56.78252],[58.267904,56.782711],[58.269336,56.782893],[58.270779,56.783005],[58.271729,56.783049],[58.273005,56.783043],[58.274229,56.78299],[58.275586,56.78287],[58.280473,56.782217],[58.282865,56.781973],[58.284802,56.781835],[58.286755,56.781771],[58.288831,56.781738],[58.292156,56.781771],[58.295445,56.78182],[58.297145,56.781894],[58.298395,56.781991],[58.300187,56.782205],[58.301909,56.782488],[58.303588,56.782828],[58.305594,56.78336],[58.307053,56.783836],[58.309457,56.784742],[58.311291,56.785323],[58.313164,56.78587],[58.314633,56.786228],[58.316597,56.786575],[58.318346,56.786816],[58.32297,56.787304],[58.324853,56.787536],[58.326532,56.7878],[58.328077,56.788106],[58.330914,56.788749],[58.333902,56.789431],[58.335941,56.789831],[58.337362,56.790048],[58.338709,56.790204],[58.340463,56.790327],[58.343122,56.790471],[58.344454,56.790445],[58.346477,56.790392],[58.348193,56.790266],[58.350173,56.790048],[58.352576,56.789687],[58.356954,56.788559],[58.356958,56.788558],[58.359614,56.78776],[58.361526,56.787282],[58.363546,56.786981],[58.366175,56.786688],[58.36897,56.786585],[58.371802,56.786585],[58.376266,56.786961],[58.37862,56.787114],[58.381244,56.787102],[58.38332,56.786962],[58.385364,56.786679],[58.387704,56.786267],[58.389985,56.785771],[58.393357,56.784637],[58.39612,56.783423],[58.398238,56.782682],[58.399869,56.782212],[58.401701,56.78178],[58.402945,56.781539],[58.404455,56.781295],[58.40552,56.781145],[58.406534,56.781049],[58.407474,56.780981],[58.408374,56.780928],[58.409345,56.780887],[58.410638,56.780884],[58.411754,56.780925],[58.413141,56.781034],[58.415045,56.781243],[58.416581,56.781462],[58.417897,56.781689],[58.419385,56.781991],[58.420814,56.782317],[58.42284,56.782864],[58.424618,56.783426],[58.426535,56.78413],[58.428473,56.784933],[58.431905,56.786543],[58.433348,56.787174],[58.434609,56.787659],[58.435477,56.787961],[58.436104,56.788179],[58.437476,56.788631],[58.439061,56.789132],[58.441871,56.789953],[58.44425,56.790623],[58.44671,56.79127],[58.448963,56.791824],[58.451655,56.79245],[58.453779,56.792922],[58.456277,56.793412],[58.459535,56.794033],[58.461584,56.794397],[58.463687,56.794723],[58.466187,56.795052],[58.468074,56.795242],[58.470193,56.795399],[58.472781,56.795535],[58.474916,56.79557],[58.476722,56.795542],[58.479594,56.7954],[58.481657,56.795211],[58.484351,56.794841],[58.487039,56.794354],[58.489395,56.793816],[58.491404,56.793266],[58.493495,56.792569],[58.497286,56.791309],[58.501091,56.790065],[58.502831,56.789563],[58.504741,56.789042],[58.506384,56.788621],[58.50872,56.788071],[58.510953,56.787588],[58.512284,56.78733],[58.513683,56.787067],[58.516068,56.786688],[58.517929,56.786432],[58.51934,56.786274],[58.520784,56.786132],[58.522717,56.785972],[58.524625,56.785861],[58.526893,56.785782],[58.52946,56.785757],[58.531537,56.785776],[58.53378,56.785865],[58.535465,56.78597],[58.535477,56.785971],[58.537519,56.786122],[58.550353,56.787483],[58.55772,56.788286],[58.560355,56.788556],[58.561513,56.788664],[58.562911,56.788766],[58.563954,56.788823],[58.565365,56.788876],[58.56665,56.788893],[58.568018,56.788871],[58.569676,56.788816],[58.571899,56.788723],[58.573407,56.788675],[58.574439,56.788661],[58.576674,56.78869],[58.579052,56.788768],[58.581424,56.788943],[58.590352,56.789775],[58.597427,56.790405],[58.599073,56.790582],[58.600586,56.790799],[58.602092,56.791079],[58.603398,56.79132],[58.60469,56.791591],[58.604875,56.79163],[58.606596,56.792035],[58.610055,56.792947],[58.610517,56.793087],[58.611911,56.793511],[58.614426,56.794236],[58.616052,56.794667],[58.616161,56.794692],[58.618568,56.795267],[58.621456,56.795837],[58.623707,56.79621],[58.624801,56.796351],[58.626355,56.796536],[58.628553,56.796778],[58.631146,56.796946],[58.633925,56.796983],[58.637056,56.796907],[58.640453,56.796741],[58.648091,56.796409],[58.651665,56.796369],[58.654927,56.796388],[58.665371,56.7967],[58.665627,56.796708],[58.677055,56.796951],[58.68037,56.79706],[58.680754,56.797072],[58.686984,56.797198],[58.690218,56.797339],[58.690685,56.797368],[58.692111,56.797497],[58.693943,56.797708],[58.696451,56.798054],[58.698889,56.798497],[58.702334,56.799272],[58.705694,56.800302],[58.707881,56.801095],[58.709874,56.80193],[58.709997,56.801982],[58.71534,56.804485],[58.717429,56.805393],[58.719568,56.806278],[58.721648,56.807038],[58.724202,56.807895],[58.726912,56.808715],[58.731611,56.809988],[58.736282,56.811377],[58.739176,56.812332],[58.74207,56.813357],[58.745427,56.814654],[58.748771,56.816051],[58.751637,56.817383],[58.755438,56.819253],[58.76113,56.822111],[58.768345,56.825761],[58.773796,56.828478],[58.775255,56.829162],[58.776891,56.82984],[58.778366,56.830353],[58.779584,56.830755],[58.781043,56.831187],[58.782282,56.831524],[58.783736,56.831877],[58.785394,56.832246],[58.787121,56.832549],[58.788059,56.832713],[58.78939,56.83286],[58.790957,56.833033],[58.792267,56.833137],[58.79284,56.833174],[58.793405,56.833211],[58.79364,56.833226],[58.79496,56.833296],[58.795957,56.833299],[58.796738,56.833295],[58.797377,56.83328],[58.798461,56.833249],[58.799531,56.833195],[58.800194,56.833147],[58.800585,56.833118],[58.803418,56.832913],[58.805601,56.832734],[58.81084,56.832327],[58.814194,56.83209],[58.816886,56.832007],[58.819185,56.831997],[58.821205,56.832027],[58.823523,56.832133],[58.826691,56.832368],[58.827097,56.832403],[58.831082,56.832771],[58.838175,56.833675],[58.841671,56.834247],[58.849108,56.836077],[58.851791,56.836611],[58.852108,56.836663],[58.854527,56.837063],[58.85681,56.837355],[58.859412,56.837589],[58.862355,56.837709],[58.868333,56.837889],[58.870767,56.837865],[58.872652,56.837771],[58.8744,56.837569],[58.876401,56.837279],[58.88508,56.835433],[58.888362,56.834864],[58.888521,56.834837],[58.8919,56.834427],[58.895177,56.834254],[58.897949,56.834189],[58.900773,56.834278],[58.910133,56.834884],[58.912706,56.835034],[58.914204,56.835071],[58.915447,56.835075],[58.917759,56.835075],[58.919667,56.835069],[58.920363,56.835059],[58.922087,56.835036],[58.924077,56.834945],[58.925854,56.834873],[58.926712,56.834854],[58.929628,56.834692],[58.930572,56.834621],[58.933229,56.834376],[58.935552,56.834117],[58.937119,56.833917],[58.945822,56.832659],[58.952666,56.831669],[58.954519,56.831401],[58.961083,56.830449],[58.968501,56.829367],[58.976586,56.82819],[58.978487,56.827928],[58.980006,56.827749],[58.981111,56.827637],[58.982412,56.827524],[58.983635,56.82743],[58.984737,56.827364],[58.988452,56.827194],[58.992163,56.827056],[58.993766,56.827032],[58.995503,56.827041],[58.997208,56.827075],[58.998736,56.827145],[59.000327,56.827242],[59.001682,56.827345],[59.003237,56.827481],[59.006738,56.827866],[59.011012,56.828328],[59.015283,56.828755],[59.017031,56.828915],[59.020248,56.829189],[59.023682,56.829407],[59.026025,56.829552],[59.028754,56.829674],[59.031483,56.829766],[59.033595,56.829823],[59.03667,56.829848],[59.038754,56.829846],[59.040525,56.829844],[59.040956,56.829844],[59.044011,56.829771],[59.044054,56.82977],[59.046402,56.82969],[59.050102,56.829513],[59.056129,56.829227],[59.058205,56.82915],[59.060221,56.829114],[59.062424,56.8291],[59.064056,56.829158],[59.064518,56.829172],[59.06724,56.829304],[59.070771,56.82955],[59.072954,56.829673],[59.074824,56.829745],[59.076614,56.829777],[59.078517,56.829788],[59.080102,56.829785],[59.081452,56.829755],[59.082934,56.829703],[59.084357,56.829655],[59.086068,56.829542],[59.087952,56.829403],[59.089572,56.829263],[59.10102,56.828122],[59.103556,56.827993],[59.106116,56.827973],[59.109346,56.828075],[59.112031,56.828265],[59.114595,56.828575],[59.118494,56.829144],[59.120862,56.82945],[59.123387,56.829646],[59.125844,56.829742],[59.12831,56.829749],[59.130898,56.829644],[59.133649,56.829386],[59.138398,56.828787],[59.144295,56.82797],[59.150255,56.827123],[59.154783,56.826534],[59.159113,56.826092],[59.162514,56.82585],[59.166105,56.825724],[59.169495,56.825665],[59.172461,56.825704],[59.177393,56.82591],[59.195898,56.827154],[59.199814,56.827397],[59.202664,56.827494],[59.205228,56.827457],[59.207873,56.827347],[59.226478,56.826066],[59.234092,56.825489],[59.238941,56.825238],[59.239061,56.825232],[59.242886,56.825048],[59.252657,56.824873],[59.263562,56.824924],[59.271679,56.824869],[59.276532,56.824719],[59.282366,56.82446],[59.290349,56.824069],[59.294391,56.823893],[59.298865,56.823778],[59.311141,56.823632],[59.316742,56.823518],[59.322154,56.823346],[59.325452,56.823143],[59.329244,56.822792],[59.332224,56.822393],[59.335462,56.821828],[59.337502,56.8214],[59.339583,56.820932],[59.341508,56.820425],[59.34329,56.819911],[59.345357,56.819232],[59.347769,56.818368],[59.350717,56.817164],[59.354249,56.81565],[59.357482,56.814074],[59.360939,56.81223],[59.363061,56.811024],[59.368227,56.808062],[59.370829,56.80658],[59.373309,56.8052],[59.375235,56.804213],[59.377738,56.8031],[59.379814,56.802221],[59.381734,56.80143],[59.385863,56.799799],[59.387967,56.799056],[59.390106,56.798379],[59.392078,56.797854],[59.393995,56.797404],[59.395846,56.797033],[59.397645,56.796722],[59.398297,56.796609],[59.400362,56.79634],[59.40244,56.796132],[59.404219,56.795986],[59.405585,56.795918],[59.407229,56.795861],[59.408624,56.795839],[59.409734,56.795835],[59.410938,56.795853],[59.412212,56.795896],[59.413218,56.795933],[59.413399,56.79594],[59.413695,56.795952],[59.416645,56.796068],[59.425131,56.796384],[59.43027,56.796575],[59.435323,56.796762],[59.440729,56.796961],[59.445856,56.797158],[59.448948,56.797285],[59.45096,56.797366],[59.452626,56.79747],[59.45399,56.797567],[59.45512,56.797661],[59.456545,56.797809],[59.459313,56.79819],[59.460764,56.79842],[59.462281,56.798675],[59.463941,56.798968],[59.465039,56.799182],[59.465947,56.799374],[59.467457,56.799724],[59.468493,56.800014],[59.470207,56.800544],[59.472239,56.801163],[59.474554,56.801989],[59.477194,56.802962],[59.478308,56.803379],[59.481003,56.804389],[59.483659,56.805359],[59.483755,56.805393],[59.484149,56.805535],[59.485242,56.805916],[59.485953,56.806144],[59.486668,56.806365],[59.488237,56.806851],[59.490406,56.807452],[59.492428,56.807966],[59.494059,56.80836],[59.495577,56.808695],[59.497228,56.809015],[59.499049,56.809353],[59.500801,56.809648],[59.502884,56.809953],[59.504658,56.810201],[59.506575,56.810434],[59.507826,56.810567],[59.509041,56.810667],[59.510945,56.810811],[59.512132,56.810887],[59.513248,56.810947],[59.515388,56.81104],[59.515865,56.811053],[59.51657,56.81107],[59.518521,56.811063],[59.520759,56.811061],[59.522367,56.811063],[59.525231,56.81097],[59.525766,56.810911],[59.526499,56.810869],[59.526984,56.810844],[59.527399,56.810814],[59.527748,56.810825],[59.529617,56.810679],[59.531472,56.810489],[59.533156,56.810298],[59.538048,56.809755],[59.539771,56.809577],[59.540848,56.809488],[59.542613,56.809402],[59.542822,56.809392],[59.543137,56.809378],[59.543927,56.809364],[59.544229,56.809359],[59.545069,56.809379],[59.546535,56.809441],[59.547372,56.809527],[59.549829,56.80987],[59.551386,56.810165],[59.552732,56.810565],[59.55439,56.811184],[59.555935,56.811936],[59.557639,56.812961],[59.559208,56.814044],[59.563819,56.817648],[59.566471,56.819252],[59.569452,56.820731],[59.571765,56.821805],[59.574213,56.822772],[59.57664,56.823592],[59.578749,56.824279],[59.580294,56.824686],[59.581958,56.825115],[59.585139,56.825845],[59.589826,56.826713],[59.595375,56.827578],[59.595444,56.827589],[59.601327,56.828404],[59.617435,56.830707],[59.622696,56.831462],[59.625247,56.831874],[59.630427,56.832868],[59.634173,56.833658],[59.634815,56.833826],[59.642268,56.835776],[59.645023,56.836453],[59.64792,56.837024],[59.653905,56.838178],[59.654399,56.838286],[59.66022,56.839556],[59.665846,56.841014],[59.671467,56.842585],[59.680632,56.845634],[59.680823,56.845695],[59.681565,56.845968],[59.681914,56.846096],[59.682999,56.846512],[59.686264,56.847796],[59.688794,56.848854],[59.688812,56.848861],[59.689699,56.849233],[59.690581,56.849629],[59.692318,56.850403],[59.694062,56.851147],[59.696953,56.85231],[59.698431,56.852842],[59.69917,56.853107],[59.699901,56.853358],[59.704966,56.854936],[59.708488,56.856041],[59.709705,56.85641],[59.710986,56.856804],[59.714223,56.857795],[59.716018,56.858297],[59.716964,56.858549],[59.717497,56.858681],[59.718067,56.85881],[59.718637,56.858933],[59.719256,56.859048],[59.719887,56.859164],[59.720214,56.859216],[59.720535,56.859271],[59.720907,56.859331],[59.721289,56.859381],[59.721674,56.85943],[59.721881,56.859454],[59.722149,56.859479],[59.722645,56.859518],[59.723049,56.859545],[59.723569,56.859568],[59.724087,56.859585],[59.724601,56.8596],[59.725649,56.859617],[59.726718,56.859608],[59.727822,56.859535],[59.729479,56.859451],[59.731265,56.8593],[59.734537,56.8589],[59.736585,56.858685],[59.738807,56.858544],[59.741112,56.858474],[59.743445,56.858478],[59.745411,56.858556],[59.747378,56.858714],[59.749578,56.858907],[59.751779,56.859036],[59.75272,56.859063],[59.754668,56.859032],[59.756103,56.858951],[59.757539,56.858823],[59.759344,56.858493],[59.760996,56.858122],[59.762349,56.857767],[59.763561,56.857408],[59.765031,56.856937],[59.766694,56.856339],[59.768605,56.855652],[59.770538,56.85499],[59.771863,56.854613],[59.773588,56.854155],[59.774539,56.853933],[59.776079,56.853606],[59.777403,56.853374],[59.778418,56.853233],[59.779067,56.853153],[59.781306,56.852903],[59.783109,56.852768],[59.785103,56.852655],[59.790347,56.852379],[59.795991,56.852112],[59.799008,56.851858],[59.801227,56.851549],[59.804118,56.851086],[59.806892,56.850517],[59.809461,56.849842],[59.80981,56.849733],[59.810691,56.849459],[59.811826,56.849047],[59.81277,56.848687],[59.813341,56.848469],[59.815266,56.847685],[59.81588,56.847413],[59.816726,56.84704],[59.818136,56.846362],[59.818575,56.846138],[59.819367,56.845734],[59.819509,56.845662],[59.820955,56.844883],[59.822351,56.844021],[59.823769,56.843058],[59.825294,56.841943],[59.826794,56.840726],[59.828263,56.839532],[59.82997,56.838336],[59.830859,56.837762],[59.831809,56.837207],[59.833455,56.836267],[59.83518,56.835379],[59.838936,56.833835],[59.840879,56.833106],[59.842926,56.832419],[59.844582,56.831931],[59.846269,56.831465],[59.848332,56.830942],[59.850843,56.830384],[59.855435,56.829302],[59.859817,56.828351],[59.861514,56.827972],[59.863211,56.827645],[59.864634,56.827386],[59.866329,56.827119],[59.867967,56.826893],[59.869614,56.826702],[59.871132,56.826553],[59.873806,56.826356],[59.875518,56.826291],[59.876679,56.826256],[59.877816,56.826248],[59.879055,56.826264],[59.880499,56.82631],[59.882926,56.826384],[59.885263,56.826495],[59.886544,56.826536],[59.887916,56.826581],[59.889767,56.826622],[59.892976,56.826696],[59.895002,56.826733],[59.900181,56.826786],[59.903585,56.826799],[59.90618,56.826818],[59.908417,56.826838],[59.910735,56.826811],[59.913967,56.826738],[59.916261,56.826658],[59.91976,56.826596],[59.921366,56.826606],[59.923538,56.826652],[59.924264,56.826681],[59.927353,56.826821],[59.930278,56.827037],[59.930734,56.827082],[59.932105,56.827215],[59.932205,56.827226],[59.936893,56.827617],[59.937274,56.827644],[59.938768,56.82772],[59.940289,56.827778],[59.942474,56.827823],[59.942502,56.827824],[59.944769,56.827833],[59.947239,56.827786],[59.949133,56.827724],[59.951276,56.827613],[59.954184,56.827412],[59.955695,56.827324],[59.9571,56.827234],[59.958222,56.827178],[59.960958,56.827],[59.966892,56.82665],[59.969935,56.826419],[59.971284,56.826323],[59.972373,56.826256],[59.973073,56.826214],[59.976077,56.82602],[59.976921,56.825964],[59.978881,56.825833],[59.979383,56.825804],[59.979421,56.825801],[59.980048,56.825763],[59.980331,56.825747],[59.982539,56.825657],[59.98306,56.825635],[59.983509,56.82563],[59.984884,56.825695],[59.986073,56.825855],[59.987217,56.826085],[59.987799,56.826228],[59.988306,56.826411],[59.988912,56.826629],[59.989736,56.826962],[59.990741,56.827453],[59.99178,56.828059],[59.992818,56.828804],[59.993427,56.82928],[59.994419,56.83021],[59.995596,56.831402],[59.996678,56.832554],[59.997622,56.833571],[59.998151,56.834141],[59.998792,56.834814],[59.999839,56.835917],[60.000336,56.836325],[60.001257,56.837171],[60.003101,56.838594],[60.004618,56.839557],[60.006448,56.840565],[60.006914,56.840797],[60.007792,56.841233],[60.009188,56.841853],[60.010244,56.842233],[60.013658,56.843382],[60.016387,56.844101],[60.017645,56.84437],[60.021092,56.844983],[60.022835,56.845292],[60.026295,56.845866],[60.030044,56.846484],[60.030722,56.846599],[60.032305,56.846863],[60.036413,56.847549],[60.036651,56.847588],[60.040901,56.848258],[60.041371,56.848312],[60.042971,56.848498],[60.043656,56.848586],[60.044709,56.84869],[60.045004,56.848713],[60.047128,56.848878],[60.047131,56.848878],[60.050141,56.849075],[60.052497,56.849183],[60.052602,56.849185],[60.055122,56.849226],[60.056752,56.849214],[60.057118,56.849217],[60.059808,56.849158],[60.061294,56.849123],[60.063522,56.848996],[60.064571,56.848923],[60.06499,56.848859],[60.066014,56.848773],[60.066331,56.848746],[60.06876,56.84854],[60.070185,56.848399],[60.071398,56.848248],[60.072743,56.848067],[60.074215,56.847853],[60.075036,56.84773],[60.07579,56.847608],[60.076865,56.847414],[60.077951,56.847214],[60.080332,56.846736],[60.082139,56.846337],[60.083008,56.846127],[60.083993,56.845876],[60.084183,56.845829],[60.090396,56.844274],[60.094617,56.843188],[60.096473,56.842736],[60.098168,56.842314],[60.098961,56.842112],[60.102008,56.841337],[60.103066,56.841094],[60.104478,56.840772],[60.105956,56.84047],[60.106368,56.840389],[60.10753,56.84016],[60.109181,56.839861],[60.110008,56.839724],[60.110676,56.839613],[60.112201,56.83941],[60.114045,56.83917],[60.114274,56.839143],[60.115307,56.839024],[60.117184,56.838801],[60.118361,56.838703],[60.119498,56.838614],[60.12087,56.838513],[60.122014,56.838461],[60.128311,56.838215],[60.130444,56.838145],[60.132709,56.83807],[60.135176,56.837988],[60.142044,56.837722],[60.145477,56.837601],[60.146846,56.837574],[60.150595,56.837558],[60.151059,56.837549],[60.152774,56.837572],[60.15486,56.837594],[60.156944,56.837638],[60.158454,56.83768],[60.160492,56.837761],[60.162964,56.837874],[60.163352,56.837892],[60.163922,56.837929],[60.167519,56.838149],[60.171021,56.838405],[60.175538,56.838842],[60.179053,56.839234],[60.179627,56.839297],[60.181983,56.839588],[60.184104,56.839898],[60.185347,56.840079],[60.188312,56.840549],[60.194029,56.84145],[60.194744,56.841576],[60.194991,56.841615],[60.19569,56.841728],[60.203383,56.842965],[60.203573,56.842995],[60.204116,56.843079],[60.206601,56.843464],[60.208777,56.843761],[60.21062,56.843974],[60.211572,56.84408],[60.213168,56.84422],[60.213763,56.844266],[60.215738,56.844419],[60.21769,56.844527],[60.21808,56.844544],[60.218776,56.844574],[60.222456,56.844673],[60.224986,56.844677],[60.226535,56.844662],[60.228719,56.844598],[60.231467,56.844442],[60.232544,56.844362],[60.234869,56.844161],[60.237721,56.843827],[60.238912,56.843688],[60.242048,56.843267],[60.243472,56.843084],[60.24902,56.842351],[60.251355,56.842016],[60.256221,56.841255],[60.257898,56.840964],[60.261593,56.840304],[60.263524,56.839957],[60.265254,56.839646],[60.273448,56.838124],[60.278969,56.837113],[60.283752,56.836267],[60.286435,56.835834],[60.289131,56.835432],[60.289549,56.835375],[60.290964,56.83518],[60.292727,56.834958],[60.294022,56.834801],[60.2946,56.834729],[60.294731,56.834716],[60.298264,56.834332],[60.300836,56.834082],[60.302945,56.833902],[60.304986,56.833745],[60.307556,56.833565],[60.310346,56.833412],[60.312917,56.83329],[60.314906,56.833232],[60.315434,56.83322],[60.317585,56.833153],[60.320175,56.833066],[60.32136,56.833037],[60.321715,56.833024],[60.326524,56.832896],[60.330986,56.832757],[60.334438,56.832604],[60.337369,56.83244],[60.343398,56.832103],[60.347988,56.831913],[60.350416,56.831852],[60.35361,56.831818],[60.357268,56.831822],[60.360878,56.831863],[60.367225,56.831938],[60.370182,56.831947],[60.371782,56.831933],[60.376103,56.831862],[60.378847,56.831777],[60.381576,56.831671],[60.384503,56.83154],[60.387488,56.831395],[60.387995,56.83136],[60.388654,56.83132],[60.389337,56.831283],[60.390659,56.831206],[60.39153,56.831141],[60.392487,56.831078],[60.39322,56.83103],[60.393549,56.831005],[60.395386,56.83088],[60.403781,56.830076],[60.405718,56.829879],[60.419073,56.828575],[60.419991,56.82849],[60.423484,56.828154],[60.426195,56.827892],[60.430899,56.827414],[60.435814,56.826943],[60.438851,56.826645],[60.441525,56.826407],[60.443936,56.82622],[60.447039,56.825993],[60.447964,56.825934],[60.451744,56.825715],[60.455553,56.825517],[60.457642,56.825454],[60.460257,56.825379],[60.463642,56.825324],[60.466178,56.825309],[60.468218,56.82531],[60.469694,56.825309],[60.471254,56.825327],[60.475604,56.825351],[60.480038,56.825385],[60.481747,56.825406],[60.484756,56.825459],[60.485835,56.825483],[60.487457,56.825518],[60.488008,56.825486],[60.488588,56.825431],[60.489239,56.825348],[60.49002,56.825223],[60.490572,56.825111],[60.491161,56.824936],[60.491418,56.824845],[60.493523,56.823899],[60.494248,56.823593],[60.49523,56.82323],[60.496316,56.822844],[60.497128,56.822562],[60.497953,56.822267],[60.499696,56.821675],[60.499876,56.821611],[60.500091,56.821538],[60.500484,56.821403],[60.500643,56.821348],[60.50173,56.820944],[60.503286,56.820325],[60.504183,56.819936],[60.505728,56.819241],[60.507531,56.818372],[60.508651,56.817772],[60.509727,56.817138],[60.510007,56.816961],[60.510116,56.816898],[60.511293,56.816167],[60.512273,56.815594],[60.512439,56.815502],[60.513049,56.815143],[60.514725,56.814232],[60.516958,56.813079],[60.51722,56.812943],[60.517458,56.812824],[60.517631,56.812746],[60.518603,56.812286],[60.518692,56.812247],[60.519086,56.812059],[60.519461,56.811895],[60.52239,56.810644],[60.52548,56.809422],[60.529021,56.808089],[60.530555,56.807472],[60.532773,56.806546],[60.53328,56.806335],[60.535061,56.805475],[60.535994,56.80504],[60.536552,56.80471],[60.536879,56.804484],[60.537016,56.804279],[60.537151,56.804124],[60.537229,56.803987],[60.537441,56.803715],[60.537575,56.803596],[60.537745,56.803487],[60.537888,56.803411],[60.538151,56.803304],[60.53827,56.803267],[60.538328,56.803252],[60.538731,56.803163],[60.539204,56.803117],[60.539636,56.803131],[60.540164,56.803119],[60.540638,56.803078],[60.541057,56.803022],[60.541428,56.802939],[60.541861,56.802829],[60.54424,56.802076],[60.545513,56.801674],[60.547092,56.80119],[60.548836,56.800636],[60.550086,56.800202],[60.551254,56.799736],[60.552526,56.79927],[60.556536,56.797794],[60.558277,56.79711],[60.561662,56.795876],[60.565299,56.794501],[60.569054,56.793073],[60.570164,56.792644],[60.570545,56.792502],[60.572681,56.7917],[60.572824,56.791644],[60.572966,56.791589],[60.573184,56.791507],[60.573689,56.791328],[60.577401,56.789954],[60.579134,56.789369],[60.58011,56.789042],[60.58106,56.788819],[60.582364,56.788622],[60.583183,56.788541],[60.584023,56.788516],[60.584982,56.788519],[60.585809,56.788567],[60.58715,56.7887],[60.588385,56.788823],[60.592459,56.789289],[60.596303,56.789798],[60.597141,56.789914],[60.598276,56.790066],[60.598813,56.790153],[60.601257,56.790548],[60.602946,56.790779],[60.603644,56.790854],[60.60432,56.790895],[60.604962,56.790924],[60.605642,56.790937],[60.606193,56.790931],[60.606934,56.790913],[60.607731,56.790866],[60.60863,56.790787],[60.609349,56.790714],[60.610204,56.790605],[60.610821,56.790512],[60.612429,56.790134],[60.612916,56.789995],[60.614008,56.78966],[60.61431,56.789569],[60.615853,56.789083],[60.616616,56.788882],[60.617837,56.788576],[60.618259,56.788474],[60.618859,56.788343],[60.6198,56.788129],[60.620392,56.788032],[60.621154,56.787925],[60.622133,56.787827],[60.624103,56.787626],[60.625336,56.7875],[60.627358,56.787333],[60.628698,56.78729],[60.629522,56.787284],[60.62978,56.787301],[60.63056,56.787399],[60.631384,56.787528],[60.63218,56.787699],[60.632972,56.787902],[60.63361,56.788076],[60.634209,56.788279],[60.635575,56.788859],[60.636553,56.789492],[60.63769,56.790483],[60.638882,56.791671],[60.639083,56.791929],[60.639258,56.792208],[60.639782,56.793669],[60.64032,56.794909],[60.640965,56.796431],[60.641087,56.796859],[60.641416,56.797659],[60.641755,56.798554],[60.641981,56.799058],[60.642274,56.799503],[60.6426,56.799911],[60.642892,56.800186],[60.643182,56.800424],[60.643868,56.80096],[60.644191,56.801175],[60.644406,56.801307],[60.644677,56.801442],[60.645181,56.801697],[60.64564,56.801924],[60.646203,56.802204],[60.646875,56.802531],[60.647703,56.802934],[60.647928,56.803043],[60.648066,56.803102],[60.648566,56.803352],[60.648838,56.803499],[60.649848,56.804044],[60.650562,56.804523],[60.650869,56.804749],[60.651308,56.805097],[60.651676,56.805424],[60.652019,56.805757],[60.652359,56.806115],[60.652652,56.806473],[60.652802,56.806686],[60.653011,56.806995],[60.653253,56.807406],[60.653574,56.808053],[60.653873,56.808646],[60.654436,56.809752],[60.655192,56.811319],[60.655217,56.811371],[60.655418,56.811794],[60.655688,56.812347],[60.655794,56.812598],[60.655875,56.812846],[60.655943,56.813174],[60.655985,56.813524],[60.655997,56.813758],[60.655957,56.81436],[60.655938,56.814559],[60.655914,56.814705],[60.6558,56.815088],[60.655424,56.816457],[60.655239,56.817137],[60.655142,56.817515],[60.654957,56.818242],[60.654877,56.818662],[60.654687,56.81931],[60.654517,56.819941],[60.654355,56.820531],[60.654322,56.82079],[60.654314,56.82104],[60.654318,56.821125],[60.65433,56.821273],[60.654365,56.821422],[60.654416,56.821572],[60.654436,56.821607],[60.654802,56.822274],[60.654954,56.822538],[60.655007,56.822609],[60.655197,56.822775],[60.656237,56.823153],[60.656404,56.82322],[60.656508,56.823266],[60.65661,56.823315],[60.656752,56.8234],[60.657081,56.823633],[60.658548,56.824835],[60.660273,56.826253],[60.661126,56.826952],[60.661632,56.827363],[60.661955,56.827621],[60.662908,56.828383],[60.662972,56.828434],[60.663128,56.828569],[60.663455,56.828871],[60.663528,56.828945],[60.663664,56.829084],[60.663921,56.829374],[60.664127,56.829583],[60.664311,56.829744],[60.664374,56.829792],[60.664496,56.829907],[60.664686,56.830033],[60.6649,56.830133],[60.665087,56.830207],[60.665449,56.830281],[60.666278,56.830397],[60.666844,56.830467],[60.667226,56.830547],[60.667598,56.8306],[60.668273,56.830688],[60.66865,56.83074],[60.669002,56.830789],[60.669283,56.830811],[60.669498,56.830817],[60.66986,56.830812],[60.670587,56.830798],[60.670833,56.830785],[60.671126,56.830757],[60.671528,56.830699],[60.672081,56.830597],[60.672505,56.830504],[60.672971,56.830388],[60.674351,56.830049],[60.6759,56.829611],[60.676637,56.82938],[60.679741,56.828379],[60.680382,56.828173],[60.68173,56.827734],[60.681925,56.827672],[60.682557,56.82747],[60.682899,56.82736],[60.683905,56.827033],[60.685612,56.826479],[60.687371,56.825917],[60.688836,56.825489],[60.692077,56.824687],[60.692529,56.824581],[60.693627,56.824343],[60.69524,56.824038],[60.695973,56.823902],[60.696273,56.823848],[60.696791,56.823755],[60.697815,56.823589],[60.699997,56.823289],[60.702188,56.823034],[60.703765,56.822873],[60.705892,56.822631],[60.705923,56.822626],[60.706345,56.822567],[60.708037,56.822334],[60.709455,56.822102],[60.711685,56.821689],[60.712795,56.821461],[60.713789,56.821249],[60.715595,56.820842],[60.716605,56.820598],[60.720062,56.819791],[60.727019,56.818168],[60.728393,56.817845],[60.730061,56.817445],[60.730947,56.81719],[60.73277,56.816729],[60.734043,56.816441],[60.734704,56.816287],[60.736639,56.815902],[60.740967,56.814901],[60.743228,56.81438],[60.747598,56.813349],[60.750361,56.812694],[60.753816,56.811883],[60.758786,56.810722],[60.761327,56.810114],[60.762109,56.80993],[60.765331,56.809173],[60.7685,56.808431],[60.768592,56.808409],[60.768877,56.808339],[60.771317,56.807781],[60.774506,56.807044],[60.776631,56.806553],[60.780476,56.805646],[60.782075,56.805255],[60.784644,56.804653],[60.786974,56.804102],[60.787739,56.803919],[60.788635,56.803709],[60.788722,56.80369],[60.78967,56.803466],[60.79177,56.802969],[60.795925,56.801986],[60.797872,56.801536],[60.800574,56.800888],[60.803428,56.800222],[60.804672,56.79992],[60.806898,56.799391],[60.808378,56.799036],[60.809706,56.798688],[60.810843,56.798379],[60.811868,56.798091],[60.813265,56.797669],[60.814365,56.797305],[60.815313,56.796996],[60.816434,56.796623],[60.817743,56.796144],[60.818881,56.795693],[60.818897,56.795686],[60.820658,56.794953],[60.821138,56.794758],[60.822528,56.794147],[60.823794,56.793544],[60.82529,56.792798],[60.826674,56.792064],[60.827871,56.7914],[60.829265,56.790589],[60.830635,56.78973],[60.831497,56.789184],[60.835113,56.786641],[60.8354,56.786452],[60.835553,56.786351],[60.83571,56.786245],[60.837286,56.785188],[60.838809,56.784296],[60.840221,56.783528],[60.841294,56.782949],[60.842442,56.78236],[60.843024,56.782073],[60.84373,56.781735],[60.844182,56.781528],[60.844626,56.781325],[60.844819,56.781237],[60.845969,56.780758],[60.847284,56.780215],[60.848409,56.779776],[60.849707,56.779272],[60.850656,56.778927],[60.851907,56.77849],[60.853642,56.777933],[60.855452,56.777385],[60.856994,56.776956],[60.857781,56.776736],[60.8589,56.776447],[60.860249,56.77611],[60.861167,56.775899],[60.86218,56.775675],[60.863778,56.775345],[60.865814,56.774945],[60.866876,56.774737],[60.867242,56.774666],[60.868891,56.774336],[60.870194,56.77408],[60.872231,56.773671],[60.873312,56.773447],[60.875374,56.773035],[60.876474,56.772819],[60.878563,56.772411],[60.880562,56.772012],[60.882522,56.771617],[60.884381,56.771241],[60.886111,56.770898],[60.887797,56.770554],[60.890374,56.770048],[60.892402,56.769645],[60.894021,56.769295],[60.895484,56.768959],[60.896489,56.768724],[60.898791,56.768142],[60.900584,56.76767],[60.902248,56.767211],[60.902691,56.767089],[60.904072,56.766698],[60.904551,56.766562],[60.905931,56.766128],[60.907783,56.765512],[60.909605,56.764894],[60.910989,56.764395],[60.912437,56.763867],[60.913629,56.763429],[60.915433,56.762753],[60.917152,56.76213],[60.918478,56.761675],[60.919185,56.76144],[60.92036,56.761052],[60.92209,56.760515],[60.923981,56.759966],[60.925569,56.759527],[60.927264,56.759089],[60.928989,56.758666],[60.931081,56.758188],[60.932676,56.75786],[60.932824,56.75783],[60.934528,56.757494],[60.937038,56.757001],[60.939227,56.756581],[60.941375,56.756162],[60.943974,56.755656],[60.945753,56.755319],[60.947966,56.754893],[60.948911,56.754711],[60.949599,56.754578],[60.951383,56.754222],[60.953273,56.75385],[60.955232,56.75347],[60.95795,56.752947],[60.958546,56.752833],[60.958778,56.752787],[60.959971,56.752552],[60.959995,56.752547],[60.962718,56.75202],[60.964483,56.751675],[60.965354,56.751505],[60.970333,56.750528],[60.971465,56.750302],[60.972663,56.750072],[60.975236,56.749568],[60.97802,56.749],[60.978397,56.748908],[60.981327,56.748255],[60.982987,56.747854],[60.984936,56.74738],[60.986889,56.746876],[60.988082,56.746555],[60.989673,56.746121],[60.990801,56.745807],[60.992528,56.745279],[60.992635,56.745246],[60.994058,56.744815],[60.995911,56.744225],[60.997672,56.743669],[60.997698,56.743661],[60.999354,56.743098],[61.000483,56.742714],[61.002002,56.742187],[61.0047,56.741218],[61.0074,56.740172],[61.008087,56.739912],[61.009927,56.739169],[61.011588,56.738453],[61.012781,56.737957],[61.013784,56.737566],[61.015753,56.736838],[61.017498,56.736279],[61.019234,56.735767],[61.020709,56.735385],[61.021691,56.735143],[61.0226,56.734925],[61.023574,56.734717],[61.024537,56.73452],[61.025709,56.734301],[61.027433,56.73401],[61.028622,56.733826],[61.029809,56.733629],[61.031749,56.733358],[61.033455,56.733167],[61.034971,56.733047],[61.035581,56.73301],[61.036888,56.732958],[61.03801,56.732915],[61.038489,56.732904],[61.038881,56.732894],[61.039725,56.732886],[61.040604,56.732894],[61.04167,56.732934],[61.042795,56.732978],[61.044191,56.733059],[61.046055,56.733199],[61.047922,56.733363],[61.049321,56.733496],[61.050806,56.733613],[61.051383,56.733658],[61.05206,56.73371],[61.052436,56.733739],[61.05332,56.733774],[61.054196,56.733783],[61.055135,56.73377],[61.056006,56.733727],[61.056166,56.733717],[61.056735,56.733684],[61.05767,56.733635],[61.061896,56.733436],[61.06268,56.7334],[61.065752,56.733251],[61.06753,56.733164],[61.070619,56.733141],[61.075332,56.733416],[61.078636,56.733638],[61.08007,56.733774],[61.082517,56.734119],[61.08277,56.734151],[61.085175,56.734469],[61.08636,56.734616],[61.087196,56.734698],[61.087916,56.734763],[61.094249,56.735225],[61.095245,56.735297],[61.096735,56.735542],[61.098263,56.735782],[61.100486,56.736163],[61.10247,56.736551],[61.104304,56.736964],[61.105586,56.737274],[61.106628,56.737545],[61.10773,56.737857],[61.109333,56.738338],[61.110762,56.738781],[61.111033,56.738881],[61.111403,56.739017],[61.112757,56.739457],[61.113532,56.739708],[61.116904,56.740822],[61.118366,56.741294],[61.119198,56.741563],[61.119736,56.741737],[61.121205,56.742244],[61.122862,56.742874],[61.123852,56.743273],[61.124636,56.74361],[61.126189,56.744314],[61.127798,56.745093],[61.128569,56.745489],[61.129423,56.745963],[61.130514,56.746616],[61.13124,56.74706],[61.131968,56.747548],[61.132831,56.748158],[61.134277,56.749285],[61.13554,56.750281],[61.138224,56.752377],[61.138249,56.752396],[61.139393,56.753188],[61.140792,56.754091],[61.142611,56.755136],[61.143976,56.755837],[61.146156,56.756872],[61.14749,56.757425],[61.14767,56.757499],[61.14983,56.758359],[61.151366,56.758914],[61.153297,56.759526],[61.159082,56.761304],[61.165888,56.763372],[61.165957,56.763393],[61.172497,56.765397],[61.179295,56.76749],[61.186153,56.769574],[61.190393,56.770877],[61.198405,56.773336],[61.205156,56.77542],[61.207697,56.776154],[61.210091,56.776751],[61.211919,56.77716],[61.213851,56.777541],[61.216211,56.777922],[61.217699,56.778156],[61.219729,56.778401],[61.221077,56.778532],[61.222384,56.778653],[61.223814,56.77876],[61.225809,56.778849],[61.227908,56.778924],[61.231146,56.779021],[61.233279,56.779087],[61.236991,56.779173],[61.24499,56.779394],[61.246913,56.779412],[61.248741,56.779394],[61.251359,56.779304],[61.254037,56.779139],[61.256637,56.77897],[61.261213,56.778655],[61.262937,56.778529],[61.264165,56.77845],[61.264681,56.778421],[61.266014,56.778302],[61.269687,56.777959],[61.270461,56.777893],[61.27676,56.777455],[61.279791,56.77719],[61.28137,56.777011],[61.283075,56.776798],[61.285757,56.776518],[61.287198,56.776374],[61.289041,56.776202],[61.292634,56.775791],[61.293226,56.775729],[61.293776,56.775671],[61.296213,56.775366],[61.301121,56.774781],[61.302025,56.77469],[61.302984,56.774608],[61.303861,56.77455],[61.304653,56.774515],[61.305497,56.774501],[61.306642,56.774506],[61.307907,56.774549],[61.30898,56.774613],[61.309474,56.774656],[61.309872,56.774691],[61.310174,56.774727],[61.310768,56.774797],[61.312065,56.774984],[61.313105,56.775179],[61.314155,56.775403],[61.315439,56.77573],[61.316471,56.77603],[61.317764,56.77645],[61.318876,56.776821],[61.321978,56.777878],[61.325139,56.778932],[61.327314,56.779539],[61.328734,56.779912],[61.329845,56.780183],[61.331411,56.780531],[61.333353,56.780923],[61.33505,56.781218],[61.336643,56.781455],[61.338305,56.781687],[61.339834,56.781872],[61.341141,56.781999],[61.342794,56.782132],[61.34412,56.782223],[61.34544,56.782285],[61.346475,56.78232],[61.347446,56.782348],[61.347479,56.782349],[61.34849,56.782359],[61.349737,56.782358],[61.352258,56.782314],[61.355078,56.782255],[61.358481,56.78216],[61.359275,56.782143],[61.364768,56.782022],[61.367105,56.781997],[61.368983,56.782022],[61.369609,56.78205],[61.371611,56.782138],[61.373358,56.782258],[61.374004,56.782303],[61.375739,56.782456],[61.377594,56.782666],[61.379811,56.782978],[61.383106,56.783555],[61.387834,56.784479],[61.389753,56.784853],[61.395905,56.786055],[61.400435,56.786936],[61.404884,56.787816],[61.409031,56.788647],[61.423162,56.791603],[61.426157,56.79221],[61.429181,56.792832],[61.429125,56.792635],[61.429031,56.792434],[61.428792,56.792126],[61.428475,56.791818],[61.427577,56.791013],[61.426416,56.789939],[61.424368,56.788004],[61.422389,56.786143],[61.420261,56.784172],[61.418898,56.782931],[61.418102,56.782234],[61.417494,56.781663],[61.417159,56.781265],[61.416887,56.780894],[61.416548,56.780307],[61.416295,56.779792],[61.416115,56.779364],[61.416038,56.779099],[61.415977,56.778737],[61.415996,56.778383],[61.41613,56.777901],[61.416654,56.776526],[61.41748,56.774323],[61.41755,56.77392],[61.417693,56.773204],[61.417839,56.772829],[61.418046,56.772382],[61.418113,56.77219],[61.418174,56.771724],[61.418213,56.771456],[61.418255,56.771261],[61.418329,56.771092],[61.41853,56.770892],[61.418879,56.770717],[61.419209,56.770626],[61.420194,56.770495],[61.420585,56.770436],[61.420787,56.770368],[61.420958,56.770244],[61.421037,56.770129],[61.421634,56.768572],[61.422249,56.766801],[61.422291,56.766637],[61.422323,56.766338],[61.42232,56.766096],[61.422244,56.765557],[61.422238,56.765393],[61.422274,56.765263],[61.422344,56.765125],[61.422498,56.76485],[61.422747,56.764946],[61.423299,56.765132],[61.423958,56.765341],[61.424707,56.765563],[61.424886,56.765615],[61.427045,56.766236],[61.427997,56.766512],[61.42866,56.766723],[61.429051,56.766871],[61.429313,56.766993],[61.429675,56.767186],[61.430341,56.767571],[61.432049,56.76859],[61.432288,56.768732],[61.434613,56.770114],[61.434875,56.77026],[61.435369,56.770549],[61.435737,56.77073],[61.436195,56.77092],[61.436654,56.771064],[61.436796,56.771098],[61.437257,56.771208],[61.437893,56.771297],[61.43806,56.77131],[61.438907,56.771375],[61.440149,56.771437],[61.441346,56.771452],[61.443138,56.771447],[61.443478,56.771442],[61.444853,56.771427],[61.446078,56.7714],[61.447169,56.77137],[61.447913,56.771331],[61.448286,56.771305],[61.44887,56.771259],[61.449452,56.7712],[61.450108,56.771118],[61.450759,56.771019],[61.451633,56.770883],[61.453364,56.770595],[61.453607,56.770555],[61.453993,56.770491],[61.455554,56.770222],[61.456671,56.77005],[61.458312,56.769816],[61.458766,56.769773],[61.459217,56.769747],[61.4596,56.769751],[61.460087,56.769794],[61.460727,56.769887],[61.461283,56.769969],[61.461461,56.769995],[61.465091,56.77052],[61.466782,56.770746],[61.467296,56.770782],[61.467859,56.770803],[61.469712,56.770825],[61.470441,56.770834],[61.471318,56.770867],[61.472032,56.770913],[61.472481,56.770947],[61.474033,56.771065],[61.479097,56.771441],[61.483648,56.771757],[61.48608,56.771934],[61.488445,56.772106],[61.490845,56.772281],[61.494716,56.772564],[61.500341,56.772975],[61.501,56.773023],[61.502464,56.773133],[61.512647,56.773869],[61.518263,56.774273],[61.51856,56.774295],[61.522091,56.774543],[61.523009,56.774612],[61.523997,56.774687],[61.529346,56.775072],[61.534267,56.775428],[61.538614,56.775737],[61.545637,56.776253],[61.54712,56.776363],[61.550542,56.776609],[61.551781,56.776698],[61.557739,56.777132],[61.563587,56.777564],[61.566047,56.777747],[61.567943,56.777887],[61.573114,56.778252],[61.57733,56.778558],[61.58416,56.779043],[61.585244,56.779125],[61.587376,56.779281],[61.590318,56.779493],[61.592099,56.779621],[61.596185,56.779901],[61.600714,56.780242],[61.603521,56.780451],[61.604084,56.780484],[61.604588,56.78052],[61.608814,56.780832],[61.613358,56.781164],[61.616805,56.781414],[61.61876,56.781555],[61.620658,56.781678],[61.623078,56.781864],[61.628156,56.78223],[61.628662,56.782266],[61.636862,56.782853],[61.639311,56.783028],[61.645,56.78346],[61.653055,56.784014],[61.653893,56.784071],[61.669349,56.785187],[61.67702,56.78574],[61.684759,56.786297],[61.69424,56.786971],[61.695968,56.787132],[61.697266,56.787288],[61.698344,56.787437],[61.699984,56.787714],[61.701378,56.787955],[61.701831,56.788034],[61.705555,56.7887],[61.70795,56.789109],[61.709782,56.789422],[61.710679,56.78956],[61.711913,56.78972],[61.713117,56.789857],[61.71425,56.789967],[61.715838,56.790075],[61.716737,56.790124],[61.717288,56.790147],[61.717576,56.790159],[61.718321,56.790185],[61.718906,56.790192],[61.71909,56.790193],[61.719462,56.790191],[61.720936,56.790151],[61.721664,56.790128],[61.722614,56.790079],[61.723686,56.790019],[61.724749,56.789918],[61.726568,56.789736],[61.728343,56.789456],[61.733073,56.788716],[61.736506,56.788179],[61.749013,56.786236],[61.755691,56.785198],[61.756401,56.785093],[61.757099,56.784988],[61.757795,56.784878],[61.758522,56.784761],[61.760831,56.784406],[61.762247,56.784189],[61.764751,56.783797],[61.780442,56.781409],[61.782969,56.781024],[61.783862,56.780892],[61.784634,56.780789],[61.785879,56.780648],[61.788677,56.780333],[61.791372,56.780041],[61.794977,56.779654],[61.797526,56.77938],[61.800491,56.77906],[61.808755,56.778178],[61.812173,56.777814],[61.81476,56.777538],[61.817541,56.777242],[61.820885,56.776885],[61.824891,56.776456],[61.826874,56.776248],[61.834373,56.775442],[61.838866,56.774967],[61.841334,56.7747],[61.843809,56.774431],[61.844135,56.774393],[61.845272,56.774265],[61.845695,56.774217],[61.846548,56.774131],[61.849584,56.773761],[61.858992,56.772625],[61.862033,56.772253],[61.86839,56.771478],[61.869509,56.771356],[61.870338,56.771269],[61.871162,56.771204],[61.872517,56.771124],[61.873917,56.771079],[61.875212,56.771059],[61.875251,56.771058],[61.876583,56.771071],[61.87701,56.771075],[61.878555,56.771151],[61.880524,56.771233],[61.884471,56.771392],[61.885821,56.771452],[61.893472,56.771773],[61.898988,56.772009],[61.909411,56.772453],[61.913173,56.772609],[61.923302,56.773028],[61.923841,56.773053],[61.926458,56.773159],[61.927702,56.77322],[61.928416,56.773249],[61.93676,56.773594],[61.945251,56.773964],[61.945853,56.773982],[61.947595,56.774054],[61.949317,56.774129],[61.957818,56.774478],[61.96103,56.774611],[61.966298,56.774823],[61.97212,56.77506],[61.977931,56.775302],[61.985448,56.775615],[61.987493,56.775699],[61.989269,56.77576],[61.990722,56.775824],[61.994285,56.775963],[61.99482,56.77599],[61.995549,56.776025],[61.996327,56.776061],[61.999822,56.776207],[62.000738,56.776241],[62.004208,56.776391],[62.008669,56.776583],[62.009251,56.776613],[62.011218,56.776692],[62.017301,56.776943],[62.017785,56.776943],[62.018295,56.7769],[62.018676,56.776812],[62.018975,56.776712],[62.019611,56.776438],[62.020442,56.776061],[62.02128,56.775678],[62.021625,56.77558],[62.022006,56.775506],[62.022383,56.775461],[62.022778,56.77546],[62.023254,56.775499],[62.023749,56.775577],[62.024238,56.775669],[62.024855,56.775794],[62.025746,56.775994],[62.02619,56.776094],[62.026901,56.776202],[62.027412,56.77626],[62.029421,56.77643],[62.02963,56.77643],[62.029856,56.77641],[62.030107,56.776355],[62.03065,56.776223],[62.030995,56.776139],[62.031501,56.77599],[62.031887,56.775844],[62.032992,56.775312],[62.033432,56.775128],[62.033821,56.774971],[62.033992,56.774904],[62.034344,56.774764],[62.035527,56.774189],[62.036426,56.773745],[62.03666,56.773646],[62.037032,56.773545],[62.037788,56.77339],[62.038211,56.773295],[62.038733,56.773123],[62.038893,56.773068],[62.040872,56.772298],[62.042642,56.771612],[62.043439,56.771293],[62.04493,56.770687],[62.045086,56.770623],[62.045806,56.770317],[62.046473,56.770033],[62.046914,56.769851],[62.047809,56.769482],[62.048161,56.769346],[62.048329,56.769296],[62.049382,56.768976],[62.05004,56.768758],[62.050697,56.768549],[62.051277,56.76833],[62.051596,56.768211],[62.052198,56.767976],[62.052435,56.767881],[62.052559,56.767832],[62.052667,56.767789],[62.053387,56.767518],[62.054125,56.76726],[62.054511,56.767147],[62.054932,56.767037],[62.055439,56.766938],[62.058316,56.766426],[62.058553,56.766372],[62.059447,56.766112],[62.060314,56.765859],[62.061117,56.765639],[62.061645,56.765494],[62.062119,56.765392],[62.062814,56.765281],[62.063444,56.765214],[62.063553,56.765205],[62.064611,56.765123],[62.064871,56.765108],[62.065428,56.765041],[62.065724,56.764973],[62.066022,56.764874],[62.066269,56.76476],[62.06693,56.764416],[62.067618,56.764061],[62.071135,56.762253],[62.071381,56.762126],[62.071922,56.761843],[62.072079,56.76176],[62.072612,56.761493],[62.073319,56.76114],[62.073996,56.760789],[62.075155,56.760218],[62.076508,56.759546],[62.077311,56.759234],[62.079072,56.758616],[62.07948,56.758471],[62.079733,56.758381],[62.080516,56.75812],[62.081588,56.757799],[62.08317,56.757375],[62.084011,56.757131],[62.084792,56.756834],[62.085535,56.756516],[62.086149,56.756253],[62.086737,56.756],[62.086846,56.755954],[62.087349,56.755757],[62.087838,56.755578],[62.087965,56.755532],[62.088628,56.755323],[62.089687,56.755002],[62.089931,56.754939],[62.090171,56.754884],[62.090401,56.754843],[62.090628,56.754811],[62.090872,56.754786],[62.091144,56.754759],[62.092517,56.754643],[62.093243,56.754596],[62.093659,56.754567],[62.095206,56.754437],[62.096483,56.754324],[62.097812,56.754229],[62.100237,56.754031],[62.102805,56.75385],[62.103309,56.753828],[62.10427,56.753783],[62.105744,56.753722],[62.107956,56.753743],[62.109081,56.753744],[62.112495,56.753826],[62.116226,56.753915],[62.117646,56.753937],[62.121375,56.754028],[62.123113,56.754068],[62.130267,56.754195],[62.136204,56.754314],[62.144323,56.754485],[62.145704,56.754514],[62.148476,56.754573],[62.15,56.754605],[62.152588,56.754657],[62.157082,56.754749],[62.157446,56.754752],[62.16989,56.755008],[62.173034,56.755072],[62.181639,56.755247],[62.186294,56.755333],[62.188988,56.755383],[62.189277,56.755389],[62.190247,56.755407],[62.194837,56.755503],[62.196178,56.75553],[62.196976,56.755547],[62.197519,56.755555],[62.201797,56.755638],[62.202165,56.755645],[62.202592,56.755653],[62.207674,56.755746],[62.214888,56.755916],[62.218794,56.755997],[62.225408,56.756134],[62.229398,56.756231],[62.2312,56.75626],[62.232555,56.756294],[62.232745,56.7563],[62.233499,56.756322],[62.234599,56.756339],[62.235355,56.756348],[62.236486,56.756367],[62.237532,56.756391],[62.248214,56.75661],[62.252408,56.756694],[62.255893,56.756764],[62.267979,56.757006],[62.272899,56.757109],[62.2776,56.757207],[62.281375,56.757279],[62.28191,56.757292],[62.282754,56.757313],[62.28781,56.757439],[62.291291,56.757507],[62.291808,56.757519],[62.306083,56.757798],[62.307985,56.757836],[62.316364,56.758],[62.317979,56.758032],[62.323492,56.758156],[62.324788,56.758185],[62.33139,56.758336],[62.33715,56.758463],[62.339001,56.758504],[62.340836,56.758537],[62.341737,56.758502],[62.344157,56.75855],[62.345121,56.758616],[62.347385,56.758665],[62.356393,56.758863],[62.365172,56.759056],[62.371584,56.759179],[62.375202,56.759248],[62.379161,56.759331],[62.383114,56.759412],[62.387169,56.759501],[62.387902,56.759514],[62.389492,56.759545],[62.391536,56.759616],[62.393258,56.759698],[62.394625,56.759801],[62.39638,56.759992],[62.39859,56.760314],[62.399299,56.76044],[62.400391,56.760634],[62.401904,56.760956],[62.403669,56.761378],[62.403674,56.761379],[62.409768,56.76284],[62.417997,56.764843],[62.421729,56.765751],[62.433978,56.768751],[62.442951,56.770951],[62.44702,56.771942],[62.449642,56.772582],[62.452269,56.773229],[62.457359,56.774469],[62.459561,56.775004],[62.459998,56.775105],[62.461917,56.77557],[62.46364,56.776014],[62.464743,56.776279],[62.464965,56.776333],[62.466411,56.776656],[62.474126,56.77811],[62.479436,56.779102],[62.480537,56.779314],[62.481712,56.779534],[62.483937,56.779993],[62.486185,56.780389],[62.488453,56.780846],[62.489368,56.781029],[62.492228,56.78175],[62.493137,56.78201],[62.494041,56.782272],[62.494912,56.782566],[62.495759,56.782861],[62.49678,56.783255],[62.497808,56.783665],[62.498882,56.78412],[62.499374,56.784328],[62.499977,56.784591],[62.501155,56.785149],[62.502167,56.785676],[62.503562,56.786458],[62.504925,56.787309],[62.505561,56.787718],[62.506449,56.788348],[62.50729,56.78899],[62.508171,56.789732],[62.509023,56.790474],[62.509666,56.791104],[62.510519,56.792027],[62.511735,56.793446],[62.512771,56.794607],[62.515556,56.797608],[62.517043,56.799168],[62.518417,56.800746],[62.519241,56.801644],[62.522437,56.80521],[62.523085,56.805898],[62.523724,56.806494],[62.523788,56.806557],[62.524249,56.806893],[62.525226,56.807688],[62.525936,56.808218],[62.526481,56.808602],[62.526789,56.808799],[62.527598,56.809299],[62.528152,56.809639],[62.528726,56.809985],[62.529646,56.810564],[62.530561,56.811091],[62.53283,56.812382],[62.534861,56.813492],[62.537979,56.815272],[62.539662,56.816224],[62.541293,56.817126],[62.546251,56.819958],[62.553793,56.824193],[62.557522,56.82629],[62.565209,56.830621],[62.568864,56.832695],[62.571881,56.834406],[62.574742,56.836027],[62.575041,56.836197],[62.575959,56.836716],[62.5768,56.837166],[62.577871,56.83772],[62.577895,56.837733],[62.578789,56.838164],[62.580675,56.839037],[62.582672,56.8399],[62.583833,56.840472],[62.584651,56.840849],[62.58559,56.841305],[62.586524,56.8418],[62.587586,56.842361],[62.588635,56.84294],[62.590195,56.843832],[62.591931,56.844814],[62.592592,56.845167],[62.596699,56.847464],[62.600902,56.849851],[62.600909,56.849855],[62.602305,56.850636],[62.603392,56.851248],[62.603986,56.851581],[62.605032,56.852174],[62.605201,56.852269],[62.605786,56.852599],[62.606281,56.852873],[62.606906,56.8532],[62.607706,56.853609],[62.608399,56.853938],[62.60908,56.854262],[62.6108,56.85504],[62.611967,56.855521],[62.613327,56.85608],[62.614799,56.85661],[62.61553,56.856857],[62.616781,56.857284],[62.617272,56.857451],[62.6185,56.857817],[62.619158,56.858034],[62.620499,56.858402],[62.621956,56.858766],[62.624055,56.859283],[62.625744,56.859658],[62.627076,56.859937],[62.629099,56.86036],[62.631882,56.860937],[62.635171,56.861613],[62.638354,56.86228],[62.641348,56.862905],[62.644285,56.863513],[62.646163,56.863893],[62.647259,56.864109],[62.650371,56.864746],[62.653511,56.865401],[62.656486,56.866017],[62.659658,56.866684],[62.66259,56.867283],[62.665531,56.867895],[62.66814,56.868432],[62.671415,56.869112],[62.674406,56.869737],[62.677758,56.870404],[62.680292,56.870948],[62.683003,56.871516],[62.686079,56.872155],[62.689231,56.872809],[62.692388,56.873458],[62.693159,56.873613],[62.695413,56.874083],[62.69839,56.874704],[62.701542,56.875361],[62.703735,56.875774],[62.707579,56.876592],[62.708579,56.876805],[62.70887,56.876861],[62.709966,56.877076],[62.710959,56.877235],[62.711662,56.877317],[62.712209,56.877368],[62.712852,56.877414],[62.713586,56.877446],[62.714493,56.877479],[62.715524,56.877476],[62.716283,56.877451],[62.717004,56.877407],[62.717557,56.877367],[62.717754,56.877344],[62.718059,56.877309],[62.718807,56.877211],[62.719626,56.877084],[62.720554,56.876902],[62.721957,56.876591],[62.723518,56.876148],[62.72459,56.875828],[62.725321,56.875632],[62.72786,56.874883],[62.730299,56.874165],[62.732807,56.873427],[62.735257,56.872667],[62.737335,56.872055],[62.737962,56.871873],[62.739123,56.871522],[62.740325,56.871194],[62.742354,56.870615],[62.744998,56.869838],[62.746627,56.869346],[62.747431,56.869103],[62.748864,56.868715],[62.750149,56.868383],[62.751508,56.868056],[62.753522,56.867624],[62.754929,56.867329],[62.754932,56.867328],[62.756218,56.867078],[62.757748,56.866802],[62.759259,56.866554],[62.762306,56.86608],[62.764094,56.865802],[62.766866,56.865359],[62.769201,56.864983],[62.77285,56.864416],[62.775906,56.863938],[62.779045,56.863449],[62.780625,56.863191],[62.782185,56.862937],[62.784959,56.862512],[62.788082,56.862033],[62.791085,56.861559],[62.793484,56.861174],[62.795232,56.860855],[62.79672,56.860537],[62.798241,56.860144],[62.799483,56.8598],[62.800329,56.859543],[62.801283,56.859229],[62.802748,56.85869],[62.803951,56.858196],[62.804672,56.857876],[62.805409,56.857527],[62.806854,56.856797],[62.807979,56.856217],[62.809099,56.855624],[62.8112,56.854507],[62.812206,56.85398],[62.812654,56.853747],[62.814093,56.853007],[62.815133,56.852497],[62.816188,56.852012],[62.817589,56.85144],[62.818589,56.851061],[62.819525,56.850742],[62.820363,56.850464],[62.821233,56.850198],[62.822279,56.849904],[62.823422,56.849612],[62.824177,56.849428],[62.825015,56.849248],[62.825732,56.849102],[62.825789,56.84909],[62.826542,56.84896],[62.828201,56.848678],[62.829226,56.848537],[62.830617,56.848381],[62.831229,56.848333],[62.832082,56.84823],[62.833623,56.848132],[62.834677,56.848058],[62.836174,56.848015],[62.836422,56.848004],[62.838401,56.848019],[62.840611,56.848121],[62.842083,56.848265],[62.842798,56.848334],[62.844913,56.848605],[62.851067,56.849426],[62.85111,56.849432],[62.854148,56.849858],[62.85534,56.850021],[62.858352,56.850482],[62.861941,56.851067],[62.865884,56.851647],[62.866856,56.851806],[62.867712,56.851934],[62.869523,56.85224],[62.870007,56.852306],[62.870982,56.852503],[62.871839,56.852695],[62.873374,56.853087],[62.875012,56.853543],[62.880146,56.855199],[62.88263,56.855997],[62.883822,56.856384],[62.888467,56.857853],[62.893063,56.859336],[62.896528,56.860438],[62.898,56.860866],[62.902178,56.862258],[62.904129,56.862889],[62.905844,56.863401],[62.906749,56.863671],[62.907766,56.863938],[62.910819,56.864556],[62.912882,56.865003],[62.915761,56.86561],[62.917817,56.865983],[62.920192,56.866279],[62.921866,56.866598],[62.924613,56.867273],[62.925986,56.867758],[62.9312,56.868907],[62.933708,56.869418],[62.941906,56.871155],[62.95104,56.873161],[62.957713,56.874503],[62.960404,56.875074],[62.963422,56.875714],[62.968587,56.876805],[62.973664,56.87793],[62.98058,56.879407],[62.983299,56.879966],[63.001949,56.883964],[63.002243,56.884029],[63.003863,56.884389],[63.005378,56.884708],[63.007145,56.885069],[63.009799,56.885633],[63.011407,56.886011],[63.012547,56.886253],[63.015407,56.886856],[63.016919,56.887179],[63.018226,56.887435],[63.020028,56.887814],[63.020682,56.887952],[63.022401,56.888345],[63.026739,56.889299],[63.032059,56.890444],[63.035084,56.890895],[63.037756,56.891331],[63.038551,56.891514],[63.043233,56.892844],[63.050412,56.894342],[63.054091,56.895159],[63.056758,56.895728],[63.059415,56.896298],[63.065693,56.897643],[63.068043,56.898144],[63.069688,56.898501],[63.070308,56.898642],[63.070936,56.89878],[63.076788,56.900052],[63.07974,56.900674],[63.080972,56.900927],[63.082771,56.901302],[63.088385,56.902448],[63.091372,56.903054],[63.094415,56.903695],[63.096508,56.904133],[63.098937,56.904653],[63.100084,56.9049],[63.101274,56.905168],[63.102238,56.905386],[63.103159,56.905626],[63.104267,56.905945],[63.104818,56.906114],[63.105358,56.906292],[63.106401,56.906651],[63.106401,56.906651],[63.107456,56.907053],[63.108879,56.907651],[63.110351,56.908296],[63.110895,56.908532],[63.113337,56.909603],[63.115079,56.910363],[63.117172,56.911281],[63.11891,56.912053],[63.11979,56.912444],[63.120648,56.912834],[63.123247,56.913981],[63.123856,56.91426],[63.124148,56.914532],[63.127375,56.91595],[63.133334,56.918579],[63.135832,56.919673],[63.136856,56.920129],[63.143645,56.923105],[63.14508,56.923729],[63.146534,56.924364],[63.147826,56.924917],[63.149153,56.925498],[63.151428,56.92649],[63.153852,56.927551],[63.155389,56.928177],[63.156138,56.928453],[63.156909,56.928721],[63.1586,56.929271],[63.160632,56.929828],[63.161448,56.930039],[63.162229,56.930219],[63.163185,56.930403],[63.164102,56.930562],[63.165071,56.930724],[63.167466,56.93108],[63.173341,56.931923],[63.176072,56.932333],[63.177777,56.932567],[63.179402,56.932792],[63.182174,56.933182],[63.185026,56.933602],[63.187814,56.933996],[63.190588,56.934404],[63.193613,56.934842],[63.196699,56.935286],[63.199412,56.935676],[63.200771,56.935872],[63.202144,56.936083],[63.20302,56.936222],[63.203881,56.936372],[63.2048,56.936547],[63.205689,56.936729],[63.206563,56.936941],[63.207008,56.93706],[63.207429,56.937184],[63.208319,56.937463],[63.209698,56.937931],[63.210565,56.938238],[63.21181,56.938716],[63.213643,56.939482],[63.214578,56.939901],[63.215358,56.940292],[63.216121,56.940733],[63.216325,56.94087],[63.216977,56.941309],[63.217604,56.941756],[63.218557,56.942475],[63.219153,56.942983],[63.219797,56.943596],[63.220148,56.943953],[63.220431,56.944247],[63.22044,56.944257],[63.221768,56.945738],[63.222252,56.94629],[63.223141,56.947293],[63.223865,56.948108],[63.223936,56.94819],[63.224581,56.948921],[63.224698,56.94906],[63.2248,56.949179],[63.225329,56.949774],[63.225508,56.949983],[63.225546,56.950028],[63.225983,56.950497],[63.226045,56.950561],[63.226435,56.950977],[63.226682,56.951206],[63.22696,56.951418],[63.227231,56.951575],[63.227496,56.951727],[63.227814,56.951882],[63.228129,56.95201],[63.22849,56.952141],[63.228752,56.952226],[63.229322,56.952391],[63.23,56.952572],[63.231456,56.952962],[63.232575,56.95326],[63.232923,56.953351],[63.233427,56.953487],[63.233952,56.953647],[63.234338,56.953773],[63.234611,56.953869],[63.234857,56.953969],[63.235093,56.954082],[63.235219,56.954151],[63.235361,56.954255],[63.235478,56.954363],[63.235556,56.954484],[63.235605,56.954612],[63.235628,56.954768],[63.235616,56.95494],[63.235586,56.955105],[63.235525,56.95533],[63.235445,56.955559],[63.235341,56.955759],[63.235209,56.955964],[63.235014,56.956172],[63.234802,56.956344],[63.234552,56.956498],[63.234264,56.956658],[63.233712,56.956908],[63.233314,56.957094],[63.23173,56.957851],[63.231357,56.958042],[63.231058,56.958221],[63.230671,56.958491],[63.230168,56.958958],[63.229727,56.959377],[63.229088,56.9601],[63.22852,56.960936],[63.228117,56.961773],[63.227881,56.962507],[63.22778,56.963151],[63.227767,56.963539],[63.227771,56.963937],[63.228007,56.965588],[63.228172,56.966519],[63.228316,56.967239],[63.228576,56.968164],[63.228884,56.969034],[63.229117,56.969476],[63.22963,56.970432],[63.229994,56.971052],[63.230328,56.971543],[63.230859,56.972266],[63.231438,56.972923],[63.231955,56.973485],[63.232459,56.974005],[63.233151,56.974666],[63.233576,56.975034],[63.234187,56.975552],[63.234801,56.976017],[63.235928,56.976783],[63.23722,56.977538],[63.238511,56.978233],[63.239549,56.978729],[63.241518,56.979586],[63.244846,56.980798],[63.248699,56.982097],[63.252526,56.983395],[63.256527,56.984771],[63.258769,56.985567],[63.260883,56.986268],[63.265094,56.987723],[63.269407,56.989213],[63.272623,56.990331],[63.273662,56.990683],[63.277207,56.991914],[63.277374,56.991972],[63.281453,56.993407],[63.285835,56.994908],[63.286525,56.995137],[63.2874,56.995426],[63.2888,56.995885],[63.290595,56.996412],[63.292045,56.99682],[63.293504,56.997168],[63.298858,56.998401],[63.302966,56.999362],[63.304485,56.999713],[63.306849,57.000262],[63.309669,57.000897],[63.315769,57.002314],[63.318278,57.002886],[63.321961,57.003726],[63.328266,57.005148],[63.333889,57.006449],[63.341364,57.00816],[63.346795,57.009415],[63.348687,57.009841],[63.352255,57.010647],[63.357652,57.011883],[63.363889,57.013329],[63.367378,57.014136],[63.369932,57.014695],[63.372458,57.015276],[63.373713,57.01556],[63.377897,57.016534],[63.379061,57.016813],[63.381132,57.017315],[63.383455,57.017925],[63.385574,57.018512],[63.387355,57.019064],[63.391437,57.020472],[63.392666,57.020893],[63.393422,57.021153],[63.394491,57.021529],[63.39535,57.021881],[63.396732,57.022475],[63.399081,57.023514],[63.401771,57.024787],[63.404483,57.026256],[63.405837,57.027007],[63.407206,57.027745],[63.408408,57.02841],[63.408931,57.028697],[63.412128,57.030447],[63.416863,57.033039],[63.422814,57.036257],[63.425689,57.037845],[63.428705,57.039514],[63.428756,57.039542],[63.43117,57.04087],[63.433762,57.042155],[63.434044,57.042273],[63.434292,57.042377],[63.435635,57.042938],[63.437239,57.043556],[63.438586,57.044013],[63.439692,57.044327],[63.440802,57.04462],[63.441359,57.044754],[63.442803,57.045092],[63.444539,57.04543],[63.446472,57.045741],[63.447785,57.045925],[63.449324,57.046095],[63.450756,57.046198],[63.452184,57.046288],[63.454341,57.046351],[63.454453,57.046354],[63.457506,57.046316],[63.461947,57.046215],[63.465988,57.046141],[63.466448,57.046139],[63.470112,57.046058],[63.471474,57.046046],[63.472586,57.046075],[63.473768,57.046107],[63.47509,57.046185],[63.476287,57.046272],[63.477547,57.04638],[63.479077,57.046557],[63.481056,57.046864],[63.483359,57.04735],[63.486115,57.047957],[63.488375,57.048454],[63.488556,57.048495],[63.490264,57.048887],[63.493524,57.049615],[63.500278,57.051131],[63.504051,57.05196],[63.504277,57.052006],[63.505396,57.052234],[63.510847,57.05346],[63.512683,57.053867],[63.516395,57.054692],[63.519344,57.055366],[63.52197,57.055932],[63.527388,57.057145],[63.532359,57.05828],[63.534391,57.058745],[63.537931,57.059506],[63.543155,57.060678],[63.547436,57.061635],[63.549691,57.062145],[63.552559,57.062809],[63.553434,57.063011],[63.558608,57.064131],[63.56488,57.065556],[63.569492,57.06658],[63.575064,57.067837],[63.578872,57.06874],[63.580367,57.069062],[63.582547,57.069531],[63.586265,57.070383],[63.591475,57.07152],[63.595939,57.072541],[63.597429,57.072844],[63.598643,57.073073],[63.600189,57.073338],[63.602056,57.073642],[63.60538,57.074155],[63.607466,57.074503],[63.610234,57.07498],[63.611293,57.075157],[63.612164,57.075301],[63.612583,57.075367],[63.617802,57.076187],[63.622797,57.07705],[63.625746,57.077504],[63.630524,57.078296],[63.635355,57.079078],[63.637175,57.079388],[63.641833,57.080137],[63.64922,57.081332],[63.650316,57.081502],[63.653923,57.082075],[63.657406,57.082663],[63.659154,57.08294],[63.664743,57.083847],[63.669341,57.084593],[63.671546,57.084899],[63.672691,57.08502],[63.673403,57.085082],[63.673882,57.085126],[63.674908,57.085205],[63.676658,57.085296],[63.682903,57.085454],[63.69069,57.085647],[63.695208,57.085756],[63.701554,57.085919],[63.707561,57.086073],[63.711537,57.086165],[63.714107,57.08624],[63.720592,57.086389],[63.722779,57.086444],[63.727049,57.086552],[63.729913,57.086612],[63.732564,57.086668],[63.733437,57.086685],[63.735226,57.086744],[63.736536,57.086788],[63.737219,57.086825],[63.740154,57.087048],[63.740357,57.087063],[63.741827,57.087187],[63.742008,57.087203],[63.74246,57.087241],[63.743408,57.087322],[63.74451,57.087403],[63.745067,57.087443],[63.745629,57.087483],[63.745742,57.087492],[63.747314,57.087615],[63.748901,57.087762],[63.752269,57.088002],[63.752753,57.088039],[63.756357,57.088324],[63.76297,57.088842],[63.767118,57.089173],[63.772277,57.089571],[63.773432,57.089661],[63.779627,57.090138],[63.780802,57.090225],[63.784917,57.090545],[63.787952,57.090792],[63.791337,57.09106],[63.793447,57.091224],[63.795523,57.091338],[63.797797,57.09142],[63.799857,57.091455],[63.801753,57.091445],[63.803745,57.091383],[63.808547,57.091208],[63.814622,57.090984],[63.814779,57.090978],[63.821088,57.090746],[63.822023,57.090715],[63.827445,57.090511],[63.833816,57.090271],[63.83846,57.09009],[63.838749,57.090079],[63.840057,57.090028],[63.841248,57.089987],[63.841659,57.089973],[63.84682,57.089783],[63.852973,57.08956],[63.854823,57.089487],[63.859292,57.089319],[63.863272,57.089175],[63.865936,57.089079],[63.871917,57.088869],[63.87909,57.088609],[63.884815,57.08838],[63.887817,57.088273],[63.888375,57.088253],[63.891162,57.088146],[63.893315,57.088045],[63.894747,57.088019],[63.895762,57.088012],[63.896887,57.088026],[63.898243,57.088063],[63.900234,57.088186],[63.90174,57.088328],[63.904225,57.088636],[63.907914,57.089093],[63.91418,57.089833],[63.920315,57.090519],[63.926162,57.091195],[63.931232,57.091769],[63.93654,57.092448],[63.937572,57.09258],[63.941543,57.092984],[63.942942,57.093132],[63.945486,57.093334],[63.947711,57.093419],[63.952697,57.093518],[63.954238,57.093547],[63.959636,57.093635],[63.966134,57.093759],[63.96909,57.093805],[63.972291,57.093866],[63.978583,57.093967],[63.985338,57.09409],[63.985587,57.094095],[63.991282,57.094185],[63.997605,57.094294],[64.002101,57.094369],[64.018502,57.094643],[64.029089,57.094821],[64.03501,57.094934],[64.04198,57.095028],[64.048417,57.095138],[64.05149,57.095213],[64.054601,57.095268],[64.056075,57.095296],[64.060302,57.095362],[64.064595,57.095413],[64.066619,57.095444],[64.067984,57.095467],[64.072724,57.095546],[64.082284,57.095696],[64.0832,57.095711],[64.084602,57.095736],[64.090898,57.095849],[64.095007,57.095922],[64.101007,57.095982],[64.107866,57.096134],[64.114186,57.096246],[64.1175,57.096276],[64.120349,57.096324],[64.126625,57.096424],[64.13272,57.096519],[64.133992,57.096539],[64.139312,57.096625],[64.14569,57.096727],[64.150487,57.096803],[64.151892,57.096834],[64.155833,57.096879],[64.157642,57.096939],[64.159563,57.097011],[64.159584,57.097012],[64.161183,57.097135],[64.162776,57.097309],[64.164684,57.09758],[64.166086,57.097822],[64.166696,57.097944],[64.169349,57.098515],[64.17492,57.099739],[64.178451,57.100525],[64.179174,57.100681],[64.180529,57.100988],[64.182132,57.101311],[64.183352,57.101577],[64.186165,57.10221],[64.191701,57.103408],[64.197182,57.104614],[64.20272,57.105812],[64.20832,57.107038],[64.212241,57.107908],[64.217547,57.109042],[64.223088,57.110248],[64.228979,57.111544],[64.232251,57.112261],[64.234257,57.112681],[64.235952,57.113021],[64.237631,57.113281],[64.239208,57.113482],[64.241488,57.113712],[64.243409,57.113852],[64.244836,57.113919],[64.245785,57.113915],[64.246622,57.113913],[64.248317,57.11384],[64.249969,57.113747],[64.252319,57.113519],[64.254433,57.113263],[64.260783,57.112353],[64.266664,57.111556],[64.272757,57.110735],[64.276194,57.110246],[64.277553,57.110053],[64.283599,57.109211],[64.289904,57.108355],[64.293064,57.107916],[64.296125,57.10749],[64.302085,57.106648],[64.308232,57.10582],[64.309384,57.105658],[64.313747,57.105045],[64.319866,57.104215],[64.32449,57.103571],[64.326037,57.103355],[64.331439,57.10261],[64.337448,57.101765],[64.337576,57.101747],[64.340645,57.101325],[64.343619,57.100922],[64.349774,57.100066],[64.355868,57.099203],[64.357597,57.098965],[64.362048,57.09835],[64.367938,57.097531],[64.373667,57.096718],[64.375769,57.096425],[64.37974,57.095873],[64.385857,57.095019],[64.392361,57.09412],[64.398161,57.093329],[64.404471,57.092447],[64.407811,57.091976],[64.410622,57.091588],[64.413686,57.091146],[64.416784,57.090727],[64.423251,57.089823],[64.425656,57.089498],[64.429549,57.088963],[64.435878,57.088077],[64.441976,57.087213],[64.448342,57.086326],[64.454,57.085517],[64.458263,57.084922],[64.460356,57.08463],[64.466648,57.083751],[64.47267,57.082905],[64.479379,57.081974],[64.485616,57.081103],[64.48898,57.080627],[64.491872,57.080218],[64.498258,57.079328],[64.504591,57.078457],[64.507987,57.077982],[64.510547,57.077624],[64.510901,57.077575],[64.517214,57.076684],[64.523437,57.075803],[64.525065,57.075566],[64.525934,57.075449],[64.529695,57.074915],[64.533681,57.074348],[64.53607,57.074005],[64.537675,57.07378],[64.53882,57.073637],[64.53943,57.07356],[64.539975,57.073502],[64.540616,57.073442],[64.541146,57.073408],[64.541956,57.073364],[64.543002,57.073333],[64.544239,57.073325],[64.5456,57.073338],[64.546757,57.073379],[64.549313,57.073518],[64.551863,57.073681],[64.555964,57.07393],[64.556718,57.073967],[64.55764,57.07399],[64.55899,57.074003],[64.560338,57.073975],[64.562581,57.073879],[64.564321,57.07382],[64.567741,57.073681],[64.571592,57.073519],[64.573337,57.073446],[64.574533,57.073402],[64.574756,57.073393],[64.578315,57.073258],[64.581755,57.073114],[64.582094,57.0731],[64.583529,57.073042],[64.589805,57.072777],[64.592075,57.072693],[64.595925,57.072551],[64.598513,57.072454],[64.599802,57.072405],[64.600223,57.072389],[64.600789,57.072364],[64.602272,57.072287],[64.606855,57.072097],[64.607824,57.072057],[64.614058,57.071809],[64.619916,57.071584],[64.62295,57.071461],[64.625296,57.071365],[64.630607,57.071147],[64.633623,57.071043],[64.635167,57.070969],[64.636225,57.070875],[64.639108,57.07056],[64.639532,57.0705],[64.640241,57.070386],[64.641577,57.070114],[64.643154,57.069616],[64.645198,57.068758],[64.647097,57.067764],[64.647759,57.067386],[64.648281,57.067091],[64.648948,57.066794],[64.649763,57.066514],[64.650281,57.066381],[64.65089,57.066278],[64.651512,57.066206],[64.652145,57.066158],[64.652767,57.066144],[64.653394,57.066171],[64.653985,57.066229],[64.655114,57.066398],[64.655552,57.066498],[64.655999,57.066599],[64.656627,57.066771],[64.657662,57.067056],[64.658227,57.067218],[64.659025,57.067421],[64.660272,57.067678],[64.661914,57.067955],[64.665027,57.068354],[64.668459,57.068765],[64.674749,57.069544],[64.67796,57.069937],[64.681247,57.07034],[64.687482,57.071113],[64.687485,57.071113],[64.694056,57.071918],[64.702926,57.073025],[64.710129,57.073925],[64.712432,57.074203],[64.718845,57.074978],[64.723917,57.075604],[64.724693,57.0757],[64.72613,57.075882],[64.727269,57.076026],[64.730642,57.076431],[64.731711,57.076544],[64.733136,57.076663],[64.734224,57.076727],[64.735605,57.076784],[64.736977,57.076809],[64.738379,57.076797],[64.741373,57.076728],[64.742024,57.076715],[64.742519,57.076701],[64.744469,57.07665],[64.74947,57.076512],[64.75512,57.076354],[64.758993,57.076268],[64.767705,57.076036],[64.774034,57.075867],[64.775531,57.075827],[64.779346,57.075724],[64.783941,57.075601],[64.791924,57.075384],[64.806731,57.074981],[64.808409,57.074936],[64.824818,57.074492],[64.828681,57.074401],[64.837367,57.074143],[64.837572,57.074137],[64.840012,57.074064],[64.84132,57.07403],[64.841862,57.074015],[64.845897,57.073904],[64.846084,57.073899],[64.856953,57.073601],[64.857712,57.07358],[64.858354,57.073562],[64.871077,57.073211],[64.871087,57.073211],[64.874179,57.073124],[64.879156,57.072983],[64.880335,57.072949],[64.8906,57.072681],[64.893026,57.072617],[64.899351,57.072432],[64.905665,57.072266],[64.907122,57.072227],[64.914768,57.072019],[64.923502,57.071791],[64.935952,57.071444],[64.940009,57.071332],[64.94356,57.071237],[64.943881,57.071229],[64.944462,57.071214],[64.945544,57.071187],[64.948181,57.071121],[64.951099,57.071034],[64.95192,57.071011],[64.954068,57.070942],[64.955582,57.070909],[64.956501,57.070908],[64.956753,57.070907],[64.957906,57.070905],[64.960428,57.070951],[64.962642,57.071053],[64.964879,57.071219],[64.966985,57.07143],[64.9688,57.07166],[64.970946,57.071974],[64.972693,57.072259],[64.972879,57.072289],[64.97452,57.072588],[64.976481,57.073013],[64.977831,57.073342],[64.980127,57.073945],[64.982162,57.074494],[64.982989,57.074717],[64.985613,57.075462],[64.987115,57.075888],[64.991589,57.077157],[64.99512,57.078157],[64.998669,57.079134],[64.999544,57.079372],[65.000847,57.079727],[65.00458,57.08074],[65.008667,57.08186],[65.012391,57.082878],[65.012798,57.082989],[65.01438,57.083422],[65.016988,57.084136],[65.02019,57.085005],[65.021209,57.085286],[65.024524,57.086195],[65.027763,57.087083],[65.029588,57.087584],[65.03158,57.088142],[65.033379,57.08861],[65.03478,57.088931],[65.03568,57.089123],[65.036732,57.089316],[65.037248,57.089409],[65.038501,57.089613],[65.039266,57.089714],[65.039779,57.08978],[65.040967,57.089916],[65.042018,57.09003],[65.04234,57.090064],[65.043325,57.090151],[65.044159,57.090202],[65.047006,57.090296],[65.050876,57.090436],[65.054738,57.090555],[65.056709,57.090618],[65.057741,57.090651],[65.059467,57.090706],[65.061786,57.09078],[65.065298,57.090889],[65.070055,57.091057],[65.070228,57.091063],[65.071639,57.091058],[65.074872,57.091121],[65.079457,57.091259],[65.083978,57.091373],[65.08566,57.091415],[65.087335,57.091495],[65.090697,57.091622],[65.092014,57.091667],[65.096563,57.091821],[65.098826,57.091892],[65.104136,57.09206],[65.10789,57.092178],[65.108812,57.092212],[65.115304,57.09245],[65.120752,57.092649],[65.125885,57.092809],[65.133488,57.093051],[65.135368,57.093111],[65.136511,57.09316],[65.142659,57.093364],[65.143399,57.093389],[65.145889,57.093481],[65.15321,57.093709],[65.154876,57.093761],[65.160387,57.093933],[65.164001,57.094063],[65.174197,57.094394],[65.177057,57.094487],[65.178243,57.094526],[65.18267,57.094722],[65.18434,57.094771],[65.190122,57.094942],[65.191339,57.094986],[65.194761,57.095103],[65.195458,57.095128],[65.2015,57.095321],[65.20325,57.095377],[65.207902,57.095565],[65.20894,57.095601],[65.210795,57.095664],[65.216597,57.095857],[65.22047,57.095994],[65.222406,57.096051],[65.227462,57.096202],[65.232994,57.096406],[65.234932,57.096441],[65.243628,57.096777],[65.245026,57.096819],[65.245783,57.096842],[65.257443,57.097209],[65.258319,57.097237],[65.260127,57.097298],[65.267382,57.097543],[65.271064,57.097676],[65.276758,57.097876],[65.278073,57.097922],[65.283801,57.098123],[65.287487,57.09823],[65.290057,57.098354],[65.290722,57.098413],[65.2923,57.098552],[65.293093,57.098655],[65.29497,57.098899],[65.304527,57.100114],[65.307718,57.100501],[65.309166,57.100687],[65.316936,57.101684],[65.318256,57.101849],[65.325013,57.10271],[65.326407,57.102887],[65.329526,57.103283],[65.333879,57.103833],[65.340459,57.104661],[65.341314,57.104769],[65.341986,57.104854],[65.34717,57.105506],[65.354742,57.106457],[65.357545,57.106809],[65.360893,57.107229],[65.361366,57.10729],[65.362084,57.107383],[65.370555,57.108456],[65.373607,57.108843],[65.377357,57.109328],[65.380323,57.109701],[65.385255,57.110311],[65.38974,57.110854],[65.399679,57.11211],[65.401729,57.112359],[65.405668,57.112856],[65.408636,57.11323],[65.409585,57.113351],[65.410535,57.113472],[65.412372,57.113784],[65.414771,57.114219],[65.417485,57.114743],[65.420975,57.115405],[65.4214,57.115484],[65.421767,57.115558],[65.424467,57.116052],[65.430504,57.117201],[65.432645,57.117607],[65.433826,57.117832],[65.437354,57.118485],[65.440869,57.119153],[65.443113,57.119579],[65.444622,57.119892],[65.446389,57.12031],[65.452465,57.121901],[65.456412,57.122943],[65.461878,57.124235],[65.465992,57.125193],[65.468541,57.125785],[65.469776,57.126063],[65.470852,57.126304],[65.471769,57.126512],[65.472481,57.126689],[65.473299,57.126927],[65.474057,57.127162],[65.474916,57.127434],[65.476072,57.127828],[65.477626,57.128302],[65.477917,57.128401],[65.478062,57.128446],[65.478241,57.128489],[65.478435,57.128532],[65.478689,57.128578],[65.478809,57.128597],[65.478974,57.128621],[65.479176,57.12864],[65.479361,57.128654],[65.479755,57.128676],[65.48035,57.128692],[65.483227,57.128756],[65.483742,57.128767],[65.484141,57.128772],[65.484373,57.128768],[65.484571,57.128758],[65.484816,57.12874],[65.485028,57.128717],[65.485245,57.128688],[65.485446,57.128654],[65.485701,57.128604],[65.487058,57.128344],[65.488845,57.127891],[65.48995,57.127622],[65.493146,57.126829],[65.494713,57.126436],[65.497503,57.125744],[65.504751,57.123948],[65.508344,57.123057],[65.510921,57.122396],[65.511134,57.122341],[65.511967,57.122097],[65.513703,57.121548],[65.514051,57.121445],[65.514963,57.121163],[65.516025,57.12085],[65.516803,57.120628],[65.517122,57.120542],[65.517622,57.120411],[65.518105,57.120284],[65.518888,57.120076],[65.519275,57.119976],[65.520659,57.119644],[65.521463,57.119449],[65.521903,57.119333],[65.52231,57.119214],[65.5226,57.119126],[65.522985,57.119],[65.523849,57.118719],[65.524627,57.118436],[65.525382,57.118152],[65.52543,57.118133],[65.526617,57.117672],[65.527212,57.117452],[65.527481,57.117357],[65.529192,57.116729],[65.529554,57.116594],[65.530789,57.116165],[65.533597,57.115082],[65.53496,57.114563],[65.535859,57.114229],[65.536134,57.114131],[65.536507,57.114004],[65.539488,57.113063],[65.53997,57.112899],[65.541161,57.112483],[65.542326,57.11206],[65.544671,57.111209],[65.546194,57.110652],[65.54793,57.109975],[65.55044,57.10905],[65.551256,57.10875],[65.553036,57.108098],[65.554874,57.107454],[65.558,57.1063],[65.565781,57.103467],[65.567094,57.102986],[65.56712,57.102976],[65.56985,57.101972],[65.571523,57.101334],[65.57476,57.100131],[65.575912,57.099702],[65.577764,57.099035],[65.580428,57.09805],[65.585815,57.096062],[65.588464,57.095079],[65.591549,57.093954],[65.593847,57.093114],[65.596633,57.09209],[65.599523,57.091028],[65.605123,57.088941],[65.605581,57.088761],[65.607866,57.087863],[65.608344,57.087686],[65.610297,57.086973],[65.610364,57.086949],[65.612292,57.086241],[65.614787,57.085324],[65.61586,57.08493],[65.617003,57.084511],[65.617538,57.084315],[65.621856,57.08272],[65.625489,57.081388],[65.636838,57.07722],[65.640086,57.076024],[65.64161,57.075467],[65.643028,57.074911],[65.643952,57.074512],[65.644606,57.074204],[65.645193,57.073918],[65.645955,57.073521],[65.646953,57.072956],[65.647805,57.07242],[65.648404,57.071999],[65.649219,57.071425],[65.649573,57.071145],[65.649948,57.070841],[65.650296,57.070548],[65.650743,57.070134],[65.651209,57.069676],[65.651763,57.069079],[65.652162,57.068618],[65.652745,57.067855],[65.653253,57.067142],[65.654018,57.066039],[65.655531,57.063874],[65.657691,57.060786],[65.6606,57.056627],[65.661026,57.056023],[65.661346,57.055547],[65.663818,57.051845],[65.666912,57.04708],[65.668464,57.044699],[65.669298,57.043423],[65.669483,57.043175],[65.669749,57.042827],[65.67191,57.039454],[65.671912,57.039451],[65.672145,57.039105],[65.672586,57.038433],[65.674378,57.03568],[65.675154,57.034558],[65.675623,57.033898],[65.676009,57.033391],[65.676417,57.032912],[65.67668,57.032626],[65.676909,57.032404],[65.677222,57.032113],[65.677546,57.031842],[65.678036,57.031488],[65.678587,57.031112],[65.679054,57.030819],[65.679652,57.030459],[65.680186,57.030182],[65.680734,57.029917],[65.681417,57.029629],[65.681937,57.029429],[65.682519,57.029223],[65.683247,57.028991],[65.684029,57.028774],[65.684855,57.028574],[65.685816,57.028377],[65.686634,57.028234],[65.687287,57.028137],[65.688004,57.028059],[65.688728,57.027994],[65.689499,57.027943],[65.69058,57.027903],[65.691716,57.027879],[65.692762,57.027857],[65.693307,57.027857],[65.69376,57.02787],[65.694203,57.027891],[65.694597,57.027927],[65.69501,57.027977],[65.695478,57.028043],[65.695957,57.028118],[65.696442,57.028202],[65.696855,57.028285],[65.697354,57.028391],[65.697664,57.02846],[65.698281,57.02861],[65.700042,57.029043],[65.70082,57.029225],[65.701415,57.029347],[65.701993,57.029451],[65.70281,57.029582],[65.703502,57.02968],[65.70404,57.02974],[65.704655,57.029793],[65.705241,57.029816],[65.705691,57.029826],[65.70631,57.029834],[65.706892,57.02982],[65.707621,57.0298],[65.708097,57.029782],[65.708514,57.029753],[65.708823,57.029724],[65.70922,57.029687],[65.709942,57.029604],[65.710486,57.029531],[65.711103,57.029427],[65.711728,57.029312],[65.712289,57.029188],[65.7128,57.029056],[65.71355,57.028834],[65.714225,57.028605],[65.714813,57.028399],[65.715736,57.028037],[65.716025,57.027915],[65.716749,57.02756],[65.717446,57.027209],[65.723641,57.024057],[65.725112,57.023315],[65.72571,57.023001],[65.725913,57.022901],[65.726625,57.022547],[65.72743,57.022082],[65.72824,57.021588],[65.729217,57.020946],[65.729943,57.020439],[65.730247,57.020211],[65.730893,57.019708],[65.731517,57.019188],[65.731987,57.018749],[65.732253,57.018484],[65.73246,57.018262],[65.733124,57.017524],[65.733486,57.017097],[65.734188,57.016134],[65.734591,57.015528],[65.735332,57.01433],[65.736107,57.013115],[65.736566,57.012347],[65.737067,57.011433],[65.737306,57.010974],[65.737585,57.010375],[65.737812,57.009877],[65.738006,57.009425],[65.738145,57.009029],[65.738301,57.008506],[65.738478,57.007881],[65.738636,57.007183],[65.738789,57.006416],[65.738891,57.005803],[65.738937,57.005426],[65.739001,57.00478],[65.739022,57.004197],[65.739013,57.003212],[65.738998,57.002325],[65.738715,57.000671],[65.738461,56.999674],[65.737957,56.998189],[65.737677,56.997553],[65.737496,56.997141],[65.736494,56.994986],[65.736441,56.994861],[65.735822,56.99342],[65.735123,56.991868],[65.733056,56.987277],[65.732861,56.986845],[65.731665,56.984134],[65.730455,56.98139],[65.729557,56.979353],[65.726664,56.972692],[65.726381,56.971897],[65.726269,56.97068],[65.726224,56.969617],[65.726299,56.968951],[65.726408,56.968631],[65.726557,56.967872],[65.726809,56.967104],[65.727009,56.966547],[65.727145,56.966266],[65.727339,56.965897],[65.727469,56.965718],[65.727586,56.965558],[65.72785,56.965221],[65.728126,56.964882],[65.728631,56.964287],[65.729161,56.963695],[65.729661,56.963181],[65.730189,56.962678],[65.732848,56.960239],[65.734234,56.959021],[65.735289,56.958056],[65.735891,56.957509],[65.736413,56.957067],[65.736988,56.956613],[65.737573,56.956181],[65.738173,56.955756],[65.739572,56.954836],[65.741075,56.953905],[65.743799,56.952451],[65.744319,56.952173],[65.745434,56.951624],[65.745584,56.95155],[65.746137,56.951299],[65.7463,56.951229],[65.747349,56.950783],[65.748902,56.950164],[65.750027,56.949715],[65.751483,56.949177],[65.754316,56.948133],[65.756766,56.947225],[65.757304,56.947034],[65.759112,56.946385],[65.76079,56.945761],[65.762472,56.945142],[65.764334,56.944453],[65.76524,56.944117],[65.769743,56.94238],[65.773296,56.940998],[65.776489,56.939617],[65.778111,56.938857],[65.779707,56.938152],[65.780852,56.937705],[65.782102,56.937281],[65.782834,56.937037],[65.785267,56.936297],[65.786385,56.935998],[65.787457,56.93572],[65.789012,56.935349],[65.790539,56.935011],[65.792102,56.934701],[65.793976,56.934375],[65.795935,56.934047],[65.80077,56.933243],[65.802694,56.932843],[65.804506,56.932411],[65.805746,56.932123],[65.805834,56.932099],[65.806979,56.931789],[65.809175,56.931103],[65.809809,56.93089],[65.810444,56.930674],[65.810989,56.930488],[65.811606,56.930257],[65.812869,56.929767],[65.813481,56.929522],[65.814076,56.929274],[65.81552,56.92864],[65.816216,56.92833],[65.817016,56.928015],[65.81767,56.927771],[65.819095,56.92728],[65.820314,56.926859],[65.82098,56.9266],[65.821591,56.92635],[65.822681,56.925865],[65.823383,56.925543],[65.824039,56.925221],[65.824639,56.924914],[65.826012,56.924192],[65.826256,56.924061],[65.828272,56.922957],[65.828991,56.92255],[65.829359,56.922329],[65.829858,56.922011],[65.830507,56.921559],[65.831089,56.921113],[65.831719,56.920638],[65.831803,56.92056],[65.832127,56.920247],[65.832403,56.919957],[65.832806,56.919513],[65.833168,56.919091],[65.833442,56.918771],[65.833704,56.918433],[65.833903,56.918153],[65.834122,56.917833],[65.8343,56.917527],[65.834526,56.917167],[65.83479,56.916826],[65.835104,56.916488],[65.835724,56.915861],[65.836394,56.915238],[65.836784,56.914914],[65.837301,56.914497],[65.837749,56.91416],[65.838184,56.913861],[65.838758,56.91349],[65.839289,56.913167],[65.839787,56.912884],[65.84026,56.912613],[65.841185,56.912133],[65.84259,56.911414],[65.849604,56.907864],[65.851078,56.907121],[65.852216,56.906546],[65.863034,56.901063],[65.863445,56.900851],[65.867431,56.8988],[65.868294,56.898299],[65.86901,56.897824],[65.869619,56.897396],[65.870365,56.896764],[65.871309,56.895949],[65.872093,56.895174],[65.872457,56.894755],[65.872703,56.894456],[65.873011,56.894024],[65.873244,56.89367],[65.873415,56.893406],[65.87368,56.892974],[65.873886,56.892592],[65.873994,56.892367],[65.874095,56.892124],[65.874321,56.89149],[65.874438,56.891126],[65.874589,56.890574],[65.874944,56.889273],[65.875039,56.888924],[65.875285,56.88813],[65.87545,56.887448],[65.875948,56.885505],[65.876251,56.884328],[65.876502,56.883346],[65.876537,56.88321],[65.876716,56.882513],[65.876819,56.882171],[65.877047,56.881423],[65.877464,56.880056],[65.878197,56.878216],[65.880135,56.875563],[65.881726,56.874003],[65.881938,56.873791],[65.883929,56.871922],[65.886848,56.869182],[65.886936,56.8691],[65.888011,56.868072],[65.888819,56.867298],[65.891838,56.864502],[65.894017,56.862482],[65.906863,56.850434],[65.913487,56.844219],[65.927025,56.831514],[65.942987,56.816498],[65.943618,56.815904],[65.952014,56.808018],[65.955902,56.804399],[65.960526,56.800471],[65.96871,56.793605],[65.970896,56.791789],[65.971153,56.791576],[65.97284,56.790175],[65.973801,56.78937],[65.973983,56.789224],[65.983515,56.781196],[65.995435,56.771185],[65.996041,56.770676],[65.999994,56.767321],[66.004063,56.763914],[66.012272,56.757018],[66.020198,56.750347],[66.020262,56.750293],[66.028698,56.743219],[66.031894,56.740549],[66.032704,56.739872],[66.032831,56.739784],[66.033926,56.738958],[66.036139,56.737487],[66.037798,56.736383],[66.038517,56.735907],[66.046752,56.730439],[66.051278,56.72744],[66.055505,56.724643],[66.064187,56.718914],[66.080076,56.708399],[66.082489,56.706779],[66.083493,56.706146],[66.084591,56.705511],[66.086875,56.704325],[66.091818,56.701889],[66.091883,56.701857],[66.09638,56.699561],[66.115986,56.689673],[66.146521,56.674257],[66.147991,56.673607],[66.154831,56.670947],[66.168101,56.66584],[66.171545,56.664505],[66.183227,56.659977],[66.183749,56.659775],[66.185139,56.659236],[66.185191,56.659216],[66.199156,56.653802],[66.201446,56.652914],[66.213031,56.64838],[66.217215,56.646717],[66.217935,56.646397],[66.220758,56.645171],[66.224156,56.643583],[66.225326,56.643036],[66.22711,56.642202],[66.22885,56.641342],[66.229655,56.64095],[66.232973,56.639346],[66.233552,56.639064],[66.234061,56.638819],[66.236656,56.637577],[66.244093,56.633973],[66.245753,56.633168],[66.245922,56.633086],[66.248579,56.631821],[66.248678,56.631774],[66.249225,56.631523],[66.250894,56.630765],[66.252021,56.630256],[66.25292,56.629894],[66.253021,56.629853],[66.253204,56.629777],[66.254089,56.629432],[66.255242,56.628983],[66.256446,56.628521],[66.257054,56.628298],[66.257895,56.627991],[66.259237,56.627528],[66.259488,56.627441],[66.259833,56.627328],[66.260234,56.627196],[66.260848,56.626995],[66.261083,56.62692],[66.262436,56.626486],[66.262696,56.626402],[66.26471,56.625743],[66.266858,56.625049],[66.268623,56.62449],[66.271024,56.623696],[66.273146,56.623],[66.274094,56.62269],[66.274537,56.622467],[66.274744,56.622398],[66.27811,56.621277],[66.279268,56.620895],[66.281587,56.620129],[66.286591,56.618459],[66.291807,56.616719],[66.293787,56.616038],[66.301319,56.613578],[66.307962,56.611506],[66.310495,56.610717],[66.316293,56.608811],[66.320999,56.607264],[66.324352,56.606106],[66.326344,56.605361],[66.32957,56.604039],[66.331643,56.603115],[66.337694,56.600008],[66.356266,56.589485],[66.372603,56.580228],[66.378353,56.576875],[66.380371,56.575591],[66.382838,56.573848],[66.385232,56.572039],[66.387061,56.5706],[66.388169,56.569734],[66.397172,56.562695],[66.41407,56.549435],[66.415052,56.548667],[66.415187,56.548622],[66.424236,56.541534],[66.430512,56.536617],[66.433452,56.534508],[66.433846,56.534239],[66.435378,56.533192],[66.437824,56.531775],[66.439911,56.530722],[66.442432,56.529636],[66.442734,56.529518],[66.44398,56.52903],[66.44437,56.528876],[66.444374,56.528875],[66.445522,56.528486],[66.445923,56.52835],[66.446579,56.528127],[66.448853,56.527429],[66.449027,56.527379],[66.451312,56.526827],[66.453016,56.526446],[66.455891,56.525899],[66.458874,56.525485],[66.46154,56.525177],[66.463173,56.524999],[66.463418,56.524973],[66.465006,56.52484],[66.466921,56.524739],[66.469426,56.524668],[66.471341,56.524668],[66.472188,56.524704],[66.472244,56.524706],[66.474463,56.524798],[66.475613,56.524882],[66.475803,56.524896],[66.476088,56.524917],[66.476962,56.525005],[66.477107,56.525019],[66.47764,56.525072],[66.478293,56.525148],[66.478899,56.525218],[66.481115,56.525553],[66.481364,56.525599],[66.483619,56.526014],[66.484534,56.526203],[66.488657,56.527163],[66.489422,56.527348],[66.491717,56.52789],[66.493914,56.528408],[66.49679,56.528905],[66.501725,56.529402],[66.50265,56.529436],[66.506875,56.529592],[66.507651,56.529557],[66.513827,56.529284],[66.520584,56.528793],[66.52483,56.528495],[66.529023,56.528186],[66.529775,56.528132],[66.538359,56.527455],[66.541582,56.527233],[66.559625,56.525909],[66.562745,56.52566],[66.572355,56.524939],[66.573188,56.524881],[66.586548,56.523883],[66.602653,56.522681],[66.613187,56.521895],[66.613541,56.521868],[66.618558,56.521489],[66.618589,56.521487],[66.625617,56.520955],[66.628511,56.520732],[66.631336,56.520525],[66.634274,56.520229],[66.637057,56.519809],[66.641428,56.519058],[66.642754,56.518778],[66.644161,56.518499],[66.645642,56.518158],[66.647727,56.517647],[66.649656,56.51714],[66.652148,56.516482],[66.660402,56.514382],[66.662766,56.513761],[66.663506,56.513568],[66.664363,56.513328],[66.666241,56.512851],[66.666482,56.512793],[66.66801,56.512418],[66.670525,56.511755],[66.676578,56.51016],[66.676777,56.510108],[66.679064,56.509551],[66.681706,56.508965],[66.684115,56.508497],[66.687677,56.507905],[66.693471,56.507195],[66.697833,56.506895],[66.700722,56.506696],[66.704541,56.506457],[66.71171,56.506011],[66.714015,56.50587],[66.72809,56.505012],[66.747458,56.503832],[66.762569,56.502938],[66.769474,56.502529],[66.778277,56.501974],[66.780138,56.501857],[66.783372,56.501653],[66.79396,56.500985],[66.794091,56.500977],[66.807411,56.500137],[66.810988,56.499905],[66.826216,56.498916],[66.842723,56.497844],[66.843055,56.497822],[66.855203,56.497025],[66.858506,56.49681],[66.867063,56.496252],[66.872875,56.49589],[66.875057,56.495735],[66.876465,56.495642],[66.878607,56.4955],[66.879305,56.495454],[66.882515,56.495248],[66.885132,56.495141],[66.885774,56.495115],[66.891027,56.495046],[66.907678,56.494828],[66.923756,56.494617],[66.942646,56.494369],[66.945221,56.494335],[66.955411,56.494201],[66.958242,56.494164],[66.958551,56.49416],[67.017195,56.493343],[67.0532,56.492841],[67.057894,56.492776],[67.082128,56.492408],[67.084622,56.492449],[67.086724,56.492539],[67.088936,56.492651],[67.090489,56.492755],[67.09205,56.49289],[67.094841,56.493192],[67.099214,56.493699],[67.114092,56.495562],[67.144085,56.499228],[67.169741,56.502363],[67.204249,56.506579],[67.208014,56.507027],[67.211728,56.507437],[67.215212,56.507782],[67.216451,56.507911],[67.217081,56.507976],[67.221725,56.508343],[67.225986,56.508647],[67.229153,56.508857],[67.231034,56.508963],[67.232904,56.509053],[67.234508,56.509122],[67.237252,56.509211],[67.240728,56.509285],[67.242559,56.509333],[67.245748,56.509376],[67.250189,56.50939],[67.251575,56.509395],[67.25787,56.509358],[67.284863,56.509318],[67.292041,56.509303],[67.302875,56.509299],[67.31479,56.509244],[67.325882,56.509217],[67.37333,56.509064],[67.381119,56.509016],[67.384611,56.509019],[67.387326,56.509066],[67.408955,56.50935],[67.424705,56.509681],[67.446881,56.510011],[67.486932,56.510652],[67.492383,56.510487],[67.494233,56.510354],[67.497092,56.510097],[67.500247,56.50979],[67.500595,56.509756],[67.505944,56.509113],[67.508542,56.508769],[67.51375,56.508143],[67.515415,56.507941],[67.530577,56.506082],[67.543473,56.504559],[67.548853,56.503912],[67.554682,56.503194],[67.555767,56.503065],[67.560502,56.50249],[67.566774,56.501746],[67.568898,56.501485],[67.574712,56.500778],[67.57865,56.500301],[67.583138,56.499749],[67.592586,56.4986],[67.595647,56.498228],[67.597997,56.49791],[67.603864,56.497253],[67.606098,56.497034],[67.607696,56.496916],[67.609023,56.496832],[67.610926,56.496737],[67.612732,56.496684],[67.614429,56.496646],[67.615772,56.496638],[67.617023,56.496649],[67.619545,56.496672],[67.624647,56.496737],[67.6401,56.496898],[67.641549,56.496913],[67.642814,56.496935],[67.651459,56.497014],[67.665052,56.497143],[67.669636,56.497187],[67.672909,56.497218],[67.676227,56.497253],[67.680775,56.497302],[67.703097,56.497603],[67.704784,56.49765],[67.708244,56.497844],[67.710083,56.497986],[67.711421,56.498076],[67.714334,56.49837],[67.717119,56.49871],[67.720049,56.499119],[67.730434,56.500942],[67.740219,56.502814],[67.757428,56.505987],[67.764251,56.507171],[67.766001,56.507401],[67.769445,56.507835],[67.771827,56.508108],[67.773822,56.508284],[67.775056,56.508372],[67.776011,56.50844],[67.777813,56.508568],[67.784379,56.508947],[67.788786,56.509168],[67.797125,56.509587],[67.804806,56.509895],[67.806655,56.509918],[67.807463,56.509928],[67.808764,56.509945],[67.810428,56.509966],[67.815793,56.509966],[67.841199,56.509587],[67.844785,56.509558],[67.848756,56.509539],[67.848945,56.509538],[67.852378,56.509545],[67.854459,56.509563],[67.875764,56.510106],[67.88003,56.510214],[67.884841,56.510322],[67.89171,56.510439],[67.898147,56.510439],[67.916808,56.510229],[67.922105,56.51017],[67.932608,56.510108],[67.942908,56.509824],[67.952743,56.509295],[67.954208,56.509213],[67.954711,56.509185],[67.955468,56.509148],[67.96149,56.508853],[68.018696,56.505963],[68.022323,56.505514],[68.022516,56.50549],[68.028224,56.504519],[68.032515,56.503311],[68.035301,56.502288],[68.038525,56.500824],[68.041574,56.499007],[68.046463,56.495707],[68.047199,56.495238],[68.047794,56.494859],[68.052299,56.491988],[68.055775,56.490045],[68.058962,56.488564],[68.059852,56.48815],[68.060981,56.487709],[68.063758,56.486627],[68.065326,56.486024],[68.068898,56.484792],[68.071736,56.483941],[68.074352,56.483251],[68.07815,56.482359],[68.08059,56.481852],[68.082456,56.481512],[68.084551,56.481142],[68.086808,56.480803],[68.090262,56.480362],[68.093026,56.480071],[68.097328,56.479721],[68.101593,56.479502],[68.105873,56.479466],[68.117659,56.479429],[68.123925,56.479311],[68.174951,56.478126],[68.18156,56.477865],[68.188341,56.477462],[68.209445,56.475739],[68.229883,56.474002],[68.243346,56.472735],[68.25004,56.472105],[68.26237,56.470944],[68.267239,56.470306],[68.268296,56.470157],[68.268766,56.470091],[68.271511,56.469688],[68.277733,56.468502],[68.300937,56.463637],[68.301251,56.463571],[68.312194,56.461342],[68.318113,56.459998],[68.320962,56.459342],[68.324343,56.458526],[68.327276,56.45778],[68.331291,56.456764],[68.335766,56.455637],[68.339189,56.454759],[68.342906,56.453813],[68.346977,56.452773],[68.366397,56.447825],[68.37425,56.44607],[68.389869,56.442746],[68.3903,56.442654],[68.402401,56.440124],[68.410632,56.43839],[68.411175,56.43826],[68.411365,56.438211],[68.411489,56.438171],[68.411614,56.438119],[68.411697,56.438077],[68.411816,56.43801],[68.411951,56.437926],[68.412127,56.437791],[68.412157,56.437755],[68.412202,56.437713],[68.412256,56.437674],[68.412318,56.437639],[68.412388,56.437608],[68.412463,56.437582],[68.412544,56.437561],[68.412628,56.437546],[68.412715,56.437536],[68.412804,56.437532],[68.412893,56.437534],[68.41298,56.437542],[68.413064,56.437555],[68.413216,56.437578],[68.413377,56.437594],[68.413565,56.437608],[68.41379,56.437612],[68.414034,56.437606],[68.414305,56.43758],[68.414791,56.437505],[68.416108,56.437234],[68.416801,56.437087],[68.418639,56.436692],[68.420058,56.436408],[68.427613,56.434846],[68.431436,56.434139],[68.435487,56.433561],[68.437173,56.433371],[68.439012,56.433215],[68.44066,56.433102],[68.441426,56.433046],[68.442989,56.432945],[68.445254,56.432841],[68.447323,56.432777],[68.44968,56.432783],[68.452047,56.4328],[68.453974,56.432843],[68.455871,56.432939],[68.457337,56.433041],[68.45939,56.433192],[68.461787,56.433421],[68.462498,56.433479],[68.465938,56.433799],[68.469574,56.434009],[68.472325,56.434079],[68.476585,56.434055],[68.480621,56.433907],[68.485554,56.433553],[68.490771,56.433145],[68.50206,56.432241],[68.516999,56.43104],[68.53127,56.4299],[68.543889,56.428877],[68.546459,56.428649],[68.548454,56.428422],[68.550601,56.428115],[68.552917,56.427757],[68.554808,56.42742],[68.555051,56.427377],[68.556921,56.426974],[68.560107,56.426218],[68.564012,56.425159],[68.564583,56.424999],[68.565063,56.424849],[68.566697,56.424336],[68.568934,56.423528],[68.571502,56.422507],[68.57377,56.421489],[68.576106,56.420354],[68.577529,56.419622],[68.578626,56.419],[68.579938,56.418214],[68.580334,56.417972],[68.583108,56.416305],[68.583867,56.415898],[68.585159,56.41525],[68.586048,56.414845],[68.587212,56.414332],[68.589016,56.413571],[68.592227,56.412389],[68.59546,56.411353],[68.598897,56.410369],[68.602228,56.409606],[68.606049,56.40898],[68.61023,56.40843],[68.628063,56.406899],[68.638109,56.406034],[68.658447,56.40424],[68.688487,56.401627],[68.710031,56.399728],[68.725914,56.398373],[68.72806,56.398172],[68.728462,56.398134],[68.730953,56.397873],[68.732992,56.397625],[68.73542,56.397298],[68.736918,56.397083],[68.73923,56.396695],[68.742282,56.396138],[68.745297,56.395547],[68.751564,56.394008],[68.752832,56.393619],[68.753748,56.393316],[68.755856,56.392641],[68.757729,56.391992],[68.760206,56.391137],[68.762865,56.390146],[68.765098,56.389117],[68.77626,56.383998],[68.782282,56.381163],[68.793822,56.37579],[68.796024,56.374748],[68.796896,56.374337],[68.799983,56.372916],[68.811508,56.367556],[68.823133,56.362112],[68.82339,56.361992],[68.826204,56.360729],[68.82822,56.359856],[68.834478,56.357299],[68.838731,56.355697],[68.856662,56.349301],[68.869285,56.344796],[68.878993,56.341122],[68.889421,56.336655],[68.902092,56.331157],[68.908036,56.328581],[68.910801,56.327406],[68.921604,56.322703],[68.930669,56.318804],[68.940541,56.314305],[68.941004,56.314093],[68.941625,56.313814],[68.942122,56.313593],[68.943036,56.313188],[68.943768,56.312837],[68.944308,56.312569],[68.944956,56.312243],[68.945634,56.311881],[68.947132,56.311014],[68.947568,56.310737],[68.94821,56.310279],[68.948916,56.309755],[68.954206,56.305562],[68.968467,56.294135],[68.973708,56.290007],[68.97415,56.289623],[68.97499,56.288839],[68.975628,56.288176],[68.976092,56.287645],[68.97654,56.28706],[68.978367,56.284214],[68.980569,56.281178],[68.985279,56.274395],[68.985633,56.274001],[68.986184,56.273446],[68.986799,56.272858],[68.987381,56.272359],[68.987881,56.271975],[68.988506,56.271537],[68.989459,56.270931],[68.990314,56.270472],[68.991644,56.269861],[68.993358,56.269121],[68.994132,56.268816],[68.995409,56.268397],[68.996842,56.267996],[68.996938,56.267969],[68.999135,56.267463],[69.001059,56.267063],[69.003178,56.266638],[69.011471,56.264963],[69.013689,56.264454],[69.015746,56.263949],[69.017706,56.263412],[69.019922,56.262711],[69.022368,56.26185],[69.027051,56.260058],[69.028036,56.259681],[69.029261,56.259215],[69.03046,56.258743],[69.032075,56.258156],[69.033599,56.257634],[69.034471,56.257347],[69.035602,56.257026],[69.040613,56.255687],[69.049526,56.253343],[69.060478,56.250481],[69.072837,56.247239],[69.097963,56.240619],[69.098268,56.240539],[69.100982,56.239878],[69.102714,56.239515],[69.104241,56.239232],[69.105763,56.238989],[69.106867,56.238832],[69.108697,56.238601],[69.110225,56.238427],[69.111793,56.238248],[69.126853,56.236606],[69.13588,56.235601],[69.147545,56.234344],[69.161872,56.232787],[69.165487,56.232414],[69.170835,56.231793],[69.176349,56.231188],[69.181375,56.230666],[69.186014,56.230121],[69.188074,56.229814],[69.189637,56.229552],[69.191036,56.22929],[69.192092,56.229071],[69.193354,56.228783],[69.194746,56.228439],[69.198597,56.227414],[69.205287,56.225598],[69.21366,56.223295],[69.220287,56.221505],[69.225014,56.220223],[69.231372,56.218489],[69.23717,56.216903],[69.241537,56.215734],[69.246074,56.214494],[69.249317,56.213586],[69.252506,56.212595],[69.2537,56.212194],[69.254772,56.211835],[69.256903,56.211046],[69.25799,56.210634],[69.258084,56.210598],[69.260304,56.209694],[69.265917,56.207382],[69.269139,56.206052],[69.273919,56.204084],[69.283924,56.199967],[69.287753,56.198376],[69.291765,56.196717],[69.293606,56.195955],[69.295488,56.195264],[69.296525,56.194905],[69.297518,56.194565],[69.298499,56.194266],[69.29958,56.193956],[69.300224,56.193772],[69.300951,56.193578],[69.302787,56.19311],[69.304098,56.192816],[69.304967,56.192638],[69.306248,56.192384],[69.307754,56.192131],[69.310931,56.191607],[69.320313,56.190055],[69.328188,56.188755],[69.336152,56.187431],[69.339643,56.186851],[69.342674,56.18633],[69.344604,56.185964],[69.346217,56.185626],[69.347833,56.185262],[69.349316,56.184917],[69.350491,56.184621],[69.35219,56.184184],[69.358296,56.182495],[69.368781,56.179604],[69.370901,56.179001],[69.37392,56.178173],[69.374648,56.177971],[69.375616,56.177683],[69.379466,56.176629],[69.383353,56.175576],[69.386565,56.174755],[69.387621,56.174505],[69.388546,56.174293],[69.389914,56.173994],[69.392408,56.173507],[69.396284,56.172828],[69.398639,56.172405],[69.40493,56.171409],[69.406162,56.171219],[69.411691,56.170295],[69.41289,56.170065],[69.412973,56.170049],[69.41411,56.169812],[69.415348,56.169534],[69.416043,56.169374],[69.416666,56.169214],[69.417266,56.169057],[69.418197,56.168793],[69.419141,56.168507],[69.422168,56.16754],[69.431787,56.164375],[69.438287,56.162277],[69.438382,56.162246],[69.441919,56.161052],[69.44246,56.160864],[69.446687,56.15946],[69.454777,56.156769],[69.458646,56.155486],[69.461446,56.154568],[69.464133,56.153742],[69.464638,56.153601],[69.465134,56.153465],[69.465588,56.153347],[69.465951,56.153256],[69.466236,56.153192],[69.466934,56.153059],[69.468324,56.152812],[69.469516,56.152624],[69.470299,56.152513],[69.471182,56.152394],[69.471519,56.15236],[69.47187,56.15233],[69.47243,56.15229],[69.472995,56.152256],[69.473602,56.15223],[69.474318,56.152208],[69.475304,56.152195],[69.476109,56.152198],[69.476911,56.152222],[69.477461,56.152244],[69.478074,56.152278],[69.478684,56.152324],[69.479029,56.152353],[69.479403,56.152389],[69.479752,56.152427],[69.480725,56.152538],[69.482183,56.152736],[69.483042,56.152856],[69.485619,56.15321],[69.492602,56.154144],[69.494902,56.154452],[69.508988,56.15633],[69.509247,56.156364],[69.514269,56.156951],[69.515351,56.157057],[69.520377,56.157468],[69.528542,56.158111],[69.530974,56.158302],[69.533511,56.158512],[69.543373,56.159341],[69.551476,56.160003],[69.55744,56.160489],[69.559088,56.160635],[69.561032,56.160852],[69.562098,56.160978],[69.562277,56.160999],[69.563185,56.161119],[69.563319,56.161137],[69.564375,56.161303],[69.565615,56.161528],[69.566386,56.161682],[69.567352,56.161879],[69.569081,56.16224],[69.571026,56.162682],[69.572889,56.163144],[69.574732,56.163599],[69.57575,56.16384],[69.576325,56.163961],[69.576805,56.164051],[69.577345,56.164136],[69.577942,56.164219],[69.578815,56.164313],[69.579565,56.164362],[69.580302,56.16438],[69.583243,56.164384],[69.586409,56.164367],[69.589093,56.164353],[69.596134,56.164325],[69.597857,56.164285],[69.599376,56.164211],[69.602824,56.164039],[69.603911,56.16399],[69.605104,56.163955],[69.606928,56.163922],[69.607137,56.163918],[69.613181,56.163788],[69.620309,56.163655],[69.62155,56.163631],[69.62254,56.163621],[69.623618,56.163621],[69.624573,56.163621],[69.625359,56.163641],[69.626295,56.163682],[69.627224,56.163739],[69.627568,56.16376],[69.628585,56.163832],[69.629548,56.163901],[69.630565,56.163991],[69.632984,56.164253],[69.633124,56.164271],[69.637458,56.164822],[69.640415,56.165158],[69.643936,56.165626],[69.652099,56.166633],[69.657843,56.167352],[69.658603,56.167455],[69.659301,56.167549],[69.65999,56.167657],[69.66045,56.167736],[69.660973,56.167837],[69.660996,56.167841],[69.66998,56.170107],[69.671223,56.170423],[69.671954,56.170583],[69.672603,56.170704],[69.673477,56.170836],[69.676062,56.171177],[69.677618,56.171366],[69.679125,56.171572],[69.680105,56.171713],[69.687744,56.173117],[69.693202,56.174106],[69.693912,56.174218],[69.696169,56.174652],[69.696828,56.174757],[69.697509,56.174857],[69.698114,56.174898],[69.699087,56.174933],[69.70076,56.17496],[69.702433,56.174975],[69.706138,56.175011],[69.709506,56.175032],[69.712868,56.17506],[69.720597,56.175148],[69.721446,56.175133],[69.722229,56.175102],[69.723179,56.175034],[69.723976,56.174976],[69.725037,56.174909],[69.725629,56.174873],[69.726246,56.174858],[69.726822,56.174853],[69.727019,56.174856],[69.727567,56.174866],[69.731784,56.175025],[69.734424,56.175136],[69.736001,56.175202],[69.741813,56.175427],[69.743303,56.175495],[69.744171,56.175549],[69.744866,56.175609],[69.746003,56.175763],[69.74928,56.176337],[69.75313,56.176996],[69.754724,56.177263],[69.756322,56.177539],[69.757757,56.177789],[69.759122,56.178026],[69.773699,56.180921],[69.77967,56.182083],[69.782992,56.182729],[69.787608,56.183677],[69.787622,56.18368],[69.789927,56.184131],[69.791087,56.18435],[69.792189,56.184549],[69.797242,56.185479],[69.79822,56.185638],[69.799584,56.185838],[69.800946,56.186004],[69.802588,56.186223],[69.807159,56.186881],[69.816199,56.188183],[69.849211,56.192828],[69.851439,56.193133],[69.853701,56.193438],[69.855239,56.193664],[69.866266,56.195598],[69.869618,56.196185],[69.875494,56.197214],[69.883607,56.19863],[69.888555,56.199492],[69.890748,56.199879],[69.892692,56.200194],[69.894389,56.200449],[69.898242,56.20099],[69.903714,56.20171],[69.910906,56.202632],[69.911701,56.202732],[69.912258,56.202781],[69.912787,56.202785],[69.913451,56.202772],[69.914821,56.202698],[69.91642,56.2026],[69.917543,56.202536],[69.918453,56.202496],[69.919293,56.202477],[69.920265,56.202471],[69.92676,56.202595],[69.92836,56.202654],[69.931258,56.202742],[69.932231,56.202767],[69.933079,56.202757],[69.934012,56.202712],[69.93619,56.2026],[69.937931,56.202521],[69.940405,56.202442],[69.942632,56.202378],[69.943543,56.202354],[69.944197,56.202354],[69.944741,56.202378],[69.945425,56.202413],[69.946335,56.202506],[69.949243,56.202836],[69.951912,56.203129],[69.9558,56.203553],[69.957002,56.203691],[69.958663,56.203902],[69.961912,56.204358],[69.962172,56.204394],[69.963538,56.204622],[69.968332,56.205564],[69.970081,56.205942],[69.972883,56.206601],[69.974916,56.207063],[69.977116,56.20752],[69.980869,56.208269],[69.985918,56.209294],[69.986722,56.209457],[69.987721,56.209702],[69.98867,56.210006],[69.996691,56.212638],[69.99833,56.213142],[69.999631,56.21352],[70.000212,56.213659],[70.000688,56.213745],[70.00107,56.213809],[70.001608,56.213877],[70.002446,56.213948],[70.0035,56.213999],[70.010884,56.214145],[70.012201,56.21414],[70.013191,56.214111],[70.014696,56.214011],[70.018581,56.213708],[70.023379,56.213321],[70.026211,56.213094],[70.038152,56.212212],[70.039199,56.21212],[70.04018,56.212037],[70.040827,56.211997],[70.041409,56.211998],[70.042248,56.212042],[70.044173,56.21219],[70.055301,56.213187],[70.055982,56.213236],[70.056672,56.213262],[70.057369,56.213241],[70.059393,56.213143],[70.060445,56.213094],[70.061205,56.213074],[70.06192,56.213084],[70.062758,56.213119],[70.064156,56.213192],[70.065473,56.21327],[70.067709,56.213457],[70.07097,56.213801],[70.075314,56.214282],[70.078773,56.214676],[70.079392,56.214725],[70.079966,56.214735],[70.080716,56.214742],[70.081274,56.214735],[70.08176,56.21471],[70.082291,56.214637],[70.082822,56.214524],[70.083325,56.214357],[70.084315,56.213954],[70.085393,56.213531],[70.086166,56.213256],[70.087867,56.2127],[70.089776,56.212111],[70.092056,56.211457],[70.093152,56.211123],[70.095432,56.210425],[70.096338,56.210161],[70.096979,56.210007],[70.09773,56.209869],[70.098764,56.209683],[70.101231,56.2093],[70.103658,56.208966],[70.106123,56.20868],[70.107343,56.208557],[70.108217,56.208473],[70.109026,56.208408],[70.109667,56.20838],[70.110427,56.20836],[70.111275,56.20836],[70.112244,56.208369],[70.113476,56.208424],[70.114793,56.208483],[70.115818,56.208557],[70.116229,56.208596],[70.117166,56.208701],[70.118124,56.208832],[70.120552,56.209308],[70.121613,56.209551],[70.12271,56.209823],[70.123215,56.209964],[70.123779,56.210121],[70.125487,56.210736],[70.128146,56.211661],[70.128921,56.211912],[70.1292,56.212011],[70.129943,56.212277],[70.131173,56.212652],[70.132278,56.212994],[70.133422,56.21326],[70.134054,56.213394],[70.135131,56.213606],[70.136355,56.213832],[70.13636,56.213833],[70.13926,56.214324],[70.145549,56.215446],[70.148191,56.215969],[70.149691,56.216296],[70.150443,56.216473],[70.151014,56.216584],[70.152707,56.217013],[70.153646,56.217248],[70.15495,56.217623],[70.156161,56.218052],[70.157106,56.218405],[70.158026,56.218774],[70.158229,56.218868],[70.160007,56.219691],[70.162225,56.220863],[70.164208,56.221964],[70.166411,56.223135],[70.167653,56.223764],[70.168378,56.224074],[70.16916,56.224377],[70.170322,56.224812],[70.17142,56.225176],[70.172606,56.22554],[70.173666,56.225835],[70.174392,56.226021],[70.175394,56.226258],[70.176373,56.226479],[70.177196,56.226649],[70.178117,56.226797],[70.178968,56.22696],[70.179736,56.227091],[70.180503,56.227239],[70.181452,56.22744],[70.186011,56.228485],[70.189517,56.229317],[70.190633,56.229604],[70.191951,56.23],[70.19313,56.230364],[70.194414,56.23083],[70.195059,56.231077],[70.195568,56.231273],[70.196716,56.231753],[70.198293,56.232474],[70.199409,56.233032],[70.200358,56.233567],[70.200959,56.23395],[70.205772,56.237003],[70.206372,56.237352],[70.206944,56.237701],[70.20745,56.237987],[70.208311,56.238414],[70.209358,56.238903],[70.210906,56.239546],[70.212149,56.240014],[70.213195,56.240376],[70.214102,56.24067],[70.214994,56.240942],[70.215971,56.241213],[70.21685,56.241438],[70.217827,56.241655],[70.218753,56.241845],[70.219669,56.242012],[70.221748,56.242376],[70.224359,56.242813],[70.227273,56.243276],[70.230175,56.24378],[70.235035,56.244645],[70.238212,56.245222],[70.240821,56.245749],[70.242105,56.245997],[70.243444,56.246222],[70.244745,56.246412],[70.246891,56.246718],[70.25983,56.248059],[70.266801,56.248772],[70.268274,56.248929],[70.269773,56.249113],[70.27128,56.249307],[70.27608,56.249974],[70.280266,56.250571],[70.286251,56.251415],[70.28874,56.251766],[70.298376,56.253028],[70.30206,56.253501],[70.312485,56.254939],[70.312954,56.255004],[70.315761,56.255384],[70.317199,56.255586],[70.318133,56.255733],[70.31918,56.255911],[70.321245,56.256368],[70.325296,56.257264],[70.334829,56.259382],[70.342173,56.261013],[70.344155,56.261445],[70.345299,56.261708],[70.346262,56.261941],[70.352299,56.26373],[70.360736,56.266296],[70.363129,56.267031],[70.363257,56.26707],[70.36867,56.268922],[70.375419,56.271258],[70.387842,56.275554],[70.393562,56.277529],[70.399734,56.279894],[70.403176,56.281208],[70.403929,56.281479],[70.404559,56.281688],[70.405037,56.281834],[70.405697,56.282011],[70.406422,56.282188],[70.407231,56.282379],[70.408158,56.282571],[70.408446,56.282628],[70.408888,56.282697],[70.409579,56.282796],[70.40979,56.282818],[70.41024,56.282867],[70.411,56.282922],[70.412154,56.282965],[70.413463,56.282982],[70.416219,56.282998],[70.417127,56.282997],[70.41841,56.282996],[70.41965,56.282984],[70.420172,56.28297],[70.420836,56.282935],[70.421376,56.282898],[70.422172,56.282825],[70.423692,56.282673],[70.424451,56.282597],[70.42529,56.282499],[70.428618,56.282055],[70.429562,56.281914],[70.435031,56.281104],[70.435484,56.28104],[70.436541,56.280889],[70.437961,56.280689],[70.438984,56.280545],[70.439712,56.280442],[70.441165,56.280238],[70.442255,56.280094],[70.443665,56.279932],[70.444665,56.279827],[70.44524,56.279776],[70.445961,56.279718],[70.44681,56.279657],[70.447742,56.279598],[70.449221,56.279527],[70.451798,56.279395],[70.454105,56.279274],[70.455186,56.279213],[70.456136,56.279155],[70.457019,56.279093],[70.457725,56.279038],[70.458289,56.278988],[70.459026,56.278921],[70.459834,56.278839],[70.460844,56.278726],[70.461767,56.278607],[70.462462,56.278513],[70.463175,56.278408],[70.464111,56.278265],[70.464562,56.278195],[70.465262,56.278077],[70.465771,56.278003],[70.466217,56.277945],[70.466679,56.277893],[70.467164,56.277847],[70.467787,56.277804],[70.469852,56.277666],[70.472691,56.277514],[70.481479,56.277044],[70.488079,56.276688],[70.492434,56.276451],[70.493337,56.276409],[70.493817,56.276378],[70.494324,56.276337],[70.494818,56.276286],[70.495473,56.276201],[70.496115,56.2761],[70.496813,56.275965],[70.497426,56.275833],[70.497922,56.275705],[70.499541,56.275217],[70.50097,56.274729],[70.511172,56.271123],[70.526618,56.265787],[70.526812,56.26572],[70.534807,56.262977],[70.542659,56.26025],[70.545376,56.259315],[70.547232,56.258614],[70.548969,56.257947],[70.5504,56.257376],[70.55116,56.257064],[70.55206,56.256641],[70.552518,56.25643],[70.553235,56.256029],[70.553776,56.2557],[70.554474,56.255242],[70.555625,56.254448],[70.556859,56.253544],[70.557631,56.25295],[70.558351,56.252411],[70.55898,56.251913],[70.559757,56.251281],[70.560627,56.250554],[70.560947,56.25031],[70.561218,56.25011],[70.561501,56.249917],[70.56179,56.249739],[70.562111,56.249581],[70.562471,56.249414],[70.562853,56.24926],[70.563342,56.249078],[70.563849,56.248901],[70.56447,56.24871],[70.565298,56.248475],[70.566038,56.248256],[70.566683,56.248093],[70.567306,56.247973],[70.568057,56.247859],[70.568936,56.247743],[70.569311,56.247703],[70.569606,56.247682],[70.569898,56.247668],[70.570538,56.247655],[70.572,56.247673],[70.575996,56.247778],[70.580024,56.247883],[70.585951,56.248049],[70.597528,56.248399],[70.602025,56.248526],[70.603831,56.248571],[70.607301,56.248689],[70.61179,56.248749],[70.617513,56.248771],[70.62397,56.248791],[70.644003,56.248904],[70.651916,56.248952],[70.652656,56.248963],[70.653262,56.248983],[70.653807,56.249015],[70.654497,56.249072],[70.655195,56.249138],[70.656046,56.249227],[70.657143,56.249367],[70.658034,56.249499],[70.659129,56.249681],[70.660071,56.249859],[70.661153,56.250111],[70.662066,56.250371],[70.663106,56.25071],[70.664882,56.251356],[70.665094,56.251433],[70.666277,56.251929],[70.667389,56.252468],[70.668115,56.25284],[70.669049,56.253394],[70.669539,56.253726],[70.670471,56.254466],[70.671843,56.255513],[70.672439,56.255938],[70.673146,56.256351],[70.673626,56.256599],[70.674066,56.256812],[70.674673,56.257091],[70.675252,56.257304],[70.675965,56.257553],[70.677017,56.257893],[70.679238,56.258549],[70.680247,56.258825],[70.6811,56.259041],[70.681641,56.259147],[70.682017,56.259206],[70.682335,56.259246],[70.682709,56.25929],[70.683042,56.259322],[70.683597,56.259369],[70.684176,56.259408],[70.684581,56.259431],[70.685188,56.25944],[70.686031,56.259428],[70.686573,56.259422],[70.687644,56.259398],[70.68842,56.259358],[70.689125,56.259297],[70.689918,56.259214],[70.691912,56.258985],[70.696755,56.258435],[70.699117,56.258166],[70.700085,56.258055],[70.700721,56.257983],[70.701289,56.257935],[70.702104,56.25787],[70.703039,56.257808],[70.703848,56.257765],[70.707664,56.257602],[70.708732,56.257579],[70.709802,56.257575],[70.710636,56.257583],[70.712057,56.25762],[70.713353,56.257677],[70.714722,56.257769],[70.727973,56.25885],[70.761456,56.261581],[70.76357,56.261769],[70.769121,56.26225],[70.785698,56.263629],[70.787777,56.263768],[70.790839,56.263958],[70.793734,56.264117],[70.795799,56.26421],[70.79763,56.26427],[70.817699,56.264577],[70.819102,56.264597],[70.826858,56.264729],[70.827961,56.264753],[70.828982,56.264783],[70.829956,56.264814],[70.831393,56.264892],[70.833542,56.265031],[70.834822,56.265113],[70.835914,56.265217],[70.837532,56.265365],[70.839137,56.265535],[70.845275,56.266323],[70.84529,56.266325],[70.849853,56.266938],[70.851137,56.267118],[70.852655,56.267347],[70.853987,56.267485],[70.85515,56.267589],[70.856329,56.26768],[70.856368,56.267683],[70.858191,56.267794],[70.859554,56.267868],[70.86041,56.267899],[70.861039,56.267904],[70.862746,56.267896],[70.864173,56.267859],[70.865891,56.267791],[70.868124,56.267659],[70.86824,56.267652],[70.870126,56.267548],[70.875358,56.267263],[70.880168,56.267038],[70.886399,56.266747],[70.890938,56.266527],[70.894044,56.266316],[70.897344,56.266163],[70.909997,56.265604],[70.912083,56.265464],[70.93256,56.264426],[70.934121,56.264341],[70.93602,56.264251],[70.945645,56.263821],[70.947015,56.263737],[70.94829,56.263655],[70.949094,56.26359],[70.949739,56.263534],[70.951041,56.2634],[70.952199,56.263284],[70.954949,56.262997],[70.956831,56.262744],[70.959251,56.262396],[70.960556,56.262193],[70.962392,56.261865],[70.967761,56.260878],[70.96996,56.260466],[70.973025,56.259903],[70.978123,56.258956],[70.980002,56.258601],[70.981172,56.258353],[70.982395,56.258073],[70.98421,56.257633],[70.986035,56.257166],[70.987322,56.256837],[70.988017,56.256651],[70.988586,56.256484],[70.989059,56.256317],[70.989549,56.256112],[70.99067,56.25563],[70.994448,56.253929],[70.995882,56.253214],[70.996565,56.252847],[70.997424,56.252384],[70.999623,56.251151],[71.00328,56.248766],[71.006399,56.246723],[71.006901,56.246421],[71.007274,56.246184],[71.007759,56.245898],[71.008439,56.245529],[71.009255,56.245089],[71.01184,56.243797],[71.01343,56.243075],[71.014345,56.2427],[71.014847,56.242502],[71.016085,56.242052],[71.016089,56.242051],[71.017903,56.241431],[71.018482,56.241238],[71.019328,56.240976],[71.020325,56.240693],[71.021531,56.240386],[71.023019,56.240032],[71.024158,56.239775],[71.024644,56.239672],[71.025498,56.239504],[71.026557,56.239295],[71.027523,56.239106],[71.028556,56.238935],[71.029645,56.238795],[71.030523,56.238689],[71.03152,56.238564],[71.035804,56.238047],[71.040253,56.237497],[71.044825,56.236985],[71.046067,56.236864],[71.047778,56.236708],[71.050615,56.236472],[71.056371,56.236079],[71.057985,56.235954],[71.060104,56.235798],[71.065994,56.235367],[71.073658,56.23479],[71.080994,56.234224],[71.081883,56.234147],[71.083111,56.234023],[71.084255,56.233906],[71.085093,56.233817],[71.086007,56.233708],[71.10797,56.230729],[71.116072,56.22963],[71.123366,56.228658],[71.128075,56.227988],[71.129945,56.227716],[71.131103,56.227522],[71.132666,56.227243],[71.136545,56.226498],[71.138131,56.226147],[71.139838,56.225769],[71.141365,56.225409],[71.142789,56.225044],[71.144058,56.224703],[71.145682,56.224255],[71.147337,56.223787],[71.14837,56.223473],[71.149242,56.22319],[71.152933,56.221878],[71.158177,56.220005],[71.164652,56.217705],[71.166918,56.216897],[71.169071,56.21612],[71.172692,56.21483],[71.173829,56.214435],[71.174406,56.214232],[71.174973,56.214023],[71.176046,56.213595],[71.177267,56.213072],[71.177981,56.212759],[71.178705,56.212429],[71.180076,56.211735],[71.181449,56.211012],[71.182763,56.210243],[71.18383,56.209582],[71.184805,56.208938],[71.185788,56.208259],[71.186714,56.207567],[71.187153,56.207203],[71.187671,56.20676],[71.189367,56.205291],[71.189787,56.204905],[71.190211,56.204479],[71.190484,56.204184],[71.19097,56.203591],[71.191912,56.202354],[71.19194,56.202318],[71.192915,56.201025],[71.194865,56.198415],[71.196783,56.195803],[71.199003,56.19283],[71.200389,56.190965],[71.201256,56.189775],[71.202091,56.18866],[71.205227,56.184425],[71.205257,56.184383],[71.205784,56.183661],[71.207423,56.181442],[71.208818,56.179563],[71.210085,56.177958],[71.211505,56.176284],[71.21158,56.176193],[71.211795,56.175933],[71.212384,56.17523],[71.213166,56.174362],[71.214012,56.173486],[71.21441,56.173088],[71.21485,56.172663],[71.216152,56.1715],[71.21726,56.170571],[71.218464,56.169603],[71.219445,56.168892],[71.221602,56.167413],[71.223119,56.166402],[71.224504,56.1655],[71.225463,56.164852],[71.226375,56.16426],[71.228155,56.163111],[71.231036,56.161291],[71.233739,56.1596],[71.235562,56.158455],[71.237265,56.157386],[71.240303,56.155472],[71.24367,56.153347],[71.245746,56.15205],[71.248031,56.150598],[71.250639,56.148933],[71.252036,56.148053],[71.253238,56.147283],[71.254573,56.146442],[71.263027,56.141113],[71.263739,56.140667],[71.264485,56.140182],[71.26588,56.139308],[71.272839,56.134854],[71.273536,56.134355],[71.274421,56.133731],[71.276767,56.131769],[71.278768,56.129738],[71.28018,56.127873],[71.281435,56.125956],[71.282464,56.123643],[71.28331,56.121182],[71.2837,56.116964],[71.284234,56.112978],[71.285159,56.110408],[71.286138,56.108744],[71.287406,56.106842],[71.288929,56.105186],[71.291143,56.103255],[71.29343,56.101629],[71.294224,56.101133],[71.295105,56.100588],[71.296589,56.099781],[71.2976,56.099278],[71.298769,56.098749],[71.299967,56.098194],[71.30136,56.097583],[71.302895,56.096902],[71.304436,56.096219],[71.306079,56.095474],[71.307716,56.094748],[71.310182,56.09365],[71.311849,56.092911],[71.3132,56.092301],[71.316189,56.090969],[71.318814,56.089804],[71.320907,56.088889],[71.325114,56.08728],[71.326263,56.086831],[71.327242,56.08637],[71.327953,56.086018],[71.328796,56.085508],[71.329495,56.085033],[71.330231,56.08442],[71.330857,56.083797],[71.332651,56.081834],[71.335361,56.078758],[71.336111,56.077909],[71.337193,56.076644],[71.338477,56.075134],[71.338737,56.074829],[71.342681,56.070265],[71.347432,56.064666],[71.349257,56.062542],[71.351292,56.060151],[71.356649,56.053823],[71.357731,56.052603],[71.358388,56.051925],[71.359559,56.050783],[71.360329,56.050081],[71.361654,56.048921],[71.362991,56.047839],[71.364332,56.046792],[71.365846,56.045685],[71.366872,56.044969],[71.366882,56.044962],[71.368024,56.044207],[71.368224,56.044082],[71.36943,56.043324],[71.370716,56.042526],[71.3753,56.039678],[71.375791,56.039373],[71.37609,56.03919],[71.376768,56.038773],[71.376929,56.03867],[71.377125,56.038543],[71.377509,56.038298],[71.378812,56.037461],[71.379253,56.037186],[71.379694,56.036911],[71.380914,56.036156],[71.381705,56.035691],[71.38277,56.035114],[71.38387,56.034552],[71.386427,56.033331],[71.40399,56.025079],[71.408827,56.02253],[71.412899,56.020156],[71.420916,56.015387],[71.427962,56.011228],[71.43562,56.006606],[71.445286,56.000942],[71.448121,55.999227],[71.451614,55.997113],[71.459903,55.992323],[71.461681,55.991378],[71.463321,55.990609],[71.464426,55.990147],[71.465545,55.9897],[71.467322,55.989014],[71.470165,55.988026],[71.472197,55.98741],[71.472592,55.987298],[71.473691,55.98701],[71.475373,55.986627],[71.477853,55.986117],[71.481957,55.98548],[71.483615,55.985274],[71.485433,55.985047],[71.486096,55.984997],[71.486809,55.984955],[71.489978,55.984817],[71.494085,55.984805],[71.496945,55.984896],[71.497916,55.984927],[71.498464,55.984906],[71.498838,55.984855],[71.498913,55.984793],[71.499088,55.984717],[71.49931,55.984686],[71.499547,55.984709],[71.499767,55.984799],[71.500327,55.984965],[71.500906,55.985055],[71.5017,55.985089],[71.504806,55.985294],[71.506749,55.985414],[71.508546,55.985515],[71.509827,55.985585],[71.5113,55.985673],[71.512789,55.985735],[71.513678,55.985773],[71.514283,55.985771],[71.514976,55.985746],[71.515774,55.985703],[71.516517,55.985637],[71.517234,55.985555],[71.518289,55.985398],[71.519482,55.985176],[71.526848,55.983398],[71.53217,55.982132],[71.537116,55.980955],[71.542434,55.979684],[71.547433,55.978498],[71.54756,55.978468],[71.569628,55.973137],[71.573991,55.972206],[71.580819,55.970819],[71.585058,55.97005],[71.58789,55.96956],[71.591056,55.96907],[71.595749,55.968447],[71.599362,55.968047],[71.603226,55.967639],[71.60835,55.967188],[71.619534,55.966409],[71.622771,55.966212],[71.626025,55.965979],[71.629248,55.96571],[71.632595,55.965361],[71.63475,55.965072],[71.637581,55.964676],[71.639193,55.964417],[71.643139,55.9637],[71.647096,55.962988],[71.649625,55.962535],[71.652529,55.961998],[71.655153,55.961494],[71.664424,55.959828],[71.669768,55.958858],[71.675758,55.957775],[71.679683,55.957098],[71.683316,55.956496],[71.686115,55.956035],[71.689508,55.955542],[71.693719,55.954972],[71.702615,55.953813],[71.706067,55.953434],[71.709506,55.953046],[71.713254,55.952658],[71.717149,55.952285],[71.717237,55.952277],[71.72107,55.951939],[71.722819,55.951789],[71.725417,55.951581],[71.728006,55.951389],[71.730373,55.951226],[71.733046,55.95105],[71.736244,55.950856],[71.757118,55.949639],[71.761692,55.949374],[71.81095,55.946439],[71.824472,55.945413],[71.828271,55.945067],[71.833151,55.94463],[71.837908,55.944167],[71.842292,55.943724],[71.846622,55.943149],[71.854849,55.941948],[71.857668,55.941536],[71.860649,55.941077],[71.865017,55.940372],[71.868632,55.939767],[71.872229,55.939151],[71.878155,55.938113],[71.879438,55.937877],[71.882437,55.93733],[71.885753,55.936684],[71.885797,55.936675],[71.903812,55.933131],[71.916926,55.930518],[71.943097,55.925259],[71.950408,55.923801],[71.953606,55.923229],[71.955473,55.922934],[71.957349,55.922652],[71.959958,55.922315],[71.962709,55.921985],[71.968209,55.921362],[71.993824,55.918491],[72.001678,55.917599],[72.024478,55.915013],[72.033223,55.914018],[72.042554,55.91297],[72.050299,55.912098],[72.052323,55.911845],[72.054357,55.911567],[72.056717,55.911238],[72.058894,55.910923],[72.061146,55.910579],[72.063931,55.910097],[72.066609,55.909606],[72.071347,55.90872],[72.080388,55.907012],[72.081955,55.9067],[72.085447,55.905982],[72.088715,55.905333],[72.09308,55.904579],[72.095867,55.904144],[72.099,55.903697],[72.101841,55.903299],[72.104687,55.902936],[72.110443,55.90227],[72.11145,55.902169],[72.112439,55.902076],[72.11518,55.901841],[72.11728,55.901689],[72.117881,55.90165],[72.12209,55.901376],[72.126311,55.901168],[72.138087,55.900686],[72.143918,55.90045],[72.149758,55.900205],[72.155057,55.899992],[72.157085,55.899895],[72.158886,55.899785],[72.160794,55.899631],[72.163661,55.899355],[72.167053,55.898968],[72.170502,55.89855],[72.173542,55.898131],[72.176453,55.89769],[72.182585,55.896761],[72.183783,55.89659],[72.185194,55.896382],[72.187808,55.895972],[72.19016,55.895617],[72.192624,55.895237],[72.19332,55.89513],[72.194056,55.895017],[72.194457,55.894956],[72.195313,55.894824],[72.21478,55.891854],[72.215518,55.891746],[72.215849,55.891625],[72.21608,55.891515],[72.216321,55.891372],[72.216579,55.891194],[72.216797,55.890969],[72.216974,55.890652],[72.217047,55.890461],[72.217073,55.890254],[72.217051,55.890035],[72.217005,55.889734],[72.216769,55.889106],[72.216592,55.888567],[72.216232,55.887471],[72.215854,55.886201],[72.215564,55.885283],[72.21541,55.884791],[72.21537,55.884661],[72.2153,55.884436],[72.215143,55.883923],[72.215083,55.883761],[72.214811,55.883004],[72.214521,55.882265],[72.213782,55.880445],[72.213499,55.879737],[72.213237,55.879101],[72.213042,55.878543],[72.212886,55.878047],[72.21284,55.877804],[72.212775,55.877423],[72.212714,55.876998],[72.212617,55.876145],[72.212588,55.875741],[72.212566,55.875362],[72.212559,55.874932],[72.212521,55.873724],[72.212486,55.872443],[72.212473,55.871993],[72.212449,55.871158],[72.212445,55.871027],[72.212441,55.870885],[72.212437,55.870683],[72.2124,55.868906],[72.212389,55.868292],[72.212382,55.867668],[72.212384,55.86731],[72.212394,55.867087],[72.212415,55.866864],[72.212459,55.866534],[72.21249,55.866332],[72.212526,55.8661],[72.212643,55.865568],[72.212732,55.865242],[72.212829,55.86494],[72.213084,55.864193],[72.213295,55.863603],[72.213534,55.863072],[72.213718,55.862694],[72.214009,55.862175],[72.214234,55.861778],[72.214707,55.861004],[72.215024,55.860493],[72.215341,55.860012],[72.2156,55.85965],[72.215912,55.859249],[72.21637,55.858703],[72.216862,55.858144],[72.217532,55.857413],[72.218294,55.85672],[72.220161,55.855095],[72.220685,55.854646],[72.221719,55.853746],[72.222463,55.853096],[72.223245,55.85237],[72.224495,55.851194],[72.225812,55.849861],[72.226346,55.849301],[72.227138,55.848459],[72.227932,55.847561],[72.22906,55.846232],[72.230262,55.844793],[72.230732,55.844231],[72.232649,55.841936],[72.23486,55.839279],[72.243695,55.828704],[72.244034,55.828304],[72.244445,55.827813],[72.247505,55.824182],[72.248736,55.82253],[72.249808,55.820847],[72.250281,55.820116],[72.251627,55.817397],[72.252239,55.815879],[72.25269,55.81439],[72.253104,55.812262],[72.253241,55.809569],[72.252935,55.806594],[72.252317,55.803625],[72.2515,55.801375],[72.249749,55.797378],[72.2489,55.795453],[72.246838,55.790772],[72.24683,55.790754],[72.243351,55.782985],[72.242806,55.781526],[72.242573,55.780517],[72.242387,55.77945],[72.242383,55.777562],[72.242582,55.776185],[72.242601,55.776051],[72.242953,55.774797],[72.243439,55.773622],[72.245149,55.770337],[72.249031,55.762901],[72.249827,55.761316],[72.250342,55.760349],[72.254775,55.751709],[72.255441,55.750173],[72.256619,55.747358],[72.2578,55.744443],[72.258904,55.741782],[72.260073,55.739465],[72.260921,55.738209],[72.261703,55.737182],[72.262155,55.736634],[72.262679,55.736056],[72.263742,55.734959],[72.264595,55.734144],[72.265452,55.733424],[72.268097,55.731366],[72.26848,55.731068],[72.273313,55.727524],[72.281094,55.72176],[72.284233,55.719435],[72.295336,55.711126],[72.310867,55.699342],[72.325917,55.687779],[72.327327,55.686726],[72.32797,55.686289],[72.328643,55.685829],[72.329275,55.685427],[72.329816,55.68507],[72.33053,55.684645],[72.331342,55.68416],[72.332829,55.683362],[72.333788,55.682867],[72.334828,55.682361],[72.335573,55.681999],[72.336358,55.681642],[72.337101,55.681326],[72.338075,55.680921],[72.338904,55.680595],[72.340376,55.680059],[72.341191,55.679782],[72.341948,55.679542],[72.342864,55.67927],[72.343852,55.679009],[72.344688,55.678818],[72.346982,55.678308],[72.348727,55.677942],[72.349467,55.677797],[72.349845,55.677723],[72.351634,55.677414],[72.353394,55.677162],[72.355086,55.676943],[72.365874,55.675685],[72.376196,55.67447],[72.386732,55.673231],[72.388153,55.673089],[72.388924,55.673012],[72.389845,55.672934],[72.393596,55.672658],[72.396798,55.672466],[72.403492,55.672141],[72.410632,55.671791],[72.416207,55.671512],[72.417261,55.67146],[72.417295,55.671458],[72.433073,55.67068],[72.434441,55.670587],[72.435502,55.670514],[72.43623,55.670449],[72.437081,55.670376],[72.438033,55.670282],[72.43887,55.670185],[72.439786,55.670083],[72.440774,55.669969],[72.44208,55.669802],[72.443613,55.669609],[72.454959,55.668151],[72.455922,55.668015],[72.457177,55.66782],[72.458107,55.667678],[72.459102,55.667503],[72.460183,55.667309],[72.460812,55.667169],[72.461807,55.666917],[72.463069,55.666588],[72.464393,55.666226],[72.465341,55.665965],[72.466171,55.665737],[72.467115,55.66542],[72.468032,55.665095],[72.46907,55.664696],[72.469954,55.664334],[72.470462,55.664106],[72.471184,55.663768],[72.47202,55.663353],[72.472946,55.662845],[72.478123,55.659728],[72.491232,55.651834],[72.503044,55.644725],[72.504422,55.643941],[72.505134,55.643535],[72.506036,55.643054],[72.507323,55.642439],[72.509115,55.641674],[72.51052,55.641051],[72.511795,55.640555],[72.512532,55.6403],[72.513009,55.640154],[72.514006,55.639821],[72.514951,55.639502],[72.516301,55.639097],[72.517306,55.638819],[72.518335,55.638556],[72.524454,55.637141],[72.530041,55.635849],[72.533424,55.635086],[72.534111,55.634931],[72.562311,55.628456],[72.590437,55.621873],[72.590767,55.621796],[72.609639,55.617382],[72.615061,55.61561],[72.619626,55.613716],[72.630819,55.608608],[72.639035,55.604909],[72.644198,55.602542],[72.646671,55.601434],[72.649126,55.600381],[72.650676,55.599725],[72.652018,55.599156],[72.653127,55.598659],[72.658872,55.595818],[72.661694,55.594436],[72.663113,55.593787],[72.664608,55.593132],[72.667562,55.591958],[72.68647,55.58477],[72.688425,55.584007],[72.690377,55.583273],[72.695322,55.581374],[72.701838,55.578944],[72.708055,55.576525],[72.711416,55.57524],[72.713661,55.574412],[72.714779,55.573986],[72.719633,55.572149],[72.727334,55.569204],[72.732006,55.567424],[72.736135,55.565834],[72.736679,55.565611],[72.737374,55.565302],[72.739653,55.564214],[72.740824,55.563635],[72.741371,55.563359],[72.741961,55.563031],[72.743167,55.56233],[72.744824,55.561227],[72.74641,55.560065],[72.748424,55.558505],[72.756656,55.551626],[72.765033,55.544766],[72.767558,55.542704],[72.768677,55.541769],[72.769754,55.540821],[72.770814,55.539875],[72.771343,55.53942],[72.771974,55.538944],[72.772797,55.538382],[72.776713,55.535708],[72.781846,55.532384],[72.788814,55.526839],[72.792517,55.524083],[72.794528,55.522647],[72.795212,55.522103],[72.795638,55.521726],[72.796024,55.521089],[72.796275,55.520068],[72.7965,55.519064],[72.797261,55.515543],[72.798697,55.509027],[72.800086,55.503056],[72.800921,55.499027],[72.802984,55.48998],[72.804641,55.482422],[72.804966,55.480938],[72.807865,55.471061],[72.810106,55.465569],[72.811081,55.463509],[72.81258,55.460633],[72.814132,55.45776],[72.817113,55.452083],[72.822537,55.440838],[72.823056,55.439466],[72.823404,55.43795],[72.824597,55.43071],[72.826535,55.420264],[72.826663,55.41953],[72.827674,55.413702],[72.828187,55.40997],[72.828202,55.409861],[72.830377,55.377393],[72.830518,55.375281],[72.831047,55.367268],[72.831855,55.355944],[72.832053,55.354747],[72.83236,55.353817],[72.837332,55.343122],[72.843168,55.330517],[72.843641,55.329328],[72.843894,55.328317],[72.843934,55.328158],[72.843948,55.326952],[72.843651,55.325083],[72.840803,55.314293],[72.839603,55.309708],[72.839424,55.308358],[72.83936,55.307012],[72.839348,55.306395],[72.839385,55.305717],[72.83955,55.304312],[72.839753,55.303401],[72.839831,55.303098],[72.840001,55.302445],[72.840281,55.301557],[72.840346,55.30135],[72.840715,55.300417],[72.842,55.297774],[72.843826,55.2941],[72.844712,55.292362],[72.845366,55.291118],[72.846634,55.288772],[72.848189,55.285788],[72.851405,55.279744],[72.85461,55.273416],[72.854617,55.273403],[72.855301,55.271953],[72.857532,55.267488],[72.858441,55.265608],[72.859153,55.263726],[72.859928,55.261355],[72.862322,55.25403],[72.863255,55.251156],[72.863877,55.249404],[72.86427,55.248513],[72.864541,55.247935],[72.864845,55.247397],[72.865558,55.246279],[72.866468,55.245172],[72.867444,55.244118],[72.868313,55.243288],[72.869236,55.242497],[72.870252,55.241753],[72.871334,55.241029],[72.872338,55.240386],[72.87343,55.239754],[72.874316,55.239281],[72.875136,55.238877],[72.876036,55.23845],[72.877015,55.238035],[72.877988,55.237639],[72.87886,55.237316],[72.878931,55.237289],[72.88224,55.236085],[72.88537,55.234981],[72.889942,55.233293],[72.896362,55.230966],[72.896596,55.230824],[72.896709,55.230726],[72.896845,55.230496],[72.896854,55.230429],[72.896881,55.230364],[72.896924,55.230302],[72.896999,55.230231],[72.897094,55.230169],[72.897208,55.230118],[72.897336,55.23008],[72.897474,55.230055],[72.897618,55.230046],[72.897719,55.230047],[72.897819,55.230057],[72.897916,55.230073],[72.898009,55.230096],[72.898096,55.230126],[72.898362,55.230116],[72.898507,55.230109],[72.898686,55.230082],[72.898945,55.230019],[72.902592,55.228729],[72.903246,55.228494],[72.907981,55.226755],[72.90891,55.226418],[72.909754,55.226119],[72.910318,55.22592],[72.911972,55.22532],[72.912641,55.225091],[72.913671,55.224714],[72.914003,55.224598],[72.91496,55.224256],[72.916328,55.223781],[72.917636,55.223346],[72.91836,55.223136],[72.919079,55.22294],[72.920643,55.222543],[72.923718,55.22176],[72.924533,55.221559],[72.925548,55.221292],[72.926384,55.221039],[72.926862,55.220869],[72.92731,55.220709],[72.927908,55.220477],[72.928602,55.220152],[72.929412,55.219742],[72.930111,55.219331],[72.930788,55.218883],[72.932102,55.217983],[72.937869,55.213999],[72.941961,55.211182],[72.946367,55.20819],[72.947507,55.20725],[72.947903,55.20685],[72.94833,55.206331],[72.948757,55.205653],[72.953033,55.197816],[72.95429,55.195622],[72.954972,55.194565],[72.955601,55.193856],[72.959799,55.190137],[72.961822,55.18837],[72.964245,55.186005],[72.965447,55.184686],[72.969731,55.179163],[72.970368,55.178405],[72.970391,55.178377],[72.970889,55.177888],[72.971313,55.177527],[72.971661,55.177252],[72.972047,55.176978],[72.972445,55.176719],[72.973176,55.176278],[72.982835,55.171267],[72.98702,55.168939],[72.996648,55.163604],[73.008834,55.15685],[73.019522,55.150841],[73.020215,55.150401],[73.020705,55.150021],[73.021163,55.149566],[73.021764,55.14884],[73.024205,55.144738],[73.027831,55.138644],[73.033287,55.129513],[73.03946,55.119149],[73.040946,55.116654],[73.04129,55.116074],[73.046753,55.106254],[73.047058,55.105539],[73.047195,55.105136],[73.047358,55.104419],[73.047396,55.103729],[73.047365,55.103329],[73.047321,55.102905],[73.0472,55.102393],[73.046696,55.101051],[73.046352,55.100013],[73.046231,55.099347],[73.046223,55.098599],[73.04629,55.098039],[73.046347,55.097787],[73.046398,55.097395],[73.046534,55.09673],[73.046554,55.096473],[73.04653,55.096236],[73.046413,55.095787],[73.046252,55.09545],[73.046076,55.095136],[73.045843,55.094861],[73.045534,55.094622],[73.0451,55.094369],[73.044447,55.094095],[73.042296,55.093493],[73.041403,55.093242],[73.039123,55.092565],[73.037398,55.092055],[73.029499,55.089512],[73.027488,55.088823],[73.025948,55.088251],[73.024011,55.087439],[73.022566,55.086764],[73.021271,55.086107],[73.019864,55.085363],[73.018798,55.084739],[73.018336,55.084449],[73.017506,55.083912],[73.016513,55.083247],[73.01547,55.082492],[73.013849,55.081232],[73.012637,55.080227],[73.011985,55.079662],[73.0114,55.079108],[73.010437,55.078123],[73.010151,55.077832],[73.010008,55.077664],[73.009569,55.077149],[73.008719,55.07604],[73.008065,55.075038],[73.007637,55.074298],[73.007285,55.073636],[73.007047,55.073086],[73.00679,55.072468],[73.006578,55.071925],[73.006384,55.071323],[73.006099,55.070228],[73.005917,55.06907],[73.005844,55.067969],[73.005822,55.067687],[73.005814,55.067395],[73.005814,55.06384],[73.00585,55.058529],[73.005834,55.056311],[73.005772,55.055702],[73.005645,55.05516],[73.005434,55.054528],[73.005103,55.053878],[73.004858,55.053458],[73.004487,55.052951],[73.004073,55.052462],[73.003577,55.051962],[73.00275,55.051199],[73.001802,55.050382],[72.999005,55.048054],[72.998187,55.047353],[72.997633,55.046896],[72.996892,55.046233],[72.995931,55.045387],[72.995396,55.044973],[72.994731,55.044496],[72.993266,55.043564],[72.992442,55.04303],[72.992045,55.04274],[72.991635,55.042426],[72.991246,55.042076],[72.990841,55.041637],[72.990467,55.041156],[72.990217,55.040847],[72.989988,55.040469],[72.989818,55.040116],[72.989709,55.039822],[72.989618,55.039552],[72.989525,55.039153],[72.989457,55.038629],[72.989461,55.038218],[72.989472,55.03808],[72.98949,55.03785],[72.989552,55.037414],[72.989691,55.036887],[72.989902,55.036289],[72.99059,55.034757],[72.990986,55.033827],[72.991257,55.033003],[72.991386,55.032377],[72.991437,55.031792],[72.991422,55.031273],[72.991354,55.030798],[72.991157,55.030181],[72.990932,55.02965],[72.990435,55.028882],[72.990114,55.028476],[72.989795,55.028125],[72.989224,55.027585],[72.988448,55.027027],[72.98777,55.026609],[72.986802,55.026107],[72.986051,55.02579],[72.985372,55.025535],[72.984547,55.025267],[72.983364,55.024972],[72.9825,55.024801],[72.981688,55.024658],[72.979356,55.024361],[72.969862,55.023356],[72.943189,55.020472],[72.938493,55.019967],[72.937267,55.019818],[72.936505,55.019695],[72.935808,55.019572],[72.934891,55.019358],[72.933855,55.019074],[72.932995,55.018759],[72.931812,55.018252],[72.931074,55.017859],[72.930523,55.017512],[72.92991,55.017078],[72.929276,55.016573],[72.928808,55.016109],[72.928446,55.015638],[72.927978,55.014875],[72.927741,55.014215],[72.927579,55.013716],[72.927498,55.013102],[72.927442,55.012439],[72.927469,55.011719],[72.927477,55.011104],[72.927499,55.010295],[72.927611,55.008244],[72.927806,55.004203],[72.927895,55.001204],[72.927825,55.000133],[72.927631,54.998904],[72.927277,54.997771],[72.9267,54.996418],[72.926061,54.995247],[72.925034,54.993827],[72.924026,54.992685],[72.922833,54.991543],[72.916476,54.985642],[72.909483,54.979089],[72.908434,54.97818],[72.902895,54.973024],[72.901609,54.971698],[72.900573,54.970536],[72.89958,54.969101],[72.899191,54.968474],[72.898808,54.967751],[72.89854,54.967213],[72.898403,54.966994],[72.898143,54.966439],[72.897759,54.965342],[72.897584,54.96444],[72.89748,54.963219],[72.897427,54.962955],[72.897398,54.962541],[72.897398,54.961459],[72.897416,54.960879],[72.897474,54.959607],[72.897538,54.958961],[72.897634,54.958346],[72.89776,54.957858],[72.898051,54.956899],[72.898641,54.955198],[72.899663,54.9523],[72.899782,54.951956],[72.900106,54.951055],[72.900288,54.95055],[72.900569,54.949736],[72.901017,54.948444],[72.903766,54.940605],[72.90569,54.935375],[72.907242,54.930716],[72.907691,54.929483],[72.90802,54.928698],[72.908335,54.928036],[72.90867,54.9274],[72.909106,54.926715],[72.91006,54.925517],[72.910805,54.924668],[72.911122,54.924306],[72.912187,54.923276],[72.913037,54.922536],[72.91406,54.921794],[72.925575,54.913869],[72.935796,54.906807],[72.940051,54.904118],[72.944639,54.901603],[72.954321,54.896167],[72.955816,54.895343],[72.961588,54.892161],[72.967904,54.888668],[72.969337,54.887946],[72.970758,54.887288],[72.972764,54.886491],[72.973841,54.886115],[72.974802,54.885815],[72.975468,54.885607],[72.976446,54.885339],[72.977344,54.885105],[72.978878,54.884748],[72.980017,54.884511],[72.98157,54.884242],[72.982757,54.884079],[72.984464,54.883876],[72.985874,54.88374],[72.986765,54.883679],[72.987593,54.883638],[72.98866,54.883597],[72.989794,54.883573],[72.991193,54.88359],[72.994536,54.883633],[72.995732,54.883655],[73.006519,54.883808],[73.013921,54.883897],[73.015778,54.883919],[73.017536,54.883957],[73.020821,54.884007],[73.022423,54.884023],[73.024016,54.884016],[73.025309,54.883983],[73.027168,54.883888],[73.027988,54.883838],[73.028777,54.883783],[73.030351,54.883658],[73.030972,54.883603],[73.031628,54.883537],[73.032356,54.883448],[73.033119,54.883346],[73.034522,54.883122],[73.035954,54.882878],[73.03758,54.8826],[73.038444,54.882453],[73.039175,54.882331],[73.042428,54.88181],[73.045401,54.881306],[73.054226,54.879828],[73.054938,54.87971],[73.066761,54.87774],[73.073753,54.876588],[73.080428,54.875468],[73.085488,54.87462],[73.089665,54.873929],[73.093568,54.87327],[73.097994,54.872532],[73.098662,54.872415],[73.099115,54.872331],[73.102205,54.871798],[73.105375,54.871278],[73.106439,54.871103],[73.108524,54.87077],[73.110771,54.87039],[73.113406,54.869954],[73.117084,54.869336],[73.119961,54.868847],[73.125724,54.867873],[73.131459,54.866902],[73.133488,54.866562],[73.13396,54.866498],[73.13451,54.866438],[73.134998,54.866401],[73.135577,54.866373],[73.136063,54.866369],[73.136603,54.866387],[73.137207,54.866434],[73.139845,54.866746],[73.141533,54.866957],[73.142403,54.867057],[73.143128,54.867136],[73.144779,54.867319],[73.146378,54.867474],[73.148149,54.867632],[73.148738,54.867679],[73.150389,54.86778],[73.151448,54.86783],[73.153329,54.867889],[73.154485,54.867913],[73.156611,54.86794],[73.164952,54.867898],[73.168717,54.867872],[73.173326,54.86783],[73.213794,54.867524],[73.213881,54.867523],[73.222453,54.867453],[73.228287,54.867402],[73.233026,54.867362],[73.237653,54.867321],[73.238857,54.867334],[73.240332,54.867376],[73.241448,54.86742],[73.24232,54.86747],[73.243319,54.86754],[73.244883,54.86768],[73.256863,54.868854],[73.261021,54.869267],[73.262105,54.869338],[73.264441,54.869575],[73.270353,54.870163],[73.271246,54.870249],[73.272559,54.870388],[73.273554,54.870489],[73.274534,54.870581],[73.275588,54.870656],[73.276438,54.87072],[73.277233,54.870727],[73.278151,54.870709],[73.279199,54.870674],[73.280672,54.870549],[73.281274,54.870491],[73.28179,54.870427],[73.282258,54.870374],[73.283038,54.870259],[73.284122,54.87006],[73.285601,54.869787],[73.286827,54.869585],[73.288313,54.869404],[73.289563,54.869284],[73.290728,54.869213],[73.292789,54.869172],[73.293321,54.869168],[73.294857,54.869161],[73.295824,54.869159],[73.295986,54.869146],[73.296171,54.869127],[73.296367,54.869105],[73.296548,54.869085],[73.296568,54.869067],[73.296621,54.869032],[73.296685,54.869005],[73.296758,54.868987],[73.296836,54.868978],[73.296916,54.868979],[73.296993,54.86899],[73.297064,54.869011],[73.297126,54.86904],[73.297382,54.869105],[73.297642,54.869142],[73.297825,54.869158],[73.29814,54.869164],[73.298747,54.869166],[73.302886,54.86916],[73.303693,54.869164],[73.306375,54.869156],[73.316133,54.869189],[73.321932,54.869185],[73.322977,54.869202],[73.32377,54.869224],[73.324457,54.869269],[73.325086,54.869336],[73.325673,54.869421],[73.3269,54.869613],[73.3281,54.869859],[73.329331,54.870165],[73.330362,54.870491],[73.331314,54.870871],[73.332307,54.871318],[73.333798,54.872143],[73.335268,54.873101],[73.337039,54.874251],[73.338251,54.875053],[73.339468,54.875672],[73.340624,54.876154],[73.342036,54.876614],[73.342079,54.876628],[73.345383,54.877625],[73.345998,54.877808],[73.34928,54.878821],[73.351354,54.87944],[73.352971,54.879915],[73.353156,54.879923],[73.353344,54.879909],[73.353564,54.879816],[73.353767,54.879766],[73.353931,54.879748],[73.354071,54.879746],[73.354312,54.879774],[73.354505,54.879827],[73.354743,54.879955],[73.354887,54.880122],[73.354925,54.880306],[73.355001,54.880414],[73.355112,54.880512],[73.355254,54.880596],[73.35542,54.880663],[73.357396,54.881204],[73.3578,54.881303],[73.358201,54.881386],[73.358647,54.881466],[73.359284,54.881555],[73.360231,54.881648],[73.36118,54.881722],[73.362211,54.881806],[73.362837,54.881856],[73.363151,54.881881],[73.363972,54.881915],[73.364782,54.881913],[73.365745,54.881887],[73.36598,54.881881],[73.367321,54.881846],[73.368441,54.881817],[73.371859,54.88172],[73.375627,54.881606],[73.380015,54.881474],[73.382287,54.881477],[73.384982,54.881591],[73.385318,54.881612],[73.387919,54.881779],[73.388823,54.881863],[73.389561,54.881933],[73.390492,54.882038],[73.391137,54.882122],[73.391691,54.882201],[73.393179,54.882434],[73.394292,54.882617],[73.395291,54.882777],[73.396112,54.882932],[73.396266,54.882961],[73.397433,54.883201],[73.398159,54.883365],[73.398736,54.883489],[73.400092,54.883822],[73.401487,54.884201],[73.402926,54.884621],[73.4039,54.884927],[73.405032,54.885315],[73.407018,54.886022],[73.407966,54.886368],[73.40904,54.88674],[73.40984,54.886999],[73.41046,54.887184],[73.411702,54.887507],[73.412652,54.887781],[73.415608,54.888523],[73.420323,54.889652],[73.42048,54.889689],[73.421712,54.889976],[73.422647,54.890193],[73.428149,54.891462],[73.429061,54.891661],[73.433305,54.892643],[73.433608,54.892713],[73.435518,54.893178],[73.437583,54.893656],[73.438216,54.893803],[73.442453,54.89478],[73.44315,54.89494],[73.444984,54.895373],[73.44612,54.895624],[73.447241,54.895883],[73.448708,54.896188],[73.450426,54.89651],[73.451166,54.896634],[73.451941,54.896764],[73.453295,54.896978],[73.454631,54.897171],[73.456472,54.897411],[73.458481,54.897637],[73.459778,54.89778],[73.461053,54.897912],[73.462701,54.898043],[73.463842,54.898116],[73.465087,54.898192],[73.466148,54.898235],[73.46745,54.898274],[73.468437,54.898293],[73.469499,54.898306],[73.470517,54.89831],[73.471598,54.898301],[73.473671,54.898262],[73.475902,54.89818],[73.477478,54.898101],[73.47837,54.898047],[73.480615,54.897857],[73.483208,54.8976],[73.485626,54.897301],[73.488754,54.896823],[73.492126,54.896222],[73.49384,54.895887],[73.495542,54.895518],[73.497758,54.894999],[73.499846,54.89447],[73.50165,54.893973],[73.502589,54.893695],[73.503831,54.893327],[73.504645,54.893071],[73.505477,54.892803],[73.507043,54.892279],[73.508544,54.891771],[73.510136,54.891224],[73.510365,54.891143],[73.511011,54.890921],[73.511602,54.890717],[73.516512,54.889012],[73.520564,54.887621],[73.522552,54.88694],[73.523608,54.886621],[73.524069,54.886487],[73.524691,54.886312],[73.525301,54.88615],[73.526146,54.885938],[73.526998,54.885734],[73.528218,54.885462],[73.529442,54.885216],[73.53062,54.885015],[73.531039,54.884948],[73.532478,54.88476],[73.533725,54.884624],[73.534666,54.884544],[73.535356,54.884497],[73.536045,54.884456],[73.536707,54.884427],[73.537151,54.884415],[73.537678,54.884409],[73.538813,54.884401],[73.539945,54.884415],[73.540504,54.884431],[73.541714,54.884471],[73.542405,54.884506],[73.543114,54.884549],[73.544012,54.884617],[73.544761,54.884684],[73.545656,54.884771],[73.546587,54.884873],[73.547508,54.884994],[73.547991,54.885069],[73.549108,54.885253],[73.550322,54.885477],[73.551232,54.88566],[73.551937,54.885815],[73.552977,54.886062],[73.553828,54.886285],[73.555677,54.88682],[73.557461,54.887358],[73.561722,54.888615],[73.565781,54.889811],[73.570026,54.891061],[73.581704,54.894526],[73.608802,54.902479],[73.614307,54.904101],[73.621342,54.906165],[73.627363,54.907936],[73.630315,54.908809],[73.633198,54.909633],[73.635412,54.910202],[73.637315,54.910663],[73.639226,54.911098],[73.641512,54.911559],[73.642799,54.911806],[73.644953,54.912173],[73.647659,54.912583],[73.649373,54.912837],[73.650678,54.913028],[73.653242,54.913402],[73.65583,54.91378],[73.657221,54.913984],[73.660263,54.914436],[73.66197,54.914688],[73.664572,54.915074],[73.66714,54.91545],[73.670812,54.915995],[73.677859,54.917049],[73.681499,54.917586],[73.684436,54.918001],[73.686465,54.918282],[73.689461,54.918678],[73.691817,54.918957],[73.695307,54.919349],[73.699055,54.919747],[73.70429,54.920293],[73.707667,54.920642],[73.714831,54.921382],[73.721135,54.922026],[73.727607,54.922752],[73.729515,54.922954],[73.731684,54.923264],[73.733969,54.923614],[73.73852,54.92437],[73.740358,54.924674],[73.742418,54.925039],[73.747021,54.925914],[73.754407,54.927479],[73.756159,54.927848],[73.765324,54.929783],[73.767107,54.930116],[73.768535,54.930355],[73.770041,54.930595],[73.770773,54.930697],[73.771447,54.930783],[73.772158,54.930859],[73.772876,54.930924],[73.774178,54.931026],[73.775359,54.931126],[73.776623,54.931202],[73.778104,54.93126],[73.779545,54.931308],[73.78083,54.931353],[73.795358,54.931793],[73.808873,54.932205],[73.832682,54.932886],[73.845876,54.933264],[73.848785,54.933339],[73.851564,54.933425],[73.854546,54.933537],[73.857055,54.93367],[73.859168,54.933823],[73.861338,54.934022],[73.863331,54.934229],[73.863725,54.934273],[73.866406,54.934588],[73.867772,54.934776],[73.869139,54.934987],[73.869504,54.93505],[73.871107,54.93533],[73.8732,54.93574],[73.875233,54.936157],[73.876254,54.936375],[73.877195,54.936594],[73.877797,54.936743],[73.878556,54.936932],[73.880354,54.937386],[73.881304,54.937634],[73.882806,54.938038],[73.885312,54.938759],[73.891271,54.940509],[73.895138,54.941629],[73.898981,54.942741],[73.911678,54.946444],[73.93139,54.952177],[73.936883,54.953792],[73.938761,54.954338],[73.942497,54.95542],[73.94624,54.956494],[73.947285,54.956777],[73.948265,54.957035],[73.949085,54.957241],[73.950039,54.957456],[73.951016,54.957669],[73.951951,54.957864],[73.953809,54.95823],[73.954946,54.95843],[73.955686,54.958554],[73.956764,54.958723],[73.957447,54.95883],[73.958063,54.95892],[73.959126,54.959066],[73.959739,54.959145],[73.960365,54.95922],[73.961304,54.959329],[73.962306,54.959434],[73.965449,54.959758],[73.968558,54.960067],[73.974851,54.960708],[73.98919,54.962171],[73.993296,54.962593],[73.993499,54.962614],[74.019765,54.965272],[74.025464,54.965854],[74.045751,54.967928],[74.046481,54.968002],[74.057957,54.969144],[74.05818,54.969166],[74.061893,54.969543],[74.064933,54.969856],[74.065552,54.96992],[74.072215,54.970606],[74.080283,54.971422],[74.084324,54.97184],[74.088371,54.972274],[74.092043,54.972693],[74.094818,54.973033],[74.096935,54.973302],[74.10139,54.973897],[74.1116,54.975288],[74.121907,54.976705],[74.123103,54.976861],[74.126769,54.977373],[74.130344,54.977854],[74.130394,54.977861],[74.134319,54.978399],[74.137311,54.978814],[74.138162,54.978923],[74.139308,54.979069],[74.140233,54.979206],[74.144827,54.97983],[74.145926,54.979992],[74.159216,54.981806],[74.1747,54.983892],[74.182498,54.984853],[74.182626,54.984869],[74.19038,54.985762],[74.204345,54.987386],[74.210231,54.98807],[74.223092,54.989565],[74.228757,54.990156],[74.236482,54.990698],[74.243091,54.99119],[74.248069,54.991289],[74.279998,54.991732],[74.31948,54.992224],[74.334045,54.992471],[74.336392,54.992553],[74.340289,54.992745],[74.351482,54.993492],[74.351667,54.993504],[74.366086,54.994489],[74.394324,54.996508],[74.40574,54.997345],[74.418271,54.998132],[74.439879,54.999725],[74.445931,55.000135],[74.450677,55.000413],[74.453074,55.000514],[74.455404,55.000599],[74.456527,55.000644],[74.457457,55.000667],[74.458484,55.000683],[74.459847,55.000687],[74.461105,55.000683],[74.465246,55.00064],[74.488161,55.000209],[74.501699,54.999954],[74.515712,54.999628],[74.515982,54.999562],[74.516213,54.999468],[74.516461,54.99927],[74.516683,54.999148],[74.517063,54.999066],[74.517371,54.999074],[74.517761,54.999186],[74.517956,54.999324],[74.518229,54.999463],[74.518447,54.99953],[74.51877,54.999558],[74.525348,54.99947],[74.531764,54.999329],[74.531827,54.999328],[74.553288,54.99887],[74.554645,54.998846],[74.556269,54.998828],[74.557082,54.998826],[74.557875,54.998837],[74.559298,54.998887],[74.560722,54.998956],[74.563443,54.999148],[74.566169,54.999361],[74.571652,54.999777],[74.584265,55.000709],[74.591839,55.001273],[74.592134,55.001256],[74.592417,55.001207],[74.592676,55.001125],[74.592846,55.001013],[74.593064,55.000933],[74.59336,55.000889],[74.593664,55.000903],[74.593943,55.000975],[74.594133,55.001073],[74.594268,55.001197],[74.594478,55.00134],[74.594745,55.001448],[74.595051,55.001513],[74.60028,55.001911],[74.601997,55.002037],[74.603306,55.002137],[74.605277,55.002289],[74.605393,55.002298],[74.607188,55.002465],[74.608475,55.002618],[74.608993,55.00268],[74.60944,55.00274],[74.610133,55.002834],[74.611304,55.00301],[74.612489,55.003229],[74.613701,55.003471],[74.616197,55.004006],[74.618889,55.00468],[74.624179,55.006083],[74.643912,55.011251],[74.650113,55.012842],[74.650749,55.013005],[74.652951,55.013611],[74.655116,55.014237],[74.660029,55.01578],[74.664891,55.017288],[74.666876,55.017912],[74.667254,55.017946],[74.667622,55.017928],[74.667997,55.017789],[74.668542,55.017752],[74.668775,55.017784],[74.668974,55.017839],[74.669205,55.017947],[74.669407,55.018119],[74.669497,55.018308],[74.669633,55.018677],[74.669941,55.018878],[74.681285,55.022437],[74.681471,55.022495],[74.713829,55.032556],[74.730261,55.037735],[74.740952,55.041114],[74.748977,55.043573],[74.753054,55.044753],[74.755232,55.0453],[74.75593,55.045468],[74.756886,55.045702],[74.757918,55.045935],[74.759911,55.046372],[74.760866,55.046548],[74.763879,55.047044],[74.765659,55.04733],[74.767445,55.047589],[74.76899,55.04779],[74.770623,55.047982],[74.771979,55.04812],[74.773403,55.048254],[74.776142,55.048539],[74.780915,55.049009],[74.782117,55.049137],[74.783492,55.049263],[74.791392,55.050056],[74.799235,55.050817],[74.802999,55.051188],[74.804614,55.051363],[74.815258,55.052425],[74.822074,55.053099],[74.825545,55.053443],[74.828826,55.053768],[74.830866,55.053977],[74.832861,55.054173],[74.83679,55.054538],[74.838304,55.054657],[74.839327,55.054733],[74.839791,55.054768],[74.842007,55.054926],[74.84523,55.055116],[74.850514,55.055373],[74.85232,55.055458],[74.85665,55.055673],[74.85853,55.055765],[74.861469,55.055908],[74.863039,55.055987],[74.863266,55.055999],[74.865483,55.056111],[74.866262,55.05615],[74.867301,55.056203],[74.869979,55.056308],[74.873456,55.056489],[74.884491,55.057018],[74.887255,55.057157],[74.888596,55.057234],[74.890114,55.057298],[74.891744,55.057374],[74.894433,55.057506],[74.896962,55.057629],[74.900256,55.057799],[74.903656,55.058014],[74.905181,55.058126],[74.906757,55.058251],[74.90952,55.058491],[74.912441,55.058791],[74.915059,55.059095],[74.916321,55.059255],[74.91771,55.059444],[74.918828,55.059595],[74.919981,55.059765],[74.921661,55.060017],[74.923437,55.060306],[74.925177,55.060608],[74.926917,55.060945],[74.928853,55.061332],[74.930873,55.06174],[74.932865,55.062164],[74.935238,55.062707],[74.936376,55.062988],[74.940565,55.064005],[74.94196,55.064336],[74.943236,55.064659],[74.944134,55.064875],[74.945161,55.065108],[74.946744,55.065502],[74.950656,55.066436],[74.95278,55.066942],[74.95683,55.067916],[74.961635,55.069067],[74.965477,55.070001],[74.971504,55.071432],[74.974812,55.072229],[74.976984,55.072746],[74.981029,55.073723],[74.984437,55.074551],[74.985967,55.074889],[74.987438,55.075201],[74.988144,55.075342],[74.989676,55.07564],[74.990652,55.075822],[74.99158,55.075986],[74.99315,55.076258],[74.993755,55.076354],[74.994426,55.076451],[74.995783,55.076631],[74.998636,55.077001],[74.999267,55.077075],[75.002318,55.077379],[75.006386,55.077809],[75.009848,55.078161],[75.01014,55.078191],[75.012325,55.078434],[75.019069,55.079126],[75.021706,55.079396],[75.022538,55.079481],[75.023428,55.079573],[75.034621,55.080734],[75.04575,55.081875],[75.055362,55.082873],[75.06042,55.083406],[75.080095,55.085475],[75.088995,55.086383],[75.093802,55.087022],[75.103844,55.08879],[75.130889,55.093615],[75.133224,55.094036],[75.150665,55.09714],[75.151823,55.09741],[75.154055,55.09773],[75.179557,55.102331],[75.181697,55.102692],[75.183899,55.103053],[75.186077,55.103367],[75.188247,55.103673],[75.190493,55.103973],[75.19275,55.104251],[75.19606,55.104664],[75.197249,55.104812],[75.206326,55.105921],[75.216277,55.107136],[75.220978,55.107712],[75.223263,55.107988],[75.225545,55.108272],[75.231369,55.108988],[75.233391,55.109225],[75.235415,55.109479],[75.236884,55.109661],[75.237318,55.109715],[75.238268,55.109832],[75.239171,55.109944],[75.240793,55.110145],[75.241012,55.110172],[75.243365,55.110456],[75.244267,55.110565],[75.245395,55.110702],[75.247031,55.110899],[75.247633,55.110972],[75.249172,55.111158],[75.250184,55.111281],[75.250922,55.11137],[75.252645,55.111584],[75.255024,55.111878],[75.255471,55.111933],[75.256382,55.112046],[75.257506,55.112182],[75.26336,55.112899],[75.267603,55.113421],[75.27238,55.114007],[75.276699,55.114534],[75.278869,55.114798],[75.279914,55.114928],[75.280999,55.115047],[75.282177,55.115158],[75.283379,55.115255],[75.284576,55.115334],[75.285764,55.115398],[75.287361,55.115448],[75.288883,55.115466],[75.29044,55.115461],[75.291194,55.115443],[75.291985,55.11542],[75.29309,55.11538],[75.294191,55.115324],[75.295251,55.115248],[75.296362,55.11516],[75.297873,55.115014],[75.29935,55.114842],[75.30038,55.114704],[75.30141,55.114556],[75.302452,55.114387],[75.303449,55.114216],[75.304309,55.114056],[75.305204,55.113872],[75.307036,55.113478],[75.308049,55.113235],[75.309091,55.112967],[75.310026,55.112709],[75.310898,55.112457],[75.312614,55.111941],[75.314285,55.111386],[75.315277,55.111064],[75.31616,55.110794],[75.317103,55.110527],[75.318414,55.110179],[75.320145,55.109788],[75.322078,55.109401],[75.323929,55.1091],[75.325808,55.108855],[75.327647,55.108659],[75.330117,55.108488],[75.33194,55.108418],[75.333713,55.108389],[75.334923,55.108397],[75.336165,55.108429],[75.337281,55.108471],[75.338402,55.108545],[75.339505,55.108632],[75.340398,55.108717],[75.342147,55.108919],[75.34386,55.109158],[75.345785,55.109482],[75.347981,55.109924],[75.352299,55.110913],[75.368454,55.11469],[75.374497,55.116106],[75.384246,55.118433],[75.389166,55.119591],[75.391163,55.120025],[75.393125,55.1204],[75.394916,55.120699],[75.396822,55.120966],[75.399037,55.121221],[75.400684,55.121357],[75.402135,55.121456],[75.402863,55.1215],[75.403971,55.12155],[75.405106,55.121582],[75.40658,55.12161],[75.406712,55.12161],[75.406923,55.121608],[75.40848,55.121577],[75.410312,55.12154],[75.413975,55.121451],[75.414295,55.121445],[75.414535,55.12144],[75.420721,55.121323],[75.4254,55.121214],[75.431136,55.121181],[75.436201,55.12124],[75.441244,55.121404],[75.454711,55.121967],[75.47273,55.122765],[75.482025,55.12318],[75.491967,55.123625],[75.497546,55.1239],[75.501242,55.12406],[75.504251,55.124191],[75.506104,55.124269],[75.508122,55.124339],[75.510349,55.124404],[75.512019,55.124437],[75.51397,55.124464],[75.517301,55.12448],[75.52064,55.12446],[75.532911,55.124339],[75.53523,55.124313],[75.543726,55.124339],[75.558617,55.124212],[75.563957,55.124185],[75.567555,55.124202],[75.570501,55.124251],[75.573466,55.124347],[75.576054,55.12444],[75.585028,55.124888],[75.600546,55.125643],[75.609781,55.126097],[75.619043,55.126568],[75.622225,55.126818],[75.624111,55.127002],[75.625737,55.127185],[75.627283,55.127367],[75.62955,55.12767],[75.633248,55.128259],[75.636751,55.128916],[75.639092,55.129442],[75.642959,55.130361],[75.64844,55.13194],[75.661037,55.136232],[75.673611,55.140501],[75.695904,55.148085],[75.700699,55.149728],[75.703808,55.150702],[75.707454,55.151711],[75.710812,55.152535],[75.712683,55.152952],[75.71431,55.153297],[75.715574,55.153546],[75.717426,55.153875],[75.720163,55.154321],[75.723876,55.154858],[75.727919,55.155466],[75.743838,55.157811],[75.744959,55.157985],[75.747623,55.158397],[75.753834,55.159299],[75.764535,55.160883],[75.775153,55.162429],[75.778733,55.162878],[75.782675,55.163227],[75.786397,55.163451],[75.792115,55.163614],[75.816775,55.163349],[75.850172,55.162954],[75.855227,55.16294],[75.858,55.162997],[75.861631,55.16316],[75.888186,55.165408],[75.891132,55.165677],[75.893301,55.165849],[75.897537,55.166223],[75.905461,55.166896],[75.906574,55.16699],[75.916912,55.167929],[75.919861,55.168112],[75.922941,55.168261],[75.928101,55.168308],[75.934431,55.168162],[75.940987,55.167792],[75.94131,55.167774],[75.955649,55.166934],[75.973046,55.165968],[75.980067,55.165898],[75.983756,55.166026],[75.987162,55.166208],[75.992554,55.166653],[75.998413,55.167462],[76.001501,55.167991],[76.004268,55.168546],[76.00964,55.169703],[76.015409,55.171365],[76.020266,55.173016],[76.027123,55.17545],[76.030588,55.17666],[76.034248,55.17777],[76.037555,55.178652],[76.037716,55.178695],[76.039615,55.179181],[76.041591,55.179682],[76.045723,55.180723],[76.046572,55.180953],[76.053397,55.18268],[76.06287,55.185089],[76.063411,55.185226],[76.063992,55.185369],[76.066779,55.186055],[76.069071,55.186633],[76.104195,55.195569],[76.109312,55.196563],[76.12453,55.199519],[76.124623,55.199537],[76.14563,55.20352],[76.148303,55.204027],[76.15123,55.204582],[76.181786,55.21041],[76.19818,55.213593],[76.208393,55.215992],[76.225659,55.220156],[76.227293,55.220555],[76.240065,55.22363],[76.249077,55.225833],[76.259463,55.228036],[76.267187,55.229113],[76.276028,55.229798],[76.283233,55.229845],[76.283581,55.229847],[76.289503,55.229651],[76.297056,55.229015],[76.30152,55.228379],[76.305725,55.227644],[76.311734,55.226421],[76.32474,55.223587],[76.345611,55.218903],[76.352393,55.217374],[76.359005,55.216139],[76.368897,55.214964],[76.381085,55.21423],[76.386039,55.214057],[76.390073,55.213962],[76.401227,55.214431],[76.411125,55.21565],[76.416039,55.216531],[76.421253,55.217706],[76.449786,55.223962],[76.449835,55.223973],[76.465199,55.227351],[76.469276,55.228158],[76.472229,55.228662],[76.475039,55.229065],[76.477666,55.229394],[76.482154,55.229815],[76.483227,55.229903],[76.485688,55.230053],[76.489995,55.230218],[76.492926,55.230241],[76.495196,55.230231],[76.50465,55.229866],[76.508513,55.229696],[76.540292,55.228307],[76.550288,55.227881],[76.578117,55.226717],[76.58115,55.22668],[76.583953,55.226698],[76.586141,55.226741],[76.589451,55.226884],[76.590712,55.226961],[76.595237,55.227319],[76.600244,55.227912],[76.601898,55.228152],[76.603826,55.228465],[76.613772,55.23019],[76.62978,55.232983],[76.663574,55.238867],[76.665546,55.239227],[76.694023,55.244186],[76.703121,55.246046],[76.736412,55.253003],[76.736595,55.253042],[76.757758,55.257504],[76.770842,55.260281],[76.805646,55.267568],[76.807464,55.26792],[76.809423,55.268277],[76.811624,55.268586],[76.81205,55.268633],[76.812766,55.268712],[76.813725,55.268818],[76.814813,55.268936],[76.815863,55.269023],[76.81676,55.269092],[76.817809,55.269153],[76.819027,55.2692],[76.820067,55.269233],[76.822095,55.269265],[76.82439,55.269239],[76.826675,55.269157],[76.835558,55.268595],[76.848862,55.267666],[76.856304,55.267159],[76.857831,55.267055],[76.875169,55.265905],[76.882465,55.265612],[76.888215,55.265661],[76.897356,55.266052],[76.909616,55.266609],[76.912977,55.266761],[76.921346,55.267128],[76.930315,55.267446],[76.93495,55.26747],[76.93907,55.267348],[76.945765,55.266932],[76.963489,55.265661],[76.977393,55.264756],[76.981364,55.264618],[76.985818,55.264513],[76.988332,55.264498],[76.988341,55.264498],[76.9928,55.264512],[77.001984,55.264707],[77.01264,55.264939],[77.031638,55.265343],[77.046444,55.265636],[77.052324,55.265587],[77.059018,55.265367],[77.066099,55.264952],[77.07524,55.264194],[77.083238,55.263311],[77.090089,55.262555],[77.102663,55.261112],[77.117641,55.259547],[77.12455,55.259132],[77.128584,55.259034],[77.134506,55.259132],[77.1403,55.25945],[77.145836,55.259988],[77.148871,55.260346],[77.160561,55.261787],[77.160584,55.26179],[77.170555,55.262995],[77.180898,55.264243],[77.188649,55.265142],[77.192462,55.265469],[77.19634,55.265736],[77.200525,55.265979],[77.204711,55.266207],[77.208038,55.266393],[77.232868,55.267666],[77.260077,55.269108],[77.281062,55.270233],[77.295224,55.270893],[77.299743,55.271016],[77.320373,55.271578],[77.339041,55.272116],[77.346861,55.272529],[77.346895,55.272531],[77.373931,55.274951],[77.390024,55.276443],[77.39968,55.277323],[77.402721,55.277608],[77.414014,55.278667],[77.432167,55.280325],[77.43221,55.280329],[77.450149,55.281991],[77.457131,55.282643],[77.458002,55.282725],[77.464397,55.283629],[77.471092,55.284924],[77.477692,55.286601],[77.481606,55.287686],[77.491252,55.290329],[77.501604,55.293165],[77.505123,55.294162],[77.52294,55.298968],[77.52423,55.29932],[77.53083,55.301125],[77.537396,55.302859],[77.542245,55.303763],[77.545807,55.304252],[77.549026,55.304545],[77.561857,55.305424],[77.573745,55.30623],[77.579796,55.307061],[77.584646,55.308087],[77.589195,55.309381],[77.601254,55.313167],[77.601838,55.313352],[77.609958,55.315923],[77.626745,55.321187],[77.631509,55.322764],[77.635844,55.324327],[77.638719,55.325547],[77.650606,55.330796],[77.656772,55.333523],[77.66082,55.335312],[77.663781,55.336581],[77.666571,55.337558],[77.669189,55.338363],[77.671978,55.339022],[77.676313,55.339779],[77.680647,55.340267],[77.685668,55.340462],[77.690174,55.34034],[77.694056,55.339941],[77.694208,55.339925],[77.697084,55.33951],[77.700431,55.338851],[77.704165,55.3379],[77.707555,55.336728],[77.710602,55.335434],[77.713349,55.334043],[77.717683,55.331333],[77.721545,55.329209],[77.726137,55.327208],[77.72817,55.326517],[77.729656,55.326011],[77.73339,55.324961],[77.737081,55.324156],[77.754633,55.32103],[77.779471,55.316646],[77.784873,55.315675],[77.788112,55.3151],[77.791626,55.314535],[77.794652,55.314085],[77.797978,55.313631],[77.802008,55.313142],[77.806244,55.312667],[77.826355,55.310366],[77.832031,55.30972],[77.851364,55.307525],[77.853553,55.307281],[77.856267,55.307023],[77.859013,55.306856],[77.863565,55.306693],[77.865578,55.306664],[77.865608,55.306664],[77.877694,55.306714],[77.88634,55.306743],[77.896039,55.306792],[77.899016,55.306798],[77.900972,55.306758],[77.902385,55.306715],[77.903651,55.306662],[77.904629,55.306607],[77.905933,55.306532],[77.907414,55.306432],[77.908742,55.306328],[77.933161,55.30413],[77.936511,55.30382],[77.939008,55.303589],[77.94002,55.303482],[77.940974,55.303376],[77.94222,55.303212],[77.943335,55.30306],[77.944332,55.302922],[77.945627,55.30273],[77.947473,55.302427],[77.948741,55.302213],[77.95019,55.30195],[77.952356,55.301521],[77.954887,55.300975],[77.955649,55.300803],[77.959658,55.299905],[77.967279,55.298193],[77.973029,55.296996],[77.975522,55.296542],[77.976119,55.296434],[77.981086,55.295738],[77.994873,55.294137],[77.997768,55.293802],[78.0001,55.293487],[78.008501,55.292348],[78.012687,55.291758],[78.016457,55.291217],[78.020053,55.290698],[78.022253,55.290374],[78.024571,55.290179],[78.029206,55.289959],[78.034441,55.290008],[78.038432,55.290252],[78.043282,55.290863],[78.047083,55.291606],[78.05371,55.293135],[78.05959,55.29465],[78.068602,55.297289],[78.074739,55.299244],[78.078344,55.300465],[78.082034,55.301442],[78.086326,55.302322],[78.090145,55.302908],[78.095081,55.303372],[78.105802,55.303757],[78.111507,55.303962],[78.1135,55.303998],[78.11519,55.303997],[78.116691,55.30397],[78.138726,55.303006],[78.158136,55.302063],[78.158608,55.30204],[78.159182,55.302013],[78.167908,55.301589],[78.180668,55.301063],[78.18143,55.301032],[78.185465,55.300865],[78.189254,55.300642],[78.189368,55.300635],[78.190181,55.300587],[78.200798,55.300102],[78.201358,55.300077],[78.201924,55.300051],[78.21799,55.299317],[78.243911,55.298095],[78.262325,55.297248],[78.264164,55.297149],[78.277857,55.296483],[78.281093,55.296356],[78.283608,55.296263],[78.288922,55.295965],[78.292972,55.295774],[78.293795,55.295744],[78.294986,55.295681],[78.295349,55.295666],[78.297945,55.295512],[78.30018,55.295405],[78.301558,55.295332],[78.303465,55.295318],[78.304225,55.295346],[78.304872,55.295386],[78.30553,55.295453],[78.306174,55.295526],[78.306776,55.295616],[78.307951,55.295843],[78.33164,55.301072],[78.348549,55.304834],[78.356945,55.306684],[78.367496,55.30901],[78.373002,55.310297],[78.385345,55.313244],[78.385982,55.313396],[78.386842,55.313606],[78.38909,55.314154],[78.39464,55.315483],[78.39906,55.316537],[78.425427,55.322839],[78.427419,55.323313],[78.429476,55.323833],[78.432086,55.324543],[78.43335,55.324908],[78.435673,55.325639],[78.439309,55.326877],[78.447273,55.329598],[78.450253,55.330599],[78.452778,55.331476],[78.460934,55.334271],[78.473689,55.338554],[78.478872,55.340282],[78.479435,55.340463],[78.484197,55.341992],[78.488306,55.34332],[78.490413,55.343957],[78.492401,55.344485],[78.496571,55.34535],[78.498481,55.345678],[78.500007,55.345918],[78.501478,55.346108],[78.502948,55.346256],[78.504832,55.346416],[78.506217,55.34651],[78.507526,55.34656],[78.509589,55.346606],[78.512136,55.34664],[78.520291,55.34659],[78.524378,55.346582],[78.52845,55.346632],[78.532913,55.346925],[78.53837,55.347629],[78.539742,55.347872],[78.542262,55.348371],[78.543814,55.348731],[78.548819,55.34983],[78.551544,55.350373],[78.554261,55.350822],[78.5554,55.350972],[78.556545,55.351103],[78.557605,55.351212],[78.558573,55.351292],[78.559993,55.351409],[78.561135,55.351483],[78.563887,55.351597],[78.565082,55.351625],[78.566371,55.35163],[78.567641,55.351604],[78.568509,55.351573],[78.570044,55.35151],[78.571726,55.351405],[78.57264,55.351334],[78.573441,55.351251],[78.574937,55.351102],[78.575003,55.351095],[78.576604,55.350908],[78.577571,55.350774],[78.578127,55.35069],[78.579699,55.350438],[78.58061,55.350266],[78.581804,55.350043],[78.583186,55.349738],[78.586959,55.348795],[78.592206,55.347537],[78.609653,55.343239],[78.636784,55.33651],[78.6541,55.332284],[78.655492,55.331968],[78.657936,55.33149],[78.659206,55.331278],[78.660237,55.331146],[78.661639,55.330961],[78.663559,55.330742],[78.665789,55.330548],[78.667935,55.330411],[78.670649,55.330334],[78.67268,55.330338],[78.674299,55.330375],[78.675508,55.330431],[78.681098,55.3308],[78.692558,55.331549],[78.714209,55.333003],[78.718428,55.333276],[78.723671,55.333447],[78.728735,55.333313],[78.730254,55.333211],[78.73351,55.332899],[78.73625,55.332539],[78.740576,55.33174],[78.743984,55.330969],[78.744143,55.330933],[78.778264,55.32284],[78.789547,55.320171],[78.828257,55.311038],[78.838266,55.308666],[78.846176,55.306794],[78.849869,55.305887],[78.852771,55.305283],[78.854993,55.304883],[78.857009,55.304596],[78.859292,55.304319],[78.862354,55.304072],[78.864821,55.303954],[78.867754,55.303907],[78.869877,55.303941],[78.872021,55.303998],[78.872202,55.304003],[78.927614,55.308427],[78.95829,55.310843],[78.97651,55.312296],[78.979438,55.312535],[78.982136,55.312785],[79.002967,55.314822],[79.009546,55.315476],[79.010179,55.315532],[79.043583,55.318785],[79.047617,55.319115],[79.050852,55.319215],[79.054232,55.319261],[79.056288,55.319232],[79.057927,55.319163],[79.106733,55.31722],[79.108716,55.317198],[79.110246,55.317231],[79.111737,55.317329],[79.114321,55.317554],[79.116516,55.317797],[79.118391,55.318134],[79.120353,55.318556],[79.122441,55.319117],[79.124353,55.319699],[79.126511,55.320495],[79.128495,55.321385],[79.130636,55.322497],[79.132351,55.323576],[79.132389,55.323602],[79.133605,55.324457],[79.135095,55.325718],[79.136326,55.326992],[79.137659,55.328575],[79.141325,55.333059],[79.141882,55.333753],[79.142872,55.33497],[79.144675,55.337073],[79.14654,55.339005],[79.148345,55.340614],[79.150192,55.342098],[79.153228,55.344196],[79.155899,55.345826],[79.157806,55.346876],[79.162559,55.349197],[79.166105,55.350661],[79.168105,55.351415],[79.170893,55.352244],[79.175819,55.353529],[79.17601,55.353578],[79.17909,55.354294],[79.181965,55.354782],[79.188074,55.35566],[79.190852,55.355957],[79.193722,55.356207],[79.195869,55.356343],[79.199148,55.356425],[79.202371,55.356407],[79.204676,55.356354],[79.207543,55.356205],[79.209891,55.356051],[79.212322,55.355792],[79.214407,55.355538],[79.216373,55.355279],[79.222824,55.354304],[79.235714,55.352364],[79.262671,55.348294],[79.281332,55.345448],[79.296427,55.343172],[79.298989,55.34285],[79.301486,55.342644],[79.303997,55.342498],[79.306177,55.342408],[79.308699,55.342415],[79.312609,55.342511],[79.336803,55.343362],[79.338142,55.343408],[79.339199,55.343445],[79.344294,55.343618],[79.34703,55.343639],[79.349626,55.343597],[79.352543,55.343486],[79.354399,55.343313],[79.356802,55.343029],[79.358941,55.342733],[79.360865,55.342428],[79.362605,55.342098],[79.364192,55.341767],[79.365895,55.341346],[79.369148,55.340457],[79.375341,55.338725],[79.390276,55.334502],[79.391919,55.334063],[79.393918,55.333573],[79.395653,55.333226],[79.397788,55.332859],[79.400237,55.332498],[79.402583,55.332189],[79.413961,55.330889],[79.450576,55.326666],[79.456023,55.32605],[79.457983,55.325802],[79.459803,55.325638],[79.461654,55.325535],[79.472588,55.325202],[79.490756,55.324722],[79.508894,55.324274],[79.523905,55.323807],[79.532728,55.323571],[79.536047,55.323494],[79.540609,55.323356],[79.553745,55.323033],[79.560153,55.322632],[79.567835,55.322094],[79.575804,55.321564],[79.579158,55.321341],[79.584606,55.320925],[79.587918,55.320733],[79.590556,55.320593],[79.592395,55.320541],[79.594352,55.32052],[79.596109,55.32053],[79.597531,55.320538],[79.598957,55.32057],[79.599886,55.320605],[79.600802,55.320619],[79.601526,55.320646],[79.60411,55.320783],[79.607526,55.321098],[79.610461,55.321409],[79.611726,55.32155],[79.613108,55.321741],[79.615288,55.322048],[79.618477,55.322561],[79.621884,55.323231],[79.625119,55.323942],[79.626398,55.324257],[79.634274,55.326307],[79.637794,55.327241],[79.645646,55.329325],[79.664362,55.334278],[79.665414,55.334556],[79.666688,55.334873],[79.66775,55.335156],[79.681807,55.338886],[79.685847,55.33997],[79.687933,55.340472],[79.689985,55.340938],[79.691047,55.341152],[79.692094,55.34134],[79.693122,55.341507],[79.69424,55.341679],[79.695746,55.341851],[79.697645,55.342071],[79.700983,55.34236],[79.702853,55.342456],[79.704761,55.342504],[79.706234,55.342488],[79.70768,55.342453],[79.70965,55.342345],[79.71159,55.342218],[79.713501,55.342073],[79.714872,55.341948],[79.715902,55.34182],[79.716965,55.341675],[79.718558,55.34146],[79.720103,55.341195],[79.722203,55.340789],[79.7295,55.339299],[79.733136,55.338559],[79.734923,55.338149],[79.736653,55.33771],[79.738503,55.337189],[79.740263,55.336625],[79.741928,55.336081],[79.743543,55.335504],[79.744922,55.334976],[79.746378,55.334353],[79.747873,55.333665],[79.749346,55.332928],[79.755192,55.329863],[79.773973,55.31997],[79.782879,55.315267],[79.785368,55.313952],[79.787872,55.312629],[79.793115,55.30986],[79.793128,55.309853],[79.806567,55.302709],[79.81222,55.299704],[79.82016,55.295514],[79.824071,55.293421],[79.826084,55.292374],[79.82713,55.291871],[79.82817,55.291395],[79.829356,55.290904],[79.830528,55.290424],[79.832074,55.289841],[79.833653,55.289303],[79.83534,55.288774],[79.837035,55.288289],[79.838296,55.287965],[79.839404,55.287708],[79.841721,55.287204],[79.843402,55.286887],[79.845093,55.286606],[79.853285,55.285558],[79.861572,55.284456],[79.863548,55.284219],[79.865095,55.284058],[79.867083,55.283903],[79.868816,55.2838],[79.882977,55.282922],[79.892822,55.282312],[79.904848,55.281592],[79.910671,55.281238],[79.916718,55.280827],[79.920093,55.280624],[79.923404,55.280371],[79.926592,55.280004],[79.929701,55.279654],[79.951887,55.277145],[79.952219,55.277107],[79.959416,55.276297],[79.963661,55.275828],[79.965443,55.275627],[79.969218,55.27518],[79.971382,55.274899],[79.973544,55.274597],[79.975433,55.274259],[79.977728,55.27385],[80.003847,55.268963],[80.004137,55.268909],[80.00767,55.268241],[80.019329,55.266072],[80.022267,55.265518],[80.046572,55.260932],[80.059918,55.258399],[80.063172,55.257764],[80.066295,55.257115],[80.073077,55.25563],[80.096267,55.250455],[80.107829,55.247882],[80.119203,55.245359],[80.124943,55.244083],[80.130506,55.242827],[80.135065,55.24185],[80.135865,55.241696],[80.13681,55.241542],[80.137713,55.241403],[80.139238,55.241182],[80.141257,55.240911],[80.141462,55.240886],[80.142456,55.240792],[80.145647,55.240536],[80.148529,55.240444],[80.150997,55.24044],[80.151423,55.240439],[80.182493,55.240145],[80.202683,55.239905],[80.222862,55.239708],[80.226318,55.239752],[80.228073,55.239807],[80.229771,55.239867],[80.230975,55.239922],[80.231669,55.239954],[80.232336,55.240002],[80.233014,55.240056],[80.233698,55.240119],[80.236249,55.240427],[80.238112,55.240683],[80.24048,55.241048],[80.242844,55.241435],[80.247553,55.242249],[80.251266,55.242935],[80.253158,55.243256],[80.25502,55.243521],[80.258001,55.243852],[80.259623,55.244002],[80.260852,55.244091],[80.262256,55.244153],[80.263685,55.244192],[80.266521,55.244203],[80.268135,55.244175],[80.269733,55.244103],[80.272912,55.24385],[80.277043,55.243305],[80.279182,55.242911],[80.281284,55.242445],[80.284074,55.241782],[80.286793,55.241005],[80.288428,55.2405],[80.290497,55.239792],[80.292614,55.238971],[80.295251,55.237791],[80.297709,55.23654],[80.313666,55.227524],[80.314438,55.227088],[80.315007,55.226768],[80.324212,55.22161],[80.333912,55.216048],[80.334312,55.215836],[80.33497,55.215466],[80.339452,55.212981],[80.340656,55.212284],[80.347001,55.208892],[80.352863,55.20577],[80.354043,55.205141],[80.356171,55.204039],[80.378531,55.192257],[80.39501,55.183584],[80.401018,55.181232],[80.408485,55.179174],[80.408504,55.17917],[80.41312,55.178243],[80.454182,55.172271],[80.459942,55.171427],[80.464426,55.17077],[80.476754,55.169007],[80.494388,55.16646],[80.500026,55.165645],[80.502405,55.165289],[80.507465,55.164603],[80.507609,55.164583],[80.50968,55.16437],[80.511916,55.164223],[80.513745,55.164139],[80.515585,55.1641],[80.517651,55.16408],[80.521653,55.164223],[80.537661,55.16486],[80.579457,55.166451],[80.603539,55.167402],[80.6043,55.167421],[80.606057,55.167447],[80.608557,55.167461],[80.609752,55.167469],[80.610618,55.167465],[80.61232,55.167432],[80.612997,55.167413],[80.614345,55.167362],[80.615461,55.167305],[80.617895,55.16715],[80.620186,55.166975],[80.622536,55.166758],[80.623668,55.166628],[80.626087,55.166318],[80.627857,55.166078],[80.630477,55.165683],[80.633,55.165249],[80.634223,55.165009],[80.635763,55.164676],[80.642803,55.163095],[80.663317,55.158339],[80.673299,55.156009],[80.67587,55.155395],[80.677005,55.155095],[80.678067,55.154789],[80.678665,55.154625],[80.679773,55.154293],[80.680783,55.15397],[80.68142,55.153766],[80.684143,55.152883],[80.685597,55.152377],[80.686767,55.151935],[80.687577,55.151634],[80.693671,55.149275],[80.696637,55.148115],[80.699458,55.147063],[80.70157,55.146297],[80.703983,55.145463],[80.708767,55.143863],[80.713669,55.142222],[80.716311,55.141348],[80.718228,55.140707],[80.719609,55.140249],[80.734337,55.135348],[80.742438,55.132657],[80.746696,55.131242],[80.749122,55.130434],[80.750755,55.12989],[80.751435,55.129669],[80.752007,55.129494],[80.75275,55.129289],[80.754478,55.128828],[80.756175,55.128396],[80.757151,55.128171],[80.757939,55.127997],[80.758749,55.127829],[80.759505,55.127685],[80.760779,55.127472],[80.762197,55.12725],[80.764014,55.127029],[80.765946,55.126813],[80.7674,55.126669],[80.768489,55.126581],[80.769632,55.126522],[80.770846,55.126486],[80.773337,55.126437],[80.774858,55.12644],[80.776122,55.126466],[80.779327,55.126612],[80.787379,55.127021],[80.789753,55.127137],[80.799333,55.127582],[80.808917,55.128049],[80.815077,55.128363],[80.817783,55.128503],[80.820581,55.128601],[80.823886,55.12863],[80.827488,55.128592],[80.8296,55.128525],[80.830542,55.128475],[80.831784,55.128401],[80.835851,55.128098],[80.83987,55.12768],[80.84245,55.127357],[80.850715,55.126095],[80.889369,55.120152],[80.889566,55.120122],[80.897736,55.118902],[80.899108,55.118721],[80.901386,55.118475],[80.903295,55.118336],[80.904765,55.118255],[80.907063,55.118181],[80.90883,55.118172],[80.910797,55.118201],[80.911555,55.118229],[80.912534,55.118266],[80.9142,55.118355],[80.928104,55.119385],[80.941923,55.120514],[80.948103,55.120711],[80.952137,55.120662],[80.962333,55.120398],[80.964471,55.120371],[80.965171,55.120384],[80.965867,55.120415],[80.96641,55.120467],[80.967213,55.120561],[80.96753,55.120609],[80.967943,55.120671],[80.968521,55.120768],[80.96952,55.120969],[80.970511,55.1212],[80.971141,55.121378],[80.971267,55.121413],[80.972011,55.121645],[80.972512,55.121805],[80.972571,55.121828],[80.972913,55.121961],[80.973228,55.122096],[80.973583,55.122259],[80.973932,55.122419],[80.974116,55.122515],[80.9746,55.122822],[80.975292,55.123213],[80.976579,55.124024],[80.977533,55.124622],[80.980414,55.126234],[80.983279,55.127766],[80.985921,55.129045],[80.988358,55.130133],[80.992031,55.131652],[80.993814,55.132317],[80.99658,55.133302],[80.998829,55.134054],[81.001098,55.134765],[81.006474,55.136338],[81.013479,55.138322],[81.015429,55.138823],[81.016694,55.139103],[81.018785,55.139499],[81.020777,55.139846],[81.022344,55.140082],[81.02416,55.140321],[81.025802,55.140508],[81.026894,55.140595],[81.028136,55.140655],[81.030184,55.140709],[81.032987,55.140776],[81.034702,55.140763],[81.036469,55.140708],[81.036534,55.140706],[81.038299,55.140638],[81.039425,55.140569],[81.04073,55.140445],[81.042144,55.140292],[81.045036,55.139913],[81.048025,55.139415],[81.051852,55.138712],[81.055536,55.138054],[81.061156,55.137174],[81.063263,55.136882],[81.065355,55.136621],[81.069432,55.1361],[81.073026,55.13559],[81.07404,55.135413],[81.074841,55.135254],[81.076415,55.13491],[81.07791,55.134558],[81.079187,55.134251],[81.080336,55.133952],[81.082154,55.133436],[81.085337,55.132429],[81.086351,55.132079],[81.087292,55.131733],[81.089196,55.130948],[81.090315,55.130472],[81.090875,55.130234],[81.091967,55.129755],[81.092852,55.129313],[81.093384,55.129007],[81.096599,55.127034],[81.098223,55.126105],[81.100258,55.125115],[81.101823,55.12435],[81.103144,55.123762],[81.105429,55.122856],[81.107624,55.122159],[81.109072,55.121736],[81.110385,55.121382],[81.112843,55.120787],[81.114469,55.120485],[81.116228,55.120178],[81.130628,55.11786],[81.133257,55.117469],[81.137186,55.116916],[81.141881,55.116312],[81.144565,55.116009],[81.150256,55.115483],[81.162707,55.114438],[81.175181,55.113372],[81.177027,55.113182],[81.178429,55.113021],[81.180282,55.112772],[81.183889,55.112198],[81.18567,55.111899],[81.18655,55.111752],[81.18778,55.11152],[81.192546,55.110558],[81.200387,55.109017],[81.205277,55.108024],[81.209096,55.107212],[81.209163,55.107198],[81.212052,55.106625],[81.214791,55.106134],[81.21628,55.105908],[81.217526,55.105761],[81.219496,55.105547],[81.22053,55.105448],[81.221551,55.105365],[81.222314,55.105316],[81.223116,55.105285],[81.224658,55.105218],[81.225986,55.105189],[81.227352,55.105187],[81.228995,55.105231],[81.230218,55.105294],[81.231246,55.105356],[81.232022,55.105423],[81.233348,55.105547],[81.237241,55.106002],[81.249801,55.107601],[81.275766,55.110824],[81.280456,55.111402],[81.289463,55.112569],[81.296503,55.113495],[81.298909,55.113742],[81.303728,55.114009],[81.305601,55.114035],[81.30706,55.114013],[81.308433,55.113971],[81.310245,55.113867],[81.336508,55.111645],[81.344116,55.110998],[81.348232,55.110656],[81.352083,55.110284],[81.354664,55.110014],[81.357545,55.109658],[81.36094,55.109217],[81.364888,55.108647],[81.367419,55.108249],[81.377331,55.106473],[81.382428,55.105528],[81.382447,55.105524],[81.387211,55.104655],[81.396564,55.102918],[81.400566,55.102206],[81.40467,55.101448],[81.406483,55.101089],[81.408649,55.100593],[81.410354,55.100188],[81.413689,55.099319],[81.416331,55.098548],[81.418133,55.098],[81.420029,55.097343],[81.423039,55.096254],[81.42506,55.095491],[81.428338,55.094252],[81.428807,55.094075],[81.433434,55.092292],[81.435513,55.091486],[81.438548,55.090263],[81.438961,55.0901],[81.446807,55.086952],[81.44768,55.086602],[81.448556,55.086259],[81.449537,55.085902],[81.450696,55.085514],[81.452231,55.085011],[81.454397,55.084343],[81.456467,55.083789],[81.458464,55.083277],[81.460391,55.082871],[81.462237,55.082504],[81.464441,55.082145],[81.465813,55.081926],[81.467314,55.081739],[81.468957,55.08153],[81.471214,55.08131],[81.473107,55.081164],[81.476609,55.080973],[81.480217,55.080867],[81.483012,55.080821],[81.485384,55.080836],[81.487808,55.080883],[81.49157,55.081038],[81.49337,55.081118],[81.495342,55.081268],[81.50019,55.081738],[81.509557,55.082803],[81.517522,55.08374],[81.523436,55.084425],[81.525294,55.084654],[81.52777,55.084975],[81.528993,55.08516],[81.532104,55.085653],[81.535494,55.08629],[81.538923,55.086974],[81.541336,55.087505],[81.542528,55.08778],[81.54346,55.088013],[81.544554,55.088325],[81.545411,55.08858],[81.548515,55.089576],[81.550011,55.090056],[81.557943,55.09284],[81.561619,55.094055],[81.566015,55.095433],[81.570464,55.096761],[81.574896,55.098003],[81.58035,55.099408],[81.583549,55.100142],[81.585809,55.100605],[81.588015,55.100999],[81.590552,55.101361],[81.592267,55.101564],[81.594049,55.101766],[81.596108,55.10194],[81.599806,55.102123],[81.601901,55.102193],[81.603389,55.102193],[81.605294,55.102152],[81.607636,55.102065],[81.612055,55.101792],[81.615183,55.101609],[81.622195,55.101045],[81.624229,55.100897],[81.627766,55.100657],[81.630966,55.100567],[81.633787,55.100618],[81.635861,55.100728],[81.643419,55.10109],[81.650931,55.101623],[81.654701,55.101991],[81.658202,55.102379],[81.699522,55.107619],[81.701478,55.107772],[81.703973,55.107849],[81.706647,55.107808],[81.709156,55.107612],[81.710928,55.107421],[81.713393,55.107048],[81.731068,55.104123],[81.759073,55.099512],[81.768815,55.097908],[81.806518,55.091672],[81.820937,55.089216],[81.824582,55.088736],[81.828083,55.088409],[81.83158,55.088234],[81.833775,55.088175],[81.84895,55.087645],[81.89973,55.085876],[81.918275,55.084902],[81.918441,55.084893],[81.931258,55.084137],[81.932999,55.083839],[81.947558,55.082807],[81.951188,55.082505],[81.951978,55.082439],[81.956752,55.082064],[81.962675,55.081665],[81.969927,55.081094],[81.98071,55.080283],[81.984529,55.080007],[81.986879,55.079804],[81.995441,55.079196],[82.01103,55.077968],[82.024054,55.076967],[82.037315,55.075953],[82.040083,55.075714],[82.042111,55.075579],[82.043519,55.075508],[82.045394,55.075413],[82.048634,55.075278],[82.049773,55.075233],[82.051767,55.075155],[82.053409,55.075136],[82.05578,55.075106],[82.057443,55.075106],[82.058966,55.075136],[82.06241,55.07521],[82.066444,55.075308],[82.069652,55.075431],[82.07183,55.075542],[82.0764,55.075806],[82.079619,55.075978],[82.083278,55.076089],[82.087129,55.076162],[82.090053,55.076173],[82.091995,55.076181],[82.096828,55.076199],[82.101313,55.076082],[82.104918,55.075929],[82.110894,55.075597],[82.115936,55.075204],[82.121183,55.074737],[82.132308,55.073748],[82.140285,55.073062],[82.143244,55.072808],[82.145231,55.07263],[82.1465,55.072549],[82.147589,55.072489],[82.149072,55.072423],[82.150429,55.072395],[82.151843,55.072389],[82.15316,55.072405],[82.154437,55.072435],[82.155732,55.072474],[82.157584,55.072521],[82.159659,55.072572],[82.160976,55.072601],[82.163041,55.07266],[82.164342,55.072676],[82.165514,55.072663],[82.166606,55.072636],[82.16774,55.072592],[82.169224,55.072507],[82.170441,55.072411],[82.171442,55.07232],[82.172743,55.072177],[82.173864,55.07203],[82.17495,55.071873],[82.17638,55.071644],[82.178161,55.071294],[82.179408,55.071029],[82.180792,55.070697],[82.182002,55.070404],[82.184593,55.069769],[82.187371,55.069092],[82.190464,55.068336],[82.19409,55.067452],[82.19754,55.066609],[82.200485,55.065894],[82.20343,55.065168],[82.206624,55.064394],[82.2095,55.063684],[82.210318,55.063485],[82.211187,55.063274],[82.213429,55.062727],[82.214751,55.062405],[82.215751,55.062161],[82.2162,55.062051],[82.218984,55.061371],[82.220111,55.061096],[82.221025,55.060873],[82.225386,55.059809],[82.226399,55.05956],[82.230075,55.058658],[82.231258,55.058371],[82.231872,55.058212],[82.233135,55.057885],[82.23398,55.057652],[82.234997,55.057349],[82.236287,55.05694],[82.237443,55.056546],[82.23854,55.056149],[82.239945,55.055604],[82.241029,55.055157],[82.242349,55.054568],[82.243279,55.054126],[82.243945,55.053785],[82.244331,55.053594],[82.245176,55.053146],[82.246141,55.052613],[82.247423,55.051847],[82.248794,55.050959],[82.24966,55.050352],[82.250285,55.049891],[82.251063,55.049308],[82.252281,55.04839],[82.254049,55.047084],[82.255384,55.046116],[82.256106,55.045635],[82.257047,55.045051],[82.257793,55.044627],[82.258809,55.044097],[82.259501,55.04374],[82.260631,55.043227],[82.261586,55.042814],[82.262379,55.0425],[82.263144,55.042217],[82.263959,55.041934],[82.264914,55.041622],[82.265866,55.041334],[82.26677,55.041083],[82.267629,55.04086],[82.268889,55.040573],[82.269919,55.040355],[82.271341,55.040095],[82.272609,55.03989],[82.273714,55.039743],[82.275064,55.039592],[82.276029,55.039506],[82.277083,55.039432],[82.277985,55.039382],[82.278923,55.03934],[82.27969,55.039325],[82.281018,55.03932],[82.282118,55.039332],[82.283373,55.03938],[82.284406,55.039437],[82.285294,55.039502],[82.28627,55.039586],[82.286752,55.039644],[82.289527,55.039977],[82.293642,55.040471],[82.297177,55.040899],[82.299189,55.041152],[82.301018,55.041374],[82.304089,55.041692],[82.305492,55.04181],[82.306868,55.041904],[82.308416,55.041976],[82.309155,55.041989],[82.309896,55.041991],[82.319624,55.041904],[82.328652,55.041811],[82.34339,55.04163],[82.347874,55.041614],[82.36369,55.041434],[82.369139,55.041363],[82.373803,55.041299],[82.376165,55.041261],[82.379603,55.041193],[82.381236,55.041154],[82.383069,55.041127],[82.386519,55.04108],[82.388999,55.04105],[82.390822,55.04108],[82.392019,55.041118],[82.393429,55.041186],[82.394602,55.041255],[82.395919,55.041357],[82.396916,55.041453],[82.398212,55.041595],[82.399122,55.041706],[82.39999,55.041822],[82.400702,55.041922],[82.401606,55.042067],[82.402654,55.042246],[82.403624,55.04242],[82.404665,55.042626],[82.40595,55.042904],[82.407179,55.043195],[82.408351,55.04349],[82.409641,55.043835],[82.410937,55.044209],[82.412446,55.044691],[82.41246,55.044696],[82.448625,55.057482],[82.467276,55.064036],[82.468956,55.064626],[82.469943,55.064973],[82.477875,55.067752],[82.478459,55.067956],[82.479097,55.06818],[82.479914,55.068474],[82.480502,55.068686],[82.481039,55.068879],[82.484164,55.06998],[82.486882,55.070803],[82.489193,55.071382],[82.490552,55.071676],[82.492435,55.072023],[82.495686,55.072591],[82.499099,55.073154],[82.51045,55.075043],[82.511168,55.075162],[82.512201,55.075332],[82.52519,55.077477],[82.526821,55.07784],[82.529608,55.07846],[82.533838,55.079857],[82.536015,55.080868],[82.53755,55.081581],[82.541642,55.0843],[82.543401,55.086035],[82.544408,55.087027],[82.545916,55.08926],[82.549195,55.095884],[82.550123,55.097758],[82.550877,55.099282],[82.55106,55.09965],[82.552547,55.102654],[82.554611,55.106068],[82.557152,55.109284],[82.55993,55.112159],[82.560497,55.112745],[82.561105,55.113375],[82.561375,55.113646],[82.561789,55.114061],[82.562679,55.114954],[82.564203,55.116496],[82.565252,55.117558],[82.565799,55.118112],[82.566263,55.118581],[82.570813,55.12313],[82.572178,55.124442],[82.573627,55.125689],[82.575518,55.127039],[82.577451,55.128223],[82.579641,55.129414],[82.581664,55.130335],[82.583739,55.131173],[82.587201,55.132331],[82.588799,55.132775],[82.591313,55.133392],[82.592155,55.133572],[82.601203,55.135437],[82.602408,55.13569],[82.615843,55.138468],[82.618783,55.139111],[82.620897,55.139689],[82.622691,55.14021],[82.635549,55.144128],[82.656373,55.150472],[82.66391,55.152807],[82.689601,55.16077],[82.693119,55.161803],[82.702853,55.164661],[82.7058,55.165564],[82.707952,55.166204],[82.709061,55.166531],[82.711259,55.16724],[82.713862,55.168053],[82.732598,55.173855],[82.732675,55.173879],[82.740829,55.176389],[82.744491,55.177516],[82.744496,55.177518],[82.757777,55.181691],[82.758462,55.181891],[82.761028,55.182737],[82.77088,55.185832],[82.776515,55.187289],[82.777901,55.187578],[82.780176,55.188036],[82.783149,55.188525],[82.78573,55.188908],[82.787497,55.189114],[82.78877,55.189267],[82.793655,55.189652],[82.798972,55.189789],[82.811485,55.189845],[82.811553,55.189845],[82.815556,55.189805],[82.81835,55.189801],[82.822344,55.189804],[82.826116,55.189809],[82.843599,55.1898],[82.848674,55.189835],[82.851814,55.189835],[82.855195,55.189776],[82.85919,55.189554],[82.868059,55.188611],[82.870531,55.18834],[82.884771,55.186758],[82.886896,55.186528],[82.887172,55.186497],[82.88987,55.186182],[82.890046,55.186155],[82.890568,55.186076],[82.891465,55.185929],[82.893165,55.185588],[82.894903,55.185132],[82.895707,55.18491],[82.896515,55.184643],[82.897684,55.184162],[82.898678,55.18375],[82.899345,55.183463],[82.900734,55.1828],[82.902022,55.182045],[82.903381,55.181057],[82.904571,55.18003],[82.906517,55.178047],[82.906562,55.178002],[82.907781,55.176713],[82.909884,55.174527],[82.922292,55.16175],[82.922364,55.161676],[82.922719,55.161308],[82.923522,55.160542],[82.924168,55.159843],[82.924603,55.159355],[82.92494,55.159005],[82.926109,55.157822],[82.926524,55.15746],[82.929836,55.154034],[82.93048,55.15337],[82.937041,55.146648],[82.940608,55.142957],[82.942545,55.140958],[82.942802,55.140704],[82.947775,55.135589],[82.948802,55.13451],[82.950093,55.133292],[82.951445,55.131976],[82.951847,55.131668],[82.952299,55.131374],[82.952732,55.131109],[82.953238,55.130849],[82.954223,55.130434],[82.954968,55.130193],[82.955909,55.129945],[82.956665,55.129806],[82.957416,55.129704],[82.958817,55.129582],[82.959298,55.129548],[82.959842,55.129529],[82.960454,55.129534],[82.961091,55.129553],[82.961913,55.129617],[82.962597,55.129704],[82.963174,55.129808],[82.964107,55.130032],[82.96548,55.130428],[82.9663,55.130759],[82.967066,55.131068],[82.967173,55.131109],[82.968311,55.131525],[82.969857,55.132026],[82.971207,55.132263],[82.972892,55.13256],[82.973333,55.132637],[82.973604,55.132687],[82.974463,55.132854],[82.97504,55.132971],[82.97574,55.133124],[82.976297,55.133245],[82.978648,55.133789],[82.979151,55.13392],[82.979844,55.1341],[82.981148,55.13449],[82.982616,55.13488],[82.98314,55.134982],[82.985179,55.135407],[82.987131,55.135761],[82.98944,55.136087],[82.991989,55.136391],[82.994893,55.136622],[82.99681,55.1367],[82.998829,55.136769],[83.000818,55.136827],[83.002514,55.136872],[83.003095,55.136895],[83.004456,55.136995],[83.006071,55.137153],[83.007487,55.137331],[83.008727,55.137521],[83.010216,55.137776],[83.011646,55.138071],[83.013292,55.138447],[83.015444,55.139054],[83.017416,55.139702],[83.020031,55.140742],[83.021382,55.141388],[83.022516,55.141962],[83.023223,55.142355],[83.024677,55.143204],[83.025677,55.143796],[83.026811,55.144424],[83.029994,55.146089],[83.032763,55.14738],[83.033974,55.147926],[83.036243,55.148885],[83.04097,55.150683],[83.04332,55.151458],[83.044952,55.151967],[83.046086,55.15233],[83.046992,55.15262],[83.049258,55.153412],[83.050674,55.153999],[83.052089,55.154661],[83.054242,55.155834],[83.055863,55.156937],[83.0573,55.158113],[83.057888,55.158652],[83.058786,55.15961],[83.06128,55.162705],[83.063963,55.166063],[83.065631,55.167747],[83.066489,55.168467],[83.067007,55.168873],[83.067833,55.169446],[83.068924,55.170151],[83.07143,55.171525],[83.07235,55.171992],[83.076587,55.173935],[83.078309,55.174678],[83.080006,55.175298],[83.082304,55.176025],[83.084415,55.176698],[83.087305,55.17744],[83.089644,55.177979],[83.092347,55.17853],[83.094158,55.178855],[83.095252,55.179013],[83.096346,55.179164],[83.097394,55.179306],[83.098535,55.179428],[83.09987,55.179566],[83.101496,55.179699],[83.103631,55.179839],[83.1051,55.179921],[83.105558,55.179947],[83.112581,55.180343],[83.115061,55.18052],[83.116792,55.180692],[83.11841,55.180885],[83.120134,55.181127],[83.121872,55.18143],[83.12416,55.18186],[83.125661,55.182208],[83.12911,55.183095],[83.138812,55.185737],[83.142162,55.186665],[83.143018,55.186873],[83.144764,55.187373],[83.146114,55.187809],[83.146821,55.188045],[83.148229,55.188553],[83.148554,55.188689],[83.14901,55.188864],[83.149664,55.189141],[83.150907,55.189731],[83.153511,55.191204],[83.154294,55.191717],[83.154868,55.192108],[83.156059,55.192997],[83.1567,55.19347],[83.157567,55.194092],[83.15835,55.194605],[83.159106,55.195065],[83.159372,55.195218],[83.159841,55.195479],[83.160741,55.195962],[83.161373,55.196278],[83.162316,55.196715],[83.163364,55.197162],[83.16387,55.197365],[83.16446,55.197592],[83.165183,55.197855],[83.16583,55.198075],[83.167188,55.198499],[83.168791,55.198928],[83.16993,55.199216],[83.170565,55.199351],[83.171494,55.199542],[83.172608,55.199748],[83.173523,55.199902],[83.174542,55.200047],[83.175503,55.200163],[83.176937,55.200308],[83.17816,55.200409],[83.179612,55.200483],[83.181169,55.20052],[83.182562,55.200508],[83.184056,55.200465],[83.185341,55.200393],[83.186543,55.200301],[83.187621,55.20018],[83.189213,55.199985],[83.190805,55.199737],[83.192109,55.199462],[83.196099,55.198625],[83.19758,55.198359],[83.198921,55.198152],[83.200191,55.197981],[83.201574,55.19784],[83.203181,55.197748],[83.205071,55.197675],[83.206841,55.197657],[83.208224,55.197679],[83.210211,55.197754],[83.211896,55.197896],[83.214027,55.198127],[83.215777,55.198367],[83.217177,55.198634],[83.218328,55.198853],[83.22094,55.1995],[83.222319,55.199858],[83.225013,55.20055],[83.226512,55.200948],[83.233902,55.202876],[83.236284,55.203497],[83.239721,55.204386],[83.240509,55.204598],[83.243947,55.205482],[83.248134,55.206564],[83.251516,55.207441],[83.255752,55.2085],[83.258005,55.20903],[83.260137,55.209509],[83.26183,55.209875],[83.263742,55.210294],[83.266489,55.210873],[83.268855,55.21145],[83.269966,55.211718],[83.270376,55.211832],[83.271084,55.212041],[83.271263,55.212091],[83.273186,55.212654],[83.275054,55.213204],[83.277519,55.213986],[83.28108,55.215115],[83.286688,55.216835],[83.288254,55.217349],[83.295737,55.219675],[83.299362,55.220791],[83.305864,55.222821],[83.315025,55.225673],[83.317964,55.226594],[83.319702,55.227133],[83.320235,55.227294],[83.320238,55.227295],[83.321057,55.227562],[83.322172,55.227893],[83.323119,55.228133],[83.324222,55.228404],[83.325325,55.228657],[83.326485,55.228895],[83.327656,55.229104],[83.328894,55.229319],[83.330084,55.229501],[83.331361,55.229672],[83.33287,55.229843],[83.334475,55.229965],[83.335926,55.230053],[83.337985,55.230112],[83.338441,55.230125],[83.339583,55.230144],[83.34055,55.230147],[83.342639,55.230075],[83.34468,55.229943],[83.346276,55.229788],[83.348401,55.229524],[83.349622,55.229339],[83.35224,55.228948],[83.354022,55.228692],[83.355069,55.228555],[83.356185,55.228471],[83.357516,55.228418],[83.358955,55.228357],[83.360434,55.228335],[83.361617,55.228347],[83.362905,55.228381],[83.364257,55.228458],[83.365708,55.228605],[83.367471,55.228799],[83.371468,55.22952],[83.38137,55.231639],[83.384623,55.232316],[83.390556,55.23355],[83.394103,55.234303],[83.398789,55.235307],[83.400228,55.235595],[83.401458,55.235846],[83.402495,55.236043],[83.404273,55.23632],[83.408593,55.236825],[83.432014,55.239568],[83.43445,55.239856],[83.444488,55.241044],[83.447015,55.24139],[83.449497,55.241846],[83.451072,55.242222],[83.451178,55.242254],[83.451735,55.242414],[83.452561,55.242649],[83.463929,55.246302],[83.475031,55.249823],[83.483623,55.252839],[83.488719,55.254622],[83.489475,55.2549],[83.491133,55.255463],[83.499058,55.258157],[83.504688,55.26009],[83.506498,55.260721],[83.512523,55.262795],[83.515092,55.263724],[83.517127,55.264451],[83.519049,55.265319],[83.51981,55.265696],[83.521625,55.266681],[83.529683,55.271364],[83.533922,55.273809],[83.537472,55.275783],[83.539083,55.276496],[83.539942,55.276897],[83.541647,55.277486],[83.543752,55.278165],[83.545275,55.278657],[83.552751,55.281012],[83.552769,55.281018],[83.554904,55.281668],[83.560225,55.283319],[83.563897,55.284506],[83.564261,55.284617],[83.565178,55.284898],[83.565556,55.285014],[83.565927,55.285126],[83.566853,55.285512],[83.567865,55.285913],[83.569216,55.286515],[83.570126,55.286964],[83.57045,55.287128],[83.570844,55.287329],[83.571413,55.287632],[83.571898,55.287905],[83.573612,55.289061],[83.575502,55.290571],[83.576816,55.291776],[83.577129,55.292126],[83.577848,55.292931],[83.57874,55.294145],[83.578992,55.294611],[83.579754,55.295902],[83.580044,55.296453],[83.581136,55.298608],[83.581833,55.299907],[83.582434,55.300934],[83.58373,55.303287],[83.584906,55.305163],[83.585201,55.305669],[83.585531,55.306267],[83.586915,55.308364],[83.588865,55.310363],[83.590663,55.311968],[83.59168,55.312601],[83.593132,55.313472],[83.593818,55.313869],[83.594349,55.314149],[83.595037,55.314574],[83.595856,55.314929],[83.598372,55.315946],[83.600574,55.316715],[83.60083,55.316771],[83.602169,55.317146],[83.602814,55.317322],[83.604874,55.317786],[83.606275,55.318074],[83.607279,55.318283],[83.612024,55.319406],[83.614584,55.320256],[83.617098,55.321367],[83.617352,55.32148],[83.618633,55.322127],[83.620433,55.323168],[83.626005,55.326555],[83.633145,55.330864],[83.633194,55.330894],[83.634092,55.331447],[83.634652,55.331846],[83.635164,55.332271],[83.635536,55.332646],[83.635928,55.333158],[83.636212,55.333696],[83.637304,55.336414],[83.641216,55.346688],[83.641802,55.348247],[83.643572,55.352824],[83.644052,55.353704],[83.644567,55.354478],[83.647396,55.35846],[83.648162,55.359553],[83.6556,55.369938],[83.656278,55.370886],[83.658252,55.373646],[83.665811,55.384392],[83.665872,55.384479],[83.667074,55.386266],[83.667489,55.386832],[83.668019,55.387519],[83.66874,55.388434],[83.669715,55.389416],[83.670654,55.390202],[83.673436,55.392131],[83.675716,55.393375],[83.677353,55.394151],[83.678584,55.394668],[83.681305,55.395618],[83.68383,55.396396],[83.684335,55.39655],[83.686793,55.397303],[83.694347,55.39963],[83.697038,55.400461],[83.699908,55.401582],[83.701769,55.402461],[83.703675,55.403511],[83.704661,55.404137],[83.706254,55.405281],[83.707642,55.406375],[83.724355,55.419368],[83.732204,55.42555],[83.733457,55.426372],[83.734439,55.426955],[83.746065,55.433536],[83.751776,55.436851],[83.753419,55.437901],[83.754968,55.438978],[83.756574,55.440311],[83.762741,55.445924],[83.768414,55.451136],[83.76985,55.452705],[83.770193,55.453143],[83.771476,55.454955],[83.772332,55.456806],[83.772986,55.458547],[83.773555,55.45981],[83.774577,55.46142],[83.775939,55.463065],[83.777708,55.46485],[83.779596,55.46631],[83.78373,55.469165],[83.784601,55.469763],[83.786815,55.47131],[83.787298,55.471716],[83.788146,55.472437],[83.789563,55.473828],[83.790565,55.475155],[83.791942,55.476841],[83.79216,55.477076],[83.792645,55.47768],[83.793159,55.478325],[83.793709,55.47898],[83.795015,55.480605],[83.795401,55.481154],[83.796363,55.482633],[83.796602,55.482992],[83.79683,55.483364],[83.79705,55.483747],[83.797315,55.48417],[83.797795,55.48499],[83.7981,55.485594],[83.798337,55.486065],[83.799822,55.488549],[83.801321,55.490774],[83.801936,55.491611],[83.804787,55.49528],[83.805045,55.495619],[83.807789,55.499215],[83.821752,55.517464],[83.82438,55.520159],[83.827198,55.522094],[83.827564,55.522304],[83.829707,55.523534],[83.83298,55.524886],[83.834936,55.525538],[83.837088,55.526192],[83.838424,55.526484],[83.843333,55.527643],[83.846366,55.528361],[83.847708,55.528678],[83.847785,55.528696],[83.848381,55.528837],[83.848957,55.528976],[83.849914,55.529199],[83.852323,55.529795],[83.853166,55.530004],[83.853768,55.530147],[83.855144,55.530474],[83.857298,55.530952],[83.857927,55.531103],[83.860672,55.531729],[83.861923,55.532044],[83.863273,55.532351],[83.868569,55.533567],[83.873624,55.534782],[83.875136,55.535175],[83.876255,55.535509],[83.877397,55.535896],[83.878795,55.53641],[83.87983,55.536823],[83.880811,55.537249],[83.882303,55.537966],[83.883407,55.538565],[83.884072,55.53898],[83.885234,55.539714],[83.8858,55.540106],[83.886376,55.540544],[83.886812,55.540889],[83.887265,55.541281],[83.887695,55.541667],[83.893148,55.54676],[83.903945,55.556792],[83.907876,55.560473],[83.909041,55.561507],[83.909633,55.561963],[83.910186,55.562372],[83.91105,55.562964],[83.911961,55.563567],[83.912519,55.563916],[83.913222,55.564314],[83.914136,55.564797],[83.915121,55.565278],[83.915315,55.565364],[83.915838,55.565596],[83.916603,55.565889],[83.917462,55.566202],[83.917555,55.566236],[83.919023,55.566724],[83.919956,55.567011],[83.921712,55.567502],[83.92278,55.567764],[83.923072,55.56783],[83.923824,55.568],[83.924918,55.568231],[83.926542,55.568548],[83.928058,55.568848],[83.930822,55.569384],[83.939619,55.571101],[83.947802,55.572715],[83.949278,55.573034],[83.950315,55.57328],[83.951392,55.573546],[83.952421,55.573808],[83.954092,55.574281],[83.956841,55.575113],[83.958861,55.575767],[83.960318,55.576277],[83.962354,55.577025],[83.962651,55.577144],[83.96322,55.577371],[83.964156,55.577767],[83.964263,55.577816],[83.965339,55.578302],[83.966756,55.57899],[83.966852,55.579036],[83.968434,55.579848],[83.970561,55.581009],[83.971918,55.581792],[83.983634,55.58856],[83.995428,55.595377],[83.996482,55.595967],[83.9972,55.596355],[83.997901,55.596695],[83.998743,55.597078],[83.999693,55.597489],[84.000869,55.597969],[84.002147,55.598446],[84.003446,55.598885],[84.004122,55.5991],[84.00512,55.599393],[84.005871,55.599584],[84.006531,55.599731],[84.007017,55.599815],[84.008154,55.60002],[84.00905,55.600161],[84.010471,55.600373],[84.011741,55.600537],[84.012981,55.600679],[84.013775,55.600755],[84.01478,55.600841],[84.015725,55.6009],[84.017028,55.600944],[84.018261,55.60096],[84.038771,55.601197],[84.038857,55.601198],[84.056723,55.60143],[84.057871,55.60148],[84.058913,55.601545],[84.060075,55.601641],[84.062399,55.601877],[84.063501,55.602019],[84.064504,55.602186],[84.065034,55.602287],[84.065825,55.602465],[84.066612,55.602642],[84.067627,55.602899],[84.068733,55.603188],[84.069269,55.60334],[84.070307,55.603653],[84.071545,55.60403],[84.075423,55.605249],[84.076187,55.605501],[84.076731,55.605676],[84.077227,55.605836],[84.080961,55.607036],[84.082431,55.607574],[84.084562,55.608403],[84.086146,55.609025],[84.086947,55.609364],[84.088417,55.610018],[84.090029,55.610792],[84.091219,55.611329],[84.091733,55.611539],[84.09234,55.611759],[84.093047,55.611995],[84.093726,55.612194],[84.094452,55.61236],[84.09537,55.612506],[84.096803,55.612686],[84.097882,55.612814],[84.098758,55.612894],[84.099764,55.612938],[84.101117,55.612972],[84.102424,55.612997],[84.103559,55.613003],[84.104448,55.612981],[84.105392,55.612928],[84.106908,55.612795],[84.10828,55.612694],[84.110014,55.612572],[84.110935,55.612532],[84.111497,55.612508],[84.11297,55.612486],[84.114179,55.612484],[84.115736,55.612511],[84.117862,55.612607],[84.118777,55.612666],[84.119535,55.612727],[84.120427,55.612805],[84.121181,55.612882],[84.122306,55.613016],[84.122847,55.61309],[84.123422,55.613169],[84.123997,55.613252],[84.124498,55.613326],[84.125214,55.613451],[84.12632,55.61365],[84.128393,55.614028],[84.134399,55.615155],[84.141079,55.616399],[84.142547,55.616669],[84.146876,55.617507],[84.150339,55.618254],[84.152184,55.618623],[84.153331,55.618817],[84.155084,55.619036],[84.156567,55.619169],[84.161828,55.619316],[84.162534,55.619333],[84.164009,55.619486],[84.165535,55.619735],[84.166975,55.62001],[84.168706,55.620335],[84.171288,55.620681],[84.17337,55.620859],[84.175521,55.620948],[84.176894,55.620931],[84.178205,55.620873],[84.1798,55.620744],[84.181024,55.620597],[84.182939,55.620285],[84.184566,55.619941],[84.186336,55.61949],[84.189593,55.618562],[84.194048,55.617296],[84.196285,55.616622],[84.197341,55.616326],[84.198149,55.616099],[84.204225,55.614393],[84.204245,55.614387],[84.206839,55.613677],[84.208449,55.613221],[84.214158,55.611542],[84.215395,55.611177],[84.219687,55.610003],[84.222356,55.609497],[84.223627,55.609315],[84.225056,55.609138],[84.225467,55.609089],[84.226354,55.609038],[84.227099,55.609025],[84.228071,55.609036],[84.229872,55.609103],[84.231056,55.609173],[84.232203,55.609269],[84.233012,55.609357],[84.233734,55.609481],[84.235201,55.609707],[84.236798,55.610007],[84.237553,55.610149],[84.239898,55.61053],[84.243286,55.6111],[84.249643,55.612254],[84.251899,55.61274],[84.253278,55.613076],[84.254663,55.613449],[84.264648,55.616222],[84.268637,55.617357],[84.290475,55.62339],[84.299928,55.626059],[84.302399,55.626795],[84.304728,55.627538],[84.310106,55.62935],[84.340599,55.639723],[84.355495,55.644787],[84.35584,55.644904],[84.356901,55.645259],[84.357207,55.645361],[84.358049,55.645632],[84.358306,55.645709],[84.358412,55.645736],[84.358589,55.645771],[84.359063,55.645902],[84.360272,55.646283],[84.360772,55.646416],[84.361533,55.646618],[84.362884,55.646939],[84.363658,55.647121],[84.364192,55.647245],[84.36507,55.64742],[84.36571,55.647522],[84.36611,55.647585],[84.368719,55.647977],[84.37054,55.648119],[84.373131,55.648262],[84.373174,55.648264],[84.375565,55.648237],[84.377661,55.64815],[84.38814,55.647344],[84.397119,55.646668],[84.397296,55.646654],[84.398098,55.646593],[84.398605,55.646554],[84.399348,55.646498],[84.406891,55.645939],[84.40886,55.645827],[84.410614,55.645769],[84.41303,55.645857],[84.415856,55.646147],[84.417866,55.646501],[84.420767,55.647137],[84.429476,55.649142],[84.431975,55.649686],[84.432143,55.649725],[84.434284,55.650224],[84.448364,55.653412],[84.458172,55.655613],[84.464753,55.65709],[84.483989,55.661526],[84.488217,55.662485],[84.49054,55.663073],[84.493248,55.663779],[84.506709,55.667273],[84.511486,55.668516],[84.513225,55.668977],[84.523506,55.671666],[84.524575,55.671945],[84.528095,55.672823],[84.530847,55.673121],[84.533058,55.6732],[84.535752,55.673068],[84.537287,55.672886],[84.539015,55.672561],[84.540669,55.672184],[84.54249,55.671646],[84.543584,55.671228],[84.544321,55.670875],[84.545117,55.670453],[84.545795,55.670093],[84.546351,55.669786],[84.549126,55.668283],[84.550101,55.667743],[84.553202,55.666024],[84.55328,55.665981],[84.556221,55.664613],[84.558814,55.66362],[84.5636,55.662188],[84.566299,55.661558],[84.569326,55.661075],[84.573572,55.660952],[84.576989,55.660949],[84.579037,55.660933],[84.60154,55.660903],[84.60899,55.660904],[84.609541,55.660903],[84.63537,55.660889],[84.636641,55.660874],[84.652783,55.660792],[84.654947,55.660772],[84.658129,55.660748],[84.660797,55.660728],[84.662841,55.660709],[84.664687,55.660704],[84.666087,55.660716],[84.667924,55.660757],[84.673612,55.660894],[84.681852,55.661164],[84.684292,55.661204],[84.687623,55.661234],[84.689618,55.661229],[84.691503,55.661163],[84.693463,55.661057],[84.69482,55.660951],[84.696447,55.660788],[84.698663,55.660484],[84.70049,55.660202],[84.7007,55.660167],[84.701221,55.66008],[84.703844,55.659626],[84.71157,55.657989],[84.713289,55.657609],[84.715944,55.657037],[84.716188,55.656984],[84.717662,55.656701],[84.717773,55.656676],[84.722804,55.655573],[84.723679,55.655355],[84.724466,55.655159],[84.726021,55.654772],[84.727451,55.654415],[84.727467,55.654411],[84.728547,55.654112],[84.731279,55.653338],[84.734062,55.652429],[84.736443,55.651593],[84.739491,55.650437],[84.741314,55.64968],[84.742,55.649339],[84.74534,55.647604],[84.745813,55.647362],[84.746367,55.647078],[84.747671,55.646411],[84.749672,55.64549],[84.752419,55.644321],[84.755265,55.643236],[84.756305,55.642848],[84.75773,55.642376],[84.760334,55.641586],[84.761222,55.641331],[84.762952,55.640861],[84.778099,55.636965],[84.780154,55.636467],[84.797186,55.632841],[84.80041,55.632155],[84.802409,55.63161],[84.804363,55.631067],[84.805795,55.630619],[84.807088,55.630137],[84.808719,55.629484],[84.810701,55.628642],[84.811934,55.628072],[84.81324,55.627391],[84.814141,55.626841],[84.816238,55.625339],[84.817344,55.624469],[84.818103,55.623868],[84.818497,55.623502],[84.819832,55.622177],[84.821175,55.62086],[84.822403,55.619402],[84.823043,55.61841],[84.826711,55.6119],[84.830098,55.606206],[84.831094,55.604658],[84.832617,55.60242],[84.835869,55.597725],[84.840744,55.59138],[84.842309,55.589473],[84.843087,55.588525],[84.84361,55.587888],[84.844999,55.586195],[84.851222,55.579113],[84.856499,55.573432],[84.873199,55.555963],[84.887485,55.540862],[84.888901,55.539502],[84.889628,55.538872],[84.891968,55.537243],[84.89544,55.535177],[84.896113,55.534777],[84.91682,55.522455],[84.920555,55.520231],[84.92069,55.520151],[84.947729,55.504101],[84.956407,55.498929],[84.959025,55.497543],[84.96044,55.496886],[84.960699,55.496765],[84.962201,55.496182],[84.962603,55.496047],[84.964304,55.495477],[84.966836,55.494869],[84.969711,55.494237],[84.97335,55.493578],[84.985994,55.491288],[84.995608,55.48956],[85.052801,55.479279],[85.053053,55.479234],[85.055713,55.478723],[85.058331,55.47814],[85.061292,55.477434],[85.065921,55.476134],[85.069135,55.475097],[85.072592,55.473836],[85.076334,55.472355],[85.076343,55.472351],[85.079324,55.471001],[85.08166,55.469871],[85.088003,55.466404],[85.094288,55.462833],[85.117907,55.449623],[85.120503,55.448368],[85.123219,55.447216],[85.125451,55.446461],[85.127897,55.445828],[85.130043,55.44539],[85.134285,55.444727],[85.147036,55.443971],[85.159053,55.443345],[85.20523,55.44057],[85.217719,55.43984],[85.219627,55.439629],[85.222405,55.439234],[85.223913,55.438959],[85.22407,55.438927],[85.225289,55.438658],[85.226907,55.438232],[85.228543,55.437753],[85.229458,55.437447],[85.230769,55.436985],[85.231595,55.436659],[85.232867,55.436111],[85.234075,55.435533],[85.234777,55.435192],[85.235838,55.434613],[85.237415,55.433658],[85.250206,55.425693],[85.26404,55.417092],[85.267633,55.414885],[85.269891,55.413693],[85.271426,55.413016],[85.273561,55.412224],[85.294181,55.40484],[85.305834,55.400649],[85.328122,55.392613],[85.330929,55.391606],[85.331311,55.391457],[85.335609,55.389903],[85.336573,55.389539],[85.338201,55.388975],[85.340986,55.387944],[85.341691,55.387687],[85.34746,55.385622],[85.350689,55.384504],[85.383965,55.372371],[85.402398,55.36568],[85.417784,55.360043],[85.419757,55.359468],[85.421352,55.359055],[85.422811,55.358787],[85.426813,55.358504],[85.438782,55.35799],[85.448982,55.357513],[85.451165,55.357411],[85.471306,55.356542],[85.473666,55.356298],[85.476627,55.355981],[85.480876,55.355396],[85.501197,55.35223],[85.501657,55.352152],[85.503195,55.351904],[85.503574,55.351839],[85.504579,55.351685],[85.505233,55.351578],[85.506534,55.351368],[85.51462,55.350084],[85.529842,55.347685],[85.534254,55.346935],[85.537197,55.346368],[85.542888,55.345123],[85.553317,55.342146],[85.5618,55.339732],[85.57662,55.335483],[85.584066,55.333357],[85.587649,55.332334],[85.603614,55.327696],[85.604055,55.327568],[85.612926,55.32501],[85.616311,55.324003],[85.619352,55.322976],[85.621903,55.322011],[85.627167,55.319994],[85.648552,55.311795],[85.655266,55.30922],[85.657682,55.30831],[85.658394,55.308043],[85.658896,55.307853],[85.662065,55.306621],[85.666673,55.304799],[85.67017,55.303482],[85.671359,55.30301],[85.671907,55.302728],[85.67243,55.302419],[85.673478,55.301686],[85.67437,55.300913],[85.675119,55.300153],[85.675476,55.299707],[85.677471,55.295363],[85.677685,55.294958],[85.677817,55.294759],[85.67821,55.294167],[85.678739,55.293463],[85.679356,55.292816],[85.680899,55.291452],[85.681017,55.291292],[85.681137,55.291135],[85.681198,55.29101],[85.681222,55.290892],[85.681233,55.290778],[85.681223,55.290669],[85.681196,55.290523],[85.681203,55.290421],[85.681171,55.290286],[85.681161,55.290195],[85.68118,55.289986],[85.681264,55.289776],[85.681438,55.289593],[85.681692,55.28943],[85.681874,55.289341],[85.682051,55.289268],[85.682236,55.289204],[85.68249,55.289153],[85.682667,55.289131],[85.682886,55.289122],[85.683086,55.289135],[85.683241,55.289157],[85.683415,55.289197],[85.683579,55.289247],[85.683754,55.289316],[85.683904,55.289391],[85.684025,55.289464],[85.684129,55.289543],[85.684237,55.289638],[85.684335,55.289749],[85.684399,55.289845],[85.684465,55.289965],[85.684534,55.29008],[85.684583,55.2902],[85.684634,55.290403],[85.684697,55.290562],[85.684765,55.290682],[85.684849,55.290792],[85.684955,55.290896],[85.685086,55.29098],[85.68524,55.29106],[85.685501,55.291214],[85.687859,55.29236],[85.688591,55.292715],[85.68954,55.293177],[85.702695,55.299671],[85.720375,55.308388],[85.724245,55.310296],[85.752035,55.323994],[85.757833,55.326843],[85.764017,55.329898],[85.764051,55.329915],[85.769863,55.332686],[85.770271,55.332882],[85.775437,55.335289],[85.778048,55.336425],[85.778551,55.336598],[85.778985,55.336714],[85.779092,55.336738],[85.779933,55.336924],[85.780678,55.33707],[85.781037,55.337125],[85.781357,55.337156],[85.781363,55.337156],[85.781688,55.337172],[85.782082,55.337174],[85.782355,55.337163],[85.78264,55.337146],[85.786952,55.336802],[85.78889,55.336661],[85.789469,55.336617],[85.790071,55.336568],[85.792142,55.33642],[85.792738,55.336379],[85.793337,55.336349],[85.793788,55.336347],[85.794356,55.33638],[85.79484,55.336429],[85.795076,55.336465],[85.795289,55.336497],[85.795639,55.336561],[85.796118,55.336679],[85.796378,55.336749],[85.796607,55.336829],[85.79704,55.337004],[85.798197,55.33754],[85.804284,55.340476],[85.810851,55.343643],[85.812014,55.344175],[85.813403,55.344719],[85.813877,55.344871],[85.814543,55.345058],[85.815353,55.345272],[85.816329,55.345477],[85.817334,55.345661],[85.818223,55.345777],[85.819588,55.34591],[85.820347,55.345956],[85.8211,55.345995],[85.822331,55.345991],[85.824459,55.345897],[85.82734,55.345778],[85.834167,55.345504],[85.835759,55.345444],[85.837496,55.345361],[85.838631,55.345337],[85.839934,55.34527],[85.842014,55.345192],[85.845124,55.34504],[85.84541,55.345027],[85.846441,55.344984],[85.86128,55.344381],[85.870482,55.344013],[85.871247,55.34398],[85.87413,55.34387],[85.874641,55.343845],[85.875877,55.343808],[85.876704,55.343804],[85.878147,55.343821],[85.879324,55.343831],[85.881819,55.343868],[85.883639,55.343876],[85.884496,55.343879],[85.885155,55.34387],[85.885824,55.343847],[85.886402,55.343817],[85.887037,55.343775],[85.887744,55.343716],[85.888332,55.34366],[85.888989,55.343594],[85.889639,55.343513],[85.890064,55.343452],[85.890561,55.343374],[85.891073,55.343285],[85.891605,55.34318],[85.891759,55.343148],[85.892029,55.343097],[85.892295,55.343044],[85.892583,55.342982],[85.892965,55.3429],[85.893347,55.342813],[85.893853,55.342692],[85.894171,55.342613],[85.89458,55.342507],[85.896075,55.342058],[85.896829,55.341832],[85.905481,55.339231],[85.909558,55.338006],[85.910223,55.337806],[85.912989,55.336974],[85.918217,55.335403],[85.919622,55.33498],[85.921945,55.334282],[85.928207,55.3324],[85.92866,55.332263],[85.930996,55.331541],[85.933077,55.330914],[85.933214,55.330873],[85.935325,55.330237],[85.936848,55.329778],[85.937064,55.329713],[85.937341,55.32963],[85.938138,55.329389],[85.939804,55.328887],[85.9402,55.328765],[85.940569,55.328628],[85.941163,55.328378],[85.943703,55.327211],[85.944214,55.326996],[85.944705,55.32682],[85.945217,55.326668],[85.946491,55.326331],[85.947402,55.326085],[85.948091,55.325896],[85.948944,55.325642],[85.949792,55.325366],[85.952233,55.32444],[85.952665,55.324657],[85.952726,55.324691],[85.952805,55.324735],[85.953121,55.324883],[85.953267,55.324947],[85.953418,55.324997],[85.952699,55.326405],[85.952563,55.326702],[85.952477,55.326982],[85.952196,55.329246],[85.952176,55.329347],[85.952149,55.329432],[85.952105,55.329507],[85.952057,55.329557],[85.951985,55.32961],[85.951887,55.329659],[85.951751,55.329715],[85.951624,55.329759],[85.951472,55.329814],[85.951372,55.329866],[85.951283,55.32994],[85.951232,55.330026],[85.951208,55.330184],[85.951199,55.33037],[85.951219,55.330599],[85.951272,55.330868],[85.951452,55.331626],[85.952699,55.336987],[85.952729,55.33714],[85.952758,55.337216],[85.952796,55.337263],[85.95285,55.337307],[85.952926,55.337343],[85.953027,55.337368],[85.953143,55.337381],[85.953305,55.337376],[85.953531,55.337368],[85.953721,55.337371],[85.953863,55.337386],[85.953982,55.337411],[85.954082,55.337448],[85.954165,55.337485],[85.954256,55.337536],[85.954348,55.337614],[85.956185,55.339938],[85.95636,55.340104],[85.956569,55.340259],[85.95683,55.340382],[85.957183,55.340486],[85.957676,55.34057],[85.963043,55.341259],[85.963404,55.341323],[85.963726,55.341393],[85.964005,55.341463],[85.964483,55.341609],[85.964528,55.341624],[85.965912,55.342047],[85.966647,55.342276],[85.966883,55.342338],[85.967069,55.342379],[85.967261,55.342407],[85.967556,55.342427],[85.971093,55.34245],[85.972148,55.342459],[85.972452,55.342461],[85.976217,55.342485],[85.980183,55.342517],[85.983235,55.342555],[85.985518,55.342569],[85.991343,55.342584],[85.994028,55.344118],[85.994809,55.344565],[85.998764,55.346864],[85.999635,55.347363],[86.000465,55.347797],[86.000859,55.348022],[86.001233,55.348216],[86.004562,55.350133],[86.005083,55.350433],[86.005469,55.350669],[86.005786,55.350902],[86.006046,55.351156],[86.006228,55.351416],[86.006311,55.351622],[86.006368,55.351872],[86.006373,55.352081],[86.006341,55.352353],[86.006279,55.352653],[86.006083,55.353332],[86.005858,55.354108],[86.005834,55.354263],[86.005813,55.354487],[86.005847,55.354727],[86.005917,55.354879],[86.006049,55.355052],[86.006228,55.355226],[86.006416,55.355352],[86.006679,55.355492],[86.007167,55.355642],[86.007356,55.355685],[86.007529,55.35572],[86.007958,55.355762],[86.008916,55.355838],[86.012592,55.356134],[86.013416,55.3562],[86.017032,55.35649],[86.019245,55.356668],[86.020723,55.356786],[86.022887,55.35696],[86.024782,55.357112],[86.026114,55.357219],[86.02817,55.357384],[86.030192,55.357546],[86.030551,55.357575],[86.031216,55.35764],[86.034574,55.357976],[86.036202,55.358145],[86.037157,55.358199],[86.037674,55.358243],[86.038546,55.358275],[86.039659,55.358283],[86.040566,55.358255],[86.041361,55.358203],[86.042548,55.358072],[86.043347,55.357964],[86.044289,55.357804],[86.044867,55.357702],[86.045037,55.35767],[86.046457,55.357351],[86.048498,55.356872],[86.050825,55.356326],[86.051676,55.356127],[86.053848,55.355617],[86.059757,55.35426],[86.060686,55.354035],[86.061568,55.353831],[86.062214,55.353672],[86.062818,55.353523],[86.063678,55.353311],[86.064185,55.353194],[86.064453,55.353134],[86.064634,55.353092],[86.064705,55.353189],[86.064814,55.353343],[86.066276,55.355409],[86.067101,55.356576],[86.067996,55.35787],[86.06883,55.359006],[86.068974,55.359145],[86.069074,55.359242],[86.069224,55.359388],[86.070934,55.361873],[86.071524,55.362708],[86.07167,55.362878],[86.07409,55.366691],[86.078693,55.37186],[86.079201,55.372421],[86.07973,55.372863],[86.080022,55.373095],[86.080534,55.373581],[86.080753,55.373836],[86.080878,55.374139],[86.081157,55.374477],[86.08145,55.374901],[86.081986,55.3756],[86.082138,55.375768],[86.082468,55.3761],[86.082756,55.376314],[86.083056,55.376465],[86.083255,55.376548],[86.083453,55.376611],[86.083692,55.376672],[86.084054,55.376764],[86.084207,55.376844],[86.08436,55.376916],[86.084505,55.377017],[86.084975,55.377344],[86.085273,55.377604],[86.085597,55.377869],[86.087224,55.379111],[86.087257,55.379136],[86.087384,55.379274],[86.087419,55.379342],[86.087464,55.379513],[86.087495,55.379718],[86.087527,55.38004],[86.087564,55.381731],[86.087654,55.382361],[86.087736,55.38262],[86.087845,55.382848],[86.089143,55.385168],[86.089311,55.385419],[86.089488,55.385722],[86.089946,55.386419],[86.090251,55.38683],[86.090507,55.38711],[86.090745,55.387329],[86.090989,55.387543],[86.091198,55.387699],[86.091419,55.387851],[86.093139,55.388898],[86.093267,55.389069],[86.093371,55.389321],[86.093597,55.389982],[86.093786,55.390549],[86.093878,55.390686],[86.094037,55.390878],[86.094204,55.391027],[86.094526,55.391312],[86.097363,55.393308],[86.09808,55.393786],[86.099773,55.395001],[86.101213,55.39605],[86.101639,55.3964],[86.102265,55.397097],[86.103057,55.398052],[86.104111,55.399318],[86.10523,55.400657],[86.105649,55.401106],[86.105998,55.401515],[86.107178,55.402908],[86.108011,55.403885],[86.108756,55.404732],[86.109953,55.406092],[86.110411,55.406613],[86.111862,55.408269],[86.114373,55.411137],[86.115002,55.411911],[86.115096,55.412054],[86.115598,55.412659],[86.115736,55.412825],[86.116924,55.414565],[86.117954,55.416089],[86.118285,55.416582],[86.120148,55.419202],[86.120982,55.420218],[86.12127,55.420569],[86.121741,55.421095],[86.122222,55.421612],[86.123108,55.422552],[86.123751,55.423229],[86.124148,55.423641],[86.124692,55.424328],[86.124954,55.424734],[86.125058,55.424912],[86.125554,55.425644],[86.126443,55.426654],[86.127765,55.428131],[86.128456,55.428863],[86.129265,55.429617],[86.129454,55.429815],[86.130417,55.430756],[86.130922,55.431221],[86.131458,55.431682],[86.131836,55.431971],[86.133245,55.43302],[86.137445,55.436164],[86.137885,55.436497],[86.138206,55.436748],[86.138408,55.436908],[86.138548,55.437047],[86.138698,55.437203],[86.1389,55.437441],[86.139038,55.43764],[86.139224,55.437971],[86.139364,55.438337],[86.13937,55.438466],[86.139378,55.43862],[86.139378,55.438869],[86.139357,55.439335],[86.139379,55.439979],[86.139331,55.441708],[86.139307,55.442093],[86.139201,55.442602],[86.139114,55.442938],[86.139086,55.443046],[86.138873,55.443553],[86.13831,55.444428],[86.137876,55.444979],[86.137722,55.445133],[86.137332,55.445498],[86.134442,55.448108],[86.134321,55.448209],[86.127561,55.454285],[86.127194,55.454626],[86.125148,55.456475],[86.124494,55.457145],[86.123758,55.458183],[86.123205,55.459096],[86.122928,55.459772],[86.122694,55.46038],[86.12246,55.461308],[86.122378,55.461947],[86.12235,55.46244],[86.122374,55.463283],[86.122376,55.463347],[86.122516,55.4643],[86.122737,55.464954],[86.123056,55.465625],[86.123382,55.466253],[86.123735,55.466833],[86.12511,55.46885],[86.125517,55.469655],[86.125881,55.470407],[86.126527,55.472827],[86.126679,55.474379],[86.12699,55.477737],[86.127359,55.479268],[86.127362,55.479281],[86.128032,55.48035],[86.131429,55.484084],[86.132576,55.485366],[86.133098,55.485954],[86.134365,55.487427],[86.137819,55.491196],[86.139581,55.493235],[86.143785,55.498096],[86.144682,55.49934],[86.144907,55.499648],[86.145254,55.500133],[86.146499,55.501861],[86.147006,55.502532],[86.147522,55.503216],[86.147999,55.503739],[86.148544,55.504337],[86.149003,55.504771],[86.150983,55.506639],[86.152203,55.507808],[86.15252,55.508111],[86.153737,55.509238],[86.154632,55.510104],[86.154797,55.510265],[86.155272,55.510804],[86.155568,55.511307],[86.156384,55.51283],[86.157121,55.51432],[86.158502,55.516875],[86.160112,55.519367],[86.160452,55.519799],[86.160819,55.52013],[86.162344,55.521311],[86.163101,55.521937],[86.163442,55.522396],[86.163684,55.522874],[86.163839,55.523321],[86.163909,55.523799],[86.16386,55.52469],[86.163748,55.525245],[86.163348,55.526099],[86.162786,55.52668],[86.160956,55.527914],[86.160571,55.528252],[86.159916,55.529329],[86.159677,55.529833],[86.159304,55.530513],[86.159163,55.530809],[86.158954,55.531247],[86.158846,55.531474],[86.158167,55.532786],[86.158041,55.533204],[86.158,55.533594],[86.158036,55.533915],[86.158137,55.534292],[86.158218,55.534607],[86.158426,55.535117],[86.159153,55.536481],[86.160247,55.538342],[86.161447,55.540434],[86.162065,55.541488],[86.16236,55.541968],[86.162687,55.542391],[86.16303,55.5428],[86.163499,55.543248],[86.164704,55.544221],[86.165289,55.544624],[86.165593,55.544811],[86.165867,55.54496],[86.166299,55.5452],[86.166736,55.545418],[86.167632,55.545851],[86.167728,55.545897],[86.169305,55.546655],[86.169757,55.546852],[86.170224,55.547094],[86.170652,55.547339],[86.171036,55.547517],[86.171255,55.547642],[86.171847,55.548043],[86.172046,55.548194],[86.172225,55.548352],[86.172573,55.548674],[86.172901,55.548951],[86.173119,55.549098],[86.173328,55.549235],[86.173388,55.549264],[86.173442,55.549295],[86.173517,55.549335],[86.173612,55.549379],[86.173795,55.54946],[86.174828,55.549923],[86.175171,55.550053],[86.175481,55.550133],[86.176804,55.550296],[86.17794,55.550453],[86.179838,55.550755],[86.185857,55.551771],[86.191003,55.552557],[86.191704,55.552636],[86.192378,55.552669],[86.194119,55.552696],[86.194883,55.552702],[86.19591,55.55271],[86.197024,55.552699],[86.197184,55.552687],[86.197982,55.552629],[86.198756,55.552528],[86.198892,55.552511],[86.202508,55.552024],[86.205296,55.551711],[86.206208,55.551663],[86.206734,55.551663],[86.207705,55.551726],[86.208646,55.551833],[86.209398,55.551957],[86.210148,55.552127],[86.212463,55.552717],[86.216688,55.553876],[86.21937,55.554672],[86.222028,55.555551],[86.223629,55.556149],[86.225155,55.556776],[86.227417,55.557685],[86.229662,55.558649],[86.230933,55.559187],[86.231968,55.559666],[86.239698,55.563767],[86.240315,55.564201],[86.240717,55.564554],[86.241216,55.565165],[86.241495,55.565503],[86.242248,55.566451],[86.242937,55.567301],[86.243105,55.567624],[86.243192,55.567851],[86.24318,55.56813],[86.24312,55.568376],[86.242289,55.569939],[86.242134,55.570499],[86.242113,55.570756],[86.242176,55.571028],[86.242311,55.57135],[86.242505,55.571664],[86.242821,55.571997],[86.243239,55.572317],[86.243527,55.572512],[86.243863,55.572696],[86.244433,55.572935],[86.245018,55.573164],[86.247284,55.574049],[86.255227,55.577099],[86.258608,55.578395],[86.258771,55.578458],[86.258938,55.578522],[86.265699,55.581115],[86.267046,55.581634],[86.271834,55.583468],[86.272748,55.583799],[86.273612,55.584094],[86.274439,55.584359],[86.275091,55.584565],[86.276478,55.584975],[86.277028,55.585133],[86.277629,55.585292],[86.282176,55.586459],[86.282978,55.586665],[86.289428,55.588328],[86.297069,55.590322],[86.305793,55.5926],[86.305865,55.592619],[86.309015,55.593453],[86.309918,55.593701],[86.310464,55.593862],[86.311312,55.594118],[86.311994,55.594349],[86.312875,55.59466],[86.313548,55.594929],[86.314121,55.595169],[86.315991,55.595979],[86.316922,55.596381],[86.318679,55.597176],[86.320339,55.597914],[86.321781,55.5986],[86.322014,55.598731],[86.322245,55.598871],[86.322398,55.598982],[86.322534,55.599089],[86.322701,55.599251],[86.322839,55.599417],[86.323036,55.599679],[86.323178,55.599923],[86.325066,55.603169],[86.325499,55.60383],[86.325718,55.604105],[86.32594,55.604355],[86.326202,55.604613],[86.326526,55.604889],[86.327368,55.605487],[86.328379,55.60613],[86.329049,55.60656],[86.329495,55.606824],[86.32989,55.607028],[86.330258,55.607197],[86.330814,55.607403],[86.331965,55.6078],[86.332692,55.60805],[86.333653,55.608372],[86.334182,55.60854],[86.33544,55.608918],[86.336753,55.609281],[86.337728,55.609566],[86.33835,55.60976],[86.338709,55.609885],[86.339097,55.61004],[86.339506,55.610213],[86.340005,55.610442],[86.340661,55.610741],[86.341371,55.61107],[86.342089,55.611369],[86.342693,55.611572],[86.342991,55.61166],[86.343277,55.611739],[86.343603,55.611813],[86.343949,55.611876],[86.344268,55.611929],[86.344594,55.611975],[86.344945,55.612014],[86.345298,55.612044],[86.345686,55.612061],[86.346162,55.612062],[86.346599,55.61205],[86.348385,55.611988],[86.34936,55.611959],[86.350345,55.611926],[86.351931,55.611872],[86.356314,55.611732],[86.358042,55.611669],[86.358728,55.611644],[86.359448,55.611587],[86.360228,55.611524],[86.360971,55.611439],[86.361929,55.611315],[86.364068,55.610977],[86.367322,55.610448],[86.367945,55.610357],[86.368464,55.61028],[86.368924,55.610228],[86.369325,55.610198],[86.369726,55.610191],[86.370219,55.610204],[86.370721,55.610251],[86.371112,55.610311],[86.371525,55.610398],[86.371905,55.610501],[86.372441,55.610713],[86.37294,55.610917],[86.373536,55.611146],[86.374349,55.61146],[86.374918,55.611664],[86.375577,55.611882],[86.376078,55.612023],[86.376248,55.612056],[86.3769,55.612184],[86.377341,55.612272],[86.378015,55.612379],[86.378952,55.612492],[86.380117,55.612638],[86.382594,55.612953],[86.383978,55.613138],[86.395691,55.614644],[86.397993,55.614905],[86.399369,55.615021],[86.401059,55.615107],[86.402333,55.615162],[86.40427,55.615195],[86.406003,55.615169],[86.408166,55.615087],[86.409478,55.615013],[86.410768,55.614914],[86.414422,55.614661],[86.418096,55.614452],[86.41935,55.614438],[86.420335,55.614452],[86.422,55.614495],[86.422931,55.614534],[86.424182,55.614594],[86.425264,55.614674],[86.426139,55.614784],[86.428016,55.61506],[86.429359,55.615278],[86.430463,55.615476],[86.430996,55.615586],[86.431654,55.615766],[86.433921,55.616306],[86.440921,55.618626],[86.443051,55.619399],[86.446812,55.620835],[86.448072,55.621437],[86.449071,55.622003],[86.450246,55.62302],[86.451636,55.624535],[86.452109,55.625162],[86.452438,55.625758],[86.452612,55.626487],[86.452659,55.627384],[86.452513,55.628127],[86.451906,55.629384],[86.450993,55.630883],[86.448225,55.634679],[86.44792,55.635261],[86.447826,55.635601],[86.447796,55.635711],[86.447781,55.636188],[86.447949,55.636749],[86.44822,55.637229],[86.448732,55.637805],[86.449907,55.638833],[86.452477,55.640985],[86.453379,55.641619],[86.455523,55.642628],[86.456992,55.643268],[86.457435,55.64342],[86.457923,55.64355],[86.458504,55.64368],[86.458952,55.643722],[86.460646,55.643655],[86.461689,55.643618],[86.462587,55.643665],[86.463659,55.643867],[86.465957,55.644443],[86.466814,55.644707],[86.468118,55.645298],[86.468676,55.645531],[86.469173,55.645672],[86.47001,55.645806],[86.471338,55.645956],[86.472608,55.646157],[86.473534,55.646335],[86.474262,55.646518],[86.474637,55.646656],[86.474909,55.646767],[86.475465,55.647133],[86.475984,55.647503],[86.477835,55.648837],[86.478473,55.649259],[86.478996,55.649518],[86.479651,55.649788],[86.480278,55.649985],[86.483023,55.650843],[86.484433,55.651271],[86.484512,55.651295],[86.485263,55.651543],[86.485718,55.651706],[86.486142,55.651905],[86.486614,55.652217],[86.486925,55.65252],[86.487249,55.653039],[86.487554,55.653496],[86.48776,55.653695],[86.48802,55.653868],[86.488559,55.654076],[86.488905,55.654159],[86.489362,55.654235],[86.490167,55.654297],[86.490682,55.654336],[86.490959,55.654373],[86.491366,55.654453],[86.491759,55.654556],[86.49207,55.654683],[86.49238,55.654855],[86.492642,55.655043],[86.492903,55.655267],[86.493084,55.655471],[86.493151,55.655551],[86.493881,55.656512],[86.494358,55.657141],[86.494852,55.657686],[86.495277,55.658108],[86.495772,55.65861],[86.495938,55.658889],[86.496191,55.659337],[86.496421,55.659784],[86.496669,55.660141],[86.496979,55.660449],[86.497295,55.660731],[86.49787,55.66113],[86.499025,55.66185],[86.500643,55.662855],[86.501135,55.663219],[86.501783,55.663718],[86.502809,55.664479],[86.503458,55.664997],[86.503803,55.665255],[86.504088,55.665416],[86.504469,55.665561],[86.504829,55.665675],[86.505375,55.665783],[86.506789,55.665979],[86.507611,55.666085],[86.508109,55.666104],[86.509517,55.666107],[86.511321,55.666062],[86.513627,55.665938],[86.514232,55.665925],[86.514862,55.665941],[86.515358,55.665989],[86.515801,55.666081],[86.516391,55.666236],[86.516793,55.666411],[86.517224,55.666633],[86.518,55.667094],[86.518974,55.667685],[86.519677,55.66813],[86.520189,55.668472],[86.520457,55.668708],[86.520722,55.669056],[86.521281,55.669746],[86.521684,55.670287],[86.52208,55.670718],[86.52269,55.671192],[86.524018,55.672044],[86.525196,55.672809],[86.52592,55.673273],[86.526369,55.6735],[86.5268,55.673655],[86.527288,55.673791],[86.529369,55.674261],[86.531002,55.674625],[86.531858,55.674845],[86.532744,55.675117],[86.533709,55.675477],[86.53567,55.676177],[86.536859,55.676624],[86.537716,55.676945],[86.538291,55.677107],[86.53867,55.67718],[86.539492,55.677234],[86.541303,55.677273],[86.542752,55.677328],[86.543338,55.67737],[86.543936,55.677451],[86.544378,55.677584],[86.544656,55.677694],[86.545356,55.678025],[86.546896,55.678793],[86.548305,55.679483],[86.549052,55.679892],[86.549541,55.680238],[86.549995,55.680572],[86.55061,55.68112],[86.551293,55.681775],[86.551397,55.681875],[86.551966,55.682394],[86.552466,55.68274],[86.552944,55.683016],[86.553495,55.683262],[86.554139,55.683489],[86.554795,55.683648],[86.555341,55.683755],[86.556117,55.683816],[86.556789,55.683839],[86.557881,55.683807],[86.558686,55.683739],[86.559549,55.683703],[86.56033,55.683716],[86.561124,55.683771],[86.561854,55.683836],[86.562607,55.68392],[86.563791,55.684121],[86.564642,55.68427],[86.565763,55.684455],[86.566309,55.6845],[86.566815,55.684484],[86.567279,55.684409],[86.568217,55.684131],[86.569585,55.683651],[86.570907,55.683204],[86.571396,55.683058],[86.571798,55.682948],[86.57235,55.68288],[86.572862,55.682902],[86.573328,55.682993],[86.575167,55.683382],[86.575602,55.683489],[86.576064,55.683677],[86.576662,55.684027],[86.577553,55.684591],[86.578622,55.685291],[86.579524,55.685884],[86.58053,55.686548],[86.58268,55.68798],[86.58363,55.688568],[86.584101,55.688892],[86.584308,55.689103],[86.584446,55.689323],[86.584509,55.689602],[86.584582,55.690142],[86.584571,55.691195],[86.584559,55.692588],[86.584582,55.693188],[86.58464,55.693476],[86.58476,55.693671],[86.584956,55.693839],[86.585226,55.69402],[86.585985,55.694273],[86.591273,55.696281],[86.596625,55.698413],[86.600043,55.699631],[86.608066,55.702304],[86.608631,55.702521],[86.609215,55.702795],[86.609793,55.703091],[86.610321,55.703395],[86.610759,55.703718],[86.611333,55.704205],[86.611648,55.704515],[86.611912,55.704839],[86.612125,55.705155],[86.612446,55.705663],[86.612652,55.706065],[86.61276,55.706381],[86.612811,55.706691],[86.612811,55.707217],[86.61279,55.707767],[86.612731,55.70851],[86.612679,55.708912],[86.612564,55.709696],[86.612386,55.71091],[86.612225,55.711875],[86.612104,55.71263],[86.611909,55.713598],[86.611681,55.71463],[86.611614,55.715006],[86.611554,55.7154],[86.611558,55.715823],[86.61161,55.716304],[86.6117,55.716675],[86.611818,55.71703],[86.612037,55.717572],[86.612228,55.717966],[86.612537,55.718504],[86.613743,55.720632],[86.617077,55.726264],[86.61827,55.728349],[86.618734,55.729166],[86.618998,55.729713],[86.619088,55.729972],[86.619214,55.730352],[86.619291,55.730693],[86.61938,55.731219],[86.61954,55.732389],[86.619694,55.733559],[86.619876,55.734492],[86.620077,55.735132],[86.620537,55.736285],[86.621008,55.73741],[86.621369,55.738144],[86.621689,55.738727],[86.621981,55.739072],[86.622396,55.739463],[86.622892,55.739845],[86.623392,55.740253],[86.623794,55.740591],[86.624144,55.740916],[86.624558,55.741388],[86.625026,55.741923],[86.625595,55.742507],[86.625879,55.742779],[86.626148,55.743113],[86.626261,55.743307],[86.626298,55.743456],[86.626318,55.743607],[86.626298,55.743852],[86.626217,55.744227],[86.626103,55.744609],[86.625457,55.746258],[86.624936,55.747534],[86.624798,55.747793],[86.624677,55.747996],[86.624484,55.748207],[86.624288,55.748392],[86.623851,55.748748],[86.623481,55.749045],[86.623195,55.749319],[86.622964,55.749534],[86.622569,55.749964],[86.62224,55.750336],[86.621945,55.750726],[86.621855,55.750858],[86.62179,55.750991],[86.621712,55.751182],[86.621677,55.751341],[86.621666,55.751626],[86.621712,55.751858],[86.621767,55.752031],[86.621862,55.752273],[86.622098,55.752648],[86.622281,55.7529],[86.622427,55.753089],[86.622496,55.753195],[86.622549,55.753302],[86.622604,55.753431],[86.622654,55.753572],[86.622679,55.753715],[86.622691,55.753911],[86.62272,55.754814],[86.62273,55.755012],[86.622767,55.755232],[86.622807,55.755411],[86.622893,55.755677],[86.623104,55.756166],[86.623183,55.756374],[86.62335,55.75673],[86.623505,55.757012],[86.623744,55.757277],[86.624034,55.757558],[86.624643,55.7581],[86.625149,55.758611],[86.625567,55.759017],[86.625823,55.759224],[86.626134,55.759413],[86.62647,55.759583],[86.626938,55.759757],[86.627413,55.759924],[86.627827,55.760061],[86.628111,55.760188],[86.628298,55.760319],[86.628459,55.760464],[86.628577,55.760589],[86.628732,55.760767],[86.628908,55.760969],[86.629155,55.761177],[86.629465,55.761367],[86.629761,55.761517],[86.630138,55.76165],[86.63052,55.761766],[86.630905,55.761866],[86.632236,55.762196],[86.633204,55.762414],[86.633661,55.762498],[86.63407,55.76256],[86.634716,55.762636],[86.6354,55.762687],[86.636113,55.762724],[86.636564,55.762731],[86.636952,55.762762],[86.637283,55.762792],[86.637438,55.762812],[86.637743,55.762885],[86.638102,55.762972],[86.63939,55.763282],[86.64068,55.763591],[86.641146,55.763727],[86.641416,55.763806],[86.641623,55.763911],[86.641761,55.763991],[86.641948,55.764101],[86.64229,55.764312],[86.642577,55.76449],[86.642882,55.764657],[86.643152,55.764775],[86.643408,55.764867],[86.643804,55.765009],[86.644276,55.765139],[86.64502,55.765309],[86.64638,55.765622],[86.646722,55.765706],[86.647067,55.765821],[86.64746,55.76598],[86.648119,55.766248],[86.648964,55.766626],[86.650165,55.767204],[86.650608,55.767422],[86.650774,55.76751],[86.651016,55.767637],[86.651361,55.76786],[86.651543,55.767999],[86.65178,55.768201],[86.652137,55.768536],[86.652581,55.76901],[86.652808,55.769286],[86.652886,55.769398],[86.652983,55.769558],[86.653075,55.769763],[86.653139,55.76999],[86.653187,55.77025],[86.65317,55.770544],[86.653133,55.77089],[86.652888,55.772508],[86.652842,55.772793],[86.652827,55.773068],[86.652824,55.773404],[86.652859,55.77374],[86.652916,55.77418],[86.653031,55.774744],[86.653169,55.775263],[86.653258,55.775507],[86.653376,55.775743],[86.653514,55.77599],[86.653734,55.776273],[86.653945,55.776499],[86.65421,55.776747],[86.654226,55.776762],[86.65451,55.777002],[86.654803,55.777215],[86.655217,55.777444],[86.65548,55.777594],[86.655669,55.777681],[86.656042,55.77785],[86.656264,55.777933],[86.656505,55.778015],[86.657173,55.778226],[86.657868,55.778412],[86.65846,55.778561],[86.659101,55.778737],[86.659716,55.778939],[86.660476,55.779217],[86.663052,55.780316],[86.664185,55.780815],[86.664572,55.781053],[86.664767,55.781236],[86.664889,55.781382],[86.665035,55.781613],[86.665451,55.782343],[86.665933,55.78327],[86.666647,55.784521],[86.66693,55.785313],[86.667262,55.786357],[86.667399,55.78672],[86.667584,55.786968],[86.66794,55.787267],[86.668309,55.787585],[86.668528,55.7878],[86.66872,55.788079],[86.669318,55.788816],[86.66986,55.789484],[86.670631,55.790404],[86.670904,55.790692],[86.671302,55.791049],[86.671879,55.791466],[86.672304,55.791776],[86.672684,55.792022],[86.673336,55.792361],[86.673765,55.792605],[86.674097,55.792753],[86.674787,55.793033],[86.675429,55.793266],[86.676311,55.793541],[86.681047,55.794973],[86.682067,55.795261],[86.683845,55.795763],[86.685361,55.796231],[86.685946,55.796439],[86.686405,55.796674],[86.687178,55.797103],[86.688264,55.797707],[86.68939,55.798263],[86.691733,55.79954],[86.69263,55.799996],[86.695872,55.801378],[86.697322,55.802175],[86.698189,55.802729],[86.699615,55.803642],[86.70016,55.804131],[86.700499,55.80451],[86.701062,55.805099],[86.702734,55.806443],[86.703165,55.806941],[86.703523,55.807553],[86.704141,55.808978],[86.704927,55.810848],[86.706221,55.814257],[86.706382,55.814583],[86.706537,55.814855],[86.706669,55.815042],[86.706842,55.815216],[86.70706,55.81541],[86.707267,55.815565],[86.708523,55.816259],[86.711458,55.817824],[86.717139,55.820809],[86.718314,55.821422],[86.719164,55.821822],[86.71989,55.822108],[86.720441,55.822307],[86.720891,55.822466],[86.721324,55.82258],[86.722345,55.822771],[86.726754,55.823473],[86.732057,55.824326],[86.733791,55.824623],[86.734539,55.824728],[86.734925,55.82476],[86.735532,55.824789],[86.735855,55.824786],[86.736149,55.824753],[86.736715,55.824667],[86.73735,55.824518],[86.737972,55.824357],[86.740633,55.8236],[86.741781,55.823257],[86.743251,55.822828],[86.743992,55.822653],[86.744516,55.822545],[86.745303,55.822411],[86.746201,55.822285],[86.747271,55.822178],[86.748798,55.822056],[86.752547,55.821687],[86.756074,55.821004],[86.758902,55.820581],[86.760312,55.82062],[86.762471,55.820909],[86.76507,55.82146],[86.767104,55.821831],[86.767793,55.821926],[86.768611,55.82202],[86.769531,55.822086],[86.770239,55.822119],[86.770816,55.822136],[86.772136,55.822155],[86.774965,55.822163],[86.776561,55.822159],[86.777722,55.822158],[86.778186,55.822157],[86.778558,55.822166],[86.778869,55.822198],[86.779134,55.82224],[86.779271,55.822262],[86.779858,55.822389],[86.7805,55.822549],[86.780683,55.822593],[86.780992,55.82268],[86.781522,55.822843],[86.782003,55.823015],[86.782593,55.823278],[86.782984,55.823475],[86.783312,55.823673],[86.783618,55.823861],[86.784155,55.824254],[86.786759,55.826371],[86.787244,55.826758],[86.787913,55.827307],[86.78846,55.827736],[86.789079,55.828219],[86.789773,55.828775],[86.790369,55.829231],[86.792119,55.830647],[86.793171,55.831431],[86.794582,55.832612],[86.797303,55.834779],[86.799263,55.836349],[86.800939,55.837707],[86.803042,55.839324],[86.803231,55.839469],[86.804417,55.84042],[86.806823,55.842305],[86.809124,55.843834],[86.813127,55.8457],[86.814414,55.84628],[86.825383,55.851216],[86.829798,55.853156],[86.839079,55.855811],[86.844905,55.857461],[86.846758,55.858171],[86.852107,55.860744],[86.864556,55.866574],[86.876813,55.872367],[86.87753,55.872838],[86.878047,55.87328],[86.878444,55.87373],[86.878817,55.874297],[86.879119,55.874794],[86.879457,55.875536],[86.879537,55.875711],[86.879739,55.876367],[86.879881,55.876975],[86.880339,55.878894],[86.880721,55.880341],[86.881157,55.881499],[86.881596,55.882555],[86.882268,55.88368],[86.882657,55.884241],[86.883032,55.884666],[86.887827,55.889859],[86.891495,55.893805],[86.892084,55.894423],[86.892576,55.894912],[86.893137,55.895373],[86.893508,55.895617],[86.895797,55.896839],[86.90382,55.900585],[86.908989,55.902511],[86.924345,55.908107],[86.929527,55.909897],[86.929927,55.910024],[86.930953,55.910274],[86.931767,55.91043],[86.932583,55.910514],[86.933366,55.910553],[86.934138,55.910547],[86.934997,55.910499],[86.935914,55.910394],[86.936914,55.910216],[86.938261,55.909828],[86.940098,55.909317],[86.943077,55.90852],[86.944304,55.90816],[86.945319,55.907823],[86.945688,55.90767],[86.946128,55.90745],[86.946527,55.907228],[86.948779,55.905899],[86.949696,55.90536],[86.949975,55.905239],[86.950143,55.905187],[86.95033,55.905141],[86.950647,55.9051],[86.950903,55.905088],[86.951303,55.905097],[86.957345,55.905629],[86.962058,55.905997],[86.963971,55.906147],[86.965649,55.906193],[86.967189,55.906102],[86.969297,55.905688],[86.981321,55.90257],[86.985967,55.901001],[86.990974,55.899343],[86.992671,55.898794],[87.001843,55.895761],[87.002843,55.89543],[87.025913,55.887827],[87.036384,55.884386],[87.039992,55.883449],[87.050901,55.88108],[87.058384,55.87946],[87.074576,55.875092],[87.074585,55.87509],[87.080317,55.873514],[87.092851,55.870144],[87.10519,55.867837],[87.112086,55.866556],[87.113278,55.866382],[87.114576,55.866268],[87.116083,55.866172],[87.117335,55.866158],[87.121782,55.866329],[87.129435,55.866735],[87.133308,55.866982],[87.146505,55.868802],[87.149075,55.869299],[87.150173,55.869553],[87.151123,55.86982],[87.155965,55.871319],[87.159467,55.872286],[87.162806,55.873165],[87.163982,55.873434],[87.16612,55.873842],[87.185365,55.876753],[87.18672,55.876954],[87.199261,55.878692],[87.214688,55.880446],[87.221472,55.881173],[87.222717,55.881337],[87.224603,55.881656],[87.226721,55.882076],[87.239861,55.885455],[87.245513,55.886962],[87.252379,55.888713],[87.257519,55.88973],[87.261496,55.890132],[87.263471,55.890295],[87.265434,55.890335],[87.266604,55.890359],[87.272483,55.890411],[87.277893,55.890416],[87.280857,55.890489],[87.281148,55.89051],[87.28157,55.890555],[87.282141,55.890638],[87.282457,55.890693],[87.283045,55.890838],[87.283524,55.890995],[87.284049,55.891216],[87.284421,55.891406],[87.294694,55.897745],[87.316087,55.911024],[87.351309,55.932864],[87.354506,55.934595],[87.357703,55.936005],[87.361384,55.937151],[87.393253,55.945171],[87.393541,55.945243],[87.395972,55.945932],[87.398133,55.946375],[87.403217,55.946804],[87.405579,55.947015],[87.408089,55.94733],[87.410072,55.947642],[87.41244,55.9481],[87.414472,55.94856],[87.416748,55.949188],[87.419192,55.949923],[87.426205,55.952628],[87.430718,55.954831],[87.433836,55.956759],[87.437511,55.959415],[87.437904,55.959698],[87.4406,55.961571],[87.442085,55.962453],[87.443433,55.963101],[87.486289,55.981035],[87.502102,55.987649],[87.511262,55.991481],[87.548292,56.006877],[87.548374,56.006911],[87.556115,56.010155],[87.560476,56.011946],[87.562226,56.012599],[87.566604,56.014068],[87.567306,56.014416],[87.567872,56.014864],[87.577213,56.023468],[87.5794,56.025521],[87.582485,56.028143],[87.583595,56.028926],[87.58434,56.029394],[87.585262,56.029982],[87.585503,56.030115],[87.585982,56.030402],[87.586855,56.030881],[87.587821,56.031377],[87.594233,56.034437],[87.596808,56.035889],[87.598903,56.037394],[87.600662,56.038656],[87.60567,56.042789],[87.627218,56.060562],[87.630003,56.062828],[87.631458,56.064108],[87.631722,56.064492],[87.631863,56.064756],[87.632964,56.067062],[87.633247,56.067614],[87.635006,56.070571],[87.635035,56.07062],[87.636127,56.072181],[87.637603,56.074035],[87.641388,56.078169],[87.647491,56.084448],[87.650626,56.087735],[87.653971,56.09114],[87.655496,56.092711],[87.660062,56.097425],[87.667623,56.105226],[87.667996,56.105626],[87.6686,56.1063],[87.669238,56.107047],[87.669891,56.10787],[87.671022,56.10888],[87.672033,56.110179],[87.672502,56.110715],[87.672905,56.111065],[87.673559,56.111478],[87.674244,56.111813],[87.676417,56.112689],[87.677303,56.112947],[87.678235,56.113162],[87.682585,56.113938],[87.69823,56.116664],[87.708623,56.118581],[87.712827,56.119653],[87.712963,56.119688],[87.71587,56.120696],[87.717923,56.121485],[87.719207,56.122013],[87.721195,56.123016],[87.72308,56.124058],[87.73436,56.130802],[87.741592,56.135125],[87.750044,56.140332],[87.759131,56.145583],[87.762318,56.147507],[87.772235,56.153379],[87.7733,56.154009],[87.775584,56.155521],[87.776572,56.156223],[87.778251,56.157182],[87.779919,56.158057],[87.781839,56.15894],[87.782956,56.159398],[87.784453,56.159979],[87.786137,56.160522],[87.788381,56.161207],[87.790906,56.161809],[87.792934,56.162212],[87.794934,56.162544],[87.813993,56.164645],[87.815593,56.164854],[87.817132,56.165111],[87.818761,56.165429],[87.820537,56.165869],[87.821781,56.166193],[87.822889,56.166542],[87.82424,56.167015],[87.825685,56.167575],[87.826976,56.168123],[87.828524,56.16885],[87.829819,56.169563],[87.829824,56.169566],[87.831045,56.170317],[87.833042,56.171816],[87.834527,56.173189],[87.842001,56.181866],[87.842957,56.182764],[87.843664,56.183333],[87.845042,56.184107],[87.846309,56.184693],[87.84772,56.185154],[87.849512,56.185606],[87.856058,56.187078],[87.858192,56.187427],[87.861197,56.187816],[87.864677,56.188045],[87.867973,56.18815],[87.883749,56.188721],[87.886972,56.188881],[87.888624,56.189045],[87.890196,56.189239],[87.892684,56.189617],[87.896289,56.190396],[87.899681,56.191385],[87.903943,56.193059],[87.905376,56.193572],[87.906429,56.193905],[87.907088,56.194102],[87.907866,56.194297],[87.908564,56.19443],[87.909223,56.194532],[87.910136,56.194626],[87.911176,56.194614],[87.994855,56.193653],[87.996292,56.193625],[87.997876,56.193541],[88.00238,56.193193],[88.006166,56.192877],[88.012886,56.192316],[88.034086,56.190586],[88.035749,56.190468],[88.036154,56.190462],[88.036489,56.190457],[88.037323,56.190475],[88.037943,56.190519],[88.03835,56.190562],[88.039064,56.190644],[88.039557,56.190727],[88.040408,56.190908],[88.040826,56.191017],[88.041201,56.191141],[88.04177,56.191329],[88.042159,56.191478],[88.042645,56.191683],[88.04335,56.192035],[88.045632,56.193368],[88.046456,56.193787],[88.046957,56.194003],[88.047982,56.194348],[88.049189,56.194664],[88.050289,56.194849],[88.05145,56.194958],[88.05263,56.194994],[88.053523,56.194955],[88.053741,56.194946],[88.069568,56.193421],[88.071558,56.193226],[88.089737,56.191406],[88.091585,56.191218],[88.093182,56.191102],[88.094868,56.191032],[88.096661,56.191029],[88.098798,56.191106],[88.100533,56.191234],[88.102599,56.191473],[88.104474,56.191778],[88.106549,56.192182],[88.14324,56.199072],[88.151712,56.200684],[88.15495,56.201258],[88.155753,56.201405],[88.157529,56.201706],[88.158116,56.201667],[88.16067,56.201948],[88.162526,56.202061],[88.164414,56.201966],[88.16641,56.201667],[88.168169,56.201267],[88.169581,56.200831],[88.171045,56.200259],[88.175367,56.198314],[88.175938,56.198035],[88.176538,56.197656],[88.179022,56.19579],[88.179334,56.195588],[88.179549,56.195495],[88.179788,56.195434],[88.180028,56.19544],[88.180268,56.195485],[88.180572,56.195609],[88.180641,56.195634],[88.181264,56.195859],[88.181676,56.19601],[88.182246,56.196246],[88.182832,56.19638],[88.183344,56.196422],[88.183894,56.19642],[88.184374,56.196361],[88.184823,56.19627],[88.185423,56.196081],[88.185963,56.195828],[88.186638,56.195476],[88.192191,56.192463],[88.193313,56.191993],[88.207259,56.184587],[88.208224,56.184092],[88.20894,56.183786],[88.209843,56.183436],[88.210804,56.183115],[88.211955,56.182795],[88.213135,56.182552],[88.214565,56.182311],[88.214768,56.182277],[88.249554,56.177172],[88.250498,56.177034],[88.266416,56.174706],[88.2705,56.174092],[88.272829,56.173809],[88.275408,56.173579],[88.280613,56.173331],[88.28455,56.173226],[88.286683,56.173271],[88.289475,56.173394],[88.297888,56.173924],[88.306346,56.174383],[88.307844,56.174486],[88.309744,56.174697],[88.315086,56.175356],[88.321948,56.176239],[88.32449,56.176559],[88.325957,56.176731],[88.327182,56.176734],[88.328419,56.176626],[88.32958,56.176429],[88.330711,56.17613],[88.332096,56.175717],[88.33644,56.174385],[88.339778,56.173383],[88.342468,56.172575],[88.343088,56.172389],[88.345026,56.171925],[88.347412,56.171441],[88.352454,56.170546],[88.352655,56.17051],[88.40859,56.160483],[88.408798,56.160446],[88.434259,56.15587],[88.436326,56.155482],[88.437369,56.155323],[88.437793,56.155286],[88.438473,56.155228],[88.451844,56.154407],[88.47225,56.153194],[88.481225,56.152666],[88.481604,56.152644],[88.492621,56.151996],[88.501931,56.151455],[88.504825,56.151271],[88.506215,56.151139],[88.507201,56.150973],[88.507938,56.150795],[88.508621,56.150571],[88.509439,56.150251],[88.510349,56.14982],[88.511475,56.149177],[88.512337,56.148809],[88.512723,56.148679],[88.51335,56.148514],[88.51457,56.148317],[88.51563,56.148221],[88.516714,56.148256],[88.517706,56.148374],[88.522239,56.149196],[88.527263,56.150153],[88.528587,56.150399],[88.529599,56.150587],[88.533301,56.151273],[88.53466,56.151525],[88.536388,56.151798],[88.538824,56.152182],[88.540142,56.152279],[88.541316,56.152239],[88.544073,56.151898],[88.545476,56.151817],[88.546614,56.151875],[88.547489,56.152057],[88.548049,56.152201],[88.54888,56.152505],[88.549915,56.152981],[88.552162,56.154414],[88.553167,56.154974],[88.554138,56.155303],[88.555246,56.155588],[88.556196,56.155713],[88.557407,56.155775],[88.559122,56.155769],[88.564095,56.155588],[88.570491,56.155407],[88.571952,56.155355],[88.573139,56.155313],[88.574049,56.155281],[88.583175,56.154897],[88.593484,56.154367],[88.604148,56.153871],[88.60569,56.153742],[88.607223,56.153554],[88.608678,56.153283],[88.610197,56.15283],[88.61092,56.152555],[88.611597,56.152234],[88.612833,56.1515],[88.6138,56.150776],[88.614429,56.150064],[88.615075,56.149119],[88.615704,56.147748],[88.616264,56.146765],[88.617521,56.145335],[88.618537,56.144289],[88.619405,56.143642],[88.619831,56.143392],[88.620837,56.142803],[88.622253,56.14202],[88.623895,56.141274],[88.625745,56.140612],[88.632975,56.13841],[88.646718,56.134172],[88.649971,56.133175],[88.651856,56.132702],[88.653825,56.132236],[88.656658,56.131745],[88.659282,56.13137],[88.670247,56.12993],[88.681481,56.128404],[88.706028,56.125111],[88.722387,56.12291],[88.725242,56.122493],[88.726652,56.122255],[88.727938,56.121978],[88.728833,56.121732],[88.730722,56.121045],[88.732153,56.120385],[88.733349,56.119678],[88.734384,56.118904],[88.735125,56.118225],[88.739017,56.114542],[88.740954,56.11268],[88.748664,56.105244],[88.750548,56.103439],[88.762123,56.092201],[88.76373,56.090614],[88.7646,56.089808],[88.765618,56.089011],[88.766377,56.088557],[88.767095,56.088222],[88.767906,56.087931],[88.768827,56.08767],[88.769398,56.08756],[88.769534,56.087534],[88.770244,56.087425],[88.771766,56.087296],[88.773905,56.087169],[88.777291,56.087061],[88.780671,56.086952],[88.783444,56.086864],[88.801774,56.086277],[88.805797,56.086148],[88.810949,56.085982],[88.812618,56.085853],[88.814051,56.085666],[88.815605,56.085346],[88.816796,56.084972],[88.818241,56.084421],[88.819733,56.083679],[88.82655,56.079842],[88.827996,56.07903],[88.834957,56.075121],[88.837187,56.073846],[88.83807,56.073388],[88.838905,56.073052],[88.839708,56.072809],[88.840592,56.07258],[88.842343,56.072316],[88.842377,56.072311],[88.847611,56.071555],[88.850044,56.071163],[88.85229,56.070717],[88.854303,56.0702],[88.85787,56.069097],[88.85933,56.068619],[88.860642,56.06824],[88.861926,56.068027],[88.863285,56.067944],[88.86502,56.067943],[88.868265,56.06801],[88.877554,56.068251],[88.881888,56.068339],[88.883335,56.068381],[88.88438,56.068349],[88.885985,56.068202],[88.887412,56.067967],[88.891527,56.067292],[88.892709,56.067124],[88.893673,56.066979],[88.894773,56.066885],[88.895875,56.066832],[88.896869,56.066814],[88.898057,56.066882],[88.899657,56.067055],[88.90071,56.067198],[88.902555,56.067515],[88.903744,56.067727],[88.904867,56.067922],[88.908259,56.068553],[88.908614,56.068626],[88.909,56.068687],[88.909552,56.068761],[88.910282,56.068842],[88.910975,56.06892],[88.911563,56.068979],[88.913135,56.06914],[88.914674,56.0693],[88.915916,56.069425],[88.91805,56.069647],[88.918898,56.06973],[88.919325,56.069783],[88.919615,56.069822],[88.91992,56.069871],[88.920243,56.069941],[88.920501,56.069999],[88.923613,56.070646],[88.924429,56.070802],[88.927029,56.071314],[88.928645,56.071631],[88.930561,56.072006],[88.932104,56.072305],[88.932662,56.072421],[88.933391,56.072574],[88.934043,56.072699],[88.934711,56.072816],[88.935392,56.072911],[88.935999,56.072989],[88.936617,56.073044],[88.937292,56.073078],[88.937936,56.073089],[88.938594,56.073089],[88.939378,56.073062],[88.939925,56.073029],[88.940405,56.072985],[88.941099,56.0729],[88.941657,56.072826],[88.942131,56.072745],[88.942709,56.072628],[88.9432,56.072527],[88.943678,56.072406],[88.944386,56.072203],[88.945044,56.071987],[88.9455,56.071811],[88.945951,56.071634],[88.946479,56.071394],[88.946851,56.071211],[88.947226,56.071012],[88.947672,56.070755],[88.948036,56.070512],[88.948368,56.070283],[88.948735,56.070018],[88.949031,56.069759],[88.949375,56.069422],[88.949669,56.069122],[88.949957,56.068775],[88.950174,56.068497],[88.950371,56.06818],[88.950935,56.067212],[88.95143,56.066408],[88.952578,56.064635],[88.953445,56.063598],[88.954419,56.062618],[88.955262,56.061934],[88.956245,56.061242],[88.957183,56.060647],[88.957788,56.060306],[88.958269,56.060034],[88.95982,56.05932],[88.961566,56.058599],[88.96333,56.058068],[88.965249,56.057588],[88.967917,56.057089],[88.968814,56.056943],[88.969761,56.056798],[88.975596,56.055894],[88.988251,56.053923],[89.012458,56.050101],[89.015253,56.04971],[89.018531,56.049391],[89.021029,56.049239],[89.023528,56.049148],[89.027106,56.049141],[89.060628,56.049509],[89.07441,56.049644],[89.076349,56.049718],[89.077802,56.049831],[89.079553,56.050067],[89.080485,56.050243],[89.081742,56.05055],[89.082608,56.050786],[89.083696,56.051175],[89.084625,56.051554],[89.085551,56.052003],[89.08669,56.052628],[89.087437,56.053149],[89.088424,56.053913],[89.089545,56.055099],[89.096595,56.064312],[89.09686,56.064657],[89.102519,56.072059],[89.106127,56.076315],[89.106306,56.076523],[89.106704,56.076985],[89.106978,56.077302],[89.108404,56.078956],[89.110017,56.080826],[89.112063,56.083155],[89.11375,56.085068],[89.114736,56.086043],[89.115799,56.086854],[89.117222,56.087668],[89.118475,56.088252],[89.119534,56.088691],[89.119617,56.088725],[89.122667,56.089584],[89.126691,56.090623],[89.1307,56.091661],[89.132649,56.092173],[89.134443,56.092646],[89.136046,56.093007],[89.137699,56.093327],[89.14415,56.094401],[89.150708,56.0955],[89.158087,56.096699],[89.159579,56.096941],[89.161455,56.097191],[89.163318,56.09734],[89.165409,56.097483],[89.168302,56.097557],[89.16988,56.097632],[89.171541,56.097761],[89.173219,56.097942],[89.175276,56.098267],[89.183032,56.099623],[89.185725,56.100143],[89.189968,56.101166],[89.193498,56.102016],[89.198623,56.102968],[89.200222,56.103297],[89.205989,56.104638],[89.20892,56.105349],[89.2102,56.105696],[89.210918,56.105944],[89.2116,56.106182],[89.212788,56.106759],[89.213523,56.107169],[89.214159,56.107618],[89.215971,56.109273],[89.216992,56.110058],[89.2185,56.110857],[89.219829,56.111491],[89.220745,56.11184],[89.221709,56.11215],[89.230245,56.114434],[89.233334,56.115203],[89.235173,56.115567],[89.237382,56.115929],[89.23959,56.116187],[89.241063,56.116314],[89.242089,56.11639],[89.243757,56.116467],[89.243968,56.116471],[89.245024,56.116493],[89.245468,56.116503],[89.246043,56.116493],[89.247049,56.116475],[89.249965,56.116396],[89.250849,56.116399],[89.251387,56.116401],[89.251507,56.116401],[89.255041,56.116628],[89.255763,56.116674],[89.256293,56.116708],[89.259366,56.116905],[89.262733,56.117096],[89.264624,56.11723],[89.266452,56.117462],[89.267938,56.117712],[89.269349,56.118052],[89.27075,56.118426],[89.272037,56.118779],[89.282896,56.121741],[89.285654,56.12252],[89.292805,56.12443],[89.292985,56.124478],[89.300812,56.126679],[89.303708,56.127727],[89.306114,56.128688],[89.309351,56.130168],[89.315209,56.13291],[89.317353,56.133781],[89.318032,56.134052],[89.319939,56.134727],[89.321558,56.135267],[89.32441,56.136035],[89.355372,56.143433],[89.356916,56.143825],[89.359117,56.144214],[89.361468,56.144505],[89.363594,56.144682],[89.365835,56.144737],[89.368332,56.144734],[89.374753,56.144705],[89.376566,56.144664],[89.378142,56.144697],[89.379459,56.144825],[89.380529,56.144969],[89.382102,56.145277],[89.383068,56.145564],[89.384398,56.146068],[89.38842,56.147716],[89.391178,56.148814],[89.394654,56.149904],[89.396642,56.150451],[89.398059,56.15084],[89.404076,56.152452],[89.414382,56.155279],[89.418895,56.156299],[89.423631,56.15706],[89.429112,56.157888],[89.444417,56.16025],[89.451387,56.161297],[89.454193,56.161731],[89.458457,56.162384],[89.460636,56.162691],[89.462866,56.162914],[89.465346,56.163123],[89.468039,56.163229],[89.468297,56.163239],[89.474661,56.163492],[89.483386,56.163829],[89.495311,56.164288],[89.512184,56.164951],[89.51918,56.165224],[89.520767,56.165314],[89.522888,56.165456],[89.526415,56.165806],[89.527817,56.165941],[89.529857,56.166138],[89.53325,56.166466],[89.534305,56.166611],[89.534567,56.166646],[89.535485,56.166797],[89.535773,56.166861],[89.536382,56.166995],[89.537725,56.167328],[89.538749,56.167689],[89.53965,56.168074],[89.540823,56.168649],[89.542808,56.169915],[89.543796,56.170578],[89.555687,56.178536],[89.559244,56.181029],[89.560519,56.182028],[89.561948,56.183155],[89.562341,56.183456],[89.562657,56.183726],[89.562844,56.183886],[89.56323,56.184194],[89.563442,56.184359],[89.56382,56.184591],[89.564393,56.184906],[89.564951,56.185129],[89.565398,56.185307],[89.566345,56.185609],[89.566519,56.185665],[89.567953,56.185977],[89.569377,56.186243],[89.570457,56.186403],[89.571806,56.18647],[89.572918,56.186449],[89.574025,56.18638],[89.57524,56.18623],[89.584351,56.184153],[89.600932,56.180188],[89.602847,56.179865],[89.604607,56.179641],[89.605885,56.179516],[89.606264,56.179479],[89.609074,56.179218],[89.609349,56.179193],[89.611792,56.178967],[89.613104,56.17885],[89.617424,56.178473],[89.619509,56.178369],[89.620569,56.178364],[89.624436,56.178603],[89.62703,56.17881],[89.629325,56.178994],[89.630699,56.179076],[89.632034,56.179073],[89.633391,56.179018],[89.634492,56.178911],[89.635341,56.178773],[89.637095,56.178437],[89.63883,56.178123],[89.640762,56.177841],[89.642756,56.177598],[89.645219,56.177374],[89.64717,56.177293],[89.647908,56.177262],[89.651076,56.17736],[89.654049,56.177567],[89.661021,56.178467],[89.66886,56.179494],[89.682081,56.181281],[89.684662,56.181654],[89.686888,56.182038],[89.68957,56.182637],[89.709062,56.187592],[89.721865,56.190848],[89.724703,56.191672],[89.732521,56.194241],[89.734831,56.195018],[89.735895,56.195293],[89.737112,56.19553],[89.73841,56.195673],[89.739656,56.195756],[89.743004,56.195846],[89.745122,56.195942],[89.747522,56.196102],[89.749928,56.196358],[89.751109,56.196497],[89.756441,56.197323],[89.758926,56.197725],[89.760655,56.197915],[89.762788,56.198035],[89.77041,56.198222],[89.771699,56.198283],[89.772921,56.198385],[89.774492,56.198629],[89.778571,56.199319],[89.780293,56.199617],[89.781802,56.199851],[89.783984,56.200162],[89.785416,56.200347],[89.786977,56.200519],[89.788224,56.200643],[89.789786,56.200789],[89.791268,56.200901],[89.792562,56.20097],[89.796756,56.201106],[89.800886,56.201241],[89.804177,56.201394],[89.811477,56.201733],[89.832423,56.202817],[89.832573,56.202825],[89.85171,56.203765],[89.854195,56.203881],[89.857946,56.204058],[89.859625,56.204107],[89.868441,56.204157],[89.870774,56.204262],[89.872269,56.204384],[89.873375,56.204488],[89.893603,56.20666],[89.89479,56.206787],[89.916209,56.209106],[89.95353,56.213898],[89.954728,56.214074],[89.956177,56.214298],[89.958243,56.214641],[89.959878,56.214943],[89.961319,56.215236],[90.004215,56.223931],[90.004406,56.22397],[90.009551,56.225018],[90.012197,56.225539],[90.013762,56.225838],[90.014326,56.225946],[90.01476,56.226036],[90.014902,56.226065],[90.021333,56.22754],[90.028052,56.22915],[90.04176,56.232429],[90.04609,56.233438],[90.048071,56.233842],[90.049896,56.23418],[90.05822,56.235556],[90.062637,56.236284],[90.063584,56.23644],[90.066597,56.237006],[90.067669,56.237262],[90.068837,56.237586],[90.069331,56.237739],[90.069978,56.237939],[90.07123,56.238354],[90.072437,56.238837],[90.073894,56.239503],[90.074891,56.240033],[90.075766,56.24055],[90.077462,56.241772],[90.080316,56.244303],[90.087481,56.250848],[90.091488,56.254442],[90.091605,56.254547],[90.092106,56.254997],[90.09401,56.25667],[90.095911,56.258148],[90.097447,56.25927],[90.099072,56.260385],[90.101146,56.261678],[90.103203,56.262889],[90.105464,56.264137],[90.107826,56.265322],[90.110307,56.266525],[90.112034,56.267316],[90.112144,56.267367],[90.113935,56.268092],[90.11647,56.269031],[90.117523,56.269382],[90.118585,56.269709],[90.120185,56.270151],[90.121742,56.270557],[90.123185,56.270922],[90.124953,56.271317],[90.125801,56.271476],[90.126619,56.271629],[90.128176,56.271901],[90.131857,56.272438],[90.133772,56.272719],[90.135583,56.272979],[90.140371,56.273691],[90.143924,56.274204],[90.145271,56.274397],[90.146714,56.27467],[90.14796,56.274965],[90.149167,56.275306],[90.15061,56.275778],[90.153406,56.276884],[90.156161,56.277956],[90.164128,56.281093],[90.165677,56.28164],[90.166719,56.281955],[90.16754,56.282176],[90.168257,56.282331],[90.169411,56.282547],[90.170706,56.282739],[90.171426,56.282819],[90.172103,56.28288],[90.187464,56.284035],[90.187687,56.284052],[90.191308,56.284309],[90.195144,56.284551],[90.202675,56.284999],[90.222176,56.286144],[90.226084,56.286364],[90.226398,56.286377],[90.227705,56.286432],[90.229883,56.286524],[90.234652,56.286655],[90.241152,56.286835],[90.250517,56.287083],[90.252113,56.287143],[90.253669,56.287234],[90.267007,56.288163],[90.27499,56.288684],[90.276448,56.288787],[90.278502,56.288983],[90.282225,56.28936],[90.285875,56.289725],[90.285961,56.289734],[90.287031,56.289819],[90.288807,56.289961],[90.295395,56.290478],[90.297802,56.290643],[90.301981,56.290954],[90.303526,56.29106],[90.303625,56.291067],[90.305329,56.291142],[90.3158,56.291573],[90.3179,56.291655],[90.318305,56.29167],[90.318514,56.291678],[90.328256,56.292056],[90.335281,56.292365],[90.340574,56.292641],[90.344132,56.292783],[90.345769,56.292723],[90.346816,56.292608],[90.346909,56.29259],[90.347675,56.292443],[90.348617,56.292211],[90.349467,56.29196],[90.350255,56.291643],[90.351084,56.291239],[90.351785,56.29078],[90.351786,56.29078],[90.352352,56.290355],[90.352659,56.290063],[90.353036,56.289644],[90.353308,56.289239],[90.353565,56.288814],[90.353804,56.288162],[90.35423,56.285712],[90.35454,56.283952],[90.354685,56.283131],[90.355242,56.280148],[90.355826,56.27666],[90.356268,56.273544],[90.356718,56.272229],[90.357285,56.271178],[90.357755,56.270539],[90.358286,56.269989],[90.358897,56.269427],[90.359803,56.268722],[90.36033,56.268363],[90.360902,56.26803],[90.360958,56.267997],[90.362079,56.267431],[90.363334,56.266887],[90.364416,56.266497],[90.36574,56.266129],[90.366344,56.265995],[90.367005,56.265848],[90.368045,56.265685],[90.369411,56.265514],[90.371077,56.265365],[90.375881,56.264937],[90.389185,56.263698],[90.393657,56.263284],[90.398271,56.262856],[90.400515,56.262554],[90.402331,56.262257],[90.403478,56.262044],[90.404513,56.261837],[90.405811,56.261538],[90.406579,56.261353],[90.407085,56.261232],[90.408682,56.260795],[90.410261,56.260308],[90.410642,56.260176],[90.413333,56.259246],[90.427067,56.254346],[90.427673,56.254132],[90.429902,56.253347],[90.431692,56.252714],[90.437152,56.250784],[90.439192,56.250064],[90.440683,56.249538],[90.443219,56.248631],[90.443969,56.24835],[90.44484,56.247977],[90.444928,56.247928],[90.445242,56.247754],[90.445387,56.24767],[90.446495,56.246923],[90.446606,56.246848],[90.446998,56.246584],[90.447497,56.246307],[90.448056,56.246025],[90.448664,56.245776],[90.449769,56.245323],[90.450064,56.245206],[90.450798,56.244895],[90.450904,56.24485],[90.451952,56.244402],[90.452445,56.244183],[90.452479,56.244168],[90.452578,56.244113],[90.450051,56.24218],[90.448652,56.241106],[90.448981,56.24096],[90.449375,56.240896],[90.450324,56.240774],[90.456433,56.239975],[90.458354,56.239734],[90.461567,56.239329],[90.462406,56.239245],[90.463482,56.239143],[90.463963,56.239114],[90.464697,56.239102],[90.465358,56.239109],[90.466004,56.239157],[90.466667,56.239225],[90.467311,56.239302],[90.469063,56.239513],[90.470242,56.239654],[90.473785,56.240068],[90.475954,56.240293],[90.477371,56.24045],[90.477755,56.24049],[90.478085,56.240524],[90.479342,56.240674],[90.479692,56.240716],[90.48187,56.240911],[90.482249,56.240945],[90.482422,56.240954],[90.482604,56.240962],[90.483047,56.240963],[90.484131,56.240966],[90.485963,56.240974],[90.48665,56.240951],[90.487461,56.24092],[90.488067,56.240849],[90.488191,56.240834],[90.489692,56.240604],[90.491509,56.240326],[90.492371,56.240226],[90.494085,56.240026],[90.494349,56.239988],[90.494838,56.239917],[90.495829,56.239773],[90.498579,56.239409],[90.499355,56.239315],[90.500133,56.23927],[90.501971,56.239354],[90.502365,56.239378],[90.505324,56.239592],[90.506524,56.23968],[90.5084,56.239818],[90.509031,56.239886],[90.509479,56.239981],[90.509833,56.240115],[90.510197,56.240255],[90.510448,56.240367],[90.510647,56.240472],[90.511168,56.240792],[90.511716,56.241036],[90.511955,56.241122],[90.512192,56.24119],[90.512452,56.241241],[90.512724,56.241272],[90.513013,56.241268],[90.513314,56.24124],[90.516454,56.240709],[90.517741,56.240512],[90.518616,56.240451],[90.520379,56.240461],[90.521905,56.240455],[90.522866,56.240452],[90.523407,56.240445],[90.524822,56.240427],[90.525243,56.240422],[90.525996,56.240413],[90.526398,56.240393],[90.526658,56.240366],[90.52711,56.240259],[90.528184,56.239916],[90.52891,56.239691],[90.529328,56.239864],[90.530435,56.240328],[90.531234,56.240671],[90.531747,56.240891],[90.532865,56.241409],[90.533935,56.241926],[90.5347,56.242348],[90.535065,56.242578],[90.535201,56.242718],[90.535354,56.242949],[90.535459,56.243191],[90.53556,56.243778],[90.535615,56.244654],[90.535588,56.245237],[90.535362,56.246088],[90.535281,56.246395],[90.535026,56.247317],[90.534758,56.248077],[90.534496,56.248822],[90.53338,56.252327],[90.533106,56.253924],[90.53303,56.254586],[90.533123,56.25514],[90.533341,56.25556],[90.533605,56.255873],[90.534986,56.257044],[90.535996,56.257805],[90.536423,56.258126],[90.538557,56.259476],[90.539494,56.260067],[90.540199,56.260494],[90.540427,56.260661],[90.541094,56.261151],[90.54161,56.26153],[90.542843,56.262536],[90.543126,56.262784],[90.543381,56.26303],[90.543628,56.263438],[90.543827,56.264076],[90.543862,56.264798],[90.54357,56.268157],[90.543566,56.268209],[90.543304,56.271813],[90.543113,56.273231],[90.542982,56.274447],[90.542919,56.275025],[90.543859,56.275279],[90.544212,56.275359],[90.544431,56.275395],[90.544754,56.275445],[90.545435,56.275518],[90.546228,56.275561],[90.546755,56.275555],[90.547223,56.275534],[90.549958,56.275265],[90.551652,56.275102],[90.552907,56.274969],[90.553944,56.274767],[90.555183,56.274478],[90.559264,56.273188],[90.56076,56.272801],[90.56218,56.27256],[90.562446,56.272535],[90.563361,56.272449],[90.563421,56.272444],[90.563492,56.27244],[90.563796,56.272423],[90.564349,56.272392],[90.565193,56.272344],[90.565807,56.272324],[90.568012,56.272251],[90.576163,56.271978],[90.581394,56.271803],[90.586541,56.271636],[90.587464,56.271606],[90.595828,56.271334],[90.600181,56.271195],[90.612654,56.270797],[90.620282,56.270552],[90.622785,56.270444],[90.625005,56.270269],[90.628042,56.269928],[90.630104,56.26968],[90.632175,56.269474],[90.633739,56.269356],[90.635429,56.269268],[90.637714,56.269224],[90.639926,56.269265],[90.641553,56.269361],[90.643115,56.269513],[90.645218,56.269799],[90.651185,56.270845],[90.651616,56.270927],[90.657075,56.271958],[90.677653,56.27576],[90.677888,56.275804],[90.678604,56.275934],[90.686484,56.277362],[90.697225,56.279336],[90.707807,56.281313],[90.707998,56.281349],[90.716757,56.283004],[90.719031,56.283406],[90.721178,56.283737],[90.723511,56.28407],[90.727127,56.284449],[90.73071,56.284767],[90.737269,56.285378],[90.744236,56.286051],[90.760145,56.287596],[90.763578,56.287929],[90.764824,56.288035],[90.768273,56.28836],[90.772934,56.288882],[90.774737,56.289074],[90.775838,56.289191],[90.776549,56.289267],[90.77989,56.289547],[90.780672,56.289591],[90.78091,56.289605],[90.781808,56.289656],[90.783963,56.289692],[90.786306,56.289635],[90.78686,56.289615],[90.787879,56.289569],[90.788503,56.289536],[90.79628,56.28912],[90.800049,56.28892],[90.806957,56.288553],[90.810656,56.288371],[90.819392,56.288114],[90.834346,56.287738],[90.837473,56.28767],[90.840394,56.287482],[90.84193,56.28735],[90.843315,56.287191],[90.844777,56.286962],[90.846147,56.286714],[90.848306,56.286255],[90.85885,56.284023],[90.878377,56.279881],[90.878506,56.279854],[90.884128,56.278686],[90.887561,56.278162],[90.888181,56.278096],[90.890409,56.277871],[90.897818,56.277257],[90.909409,56.276352],[90.914732,56.276015],[90.919822,56.275794],[90.922123,56.275736],[90.924983,56.275779],[90.928588,56.275899],[90.930152,56.276011],[90.931877,56.276135],[90.93505,56.276416],[90.938851,56.276898],[90.942095,56.277434],[90.948068,56.278401],[90.948192,56.278421],[90.948501,56.278471],[90.949948,56.278655],[90.95039,56.278706],[90.952093,56.278867],[90.954651,56.279011],[90.956326,56.27904],[90.957908,56.279014],[90.959758,56.278934],[90.961375,56.278829],[90.963387,56.278637],[90.965409,56.278376],[90.978092,56.276423],[90.978434,56.276369],[90.978847,56.276308],[90.983648,56.275565],[90.989785,56.274588],[90.993733,56.27373],[90.99561,56.273159],[90.995897,56.273071],[90.997836,56.272395],[90.999459,56.271728],[91.000909,56.271058],[91.002801,56.270055],[91.00625,56.267962],[91.006651,56.267719],[91.011509,56.264771],[91.011632,56.264697],[91.012393,56.264236],[91.015442,56.262391],[91.01749,56.261144],[91.018794,56.260234],[91.019383,56.259779],[91.020148,56.259158],[91.020409,56.258894],[91.020816,56.258481],[91.021362,56.257763],[91.021814,56.257039],[91.022165,56.256282],[91.022728,56.254631],[91.022863,56.254297],[91.023075,56.253769],[91.023556,56.252969],[91.024025,56.252357],[91.02467,56.25172],[91.025367,56.251122],[91.026193,56.250508],[91.027105,56.249985],[91.028103,56.249516],[91.029082,56.249108],[91.029467,56.248965],[91.030101,56.248748],[91.03069,56.248565],[91.031343,56.248383],[91.0318,56.248271],[91.032448,56.24813],[91.033379,56.247954],[91.033874,56.247871],[91.034239,56.247821],[91.03474,56.247756],[91.035418,56.247693],[91.035847,56.247653],[91.036386,56.247622],[91.036793,56.247606],[91.037655,56.247578],[91.037782,56.247579],[91.039353,56.247575],[91.041001,56.247544],[91.042502,56.247628],[91.043987,56.247807],[91.045231,56.24804],[91.046373,56.248279],[91.047937,56.248741],[91.049459,56.249264],[91.053521,56.250713],[91.055701,56.251357],[91.055804,56.251387],[91.057688,56.251838],[91.059578,56.25219],[91.064392,56.252829],[91.068256,56.253257],[91.07111,56.253448],[91.073051,56.253491],[91.074572,56.253478],[91.077275,56.253439],[91.078842,56.253405],[91.080404,56.253372],[91.081365,56.253336],[91.086288,56.253212],[91.088971,56.253147],[91.089647,56.253135],[91.091245,56.25311],[91.093831,56.252945],[91.095729,56.252693],[91.098035,56.252327],[91.100261,56.251807],[91.102545,56.251134],[91.106953,56.249609],[91.115989,56.246442],[91.117158,56.246033],[91.117904,56.245768],[91.12126,56.24458],[91.12278,56.243982],[91.124684,56.243085],[91.126381,56.242179],[91.131277,56.239427],[91.133122,56.238115],[91.134394,56.237096],[91.134487,56.237012],[91.135686,56.235897],[91.138286,56.232826],[91.13971,56.231157],[91.140778,56.230045],[91.141561,56.22934],[91.142767,56.228328],[91.143642,56.227647],[91.143905,56.22747],[91.145365,56.226491],[91.14718,56.225435],[91.148529,56.224709],[91.149635,56.224112],[91.152576,56.222305],[91.153191,56.221915],[91.155891,56.220197],[91.156865,56.219602],[91.157003,56.219518],[91.157119,56.219456],[91.158336,56.218802],[91.159267,56.218324],[91.160252,56.217866],[91.161448,56.217371],[91.162917,56.21682],[91.164334,56.216354],[91.166202,56.215837],[91.169977,56.214971],[91.171782,56.214529],[91.173555,56.214032],[91.17495,56.213597],[91.178005,56.212536],[91.178269,56.212444],[91.181362,56.211294],[91.184488,56.210029],[91.185201,56.209738],[91.187427,56.208831],[91.189007,56.208227],[91.190247,56.207859],[91.191506,56.207552],[91.193037,56.207258],[91.194555,56.207062],[91.196685,56.206927],[91.199564,56.206936],[91.203054,56.206966],[91.205812,56.207093],[91.206555,56.207163],[91.20793,56.207293],[91.208476,56.207365],[91.209912,56.207552],[91.210301,56.207599],[91.214594,56.208124],[91.215259,56.208205],[91.217748,56.208469],[91.220725,56.20863],[91.223795,56.208637],[91.226158,56.208545],[91.228223,56.208369],[91.230354,56.208126],[91.232232,56.207859],[91.232283,56.207852],[91.234616,56.207403],[91.236935,56.206835],[91.23932,56.206172],[91.241505,56.205462],[91.243245,56.204879],[91.244187,56.204647],[91.24492,56.204501],[91.24621,56.204306],[91.247721,56.204156],[91.249069,56.204066],[91.251297,56.204095],[91.252082,56.204141],[91.252632,56.204177],[91.253769,56.204247],[91.256883,56.204427],[91.261109,56.204689],[91.262185,56.204678],[91.26345,56.204583],[91.264651,56.204429],[91.265606,56.204257],[91.266333,56.204107],[91.267057,56.203914],[91.267779,56.203636],[91.268084,56.203508],[91.268413,56.203369],[91.269975,56.202591],[91.270761,56.202044],[91.273987,56.199224],[91.275558,56.197898],[91.277146,56.196737],[91.278655,56.195818],[91.280236,56.194946],[91.282184,56.194054],[91.28296,56.193729],[91.284099,56.193251],[91.28607,56.192569],[91.288374,56.191928],[91.289932,56.191544],[91.291489,56.191198],[91.30562,56.188791],[91.31532,56.187128],[91.31945,56.186437],[91.320796,56.186262],[91.32122,56.186207],[91.323497,56.186014],[91.325726,56.185872],[91.328528,56.185793],[91.332984,56.185945],[91.336359,56.186254],[91.34006,56.186762],[91.345996,56.18797],[91.35169,56.189264],[91.355486,56.189933],[91.357412,56.190182],[91.359284,56.190387],[91.361415,56.190526],[91.364136,56.190648],[91.366385,56.190647],[91.368445,56.190605],[91.370642,56.190456],[91.372925,56.190257],[91.374861,56.190037],[91.376597,56.189759],[91.378366,56.189436],[91.383362,56.188451],[91.387238,56.187655],[91.389292,56.187262],[91.391702,56.186876],[91.393743,56.186591],[91.396248,56.18639],[91.398957,56.186233],[91.401868,56.186186],[91.402287,56.186187],[91.403515,56.186175],[91.416441,56.186078],[91.421556,56.186039],[91.426117,56.185914],[91.428215,56.185765],[91.430117,56.18558],[91.432598,56.185236],[91.435098,56.184795],[91.437025,56.184361],[91.438476,56.18401],[91.440647,56.183449],[91.443186,56.182743],[91.45576,56.179208],[91.457555,56.178835],[91.459197,56.178516],[91.460337,56.178307],[91.46277,56.177953],[91.46452,56.17776],[91.467175,56.177572],[91.468906,56.177503],[91.470553,56.17747],[91.484099,56.177401],[91.490908,56.17731],[91.497963,56.177188],[91.508138,56.177023],[91.509993,56.177026],[91.511443,56.177029],[91.513142,56.177102],[91.51494,56.177293],[91.516249,56.177528],[91.517498,56.177852],[91.519146,56.178454],[91.520536,56.179223],[91.521939,56.180211],[91.523557,56.181683],[91.524179,56.182181],[91.524743,56.182581],[91.525066,56.182785],[91.525259,56.182907],[91.52607,56.183311],[91.527146,56.183756],[91.528721,56.184264],[91.531165,56.184989],[91.532728,56.185422],[91.534252,56.185784],[91.535966,56.186046],[91.537299,56.18623],[91.538684,56.186327],[91.5446,56.186586],[91.546688,56.186699],[91.548715,56.186851],[91.555989,56.187489],[91.561886,56.187999],[91.563186,56.188071],[91.564513,56.188072],[91.565589,56.18802],[91.566561,56.187919],[91.567783,56.18774],[91.569108,56.187499],[91.578326,56.185609],[91.579158,56.185435],[91.593711,56.182507],[91.594079,56.182433],[91.596394,56.181879],[91.600943,56.180498],[91.603525,56.179714],[91.604739,56.179407],[91.605935,56.179164],[91.607246,56.178957],[91.608701,56.178804],[91.609912,56.178731],[91.611414,56.178729],[91.612839,56.178795],[91.614345,56.17894],[91.616082,56.179202],[91.617782,56.179532],[91.627892,56.181469],[91.634548,56.182741],[91.636264,56.183169],[91.638665,56.183863],[91.640636,56.184584],[91.643309,56.185739],[91.645711,56.186984],[91.645961,56.187114],[91.647053,56.18756],[91.648182,56.187944],[91.649517,56.188249],[91.651507,56.188595],[91.654118,56.189041],[91.654874,56.189171],[91.656924,56.189597],[91.658898,56.190101],[91.661324,56.19072],[91.663236,56.191169],[91.665058,56.191532],[91.666528,56.191792],[91.668234,56.192033],[91.6763,56.193006],[91.680407,56.193501],[91.682313,56.193764],[91.684153,56.19405],[91.687374,56.19466],[91.689863,56.195233],[91.695217,56.19669],[91.702179,56.198534],[91.70447,56.199072],[91.707075,56.199573],[91.709819,56.199984],[91.711689,56.200185],[91.71494,56.200408],[91.717412,56.200438],[91.719775,56.200438],[91.724067,56.200462],[91.728058,56.200294],[91.739216,56.199721],[91.742048,56.199721],[91.743722,56.199889],[91.746039,56.200271],[91.748386,56.200958],[91.748919,56.201144],[91.749251,56.201274],[91.753951,56.203232],[91.754885,56.203631],[91.755907,56.204044],[91.757455,56.20468],[91.757487,56.204693],[91.758449,56.205092],[91.759858,56.205758],[91.760608,56.206152],[91.761001,56.206362],[91.761291,56.20653],[91.762149,56.207066],[91.762958,56.207567],[91.763317,56.207799],[91.763955,56.208185],[91.7648,56.208655],[91.76525,56.208889],[91.76576,56.209124],[91.76639,56.209407],[91.766994,56.209659],[91.767578,56.209887],[91.768528,56.210229],[91.769166,56.210444],[91.770118,56.210733],[91.77165,56.211208],[91.773198,56.211694],[91.774818,56.212199],[91.776507,56.212723],[91.784277,56.215117],[91.787839,56.216143],[91.791058,56.216859],[91.793246,56.217122],[91.796637,56.217241],[91.799512,56.217169],[91.804619,56.216907],[91.81067,56.216597],[91.813459,56.21662],[91.816335,56.216764],[91.820025,56.217145],[91.834488,56.219245],[91.837234,56.219603],[91.839166,56.219603],[91.841226,56.219388],[91.843543,56.218863],[91.84586,56.218506],[91.847792,56.218458],[91.84968,56.218601],[91.851954,56.219078],[91.8541,56.219866],[91.856718,56.220868],[91.85792,56.22113],[91.860452,56.221512],[91.866031,56.221894],[91.86882,56.222109],[91.870837,56.222132],[91.872725,56.221989],[91.874742,56.221727],[91.880965,56.220367],[91.892535,56.217856],[91.894217,56.217634],[91.896243,56.217456],[91.89856,56.217384],[91.901693,56.217527],[91.904697,56.217909],[91.906671,56.218243],[91.909118,56.21884],[91.915282,56.220627],[91.923273,56.222945],[91.924868,56.223349],[91.926442,56.223619],[91.927697,56.223727],[91.929116,56.223731],[91.932254,56.223565],[91.93284,56.223501],[91.93318,56.223462],[91.933474,56.223427],[91.933476,56.223427],[91.933668,56.22339],[91.933883,56.223339],[91.934087,56.223264],[91.934517,56.223132],[91.934624,56.223085],[91.93483,56.222992],[91.935005,56.222932],[91.935211,56.222882],[91.935386,56.222855],[91.935596,56.222824],[91.935954,56.222774],[91.936236,56.222751],[91.936706,56.222735],[91.937013,56.222729],[91.93734,56.222731],[91.937617,56.222741],[91.937953,56.222767],[91.938179,56.222811],[91.938355,56.222861],[91.938743,56.222953],[91.939039,56.223004],[91.939269,56.223038],[91.939465,56.223056],[91.93966,56.223069],[91.939918,56.22308],[91.940344,56.223086],[91.940873,56.223093],[91.942636,56.222982],[91.947153,56.222699],[91.962143,56.221104],[91.978452,56.219443],[91.979836,56.219265],[91.981189,56.219044],[91.99376,56.216761],[91.9957,56.216459],[91.997687,56.216196],[91.999569,56.216037],[92.00147,56.215912],[92.002963,56.215851],[92.004471,56.215826],[92.006078,56.215831],[92.007685,56.215867],[92.009902,56.21598],[92.01211,56.216158],[92.014798,56.216461],[92.017451,56.216834],[92.01929,56.21715],[92.021109,56.217508],[92.023748,56.21804],[92.024704,56.218175],[92.025467,56.218295],[92.026334,56.218396],[92.027419,56.218454],[92.028748,56.21844],[92.029977,56.218351],[92.030974,56.21819],[92.03227,56.217877],[92.03396,56.217266],[92.036498,56.216025],[92.037998,56.215537],[92.039592,56.215205],[92.041094,56.215044],[92.042595,56.214997],[92.044022,56.215096],[92.045646,56.215354],[92.047219,56.215785],[92.048729,56.216427],[92.05201,56.218472],[92.053299,56.219225],[92.053732,56.219414],[92.054468,56.219714],[92.055477,56.220029],[92.057434,56.220545],[92.060609,56.221226],[92.071974,56.223824],[92.076252,56.224737],[92.07859,56.225353],[92.084482,56.227172],[92.102193,56.232467],[92.107538,56.234065],[92.107601,56.234084],[92.112256,56.235452],[92.114983,56.236183],[92.116842,56.236561],[92.117648,56.236708],[92.118512,56.236754],[92.121346,56.236793],[92.124024,56.23678],[92.125557,56.236739],[92.127043,56.23659],[92.133954,56.235758],[92.134829,56.2357],[92.136975,56.235596],[92.141753,56.23541],[92.143144,56.235382],[92.144287,56.235357],[92.147516,56.235283],[92.149222,56.235204],[92.15125,56.235003],[92.153741,56.234618],[92.157856,56.233816],[92.16233,56.232909],[92.164033,56.23257],[92.164562,56.232465],[92.165456,56.232287],[92.167282,56.231973],[92.169454,56.231599],[92.170925,56.231268],[92.175461,56.230008],[92.176135,56.229821],[92.183019,56.227836],[92.185196,56.227307],[92.188473,56.226668],[92.193805,56.225761],[92.194185,56.225698],[92.197075,56.225204],[92.215613,56.221966],[92.224403,56.220458],[92.230831,56.219184],[92.240257,56.217315],[92.249079,56.215566],[92.269267,56.211496],[92.289524,56.207541],[92.297268,56.206031],[92.307849,56.203987],[92.309691,56.203631],[92.31029,56.203514],[92.311765,56.203238],[92.312409,56.203124],[92.313104,56.203027],[92.314665,56.202909],[92.315351,56.202883],[92.316862,56.202932],[92.318032,56.203031],[92.319056,56.203169],[92.320538,56.203459],[92.322396,56.203836],[92.33361,56.205934],[92.335952,56.206378],[92.337811,56.206796],[92.338664,56.207013],[92.339735,56.207329],[92.341437,56.207892],[92.34411,56.209034],[92.34421,56.209082],[92.344261,56.209105],[92.345972,56.209981],[92.34929,56.211738],[92.350727,56.212411],[92.351639,56.212744],[92.352556,56.213047],[92.35338,56.213264],[92.354582,56.213546],[92.35623,56.213822],[92.359385,56.214185],[92.373934,56.215857],[92.378162,56.216331],[92.38701,56.216914],[92.39162,56.217256],[92.39177,56.217279],[92.395005,56.217718],[92.395836,56.217808],[92.396578,56.217868],[92.397907,56.217954],[92.398697,56.217966],[92.399491,56.217975],[92.400927,56.217933],[92.401368,56.217899],[92.403602,56.217725],[92.404919,56.217623],[92.408652,56.21736],[92.410843,56.217334],[92.417064,56.217408],[92.419295,56.217289],[92.42705,56.216773],[92.428434,56.216681],[92.430088,56.216567],[92.433198,56.21633],[92.434619,56.216202],[92.436508,56.216009],[92.437965,56.215812],[92.44039,56.215307],[92.443414,56.214568],[92.446747,56.21382],[92.44825,56.213483],[92.449549,56.213125],[92.451612,56.212355],[92.451931,56.212241],[92.454492,56.21133],[92.458596,56.209867],[92.46091,56.209242],[92.46429,56.208384],[92.466265,56.207796],[92.468179,56.207078],[92.47045,56.206024],[92.477955,56.202016],[92.47824,56.201851],[92.478416,56.201751],[92.478896,56.201458],[92.479677,56.200939],[92.480022,56.200711],[92.480238,56.20056],[92.480897,56.2001],[92.48178,56.199483],[92.48354,56.198194],[92.484655,56.197573],[92.492363,56.194867],[92.49268,56.194755],[92.493299,56.194523],[92.494526,56.194063],[92.496028,56.193681],[92.497302,56.193504],[92.498301,56.193475],[92.498948,56.193493],[92.499482,56.193527],[92.500152,56.193578],[92.501304,56.193698],[92.506458,56.194361],[92.507764,56.194486],[92.508793,56.194541],[92.509928,56.194552],[92.511497,56.194528],[92.513983,56.19435],[92.515761,56.194151],[92.517039,56.193941],[92.518183,56.193744],[92.521234,56.19308],[92.529373,56.191317],[92.531704,56.190843],[92.538311,56.189498],[92.540895,56.189012],[92.541498,56.188899],[92.543318,56.18858],[92.544504,56.188395],[92.546609,56.188059],[92.547844,56.187869],[92.548937,56.187679],[92.54993,56.187499],[92.553294,56.186826],[92.556262,56.186223],[92.556917,56.186078],[92.557841,56.185873],[92.569367,56.182919],[92.574914,56.181492],[92.57545,56.181343],[92.575742,56.181257],[92.576329,56.181067],[92.580882,56.179357],[92.585254,56.177747],[92.586563,56.17731],[92.587383,56.177073],[92.58756,56.177024],[92.588128,56.176892],[92.588624,56.176794],[92.589304,56.17666],[92.590324,56.176521],[92.591056,56.176435],[92.592093,56.17638],[92.593038,56.176345],[92.598901,56.176246],[92.599733,56.176251],[92.600633,56.176271],[92.601768,56.176316],[92.602834,56.176374],[92.603936,56.176473],[92.60478,56.176568],[92.606762,56.176834],[92.60897,56.177205],[92.609668,56.177334],[92.610644,56.177466],[92.611468,56.177557],[92.612282,56.177641],[92.613156,56.1777],[92.6139,56.177721],[92.614538,56.177736],[92.615375,56.177735],[92.616246,56.177699],[92.616954,56.177651],[92.617363,56.177616],[92.61756,56.177596],[92.618139,56.177541],[92.618718,56.177459],[92.619498,56.177336],[92.620099,56.177227],[92.620596,56.177125],[92.621191,56.17699],[92.621821,56.176834],[92.624479,56.176087],[92.634007,56.173333],[92.636654,56.172579],[92.637197,56.17242],[92.639299,56.171815],[92.645203,56.170118],[92.653489,56.167709],[92.670905,56.16266],[92.671578,56.162477],[92.674543,56.161598],[92.677299,56.16079],[92.677911,56.160617],[92.678769,56.160401],[92.679649,56.160198],[92.680711,56.159971],[92.681966,56.159738],[92.682589,56.159631],[92.683297,56.159529],[92.684144,56.159434],[92.685013,56.15935],[92.685968,56.159278],[92.687218,56.159172],[92.688221,56.159147],[92.689074,56.159126],[92.690624,56.159129],[92.69159,56.159147],[92.692805,56.159195],[92.693263,56.159218],[92.705956,56.159858],[92.706622,56.159894],[92.711835,56.160174],[92.712812,56.160216],[92.713552,56.160234],[92.714303,56.160246],[92.715129,56.160234],[92.716084,56.160198],[92.71691,56.160145],[92.71787,56.160089],[92.719008,56.159973],[92.719764,56.159852],[92.720418,56.159756],[92.721191,56.159613],[92.721792,56.159481],[92.722468,56.159302],[92.723047,56.159129],[92.723705,56.158926],[92.724418,56.158651],[92.724899,56.158452],[92.725335,56.158253],[92.725447,56.158191],[92.725727,56.158036],[92.726029,56.157865],[92.72634,56.157668],[92.726567,56.157504],[92.726698,56.15741],[92.72735,56.156848],[92.727957,56.156319],[92.728205,56.156061],[92.728431,56.155792],[92.728656,56.155517],[92.728903,56.155201],[92.730244,56.153019],[92.733939,56.146824],[92.734239,56.146214],[92.734357,56.145975],[92.734475,56.145671],[92.734561,56.145396],[92.734658,56.145079],[92.734743,56.144678],[92.734829,56.14423],[92.734883,56.143806],[92.735031,56.142156],[92.735095,56.141479],[92.735463,56.137815],[92.735387,56.137493],[92.735226,56.137159],[92.735055,56.136884],[92.734883,56.136698],[92.734663,56.136492],[92.734419,56.136301],[92.732703,56.135148],[92.732511,56.135024],[92.732329,56.134809],[92.732249,56.134639],[92.732252,56.134416],[92.732373,56.1342],[92.732534,56.133991],[92.732764,56.133856],[92.73306,56.133731],[92.7334,56.133639],[92.733774,56.133552],[92.734193,56.133508],[92.734698,56.133476],[92.735239,56.133454],[92.736707,56.133437],[92.737386,56.133414],[92.742359,56.133313],[92.744454,56.133292],[92.746662,56.133244],[92.748186,56.133175],[92.749751,56.133081],[92.750746,56.132979],[92.75153,56.132886],[92.752776,56.132722],[92.754142,56.132508],[92.757092,56.131995],[92.758178,56.131813],[92.759141,56.131653],[92.760113,56.131535],[92.76169,56.131381],[92.763574,56.131263],[92.765481,56.131186],[92.767009,56.131179],[92.768427,56.131211],[92.769761,56.131264],[92.771309,56.131364],[92.773155,56.1315],[92.776308,56.131797],[92.78311,56.132494],[92.78727,56.132859],[92.789016,56.132976],[92.790898,56.133169],[92.795816,56.133799],[92.802222,56.134635],[92.804406,56.134932],[92.806259,56.135246],[92.807771,56.135558],[92.809511,56.13598],[92.810713,56.136309],[92.812246,56.136749],[92.813815,56.137295],[92.813913,56.137329],[92.81689,56.138524],[92.821415,56.140304],[92.823361,56.141043],[92.824286,56.141374],[92.82481,56.141562],[92.826674,56.142189],[92.829744,56.143157],[92.832557,56.143984],[92.832622,56.144004],[92.832799,56.144056],[92.838929,56.145869],[92.840101,56.146185],[92.841389,56.146508],[92.842861,56.146834],[92.844376,56.147137],[92.846889,56.147497],[92.84883,56.14773],[92.850888,56.1479],[92.853184,56.147981],[92.85543,56.147981],[92.856573,56.147953],[92.857718,56.147908],[92.858248,56.14788],[92.85857,56.147858],[92.863589,56.147496],[92.866132,56.147324],[92.86749,56.147258],[92.869099,56.147228],[92.870311,56.147209],[92.871212,56.147221],[92.872348,56.14725],[92.873157,56.147284],[92.874421,56.147351],[92.875876,56.147447],[92.877296,56.147578],[92.87823,56.14768],[92.879263,56.147813],[92.880185,56.147938],[92.880949,56.148046],[92.882172,56.148247],[92.883351,56.148472],[92.884521,56.14871],[92.885851,56.14902],[92.887542,56.149454],[92.88941,56.149975],[92.890851,56.150456],[92.892304,56.150955],[92.89392,56.151521],[92.895376,56.152042],[92.896911,56.152575],[92.898476,56.153122],[92.899857,56.153601],[92.907364,56.156268],[92.909222,56.156859],[92.909532,56.156958],[92.911712,56.157622],[92.913227,56.157997],[92.914625,56.158285],[92.916903,56.158708],[92.917349,56.158786],[92.917976,56.15889],[92.920297,56.159211],[92.922178,56.159411],[92.924769,56.159596],[92.927494,56.15969],[92.927998,56.159687],[92.929085,56.159681],[92.930532,56.159658],[92.932069,56.159611],[92.933394,56.159525],[92.934208,56.159466],[92.935408,56.159372],[92.937895,56.159081],[92.949356,56.157448],[92.952094,56.157049],[92.953848,56.156802],[92.954614,56.156669],[92.957647,56.156241],[92.959584,56.155964],[92.96107,56.155755],[92.962484,56.155562],[92.966319,56.155084],[92.968064,56.154896],[92.972433,56.154473],[92.975433,56.15423],[92.978106,56.154025],[92.980748,56.153833],[92.98522,56.153469],[92.985854,56.15342],[92.986787,56.153358],[92.987662,56.153262],[92.98767,56.153261],[92.988548,56.153146],[92.990247,56.152907],[92.992801,56.1525],[92.993917,56.152286],[92.995024,56.152052],[92.997174,56.151522],[92.999538,56.15096],[93.001962,56.150444],[93.002993,56.150232],[93.003924,56.150049],[93.0053,56.149803],[93.006714,56.149578],[93.008057,56.149395],[93.009459,56.149219],[93.011167,56.149074],[93.012103,56.149023],[93.01334,56.148974],[93.014975,56.148918],[93.017172,56.148873],[93.01815,56.148863],[93.053526,56.148294],[93.056653,56.148181],[93.057159,56.14814],[93.060043,56.147905],[93.063015,56.147594],[93.065854,56.147172],[93.069774,56.146416],[93.07222,56.145866],[93.074898,56.145124],[93.07678,56.144545],[93.079042,56.143735],[93.085233,56.141437],[93.093178,56.138464],[93.094214,56.138047],[93.102279,56.135034],[93.107416,56.133225],[93.108652,56.132759],[93.111157,56.131795],[93.111312,56.131723],[93.114125,56.130615],[93.115352,56.130046],[93.117164,56.12908],[93.118664,56.128207],[93.120761,56.126627],[93.122772,56.124773],[93.124822,56.122176],[93.126138,56.119467],[93.127269,56.116522],[93.13036,56.108912],[93.131943,56.105227],[93.132093,56.104923],[93.132676,56.104003],[93.132861,56.103703],[93.134357,56.10185],[93.135809,56.100424],[93.13724,56.099266],[93.140412,56.097204],[93.142867,56.095961],[93.14471,56.095186],[93.147538,56.09412],[93.151467,56.093019],[93.161886,56.090175],[93.173651,56.086825],[93.175111,56.086384],[93.179176,56.085295],[93.180537,56.084865],[93.181307,56.084569],[93.182087,56.084212],[93.182776,56.083887],[93.183456,56.083543],[93.183556,56.083493],[93.184196,56.083116],[93.184763,56.08276],[93.185276,56.082395],[93.186171,56.081705],[93.186678,56.081239],[93.187162,56.080733],[93.187814,56.079946],[93.188293,56.079159],[93.188656,56.078395],[93.189423,56.076229],[93.189913,56.075203],[93.190575,56.07427],[93.191346,56.07344],[93.192185,56.072735],[93.192267,56.072667],[93.193274,56.071974],[93.194398,56.071354],[93.195108,56.071021],[93.195799,56.07073],[93.196554,56.07045],[93.197305,56.070199],[93.198154,56.069953],[93.198952,56.06975],[93.203328,56.068661],[93.211328,56.066663],[93.212553,56.066266],[93.213733,56.065778],[93.2148,56.065199],[93.215617,56.064609],[93.216182,56.064105],[93.21667,56.063551],[93.217265,56.062635],[93.217769,56.061674],[93.217933,56.061343],[93.218389,56.060376],[93.22034,56.056543],[93.221558,56.054084],[93.222151,56.052853],[93.222706,56.051619],[93.223163,56.050418],[93.223527,56.049201],[93.223741,56.048209],[93.223938,56.047159],[93.224257,56.045103],[93.224573,56.043035],[93.224788,56.041992],[93.225045,56.040971],[93.225421,56.039764],[93.225869,56.038582],[93.22688,56.036221],[93.232747,56.022939],[93.233159,56.022075],[93.233314,56.021749],[93.2335,56.02141],[93.233663,56.02116],[93.233882,56.020873],[93.234148,56.020559],[93.234496,56.020207],[93.235111,56.019695],[93.235736,56.019229],[93.238237,56.017589],[93.239033,56.017061],[93.239608,56.016667],[93.239926,56.016412],[93.240222,56.016161],[93.240482,56.015883],[93.240648,56.015685],[93.241086,56.015072],[93.241323,56.014645],[93.241523,56.014212],[93.241666,56.013764],[93.24217,56.011749],[93.242421,56.010437],[93.242568,56.009703],[93.242976,56.008366],[93.243407,56.007453],[93.243701,56.006945],[93.244051,56.006436],[93.244374,56.00604],[93.244713,56.005671],[93.245437,56.004979],[93.246507,56.004136],[93.247911,56.003302],[93.250142,56.002131],[93.253448,56.000544],[93.256513,55.999058],[93.257369,55.998636],[93.258338,55.998133],[93.259112,55.997731],[93.260348,55.99701],[93.261258,55.996478],[93.262148,55.995852],[93.26266,55.995492],[93.263263,55.995068],[93.264908,55.993694],[93.265606,55.993076],[93.265639,55.99304],[93.26651,55.992081],[93.26772,55.990548],[93.271146,55.986049],[93.271773,55.985159],[93.27223,55.984608],[93.272685,55.984078],[93.273223,55.983477],[93.273798,55.982863],[93.274257,55.982438],[93.275152,55.981642],[93.275318,55.981516],[93.275893,55.981094],[93.276713,55.98059],[93.277337,55.980223],[93.277904,55.979927],[93.279303,55.979301],[93.280256,55.978877],[93.281335,55.978491],[93.28237,55.978144],[93.283494,55.977831],[93.285553,55.977285],[93.287766,55.976774],[93.29103,55.976044],[93.292761,55.975698],[93.294881,55.975436],[93.296518,55.97536],[93.298431,55.975334],[93.299853,55.975327],[93.301313,55.975235],[93.302811,55.975037],[93.304817,55.97459],[93.306097,55.974146],[93.308174,55.973268],[93.308212,55.973252],[93.310208,55.972452],[93.311667,55.972022],[93.312922,55.971724],[93.314062,55.971495],[93.316255,55.971182],[93.320345,55.970658],[93.324229,55.970097],[93.328204,55.969533],[93.331234,55.968978],[93.331803,55.968866],[93.332136,55.968791],[93.332445,55.96872],[93.332638,55.968671],[93.332848,55.968614],[93.333079,55.968551],[93.333374,55.968468],[93.33372,55.968361],[93.334193,55.968202],[93.334451,55.968112],[93.33464,55.968038],[93.335058,55.967874],[93.335272,55.967792],[93.335867,55.967508],[93.336751,55.967032],[93.337323,55.966665],[93.338133,55.966103],[93.339408,55.964774],[93.339413,55.964768],[93.341275,55.962532],[93.341536,55.962293],[93.342435,55.961483],[93.342704,55.961273],[93.343047,55.961035],[93.343275,55.960891],[93.343649,55.960666],[93.343746,55.96061],[93.344442,55.960257],[93.34461,55.960179],[93.344901,55.960054],[93.345176,55.959941],[93.345564,55.959799],[93.345977,55.95966],[93.347164,55.959311],[93.348322,55.95906],[93.349261,55.958911],[93.354539,55.958103],[93.357545,55.957289],[93.359833,55.956529],[93.364817,55.95476],[93.368501,55.953804],[93.37236,55.953359],[93.376135,55.95349],[93.380428,55.953967],[93.383782,55.954119],[93.386245,55.954108],[93.388747,55.953837],[93.392742,55.953185],[93.397221,55.952067],[93.399897,55.951752],[93.403407,55.951731],[93.405269,55.951904],[93.409768,55.952632],[93.417079,55.953837],[93.424661,55.955172],[93.427803,55.95591],[93.432069,55.957289],[93.436122,55.959243],[93.439505,55.960653],[93.441521,55.961204],[93.442096,55.961333],[93.442494,55.961405],[93.442883,55.961473],[93.443451,55.96157],[93.444138,55.961656],[93.444759,55.961727],[93.445647,55.961805],[93.446193,55.961839],[93.446952,55.961858],[93.448341,55.96185],[93.448852,55.961837],[93.449166,55.961817],[93.449692,55.96179],[93.451054,55.96169],[93.453022,55.961521],[93.455146,55.96136],[93.459308,55.961083],[93.461383,55.960987],[93.464282,55.960894],[93.464757,55.960879],[93.467342,55.960851],[93.468724,55.960843],[93.469874,55.960852],[93.472538,55.960875],[93.474578,55.960948],[93.478727,55.961128],[93.480317,55.961197],[93.483628,55.961365],[93.487232,55.961493],[93.490789,55.961641],[93.492094,55.961618],[93.493465,55.961468],[93.494378,55.961263],[93.495293,55.960981],[93.496351,55.960536],[93.497409,55.959924],[93.499178,55.958559],[93.501113,55.957072],[93.501561,55.956752],[93.502321,55.956298],[93.50404,55.955431],[93.505745,55.954718],[93.50635,55.954486],[93.506745,55.954328],[93.509896,55.953318],[93.511516,55.952803],[93.514288,55.951901],[93.51436,55.951877],[93.516823,55.951054],[93.518061,55.950598],[93.519863,55.949991],[93.521073,55.949632],[93.522184,55.949376],[93.523132,55.9492],[93.52405,55.949075],[93.525045,55.948964],[93.526527,55.948867],[93.564096,55.9469],[93.565087,55.946877],[93.56714,55.946762],[93.568728,55.946654],[93.569354,55.946604],[93.571912,55.946516],[93.57312,55.946495],[93.573231,55.946489],[93.574326,55.946438],[93.575552,55.946423],[93.576629,55.94647],[93.578352,55.946602],[93.579621,55.946694],[93.581433,55.94679],[93.582585,55.946821],[93.583051,55.94683],[93.583724,55.946823],[93.584773,55.946774],[93.585969,55.946652],[93.587086,55.946479],[93.587971,55.946304],[93.588849,55.946096],[93.590217,55.945732],[93.593826,55.944645],[93.595057,55.944273],[93.596116,55.943984],[93.598054,55.943544],[93.600568,55.943],[93.602675,55.942427],[93.603498,55.942183],[93.60438,55.941922],[93.606181,55.941302],[93.607608,55.940771],[93.608955,55.940182],[93.610477,55.939588],[93.612053,55.939009],[93.613946,55.938378],[93.617511,55.937258],[93.657768,55.924848],[93.660812,55.923934],[93.662794,55.923403],[93.664846,55.922934],[93.665813,55.922743],[93.668065,55.922343],[93.669413,55.922136],[93.670966,55.92192],[93.674193,55.921558],[93.676957,55.921231],[93.678074,55.921051],[93.679624,55.920759],[93.680947,55.92044],[93.681828,55.920192],[93.682102,55.920097],[93.682734,55.919881],[93.683577,55.919556],[93.684496,55.919151],[93.68539,55.918673],[93.68605,55.918296],[93.686679,55.917889],[93.687965,55.917002],[93.689697,55.915643],[93.69679,55.910048],[93.696892,55.909967],[93.705357,55.903327],[93.706838,55.902152],[93.708437,55.900977],[93.709557,55.900214],[93.712049,55.898603],[93.714594,55.897011],[93.720551,55.893308],[93.722323,55.892367],[93.724181,55.891493],[93.725696,55.89089],[93.727237,55.890309],[93.729068,55.889714],[93.730988,55.889196],[93.732422,55.888827],[93.733975,55.888475],[93.734597,55.888365],[93.735963,55.888122],[93.73626,55.888069],[93.73785,55.88785],[93.739991,55.887554],[93.742112,55.887281],[93.745192,55.886885],[93.745481,55.886847],[93.767596,55.884],[93.768585,55.883877],[93.782555,55.882073],[93.785129,55.88175],[93.786534,55.88164],[93.788271,55.881604],[93.789984,55.881608],[93.791578,55.881688],[93.793658,55.881854],[93.795781,55.882044],[93.796833,55.882165],[93.79735,55.882225],[93.798631,55.882373],[93.817308,55.884748],[93.818788,55.884925],[93.826256,55.885815],[93.830517,55.88641],[93.83315,55.886853],[93.838438,55.88774],[93.839209,55.887924],[93.839926,55.888129],[93.840771,55.888446],[93.841412,55.888791],[93.842205,55.889309],[93.842739,55.889845],[93.843604,55.891029],[93.843847,55.891271],[93.844265,55.891462],[93.84493,55.891635],[93.845866,55.89175],[93.846908,55.891737],[93.850338,55.891386],[93.856051,55.890982],[93.866952,55.890292],[93.868351,55.890114],[93.869736,55.889858],[93.871162,55.889543],[93.872403,55.889214],[93.873811,55.888684],[93.875793,55.887802],[93.87908,55.886372],[93.881057,55.885536],[93.882977,55.88486],[93.884847,55.884302],[93.88614,55.883937],[93.888099,55.883525],[93.889929,55.883211],[93.891457,55.883],[93.893525,55.882766],[93.895501,55.882634],[93.897232,55.882548],[93.900342,55.882523],[93.911437,55.88235],[93.913917,55.882286],[93.915323,55.882234],[93.916697,55.882126],[93.918521,55.881931],[93.918863,55.881886],[93.919763,55.881766],[93.921179,55.881543],[93.926879,55.880484],[93.939808,55.878058],[93.940423,55.877942],[93.945069,55.877059],[93.946561,55.876777],[93.947747,55.876584],[93.949116,55.876375],[93.950322,55.87624],[93.951561,55.876159],[93.952903,55.876086],[93.954331,55.876079],[93.955818,55.876123],[93.957324,55.876213],[93.959364,55.87639],[93.960958,55.876639],[93.962976,55.877004],[93.964628,55.877432],[93.966867,55.878112],[93.968531,55.878772],[93.969486,55.879185],[93.976489,55.882251],[93.981809,55.884595],[93.984455,55.88567],[93.985813,55.886168],[93.987206,55.886624],[93.98836,55.88691],[93.989423,55.88714],[93.990474,55.887349],[93.992982,55.887824],[93.994433,55.888052],[93.995628,55.888207],[93.996711,55.888326],[93.998653,55.888502],[93.99993,55.888584],[94.000665,55.888608],[94.001219,55.888625],[94.003508,55.88866],[94.006152,55.88862],[94.010405,55.888548],[94.010562,55.888546],[94.011331,55.888533],[94.011644,55.888527],[94.01231,55.888522],[94.015409,55.888464],[94.021568,55.888367],[94.023285,55.888361],[94.024458,55.888368],[94.02671,55.888389],[94.028123,55.888452],[94.029676,55.88854],[94.031215,55.888667],[94.032753,55.888831],[94.034298,55.888992],[94.035511,55.889153],[94.056608,55.892649],[94.0569,55.892697],[94.06784,55.89451],[94.075329,55.895783],[94.077036,55.896072],[94.078691,55.896304],[94.080234,55.896455],[94.081558,55.896512],[94.083293,55.896496],[94.084742,55.896399],[94.086362,55.896194],[94.087897,55.895895],[94.088572,55.895734],[94.090459,55.895184],[94.091712,55.894709],[94.099201,55.891433],[94.10933,55.886933],[94.111079,55.886158],[94.112504,55.885466],[94.113645,55.884789],[94.114732,55.884031],[94.115612,55.883251],[94.116402,55.882434],[94.117128,55.881541],[94.117783,55.880533],[94.119378,55.877911],[94.124576,55.869376],[94.125106,55.868549],[94.125362,55.868225],[94.125699,55.867808],[94.126186,55.867269],[94.126919,55.8666],[94.127979,55.865777],[94.129001,55.865108],[94.130139,55.864494],[94.131145,55.864036],[94.143544,55.858547],[94.146564,55.857248],[94.147691,55.856855],[94.148464,55.85659],[94.148916,55.856435],[94.15033,55.856038],[94.150417,55.856013],[94.151362,55.855815],[94.151942,55.855693],[94.153562,55.855398],[94.15479,55.855194],[94.156683,55.85498],[94.162167,55.854475],[94.19716,55.851134],[94.206134,55.850294],[94.207835,55.850139],[94.209464,55.850042],[94.211787,55.849974],[94.214208,55.849959],[94.216829,55.850021],[94.21863,55.850102],[94.218981,55.850118],[94.220775,55.850281],[94.223919,55.850623],[94.225801,55.850869],[94.227132,55.851067],[94.232871,55.852266],[94.240129,55.853798],[94.241405,55.854045],[94.24327,55.854375],[94.245226,55.854682],[94.24606,55.854798],[94.24781,55.855036],[94.250083,55.855302],[94.260352,55.856292],[94.267721,55.856997],[94.269705,55.857163],[94.271378,55.85727],[94.272773,55.85733],[94.275609,55.857402],[94.281945,55.857491],[94.284045,55.857524],[94.296743,55.857706],[94.298422,55.85773],[94.299886,55.857751],[94.304008,55.857817],[94.309181,55.857889],[94.310633,55.857891],[94.311342,55.857891],[94.320224,55.858062],[94.336445,55.858286],[94.338132,55.85831],[94.339102,55.858293],[94.339957,55.858271],[94.341251,55.858218],[94.343934,55.858056],[94.345437,55.857925],[94.347293,55.857715],[94.348605,55.857556],[94.349986,55.85735],[94.357441,55.856117],[94.362683,55.855237],[94.363686,55.855071],[94.372353,55.853634],[94.374447,55.853276],[94.376801,55.85288],[94.38315,55.851832],[94.385567,55.851533],[94.388117,55.851301],[94.390617,55.851158],[94.394008,55.851056],[94.396564,55.851077],[94.396686,55.851078],[94.401898,55.851266],[94.432802,55.852302],[94.435914,55.852408],[94.437331,55.852399],[94.438664,55.852347],[94.440864,55.852179],[94.443039,55.851936],[94.444682,55.851716],[94.453351,55.850306],[94.461034,55.849069],[94.469581,55.847661],[94.472417,55.847192],[94.472962,55.847107],[94.473661,55.846991],[94.474473,55.846831],[94.475601,55.846569],[94.480752,55.845394],[94.482405,55.845043],[94.485022,55.844649],[94.493472,55.843326],[94.494982,55.842967],[94.496297,55.84258],[94.497651,55.842068],[94.499739,55.841005],[94.504064,55.838302],[94.509408,55.835057],[94.518004,55.82881],[94.521165,55.826487],[94.522097,55.825847],[94.52308,55.825266],[94.524131,55.824757],[94.525204,55.824293],[94.526599,55.823796],[94.528103,55.823353],[94.529321,55.823036],[94.531092,55.822638],[94.532549,55.822246],[94.53324,55.822007],[94.533949,55.821723],[94.534695,55.821373],[94.535459,55.820996],[94.536157,55.820593],[94.536973,55.820081],[94.539032,55.818785],[94.541699,55.817127],[94.54275,55.816499],[94.543675,55.816103],[94.544927,55.815675],[94.546065,55.815413],[94.547299,55.815202],[94.548791,55.815103],[94.550394,55.815093],[94.553324,55.815051],[94.555299,55.814948],[94.55697,55.814839],[94.559566,55.81455],[94.562608,55.814148],[94.576486,55.811737],[94.5766,55.811717],[94.580286,55.811097],[94.582805,55.810675],[94.584644,55.810326],[94.586187,55.809956],[94.587393,55.809647],[94.588708,55.809251],[94.590444,55.80866],[94.592196,55.807945],[94.593474,55.807363],[94.594736,55.806725],[94.596126,55.805982],[94.597543,55.805109],[94.599198,55.803904],[94.600083,55.803131],[94.600356,55.802867],[94.602182,55.801099],[94.603104,55.800206],[94.603336,55.799981],[94.606566,55.79679],[94.608238,55.795346],[94.610211,55.793931],[94.612033,55.79289],[94.613629,55.792005],[94.615172,55.791248],[94.617724,55.790153],[94.620563,55.789109],[94.624051,55.787873],[94.636084,55.783608],[94.637485,55.783162],[94.638832,55.782865],[94.640226,55.782632],[94.672549,55.777422],[94.674508,55.777169],[94.675812,55.777063],[94.677399,55.776957],[94.678327,55.776934],[94.679176,55.776912],[94.681553,55.776973],[94.688074,55.777151],[94.692292,55.777263],[94.694446,55.777271],[94.705308,55.776931],[94.730374,55.776064],[94.732463,55.775969],[94.732494,55.775967],[94.737928,55.775615],[94.739061,55.775545],[94.740275,55.775428],[94.741481,55.775231],[94.742559,55.775021],[94.745499,55.77426],[94.746974,55.773853],[94.748127,55.773472],[94.752407,55.77182],[94.756759,55.770045],[94.757849,55.769648],[94.759802,55.769067],[94.761994,55.768537],[94.763473,55.768248],[94.765144,55.767972],[94.766918,55.767744],[94.767087,55.767722],[94.767935,55.767647],[94.768547,55.767593],[94.77008,55.767515],[94.772021,55.767503],[94.772946,55.767497],[94.774138,55.767526],[94.774398,55.767532],[94.775923,55.767622],[94.778042,55.767848],[94.778642,55.767897],[94.779384,55.767906],[94.779955,55.767884],[94.780591,55.767834],[94.781071,55.767842],[94.781572,55.767894],[94.782097,55.76797],[94.782511,55.768059],[94.782952,55.76825],[94.783291,55.768366],[94.783752,55.768484],[94.784398,55.76862],[94.787501,55.769009],[94.788131,55.769088],[94.789024,55.7692],[94.789053,55.769203],[94.79559,55.769994],[94.796481,55.770101],[94.80152,55.77071],[94.811589,55.771928],[94.815232,55.772314],[94.817336,55.772489],[94.821346,55.772785],[94.827145,55.772865],[94.827275,55.772866],[94.831769,55.77291],[94.834244,55.772934],[94.846675,55.772622],[94.854623,55.772424],[94.857328,55.77231],[94.859601,55.772062],[94.867034,55.771159],[94.875737,55.770093],[94.904116,55.766617],[94.904559,55.766572],[94.911262,55.765746],[94.913179,55.765515],[94.914102,55.765421],[94.915112,55.76537],[94.916296,55.765346],[94.917418,55.76537],[94.918546,55.765469],[94.932543,55.767291],[94.939042,55.768129],[94.967107,55.771743],[94.968613,55.771991],[94.969931,55.772275],[94.970907,55.772574],[94.971953,55.773003],[94.973159,55.773589],[94.974348,55.774359],[94.976414,55.775717],[94.976483,55.775763],[94.987604,55.783115],[95.000818,55.791653],[95.004226,55.793931],[95.004885,55.794414],[95.005468,55.794898],[95.005951,55.795363],[95.006307,55.795788],[95.006577,55.796288],[95.00681,55.79697],[95.007216,55.798411],[95.009524,55.807693],[95.009844,55.808459],[95.010166,55.809003],[95.01067,55.809612],[95.011193,55.810163],[95.012033,55.810929],[95.016965,55.815026],[95.025636,55.822132],[95.026974,55.823327],[95.027203,55.823612],[95.027272,55.823826],[95.027303,55.823924],[95.027316,55.824185],[95.027258,55.824824],[95.026454,55.828206],[95.026355,55.82869],[95.026158,55.829114],[95.025794,55.829543],[95.025517,55.829756],[95.025324,55.829904],[95.024694,55.830282],[95.023683,55.830858],[95.022123,55.831707],[95.021241,55.832299],[95.020875,55.832637],[95.02068,55.832816],[95.020416,55.8333],[95.020292,55.833863],[95.020291,55.834946],[95.020251,55.837471],[95.020258,55.838129],[95.020179,55.838512],[95.020019,55.838791],[95.019747,55.839092],[95.019112,55.83956],[95.013579,55.8436],[95.013346,55.84381],[95.01219,55.844854],[94.997894,55.85853],[94.99657,55.85995],[94.994424,55.862701],[94.988225,55.870691],[94.987836,55.871291],[94.987557,55.871923],[94.987428,55.872367],[94.987419,55.872866],[94.987592,55.873609],[94.987816,55.874239],[94.987818,55.874244],[94.988673,55.875463],[94.988993,55.875783],[94.989066,55.875857],[94.989389,55.876181],[94.989633,55.876371],[94.989766,55.876475],[94.990276,55.876764],[94.990879,55.87697],[94.992474,55.877482],[94.993949,55.877956],[94.997271,55.878996],[94.997679,55.879127],[94.99896,55.879562],[95.003037,55.880863],[95.003264,55.880937],[95.007728,55.882574],[95.010123,55.883468],[95.012548,55.884377],[95.013495,55.884711],[95.015116,55.885225],[95.017671,55.885976],[95.018958,55.886308],[95.021162,55.886834],[95.022572,55.887118],[95.024061,55.887397],[95.025346,55.887606],[95.02662,55.8878],[95.029044,55.88811],[95.033492,55.888604],[95.03795,55.889139],[95.045514,55.890201],[95.056116,55.891701],[95.056359,55.891735],[95.064128,55.892867],[95.065153,55.89301],[95.066331,55.893149],[95.067339,55.89325],[95.0685,55.893321],[95.069285,55.893346],[95.070459,55.893366],[95.071646,55.893366],[95.077644,55.89318],[95.08206,55.89304],[95.083275,55.893017],[95.084494,55.893073],[95.084682,55.893094],[95.085261,55.893161],[95.086623,55.893394],[95.087611,55.893679],[95.08865,55.894007],[95.089566,55.8944],[95.090431,55.894872],[95.091199,55.895404],[95.091886,55.89605],[95.092379,55.896615],[95.093473,55.89814],[95.09407,55.899011],[95.094486,55.899598],[95.095911,55.901647],[95.096323,55.902135],[95.096838,55.902694],[95.097396,55.903174],[95.097978,55.903626],[95.097984,55.90363],[95.098723,55.90411],[95.099178,55.904408],[95.099748,55.904721],[95.101605,55.905633],[95.106733,55.908138],[95.111222,55.91037],[95.114021,55.911761],[95.11404,55.91177],[95.117874,55.913675],[95.11958,55.914511],[95.120504,55.915059],[95.121299,55.915667],[95.121843,55.916231],[95.12376,55.918897],[95.124239,55.9194],[95.124725,55.919837],[95.125222,55.920235],[95.125891,55.920715],[95.127914,55.922099],[95.14031,55.930565],[95.141051,55.931115],[95.141254,55.931265],[95.142013,55.931953],[95.142552,55.932551],[95.142879,55.932987],[95.144033,55.934877],[95.149564,55.94393],[95.152847,55.949348],[95.154242,55.951631],[95.154828,55.952427],[95.15543,55.953142],[95.156387,55.954036],[95.156981,55.954573],[95.158366,55.955569],[95.159781,55.95643],[95.160735,55.956962],[95.161791,55.957457],[95.162907,55.957909],[95.16416,55.958321],[95.165393,55.95864],[95.166852,55.958978],[95.168059,55.959196],[95.169399,55.959407],[95.170836,55.95958],[95.172302,55.959732],[95.173708,55.959824],[95.175309,55.959877],[95.177252,55.959875],[95.189224,55.959718],[95.189393,55.959716],[95.190562,55.959701],[95.191807,55.959694],[95.194018,55.959682],[95.196103,55.959664],[95.196482,55.959661],[95.198456,55.959644],[95.20709,55.959554],[95.217543,55.959461],[95.225449,55.959384],[95.230895,55.959238],[95.244844,55.958803],[95.250315,55.958608],[95.252148,55.958573],[95.253415,55.958575],[95.254724,55.958606],[95.256372,55.958663],[95.257514,55.958731],[95.25849,55.958844],[95.260526,55.959153],[95.262005,55.95944],[95.263845,55.959804],[95.26512,55.960079],[95.266063,55.960308],[95.267732,55.960761],[95.273902,55.962483],[95.274146,55.962551],[95.283485,55.965169],[95.303825,55.970876],[95.305692,55.971372],[95.307533,55.971789],[95.309526,55.972196],[95.322898,55.974511],[95.341116,55.977618],[95.350129,55.979017],[95.35016,55.979021],[95.356322,55.979971],[95.365297,55.981338],[95.367204,55.981615],[95.368895,55.981899],[95.370062,55.982093],[95.371218,55.982319],[95.372885,55.98268],[95.374284,55.983038],[95.375915,55.983522],[95.388451,55.987608],[95.398201,55.990817],[95.399557,55.991227],[95.410701,55.994473],[95.417809,55.996578],[95.430715,56.000369],[95.447538,56.005323],[95.447713,56.005375],[95.450945,56.006318],[95.452405,56.00671],[95.453427,56.006954],[95.454594,56.007166],[95.456014,56.00738],[95.477403,56.01027],[95.49851,56.013172],[95.499494,56.013298],[95.499781,56.013337],[95.500576,56.013446],[95.502406,56.013705],[95.50346,56.013846],[95.506821,56.014302],[95.508199,56.014516],[95.50952,56.01478],[95.510825,56.015145],[95.512129,56.015616],[95.513432,56.016169],[95.514771,56.016821],[95.515564,56.017315],[95.516342,56.017915],[95.51756,56.019111],[95.522117,56.023916],[95.52403,56.0259],[95.525903,56.027916],[95.525979,56.027997],[95.530574,56.033165],[95.53251,56.035421],[95.533097,56.03625],[95.533282,56.036946],[95.533247,56.037649],[95.533107,56.038798],[95.533061,56.039944],[95.533283,56.040766],[95.533778,56.041614],[95.534503,56.042426],[95.535486,56.043289],[95.539936,56.046521],[95.544518,56.049892],[95.554549,56.057288],[95.556049,56.058503],[95.55664,56.059003],[95.556717,56.059091],[95.556874,56.059268],[95.55736,56.05978],[95.557623,56.060133],[95.557807,56.06038],[95.55948,56.062624],[95.561537,56.065583],[95.561564,56.065622],[95.566781,56.073094],[95.569572,56.077135],[95.570648,56.078663],[95.571383,56.079673],[95.572619,56.081106],[95.574669,56.082993],[95.575968,56.083922],[95.577228,56.084726],[95.579836,56.086163],[95.583112,56.087934],[95.597505,56.095685],[95.604221,56.099301],[95.614182,56.104605],[95.624046,56.109831],[95.628349,56.112116],[95.63105,56.11361],[95.631842,56.114092],[95.634077,56.115636],[95.637448,56.118125],[95.6395,56.119463],[95.640371,56.120111],[95.641235,56.120827],[95.642183,56.121794],[95.643973,56.123762],[95.644493,56.124548],[95.645728,56.127739],[95.645896,56.128211],[95.646657,56.130351],[95.647584,56.133019],[95.648197,56.134714],[95.648555,56.135362],[95.648917,56.13588],[95.649293,56.136328],[95.649899,56.136954],[95.650629,56.137584],[95.651123,56.13795],[95.651923,56.13846],[95.652691,56.138899],[95.653498,56.139295],[95.654932,56.139929],[95.657946,56.141238],[95.658347,56.141443],[95.659234,56.141898],[95.659264,56.141916],[95.659447,56.142025],[95.659584,56.142109],[95.660151,56.142523],[95.660491,56.142748],[95.661381,56.143545],[95.661596,56.143738],[95.661757,56.143895],[95.663469,56.14556],[95.664426,56.146566],[95.665289,56.147657],[95.665685,56.148273],[95.668207,56.152843],[95.668431,56.153248],[95.668994,56.154268],[95.670394,56.157186],[95.670609,56.157599],[95.670775,56.157917],[95.671588,56.159588],[95.671881,56.16018],[95.673899,56.164249],[95.674158,56.164772],[95.674495,56.16545],[95.675499,56.167475],[95.676232,56.168953],[95.676669,56.169833],[95.67821,56.172939],[95.67822,56.172959],[95.67961,56.175836],[95.679871,56.176228],[95.680249,56.176629],[95.680594,56.176969],[95.681002,56.177326],[95.681654,56.178054],[95.681978,56.178381],[95.683167,56.179832],[95.683637,56.180404],[95.683813,56.180634],[95.684872,56.18202],[95.685173,56.18241],[95.685306,56.182483],[95.685463,56.18253],[95.685662,56.182551],[95.685929,56.18254],[95.686583,56.18248],[95.686712,56.182468],[95.698141,56.181434],[95.700107,56.181256],[95.701274,56.181151],[95.701429,56.181137],[95.702884,56.181005],[95.704266,56.18088],[95.705657,56.180805],[95.708366,56.180751],[95.708938,56.18074],[95.71002,56.180718],[95.71375,56.180885],[95.71435,56.180912],[95.716328,56.180998],[95.718193,56.18108],[95.719704,56.181147],[95.720739,56.181193],[95.724292,56.181351],[95.725052,56.181385],[95.726032,56.181428],[95.727629,56.181499],[95.728013,56.181516],[95.728469,56.181545],[95.7292,56.181627],[95.729458,56.181654],[95.729533,56.181672],[95.729593,56.181703],[95.729623,56.181733],[95.72964,56.181778],[95.729625,56.181827],[95.729584,56.181866],[95.729513,56.181898],[95.729353,56.182041],[95.72917,56.182293],[95.728948,56.182793],[95.728795,56.183132],[95.728468,56.183848],[95.7279,56.18505],[95.727429,56.186047],[95.726941,56.187064],[95.726451,56.188061],[95.726008,56.188997],[95.725361,56.189992],[95.725327,56.190083],[95.72481,56.190925],[95.724763,56.190998],[95.724701,56.19104],[95.724608,56.191079],[95.723641,56.19158],[95.723375,56.191784],[95.723292,56.191854],[95.72296,56.192099],[95.722501,56.192517],[95.722308,56.192682],[95.721761,56.193202],[95.721271,56.193767],[95.720929,56.19423],[95.720231,56.195204],[95.720165,56.195304],[95.719356,56.196511],[95.719153,56.196814],[95.718963,56.197193],[95.718871,56.197377],[95.718774,56.197881],[95.718723,56.198389],[95.718693,56.198672],[95.718577,56.200334],[95.71852,56.20091],[95.71845,56.201678],[95.718432,56.201892],[95.718487,56.202382],[95.718556,56.202828],[95.718564,56.202875],[95.718677,56.203477],[95.718876,56.204429],[95.719036,56.204619],[95.719254,56.204764],[95.719793,56.20635],[95.717311,56.206653],[95.717586,56.207289],[95.717615,56.207357],[95.717929,56.208057],[95.718074,56.208285],[95.718669,56.208648],[95.720716,56.209749],[95.719461,56.210464],[95.718162,56.211164],[95.717404,56.211571],[95.716588,56.212011],[95.716121,56.212238],[95.71553,56.212549],[95.715245,56.21279],[95.715041,56.213174],[95.714963,56.213381],[95.714798,56.213822],[95.714706,56.214101],[95.714679,56.214196],[95.714598,56.21444],[95.714513,56.214618],[95.714407,56.214794],[95.714237,56.215008],[95.713963,56.215341],[95.713895,56.215569],[95.7139,56.215758],[95.713983,56.215946],[95.714124,56.216176],[95.716184,56.218397],[95.716281,56.21849],[95.716434,56.218543],[95.716763,56.218565],[95.717012,56.218558],[95.717805,56.218463],[95.719879,56.21796],[95.721032,56.21763],[95.722685,56.217081],[95.723973,56.216671],[95.724106,56.216634],[95.724619,56.21649],[95.724953,56.216503],[95.725176,56.216599],[95.725239,56.216669],[95.726262,56.217803],[95.726546,56.218117],[95.726703,56.218301],[95.726987,56.218624],[95.727339,56.218807],[95.727474,56.218863],[95.727664,56.218943],[95.729346,56.219545],[95.730809,56.22007],[95.731511,56.220261],[95.732813,56.220595],[95.732823,56.220598],[95.734243,56.220931],[95.735821,56.221183],[95.736448,56.221255],[95.736547,56.221265],[95.737252,56.221346],[95.738825,56.221507],[95.740649,56.221599],[95.741845,56.221613],[95.742743,56.221681],[95.743663,56.221821],[95.743941,56.22189],[95.743975,56.221898],[95.744173,56.221947],[95.744331,56.221987],[95.745235,56.222341],[95.745411,56.222453],[95.745542,56.222561],[95.746069,56.223287],[95.74613,56.223383],[95.746346,56.223704],[95.74631,56.223821],[95.746193,56.2239],[95.74612,56.223911],[95.745984,56.223932],[95.745528,56.223874],[95.745061,56.223861],[95.744769,56.223882],[95.744592,56.223878],[95.744404,56.223863],[95.744246,56.22384],[95.743818,56.22378],[95.742777,56.223657],[95.74227,56.22358],[95.741996,56.223481],[95.741866,56.223379],[95.74179,56.223281],[95.741757,56.223173],[95.741724,56.223013],[95.741701,56.222891],[95.741747,56.222792],[95.741936,56.222721],[95.742151,56.222717],[95.742419,56.222743],[95.742744,56.222798],[95.743466,56.222916],[95.744807,56.22319],[95.748556,56.22402],[95.749086,56.224156],[95.749477,56.224324],[95.750058,56.224656],[95.750883,56.225292],[95.751222,56.225532],[95.751992,56.22606],[95.753724,56.227228],[95.754321,56.227574],[95.754593,56.227692],[95.754784,56.227774],[95.755089,56.227858],[95.755644,56.22796],[95.756229,56.228054],[95.756583,56.228114],[95.756716,56.228132],[95.757321,56.228227],[95.758052,56.22835],[95.760547,56.228726],[95.761351,56.228842],[95.76292,56.228992],[95.76377,56.229067],[95.765646,56.229234],[95.765767,56.229245],[95.765897,56.229257],[95.767795,56.229432],[95.770723,56.229702],[95.771267,56.229752],[95.771913,56.229843],[95.772108,56.229899],[95.772522,56.230017],[95.773063,56.230215],[95.774263,56.230654],[95.775842,56.231241],[95.776104,56.231339],[95.776368,56.231437],[95.776625,56.231532],[95.778327,56.232198],[95.778896,56.232446],[95.779088,56.232553],[95.779691,56.232915],[95.782021,56.234316],[95.782668,56.234705],[95.783482,56.235195],[95.786174,56.236876],[95.788448,56.238297],[95.790129,56.239279],[95.790887,56.239707],[95.791788,56.240124],[95.792624,56.240448],[95.793598,56.240798],[95.794541,56.241091],[95.79544,56.241349],[95.796281,56.241549],[95.797007,56.241701],[95.797825,56.241835],[95.798653,56.241948],[95.799542,56.242041],[95.80047,56.242104],[95.808759,56.242392],[95.808784,56.242393],[95.812414,56.242526],[95.815945,56.24265],[95.824437,56.242959],[95.825903,56.242999],[95.827235,56.242965],[95.828536,56.242854],[95.83003,56.24265],[95.831378,56.242439],[95.834878,56.241759],[95.841113,56.240638],[95.843043,56.240291],[95.844338,56.240011],[95.84554,56.239671],[95.847025,56.239153],[95.848096,56.238678],[95.848809,56.238335],[95.849728,56.237793],[95.850496,56.237294],[95.8558,56.233384],[95.858203,56.231667],[95.858894,56.231299],[95.859806,56.23085],[95.860649,56.230504],[95.861617,56.230129],[95.862539,56.229828],[95.863522,56.229588],[95.867242,56.228673],[95.867939,56.228478],[95.868255,56.228389],[95.868895,56.228118],[95.869544,56.227814],[95.870309,56.2274],[95.871464,56.226724],[95.872742,56.225973],[95.873991,56.225334],[95.87499,56.224934],[95.876136,56.224612],[95.877518,56.224367],[95.878109,56.224304],[95.878251,56.224289],[95.87895,56.224216],[95.880387,56.224196],[95.881712,56.224289],[95.897412,56.225954],[95.91879,56.228227],[95.921169,56.22848],[95.922761,56.228641],[95.924029,56.228713],[95.924935,56.228731],[95.925897,56.228712],[95.926992,56.228654],[95.928031,56.228565],[95.92895,56.228434],[95.930041,56.228241],[95.931098,56.228032],[95.931868,56.22784],[95.932385,56.227694],[95.932807,56.227574],[95.941383,56.22495],[95.942068,56.224745],[95.948077,56.22294],[95.949616,56.222501],[95.951028,56.222112],[95.966468,56.218715],[95.966531,56.218701],[95.998634,56.211698],[96.000236,56.211372],[96.002219,56.211058],[96.004335,56.210757],[96.00589,56.210577],[96.007643,56.210409],[96.009484,56.210272],[96.011513,56.21018],[96.013614,56.210137],[96.018266,56.210129],[96.042073,56.21022],[96.061224,56.210292],[96.063244,56.210305],[96.066923,56.210354],[96.067124,56.210353],[96.067315,56.210353],[96.067996,56.210349],[96.068703,56.210344],[96.069206,56.210342],[96.069561,56.210341],[96.071876,56.210329],[96.094753,56.210424],[96.096954,56.210411],[96.117448,56.20996],[96.124579,56.209786],[96.12769,56.20971],[96.137678,56.209525],[96.146117,56.209313],[96.146277,56.209309],[96.146431,56.209305],[96.151144,56.209206],[96.153728,56.20918],[96.153812,56.209179],[96.155823,56.209198],[96.158011,56.209288],[96.169918,56.209996],[96.175722,56.210374],[96.181467,56.210717],[96.186729,56.211031],[96.189101,56.211174],[96.207747,56.212304],[96.231739,56.213736],[96.240713,56.214268],[96.242455,56.214439],[96.245116,56.214772],[96.2479,56.215204],[96.25159,56.215952],[96.270302,56.220113],[96.272231,56.220482],[96.273216,56.220604],[96.274306,56.220652],[96.2755,56.220605],[96.276771,56.220484],[96.277618,56.220343],[96.280339,56.219793],[96.282084,56.219439],[96.282252,56.219405],[96.283302,56.219193],[96.290782,56.217679],[96.29237,56.217451],[96.294266,56.217321],[96.295525,56.217298],[96.315551,56.218027],[96.32017,56.218165],[96.323039,56.218252],[96.32364,56.218293],[96.324476,56.218364],[96.325283,56.218533],[96.327987,56.219346],[96.328738,56.219573],[96.328774,56.219584],[96.329588,56.219737],[96.329797,56.219758],[96.33036,56.219791],[96.331047,56.219744],[96.331867,56.21964],[96.335813,56.219143],[96.336572,56.218999],[96.337381,56.218778],[96.346148,56.21625],[96.363314,56.211698],[96.365659,56.211201],[96.37314,56.209911],[96.374296,56.209749],[96.377125,56.209467],[96.377401,56.209421],[96.378097,56.209303],[96.378961,56.209114],[96.379804,56.208828],[96.380994,56.208338],[96.381598,56.208089],[96.382084,56.207926],[96.382374,56.207874],[96.382626,56.207872],[96.383066,56.207979],[96.383174,56.208004],[96.383521,56.208067],[96.383903,56.208126],[96.384378,56.208128],[96.387281,56.208],[96.388081,56.208004],[96.390878,56.208123],[96.394587,56.208057],[96.397392,56.208004],[96.398172,56.208018],[96.398941,56.208043],[96.399503,56.208085],[96.400221,56.20814],[96.403044,56.208433],[96.40366,56.208505],[96.403855,56.208522],[96.40521,56.208657],[96.407819,56.208928],[96.409059,56.209056],[96.409844,56.209077],[96.410682,56.209043],[96.420841,56.208498],[96.421587,56.208458],[96.4241,56.208323],[96.425924,56.208225],[96.434926,56.207742],[96.442576,56.207332],[96.443012,56.207308],[96.446791,56.207102],[96.44734,56.207072],[96.447689,56.207053],[96.45422,56.206697],[96.457805,56.206478],[96.465926,56.205979],[96.472277,56.205584],[96.481715,56.204933],[96.488316,56.204481],[96.493371,56.203893],[96.493422,56.203888],[96.494661,56.203743],[96.494762,56.203731],[96.495335,56.203682],[96.495907,56.20368],[96.498876,56.203754],[96.499552,56.203739],[96.500177,56.203688],[96.500874,56.203593],[96.501979,56.203424],[96.502599,56.203369],[96.503111,56.20334],[96.504377,56.203318],[96.504665,56.203317],[96.505578,56.203341],[96.508271,56.203473],[96.508778,56.203478],[96.509307,56.203445],[96.512059,56.203115],[96.512857,56.203063],[96.514825,56.203026],[96.516533,56.203066],[96.517436,56.203048],[96.519633,56.202902],[96.520148,56.202877],[96.520943,56.202839],[96.522777,56.202767],[96.52484,56.202736],[96.525202,56.20274],[96.525435,56.202738],[96.525925,56.202732],[96.52646,56.202726],[96.528713,56.202653],[96.529702,56.20264],[96.531164,56.202621],[96.532487,56.202684],[96.534148,56.202869],[96.535168,56.202996],[96.535329,56.203012],[96.53679,56.20316],[96.537579,56.203234],[96.538309,56.203325],[96.539641,56.203455],[96.542961,56.203883],[96.543643,56.203969],[96.545146,56.204162],[96.54801,56.204527],[96.549908,56.204785],[96.550546,56.204874],[96.552047,56.205067],[96.553447,56.205241],[96.554535,56.205377],[96.556125,56.205573],[96.55757,56.205739],[96.558439,56.20581],[96.558501,56.205811],[96.559259,56.205821],[96.559284,56.20582],[96.559464,56.205809],[96.560066,56.205773],[96.56034,56.205746],[96.56072,56.205679],[96.561019,56.205601],[96.561248,56.205508],[96.561439,56.205392],[96.561838,56.205108],[96.562606,56.204612],[96.563522,56.204008],[96.564455,56.203446],[96.565415,56.202839],[96.566793,56.201933],[96.567372,56.201548],[96.567412,56.201521],[96.567998,56.201122],[96.568546,56.200749],[96.569691,56.199957],[96.570368,56.199495],[96.571818,56.198508],[96.572595,56.198083],[96.572774,56.198023],[96.573205,56.197857],[96.573348,56.197796],[96.57345,56.197729],[96.573477,56.197672],[96.573489,56.197586],[96.573487,56.197499],[96.573484,56.19745],[96.573471,56.197289],[96.573485,56.197216],[96.573535,56.197102],[96.573643,56.196938],[96.573919,56.196586],[96.574279,56.196201],[96.574656,56.195752],[96.575386,56.194906],[96.575947,56.194276],[96.576896,56.193181],[96.578401,56.191454],[96.57983,56.189779],[96.581421,56.187955],[96.583035,56.186123],[96.584163,56.184884],[96.5862,56.182553],[96.586606,56.182097],[96.586819,56.181791],[96.586865,56.181562],[96.586848,56.181368],[96.586671,56.180512],[96.586599,56.180288],[96.58655,56.180096],[96.586425,56.179452],[96.586417,56.179411],[96.586407,56.179158],[96.586459,56.178678],[96.586584,56.178273],[96.586841,56.177492],[96.587002,56.177212],[96.587244,56.176859],[96.587528,56.176478],[96.587835,56.176127],[96.588067,56.175915],[96.588349,56.175703],[96.588554,56.175575],[96.588844,56.175432],[96.589184,56.175304],[96.589752,56.175111],[96.590286,56.175],[96.590882,56.174892],[96.591534,56.174812],[96.592069,56.174781],[96.592634,56.174786],[96.594265,56.174914],[96.595997,56.175063],[96.597825,56.175221],[96.59822,56.175253],[96.60777,56.176042],[96.617636,56.176846],[96.623575,56.177321],[96.62834,56.177702],[96.631399,56.177875],[96.634031,56.177925],[96.635826,56.177897],[96.63977,56.177792],[96.653252,56.177409],[96.659833,56.177169],[96.662729,56.176951],[96.665607,56.176624],[96.668216,56.176224],[96.670501,56.175805],[96.673774,56.17508],[96.677063,56.174181],[96.689024,56.170808],[96.689226,56.170751],[96.692465,56.169956],[96.694848,56.169516],[96.697346,56.16912],[96.700041,56.168864],[96.701707,56.168727],[96.703337,56.168586],[96.706035,56.168409],[96.708164,56.168358],[96.712188,56.168396],[96.712764,56.168402],[96.717447,56.168533],[96.754665,56.169412],[96.765156,56.169639],[96.766938,56.169631],[96.768974,56.169552],[96.774874,56.169182],[96.783632,56.168615],[96.791964,56.167978],[96.797233,56.167585],[96.799639,56.167349],[96.803223,56.166751],[96.805834,56.166248],[96.807536,56.16582],[96.808475,56.165556],[96.809252,56.165318],[96.810654,56.164862],[96.812492,56.164216],[96.814244,56.163556],[96.816288,56.16266],[96.822151,56.159792],[96.827352,56.15725],[96.832385,56.154793],[96.83445,56.153735],[96.838382,56.151816],[96.841752,56.150233],[96.842989,56.149605],[96.843775,56.149163],[96.844433,56.148598],[96.844977,56.148016],[96.845364,56.147504],[96.845695,56.146944],[96.845805,56.146636],[96.845874,56.146344],[96.84599,56.145834],[96.846086,56.145287],[96.8463,56.144705],[96.846581,56.143998],[96.847091,56.142932],[96.847412,56.142015],[96.847455,56.141548],[96.847448,56.141159],[96.847365,56.140844],[96.847216,56.140473],[96.84648,56.139243],[96.845332,56.137571],[96.84415,56.135893],[96.84408,56.135789],[96.843886,56.1355],[96.843693,56.13514],[96.843589,56.134759],[96.843602,56.134453],[96.843705,56.134047],[96.843924,56.133519],[96.844124,56.133097],[96.84423,56.132901],[96.845441,56.130613],[96.845482,56.130559],[96.845577,56.130434],[96.845983,56.129879],[96.847037,56.128685],[96.847418,56.128266],[96.848161,56.127446],[96.848419,56.127109],[96.849727,56.125403],[96.850058,56.124969],[96.850209,56.124696],[96.850329,56.12448],[96.850689,56.1237],[96.850864,56.123319],[96.851056,56.122974],[96.851182,56.122784],[96.851216,56.122732],[96.851304,56.122657],[96.851399,56.122577],[96.851615,56.122418],[96.852045,56.122201],[96.852617,56.122006],[96.853271,56.121836],[96.854232,56.121611],[96.855052,56.121466],[96.855717,56.121412],[96.855746,56.12141],[96.85645,56.121404],[96.857421,56.121505],[96.857926,56.121528],[96.858535,56.121453],[96.859197,56.121339],[96.860233,56.121143],[96.861216,56.120998],[96.863153,56.120798],[96.863847,56.120708],[96.864367,56.120616],[96.865037,56.120446],[96.867126,56.11986],[96.868101,56.119606],[96.869127,56.119333],[96.869664,56.119214],[96.870103,56.119176],[96.870667,56.119186],[96.871625,56.119251],[96.872071,56.119231],[96.872517,56.119156],[96.872908,56.119011],[96.874157,56.118514],[96.874523,56.118396],[96.874925,56.118293],[96.875462,56.118198],[96.876127,56.118175],[96.877369,56.118224],[96.88736,56.118561],[96.887961,56.118581],[96.888347,56.118594],[96.898365,56.118864],[96.898449,56.118866],[96.903251,56.118995],[96.905722,56.119068],[96.906008,56.119082],[96.906693,56.119115],[96.907717,56.1192],[96.907943,56.119214],[96.908816,56.119269],[96.910393,56.119327],[96.910567,56.119329],[96.910629,56.11933],[96.91131,56.119338],[96.913902,56.119282],[96.914121,56.119277],[96.917302,56.119229],[96.918817,56.119206],[96.923823,56.119131],[96.929768,56.119035],[96.930671,56.119053],[96.931543,56.119111],[96.934236,56.119368],[96.938334,56.119719],[96.939532,56.11985],[96.942886,56.120437],[96.946812,56.121113],[96.948113,56.121429],[96.949385,56.121787],[96.950524,56.122142],[96.957137,56.124391],[96.960961,56.125816],[96.965325,56.127682],[96.966489,56.128136],[96.96835,56.128765],[96.969883,56.129314],[96.973964,56.130811],[96.975247,56.131265],[96.976118,56.131562],[96.977498,56.131953],[96.9797,56.132571],[96.981789,56.133198],[96.983534,56.133588],[96.985104,56.13385],[96.987249,56.134147],[96.98967,56.134461],[96.990735,56.134555],[96.991815,56.134627],[96.993894,56.134709],[96.995647,56.134776],[96.997884,56.134772],[97.004738,56.13469],[97.016386,56.134317],[97.024695,56.134054],[97.028462,56.133881],[97.029373,56.133863],[97.030293,56.133926],[97.031311,56.134024],[97.031414,56.134034],[97.032704,56.134231],[97.034471,56.134511],[97.036698,56.134762],[97.03837,56.134901],[97.038604,56.13492],[97.039344,56.134984],[97.047404,56.13576],[97.057578,56.1368],[97.058707,56.136964],[97.06068,56.137335],[97.061636,56.137502],[97.062404,56.137669],[97.06471,56.138116],[97.065912,56.138349],[97.068055,56.138628],[97.071908,56.139001],[97.075352,56.139131],[97.082442,56.139384],[97.08737,56.13957],[97.089109,56.139706],[97.090742,56.140027],[97.093123,56.140717],[97.094861,56.141167],[97.097679,56.141774],[97.101501,56.142425],[97.10442,56.142866],[97.106466,56.14321],[97.109487,56.143892],[97.110391,56.144051],[97.111292,56.144161],[97.112805,56.144329],[97.114967,56.144579],[97.117015,56.144857],[97.119656,56.145394],[97.122106,56.145933],[97.125644,56.146817],[97.13112,56.148031],[97.136635,56.149113],[97.138045,56.149172],[97.139182,56.149184],[97.140384,56.149148],[97.141972,56.148992],[97.143238,56.148777],[97.144675,56.14849],[97.145848,56.148157],[97.146778,56.147797],[97.147615,56.147415],[97.148409,56.147008],[97.14901,56.146638],[97.149568,56.146231],[97.154246,56.141689],[97.155039,56.141139],[97.15579,56.140672],[97.156563,56.140254],[97.157464,56.139895],[97.15858,56.139501],[97.159803,56.139202],[97.160855,56.138975],[97.161949,56.138795],[97.163443,56.138682],[97.164905,56.138643],[97.166582,56.138681],[97.178332,56.139569],[97.181138,56.139657],[97.183445,56.13949],[97.186226,56.139006],[97.194768,56.137555],[97.198174,56.137171],[97.201877,56.13706],[97.206035,56.137156],[97.209137,56.137453],[97.20925,56.137464],[97.214639,56.138301],[97.217369,56.138755],[97.218853,56.139056],[97.232078,56.142044],[97.23475,56.142619],[97.244493,56.14459],[97.247027,56.145021],[97.25393,56.146279],[97.256211,56.146592],[97.259985,56.146984],[97.263246,56.147271],[97.266172,56.147354],[97.26682,56.14738],[97.270223,56.147399],[97.273799,56.147278],[97.277219,56.147064],[97.280625,56.146732],[97.282193,56.146548],[97.285235,56.146171],[97.289601,56.145652],[97.302062,56.144141],[97.303496,56.14397],[97.322142,56.141801],[97.323017,56.1417],[97.324756,56.141476],[97.325639,56.141328],[97.326511,56.141153],[97.327369,56.140948],[97.328333,56.140672],[97.329718,56.140218],[97.330555,56.139919],[97.331141,56.139686],[97.331659,56.139453],[97.332856,56.138884],[97.335071,56.137608],[97.335929,56.137073],[97.337238,56.136141],[97.33859,56.135029],[97.343043,56.130966],[97.343806,56.130344],[97.344462,56.129894],[97.345306,56.129409],[97.346179,56.128991],[97.347066,56.128631],[97.348037,56.128286],[97.349061,56.128009],[97.350064,56.127804],[97.350971,56.127663],[97.351993,56.127545],[97.352988,56.127459],[97.355734,56.127304],[97.359189,56.12716],[97.360507,56.127163],[97.360821,56.127164],[97.362322,56.127232],[97.364687,56.12742],[97.365755,56.127483],[97.366926,56.127481],[97.367987,56.127437],[97.369101,56.127337],[97.372795,56.126963],[97.378237,56.1264],[97.381776,56.126025],[97.381799,56.126023],[97.383593,56.125837],[97.385942,56.125523],[97.387736,56.125213],[97.389253,56.12489],[97.390849,56.124501],[97.392195,56.124127],[97.393776,56.12362],[97.39501,56.123158],[97.396519,56.12253],[97.398081,56.121825],[97.399288,56.121224],[97.400206,56.120699],[97.401424,56.119918],[97.402637,56.119134],[97.403779,56.118227],[97.406831,56.115763],[97.408838,56.114173],[97.410869,56.112543],[97.412162,56.111615],[97.413139,56.111036],[97.414504,56.110305],[97.415879,56.10965],[97.417438,56.109051],[97.41917,56.108466],[97.421087,56.107937],[97.423273,56.107447],[97.432738,56.105478],[97.434227,56.10516],[97.434606,56.105078],[97.435579,56.104865],[97.437175,56.104421],[97.438531,56.103965],[97.439212,56.103707],[97.440015,56.103378],[97.44127,56.102823],[97.442297,56.102319],[97.444352,56.101247],[97.449085,56.098902],[97.454456,56.096362],[97.455854,56.095744],[97.457536,56.095109],[97.458445,56.09481],[97.459152,56.094605],[97.459943,56.094415],[97.460821,56.094203],[97.462829,56.093824],[97.464098,56.093627],[97.466243,56.093353],[97.468937,56.093052],[97.472486,56.092693],[97.475038,56.092372],[97.476554,56.09215],[97.477537,56.092007],[97.481305,56.091368],[97.489577,56.089973],[97.500605,56.088113],[97.50332,56.08765],[97.521793,56.084505],[97.525358,56.083899],[97.536604,56.081987],[97.53682,56.081951],[97.543709,56.080764],[97.552934,56.079174],[97.574289,56.075555],[97.574446,56.075528],[97.580593,56.074472],[97.584362,56.073747],[97.585956,56.073387],[97.591733,56.071901],[97.594826,56.071106],[97.598828,56.070088],[97.601928,56.0693],[97.604354,56.068675],[97.614577,56.066038],[97.617386,56.065313],[97.618687,56.064991],[97.620666,56.064481],[97.623552,56.063737],[97.624907,56.063456],[97.626035,56.063255],[97.626938,56.063139],[97.627835,56.063048],[97.629209,56.062963],[97.63073,56.062963],[97.631247,56.062993],[97.632266,56.063052],[97.634084,56.063218],[97.636133,56.063436],[97.641364,56.064002],[97.643538,56.064132],[97.646007,56.064202],[97.646556,56.064198],[97.647889,56.064186],[97.649923,56.064111],[97.65188,56.06394],[97.654313,56.063655],[97.657692,56.063121],[97.660059,56.062747],[97.667593,56.061568],[97.66944,56.061227],[97.670641,56.060981],[97.67197,56.060685],[97.673044,56.060412],[97.675241,56.059792],[97.677761,56.059037],[97.683796,56.057173],[97.68721,56.056145],[97.690604,56.055124],[97.704162,56.050995],[97.705018,56.050748],[97.705854,56.050523],[97.706691,56.050311],[97.707481,56.050154],[97.70826,56.050004],[97.709215,56.049865],[97.710219,56.049733],[97.711335,56.049609],[97.712363,56.04953],[97.713489,56.04947],[97.713853,56.04947],[97.716849,56.049471],[97.723841,56.049525],[97.72995,56.049606],[97.731416,56.04961],[97.732984,56.049572],[97.734441,56.049523],[97.736094,56.049449],[97.738003,56.049334],[97.73843,56.049299],[97.74021,56.049152],[97.741501,56.04902],[97.742945,56.04885],[97.74461,56.048629],[97.745139,56.048547],[97.745835,56.048438],[97.747013,56.048243],[97.753142,56.047198],[97.757735,56.046438],[97.761855,56.045742],[97.767353,56.044799],[97.769019,56.044501],[97.770653,56.044162],[97.772417,56.04375],[97.774547,56.043203],[97.775847,56.042815],[97.777527,56.042284],[97.781139,56.040976],[97.789034,56.038021],[97.797089,56.03499],[97.808099,56.030837],[97.811188,56.029664],[97.812832,56.029101],[97.814218,56.028716],[97.815412,56.028389],[97.822261,56.026738],[97.82655,56.025755],[97.830417,56.024863],[97.836372,56.023477],[97.838643,56.022949],[97.847055,56.021003],[97.852389,56.019781],[97.854765,56.019237],[97.863321,56.017271],[97.867406,56.016289],[97.868642,56.015977],[97.869711,56.015684],[97.870852,56.015319],[97.872227,56.014856],[97.873762,56.01429],[97.87482,56.013885],[97.875784,56.013464],[97.876941,56.012925],[97.879608,56.011611],[97.882515,56.010128],[97.885979,56.008451],[97.892272,56.005474],[97.893,56.005118],[97.895341,56.003973],[97.897996,56.002687],[97.902732,56.000382],[97.906437,55.998578],[97.908929,55.997392],[97.909782,55.996985],[97.910193,55.996788],[97.91101,55.996342],[97.911712,55.995914],[97.912246,55.995497],[97.91268,55.995087],[97.913055,55.994648],[97.913338,55.994248],[97.913634,55.993769],[97.913897,55.993251],[97.914033,55.992927],[97.914986,55.989827],[97.915168,55.98924],[97.915444,55.98835],[97.915707,55.987501],[97.916058,55.98637],[97.916915,55.983687],[97.917134,55.982935],[97.917299,55.982105],[97.917414,55.981291],[97.917453,55.980477],[97.917445,55.979239],[97.91742,55.978691],[97.917366,55.978324],[97.917181,55.977728],[97.9168,55.976564],[97.916502,55.975846],[97.916204,55.975188],[97.915993,55.974758],[97.915973,55.974716],[97.914536,55.972496],[97.914288,55.972155],[97.913737,55.971278],[97.913071,55.970232],[97.912773,55.96979],[97.912644,55.969587],[97.911446,55.967734],[97.907501,55.961589],[97.906626,55.96019],[97.906211,55.959588],[97.904644,55.957181],[97.904268,55.956562],[97.904039,55.956156],[97.903853,55.955769],[97.903663,55.955306],[97.903547,55.954959],[97.903525,55.954859],[97.903499,55.954757],[97.903386,55.954324],[97.903357,55.954083],[97.903328,55.953918],[97.903321,55.953622],[97.903306,55.952982],[97.903321,55.9525],[97.903408,55.951978],[97.903605,55.951198],[97.903945,55.95044],[97.904275,55.949757],[97.904691,55.94902],[97.90484,55.948849],[97.905404,55.948201],[97.908037,55.945715],[97.909177,55.944658],[97.910669,55.943276],[97.912716,55.941413],[97.913284,55.940893],[97.914911,55.93934],[97.916086,55.938331],[97.916836,55.937709],[97.917739,55.937033],[97.91869,55.936378],[97.919531,55.935835],[97.920448,55.935281],[97.921496,55.934681],[97.922596,55.93412],[97.923547,55.933679],[97.924269,55.933338],[97.925248,55.932907],[97.926387,55.932459],[97.934287,55.929254],[97.942905,55.925813],[97.945696,55.924681],[97.948211,55.923689],[97.949431,55.923182],[97.950198,55.922805],[97.951015,55.922331],[97.951804,55.92182],[97.952405,55.921351],[97.952888,55.920888],[97.953325,55.920414],[97.953721,55.919902],[97.954095,55.919338],[97.954332,55.918837],[97.954542,55.918246],[97.954989,55.91655],[97.955701,55.913921],[97.9562,55.912149],[97.956488,55.911121],[97.956595,55.910758],[97.956771,55.910366],[97.956966,55.910005],[97.957197,55.90966],[97.957507,55.909244],[97.957823,55.908871],[97.95814,55.908566],[97.958413,55.908307],[97.958778,55.908],[97.959344,55.907615],[97.95994,55.90724],[97.960521,55.906943],[97.961053,55.906691],[97.961759,55.906401],[97.962358,55.906187],[97.962713,55.906056],[97.963347,55.905869],[97.96423,55.905622],[97.965895,55.905161],[97.970666,55.903881],[97.975559,55.902568],[97.978186,55.90186],[97.979707,55.901416],[97.981121,55.900937],[97.982214,55.900564],[97.983782,55.899958],[97.985998,55.898986],[97.986943,55.898571],[97.987644,55.898248],[97.989366,55.897453],[97.99533,55.894782],[97.998474,55.893339],[98.001834,55.891828],[98.003219,55.891197],[98.00468,55.890451],[98.005702,55.889905],[98.007584,55.888827],[98.013068,55.885377],[98.017417,55.882595],[98.021688,55.879844],[98.022219,55.87954],[98.029533,55.87486],[98.034162,55.8719],[98.036138,55.870647],[98.036984,55.870154],[98.037526,55.869826],[98.038106,55.869506],[98.038743,55.869207],[98.039437,55.868925],[98.040043,55.868705],[98.040729,55.868498],[98.041471,55.868306],[98.042324,55.868122],[98.043058,55.867997],[98.043809,55.86789],[98.04475,55.86781],[98.045548,55.867762],[98.046357,55.867743],[98.048979,55.867693],[98.050914,55.867651],[98.058037,55.867479],[98.061842,55.86737],[98.064185,55.867313],[98.065713,55.867272],[98.06918,55.867097],[98.072863,55.866909],[98.077636,55.866658],[98.081655,55.866447],[98.086404,55.866256],[98.087674,55.866211],[98.088832,55.86618],[98.089726,55.866163],[98.090761,55.866167],[98.091642,55.866197],[98.09277,55.866246],[98.093699,55.866297],[98.094778,55.866399],[98.095666,55.866498],[98.096817,55.866633],[98.098197,55.866822],[98.102512,55.867492],[98.106796,55.868152],[98.109386,55.868549],[98.112024,55.868947],[98.113092,55.869117],[98.115188,55.869437],[98.117691,55.869828],[98.119422,55.870063],[98.120494,55.870206],[98.121674,55.870331],[98.12285,55.870442],[98.124338,55.870564],[98.125744,55.870634],[98.126819,55.870686],[98.127353,55.870701],[98.129001,55.87074],[98.130118,55.87075],[98.131328,55.870728],[98.132628,55.8707],[98.134172,55.870627],[98.135673,55.870537],[98.137082,55.870416],[98.138746,55.87024],[98.140642,55.870001],[98.142367,55.869744],[98.14352,55.869534],[98.144762,55.869309],[98.146016,55.869045],[98.147115,55.868804],[98.148269,55.868515],[98.149154,55.868291],[98.150712,55.867857],[98.151852,55.867509],[98.153073,55.867081],[98.154873,55.866415],[98.156618,55.86573],[98.158648,55.864826],[98.160141,55.864083],[98.161772,55.863189],[98.163678,55.862089],[98.1659,55.860734],[98.166318,55.860483],[98.166903,55.860133],[98.167235,55.859938],[98.170475,55.858039],[98.173763,55.856062],[98.176979,55.854182],[98.178918,55.853056],[98.180957,55.851919],[98.184317,55.850228],[98.187282,55.848878],[98.191388,55.84719],[98.202409,55.842853],[98.210247,55.8398],[98.212422,55.838952],[98.22258,55.834963],[98.224351,55.834218],[98.226147,55.833343],[98.227152,55.832808],[98.228381,55.832072],[98.229634,55.831214],[98.237058,55.825833],[98.238018,55.825175],[98.238629,55.824795],[98.239159,55.824465],[98.239922,55.824015],[98.240851,55.823525],[98.241817,55.823041],[98.243227,55.822441],[98.24471,55.821849],[98.246611,55.82119],[98.247466,55.820909],[98.248578,55.820594],[98.250249,55.820152],[98.266837,55.816285],[98.283076,55.812475],[98.284202,55.812199],[98.285314,55.811895],[98.287188,55.811339],[98.288545,55.810912],[98.290076,55.810372],[98.291311,55.809897],[98.29309,55.809174],[98.293811,55.80885],[98.295109,55.808327],[98.296989,55.807432],[98.298653,55.806487],[98.300266,55.805474],[98.30725,55.800315],[98.319227,55.791382],[98.325371,55.7868],[98.327636,55.784831],[98.328631,55.783847],[98.329781,55.782525],[98.331085,55.780759],[98.331891,55.779505],[98.332475,55.778492],[98.335546,55.771629],[98.340196,55.761329],[98.344589,55.751567],[98.348141,55.743696],[98.349583,55.740537],[98.350767,55.738509],[98.351802,55.737107],[98.352208,55.736557],[98.352912,55.735775],[98.356326,55.732268],[98.364345,55.724271],[98.365189,55.723401],[98.366566,55.72166],[98.368286,55.719335],[98.371823,55.714542],[98.372307,55.713891],[98.37376,55.711936],[98.374636,55.710758],[98.377295,55.707179],[98.380982,55.70225],[98.385612,55.69612],[98.386628,55.694682],[98.387805,55.693217],[98.389264,55.691804],[98.390929,55.690372],[98.397908,55.685316],[98.400619,55.683366],[98.417147,55.671592],[98.433697,55.659717],[98.435923,55.658294],[98.437023,55.657743],[98.438482,55.657141],[98.440005,55.656684],[98.441727,55.656309],[98.443331,55.656073],[98.444036,55.65598],[98.444114,55.65597],[98.445143,55.65591],[98.446968,55.655891],[98.448867,55.656024],[98.450104,55.656135],[98.453573,55.656513],[98.454926,55.656663],[98.456484,55.656836],[98.457383,55.656882],[98.459059,55.656951],[98.460918,55.65694],[98.462524,55.656862],[98.464057,55.656735],[98.465736,55.656545],[98.465939,55.656511],[98.466266,55.656455],[98.467384,55.656266],[98.468651,55.656019],[98.470171,55.655639],[98.471763,55.655128],[98.473224,55.654589],[98.486806,55.648872],[98.499771,55.643324],[98.513142,55.637661],[98.513408,55.637549],[98.516056,55.636427],[98.532344,55.629599],[98.536669,55.627766],[98.541812,55.625589],[98.543712,55.624689],[98.545391,55.623851],[98.547916,55.622489],[98.552223,55.62012],[98.55351,55.619427],[98.554556,55.618924],[98.55562,55.61842],[98.5566,55.617968],[98.558265,55.617342],[98.561402,55.616165],[98.56221,55.615861],[98.569251,55.613246],[98.572805,55.611938],[98.576805,55.610425],[98.577533,55.610095],[98.578305,55.609727],[98.579095,55.609262],[98.580238,55.608467],[98.581102,55.60773],[98.582359,55.606391],[98.582612,55.606097],[98.584031,55.604346],[98.585963,55.602018],[98.586171,55.601768],[98.588821,55.598575],[98.590197,55.596902],[98.591226,55.595738],[98.592301,55.594601],[98.592597,55.594288],[98.598802,55.587942],[98.59972,55.587002],[98.606965,55.579561],[98.607193,55.579328],[98.610262,55.576181],[98.610492,55.575944],[98.612298,55.574092],[98.616489,55.569816],[98.616543,55.569761],[98.617462,55.568746],[98.617921,55.568146],[98.618187,55.56769],[98.618566,55.566938],[98.618961,55.565902],[98.619297,55.564773],[98.619962,55.561882],[98.620717,55.558674],[98.621422,55.555613],[98.621836,55.554003],[98.622023,55.553287],[98.622146,55.552887],[98.622387,55.552387],[98.622682,55.551877],[98.623107,55.551253],[98.623394,55.550883],[98.62384,55.550385],[98.624559,55.549757],[98.625281,55.549218],[98.625716,55.548926],[98.626413,55.5485],[98.627249,55.548069],[98.628306,55.547625],[98.63189,55.546412],[98.636396,55.544955],[98.638317,55.544325],[98.639594,55.543833],[98.640263,55.543521],[98.641117,55.543084],[98.641713,55.542721],[98.642381,55.542278],[98.643173,55.541641],[98.643595,55.54122],[98.644109,55.540597],[98.644673,55.539889],[98.645045,55.53921],[98.645339,55.538551],[98.645604,55.537633],[98.646034,55.53492],[98.646218,55.533543],[98.646225,55.532833],[98.646188,55.532214],[98.646089,55.531662],[98.64588,55.531017],[98.645575,55.530274],[98.645293,55.529783],[98.644999,55.529421],[98.644749,55.529155],[98.644397,55.528828],[98.643832,55.528428],[98.643037,55.527894],[98.641192,55.52681],[98.638036,55.525002],[98.636726,55.524203],[98.635974,55.523582],[98.635473,55.523084],[98.634804,55.522422],[98.634254,55.521714],[98.63331,55.52052],[98.632049,55.518913],[98.631004,55.517479],[98.630346,55.516457],[98.629772,55.515331],[98.629315,55.514181],[98.629055,55.513291],[98.628646,55.511373],[98.627988,55.508408],[98.627712,55.507177],[98.627642,55.506865],[98.627603,55.506693],[98.626894,55.503787],[98.626581,55.502825],[98.626241,55.501952],[98.62518,55.499798],[98.624448,55.498296],[98.623641,55.496428],[98.623014,55.494702],[98.622557,55.493288],[98.622287,55.492359],[98.621634,55.489807],[98.621329,55.488284],[98.621142,55.486965],[98.620806,55.483218],[98.620791,55.483054],[98.620666,55.480686],[98.620663,55.479195],[98.620681,55.476963],[98.620681,55.476952],[98.620845,55.474519],[98.620935,55.472894],[98.62106,55.470953],[98.621088,55.469738],[98.621052,55.468787],[98.620934,55.467981],[98.620612,55.466716],[98.620253,55.465754],[98.619963,55.464978],[98.61916,55.462834],[98.618837,55.461787],[98.618513,55.460414],[98.618335,55.45888],[98.618249,55.457773],[98.618246,55.457142],[98.618321,55.456574],[98.618443,55.456003],[98.618622,55.455475],[98.618936,55.454768],[98.619936,55.452865],[98.620546,55.451706],[98.620684,55.451428],[98.621813,55.44916],[98.621893,55.449001],[98.622404,55.447972],[98.622914,55.446991],[98.623713,55.445451],[98.624386,55.444322],[98.624986,55.443489],[98.625882,55.442401],[98.628008,55.440178],[98.630758,55.437347],[98.634654,55.433351],[98.635723,55.432211],[98.636369,55.431428],[98.636781,55.430756],[98.63706,55.430233],[98.637355,55.429526],[98.637611,55.428734],[98.637731,55.428112],[98.637749,55.427451],[98.637655,55.426024],[98.637337,55.423453],[98.63696,55.420253],[98.636656,55.418925],[98.636154,55.417247],[98.635688,55.415914],[98.635437,55.414978],[98.635037,55.412769],[98.634989,55.41223],[98.634812,55.411372],[98.63208,55.400299],[98.631458,55.397777],[98.631234,55.396407],[98.631303,55.395239],[98.631644,55.394249],[98.632351,55.393133],[98.632381,55.393086],[98.6333,55.391649],[98.635179,55.389061],[98.636261,55.387501],[98.636299,55.387446],[98.638421,55.384387],[98.640839,55.380753],[98.642329,55.378612],[98.642352,55.378579],[98.642841,55.377829],[98.643075,55.377361],[98.643249,55.377006],[98.643313,55.376725],[98.643389,55.376347],[98.643421,55.375872],[98.643367,55.375409],[98.643271,55.375055],[98.642852,55.374208],[98.642648,55.373885],[98.642391,55.373549],[98.641211,55.372147],[98.640953,55.371781],[98.640739,55.371452],[98.640535,55.371044],[98.640406,55.37069],[98.640328,55.370356],[98.64032,55.370007],[98.640309,55.369605],[98.640337,55.36856],[98.640559,55.366107],[98.640621,55.364574],[98.640599,55.363769],[98.640513,55.362708],[98.640385,55.361318],[98.640385,55.360525],[98.640565,55.359014],[98.640946,55.356531],[98.641363,55.353819],[98.641457,55.353206],[98.641479,55.352621],[98.641436,55.351791],[98.64136,55.351088],[98.641232,55.349892],[98.641141,55.349263],[98.641101,55.348943],[98.641006,55.348177],[98.640994,55.347321],[98.641053,55.346941],[98.641112,55.346582],[98.641207,55.346211],[98.641361,55.345756],[98.641633,55.345225],[98.641991,55.344646],[98.642485,55.344023],[98.642896,55.34356],[98.643417,55.343075],[98.644151,55.342526],[98.646185,55.341138],[98.646972,55.340524],[98.647526,55.33995],[98.647874,55.339503],[98.649231,55.337599],[98.649716,55.337023],[98.650545,55.336153],[98.652938,55.333893],[98.654539,55.332311],[98.656256,55.330666],[98.657926,55.32901],[98.658994,55.327951],[98.66031,55.326513],[98.662345,55.324344],[98.664578,55.321985],[98.666516,55.319905],[98.668177,55.318124],[98.669557,55.316628],[98.671615,55.314441],[98.673868,55.312046],[98.675727,55.310053],[98.677393,55.308237],[98.679545,55.306075],[98.681612,55.30405],[98.682527,55.303126],[98.683735,55.301905],[98.685065,55.30064],[98.685765,55.299975],[98.686415,55.299356],[98.687854,55.298118],[98.689342,55.29678],[98.690741,55.295476],[98.692179,55.294197],[98.693405,55.293211],[98.694859,55.292149],[98.695821,55.291615],[98.698633,55.290104],[98.700072,55.289435],[98.701773,55.288701],[98.703396,55.287961],[98.705557,55.286918],[98.708007,55.285582],[98.710557,55.284096],[98.712673,55.282853],[98.716673,55.28075],[98.717445,55.280421],[98.717854,55.280246],[98.718708,55.279882],[98.720338,55.279273],[98.720345,55.27927],[98.721837,55.278787],[98.723081,55.278408],[98.725961,55.277668],[98.728017,55.277024],[98.730558,55.276073],[98.731298,55.27575],[98.732285,55.275305],[98.733163,55.274857],[98.735295,55.273664],[98.738934,55.27152],[98.746365,55.267117],[98.753464,55.262941],[98.756288,55.261222],[98.758982,55.259675],[98.761523,55.258072],[98.763524,55.256745],[98.767984,55.253448],[98.773437,55.249361],[98.774789,55.248382],[98.775814,55.247546],[98.776528,55.246877],[98.777548,55.245628],[98.778464,55.243977],[98.778873,55.242476],[98.778862,55.240732],[98.778524,55.239373],[98.777728,55.23771],[98.776823,55.23595],[98.776517,55.235095],[98.776365,55.234209],[98.776362,55.233478],[98.776377,55.232945],[98.776483,55.232561],[98.776713,55.231754],[98.777113,55.231012],[98.777328,55.230633],[98.778127,55.229632],[98.780383,55.227594],[98.781964,55.225899],[98.782193,55.225637],[98.782546,55.225164],[98.783058,55.224319],[98.783496,55.223446],[98.783713,55.222824],[98.783757,55.222719],[98.784805,55.218925],[98.785003,55.217929],[98.785033,55.217729],[98.785507,55.214633],[98.785644,55.213191],[98.785614,55.211952],[98.785508,55.210815],[98.785446,55.210155],[98.784462,55.20243],[98.784172,55.201],[98.783851,55.200069],[98.783332,55.199188],[98.782653,55.198375],[98.782415,55.198139],[98.78125,55.196983],[98.779861,55.195842],[98.774513,55.191734],[98.771896,55.189716],[98.769332,55.187683],[98.768478,55.186878],[98.768013,55.18637],[98.767494,55.185672],[98.767387,55.185418],[98.767191,55.184647],[98.767074,55.18361],[98.767047,55.181884],[98.766846,55.181015],[98.766456,55.18021],[98.76612,55.179595],[98.765708,55.179008],[98.765359,55.178606],[98.765228,55.178455],[98.764114,55.177398],[98.763496,55.176906],[98.762535,55.176311],[98.759651,55.174964],[98.758392,55.174297],[98.757461,55.173709],[98.756469,55.172904],[98.755989,55.172389],[98.755584,55.171859],[98.755172,55.171108],[98.754875,55.170326],[98.754638,55.169128],[98.754638,55.167354],[98.755004,55.165035],[98.755363,55.163558],[98.756668,55.159564],[98.757339,55.158023],[98.75814,55.156715],[98.759452,55.155113],[98.760376,55.154174],[98.763221,55.151676],[98.76432,55.150516],[98.764961,55.149711],[98.765899,55.148265],[98.766799,55.146556],[98.768013,55.144142],[98.769722,55.140628],[98.770134,55.140033],[98.770835,55.13927],[98.771698,55.138557],[98.773011,55.137768],[98.774324,55.136978],[98.775352,55.13642],[98.779289,55.134231],[98.786071,55.130386],[98.788208,55.129447],[98.789981,55.128746],[98.790145,55.128681],[98.795463,55.126701],[98.797599,55.125831],[98.799278,55.125068],[98.801467,55.123981],[98.803817,55.122646],[98.808639,55.119598],[98.810569,55.118236],[98.81224,55.116756],[98.815536,55.113727],[98.816329,55.113109],[98.818412,55.111827],[98.819763,55.110874],[98.822311,55.10847],[98.823368,55.107222],[98.823881,55.106375],[98.824391,55.105198],[98.824609,55.104245],[98.825163,55.100092],[98.825381,55.099406],[98.82743,55.094158],[98.828338,55.091449],[98.828746,55.090064],[98.829124,55.088721],[98.829444,55.087671],[98.829549,55.087327],[98.830079,55.085591],[98.831718,55.081027],[98.832207,55.079626],[98.832393,55.078929],[98.832466,55.078407],[98.832393,55.077722],[98.832215,55.076667],[98.832103,55.076084],[98.831777,55.074389],[98.83126,55.071761],[98.830012,55.066097],[98.829931,55.065714],[98.828598,55.059268],[98.826995,55.051525],[98.826141,55.04745],[98.826019,55.046814],[98.825946,55.046447],[98.825302,55.043209],[98.825209,55.042389],[98.825209,55.041296],[98.825363,55.039749],[98.826785,55.034256],[98.827116,55.032741],[98.827196,55.032047],[98.827238,55.03159],[98.827238,55.031161],[98.82704,55.029147],[98.826637,55.023532],[98.826446,55.017711],[98.82653,55.01674],[98.826687,55.015978],[98.826925,55.015121],[98.827287,55.014064],[98.829692,55.007573],[98.830527,55.005135],[98.831021,55.003708],[98.83149,55.002356],[98.831636,55.001948],[98.833267,54.997398],[98.835086,54.992507],[98.837676,54.985586],[98.837987,54.984595],[98.840003,54.974803],[98.842391,54.969474],[98.844749,54.965343],[98.846771,54.961986],[98.849838,54.958545],[98.852592,54.956508],[98.855369,54.95483],[98.857688,54.953674],[98.858833,54.953237],[98.859952,54.952893],[98.860539,54.95265],[98.866387,54.95047],[98.867979,54.949943],[98.869303,54.949599],[98.869984,54.949482],[98.870525,54.949413],[98.871078,54.949369],[98.871717,54.949354],[98.874722,54.949432],[98.877547,54.949505],[98.878777,54.949533],[98.880251,54.949509],[98.882231,54.949412],[98.884259,54.949218],[98.890724,54.94843],[98.891673,54.948314],[98.892383,54.948236],[98.89291,54.948135],[98.893369,54.948007],[98.893937,54.947832],[98.894729,54.947536],[98.895539,54.947192],[98.902671,54.943908],[98.90345,54.943666],[98.904276,54.943451],[98.905136,54.943334],[98.90603,54.943285],[98.910186,54.943075],[98.911216,54.943055],[98.912306,54.94305],[98.916027,54.943089],[98.918275,54.943084],[98.920992,54.943011],[98.928221,54.942791],[98.930152,54.942773],[98.931541,54.942826],[98.935533,54.942921],[98.935863,54.942922],[98.93638,54.942924],[98.937287,54.942887],[98.939883,54.942749],[98.940784,54.942718],[98.941954,54.942721],[98.943638,54.942745],[98.948222,54.94289],[98.948887,54.942935],[98.949452,54.942987],[98.950696,54.943147],[98.952993,54.943425],[98.954097,54.943581],[98.955239,54.943675],[98.956309,54.943736],[98.957078,54.943746],[98.958229,54.943732],[98.95865,54.943697],[98.960672,54.943517],[98.962454,54.943193],[98.963762,54.942896],[98.964699,54.942612],[98.964712,54.942608],[98.966103,54.942103],[98.967444,54.941522],[98.969036,54.940772],[98.973684,54.938656],[98.974521,54.938283],[98.975514,54.937911],[98.97605,54.937753],[98.977134,54.937519],[98.979516,54.937067],[98.980411,54.936841],[98.98074,54.936755],[98.981146,54.936613],[98.981672,54.936407],[98.982353,54.936111],[98.983367,54.935602],[98.984601,54.934937],[98.988593,54.932749],[98.991165,54.931228],[98.994321,54.929],[98.994968,54.92851],[98.995176,54.928354],[98.995966,54.927739],[98.997142,54.926857],[98.997489,54.926597],[99.003654,54.921966],[99.004246,54.921521],[99.004848,54.921074],[99.005231,54.920877],[99.005672,54.920681],[99.006747,54.920263],[99.006904,54.920203],[99.0075,54.91998],[99.008472,54.919616],[99.008596,54.919567],[99.008979,54.919432],[99.0095,54.919267],[99.010369,54.919005],[99.01135,54.918721],[99.011471,54.918689],[99.012177,54.918503],[99.013291,54.918245],[99.013654,54.918172],[99.013767,54.918139],[99.016713,54.917544],[99.017708,54.917335],[99.018158,54.917258],[99.022364,54.916422],[99.022526,54.916394],[99.022803,54.916347],[99.023041,54.916294],[99.023472,54.916198],[99.023803,54.916093],[99.0241,54.915967],[99.025827,54.914951],[99.026534,54.914551],[99.026812,54.914401],[99.027848,54.913787],[99.028169,54.91357],[99.030092,54.912055],[99.030406,54.911814],[99.03107,54.911354],[99.031202,54.911275],[99.031314,54.911218],[99.031448,54.911168],[99.031609,54.911141],[99.031815,54.911193],[99.032065,54.911324],[99.032404,54.911595],[99.03382,54.912643],[99.034329,54.913002],[99.034757,54.913308],[99.035342,54.913725],[99.036144,54.914297],[99.036294,54.914399],[99.036441,54.914499],[99.036868,54.914789],[99.037002,54.91488],[99.037147,54.914966],[99.03881,54.915997],[99.042147,54.917985],[99.043213,54.918577],[99.043408,54.918686],[99.044018,54.919023],[99.044348,54.919206],[99.045047,54.919563],[99.04573,54.919955],[99.045931,54.920069],[99.046622,54.920497],[99.047181,54.920825],[99.049481,54.919538],[99.050404,54.92007],[99.050673,54.920215],[99.051009,54.920247],[99.051932,54.920177],[99.052197,54.920161],[99.054017,54.920049],[99.055462,54.919993],[99.055847,54.919956],[99.056332,54.919962],[99.058922,54.919922],[99.06316,54.919856],[99.063949,54.919844],[99.064228,54.91984],[99.065041,54.919829],[99.065751,54.919819],[99.06582,54.919817],[99.067581,54.919756],[99.06829,54.919696],[99.068487,54.919679],[99.069168,54.919551],[99.070529,54.919259],[99.070633,54.919226],[99.071148,54.919088],[99.071776,54.918904],[99.071852,54.918881],[99.072288,54.918718],[99.072762,54.918537],[99.074454,54.917893],[99.075416,54.917528],[99.076266,54.917206],[99.077805,54.91673],[99.079904,54.916141],[99.0817,54.915672],[99.083077,54.915364],[99.083636,54.915287],[99.085159,54.915173],[99.087475,54.91506],[99.088319,54.915031],[99.092487,54.91489],[99.093577,54.914824],[99.094328,54.91473],[99.0955,54.914497],[99.103106,54.912835],[99.104152,54.912579],[99.105206,54.91229],[99.105862,54.912008],[99.10643,54.911743],[99.106766,54.911568],[99.107183,54.911308],[99.107787,54.910853],[99.108094,54.910457],[99.10829,54.910036],[99.108536,54.90434],[99.108523,54.903035],[99.108514,54.902698],[99.108558,54.902257],[99.108616,54.901836],[99.108794,54.90125],[99.110625,54.896554],[99.11075,54.89564],[99.110767,54.895419],[99.111003,54.892481],[99.111107,54.891761],[99.111323,54.89088],[99.111353,54.890787],[99.111595,54.890042],[99.111874,54.889551],[99.112324,54.889094],[99.112815,54.888709],[99.113342,54.888332],[99.114175,54.88785],[99.115281,54.887417],[99.116033,54.887134],[99.116618,54.886913],[99.11994,54.885687],[99.120682,54.885376],[99.122141,54.884778],[99.123211,54.884317],[99.123456,54.884201],[99.130015,54.881098],[99.133153,54.879624],[99.135158,54.87865],[99.136359,54.878084],[99.13776,54.87755],[99.13967,54.876906],[99.140478,54.876647],[99.140639,54.876595],[99.141739,54.876304],[99.142678,54.87612],[99.143551,54.876003],[99.144633,54.875904],[99.145924,54.875824],[99.147779,54.875707],[99.154154,54.875355],[99.157491,54.875062],[99.164421,54.874441],[99.17206,54.873827],[99.173607,54.873658],[99.175071,54.873365],[99.176243,54.873048],[99.177539,54.872618],[99.190301,54.868326],[99.190718,54.868186],[99.192162,54.867687],[99.193563,54.867153],[99.19822,54.865229],[99.205369,54.862269],[99.210198,54.86027],[99.216695,54.857463],[99.217998,54.856887],[99.220552,54.85591],[99.221272,54.855706],[99.224458,54.854777],[99.225022,54.854552],[99.225838,54.854133],[99.226642,54.853604],[99.228867,54.851894],[99.229677,54.851427],[99.230534,54.851081],[99.231161,54.850895],[99.23184,54.850754],[99.232803,54.850581],[99.235393,54.850191],[99.238098,54.849784],[99.240562,54.849424],[99.250384,54.847936],[99.254061,54.847396],[99.255443,54.847164],[99.257087,54.846852],[99.259786,54.846257],[99.267356,54.84447],[99.26927,54.844016],[99.273701,54.843001],[99.281597,54.841187],[99.290658,54.839136],[99.292291,54.838755],[99.297186,54.837629],[99.302681,54.836364],[99.304122,54.835945],[99.305483,54.835493],[99.308025,54.834552],[99.308873,54.834182],[99.309722,54.833698],[99.313552,54.831005],[99.318717,54.827327],[99.322563,54.824634],[99.324241,54.823501],[99.32654,54.82212],[99.332542,54.818474],[99.335148,54.816886],[99.335945,54.816356],[99.340137,54.813822],[99.340867,54.813474],[99.341612,54.813198],[99.342406,54.81296],[99.343321,54.812767],[99.345394,54.812423],[99.361481,54.809929],[99.366449,54.809146],[99.372875,54.808141],[99.374519,54.807884],[99.388667,54.805663],[99.397959,54.804213],[99.404117,54.803254],[99.406267,54.802841],[99.407563,54.802519],[99.40884,54.802122],[99.409922,54.801709],[99.413872,54.800139],[99.42339,54.796351],[99.433213,54.792443],[99.43601,54.791363],[99.437979,54.790598],[99.439282,54.790103],[99.441309,54.789355],[99.442867,54.78884],[99.443767,54.788609],[99.445003,54.788328],[99.446696,54.787989],[99.448076,54.787719],[99.459776,54.785633],[99.471383,54.783586],[99.47553,54.782865],[99.481989,54.781731],[99.499043,54.778762],[99.500173,54.778562],[99.506076,54.777532],[99.516664,54.775651],[99.516702,54.775644],[99.536234,54.772177],[99.543791,54.770832],[99.550361,54.769597],[99.551675,54.769314],[99.552835,54.769009],[99.553018,54.768941],[99.554122,54.768531],[99.555648,54.767852],[99.55677,54.767288],[99.562912,54.763988],[99.56887,54.760746],[99.570053,54.760063],[99.570808,54.759582],[99.57299,54.758045],[99.576156,54.75568],[99.577461,54.754634],[99.578666,54.753547],[99.579803,54.752437],[99.580856,54.751289],[99.581535,54.750392],[99.582138,54.749469],[99.584047,54.74615],[99.584312,54.745689],[99.585823,54.743183],[99.58654,54.742279],[99.587432,54.741436],[99.588081,54.74089],[99.589126,54.7401],[99.590255,54.739341],[99.59378,54.737072],[99.600601,54.732765],[99.602058,54.731773],[99.602733,54.731245],[99.602812,54.731183],[99.602966,54.731063],[99.604927,54.729354],[99.60564,54.728869],[99.605968,54.728657],[99.606541,54.728381],[99.606844,54.728254],[99.607482,54.728031],[99.60774,54.727969],[99.609104,54.727643],[99.610753,54.727288],[99.615585,54.726277],[99.618018,54.725754],[99.620078,54.725167],[99.622383,54.724352],[99.624367,54.723557],[99.629759,54.721272],[99.633811,54.719515],[99.639717,54.716989],[99.644882,54.714789],[99.648933,54.712986],[99.649787,54.712631],[99.650596,54.712257],[99.650955,54.712055],[99.651268,54.71183],[99.651519,54.711593],[99.653228,54.709552],[99.656257,54.70605],[99.657493,54.704734],[99.658309,54.703983],[99.658935,54.703506],[99.661216,54.70207],[99.663134,54.700827],[99.667129,54.698168],[99.667911,54.697666],[99.669172,54.69692],[99.669723,54.69659],[99.670482,54.696184],[99.671212,54.695896],[99.671681,54.695725],[99.672883,54.695317],[99.675015,54.694677],[99.677842,54.693836],[99.68071,54.69298],[99.681751,54.692727],[99.689797,54.690952],[99.690444,54.690795],[99.692608,54.690358],[99.697657,54.689348],[99.700935,54.688625],[99.708423,54.687227],[99.709344,54.687011],[99.710209,54.686744],[99.711099,54.686433],[99.711977,54.686062],[99.714824,54.684747],[99.718742,54.682609],[99.720491,54.681626],[99.721202,54.681242],[99.722204,54.680799],[99.72246,54.680695],[99.72299,54.680513],[99.723734,54.680305],[99.724594,54.680079],[99.727016,54.679523],[99.728314,54.679184],[99.728755,54.679069],[99.7296,54.678784],[99.730437,54.678486],[99.731576,54.677987],[99.731933,54.677795],[99.733032,54.6772],[99.735511,54.675727],[99.737373,54.67469],[99.738815,54.673927],[99.740859,54.673011],[99.742164,54.672328],[99.743507,54.671615],[99.744499,54.671054],[99.746406,54.669879],[99.747642,54.669048],[99.748542,54.668392],[99.749397,54.667709],[99.751503,54.66584],[99.752227,54.665138],[99.752883,54.664432],[99.753471,54.663719],[99.755317,54.661369],[99.755874,54.66077],[99.757431,54.659465],[99.759368,54.657928],[99.761985,54.655891],[99.767051,54.651947],[99.771087,54.648849],[99.775741,54.645248],[99.77993,54.641998],[99.78118,54.641052],[99.781687,54.640669],[99.783576,54.639179],[99.784637,54.638443],[99.785786,54.637763],[99.786587,54.637379],[99.787483,54.636982],[99.7882,54.636708],[99.788811,54.636492],[99.789264,54.636344],[99.789762,54.63623],[99.790678,54.636083],[99.791056,54.636022],[99.792131,54.635903],[99.793213,54.635804],[99.794156,54.635732],[99.795597,54.635659],[99.801644,54.63536],[99.816163,54.634644],[99.817808,54.63453],[99.819027,54.634419],[99.819867,54.634303],[99.820571,54.634205],[99.821616,54.634033],[99.822564,54.633845],[99.823204,54.633701],[99.824028,54.633464],[99.825416,54.633056],[99.826293,54.63277],[99.827133,54.632473],[99.830108,54.631343],[99.830757,54.631114],[99.832019,54.630661],[99.832955,54.630384],[99.834449,54.630023],[99.834983,54.629898],[99.836036,54.629695],[99.837759,54.629447],[99.838505,54.629354],[99.839279,54.629319],[99.840267,54.629271],[99.844866,54.62937],[99.846789,54.629411],[99.847582,54.629431],[99.854002,54.629618],[99.858281,54.629739],[99.859793,54.629782],[99.860216,54.629798],[99.860826,54.629825],[99.862068,54.629879],[99.862115,54.62988],[99.865333,54.629954],[99.87371,54.630204],[99.877031,54.630315],[99.880271,54.630559],[99.882485,54.630815],[99.884193,54.631068],[99.884602,54.631128],[99.88674,54.63153],[99.888868,54.631999],[99.891316,54.632661],[99.893665,54.633417],[99.895608,54.634142],[99.897454,54.634905],[99.899662,54.635973],[99.901626,54.637094],[99.905462,54.639476],[99.910296,54.642546],[99.911856,54.643521],[99.912586,54.643977],[99.913759,54.644688],[99.914352,54.645031],[99.914946,54.645309],[99.915581,54.64563],[99.916272,54.645893],[99.917683,54.646371],[99.919402,54.646822],[99.919609,54.646876],[99.920773,54.647094],[99.921938,54.647255],[99.922807,54.647344],[99.923055,54.647369],[99.924398,54.647411],[99.926773,54.647413],[99.927146,54.647414],[99.928662,54.64742],[99.929834,54.647414],[99.931226,54.647411],[99.932596,54.647409],[99.93423,54.647395],[99.937735,54.647379],[99.941256,54.64727],[99.941959,54.647229],[99.942504,54.647206],[99.943084,54.647159],[99.944675,54.646989],[99.945239,54.646935],[99.945983,54.646842],[99.946961,54.646706],[99.947502,54.646617],[99.94797,54.646545],[99.948532,54.646442],[99.949183,54.646321],[99.949931,54.646175],[99.950532,54.646058],[99.951226,54.645907],[99.95268,54.64557],[99.953337,54.6454],[99.953414,54.64538],[99.953833,54.645271],[99.954323,54.645138],[99.955155,54.644903],[99.955853,54.644695],[99.956653,54.644455],[99.957727,54.644122],[99.958725,54.643814],[99.959283,54.643644],[99.959816,54.64349],[99.960834,54.643185],[99.961223,54.643043],[99.961571,54.642944],[99.963356,54.642322],[99.96743,54.641132],[99.967926,54.64101],[99.969187,54.640648],[99.969691,54.640477],[99.970125,54.640351],[99.972053,54.639893],[99.972504,54.639811],[99.974526,54.639563],[99.974611,54.639557],[99.97571,54.639459],[99.976142,54.639447],[99.976545,54.639445],[99.97687,54.639438],[99.978239,54.639473],[99.979774,54.639592],[99.980555,54.639693],[99.981385,54.639808],[99.9825,54.640029],[99.983825,54.640373],[99.98496,54.640732],[99.986056,54.641137],[99.986697,54.64142],[99.98718,54.641631],[99.98779,54.641968],[99.988258,54.642214],[99.988757,54.642473],[99.989076,54.642628],[99.989257,54.642737],[99.989876,54.643024],[99.990663,54.643437],[99.991692,54.64387],[99.992532,54.644172],[99.993619,54.644498],[99.994736,54.644759],[99.995634,54.64488],[99.996482,54.644989],[99.997411,54.645075],[99.998536,54.645119],[99.999253,54.645146],[100.000109,54.645193],[100.001181,54.645213],[100.0021,54.645244],[100.003165,54.645274],[100.003701,54.645301],[100.004235,54.645319],[100.004975,54.645345],[100.005591,54.645353],[100.0061,54.645379],[100.006764,54.645394],[100.007377,54.645401],[100.013701,54.645609],[100.017489,54.645699],[100.019069,54.645772],[100.019076,54.645772],[100.024585,54.645958],[100.027383,54.64604],[100.029516,54.64611],[100.032175,54.646203],[100.033666,54.64626],[100.03649,54.646333],[100.038906,54.646415],[100.039973,54.646443],[100.040873,54.646458],[100.041661,54.646454],[100.042769,54.646427],[100.043705,54.646365],[100.044338,54.646313],[100.044716,54.646257],[100.045258,54.646154],[100.046311,54.645931],[100.046756,54.645823],[100.048328,54.64538],[100.050553,54.644755],[100.053274,54.644032],[100.055248,54.64346],[100.055678,54.643336],[100.056196,54.643182],[100.060755,54.641888],[100.063537,54.641167],[100.06447,54.640961],[100.065984,54.640715],[100.067528,54.640519],[100.071802,54.640073],[100.076692,54.639578],[100.077964,54.639434],[100.07984,54.639258],[100.080847,54.639166],[100.081373,54.639135],[100.082435,54.639071],[100.083623,54.639011],[100.085034,54.638995],[100.08611,54.638992],[100.087407,54.639036],[100.089531,54.63924],[100.091726,54.639571],[100.093145,54.639832],[100.094241,54.640072],[100.095808,54.64045],[100.096319,54.640534],[100.099813,54.64143],[100.102473,54.641851],[100.102873,54.641915],[100.104743,54.642068],[100.105973,54.642094],[100.107513,54.642067],[100.108206,54.642061],[100.109808,54.641918],[100.113074,54.641376],[100.117474,54.640449],[100.122588,54.639394],[100.127173,54.638402],[100.128984,54.637953],[100.130303,54.637532],[100.132016,54.636804],[100.134752,54.635528],[100.136481,54.634702],[100.138277,54.633844],[100.140451,54.632827],[100.141204,54.632461],[100.14258,54.631794],[100.147705,54.629357],[100.149578,54.628587],[100.151131,54.628009],[100.156332,54.626525],[100.160004,54.625583],[100.163492,54.624677],[100.163686,54.624625],[100.168619,54.623314],[100.173088,54.622145],[100.174008,54.621899],[100.176856,54.62117],[100.17823,54.620803],[100.180434,54.620254],[100.182849,54.619649],[100.184399,54.619219],[100.185819,54.618796],[100.1876,54.618324],[100.18877,54.61802],[100.189825,54.617741],[100.190784,54.617471],[100.191669,54.617179],[100.19264,54.616829],[100.193482,54.616434],[100.194567,54.615788],[100.195355,54.615197],[100.196595,54.613914],[100.19734,54.613138],[100.198075,54.61251],[100.199041,54.61187],[100.200191,54.611242],[100.201444,54.610764],[100.203634,54.610141],[100.206177,54.609438],[100.208838,54.608748],[100.209681,54.608557],[100.210147,54.608419],[100.211733,54.607994],[100.212663,54.60775],[100.214041,54.607387],[100.215887,54.606921],[100.218233,54.606445],[100.219623,54.606181],[100.221195,54.605902],[100.223983,54.605412],[100.226834,54.604915],[100.229167,54.604505],[100.231421,54.60411],[100.23377,54.603699],[100.234022,54.603651],[100.235751,54.603205],[100.236254,54.603079],[100.238878,54.602365],[100.239974,54.602072],[100.240995,54.601778],[100.241429,54.601664],[100.241943,54.601542],[100.24319,54.601251],[100.245025,54.600798],[100.246121,54.600462],[100.247431,54.600117],[100.248842,54.599746],[100.249287,54.599621],[100.249899,54.59947],[100.250687,54.599228],[100.252712,54.598623],[100.255669,54.597622],[100.257706,54.596833],[100.259678,54.595995],[100.261759,54.595092],[100.264156,54.594128],[100.26666,54.593238],[100.271572,54.591636],[100.274411,54.590702],[100.277701,54.589663],[100.278751,54.58932],[100.279374,54.589107],[100.28103,54.58855],[100.281519,54.588371],[100.282234,54.588144],[100.282949,54.587941],[100.284825,54.587318],[100.285032,54.587235],[100.28672,54.586711],[100.287638,54.586428],[100.288351,54.586211],[100.289517,54.585864],[100.290409,54.585567],[100.291385,54.585176],[100.292159,54.584927],[100.29336,54.584535],[100.294299,54.584208],[100.295048,54.583958],[100.296653,54.583435],[100.297079,54.583307],[100.297264,54.583267],[100.297683,54.583179],[100.298141,54.5831],[100.298578,54.583039],[100.299284,54.582958],[100.299956,54.582915],[100.300575,54.58291],[100.301382,54.582923],[100.301994,54.582923],[100.302717,54.582879],[100.304246,54.582751],[100.305081,54.582675],[100.305313,54.582657],[100.305742,54.582656],[100.306182,54.582654],[100.306948,54.582702],[100.307722,54.58275],[100.308991,54.58283],[100.31004,54.582816],[100.311046,54.58277],[100.312063,54.5827],[100.313636,54.582589],[100.313884,54.58257],[100.31457,54.582583],[100.315254,54.582661],[100.315896,54.582787],[100.31672,54.582996],[100.318153,54.583419],[100.318511,54.583521],[100.31929,54.583698],[100.319563,54.583747],[100.320609,54.583915],[100.322622,54.584151],[100.323806,54.584262],[100.324628,54.584334],[100.326508,54.584517],[100.327598,54.584598],[100.328804,54.584697],[100.329072,54.584716],[100.329566,54.584728],[100.33065,54.584734],[100.331403,54.584732],[100.332709,54.584727],[100.333481,54.584724],[100.333992,54.584751],[100.334782,54.584786],[100.336021,54.584835],[100.336952,54.584868],[100.33843,54.584912],[100.339154,54.584902],[100.339974,54.584886],[100.34136,54.584756],[100.34235,54.584665],[100.343491,54.584472],[100.345454,54.584021],[100.347194,54.583629],[100.348572,54.583279],[100.349861,54.583029],[100.35099,54.582873],[100.35344,54.582604],[100.354904,54.582462],[100.355383,54.582443],[100.356575,54.582391],[100.357225,54.582381],[100.3587,54.582362],[100.360358,54.5824],[100.361103,54.582435],[100.362388,54.5825],[100.362868,54.582517],[100.3637,54.582511],[100.365923,54.582496],[100.367286,54.582484],[100.369187,54.582469],[100.369997,54.582457],[100.370835,54.582425],[100.372197,54.582386],[100.37252,54.582385],[100.374495,54.582498],[100.375481,54.582562],[100.376179,54.582584],[100.376929,54.582611],[100.377539,54.582642],[100.378781,54.582786],[100.380786,54.583081],[100.381701,54.583211],[100.38272,54.583363],[100.384366,54.583701],[100.385463,54.583928],[100.386634,54.584215],[100.387482,54.584386],[100.38845,54.584584],[100.389152,54.584728],[100.390199,54.584922],[100.390504,54.584978],[100.390649,54.584999],[100.390785,54.585018],[100.391098,54.585056],[100.391309,54.585074],[100.391607,54.58509],[100.392526,54.585089],[100.393598,54.585007],[100.394255,54.584944],[100.394881,54.584793],[100.395354,54.584656],[100.395991,54.584408],[100.396549,54.584194],[100.397447,54.583911],[100.399071,54.58345],[100.400041,54.583174],[100.400357,54.583088],[100.400956,54.582964],[100.40135,54.582893],[100.401814,54.582846],[100.402066,54.582818],[100.40249,54.582786],[100.403026,54.582744],[100.403103,54.582737],[100.40395,54.5827],[100.404506,54.582694],[100.405042,54.582715],[100.405423,54.582728],[100.406492,54.582841],[100.408022,54.583041],[100.40905,54.583156],[100.409339,54.583203],[100.410053,54.583267],[100.410806,54.583335],[100.411879,54.583419],[100.412798,54.583477],[100.414235,54.583489],[100.41744,54.583475],[100.418542,54.583463],[100.419362,54.58346],[100.419796,54.583419],[100.420302,54.58337],[100.42112,54.583255],[100.422908,54.583005],[100.423688,54.582895],[100.425248,54.582705],[100.426857,54.582539],[100.428522,54.582388],[100.430696,54.582227],[100.432151,54.582117],[100.435119,54.58192],[100.436149,54.581825],[100.43721,54.581695],[100.439323,54.581398],[100.440376,54.58123],[100.441932,54.580936],[100.442459,54.580848],[100.443511,54.580703],[100.445114,54.58052],[100.44886,54.58012],[100.452026,54.579719],[100.454101,54.579422],[100.455642,54.579177],[100.459182,54.578559],[100.464978,54.577495],[100.465591,54.577384],[100.467004,54.577176],[100.467896,54.577079],[100.469204,54.576996],[100.471325,54.576871],[100.473114,54.576686],[100.475508,54.576498],[100.476505,54.576443],[100.477004,54.576437],[100.478084,54.576415],[100.480782,54.576443],[100.48472,54.576508],[100.488676,54.576636],[100.489778,54.57663],[100.490864,54.576591],[100.491928,54.576484],[100.49295,54.576366],[100.495506,54.576038],[100.50177,54.575157],[100.502861,54.575035],[100.503982,54.574963],[100.505107,54.574909],[100.506254,54.574902],[100.506802,54.574915],[100.510192,54.574955],[100.510959,54.574967],[100.511311,54.574973],[100.513527,54.57495],[100.515095,54.574992],[100.515605,54.575018],[100.522125,54.575438],[100.524347,54.575493],[100.526569,54.575522],[100.527161,54.575528],[100.528655,54.575558],[100.531069,54.575573],[100.532258,54.575578],[100.532815,54.575584],[100.532953,54.575583],[100.533399,54.57558],[100.533562,54.575577],[100.534716,54.575559],[100.535272,54.575546],[100.535927,54.575544],[100.536273,54.575542],[100.53655,54.575539],[100.537332,54.575535],[100.537589,54.575534],[100.537798,54.575533],[100.537935,54.575532],[100.538422,54.575539],[100.53905,54.575552],[100.539579,54.575567],[100.539921,54.575577],[100.540035,54.575581],[100.540551,54.575596],[100.540648,54.575596],[100.540966,54.57561],[100.541917,54.575632],[100.542245,54.575637],[100.542424,54.575638],[100.542552,54.575646],[100.542628,54.575669],[100.542725,54.575697],[100.542796,54.575756],[100.542791,54.575818],[100.542797,54.575876],[100.542796,54.575892],[100.542793,54.575992],[100.542783,54.5761],[100.54277,54.576226],[100.542738,54.576769],[100.542718,54.577158],[100.542713,54.577252],[100.542698,54.577585],[100.542711,54.577784],[100.542717,54.577835],[100.542733,54.577953],[100.542756,54.578054],[100.542797,54.57817],[100.542844,54.578274],[100.542907,54.578382],[100.542989,54.57852],[100.543079,54.57865],[100.543169,54.578774],[100.543261,54.578887],[100.543399,54.578972],[100.543502,54.579068],[100.543624,54.579171],[100.543768,54.579278],[100.543934,54.579393],[100.544136,54.579519],[100.544405,54.579665],[100.544628,54.579777],[100.544836,54.579868],[100.544964,54.579927],[100.545079,54.57998],[100.545278,54.580064],[100.545411,54.580125],[100.545565,54.580195],[100.546702,54.580759],[100.547066,54.58095],[100.547246,54.581035],[100.547497,54.581151],[100.547773,54.58126],[100.54802,54.581347],[100.548264,54.581426],[100.548499,54.581486],[100.548694,54.581528],[100.548885,54.581561],[100.549097,54.581586],[100.549334,54.581603],[100.549558,54.581613],[100.549753,54.581614],[100.549964,54.581608],[100.550161,54.5816],[100.550225,54.581595],[100.550339,54.581577],[100.550521,54.581551],[100.550721,54.581511],[100.551157,54.581402],[100.551486,54.581332],[100.551544,54.58132],[100.551813,54.581266],[100.55203,54.581225],[100.552261,54.581184],[100.552493,54.581145],[100.552745,54.581102],[100.553003,54.581066],[100.553245,54.581035],[100.553474,54.581012],[100.553636,54.581001],[100.553754,54.580993],[100.554703,54.580933],[100.555077,54.580909],[100.556327,54.580825],[100.556833,54.580774],[100.557434,54.580699],[100.557829,54.580658],[100.558691,54.580584],[100.558919,54.580563],[100.559114,54.580545],[100.559202,54.580539],[100.559405,54.580526],[100.559545,54.580525],[100.559855,54.580517],[100.560251,54.580533],[100.560635,54.580585],[100.561645,54.580764],[100.561941,54.580817],[100.562221,54.580874],[100.562398,54.580899],[100.56256,54.580915],[100.562787,54.580931],[100.562995,54.580932],[100.563243,54.580924],[100.563436,54.580904],[100.563618,54.580877],[100.563935,54.580805],[100.564221,54.580712],[100.564675,54.580543],[100.565134,54.580352],[100.565673,54.580126],[100.565941,54.580019],[100.566686,54.579719],[100.568483,54.578992],[100.57021,54.578277],[100.570364,54.578205],[100.570693,54.57807],[100.571866,54.577561],[100.573,54.577054],[100.573758,54.576733],[100.574077,54.576598],[100.574395,54.576482],[100.574699,54.5764],[100.574924,54.576358],[100.575277,54.576305],[100.575451,54.576287],[100.575674,54.576275],[100.576,54.576272],[100.576394,54.576286],[100.576795,54.576312],[100.577644,54.576359],[100.577793,54.576364],[100.578031,54.576371],[100.57828,54.576368],[100.57843,54.57636],[100.578591,54.576336],[100.578744,54.576302],[100.578886,54.576259],[100.579111,54.576167],[100.579233,54.576086],[100.579347,54.575985],[100.579528,54.575797],[100.579704,54.575588],[100.580387,54.574834],[100.580702,54.574486],[100.580977,54.574189],[100.581554,54.573526],[100.58195,54.573083],[100.582289,54.572677],[100.58266,54.572295],[100.582908,54.57206],[100.583177,54.571827],[100.583481,54.571595],[100.583723,54.571414],[100.583937,54.571266],[100.584224,54.571106],[100.584821,54.570791],[100.5852,54.57059],[100.585507,54.570404],[100.585689,54.570269],[100.5858,54.570185],[100.585855,54.570146],[100.585945,54.570064],[100.585987,54.570034],[100.586069,54.569853],[100.586084,54.569815],[100.586111,54.569747],[100.586121,54.569705],[100.586142,54.569506],[100.586166,54.569419],[100.586223,54.569348],[100.586257,54.569311],[100.586281,54.569286],[100.586328,54.569238],[100.586422,54.569144],[100.586551,54.568978],[100.586612,54.568912],[100.586671,54.568838],[100.586765,54.568741],[100.586826,54.568635],[100.586895,54.568533],[100.586939,54.568458],[100.587112,54.56819],[100.587277,54.567897],[100.587388,54.567694],[100.587481,54.567512],[100.587523,54.567419],[100.587537,54.567388],[100.587565,54.567325],[100.587616,54.567136],[100.587686,54.566892],[100.587757,54.566586],[100.587833,54.566332],[100.587842,54.566292],[100.587875,54.566144],[100.587893,54.566067],[100.587899,54.566025],[100.587923,54.565911],[100.58794,54.565761],[100.58793,54.565703],[100.587905,54.565641],[100.587804,54.565543],[100.587677,54.565454],[100.587579,54.565385],[100.587315,54.565218],[100.587274,54.565192],[100.587022,54.565046],[100.586939,54.564981],[100.586712,54.564812],[100.586576,54.564708],[100.586533,54.564675],[100.58648,54.564609],[100.586462,54.564541],[100.586475,54.564477],[100.58653,54.564393],[100.586601,54.564307],[100.586627,54.56428],[100.586823,54.564072],[100.586932,54.563973],[100.587083,54.563841],[100.587183,54.563762],[100.587265,54.563707],[100.587309,54.563676],[100.587419,54.563602],[100.587771,54.563413],[100.588109,54.563234],[100.588199,54.563188],[100.588548,54.563007],[100.58869,54.562923],[100.588734,54.562897],[100.589945,54.562171],[100.590973,54.561554],[100.591079,54.561488],[100.591145,54.561448],[100.592616,54.560583],[100.593843,54.559826],[100.593929,54.559776],[100.594222,54.55959],[100.594596,54.559338],[100.59472,54.559255],[100.594855,54.55916],[100.595005,54.559053],[100.595138,54.558946],[100.595303,54.558798],[100.595453,54.558649],[100.595662,54.558439],[100.595853,54.55822],[100.596269,54.557705],[100.596773,54.557123],[100.597297,54.556501],[100.597422,54.556348],[100.597818,54.555866],[100.598151,54.555474],[100.598222,54.555387],[100.598273,54.555325],[100.598348,54.555224],[100.598411,54.555126],[100.598473,54.555008],[100.598517,54.554902],[100.598545,54.554828],[100.598558,54.554788],[100.598553,54.554683],[100.598545,54.554612],[100.598521,54.554524],[100.598492,54.554432],[100.598453,54.554349],[100.598414,54.554272],[100.598357,54.554177],[100.598275,54.554051],[100.598208,54.553952],[100.598171,54.553902],[100.598117,54.553838],[100.59791,54.553603],[100.597659,54.553299],[100.59752,54.553127],[100.597193,54.552703],[100.597062,54.552541],[100.596958,54.552425],[100.596813,54.552271],[100.596426,54.551884],[100.596369,54.551827],[100.596238,54.551701],[100.596138,54.551611],[100.595955,54.55146],[100.59545,54.551059],[100.595191,54.550852],[100.594944,54.550653],[100.594802,54.550529],[100.594665,54.550405],[100.594477,54.550223],[100.594371,54.550116],[100.594307,54.550046],[100.594263,54.549991],[100.59422,54.549934],[100.594174,54.549865],[100.594121,54.549782],[100.594083,54.549718],[100.593815,54.549304],[100.593498,54.548768],[100.592808,54.54772],[100.592542,54.547248],[100.59225,54.54666],[100.59213,54.54646],[100.592011,54.546252],[100.591881,54.546049],[100.591795,54.545893],[100.591726,54.545747],[100.591682,54.545645],[100.591655,54.545504],[100.591637,54.545405],[100.591632,54.545293],[100.591642,54.545185],[100.591664,54.545076],[100.591702,54.544948],[100.591745,54.544824],[100.591802,54.544681],[100.591883,54.544466],[100.591923,54.544371],[100.591999,54.544196],[100.592062,54.544046],[100.592123,54.543906],[100.59217,54.543816],[100.592233,54.543688],[100.592325,54.543516],[100.592561,54.543146],[100.592713,54.542882],[100.592978,54.542477],[100.593551,54.5416],[100.593707,54.541311],[100.593777,54.541204],[100.593846,54.541113],[100.593917,54.541039],[100.59399,54.540974],[100.594069,54.540919],[100.594156,54.540869],[100.594254,54.540824],[100.594374,54.540777],[100.5945,54.540733],[100.594636,54.540677],[100.59478,54.540642],[100.594918,54.540615],[100.595,54.540601],[100.595054,54.540592],[100.595206,54.540573],[100.595401,54.540551],[100.595498,54.540537],[100.595678,54.540523],[100.596245,54.540479],[100.596788,54.540439],[100.597551,54.540385],[100.598087,54.540344],[100.598684,54.5403],[100.598861,54.540288],[100.600538,54.540159],[100.600831,54.540137],[100.602386,54.540017],[100.603088,54.539963],[100.603617,54.539922],[100.605066,54.539817],[100.605386,54.539789],[100.605784,54.539755],[100.606281,54.539716],[100.607289,54.539637],[100.60761,54.539606],[100.607709,54.539597],[100.607845,54.539581],[100.608044,54.539557],[100.608182,54.539534],[100.608318,54.539506],[100.608445,54.539476],[100.608538,54.539444],[100.608652,54.539397],[100.608792,54.539345],[100.608868,54.539317],[100.609024,54.539262],[100.610184,54.538797],[100.610603,54.538633],[100.611211,54.538393],[100.612081,54.538051],[100.612939,54.537709],[100.613098,54.537643],[100.613517,54.537473],[100.613741,54.537373],[100.614289,54.53716],[100.614662,54.537019],[100.615059,54.536861],[100.615123,54.536835],[100.615467,54.536697],[100.616425,54.536312],[100.617663,54.535816],[100.618077,54.535651],[100.618699,54.535402],[100.619245,54.535181],[100.619401,54.535113],[100.619793,54.534952],[100.619913,54.534901],[100.620041,54.53485],[100.620983,54.534457],[100.621144,54.534392],[100.622083,54.533996],[100.622487,54.533817],[100.622806,54.53367],[100.623134,54.533518],[100.623275,54.533443],[100.623449,54.533341],[100.623716,54.533194],[100.623812,54.533141],[100.624164,54.532943],[100.624461,54.532772],[100.625498,54.532179],[100.625769,54.53203],[100.625944,54.531939],[100.626146,54.53184],[100.626421,54.531713],[100.627166,54.531362],[100.627267,54.531315],[100.62805,54.530951],[100.628285,54.530839],[100.628527,54.530722],[100.628757,54.53061],[100.628926,54.53053],[100.629117,54.530437],[100.629629,54.530189],[100.630718,54.529701],[100.631133,54.529496],[100.63141,54.529362],[100.633092,54.528532],[100.634611,54.52783],[100.635445,54.527457],[100.635874,54.527282],[100.636389,54.527108],[100.636506,54.527076],[100.636774,54.527004],[100.637642,54.526768],[100.638125,54.526637],[100.638476,54.526542],[100.639245,54.526333],[100.641555,54.525703],[100.64198,54.525586],[100.64225,54.52552],[100.642488,54.52548],[100.642671,54.525457],[100.642828,54.525452],[100.643368,54.525468],[100.643707,54.525488],[100.645546,54.525595],[100.646842,54.525668],[100.647812,54.525717],[100.648807,54.525765],[100.649747,54.525815],[100.650051,54.525823],[100.650399,54.525816],[100.650697,54.5258],[100.651024,54.525775],[100.651485,54.525699],[100.651804,54.525626],[100.65209,54.52555],[100.652357,54.525469],[100.652626,54.525376],[100.653183,54.525166],[100.653399,54.525074],[100.653616,54.524976],[100.65399,54.524788],[100.654193,54.524672],[100.654406,54.524544],[100.654764,54.524306],[100.65554,54.523816],[100.656901,54.522969],[100.657701,54.522453],[100.658664,54.521849],[100.660211,54.520773],[100.660954,54.520364],[100.661013,54.520332],[100.66161,54.520007],[100.662078,54.519777],[100.664211,54.518787],[100.665249,54.518275],[100.666192,54.517803],[100.668075,54.51689],[100.668904,54.51656],[100.669304,54.516423],[100.669765,54.51628],[100.670517,54.516098],[100.671093,54.515983],[100.671839,54.515868],[100.672495,54.515766],[100.673094,54.515702],[100.673491,54.515667],[100.67392,54.515642],[100.67466,54.515635],[100.675711,54.515687],[100.676654,54.515765],[100.677441,54.515864],[100.67826,54.516003],[100.679181,54.516207],[100.680353,54.516508],[100.689109,54.518886],[100.690568,54.519235],[100.691768,54.519492],[100.695203,54.519957],[100.696834,54.520157],[100.698207,54.520256],[100.699452,54.520281],[100.700782,54.520281],[100.701941,54.520231],[100.7031,54.520156],[100.707093,54.519663],[100.710266,54.519285],[100.711082,54.51921],[100.711768,54.51921],[100.712555,54.519243],[100.713684,54.51927],[100.718831,54.519411],[100.721534,54.519457],[100.723187,54.519489],[100.723418,54.519494],[100.724722,54.519417],[100.726059,54.519307],[100.727175,54.519133],[100.728291,54.518908],[100.72882,54.518797],[100.730428,54.518349],[100.734084,54.516939],[100.736329,54.516079],[100.743003,54.513521],[100.744342,54.513019],[100.745203,54.51267],[100.746137,54.512252],[100.746947,54.511813],[100.750986,54.509524],[100.752827,54.50848],[100.75459,54.507437],[100.755785,54.506752],[100.757173,54.505881],[100.759448,54.504469],[100.759927,54.504171],[100.761162,54.503393],[100.762629,54.502469],[100.766419,54.500082],[100.770691,54.497359],[100.770841,54.497267],[100.771229,54.497028],[100.772193,54.496437],[100.775026,54.494792],[100.777037,54.493632],[100.777895,54.493033],[100.778716,54.492374],[100.781126,54.490609],[100.785681,54.48732],[100.786175,54.486971],[100.787296,54.486395],[100.788859,54.485786],[100.791219,54.484881],[100.79356,54.483927],[100.79511,54.48325],[100.796351,54.482716],[100.798466,54.481737],[100.799959,54.481031],[100.801157,54.480459],[100.802318,54.479866],[100.805202,54.478295],[100.809898,54.475659],[100.814894,54.472927],[100.815562,54.472649],[100.816242,54.472392],[100.816748,54.472204],[100.819399,54.471344],[100.820516,54.470957],[100.823464,54.470013],[100.823477,54.470009],[100.825065,54.469486],[100.826181,54.469087],[100.827211,54.468688],[100.829485,54.467715],[100.830733,54.467111],[100.832489,54.466343],[100.835194,54.465163],[100.836193,54.464723],[100.836631,54.464556],[100.837084,54.464386],[100.837576,54.46424],[100.838063,54.46411],[100.838783,54.463953],[100.839778,54.463757],[100.84201,54.463363],[100.844887,54.462862],[100.855334,54.461043],[100.855814,54.460959],[100.85615,54.460924],[100.85634,54.460915],[100.856469,54.460921],[100.856592,54.46094],[100.856683,54.460968],[100.856775,54.461012],[100.856879,54.461082],[100.856973,54.461161],[100.857125,54.4613],[100.857257,54.461471],[100.857296,54.461522],[100.857536,54.461838],[100.857596,54.461894],[100.857692,54.461958],[100.857829,54.462031],[100.857951,54.462082],[100.858088,54.462123],[100.858316,54.462163],[100.858506,54.462174],[100.858687,54.462169],[100.858859,54.462154],[100.859155,54.462109],[100.85957,54.462032],[100.86232,54.461499],[100.867267,54.460525],[100.868703,54.460258],[100.869281,54.46014],[100.8699,54.460038],[100.870822,54.459922],[100.871704,54.459832],[100.872701,54.459708],[100.882272,54.458778],[100.883846,54.458625],[100.884813,54.458531],[100.885771,54.458436],[100.885815,54.458431],[100.887213,54.458373],[100.88826,54.458361],[100.88973,54.458411],[100.894941,54.458695],[100.897909,54.459083],[100.902048,54.459923],[100.903048,54.460125],[100.903601,54.460237],[100.906654,54.460842],[100.906836,54.46088],[100.907139,54.460934],[100.908652,54.461239],[100.909147,54.461335],[100.910027,54.461515],[100.910953,54.461738],[100.912019,54.462085],[100.912491,54.46222],[100.912581,54.462241],[100.912999,54.46235],[100.913437,54.462466],[100.913802,54.462525],[100.91417,54.462553],[100.914222,54.462557],[100.914454,54.462565],[100.915738,54.462618],[100.917493,54.462697],[100.91945,54.462746],[100.920632,54.462778],[100.921334,54.462854],[100.921847,54.462909],[100.921958,54.462927],[100.924107,54.463292],[100.925698,54.463506],[100.92663,54.4636],[100.92799,54.463677],[100.928619,54.463691],[100.930224,54.463623],[100.934139,54.463282],[100.935034,54.463204],[100.936394,54.463086],[100.941998,54.462596],[100.9438,54.462512],[100.944941,54.462533],[100.946455,54.462645],[100.948509,54.462987],[100.950887,54.463476],[100.959328,54.465247],[100.972487,54.46797],[100.973624,54.468224],[100.975099,54.468554],[100.976533,54.468911],[100.979031,54.469618],[100.979916,54.46988],[100.980964,54.470202],[100.98179,54.470479],[100.982556,54.470742],[100.983131,54.470954],[100.983748,54.471197],[100.984404,54.471449],[100.985341,54.471835],[100.992241,54.47497],[100.993274,54.47545],[100.995991,54.476697],[100.998276,54.477718],[101.000121,54.478354],[101.001799,54.478776],[101.003467,54.47905],[101.005206,54.479247],[101.008233,54.479525],[101.010593,54.47975],[101.011577,54.479843],[101.017898,54.480359],[101.030369,54.481479],[101.031494,54.481629],[101.03226,54.481734],[101.033187,54.48188],[101.0349,54.482179],[101.03828,54.482804],[101.043989,54.483889],[101.044906,54.484063],[101.045632,54.484136],[101.046166,54.484174],[101.046861,54.484185],[101.04766,54.484177],[101.048637,54.484135],[101.051102,54.483994],[101.052104,54.483936],[101.052457,54.483916],[101.056694,54.483673],[101.057516,54.483626],[101.061661,54.483388],[101.062602,54.483334],[101.066975,54.483083],[101.068043,54.483022],[101.069588,54.482934],[101.072541,54.482764],[101.072995,54.482706],[101.073854,54.482595],[101.074548,54.482477],[101.075189,54.482351],[101.083372,54.480627],[101.086106,54.480006],[101.08716,54.479762],[101.087832,54.479565],[101.08851,54.479351],[101.089293,54.479065],[101.089904,54.478815],[101.090596,54.4785],[101.091441,54.478069],[101.097074,54.475054],[101.102855,54.472],[101.104101,54.471473],[101.104886,54.471205],[101.105484,54.471011],[101.106701,54.470698],[101.108431,54.470313],[101.110432,54.469866],[101.11055,54.46984],[101.122326,54.467209],[101.12278,54.467108],[101.124485,54.466839],[101.126416,54.46657],[101.134116,54.465513],[101.136344,54.465197],[101.141954,54.464433],[101.143358,54.464293],[101.143603,54.464259],[101.143701,54.464246],[101.143864,54.464211],[101.143955,54.464186],[101.144114,54.46411],[101.144176,54.464072],[101.144393,54.463981],[101.144569,54.463937],[101.145055,54.463872],[101.145817,54.463787],[101.148126,54.463538],[101.149039,54.463425],[101.149291,54.463394],[101.150095,54.463274],[101.150509,54.463205],[101.150577,54.463188],[101.150745,54.463151],[101.151118,54.463069],[101.151911,54.462881],[101.154323,54.462183],[101.15442,54.462154],[101.156635,54.461485],[101.157636,54.461177],[101.158418,54.460936],[101.158783,54.46083],[101.158881,54.460795],[101.159559,54.46055],[101.16028,54.460284],[101.161278,54.459864],[101.163285,54.458915],[101.164219,54.458474],[101.165327,54.457971],[101.166698,54.457399],[101.166796,54.45736],[101.167625,54.457032],[101.168692,54.456643],[101.169442,54.45637],[101.172603,54.455257],[101.173235,54.455035],[101.174322,54.45462],[101.174926,54.454427],[101.175205,54.454326],[101.175779,54.454159],[101.17941,54.453213],[101.181126,54.452751],[101.181514,54.452657],[101.182448,54.452411],[101.184261,54.451932],[101.184495,54.451868],[101.185557,54.451581],[101.188507,54.450763],[101.19065,54.450184],[101.1914,54.450001],[101.192901,54.449653],[101.193776,54.449484],[101.194857,54.449369],[101.196507,54.449254],[101.19753,54.449169],[101.198257,54.449074],[101.198777,54.448967],[101.199164,54.448865],[101.199729,54.448656],[101.200561,54.448311],[101.201325,54.447984],[101.201939,54.447779],[101.20272,54.447566],[101.205037,54.446959],[101.205633,54.446803],[101.207061,54.446436],[101.208367,54.446178],[101.21858,54.444304],[101.222955,54.443397],[101.22449,54.443068],[101.23079,54.441505],[101.232798,54.44102],[101.242064,54.43877],[101.247928,54.437347],[101.252979,54.436142],[101.25298,54.436142],[101.254886,54.435751],[101.255616,54.435642],[101.256307,54.435593],[101.256415,54.435586],[101.266245,54.434898],[101.268311,54.434641],[101.275759,54.433221],[101.278013,54.432833],[101.28705,54.431511],[101.296344,54.430102],[101.297629,54.429907],[101.29851,54.429772],[101.29893,54.42971],[101.299355,54.429642],[101.300494,54.42947],[101.301621,54.429302],[101.303707,54.428979],[101.305974,54.428565],[101.30793,54.428126],[101.310673,54.427463],[101.316939,54.425803],[101.318152,54.425482],[101.319428,54.425082],[101.320753,54.42462],[101.322067,54.42407],[101.323173,54.423587],[101.324108,54.423097],[101.332296,54.418551],[101.356585,54.405092],[101.360307,54.403038],[101.360987,54.402629],[101.361724,54.402152],[101.362207,54.401818],[101.362884,54.40131],[101.363527,54.400801],[101.367025,54.397752],[101.376028,54.389924],[101.377934,54.38829],[101.378687,54.387693],[101.378758,54.387637],[101.379595,54.387014],[101.380084,54.386682],[101.380483,54.386419],[101.380953,54.386145],[101.382377,54.385312],[101.383457,54.384781],[101.384275,54.384421],[101.385099,54.38405],[101.385878,54.383739],[101.387088,54.383297],[101.396213,54.380508],[101.417358,54.374042],[101.417402,54.374029],[101.439746,54.367294],[101.440715,54.366988],[101.44132,54.366789],[101.441709,54.366638],[101.442221,54.366429],[101.443058,54.366057],[101.443618,54.365795],[101.444544,54.365326],[101.453547,54.360764],[101.453803,54.360635],[101.454315,54.360375],[101.454638,54.360224],[101.45508,54.360012],[101.455371,54.359882],[101.455635,54.359765],[101.45594,54.359646],[101.456359,54.359486],[101.45675,54.359349],[101.457128,54.359224],[101.45751,54.359112],[101.45798,54.358991],[101.458507,54.358863],[101.459076,54.358741],[101.459704,54.358635],[101.460265,54.358549],[101.460701,54.3585],[101.46127,54.358455],[101.461862,54.35842],[101.462726,54.358399],[101.463378,54.358402],[101.463956,54.358439],[101.464374,54.35847],[101.464971,54.358516],[101.465622,54.358585],[101.466011,54.358646],[101.467263,54.358891],[101.468119,54.359101],[101.46939,54.359494],[101.470513,54.359862],[101.47109,54.360029],[101.471556,54.360159],[101.472142,54.360286],[101.472792,54.360399],[101.473308,54.360469],[101.473854,54.360515],[101.474466,54.360545],[101.475155,54.36056],[101.475715,54.360541],[101.476283,54.360519],[101.476828,54.360455],[101.477414,54.36038],[101.47791,54.360294],[101.478304,54.360206],[101.478689,54.360113],[101.479056,54.360016],[101.479481,54.359888],[101.480097,54.359683],[101.481032,54.359303],[101.481804,54.359003],[101.482384,54.358782],[101.482924,54.358587],[101.483549,54.358388],[101.484152,54.358228],[101.484733,54.358088],[101.485371,54.357953],[101.48604,54.357837],[101.486555,54.357758],[101.487283,54.357673],[101.492272,54.357261],[101.493522,54.357164],[101.495565,54.356976],[101.496154,54.356922],[101.497117,54.356846],[101.504656,54.356289],[101.508409,54.355993],[101.50971,54.355896],[101.51049,54.355862],[101.511555,54.355849],[101.512628,54.355869],[101.513103,54.355871],[101.513553,54.355887],[101.514402,54.355925],[101.515666,54.356004],[101.516458,54.356055],[101.516886,54.356085],[101.517162,54.356102],[101.517413,54.356094],[101.51759,54.356077],[101.517782,54.356047],[101.518042,54.35595],[101.518233,54.355838],[101.518307,54.355786],[101.518644,54.355574],[101.519301,54.355146],[101.519785,54.354823],[101.520122,54.354612],[101.520732,54.354231],[101.520846,54.354165],[101.521337,54.353885],[101.521501,54.35377],[101.521678,54.353637],[101.521993,54.353358],[101.522361,54.352998],[101.522694,54.352672],[101.522929,54.352443],[101.523128,54.352248],[101.523152,54.352225],[101.523328,54.35206],[101.523485,54.35192],[101.523579,54.351837],[101.523869,54.351606],[101.524103,54.35144],[101.524393,54.351225],[101.524602,54.35109],[101.52477,54.350998],[101.524918,54.350916],[101.525291,54.350741],[101.52599,54.350422],[101.527299,54.349854],[101.527512,54.349762],[101.529706,54.348869],[101.53001,54.348748],[101.531316,54.348236],[101.531631,54.3481],[101.532022,54.347933],[101.532363,54.347779],[101.532596,54.347668],[101.532752,54.347579],[101.533358,54.347221],[101.533761,54.34693],[101.534294,54.346544],[101.534893,54.346089],[101.535543,54.345584],[101.535972,54.345252],[101.537275,54.34425],[101.537446,54.34414],[101.537721,54.343963],[101.538044,54.343745],[101.538362,54.343535],[101.538432,54.343493],[101.541778,54.341429],[101.542146,54.341198],[101.543596,54.340288],[101.544915,54.339471],[101.545536,54.339079],[101.546121,54.338748],[101.546734,54.338399],[101.546973,54.338263],[101.547415,54.338019],[101.547914,54.337768],[101.54858,54.337444],[101.556062,54.334262],[101.560922,54.332171],[101.561698,54.33181],[101.562201,54.331557],[101.562877,54.331212],[101.563307,54.330977],[101.563809,54.330683],[101.569785,54.327305],[101.572466,54.32579],[101.580074,54.321471],[101.586929,54.31756],[101.588784,54.316596],[101.589399,54.316309],[101.58999,54.316034],[101.590852,54.31565],[101.591572,54.315344],[101.592648,54.314941],[101.594244,54.314357],[101.607556,54.310879],[101.607585,54.310871],[101.615948,54.308782],[101.616423,54.308664],[101.629942,54.305239],[101.64324,54.301876],[101.644939,54.301439],[101.646096,54.301119],[101.647209,54.300774],[101.648165,54.300447],[101.648964,54.300157],[101.649577,54.299902],[101.650419,54.299537],[101.651082,54.299249],[101.65203,54.298778],[101.652804,54.298371],[101.653629,54.297921],[101.655666,54.296742],[101.658439,54.295115],[101.66043,54.293987],[101.660946,54.293689],[101.662041,54.293094],[101.662755,54.292738],[101.664118,54.292066],[101.672914,54.287997],[101.675546,54.286737],[101.67753,54.285806],[101.680722,54.284309],[101.683866,54.282757],[101.685284,54.282018],[101.6871,54.281057],[101.690097,54.279484],[101.691075,54.278997],[101.69308,54.277975],[101.694182,54.277417],[101.695004,54.276961],[101.695603,54.276632],[101.695983,54.276387],[101.696682,54.275941],[101.697136,54.275634],[101.697639,54.275259],[101.698372,54.274685],[101.698799,54.274331],[101.699225,54.273954],[101.69964,54.273526],[101.700016,54.273138],[101.700427,54.2727],[101.700584,54.272509],[101.701611,54.271229],[101.703884,54.26821],[101.705316,54.266288],[101.70592,54.265487],[101.705942,54.265457],[101.707575,54.263212],[101.707742,54.262983],[101.708441,54.262085],[101.709413,54.260955],[101.709771,54.260562],[101.710526,54.259853],[101.711129,54.259283],[101.711875,54.258628],[101.713161,54.257525],[101.714151,54.256754],[101.714463,54.256513],[101.714893,54.256225],[101.715327,54.255954],[101.716025,54.255562],[101.717586,54.254763],[101.718984,54.254074],[101.719719,54.253737],[101.720125,54.253562],[101.720664,54.253358],[101.721281,54.253167],[101.722287,54.252885],[101.723093,54.252669],[101.72489,54.25221],[101.726868,54.251715],[101.727567,54.251522],[101.729498,54.25099],[101.730469,54.250726],[101.73135,54.250445],[101.733098,54.249887],[101.734609,54.249341],[101.735473,54.249011],[101.736414,54.248608],[101.738152,54.247844],[101.739031,54.247427],[101.740204,54.246831],[101.742311,54.245649],[101.742564,54.245506],[101.749326,54.241679],[101.755477,54.238175],[101.761009,54.235046],[101.762871,54.233987],[101.764058,54.233302],[101.768116,54.231042],[101.769699,54.230199],[101.770389,54.229892],[101.77128,54.229502],[101.77341,54.228618],[101.77476,54.228105],[101.77594,54.227652],[101.777703,54.226989],[101.777816,54.226946],[101.779598,54.226351],[101.786941,54.224046],[101.791687,54.222504],[101.79285,54.222075],[101.794071,54.22158],[101.796615,54.220445],[101.803679,54.217178],[101.805053,54.216559],[101.805567,54.21629],[101.807405,54.215327],[101.810383,54.213631],[101.813778,54.211733],[101.81493,54.211089],[101.823401,54.206351],[101.826361,54.204738],[101.826912,54.204469],[101.827581,54.204164],[101.828218,54.203901],[101.828641,54.203755],[101.829148,54.203602],[101.82967,54.203467],[101.830572,54.203264],[101.832213,54.202973],[101.833242,54.202757],[101.833757,54.202632],[101.834088,54.202537],[101.834678,54.20234],[101.835262,54.202137],[101.835907,54.201895],[101.836391,54.201688],[101.836932,54.201423],[101.837428,54.201153],[101.838112,54.200722],[101.838519,54.200439],[101.839006,54.200058],[101.839464,54.199635],[101.840229,54.198876],[101.841654,54.19742],[101.84337,54.195813],[101.846626,54.193413],[101.84914,54.191844],[101.850639,54.190982],[101.851832,54.190295],[101.852461,54.189932],[101.85467,54.188639],[101.856826,54.187244],[101.857636,54.186649],[101.858519,54.185958],[101.859043,54.185533],[101.860358,54.184562],[101.870241,54.17808],[101.874004,54.175902],[101.875544,54.17511],[101.878088,54.173997],[101.880107,54.173254],[101.881117,54.172898],[101.882426,54.172478],[101.884007,54.17199],[101.890823,54.170054],[101.896997,54.168259],[101.902019,54.166816],[101.908862,54.164841],[101.911019,54.164184],[101.913549,54.163367],[101.914329,54.163081],[101.914967,54.16284],[101.916495,54.162215],[101.916535,54.162199],[101.935516,54.153517],[101.941791,54.15064],[101.944094,54.149362],[101.946026,54.147908],[101.94933,54.144138],[101.952365,54.140211],[101.952424,54.140123],[101.953546,54.138528],[101.953694,54.138319],[101.956324,54.13443],[101.957525,54.133101],[101.958122,54.132641],[101.958179,54.132597],[101.958551,54.13231],[101.959639,54.131606],[101.961106,54.130811],[101.961674,54.130544],[101.962793,54.130058],[101.963955,54.129587],[101.9664,54.128592],[101.966522,54.128542],[101.972108,54.12627],[101.974347,54.125354],[101.975904,54.124716],[101.976705,54.1244],[101.977996,54.123889],[101.979,54.123513],[101.980537,54.122955],[101.981401,54.122695],[101.982814,54.122304],[101.983818,54.122039],[101.985452,54.121645],[101.986741,54.121352],[101.988257,54.121037],[101.998771,54.119184],[102.000184,54.118934],[102.001572,54.118642],[102.003298,54.118222],[102.004981,54.11775],[102.007304,54.11703],[102.009007,54.116394],[102.010266,54.115672],[102.01107,54.115067],[102.011405,54.114679],[102.011838,54.114146],[102.012161,54.113508],[102.012409,54.112846],[102.012824,54.11108],[102.013373,54.10834],[102.013507,54.107684],[102.013638,54.107198],[102.013776,54.106801],[102.013985,54.106378],[102.014245,54.105932],[102.014552,54.105464],[102.014913,54.105004],[102.015337,54.104508],[102.016641,54.103194],[102.017812,54.101996],[102.018562,54.101271],[102.019176,54.10069],[102.019495,54.100429],[102.019829,54.100172],[102.020175,54.099919],[102.020478,54.09971],[102.020881,54.099478],[102.021404,54.099217],[102.021857,54.099017],[102.026874,54.097079],[102.028417,54.096487],[102.028651,54.096384],[102.028877,54.096284],[102.028921,54.096265],[102.029579,54.095922],[102.030352,54.095468],[102.031093,54.094945],[102.031617,54.094332],[102.032265,54.093479],[102.033637,54.091173],[102.036859,54.085494],[102.039992,54.080203],[102.040937,54.078636],[102.04138,54.077903],[102.04165,54.077462],[102.043701,54.074094],[102.046342,54.069723],[102.046782,54.069054],[102.047057,54.068716],[102.047075,54.068697],[102.047479,54.068258],[102.04891,54.066782],[102.049804,54.065956],[102.050555,54.065294],[102.051245,54.064744],[102.056841,54.060721],[102.057628,54.060157],[102.058114,54.059773],[102.058389,54.059531],[102.058527,54.05941],[102.058886,54.059028],[102.059482,54.058325],[102.059968,54.057694],[102.060527,54.056877],[102.061123,54.055866],[102.061616,54.054889],[102.061983,54.053997],[102.062646,54.051409],[102.062784,54.050442],[102.062988,54.049276],[102.06341,54.048006],[102.063798,54.0471],[102.064222,54.04636],[102.065436,54.044635],[102.065885,54.043998],[102.066936,54.042541],[102.06714,54.042259],[102.068127,54.040828],[102.069957,54.038252],[102.071217,54.036491],[102.071673,54.035886],[102.072419,54.034906],[102.073135,54.034027],[102.073345,54.033755],[102.073469,54.033512],[102.073599,54.033224],[102.074286,54.031592],[102.07498,54.029747],[102.075321,54.028963],[102.075509,54.028503],[102.075627,54.028145],[102.075761,54.027749],[102.075887,54.027237],[102.075997,54.026641],[102.076125,54.025815],[102.07618,54.025301],[102.076195,54.024829],[102.076187,54.023994],[102.076046,54.019811],[102.076029,54.019288],[102.075989,54.018338],[102.075812,54.014264],[102.075849,54.012762],[102.075727,54.009819],[102.075662,54.006656],[102.07555,54.000565],[102.075524,53.999206],[102.075502,53.998972],[102.075434,53.997931],[102.075329,53.996998],[102.075236,53.996532],[102.075112,53.99608],[102.07436,53.993656],[102.072756,53.988456],[102.072109,53.986356],[102.071416,53.984133],[102.071081,53.983277],[102.070679,53.982503],[102.070201,53.981776],[102.069754,53.98114],[102.069322,53.980549],[102.06876,53.979851],[102.067438,53.978463],[102.065979,53.977041],[102.064662,53.975689],[102.064241,53.975169],[102.064005,53.974822],[102.063839,53.974512],[102.063677,53.974149],[102.06346,53.973525],[102.063184,53.97264],[102.063023,53.97195],[102.062869,53.970884],[102.062724,53.969904],[102.062703,53.969401],[102.062729,53.968743],[102.062816,53.968278],[102.063005,53.967508],[102.063136,53.967054],[102.063395,53.966431],[102.063724,53.965867],[102.063937,53.965507],[102.064248,53.965028],[102.064659,53.964577],[102.064856,53.964359],[102.065473,53.963758],[102.067356,53.962108],[102.068117,53.961478],[102.069276,53.960601],[102.069908,53.960147],[102.071032,53.959407],[102.071987,53.958751],[102.072097,53.958688],[102.073288,53.957966],[102.074077,53.957529],[102.074259,53.957417],[102.075496,53.956753],[102.076117,53.95642],[102.076139,53.956408],[102.077995,53.955611],[102.079911,53.954954],[102.081288,53.954374],[102.082305,53.95386],[102.083316,53.953124],[102.085153,53.951451],[102.085257,53.951356],[102.086174,53.950524],[102.086229,53.950473],[102.086719,53.950022],[102.087079,53.949758],[102.08782,53.949414],[102.088548,53.949133],[102.089282,53.948901],[102.095012,53.94715],[102.095787,53.946912],[102.097181,53.946475],[102.098209,53.946061],[102.099115,53.945581],[102.09948,53.945374],[102.100114,53.945057],[102.101121,53.944501],[102.103773,53.943084],[102.10505,53.942395],[102.110244,53.939473],[102.121403,53.932312],[102.122712,53.931472],[102.124081,53.930593],[102.135135,53.923422],[102.135139,53.92342],[102.136371,53.922578],[102.13718,53.921798],[102.137246,53.921686],[102.13756,53.921155],[102.137848,53.920196],[102.138284,53.918418],[102.138961,53.91621],[102.139798,53.914344],[102.141031,53.912554],[102.142121,53.911095],[102.142596,53.910466],[102.14276,53.910262],[102.143692,53.909053],[102.145955,53.906023],[102.147638,53.903799],[102.154249,53.895058],[102.15498,53.893964],[102.155106,53.893762],[102.155759,53.892763],[102.156002,53.892369],[102.157489,53.890088],[102.15804,53.889242],[102.158233,53.888947],[102.158942,53.887858],[102.166787,53.876055],[102.168446,53.873411],[102.172876,53.86539],[102.174302,53.863328],[102.175013,53.862546],[102.175533,53.861999],[102.175848,53.861693],[102.176348,53.861228],[102.176948,53.860703],[102.178156,53.859688],[102.18382,53.854924],[102.187979,53.851668],[102.188098,53.851575],[102.19809,53.843789],[102.200525,53.842298],[102.203348,53.840874],[102.205595,53.839729],[102.207534,53.838647],[102.207982,53.838295],[102.208754,53.837404],[102.210088,53.835508],[102.214066,53.829379],[102.215523,53.827177],[102.21806,53.824416],[102.218551,53.823904],[102.221197,53.82115],[102.225225,53.817077],[102.226732,53.815487],[102.227403,53.814751],[102.227679,53.81443],[102.228265,53.813655],[102.229165,53.812198],[102.229944,53.810293],[102.231002,53.807437],[102.241424,53.778451],[102.242085,53.776702],[102.244171,53.770946],[102.244684,53.77023],[102.244939,53.7699],[102.245416,53.769413],[102.245867,53.769025],[102.24687,53.76844],[102.248691,53.767587],[102.252885,53.765874],[102.254275,53.765032],[102.255872,53.763757],[102.257742,53.762354],[102.259306,53.761423],[102.260869,53.7607],[102.262745,53.759967],[102.266058,53.758644],[102.268977,53.75747],[102.271195,53.756478],[102.273841,53.755315],[102.277505,53.753467],[102.284367,53.749686],[102.296111,53.742987],[102.296286,53.742887],[102.301191,53.740107],[102.303423,53.738686],[102.303786,53.73841],[102.3042,53.738026],[102.305235,53.736506],[102.306116,53.73524],[102.307413,53.733369],[102.309087,53.73107],[102.310349,53.729113],[102.310647,53.72867],[102.310907,53.72822],[102.310991,53.727979],[102.311075,53.727734],[102.31112,53.727394],[102.311134,53.726004],[102.311091,53.72433],[102.311148,53.722848],[102.312078,53.720544],[102.312959,53.718453],[102.314105,53.716051],[102.315166,53.71425],[102.316202,53.713083],[102.316808,53.712461],[102.317539,53.711869],[102.317608,53.711813],[102.319459,53.710379],[102.320467,53.709629],[102.320899,53.709308],[102.321275,53.709028],[102.323669,53.707158],[102.325112,53.705835],[102.325877,53.705013],[102.32664,53.704194],[102.331478,53.69885],[102.33452,53.69545],[102.336654,53.69322],[102.337807,53.692209],[102.33837,53.691739],[102.339146,53.691069],[102.340766,53.689723],[102.343409,53.68773],[102.344007,53.687286],[102.34622,53.68569],[102.347946,53.684768],[102.349898,53.683847],[102.353109,53.682346],[102.355034,53.681551],[102.35635,53.680871],[102.356845,53.680554],[102.358698,53.678942],[102.361164,53.676698],[102.361778,53.676071],[102.362286,53.675581],[102.36389,53.674009],[102.36625,53.671661],[102.36673,53.671138],[102.367218,53.670559],[102.368729,53.668737],[102.370199,53.666536],[102.371401,53.664298],[102.372602,53.661755],[102.374519,53.658085],[102.374842,53.65754],[102.375479,53.656597],[102.376072,53.655719],[102.376496,53.655091],[102.377458,53.653605],[102.380683,53.649136],[102.382664,53.646905],[102.383566,53.646171],[102.384618,53.645579],[102.386647,53.644535],[102.387682,53.644123],[102.390171,53.643108],[102.394268,53.641377],[102.397759,53.639894],[102.401056,53.638359],[102.404112,53.636765],[102.408072,53.634279],[102.411698,53.631827],[102.414906,53.6296],[102.418114,53.627291],[102.419733,53.626104],[102.42123,53.624936],[102.422206,53.624181],[102.423047,53.623557],[102.424201,53.622444],[102.426556,53.619971],[102.428813,53.617351],[102.430469,53.615353],[102.43153,53.613755],[102.432393,53.611963],[102.433714,53.608727],[102.434372,53.607212],[102.435067,53.605986],[102.436187,53.60449],[102.436797,53.603857],[102.437118,53.603564],[102.437454,53.603256],[102.438347,53.602628],[102.439255,53.6021],[102.440461,53.601492],[102.441712,53.600938],[102.445259,53.599399],[102.447469,53.598415],[102.448167,53.598095],[102.449529,53.597397],[102.450193,53.597013],[102.452151,53.595737],[102.464434,53.587639],[102.473969,53.581474],[102.475357,53.580668],[102.476911,53.57982],[102.477421,53.579547],[102.477758,53.579404],[102.478736,53.579002],[102.47948,53.578774],[102.480583,53.57852],[102.480602,53.578516],[102.481707,53.57833],[102.483663,53.5781],[102.485133,53.57796],[102.486402,53.577893],[102.488555,53.57782],[102.492723,53.577834],[102.501111,53.577861],[102.503441,53.577869],[102.505267,53.578007],[102.50667,53.578302],[102.507647,53.57864],[102.50834,53.578941],[102.509214,53.579318],[102.509866,53.57957],[102.511142,53.580113],[102.511826,53.580361],[102.512623,53.580589],[102.513114,53.580715],[102.513618,53.58081],[102.514475,53.580875],[102.516077,53.580858],[102.516678,53.580815],[102.517781,53.580715],[102.518928,53.580526],[102.519667,53.58035],[102.521671,53.57968],[102.522413,53.579391],[102.523857,53.578923],[102.524612,53.578753],[102.52594,53.578504],[102.527045,53.578407],[102.527508,53.578378],[102.531178,53.578361],[102.532383,53.578259],[102.536675,53.57773],[102.538935,53.577394],[102.539895,53.577254],[102.547479,53.576226],[102.548814,53.576011],[102.551107,53.575401],[102.553328,53.574427],[102.55667,53.572507],[102.562957,53.568852],[102.565166,53.567576],[102.56856,53.565574],[102.571036,53.564133],[102.573367,53.562618],[102.575556,53.560961],[102.577679,53.559141],[102.578976,53.557792],[102.580974,53.555442],[102.582339,53.553777],[102.583761,53.55218],[102.585946,53.550072],[102.587756,53.548581],[102.589184,53.547626],[102.590773,53.546788],[102.595117,53.544472],[102.596222,53.543763],[102.597241,53.54306],[102.599792,53.540931],[102.60115,53.539797],[102.610696,53.531521],[102.612261,53.530312],[102.612398,53.530242],[102.613061,53.529903],[102.613879,53.529498],[102.615067,53.529054],[102.618342,53.527938],[102.623291,53.526355],[102.627691,53.524875],[102.629074,53.524212],[102.630193,53.523609],[102.631241,53.522879],[102.632076,53.522214],[102.632883,53.52145],[102.633441,53.520753],[102.634614,53.519001],[102.635307,53.518069],[102.636033,53.517199],[102.637468,53.515874],[102.639108,53.514639],[102.640105,53.513982],[102.640812,53.513539],[102.641582,53.513108],[102.656627,53.504872],[102.656634,53.504868],[102.659792,53.503142],[102.660084,53.502984],[102.660478,53.502771],[102.660754,53.502621],[102.662242,53.501827],[102.663002,53.501414],[102.663643,53.501052],[102.664278,53.500664],[102.664907,53.50025],[102.665482,53.499858],[102.666172,53.499357],[102.666751,53.498904],[102.667378,53.498397],[102.668098,53.497762],[102.668478,53.497418],[102.668765,53.497129],[102.669053,53.496807],[102.669323,53.49646],[102.669575,53.496127],[102.669813,53.495798],[102.670062,53.495427],[102.670305,53.495044],[102.670511,53.494716],[102.670778,53.494292],[102.670974,53.493918],[102.671252,53.493335],[102.671752,53.492152],[102.672032,53.491507],[102.679185,53.475591],[102.67994,53.474033],[102.680478,53.472992],[102.680804,53.472372],[102.681219,53.471676],[102.681266,53.471598],[102.681543,53.471136],[102.681979,53.470413],[102.682819,53.469186],[102.686222,53.46457],[102.68988,53.459855],[102.693549,53.455017],[102.69566,53.452563],[102.700893,53.446814],[102.714989,53.431403],[102.715045,53.431341],[102.720652,53.425183],[102.724184,53.421345],[102.725921,53.419453],[102.72765,53.417484],[102.728661,53.416462],[102.72968,53.415364],[102.733236,53.411427],[102.734827,53.409645],[102.736454,53.407885],[102.737688,53.406586],[102.739003,53.405291],[102.740364,53.404014],[102.741793,53.40272],[102.744477,53.400394],[102.747859,53.397468],[102.751205,53.39454],[102.757688,53.388863],[102.758489,53.388162],[102.760224,53.386685],[102.772452,53.375976],[102.776651,53.372267],[102.778877,53.370302],[102.779281,53.369922],[102.783024,53.366534],[102.783427,53.366185],[102.786944,53.363144],[102.790526,53.359989],[102.793228,53.357536],[102.793306,53.357469],[102.79343,53.357362],[102.793794,53.357049],[102.794169,53.356704],[102.795055,53.355889],[102.796356,53.35477],[102.7974,53.353808],[102.797516,53.353717],[102.798413,53.352909],[102.801625,53.35005],[102.802502,53.349226],[102.803002,53.348733],[102.80347,53.348219],[102.803917,53.3477],[102.804335,53.347175],[102.80473,53.346637],[102.805116,53.34599],[102.805873,53.34477],[102.806435,53.343766],[102.806492,53.34365],[102.808049,53.340973],[102.808887,53.339486],[102.80979,53.337986],[102.810574,53.336675],[102.811533,53.334995],[102.811875,53.334423],[102.817761,53.324328],[102.820071,53.320437],[102.821001,53.318805],[102.8231,53.31529],[102.824581,53.312618],[102.825247,53.311396],[102.825926,53.31003],[102.826607,53.308742],[102.827255,53.30744],[102.827624,53.306613],[102.827872,53.306116],[102.828556,53.304778],[102.829386,53.303024],[102.829572,53.302654],[102.829803,53.302277],[102.830328,53.301527],[102.830751,53.300928],[102.831161,53.300452],[102.831191,53.300418],[102.832191,53.299337],[102.832693,53.29882],[102.833293,53.298261],[102.836366,53.295378],[102.837058,53.294725],[102.837771,53.294],[102.838473,53.293293],[102.839216,53.292491],[102.840875,53.29072],[102.842108,53.289323],[102.842641,53.28868],[102.843625,53.287599],[102.844613,53.286415],[102.845589,53.285354],[102.846366,53.284541],[102.847235,53.283704],[102.849302,53.281691],[102.85074,53.280235],[102.850965,53.280015],[102.853402,53.277623],[102.85733,53.274002],[102.861257,53.270339],[102.862465,53.269283],[102.863475,53.268474],[102.866808,53.266003],[102.868341,53.264875],[102.869108,53.26431],[102.869879,53.263703],[102.870128,53.26348],[102.870542,53.263017],[102.870824,53.262565],[102.871043,53.262147],[102.871231,53.261657],[102.87142,53.260957],[102.871652,53.25988],[102.871763,53.258898],[102.871709,53.258352],[102.871618,53.257863],[102.871446,53.25744],[102.871266,53.257042],[102.871115,53.256799],[102.870799,53.256422],[102.870461,53.256093],[102.870071,53.255687],[102.869626,53.255387],[102.869122,53.255041],[102.868204,53.25441],[102.867194,53.253703],[102.866758,53.253307],[102.866337,53.252916],[102.86591,53.252508],[102.865457,53.251953],[102.864617,53.250886],[102.862508,53.24818],[102.862117,53.247678],[102.860348,53.245535],[102.85861,53.243361],[102.857993,53.242523],[102.857747,53.242149],[102.85754,53.241842],[102.857338,53.24124],[102.857117,53.240295],[102.857039,53.239987],[102.857014,53.239704],[102.857096,53.239433],[102.857131,53.239096],[102.857268,53.238616],[102.857518,53.238075],[102.857786,53.237644],[102.8581,53.237229],[102.858755,53.236507],[102.859671,53.235691],[102.86072,53.234708],[102.861873,53.233645],[102.865589,53.230207],[102.868321,53.227846],[102.869051,53.227217],[102.869964,53.226548],[102.870612,53.22607],[102.87168,53.225356],[102.871714,53.225333],[102.878334,53.221093],[102.884736,53.216969],[102.886175,53.215949],[102.88786,53.214855],[102.891072,53.212677],[102.89181,53.212132],[102.893409,53.210813],[102.894669,53.209755],[102.900192,53.205089],[102.905697,53.200423],[102.913433,53.194162],[102.923483,53.1865],[102.932481,53.179597],[102.934776,53.177844],[102.935439,53.177299],[102.935905,53.176908],[102.936592,53.176246],[102.937413,53.175287],[102.937725,53.174866],[102.938187,53.174111],[102.938526,53.17339],[102.938837,53.172252],[102.938913,53.171827],[102.938945,53.17141],[102.938958,53.170911],[102.938986,53.170645],[102.939018,53.17031],[102.939058,53.169902],[102.93919,53.165516],[102.939404,53.158569],[102.939596,53.150746],[102.939722,53.1487],[102.940325,53.146531],[102.940905,53.144674],[102.94156,53.143033],[102.943141,53.139837],[102.944942,53.13681],[102.945064,53.136602],[102.945123,53.136418],[102.945147,53.136309],[102.945147,53.136191],[102.945134,53.136109],[102.945076,53.135967],[102.945034,53.135879],[102.944916,53.135552],[102.944833,53.13543],[102.944791,53.1353],[102.944794,53.135168],[102.94484,53.135039],[102.944929,53.134918],[102.945056,53.13481],[102.945216,53.134719],[102.945403,53.13465],[102.945786,53.134476],[102.946007,53.13437],[102.946206,53.134274],[102.94634,53.134186],[102.946397,53.134146],[102.946431,53.13412],[102.946627,53.133956],[102.954077,53.120973],[102.955958,53.117825],[102.95596,53.117822],[102.95616,53.117428],[102.956968,53.115533],[102.957393,53.114296],[102.957557,53.113574],[102.957685,53.112864],[102.957721,53.112429],[102.957727,53.112011],[102.957628,53.110106],[102.957552,53.109463],[102.957452,53.108826],[102.957172,53.107537],[102.956991,53.10663],[102.956663,53.105168],[102.956623,53.10488],[102.956669,53.104149],[102.956794,53.103436],[102.956998,53.102786],[102.957241,53.102137],[102.95745,53.101713],[102.957787,53.101182],[102.958217,53.100672],[102.959153,53.099652],[102.960271,53.098625],[102.963637,53.095438],[102.968453,53.09091],[102.975067,53.084468],[102.976109,53.083502],[102.97723,53.082569],[102.978218,53.081805],[102.978732,53.08145],[102.979315,53.081123],[102.982144,53.079871],[102.983457,53.079315],[102.985284,53.078564],[102.989774,53.076848],[102.995232,53.074785],[103.00708,53.070246],[103.007102,53.070237],[103.014058,53.067599],[103.020717,53.065083],[103.025236,53.063438],[103.027679,53.06256],[103.030352,53.061624],[103.032431,53.060921],[103.03375,53.060488],[103.044591,53.056715],[103.055175,53.053101],[103.05931,53.051551],[103.065034,53.049406],[103.065414,53.049265],[103.066194,53.048956],[103.067785,53.048325],[103.068603,53.047998],[103.070266,53.047375],[103.070745,53.047197],[103.074085,53.045883],[103.074454,53.045738],[103.074995,53.045545],[103.078553,53.044179],[103.082673,53.042598],[103.116716,53.029741],[103.119251,53.028728],[103.121473,53.027691],[103.123704,53.026452],[103.125421,53.02511],[103.127309,53.023458],[103.129026,53.021496],[103.134728,53.01342],[103.134737,53.013407],[103.143056,53.001459],[103.143354,53.00103],[103.144141,52.999963],[103.145262,52.998834],[103.146942,52.997594],[103.148839,52.99643],[103.155609,52.993191],[103.162242,52.989909],[103.164531,52.988763],[103.175399,52.983322],[103.175481,52.983281],[103.202049,52.97008],[103.207155,52.967583],[103.209771,52.966364],[103.212453,52.965185],[103.215147,52.963981],[103.21637,52.963472],[103.218037,52.962826],[103.218384,52.962703],[103.221889,52.961459],[103.228473,52.959511],[103.25761,52.950768],[103.272528,52.946317],[103.277923,52.944705],[103.286536,52.942082],[103.290883,52.94078],[103.293064,52.940165],[103.294221,52.93991],[103.296883,52.939501],[103.299204,52.939372],[103.299987,52.939347],[103.300695,52.939345],[103.301978,52.939418],[103.30333,52.939579],[103.304785,52.939807],[103.306976,52.940289],[103.3092,52.941149],[103.311232,52.942227],[103.312111,52.942829],[103.313709,52.944132],[103.314752,52.94501],[103.31541,52.945591],[103.315559,52.945737],[103.315902,52.946019],[103.316056,52.946145],[103.316468,52.946499],[103.317263,52.94712],[103.3182,52.94777],[103.319052,52.948309],[103.319965,52.948777],[103.320744,52.949104],[103.321492,52.949357],[103.322943,52.949773],[103.323208,52.949843],[103.324379,52.950075],[103.325734,52.950268],[103.327191,52.950447],[103.328425,52.950533],[103.329567,52.95054],[103.330652,52.950473],[103.332823,52.950265],[103.355905,52.947736],[103.356113,52.947713],[103.367733,52.946449],[103.379386,52.945176],[103.384223,52.944658],[103.387338,52.944228],[103.388987,52.943944],[103.390763,52.943582],[103.394121,52.942717],[103.395792,52.942207],[103.398222,52.941316],[103.399475,52.940795],[103.401003,52.940102],[103.403003,52.939065],[103.403652,52.938704],[103.40645,52.936926],[103.409415,52.935022],[103.410214,52.934495],[103.413327,52.932484],[103.415307,52.931209],[103.417279,52.929948],[103.42818,52.922898],[103.43951,52.915576],[103.448157,52.909991],[103.448259,52.909925],[103.457185,52.90413],[103.460371,52.902067],[103.462498,52.900708],[103.463553,52.899991],[103.464963,52.89901],[103.466672,52.897731],[103.469037,52.895753],[103.47191,52.893081],[103.476949,52.888185],[103.478149,52.887017],[103.478701,52.886498],[103.478951,52.886265],[103.479383,52.885835],[103.479744,52.885489],[103.485286,52.880199],[103.485459,52.880039],[103.487887,52.87768],[103.488566,52.877033],[103.489254,52.876375],[103.492883,52.872835],[103.493017,52.872703],[103.493843,52.871933],[103.494404,52.871403],[103.495482,52.870361],[103.497658,52.868299],[103.498027,52.867949],[103.498413,52.867594],[103.499298,52.866864],[103.499656,52.86658],[103.500063,52.866281],[103.500867,52.86574],[103.501241,52.865515],[103.502014,52.865075],[103.502818,52.864637],[103.503576,52.864241],[103.503969,52.86406],[103.504409,52.863865],[103.504914,52.863657],[103.505469,52.863452],[103.50659,52.863092],[103.50948,52.8622],[103.51202,52.861402],[103.513901,52.860811],[103.515381,52.860363],[103.516765,52.859939],[103.518136,52.859513],[103.518836,52.859296],[103.519525,52.859082],[103.520197,52.858866],[103.520842,52.858645],[103.521444,52.858423],[103.521989,52.858194],[103.522474,52.857967],[103.522991,52.857706],[103.523485,52.857438],[103.523885,52.857187],[103.52478,52.856623],[103.525593,52.856099],[103.526831,52.855233],[103.527519,52.854817],[103.530634,52.852776],[103.531737,52.852042],[103.533097,52.851139],[103.533111,52.85113],[103.536768,52.848798],[103.53962,52.846832],[103.541045,52.845611],[103.542642,52.843964],[103.544093,52.841937],[103.544871,52.840404],[103.545159,52.839643],[103.545503,52.838452],[103.545774,52.836885],[103.545783,52.835874],[103.545789,52.835519],[103.545767,52.834698],[103.545554,52.833701],[103.545243,52.832643],[103.54454,52.830893],[103.543879,52.829298],[103.543399,52.828542],[103.543074,52.827987],[103.542881,52.827349],[103.542913,52.826806],[103.542995,52.826455],[103.543699,52.825306],[103.544873,52.824143],[103.545702,52.823382],[103.547905,52.821295],[103.548995,52.820254],[103.551848,52.81753],[103.553628,52.815853],[103.555139,52.814405],[103.557986,52.811861],[103.558579,52.811404],[103.559724,52.810608],[103.560625,52.810031],[103.561564,52.809442],[103.563378,52.808327],[103.564897,52.807383],[103.567414,52.805811],[103.571769,52.803215],[103.571798,52.803198],[103.572774,52.802601],[103.573573,52.802074],[103.573802,52.801868],[103.573983,52.801669],[103.574324,52.801183],[103.574503,52.800729],[103.57489,52.799454],[103.57544,52.797493],[103.575835,52.796139],[103.576059,52.795419],[103.576387,52.794571],[103.576527,52.794371],[103.57669,52.794181],[103.576942,52.793932],[103.577367,52.793557],[103.581681,52.790278],[103.582326,52.789775],[103.583084,52.789203],[103.584607,52.788061],[103.58506,52.787726],[103.585661,52.787278],[103.586203,52.78687],[103.586648,52.786507],[103.586949,52.786246],[103.587307,52.785901],[103.587604,52.785538],[103.587798,52.785168],[103.588128,52.784365],[103.589062,52.781968],[103.589433,52.781539],[103.589971,52.781084],[103.591379,52.779961],[103.595745,52.776547],[103.595844,52.776469],[103.597085,52.775447],[103.600703,52.772469],[103.601371,52.771927],[103.602731,52.770829],[103.60434,52.769624],[103.605107,52.769087],[103.605367,52.768904],[103.605887,52.76852],[103.606568,52.768017],[103.606707,52.767915],[103.607745,52.767092],[103.609145,52.766008],[103.610448,52.764995],[103.611613,52.764096],[103.618151,52.758937],[103.619484,52.75795],[103.621096,52.75669],[103.621538,52.756349],[103.622214,52.755819],[103.622924,52.755273],[103.623822,52.754569],[103.625859,52.752975],[103.625991,52.752873],[103.626949,52.75213],[103.627303,52.751845],[103.627735,52.751511],[103.628326,52.751045],[103.628851,52.750641],[103.629703,52.749997],[103.631817,52.748312],[103.632569,52.747712],[103.633026,52.747346],[103.633258,52.747161],[103.633662,52.746837],[103.633729,52.746783],[103.6345,52.746174],[103.6352,52.745646],[103.635533,52.745437],[103.635914,52.745258],[103.636431,52.745086],[103.638792,52.744521],[103.641926,52.743758],[103.643232,52.743448],[103.644388,52.743176],[103.645376,52.742927],[103.646248,52.742735],[103.647476,52.742523],[103.648272,52.74239],[103.650939,52.741974],[103.651805,52.741839],[103.654869,52.741294],[103.656153,52.740867],[103.657399,52.740346],[103.658769,52.739409],[103.658982,52.739252],[103.659122,52.739156],[103.659298,52.739025],[103.659435,52.738906],[103.659511,52.738829],[103.659671,52.738666],[103.659774,52.738511],[103.66013,52.737968],[103.660866,52.736847],[103.661248,52.736261],[103.661572,52.735731],[103.661736,52.735469],[103.66181,52.735341],[103.662182,52.734674],[103.662325,52.73451],[103.662348,52.734485],[103.662429,52.734412],[103.662659,52.734225],[103.663187,52.733801],[103.663247,52.733752],[103.663293,52.733712],[103.663365,52.733649],[103.66377,52.733298],[103.663917,52.733167],[103.663973,52.733115],[103.66412,52.732981],[103.66416,52.732945],[103.66439,52.732727],[103.664453,52.732667],[103.664506,52.732617],[103.6649,52.732245],[103.665355,52.731814],[103.665924,52.731275],[103.666067,52.731139],[103.666743,52.730503],[103.667878,52.729428],[103.667957,52.729355],[103.668228,52.7291],[103.668331,52.728999],[103.668538,52.728805],[103.668884,52.728457],[103.669129,52.728257],[103.669286,52.728128],[103.669474,52.728001],[103.669635,52.727967],[103.670401,52.727647],[103.670707,52.727395],[103.670951,52.727193],[103.671081,52.727086],[103.671924,52.726326],[103.672125,52.72615],[103.672305,52.725994],[103.673078,52.725323],[103.673308,52.725124],[103.688208,52.712069],[103.690494,52.710064],[103.692277,52.708494],[103.694935,52.706193],[103.695388,52.705806],[103.695673,52.705576],[103.695868,52.705431],[103.696033,52.705332],[103.696215,52.705244],[103.696711,52.705056],[103.697285,52.70486],[103.697721,52.704708],[103.697983,52.704573],[103.698561,52.704201],[103.698972,52.70395],[103.699418,52.703678],[103.699472,52.703644],[103.701767,52.702118],[103.701875,52.702047],[103.701992,52.701969],[103.703166,52.701191],[103.705924,52.699343],[103.705987,52.6993],[103.706649,52.698885],[103.707122,52.698652],[103.70765,52.698461],[103.708134,52.698316],[103.709554,52.697913],[103.71042,52.697685],[103.710423,52.697684],[103.711476,52.69744],[103.713666,52.696983],[103.714206,52.69687],[103.714705,52.696734],[103.714933,52.69662],[103.715172,52.696411],[103.71526,52.696213],[103.715295,52.695922],[103.715357,52.695283],[103.715386,52.695054],[103.715406,52.694814],[103.715437,52.694445],[103.715478,52.694214],[103.715539,52.694054],[103.715632,52.693904],[103.715769,52.693757],[103.716044,52.693521],[103.716386,52.693227],[103.716522,52.693114],[103.717582,52.692233],[103.717748,52.692092],[103.718517,52.691438],[103.719719,52.690345],[103.720083,52.689947],[103.720276,52.689737],[103.720743,52.689259],[103.720881,52.689102],[103.721351,52.688582],[103.722526,52.687301],[103.722995,52.686744],[103.723171,52.686545],[103.734696,52.673765],[103.734878,52.673556],[103.736583,52.671664],[103.736632,52.671609],[103.736885,52.671324],[103.737826,52.670265],[103.738229,52.669825],[103.738688,52.669305],[103.739059,52.668872],[103.739148,52.668768],[103.740322,52.667524],[103.740684,52.667156],[103.742453,52.665355],[103.744089,52.663751],[103.74441,52.663431],[103.744609,52.663189],[103.744761,52.662976],[103.744903,52.662682],[103.744978,52.662545],[103.745032,52.662391],[103.745069,52.662283],[103.745099,52.662141],[103.74512,52.661998],[103.745157,52.66184],[103.745167,52.661633],[103.745164,52.661463],[103.74516,52.661287],[103.745116,52.661151],[103.745055,52.661033],[103.744968,52.660862],[103.744569,52.660293],[103.744413,52.659887],[103.744393,52.659725],[103.744393,52.65959],[103.744407,52.659444],[103.74444,52.65927],[103.744562,52.659028],[103.744697,52.658813],[103.744859,52.658649],[103.745063,52.658486],[103.745243,52.658337],[103.745592,52.658044],[103.746417,52.657341],[103.748697,52.6554],[103.750164,52.654189],[103.751452,52.653083],[103.752857,52.651909],[103.754065,52.650885],[103.758409,52.647245],[103.762185,52.644064],[103.764936,52.641704],[103.767453,52.63954],[103.769797,52.637582],[103.7717,52.635948],[103.77328,52.63479],[103.778356,52.631516],[103.782928,52.628579],[103.787353,52.625548],[103.788405,52.624808],[103.795975,52.619482],[103.797967,52.61806],[103.803699,52.613983],[103.804775,52.613122],[103.805436,52.612477],[103.80605,52.611773],[103.806226,52.611482],[103.806403,52.611189],[103.806586,52.610898],[103.806757,52.610597],[103.806872,52.610374],[103.806995,52.610136],[103.807098,52.609903],[103.80719,52.60966],[103.80734,52.609229],[103.807405,52.609017],[103.807458,52.608796],[103.807525,52.608528],[103.807578,52.608244],[103.807629,52.607694],[103.807667,52.606835],[103.807693,52.605975],[103.80771,52.604577],[103.807718,52.604278],[103.807812,52.601135],[103.807914,52.596002],[103.807919,52.595757],[103.807929,52.595051],[103.807942,52.594829],[103.808138,52.593205],[103.809205,52.589426],[103.809207,52.589419],[103.810407,52.585439],[103.810572,52.585046],[103.811064,52.584021],[103.811507,52.583256],[103.811588,52.583115],[103.811937,52.58258],[103.812846,52.581457],[103.813918,52.58033],[103.814268,52.580008],[103.814551,52.579753],[103.814941,52.579375],[103.815582,52.578871],[103.816573,52.578164],[103.817027,52.577864],[103.817727,52.577407],[103.817807,52.577339],[103.817874,52.577273],[103.817962,52.577174],[103.818033,52.577087],[103.818115,52.576973],[103.818262,52.576743],[103.818309,52.576662],[103.818387,52.57653],[103.818515,52.576267],[103.818562,52.576105],[103.818586,52.575959],[103.818587,52.575881],[103.818575,52.575733],[103.818563,52.575637],[103.818546,52.575575],[103.818453,52.575255],[103.818225,52.574851],[103.818048,52.574582],[103.817416,52.573606],[103.805631,52.556006],[103.805209,52.555358],[103.803756,52.553164],[103.799307,52.546542],[103.797326,52.543702],[103.796593,52.54266],[103.79544,52.54141],[103.793657,52.539775],[103.791941,52.538456],[103.786942,52.535001],[103.78518,52.533805],[103.782984,52.532288],[103.781895,52.531514],[103.78089,52.530758],[103.780057,52.530064],[103.779244,52.529364],[103.778129,52.528348],[103.77707,52.527314],[103.775368,52.525499],[103.773541,52.523636],[103.772996,52.523099],[103.772407,52.522574],[103.770949,52.521388],[103.766347,52.51761],[103.765461,52.516883],[103.764997,52.516489],[103.764412,52.515984],[103.762819,52.514664],[103.760424,52.512707],[103.756678,52.509659],[103.755941,52.509066],[103.755843,52.508979],[103.754871,52.508168],[103.75331,52.506885],[103.751936,52.505574],[103.751064,52.504371],[103.750333,52.503157],[103.749838,52.501931],[103.749729,52.501546],[103.749488,52.500701],[103.749396,52.499417],[103.749378,52.498555],[103.749499,52.497696],[103.749774,52.49672],[103.750057,52.495965],[103.750446,52.495071],[103.751077,52.493936],[103.751857,52.492901],[103.753368,52.491403],[103.754458,52.490513],[103.754746,52.490324],[103.755657,52.489767],[103.758361,52.488157],[103.760538,52.486862],[103.761443,52.486334],[103.761748,52.486155],[103.764561,52.484469],[103.764918,52.484255],[103.768374,52.482184],[103.769817,52.481303],[103.773372,52.479219],[103.776672,52.477275],[103.778092,52.476419],[103.77995,52.475314],[103.780506,52.474981],[103.780825,52.474791],[103.782066,52.474068],[103.785133,52.472264],[103.794827,52.46651],[103.798681,52.464205],[103.799596,52.463653],[103.800079,52.463361],[103.804328,52.460794],[103.805419,52.460214],[103.806105,52.459816],[103.807654,52.458894],[103.809059,52.458057],[103.809338,52.457893],[103.809871,52.45758],[103.810128,52.457426],[103.812325,52.456088],[103.815275,52.45418],[103.816223,52.453582],[103.819378,52.451419],[103.820378,52.450748],[103.822348,52.449317],[103.82437,52.447661],[103.826011,52.446306],[103.826916,52.445533],[103.829151,52.443558],[103.830926,52.441913],[103.831322,52.441533],[103.831879,52.440986],[103.835675,52.437341],[103.838347,52.43477],[103.839799,52.43337],[103.841807,52.431447],[103.843142,52.430239],[103.844067,52.429461],[103.84641,52.427706],[103.848481,52.426232],[103.850818,52.42472],[103.853179,52.423314],[103.854499,52.422603],[103.855857,52.421888],[103.85766,52.420972],[103.858643,52.420523],[103.859882,52.419952],[103.861649,52.419191],[103.863797,52.418341],[103.866134,52.417457],[103.868308,52.416691],[103.870872,52.415823],[103.873263,52.415016],[103.876602,52.413861],[103.880399,52.412544],[103.880955,52.412358],[103.882294,52.411967],[103.883182,52.411746],[103.884249,52.411498],[103.887226,52.410906],[103.889402,52.410549],[103.890468,52.410417],[103.891593,52.410367],[103.893322,52.410303],[103.894873,52.410287],[103.896026,52.410291],[103.897466,52.410359],[103.899067,52.410459],[103.902135,52.410679],[103.908433,52.411167],[103.914294,52.411621],[103.918896,52.411967],[103.920984,52.412118],[103.921493,52.41217],[103.922057,52.412244],[103.922516,52.41232],[103.923583,52.412547],[103.924235,52.412696],[103.924896,52.412883],[103.92592,52.413173],[103.926523,52.413386],[103.927298,52.413682],[103.927803,52.413908],[103.928448,52.414259],[103.9289,52.414506],[103.929438,52.414848],[103.929912,52.415167],[103.930887,52.415888],[103.933249,52.41773],[103.936443,52.420164],[103.938372,52.421604],[103.941982,52.424087],[103.945544,52.426396],[103.946655,52.427071],[103.947072,52.42733],[103.947753,52.427772],[103.948019,52.427925],[103.94845,52.428138],[103.94867,52.428244],[103.94911,52.428421],[103.949367,52.428521],[103.950257,52.428861],[103.951233,52.429143],[103.952054,52.429346],[103.952855,52.429478],[103.953636,52.429579],[103.954242,52.429644],[103.954819,52.429688],[103.955232,52.429703],[103.955677,52.429706],[103.956374,52.429696],[103.956878,52.429665],[103.95802,52.429555],[103.958596,52.429482],[103.959149,52.429393],[103.959508,52.429323],[103.959843,52.429252],[103.960275,52.429145],[103.961068,52.428929],[103.961946,52.428624],[103.962862,52.428231],[103.963221,52.428063],[103.963618,52.427856],[103.963927,52.427669],[103.964335,52.42739],[103.964796,52.427049],[103.965172,52.426729],[103.966363,52.425647],[103.967445,52.424588],[103.967935,52.424152],[103.968173,52.42395],[103.96935,52.423059],[103.97027,52.422451],[103.970723,52.422169],[103.971098,52.421938],[103.971555,52.421664],[103.972051,52.421387],[103.972524,52.421143],[103.973973,52.420455],[103.975555,52.419777],[103.976613,52.419399],[103.976838,52.419331],[103.977322,52.419189],[103.977772,52.419057],[103.978865,52.418749],[103.980305,52.418276],[103.981314,52.417913],[103.982538,52.417405],[103.983626,52.416803],[103.988228,52.414172],[103.991678,52.412199],[103.99367,52.41109],[103.995244,52.410324],[103.996057,52.409932],[103.996843,52.409561],[104.008067,52.40429],[104.010415,52.403188],[104.011353,52.402747],[104.013553,52.40174],[104.013662,52.40169],[104.013958,52.401538],[104.016071,52.400457],[104.017023,52.400014],[104.017254,52.399907],[104.017601,52.399741],[104.018359,52.399386],[104.018593,52.399281],[104.01871,52.399229],[104.019284,52.39897],[104.019369,52.398932],[104.019855,52.398714],[104.021781,52.397848],[104.023551,52.396993],[104.024987,52.396305],[104.025769,52.395932],[104.038612,52.389792],[104.0677,52.37588],[104.069889,52.37483],[104.070113,52.374722],[104.07044,52.374566],[104.070734,52.374428],[104.07305,52.373317],[104.073319,52.373197],[104.075641,52.372041],[104.076775,52.371483],[104.078218,52.370837],[104.078652,52.370346],[104.078738,52.370216],[104.078779,52.37011],[104.078806,52.37002],[104.078828,52.36993],[104.078839,52.369834],[104.078836,52.369755],[104.078828,52.369701],[104.078814,52.369635],[104.078789,52.369545],[104.078763,52.369481],[104.078723,52.369403],[104.078669,52.369311],[104.078471,52.369071],[104.078195,52.368788],[104.07805,52.36864],[104.077966,52.368575],[104.076745,52.367663],[104.075314,52.366594],[104.074947,52.36632],[104.074443,52.36596],[104.073906,52.36556],[104.073445,52.36518],[104.073112,52.3649],[104.072686,52.364524],[104.072147,52.364001],[104.071757,52.363543],[104.071396,52.362946],[104.071149,52.362488],[104.071042,52.362062],[104.070977,52.361714],[104.070902,52.361407],[104.070859,52.360981],[104.070823,52.360666],[104.070823,52.360351],[104.070866,52.359801],[104.070995,52.358884],[104.071167,52.357992],[104.071417,52.356905],[104.071503,52.355981],[104.071567,52.3553],[104.071578,52.354603],[104.071557,52.354251],[104.071396,52.353242],[104.071245,52.352502],[104.07116,52.352063],[104.070956,52.351473],[104.070778,52.350882],[104.070736,52.35072],[104.070688,52.350536],[104.070559,52.350234],[104.070409,52.349843],[104.069894,52.348648],[104.069572,52.347862],[104.069271,52.347174],[104.069035,52.34664],[104.068745,52.345833],[104.068336,52.344821],[104.067821,52.343667],[104.067301,52.342304],[104.066761,52.341091],[104.066149,52.339577],[104.065954,52.339148],[104.065666,52.338515],[104.06508,52.337083],[104.064619,52.335978],[104.064415,52.335562],[104.063911,52.334274],[104.063302,52.332849],[104.063052,52.332264],[104.062758,52.331561],[104.062757,52.331559],[104.062189,52.330222],[104.06168,52.328988],[104.061437,52.328384],[104.061139,52.327692],[104.060703,52.326889],[104.060369,52.326385],[104.059943,52.325862],[104.059183,52.325066],[104.058671,52.324608],[104.058298,52.324311],[104.058029,52.324102],[104.057827,52.323945],[104.057445,52.323675],[104.057218,52.323528],[104.056849,52.323296],[104.056478,52.323081],[104.056023,52.322808],[104.055388,52.322457],[104.05495,52.322284],[104.054461,52.322068],[104.053594,52.321727],[104.052988,52.321497],[104.052084,52.321203],[104.050487,52.320809],[104.049921,52.320692],[104.049311,52.320595],[104.047979,52.320389],[104.046582,52.320243],[104.045056,52.320149],[104.043336,52.32],[104.042217,52.319816],[104.041122,52.319595],[104.039902,52.319267],[104.039304,52.31907],[104.038976,52.318948],[104.038714,52.318876],[104.038218,52.318674],[104.037529,52.31837],[104.036678,52.317925],[104.035815,52.317415],[104.035506,52.317228],[104.035286,52.317076],[104.035031,52.316873],[104.034411,52.316376],[104.034093,52.316104],[104.033607,52.315684],[104.032894,52.315087],[104.032449,52.314703],[104.031772,52.314118],[104.031082,52.313498],[104.030011,52.312597],[104.029287,52.311945],[104.028587,52.31135],[104.027875,52.310728],[104.027027,52.310009],[104.026209,52.309296],[104.025388,52.308575],[104.024536,52.30784],[104.023718,52.307129],[104.023364,52.306796],[104.022536,52.30609],[104.022073,52.305681],[104.021424,52.305121],[104.020951,52.304713],[104.020511,52.304337],[104.019859,52.303689],[104.019446,52.303268],[104.018998,52.302693],[104.018837,52.302388],[104.018658,52.302078],[104.018381,52.301396],[104.018283,52.301006],[104.018202,52.300549],[104.018146,52.299979],[104.018229,52.299335],[104.018305,52.29903],[104.018388,52.298705],[104.018555,52.298225],[104.018686,52.297929],[104.018876,52.297559],[104.019086,52.297206],[104.019362,52.296842],[104.019619,52.296543],[104.019971,52.296131],[104.020352,52.295776],[104.020671,52.295487],[104.021384,52.294826],[104.0217,52.294465],[104.022042,52.294107],[104.0223,52.29373],[104.022524,52.293425],[104.022772,52.292964],[104.023047,52.292266],[104.023124,52.291945],[104.023193,52.291562],[104.023236,52.291011],[104.02321,52.290675],[104.023116,52.290045],[104.022936,52.289305],[104.022747,52.288837],[104.022472,52.288186],[104.022172,52.287546],[104.021949,52.286937],[104.021708,52.286249],[104.021475,52.285627],[104.021164,52.284711],[104.020903,52.283896],[104.02065,52.282989],[104.020511,52.282478],[104.020397,52.282017],[104.020305,52.281632],[104.020187,52.28107],[104.020048,52.280392],[104.019964,52.280001],[104.019886,52.279577],[104.01976,52.278945],[104.019717,52.278619],[104.019678,52.278335],[104.01962,52.278008],[104.019571,52.277673],[104.01953,52.277305],[104.019477,52.276844],[104.019433,52.276581],[104.01942,52.276377],[104.019359,52.275651],[104.019339,52.275314],[104.019325,52.275043],[104.019305,52.274636],[104.019271,52.274195],[104.019268,52.273707],[104.019254,52.273052],[104.019275,52.27251],[104.019268,52.272021],[104.019268,52.271577],[104.019271,52.271171],[104.019271,52.270947],[104.019303,52.27065],[104.019295,52.270533],[104.019303,52.270341],[104.019312,52.270099],[104.019364,52.269554],[104.019405,52.268975],[104.019426,52.268527],[104.019468,52.267869],[104.019426,52.267501],[104.019332,52.266943],[104.019188,52.266398],[104.01902,52.26595],[104.018869,52.265595],[104.018647,52.265174],[104.018432,52.264831],[104.018224,52.264524],[104.017947,52.264169],[104.017436,52.263585],[104.01702,52.263193],[104.016514,52.262757],[104.015909,52.262339],[104.015396,52.262009],[104.014434,52.261493],[104.013591,52.261086],[104.012786,52.260761],[104.012182,52.260521],[104.011352,52.260229],[104.010853,52.260093],[104.010457,52.260007],[104.009964,52.259895],[104.008204,52.259516],[104.007136,52.259307],[104.005981,52.259101],[104.005566,52.259024],[104.005346,52.258985],[104.004829,52.258892],[104.004387,52.25881],[104.003384,52.258609],[104.002159,52.258358],[104.0013,52.258182],[104.001051,52.258129],[103.999352,52.257786],[103.998109,52.25752],[103.997224,52.257313],[103.996509,52.257118],[103.995659,52.256868],[103.995057,52.256645],[103.994531,52.256423],[103.993664,52.256022],[103.993078,52.255698],[103.992653,52.255421],[103.992302,52.255168],[103.991806,52.25478],[103.991418,52.254395],[103.991112,52.254077],[103.990823,52.253761],[103.990592,52.253466],[103.990237,52.252942],[103.98962,52.251894],[103.989454,52.251625],[103.989081,52.251],[103.988671,52.250286],[103.988231,52.249449],[103.987575,52.248295],[103.987176,52.24765],[103.987037,52.247389],[103.986799,52.246858],[103.986686,52.246485],[103.986663,52.246409],[103.986647,52.24635],[103.986577,52.246103],[103.98651,52.245696],[103.98651,52.245414],[103.986509,52.245191],[103.986509,52.245161],[103.98651,52.245057],[103.98652,52.243887],[103.986616,52.242547],[103.986617,52.242544],[103.986874,52.238664],[103.986976,52.23616],[103.987223,52.233965],[103.987394,52.23292],[103.987598,52.231974],[103.987818,52.231259],[103.988612,52.229189],[103.989556,52.227139],[103.991176,52.22405],[103.99329,52.219837],[103.994565,52.217347],[103.995211,52.216061],[103.995658,52.215103],[104.000478,52.205644],[104.000949,52.204667],[104.001728,52.202697],[104.002167,52.201499],[104.005012,52.193716],[104.007014,52.188243],[104.00703,52.188006],[104.007622,52.186164],[104.007646,52.186059],[104.007657,52.185985],[104.007666,52.185892],[104.007671,52.185804],[104.007653,52.185614],[104.007606,52.185382],[104.007569,52.185265],[104.007524,52.185147],[104.007461,52.185024],[104.007426,52.184965],[104.007249,52.184711],[104.00709,52.184542],[104.006782,52.18428],[104.006516,52.184114],[104.006297,52.183993],[104.006013,52.18387],[104.005484,52.183708],[104.004883,52.183556],[104.004293,52.183429],[104.003442,52.18323],[104.002785,52.183055],[104.002543,52.183004],[103.991253,52.18066],[103.982369,52.17883],[103.980065,52.178344],[103.973538,52.17697],[103.972551,52.176795],[103.971202,52.176697],[103.970255,52.176709],[103.96966,52.176749],[103.969165,52.176775],[103.967395,52.176885],[103.966595,52.176927],[103.966311,52.176942],[103.961799,52.177179],[103.957812,52.177428],[103.957014,52.177478],[103.95015,52.177867],[103.949743,52.177886],[103.949488,52.177884],[103.949305,52.177869],[103.949196,52.177851],[103.949144,52.177843],[103.949049,52.177819],[103.94898,52.177798],[103.948857,52.17776],[103.948723,52.177708],[103.948625,52.177668],[103.9485,52.177605],[103.948413,52.177554],[103.94831,52.177485],[103.948195,52.177404],[103.948088,52.177326],[103.947888,52.177166],[103.947797,52.177078],[103.94774,52.177027],[103.947673,52.176957],[103.947613,52.176897],[103.947566,52.176841],[103.947507,52.176751],[103.947464,52.176656],[103.947442,52.176559],[103.947443,52.176418],[103.947537,52.176085],[103.947571,52.175993],[103.947765,52.175553],[103.948234,52.17468],[103.948301,52.174556],[103.948524,52.174142],[103.948624,52.173983],[103.9487,52.173824],[103.948787,52.173586],[103.948998,52.172926],[103.949117,52.172694],[103.949413,52.172156],[103.950298,52.170665],[103.950472,52.170361],[103.950644,52.170061],[103.95072,52.169893],[103.950805,52.169665],[103.950874,52.169311],[103.95092,52.16889],[103.950968,52.165789],[103.951038,52.165489],[103.951151,52.165114],[103.952073,52.162825],[103.95218,52.161696],[103.952373,52.160818],[103.952588,52.159128],[103.952599,52.159041],[103.953425,52.157113],[103.953693,52.156304],[103.953738,52.155571],[103.953314,52.154225],[103.952524,52.153022],[103.9524,52.152736],[103.952344,52.152483],[103.952333,52.152287],[103.952358,52.152056],[103.952474,52.151646],[103.952626,52.15127],[103.952746,52.151129],[103.95292,52.15103],[103.95312,52.150981],[103.953274,52.150985],[103.953423,52.151016],[103.953582,52.15109],[103.954129,52.151519],[103.95439,52.151697],[103.954791,52.151887],[103.955198,52.152041],[103.955502,52.152123],[103.955883,52.152186],[103.956523,52.152242],[103.957063,52.152261],[103.957717,52.15225],[103.959694,52.152119],[103.961466,52.15195],[103.962771,52.151699],[103.963735,52.151367],[103.964891,52.150709],[103.965786,52.149959],[103.966482,52.14865],[103.966813,52.147619],[103.967896,52.146237],[103.968868,52.145169],[103.969142,52.144868],[103.969916,52.144116],[103.97054,52.142887],[103.971372,52.140967],[103.971877,52.139642],[103.971881,52.1389],[103.971784,52.137606],[103.971869,52.136984],[103.972016,52.135768],[103.972276,52.134899],[103.973169,52.132666],[103.973402,52.13118],[103.973602,52.129743],[103.97363,52.12906],[103.973426,52.128257],[103.973029,52.127383],[103.972053,52.126044],[103.971342,52.124809],[103.971279,52.1247],[103.971103,52.124008],[103.971334,52.123119],[103.97234,52.121562],[103.972908,52.121015],[103.973434,52.120574],[103.974228,52.119954],[103.974989,52.118936],[103.975349,52.118292],[103.975658,52.116874],[103.975845,52.11584],[103.975787,52.114863],[103.975528,52.114145],[103.975486,52.114028],[103.974926,52.113009],[103.974029,52.111905],[103.973613,52.111229],[103.972962,52.109116],[103.972922,52.108478],[103.973166,52.107825],[103.9735,52.106658],[103.973613,52.105669],[103.973583,52.105474],[103.973401,52.104282],[103.973175,52.103597],[103.972776,52.102885],[103.971914,52.10209],[103.971351,52.101525],[103.970439,52.099875],[103.96965,52.098951],[103.968987,52.097964],[103.968251,52.096678],[103.96755,52.09514],[103.967163,52.093137],[103.966944,52.09185],[103.966958,52.090799],[103.967148,52.090259],[103.967294,52.089106],[103.967454,52.087837],[103.967309,52.087107],[103.967247,52.08503],[103.966976,52.08432],[103.966623,52.083926],[103.966228,52.083739],[103.96552,52.08355],[103.964672,52.083324],[103.963324,52.08298],[103.957373,52.082462],[103.955839,52.082356],[103.954423,52.082323],[103.953642,52.082212],[103.95308,52.082043],[103.952146,52.081562],[103.950595,52.081126],[103.948499,52.080964],[103.946961,52.080858],[103.944803,52.080701],[103.943829,52.080671],[103.94279,52.080477],[103.939708,52.078966],[103.938502,52.078322],[103.937385,52.077541],[103.935146,52.075746],[103.934037,52.074557],[103.933601,52.073847],[103.933468,52.073156],[103.933523,52.072406],[103.933534,52.071812],[103.933053,52.070945],[103.932375,52.070322],[103.930905,52.06942],[103.928798,52.068224],[103.926273,52.067115],[103.925698,52.066904],[103.92376,52.06618],[103.922522,52.065733],[103.921476,52.065347],[103.920533,52.064909],[103.920383,52.064771],[103.92014,52.064547],[103.919852,52.064146],[103.919718,52.06396],[103.919632,52.063851],[103.919461,52.063634],[103.919321,52.063385],[103.919163,52.063135],[103.918981,52.062841],[103.918834,52.062613],[103.918226,52.061643],[103.918085,52.061426],[103.917914,52.061161],[103.91754,52.060587],[103.917392,52.06038],[103.917103,52.059976],[103.915923,52.058687],[103.915116,52.057499],[103.909399,52.047393],[103.908501,52.045894],[103.907878,52.044948],[103.907255,52.044091],[103.906504,52.043111],[103.905752,52.042333],[103.905038,52.041601],[103.891369,52.029811],[103.890142,52.02874],[103.889097,52.027849],[103.887998,52.027139],[103.886807,52.026372],[103.885814,52.025838],[103.885634,52.025741],[103.884022,52.025087],[103.882465,52.024602],[103.880871,52.024197],[103.878763,52.023824],[103.877188,52.023644],[103.875429,52.023554],[103.873083,52.023509],[103.871288,52.023475],[103.869584,52.023419],[103.868081,52.023351],[103.866616,52.023193],[103.864948,52.0229],[103.863171,52.022404],[103.861815,52.02193],[103.860441,52.021321],[103.859305,52.020622],[103.85848,52.020025],[103.857821,52.019484],[103.85696,52.018559],[103.856373,52.01777],[103.85586,52.016935],[103.855585,52.016225],[103.855384,52.015379],[103.855256,52.014443],[103.855311,52.013609],[103.856044,52.005331],[103.856099,52.004124],[103.855989,52.003289],[103.85575,52.002466],[103.855366,52.001597],[103.854889,52.000819],[103.854211,51.999995],[103.853387,51.999228],[103.852434,51.99845],[103.851225,51.997694],[103.849997,51.997096],[103.847835,51.996047],[103.846882,51.995494],[103.84678,51.995434],[103.84652,51.995281],[103.845966,51.994879],[103.844977,51.994044],[103.844409,51.993413],[103.843953,51.992873],[103.843777,51.992583],[103.843429,51.991991],[103.84192,51.988481],[103.841765,51.988223],[103.841621,51.988024],[103.841359,51.987804],[103.841049,51.987577],[103.840507,51.987002],[103.84024,51.986516],[103.84009,51.985341],[103.839993,51.984609],[103.840031,51.984109],[103.84024,51.982977],[103.840194,51.982616],[103.83993,51.982268],[103.839449,51.981922],[103.839004,51.981603],[103.838672,51.981218],[103.838563,51.981005],[103.838501,51.980689],[103.838493,51.979456],[103.838488,51.979155],[103.838451,51.978661],[103.838208,51.978222],[103.837663,51.977795],[103.837217,51.977558],[103.836329,51.977042],[103.83453,51.976283],[103.832944,51.975558],[103.830731,51.974947],[103.829858,51.974699],[103.828933,51.974267],[103.828291,51.973894],[103.82739,51.973226],[103.82632,51.972448],[103.825891,51.972114],[103.825685,51.971677],[103.825633,51.971028],[103.826182,51.969828],[103.826179,51.969736],[103.826171,51.969519],[103.82576,51.968529],[103.825315,51.967922],[103.824103,51.967154],[103.823246,51.96663],[103.821932,51.965629],[103.820476,51.964404],[103.820018,51.963992],[103.81914,51.962999],[103.818446,51.962098],[103.817602,51.961314],[103.815698,51.960207],[103.815371,51.959706],[103.815283,51.958957],[103.8157,51.957847],[103.81572,51.957404],[103.815469,51.956374],[103.815631,51.955677],[103.815637,51.955242],[103.814727,51.953804],[103.813916,51.952738],[103.813511,51.952176],[103.813302,51.951678],[103.813242,51.951028],[103.813237,51.950726],[103.813216,51.949376],[103.813137,51.948971],[103.813055,51.948659],[103.812633,51.947848],[103.812247,51.94738],[103.81141,51.946232],[103.811376,51.945618],[103.811786,51.944806],[103.811812,51.944754],[103.812412,51.94405],[103.813442,51.943543],[103.814181,51.943281],[103.814671,51.942951],[103.815423,51.942151],[103.815735,51.941498],[103.815586,51.939954],[103.815688,51.938594],[103.815769,51.938042],[103.815806,51.93694],[103.81604,51.93637],[103.816019,51.935789],[103.815455,51.93385],[103.81524,51.933019],[103.81539,51.931858],[103.81553,51.93131],[103.815844,51.930934],[103.816216,51.930675],[103.818064,51.929962],[103.819474,51.92942],[103.821904,51.928411],[103.82249,51.927854],[103.823176,51.926948],[103.823474,51.926237],[103.823467,51.925488],[103.823476,51.924971],[103.824037,51.923691],[103.824223,51.923121],[103.824202,51.922314],[103.82381,51.920434],[103.82391,51.919864],[103.824912,51.918855],[103.826912,51.917582],[103.827586,51.917098],[103.827924,51.916481],[103.827822,51.915743],[103.826585,51.913368],[103.825449,51.911531],[103.825003,51.910493],[103.824959,51.910145],[103.824949,51.909844],[103.824947,51.909765],[103.825027,51.908142],[103.825015,51.907249],[103.824865,51.90637],[103.824971,51.90537],[103.825146,51.9047],[103.825139,51.903965],[103.824958,51.902953],[103.824947,51.902708],[103.825054,51.902516],[103.826247,51.901778],[103.828759,51.900527],[103.831423,51.89966],[103.832137,51.899518],[103.833698,51.899347],[103.835869,51.898853],[103.837476,51.898368],[103.839572,51.897625],[103.841568,51.897075],[103.842522,51.896747],[103.842902,51.896584],[103.843065,51.896469],[103.843582,51.896014],[103.84439,51.89499],[103.844739,51.89454],[103.845128,51.894069],[103.845542,51.893581],[103.845815,51.893221],[103.845909,51.893098],[103.846075,51.892809],[103.846074,51.892559],[103.845882,51.892081],[103.845718,51.891628],[103.845631,51.891468],[103.845538,51.891298],[103.845374,51.89097],[103.845206,51.890645],[103.845055,51.890304],[103.844914,51.889974],[103.844836,51.889697],[103.844786,51.889465],[103.844539,51.888465],[103.844302,51.887466],[103.844147,51.887033],[103.843933,51.886767],[103.843873,51.88671],[103.842641,51.885551],[103.841856,51.884632],[103.84113,51.883892],[103.840478,51.883232],[103.839988,51.882667],[103.83932,51.881939],[103.838975,51.881458],[103.838839,51.881193],[103.838706,51.880922],[103.838603,51.880658],[103.838517,51.880354],[103.838303,51.879791],[103.838273,51.879305],[103.838291,51.878763],[103.838363,51.878334],[103.838475,51.877903],[103.838624,51.877598],[103.838849,51.877239],[103.839188,51.876745],[103.839614,51.876212],[103.840445,51.875211],[103.842121,51.873158],[103.842863,51.872235],[103.84329,51.871439],[103.843707,51.869749],[103.843988,51.868655],[103.844208,51.868092],[103.844473,51.867561],[103.844924,51.866921],[103.845929,51.865684],[103.846148,51.865369],[103.846277,51.865169],[103.846402,51.864966],[103.846517,51.864745],[103.84659,51.864553],[103.846873,51.863789],[103.847066,51.863179],[103.847164,51.862774],[103.847231,51.86061],[103.848526,51.858181],[103.848473,51.857568],[103.849098,51.856541],[103.849355,51.85613],[103.849756,51.854967],[103.850087,51.854778],[103.851867,51.854492],[103.852367,51.854197],[103.852685,51.853861],[103.852787,51.853524],[103.852836,51.853164],[103.852629,51.85259],[103.852749,51.852321],[103.853142,51.851937],[103.853488,51.85172],[103.854142,51.851423],[103.854384,51.851105],[103.854406,51.850788],[103.854369,51.850712],[103.854159,51.850279],[103.853611,51.84973],[103.853077,51.849471],[103.852056,51.849153],[103.850599,51.848557],[103.849512,51.847927],[103.847656,51.846723],[103.844989,51.846109],[103.84435,51.845912],[103.84228,51.844316],[103.841657,51.843997],[103.840059,51.843432],[103.838928,51.843055],[103.838189,51.842734],[103.837807,51.842532],[103.837502,51.842204],[103.837502,51.841674],[103.837581,51.841205],[103.837452,51.840879],[103.836621,51.840346],[103.835605,51.84007],[103.835014,51.839898],[103.832179,51.838988],[103.831388,51.838953],[103.829945,51.839139],[103.827233,51.839113],[103.825922,51.839118],[103.824944,51.838788],[103.824391,51.838295],[103.823092,51.837222],[103.821508,51.835814],[103.821491,51.835799],[103.820743,51.835391],[103.820217,51.835233],[103.81957,51.83515],[103.818416,51.835115],[103.817764,51.834836],[103.817334,51.834426],[103.816944,51.833756],[103.816885,51.833213],[103.81706,51.832726],[103.817502,51.832021],[103.818073,51.831135],[103.818596,51.829634],[103.818819,51.829223],[103.819762,51.827542],[103.819902,51.827294],[103.821534,51.824526],[103.82193,51.823862],[103.822042,51.823526],[103.822096,51.823175],[103.822145,51.822555],[103.821975,51.821933],[103.82178,51.821481],[103.821235,51.82085],[103.820688,51.820397],[103.820021,51.820057],[103.819059,51.819666],[103.815929,51.818838],[103.815817,51.818808],[103.813232,51.81818],[103.812397,51.817966],[103.809659,51.817288],[103.805467,51.816236],[103.803972,51.81609],[103.803075,51.815918],[103.802483,51.815682],[103.800148,51.814055],[103.796769,51.812466],[103.795721,51.81189],[103.793995,51.810979],[103.788784,51.809666],[103.788184,51.809253],[103.788034,51.8087],[103.787964,51.808301],[103.787937,51.808146],[103.787832,51.807312],[103.787549,51.806024],[103.787415,51.805211],[103.787101,51.804553],[103.786854,51.80418],[103.786609,51.803935],[103.78534,51.803367],[103.784456,51.80294],[103.783153,51.801749],[103.782571,51.801132],[103.782349,51.800855],[103.782302,51.80035],[103.782878,51.799106],[103.783293,51.798142],[103.783429,51.797425],[103.783365,51.796737],[103.782765,51.795043],[103.781893,51.792791],[103.78104,51.790754],[103.780795,51.789941],[103.780622,51.78963],[103.779996,51.788825],[103.77909,51.788088],[103.777484,51.787126],[103.777057,51.786797],[103.776252,51.78605],[103.774686,51.785036],[103.773199,51.784304],[103.771363,51.783029],[103.769666,51.781794],[103.767582,51.780333],[103.766327,51.779897],[103.765415,51.77969],[103.764776,51.779427],[103.764114,51.778928],[103.763885,51.778631],[103.763562,51.777863],[103.763419,51.777556],[103.763001,51.77725],[103.761818,51.776756],[103.760578,51.776384],[103.760016,51.776396],[103.758035,51.776773],[103.755963,51.777037],[103.755128,51.777143],[103.754336,51.777221],[103.753502,51.777188],[103.752795,51.777046],[103.751908,51.776719],[103.751386,51.776332],[103.751158,51.776059],[103.750555,51.774621],[103.749268,51.772895],[103.748535,51.772113],[103.746806,51.770741],[103.746132,51.77038],[103.74495,51.769971],[103.743147,51.768729],[103.742779,51.768407],[103.742332,51.767795],[103.742059,51.766946],[103.742167,51.765636],[103.74216,51.764823],[103.741937,51.764128],[103.741544,51.76344],[103.740169,51.762076],[103.739819,51.761252],[103.739655,51.759934],[103.739312,51.758978],[103.738654,51.757773],[103.73841,51.757413],[103.738259,51.75725],[103.737657,51.756963],[103.737169,51.756729],[103.73679,51.756487],[103.736488,51.756274],[103.736153,51.755892],[103.73576,51.755369],[103.734761,51.753893],[103.734576,51.753629],[103.733949,51.752737],[103.733563,51.752343],[103.733185,51.752104],[103.732456,51.751812],[103.730525,51.751297],[103.729031,51.750797],[103.727632,51.750053],[103.726808,51.749671],[103.72625,51.749495],[103.725521,51.749129],[103.724474,51.748363],[103.723057,51.747088],[103.721933,51.745674],[103.721856,51.745409],[103.721856,51.743591],[103.721538,51.743166],[103.721049,51.742762],[103.720388,51.742475],[103.719748,51.742344],[103.718606,51.742203],[103.717508,51.742056],[103.716067,51.741841],[103.715886,51.741812],[103.715663,51.741789],[103.71197,51.741462],[103.711635,51.741428],[103.71135,51.741395],[103.711295,51.741389],[103.710894,51.741344],[103.710339,51.741285],[103.710117,51.741256],[103.709947,51.741224],[103.709598,51.741143],[103.708636,51.740859],[103.708454,51.740796],[103.708282,51.740729],[103.70795,51.740543],[103.707676,51.740374],[103.707445,51.740204],[103.707265,51.740055],[103.706788,51.739626],[103.706668,51.73948],[103.706557,51.739311],[103.706519,51.739161],[103.706519,51.739051],[103.706568,51.738912],[103.706654,51.738786],[103.706777,51.738656],[103.706903,51.738532],[103.706992,51.738417],[103.707067,51.738238],[103.707099,51.738143],[103.707139,51.73802],[103.707192,51.737891],[103.707341,51.737646],[103.708487,51.735974],[103.708607,51.7358],[103.708902,51.735359],[103.709099,51.735072],[103.709283,51.734731],[103.709405,51.734448],[103.709466,51.734241],[103.709503,51.733996],[103.709493,51.73382],[103.709475,51.733719],[103.70947,51.733611],[103.709457,51.733479],[103.709507,51.733017],[103.709601,51.732691],[103.709675,51.732483],[103.709779,51.732295],[103.709929,51.732115],[103.710062,51.732021],[103.710162,51.731953],[103.710314,51.731874],[103.710416,51.731828],[103.710533,51.731781],[103.710659,51.731735],[103.710754,51.731701],[103.710838,51.731673],[103.710893,51.731654],[103.710917,51.731646],[103.710976,51.731629],[103.711033,51.731614],[103.711095,51.731608],[103.71116,51.731604],[103.711224,51.731607],[103.711295,51.731614],[103.711358,51.731628],[103.711453,51.731656],[103.711542,51.731692],[103.711613,51.731725],[103.711686,51.731758],[103.711739,51.731784],[103.711793,51.731812],[103.711867,51.731849],[103.711925,51.731885],[103.712013,51.731942],[103.712502,51.732296],[103.712599,51.732349],[103.712671,51.732386],[103.71272,51.73241],[103.712769,51.732431],[103.712822,51.732453],[103.71286,51.732467],[103.712906,51.732478],[103.712949,51.732484],[103.712994,51.732488],[103.713046,51.732488],[103.713095,51.732486],[103.71314,51.732482],[103.713178,51.732476],[103.713211,51.732468],[103.713243,51.732457],[103.713267,51.732445],[103.713292,51.732427],[103.713306,51.732415],[103.713321,51.732402],[103.713333,51.732387],[103.713346,51.732363],[103.71335,51.73234],[103.713353,51.732318],[103.713352,51.732297],[103.713348,51.732279],[103.71334,51.732254],[103.713329,51.732235],[103.713308,51.732209],[103.713284,51.732185],[103.713247,51.73215],[103.713188,51.732108],[103.713009,51.731999],[103.712811,51.731885],[103.712633,51.731782],[103.712532,51.731715],[103.712398,51.731614],[103.71228,51.731539],[103.712176,51.731487],[103.712074,51.731453],[103.711978,51.731425],[103.711849,51.731385],[103.71171,51.73135],[103.711536,51.731298],[103.711472,51.731271],[103.711425,51.73125],[103.71139,51.731229],[103.711356,51.731205],[103.711331,51.731181],[103.711312,51.731159],[103.711297,51.731132],[103.711291,51.731108],[103.711288,51.731078],[103.711299,51.731042],[103.71132,51.731009],[103.711346,51.73098],[103.711378,51.730958],[103.711414,51.73094],[103.711458,51.730929],[103.711511,51.730922],[103.711558,51.730921],[103.711614,51.730926],[103.711667,51.730936],[103.711822,51.730969],[103.712201,51.731064],[103.712468,51.731141],[103.712755,51.731222],[103.713066,51.731326],[103.713263,51.731404],[103.713596,51.731557],[103.713674,51.731596],[103.713748,51.731626],[103.713811,51.731649],[103.713867,51.73167],[103.713933,51.731691],[103.713996,51.731713],[103.714068,51.73173],[103.714138,51.731749],[103.714247,51.73177],[103.714331,51.731781],[103.714406,51.731794],[103.714491,51.731804],[103.714556,51.731811],[103.714633,51.731818],[103.714712,51.731825],[103.714786,51.731833],[103.714868,51.731844],[103.71492,51.731851],[103.714964,51.731859],[103.715016,51.731869],[103.715054,51.731881],[103.715089,51.73189],[103.715116,51.731901],[103.715148,51.731912],[103.715181,51.731925],[103.715222,51.731943],[103.715316,51.731995],[103.715581,51.732137],[103.715688,51.732195],[103.715732,51.732216],[103.715784,51.732236],[103.715825,51.732246],[103.715868,51.732254],[103.715906,51.732257],[103.715947,51.732259],[103.716004,51.732261],[103.716069,51.732263],[103.716224,51.732266],[103.716381,51.732263],[103.716697,51.732247],[103.718077,51.732185],[103.71997,51.732055],[103.721927,51.731838],[103.722049,51.731825],[103.722295,51.731814],[103.72256,51.731829],[103.722878,51.731863],[103.72291,51.731865],[103.722949,51.731865],[103.722986,51.731864],[103.723023,51.73186],[103.723055,51.731854],[103.723081,51.731848],[103.723113,51.731837],[103.723134,51.731829],[103.723157,51.731819],[103.723179,51.731806],[103.723195,51.731792],[103.723209,51.731776],[103.723218,51.731759],[103.723224,51.731741],[103.723227,51.731727],[103.723227,51.731709],[103.723224,51.731693],[103.723217,51.731674],[103.723199,51.731651],[103.723179,51.731635],[103.723147,51.731617],[103.723105,51.731599],[103.72305,51.731585],[103.722778,51.731544],[103.722332,51.731458],[103.721981,51.731346],[103.721804,51.731287],[103.721474,51.731163],[103.721318,51.731102],[103.720302,51.730735],[103.719566,51.730433],[103.71874,51.730083],[103.718353,51.729916],[103.718159,51.729827],[103.717702,51.729589],[103.717452,51.729461],[103.71548,51.72845],[103.715293,51.728353],[103.714872,51.728085],[103.714756,51.727991],[103.714092,51.727458],[103.71359,51.727014],[103.712473,51.72617],[103.712302,51.726042],[103.711553,51.725551],[103.711371,51.725426],[103.711015,51.725173],[103.711015,51.725173],[103.710508,51.724828],[103.710372,51.724753],[103.709927,51.724438],[103.709275,51.723994],[103.708783,51.72365],[103.708317,51.723367],[103.708021,51.723226],[103.707755,51.723111],[103.704698,51.721827],[103.704299,51.721677],[103.703927,51.72153],[103.703694,51.721465],[103.702702,51.721162],[103.702689,51.721159],[103.702139,51.721012],[103.698467,51.720069],[103.698038,51.719936],[103.697383,51.719674],[103.696688,51.719307],[103.695683,51.718784],[103.695291,51.71858],[103.694085,51.717867],[103.69306,51.717064],[103.690967,51.715325],[103.690918,51.715283],[103.690678,51.715067],[103.690484,51.714922],[103.689729,51.714274],[103.689671,51.714223],[103.689506,51.714079],[103.689217,51.713824],[103.689056,51.713673],[103.688836,51.713436],[103.688348,51.712698],[103.688201,51.71244],[103.687641,51.711581],[103.687477,51.711332],[103.687015,51.710588],[103.686555,51.709816],[103.68584,51.708849],[103.685059,51.707893],[103.684663,51.707481],[103.684282,51.707016],[103.683976,51.706657],[103.683646,51.706173],[103.683035,51.705347],[103.682783,51.704972],[103.681924,51.703801],[103.681259,51.70294],[103.680752,51.702252],[103.68069,51.702167],[103.679715,51.700829],[103.679536,51.700547],[103.67935,51.700258],[103.679194,51.699988],[103.67906,51.699718],[103.678956,51.699503],[103.678846,51.69923],[103.67876,51.698948],[103.678697,51.698663],[103.678647,51.698416],[103.67863,51.69822],[103.67861,51.697934],[103.67861,51.697926],[103.678609,51.697632],[103.678604,51.697415],[103.678637,51.697122],[103.678696,51.696771],[103.678755,51.696517],[103.678841,51.69621],[103.678915,51.695995],[103.679023,51.695709],[103.679157,51.695423],[103.679277,51.695228],[103.679388,51.695034],[103.679532,51.694811],[103.679811,51.694432],[103.680063,51.694139],[103.680203,51.69398],[103.680466,51.693727],[103.680524,51.693676],[103.680856,51.693382],[103.681539,51.692858],[103.682525,51.69226],[103.683093,51.691953],[103.684542,51.691382],[103.686045,51.690916],[103.687744,51.690405],[103.687957,51.690319],[103.688322,51.690113],[103.688933,51.689707],[103.689957,51.688995],[103.690129,51.688897],[103.690317,51.688832],[103.690507,51.688778],[103.690938,51.688673],[103.691378,51.688572],[103.691688,51.688514],[103.691939,51.688488],[103.692295,51.688471],[103.692925,51.688478],[103.693321,51.688479],[103.693493,51.688465],[103.693606,51.688432],[103.693712,51.688365],[103.693747,51.6883],[103.693764,51.688197],[103.693764,51.688121],[103.693723,51.68801],[103.693518,51.687655],[103.693358,51.687404],[103.693262,51.68721],[103.693172,51.686999],[103.693058,51.686742],[103.692959,51.686579],[103.692845,51.68635],[103.692794,51.686156],[103.692786,51.685929],[103.69282,51.685706],[103.692824,51.685353],[103.692824,51.685298],[103.69281,51.685215],[103.692744,51.68512],[103.69261,51.685027],[103.692376,51.68494],[103.692165,51.684862],[103.691935,51.684751],[103.691812,51.68463],[103.691775,51.684589],[103.691516,51.684287],[103.691255,51.683971],[103.691087,51.683726],[103.690965,51.683551],[103.690879,51.683417],[103.69078,51.683243],[103.690603,51.682935],[103.690441,51.6826],[103.690279,51.682208],[103.690124,51.681802],[103.690047,51.681592],[103.690015,51.681462],[103.689991,51.681349],[103.689997,51.681246],[103.690013,51.681137],[103.690067,51.680982],[103.690453,51.680263],[103.690541,51.680119],[103.690577,51.680011],[103.690592,51.679903],[103.69056,51.679787],[103.69049,51.679699],[103.690384,51.67965],[103.690216,51.679605],[103.689796,51.679555],[103.688965,51.679438],[103.688665,51.679401],[103.688351,51.679358],[103.687989,51.679325],[103.687674,51.679297],[103.687464,51.67927],[103.687275,51.679226],[103.687132,51.679184],[103.686929,51.679107],[103.68669,51.678962],[103.686435,51.678782],[103.686125,51.678543],[103.685854,51.678322],[103.685492,51.677975],[103.685438,51.677923],[103.685176,51.677667],[103.684954,51.677447],[103.68481,51.677305],[103.684725,51.677176],[103.684648,51.677038],[103.684619,51.676899],[103.684616,51.676735],[103.684645,51.676579],[103.684729,51.676382],[103.684848,51.676166],[103.685066,51.675806],[103.685077,51.675788],[103.685224,51.675555],[103.685324,51.67538],[103.68538,51.675255],[103.685442,51.67514],[103.685482,51.675066],[103.685505,51.675008],[103.685593,51.674783],[103.6857,51.674464],[103.685806,51.674026],[103.685852,51.673818],[103.685963,51.673226],[103.686101,51.672595],[103.686122,51.672475],[103.686187,51.67211],[103.686242,51.671802],[103.686322,51.671432],[103.686407,51.671079],[103.686432,51.670997],[103.686454,51.67092],[103.686478,51.670858],[103.68653,51.670751],[103.686589,51.670651],[103.686682,51.670524],[103.686786,51.670372],[103.687059,51.670049],[103.687174,51.669911],[103.687502,51.669566],[103.688039,51.669015],[103.688083,51.668969],[103.688201,51.668843],[103.688641,51.668371],[103.688834,51.668171],[103.689467,51.667503],[103.689492,51.667476],[103.69007,51.66689],[103.690307,51.666647],[103.69039,51.66656],[103.690474,51.666473],[103.690615,51.666316],[103.690773,51.666123],[103.691031,51.665857],[103.69112,51.665766],[103.691153,51.66573],[103.691178,51.665706],[103.691401,51.665473],[103.69147,51.665402],[103.692162,51.664675],[103.692201,51.66464],[103.692312,51.66454],[103.692495,51.664407],[103.692537,51.664378],[103.692801,51.664201],[103.692908,51.664147],[103.693122,51.664038],[103.69339,51.66392],[103.693625,51.663835],[103.693749,51.663793],[103.693911,51.663745],[103.694086,51.663699],[103.694375,51.663635],[103.694563,51.663592],[103.694983,51.66354],[103.695222,51.663521],[103.695579,51.663494],[103.695845,51.663479],[103.698023,51.663287],[103.698636,51.663235],[103.700363,51.663081],[103.700575,51.663064],[103.700982,51.663029],[103.705224,51.662663],[103.706793,51.662516],[103.706901,51.662505],[103.707077,51.662487],[103.708596,51.662318],[103.709558,51.662171],[103.709657,51.662156],[103.711074,51.661948],[103.711166,51.66193],[103.71125,51.661906],[103.711316,51.661881],[103.711396,51.661842],[103.711479,51.661795],[103.711731,51.661629],[103.712047,51.661394],[103.713235,51.660485],[103.713689,51.660127],[103.714424,51.659548],[103.715536,51.658687],[103.716151,51.658211],[103.71658,51.657879],[103.716942,51.657601],[103.717149,51.657446],[103.717348,51.657306],[103.717803,51.656974],[103.717947,51.656872],[103.718384,51.656557],[103.718497,51.656469],[103.718644,51.656361],[103.718863,51.656201],[103.719126,51.656026],[103.71984,51.655551],[103.719988,51.655453],[103.720815,51.654921],[103.7211,51.654746],[103.72174,51.654336],[103.722714,51.653719],[103.72277,51.653684],[103.723144,51.65344],[103.723435,51.653257],[103.72477,51.652388],[103.725448,51.652008],[103.725724,51.651979],[103.725944,51.652018],[103.726473,51.652237],[103.726604,51.652287],[103.726889,51.652395],[103.727377,51.652576],[103.727716,51.652696],[103.728102,51.652764],[103.728327,51.652797],[103.728732,51.652808],[103.729192,51.652777],[103.729449,51.652746],[103.730159,51.652592],[103.733805,51.651507],[103.73548,51.651008],[103.735736,51.650925],[103.736064,51.650823],[103.736591,51.650533],[103.737366,51.64999],[103.737528,51.649876],[103.737772,51.649729],[103.737983,51.64962],[103.738168,51.649522],[103.738284,51.649475],[103.738389,51.649439],[103.738656,51.649377],[103.739121,51.649309],[103.739569,51.649272],[103.741165,51.649225],[103.741564,51.649185],[103.741905,51.649139],[103.742204,51.649072],[103.742565,51.648969],[103.745698,51.647878],[103.746127,51.647721],[103.75237,51.645323],[103.752689,51.6452],[103.752989,51.645051],[103.753297,51.644874],[103.753506,51.644753],[103.753683,51.644628],[103.753933,51.644415],[103.75412,51.64423],[103.75431,51.644022],[103.754434,51.643883],[103.754486,51.643819],[103.754712,51.643541],[103.754965,51.643267],[103.755079,51.643157],[103.755137,51.643108],[103.755205,51.643049],[103.755249,51.643017],[103.75532,51.642966],[103.755437,51.642883],[103.755831,51.642658],[103.756168,51.642478],[103.756218,51.642457],[103.756491,51.642338],[103.756513,51.642329],[103.757421,51.641979],[103.758283,51.641657],[103.760492,51.64083],[103.76077,51.640732],[103.761095,51.640626],[103.761454,51.640537],[103.761774,51.640471],[103.762165,51.640412],[103.762537,51.640384],[103.7626,51.640385],[103.762846,51.640386],[103.762978,51.640387],[103.763439,51.640417],[103.764108,51.640527],[103.764438,51.640582],[103.765239,51.640713],[103.765543,51.640749],[103.765832,51.640765],[103.766126,51.640761],[103.766428,51.640738],[103.766719,51.640673],[103.767058,51.640569],[103.767372,51.640419],[103.767523,51.640305],[103.76763,51.640147],[103.767693,51.639994],[103.767716,51.639834],[103.767676,51.63881],[103.767669,51.638633],[103.767664,51.638502],[103.767705,51.638303],[103.76777,51.638109],[103.767886,51.63793],[103.768038,51.637754],[103.768295,51.637484],[103.768475,51.637362],[103.76865,51.637266],[103.768955,51.637148],[103.7692,51.637079],[103.769496,51.63698],[103.769787,51.636904],[103.770057,51.636863],[103.773972,51.636367],[103.77427,51.636325],[103.774542,51.636284],[103.774841,51.636217],[103.7751,51.636151],[103.7754,51.63603],[103.775647,51.635908],[103.775884,51.635763],[103.776122,51.635583],[103.77618,51.635539],[103.77674,51.635],[103.77736,51.634472],[103.777697,51.634239],[103.778243,51.633945],[103.778438,51.633848],[103.778685,51.633743],[103.78114,51.632885],[103.781358,51.632794],[103.781496,51.632724],[103.781694,51.6326],[103.781893,51.632435],[103.782077,51.63227],[103.782238,51.63208],[103.78332,51.630649],[103.783395,51.630574],[103.783482,51.630512],[103.783874,51.63026],[103.784052,51.630145],[103.784236,51.630063],[103.784438,51.629994],[103.784673,51.629913],[103.786838,51.629372],[103.787084,51.629299],[103.787283,51.629213],[103.787535,51.629074],[103.790897,51.627065],[103.79108,51.626957],[103.791354,51.626839],[103.791731,51.626704],[103.792156,51.6266],[103.792544,51.626556],[103.793052,51.626559],[103.793691,51.626614],[103.79694,51.626984],[103.797298,51.627002],[103.797748,51.626996],[103.798252,51.626928],[103.798808,51.626796],[103.799615,51.626563],[103.800819,51.626217],[103.801376,51.626053],[103.801596,51.62599],[103.801702,51.625959],[103.803127,51.625568],[103.805165,51.625],[103.805225,51.624983],[103.81036,51.623516],[103.811376,51.623237],[103.812191,51.623013],[103.812534,51.62291],[103.812822,51.622793],[103.813071,51.622696],[103.816604,51.621035],[103.818597,51.620092],[103.820355,51.619277],[103.820457,51.61923],[103.820795,51.619093],[103.821064,51.619004],[103.821225,51.618971],[103.821255,51.618965],[103.821312,51.618958],[103.821483,51.618936],[103.821734,51.618924],[103.822058,51.618917],[103.822187,51.618917],[103.823765,51.618916],[103.824335,51.6189],[103.824915,51.61887],[103.825647,51.618783],[103.825971,51.618737],[103.826295,51.618673],[103.826648,51.618587],[103.826927,51.618516],[103.827197,51.618441],[103.827409,51.618366],[103.827605,51.618272],[103.827781,51.618146],[103.827959,51.617991],[103.827966,51.617984],[103.828492,51.617498],[103.829231,51.616894],[103.829727,51.616533],[103.82991,51.616402],[103.830093,51.616284],[103.830312,51.616153],[103.830967,51.615797],[103.831728,51.615384],[103.832398,51.61504],[103.833463,51.614498],[103.833809,51.614324],[103.834097,51.614191],[103.834462,51.614024],[103.835158,51.613702],[103.836305,51.613202],[103.836769,51.613023],[103.837445,51.612762],[103.838443,51.612386],[103.839697,51.611953],[103.840639,51.611637],[103.840986,51.611533],[103.841468,51.611389],[103.842108,51.611197],[103.843575,51.610737],[103.844612,51.610428],[103.84604,51.609985],[103.848149,51.609332],[103.848189,51.609319],[103.848522,51.609216],[103.848872,51.609105],[103.848951,51.60908],[103.849049,51.609043],[103.84938,51.608918],[103.849874,51.608709],[103.850313,51.608479],[103.85076,51.608235],[103.851161,51.607985],[103.851395,51.607824],[103.851586,51.607693],[103.852046,51.607333],[103.852671,51.606754],[103.852942,51.60647],[103.853355,51.605973],[103.853653,51.605571],[103.854157,51.60481],[103.854414,51.604505],[103.85468,51.604251],[103.854987,51.604048],[103.855326,51.603845],[103.855849,51.603621],[103.856258,51.603522],[103.856659,51.603468],[103.857191,51.603473],[103.857677,51.603509],[103.858138,51.603565],[103.858554,51.603658],[103.858967,51.603808],[103.859327,51.603995],[103.859862,51.604331],[103.860204,51.604618],[103.860494,51.604954],[103.860756,51.605258],[103.861134,51.60567],[103.861503,51.60603],[103.862144,51.60666],[103.86235,51.606823],[103.862582,51.606936],[103.862883,51.607026],[103.863167,51.607083],[103.863506,51.60712],[103.863777,51.607133],[103.864064,51.607127],[103.864409,51.607087],[103.864678,51.607023],[103.864966,51.60693],[103.865226,51.606819],[103.865493,51.606683],[103.86576,51.606523],[103.869054,51.604412],[103.869321,51.604251],[103.869617,51.604088],[103.869923,51.603948],[103.87024,51.603842],[103.870579,51.603778],[103.870985,51.603735],[103.871436,51.603728],[103.871944,51.603731],[103.872352,51.603758],[103.872874,51.603815],[103.873381,51.603898],[103.874068,51.604049],[103.874607,51.604208],[103.877757,51.605463],[103.878179,51.605591],[103.878586,51.605674],[103.879009,51.605714],[103.879428,51.60571],[103.879849,51.605667],[103.880202,51.6056],[103.880519,51.605514],[103.880787,51.605404],[103.881001,51.605277],[103.881194,51.605117],[103.881349,51.604951],[103.881456,51.604754],[103.881479,51.604587],[103.881462,51.604401],[103.881419,51.604211],[103.881183,51.603544],[103.881144,51.603372],[103.881135,51.603215],[103.881167,51.603036],[103.881231,51.602835],[103.881329,51.602642],[103.881488,51.602435],[103.881688,51.602222],[103.881889,51.602043],[103.882343,51.601662],[103.882608,51.60149],[103.882949,51.601337],[103.88336,51.601217],[103.883812,51.601169],[103.884277,51.601169],[103.884749,51.6012],[103.886407,51.601364],[103.886489,51.601372],[103.888308,51.60148],[103.889184,51.601325],[103.890224,51.600864],[103.890853,51.600493],[103.891781,51.600076],[103.892691,51.599775],[103.894091,51.599667],[103.895094,51.599775],[103.89681,51.599882],[103.897931,51.599852],[103.900415,51.599029],[103.903228,51.59791],[103.903456,51.597819],[103.908339,51.595876],[103.909803,51.595293],[103.911427,51.594683],[103.911857,51.594535],[103.91231,51.594419],[103.912567,51.594387],[103.912812,51.594363],[103.91307,51.594357],[103.913522,51.594377],[103.91411,51.59445],[103.917343,51.595078],[103.919619,51.595525],[103.920119,51.595699],[103.920671,51.595927],[103.921888,51.596651],[103.923075,51.597536],[103.923933,51.597963],[103.924771,51.598441],[103.925478,51.598603],[103.926614,51.598747],[103.928911,51.598496],[103.9317,51.598056],[103.932708,51.598],[103.933374,51.597963],[103.935403,51.59802],[103.936049,51.597951],[103.936527,51.597828],[103.937532,51.597192],[103.938351,51.596543],[103.939154,51.595492],[103.939498,51.595042],[103.940038,51.594657],[103.941442,51.594124],[103.944017,51.593057],[103.945586,51.592378],[103.946719,51.591565],[103.948108,51.590339],[103.948657,51.589989],[103.949051,51.589579],[103.950159,51.588189],[103.950761,51.587602],[103.95363,51.585378],[103.954459,51.584759],[103.955132,51.58411],[103.955732,51.583533],[103.955932,51.583264],[103.95621,51.582891],[103.956409,51.582727],[103.956621,51.582624],[103.957408,51.582243],[103.958797,51.581367],[103.959709,51.581028],[103.963809,51.579698],[103.967244,51.578476],[103.967296,51.578195],[103.967066,51.577793],[103.966609,51.576996],[103.966421,51.576613],[103.966542,51.57622],[103.967048,51.575925],[103.967715,51.57583],[103.968565,51.576098],[103.969193,51.576395],[103.97002,51.576786],[103.970433,51.576807],[103.970855,51.576634],[103.97173,51.576048],[103.973655,51.574992],[103.97535,51.574],[103.977952,51.572212],[103.978006,51.571937],[103.977902,51.571152],[103.978069,51.570908],[103.978374,51.57076],[103.97938,51.570657],[103.980465,51.570524],[103.981005,51.570194],[103.981173,51.569928],[103.981187,51.569735],[103.981079,51.569512],[103.980075,51.568569],[103.979938,51.56841],[103.979876,51.568202],[103.979892,51.568023],[103.97998,51.567903],[103.980128,51.5678],[103.980407,51.56778],[103.980609,51.567822],[103.982126,51.568203],[103.983056,51.568406],[103.983917,51.568594],[103.984844,51.568699],[103.985537,51.568594],[103.986133,51.568346],[103.986676,51.568018],[103.987757,51.567375],[103.988116,51.56718],[103.988285,51.567105],[103.988444,51.56704],[103.98895,51.56683],[103.98928,51.566696],[103.989468,51.566605],[103.989636,51.566509],[103.989854,51.566373],[103.990059,51.56621],[103.990771,51.565584],[103.99092,51.565455],[103.991066,51.565352],[103.991243,51.565263],[103.992716,51.564562],[103.99291,51.564456],[103.993064,51.564357],[103.993212,51.564242],[103.993375,51.564092],[103.993494,51.563954],[103.993998,51.563317],[103.994166,51.563148],[103.994309,51.56304],[103.994518,51.562916],[103.994772,51.562799],[103.995041,51.562715],[103.995395,51.562646],[103.995955,51.562577],[103.996275,51.56253],[103.996511,51.562468],[103.996695,51.562397],[103.996956,51.562249],[103.998923,51.560968],[103.999295,51.560737],[103.99962,51.560562],[104.000014,51.560361],[104.00007,51.560332],[104.000826,51.559958],[104.001419,51.559676],[104.001811,51.559486],[104.002051,51.559367],[104.002645,51.559106],[104.003238,51.558854],[104.00408,51.558496],[104.00448,51.558323],[104.004853,51.558159],[104.005132,51.558006],[104.005326,51.557873],[104.006418,51.556998],[104.012799,51.552835],[104.014821,51.551742],[104.017488,51.5507],[104.01865,51.550244],[104.02178,51.549633],[104.024,51.549095],[104.028423,51.547814],[104.033189,51.546062],[104.035421,51.545086],[104.037949,51.543583],[104.03962,51.542641],[104.040765,51.542122],[104.042467,51.541498],[104.042723,51.541404],[104.044538,51.540821],[104.045963,51.540364],[104.048291,51.539617],[104.048638,51.539505],[104.050105,51.539028],[104.053137,51.538061],[104.054598,51.537601],[104.055065,51.537454],[104.055663,51.537262],[104.056291,51.537058],[104.057972,51.536511],[104.079355,51.529559],[104.085075,51.527721],[104.08539,51.52762],[104.086022,51.527425],[104.089444,51.526372],[104.090376,51.526064],[104.092427,51.5254],[104.09438,51.524746],[104.094663,51.524651],[104.095445,51.52439],[104.095556,51.524353],[104.098263,51.523483],[104.100785,51.522658],[104.106924,51.520644],[104.109487,51.519787],[104.110104,51.519653],[104.110725,51.519503],[104.111274,51.519385],[104.112166,51.519208],[104.112637,51.519137],[104.11292,51.51911],[104.113271,51.51907],[104.11385,51.519023],[104.114682,51.51898],[104.115537,51.518956],[104.116385,51.518964],[104.117841,51.519006],[104.118955,51.519032],[104.119513,51.519046],[104.120113,51.519054],[104.121166,51.519059],[104.121955,51.519044],[104.122613,51.519007],[104.123963,51.518885],[104.124822,51.518789],[104.125923,51.518625],[104.12667,51.518502],[104.129135,51.51798],[104.12936,51.517936],[104.130139,51.517783],[104.130154,51.51778],[104.130765,51.517643],[104.1314,51.517508],[104.131734,51.517437],[104.132452,51.517285],[104.133944,51.516968],[104.134809,51.516743],[104.135085,51.516664],[104.135839,51.516435],[104.1365,51.516201],[104.136758,51.516098],[104.137265,51.515879],[104.137489,51.515765],[104.137636,51.515692],[104.137783,51.515618],[104.138098,51.515465],[104.138224,51.515397],[104.138248,51.515384],[104.138554,51.515233],[104.13865,51.515186],[104.138993,51.515003],[104.139856,51.514537],[104.140224,51.51434],[104.140569,51.514168],[104.143974,51.512397],[104.144152,51.512307],[104.148693,51.510012],[104.151256,51.50921],[104.152598,51.50893],[104.153965,51.508765],[104.154031,51.508757],[104.158148,51.508588],[104.160192,51.508517],[104.163929,51.50836],[104.164661,51.508331],[104.165687,51.508289],[104.166361,51.508218],[104.167442,51.508103],[104.168774,51.50788],[104.169184,51.50778],[104.172618,51.50694],[104.173476,51.506735],[104.196333,51.50119],[104.199058,51.500536],[104.202005,51.500019],[104.210605,51.498707],[104.222371,51.496916],[104.225834,51.496379],[104.227234,51.496164],[104.228262,51.496011],[104.23468,51.495019],[104.238349,51.494455],[104.240685,51.494094],[104.241168,51.494019],[104.250494,51.492576],[104.252657,51.492235],[104.252928,51.492192],[104.262413,51.490694],[104.264471,51.490386],[104.26587,51.49029],[104.267256,51.490351],[104.270174,51.490457],[104.272894,51.490733],[104.274873,51.490989],[104.275443,51.490986],[104.275885,51.490952],[104.276354,51.490885],[104.277789,51.490686],[104.27947,51.490463],[104.280201,51.490396],[104.281053,51.490371],[104.281799,51.490274],[104.282161,51.490219],[104.282541,51.490131],[104.283305,51.489913],[104.285365,51.489375],[104.286508,51.489062],[104.287648,51.488778],[104.288722,51.48859],[104.289885,51.488437],[104.291367,51.488308],[104.29281,51.488184],[104.293837,51.488077],[104.294893,51.487999],[104.296213,51.48787],[104.297351,51.48765],[104.298422,51.487361],[104.299637,51.486918],[104.300973,51.486404],[104.301717,51.486106],[104.3025,51.485865],[104.303443,51.485674],[104.304312,51.485565],[104.305188,51.485423],[104.30749,51.485163],[104.309781,51.484867],[104.314421,51.484268],[104.321831,51.483318],[104.323233,51.48322],[104.324644,51.483209],[104.327166,51.483189],[104.32772,51.483159],[104.328289,51.483033],[104.328882,51.482868],[104.329903,51.482542],[104.330802,51.482152],[104.332306,51.481385],[104.332879,51.481143],[104.333477,51.480935],[104.334125,51.480825],[104.336255,51.48058],[104.337688,51.480418],[104.339142,51.480251],[104.340861,51.480019],[104.342628,51.479805],[104.346471,51.479387],[104.347397,51.479229],[104.348361,51.479028],[104.350486,51.478564],[104.353888,51.477749],[104.356103,51.477226],[104.357181,51.476972],[104.378214,51.4718],[104.379288,51.471536],[104.380105,51.471335],[104.382644,51.47071],[104.384812,51.470047],[104.385751,51.469709],[104.385962,51.469577],[104.386141,51.469385],[104.386283,51.46905],[104.386389,51.468337],[104.386592,51.467892],[104.388105,51.466295],[104.389769,51.464542],[104.391367,51.463194],[104.39595,51.460774],[104.402997,51.457227],[104.403319,51.457086],[104.403644,51.456962],[104.404503,51.456668],[104.404771,51.456587],[104.405114,51.456501],[104.405736,51.456367],[104.405978,51.456327],[104.406219,51.456293],[104.406563,51.456267],[104.412112,51.456113],[104.413717,51.456062],[104.414575,51.456037],[104.417527,51.455949],[104.419188,51.455927],[104.419893,51.455916],[104.420559,51.455886],[104.42142,51.455786],[104.422238,51.455656],[104.423124,51.455493],[104.442856,51.45166],[104.444651,51.451312],[104.445105,51.451234],[104.445591,51.451165],[104.446033,51.451123],[104.446473,51.451087],[104.446942,51.451067],[104.447423,51.451046],[104.448002,51.451035],[104.448504,51.451033],[104.448975,51.451043],[104.449483,51.451074],[104.450007,51.451124],[104.450411,51.451171],[104.450886,51.451239],[104.451337,51.451314],[104.451742,51.451387],[104.452156,51.451471],[104.452533,51.45156],[104.45285,51.451657],[104.460465,51.454168],[104.463926,51.455309],[104.464361,51.455454],[104.464877,51.455604],[104.465364,51.455722],[104.465851,51.455828],[104.466366,51.455911],[104.466917,51.455982],[104.467439,51.456046],[104.468027,51.456106],[104.468585,51.456143],[104.46912,51.456162],[104.469577,51.456154],[104.470023,51.456142],[104.470483,51.456123],[104.470925,51.456098],[104.471439,51.456049],[104.471982,51.455965],[104.472517,51.455877],[104.479914,51.454594],[104.485592,51.453664],[104.48666,51.453489],[104.492909,51.45247],[104.494099,51.452266],[104.494404,51.452214],[104.494859,51.452136],[104.495605,51.452015],[104.496308,51.451913],[104.497067,51.451819],[104.498198,51.451695],[104.499423,51.451581],[104.50014,51.451534],[104.501072,51.451505],[104.501987,51.451487],[104.503173,51.451484],[104.504521,51.451509],[104.505114,51.451521],[104.509511,51.451829],[104.52175,51.45266],[104.52301,51.452661],[104.524555,51.452581],[104.526142,51.452474],[104.527399,51.452317],[104.528552,51.452164],[104.529145,51.452083],[104.544201,51.450168],[104.556208,51.448315],[104.569954,51.446193],[104.571125,51.446005],[104.576999,51.445117],[104.58336,51.444117],[104.583835,51.444045],[104.595901,51.442196],[104.601313,51.441356],[104.620223,51.438438],[104.621779,51.438225],[104.621912,51.438207],[104.622578,51.43815],[104.623358,51.438122],[104.624494,51.438107],[104.625568,51.438161],[104.626816,51.438285],[104.627386,51.438394],[104.62809,51.438528],[104.62918,51.438783],[104.630057,51.439016],[104.630802,51.439234],[104.631861,51.439544],[104.632835,51.439853],[104.634451,51.440319],[104.634917,51.440443],[104.635218,51.440522],[104.636661,51.44096],[104.63684,51.441014],[104.637241,51.441136],[104.63861,51.441453],[104.639266,51.441598],[104.639853,51.441703],[104.639905,51.441712],[104.640886,51.441883],[104.64279,51.442183],[104.643386,51.442253],[104.644191,51.442346],[104.644268,51.442355],[104.645562,51.442461],[104.646912,51.442535],[104.648382,51.442566],[104.649552,51.442559],[104.651169,51.442485],[104.651391,51.442475],[104.654644,51.442169],[104.660667,51.441668],[104.662889,51.441486],[104.6798,51.440007],[104.683233,51.439707],[104.683811,51.439652],[104.684193,51.439616],[104.689793,51.43914],[104.691277,51.439027],[104.694367,51.438793],[104.706477,51.437731],[104.715372,51.43695],[104.72137,51.436443],[104.721724,51.436419],[104.723204,51.436342],[104.724854,51.436377],[104.726609,51.436466],[104.728629,51.436738],[104.731762,51.437449],[104.732152,51.437537],[104.733197,51.437769],[104.764804,51.445038],[104.767218,51.44568],[104.768602,51.446088],[104.7739,51.448367],[104.774921,51.448807],[104.775746,51.44918],[104.780611,51.45138],[104.787542,51.454435],[104.798214,51.459138],[104.801797,51.460896],[104.804796,51.462874],[104.814752,51.470738],[104.818507,51.473608],[104.822348,51.476633],[104.831811,51.484187],[104.832948,51.484959],[104.834268,51.485635],[104.835749,51.486247],[104.837208,51.486724],[104.838667,51.487051],[104.839536,51.487187],[104.840105,51.487277],[104.843227,51.48755],[104.844707,51.487829],[104.84572,51.488023],[104.848554,51.48878],[104.850353,51.489246],[104.860123,51.491778],[104.861687,51.492173],[104.867302,51.493333],[104.871744,51.49461],[104.874115,51.495178],[104.877398,51.495661],[104.879576,51.495843],[104.882591,51.495747],[104.884286,51.495586],[104.886678,51.495248],[104.890444,51.494325],[104.89126,51.494181],[104.892472,51.494003],[104.895197,51.493816],[104.89701,51.493794],[104.897922,51.493864],[104.900787,51.494234],[104.902782,51.494642],[104.903737,51.494926],[104.904606,51.495291],[104.912478,51.499093],[104.913045,51.499367],[104.915357,51.500484],[104.921322,51.503617],[104.932686,51.509675],[104.939083,51.513066],[104.941402,51.514295],[104.94163,51.514423],[104.943648,51.515465],[104.945432,51.516538],[104.947879,51.518477],[104.948433,51.518832],[104.94897,51.519116],[104.949612,51.519381],[104.950312,51.519543],[104.951755,51.519787],[104.953059,51.519976],[104.954269,51.52015],[104.975041,51.52317],[104.976672,51.523497],[105.006977,51.530456],[105.026508,51.534921],[105.026808,51.534988],[105.028964,51.535476],[105.07265,51.545428],[105.078778,51.546767],[105.079681,51.54697],[105.082608,51.547701],[105.093169,51.550007],[105.094263,51.550241],[105.097001,51.550853],[105.097398,51.550938],[105.097617,51.550975],[105.097983,51.551025],[105.098766,51.551017],[105.099635,51.550872],[105.102253,51.550303],[105.103133,51.550169],[105.104023,51.550147],[105.106029,51.55036],[105.108476,51.55062],[105.116499,51.551502],[105.120272,51.551957],[105.121358,51.552088],[105.125628,51.552574],[105.128292,51.552844],[105.129164,51.553092],[105.129453,51.553255],[105.129507,51.553286],[105.129828,51.553507],[105.130171,51.55384],[105.130353,51.554203],[105.130516,51.554885],[105.130719,51.555517],[105.130852,51.555771],[105.130991,51.555929],[105.131166,51.556094],[105.131588,51.556323],[105.132183,51.556591],[105.132794,51.556864],[105.133612,51.557236],[105.134716,51.557745],[105.134842,51.557812],[105.136338,51.558595],[105.13656,51.558718],[105.138302,51.559685],[105.139793,51.56042],[105.140566,51.560744],[105.141428,51.561104],[105.14446,51.562373],[105.14652,51.563178],[105.148709,51.563913],[105.152625,51.565275],[105.153944,51.565699],[105.15462,51.565887],[105.155307,51.566015],[105.156026,51.566091],[105.158222,51.566276],[105.159008,51.566343],[105.162227,51.566648],[105.16301,51.566788],[105.164738,51.567212],[105.165845,51.567543],[105.167544,51.568094],[105.168707,51.568456],[105.16933,51.568719],[105.169941,51.569014],[105.17155,51.569953],[105.172312,51.570334],[105.172881,51.570543],[105.173482,51.570693],[105.174437,51.570843],[105.181003,51.571723],[105.18273,51.571975],[105.187794,51.572662],[105.189811,51.572957],[105.191807,51.57322],[105.193684,51.573424],[105.194628,51.573493],[105.195562,51.573542],[105.199445,51.573649],[105.207063,51.573794],[105.208737,51.573831],[105.21041,51.573901],[105.215249,51.574003],[105.217609,51.574084],[105.224744,51.574255],[105.229304,51.574379],[105.230795,51.574459],[105.232383,51.574604],[105.235591,51.574942],[105.245054,51.575999],[105.248427,51.576386],[105.254066,51.577034],[105.256574,51.577328],[105.258872,51.577597],[105.261716,51.577898],[105.264246,51.578194],[105.264559,51.57823],[105.265514,51.578321],[105.26649,51.578391],[105.267488,51.578434],[105.268475,51.578439],[105.269473,51.578429],[105.273646,51.578439],[105.276768,51.578466],[105.288516,51.578461],[105.289375,51.578493],[105.290254,51.578547],[105.29108,51.578622],[105.291873,51.578737],[105.291928,51.578745],[105.299878,51.580188],[105.300586,51.580328],[105.301305,51.580376],[105.302337,51.580341],[105.303474,51.580094],[105.304872,51.57974],[105.306125,51.579382],[105.307479,51.579052],[105.308113,51.579048],[105.308557,51.579144],[105.308916,51.579312],[105.309247,51.579552],[105.309373,51.57982],[105.30969,51.580893],[105.310059,51.581469],[105.310789,51.581969],[105.311649,51.582332],[105.312948,51.583024],[105.314037,51.583465],[105.314945,51.583509],[105.316098,51.583447],[105.317484,51.583426],[105.318364,51.583402],[105.319179,51.583493],[105.325329,51.584494],[105.326287,51.58465],[105.32699,51.584764],[105.328127,51.58496],[105.328674,51.585054],[105.335415,51.586218],[105.337314,51.586578],[105.338975,51.586986],[105.340618,51.587525],[105.341266,51.587747],[105.34216,51.588107],[105.342739,51.588372],[105.343233,51.588615],[105.34371,51.588858],[105.344246,51.589128],[105.344893,51.58943],[105.345464,51.589663],[105.345864,51.589795],[105.346332,51.589911],[105.346877,51.590012],[105.347754,51.590044],[105.348504,51.590017],[105.34904,51.589938],[105.349449,51.589853],[105.349866,51.589716],[105.350266,51.589557],[105.350667,51.589382],[105.350973,51.589202],[105.351288,51.588985],[105.35168,51.58862],[105.352404,51.587816],[105.352983,51.587287],[105.353511,51.586943],[105.353971,51.586695],[105.354413,51.586525],[105.354958,51.586356],[105.355682,51.586213],[105.356568,51.586107],[105.357377,51.586102],[105.358028,51.586148],[105.358758,51.586282],[105.359445,51.586465],[105.360174,51.586695],[105.361826,51.587318],[105.362706,51.587677],[105.363514,51.588012],[105.364236,51.58836],[105.364864,51.588698],[105.365637,51.58916],[105.366275,51.589596],[105.368372,51.591087],[105.369648,51.591903],[105.370377,51.592323],[105.371096,51.592618],[105.371815,51.59288],[105.372502,51.5931],[105.373177,51.593293],[105.374217,51.593557],[105.374744,51.59369],[105.377083,51.594238],[105.378478,51.594608],[105.380001,51.594983],[105.383778,51.595863],[105.384246,51.595952],[105.384312,51.595964],[105.385473,51.596185],[105.386473,51.596384],[105.39073,51.597231],[105.393101,51.597676],[105.398796,51.598805],[105.399324,51.59891],[105.400216,51.599093],[105.403122,51.599688],[105.408143,51.600771],[105.40987,51.601061],[105.412542,51.601565],[105.421742,51.603436],[105.421854,51.603459],[105.427251,51.60451],[105.430598,51.605138],[105.43136,51.605299],[105.432079,51.605481],[105.432186,51.605512],[105.43272,51.605644],[105.433385,51.605859],[105.434695,51.606273],[105.436812,51.606678],[105.438272,51.606827],[105.439958,51.6069],[105.441393,51.606927],[105.442006,51.606929],[105.442553,51.606916],[105.443579,51.606913],[105.445025,51.60695],[105.44629,51.607056],[105.447469,51.60722],[105.449066,51.607569],[105.451067,51.608275],[105.452875,51.609051],[105.454997,51.609693],[105.456813,51.61007],[105.458083,51.610237],[105.459412,51.610374],[105.461237,51.610414],[105.462008,51.610407],[105.462828,51.610433],[105.463589,51.610492],[105.465124,51.610647],[105.468697,51.611053],[105.468997,51.611087],[105.475477,51.611769],[105.478427,51.61209],[105.483953,51.612718],[105.486678,51.61297],[105.492439,51.613539],[105.49348,51.613694],[105.494885,51.613989],[105.495583,51.614161],[105.496248,51.614354],[105.496892,51.614569],[105.500915,51.61606],[105.50761,51.618555],[105.521064,51.623552],[105.522705,51.624258],[105.523488,51.624698],[105.524061,51.625055],[105.524501,51.625399],[105.525409,51.626209],[105.529637,51.63092],[105.530773,51.632409],[105.532308,51.634734],[105.533279,51.635906],[105.53403,51.636605],[105.534636,51.637028],[105.535172,51.637377],[105.535666,51.637624],[105.5361,51.63785],[105.536701,51.63811],[105.53728,51.63833],[105.537817,51.638513],[105.538412,51.638693],[105.539217,51.638886],[105.539952,51.639039],[105.54036,51.639099],[105.541829,51.639295],[105.543702,51.639485],[105.544496,51.639581],[105.545193,51.639681],[105.54588,51.639808],[105.546513,51.639938],[105.547859,51.640325],[105.552367,51.642213],[105.553104,51.64254],[105.555625,51.643345],[105.556699,51.643609],[105.558349,51.643936],[105.561302,51.644461],[105.562338,51.644622],[105.565948,51.645237],[105.567879,51.64556],[105.568802,51.645727],[105.56929,51.645817],[105.56995,51.64593],[105.57077,51.64608],[105.571686,51.646263],[105.57258,51.646448],[105.573806,51.646712],[105.580832,51.648329],[105.581836,51.648551],[105.582986,51.64881],[105.58388,51.649026],[105.586895,51.649866],[105.589245,51.650553],[105.591757,51.651293],[105.592242,51.651457],[105.594422,51.652202],[105.595035,51.65244],[105.595649,51.652746],[105.596773,51.653438],[105.597667,51.654114],[105.599268,51.655213],[105.600775,51.656101],[105.601805,51.656566],[105.60264,51.656861],[105.604351,51.6573],[105.61139,51.658686],[105.619994,51.660402],[105.622644,51.660955],[105.627987,51.662006],[105.633985,51.663213],[105.634693,51.663321],[105.635433,51.663374],[105.637021,51.663437],[105.640749,51.663705],[105.644607,51.663956],[105.64466,51.663959],[105.647219,51.664114],[105.649166,51.664184],[105.650228,51.664324],[105.661687,51.667219],[105.664535,51.667865],[105.664916,51.667918],[105.665297,51.667924],[105.665662,51.667862],[105.666123,51.66769],[105.666895,51.667358],[105.668081,51.666909],[105.668446,51.666781],[105.668768,51.666731],[105.669224,51.666757],[105.670479,51.666925],[105.671021,51.667006],[105.671938,51.667145],[105.672415,51.667292],[105.672743,51.667423],[105.673054,51.667625],[105.673397,51.668001],[105.673789,51.668516],[105.674003,51.668704],[105.674341,51.668858],[105.674765,51.668968],[105.675527,51.669105],[105.677951,51.669455],[105.678917,51.669597],[105.681851,51.670021],[105.682565,51.670155],[105.683241,51.670349],[105.683815,51.67057],[105.68529,51.671161],[105.687575,51.672109],[105.688804,51.672588],[105.689544,51.672868],[105.69052,51.673184],[105.691969,51.673584],[105.694056,51.674139],[105.697875,51.675033],[105.701662,51.675975],[105.70409,51.676549],[105.705272,51.676828],[105.707472,51.677375],[105.709543,51.677876],[105.712316,51.678579],[105.714993,51.679221],[105.715851,51.679416],[105.716763,51.679574],[105.717509,51.679646],[105.718206,51.679656],[105.718957,51.679568],[105.719778,51.679438],[105.721596,51.679145],[105.723494,51.678821],[105.724965,51.67857],[105.727369,51.678169],[105.727916,51.678057],[105.728549,51.677873],[105.729176,51.677648],[105.73159,51.676656],[105.732154,51.676477],[105.732561,51.676376],[105.733082,51.676304],[105.733591,51.676278],[105.733892,51.676297],[105.734776,51.676329],[105.735366,51.676356],[105.735952,51.676383],[105.736128,51.676389],[105.736928,51.676413],[105.737561,51.67646],[105.738151,51.67659],[105.739058,51.676881],[105.741177,51.677563],[105.750281,51.680419],[105.751004,51.680637],[105.752577,51.681115],[105.753125,51.681287],[105.754724,51.681789],[105.75521,51.681957],[105.755721,51.682113],[105.759562,51.68329],[105.760126,51.683463],[105.763351,51.684448],[105.766537,51.685427],[105.767516,51.685722],[105.768809,51.686113],[105.769503,51.686329],[105.770424,51.686613],[105.771708,51.687021],[105.77181,51.687054],[105.772668,51.687325],[105.77332,51.687506],[105.774747,51.687868],[105.775198,51.687972],[105.775996,51.688161],[105.777456,51.688516],[105.778616,51.688823],[105.779248,51.689014],[105.780087,51.689298],[105.784543,51.690904],[105.785025,51.691041],[105.785658,51.691197],[105.787509,51.691577],[105.789387,51.69197],[105.790009,51.692043],[105.791098,51.692098],[105.793539,51.692146],[105.795786,51.692203],[105.80011,51.69231],[105.800909,51.692365],[105.80166,51.692478],[105.802245,51.692595],[105.802937,51.69281],[105.804348,51.693333],[105.807057,51.694392],[105.8103,51.69566],[105.810626,51.695787],[105.813923,51.69709],[105.818773,51.698972],[105.821198,51.699916],[105.82131,51.69996],[105.823628,51.700877],[105.824416,51.701203],[105.825167,51.701485],[105.826283,51.701954],[105.827098,51.702267],[105.827769,51.702552],[105.830247,51.703495],[105.83066,51.703656],[105.830977,51.703696],[105.831621,51.703709],[105.832769,51.703692],[105.83316,51.703711],[105.833573,51.703802],[105.834169,51.703968],[105.835268,51.704326],[105.8372,51.704981],[105.838026,51.705324],[105.838857,51.705698],[105.839571,51.706101],[105.840767,51.706887],[105.841964,51.707713],[105.84208,51.707781],[105.842663,51.708174],[105.842849,51.70829],[105.844749,51.70962],[105.845828,51.710349],[105.845932,51.710422],[105.846241,51.710631],[105.847846,51.711755],[105.848134,51.711952],[105.848313,51.71207],[105.848487,51.712189],[105.849254,51.712734],[105.849865,51.713157],[105.850849,51.713811],[105.851239,51.714099],[105.851358,51.714188],[105.852027,51.714655],[105.852981,51.715299],[105.853275,51.715467],[105.853493,51.715547],[105.85367,51.715588],[105.85392,51.715598],[105.854345,51.71555],[105.855874,51.715341],[105.858039,51.715064],[105.860218,51.714781],[105.862486,51.714487],[105.863426,51.714369],[105.864706,51.714208],[105.866949,51.713908],[105.869111,51.713647],[105.87128,51.713359],[105.871859,51.713285],[105.873473,51.71308],[105.87565,51.712823],[105.877766,51.712564],[105.879257,51.712379],[105.879766,51.712352],[105.879996,51.71235],[105.880496,51.712386],[105.881161,51.712458],[105.882432,51.712629],[105.885533,51.713063],[105.886202,51.713153],[105.888466,51.713479],[105.890018,51.713713],[105.890576,51.713805],[105.891117,51.713928],[105.891874,51.714142],[105.893526,51.714621],[105.895913,51.715364],[105.899845,51.716546],[105.901165,51.717013],[105.902034,51.717328],[105.902908,51.717729],[105.903568,51.718082],[105.90426,51.718538],[105.904695,51.71871],[105.905178,51.718907],[105.905768,51.719122],[105.906401,51.719275],[105.906964,51.719417],[105.908005,51.719805],[105.910413,51.72058],[105.910907,51.720811],[105.911341,51.721087],[105.91191,51.721542],[105.912586,51.722197],[105.913144,51.722611],[105.913675,51.722944],[105.914249,51.72321],[105.914533,51.723322],[105.915209,51.723529],[105.91566,51.723625],[105.916443,51.723718],[105.919012,51.724034],[105.919989,51.7242],[105.920707,51.72438],[105.921292,51.724623],[105.921898,51.724961],[105.922317,51.725294],[105.922714,51.725672],[105.922993,51.725968],[105.923336,51.726221],[105.923669,51.726383],[105.924135,51.726553],[105.924624,51.726692],[105.925187,51.726803],[105.925986,51.726925],[105.926343,51.726962],[105.926807,51.726985],[105.927558,51.727001],[105.928416,51.726966],[105.930353,51.726849],[105.931587,51.726779],[105.932354,51.726793],[105.933185,51.72687],[105.934112,51.726971],[105.934119,51.726972],[105.934955,51.727096],[105.936329,51.727318],[105.937149,51.727477],[105.937584,51.727616],[105.938017,51.727803],[105.939032,51.728231],[105.940234,51.728826],[105.940419,51.728916],[105.940906,51.729166],[105.942219,51.729869],[105.943708,51.73063],[105.944134,51.730848],[105.945051,51.731331],[105.946022,51.731969],[105.946752,51.732461],[105.947401,51.732975],[105.948581,51.733956],[105.949933,51.735042],[105.950459,51.735497],[105.950893,51.735836],[105.951843,51.736567],[105.952551,51.737168],[105.953844,51.738145],[105.955211,51.739226],[105.956697,51.740433],[105.957631,51.741214],[105.958752,51.742114],[105.959369,51.742601],[105.960088,51.743174],[105.960581,51.743653],[105.961214,51.744233],[105.961719,51.744752],[105.962276,51.745482],[105.96366,51.747356],[105.965409,51.749753],[105.966225,51.750856],[105.967147,51.752094],[105.968381,51.753848],[105.969486,51.755399],[105.969821,51.755828],[105.972308,51.759311],[105.972909,51.760104],[105.973418,51.760775],[105.974856,51.762774],[105.975628,51.763809],[105.976755,51.765316],[105.977393,51.7662],[105.977876,51.766848],[105.978068,51.767107],[105.978922,51.768259],[105.980489,51.77027],[105.981604,51.771651],[105.982066,51.772262],[105.982447,51.772783],[105.983401,51.773988],[105.984094,51.774747],[105.984941,51.775534],[105.986317,51.776633],[105.988144,51.778231],[105.990016,51.779779],[105.991936,51.781369],[105.995504,51.784354],[105.997491,51.786044],[105.997505,51.786055],[105.999779,51.787924],[106.002209,51.789964],[106.003277,51.79085],[106.004253,51.791705],[106.00634,51.793431],[106.008679,51.795393],[106.010647,51.797024],[106.012402,51.798541],[106.013491,51.799406],[106.015293,51.800899],[106.016827,51.802169],[106.020169,51.804925],[106.024139,51.808233],[106.024686,51.808694],[106.025448,51.809335],[106.028409,51.811819],[106.030061,51.813161],[106.031976,51.814777],[106.033403,51.815991],[106.034406,51.816899],[106.035908,51.818335],[106.037013,51.819463],[106.037748,51.820199],[106.038419,51.820892],[106.039283,51.821678],[106.040071,51.822331],[106.042689,51.824357],[106.043215,51.824791],[106.045382,51.826453],[106.048627,51.828949],[106.049883,51.82992],[106.051766,51.831391],[106.053477,51.832715],[106.054515,51.833521],[106.055295,51.834127],[106.056164,51.834803],[106.058557,51.836669],[106.061872,51.839247],[106.064627,51.841364],[106.067816,51.843844],[106.073974,51.848595],[106.07722,51.851129],[106.079403,51.852815],[106.081592,51.854515],[106.083072,51.855682],[106.084505,51.856774],[106.08606,51.857964],[106.086382,51.858206],[106.087122,51.858637],[106.088356,51.859146],[106.088786,51.859277],[106.089612,51.859548],[106.091366,51.860184],[106.096741,51.862153],[106.099375,51.863119],[106.102105,51.864122],[106.106585,51.86573],[106.111793,51.86763],[106.116954,51.869486],[106.123145,51.871718],[106.126444,51.872911],[106.128868,51.873776],[106.12968,51.874045],[106.130377,51.874298],[106.131481,51.8747],[106.140407,51.877924],[106.144237,51.879303],[106.148154,51.880689],[106.148985,51.881008],[106.150435,51.881515],[106.152745,51.882359],[106.155913,51.883502],[106.157081,51.883927],[106.158249,51.884352],[106.159751,51.884892],[106.160701,51.885286],[106.162044,51.885877],[106.163707,51.886655],[106.164495,51.8871],[106.165143,51.887531],[106.166739,51.888627],[106.16928,51.890425],[106.172369,51.892557],[106.172422,51.892593],[106.173611,51.893434],[106.174034,51.89372],[106.177776,51.89636],[106.179658,51.897629],[106.182089,51.89936],[106.184467,51.901033],[106.190479,51.905245],[106.194577,51.90811],[106.199384,51.911462],[106.201567,51.912975],[106.20227,51.91346],[106.203648,51.914411],[106.205022,51.915377],[106.20615,51.916159],[106.211645,51.92005],[106.212731,51.92079],[106.214704,51.922215],[106.215799,51.922991],[106.22028,51.926168],[106.221512,51.927056],[106.221969,51.927353],[106.223193,51.928234],[106.223386,51.928384],[106.22366,51.92857],[106.224166,51.928934],[106.22443,51.929125],[106.225637,51.930007],[106.227387,51.931254],[106.228647,51.93216],[106.230438,51.933431],[106.23164,51.934284],[106.233123,51.93534],[106.234354,51.936239],[106.235053,51.936675],[106.235572,51.936966],[106.23613,51.937204],[106.237096,51.937567],[106.240497,51.938765],[106.243672,51.939894],[106.245902,51.940699],[106.248012,51.941447],[106.249849,51.942087],[106.252688,51.943106],[106.252727,51.94312],[106.258274,51.945082],[106.260675,51.945941],[106.261665,51.946295],[106.265012,51.947447],[106.269271,51.948917],[106.27014,51.949185],[106.271846,51.949663],[106.272324,51.949763],[106.272533,51.949807],[106.274172,51.950102],[106.275289,51.950329],[106.277752,51.950761],[106.279195,51.951013],[106.28147,51.951453],[106.28714,51.952402],[106.290752,51.953058],[106.292649,51.953391],[106.293696,51.953643],[106.294774,51.953982],[106.295358,51.954216],[106.296163,51.954597],[106.297145,51.955073],[106.297955,51.955532],[106.298459,51.955827],[106.29957,51.95666],[106.30085,51.957585],[106.301651,51.958085],[106.302552,51.958698],[106.304013,51.959749],[106.304271,51.959925],[106.304789,51.960276],[106.305135,51.960528],[106.30554,51.960808],[106.306677,51.961514],[106.307466,51.961887],[106.308306,51.962226],[106.309172,51.962556],[106.309859,51.962776],[106.310899,51.963087],[106.311763,51.963271],[106.312691,51.963403],[106.314295,51.963583],[106.315309,51.963657],[106.31628,51.963664],[106.317481,51.963626],[106.318576,51.963565],[106.319638,51.963416],[106.32078,51.963213],[106.32166,51.963041],[106.323296,51.962642],[106.324356,51.96239],[106.326762,51.96186],[106.328774,51.961418],[106.33168,51.960766],[106.334846,51.960075],[106.336219,51.959739],[106.339084,51.959113],[106.340646,51.958752],[106.341494,51.958597],[106.342572,51.958449],[106.343509,51.958369],[106.34445,51.958315],[106.345347,51.9583],[106.346327,51.958311],[106.347581,51.958377],[106.348453,51.958432],[106.348521,51.958436],[106.349233,51.95854],[106.350059,51.958675],[106.35171,51.959003],[106.353109,51.959292],[106.35398,51.959519],[106.354454,51.959677],[106.354625,51.959756],[106.355017,51.959991],[106.35531,51.96021],[106.355479,51.960369],[106.355954,51.960809],[106.357393,51.962265],[106.357463,51.962321],[106.358669,51.963552],[106.359469,51.964375],[106.359855,51.964745],[106.360381,51.965185],[106.361038,51.965702],[106.36155,51.966071],[106.362,51.966364],[106.362247,51.966501],[106.364382,51.967786],[106.366056,51.968748],[106.366839,51.969217],[106.368137,51.96995],[106.369125,51.970515],[106.369645,51.970761],[106.37011,51.970905],[106.370837,51.971099],[106.372392,51.971389],[106.374561,51.971692],[106.377928,51.972119],[106.379843,51.972294],[106.381477,51.972501],[106.382075,51.972588],[106.385011,51.973014],[106.387321,51.973338],[106.389327,51.973548],[106.395705,51.974211],[106.399353,51.974578],[106.400146,51.974655],[106.402937,51.974937],[106.403172,51.974961],[106.405336,51.975198],[106.407252,51.975395],[106.408053,51.975442],[106.408778,51.975476],[106.409359,51.975479],[106.409867,51.97543],[106.410395,51.97536],[106.411098,51.975177],[106.411754,51.974939],[106.413842,51.974056],[106.41561,51.973299],[106.416256,51.973054],[106.416844,51.972873],[106.417399,51.97274],[106.418006,51.972624],[106.418815,51.972502],[106.419497,51.972432],[106.420248,51.972432],[106.421395,51.972467],[106.423584,51.972558],[106.425728,51.972627],[106.426268,51.972645],[106.427092,51.972694],[106.427934,51.97281],[106.429383,51.97305],[106.431314,51.973399],[106.432006,51.973573],[106.435203,51.974376],[106.438503,51.975199],[106.439952,51.975557],[106.441865,51.976029],[106.445321,51.976911],[106.447674,51.977534],[106.451034,51.978424],[106.453768,51.979098],[106.454846,51.979358],[106.455654,51.979471],[106.456482,51.979544],[106.457727,51.979583],[106.458935,51.979555],[106.461377,51.97944],[106.463151,51.979363],[106.46522,51.979288],[106.46606,51.979313],[106.466952,51.979408],[106.467705,51.979552],[106.468845,51.979792],[106.469883,51.97999],[106.470963,51.980144],[106.472032,51.980227],[106.474006,51.980279],[106.474929,51.980268],[106.476678,51.98022],[106.477536,51.98023],[106.478533,51.980284],[106.479284,51.980361],[106.480119,51.980544],[106.480473,51.980621],[106.480755,51.980679],[106.481177,51.980781],[106.482658,51.981139],[106.483279,51.981289],[106.48554,51.981864],[106.486319,51.982041],[106.487573,51.98235],[106.489799,51.982907],[106.494112,51.983958],[106.502656,51.986049],[106.502964,51.986128],[106.506649,51.987008],[106.507793,51.987241],[106.508655,51.98737],[106.510402,51.987533],[106.513752,51.987842],[106.516477,51.988107],[106.51911,51.988347],[106.520677,51.9885],[106.522556,51.988681],[106.522672,51.988692],[106.526808,51.989063],[106.532455,51.989581],[106.535,51.989827],[106.536631,51.990032],[106.537693,51.990197],[106.538696,51.990375],[106.539731,51.990598],[106.54096,51.990896],[106.542124,51.991192],[106.543039,51.991451],[106.544559,51.991898],[106.546816,51.992581],[106.548283,51.993016],[106.549068,51.993248],[106.549303,51.993327],[106.55074,51.993754],[106.551191,51.993887],[106.551595,51.994007],[106.552026,51.994129],[106.553497,51.994567],[106.554711,51.994929],[106.556222,51.995377],[106.558707,51.996134],[106.560415,51.996651],[106.561187,51.996878],[106.56245,51.997253],[106.562965,51.997378],[106.563453,51.99749],[106.56403,51.997605],[106.565384,51.997815],[106.568744,51.998292],[106.571618,51.9987],[106.573089,51.998905],[106.575545,51.999247],[106.576452,51.999374],[106.578656,51.999685],[106.580912,52.000001],[106.582272,52.000182],[106.584217,52.000468],[106.587788,52.000982],[106.591667,52.001542],[106.594639,52.001985],[106.598022,52.002462],[106.600166,52.002763],[106.601399,52.002958],[106.60216,52.00313],[106.602685,52.003266],[106.602864,52.003327],[106.603212,52.003443],[106.603638,52.003613],[106.604088,52.003828],[106.604464,52.004029],[106.604884,52.004316],[106.605723,52.004933],[106.607174,52.006086],[106.607731,52.006499],[106.608194,52.006803],[106.608732,52.007126],[106.609235,52.007338],[106.609531,52.007456],[106.610103,52.007657],[106.610668,52.007817],[106.611568,52.008034],[106.612291,52.008161],[106.614832,52.0087],[106.615813,52.008896],[106.61678,52.009071],[106.617015,52.009104],[106.617413,52.009152],[106.617855,52.009196],[106.618739,52.009234],[106.619701,52.009199],[106.620737,52.009087],[106.621192,52.008989],[106.62184,52.00885],[106.62279,52.00861],[106.625498,52.007642],[106.626436,52.007384],[106.627375,52.007214],[106.627996,52.00712],[106.629057,52.007046],[106.629955,52.007028],[106.630997,52.007099],[106.632747,52.007342],[106.63318,52.007409],[106.635651,52.007793],[106.63866,52.00826],[106.643335,52.008938],[106.648375,52.009715],[106.650501,52.010016],[106.650663,52.010042],[106.653091,52.010302],[106.660142,52.011046],[106.662954,52.011384],[106.664691,52.011612],[106.667133,52.011973],[106.66913,52.012263],[106.672997,52.012821],[106.676589,52.013354],[106.680805,52.013965],[106.68548,52.014636],[106.686056,52.014723],[106.691751,52.015532],[106.696165,52.016193],[106.69718,52.016345],[106.699448,52.016639],[106.703576,52.017245],[106.705745,52.017582],[106.711839,52.018504],[106.713699,52.018759],[106.717297,52.019224],[106.725358,52.020227],[106.72624,52.020337],[106.728555,52.020623],[106.729079,52.020678],[106.729661,52.020734],[106.73037,52.020751],[106.731202,52.020714],[106.73456,52.020517],[106.737201,52.020374],[106.739383,52.020235],[106.741158,52.020132],[106.745038,52.019858],[106.749572,52.019516],[106.749752,52.019504],[106.750978,52.019419],[106.752277,52.01936],[106.753444,52.019321],[106.755211,52.019248],[106.757241,52.019195],[106.761253,52.01909],[106.7653,52.018985],[106.767522,52.018929],[106.771689,52.018826],[106.77381,52.018787],[106.774262,52.018779],[106.776427,52.018711],[106.779368,52.018631],[106.784703,52.018477],[106.78565,52.018448],[106.789865,52.018321],[106.795344,52.018153],[106.798281,52.018052],[106.804807,52.017905],[106.815301,52.017506],[106.822321,52.017229],[106.823153,52.017197],[106.829211,52.016963],[106.830406,52.016948],[106.831204,52.016956],[106.832156,52.017028],[106.833156,52.017139],[106.834315,52.017297],[106.83514,52.017469],[106.836494,52.017863],[106.837941,52.01835],[106.838528,52.018529],[106.838686,52.01861],[106.839679,52.018956],[106.841703,52.019778],[106.843403,52.020525],[106.84578,52.021676],[106.846903,52.0222],[106.848215,52.022749],[106.85016,52.023537],[106.850481,52.023677],[106.852705,52.024663],[106.854937,52.025676],[106.856694,52.026449],[106.86169,52.028742],[106.862852,52.029302],[106.8634,52.029649],[106.863871,52.02999],[106.864217,52.030287],[106.864629,52.030691],[106.865762,52.031664],[106.867212,52.033035],[106.867436,52.033217],[106.867939,52.033463],[106.8682,52.033545],[106.869062,52.033969],[106.869549,52.034255],[106.869878,52.034504],[106.8702,52.034814],[106.870674,52.035371],[106.871855,52.03679],[106.872428,52.037424],[106.872997,52.037966],[106.873436,52.038304],[106.873691,52.038457],[106.873934,52.038603],[106.873935,52.038604],[106.875345,52.039328],[106.877612,52.040481],[106.878289,52.04084],[106.879025,52.041201],[106.879595,52.041446],[106.880078,52.041621],[106.880571,52.041757],[106.881119,52.041859],[106.882161,52.042004],[106.883199,52.042137],[106.883588,52.042192],[106.884235,52.042283],[106.884371,52.042304],[106.884791,52.042375],[106.88514,52.04243],[106.885639,52.042522],[106.885926,52.042582],[106.886298,52.042658],[106.886583,52.042717],[106.887191,52.042879],[106.887836,52.043072],[106.888518,52.043315],[106.890036,52.043857],[106.89027,52.043947],[106.890965,52.044161],[106.89151,52.04435],[106.892291,52.044662],[106.892776,52.044879],[106.894087,52.045369],[106.894598,52.045571],[106.896232,52.046163],[106.897766,52.046699],[106.902981,52.048617],[106.908945,52.050847],[106.90907,52.050899],[106.910235,52.051307],[106.914112,52.05282],[106.917014,52.053922],[106.919285,52.054771],[106.919907,52.055004],[106.924224,52.056589],[106.927158,52.057603],[106.932067,52.059302],[106.937265,52.061146],[106.942908,52.063165],[106.944619,52.063755],[106.945419,52.064029],[106.947453,52.064707],[106.949383,52.065378],[106.951861,52.066237],[106.958224,52.068378],[106.960149,52.069052],[106.961458,52.06952],[106.962951,52.070074],[106.964307,52.070593],[106.966125,52.071247],[106.968727,52.072179],[106.971715,52.073235],[106.975567,52.074612],[106.979349,52.075958],[106.98079,52.076484],[106.981425,52.07669],[106.983742,52.077531],[106.984606,52.077792],[106.985518,52.07804],[106.9885,52.078748],[106.989927,52.07908],[106.992298,52.079621],[106.994442,52.08012],[106.994715,52.080182],[106.995088,52.080273],[106.995834,52.080439],[107.000731,52.081563],[107.003194,52.082139],[107.004009,52.082316],[107.005039,52.082519],[107.005565,52.082565],[107.006101,52.08258],[107.007635,52.08254],[107.010425,52.082437],[107.012522,52.082355],[107.013504,52.082363],[107.014089,52.082396],[107.014663,52.082456],[107.015392,52.082573],[107.016342,52.082813],[107.018917,52.083483],[107.019544,52.0837],[107.020015,52.083901],[107.020776,52.08423],[107.022902,52.085095],[107.025557,52.086114],[107.025888,52.086232],[107.027491,52.086865],[107.028564,52.087324],[107.029518,52.087726],[107.030981,52.088322],[107.032086,52.088772],[107.033519,52.089314],[107.034184,52.089559],[107.03508,52.089889],[107.036635,52.090471],[107.037392,52.090811],[107.037896,52.091101],[107.038186,52.091305],[107.03854,52.091637],[107.038943,52.092105],[107.039193,52.092435],[107.039618,52.093035],[107.039827,52.093423],[107.040262,52.094392],[107.040637,52.095259],[107.041431,52.09701],[107.041758,52.097645],[107.042005,52.098083],[107.04215,52.098311],[107.042311,52.098512],[107.042633,52.098808],[107.04318,52.099259],[107.043947,52.099835],[107.045342,52.100888],[107.046382,52.101652],[107.047064,52.102127],[107.047664,52.102481],[107.04826,52.102779],[107.048759,52.102959],[107.049226,52.103078],[107.04995,52.103217],[107.050846,52.103349],[107.052632,52.103555],[107.055534,52.103863],[107.056398,52.103968],[107.056972,52.104088],[107.057578,52.10427],[107.059037,52.104785],[107.060893,52.105456],[107.061585,52.105714],[107.062138,52.105873],[107.062787,52.106008],[107.063371,52.106096],[107.064868,52.106234],[107.065732,52.106319],[107.066633,52.106417],[107.067395,52.106546],[107.067937,52.106694],[107.069181,52.10717],[107.072332,52.108427],[107.072474,52.108488],[107.074341,52.109229],[107.074545,52.109305],[107.07615,52.109956],[107.078896,52.111048],[107.081847,52.112224],[107.085175,52.113541],[107.085353,52.11361],[107.086567,52.114086],[107.08764,52.114461],[107.088034,52.114578],[107.089442,52.11501],[107.089848,52.11512],[107.09016,52.115214],[107.09147,52.115601],[107.092133,52.115835],[107.092785,52.116125],[107.093728,52.116633],[107.095134,52.117423],[107.096165,52.11803],[107.096657,52.118325],[107.097136,52.118641],[107.098144,52.119432],[107.099075,52.120122],[107.099324,52.120319],[107.100497,52.121198],[107.101159,52.121607],[107.101905,52.121981],[107.102893,52.122392],[107.103905,52.122788],[107.105954,52.123529],[107.107664,52.124132],[107.107961,52.124232],[107.10927,52.124666],[107.109698,52.124803],[107.110107,52.124907],[107.11169,52.1253],[107.113765,52.125809],[107.116871,52.126562],[107.118802,52.127035],[107.120057,52.127325],[107.120787,52.127477],[107.121495,52.127593],[107.122219,52.127653],[107.122627,52.127675],[107.123313,52.127708],[107.123657,52.127705],[107.124145,52.127702],[107.125577,52.127627],[107.12842,52.127402],[107.128927,52.127363],[107.131006,52.127202],[107.131445,52.127164],[107.132632,52.127061],[107.133154,52.127006],[107.133973,52.126928],[107.134767,52.126795],[107.135346,52.126635],[107.135845,52.126477],[107.136183,52.126357],[107.137046,52.126],[107.13886,52.125312],[107.139119,52.125222],[107.139981,52.124907],[107.140835,52.124634],[107.143355,52.123807],[107.147566,52.122438],[107.151836,52.121086],[107.154888,52.120081],[107.155677,52.119827],[107.156271,52.119572],[107.157361,52.119061],[107.158998,52.118342],[107.160811,52.117522],[107.16183,52.117064],[107.162624,52.11672],[107.162976,52.1166],[107.16352,52.116429],[107.164009,52.116322],[107.164544,52.116257],[107.165139,52.116203],[107.166,52.11618],[107.168125,52.116227],[107.177081,52.116516],[107.179935,52.116603],[107.183241,52.116664],[107.184827,52.116661],[107.188373,52.116647],[107.190514,52.116665],[107.194493,52.116677],[107.196863,52.116689],[107.200145,52.116679],[107.203193,52.116653],[107.203848,52.116631],[107.20472,52.116555],[107.205848,52.11641],[107.206839,52.116258],[107.207825,52.116122],[107.20835,52.116077],[107.209023,52.116028],[107.210318,52.115997],[107.210976,52.115999],[107.211925,52.116022],[107.212379,52.116038],[107.212763,52.116043],[107.213575,52.116069],[107.214902,52.116093],[107.216981,52.116138],[107.221152,52.116252],[107.224139,52.116342],[107.225089,52.116392],[107.22618,52.116462],[107.227235,52.116534],[107.22726,52.116536],[107.23112,52.116808],[107.232301,52.116891],[107.233676,52.116994],[107.236366,52.11718],[107.238198,52.117333],[107.239719,52.11746],[107.240602,52.117504],[107.242239,52.117623],[107.24347,52.117626],[107.245016,52.117545],[107.248113,52.117415],[107.248954,52.117349],[107.24937,52.117287],[107.249924,52.117213],[107.250974,52.117005],[107.251631,52.116874],[107.252048,52.11683],[107.252256,52.116819],[107.252556,52.116821],[107.252753,52.116831],[107.253256,52.116857],[107.253468,52.116871],[107.253809,52.116893],[107.257897,52.117164],[107.261973,52.117478],[107.262906,52.117561],[107.263338,52.117626],[107.263762,52.117725],[107.264151,52.117858],[107.264518,52.118014],[107.265312,52.118356],[107.26566,52.118519],[107.267693,52.119364],[107.2686,52.119731],[107.270162,52.120307],[107.270933,52.120593],[107.271459,52.120769],[107.271833,52.120848],[107.273167,52.121059],[107.273899,52.12122],[107.274358,52.121334],[107.27645,52.121844],[107.277502,52.122065],[107.278812,52.122301],[107.279949,52.122439],[107.280373,52.122501],[107.280572,52.122527],[107.281218,52.122567],[107.284268,52.122406],[107.284361,52.122394],[107.288253,52.122195],[107.289959,52.122077],[107.292544,52.1219],[107.293887,52.121822],[107.294846,52.121777],[107.295742,52.121746],[107.295783,52.121745],[107.296926,52.12173],[107.298014,52.121743],[107.299186,52.12179],[107.300953,52.121866],[107.301476,52.121908],[107.301647,52.121924],[107.302702,52.122066],[107.303756,52.122216],[107.305165,52.122438],[107.306003,52.122611],[107.306147,52.122642],[107.308725,52.123218],[107.311069,52.123733],[107.313255,52.124188],[107.313872,52.1243],[107.314739,52.124404],[107.316249,52.124492],[107.319191,52.124682],[107.321074,52.124828],[107.323821,52.125123],[107.326651,52.125447],[107.327653,52.125563],[107.330951,52.125943],[107.33369,52.126263],[107.336368,52.126559],[107.337559,52.126687],[107.338627,52.126784],[107.339988,52.126874],[107.341325,52.126966],[107.342182,52.127057],[107.343244,52.127241],[107.344337,52.12747],[107.347621,52.128224],[107.34836,52.128388],[107.349124,52.128554],[107.349864,52.128711],[107.350395,52.128807],[107.351076,52.128871],[107.352095,52.128973],[107.352978,52.129112],[107.35382,52.129279],[107.354454,52.129443],[107.354895,52.129612],[107.35553,52.129872],[107.355985,52.130016],[107.356441,52.1301],[107.357005,52.130188],[107.357578,52.130244],[107.358227,52.130368],[107.358746,52.130499],[107.36122,52.131168],[107.361982,52.131388],[107.362421,52.131527],[107.362923,52.131742],[107.363559,52.132036],[107.36453,52.132529],[107.365984,52.133257],[107.366998,52.133733],[107.367888,52.134179],[107.368785,52.134539],[107.37103,52.135449],[107.372721,52.136112],[107.378081,52.138248],[107.379358,52.138743],[107.380152,52.139048],[107.380921,52.139282],[107.381806,52.139534],[107.383478,52.139985],[107.384341,52.140191],[107.385271,52.140338],[107.386162,52.140435],[107.388958,52.140715],[107.391943,52.141024],[107.393979,52.141254],[107.394971,52.141357],[107.395788,52.141414],[107.39651,52.141445],[107.396593,52.141449],[107.402537,52.141627],[107.405224,52.1417],[107.40774,52.141762],[107.410836,52.141858],[107.412663,52.141884],[107.41388,52.141866],[107.41521,52.141811],[107.417196,52.141722],[107.41929,52.141634],[107.420536,52.141588],[107.422398,52.141526],[107.423984,52.141473],[107.424656,52.141443],[107.427071,52.14138],[107.428007,52.141351],[107.42881,52.141298],[107.429626,52.141225],[107.429694,52.141216],[107.431306,52.140989],[107.432943,52.140768],[107.435014,52.140466],[107.436476,52.140257],[107.437805,52.140058],[107.439295,52.139833],[107.440713,52.139606],[107.441248,52.139509],[107.441747,52.139373],[107.442378,52.139152],[107.442652,52.139021],[107.442756,52.138985],[107.442852,52.138934],[107.443202,52.138732],[107.444163,52.138146],[107.447126,52.136301],[107.447345,52.136169],[107.44743,52.136116],[107.44868,52.135343],[107.449168,52.135055],[107.450539,52.134208],[107.452031,52.133289],[107.454305,52.131889],[107.458123,52.129536],[107.459287,52.128782],[107.459641,52.128555],[107.459899,52.128363],[107.460172,52.128113],[107.460574,52.127676],[107.461427,52.126692],[107.462822,52.1251],[107.464271,52.123464],[107.465832,52.121659],[107.466894,52.120483],[107.467436,52.119856],[107.467682,52.119541],[107.467897,52.119234],[107.46817,52.118778],[107.46927,52.116985],[107.469587,52.116451],[107.470204,52.115486],[107.471073,52.114015],[107.472532,52.111641],[107.473653,52.109833],[107.474264,52.108835],[107.47479,52.107943],[107.474914,52.107606],[107.475042,52.107233],[107.475092,52.106999],[107.475101,52.106762],[107.475044,52.106455],[107.474989,52.106252],[107.474779,52.105908],[107.474482,52.105544],[107.473904,52.104952],[107.473418,52.104477],[107.47258,52.103632],[107.472231,52.103296],[107.471879,52.102853],[107.471617,52.102472],[107.471468,52.10224],[107.471378,52.102017],[107.471332,52.101782],[107.471325,52.101493],[107.471371,52.101143],[107.471471,52.100821],[107.471793,52.100132],[107.472172,52.099305],[107.472534,52.098687],[107.473229,52.097467],[107.473433,52.097032],[107.474403,52.095507],[107.474699,52.094985],[107.47492,52.094489],[107.475644,52.093287],[107.477145,52.090704],[107.477376,52.09028],[107.478025,52.089089],[107.478347,52.088579],[107.47854,52.088298],[107.478894,52.087972],[107.479366,52.087599],[107.480893,52.086343],[107.481025,52.086239],[107.481742,52.085638],[107.482414,52.085114],[107.482956,52.084682],[107.483704,52.084126],[107.484112,52.083807],[107.48442,52.083517],[107.484794,52.083159],[107.485154,52.082767],[107.485485,52.082376],[107.485812,52.081908],[107.485964,52.081603],[107.48606,52.081312],[107.486114,52.081022],[107.486146,52.080854],[107.486104,52.080594],[107.486026,52.080433],[107.485874,52.080246],[107.485573,52.08005],[107.485182,52.079883],[107.484635,52.079694],[107.483814,52.079465],[107.482995,52.079269],[107.482493,52.079191],[107.481885,52.079141],[107.480723,52.079091],[107.478251,52.078971],[107.4768,52.078968],[107.476064,52.078966],[107.475531,52.078921],[107.47472,52.078817],[107.473775,52.078676],[107.473205,52.078608],[107.472634,52.078603],[107.471892,52.07859],[107.47081,52.07855],[107.468275,52.078344],[107.465938,52.078151],[107.465337,52.078087],[107.464888,52.078019],[107.464197,52.077836],[107.462259,52.07735],[107.46169,52.077192],[107.461429,52.0771],[107.461263,52.077018],[107.461132,52.076905],[107.46107,52.076775],[107.461036,52.076628],[107.461112,52.076472],[107.461219,52.076347],[107.461385,52.076226],[107.461591,52.076138],[107.461854,52.076092],[107.46288,52.076096],[107.464077,52.076104],[107.464513,52.076063],[107.464839,52.075974],[107.465033,52.075856],[107.465158,52.075751],[107.465207,52.07564],[107.46522,52.075531],[107.465191,52.075396],[107.465043,52.075215],[107.464688,52.074865],[107.464246,52.074496],[107.463027,52.073729],[107.46246,52.073418],[107.461705,52.073075],[107.460996,52.072721],[107.460459,52.072489],[107.460137,52.072379],[107.459917,52.07231],[107.459394,52.072252],[107.459031,52.072235],[107.458665,52.072238],[107.458165,52.072268],[107.457644,52.072354],[107.457382,52.072471],[107.457114,52.072665],[107.456717,52.072932],[107.456422,52.073099],[107.456029,52.073291],[107.455665,52.073382],[107.455317,52.073439],[107.454996,52.073438],[107.454677,52.073398],[107.453933,52.073215],[107.452589,52.072877],[107.451715,52.072676],[107.451294,52.072622],[107.450895,52.072591],[107.450645,52.07261],[107.450311,52.072688],[107.450066,52.072816],[107.449757,52.072999],[107.449633,52.073156],[107.449592,52.073345],[107.449615,52.073647],[107.449683,52.073999],[107.449642,52.074261],[107.449513,52.074413],[107.449293,52.074518],[107.449002,52.074611],[107.448713,52.074623],[107.448394,52.074577],[107.448091,52.074485],[107.447657,52.074324],[107.44733,52.074237],[107.447079,52.07418],[107.446821,52.07417],[107.446475,52.07421],[107.446169,52.074302],[107.445812,52.074465],[107.445468,52.074739],[107.445042,52.075074],[107.444685,52.075253],[107.444234,52.075454],[107.443752,52.075751],[107.443297,52.076002],[107.442875,52.076189],[107.442078,52.076504],[107.44175,52.076609],[107.441375,52.076624],[107.441091,52.076589],[107.440887,52.076491],[107.440721,52.076374],[107.440633,52.076207],[107.440625,52.076049],[107.440726,52.075882],[107.441102,52.075546],[107.441416,52.075214],[107.441697,52.074854],[107.442201,52.074514],[107.44257,52.074223],[107.442883,52.073904],[107.443282,52.073552],[107.443489,52.0734],[107.443902,52.073176],[107.444181,52.073054],[107.444606,52.072806],[107.445098,52.072496],[107.445496,52.0723],[107.445913,52.072045],[107.446191,52.071817],[107.446525,52.071511],[107.446809,52.0712],[107.447065,52.070866],[107.4473,52.070533],[107.447528,52.070103],[107.447585,52.069823],[107.447651,52.069579],[107.447721,52.069113],[107.447831,52.068607],[107.448003,52.067998],[107.448138,52.067698],[107.448303,52.06739],[107.448542,52.067095],[107.448757,52.066863],[107.449127,52.066551],[107.449455,52.066335],[107.450046,52.065935],[107.450549,52.065674],[107.451167,52.065405],[107.452271,52.065053],[107.453306,52.064689],[107.454137,52.064487],[107.455592,52.064187],[107.456655,52.064048],[107.457485,52.063972],[107.459742,52.06369],[107.463463,52.063237],[107.465345,52.063024],[107.466313,52.062923],[107.467615,52.062768],[107.469074,52.062596],[107.469884,52.062484],[107.472173,52.062232],[107.475009,52.061922],[107.475981,52.061863],[107.476818,52.061859],[107.477512,52.061891],[107.47871,52.061972],[107.48081,52.062166],[107.481801,52.062254],[107.483457,52.062371],[107.484494,52.062442],[107.484859,52.06246],[107.485095,52.062454],[107.485385,52.062447],[107.485845,52.062382],[107.486154,52.062286],[107.486269,52.062232],[107.48637,52.062185],[107.486601,52.062056],[107.486774,52.06191],[107.48709,52.061558],[107.487236,52.061233],[107.487295,52.060846],[107.487327,52.060284],[107.48742,52.05937],[107.487564,52.05767],[107.487613,52.0563],[107.487664,52.055737],[107.487789,52.055284],[107.487893,52.054998],[107.48802,52.054683],[107.488281,52.054072],[107.488845,52.052744],[107.489011,52.052352],[107.489328,52.051645],[107.489955,52.050128],[107.49052,52.048968],[107.490687,52.048612],[107.490849,52.048189],[107.491119,52.047567],[107.491415,52.046748],[107.491605,52.046265],[107.492069,52.045374],[107.492355,52.044729],[107.492807,52.043805],[107.493351,52.042642],[107.494253,52.040742],[107.494509,52.040179],[107.494902,52.039358],[107.495213,52.038548],[107.495387,52.037901],[107.495632,52.036647],[107.495921,52.034935],[107.495998,52.034248],[107.4961,52.033563],[107.496121,52.033227],[107.496172,52.0324],[107.496208,52.031878],[107.496218,52.031742],[107.496314,52.030891],[107.496334,52.030525],[107.496318,52.030269],[107.496264,52.029842],[107.496122,52.029048],[107.495808,52.028205],[107.495631,52.027485],[107.495583,52.027059],[107.495554,52.026089],[107.495583,52.025095],[107.495541,52.023495],[107.495497,52.022656],[107.495401,52.022236],[107.495199,52.021567],[107.495016,52.021106],[107.49482,52.020743],[107.494546,52.020292],[107.494309,52.019897],[107.4941,52.01963],[107.49384,52.019341],[107.49352,52.0191],[107.493192,52.018857],[107.49258,52.01851],[107.491403,52.017944],[107.490266,52.017474],[107.489755,52.017289],[107.489188,52.017047],[107.488492,52.016814],[107.487731,52.016554],[107.4873,52.016364],[107.487061,52.016258],[107.486731,52.0161],[107.486267,52.015807],[107.485835,52.015532],[107.485212,52.0151],[107.484806,52.014806],[107.484432,52.014559],[107.483835,52.014132],[107.483398,52.01382],[107.482306,52.013],[107.481758,52.012567],[107.481035,52.012043],[107.48078,52.011749],[107.480419,52.011338],[107.480201,52.01107],[107.479615,52.010186],[107.479391,52.009682],[107.479173,52.008952],[107.478926,52.008211],[107.478735,52.007792],[107.478499,52.007272],[107.478405,52.006917],[107.478324,52.006423],[107.478202,52.005739],[107.478064,52.0052],[107.477875,52.004673],[107.477814,52.004514],[107.47763,52.00389],[107.477496,52.00328],[107.47727,52.001874],[107.47698,52.000444],[107.476849,51.999875],[107.476668,51.99917],[107.476389,51.998139],[107.476015,51.996869],[107.475735,51.996087],[107.475538,51.995476],[107.475479,51.995351],[107.475393,51.995031],[107.475252,51.994615],[107.475113,51.994133],[107.475022,51.993839],[107.474985,51.993672],[107.474958,51.993445],[107.474947,51.993219],[107.474958,51.993037],[107.474989,51.992835],[107.475071,51.992444],[107.475208,51.992096],[107.475358,51.99178],[107.475787,51.991102],[107.476,51.990678],[107.476286,51.989774],[107.476628,51.988672],[107.476848,51.987924],[107.476938,51.987516],[107.476971,51.987245],[107.476948,51.98676],[107.476828,51.985851],[107.476765,51.985539],[107.476716,51.985211],[107.476554,51.98487],[107.476368,51.984569],[107.476122,51.984305],[107.475805,51.983977],[107.474145,51.982855],[107.47398,51.982735],[107.47377,51.982582],[107.473561,51.982402],[107.473057,51.981935],[107.472182,51.981056],[107.471914,51.980781],[107.471714,51.980534],[107.471511,51.980195],[107.471447,51.980031],[107.471406,51.97986],[107.471406,51.979609],[107.471553,51.978428],[107.471601,51.978021],[107.471602,51.977769],[107.471538,51.97749],[107.471433,51.97716],[107.471078,51.976299],[107.470938,51.975829],[107.470898,51.975541],[107.470913,51.975363],[107.470941,51.975247],[107.471068,51.97496],[107.471243,51.974743],[107.471518,51.974495],[107.471656,51.974373],[107.471902,51.974161],[107.472585,51.973583],[107.473492,51.972869],[107.474215,51.972356],[107.474564,51.972063],[107.474854,51.971775],[107.475141,51.971459],[107.475325,51.971204],[107.47545,51.970995],[107.475733,51.970431],[107.477191,51.966772],[107.477851,51.964522],[107.478618,51.96202],[107.478692,51.961732],[107.478746,51.961392],[107.478808,51.960885],[107.478878,51.959583],[107.478882,51.959146],[107.478896,51.958766],[107.478897,51.958714],[107.478963,51.957275],[107.478984,51.956976],[107.479029,51.956642],[107.479145,51.956311],[107.479291,51.956075],[107.479485,51.955823],[107.480029,51.95515],[107.480813,51.954182],[107.481096,51.953813],[107.481294,51.953501],[107.481417,51.953261],[107.481511,51.953025],[107.481631,51.9526],[107.481803,51.95192],[107.482043,51.950975],[107.48223,51.950527],[107.482328,51.950299],[107.483036,51.9488],[107.483697,51.947499],[107.483866,51.947163],[107.484002,51.946857],[107.484112,51.946566],[107.484191,51.946368],[107.484278,51.94603],[107.484297,51.945837],[107.484311,51.945313],[107.484253,51.943435],[107.484253,51.943431],[107.484268,51.943144],[107.484305,51.942904],[107.484374,51.942611],[107.484446,51.942286],[107.484616,51.94173],[107.484859,51.94107],[107.485126,51.940238],[107.485463,51.939294],[107.48554,51.938974],[107.485566,51.938647],[107.485548,51.938341],[107.485433,51.937883],[107.485219,51.937472],[107.484812,51.936996],[107.484163,51.936405],[107.482808,51.935107],[107.482212,51.934405],[107.481717,51.933676],[107.479735,51.930594],[107.479142,51.929649],[107.478799,51.929028],[107.478647,51.928693],[107.478502,51.92836],[107.478368,51.928022],[107.478311,51.927694],[107.478223,51.927073],[107.478175,51.926425],[107.478121,51.925796],[107.477843,51.922723],[107.477694,51.921032],[107.477644,51.920571],[107.477564,51.920197],[107.477434,51.919786],[107.47714,51.919093],[107.476898,51.918633],[107.476682,51.918243],[107.476025,51.917226],[107.475463,51.916223],[107.475386,51.916032],[107.475278,51.915775],[107.47515,51.915022],[107.475125,51.914847],[107.475019,51.914179],[107.475012,51.913981],[107.474989,51.913374],[107.475057,51.912493],[107.475208,51.911545],[107.475364,51.910315],[107.47554,51.909273],[107.475707,51.908815],[107.475923,51.908347],[107.476716,51.906996],[107.477306,51.905789],[107.477784,51.904735],[107.478153,51.904051],[107.478493,51.903309],[107.478642,51.902878],[107.478752,51.902315],[107.478815,51.901727],[107.478824,51.901661],[107.478876,51.901249],[107.478885,51.901132],[107.478985,51.898536],[107.478874,51.897134],[107.478711,51.895393],[107.478532,51.894393],[107.47833,51.893282],[107.477831,51.890809],[107.47775,51.890477],[107.477724,51.89012],[107.477514,51.889144],[107.477355,51.888454],[107.477086,51.88739],[107.476851,51.886353],[107.47675,51.885906],[107.476485,51.884864],[107.475884,51.882495],[107.47567,51.881525],[107.475646,51.881417],[107.475601,51.881135],[107.475675,51.880742],[107.475879,51.880353],[107.476585,51.879519],[107.477618,51.878251],[107.477844,51.877984],[107.478435,51.877309],[107.478902,51.876748],[107.479309,51.876274],[107.480437,51.874964],[107.480575,51.874803],[107.481702,51.873441],[107.481825,51.873292],[107.482688,51.872279],[107.483094,51.871881],[107.484042,51.870761],[107.484638,51.870064],[107.484731,51.869963],[107.485095,51.869529],[107.485946,51.868538],[107.486324,51.868165],[107.486991,51.867633],[107.487168,51.867508],[107.487376,51.867361],[107.487665,51.867176],[107.488278,51.866871],[107.488391,51.866814],[107.488762,51.866627],[107.489072,51.866475],[107.489916,51.86606],[107.490265,51.86589],[107.490643,51.8657],[107.490823,51.865618],[107.491919,51.865118],[107.492558,51.864903],[107.492934,51.86479],[107.4932,51.864714],[107.495893,51.864076],[107.498486,51.863426],[107.499624,51.863116],[107.500723,51.862764],[107.501183,51.862563],[107.501645,51.86232],[107.502435,51.86169],[107.503129,51.861086],[107.504631,51.859654],[107.505165,51.859137],[107.505275,51.859032],[107.5062,51.858049],[107.506569,51.857636],[107.506674,51.85734],[107.506677,51.857017],[107.506566,51.856474],[107.506058,51.854042],[107.506003,51.853104],[107.506,51.852931],[107.505991,51.852409],[107.505943,51.851976],[107.505849,51.851741],[107.505688,51.851528],[107.505279,51.851097],[107.504435,51.85035],[107.503369,51.849484],[107.502154,51.848587],[107.500872,51.847707],[107.500634,51.847478],[107.500463,51.847329],[107.500322,51.847189],[107.50024,51.847024],[107.500192,51.846774],[107.500178,51.846591],[107.500193,51.846221],[107.500289,51.845889],[107.500363,51.845538],[107.500487,51.845212],[107.500884,51.84384],[107.501475,51.841255],[107.502225,51.838539],[107.502319,51.837935],[107.502705,51.836781],[107.503206,51.835745],[107.504088,51.834439],[107.504767,51.833434],[107.505057,51.833066],[107.505838,51.831963],[107.507353,51.829887],[107.507575,51.829573],[107.507788,51.829233],[107.508031,51.828715],[107.508151,51.828356],[107.508282,51.827901],[107.508318,51.827575],[107.508337,51.8272],[107.508191,51.826757],[107.506383,51.823336],[107.506192,51.822987],[107.505537,51.82179],[107.504037,51.81903],[107.50323,51.817623],[107.50276,51.817025],[107.500939,51.814731],[107.499731,51.81321],[107.495592,51.808084],[107.495182,51.807574],[107.494303,51.806478],[107.492435,51.804215],[107.492043,51.803739],[107.489662,51.800851],[107.48578,51.795968],[107.485341,51.795436],[107.484992,51.795039],[107.484719,51.794739],[107.484192,51.794229],[107.483137,51.79352],[107.480446,51.791699],[107.479434,51.790962],[107.478601,51.790093],[107.478473,51.789945],[107.477273,51.78857],[107.473457,51.784209],[107.472663,51.783191],[107.472474,51.782999],[107.472236,51.782783],[107.471957,51.782548],[107.471821,51.782437],[107.471699,51.782343],[107.471552,51.782241],[107.471444,51.782168],[107.471274,51.782062],[107.470939,51.781852],[107.470722,51.781716],[107.470582,51.781629],[107.470364,51.781483],[107.47017,51.781345],[107.469968,51.781185],[107.469799,51.781036],[107.469646,51.780883],[107.469521,51.78074],[107.469397,51.780588],[107.469243,51.780387],[107.46886,51.779859],[107.468706,51.779641],[107.468667,51.779584],[107.467679,51.778143],[107.467381,51.777708],[107.465294,51.774664],[107.464933,51.774148],[107.463875,51.772635],[107.462271,51.770224],[107.461789,51.769548],[107.461257,51.76881],[107.460865,51.768279],[107.460732,51.768112],[107.460599,51.767958],[107.460465,51.767806],[107.460321,51.767648],[107.460187,51.767501],[107.460048,51.767362],[107.459884,51.767203],[107.459707,51.767038],[107.459526,51.766873],[107.459351,51.76672],[107.459133,51.766539],[107.458685,51.766185],[107.458437,51.765992],[107.458212,51.765804],[107.457868,51.765509],[107.457597,51.765279],[107.457453,51.765148],[107.457328,51.765027],[107.457223,51.764911],[107.457131,51.764789],[107.457052,51.764671],[107.45697,51.764532],[107.456899,51.764402],[107.456847,51.764282],[107.456801,51.764163],[107.456754,51.764027],[107.456718,51.763887],[107.456692,51.763749],[107.456673,51.763618],[107.456662,51.763502],[107.456655,51.763372],[107.456656,51.763271],[107.45666,51.76318],[107.456674,51.763075],[107.456698,51.762935],[107.456723,51.762826],[107.456775,51.762637],[107.456982,51.761924],[107.457063,51.76164],[107.45743,51.760518],[107.457513,51.760219],[107.457569,51.759999],[107.457617,51.759777],[107.457662,51.75954],[107.45769,51.759379],[107.457712,51.75923],[107.45773,51.75907],[107.457743,51.758885],[107.457771,51.75838],[107.457955,51.754994],[107.458445,51.743809],[107.458499,51.742654],[107.458564,51.741339],[107.458568,51.741144],[107.458567,51.740996],[107.458561,51.740856],[107.458556,51.74079],[107.458545,51.740653],[107.458463,51.739683],[107.45843,51.739398],[107.458388,51.739091],[107.458272,51.738342],[107.458253,51.738219],[107.458016,51.736685],[107.457375,51.732532],[107.457334,51.732244],[107.457307,51.732032],[107.457292,51.731876],[107.45728,51.731674],[107.457278,51.731487],[107.457291,51.731268],[107.457317,51.731024],[107.457342,51.730863],[107.457371,51.730715],[107.457411,51.730543],[107.457453,51.730387],[107.457501,51.730256],[107.457554,51.730134],[107.457623,51.730009],[107.457702,51.72989],[107.457805,51.729757],[107.457903,51.729641],[107.458034,51.729509],[107.458194,51.729353],[107.458374,51.729192],[107.458532,51.729064],[107.458711,51.728929],[107.458897,51.728794],[107.459112,51.728651],[107.459295,51.728531],[107.460007,51.728064],[107.460227,51.727927],[107.460408,51.727822],[107.460573,51.727727],[107.460737,51.727645],[107.460906,51.727565],[107.461115,51.727471],[107.461613,51.727256],[107.468569,51.724246],[107.469063,51.724032],[107.469268,51.723941],[107.469449,51.723859],[107.469613,51.723782],[107.469802,51.723692],[107.46999,51.723595],[107.470169,51.723495],[107.470321,51.723405],[107.47052,51.723278],[107.470691,51.723167],[107.470877,51.723043],[107.471069,51.722908],[107.471235,51.722783],[107.471426,51.722623],[107.471579,51.722487],[107.471722,51.72235],[107.47184,51.722226],[107.471978,51.722072],[107.472128,51.721885],[107.472251,51.721722],[107.472362,51.721568],[107.472465,51.721411],[107.472569,51.721216],[107.472685,51.720997],[107.473349,51.719679],[107.474156,51.718077],[107.474387,51.717626],[107.475522,51.715439],[107.475729,51.715038],[107.475928,51.714651],[107.476009,51.714495],[107.476727,51.713246],[107.476829,51.713035],[107.476998,51.7127],[107.477006,51.712613],[107.477011,51.712542],[107.477016,51.71248],[107.477016,51.712397],[107.477021,51.712319],[107.477016,51.712214],[107.477006,51.712096],[107.47698,51.711953],[107.476947,51.711819],[107.476903,51.7117],[107.476867,51.711604],[107.476816,51.711501],[107.476746,51.711371],[107.47671,51.711294],[107.476653,51.711204],[107.476588,51.711104],[107.4765,51.710977],[107.476214,51.710642],[107.476134,51.710599],[107.475801,51.710426],[107.475249,51.710146],[107.472787,51.708942],[107.471748,51.708377],[107.470067,51.70761],[107.469847,51.707497],[107.469609,51.707378],[107.46934,51.707237],[107.469138,51.707128],[107.46893,51.707008],[107.468887,51.706983],[107.468697,51.706872],[107.468395,51.706686],[107.466035,51.705194],[107.465756,51.705064],[107.462457,51.703817],[107.459773,51.70289],[107.458976,51.702628],[107.458247,51.702344],[107.457622,51.702044],[107.457185,51.701787],[107.456789,51.701531],[107.456183,51.701047],[107.455889,51.700787],[107.455763,51.700649],[107.455679,51.700561],[107.455579,51.700446],[107.455491,51.700341],[107.455402,51.700225],[107.455322,51.700123],[107.455253,51.700045],[107.455192,51.699958],[107.455129,51.699864],[107.455046,51.699725],[107.454905,51.699501],[107.454811,51.699343],[107.45477,51.699263],[107.454707,51.699137],[107.454621,51.698969],[107.454441,51.698656],[107.452895,51.696327],[107.452512,51.695795],[107.451897,51.694795],[107.451339,51.694186],[107.448884,51.691561],[107.447081,51.689624],[107.446538,51.68904],[107.445922,51.688379],[107.444741,51.687109],[107.441494,51.684471],[107.440928,51.683915],[107.438067,51.681104],[107.435091,51.678192],[107.434672,51.677782],[107.431975,51.675086],[107.431333,51.674269],[107.431157,51.673726],[107.431069,51.673189],[107.431133,51.67058],[107.43108,51.669037],[107.431004,51.66861],[107.430721,51.668066],[107.430262,51.667577],[107.427656,51.665398],[107.426773,51.66461],[107.426285,51.664033],[107.425961,51.663409],[107.425726,51.662742],[107.425579,51.662128],[107.425538,51.661687],[107.425579,51.661234],[107.42585,51.660176],[107.425914,51.659676],[107.425873,51.65922],[107.425184,51.657655],[107.424364,51.655835],[107.424236,51.655258],[107.423379,51.650072],[107.423179,51.648811],[107.423069,51.648187],[107.422758,51.647882],[107.421608,51.647091],[107.421526,51.646991],[107.421492,51.646871],[107.421495,51.646699],[107.421501,51.646543],[107.421475,51.646403],[107.421384,51.64621],[107.421214,51.645979],[107.42084,51.645582],[107.419642,51.644621],[107.419071,51.644019],[107.417759,51.642489],[107.417612,51.642164],[107.417536,51.641843],[107.417559,51.641003],[107.4177,51.640484],[107.418036,51.639995],[107.419024,51.638881],[107.419266,51.638494],[107.419354,51.63821],[107.419713,51.635511],[107.419766,51.634759],[107.419695,51.634273],[107.41956,51.633875],[107.419313,51.633462],[107.41886,51.633035],[107.418324,51.632626],[107.416983,51.631567],[107.416512,51.631271],[107.416141,51.631085],[107.415765,51.630968],[107.415318,51.630909],[107.414511,51.630899],[107.413735,51.630873],[107.412182,51.630606],[107.411646,51.63046],[107.411038,51.630234],[107.410642,51.630019],[107.409463,51.629379],[107.409051,51.629145],[107.408763,51.628915],[107.40841,51.628557],[107.408263,51.628207],[107.408104,51.626574],[107.40801,51.625982],[107.407595,51.624994],[107.40718,51.624241],[107.406794,51.623699],[107.406375,51.623211],[107.406053,51.622921],[107.405678,51.622675],[107.405259,51.622487],[107.404551,51.622294],[107.403811,51.62217],[107.403017,51.621999],[107.402514,51.621849],[107.402513,51.621849],[107.402084,51.621639],[107.40085,51.620862],[107.400266,51.620504],[107.397273,51.618674],[107.395174,51.617391],[107.391763,51.615331],[107.391408,51.61503],[107.390969,51.614537],[107.390625,51.614236],[107.389156,51.61331],[107.388855,51.613121],[107.388601,51.612935],[107.38668,51.611531],[107.385988,51.611012],[107.385596,51.610722],[107.383244,51.608936],[107.380208,51.606667],[107.379718,51.606305],[107.378866,51.605675],[107.377708,51.604859],[107.376967,51.604226],[107.374101,51.602083],[107.371823,51.600424],[107.371245,51.599946],[107.370949,51.599686],[107.36845,51.597485],[107.368059,51.597063],[107.367843,51.596558],[107.367413,51.594504],[107.367332,51.594237],[107.36713,51.593068],[107.36719,51.592124],[107.367463,51.589736],[107.367608,51.588272],[107.367818,51.58395],[107.367824,51.583822],[107.367864,51.582305],[107.368019,51.581574],[107.368191,51.581194],[107.368439,51.580756],[107.368729,51.580496],[107.369181,51.580174],[107.369346,51.579711],[107.369445,51.579214],[107.369476,51.578868],[107.36946,51.57869],[107.369364,51.578236],[107.369209,51.577755],[107.368638,51.57576],[107.368423,51.575304],[107.367812,51.574366],[107.367554,51.573883],[107.36734,51.573395],[107.367061,51.572445],[107.366836,51.571989],[107.366213,51.571152],[107.365988,51.570729],[107.36572,51.569618],[107.365527,51.5692],[107.365226,51.568787],[107.364668,51.568207],[107.363413,51.567204],[107.362909,51.566711],[107.362684,51.566357],[107.362533,51.565997],[107.362458,51.565654],[107.362469,51.565316],[107.362962,51.563261],[107.36351,51.562264],[107.364354,51.560951],[107.364472,51.560588],[107.364475,51.56007],[107.364368,51.559726],[107.364078,51.559217],[107.363123,51.557822],[107.362747,51.557189],[107.362455,51.556828],[107.362426,51.556792],[107.361879,51.556282],[107.360125,51.555051],[107.359853,51.55487],[107.359087,51.554439],[107.3589,51.554328],[107.357705,51.553659],[107.355914,51.552699],[107.355452,51.552329],[107.354025,51.551047],[107.353671,51.550671],[107.353328,51.550156],[107.353188,51.549834],[107.352449,51.548364],[107.352259,51.547595],[107.352196,51.546791],[107.3523,51.546289],[107.352619,51.545724],[107.352715,51.545458],[107.352708,51.545207],[107.352592,51.544635],[107.35232,51.543846],[107.351979,51.543305],[107.351804,51.543028],[107.351598,51.542703],[107.351258,51.541973],[107.350945,51.541205],[107.350537,51.540729],[107.349822,51.540172],[107.349269,51.5398],[107.348801,51.539567],[107.3484,51.539327],[107.348053,51.539007],[107.34791,51.538752],[107.347863,51.538463],[107.347827,51.538301],[107.347803,51.538061],[107.347809,51.537909],[107.347822,51.537865],[107.347855,51.537743],[107.347929,51.537582],[107.348951,51.536219],[107.350946,51.533489],[107.354723,51.528339],[107.355517,51.527298],[107.355974,51.526479],[107.356123,51.526087],[107.35615,51.525713],[107.356061,51.525246],[107.355918,51.524951],[107.355645,51.524552],[107.355227,51.524155],[107.35497,51.523888],[107.354309,51.523286],[107.353972,51.522962],[107.353495,51.522428],[107.353245,51.521984],[107.353182,51.521644],[107.353272,51.521358],[107.353929,51.519375],[107.354018,51.51882],[107.353982,51.518479],[107.353821,51.517852],[107.353811,51.517707],[107.353854,51.517567],[107.354047,51.517304],[107.354358,51.517052],[107.355549,51.516312],[107.355914,51.516049],[107.356311,51.515572],[107.356957,51.514193],[107.357336,51.513428],[107.35766,51.512704],[107.357643,51.512148],[107.35756,51.511053],[107.357519,51.510489],[107.357515,51.510306],[107.357481,51.509991],[107.357334,51.509337],[107.357332,51.509326],[107.35694,51.507728],[107.356076,51.5041],[107.355705,51.502001],[107.355637,51.501407],[107.35565,51.500227],[107.356114,51.496946],[107.356276,51.495401],[107.356314,51.494868],[107.356348,51.494261],[107.356344,51.49381],[107.356455,51.493179],[107.356675,51.492725],[107.357051,51.492242],[107.357619,51.491636],[107.357838,51.491452],[107.361007,51.488792],[107.362297,51.487709],[107.362464,51.487563],[107.363484,51.486672],[107.363554,51.48661],[107.363789,51.486405],[107.364797,51.485563],[107.365147,51.485316],[107.365165,51.485306],[107.365532,51.485083],[107.365985,51.484876],[107.366469,51.484704],[107.366954,51.484576],[107.367737,51.48441],[107.368606,51.484265],[107.371342,51.483723],[107.374758,51.483076],[107.375337,51.482976],[107.378647,51.4824],[107.379159,51.482311],[107.379252,51.482295],[107.379753,51.482172],[107.379871,51.482114],[107.379957,51.482017],[107.380011,51.481894],[107.380053,51.481797],[107.380085,51.481385],[107.380139,51.480675],[107.380143,51.480615],[107.380148,51.480547],[107.380158,51.480418],[107.380189,51.480014],[107.380212,51.479704],[107.380162,51.479246],[107.380086,51.478986],[107.379984,51.478802],[107.379946,51.478735],[107.379876,51.478645],[107.379834,51.478604],[107.37969,51.478464],[107.379566,51.47835],[107.379391,51.478146],[107.379165,51.477857],[107.379102,51.477698],[107.379097,51.477337],[107.379174,51.476924],[107.379327,51.476322],[107.37937,51.475927],[107.379353,51.475481],[107.379297,51.474842],[107.379055,51.473291],[107.378687,51.471523],[107.378637,51.471227],[107.378646,51.470901],[107.378663,51.470184],[107.378656,51.470064],[107.378746,51.468156],[107.378749,51.467454],[107.378743,51.467373],[107.378699,51.466729],[107.378611,51.466388],[107.378412,51.465897],[107.378169,51.465258],[107.378003,51.464565],[107.377877,51.463934],[107.37773,51.463497],[107.377532,51.463113],[107.376105,51.461487],[107.375741,51.46101],[107.374756,51.459194],[107.374436,51.458516],[107.374122,51.458077],[107.373524,51.457431],[107.372784,51.456734],[107.372415,51.456376],[107.371971,51.455891],[107.371668,51.455698],[107.371374,51.455496],[107.371171,51.455286],[107.371063,51.455056],[107.371256,51.454476],[107.371352,51.453849],[107.371449,51.452915],[107.371438,51.452743],[107.37161,51.452427],[107.371728,51.452271],[107.372039,51.451976],[107.372543,51.451424],[107.373241,51.45034],[107.373386,51.450019],[107.373612,51.449641],[107.373831,51.449123],[107.373806,51.448715],[107.373766,51.448296],[107.373841,51.447873],[107.373941,51.447579],[107.374209,51.447098],[107.374485,51.446638],[107.375281,51.445672],[107.375498,51.445354],[107.375547,51.445206],[107.375698,51.443474],[107.375783,51.441891],[107.375944,51.44048],[107.375891,51.439959],[107.375708,51.439563],[107.375709,51.439039],[107.375848,51.438533],[107.375873,51.438266],[107.375794,51.437784],[107.375712,51.437396],[107.375691,51.436501],[107.37566,51.436216],[107.375599,51.435937],[107.375492,51.435648],[107.375447,51.435459],[107.375498,51.435204],[107.375698,51.434955],[107.376159,51.434547],[107.376931,51.433662],[107.377146,51.433383],[107.37735,51.432804],[107.377564,51.432557],[107.377736,51.432439],[107.378273,51.431978],[107.379367,51.430926],[107.379611,51.430719],[107.379968,51.430417],[107.38044,51.430122],[107.381287,51.429741],[107.388261,51.427263],[107.388331,51.427239],[107.391512,51.426147],[107.391662,51.426093],[107.392559,51.42577],[107.393067,51.425556],[107.39332,51.425403],[107.393459,51.42524],[107.393495,51.425052],[107.393441,51.424773],[107.393351,51.424536],[107.393316,51.424337],[107.393337,51.424208],[107.39337,51.424064],[107.393467,51.423885],[107.393692,51.423693],[107.394194,51.423389],[107.394666,51.423207],[107.394902,51.423132],[107.39516,51.423089],[107.395582,51.423066],[107.395921,51.423105],[107.396394,51.423175],[107.396706,51.423237],[107.396958,51.423312],[107.397297,51.423444],[107.397563,51.423507],[107.398421,51.423593],[107.399419,51.423647],[107.400095,51.423701],[107.400556,51.423772],[107.401039,51.423904],[107.401908,51.42418],[107.401919,51.424183],[107.40252,51.42435],[107.402858,51.424411],[107.403174,51.424446],[107.403882,51.424494],[107.405341,51.424462],[107.406082,51.424425],[107.4068,51.424366],[107.407509,51.424253],[107.408227,51.424103],[107.41047,51.423529],[107.411983,51.42318],[107.412776,51.423051],[107.413613,51.422992],[107.41445,51.422976],[107.415276,51.422998],[107.417594,51.423202],[107.418345,51.42318],[107.420769,51.422987],[107.422282,51.422896],[107.423334,51.422896],[107.42431,51.422955],[107.424857,51.422945],[107.425233,51.422939],[107.42767,51.422839],[107.430758,51.422805],[107.432228,51.422756],[107.433183,51.422687],[107.433832,51.422605],[107.434084,51.422574],[107.434846,51.422515],[107.435586,51.422504],[107.437281,51.422553],[107.438182,51.422542],[107.441326,51.422461],[107.442098,51.422413],[107.442667,51.422322],[107.443744,51.422088],[107.443919,51.42205],[107.444246,51.421979],[107.444595,51.421931],[107.445109,51.421864],[107.446418,51.421773],[107.449293,51.421392],[107.449646,51.421353],[107.450413,51.421238],[107.451088,51.42111],[107.452023,51.420906],[107.455204,51.420181],[107.455904,51.420035],[107.456648,51.419936],[107.457509,51.419829],[107.457805,51.419763],[107.457977,51.419702],[107.458157,51.419583],[107.458294,51.419465],[107.45851,51.419204],[107.45864,51.419046],[107.458748,51.418915],[107.458849,51.418802],[107.459096,51.418618],[107.459401,51.418474],[107.461636,51.417687],[107.461889,51.4176],[107.463,51.41722],[107.463196,51.417152],[107.463985,51.416882],[107.465723,51.416244],[107.466667,51.415927],[107.467966,51.41552],[107.469543,51.414978],[107.470433,51.414619],[107.471259,51.414211],[107.472332,51.413648],[107.473351,51.412993],[107.473834,51.412639],[107.474414,51.412076],[107.474939,51.411518],[107.475841,51.41045],[107.476195,51.409919],[107.477074,51.408423],[107.477541,51.407613],[107.477686,51.407361],[107.4779,51.40691],[107.478029,51.406459],[107.478351,51.404271],[107.47848,51.403782],[107.478716,51.403321],[107.480089,51.40103],[107.480669,51.399936],[107.481184,51.398842],[107.481495,51.398316],[107.483887,51.394985],[107.484456,51.394116],[107.484703,51.393687],[107.484992,51.393332],[107.4854,51.393059],[107.486215,51.392694],[107.492148,51.390302],[107.501794,51.386428],[107.503414,51.38579],[107.504175,51.385468],[107.504873,51.385103],[107.505495,51.384701],[107.509905,51.381359],[107.510355,51.381064],[107.511138,51.380699],[107.513842,51.379659],[107.514432,51.379412],[107.517066,51.378338],[107.517565,51.378065],[107.518289,51.377598],[107.519925,51.376494],[107.52024,51.376288],[107.520427,51.3761],[107.520627,51.375874],[107.520874,51.375425],[107.520992,51.375006],[107.52101,51.374682],[107.520757,51.373327],[107.520768,51.372807],[107.52088,51.372293],[107.521846,51.369166],[107.522387,51.367288],[107.522564,51.366698],[107.522639,51.366135],[107.522639,51.365373],[107.522483,51.36253],[107.522443,51.361342],[107.522498,51.360784],[107.522633,51.360138],[107.522751,51.359724],[107.522929,51.359091],[107.523348,51.357418],[107.523434,51.356956],[107.523434,51.356785],[107.523403,51.356336],[107.523296,51.355983],[107.523234,51.355808],[107.523153,51.355521],[107.523141,51.355238],[107.523214,51.354966],[107.523354,51.354728],[107.523511,51.354464],[107.523696,51.35421],[107.523988,51.353907],[107.524315,51.353739],[107.524721,51.353643],[107.526614,51.353395],[107.527167,51.353342],[107.52743,51.353304],[107.527672,51.353273],[107.528122,51.353158],[107.52836,51.353084],[107.528584,51.352896],[107.528798,51.352673],[107.529024,51.352487],[107.529276,51.352408],[107.529917,51.352215],[107.53066,51.352138],[107.531628,51.352005],[107.532166,51.351829],[107.533744,51.351281],[107.534484,51.351039],[107.534935,51.350873],[107.53618,51.350267],[107.537441,51.349654],[107.538064,51.34935],[107.538261,51.349242],[107.538735,51.349087],[107.539119,51.349006],[107.539484,51.348984],[107.540246,51.348963],[107.54067,51.348977],[107.541119,51.349026],[107.541601,51.349178],[107.542264,51.349492],[107.542666,51.34973],[107.542915,51.349823],[107.543315,51.349837],[107.543658,51.349773],[107.544166,51.349617],[107.545449,51.349248],[107.545921,51.349121],[107.546359,51.348992],[107.546826,51.348841],[107.546981,51.348771],[107.547186,51.348671],[107.547518,51.348394],[107.547873,51.347922],[107.548335,51.347625],[107.549019,51.347165],[107.550143,51.346284],[107.550845,51.345786],[107.551074,51.345603],[107.551398,51.345326],[107.551559,51.345094],[107.551614,51.344893],[107.551615,51.344712],[107.551504,51.344473],[107.551335,51.344228],[107.551238,51.344108],[107.551038,51.343954],[107.550799,51.343864],[107.550459,51.34382],[107.550109,51.343793],[107.549903,51.34375],[107.549765,51.343703],[107.549582,51.343624],[107.549479,51.34354],[107.549303,51.3433],[107.549092,51.342946],[107.54895,51.342676],[107.548837,51.342488],[107.548727,51.342183],[107.548734,51.341924],[107.548763,51.341175],[107.548785,51.340627],[107.548817,51.340173],[107.549014,51.33976],[107.549321,51.33947],[107.54969,51.33929],[107.55019,51.33915],[107.55077,51.338965],[107.551456,51.338671],[107.55226,51.338239],[107.554269,51.33682],[107.554934,51.33634],[107.555511,51.335931],[107.556049,51.335536],[107.556833,51.334555],[107.557358,51.334093],[107.55797,51.333696],[107.558195,51.333578],[107.558689,51.333358],[107.558903,51.33323],[107.559257,51.332918],[107.560083,51.331985],[107.560191,51.331824],[107.560244,51.331658],[107.560223,51.331325],[107.559901,51.330757],[107.558721,51.328954],[107.558431,51.328337],[107.558184,51.32771],[107.558002,51.327082],[107.558023,51.326433],[107.558313,51.325344],[107.558528,51.324705],[107.558817,51.324094],[107.559536,51.322892],[107.559804,51.322308],[107.559987,51.321487],[107.560513,51.318724],[107.560942,51.316761],[107.56106,51.316058],[107.561027,51.315602],[107.560759,51.314508],[107.560534,51.313896],[107.560266,51.313301],[107.560062,51.312668],[107.560008,51.312212],[107.560008,51.311311],[107.560073,51.309642],[107.56003,51.30946],[107.559933,51.309277],[107.559643,51.308929],[107.559075,51.308408],[107.559002,51.308345],[107.557734,51.30725],[107.557519,51.306686],[107.557455,51.306128],[107.557326,51.304278],[107.55724,51.303645],[107.556575,51.301617],[107.5565,51.301145],[107.556489,51.30092],[107.556483,51.300295],[107.556494,51.299992],[107.556499,51.299823],[107.556575,51.298906],[107.556725,51.297165],[107.556715,51.296537],[107.556521,51.295952],[107.556178,51.295389],[107.555234,51.293983],[107.555094,51.29357],[107.555084,51.293157],[107.555202,51.291832],[107.555202,51.291414],[107.555094,51.290813],[107.554923,51.290244],[107.554901,51.290062],[107.554912,51.28988],[107.555062,51.289526],[107.555459,51.289005],[107.556403,51.288013],[107.557231,51.287047],[107.557605,51.286564],[107.557807,51.28623],[107.557882,51.28609],[107.55797,51.28569],[107.557991,51.285309],[107.557905,51.284252],[107.557895,51.283775],[107.557948,51.28209],[107.557948,51.281624],[107.557916,51.281162],[107.557787,51.280492],[107.557251,51.278593],[107.557069,51.27803],[107.556543,51.276898],[107.553582,51.271651],[107.552745,51.270283],[107.552487,51.269833],[107.552262,51.269366],[107.551457,51.268025],[107.551318,51.267601],[107.551318,51.267193],[107.551532,51.266555],[107.551736,51.266094],[107.55267,51.264168],[107.553786,51.261909],[107.554365,51.260536],[107.554601,51.260091],[107.555041,51.259479],[107.555577,51.258916],[107.556167,51.258385],[107.55679,51.25787],[107.558656,51.256175],[107.559558,51.255451],[107.560244,51.25493],[107.564396,51.252141],[107.571177,51.247699],[107.571261,51.247637],[107.571748,51.247175],[107.572106,51.246696],[107.572314,51.246292],[107.572499,51.245827],[107.574031,51.242324],[107.575265,51.239604],[107.576048,51.2377],[107.576649,51.236386],[107.578269,51.233392],[107.578666,51.232636],[107.579149,51.231627],[107.579545,51.230882],[107.584867,51.221],[107.586594,51.217857],[107.58726,51.216505],[107.587506,51.215947],[107.587624,51.215759],[107.587796,51.215585],[107.587987,51.215426],[107.58815,51.215318],[107.588285,51.21525],[107.588553,51.215137],[107.588736,51.215081],[107.589039,51.214995],[107.589355,51.214914],[107.589997,51.214736],[107.590277,51.214638],[107.590477,51.21456],[107.590615,51.214485],[107.590789,51.214374],[107.590947,51.214245],[107.591052,51.214147],[107.591165,51.214007],[107.591271,51.213841],[107.591626,51.213211],[107.59183,51.212546],[107.591991,51.212096],[107.592538,51.210744],[107.593032,51.209365],[107.593407,51.208442],[107.593622,51.208008],[107.594802,51.20598],[107.595338,51.20546],[107.5964,51.204607],[107.598385,51.203089],[107.599394,51.202273],[107.601937,51.200256],[107.60243,51.199875],[107.602977,51.199543],[107.605305,51.198255],[107.605606,51.198121],[107.606282,51.197939],[107.608492,51.197429],[107.609983,51.197129],[107.611067,51.196893],[107.611432,51.196866],[107.612118,51.196705],[107.612773,51.196469],[107.613395,51.196174],[107.613985,51.195847],[107.615809,51.194785],[107.617064,51.194087],[107.617676,51.193733],[107.618244,51.193379],[107.61877,51.193009],[107.619231,51.192623],[107.62039,51.191528],[107.620959,51.191046],[107.621549,51.190563],[107.622257,51.190075],[107.62421,51.188873],[107.625368,51.188197],[107.627063,51.187178],[107.627664,51.186899],[107.628319,51.186657],[107.629746,51.186089],[107.631366,51.185493],[107.633039,51.18485],[107.635539,51.183948],[107.63717,51.183315],[107.637546,51.183128],[107.640925,51.181856],[107.64512,51.180344],[107.648339,51.179153],[107.649927,51.178611],[107.650721,51.17831],[107.653156,51.177452],[107.660505,51.174995],[107.662179,51.174448],[107.663842,51.173928],[107.664657,51.173654],[107.665462,51.173359],[107.666224,51.173032],[107.669185,51.171664],[107.67102,51.170784],[107.671352,51.170569],[107.673541,51.169577],[107.674281,51.169271],[107.67912,51.167372],[107.68058,51.166821],[107.681223,51.166578],[107.683068,51.165796],[107.68443,51.165288],[107.686829,51.164428],[107.687027,51.164359],[107.68736,51.164246],[107.687774,51.164052],[107.688006,51.163944],[107.688238,51.163798],[107.688482,51.163643],[107.689207,51.163156],[107.689666,51.162829],[107.690181,51.162303],[107.691919,51.159948],[107.692992,51.158542],[107.694087,51.157024],[107.695749,51.154852],[107.697885,51.151971],[107.699944,51.14923],[107.701039,51.147679],[107.702165,51.146135],[107.703528,51.144348],[107.704601,51.142884],[107.705277,51.141982],[107.705631,51.141548],[107.707186,51.139467],[107.708367,51.137836],[107.71165,51.133405],[107.714332,51.129795],[107.716767,51.126549],[107.71858,51.124022],[107.719278,51.123298],[107.719728,51.122971],[107.720812,51.122429],[107.721767,51.122188],[107.725855,51.121523],[107.726091,51.121464],[107.727829,51.120847],[107.728397,51.120611],[107.730039,51.119817],[107.730876,51.119441],[107.731451,51.119153],[107.731691,51.119033],[107.732431,51.118561],[107.733118,51.118068],[107.735232,51.116593],[107.735918,51.116083],[107.73653,51.115536],[107.738107,51.113755],[107.739233,51.112548],[107.739963,51.111706],[107.741068,51.110483],[107.741991,51.109506],[107.743976,51.107264],[107.745006,51.106132],[107.746111,51.10485],[107.74743,51.103402],[107.749147,51.10146],[107.749994,51.100521],[107.750424,51.100076],[107.751346,51.099239],[107.75312,51.097744],[107.753192,51.097683],[107.755874,51.09536],[107.756335,51.094979],[107.756829,51.094625],[107.757365,51.094304],[107.757945,51.093998],[107.758545,51.093713],[107.760412,51.092898],[107.763803,51.09138],[107.76906,51.088939],[107.772332,51.08748],[107.772799,51.087264],[107.773186,51.08708],[107.773492,51.086944],[107.773601,51.086889],[107.773796,51.086801],[107.773941,51.086747],[107.774075,51.086682],[107.77421,51.086612],[107.7754,51.086074],[107.779198,51.084342],[107.779842,51.084057],[107.780185,51.083934],[107.780808,51.083634],[107.781398,51.083317],[107.78246,51.082695],[107.785178,51.0809],[107.785792,51.080507],[107.786653,51.079939],[107.787823,51.079208],[107.788451,51.078796],[107.788971,51.078384],[107.789561,51.077823],[107.789742,51.077673],[107.789903,51.077515],[107.790048,51.077364],[107.790434,51.07694],[107.790799,51.076253],[107.791346,51.075304],[107.791743,51.074837],[107.79231,51.074344],[107.792782,51.07391],[107.7932,51.073497],[107.793361,51.073304],[107.793522,51.073025],[107.793619,51.072687],[107.793369,51.071431],[107.793249,51.070745],[107.793126,51.070446],[107.793054,51.070316],[107.792924,51.070123],[107.792838,51.069995],[107.79266,51.069751],[107.792399,51.069426],[107.792103,51.069158],[107.791953,51.069017],[107.791754,51.068831],[107.791571,51.068624],[107.791461,51.068476],[107.791355,51.068305],[107.791281,51.068158],[107.791216,51.067922],[107.791214,51.06767],[107.791241,51.067545],[107.791313,51.067377],[107.791387,51.067212],[107.791553,51.067041],[107.792612,51.06607],[107.79323,51.065545],[107.793857,51.065066],[107.795704,51.063654],[107.796732,51.062885],[107.798008,51.061952],[107.7986,51.061616],[107.799424,51.06117],[107.803937,51.0588],[107.805337,51.057975],[107.806046,51.057557],[107.807754,51.056268],[107.808202,51.055972],[107.808541,51.055819],[107.810652,51.05491],[107.810939,51.054787],[107.81314,51.053839],[107.813489,51.053704],[107.813951,51.053638],[107.814326,51.053625],[107.814614,51.05362],[107.814842,51.053618],[107.815488,51.053659],[107.816122,51.053851],[107.816525,51.05407],[107.817413,51.054552],[107.820835,51.056387],[107.821586,51.056741],[107.821847,51.056866],[107.822535,51.057194],[107.823132,51.057395],[107.823539,51.057521],[107.824052,51.057625],[107.824579,51.05769],[107.825218,51.057738],[107.825755,51.057734],[107.826088,51.057735],[107.828158,51.057609],[107.830083,51.057507],[107.831738,51.057403],[107.837438,51.057081],[107.839451,51.056956],[107.842606,51.056771],[107.844138,51.056734],[107.845518,51.056745],[107.846657,51.056754],[107.852375,51.056822],[107.855285,51.056831],[107.856485,51.05683],[107.857067,51.056829],[107.858433,51.056847],[107.858798,51.056848],[107.860686,51.056848],[107.862456,51.056838],[107.863529,51.056891],[107.864435,51.057029],[107.865445,51.057214],[107.868076,51.057728],[107.872547,51.058982],[107.874664,51.059456],[107.876058,51.059805],[107.876734,51.059998],[107.878054,51.060422],[107.87932,51.060867],[107.880629,51.061361],[107.881991,51.061822],[107.882678,51.062042],[107.885553,51.062911],[107.889502,51.064193],[107.890156,51.064386],[107.891497,51.064735],[107.892495,51.064976],[107.893825,51.06532],[107.894512,51.06548],[107.895896,51.065867],[107.897988,51.066489],[107.898675,51.066709],[107.899361,51.06695],[107.900027,51.067224],[107.901904,51.068157],[107.902408,51.068396],[107.902559,51.068468],[107.903921,51.069064],[107.905917,51.070008],[107.906625,51.070282],[107.909693,51.071322],[107.912339,51.072236],[107.912918,51.072438],[107.913857,51.072694],[107.91449,51.072809],[107.91515,51.072863],[107.915504,51.072859],[107.916121,51.072846],[107.916732,51.072826],[107.92038,51.07263],[107.924307,51.072438],[107.926351,51.0723],[107.927359,51.072195],[107.928175,51.072064],[107.929033,51.071916],[107.929575,51.071808],[107.930117,51.071703],[107.931023,51.071511],[107.931924,51.071353],[107.932928,51.071231],[107.933936,51.071164],[107.934928,51.071144],[107.935878,51.071167],[107.936881,51.071194],[107.93782,51.071251],[107.938807,51.071346],[107.939691,51.071491],[107.940603,51.071642],[107.941504,51.071835],[107.942426,51.072092],[107.944776,51.072897],[107.945742,51.073203],[107.949261,51.074187],[107.951654,51.074841],[107.952609,51.075088],[107.954089,51.075421],[107.955087,51.075598],[107.956095,51.075759],[107.957125,51.075893],[107.960194,51.076327],[107.961213,51.076494],[107.962222,51.076697],[107.963198,51.076928],[107.965172,51.077481],[107.966095,51.077781],[107.96882,51.0788],[107.970284,51.079325],[107.970782,51.079499],[107.975322,51.081069],[107.978043,51.082076],[107.979763,51.082716],[107.980986,51.083247],[107.982531,51.083977],[107.983166,51.084294],[107.983293,51.084358],[107.984699,51.085136],[107.986509,51.086163],[107.986769,51.086311],[107.988625,51.087335],[107.994932,51.090974],[107.995587,51.09131],[107.996349,51.091683],[107.999433,51.093102],[108.000119,51.093367],[108.000957,51.093634],[108.00192,51.093904],[108.003861,51.094408],[108.004537,51.094591],[108.012624,51.096728],[108.019508,51.098517],[108.020813,51.098848],[108.021983,51.099141],[108.02405,51.099529],[108.028114,51.100137],[108.030292,51.100443],[108.031375,51.10055],[108.03247,51.100615],[108.033564,51.100636],[108.03468,51.100604],[108.038006,51.100448],[108.040205,51.100298],[108.042383,51.10011],[108.045559,51.099724],[108.047672,51.09951],[108.048745,51.099413],[108.049807,51.099333],[108.05087,51.099279],[108.053069,51.099215],[108.055279,51.099177],[108.057436,51.099193],[108.058498,51.099161],[108.06059,51.099032],[108.06884,51.098549],[108.069774,51.09848],[108.075589,51.098104],[108.079677,51.097857],[108.080674,51.097809],[108.08164,51.097788],[108.082606,51.097809],[108.08355,51.097884],[108.086489,51.098195],[108.087487,51.098319],[108.090481,51.098635],[108.091457,51.098726],[108.092433,51.098807],[108.093409,51.09886],[108.094364,51.098882],[108.095319,51.09886],[108.097261,51.098764],[108.103613,51.098426],[108.105222,51.098313],[108.105788,51.098337],[108.105962,51.098345],[108.106638,51.098447],[108.107303,51.098619],[108.107883,51.09886],[108.108441,51.099177],[108.109471,51.099901],[108.111488,51.101355],[108.113987,51.103077],[108.114545,51.103409],[108.115146,51.103705],[108.115811,51.103973],[108.116519,51.104171],[108.11726,51.104321],[108.118762,51.104536],[108.119523,51.104616],[108.120296,51.104724],[108.121841,51.104992],[108.122646,51.105169],[108.12344,51.105373],[108.12507,51.105818],[108.126744,51.106242],[108.127592,51.106446],[108.128461,51.106628],[108.130231,51.106912],[108.134619,51.107535],[108.137258,51.107921],[108.138138,51.108071],[108.138996,51.108248],[108.139822,51.108457],[108.140649,51.108693],[108.141421,51.108972],[108.142172,51.109278],[108.142902,51.109605],[108.144275,51.110313],[108.146421,51.111354],[108.14994,51.113124],[108.152021,51.114138],[108.152665,51.114503],[108.153255,51.1149],[108.153813,51.115313],[108.154339,51.115748],[108.154821,51.116198],[108.155261,51.11667],[108.15833,51.120297],[108.160217,51.122565],[108.160937,51.123429],[108.161838,51.124454],[108.162299,51.124953],[108.162793,51.125425],[108.163286,51.125865],[108.165037,51.127392],[108.165378,51.127685],[108.165603,51.127877],[108.167235,51.129266],[108.168307,51.130108],[108.16869,51.130365],[108.169238,51.130698],[108.169719,51.13095],[108.170402,51.131246],[108.171047,51.131518],[108.171927,51.131887],[108.172142,51.131969],[108.172305,51.132031],[108.172895,51.132283],[108.173332,51.132469],[108.174848,51.13308],[108.183569,51.136625],[108.188391,51.138622],[108.189121,51.138869],[108.189883,51.139153],[108.190216,51.139242],[108.190372,51.139284],[108.190645,51.139357],[108.191407,51.139534],[108.191761,51.13961],[108.192766,51.139824],[108.19926,51.141208],[108.201921,51.141766],[108.203201,51.14205],[108.203563,51.14213],[108.204474,51.142286],[108.205375,51.142394],[108.206202,51.142506],[108.207103,51.14256],[108.208058,51.142587],[108.208991,51.142586],[108.209925,51.142522],[108.210826,51.14242],[108.211663,51.142318],[108.2125,51.142163],[108.216634,51.141264],[108.218254,51.140926],[108.222337,51.140003],[108.224027,51.139643],[108.225663,51.139294],[108.228163,51.138758],[108.230537,51.138212],[108.23147,51.138034],[108.232193,51.137905],[108.233047,51.137814],[108.240051,51.137506],[108.242841,51.137366],[108.246542,51.137205],[108.247374,51.137152],[108.247465,51.137146],[108.24931,51.137071],[108.25623,51.13669],[108.259395,51.136529],[108.260146,51.136519],[108.261219,51.136529],[108.261895,51.136578],[108.262625,51.136696],[108.263344,51.136883],[108.264019,51.137098],[108.264652,51.137339],[108.265221,51.13764],[108.265725,51.137983],[108.267971,51.13976],[108.268933,51.140521],[108.270628,51.141824],[108.276401,51.146352],[108.277001,51.146775],[108.277624,51.147146],[108.278257,51.147473],[108.279651,51.1481],[108.285584,51.150461],[108.289297,51.151952],[108.29067,51.152467],[108.2942,51.153873],[108.294994,51.154157],[108.295466,51.154345],[108.29626,51.154736],[108.297032,51.155203],[108.297483,51.155552],[108.297901,51.155932],[108.298641,51.156802],[108.299746,51.158266],[108.300444,51.159264],[108.302836,51.162541],[108.303534,51.163389],[108.304682,51.164639],[108.305476,51.165449],[108.305905,51.165846],[108.306355,51.166216],[108.30686,51.16657],[108.307385,51.166903],[108.307933,51.167219],[108.30878,51.167627],[108.309638,51.167986],[108.310497,51.168314],[108.311348,51.168569],[108.312246,51.168821],[108.31315,51.169002],[108.315861,51.169584],[108.316657,51.169771],[108.317448,51.169983],[108.318218,51.170227],[108.318815,51.170455],[108.31913,51.170556],[108.319381,51.170669],[108.319673,51.170787],[108.31982,51.170856],[108.320614,51.171285],[108.32114,51.171656],[108.321655,51.172079],[108.322577,51.172986],[108.322996,51.173463],[108.323414,51.173994],[108.323908,51.174574],[108.324788,51.175352],[108.325249,51.175727],[108.325753,51.176092],[108.3263,51.17643],[108.326901,51.176757],[108.327534,51.177068],[108.329015,51.177762],[108.331439,51.178924],[108.332789,51.179536],[108.335999,51.18099],[108.336621,51.18129],[108.337201,51.181612],[108.337727,51.181961],[108.338199,51.182336],[108.338285,51.182441],[108.338585,51.18276],[108.338864,51.183211],[108.339078,51.183667],[108.339668,51.185163],[108.340106,51.186175],[108.340192,51.186415],[108.340698,51.187625],[108.341128,51.188602],[108.341643,51.189621],[108.342265,51.190646],[108.342951,51.191708],[108.344142,51.193398],[108.344582,51.193961],[108.345097,51.194487],[108.345634,51.195002],[108.346186,51.195545],[108.346739,51.195994],[108.347865,51.196965],[108.350333,51.198789],[108.35162,51.199663],[108.352961,51.200479],[108.354313,51.201273],[108.355021,51.201643],[108.355751,51.202002],[108.357232,51.202699],[108.359485,51.203692],[108.362499,51.204969],[108.363229,51.205291],[108.366963,51.206868],[108.380513,51.212613],[108.384601,51.21433],[108.385427,51.214662],[108.386264,51.214979],[108.387991,51.215601],[108.389847,51.216212],[108.391768,51.21676],[108.392733,51.217001],[108.39371,51.217226],[108.395673,51.217613],[108.397669,51.217924],[108.399686,51.218181],[108.402733,51.218487],[108.404771,51.218653],[108.406767,51.218777],[108.408751,51.218916],[108.411713,51.219072],[108.415554,51.219302],[108.422549,51.21978],[108.424609,51.21993],[108.428707,51.220171],[108.435134,51.220563],[108.436249,51.220617],[108.439543,51.220842],[108.441689,51.221003],[108.443706,51.221121],[108.444661,51.221196],[108.448287,51.221411],[108.450916,51.221582],[108.45274,51.221818],[108.45466,51.222146],[108.455594,51.222328],[108.456505,51.222542],[108.457385,51.222768],[108.458244,51.223004],[108.459091,51.223261],[108.459928,51.223535],[108.460743,51.223819],[108.462278,51.224415],[108.463007,51.224731],[108.463705,51.225053],[108.465013,51.225729],[108.465625,51.226072],[108.466226,51.226432],[108.466794,51.226796],[108.4685,51.227912],[108.471279,51.229768],[108.471805,51.230138],[108.474004,51.231582],[108.476794,51.233454],[108.478221,51.234392],[108.479942,51.235564],[108.48101,51.236265],[108.483339,51.237838],[108.483666,51.238066],[108.488295,51.241178],[108.491031,51.24297],[108.492615,51.244053],[108.49508,51.245694],[108.496304,51.246507],[108.496742,51.246785],[108.499142,51.248394],[108.500315,51.249156],[108.501255,51.249767],[108.502972,51.250936],[108.506738,51.253431],[108.512113,51.25702],[108.513765,51.258232],[108.514806,51.259069],[108.516244,51.260399],[108.518035,51.262127],[108.518937,51.262931],[108.519398,51.263317],[108.51987,51.263693],[108.520374,51.264063],[108.521436,51.264777],[108.523679,51.266177],[108.525363,51.267244],[108.525921,51.267614],[108.528743,51.269385],[108.529236,51.269712],[108.53091,51.270763],[108.532712,51.271933],[108.536822,51.274508],[108.537487,51.274942],[108.53812,51.275387],[108.540072,51.276809],[108.547078,51.282243],[108.551048,51.285236],[108.5527,51.286443],[108.554363,51.287581],[108.556058,51.288611],[108.558455,51.289938],[108.558537,51.289984],[108.559341,51.290402],[108.560961,51.291212],[108.566605,51.293921],[108.568697,51.294935],[108.569244,51.295171],[108.570135,51.295584],[108.571186,51.295992],[108.572484,51.29647],[108.573128,51.296689],[108.573793,51.296899],[108.575123,51.297274],[108.577216,51.297762],[108.578653,51.298047],[108.580102,51.298299],[108.587537,51.299452],[108.59288,51.30016],[108.594414,51.300348],[108.59804,51.300836],[108.602933,51.301517],[108.608973,51.30237],[108.609917,51.302488],[108.611784,51.302778],[108.620356,51.303996],[108.622502,51.304275],[108.623221,51.304355],[108.626021,51.30472],[108.630173,51.305299],[108.632373,51.305584],[108.634626,51.305922],[108.638507,51.306412],[108.638779,51.306446],[108.643992,51.307295],[108.645612,51.307467],[108.646449,51.307515],[108.647275,51.307531],[108.64809,51.30752],[108.648906,51.307477],[108.6497,51.307413],[108.650494,51.307316],[108.651288,51.307198],[108.65206,51.307059],[108.652811,51.306871],[108.653541,51.306667],[108.654249,51.306437],[108.654946,51.306184],[108.6556,51.305906],[108.656233,51.30561],[108.660332,51.303336],[108.662285,51.302279],[108.663508,51.301641],[108.664827,51.300884],[108.66546,51.300482],[108.666061,51.300064],[108.667821,51.298765],[108.668368,51.29831],[108.668894,51.297843],[108.670846,51.295976],[108.671308,51.295499],[108.673239,51.293632],[108.675631,51.291261],[108.679354,51.287683],[108.68047,51.286706],[108.681049,51.286223],[108.682251,51.285295],[108.683474,51.284448],[108.685405,51.283225],[108.689268,51.280805],[108.691314,51.279476],[108.691665,51.279252],[108.694857,51.277238],[108.695469,51.276895],[108.696102,51.276568],[108.696746,51.276272],[108.6974,51.276004],[108.698065,51.275758],[108.698741,51.275532],[108.700157,51.275178],[108.700972,51.274999],[108.701616,51.274915],[108.702357,51.274819],[108.703108,51.274738],[108.703859,51.274695],[108.70535,51.27469],[108.70608,51.274706],[108.706799,51.274744],[108.707513,51.274789],[108.708242,51.274886],[108.70968,51.275127],[108.714486,51.276017],[108.717356,51.276557],[108.721893,51.277396],[108.722719,51.277546],[108.727924,51.278638],[108.729576,51.278955],[108.733599,51.279668],[108.73611,51.280081],[108.73788,51.280349],[108.739833,51.280591],[108.742858,51.280918],[108.745873,51.281111],[108.747815,51.281176],[108.749767,51.281208],[108.750712,51.281202],[108.75334,51.281109],[108.75501,51.281043],[108.755645,51.28102],[108.756178,51.281],[108.756478,51.280978],[108.757546,51.280908],[108.761832,51.280628],[108.76448,51.280431],[108.76588,51.280333],[108.766933,51.280229],[108.768222,51.280033],[108.769777,51.279749],[108.770528,51.279556],[108.771214,51.279341],[108.771869,51.279094],[108.772491,51.278826],[108.773746,51.278193],[108.774422,51.277796],[108.775066,51.277372],[108.775645,51.276922],[108.776171,51.27646],[108.776643,51.275994],[108.777405,51.275044],[108.777705,51.274545],[108.777974,51.274003],[108.77822,51.273429],[108.778413,51.272823],[108.778607,51.272201],[108.779261,51.269835],[108.780109,51.267056],[108.780323,51.26645],[108.781064,51.264616],[108.781342,51.264042],[108.781997,51.262926],[108.782297,51.262368],[108.782544,51.261815],[108.782684,51.261263],[108.782673,51.260726],[108.782523,51.260233],[108.782276,51.259761],[108.781965,51.259283],[108.781589,51.258795],[108.781289,51.258302],[108.781139,51.257953],[108.781042,51.257266],[108.781096,51.256923],[108.781493,51.255904],[108.781772,51.255362],[108.782394,51.254257],[108.784314,51.251006],[108.785977,51.248238],[108.787544,51.245524],[108.787909,51.24496],[108.788745,51.243834],[108.789196,51.243303],[108.789668,51.242788],[108.79014,51.24231],[108.790634,51.241844],[108.791707,51.240948],[108.792286,51.240492],[108.792919,51.240041],[108.793584,51.239601],[108.794292,51.239156],[108.798305,51.236721],[108.798895,51.236318],[108.800021,51.235455],[108.803744,51.232204],[108.804409,51.231678],[108.805118,51.231179],[108.805858,51.230686],[108.806888,51.230047],[108.807435,51.229742],[108.808572,51.229146],[108.813239,51.226786],[108.819076,51.223841],[108.820449,51.223127],[108.824451,51.22111],[108.831425,51.217591],[108.833731,51.216427],[108.836553,51.215016],[108.839525,51.21353],[108.842713,51.211902],[108.843473,51.211513],[108.847,51.209737],[108.848453,51.209006],[108.848884,51.208788],[108.8524,51.207018],[108.853282,51.206586],[108.854058,51.206198],[108.854251,51.206098],[108.854429,51.206008],[108.854708,51.205879],[108.854927,51.205778],[108.855104,51.205703],[108.855521,51.205555],[108.856182,51.205328],[108.856947,51.205093],[108.857972,51.204784],[108.858374,51.204676],[108.859341,51.204381],[108.859996,51.204123],[108.860648,51.203828],[108.863,51.202512],[108.865141,51.201289],[108.866086,51.200784],[108.866475,51.200563],[108.867162,51.200173],[108.868113,51.199632],[108.868428,51.199454],[108.869223,51.198979],[108.869984,51.198513],[108.870565,51.198153],[108.870849,51.197978],[108.871368,51.197657],[108.872709,51.196713],[108.873385,51.196203],[108.874018,51.195677],[108.874244,51.195473],[108.874341,51.195384],[108.875842,51.19402],[108.876979,51.192883],[108.878589,51.191225],[108.879114,51.190715],[108.879672,51.190249],[108.880284,51.18983],[108.880938,51.18946],[108.881679,51.189144],[108.884318,51.188189],[108.887064,51.187229],[108.887976,51.186914],[108.888391,51.18677],[108.891399,51.185732],[108.892268,51.185415],[108.896162,51.184085],[108.897753,51.183497],[108.898846,51.18311],[108.899476,51.182902],[108.900004,51.182719],[108.903344,51.181579],[108.904253,51.181253],[108.904478,51.181172],[108.904915,51.181007],[108.905138,51.180909],[108.905761,51.180652],[108.906983,51.180071],[108.907608,51.179774],[108.908774,51.179137],[108.909379,51.17874],[108.9098,51.178439],[108.910316,51.178083],[108.91147,51.177133],[108.912931,51.175925],[108.914039,51.175025],[108.914627,51.174516],[108.917562,51.172079],[108.920023,51.169971],[108.920517,51.169558],[108.921525,51.168764],[108.92204,51.168394],[108.922566,51.16804],[108.922797,51.167894],[108.923092,51.167707],[108.92365,51.16738],[108.924261,51.167069],[108.924937,51.166779],[108.925667,51.166506],[108.926429,51.16627],[108.927212,51.166082],[108.927973,51.165937],[108.928735,51.165824],[108.929486,51.165739],[108.930203,51.165652],[108.931012,51.165588],[108.93255,51.165545],[108.934108,51.165529],[108.935862,51.165531],[108.944045,51.165529],[108.946824,51.16554],[108.948798,51.165519],[108.95368,51.165487],[108.959334,51.165454],[108.965514,51.165428],[108.967552,51.165428],[108.968558,51.165479],[108.969523,51.165533],[108.970293,51.165605],[108.970666,51.165622],[108.971575,51.165765],[108.972178,51.165867],[108.972882,51.16599],[108.973414,51.166171],[108.974216,51.166504],[108.975054,51.166895],[108.975701,51.167222],[108.976511,51.167702],[108.976562,51.167734],[108.97723,51.16812],[108.981221,51.170615],[108.983543,51.172069],[108.984168,51.172475],[108.984766,51.172833],[108.98548,51.173265],[108.986553,51.173968],[108.987765,51.174708],[108.988881,51.175432],[108.99004,51.176156],[108.991531,51.177041],[108.992368,51.177455],[108.992947,51.177717],[108.99357,51.17797],[108.994203,51.178206],[108.994846,51.178431],[108.995501,51.17864],[108.99682,51.179026],[108.997807,51.179289],[108.998064,51.179355],[109.000061,51.179869],[109.002957,51.180582],[109.006927,51.181601],[109.011583,51.182744],[109.019256,51.184675],[109.019839,51.184819],[109.023198,51.185637],[109.024549,51.185977],[109.030598,51.187494],[109.031736,51.187806],[109.033689,51.188321],[109.035171,51.188708],[109.037381,51.189202],[109.038121,51.189347],[109.038872,51.189465],[109.039634,51.189545],[109.041168,51.189669],[109.041951,51.18969],[109.042745,51.189669],[109.043528,51.189642],[109.044322,51.189588],[109.045095,51.189508],[109.04665,51.189309],[109.052015,51.188419],[109.053603,51.188108],[109.056811,51.187539],[109.061564,51.186734],[109.064546,51.186203],[109.068945,51.185447],[109.073543,51.184608],[109.075146,51.184315],[109.077206,51.184036],[109.078225,51.183923],[109.079245,51.183848],[109.081326,51.183757],[109.082367,51.183768],[109.083397,51.183848],[109.08369,51.183892],[109.084406,51.184004],[109.085349,51.184165],[109.086347,51.184395],[109.086625,51.18447],[109.087392,51.184669],[109.088019,51.184851],[109.089279,51.185323],[109.089911,51.185595],[109.09063,51.185923],[109.09077,51.185988],[109.09242,51.186826],[109.093246,51.18726],[109.096615,51.189057],[109.100638,51.191273],[109.107494,51.194963],[109.110745,51.196755],[109.11362,51.198364],[109.115401,51.199239],[109.116624,51.199791],[109.117858,51.200317],[109.121881,51.201905],[109.125061,51.203179],[109.126205,51.203638],[109.129123,51.204823],[109.12982,51.205118],[109.1332,51.206459],[109.13497,51.207173],[109.135796,51.207489],[109.136644,51.207763],[109.139446,51.208432],[109.139987,51.208547],[109.140443,51.208643],[109.14187,51.208912],[109.142611,51.20904],[109.14407,51.20926],[109.14481,51.209362],[109.145865,51.209485],[109.146435,51.209544],[109.14787,51.209721],[109.150167,51.209989],[109.15249,51.21026],[109.154061,51.210443],[109.160058,51.211183],[109.167532,51.212103],[109.170371,51.212404],[109.171462,51.212524],[109.173444,51.212763],[109.175191,51.213007],[109.176347,51.213186],[109.177259,51.213373],[109.178111,51.213568],[109.178393,51.213643],[109.180058,51.214148],[109.180463,51.21428],[109.18069,51.214353],[109.181478,51.214697],[109.182183,51.21504],[109.183634,51.215847],[109.184885,51.21647],[109.185599,51.216849],[109.185864,51.217007],[109.187623,51.218017],[109.191098,51.219952],[109.198952,51.224371],[109.201752,51.225991],[109.20319,51.226796],[109.206145,51.228406],[109.207733,51.229299],[109.2081,51.229507],[109.208398,51.229656],[109.208955,51.229904],[109.209666,51.230192],[109.210267,51.230416],[109.210901,51.230616],[109.211629,51.230797],[109.211944,51.230869],[109.212464,51.230976],[109.213175,51.23108],[109.21389,51.23116],[109.21458,51.231208],[109.215018,51.231213],[109.216823,51.23119],[109.217366,51.231179],[109.220753,51.231125],[109.226589,51.231024],[109.228123,51.231007],[109.228896,51.231007],[109.232893,51.231042],[109.234799,51.23106],[109.237779,51.231088],[109.243561,51.231134],[109.244294,51.231134],[109.24548,51.231189],[109.246242,51.231226],[109.246983,51.231285],[109.247744,51.231366],[109.248527,51.231468],[109.249257,51.231618],[109.249976,51.231811],[109.250673,51.232002],[109.251962,51.232506],[109.253211,51.23305],[109.253976,51.233434],[109.254502,51.233745],[109.255242,51.234233],[109.255714,51.234587],[109.256143,51.234984],[109.256562,51.235397],[109.256959,51.235826],[109.257563,51.236581],[109.258518,51.238062],[109.260127,51.240739],[109.262145,51.243984],[109.262917,51.245271],[109.2637,51.246505],[109.26444,51.247723],[109.265256,51.248951],[109.265728,51.249552],[109.266071,51.249949],[109.266854,51.250727],[109.267466,51.251269],[109.268131,51.251768],[109.268818,51.252229],[109.269526,51.252664],[109.270309,51.253087],[109.271103,51.253474],[109.272734,51.254203],[109.273122,51.254376],[109.273874,51.254647],[109.274334,51.254801],[109.277776,51.255866],[109.280362,51.25658],[109.282068,51.257105],[109.282894,51.257379],[109.283699,51.257663],[109.284108,51.257853],[109.284439,51.258007],[109.285887,51.258763],[109.286703,51.25909],[109.287304,51.259267],[109.288237,51.25945],[109.291166,51.259911],[109.292153,51.260083],[109.298054,51.261236],[109.29902,51.261359],[109.302013,51.261697],[109.305049,51.262008],[109.30786,51.262314],[109.308783,51.262502],[109.313557,51.263838],[109.314533,51.26409],[109.315402,51.264369],[109.316218,51.264701],[109.318289,51.265592],[109.319576,51.266107],[109.320241,51.266348],[109.324039,51.26792],[109.326496,51.268971],[109.327344,51.269374],[109.328138,51.269792],[109.32891,51.270243],[109.329683,51.270667],[109.330423,51.271026],[109.331227,51.271273],[109.332172,51.271434],[109.333148,51.271525],[109.334661,51.271627],[109.334929,51.271659],[109.335186,51.271723],[109.335422,51.27182],[109.335605,51.271933],[109.335683,51.272011],[109.335884,51.272212],[109.336216,51.272764],[109.336431,51.273177],[109.33657,51.273365],[109.336742,51.273537],[109.337193,51.273821],[109.337997,51.274164],[109.341205,51.275446],[109.341742,51.275613],[109.34231,51.275693],[109.342847,51.275688],[109.343373,51.275618],[109.343845,51.275505],[109.344242,51.275318],[109.344585,51.275087],[109.344982,51.274668],[109.345561,51.273746],[109.345883,51.273279],[109.346302,51.272828],[109.346838,51.272415],[109.347471,51.272045],[109.349703,51.27101],[109.350475,51.270634],[109.352835,51.269395],[109.353383,51.269095],[109.353908,51.268778],[109.354434,51.268435],[109.354938,51.268065],[109.356419,51.266863],[109.356945,51.266472],[109.357502,51.266101],[109.358082,51.265742],[109.360464,51.264412],[109.361021,51.264068],[109.361547,51.263698],[109.361998,51.263307],[109.362395,51.262888],[109.363253,51.261885],[109.36365,51.261488],[109.364079,51.261102],[109.364551,51.260742],[109.365088,51.260404],[109.367373,51.259053],[109.368532,51.258425],[109.370849,51.257304],[109.373424,51.256161],[109.374325,51.255818],[109.375269,51.255517],[109.376267,51.255276],[109.377286,51.255061],[109.379325,51.254691],[109.379947,51.254504],[109.380795,51.254133],[109.381642,51.253731],[109.382533,51.253366],[109.390247,51.250427],[109.392436,51.249606],[109.393326,51.249246],[109.394184,51.248871],[109.394678,51.248571],[109.395279,51.248045],[109.395772,51.247482],[109.396609,51.246393],[109.397167,51.245443],[109.397435,51.244874],[109.397843,51.244161],[109.399066,51.242171],[109.399645,51.241431],[109.4003,51.240948],[109.400815,51.240658],[109.401104,51.24054],[109.402049,51.240299],[109.402705,51.24018],[109.403025,51.240122],[109.403636,51.239977],[109.404484,51.239682],[109.405267,51.239349],[109.406061,51.239038],[109.406887,51.238748],[109.407756,51.238518],[109.408668,51.238325],[109.409591,51.238174],[109.410557,51.238088],[109.411527,51.238108],[109.412604,51.238178],[109.413101,51.23823],[109.413686,51.238312],[109.417144,51.238839],[109.417852,51.23896],[109.418625,51.239092],[109.419691,51.239303],[109.420116,51.239387],[109.420867,51.239548],[109.421251,51.239639],[109.421357,51.239664],[109.422337,51.239896],[109.422812,51.240027],[109.423056,51.240095],[109.423753,51.240325],[109.425126,51.24083],[109.425813,51.241098],[109.429868,51.242713],[109.430566,51.242933],[109.431263,51.243131],[109.431961,51.243303],[109.432658,51.243453],[109.433863,51.243594],[109.434378,51.24367],[109.434944,51.243718],[109.435922,51.243752],[109.437037,51.243721],[109.437862,51.243677],[109.438564,51.243611],[109.439248,51.243531],[109.440024,51.243417],[109.440703,51.243299],[109.4414,51.243141],[109.442086,51.242951],[109.443301,51.242589],[109.444202,51.242251],[109.445071,51.241892],[109.445887,51.241495],[109.446638,51.241071],[109.448065,51.240122],[109.449481,51.239172],[109.452152,51.237386],[109.45345,51.236544],[109.454055,51.236206],[109.454094,51.236184],[109.454749,51.235895],[109.456111,51.235396],[109.458246,51.234586],[109.459566,51.234044],[109.459974,51.233851],[109.460499,51.233502],[109.460982,51.233116],[109.461465,51.23259],[109.461862,51.232027],[109.461969,51.231946],[109.462087,51.231887],[109.462237,51.231855],[109.462409,51.231839],[109.462559,51.231871],[109.462688,51.231941],[109.462795,51.232037],[109.46287,51.232156],[109.462902,51.232434],[109.462742,51.232949],[109.462656,51.233325],[109.462677,51.2337],[109.462731,51.233877],[109.462838,51.234044],[109.462999,51.234199],[109.463439,51.234473],[109.463986,51.234677],[109.464587,51.234806],[109.465542,51.234902],[109.468278,51.23502],[109.477225,51.235422],[109.479843,51.235583],[109.481496,51.235739],[109.482311,51.235846],[109.483126,51.23597],[109.484746,51.236254],[109.487085,51.236726],[109.487847,51.23686],[109.488598,51.236941],[109.489338,51.236957],[109.490046,51.236924],[109.490701,51.236833],[109.491291,51.236651],[109.492632,51.235975],[109.495089,51.234618],[109.495894,51.234232],[109.496441,51.234038],[109.496709,51.233969],[109.497299,51.233904],[109.497943,51.23391],[109.498608,51.233974],[109.499617,51.234178],[109.503264,51.235009],[109.506268,51.235728],[109.50864,51.236361],[109.510957,51.237042],[109.511697,51.237295],[109.512186,51.237477],[109.512416,51.237563],[109.517641,51.239548],[109.518231,51.239805],[109.518778,51.2401],[109.519261,51.240465],[109.519679,51.240835],[109.520034,51.241259],[109.52028,51.241726],[109.521097,51.24426],[109.521241,51.24479],[109.521256,51.244853],[109.521523,51.245946],[109.521598,51.246246],[109.521737,51.246717],[109.522081,51.247885],[109.522228,51.24838],[109.522403,51.248861],[109.522622,51.249295],[109.523005,51.249762],[109.523431,51.250204],[109.525183,51.251398],[109.525731,51.251832],[109.526246,51.252272],[109.526728,51.252717],[109.527168,51.253157],[109.527973,51.254053],[109.528992,51.255351],[109.529303,51.255797],[109.529529,51.256231],[109.5297,51.256671],[109.52985,51.257148],[109.530709,51.260485],[109.530902,51.261032],[109.531159,51.261553],[109.531449,51.262046],[109.531771,51.262518],[109.532436,51.263403],[109.533112,51.26424],[109.533498,51.264626],[109.534121,51.265174],[109.534625,51.265737],[109.535022,51.266327],[109.535311,51.266912],[109.535569,51.267486],[109.535998,51.268607],[109.536245,51.26917],[109.536556,51.269717],[109.536974,51.270243],[109.537532,51.270704],[109.538208,51.271155],[109.540386,51.272442],[109.540858,51.272775],[109.541234,51.273145],[109.541835,51.274046],[109.542843,51.275645],[109.545085,51.279513],[109.546984,51.282662],[109.548082,51.284544],[109.548358,51.285016],[109.548658,51.285596],[109.548683,51.285645],[109.548808,51.285886],[109.549195,51.286508],[109.54971,51.287071],[109.550144,51.287392],[109.550364,51.287554],[109.550868,51.287833],[109.551737,51.288165],[109.552692,51.28845],[109.553368,51.288605],[109.557524,51.289434],[109.558312,51.289594],[109.559587,51.289856],[109.560626,51.29008],[109.561579,51.290262],[109.56233,51.290401],[109.563092,51.290508],[109.563854,51.290546],[109.564605,51.290535],[109.565367,51.290476],[109.566107,51.290374],[109.566607,51.290295],[109.566763,51.290265],[109.569236,51.289785],[109.571071,51.289458],[109.571693,51.289378],[109.572658,51.289383],[109.573002,51.28941],[109.573957,51.289598],[109.574826,51.289871],[109.575351,51.290091],[109.576049,51.29051],[109.576435,51.290837],[109.576864,51.291411],[109.5771,51.291856],[109.577304,51.29235],[109.577669,51.293364],[109.577883,51.293868],[109.578656,51.295348],[109.579267,51.296314],[109.579611,51.29677],[109.580033,51.297267],[109.58034,51.297628],[109.581166,51.298422],[109.583452,51.300337],[109.585855,51.302435],[109.587765,51.304178],[109.589106,51.305466],[109.589975,51.306335],[109.591359,51.307772],[109.593548,51.310186],[109.594363,51.311109],[109.595232,51.311983],[109.596198,51.312793],[109.596734,51.313185],[109.597313,51.31355],[109.597957,51.313893],[109.598612,51.314215],[109.599963,51.314805],[109.600639,51.315079],[109.602109,51.315615],[109.603611,51.316189],[109.609705,51.318399],[109.615778,51.320604],[109.620327,51.322272],[109.621829,51.322836],[109.62479,51.323892],[109.626903,51.32459],[109.628921,51.325217],[109.630505,51.325676],[109.632558,51.326269],[109.635225,51.327042],[109.636843,51.32751],[109.637411,51.32768],[109.638737,51.328061],[109.639546,51.328316],[109.640872,51.328753],[109.642965,51.329498],[109.644241,51.329986],[109.644842,51.33026],[109.64673,51.33115],[109.649134,51.332352],[109.650807,51.333366],[109.655549,51.336311],[109.657234,51.337303],[109.658382,51.33791],[109.659004,51.338183],[109.659659,51.338446],[109.662352,51.339498],[109.663027,51.339739],[109.663714,51.339959],[109.665774,51.340581],[109.666439,51.340801],[109.673434,51.342872],[109.677029,51.343966],[109.678874,51.344508],[109.687221,51.347035],[109.690021,51.347887],[109.690708,51.348102],[109.691362,51.348333],[109.691974,51.348579],[109.692821,51.348982],[109.694345,51.349851],[109.694502,51.349932],[109.695117,51.350248],[109.695933,51.350607],[109.69678,51.350918],[109.697703,51.351187],[109.698443,51.351348],[109.699935,51.3516],[109.700664,51.351702],[109.701694,51.351889],[109.702703,51.352147],[109.703336,51.352351],[109.705278,51.353037],[109.708807,51.354314],[109.710664,51.354963],[109.712455,51.355559],[109.714236,51.356106],[109.716822,51.356819],[109.72636,51.359255],[109.727315,51.359507],[109.728237,51.35977],[109.729106,51.360065],[109.72989,51.360419],[109.730372,51.360687],[109.730984,51.36117],[109.731832,51.361921],[109.732628,51.362592],[109.732998,51.362887],[109.733763,51.363466],[109.734288,51.363836],[109.735093,51.364313],[109.736305,51.364941],[109.736949,51.365247],[109.737625,51.365531],[109.738344,51.365805],[109.738986,51.366029],[109.739803,51.366314],[109.740533,51.366545],[109.741251,51.366749],[109.74197,51.366926],[109.744127,51.36735],[109.744835,51.367505],[109.745511,51.367693],[109.74582,51.367808],[109.746433,51.368036],[109.748558,51.368921],[109.74918,51.3692],[109.749759,51.369517],[109.750264,51.369887],[109.750704,51.370279],[109.751068,51.370697],[109.752377,51.372553],[109.752774,51.373073],[109.753536,51.373948],[109.753965,51.374334],[109.754373,51.374624],[109.755124,51.37509],[109.755682,51.375391],[109.756283,51.375681],[109.757516,51.376265],[109.764672,51.379511],[109.767784,51.380959],[109.769618,51.38178],[109.771442,51.382638],[109.77332,51.383486],[109.786939,51.389654],[109.787332,51.389839],[109.788936,51.390541],[109.789767,51.390937],[109.79157,51.391731],[109.794273,51.392868],[109.797535,51.394193],[109.799595,51.395051],[109.800914,51.395572],[109.801775,51.395891],[109.802331,51.396097],[109.803971,51.396686],[109.805018,51.397111],[109.80659,51.397709],[109.807691,51.398125],[109.811438,51.399529],[109.814612,51.400655],[109.815913,51.401112],[109.816361,51.401282],[109.817744,51.401802],[109.821525,51.403162],[109.822081,51.403354],[109.826159,51.404809],[109.83176,51.406789],[109.837199,51.408758],[109.839045,51.409439],[109.84177,51.410399],[109.842255,51.410591],[109.842596,51.410726],[109.8456,51.412019],[109.846941,51.412615],[109.848872,51.413548],[109.849239,51.413736],[109.850085,51.41417],[109.851834,51.415114],[109.856876,51.417984],[109.858786,51.41902],[109.860674,51.419964],[109.862519,51.420827],[109.863732,51.421369],[109.865223,51.421992],[109.866747,51.422587],[109.869182,51.423563],[109.869815,51.423789],[109.871113,51.424196],[109.873044,51.424765],[109.873198,51.424812],[109.874933,51.425339],[109.876638,51.42578],[109.877118,51.42591],[109.880705,51.426862],[109.88167,51.427077],[109.882625,51.427238],[109.883527,51.427377],[109.884417,51.427474],[109.885265,51.427501],[109.88608,51.427479],[109.886928,51.42742],[109.887915,51.427334],[109.888955,51.4272],[109.889674,51.427098],[109.892635,51.426632],[109.894867,51.42624],[109.896358,51.426009],[109.901497,51.425151],[109.905156,51.424566],[109.908085,51.424073],[109.911861,51.423456],[109.91407,51.423071],[109.914761,51.422957],[109.917172,51.422576],[109.921936,51.42182],[109.924403,51.421396],[109.925219,51.421278],[109.933609,51.419894],[109.934317,51.419765],[109.935733,51.41947],[109.938222,51.419025],[109.940679,51.418515],[109.943125,51.417979],[109.949702,51.416477],[109.953757,51.415554],[109.956096,51.415002],[109.95762,51.414621],[109.959133,51.414235],[109.960656,51.413816],[109.963649,51.413022],[109.966632,51.412191],[109.97148,51.410835],[109.972103,51.410672],[109.976031,51.409632],[109.979987,51.408427],[109.980796,51.408205],[109.98331,51.407549],[109.984152,51.407367],[109.985011,51.407239],[109.985955,51.407164],[109.986942,51.407175],[109.987918,51.407261],[109.988851,51.407384],[109.989721,51.407572],[109.992177,51.408205],[109.993368,51.408446],[109.993497,51.408441],[109.993787,51.408548],[109.993916,51.408618],[109.994184,51.408811],[109.994237,51.408886],[109.994817,51.40945],[109.995761,51.410276],[109.997102,51.411397],[109.999698,51.413473],[110.000364,51.413982],[110.001973,51.415152],[110.002681,51.415651],[110.003278,51.416009],[110.003432,51.416101],[110.004215,51.416493],[110.005835,51.41719],[110.006672,51.417512],[110.007541,51.417802],[110.008442,51.418081],[110.009376,51.418338],[110.012798,51.419073],[110.014601,51.419492],[110.017465,51.420275],[110.019656,51.42086],[110.02012,51.421012],[110.02055,51.421171],[110.020759,51.421278],[110.021038,51.421589],[110.022143,51.423064],[110.0274,51.43044],[110.028033,51.431261],[110.028387,51.431658],[110.02901,51.4322],[110.029482,51.43257],[110.030039,51.432935],[110.030662,51.433305],[110.031306,51.433643],[110.031981,51.433927],[110.03269,51.434153],[110.033419,51.434351],[110.035107,51.434718],[110.038664,51.435449],[110.04166,51.436066],[110.042108,51.436152],[110.045128,51.436754],[110.045907,51.436896],[110.047022,51.437099],[110.047426,51.437169],[110.051936,51.4379],[110.058041,51.438748],[110.070762,51.440659],[110.074587,51.441244],[110.077051,51.441603],[110.079227,51.441915],[110.080259,51.442011],[110.081276,51.442054],[110.082125,51.442033],[110.082789,51.441947],[110.083364,51.441807],[110.083898,51.441609],[110.084531,51.441287],[110.08522,51.440831],[110.085596,51.440525],[110.085926,51.440196],[110.087186,51.438766],[110.087604,51.4383],[110.087954,51.437917],[110.088354,51.43756],[110.089141,51.436945],[110.090487,51.435956],[110.093265,51.434024],[110.096387,51.431771],[110.099755,51.429314],[110.10188,51.427801],[110.102566,51.427334],[110.104959,51.42557],[110.105442,51.425135],[110.105807,51.424668],[110.106064,51.424196],[110.106611,51.422769],[110.106922,51.422292],[110.107287,51.421847],[110.107577,51.421562],[110.108081,51.421187],[110.108736,51.42086],[110.109508,51.420602],[110.113124,51.419599],[110.114883,51.419052],[110.119124,51.417568],[110.121285,51.416838],[110.12731,51.414804],[110.129333,51.414102],[110.130602,51.413678],[110.131018,51.413539],[110.135199,51.412142],[110.13721,51.411547],[110.138529,51.411096],[110.140514,51.410463],[110.141448,51.410142],[110.142285,51.40975],[110.142982,51.409305],[110.143626,51.408822],[110.14781,51.405415],[110.154591,51.399928],[110.155224,51.39944],[110.157795,51.397328],[110.158378,51.396849],[110.160159,51.395464],[110.160824,51.394998],[110.161296,51.394762],[110.1618,51.394574],[110.162626,51.394376],[110.163614,51.394177],[110.166757,51.393614],[110.168796,51.393255],[110.169858,51.393057],[110.173398,51.392477],[110.177314,51.391854],[110.178548,51.391629],[110.179417,51.391506],[110.181155,51.391205],[110.18284,51.390878],[110.18447,51.390588],[110.186917,51.390186],[110.189427,51.3898],[110.192227,51.389333],[110.192989,51.389215],[110.193719,51.389118],[110.194416,51.388995],[110.195317,51.388915],[110.196218,51.388845],[110.196948,51.388807],[110.197753,51.388786],[110.199351,51.388791],[110.200177,51.388845],[110.20184,51.38899],[110.203482,51.389172],[110.206722,51.389612],[110.209039,51.389982],[110.211925,51.390406],[110.212644,51.390518],[110.213417,51.390663],[110.214372,51.390814],[110.22009,51.391624],[110.220347,51.391663],[110.226216,51.392573],[110.235035,51.393855],[110.241044,51.394799],[110.243275,51.395121],[110.246698,51.395663],[110.250839,51.39628],[110.258725,51.397471],[110.259561,51.397605],[110.261147,51.397826],[110.261468,51.397871],[110.2616,51.397889],[110.261793,51.397905],[110.262179,51.397963],[110.262545,51.398021],[110.262647,51.398041],[110.262912,51.398081],[110.263178,51.398121],[110.264494,51.39835],[110.265474,51.398577],[110.266535,51.398866],[110.267984,51.399279],[110.269378,51.399729],[110.27014,51.400003],[110.272801,51.401076],[110.274904,51.40188],[110.275547,51.402063],[110.276459,51.402234],[110.276931,51.402283],[110.277865,51.402288],[110.278702,51.402208],[110.279281,51.402106],[110.280011,51.401891],[110.280665,51.40166],[110.281116,51.401451],[110.282382,51.400695],[110.28309,51.4004],[110.283658,51.400217],[110.283948,51.400148],[110.284249,51.40011],[110.28471,51.400115],[110.28516,51.400158],[110.285718,51.400276],[110.286469,51.400502],[110.286877,51.400657],[110.287414,51.400947],[110.287725,51.401167],[110.288579,51.401962],[110.289441,51.40246],[110.289846,51.40257],[110.29046,51.402688],[110.29104,51.402723],[110.291491,51.402706],[110.29178,51.402674],[110.292531,51.402503],[110.293111,51.402326],[110.293636,51.402079],[110.294806,51.40136],[110.295213,51.401172],[110.295643,51.401022],[110.296115,51.400925],[110.296436,51.400888],[110.297188,51.400888],[110.29796,51.400942],[110.298657,51.40106],[110.299387,51.401231],[110.300031,51.401349],[110.300749,51.401419],[110.30137,51.401461],[110.301944,51.401458],[110.302663,51.401373],[110.304078,51.401127],[110.306136,51.400778],[110.308287,51.400437],[110.309026,51.400298],[110.309308,51.400209],[110.309785,51.399999],[110.310062,51.399784],[110.310314,51.399573],[110.310524,51.399334],[110.310749,51.39901],[110.310845,51.398646],[110.310802,51.398275],[110.31062,51.397739],[110.30974,51.39525],[110.309161,51.393893],[110.309097,51.393544],[110.309118,51.392675],[110.309279,51.391146],[110.309354,51.389666],[110.309536,51.388673],[110.309783,51.387665],[110.309987,51.387171],[110.311232,51.38451],[110.312154,51.382445],[110.312498,51.381973],[110.312862,51.381608],[110.313367,51.38119],[110.313892,51.380804],[110.314397,51.380466],[110.314804,51.380235],[110.315459,51.379994],[110.316982,51.379559],[110.317851,51.37935],[110.323033,51.378196],[110.324418,51.377893],[110.328795,51.376936],[110.332507,51.376088],[110.333215,51.375943],[110.33402,51.37582],[110.334942,51.375707],[110.335865,51.3756],[110.33682,51.375509],[110.339599,51.375321],[110.343311,51.375112],[110.346926,51.374876],[110.347806,51.374806],[110.348654,51.374704],[110.348832,51.374676],[110.349491,51.37457],[110.350263,51.374398],[110.351003,51.3742],[110.351551,51.373991],[110.352205,51.373637],[110.352849,51.373245],[110.354093,51.372392],[110.356497,51.370638],[110.358835,51.368948],[110.360348,51.367886],[110.366292,51.363809],[110.367944,51.36272],[110.368599,51.36233],[110.369124,51.362017],[110.370305,51.361395],[110.371494,51.360851],[110.371571,51.360816],[110.372686,51.360312],[110.373267,51.360049],[110.385829,51.354373],[110.38702,51.353847],[110.387825,51.353542],[110.388619,51.353268],[110.389445,51.353043],[110.391215,51.35264],[110.392599,51.352351],[110.393307,51.352217],[110.395517,51.351846],[110.399154,51.351187],[110.399473,51.351133],[110.401279,51.350833],[110.402716,51.350618],[110.409197,51.349668],[110.412244,51.349255],[110.413958,51.348978],[110.414798,51.348842],[110.415689,51.348697],[110.417341,51.34838],[110.418156,51.348182],[110.41895,51.347978],[110.420549,51.347526],[110.421246,51.347329],[110.421911,51.347098],[110.422587,51.346836],[110.423231,51.346573],[110.425055,51.345773],[110.426503,51.345081],[110.427201,51.344695],[110.427759,51.344341],[110.428927,51.343601],[110.433798,51.340383],[110.434828,51.339723],[110.435514,51.339304],[110.436255,51.338934],[110.437049,51.338602],[110.437691,51.338336],[110.440299,51.337475],[110.440965,51.337271],[110.44163,51.337105],[110.442469,51.336884],[110.443192,51.336769],[110.444572,51.336578],[110.446331,51.336358],[110.447313,51.336271],[110.449587,51.336051],[110.450274,51.335967],[110.452412,51.335748],[110.453301,51.335742],[110.454227,51.335751],[110.454365,51.33576],[110.455111,51.335808],[110.456042,51.335915],[110.457603,51.336098],[110.459401,51.336341],[110.460223,51.336454],[110.46081,51.33656],[110.461112,51.336616],[110.462006,51.336804],[110.463691,51.337194],[110.464553,51.337396],[110.464585,51.337403],[110.466311,51.337808],[110.469454,51.338568],[110.470258,51.338737],[110.47084,51.338847],[110.471313,51.338919],[110.472842,51.33913],[110.473361,51.339189],[110.473683,51.339226],[110.47459,51.339299],[110.475042,51.339322],[110.475429,51.339332],[110.476089,51.339342],[110.476949,51.339331],[110.479193,51.339265],[110.4799,51.339236],[110.480687,51.339142],[110.480987,51.339094],[110.481454,51.339018],[110.482228,51.338885],[110.487592,51.338076],[110.488311,51.33799],[110.489062,51.337931],[110.490725,51.337861],[110.491455,51.337867],[110.492989,51.337904],[110.49374,51.337942],[110.49448,51.338001],[110.495199,51.338071],[110.495907,51.338156],[110.496808,51.338285],[110.497645,51.338435],[110.498503,51.338628],[110.498727,51.338686],[110.499834,51.338972],[110.500714,51.339224],[110.501347,51.339433],[110.50198,51.339658],[110.502773,51.339975],[110.504157,51.34057],[110.506217,51.341622],[110.508159,51.342523],[110.508251,51.342562],[110.508296,51.342581],[110.508748,51.342747],[110.509211,51.342922],[110.509714,51.343112],[110.509744,51.343123],[110.511109,51.343613],[110.512487,51.344051],[110.514156,51.344581],[110.514287,51.344623],[110.515589,51.344951],[110.517976,51.345433],[110.519806,51.345723],[110.52091,51.345874],[110.522264,51.346049],[110.523459,51.346164],[110.525227,51.346256],[110.525768,51.346272],[110.526565,51.346296],[110.527008,51.346289],[110.527419,51.346283],[110.529192,51.346217],[110.532567,51.346091],[110.533369,51.34605],[110.534885,51.345973],[110.53534,51.345954],[110.538316,51.345829],[110.539594,51.345776],[110.542808,51.345652],[110.547694,51.34552],[110.547974,51.345512],[110.549994,51.34542],[110.551614,51.345306],[110.553432,51.345133],[110.555215,51.344928],[110.557713,51.344644],[110.558746,51.344508],[110.560516,51.344234],[110.561289,51.344073],[110.561986,51.343891],[110.562683,51.343671],[110.563413,51.343419],[110.564142,51.343124],[110.565565,51.34246],[110.565602,51.342443],[110.568016,51.341279],[110.570397,51.340131],[110.571889,51.339444],[110.572575,51.339143],[110.573895,51.338634],[110.574582,51.338376],[110.575322,51.33814],[110.576931,51.337695],[110.577714,51.337507],[110.578487,51.337357],[110.579281,51.337223],[110.580118,51.3371],[110.580955,51.336998],[110.582585,51.336821],[110.58412,51.336681],[110.585729,51.336483],[110.587104,51.336267],[110.587338,51.336231],[110.588915,51.335936],[110.590643,51.335501],[110.59605,51.334047],[110.59679,51.333822],[110.597316,51.333623],[110.597981,51.333286],[110.598625,51.332915],[110.59988,51.332121],[110.600492,51.331671],[110.601017,51.331193],[110.601436,51.330721],[110.601768,51.330265],[110.602058,51.329783],[110.602337,51.329246],[110.602584,51.328699],[110.602798,51.328146],[110.602949,51.327594],[110.603013,51.327068],[110.602949,51.325271],[110.60297,51.324595],[110.603024,51.324064],[110.603195,51.323544],[110.603678,51.322648],[110.603989,51.322203],[110.605516,51.320192],[110.608281,51.31679],[110.609719,51.3151],[110.611478,51.313094],[110.612401,51.312075],[110.612873,51.311576],[110.613345,51.31112],[110.613838,51.310701],[110.614922,51.309832],[110.618505,51.307059],[110.619643,51.306227],[110.620168,51.305868],[110.620716,51.305541],[110.621381,51.305208],[110.622078,51.304892],[110.622754,51.304602],[110.623473,51.304355],[110.624964,51.303915],[110.626391,51.303556],[110.628236,51.303041],[110.628912,51.302869],[110.630254,51.302569],[110.631069,51.302435],[110.634566,51.301973],[110.638804,51.301442],[110.643589,51.300858],[110.645156,51.300638],[110.646025,51.300482],[110.648503,51.29994],[110.651776,51.299152],[110.652494,51.298953],[110.65316,51.298744],[110.6539,51.29846],[110.654576,51.298116],[110.655123,51.297773],[110.656217,51.296979],[110.66023,51.293889],[110.661732,51.292727],[110.662368,51.292263],[110.662861,51.291959],[110.663402,51.291664],[110.663441,51.291649],[110.664345,51.29129],[110.665806,51.29074],[110.668999,51.289731],[110.669081,51.289705],[110.671087,51.289029],[110.673909,51.288037],[110.676892,51.287017],[110.67893,51.286299],[110.681001,51.285607],[110.683179,51.284845],[110.684541,51.284394],[110.689938,51.282543],[110.692921,51.281573],[110.693725,51.281272],[110.694938,51.280709],[110.695348,51.280524],[110.696783,51.279877],[110.697792,51.279384],[110.698929,51.278708],[110.700296,51.277798],[110.70103,51.277283],[110.701515,51.276919],[110.702012,51.276525],[110.703231,51.275296],[110.703628,51.274872],[110.704379,51.274019],[110.705366,51.272759],[110.706289,51.271369],[110.706578,51.270892],[110.707104,51.269942],[110.708198,51.267561],[110.708595,51.266563],[110.708928,51.26557],[110.709336,51.264026],[110.710033,51.260984],[110.710269,51.260045],[110.710355,51.259573],[110.710409,51.259112],[110.710666,51.256601],[110.710698,51.256086],[110.710698,51.2554],[110.710666,51.25438],[110.71056,51.253287],[110.710323,51.251897],[110.710248,51.250936],[110.71013,51.249939],[110.70969,51.247331],[110.709544,51.246363],[110.709489,51.24601],[110.709239,51.244939],[110.709003,51.243925],[110.708445,51.24179],[110.70704,51.236597],[110.706525,51.234473],[110.705849,51.231919],[110.705602,51.230879],[110.704755,51.227725],[110.704433,51.226743],[110.703692,51.22471],[110.703295,51.223787],[110.702566,51.222467],[110.702308,51.222011],[110.702008,51.221555],[110.701826,51.221217],[110.701557,51.220912],[110.700195,51.218863],[110.699852,51.218449],[110.698437,51.216744],[110.69646,51.214666],[110.693554,51.212174],[110.693113,51.21186],[110.692691,51.211506],[110.692192,51.211143],[110.690263,51.209732],[110.689798,51.209371],[110.687279,51.207478],[110.685308,51.205869],[110.683736,51.204488],[110.683029,51.203867],[110.678347,51.199176],[110.669374,51.189998],[110.666985,51.187014],[110.663881,51.182574],[110.662326,51.180427],[110.662021,51.179984],[110.651349,51.164385],[110.649429,51.161566],[110.64902,51.16097],[110.648355,51.159997],[110.647822,51.159248],[110.646787,51.157794],[110.645016,51.155096],[110.644289,51.154104],[110.644053,51.15374],[110.643969,51.153611],[110.643514,51.152966],[110.642828,51.152038],[110.642527,51.151582],[110.641594,51.150284],[110.641326,51.14986],[110.641036,51.149291],[110.640864,51.148851],[110.640714,51.148256],[110.64066,51.147811],[110.640682,51.147215],[110.640811,51.146636],[110.640982,51.146062],[110.641369,51.14522],[110.641799,51.144656],[110.642211,51.144177],[110.642756,51.143699],[110.643474,51.143167],[110.644285,51.142702],[110.645056,51.142343],[110.645933,51.142011],[110.649721,51.140894],[110.651622,51.140336],[110.655782,51.139286],[110.659091,51.138435],[110.660686,51.13797],[110.664288,51.136827],[110.66809,51.135578],[110.669671,51.135099],[110.67427,51.133876],[110.676824,51.133083],[110.677443,51.132847],[110.67816,51.132528],[110.678428,51.132394],[110.679431,51.13189],[110.681102,51.131032],[110.68287,51.129982],[110.686398,51.12778],[110.688093,51.126691],[110.688608,51.126375],[110.689101,51.125994],[110.689595,51.12564],[110.690099,51.125302],[110.69115,51.124631],[110.691655,51.124288],[110.691794,51.124175],[110.693897,51.122877],[110.695249,51.122072],[110.695646,51.121816],[110.696145,51.12145],[110.696772,51.12101],[110.697277,51.120522],[110.697684,51.120023],[110.697824,51.11976],[110.697879,51.119212],[110.697868,51.118809],[110.697799,51.118133],[110.697765,51.11785],[110.697559,51.116392],[110.697227,51.115761],[110.696926,51.115271],[110.696551,51.114854],[110.696055,51.114533],[110.691842,51.112726],[110.690436,51.112173],[110.689069,51.111542],[110.687385,51.110705],[110.686767,51.110369],[110.686151,51.11011],[110.685299,51.109803],[110.684445,51.109625],[110.684009,51.109593],[110.683713,51.109551],[110.682656,51.10951],[110.681628,51.10948],[110.68087,51.109263],[110.680384,51.109098],[110.679597,51.108744],[110.679398,51.108641],[110.679157,51.108375],[110.678996,51.108172],[110.678878,51.107882],[110.678812,51.107503],[110.678799,51.107066],[110.678934,51.106553],[110.679087,51.106093],[110.67928,51.105578],[110.679376,51.105278],[110.679392,51.105103],[110.679263,51.104372],[110.678917,51.103747],[110.67808,51.102498],[110.677455,51.101461],[110.676937,51.100331],[110.676445,51.099188],[110.676334,51.098726],[110.676323,51.098592],[110.676366,51.09805],[110.676516,51.097471],[110.676999,51.0964],[110.677267,51.095883],[110.6776,51.095363],[110.677965,51.094859],[110.67834,51.094381],[110.679156,51.093399],[110.679402,51.093013],[110.679585,51.092589],[110.679681,51.091999],[110.679638,51.091425],[110.679306,51.090326],[110.679177,51.090074],[110.678823,51.089575],[110.678537,51.089132],[110.678355,51.088829],[110.678194,51.088586],[110.678041,51.08838],[110.677644,51.087849],[110.677284,51.087397],[110.676173,51.085959],[110.676066,51.08582],[110.675942,51.085595],[110.675706,51.085177],[110.67481,51.083711],[110.674617,51.08325],[110.674167,51.082381],[110.673298,51.080493],[110.672547,51.078722],[110.672117,51.077805],[110.671313,51.075836],[110.671152,51.075327],[110.671012,51.074812],[110.670766,51.073278],[110.670723,51.072779],[110.670701,51.071395],[110.670723,51.070316],[110.670798,51.069201],[110.670916,51.068069],[110.671002,51.067495],[110.671238,51.066336],[110.671731,51.064711],[110.6723,51.06264],[110.672793,51.060644],[110.672986,51.059647],[110.673029,51.059153],[110.67304,51.058654],[110.673019,51.056916],[110.673029,51.053499],[110.673008,51.052764],[110.672997,51.049079],[110.673008,51.048585],[110.673072,51.048129],[110.673265,51.04719],[110.673394,51.046702],[110.673759,51.045694],[110.67422,51.044573],[110.674478,51.044036],[110.674778,51.043516],[110.6751,51.043017],[110.675625,51.042326],[110.675928,51.041887],[110.676484,51.041155],[110.676913,51.040694],[110.677364,51.040227],[110.677857,51.039766],[110.678372,51.039332],[110.679883,51.038172],[110.680112,51.037987],[110.68054,51.037615],[110.681097,51.037234],[110.681688,51.036891],[110.683136,51.036134],[110.683844,51.035855],[110.6854,51.03534],[110.69055,51.033549],[110.694219,51.032358],[110.698124,51.031043],[110.698886,51.030775],[110.700474,51.030185],[110.702984,51.029322],[110.705495,51.028469],[110.709743,51.027068],[110.713793,51.02575],[110.714608,51.025497],[110.71492,51.025383],[110.715272,51.025274],[110.71585,51.025098],[110.716588,51.024868],[110.717254,51.02466],[110.718005,51.02444],[110.719635,51.023946],[110.721234,51.023421],[110.722307,51.023045],[110.725857,51.021994],[110.726333,51.02182],[110.727228,51.021546],[110.728669,51.021093],[110.729912,51.020647],[110.731242,51.02007],[110.731654,51.019859],[110.734034,51.018732],[110.735482,51.017981],[110.73619,51.017579],[110.738304,51.016275],[110.73898,51.015841],[110.743154,51.013218],[110.743764,51.01288],[110.7459,51.01164],[110.747766,51.010428],[110.74914,51.009484],[110.751232,51.008084],[110.752712,51.007392],[110.753421,51.007032],[110.754117,51.006693],[110.754565,51.006474],[110.756746,51.005584],[110.760287,51.004431],[110.761231,51.004141],[110.762165,51.003873],[110.763087,51.003626],[110.765823,51.00295],[110.770318,51.001866],[110.771166,51.001646],[110.772786,51.001164],[110.774513,51.000665],[110.776917,50.999828],[110.777764,50.999442],[110.778569,50.999045],[110.780125,50.998197],[110.780833,50.997763],[110.781047,50.997612],[110.781519,50.997317],[110.782517,50.996277],[110.783923,50.994737],[110.785253,50.993305],[110.78609,50.992334],[110.788136,50.990235],[110.788477,50.989909],[110.789523,50.989049],[110.790004,50.988647],[110.791009,50.987823],[110.791755,50.987243],[110.792366,50.986825],[110.79301,50.986444],[110.795124,50.985392],[110.797312,50.984362],[110.798707,50.983745],[110.798964,50.983649],[110.799136,50.983542],[110.79993,50.983241],[110.801614,50.98264],[110.802494,50.982351],[110.80331,50.98204],[110.806743,50.980779],[110.807011,50.980661],[110.809404,50.979856],[110.811152,50.979304],[110.813749,50.978681],[110.815433,50.978333],[110.820315,50.97755],[110.824242,50.976965],[110.825261,50.976831],[110.827342,50.9766],[110.829413,50.976407],[110.832492,50.976203],[110.833501,50.976149],[110.834541,50.976117],[110.836719,50.976074],[110.839552,50.976064],[110.841644,50.976085],[110.842717,50.976106],[110.843747,50.976144],[110.84756,50.976409],[110.85115,50.976654],[110.853059,50.976804],[110.86026,50.977323],[110.860696,50.97735],[110.864816,50.977639],[110.867275,50.977812],[110.873466,50.978256],[110.873984,50.978296],[110.875676,50.978381],[110.876448,50.978408],[110.877993,50.978445],[110.879077,50.978445],[110.882134,50.978381],[110.88443,50.978263],[110.885922,50.97814],[110.886651,50.978059],[110.888829,50.977775],[110.889575,50.977622],[110.891742,50.977225],[110.893935,50.97679],[110.898996,50.975831],[110.902026,50.975264],[110.903431,50.97505],[110.906317,50.974508],[110.915637,50.972785],[110.918227,50.972275],[110.918832,50.972155],[110.927625,50.970537],[110.931499,50.969815],[110.931875,50.969742],[110.935757,50.969031],[110.943446,50.96758],[110.943835,50.967507],[110.954372,50.965571],[110.956394,50.965176],[110.962703,50.964084],[110.963502,50.963945],[110.964553,50.963811],[110.965573,50.963709],[110.96657,50.963669],[110.967462,50.963657],[110.967913,50.963659],[110.968402,50.963666],[110.969167,50.963688],[110.970143,50.963774],[110.971173,50.963892],[110.972203,50.964037],[110.972943,50.96416],[110.97437,50.964466],[110.975132,50.964643],[110.978833,50.965598],[110.98026,50.965941],[110.981237,50.966118],[110.982202,50.966236],[110.983586,50.966316],[110.984434,50.966303],[110.985161,50.966246],[110.986417,50.966019],[110.98883,50.965494],[110.990571,50.96514],[110.991306,50.964999],[110.992995,50.964755],[110.993907,50.964739],[110.994809,50.964777],[110.9966,50.964965],[110.99821,50.965147],[111.000795,50.96541],[111.003199,50.965555],[111.005666,50.965619],[111.00822,50.965571],[111.009046,50.965544],[111.011117,50.965395],[111.011746,50.965342],[111.01426,50.965104],[111.016306,50.964804],[111.016949,50.964697],[111.020399,50.964036],[111.02136,50.963855],[111.024302,50.963162],[111.025847,50.962889],[111.028336,50.96239],[111.031372,50.961816],[111.033089,50.961397],[111.034001,50.961204],[111.034602,50.961054],[111.03621,50.960803],[111.036415,50.96077],[111.036811,50.960714],[111.037295,50.960652],[111.038196,50.96056],[111.039065,50.960485],[111.041629,50.960367],[111.042477,50.960351],[111.043303,50.960357],[111.044097,50.960378],[111.04488,50.960416],[111.045642,50.960458],[111.048742,50.960748],[111.054332,50.96129],[111.061269,50.961929],[111.061684,50.961972],[111.068315,50.962634],[111.071286,50.962924],[111.073,50.963063],[111.073447,50.963106],[111.078204,50.963613],[111.079205,50.963713],[111.084566,50.964251],[111.08889,50.964632],[111.093128,50.964922],[111.097376,50.965185],[111.100895,50.965426],[111.103481,50.965581],[111.108159,50.965914],[111.110991,50.966091],[111.116313,50.966385],[111.119851,50.966615],[111.120234,50.96664],[111.122899,50.966814],[111.127234,50.967126],[111.130667,50.967362],[111.134207,50.967502],[111.141631,50.967737],[111.146159,50.967868],[111.146682,50.967879],[111.152458,50.968103],[111.156009,50.968226],[111.16058,50.968355],[111.165955,50.968532],[111.167757,50.96858],[111.168691,50.968591],[111.170439,50.968641],[111.173358,50.968725],[111.175901,50.968816],[111.17677,50.96887],[111.177649,50.968902],[111.178529,50.96895],[111.184848,50.969304],[111.193174,50.969809],[111.199539,50.970162],[111.200053,50.97019],[111.210061,50.970855],[111.213505,50.971075],[111.229244,50.97204],[111.230124,50.972105],[111.230993,50.972137],[111.23271,50.972239],[111.234362,50.972367],[111.235188,50.972448],[111.236658,50.972534],[111.238151,50.972612],[111.240569,50.972751],[111.243396,50.972914],[111.243911,50.972944],[111.24421,50.972955],[111.244713,50.972985],[111.244892,50.972996],[111.247616,50.973152],[111.250485,50.973327],[111.254501,50.973563],[111.254599,50.973569],[111.262128,50.974052],[111.274602,50.974779],[111.300245,50.976438],[111.311919,50.977103],[111.313873,50.97726],[111.315432,50.977361],[111.316116,50.977405],[111.317607,50.97748],[111.321652,50.977641],[111.326276,50.977775],[111.327124,50.977823],[111.327982,50.977855],[111.328862,50.977887],[111.329752,50.977904],[111.334012,50.978113],[111.338507,50.978301],[111.340277,50.978386],[111.341876,50.978478],[111.34267,50.978537],[111.343474,50.978574],[111.345899,50.978671],[111.349171,50.978773],[111.353399,50.978944],[111.354268,50.978998],[111.356735,50.9791],[111.359986,50.979261],[111.36078,50.979288],[111.362421,50.979368],[111.36416,50.97947],[111.366756,50.979583],[111.367625,50.979631],[111.370972,50.979744],[111.376047,50.979947],[111.38315,50.980264],[111.393514,50.980741],[111.396915,50.980924],[111.397773,50.980956],[111.398631,50.981015],[111.399468,50.981052],[111.402032,50.981128],[111.404629,50.981224],[111.411184,50.981535],[111.411999,50.981584],[111.418327,50.981853],[111.418482,50.981859],[111.421076,50.98197],[111.430646,50.982394],[111.431282,50.982418],[111.433146,50.98249],[111.433929,50.982544],[111.436225,50.982748],[111.437888,50.982909],[111.439537,50.983086],[111.439583,50.983091],[111.450645,50.984335],[111.453327,50.984647],[111.456921,50.985038],[111.458691,50.985269],[111.461406,50.985644],[111.464077,50.986052],[111.4675,50.986599],[111.468296,50.986729],[111.472907,50.9875],[111.474624,50.987763],[111.476426,50.987967],[111.481302,50.988462],[111.482509,50.988584],[111.490333,50.989369],[111.491171,50.989452],[111.494569,50.989813],[111.49548,50.989872],[111.496371,50.989909],[111.498173,50.989947],[111.50003,50.989925],[111.501811,50.989882],[111.50268,50.989845],[111.503549,50.989796],[111.504418,50.989695],[111.505254,50.989571],[111.506113,50.989405],[111.509503,50.988573],[111.511906,50.987919],[111.513494,50.9875],[111.516777,50.986658],[111.517603,50.986465],[111.518451,50.98631],[111.520146,50.986079],[111.521863,50.985864],[111.523536,50.985703],[111.52521,50.985607],[111.526047,50.985575],[111.527688,50.985564],[111.528504,50.985596],[111.53021,50.985709],[111.531321,50.985806],[111.53143,50.985817],[111.531841,50.985859],[111.532624,50.985977],[111.533407,50.986111],[111.535896,50.986642],[111.536733,50.986841],[111.537548,50.987061],[111.537996,50.987191],[111.539211,50.987543],[111.540027,50.987817],[111.540788,50.988144],[111.541507,50.988493],[111.542162,50.988842],[111.542848,50.989185],[111.543567,50.989528],[111.544286,50.989839],[111.545788,50.990435],[111.546539,50.990703],[111.547322,50.990907],[111.547939,50.99105],[111.549179,50.991336],[111.550337,50.991604],[111.551425,50.991877],[111.553266,50.992312],[111.554843,50.992666],[111.554985,50.992694],[111.557137,50.993118],[111.559124,50.993509],[111.560403,50.993743],[111.560471,50.993755],[111.562651,50.994146],[111.568433,50.995219],[111.571398,50.995789],[111.572299,50.995939],[111.573189,50.996062],[111.574069,50.996143],[111.574917,50.996202],[111.575354,50.99622],[111.575755,50.996216],[111.576148,50.996189],[111.57658,50.996137],[111.577478,50.995976],[111.578146,50.99586],[111.581528,50.995052],[111.583854,50.994458],[111.585868,50.993948],[111.588081,50.99338],[111.589841,50.992924],[111.592279,50.992321],[111.595073,50.991671],[111.597147,50.991234],[111.598027,50.991068],[111.598896,50.990928],[111.599776,50.990826],[111.600666,50.990741],[111.60249,50.990606],[111.604389,50.990505],[111.606234,50.990467],[111.608122,50.990507],[111.61015,50.990585],[111.610667,50.990622],[111.610924,50.990641],[111.611116,50.990655],[111.617682,50.991304],[111.621201,50.991679],[111.638422,50.993492],[111.640334,50.993654],[111.641836,50.993755],[111.643764,50.993852],[111.645663,50.993847],[111.650405,50.993707],[111.654632,50.993616],[111.656123,50.993535],[111.659299,50.993412],[111.660168,50.993396],[111.661069,50.993391],[111.662013,50.993434],[111.662936,50.993535],[111.663859,50.993707],[111.66652,50.994319],[111.667399,50.994549],[111.668236,50.994823],[111.669041,50.995107],[111.669803,50.995413],[111.670532,50.995772],[111.672002,50.99655],[111.673429,50.997355],[111.675543,50.998621],[111.680092,51.00126],[111.682377,51.002548],[111.68522,51.004205],[111.686914,51.00509],[111.687626,51.00543],[111.688514,51.005841],[111.689254,51.006126],[111.690016,51.006399],[111.690767,51.006635],[111.691496,51.006861],[111.692226,51.007054],[111.693335,51.007333],[111.694628,51.007592],[111.695984,51.007788],[111.697474,51.007964],[111.700546,51.008119],[111.702434,51.008291],[111.703325,51.008393],[111.704215,51.008558],[111.705165,51.008814],[111.706012,51.009114],[111.707718,51.009859],[111.708544,51.010246],[111.710454,51.011254],[111.714533,51.013484],[111.718243,51.015513],[111.719359,51.016152],[111.720968,51.017091],[111.726955,51.020658],[111.733618,51.024644],[111.734143,51.02495],[111.735238,51.02555],[111.736611,51.026258],[111.738263,51.027079],[111.742952,51.029289],[111.746707,51.031092],[111.748284,51.031805],[111.749078,51.032138],[111.750634,51.032755],[111.752125,51.033318],[111.752876,51.033554],[111.753659,51.033774],[111.756213,51.034455],[111.757971,51.034839],[111.759099,51.035104],[111.760403,51.035357],[111.761051,51.035474],[111.762017,51.035635],[111.763959,51.03592],[111.767789,51.036451],[111.768733,51.036563],[111.770664,51.036837],[111.774688,51.037368],[111.775696,51.037518],[111.777724,51.037867],[111.77869,51.038066],[111.779623,51.038285],[111.78149,51.0388],[111.782391,51.039106],[111.783282,51.03945],[111.784161,51.03982],[111.784955,51.040201],[111.785717,51.040619],[111.786404,51.041086],[111.78708,51.041595],[111.787755,51.042121],[111.789021,51.043205],[111.789569,51.043779],[111.789912,51.044181],[111.7915,51.04623],[111.794853,51.050669],[111.79507,51.050956],[111.795451,51.051487],[111.796693,51.053102],[111.797626,51.054304],[111.800405,51.057753],[111.800902,51.058488],[111.801091,51.058772],[111.801519,51.05955],[111.80167,51.05984],[111.8021,51.060628],[111.802826,51.062197],[111.803409,51.063563],[111.803752,51.064448],[111.804836,51.067495],[111.805072,51.06809],[111.80534,51.06868],[111.805683,51.069265],[111.806134,51.069823],[111.806681,51.070338],[111.807346,51.070794],[111.808065,51.07118],[111.808741,51.071518],[111.809418,51.071819],[111.810061,51.072041],[111.810585,51.072181],[111.811531,51.072334],[111.812545,51.072411],[111.813403,51.072423],[111.816438,51.072508],[111.817499,51.072547],[111.818504,51.072618],[111.819513,51.072832],[111.820468,51.073133],[111.821734,51.073589],[111.822957,51.074098],[111.826572,51.075842],[111.828343,51.076748],[111.829995,51.077676],[111.833782,51.07987],[111.834319,51.080198],[111.835338,51.080879],[111.837344,51.082279],[111.838374,51.083025],[111.841603,51.085283],[111.84435,51.087107],[111.845981,51.088158],[111.849961,51.090589],[111.851474,51.091452],[111.852246,51.09186],[111.853051,51.092257],[111.853877,51.092643],[111.855079,51.093163],[111.856313,51.093673],[111.856946,51.09392],[111.858233,51.094387],[111.859553,51.094816],[111.862686,51.095872],[111.864499,51.096495],[111.866988,51.09731],[111.870282,51.09841],[111.878521,51.101049],[111.880195,51.101607],[111.885141,51.103329],[111.890902,51.105367],[111.892641,51.105952],[111.892962,51.106086],[111.895741,51.107063],[111.898634,51.108158],[111.89961,51.108497],[111.90588,51.110662],[111.909056,51.111875],[111.912081,51.112964],[111.914388,51.113827],[111.917542,51.115034],[111.924398,51.117593],[111.925921,51.118081],[111.927499,51.118548],[111.931147,51.119677],[111.931968,51.119954],[111.932541,51.120146],[111.933163,51.120388],[111.935052,51.121171],[111.935674,51.12145],[111.936908,51.122045],[111.938077,51.122646],[111.938785,51.123059],[111.939114,51.123266],[111.940477,51.1241],[111.942879,51.125643],[111.943077,51.125768],[111.945255,51.127168],[111.945772,51.127487],[111.947486,51.128558],[111.947981,51.128852],[111.949621,51.129835],[111.95078,51.130553],[111.951467,51.130976],[111.951922,51.131255],[111.952658,51.131669],[111.953376,51.132013],[111.954138,51.132324],[111.955135,51.132598],[111.956075,51.132781],[111.957116,51.132964],[111.962447,51.133745],[111.965498,51.134189],[111.968493,51.13463],[111.96992,51.134813],[111.970961,51.134893],[111.971444,51.134906],[111.971959,51.13492],[111.972892,51.134915],[111.973793,51.134866],[111.974759,51.134774],[111.982372,51.13369],[111.987249,51.133007],[111.988475,51.132871],[111.989175,51.132865],[111.989999,51.132936],[111.99486,51.133647],[111.995592,51.13377],[111.996354,51.133931],[111.997676,51.134282],[112.000755,51.135301],[112.00303,51.136106],[112.004521,51.13661],[112.005293,51.136846],[112.006066,51.13705],[112.006849,51.137237],[112.007632,51.137404],[112.00922,51.137704],[112.010025,51.137801],[112.010829,51.137876],[112.012417,51.137978],[112.014005,51.13801],[112.015561,51.137972],[112.016333,51.137924],[112.017857,51.13779],[112.019391,51.137634],[112.020153,51.137575],[112.025013,51.137119],[112.027116,51.1369],[112.031901,51.136449],[112.035205,51.136111],[112.044904,51.13521],[112.048938,51.134845],[112.051502,51.134566],[112.057393,51.133842],[112.059828,51.133552],[112.062242,51.133295],[112.063047,51.13322],[112.064667,51.133118],[112.066244,51.133048],[112.068486,51.132967],[112.070514,51.132941],[112.071522,51.132967],[112.07384,51.133043],[112.076275,51.133209],[112.077069,51.133279],[112.07944,51.133509],[112.084172,51.13403],[112.087262,51.134341],[112.093699,51.135065],[112.098161,51.135555],[112.099336,51.135683],[112.09957,51.135713],[112.100988,51.135862],[112.101384,51.135902],[112.102965,51.136077],[112.106874,51.13647],[112.109224,51.136744],[112.110201,51.136848],[112.114199,51.137273],[112.120264,51.137892],[112.125776,51.138493],[112.126625,51.138582],[112.131346,51.139115],[112.13213,51.139196],[112.133664,51.139314],[112.135198,51.13941],[112.13596,51.139442],[112.137537,51.13948],[112.139897,51.139448],[112.143094,51.139362],[112.14391,51.139362],[112.144725,51.139389],[112.146367,51.13948],[112.147176,51.139543],[112.147182,51.139544],[112.148802,51.1397],[112.149618,51.139796],[112.150422,51.139909],[112.151989,51.140166],[112.152595,51.140297],[112.153754,51.140538],[112.154231,51.140639],[112.155701,51.141009],[112.15643,51.141218],[112.158012,51.141737],[112.158619,51.141937],[112.160014,51.142489],[112.161366,51.143101],[112.164102,51.144399],[112.169026,51.14677],[112.172524,51.148417],[112.176654,51.150407],[112.179455,51.151716],[112.180839,51.152387],[112.183607,51.153669],[112.184282,51.153996],[112.186933,51.155224],[112.190108,51.156737],[112.193402,51.158271],[112.195859,51.159468],[112.19661,51.159859],[112.198005,51.160659],[112.198659,51.161066],[112.199292,51.161495],[112.199925,51.161935],[112.201846,51.163346],[112.203155,51.164371],[112.203584,51.164736],[112.204002,51.165106],[112.204828,51.165883],[112.20559,51.166672],[112.206309,51.167471],[112.206792,51.168061],[112.207199,51.168657],[112.207532,51.169252],[112.208133,51.170481],[112.20859,51.171654],[112.208863,51.172312],[112.209721,51.174123],[112.210561,51.17597],[112.210568,51.175985],[112.212327,51.179959],[112.212604,51.180505],[112.212907,51.18121],[112.213171,51.181821],[112.213541,51.182673],[112.213771,51.183103],[112.214141,51.183735],[112.214557,51.184343],[112.214805,51.184654],[112.215137,51.185063],[112.2152,51.185142],[112.215342,51.185319],[112.215539,51.185573],[112.215883,51.185948],[112.216193,51.186242],[112.216397,51.186432],[112.216665,51.186657],[112.216925,51.186874],[112.217724,51.187427],[112.217948,51.187582],[112.218927,51.188252],[112.219323,51.188516],[112.219587,51.188695],[112.219735,51.188795],[112.219944,51.18894],[112.220568,51.189418],[112.220989,51.189755],[112.221174,51.189905],[112.221796,51.190424],[112.222114,51.190742],[112.222182,51.190811],[112.222502,51.19115],[112.222643,51.191307],[112.222749,51.191423],[112.222888,51.19159],[112.223109,51.191884],[112.22369,51.192654],[112.225867,51.195543],[112.227219,51.197249],[112.230251,51.201099],[112.231092,51.202127],[112.233857,51.205691],[112.235188,51.207376],[112.236677,51.20928],[112.238132,51.211172],[112.239584,51.213144],[112.239965,51.213631],[112.240192,51.213921],[112.240869,51.214767],[112.240918,51.214823],[112.241414,51.215308],[112.241939,51.215735],[112.24247,51.216135],[112.244918,51.21789],[112.245694,51.218444],[112.248044,51.220128],[112.252979,51.223669],[112.256048,51.225879],[112.259605,51.228466],[112.265865,51.233019],[112.26742,51.234167],[112.269555,51.235696],[112.270735,51.236592],[112.2736,51.238909],[112.280209,51.244032],[112.283084,51.246339],[112.284603,51.247487],[112.288743,51.250558],[112.29494,51.255282],[112.295551,51.255759],[112.299886,51.258994],[112.30289,51.261241],[112.307546,51.264728],[112.310756,51.267144],[112.312535,51.268483],[112.314112,51.269701],[112.315679,51.270876],[112.319745,51.273998],[112.321193,51.275184],[112.322062,51.275999],[112.323757,51.277694],[112.324486,51.278482],[112.324541,51.278542],[112.324884,51.278949],[112.325334,51.27955],[112.325731,51.280156],[112.326086,51.280768],[112.327385,51.283285],[112.32782,51.284028],[112.32835,51.284954],[112.328837,51.285833],[112.329096,51.286283],[112.329709,51.287194],[112.32971,51.287195],[112.333818,51.29233],[112.334827,51.293635],[112.335877,51.295059],[112.336198,51.295495],[112.337337,51.29696],[112.338123,51.297987],[112.33958,51.299823],[112.34181,51.302503],[112.343262,51.304238],[112.344727,51.30583],[112.34551,51.306658],[112.347835,51.308817],[112.349132,51.310026],[112.349467,51.310334],[112.35073,51.311473],[112.351203,51.311917],[112.35262,51.313259],[112.353932,51.314581],[112.35483,51.315505],[112.356124,51.316883],[112.356767,51.317626],[112.357466,51.318315],[112.358334,51.319281],[112.362285,51.323812],[112.365017,51.327009],[112.366173,51.328317],[112.367731,51.33011],[112.368881,51.331419],[112.371363,51.334236],[112.372585,51.335643],[112.376251,51.339835],[112.377694,51.34146],[112.380953,51.345168],[112.381457,51.345672],[112.381993,51.346144],[112.382594,51.346589],[112.383031,51.346878],[112.383264,51.347033],[112.3842,51.347495],[112.385631,51.348172],[112.386894,51.34879],[112.39298,51.351664],[112.395823,51.353016],[112.396789,51.353486],[112.397432,51.353799],[112.400265,51.35528],[112.407625,51.35919],[112.412324,51.361712],[112.416272,51.363772],[112.423096,51.367371],[112.43082,51.371469],[112.432644,51.37236],[112.433277,51.372634],[112.434586,51.373143],[112.435241,51.373379],[112.436603,51.373835],[112.442043,51.375434],[112.446172,51.376648],[112.451602,51.378245],[112.453008,51.378604],[112.457396,51.379597],[112.458318,51.379833],[112.460046,51.380374],[112.461687,51.380943],[112.462481,51.381243],[112.464734,51.382177],[112.465442,51.382488],[112.466613,51.383042],[112.467374,51.383405],[112.467445,51.38344],[112.468121,51.383774],[112.468887,51.384146],[112.469742,51.384561],[112.470614,51.385004],[112.471172,51.385315],[112.471708,51.385642],[112.473327,51.386714],[112.473637,51.386924],[112.47512,51.387901],[112.475998,51.388423],[112.4788,51.389719],[112.482136,51.391248],[112.484786,51.392477],[112.490838,51.395277],[112.50191,51.400373],[112.503873,51.401296],[112.506534,51.402503],[112.507886,51.403162],[112.511909,51.405314],[112.516597,51.407717],[112.517906,51.408403],[112.518539,51.408758],[112.519741,51.409498],[112.519936,51.409629],[112.522691,51.411477],[112.523335,51.411864],[112.524022,51.412234],[112.524751,51.412561],[112.526264,51.413135],[112.528635,51.413988],[112.536989,51.4169],[112.540115,51.41799],[112.543752,51.419256],[112.545158,51.419787],[112.545524,51.419964],[112.545791,51.420093],[112.54695,51.420777],[112.547572,51.421144],[112.548076,51.42153],[112.548548,51.421938],[112.548966,51.422356],[112.549717,51.423199],[112.5501,51.423672],[112.550362,51.424138],[112.550618,51.424655],[112.551627,51.427175],[112.551749,51.427407],[112.551855,51.427606],[112.552193,51.42802],[112.552643,51.428429],[112.553215,51.428815],[112.553837,51.429137],[112.554513,51.429405],[112.555211,51.429641],[112.556135,51.429917],[112.556683,51.430094],[112.558848,51.430827],[112.559631,51.431036],[112.560468,51.431197],[112.561347,51.431347],[112.562206,51.43147],[112.563901,51.431685],[112.567538,51.432174],[112.568322,51.432279],[112.579088,51.433726],[112.583788,51.434341],[112.584386,51.434425],[112.591968,51.435424],[112.594746,51.43588],[112.597439,51.436384],[112.599167,51.436771],[112.601677,51.437366],[112.603351,51.437795],[112.607492,51.439018],[112.609059,51.439528],[112.610561,51.440043],[112.61202,51.440585],[112.615442,51.441969],[112.617384,51.442822],[112.621279,51.444694],[112.62395,51.446008],[112.626675,51.447371],[112.627383,51.447698],[112.628124,51.447993],[112.628896,51.44824],[112.629712,51.448433],[112.630559,51.448599],[112.636685,51.449629],[112.642629,51.450643],[112.650075,51.451946],[112.654087,51.452596],[112.656437,51.453019],[112.662638,51.454065],[112.664913,51.454473],[112.668754,51.455117],[112.673603,51.45598],[112.677766,51.456694],[112.686564,51.458228],[112.692325,51.459231],[112.693065,51.459382],[112.693435,51.45947],[112.693784,51.459553],[112.695179,51.459918],[112.695855,51.460111],[112.699964,51.461356],[112.701895,51.461945],[112.702533,51.46214],[112.703329,51.462384],[112.705803,51.463183],[112.706407,51.463368],[112.709759,51.464403],[112.720767,51.467836],[112.721259,51.467982],[112.722697,51.468428],[112.724601,51.469029],[112.727677,51.469987],[112.733202,51.471688],[112.734822,51.472208],[112.735616,51.472487],[112.736388,51.472809],[112.737139,51.473147],[112.73788,51.473506],[112.73936,51.474268],[112.739841,51.474537],[112.740798,51.475072],[112.741506,51.475491],[112.742847,51.476365],[112.746656,51.47908],[112.751065,51.482234],[112.755486,51.485404],[112.75923,51.488135],[112.761151,51.489481],[112.76247,51.490372],[112.763843,51.491225],[112.766086,51.492421],[112.771364,51.495135],[112.772856,51.495854],[112.774379,51.49653],[112.779132,51.498542],[112.788375,51.502518],[112.788878,51.502728],[112.790226,51.503241],[112.790977,51.503584],[112.791685,51.503944],[112.792361,51.50433],[112.792962,51.504748],[112.793477,51.505204],[112.793927,51.505703],[112.79469,51.506767],[112.796577,51.509671],[112.798353,51.51247],[112.799438,51.514131],[112.800067,51.515176],[112.800626,51.516285],[112.800847,51.516887],[112.801822,51.52086],[112.802098,51.521785],[112.802326,51.522309],[112.802589,51.522709],[112.802962,51.523139],[112.803432,51.523501],[112.803992,51.523836],[112.8046,51.524137],[112.80737,51.525321],[112.810059,51.526506],[112.810785,51.526807],[112.8116,51.527214],[112.812112,51.527513],[112.812703,51.52788],[112.813261,51.528304],[112.813797,51.528765],[112.814838,51.529731],[112.818464,51.533239],[112.826596,51.541125],[112.830083,51.544515],[112.835576,51.549825],[112.836522,51.550726],[112.837027,51.551124],[112.837603,51.551483],[112.838216,51.551843],[112.842744,51.55395],[112.845072,51.555024],[112.846477,51.5557],[112.848537,51.556783],[112.852539,51.559004],[112.856131,51.56104],[112.857474,51.561799],[112.861851,51.564733],[112.868085,51.56896],[112.869962,51.570125],[112.870617,51.570489],[112.871282,51.570838],[112.87346,51.571836],[112.87788,51.573794],[112.883813,51.576315],[112.884489,51.576669],[112.885714,51.577566],[112.889859,51.580703],[112.893033,51.583066],[112.894123,51.583878],[112.898751,51.587329],[112.901231,51.589167],[112.901739,51.589538],[112.90441,51.591505],[112.904455,51.591538],[112.906813,51.59329],[112.911762,51.597252],[112.915024,51.599908],[112.916107,51.600729],[112.91749,51.601666],[112.919047,51.602697],[112.920528,51.603636],[112.922051,51.604553],[112.923747,51.60562],[112.925388,51.606629],[112.926743,51.607427],[112.92747,51.607891],[112.928048,51.608294],[112.928451,51.608649],[112.928767,51.608893],[112.92901,51.609094],[112.929387,51.609425],[112.929953,51.610031],[112.9302,51.610286],[112.931106,51.611172],[112.932214,51.612354],[112.932785,51.612941],[112.933143,51.613383],[112.933973,51.61439],[112.935693,51.616971],[112.935731,51.617028],[112.937749,51.619951],[112.938809,51.621376],[112.940547,51.623179],[112.943499,51.625976],[112.945184,51.627561],[112.946266,51.628579],[112.946332,51.628642],[112.94691,51.629187],[112.94834,51.630557],[112.949775,51.631897],[112.951311,51.633362],[112.951897,51.633919],[112.952345,51.634346],[112.95262,51.634608],[112.954712,51.636623],[112.954979,51.636876],[112.956493,51.638288],[112.957214,51.638953],[112.957714,51.63939],[112.958382,51.639943],[112.95928,51.640624],[112.960396,51.641418],[112.961594,51.642159],[112.965245,51.644416],[112.968019,51.646146],[112.968636,51.64653],[112.968862,51.646689],[112.969606,51.647211],[112.969859,51.647388],[112.970148,51.647608],[112.970358,51.647768],[112.970924,51.648253],[112.971392,51.648669],[112.971803,51.64908],[112.97219,51.649491],[112.974124,51.651791],[112.976704,51.654882],[112.978772,51.657359],[112.979051,51.657708],[112.97936,51.658159],[112.979658,51.658649],[112.979865,51.65907],[112.980075,51.659608],[112.9811,51.664668],[112.981277,51.665289],[112.981421,51.665756],[112.981578,51.666174],[112.98176,51.666573],[112.982067,51.667098],[112.98242,51.667657],[112.982709,51.668073],[112.983495,51.669077],[112.983995,51.669595],[112.98445,51.670042],[112.984965,51.670493],[112.990007,51.674318],[112.99188,51.675762],[112.993307,51.676751],[112.993581,51.676925],[112.994528,51.677526],[112.994997,51.677814],[112.996219,51.678566],[112.998408,51.680079],[113.000994,51.681924],[113.003357,51.683338],[113.004728,51.684075],[113.005356,51.684405],[113.006148,51.684789],[113.006854,51.685108],[113.008026,51.685584],[113.009023,51.685971],[113.009916,51.686292],[113.012837,51.687291],[113.013587,51.687576],[113.014308,51.687868],[113.015171,51.688301],[113.015606,51.688549],[113.016456,51.689077],[113.016828,51.689336],[113.017077,51.689523],[113.017338,51.68973],[113.017624,51.689979],[113.01791,51.690251],[113.018541,51.690849],[113.019974,51.692259],[113.021746,51.693913],[113.023235,51.695432],[113.026442,51.698533],[113.028308,51.700277],[113.031067,51.702905],[113.03333,51.7046],[113.034553,51.70534],[113.036517,51.706397],[113.036788,51.706518],[113.037336,51.706764],[113.039782,51.707859],[113.040496,51.708179],[113.044016,51.709755],[113.045304,51.710377],[113.046559,51.711032],[113.047728,51.711724],[113.048801,51.712437],[113.049778,51.713167],[113.051977,51.71498],[113.055936,51.718333],[113.058067,51.720084],[113.058301,51.720284],[113.058611,51.720554],[113.059036,51.720923],[113.059873,51.721632],[113.060193,51.721906],[113.060812,51.722439],[113.061248,51.72281],[113.061762,51.723246],[113.062002,51.723464],[113.062683,51.724121],[113.063113,51.724598],[113.063163,51.724655],[113.063462,51.724999],[113.064432,51.726203],[113.065293,51.727273],[113.065296,51.727277],[113.065836,51.727965],[113.066368,51.728606],[113.067337,51.729961],[113.067684,51.730428],[113.067966,51.730912],[113.068262,51.731677],[113.068567,51.73243],[113.068626,51.732629],[113.068695,51.732892],[113.068797,51.733282],[113.068845,51.73361],[113.068849,51.733878],[113.068776,51.73432],[113.068662,51.734778],[113.068447,51.735417],[113.068425,51.735472],[113.068311,51.735756],[113.068213,51.735982],[113.068181,51.736055],[113.068037,51.736516],[113.067992,51.736759],[113.067945,51.737182],[113.067957,51.738147],[113.067966,51.738579],[113.068087,51.741754],[113.068097,51.741958],[113.068133,51.742648],[113.06816,51.743183],[113.068162,51.743228],[113.068242,51.744781],[113.068438,51.746434],[113.068465,51.746633],[113.069296,51.751807],[113.069315,51.751925],[113.069363,51.752796],[113.069338,51.753674],[113.068934,51.757844],[113.068897,51.758335],[113.068797,51.759361],[113.06879,51.759431],[113.068106,51.766283],[113.067922,51.767312],[113.067472,51.768519],[113.066492,51.770307],[113.065304,51.772693],[113.065263,51.772885],[113.06517,51.77392],[113.065062,51.775592],[113.065048,51.777204],[113.065021,51.777871],[113.064977,51.778963],[113.064919,51.779818],[113.064851,51.780673],[113.06473,51.781365],[113.064546,51.782087],[113.06442,51.782594],[113.064206,51.783244],[113.063782,51.784295],[113.06347,51.785015],[113.063461,51.785035],[113.063428,51.785114],[113.063225,51.785614],[113.062653,51.786998],[113.06226,51.787584],[113.061596,51.788385],[113.061379,51.788655],[113.061105,51.789019],[113.060777,51.789508],[113.060517,51.790088],[113.060419,51.790338],[113.06037,51.790484],[113.060321,51.790686],[113.060278,51.790931],[113.060253,51.791176],[113.060251,51.791496],[113.060294,51.792486],[113.060296,51.792529],[113.060424,51.794587],[113.060544,51.797243],[113.060675,51.798551],[113.060803,51.799187],[113.061068,51.799908],[113.061461,51.800674],[113.061556,51.800825],[113.062365,51.802123],[113.06261,51.802496],[113.063292,51.803428],[113.063458,51.803677],[113.063617,51.803915],[113.064236,51.805008],[113.064594,51.805934],[113.067058,51.815388],[113.067319,51.816472],[113.067576,51.817535],[113.067624,51.817731],[113.067736,51.818253],[113.067749,51.818321],[113.068313,51.820911],[113.068394,51.821583],[113.068738,51.826912],[113.068805,51.827261],[113.069363,51.831946],[113.070831,51.838244],[113.071364,51.840614],[113.071453,51.841034],[113.072158,51.844375],[113.072714,51.84688],[113.07282,51.847397],[113.073379,51.849999],[113.073529,51.850641],[113.07479,51.856407],[113.075964,51.861906],[113.076321,51.863517],[113.077606,51.869478],[113.079307,51.877326],[113.080476,51.882759],[113.081952,51.889547],[113.082593,51.892539],[113.08302,51.894573],[113.08541,51.905632],[113.086787,51.91207],[113.086944,51.912808],[113.087923,51.917338],[113.088,51.917695],[113.088577,51.920525],[113.089657,51.925578],[113.089845,51.926369],[113.090067,51.927163],[113.090512,51.928456],[113.091062,51.929736],[113.092103,51.931684],[113.093058,51.93303],[113.093624,51.93378],[113.094141,51.934465],[113.094968,51.935382],[113.097328,51.937603],[113.099956,51.939669],[113.104161,51.942665],[113.105469,51.943597],[113.105482,51.943606],[113.111072,51.947586],[113.114578,51.950098],[113.116254,51.951299],[113.122884,51.956041],[113.125491,51.957795],[113.128742,51.959903],[113.135544,51.964388],[113.140179,51.967537],[113.141523,51.968508],[113.141563,51.968539],[113.141647,51.968603],[113.141663,51.968615],[113.142963,51.969604],[113.147681,51.97343],[113.148143,51.973795],[113.150244,51.975454],[113.151351,51.976258],[113.15169,51.976487],[113.15573,51.979337],[113.157819,51.980827],[113.160022,51.982405],[113.16286,51.984488],[113.168095,51.988222],[113.173385,51.991999],[113.18024,51.996869],[113.187772,52.002234],[113.190558,52.004208],[113.192741,52.005755],[113.194714,52.007153],[113.195958,52.007979],[113.197728,52.009272],[113.199732,52.010688],[113.200582,52.011289],[113.203663,52.013431],[113.203672,52.013437],[113.203874,52.013578],[113.204272,52.013856],[113.204963,52.014358],[113.205104,52.014461],[113.205514,52.014752],[113.209171,52.017347],[113.211975,52.019324],[113.214882,52.021357],[113.219207,52.024432],[113.221128,52.026009],[113.22155,52.02637],[113.222109,52.02687],[113.222908,52.027671],[113.224439,52.029361],[113.224827,52.029862],[113.225712,52.031147],[113.225983,52.031553],[113.226048,52.031646],[113.226484,52.032362],[113.228041,52.035307],[113.231068,52.04117],[113.233652,52.046147],[113.234036,52.04686],[113.234359,52.047362],[113.23479,52.048017],[113.235007,52.048284],[113.23542,52.048799],[113.235568,52.048976],[113.235693,52.049115],[113.235903,52.049363],[113.236471,52.05003],[113.236981,52.050513],[113.237387,52.050919],[113.238263,52.051643],[113.238941,52.052136],[113.239366,52.052414],[113.240121,52.052934],[113.240794,52.053391],[113.241419,52.053759],[113.242427,52.054337],[113.242618,52.054446],[113.243283,52.054784],[113.243887,52.055076],[113.244663,52.055432],[113.245141,52.05561],[113.246198,52.056],[113.246893,52.056259],[113.248352,52.056726],[113.249113,52.05694],[113.249875,52.057149],[113.251287,52.057493],[113.252892,52.057875],[113.261449,52.059814],[113.264407,52.060484],[113.268319,52.061365],[113.273822,52.062624],[113.275523,52.063018],[113.277915,52.06355],[113.279796,52.063974],[113.289215,52.066114],[113.290738,52.06645],[113.296301,52.067646],[113.298807,52.068216],[113.302918,52.069205],[113.306701,52.070115],[113.307632,52.070353],[113.30852,52.070639],[113.309335,52.070968],[113.310137,52.071323],[113.310927,52.07174],[113.311673,52.072204],[113.312406,52.072713],[113.313303,52.073481],[113.314049,52.074234],[113.314973,52.075225],[113.317185,52.077595],[113.318838,52.079403],[113.31913,52.079722],[113.319472,52.080085],[113.321157,52.081873],[113.321407,52.082138],[113.323344,52.084219],[113.327135,52.088279],[113.328094,52.089326],[113.329783,52.091168],[113.332854,52.094448],[113.334234,52.095911],[113.335157,52.096817],[113.335699,52.097276],[113.336745,52.098121],[113.337788,52.098867],[113.33895,52.099611],[113.339466,52.099908],[113.340643,52.100544],[113.341684,52.101071],[113.343716,52.101926],[113.344572,52.10224],[113.346232,52.102789],[113.346372,52.102829],[113.347868,52.103267],[113.348184,52.103359],[113.351378,52.104294],[113.352802,52.104715],[113.360189,52.1069],[113.369061,52.109512],[113.370057,52.109787],[113.371553,52.110124],[113.372903,52.110354],[113.37362,52.110432],[113.374063,52.11045],[113.374464,52.11044],[113.374911,52.110385],[113.376033,52.110216],[113.376395,52.110181],[113.3767,52.110178],[113.377024,52.110207],[113.377418,52.110271],[113.377901,52.110398],[113.378207,52.110527],[113.378428,52.110684],[113.378586,52.110848],[113.378723,52.111062],[113.378894,52.11132],[113.379056,52.111554],[113.379261,52.111754],[113.379572,52.111975],[113.382319,52.113427],[113.38485,52.114666],[113.385301,52.114898],[113.389599,52.11712],[113.39174,52.118165],[113.391842,52.118215],[113.412624,52.128759],[113.432917,52.139052],[113.436982,52.141081],[113.437594,52.141308],[113.438674,52.141707],[113.438993,52.141825],[113.439618,52.142057],[113.442464,52.142835],[113.445315,52.143263],[113.447467,52.143419],[113.447996,52.143427],[113.4495,52.143464],[113.449813,52.143431],[113.449964,52.143407],[113.450207,52.143356],[113.450727,52.143221],[113.450902,52.143178],[113.450959,52.143147],[113.451023,52.14312],[113.451093,52.1431],[113.451166,52.143087],[113.451242,52.14308],[113.451319,52.14308],[113.451395,52.143086],[113.451469,52.1431],[113.451816,52.143131],[113.452017,52.143158],[113.452186,52.143178],[113.452325,52.143194],[113.452526,52.143211],[113.452682,52.143218],[113.452847,52.143221],[113.452963,52.143221],[113.45314,52.143222],[113.453969,52.143141],[113.455277,52.142964],[113.456169,52.142769],[113.45651,52.142695],[113.456588,52.142671],[113.456745,52.142631],[113.457943,52.142331],[113.45807,52.142298],[113.458504,52.142183],[113.458562,52.142167],[113.462775,52.140859],[113.464721,52.140246],[113.466664,52.139647],[113.469714,52.138716],[113.470451,52.138475],[113.473339,52.137542],[113.473553,52.137475],[113.47384,52.137385],[113.474776,52.137092],[113.476424,52.1366],[113.476998,52.136435],[113.477909,52.136151],[113.478363,52.136009],[113.481492,52.135032],[113.486749,52.133391],[113.488045,52.13299],[113.488259,52.132927],[113.488614,52.132791],[113.488856,52.132664],[113.489024,52.132548],[113.489069,52.132507],[113.489114,52.132483],[113.489166,52.132465],[113.489223,52.132455],[113.489283,52.132453],[113.489342,52.132459],[113.489398,52.132473],[113.489522,52.132473],[113.489876,52.132461],[113.490083,52.132443],[113.490543,52.132334],[113.491319,52.132162],[113.492409,52.131934],[113.492896,52.131837],[113.493872,52.131656],[113.494981,52.131484],[113.49649,52.13124],[113.498147,52.130951],[113.500846,52.130544],[113.501941,52.130381],[113.504272,52.130001],[113.505469,52.129765],[113.506576,52.129528],[113.507721,52.129257],[113.510046,52.128587],[113.512205,52.127812],[113.513218,52.127414],[113.514155,52.127014],[113.516743,52.125814],[113.522243,52.123403],[113.524257,52.12249],[113.525821,52.121771],[113.527988,52.120797],[113.529085,52.120258],[113.530033,52.119834],[113.535216,52.117231],[113.53559,52.117012],[113.540229,52.114433],[113.543788,52.112268],[113.546843,52.110347],[113.547479,52.109934],[113.549572,52.108513],[113.554615,52.104871],[113.556312,52.103872],[113.557726,52.103159],[113.558966,52.102606],[113.559798,52.102265],[113.561116,52.101762],[113.563667,52.100746],[113.572206,52.097493],[113.575435,52.096105],[113.582022,52.093209],[113.582518,52.093013],[113.582849,52.092872],[113.583253,52.092732],[113.584677,52.092254],[113.592657,52.089775],[113.59666,52.088651],[113.597953,52.08837],[113.598489,52.088264],[113.59883,52.088202],[113.599344,52.088139],[113.606033,52.087375],[113.607279,52.087235],[113.608162,52.087146],[113.608867,52.087075],[113.608944,52.087066],[113.609891,52.086956],[113.610415,52.086875],[113.611322,52.086719],[113.612657,52.086433],[113.61375,52.08603],[113.614068,52.0859],[113.614353,52.085746],[113.615496,52.08506],[113.616693,52.08403],[113.618643,52.082146],[113.618885,52.081913],[113.619178,52.081622],[113.619345,52.081452],[113.61948,52.081332],[113.620115,52.080872],[113.621671,52.080193],[113.627082,52.078134],[113.632088,52.075918],[113.632703,52.075656],[113.633215,52.07542],[113.633667,52.075211],[113.634133,52.074994],[113.634696,52.074739],[113.635377,52.074419],[113.636014,52.074112],[113.636806,52.073732],[113.637654,52.073325],[113.638352,52.072994],[113.639005,52.072712],[113.639533,52.072558],[113.641714,52.072029],[113.643872,52.071453],[113.644535,52.071163],[113.644762,52.071062],[113.644907,52.070985],[113.645043,52.070918],[113.645867,52.070426],[113.646485,52.069754],[113.646615,52.069611],[113.646763,52.069437],[113.64771,52.068138],[113.647795,52.067995],[113.647867,52.067812],[113.648076,52.067179],[113.648138,52.066886],[113.64815,52.06673],[113.648153,52.065914],[113.647938,52.06511],[113.647323,52.063721],[113.647003,52.062732],[113.647202,52.061057],[113.647884,52.05943],[113.65237,52.052605],[113.652588,52.052248],[113.652694,52.052052],[113.652835,52.051759],[113.653499,52.050244],[113.653956,52.048805],[113.654065,52.048479],[113.654174,52.048161],[113.654755,52.045688],[113.655363,52.040668],[113.655623,52.038851],[113.655974,52.037958],[113.656554,52.037124],[113.657438,52.03613],[113.659758,52.033702],[113.660513,52.033092],[113.661608,52.032364],[113.663237,52.031522],[113.663748,52.031312],[113.664307,52.031078],[113.664954,52.030816],[113.666981,52.030014],[113.674457,52.027153],[113.675882,52.026447],[113.676606,52.025874],[113.67703,52.025475],[113.6775,52.025057],[113.67792,52.024519],[113.678369,52.023904],[113.678788,52.023263],[113.678906,52.023116],[113.679136,52.022759],[113.679363,52.022377],[113.679553,52.022055],[113.679863,52.021499],[113.680099,52.020983],[113.680269,52.020642],[113.680426,52.020278],[113.6806,52.019867],[113.680754,52.019419],[113.680914,52.019037],[113.681117,52.018509],[113.681263,52.018117],[113.68177,52.017275],[113.682083,52.016786],[113.682252,52.01655],[113.682426,52.016341],[113.682634,52.016152],[113.682862,52.015944],[113.683661,52.015367],[113.683939,52.015166],[113.68441,52.014815],[113.684946,52.014452],[113.687056,52.013268],[113.687746,52.012893],[113.688576,52.012428],[113.689011,52.01218],[113.689747,52.011754],[113.69049,52.011347],[113.691122,52.011022],[113.691561,52.010782],[113.691979,52.010556],[113.692397,52.010355],[113.692743,52.010184],[113.693473,52.009945],[113.694324,52.009708],[113.69521,52.009501],[113.696115,52.009368],[113.69707,52.009304],[113.698046,52.009283],[113.69898,52.00932],[113.69987,52.009395],[113.703572,52.009814],[113.705524,52.009964],[113.720913,52.010925],[113.723667,52.011112],[113.725201,52.011176],[113.726735,52.011208],[113.727227,52.011201],[113.728323,52.011187],[113.732443,52.01108],[113.73348,52.011038],[113.734987,52.011052],[113.735346,52.011061],[113.73573,52.011071],[113.736451,52.01109],[113.737448,52.011118],[113.73908,52.011204],[113.739952,52.011283],[113.741354,52.01142],[113.742365,52.011549],[113.744739,52.0119],[113.746477,52.012194],[113.747492,52.012334],[113.748103,52.012399],[113.748917,52.012454],[113.749713,52.012506],[113.750504,52.012539],[113.751342,52.012531],[113.75217,52.012496],[113.752936,52.012394],[113.754243,52.012108],[113.754963,52.011918],[113.755661,52.011731],[113.756613,52.011458],[113.757873,52.011102],[113.758616,52.010921],[113.759342,52.010784],[113.760008,52.010666],[113.760736,52.010595],[113.761501,52.010573],[113.762988,52.010554],[113.76405,52.010613],[113.76508,52.010769],[113.766131,52.010956],[113.77171,52.011992],[113.773287,52.012324],[113.775519,52.012837],[113.776384,52.013063],[113.777395,52.013349],[113.777772,52.013457],[113.778666,52.013736],[113.779483,52.014004],[113.780737,52.014421],[113.781665,52.014776],[113.782461,52.015077],[113.782706,52.015178],[113.783104,52.015333],[113.78409,52.015732],[113.785214,52.016211],[113.786012,52.01659],[113.78954,52.01831],[113.789806,52.018456],[113.790221,52.018682],[113.790865,52.01902],[113.793318,52.020421],[113.795884,52.022001],[113.796922,52.022476],[113.797995,52.022892],[113.799132,52.02319],[113.800269,52.023382],[113.801111,52.023486],[113.801435,52.023512],[113.802035,52.023561],[113.802764,52.023582],[113.803939,52.023511],[113.804288,52.023479],[113.804691,52.023428],[113.805168,52.023363],[113.805687,52.023267],[113.806151,52.023165],[113.806568,52.023062],[113.807366,52.022843],[113.808184,52.022611],[113.808969,52.022385],[113.809766,52.022173],[113.81068,52.022017],[113.811179,52.021988],[113.811721,52.021966],[113.812083,52.021999],[113.812359,52.022062],[113.812921,52.022234],[113.813395,52.022398],[113.814909,52.022982],[113.817216,52.024101],[113.81826,52.024529],[113.818941,52.0248],[113.820052,52.025201],[113.821225,52.025611],[113.824321,52.026423],[113.826403,52.026848],[113.82708,52.026931],[113.827826,52.026991],[113.828415,52.027024],[113.828835,52.027033],[113.834538,52.027106],[113.835886,52.027255],[113.836205,52.027307],[113.836427,52.027357],[113.836616,52.0274],[113.837625,52.027704],[113.838836,52.028313],[113.840677,52.029423],[113.841529,52.029772],[113.842427,52.029994],[113.84347,52.030163],[113.844457,52.030164],[113.845589,52.030022],[113.846703,52.029757],[113.85075,52.028595],[113.851614,52.028344],[113.852577,52.028104],[113.85357,52.027876],[113.854569,52.027667],[113.85561,52.027532],[113.856683,52.02743],[113.857766,52.027361],[113.858861,52.027307],[113.859944,52.027296],[113.861049,52.027307],[113.861779,52.027329],[113.863249,52.027404],[113.86474,52.027511],[113.866231,52.027677],[113.867733,52.027876],[113.872411,52.028643],[113.873452,52.028798],[113.874493,52.028922],[113.877647,52.029265],[113.87946,52.029388],[113.881713,52.029501],[113.88329,52.029549],[113.890489,52.029726],[113.893644,52.029796],[113.894384,52.029807],[113.895113,52.029796],[113.897227,52.029705],[113.898289,52.029646],[113.899823,52.029533],[113.902173,52.029319],[113.90331,52.029201],[113.904072,52.029115],[113.905542,52.028922],[113.90678,52.02873],[113.907033,52.028691],[113.908557,52.028418],[113.911325,52.027787],[113.912412,52.027523],[113.913087,52.027359],[113.913928,52.027134],[113.9145,52.026973],[113.915233,52.026755],[113.916159,52.026487],[113.916904,52.026259],[113.917915,52.025904],[113.918843,52.025579],[113.919869,52.025187],[113.920947,52.024764],[113.921939,52.024375],[113.922707,52.024061],[113.934142,52.019383],[113.941101,52.016513],[113.94359,52.01552],[113.944615,52.015183],[113.946857,52.014539],[113.948204,52.014298],[113.949566,52.014136],[113.952222,52.013852],[113.95911,52.013182],[113.960655,52.012981],[113.961711,52.012793],[113.962747,52.012532],[113.963782,52.012185],[113.964941,52.0117],[113.965939,52.011165],[113.966647,52.010729],[113.967328,52.010204],[113.968353,52.009269],[113.969238,52.008401],[113.970117,52.007579],[113.971115,52.006558],[113.972365,52.005257],[113.973014,52.004574],[113.973341,52.004207],[113.973701,52.003735],[113.974157,52.003111],[113.97472,52.002302],[113.975106,52.001701],[113.975509,52.001106],[113.976304,51.999946],[113.976984,51.999008],[113.977434,51.998408],[113.97812,51.99752],[113.978547,51.997022],[113.978966,51.996471],[113.979981,51.995279],[113.980552,51.99463],[113.98124,51.993953],[113.982405,51.992819],[113.982618,51.99262],[113.983067,51.992187],[113.984049,51.991262],[113.984936,51.990421],[113.985909,51.989492],[113.986541,51.988884],[113.986997,51.988451],[113.987257,51.988197],[113.987844,51.987632],[113.988247,51.987245],[113.988824,51.986694],[113.989609,51.985944],[113.99251,51.983142],[113.993245,51.982393],[113.99399,51.981634],[113.995514,51.980336],[113.997509,51.978861],[114.000074,51.977268],[114.001275,51.97664],[114.003679,51.97553],[114.004559,51.975174],[114.005578,51.974763],[114.007573,51.974055],[114.009632,51.973392],[114.011724,51.972867],[114.01313,51.972561],[114.01416,51.972362],[114.01519,51.972191],[114.021713,51.971273],[114.023569,51.970984],[114.02478,51.970783],[114.02506,51.970722],[114.025969,51.970545],[114.027198,51.97027],[114.029778,51.969516],[114.030682,51.969216],[114.031689,51.968839],[114.03236,51.968571],[114.033086,51.968261],[114.033852,51.967917],[114.034582,51.967562],[114.035699,51.966995],[114.036345,51.966643],[114.037067,51.966201],[114.038247,51.965439],[114.039203,51.964712],[114.040317,51.963819],[114.04124,51.962972],[114.043139,51.960912],[114.047387,51.956237],[114.047749,51.955836],[114.050087,51.953226],[114.050543,51.952754],[114.051071,51.952274],[114.05279,51.950854],[114.053125,51.950562],[114.053564,51.950239],[114.054,51.949942],[114.054494,51.949643],[114.055559,51.949076],[114.056755,51.948461],[114.059104,51.947383],[114.061528,51.946444],[114.06494,51.945425],[114.068202,51.944556],[114.071646,51.943762],[114.072547,51.943574],[114.073448,51.943424],[114.074349,51.943327],[114.075261,51.943279],[114.076195,51.943257],[114.07715,51.943263],[114.078104,51.943295],[114.079103,51.943314],[114.080086,51.943384],[114.081044,51.943481],[114.081877,51.943559],[114.082981,51.943671],[114.083326,51.94371],[114.083907,51.943758],[114.084389,51.943771],[114.084848,51.943763],[114.085315,51.943741],[114.085757,51.943704],[114.086302,51.943643],[114.087514,51.943477],[114.088329,51.943284],[114.089069,51.943021],[114.092975,51.94153],[114.098275,51.939443],[114.107094,51.935999],[114.108478,51.935538],[114.108614,51.935503],[114.109197,51.935356],[114.11072,51.935034],[114.111482,51.934905],[114.11308,51.934776],[114.113888,51.934735],[114.114755,51.934729],[114.115896,51.934744],[114.116498,51.934765],[114.117367,51.934803],[114.117844,51.93482],[114.118263,51.93482],[114.118738,51.934823],[114.119185,51.934795],[114.119628,51.934771],[114.120066,51.934725],[114.120494,51.934679],[114.12095,51.934614],[114.121767,51.93449],[114.122693,51.93431],[114.12353,51.934074],[114.124356,51.933816],[114.128269,51.932407],[114.12935,51.932023],[114.130283,51.931692],[114.131424,51.93131],[114.132241,51.931005],[114.133001,51.930723],[114.133316,51.930583],[114.134463,51.930077],[114.136341,51.928902],[114.137328,51.928049],[114.139892,51.924954],[114.140868,51.92423],[114.142703,51.923248],[114.151833,51.919729],[114.154193,51.918989],[114.156768,51.918345],[114.160094,51.917717],[114.1618,51.917455],[114.163656,51.917294],[114.165405,51.917186],[114.166262,51.917143],[114.167296,51.917132],[114.169389,51.917111],[114.170053,51.917116],[114.171189,51.917116],[114.172026,51.917058],[114.173224,51.916882],[114.1752,51.916323],[114.176767,51.915765],[114.182378,51.91356],[114.188257,51.911184],[114.190618,51.910357],[114.192128,51.909961],[114.193477,51.909667],[114.194843,51.909435],[114.196623,51.909219],[114.197763,51.909124],[114.199383,51.909059],[114.201151,51.909052],[114.207408,51.909122],[114.212408,51.909172],[114.213331,51.909188],[114.216045,51.909199],[114.221725,51.909246],[114.222485,51.909252],[114.229124,51.909322],[114.231677,51.90936],[114.233718,51.909372],[114.234316,51.909376],[114.238629,51.909429],[114.24184,51.909471],[114.244127,51.909599],[114.244496,51.909619],[114.245907,51.909719],[114.248408,51.90994],[114.250111,51.910127],[114.251987,51.910379],[114.254476,51.910744],[114.265215,51.912466],[114.271273,51.913389],[114.272775,51.913609],[114.273526,51.91369],[114.273905,51.913722],[114.274252,51.913751],[114.275136,51.913824],[114.276026,51.913851],[114.276949,51.913851],[114.277918,51.913828],[114.278942,51.913797],[114.279865,51.913733],[114.28162,51.913539],[114.284227,51.913066],[114.292402,51.911307],[114.293185,51.911184],[114.29399,51.911125],[114.294827,51.911162],[114.295778,51.911315],[114.296206,51.911405],[114.296436,51.911462],[114.297155,51.911715],[114.297965,51.912026],[114.300477,51.913266],[114.301196,51.913511],[114.301937,51.913673],[114.302669,51.913783],[114.303194,51.913809],[114.303879,51.913783],[114.304619,51.913683],[114.305338,51.91356],[114.30606,51.913381],[114.306795,51.913122],[114.308754,51.912241],[114.309365,51.911952],[114.30988,51.911592],[114.311639,51.909837],[114.312036,51.909633],[114.313184,51.909295],[114.313924,51.90922],[114.314686,51.909231],[114.315448,51.909301],[114.316367,51.909365],[114.317738,51.909506],[114.31922,51.909661],[114.319969,51.909735],[114.32068,51.909766],[114.32143,51.90974],[114.321971,51.90969],[114.322699,51.909585],[114.324229,51.90925],[114.324991,51.909003],[114.325788,51.908657],[114.325924,51.908575],[114.326362,51.908369],[114.32681,51.908163],[114.328376,51.907729],[114.328923,51.907648],[114.32947,51.907616],[114.329905,51.90761],[114.330318,51.907634],[114.330727,51.907685],[114.331084,51.907753],[114.331742,51.907888],[114.332472,51.908062],[114.33296,51.908184],[114.333343,51.908305],[114.333758,51.908471],[114.334163,51.908662],[114.334446,51.908873],[114.334748,51.909107],[114.335111,51.90942],[114.33548,51.909828],[114.335829,51.910219],[114.336405,51.910902],[114.336837,51.91119],[114.338382,51.911649],[114.34141,51.912379],[114.34308,51.912791],[114.34422,51.913073],[114.345507,51.913389],[114.346682,51.913701],[114.347913,51.914048],[114.348591,51.914246],[114.349172,51.914454],[114.353163,51.916359],[114.353921,51.9167],[114.354732,51.917015],[114.355501,51.917306],[114.357011,51.917793],[114.359157,51.918291],[114.361035,51.918581],[114.364157,51.918962],[114.365627,51.919107],[114.373319,51.920088],[114.376592,51.920446],[114.377069,51.920493],[114.378012,51.920562],[114.379806,51.920648],[114.385483,51.920807],[114.386767,51.920848],[114.388157,51.920883],[114.396418,51.921092],[114.401225,51.921247],[114.403768,51.921312],[114.405559,51.921306],[114.406439,51.92129],[114.407287,51.921247],[114.408928,51.921092],[114.411342,51.920791],[114.413713,51.920357],[114.416814,51.919665],[114.41931,51.919223],[114.420118,51.91908],[114.422532,51.918721],[114.429931,51.917579],[114.43369,51.917004],[114.435246,51.916843],[114.436802,51.91673],[114.438497,51.916666],[114.441603,51.916605],[114.442622,51.916555],[114.444435,51.916476],[114.445326,51.916361],[114.446188,51.916156],[114.4469,51.915896],[114.447343,51.915622],[114.447706,51.915349],[114.44901,51.914451],[114.450264,51.913532],[114.452751,51.911614],[114.45474,51.910019],[114.455065,51.909806],[114.455317,51.909661],[114.455563,51.90954],[114.45591,51.909408],[114.456618,51.909167],[114.457444,51.908973],[114.458291,51.908842],[114.459434,51.908723],[114.461261,51.908544],[114.463106,51.908374],[114.464385,51.908258],[114.466059,51.908013],[114.467593,51.907691],[114.469031,51.907238],[114.469844,51.906924],[114.470407,51.906692],[114.471099,51.906406],[114.475458,51.904532],[114.476531,51.904258],[114.477389,51.904194],[114.477685,51.904181],[114.478779,51.904198],[114.479521,51.904213],[114.480483,51.904247],[114.481168,51.904268],[114.481895,51.904253],[114.482464,51.904167],[114.483762,51.903748],[114.484459,51.903384],[114.484852,51.903142],[114.485097,51.902956],[114.485532,51.902507],[114.485823,51.902179],[114.485977,51.901978],[114.486221,51.901777],[114.486534,51.901543],[114.48694,51.901352],[114.487378,51.901171],[114.487892,51.900997],[114.488161,51.900927],[114.488718,51.900868],[114.489298,51.900873],[114.489834,51.900948],[114.490521,51.901168],[114.490909,51.901388],[114.491246,51.901786],[114.491654,51.902352],[114.492046,51.902908],[114.492429,51.903471],[114.492685,51.903839],[114.493132,51.904408],[114.493592,51.905017],[114.49388,51.905357],[114.494276,51.905724],[114.494626,51.905994],[114.495049,51.906239],[114.496304,51.906892],[114.496593,51.90704],[114.496891,51.907219],[114.497221,51.90745],[114.497562,51.907781],[114.497953,51.908172],[114.498369,51.908623],[114.498927,51.909204],[114.500157,51.909931],[114.500632,51.910213],[114.500909,51.910378],[114.5017,51.910796],[114.502128,51.91101],[114.502684,51.911181],[114.503005,51.911279],[114.503516,51.911398],[114.503844,51.911457],[114.504315,51.91152],[114.504674,51.911549],[114.505066,51.911543],[114.505507,51.911537],[114.506065,51.911503],[114.506488,51.911443],[114.507797,51.911208],[114.509455,51.910857],[114.510691,51.910588],[114.511938,51.910341],[114.515026,51.909649],[114.51656,51.909231],[114.521152,51.907772],[114.526643,51.905951],[114.52838,51.905362],[114.529569,51.904886],[114.531754,51.903985],[114.532771,51.903502],[114.533497,51.903123],[114.537213,51.900803],[114.537758,51.900488],[114.538385,51.900172],[114.539742,51.899601],[114.542869,51.898425],[114.54747,51.896716],[114.551096,51.895353],[114.555577,51.893648],[114.562262,51.891136],[114.564105,51.890563],[114.569135,51.889263],[114.570749,51.888931],[114.572307,51.888691],[114.587799,51.88669],[114.5909,51.8864],[114.591908,51.886341],[114.593904,51.886277],[114.594912,51.88626],[114.597005,51.886287],[114.598056,51.88633],[114.599858,51.886454],[114.602787,51.886808],[114.603627,51.886922],[114.604523,51.887069],[114.605225,51.887205],[114.605867,51.887344],[114.608742,51.888025],[114.613666,51.889447],[114.617089,51.890187],[114.619095,51.890482],[114.621091,51.890708],[114.623043,51.890874],[114.62402,51.890944],[114.624975,51.890981],[114.625919,51.890997],[114.627764,51.890992],[114.628644,51.890965],[114.629544,51.890888],[114.630344,51.890815],[114.631197,51.890691],[114.63204,51.890533],[114.633763,51.890116],[114.634469,51.889859],[114.634874,51.889703],[114.636648,51.888887],[114.637051,51.888685],[114.637564,51.88837],[114.639681,51.886851],[114.640226,51.886463],[114.640859,51.886029],[114.641323,51.885688],[114.642034,51.88518],[114.64276,51.884672],[114.643249,51.884376],[114.643772,51.884018],[114.644345,51.883677],[114.644843,51.883379],[114.645337,51.88309],[114.645844,51.882825],[114.646465,51.882511],[114.648503,51.881545],[114.64945,51.881163],[114.650038,51.880916],[114.650543,51.880705],[114.650983,51.880561],[114.654497,51.879225],[114.655434,51.878862],[114.656042,51.878627],[114.656678,51.87838],[114.659023,51.877506],[114.659578,51.877279],[114.660349,51.876985],[114.660482,51.876935],[114.661268,51.876635],[114.662048,51.876329],[114.662898,51.876002],[114.663607,51.875726],[114.664677,51.87534],[114.665447,51.875072],[114.666426,51.874759],[114.667343,51.874489],[114.670154,51.873783],[114.670556,51.873684],[114.671119,51.873578],[114.671841,51.873466],[114.672124,51.873427],[114.674102,51.873236],[114.674898,51.873173],[114.67542,51.873141],[114.676022,51.873118],[114.677429,51.873078],[114.680357,51.872994],[114.684606,51.872839],[114.686824,51.872753],[114.688178,51.872688],[114.690204,51.872665],[114.690826,51.872697],[114.692096,51.872906],[114.692485,51.872979],[114.692826,51.873055],[114.693243,51.873184],[114.694116,51.873555],[114.694927,51.874008],[114.696879,51.875408],[114.697341,51.875812],[114.697689,51.876113],[114.698199,51.876597],[114.698682,51.877072],[114.699095,51.877516],[114.699344,51.877809],[114.699444,51.877935],[114.699665,51.878222],[114.699843,51.878456],[114.699979,51.878648],[114.700152,51.878885],[114.700309,51.879123],[114.700531,51.879451],[114.70085,51.87995],[114.701145,51.880437],[114.70149,51.880976],[114.701734,51.881366],[114.70197,51.881719],[114.702293,51.882102],[114.702558,51.882438],[114.703571,51.883594],[114.703742,51.883745],[114.704109,51.884041],[114.705623,51.885092],[114.706107,51.88542],[114.706628,51.885776],[114.707031,51.886033],[114.70751,51.886354],[114.708053,51.886668],[114.708525,51.886911],[114.709219,51.887229],[114.710438,51.887615],[114.710948,51.88774],[114.711496,51.887845],[114.712018,51.887926],[114.712496,51.887976],[114.713046,51.888021],[114.713588,51.888033],[114.714546,51.888015],[114.715503,51.887949],[114.716459,51.887836],[114.717196,51.887675],[114.718873,51.88714],[114.724377,51.884699],[114.727467,51.883562],[114.734538,51.881454],[114.737241,51.88081],[114.739054,51.880569],[114.74002,51.880499],[114.740964,51.880483],[114.74194,51.880494],[114.742949,51.880526],[114.74502,51.880687],[114.74708,51.880917],[114.749054,51.881266],[114.750996,51.88169],[114.753656,51.882538],[114.754603,51.882862],[114.755542,51.883228],[114.756663,51.883697],[114.757701,51.884179],[114.758539,51.884636],[114.759313,51.885116],[114.760171,51.885677],[114.760888,51.886148],[114.761657,51.886798],[114.762164,51.88724],[114.762878,51.887897],[114.763631,51.88862],[114.764342,51.889278],[114.765053,51.889941],[114.765241,51.89011],[114.76655,51.891096],[114.767166,51.891422],[114.767665,51.891611],[114.768366,51.891827],[114.768897,51.891945],[114.769441,51.89202],[114.770313,51.892081],[114.771171,51.892099],[114.772266,51.892107],[114.77329,51.892161],[114.774338,51.892281],[114.775216,51.892424],[114.776237,51.892708],[114.777206,51.893046],[114.77903,51.893717],[114.779701,51.893923],[114.780618,51.894071],[114.781283,51.894103],[114.782179,51.894092],[114.784427,51.893839],[114.785086,51.893843],[114.785752,51.893881],[114.786385,51.893988],[114.786943,51.894144],[114.787753,51.894486],[114.788394,51.894919],[114.78877,51.89523],[114.78912,51.895562],[114.792237,51.899886],[114.795145,51.903963],[114.795425,51.904413],[114.795688,51.904863],[114.796168,51.905826],[114.796658,51.906871],[114.797054,51.907945],[114.797331,51.908785],[114.79752,51.909475],[114.797612,51.909864],[114.798685,51.917379],[114.798783,51.918156],[114.798988,51.918805],[114.799144,51.919188],[114.799497,51.919899],[114.799914,51.920517],[114.800293,51.920982],[114.800831,51.921553],[114.80141,51.922057],[114.802719,51.923023],[114.803438,51.923452],[114.804972,51.924187],[114.810369,51.926059],[114.814424,51.927432],[114.820057,51.929305],[114.823973,51.93056],[114.826977,51.931402],[114.828533,51.931788],[114.831129,51.932352],[114.83306,51.932722],[114.834959,51.933054],[114.835904,51.933194],[114.841579,51.933875],[114.844315,51.934172],[114.848038,51.934652],[114.850146,51.934926],[114.851565,51.93509],[114.853329,51.935326],[114.855116,51.935529],[114.855688,51.935606],[114.857663,51.935772],[114.864368,51.936645],[114.866446,51.936866],[114.867491,51.936932],[114.868498,51.936986],[114.87059,51.936922],[114.871663,51.936868],[114.872403,51.936868],[114.873487,51.936933],[114.874538,51.937051],[114.875171,51.937185],[114.87569,51.937335],[114.876644,51.937631],[114.877821,51.938032],[114.87863,51.938323],[114.878951,51.938444],[114.879462,51.938597],[114.879858,51.938729],[114.880378,51.938856],[114.880818,51.938965],[114.881444,51.939088],[114.882396,51.939285],[114.883045,51.939407],[114.883648,51.939515],[114.884437,51.939649],[114.88498,51.939718],[114.885263,51.939752],[114.885738,51.939806],[114.886629,51.939892],[114.887133,51.939911],[114.887707,51.939925],[114.888398,51.939928],[114.888983,51.939913],[114.889486,51.939889],[114.889937,51.93985],[114.89048,51.939799],[114.890983,51.939738],[114.891274,51.939685],[114.891948,51.939566],[114.893878,51.939123],[114.894567,51.938915],[114.895409,51.938667],[114.896206,51.938441],[114.896711,51.938302],[114.897421,51.93811],[114.89792,51.937981],[114.898567,51.937845],[114.899092,51.937739],[114.899586,51.937656],[114.899893,51.937607],[114.900292,51.937557],[114.900606,51.937525],[114.900905,51.937507],[114.901223,51.937492],[114.901642,51.937478],[114.902669,51.937464],[114.903699,51.937485],[114.904498,51.937532],[114.905187,51.937608],[114.905739,51.937684],[114.906688,51.937847],[114.907614,51.938042],[114.911252,51.938778],[114.913022,51.939068],[114.913902,51.939186],[114.914761,51.939277],[114.91564,51.939352],[114.91652,51.939379],[114.9174,51.939379],[114.918347,51.939395],[114.922095,51.939125],[114.922715,51.93908],[114.924847,51.938923],[114.928837,51.938633],[114.932825,51.938325],[114.933414,51.938278],[114.934288,51.938214],[114.934811,51.938175],[114.935505,51.93812],[114.936411,51.938049],[114.937699,51.937957],[114.939716,51.937818],[114.941647,51.937641],[114.945413,51.937335],[114.946303,51.937287],[114.947796,51.937241],[114.948063,51.937233],[114.948932,51.937228],[114.949801,51.937249],[114.950681,51.937292],[114.951571,51.937362],[114.952472,51.937458],[114.953374,51.937582],[114.956249,51.938032],[114.957257,51.938156],[114.958266,51.938247],[114.959264,51.938295],[114.960229,51.938306],[114.961184,51.938285],[114.962128,51.938236],[114.96304,51.938156],[114.964757,51.937931],[114.965604,51.93778],[114.974291,51.936011],[114.97501,51.935858],[114.979638,51.934884],[114.980657,51.934723],[114.981655,51.934605],[114.982631,51.93454],[114.983597,51.934529],[114.98453,51.934535],[114.985485,51.934578],[114.986483,51.934674],[114.987481,51.93483],[114.988424,51.93501],[114.988972,51.935137],[114.989958,51.935391],[114.990859,51.935628],[114.991547,51.935809],[114.992106,51.935965],[114.997276,51.937314],[114.997898,51.937528],[114.999583,51.938301],[115.000355,51.938735],[115.0016,51.939679],[115.002072,51.940184],[115.002812,51.941203],[115.00352,51.942759],[115.004089,51.94374],[115.004904,51.9447],[115.00543,51.945135],[115.007286,51.946251],[115.008359,51.946871],[115.009805,51.947686],[115.014432,51.950343],[115.015058,51.950728],[115.016363,51.951594],[115.017013,51.952064],[115.017415,51.952368],[115.017979,51.952814],[115.018229,51.953037],[115.01862,51.953378],[115.018982,51.953721],[115.019423,51.954147],[115.019819,51.954538],[115.020238,51.954975],[115.020519,51.955277],[115.021244,51.956046],[115.022253,51.956996],[115.023283,51.957854],[115.025375,51.95942],[115.031061,51.963519],[115.032048,51.964431],[115.032681,51.964967],[115.033829,51.966314],[115.035095,51.968052],[115.037063,51.971512],[115.037442,51.972153],[115.037888,51.972936],[115.038209,51.973487],[115.038425,51.973925],[115.038719,51.974403],[115.039002,51.974877],[115.039902,51.976238],[115.042247,51.97898],[115.043602,51.980145],[115.044326,51.980803],[115.045146,51.981497],[115.045804,51.982055],[115.046481,51.982627],[115.047036,51.983108],[115.047715,51.983693],[115.048235,51.984145],[115.048842,51.984669],[115.049514,51.985235],[115.050049,51.985666],[115.050317,51.98587],[115.05113,51.986448],[115.051924,51.986989],[115.05258,51.987414],[115.053325,51.98789],[115.053861,51.988208],[115.054291,51.988458],[115.055458,51.989096],[115.0568,51.989745],[115.060086,51.991213],[115.061696,51.991933],[115.063007,51.992529],[115.063967,51.992959],[115.065272,51.99355],[115.066411,51.994076],[115.067531,51.994572],[115.068508,51.995004],[115.069802,51.995574],[115.070332,51.995823],[115.07118,51.996198],[115.072168,51.996641],[115.073355,51.997175],[115.074392,51.997638],[115.075271,51.998057],[115.076159,51.998457],[115.077428,51.999023],[115.078475,51.999441],[115.079027,51.999619],[115.079459,51.999746],[115.080166,51.999942],[115.080564,52.000044],[115.081243,52.000184],[115.082158,52.000344],[115.082999,52.00045],[115.083866,52.000541],[115.084715,52.000589],[115.085618,52.0006],[115.086461,52.000598],[115.087329,52.000579],[115.088236,52.000558],[115.089115,52.000555],[115.09081,52.000549],[115.091577,52.000506],[115.092334,52.000496],[115.093149,52.000503],[115.093916,52.000521],[115.094749,52.000565],[115.095293,52.000619],[115.095981,52.000716],[115.098838,52.001404],[115.099494,52.00156],[115.099958,52.001689],[115.100667,52.001866],[115.101437,52.002035],[115.10218,52.002196],[115.102983,52.002347],[115.103839,52.002508],[115.104895,52.002686],[115.106076,52.002864],[115.106779,52.002961],[115.107524,52.003064],[115.108422,52.003196],[115.109755,52.003325],[115.111292,52.003417],[115.111914,52.003436],[115.11274,52.003479],[115.113328,52.003498],[115.1139,52.003524],[115.114521,52.003526],[115.11539,52.003526],[115.120207,52.003473],[115.12211,52.003532],[115.124187,52.003695],[115.127264,52.004069],[115.129489,52.004449],[115.132878,52.005206],[115.133707,52.005386],[115.134444,52.005568],[115.134991,52.005694],[115.136644,52.006182],[115.138192,52.006699],[115.138956,52.007031],[115.139946,52.007466],[115.14172,52.008509],[115.143562,52.009655],[115.14612,52.011399],[115.147463,52.012201],[115.148703,52.012753],[115.150065,52.013263],[115.150763,52.013456],[115.151503,52.013628],[115.152265,52.013762],[115.153091,52.013864],[115.154035,52.013944],[115.155956,52.014062],[115.1569,52.014095],[115.157812,52.014143],[115.158477,52.014155],[115.159694,52.014216],[115.160507,52.014261],[115.161703,52.014317],[115.162374,52.014355],[115.163415,52.014409],[115.164126,52.014451],[115.165072,52.014489],[115.166159,52.014525],[115.167441,52.01455],[115.168683,52.014555],[115.169544,52.014537],[115.170622,52.014485],[115.172153,52.014413],[115.173014,52.014379],[115.173926,52.01432],[115.17634,52.014089],[115.178937,52.013918],[115.179881,52.013907],[115.180857,52.013918],[115.181597,52.013944],[115.183507,52.014089],[115.184451,52.014196],[115.186114,52.014454],[115.187724,52.014792],[115.188593,52.015017],[115.188885,52.015085],[115.189643,52.015307],[115.190275,52.015502],[115.191056,52.015781],[115.191689,52.016005],[115.193002,52.016546],[115.197283,52.018145],[115.198367,52.018531],[115.199783,52.018976],[115.201306,52.019395],[115.203559,52.019974],[115.206016,52.0205],[115.207722,52.0208],[115.209439,52.021063],[115.214589,52.021728],[115.216144,52.021953],[115.217979,52.022173],[115.219653,52.022404],[115.220511,52.022543],[115.221369,52.022694],[115.222217,52.022865],[115.223923,52.023246],[115.225618,52.023686],[115.227334,52.02419],[115.228922,52.024727],[115.230489,52.025317],[115.231666,52.025817],[115.232385,52.026127],[115.233227,52.026507],[115.234128,52.026926],[115.234796,52.027233],[115.239426,52.02934],[115.241421,52.0303],[115.242816,52.031035],[115.244651,52.032248],[115.245878,52.033155],[115.24671,52.033743],[115.247554,52.034307],[115.248497,52.03486],[115.249386,52.035292],[115.250336,52.035679],[115.251147,52.035976],[115.252279,52.036307],[115.252955,52.036475],[115.253642,52.03663],[115.25509,52.03685],[115.25848,52.037183],[115.259832,52.037296],[115.263702,52.037425],[115.264439,52.037375],[115.265053,52.037325],[115.265786,52.037262],[115.266206,52.037206],[115.266838,52.037087],[115.267425,52.036976],[115.268241,52.036824],[115.269157,52.036648],[115.270096,52.036502],[115.270754,52.03641],[115.271362,52.036346],[115.271866,52.036315],[115.272501,52.036285],[115.273073,52.036273],[115.273584,52.036277],[115.273903,52.036276],[115.274424,52.036298],[115.275198,52.036354],[115.275726,52.036408],[115.27629,52.036483],[115.277327,52.036653],[115.278875,52.036932],[115.279666,52.037081],[115.280478,52.037241],[115.281123,52.037368],[115.281915,52.037535],[115.282413,52.037643],[115.283051,52.037754],[115.283639,52.037847],[115.284297,52.037931],[115.285178,52.038019],[115.285812,52.038067],[115.286683,52.038115],[115.287283,52.038128],[115.287723,52.038132],[115.288178,52.038127],[115.288963,52.03807],[115.289519,52.038004],[115.290503,52.03786],[115.291312,52.037698],[115.292311,52.03747],[115.293083,52.037274],[115.294012,52.037019],[115.295269,52.036682],[115.29586,52.036509],[115.296833,52.036234],[115.303013,52.034362],[115.303333,52.034255],[115.303829,52.034078],[115.304485,52.033819],[115.305283,52.033495],[115.306009,52.033144],[115.306575,52.032863],[115.307476,52.032356],[115.307827,52.03212],[115.308508,52.031714],[115.309328,52.03122],[115.309933,52.030835],[115.310595,52.03044],[115.311359,52.030028],[115.312157,52.029591],[115.31386,52.028742],[115.31462,52.028364],[115.320522,52.025491],[115.320946,52.025274],[115.321633,52.024975],[115.322534,52.024642],[115.32303,52.024465],[115.323411,52.024358],[115.323894,52.024216],[115.324567,52.024052],[115.325286,52.023945],[115.3259,52.023854],[115.326997,52.023745],[115.328902,52.023628],[115.329733,52.02359],[115.330809,52.023533],[115.3319,52.02344],[115.332397,52.023399],[115.333172,52.023288],[115.333679,52.023196],[115.335495,52.022786],[115.336549,52.022473],[115.337799,52.02209],[115.339169,52.021648],[115.340411,52.021256],[115.341725,52.020837],[115.342983,52.020401],[115.344437,52.019867],[115.34691,52.018883],[115.349335,52.01793],[115.352181,52.016816],[115.353774,52.01629],[115.355037,52.015874],[115.3556,52.015659],[115.356499,52.015324],[115.358052,52.014631],[115.359034,52.014135],[115.361721,52.012603],[115.374403,52.004746],[115.375371,52.004167],[115.376417,52.003535],[115.377461,52.00292],[115.37812,52.002562],[115.379037,52.002128],[115.380516,52.001526],[115.380952,52.001377],[115.382555,52.000894],[115.383082,52.000765],[115.383677,52.000642],[115.385326,52.000362],[115.386577,52.00021],[115.387714,52.000129],[115.389135,52.000073],[115.390583,52.000029],[115.391709,52.000014],[115.392121,52.000009],[115.393623,51.999999],[115.395251,52.000004],[115.407713,52.000571],[115.410632,52.000708],[115.413968,52.000832],[115.416336,52.000663],[115.417671,52.000456],[115.419008,52.000176],[115.41968,51.999994],[115.421572,51.999377],[115.42223,51.999087],[115.422936,51.998746],[115.423446,51.99848],[115.423863,51.998231],[115.425308,51.997259],[115.426463,51.996488],[115.427717,51.99578],[115.429251,51.995088],[115.430485,51.99459],[115.432212,51.994064],[115.433081,51.993838],[115.434766,51.993479],[115.435603,51.99335],[115.436879,51.993251],[115.438883,51.993123],[115.442598,51.992996],[115.443435,51.992969],[115.448314,51.992766],[115.453473,51.992575],[115.455017,51.992567],[115.457178,51.992609],[115.459404,51.99273],[115.461774,51.992971],[115.462387,51.993044],[115.464024,51.993247],[115.464808,51.993338],[115.465701,51.993474],[115.46662,51.993629],[115.467442,51.993765],[115.46839,51.993938],[115.469109,51.994096],[115.470825,51.994412],[115.471662,51.994541],[115.473969,51.994954],[115.475643,51.995212],[115.476479,51.995394],[115.478656,51.995797],[115.479467,51.995948],[115.480398,51.99612],[115.48077,51.996192],[115.481517,51.996313],[115.481881,51.996385],[115.482862,51.996568],[115.483663,51.996754],[115.484139,51.996858],[115.485802,51.997255],[115.486495,51.997438],[115.487206,51.997628],[115.487949,51.997854],[115.48888,51.998165],[115.488882,51.998166],[115.489805,51.998474],[115.490741,51.998795],[115.491765,51.999142],[115.492466,51.999386],[115.493348,51.999711],[115.494429,52.000067],[115.495115,52.000303],[115.496446,52.000748],[115.498173,52.001284],[115.499943,52.001778],[115.501384,52.002152],[115.50241,52.002381],[115.503192,52.002526],[115.504192,52.002718],[115.504771,52.002829],[115.505634,52.002951],[115.506368,52.003068],[115.508623,52.003355],[115.509481,52.003473],[115.51188,52.003703],[115.512727,52.003756],[115.513343,52.003774],[115.513586,52.003773],[115.514455,52.003773],[115.515307,52.003757],[115.516175,52.003701],[115.517249,52.003618],[115.518097,52.003527],[115.518933,52.003398],[115.520725,52.003012],[115.523318,52.002365],[115.5242,52.002142],[115.525349,52.001872],[115.525945,52.001743],[115.526776,52.001601],[115.52835,52.001301],[115.529406,52.001138],[115.530692,52.000965],[115.531516,52.000864],[115.532251,52.000802],[115.533174,52.000738],[115.533995,52.000679],[115.534782,52.000639],[115.535654,52.000603],[115.53654,52.000608],[115.537376,52.000592],[115.539007,52.000608],[115.539844,52.000635],[115.541668,52.000748],[115.544393,52.000995],[115.546539,52.001316],[115.546764,52.001327],[115.547558,52.001413],[115.549167,52.001644],[115.550777,52.001815],[115.553759,52.002202],[115.55806,52.002453],[115.558439,52.002467],[115.558898,52.002472],[115.560075,52.002473],[115.561383,52.002471],[115.562394,52.00245],[115.564185,52.002386],[115.56455,52.002368],[115.566891,52.002207],[115.568,52.00206],[115.568603,52.001984],[115.569227,52.001902],[115.570066,52.001793],[115.570834,52.001688],[115.571712,52.001551],[115.572714,52.001405],[115.573388,52.001295],[115.574404,52.001137],[115.575081,52.001042],[115.575789,52.000925],[115.576213,52.000858],[115.576719,52.000767],[115.577281,52.000669],[115.578006,52.000538],[115.578483,52.000436],[115.579105,52.000295],[115.580145,52.000017],[115.581252,51.999692],[115.582771,51.999207],[115.582964,51.999137],[115.583425,51.998965],[115.583945,51.998781],[115.584395,51.998603],[115.584971,51.99837],[115.585628,51.998094],[115.586781,51.99759],[115.587673,51.997229],[115.58836,51.996966],[115.589179,51.996728],[115.589693,51.996618],[115.590302,51.996513],[115.590752,51.996448],[115.591428,51.996381],[115.592319,51.996354],[115.593209,51.996381],[115.594068,51.996462],[115.594861,51.996564],[115.595496,51.996656],[115.596233,51.996782],[115.596676,51.99686],[115.597144,51.996942],[115.597512,51.996998],[115.597956,51.997042],[115.598404,51.997074],[115.598796,51.997092],[115.599198,51.997096],[115.599742,51.997086],[115.600516,51.997068],[115.602018,51.996859],[115.602307,51.996823],[115.602873,51.996741],[115.603545,51.996652],[115.604092,51.996575],[115.604617,51.996511],[115.605144,51.996458],[115.605541,51.996422],[115.60607,51.996381],[115.606502,51.996372],[115.607292,51.996374],[115.607704,51.996387],[115.608042,51.996412],[115.608498,51.996454],[115.608865,51.9965],[115.609428,51.996613],[115.610996,51.996965],[115.611673,51.997225],[115.612816,51.99775],[115.614485,51.998613],[115.614855,51.99879],[115.615055,51.998891],[115.616314,51.99943],[115.617092,51.999677],[115.617785,51.999852],[115.618231,51.999927],[115.618995,52.000035],[115.61965,52.000097],[115.620567,52.000124],[115.621451,52.000026],[115.622104,51.999926],[115.623033,51.999748],[115.623648,51.999579],[115.624375,51.999404],[115.625054,51.999205],[115.625623,51.999019],[115.626264,51.998804],[115.626687,51.998636],[115.62699,51.998521],[115.627356,51.998351],[115.627654,51.998204],[115.628022,51.997997],[115.628282,51.997843],[115.628752,51.997512],[115.629406,51.996986],[115.629874,51.996508],[115.630538,51.995454],[115.63079,51.99505],[115.630916,51.994709],[115.63199,51.992839],[115.63208,51.992708],[115.632495,51.992204],[115.633419,51.991307],[115.63381,51.991026],[115.634325,51.990732],[115.634996,51.990408],[115.635879,51.9901],[115.636509,51.989901],[115.637963,51.989433],[115.639296,51.988944],[115.639515,51.988835],[115.64016,51.988481],[115.64061,51.988232],[115.640855,51.988014],[115.641113,51.987833],[115.641733,51.987197],[115.642071,51.9868],[115.64273,51.98602],[115.643448,51.985213],[115.643923,51.984728],[115.644396,51.984386],[115.644944,51.984043],[115.645523,51.983706],[115.648805,51.982361],[115.65107,51.981527],[115.651735,51.981323],[115.654135,51.980806],[115.654889,51.980663],[115.655703,51.980659],[115.657078,51.980878],[115.660222,51.981393],[115.661091,51.98149],[115.661909,51.981528],[115.663,51.981546],[115.668054,51.981392],[115.6683,51.981385],[115.673182,51.98124],[115.674609,51.981211],[115.675456,51.981146],[115.676368,51.981071],[115.677302,51.980975],[115.678235,51.980824],[115.680746,51.980347],[115.68243,51.980063],[115.683342,51.97988],[115.684791,51.979639],[115.686421,51.979333],[115.688213,51.978995],[115.690986,51.978444],[115.692729,51.978109],[115.694645,51.977744],[115.695431,51.977609],[115.695991,51.977566],[115.696433,51.97757],[115.697129,51.977637],[115.698899,51.977894],[115.700189,51.978084],[115.700593,51.978131],[115.701358,51.978182],[115.70171,51.978196],[115.70244,51.978193],[115.703178,51.978157],[115.704144,51.978072],[115.705088,51.977954],[115.707224,51.977688],[115.708258,51.977641],[115.70917,51.977587],[115.709803,51.977598],[115.710258,51.977626],[115.710782,51.977718],[115.711164,51.977797],[115.714418,51.978725],[115.714913,51.978855],[115.715239,51.978926],[115.71569,51.979009],[115.715986,51.979057],[115.716655,51.979149],[115.717603,51.979211],[115.718597,51.979248],[115.719735,51.979293],[115.720693,51.979342],[115.721477,51.979388],[115.722192,51.979447],[115.724317,51.979659],[115.725293,51.97981],[115.726286,51.979932],[115.728035,51.980175],[115.729251,51.980337],[115.730555,51.980474],[115.732011,51.980464],[115.734254,51.980143],[115.735628,51.979753],[115.736986,51.979378],[115.738507,51.979227],[115.739279,51.979214],[115.740434,51.979281],[115.742062,51.979548],[115.742997,51.979689],[115.743755,51.979857],[115.744451,51.980096],[115.746142,51.980941],[115.748178,51.981885],[115.74934,51.982255],[115.750125,51.982469],[115.750934,51.982638],[115.751857,51.982809],[115.753713,51.983083],[115.754646,51.983195],[115.755322,51.98326],[115.756223,51.983308],[115.757157,51.983308],[115.758036,51.98326],[115.760222,51.983087],[115.761324,51.982998],[115.761841,51.982969],[115.762358,51.982962],[115.763297,51.982963],[115.765085,51.98304],[115.765933,51.983131],[115.768613,51.983492],[115.769754,51.983698],[115.770446,51.983845],[115.771289,51.98404],[115.772059,51.984252],[115.773593,51.984853],[115.77399,51.985004],[115.774682,51.985329],[115.775117,51.985583],[115.775731,51.985952],[115.776399,51.986406],[115.777268,51.987029],[115.777901,51.987505],[115.778354,51.987804],[115.778751,51.988055],[115.779457,51.988488],[115.779656,51.988603],[115.781598,51.989511],[115.782858,51.989962],[115.783135,51.990061],[115.784482,51.990431],[115.785242,51.990568],[115.785953,51.990678],[115.786772,51.990748],[115.787555,51.990772],[115.788255,51.990781],[115.788792,51.990765],[115.789387,51.990709],[115.790403,51.990568],[115.790602,51.990527],[115.790809,51.990485],[115.792239,51.990193],[115.793968,51.989829],[115.795064,51.989536],[115.795758,51.989338],[115.797429,51.988998],[115.798287,51.988875],[115.800737,51.988686],[115.801549,51.988638],[115.802112,51.988627],[115.802194,51.988625],[115.802682,51.988621],[115.802768,51.98862],[115.803021,51.988618],[115.803274,51.988615],[115.803883,51.988609],[115.804297,51.988613],[115.80519,51.988614],[115.805989,51.988554],[115.80624,51.988524],[115.806758,51.988464],[115.807538,51.988313],[115.808645,51.988077],[115.810764,51.987367],[115.811055,51.987269],[115.811317,51.987185],[115.81197,51.986932],[115.812835,51.986536],[115.813203,51.986367],[115.815063,51.985356],[115.815704,51.984987],[115.817032,51.984331],[115.817449,51.984179],[115.818064,51.983995],[115.81886,51.983887],[115.819374,51.983841],[115.819787,51.983823],[115.820542,51.983855],[115.821738,51.983999],[115.822456,51.984161],[115.823292,51.984463],[115.824453,51.985015],[115.825266,51.985373],[115.826135,51.985654],[115.827066,51.985846],[115.8289,51.986157],[115.82978,51.986366],[115.830381,51.986559],[115.830885,51.9868],[115.831507,51.987181],[115.832065,51.9876],[115.832527,51.988066],[115.832784,51.988442],[115.833063,51.989134],[115.834283,51.992717],[115.834651,51.994187],[115.834764,51.994595],[115.834796,51.994813],[115.834817,51.995223],[115.834804,51.995874],[115.83475,51.996477],[115.834638,51.997345],[115.834579,51.998049],[115.834603,51.998656],[115.834683,51.999071],[115.835034,51.999911],[115.835281,52.000296],[115.835608,52.000732],[115.835847,52.000972],[115.836408,52.001441],[115.836745,52.001722],[115.837065,52.001955],[115.837794,52.002325],[115.839393,52.003001],[115.84194,52.004011],[115.841979,52.004026],[115.843195,52.004445],[115.843993,52.004693],[115.844471,52.004834],[115.845082,52.004999],[115.845734,52.005147],[115.846667,52.005302],[115.847568,52.005431],[115.848352,52.005522],[115.850733,52.005774],[115.851506,52.005892],[115.852268,52.006048],[115.853738,52.006391],[115.854435,52.006579],[115.855293,52.006842],[115.856546,52.007247],[115.857374,52.007535],[115.858074,52.007747],[115.858824,52.007924],[115.859277,52.008004],[115.859647,52.008045],[115.860376,52.008118],[115.860778,52.008144],[115.861167,52.008151],[115.861559,52.008157],[115.861904,52.008147],[115.86228,52.008119],[115.862672,52.008075],[115.863006,52.008018],[115.863352,52.007953],[115.863695,52.007888],[115.864147,52.007793],[115.865523,52.007307],[115.866392,52.006937],[115.867347,52.006567],[115.867776,52.006419],[115.86823,52.006287],[115.869107,52.006099],[115.869788,52.006021],[115.870601,52.005974],[115.870696,52.005969],[115.870721,52.005967],[115.871665,52.005973],[115.872577,52.006037],[115.874712,52.006214],[115.875678,52.006338],[115.876204,52.006381],[115.877006,52.006536],[115.877858,52.006751],[115.878603,52.006989],[115.879205,52.007211],[115.879572,52.007354],[115.879889,52.007501],[115.880246,52.007673],[115.880508,52.007823],[115.880813,52.007994],[115.881128,52.008198],[115.881609,52.00854],[115.882544,52.009368],[115.882899,52.009787],[115.883253,52.010307],[115.883692,52.011171],[115.883951,52.012181],[115.88439,52.013891],[115.88484,52.014974],[115.885699,52.016573],[115.886289,52.017506],[115.887051,52.018596],[115.887844,52.019582],[115.889315,52.021112],[115.889645,52.021444],[115.889824,52.021623],[115.892193,52.023938],[115.894971,52.026503],[115.897166,52.028515],[115.898094,52.029167],[115.898698,52.029589],[115.899429,52.030058],[115.900201,52.030507],[115.901609,52.031263],[115.901654,52.031288],[115.902782,52.031918],[115.905472,52.03307],[115.907882,52.033957],[115.910185,52.034647],[115.912278,52.035165],[115.915755,52.035982],[115.915795,52.035991],[115.920544,52.03708],[115.924269,52.037977],[115.925631,52.038347],[115.926479,52.038637],[115.927294,52.038953],[115.927885,52.039238],[115.92899,52.039897],[115.929902,52.040632],[115.930384,52.041158],[115.931114,52.042242],[115.931554,52.042767],[115.931983,52.043132],[115.93253,52.043465],[115.933764,52.044103],[115.935062,52.044661],[115.935727,52.044897],[115.936392,52.045101],[115.937283,52.045299],[115.938806,52.045487],[115.939579,52.04553],[115.944906,52.045549],[115.947394,52.045562],[115.949814,52.045616],[115.951169,52.045642],[115.951685,52.04567],[115.952357,52.045715],[115.953018,52.045772],[115.953757,52.045859],[115.954556,52.045981],[115.955744,52.046206],[115.956563,52.046379],[115.957646,52.04664],[115.958301,52.046844],[115.960683,52.047687],[115.963848,52.048765],[115.965264,52.049189],[115.966362,52.049431],[115.967775,52.049719],[115.968971,52.049901],[115.969918,52.050021],[115.971091,52.05015],[115.972495,52.05029],[115.974863,52.050445],[115.981425,52.050776],[115.984477,52.050937],[115.984878,52.05096],[115.985516,52.051027],[115.986196,52.051141],[115.986936,52.051286],[115.987666,52.051485],[115.988398,52.051739],[115.989068,52.052046],[115.989476,52.052274],[115.99008,52.052638],[115.990756,52.053126],[115.991195,52.053534],[115.991571,52.053952],[115.991903,52.054478],[115.992927,52.056389],[115.992955,52.056441],[115.993481,52.057884],[115.993813,52.059424],[115.993848,52.05997],[115.993849,52.059987],[115.993878,52.060443],[115.993824,52.061484],[115.993663,52.062482],[115.993459,52.064955],[115.993288,52.066027],[115.993172,52.067896],[115.99311,52.068636],[115.992891,52.071392],[115.992883,52.07198],[115.992902,52.072204],[115.992938,52.072491],[115.993093,52.07309],[115.993222,52.073517],[115.993379,52.073921],[115.993575,52.074369],[115.993626,52.074461],[115.994221,52.075533],[115.998126,52.082593],[115.998437,52.083049],[115.99921,52.083945],[115.999671,52.084379],[116.000218,52.084814],[116.000808,52.085227],[116.001431,52.085608],[116.002675,52.086262],[116.003909,52.08682],[116.004746,52.087126],[116.005551,52.087394],[116.008061,52.088129],[116.008962,52.08836],[116.009633,52.08856],[116.010969,52.08896],[116.012675,52.089438],[116.015614,52.090328],[116.017084,52.090741],[116.019337,52.091337],[116.022556,52.092302],[116.023221,52.092474],[116.024,52.092685],[116.026761,52.093477],[116.031171,52.094759],[116.031858,52.094979],[116.034079,52.095591],[116.037662,52.096648],[116.039046,52.097093],[116.041353,52.097935],[116.042855,52.098547],[116.044228,52.099142],[116.048144,52.100892],[116.049752,52.10161],[116.050277,52.101803],[116.051938,52.102538],[116.053275,52.103121],[116.053884,52.103412],[116.057382,52.104936],[116.059065,52.105725],[116.059785,52.106107],[116.06044,52.106466],[116.06076,52.106643],[116.061974,52.107355],[116.064484,52.108873],[116.065814,52.109624],[116.067156,52.110268],[116.068765,52.110799],[116.071844,52.111673],[116.072466,52.111872],[116.073196,52.112054],[116.074001,52.112296],[116.074837,52.112601],[116.07561,52.112929],[116.076307,52.113267],[116.076962,52.113621],[116.078056,52.114286],[116.079655,52.115337],[116.08029,52.115741],[116.080846,52.116116],[116.081361,52.116459],[116.081889,52.116788],[116.082179,52.116976],[116.082904,52.117438],[116.083135,52.117564],[116.08341,52.117713],[116.084024,52.118017],[116.084772,52.118318],[116.085399,52.118529],[116.086173,52.118707],[116.087249,52.118915],[116.092012,52.119782],[116.092998,52.119926],[116.093865,52.120008],[116.094691,52.120035],[116.095004,52.120031],[116.095509,52.120022],[116.097587,52.119878],[116.100382,52.119676],[116.102168,52.119559],[116.10367,52.119505],[116.104932,52.119538],[116.105844,52.119602],[116.107507,52.119795],[116.110007,52.120122],[116.111195,52.120278],[116.112566,52.120446],[116.112929,52.120489],[116.113098,52.12051],[116.114094,52.120637],[116.115613,52.12086],[116.117089,52.121243],[116.118549,52.121727],[116.119039,52.121899],[116.121084,52.122692],[116.124662,52.123915],[116.127441,52.124918],[116.130654,52.126126],[116.137205,52.128754],[116.144579,52.131728],[116.14796,52.13314],[116.149908,52.134046],[116.152385,52.135282],[116.153555,52.135958],[116.154714,52.136682],[116.156366,52.137809],[116.160067,52.140571],[116.161655,52.141725],[116.165067,52.144015],[116.167985,52.145893],[116.169627,52.146875],[116.170925,52.147722],[116.172223,52.148484],[116.173114,52.148977],[116.173736,52.14924],[116.174079,52.149466],[116.175227,52.150125],[116.17954,52.152497],[116.182641,52.154256],[116.184261,52.155254],[116.185398,52.156048],[116.186503,52.156987],[116.187973,52.158435],[116.189804,52.160552],[116.189958,52.160731],[116.191739,52.162898],[116.193509,52.164953],[116.195086,52.166873],[116.19735,52.169502],[116.197554,52.169786],[116.197736,52.169985],[116.200405,52.173148],[116.200722,52.173477],[116.201299,52.173985],[116.201889,52.174381],[116.202328,52.174673],[116.202929,52.175016],[116.203573,52.175306],[116.204227,52.175531],[116.204903,52.175735],[116.206341,52.176084],[116.210858,52.177039],[116.211759,52.177243],[116.213427,52.177615],[116.214674,52.177876],[116.21767,52.178487],[116.222262,52.179415],[116.229386,52.180939],[116.230212,52.181105],[116.231768,52.181346],[116.232541,52.181454],[116.233281,52.18155],[116.234,52.181604],[116.234729,52.181588],[116.235673,52.181491],[116.237519,52.181228],[116.238452,52.181116],[116.239396,52.181089],[116.240298,52.181159],[116.241199,52.181303],[116.243538,52.181781],[116.244289,52.181867],[116.245061,52.181899],[116.245823,52.181883],[116.246582,52.181803],[116.247276,52.181712],[116.248143,52.181581],[116.249012,52.181447],[116.250272,52.18125],[116.251197,52.181131],[116.251804,52.181037],[116.253469,52.18075],[116.255076,52.180531],[116.256206,52.180436],[116.257032,52.180377],[116.257815,52.180361],[116.258588,52.180382],[116.260092,52.180488],[116.260908,52.180552],[116.261798,52.18067],[116.263579,52.180998],[116.265569,52.181272],[116.268461,52.181733],[116.272289,52.182321],[116.276083,52.182912],[116.278406,52.183294],[116.279222,52.183465],[116.280477,52.183707],[116.281094,52.183877],[116.281961,52.184155],[116.284143,52.184962],[116.285506,52.185464],[116.28644,52.185816],[116.287806,52.186345],[116.287945,52.186394],[116.294779,52.189034],[116.296399,52.189624],[116.297246,52.189865],[116.298072,52.190074],[116.298931,52.190246],[116.299832,52.19038],[116.300754,52.190471],[116.301677,52.190536],[116.303179,52.190584],[116.306215,52.19067],[116.309117,52.190733],[116.315625,52.190916],[116.31939,52.190992],[116.322995,52.191024],[116.323821,52.191045],[116.32542,52.191115],[116.327799,52.191059],[116.330173,52.191093],[116.339461,52.191325],[116.341856,52.191399],[116.343154,52.19156],[116.344315,52.191751],[116.344536,52.191801],[116.345322,52.192015],[116.346148,52.192264],[116.346837,52.192538],[116.349034,52.193604],[116.352728,52.195934],[116.353641,52.196503],[116.354546,52.197081],[116.355896,52.197913],[116.356826,52.198484],[116.357316,52.198785],[116.358057,52.199197],[116.358474,52.19944],[116.359549,52.200022],[116.360149,52.200322],[116.361107,52.200809],[116.361837,52.201162],[116.362421,52.201466],[116.363345,52.201898],[116.364228,52.202314],[116.365109,52.20275],[116.366046,52.2032],[116.36638,52.203366],[116.366927,52.203633],[116.367081,52.203708],[116.370731,52.205494],[116.371852,52.206022],[116.372587,52.206377],[116.373609,52.206877],[116.37807,52.209044],[116.379099,52.209527],[116.37997,52.209936],[116.38079,52.210321],[116.38148,52.210689],[116.383452,52.211603],[116.387883,52.213849],[116.392132,52.215888],[116.39284,52.216196],[116.393685,52.216595],[116.39497,52.217218],[116.395978,52.217704],[116.397234,52.218319],[116.398288,52.218825],[116.399422,52.219377],[116.400632,52.219973],[116.4013,52.220291],[116.402016,52.220647],[116.402684,52.220968],[116.403342,52.221276],[116.404123,52.221643],[116.4051,52.222126],[116.406352,52.22275],[116.408483,52.223768],[116.409073,52.224074],[116.409749,52.22438],[116.410199,52.224616],[116.412646,52.226064],[116.413815,52.226794],[116.414319,52.227148],[116.416698,52.228549],[116.417057,52.228766],[116.419204,52.230081],[116.420055,52.230572],[116.420688,52.230899],[116.421364,52.231205],[116.422024,52.231459],[116.424007,52.232196],[116.424769,52.232523],[116.425445,52.232845],[116.426046,52.233172],[116.427215,52.233896],[116.427441,52.234068],[116.428299,52.234594],[116.43037,52.235962],[116.430949,52.236428],[116.431453,52.236906],[116.431839,52.237383],[116.432365,52.238215],[116.4342,52.241385],[116.434436,52.2419],[116.435476,52.243767],[116.436689,52.245703],[116.437848,52.247828],[116.438792,52.249448],[116.43935,52.250504],[116.440208,52.252044],[116.440809,52.25301],[116.441152,52.253525],[116.441549,52.25404],[116.442804,52.255579],[116.444156,52.25699],[116.4451,52.257843],[116.446141,52.258691],[116.447911,52.260021],[116.450765,52.262038],[116.453243,52.263862],[116.457707,52.267091],[116.461022,52.269494],[116.467062,52.273791],[116.46836,52.274762],[116.470828,52.2765],[116.473424,52.278448],[116.474497,52.279167],[116.478376,52.281897],[116.478615,52.282068],[116.479583,52.282755],[116.48131,52.284021],[116.486053,52.287363],[116.488454,52.289037],[116.490149,52.290248],[116.492052,52.291592],[116.492955,52.292207],[116.493376,52.292487],[116.494136,52.292946],[116.495098,52.293523],[116.495465,52.293735],[116.496184,52.294122],[116.496931,52.294489],[116.498424,52.295233],[116.499609,52.295798],[116.500576,52.296239],[116.501053,52.296461],[116.502058,52.296921],[116.502969,52.297347],[116.504093,52.297873],[116.504998,52.298291],[116.505996,52.298743],[116.507058,52.299231],[116.507987,52.29967],[116.509089,52.300187],[116.510109,52.300645],[116.511699,52.30139],[116.512136,52.30159],[116.51293,52.301943],[116.513798,52.302339],[116.514656,52.302746],[116.517102,52.303883],[116.519538,52.304951],[116.521855,52.306034],[116.524092,52.30708],[116.525433,52.307729],[116.52609,52.308031],[116.526743,52.308322],[116.528615,52.309187],[116.530707,52.310184],[116.532874,52.311177],[116.53575,52.312529],[116.537243,52.313191],[116.540279,52.314612],[116.545041,52.316815],[116.547043,52.317678],[116.548685,52.318429],[116.550165,52.319134],[116.557882,52.322688],[116.559378,52.323376],[116.560669,52.323975],[116.562471,52.324831],[116.576591,52.331255],[116.577037,52.331463],[116.580622,52.333144],[116.581818,52.333705],[116.582976,52.334218],[116.584043,52.334714],[116.584871,52.335095],[116.585701,52.335454],[116.586648,52.335902],[116.587153,52.336136],[116.58806,52.336557],[116.589116,52.337044],[116.589991,52.337438],[116.590842,52.337844],[116.591715,52.338231],[116.592435,52.338566],[116.593616,52.339094],[116.595174,52.339826],[116.596573,52.340469],[116.598163,52.341184],[116.598828,52.3415],[116.599803,52.341945],[116.600382,52.342217],[116.601297,52.342629],[116.602002,52.34295],[116.602823,52.34333],[116.603347,52.343576],[116.604103,52.343917],[116.60492,52.344287],[116.605951,52.344761],[116.606994,52.345255],[116.607754,52.34561],[116.608505,52.345934],[116.609351,52.346328],[116.610279,52.346769],[116.611098,52.34715],[116.611548,52.347349],[116.612552,52.347808],[116.613532,52.348241],[116.614081,52.348496],[116.614913,52.348881],[116.615448,52.34912],[116.616584,52.349636],[116.617087,52.349853],[116.617723,52.350158],[116.618249,52.350376],[116.618547,52.350475],[116.61908,52.350678],[116.619541,52.350838],[116.620061,52.350996],[116.620717,52.351159],[116.621472,52.351342],[116.621913,52.351436],[116.622271,52.351509],[116.623252,52.351653],[116.624129,52.351782],[116.625247,52.351925],[116.626722,52.352115],[116.628315,52.352317],[116.629032,52.352412],[116.62995,52.352536],[116.630969,52.352666],[116.632204,52.352814],[116.637919,52.353566],[116.639925,52.353845],[116.643841,52.354338],[116.648626,52.354945],[116.651435,52.355321],[116.6545,52.355746],[116.655458,52.355864],[116.658078,52.356212],[116.665149,52.357137],[116.672262,52.35806],[116.672764,52.358125],[116.676822,52.358678],[116.677229,52.358732],[116.679311,52.359027],[116.681178,52.359343],[116.682132,52.359531],[116.684107,52.359965],[116.685094,52.360207],[116.68607,52.360464],[116.687274,52.360766],[116.688087,52.36102],[116.693922,52.362901],[116.696825,52.363861],[116.699197,52.364647],[116.700968,52.365227],[116.703722,52.366106],[116.706017,52.366853],[116.708717,52.367742],[116.711099,52.368522],[116.712904,52.369127],[116.715178,52.369871],[116.716966,52.370436],[116.719552,52.37129],[116.719624,52.371314],[116.720402,52.371572],[116.721016,52.37178],[116.722295,52.372157],[116.728808,52.374323],[116.729215,52.374452],[116.732246,52.375431],[116.732422,52.375488],[116.74112,52.378341],[116.745347,52.379689],[116.755981,52.383227],[116.756492,52.383412],[116.757313,52.383669],[116.758861,52.384182],[116.760918,52.38488],[116.762108,52.385271],[116.763266,52.385654],[116.764752,52.386148],[116.766127,52.386605],[116.7678,52.387161],[116.768826,52.387507],[116.769655,52.387775],[116.770819,52.388153],[116.772018,52.388552],[116.773242,52.388958],[116.774272,52.389299],[116.775466,52.389695],[116.776805,52.390143],[116.778251,52.390612],[116.779364,52.39099],[116.780022,52.391209],[116.78098,52.391522],[116.782025,52.391858],[116.782966,52.392166],[116.784129,52.392557],[116.785398,52.392988],[116.786238,52.393259],[116.787037,52.393518],[116.787942,52.39382],[116.788198,52.393899],[116.7884,52.393965],[116.789258,52.394263],[116.790245,52.394599],[116.79091,52.394833],[116.791998,52.3952],[116.793171,52.395604],[116.793911,52.395831],[116.794624,52.396029],[116.795371,52.396212],[116.796759,52.396545],[116.798197,52.396808],[116.799238,52.397023],[116.800268,52.397259],[116.800965,52.397436],[116.801662,52.397634],[116.803079,52.398085],[116.803776,52.398359],[116.805505,52.399045],[116.809097,52.400585],[116.811927,52.401779],[116.812835,52.402161],[116.81638,52.403618],[116.818319,52.404415],[116.820106,52.405177],[116.829396,52.409179],[116.830995,52.409946],[116.83254,52.41075],[116.83328,52.411169],[116.83401,52.411598],[116.834778,52.412017],[116.83572,52.41264],[116.836163,52.412939],[116.836805,52.413402],[116.837603,52.413982],[116.83813,52.414396],[116.838873,52.415004],[116.839353,52.415433],[116.839958,52.415962],[116.840536,52.416531],[116.841192,52.417218],[116.84159,52.41763],[116.842307,52.418374],[116.843243,52.419369],[116.84397,52.420132],[116.844433,52.420606],[116.844892,52.421055],[116.845385,52.421507],[116.845896,52.421921],[116.845948,52.421959],[116.846467,52.422345],[116.847045,52.422723],[116.84769,52.423094],[116.84838,52.423419],[116.849095,52.423775],[116.849921,52.424086],[116.850811,52.424371],[116.851745,52.42465],[116.85786,52.426409],[116.858858,52.426726],[116.859823,52.427069],[116.860768,52.427428],[116.862591,52.42819],[116.86346,52.428598],[116.864354,52.429019],[116.865191,52.429484],[116.865992,52.42996],[116.866744,52.430436],[116.867489,52.430933],[116.868321,52.431502],[116.869965,52.432639],[116.870829,52.433259],[116.87161,52.433815],[116.872534,52.43446],[116.873407,52.435073],[116.874048,52.435503],[116.874944,52.436132],[116.875941,52.43682],[116.876481,52.437194],[116.877086,52.437603],[116.87771,52.437997],[116.878331,52.438371],[116.879096,52.438804],[116.879609,52.439083],[116.880311,52.439434],[116.881205,52.43984],[116.881752,52.44009],[116.882517,52.440414],[116.8835,52.440798],[116.884015,52.440996],[116.884807,52.441292],[116.885989,52.441719],[116.887226,52.442181],[116.889442,52.442993],[116.891649,52.443808],[116.892824,52.444243],[116.893131,52.444357],[116.894664,52.444928],[116.896097,52.445445],[116.899617,52.446751],[116.90099,52.447282],[116.902342,52.447899],[116.903007,52.448237],[116.904294,52.448961],[116.905528,52.449782],[116.906118,52.450216],[116.906676,52.450678],[116.907202,52.451155],[116.907685,52.451649],[116.908135,52.452153],[116.908961,52.453178],[116.909806,52.454187],[116.910641,52.455269],[116.911247,52.456063],[116.91189,52.456867],[116.912167,52.457245],[116.912588,52.457773],[116.912982,52.458213],[116.913433,52.458657],[116.913942,52.459141],[116.915013,52.459992],[116.915587,52.460391],[116.916222,52.460795],[116.916871,52.461174],[116.917515,52.461532],[116.91818,52.461857],[116.918896,52.462184],[116.919591,52.46248],[116.920495,52.462805],[116.921096,52.463006],[116.921785,52.46322],[116.922689,52.463485],[116.923561,52.46371],[116.924446,52.463923],[116.925701,52.464258],[116.926779,52.464521],[116.9278,52.464791],[116.928702,52.465019],[116.92927,52.465158],[116.930209,52.465401],[116.931002,52.465604],[116.931855,52.465821],[116.932972,52.466107],[116.933974,52.466363],[116.935028,52.466623],[116.935839,52.466834],[116.936238,52.466941],[116.936973,52.467112],[116.937892,52.46735],[116.939807,52.46786],[116.940848,52.468107],[116.942843,52.468638],[116.943798,52.468954],[116.944678,52.469308],[116.945504,52.469695],[116.946266,52.470097],[116.946963,52.470515],[116.947617,52.470961],[116.948218,52.471427],[116.948776,52.471921],[116.948959,52.472115],[116.949252,52.47242],[116.949555,52.472791],[116.95041,52.474081],[116.950815,52.475215],[116.951233,52.476336],[116.951606,52.477266],[116.951998,52.478378],[116.952187,52.478845],[116.952703,52.479833],[116.953086,52.480452],[116.953457,52.480897],[116.954462,52.481983],[116.95487,52.48236],[116.954902,52.48239],[116.955546,52.48289],[116.956101,52.483295],[116.95678,52.483736],[116.957475,52.484131],[116.958175,52.484533],[116.958904,52.484865],[116.960256,52.48545],[116.961704,52.486056],[116.966325,52.488031],[116.966704,52.488195],[116.969009,52.489185],[116.970757,52.490374],[116.971443,52.491148],[116.971886,52.491912],[116.972229,52.492853],[116.972303,52.493905],[116.972168,52.495661],[116.971963,52.499081],[116.97186,52.502001],[116.971755,52.504379],[116.97151,52.508134],[116.971953,52.50943],[116.972776,52.510331],[116.973433,52.510761],[116.973965,52.511039],[116.974534,52.511276],[116.975169,52.511487],[116.976011,52.511678],[116.976848,52.511825],[116.98232,52.512782],[116.983909,52.513215],[116.985483,52.513905],[116.986819,52.514948],[116.987652,52.51606],[116.988113,52.517131],[116.989454,52.520346],[116.990555,52.522452],[116.991283,52.523398],[116.99161,52.523823],[116.992049,52.524393],[116.99307,52.525564],[116.993532,52.526093],[116.994786,52.527507],[116.994983,52.527728],[116.995075,52.527827],[116.9955,52.528285],[116.996369,52.529261],[116.996745,52.529771],[116.997077,52.530302],[116.997367,52.530838],[116.997582,52.531385],[116.998118,52.53315],[116.998558,52.534781],[116.99888,52.535763],[116.999373,52.537667],[116.999737,52.538729],[116.999909,52.539244],[117.000134,52.539706],[117.000499,52.540355],[117.00084,52.540856],[117.001401,52.541646],[117.001829,52.542106],[117.00229,52.542542],[117.002755,52.542975],[117.003225,52.543412],[117.003783,52.543831],[117.004276,52.544169],[117.004791,52.544501],[117.005328,52.544823],[117.005875,52.545124],[117.007077,52.545698],[117.011512,52.54728],[117.012229,52.547509],[117.015936,52.548709],[117.019615,52.549876],[117.028157,52.55264],[117.031367,52.553664],[117.03356,52.554373],[117.034216,52.55462],[117.034849,52.554893],[117.035439,52.555172],[117.036158,52.555542],[117.036845,52.555955],[117.037516,52.556405],[117.0381,52.556877],[117.038628,52.557339],[117.039085,52.557843],[117.03951,52.558342],[117.039875,52.55884],[117.040164,52.559318],[117.040443,52.559817],[117.040636,52.560332],[117.040803,52.560884],[117.040851,52.561335],[117.040883,52.561914],[117.040855,52.562494],[117.04082,52.562892],[117.04069,52.564366],[117.040293,52.567354],[117.040089,52.569205],[117.039746,52.571742],[117.039692,52.572321],[117.039607,52.574038],[117.039617,52.57458],[117.039692,52.575636],[117.039746,52.576173],[117.039971,52.577257],[117.04039,52.579451],[117.040604,52.580432],[117.040733,52.580894],[117.040797,52.581242],[117.040851,52.581709],[117.041463,52.585249],[117.041613,52.586317],[117.041656,52.586853],[117.041636,52.587104],[117.041613,52.587401],[117.041259,52.589579],[117.041227,52.590072],[117.041205,52.590582],[117.041227,52.591097],[117.041302,52.591612],[117.04157,52.592642],[117.042278,52.594584],[117.042488,52.595061],[117.042647,52.595464],[117.042836,52.595962],[117.042943,52.596182],[117.043351,52.597132],[117.043759,52.598151],[117.043973,52.598612],[117.044113,52.599074],[117.04437,52.600077],[117.044413,52.600533],[117.044413,52.602555],[117.04437,52.605066],[117.044327,52.605382],[117.044231,52.606364],[117.044166,52.607383],[117.044145,52.609373],[117.044156,52.609915],[117.044102,52.61035],[117.044134,52.611895],[117.04407,52.613965],[117.04407,52.61544],[117.044048,52.615966],[117.044091,52.616503],[117.044231,52.617592],[117.044327,52.618128],[117.044445,52.618648],[117.044806,52.619639],[117.05011,52.632424],[117.0507,52.633384],[117.051076,52.633878],[117.051473,52.634355],[117.067469,52.649869],[117.068081,52.650384],[117.068607,52.650781],[117.06969,52.651538],[117.070237,52.651881],[117.070806,52.652208],[117.071385,52.652514],[117.072147,52.652889],[117.073595,52.653544],[117.074357,52.653823],[117.075108,52.654086],[117.077426,52.654735],[117.079046,52.655223],[117.083284,52.656468],[117.084335,52.6568],[117.085376,52.65716],[117.086363,52.657567],[117.087318,52.658007],[117.08823,52.658458],[117.089099,52.658946],[117.089893,52.659461],[117.090665,52.659997],[117.091373,52.660555],[117.092038,52.661135],[117.09265,52.661725],[117.093197,52.662325],[117.093712,52.662948],[117.094163,52.663581],[117.09456,52.664235],[117.094871,52.6649],[117.096609,52.669095],[117.09692,52.669777],[117.097617,52.671086],[117.097982,52.671719],[117.098765,52.672909],[117.099173,52.673478],[117.099602,52.674031],[117.100064,52.674556],[117.10104,52.675554],[117.101544,52.676032],[117.102596,52.676927],[117.104709,52.678617],[117.105728,52.679459],[117.109441,52.682469],[117.113399,52.685677],[117.114558,52.686664],[117.115116,52.68719],[117.115663,52.687731],[117.1162,52.688289],[117.116715,52.688863],[117.117197,52.689448],[117.11767,52.690054],[117.118099,52.690682],[117.118903,52.691964],[117.119257,52.692613],[117.119847,52.693933],[117.124053,52.705654],[117.124439,52.706727],[117.124847,52.7078],[117.125287,52.708873],[117.125759,52.70994],[117.126296,52.711002],[117.127165,52.712585],[117.127476,52.71311],[117.141683,52.734816],[117.141803,52.734995],[117.14324,52.737283],[117.145092,52.739798],[117.146037,52.740973],[117.147517,52.742727],[117.148579,52.743897],[117.149126,52.744482],[117.150253,52.745646],[117.150832,52.746214],[117.151433,52.746788],[117.153257,52.748467],[117.154512,52.749546],[117.1558,52.750602],[117.157731,52.752153],[117.158375,52.752652],[117.15904,52.753145],[117.160392,52.754121],[117.161808,52.755087],[117.178899,52.766561],[117.180294,52.767532],[117.181821,52.768643],[117.183492,52.76991],[117.184505,52.770733],[117.185376,52.771422],[117.186177,52.772068],[117.186873,52.77265],[117.187795,52.773447],[117.189189,52.774695],[117.189872,52.775335],[117.190537,52.775964],[117.191514,52.776866],[117.193281,52.778507],[117.195795,52.780867],[117.201723,52.78622],[117.219743,52.801718],[117.220033,52.801967],[117.221128,52.802916],[117.222201,52.803812],[117.224153,52.805512],[117.225602,52.806725],[117.226524,52.807524],[117.226932,52.807921],[117.227286,52.808318],[117.227715,52.808924],[117.228037,52.809525],[117.228273,52.810126],[117.228413,52.810727],[117.228477,52.811328],[117.228498,52.811928],[117.228455,52.813178],[117.228498,52.813838],[117.228595,52.814283],[117.228734,52.814734],[117.228917,52.815174],[117.229153,52.815614],[117.229443,52.816037],[117.229764,52.816451],[117.230301,52.817003],[117.230869,52.817486],[117.231493,52.81787],[117.231943,52.818137],[117.232248,52.818298],[117.232623,52.818504],[117.233435,52.818901],[117.233817,52.819057],[117.234201,52.81919],[117.234625,52.819337],[117.235853,52.819675],[117.237387,52.819969],[117.239895,52.820105],[117.241429,52.820263],[117.243225,52.820534],[117.244647,52.820964],[117.246107,52.82162],[117.247267,52.822343],[117.24809,52.823067],[117.248651,52.823791],[117.249101,52.824605],[117.249827,52.82708],[117.250133,52.827714],[117.250745,52.828566],[117.2515,52.82933],[117.257723,52.833944],[117.258529,52.83454],[117.258924,52.834873],[117.25937,52.835296],[117.259823,52.835763],[117.260287,52.836341],[117.260591,52.836778],[117.260902,52.837322],[117.261113,52.837786],[117.261271,52.838169],[117.261384,52.838512],[117.261564,52.839089],[117.261984,52.84051],[117.26269,52.842863],[117.262878,52.843421],[117.263016,52.8437],[117.263133,52.843912],[117.263216,52.844061],[117.263446,52.844405],[117.263881,52.844913],[117.264159,52.845205],[117.26448,52.845499],[117.264993,52.845886],[117.265417,52.846156],[117.265898,52.846421],[117.266455,52.846691],[117.267098,52.846961],[117.267596,52.847126],[117.268043,52.847265],[117.26862,52.847417],[117.269468,52.847594],[117.269814,52.84765],[117.270332,52.847715],[117.271874,52.847819],[117.273127,52.847909],[117.273875,52.847956],[117.274541,52.848034],[117.274965,52.848097],[117.275453,52.848185],[117.27664,52.848491],[117.27735,52.848713],[117.277744,52.848874],[117.277944,52.848973],[117.278028,52.849014],[117.278473,52.849239],[117.278777,52.849419],[117.279469,52.84988],[117.279709,52.850067],[117.279945,52.85025],[117.280305,52.85059],[117.280569,52.85087],[117.280764,52.851139],[117.280973,52.851456],[117.281132,52.851743],[117.281261,52.852036],[117.281416,52.85256],[117.281512,52.853247],[117.281492,52.853494],[117.281426,52.853861],[117.281277,52.854426],[117.281001,52.855226],[117.280635,52.856361],[117.280283,52.8575],[117.279696,52.85898],[117.279643,52.859591],[117.279718,52.860197],[117.279857,52.860782],[117.280072,52.861319],[117.280415,52.861807],[117.281209,52.862708],[117.281628,52.863137],[117.282357,52.863958],[117.283215,52.864897],[117.284567,52.866275],[117.285393,52.867069],[117.286222,52.867903],[117.286252,52.867933],[117.286308,52.867993],[117.288204,52.870036],[117.289245,52.87113],[117.290318,52.872203],[117.290811,52.872729],[117.291241,52.873254],[117.291595,52.873769],[117.291874,52.874327],[117.292035,52.874896],[117.29211,52.875475],[117.292067,52.876028],[117.291949,52.87657],[117.289247,52.885153],[117.289165,52.885413],[117.286316,52.894267],[117.286016,52.895286],[117.285823,52.896246],[117.285672,52.897646],[117.285629,52.898633],[117.285544,52.899626],[117.285533,52.900125],[117.285544,52.900618],[117.285608,52.901123],[117.285726,52.901621],[117.285876,52.902104],[117.286037,52.902426],[117.28638,52.902877],[117.286767,52.903322],[117.287174,52.90374],[117.287625,52.904116],[117.288279,52.904566],[117.288945,52.90491],[117.28946,52.90513],[117.290264,52.905371],[117.291101,52.90558],[117.29182,52.905741],[117.294009,52.906138],[117.294738,52.906321],[117.295425,52.906535],[117.296262,52.906862],[117.297013,52.907233],[117.297549,52.907554],[117.29801,52.907911],[117.298021,52.907919],[117.319734,52.927209],[117.320066,52.927505],[117.32109,52.928333],[117.322118,52.9292],[117.322751,52.929618],[117.323406,52.93001],[117.337975,52.938614],[117.33849,52.938963],[117.338984,52.939323],[117.340046,52.940165],[117.340465,52.940578],[117.340829,52.941012],[117.341183,52.941463],[117.341462,52.941908],[117.341824,52.942425],[117.341975,52.942794],[117.34213,52.943215],[117.342272,52.943692],[117.342353,52.944035],[117.342412,52.944324],[117.342457,52.944715],[117.342474,52.945176],[117.342428,52.945627],[117.342313,52.946235],[117.342195,52.946673],[117.342114,52.946904],[117.341961,52.947301],[117.341409,52.948551],[117.339896,52.951863],[117.33915,52.953463],[117.337404,52.957298],[117.336208,52.959902],[117.335843,52.960694],[117.335623,52.961232],[117.335543,52.961476],[117.335468,52.961797],[117.335406,52.962062],[117.335368,52.962389],[117.335333,52.96272],[117.335312,52.96302],[117.335333,52.963663],[117.335304,52.964079],[117.335401,52.964567],[117.335561,52.964932],[117.336044,52.965876],[117.336634,52.967223],[117.337403,52.968621],[117.337595,52.968969],[117.346333,52.984856],[117.346934,52.985843],[117.347159,52.986315],[117.347503,52.98683],[117.348125,52.987688],[117.34849,52.988096],[117.348876,52.988493],[117.349434,52.988981],[117.350035,52.989453],[117.350646,52.989866],[117.351247,52.990247],[117.352685,52.99096],[117.353307,52.991213],[117.354058,52.991492],[117.354809,52.991722],[117.356365,52.992259],[117.391148,53.003883],[117.393326,53.004565],[117.394055,53.004742],[117.394795,53.004886],[117.395546,53.004999],[117.396319,53.005106],[117.397102,53.005182],[117.397853,53.005235],[117.398851,53.005262],[117.399602,53.005251],[117.4006,53.005208],[117.401533,53.005128],[117.402413,53.005037],[117.405041,53.004688],[117.406651,53.004436],[117.407423,53.004329],[117.408185,53.00427],[117.408706,53.00421],[117.40885,53.004194],[117.433058,53.001191],[117.454909,53.000219],[117.455188,53.000193],[117.456057,53.000203],[117.456894,53.000246],[117.457731,53.0003],[117.459512,53.000498],[117.460445,53.00067],[117.461346,53.000858],[117.462237,53.001062],[117.46302,53.001303],[117.463739,53.001566],[117.464619,53.001931],[117.472604,53.005509],[117.472917,53.005649],[117.481623,53.009616],[117.483292,53.010428],[117.485032,53.011232],[117.485338,53.011373],[117.486083,53.011695],[117.486973,53.012117],[117.488478,53.012831],[117.490797,53.013934],[117.491736,53.014392],[117.492565,53.014795],[117.492708,53.014865],[117.493698,53.015348],[117.495229,53.016105],[117.497516,53.017241],[117.498976,53.017971],[117.500984,53.018981],[117.502508,53.01976],[117.504684,53.020882],[117.50757,53.022372],[117.510727,53.024038],[117.511985,53.02473],[117.512735,53.025186],[117.513855,53.025896],[117.514001,53.025998],[117.514355,53.026253],[117.514891,53.026637],[117.515977,53.027474],[117.516441,53.027858],[117.516871,53.028236],[117.517386,53.028715],[117.517976,53.029268],[117.518811,53.030123],[117.520837,53.032236],[117.521657,53.033082],[117.522366,53.033814],[117.522883,53.034352],[117.524032,53.035607],[117.524135,53.035719],[117.524637,53.036269],[117.525473,53.037108],[117.526547,53.038226],[117.528187,53.039954],[117.52867,53.040377],[117.529217,53.040791],[117.529828,53.041187],[117.530483,53.04159],[117.531202,53.041955],[117.531931,53.042282],[117.532704,53.042571],[117.533466,53.04284],[117.534249,53.043092],[117.535027,53.043292],[117.535855,53.04347],[117.536928,53.043666],[117.538083,53.043827],[117.53894,53.043899],[117.540686,53.043965],[117.559024,53.044301],[117.560158,53.044282],[117.561321,53.044232],[117.562219,53.044213],[117.563077,53.044116],[117.563914,53.04402],[117.564751,53.043902],[117.565652,53.043725],[117.566543,53.043532],[117.567455,53.043306],[117.568356,53.04306],[117.570072,53.04262],[117.572604,53.041858],[117.5743,53.041391],[117.576842,53.040619],[117.577679,53.040388],[117.578494,53.040147],[117.579321,53.039927],[117.580136,53.039728],[117.582529,53.039235],[117.583355,53.039106],[117.584202,53.038999],[117.586702,53.038827],[117.590983,53.038736],[117.594212,53.038629],[117.594995,53.038623],[117.5958,53.03858],[117.598321,53.038527],[117.60081,53.038393],[117.601658,53.038382],[117.602527,53.038355],[117.605435,53.038226],[117.611057,53.038065],[117.613803,53.038039],[117.614672,53.038055],[117.617269,53.038237],[117.618921,53.038441],[117.619811,53.038563],[117.620691,53.03869],[117.621603,53.038835],[117.622397,53.038991],[117.62351,53.039235],[117.623865,53.039314],[117.628467,53.040306],[117.63828,53.042422],[117.645545,53.043988],[117.649774,53.0449],[117.651425,53.045281],[117.655485,53.046217],[117.657673,53.046756],[117.659122,53.047233],[117.659798,53.047491],[117.66174,53.048285],[117.662995,53.048853],[117.664272,53.049497],[117.665495,53.050184],[117.666074,53.050543],[117.66719,53.051289],[117.678842,53.059584],[117.67913,53.059789],[117.681341,53.061293],[117.682425,53.061999],[117.682576,53.062107],[117.683376,53.062662],[117.68443,53.063402],[117.6852,53.063983],[117.685486,53.064199],[117.694361,53.070445],[117.694652,53.07065],[117.702068,53.075872],[117.702123,53.07591],[117.70292,53.076459],[117.703849,53.077053],[117.704416,53.077418],[117.704722,53.077592],[117.705384,53.077944],[117.705985,53.07824],[117.707412,53.078862],[117.708893,53.079409],[117.710416,53.079886],[117.711275,53.080117],[117.712895,53.080503],[117.713613,53.080653],[117.714343,53.080793],[117.715287,53.080938],[117.71621,53.081061],[117.717122,53.081136],[117.718828,53.081217],[117.734254,53.081315],[117.734687,53.081318],[117.737385,53.081312],[117.738826,53.081362],[117.739727,53.081415],[117.742184,53.081705],[117.743118,53.081834],[117.744598,53.082086],[117.745339,53.082193],[117.746057,53.082333],[117.747494,53.082642],[117.748133,53.082804],[117.749126,53.083054],[117.75082,53.083568],[117.752098,53.084014],[117.753063,53.084376],[117.753825,53.084682],[117.754587,53.08502],[117.755306,53.085347],[117.755971,53.085669],[117.75714,53.086302],[117.757741,53.086608],[117.75831,53.086962],[117.758814,53.087305],[117.759436,53.087702],[117.760005,53.088083],[117.76098,53.088806],[117.761468,53.089211],[117.762676,53.090245],[117.763181,53.090749],[117.76374,53.091377],[117.764865,53.092638],[117.766399,53.094311],[117.767161,53.095121],[117.767547,53.095524],[117.767987,53.095915],[117.768438,53.096291],[117.769232,53.096924],[117.769779,53.097289],[117.770348,53.097632],[117.770938,53.097959],[117.772139,53.098581],[117.772783,53.09886],[117.773437,53.099123],[117.774113,53.09937],[117.775487,53.099804],[117.776195,53.100014],[117.777622,53.100368],[117.778512,53.10055],[117.780003,53.100824],[117.781849,53.101011],[117.782804,53.101087],[117.78466,53.101167],[117.78554,53.101172],[117.787256,53.10121],[117.78878,53.101274],[117.790303,53.101403],[117.791269,53.101516],[117.792202,53.101671],[117.793103,53.101854],[117.793994,53.102079],[117.794874,53.102336],[117.795689,53.102626],[117.796479,53.10292],[117.797469,53.103338],[117.798748,53.103925],[117.801775,53.105386],[117.802949,53.105907],[117.803781,53.106252],[117.804455,53.106489],[117.805248,53.106682],[117.806053,53.106816],[117.807748,53.107057],[117.808725,53.107132],[117.80969,53.107138],[117.810667,53.107111],[117.8116,53.107046],[117.812533,53.10695],[117.813445,53.106805],[117.814261,53.106655],[117.814819,53.106526],[117.815494,53.106317],[117.816256,53.106038],[117.817018,53.105727],[117.817715,53.105357],[117.818874,53.104563],[117.819368,53.104176],[117.819818,53.103785],[117.820215,53.103393],[117.820666,53.102868],[117.820934,53.102497],[117.821095,53.102106],[117.821299,53.101661],[117.821782,53.100191],[117.821953,53.099756],[117.822114,53.099182],[117.822195,53.09883],[117.8225,53.097498],[117.82294,53.095856],[117.823048,53.095304],[117.823305,53.094268],[117.823466,53.093716],[117.823659,53.093196],[117.823766,53.092659],[117.824024,53.09164],[117.824185,53.091066],[117.824367,53.090486],[117.824507,53.089945],[117.824635,53.089419],[117.824721,53.088893],[117.824957,53.087836],[117.825108,53.087364],[117.825612,53.086093],[117.825826,53.085632],[117.826084,53.085165],[117.826792,53.084108],[117.827114,53.083674],[117.827489,53.083223],[117.827897,53.082772],[117.828326,53.082316],[117.828766,53.081893],[117.829195,53.081506],[117.830257,53.080675],[117.831277,53.079935],[117.831813,53.079565],[117.83236,53.079221],[117.832918,53.078905],[117.834216,53.078218],[117.834914,53.077891],[117.835665,53.077558],[117.836963,53.077027],[117.838551,53.076442],[117.839248,53.076212],[117.840664,53.075799],[117.841405,53.075616],[117.842864,53.075311],[117.844377,53.075048],[117.845128,53.07493],[117.84663,53.074747],[117.848593,53.074554],[117.849591,53.074506],[117.852144,53.074511],[117.853678,53.074565],[117.854655,53.074635],[117.856361,53.074801],[117.893643,53.07913],[117.895499,53.079377],[117.896401,53.079527],[117.89728,53.079709],[117.898128,53.079913],[117.899834,53.080369],[117.901454,53.080927],[117.902248,53.081227],[117.90375,53.081914],[117.904522,53.08229],[117.905102,53.08259],[117.90743,53.083851],[117.9092,53.084795],[117.910466,53.085428],[117.911679,53.086013],[117.913181,53.086683],[117.913921,53.086962],[117.915466,53.087515],[117.91715,53.088019],[117.91862,53.088384],[117.920208,53.088732],[117.921807,53.089043],[117.922611,53.089178],[117.924145,53.089392],[117.926098,53.089591],[117.932127,53.090041],[117.932954,53.0901],[117.967167,53.092393],[117.96801,53.092429],[117.968797,53.092455],[117.969457,53.092479],[117.970357,53.092516],[117.97123,53.092532],[117.971575,53.092541],[117.972514,53.092552],[117.973711,53.092555],[117.974622,53.092563],[117.976021,53.09257],[117.977378,53.092578],[117.978637,53.092587],[117.979815,53.092605],[117.993518,53.0927],[117.994924,53.092723],[117.99575,53.092713],[117.996533,53.092681],[117.998089,53.092568],[117.998904,53.092466],[118.000631,53.092225],[118.001457,53.092069],[118.002262,53.091897],[118.003024,53.091715],[118.00635,53.090792],[118.008614,53.09009],[118.010062,53.089617],[118.011628,53.089151],[118.012487,53.088942],[118.014235,53.088636],[118.015115,53.088545],[118.015974,53.088475],[118.01681,53.088437],[118.017604,53.088427],[118.01916,53.088453],[118.019911,53.088502],[118.020651,53.088587],[118.021467,53.088705],[118.022293,53.08885],[118.023076,53.089022],[118.023806,53.089215],[118.024685,53.089483],[118.025447,53.089752],[118.02608,53.090009],[118.027292,53.090604],[118.028591,53.0912],[118.032088,53.092745],[118.038998,53.095808],[118.043214,53.097632],[118.045242,53.098555],[118.046604,53.099134],[118.04727,53.09945],[118.048675,53.100078],[118.049383,53.100411],[118.050113,53.100722],[118.050832,53.101006],[118.052355,53.101553],[118.053106,53.101805],[118.05463,53.10224],[118.056915,53.102792],[118.058481,53.103125],[118.060187,53.103415],[118.061979,53.103656],[118.062826,53.103742],[118.064425,53.103844],[118.064944,53.103875],[118.066702,53.104038],[118.067488,53.104106],[118.069489,53.104305],[118.070476,53.104413],[118.074613,53.1048],[118.076954,53.104989],[118.077725,53.105059],[118.078877,53.105096],[118.080733,53.105164],[118.082578,53.105206],[118.084928,53.105142],[118.086859,53.105067],[118.089466,53.104944],[118.090292,53.104863],[118.091912,53.104654],[118.096923,53.104155],[118.097738,53.104058],[118.100152,53.103833],[118.101497,53.103657],[118.102877,53.103354],[118.104014,53.103028],[118.104787,53.10276],[118.105559,53.102454],[118.1063,53.102127],[118.107018,53.101762],[118.107705,53.101366],[118.108349,53.100958],[118.108917,53.100534],[118.109475,53.100083],[118.111128,53.098689],[118.112705,53.097299],[118.113681,53.096516],[118.114593,53.095733],[118.115473,53.09495],[118.115956,53.094569],[118.116471,53.094209],[118.117007,53.093855],[118.117533,53.093523],[118.118091,53.093196],[118.118691,53.09289],[118.119335,53.092622],[118.120022,53.092375],[118.120698,53.092149],[118.12161,53.091903],[118.1225,53.091693],[118.123326,53.091516],[118.146882,53.086985],[118.148282,53.086672],[118.149863,53.086279],[118.150346,53.086156],[118.153,53.085417],[118.153815,53.085161],[118.154944,53.084756],[118.155907,53.084428],[118.15804,53.083635],[118.159276,53.083165],[118.161129,53.082506],[118.164783,53.081171],[118.166521,53.080552],[118.168562,53.079794],[118.169726,53.079391],[118.171411,53.078876],[118.172827,53.078488],[118.173977,53.078197],[118.175079,53.077922],[118.176949,53.077551],[118.177983,53.077355],[118.179545,53.077111],[118.184148,53.076438],[118.190775,53.075482],[118.195349,53.074785],[118.200209,53.074114],[118.202004,53.073843],[118.202814,53.073748],[118.203704,53.073686],[118.204533,53.073666],[118.205453,53.073719],[118.206322,53.073811],[118.207534,53.074022],[118.208162,53.074184],[118.208894,53.074408],[118.209575,53.074643],[118.210203,53.074945],[118.210772,53.075262],[118.211362,53.075638],[118.211786,53.075946],[118.212394,53.076469],[118.212834,53.076975],[118.213301,53.077688],[118.213615,53.07833],[118.216281,53.084623],[118.216603,53.085192],[118.216705,53.085361],[118.217032,53.085739],[118.217547,53.086238],[118.218116,53.086683],[118.218695,53.087085],[118.219296,53.087434],[118.219972,53.087713],[118.220712,53.087987],[118.221581,53.088244],[118.222557,53.088453],[118.223619,53.088582],[118.224671,53.088625],[118.22569,53.088598],[118.226688,53.088507],[118.227632,53.088357],[118.228533,53.088137],[118.229402,53.087874],[118.230185,53.087558],[118.230915,53.087193],[118.23232,53.086442],[118.233683,53.085669],[118.234402,53.085294],[118.235786,53.084511],[118.236505,53.08414],[118.237224,53.083792],[118.237964,53.083486],[118.238736,53.083207],[118.23952,53.082944],[118.240346,53.082735],[118.241161,53.082563],[118.241998,53.082434],[118.242813,53.082338],[118.244157,53.082264],[118.247513,53.082187],[118.248411,53.082143],[118.249339,53.082042],[118.250128,53.081942],[118.250927,53.081796],[118.251657,53.08163],[118.252408,53.081437],[118.253148,53.081209],[118.25384,53.080995],[118.254564,53.080705],[118.255889,53.080136],[118.259553,53.078568],[118.264528,53.076383],[118.266978,53.075294],[118.267192,53.075209],[118.271931,53.0731],[118.272564,53.072854],[118.273219,53.072634],[118.274174,53.072355],[118.275096,53.072156],[118.275965,53.072033],[118.276802,53.071958],[118.277575,53.071909],[118.278508,53.071899],[118.278991,53.07192],[118.279849,53.071995],[118.280718,53.072108],[118.281641,53.07229],[118.282607,53.072521],[118.286458,53.073556],[118.287166,53.073733],[118.288593,53.074055],[118.289666,53.074232],[118.290635,53.074386],[118.290777,53.0744],[118.291368,53.074437],[118.291797,53.074465],[118.292426,53.074457],[118.293554,53.074406],[118.294288,53.074319],[118.294909,53.074247],[118.295395,53.074156],[118.295882,53.074046],[118.29618,53.073983],[118.296478,53.073906],[118.297013,53.07375],[118.297673,53.07353],[118.297952,53.073433],[118.298228,53.073324],[118.29846,53.073228],[118.298895,53.073035],[118.299944,53.072583],[118.300404,53.072387],[118.300806,53.072221],[118.301202,53.072066],[118.301632,53.071916],[118.302273,53.071727],[118.302955,53.071546],[118.303236,53.07148],[118.303683,53.071396],[118.3043,53.071295],[118.304888,53.071202],[118.305241,53.071161],[118.306097,53.071105],[118.306535,53.071085],[118.306925,53.07108],[118.307314,53.071094],[118.307832,53.071113],[118.307951,53.071119],[118.308502,53.071163],[118.309565,53.071287],[118.310394,53.071416],[118.31121,53.071614],[118.311993,53.07184],[118.312701,53.072081],[118.313355,53.072349],[118.313978,53.072639],[118.314557,53.072966],[118.315093,53.07332],[118.315587,53.07368],[118.316027,53.074071],[118.316424,53.074495],[118.31681,53.07494],[118.317894,53.076383],[118.320257,53.079479],[118.321714,53.081523],[118.324127,53.084929],[118.32505,53.086141],[118.325565,53.086737],[118.326112,53.087316],[118.326691,53.08789],[118.327099,53.088271],[118.327539,53.088652],[118.328,53.089022],[118.328934,53.08973],[118.330414,53.090733],[118.331165,53.091195],[118.331938,53.091634],[118.332721,53.092048],[118.333515,53.09245],[118.33433,53.09282],[118.336299,53.09367],[118.337485,53.094183],[118.338214,53.094521],[118.340896,53.095695],[118.341459,53.095955],[118.342988,53.096639],[118.343772,53.097036],[118.344426,53.09746],[118.344963,53.0979],[118.345456,53.098404],[118.345885,53.098962],[118.346239,53.099579],[118.346454,53.10018],[118.34655,53.100738],[118.346658,53.101779],[118.346711,53.102937],[118.34684,53.104219],[118.346904,53.105137],[118.346969,53.106548],[118.347065,53.107948],[118.347141,53.109316],[118.347141,53.110233],[118.347098,53.112089],[118.347001,53.114342],[118.346926,53.115726],[118.346808,53.117475],[118.346829,53.118092],[118.346915,53.118698],[118.347076,53.119288],[118.347752,53.121037],[118.348224,53.122099],[118.348578,53.122995],[118.348857,53.123644],[118.349158,53.124282],[118.349522,53.124883],[118.349941,53.125452],[118.350434,53.12602],[118.351979,53.127646],[118.35317,53.128976],[118.35552,53.131594],[118.355852,53.132029],[118.356464,53.132848],[118.356689,53.133359],[118.356893,53.134024],[118.357052,53.134743],[118.357116,53.135163],[118.357187,53.135661],[118.357301,53.136827],[118.357752,53.14058],[118.358016,53.142724],[118.358166,53.143247],[118.358433,53.143903],[118.358989,53.144838],[118.35993,53.146317],[118.360519,53.147092],[118.360991,53.147687],[118.36156,53.148213],[118.362215,53.148707],[118.362912,53.149157],[118.363706,53.149517],[118.364532,53.149828],[118.365422,53.150144],[118.370626,53.15192],[118.374081,53.153132],[118.375035,53.153486],[118.375862,53.153851],[118.377396,53.154554],[118.38117,53.156454],[118.384042,53.157873],[118.388683,53.16017],[118.390582,53.161104],[118.392545,53.162026],[118.393178,53.162289],[118.394101,53.162627],[118.395002,53.162917],[118.39969,53.16422],[118.401375,53.164735],[118.402061,53.164966],[118.402705,53.165224],[118.403553,53.165631],[118.404272,53.166076],[118.404787,53.166516],[118.405731,53.167428],[118.406653,53.168512],[118.407555,53.169644],[118.408048,53.170186],[118.408574,53.170695],[118.409164,53.171173],[118.40984,53.171596],[118.410591,53.171972],[118.411428,53.172283],[118.412297,53.172541],[118.413444,53.172844],[118.420055,53.174229],[118.423503,53.174964],[118.428623,53.176014],[118.429904,53.17631],[118.430607,53.176497],[118.431211,53.176696],[118.431716,53.17691],[118.432328,53.177241],[118.432712,53.177553],[118.433051,53.177835],[118.433332,53.178172],[118.433559,53.178521],[118.433793,53.178955],[118.433966,53.179665],[118.434259,53.181794],[118.434302,53.182304],[118.434473,53.183307],[118.434817,53.185641],[118.434935,53.186225],[118.435065,53.187293],[118.435104,53.187601],[118.435227,53.188678],[118.435348,53.189473],[118.435476,53.190288],[118.43593,53.192241],[118.436515,53.19441],[118.437432,53.1979],[118.437909,53.199719],[118.439481,53.206108],[118.439825,53.207435],[118.440868,53.211245],[118.441383,53.213246],[118.441453,53.213771],[118.441465,53.214062],[118.441468,53.214329],[118.441447,53.214828],[118.441361,53.215311],[118.441234,53.216016],[118.439424,53.22033],[118.437381,53.224935],[118.437005,53.22604],[118.436758,53.226614],[118.436276,53.227821],[118.435471,53.229672],[118.435224,53.230272],[118.434784,53.231474],[118.434602,53.232075],[118.434441,53.23267],[118.434302,53.23325],[118.434184,53.233824],[118.434098,53.234382],[118.433969,53.235476],[118.433877,53.23689],[118.433854,53.237218],[118.43384,53.237767],[118.433658,53.240207],[118.433551,53.241484],[118.433368,53.243437],[118.433293,53.244086],[118.433003,53.247246],[118.432918,53.247836],[118.432692,53.24901],[118.432553,53.24959],[118.432392,53.250158],[118.431576,53.252841],[118.431094,53.254353],[118.430911,53.254831],[118.430804,53.255303],[118.430815,53.255861],[118.430865,53.256129],[118.431051,53.256834],[118.432038,53.25997],[118.432413,53.261123],[118.432606,53.261654],[118.432928,53.262159],[118.433347,53.26262],[118.433926,53.263033],[118.434344,53.263258],[118.434795,53.26343],[118.434932,53.263492],[118.435091,53.263543],[118.435315,53.2636],[118.435662,53.263677],[118.436026,53.263743],[118.436435,53.263806],[118.436735,53.263847],[118.43688,53.263856],[118.437433,53.26389],[118.437635,53.263903],[118.438078,53.263939],[118.441907,53.26424],[118.44247,53.264279],[118.443202,53.264349],[118.444025,53.264413],[118.444913,53.264474],[118.4473,53.264661],[118.447984,53.264723],[118.44841,53.264761],[118.448823,53.264789],[118.449644,53.264858],[118.450149,53.264885],[118.451341,53.264975],[118.453259,53.265093],[118.453989,53.265206],[118.454815,53.265345],[118.455609,53.265554],[118.456339,53.265839],[118.456961,53.266182],[118.457519,53.266547],[118.458055,53.266917],[118.45871,53.267271],[118.459439,53.267544],[118.46019,53.267732],[118.460684,53.267813],[118.461435,53.26785],[118.462154,53.267823],[118.462626,53.267775],[118.463044,53.267684],[118.46433,53.267347],[118.465648,53.266923],[118.468136,53.266086],[118.470705,53.265247],[118.473698,53.26432],[118.474545,53.264084],[118.475206,53.263942],[118.475339,53.263913],[118.479642,53.263301],[118.481541,53.263081],[118.483322,53.262926],[118.48418,53.262926],[118.485038,53.262958],[118.487549,53.263124],[118.488429,53.263156],[118.489233,53.263124],[118.489952,53.263017],[118.49066,53.262824],[118.4911,53.262652],[118.491508,53.262438],[118.492066,53.26203],[118.492634,53.261568],[118.49316,53.261102],[118.493664,53.26063],[118.494338,53.259994],[118.495195,53.259246],[118.495746,53.25882],[118.496486,53.258436],[118.497269,53.258179],[118.497925,53.258032],[118.498628,53.257947],[118.499197,53.257948],[118.499764,53.258],[118.500524,53.258128],[118.501313,53.258317],[118.502134,53.258617],[118.503101,53.259026],[118.504056,53.259479],[118.504786,53.259888],[118.506556,53.261054],[118.508663,53.262518],[118.509747,53.263215],[118.510272,53.263586],[118.511281,53.264331],[118.5123,53.265189],[118.512751,53.265597],[118.513673,53.266482],[118.51451,53.267405],[118.514918,53.267882],[118.515658,53.268859],[118.516087,53.269336],[118.516581,53.269792],[118.51716,53.270211],[118.517611,53.270441],[118.518351,53.270693],[118.519124,53.270849],[118.519864,53.270929],[118.520497,53.270945],[118.521205,53.270897],[118.523394,53.270409],[118.52496,53.270093],[118.525754,53.269948],[118.526516,53.26983],[118.527278,53.269755],[118.528157,53.269728],[118.529472,53.269734],[118.532558,53.269829],[118.534466,53.26991],[118.53541,53.269932],[118.537255,53.269948],[118.543435,53.270098],[118.544229,53.270125],[118.545152,53.270189],[118.54601,53.270286],[118.546826,53.270431],[118.54762,53.270624],[118.548392,53.270865],[118.549079,53.271144],[118.549669,53.271439],[118.550235,53.271767],[118.550399,53.271863],[118.5516,53.272746],[118.5522,53.273192],[118.554111,53.274644],[118.554952,53.275295],[118.555741,53.275816],[118.556417,53.276134],[118.557123,53.276433],[118.557904,53.276711],[118.558592,53.276895],[118.559338,53.277045],[118.560462,53.277211],[118.562447,53.277438],[118.564646,53.277715],[118.565392,53.277801],[118.566493,53.277936],[118.568349,53.278149],[118.568616,53.278171],[118.571588,53.278477],[118.574656,53.278858],[118.574835,53.278881],[118.575978,53.279024],[118.578497,53.27934],[118.582209,53.279824],[118.583164,53.279926],[118.58414,53.280001],[118.585095,53.280065],[118.586039,53.280086],[118.587048,53.280065],[118.588067,53.279985],[118.589076,53.279845],[118.590041,53.279684],[118.591007,53.27947],[118.591973,53.279223],[118.592852,53.278949],[118.5937,53.278665],[118.594505,53.278348],[118.596232,53.27764],[118.596908,53.277383],[118.598292,53.276916],[118.598978,53.276712],[118.600008,53.276449],[118.601038,53.27624],[118.602122,53.276079],[118.603184,53.275961],[118.604268,53.275913],[118.605319,53.275918],[118.60636,53.275951],[118.607358,53.27602],[118.608291,53.276138],[118.61093,53.276567],[118.614068,53.277184],[118.616075,53.27755],[118.61712,53.277751],[118.617928,53.277912],[118.618795,53.278057],[118.619814,53.278154],[118.620759,53.278214],[118.621618,53.278241],[118.622507,53.278228],[118.623263,53.278176],[118.624204,53.278083],[118.624973,53.278005],[118.629631,53.277265],[118.63683,53.276111],[118.638514,53.2758],[118.641218,53.275387],[118.645821,53.274642],[118.648964,53.274153],[118.649917,53.274007],[118.650599,53.273883],[118.651135,53.273759],[118.651955,53.273542],[118.652563,53.273366],[118.653037,53.273201],[118.653464,53.273044],[118.653957,53.272827],[118.654382,53.272636],[118.654826,53.272404],[118.655184,53.272216],[118.655646,53.271994],[118.656129,53.271738],[118.656643,53.27144],[118.657646,53.270903],[118.659994,53.269602],[118.660701,53.269253],[118.66127,53.268988],[118.661785,53.268779],[118.662328,53.268572],[118.662817,53.268392],[118.66337,53.26821],[118.663829,53.268078],[118.664456,53.267903],[118.665164,53.267724],[118.665789,53.267579],[118.666419,53.267439],[118.66702,53.26733],[118.667924,53.267187],[118.669211,53.266983],[118.670524,53.266783],[118.672456,53.266481],[118.673427,53.266312],[118.674724,53.266062],[118.676075,53.265735],[118.67696,53.265502],[118.678898,53.264923],[118.680091,53.26451],[118.681601,53.263902],[118.685077,53.262395],[118.686548,53.261768],[118.689326,53.260549],[118.689479,53.260485],[118.690849,53.259906],[118.691515,53.25968],[118.69263,53.259348],[118.694011,53.259023],[118.695264,53.258846],[118.696141,53.258727],[118.696889,53.25868],[118.698796,53.258587],[118.699583,53.25857],[118.700197,53.258557],[118.700779,53.258607],[118.702371,53.258724],[118.704409,53.258878],[118.705377,53.258955],[118.706407,53.259018],[118.707157,53.259051],[118.707809,53.259068],[118.708526,53.259057],[118.709489,53.259013],[118.710225,53.258945],[118.710638,53.258915],[118.711224,53.258833],[118.712119,53.258705],[118.712972,53.258515],[118.713881,53.258312],[118.71462,53.258103],[118.715258,53.257908],[118.716105,53.257608],[118.718079,53.256805],[118.718948,53.25651],[118.719828,53.256247],[118.720783,53.256043],[118.721774,53.25588],[118.72248,53.255796],[118.723119,53.255727],[118.724014,53.255678],[118.725094,53.255668],[118.726032,53.255705],[118.726817,53.255765],[118.727373,53.255845],[118.728431,53.256032],[118.729289,53.256216],[118.730093,53.256422],[118.730879,53.256682],[118.732192,53.257193],[118.73599,53.258867],[118.742606,53.261723],[118.745176,53.262839],[118.746798,53.263516],[118.748356,53.264181],[118.750449,53.264967],[118.75084,53.265113],[118.751974,53.26549],[118.752046,53.265515],[118.753512,53.266012],[118.753735,53.266082],[118.756688,53.267015],[118.766627,53.270082],[118.779785,53.27412],[118.781962,53.274794],[118.783559,53.275279],[118.785589,53.2759],[118.787379,53.27646],[118.788724,53.27688],[118.789684,53.27719],[118.790542,53.277453],[118.793042,53.278236],[118.794621,53.278715],[118.795447,53.278928],[118.796224,53.279133],[118.797086,53.279352],[118.798803,53.279711],[118.799672,53.279877],[118.801399,53.280145],[118.803105,53.280349],[118.804682,53.28051],[118.806302,53.280596],[118.807858,53.280634],[118.808835,53.280634],[118.809779,53.280612],[118.810734,53.28058],[118.811656,53.280532],[118.813538,53.280358],[118.814827,53.280206],[118.816286,53.279986],[118.817519,53.279779],[118.818882,53.279512],[118.820693,53.279158],[118.821098,53.279062],[118.822307,53.278843],[118.823273,53.278652],[118.824348,53.278466],[118.827945,53.277753],[118.82888,53.277575],[118.830518,53.277263],[118.834547,53.276478],[118.836059,53.276192],[118.837569,53.275893],[118.839599,53.275499],[118.841353,53.27516],[118.842923,53.274856],[118.844529,53.274572],[118.84571,53.274366],[118.847145,53.274136],[118.849132,53.273919],[118.852673,53.273665],[118.853552,53.273622],[118.855677,53.273558],[118.856513,53.273547],[118.85735,53.27351],[118.859904,53.273596],[118.861535,53.273692],[118.863788,53.273869],[118.866171,53.27414],[118.869076,53.274567],[118.8706,53.274862],[118.872898,53.27532],[118.875763,53.276039],[118.878048,53.276709],[118.88028,53.277536],[118.882644,53.278438],[118.884747,53.279384],[118.886857,53.280433],[118.889095,53.281747],[118.891087,53.283057],[118.89299,53.284523],[118.893665,53.285012],[118.905198,53.294208],[118.907531,53.296039],[118.909498,53.29762],[118.913385,53.300687],[118.914428,53.301406],[118.918123,53.303711],[118.919707,53.304642],[118.9217,53.305734],[118.924794,53.30726],[118.927871,53.308848],[118.931816,53.3108],[118.93526,53.312567],[118.936844,53.313368],[118.938193,53.314184],[118.939289,53.314917],[118.94006,53.315494],[118.941569,53.316668],[118.943563,53.318702],[118.944738,53.320002],[118.946731,53.322175],[118.947766,53.323126],[118.948341,53.323625],[118.948933,53.32401],[118.950125,53.324779],[118.951568,53.325552],[118.955098,53.327347],[118.958534,53.329052],[118.960854,53.330219],[118.96325,53.331431],[118.963385,53.331499],[118.96613,53.332907],[118.970872,53.335265],[118.978301,53.33899],[118.985902,53.342837],[118.987169,53.343472],[118.987899,53.343821],[118.988585,53.34417],[118.989873,53.344851],[118.990527,53.345173],[118.991868,53.345747],[118.992514,53.345963],[118.993735,53.346314],[118.994756,53.346542],[118.995776,53.346725],[118.996967,53.346867],[118.998787,53.346974],[119.000462,53.346908],[119.001803,53.346734],[119.002565,53.346611],[119.003445,53.346428],[119.00425,53.346224],[119.004979,53.346021],[119.006338,53.345496],[119.007793,53.345026],[119.008591,53.344772],[119.010087,53.344471],[119.01107,53.34434],[119.012881,53.34423],[119.014486,53.344291],[119.01584,53.3444],[119.017726,53.344766],[119.023801,53.346348],[119.026008,53.346943],[119.027713,53.347542],[119.029383,53.348295],[119.032281,53.350254],[119.03482,53.352133],[119.037368,53.353956],[119.038761,53.354736],[119.04013,53.355439],[119.042144,53.356383],[119.044456,53.357363],[119.046329,53.358018],[119.047915,53.358527],[119.050937,53.359322],[119.052325,53.359646],[119.053614,53.359873],[119.056484,53.360349],[119.058509,53.360571],[119.060779,53.360757],[119.06265,53.36082],[119.068069,53.360939],[119.070634,53.360999],[119.073072,53.361044],[119.077109,53.361248],[119.080785,53.361319],[119.086753,53.361109],[119.089606,53.361045],[119.093313,53.36098],[119.096606,53.360897],[119.098191,53.360864],[119.098534,53.360853],[119.10288,53.360735],[119.105727,53.360644],[119.107942,53.360634],[119.108738,53.360671],[119.110098,53.360801],[119.111319,53.361056],[119.112621,53.361406],[119.113566,53.361733],[119.114214,53.36199],[119.114838,53.362307],[119.115403,53.362623],[119.11594,53.362966],[119.116432,53.363326],[119.116882,53.363717],[119.117331,53.364206],[119.11771,53.364638],[119.11802,53.365107],[119.118244,53.36553],[119.118471,53.366038],[119.118619,53.366529],[119.118748,53.366995],[119.11901,53.367889],[119.119252,53.368841],[119.119413,53.369415],[119.119445,53.369522],[119.119767,53.37059],[119.120169,53.372129],[119.120571,53.373537],[119.121241,53.376002],[119.121501,53.37681],[119.121779,53.377408],[119.122288,53.378207],[119.12322,53.379469],[119.12408,53.380514],[119.125345,53.382128],[119.126161,53.383115],[119.127154,53.384385],[119.128157,53.385399],[119.129525,53.386446],[119.13089,53.387283],[119.132182,53.387858],[119.133193,53.388244],[119.134178,53.388552],[119.135624,53.388898],[119.138249,53.389336],[119.139125,53.389489],[119.145505,53.390577],[119.148037,53.391007],[119.150494,53.391436],[119.161931,53.393367],[119.167135,53.394273],[119.168857,53.394567],[119.170407,53.394831],[119.173561,53.395352],[119.174366,53.395497],[119.175975,53.395835],[119.17745,53.396155],[119.17901,53.396543],[119.182059,53.397428],[119.184,53.398012],[119.185492,53.398468],[119.187037,53.398967],[119.187884,53.399209],[119.18914,53.399606],[119.192605,53.400646],[119.19445,53.401194],[119.195942,53.401655],[119.19769,53.402196],[119.200751,53.403183],[119.201926,53.403581],[119.202647,53.403822],[119.204106,53.4043],[119.205976,53.40494],[119.206595,53.405131],[119.208099,53.405641],[119.209988,53.406277],[119.211808,53.40688],[119.212744,53.407195],[119.214743,53.407752],[119.215511,53.407947],[119.216412,53.408123],[119.21811,53.408405],[119.218933,53.408508],[119.219889,53.408619],[119.220742,53.40869],[119.222924,53.408799],[119.224646,53.408772],[119.225736,53.408709],[119.226497,53.408645],[119.228404,53.408433],[119.230746,53.408006],[119.231701,53.407808],[119.233063,53.407475],[119.23486,53.406907],[119.236754,53.406107],[119.237308,53.40587],[119.23876,53.405249],[119.239045,53.405113],[119.239511,53.40489],[119.240853,53.404332],[119.241496,53.404037],[119.242204,53.403688],[119.243578,53.403071],[119.244983,53.402422],[119.246968,53.401467],[119.247665,53.401156],[119.248738,53.400652],[119.25023,53.400056],[119.251378,53.399622],[119.252892,53.399186],[119.253353,53.399062],[119.254523,53.398848],[119.254877,53.398783],[119.255767,53.398665],[119.257538,53.398531],[119.258135,53.398517],[119.25993,53.39856],[119.261218,53.398681],[119.262066,53.398786],[119.264784,53.399201],[119.265829,53.399353],[119.268337,53.399689],[119.269655,53.399936],[119.271344,53.400305],[119.273205,53.400894],[119.274337,53.401253],[119.275452,53.401813],[119.276118,53.40217],[119.276773,53.402556],[119.277363,53.402958],[119.277867,53.403355],[119.278393,53.403827],[119.278865,53.404208],[119.27924,53.404616],[119.280066,53.405356],[119.281107,53.406145],[119.281665,53.406526],[119.283403,53.407521],[119.285045,53.408237],[119.286436,53.40875],[119.287937,53.409252],[119.290152,53.409739],[119.293703,53.410249],[119.296873,53.410709],[119.300145,53.411185],[119.302039,53.411515],[119.304496,53.412014],[119.304968,53.412105],[119.30702,53.412586],[119.308862,53.41309],[119.310558,53.413634],[119.31221,53.41417],[119.313935,53.414835],[119.315944,53.415677],[119.318174,53.416644],[119.31986,53.417378],[119.323132,53.418837],[119.326428,53.420265],[119.327926,53.420951],[119.329216,53.421542],[119.330506,53.42213],[119.333003,53.423402],[119.334063,53.42396],[119.336959,53.425606],[119.339277,53.426901],[119.342699,53.428754],[119.343652,53.42931],[119.34439,53.429714],[119.34558,53.430293],[119.346865,53.430866],[119.347305,53.431046],[119.347668,53.431193],[119.34891,53.431626],[119.349206,53.431718],[119.349569,53.431818],[119.350012,53.431936],[119.350331,53.432031],[119.350577,53.43211],[119.350876,53.432214],[119.351598,53.432417],[119.351876,53.432507],[119.352246,53.432654],[119.352724,53.432845],[119.353285,53.433067],[119.353574,53.433185],[119.35397,53.43337],[119.354995,53.433865],[119.355243,53.433994],[119.356239,53.434554],[119.357718,53.435406],[119.358667,53.435942],[119.359054,53.436178],[119.36177,53.43765],[119.363167,53.438453],[119.365596,53.4399],[119.366915,53.440729],[119.367469,53.441109],[119.367837,53.441395],[119.369018,53.44227],[119.369696,53.442819],[119.370547,53.443561],[119.371546,53.444504],[119.3723,53.445261],[119.373189,53.446266],[119.375775,53.449477],[119.37797,53.452243],[119.382122,53.457412],[119.383165,53.458722],[119.384192,53.459964],[119.385364,53.46137],[119.386346,53.462524],[119.390827,53.467538],[119.39315,53.470117],[119.394483,53.471579],[119.395432,53.472634],[119.397569,53.474997],[119.39963,53.477273],[119.401771,53.479625],[119.403242,53.481251],[119.403817,53.481896],[119.404345,53.482459],[119.405349,53.483682],[119.406217,53.484758],[119.411939,53.493308],[119.413229,53.495212],[119.413724,53.495915],[119.414195,53.496538],[119.414474,53.496921],[119.414869,53.497376],[119.41521,53.497743],[119.415607,53.498156],[119.416204,53.498702],[119.416632,53.499082],[119.41702,53.499376],[119.418622,53.500505],[119.41931,53.500899],[119.419856,53.501217],[119.420387,53.50149],[119.421418,53.50196],[119.422371,53.502348],[119.422996,53.502597],[119.423282,53.502713],[119.423513,53.502791],[119.424015,53.502955],[119.425144,53.503332],[119.426735,53.503756],[119.427615,53.503947],[119.428647,53.504153],[119.429109,53.504222],[119.429851,53.504348],[119.430756,53.504474],[119.431803,53.504601],[119.43328,53.504767],[119.433827,53.504829],[119.434374,53.50489],[119.434755,53.504936],[119.435216,53.504992],[119.435865,53.505067],[119.436479,53.505129],[119.437166,53.50519],[119.438851,53.50534],[119.440873,53.505463],[119.441562,53.505501],[119.442421,53.505525],[119.444295,53.505552],[119.445438,53.505542],[119.446235,53.505531],[119.446913,53.50551],[119.44834,53.50545],[119.449263,53.505404],[119.451993,53.505207],[119.454235,53.50494],[119.456766,53.504555],[119.459031,53.50414],[119.460566,53.503788],[119.462739,53.503255],[119.463986,53.502899],[119.46566,53.502391],[119.466822,53.501984],[119.469709,53.500935],[119.47058,53.500614],[119.471909,53.500105],[119.472888,53.499759],[119.47772,53.497985],[119.482681,53.496565],[119.484232,53.496134],[119.48968,53.49467],[119.497217,53.492675],[119.50332,53.491034],[119.504274,53.49079],[119.505336,53.490548],[119.506997,53.490234],[119.508066,53.490084],[119.509453,53.489994],[119.51102,53.489984],[119.513202,53.490006],[119.514584,53.490021],[119.516191,53.490052],[119.517598,53.490093],[119.518929,53.490175],[119.520017,53.490299],[119.520398,53.490357],[119.520851,53.49043],[119.520966,53.490451],[119.521924,53.49064],[119.523084,53.49088],[119.524836,53.491463],[119.526268,53.492048],[119.527707,53.492866],[119.528857,53.49364],[119.52988,53.494629],[119.531139,53.496062],[119.535319,53.501197],[119.539219,53.505987],[119.544068,53.511857],[119.545291,53.514013],[119.545858,53.516558],[119.545596,53.519103],[119.544023,53.52678],[119.543939,53.527164],[119.543197,53.530495],[119.542909,53.533881],[119.542638,53.539451],[119.54244,53.545224],[119.542278,53.547302],[119.542062,53.551586],[119.541917,53.555548],[119.541881,53.557722],[119.542206,53.55936],[119.542873,53.560977],[119.543684,53.562368],[119.544567,53.563375],[119.545703,53.564499],[119.548154,53.566608],[119.551038,53.569177],[119.55225,53.570457],[119.552426,53.570643],[119.554589,53.573298],[119.555869,53.575396],[119.557185,53.578114],[119.557798,53.579826],[119.558429,53.582534],[119.558699,53.585316],[119.558537,53.587638],[119.558086,53.589906],[119.557569,53.592185],[119.557149,53.594036],[119.556533,53.596579],[119.555804,53.599833],[119.55461,53.605167],[119.553798,53.608844],[119.553122,53.611638],[119.552931,53.613155],[119.552921,53.613891],[119.55292,53.614334],[119.553035,53.615736],[119.553583,53.620552],[119.553944,53.623485],[119.553872,53.624982],[119.55354,53.626735],[119.552156,53.632199],[119.551911,53.633841],[119.552084,53.634893],[119.552502,53.636124],[119.553439,53.637689],[119.554637,53.638881],[119.555016,53.639205],[119.555248,53.639381],[119.555674,53.639664],[119.556525,53.640244],[119.556971,53.640498],[119.55701,53.640519],[119.557446,53.640729],[119.55817,53.641094],[119.558389,53.641185],[119.558608,53.641272],[119.558944,53.641398],[119.559512,53.641613],[119.559915,53.64176],[119.560226,53.641857],[119.56056,53.641952],[119.561208,53.64213],[119.561748,53.64226],[119.56242,53.642393],[119.562693,53.642444],[119.563026,53.642507],[119.56336,53.642559],[119.563896,53.642631],[119.564599,53.642713],[119.565128,53.642766],[119.565329,53.642779],[119.565981,53.642816],[119.566529,53.642838],[119.567019,53.642838],[119.567556,53.642836],[119.568364,53.642817],[119.569662,53.642751],[119.570982,53.642679],[119.571831,53.642631],[119.572824,53.642558],[119.57416,53.642511],[119.57519,53.64247],[119.576767,53.642429],[119.579115,53.642439],[119.581466,53.642601],[119.583989,53.642926],[119.586469,53.643422],[119.588517,53.643952],[119.591243,53.644798],[119.596333,53.646567],[119.599404,53.647696],[119.606715,53.650209],[119.613565,53.652627],[119.618728,53.654397],[119.623775,53.656191],[119.626501,53.657044],[119.629226,53.657772],[119.632487,53.658455],[119.634815,53.658922],[119.636629,53.659297],[119.637186,53.659437],[119.648447,53.661755],[119.652683,53.66262],[119.654702,53.663186],[119.656577,53.663976],[119.657947,53.664735],[119.659245,53.665642],[119.66047,53.666775],[119.661948,53.668088],[119.663697,53.66922],[119.66604,53.670267],[119.668329,53.670939],[119.674888,53.672448],[119.681117,53.673911],[119.687358,53.675332],[119.690842,53.676255],[119.695007,53.677471],[119.700129,53.679009],[119.702187,53.67951],[119.703751,53.679876],[119.70694,53.680513],[119.707813,53.680687],[119.708547,53.68084],[119.709211,53.680973],[119.709628,53.681066],[119.710507,53.681254],[119.711376,53.681393],[119.712576,53.681534],[119.713178,53.681582],[119.713857,53.681603],[119.714449,53.681606],[119.714896,53.681594],[119.715256,53.681573],[119.715648,53.681551],[119.715939,53.681528],[119.716476,53.681478],[119.717029,53.681396],[119.717817,53.681249],[119.71804,53.681197],[119.718445,53.681103],[119.719179,53.680895],[119.719548,53.680767],[119.719814,53.680661],[119.721129,53.680088],[119.721979,53.679695],[119.722703,53.679355],[119.723539,53.678962],[119.724382,53.678571],[119.725606,53.678002],[119.725811,53.677904],[119.726658,53.677506],[119.727378,53.67717],[119.728768,53.676506],[119.729971,53.675941],[119.731056,53.6754],[119.732165,53.674854],[119.733023,53.674446],[119.733605,53.674173],[119.735193,53.673474],[119.735799,53.673219],[119.73653,53.672921],[119.737454,53.672569],[119.73852,53.672173],[119.739293,53.671901],[119.739861,53.671703],[119.740762,53.671388],[119.742114,53.67091],[119.742747,53.670691],[119.744217,53.670176],[119.74499,53.669919],[119.747211,53.669093],[119.748691,53.66846],[119.749356,53.668148],[119.749968,53.667843],[119.750719,53.667451],[119.752017,53.666727],[119.752682,53.666335],[119.753208,53.666003],[119.756813,53.663852],[119.757938,53.663151],[119.758958,53.662579],[119.759871,53.662065],[119.76119,53.661389],[119.762467,53.660853],[119.764034,53.660359],[119.76486,53.660139],[119.766437,53.659764],[119.767209,53.659641],[119.768829,53.659496],[119.769859,53.659453],[119.770846,53.659442],[119.771823,53.659463],[119.772702,53.659544],[119.773518,53.659635],[119.773754,53.659689],[119.774977,53.65986],[119.775621,53.659995],[119.776801,53.6603],[119.777563,53.660542],[119.778238,53.660805],[119.780384,53.661588],[119.78194,53.662189],[119.784611,53.663186],[119.787302,53.6641],[119.788575,53.664575],[119.788956,53.664704],[119.791821,53.665702],[119.793656,53.6664],[119.79578,53.667183],[119.797733,53.667918],[119.800007,53.668749],[119.8024,53.669516],[119.803215,53.669763],[119.804084,53.669983],[119.804921,53.670219],[119.806412,53.670616],[119.807059,53.670767],[119.807671,53.670885],[119.810228,53.67146],[119.811805,53.671718],[119.814391,53.672045],[119.815333,53.672186],[119.817387,53.672468],[119.828967,53.674034],[119.829624,53.674116],[119.830763,53.674279],[119.834409,53.674756],[119.838606,53.675344],[119.846355,53.676386],[119.849037,53.67684],[119.849831,53.676966],[119.85171,53.677279],[119.853512,53.677654],[119.856913,53.678443],[119.858018,53.678716],[119.861569,53.679682],[119.863232,53.680111],[119.864048,53.680342],[119.867942,53.681382],[119.869444,53.681796],[119.871783,53.682412],[119.875592,53.683437],[119.876364,53.683657],[119.877148,53.68385],[119.877974,53.684069],[119.879647,53.6843],[119.881267,53.684418],[119.882083,53.684439],[119.882898,53.684439],[119.883692,53.684418],[119.885479,53.684344],[119.885987,53.68432],[119.889673,53.684131],[119.891829,53.684017],[119.897127,53.683732],[119.898896,53.683647],[119.902317,53.683499],[119.905977,53.683336],[119.908413,53.683229],[119.911741,53.683061],[119.914446,53.682904],[119.915381,53.682857],[119.918636,53.682702],[119.920245,53.682611],[119.925792,53.682343],[119.926758,53.682284],[119.929415,53.682164],[119.930137,53.682132],[119.933002,53.681962],[119.936618,53.681779],[119.942513,53.681558],[119.944186,53.681531],[119.946587,53.681533],[119.947456,53.681549],[119.948454,53.681549],[119.950482,53.681597],[119.955944,53.681847],[119.961756,53.682093],[119.962368,53.682124],[119.963183,53.68216],[119.964343,53.682212],[119.96711,53.682334],[119.976377,53.682731],[119.979725,53.682879],[119.982922,53.683009],[119.984838,53.683099],[119.987462,53.683201],[119.989393,53.683287],[119.993148,53.683485],[119.995154,53.683566],[119.997729,53.683668],[120.000422,53.683807],[120.005385,53.684011],[120.006025,53.684039],[120.00716,53.684054],[120.01041,53.684151],[120.011674,53.684186],[120.013482,53.684205],[120.014552,53.68421],[120.015858,53.684196],[120.017127,53.684173],[120.018221,53.684146],[120.019474,53.684094],[120.022006,53.683986],[120.024178,53.683886],[120.02619,53.6838],[120.027118,53.683754],[120.028199,53.683708],[120.02946,53.683646],[120.031266,53.683529],[120.034699,53.683385],[120.035601,53.683331],[120.036513,53.683293],[120.038252,53.683214],[120.039514,53.683153],[120.039994,53.683127],[120.041958,53.683009],[120.042934,53.682966],[120.044818,53.682895],[120.046346,53.682801],[120.047119,53.682747],[120.047891,53.682678],[120.048674,53.682576],[120.049468,53.682447],[120.050284,53.682291],[120.051045,53.682114],[120.051845,53.681891],[120.052586,53.681677],[120.053294,53.68143],[120.053959,53.681151],[120.054613,53.680856],[120.055214,53.680539],[120.055777,53.680206],[120.056351,53.67988],[120.057446,53.679233],[120.057904,53.678947],[120.058662,53.678501],[120.059162,53.678224],[120.059492,53.678046],[120.059605,53.677984],[120.059728,53.677926],[120.059931,53.677829],[120.060305,53.677655],[120.060716,53.677471],[120.060919,53.677384],[120.061014,53.677348],[120.06109,53.677315],[120.061684,53.677091],[120.061876,53.677025],[120.062447,53.676829],[120.062888,53.676692],[120.063431,53.676564],[120.063981,53.676424],[120.064701,53.67625],[120.066243,53.675962],[120.067537,53.6757],[120.068047,53.675613],[120.06897,53.675441],[120.069477,53.675358],[120.070996,53.675074],[120.072885,53.674822],[120.077251,53.674098],[120.079872,53.673646],[120.08051,53.673538],[120.081808,53.673301],[120.082486,53.673154],[120.083163,53.672985],[120.083506,53.672886],[120.083984,53.672727],[120.084596,53.67251],[120.08489,53.672389],[120.085192,53.672262],[120.085792,53.671987],[120.086221,53.671771],[120.08662,53.671547],[120.086874,53.671392],[120.08737,53.671065],[120.088439,53.670301],[120.090033,53.668995],[120.090963,53.668309],[120.093012,53.666743],[120.094428,53.665633],[120.095426,53.664876],[120.095844,53.664468],[120.096306,53.66405],[120.096799,53.663637],[120.097282,53.663256],[120.097872,53.662832],[120.098977,53.662108],[120.099546,53.661759],[120.100039,53.661529],[120.100726,53.66125],[120.101445,53.660987],[120.102174,53.660751],[120.102893,53.660563],[120.103784,53.660397],[120.104612,53.660266],[120.105125,53.660222],[120.105498,53.660196],[120.106498,53.660139],[120.107283,53.660158],[120.108129,53.660193],[120.108944,53.660284],[120.109848,53.660429],[120.110668,53.660607],[120.111459,53.660806],[120.1138,53.661495],[120.114508,53.661677],[120.115238,53.661833],[120.115989,53.661962],[120.116869,53.662053],[120.11733,53.662058],[120.118107,53.662087],[120.118922,53.662044],[120.120038,53.661942],[120.120778,53.661856],[120.121722,53.661765],[120.127258,53.660955],[120.128159,53.660805],[120.129769,53.660601],[120.130595,53.660477],[120.132087,53.660282],[120.132878,53.660181],[120.134318,53.659968],[120.135112,53.659877],[120.135938,53.659812],[120.136743,53.659769],[120.137569,53.659753],[120.138395,53.659759],[120.139232,53.659796],[120.140079,53.659877],[120.140884,53.659973],[120.141646,53.660086],[120.142407,53.660225],[120.143169,53.660375],[120.144092,53.660611],[120.144886,53.660847],[120.145637,53.661089],[120.146388,53.661389],[120.147804,53.662017],[120.148426,53.662344],[120.149059,53.662763],[120.150755,53.663958],[120.15115,53.664218],[120.152203,53.66493],[120.15275,53.665289],[120.158586,53.669275],[120.159123,53.669656],[120.159681,53.670021],[120.161247,53.67111],[120.163447,53.672537],[120.163768,53.672773],[120.166826,53.674344],[120.169197,53.675492],[120.170002,53.67583],[120.170624,53.676115],[120.171879,53.676715],[120.17498,53.678148],[120.178746,53.679838],[120.180452,53.680589],[120.18131,53.680948],[120.182168,53.681281],[120.182995,53.681597],[120.18381,53.681881],[120.184647,53.682144],[120.185451,53.68238],[120.18793,53.683062],[120.189571,53.68341],[120.191979,53.683873],[120.195109,53.684373],[120.195618,53.684452],[120.198093,53.68484],[120.200765,53.685213],[120.201698,53.68532],[120.20363,53.685519],[120.205529,53.685658],[120.206494,53.685717],[120.20746,53.68576],[120.209359,53.685792],[120.210281,53.685798],[120.211204,53.685787],[120.212105,53.68576],[120.220861,53.68534],[120.223337,53.685224],[120.225381,53.685198],[120.227547,53.685229],[120.229354,53.685275],[120.230553,53.685338],[120.231652,53.685407],[120.232857,53.685506],[120.233804,53.685605],[120.235053,53.685747],[120.236111,53.685919],[120.23692,53.686053],[120.23787,53.686268],[120.23883,53.68654],[120.239923,53.686912],[120.241375,53.687452],[120.24755,53.689844],[120.254137,53.692396],[120.260239,53.694766],[120.266519,53.697165],[120.267924,53.697674],[120.269138,53.698079],[120.270306,53.698415],[120.271638,53.698784],[120.273113,53.699138],[120.274568,53.699406],[120.276131,53.69967],[120.27766,53.699886],[120.279324,53.70005],[120.280771,53.700164],[120.28235,53.700224],[120.284928,53.700316],[120.294725,53.700705],[120.299542,53.700904],[120.309584,53.701295],[120.316476,53.701552],[120.32103,53.701738],[120.326825,53.701976],[120.329647,53.702105],[120.333896,53.702277],[120.346105,53.702749],[120.349173,53.702862],[120.357188,53.703173],[120.364986,53.703516],[120.366126,53.703562],[120.367221,53.703603],[120.368376,53.703642],[120.369435,53.703708],[120.370258,53.703788],[120.371004,53.703894],[120.371853,53.704055],[120.372894,53.704355],[120.373513,53.704579],[120.374022,53.7048],[120.37456,53.705074],[120.374936,53.705291],[120.375545,53.705705],[120.375996,53.706075],[120.376511,53.706542],[120.377852,53.707834],[120.379384,53.709365],[120.38002,53.709984],[120.380463,53.71039],[120.380933,53.710765],[120.381261,53.711003],[120.381865,53.711432],[120.382489,53.711805],[120.383055,53.71212],[120.383826,53.712489],[120.384448,53.712755],[120.385053,53.712997],[120.385555,53.713183],[120.386254,53.713393],[120.387065,53.713618],[120.38857,53.714025],[120.390233,53.714449],[120.394331,53.715452],[120.395962,53.715876],[120.399309,53.716729],[120.40155,53.717298],[120.402786,53.717609],[120.404023,53.717903],[120.4052,53.718139],[120.406154,53.718284],[120.407023,53.718402],[120.407957,53.718515],[120.408719,53.718585],[120.410306,53.718671],[120.411884,53.718697],[120.412656,53.718687],[120.413622,53.718633],[120.414645,53.718578],[120.415531,53.718477],[120.417495,53.718225],[120.418407,53.71807],[120.419265,53.717882],[120.422795,53.717035],[120.4246,53.716578],[120.427082,53.715968],[120.429543,53.715366],[120.431153,53.714985],[120.435717,53.71381],[120.437004,53.713494],[120.438489,53.71314],[120.440155,53.712814],[120.44109,53.712651],[120.441897,53.712526],[120.442735,53.712412],[120.443535,53.712321],[120.444472,53.712212],[120.445454,53.712144],[120.446274,53.712085],[120.447041,53.712037],[120.448082,53.712008],[120.449225,53.711995],[120.450778,53.712012],[120.452052,53.712078],[120.453983,53.712217],[120.455597,53.712381],[120.459106,53.712785],[120.466718,53.713694],[120.470731,53.714154],[120.475613,53.714733],[120.484593,53.715784],[120.48768,53.716154],[120.489078,53.716302],[120.490791,53.71645],[120.49236,53.716559],[120.493743,53.716627],[120.494939,53.716676],[120.49648,53.716675],[120.498221,53.716642],[120.501437,53.71646],[120.504795,53.71623],[120.508655,53.715937],[120.512198,53.715693],[120.516455,53.71539],[120.518764,53.7152],[120.521522,53.714991],[120.526843,53.714631],[120.529177,53.714457],[120.530905,53.714341],[120.532144,53.714254],[120.533973,53.714092],[120.535865,53.713907],[120.537084,53.713752],[120.538203,53.713604],[120.538913,53.713515],[120.540791,53.713236],[120.542992,53.712953],[120.545093,53.712662],[120.545918,53.712548],[120.547039,53.712385],[120.547914,53.712282],[120.549481,53.712072],[120.554384,53.71137],[120.555804,53.711153],[120.557371,53.710973],[120.558276,53.71088],[120.559644,53.710775],[120.561328,53.710681],[120.562859,53.710646],[120.565041,53.710657],[120.566583,53.710737],[120.568138,53.710812],[120.570048,53.710946],[120.570928,53.711042],[120.571732,53.71115],[120.587193,53.713204],[120.593482,53.714007],[120.597138,53.714545],[120.600443,53.715007],[120.603087,53.715331],[120.604556,53.715504],[120.60658,53.715742],[120.609144,53.716149],[120.610807,53.716455],[120.611697,53.716643],[120.613371,53.717024],[120.614197,53.717238],[120.614991,53.717469],[120.615774,53.717726],[120.617287,53.718241],[120.618027,53.718515],[120.619444,53.719068],[120.62013,53.719357],[120.620785,53.719663],[120.621407,53.719974],[120.621997,53.720285],[120.623124,53.720934],[120.624196,53.721594],[120.624862,53.722039],[120.625775,53.722709],[120.626649,53.723419],[120.627308,53.723971],[120.62778,53.724391],[120.628198,53.724802],[120.629293,53.725977],[120.629711,53.726449],[120.630956,53.727994],[120.632243,53.729491],[120.633777,53.731492],[120.634482,53.732363],[120.635228,53.733264],[120.635352,53.733423],[120.636342,53.734667],[120.637114,53.735499],[120.637972,53.736566],[120.638743,53.73749],[120.639539,53.738444],[120.639936,53.7389],[120.6403,53.739366],[120.641073,53.740295],[120.643026,53.742601],[120.643852,53.743524],[120.644238,53.743975],[120.645032,53.74486],[120.645429,53.745283],[120.648036,53.747998],[120.649238,53.749398],[120.649645,53.749849],[120.650064,53.750294],[120.650456,53.750736],[120.650836,53.751163],[120.651194,53.751534],[120.651737,53.752096],[120.652639,53.753056],[120.653014,53.753502],[120.653422,53.753942],[120.654741,53.755326],[120.655267,53.755782],[120.655729,53.756264],[120.656147,53.756726],[120.65648,53.757155],[120.656855,53.757563],[120.65707,53.757761],[120.657413,53.758126],[120.658314,53.759027],[120.659215,53.760003],[120.659677,53.76047],[120.660503,53.76135],[120.660878,53.7618],[120.661297,53.762251],[120.662541,53.763544],[120.663292,53.764413],[120.664022,53.765293],[120.664365,53.765759],[120.664676,53.76621],[120.665095,53.766687],[120.665374,53.767106],[120.665642,53.767589],[120.666125,53.768586],[120.666318,53.769091],[120.666479,53.76959],[120.666629,53.770105],[120.666758,53.77063],[120.666844,53.77114],[120.666908,53.771628],[120.666951,53.772089],[120.666951,53.77268],[120.666897,53.773645],[120.666844,53.774144],[120.666736,53.774938],[120.666726,53.775426],[120.666565,53.77622],[120.666479,53.776778],[120.666382,53.777636],[120.666339,53.778173],[120.666339,53.778693],[120.666372,53.779219],[120.666447,53.779718],[120.666554,53.780195],[120.666683,53.780656],[120.666865,53.781123],[120.66708,53.781568],[120.66738,53.782137],[120.667702,53.782679],[120.668045,53.783178],[120.668485,53.783709],[120.66885,53.784116],[120.669258,53.784524],[120.669697,53.784921],[120.67017,53.785318],[120.670663,53.785704],[120.671725,53.786429],[120.672873,53.787083],[120.674096,53.787678],[120.675394,53.788215],[120.676081,53.788456],[120.677497,53.78888],[120.678967,53.789245],[120.679729,53.7894],[120.681252,53.789653],[120.682229,53.789771],[120.68313,53.789856],[120.683978,53.789915],[120.6849,53.789948],[120.685844,53.789958],[120.68681,53.789937],[120.687786,53.789883],[120.688763,53.789813],[120.689685,53.789717],[120.691091,53.78947],[120.692807,53.789239],[120.69447,53.788993],[120.695393,53.788869],[120.695809,53.788819],[120.697067,53.788629],[120.698295,53.78845],[120.699012,53.788347],[120.69954,53.788269],[120.700731,53.788093],[120.70194,53.787919],[120.703575,53.787681],[120.704219,53.787582],[120.706047,53.787315],[120.708033,53.787025],[120.709223,53.786842],[120.710971,53.786665],[120.711797,53.786611],[120.712581,53.786589],[120.714126,53.786579],[120.715145,53.7866],[120.7161,53.786638],[120.717033,53.786697],[120.717956,53.786772],[120.720724,53.787008],[120.722634,53.787153],[120.72818,53.78763],[120.72906,53.787711],[120.729403,53.787754],[120.730004,53.787775],[120.73097,53.787839],[120.734307,53.788102],[120.737075,53.788338],[120.738802,53.788462],[120.74039,53.788606],[120.743737,53.788869],[120.746216,53.789111],[120.747149,53.789148],[120.748951,53.789315],[120.749874,53.789379],[120.751537,53.789545],[120.754466,53.789728],[120.756161,53.789862],[120.759433,53.790173],[120.760099,53.790216],[120.76086,53.790307],[120.761365,53.790345],[120.761708,53.790345],[120.762373,53.79043],[120.763339,53.790522],[120.764186,53.790613],[120.765753,53.790801],[120.767319,53.791037],[120.768875,53.791289],[120.769679,53.791444],[120.771278,53.791788],[120.772823,53.792152],[120.774304,53.792544],[120.775763,53.792962],[120.777211,53.793408],[120.777898,53.793638],[120.782018,53.794958],[120.786384,53.796385],[120.790118,53.79757],[120.790257,53.797619],[120.791298,53.797957],[120.794675,53.798992],[120.796324,53.79952],[120.79718,53.799777],[120.800632,53.80095],[120.80354,53.801851],[120.804323,53.802109],[120.805836,53.802688],[120.806544,53.802999],[120.80723,53.803321],[120.80855,53.804035],[120.809162,53.804405],[120.809741,53.80478],[120.810299,53.805166],[120.810825,53.805558],[120.813389,53.80757],[120.813861,53.807956],[120.814773,53.808718],[120.815288,53.809195],[120.815813,53.809656],[120.816382,53.810129],[120.816908,53.810595],[120.818474,53.811829],[120.819504,53.812682],[120.820008,53.813133],[120.821146,53.814264],[120.821553,53.814769],[120.821843,53.815193],[120.822101,53.815627],[120.82253,53.81655],[120.822701,53.817038],[120.82283,53.817526],[120.822937,53.818014],[120.82291,53.818464],[120.823007,53.819584],[120.823148,53.820384],[120.823263,53.820792],[120.823451,53.821438],[120.82363,53.821892],[120.824046,53.822741],[120.824375,53.823277],[120.824765,53.823851],[120.826241,53.825753],[120.827637,53.827444],[120.828593,53.828539],[120.829341,53.829345],[120.830343,53.830335],[120.832085,53.83193],[120.832853,53.832608],[120.833385,53.833084],[120.834132,53.833699],[120.834818,53.834252],[120.835651,53.834885],[120.836166,53.83525],[120.837722,53.836291],[120.839481,53.837369],[120.84214,53.838994],[120.844331,53.840309],[120.84535,53.840926],[120.846637,53.841666],[120.847356,53.842036],[120.847939,53.842295],[120.848525,53.842511],[120.849143,53.842708],[120.849811,53.842866],[120.850824,53.843074],[120.851581,53.843182],[120.85253,53.843256],[120.853349,53.843269],[120.85421,53.843238],[120.854922,53.843176],[120.855713,53.843084],[120.85649,53.842956],[120.857356,53.842762],[120.858479,53.842467],[120.85944,53.842163],[120.861933,53.841464],[120.863928,53.840835],[120.865363,53.840405],[120.865661,53.840316],[120.866507,53.840063],[120.866709,53.840002],[120.869004,53.839314],[120.869805,53.83908],[120.870164,53.838976],[120.870943,53.838775],[120.871804,53.838582],[120.872697,53.838414],[120.873552,53.838293],[120.874367,53.838228],[120.875348,53.838195],[120.876361,53.838235],[120.877238,53.838295],[120.878278,53.838375],[120.87933,53.838508],[120.880477,53.838733],[120.881319,53.838917],[120.882065,53.839084],[120.882748,53.839283],[120.885808,53.840146],[120.886724,53.840511],[120.888372,53.841016],[120.889265,53.841283],[120.890147,53.841582],[120.89087,53.841825],[120.891562,53.842125],[120.892354,53.842517],[120.893114,53.842959],[120.89393,53.843497],[120.894632,53.844021],[120.895125,53.844475],[120.895538,53.844919],[120.896001,53.845451],[120.896419,53.846083],[120.896709,53.846633],[120.896943,53.847173],[120.897063,53.847631],[120.897286,53.848828],[120.897449,53.850351],[120.897524,53.851381],[120.897569,53.851795],[120.897578,53.85188],[120.897825,53.853747],[120.898007,53.855919],[120.898029,53.856418],[120.898071,53.856917],[120.898179,53.857883],[120.898393,53.860227],[120.898458,53.860785],[120.898533,53.861799],[120.898608,53.86234],[120.898715,53.862888],[120.898855,53.863424],[120.899037,53.863955],[120.899423,53.864852],[120.899751,53.865424],[120.90004,53.865912],[120.900376,53.866395],[120.900804,53.866936],[120.901603,53.867872],[120.902461,53.868675],[120.903153,53.869232],[120.903929,53.869813],[120.90526,53.870671],[120.905936,53.871052],[120.906644,53.871417],[120.907298,53.871739],[120.908197,53.872139],[120.90893,53.872451],[120.90987,53.872798],[120.910795,53.873103],[120.911793,53.873392],[120.912732,53.87365],[120.913714,53.873873],[120.914766,53.874077],[120.916085,53.874292],[120.917456,53.874469],[120.919777,53.874753],[120.921164,53.874912],[120.922163,53.875019],[120.922858,53.875114],[120.923352,53.875196],[120.923905,53.875289],[120.924561,53.875433],[120.925334,53.875629],[120.926046,53.875839],[120.926772,53.87613],[120.927465,53.876446],[120.92813,53.876806],[120.930838,53.878337],[120.931217,53.878552],[120.934218,53.880248],[120.935078,53.880672],[120.935907,53.881037],[120.936772,53.881349],[120.937742,53.881664],[120.939066,53.882017],[120.949366,53.884233],[120.952166,53.88479],[120.953969,53.885091],[120.956629,53.885472],[120.9584,53.885676],[120.96017,53.885842],[120.963657,53.88603],[120.964515,53.886056],[120.966232,53.886067],[120.968893,53.886056],[120.971425,53.886031],[120.979718,53.885992],[120.981274,53.886008],[120.982121,53.88603],[120.982655,53.886026],[120.985781,53.885981],[120.997844,53.885929],[121.000603,53.885914],[121.003943,53.885883],[121.006722,53.88589],[121.007489,53.885918],[121.00843,53.885976],[121.009308,53.886067],[121.010714,53.886255],[121.011583,53.886394],[121.012441,53.886561],[121.013278,53.886743],[121.014082,53.886952],[121.014866,53.887178],[121.015606,53.887419],[121.017054,53.887961],[121.017773,53.888277],[121.01846,53.888599],[121.019071,53.888921],[121.019651,53.889254],[121.020842,53.889978],[121.021872,53.890702],[121.022494,53.891099],[121.023824,53.891813],[121.024489,53.892129],[121.025165,53.892408],[121.025852,53.892665],[121.027257,53.893121],[121.028888,53.893508],[121.030551,53.893813],[121.031377,53.893937],[121.032193,53.894023],[121.033445,53.894142],[121.038594,53.894392],[121.040293,53.894483],[121.040744,53.894502],[121.045237,53.894805],[121.051106,53.895116],[121.052878,53.89526],[121.054573,53.895439],[121.056653,53.895741],[121.058596,53.896132],[121.061112,53.896747],[121.063054,53.897332],[121.065081,53.898039],[121.066889,53.898807],[121.074078,53.902357],[121.07646,53.903545],[121.079131,53.904869],[121.081384,53.905986],[121.082111,53.906342],[121.08309,53.906827],[121.083922,53.907231],[121.084388,53.90743],[121.085137,53.907759],[121.085958,53.908091],[121.086502,53.908295],[121.087435,53.908638],[121.088374,53.90895],[121.089326,53.909285],[121.091427,53.910037],[121.092157,53.91028],[121.093001,53.910562],[121.093834,53.910856],[121.096907,53.911971],[121.10244,53.913858],[121.103658,53.914254],[121.1044,53.9145],[121.10731,53.915514],[121.120327,53.919959],[121.121835,53.920444],[121.123489,53.92108],[121.125037,53.921726],[121.126562,53.922494],[121.127344,53.922896],[121.128682,53.923636],[121.129874,53.924444],[121.130506,53.924873],[121.131126,53.925307],[121.13221,53.926185],[121.133133,53.927057],[121.142147,53.936778],[121.14259,53.937237],[121.143577,53.938269],[121.144226,53.938848],[121.144837,53.939304],[121.14532,53.939616],[121.145863,53.939935],[121.146166,53.940104],[121.146551,53.9403],[121.147317,53.940633],[121.147816,53.940828],[121.148271,53.940988],[121.148544,53.941079],[121.149299,53.941312],[121.151139,53.941865],[121.15208,53.942163],[121.153025,53.942457],[121.154036,53.942727],[121.154831,53.942975],[121.156504,53.943483],[121.159151,53.944289],[121.162676,53.945391],[121.163399,53.945604],[121.164242,53.945852],[121.165036,53.946099],[121.166053,53.946408],[121.167115,53.946743],[121.168527,53.94721],[121.169975,53.947641],[121.17134,53.948052],[121.172829,53.948509],[121.175793,53.949401],[121.17776,53.950006],[121.178701,53.950294],[121.179868,53.950632],[121.181422,53.951034],[121.182359,53.951264],[121.184132,53.951656],[121.185345,53.951904],[121.18665,53.952139],[121.188348,53.952405],[121.18997,53.952619],[121.190705,53.952696],[121.192249,53.952864],[121.193822,53.952996],[121.194681,53.953058],[121.196047,53.95312],[121.19652,53.953139],[121.198272,53.953185],[121.201816,53.953224],[121.206826,53.953198],[121.207824,53.953203],[121.209669,53.953219],[121.210517,53.953246],[121.211718,53.953318],[121.212524,53.953412],[121.213059,53.953482],[121.213993,53.953654],[121.215817,53.954077],[121.216718,53.954335],[121.217555,53.95463],[121.218166,53.954893],[121.218939,53.955257],[121.21969,53.955644],[121.220409,53.956051],[121.220913,53.956384],[121.221396,53.956738],[121.221846,53.957108],[121.222275,53.957494],[121.222683,53.957891],[121.223381,53.958728],[121.223702,53.959147],[121.225698,53.961829],[121.226513,53.96287],[121.227318,53.963926],[121.227994,53.964892],[121.228809,53.965863],[121.229678,53.96678],[121.230569,53.967681],[121.23103,53.968127],[121.232929,53.969709],[121.233455,53.970128],[121.234034,53.970557],[121.235182,53.971356],[121.23633,53.972102],[121.239907,53.974439],[121.241255,53.975261],[121.241711,53.975583],[121.241909,53.975723],[121.244752,53.977514],[121.248153,53.979746],[121.249838,53.980814],[121.250921,53.981522],[121.251962,53.982208],[121.252627,53.982664],[121.254505,53.984021],[121.255588,53.984853],[121.256618,53.985701],[121.257933,53.986837],[121.259472,53.988168],[121.259891,53.988565],[121.261167,53.989719],[121.262959,53.991285],[121.263378,53.991671],[121.265309,53.993361],[121.265727,53.993742],[121.266124,53.994139],[121.267401,53.995281],[121.268004,53.995782],[121.268409,53.996118],[121.268946,53.996542],[121.26945,53.996977],[121.270426,53.997851],[121.270931,53.998275],[121.273237,54.000303],[121.274643,54.001585],[121.276284,54.003012],[121.277379,54.003881],[121.277958,54.004278],[121.279192,54.005061],[121.279793,54.005426],[121.281016,54.006118],[121.281541,54.006378],[121.282368,54.006788],[121.283108,54.007131],[121.283805,54.007432],[121.284546,54.007721],[121.286702,54.008467],[121.287442,54.008698],[121.288973,54.00916],[121.289845,54.009379],[121.290707,54.009585],[121.292448,54.009985],[121.29609,54.010844],[121.297474,54.01116],[121.298402,54.011349],[121.298686,54.011407],[121.29992,54.011691],[121.300639,54.011874],[121.301379,54.012072],[121.302152,54.012297],[121.302913,54.012544],[121.303632,54.012791],[121.304319,54.013059],[121.305006,54.013349],[121.306347,54.01396],[121.307559,54.014604],[121.308696,54.015323],[121.309254,54.015725],[121.30978,54.016128],[121.310284,54.016535],[121.310756,54.016954],[121.311196,54.017367],[121.311604,54.017791],[121.311979,54.018225],[121.312333,54.018665],[121.312666,54.019116],[121.313267,54.020022],[121.314383,54.021857],[121.315724,54.024298],[121.315829,54.024488],[121.31596,54.024754],[121.317322,54.027173],[121.31758,54.027656],[121.317831,54.028086],[121.318116,54.028573],[121.31847,54.029115],[121.318878,54.029581],[121.319811,54.030585],[121.32038,54.031062],[121.321002,54.031513],[121.321689,54.031931],[121.322408,54.032328],[121.323127,54.032687],[121.323888,54.033031],[121.324671,54.033363],[121.325519,54.033669],[121.330765,54.035375],[121.338758,54.03795],[121.341237,54.038722],[121.345957,54.040284],[121.347374,54.040734],[121.349659,54.041474],[121.350421,54.041753],[121.351161,54.042048],[121.35188,54.042365],[121.352545,54.042692],[121.353779,54.043416],[121.354358,54.043792],[121.354873,54.044183],[121.355377,54.044607],[121.355839,54.045047],[121.356279,54.045498],[121.356633,54.045981],[121.356955,54.046463],[121.357201,54.046946],[121.357394,54.047418],[121.35746,54.047622],[121.357545,54.047885],[121.357663,54.048346],[121.357725,54.048949],[121.357724,54.049452],[121.357633,54.050396],[121.357339,54.051606],[121.357109,54.052556],[121.356579,54.054934],[121.356504,54.055325],[121.35645,54.05583],[121.35644,54.056398],[121.356461,54.056677],[121.356472,54.05686],[121.356643,54.057659],[121.356815,54.058115],[121.357008,54.058571],[121.357523,54.059483],[121.357824,54.059939],[121.358167,54.060373],[121.358575,54.060792],[121.359014,54.061194],[121.359497,54.061586],[121.360012,54.061972],[121.360538,54.062326],[121.361729,54.06298],[121.362383,54.063308],[121.363124,54.063619],[121.363885,54.063908],[121.364658,54.064171],[121.365699,54.064456],[121.366492,54.064643],[121.367276,54.064799],[121.36807,54.064933],[121.370732,54.065284],[121.373245,54.065629],[121.37485,54.065863],[121.376364,54.065999],[121.377192,54.066053],[121.378249,54.066096],[121.379778,54.066137],[121.380601,54.066151],[121.381395,54.066124],[121.382178,54.066076],[121.382961,54.066011],[121.383744,54.065936],[121.384549,54.06584],[121.388433,54.06525],[121.391147,54.064799],[121.392735,54.064547],[121.395353,54.064128],[121.402241,54.063055],[121.403904,54.062766],[121.404676,54.062648],[121.404933,54.062613],[121.404968,54.062608],[121.405211,54.062575],[121.405621,54.062508],[121.406232,54.062433],[121.408153,54.062127],[121.409097,54.062009],[121.41003,54.061902],[121.410985,54.061827],[121.412798,54.06172],[121.414611,54.061671],[121.415502,54.061666],[121.416371,54.061682],[121.417218,54.061709],[121.419021,54.061795],[121.419105,54.061802],[121.419804,54.061859],[121.420652,54.061945],[121.422368,54.06217],[121.423227,54.062294],[121.424053,54.062428],[121.425662,54.06275],[121.427304,54.063104],[121.428097,54.063297],[121.428891,54.063506],[121.429653,54.063731],[121.430393,54.063957],[121.431134,54.064203],[121.431831,54.064439],[121.432528,54.064702],[121.434717,54.065598],[121.437625,54.066827],[121.43976,54.067696],[121.44109,54.068259],[121.441723,54.068549],[121.445757,54.070242],[121.447409,54.070936],[121.448021,54.071215],[121.448665,54.071488],[121.453503,54.0735],[121.455606,54.074396],[121.457934,54.075361],[121.459254,54.075935],[121.462848,54.077454],[121.463567,54.077743],[121.465069,54.078387],[121.465777,54.078703],[121.466496,54.079004],[121.467773,54.079594],[121.468384,54.0799],[121.469082,54.080275],[121.469758,54.080667],[121.471045,54.081445],[121.471667,54.081842],[121.472837,54.082711],[121.473931,54.08359],[121.476377,54.085607],[121.476871,54.085994],[121.478093,54.086954],[121.479757,54.088354],[121.481645,54.089899],[121.482203,54.09036],[121.483684,54.09168],[121.485164,54.092903],[121.487943,54.095011],[121.489187,54.09588],[121.48982,54.096288],[121.491204,54.097082],[121.491955,54.097474],[121.494155,54.098536],[121.495657,54.099196],[121.497234,54.099855],[121.499283,54.100783],[121.500077,54.101159],[121.50247,54.102232],[121.503335,54.102625],[121.505195,54.103428],[121.50719,54.104311],[121.510516,54.105799],[121.512587,54.106695],[121.514325,54.107489],[121.514791,54.107672],[121.517465,54.108834],[121.518941,54.109448],[121.521129,54.110223],[121.522822,54.110728],[121.524815,54.111219],[121.525436,54.111353],[121.525891,54.111451],[121.526737,54.11162],[121.527685,54.111799],[121.528897,54.11199],[121.53064,54.112194],[121.532391,54.112357],[121.534044,54.112463],[121.53561,54.112511],[121.538578,54.112488],[121.546005,54.112224],[121.554653,54.111936],[121.555386,54.111893],[121.555848,54.111852],[121.556196,54.111818],[121.556529,54.11178],[121.556877,54.111736],[121.557301,54.111673],[121.557823,54.111579],[121.558304,54.111485],[121.559061,54.111309],[121.55946,54.111207],[121.560589,54.110895],[121.561763,54.110567],[121.565708,54.109384],[121.568174,54.108686],[121.5691,54.108433],[121.569834,54.108248],[121.570793,54.108025],[121.571661,54.107815],[121.572589,54.107662],[121.573312,54.107586],[121.574143,54.10748],[121.575092,54.107411],[121.576063,54.10735],[121.577974,54.107307],[121.579526,54.107338],[121.580516,54.107394],[121.58259,54.10758],[121.583388,54.107683],[121.584657,54.107879],[121.587531,54.1084],[121.589128,54.10869],[121.597677,54.110319],[121.600631,54.110894],[121.602853,54.111254],[121.604762,54.111435],[121.606432,54.111535],[121.608241,54.111576],[121.611374,54.111432],[121.613898,54.111115],[121.617733,54.110359],[121.622679,54.109116],[121.627817,54.107874],[121.632325,54.107232],[121.633633,54.107077],[121.634231,54.107006],[121.634799,54.106958],[121.635572,54.10692],[121.637802,54.106868],[121.63948,54.1069],[121.640938,54.106963],[121.64276,54.107108],[121.644494,54.107278],[121.645378,54.107392],[121.647567,54.107757],[121.649535,54.108141],[121.650313,54.108312],[121.65144,54.108514],[121.653757,54.108846],[121.655041,54.108961],[121.655921,54.109033],[121.656704,54.109108],[121.657528,54.109169],[121.658381,54.109216],[121.659894,54.109238],[121.660752,54.109238],[121.662437,54.109204],[121.664,54.109122],[121.66494,54.109063],[121.666657,54.108883],[121.668316,54.108648],[121.669164,54.108524],[121.66999,54.108379],[121.671521,54.108067],[121.673062,54.107695],[121.675974,54.106844],[121.678069,54.1061],[121.678795,54.105809],[121.679489,54.105504],[121.680783,54.104885],[121.682014,54.104245],[121.683186,54.103616],[121.683723,54.103278],[121.684881,54.102527],[121.685725,54.101877],[121.68618,54.101518],[121.686705,54.101095],[121.687231,54.100633],[121.688922,54.099208],[121.690353,54.097838],[121.690909,54.097305],[121.691329,54.096964],[121.69192,54.096503],[121.69311,54.095644],[121.693786,54.095215],[121.69517,54.094389],[121.696511,54.093676],[121.697856,54.093054],[121.699301,54.092469],[121.702359,54.091417],[121.703228,54.091154],[121.704869,54.090714],[121.705685,54.090511],[121.707224,54.090214],[121.707839,54.090096],[121.708249,54.090017],[121.710802,54.089556],[121.71313,54.089153],[121.715351,54.08874],[121.717604,54.088343],[121.720029,54.08793],[121.720812,54.087775],[121.722529,54.087469],[121.724358,54.087149],[121.725254,54.08697],[121.726142,54.086786],[121.727829,54.086401],[121.728687,54.086192],[121.729513,54.085978],[121.73035,54.085736],[121.732078,54.0852],[121.732753,54.084964],[121.73344,54.084712],[121.734717,54.084181],[121.735532,54.083816],[121.736315,54.083446],[121.736916,54.083145],[121.737496,54.082834],[121.738064,54.082518],[121.738772,54.082099],[121.739438,54.081659],[121.74006,54.081219],[121.740671,54.080769],[121.74092,54.080579],[121.741755,54.079927],[121.748074,54.074943],[121.749093,54.074106],[121.750799,54.072776],[121.752645,54.071376],[121.753138,54.071016],[121.754329,54.070228],[121.755606,54.069487],[121.756335,54.069101],[121.757054,54.068747],[121.758449,54.068109],[121.759951,54.067492],[121.760756,54.067208],[121.761625,54.066912],[121.763073,54.066446],[121.763846,54.066215],[121.76612,54.065577],[121.768384,54.064971],[121.769907,54.064536],[121.771089,54.064206],[121.771409,54.064123],[121.775808,54.062937],[121.780218,54.061682],[121.781666,54.061253],[121.782374,54.061028],[121.783082,54.060781],[121.784627,54.060277],[121.785443,54.059992],[121.78835,54.058893],[121.795603,54.056307],[121.796429,54.055991],[121.797244,54.055653],[121.797985,54.055272],[121.79865,54.054885],[121.799369,54.054435],[121.799435,54.054398],[121.799545,54.05433],[121.79968,54.054247],[121.800163,54.053866],[121.800656,54.053442],[121.801107,54.052981],[121.801547,54.052477],[121.801944,54.051935],[121.80219,54.051506],[121.802609,54.050562],[121.80277,54.050074],[121.803296,54.048024],[121.803553,54.046946],[121.803877,54.045364],[121.803896,54.045267],[121.804004,54.044736],[121.804132,54.044226],[121.804283,54.043711],[121.804454,54.043207],[121.804647,54.042714],[121.804916,54.042231],[121.804991,54.042115],[121.805549,54.04126],[121.805881,54.040777],[121.806235,54.040316],[121.806622,54.03987],[121.807458,54.038985],[121.807941,54.038556],[121.808456,54.038143],[121.809014,54.037741],[121.809572,54.037355],[121.810162,54.036979],[121.810774,54.03662],[121.812082,54.03589],[121.812769,54.035541],[121.813477,54.035225],[121.814218,54.03493],[121.814969,54.034667],[121.815741,54.034426],[121.817318,54.033964],[121.818123,54.03376],[121.81896,54.033583],[121.820676,54.033267],[121.822329,54.033025],[121.829882,54.032044],[121.831566,54.031797],[121.832381,54.031658],[121.833186,54.031491],[121.833969,54.031287],[121.834742,54.031067],[121.836265,54.030606],[121.837006,54.030354],[121.837757,54.030059],[121.839237,54.02941],[121.839967,54.029067],[121.840664,54.028702],[121.841297,54.028337],[121.842574,54.027604],[121.843475,54.02706],[121.844923,54.026234],[121.848743,54.024019],[121.849515,54.023627],[121.850299,54.023257],[121.851125,54.022903],[121.851951,54.022581],[121.852777,54.022275],[121.853592,54.022002],[121.854397,54.021776],[121.856114,54.021369],[121.857026,54.021202],[121.858186,54.021004],[121.859997,54.020831],[121.862465,54.020667],[121.866292,54.020443],[121.867433,54.020376],[121.868526,54.0203],[121.869414,54.020246],[121.870748,54.020151],[121.872495,54.020056],[121.87675,54.019824],[121.88153,54.019518],[121.882442,54.019453],[121.885307,54.019282],[121.887672,54.019157],[121.888379,54.019139],[121.890234,54.019041],[121.894161,54.018813],[121.895418,54.018706],[121.896431,54.018634],[121.899113,54.018478],[121.900822,54.018346],[121.901642,54.018253],[121.902404,54.01816],[121.903934,54.017873],[121.905456,54.017506],[121.906249,54.017249],[121.907022,54.01697],[121.907752,54.016659],[121.908427,54.016321],[121.90906,54.015977],[121.909672,54.015607],[121.910241,54.015216],[121.910756,54.014803],[121.91126,54.014379],[121.9117,54.013944],[121.912107,54.013499],[121.912472,54.013048],[121.912783,54.012582],[121.913062,54.012099],[121.91332,54.0116],[121.913513,54.01109],[121.913631,54.010565],[121.913695,54.01006],[121.913685,54.009417],[121.913652,54.008939],[121.913491,54.007893],[121.913298,54.006772],[121.913073,54.005683],[121.912869,54.004594],[121.912687,54.003473],[121.912644,54.002904],[121.912655,54.001982],[121.912719,54.00145],[121.912923,54.000453],[121.913062,53.999975],[121.913245,53.999514],[121.913336,53.999307],[121.913449,53.999053],[121.913921,53.998178],[121.914446,53.99732],[121.914854,53.996778],[121.915577,53.995958],[121.916706,53.994904],[121.917399,53.994256],[121.917702,53.993931],[121.918158,53.993408],[121.918709,53.992883],[121.919188,53.992426],[121.920192,53.991445],[121.920941,53.990688],[121.921246,53.990424],[121.921717,53.990016],[121.922672,53.989033],[121.923489,53.988309],[121.926958,53.984966],[121.928737,53.983303],[121.930529,53.981586],[121.931462,53.980647],[121.931956,53.980202],[121.932481,53.979816],[121.93305,53.979467],[121.933651,53.979156],[121.934284,53.978877],[121.934949,53.978636],[121.935656,53.978441],[121.936512,53.978262],[121.937346,53.978141],[121.937886,53.978082],[121.938385,53.978047],[121.939816,53.977983],[121.940196,53.977992],[121.940861,53.978011],[121.941625,53.978052],[121.941768,53.978067],[121.942739,53.978258],[121.943143,53.978347],[121.943485,53.978437],[121.944162,53.978668],[121.944798,53.978947],[121.945399,53.979242],[121.946568,53.979918],[121.947159,53.980288],[121.948285,53.981001],[121.950549,53.982493],[121.953499,53.984338],[121.954658,53.985084],[121.956299,53.986237],[121.957469,53.987138],[121.957887,53.987535],[121.960693,53.990026],[121.961834,53.991074],[121.969196,53.997792],[121.969821,53.998217],[121.970472,53.998655],[121.971138,53.999033],[121.971895,53.999438],[121.972529,53.999733],[121.973241,54.000033],[121.973499,54.00013],[121.974119,54.000333],[121.974929,54.000591],[121.975388,54.000719],[121.976677,54.00101],[121.978081,54.001253],[121.978696,54.001335],[121.97997,54.001447],[121.981192,54.001497],[121.981557,54.001509],[121.981902,54.001502],[121.98334,54.001457],[121.987784,54.001062],[121.991659,54.000773],[121.994877,54.000452],[121.996235,54.000317],[121.998256,54.000108],[122.000625,53.999896],[122.002993,53.999729],[122.003557,53.99969],[122.003995,53.999656],[122.004135,53.999645],[122.005318,53.999554],[122.00534,53.999552],[122.006608,53.999494],[122.007359,53.999492],[122.009665,53.999514],[122.012143,53.999777],[122.014621,54.000222],[122.016842,54.000844],[122.019063,54.001665],[122.026747,54.005355],[122.027475,54.005704],[122.036412,54.010103],[122.039641,54.011766],[122.042195,54.013166],[122.044018,54.014239],[122.049855,54.01778],[122.056732,54.022055],[122.061517,54.024866],[122.063035,54.025813],[122.064751,54.026883],[122.067968,54.028886],[122.070476,54.030451],[122.075357,54.033422],[122.077235,54.034426],[122.078058,54.03481],[122.078738,54.035128],[122.080057,54.035745],[122.082921,54.036856],[122.084756,54.037478],[122.086354,54.037929],[122.087921,54.038309],[122.090335,54.038819],[122.092717,54.039243],[122.096311,54.039667],[122.098017,54.039806],[122.101268,54.039946],[122.104679,54.03994],[122.106417,54.039849],[122.108123,54.039699],[122.116545,54.038739],[122.122094,54.038052],[122.127135,54.037515],[122.133519,54.036748],[122.135691,54.036493],[122.140986,54.03589],[122.143711,54.035552],[122.148185,54.035064],[122.151768,54.034651],[122.153614,54.034452],[122.155534,54.03427],[122.157422,54.03412],[122.158345,54.034066],[122.159278,54.034034],[122.161937,54.033976],[122.162003,54.033975],[122.170994,54.033707],[122.179728,54.033514],[122.183064,54.033487],[122.184083,54.033514],[122.1861,54.03354],[122.187098,54.033578],[122.188064,54.033642],[122.190853,54.033927],[122.192548,54.034072],[122.193385,54.034173],[122.195327,54.034447],[122.196904,54.034705],[122.197741,54.034823],[122.199522,54.035059],[122.202086,54.035364],[122.205251,54.035638],[122.206839,54.035745],[122.208492,54.035815],[122.211946,54.035906],[122.212962,54.035895],[122.213405,54.03589],[122.214349,54.035879],[122.21686,54.035793],[122.219295,54.035665],[122.222042,54.035434],[122.225776,54.035005],[122.226677,54.034887],[122.227578,54.034758],[122.22937,54.034468],[122.231151,54.034157],[122.233651,54.033691],[122.235448,54.033387],[122.235805,54.033317],[122.240163,54.03251],[122.242792,54.032002],[122.248277,54.031007],[122.252727,54.030177],[122.255655,54.029608],[122.260355,54.028729],[122.261288,54.028562],[122.267894,54.027367],[122.271802,54.02661],[122.272126,54.026553],[122.273428,54.026323],[122.2788,54.025332],[122.278933,54.025306],[122.281024,54.024926],[122.282401,54.024664],[122.283141,54.024569],[122.283776,54.024523],[122.285514,54.024496],[122.286404,54.02455],[122.287316,54.024662],[122.288926,54.025022],[122.290546,54.02559],[122.291318,54.025944],[122.297165,54.02897],[122.297949,54.029319],[122.299612,54.029925],[122.301382,54.030386],[122.303302,54.030713],[122.304311,54.030815],[122.305648,54.030925],[122.306338,54.030982],[122.318591,54.031717],[122.323269,54.032232],[122.326562,54.032854],[122.328408,54.033294],[122.330317,54.033776],[122.336004,54.035445],[122.336991,54.035697],[122.339952,54.03633],[122.341875,54.036586],[122.341926,54.036593],[122.34493,54.036775],[122.348031,54.036684],[122.363652,54.035611],[122.369199,54.035091],[122.373319,54.034833],[122.378726,54.034415],[122.382503,54.0342],[122.38718,54.034173],[122.390785,54.034308],[122.395967,54.034785],[122.398435,54.035096],[122.405473,54.036292],[122.412361,54.037338],[122.422365,54.039056],[122.424077,54.039323],[122.426501,54.039736],[122.434108,54.040976],[122.455341,54.04457],[122.458162,54.044986],[122.462583,54.045744],[122.46464,54.046091],[122.465829,54.046292],[122.470887,54.04722],[122.474266,54.047933],[122.47918,54.049183],[122.485626,54.051001],[122.488469,54.051821],[122.493836,54.053324],[122.497698,54.054167],[122.498749,54.054354],[122.502859,54.054934],[122.505786,54.055216],[122.507547,54.055322],[122.509561,54.05539],[122.51846,54.055557],[122.518974,54.055559],[122.52423,54.055695],[122.527256,54.055856],[122.529101,54.056007],[122.532717,54.056302],[122.541515,54.057219],[122.548703,54.057911],[122.54907,54.057932],[122.554904,54.05827],[122.559915,54.058394],[122.56603,54.05819],[122.57059,54.057879],[122.571602,54.057807],[122.577201,54.057452],[122.578593,54.057367],[122.593774,54.056428],[122.594196,54.056402],[122.597225,54.056215],[122.601628,54.055942],[122.603013,54.055845],[122.608645,54.055449],[122.611816,54.055224],[122.615422,54.05503],[122.617756,54.055049],[122.620115,54.055118],[122.621597,54.055181],[122.622822,54.055259],[122.625961,54.055549],[122.628998,54.055944],[122.631444,54.05635],[122.634587,54.057031],[122.636154,54.057428],[122.645754,54.060163],[122.645853,54.060191],[122.647127,54.060561],[122.648953,54.061022],[122.650541,54.061392],[122.653052,54.061897],[122.656474,54.062401],[122.660766,54.062803],[122.662375,54.062878],[122.664714,54.062862],[122.668705,54.062573],[122.672567,54.062144],[122.674971,54.061806],[122.676526,54.061516],[122.678736,54.060996],[122.682352,54.059992],[122.684498,54.059338],[122.68803,54.058175],[122.688211,54.058115],[122.692791,54.056607],[122.698756,54.054735],[122.702297,54.053518],[122.703992,54.052874],[122.706535,54.051822],[122.70911,54.050594],[122.710826,54.049714],[122.712468,54.048834],[122.714764,54.047472],[122.71691,54.046066],[122.71824,54.045111],[122.721791,54.042193],[122.723658,54.04075],[122.72633,54.03898],[122.728422,54.037762],[122.729602,54.037145],[122.730438,54.036742],[122.73267,54.035665],[122.735342,54.034538],[122.737402,54.033776],[122.739462,54.03309],[122.744574,54.031647],[122.745585,54.031352],[122.746092,54.0312],[122.747154,54.030886],[122.749371,54.030173],[122.750775,54.029676],[122.75214,54.029189],[122.75357,54.028646],[122.754809,54.028172],[122.756089,54.027641],[122.757414,54.027058],[122.758352,54.026626],[122.759597,54.026048],[122.76074,54.025487],[122.762204,54.024746],[122.763054,54.024297],[122.764205,54.023662],[122.76522,54.023075],[122.766433,54.022354],[122.768258,54.021217],[122.769811,54.020256],[122.770946,54.019546],[122.772097,54.018831],[122.773638,54.017873],[122.774093,54.017599],[122.774853,54.017124],[122.775669,54.01662],[122.776404,54.016162],[122.777159,54.015693],[122.778383,54.014931],[122.779604,54.014178],[122.781426,54.013158],[122.784383,54.011627],[122.786143,54.01087],[122.789715,54.009524],[122.79155,54.008912],[122.793513,54.008333],[122.79597,54.0077],[122.798191,54.007212],[122.800466,54.006788],[122.802815,54.006423],[122.805133,54.006134],[122.807418,54.005908],[122.810519,54.005704],[122.815261,54.005613],[122.822547,54.005596],[122.824598,54.005591],[122.837974,54.005506],[122.842358,54.005514],[122.861351,54.005431],[122.865278,54.005398],[122.866476,54.005393],[122.868484,54.005364],[122.871748,54.005355],[122.872027,54.005349],[122.874137,54.005343],[122.875085,54.00534],[122.875117,54.00534],[122.875648,54.00534],[122.880538,54.005366],[122.883501,54.005433],[122.893016,54.005675],[122.894898,54.005718],[122.901832,54.005839],[122.911477,54.006128],[122.915727,54.006211],[122.918011,54.006256],[122.920607,54.006289],[122.925854,54.00638],[122.934902,54.006643],[122.938832,54.00684],[122.94312,54.007095],[122.952068,54.007739],[122.962498,54.00845],[122.973028,54.009165],[122.973954,54.009231],[122.974376,54.009261],[122.985613,54.010066],[122.995731,54.010597],[123.000033,54.010715],[123.00691,54.010817],[123.015096,54.010795],[123.020085,54.010827],[123.020163,54.010827],[123.025106,54.010814],[123.031651,54.010763],[123.042498,54.01072],[123.050412,54.010689],[123.050536,54.010689],[123.054079,54.010786],[123.058292,54.011018],[123.061809,54.011348],[123.067796,54.012028],[123.073044,54.012754],[123.082645,54.014084],[123.086424,54.014612],[123.0881,54.014847],[123.090412,54.01517],[123.093831,54.015613],[123.094973,54.015768],[123.099209,54.016387],[123.10115,54.016629],[123.104052,54.016941],[123.106504,54.01716],[123.108676,54.01727],[123.110577,54.017307],[123.110912,54.017313],[123.11327,54.0173],[123.115642,54.017201],[123.117964,54.01705],[123.119675,54.016874],[123.120464,54.016793],[123.12565,54.016145],[123.133328,54.015259],[123.134777,54.0151],[123.139819,54.01455],[123.147426,54.013628],[123.156846,54.012721],[123.160998,54.012421],[123.165042,54.01219],[123.190952,54.010801],[123.199416,54.010309],[123.200852,54.010226],[123.202872,54.010109],[123.205783,54.010007],[123.209127,54.010084],[123.21116,54.010205],[123.214018,54.010541],[123.216694,54.011035],[123.21934,54.011643],[123.220848,54.012101],[123.220929,54.012126],[123.222721,54.012689],[123.233251,54.016089],[123.233758,54.016252],[123.240402,54.018397],[123.24391,54.019453],[123.243976,54.019471],[123.245766,54.019958],[123.249704,54.020918],[123.251721,54.021342],[123.257182,54.022313],[123.283922,54.026786],[123.295451,54.028718],[123.299088,54.029329],[123.302126,54.029818],[123.30735,54.030729],[123.311169,54.031196],[123.31309,54.031379],[123.317885,54.031711],[123.322351,54.032005],[123.328593,54.032478],[123.331511,54.03273],[123.333431,54.032961],[123.335223,54.033208],[123.337551,54.033605],[123.348323,54.035906],[123.351595,54.036432],[123.355694,54.036893],[123.378643,54.038304],[123.38155,54.038368],[123.390315,54.03819],[123.39362,54.038095],[123.395962,54.038018],[123.414362,54.03758],[123.414381,54.03758],[123.417331,54.03766],[123.419359,54.037778],[123.426193,54.038374],[123.42792,54.03861],[123.429487,54.038958],[123.430881,54.039404],[123.432201,54.039935],[123.43336,54.040552],[123.434637,54.041426],[123.435556,54.04221],[123.43619,54.042852],[123.437464,54.044345],[123.43908,54.046323],[123.44201,54.049925],[123.444214,54.052634],[123.444795,54.053241],[123.445342,54.053769],[123.44588,54.05422],[123.446513,54.054682],[123.447318,54.055161],[123.448164,54.055641],[123.448979,54.056006],[123.450009,54.056421],[123.451305,54.056809],[123.463663,54.060078],[123.46736,54.061056],[123.47002,54.061763],[123.472224,54.062313],[123.474043,54.062677],[123.476625,54.063119],[123.478989,54.063447],[123.481695,54.063722],[123.496252,54.064895],[123.497282,54.064971],[123.498301,54.065056],[123.499299,54.065158],[123.500254,54.065282],[123.501209,54.065443],[123.502132,54.065636],[123.503054,54.065856],[123.503934,54.066092],[123.504771,54.066381],[123.505838,54.066818],[123.50667,54.067205],[123.507562,54.067671],[123.508312,54.068139],[123.509622,54.06907],[123.517517,54.075061],[123.519946,54.076844],[123.521976,54.078332],[123.522849,54.078874],[123.524033,54.079495],[123.52523,54.080093],[123.526427,54.080548],[123.527647,54.08099],[123.528888,54.08138],[123.530481,54.081782],[123.537043,54.083267],[123.543116,54.084642],[123.545281,54.085015],[123.547268,54.085275],[123.549026,54.085472],[123.550731,54.085593],[123.552526,54.085626],[123.554655,54.08558],[123.557002,54.085519],[123.559606,54.085441],[123.566129,54.085162],[123.568805,54.085017],[123.578815,54.084582],[123.580913,54.084545],[123.582721,54.084537],[123.584316,54.084572],[123.585957,54.084639],[123.587533,54.084754],[123.588924,54.084883],[123.590877,54.085143],[123.60342,54.087101],[123.605076,54.08741],[123.6067,54.087743],[123.60829,54.088084],[123.608546,54.088148],[123.61013,54.088539],[123.617962,54.090721],[123.619036,54.09102],[123.622221,54.091895],[123.624115,54.092387],[123.625965,54.092743],[123.628063,54.093056],[123.630221,54.093323],[123.632534,54.093462],[123.639278,54.093729],[123.644417,54.093905],[123.645684,54.093949],[123.649065,54.094065],[123.66947,54.094774],[123.671246,54.094809],[123.672935,54.094752],[123.674564,54.094652],[123.676031,54.094454],[123.677832,54.094063],[123.679377,54.093614],[123.680844,54.093064],[123.681961,54.092518],[123.683077,54.091866],[123.684572,54.090818],[123.686229,54.08954],[123.691124,54.085579],[123.691888,54.084933],[123.694361,54.082557],[123.695588,54.081577],[123.695757,54.081442],[123.696989,54.080557],[123.698171,54.079808],[123.699524,54.079109],[123.701298,54.078285],[123.713449,54.072878],[123.714903,54.072235],[123.733458,54.064022],[123.736375,54.062868],[123.738328,54.06223],[123.740218,54.061671],[123.74214,54.061111],[123.743755,54.060723],[123.74598,54.060255],[123.748278,54.05986],[123.757738,54.058482],[123.763784,54.057586],[123.774054,54.056146],[123.778636,54.055475],[123.778674,54.055469],[123.781886,54.054998],[123.789262,54.053957],[123.790637,54.053753],[123.802063,54.052078],[123.823681,54.048908],[123.830474,54.047926],[123.833988,54.047321],[123.842031,54.045938],[123.854539,54.043797],[123.870301,54.041117],[123.873465,54.040759],[123.889568,54.039217],[123.893675,54.038808],[123.895275,54.03862],[123.897115,54.038244],[123.89787,54.038043],[123.898887,54.037743],[123.899414,54.037564],[123.90035,54.037172],[123.901246,54.036735],[123.901394,54.036648],[123.902404,54.036051],[123.90333,54.035503],[123.906514,54.033621],[123.907215,54.033207],[123.9085,54.032435],[123.910676,54.031127],[123.911653,54.03063],[123.912971,54.030159],[123.914124,54.029858],[123.914803,54.029736],[123.915293,54.029688],[123.916173,54.029614],[123.917497,54.029578],[123.918347,54.029617],[123.919026,54.02968],[123.919851,54.029814],[123.920301,54.029909],[123.922193,54.030449],[123.925803,54.031542],[123.927582,54.032],[123.929063,54.032306],[123.931691,54.032664],[123.932658,54.032744],[123.934033,54.032782],[123.93666,54.032727],[123.9377,54.032677],[123.951254,54.032058],[123.969663,54.031296],[123.971448,54.031253],[123.973128,54.031221],[123.974816,54.031322],[123.97643,54.031581],[123.98027,54.032403],[123.981712,54.032644],[123.982967,54.032812],[123.983989,54.032903],[123.984972,54.03292],[123.986006,54.032874],[123.987495,54.032749],[123.989128,54.032548],[123.989993,54.032377],[123.990988,54.032135],[123.992546,54.031668],[123.994128,54.031029],[123.997039,54.029509],[124.008032,54.02294],[124.022883,54.014168],[124.024685,54.012601],[124.026055,54.010856],[124.026722,54.01],[124.027937,54.008824],[124.029386,54.00799],[124.031058,54.007339],[124.032415,54.007057],[124.033508,54.006899],[124.034609,54.006817],[124.036747,54.006825],[124.046704,54.007137],[124.047879,54.007174],[124.075206,54.008032],[124.080298,54.008031],[124.085671,54.007773],[124.105177,54.006835],[124.108573,54.006672],[124.116461,54.00628],[124.120559,54.006068],[124.122188,54.006022],[124.124976,54.006075],[124.127614,54.00628],[124.131008,54.006724],[124.133577,54.00723],[124.135827,54.007791],[124.137909,54.008394],[124.139719,54.009035],[124.141441,54.009746],[124.143199,54.010572],[124.145483,54.011878],[124.152875,54.017135],[124.1534,54.017508],[124.156232,54.019514],[124.158514,54.020666],[124.159721,54.021136],[124.160651,54.021459],[124.161431,54.021706],[124.162234,54.021931],[124.163105,54.022152],[124.163857,54.022314],[124.165115,54.022554],[124.166194,54.022713],[124.167516,54.022856],[124.16836,54.022925],[124.169343,54.022974],[124.170214,54.022994],[124.171297,54.022983],[124.172394,54.022944],[124.173027,54.022898],[124.173947,54.022816],[124.175076,54.022674],[124.175961,54.022532],[124.177235,54.022281],[124.178314,54.022028],[124.179099,54.021814],[124.179863,54.021593],[124.182637,54.020749],[124.183705,54.020416],[124.183892,54.020358],[124.187045,54.019415],[124.187806,54.019183],[124.189166,54.018748],[124.190069,54.018474],[124.191211,54.018115],[124.191904,54.017902],[124.192311,54.017696],[124.192416,54.017616],[124.192506,54.017526],[124.192558,54.017433],[124.192598,54.017325],[124.192608,54.01721],[124.192593,54.01711],[124.192508,54.016963],[124.192398,54.016849],[124.192188,54.016725],[124.191948,54.016611],[124.191703,54.016532],[124.191453,54.016455],[124.191074,54.016364],[124.190649,54.016273],[124.190294,54.016215],[124.189949,54.016185],[124.189639,54.016191],[124.189414,54.016229],[124.189219,54.016288],[124.189039,54.016385],[124.188919,54.016491],[124.188839,54.016617],[124.188799,54.016825],[124.189041,54.017396],[124.189642,54.018439],[124.18982,54.018749],[124.19027,54.01953],[124.190958,54.020762],[124.191544,54.021896],[124.19165,54.022084],[124.191891,54.022612],[124.192019,54.022935],[124.192101,54.023216],[124.192199,54.023553],[124.19227,54.023985],[124.192267,54.024386],[124.192206,54.024865],[124.192079,54.025227],[124.191949,54.025586],[124.191722,54.026116],[124.191308,54.026795],[124.190649,54.028152],[124.190478,54.028988],[124.190506,54.029534],[124.190637,54.030238],[124.19077,54.030766],[124.191161,54.031487],[124.191557,54.032024],[124.192085,54.032611],[124.192871,54.033217],[124.194038,54.033929],[124.195128,54.034394],[124.195617,54.0346],[124.196068,54.034754],[124.197307,54.03508],[124.199078,54.03536],[124.201761,54.035575],[124.20295,54.03567],[124.204657,54.035795],[124.208693,54.036164],[124.213285,54.036534],[124.214852,54.03664],[124.214966,54.036649],[124.216933,54.036803],[124.218887,54.036942],[124.220283,54.037093],[124.220416,54.037107],[124.22067,54.037134],[124.221694,54.037332],[124.223106,54.03761],[124.224126,54.03794],[124.225203,54.038319],[124.226189,54.038773],[124.226975,54.039202],[124.227264,54.039397],[124.227645,54.03961],[124.22775,54.039668],[124.228579,54.040307],[124.229139,54.040868],[124.229166,54.040901],[124.230093,54.042052],[124.230478,54.043019],[124.230779,54.044121],[124.230807,54.04445],[124.230814,54.044819],[124.230794,54.045204],[124.230722,54.045765],[124.230641,54.04655],[124.230622,54.046929],[124.230642,54.047321],[124.230692,54.047624],[124.230837,54.048183],[124.230988,54.048541],[124.231133,54.048834],[124.231438,54.04934],[124.231846,54.0499],[124.232139,54.050222],[124.232795,54.050803],[124.233252,54.051129],[124.233381,54.051213],[124.233668,54.051402],[124.234066,54.051638],[124.234518,54.051874],[124.235183,54.052156],[124.236147,54.05252],[124.236912,54.052758],[124.240359,54.053743],[124.240893,54.053921],[124.241537,54.054145],[124.242071,54.054369],[124.242627,54.054627],[124.243133,54.054885],[124.243299,54.05497],[124.244046,54.055426],[124.245781,54.056599],[124.246915,54.057429],[124.24834,54.058457],[124.248932,54.058883],[124.251627,54.060674],[124.252334,54.061161],[124.252805,54.06143],[124.253046,54.061569],[124.253684,54.061877],[124.254199,54.062089],[124.25487,54.062352],[124.255287,54.062471],[124.255785,54.062614],[124.256788,54.062832],[124.257604,54.062988],[124.258232,54.063061],[124.259298,54.063161],[124.260972,54.063275],[124.261874,54.063365],[124.26283,54.063482],[124.263405,54.063595],[124.264147,54.063775],[124.264402,54.063837],[124.2649,54.063989],[124.266339,54.064594],[124.267502,54.065206],[124.268106,54.065604],[124.268828,54.066227],[124.26941,54.066823],[124.269768,54.067293],[124.27032,54.068269],[124.271653,54.0706],[124.272652,54.072442],[124.273375,54.073716],[124.274434,54.075162],[124.275305,54.076176],[124.276274,54.077071],[124.277584,54.078233],[124.278725,54.07909],[124.279254,54.079475],[124.27991,54.07995],[124.280105,54.080079],[124.280382,54.080263],[124.280844,54.08063],[124.282721,54.082123],[124.284974,54.083857],[124.285368,54.084123],[124.28601,54.084412],[124.286415,54.084643],[124.286726,54.084941],[124.286995,54.085222],[124.291014,54.087952],[124.29367,54.089897],[124.295755,54.09142],[124.296516,54.091976],[124.298179,54.093316],[124.299102,54.094474],[124.299574,54.095619],[124.299874,54.096965],[124.29996,54.097934],[124.29992,54.098225],[124.299831,54.098878],[124.299359,54.100086],[124.299125,54.100731],[124.298994,54.101092],[124.29893,54.102476],[124.298976,54.102925],[124.299059,54.103747],[124.299552,54.104741],[124.300444,54.105974],[124.300841,54.106312],[124.300959,54.106414],[124.304855,54.10992],[124.306975,54.111843],[124.308013,54.112809],[124.30822,54.113002],[124.309215,54.113969],[124.310191,54.114992],[124.310908,54.116077],[124.31151,54.117047],[124.311957,54.117941],[124.312489,54.119275],[124.312746,54.120344],[124.312804,54.120963],[124.312577,54.122104],[124.312829,54.123869],[124.313016,54.1247],[124.31329,54.125527],[124.313826,54.126554],[124.314372,54.127396],[124.314661,54.1284],[124.314963,54.12917],[124.315903,54.130649],[124.316654,54.131894],[124.317212,54.13334],[124.318499,54.136363],[124.319176,54.137546],[124.319665,54.13828],[124.32026,54.139079],[124.320961,54.139664],[124.321737,54.140301],[124.322517,54.140847],[124.323088,54.141189],[124.323737,54.141579],[124.328188,54.143992],[124.328724,54.14437],[124.329755,54.144978],[124.333085,54.146906],[124.334807,54.147883],[124.335126,54.148055],[124.336317,54.148677],[124.338325,54.149866],[124.339382,54.150602],[124.340593,54.151498],[124.341003,54.151827],[124.341299,54.152103],[124.342218,54.153011],[124.342489,54.153306],[124.342881,54.153731],[124.344048,54.155257],[124.344943,54.156709],[124.345879,54.158388],[124.34633,54.16021],[124.346405,54.160794],[124.346416,54.161297],[124.346416,54.161712],[124.346341,54.162271],[124.346201,54.163225],[124.346105,54.164369],[124.346008,54.165154],[124.345976,54.165725],[124.345912,54.166083],[124.34589,54.166787],[124.345922,54.167289],[124.345933,54.168087],[124.346008,54.169098],[124.346148,54.169717],[124.346266,54.170323],[124.346427,54.171114],[124.346454,54.171276],[124.346502,54.17156],[124.346716,54.172326],[124.346977,54.173507],[124.347043,54.173847],[124.347138,54.17488],[124.347044,54.175721],[124.346679,54.17675],[124.346389,54.177137],[124.346148,54.177495],[124.345509,54.178173],[124.344699,54.178794],[124.344069,54.179276],[124.343311,54.179618],[124.342534,54.180162],[124.341114,54.18121],[124.340762,54.181563],[124.340614,54.181913],[124.340675,54.182216],[124.341195,54.183485],[124.341917,54.185297],[124.342108,54.185712],[124.342322,54.185995],[124.342632,54.18625],[124.343318,54.186654],[124.343978,54.187113],[124.344656,54.187576],[124.345499,54.187952],[124.346872,54.188469],[124.34787,54.188777],[124.34905,54.189122],[124.350686,54.189631],[124.352628,54.190258],[124.354372,54.190752],[124.354746,54.190857],[124.355616,54.191134],[124.356319,54.191278],[124.357729,54.191464],[124.358438,54.191536],[124.359194,54.191552],[124.359704,54.191552],[124.360707,54.191561],[124.361823,54.191533],[124.36458,54.191191],[124.366334,54.190808],[124.367284,54.190635],[124.368024,54.190409],[124.368276,54.190409],[124.368517,54.190356],[124.368984,54.190265],[124.369783,54.190095],[124.370835,54.189938],[124.372873,54.189825],[124.374021,54.189819],[124.37592,54.189919],[124.378023,54.190258],[124.379793,54.190773],[124.381692,54.19152],[124.383345,54.192462],[124.384793,54.193905],[124.385555,54.194935],[124.385924,54.195499],[124.386735,54.196717],[124.387186,54.197389],[124.387507,54.197948],[124.388516,54.199206],[124.389047,54.199705],[124.389422,54.2],[124.390839,54.201026],[124.393358,54.202641],[124.395634,54.203891],[124.396112,54.204214],[124.396799,54.204738],[124.397018,54.204989],[124.397662,54.205692],[124.398134,54.206322],[124.398617,54.207292],[124.398832,54.207775],[124.39896,54.208224],[124.39909,54.208654],[124.398812,54.210682],[124.398565,54.211711],[124.398217,54.212728],[124.397657,54.21351],[124.397802,54.213759],[124.398224,54.214095],[124.399212,54.214823],[124.399534,54.215039],[124.399855,54.215324],[124.399946,54.215609],[124.40009,54.216201],[124.400189,54.216778],[124.400399,54.217482],[124.400721,54.218225],[124.401105,54.219097],[124.401273,54.219314],[124.401487,54.21953],[124.401731,54.2197],[124.402052,54.219892],[124.402528,54.220118],[124.403028,54.220282],[124.403208,54.220339],[124.403588,54.220447],[124.403911,54.22051],[124.404157,54.22054],[124.404464,54.220525],[124.404762,54.220467],[124.405807,54.220171],[124.40671,54.219884],[124.407121,54.219801],[124.407688,54.21975],[124.409743,54.219745],[124.410835,54.219765],[124.411655,54.219794],[124.412479,54.219862],[124.413184,54.21993],[124.413438,54.219938],[124.413724,54.219918],[124.413944,54.219879],[124.414291,54.219786],[124.414958,54.219519],[124.415547,54.219274],[124.415898,54.219075],[124.41619,54.21884],[124.416295,54.218746],[124.41643,54.218657],[124.416771,54.218495],[124.417368,54.218299],[124.417873,54.21816],[124.418519,54.217931],[124.419056,54.217759],[124.419597,54.217497],[124.419976,54.217322],[124.421321,54.216999],[124.422456,54.216735],[124.423597,54.216478],[124.424437,54.216339],[124.424807,54.216319],[124.425871,54.21627],[124.428048,54.216209],[124.429171,54.216183],[124.430236,54.216154],[124.43077,54.216168],[124.431359,54.216228],[124.431573,54.216273],[124.43203,54.216369],[124.432838,54.216559],[124.43313,54.216669],[124.433372,54.216846],[124.433537,54.217053],[124.433567,54.217178],[124.433677,54.217771],[124.433675,54.217934],[124.433646,54.218147],[124.433477,54.218762],[124.433307,54.219461],[124.43328,54.219558],[124.433181,54.220173],[124.433055,54.22068],[124.432899,54.221173],[124.432816,54.221456],[124.432785,54.221731],[124.432809,54.221904],[124.432847,54.222095],[124.432935,54.222385],[124.433072,54.222819],[124.433351,54.223428],[124.433574,54.223673],[124.433853,54.224031],[124.43406,54.224267],[124.434339,54.224529],[124.43455,54.224682],[124.435004,54.224917],[124.435411,54.225072],[124.436009,54.225267],[124.436595,54.225485],[124.436819,54.225606],[124.436975,54.225714],[124.437125,54.22584],[124.437226,54.225934],[124.437508,54.226228],[124.437774,54.226592],[124.438093,54.227118],[124.438165,54.227285],[124.438196,54.227444],[124.438206,54.227605],[124.438201,54.227764],[124.438141,54.228016],[124.437688,54.228771],[124.437559,54.229097],[124.437523,54.229237],[124.437555,54.229387],[124.437629,54.229541],[124.437784,54.229728],[124.438571,54.23066],[124.438973,54.231171],[124.439156,54.231489],[124.4392,54.231671],[124.439193,54.232359],[124.439151,54.233576],[124.439177,54.233863],[124.439043,54.235444],[124.439028,54.235807],[124.438895,54.238115],[124.43878,54.239996],[124.4385,54.244046],[124.438515,54.244994],[124.438525,54.245373],[124.438602,54.245764],[124.438739,54.246091],[124.438977,54.246525],[124.439365,54.247089],[124.440838,54.249269],[124.441454,54.250256],[124.441891,54.250823],[124.442113,54.251212],[124.442355,54.251855],[124.442667,54.252598],[124.442851,54.253096],[124.443426,54.254626],[124.443799,54.255578],[124.444327,54.25694],[124.444725,54.257922],[124.44533,54.259437],[124.445648,54.260114],[124.445857,54.260489],[124.446072,54.260797],[124.446569,54.261644],[124.446854,54.262169],[124.447063,54.262632],[124.447214,54.263111],[124.447444,54.264065],[124.448409,54.268115],[124.448909,54.27037],[124.449297,54.272245],[124.449469,54.273495],[124.449437,54.273948],[124.449316,54.274542],[124.449041,54.275323],[124.448956,54.275749],[124.448952,54.276139],[124.448983,54.276618],[124.44905,54.27698],[124.449145,54.277771],[124.44925,54.278263],[124.449422,54.278961],[124.449702,54.280967],[124.449822,54.282114],[124.449787,54.283568],[124.449802,54.285228],[124.449777,54.285676],[124.44974,54.285895],[124.449683,54.286136],[124.4492,54.287863],[124.448909,54.289286],[124.448713,54.289974],[124.448634,54.290495],[124.448644,54.290791],[124.448741,54.29109],[124.448866,54.291474],[124.449051,54.291842],[124.449337,54.292275],[124.449625,54.292634],[124.449853,54.292919],[124.451414,54.295044],[124.452169,54.296],[124.453054,54.297394],[124.453411,54.298009],[124.453722,54.298649],[124.454484,54.300364],[124.455349,54.302261],[124.456336,54.304321],[124.457742,54.30731],[124.458479,54.308872],[124.458988,54.310307],[124.459443,54.311802],[124.459544,54.312516],[124.459699,54.313996],[124.459713,54.315292],[124.459792,54.316657],[124.459907,54.317685],[124.460181,54.318906],[124.460455,54.319705],[124.460708,54.320166],[124.460998,54.320534],[124.461484,54.321049],[124.462073,54.321673],[124.462875,54.32244],[124.463359,54.32278],[124.464647,54.323626],[124.464907,54.323797],[124.466341,54.324744],[124.469356,54.326586],[124.471493,54.327874],[124.472186,54.328204],[124.473003,54.328547],[124.47449,54.329104],[124.47644,54.32981],[124.476687,54.3299],[124.479682,54.330989],[124.481573,54.331658],[124.482451,54.331976],[124.483208,54.332185],[124.483918,54.332333],[124.484666,54.33248],[124.485898,54.332606],[124.487208,54.332696],[124.488612,54.332696],[124.492671,54.33281],[124.506062,54.333084],[124.507326,54.333139],[124.508047,54.333212],[124.508787,54.333387],[124.509515,54.333584],[124.510461,54.333968],[124.51116,54.334359],[124.512217,54.33501],[124.513199,54.335672],[124.513613,54.335907],[124.514029,54.336101],[124.514471,54.336302],[124.514913,54.336499],[124.515232,54.336602],[124.515568,54.336724],[124.51599,54.336856],[124.51692,54.337128],[124.519212,54.337738],[124.520873,54.338202],[124.522274,54.338587],[124.523618,54.338951],[124.525406,54.339451],[124.526134,54.339689],[124.526851,54.33994],[124.528543,54.340549],[124.529101,54.340754],[124.529437,54.340881],[124.53033,54.341225],[124.532336,54.34198],[124.533691,54.342486],[124.535735,54.343255],[124.536365,54.34347],[124.53677,54.343591],[124.537247,54.343682],[124.537522,54.343709],[124.537814,54.343721],[124.538062,54.343724],[124.538333,54.343714],[124.538602,54.343697],[124.539043,54.343664],[124.539939,54.343556],[124.540479,54.343507],[124.5451,54.343133],[124.54649,54.342974],[124.546735,54.342915],[124.547172,54.342825],[124.547974,54.342629],[124.548664,54.34243],[124.551089,54.341658],[124.552463,54.341221],[124.555611,54.34022],[124.559931,54.33884],[124.561411,54.33839],[124.562527,54.337989],[124.563256,54.337814],[124.564159,54.337505],[124.565501,54.337149],[124.565921,54.337046],[124.5668,54.336909],[124.567615,54.336789],[124.568775,54.336708],[124.569724,54.33672],[124.57087,54.336807],[124.571888,54.336977],[124.572432,54.337107],[124.573273,54.337296],[124.573867,54.337488],[124.574448,54.337706],[124.575112,54.33799],[124.575727,54.33834],[124.576463,54.338827],[124.576854,54.339146],[124.577161,54.339422],[124.577601,54.339937],[124.577916,54.340393],[124.578177,54.340919],[124.578316,54.341415],[124.578387,54.341853],[124.578391,54.342257],[124.578324,54.343168],[124.578209,54.345116],[124.578007,54.347384],[124.57786,54.349771],[124.577972,54.350515],[124.578122,54.351128],[124.578362,54.351706],[124.578627,54.352286],[124.579016,54.352906],[124.579352,54.35337],[124.579655,54.353703],[124.580033,54.354115],[124.580613,54.354608],[124.581088,54.355006],[124.581833,54.355525],[124.588192,54.359588],[124.588766,54.359954],[124.590441,54.361065],[124.591508,54.361662],[124.592437,54.362111],[124.59319,54.362402],[124.59376,54.362601],[124.594504,54.362839],[124.595691,54.363171],[124.596843,54.363539],[124.599264,54.364272],[124.600887,54.364757],[124.602605,54.365317],[124.603637,54.365637],[124.604481,54.365949],[124.604922,54.366225],[124.605316,54.366565],[124.605662,54.366968],[124.605746,54.367142],[124.605781,54.367319],[124.6058,54.367688],[124.605642,54.369069],[124.605401,54.370292],[124.605229,54.370811],[124.604936,54.371208],[124.604439,54.371665],[124.603687,54.372286],[124.601643,54.374006],[124.599604,54.375656],[124.598281,54.376708],[124.596304,54.378026],[124.594252,54.379501],[124.592879,54.38047],[124.591956,54.381151],[124.59127,54.381691],[124.590834,54.38217],[124.590487,54.38276],[124.590173,54.383517],[124.589998,54.384116],[124.589835,54.385848],[124.589863,54.386671],[124.590526,54.388416],[124.590798,54.388856],[124.591273,54.389263],[124.591956,54.389767],[124.592986,54.390206],[124.593689,54.390397],[124.594577,54.390535],[124.595179,54.390578],[124.598061,54.390364],[124.598956,54.390276],[124.599853,54.390273],[124.600628,54.390312],[124.601734,54.390402],[124.603414,54.390522],[124.604484,54.390661],[124.605298,54.390888],[124.606177,54.391251],[124.607652,54.391965],[124.610463,54.393376],[124.61231,54.394279],[124.613828,54.395065],[124.615213,54.396002],[124.616611,54.396987],[124.617963,54.398062],[124.620369,54.399823],[124.620727,54.400103],[124.62219,54.401178],[124.623701,54.402239],[124.624336,54.402902],[124.625395,54.404267],[124.626095,54.405194],[124.626878,54.405974],[124.627872,54.406841],[124.628305,54.407473],[124.628445,54.407963],[124.628529,54.408714],[124.628541,54.409927],[124.628709,54.411041],[124.628743,54.411366],[124.629049,54.413079],[124.6294,54.414666],[124.629693,54.415546],[124.629954,54.416279],[124.63015,54.416827],[124.630411,54.417759],[124.630462,54.418892],[124.630355,54.41958],[124.630022,54.420472],[124.629721,54.421049],[124.629013,54.422182],[124.62842,54.42312],[124.628048,54.423836],[124.627297,54.42584],[124.626903,54.426677],[124.626245,54.427937],[124.625577,54.428967],[124.624839,54.430181],[124.624647,54.430746],[124.624261,54.432586],[124.624207,54.43336],[124.624291,54.434252],[124.624475,54.434827],[124.624679,54.435788],[124.625442,54.438477],[124.626133,54.440996],[124.626499,54.4425],[124.626846,54.443674],[124.627254,54.444673],[124.627585,54.44527],[124.629415,54.448425],[124.62969,54.448894],[124.630092,54.449992],[124.630805,54.451753],[124.630929,54.452442],[124.631116,54.453487],[124.631281,54.453815],[124.631617,54.454157],[124.63173,54.454364],[124.631616,54.454527],[124.63143,54.454619],[124.63121,54.454612],[124.629674,54.45397],[124.629108,54.453584],[124.627051,54.452248],[124.6267,54.452123],[124.626286,54.452096],[124.625983,54.452148],[124.62565,54.452323],[124.625415,54.452533],[124.625387,54.452886],[124.625583,54.453747],[124.625629,54.453964],[124.625559,54.454354],[124.625242,54.454759],[124.624892,54.455019],[124.624405,54.455259],[124.623871,54.455406],[124.623399,54.455418],[124.623032,54.455243],[124.62249,54.45508],[124.621471,54.455046],[124.620506,54.454928],[124.619081,54.45465],[124.618513,54.454626],[124.617928,54.454685],[124.617558,54.454793],[124.616847,54.455063],[124.615087,54.455808],[124.614785,54.455972],[124.614764,54.456134],[124.614842,54.456244],[124.615048,54.456367],[124.615822,54.456557],[124.616226,54.456701],[124.616362,54.456825],[124.616509,54.457065],[124.616897,54.458049],[124.616885,54.458204],[124.616794,54.458353],[124.615833,54.459386],[124.615601,54.459663],[124.615241,54.460156],[124.614988,54.460563],[124.61454,54.460911],[124.614061,54.461341],[124.613771,54.461742],[124.613387,54.462511],[124.613275,54.462788],[124.613343,54.462958],[124.613514,54.46313],[124.61462,54.464062],[124.614932,54.464311],[124.615471,54.464524],[124.615766,54.464659],[124.615861,54.464763],[124.615833,54.464855],[124.615717,54.464923],[124.615541,54.46497],[124.615268,54.46494],[124.614455,54.464678],[124.613503,54.464558],[124.612346,54.464385],[124.611037,54.464232],[124.610247,54.464245],[124.60932,54.464316],[124.608368,54.464582],[124.60794,54.464745],[124.607775,54.464896],[124.607748,54.465045],[124.607771,54.465222],[124.607924,54.46547],[124.608521,54.466326],[124.608725,54.466565],[124.609216,54.466856],[124.61012,54.467205],[124.611349,54.467577],[124.613411,54.468101],[124.614206,54.468346],[124.614753,54.468656],[124.616042,54.469869],[124.617351,54.471197],[124.617691,54.471471],[124.618488,54.47197],[124.619513,54.472536],[124.620294,54.473072],[124.620855,54.473441],[124.621393,54.474025],[124.623304,54.47604],[124.623758,54.476346],[124.62422,54.476525],[124.624639,54.476611],[124.625362,54.476879],[124.626184,54.477337],[124.626881,54.477805],[124.627222,54.47815],[124.628097,54.479454],[124.629067,54.480791],[124.629672,54.481754],[124.629801,54.482172],[124.629863,54.482646],[124.629877,54.483343],[124.629926,54.483567],[124.630172,54.483833],[124.631042,54.484585],[124.631795,54.485304],[124.632668,54.48607],[124.633349,54.486584],[124.63363,54.48684],[124.633864,54.487261],[124.634212,54.488138],[124.634572,54.488875],[124.635593,54.490184],[124.635844,54.490581],[124.635885,54.490806],[124.635889,54.490991],[124.635759,54.49126],[124.635451,54.49191],[124.635405,54.492316],[124.635435,54.492699],[124.635586,54.493183],[124.63585,54.49367],[124.636201,54.494477],[124.636244,54.494744],[124.636156,54.495163],[124.636202,54.495667],[124.636251,54.495922],[124.636478,54.496361],[124.637833,54.498481],[124.638047,54.498901],[124.638073,54.499188],[124.638043,54.499591],[124.638144,54.500057],[124.63893,54.502219],[124.638938,54.502496],[124.638836,54.502842],[124.638376,54.503717],[124.638186,54.504092],[124.638211,54.504356],[124.63847,54.504757],[124.639217,54.505579],[124.639607,54.505915],[124.63991,54.506091],[124.640257,54.506258],[124.641594,54.506914],[124.642068,54.507149],[124.642507,54.50761],[124.644335,54.509484],[124.644961,54.510029],[124.645205,54.510322],[124.645323,54.510713],[124.645458,54.511297],[124.645705,54.511771],[124.645932,54.512016],[124.646341,54.512288],[124.648525,54.513259],[124.649485,54.51383],[124.649752,54.514075],[124.651343,54.515902],[124.652183,54.516826],[124.652438,54.517238],[124.652561,54.517585],[124.652423,54.518038],[124.651984,54.518809],[124.651174,54.520225],[124.649373,54.52353],[124.648183,54.525696],[124.647296,54.527358],[124.64672,54.528304],[124.646051,54.529624],[124.645825,54.530213],[124.645485,54.53159],[124.645439,54.531918],[124.645493,54.532122],[124.645653,54.532417],[124.645725,54.532541],[124.646151,54.533219],[124.646264,54.533506],[124.646328,54.533858],[124.646242,54.534178],[124.64484,54.537286],[124.64477,54.537513],[124.644801,54.537763],[124.645448,54.539545],[124.645531,54.539877],[124.645495,54.540203],[124.645093,54.541186],[124.644396,54.542087],[124.643996,54.542381],[124.643232,54.542772],[124.642332,54.543268],[124.641999,54.54355],[124.641105,54.544569],[124.640234,54.545689],[124.637395,54.549126],[124.633366,54.554073],[124.633164,54.554441],[124.633104,54.554822],[124.63313,54.555772],[124.633169,54.556697],[124.633489,54.561181],[124.63347,54.562917],[124.6336,54.56328],[124.633895,54.563529],[124.63435,54.563762],[124.637949,54.565054],[124.638757,54.565498],[124.639086,54.565753],[124.639436,54.566081],[124.640063,54.56708],[124.640312,54.567457],[124.640523,54.567665],[124.640939,54.568065],[124.641976,54.568908],[124.643264,54.569974],[124.643546,54.570334],[124.643774,54.570929],[124.643824,54.571644],[124.643735,54.571912],[124.64349,54.57215],[124.643125,54.572293],[124.641833,54.572613],[124.641307,54.572806],[124.640686,54.573179],[124.640044,54.573517],[124.639239,54.573839],[124.638826,54.574038],[124.638587,54.574327],[124.638421,54.574784],[124.638482,54.575143],[124.638783,54.575633],[124.639062,54.576014],[124.639387,54.576457],[124.639587,54.576899],[124.639529,54.577291],[124.639274,54.577631],[124.638804,54.578069],[124.638312,54.578543],[124.63806,54.578998],[124.637865,54.580084],[124.637736,54.580693],[124.63718,54.583051],[124.636438,54.58599],[124.634761,54.593082],[124.634603,54.594078],[124.634684,54.594938],[124.63491,54.595836],[124.635858,54.599486],[124.637219,54.604352],[124.637374,54.604907],[124.637779,54.606545],[124.638272,54.607515],[124.639087,54.608592],[124.642779,54.613007],[124.646287,54.617331],[124.649815,54.621663],[124.650637,54.622945],[124.651347,54.624375],[124.65172,54.625493],[124.65251,54.627935],[124.653138,54.630197],[124.65385,54.632597],[124.654323,54.634244],[124.654727,54.635638],[124.655193,54.637364],[124.655846,54.639497],[124.656389,54.641366],[124.656544,54.642502],[124.656453,54.643685],[124.65625,54.644523],[124.655857,54.64529],[124.655649,54.645715],[124.65481,54.647001],[124.65434,54.647901],[124.653999,54.648862],[124.653797,54.650045],[124.653877,54.651477],[124.654163,54.652412],[124.654269,54.652908],[124.655294,54.654705],[124.656092,54.655866],[124.656777,54.656808],[124.657924,54.658348],[124.659126,54.659932],[124.659632,54.660599],[124.661359,54.662931],[124.663668,54.666138],[124.664001,54.666582],[124.664866,54.667734],[124.666133,54.669406],[124.666779,54.670394],[124.667259,54.671252],[124.667419,54.672127],[124.6675,54.673016],[124.667412,54.674004],[124.667077,54.674805],[124.666763,54.675278],[124.666368,54.675861],[124.665715,54.676482],[124.664719,54.67733],[124.663898,54.677872],[124.662963,54.678362],[124.661207,54.67916],[124.657331,54.680794],[124.656091,54.681316],[124.654602,54.68193],[124.653963,54.682193],[124.649455,54.684052],[124.645622,54.685654],[124.642662,54.68706],[124.640536,54.688165],[124.637881,54.689616],[124.635472,54.690943],[124.633028,54.692259],[124.629872,54.694013],[124.627015,54.695528],[124.62344,54.697503],[124.61926,54.699726],[124.617888,54.700517],[124.61554,54.701812],[124.61433,54.702442],[124.613057,54.703256],[124.612034,54.703984],[124.610779,54.704934],[124.608183,54.70708],[124.606387,54.708646],[124.605147,54.709602],[124.604334,54.710117],[124.603614,54.710542],[124.602239,54.711107],[124.600396,54.711695],[124.598729,54.712302],[124.597599,54.71291],[124.596519,54.713655],[124.595744,54.714355],[124.595162,54.715108],[124.5948,54.715777],[124.59443,54.716738],[124.593966,54.717868],[124.593588,54.718458],[124.59318,54.718992],[124.592807,54.719401],[124.591392,54.720595],[124.588901,54.7227],[124.586941,54.724348],[124.584843,54.726132],[124.583633,54.727182],[124.582657,54.728143],[124.582009,54.72893],[124.580951,54.730401],[124.580324,54.731465],[124.579826,54.732513],[124.579472,54.733422],[124.578548,54.736822],[124.578161,54.738339],[124.577937,54.739024],[124.577829,54.7395],[124.5778,54.740041],[124.57782,54.740559],[124.577974,54.741129],[124.57822,54.741701],[124.578486,54.742158],[124.578832,54.742553],[124.5794,54.743092],[124.579803,54.743425],[124.580449,54.743838],[124.581725,54.744544],[124.584258,54.745783],[124.58535,54.746399],[124.585816,54.746687],[124.586374,54.747068],[124.587299,54.747735],[124.587417,54.747867],[124.587771,54.748266],[124.588302,54.748943],[124.58866,54.749554],[124.588973,54.750204],[124.589251,54.751097],[124.589525,54.752006],[124.590031,54.753462],[124.590939,54.756261],[124.591788,54.759031],[124.592214,54.76008],[124.592595,54.760736],[124.592998,54.761281],[124.593369,54.761712],[124.593998,54.762276],[124.594855,54.762906],[124.597684,54.764796],[124.599463,54.765954],[124.600645,54.766745],[124.601115,54.767101],[124.60162,54.767572],[124.601988,54.767904],[124.602298,54.768319],[124.60259,54.768773],[124.602836,54.769415],[124.60296,54.769795],[124.603035,54.770259],[124.603029,54.770947],[124.602926,54.771398],[124.602778,54.771862],[124.602326,54.772594],[124.600876,54.774745],[124.600171,54.775687],[124.599291,54.776779],[124.598573,54.777602],[124.597704,54.778567],[124.596832,54.779391],[124.595593,54.780536],[124.594101,54.781832],[124.592987,54.782846],[124.591658,54.784061],[124.590987,54.78465],[124.590328,54.785151],[124.589297,54.785811],[124.588463,54.786225],[124.587165,54.786752],[124.585376,54.787428],[124.583676,54.788067],[124.580685,54.789212],[124.579934,54.789551],[124.579468,54.789762],[124.578535,54.790239],[124.578072,54.790506],[124.577451,54.790888],[124.576756,54.791405],[124.576141,54.79189],[124.575602,54.792337],[124.575163,54.792753],[124.574811,54.793144],[124.574168,54.793949],[124.572091,54.796689],[124.571277,54.797834],[124.570322,54.799188],[124.56914,54.800723],[124.567897,54.802748],[124.566808,54.804723],[124.566593,54.805241],[124.566324,54.805948],[124.565735,54.80805],[124.565195,54.809743],[124.564914,54.810925],[124.56475,54.812114],[124.564737,54.812841],[124.564871,54.814387],[124.565048,54.8155],[124.565369,54.817721],[124.565628,54.819747],[124.565746,54.820544],[124.566014,54.821978],[124.566703,54.824382],[124.566844,54.825425],[124.566878,54.826298],[124.566766,54.826916],[124.566478,54.827565],[124.565419,54.829713],[124.564598,54.831249],[124.56405,54.832521],[124.563872,54.833421],[124.563836,54.834141],[124.563953,54.835005],[124.564211,54.836223],[124.564533,54.837397],[124.565015,54.839492],[124.565295,54.840795],[124.565327,54.841306],[124.565241,54.841642],[124.564984,54.84213],[124.564726,54.842488],[124.564447,54.842988],[124.564343,54.843342],[124.56434,54.843779],[124.564545,54.844859],[124.564919,54.846806],[124.565563,54.849858],[124.565861,54.851524],[124.566003,54.854329],[124.566014,54.855629],[124.565778,54.857022],[124.565899,54.857785],[124.566142,54.858263],[124.566702,54.85888],[124.568149,54.860233],[124.569072,54.86107],[124.570177,54.862012],[124.571389,54.862895],[124.572245,54.86367],[124.572794,54.864228],[124.572966,54.864481],[124.573181,54.864796],[124.573327,54.865431],[124.57353,54.866332],[124.57362,54.86668],[124.573717,54.867291],[124.573683,54.867764],[124.573502,54.868649],[124.573291,54.870333],[124.572977,54.872594],[124.572977,54.873508],[124.573143,54.874414],[124.573417,54.875273],[124.573836,54.876045],[124.574267,54.876607],[124.574768,54.87715],[124.575745,54.877921],[124.576814,54.878623],[124.577719,54.879131],[124.579112,54.879698],[124.580444,54.880131],[124.582659,54.880772],[124.585675,54.88143],[124.588695,54.882118],[124.590057,54.882541],[124.592729,54.883597],[124.593608,54.884026],[124.594477,54.884618],[124.595025,54.885093],[124.595424,54.885506],[124.595815,54.886177],[124.596462,54.887802],[124.596891,54.888808],[124.597068,54.889357],[124.597274,54.891743],[124.597363,54.892905],[124.59731,54.893584],[124.597135,54.894186],[124.595997,54.895876],[124.594783,54.897543],[124.593137,54.899864],[124.59231,54.900753],[124.590443,54.902518],[124.588396,54.904468],[124.587611,54.905034],[124.586353,54.905821],[124.582045,54.908354],[124.579979,54.909546],[124.579285,54.909981],[124.578784,54.91045],[124.57713,54.912339],[124.576706,54.912797],[124.576251,54.91319],[124.575719,54.913544],[124.574292,54.914198],[124.571464,54.915439],[124.569754,54.916229],[124.569315,54.916525],[124.568877,54.916889],[124.568431,54.917382],[124.567846,54.918108],[124.567619,54.918391],[124.566673,54.919564],[124.566031,54.920246],[124.565652,54.92049],[124.564747,54.920881],[124.561209,54.922029],[124.560575,54.922284],[124.560081,54.922566],[124.558773,54.923599],[124.557503,54.924566],[124.556383,54.925353],[124.55601,54.925739],[124.555175,54.926877],[124.554303,54.928174],[124.553845,54.928928],[124.553268,54.929662],[124.552831,54.930035],[124.552409,54.930396],[124.552009,54.93074],[124.551798,54.93099],[124.551634,54.931357],[124.551427,54.931892],[124.551169,54.932659],[124.550906,54.933641],[124.550585,54.934715],[124.550537,54.935104],[124.550546,54.936484],[124.550626,54.936843],[124.550791,54.937168],[124.551153,54.937537],[124.552082,54.938499],[124.554114,54.940573],[124.55644,54.942999],[124.558122,54.944716],[124.560174,54.946823],[124.560862,54.947462],[124.561701,54.948122],[124.563197,54.949205],[124.563632,54.949468],[124.564757,54.950306],[124.565204,54.950691],[124.565907,54.951584],[124.56636,54.952194],[124.5675,54.953714],[124.567885,54.954228],[124.568948,54.955682],[124.569614,54.956647],[124.569962,54.957246],[124.57011,54.957809],[124.570129,54.958405],[124.570141,54.958761],[124.570202,54.959091],[124.570514,54.959472],[124.571117,54.959935],[124.573406,54.961441],[124.575708,54.962996],[124.577865,54.964459],[124.580251,54.966092],[124.58342,54.968212],[124.586189,54.970131],[124.588137,54.971442],[124.590501,54.973052],[124.593168,54.974837],[124.595397,54.976293],[124.597095,54.977417],[124.598246,54.978066],[124.600539,54.97934],[124.602846,54.980557],[124.604688,54.981528],[124.609585,54.984137],[124.611032,54.984989],[124.6126,54.985988],[124.614143,54.987181],[124.615483,54.988366],[124.61672,54.989573],[124.618844,54.991917],[124.619168,54.992274],[124.620681,54.99389],[124.622347,54.995696],[124.626024,54.999679],[124.626545,55.000229],[124.62785,55.001655],[124.628287,55.002132],[124.635205,55.009561],[124.63751,55.012043],[124.639662,55.014409],[124.640207,55.014969],[124.641511,55.016389],[124.642794,55.017746],[124.643832,55.018985],[124.644618,55.019933],[124.646605,55.022331],[124.647939,55.023993],[124.648799,55.025095],[124.649579,55.025931],[124.6509,55.027264],[124.651332,55.027675],[124.652306,55.02833],[124.653475,55.029215],[124.654827,55.03031],[124.658936,55.033636],[124.661277,55.035398],[124.661466,55.03555],[124.663638,55.03729],[124.664101,55.03767],[124.664942,55.038364],[124.665395,55.038762],[124.665769,55.039135],[124.666042,55.03946],[124.666579,55.040238],[124.666956,55.04103],[124.667226,55.041494],[124.667475,55.042067],[124.667566,55.042353],[124.667788,55.0432],[124.668174,55.045206],[124.668591,55.047616],[124.669092,55.050458],[124.669231,55.051255],[124.669376,55.052043],[124.669512,55.052731],[124.669514,55.05314],[124.669483,55.053768],[124.669439,55.054482],[124.669268,55.055355],[124.668963,55.056812],[124.668827,55.057737],[124.668867,55.058353],[124.66898,55.05888],[124.66916,55.059365],[124.669396,55.059782],[124.66969,55.060229],[124.670309,55.061105],[124.671253,55.062328],[124.67302,55.064665],[124.673819,55.065703],[124.674537,55.066707],[124.675054,55.06725],[124.675239,55.067443],[124.675637,55.067801],[124.676104,55.068145],[124.676624,55.068472],[124.677063,55.068689],[124.677901,55.069061],[124.678499,55.069269],[124.679239,55.069488],[124.679753,55.069628],[124.680208,55.069708],[124.680977,55.069846],[124.681671,55.069918],[124.682279,55.069969],[124.682961,55.070027],[124.684701,55.070091],[124.685672,55.070132],[124.686499,55.070205],[124.687111,55.070308],[124.687904,55.070519],[124.688899,55.070872],[124.689521,55.071156],[124.690152,55.071485],[124.690651,55.071804],[124.691005,55.072071],[124.69137,55.072398],[124.691533,55.072588],[124.692536,55.073593],[124.693279,55.07433],[124.693963,55.074979],[124.694518,55.075336],[124.695543,55.075898],[124.696047,55.076162],[124.696809,55.076457],[124.697549,55.076709],[124.698429,55.076994],[124.69918,55.07728],[124.699813,55.077501],[124.700612,55.077845],[124.701235,55.078155],[124.701621,55.07841],[124.701873,55.078579],[124.70205,55.078751],[124.702265,55.078963],[124.70264,55.079362],[124.702871,55.079691],[124.702994,55.079903],[124.703544,55.081023],[124.703679,55.081404],[124.703851,55.081814],[124.704083,55.082427],[124.704364,55.083221],[124.705083,55.084778],[124.705441,55.085624],[124.705886,55.086351],[124.706342,55.086876],[124.706731,55.087359],[124.707269,55.087858],[124.707729,55.088198],[124.708518,55.088772],[124.710596,55.090152],[124.712076,55.091088],[124.712464,55.091392],[124.712822,55.091665],[124.713288,55.092144],[124.71361,55.092543],[124.713846,55.092948],[124.714077,55.093498],[124.714152,55.093918],[124.714195,55.095106],[124.714082,55.097807],[124.713798,55.101708],[124.713851,55.10252],[124.714093,55.103142],[124.714152,55.103255],[124.714345,55.103623],[124.71463,55.104102],[124.715,55.10447],[124.715536,55.104998],[124.715976,55.105368],[124.716533,55.105764],[124.717071,55.106223],[124.71758,55.106749],[124.717844,55.10728],[124.717957,55.107688],[124.717998,55.108103],[124.717936,55.108851],[124.717421,55.111271],[124.717081,55.112633],[124.716788,55.114048],[124.716601,55.114815],[124.716539,55.115089],[124.716469,55.115258],[124.716391,55.115437],[124.716299,55.115577],[124.716177,55.11574],[124.716034,55.115887],[124.715737,55.116173],[124.71559,55.116312],[124.715347,55.116531],[124.714484,55.117293],[124.714199,55.117586],[124.713727,55.117968],[124.713513,55.118095],[124.713289,55.118197],[124.712948,55.118295],[124.712222,55.11843],[124.711687,55.118527],[124.711317,55.118627],[124.710942,55.118767],[124.710657,55.118895],[124.710359,55.119108],[124.71009,55.1194],[124.709442,55.120036],[124.709147,55.120367],[124.70897,55.12067],[124.708828,55.120926],[124.708741,55.121212],[124.708564,55.122732],[124.708544,55.12311],[124.708498,55.123993],[124.708481,55.124899],[124.708551,55.125299],[124.708641,55.125686],[124.70867,55.125965],[124.708664,55.126404],[124.70868,55.126677],[124.708728,55.126865],[124.7088,55.127004],[124.708922,55.127142],[124.709068,55.127279],[124.709389,55.127505],[124.709906,55.127846],[124.710327,55.128094],[124.711137,55.128492],[124.711696,55.128796],[124.712491,55.129157],[124.712822,55.129274],[124.71303,55.129321],[124.713304,55.129343],[124.713518,55.129334],[124.713992,55.129266],[124.71459,55.129115],[124.715397,55.128861],[124.716216,55.128628],[124.716428,55.128593],[124.716634,55.128602],[124.716779,55.128648],[124.716847,55.12875],[124.716847,55.128855],[124.716798,55.128954],[124.716631,55.129107],[124.716262,55.129416],[124.715976,55.129696],[124.715796,55.129986],[124.715719,55.130241],[124.715639,55.130644],[124.71566,55.130935],[124.715731,55.131246],[124.715863,55.131582],[124.716047,55.131901],[124.716302,55.132275],[124.716547,55.132559],[124.717463,55.133466],[124.717889,55.1339],[124.719041,55.135058],[124.719269,55.135288],[124.720281,55.136387],[124.720618,55.136707],[124.720995,55.136985],[124.721324,55.137182],[124.721675,55.137315],[124.722095,55.137412],[124.722756,55.137525],[124.723266,55.137565],[124.72373,55.137558],[124.725774,55.137446],[124.726198,55.137447],[124.726591,55.137473],[124.726991,55.137551],[124.727339,55.137663],[124.72763,55.137803],[124.727839,55.137992],[124.72793,55.138139],[124.727988,55.138336],[124.728085,55.138802],[124.728228,55.139743],[124.728451,55.141525],[124.728451,55.141863],[124.72849,55.142788],[124.72833,55.144165],[124.728086,55.144995],[124.727917,55.145383],[124.727897,55.145446],[124.727767,55.145708],[124.727267,55.146667],[124.726575,55.148012],[124.726563,55.148034],[124.726354,55.148432],[124.726277,55.148569],[124.72607,55.148927],[124.725669,55.149477],[124.724762,55.1503],[124.724407,55.150645],[124.724119,55.150896],[124.72365,55.151368],[124.723384,55.151755],[124.723005,55.152505],[124.722586,55.153342],[124.722263,55.15417],[124.722082,55.154622],[124.722062,55.154911],[124.722206,55.155522],[124.722443,55.156471],[124.722627,55.157222],[124.722664,55.157365],[124.722787,55.157818],[124.722821,55.157983],[124.723027,55.158724],[124.723162,55.159505],[124.723088,55.159755],[124.722994,55.160024],[124.722731,55.160378],[124.722587,55.160548],[124.72208,55.161351],[124.722047,55.161431],[124.721931,55.161716],[124.721771,55.162324],[124.72169,55.162635],[124.721606,55.163068],[124.721309,55.163412],[124.720955,55.163678],[124.720076,55.164173],[124.719322,55.164623],[124.718674,55.16501],[124.718171,55.165311],[124.716968,55.16597],[124.716097,55.16653],[124.715606,55.16722],[124.715346,55.168064],[124.715012,55.169664],[124.714865,55.17033],[124.714841,55.170645],[124.714623,55.172166],[124.714552,55.17323],[124.714583,55.173686],[124.714651,55.174285],[124.714785,55.174759],[124.715094,55.176013],[124.715555,55.177591],[124.716423,55.180066],[124.717343,55.182656],[124.718203,55.185106],[124.719179,55.187976],[124.723613,55.200603],[124.724416,55.20289],[124.724533,55.203275],[124.724596,55.203417],[124.725671,55.206412],[124.725743,55.206571],[124.725889,55.206906],[124.726126,55.207279],[124.726413,55.207624],[124.726898,55.208047],[124.729504,55.210037],[124.729965,55.210333],[124.730528,55.210617],[124.730946,55.210797],[124.731483,55.210995],[124.731972,55.211146],[124.734694,55.211835],[124.735261,55.212012],[124.735913,55.212315],[124.736785,55.212766],[124.737512,55.213188],[124.737928,55.213451],[124.738236,55.213732],[124.739829,55.215794],[124.741456,55.21798],[124.741772,55.218462],[124.742057,55.218998],[124.742243,55.219497],[124.743574,55.223058],[124.743836,55.223655],[124.744024,55.223993],[124.744574,55.22477],[124.745796,55.226407],[124.746535,55.227371],[124.746836,55.227798],[124.746995,55.228065],[124.747301,55.228939],[124.747774,55.230333],[124.748357,55.232073],[124.748632,55.232762],[124.748822,55.233119],[124.749557,55.23448],[124.750183,55.235786],[124.750764,55.237028],[124.751516,55.23859],[124.751714,55.239057],[124.752397,55.240823],[124.752649,55.241717],[124.752974,55.244054],[124.753293,55.246739],[124.753459,55.248191],[124.753484,55.248821],[124.753461,55.249549],[124.753366,55.250388],[124.753163,55.25179],[124.753077,55.252125],[124.75254,55.253756],[124.752049,55.255296],[124.751922,55.255696],[124.751873,55.256023],[124.751869,55.256339],[124.751943,55.256645],[124.752028,55.256832],[124.75207,55.256924],[124.752776,55.258287],[124.754236,55.261042],[124.755794,55.264],[124.757001,55.266356],[124.757211,55.266861],[124.757328,55.267297],[124.757647,55.268915],[124.758006,55.270574],[124.758055,55.270996],[124.758083,55.271739],[124.758108,55.273458],[124.758162,55.274494],[124.758359,55.27851],[124.758386,55.27906],[124.758435,55.279858],[124.758458,55.28084],[124.758473,55.281216],[124.758525,55.281792],[124.758717,55.282696],[124.758737,55.282787],[124.759245,55.284765],[124.759336,55.285212],[124.759385,55.285565],[124.759377,55.285914],[124.759261,55.286568],[124.758977,55.28774],[124.758928,55.288169],[124.758916,55.288565],[124.759026,55.289374],[124.759275,55.290866],[124.759465,55.291586],[124.759688,55.292083],[124.759905,55.292395],[124.760206,55.292774],[124.760715,55.293229],[124.763219,55.29523],[124.763572,55.295675],[124.76385,55.296071],[124.764007,55.296454],[124.764138,55.296956],[124.764164,55.297213],[124.764084,55.297584],[124.763854,55.298045],[124.76366,55.29836],[124.763464,55.298628],[124.763172,55.298962],[124.762547,55.299557],[124.761543,55.300559],[124.759481,55.302565],[124.758135,55.303924],[124.756682,55.30532],[124.756322,55.305732],[124.75616,55.306016],[124.756071,55.306174],[124.75594,55.30663],[124.755368,55.310297],[124.755339,55.310702],[124.755335,55.311093],[124.755393,55.311474],[124.755768,55.312675],[124.757659,55.318428],[124.758661,55.321597],[124.759182,55.323236],[124.759703,55.324816],[124.760034,55.32608],[124.760208,55.326887],[124.76036,55.327923],[124.760431,55.3289],[124.760452,55.329362],[124.760345,55.330896],[124.760182,55.332305],[124.759938,55.333498],[124.759518,55.334859],[124.758886,55.336583],[124.757757,55.339643],[124.756555,55.342798],[124.756329,55.343381],[124.755571,55.345534],[124.754897,55.347338],[124.754136,55.349372],[124.753961,55.349917],[124.753876,55.350463],[124.753801,55.351037],[124.753878,55.3517],[124.753981,55.352397],[124.754198,55.353098],[124.754904,55.354362],[124.756545,55.356868],[124.757282,55.357853],[124.758695,55.359575],[124.760587,55.361907],[124.762264,55.363926],[124.762845,55.364606],[124.763693,55.365588],[124.764326,55.366117],[124.764872,55.36654],[124.765398,55.366893],[124.766439,55.367567],[124.767664,55.368313],[124.768662,55.368821],[124.769851,55.369405],[124.770687,55.369932],[124.771243,55.370401],[124.772308,55.371393],[124.773089,55.372209],[124.773542,55.372874],[124.773867,55.373576],[124.774089,55.374331],[124.774571,55.376431],[124.77477,55.377624],[124.774926,55.378153],[124.775229,55.378775],[124.775366,55.378982],[124.775602,55.379241],[124.775851,55.379467],[124.777141,55.380373],[124.777614,55.380747],[124.778465,55.381709],[124.779845,55.383369],[124.78182,55.385738],[124.782254,55.386259],[124.782436,55.386583],[124.782422,55.387139],[124.782285,55.388053],[124.782047,55.389347],[124.781479,55.391885],[124.780963,55.39442],[124.780708,55.395638],[124.780401,55.397071],[124.780022,55.398892],[124.779379,55.400647],[124.778895,55.402114],[124.778676,55.403065],[124.778531,55.404161],[124.77829,55.405719],[124.778116,55.407078],[124.778112,55.407731],[124.778189,55.408724],[124.778392,55.410327],[124.778828,55.413604],[124.779249,55.41655],[124.779592,55.418918],[124.779706,55.419387],[124.779815,55.41975],[124.780282,55.420818],[124.781761,55.423477],[124.782321,55.424768],[124.782999,55.426498],[124.783062,55.427201],[124.783071,55.429413],[124.782794,55.433573],[124.78235,55.440925],[124.782125,55.444358],[124.781941,55.447432],[124.782007,55.447991],[124.782125,55.448441],[124.782436,55.449183],[124.782808,55.449726],[124.78338,55.450327],[124.784078,55.450973],[124.785032,55.451702],[124.786484,55.452783],[124.787929,55.454015],[124.789392,55.455416],[124.789549,55.455566],[124.791062,55.45702],[124.792533,55.458516],[124.793053,55.459096],[124.794123,55.461136],[124.79427,55.461619],[124.794313,55.462044],[124.79428,55.462604],[124.79416,55.463005],[124.793572,55.464155],[124.792662,55.465749],[124.79177,55.467287],[124.791309,55.467895],[124.790807,55.468419],[124.790128,55.469081],[124.789447,55.469741],[124.788862,55.470523],[124.788303,55.471376],[124.787813,55.472856],[124.788023,55.474416],[124.788653,55.477276],[124.789313,55.478516],[124.791053,55.479936],[124.793583,55.481176],[124.795003,55.481822],[124.796181,55.482642],[124.797116,55.483678],[124.797599,55.484651],[124.798843,55.490426],[124.799443,55.493326],[124.801183,55.495786],[124.801522,55.496258],[124.801825,55.49746],[124.80215,55.503211],[124.802244,55.505809],[124.802473,55.506436],[124.803883,55.508596],[124.804333,55.509476],[124.804953,55.512166],[124.804953,55.512976],[124.804033,55.514886],[124.802473,55.517246],[124.800433,55.519476],[124.797663,55.522716],[124.796653,55.523896],[124.796503,55.526176],[124.795943,55.527696],[124.794933,55.529826],[124.793563,55.531176],[124.792963,55.532076],[124.793223,55.533126],[124.793373,55.533256],[124.794833,55.534116],[124.796763,55.534526],[124.800003,55.535316],[124.800513,55.535466],[124.802253,55.536436],[124.802403,55.536516],[124.803563,55.536756],[124.804233,55.536796],[124.806593,55.536556],[124.808993,55.535976],[124.810603,55.535786],[124.813773,55.536256],[124.815658,55.536884],[124.816417,55.537255],[124.817456,55.538083],[124.818544,55.539151],[124.819308,55.540233],[124.819906,55.5414],[124.820027,55.542326],[124.82001,55.54345],[124.819961,55.544705],[124.819776,55.546152],[124.819822,55.547241],[124.819975,55.547853],[124.820253,55.548406],[124.821953,55.550246],[124.822563,55.550861],[124.823133,55.551182],[124.827616,55.553393],[124.828889,55.554098],[124.829472,55.554542],[124.830853,55.555956],[124.832197,55.557746],[124.832516,55.558385],[124.832895,55.559248],[124.833141,55.559933],[124.833908,55.561829],[124.834271,55.562436],[124.834783,55.562968],[124.835395,55.5634],[124.836153,55.563766],[124.836645,55.563983],[124.837624,55.564259],[124.838363,55.5644],[124.839011,55.564467],[124.839793,55.564486],[124.841109,55.564446],[124.842046,55.564354],[124.84619,55.563892],[124.84821,55.563588],[124.852009,55.562735],[124.856367,55.56124],[124.857996,55.560712],[124.862333,55.560028],[124.864954,55.559769],[124.866311,55.559759],[124.876197,55.560917],[124.878547,55.561418],[124.879383,55.561733],[124.879664,55.561922],[124.879802,55.562134],[124.880173,55.562704],[124.880542,55.563386],[124.880813,55.563873],[124.881069,55.564193],[124.881492,55.564577],[124.88177,55.564789],[124.882373,55.565246],[124.883378,55.565873],[124.883612,55.566025],[124.883809,55.566222],[124.883927,55.566413],[124.884011,55.566581],[124.884119,55.566959],[124.88419,55.567331],[124.884207,55.567619],[124.884173,55.567919],[124.88406,55.568388],[124.88385,55.569031],[124.883737,55.569353],[124.883655,55.569709],[124.883628,55.570033],[124.883624,55.570327],[124.883804,55.572612],[124.88378,55.572912],[124.883753,55.573142],[124.883659,55.57344],[124.883172,55.574563],[124.883097,55.574738],[124.882894,55.575308],[124.882788,55.575643],[124.882726,55.57593],[124.882734,55.576244],[124.882804,55.576537],[124.882909,55.576781],[124.883403,55.577926],[124.884993,55.580976],[124.885793,55.582626],[124.885643,55.584196],[124.885425,55.584846],[124.884733,55.586426],[124.883963,55.588956],[124.883813,55.591346],[124.884283,55.593486],[124.884883,55.596576],[124.884543,55.598446],[124.883603,55.600616],[124.881093,55.603766],[124.879415,55.605184],[124.877333,55.606786],[124.876489,55.607467],[124.876055,55.607902],[124.875723,55.608446],[124.875459,55.609072],[124.875297,55.609461],[124.875233,55.609906],[124.875257,55.611243],[124.875263,55.611374],[124.875273,55.611726],[124.875217,55.612246],[124.874975,55.613114],[124.874794,55.613533],[124.874549,55.613903],[124.87399,55.614562],[124.87033,55.617974],[124.869412,55.618792],[124.867217,55.620674],[124.866439,55.621411],[124.865745,55.6222],[124.865251,55.622859],[124.86482,55.623523],[124.864294,55.624455],[124.863942,55.625156],[124.863671,55.625642],[124.863415,55.625981],[124.863206,55.626224],[124.862846,55.626526],[124.862476,55.62672],[124.861847,55.626967],[124.861476,55.627067],[124.861271,55.627126],[124.860851,55.627212],[124.860239,55.627276],[124.859308,55.627325],[124.857665,55.627439],[124.85681,55.62752],[124.855849,55.627656],[124.855226,55.627754],[124.85464,55.627864],[124.854228,55.627957],[124.853733,55.628116],[124.850315,55.629412],[124.849601,55.629673],[124.84905,55.629884],[124.848487,55.630105],[124.848105,55.630274],[124.847744,55.630461],[124.847373,55.630693],[124.846955,55.630987],[124.846646,55.63121],[124.846072,55.631671],[124.845797,55.631931],[124.845569,55.63219],[124.845106,55.632784],[124.844883,55.633031],[124.844605,55.633284],[124.84434,55.633462],[124.844055,55.633607],[124.843755,55.633714],[124.843402,55.633801],[124.843027,55.633862],[124.842584,55.633889],[124.842096,55.633885],[124.840588,55.633802],[124.838428,55.633705],[124.837567,55.633714],[124.836984,55.633757],[124.836371,55.633852],[124.835609,55.634061],[124.833773,55.634726],[124.828902,55.636575],[124.828131,55.636892],[124.827358,55.637222],[124.826903,55.63743],[124.826442,55.637648],[124.826101,55.637845],[124.825814,55.638077],[124.825663,55.638226],[124.825521,55.638411],[124.825448,55.638563],[124.825406,55.638753],[124.825413,55.639007],[124.825943,55.640996],[124.826803,55.643396],[124.827395,55.644796],[124.827695,55.645534],[124.827963,55.646126],[124.828043,55.646376],[124.828031,55.646606],[124.82795,55.64683],[124.827811,55.647024],[124.827448,55.647393],[124.826998,55.647819],[124.826188,55.64858],[124.825859,55.648899],[124.825701,55.649069],[124.82559,55.649216],[124.825527,55.649353],[124.825498,55.649448],[124.825489,55.649582],[124.825495,55.649704],[124.825524,55.649787],[124.825555,55.649864],[124.82565,55.650021],[124.825813,55.650196],[124.826021,55.650332],[124.826264,55.65043],[124.82658,55.650523],[124.826859,55.650578],[124.827144,55.650598],[124.827524,55.650589],[124.827859,55.650534],[124.828202,55.650447],[124.828663,55.650265],[124.829581,55.649849],[124.830355,55.649563],[124.831291,55.649293],[124.832281,55.649105],[124.834675,55.648732],[124.835843,55.648588],[124.836941,55.648521],[124.837791,55.648504],[124.838709,55.648504],[124.839799,55.648532],[124.843571,55.648673],[124.845419,55.648733],[124.845894,55.648759],[124.846288,55.648817],[124.846633,55.648898],[124.847087,55.649041],[124.847855,55.649352],[124.848383,55.649592],[124.848648,55.649751],[124.848842,55.649904],[124.849077,55.650142],[124.849256,55.650367],[124.849699,55.650966],[124.850565,55.65213],[124.851686,55.653631],[124.852552,55.654775],[124.852805,55.655051],[124.85305,55.65527],[124.853294,55.65544],[124.853655,55.655629],[124.854026,55.655801],[124.85455,55.65601],[124.855214,55.656242],[124.856532,55.656705],[124.857047,55.656925],[124.857592,55.657231],[124.857955,55.657446],[124.858299,55.657702],[124.858581,55.657992],[124.85872,55.658238],[124.85881,55.658481],[124.858849,55.658742],[124.858839,55.659033],[124.858766,55.659527],[124.858467,55.661241],[124.858287,55.662269],[124.858074,55.66329],[124.857518,55.665319],[124.857041,55.667045],[124.85655,55.668802],[124.855916,55.671064],[124.855599,55.672139],[124.855317,55.672944],[124.855135,55.673372],[124.854975,55.673709],[124.854644,55.674287],[124.854321,55.674746],[124.853994,55.675159],[124.853128,55.67617],[124.852984,55.676368],[124.852661,55.676827],[124.852489,55.677166],[124.85242,55.677374],[124.852388,55.677591],[124.852374,55.677961],[124.852416,55.678198],[124.852524,55.678467],[124.852707,55.678751],[124.852903,55.678979],[124.853151,55.679246],[124.853507,55.679577],[124.853977,55.679972],[124.854998,55.680764],[124.855354,55.681107],[124.855463,55.681239],[124.855602,55.681466],[124.855693,55.681692],[124.856158,55.683318],[124.856254,55.683595],[124.856413,55.683909],[124.856664,55.684231],[124.856887,55.684422],[124.857183,55.684579],[124.857521,55.684701],[124.858151,55.684858],[124.858818,55.684983],[124.861501,55.685351],[124.862704,55.685491],[124.863645,55.685549],[124.864691,55.685585],[124.865156,55.685559],[124.865664,55.68548],[124.866127,55.685379],[124.866462,55.685269],[124.866755,55.685142],[124.867007,55.685006],[124.868109,55.684302],[124.868297,55.684211],[124.868499,55.684139],[124.868859,55.684064],[124.869475,55.683986],[124.870421,55.683941],[124.872285,55.683871],[124.8729,55.683836],[124.874158,55.683838],[124.875383,55.683912],[124.876616,55.683995],[124.877206,55.684073],[124.877666,55.684194],[124.87819,55.68442],[124.878574,55.68465],[124.878956,55.684987],[124.881469,55.687703],[124.881828,55.688056],[124.882268,55.688364],[124.882738,55.688592],[124.883324,55.688792],[124.883977,55.688929],[124.884508,55.68897],[124.88543,55.688921],[124.885975,55.688872],[124.890147,55.688384],[124.891435,55.688297],[124.894105,55.688331],[124.896551,55.688332],[124.897339,55.688412],[124.90089,55.689038],[124.901753,55.689224],[124.902429,55.689522],[124.902926,55.689848],[124.904202,55.690661],[124.904877,55.691066],[124.905631,55.69141],[124.906474,55.691591],[124.906772,55.691621],[124.907437,55.691689],[124.911368,55.691585],[124.912748,55.691542],[124.914432,55.691507],[124.915555,55.69155],[124.917058,55.691818],[124.918376,55.692301],[124.919527,55.692996],[124.920741,55.694359],[124.921255,55.695422],[124.921816,55.696306],[124.921916,55.696465],[124.923375,55.699011],[124.923531,55.699299],[124.924953,55.701916],[124.925933,55.704316],[124.926383,55.706736],[124.926793,55.709206],[124.927223,55.712036],[124.928043,55.713946],[124.929693,55.715816],[124.930829,55.717133],[124.931193,55.717556],[124.931923,55.719336],[124.932333,55.721826],[124.932653,55.724676],[124.932718,55.725391],[124.932893,55.727336],[124.932613,55.729696],[124.932223,55.732936],[124.931753,55.736586],[124.931453,55.739766],[124.931253,55.742766],[124.931283,55.743496],[124.932353,55.745216],[124.933423,55.746136],[124.935463,55.747036],[124.935653,55.747106],[124.937863,55.747596],[124.938918,55.747815],[124.94058,55.74854],[124.941963,55.749546],[124.943383,55.751156],[124.944863,55.753006],[124.945783,55.75413],[124.947029,55.754931],[124.94927,55.75615],[124.949694,55.756479],[124.94999,55.756895],[124.950378,55.757507],[124.950942,55.758298],[124.951164,55.75886],[124.951088,55.759878],[124.951058,55.760604],[124.951419,55.761257],[124.952113,55.761826],[124.953463,55.762706],[124.956423,55.763366],[124.959823,55.764096],[124.962973,55.764806],[124.964927,55.765013],[124.967028,55.765151],[124.969234,55.765462],[124.970287,55.765665],[124.971267,55.766022],[124.971676,55.766193],[124.973724,55.767277],[124.975329,55.768948],[124.975913,55.770256],[124.975689,55.771136],[124.975645,55.771554],[124.975503,55.772146],[124.973513,55.773666],[124.973233,55.773886],[124.972673,55.774886],[124.972933,55.776286],[124.974381,55.777678],[124.974614,55.777936],[124.975042,55.778424],[124.975351,55.778833],[124.975486,55.779102],[124.975503,55.779286],[124.975488,55.779528],[124.975234,55.780277],[124.974935,55.78095],[124.974589,55.781686],[124.974221,55.782505],[124.974065,55.78297],[124.974026,55.783163],[124.974011,55.783289],[124.974009,55.783498],[124.974039,55.783719],[124.974124,55.783869],[124.974252,55.78408],[124.974375,55.784213],[124.974542,55.784354],[124.974716,55.784484],[124.974903,55.784578],[124.975297,55.784767],[124.975693,55.784929],[124.976076,55.785047],[124.976856,55.785222],[124.977486,55.78536],[124.97828,55.785541],[124.978835,55.78566],[124.979314,55.785775],[124.979595,55.785854],[124.979791,55.785931],[124.980368,55.786258],[124.980809,55.78654],[124.981308,55.786888],[124.982165,55.787556],[124.982921,55.788081],[124.983281,55.788309],[124.984413,55.788915],[124.986553,55.789956],[124.990633,55.791926],[124.996533,55.794806],[125.001613,55.797296],[125.002661,55.797871],[125.003338,55.798285],[125.003752,55.79875],[125.003943,55.799311],[125.003891,55.799933],[125.003624,55.800729],[125.003445,55.801279],[125.002583,55.80364],[125.001163,55.804956],[124.998273,55.806456],[124.99806,55.806679],[124.997868,55.80688],[124.997498,55.807329],[124.997222,55.807744],[124.996932,55.808182],[124.996808,55.808374],[124.996239,55.809328],[124.99569,55.810214],[124.995528,55.810496],[124.995205,55.810971],[124.994919,55.811348],[124.994429,55.811946],[124.993923,55.812491],[124.992193,55.814266],[124.989903,55.816606],[124.987803,55.818726],[124.986063,55.820896],[124.984718,55.822887],[124.984521,55.823211],[124.984359,55.82351],[124.984256,55.82373],[124.984181,55.823956],[124.98411,55.824276],[124.984063,55.824696],[124.984083,55.825186],[124.984963,55.826626],[124.985093,55.826816],[124.985543,55.827226],[124.986273,55.827676],[124.986623,55.828276],[124.987173,55.830616],[124.986983,55.831836],[124.986024,55.833545],[124.985881,55.833819],[124.985753,55.833954],[124.985633,55.834042],[124.985492,55.834116],[124.98527,55.834198],[124.984775,55.834302],[124.983874,55.83445],[124.983367,55.834518],[124.982982,55.834543],[124.982277,55.834572],[124.981833,55.834606],[124.981617,55.834655],[124.981402,55.834714],[124.98121,55.834774],[124.980957,55.834881],[124.980788,55.834973],[124.980622,55.835083],[124.980265,55.83534],[124.979946,55.835565],[124.97962,55.835801],[124.979412,55.835943],[124.979204,55.836091],[124.978998,55.836253],[124.978808,55.836433],[124.978602,55.83666],[124.978483,55.836889],[124.978356,55.837217],[124.978203,55.837956],[124.977413,55.839306],[124.976608,55.840648],[124.976703,55.841997],[124.976697,55.842105],[124.976683,55.842327],[124.976623,55.842976],[124.976152,55.843446],[124.974596,55.844351],[124.97421,55.844698],[124.974044,55.84519],[124.973977,55.84539],[124.973428,55.847018],[124.973228,55.847263],[124.972027,55.84795],[124.971773,55.848231],[124.971696,55.848593],[124.971913,55.849037],[124.973548,55.850447],[124.974,55.850917],[124.974087,55.851125],[124.974192,55.851607],[124.974496,55.853055],[124.974778,55.853516],[124.976148,55.855674],[124.976253,55.855995],[124.976019,55.85737],[124.975904,55.857851],[124.975796,55.858138],[124.975468,55.859008],[124.975474,55.860901],[124.975656,55.861377],[124.976609,55.862744],[124.977178,55.864428],[124.979043,55.872756],[124.979289,55.873656],[124.979433,55.874008],[124.97961,55.874317],[124.979621,55.87451],[124.979305,55.874859],[124.979028,55.875014],[124.978404,55.875342],[124.97773,55.875645],[124.97731,55.875877],[124.977057,55.876075],[124.976844,55.876311],[124.976742,55.876666],[124.976708,55.877273],[124.976792,55.877677],[124.977353,55.879386],[124.977623,55.880586],[124.977265,55.881857],[124.977104,55.882272],[124.976771,55.88262],[124.976326,55.882832],[124.975393,55.882846],[124.974473,55.882566],[124.972133,55.881646],[124.969513,55.880826],[124.967223,55.880286],[124.966432,55.880151],[124.965904,55.880153],[124.965353,55.880206],[124.964633,55.880369],[124.964335,55.880505],[124.964064,55.880667],[124.963466,55.881091],[124.962681,55.881581],[124.960855,55.882486],[124.958841,55.883276],[124.955811,55.88412],[124.950611,55.886223],[124.948922,55.886909],[124.948235,55.887252],[124.947423,55.887951],[124.94647,55.88895],[124.94593,55.88937],[124.942199,55.891256],[124.941401,55.891719],[124.940715,55.892211],[124.939396,55.893566],[124.938987,55.893965],[124.938422,55.894309],[124.937515,55.894634],[124.936617,55.894834],[124.935906,55.894849],[124.935468,55.894771],[124.934771,55.894599],[124.933477,55.893903],[124.932684,55.893575],[124.932181,55.893397],[124.930813,55.893138],[124.93005,55.893107],[124.929264,55.893145],[124.923173,55.894086],[124.917243,55.894966],[124.916037,55.895155],[124.914848,55.895562],[124.913702,55.89608],[124.911765,55.897724],[124.911059,55.898306],[124.91069,55.898582],[124.910053,55.898977],[124.909455,55.899299],[124.908573,55.899726],[124.906643,55.901086],[124.904903,55.903166],[124.903403,55.905136],[124.900813,55.907216],[124.900103,55.908636],[124.899523,55.910266],[124.898983,55.911616],[124.898547,55.912895],[124.8985,55.913219],[124.898475,55.913537],[124.89846,55.913989],[124.898462,55.914655],[124.898426,55.914943],[124.898364,55.915216],[124.898256,55.915488],[124.897393,55.918146],[124.896993,55.919856],[124.896943,55.920176],[124.897318,55.923762],[124.897421,55.924753],[124.897529,55.925014],[124.897703,55.92523],[124.897913,55.925416],[124.900526,55.926986],[124.904166,55.929154],[124.904605,55.92966],[124.905277,55.930356],[124.906023,55.930976],[124.906752,55.931472],[124.907325,55.93194],[124.908193,55.932888],[124.908849,55.933605],[124.908881,55.933908],[124.908778,55.9342],[124.908185,55.934676],[124.907421,55.935343],[124.907201,55.93568],[124.907221,55.936046],[124.907449,55.936386],[124.907867,55.936734],[124.908732,55.937123],[124.909115,55.937432],[124.909396,55.937849],[124.909841,55.93851],[124.910837,55.940081],[124.911643,55.941316],[124.912912,55.943366],[124.913411,55.94413],[124.913679,55.944532],[124.913995,55.944833],[124.916726,55.946583],[124.916754,55.946601],[124.917027,55.946861],[124.917353,55.947263],[124.917599,55.94773],[124.917943,55.948382],[124.918395,55.949239],[124.918697,55.949942],[124.918759,55.95061],[124.918703,55.951036],[124.917957,55.952708],[124.917356,55.953929],[124.916952,55.954664],[124.916851,55.954986],[124.916894,55.95535],[124.917023,55.955874],[124.917633,55.957086],[124.918293,55.958696],[124.918643,55.959896],[124.918813,55.960586],[124.920053,55.961826],[124.920853,55.962576],[124.921235,55.963449],[124.921322,55.963774],[124.921335,55.963987],[124.92124,55.964498],[124.921178,55.964829],[124.921105,55.965094],[124.921033,55.96525],[124.920904,55.965453],[124.920792,55.965608],[124.920312,55.966093],[124.920049,55.966325],[124.918019,55.967652],[124.916895,55.968261],[124.915767,55.968857],[124.91322,55.970203],[124.911361,55.97116],[124.909536,55.972083],[124.908661,55.972534],[124.908325,55.972702],[124.907874,55.97293],[124.907203,55.973285],[124.906975,55.973411],[124.906811,55.973529],[124.906645,55.973666],[124.906516,55.973821],[124.90645,55.973964],[124.906322,55.974239],[124.906043,55.975011],[124.905475,55.976593],[124.904713,55.978506],[124.904231,55.979538],[124.902261,55.98008],[124.901713,55.9802],[124.901412,55.98038],[124.901182,55.980518],[124.901006,55.980802],[124.901113,55.981746],[124.901557,55.98544],[124.901621,55.986294],[124.901567,55.986658],[124.901353,55.98721],[124.901223,55.98747],[124.901125,55.98764],[124.900778,55.988178],[124.900678,55.988409],[124.90061,55.988712],[124.900403,55.990646],[124.900236,55.992013],[124.900141,55.992254],[124.899953,55.992446],[124.899353,55.992746],[124.896786,55.993476],[124.895529,55.9939],[124.89381,55.99461],[124.893125,55.99483],[124.892203,55.995006],[124.890656,55.995238],[124.889718,55.995284],[124.88815,55.995287],[124.887152,55.995404],[124.88621,55.995656],[124.885601,55.995921],[124.884118,55.996631],[124.883727,55.996919],[124.883475,55.997294],[124.883342,55.997683],[124.883387,55.998048],[124.883985,55.999655],[124.884337,56.000115],[124.885853,56.001266],[124.886283,56.001546],[124.886641,56.001848],[124.88681,56.002211],[124.887033,56.002966],[124.887313,56.003886],[124.887271,56.004087],[124.88713,56.004266],[124.886811,56.004387],[124.882566,56.005609],[124.882004,56.005713],[124.881548,56.005768],[124.881033,56.005751],[124.880037,56.00564],[124.879097,56.005391],[124.878792,56.00528],[124.878427,56.005133],[124.877692,56.004674],[124.877188,56.004395],[124.876474,56.00417],[124.875868,56.00402],[124.875369,56.003933],[124.874833,56.00387],[124.874377,56.003873],[124.873958,56.003951],[124.873524,56.004116],[124.872966,56.00444],[124.872207,56.005061],[124.871389,56.005778],[124.870836,56.006417],[124.870396,56.006951],[124.87001,56.00758],[124.86981,56.008082],[124.869411,56.00928],[124.869308,56.009694],[124.869377,56.010102],[124.869742,56.01165],[124.870214,56.014585],[124.870367,56.015184],[124.870401,56.015537],[124.870376,56.015879],[124.87024,56.016217],[124.869899,56.016907],[124.868273,56.020082],[124.867915,56.020962],[124.867745,56.021814],[124.867634,56.02288],[124.867523,56.024955],[124.867279,56.029814],[124.867086,56.030438],[124.866667,56.030972],[124.864413,56.033046],[124.863773,56.033846],[124.863833,56.035626],[124.864113,56.037816],[124.864293,56.039506],[124.864563,56.040256],[124.865493,56.041306],[124.866133,56.041826],[124.86629,56.042237],[124.866339,56.042781],[124.866166,56.043243],[124.865143,56.045126],[124.865014,56.045669],[124.865051,56.046082],[124.865394,56.047285],[124.865485,56.04767],[124.865473,56.048046],[124.865301,56.048449],[124.8649,56.048749],[124.861816,56.050201],[124.861247,56.050508],[124.860898,56.050938],[124.860744,56.051326],[124.860811,56.051826],[124.861022,56.05265],[124.861403,56.053372],[124.863133,56.056586],[124.8643,56.058859],[124.864679,56.05961],[124.864691,56.06026],[124.864481,56.060848],[124.86413,56.061432],[124.863729,56.061979],[124.863113,56.062596],[124.860528,56.064022],[124.860241,56.064291],[124.859997,56.064644],[124.859832,56.064977],[124.85974,56.065214],[124.859726,56.066057],[124.859818,56.067041],[124.859741,56.06763],[124.859589,56.068054],[124.859129,56.069001],[124.858753,56.069526],[124.858307,56.069976],[124.857827,56.070367],[124.857406,56.070614],[124.857012,56.070827],[124.856809,56.07093],[124.856371,56.071163],[124.855834,56.071366],[124.85536,56.071498],[124.854356,56.071714],[124.853749,56.071832],[124.852438,56.072108],[124.840983,56.074555],[124.83953,56.074883],[124.831399,56.076612],[124.830882,56.07675],[124.829463,56.077316],[124.827343,56.078536],[124.825603,56.080316],[124.824443,56.081716],[124.824353,56.082028],[124.824574,56.084977],[124.824613,56.086476],[124.824783,56.087846],[124.825753,56.088906],[124.827193,56.089566],[124.829593,56.090276],[124.831113,56.090916],[124.831223,56.090986],[124.832213,56.091886],[124.832383,56.092056],[124.832703,56.092788],[124.832833,56.093296],[124.832837,56.09355],[124.832797,56.093884],[124.832679,56.094124],[124.831933,56.095001],[124.831603,56.095375],[124.831169,56.095826],[124.830683,56.096243],[124.830423,56.096412],[124.830166,56.096557],[124.829675,56.096786],[124.829112,56.09703],[124.828682,56.097186],[124.828275,56.09734],[124.826687,56.097926],[124.825625,56.098299],[124.82313,56.099225],[124.822398,56.099507],[124.820099,56.100337],[124.819677,56.100542],[124.819439,56.100746],[124.819228,56.101018],[124.819084,56.101393],[124.818921,56.101859],[124.818994,56.102279],[124.819173,56.102736],[124.819323,56.103225],[124.819288,56.106405],[124.819263,56.106912],[124.8192,56.107343],[124.819003,56.108095],[124.818415,56.110027],[124.818316,56.110951],[124.818438,56.111612],[124.818738,56.112225],[124.820238,56.114356],[124.82082,56.115186],[124.820968,56.115444],[124.82106,56.115822],[124.820988,56.116282],[124.820735,56.116643],[124.820338,56.116931],[124.819858,56.117187],[124.819427,56.117409],[124.818687,56.117806],[124.818449,56.117953],[124.816802,56.118841],[124.816606,56.118963],[124.81637,56.119131],[124.816185,56.119301],[124.815878,56.119632],[124.815493,56.120076],[124.815193,56.121686],[124.815363,56.123066],[124.816093,56.124696],[124.819482,56.130152],[124.81979,56.130655],[124.821227,56.133044],[124.821533,56.133699],[124.821659,56.134366],[124.821713,56.135676],[124.822043,56.136926],[124.823223,56.139196],[124.828787,56.14936],[124.829088,56.150288],[124.829483,56.151536],[124.829783,56.152846],[124.830233,56.154606],[124.831003,56.156256],[124.831393,56.157826],[124.832103,56.159416],[124.833973,56.162996],[124.834893,56.164686],[124.835473,56.165696],[124.836613,56.167156],[124.8387,56.169263],[124.838805,56.169685],[124.838726,56.1701],[124.83789,56.171565],[124.837489,56.172321],[124.837444,56.172689],[124.83766,56.173421],[124.837692,56.173526],[124.837712,56.173579],[124.837822,56.173805],[124.838009,56.174053],[124.838294,56.174267],[124.841263,56.175996],[124.842663,56.176766],[124.843122,56.1773],[124.843363,56.177796],[124.843693,56.179476],[124.843676,56.180297],[124.843271,56.181034],[124.843022,56.181448],[124.842855,56.181712],[124.842482,56.182255],[124.84223,56.182651],[124.841648,56.183244],[124.840728,56.183862],[124.840001,56.18426],[124.838867,56.184875],[124.837027,56.185889],[124.835431,56.186769],[124.834811,56.187132],[124.834458,56.187367],[124.834075,56.187661],[124.833843,56.187854],[124.833591,56.18816],[124.83346,56.188375],[124.833403,56.188603],[124.833405,56.188965],[124.83343,56.189272],[124.833516,56.189592],[124.833733,56.190166],[124.83387,56.190436],[124.834205,56.191148],[124.834703,56.192396],[124.835253,56.194276],[124.835493,56.196036],[124.835623,56.196896],[124.836693,56.198696],[124.838043,56.200136],[124.839823,56.201896],[124.840623,56.202716],[124.842333,56.204386],[124.843213,56.205286],[124.845153,56.207196],[124.846803,56.208936],[124.846953,56.209216],[124.846987,56.209617],[124.84698,56.209664],[124.846935,56.209977],[124.846818,56.210215],[124.846644,56.210507],[124.846508,56.210677],[124.846171,56.21097],[124.845568,56.211473],[124.844214,56.212626],[124.843968,56.213002],[124.843812,56.213479],[124.843762,56.214068],[124.843811,56.214741],[124.844129,56.216417],[124.844352,56.217496],[124.844562,56.218635],[124.844645,56.219183],[124.844584,56.219672],[124.844348,56.220059],[124.843719,56.22057],[124.843059,56.220925],[124.842069,56.22112],[124.840964,56.221142],[124.840867,56.221149],[124.84014,56.221154],[124.83842,56.221224],[124.837799,56.221278],[124.837289,56.221379],[124.836771,56.221581],[124.836671,56.221638],[124.836488,56.22175],[124.835675,56.222522],[124.835035,56.223227],[124.833102,56.225191],[124.831067,56.227382],[124.830263,56.228006],[124.828992,56.228942],[124.816017,56.240071],[124.815352,56.240798],[124.80998,56.250504],[124.809338,56.251623],[124.808669,56.252378],[124.806904,56.253891],[124.806208,56.254376],[124.804748,56.255142],[124.800977,56.256977],[124.79947,56.257856],[124.798693,56.258648],[124.789109,56.272183],[124.787074,56.274652],[124.786378,56.275958],[124.786061,56.277399],[124.786148,56.279249],[124.786385,56.281001],[124.788291,56.289794],[124.788825,56.291595],[124.789751,56.293189],[124.790014,56.293879],[124.790521,56.299467],[124.790813,56.302978],[124.790828,56.303452],[124.790656,56.310405],[124.790825,56.311154],[124.791907,56.312684],[124.792319,56.313141],[124.794002,56.314491],[124.794718,56.315147],[124.794894,56.315511],[124.794887,56.315893],[124.794556,56.316373],[124.787852,56.323127],[124.7865,56.324566],[124.78335,56.329475],[124.782695,56.330266],[124.781782,56.330978],[124.778051,56.333525],[124.775526,56.33511],[124.774689,56.335436],[124.773753,56.33572],[124.77146,56.336349],[124.769476,56.336972],[124.768452,56.337343],[124.767141,56.337876],[124.766785,56.338036],[124.764926,56.338927],[124.763116,56.3399],[124.761952,56.340617],[124.758803,56.343034],[124.758733,56.343099],[124.757633,56.34412],[124.750212,56.351985],[124.749713,56.352439],[124.749644,56.352502],[124.749252,56.352734],[124.748698,56.352921],[124.747725,56.353056],[124.741291,56.353075],[124.739952,56.353277],[124.738878,56.353554],[124.737729,56.354033],[124.736972,56.354524],[124.736418,56.35522],[124.736222,56.355445],[124.734174,56.358257],[124.733741,56.359223],[124.733836,56.359972],[124.734147,56.360721],[124.735688,56.362945],[124.736107,56.363813],[124.736174,56.364502],[124.735917,56.365288],[124.73466,56.367407],[124.734025,56.368111],[124.732335,56.369571],[124.722892,56.377641],[124.722542,56.377956],[124.721994,56.378595],[124.721846,56.378935],[124.721974,56.379639],[124.722048,56.380455],[124.722272,56.381525],[124.722576,56.38322],[124.7229,56.385057],[124.723116,56.385944],[124.723434,56.38667],[124.72434,56.388365],[124.726469,56.392211],[124.726694,56.392627],[124.72801,56.395061],[124.729699,56.398147],[124.73022,56.399449],[124.730207,56.400809],[124.730206,56.400885],[124.728672,56.408985],[124.728726,56.410328],[124.730005,56.414294],[124.730044,56.414415],[124.733113,56.423402],[124.733579,56.42425],[124.734397,56.425128],[124.73564,56.426022],[124.736728,56.426534],[124.736828,56.426579],[124.737445,56.426863],[124.742963,56.428615],[124.745228,56.429426],[124.746097,56.429773],[124.747314,56.430362],[124.748507,56.431002],[124.749188,56.431459],[124.749831,56.431954],[124.751789,56.433418],[124.755437,56.436841],[124.755714,56.437072],[124.757201,56.438427],[124.758492,56.439602],[124.759249,56.440125],[124.760215,56.440689],[124.761797,56.441545],[124.763108,56.442191],[124.76402,56.442647],[124.765805,56.443865],[124.76928,56.446429],[124.770063,56.447055],[124.770655,56.447707],[124.773512,56.45263],[124.774027,56.453561],[124.774142,56.453757],[124.777097,56.458888],[124.778004,56.460329],[124.779336,56.462656],[124.784202,56.471109],[124.785973,56.474196],[124.787385,56.476574],[124.789061,56.479552],[124.789413,56.480381],[124.789582,56.481284],[124.789575,56.482576],[124.788715,56.490451],[124.787822,56.498545],[124.787201,56.504361],[124.786926,56.506814],[124.786082,56.514832],[124.785432,56.521009],[124.785418,56.521139],[124.785398,56.521254],[124.785331,56.521862],[124.784206,56.532127],[124.783375,56.54003],[124.783175,56.541834],[124.783163,56.541946],[124.783042,56.543425],[124.783215,56.543804],[124.783473,56.544137],[124.783934,56.544519],[124.784534,56.544881],[124.785263,56.545162],[124.787072,56.545557],[124.787682,56.545693],[124.789139,56.546032],[124.789853,56.546253],[124.7905,56.54652],[124.791034,56.546798],[124.79164,56.547157],[124.7921,56.547593],[124.792573,56.548181],[124.793093,56.548943],[124.79451,56.551409],[124.796,56.553897],[124.797923,56.55716],[124.798685,56.558459],[124.800493,56.561416],[124.802221,56.564408],[124.804827,56.568683],[124.805801,56.570387],[124.806308,56.571369],[124.806364,56.571597],[124.806696,56.572878],[124.806938,56.57465],[124.806957,56.57536],[124.806944,56.576067],[124.806798,56.578428],[124.806133,56.583383],[124.806077,56.583783],[124.804695,56.594777],[124.804027,56.599834],[124.803252,56.605673],[124.802984,56.607734],[124.802801,56.609084],[124.802681,56.610036],[124.802484,56.611563],[124.802227,56.613464],[124.801398,56.615603],[124.800554,56.61685],[124.800337,56.617224],[124.800291,56.6173],[124.799441,56.618694],[124.799227,56.619044],[124.79847,56.620447],[124.798324,56.620856],[124.798327,56.621226],[124.798559,56.621913],[124.798794,56.622504],[124.799074,56.623039],[124.799432,56.623493],[124.800617,56.624711],[124.801605,56.625696],[124.801972,56.626074],[124.803273,56.627413],[124.804566,56.628595],[124.805726,56.629383],[124.805733,56.629388],[124.808142,56.631004],[124.808346,56.63114],[124.810987,56.632864],[124.812609,56.633963],[124.813525,56.634626],[124.813854,56.634951],[124.814156,56.635298],[124.814439,56.635776],[124.814722,56.636473],[124.816335,56.640518],[124.816416,56.640699],[124.818842,56.646484],[124.819678,56.648649],[124.819827,56.649005],[124.820092,56.649644],[124.820544,56.650728],[124.820862,56.651528],[124.822284,56.654914],[124.822755,56.656039],[124.82276,56.65605],[124.823289,56.657333],[124.82432,56.659866],[124.824467,56.660228],[124.825035,56.661642],[124.825657,56.663119],[124.825776,56.663459],[124.826169,56.6644],[124.82721,56.666885],[124.829069,56.671471],[124.829405,56.672289],[124.830233,56.674215],[124.830812,56.675561],[124.831402,56.677085],[124.831685,56.678595],[124.831699,56.67884],[124.831707,56.678893],[124.831741,56.679133],[124.83178,56.679504],[124.831859,56.680266],[124.831893,56.680516],[124.832355,56.683915],[124.83261,56.685387],[124.832636,56.685524],[124.832675,56.685722],[124.83274,56.685894],[124.832831,56.686085],[124.833021,56.686459],[124.833339,56.686856],[124.835595,56.689348],[124.8369,56.690791],[124.837661,56.691552],[124.838485,56.692275],[124.839817,56.693207],[124.842138,56.694724],[124.842762,56.695132],[124.842823,56.695172],[124.844687,56.696374],[124.850701,56.700385],[124.851419,56.700784],[124.852272,56.70111],[124.854115,56.701631],[124.854907,56.701945],[124.855403,56.702232],[124.855786,56.702562],[124.856024,56.702768],[124.856233,56.703025],[124.856401,56.703231],[124.857541,56.705413],[124.857923,56.706201],[124.858363,56.707154],[124.858462,56.707351],[124.858792,56.708054],[124.85887,56.708166],[124.859216,56.708654],[124.859323,56.708804],[124.860117,56.709452],[124.860561,56.709766],[124.860929,56.710027],[124.860995,56.710074],[124.864134,56.711691],[124.866223,56.712766],[124.867858,56.713667],[124.875025,56.717436],[124.875718,56.717801],[124.878068,56.719013],[124.878398,56.719205],[124.879957,56.72011],[124.880399,56.720367],[124.880557,56.720484],[124.880656,56.720557],[124.881619,56.721271],[124.883385,56.722557],[124.883882,56.722929],[124.885535,56.723929],[124.888022,56.7257],[124.888209,56.725817],[124.889047,56.726341],[124.889282,56.726488],[124.889468,56.726623],[124.890009,56.727014],[124.89065,56.727574],[124.891868,56.728947],[124.893807,56.732698],[124.893857,56.732796],[124.893943,56.732962],[124.895641,56.736247],[124.895802,56.73656],[124.89705,56.738957],[124.898989,56.742526],[124.900201,56.745097],[124.901864,56.74871],[124.902025,56.749139],[124.902282,56.749668],[124.903538,56.75141],[124.904922,56.752974],[124.906521,56.754814],[124.907207,56.755603],[124.909208,56.757931],[124.90931,56.758049],[124.910576,56.75952],[124.911863,56.761061],[124.913119,56.762484],[124.914357,56.764101],[124.914781,56.76548],[124.914707,56.767075],[124.914371,56.769238],[124.914267,56.769966],[124.914139,56.770785],[124.914027,56.771471],[124.913867,56.77243],[124.913537,56.774477],[124.91334,56.77571],[124.913186,56.77668],[124.912975,56.778044],[124.912949,56.77818],[124.912609,56.780047],[124.911911,56.784479],[124.911568,56.786706],[124.91115,56.78911],[124.910999,56.790808],[124.911064,56.791234],[124.911139,56.79173],[124.9116,56.792788],[124.912405,56.794057],[124.915044,56.797976],[124.91675,56.800573],[124.918864,56.80371],[124.920398,56.806065],[124.921052,56.807216],[124.921192,56.807675],[124.921224,56.809166],[124.921149,56.809566],[124.92092,56.810158],[124.920434,56.811024],[124.920145,56.811309],[124.919452,56.811722],[124.916976,56.813106],[124.916892,56.813178],[124.916063,56.813893],[124.91534,56.814625],[124.915278,56.814687],[124.914338,56.815585],[124.910344,56.819399],[124.910164,56.819577],[124.909737,56.819999],[124.908314,56.821404],[124.90788,56.821865],[124.907487,56.822469],[124.907176,56.823178],[124.907085,56.82384],[124.907139,56.824408],[124.90733,56.825084],[124.907733,56.82584],[124.908408,56.826617],[124.909151,56.827251],[124.911371,56.828545],[124.912149,56.829043],[124.913169,56.829697],[124.918236,56.832799],[124.924066,56.83629],[124.924178,56.836357],[124.926443,56.837738],[124.927399,56.83832],[124.927784,56.838652],[124.928039,56.838873],[124.928428,56.839384],[124.928775,56.840074],[124.928819,56.84058],[124.928634,56.84136],[124.928622,56.841395],[124.928481,56.841654],[124.928454,56.841716],[124.928341,56.841895],[124.928091,56.842226],[124.927736,56.842623],[124.927268,56.843118],[124.926903,56.843456],[124.926428,56.843899],[124.925332,56.844876],[124.924467,56.845644],[124.923619,56.846346],[124.922918,56.846855],[124.922419,56.84719],[124.922192,56.84733],[124.92188,56.847507],[124.921236,56.847828],[124.921087,56.847897],[124.920672,56.848111],[124.920018,56.848416],[124.919561,56.848689],[124.919226,56.848902],[124.919009,56.849059],[124.918755,56.849259],[124.918549,56.849437],[124.91819,56.849813],[124.917874,56.85026],[124.916661,56.852299],[124.916426,56.852696],[124.916177,56.853163],[124.915815,56.853843],[124.915652,56.854196],[124.915515,56.854405],[124.915367,56.854619],[124.915163,56.854873],[124.914662,56.85531],[124.911745,56.857778],[124.911568,56.857917],[124.911339,56.858084],[124.911138,56.858218],[124.910879,56.858364],[124.910574,56.858524],[124.910329,56.858652],[124.909942,56.85882],[124.90955,56.858952],[124.908768,56.859203],[124.907769,56.85937],[124.906707,56.85945],[124.905944,56.859484],[124.905154,56.859488],[124.90437,56.859463],[124.904115,56.859455],[124.902194,56.859356],[124.900484,56.859206],[124.900038,56.859167],[124.899681,56.859147],[124.899248,56.859124],[124.898323,56.85913],[124.897479,56.859094],[124.896998,56.859086],[124.896563,56.8591],[124.896243,56.859136],[124.895911,56.85921],[124.895717,56.859283],[124.895279,56.859538],[124.895126,56.859643],[124.894577,56.860073],[124.894451,56.860178],[124.894054,56.860509],[124.892033,56.862143],[124.891809,56.862342],[124.891645,56.862512],[124.891569,56.862651],[124.891561,56.862667],[124.891541,56.862822],[124.891562,56.862985],[124.891611,56.863156],[124.891685,56.863338],[124.891768,56.863465],[124.892039,56.863654],[124.892234,56.863799],[124.892489,56.864019],[124.892866,56.864301],[124.893075,56.864511],[124.893626,56.865352],[124.89394,56.865851],[124.894217,56.866354],[124.894435,56.866865],[124.894772,56.867746],[124.895083,56.868949],[124.895354,56.872207],[124.89515,56.873521],[124.894667,56.875291],[124.894284,56.876628],[124.894126,56.877075],[124.893882,56.877523],[124.892953,56.878905],[124.892626,56.879314],[124.892233,56.879738],[124.891788,56.88014],[124.891389,56.880409],[124.890905,56.880695],[124.889624,56.881435],[124.88843,56.882188],[124.887645,56.882659],[124.887092,56.882978],[124.886598,56.883253],[124.885823,56.883631],[124.885166,56.883922],[124.884408,56.884211],[124.883677,56.884466],[124.883214,56.884615],[124.882581,56.884795],[124.881441,56.885056],[124.8804,56.885271],[124.879585,56.88541],[124.87856,56.885533],[124.877603,56.885629],[124.876478,56.885682],[124.874993,56.885686],[124.872769,56.885697],[124.871458,56.885736],[124.870178,56.885867],[124.869248,56.886033],[124.868424,56.886224],[124.867609,56.886488],[124.866568,56.887039],[124.865623,56.887726],[124.865173,56.888117],[124.864531,56.889007],[124.864272,56.890409],[124.864259,56.890548],[124.86417,56.891465],[124.864154,56.891697],[124.863781,56.897139],[124.863606,56.899775],[124.863613,56.900229],[124.863654,56.90067],[124.863759,56.901093],[124.863905,56.901513],[124.864073,56.90192],[124.864561,56.902778],[124.865219,56.903598],[124.865431,56.903794],[124.866027,56.904348],[124.867066,56.905098],[124.867968,56.905727],[124.868902,56.906343],[124.870366,56.907306],[124.870777,56.907577],[124.871964,56.908349],[124.873809,56.909575],[124.874156,56.909803],[124.874495,56.910047],[124.874782,56.910309],[124.875038,56.910586],[124.875266,56.910882],[124.875466,56.911177],[124.875634,56.911531],[124.875762,56.911884],[124.875828,56.91225],[124.875856,56.912609],[124.875812,56.913],[124.8757,56.913387],[124.875575,56.913766],[124.87548,56.914015],[124.875239,56.914645],[124.874987,56.915086],[124.874689,56.915509],[124.874476,56.915748],[124.874225,56.915979],[124.873984,56.916188],[124.873705,56.916377],[124.87297,56.916853],[124.871094,56.917994],[124.869191,56.919111],[124.868901,56.919333],[124.868767,56.919465],[124.868663,56.919604],[124.86857,56.919765],[124.868507,56.91994],[124.868405,56.92028],[124.868238,56.920967],[124.865136,56.932253],[124.864543,56.934362],[124.864342,56.935064],[124.864014,56.936254],[124.862789,56.940694],[124.86261,56.941156],[124.862345,56.941608],[124.862105,56.941917],[124.861874,56.942202],[124.855081,56.950263],[124.853136,56.952689],[124.849163,56.957556],[124.848383,56.958774],[124.847814,56.961927],[124.846945,56.965991],[124.846816,56.966594],[124.846653,56.966946],[124.845603,56.967976],[124.843943,56.968776],[124.841393,56.969936],[124.840401,56.970243],[124.836669,56.970921],[124.835196,56.971274],[124.833064,56.971874],[124.832414,56.972017],[124.829384,56.972475],[124.828417,56.972653],[124.826781,56.973118],[124.825909,56.973423],[124.825461,56.973648],[124.825111,56.973944],[124.824809,56.974367],[124.824604,56.974882],[124.824179,56.976155],[124.82188,56.9849],[124.820671,56.98932],[124.820417,56.990449],[124.820375,56.990792],[124.820438,56.99131],[124.820582,56.991803],[124.825681,57.006117],[124.825931,57.006677],[124.8263,57.007174],[124.826819,57.007654],[124.827508,57.008128],[124.828579,57.008667],[124.830883,57.009558],[124.831406,57.009723],[124.831666,57.009793],[124.832107,57.009912],[124.833163,57.010092],[124.834318,57.010162],[124.835385,57.010134],[124.836542,57.009976],[124.837635,57.009716],[124.840517,57.008735],[124.841279,57.008545],[124.842155,57.008435],[124.843029,57.008423],[124.843955,57.00852],[124.844831,57.008713],[124.845534,57.008955],[124.84601,57.009175],[124.846427,57.009469],[124.848954,57.011792],[124.849251,57.0122],[124.849489,57.012623],[124.849568,57.012963],[124.849592,57.013547],[124.84952,57.01413],[124.849214,57.015386],[124.849208,57.015501],[124.849179,57.016001],[124.849249,57.016577],[124.84998,57.018483],[124.850085,57.019052],[124.849836,57.021234],[124.849646,57.022591],[124.849649,57.023076],[124.849792,57.023425],[124.85005,57.023802],[124.85052,57.024213],[124.852052,57.025414],[124.852364,57.025787],[124.852502,57.026185],[124.852444,57.026617],[124.852208,57.027196],[124.851894,57.027667],[124.849607,57.030555],[124.849434,57.030773],[124.848719,57.031739],[124.848103,57.032772],[124.847534,57.034006],[124.847385,57.034388],[124.846763,57.035988],[124.846732,57.036455],[124.846985,57.036769],[124.847003,57.036792],[124.847498,57.03701],[124.84808,57.037125],[124.848655,57.037137],[124.849225,57.037004],[124.849582,57.036821],[124.849888,57.036558],[124.85005,57.036265],[124.850134,57.036005],[124.850319,57.035289],[124.850329,57.035261],[124.850525,57.034697],[124.850757,57.034197],[124.851104,57.033887],[124.85155,57.033743],[124.852053,57.033686],[124.852598,57.033718],[124.853117,57.033867],[124.854227,57.03471],[124.854396,57.034904],[124.854832,57.035403],[124.855317,57.03612],[124.856021,57.037345],[124.856587,57.038706],[124.856843,57.039672],[124.856945,57.040966],[124.856975,57.043496],[124.856961,57.045901],[124.856843,57.046785],[124.856427,57.047763],[124.856237,57.04827],[124.856024,57.048841],[124.855842,57.049786],[124.8559,57.050441],[124.856275,57.051286],[124.856964,57.052527],[124.857321,57.05318],[124.858563,57.055226],[124.858793,57.056406],[124.858713,57.057046],[124.858343,57.058256],[124.857853,57.059346],[124.857633,57.059686],[124.857313,57.060596],[124.856673,57.061796],[124.855983,57.062926],[124.855533,57.063746],[124.854993,57.064866],[124.854203,57.066256],[124.853543,57.067476],[124.853383,57.067846],[124.852963,57.068676],[124.851053,57.072176],[124.849333,57.075156],[124.848993,57.075506],[124.848493,57.076366],[124.847833,57.077566],[124.847703,57.077776],[124.847143,57.078896],[124.846563,57.079986],[124.846413,57.080336],[124.846073,57.080826],[124.845453,57.081616],[124.845003,57.082136],[124.844443,57.082756],[124.844073,57.082996],[124.843713,57.083396],[124.843393,57.083976],[124.842853,57.084576],[124.842163,57.085656],[124.841563,57.086706],[124.840883,57.088076],[124.840063,57.089576],[124.840023,57.090736],[124.840533,57.092396],[124.840883,57.093276],[124.840833,57.094196],[124.840473,57.095416],[124.839573,57.096516],[124.838813,57.097337],[124.837568,57.098709],[124.837002,57.099352],[124.835886,57.100549],[124.834873,57.101686],[124.834093,57.103076],[124.833363,57.104666],[124.832593,57.106126],[124.831463,57.107686],[124.831073,57.108036],[124.829743,57.108916],[124.828573,57.10977],[124.825833,57.111766],[124.824313,57.113056],[124.823713,57.113596],[124.822613,57.114666],[124.821523,57.115886],[124.820546,57.117385],[124.820473,57.117496],[124.819763,57.118896],[124.819273,57.119726],[124.818803,57.121276],[124.818413,57.123336],[124.817923,57.125646],[124.817273,57.127346],[124.816342,57.128491],[124.815824,57.128982],[124.814067,57.130433],[124.813134,57.131219],[124.812519,57.131743],[124.811726,57.132376],[124.810905,57.132996],[124.810596,57.133238],[124.810004,57.133621],[124.809529,57.133883],[124.808743,57.134212],[124.806967,57.134762],[124.806407,57.134897],[124.800023,57.136446],[124.793603,57.138036],[124.790813,57.138766],[124.787043,57.139686],[124.785943,57.139986],[124.784763,57.140266],[124.783583,57.140482],[124.78312,57.140587],[124.780329,57.141241],[124.77916,57.141544],[124.777761,57.141978],[124.777334,57.142137],[124.776775,57.142369],[124.776375,57.142574],[124.776014,57.142787],[124.77506,57.143442],[124.774737,57.143683],[124.774375,57.14399],[124.774172,57.144177],[124.774032,57.14441],[124.773433,57.145776],[124.773393,57.147046],[124.773483,57.148266],[124.773523,57.149576],[124.773541,57.151094],[124.773554,57.151484],[124.773583,57.152386],[124.773583,57.153806],[124.773203,57.155546],[124.772253,57.156766],[124.770693,57.158136],[124.768653,57.159446],[124.765883,57.161076],[124.764403,57.162026],[124.762773,57.163266],[124.761313,57.164616],[124.759553,57.166146],[124.757433,57.167876],[124.755933,57.169044],[124.755574,57.169324],[124.754723,57.169986],[124.752733,57.171566],[124.751925,57.17226],[124.751533,57.172596],[124.749943,57.174406],[124.749063,57.175966],[124.748443,57.178026],[124.747943,57.181676],[124.748051,57.182285],[124.7483,57.183702],[124.748484,57.184744],[124.74883,57.186388],[124.7493,57.18822],[124.749756,57.190111],[124.750185,57.191044],[124.750752,57.191795],[124.751295,57.192406],[124.753245,57.193557],[124.754192,57.193886],[124.754621,57.194031],[124.755244,57.194193],[124.756407,57.194477],[124.756923,57.194577],[124.757438,57.194671],[124.757835,57.194712],[124.7585,57.194785],[124.759326,57.194831],[124.760013,57.194852],[124.760694,57.194846],[124.761692,57.194802],[124.762566,57.194738],[124.763384,57.194655],[124.764157,57.194587],[124.76469,57.194536],[124.765543,57.194474],[124.766549,57.194429],[124.767483,57.19442],[124.768325,57.194464],[124.769041,57.19452],[124.769532,57.19457],[124.77058,57.194702],[124.771618,57.194878],[124.772262,57.194985],[124.773376,57.195172],[124.774522,57.195363],[124.776734,57.195743],[124.779085,57.196108],[124.780599,57.196322],[124.782354,57.196496],[124.783311,57.196581],[124.784212,57.196668],[124.784865,57.196753],[124.785544,57.196839],[124.7863,57.196948],[124.787227,57.197107],[124.788341,57.19736],[124.789702,57.197766],[124.79045,57.198064],[124.791251,57.198387],[124.793509,57.199745],[124.79398,57.20008],[124.794484,57.200536],[124.795862,57.201567],[124.796626,57.20206],[124.797392,57.202477],[124.797948,57.202671],[124.799333,57.203146],[124.800075,57.203335],[124.800537,57.20341],[124.801983,57.203619],[124.803939,57.203719],[124.805057,57.203708],[124.806056,57.203677],[124.806891,57.203641],[124.808452,57.203478],[124.808896,57.203404],[124.809232,57.203318],[124.809384,57.203269],[124.809644,57.203185],[124.811914,57.202403],[124.81452,57.201459],[124.816593,57.200626],[124.819743,57.199596],[124.822383,57.198846],[124.824143,57.197966],[124.827663,57.196266],[124.830063,57.195276],[124.831647,57.19484],[124.83304,57.194568],[124.834814,57.194333],[124.836709,57.194244],[124.838821,57.194221],[124.840854,57.194249],[124.842879,57.194366],[124.844506,57.19453],[124.846159,57.194774],[124.847621,57.195032],[124.848937,57.195299],[124.850512,57.195712],[124.854864,57.196851],[124.857391,57.197512],[124.86299,57.199026],[124.864998,57.199711],[124.865844,57.20017],[124.866738,57.200713],[124.867545,57.201458],[124.868362,57.20232],[124.868809,57.202975],[124.8693,57.203891],[124.870761,57.205857],[124.872385,57.207387],[124.873623,57.208246],[124.874863,57.209146],[124.875423,57.209526],[124.875723,57.209696],[124.876733,57.210366],[124.877723,57.210876],[124.879263,57.211436],[124.881133,57.212206],[124.882663,57.213009],[124.883866,57.213799],[124.884557,57.214374],[124.885256,57.215149],[124.885884,57.216353],[124.886098,57.217018],[124.886244,57.217502],[124.886252,57.218446],[124.88569,57.220665],[124.885468,57.222014],[124.885461,57.222543],[124.885517,57.223114],[124.885597,57.223461],[124.885684,57.223861],[124.885964,57.224653],[124.886377,57.225576],[124.886945,57.226976],[124.88714,57.227488],[124.887242,57.227859],[124.887313,57.228229],[124.887361,57.228575],[124.887371,57.228929],[124.887357,57.230471],[124.88735,57.231355],[124.887371,57.232468],[124.887353,57.234206],[124.887293,57.235386],[124.887353,57.240946],[124.887353,57.245016],[124.887536,57.246261],[124.887729,57.246714],[124.888081,57.247266],[124.888494,57.247656],[124.889293,57.248466],[124.890272,57.249144],[124.892149,57.250464],[124.893319,57.251434],[124.894268,57.252788],[124.894561,57.253526],[124.89463,57.254976],[124.894567,57.256739],[124.894653,57.257856],[124.894767,57.25853],[124.894981,57.259029],[124.895584,57.260138],[124.896258,57.260977],[124.898252,57.263325],[124.899783,57.265246],[124.900789,57.266646],[124.901032,57.267222],[124.901183,57.267755],[124.901239,57.268396],[124.901152,57.268988],[124.900403,57.271756],[124.899783,57.273906],[124.899031,57.275772],[124.898833,57.276116],[124.898601,57.276478],[124.898134,57.277106],[124.897837,57.277453],[124.89761,57.277656],[124.897151,57.278084],[124.896576,57.278595],[124.895944,57.279066],[124.895322,57.279474],[124.894227,57.28008],[124.893214,57.280599],[124.892281,57.281008],[124.891382,57.281361],[124.89023,57.281724],[124.889422,57.281954],[124.887786,57.282309],[124.886752,57.282497],[124.880943,57.283446],[124.877053,57.284076],[124.875423,57.284436],[124.873928,57.28481],[124.873623,57.284886],[124.872259,57.285307],[124.871441,57.28556],[124.870643,57.285806],[124.869353,57.286236],[124.869053,57.286366],[124.868713,57.286456],[124.867053,57.287016],[124.865123,57.288126],[124.863813,57.289456],[124.863283,57.290936],[124.862703,57.296286],[124.862143,57.301106],[124.862033,57.303276],[124.862703,57.305016],[124.864353,57.307356],[124.865383,57.308726],[124.867183,57.311026],[124.869263,57.312956],[124.872373,57.315276],[124.875683,57.317636],[124.877853,57.319136],[124.881764,57.321956],[124.881903,57.322056],[124.888793,57.327396],[124.890723,57.329586],[124.893173,57.332606],[124.894803,57.334516],[124.896753,57.335896],[124.899333,57.337116],[124.902543,57.338486],[124.904783,57.339776],[124.90641,57.341309],[124.907138,57.342183],[124.907569,57.34305],[124.907769,57.343613],[124.907916,57.344121],[124.908028,57.344641],[124.908068,57.345187],[124.90806,57.3461],[124.908028,57.346746],[124.907985,57.347392],[124.907944,57.348185],[124.907907,57.34875],[124.90788,57.349499],[124.907861,57.350054],[124.907792,57.351139],[124.907759,57.351541],[124.907443,57.356856],[124.907223,57.360056],[124.906733,57.362226],[124.904523,57.365226],[124.903411,57.366868],[124.903341,57.367424],[124.903408,57.368115],[124.903713,57.368911],[124.904397,57.369576],[124.90501,57.370127],[124.90778,57.372536],[124.908724,57.373368],[124.908903,57.373526],[124.910483,57.374926],[124.91052,57.374958],[124.911235,57.375577],[124.91169,57.375969],[124.912113,57.376336],[124.914413,57.378376],[124.916843,57.380456],[124.921663,57.384666],[124.924133,57.386706],[124.926343,57.387946],[124.929303,57.389106],[124.941903,57.393746],[124.945553,57.395096],[124.950313,57.396986],[124.952483,57.398336],[124.954413,57.400026],[124.957373,57.402686],[124.958513,57.403746],[124.958686,57.40389],[124.959663,57.404706],[124.963613,57.408246],[124.968053,57.412286],[124.970304,57.414265],[124.971363,57.415196],[124.974213,57.417516],[124.977353,57.419706],[124.979883,57.421256],[124.983304,57.423033],[124.983463,57.423116],[124.986593,57.424576],[124.990593,57.426166],[124.995463,57.427886],[125.003073,57.430456],[125.017889,57.435554],[125.022731,57.437231],[125.027831,57.439],[125.028622,57.439269],[125.029041,57.439415],[125.02944,57.439603],[125.030692,57.440722],[125.03125,57.441217],[125.031626,57.44156],[125.031982,57.441893],[125.032336,57.442207],[125.033333,57.443056],[125.034593,57.444146],[125.036163,57.445586],[125.037023,57.446876],[125.037413,57.448716],[125.038716,57.456413],[125.038946,57.457631],[125.039338,57.459758],[125.039711,57.461801],[125.040057,57.463242],[125.040303,57.463776],[125.04059,57.464192],[125.041613,57.465366],[125.043348,57.467359],[125.046463,57.470926],[125.047923,57.472536],[125.051723,57.476766],[125.053113,57.478396],[125.054983,57.480516],[125.056613,57.482316],[125.057643,57.483476],[125.058234,57.484211],[125.058542,57.484481],[125.059084,57.484807],[125.059543,57.48503],[125.060155,57.48535],[125.060503,57.485512],[125.060883,57.485646],[125.061659,57.48583],[125.063373,57.486047],[125.064901,57.486236],[125.066758,57.486472],[125.067492,57.486567],[125.067946,57.486604],[125.068305,57.486614],[125.06855,57.486613],[125.068736,57.4866],[125.068957,57.486577],[125.069376,57.486502],[125.069845,57.486396],[125.071256,57.486102],[125.072759,57.485788],[125.072957,57.485751],[125.074667,57.485391],[125.076031,57.48509],[125.0772,57.484828],[125.077871,57.484679],[125.078262,57.484595],[125.078688,57.484513],[125.079182,57.48443],[125.079597,57.484374],[125.080044,57.484324],[125.080698,57.484274],[125.081815,57.484181],[125.082284,57.484148],[125.082726,57.484122],[125.085884,57.483853],[125.087623,57.48371],[125.08873,57.483604],[125.090309,57.483482],[125.091768,57.483357],[125.092824,57.483267],[125.093524,57.483171],[125.09409,57.483024],[125.094661,57.482863],[125.094987,57.482759],[125.095297,57.482652],[125.095642,57.482447],[125.095964,57.482218],[125.09624,57.481995],[125.096579,57.48174],[125.096826,57.481566],[125.097043,57.481434],[125.097209,57.481346],[125.097453,57.481234],[125.097679,57.481141],[125.097956,57.481042],[125.098146,57.480982],[125.098377,57.480921],[125.098571,57.480873],[125.098816,57.480833],[125.09917,57.480795],[125.099674,57.480758],[125.100093,57.480728],[125.100554,57.480709],[125.10101,57.480712],[125.101423,57.480739],[125.104253,57.481226],[125.106653,57.481716],[125.110793,57.482596],[125.114033,57.483306],[125.117463,57.483996],[125.119574,57.484506],[125.121803,57.485476],[125.123263,57.486186],[125.124633,57.487496],[125.125773,57.488846],[125.126373,57.489246],[125.129703,57.490836],[125.132873,57.492086],[125.142867,57.494876],[125.14389,57.49516],[125.144577,57.495362],[125.146481,57.496161],[125.147932,57.496901],[125.149279,57.4976],[125.149987,57.497959],[125.150322,57.498125],[125.151763,57.49886],[125.152991,57.499499],[125.15325,57.499665],[125.153469,57.49984],[125.154513,57.500797],[125.156343,57.502529],[125.157707,57.50381],[125.158781,57.504846],[125.160373,57.506313],[125.161325,57.507193],[125.161786,57.507651],[125.161942,57.507818],[125.162234,57.508422],[125.16236,57.508784],[125.162682,57.509611],[125.162776,57.509771],[125.163036,57.510091],[125.165893,57.512876],[125.168063,57.515066],[125.169634,57.516606],[125.171323,57.518286],[125.173044,57.520046],[125.174784,57.521736],[125.176043,57.523416],[125.176643,57.524866],[125.178583,57.531176],[125.178764,57.532239],[125.178736,57.532586],[125.178696,57.532838],[125.1786,57.53319],[125.178526,57.533382],[125.178283,57.533864],[125.178108,57.534267],[125.178013,57.534486],[125.177772,57.535119],[125.17764,57.535507],[125.177523,57.535866],[125.177402,57.536161],[125.177216,57.536703],[125.177067,57.537071],[125.176918,57.537445],[125.176799,57.537737],[125.176667,57.538026],[125.176559,57.538236],[125.176192,57.538749],[125.175935,57.539093],[125.175592,57.53949],[125.175215,57.53983],[125.174717,57.540225],[125.17377,57.540937],[125.173474,57.541149],[125.173259,57.541325],[125.173108,57.541468],[125.172976,57.541633],[125.17295,57.541778],[125.173027,57.54189],[125.173167,57.541973],[125.173395,57.542025],[125.17374,57.542039],[125.17434,57.541993],[125.175307,57.541917],[125.176676,57.54182],[125.177847,57.541732],[125.178402,57.54169],[125.178984,57.541676],[125.179192,57.5417],[125.179409,57.541742],[125.179565,57.54181],[125.179711,57.541898],[125.179826,57.542018],[125.179892,57.542165],[125.179903,57.542315],[125.179884,57.542523],[125.179662,57.543103],[125.179433,57.543803],[125.179305,57.544105],[125.179115,57.544625],[125.17906,57.544879],[125.179081,57.545161],[125.179164,57.545452],[125.179203,57.545636],[125.17929,57.54588],[125.179544,57.546286],[125.179713,57.547166],[125.179013,57.548156],[125.177423,57.550086],[125.177184,57.551116],[125.177823,57.552656],[125.178303,57.554676],[125.178793,57.556496],[125.179763,57.558426],[125.180594,57.560406],[125.181623,57.562576],[125.181823,57.563066],[125.181563,57.563686],[125.180709,57.564463],[125.179886,57.565392],[125.177605,57.567914],[125.177018,57.568562],[125.176697,57.568937],[125.176081,57.569612],[125.175839,57.569878],[125.175564,57.570144],[125.175202,57.570442],[125.174786,57.570736],[125.174127,57.571179],[125.173631,57.571503],[125.173173,57.571824],[125.172715,57.572104],[125.171978,57.572599],[125.171265,57.573068],[125.170706,57.573434],[125.170199,57.573766],[125.169325,57.574348],[125.167545,57.575536],[125.164793,57.57734],[125.163647,57.578098],[125.162685,57.578735],[125.161915,57.57925],[125.160753,57.580008],[125.159713,57.580701],[125.15894,57.581232],[125.158382,57.581621],[125.157916,57.582063],[125.157653,57.582339],[125.157395,57.582684],[125.156996,57.583242],[125.156805,57.583488],[125.156743,57.58365],[125.156631,57.584056],[125.156591,57.584375],[125.156458,57.585432],[125.156413,57.586516],[125.156903,57.587636],[125.157873,57.588856],[125.160344,57.592096],[125.163533,57.596286],[125.165773,57.599266],[125.166653,57.600956],[125.167383,57.602096],[125.169613,57.606006],[125.170403,57.607436],[125.170983,57.608556],[125.172073,57.610506],[125.173283,57.612506],[125.174283,57.614096],[125.176624,57.618086],[125.177293,57.619456],[125.177953,57.620526],[125.178583,57.621706],[125.181093,57.625846],[125.181883,57.627206],[125.182573,57.628446],[125.183946,57.630898],[125.184243,57.631236],[125.185684,57.633536],[125.187933,57.637306],[125.188923,57.638206],[125.190747,57.639535],[125.191023,57.639736],[125.192893,57.641046],[125.194713,57.642436],[125.198213,57.645036],[125.200033,57.646326],[125.202803,57.648336],[125.204153,57.649256],[125.206153,57.650696],[125.208173,57.652306],[125.209993,57.653856],[125.214263,57.657736],[125.215833,57.659046],[125.216798,57.660033],[125.216968,57.660204],[125.218316,57.661591],[125.219053,57.662436],[125.219973,57.663766],[125.221054,57.665074],[125.221213,57.665266],[125.221943,57.666316],[125.223323,57.668126],[125.224193,57.669406],[125.225933,57.671796],[125.227183,57.673426],[125.228554,57.675006],[125.230554,57.676786],[125.232583,57.678186],[125.234693,57.679366],[125.237468,57.680713],[125.238396,57.681065],[125.239644,57.681556],[125.242183,57.682436],[125.248493,57.684686],[125.249863,57.685156],[125.257283,57.687866],[125.259433,57.688656],[125.261853,57.689556],[125.265463,57.690956],[125.267863,57.692326],[125.269083,57.693266],[125.270243,57.694576],[125.271554,57.696166],[125.273294,57.698186],[125.275143,57.700246],[125.277513,57.70281],[125.278213,57.703568],[125.279713,57.705196],[125.281118,57.706429],[125.282674,57.707646],[125.284173,57.708826],[125.285564,57.709816],[125.287543,57.711166],[125.291403,57.713826],[125.293293,57.715026],[125.295114,57.716276],[125.297263,57.717706],[125.299684,57.719346],[125.301573,57.720866],[125.310114,57.728786],[125.312193,57.730716],[125.314024,57.732476],[125.318013,57.736126],[125.320053,57.737906],[125.326964,57.744236],[125.329324,57.746396],[125.331554,57.748696],[125.332328,57.749644],[125.332714,57.750083],[125.337004,57.754916],[125.338184,57.756356],[125.339063,57.758006],[125.339364,57.759466],[125.339573,57.761336],[125.339894,57.763606],[125.340414,57.766036],[125.341234,57.768176],[125.341834,57.770216],[125.342043,57.772596],[125.341464,57.776676],[125.341312,57.777693],[125.341086,57.778482],[125.340844,57.778996],[125.340432,57.779615],[125.339961,57.780125],[125.339681,57.780401],[125.339013,57.781076],[125.337733,57.782446],[125.336423,57.784076],[125.335503,57.785886],[125.335073,57.787766],[125.334813,57.791696],[125.334813,57.792836],[125.335243,57.794656],[125.335973,57.796246],[125.337043,57.797746],[125.339794,57.800966],[125.345074,57.807256],[125.346724,57.809076],[125.348784,57.810856],[125.350543,57.812036],[125.352733,57.813286],[125.355043,57.814376],[125.357233,57.815366],[125.359208,57.816289],[125.362003,57.817596],[125.362363,57.817746],[125.365344,57.819162],[125.367733,57.820296],[125.370094,57.821326],[125.374635,57.823477],[125.381086,57.826476],[125.384247,57.827945],[125.384606,57.828112],[125.386877,57.829232],[125.388541,57.830192],[125.389706,57.831036],[125.39046,57.83157],[125.391497,57.832419],[125.392245,57.833137],[125.393206,57.834526],[125.394266,57.836424],[125.395028,57.837787],[125.397758,57.842888],[125.398584,57.844356],[125.399451,57.84599],[125.400385,57.847771],[125.401597,57.850004],[125.402927,57.852316],[125.405202,57.855553],[125.406513,57.857423],[125.406655,57.857693],[125.408813,57.86206],[125.409499,57.863041],[125.410272,57.864023],[125.411345,57.864913],[125.412975,57.866055],[125.414402,57.867035],[125.417095,57.868885],[125.423919,57.873381],[125.433274,57.87968],[125.440613,57.884585],[125.443016,57.886091],[125.445334,57.887323],[125.447265,57.888258],[125.450253,57.889434],[125.450824,57.889643],[125.451888,57.890032],[125.455296,57.891278],[125.455333,57.891292],[125.467632,57.895889],[125.481001,57.900788],[125.491004,57.904466],[125.492829,57.905249],[125.494424,57.906376],[125.49583,57.907568],[125.496695,57.908717],[125.497425,57.910743],[125.49842,57.913776],[125.499815,57.918004],[125.504128,57.931075],[125.50593,57.936543],[125.506402,57.938092],[125.506359,57.939071],[125.506016,57.94021],[125.50387,57.947568],[125.50357,57.94923],[125.503613,57.951052],[125.50378,57.952596],[125.504119,57.953959],[125.505551,57.958438],[125.505742,57.959146],[125.50599,57.9605],[125.506101,57.961858],[125.506009,57.962809],[125.505821,57.963805],[125.505442,57.964943],[125.504965,57.96596],[125.502406,57.97174],[125.501281,57.97428],[125.499423,57.978476],[125.498522,57.980509],[125.498391,57.980809],[125.498377,57.980842],[125.498086,57.981491],[125.496845,57.984258],[125.496843,57.984262],[125.49595,57.986254],[125.493796,57.991054],[125.493325,57.992062],[125.492736,57.992876],[125.4912,57.994507],[125.489647,57.995994],[125.488192,57.997621],[125.487351,57.998879],[125.486731,57.999999],[125.485154,58.003247],[125.483806,58.006157],[125.482531,58.008971],[125.48243,58.00918],[125.478348,58.01804],[125.47802,58.019102],[125.477879,58.020766],[125.478465,58.022173],[125.47965,58.023612],[125.481538,58.024952],[125.483317,58.025787],[125.489566,58.028342],[125.490501,58.028808],[125.491249,58.029303],[125.491941,58.02984],[125.492567,58.030538],[125.493009,58.031403],[125.493224,58.032319],[125.493122,58.033435],[125.492714,58.034275],[125.492101,58.035069],[125.49125,58.035848],[125.490137,58.036496],[125.487287,58.037775],[125.486488,58.03822],[125.485559,58.038844],[125.485099,58.039262],[125.484307,58.039979],[125.483508,58.040795],[125.48319,58.041111],[125.482854,58.041309],[125.482382,58.041416],[125.480952,58.041433],[125.479712,58.041485],[125.478989,58.041563],[125.47853,58.041612],[125.477034,58.041777],[125.475423,58.041831],[125.473892,58.04185],[125.473173,58.041895],[125.470571,58.042276],[125.468819,58.042631],[125.467992,58.042936],[125.466376,58.044002],[125.465968,58.044322],[125.463942,58.046447],[125.463772,58.046833],[125.463453,58.048138],[125.46348,58.048563],[125.46551,58.052375],[125.465673,58.053397],[125.465661,58.054365],[125.465498,58.055283],[125.465136,58.056491],[125.465016,58.056919],[125.464548,58.058506],[125.463945,58.059388],[125.463914,58.059427],[125.463409,58.060075],[125.463129,58.060838],[125.463284,58.061857],[125.463577,58.063012],[125.464242,58.064247],[125.465506,58.065556],[125.466972,58.066889],[125.467558,58.067704],[125.467818,58.068609],[125.467701,58.069583],[125.467092,58.070627],[125.466214,58.07164],[125.46572,58.072007],[125.463867,58.07323],[125.454816,58.079207],[125.452407,58.081038],[125.450939,58.082553],[125.449388,58.084803],[125.448275,58.087078],[125.447879,58.088383],[125.447761,58.090035],[125.450933,58.108044],[125.451118,58.109785],[125.450979,58.111684],[125.4509,58.113078],[125.450152,58.12624],[125.450269,58.127226],[125.450161,58.135255],[125.450112,58.136543],[125.450065,58.137323],[125.450001,58.138582],[125.449833,58.141645],[125.449705,58.142196],[125.449552,58.14267],[125.449305,58.143216],[125.449084,58.143591],[125.448611,58.144229],[125.448113,58.144877],[125.447731,58.145272],[125.447197,58.145809],[125.44665,58.146335],[125.445171,58.147793],[125.444555,58.148379],[125.443503,58.14967],[125.443267,58.150701],[125.44331,58.151538],[125.443568,58.152365],[125.443932,58.153135],[125.444748,58.15507],[125.445585,58.157153],[125.446979,58.160595],[125.447797,58.162593],[125.448224,58.164749],[125.448312,58.167199],[125.448224,58.16905],[125.448396,58.172558],[125.448487,58.174422],[125.448444,58.174818],[125.448162,58.175981],[125.447773,58.177367],[125.446917,58.179138],[125.445799,58.180738],[125.444533,58.182073],[125.443055,58.183414],[125.439383,58.18618],[125.436497,58.188355],[125.436117,58.188625],[125.430266,58.193034],[125.422198,58.198869],[125.416147,58.203256],[125.41074,58.207213],[125.406663,58.210356],[125.405461,58.211531],[125.40456,58.213204],[125.403873,58.214538],[125.403186,58.216256],[125.400139,58.223715],[125.39735,58.230629],[125.395633,58.235058],[125.394081,58.239038],[125.392982,58.241635],[125.392837,58.242034],[125.391802,58.244738],[125.391226,58.24689],[125.389862,58.252862],[125.389701,58.253291],[125.389031,58.254997],[125.386885,58.259948],[125.386717,58.260382],[125.386643,58.260805],[125.386527,58.26702],[125.386482,58.270615],[125.386406,58.270942],[125.386269,58.27118],[125.385308,58.272436],[125.38497,58.27291],[125.384837,58.273229],[125.384822,58.273546],[125.38494,58.274051],[125.385049,58.274433],[125.385286,58.274746],[125.385647,58.275051],[125.387339,58.276178],[125.387945,58.276607],[125.388542,58.277086],[125.388888,58.277455],[125.393923,58.284103],[125.394115,58.284401],[125.394229,58.284668],[125.394299,58.284966],[125.394252,58.285221],[125.394114,58.285579],[125.39395,58.285852],[125.393655,58.286199],[125.392453,58.287371],[125.392219,58.287636],[125.392011,58.287929],[125.391894,58.288174],[125.391747,58.288541],[125.390823,58.29136],[125.390684,58.291707],[125.390481,58.292045],[125.386704,58.297584],[125.386549,58.29787],[125.386439,58.298125],[125.386387,58.298423],[125.386387,58.298519],[125.38643,58.305064],[125.386441,58.305443],[125.386515,58.305749],[125.387081,58.307005],[125.3873,58.307364],[125.387688,58.307732],[125.390536,58.309719],[125.392127,58.310805],[125.393496,58.311797],[125.394256,58.31244],[125.394975,58.313211],[125.39732,58.316031],[125.399597,58.318851],[125.403584,58.323768],[125.404448,58.324888],[125.404767,58.325436],[125.404989,58.326077],[125.405196,58.327121],[125.406793,58.339496],[125.40705,58.340532],[125.407329,58.341432],[125.408246,58.343333],[125.408808,58.344176],[125.409898,58.345586],[125.41186,58.347459],[125.41472,58.349833],[125.415438,58.35043],[125.416416,58.351282],[125.416941,58.352235],[125.417455,58.353972],[125.417593,58.35532],[125.419936,58.37705],[125.420138,58.378868],[125.420168,58.379253],[125.421053,58.388979],[125.421423,58.392632],[125.422472,58.402403],[125.42292,58.404166],[125.424748,58.409019],[125.425861,58.41191],[125.425938,58.412111],[125.426437,58.412957],[125.427101,58.413651],[125.427954,58.414269],[125.429041,58.414897],[125.433483,58.417527],[125.434427,58.418123],[125.435007,58.41864],[125.435221,58.419224],[125.435264,58.420157],[125.435071,58.421831],[125.434964,58.422404],[125.434663,58.422932],[125.434127,58.423494],[125.433397,58.424056],[125.429792,58.42646],[125.427168,58.428279],[125.426685,58.428664],[125.426639,58.428954],[125.426839,58.429302],[125.427195,58.429611],[125.427792,58.42986],[125.428526,58.430067],[125.429381,58.43023],[125.430408,58.430251],[125.431284,58.43027],[125.431966,58.430354],[125.432401,58.430531],[125.432665,58.430784],[125.432711,58.431077],[125.432275,58.432322],[125.432223,58.43247],[125.431917,58.433043],[125.43123,58.433863],[125.427604,58.437929],[125.426831,58.438491],[125.425501,58.439468],[125.424621,58.440299],[125.42196,58.443376],[125.421697,58.443837],[125.421596,58.444667],[125.421596,58.445274],[125.421703,58.445566],[125.421939,58.445891],[125.425866,58.449439],[125.426316,58.449765],[125.42814,58.450585],[125.429127,58.450899],[125.431691,58.451818],[125.43329,58.45246],[125.436986,58.454308],[125.438247,58.454986],[125.439363,58.455715],[125.439963,58.456366],[125.440392,58.457062],[125.440607,58.457781],[125.440693,58.458319],[125.440586,58.458611],[125.440221,58.459049],[125.437143,58.462493],[125.436951,58.462788],[125.436511,58.463716],[125.436412,58.464246],[125.43637,58.465747],[125.436304,58.466061],[125.436101,58.466457],[125.435135,58.467781],[125.434728,58.46814],[125.433934,58.468858],[125.428848,58.473201],[125.428543,58.473469],[125.428267,58.473776],[125.428065,58.474111],[125.42525,58.479336],[125.425002,58.479815],[125.424837,58.480187],[125.424767,58.480519],[125.424756,58.480631],[125.424758,58.480704],[125.424757,58.480828],[125.42475,58.482557],[125.424664,58.483118],[125.424385,58.483656],[125.424189,58.483951],[125.424042,58.484172],[125.423781,58.484466],[125.423322,58.484871],[125.423265,58.484907],[125.422649,58.485303],[125.42199,58.48566],[125.421455,58.485912],[125.420687,58.486171],[125.419829,58.486447],[125.419137,58.486743],[125.41857,58.487076],[125.418168,58.487331],[125.417536,58.487803],[125.417287,58.488045],[125.416999,58.488366],[125.416698,58.488734],[125.416467,58.489179],[125.414522,58.493615],[125.413813,58.494317],[125.413143,58.49496],[125.411544,58.496456],[125.410382,58.497746],[125.409954,58.498426],[125.408989,58.500152],[125.40889,58.500403],[125.40885,58.500758],[125.408968,58.501722],[125.409398,58.505781],[125.411133,58.510976],[125.410578,58.512912],[125.410318,58.514207],[125.410147,58.514937],[125.409853,58.515634],[125.409565,58.516143],[125.409293,58.516511],[125.408874,58.516991],[125.408171,58.5178],[125.406614,58.519687],[125.405811,58.520729],[125.404046,58.522887],[125.403304,58.523534],[125.40273,58.52397],[125.402224,58.524242],[125.399569,58.525421],[125.396807,58.526594],[125.396088,58.526934],[125.395369,58.527326],[125.393858,58.528264],[125.386856,58.532625],[125.386114,58.533131],[125.385738,58.533454],[125.383655,58.535363],[125.383333,58.535724],[125.382981,58.536236],[125.382638,58.536714],[125.381683,58.538051],[125.380878,58.539262],[125.380105,58.540378],[125.379601,58.541106],[125.37843,58.542788],[125.377404,58.544292],[125.376902,58.544977],[125.37634,58.545805],[125.375717,58.54675],[125.375604,58.546922],[125.37541,58.547305],[125.375368,58.547387],[125.375179,58.547953],[125.375066,58.548511],[125.374981,58.548934],[125.374961,58.549305],[125.375049,58.549938],[125.375102,58.550282],[125.375274,58.55141],[125.375656,58.553634],[125.375871,58.554999],[125.375955,58.55585],[125.376232,58.563188],[125.376354,58.566406],[125.376456,58.568572],[125.376471,58.569326],[125.376523,58.570738],[125.37701,58.576227],[125.377171,58.578049],[125.377307,58.579623],[125.377478,58.5804],[125.377749,58.581129],[125.377772,58.581177],[125.377996,58.581641],[125.378842,58.583228],[125.379288,58.584047],[125.379326,58.584116],[125.379525,58.58448],[125.379732,58.584774],[125.37979,58.584856],[125.37998,58.585109],[125.380242,58.585345],[125.380635,58.585654],[125.380864,58.585799],[125.381066,58.585927],[125.381291,58.586059],[125.381653,58.586272],[125.382303,58.586579],[125.382601,58.586693],[125.382759,58.586748],[125.382904,58.586799],[125.383403,58.586975],[125.383588,58.587046],[125.384562,58.587385],[125.38543,58.587691],[125.386239,58.588041],[125.389546,58.589685],[125.394494,58.592146],[125.394851,58.592324],[125.396157,58.592969],[125.397073,58.593512],[125.3978,58.593992],[125.398403,58.594569],[125.398812,58.594989],[125.398951,58.595131],[125.399179,58.59537],[125.399419,58.595587],[125.400011,58.596076],[125.400629,58.596486],[125.401317,58.596933],[125.402032,58.597304],[125.402302,58.59744],[125.402748,58.597664],[125.403503,58.597979],[125.404878,58.598551],[125.405973,58.599008],[125.409561,58.600511],[125.414777,58.60265],[125.4187,58.604284],[125.42309,58.606093],[125.424106,58.606592],[125.425175,58.607383],[125.425689,58.607764],[125.426234,58.608403],[125.426813,58.610298],[125.426643,58.611236],[125.426036,58.612291],[125.424813,58.61363],[125.423845,58.614716],[125.423596,58.614997],[125.42163,58.617204],[125.419771,58.619307],[125.418357,58.620548],[125.417197,58.621468],[125.413786,58.623396],[125.410428,58.625088],[125.408685,58.625956],[125.405041,58.627774],[125.403818,58.628282],[125.403766,58.628319],[125.403413,58.628496],[125.403289,58.628585],[125.402611,58.628969],[125.402412,58.629119],[125.402694,58.629539],[125.403334,58.630794],[125.403705,58.63152],[125.403947,58.631994],[125.404097,58.632287],[125.404258,58.632618],[125.404375,58.63286],[125.404459,58.633032],[125.404539,58.633153],[125.404902,58.633794],[125.405285,58.634312],[125.405571,58.634699],[125.405637,58.634789],[125.407249,58.636972],[125.407515,58.63736],[125.407643,58.637523],[125.407734,58.63776],[125.407933,58.638883],[125.407963,58.639134],[125.408046,58.640137],[125.407858,58.640601],[125.407594,58.641121],[125.407267,58.641766],[125.407157,58.641983],[125.406713,58.64269],[125.405653,58.64419],[125.405508,58.64439],[125.404427,58.645911],[125.403625,58.647006],[125.403357,58.647372],[125.403161,58.64762],[125.402955,58.64787],[125.401966,58.649215],[125.401693,58.649586],[125.401555,58.64977],[125.401421,58.649947],[125.401259,58.65015],[125.400747,58.650847],[125.400658,58.650967],[125.400526,58.651181],[125.400503,58.651219],[125.400401,58.651392],[125.400323,58.651565],[125.400234,58.651796],[125.400085,58.652385],[125.4001,58.653015],[125.400123,58.653997],[125.400167,58.654691],[125.40039,58.655417],[125.400943,58.656871],[125.401444,58.658187],[125.402212,58.660208],[125.403894,58.664857],[125.404999,58.667981],[125.405545,58.669],[125.405821,58.669508],[125.406192,58.670009],[125.407601,58.671363],[125.408895,58.672525],[125.413882,58.677001],[125.415538,58.678495],[125.424274,58.686372],[125.424778,58.686888],[125.424922,58.687065],[125.42503,58.6872],[125.425193,58.687401],[125.425679,58.688259],[125.425807,58.688634],[125.425835,58.688713],[125.425873,58.688972],[125.425868,58.689187],[125.42579,58.690193],[125.425391,58.695452],[125.425364,58.695782],[125.425318,58.696011],[125.425242,58.696211],[125.424575,58.697093],[125.422692,58.699537],[125.421952,58.700435],[125.420627,58.702169],[125.420248,58.702833],[125.419977,58.703308],[125.419738,58.703732],[125.419312,58.704506],[125.418837,58.705308],[125.418609,58.705693],[125.417853,58.707036],[125.417209,58.708145],[125.416689,58.70917],[125.416437,58.709694],[125.416254,58.710199],[125.416142,58.710556],[125.416024,58.710934],[125.415927,58.711316],[125.415852,58.711683],[125.415722,58.712355],[125.415675,58.712695],[125.415649,58.71302],[125.415642,58.7137],[125.415669,58.714398],[125.415717,58.715032],[125.415729,58.715159],[125.415747,58.715541],[125.41578,58.71592],[125.415878,58.716798],[125.415959,58.717191],[125.416045,58.71752],[125.41625,58.717974],[125.416636,58.718649],[125.416913,58.719066],[125.417144,58.719444],[125.417351,58.719714],[125.417804,58.720181],[125.418443,58.720711],[125.418786,58.720984],[125.419122,58.721246],[125.420274,58.72209],[125.421088,58.722671],[125.421508,58.722964],[125.421932,58.723255],[125.425229,58.725585],[125.426633,58.726595],[125.429547,58.728691],[125.433222,58.731334],[125.433582,58.73156],[125.433935,58.731785],[125.435671,58.732803],[125.436552,58.73334],[125.439846,58.735308],[125.440251,58.73556],[125.440637,58.735836],[125.440805,58.736063],[125.440885,58.736294],[125.441209,58.737517],[125.441375,58.737944],[125.442825,58.739558],[125.443214,58.739939],[125.443659,58.740303],[125.444653,58.741032],[125.445306,58.741507],[125.445472,58.741627],[125.446138,58.742106],[125.446943,58.742713],[125.447849,58.743351],[125.44897,58.744194],[125.449748,58.744742],[125.450333,58.745232],[125.45096,58.746106],[125.451599,58.746949],[125.451899,58.74725],[125.452323,58.747545],[125.453176,58.748099],[125.454099,58.748633],[125.455016,58.749265],[125.455558,58.749641],[125.455992,58.750041],[125.456759,58.750854],[125.457827,58.751834],[125.460091,58.753473],[125.46059,58.753834],[125.462789,58.755404],[125.463599,58.755818],[125.464704,58.756272],[125.465155,58.756386],[125.465638,58.756475],[125.466128,58.756559],[125.467494,58.756792],[125.46974,58.757167],[125.470991,58.757376],[125.472477,58.757599],[125.473952,58.757872],[125.474945,58.758008],[125.475959,58.758105],[125.477199,58.758196],[125.477524,58.75822],[125.477745,58.758236],[125.478985,58.758318],[125.479816,58.758387],[125.480953,58.758481],[125.481437,58.758544],[125.482097,58.758639],[125.482538,58.758731],[125.482928,58.758864],[125.483167,58.758949],[125.48434,58.759363],[125.484419,58.759391],[125.485091,58.759639],[125.486374,58.760111],[125.487527,58.760535],[125.487835,58.760649],[125.488283,58.760835],[125.488857,58.761075],[125.489564,58.761369],[125.490057,58.761671],[125.49047,58.762025],[125.490861,58.762467],[125.491085,58.762721],[125.491332,58.763175],[125.491442,58.763416],[125.491654,58.763893],[125.491891,58.764672],[125.49205,58.766443],[125.492064,58.766906],[125.492094,58.767815],[125.492098,58.76796],[125.49212,58.768525],[125.492272,58.771335],[125.492335,58.772973],[125.492367,58.773395],[125.49237,58.773839],[125.492444,58.775136],[125.492627,58.775624],[125.493209,58.776442],[125.493698,58.777037],[125.494211,58.777603],[125.495418,58.778552],[125.495694,58.778733],[125.495959,58.778907],[125.496122,58.779014],[125.496636,58.779294],[125.497822,58.779737],[125.499529,58.780356],[125.500059,58.780548],[125.502384,58.781324],[125.503196,58.78161],[125.503508,58.781747],[125.503839,58.781975],[125.503957,58.782085],[125.505008,58.783275],[125.50524,58.783549],[125.505366,58.783698],[125.505828,58.784252],[125.506193,58.784689],[125.508016,58.786854],[125.508026,58.786866],[125.50942,58.788441],[125.511247,58.790433],[125.51298,58.79245],[125.514248,58.793896],[125.51563,58.795441],[125.516939,58.796254],[125.51778,58.796684],[125.519394,58.797363],[125.521963,58.798301],[125.523469,58.798775],[125.524147,58.798939],[125.525261,58.799135],[125.525776,58.799189],[125.526356,58.799248],[125.527265,58.799275],[125.528168,58.799256],[125.529239,58.799196],[125.530571,58.799025],[125.530787,58.798996],[125.532328,58.79877],[125.534122,58.798507],[125.536043,58.798225],[125.540364,58.797591],[125.542199,58.797321],[125.54271,58.797246],[125.544593,58.796902],[125.545755,58.796605],[125.54628,58.796471],[125.547763,58.79599],[125.548312,58.795778],[125.549054,58.795492],[125.550052,58.795016],[125.552117,58.794031],[125.553228,58.793483],[125.555041,58.792674],[125.55642,58.792237],[125.557976,58.791905],[125.559235,58.791734],[125.560608,58.791645],[125.561699,58.791647],[125.56221,58.791648],[125.563009,58.791692],[125.565803,58.792065],[125.567992,58.792349],[125.573197,58.793042],[125.573826,58.793122],[125.574233,58.793198],[125.574616,58.793281],[125.575089,58.793402],[125.575883,58.793684],[125.576551,58.793974],[125.577307,58.794329],[125.582701,58.797481],[125.585134,58.798894],[125.585716,58.799325],[125.586441,58.800192],[125.588071,58.80236],[125.589425,58.804163],[125.589923,58.804785],[125.590784,58.805516],[125.594169,58.807916],[125.594742,58.80832],[125.595292,58.808579],[125.596336,58.808853],[125.59724,58.809043],[125.59939,58.809495],[125.600187,58.809718],[125.600749,58.809969],[125.601291,58.810252],[125.602672,58.811251],[125.606332,58.813841],[125.606866,58.814281],[125.607961,58.815588],[125.609115,58.81644],[125.613201,58.819398],[125.614506,58.82034],[125.621379,58.82537],[125.628479,58.830607],[125.643407,58.841679],[125.645571,58.843298],[125.648096,58.845203],[125.64895,58.845844],[125.649671,58.846369],[125.651023,58.847354],[125.652739,58.848627],[125.653533,58.849206],[125.654374,58.849683],[125.655366,58.850049],[125.662157,58.852463],[125.672676,58.856252],[125.681577,58.859443],[125.69176,58.86312],[125.694616,58.863957],[125.697011,58.864619],[125.699029,58.865177],[125.704465,58.866713],[125.718754,58.870702],[125.73718,58.87589],[125.744419,58.877982],[125.760384,58.882597],[125.777765,58.887715],[125.784531,58.889739],[125.788713,58.891002],[125.791315,58.891734],[125.791464,58.891776],[125.799516,58.893982],[125.801066,58.894433],[125.80692,58.896006],[125.80801,58.89635],[125.809669,58.897223],[125.810999,58.898164],[125.813025,58.899654],[125.815065,58.90085],[125.815904,58.901408],[125.816169,58.901525],[125.816499,58.901642],[125.81687,58.901751],[125.817126,58.901827],[125.817303,58.901879],[125.81773,58.901961],[125.818324,58.902034],[125.818793,58.902078],[125.819251,58.90211],[125.819685,58.902123],[125.820158,58.902114],[125.820635,58.902089],[125.820985,58.902056],[125.822748,58.901832],[125.827772,58.90123],[125.830093,58.900957],[125.831727,58.900709],[125.833289,58.900344],[125.833906,58.900191],[125.834155,58.900129],[125.834613,58.900015],[125.835149,58.899909],[125.835669,58.899814],[125.836462,58.899797],[125.836617,58.899794],[125.836798,58.89979],[125.838305,58.899758],[125.842445,58.89967],[125.845853,58.899581],[125.851974,58.899426],[125.856697,58.899191],[125.859945,58.899043],[125.86003,58.899039],[125.861034,58.898994],[125.863151,58.898891],[125.867088,58.898712],[125.868366,58.89865],[125.868653,58.898635],[125.870654,58.898526],[125.877194,58.898206],[125.881959,58.897933],[125.88309,58.897938],[125.8843,58.897982],[125.885468,58.898057],[125.889304,58.898397],[125.894423,58.898879],[125.897531,58.899158],[125.899515,58.899306],[125.900618,58.899366],[125.905634,58.899633],[125.907531,58.899754],[125.910583,58.900047],[125.916098,58.901094],[125.91715,58.901294],[125.922924,58.902966],[125.926966,58.904182],[125.927043,58.904205],[125.929072,58.904843],[125.930103,58.905139],[125.930731,58.905305],[125.931355,58.905423],[125.938203,58.906499],[125.941883,58.907065],[125.946286,58.907766],[125.950006,58.908352],[125.950953,58.908523],[125.952001,58.908767],[125.953524,58.909197],[125.958143,58.910726],[125.963579,58.91256],[125.965258,58.913047],[125.968342,58.913646],[125.970418,58.91402],[125.973219,58.914552],[125.974882,58.914931],[125.980814,58.916616],[125.982269,58.916976],[125.983116,58.917054],[125.984256,58.917084],[125.985619,58.91709],[125.997528,58.916736],[126.021123,58.916045],[126.024471,58.915865],[126.027086,58.915123],[126.033563,58.912348],[126.035519,58.911547],[126.035561,58.91153],[126.036998,58.911071],[126.038508,58.910857],[126.039974,58.910781],[126.048229,58.910575],[126.04932,58.910466],[126.054687,58.909691],[126.062329,58.90859],[126.063451,58.908495],[126.065231,58.908437],[126.067174,58.908545],[126.071873,58.908842],[126.073719,58.90907],[126.074588,58.909228],[126.075362,58.909399],[126.076051,58.90959],[126.07654,58.909773],[126.080189,58.91177],[126.083228,58.913536],[126.085755,58.914951],[126.086328,58.915219],[126.087443,58.915551],[126.090934,58.916166],[126.093453,58.916597],[126.095813,58.917005],[126.100563,58.917826],[126.101742,58.918024],[126.103744,58.918356],[126.10851,58.919156],[126.112402,58.919543],[126.12084,58.920185],[126.122433,58.920453],[126.12446,58.920761],[126.125447,58.920844],[126.126529,58.920866],[126.13128,58.920928],[126.135964,58.921091],[126.140864,58.921289],[126.146855,58.921557],[126.150985,58.921715],[126.154315,58.92193],[126.156699,58.922339],[126.158777,58.922682],[126.167342,58.924193],[126.170168,58.924726],[126.173708,58.925335],[126.175229,58.925494],[126.17788,58.925621],[126.179589,58.925702],[126.179724,58.92571],[126.180507,58.925753],[126.181183,58.92579],[126.182034,58.925837],[126.182794,58.925924],[126.183622,58.9261],[126.184294,58.92629],[126.184865,58.92659],[126.186491,58.927878],[126.189163,58.930078],[126.19242,58.93274],[126.19566,58.935402],[126.19859,58.93783],[126.203144,58.941542],[126.203529,58.941929],[126.204041,58.942531],[126.204427,58.943072],[126.205317,58.944316],[126.208904,58.949334],[126.214255,58.956619],[126.214435,58.956836],[126.214674,58.957122],[126.215254,58.957645],[126.21628,58.95831],[126.216826,58.958578],[126.217179,58.958752],[126.217978,58.959037],[126.218885,58.959319],[126.219773,58.959635],[126.220331,58.959891],[126.22086,58.960133],[126.221795,58.960587],[126.223351,58.961544],[126.229334,58.965226],[126.229348,58.965234],[126.230814,58.966136],[126.230847,58.966157],[126.234568,58.968446],[126.234718,58.968538],[126.235075,58.968758],[126.2354,58.968958],[126.235542,58.969046],[126.236271,58.969494],[126.236774,58.969804],[126.237016,58.969952],[126.238387,58.970779],[126.238648,58.970937],[126.23911,58.971219],[126.239488,58.97145],[126.239693,58.971575],[126.24084,58.972276],[126.242209,58.973159],[126.24304,58.973694],[126.243295,58.973858],[126.243502,58.973973],[126.243907,58.974198],[126.244812,58.97465],[126.244928,58.974705],[126.24513,58.974789],[126.245281,58.974849],[126.245306,58.974859],[126.245828,58.975034],[126.246516,58.975227],[126.247513,58.975421],[126.248338,58.975532],[126.249218,58.975576],[126.250055,58.975576],[126.250913,58.975487],[126.251643,58.975377],[126.252142,58.975264],[126.25298,58.975031],[126.253704,58.974782],[126.254323,58.974483],[126.254824,58.974154],[126.255327,58.973789],[126.255765,58.973351],[126.255945,58.973118],[126.255979,58.973073],[126.256112,58.972889],[126.256507,58.972352],[126.257576,58.970834],[126.258422,58.969632],[126.258524,58.969488],[126.259211,58.96857],[126.259983,58.967729],[126.260336,58.967413],[126.260627,58.967154],[126.261228,58.966766],[126.261872,58.966401],[126.262558,58.966058],[126.263552,58.965698],[126.264431,58.965433],[126.265062,58.965277],[126.265504,58.965167],[126.266663,58.964924],[126.267736,58.964758],[126.268916,58.964625],[126.269581,58.964578],[126.270268,58.964559],[126.271513,58.96457],[126.273251,58.964614],[126.27471,58.96467],[126.278583,58.964821],[126.288053,58.965165],[126.297519,58.96551],[126.298721,58.965555],[126.299597,58.965589],[126.299837,58.965599],[126.299977,58.965612],[126.300867,58.965698],[126.301296,58.965752],[126.302628,58.96594],[126.302961,58.965987],[126.303523,58.966081],[126.303787,58.966127],[126.304079,58.966186],[126.305103,58.966418],[126.305544,58.966536],[126.306042,58.966677],[126.306982,58.966993],[126.318094,58.971251],[126.319148,58.971642],[126.319891,58.971961],[126.320593,58.972315],[126.321579,58.972911],[126.322635,58.97359],[126.323676,58.97426],[126.324341,58.974802],[126.324878,58.975322],[126.325452,58.97602],[126.325987,58.976635],[126.326292,58.977039],[126.327066,58.977865],[126.327474,58.978352],[126.32783,58.978794],[126.32831,58.979174],[126.328868,58.979614],[126.329669,58.980112],[126.330235,58.980431],[126.330757,58.980725],[126.333366,58.982097],[126.334296,58.982591],[126.335309,58.983292],[126.335969,58.983973],[126.336399,58.98454],[126.336752,58.985141],[126.33693,58.985643],[126.336981,58.986209],[126.337009,58.986718],[126.336902,58.987341],[126.336658,58.988082],[126.336422,58.988812],[126.336358,58.989486],[126.336215,58.990079],[126.336251,58.990621],[126.336373,58.991233],[126.33639,58.991326],[126.336669,58.991905],[126.337041,58.9925],[126.33747,58.992991],[126.338074,58.993592],[126.338589,58.993941],[126.339147,58.994394],[126.339898,58.994825],[126.340692,58.995245],[126.341572,58.995621],[126.342645,58.996063],[126.343846,58.99656],[126.358202,59.002042],[126.362581,59.003788],[126.376291,59.009131],[126.377933,59.009811],[126.379646,59.010538],[126.380797,59.011075],[126.381952,59.011646],[126.383202,59.012301],[126.384236,59.012876],[126.385063,59.013309],[126.386597,59.014378],[126.387539,59.015142],[126.388376,59.015864],[126.389421,59.016838],[126.390366,59.017728],[126.39164,59.018948],[126.392962,59.020203],[126.393637,59.020802],[126.394439,59.021443],[126.395192,59.022015],[126.39596,59.022562],[126.396569,59.022959],[126.397415,59.023457],[126.398236,59.023914],[126.399511,59.02456],[126.401614,59.02551],[126.403342,59.026316],[126.407128,59.028008],[126.411546,59.030004],[126.416213,59.032077],[126.417562,59.032671],[126.418597,59.033034],[126.419315,59.033273],[126.420183,59.033497],[126.421022,59.033642],[126.42203,59.033767],[126.422966,59.033822],[126.423893,59.033853],[126.424825,59.033856],[126.425742,59.033806],[126.426566,59.033743],[126.427445,59.033633],[126.42839,59.033478],[126.432611,59.032805],[126.433361,59.032682],[126.436501,59.032164],[126.447787,59.030376],[126.449718,59.030066],[126.451328,59.029812],[126.45268,59.029592],[126.453838,59.029459],[126.455126,59.029371],[126.456478,59.029327],[126.457808,59.029349],[126.459203,59.029393],[126.460619,59.029481],[126.461992,59.029636],[126.463516,59.029868],[126.464951,59.030187],[126.466272,59.030502],[126.467614,59.03085],[126.46879,59.0312],[126.470253,59.03172],[126.471431,59.032159],[126.472538,59.032663],[126.473254,59.033077],[126.474207,59.033697],[126.47494,59.034241],[126.475544,59.034755],[126.476026,59.035246],[126.476583,59.035875],[126.478892,59.038471],[126.481995,59.041916],[126.482937,59.042913],[126.483551,59.043616],[126.485607,59.04559],[126.4886,59.048407],[126.495083,59.054563],[126.496351,59.055761],[126.497228,59.056506],[126.4983,59.057411],[126.502446,59.060951],[126.50724,59.064994],[126.508319,59.065892],[126.508953,59.066321],[126.509668,59.06673],[126.510524,59.067146],[126.514369,59.068735],[126.515402,59.069228],[126.516014,59.069631],[126.516543,59.070038],[126.517273,59.070681],[126.518568,59.071934],[126.523844,59.076886],[126.526894,59.079646],[126.530024,59.082616],[126.533504,59.085876],[126.536224,59.088466],[126.540624,59.092636],[126.546334,59.098066],[126.547944,59.099646],[126.549984,59.101536],[126.552474,59.103966],[126.554164,59.106256],[126.556034,59.109586],[126.558074,59.113106],[126.559874,59.116176],[126.560675,59.117574],[126.561874,59.120266],[126.562304,59.122096],[126.563374,59.128686],[126.563784,59.130866],[126.564305,59.1341],[126.564384,59.134586],[126.564764,59.136856],[126.565194,59.139216],[126.565454,59.140886],[126.565944,59.143576],[126.566784,59.148466],[126.566875,59.149073],[126.567214,59.151336],[126.568114,59.156036],[126.568604,59.159026],[126.569204,59.162436],[126.569634,59.164236],[126.570434,59.166126],[126.571824,59.167846],[126.573564,59.169326],[126.575814,59.171206],[126.578841,59.173581],[126.58117,59.175404],[126.581664,59.175723],[126.582614,59.176236],[126.583372,59.176567],[126.584151,59.176857],[126.585075,59.177119],[126.588975,59.178175],[126.589797,59.178476],[126.590401,59.178758],[126.591036,59.179074],[126.591585,59.179403],[126.592032,59.179731],[126.592309,59.179988],[126.592581,59.180302],[126.593262,59.181367],[126.594429,59.183272],[126.595485,59.185057],[126.596396,59.186497],[126.597018,59.187195],[126.598057,59.188154],[126.600691,59.190083],[126.603215,59.19168],[126.605416,59.19311],[126.606423,59.193709],[126.607306,59.194233],[126.610239,59.19575],[126.610808,59.196076],[126.611223,59.196558],[126.611426,59.196986],[126.610957,59.198876],[126.610915,59.199341],[126.610977,59.19976],[126.611161,59.200173],[126.611423,59.20062],[126.611761,59.20104],[126.612139,59.201414],[126.612594,59.20172],[126.61305,59.20204],[126.613737,59.202426],[126.618446,59.204323],[126.621108,59.205483],[126.624712,59.20702],[126.62962,59.209196],[126.631886,59.210137],[126.63232,59.210303],[126.632662,59.210367],[126.633046,59.210413],[126.633423,59.210427],[126.634209,59.210406],[126.634946,59.210392],[126.635391,59.210418],[126.636492,59.210548],[126.637787,59.210687],[126.638053,59.210719],[126.6386,59.210729],[126.639012,59.210695],[126.63943,59.210637],[126.639955,59.210555],[126.640606,59.210426],[126.64259,59.209899],[126.643145,59.209782],[126.643848,59.209675],[126.644522,59.209627],[126.64516,59.209589],[126.645645,59.209602],[126.646238,59.209634],[126.646665,59.209701],[126.647054,59.209771],[126.647554,59.209888],[126.648123,59.210022],[126.6489,59.210293],[126.650299,59.210997],[126.652635,59.212178],[126.652724,59.212224],[126.653895,59.212781],[126.656602,59.2141],[126.660336,59.215879],[126.662167,59.216738],[126.66282,59.217049],[126.666346,59.218549],[126.6674,59.21907],[126.667871,59.219365],[126.668318,59.219667],[126.668681,59.219947],[126.669097,59.220377],[126.669568,59.220991],[126.66984,59.22155],[126.670021,59.222125],[126.670076,59.222571],[126.670069,59.223014],[126.669993,59.223612],[126.670077,59.22391],[126.670346,59.224281],[126.672414,59.225863],[126.673399,59.226606],[126.674714,59.227164],[126.67921,59.228881],[126.684489,59.230938],[126.686261,59.231622],[126.686762,59.231788],[126.687168,59.231873],[126.687613,59.231908],[126.688035,59.231878],[126.688334,59.231841],[126.688684,59.231781],[126.689043,59.231738],[126.689373,59.231707],[126.689723,59.231711],[126.690097,59.231776],[126.690619,59.231902],[126.69208,59.232516],[126.694412,59.23357],[126.698434,59.23531],[126.700306,59.23614],[126.70382,59.237666],[126.71044,59.240576],[126.717804,59.243846],[126.7219,59.245609],[126.725739,59.247313],[126.729473,59.248953],[126.736704,59.252099],[126.739863,59.253528],[126.740124,59.253646],[126.741199,59.254014],[126.74263,59.254424],[126.74413,59.254654],[126.745535,59.254746],[126.746993,59.254787],[126.748627,59.254711],[126.759829,59.25403],[126.761814,59.253956],[126.762813,59.254004],[126.764144,59.254204],[126.764826,59.254301],[126.765429,59.254419],[126.766188,59.254626],[126.76737,59.254968],[126.768119,59.255217],[126.768936,59.25558],[126.769971,59.256208],[126.773544,59.258897],[126.775551,59.260377],[126.781002,59.264396],[126.785094,59.267296],[126.791834,59.272296],[126.794624,59.274396],[126.796575,59.275773],[126.797663,59.276377],[126.79875,59.2768],[126.800069,59.277154],[126.80139,59.277455],[126.802834,59.277659],[126.804209,59.277773],[126.809274,59.278184],[126.8134,59.278537],[126.818248,59.278936],[126.824697,59.279464],[126.828332,59.279786],[126.8296,59.279861],[126.831046,59.279971],[126.833267,59.280036],[126.834487,59.280027],[126.834627,59.280026],[126.836932,59.279978],[126.839964,59.279866],[126.841742,59.279752],[126.843353,59.279639],[126.845462,59.279487],[126.849624,59.279203],[126.855349,59.278808],[126.857641,59.278647],[126.85874,59.278618],[126.859458,59.27861],[126.860233,59.278638],[126.861017,59.27869],[126.861725,59.278764],[126.862529,59.278872],[126.863353,59.279008],[126.86415,59.279159],[126.864984,59.279361],[126.865898,59.279584],[126.866659,59.279816],[126.867574,59.280114],[126.868539,59.280391],[126.869443,59.280711],[126.870419,59.281124],[126.871311,59.28153],[126.873414,59.282641],[126.874702,59.283362],[126.875859,59.284091],[126.877254,59.285126],[126.878134,59.285876],[126.878864,59.286656],[126.87963,59.287547],[126.879914,59.287876],[126.882293,59.291359],[126.883377,59.292929],[126.884074,59.293974],[126.884531,59.294661],[126.885115,59.295416],[126.885729,59.296052],[126.886281,59.296556],[126.887016,59.297049],[126.888468,59.297843],[126.891666,59.299582],[126.896642,59.302265],[126.897863,59.302943],[126.899164,59.303686],[126.901581,59.305],[126.904176,59.306345],[126.905102,59.30688],[126.906346,59.308225],[126.907844,59.30995],[126.909634,59.312036],[126.911784,59.314486],[126.914594,59.317596],[126.915324,59.318456],[126.916304,59.319526],[126.921054,59.325066],[126.925684,59.330336],[126.927084,59.331866],[126.928344,59.333366],[126.930144,59.335366],[126.931304,59.336776],[126.931774,59.337286],[126.932269,59.337721],[126.932739,59.337979],[126.935044,59.339306],[126.937433,59.34079],[126.937515,59.340836],[126.939764,59.342116],[126.942239,59.343646],[126.943234,59.344246],[126.944654,59.345126],[126.947184,59.346666],[126.950172,59.348454],[126.952534,59.34986],[126.954162,59.350842],[126.95633,59.352111],[126.957406,59.35278],[126.958181,59.353298],[126.958871,59.353861],[126.959494,59.354529],[126.962204,59.357842],[126.963661,59.359564],[126.964497,59.36039],[126.965731,59.361406],[126.967312,59.362708],[126.969114,59.364163],[126.970762,59.365532],[126.973348,59.367617],[126.974168,59.368147],[126.977825,59.370457],[126.98027,59.372007],[126.983626,59.374161],[126.986235,59.375781],[126.986749,59.376106],[126.988518,59.377257],[126.991095,59.378846],[126.992207,59.379532],[126.993024,59.380036],[126.995614,59.381756],[126.998324,59.383483],[126.998844,59.383902],[126.999333,59.384419],[126.99981,59.385335],[127.000298,59.386648],[127.001174,59.388876],[127.002546,59.392615],[127.004871,59.398737],[127.005289,59.399834],[127.005689,59.40082],[127.005874,59.401276],[127.006604,59.403336],[127.008404,59.408086],[127.009114,59.409846],[127.00949,59.410678],[127.009689,59.411305],[127.010021,59.412185],[127.010363,59.413579],[127.010498,59.414738],[127.010379,59.417548],[127.010361,59.420521],[127.010362,59.420579],[127.010336,59.422264],[127.01033,59.424168],[127.010321,59.42594],[127.01049,59.427936],[127.010717,59.42885],[127.01127,59.431151],[127.01187,59.433293],[127.012504,59.435716],[127.013066,59.437495],[127.013808,59.439308],[127.014285,59.440258],[127.014765,59.4413],[127.01525,59.442281],[127.015715,59.443312],[127.016144,59.44428],[127.016472,59.445008],[127.01683,59.445705],[127.017195,59.44653],[127.018091,59.448245],[127.018697,59.449254],[127.019729,59.450745],[127.020618,59.451804],[127.020665,59.451857],[127.021742,59.452946],[127.023263,59.454331],[127.023566,59.45462],[127.024414,59.455315],[127.025257,59.455969],[127.026509,59.456849],[127.028214,59.458096],[127.034607,59.462617],[127.035083,59.462982],[127.036834,59.464256],[127.037204,59.464547],[127.037591,59.464851],[127.038345,59.46564],[127.038973,59.46653],[127.039338,59.46727],[127.039469,59.467727],[127.039559,59.470195],[127.039095,59.472437],[127.038466,59.474813],[127.037109,59.480086],[127.03708,59.480809],[127.037496,59.483686],[127.038252,59.488475],[127.038724,59.491257],[127.039113,59.493816],[127.039529,59.49652],[127.040114,59.500156],[127.040244,59.501494],[127.040224,59.502856],[127.039944,59.504596],[127.039554,59.505918],[127.039419,59.506542],[127.039148,59.507626],[127.038304,59.511529],[127.038229,59.511796],[127.038148,59.512153],[127.03804,59.512537],[127.037675,59.5142],[127.037459,59.51541],[127.037115,59.517497],[127.036914,59.518469],[127.036774,59.519296],[127.036604,59.520006],[127.036324,59.520987],[127.035617,59.523443],[127.035118,59.524739],[127.034644,59.526036],[127.034194,59.527196],[127.033764,59.528376],[127.033294,59.529536],[127.032454,59.531746],[127.031898,59.533294],[127.031044,59.535566],[127.030006,59.538403],[127.029338,59.540198],[127.029204,59.540757],[127.029168,59.541199],[127.0292,59.541712],[127.029351,59.542145],[127.029631,59.542789],[127.030045,59.543353],[127.030874,59.544486],[127.031964,59.545836],[127.032484,59.546546],[127.033104,59.547446],[127.033724,59.548176],[127.034304,59.548926],[127.035034,59.549916],[127.035634,59.551036],[127.03627,59.552138],[127.037193,59.553939],[127.03781,59.555252],[127.038251,59.555898],[127.038673,59.556343],[127.038961,59.556664],[127.040358,59.557758],[127.042264,59.559296],[127.04307,59.560004],[127.043764,59.560602],[127.044194,59.561006],[127.044784,59.561702],[127.045044,59.562061],[127.045398,59.562697],[127.045584,59.563227],[127.045669,59.563624],[127.045848,59.565606],[127.046033,59.567351],[127.046155,59.568314],[127.046338,59.568827],[127.046761,59.569659],[127.047329,59.570625],[127.047843,59.57152],[127.048925,59.573333],[127.049579,59.574464],[127.04995,59.575028],[127.050544,59.575858],[127.05164,59.577188],[127.052585,59.578231],[127.053704,59.579486],[127.055064,59.580964],[127.05594,59.581942],[127.056437,59.582529],[127.056814,59.583054],[127.057643,59.584486],[127.058589,59.586168],[127.059214,59.587256],[127.060394,59.589356],[127.061324,59.590946],[127.062503,59.59305],[127.063848,59.595451],[127.064716,59.596961],[127.065833,59.598951],[127.066843,59.600726],[127.067792,59.602376],[127.068708,59.603789],[127.069325,59.604639],[127.07131,59.606894],[127.074514,59.610496],[127.075797,59.611931],[127.076601,59.612826],[127.080654,59.617336],[127.081761,59.618514],[127.082739,59.619249],[127.083297,59.619668],[127.084723,59.620526],[127.086343,59.621582],[127.089042,59.623311],[127.091129,59.624672],[127.093294,59.626066],[127.095691,59.627619],[127.096989,59.628472],[127.098088,59.629138],[127.099482,59.630114],[127.100017,59.630526],[127.101351,59.632074],[127.101676,59.632613],[127.101881,59.633222],[127.10191,59.633697],[127.101781,59.634205],[127.101564,59.634659],[127.101326,59.635015],[127.100952,59.635376],[127.100478,59.635727],[127.099813,59.636102],[127.098918,59.636476],[127.097692,59.636849],[127.095286,59.637501],[127.094167,59.637829],[127.093029,59.638257],[127.092153,59.638836],[127.091643,59.639218],[127.091236,59.639723],[127.091004,59.640258],[127.090892,59.640748],[127.09085,59.64151],[127.090884,59.642636],[127.09088,59.643762],[127.090889,59.64496],[127.090884,59.646112],[127.091009,59.646865],[127.091156,59.64731],[127.091408,59.647842],[127.091699,59.648204],[127.092068,59.648583],[127.092458,59.648931],[127.092802,59.6492],[127.093135,59.649443],[127.093317,59.64955],[127.093795,59.649831],[127.094487,59.650201],[127.095473,59.650622],[127.096345,59.650875],[127.097364,59.651137],[127.098834,59.651381],[127.100085,59.651515],[127.101184,59.651577],[127.102266,59.651548],[127.103712,59.65144],[127.105249,59.651243],[127.106645,59.650913],[127.107849,59.650615],[127.110414,59.649931],[127.113459,59.649119],[127.114651,59.648811],[127.116671,59.648385],[127.119644,59.647786],[127.122254,59.647266],[127.123643,59.647001],[127.124815,59.646798],[127.125056,59.646767],[127.125857,59.646664],[127.127195,59.646554],[127.128249,59.646502],[127.128538,59.646495],[127.13057,59.646397],[127.132051,59.646372],[127.133027,59.64637],[127.134336,59.646435],[127.136257,59.646619],[127.137185,59.646776],[127.138016,59.646928],[127.139068,59.647196],[127.139422,59.647286],[127.140462,59.647595],[127.141353,59.647915],[127.142093,59.64824],[127.142737,59.648593],[127.143381,59.64895],[127.144142,59.649449],[127.145151,59.650196],[127.145666,59.650555],[127.146342,59.650983],[127.147264,59.651493],[127.148187,59.651932],[127.149399,59.652436],[127.150633,59.652859],[127.152496,59.653368],[127.153349,59.653609],[127.155884,59.654266],[127.158904,59.655016],[127.160774,59.655536],[127.162964,59.656086],[127.166727,59.65707],[127.170632,59.658073],[127.174301,59.659027],[127.177434,59.65984],[127.179794,59.660376],[127.18356,59.661005],[127.185244,59.661346],[127.186918,59.661802],[127.188109,59.662214],[127.189386,59.662707],[127.190888,59.663476],[127.191864,59.664078],[127.193688,59.665331],[127.195734,59.666796],[127.197604,59.668133],[127.198103,59.668567],[127.198656,59.669122],[127.199144,59.669694],[127.199508,59.670214],[127.199814,59.670756],[127.200254,59.671706],[127.200734,59.672846],[127.201359,59.674383],[127.202293,59.676701],[127.203312,59.679864],[127.204642,59.683948],[127.205651,59.687143],[127.207078,59.691469],[127.208,59.694285],[127.208741,59.696672],[127.20947,59.698875],[127.209771,59.699969],[127.209814,59.700483],[127.209846,59.701024],[127.209824,59.701495],[127.20961,59.702383],[127.208698,59.705668],[127.208258,59.707313],[127.207593,59.709711],[127.207035,59.7118],[127.206513,59.713881],[127.205776,59.71659],[127.205104,59.719009],[127.204244,59.722199],[127.203775,59.723894],[127.203003,59.726495],[127.202293,59.728981],[127.20122,59.732858],[127.20064,59.734837],[127.200479,59.735524],[127.20049,59.735957],[127.200512,59.736497],[127.200758,59.737352],[127.205111,59.748402],[127.206303,59.751645],[127.207972,59.756779],[127.20808,59.757814],[127.208313,59.761354],[127.208477,59.763834],[127.208685,59.768362],[127.208938,59.771976],[127.208961,59.772313],[127.209262,59.777369],[127.209338,59.777912],[127.209556,59.778263],[127.210669,59.779206],[127.211627,59.780022],[127.212249,59.780552],[127.212412,59.780898],[127.21242,59.781218],[127.212198,59.782601],[127.212016,59.783378],[127.211674,59.785306],[127.211564,59.785866],[127.21144,59.786627],[127.21124,59.787642],[127.210964,59.789666],[127.210774,59.790716],[127.210551,59.791859],[127.210448,59.792412],[127.210355,59.793173],[127.21022,59.794],[127.210014,59.794839],[127.209674,59.796446],[127.209634,59.797946],[127.209914,59.799746],[127.210345,59.801698],[127.210628,59.80334],[127.210373,59.804289],[127.209784,59.807256],[127.209631,59.807803],[127.209424,59.808546],[127.209294,59.809766],[127.209524,59.813486],[127.209874,59.816806],[127.209954,59.819576],[127.210004,59.820266],[127.210154,59.821466],[127.210214,59.822516],[127.210254,59.822706],[127.210364,59.824466],[127.210514,59.825776],[127.210682,59.826341],[127.211112,59.827786],[127.211599,59.828485],[127.212648,59.829114],[127.213917,59.829741],[127.213988,59.829773],[127.214869,59.830168],[127.215179,59.830307],[127.215803,59.830547],[127.218778,59.831657],[127.221134,59.83261],[127.222308,59.833128],[127.222769,59.833381],[127.223773,59.834008],[127.224462,59.834527],[127.224961,59.835116],[127.225183,59.835474],[127.225354,59.836004],[127.225668,59.83658],[127.225706,59.836649],[127.225811,59.838062],[127.225854,59.839616],[127.225924,59.841636],[127.226077,59.843357],[127.226159,59.844414],[127.225887,59.84511],[127.225117,59.846355],[127.224685,59.847184],[127.224114,59.848826],[127.224054,59.849256],[127.224054,59.849856],[127.224034,59.850366],[127.224138,59.851948],[127.224472,59.853992],[127.224726,59.855765],[127.224753,59.855953],[127.224869,59.856409],[127.225396,59.85752],[127.225418,59.85758],[127.22588,59.858607],[127.226105,59.859167],[127.226186,59.859385],[127.226347,59.860149],[127.226373,59.860611],[127.226266,59.863231],[127.226068,59.86502],[127.226003,59.865792],[127.225875,59.867336],[127.225832,59.867764],[127.225794,59.868178],[127.225692,59.868623],[127.225424,59.869299],[127.225024,59.870306],[127.224218,59.871866],[127.22419,59.871922],[127.223384,59.873516],[127.222971,59.874559],[127.222681,59.875671],[127.22173,59.879003],[127.220948,59.881746],[127.220214,59.884177],[127.219394,59.886656],[127.218344,59.889696],[127.217594,59.891886],[127.217364,59.892406],[127.217084,59.893326],[127.216524,59.894766],[127.216337,59.895306],[127.216026,59.895649],[127.215439,59.896111],[127.213324,59.897772],[127.213068,59.898164],[127.212774,59.899501],[127.212802,59.899882],[127.213437,59.901725],[127.213391,59.902082],[127.213123,59.902939],[127.212144,59.905966],[127.211504,59.908006],[127.210904,59.910016],[127.210304,59.911926],[127.210096,59.912673],[127.210094,59.912951],[127.210619,59.916744],[127.210899,59.918439],[127.211144,59.92021],[127.211525,59.922695],[127.211894,59.925135],[127.212254,59.926846],[127.212874,59.929136],[127.213207,59.930236],[127.214068,59.932949],[127.214653,59.93499],[127.21556,59.937675],[127.216501,59.939832],[127.217043,59.940714],[127.219386,59.942804],[127.222194,59.945307],[127.227194,59.949811],[127.22974,59.952095],[127.232135,59.95422],[127.233699,59.955672],[127.235699,59.957465],[127.237948,59.959463],[127.240207,59.961934],[127.243434,59.965746],[127.244504,59.967116],[127.246754,59.969614],[127.246774,59.970076],[127.246604,59.971556],[127.246474,59.972736],[127.246454,59.973196],[127.246284,59.974566],[127.246164,59.976385],[127.246123,59.976773],[127.246004,59.978106],[127.245986,59.978383],[127.246126,59.979035],[127.246564,59.980146],[127.247484,59.982206],[127.248214,59.984136],[127.249014,59.985826],[127.249764,59.987546],[127.250785,59.989987],[127.251203,59.991487],[127.251478,59.99271],[127.251868,59.994483],[127.252157,59.996044],[127.252062,60.001919],[127.252014,60.002679],[127.251812,60.00354],[127.250714,60.006331],[127.249274,60.009992],[127.248929,60.010887],[127.247892,60.013616],[127.245949,60.018511],[127.24571,60.019024],[127.245442,60.019477],[127.245161,60.019885],[127.242181,60.022725],[127.241573,60.023526],[127.240964,60.025062],[127.236085,60.044459],[127.23605,60.045621],[127.236373,60.046804],[127.236743,60.047473],[127.237808,60.048678],[127.238058,60.048914],[127.242955,60.054249],[127.246099,60.05755],[127.249548,60.061076],[127.25554,60.067383],[127.259434,60.071714],[127.264209,60.078153],[127.265024,60.079127],[127.265807,60.079855],[127.267878,60.081251],[127.270217,60.082562],[127.274274,60.084718],[127.276583,60.085833],[127.277881,60.086298],[127.279727,60.086789],[127.282179,60.087417],[127.283926,60.087911],[127.284717,60.088177],[127.285451,60.088497],[127.287062,60.089323],[127.29178,60.09226],[127.292432,60.092666],[127.298168,60.096276],[127.301766,60.098612],[127.303216,60.099498],[127.303885,60.099906],[127.304079,60.100025],[127.304759,60.10056],[127.305604,60.101282],[127.305937,60.101669],[127.306318,60.10251],[127.307642,60.107791],[127.310654,60.120694],[127.311443,60.123974],[127.313046,60.134579],[127.313572,60.137935],[127.314132,60.141563],[127.314516,60.145369],[127.314886,60.149954],[127.315037,60.150912],[127.315482,60.151748],[127.316683,60.153852],[127.320798,60.160969],[127.324773,60.167884],[127.328024,60.173597],[127.331178,60.179084],[127.333506,60.183176],[127.335582,60.186764],[127.336805,60.188831],[127.340068,60.19456],[127.340284,60.194873],[127.341068,60.195854],[127.34221,60.197053],[127.343281,60.198231],[127.343376,60.198327],[127.343988,60.198943],[127.344228,60.199178],[127.347658,60.202788],[127.348909,60.204138],[127.352886,60.208331],[127.353499,60.208991],[127.353908,60.209558],[127.35418,60.210078],[127.356488,60.21488],[127.360831,60.224441],[127.360977,60.224774],[127.363265,60.229743],[127.363723,60.230641],[127.364246,60.23141],[127.365194,60.232547],[127.368639,60.23666],[127.369315,60.237471],[127.370274,60.238402],[127.378755,60.246388],[127.379032,60.246645],[127.379549,60.247186],[127.379934,60.247626],[127.380164,60.247991],[127.380333,60.248312],[127.380767,60.249374],[127.384543,60.261234],[127.38493,60.262383],[127.385225,60.263224],[127.385616,60.263972],[127.386158,60.264786],[127.38758,60.266819],[127.388486,60.268053],[127.389173,60.268947],[127.39016,60.270083],[127.391356,60.27128],[127.392552,60.272435],[127.397772,60.277518],[127.407298,60.286822],[127.408441,60.287981],[127.409177,60.288726],[127.409821,60.289599],[127.411065,60.291449],[127.412825,60.294171],[127.416816,60.300359],[127.41879,60.303421],[127.420115,60.305551],[127.420549,60.306248],[127.421236,60.307077],[127.421794,60.307774],[127.422802,60.308603],[127.423589,60.309198],[127.424413,60.309801],[127.426952,60.311704],[127.427631,60.312316],[127.427679,60.312384],[127.427972,60.312971],[127.428061,60.313234],[127.428097,60.313505],[127.427881,60.314222],[127.427784,60.314591],[127.42752,60.315165],[127.427368,60.315594],[127.427317,60.315734],[127.427307,60.316125],[127.4273,60.316323],[127.427343,60.316585],[127.427451,60.316846],[127.42763,60.317093],[127.427988,60.317506],[127.428335,60.317876],[127.429058,60.318593],[127.42975,60.319164],[127.42981,60.319221],[127.430266,60.319642],[127.431402,60.320388],[127.434958,60.322178],[127.441439,60.325381],[127.449094,60.329171],[127.454196,60.331933],[127.456075,60.333077],[127.456764,60.333706],[127.459066,60.336677],[127.462174,60.340672],[127.462923,60.341557],[127.463451,60.342105],[127.464252,60.342817],[127.467889,60.345764],[127.468863,60.346533],[127.472767,60.349662],[127.478893,60.354581],[127.483326,60.357873],[127.484467,60.358597],[127.485097,60.35893],[127.486226,60.359326],[127.486499,60.359418],[127.487454,60.359713],[127.491149,60.360741],[127.491574,60.360859],[127.498312,60.362832],[127.499608,60.363291],[127.500912,60.363826],[127.503589,60.365013],[127.504717,60.365623],[127.507292,60.367289],[127.514442,60.371823],[127.520692,60.375828],[127.523246,60.377435],[127.535246,60.385095],[127.537134,60.386261],[127.538057,60.386653],[127.538813,60.386897],[127.539854,60.387207],[127.548738,60.389646],[127.54981,60.390028],[127.550669,60.390473],[127.553501,60.391957],[127.567577,60.399314],[127.576289,60.403892],[127.590472,60.411379],[127.596596,60.414624],[127.596941,60.414791],[127.609019,60.421129],[127.611105,60.422236],[127.6122,60.422673],[127.613689,60.423211],[127.615789,60.423913],[127.621535,60.42584],[127.622037,60.426012],[127.632208,60.429465],[127.633882,60.430036],[127.635255,60.430566],[127.636585,60.431201],[127.642765,60.434081],[127.644267,60.434801],[127.647786,60.436368],[127.654223,60.439353],[127.65564,60.439946],[127.657142,60.440433],[127.658515,60.440793],[127.65976,60.441005],[127.661304,60.441195],[127.668968,60.44179],[127.670126,60.441958],[127.671361,60.4422],[127.672774,60.442588],[127.687697,60.447144],[127.693835,60.449007],[127.716708,60.455948],[127.749672,60.466006],[127.749925,60.466083],[127.756942,60.468227],[127.781768,60.475812],[127.795715,60.48],[127.797775,60.480613],[127.80005,60.481416],[127.806787,60.483827],[127.810993,60.485264],[127.81301,60.485877],[127.832376,60.491825],[127.853332,60.498296],[127.873829,60.504648],[127.875945,60.505287],[127.878359,60.505918],[127.882924,60.506975],[127.883699,60.507151],[127.892853,60.509293],[127.894743,60.509817],[127.896557,60.510366],[127.898746,60.5111],[127.910803,60.515438],[127.91323,60.516276],[127.914516,60.516742],[127.915547,60.517052],[127.916901,60.517366],[127.918876,60.51776],[127.921541,60.518198],[127.928124,60.51926],[127.93563,60.52051],[127.937942,60.520872],[127.939448,60.521194],[127.942012,60.521861],[127.958729,60.526125],[127.967302,60.528289],[127.97626,60.530617],[127.980165,60.531735],[127.981206,60.532068],[127.982081,60.532394],[127.983956,60.533188],[127.998209,60.538979],[128.018516,60.547326],[128.030948,60.553179],[128.038033,60.55652],[128.041708,60.558213],[128.045336,60.559923],[128.046232,60.560245],[128.051343,60.562068],[128.074043,60.570075],[128.077268,60.571293],[128.078516,60.571759],[128.09243,60.576907],[128.101099,60.580132],[128.10264,60.580714],[128.103603,60.581025],[128.104985,60.581292],[128.10713,60.581671],[128.113988,60.582816],[128.114422,60.582889],[128.117087,60.583357],[128.120477,60.583884],[128.121639,60.584082],[128.122709,60.584264],[128.124694,60.584644],[128.126271,60.585034],[128.12847,60.585618],[128.131485,60.586461],[128.138866,60.588448],[128.166762,60.595931],[128.172195,60.597428],[128.176478,60.598761],[128.180225,60.599978],[128.182124,60.600576],[128.183963,60.601073],[128.185385,60.601353],[128.187965,60.601863],[128.189779,60.602239],[128.191193,60.602678],[128.192436,60.603188],[128.193807,60.603874],[128.195953,60.604919],[128.203515,60.608651],[128.20635,60.61021],[128.208718,60.611718],[128.213367,60.614693],[128.218237,60.617807],[128.222448,60.620477],[128.229368,60.62487],[128.231499,60.626081],[128.233439,60.627076],[128.235493,60.628041],[128.238129,60.629171],[128.240299,60.63001],[128.24257,60.630789],[128.244618,60.631458],[128.246537,60.632058],[128.248294,60.632589],[128.250437,60.633235],[128.25216,60.633709],[128.254188,60.634196],[128.255492,60.634471],[128.25752,60.634839],[128.25946,60.635078],[128.263195,60.635443],[128.306987,60.639671],[128.317158,60.640638],[128.318703,60.640828],[128.320205,60.641038],[128.32145,60.641354],[128.322523,60.641754],[128.323891,60.642349],[128.335998,60.647518],[128.341903,60.650065],[128.352021,60.654374],[128.362341,60.658779],[128.364004,60.659604],[128.364829,60.660167],[128.365464,60.660747],[128.366113,60.661707],[128.366586,60.662886],[128.366768,60.663445],[128.367086,60.664124],[128.367566,60.665101],[128.368163,60.665947],[128.370137,60.667524],[128.379963,60.675344],[128.38397,60.67893],[128.384177,60.679121],[128.387606,60.682265],[128.388842,60.682983],[128.391575,60.684359],[128.398583,60.687903],[128.440947,60.709314],[128.465579,60.721766],[128.477865,60.72799],[128.497387,60.737859],[128.506576,60.742458],[128.528231,60.753283],[128.550655,60.764405],[128.553093,60.765647],[128.555294,60.766672],[128.556041,60.766955],[128.557125,60.767282],[128.559375,60.767816],[128.560054,60.767983],[128.561722,60.768368],[128.562698,60.768586],[128.566609,60.769569],[128.568378,60.770183],[128.569272,60.770651],[128.570598,60.771564],[128.57273,60.773241],[128.575188,60.775114],[128.575469,60.775331],[128.576693,60.776036],[128.578857,60.776973],[128.583243,60.778804],[128.59356,60.783206],[128.605543,60.78823],[128.616571,60.792943],[128.626152,60.796979],[128.635924,60.801095],[128.647382,60.805862],[128.653208,60.808352],[128.662293,60.812114],[128.666534,60.813929],[128.670193,60.815422],[128.671951,60.81631],[128.673438,60.817403],[128.67876,60.821609],[128.681831,60.823946],[128.683229,60.825069],[128.683977,60.825921],[128.684278,60.826842],[128.684235,60.827971],[128.684278,60.829289],[128.684393,60.830466],[128.684727,60.831302],[128.685606,60.832231],[128.686542,60.832994],[128.687779,60.833697],[128.690848,60.835142],[128.694941,60.837224],[128.698349,60.838951],[128.699055,60.83945],[128.699606,60.839972],[128.699799,60.840195],[128.70027,60.840847],[128.702555,60.845187],[128.706465,60.852645],[128.711041,60.861715],[128.71606,60.871534],[128.722987,60.884722],[128.728213,60.894566],[128.730326,60.898493],[128.732099,60.901874],[128.734038,60.905528],[128.736752,60.910544],[128.739327,60.915332],[128.741977,60.920224],[128.749743,60.934353],[128.754219,60.942378],[128.755796,60.94529],[128.758188,60.949552],[128.762587,60.957538],[128.764561,60.961096],[128.768177,60.967588],[128.769357,60.969786],[128.772887,60.976303],[128.773473,60.977205],[128.774247,60.977952],[128.776749,60.979673],[128.779242,60.981376],[128.781218,60.982843],[128.782704,60.983861],[128.783401,60.984423],[128.783884,60.984901],[128.784302,60.985453],[128.784689,60.986057],[128.786019,60.988565],[128.786952,60.99036],[128.793372,61.002869],[128.793551,61.003229],[128.793744,61.003739],[128.793851,61.004192],[128.793948,61.00467],[128.794173,61.006521],[128.79428,61.007223],[128.794452,61.007785],[128.794602,61.008243],[128.795042,61.009038],[128.795729,61.009834],[128.79619,61.010234],[128.797016,61.010837],[128.797874,61.011326],[128.798754,61.011768],[128.8006,61.012595],[128.802284,61.01337],[128.802885,61.013692],[128.803625,61.01417],[128.80428,61.014695],[128.804762,61.015179],[128.805309,61.015787],[128.805782,61.016489],[128.81003,61.025222],[128.812047,61.029041],[128.813099,61.031219],[128.813603,61.032035],[128.814064,61.032627],[128.814461,61.033188],[128.814901,61.033729],[128.8154,61.034362],[128.815893,61.034963],[128.816215,61.035334],[128.817761,61.037314],[128.818276,61.037965],[128.819214,61.039392],[128.819475,61.039781],[128.821132,61.042302],[128.823745,61.04722],[128.827736,61.054864],[128.830033,61.05906],[128.830694,61.0603],[128.831002,61.060898],[128.832679,61.064152],[128.833451,61.065044],[128.833966,61.065548],[128.834696,61.066109],[128.835522,61.066654],[128.836756,61.067302],[128.83829,61.06792],[128.839985,61.068429],[128.841562,61.068776],[128.843332,61.069202],[128.845028,61.069705],[128.846379,61.070245],[128.847345,61.070707],[128.848246,61.071247],[128.848804,61.07162],[128.849469,61.07215],[128.850049,61.0727],[128.850757,61.073618],[128.851122,61.074153],[128.851851,61.075222],[128.852881,61.076576],[128.853975,61.077578],[128.854984,61.078226],[128.856078,61.078823],[128.857773,61.07956],[128.859855,61.080354],[128.860649,61.080706],[128.861861,61.081412],[128.862644,61.081983],[128.863406,61.082673],[128.864071,61.083383],[128.864661,61.084187],[128.866174,61.086325],[128.867462,61.087948],[128.868266,61.088711],[128.869328,61.089416],[128.870476,61.09007],[128.87185,61.090666],[128.873277,61.09118],[128.875884,61.092082],[128.876903,61.092518],[128.877557,61.092855],[128.877954,61.093099],[128.878555,61.093508],[128.879285,61.094079],[128.87995,61.094711],[128.880529,61.095557],[128.882007,61.098323],[128.883651,61.101395],[128.886173,61.105061],[128.886902,61.10617],[128.888833,61.109602],[128.895976,61.122543],[128.897122,61.124678],[128.897824,61.126133],[128.898082,61.126822],[128.898202,61.127648],[128.898232,61.128516],[128.898328,61.129391],[128.898522,61.130096],[128.898736,61.130573],[128.899187,61.131215],[128.900925,61.133453],[128.902255,61.135017],[128.903028,61.136032],[128.904122,61.137368],[128.90556,61.13915],[128.906826,61.140677],[128.90792,61.14207],[128.909647,61.144188],[128.911514,61.146445],[128.912662,61.147848],[128.914443,61.150163],[128.914926,61.150975],[128.915355,61.151866],[128.91557,61.152528],[128.915623,61.152917],[128.915634,61.153465],[128.915452,61.154412],[128.914744,61.156229],[128.91455,61.156736],[128.914432,61.157446],[128.9144,61.158315],[128.914496,61.158932],[128.914797,61.159666],[128.915358,61.160592],[128.916267,61.161855],[128.917254,61.163247],[128.918252,61.164613],[128.919389,61.166212],[128.920795,61.168095],[128.922007,61.169803],[128.92323,61.171505],[128.924314,61.172943],[128.924893,61.173677],[128.925569,61.174608],[128.927414,61.17719],[128.928196,61.178171],[128.928713,61.178948],[128.929225,61.179828],[128.929442,61.180334],[128.929614,61.180872],[128.929678,61.181591],[128.929517,61.182517],[128.927439,61.189469],[128.926728,61.192021],[128.92647,61.193179],[128.92632,61.19397],[128.926245,61.19491],[128.926213,61.197045],[128.926331,61.198177],[128.926234,61.199004],[128.926266,61.199614],[128.926374,61.202431],[128.92632,61.203656],[128.926363,61.204762],[128.926417,61.206695],[128.926427,61.209439],[128.926492,61.211278],[128.926513,61.213629],[128.926653,61.216444],[128.926617,61.218361],[128.92627,61.220504],[128.92529,61.227523],[128.925273,61.228135],[128.92527,61.228522],[128.92544,61.229269],[128.925655,61.229718],[128.928273,61.235263],[128.92956,61.23802],[128.930354,61.239812],[128.93177,61.242795],[128.93265,61.244746],[128.933197,61.245892],[128.934013,61.247587],[128.934914,61.249948],[128.936051,61.252399],[128.937628,61.255387],[128.939831,61.259823],[128.940581,61.261453],[128.942948,61.26673],[128.943152,61.267557],[128.943204,61.268224],[128.943093,61.268892],[128.94241,61.271186],[128.942424,61.272091],[128.942597,61.273014],[128.943188,61.274272],[128.94381,61.275058],[128.944621,61.275724],[128.946566,61.277171],[128.951143,61.280706],[128.951819,61.28133],[128.952299,61.281859],[128.95267,61.282392],[128.953636,61.284126],[128.955495,61.287967],[128.956063,61.289058],[128.958067,61.293016],[128.95829,61.293803],[128.958287,61.294602],[128.957942,61.295555],[128.957442,61.296272],[128.95549,61.297818],[128.954572,61.298575],[128.953806,61.299261],[128.953012,61.299935],[128.952102,61.300892],[128.951506,61.301736],[128.951221,61.302793],[128.951344,61.303832],[128.951864,61.304754],[128.952703,61.305616],[128.953601,61.306242],[128.954542,61.306774],[128.955679,61.307266],[128.957513,61.307817],[128.959635,61.308337],[128.984033,61.313916],[128.998837,61.317348],[129.000673,61.317749],[129.001591,61.317949],[129.004352,61.318471],[129.007278,61.318947],[129.012706,61.319609],[129.019387,61.320385],[129.036573,61.322465],[129.039589,61.322914],[129.042287,61.323455],[129.046102,61.324433],[129.049568,61.325486],[129.055921,61.327712],[129.064678,61.330772],[129.076127,61.334772],[129.082135,61.336936],[129.084248,61.337909],[129.085128,61.338442],[129.085933,61.339],[129.087279,61.340155],[129.095298,61.348074],[129.095673,61.348444],[129.099343,61.352041],[129.103985,61.356536],[129.10812,61.360579],[129.113023,61.365284],[129.114772,61.366574],[129.116607,61.367664],[129.119064,61.368955],[129.12139,61.369991],[129.126542,61.371839],[129.128824,61.372667],[129.13137,61.373532],[129.14973,61.379925],[129.172694,61.387944],[129.177439,61.389619],[129.183536,61.3918],[129.186031,61.39286],[129.188964,61.394365],[129.1921,61.396355],[129.198489,61.400516],[129.208022,61.406681],[129.226837,61.418821],[129.227127,61.419017],[129.228251,61.419738],[129.24036,61.427575],[129.242514,61.428951],[129.243786,61.429668],[129.244946,61.430264],[129.246375,61.430777],[129.248297,61.431337],[129.249962,61.431676],[129.253087,61.432118],[129.254129,61.432241],[129.256278,61.432519],[129.257781,61.432745],[129.259653,61.433008],[129.261767,61.433302],[129.264257,61.433767],[129.26721,61.434521],[129.269294,61.435174],[129.270548,61.435658],[129.27169,61.43613],[129.272692,61.436544],[129.273407,61.436953],[129.27386,61.437209],[129.275776,61.438357],[129.277215,61.439505],[129.278671,61.440881],[129.279506,61.442034],[129.280197,61.443247],[129.280919,61.444602],[129.283921,61.450394],[129.28601,61.454253],[129.28689,61.455391],[129.287947,61.456253],[129.288916,61.456877],[129.290346,61.457562],[129.291824,61.458119],[129.293596,61.458625],[129.295742,61.459193],[129.317911,61.465218],[129.32522,61.467186],[129.333143,61.46928],[129.335129,61.46986],[129.336942,61.470617],[129.339256,61.472],[129.344875,61.475614],[129.345712,61.476165],[129.348779,61.478122],[129.3507,61.479352],[129.352519,61.480451],[129.353608,61.480902],[129.354872,61.48125],[129.356349,61.481483],[129.357625,61.481563],[129.362854,61.481496],[129.371241,61.481411],[129.375569,61.481398],[129.380889,61.481375],[129.385018,61.481439],[129.387927,61.481646],[129.390195,61.481807],[129.392556,61.48201],[129.397365,61.482647],[129.40373,61.48366],[129.411252,61.484995],[129.427554,61.487782],[129.445365,61.49086],[129.465081,61.494277],[129.468266,61.494835],[129.47486,61.49599],[129.481848,61.497254],[129.483208,61.497534],[129.484065,61.497736],[129.485897,61.498251],[129.49242,61.500586],[129.506325,61.505561],[129.51671,61.509246],[129.533576,61.515367],[129.554261,61.522754],[129.571124,61.52884],[129.585466,61.533994],[129.589023,61.535336],[129.592032,61.536762],[129.594399,61.538313],[129.595889,61.539672],[129.597005,61.54092],[129.599408,61.54368],[129.60501,61.549831],[129.610344,61.555901],[129.611363,61.557158],[129.611964,61.558225],[129.612474,61.559655],[129.61271,61.560999],[129.612656,61.562317],[129.612364,61.563912],[129.6118,61.565117],[129.611039,61.566345],[129.609706,61.567778],[129.608123,61.569148],[129.606309,61.570321],[129.603984,61.571582],[129.57257,61.588263],[129.57128,61.589064],[129.569936,61.589976],[129.56861,61.590931],[129.566966,61.592332],[129.565956,61.593504],[129.564662,61.595052],[129.563666,61.596594],[129.562984,61.59792],[129.562557,61.599232],[129.56239,61.600774],[129.562587,61.602006],[129.563188,61.603027],[129.564218,61.604129],[129.565769,61.605388],[129.565772,61.60539],[129.5678,61.606496],[129.570226,61.607363],[129.57282,61.608073],[129.587607,61.6117],[129.593947,61.613266],[129.595154,61.613624],[129.595835,61.613827],[129.597563,61.614515],[129.598968,61.615286],[129.600338,61.61617],[129.601571,61.617231],[129.602754,61.618483],[129.602884,61.618636],[129.604386,61.620044],[129.60597,61.621392],[129.607687,61.622575],[129.609758,61.623687],[129.612161,61.624778],[129.61465,61.62565],[129.617944,61.626578],[129.622042,61.627618],[129.626119,61.62877],[129.62952,61.630024],[129.633114,61.631696],[129.636011,61.633338],[129.645302,61.638633],[129.668198,61.651586],[129.687457,61.66247],[129.687814,61.662684],[129.705341,61.672578],[129.714808,61.677901],[129.716481,61.679163],[129.718412,61.680771],[129.719829,61.682298],[129.720816,61.683682],[129.721588,61.685352],[129.721666,61.685806],[129.721889,61.687102],[129.721998,61.688279],[129.722017,61.688486],[129.721889,61.690155],[129.721588,61.692577],[129.721459,61.693961],[129.72103,61.696769],[129.720944,61.697807],[129.721073,61.698804],[129.721846,61.701591],[129.72279,61.705212],[129.724635,61.712941],[129.726309,61.71896],[129.72691,61.720535],[129.726953,61.720648],[129.727553,61.72201],[129.728165,61.722979],[129.728793,61.723829],[129.730255,61.725333],[129.731756,61.726613],[129.733156,61.727601],[129.735627,61.729096],[129.739309,61.730862],[129.741175,61.731746],[129.743171,61.732595],[129.744877,61.733187],[129.746443,61.733563],[129.748192,61.733837],[129.749726,61.733995],[129.751561,61.734107],[129.753106,61.734102],[129.754753,61.73402],[129.757879,61.733847],[129.759088,61.733789],[129.761068,61.733673],[129.762418,61.733589],[129.764167,61.733558],[129.76554,61.733599],[129.767375,61.733721],[129.768995,61.733959],[129.77179,61.734469],[129.776251,61.735367],[129.780089,61.73611],[129.783229,61.736927],[129.786042,61.737876],[129.788637,61.739024],[129.790968,61.740341],[129.792615,61.741423],[129.794169,61.742732],[129.795786,61.744528],[129.79678,61.746352],[129.798106,61.748917],[129.802312,61.75765],[129.806329,61.766252],[129.807092,61.767837],[129.807541,61.768786],[129.808685,61.77129],[129.809013,61.771821],[129.809722,61.773241],[129.809848,61.773497],[129.81001,61.773838],[129.810691,61.775266],[129.811626,61.776964],[129.813235,61.779022],[129.81517,61.780895],[129.815743,61.781318],[129.816631,61.781974],[129.819292,61.783567],[129.820236,61.784046],[129.820806,61.784314],[129.828965,61.788156],[129.834404,61.790717],[129.836544,61.791707],[129.838414,61.792607],[129.856863,61.801214],[129.861694,61.803467],[129.864089,61.804614],[129.865324,61.805207],[129.867874,61.806577],[129.869594,61.807607],[129.870684,61.808407],[129.872144,61.809537],[129.874094,61.811427],[129.875244,61.812799],[129.875854,61.813527],[129.877014,61.815007],[129.878244,61.816687],[129.879954,61.818727],[129.881054,61.820097],[129.882084,61.821237],[129.882814,61.822097],[129.883514,61.822977],[129.883964,61.823677],[129.884614,61.824557],[129.886134,61.826167],[129.888494,61.829087],[129.890084,61.830937],[129.890944,61.831987],[129.892104,61.833317],[129.895534,61.837417],[129.897084,61.839597],[129.897504,61.840247],[129.898084,61.841337],[129.898397,61.842025],[129.898644,61.842567],[129.898834,61.843547],[129.898881,61.845217],[129.89884,61.845718],[129.89884,61.845969],[129.898534,61.847627],[129.898284,61.848227],[129.897995,61.84898],[129.897574,61.849747],[129.896995,61.850686],[129.896387,61.851483],[129.894947,61.853361],[129.894066,61.854453],[129.894042,61.854483],[129.89271,61.856278],[129.890412,61.859211],[129.889892,61.85996],[129.889588,61.860339],[129.88925,61.860706],[129.888831,61.861034],[129.888237,61.861382],[129.886733,61.862115],[129.884791,61.863116],[129.883085,61.864209],[129.882635,61.86466],[129.88241,61.865186],[129.882238,61.866015],[129.882227,61.866567],[129.883334,61.868628],[129.883594,61.869291],[129.884599,61.871079],[129.885408,61.872844],[129.886242,61.874546],[129.886779,61.875461],[129.887349,61.8763],[129.888294,61.877347],[129.889282,61.878335],[129.890347,61.879234],[129.891317,61.880013],[129.89159,61.880227],[129.892622,61.881112],[129.893981,61.882208],[129.894853,61.882877],[129.896481,61.883909],[129.898347,61.884928],[129.900144,61.885847],[129.901024,61.886377],[129.90162,61.886823],[129.901645,61.886842],[129.902591,61.887575],[129.903828,61.888775],[129.904801,61.889988],[129.905085,61.890396],[129.905335,61.890807],[129.906018,61.892052],[129.906349,61.892647],[129.906897,61.893609],[129.907377,61.894443],[129.907775,61.89508],[129.908586,61.896134],[129.90981,61.897452],[129.910417,61.897979],[129.911994,61.899257],[129.918404,61.903827],[129.919804,61.905287],[129.920644,61.906917],[129.920754,61.908479],[129.920744,61.908709],[129.920733,61.908989],[129.920679,61.909277],[129.920534,61.909745],[129.919544,61.911597],[129.91729,61.914189],[129.917075,61.914451],[129.916755,61.914853],[129.908814,61.924857],[129.907484,61.927017],[129.906791,61.928554],[129.906194,61.929877],[129.905553,61.932222],[129.904215,61.936883],[129.904029,61.937506],[129.903873,61.938028],[129.903589,61.938978],[129.903514,61.939229],[129.902417,61.942902],[129.902397,61.94297],[129.90188,61.944853],[129.901497,61.945829],[129.901223,61.946875],[129.901055,61.947494],[129.900937,61.94793],[129.900872,61.948167],[129.900651,61.948979],[129.900574,61.949266],[129.900371,61.95001],[129.900312,61.95023],[129.900274,61.950648],[129.900281,61.950977],[129.900321,61.951374],[129.900427,61.951725],[129.900624,61.95224],[129.900985,61.953024],[129.901016,61.953092],[129.90124,61.9536],[129.901322,61.953784],[129.901585,61.95434],[129.901603,61.954379],[129.901626,61.954429],[129.901731,61.954651],[129.901756,61.954703],[129.901958,61.954989],[129.902178,61.955213],[129.902276,61.955289],[129.902598,61.955538],[129.902883,61.955714],[129.903384,61.955987],[129.904375,61.956472],[129.904536,61.956551],[129.905596,61.957069],[129.905862,61.957207],[129.906114,61.957337],[129.90711,61.957817],[129.90783,61.958165],[129.908474,61.958477],[129.908798,61.958634],[129.908864,61.958667],[129.911604,61.960047],[129.912055,61.960266],[129.915892,61.962128],[129.916233,61.962294],[129.917124,61.962727],[129.917697,61.963012],[129.918488,61.963398],[129.919057,61.963686],[129.919543,61.963932],[129.92054,61.964437],[129.92088,61.964592],[129.921111,61.964709],[129.921285,61.964818],[129.921484,61.964929],[129.921736,61.965083],[129.921897,61.965193],[129.92209,61.965352],[129.922417,61.965609],[129.922675,61.965852],[129.924051,61.967028],[129.924875,61.967733],[129.924914,61.967766],[129.925471,61.968251],[129.925713,61.968462],[129.926167,61.968857],[129.926209,61.968892],[129.926476,61.969117],[129.927451,61.969997],[129.927804,61.970312],[129.928193,61.970659],[129.928324,61.970776],[129.929285,61.97163],[129.930582,61.972779],[129.931471,61.973547],[129.931647,61.973706],[129.93199,61.974006],[129.932351,61.974322],[129.932561,61.974506],[129.934602,61.976291],[129.934729,61.976402],[129.935312,61.976912],[129.935695,61.977247],[129.936753,61.978194],[129.936932,61.978352],[129.937175,61.978577],[129.93738,61.978765],[129.938264,61.97958],[129.938332,61.979646],[129.938595,61.979898],[129.938911,61.980205],[129.939197,61.980537],[129.939439,61.980897],[129.939514,61.981008],[129.939586,61.981166],[129.939809,61.981651],[129.940608,61.983916],[129.94101,61.984508],[129.941414,61.984937],[129.943294,61.986457],[129.946644,61.988967],[129.949674,61.991417],[129.951964,61.994077],[129.954304,61.996887],[129.955804,61.998087],[129.956604,61.998647],[129.957764,61.999227],[129.958944,61.999737],[129.959244,61.999827],[129.961964,62.000577],[129.963854,62.001117],[129.966814,62.001907],[129.970487,62.003085],[129.971084,62.003277],[129.972714,62.004243],[129.973124,62.004487],[129.974474,62.005747],[129.975274,62.007447],[129.975484,62.009657],[129.975784,62.012467],[129.976563,62.017443],[129.976644,62.020317],[129.976857,62.021974],[129.977314,62.022827],[129.978724,62.024047],[129.985724,62.029097],[129.989174,62.031587],[129.992434,62.033927],[129.994467,62.035445],[129.995034,62.035888],[129.995444,62.036257],[129.995678,62.036626],[129.995784,62.036927],[129.995807,62.037259],[129.995674,62.037617],[129.995197,62.038367],[129.994094,62.039797],[129.993463,62.040643],[129.993084,62.041457],[129.993104,62.042097],[129.996984,62.050527],[130.000314,62.058017],[130.001794,62.061237],[130.003704,62.064587],[130.006044,62.067267],[130.007329,62.06844],[130.008684,62.069397],[130.009939,62.070062],[130.011384,62.070617],[130.012652,62.071],[130.014706,62.071418],[130.020275,62.072509],[130.0255,62.073521],[130.027091,62.073829],[130.050468,62.078329],[130.059304,62.080057],[130.067794,62.081667],[130.075354,62.083107],[130.077939,62.083662],[130.079271,62.084064],[130.080267,62.084459],[130.081419,62.084975],[130.08364,62.085939],[130.084521,62.086273],[130.085174,62.086479],[130.085977,62.086674],[130.08677,62.086833],[130.088163,62.08705],[130.092494,62.087531],[130.096204,62.087971],[130.097947,62.088201],[130.099878,62.08848],[130.106511,62.089556],[130.108559,62.089903],[130.110178,62.090123],[130.111351,62.090264],[130.112494,62.090357],[130.11439,62.090452],[130.118104,62.090546],[130.121765,62.090663],[130.122386,62.090721],[130.122886,62.090799],[130.123289,62.090882],[130.123623,62.09098],[130.12415,62.091158],[130.12451,62.0913],[130.125011,62.09153],[130.125674,62.091852],[130.126566,62.09233],[130.127132,62.092586],[130.127796,62.092828],[130.129724,62.093487],[130.136785,62.095931],[130.137492,62.096222],[130.137878,62.096396],[130.138095,62.096494],[130.138721,62.096858],[130.139891,62.097639],[130.140242,62.09789],[130.140992,62.098426],[130.141704,62.098831],[130.142285,62.099078],[130.142773,62.099233],[130.143374,62.099387],[130.144005,62.099499],[130.144617,62.099586],[130.145357,62.09966],[130.146604,62.099703],[130.150011,62.099798],[130.150889,62.099821],[130.155147,62.099947],[130.160109,62.100097],[130.160831,62.10013],[130.161573,62.100203],[130.162613,62.100361],[130.163515,62.100544],[130.164455,62.100799],[130.16816,62.101943],[130.168949,62.102129],[130.16965,62.102261],[130.170486,62.102352],[130.171364,62.102405],[130.173136,62.102469],[130.188604,62.102821],[130.192354,62.102896],[130.197782,62.103005],[130.200741,62.103073],[130.20553,62.103181],[130.207507,62.103246],[130.208832,62.103344],[130.210241,62.103531],[130.211693,62.103799],[130.213242,62.104153],[130.214591,62.104501],[130.215538,62.104835],[130.222357,62.107531],[130.228778,62.110188],[130.229439,62.110409],[130.230383,62.110676],[130.231029,62.110802],[130.232285,62.111029],[130.233463,62.111175],[130.234392,62.111184],[130.235832,62.11116],[130.237614,62.111087],[130.243656,62.110779],[130.245108,62.110737],[130.246048,62.110813],[130.246876,62.110921],[130.248147,62.111134],[130.250526,62.111597],[130.255278,62.112616],[130.267085,62.115194],[130.268701,62.115538],[130.270185,62.115817],[130.27157,62.115991],[130.277837,62.116621],[130.285056,62.117335],[130.288372,62.117644],[130.289718,62.117782],[130.290799,62.117923],[130.292238,62.118167],[130.292953,62.118291],[130.293616,62.118459],[130.294459,62.118682],[130.295735,62.119035],[130.296914,62.119445],[130.302587,62.121698],[130.304121,62.122344],[130.304986,62.122752],[130.306867,62.123731],[130.310228,62.125538],[130.315016,62.128067],[130.319183,62.130314],[130.322509,62.132039],[130.32439,62.132877],[130.325225,62.133254],[130.326012,62.133583],[130.329664,62.135029],[130.331177,62.135602],[130.332024,62.135887],[130.333151,62.136171],[130.334167,62.1364],[130.335457,62.136639],[130.336676,62.136806],[130.34291,62.137466],[130.352154,62.138317],[130.358954,62.138977],[130.36542,62.139624],[130.368788,62.139972],[130.372348,62.140298],[130.376227,62.140558],[130.377516,62.140644],[130.379176,62.14071],[130.379959,62.140725],[130.380978,62.140705],[130.38247,62.14062],[130.384022,62.14049],[130.387467,62.140079],[130.387758,62.140043],[130.394124,62.139257],[130.396949,62.138987],[130.398477,62.1389],[130.400033,62.13887],[130.402258,62.138919],[130.404787,62.138995],[130.408959,62.139119],[130.414425,62.139296],[130.419479,62.139443],[130.423295,62.139559],[130.426625,62.139658],[130.4268,62.139663],[130.430572,62.139756],[130.438233,62.139995],[130.450601,62.140354],[130.457223,62.140525],[130.459268,62.140579],[130.467574,62.140475],[130.485974,62.14011],[130.486497,62.140183],[130.487109,62.140337],[130.487462,62.140449],[130.487688,62.140553],[130.490662,62.142459],[130.496641,62.147207],[130.500126,62.149882],[130.504349,62.152186],[130.505187,62.152543],[130.506077,62.152855],[130.50718,62.153135],[130.510364,62.153617],[130.518269,62.154901],[130.521475,62.155424],[130.52607,62.156161],[130.528204,62.156497],[130.530023,62.156741],[130.532424,62.156937],[130.534626,62.157145],[130.537192,62.157391],[130.538424,62.157497],[130.540274,62.157647],[130.543386,62.157928],[130.54607,62.15816],[130.54921,62.158439],[130.552677,62.158736],[130.556568,62.159083],[130.559393,62.159276],[130.565056,62.159424],[130.568238,62.159515],[130.573843,62.159677],[130.575779,62.159677],[130.577354,62.159575],[130.583301,62.158752],[130.584585,62.158656],[130.585489,62.158663],[130.586757,62.158779],[130.588334,62.158995],[130.590328,62.159262],[130.596659,62.160075],[130.599112,62.160468],[130.601173,62.160923],[130.60306,62.161421],[130.60473,62.16196],[130.606248,62.162525],[130.606352,62.162563],[130.607258,62.163005],[130.607968,62.163439],[130.611257,62.166281],[130.614051,62.168686],[130.615352,62.169832],[130.615886,62.17014],[130.616563,62.170484],[130.617414,62.170797],[130.619404,62.171167],[130.620275,62.171301],[130.621388,62.171406],[130.622889,62.17145],[130.63141,62.171485],[130.631938,62.171526],[130.633187,62.17178],[130.634574,62.172169],[130.635738,62.172594],[130.638148,62.174156],[130.640191,62.175558],[130.641946,62.176781],[130.64386,62.178089],[130.645645,62.179333],[130.646946,62.18009],[130.648634,62.180717],[130.65539,62.182222],[130.65707,62.182467],[130.658199,62.182444],[130.659326,62.182292],[130.661267,62.18195],[130.662313,62.18189],[130.663139,62.181933],[130.663487,62.182017],[130.663725,62.182108],[130.664814,62.182528],[130.665953,62.183121],[130.666487,62.183424],[130.6681,62.184291],[130.668708,62.184551],[130.669493,62.184775],[130.670458,62.18492],[130.676603,62.18554],[130.676684,62.185549],[130.677062,62.185587],[130.681107,62.186005],[130.687066,62.186616],[130.688699,62.186775],[130.690176,62.18689],[130.691236,62.186941],[130.692127,62.18695],[130.69354,62.186965],[130.694678,62.18695],[130.695076,62.186945],[130.696421,62.186914],[130.697025,62.186879],[130.697715,62.186801],[130.698651,62.186644],[130.700217,62.186369],[130.700464,62.186315],[130.7029,62.185859],[130.703549,62.185742],[130.708654,62.184817],[130.713754,62.183937],[130.718584,62.182857],[130.719576,62.182606],[130.720149,62.182454],[130.720597,62.182335],[130.724141,62.181437],[130.725707,62.181022],[130.726524,62.180797],[130.728354,62.180267],[130.730884,62.179517],[130.732344,62.178969],[130.733702,62.178399],[130.734738,62.177985],[130.736885,62.17714],[130.737892,62.176742],[130.738269,62.17654],[130.738809,62.17614],[130.739663,62.175499],[130.740164,62.175175],[130.740724,62.174896],[130.741438,62.174566],[130.742417,62.174127],[130.74316,62.17381],[130.74369,62.173522],[130.744507,62.172951],[130.747144,62.171097],[130.749623,62.169677],[130.750642,62.169248],[130.751596,62.168926],[130.751698,62.168891],[130.752267,62.168741],[130.752908,62.168635],[130.76418,62.167712],[130.773466,62.166938],[130.77458,62.166848],[130.775166,62.166766],[130.775682,62.166653],[130.776185,62.166523],[130.776898,62.16626],[130.778128,62.165705],[130.780324,62.164664],[130.78066,62.164506],[130.783448,62.163187],[130.784689,62.162581],[130.785519,62.162222],[130.786244,62.161957],[130.786823,62.161751],[130.787521,62.16156],[130.78778,62.161502],[130.788148,62.16142],[130.788814,62.161297],[130.789707,62.161161],[130.799235,62.160046],[130.801264,62.159857],[130.80236,62.159744],[130.804614,62.159577],[130.806195,62.159584],[130.807804,62.159613],[130.811374,62.159767],[130.819162,62.160079],[130.8226,62.160215],[130.826345,62.160362],[130.829606,62.1605],[130.830914,62.160567],[130.833904,62.160677],[130.840484,62.160977],[130.842242,62.161037],[130.843506,62.161053],[130.84468,62.161034],[130.845154,62.161016],[130.84623,62.160966],[130.849694,62.160737],[130.854884,62.160417],[130.861194,62.160027],[130.865054,62.159817],[130.875074,62.159197],[130.879564,62.158917],[130.888334,62.158377],[130.890065,62.158273],[130.893354,62.158077],[130.899134,62.157737],[130.905114,62.157367],[130.910504,62.156937],[130.915224,62.156707],[130.925074,62.156807],[130.939554,62.156787],[130.943334,62.156577],[130.948574,62.156257],[130.961401,62.155457],[130.963074,62.155334],[130.964731,62.155169],[130.965804,62.155007],[130.9672,62.154736],[130.968844,62.154257],[130.983043,62.150334],[130.987297,62.14917],[130.988507,62.148868],[130.989804,62.148642],[130.991054,62.148489],[130.992477,62.148343],[130.993839,62.148262],[130.994995,62.148293],[130.999214,62.148617],[131.002146,62.148814],[131.003162,62.148827],[131.003962,62.148803],[131.009374,62.148478],[131.011662,62.148349],[131.013109,62.148292],[131.014354,62.148317],[131.019874,62.148487],[131.024834,62.148653],[131.02741,62.148756],[131.029117,62.148786],[131.030613,62.14878],[131.03249,62.148761],[131.037573,62.1486],[131.042861,62.148406],[131.04652,62.14826],[131.048159,62.14821],[131.04975,62.148183],[131.051073,62.148189],[131.05232,62.148236],[131.054278,62.148334],[131.055162,62.148403],[131.055947,62.148516],[131.059658,62.149302],[131.061094,62.149597],[131.062808,62.150018],[131.064544,62.150477],[131.065295,62.150666],[131.067909,62.151126],[131.069127,62.15127],[131.070215,62.151375],[131.071566,62.151429],[131.073394,62.151448],[131.074823,62.151434],[131.076245,62.151362],[131.07891,62.151147],[131.083974,62.150635],[131.099206,62.149149],[131.100747,62.148996],[131.105254,62.148597],[131.108881,62.148263],[131.110949,62.148075],[131.113891,62.147884],[131.115712,62.147806],[131.119245,62.147661],[131.123627,62.147501],[131.126661,62.147381],[131.129922,62.147229],[131.133933,62.147086],[131.139763,62.146887],[131.142621,62.146799],[131.144266,62.146674],[131.14649,62.14645],[131.147326,62.146437],[131.148831,62.146515],[131.150513,62.146649],[131.154241,62.146904],[131.15499,62.146873],[131.156117,62.14672],[131.156968,62.14651],[131.157814,62.146244],[131.159338,62.14567],[131.160571,62.145268],[131.163182,62.144451],[131.166242,62.143459],[131.167482,62.143097],[131.168992,62.142679],[131.169912,62.142497],[131.170674,62.142347],[131.173661,62.141754],[131.180008,62.140612],[131.184785,62.139677],[131.195224,62.137627],[131.19639,62.13743],[131.200042,62.136894],[131.205544,62.136187],[131.209708,62.135697],[131.212378,62.135339],[131.213788,62.135167],[131.214904,62.134987],[131.218744,62.134297],[131.220872,62.133898],[131.221998,62.133657],[131.222965,62.133412],[131.227249,62.132145],[131.228709,62.131708],[131.230178,62.131328],[131.230696,62.131253],[131.231223,62.131198],[131.232036,62.131131],[131.23304,62.131096],[131.235094,62.131068],[131.240224,62.131037],[131.241529,62.130996],[131.242537,62.130901],[131.243386,62.130769],[131.244704,62.130507],[131.246259,62.130146],[131.247353,62.129871],[131.248305,62.129579],[131.249563,62.129068],[131.250568,62.128598],[131.251257,62.12835],[131.252503,62.128066],[131.254007,62.127792],[131.259128,62.126907],[131.26092,62.126608],[131.262114,62.126501],[131.264969,62.126611],[131.26729,62.126765],[131.268172,62.126879],[131.268951,62.127074],[131.269561,62.127342],[131.270089,62.127637],[131.272122,62.129016],[131.272825,62.129421],[131.273242,62.129611],[131.273785,62.129782],[131.274872,62.130069],[131.276129,62.130332],[131.279274,62.130867],[131.280446,62.130993],[131.281354,62.131037],[131.282143,62.130989],[131.283584,62.130717],[131.286144,62.130117],[131.287196,62.129865],[131.288172,62.129676],[131.288893,62.129597],[131.289623,62.129563],[131.290896,62.129495],[131.292434,62.129323],[131.293427,62.12912],[131.294838,62.128763],[131.295963,62.128418],[131.296764,62.128147],[131.298724,62.127412],[131.299475,62.127089],[131.300302,62.126728],[131.302868,62.125454],[131.303572,62.125079],[131.304387,62.124532],[131.304841,62.12424],[131.30523,62.123893],[131.305734,62.12329],[131.306127,62.122647],[131.306744,62.121427],[131.307214,62.120437],[131.307964,62.118747],[131.308784,62.116517],[131.308886,62.116078],[131.308987,62.115537],[131.309042,62.114866],[131.309022,62.113958],[131.308844,62.111747],[131.308879,62.111253],[131.309035,62.110769],[131.309404,62.110227],[131.310384,62.109347],[131.313784,62.106617],[131.31525,62.10532],[131.315846,62.10482],[131.316264,62.104497],[131.31674,62.104193],[131.317364,62.103902],[131.318747,62.103256],[131.319804,62.10272],[131.320603,62.102262],[131.32164,62.10163],[131.322227,62.101449],[131.322957,62.101315],[131.324363,62.101017],[131.325692,62.100672],[131.326318,62.100445],[131.327065,62.100189],[131.328263,62.099839],[131.331484,62.099157],[131.335516,62.098304],[131.338454,62.097697],[131.339478,62.097504],[131.340401,62.097424],[131.341185,62.097438],[131.344137,62.097689],[131.345477,62.097755],[131.346654,62.097737],[131.348536,62.097591],[131.350324,62.097397],[131.35155,62.09717],[131.352664,62.096877],[131.354724,62.096047],[131.355643,62.095782],[131.356804,62.095617],[131.359694,62.095317],[131.363423,62.094804],[131.367939,62.093851],[131.370941,62.093136],[131.375311,62.092229],[131.376237,62.09208],[131.377168,62.091959],[131.380186,62.091599],[131.383298,62.091172],[131.38402,62.091124],[131.384582,62.09115],[131.385144,62.091205],[131.385773,62.091323],[131.388489,62.091941],[131.389129,62.092051],[131.389722,62.092112],[131.391419,62.092159],[131.398834,62.092247],[131.401421,62.092277],[131.403539,62.092305],[131.404467,62.092274],[131.405333,62.09219],[131.40677,62.092022],[131.408243,62.09188],[131.409819,62.091759],[131.413509,62.091587],[131.416044,62.091455],[131.417167,62.091434],[131.418174,62.091427],[131.423194,62.091427],[131.425986,62.091454],[131.427883,62.091437],[131.432051,62.091267],[131.437544,62.091017],[131.442694,62.090827],[131.448044,62.090547],[131.454754,62.090017],[131.459624,62.089607],[131.462764,62.089336],[131.463512,62.089243],[131.464238,62.089131],[131.465019,62.088968],[131.4657,62.088774],[131.466269,62.088572],[131.468315,62.08762],[131.469794,62.086927],[131.470606,62.086601],[131.471389,62.086347],[131.472054,62.086229],[131.472816,62.086171],[131.478534,62.086107],[131.482504,62.086167],[131.483692,62.086146],[131.484339,62.086105],[131.484963,62.086027],[131.487339,62.085623],[131.493201,62.084527],[131.49409,62.084282],[131.49538,62.083811],[131.4958,62.083631],[131.49612,62.083418],[131.496342,62.083235],[131.49645,62.082964],[131.496334,62.081585],[131.496352,62.080944],[131.496535,62.080531],[131.496974,62.080171],[131.497658,62.07983],[131.498794,62.079404],[131.500057,62.078989],[131.504174,62.078109],[131.507093,62.077465],[131.510074,62.076675],[131.513764,62.075527],[131.514812,62.075147],[131.515184,62.074959],[131.515484,62.074769],[131.515811,62.074484],[131.516048,62.074127],[131.516094,62.073438],[131.516137,62.073179],[131.516269,62.072979],[131.516584,62.072668],[131.51713,62.072364],[131.517644,62.07217],[131.518469,62.071977],[131.519333,62.071849],[131.52092,62.071704],[131.523684,62.071592],[131.530323,62.07142],[131.531759,62.071414],[131.533025,62.071504],[131.540594,62.072213],[131.545414,62.072657],[131.548844,62.072977],[131.550836,62.073157],[131.552274,62.073271],[131.552732,62.073275],[131.553115,62.073243],[131.553498,62.073174],[131.55386,62.073077],[131.554277,62.072889],[131.555186,62.072361],[131.555968,62.072045],[131.556449,62.071923],[131.557017,62.071846],[131.557761,62.071788],[131.559092,62.071765],[131.560584,62.071777],[131.562218,62.071885],[131.563934,62.072057],[131.567794,62.072567],[131.572384,62.073107],[131.574374,62.073271],[131.576605,62.073374],[131.580045,62.073522],[131.584077,62.073679],[131.586669,62.073787],[131.587474,62.07381],[131.588158,62.073756],[131.589518,62.073514],[131.591825,62.072989],[131.596026,62.072007],[131.600074,62.071014],[131.6005,62.070931],[131.600927,62.07088],[131.601416,62.07087],[131.6021,62.070911],[131.602774,62.071019],[131.603364,62.071137],[131.604143,62.071302],[131.605015,62.071434],[131.605917,62.071488],[131.606705,62.071487],[131.607496,62.07143],[131.608274,62.071316],[131.609297,62.071104],[131.611791,62.070594],[131.614234,62.070097],[131.616039,62.069665],[131.617088,62.069372],[131.618254,62.068986],[131.619239,62.068634],[131.620477,62.068153],[131.622099,62.067554],[131.627464,62.065507],[131.628912,62.065014],[131.630324,62.064567],[131.631649,62.064249],[131.633976,62.063792],[131.636274,62.063303],[131.63709,62.063115],[131.637445,62.063004],[131.637759,62.062858],[131.638545,62.06231],[131.64023,62.061103],[131.641008,62.060655],[131.645267,62.058672],[131.646114,62.058317],[131.646746,62.058096],[131.647717,62.057854],[131.648639,62.057649],[131.65141,62.05713],[131.654179,62.056634],[131.656674,62.056237],[131.657941,62.056056],[131.658497,62.056002],[131.659047,62.05599],[131.661526,62.055986],[131.663994,62.056067],[131.666864,62.056177],[131.671314,62.056335],[131.672255,62.056341],[131.673089,62.056291],[131.673877,62.056172],[131.674658,62.05601],[131.676128,62.055675],[131.67887,62.055012],[131.680195,62.054604],[131.681582,62.054094],[131.683604,62.053317],[131.686114,62.052357],[131.689114,62.051157],[131.691114,62.050407],[131.693644,62.049607],[131.695064,62.049177],[131.697911,62.048322],[131.699248,62.047923],[131.700362,62.047551],[131.700975,62.047255],[131.701878,62.046726],[131.702824,62.046157],[131.704285,62.045026],[131.705184,62.044334],[131.706174,62.043577],[131.707784,62.042417],[131.708924,62.041517],[131.710053,62.04066],[131.710544,62.04028],[131.711281,62.039838],[131.711827,62.039572],[131.712402,62.039331],[131.713152,62.039095],[131.713919,62.038872],[131.715132,62.038564],[131.715979,62.038322],[131.716772,62.038033],[131.718346,62.037325],[131.719127,62.03694],[131.719839,62.036555],[131.720197,62.03623],[131.720533,62.035847],[131.721624,62.034527],[131.722109,62.033906],[131.72287,62.03315],[131.725594,62.030785],[131.726556,62.029879],[131.727268,62.029074],[131.727957,62.027722],[131.728155,62.027202],[131.728274,62.026608],[131.728264,62.025825],[131.7282,62.02513],[131.728274,62.024457],[131.729054,62.023297],[131.730704,62.020987],[131.731406,62.019765],[131.731924,62.018277],[131.732399,62.016502],[131.732756,62.015646],[131.733063,62.015298],[131.73338,62.015082],[131.733804,62.014842],[131.737184,62.013817],[131.744674,62.012467],[131.748144,62.011777],[131.755551,62.010007],[131.758645,62.009366],[131.761404,62.008994],[131.76359,62.008844],[131.765764,62.008727],[131.769112,62.008686],[131.775787,62.008552],[131.776974,62.008497],[131.778947,62.008297],[131.790094,62.006887],[131.794059,62.006343],[131.797674,62.005617],[131.806724,62.003667],[131.808374,62.003277],[131.810484,62.002937],[131.812611,62.002698],[131.81368,62.002665],[131.814947,62.002755],[131.818224,62.003067],[131.823054,62.003367],[131.826043,62.003496],[131.827456,62.003522],[131.829574,62.003517],[131.839124,62.002937],[131.844328,62.002605],[131.845862,62.002465],[131.846575,62.002343],[131.848114,62.001927],[131.851348,62.000817],[131.855619,61.999349],[131.856397,61.999163],[131.857284,61.999037],[131.858436,61.998915],[131.859251,61.998852],[131.859608,61.998825],[131.862959,61.998702],[131.866564,61.998692],[131.871274,61.998687],[131.873974,61.998687],[131.876504,61.998647],[131.878652,61.998585],[131.879466,61.998516],[131.880242,61.998419],[131.881419,61.998223],[131.882594,61.99798],[131.888004,61.996797],[131.900324,61.994097],[131.904164,61.993177],[131.905534,61.992727],[131.907424,61.992057],[131.909964,61.991067],[131.911744,61.990447],[131.912404,61.990217],[131.914914,61.989227],[131.915857,61.988893],[131.916244,61.988757],[131.916745,61.988557],[131.917424,61.988287],[131.918584,61.987877],[131.919894,61.987467],[131.920194,61.987407],[131.922724,61.987097],[131.928284,61.986477],[131.928584,61.986437],[131.930944,61.986157],[131.932014,61.986067],[131.933004,61.985917],[131.933674,61.985837],[131.934354,61.985707],[131.935324,61.985467],[131.936054,61.985217],[131.937234,61.984737],[131.938524,61.984247],[131.940534,61.983367],[131.941178,61.98307],[131.945174,61.981227],[131.947684,61.980257],[131.953624,61.978107],[131.956824,61.976887],[131.959824,61.975537],[131.963324,61.974097],[131.966864,61.973157],[131.969844,61.972297],[131.971642,61.971733],[131.973342,61.971239],[131.976377,61.970774],[131.980533,61.970263],[131.982669,61.969967],[131.984798,61.969571],[131.988964,61.968717],[131.995124,61.967407],[132.001587,61.966204],[132.005124,61.965477],[132.006197,61.965217],[132.008134,61.96459],[132.008514,61.964467],[132.011814,61.963007],[132.014094,61.961887],[132.015574,61.961307],[132.016774,61.960907],[132.017778,61.960725],[132.018917,61.960582],[132.022504,61.960237],[132.026553,61.959891],[132.029798,61.959586],[132.03489,61.959051],[132.036614,61.958981],[132.039548,61.958999],[132.042652,61.959055],[132.045614,61.959187],[132.047614,61.959297],[132.050973,61.959402],[132.055213,61.959379],[132.057188,61.959288],[132.061699,61.958973],[132.064472,61.958776],[132.065917,61.958586],[132.067105,61.958336],[132.068364,61.958027],[132.070244,61.957337],[132.073054,61.956287],[132.074964,61.955607],[132.075824,61.955237],[132.077074,61.954807],[132.078184,61.954397],[132.079503,61.953952],[132.081344,61.953267],[132.082088,61.953038],[132.082904,61.952857],[132.083453,61.952767],[132.084004,61.952707],[132.084871,61.952668],[132.088684,61.952787],[132.090764,61.952897],[132.095504,61.953237],[132.102244,61.953806],[132.103674,61.953927],[132.107149,61.954262],[132.112674,61.954697],[132.114532,61.954822],[132.11648,61.954779],[132.117611,61.954725],[132.122241,61.954396],[132.127214,61.954017],[132.131484,61.953717],[132.135934,61.953438],[132.141704,61.952917],[132.143774,61.952865],[132.144543,61.952942],[132.145827,61.953122],[132.146196,61.953174],[132.14794,61.953419],[132.151933,61.953974],[132.157584,61.954767],[132.159874,61.955067],[132.163244,61.955557],[132.166314,61.955947],[132.169344,61.956377],[132.17004,61.956513],[132.170768,61.956826],[132.171725,61.957378],[132.173564,61.958417],[132.175924,61.959357],[132.178694,61.960177],[132.181934,61.960877],[132.184426,61.96121],[132.196804,61.962957],[132.201504,61.963587],[132.205234,61.964117],[132.209184,61.964717],[132.214424,61.965447],[132.220487,61.966115],[132.227234,61.966717],[132.228844,61.966867],[132.231694,61.967107],[132.236764,61.967617],[132.239674,61.968327],[132.241334,61.968837],[132.245174,61.969937],[132.247334,61.970477],[132.250474,61.970897],[132.255794,61.971567],[132.262371,61.972179],[132.263525,61.972206],[132.264742,61.97213],[132.26746,61.971794],[132.271658,61.971031],[132.276151,61.970341],[132.280724,61.969677],[132.289734,61.968367],[132.296844,61.967337],[132.301714,61.966607],[132.307294,61.965817],[132.308332,61.965665],[132.308802,61.96562],[132.309597,61.965546],[132.312389,61.965486],[132.316975,61.965424],[132.330294,61.965257],[132.334956,61.96519],[132.339856,61.965184],[132.345108,61.965334],[132.350374,61.965488],[132.351941,61.965513],[132.353913,61.965589],[132.354685,61.965655],[132.355764,61.965777],[132.358068,61.966127],[132.360184,61.966409],[132.36326,61.966811],[132.364598,61.967],[132.365925,61.967272],[132.367942,61.967793],[132.379312,61.970739],[132.382469,61.971493],[132.385994,61.972147],[132.395164,61.973567],[132.398524,61.974057],[132.402024,61.974597],[132.413374,61.976287],[132.418424,61.977207],[132.421448,61.977814],[132.423401,61.97822],[132.424725,61.97856],[132.425416,61.978772],[132.426298,61.979106],[132.427157,61.97947],[132.430166,61.980898],[132.431374,61.981444],[132.432064,61.981777],[132.435434,61.983387],[132.440105,61.985543],[132.441096,61.986],[132.441388,61.986136],[132.441544,61.986215],[132.441686,61.986285],[132.444174,61.986437],[132.444591,61.986464],[132.444815,61.986479],[132.447044,61.986627],[132.451054,61.986927],[132.452166,61.987091],[132.453684,61.987316],[132.454704,61.987467],[132.455247,61.987564],[132.462944,61.988907],[132.463866,61.989047],[132.465679,61.989363],[132.465959,61.989412],[132.466274,61.989467],[132.470584,61.990237],[132.470901,61.990337],[132.472708,61.99086],[132.473112,61.990982],[132.474447,61.991385],[132.474602,61.991432],[132.474773,61.991484],[132.476813,61.99213],[132.477399,61.992346],[132.477927,61.992552],[132.478301,61.99276],[132.478642,61.993006],[132.479846,61.993857],[132.480526,61.994366],[132.480997,61.994679],[132.481358,61.994899],[132.48169,61.99506],[132.482067,61.995224],[132.48258,61.995418],[132.483066,61.995581],[132.483445,61.995686],[132.483928,61.995783],[132.484372,61.995842],[132.484758,61.995863],[132.485145,61.995862],[132.485519,61.995846],[132.485941,61.9958],[132.486419,61.995714],[132.487142,61.995561],[132.487692,61.995444],[132.489314,61.995107],[132.492144,61.994527],[132.494142,61.994112],[132.494672,61.994029],[132.49549,61.993963],[132.496234,61.993932],[132.497024,61.993927],[132.500584,61.994267],[132.505265,61.994784],[132.506401,61.994902],[132.506916,61.994917],[132.50731,61.994913],[132.507736,61.994886],[132.508332,61.994826],[132.512234,61.994267],[132.514354,61.994007],[132.515569,61.994051],[132.516764,61.994187],[132.524824,61.995747],[132.525558,61.995905],[132.529144,61.996677],[132.531674,61.997162],[132.538154,61.998407],[132.539341,61.998644],[132.543544,61.999487],[132.549484,62.000617],[132.554354,62.001607],[132.555424,62.001777],[132.556804,62.001757],[132.562164,62.001247],[132.569824,62.000407],[132.580254,61.999247],[132.581584,61.999157],[132.582674,61.999157],[132.584484,61.999357],[132.589154,62.000127],[132.589681,62.000127],[132.5915,62.000127],[132.591944,62.000127],[132.592695,62.000098],[132.597444,61.999917],[132.599264,61.999917],[132.601644,62.000167],[132.606284,62.000837],[132.609954,62.001197],[132.611694,62.001547],[132.614324,62.002677],[132.616114,62.003217],[132.619024,62.003497],[132.621754,62.003727],[132.623611,62.004007],[132.624705,62.004397],[132.626814,62.005237],[132.628384,62.005967],[132.630314,62.006697],[132.632564,62.007037],[132.638574,62.007787],[132.642114,62.008257],[132.647034,62.008877],[132.651384,62.009587],[132.653814,62.010167],[132.656194,62.010967],[132.658164,62.012357],[132.660334,62.014027],[132.663214,62.016177],[132.665974,62.018177],[132.667354,62.018947],[132.667734,62.019097],[132.670784,62.019757],[132.674004,62.020387],[132.676984,62.021087],[132.677484,62.021305],[132.68144,62.023038],[132.684284,62.024327],[132.687994,62.026027],[132.689454,62.026667],[132.691429,62.027433],[132.692742,62.02786],[132.695277,62.028561],[132.696625,62.028951],[132.697799,62.029313],[132.698619,62.029654],[132.701499,62.031155],[132.704814,62.032827],[132.708784,62.034197],[132.715334,62.036327],[132.719194,62.037417],[132.722604,62.038277],[132.7251,62.039025],[132.727604,62.039647],[132.732384,62.04083],[132.734294,62.041303],[132.74433,62.04374],[132.747179,62.044475],[132.748391,62.044826],[132.74931,62.045141],[132.750289,62.045492],[132.751417,62.04589],[132.752552,62.046225],[132.753524,62.046448],[132.755893,62.046883],[132.757194,62.047157],[132.759016,62.047584],[132.760994,62.048087],[132.762041,62.048412],[132.763077,62.048742],[132.763828,62.049008],[132.764711,62.0493],[132.765319,62.049423],[132.766051,62.049487],[132.767274,62.049547],[132.770454,62.049677],[132.772037,62.049807],[132.773258,62.049941],[132.774055,62.05011],[132.774373,62.050215],[132.774659,62.050335],[132.775162,62.050592],[132.775752,62.051029],[132.777644,62.052747],[132.778193,62.053087],[132.778574,62.053226],[132.779155,62.053375],[132.781314,62.053669],[132.782668,62.053805],[132.784925,62.053905],[132.786244,62.054007],[132.787624,62.054157],[132.788333,62.054293],[132.788895,62.054438],[132.789855,62.054727],[132.790551,62.054964],[132.791506,62.055404],[132.792314,62.055825],[132.793303,62.056435],[132.793907,62.056843],[132.794948,62.05768],[132.795384,62.057977],[132.795897,62.05829],[132.79638,62.058561],[132.797059,62.058887],[132.797701,62.059096],[132.798358,62.059245],[132.799025,62.059337],[132.799613,62.059359],[132.80186,62.05927],[132.804904,62.059108],[132.80646,62.059071],[132.807254,62.059137],[132.808474,62.059287],[132.809662,62.059583],[132.814784,62.061221],[132.818414,62.062342],[132.820326,62.062814],[132.822926,62.063407],[132.82423,62.06366],[132.825353,62.063759],[132.828344,62.063817],[132.829199,62.063846],[132.830199,62.063958],[132.834906,62.06476],[132.836192,62.065015],[132.837356,62.065469],[132.838591,62.06623],[132.840158,62.067083],[132.840624,62.067283],[132.841235,62.067457],[132.842179,62.067581],[132.844158,62.067729],[132.846165,62.06778],[132.847034,62.067769],[132.849176,62.067729],[132.851256,62.067742],[132.853846,62.067855],[132.85653,62.067852],[132.858865,62.067841],[132.860199,62.067855],[132.860993,62.067911],[132.861601,62.067965],[132.862184,62.068075],[132.862668,62.068224],[132.863137,62.068399],[132.863533,62.068589],[132.865194,62.069471],[132.865797,62.069674],[132.866496,62.069834],[132.86784,62.070044],[132.875874,62.070924],[132.88272,62.071612],[132.885499,62.07191],[132.886214,62.07201],[132.886687,62.072104],[132.887175,62.072248],[132.8875,62.072382],[132.888077,62.072657],[132.891563,62.074763],[132.892162,62.075135],[132.892719,62.07545],[132.893464,62.075704],[132.894097,62.075842],[132.897427,62.076447],[132.900709,62.077084],[132.90453,62.077856],[132.905217,62.078013],[132.905821,62.07821],[132.906422,62.078489],[132.911165,62.081112],[132.912276,62.081752],[132.913086,62.082154],[132.914247,62.082626],[132.915369,62.083007],[132.918157,62.083827],[132.921974,62.085083],[132.923792,62.085711],[132.924446,62.085998],[132.92786,62.087763],[132.92946,62.088656],[132.929871,62.088938],[132.93019,62.089307],[132.930922,62.090426],[132.931257,62.090811],[132.932366,62.091923],[132.932683,62.092519],[132.933037,62.0934],[132.93334,62.093721],[132.933785,62.093985],[132.934443,62.094262],[132.937065,62.094904],[132.939594,62.095617],[132.940321,62.095877],[132.940827,62.096087],[132.941377,62.09642],[132.941781,62.096776],[132.942976,62.098111],[132.943432,62.098599],[132.943926,62.098962],[132.944694,62.099444],[132.945454,62.099866],[132.946229,62.100202],[132.947185,62.100532],[132.951114,62.101488],[132.958877,62.103397],[132.972328,62.106754],[132.973399,62.107027],[132.975068,62.107516],[132.975765,62.107795],[132.976315,62.108129],[132.982274,62.112883],[132.985013,62.115196],[132.987147,62.117656],[132.987534,62.118011],[132.988062,62.118311],[132.988874,62.118669],[132.989784,62.119011],[132.990365,62.119229],[132.993676,62.120474],[132.994374,62.120684],[132.994958,62.120842],[132.996598,62.121149],[133.004074,62.122411],[133.009198,62.123268],[133.010186,62.123373],[133.011062,62.123445],[133.012219,62.123499],[133.019879,62.123699],[133.023599,62.123782],[133.024876,62.123788],[133.025909,62.123751],[133.026571,62.123693],[133.027243,62.12359],[133.028368,62.123293],[133.029604,62.123045],[133.03009,62.123011],[133.030759,62.123014],[133.031587,62.123065],[133.058725,62.125338],[133.061491,62.125596],[133.062534,62.125748],[133.063251,62.125996],[133.064074,62.126432],[133.065024,62.127231],[133.065912,62.128085],[133.067779,62.130405],[133.068444,62.130959],[133.069111,62.131251],[133.069723,62.131512],[133.070625,62.131817],[133.071908,62.132136],[133.073843,62.132483],[133.091316,62.135459],[133.104733,62.137635],[133.10781,62.138301],[133.110108,62.138957],[133.112679,62.13953],[133.11543,62.140012],[133.118231,62.140433],[133.120822,62.14079],[133.12214,62.140926],[133.123515,62.14093],[133.127284,62.140786],[133.129501,62.140748],[133.130321,62.140786],[133.131076,62.140887],[133.131841,62.141024],[133.134626,62.141787],[133.135891,62.142325],[133.137097,62.142953],[133.139044,62.144046],[133.140187,62.14458],[133.141327,62.144998],[133.150198,62.147929],[133.155476,62.149694],[133.15613,62.150005],[133.156741,62.150352],[133.159121,62.152175],[133.159464,62.152439],[133.164555,62.156366],[133.165129,62.156756],[133.165692,62.157102],[133.166267,62.157331],[133.167308,62.157634],[133.168386,62.157921],[133.174981,62.159731],[133.181027,62.161351],[133.181357,62.161467],[133.181767,62.161663],[133.182065,62.161874],[133.182337,62.162206],[133.184304,62.164797],[133.186028,62.167285],[133.186351,62.167615],[133.186723,62.167888],[133.187558,62.168484],[133.194129,62.173015],[133.196091,62.174325],[133.196588,62.174716],[133.196951,62.17505],[133.197227,62.175362],[133.197366,62.175854],[133.197424,62.176261],[133.197816,62.17902],[133.197945,62.179339],[133.198011,62.179502],[133.198255,62.179895],[133.198651,62.180307],[133.199504,62.181008],[133.199659,62.181099],[133.200288,62.18147],[133.201741,62.182281],[133.206209,62.184753],[133.206459,62.184892],[133.209331,62.186481],[133.209414,62.186527],[133.210462,62.187097],[133.211344,62.187577],[133.213282,62.188681],[133.213796,62.188914],[133.213942,62.18898],[133.214557,62.189212],[133.21578,62.189593],[133.218588,62.190425],[133.220488,62.190989],[133.222387,62.191552],[133.224394,62.192147],[133.227184,62.193027],[133.230354,62.193997],[133.231231,62.194282],[133.231967,62.194565],[133.23247,62.194778],[133.233534,62.195237],[133.234146,62.195556],[133.234434,62.195796],[133.234759,62.196161],[133.235205,62.196772],[133.235515,62.197328],[133.236055,62.198707],[133.236524,62.200219],[133.236943,62.201678],[133.237062,62.202385],[133.237374,62.203117],[133.237749,62.203907],[133.23809,62.204456],[133.238553,62.204928],[133.239033,62.205366],[133.239538,62.205758],[133.240551,62.206462],[133.241961,62.207324],[133.244641,62.208924],[133.245795,62.209577],[133.246961,62.210125],[133.247972,62.21056],[133.249763,62.211255],[133.253934,62.212877],[133.254926,62.213312],[133.256036,62.213951],[133.256392,62.21426],[133.256878,62.214785],[133.257277,62.215301],[133.257602,62.2156],[133.258144,62.216072],[133.258986,62.216645],[133.259496,62.216892],[133.260482,62.21724],[133.261252,62.21749],[133.262817,62.217998],[133.269194,62.220067],[133.27222,62.221047],[133.274011,62.221563],[133.27511,62.221756],[133.276747,62.221987],[133.278779,62.222251],[133.279968,62.222519],[133.280731,62.222766],[133.280854,62.222806],[133.281892,62.223221],[133.283822,62.224106],[133.284624,62.224609],[133.285389,62.225241],[133.286383,62.226438],[133.28874,62.229446],[133.290382,62.23177],[133.291183,62.232665],[133.291759,62.233177],[133.292226,62.233493],[133.292602,62.23369],[133.293147,62.233889],[133.294252,62.23419],[133.298956,62.23527],[133.299898,62.235483],[133.300522,62.235652],[133.301118,62.235862],[133.301571,62.236058],[133.304214,62.237337],[133.305567,62.23819],[133.305973,62.238502],[133.306292,62.238775],[133.306691,62.239177],[133.309194,62.243437],[133.310334,62.245427],[133.3111,62.246758],[133.311372,62.247019],[133.311691,62.247242],[133.312137,62.247482],[133.314726,62.248701],[133.316564,62.249561],[133.31786,62.250089],[133.32055,62.250987],[133.321494,62.251283],[133.322232,62.251496],[133.323076,62.251693],[133.324235,62.251904],[133.328994,62.252641],[133.333764,62.253417],[133.334974,62.253633],[133.335688,62.253802],[133.336153,62.253957],[133.336872,62.254248],[133.338444,62.255047],[133.341784,62.256827],[133.343549,62.25787],[133.344164,62.258171],[133.344719,62.258382],[133.345246,62.258556],[133.346145,62.258776],[133.349084,62.259493],[133.353691,62.26061],[133.355004,62.260931],[133.355694,62.261083],[133.356409,62.261172],[133.358244,62.261327],[133.372511,62.261953],[133.37342,62.261966],[133.374149,62.261906],[133.374764,62.261757],[133.378246,62.260295],[133.379198,62.259871],[133.380048,62.259576],[133.38073,62.259431],[133.381391,62.259349],[133.384301,62.259089],[133.385341,62.258992],[133.38605,62.258988],[133.386504,62.259017],[133.38717,62.259147],[133.388604,62.259527],[133.39219,62.260609],[133.392696,62.26085],[133.393012,62.261103],[133.39341,62.261448],[133.394757,62.262811],[133.395534,62.263517],[133.396375,62.26417],[133.397117,62.264641],[133.397829,62.265008],[133.399404,62.265689],[133.400489,62.26624],[133.401314,62.266717],[133.403733,62.268308],[133.406452,62.270093],[133.408102,62.271121],[133.409554,62.271907],[133.411374,62.272727],[133.412104,62.272987],[133.41282,62.273265],[133.413694,62.273517],[133.414725,62.273651],[133.415593,62.273716],[133.416564,62.273737],[133.419784,62.273777],[133.423624,62.273797],[133.424914,62.273867],[133.426281,62.273972],[133.427464,62.274117],[133.429124,62.274527],[133.430528,62.275047],[133.431654,62.275577],[133.433734,62.276927],[133.436004,62.278477],[133.438214,62.279887],[133.439373,62.280566],[133.439833,62.280734],[133.440338,62.280871],[133.44092,62.280966],[133.441847,62.281079],[133.444414,62.281247],[133.448044,62.281397],[133.452356,62.281623],[133.453707,62.281719],[133.454851,62.281817],[133.455814,62.281924],[133.457005,62.282117],[133.457958,62.282301],[133.459105,62.282541],[133.460227,62.282854],[133.46266,62.283615],[133.463946,62.284045],[133.465245,62.284379],[133.467143,62.284817],[133.469292,62.2854],[133.470258,62.285631],[133.471044,62.28576],[133.472587,62.285943],[133.475155,62.286173],[133.480884,62.286545],[133.482184,62.28662],[133.483104,62.28674],[133.483978,62.286927],[133.487939,62.288033],[133.48949,62.288372],[133.492268,62.289059],[133.49237,62.289086],[133.49348,62.289381],[133.495746,62.290075],[133.497556,62.290716],[133.500204,62.291547],[133.501607,62.291967],[133.503836,62.292674],[133.504411,62.292864],[133.504804,62.293069],[133.505048,62.293237],[133.505455,62.293556],[133.505919,62.293978],[133.507224,62.295467],[133.509204,62.297397],[133.511714,62.299187],[133.515054,62.301027],[133.518084,62.302727],[133.519547,62.303589],[133.520314,62.304227],[133.520784,62.304737],[133.521234,62.305603],[133.52148,62.306317],[133.521925,62.307095],[133.522193,62.307516],[133.522634,62.30794],[133.523369,62.308372],[133.524194,62.308667],[133.527974,62.309807],[133.531194,62.310648],[133.532314,62.310967],[133.533495,62.311438],[133.534433,62.311852],[133.534965,62.312177],[133.535592,62.312673],[133.53604,62.313161],[133.536335,62.313564],[133.537704,62.315381],[133.537904,62.31589],[133.538121,62.317342],[133.537964,62.317832],[133.536017,62.319811],[133.535634,62.320317],[133.535195,62.321277],[133.535111,62.321726],[133.535265,62.322162],[133.535509,62.32262],[133.535725,62.322928],[133.536133,62.323337],[133.537434,62.324397],[133.539297,62.325848],[133.539754,62.326257],[133.539884,62.326417],[133.540177,62.327151],[133.540358,62.327734],[133.540394,62.328237],[133.540224,62.328857],[133.539839,62.329429],[133.538715,62.330417],[133.538144,62.331007],[133.537257,62.331972],[133.536586,62.332759],[133.53642,62.333385],[133.536464,62.333948],[133.537004,62.335957],[133.537584,62.337977],[133.537864,62.339077],[133.537904,62.339199],[133.538234,62.340207],[133.538332,62.341086],[133.538271,62.341269],[133.538045,62.341514],[133.537645,62.341807],[133.537211,62.342074],[133.536272,62.342697],[133.535203,62.343357],[133.534102,62.344107],[133.533153,62.344771],[133.530654,62.346407],[133.529524,62.347057],[133.527784,62.347737],[133.524734,62.348597],[133.520484,62.349757],[133.517437,62.350622],[133.515551,62.351212],[133.51489,62.351476],[133.514356,62.351765],[133.513951,62.352168],[133.51365,62.352618],[133.513489,62.352953],[133.513406,62.353526],[133.513495,62.354074],[133.513856,62.355092],[133.516344,62.360297],[133.517054,62.361707],[133.517224,62.362157],[133.518219,62.364287],[133.518664,62.365447],[133.519434,62.367077],[133.522094,62.372867],[133.522894,62.374757],[133.5237,62.376319],[133.523989,62.376688],[133.524267,62.376946],[133.524629,62.377223],[133.525575,62.37755],[133.528263,62.378281],[133.529514,62.378526],[133.537864,62.379757],[133.543214,62.380617],[133.544434,62.380847],[133.547714,62.381537],[133.551534,62.382267],[133.555034,62.382957],[133.557025,62.383333],[133.558752,62.383756],[133.560001,62.38423],[133.561153,62.384687],[133.562435,62.385368],[133.56391,62.386353],[133.564853,62.387295],[133.565444,62.388037],[133.565989,62.38904],[133.566644,62.390247],[133.567694,62.391797],[133.569384,62.393447],[133.570204,62.394607],[133.570764,62.396557],[133.571644,62.398677],[133.572804,62.400677],[133.574564,62.402717],[133.575538,62.404021],[133.575954,62.404817],[133.576514,62.407527],[133.577228,62.410637],[133.577852,62.411651],[133.578594,62.412547],[133.580744,62.414477],[133.583074,62.416387],[133.584598,62.417616],[133.585412,62.418433],[133.586044,62.41924],[133.586704,62.420337],[133.587111,62.42114],[133.587238,62.421693],[133.587244,62.422137],[133.586894,62.424777],[133.586494,62.427497],[133.586124,62.430287],[133.585967,62.432113],[133.586314,62.434577],[133.586435,62.435199],[133.586794,62.437047],[133.587454,62.440567],[133.587714,62.443057],[133.588074,62.445737],[133.590504,62.450117],[133.591064,62.451917],[133.591984,62.454147],[133.593374,62.455247],[133.595844,62.456877],[133.598294,62.458437],[133.601444,62.460397],[133.604024,62.462177],[133.607044,62.464407],[133.608952,62.466258],[133.609703,62.467034],[133.610244,62.467667],[133.610462,62.468505],[133.610994,62.470697],[133.611214,62.472367],[133.610966,62.473156],[133.610546,62.474087],[133.609274,62.476637],[133.608557,62.478682],[133.608354,62.480757],[133.608344,62.482907],[133.608384,62.483346],[133.60852,62.483697],[133.608874,62.484297],[133.609551,62.484883],[133.610454,62.485587],[133.616724,62.490217],[133.61822,62.491414],[133.619024,62.492107],[133.619286,62.492717],[133.619364,62.493267],[133.619142,62.493878],[133.618614,62.494637],[133.616828,62.496994],[133.615509,62.498852],[133.613954,62.501657],[133.613072,62.503397],[133.612664,62.504057],[133.611541,62.505483],[133.611291,62.50606],[133.611104,62.506807],[133.610734,62.509057],[133.609964,62.511207],[133.609864,62.511804],[133.609897,62.512213],[133.61005,62.512538],[133.610544,62.513287],[133.611684,62.514787],[133.613204,62.516617],[133.615784,62.518737],[133.618164,62.520287],[133.620754,62.522277],[133.621894,62.523677],[133.622304,62.525127],[133.622584,62.526767],[133.623034,62.528717],[133.623674,62.530887],[133.623789,62.531788],[133.623744,62.532577],[133.622814,62.534747],[133.621814,62.536737],[133.621542,62.53773],[133.621504,62.538567],[133.622664,62.540877],[133.623184,62.542297],[133.623094,62.543867],[133.621814,62.545727],[133.620564,62.547127],[133.619944,62.548307],[133.619254,62.551847],[133.618994,62.552897],[133.617774,62.554267],[133.616014,62.555987],[133.614234,62.557807],[133.612664,62.558817],[133.609364,62.560647],[133.607754,62.561847],[133.605804,62.563627],[133.603764,62.565237],[133.603026,62.565583],[133.601944,62.565837],[133.598274,62.566587],[133.597394,62.566867],[133.5968,62.567208],[133.596494,62.567577],[133.596034,62.569487],[133.595734,62.571497],[133.596064,62.573067],[133.597604,62.575197],[133.598504,62.576027],[133.600224,62.577127],[133.604574,62.579317],[133.60513,62.579729],[133.606164,62.580497],[133.607514,62.582207],[133.609254,62.584527],[133.610674,62.586347],[133.612114,62.588257],[133.614794,62.591777],[133.614874,62.591927],[133.61502,62.592703],[133.614904,62.593327],[133.614794,62.595257],[133.615174,62.597317],[133.615734,62.599457],[133.616204,62.601627],[133.616834,62.603757],[133.617384,62.604937],[133.618144,62.606217],[133.619084,62.607467],[133.620884,62.609247],[133.622884,62.611007],[133.624104,62.612117],[133.624722,62.612873],[133.625134,62.613497],[133.625192,62.614295],[133.625207,62.615476],[133.625154,62.616687],[133.625094,62.618197],[133.624684,62.619607],[133.624174,62.620597],[133.623874,62.621027],[133.623034,62.622597],[133.622551,62.62355],[133.622421,62.624155],[133.622473,62.624719],[133.622751,62.625449],[133.623163,62.626823],[133.623637,62.627763],[133.624501,62.629354],[133.625295,62.630923],[133.626349,62.632807],[133.626476,62.633079],[133.627151,62.634246],[133.627751,62.635384],[133.628285,62.636724],[133.628372,62.637421],[133.628231,62.637748],[133.627338,62.638729],[133.626032,62.640024],[133.625494,62.640635],[133.625149,62.641323],[133.62502,62.641726],[133.624942,62.642237],[133.625073,62.642826],[133.625268,62.643391],[133.625422,62.643822],[133.626441,62.645093],[133.627169,62.64591],[133.628315,62.647261],[133.629469,62.648537],[133.631084,62.650195],[133.631511,62.650384],[133.631904,62.650399],[133.632305,62.650373],[133.632683,62.650352],[133.633777,62.650172],[133.634853,62.649938],[133.635806,62.649692],[133.636521,62.649476],[133.638334,62.648917],[133.641021,62.64811],[133.643071,62.647518],[133.644185,62.647309],[133.645038,62.647218],[133.645899,62.647183],[133.646968,62.647199],[133.648672,62.647274],[133.653083,62.647524],[133.656159,62.647709],[133.659038,62.647903],[133.660358,62.647982],[133.665794,62.648217],[133.670584,62.648407],[133.672827,62.648498],[133.673924,62.648508],[133.675101,62.648438],[133.676489,62.648261],[133.678657,62.647921],[133.681784,62.647337],[133.686264,62.646497],[133.692574,62.645227],[133.697964,62.644197],[133.702554,62.643107],[133.706284,62.641927],[133.712393,62.639763],[133.714504,62.639104],[133.716224,62.638537],[133.717433,62.638248],[133.718774,62.638087],[133.723174,62.638017],[133.728571,62.637916],[133.731398,62.63784],[133.733344,62.637717],[133.735336,62.637487],[133.738364,62.637117],[133.742704,62.636627],[133.744575,62.636465],[133.746324,62.636367],[133.751138,62.636258],[133.755238,62.636132],[133.757238,62.636037],[133.758593,62.635851],[133.761154,62.635207],[133.763853,62.634383],[133.765494,62.633987],[133.766768,62.633766],[133.768273,62.633718],[133.772424,62.633857],[133.778704,62.634177],[133.782225,62.634442],[133.784582,62.634737],[133.786521,62.635135],[133.788046,62.635488],[133.792524,62.636857],[133.793302,62.63711],[133.799304,62.639067],[133.812688,62.643269],[133.819114,62.645377],[133.820791,62.645921],[133.823764,62.646887],[133.828034,62.648237],[133.831671,62.649359],[133.835184,62.650527],[133.839564,62.651967],[133.850224,62.655657],[133.852983,62.656626],[133.854324,62.657097],[133.857584,62.658187],[133.86085,62.659184],[133.865614,62.660807],[133.866554,62.661121],[133.869024,62.661947],[133.873534,62.663407],[133.875764,62.664157],[133.878928,62.6651],[133.881037,62.665855],[133.881729,62.666154],[133.882225,62.666428],[133.882607,62.666699],[133.883076,62.667083],[133.883856,62.667908],[133.885705,62.669537],[133.886314,62.670039],[133.886669,62.670295],[133.887201,62.670592],[133.888137,62.671047],[133.894924,62.674437],[133.898317,62.675996],[133.899696,62.676586],[133.900714,62.676972],[133.901911,62.677296],[133.903538,62.67764],[133.906165,62.678153],[133.916834,62.680117],[133.921894,62.681067],[133.925754,62.681747],[133.930504,62.682607],[133.934684,62.683337],[133.937399,62.683654],[133.941804,62.684067],[133.947044,62.684537],[133.950344,62.684817],[133.963714,62.686047],[133.968584,62.686517],[133.974334,62.687047],[133.979594,62.687497],[133.983924,62.687887],[133.987814,62.688207],[133.992444,62.688617],[134.004317,62.689663],[134.009824,62.690168],[134.012229,62.690387],[134.015799,62.690661],[134.017904,62.69083],[134.019265,62.690995],[134.021299,62.691295],[134.023088,62.691718],[134.02519,62.692376],[134.026454,62.692858],[134.028686,62.693763],[134.031993,62.695139],[134.03618,62.69687],[134.042826,62.699641],[134.04875,62.70205],[134.050286,62.702705],[134.051392,62.703144],[134.052578,62.70346],[134.053955,62.70374],[134.055503,62.703942],[134.058883,62.704235],[134.062532,62.704556],[134.064252,62.704718],[134.065798,62.704926],[134.067088,62.7052],[134.068022,62.70546],[134.06873,62.705717],[134.069668,62.70619],[134.070513,62.706733],[134.073514,62.708827],[134.075369,62.710251],[134.076481,62.710927],[134.077688,62.711438],[134.079127,62.711936],[134.080324,62.712241],[134.081771,62.712513],[134.086024,62.713017],[134.089264,62.713297],[134.093404,62.713677],[134.098144,62.714157],[134.103772,62.714725],[134.109998,62.715346],[134.112691,62.715676],[134.114438,62.715962],[134.115923,62.716294],[134.120151,62.71741],[134.124025,62.718471],[134.127019,62.71929],[134.127693,62.719474],[134.128944,62.719817],[134.131236,62.720804],[134.132524,62.721857],[134.132827,62.722502],[134.132884,62.723117],[134.132654,62.724757],[134.131794,62.730357],[134.131878,62.730992],[134.132184,62.731557],[134.132614,62.732027],[134.133507,62.732519],[134.134514,62.732907],[134.134944,62.733037],[134.136358,62.73324],[134.137584,62.733267],[134.139017,62.733193],[134.140484,62.732997],[134.144494,62.732387],[134.149964,62.731597],[134.162035,62.729818],[134.167674,62.729054],[134.169419,62.729003],[134.171165,62.729022],[134.173004,62.72919],[134.174988,62.729463],[134.17679,62.729832],[134.178114,62.730267],[134.180983,62.73148],[134.184611,62.733092],[134.187132,62.734211],[134.188673,62.73489],[134.19047,62.735546],[134.19191,62.735892],[134.193603,62.736263],[134.195414,62.736637],[134.196825,62.736766],[134.198144,62.736807],[134.201294,62.736707],[134.20151,62.736683],[134.204874,62.736317],[134.213264,62.735137],[134.217514,62.734477],[134.219238,62.734108],[134.220674,62.733677],[134.221624,62.73334],[134.222625,62.732897],[134.223415,62.732411],[134.228954,62.728657],[134.230067,62.728086],[134.231659,62.727427],[134.23286,62.727056],[134.234503,62.726693],[134.236187,62.726463],[134.238102,62.726298],[134.239749,62.726259],[134.241455,62.726315],[134.24499,62.726465],[134.246525,62.726424],[134.247925,62.726301],[134.249424,62.726087],[134.251181,62.725711],[134.252574,62.725307],[134.254914,62.724237],[134.256844,62.722797],[134.259184,62.720097],[134.261204,62.717867],[134.263484,62.716057],[134.266294,62.714497],[134.267454,62.713917],[134.267984,62.713677],[134.269484,62.713097],[134.271694,62.712367],[134.275644,62.711317],[134.283954,62.709197],[134.294334,62.706537],[134.300688,62.704898],[134.302814,62.704407],[134.305825,62.703807],[134.308174,62.703427],[134.310488,62.703116],[134.313284,62.702847],[134.315104,62.702704],[134.318434,62.702547],[134.323964,62.702437],[134.348624,62.701897],[134.348959,62.701889],[134.358084,62.701687],[134.367724,62.701447],[134.371434,62.701387],[134.379154,62.701187],[134.384204,62.701087],[134.388514,62.700957],[134.392844,62.700887],[134.399524,62.700717],[134.400741,62.700589],[134.402286,62.700195],[134.403214,62.699797],[134.403884,62.699329],[134.406084,62.697587],[134.407768,62.696077],[134.408338,62.695608],[134.409301,62.694786],[134.410484,62.693957],[134.412714,62.692797],[134.413849,62.692222],[134.414825,62.691727],[134.420149,62.689016],[134.421284,62.68869],[134.422947,62.688396],[134.42828,62.687462],[134.437394,62.685787],[134.43881,62.685573],[134.440209,62.685527],[134.442991,62.685646],[134.454439,62.686143],[134.45696,62.686242],[134.458344,62.686232],[134.459324,62.686167],[134.460168,62.686055],[134.461906,62.685626],[134.467524,62.684157],[134.471614,62.683037],[134.476444,62.681707],[134.483874,62.679627],[134.485112,62.679358],[134.486854,62.679107],[134.491484,62.678447],[134.501615,62.676967],[134.510394,62.675637],[134.516014,62.674777],[134.521405,62.673937],[134.533014,62.672077],[134.53619,62.671513],[134.537212,62.671247],[134.538089,62.670915],[134.538898,62.670461],[134.54135,62.668944],[134.546055,62.665957],[134.548824,62.664217],[134.54963,62.663688],[134.550601,62.663139],[134.551905,62.662609],[134.555905,62.661297],[134.561445,62.659457],[134.565694,62.658037],[134.570045,62.656537],[134.574125,62.655167],[134.576315,62.654457],[134.577424,62.654247],[134.579854,62.654137],[134.583004,62.654627],[134.587984,62.655577],[134.595284,62.656927],[134.603525,62.658427],[134.621225,62.661577],[134.62384,62.66202],[134.624874,62.662221],[134.626048,62.662509],[134.62704,62.662813],[134.627989,62.663021],[134.628648,62.663169],[134.629314,62.663257],[134.630039,62.663297],[134.631121,62.66327],[134.631912,62.663215],[134.632926,62.663136],[134.633934,62.662994],[134.634609,62.662881],[134.635737,62.662598],[134.639103,62.661584],[134.643466,62.660268],[134.645339,62.659706],[134.6462,62.659444],[134.646863,62.659258],[134.647592,62.659099],[134.648215,62.658998],[134.649305,62.658895],[134.650345,62.658846],[134.651236,62.658832],[134.652265,62.658875],[134.653416,62.659009],[134.655131,62.659237],[134.657166,62.659519],[134.658366,62.659697],[134.659177,62.659858],[134.660118,62.660138],[134.661261,62.6605],[134.66177,62.660708],[134.662047,62.660906],[134.663242,62.661853],[134.6651,62.663423],[134.665924,62.664059],[134.666236,62.664341],[134.666526,62.664553],[134.666943,62.664806],[134.667275,62.664927],[134.667749,62.665018],[134.668292,62.665028],[134.668974,62.664968],[134.67179,62.664482],[134.674392,62.664024],[134.677296,62.663486],[134.677896,62.66338],[134.678381,62.663332],[134.678855,62.6633],[134.679443,62.663305],[134.681628,62.663467],[134.685343,62.663782],[134.689811,62.664095],[134.690914,62.664136],[134.691623,62.664154],[134.692211,62.664132],[134.692854,62.664047],[134.693398,62.663943],[134.693901,62.663818],[134.694444,62.663674],[134.697774,62.662669],[134.700276,62.661907],[134.701458,62.661471],[134.703684,62.66058],[134.704945,62.660055],[134.706538,62.659377],[134.707496,62.658984],[134.708269,62.658719],[134.708725,62.658597],[134.711259,62.658019],[134.714522,62.657247],[134.717343,62.656588],[134.718024,62.656429],[134.718601,62.65627],[134.71904,62.656116],[134.719467,62.655914],[134.720074,62.655589],[134.720979,62.654992],[134.722353,62.654053],[134.722714,62.653861],[134.723069,62.653703],[134.723471,62.653599],[134.724075,62.653479],[134.725078,62.653353],[134.725577,62.653306],[134.728728,62.653183],[134.729307,62.653149],[134.729781,62.653108],[134.730152,62.653062],[134.732311,62.652635],[134.733821,62.65232],[134.734254,62.652219],[134.734695,62.652099],[134.734989,62.651998],[134.735234,62.651859],[134.735445,62.65169],[134.736399,62.650809],[134.737576,62.649969],[134.738205,62.649582],[134.73858,62.649376],[134.738974,62.649205],[134.739302,62.649092],[134.739711,62.648973],[134.740164,62.64887],[134.741176,62.648739],[134.74325,62.64851],[134.744688,62.648341],[134.748164,62.647947],[134.751695,62.647528],[134.753781,62.647263],[134.758931,62.646391],[134.762412,62.645851],[134.7632,62.645716],[134.763837,62.645592],[134.764563,62.645449],[134.765379,62.645273],[134.766457,62.645029],[134.767428,62.644785],[134.767951,62.644647],[134.768457,62.644493],[134.769281,62.644204],[134.770209,62.643849],[134.773444,62.642509],[134.776878,62.641041],[134.781097,62.639246],[134.783093,62.638378],[134.783648,62.638138],[134.783934,62.638018],[134.784277,62.637887],[134.78466,62.637767],[134.785066,62.637657],[134.785598,62.637544],[134.786971,62.63726],[134.788089,62.637054],[134.788995,62.636915],[134.789999,62.636816],[134.792309,62.636607],[134.793542,62.636495],[134.795186,62.636378],[134.796047,62.636366],[134.796559,62.636394],[134.797013,62.636462],[134.797402,62.636547],[134.797922,62.636696],[134.798741,62.636919],[134.799307,62.63703],[134.799844,62.637092],[134.800634,62.637126],[134.802085,62.637187],[134.803114,62.637187],[134.804854,62.636647],[134.808824,62.634947],[134.811661,62.633861],[134.814117,62.632978],[134.815501,62.632597],[134.817556,62.632268],[134.823835,62.631411],[134.827072,62.630948],[134.828052,62.630817],[134.826754,62.631573],[134.826655,62.631904],[134.826799,62.63197],[134.825726,62.632512],[134.82564,62.632848],[134.826155,62.633143],[134.827313,62.633439],[134.830275,62.633775],[134.833788,62.633794],[134.846025,62.633242],[134.871173,62.634544],[134.890828,62.63626],[134.906836,62.638075],[134.923658,62.640797],[134.937306,62.64342],[134.959149,62.649276],[134.968634,62.650439],[134.977946,62.650873],[134.98786,62.650459],[134.99464,62.649789],[134.999104,62.649454],[135.006442,62.648488],[135.011292,62.647778],[135.015216,62.647466],[135.015626,62.64762],[135.016371,62.647196],[135.01649,62.64691],[135.017179,62.646764],[135.017395,62.646651],[135.018712,62.646408],[135.0214,62.646019],[135.025711,62.645826],[135.028409,62.645575],[135.029251,62.645402],[135.029502,62.645378],[135.029734,62.645399],[135.029799,62.645563],[135.029893,62.645881],[135.030184,62.646445],[135.030171,62.646634],[135.0301,62.646816],[135.029766,62.647043],[135.029443,62.647195],[135.028944,62.647537],[135.027997,62.648186],[135.026279,62.649035],[135.025685,62.649459],[135.025441,62.649899],[135.025234,62.650163],[135.023309,62.652612],[135.023254,62.652802],[135.023326,62.652959],[135.023702,62.653243],[135.023918,62.653436],[135.02429,62.653646],[135.025031,62.653928],[135.025812,62.654175],[135.026133,62.654315],[135.026281,62.654496],[135.026237,62.654653],[135.026099,62.654785],[135.025675,62.6549],[135.02489,62.655082],[135.024199,62.65533],[135.023557,62.655688],[135.022306,62.656814],[135.02093,62.658595],[135.017892,62.662888],[135.017405,62.663697],[135.017312,62.664147],[135.017315,62.664391],[135.017384,62.66462],[135.017916,62.666475],[135.018696,62.668126],[135.019121,62.66844],[135.019483,62.668707],[135.019952,62.669054],[135.020365,62.669321],[135.02067,62.66949],[135.021693,62.669986],[135.023262,62.670665],[135.024163,62.671236],[135.02636,62.673117],[135.026794,62.673488],[135.029097,62.674777],[135.030493,62.675213],[135.031887,62.675561],[135.034743,62.675702],[135.037908,62.675805],[135.040002,62.676092],[135.041535,62.676666],[135.045371,62.678212],[135.048881,62.67958],[135.05277,62.680664],[135.06927,62.68436],[135.071771,62.684675],[135.077288,62.684874],[135.080188,62.685175],[135.08583,62.686547],[135.089206,62.687039],[135.091084,62.687191],[135.095252,62.686687],[135.099785,62.686065],[135.103421,62.685262],[135.106177,62.684817],[135.108332,62.684925],[135.113172,62.685642],[135.116281,62.685938],[135.120249,62.685615],[135.124282,62.685116],[135.127375,62.684924],[135.130755,62.685091],[135.13712,62.685642],[135.146695,62.685897],[135.147835,62.685747],[135.148975,62.685377],[135.151635,62.683617],[135.152454,62.681855],[135.153104,62.680963],[135.156765,62.678957],[135.160345,62.676987],[135.162083,62.676386],[135.163785,62.676257],[135.166281,62.676259],[135.168926,62.676221],[135.170943,62.676103],[135.172535,62.675657],[135.175515,62.674387],[135.180235,62.672267],[135.181205,62.671747],[135.182024,62.670797],[135.18249,62.668677],[135.182982,62.665734],[135.183455,62.665147],[135.184225,62.664497],[135.187595,62.663017],[135.191585,62.661947],[135.198345,62.660187],[135.204015,62.658937],[135.207028,62.658308],[135.208146,62.658178],[135.208939,62.658146],[135.210029,62.658168],[135.211487,62.658263],[135.213044,62.658406],[135.215126,62.658627],[135.217249,62.658894],[135.218622,62.659089],[135.218962,62.65918],[135.219231,62.659271],[135.219458,62.659401],[135.219656,62.65957],[135.221905,62.663487],[135.223007,62.665287],[135.223755,62.666257],[135.224802,62.666902],[135.227334,62.667394],[135.233455,62.668057],[135.241845,62.668857],[135.249435,62.669607],[135.259455,62.670697],[135.277525,62.672567],[135.285655,62.673407],[135.296215,62.674457],[135.299889,62.674813],[135.313199,62.674176],[135.319135,62.673837],[135.332205,62.672977],[135.341535,62.672377],[135.349939,62.671908],[135.355865,62.671557],[135.360473,62.671292],[135.367681,62.670884],[135.375287,62.670375],[135.378782,62.670162],[135.38358,62.670338],[135.39419,62.672274],[135.399875,62.673107],[135.409,62.673722],[135.409781,62.673775],[135.416682,62.674226],[135.425046,62.674749],[135.4338,62.675334],[135.446323,62.676061],[135.450918,62.676313],[135.452974,62.676224],[135.45583,62.675775],[135.461609,62.674645],[135.467364,62.673642],[135.467855,62.673557],[135.471894,62.672733],[135.474655,62.672157],[135.476475,62.671794],[135.481111,62.671027],[135.485325,62.670097],[135.48644,62.669719],[135.488865,62.668897],[135.493495,62.667307],[135.495488,62.666726],[135.495984,62.666582],[135.498344,62.665976],[135.50213,62.665527],[135.503031,62.665432],[135.50653,62.665302],[135.513844,62.66513],[135.515716,62.665086],[135.519655,62.664993],[135.521147,62.664951],[135.524219,62.664644],[135.526788,62.664341],[135.529207,62.66398],[135.534435,62.662977],[135.540467,62.661766],[135.54196,62.661174],[135.543155,62.660297],[135.54356,62.659947],[135.547757,62.659844],[135.549944,62.659792],[135.551533,62.659737],[135.552325,62.659619],[135.553143,62.659458],[135.553671,62.659291],[135.554171,62.659085],[135.555517,62.658397],[135.556161,62.658029],[135.556936,62.657596],[135.55733,62.657382],[135.558238,62.656878],[135.558883,62.65652],[135.562008,62.655011],[135.563671,62.654215],[135.565317,62.653487],[135.566592,62.65297],[135.567544,62.652574],[135.568018,62.652408],[135.569687,62.651811],[135.572034,62.650979],[135.574419,62.650132],[135.576795,62.649281],[135.577395,62.649067],[135.577975,62.648877],[135.579529,62.648334],[135.579916,62.648178],[135.580363,62.648062],[135.581945,62.647507],[135.582984,62.647136],[135.584415,62.646627],[135.589013,62.645027],[135.592635,62.643767],[135.596925,62.642207],[135.598295,62.641177],[135.601455,62.638687],[135.602199,62.63807],[135.603085,62.637337],[135.607722,62.633714],[135.609768,62.632116],[135.614325,62.628557],[135.616155,62.627787],[135.618485,62.627467],[135.621535,62.627487],[135.629365,62.627767],[135.635845,62.627897],[135.644065,62.628167],[135.654797,62.628497],[135.657938,62.628594],[135.662631,62.628758],[135.665518,62.62885],[135.683652,62.629399],[135.694813,62.62974],[135.714655,62.630367],[135.72035,62.630527],[135.745852,62.631365],[135.751465,62.631497],[135.760628,62.631761],[135.766525,62.631887],[135.773625,62.632117],[135.783155,62.632467],[135.789207,62.632711],[135.792076,62.63282],[135.793119,62.632839],[135.794042,62.632802],[135.794953,62.632661],[135.796135,62.632417],[135.797255,62.632017],[135.799975,62.630337],[135.803085,62.628517],[135.804075,62.628107],[135.806395,62.627587],[135.809995,62.627507],[135.816055,62.627587],[135.824225,62.627677],[135.831245,62.627787],[135.838065,62.627827],[135.846305,62.627957],[135.857055,62.628107],[135.873325,62.628277],[135.881305,62.628407],[135.888495,62.628517],[135.896925,62.628597],[135.903213,62.628643],[135.903795,62.628647],[135.914065,62.628797],[135.920825,62.628877],[135.929005,62.628967],[135.935865,62.629077],[135.943935,62.629137],[135.955335,62.629307],[135.961555,62.629377],[135.968825,62.629527],[135.974007,62.629755],[135.977826,62.630297],[135.980101,62.630736],[135.988539,62.632591],[135.993646,62.63335],[135.994681,62.633496],[136.003745,62.634777],[136.016707,62.636536],[136.038916,62.639564],[136.046405,62.640575],[136.048293,62.640816],[136.05163,62.641295],[136.058314,62.642187],[136.067252,62.643422],[136.072436,62.644142],[136.084641,62.645858],[136.096948,62.647513],[136.101905,62.648217],[136.107895,62.649587],[136.116115,62.651607],[136.123985,62.653537],[136.138065,62.656967],[136.154865,62.660877],[136.181605,62.667267],[136.190315,62.669307],[136.198985,62.671327],[136.208125,62.673507],[136.212205,62.674927],[136.217265,62.676897],[136.222305,62.678837],[136.235375,62.683837],[136.238805,62.685137],[136.244085,62.687177],[136.248785,62.688957],[136.254475,62.691147],[136.259605,62.693077],[136.264605,62.695007],[136.280285,62.700937],[136.284835,62.702677],[136.290175,62.704667],[136.296445,62.707067],[136.298865,62.707983],[136.299368,62.708174],[136.300195,62.708487],[136.305325,62.710377],[136.310115,62.711787],[136.327325,62.716017],[136.332425,62.717307],[136.340455,62.719367],[136.348225,62.721817],[136.353955,62.723597],[136.367515,62.727867],[136.373155,62.729577],[136.396175,62.736747],[136.412118,62.741751],[136.423135,62.745117],[136.432015,62.747907],[136.433139,62.748161],[136.433752,62.748273],[136.435015,62.748507],[136.436215,62.748697],[136.439135,62.748897],[136.450015,62.749447],[136.461455,62.749987],[136.468495,62.750417],[136.472825,62.751077],[136.478215,62.752307],[136.483405,62.754217],[136.487335,62.755607],[136.496045,62.758737],[136.505055,62.761827],[136.511815,62.764187],[136.517245,62.766127],[136.528705,62.770157],[136.534715,62.772257],[136.556365,62.779917],[136.562731,62.781997],[136.566078,62.782723],[136.570799,62.783277],[136.578202,62.784141],[136.591935,62.785697],[136.596644,62.786232],[136.597427,62.786428],[136.598543,62.786752],[136.600506,62.787429],[136.601783,62.787773],[136.603478,62.788057],[136.604433,62.78815],[136.605645,62.788185],[136.60777,62.788067],[136.610291,62.787935],[136.611296,62.787962],[136.617155,62.788657],[136.620945,62.789127],[136.627215,62.789837],[136.628075,62.789897],[136.638285,62.789507],[136.654405,62.788977],[136.658905,62.788717],[136.664315,62.788207],[136.670585,62.787577],[136.682185,62.786487],[136.700085,62.784747],[136.705535,62.784237],[136.711395,62.783757],[136.716825,62.783697],[136.722165,62.784037],[136.727375,62.784447],[136.738645,62.785267],[136.742855,62.785567],[136.746325,62.785797],[136.747095,62.785887],[136.747375,62.785907],[136.747675,62.785907],[136.749435,62.786017],[136.751545,62.785997],[136.759355,62.785737],[136.762205,62.785607],[136.764245,62.785567],[136.774885,62.785237],[136.776155,62.785217],[136.781495,62.785007],[136.785915,62.784877],[136.800825,62.784407],[136.802821,62.784365],[136.804215,62.784337],[136.80547,62.784292],[136.808478,62.784184],[136.809156,62.78416],[136.810761,62.784102],[136.812025,62.784057],[136.813873,62.783983],[136.815035,62.783937],[136.816259,62.783906],[136.817504,62.783874],[136.818575,62.783847],[136.819236,62.783823],[136.821045,62.783757],[136.825825,62.783637],[136.826863,62.78372],[136.83049,62.784309],[136.831815,62.784427],[136.833258,62.784407],[136.834735,62.784447],[136.836192,62.78461],[136.836771,62.784652],[136.838,62.784721],[136.844555,62.784597],[136.847395,62.784577],[136.84845,62.784775],[136.849365,62.785137],[136.852135,62.786397],[136.854865,62.787503],[136.85537,62.787729],[136.857545,62.788227],[136.861335,62.788907],[136.862301,62.789024],[136.86362,62.789112],[136.865135,62.789207],[136.867697,62.789436],[136.869028,62.789647],[136.8701,62.789858],[136.871431,62.790182],[136.872415,62.790537],[136.87274,62.790692],[136.873287,62.791016],[136.873759,62.791315],[136.874617,62.792046],[136.876302,62.793463],[136.877031,62.793895],[136.878147,62.794479],[136.881015,62.795687],[136.884595,62.796827],[136.885845,62.797147],[136.887025,62.797327],[136.890225,62.797367],[136.891595,62.797407],[136.894385,62.797927],[136.895435,62.798097],[136.899105,62.798197],[136.903055,62.798287],[136.904105,62.798377],[136.906595,62.799207],[136.911355,62.801167],[136.913805,62.802197],[136.915735,62.803227],[136.919035,62.805107],[136.919385,62.805257],[136.922235,62.806037],[136.931035,62.808327],[136.933755,62.808777],[136.943605,62.809987],[136.949855,62.810737],[136.954875,62.811357],[136.957815,62.811357],[136.960905,62.811167],[136.964465,62.810907],[136.967795,62.810687],[136.970665,62.810517],[136.975385,62.810217],[136.977255,62.810197],[136.979955,62.810707],[136.982485,62.811267],[136.984125,62.812347],[136.986735,62.814257],[136.997385,62.821847],[136.999445,62.823267],[137.000627,62.823742],[137.001845,62.824097],[137.005085,62.824657],[137.012725,62.825947],[137.022745,62.827987],[137.031735,62.829847],[137.040635,62.831717],[137.045635,62.832747],[137.050275,62.833737],[137.058195,62.835367],[137.070125,62.837787],[137.073515,62.838497],[137.077055,62.839247],[137.079715,62.839847],[137.082035,62.840537],[137.084695,62.841547],[137.091855,62.844827],[137.094285,62.845927],[137.096195,62.846757],[137.100205,62.848537],[137.105315,62.850837],[137.115185,62.855237],[137.122435,62.858387],[137.129105,62.861347],[137.133419,62.863299],[137.136251,62.864688],[137.140407,62.866524],[137.144931,62.868544],[137.149512,62.87056],[137.157623,62.874102],[137.16715,62.878484],[137.170197,62.879736],[137.178308,62.883316],[137.181827,62.884607],[137.189123,62.8867],[137.194788,62.888206],[137.199396,62.889514],[137.203575,62.890621],[137.2055,62.891205],[137.220053,62.895085],[137.235395,62.899367],[137.238175,62.900223],[137.23871,62.900445],[137.239279,62.900961],[137.239795,62.901399],[137.240125,62.902006],[137.240043,62.9026],[137.239536,62.903228],[137.238242,62.904948],[137.237443,62.906097],[137.236077,62.908114],[137.235907,62.908799],[137.236052,62.909289],[137.236282,62.909834],[137.247043,62.92089],[137.247142,62.920989],[137.249632,62.923602],[137.250373,62.924193],[137.251403,62.924671],[137.252288,62.924928],[137.253346,62.925125],[137.255131,62.92534],[137.265998,62.926639],[137.273446,62.927455],[137.278744,62.927576],[137.28607,62.927081],[137.286962,62.927021],[137.289263,62.926866],[137.293069,62.926998],[137.296128,62.927664],[137.318027,62.933562],[137.328443,62.936341],[137.328756,62.936424],[137.351917,62.942602],[137.352703,62.942765],[137.355999,62.94295],[137.362795,62.94366],[137.366127,62.944238],[137.368565,62.945139],[137.369629,62.946225],[137.370665,62.948286],[137.371221,62.949955],[137.373594,62.951934],[137.386231,62.961985],[137.386583,62.96223],[137.388117,62.963438],[137.390266,62.96517],[137.393805,62.967938],[137.397031,62.970811],[137.397918,62.972736],[137.400905,62.982171],[137.401259,62.982598],[137.402024,62.9829],[137.403829,62.98322],[137.405089,62.983351],[137.406361,62.983532],[137.407433,62.983883],[137.408463,62.984194],[137.410551,62.984443],[137.41254,62.984272],[137.414171,62.984136],[137.415172,62.984461],[137.41544,62.985166],[137.415155,62.986284],[137.415212,62.98723],[137.415102,62.987589],[137.413986,62.989299],[137.413391,62.990762],[137.413245,62.992215],[137.413277,62.994312],[137.414133,62.995852],[137.414439,62.997481],[137.414384,63.00087],[137.414605,63.001685],[137.415257,63.002268],[137.416178,63.002626],[137.417341,63.002901],[137.41819,63.002992],[137.420476,63.003221],[137.428062,63.004074],[137.429207,63.004177],[137.433276,63.003983],[137.434577,63.004118],[137.437845,63.004903],[137.439774,63.005242],[137.442811,63.005508],[137.460524,63.009881],[137.461959,63.010302],[137.46304,63.010865],[137.465479,63.012888],[137.467666,63.014635],[137.469609,63.016232],[137.471453,63.017583],[137.472484,63.018121],[137.473478,63.018584],[137.483641,63.022333],[137.486879,63.023504],[137.490786,63.024864],[137.500305,63.02763],[137.50312,63.027885],[137.503831,63.027846],[137.50637,63.027283],[137.510832,63.026171],[137.513341,63.025743],[137.52191,63.024927],[137.52396,63.024265],[137.527748,63.022853],[137.529092,63.022666],[137.540256,63.02247],[137.542777,63.022432],[137.543129,63.022427],[137.556927,63.02222],[137.559865,63.02229],[137.56264,63.022815],[137.569609,63.025358],[137.579631,63.028941],[137.588443,63.032139],[137.589199,63.032429],[137.59094,63.033154],[137.595165,63.035209],[137.599285,63.03751],[137.604543,63.040641],[137.611461,63.043853],[137.620047,63.047753],[137.626246,63.050642],[137.626836,63.050917],[137.633832,63.054177],[137.635196,63.055685],[137.637459,63.058661],[137.639196,63.059725],[137.650485,63.065806],[137.654122,63.067798],[137.655947,63.068741],[137.657198,63.069315],[137.65916,63.069858],[137.660141,63.070123],[137.661871,63.070589],[137.671856,63.07328],[137.675204,63.073884],[137.679324,63.074345],[137.681156,63.074478],[137.681913,63.074369],[137.68251,63.074154],[137.682877,63.073799],[137.683305,63.0731],[137.683925,63.07276],[137.684816,63.072588],[137.685645,63.072583],[137.686709,63.072682],[137.687945,63.072744],[137.690838,63.072559],[137.694513,63.072375],[137.696916,63.072361],[137.706718,63.07299],[137.707849,63.073187],[137.708949,63.073443],[137.711041,63.074328],[137.712425,63.07547],[137.713832,63.076241],[137.71546,63.076693],[137.718404,63.077441],[137.719696,63.077871],[137.721937,63.078996],[137.722779,63.079662],[137.724877,63.081579],[137.726595,63.082523],[137.732422,63.085306],[137.733514,63.085603],[137.734775,63.0857],[137.735922,63.08575],[137.736768,63.08575],[137.737946,63.085677],[137.738758,63.085619],[137.739684,63.085522],[137.740491,63.085362],[137.742475,63.084863],[137.762937,63.079314],[137.768843,63.07777],[137.769827,63.077403],[137.770696,63.076994],[137.772321,63.075584],[137.77565,63.072457],[137.779207,63.068107],[137.77954,63.067902],[137.779925,63.06772],[137.780932,63.06748],[137.782075,63.067274],[137.786376,63.066731],[137.790418,63.065953],[137.793328,63.065487],[137.796075,63.065001],[137.798038,63.064624],[137.798448,63.064553],[137.799486,63.064361],[137.801849,63.063979],[137.805301,63.063706],[137.819012,63.064059],[137.824521,63.064115],[137.827618,63.064009],[137.832704,63.063254],[137.834919,63.06282],[137.838132,63.062221],[137.840312,63.061807],[137.841988,63.061348],[137.843382,63.060819],[137.845408,63.059993],[137.845644,63.059907],[137.846403,63.059601],[137.848011,63.058954],[137.850868,63.057938],[137.865357,63.055114],[137.865721,63.055027],[137.866888,63.054539],[137.869778,63.052976],[137.873634,63.050761],[137.874718,63.049483],[137.87654,63.048269],[137.885621,63.042673],[137.890997,63.039679],[137.897161,63.036607],[137.899942,63.035278],[137.900775,63.035031],[137.902438,63.034985],[137.90525,63.035257],[137.907057,63.03583],[137.908114,63.036559],[137.908599,63.037308],[137.909291,63.037878],[137.91535,63.040646],[137.91638,63.041021],[137.916809,63.041145],[137.917308,63.041213],[137.917798,63.041245],[137.936318,63.042015],[137.940388,63.042184],[137.941455,63.042265],[137.943203,63.042693],[137.946616,63.043678],[137.948916,63.044194],[137.950103,63.044385],[137.951293,63.044566],[137.952201,63.04465],[137.953,63.04465],[137.953642,63.044617],[137.954867,63.044555],[137.955665,63.044378],[137.956648,63.044054],[137.957585,63.043656],[137.959857,63.041879],[137.960156,63.041708],[137.960537,63.041555],[137.961401,63.041424],[137.974757,63.040867],[137.975361,63.040936],[137.976791,63.041356],[137.978014,63.041544],[137.979256,63.041662],[137.981032,63.041615],[137.985336,63.041388],[137.98689,63.041101],[137.988003,63.040892],[137.98917,63.040796],[137.992538,63.040938],[137.994258,63.040994],[137.995816,63.040943],[137.997101,63.040761],[137.998314,63.040529],[138.001142,63.039513],[138.00629,63.037482],[138.006515,63.037439],[138.006869,63.037413],[138.007502,63.03744],[138.008109,63.037517],[138.008908,63.037561],[138.00946,63.037551],[138.009964,63.037531],[138.010248,63.037506],[138.012583,63.03689],[138.015278,63.035984],[138.018364,63.034652],[138.021849,63.032896],[138.022153,63.032807],[138.022491,63.032741],[138.023095,63.032739],[138.024427,63.032838],[138.024808,63.032909],[138.025135,63.032997],[138.028693,63.034409],[138.029447,63.034649],[138.030087,63.03477],[138.030761,63.034846],[138.03213,63.034887],[138.033719,63.034899],[138.034452,63.034908],[138.036574,63.034873],[138.038128,63.034789],[138.041153,63.034123],[138.046132,63.03288],[138.052826,63.031152],[138.054673,63.030404],[138.057859,63.029511],[138.059468,63.029145],[138.06054,63.028868],[138.061443,63.028508],[138.062053,63.02826],[138.062627,63.028048],[138.063629,63.027704],[138.065347,63.026642],[138.067114,63.025905],[138.068035,63.025386],[138.068195,63.025282],[138.068485,63.025201],[138.068839,63.025136],[138.069207,63.0251],[138.070374,63.025029],[138.071242,63.024868],[138.07299,63.024412],[138.074761,63.023564],[138.080672,63.020344],[138.08217,63.019773],[138.085377,63.019224],[138.087907,63.01866],[138.089387,63.018083],[138.089732,63.017902],[138.090002,63.01769],[138.090504,63.017236],[138.090744,63.01684],[138.090742,63.016381],[138.0907,63.01577],[138.090161,63.0134],[138.089592,63.011205],[138.089218,63.010227],[138.088575,63.009106],[138.088296,63.008272],[138.088415,63.007778],[138.088875,63.007241],[138.089706,63.006847],[138.090513,63.006687],[138.091836,63.006614],[138.092952,63.00676],[138.093952,63.007125],[138.094913,63.007825],[138.095514,63.00812],[138.096209,63.008371],[138.097737,63.008757],[138.098428,63.009048],[138.098793,63.009285],[138.099112,63.009664],[138.099641,63.010859],[138.100233,63.011884],[138.100707,63.012498],[138.101304,63.01301],[138.102093,63.01348],[138.102999,63.013827],[138.103671,63.013935],[138.104428,63.01399],[138.105164,63.013994],[138.107347,63.013907],[138.110677,63.013844],[138.112936,63.013699],[138.114585,63.013354],[138.115568,63.013178],[138.116727,63.013002],[138.118122,63.013022],[138.119645,63.013178],[138.120718,63.013519],[138.121619,63.013966],[138.123078,63.014736],[138.125997,63.016303],[138.128592,63.01771],[138.130186,63.018832],[138.13141,63.020214],[138.132005,63.021044],[138.132607,63.021708],[138.134149,63.022636],[138.136458,63.023778],[138.138998,63.024529],[138.1402,63.024876],[138.141356,63.025467],[138.14323,63.026577],[138.144579,63.027585],[138.145243,63.028346],[138.145673,63.029366],[138.145767,63.030161],[138.145789,63.031255],[138.146102,63.032098],[138.146982,63.033132],[138.149009,63.035091],[138.149273,63.035809],[138.149227,63.036486],[138.148876,63.037132],[138.1479,63.038202],[138.147492,63.038679],[138.147344,63.039064],[138.147431,63.040776],[138.148846,63.042675],[138.153862,63.0471],[138.154502,63.047604],[138.155374,63.047993],[138.158143,63.048808],[138.160575,63.049524],[138.163059,63.050255],[138.167238,63.051329],[138.171561,63.051856],[138.176077,63.052364],[138.178217,63.0526],[138.180215,63.052654],[138.182079,63.052523],[138.183246,63.052353],[138.184167,63.052173],[138.187053,63.051232],[138.19101,63.049771],[138.193235,63.049304],[138.196861,63.048932],[138.201699,63.04841],[138.206758,63.047934],[138.207729,63.047953],[138.208502,63.047996],[138.209312,63.048118],[138.209902,63.048276],[138.210552,63.048459],[138.211084,63.048679],[138.211588,63.048999],[138.212007,63.049418],[138.21227,63.049838],[138.212425,63.050698],[138.21274,63.051286],[138.213093,63.051663],[138.21335,63.051883],[138.213823,63.05226],[138.214654,63.052722],[138.216398,63.053613],[138.21886,63.054782],[138.220325,63.055487],[138.221242,63.055907],[138.222034,63.05622],[138.222631,63.056441],[138.22372,63.056715],[138.22472,63.056911],[138.225346,63.057157],[138.225678,63.057343],[138.226365,63.05791],[138.22699,63.058667],[138.227963,63.060204],[138.228284,63.060615],[138.229122,63.061444],[138.23007,63.062183],[138.230978,63.062815],[138.232298,63.063482],[138.234821,63.064597],[138.237666,63.065883],[138.242834,63.068222],[138.244059,63.068808],[138.247297,63.070109],[138.248071,63.070367],[138.251821,63.071206],[138.252828,63.071563],[138.253605,63.071965],[138.254545,63.072578],[138.255386,63.073126],[138.255987,63.073559],[138.256424,63.073912],[138.256717,63.074341],[138.256985,63.074875],[138.257109,63.075367],[138.257017,63.076017],[138.256867,63.076488],[138.256671,63.076858],[138.255737,63.07844],[138.255414,63.079001],[138.255279,63.079561],[138.255311,63.079949],[138.255472,63.080547],[138.255515,63.080855],[138.255513,63.081105],[138.25529,63.081642],[138.255101,63.082038],[138.254398,63.083001],[138.253939,63.08366],[138.253659,63.084364],[138.253805,63.085111],[138.254152,63.085705],[138.25471,63.086331],[138.255214,63.086835],[138.255697,63.087496],[138.255993,63.088245],[138.256139,63.089757],[138.255783,63.090733],[138.25514,63.0917],[138.253091,63.093489],[138.250564,63.095597],[138.24804,63.09789],[138.246128,63.100602],[138.245408,63.101627],[138.245172,63.102103],[138.245094,63.10251],[138.245703,63.104105],[138.245881,63.104743],[138.245763,63.105624],[138.245211,63.106978],[138.245376,63.107743],[138.245788,63.108464],[138.246981,63.110772],[138.247729,63.112375],[138.248398,63.113509],[138.249314,63.114434],[138.250169,63.115267],[138.251299,63.116365],[138.251981,63.116994],[138.252276,63.117331],[138.252392,63.117711],[138.252468,63.118378],[138.25236,63.118779],[138.251879,63.119398],[138.251389,63.119765],[138.250068,63.120403],[138.248574,63.121004],[138.247549,63.121532],[138.247013,63.121867],[138.246418,63.122253],[138.245753,63.122822],[138.245151,63.123651],[138.244508,63.124684],[138.2441,63.125474],[138.24386,63.126347],[138.243799,63.127007],[138.243862,63.127533],[138.244175,63.1282],[138.244703,63.128881],[138.245031,63.129124],[138.245823,63.129402],[138.246195,63.129519],[138.24656,63.129634],[138.250416,63.13088],[138.251187,63.1312],[138.251949,63.131567],[138.252554,63.131948],[138.252936,63.132291],[138.253257,63.132664],[138.253605,63.133272],[138.253863,63.133858],[138.25413,63.134237],[138.254614,63.134731],[138.255189,63.135161],[138.257568,63.137017],[138.25884,63.13815],[138.258991,63.138285],[138.259571,63.138847],[138.26,63.139323],[138.260772,63.140422],[138.261094,63.140985],[138.261291,63.141423],[138.261735,63.143844],[138.262103,63.145395],[138.262608,63.146716],[138.263133,63.147707],[138.263508,63.148493],[138.263642,63.14898],[138.263668,63.150179],[138.263637,63.150959],[138.263675,63.151347],[138.26383,63.151942],[138.264156,63.152351],[138.26517,63.152991],[138.26648,63.153561],[138.267499,63.153861],[138.268706,63.154102],[138.26957,63.15421],[138.27031,63.154278],[138.271698,63.154295],[138.27296,63.154336],[138.273969,63.154384],[138.274773,63.154486],[138.275392,63.154633],[138.276041,63.15486],[138.276467,63.155093],[138.276836,63.15535],[138.277068,63.155661],[138.277152,63.156062],[138.277303,63.15628],[138.277415,63.156819],[138.277628,63.157564],[138.277828,63.158007],[138.278111,63.158305],[138.278639,63.158731],[138.279754,63.159351],[138.280985,63.159844],[138.282464,63.160328],[138.283292,63.160609],[138.284061,63.160879],[138.284503,63.161184],[138.284783,63.161539],[138.284869,63.161878],[138.285009,63.162271],[138.285266,63.162586],[138.28578,63.162958],[138.28626,63.163344],[138.286669,63.163843],[138.286881,63.164233],[138.287254,63.16456],[138.287768,63.164945],[138.288259,63.165209],[138.288679,63.165515],[138.289273,63.165851],[138.289585,63.166012],[138.289962,63.166147],[138.290394,63.166181],[138.29067,63.166032],[138.290792,63.165888],[138.290744,63.165749],[138.290584,63.165644],[138.290362,63.165566],[138.290058,63.165423],[138.289515,63.165246],[138.289407,63.16516],[138.289363,63.165044],[138.289426,63.164835],[138.28963,63.164132],[138.289752,63.163885],[138.289842,63.163789],[138.289989,63.16369],[138.29023,63.163644],[138.290449,63.163641],[138.291029,63.163702],[138.291587,63.163818],[138.292083,63.163925],[138.292473,63.164101],[138.292702,63.164212],[138.293106,63.164509],[138.293848,63.165076],[138.295072,63.165777],[138.296135,63.166435],[138.297154,63.166673],[138.298761,63.166953],[138.300995,63.167322],[138.302843,63.167435],[138.304216,63.167451],[138.305638,63.167364],[138.306578,63.167256],[138.307818,63.16708],[138.309146,63.166875],[138.310221,63.166664],[138.311734,63.166572],[138.313976,63.16647],[138.316764,63.166411],[138.318312,63.16631],[138.319845,63.166087],[138.321165,63.165879],[138.322922,63.165641],[138.324942,63.165354],[138.327763,63.165036],[138.330063,63.164709],[138.332613,63.164322],[138.335049,63.164056],[138.337641,63.16378],[138.340424,63.163447],[138.341721,63.163283],[138.342854,63.16312],[138.34406,63.162831],[138.345375,63.162383],[138.346903,63.161849],[138.348201,63.161384],[138.349429,63.161011],[138.350819,63.160697],[138.352933,63.160372],[138.354101,63.160162],[138.355342,63.159736],[138.356802,63.159115],[138.358287,63.158677],[138.359921,63.158313],[138.362191,63.157868],[138.365214,63.157304],[138.368118,63.156612],[138.370782,63.155988],[138.373039,63.155414],[138.375308,63.154681],[138.376488,63.154202],[138.37983,63.152436],[138.381858,63.15137],[138.383054,63.150742],[138.384709,63.150085],[138.386053,63.149665],[138.387388,63.149315],[138.390537,63.148676],[138.393412,63.148153],[138.395828,63.147513],[138.398547,63.146603],[138.400762,63.145807],[138.402369,63.145137],[138.403918,63.144561],[138.404903,63.144116],[138.405751,63.143646],[138.407473,63.142661],[138.409902,63.141249],[138.412618,63.139513],[138.413379,63.139036],[138.413924,63.138639],[138.41501,63.137853],[138.415548,63.137421],[138.417167,63.135769],[138.418733,63.13416],[138.419377,63.133529],[138.420046,63.132571],[138.421365,63.130399],[138.422579,63.128404],[138.423153,63.127589],[138.424192,63.126359],[138.425342,63.125188],[138.427382,63.123503],[138.427756,63.123039],[138.427949,63.12269],[138.428095,63.122249],[138.428155,63.121989],[138.428048,63.121689],[138.427329,63.120756],[138.426887,63.120152],[138.426661,63.119615],[138.426678,63.119175],[138.426721,63.118744],[138.426839,63.118441],[138.427026,63.118189],[138.427391,63.117825],[138.427838,63.117505],[138.428767,63.117064],[138.429844,63.116516],[138.430889,63.115783],[138.43193,63.114852],[138.433305,63.113157],[138.434525,63.111587],[138.435263,63.110873],[138.435652,63.110557],[138.436199,63.110188],[138.437299,63.109743],[138.438804,63.109111],[138.441587,63.10785],[138.443733,63.106848],[138.446081,63.105743],[138.448119,63.104821],[138.449719,63.104265],[138.451241,63.103846],[138.452851,63.103414],[138.454935,63.102667],[138.456939,63.10167],[138.459943,63.100175],[138.461059,63.09968],[138.461884,63.099395],[138.462928,63.099161],[138.464327,63.098961],[138.467235,63.098757],[138.468772,63.098589],[138.469888,63.098395],[138.471831,63.097986],[138.47286,63.097763],[138.473976,63.097671],[138.475467,63.097603],[138.477742,63.097607],[138.479447,63.097608],[138.480788,63.097501],[138.482044,63.097311],[138.483493,63.097044],[138.485812,63.096641],[138.488304,63.096247],[138.490015,63.095992],[138.49089,63.095907],[138.491689,63.095883],[138.492385,63.095908],[138.493432,63.096017],[138.495154,63.096317],[138.496645,63.096631],[138.497879,63.09704],[138.499055,63.097447],[138.501245,63.098507],[138.503175,63.099527],[138.505165,63.100557],[138.507315,63.101717],[138.509095,63.102727],[138.513275,63.104807],[138.515509,63.105713],[138.516647,63.106058],[138.518944,63.106726],[138.51987,63.107117],[138.521054,63.107616],[138.52194,63.108042],[138.527805,63.110837],[138.528875,63.111397],[138.529695,63.112407],[138.530515,63.113717],[138.531695,63.115387],[138.533046,63.117102],[138.534545,63.118867],[138.537035,63.121887],[138.538625,63.123737],[138.540165,63.125577],[138.541435,63.127187],[138.542565,63.128547],[138.544135,63.130497],[138.545805,63.132187],[138.547189,63.133281],[138.54845,63.134147],[138.549938,63.135009],[138.551706,63.135885],[138.553172,63.136576],[138.556385,63.137937],[138.558535,63.138887],[138.560725,63.139807],[138.562245,63.140477],[138.563745,63.141077],[138.569355,63.142812],[138.572316,63.143684],[138.575618,63.144463],[138.579973,63.145353],[138.58326,63.145962],[138.585057,63.146239],[138.587015,63.146379],[138.588002,63.146428],[138.590205,63.146377],[138.592415,63.146377],[138.594775,63.146457],[138.598485,63.146677],[138.60299,63.146912],[138.605231,63.146989],[138.607668,63.146992],[138.613147,63.146948],[138.616615,63.146957],[138.621295,63.146957],[138.624855,63.146777],[138.626895,63.146627],[138.629105,63.146507],[138.634065,63.146157],[138.635225,63.146077],[138.638015,63.145857],[138.640935,63.145667],[138.643205,63.145537],[138.646965,63.145277],[138.650935,63.145027],[138.654799,63.144702],[138.65658,63.144615],[138.658855,63.14445],[138.662495,63.144207],[138.667455,63.143927],[138.672605,63.143607],[138.677005,63.143307],[138.679948,63.143151],[138.682555,63.143087],[138.686615,63.143197],[138.691404,63.143534],[138.693187,63.143626],[138.694775,63.143588],[138.697559,63.143414],[138.704228,63.142927],[138.710815,63.142511],[138.714421,63.142235],[138.71953,63.141887],[138.724976,63.141562],[138.727561,63.14133],[138.73487,63.140552],[138.738999,63.140127],[138.742685,63.139747],[138.746142,63.139369],[138.748355,63.139118],[138.750091,63.138796],[138.752079,63.138303],[138.753846,63.137707],[138.75622,63.136936],[138.758473,63.136422],[138.762979,63.135763],[138.765447,63.135307],[138.768482,63.134668],[138.77039,63.134308],[138.773047,63.13407],[138.775791,63.133901],[138.777742,63.133697],[138.779737,63.133426],[138.785555,63.132517],[138.788728,63.13215],[138.79553,63.131099],[138.801517,63.13008],[138.809692,63.128713],[138.812997,63.127976],[138.814885,63.127491],[138.819373,63.126124],[138.820172,63.125831],[138.822877,63.124926],[138.825716,63.123984],[138.828347,63.123253],[138.830044,63.122923],[138.831437,63.122722],[138.833574,63.122516],[138.83561,63.122416],[138.838705,63.122387],[138.841628,63.122373],[138.846045,63.122337],[138.853345,63.122147],[138.867145,63.12204],[138.880355,63.121737],[138.885785,63.121677],[138.890505,63.121587],[138.894085,63.121417],[138.902357,63.120939],[138.904582,63.120861],[138.90624,63.120925],[138.909192,63.121118],[138.915049,63.121651],[138.920356,63.122063],[138.922956,63.122195],[138.925029,63.12218],[138.927155,63.122067],[138.930845,63.121787],[138.940675,63.121247],[138.945735,63.120927],[138.949875,63.120687],[138.953615,63.120427],[138.960389,63.119746],[138.963447,63.119455],[138.968714,63.119203],[138.970774,63.119077],[138.972341,63.11897],[138.973568,63.118794],[138.974616,63.118521],[138.975345,63.118213],[138.97601,63.11784],[138.976747,63.117281],[138.97732,63.116786],[138.978011,63.116207],[138.978553,63.115821],[138.979338,63.115436],[138.979958,63.115157],[138.980845,63.114857],[138.982372,63.114628],[138.983565,63.114507],[138.9869,63.114143],[138.990945,63.113777],[138.993735,63.113437],[138.997155,63.112617],[139.000345,63.111867],[139.002495,63.111417],[139.004385,63.111077],[139.008285,63.110757],[139.027835,63.109657],[139.032108,63.109417],[139.033956,63.109397],[139.035094,63.109397],[139.036593,63.109454],[139.043005,63.109821],[139.045372,63.10997],[139.047602,63.110195],[139.04858,63.110363],[139.049889,63.110664],[139.052297,63.111334],[139.057629,63.112847],[139.062364,63.114155],[139.065735,63.115005],[139.066696,63.1152],[139.06889,63.115404],[139.070625,63.115517],[139.073865,63.115667],[139.077875,63.115797],[139.081585,63.115857],[139.083865,63.115927],[139.086395,63.115967],[139.091195,63.116117],[139.095465,63.116227],[139.101345,63.116397],[139.104055,63.116527],[139.105105,63.116507],[139.109375,63.116057],[139.11055,63.11588],[139.111475,63.115777],[139.11217,63.115802],[139.113945,63.115947],[139.116715,63.116007],[139.119055,63.115967],[139.120745,63.115647],[139.121085,63.115607],[139.124395,63.115607],[139.131025,63.115737],[139.132895,63.115757],[139.135185,63.115817],[139.137355,63.115857],[139.140705,63.115967],[139.145165,63.116057],[139.147285,63.116117],[139.148515,63.116117],[139.149711,63.115937],[139.151706,63.115423],[139.152758,63.115248],[139.155375,63.115087],[139.156545,63.114928],[139.157415,63.114527],[139.157693,63.114363],[139.1581,63.114026],[139.159212,63.11311],[139.160055,63.112387],[139.160643,63.112241],[139.161585,63.112197],[139.162075,63.112257],[139.164735,63.112727],[139.165567,63.112876],[139.166385,63.112917],[139.167585,63.112687],[139.169975,63.112537],[139.173145,63.112647],[139.174395,63.112407],[139.175975,63.111803],[139.177756,63.111716],[139.181125,63.112017],[139.183013,63.112211],[139.186897,63.112589],[139.191424,63.113026],[139.194729,63.113026],[139.197205,63.112987],[139.198235,63.113047],[139.200485,63.113847],[139.202861,63.114181],[139.206788,63.114617],[139.209942,63.114947],[139.212695,63.115197],[139.215395,63.115707],[139.218659,63.11663],[139.219941,63.116908],[139.221303,63.117083],[139.222592,63.117135],[139.224254,63.117233],[139.225031,63.117474],[139.225635,63.117747],[139.227237,63.118363],[139.229855,63.119097],[139.231679,63.119769],[139.233695,63.121117],[139.234815,63.121957],[139.235075,63.122187],[139.236445,63.123927],[139.238635,63.126337],[139.240395,63.127427],[139.241665,63.127637],[139.245205,63.127637],[139.247135,63.128177],[139.249045,63.129187],[139.250285,63.130197],[139.251136,63.131181],[139.25203,63.131956],[139.253887,63.132924],[139.254914,63.1337],[139.255356,63.134112],[139.255727,63.134322],[139.256205,63.134397],[139.256805,63.134427],[139.257285,63.134357],[139.260656,63.133568],[139.264303,63.132659],[139.264969,63.132381],[139.265305,63.132195],[139.265676,63.131876],[139.26587,63.131587],[139.266128,63.1315],[139.266454,63.131513],[139.266607,63.131607],[139.26662,63.131809],[139.266426,63.132151],[139.266072,63.132513],[139.264555,63.133471],[139.264283,63.13372],[139.264269,63.134022],[139.264555,63.134227],[139.271465,63.136657],[139.273935,63.138047],[139.277085,63.139877],[139.280884,63.141996],[139.2822,63.143132],[139.282555,63.143693],[139.283037,63.144441],[139.283606,63.144944],[139.285033,63.145735],[139.28631,63.146446],[139.287533,63.147052],[139.288048,63.147241],[139.288488,63.147386],[139.288982,63.147556],[139.289447,63.147786],[139.289897,63.14814],[139.290415,63.148757],[139.291745,63.149827],[139.292393,63.150334],[139.292586,63.150702],[139.292929,63.150993],[139.293165,63.151613],[139.293569,63.151895],[139.295415,63.152507],[139.296335,63.153027],[139.296909,63.153468],[139.297285,63.15419],[139.298129,63.155182],[139.298336,63.15545],[139.298831,63.155813],[139.299238,63.155988],[139.299861,63.156142],[139.301041,63.156307],[139.304416,63.156777],[139.308389,63.157306],[139.311588,63.157733],[139.313378,63.157989],[139.314344,63.158221],[139.314977,63.158444],[139.31632,63.15893],[139.318603,63.159859],[139.319955,63.160261],[139.321205,63.160467],[139.324064,63.160784],[139.325023,63.161011],[139.328272,63.162372],[139.329108,63.162548],[139.330117,63.162662],[139.333999,63.163094],[139.334879,63.163269],[139.335586,63.163493],[139.337384,63.164978],[139.338095,63.165258],[139.341082,63.166075],[139.34181,63.166349],[139.342332,63.166574],[139.343969,63.167548],[139.345047,63.168295],[139.347171,63.16979],[139.349955,63.171598],[139.352595,63.172787],[139.354854,63.173635],[139.357335,63.174411],[139.359888,63.175123],[139.36202,63.17574],[139.363289,63.176266],[139.364889,63.176981],[139.366855,63.177673],[139.369423,63.178716],[139.372722,63.18023],[139.373653,63.180584],[139.374931,63.181166],[139.376885,63.182811],[139.379355,63.184737],[139.382705,63.187467],[139.384165,63.188727],[139.386775,63.190817],[139.387828,63.191525],[139.388437,63.191822],[139.389274,63.192102],[139.39069,63.192451],[139.392922,63.192857],[139.397123,63.193572],[139.401994,63.194403],[139.403131,63.194649],[139.403973,63.194918],[139.404455,63.195187],[139.405835,63.196067],[139.406719,63.196679],[139.407595,63.197117],[139.408299,63.19731],[139.412784,63.198303],[139.422009,63.200336],[139.448452,63.20617],[139.451468,63.206838],[139.453187,63.207239],[139.453237,63.207251],[139.456716,63.208114],[139.458619,63.208499],[139.460484,63.208761],[139.4684,63.209621],[139.472072,63.209991],[139.473689,63.210242],[139.475781,63.210611],[139.485162,63.212302],[139.490894,63.213312],[139.492228,63.213588],[139.493065,63.213714],[139.494191,63.213744],[139.498572,63.213764],[139.502221,63.213774],[139.505851,63.213801],[139.507883,63.213753],[139.509748,63.213909],[139.516081,63.21472],[139.519841,63.215168],[139.523504,63.215618],[139.526447,63.215741],[139.52979,63.215664],[139.534153,63.215564],[139.53593,63.215609],[139.541831,63.216171],[139.546079,63.216504],[139.55031,63.216901],[139.552263,63.217197],[139.554294,63.217648],[139.557302,63.218536],[139.561469,63.219774],[139.565238,63.220884],[139.567244,63.221381],[139.569709,63.221822],[139.572754,63.22234],[139.576124,63.222932],[139.580498,63.223466],[139.584904,63.224088],[139.588114,63.224576],[139.590845,63.225357],[139.591615,63.225597],[139.606504,63.23067],[139.619944,63.235289],[139.620273,63.235401],[139.634592,63.240272],[139.63601,63.240905],[139.637811,63.241825],[139.639771,63.242961],[139.641957,63.244216],[139.645282,63.246023],[139.646927,63.246791],[139.648697,63.247559],[139.650457,63.248216],[139.652605,63.24896],[139.653205,63.249159],[139.655467,63.249746],[139.657984,63.250372],[139.667814,63.252902],[139.672552,63.254098],[139.680691,63.256154],[139.68406,63.256888],[139.694523,63.259162],[139.70281,63.260998],[139.712633,63.26319],[139.720729,63.264954],[139.730814,63.26712],[139.745423,63.270312],[139.746148,63.270473],[139.759625,63.273381],[139.763796,63.274273],[139.76594,63.274816],[139.767395,63.275317],[139.770979,63.276633],[139.772394,63.277017],[139.774668,63.277528],[139.782476,63.279265],[139.791881,63.281386],[139.796965,63.282547],[139.804155,63.28412],[139.80566,63.284432],[139.806819,63.284615],[139.808704,63.284773],[139.812097,63.285079],[139.813621,63.285281],[139.815696,63.285594],[139.817074,63.28587],[139.819498,63.286394],[139.824276,63.287478],[139.840633,63.290982],[139.850936,63.293257],[139.855742,63.294328],[139.85941,63.295215],[139.864915,63.296617],[139.870763,63.298175],[139.876207,63.299738],[139.880395,63.301052],[139.887757,63.303603],[139.892049,63.305078],[139.896274,63.306745],[139.899398,63.308026],[139.908999,63.311934],[139.916524,63.315094],[139.925136,63.318676],[139.932747,63.3218],[139.934707,63.322482],[139.936779,63.323059],[139.938977,63.323571],[139.94079,63.323929],[139.943328,63.324321],[139.965904,63.327431],[139.987655,63.330411],[139.988758,63.330641],[139.989564,63.330857],[139.991907,63.331561],[139.995064,63.332517],[139.996264,63.33281],[139.997202,63.332981],[139.998001,63.333026],[139.999165,63.333077],[140.000185,63.333193],[140.001349,63.33346],[140.008877,63.335552],[140.011931,63.336382],[140.012304,63.336483],[140.013445,63.336812],[140.014497,63.337126],[140.015216,63.33739],[140.016181,63.337781],[140.016846,63.33811],[140.018113,63.338864],[140.019258,63.339587],[140.025833,63.343916],[140.027887,63.345228],[140.028691,63.345623],[140.029367,63.345921],[140.03088,63.346345],[140.031999,63.346581],[140.034308,63.346973],[140.040083,63.347935],[140.041641,63.348277],[140.045504,63.34931],[140.048218,63.349993],[140.050042,63.350594],[140.05105,63.350941],[140.05198,63.351434],[140.055655,63.353211],[140.059616,63.355307],[140.061432,63.356199],[140.063775,63.357378],[140.065953,63.358504],[140.066285,63.35875],[140.066714,63.358966],[140.067552,63.359134],[140.070116,63.359336],[140.076425,63.360048],[140.080072,63.360548],[140.086045,63.362157],[140.087505,63.362687],[140.08887,63.363069],[140.092818,63.364108],[140.094921,63.364569],[140.097325,63.365117],[140.099585,63.365547],[140.101235,63.365867],[140.102005,63.366097],[140.104735,63.366827],[140.106484,63.367159],[140.108642,63.36744],[140.110083,63.367652],[140.112024,63.368176],[140.114085,63.368677],[140.122585,63.370567],[140.125755,63.371247],[140.132415,63.372757],[140.138785,63.374207],[140.142085,63.374967],[140.143245,63.375197],[140.146491,63.37591],[140.148863,63.376233],[140.151145,63.376431],[140.159477,63.376726],[140.16792,63.376957],[140.174033,63.377166],[140.17561,63.377272],[140.17704,63.377418],[140.183253,63.378217],[140.19312,63.37961],[140.194718,63.379761],[140.196764,63.37992],[140.198106,63.38004],[140.199922,63.380248],[140.205099,63.380934],[140.207549,63.381241],[140.208802,63.381385],[140.20962,63.381513],[140.210205,63.381626],[140.210873,63.381815],[140.211335,63.381997],[140.213115,63.383007],[140.213775,63.383507],[140.214915,63.384037],[140.217875,63.384487],[140.221785,63.384877],[140.226785,63.385347],[140.231865,63.385967],[140.234955,63.386507],[140.238005,63.386997],[140.241245,63.387577],[140.251095,63.389427],[140.257785,63.390287],[140.261565,63.390817],[140.266305,63.391697],[140.272355,63.392557],[140.280085,63.393547],[140.292895,63.395087],[140.297185,63.395967],[140.303195,63.397407],[140.307918,63.398591],[140.312952,63.399864],[140.315552,63.400642],[140.320253,63.402198],[140.324288,63.403566],[140.32959,63.405249],[140.333747,63.406601],[140.337356,63.407769],[140.339076,63.408297],[140.340832,63.408698],[140.342223,63.408983],[140.346472,63.409778],[140.350891,63.410676],[140.352445,63.41115],[140.353453,63.411591],[140.354709,63.412244],[140.357037,63.413503],[140.358228,63.413924],[140.367907,63.416742],[140.374864,63.418792],[140.384174,63.421466],[140.387865,63.42256],[140.39051,63.423344],[140.392954,63.42389],[140.397198,63.42467],[140.401388,63.42538],[140.404928,63.42593],[140.414048,63.427446],[140.416188,63.427788],[140.417089,63.427879],[140.417988,63.427889],[140.419396,63.427768],[140.42096,63.427673],[140.42185,63.427702],[140.422529,63.427783],[140.423138,63.427932],[140.42627,63.42908],[140.428954,63.429943],[140.430164,63.430313],[140.431169,63.430513],[140.432142,63.430609],[140.433,63.430624],[140.433974,63.430595],[140.43569,63.430389],[140.44628,63.428695],[140.447373,63.428595],[140.44831,63.428579],[140.449606,63.4287],[140.456333,63.429544],[140.469298,63.431226],[140.480067,63.432592],[140.483551,63.433135],[140.487156,63.433797],[140.489356,63.434113],[140.491683,63.43421],[140.493454,63.434132],[140.496072,63.433806],[140.502123,63.432952],[140.507938,63.432126],[140.51058,63.431772],[140.512283,63.431666],[140.514036,63.431711],[140.516935,63.432071],[140.534739,63.434424],[140.541548,63.435219],[140.548216,63.436067],[140.554595,63.436933],[140.555595,63.437033],[140.55655,63.43704],[140.557165,63.437013],[140.558064,63.436867],[140.560916,63.436231],[140.562494,63.436278],[140.565645,63.436332],[140.573473,63.4365],[140.579703,63.436628],[140.584853,63.43671],[140.585896,63.436732],[140.589408,63.436806],[140.589836,63.436815],[140.594306,63.43692],[140.597864,63.437017],[140.600544,63.437233],[140.606921,63.437835],[140.617506,63.438855],[140.622558,63.439343],[140.624593,63.439538],[140.626107,63.439607],[140.632136,63.439493],[140.632443,63.439488],[140.6347,63.439405],[140.637851,63.43928],[140.64499,63.439046],[140.653634,63.438802],[140.655131,63.43875],[140.657044,63.438814],[140.659063,63.438931],[140.660341,63.43903],[140.661471,63.439187],[140.673734,63.440977],[140.685513,63.442808],[140.687943,63.443185],[140.688563,63.443373],[140.689052,63.443603],[140.690746,63.444418],[140.69176,63.445121],[140.694299,63.447418],[140.69474,63.447895],[140.695824,63.449688],[140.69733,63.452147],[140.698205,63.453477],[140.699284,63.455191],[140.700338,63.45637],[140.701091,63.457405],[140.701872,63.45887],[140.702162,63.459686],[140.702435,63.460927],[140.702484,63.462409],[140.702275,63.463894],[140.701181,63.46661],[140.699605,63.470236],[140.699158,63.471659],[140.699002,63.47292],[140.698705,63.475487],[140.698525,63.476677],[140.699385,63.478387],[140.700151,63.479328],[140.700414,63.479671],[140.700607,63.480007],[140.700715,63.480297],[140.700746,63.480771],[140.700702,63.481415],[140.70064,63.481912],[140.700554,63.482704],[140.700355,63.484697],[140.699984,63.486717],[140.69973,63.488755],[140.69974,63.488917],[140.699763,63.489291],[140.699838,63.48961],[140.70015,63.490702],[140.701145,63.493797],[140.702005,63.496607],[140.703015,63.500277],[140.704394,63.506075],[140.705224,63.509398],[140.706087,63.512745],[140.706178,63.51309],[140.706655,63.514757],[140.706875,63.515133],[140.708095,63.516437],[140.709455,63.517807],[140.712285,63.520707],[140.716125,63.523127],[140.720055,63.525447],[140.724295,63.527977],[140.725852,63.528852],[140.726547,63.529187],[140.727349,63.529551],[140.732345,63.531687],[140.736185,63.533277],[140.744595,63.536837],[140.749045,63.538727],[140.754685,63.541157],[140.758825,63.542907],[140.763225,63.544717],[140.767625,63.546557],[140.771225,63.548107],[140.775885,63.550077],[140.780625,63.552137],[140.783935,63.553537],[140.787745,63.555167],[140.792175,63.557027],[140.796135,63.558767],[140.813585,63.565997],[140.817425,63.567607],[140.826055,63.571277],[140.830875,63.573337],[140.834955,63.574967],[140.838965,63.576667],[140.842255,63.578077],[140.845775,63.579607],[140.851395,63.581987],[140.855275,63.583597],[140.858985,63.585207],[140.861225,63.586557],[140.862045,63.587366],[140.862602,63.588187],[140.863175,63.589531],[140.863517,63.590215],[140.863835,63.590827],[140.864355,63.591617],[140.865365,63.593507],[140.865938,63.594804],[140.866306,63.595104],[140.866789,63.595361],[140.867612,63.59572],[140.870015,63.596159],[140.873706,63.596636],[140.875565,63.596869],[140.877464,63.597046],[140.878813,63.597094],[140.882219,63.597005],[140.883172,63.597031],[140.884094,63.597132],[140.886065,63.597361],[140.888365,63.597587],[140.893232,63.598296],[140.902245,63.599403],[140.911686,63.600605],[140.916321,63.601425],[140.921305,63.602797],[140.924947,63.603753],[140.926148,63.604268],[140.927522,63.605203],[140.927728,63.605588],[140.92898,63.607717],[140.930855,63.609687],[140.933875,63.612607],[140.934423,63.614532],[140.934697,63.61644],[140.935056,63.618331],[140.935151,63.619879],[140.935571,63.620499],[140.936275,63.621387],[140.938365,63.624067],[140.940205,63.626787],[140.945165,63.633567],[140.947205,63.636227],[140.947992,63.637599],[140.948006,63.63816],[140.947864,63.63858],[140.9466,63.639994],[140.945063,63.641595],[140.94281,63.643691],[140.942285,63.644267],[140.94188,63.645072],[140.941566,63.646177],[140.941072,63.647154],[140.937885,63.651937],[140.934865,63.655997],[140.930569,63.659848],[140.923273,63.665255],[140.919455,63.667797],[140.918898,63.668215],[140.915855,63.670497],[140.914253,63.671752],[140.913365,63.672447],[140.911195,63.674657],[140.909865,63.677427],[140.909095,63.681227],[140.908065,63.686097],[140.907395,63.689057],[140.906715,63.692987],[140.906165,63.695846],[140.906005,63.696677],[140.905385,63.700217],[140.904905,63.703197],[140.905185,63.704787],[140.90621,63.707271],[140.906365,63.707647],[140.911585,63.719227],[140.912485,63.721267],[140.912715,63.721883],[140.913535,63.724077],[140.914115,63.727537],[140.915385,63.730127],[140.917485,63.733137],[140.921455,63.738667],[140.921905,63.739417],[140.924225,63.742687],[140.927015,63.746757],[140.929346,63.749933],[140.931727,63.751669],[140.935354,63.753197],[140.940396,63.75482],[140.944345,63.756137],[140.945412,63.756479],[140.949775,63.757877],[140.954775,63.759487],[140.961705,63.761827],[140.964271,63.762092],[140.964349,63.7621],[140.966525,63.762325],[140.967505,63.762427],[140.970641,63.763366],[140.9765,63.765208],[140.98237,63.766975],[140.983623,63.767168],[140.985278,63.767219],[140.987144,63.767004],[140.988875,63.766527],[140.991725,63.765497],[140.992266,63.7653],[140.994155,63.764637],[140.996035,63.763987],[140.99738,63.76349],[140.997697,63.763407],[140.998005,63.763356],[140.99831,63.763329],[140.998623,63.763328],[140.99894,63.763357],[140.999144,63.763409],[140.999375,63.763476],[140.999581,63.763563],[140.999747,63.763669],[140.999875,63.763817],[141.00066,63.764909],[141.001461,63.766015],[141.001618,63.766271],[141.00171,63.766488],[141.001758,63.766712],[141.001765,63.766918],[141.001743,63.767754],[141.001795,63.768777],[141.002025,63.770767],[141.002455,63.771797],[141.002345,63.773987],[141.002215,63.778367],[141.002325,63.780167],[141.002675,63.782297],[141.003015,63.783777],[141.003805,63.785147],[141.008445,63.788947],[141.011855,63.791737],[141.013355,63.793387],[141.014835,63.795767],[141.015115,63.796267],[141.015395,63.798277],[141.015545,63.800337],[141.015715,63.802227],[141.016085,63.805877],[141.016535,63.811557],[141.016705,63.812747],[141.017865,63.814717],[141.019295,63.817187],[141.020825,63.819077],[141.021745,63.819827],[141.024145,63.820787],[141.027195,63.821757],[141.028955,63.822437],[141.031745,63.824097],[141.034215,63.825657],[141.035115,63.826157],[141.04145,63.82956],[141.04189,63.829707],[141.042706,63.82982],[141.043317,63.829844],[141.044133,63.829778],[141.044594,63.829636],[141.044884,63.829428],[141.045238,63.828779],[141.045828,63.828368],[141.046472,63.828178],[141.047158,63.828079],[141.047995,63.828107],[141.048939,63.828221],[141.051021,63.828723],[141.054089,63.829541],[141.054754,63.829783],[141.055205,63.830109],[141.055677,63.830644],[141.056385,63.831633],[141.057351,63.833241],[141.057694,63.834263],[141.057812,63.835238],[141.057662,63.835621],[141.057705,63.835895],[141.057984,63.836208],[141.058756,63.836723],[141.059475,63.837054],[141.060322,63.837419],[141.061106,63.837613],[141.06161,63.837674],[141.062039,63.837641],[141.062318,63.837537],[141.062597,63.837282],[141.062972,63.837135],[141.063681,63.837012],[141.064957,63.836903],[141.065837,63.836676],[141.066513,63.836421],[141.067339,63.836307],[141.068155,63.836302],[141.069152,63.836397],[141.069968,63.83661],[141.070697,63.83696],[141.071931,63.837802],[141.074538,63.839751],[141.076095,63.841264],[141.077295,63.844307],[141.077775,63.845877],[141.078935,63.849157],[141.079517,63.850304],[141.080285,63.851817],[141.081765,63.855167],[141.081962,63.856216],[141.082103,63.857515],[141.081895,63.862587],[141.081759,63.864819],[141.082156,63.865698],[141.083206,63.866748],[141.085514,63.868839],[141.088441,63.871371],[141.090905,63.873707],[141.094785,63.877047],[141.09522,63.877452],[141.097875,63.879927],[141.099075,63.880997],[141.101715,63.883277],[141.103565,63.885037],[141.106055,63.887267],[141.1113,63.891982],[141.111995,63.892607],[141.122875,63.902517],[141.125693,63.905017],[141.126805,63.906517],[141.126955,63.906747],[141.127233,63.907379],[141.129315,63.912117],[141.130235,63.914387],[141.130592,63.915207],[141.130756,63.915581],[141.131355,63.916957],[141.132385,63.919197],[141.134888,63.924781],[141.134939,63.924893],[141.136155,63.927607],[141.137335,63.930737],[141.137765,63.934317],[141.137355,63.937477],[141.136175,63.941577],[141.134805,63.943267],[141.132535,63.945797],[141.130175,63.949707],[141.128845,63.951977],[141.127105,63.954767],[141.125385,63.957557],[141.123923,63.961765],[141.122535,63.965757],[141.120305,63.967777],[141.117915,63.969637],[141.114675,63.970647],[141.112035,63.971677],[141.108325,63.973627],[141.103155,63.976417],[141.101505,63.977687],[141.099745,63.980107],[141.098475,63.982557],[141.097595,63.984767],[141.097535,63.986897],[141.097645,63.988227],[141.096382,63.990418],[141.092863,63.994087],[141.090288,63.996251],[141.088786,63.997549],[141.086383,63.999487],[141.083735,64.001957],[141.081675,64.003587],[141.080415,64.004707],[141.077235,64.007387],[141.072905,64.011097],[141.071915,64.012187],[141.069855,64.018397],[141.069235,64.020407],[141.068105,64.023807],[141.06802,64.024062],[141.067365,64.025817],[141.066615,64.028237],[141.065245,64.031807],[141.064215,64.034717],[141.063205,64.037387],[141.062775,64.038667],[141.062045,64.041137],[141.062085,64.041847],[141.062645,64.043417],[141.063245,64.045277],[141.063915,64.047557],[141.063935,64.049487],[141.063155,64.054847],[141.062835,64.057467],[141.062515,64.059617],[141.062365,64.061757],[141.063005,64.063667],[141.065865,64.071217],[141.066505,64.073007],[141.067025,64.074307],[141.067305,64.075297],[141.069485,64.080967],[141.070885,64.084787],[141.071647,64.087125],[141.071915,64.087807],[141.072345,64.088857],[141.073175,64.091087],[141.073735,64.092747],[141.073905,64.093047],[141.074125,64.093597],[141.075065,64.096217],[141.077215,64.101757],[141.077855,64.103597],[141.078143,64.104287],[141.078735,64.105077],[141.079731,64.105983],[141.080611,64.106498],[141.082606,64.107463],[141.086104,64.109047],[141.08855,64.109928],[141.107337,64.115239],[141.109291,64.115465],[141.110384,64.115556],[141.112459,64.115733],[141.115565,64.115987],[141.119434,64.116298],[141.125146,64.116766],[141.129551,64.117137],[141.132859,64.117423],[141.136025,64.117697],[141.142445,64.118237],[141.144165,64.118557],[141.149861,64.120284],[141.155408,64.121872],[141.156202,64.122099],[141.157011,64.12232],[141.15777,64.122491],[141.158792,64.122638],[141.160101,64.122788],[141.16156,64.122877],[141.164897,64.123317],[141.168304,64.124041],[141.169017,64.124212],[141.172477,64.125023],[141.17863,64.126356],[141.192234,64.129474],[141.200721,64.131389],[141.214818,64.134583],[141.21521,64.13467],[141.216664,64.134983],[141.218842,64.135484],[141.21999,64.135728],[141.221195,64.135997],[141.222765,64.136367],[141.225035,64.136857],[141.232955,64.138617],[141.234065,64.138837],[141.239045,64.139997],[141.241475,64.140507],[141.242035,64.140657],[141.242735,64.140787],[141.244945,64.141327],[141.250145,64.142507],[141.258255,64.144367],[141.258315,64.144367],[141.259195,64.144567],[141.261751,64.145083],[141.262354,64.145163],[141.262961,64.145206],[141.263796,64.145258],[141.264851,64.145277],[141.266299,64.145267],[141.267775,64.145254],[141.268689,64.145261],[141.269426,64.145299],[141.270163,64.145362],[141.270805,64.14544],[141.2715,64.145547],[141.272472,64.145731],[141.278246,64.146969],[141.278775,64.147075],[141.280409,64.147425],[141.285638,64.14852],[141.290825,64.149587],[141.294605,64.150397],[141.299255,64.151347],[141.307815,64.153127],[141.308425,64.153237],[141.310415,64.153747],[141.312395,64.154117],[141.319725,64.155617],[141.322835,64.156277],[141.324705,64.156647],[141.324835,64.156687],[141.328115,64.157377],[141.331405,64.158017],[141.332625,64.158297],[141.333245,64.158467],[141.334275,64.158637],[141.343115,64.160507],[141.346675,64.161147],[141.347685,64.161387],[141.350435,64.161837],[141.353505,64.162287],[141.356745,64.162807],[141.35907,64.163188],[141.360525,64.163433],[141.364065,64.163937],[141.36561,64.164066],[141.367321,64.164082],[141.369737,64.163937],[141.373825,64.163637],[141.376225,64.163447],[141.377796,64.163412],[141.378231,64.163401],[141.378573,64.163406],[141.379048,64.163432],[141.379545,64.163484],[141.380041,64.163561],[141.38078,64.163697],[141.38269,64.164149],[141.385543,64.164858],[141.38834,64.165531],[141.391557,64.166308],[141.395007,64.167154],[141.396391,64.167496],[141.39874,64.168056],[141.40168,64.168763],[141.40557,64.16971],[141.40884,64.170469],[141.418023,64.172696],[141.420405,64.173317],[141.421122,64.173679],[141.421635,64.173957],[141.422445,64.174707],[141.426755,64.179007],[141.427258,64.179486],[141.427524,64.179737],[141.428625,64.180807],[141.429656,64.181855],[141.433945,64.185887],[141.435385,64.187397],[141.435535,64.187647],[141.436055,64.187947],[141.436935,64.188747],[141.438385,64.190187],[141.440535,64.192177],[141.446241,64.197667],[141.44832,64.200027],[141.449286,64.201941],[141.44977,64.20282],[141.450488,64.204238],[141.451214,64.205825],[141.452662,64.208271],[141.45385,64.209365],[141.455478,64.210446],[141.460367,64.213707],[141.465254,64.216726],[141.470353,64.219386],[141.472381,64.220037],[141.473955,64.220401],[141.474284,64.220545],[141.47454,64.220649],[141.474709,64.22073],[141.474897,64.220855],[141.475059,64.220969],[141.475184,64.221101],[141.475251,64.221269],[141.475256,64.221473],[141.475255,64.221815],[141.475294,64.222098],[141.475413,64.222414],[141.475599,64.222983],[141.475809,64.223431],[141.475993,64.223677],[141.476293,64.223887],[141.476908,64.224234],[141.478211,64.224847],[141.479471,64.225455],[141.480239,64.225824],[141.48099,64.226088],[141.482082,64.226379],[141.483566,64.226696],[141.485462,64.227094],[141.487115,64.227476],[141.487934,64.227683],[141.488765,64.227948],[141.489453,64.228203],[141.490123,64.22849],[141.490661,64.228775],[141.491264,64.229205],[141.492267,64.230063],[141.493287,64.230977],[141.494984,64.232532],[141.499525,64.236377],[141.504715,64.241277],[141.506964,64.243888],[141.509201,64.247478],[141.510276,64.248709],[141.512522,64.249818],[141.513752,64.250458],[141.514655,64.250887],[141.516715,64.251847],[141.519695,64.253227],[141.521964,64.254379],[141.522355,64.254577],[141.523445,64.255047],[141.525075,64.255757],[141.527035,64.256397],[141.528208,64.256802],[141.52913,64.257156],[141.530302,64.257793],[141.532395,64.258957],[141.536755,64.261527],[141.546125,64.266037],[141.549305,64.267537],[141.550825,64.268287],[141.556705,64.270737],[141.559235,64.271597],[141.560245,64.271867],[141.561665,64.272127],[141.563595,64.272367],[141.565715,64.272557],[141.568685,64.272797],[141.570995,64.272947],[141.571462,64.272982],[141.574435,64.273207],[141.578108,64.273385],[141.580135,64.273432],[141.581283,64.273437],[141.583129,64.273409],[141.586143,64.273311],[141.589856,64.273432],[141.591915,64.273627],[141.594576,64.273856],[141.597925,64.274207],[141.603095,64.274877],[141.605695,64.275197],[141.609345,64.275687],[141.611275,64.275907],[141.612265,64.275987],[141.616385,64.276267],[141.619365,64.276417],[141.623035,64.276697],[141.627585,64.277067],[141.635245,64.277537],[141.641355,64.277947],[141.646075,64.278307],[141.648797,64.278529],[141.652936,64.278837],[141.655606,64.27903],[141.659497,64.279294],[141.66234,64.279468],[141.664602,64.279599],[141.671895,64.280047],[141.675195,64.280287],[141.677195,64.280437],[141.680175,64.280667],[141.682985,64.280967],[141.685495,64.281467],[141.690365,64.282367],[141.692345,64.282707],[141.696955,64.283607],[141.700325,64.284207],[141.713175,64.286567],[141.715696,64.286989],[141.717835,64.287347],[141.725795,64.288197],[141.727967,64.288495],[141.730025,64.288957],[141.731905,64.289557],[141.734051,64.289881],[141.735746,64.290067],[141.737613,64.290253],[141.740553,64.290542],[141.74345,64.291147],[141.746368,64.291687],[141.749435,64.292297],[141.749675,64.292317],[141.749915,64.292387],[141.753755,64.293027],[141.755515,64.293347],[141.758105,64.293737],[141.761605,64.294317],[141.766925,64.295237],[141.768736,64.295589],[141.769285,64.295687],[141.769805,64.295797],[141.772015,64.296137],[141.774655,64.296677],[141.777525,64.297167],[141.781666,64.297978],[141.783174,64.298308],[141.784691,64.298779],[141.786122,64.299316],[141.790105,64.301464],[141.790397,64.301624],[141.792207,64.302614],[141.803168,64.308608],[141.809264,64.311941],[141.814688,64.314901],[141.815442,64.315284],[141.81618,64.315594],[141.816909,64.315855],[141.818313,64.316253],[141.819785,64.316561],[141.821118,64.316764],[141.822017,64.316851],[141.82281,64.316901],[141.823915,64.316947],[141.82586,64.316927],[141.827091,64.316859],[141.828239,64.316701],[141.829375,64.316498],[141.834037,64.315673],[141.845663,64.313504],[141.846749,64.313302],[141.848369,64.31303],[141.849496,64.312851],[141.850345,64.312734],[141.851253,64.312668],[141.852424,64.31261],[141.853352,64.312593],[141.854281,64.312623],[141.856718,64.312812],[141.859241,64.313058],[141.865819,64.313676],[141.872949,64.314369],[141.87508,64.314567],[141.880212,64.315074],[141.881039,64.315123],[141.883867,64.315404],[141.888926,64.315968],[141.890724,64.316343],[141.892057,64.316737],[141.893556,64.317347],[141.894499,64.317877],[141.89553,64.318621],[141.896193,64.319222],[141.896624,64.320044],[141.896764,64.320695],[141.896578,64.32314],[141.895632,64.33172],[141.8956,64.334829],[141.895664,64.337778],[141.895131,64.341999],[141.894361,64.34508],[141.893619,64.346815],[141.893349,64.349402],[141.89294,64.354749],[141.892646,64.360002],[141.893086,64.363472],[141.895591,64.37258],[141.896592,64.375976],[141.898113,64.378532],[141.900467,64.380949],[141.915002,64.392444],[141.931774,64.405702],[141.934017,64.407739],[141.935065,64.409764],[141.935129,64.412254],[141.934699,64.419663],[141.934042,64.421598],[141.932371,64.423586],[141.931587,64.424563],[141.931271,64.424904],[141.928133,64.428214],[141.925383,64.431529],[141.924969,64.433509],[141.925326,64.435638],[141.926493,64.441501],[141.927124,64.445195],[141.927026,64.447385],[141.926208,64.449155],[141.924774,64.450862],[141.923971,64.451602],[141.923086,64.452354],[141.922256,64.453068],[141.921357,64.453823],[141.920531,64.454502],[141.920237,64.454759],[141.919956,64.454989],[141.919103,64.455728],[141.918699,64.456072],[141.918298,64.456411],[141.917935,64.456685],[141.917671,64.456892],[141.91744,64.457048],[141.91715,64.457239],[141.916923,64.457386],[141.916737,64.457504],[141.916524,64.457644],[141.915904,64.45804],[141.915493,64.458281],[141.915072,64.458511],[141.914549,64.458796],[141.914256,64.458953],[141.913779,64.459191],[141.912593,64.459744],[141.910783,64.46055],[141.910077,64.460873],[141.907792,64.461868],[141.906983,64.462229],[141.904145,64.463481],[141.901599,64.464616],[141.900224,64.46526],[141.899869,64.465443],[141.899557,64.465635],[141.89925,64.465828],[141.898965,64.466029],[141.897351,64.467288],[141.894798,64.469376],[141.893887,64.470121],[141.888502,64.474524],[141.888204,64.474741],[141.887952,64.474932],[141.887699,64.475104],[141.887302,64.475337],[141.886919,64.475552],[141.886456,64.475804],[141.885983,64.476056],[141.884701,64.476686],[141.881821,64.478102],[141.878291,64.479841],[141.878017,64.479992],[141.877754,64.480148],[141.877482,64.480319],[141.87728,64.480485],[141.877001,64.48072],[141.876751,64.480949],[141.876569,64.481113],[141.876361,64.48132],[141.876203,64.481496],[141.87606,64.481672],[141.875957,64.481861],[141.875832,64.482114],[141.875733,64.482316],[141.875631,64.482573],[141.875574,64.482757],[141.875536,64.483006],[141.875527,64.483235],[141.875532,64.483445],[141.875542,64.483624],[141.875572,64.483839],[141.87562,64.484075],[141.875665,64.484289],[141.875719,64.48453],[141.875779,64.484733],[141.875881,64.485037],[141.875974,64.485314],[141.876068,64.485587],[141.876192,64.485912],[141.876275,64.486121],[141.876369,64.486334],[141.876469,64.486562],[141.8766,64.48685],[141.876679,64.487011],[141.876758,64.487181],[141.876927,64.48749],[141.877102,64.48779],[141.877308,64.488079],[141.877506,64.488324],[141.878729,64.489672],[141.879161,64.49015],[141.87943,64.490468],[141.879656,64.490762],[141.879828,64.490993],[141.879939,64.491201],[141.880071,64.491443],[141.880224,64.49179],[141.880403,64.492193],[141.880728,64.493055],[141.880905,64.493517],[141.881045,64.493866],[141.881165,64.494137],[141.881276,64.494329],[141.881362,64.494464],[141.881458,64.494595],[141.881584,64.494744],[141.881768,64.494944],[141.881916,64.495093],[141.882173,64.495314],[141.88237,64.495469],[141.882623,64.495668],[141.883295,64.496144],[141.883766,64.496458],[141.884213,64.496711],[141.884516,64.496855],[141.884952,64.497026],[141.885462,64.497211],[141.88624,64.497475],[141.886999,64.497722],[141.887409,64.497859],[141.887778,64.49799],[141.888107,64.498129],[141.88831,64.498227],[141.888501,64.498334],[141.888716,64.498473],[141.888883,64.498604],[141.889041,64.498734],[141.889155,64.498841],[141.889261,64.498949],[141.889319,64.499026],[141.889392,64.499124],[141.889464,64.499254],[141.88952,64.499358],[141.889577,64.499457],[141.889615,64.49957],[141.889651,64.499697],[141.889663,64.499805],[141.889664,64.49994],[141.889652,64.500087],[141.889645,64.500121],[141.889631,64.500195],[141.889601,64.50031],[141.889322,64.50101],[141.889108,64.501518],[141.888875,64.502116],[141.88879,64.502361],[141.888746,64.50252],[141.888724,64.502661],[141.888719,64.502784],[141.888727,64.502862],[141.888735,64.502945],[141.888762,64.503087],[141.88881,64.503227],[141.888851,64.503338],[141.888908,64.50346],[141.889463,64.504607],[141.892834,64.510984],[141.893285,64.51184],[141.894227,64.513628],[141.894415,64.513921],[141.894617,64.514216],[141.894857,64.514518],[141.89505,64.514732],[141.895116,64.514804],[141.895364,64.515046],[141.895587,64.515235],[141.895859,64.515441],[141.896152,64.515639],[141.896465,64.515842],[141.896789,64.516024],[141.897188,64.516229],[141.897536,64.516389],[141.897885,64.516541],[141.898369,64.516729],[141.898809,64.516895],[141.899249,64.51704],[141.899761,64.517193],[141.900196,64.517317],[141.900259,64.517332],[141.900601,64.517413],[141.900825,64.517465],[141.901045,64.51751],[141.901249,64.517553],[141.901578,64.517614],[141.901864,64.517666],[141.902132,64.517709],[141.902352,64.517743],[141.90261,64.517781],[141.902871,64.517817],[141.903161,64.517857],[141.903416,64.517891],[141.903789,64.517939],[141.904345,64.518005],[141.904967,64.518076],[141.913693,64.519099],[141.93655,64.521775],[141.946372,64.52295],[141.955413,64.524005],[141.96583,64.525234],[141.967077,64.525382],[141.967487,64.525427],[141.967823,64.525457],[141.968102,64.525476],[141.968419,64.525493],[141.968683,64.525502],[141.969014,64.525508],[141.96935,64.525505],[141.969662,64.525498],[141.969923,64.525487],[141.97023,64.525463],[141.970584,64.525429],[141.970878,64.525393],[141.971265,64.525334],[141.972723,64.525085],[141.97312,64.525014],[141.979374,64.523925],[141.979677,64.523876],[141.98002,64.523825],[141.980206,64.5238],[141.980485,64.523768],[141.980793,64.523736],[141.981083,64.523716],[141.981359,64.523703],[141.981621,64.523694],[141.981889,64.523691],[141.982219,64.523692],[141.982533,64.523698],[141.982822,64.523708],[141.983289,64.523729],[141.987838,64.523998],[141.993966,64.524383],[141.995323,64.524469],[141.996712,64.524562],[141.997237,64.524604],[141.997763,64.524652],[141.99835,64.524709],[141.998952,64.524781],[142.003819,64.52536],[142.007903,64.525846],[142.016427,64.526856],[142.024857,64.527817],[142.033757,64.52886],[142.042031,64.529796],[142.045833,64.529975],[142.053349,64.529994],[142.057281,64.53016],[142.061323,64.530671],[142.066668,64.53156],[142.071312,64.532298],[142.075574,64.532709],[142.082318,64.53311],[142.087144,64.533342],[142.09062,64.533856],[142.100527,64.535616],[142.103502,64.536401],[142.10901,64.538077],[142.134305,64.545623],[142.162346,64.553846],[142.184736,64.560291],[142.189745,64.561491],[142.200933,64.563539],[142.216764,64.566348],[142.220697,64.566591],[142.22776,64.566825],[142.233878,64.567458],[142.240754,64.568283],[142.267831,64.57145],[142.276658,64.572469],[142.278066,64.572632],[142.28226,64.573116],[142.289149,64.574061],[142.317833,64.579105],[142.325519,64.580515],[142.338048,64.583867],[142.346656,64.586185],[142.348748,64.5867],[142.350379,64.587014],[142.352493,64.587308],[142.354102,64.587456],[142.354478,64.587488],[142.355508,64.587548],[142.356398,64.587575],[142.358362,64.587573],[142.360095,64.587529],[142.361449,64.58748],[142.364296,64.587377],[142.364992,64.587345],[142.365662,64.587314],[142.366955,64.587274],[142.367834,64.587247],[142.36883,64.587202],[142.369875,64.587176],[142.370786,64.587161],[142.371297,64.587149],[142.371747,64.587132],[142.372739,64.587072],[142.373383,64.58705],[142.374271,64.587047],[142.375413,64.587068],[142.376714,64.58713],[142.377994,64.587198],[142.37859,64.587237],[142.379883,64.587338],[142.380812,64.587431],[142.387433,64.588248],[142.397463,64.589467],[142.398465,64.589584],[142.399198,64.589659],[142.399783,64.589713],[142.400179,64.589745],[142.400636,64.589767],[142.401092,64.589778],[142.410814,64.58959],[142.410989,64.589585],[142.415104,64.589507],[142.415965,64.589488],[142.416563,64.589472],[142.417273,64.589451],[142.417979,64.589427],[142.418682,64.589402],[142.419462,64.589377],[142.420188,64.589342],[142.420803,64.589304],[142.421294,64.589266],[142.421874,64.589214],[142.428488,64.588508],[142.431264,64.588185],[142.431601,64.588154],[142.432059,64.588125],[142.432516,64.588103],[142.434492,64.58801],[142.434869,64.587994],[142.435316,64.587961],[142.435662,64.587931],[142.436277,64.587863],[142.437727,64.587666],[142.43836,64.587581],[142.438936,64.587518],[142.439481,64.587469],[142.43981,64.58745],[142.4401,64.587446],[142.440404,64.587453],[142.440831,64.587467],[142.441448,64.587496],[142.441985,64.587531],[142.442512,64.587581],[142.442944,64.587632],[142.443375,64.587696],[142.446501,64.588251],[142.454308,64.589548],[142.457757,64.590133],[142.458938,64.590353],[142.459719,64.590519],[142.460168,64.590632],[142.460594,64.590751],[142.461096,64.590895],[142.461481,64.591044],[142.461874,64.591228],[142.46217,64.591388],[142.462363,64.59151],[142.462545,64.591656],[142.462876,64.591946],[142.463086,64.592189],[142.463563,64.592852],[142.46509,64.594985],[142.465221,64.595181],[142.465254,64.595327],[142.465399,64.596769],[142.465472,64.596923],[142.465587,64.597076],[142.465789,64.597268],[142.465979,64.597397],[142.466192,64.597507],[142.469024,64.598652],[142.469366,64.598802],[142.469742,64.598991],[142.470843,64.599553],[142.471019,64.59963],[142.471185,64.599675],[142.471357,64.599684],[142.471521,64.599683],[142.471729,64.599649],[142.471916,64.59958],[142.472076,64.599483],[142.472201,64.599354],[142.472241,64.599232],[142.472281,64.599071],[142.472295,64.598903],[142.472309,64.598716],[142.472314,64.598514],[142.47228,64.598359],[142.472213,64.598229],[142.472153,64.598151],[142.472004,64.598044],[142.471794,64.597925],[142.471442,64.597698],[142.471226,64.597509],[142.47106,64.597302],[142.470972,64.597107],[142.470735,64.596499],[142.470654,64.596187],[142.470625,64.595982],[142.470631,64.59585],[142.47067,64.595713],[142.470749,64.595516],[142.470839,64.59537],[142.471037,64.595182],[142.47128,64.595036],[142.471624,64.594925],[142.472067,64.594823],[142.472515,64.594757],[142.473007,64.594709],[142.473388,64.594708],[142.47382,64.594751],[142.474341,64.594859],[142.475411,64.595128],[142.476637,64.595429],[142.477254,64.5956],[142.477804,64.59577],[142.478477,64.595983],[142.478835,64.596099],[142.479194,64.596225],[142.479698,64.596408],[142.48036,64.596676],[142.480889,64.596906],[142.481632,64.597221],[142.482093,64.597417],[142.482356,64.597562],[142.482697,64.597783],[142.483185,64.598154],[142.483572,64.59842],[142.483899,64.598587],[142.484252,64.598746],[142.484561,64.598864],[142.484859,64.598972],[142.485445,64.599155],[142.486026,64.599323],[142.486472,64.599469],[142.487006,64.599679],[142.487395,64.599851],[142.487717,64.600033],[142.490052,64.601677],[142.490222,64.601819],[142.490364,64.601994],[142.49047,64.60218],[142.490558,64.602387],[142.490671,64.602579],[142.490842,64.602749],[142.49102,64.602924],[142.49111,64.60305],[142.491189,64.603158],[142.491291,64.603261],[142.491446,64.603381],[142.491697,64.6035],[142.491903,64.603559],[142.492259,64.603629],[142.492477,64.60365],[142.492691,64.603645],[142.492901,64.603608],[142.493169,64.603507],[142.493389,64.603368],[142.493645,64.603128],[142.493879,64.602918],[142.494138,64.602745],[142.494473,64.602547],[142.494698,64.602458],[142.494983,64.602365],[142.495361,64.602281],[142.498149,64.601895],[142.498883,64.60184],[142.499447,64.601818],[142.500132,64.601812],[142.501417,64.601835],[142.50207,64.601857],[142.502477,64.601848],[142.503211,64.601784],[142.504106,64.601676],[142.504795,64.601591],[142.505483,64.601496],[142.506871,64.601278],[142.507175,64.601244],[142.507419,64.601247],[142.507656,64.601288],[142.507802,64.601339],[142.508098,64.601563],[142.508602,64.602059],[142.508806,64.602206],[142.509035,64.602304],[142.509346,64.602403],[142.509645,64.602467],[142.510047,64.602523],[142.511176,64.602616],[142.512305,64.602698],[142.512562,64.602691],[142.512875,64.602642],[142.513135,64.602564],[142.513358,64.602475],[142.513557,64.602337],[142.513691,64.602175],[142.513781,64.601995],[142.513836,64.601786],[142.513843,64.601605],[142.513827,64.601424],[142.513771,64.601181],[142.513682,64.601011],[142.513014,64.600376],[142.512912,64.600208],[142.512913,64.600079],[142.512985,64.59994],[142.513151,64.599761],[142.513451,64.599435],[142.513544,64.599237],[142.513614,64.59903],[142.513616,64.598838],[142.51312,64.597912],[142.512221,64.596364],[142.512182,64.596247],[142.512168,64.596163],[142.51218,64.596047],[142.51226,64.595951],[142.512364,64.595874],[142.512546,64.595789],[142.512807,64.595755],[142.513064,64.595767],[142.513299,64.595798],[142.513544,64.595854],[142.514414,64.596036],[142.514879,64.596115],[142.515363,64.596179],[142.515877,64.596231],[142.516442,64.596272],[142.516839,64.596278],[142.517163,64.596261],[142.517604,64.596193],[142.518129,64.596066],[142.518469,64.595994],[142.518829,64.595939],[142.519276,64.595904],[142.519763,64.595894],[142.520964,64.595916],[142.52117,64.595905],[142.521428,64.595866],[142.521977,64.595707],[142.522248,64.595611],[142.522441,64.595539],[142.522712,64.595491],[142.523002,64.595491],[142.523418,64.595512],[142.524999,64.595642],[142.525417,64.595702],[142.525814,64.595797],[142.526081,64.595907],[142.526301,64.59607],[142.526551,64.596271],[142.526716,64.596467],[142.526827,64.596641],[142.526863,64.596777],[142.52687,64.596922],[142.52677,64.598164],[142.526725,64.598332],[142.526416,64.599138],[142.526094,64.599853],[142.525969,64.600084],[142.525794,64.600381],[142.52571,64.600589],[142.525675,64.600763],[142.525607,64.601074],[142.525591,64.601311],[142.525626,64.601512],[142.525678,64.601646],[142.525739,64.601772],[142.525845,64.601924],[142.525968,64.602084],[142.526115,64.602228],[142.526336,64.602375],[142.526586,64.60249],[142.526862,64.602597],[142.527215,64.602701],[142.528201,64.602959],[142.529103,64.603185],[142.53004,64.603389],[142.530453,64.603475],[142.530981,64.603571],[142.531524,64.603693],[142.532003,64.603833],[142.532407,64.603948],[142.532691,64.604037],[142.533779,64.604426],[142.534019,64.604544],[142.534219,64.604675],[142.534358,64.604815],[142.53442,64.604937],[142.53445,64.605044],[142.534482,64.605236],[142.534419,64.605411],[142.53432,64.605564],[142.534206,64.605696],[142.534041,64.605825],[142.533839,64.605953],[142.533454,64.606141],[142.531806,64.606942],[142.53161,64.607067],[142.531496,64.607171],[142.531439,64.607256],[142.53141,64.607384],[142.53143,64.607513],[142.53168,64.608541],[142.531763,64.608689],[142.53186,64.608804],[142.532004,64.608892],[142.532187,64.608953],[142.532382,64.608987],[142.532694,64.609018],[142.533006,64.609041],[142.535175,64.609115],[142.535529,64.609135],[142.535849,64.609162],[142.536105,64.609196],[142.53675,64.609294],[142.537382,64.609401],[142.537916,64.609521],[142.538223,64.609615],[142.538456,64.609699],[142.538673,64.609797],[142.539804,64.610296],[142.540191,64.610518],[142.54048,64.610684],[142.540688,64.610824],[142.540856,64.610956],[142.541003,64.6111],[142.5411,64.61123],[142.541157,64.61136],[142.541222,64.611523],[142.541506,64.61226],[142.541617,64.612665],[142.541673,64.612912],[142.541653,64.613274],[142.541625,64.613765],[142.541676,64.613938],[142.541806,64.614082],[142.541951,64.614233],[142.542311,64.614533],[142.543085,64.615084],[142.543297,64.615201],[142.543475,64.615284],[142.5437,64.615376],[142.543994,64.615444],[142.54445,64.615519],[142.545143,64.615609],[142.545635,64.615673],[142.546046,64.615728],[142.546526,64.615808],[142.546942,64.615885],[142.547369,64.615966],[142.547726,64.616021],[142.548135,64.616062],[142.54861,64.616094],[142.549264,64.616122],[142.549811,64.616141],[142.550414,64.616155],[142.550852,64.616157],[142.551544,64.616163],[142.552302,64.61616],[142.553812,64.616132],[142.555062,64.616108],[142.555709,64.616111],[142.556274,64.616131],[142.556611,64.616145],[142.556905,64.61617],[142.557282,64.616207],[142.557735,64.616268],[142.558286,64.616367],[142.559002,64.616531],[142.559876,64.616759],[142.560456,64.616916],[142.561098,64.617083],[142.561495,64.617167],[142.561893,64.617237],[142.562214,64.617276],[142.562606,64.617295],[142.562977,64.61729],[142.563306,64.617272],[142.563646,64.617234],[142.564145,64.617154],[142.564557,64.617065],[142.565005,64.616942],[142.565428,64.6168],[142.56577,64.616659],[142.566206,64.616461],[142.5665,64.616315],[142.566713,64.616223],[142.566904,64.616146],[142.567237,64.616055],[142.567502,64.616017],[142.567744,64.616007],[142.568096,64.616016],[142.56836,64.616054],[142.568724,64.616123],[142.56909,64.616231],[142.569525,64.616379],[142.569995,64.61658],[142.570839,64.616998],[142.571123,64.617114],[142.571463,64.617253],[142.571874,64.617402],[142.572333,64.617561],[142.572705,64.617669],[142.57299,64.617742],[142.573363,64.617821],[142.573692,64.617886],[142.574152,64.617976],[142.574602,64.618082],[142.574992,64.618178],[142.575381,64.618297],[142.575581,64.618382],[142.575779,64.618444],[142.575944,64.61847],[142.576186,64.618467],[142.576343,64.618429],[142.576477,64.618354],[142.576565,64.618264],[142.576632,64.618175],[142.57685,64.617849],[142.576958,64.617655],[142.57702,64.617502],[142.577101,64.617272],[142.577131,64.617094],[142.577156,64.613779],[142.577179,64.613323],[142.577213,64.613177],[142.577268,64.613062],[142.577326,64.612944],[142.577443,64.612818],[142.577597,64.612699],[142.57781,64.612569],[142.578774,64.612129],[142.578899,64.612053],[142.578969,64.612001],[142.579025,64.611953],[142.579038,64.611919],[142.579034,64.611875],[142.579016,64.611834],[142.578974,64.611791],[142.578919,64.611751],[142.578752,64.611664],[142.576646,64.610972],[142.576464,64.610903],[142.576321,64.610829],[142.576192,64.61076],[142.576097,64.610683],[142.576026,64.610601],[142.575984,64.610504],[142.575951,64.610389],[142.575952,64.610245],[142.575989,64.610087],[142.57606,64.609925],[142.576129,64.609827],[142.57624,64.60971],[142.576397,64.60956],[142.576593,64.609403],[142.576826,64.60923],[142.577002,64.609118],[142.577183,64.608997],[142.577397,64.608876],[142.577741,64.60868],[142.57821,64.608449],[142.579039,64.608084],[142.580062,64.607692],[142.580764,64.607414],[142.580996,64.607317],[142.581163,64.607235],[142.581285,64.607161],[142.581385,64.607085],[142.581798,64.606605],[142.582003,64.606402],[142.582157,64.606272],[142.582497,64.606004],[142.582863,64.605735],[142.583389,64.605386],[142.58382,64.605142],[142.584048,64.605025],[142.584329,64.604902],[142.584637,64.604793],[142.584828,64.604731],[142.585091,64.604656],[142.585344,64.604582],[142.585624,64.604509],[142.585908,64.604424],[142.586143,64.604346],[142.586373,64.604259],[142.586583,64.604164],[142.586885,64.603987],[142.58724,64.603767],[142.58752,64.603573],[142.587707,64.603424],[142.587865,64.603295],[142.588033,64.603153],[142.588146,64.603025],[142.588243,64.602912],[142.588357,64.602765],[142.58847,64.602599],[142.588591,64.602418],[142.588745,64.602125],[142.588821,64.601964],[142.588893,64.601806],[142.588938,64.601648],[142.588986,64.601463],[142.58903,64.601227],[142.589059,64.600946],[142.589061,64.600339],[142.58897,64.598827],[142.588982,64.598724],[142.588997,64.598617],[142.58906,64.59845],[142.589543,64.597522],[142.58979,64.597059],[142.59,64.596713],[142.590183,64.59647],[142.59033,64.596298],[142.590539,64.596058],[142.591054,64.595465],[142.591285,64.595203],[142.591771,64.594652],[142.592041,64.594365],[142.592356,64.594077],[142.592763,64.593736],[142.593188,64.593381],[142.593562,64.593094],[142.594722,64.592235],[142.595101,64.591983],[142.595453,64.591756],[142.595758,64.591583],[142.596026,64.591447],[142.596336,64.591298],[142.596619,64.591199],[142.596902,64.59111],[142.597338,64.590993],[142.598302,64.590804],[142.598516,64.590759],[142.598753,64.590705],[142.599008,64.590624],[142.599244,64.590508],[142.599464,64.590403],[142.59969,64.5903],[142.599883,64.590211],[142.600109,64.590121],[142.600454,64.590006],[142.602516,64.589405],[142.603119,64.589222],[142.603628,64.589053],[142.603995,64.588919],[142.604432,64.588739],[142.604836,64.588545],[142.605268,64.588352],[142.606676,64.58773],[142.608137,64.587119],[142.608533,64.586954],[142.608837,64.586837],[142.609296,64.586681],[142.609847,64.586514],[142.610761,64.586253],[142.611358,64.58609],[142.611983,64.585928],[142.612701,64.585743],[142.61306,64.58565],[142.613445,64.585557],[142.613996,64.585432],[142.614511,64.585335],[142.615248,64.585217],[142.61623,64.585079],[142.617211,64.584946],[142.623881,64.58417],[142.625436,64.583978],[142.626653,64.583836],[142.627568,64.583737],[142.628278,64.58367],[142.628753,64.583636],[142.629202,64.583614],[142.629799,64.583616],[142.630431,64.58364],[142.630996,64.58367],[142.632149,64.58376],[142.636777,64.584203],[142.642099,64.584813],[142.651146,64.585795],[142.659781,64.586749],[142.663901,64.58717],[142.664834,64.587277],[142.665393,64.587342],[142.665873,64.587372],[142.666433,64.587365],[142.666993,64.587327],[142.667899,64.587243],[142.674118,64.586689],[142.6797,64.586137],[142.687094,64.585549],[142.69103,64.585225],[142.693965,64.58496],[142.695078,64.58482],[142.695981,64.584678],[142.701208,64.583148],[142.705594,64.582108],[142.70776,64.581579],[142.708518,64.581373],[142.70912,64.581207],[142.709729,64.581013],[142.710536,64.580696],[142.715808,64.578725],[142.722115,64.576298],[142.723305,64.575864],[142.723934,64.575655],[142.724333,64.57551],[142.724833,64.575365],[142.725735,64.575142],[142.732935,64.573436],[142.734138,64.573148],[142.734705,64.573019],[142.735205,64.572919],[142.735643,64.572833],[142.73796,64.57247],[142.738395,64.572395],[142.738866,64.572299],[142.739337,64.572182],[142.739791,64.572037],[142.741534,64.571423],[142.742608,64.571022],[142.743116,64.570826],[142.743658,64.570604],[142.744251,64.570339],[142.744911,64.570031],[142.745379,64.569799],[142.747568,64.568491],[142.752702,64.565528],[142.754692,64.564715],[142.76395,64.562046],[142.767021,64.560881],[142.771305,64.558733],[142.77258,64.558179],[142.77567,64.557622],[142.779202,64.556828],[142.784686,64.555176],[142.787902,64.55374],[142.793258,64.551198],[142.811356,64.542753],[142.814253,64.541535],[142.817924,64.540487],[142.82282,64.539143],[142.82633,64.538501],[142.832025,64.537537],[142.83519,64.536733],[142.838493,64.536006],[142.840541,64.535593],[142.840775,64.535567],[142.842352,64.535618],[142.844849,64.536308],[142.847798,64.537476],[142.850129,64.538288],[142.853165,64.538558],[142.8596,64.538856],[142.864019,64.538784],[142.915297,64.53712],[142.93916,64.536345],[142.94342,64.536318],[142.947711,64.536605],[142.950741,64.537238],[142.955714,64.538439],[142.958835,64.538981],[142.963281,64.539337],[142.967226,64.539778],[142.971643,64.540653],[142.976768,64.541589],[142.990013,64.54271],[142.99541,64.543129],[142.999366,64.543098],[143.001142,64.543061],[143.001979,64.54304],[143.003852,64.542992],[143.006115,64.542925],[143.007921,64.542716],[143.010141,64.541961],[143.010927,64.541407],[143.011522,64.541182],[143.012293,64.541021],[143.013151,64.541035],[143.014591,64.541237],[143.015899,64.54156],[143.018438,64.542796],[143.019483,64.543165],[143.020457,64.54343],[143.021908,64.543709],[143.023255,64.543913],[143.024081,64.544019],[143.028331,64.544174],[143.047179,64.544755],[143.064029,64.545245],[143.065338,64.545194],[143.066354,64.545068],[143.069041,64.544393],[143.075083,64.542706],[143.078255,64.541905],[143.079994,64.541597],[143.081573,64.541425],[143.081812,64.541423],[143.08506,64.541756],[143.08728,64.542079],[143.088003,64.542184],[143.088841,64.542306],[143.090762,64.542703],[143.100138,64.545167],[143.100572,64.545263],[143.101135,64.54533],[143.103496,64.545405],[143.112037,64.54568],[143.114565,64.545754],[143.119284,64.545892],[143.123247,64.546008],[143.125516,64.546074],[143.12576,64.546081],[143.129496,64.5462],[143.12998,64.54618],[143.130285,64.546113],[143.130485,64.546069],[143.132441,64.545332],[143.13852,64.543155],[143.138958,64.543061],[143.139903,64.542953],[143.140717,64.543015],[143.141277,64.543243],[143.141671,64.543453],[143.14432,64.545201],[143.145461,64.545655],[143.146878,64.54619],[143.155847,64.549464],[143.157396,64.549887],[143.17972,64.554796],[143.181531,64.555226],[143.182427,64.555592],[143.186363,64.558121],[143.188044,64.559201],[143.191402,64.561365],[143.192046,64.561706],[143.19271,64.561957],[143.194513,64.562554],[143.19587,64.562946],[143.197112,64.563113],[143.198184,64.563209],[143.205118,64.563352],[143.206537,64.563183],[143.206979,64.56313],[143.210374,64.562158],[143.213986,64.561123],[143.216353,64.560782],[143.22317,64.560739],[143.223921,64.560726],[143.22435,64.560718],[143.230066,64.560714],[143.232585,64.560734],[143.235971,64.560906],[143.239383,64.56125],[143.24063,64.561538],[143.241492,64.561704],[143.24214,64.56185],[143.243285,64.562107],[143.24491,64.562526],[143.247513,64.563196],[143.248183,64.563437],[143.249384,64.563868],[143.250895,64.56441],[143.250996,64.564439],[143.252835,64.56496],[143.253026,64.565009],[143.255278,64.565639],[143.255929,64.565819],[143.256377,64.565958],[143.257521,64.566225],[143.257735,64.566275],[143.262561,64.566774],[143.265442,64.567318],[143.271933,64.568667],[143.27555,64.569462],[143.276337,64.569552],[143.277443,64.569552],[143.291502,64.56843],[143.296918,64.567843],[143.298999,64.567508],[143.302644,64.56693],[143.306936,64.566701],[143.309941,64.566539],[143.310974,64.566448],[143.31654,64.565872],[143.316726,64.56586],[143.319343,64.565591],[143.32167,64.565091],[143.32785,64.563433],[143.332063,64.562309],[143.343063,64.559373],[143.344016,64.559119],[143.344378,64.559022],[143.346324,64.558503],[143.349627,64.557621],[143.350966,64.557265],[143.351848,64.55703],[143.393366,64.54598],[143.398318,64.544903],[143.41459,64.543303],[143.435704,64.541228],[143.44036,64.540816],[143.44092,64.540774],[143.442253,64.540684],[143.442864,64.5407],[143.44361,64.540785],[143.444415,64.540935],[143.44545,64.541294],[143.44648,64.54186],[143.447038,64.542095],[143.447596,64.542206],[143.448368,64.542206],[143.44898,64.542118],[143.449656,64.541869],[143.453057,64.540587],[143.460073,64.537963],[143.461221,64.537571],[143.462294,64.537298],[143.463758,64.537052],[143.471698,64.535766],[143.476527,64.535028],[143.477723,64.534845],[143.478304,64.534771],[143.478922,64.5347],[143.479496,64.534635],[143.480092,64.534575],[143.480658,64.534529],[143.481377,64.534476],[143.482015,64.534438],[143.482756,64.534401],[143.48351,64.534365],[143.484374,64.53433],[143.485453,64.534294],[143.486643,64.534269],[143.487015,64.534262],[143.487307,64.534251],[143.487594,64.534233],[143.487854,64.534211],[143.488137,64.534182],[143.488567,64.534131],[143.491962,64.533685],[143.495053,64.533255],[143.495366,64.533211],[143.495776,64.533154],[143.497484,64.532916],[143.518696,64.530008],[143.525957,64.529065],[143.529576,64.528363],[143.529822,64.528314],[143.531764,64.527878],[143.533696,64.5275],[143.548923,64.525355],[143.549963,64.52505],[143.550829,64.524659],[143.554388,64.522569],[143.558427,64.520944],[143.562425,64.519846],[143.57097,64.517775],[143.574767,64.516453],[143.580344,64.51482],[143.583725,64.514235],[143.596732,64.513446],[143.600367,64.512561],[143.606284,64.51107],[143.607507,64.510761],[143.607644,64.510727],[143.612856,64.509413],[143.619741,64.507805],[143.624338,64.507481],[143.644684,64.506257],[143.653614,64.505593],[143.661786,64.504703],[143.669165,64.504486],[143.673314,64.504076],[143.68348,64.502634],[143.688314,64.502439],[143.697824,64.502177],[143.705174,64.502248],[143.710681,64.502583],[143.71699,64.503236],[143.729251,64.502969],[143.745916,64.503811],[143.747746,64.503521],[143.752643,64.501946],[143.756589,64.500834],[143.756903,64.500745],[143.758619,64.500262],[143.763123,64.49943],[143.771507,64.498489],[143.778734,64.49744],[143.779746,64.497235],[143.781303,64.4969],[143.789483,64.494678],[143.792268,64.494024],[143.794789,64.493635],[143.798215,64.493174],[143.799873,64.493038],[143.805558,64.492864],[143.811672,64.492464],[143.815309,64.49212],[143.816659,64.491755],[143.81885,64.49081],[143.820798,64.489571],[143.824413,64.488026],[143.830047,64.486176],[143.83527,64.484845],[143.836895,64.484482],[143.838628,64.484358],[143.846192,64.484444],[143.848807,64.483998],[143.851677,64.48289],[143.858407,64.480094],[143.860992,64.478591],[143.863187,64.476472],[143.867302,64.471438],[143.867825,64.470798],[143.868454,64.470029],[143.869759,64.46822],[143.872614,64.463641],[143.874428,64.461379],[143.876479,64.460512],[143.912488,64.449231],[143.94756,64.438177],[143.95188,64.436912],[143.952409,64.43678],[143.953213,64.436624],[143.956388,64.436044],[143.957286,64.435906],[143.958465,64.435721],[143.97697,64.432814],[143.998688,64.429418],[144.02306,64.425546],[144.027922,64.424809],[144.030985,64.424734],[144.032188,64.42481],[144.034718,64.425405],[144.036849,64.426045],[144.038465,64.426519],[144.044235,64.428182],[144.047396,64.429121],[144.051771,64.430746],[144.052104,64.430834],[144.053357,64.431003],[144.054732,64.431067],[144.061135,64.430913],[144.083945,64.430436],[144.09389,64.430168],[144.099569,64.429552],[144.141564,64.424512],[144.144852,64.424117],[144.173464,64.420732],[144.195926,64.418163],[144.197774,64.417955],[144.218734,64.415599],[144.221318,64.415347],[144.222376,64.415306],[144.231773,64.415211],[144.235925,64.415237],[144.237549,64.415495],[144.238886,64.415849],[144.245436,64.418284],[144.255424,64.421942],[144.259118,64.423196],[144.269266,64.42488],[144.276452,64.425557],[144.279799,64.425927],[144.283962,64.42665],[144.305413,64.42891],[144.309459,64.4294],[144.311472,64.430057],[144.312899,64.430789],[144.313353,64.431093],[144.315785,64.433035],[144.316261,64.433398],[144.316651,64.433659],[144.317056,64.433853],[144.318024,64.434155],[144.319024,64.434262],[144.32044,64.434244],[144.324624,64.433864],[144.326427,64.433855],[144.328809,64.434207],[144.32986,64.434605],[144.330525,64.435336],[144.330611,64.436262],[144.330118,64.437679],[144.329581,64.438623],[144.329152,64.439003],[144.328122,64.439623],[144.326405,64.440253],[144.324539,64.440642],[144.323147,64.441201],[144.320936,64.442207],[144.318995,64.442937],[144.318553,64.443129],[144.317253,64.443508],[144.313457,64.445181],[144.311472,64.446175],[144.311197,64.446408],[144.311124,64.447204],[144.31158,64.447834],[144.312551,64.448293],[144.313389,64.448806],[144.314926,64.449419],[144.31554,64.449794],[144.317276,64.451074],[144.319595,64.45186],[144.322668,64.452115],[144.328594,64.451619],[144.331845,64.45116],[144.335416,64.450704],[144.340093,64.450407],[144.344455,64.450669],[144.34748,64.451317],[144.351156,64.452039],[144.354373,64.452812],[144.356385,64.45348],[144.357126,64.453815],[144.357651,64.454174],[144.357958,64.454534],[144.358075,64.455016],[144.35833,64.455265],[144.358977,64.455634],[144.359624,64.456063],[144.360212,64.456742],[144.361385,64.457326],[144.361866,64.457473],[144.362694,64.457988],[144.363049,64.458357],[144.364157,64.458856],[144.367001,64.459486],[144.370282,64.45985],[144.372994,64.460178],[144.374633,64.460493],[144.379658,64.462099],[144.381256,64.462384],[144.385497,64.462868],[144.389124,64.463584],[144.391453,64.463922],[144.393251,64.46433],[144.394909,64.464722],[144.396206,64.465183],[144.397128,64.465646],[144.397614,64.466145],[144.397757,64.466405],[144.398317,64.466838],[144.400851,64.468076],[144.404338,64.469546],[144.4056,64.469866],[144.412701,64.470958],[144.414266,64.471175],[144.415301,64.471228],[144.417586,64.471202],[144.421017,64.471455],[144.42605,64.471662],[144.436032,64.472718],[144.442338,64.473291],[144.444041,64.47352],[144.444837,64.473716],[144.446457,64.474324],[144.447607,64.474758],[144.449298,64.475109],[144.450245,64.475216],[144.454317,64.475677],[144.459573,64.476779],[144.461861,64.476812],[144.4676,64.476157],[144.475367,64.475224],[144.478202,64.474429],[144.492096,64.468816],[144.495237,64.467699],[144.496819,64.467331],[144.499862,64.467174],[144.504101,64.467256],[144.508627,64.467306],[144.511394,64.467366],[144.511815,64.467402],[144.513185,64.46767],[144.519835,64.470381],[144.522855,64.470838],[144.527246,64.471342],[144.531129,64.471588],[144.535441,64.471307],[144.541141,64.470661],[144.546355,64.470392],[144.549806,64.470297],[144.55316,64.470094],[144.555112,64.469516],[144.557701,64.467779],[144.560981,64.465721],[144.563766,64.464791],[144.567508,64.463906],[144.570405,64.463523],[144.573262,64.463477],[144.578215,64.463861],[144.581804,64.464608],[144.583287,64.465042],[144.58449,64.465393],[144.586076,64.465613],[144.590489,64.465918],[144.591247,64.46602],[144.591958,64.466202],[144.593438,64.466647],[144.594843,64.466835],[144.597373,64.467098],[144.601144,64.46754],[144.602147,64.467858],[144.603242,64.468424],[144.606327,64.470175],[144.607059,64.470412],[144.60795,64.470548],[144.609165,64.470525],[144.62312,64.469487],[144.625969,64.469159],[144.629144,64.468083],[144.632469,64.466902],[144.634386,64.466221],[144.635977,64.465895],[144.637408,64.465637],[144.647475,64.464039],[144.653136,64.46321],[144.658141,64.462861],[144.661309,64.46218],[144.664121,64.460916],[144.668291,64.458821],[144.669976,64.457621],[144.67148,64.45576],[144.673013,64.454426],[144.675575,64.453248],[144.680333,64.451162],[144.682165,64.450086],[144.690168,64.441512],[144.693628,64.437713],[144.702911,64.427724],[144.703871,64.427442],[144.705483,64.427108],[144.707017,64.426299],[144.707387,64.425884],[144.708713,64.425149],[144.709176,64.424921],[144.711653,64.424255],[144.712642,64.424015],[144.713826,64.423505],[144.714462,64.423112],[144.715027,64.422882],[144.715902,64.422589],[144.716467,64.422209],[144.716864,64.421975],[144.718018,64.421237],[144.719027,64.420601],[144.720173,64.420072],[144.720598,64.419668],[144.720995,64.419216],[144.721117,64.418906],[144.721106,64.418546],[144.721501,64.418232],[144.722096,64.417904],[144.722021,64.417715],[144.721755,64.417537],[144.721408,64.417321],[144.721357,64.417086],[144.72149,64.416133],[144.722097,64.414841],[144.722196,64.414168],[144.722538,64.413776],[144.72339,64.413301],[144.724121,64.412864],[144.724598,64.412706],[144.725763,64.412703],[144.726795,64.412641],[144.727671,64.412747],[144.728703,64.413046],[144.728751,64.412987],[144.72863,64.412851],[144.728305,64.412716],[144.727704,64.412446],[144.727195,64.412276],[144.726928,64.412111],[144.726782,64.411904],[144.727019,64.411554],[144.728068,64.411013],[144.728729,64.410709],[144.729748,64.410189],[144.731125,64.40975],[144.732757,64.409405],[144.735748,64.409012],[144.738423,64.408705],[144.74,64.408514],[144.741304,64.40817],[144.743761,64.407316],[144.74549,64.406727],[144.750634,64.405962],[144.754662,64.405938],[144.7571,64.405825],[144.758999,64.405665],[144.760718,64.405615],[144.7613,64.405599],[144.761992,64.405426],[144.762683,64.405253],[144.765874,64.405017],[144.769162,64.404315],[144.77217,64.403599],[144.775095,64.402695],[144.777133,64.402407],[144.778322,64.402328],[144.780154,64.401922],[144.781522,64.401314],[144.782547,64.401012],[144.783333,64.400897],[144.784049,64.400844],[144.785056,64.400624],[144.785832,64.40031],[144.78929,64.399571],[144.790976,64.398852],[144.793196,64.397238],[144.794494,64.396582],[144.794628,64.396304],[144.794373,64.395995],[144.794591,64.395597],[144.795598,64.394779],[144.79686,64.394102],[144.798935,64.392582],[144.800039,64.391586],[144.801385,64.391392],[144.803375,64.390605],[144.804515,64.390238],[144.805086,64.389745],[144.806262,64.388371],[144.806942,64.387296],[144.807282,64.386436],[144.807925,64.385785],[144.809841,64.384784],[144.810581,64.384443],[144.810848,64.383908],[144.811322,64.383331],[144.811843,64.382408],[144.811819,64.38204],[144.811443,64.381421],[144.811455,64.381012],[144.811989,64.380477],[144.813202,64.38022],[144.814524,64.379984],[144.815058,64.379974],[144.815628,64.379706],[144.816611,64.379428],[144.816817,64.37916],[144.816616,64.378788],[144.816624,64.378445],[144.817495,64.377849],[144.819451,64.377132],[144.820789,64.376762],[144.822698,64.376594],[144.824281,64.376128],[144.827202,64.374939],[144.832981,64.373137],[144.837657,64.372169],[144.842128,64.370762],[144.844991,64.369587],[144.845877,64.369067],[144.846738,64.368884],[144.847866,64.368852],[144.849177,64.368889],[144.850875,64.368821],[144.852792,64.368658],[144.853653,64.368364],[144.854976,64.367818],[144.855546,64.367467],[144.856213,64.367314],[144.857135,64.367257],[144.858007,64.36735],[144.858882,64.367597],[144.859427,64.367646],[144.860795,64.367677],[144.86143,64.367653],[144.862219,64.367512],[144.862786,64.367328],[144.863931,64.366846],[144.865814,64.366302],[144.868147,64.365911],[144.87106,64.365556],[144.875457,64.365454],[144.880004,64.365677],[144.883589,64.366122],[144.88455,64.36636],[144.885442,64.366953],[144.886678,64.367072],[144.887656,64.366894],[144.88944,64.366248],[144.891862,64.365686],[144.893949,64.365602],[144.895065,64.365778],[144.895714,64.365749],[144.897412,64.365069],[144.901483,64.363229],[144.903041,64.362977],[144.904491,64.363014],[144.907373,64.363421],[144.90969,64.36334],[144.911316,64.36318],[144.912595,64.362912],[144.913287,64.362975],[144.913953,64.363169],[144.915057,64.363549],[144.915981,64.363862],[144.917539,64.364033],[144.920227,64.363914],[144.922701,64.363647],[144.926226,64.363733],[144.927403,64.363786],[144.930655,64.363361],[144.932691,64.363488],[144.937718,64.364698],[144.939013,64.364735],[144.941304,64.364449],[144.946057,64.36354],[144.947423,64.363112],[144.94851,64.363198],[144.949809,64.363148],[144.950873,64.362836],[144.952628,64.362363],[144.955407,64.361836],[144.95702,64.361817],[144.957414,64.362047],[144.958101,64.362422],[144.958598,64.362426],[144.959362,64.362241],[144.960014,64.362196],[144.961129,64.362267],[144.96227,64.362178],[144.963668,64.362252],[144.964604,64.362371],[144.966233,64.362448],[144.967272,64.362193],[144.967832,64.362232],[144.969047,64.362834],[144.969742,64.363172],[144.970634,64.363227],[144.973056,64.363206],[144.975503,64.363216],[144.976177,64.363328],[144.977241,64.363778],[144.978176,64.363907],[144.979194,64.363899],[144.979882,64.364252],[144.980071,64.364546],[144.981109,64.364742],[144.982387,64.365128],[144.983374,64.365232],[144.985278,64.365054],[144.987526,64.365224],[144.988608,64.365084],[144.989649,64.365486],[144.989885,64.365863],[144.990228,64.366732],[144.990931,64.367173],[144.991866,64.367272],[144.993411,64.367455],[144.994167,64.367302],[144.996365,64.366948],[144.997863,64.366925],[144.999459,64.366576],[145.000685,64.366453],[145.001416,64.366574],[145.002126,64.366686],[145.00335,64.366584],[145.004969,64.366329],[145.005822,64.366231],[145.006348,64.366301],[145.007367,64.366682],[145.008406,64.366749],[145.009147,64.367132],[145.010361,64.367829],[145.01172,64.368606],[145.013493,64.370164],[145.014355,64.370187],[145.018268,64.370831],[145.021697,64.37134],[145.023187,64.372179],[145.02517,64.372754],[145.027777,64.37281],[145.032306,64.374194],[145.034417,64.374665],[145.035129,64.374628],[145.037016,64.374342],[145.039658,64.374535],[145.043922,64.375054],[145.045106,64.375633],[145.048022,64.376776],[145.049095,64.376947],[145.051754,64.377054],[145.055855,64.378034],[145.057176,64.37866],[145.057828,64.379284],[145.059766,64.380923],[145.062675,64.381985],[145.064604,64.382798],[145.06555,64.384009],[145.065974,64.384927],[145.066763,64.385863],[145.067442,64.387356],[145.068722,64.387956],[145.07343,64.389424],[145.077081,64.390122],[145.081139,64.390145],[145.083736,64.390619],[145.084354,64.391118],[145.085107,64.392476],[145.086004,64.392916],[145.088334,64.393524],[145.092471,64.394285],[145.096632,64.39484],[145.098537,64.394956],[145.100648,64.395061],[145.103014,64.39483],[145.105634,64.395118],[145.107005,64.395359],[145.110669,64.39558],[145.111506,64.395936],[145.112913,64.396953],[145.114879,64.397289],[145.117803,64.397236],[145.119707,64.397603],[145.120738,64.398217],[145.121321,64.398626],[145.122352,64.399071],[145.123674,64.399779],[145.124754,64.400088],[145.126113,64.400906],[145.128649,64.402096],[145.129862,64.402101],[145.130808,64.402033],[145.131439,64.402185],[145.132519,64.403128],[145.133598,64.403495],[145.135794,64.40522],[145.137299,64.40587],[145.139555,64.406284],[145.142261,64.40762],[145.143522,64.407814],[145.145075,64.408485],[145.145767,64.409203],[145.14567,64.409711],[145.146373,64.410466],[145.147223,64.410748],[145.147841,64.411215],[145.147744,64.411608],[145.147417,64.412127],[145.147866,64.413096],[145.14846,64.413882],[145.149807,64.414128],[145.151238,64.414982],[145.153216,64.417135],[145.154102,64.417649],[145.154987,64.419226],[145.155727,64.419697],[145.15563,64.42075],[145.157499,64.422232],[145.158687,64.422793],[145.160568,64.423269],[145.161696,64.423814],[145.16263,64.423987],[145.163128,64.425375],[145.165142,64.426951],[145.165845,64.428491],[145.167119,64.429496],[145.168466,64.430475],[145.168903,64.431753],[145.170298,64.433104],[145.171608,64.433638],[145.172324,64.434057],[145.172341,64.434487],[145.172096,64.435227],[145.172761,64.436087],[145.175174,64.436691],[145.177063,64.437385],[145.178602,64.438456],[145.182624,64.439166],[145.184967,64.440237],[145.186331,64.440539],[145.18815,64.441761],[145.190493,64.443134],[145.190738,64.443617],[145.192452,64.444341],[145.194236,64.445141],[145.197384,64.445277],[145.199307,64.445186],[145.201336,64.445488],[145.20298,64.446936],[145.204764,64.448068],[145.206932,64.450934],[145.208226,64.451854],[145.208506,64.453378],[145.207667,64.454509],[145.207247,64.456002],[145.206687,64.457208],[145.207212,64.458324],[145.210605,64.462562],[145.212948,64.463858],[145.222042,64.466723],[145.222706,64.467326],[145.22428,64.467823],[145.22484,64.468607],[145.227987,64.470477],[145.23152,64.471893],[145.234563,64.472451],[145.237256,64.472511],[145.23876,64.472798],[145.241523,64.472738],[145.24579,64.472451],[145.247749,64.472843],[145.251036,64.473883],[145.25359,64.475149],[145.256947,64.475752],[145.259221,64.475661],[145.261284,64.475903],[145.263698,64.476837],[145.264012,64.477274],[145.263803,64.477741],[145.264642,64.478178],[145.266426,64.478781],[145.267475,64.478917],[145.268035,64.479143],[145.267965,64.480077],[145.268087,64.481199],[145.268489,64.481689],[145.269644,64.482262],[145.269696,64.482608],[145.269679,64.482857],[145.270133,64.483618],[145.272529,64.484906],[145.27517,64.485539],[145.276779,64.485395],[145.278125,64.485343],[145.282497,64.486043],[145.283984,64.486337],[145.285907,64.486307],[145.287219,64.486638],[145.289772,64.486706],[145.291976,64.487],[145.294984,64.487264],[145.296173,64.487836],[145.297383,64.488646],[145.297945,64.489261],[145.298891,64.489546],[145.299868,64.489653],[145.301296,64.489592],[145.303398,64.489719],[145.304938,64.489938],[145.307294,64.490406],[145.30968,64.490414],[145.312061,64.490872],[145.313415,64.491203],[145.316432,64.491959],[145.320418,64.493327],[145.322604,64.493854],[145.323234,64.494382],[145.323321,64.494992],[145.32549,64.495842],[145.327641,64.496302],[145.330753,64.497296],[145.332677,64.497619],[145.334583,64.498576],[145.338466,64.499607],[145.340354,64.499765],[145.341529,64.499823],[145.342345,64.500086],[145.343736,64.500893],[145.344398,64.501101],[145.345517,64.501061],[145.346691,64.500976],[145.347688,64.500855],[145.349664,64.500663],[145.351238,64.500618],[145.352864,64.500727],[145.35456,64.501013],[145.356126,64.50113],[145.356947,64.501378],[145.358626,64.501958],[145.359676,64.502011],[145.360008,64.502124],[145.360305,64.502846],[145.360777,64.503253],[145.361844,64.503547],[145.363593,64.503825],[145.365919,64.50442],[145.367283,64.504563],[145.372547,64.504886],[145.374068,64.505045],[145.375485,64.505188],[145.376639,64.50527],[145.378038,64.505737],[145.379384,64.506271],[145.380783,64.506881],[145.382165,64.507077],[145.385768,64.50716],[145.388321,64.507145],[145.392413,64.506716],[145.395491,64.506708],[145.396488,64.506625],[145.398534,64.506753],[145.400685,64.507175],[145.403168,64.508296],[145.405127,64.508815],[145.405529,64.509064],[145.40698,64.509342],[145.408239,64.509305],[145.41172,64.509816],[145.41408,64.509944],[145.41506,64.509719],[145.416266,64.509696],[145.41847,64.509997],[145.419257,64.509959],[145.419676,64.509749],[145.419869,64.509455],[145.420254,64.509372],[145.420848,64.509387],[145.421355,64.509538],[145.42195,64.509929],[145.422684,64.510087],[145.423961,64.510102],[145.425815,64.510042],[145.427738,64.509824],[145.429872,64.50947],[145.431323,64.509327],[145.432058,64.509433],[145.43274,64.509628],[145.433404,64.509561],[145.434191,64.509455],[145.435293,64.509463],[145.437112,64.509207],[145.438441,64.508642],[145.442813,64.507754],[145.443722,64.507393],[145.444037,64.507069],[145.444229,64.506565],[145.443862,64.506106],[145.444002,64.505699],[145.444649,64.50521],[145.444999,64.504856],[145.445996,64.504563],[145.447062,64.50451],[145.448129,64.504668],[145.448881,64.504608],[145.451767,64.503848],[145.455964,64.502658],[145.456803,64.502229],[145.457328,64.501559],[145.458045,64.501198],[145.459287,64.501017],[145.460476,64.50107],[145.462224,64.501326],[145.463554,64.501619],[145.4649,64.502094],[145.465477,64.502079],[145.466229,64.501943],[145.467226,64.502033],[145.468223,64.501642],[145.468957,64.501612],[145.469587,64.501755],[145.470636,64.502312],[145.471301,64.502395],[145.473784,64.502101],[145.476005,64.501371],[145.479223,64.500611],[145.482755,64.500257],[145.485308,64.499752],[145.486707,64.499338],[145.487547,64.49918],[145.488107,64.499361],[145.489243,64.499767],[145.490642,64.499933],[145.491936,64.500144],[145.492513,64.500347],[145.492601,64.500731],[145.493213,64.501582],[145.494105,64.502086],[145.496238,64.502651],[145.496553,64.503035],[145.496168,64.503343],[145.495102,64.503419],[145.494332,64.503659],[145.494105,64.504036],[145.494507,64.50442],[145.495399,64.504631],[145.496098,64.504804],[145.496168,64.50524],[145.497445,64.505903],[145.499141,64.506159],[145.500068,64.506512],[145.500943,64.506851],[145.502009,64.506859],[145.502761,64.507032],[145.503478,64.507431],[145.504475,64.507634],[145.505315,64.508063],[145.506539,64.508048],[145.50799,64.508635],[145.508987,64.508928],[145.509914,64.509357],[145.51189,64.509621],[145.513219,64.510005],[145.514373,64.510742],[145.516192,64.511389],[145.517486,64.511352],[145.51843,64.511404],[145.51927,64.51148],[145.520564,64.511352],[145.521928,64.51154],[145.522593,64.511502],[145.523327,64.511909],[145.525723,64.512368],[145.526947,64.513128],[145.528276,64.513414],[145.528556,64.514031],[145.530095,64.514783],[145.530602,64.515295],[145.532001,64.515709],[145.532771,64.51622],[145.533715,64.516581],[145.534589,64.517244],[145.534869,64.517861],[145.536408,64.518793],[145.537702,64.519305],[145.538017,64.520223],[145.538472,64.520584],[145.538716,64.521141],[145.539976,64.521923],[145.540255,64.52242],[145.54057,64.523413],[145.54078,64.523954],[145.54008,64.524375],[145.540185,64.525052],[145.542459,64.526166],[145.543018,64.527249],[145.542704,64.52776],[145.541759,64.528211],[145.541794,64.529054],[145.543053,64.529941],[145.542948,64.530498],[145.544313,64.531535],[145.545292,64.531987],[145.546306,64.532889],[145.547181,64.533972],[145.5483,64.534528],[145.549839,64.535611],[145.551273,64.536273],[145.552602,64.537912],[145.553231,64.538363],[145.553686,64.539821],[145.555785,64.542001],[145.555645,64.542497],[145.553581,64.545669],[145.554106,64.547578],[145.553266,64.548135],[145.551867,64.548435],[145.551168,64.548751],[145.550783,64.549157],[145.550853,64.550449],[145.550538,64.552508],[145.550958,64.552959],[145.550748,64.553605],[145.551063,64.554116],[145.551063,64.556085],[145.549664,64.556926],[145.550119,64.557332],[145.549699,64.558414],[145.549559,64.559045],[145.548615,64.560337],[145.547845,64.560743],[145.547006,64.560983],[145.545677,64.56229],[145.543333,64.564138],[145.541969,64.565234],[145.540745,64.566646],[145.538751,64.567833],[145.537737,64.56911],[145.535394,64.570762],[145.532806,64.572173],[145.531372,64.572774],[145.530497,64.574096],[145.527244,64.577204],[145.526125,64.578015],[145.522733,64.579921],[145.522348,64.581032],[145.521089,64.582399],[145.517556,64.585896],[145.516052,64.587457],[145.514094,64.589513],[145.512135,64.591554],[145.510071,64.59346],[145.507658,64.595636],[145.505769,64.598247],[145.50507,64.599372],[145.502621,64.601727],[145.502447,64.603317],[145.501677,64.604307],[145.500943,64.604967],[145.500768,64.605792],[145.501118,64.606587],[145.500943,64.607457],[145.500593,64.608057],[145.499649,64.608507],[145.499858,64.608957],[145.499718,64.610157],[145.500418,64.611221],[145.501048,64.611776],[145.500593,64.612406],[145.500593,64.613021],[145.501292,64.613786],[145.502237,64.614535],[145.501887,64.615105],[145.501467,64.616215],[145.501013,64.617129],[145.500593,64.617564],[145.499334,64.618434],[145.498215,64.618883],[145.49762,64.619543],[145.498249,64.620442],[145.498389,64.621102],[145.499614,64.622451],[145.499858,64.623575],[145.499474,64.624025],[145.499753,64.625044],[145.501782,64.626588],[145.503076,64.627322],[145.503076,64.627772],[145.502621,64.628087],[145.502866,64.628267],[145.50416,64.628506],[145.50444,64.628881],[145.504615,64.629466],[145.50507,64.629915],[145.506119,64.63014],[145.506923,64.63026],[145.507938,64.631069],[145.508812,64.632253],[145.509722,64.632777],[145.510736,64.632942],[145.511295,64.633242],[145.512659,64.633497],[145.513639,64.634426],[145.514863,64.63507],[145.514723,64.635639],[145.515248,64.636119],[145.516297,64.636523],[145.517241,64.636613],[145.51885,64.637077],[145.521753,64.637827],[145.525915,64.63907],[145.528434,64.639295],[145.531232,64.640928],[145.531721,64.641721],[145.532771,64.643354],[145.53368,64.643609],[145.534694,64.643729],[145.535324,64.644627],[145.535219,64.645855],[145.536198,64.646574],[145.536548,64.647578],[145.537422,64.648806],[145.537842,64.64921],[145.537597,64.649974],[145.538157,64.650618],[145.540885,64.652954],[145.54106,64.653418],[145.541724,64.653942],[145.541759,64.655125],[145.541549,64.655978],[145.542494,64.656607],[145.542494,64.657715],[145.541899,64.659496],[145.542249,64.66008],[145.543158,64.663328],[145.543333,64.665393],[145.543333,64.66674],[145.543543,64.669539],[145.543893,64.671918],[145.544522,64.673175],[145.544837,64.674955],[145.545432,64.67699],[145.545886,64.679234],[145.545712,64.681238],[145.545956,64.683332],[145.545921,64.685441],[145.546201,64.68719],[145.546831,64.690854],[145.54739,64.693456],[145.54732,64.694248],[145.547041,64.695025],[145.547146,64.695653],[145.546796,64.69646],[145.546936,64.697462],[145.547635,64.698224],[145.546761,64.699256],[145.546376,64.700482],[145.546061,64.701617],[145.546516,64.702305],[145.546551,64.703785],[145.545681,64.704659],[145.545355,64.706054],[145.546225,64.707588],[145.547368,64.708634],[145.547314,64.710122],[145.547586,64.711633],[145.550361,64.714143],[145.550143,64.714864],[145.550905,64.715538],[145.552105,64.718794],[145.55274,64.719378],[145.553029,64.72024],[145.55301,64.720626],[145.55376,64.721497],[145.554549,64.721859],[145.554703,64.723264],[145.555184,64.724019],[145.555722,64.725572],[145.556184,64.728208],[145.555895,64.730327],[145.552875,64.736182],[145.552144,64.736839],[145.54945,64.741897],[145.548142,64.743292],[145.546603,64.744622],[145.546295,64.745722],[145.547103,64.746936],[145.54718,64.748365],[145.547757,64.749185],[145.54745,64.749678],[145.546757,64.750236],[145.546565,64.751221],[145.546796,64.751926],[145.547911,64.752566],[145.549951,64.753453],[145.552683,64.754847],[145.553606,64.756078],[145.554183,64.756636],[145.554914,64.7579],[145.555299,64.75854],[145.556992,64.758901],[145.559493,64.75959],[145.560724,64.760213],[145.561456,64.76082],[145.564534,64.76187],[145.565534,64.762083],[145.566111,64.762083],[145.56765,64.76251],[145.570998,64.763478],[145.573691,64.76374],[145.578386,64.765086],[145.58031,64.765742],[145.583118,64.766217],[145.586081,64.766874],[145.589275,64.767021],[145.593095,64.768327],[145.594211,64.769004],[145.596785,64.769845],[145.59823,64.770577],[145.598355,64.771243],[145.600648,64.772662],[145.603309,64.774308],[145.606527,64.775954],[145.60682,64.777634],[145.608158,64.778917],[145.609102,64.779209],[145.611592,64.779452],[145.615632,64.780895],[145.617556,64.78096],[145.621981,64.780813],[145.623481,64.780911],[145.628868,64.779255],[145.629891,64.779276],[145.636718,64.779419],[145.639719,64.780042],[145.644914,64.78096],[145.648376,64.781944],[145.651185,64.782468],[145.66396,64.787058],[145.668039,64.787943],[145.675195,64.789042],[145.676581,64.7895],[145.681678,64.790577],[145.68543,64.791369],[145.688663,64.791942],[145.693434,64.792827],[145.698474,64.794155],[145.704669,64.794745],[145.711595,64.795842],[145.714443,64.796186],[145.714886,64.796185],[145.719829,64.79617],[145.722407,64.795695],[145.724678,64.795728],[145.728949,64.796219],[145.731103,64.796219],[145.732796,64.796498],[145.735528,64.796645],[145.739915,64.797645],[145.743416,64.798103],[145.745802,64.79889],[145.748034,64.799201],[145.749996,64.80174],[145.752959,64.803854],[145.75319,64.80428],[145.755498,64.805492],[145.756345,64.805885],[145.758538,64.807916],[145.759269,64.809095],[145.758423,64.810372],[145.758461,64.812288],[145.759538,64.813451],[145.762116,64.814368],[145.764541,64.816136],[145.764887,64.817217],[145.767811,64.818707],[145.769235,64.819018],[145.77139,64.820262],[145.778662,64.822734],[145.790282,64.826008],[145.795361,64.827301],[145.805442,64.829346],[145.808751,64.830688],[145.811098,64.831228],[145.8146,64.832079],[145.816293,64.832145],[145.817794,64.832603],[145.820102,64.832701],[145.820602,64.833012],[145.820872,64.834108],[145.821853,64.834353],[145.822289,64.834561],[145.82371,64.835539],[145.824826,64.835799],[145.82639,64.836467],[145.82769,64.836641],[145.828737,64.836968],[145.829451,64.837613],[145.8319,64.838607],[145.833811,64.838986],[145.836158,64.839411],[145.839096,64.840189],[145.839947,64.840568],[145.841348,64.840941],[145.84462,64.841473],[145.845449,64.84171],[145.847327,64.841982],[145.847898,64.842017],[145.849653,64.842381],[145.853421,64.842694],[145.856673,64.843052],[145.8587,64.843706],[145.861108,64.844249],[145.862903,64.844822],[145.864128,64.845082],[145.867284,64.846076],[145.86946,64.846522],[145.870372,64.846863],[145.871773,64.847187],[145.87263,64.847701],[145.876276,64.848326],[145.877663,64.848326],[145.879473,64.848592],[145.880364,64.848586],[145.881908,64.848227],[145.883935,64.847956],[145.884547,64.848028],[145.884642,64.847898],[145.885146,64.847964],[145.885431,64.848094],[145.885363,64.848291],[145.885506,64.848407],[145.887145,64.848823],[145.888138,64.849424],[145.889043,64.84965],[145.889424,64.849979],[145.890451,64.850514],[145.890533,64.851124],[145.89088,64.851676],[145.891832,64.85243],[145.892893,64.85261],[145.895376,64.852494],[145.897933,64.85243],[145.901035,64.852737],[145.902463,64.853032],[145.903722,64.853081],[145.904613,64.853234],[145.905858,64.853298],[145.906919,64.853399],[145.908272,64.853459],[145.910292,64.853723],[145.91179,64.853747],[145.915676,64.854082],[145.920082,64.854229],[145.924006,64.853869],[145.925603,64.853673],[145.926142,64.85369],[145.927508,64.854327],[145.928758,64.854736],[145.929797,64.85481],[145.931279,64.854638],[145.932741,64.854646],[145.934915,64.854417],[145.936473,64.853869],[145.940282,64.852831],[145.942168,64.852807],[145.944015,64.852333],[145.946304,64.852169],[145.946766,64.852095],[145.947612,64.851703],[145.949075,64.851646],[145.949825,64.85176],[145.954596,64.851335],[145.95677,64.851924],[145.957617,64.85185],[145.960137,64.851147],[145.961695,64.850256],[145.962792,64.849888],[145.96435,64.848882],[145.966447,64.848784],[145.969622,64.848424],[145.972411,64.848065],[145.97447,64.848563],[145.976625,64.848923],[145.981011,64.848809],[145.98357,64.848948],[145.986571,64.848825],[145.990053,64.848261],[145.993316,64.847391],[145.994547,64.847505],[145.995624,64.847734],[145.996548,64.848306],[145.997741,64.848421],[145.999857,64.848323],[146.001127,64.84847],[146.003089,64.848993],[146.005629,64.849484],[146.007553,64.850334],[146.009361,64.851054],[146.010208,64.851201],[146.010515,64.851839],[146.010131,64.852689],[146.009707,64.853376],[146.008322,64.854733],[146.007014,64.855632],[146.005744,64.857005],[146.004975,64.857496],[146.003864,64.858455],[146.003129,64.859114],[146.003265,64.859403],[146.004626,64.859646],[146.005387,64.859715],[146.006748,64.859414],[146.010502,64.858698],[146.015237,64.858131],[146.017223,64.858085],[146.019644,64.857519],[146.022229,64.856605],[146.0231,64.855762],[146.022991,64.855311],[146.023317,64.854964],[146.0231,64.854594],[146.023072,64.854293],[146.023698,64.854212],[146.025031,64.854097],[146.026446,64.853623],[146.027725,64.853553],[146.02884,64.853588],[146.03303,64.853045],[146.035452,64.852524],[146.037656,64.85249],[146.039179,64.852721],[146.040703,64.853079],[146.042227,64.853068],[146.043152,64.852918],[146.046127,64.852925],[146.04712,64.852752],[146.049024,64.85287],[146.050963,64.852989],[146.052507,64.853376],[146.054887,64.853839],[146.056302,64.853917],[146.057567,64.854058],[146.05903,64.854093],[146.059894,64.854289],[146.062261,64.855183],[146.065158,64.855411],[146.06907,64.85542],[146.073831,64.855781],[146.076443,64.855781],[146.081599,64.856253],[146.085598,64.856369],[146.089679,64.856311],[146.093489,64.856739],[146.096699,64.857248],[146.098413,64.857248],[146.103338,64.857849],[146.107528,64.858195],[146.110167,64.858207],[146.111609,64.858404],[146.114547,64.858334],[146.116942,64.858034],[146.11822,64.857687],[146.123689,64.857132],[146.127117,64.856785],[146.129865,64.856935],[146.131634,64.856808],[146.133947,64.856878],[146.135661,64.857502],[146.136341,64.858207],[146.136069,64.859756],[146.13596,64.860253],[146.13664,64.860658],[146.137157,64.861663],[146.136722,64.86201],[146.13596,64.862553],[146.13645,64.863316],[146.136395,64.863674],[146.136695,64.863998],[146.136123,64.864703],[146.135062,64.865523],[146.134273,64.865951],[146.132096,64.866656],[146.131199,64.867337],[146.129893,64.867996],[146.12943,64.868597],[146.129076,64.870007],[146.128478,64.870758],[146.128777,64.871347],[146.12894,64.871902],[146.128668,64.872375],[146.128859,64.872733],[146.129403,64.873034],[146.130056,64.874339],[146.129947,64.875217],[146.130437,64.875437],[146.131443,64.875645],[146.132096,64.876084],[146.134028,64.876973],[146.136341,64.877909],[146.140585,64.878844],[146.141701,64.878995],[146.142844,64.879422],[146.145945,64.879734],[146.147768,64.880115],[146.15087,64.880519],[146.154597,64.881374],[146.155223,64.881894],[146.156475,64.881951],[146.157944,64.881894],[146.159495,64.882171],[146.161426,64.882563],[146.163657,64.88291],[146.165099,64.883464],[146.166188,64.883649],[146.167412,64.884226],[146.171711,64.885081],[146.175248,64.885543],[146.183682,64.887402],[146.18488,64.887922],[146.190974,64.891489],[146.19296,64.892471],[146.193423,64.89299],[146.193559,64.894526],[146.193613,64.895045],[146.194375,64.895264],[146.195654,64.895322],[146.196933,64.89568],[146.197722,64.896199],[146.198103,64.896638],[146.199055,64.898242],[146.201095,64.900343],[146.205313,64.903683],[146.208469,64.905368],[146.210482,64.905806],[146.213856,64.907583],[146.215597,64.909591],[146.218264,64.911091],[146.220386,64.911483],[146.221583,64.911991],[146.227623,64.915036],[146.228875,64.916997],[146.233228,64.919396],[146.238343,64.920803],[146.244764,64.922187],[146.249716,64.924101],[146.25347,64.926107],[146.256082,64.928575],[146.257987,64.929082],[146.261905,64.93118],[146.266802,64.931918],[146.269958,64.932886],[146.273441,64.934085],[146.278774,64.934938],[146.281114,64.936229],[146.284759,64.936944],[146.298363,64.941046],[146.301628,64.941945],[146.311477,64.945195],[146.312675,64.946416],[146.313654,64.947015],[146.315885,64.947453],[146.3173,64.948213],[146.318769,64.950126],[146.320402,64.951324],[146.323394,64.952568],[146.326659,64.953582],[146.328836,64.954618],[146.330958,64.955517],[146.331502,64.956162],[146.333788,64.957359],[146.335964,64.957659],[146.33776,64.957751],[146.339882,64.958373],[146.344236,64.958672],[146.348698,64.957866],[146.350221,64.957152],[146.350983,64.956645],[146.355826,64.956277],[146.359907,64.955424],[146.363934,64.955355],[146.368995,64.95501],[146.379769,64.956484],[146.383905,64.956323],[146.387605,64.95653],[146.389564,64.956323],[146.393101,64.956576],[146.396692,64.957129],[146.401046,64.956853],[146.403222,64.956576],[146.405399,64.956691],[146.409426,64.956162],[146.409806,64.955839],[146.410024,64.955401],[146.412146,64.955125],[146.414269,64.955332],[146.416228,64.955079],[146.41922,64.955171],[146.424063,64.955401],[146.426893,64.955102],[146.428199,64.955079],[146.428852,64.955309],[146.428852,64.955655],[146.42994,64.956069],[146.43179,64.955908],[146.43326,64.956231],[146.435926,64.956162],[146.437504,64.955724],[146.441748,64.955263],[146.443435,64.955309],[146.447571,64.954941],[146.448345,64.955158],[146.448018,64.955475],[146.447268,64.95589],[146.447403,64.956208],[146.448345,64.956347],[146.450904,64.956428],[146.456541,64.956892],[146.462428,64.957902],[146.470432,64.960744],[146.475511,64.962421],[146.478319,64.962625],[146.480744,64.962592],[146.48286,64.962307],[146.484957,64.961982],[146.486534,64.962006],[146.487997,64.962405],[146.488285,64.962861],[146.487939,64.963569],[146.488766,64.964758],[146.489728,64.965556],[146.490536,64.967795],[146.49169,64.96948],[146.492345,64.969838],[146.493326,64.969935],[146.499405,64.970831],[146.500983,64.97101],[146.504762,64.971563],[146.505454,64.971905],[146.506532,64.972231],[146.508494,64.972263],[146.514035,64.972752],[146.516343,64.972752],[146.518421,64.972426],[146.521461,64.972491],[146.523962,64.972931],[146.527925,64.973728],[146.528579,64.974575],[146.529195,64.97547],[146.530542,64.976821],[146.530619,64.97809],[146.531119,64.978676],[146.532812,64.978953],[146.533928,64.979229],[146.534582,64.979799],[146.535775,64.980059],[146.539314,64.980466],[146.542277,64.980645],[146.544586,64.980873],[146.548203,64.981378],[146.550742,64.981573],[146.553051,64.98198],[146.557168,64.983167],[146.5589,64.984014],[146.565577,64.986276],[146.566854,64.98664],[146.568596,64.987024],[146.570443,64.986828],[146.571674,64.986357],[146.572559,64.986178],[146.57506,64.986812],[146.58037,64.987381],[146.583256,64.98787],[146.584795,64.987642],[146.586257,64.986503],[146.587912,64.986112],[146.589066,64.986161],[146.59022,64.985771],[146.593376,64.985364],[146.595415,64.985543],[146.596377,64.985722],[146.597454,64.985559],[146.598532,64.985722],[146.599532,64.98595],[146.600956,64.985836],[146.602533,64.985624],[146.604188,64.985787],[146.605458,64.985722],[146.606112,64.985901],[146.607035,64.985933],[146.611691,64.987072],[146.613115,64.987056],[146.614115,64.986828],[146.615038,64.986259],[146.61577,64.986129],[146.616808,64.986324],[146.618155,64.986747],[146.619771,64.986698],[146.622619,64.986161],[146.625031,64.986565],[146.62622,64.986836],[146.628313,64.986552],[146.629545,64.986503],[146.632815,64.986812],[146.635586,64.986682],[146.639626,64.987089],[146.644859,64.987284],[146.648937,64.988162],[146.6524,64.988846],[146.655902,64.989675],[146.657095,64.990521],[146.65721,64.991042],[146.657287,64.991383],[146.658056,64.991741],[146.659288,64.991725],[146.660481,64.992001],[146.660904,64.992457],[146.660865,64.993059],[146.66095,64.993378],[146.66047,64.993914],[146.660904,64.994344],[146.660822,64.995177],[146.661516,64.995598],[146.662097,64.996149],[146.663405,64.996637],[146.663297,64.997534],[146.665406,64.998751],[146.666175,65.000052],[146.66883,65.001532],[146.671947,65.002377],[146.673217,65.00267],[146.673294,65.003223],[146.673563,65.003743],[146.673217,65.004426],[146.674409,65.005727],[146.674717,65.006409],[146.676487,65.007499],[146.677064,65.008783],[146.676564,65.009319],[146.675218,65.010587],[146.672255,65.011416],[146.669985,65.011628],[146.668484,65.011936],[146.667022,65.013139],[146.667022,65.013952],[146.666483,65.014277],[146.665444,65.014569],[146.663982,65.01652],[146.662712,65.017153],[146.662558,65.017855],[146.661693,65.018259],[146.660154,65.018446],[146.655983,65.018317],[146.654809,65.018349],[146.653539,65.018958],[146.653385,65.019365],[146.653539,65.019893],[146.652289,65.021493],[146.649788,65.021997],[146.648345,65.022143],[146.646402,65.022915],[146.64544,65.023207],[146.644478,65.02363],[146.642958,65.023898],[146.641419,65.023865],[146.640457,65.024093],[146.639072,65.024613],[146.638052,65.025449],[146.637841,65.025912],[146.636782,65.026465],[146.635686,65.028032],[146.635301,65.028958],[146.635243,65.030233],[146.635032,65.03094],[146.634666,65.031338],[146.634974,65.031614],[146.635994,65.032353],[146.635974,65.033043],[146.636744,65.034546],[146.636378,65.035057],[146.636205,65.035837],[146.634254,65.037574],[146.633658,65.038206],[146.633398,65.038506],[146.632814,65.03882],[146.63234,65.038969],[146.631048,65.039119],[146.627296,65.040374],[146.625473,65.041071],[146.624541,65.041359],[146.624192,65.041713],[146.623742,65.041925],[146.623068,65.042144],[146.622345,65.042407],[146.618016,65.043771],[146.61765,65.044607],[146.616342,65.045029],[146.615322,65.045662],[146.61488,65.046612],[146.613687,65.047432],[146.612283,65.047586],[146.61109,65.048008],[146.610744,65.048714],[146.610455,65.049534],[146.609782,65.049956],[146.609455,65.050654],[146.608556,65.051006],[146.607549,65.051546],[146.607359,65.052119],[146.606438,65.052956],[146.605909,65.053917],[146.605419,65.054193],[146.604101,65.054538],[146.603147,65.055092],[146.603013,65.055798],[146.602589,65.056666],[146.602955,65.057121],[146.60307,65.057827],[146.602743,65.058305],[146.603378,65.059092],[146.604513,65.05983],[146.605167,65.060585],[146.605841,65.062183],[146.606168,65.062718],[146.607418,65.063327],[146.608823,65.063967],[146.609554,65.064324],[146.611093,65.064697],[146.614633,65.066117],[146.617884,65.067488],[146.619956,65.069106],[146.623406,65.069977],[146.625176,65.071485],[146.627619,65.072669],[146.628831,65.073205],[146.629947,65.073513],[146.632486,65.074705],[146.633391,65.075345],[146.638027,65.076286],[146.63997,65.076983],[146.64074,65.077753],[146.64406,65.079415],[146.645124,65.08045],[146.646127,65.081036],[146.646242,65.081506],[146.647396,65.081912],[146.647839,65.082455],[146.649128,65.082673],[146.649821,65.082973],[146.651283,65.083735],[146.652687,65.084003],[146.653847,65.084508],[146.655746,65.084594],[146.656689,65.085129],[146.658132,65.086053],[146.659459,65.086823],[146.66096,65.087196],[146.661729,65.088444],[146.663519,65.089838],[146.664038,65.090494],[146.663403,65.091248],[146.663172,65.091677],[146.663461,65.092066],[146.663268,65.092487],[146.662634,65.093152],[146.66273,65.093622],[146.662037,65.094497],[146.662307,65.094894],[146.662614,65.095574],[146.663749,65.096425],[146.663884,65.098458],[146.664461,65.099114],[146.664519,65.09956],[146.664923,65.0999],[146.665462,65.100192],[146.665616,65.100516],[146.666655,65.101447],[146.667289,65.103642],[146.667309,65.104703],[146.667655,65.105359],[146.667424,65.106542],[146.667867,65.107052],[146.667867,65.107457],[146.669252,65.108574],[146.671118,65.109821],[146.672272,65.110461],[146.672657,65.111206],[146.673311,65.111651],[146.676197,65.112623],[146.677217,65.112898],[146.679737,65.114274],[146.681103,65.115124],[146.682834,65.115966],[146.685335,65.116905],[146.686778,65.117561],[146.687548,65.117618],[146.688895,65.117666],[146.689991,65.117909],[146.692531,65.118128],[146.693223,65.118136],[146.695532,65.118872],[146.696552,65.118969],[146.697764,65.119366],[146.700034,65.119641],[146.70115,65.119536],[146.702208,65.11947],[146.703038,65.119655],[146.703752,65.119652],[146.704531,65.119552],[146.705637,65.119788],[146.706217,65.120147],[146.707257,65.12034],[146.70996,65.120449],[146.715077,65.121501],[146.717636,65.121586],[146.719656,65.121254],[146.721157,65.121194],[146.722667,65.121594],[146.726544,65.122436],[146.729104,65.122536],[146.730979,65.122977],[146.734317,65.124576],[146.739281,65.125705],[146.743898,65.126049],[146.747207,65.125688],[146.74991,65.125753],[146.750199,65.125535],[146.74967,65.125365],[146.74967,65.124948],[146.750449,65.124835],[146.752431,65.125114],[146.755086,65.12534],[146.755778,65.125122],[146.756394,65.124608],[146.758587,65.124163],[146.761223,65.123609],[146.762685,65.123596],[146.765398,65.124046],[146.767591,65.125102],[146.770106,65.126452],[146.775531,65.128814],[146.779302,65.131436],[146.779918,65.132536],[146.78138,65.133669],[146.782534,65.135125],[146.786613,65.138102],[146.787921,65.138619],[146.792154,65.138263],[146.794924,65.138328],[146.798772,65.137907],[146.809699,65.138102],[146.814625,65.138522],[146.821012,65.139622],[146.82763,65.139881],[146.833709,65.14056],[146.845484,65.142534],[146.861798,65.144766],[146.865261,65.145801],[146.873649,65.147774],[146.875265,65.148453],[146.884192,65.150232],[146.896582,65.152463],[146.914589,65.15754],[146.91836,65.159156],[146.923131,65.160385],[146.93429,65.161225],[146.940216,65.160966],[146.942524,65.161807],[146.946757,65.161936],[146.951451,65.161096],[146.954529,65.16116],[146.957146,65.160902],[146.957976,65.160936],[146.95888,65.161425],[146.959628,65.161559],[146.959941,65.16143],[146.959907,65.161062],[146.959268,65.160256],[146.959186,65.159163],[146.960014,65.157821],[146.961399,65.156859],[146.96161,65.156471],[146.962188,65.15639],[146.962726,65.156697],[146.963746,65.156964],[146.964535,65.157005],[146.966691,65.157459],[146.970672,65.158298],[146.97248,65.158565],[146.974052,65.159014],[146.976391,65.159682],[146.979234,65.160098],[146.982612,65.160774],[146.984748,65.160762],[146.986955,65.160838],[146.991383,65.160842],[146.99202,65.161057],[146.994356,65.165627],[147.006259,65.168527],[147.009375,65.169843],[147.011471,65.170865],[147.015102,65.1711],[147.016777,65.171022],[147.022434,65.171945],[147.026655,65.172113],[147.033156,65.171401],[147.036582,65.17094],[147.044384,65.169269],[147.055029,65.166483],[147.057157,65.166429],[147.058371,65.166044],[147.05981,65.16556],[147.06292,65.165046],[147.065984,65.165108],[147.067453,65.165524],[147.065205,65.168129],[147.064603,65.169142],[147.06145,65.170368],[147.060142,65.170542],[147.057681,65.170633],[147.053381,65.171084],[147.050281,65.171428],[147.048968,65.171658],[147.047431,65.172274],[147.046981,65.172878],[147.046752,65.173521],[147.046812,65.175727],[147.046548,65.176474],[147.046477,65.176675],[147.046707,65.177512],[147.04695,65.178614],[147.046756,65.178815],[147.046467,65.179112],[147.04563,65.179537],[147.042931,65.180365],[147.041745,65.180354],[147.040711,65.180568],[147.040198,65.180996],[147.038859,65.183081],[147.038635,65.18372],[147.03812,65.184237],[147.034938,65.185993],[147.03376,65.187105],[147.032841,65.189213],[147.032783,65.190064],[147.033186,65.190832],[147.032351,65.191673],[147.031304,65.192479],[147.031138,65.192607],[147.028573,65.193805],[147.025195,65.194913],[147.022935,65.197045],[147.022675,65.198434],[147.020696,65.201109],[147.020028,65.202739],[147.018807,65.203315],[147.01752,65.205415],[147.017381,65.206309],[147.016512,65.20688],[147.015231,65.20754],[147.014451,65.207933],[147.014094,65.208039],[147.013172,65.208656],[147.013,65.209813],[147.014979,65.211252],[147.015241,65.212014],[147.015638,65.213365],[147.016694,65.214423],[147.016557,65.21522],[147.014505,65.218471],[147.014495,65.219511],[147.010997,65.224367],[147.009122,65.228148],[147.008713,65.229711],[147.007701,65.230404],[147.007503,65.230973],[147.007475,65.231767],[147.006439,65.233503],[147.004858,65.236344],[147.003659,65.237469],[147.000785,65.239227],[146.998004,65.24186],[146.996333,65.243886],[146.994442,65.245304],[146.991682,65.248205],[146.990861,65.249853],[146.989182,65.251348],[146.986577,65.253186],[146.982537,65.254814],[146.978544,65.257554],[146.97751,65.258007],[146.977247,65.258688],[146.975268,65.259903],[146.974212,65.260878],[146.973245,65.261357],[146.972541,65.262535],[146.972717,65.263031],[146.971749,65.26386],[146.970518,65.264099],[146.970034,65.264264],[146.970034,65.264504],[146.970694,65.264724],[146.971486,65.264835],[146.97153,65.265295],[146.971486,65.265681],[146.971574,65.266215],[146.970958,65.267889],[146.972013,65.269747],[146.971046,65.271348],[146.971266,65.271808],[146.970606,65.272746],[146.96999,65.273169],[146.968495,65.273629],[146.964581,65.274751],[146.960755,65.276241],[146.958468,65.277271],[146.957633,65.277933],[146.955654,65.27808],[146.954818,65.278301],[146.954159,65.279092],[146.953807,65.280508],[146.953323,65.281207],[146.9524,65.281814],[146.952356,65.282512],[146.952751,65.283229],[146.953939,65.284149],[146.953499,65.28516],[146.953675,65.285767],[146.952048,65.287587],[146.951036,65.289922],[146.950421,65.291687],[146.949585,65.292661],[146.949893,65.294131],[146.949101,65.295988],[146.946463,65.299645],[146.945187,65.300527],[146.944264,65.30095],[146.942461,65.302769],[146.941713,65.304092],[146.939382,65.306591],[146.937667,65.307491],[146.936172,65.309383],[146.935688,65.310687],[146.933841,65.313498],[146.934369,65.314967],[146.936128,65.316546],[146.936656,65.318585],[146.936612,65.319595],[146.937403,65.320127],[146.937535,65.321376],[146.937447,65.32413],[146.937183,65.325305],[146.936304,65.326076],[146.935688,65.327435],[146.935644,65.328848],[146.93648,65.329601],[146.936084,65.33006],[146.936304,65.330812],[146.935336,65.331601],[146.933489,65.333547],[146.930851,65.334575],[146.928564,65.335933],[146.923682,65.338649],[146.916338,65.341951],[146.915019,65.342905],[146.915019,65.344813],[146.915283,65.345419],[146.914095,65.347327],[146.914315,65.349234],[146.911633,65.35138],[146.910006,65.353471],[146.904992,65.358587],[146.901078,65.361044],[146.895625,65.365609],[146.893074,65.367368],[146.891359,65.370393],[146.890568,65.371969],[146.8896,65.3725],[146.888457,65.374498],[146.888501,65.375432],[146.887357,65.377155],[146.885598,65.378236],[146.884499,65.379005],[146.88296,65.379646],[146.882036,65.380636],[146.880717,65.381167],[146.880057,65.381973],[146.87865,65.382468],[146.876539,65.382743],[146.874736,65.383182],[146.873856,65.384043],[146.87412,65.385454],[146.873505,65.386314],[146.872933,65.387285],[146.870866,65.388677],[146.870602,65.389648],[146.87025,65.390637],[146.869107,65.392138],[146.86704,65.394153],[146.866952,65.39472],[146.86594,65.396057],[146.864445,65.396734],[146.864313,65.397192],[146.864313,65.398089],[146.86317,65.399865],[146.860399,65.402501],[146.859036,65.403599],[146.856222,65.405064],[146.854726,65.405576],[146.852352,65.408559],[146.849845,65.410371],[146.849493,65.411323],[146.849625,65.413555],[146.849141,65.416556],[146.850109,65.419336],[146.851208,65.422977],[146.85112,65.424202],[146.851598,65.424737],[146.851426,65.425232],[146.851172,65.425883],[146.850329,65.427],[146.848833,65.428866],[146.847382,65.430072],[146.845447,65.432925],[146.844571,65.434944],[146.843626,65.43717],[146.84221,65.438802],[146.841797,65.439159],[146.840522,65.440018],[146.840038,65.440987],[146.839839,65.441246],[146.839217,65.441638],[146.839131,65.441785],[146.839249,65.442093],[146.839592,65.442775],[146.839743,65.443248],[146.839635,65.444157],[146.839442,65.445861],[146.838777,65.446672],[146.838026,65.447541],[146.838348,65.448424],[146.83867,65.449111],[146.838884,65.449926],[146.839088,65.450524],[146.839099,65.450907],[146.839234,65.451072],[146.839753,65.45129],[146.839862,65.451476],[146.840011,65.452338],[146.840054,65.452913],[146.839936,65.453684],[146.840058,65.454447],[146.839377,65.455696],[146.839582,65.455881],[146.840247,65.456037],[146.841445,65.456226],[146.843616,65.456447],[146.845284,65.456738],[146.845579,65.456933],[146.845614,65.457289],[146.845493,65.457552],[146.845227,65.457816],[146.844699,65.458029],[146.843941,65.458209],[146.842983,65.458274],[146.842237,65.458272],[146.841738,65.458243],[146.839994,65.45798],[146.83808,65.457454],[146.837683,65.457334],[146.837309,65.457272],[146.83661,65.457387],[146.835655,65.457628],[146.834904,65.457784],[146.834191,65.458037],[146.834131,65.458252],[146.833863,65.458466],[146.832878,65.458827],[146.829879,65.460592],[146.822183,65.463496],[146.819721,65.463971],[146.817654,65.465359],[146.813916,65.466381],[146.80622,65.467659],[146.799007,65.469047],[146.79417,65.470964],[146.792587,65.471914],[146.792367,65.473502],[146.791531,65.474725],[146.79074,65.475254],[146.788981,65.478777],[146.788805,65.481059],[146.789156,65.483267],[146.789306,65.484482],[146.789757,65.484816],[146.789864,65.484967],[146.789821,65.485168],[146.789907,65.485448],[146.790165,65.485804],[146.790529,65.486169],[146.790776,65.486703],[146.790851,65.486979],[146.790926,65.487438],[146.791184,65.487985],[146.791495,65.488301],[146.792064,65.488595],[146.793083,65.488809],[146.793759,65.488978],[146.794875,65.48908],[146.795325,65.489178],[146.796012,65.489276],[146.796591,65.489303],[146.797353,65.489307],[146.797889,65.489356],[146.798125,65.489454],[146.798919,65.489699],[146.799735,65.48989],[146.800904,65.490108],[146.801923,65.49022],[146.803554,65.490349],[146.80423,65.490487],[146.805378,65.490625],[146.806741,65.490905],[146.807234,65.490945],[146.807867,65.491048],[146.808211,65.491203],[146.808833,65.49151],[146.809015,65.491715],[146.808994,65.49188],[146.808811,65.492134],[146.808597,65.492436],[146.808543,65.492841],[146.808672,65.49313],[146.808822,65.493375],[146.808715,65.49366],[146.808393,65.49443],[146.808135,65.495048],[146.807921,65.495698],[146.807685,65.496041],[146.807867,65.49641],[146.808093,65.496699],[146.808286,65.496944],[146.808447,65.497113],[146.808447,65.497282],[146.808007,65.497999],[146.80747,65.49851],[146.807073,65.498977],[146.806934,65.499271],[146.806955,65.499525],[146.806891,65.499921],[146.806526,65.500828],[146.806376,65.501656],[146.806279,65.502283],[146.806333,65.502621],[146.806247,65.502821],[146.805893,65.503115],[146.804552,65.503902],[146.803822,65.504418],[146.803447,65.504734],[146.801773,65.505771],[146.801333,65.506122],[146.80099,65.506625],[146.800379,65.50743],[146.80025,65.507759],[146.800336,65.50803],[146.800497,65.508204],[146.800808,65.508337],[146.801269,65.508631],[146.80173,65.509067],[146.801966,65.509182],[146.802696,65.509405],[146.803104,65.509658],[146.803307,65.509894],[146.803544,65.510281],[146.803865,65.51053],[146.80437,65.510694],[146.805228,65.510975],[146.806322,65.511428],[146.806666,65.511637],[146.807395,65.512224],[146.807964,65.512794],[146.808221,65.513283],[146.808404,65.513518],[146.808275,65.514008],[146.80806,65.51439],[146.807867,65.514826],[146.807975,65.515079],[146.808318,65.515368],[146.808511,65.515551],[146.80849,65.515871],[146.808511,65.516231],[146.808522,65.5164],[146.808747,65.51652],[146.809337,65.516742],[146.80997,65.516996],[146.810389,65.517169],[146.811043,65.517467],[146.811547,65.517689],[146.812084,65.518054],[146.81306,65.518494],[146.8138,65.518925],[146.814444,65.519401],[146.815034,65.520001],[146.815764,65.520561],[146.816225,65.520988],[146.816568,65.521233],[146.817158,65.52149],[146.817791,65.521757],[146.818929,65.522144],[146.820023,65.522526],[146.822287,65.523157],[146.822823,65.523286],[146.823327,65.523393],[146.823542,65.523513],[146.823628,65.523615],[146.823553,65.524064],[146.823746,65.524371],[146.823907,65.52462],[146.823928,65.524958],[146.823864,65.52542],[146.823875,65.525576],[146.823982,65.525847],[146.823939,65.526184],[146.823918,65.526411],[146.823821,65.527104],[146.823875,65.52766],[146.823982,65.52794],[146.823832,65.528793],[146.823671,65.52938],[146.82396,65.530269],[146.824014,65.531047],[146.824014,65.531491],[146.82439,65.531971],[146.824465,65.532522],[146.824175,65.53417],[146.824433,65.535259],[146.824197,65.535774],[146.8244,65.536228],[146.824347,65.537365],[146.824143,65.538236],[146.824164,65.538915],[146.824154,65.53968],[146.82381,65.540879],[146.823864,65.541905],[146.824239,65.543366],[146.824679,65.544726],[146.82483,65.545272],[146.824583,65.545565],[146.824315,65.546089],[146.824443,65.546418],[146.824744,65.547128],[146.82484,65.547932],[146.825398,65.549602],[146.825827,65.550899],[146.826578,65.552027],[146.826814,65.552852],[146.826975,65.553137],[146.827372,65.553283],[146.828316,65.553381],[146.829057,65.55347],[146.829593,65.553558],[146.829647,65.553678],[146.829668,65.553989],[146.8294,65.55458],[146.829443,65.554819],[146.829497,65.555064],[146.8294,65.555241],[146.829089,65.55549],[146.828628,65.555769],[146.827919,65.556125],[146.827469,65.556435],[146.827426,65.556573],[146.827598,65.557936],[146.827598,65.558939],[146.82749,65.560564],[146.827319,65.562268],[146.827619,65.56368],[146.827769,65.564621],[146.827598,65.565748],[146.827254,65.566884],[146.827147,65.567843],[146.826911,65.568482],[146.826568,65.570123],[146.82631,65.570629],[146.825366,65.571277],[146.824894,65.571721],[146.824615,65.572324],[146.824508,65.572786],[146.824787,65.573345],[146.825559,65.573779],[146.826031,65.574312],[146.825902,65.57511],[146.825645,65.577666],[146.825452,65.579223],[146.825237,65.579626],[146.824894,65.58007],[146.824883,65.580615],[146.824808,65.581746],[146.824915,65.582314],[146.826417,65.584265],[146.827061,65.585534],[146.827705,65.586633],[146.828821,65.588549],[146.829979,65.590491],[146.830065,65.590908],[146.829936,65.59128],[146.83043,65.592185],[146.830752,65.59285],[146.830666,65.593284],[146.830258,65.593887],[146.830065,65.594472],[146.829926,65.595066],[146.829443,65.596254],[146.829207,65.597194],[146.829089,65.597597],[146.828767,65.598475],[146.828531,65.598994],[146.827394,65.600434],[146.826492,65.601985],[146.826246,65.602464],[146.826246,65.602677],[146.826417,65.602925],[146.826696,65.603262],[146.826847,65.603581],[146.827308,65.60452],[146.827726,65.605118],[146.828123,65.605442],[146.828381,65.605858],[146.828477,65.606231],[146.828166,65.60674],[146.828102,65.607378],[146.828166,65.608021],[146.828263,65.608579],[146.828617,65.609053],[146.828896,65.609718],[146.829143,65.610068],[146.830054,65.61137],[146.830612,65.611857],[146.831224,65.612425],[146.831503,65.612894],[146.831567,65.613182],[146.831803,65.61331],[146.832104,65.61339],[146.832576,65.613448],[146.833219,65.613448],[146.833713,65.613497],[146.834829,65.613705],[146.835816,65.613953],[146.836696,65.614254],[146.837758,65.614524],[146.83838,65.614626],[146.838992,65.614666],[146.839292,65.614728],[146.839989,65.61475],[146.840472,65.61475],[146.840869,65.614781],[146.84132,65.614927],[146.842296,65.615348],[146.843165,65.615796],[146.843476,65.615924],[146.843959,65.616557],[146.844388,65.617129],[146.84456,65.61747],[146.844528,65.617873],[146.844656,65.618298],[146.84471,65.618679],[146.844184,65.621305],[146.844013,65.622536],[146.844077,65.622749],[146.84441,65.623028],[146.844903,65.623409],[146.845504,65.623758],[146.846073,65.624223],[146.846867,65.624595],[146.847607,65.62487],[146.84854,65.625383],[146.850729,65.626446],[146.851791,65.626964],[146.852252,65.627261],[146.853433,65.627752],[146.855364,65.628425],[146.856855,65.628948],[146.861962,65.630324],[146.862713,65.63063],[146.863443,65.6309],[146.864333,65.631042],[146.865556,65.631139],[146.866769,65.63136],[146.867155,65.6314],[146.867616,65.631382],[146.869251,65.631218],[146.871446,65.631152],[146.873209,65.631218],[146.874815,65.631418],[146.875974,65.631431],[146.87709,65.631546],[146.881574,65.631954],[146.884525,65.632108],[146.88607,65.632228],[146.888206,65.632379],[146.894181,65.632436],[146.897818,65.632542],[146.901026,65.632538],[146.903182,65.632498],[146.904019,65.632494],[146.906896,65.632688],[146.907313,65.632657],[146.907989,65.632587],[146.909555,65.632653],[146.910371,65.632666],[146.910671,65.63271],[146.911004,65.632865],[146.911304,65.633038],[146.911663,65.633145],[146.912248,65.633175],[146.912967,65.633149],[146.913536,65.633184],[146.914051,65.633312],[146.914372,65.633295],[146.916903,65.633055],[146.919577,65.633139],[146.922049,65.633485],[146.924583,65.633831],[146.926791,65.633972],[146.929668,65.633863],[146.934792,65.633979],[146.936751,65.634274],[146.941696,65.634774],[146.945707,65.635467],[146.948226,65.635801],[146.949812,65.635865],[146.951087,65.635878],[146.952665,65.635713],[146.95429,65.635544],[146.95516,65.635339],[146.956622,65.63471],[146.957706,65.634385],[146.960586,65.633981],[146.962345,65.633881],[146.965984,65.634036],[146.970855,65.634457],[146.974813,65.634616],[146.97788,65.634389],[146.98175,65.634476],[146.985015,65.634172],[146.988742,65.634167],[146.993338,65.634181],[146.995284,65.634203],[146.996966,65.633913],[146.998242,65.633337],[146.998923,65.632729],[147.001034,65.631793],[147.004156,65.631058],[147.011479,65.629761],[147.015151,65.628626],[147.017086,65.627728],[147.017855,65.626893],[147.018779,65.626467],[147.019966,65.626303],[147.022121,65.626095],[147.025375,65.625587],[147.027948,65.625378],[147.030477,65.62546],[147.032566,65.625768],[147.03505,65.62683],[147.036048,65.627563],[147.036154,65.62764],[147.036361,65.627793],[147.037119,65.62803],[147.037846,65.628113],[147.038973,65.628012],[147.039801,65.627857],[147.041391,65.627457],[147.043081,65.626979],[147.043925,65.626947],[147.04506,65.627169],[147.047085,65.627804],[147.049872,65.628309],[147.051524,65.628317],[147.053032,65.628229],[147.055135,65.627809],[147.056888,65.627396],[147.057483,65.627316],[147.058078,65.627104],[147.059815,65.626912],[147.060371,65.626938],[147.061071,65.627143],[147.061798,65.627687],[147.062252,65.628129],[147.06256,65.628662],[147.063143,65.629077],[147.064278,65.629579],[147.065658,65.630189],[147.06845,65.631013],[147.075126,65.633179],[147.079017,65.633873],[147.082079,65.634279],[147.084453,65.634304],[147.087889,65.634122],[147.093672,65.633794],[147.096074,65.633912],[147.097152,65.634048],[147.098224,65.634277],[147.099494,65.634374],[147.101593,65.634268],[147.10455,65.634779],[147.108243,65.635016],[147.112895,65.635054],[147.115347,65.634815],[147.117271,65.634419],[147.118515,65.634395],[147.11916,65.634268],[147.120653,65.633936],[147.12328,65.633277],[147.127121,65.632764],[147.131013,65.632589],[147.136444,65.632729],[147.141149,65.632638],[147.145668,65.632221],[147.148735,65.631709],[147.150099,65.631795],[147.151391,65.632355],[147.152963,65.633328],[147.154025,65.633789],[147.155305,65.634203],[147.158229,65.634419],[147.162726,65.634668],[147.165543,65.634813],[147.168093,65.635114],[147.168603,65.635162],[147.169026,65.63496],[147.16953,65.634346],[147.170135,65.63378],[147.17048,65.633547],[147.173146,65.632946],[147.174674,65.632267],[147.176128,65.63167],[147.178253,65.631161],[147.180782,65.630717],[147.1827,65.630252],[147.186036,65.629854],[147.188085,65.629546],[147.189332,65.629443],[147.191443,65.629308],[147.192178,65.628971],[147.192744,65.628983],[147.193085,65.62904],[147.193582,65.629044],[147.19408,65.628975],[147.19531,65.628653],[147.197187,65.628237],[147.199327,65.627892],[147.201425,65.627497],[147.207306,65.626773],[147.209188,65.626647],[147.210432,65.626549],[147.214029,65.626175],[147.226381,65.624715],[147.234652,65.62376],[147.23725,65.6234],[147.240031,65.623197],[147.243505,65.622942],[147.247218,65.622841],[147.249872,65.622592],[147.25124,65.622189],[147.252048,65.621875],[147.254863,65.62163],[147.258117,65.621303],[147.261965,65.620795],[147.269427,65.620224],[147.282556,65.619448],[147.291079,65.618485],[147.291535,65.618478],[147.291993,65.618666],[147.292489,65.61864],[147.293083,65.618501],[147.294003,65.618625],[147.294888,65.618528],[147.295656,65.617969],[147.297403,65.616961],[147.29893,65.616429],[147.299671,65.61611],[147.302834,65.61567],[147.30792,65.61547],[147.309243,65.615393],[147.310109,65.615428],[147.312308,65.615836],[147.313657,65.616154],[147.314852,65.616158],[147.316533,65.61605],[147.318424,65.616076],[147.319557,65.616011],[147.320454,65.615738],[147.32163,65.615245],[147.323488,65.614681],[147.324074,65.614407],[147.32507,65.614347],[147.328055,65.614208],[147.337401,65.613455],[147.346852,65.613534],[147.35486,65.613876],[147.363702,65.613995],[147.366055,65.614266],[147.369593,65.614655],[147.374785,65.615118],[147.375582,65.615398],[147.378038,65.617144],[147.379578,65.617634],[147.381029,65.618415],[147.381568,65.618809],[147.382278,65.619126],[147.384063,65.619395],[147.384547,65.619513],[147.384547,65.619677],[147.384107,65.62014],[147.384239,65.620493],[147.384987,65.620956],[147.386152,65.621465],[147.387274,65.621637],[147.388571,65.621773],[147.389428,65.622055],[147.389934,65.622499],[147.391078,65.622817],[147.391144,65.623116],[147.39099,65.623489],[147.391781,65.624559],[147.391913,65.625131],[147.391957,65.625957],[147.392661,65.626293],[147.394002,65.626683],[147.394354,65.627109],[147.39431,65.627726],[147.394618,65.628298],[147.395511,65.628836],[147.396512,65.628958],[147.397651,65.628652],[147.398072,65.628255],[147.398422,65.628171],[147.399029,65.628201],[147.399763,65.62847],[147.400339,65.628845],[147.400247,65.629187],[147.400247,65.629478],[147.400753,65.629813],[147.401507,65.629994],[147.402688,65.630793],[147.403281,65.631465],[147.403545,65.632218],[147.403985,65.632798],[147.403441,65.633647],[147.404117,65.633996],[147.404798,65.634395],[147.405216,65.635057],[147.406492,65.635492],[147.407123,65.635951],[147.407979,65.636041],[147.409614,65.635855],[147.410559,65.635819],[147.411549,65.636146],[147.413022,65.637234],[147.41344,65.637751],[147.413616,65.638295],[147.414561,65.638767],[147.415793,65.639819],[147.416635,65.640155],[147.418572,65.640425],[147.419729,65.640708],[147.420037,65.641089],[147.420208,65.641503],[147.419356,65.641926],[147.418651,65.642313],[147.421578,65.643895],[147.423238,65.644111],[147.42549,65.644562],[147.426127,65.645115],[147.426303,65.645686],[147.426743,65.646285],[147.426721,65.64711],[147.428084,65.647944],[147.428326,65.648398],[147.428458,65.648796],[147.42936,65.649141],[147.429816,65.649285],[147.4311,65.649277],[147.433145,65.649932],[147.433581,65.650456],[147.432944,65.651353],[147.4329,65.652024],[147.433625,65.652432],[147.436438,65.653083],[147.437232,65.653402],[147.437891,65.654381],[147.438627,65.654746],[147.441329,65.655362],[147.443081,65.655677],[147.444554,65.65662],[147.444532,65.65758],[147.444004,65.658278],[147.44495,65.659511],[147.445125,65.660372],[147.445651,65.660809],[147.448899,65.661356],[147.450623,65.66222],[147.451568,65.6628],[147.453118,65.663255],[147.454712,65.663794],[147.454482,65.664322],[147.455019,65.66489],[147.455874,65.665111],[147.458011,65.666814],[147.457879,65.667376],[147.457219,65.668608],[147.457804,65.669114],[147.460589,65.670298],[147.462569,65.671042],[147.465798,65.671714],[147.466675,65.672053],[147.466278,65.672775],[147.466872,65.673201],[147.469481,65.674196],[147.471273,65.674432],[147.471883,65.674082],[147.472671,65.673983],[147.473531,65.674089],[147.474531,65.674611],[147.475529,65.674286],[147.478271,65.674059],[147.480746,65.674102],[147.483804,65.675493],[147.485106,65.675427],[147.486615,65.675611],[147.49,65.676475],[147.491264,65.677015],[147.493681,65.677547],[147.495577,65.678031],[147.496754,65.678017],[147.497496,65.677999],[147.498133,65.678175],[147.498843,65.678612],[147.501507,65.679301],[147.503219,65.67955],[147.505176,65.680681],[147.505909,65.680962],[147.507677,65.681027],[147.510173,65.681434],[147.511506,65.681786],[147.51725,65.682629],[147.520712,65.683128],[147.523813,65.684016],[147.525714,65.684092],[147.527694,65.683904],[147.528588,65.68346],[147.530528,65.6833],[147.532028,65.683588],[147.535799,65.68348],[147.538688,65.683804],[147.540605,65.683603],[147.541504,65.683554],[147.544626,65.684453],[147.54662,65.684894],[147.549143,65.686099],[147.549951,65.687245],[147.551402,65.688227],[147.551172,65.689034],[147.5504,65.689637],[147.546723,65.691162],[147.543312,65.693656],[147.542593,65.694024],[147.541579,65.694372],[147.541177,65.694558],[147.540834,65.695019],[147.540302,65.696318],[147.54004,65.69689],[147.539661,65.697171],[147.539567,65.697541],[147.539286,65.697876],[147.538362,65.698483],[147.538196,65.698957],[147.537885,65.699443],[147.537947,65.700582],[147.538538,65.701452],[147.539728,65.702269],[147.53972,65.702838],[147.539747,65.703396],[147.53975,65.70356],[147.539723,65.704108],[147.539218,65.706137],[147.540241,65.707506],[147.542918,65.708446],[147.544495,65.709175],[147.546343,65.710983],[147.54709,65.71207],[147.547616,65.712547],[147.5487,65.713018],[147.551994,65.713535],[147.553083,65.713976],[147.555777,65.714662],[147.557533,65.715451],[147.564659,65.717303],[147.566163,65.717475],[147.567976,65.718114],[147.569355,65.719526],[147.570016,65.719922],[147.570415,65.720272],[147.568734,65.723049],[147.567556,65.723898],[147.567489,65.725893],[147.568683,65.72681],[147.568951,65.727351],[147.569635,65.728233],[147.572122,65.730431],[147.573149,65.732067],[147.573741,65.732686],[147.577486,65.734903],[147.58057,65.735974],[147.582505,65.736457],[147.584554,65.736648],[147.586705,65.737123],[147.589543,65.737651],[147.590149,65.737814],[147.590687,65.738559],[147.592155,65.739599],[147.594763,65.740495],[147.596005,65.740816],[147.596455,65.741487],[147.597279,65.742303],[147.597986,65.742847],[147.599643,65.743606],[147.599829,65.745152],[147.599798,65.745867],[147.601328,65.746724],[147.602583,65.747125],[147.603374,65.747566],[147.602846,65.748217],[147.603078,65.748595],[147.604088,65.748822],[147.605486,65.748924],[147.606049,65.749009],[147.605982,65.749442],[147.605829,65.750217],[147.608246,65.751088],[147.61213,65.752193],[147.614445,65.753249],[147.614938,65.753544],[147.616939,65.753834],[147.617972,65.754042],[147.619026,65.754813],[147.620353,65.75551],[147.621176,65.755726],[147.622829,65.755634],[147.623886,65.755717],[147.624271,65.755841],[147.624476,65.756007],[147.624385,65.756638],[147.627816,65.757884],[147.628089,65.758379],[147.629365,65.758511],[147.630926,65.759302],[147.631641,65.760055],[147.634191,65.761115],[147.639291,65.761612],[147.640379,65.762021],[147.641685,65.762021],[147.643707,65.762315],[147.647314,65.762493],[147.649922,65.762892],[147.653262,65.762625],[147.654906,65.76234],[147.65599,65.762352],[147.656931,65.762189],[147.660584,65.762215],[147.6628,65.761944],[147.664448,65.761485],[147.668646,65.761089],[147.670574,65.761127],[147.672378,65.761217],[147.673715,65.760949],[147.674274,65.760617],[147.675487,65.760412],[147.678597,65.760451],[147.679592,65.760578],[147.680743,65.760412],[147.682733,65.76054],[147.68407,65.760323],[147.685189,65.760476],[147.68718,65.761166],[147.690382,65.761791],[147.692217,65.762378],[147.693834,65.762468],[147.695265,65.762059],[147.697162,65.762034],[147.697877,65.762353],[147.697659,65.763374],[147.69881,65.764319],[147.70024,65.764663],[147.703941,65.764472],[147.705247,65.764855],[147.705184,65.765416],[147.704594,65.766042],[147.7059,65.767114],[147.706988,65.767152],[147.710129,65.767701],[147.713145,65.768122],[147.714327,65.768135],[147.716286,65.768441],[147.718587,65.768607],[147.720888,65.769258],[147.722194,65.770279],[147.723905,65.770471],[147.727605,65.771504],[147.728103,65.772117],[147.72776,65.772576],[147.727885,65.773329],[147.728818,65.773878],[147.730932,65.773903],[147.732114,65.774107],[147.735068,65.775077],[147.737525,65.775588],[147.73908,65.775907],[147.741412,65.777961],[147.742749,65.778292],[147.744179,65.77953],[147.74533,65.780104],[147.745237,65.780499],[147.743309,65.780946],[147.741319,65.78115],[147.738085,65.78175],[147.736094,65.781966],[147.734726,65.782349],[147.73314,65.783293],[147.730839,65.78402],[147.727667,65.784467],[147.724402,65.784224],[147.721479,65.784135],[147.719986,65.784262],[147.718027,65.784467],[147.715477,65.78425],[147.714358,65.784416],[147.713736,65.784722],[147.713674,65.785245],[147.71358,65.785831],[147.712772,65.786278],[147.712337,65.786788],[147.713394,65.786966],[147.71498,65.787604],[147.716006,65.787719],[147.716504,65.788076],[147.717872,65.788114],[147.718587,65.788407],[147.718463,65.789389],[147.719209,65.790065],[147.719085,65.790601],[147.72008,65.790996],[147.719924,65.791353],[147.720297,65.791978],[147.720981,65.792259],[147.720795,65.792641],[147.720111,65.792947],[147.72036,65.793253],[147.72151,65.79324],[147.722443,65.793342],[147.722661,65.793572],[147.722256,65.794248],[147.722941,65.794503],[147.724122,65.79514],[147.724464,65.795854],[147.725677,65.796147],[147.726454,65.79681],[147.728849,65.797805],[147.730248,65.797932],[147.732052,65.79857],[147.733824,65.799985],[147.737307,65.802202],[147.740417,65.803668],[147.741194,65.804153],[147.741505,65.805121],[147.742314,65.806128],[147.743371,65.80753],[147.745237,65.809084],[147.745703,65.810104],[147.746294,65.810537],[147.746543,65.811353],[147.747413,65.812181],[147.747631,65.812716],[147.750648,65.814423],[147.752669,65.815901],[147.756027,65.818232],[147.757053,65.818843],[147.758981,65.819149],[147.761904,65.819277],[147.764703,65.819302],[147.767595,65.819047],[147.76943,65.818933],[147.772384,65.818219],[147.774623,65.81743],[147.778572,65.815952],[147.779598,65.815315],[147.783952,65.814054],[147.788026,65.811658],[147.789891,65.810779],[147.791415,65.809683],[147.794587,65.808396],[147.806528,65.804828],[147.820375,65.801827],[147.823058,65.801647],[147.825257,65.800962],[147.827016,65.800295],[147.828423,65.800042],[147.829567,65.799925],[147.83049,65.79943],[147.832909,65.798672],[147.834338,65.798717],[147.835218,65.798285],[147.836867,65.798438],[147.840297,65.798068],[147.845069,65.79741],[147.845926,65.797257],[147.848191,65.797212],[147.849554,65.797221],[147.850896,65.796851],[147.851951,65.79668],[147.8536,65.796635],[147.856239,65.796121],[147.857536,65.795995],[147.858943,65.79604],[147.86499,65.795598],[147.873346,65.793922],[147.877458,65.793435],[147.882493,65.792371],[147.883768,65.792335],[147.886759,65.791686],[147.890695,65.791677],[147.895972,65.791054],[147.899358,65.790964],[147.903954,65.791172],[147.908616,65.791649],[147.909473,65.791929],[147.909957,65.79192],[147.910726,65.791731],[147.912024,65.791803],[147.917301,65.792353],[147.920094,65.792668],[147.923392,65.792542],[147.926206,65.792948],[147.927548,65.793345],[147.930868,65.79384],[147.931945,65.794309],[147.932605,65.795076],[147.932187,65.79632],[147.931901,65.796743],[147.932781,65.797501],[147.932693,65.797996],[147.932209,65.798555],[147.932495,65.799547],[147.932209,65.800286],[147.932781,65.801485],[147.932517,65.802134],[147.933001,65.802539],[147.934056,65.803152],[147.934716,65.803783],[147.936915,65.804188],[147.937794,65.804747],[147.939619,65.804747],[147.940477,65.805063],[147.941532,65.806631],[147.942698,65.807397],[147.944369,65.807613],[147.946282,65.807469],[147.948041,65.807703],[147.949602,65.807622],[147.950504,65.807757],[147.952131,65.80846],[147.955033,65.808757],[147.957342,65.809316],[147.960926,65.809604],[147.963521,65.810622],[147.966116,65.811064],[147.967985,65.811172],[147.968732,65.811433],[147.974537,65.814154],[147.976318,65.814622],[147.977484,65.814884],[147.978187,65.815379],[147.979573,65.815956],[147.980056,65.816928],[147.981574,65.818289],[147.982629,65.818487],[147.985026,65.818748],[147.986037,65.819081],[147.987269,65.819045],[147.989292,65.818865],[147.991512,65.818982],[147.994613,65.818865],[147.998153,65.819036],[147.999516,65.818991],[148.00099,65.81909],[148.004134,65.819036],[148.005827,65.819541],[148.008202,65.819928],[148.01095,65.820162],[148.013853,65.820747],[148.017525,65.821576],[148.018822,65.822044],[148.019834,65.822071],[148.020713,65.821648],[148.020889,65.821081],[148.021373,65.820819],[148.022626,65.820747],[148.023594,65.820955],[148.024297,65.821432],[148.024495,65.821792],[148.024187,65.822242],[148.02311,65.822657],[148.021879,65.823134],[148.021835,65.823458],[148.022384,65.823584],[148.02366,65.823485],[148.024847,65.823593],[148.025419,65.8238],[148.025595,65.824251],[148.026342,65.824575],[148.027948,65.82471],[148.029399,65.824701],[148.03019,65.824647],[148.031026,65.824926],[148.032367,65.825745],[148.033203,65.826133],[148.03417,65.826178],[148.035116,65.825962],[148.036017,65.825763],[148.036919,65.825944],[148.037996,65.826619],[148.038634,65.827096],[148.039711,65.827519],[148.040393,65.828042],[148.040569,65.828447],[148.040063,65.828978],[148.040239,65.829842],[148.040943,65.83022],[148.043032,65.830914],[148.043361,65.831445],[148.044043,65.831769],[148.045516,65.831778],[148.046506,65.831697],[148.047913,65.832219],[148.0502,65.833227],[148.051871,65.833974],[148.052421,65.834703],[148.055895,65.83663],[148.057016,65.836882],[148.057918,65.837377],[148.05827,65.838142],[148.058512,65.838835],[148.05827,65.839582],[148.058863,65.839924],[148.060425,65.839978],[148.063173,65.839816],[148.064163,65.840077],[148.065724,65.840968],[148.067153,65.841229],[148.072079,65.841778],[148.073376,65.841517],[148.074299,65.841373],[148.075905,65.8414],[148.076586,65.841877],[148.077576,65.842264],[148.079203,65.842417],[148.080852,65.842903],[148.083139,65.843118],[148.08492,65.843973],[148.085777,65.844522],[148.086899,65.844954],[148.087976,65.844864],[148.08923,65.844648],[148.090461,65.84472],[148.092682,65.845395],[148.094947,65.84553],[148.096156,65.8458],[148.097563,65.845872],[148.100268,65.845521],[148.103302,65.845764],[148.10427,65.845602],[148.105677,65.84463],[148.10682,65.84445],[148.108382,65.844612],[148.110449,65.844684],[148.111922,65.845116],[148.113417,65.845269],[148.114055,65.845638],[148.114582,65.846223],[148.11478,65.846853],[148.116298,65.847509],[148.117749,65.847527],[148.118628,65.847482],[148.119354,65.847761],[148.121795,65.848409],[148.123158,65.848922],[148.123246,65.849273],[148.123356,65.849669],[148.125137,65.850487],[148.127424,65.85082],[148.129821,65.851387],[148.131184,65.851998],[148.131975,65.852628],[148.131843,65.853456],[148.131228,65.853986],[148.131514,65.854463],[148.133361,65.854868],[148.134746,65.855327],[148.13534,65.856109],[148.136769,65.856757],[148.137231,65.857656],[148.141343,65.858852],[148.142442,65.859347],[148.145652,65.860462],[148.146268,65.861253],[148.147543,65.862557],[148.147477,65.863447],[148.148533,65.864661],[148.149061,65.86574],[148.150336,65.866477],[148.151259,65.867888],[148.151501,65.868608],[148.152799,65.869552],[148.155261,65.870217],[148.156559,65.870792],[148.156822,65.87143],[148.156471,65.871996],[148.155239,65.872617],[148.154844,65.873066],[148.155811,65.873947],[148.156471,65.875007],[148.158472,65.876077],[148.159263,65.876958],[148.159021,65.87747],[148.159637,65.878315],[148.159087,65.879384],[148.156954,65.880615],[148.155657,65.880884],[148.155635,65.88128],[148.156559,65.882457],[148.159373,65.883337],[148.161836,65.883742],[148.167047,65.883436],[148.168586,65.883688],[148.170279,65.884676],[148.170521,65.88526],[148.170016,65.886437],[148.170389,65.887407],[148.171995,65.887883],[148.178525,65.888404],[148.181538,65.888054],[148.183231,65.887587],[148.184638,65.886877],[148.18543,65.8865],[148.186573,65.886329],[148.188486,65.886374],[148.190509,65.88606],[148.19284,65.885404],[148.194071,65.885206],[148.195237,65.88491],[148.19693,65.884829],[148.202405,65.885853],[148.2039,65.88606],[148.207176,65.887919],[148.209639,65.889599],[148.212388,65.890542],[148.213487,65.891108],[148.215598,65.892042],[148.215884,65.89267],[148.217797,65.893281],[148.219842,65.893317],[148.220743,65.893281],[148.221689,65.893407],[148.222414,65.893721],[148.223294,65.893901],[148.223558,65.894251],[148.223844,65.894808],[148.226262,65.895895],[148.230858,65.897619],[148.233497,65.898166],[148.23486,65.898247],[148.236311,65.898561],[148.237521,65.899019],[148.238664,65.899971],[148.238796,65.900806],[148.239456,65.901713],[148.239631,65.902009],[148.241127,65.902314],[148.242182,65.902763],[148.243172,65.903446],[148.244227,65.903921],[148.245568,65.904263],[148.249218,65.905618],[148.249636,65.906211],[148.249944,65.907521],[148.248779,65.90902],[148.248889,65.909657],[148.25045,65.910106],[148.253,65.910456],[148.254144,65.910465],[148.254804,65.91077],[148.255969,65.911686],[148.256211,65.912547],[148.255815,65.913373],[148.254012,65.914889],[148.252187,65.915831],[148.251769,65.916047],[148.252033,65.916334],[148.253462,65.916666],[148.254276,65.917204],[148.254254,65.91794],[148.255463,65.918416],[148.255727,65.919106],[148.257222,65.920004],[148.259751,65.920255],[148.261444,65.920766],[148.262456,65.92099],[148.266743,65.923099],[148.268173,65.923493],[148.268436,65.924005],[148.269184,65.924435],[148.270481,65.925027],[148.273208,65.925843],[148.273472,65.926498],[148.274087,65.92753],[148.274439,65.928444],[148.275561,65.929691],[148.275737,65.930157],[148.277606,65.930956],[148.278573,65.931054],[148.281014,65.930956],[148.282531,65.930382],[148.283718,65.930373],[148.2855,65.930848],[148.287215,65.930973],[148.288515,65.931238],[148.290215,65.932197],[148.292147,65.9329],[148.293288,65.93308],[148.294709,65.933147],[148.295733,65.933365],[148.296641,65.933659],[148.29706,65.934191],[148.296595,65.934865],[148.296827,65.93534],[148.297223,65.935463],[148.300879,65.935815],[148.302299,65.935739],[148.303813,65.935872],[148.305675,65.935843],[148.306304,65.935957],[148.306793,65.936138],[148.308353,65.93627],[148.309843,65.936204],[148.312777,65.936593],[148.314943,65.936669],[148.316014,65.936565],[148.317644,65.936793],[148.318878,65.936745],[148.320205,65.93684],[148.32102,65.937144],[148.321648,65.937609],[148.32258,65.937951],[148.323162,65.938388],[148.324536,65.938758],[148.325397,65.938872],[148.325863,65.939365],[148.326468,65.939745],[148.326538,65.940694],[148.32719,65.941273],[148.327679,65.94152],[148.32868,65.942488],[148.329542,65.942849],[148.330776,65.943039],[148.332778,65.9434],[148.334525,65.943362],[148.335619,65.943409],[148.337528,65.943248],[148.338367,65.943257],[148.339391,65.943077],[148.341137,65.942526],[148.342232,65.942365],[148.343419,65.94246],[148.345026,65.942868],[148.347238,65.943029],[148.348612,65.943295],[148.351452,65.943513],[148.35271,65.943874],[148.354875,65.943884],[148.357134,65.943599],[148.359346,65.943324],[148.361069,65.943476],[148.363001,65.943988],[148.364212,65.944168],[148.36533,65.944558],[148.36696,65.944614],[148.368729,65.944842],[148.369637,65.945118],[148.37015,65.945431],[148.370406,65.945848],[148.371477,65.946275],[148.372292,65.946541],[148.3732,65.947158],[148.374806,65.947746],[148.375971,65.948107],[148.37923,65.948477],[148.380255,65.948762],[148.380837,65.949075],[148.38121,65.949663],[148.382001,65.950052],[148.383305,65.951125],[148.383957,65.952301],[148.383771,65.952899],[148.383934,65.953297],[148.384772,65.953772],[148.385913,65.954161],[148.386588,65.954474],[148.38738,65.954483],[148.388497,65.954379],[148.394039,65.954104],[148.395716,65.953639],[148.397532,65.953506],[148.399441,65.953791],[148.401979,65.954939],[148.403236,65.95528],[148.403795,65.955698],[148.404773,65.956039],[148.406194,65.956182],[148.409127,65.956381],[148.410874,65.956295],[148.412061,65.956381],[148.414506,65.95602],[148.420094,65.955546],[148.422166,65.95566],[148.424844,65.95566],[148.427662,65.955508],[148.429338,65.955565],[148.430386,65.955717],[148.432086,65.955679],[148.433389,65.955925],[148.434507,65.956428],[148.435811,65.956703],[148.437231,65.956855],[148.439234,65.956694],[148.441772,65.956656],[148.443914,65.95676],[148.445241,65.956903],[148.448291,65.956722],[148.45048,65.956741],[148.451342,65.956656],[148.452622,65.956808],[148.454601,65.957216],[148.455905,65.957462],[148.458257,65.957832],[148.459212,65.958041],[148.460236,65.958098],[148.460911,65.95824],[148.461657,65.958155],[148.46296,65.957548],[148.464078,65.957358],[148.465801,65.957301],[148.468549,65.957424],[148.47125,65.957671],[148.4726,65.958012],[148.473951,65.958136],[148.479236,65.959483],[148.480796,65.95971],[148.482775,65.959672],[148.484172,65.959606],[148.485989,65.959748],[148.487479,65.960023],[148.488387,65.960384],[148.488853,65.960697],[148.489272,65.961],[148.489761,65.961048],[148.490832,65.96083],[148.493044,65.960763],[148.493789,65.960706],[148.495512,65.960488],[148.49649,65.960564],[148.497375,65.960507],[148.498678,65.960706],[148.501007,65.96083],[148.503079,65.960782],[148.504569,65.96063],[148.505757,65.960659],[148.506875,65.961095],[148.507666,65.961683],[148.507736,65.962281],[148.50911,65.962945],[148.510786,65.963153],[148.512765,65.963134],[148.514349,65.963002],[148.515373,65.962651],[148.516817,65.962158],[148.517818,65.961892],[148.5184,65.961541],[148.519029,65.96138],[148.519192,65.961124],[148.519052,65.960574],[148.519634,65.960052],[148.521334,65.959236],[148.522312,65.957927],[148.523127,65.95769],[148.523499,65.957339],[148.523616,65.956817],[148.524571,65.956257],[148.526666,65.955612],[148.534047,65.954313],[148.538751,65.954018],[148.545969,65.953743],[148.550672,65.953307],[148.55321,65.952633],[148.555865,65.952263],[148.559706,65.95196],[148.563292,65.951874],[148.570114,65.952292],[148.571744,65.952311],[148.578357,65.951694],[148.58469,65.951248],[148.589627,65.950679],[148.594842,65.950394],[148.59894,65.949957],[148.60206,65.949806],[148.607043,65.949919],[148.612305,65.949331],[148.61659,65.949103],[148.619756,65.948724],[148.622085,65.94787],[148.623948,65.946826],[148.62595,65.945421],[148.627813,65.944928],[148.631678,65.944453],[148.633774,65.944567],[148.636242,65.945269],[148.639781,65.945478],[148.642296,65.945061],[148.645369,65.943751],[148.646813,65.943371],[148.649886,65.943162],[148.65601,65.942841],[148.660767,65.942527],[148.663361,65.941867],[148.664835,65.941833],[148.666977,65.942004],[148.669678,65.941739],[148.674876,65.941204],[148.680456,65.940623],[148.682778,65.939957],[148.684209,65.939006],[148.685478,65.938765],[148.692683,65.938663],[148.693663,65.938721],[148.695299,65.938655],[148.700866,65.939162],[148.703553,65.939103],[148.707482,65.939441],[148.714875,65.940573],[148.716526,65.940694],[148.719739,65.94058],[148.724442,65.940182],[148.729751,65.940523],[148.733942,65.94058],[148.737994,65.941264],[148.740136,65.941644],[148.743861,65.941833],[148.748031,65.942345],[148.751405,65.942897],[148.754479,65.943618],[148.758437,65.944149],[148.760253,65.9447],[148.762861,65.945118],[148.764352,65.945155],[148.766633,65.945516],[148.770918,65.945953],[148.774271,65.946389],[148.781539,65.94815],[148.784935,65.948895],[148.786704,65.949179],[148.79015,65.950109],[148.798766,65.951514],[148.801327,65.951969],[148.805658,65.953165],[148.808778,65.953962],[148.813854,65.95491],[148.818544,65.956529],[148.822422,65.957377],[148.825589,65.957605],[148.831736,65.958439],[148.835182,65.958914],[148.83779,65.959312],[148.841609,65.959198],[148.852086,65.958989],[148.854164,65.959462],[148.858397,65.960461],[148.861371,65.960917],[148.864427,65.961114],[148.871824,65.962179],[148.882399,65.963446],[148.892461,65.964794],[148.897724,65.965363],[148.90414,65.965349],[148.906837,65.965462],[148.915659,65.965087],[148.919149,65.964736],[148.924129,65.964164],[148.928155,65.964016],[148.931578,65.964063],[148.942761,65.963595],[148.9477,65.96376],[148.950669,65.963593],[148.953328,65.963709],[148.958868,65.963504],[148.962535,65.963507],[148.969398,65.962822],[148.973351,65.962802],[148.975987,65.96262],[148.98093,65.962864],[148.983382,65.962672],[148.990884,65.961932],[148.993953,65.962006],[148.999274,65.96221],[149.004917,65.96226],[149.013881,65.96195],[149.022201,65.961873],[149.028386,65.96192],[149.037024,65.961862],[149.041849,65.961518],[149.04546,65.960852],[149.049153,65.959872],[149.054425,65.959255],[149.05885,65.958819],[149.060539,65.958477],[149.062466,65.95837],[149.063698,65.958099],[149.068685,65.957836],[149.072278,65.957314],[149.077085,65.956583],[149.080239,65.956158],[149.08359,65.955713],[149.089121,65.955051],[149.093389,65.954802],[149.096868,65.954624],[149.099857,65.954325],[149.102388,65.954025],[149.108166,65.953753],[149.114965,65.953278],[149.121858,65.952975],[149.130333,65.95288],[149.134152,65.952899],[149.136061,65.95324],[149.137411,65.953297],[149.139041,65.953658],[149.141742,65.953506],[149.143558,65.953165],[149.144304,65.952956],[149.145002,65.953013],[149.14577,65.953098],[149.14619,65.952927],[149.146353,65.952633],[149.14747,65.951988],[149.14754,65.951684],[149.147237,65.951096],[149.14775,65.950726],[149.148332,65.950052],[149.150683,65.948439],[149.1523,65.946882],[149.154342,65.944547],[149.165208,65.94111],[149.168699,65.940198],[149.172321,65.938882],[149.175746,65.938613],[149.183846,65.938211],[149.191222,65.936519],[149.200179,65.935445],[149.20525,65.93531],[149.216907,65.935498],[149.221714,65.935364],[149.225271,65.935686],[149.228168,65.936411],[149.232778,65.936546],[149.238969,65.936599],[149.242855,65.936411],[149.24404,65.93566],[149.246213,65.934773],[149.248057,65.934397],[149.250626,65.934558],[149.253787,65.934371],[149.256751,65.93386],[149.259385,65.933323],[149.263732,65.932974],[149.268868,65.93292],[149.272227,65.932625],[149.273413,65.932732],[149.275586,65.932437],[149.279472,65.931819],[149.281579,65.931765],[149.284872,65.931121],[149.289021,65.930798],[149.292511,65.930181],[149.296331,65.928703],[149.298504,65.928247],[149.299361,65.927897],[149.301024,65.927555],[149.30216,65.927259],[149.303131,65.927212],[149.304926,65.927407],[149.307807,65.927468],[149.313331,65.926796],[149.318731,65.925721],[149.324395,65.925049],[149.330652,65.924539],[149.334801,65.924243],[149.338489,65.923626],[149.34244,65.922551],[149.346194,65.9211],[149.358114,65.917311],[149.362658,65.916236],[149.366676,65.915376],[149.37471,65.913333],[149.380308,65.911694],[149.385643,65.910699],[149.390714,65.909355],[149.39697,65.908414],[149.39967,65.906909],[149.404083,65.904946],[149.405861,65.903924],[149.407178,65.902204],[149.421338,65.894485],[149.424894,65.891338],[149.42575,65.890127],[149.428055,65.888271],[149.430163,65.886065],[149.43115,65.885096],[149.431216,65.884235],[149.434048,65.882432],[149.437143,65.880737],[149.438922,65.880064],[149.442346,65.879337],[149.443993,65.878207],[149.446956,65.876592],[149.451039,65.875381],[149.452883,65.874519],[149.455057,65.872581],[149.457559,65.869889],[149.459996,65.868247],[149.462762,65.866847],[149.464474,65.866308],[149.467372,65.86375],[149.470204,65.861434],[149.471851,65.860599],[149.478502,65.859091],[149.482585,65.857771],[149.486471,65.856909],[149.490225,65.856235],[149.492942,65.855367],[149.49028,65.848751],[149.495086,65.846433],[149.495945,65.843342],[149.499035,65.841727],[149.499721,65.839408],[149.502125,65.839478],[149.504185,65.837019],[149.49852,65.835614],[149.496326,65.833431],[149.502811,65.831397],[149.503841,65.82971],[149.508476,65.829078],[149.513798,65.828305],[149.512596,65.826618],[149.515514,65.825704],[149.519119,65.825774],[149.521771,65.825077],[149.521178,65.824766],[149.521244,65.82447],[149.521606,65.824173],[149.522594,65.823984],[149.526512,65.823566],[149.52918,65.823404],[149.531649,65.82277],[149.534317,65.822636],[149.535831,65.822366],[149.538729,65.822218],[149.540771,65.821934],[149.544294,65.820774],[149.546961,65.820073],[149.549003,65.819884],[149.554568,65.818967],[149.555622,65.818603],[149.561022,65.817645],[149.563722,65.817335],[149.56932,65.816404],[149.573897,65.815568],[149.578013,65.814677],[149.580417,65.814043],[149.582492,65.812991],[149.584829,65.812208],[149.587332,65.811035],[149.591843,65.809496],[149.59563,65.808026],[149.598528,65.806541],[149.600866,65.80391],[149.602282,65.802762],[149.603895,65.801696],[149.604719,65.800279],[149.605805,65.798929],[149.607715,65.798052],[149.609065,65.796918],[149.611699,65.795743],[149.612654,65.795082],[149.614564,65.79442],[149.617199,65.792435],[149.619108,65.791301],[149.620854,65.790153],[149.621512,65.789505],[149.624509,65.787871],[149.625826,65.78702],[149.627176,65.786764],[149.629448,65.785683],[149.630535,65.784846],[149.633301,65.783495],[149.635803,65.782685],[149.637549,65.781645],[149.643212,65.780105],[149.644595,65.77997],[149.650292,65.778848],[149.654737,65.7782],[149.658952,65.777065],[149.660302,65.77639],[149.660763,65.775917],[149.661093,65.775106],[149.661126,65.774349],[149.661488,65.773674],[149.663365,65.772377],[149.665209,65.771755],[149.666658,65.771039],[149.666855,65.770796],[149.667152,65.770282],[149.667679,65.769823],[149.670807,65.768971],[149.673836,65.767309],[149.67489,65.76693],[149.677063,65.765876],[149.679928,65.764984],[149.68062,65.764551],[149.682529,65.76397],[149.684406,65.763511],[149.685526,65.762862],[149.686678,65.761821],[149.688358,65.761388],[149.689642,65.761077],[149.69119,65.76028],[149.691453,65.758712],[149.692243,65.758346],[149.694318,65.758238],[149.697413,65.757752],[149.70423,65.756386],[149.706798,65.756183],[149.710651,65.75575],[149.712857,65.755791],[149.714569,65.755886],[149.716545,65.755534],[149.717829,65.755264],[149.719904,65.755074],[149.721945,65.754601],[149.722999,65.754195],[149.724119,65.753019],[149.726325,65.750963],[149.725831,65.749719],[149.72593,65.7488],[149.725666,65.747893],[149.726457,65.746852],[149.728136,65.74604],[149.730112,65.745743],[149.731857,65.744999],[149.733602,65.744187],[149.733833,65.743781],[149.733569,65.743267],[149.733273,65.742699],[149.733374,65.742442],[149.733679,65.742251],[149.736003,65.742209],[149.738392,65.742052],[149.74215,65.741843],[149.744799,65.741697],[149.747976,65.741433],[149.748607,65.741529],[149.749149,65.741678],[149.751162,65.741067],[149.752352,65.740493],[149.752953,65.740132],[149.753339,65.73996],[149.753693,65.739867],[149.75453,65.739726],[149.755002,65.739625],[149.755742,65.739325],[149.757083,65.738523],[149.757437,65.738373],[149.758628,65.738007],[149.759132,65.737875],[149.759562,65.737712],[149.759798,65.737597],[149.760205,65.7375],[149.761139,65.737341],[149.761825,65.737222],[149.762802,65.736967],[149.763907,65.736627],[149.764518,65.736371],[149.765302,65.736067],[149.765988,65.735869],[149.766492,65.735728],[149.767533,65.735326],[149.768349,65.735053],[149.77205,65.73411],[149.774528,65.733413],[149.778756,65.732284],[149.7853,65.730445],[149.787821,65.729731],[149.790611,65.728902],[149.793003,65.728245],[149.79472,65.727808],[149.796147,65.727486],[149.798057,65.727217],[149.799215,65.727019],[149.800664,65.726679],[149.802616,65.726278],[149.804505,65.725907],[149.806146,65.725479],[149.807831,65.725157],[149.809901,65.724888],[149.8118,65.724509],[149.813442,65.724081],[149.815588,65.723591],[149.816864,65.723269],[149.820265,65.722484],[149.825297,65.721311],[149.828816,65.720424],[149.834052,65.719233],[149.83564,65.718893],[149.837196,65.718673],[149.83873,65.718501],[149.844223,65.717817],[149.848193,65.717362],[149.848976,65.717225],[149.849759,65.717018],[149.855542,65.715077],[149.859705,65.713722],[149.861518,65.713126],[149.862172,65.712945],[149.863116,65.712747],[149.864179,65.712592],[149.86552,65.712473],[149.866743,65.712438],[149.86803,65.712531],[149.871539,65.712919],[149.881044,65.713898],[149.890389,65.714838],[149.897384,65.715566],[149.8988,65.715659],[149.900388,65.715677],[149.901901,65.715611],[149.904101,65.715447],[149.913832,65.71471],[149.920505,65.714221],[149.927125,65.713718],[149.932993,65.713254],[149.936941,65.712972],[149.938057,65.712853],[149.939061,65.71277],[149.940635,65.71265],[149.941308,65.712606],[149.942048,65.712553],[149.943025,65.712508],[149.944073,65.71247],[149.946662,65.712398],[149.947361,65.712467],[149.947848,65.712553],[149.949321,65.712945],[149.950267,65.713087],[149.950771,65.713135],[149.95149,65.7131],[149.954837,65.712844],[149.956258,65.712751],[149.95885,65.712562],[149.960726,65.712399],[149.961381,65.712304],[149.961736,65.712191],[149.962133,65.712023],[149.96253,65.71171],[149.963292,65.710959],[149.963777,65.710639],[149.964203,65.710324],[149.964456,65.710113],[149.964897,65.709918],[149.965137,65.709843],[149.96577,65.709688],[149.96666,65.709494],[149.967888,65.709356],[149.96918,65.709221],[149.970598,65.709058],[149.972131,65.708912],[149.972947,65.708883],[149.973838,65.708909],[149.97552,65.709015],[149.977417,65.709187],[149.978496,65.709373],[149.97978,65.70968],[149.980938,65.710005],[149.982268,65.710381],[149.983251,65.710629],[149.98921,65.71229],[149.991305,65.712822],[149.991688,65.712934],[149.992088,65.713007],[149.993032,65.713126],[149.994416,65.71321],[149.996261,65.713241],[149.998863,65.713257],[149.999526,65.713261],[150.001938,65.71332],[150.007655,65.713413],[150.016807,65.713541],[150.026195,65.713682],[150.027697,65.713709],[150.028829,65.713669],[150.0298,65.713596],[150.030859,65.713463],[150.031912,65.713259],[150.033003,65.712967],[150.034114,65.7125],[150.036649,65.711375],[150.039902,65.709889],[150.045205,65.707445],[150.051455,65.704606],[150.057129,65.701987],[150.063202,65.699223],[150.069089,65.696577],[150.074464,65.694109],[150.076888,65.693014],[150.082328,65.690554],[150.08618,65.688782],[150.090506,65.686742],[150.09096,65.686546],[150.0915,65.686295],[150.095696,65.684423],[150.096533,65.684091],[150.09928,65.683247],[150.102809,65.682434],[150.106725,65.68156],[150.109697,65.680879],[150.111561,65.680438],[150.112943,65.680104],[150.118879,65.67877],[150.123194,65.677967],[150.126638,65.677265],[150.129395,65.676416],[150.130947,65.676035],[150.133408,65.675431],[150.136294,65.674781],[150.137292,65.674534],[150.137742,65.674467],[150.139588,65.674026],[150.146819,65.672377],[150.150435,65.671559],[150.155595,65.670406],[150.159436,65.669561],[150.160133,65.669455],[150.164629,65.669],[150.167569,65.668722],[150.16935,65.668691],[150.170251,65.668722],[150.171721,65.668792],[150.173223,65.668832],[150.176077,65.668987],[150.180242,65.669128],[150.183994,65.669314],[150.186988,65.66946],[150.187599,65.669438],[150.18938,65.669526],[150.192341,65.669645],[150.193157,65.669716],[150.194605,65.669721],[150.203167,65.670101],[150.204669,65.670207],[150.20571,65.670224],[150.206353,65.670273],[150.207684,65.670291],[150.21042,65.670397],[150.213177,65.670538],[150.218552,65.670768],[150.227199,65.671091],[150.229667,65.671219],[150.230869,65.671259],[150.232414,65.671338],[150.235911,65.671524],[150.239012,65.671621],[150.239935,65.671687],[150.242821,65.671794],[150.245664,65.671917],[150.246694,65.671939],[150.249687,65.672063],[150.250702,65.672103],[150.252058,65.672156],[150.253249,65.672191],[150.253809,65.672268],[150.254472,65.672359],[150.258946,65.673371],[150.260437,65.673743],[150.261081,65.673933],[150.261972,65.674074],[150.266051,65.675419],[150.266875,65.675714],[150.267722,65.675877],[150.268645,65.675983],[150.269546,65.676045],[150.270136,65.676063],[150.270844,65.676032],[150.271467,65.676072],[150.272561,65.67605],[150.273902,65.676023],[150.274814,65.676058],[150.278097,65.675957],[150.280125,65.675944],[150.281153,65.675953],[150.281647,65.675948],[150.282311,65.675946],[150.285854,65.675921],[150.288622,65.675815],[150.289673,65.675683],[150.290875,65.675519],[150.292002,65.675435],[150.293128,65.675418],[150.29434,65.67556],[150.295937,65.675638],[150.298718,65.6757],[150.300284,65.675714],[150.301561,65.675798],[150.301904,65.675807],[150.30272,65.675833],[150.305166,65.675966],[150.312579,65.676271],[150.315047,65.676461],[150.317322,65.676637],[150.321345,65.677119],[150.325025,65.677614],[150.325926,65.677671],[150.326645,65.67768],[150.329209,65.677517],[150.329889,65.677479],[150.330786,65.677442],[150.333812,65.677243],[150.334992,65.677203],[150.336001,65.677234],[150.339176,65.677344],[150.342803,65.677481],[150.34492,65.677561],[150.349272,65.677724],[150.35175,65.6778],[150.353832,65.677724],[150.35866,65.677543],[150.361042,65.677419],[150.362061,65.677402],[150.363434,65.677481],[150.365333,65.677583],[150.368713,65.677777],[150.37014,65.677861],[150.371245,65.677954],[150.372114,65.678122],[150.372822,65.678361],[150.3778,65.680402],[150.378927,65.680804],[150.379688,65.680976],[150.380504,65.681096],[150.381587,65.681162],[150.382574,65.681118],[150.383744,65.681025],[150.384516,65.680906],[150.385439,65.680738],[150.386018,65.680566],[150.388625,65.680017],[150.389377,65.679859],[150.389913,65.679722],[150.390707,65.679607],[150.39164,65.679554],[150.392423,65.679545],[150.3962,65.679364],[150.399097,65.679196],[150.399753,65.679163],[150.404569,65.678922],[150.408367,65.678723],[150.409075,65.678705],[150.410212,65.678608],[150.411263,65.678604],[150.412347,65.678683],[150.413173,65.67882],[150.413946,65.678988],[150.414804,65.679311],[150.415383,65.679695],[150.415995,65.68019],[150.418087,65.682032],[150.418838,65.682633],[150.419439,65.683013],[150.420179,65.683314],[150.421123,65.683601],[150.423247,65.684056],[150.424739,65.68437],[150.4274,65.684931],[150.431049,65.685715],[150.43182,65.68588],[150.434179,65.686386],[150.434267,65.686404],[150.43609,65.686795],[150.437485,65.687086],[150.438729,65.687254],[150.440027,65.687378],[150.441358,65.687409],[150.444587,65.687453],[150.449254,65.687555],[150.45635,65.687699],[150.463277,65.687824],[150.464242,65.687895],[150.465541,65.688023],[150.466785,65.688235],[150.468298,65.688588],[150.47114,65.689275],[150.475475,65.690324],[150.479402,65.691282],[150.480164,65.691393],[150.483195,65.692136],[150.486562,65.692957],[150.490858,65.693971],[150.494261,65.694777],[150.501225,65.696427],[150.508303,65.698122],[150.514421,65.69958],[150.520697,65.701094],[150.528191,65.70288],[150.528969,65.703094],[150.536673,65.704886],[150.543346,65.706522],[150.549762,65.708068],[150.557229,65.709868],[150.558935,65.710227],[150.559944,65.710421],[150.561092,65.710527],[150.562344,65.710511],[150.563535,65.710418],[150.565124,65.710194],[150.566421,65.71001],[150.573071,65.709035],[150.573587,65.708946],[150.577367,65.708399],[150.583642,65.70745],[150.584015,65.707399],[150.584663,65.707309],[150.585274,65.707252],[150.586003,65.707222],[150.587368,65.707252],[150.593099,65.707458],[150.595577,65.707573],[150.596602,65.707685],[150.597305,65.707798],[150.598011,65.707964],[150.599836,65.708471],[150.600648,65.708683],[150.605455,65.709995],[150.612564,65.711907],[150.619443,65.713761],[150.621461,65.714307],[150.627545,65.715945],[150.632706,65.717344],[150.633678,65.717542],[150.634406,65.717663],[150.635188,65.717805],[150.642342,65.71901],[150.643695,65.719236],[150.644604,65.719393],[150.650777,65.72042],[150.657427,65.721555],[150.658353,65.721712],[150.665716,65.722984],[150.666189,65.723063],[150.66722,65.723235],[150.668369,65.723305],[150.670239,65.723384],[150.672473,65.723406],[150.676351,65.723472],[150.682058,65.723556],[150.68598,65.723615],[150.69058,65.723676],[150.696033,65.723779],[150.703387,65.723901],[150.711058,65.724081],[150.717469,65.724186],[150.723953,65.724285],[150.725016,65.724307],[150.725503,65.724314],[150.729179,65.724362],[150.730354,65.724383],[150.733744,65.724443],[150.742252,65.724591],[150.742526,65.724588],[150.750551,65.724691],[150.753332,65.724752],[150.758373,65.725118],[150.75888,65.725157],[150.763116,65.725488],[150.764896,65.725622],[150.771164,65.726101],[150.777274,65.72656],[150.780627,65.726817],[150.786066,65.727231],[150.787745,65.727349],[150.791641,65.727657],[150.792574,65.727723],[150.793935,65.727846],[150.795282,65.727972],[150.799305,65.728435],[150.803135,65.728907],[150.804073,65.728993],[150.809073,65.729612],[150.810769,65.729766],[150.811821,65.7298],[150.812621,65.729778],[150.812327,65.730157],[150.811153,65.730689],[150.81067,65.731137],[150.809833,65.731424],[150.807773,65.731757],[150.806371,65.732329],[150.804987,65.733802],[150.803405,65.734866],[150.803208,65.735988],[150.801437,65.737572],[150.802355,65.738548],[150.802693,65.739628],[150.801459,65.740516],[150.79945,65.740839],[150.79904,65.741114],[150.796526,65.742102],[150.794583,65.743414],[150.792626,65.744634],[150.789424,65.746707],[150.78381,65.750766],[150.781442,65.754194],[150.780357,65.755158],[150.776421,65.755946],[150.771196,65.75775],[150.770898,65.759178],[150.771558,65.759949],[150.769466,65.763379],[150.769281,65.764576],[150.764265,65.772028],[150.763363,65.775259],[150.764037,65.776707],[150.760271,65.782196],[150.759662,65.78414],[150.760416,65.785932],[150.760397,65.787594],[150.760014,65.789942],[150.760984,65.791534],[150.761076,65.793645],[150.762629,65.794583],[150.76272,65.794807],[150.760872,65.795634],[150.760268,65.79625],[150.760676,65.796549],[150.761409,65.797059],[150.761221,65.797588],[150.758926,65.799172],[150.756653,65.801098],[150.754966,65.802869],[150.754065,65.804031],[150.750752,65.805584],[150.749665,65.806098],[150.748268,65.80652],[150.746878,65.807347],[150.746591,65.808395],[150.745268,65.80958],[150.745105,65.810047],[150.743854,65.811171],[150.741062,65.812464],[150.738848,65.812757],[150.737259,65.813601],[150.733675,65.815824],[150.728487,65.81836],[150.727338,65.819976],[150.728133,65.822038],[150.731711,65.823938],[150.73615,65.824834],[150.740988,65.825241],[150.742512,65.825512],[150.742114,65.826028],[150.739331,65.826923],[150.735819,65.827547],[150.734825,65.827927],[150.733434,65.827791],[150.731976,65.8279],[150.731048,65.828171],[150.731254,65.828771],[150.731852,65.830543],[150.731976,65.832485],[150.730957,65.833615],[150.726778,65.835926],[150.725846,65.837233],[150.725099,65.837764],[150.723712,65.838221],[150.720209,65.838555],[150.715013,65.839483],[150.712172,65.841018],[150.71025,65.842459],[150.708946,65.845368],[150.708438,65.84601],[150.705853,65.847223],[150.703616,65.847928],[150.702424,65.848436],[150.702456,65.849596],[150.702827,65.851408],[150.704507,65.85369],[150.705278,65.854628],[150.704904,65.855222],[150.702374,65.85804],[150.701015,65.860646],[150.701748,65.863432],[150.702266,65.864998],[150.701624,65.866527],[150.699515,65.867466],[150.698455,65.869986],[150.699084,65.872526],[150.700655,65.874305],[150.70133,65.875788],[150.699937,65.876908],[150.699609,65.878076],[150.69892,65.878827],[150.698161,65.878551],[150.697411,65.878353],[150.692374,65.878726],[150.689048,65.878937],[150.684034,65.880143],[150.681514,65.881011],[150.68056,65.88203],[150.678781,65.884713],[150.678095,65.886362],[150.66561,65.910114],[150.663081,65.915989],[150.65949,65.918506],[150.652536,65.920139],[150.649185,65.922659],[150.646379,65.924315],[150.64548,65.926336],[150.642799,65.927412],[150.640016,65.929736],[150.63421,65.931351],[150.629427,65.936737],[150.626141,65.938076],[150.622332,65.94115],[150.622343,65.942502],[150.621439,65.943614],[150.621533,65.946066],[150.620757,65.949009],[150.612785,65.959185],[150.605878,65.968412],[150.60471,65.971858],[150.60461,65.974061],[150.603776,65.975433],[150.602777,65.977229],[150.601651,65.978011],[150.598006,65.978389],[150.59908,65.980111],[150.59874,65.980458],[150.594627,65.981572],[150.593236,65.98532],[150.592641,65.985961],[150.592198,65.987589],[150.591393,65.98821],[150.589253,65.989844],[150.585409,65.994535],[150.584221,65.997935],[150.585056,66.000512],[150.586268,66.002038],[150.585824,66.00248],[150.580593,66.005743],[150.579103,66.006686],[150.575842,66.007477],[150.575146,66.008608],[150.574135,66.009716],[150.573483,66.012015],[150.572646,66.012922],[150.572552,66.014244],[150.572154,66.01455],[150.567514,66.016357],[150.559765,66.018749],[150.554783,66.019361],[150.552155,66.020245],[150.545998,66.025408],[150.544731,66.025762],[150.536855,66.026988],[150.532774,66.027931],[150.521724,66.03195],[150.516815,66.03432],[150.511317,66.038328],[150.510483,66.039802],[150.508484,66.042238],[150.507068,66.04606],[150.505068,66.050626],[150.504994,66.054252],[150.505485,66.056341],[150.503235,66.059012],[150.503235,66.059993],[150.504068,66.061142],[150.505846,66.064467],[150.507248,66.065615],[150.511566,66.067733],[150.520454,66.075149],[150.520727,66.075881],[150.518852,66.077207],[150.516777,66.078303],[150.516732,66.079661],[150.51677,66.08174],[150.517815,66.084795],[150.519576,66.086909],[150.523897,66.088003],[150.529173,66.087868],[150.531569,66.088206],[150.532997,66.088888],[150.532978,66.090029],[150.53473,66.0907],[150.538961,66.091446],[150.540897,66.093076],[150.541329,66.094495],[150.541226,66.096073],[150.537536,66.10093],[150.536311,66.102183],[150.536644,66.106064],[150.536092,66.108145],[150.535531,66.108954],[150.532289,66.110556],[150.530562,66.111294],[150.530151,66.112608],[150.531312,66.114499],[150.531229,66.115443],[150.530312,66.116388],[150.528562,66.117096],[150.519565,66.119424],[150.514233,66.120739],[150.513566,66.121818],[150.513899,66.123538],[150.514878,66.124575],[150.515284,66.125077],[150.515899,66.125329],[150.516763,66.125789],[150.516857,66.126012],[150.516607,66.126337],[150.516472,66.126851],[150.51619,66.127294],[150.516295,66.127555],[150.518034,66.129106],[150.519106,66.129481],[150.519669,66.130155],[150.521741,66.131348],[150.524647,66.131951],[150.528315,66.132508],[150.530696,66.1337],[150.53239,66.134658],[150.534576,66.136404],[150.535004,66.137103],[150.535426,66.13845],[150.535411,66.141798],[150.536087,66.143344],[150.535837,66.145391],[150.536813,66.146837],[150.53898,66.147867],[150.539944,66.14896],[150.541526,66.150124],[150.54294,66.150672],[150.543941,66.151887],[150.545355,66.15322],[150.544943,66.156769],[150.544766,66.158079],[150.544059,66.16027],[150.542527,66.16265],[150.543116,66.163317],[150.542822,66.163603],[150.541585,66.164031],[150.540406,66.165103],[150.539051,66.166936],[150.539051,66.169149],[150.541984,66.171237],[150.547358,66.172267],[150.557196,66.175456],[150.559965,66.175783],[150.56487,66.175965],[150.569686,66.175671],[150.572278,66.175766],[150.574539,66.176127],[150.57758,66.176313],[150.58091,66.175552],[150.583176,66.175147],[150.585533,66.175528],[150.591247,66.176313],[150.595162,66.176454],[150.598634,66.176035],[150.600201,66.175777],[150.60303,66.175123],[150.608332,66.173267],[150.611042,66.172148],[150.612986,66.172006],[150.615696,66.172553],[150.62954,66.175956],[150.632485,66.17648],[150.642293,66.179004],[150.6521,66.182903],[150.657169,66.183927],[150.658701,66.184497],[150.660133,66.185929],[150.66507,66.189212],[150.666332,66.189818],[150.666803,66.190504],[150.665181,66.191704],[150.664725,66.19396],[150.665888,66.195414],[150.666831,66.197292],[150.666731,66.198238],[150.667126,66.199503],[150.666006,66.200573],[150.666772,66.201881],[150.666536,66.204115],[150.667273,66.205966],[150.668657,66.207585],[150.668839,66.208234],[150.670876,66.209309],[150.673209,66.210225],[150.674119,66.2104],[150.675208,66.210368],[150.677407,66.209938],[150.679832,66.209402],[150.682248,66.208747],[150.683811,66.208688],[150.685519,66.208747],[150.685935,66.208931],[150.685602,66.209167],[150.684935,66.209234],[150.684269,66.209175],[150.683706,66.209309],[150.683498,66.209595],[150.683602,66.20994],[150.683977,66.21062],[150.683561,66.211099],[150.682977,66.211477],[150.682144,66.211746],[150.67977,66.212401],[150.67927,66.212662],[150.678812,66.213183],[150.67775,66.213838],[150.677145,66.214333],[150.676229,66.21477],[150.676083,66.215417],[150.676,66.215862],[150.675521,66.216282],[150.675083,66.216853],[150.674542,66.218458],[150.673584,66.220532],[150.671739,66.224953],[150.67056,66.225855],[150.668793,66.226307],[150.667556,66.226615],[150.666908,66.227589],[150.667085,66.228634],[150.66844,66.229584],[150.669794,66.231388],[150.669441,66.232481],[150.670443,66.234095],[150.669441,66.234831],[150.667674,66.235709],[150.667438,66.236208],[150.668675,66.237063],[150.669853,66.238724],[150.668145,66.242688],[150.666849,66.2434],[150.659603,66.245726],[150.656657,66.246248],[150.653947,66.246556],[150.652357,66.247031],[150.650236,66.247292],[150.64623,66.249807],[150.642754,66.250305],[150.639985,66.253034],[150.640398,66.254671],[150.638984,66.256497],[150.635743,66.258466],[150.633976,66.259723],[150.62944,66.261193],[150.628203,66.262071],[150.62726,66.262403],[150.625905,66.26264],[150.624138,66.263992],[150.619602,66.265841],[150.617599,66.26743],[150.610765,66.270465],[150.606936,66.273357],[150.604874,66.274589],[150.603872,66.275798],[150.603283,66.277742],[150.604108,66.280846],[150.604815,66.28177],[150.604933,66.284661],[150.604285,66.28613],[150.602989,66.287196],[150.60128,66.288097],[150.600809,66.288902],[150.601339,66.290015],[150.600927,66.290702],[150.599513,66.292147],[150.599395,66.292834],[150.600279,66.293403],[150.601987,66.293829],[150.603813,66.294279],[150.604167,66.295061],[150.604874,66.295558],[150.604815,66.296884],[150.605404,66.297761],[150.603953,66.299931],[150.603637,66.301005],[150.603637,66.30252],[150.602561,66.304463],[150.600632,66.306853],[150.600043,66.30832],[150.600043,66.309835],[150.599191,66.31088],[150.598554,66.311668],[150.597573,66.312456],[150.59804,66.313244],[150.602871,66.3149],[150.606052,66.315208],[150.61265,66.314734],[150.61589,66.313457],[150.617658,66.312723],[150.618482,66.312155],[150.620544,66.311587],[150.624138,66.311161],[150.626023,66.310048],[150.629263,66.308841],[150.631973,66.308249],[150.637098,66.305764],[150.641281,66.304485],[150.643697,66.303183],[150.644404,66.301904],[150.645817,66.301076],[150.646289,66.296505],[150.647231,66.295298],[150.648763,66.294303],[150.652592,66.293213],[150.657718,66.292313],[150.661193,66.29146],[150.663373,66.289636],[150.665258,66.289044],[150.668498,66.287267],[150.67056,66.286794],[150.672151,66.286249],[150.676687,66.285419],[150.683344,66.283571],[150.695539,66.278405],[150.697012,66.278263],[150.698543,66.277718],[150.70308,66.277007],[150.704847,66.27696],[150.711209,66.276154],[150.715805,66.275751],[150.721401,66.274779],[150.729119,66.274257],[150.731711,66.274826],[150.733242,66.274921],[150.738486,66.276011],[150.743729,66.276414],[150.746674,66.27696],[150.750209,66.277054],[150.753155,66.276225],[150.754804,66.276035],[150.760165,66.274139],[150.769061,66.271792],[150.781668,66.268734],[150.798929,66.262948],[150.818075,66.257138],[150.826146,66.255216],[150.829917,66.254837],[150.83569,66.254742],[150.837398,66.254623],[150.839578,66.254837],[150.841581,66.254647],[150.843761,66.254718],[150.845528,66.254623],[150.84759,66.254908],[150.860669,66.252559],[150.866795,66.252512],[150.868386,66.252915],[150.869564,66.253437],[150.871626,66.253651],[150.872922,66.254338],[150.876162,66.256639],[150.877517,66.256924],[150.879638,66.256663],[150.881641,66.256402],[150.884116,66.256568],[150.887945,66.256379],[150.903262,66.255786],[150.911922,66.255264],[150.920287,66.255762],[150.923586,66.255596],[150.925707,66.25505],[150.93802,66.250305],[150.944088,66.249261],[150.945914,66.249451],[150.947917,66.250305],[150.952335,66.251563],[150.958757,66.252868],[150.961761,66.253318],[150.966769,66.252725],[150.971423,66.25161],[150.974604,66.251302],[150.976843,66.25142],[150.981143,66.25078],[150.985208,66.250543],[150.992042,66.25078],[150.997344,66.250495],[150.999583,66.249997],[151.006888,66.248194],[151.008773,66.246366],[151.010069,66.245939],[151.011247,66.245821],[151.010835,66.24537],[151.009421,66.243827],[151.009539,66.242664],[151.011601,66.241288],[151.013898,66.239769],[151.016873,66.237715],[151.019406,66.236802],[151.024767,66.235413],[151.027477,66.23495],[151.031041,66.234653],[151.034694,66.234807],[151.037026,66.235264],[151.038426,66.235722],[151.03964,66.23613],[151.041908,66.237128],[151.045407,66.238777],[151.048402,66.239738],[151.051693,66.239906],[151.054026,66.239637],[151.057171,66.238588],[151.059046,66.237573],[151.060045,66.236062],[151.059879,66.23466],[151.057942,66.232897],[151.056255,66.231781],[151.055172,66.230757],[151.054568,66.229657],[151.055088,66.228247],[151.056005,66.227306],[151.0584,66.226248],[151.061587,66.225232],[151.075271,66.220597],[151.07708,66.220108],[151.080586,66.21949],[151.082353,66.219377],[151.088244,66.219538],[151.09066,66.2199],[151.094504,66.220898],[151.100454,66.222163],[151.122441,66.226365],[151.137395,66.22885],[151.155641,66.230747],[151.162931,66.232074],[151.16718,66.232426],[151.171846,66.232057],[151.18401,66.230714],[151.189494,66.229979],[151.197978,66.227272],[151.20811,66.221999],[151.209642,66.220621],[151.209878,66.219101],[151.210585,66.217771],[151.214473,66.213256],[151.219071,66.206103],[151.223153,66.202708],[151.225236,66.200472],[151.23111,66.196942],[151.247981,66.191241],[151.256929,66.189837],[151.260937,66.189671],[151.269935,66.189789],[151.276621,66.189966],[151.281349,66.189562],[151.28346,66.189308],[151.284226,66.188963],[151.285463,66.188023],[151.286966,66.187512],[151.288733,66.187179],[151.291237,66.186965],[151.300589,66.186504],[151.312945,66.186685],[151.317194,66.187248],[151.328837,66.189342],[151.340915,66.190985],[151.353078,66.192969],[151.364909,66.194247],[151.375533,66.196064],[151.391987,66.198065],[151.399277,66.199208],[151.411108,66.200738],[151.425063,66.203259],[151.440374,66.20654],[151.449549,66.208679],[151.452436,66.209773],[151.472906,66.215623],[151.476322,66.21658],[151.484487,66.219537],[151.488486,66.221183],[151.493235,66.223333],[151.499275,66.226658],[151.505066,66.230788],[151.507924,66.232883],[151.508273,66.23303],[151.50908,66.233118],[151.509898,66.233317],[151.510497,66.233632],[151.511252,66.234127],[151.514616,66.237649],[151.517008,66.239817],[151.520132,66.242116],[151.524298,66.243861],[151.52938,66.245154],[151.535503,66.246362],[151.540835,66.246983],[151.546792,66.247419],[151.554041,66.247637],[151.561247,66.247721],[151.569287,66.24757],[151.574078,66.247738],[151.578618,66.247704],[151.584867,66.248291],[151.591282,66.248425],[151.596447,66.248191],[151.601113,66.248207],[151.604154,66.248023],[151.609444,66.247335],[151.615859,66.246009],[151.61963,66.245452],[151.622399,66.245161],[151.62505,66.244598],[151.627008,66.243927],[151.628702,66.243263],[151.636125,66.240694],[151.637495,66.239988],[151.639395,66.238611],[151.640794,66.237471],[151.6429,66.234955],[151.64575,66.231077],[151.646375,66.229112],[151.64625,66.226274],[151.644876,66.2231],[151.642751,66.220026],[151.639044,66.214365],[151.638044,66.212819],[151.636294,66.207997],[151.633753,66.202652],[151.633224,66.20096],[151.633224,66.199694],[151.633754,66.198743],[151.63505,66.197519],[151.636096,66.196764],[151.637731,66.19586],[151.640941,66.194868],[151.644594,66.194154],[151.645581,66.19416],[151.646229,66.19422],[151.647466,66.194196],[151.651442,66.193851],[151.654786,66.193732],[151.658615,66.193702],[151.661428,66.193815],[151.666281,66.19428],[151.668041,66.19441],[151.668814,66.194513],[151.670762,66.194853],[151.672979,66.195338],[151.67525,66.1958],[151.67743,66.196338],[151.679684,66.197016],[151.68436,66.198796],[151.685943,66.199557],[151.687534,66.200392],[151.690212,66.202176],[151.691941,66.20363],[151.693634,66.205376],[151.695779,66.208346],[151.696534,66.210035],[151.697368,66.213962],[151.698496,66.22031],[151.698732,66.225399],[151.698909,66.232309],[151.699439,66.233639],[151.699439,66.235348],[151.699557,66.238007],[151.698496,66.239764],[151.696788,66.244961],[151.694431,66.252127],[151.693371,66.256373],[151.692782,66.257488],[151.690366,66.264366],[151.689777,66.26567],[151.690248,66.267045],[151.689542,66.270554],[151.688069,66.279514],[151.688363,66.281931],[151.689306,66.284467],[151.691309,66.287262],[151.692958,66.289134],[151.694844,66.290745],[151.698909,66.2929],[151.704269,66.296027],[151.70857,66.297874],[151.713519,66.299555],[151.723946,66.302562],[151.726773,66.303435],[151.728605,66.304515],[151.729959,66.305042],[151.735729,66.306339],[151.740415,66.307042],[151.752079,66.309745],[151.772116,66.313203],[151.78003,66.315194],[151.785279,66.317202],[151.791361,66.320398],[151.800276,66.327223],[151.813148,66.34065],[151.816564,66.343475],[151.822511,66.347412],[151.834673,66.358872],[151.837922,66.364342],[151.83836,66.3681],[151.837902,66.370922],[151.836839,66.372758],[151.837087,66.380443],[151.836232,66.38488],[151.834909,66.38842],[151.830452,66.394976],[151.825401,66.401903],[151.823401,66.405505],[151.822568,66.407773],[151.819944,66.412112],[151.817486,66.415412],[151.816045,66.417076],[151.81063,66.421176],[151.807048,66.424541],[151.804662,66.427552],[151.803719,66.430096],[151.804367,66.433252],[151.803719,66.43443],[151.804544,66.435396],[151.807784,66.436785],[151.817269,66.439517],[151.823631,66.44133],[151.826003,66.442537],[151.82883,66.444397],[151.837595,66.449111],[151.844605,66.452454],[151.847197,66.454054],[151.848711,66.45535],[151.850508,66.456503],[151.853748,66.457915],[151.857165,66.460139],[151.859963,66.462139],[151.868653,66.467255],[151.8725,66.469764],[151.873369,66.470516],[151.873516,66.470981],[151.873442,66.471851],[151.874866,66.473908],[151.878534,66.478308],[151.880713,66.481858],[151.882068,66.483033],[151.883865,66.484032],[151.885632,66.486183],[151.887105,66.487558],[151.889197,66.490002],[151.891553,66.491905],[151.894292,66.494431],[151.897739,66.497086],[151.90054,66.499018],[151.901777,66.500051],[151.901859,66.500855],[151.901771,66.502106],[151.902272,66.502552],[151.903303,66.502904],[151.903686,66.503222],[151.906116,66.505112],[151.907618,66.506058],[151.909194,66.506639],[151.911771,66.507743],[151.915674,66.509656],[151.92208,66.513306],[151.92467,66.514687],[151.927836,66.516742],[151.929367,66.518036],[151.929982,66.518406],[151.931846,66.519352],[151.936282,66.520974],[151.939458,66.521924],[151.943133,66.522629],[151.94632,66.52316],[151.948674,66.523675],[151.957651,66.525094],[151.962379,66.526064],[151.966024,66.526404],[151.96844,66.526653],[151.970877,66.526786],[151.973834,66.527035],[151.977084,66.527508],[151.979937,66.528072],[151.985082,66.528736],[151.995746,66.529947],[152.006577,66.531291],[152.010326,66.531788],[152.026989,66.534741],[152.040136,66.537034],[152.050151,66.538676],[152.056985,66.540083],[152.060873,66.540458],[152.064526,66.540505],[152.070594,66.540271],[152.073539,66.540294],[152.075159,66.540547],[152.078635,66.541356],[152.086441,66.542916],[152.090918,66.543924],[152.096367,66.544827],[152.100584,66.545697],[152.107916,66.547686],[152.11533,66.549477],[152.123745,66.550935],[152.131243,66.551996],[152.14018,66.552924],[152.154083,66.555034],[152.16345,66.556534],[152.173759,66.55855],[152.179827,66.559581],[152.189725,66.560659],[152.1932,66.561315],[152.197854,66.562557],[152.206514,66.564197],[152.21488,66.56572],[152.222244,66.566891],[152.231964,66.568344],[152.241037,66.570124],[152.248577,66.572045],[152.25712,66.573778],[152.261774,66.574973],[152.265721,66.576073],[152.268431,66.576237],[152.271553,66.576401],[152.27444,66.577244],[152.281215,66.579258],[152.286929,66.580897],[152.299772,66.584058],[152.306075,66.585556],[152.318623,66.587219],[152.333528,66.589255],[152.338949,66.589905],[152.341698,66.590452],[152.345281,66.591428],[152.349405,66.592769],[152.354403,66.593894],[152.359152,66.594903],[152.36361,66.596128],[152.369358,66.597567],[152.372566,66.599222],[152.376523,66.600744],[152.377689,66.601341],[152.378823,66.60154],[152.379545,66.601476],[152.380148,66.601248],[152.380914,66.600821],[152.381503,66.600341],[152.382446,66.599224],[152.382814,66.599019],[152.383374,66.598943],[152.384537,66.598867],[152.385833,66.598984],[152.386761,66.599171],[152.387645,66.599458],[152.388411,66.59954],[152.389295,66.599563],[152.391445,66.599441],[152.396202,66.599522],[152.399987,66.599721],[152.403257,66.600213],[152.406615,66.601154],[152.4104,66.602651],[152.412639,66.604452],[152.414465,66.606862],[152.414792,66.607565],[152.414958,66.608694],[152.415203,66.610168],[152.414896,66.613772],[152.414749,66.615151],[152.415367,66.615911],[152.417429,66.616917],[152.419137,66.617981],[152.423232,66.620926],[152.426846,66.623132],[152.431618,66.625679],[152.435329,66.627152],[152.438284,66.628322],[152.439648,66.629256],[152.441127,66.629702],[152.443043,66.630107],[152.447917,66.632305],[152.453591,66.634886],[152.458507,66.637298],[152.465339,66.639347],[152.470754,66.641395],[152.477336,66.644235],[152.481918,66.64625],[152.48825,66.648826],[152.491166,66.651038],[152.493165,66.653218],[152.495375,66.655404],[152.496619,66.656667],[152.496874,66.656926],[152.499607,66.658985],[152.502666,66.661447],[152.506554,66.665181],[152.506967,66.666745],[152.506083,66.669492],[152.50472,66.671207],[152.50395,66.672906],[152.500942,66.676685],[152.499485,66.678539],[152.499589,66.678799],[152.500584,66.680447],[152.501925,66.681537],[152.501969,66.681916],[152.501571,66.682277],[152.495901,66.684906],[152.491527,66.687045],[152.485474,66.6894],[152.481232,66.690979],[152.475356,66.69278],[152.467859,66.694686],[152.453447,66.697733],[152.445074,66.700188],[152.434202,66.703632],[152.426245,66.705724],[152.423246,66.706581],[152.418664,66.708969],[152.415623,66.710978],[152.41454,66.712032],[152.413956,66.713366],[152.412082,66.714848],[152.409749,66.717269],[152.408083,66.720414],[152.407458,66.723706],[152.4075,66.725073],[152.408291,66.727492],[152.409749,66.729714],[152.41204,66.73159],[152.415331,66.733713],[152.418789,66.735259],[152.424829,66.73702],[152.431369,66.738369],[152.436618,66.739044],[152.44045,66.739159],[152.442741,66.739044],[152.444824,66.73883],[152.448907,66.73878],[152.454864,66.738599],[152.461195,66.738188],[152.472193,66.737596],[152.481399,66.737694],[152.49098,66.737596],[152.494896,66.737694],[152.503894,66.737514],[152.506576,66.737633],[152.507461,66.737674],[152.507868,66.737649],[152.509497,66.737896],[152.512892,66.738492],[152.520064,66.7399],[152.523951,66.741056],[152.529408,66.74331],[152.532699,66.744543],[152.536281,66.746352],[152.540537,66.748483],[152.546619,66.752232],[152.552118,66.755192],[152.5577,66.757132],[152.563699,66.759302],[152.567114,66.761044],[152.569281,66.763148],[152.57028,66.764923],[152.57078,66.766566],[152.57203,66.767716],[152.57353,66.769195],[152.574696,66.771002],[152.575363,66.773171],[152.575363,66.774748],[152.575029,66.776161],[152.573946,66.778033],[152.573446,66.78122],[152.57328,66.785686],[152.574279,66.790415],[152.574363,66.79337],[152.574696,66.796094],[152.576196,66.798195],[152.579195,66.800952],[152.583777,66.803971],[152.589193,66.80699],[152.595524,66.809352],[152.604272,66.812535],[152.611104,66.814798],[152.614353,66.816012],[152.615936,66.817389],[152.618186,66.819751],[152.621435,66.821915],[152.624351,66.824243],[152.626601,66.826276],[152.628933,66.828735],[152.629983,66.829528],[152.633253,66.830782],[152.640293,66.832642],[152.64573,66.833642],[152.651395,66.835485],[152.660455,66.838418],[152.664829,66.840106],[152.668953,66.84226],[152.67314,66.845602],[152.675692,66.847957],[152.677035,66.84957],[152.678025,66.851511],[152.679536,66.854493],[152.68039,66.857144],[152.680714,66.859483],[152.681421,66.863036],[152.681568,66.866138],[152.681892,66.868614],[152.681981,66.869957],[152.682216,66.872028],[152.684278,66.874932],[152.685486,66.87551],[152.693439,66.877766],[152.695736,66.87861],[152.697651,66.879709],[152.698535,66.880357],[152.699124,66.88134],[152.701628,66.883676],[152.703542,66.885306],[152.705368,66.887087],[152.707961,66.889006],[152.711436,66.8917],[152.714441,66.894983],[152.716326,66.897907],[152.721172,66.904378],[152.724338,66.909933],[152.727254,66.913821],[152.731003,66.917904],[152.734919,66.921334],[152.738168,66.92362],[152.7445,66.926493],[152.748249,66.927832],[152.752498,66.929138],[152.759496,66.930411],[152.763662,66.931096],[152.774326,66.932174],[152.783241,66.932696],[152.792988,66.93237],[152.805152,66.931586],[152.810984,66.93126],[152.819316,66.931815],[152.838228,66.933741],[152.859473,66.935993],[152.876136,66.937918],[152.883384,66.9388],[152.888466,66.939713],[152.894215,66.940366],[152.902546,66.942618],[152.908795,66.944999],[152.91571,66.946892],[152.922541,66.948392],[152.92804,66.950676],[152.932289,66.952176],[152.934122,66.953448],[152.935788,66.954492],[152.944953,66.95834],[152.948035,66.959155],[152.951035,66.960655],[152.958866,66.963851],[152.964615,66.966442],[152.97003,66.96949],[152.972821,66.971674],[152.976654,66.973792],[152.979237,66.975894],[152.983694,66.979071],[152.987026,66.98171],[152.989567,66.984658],[152.99265,66.988518],[152.99894,66.995421],[153.001315,66.997407],[153.003023,66.999328],[153.006189,67.001346],[153.007147,67.00299],[153.007105,67.004536],[153.006647,67.006245],[153.005855,67.007888],[153.006355,67.009043],[153.00773,67.009955],[153.011062,67.011891],[153.014395,67.013924],[153.018144,67.016169],[153.019935,67.018235],[153.022976,67.020544],[153.023518,67.022528],[153.024726,67.025585],[153.026142,67.027715],[153.027392,67.028544],[153.027559,67.029227],[153.02735,67.03043],[153.0286,67.033957],[153.029142,67.037078],[153.029641,67.040702],[153.029475,67.042132],[153.030016,67.045251],[153.029808,67.047688],[153.02872,67.052288],[153.028608,67.0567],[153.029316,67.063146],[153.029257,67.066272],[153.028924,67.0702],[153.030007,67.075036],[153.030048,67.07747],[153.030548,67.07992],[153.030298,67.081948],[153.028111,67.085103],[153.027528,67.088095],[153.027445,67.090414],[153.027591,67.093471],[153.027872,67.094393],[153.029789,67.095892],[153.032351,67.098681],[153.033437,67.100298],[153.034203,67.101398],[153.036382,67.102888],[153.046987,67.10848],[153.053526,67.111047],[153.061393,67.114209],[153.072034,67.116575],[153.078735,67.117617],[153.080385,67.117709],[153.082417,67.117772],[153.085996,67.118173],[153.090356,67.118522],[153.096546,67.119193],[153.105634,67.120424],[153.112585,67.121512],[153.116974,67.122703],[153.120553,67.124094],[153.124942,67.12619],[153.129101,67.12897],[153.133461,67.132233],[153.136377,67.134522],[153.138233,67.135747],[153.14218,67.137555],[153.149485,67.14156],[153.154109,67.14386],[153.160737,67.14648],[153.167688,67.1495],[153.173668,67.151845],[153.181091,67.153595],[153.190694,67.155619],[153.195082,67.156739],[153.199088,67.15778],[153.20389,67.158317],[153.209516,67.158295],[153.216526,67.157883],[153.219571,67.157796],[153.223508,67.157703],[153.224976,67.157408],[153.227299,67.156393],[153.2316,67.154598],[153.232839,67.154254],[153.236682,67.153809],[153.242097,67.153433],[153.246992,67.152968],[153.250449,67.152702],[153.253917,67.152641],[153.257583,67.152827],[153.26253,67.152888],[153.270007,67.152981],[153.274966,67.153132],[153.279215,67.153003],[153.283881,67.152583],[153.288484,67.151968],[153.296607,67.150803],[153.300919,67.150213],[153.305188,67.149881],[153.312452,67.149339],[153.318579,67.149041],[153.323174,67.148707],[153.326465,67.14806],[153.330928,67.146986],[153.334333,67.14604],[153.338495,67.145218],[153.34256,67.144852],[153.346537,67.144783],[153.350985,67.144852],[153.355315,67.144874],[153.361736,67.145435],[153.364755,67.145755],[153.369203,67.146436],[153.374594,67.147288],[153.384653,67.14901],[153.390824,67.150085],[153.398494,67.151382],[153.405721,67.15283],[153.420832,67.156459],[153.428372,67.158243],[153.432054,67.159023],[153.437225,67.15987],[153.444327,67.160777],[153.449024,67.161404],[153.451867,67.161533],[153.454606,67.161424],[153.45823,67.161404],[153.462791,67.161646],[153.465635,67.16199],[153.477721,67.162959],[153.488797,67.164011],[153.497398,67.16512],[153.512332,67.166857],[153.523083,67.16824],[153.536397,67.170137],[153.545293,67.171337],[153.551803,67.172651],[153.555897,67.173543],[153.561818,67.174274],[153.567974,67.175154],[153.577076,67.177039],[153.589536,67.180113],[153.598284,67.181963],[153.605501,67.183334],[153.613601,67.184156],[153.62503,67.185002],[153.63316,67.185458],[153.64129,67.186258],[153.644353,67.186669],[153.646137,67.186866],[153.648918,67.186939],[153.652938,67.186774],[153.657312,67.186604],[153.659165,67.186737],[153.660436,67.186943],[153.661581,67.186915],[153.665008,67.187008],[153.672246,67.188037],[153.675214,67.18901],[153.677942,67.190658],[153.679832,67.192587],[153.681187,67.194767],[153.682365,67.199642],[153.683109,67.205434],[153.682895,67.207688],[153.682663,67.21181],[153.681897,67.214423],[153.680969,67.217622],[153.678524,67.224601],[153.676394,67.228593],[153.676601,67.229106],[153.676453,67.229779],[153.675452,67.231007],[153.673556,67.232419],[153.669668,67.234402],[153.663717,67.238585],[153.66089,67.239987],[153.658121,67.243211],[153.654085,67.247905],[153.651582,67.249876],[153.644315,67.254842],[153.64015,67.257096],[153.636129,67.258979],[153.630797,67.262393],[153.619091,67.270249],[153.598915,67.282106],[153.586918,67.289441],[153.576639,67.295438],[153.569334,67.300326],[153.565858,67.303691],[153.56138,67.309145],[153.55655,67.314781],[153.552308,67.318552],[153.551189,67.322118],[153.550776,67.326797],[153.549127,67.331633],[153.549127,67.334007],[153.549127,67.335061],[153.549009,67.337876],[153.54948,67.341145],[153.550305,67.34203],[153.54842,67.345638],[153.547359,67.349291],[153.545887,67.355915],[153.545298,67.362741],[153.545651,67.366482],[153.544355,67.369089],[153.545003,67.37063],[153.547536,67.373282],[153.552426,67.375594],[153.566211,67.382279],[153.571337,67.384386],[153.579113,67.386447],[153.590365,67.388554],[153.609629,67.392789],[153.616109,67.393989],[153.619644,67.394714],[153.620646,67.395393],[153.621942,67.398223],[153.622203,67.399037],[153.62259,67.400238],[153.623032,67.40077],[153.624151,67.401483],[153.626036,67.402355],[153.628127,67.40343],[153.629188,67.404641],[153.634107,67.408002],[153.637259,67.410311],[153.638791,67.410752],[153.643179,67.411499],[153.649071,67.413739],[153.657878,67.417189],[153.667186,67.421442],[153.671752,67.423839],[153.677525,67.427673],[153.682827,67.430963],[153.68863,67.434772],[153.692518,67.437926],[153.696615,67.441513],[153.699239,67.44407],[153.702042,67.4462],[153.704083,67.447797],[153.704333,67.449954],[153.70446,67.450241],[153.704081,67.450481],[153.703891,67.450633],[153.703863,67.450686],[153.704031,67.451017],[153.704271,67.451135],[153.70654,67.451581],[153.707122,67.451808],[153.709107,67.452583],[153.709843,67.45287],[153.710771,67.453347],[153.71149,67.453715],[153.712617,67.454292],[153.713027,67.454503],[153.713212,67.454598],[153.71416,67.455259],[153.714673,67.455693],[153.714749,67.455681],[153.714869,67.45566],[153.720386,67.454271],[153.720512,67.454906],[153.722859,67.457427],[153.724984,67.459801],[153.725594,67.460672],[153.726322,67.461648],[153.7263,67.462027],[153.725876,67.462299],[153.724966,67.462392],[153.723546,67.462359],[153.719639,67.462399],[153.717569,67.462799],[153.715937,67.463222],[153.713863,67.463943],[153.713485,67.46415],[153.713303,67.464307],[153.713313,67.464387],[153.713396,67.464579],[153.713911,67.464867],[153.714925,67.465444],[153.715175,67.465587],[153.715568,67.46592],[153.716062,67.466578],[153.716102,67.466667],[153.716463,67.467472],[153.716522,67.467602],[153.716833,67.468986],[153.717139,67.470348],[153.71744,67.471586],[153.717674,67.47255],[153.717986,67.473669],[153.718895,67.473952],[153.720737,67.474538],[153.721438,67.474851],[153.722242,67.475209],[153.72296,67.475727],[153.723106,67.476079],[153.722824,67.476462],[153.722252,67.476707],[153.719381,67.477569],[153.718984,67.477715],[153.718771,67.477903],[153.7187,67.478107],[153.718805,67.478624],[153.719022,67.479413],[153.717402,67.479555],[153.715032,67.479642],[153.713769,67.479919],[153.711575,67.480918],[153.710198,67.481739],[153.708532,67.482282],[153.705095,67.483162],[153.700003,67.484541],[153.695645,67.4855],[153.693647,67.486172],[153.689929,67.487047],[153.687148,67.487249],[153.679097,67.488246],[153.67693,67.48819],[153.675525,67.488426],[153.673505,67.489266],[153.672568,67.489972],[153.672451,67.491026],[153.672187,67.491754],[153.669787,67.494074],[153.664019,67.498265],[153.66197,67.500293],[153.660594,67.50082],[153.65711,67.501895],[153.654358,67.502411],[153.64903,67.503273],[153.645926,67.503912],[153.640188,67.505457],[153.633891,67.506699],[153.630146,67.507642],[153.624671,67.509131],[153.623705,67.509702],[153.622827,67.510677],[153.621714,67.513991],[153.620309,67.515895],[153.618611,67.518503],[153.617059,67.520138],[153.6146,67.52222],[153.611643,67.524749],[153.609506,67.527267],[153.609623,67.527815],[153.611058,67.529281],[153.612931,67.53115],[153.614805,67.53303],[153.616093,67.535648],[153.616298,67.537572],[153.617206,67.539115],[153.618962,67.540983],[153.620016,67.542403],[153.620309,67.543388],[153.621385,67.545255],[153.623116,67.546805],[153.627055,67.548947],[153.631412,67.550794],[153.632605,67.55166],[153.633978,67.553642],[153.635112,67.555807],[153.635709,67.556468],[153.637177,67.556819],[153.638573,67.557265],[153.642393,67.558837],[153.645079,67.559407],[153.649137,67.56009],[153.653673,67.562209],[153.655337,67.563279],[153.656974,67.564517],[153.658805,67.566056],[153.660321,67.567498],[153.662267,67.569315],[153.66537,67.572434],[153.667041,67.573869],[153.668101,67.575135],[153.668191,67.575242],[153.667316,67.57546],[153.666616,67.575591],[153.664451,67.575592],[153.661609,67.575636],[153.65917,67.575716],[153.657038,67.575914],[153.655218,67.576046],[153.654036,67.576192],[153.653455,67.576413],[153.653255,67.576663],[153.653405,67.576947],[153.654128,67.577451],[153.654292,67.577739],[153.653948,67.578083],[153.653026,67.578484],[153.651845,67.578778],[153.650716,67.579253],[153.650609,67.579381],[153.650095,67.580054],[153.649217,67.580112],[153.648156,67.58042],[153.646775,67.581119],[153.645717,67.581917],[153.64482,67.583106],[153.644192,67.584109],[153.644284,67.585177],[153.644988,67.585937],[153.645047,67.58618],[153.644437,67.586752],[153.643756,67.587958],[153.643245,67.588599],[153.643144,67.589409],[153.642994,67.589759],[153.640364,67.590592],[153.638699,67.591267],[153.637708,67.591669],[153.636455,67.591925],[153.635836,67.59209],[153.635321,67.592426],[153.63459,67.593367],[153.634045,67.593652],[153.633687,67.593956],[153.633396,67.594718],[153.633456,67.595318],[153.63362,67.596094],[153.63365,67.59724],[153.633381,67.597658],[153.632031,67.599318],[153.63179,67.600078],[153.631875,67.600994],[153.630522,67.601885],[153.630259,67.602337],[153.630087,67.602926],[153.629744,67.603498],[153.629403,67.60413],[153.629315,67.604733],[153.629379,67.604917],[153.629486,67.605084],[153.629465,67.605305],[153.629272,67.605501],[153.629122,67.605771],[153.628794,67.60696],[153.628035,67.607924],[153.626895,67.60876],[153.625798,67.609242],[153.625418,67.60966],[153.624883,67.610158],[153.624701,67.610528],[153.623814,67.611702],[153.621493,67.612586],[153.619088,67.613229],[153.617358,67.613422],[153.614277,67.61392],[153.611914,67.614129],[153.607651,67.615575],[153.605963,67.617455],[153.606217,67.618146],[153.606174,67.618741],[153.605415,67.619207],[153.603853,67.619448],[153.601022,67.619964],[153.599351,67.620316],[153.596377,67.6204],[153.594875,67.620498],[153.593559,67.620795],[153.590798,67.621184],[153.587318,67.621507],[153.585232,67.622415],[153.584431,67.622787],[153.583031,67.623291],[153.582222,67.624246],[153.583395,67.625652],[153.586093,67.627029],[153.587086,67.628052],[153.588489,67.630039],[153.589036,67.630936],[153.5923,67.633353],[153.594297,67.634797],[153.595691,67.635917],[153.597278,67.63706],[153.598279,67.638116],[153.59921,67.63915],[153.600239,67.64016],[153.602342,67.641907],[153.603759,67.642921],[153.605677,67.644526],[153.607833,67.646234],[153.60836,67.646825],[153.608551,67.647453],[153.609338,67.647834],[153.609338,67.648324],[153.609853,67.648715],[153.610511,67.649781],[153.61084,67.65053],[153.611347,67.651131],[153.611019,67.651812],[153.610661,67.653026],[153.609795,67.653366],[153.60699,67.653412],[153.605558,67.653593],[153.604573,67.653979],[153.603767,67.654104],[153.602305,67.654024],[153.600575,67.654217],[153.599321,67.654626],[153.598187,67.655443],[153.595919,67.65635],[153.592876,67.659231],[153.593443,67.660003],[153.593681,67.66099],[153.593562,67.661387],[153.593293,67.662067],[153.593323,67.662804],[153.593283,67.664934],[153.592289,67.668305],[153.591514,67.671984],[153.591115,67.674743],[153.591025,67.678008],[153.590697,67.68143],[153.590846,67.684343],[153.592607,67.68662],[153.592428,67.687084],[153.591622,67.688104],[153.591622,67.689214],[153.591294,67.690404],[153.591682,67.692069],[153.591374,67.695618],[153.591068,67.697287],[153.590844,67.698557],[153.590817,67.699906],[153.590279,67.700517],[153.589056,67.701389],[153.588996,67.701639],[153.588516,67.701932],[153.586982,67.702253],[153.585445,67.702725],[153.583744,67.703348],[153.582372,67.704899],[153.58155,67.70549],[153.581078,67.706027],[153.580074,67.706959],[153.579656,67.708103],[153.579,67.709008],[153.577508,67.709778],[153.577237,67.710243],[153.577023,67.710838],[153.577108,67.71126],[153.577537,67.711578],[153.577903,67.712269],[153.579172,67.714238],[153.580572,67.71656],[153.583297,67.720935],[153.584192,67.722496],[153.584168,67.722798],[153.583996,67.723099],[153.584073,67.723695],[153.583476,67.724555],[153.58258,67.725213],[153.582342,67.725551],[153.582193,67.726048],[153.581118,67.727462],[153.580969,67.727813],[153.579358,67.728978],[153.577645,67.730704],[153.577516,67.731044],[153.577698,67.731382],[153.5779,67.731889],[153.578364,67.732041],[153.579097,67.732198],[153.579769,67.732232],[153.580359,67.732167],[153.580916,67.732105],[153.581432,67.732161],[153.582165,67.732178],[153.582923,67.73228],[153.583612,67.732434],[153.583889,67.732565],[153.584043,67.732743],[153.584132,67.73315],[153.584699,67.73358],[153.586012,67.734055],[153.588889,67.734803],[153.590946,67.735502],[153.592521,67.736208],[153.601436,67.741293],[153.608147,67.744998],[153.61075,67.746466],[153.611162,67.746896],[153.61189,67.747451],[153.613854,67.748921],[153.615589,67.750334],[153.618045,67.752379],[153.618715,67.752705],[153.619144,67.753038],[153.619679,67.753231],[153.622944,67.753897],[153.625393,67.754236],[153.626976,67.754549],[153.628178,67.754847],[153.629529,67.75528],[153.630356,67.755618],[153.632303,67.756497],[153.633648,67.757059],[153.635023,67.757757],[153.635347,67.758128],[153.635613,67.758878],[153.636289,67.761075],[153.638069,67.764959],[153.638096,67.765302],[153.638241,67.765776],[153.638241,67.766908],[153.638542,67.767551],[153.638691,67.768066],[153.638627,67.768669],[153.638799,67.768882],[153.638729,67.769103],[153.638059,67.769673],[153.637426,67.769913],[153.636804,67.770197],[153.635988,67.770376],[153.634789,67.770568],[153.633006,67.770651],[153.630366,67.770668],[153.628375,67.770835],[153.626011,67.770839],[153.624376,67.770849],[153.623337,67.770722],[153.62271,67.770703],[153.620383,67.770914],[153.617307,67.771306],[153.613353,67.771916],[153.606204,67.77322],[153.597051,67.774608],[153.592618,67.775283],[153.590069,67.77605],[153.587907,67.77674],[153.586378,67.777226],[153.583977,67.777841],[153.582699,67.778104],[153.58125,67.77872],[153.578675,67.77988],[153.57625,67.781268],[153.575027,67.782022],[153.574619,67.782363],[153.574555,67.78289],[153.575023,67.783534],[153.574834,67.783742],[153.573207,67.784458],[153.571937,67.784797],[153.570752,67.785143],[153.570329,67.785515],[153.569696,67.78614],[153.569198,67.786443],[153.568375,67.786817],[153.567762,67.787142],[153.567569,67.787473],[153.567912,67.787736],[153.568675,67.787888],[153.569209,67.788091],[153.570242,67.788642],[153.571208,67.789253],[153.574102,67.790872],[153.574383,67.791116],[153.574434,67.791279],[153.574214,67.791504],[153.572649,67.792128],[153.571529,67.792527],[153.570763,67.792936],[153.567917,67.795306],[153.566968,67.796264],[153.566989,67.796587],[153.567487,67.799986],[153.567948,67.800708],[153.569062,67.801722],[153.571057,67.803182],[153.572119,67.804323],[153.573555,67.805981],[153.575039,67.807892],[153.576539,67.809533],[153.577793,67.811499],[153.578417,67.812202],[153.578914,67.812452],[153.579407,67.812626],[153.579855,67.812697],[153.580327,67.812818],[153.580713,67.813078],[153.58101,67.813434],[153.580992,67.815168],[153.580971,67.816416],[153.580742,67.816803],[153.579941,67.817161],[153.579423,67.817546],[153.577998,67.818371],[153.577688,67.8187],[153.577612,67.819081],[153.577731,67.819389],[153.578246,67.819802],[153.578351,67.820014],[153.577998,67.822715],[153.577645,67.823342],[153.577081,67.824143],[153.576057,67.82552],[153.575756,67.825877],[153.575634,67.826091],[153.575768,67.827743],[153.5761,67.828152],[153.576031,67.828607],[153.575441,67.829622],[153.575634,67.830187],[153.576165,67.830714],[153.575972,67.831861],[153.575683,67.832516],[153.57602,67.833372],[153.578239,67.8349],[153.578577,67.835737],[153.579541,67.836301],[153.580554,67.837466],[153.581095,67.837688],[153.582129,67.837892],[153.583143,67.838111],[153.58361,67.83841],[153.583636,67.838739],[153.583426,67.839],[153.582016,67.839847],[153.5814,67.840223],[153.581057,67.840571],[153.580799,67.841],[153.579669,67.841793],[153.577009,67.844204],[153.576014,67.845265],[153.575756,67.845848],[153.574013,67.847229],[153.570714,67.849699],[153.567423,67.851632],[153.566272,67.852296],[153.565285,67.853299],[153.563612,67.855185],[153.562552,67.856982],[153.562388,67.857642],[153.562753,67.861322],[153.562238,67.863618],[153.561774,67.864789],[153.561311,67.86557],[153.560564,67.866197],[153.558547,67.867014],[153.553316,67.868691],[153.550308,67.8699],[153.547347,67.871048],[153.544134,67.872664],[153.541231,67.874079],[153.537421,67.875895],[153.536746,67.876293],[153.536425,67.876592],[153.536253,67.87702],[153.53651,67.877731],[153.536875,67.878362],[153.536725,67.878895],[153.536596,67.879339],[153.536259,67.87986],[153.535713,67.880679],[153.535601,67.881493],[153.535263,67.882655],[153.534299,67.883817],[153.533431,67.884326],[153.530846,67.885899],[153.52984,67.886684],[153.528463,67.887049],[153.524229,67.890043],[153.518767,67.894323],[153.517959,67.894931],[153.516769,67.895365],[153.515224,67.895809],[153.514395,67.896069],[153.512535,67.897263],[153.511619,67.897779],[153.51104,67.898286],[153.510766,67.898731],[153.510847,67.899515],[153.511469,67.901048],[153.512711,67.903609],[153.513655,67.904673],[153.514109,67.905012],[153.51455,67.905283],[153.51679,67.906432],[153.517658,67.906765],[153.5181,67.907279],[153.518033,67.907652],[153.517713,67.908256],[153.517642,67.908668],[153.518189,67.909317],[153.518468,67.909915],[153.51855,67.910096],[153.519095,67.910262],[153.52184,67.910488],[153.524845,67.910859],[153.527412,67.911185],[153.528078,67.911314],[153.528828,67.911701],[153.531575,67.9125],[153.535137,67.913412],[153.539493,67.914969],[153.540596,67.915608],[153.541437,67.916535],[153.543763,67.919825],[153.5449,67.921148],[153.546038,67.922286],[153.546909,67.923052],[153.548334,67.924044],[153.548828,67.924605],[153.549449,67.92489],[153.550651,67.925334],[153.551187,67.925729],[153.551252,67.926052],[153.55123,67.9266],[153.551552,67.926955],[153.551968,67.927177],[153.555859,67.930022],[153.557374,67.93145],[153.558698,67.932252],[153.559427,67.9328],[153.560264,67.933187],[153.562066,67.933727],[153.564148,67.934154],[153.566357,67.934361],[153.567281,67.934767],[153.568761,67.935202],[153.57007,67.935396],[153.573267,67.935452],[153.576391,67.935677],[153.578846,67.935968],[153.582344,67.936605],[153.585115,67.937107],[153.588567,67.937862],[153.590507,67.938245],[153.591551,67.938629],[153.592107,67.938942],[153.5925,67.93943],[153.592998,67.941057],[153.59406,67.942746],[153.595662,67.944084],[153.598888,67.946646],[153.59929,67.94736],[153.59922,67.948301],[153.598834,67.949134],[153.598266,67.949699],[153.598063,67.950076],[153.598352,67.952212],[153.599842,67.954846],[153.601446,67.959865],[153.602219,67.962068],[153.602877,67.963675],[153.603626,67.965858],[153.603819,67.966784],[153.603759,67.968115],[153.603909,67.968759],[153.60378,67.969113],[153.60333,67.969532],[153.602785,67.969823],[153.602729,67.970023],[153.602828,67.970285],[153.603272,67.970709],[153.60414,67.971686],[153.603706,67.972826],[153.603272,67.973441],[153.603947,67.975032],[153.603823,67.976082],[153.603947,67.977112],[153.602686,67.977989],[153.602463,67.978382],[153.602579,67.978898],[153.602923,67.979566],[153.603737,67.980226],[153.604172,67.980721],[153.604145,67.981425],[153.603792,67.98221],[153.603802,67.982494],[153.604355,67.982708],[153.605883,67.98321],[153.606986,67.983749],[153.607428,67.984119],[153.607265,67.984452],[153.606359,67.984906],[153.605056,67.985666],[153.602958,67.987712],[153.602214,67.988342],[153.60142,67.988648],[153.599038,67.989122],[153.594895,67.990348],[153.594553,67.990545],[153.594521,67.990734],[153.594686,67.990872],[153.59524,67.991241],[153.595817,67.991764],[153.596252,67.992238],[153.596345,67.992616],[153.596316,67.992906],[153.595603,67.995174],[153.595412,67.996117],[153.595485,67.997167],[153.595862,67.99779],[153.59642,67.998304],[153.596635,67.998754],[153.596729,67.99935],[153.596635,68.00029],[153.596171,68.001323],[153.596444,68.003883],[153.596309,68.004481],[153.59627,68.005144],[153.595892,68.005689],[153.595673,68.006313],[153.594618,68.007161],[153.594081,68.007418],[153.593352,68.0077],[153.59213,68.008597],[153.589525,68.009428],[153.588074,68.009643],[153.584027,68.009862],[153.581133,68.010098],[153.576599,68.01006],[153.575152,68.010042],[153.573614,68.010132],[153.572452,68.010231],[153.571266,68.010447],[153.57065,68.010616],[153.570377,68.010783],[153.569509,68.011595],[153.568761,68.012183],[153.567976,68.012976],[153.56756,68.013806],[153.567387,68.014557],[153.566959,68.016465],[153.56677,68.018168],[153.56683,68.018842],[153.567242,68.019486],[153.567517,68.019677],[153.567563,68.019969],[153.567281,68.020392],[153.567167,68.020697],[153.567531,68.02167],[153.56729,68.022537],[153.565168,68.02436],[153.564405,68.025283],[153.563914,68.026074],[153.563676,68.02741],[153.563721,68.028727],[153.564362,68.030597],[153.564396,68.031073],[153.564277,68.031312],[153.563912,68.031673],[153.563676,68.03205],[153.563287,68.032336],[153.559814,68.034068],[153.558206,68.035403],[153.556509,68.03669],[153.554846,68.038091],[153.554728,68.038455],[153.554894,68.038777],[153.555811,68.039173],[153.556872,68.039967],[153.556874,68.040245],[153.556679,68.040598],[153.555184,68.041645],[153.55364,68.043178],[153.551914,68.044233],[153.551191,68.044584],[153.548538,68.045283],[153.547432,68.04574],[153.546491,68.046389],[153.546123,68.046751],[153.545489,68.047145],[153.544192,68.047465],[153.543077,68.04783],[153.540907,68.04875],[153.53835,68.049813],[153.536421,68.0503],[153.534079,68.05041],[153.531575,68.05073],[153.529406,68.051075],[153.522289,68.051887],[153.51954,68.052049],[153.514523,68.052878],[153.513125,68.053491],[153.510761,68.054969],[153.508735,68.057655],[153.507642,68.058402],[153.50261,68.060574],[153.50097,68.060989],[153.498703,68.061277],[153.497715,68.061619],[153.496581,68.062124],[153.490745,68.06398],[153.485391,68.065115],[153.480278,68.0658],[153.478059,68.066304],[153.475841,68.066376],[153.474363,68.066385],[153.47209,68.066016],[153.470632,68.066048],[153.469045,68.066224],[153.467694,68.066545],[153.467449,68.066709],[153.46748,68.066961],[153.467802,68.067506],[153.46763,68.067938],[153.4651,68.069316],[153.46377,68.069876],[153.463556,68.071045],[153.4648,68.072198],[153.464628,68.072951],[153.465529,68.074232],[153.466708,68.074624],[153.466988,68.075059],[153.467201,68.075641],[153.466858,68.076074],[153.4657,68.07689],[153.465572,68.077611],[153.466343,68.079612],[153.466172,68.080444],[153.465572,68.082269],[153.463642,68.084766],[153.462656,68.085807],[153.458753,68.089071],[153.457853,68.090128],[153.45558,68.091792],[153.454722,68.092608],[153.453007,68.095231],[153.452997,68.095545],[153.453457,68.095847],[153.454593,68.096159],[153.455623,68.096607],[153.456223,68.096919],[153.457167,68.097223],[153.457396,68.097514],[153.457546,68.097827],[153.457831,68.098231],[153.457611,68.098603],[153.456759,68.098831],[153.453478,68.099143],[153.450379,68.099283],[153.448341,68.099443],[153.446903,68.099483],[153.446109,68.09966],[153.444173,68.099775],[153.442805,68.099788],[153.44214,68.099724],[153.440935,68.099839],[153.437526,68.099711],[153.435339,68.099943],[153.432809,68.100446],[153.431844,68.100774],[153.431158,68.10091],[153.430129,68.10087],[153.429458,68.100996],[153.42875,68.101212],[153.427706,68.101438],[153.424833,68.101854],[153.422774,68.102014],[153.419558,68.102414],[153.417914,68.102797],[153.413297,68.104669],[153.410981,68.105068],[153.409309,68.105164],[153.407593,68.105436],[153.405664,68.105996],[153.404503,68.106149],[153.403863,68.106524],[153.403133,68.107035],[153.401161,68.107883],[153.396401,68.110617],[153.389869,68.113158],[153.382549,68.116116],[153.378004,68.118002],[153.373475,68.11962],[153.372617,68.119684],[153.366854,68.121949],[153.364324,68.12318],[153.363047,68.124081],[153.359521,68.125784],[153.355919,68.128148],[153.354721,68.128846],[153.353517,68.129714],[153.353089,68.130561],[153.352489,68.131068],[153.351287,68.131838],[153.346445,68.134343],[153.342233,68.13695],[153.33844,68.139063],[153.335924,68.140593],[153.33377,68.141795],[153.331587,68.143353],[153.329525,68.144301],[153.323951,68.14799],[153.323436,68.14839],[153.321419,68.14962],[153.320174,68.150578],[153.319515,68.151239],[153.319187,68.151856],[153.318131,68.152433],[153.316729,68.153308],[153.313575,68.155115],[153.313029,68.155722],[153.31202,68.156662],[153.310422,68.157798],[153.307557,68.160303],[153.306762,68.161454],[153.302364,68.164533],[153.298535,68.167589],[153.296534,68.168761],[153.293198,68.171377],[153.292106,68.172708],[153.289014,68.175436],[153.288104,68.176992],[153.286941,68.180023],[153.286588,68.181478],[153.283798,68.184858],[153.283313,68.186233],[153.283313,68.187833],[153.283798,68.188487],[153.284465,68.191619],[153.284612,68.1935],[153.287194,68.198805],[153.288043,68.199638],[153.287861,68.200314],[153.286891,68.201057],[153.280705,68.206641],[153.280099,68.207722],[153.280351,68.208328],[153.281035,68.208737],[153.281726,68.209288],[153.281736,68.210063],[153.281615,68.211099],[153.282342,68.212405],[153.285112,68.217243],[153.285499,68.217991],[153.285112,68.218405],[153.285069,68.218963],[153.285971,68.219472],[153.287255,68.222464],[153.287983,68.222959],[153.287929,68.223443],[153.28925,68.223982],[153.292328,68.22538],[153.295284,68.227042],[153.303083,68.2318],[153.305449,68.233464],[153.306904,68.233981],[153.307268,68.234474],[153.306988,68.234807],[153.30745,68.235279],[153.307632,68.235578],[153.306965,68.236185],[153.305267,68.23713],[153.304114,68.238771],[153.299687,68.242076],[153.30018,68.243181],[153.300476,68.243871],[153.300218,68.24457],[153.300654,68.245277],[153.302091,68.246438],[153.303371,68.247242],[153.303738,68.247879],[153.303011,68.250012],[153.300873,68.252513],[153.297549,68.255616],[153.293455,68.259742],[153.289938,68.262904],[153.286957,68.265166],[153.28462,68.266726],[153.283859,68.267689],[153.284101,68.268812],[153.283252,68.269621],[153.283252,68.270182],[153.284283,68.270496],[153.28586,68.270564],[153.286507,68.270753],[153.286953,68.270898],[153.287674,68.271389],[153.288171,68.271876],[153.288191,68.27204],[153.288116,68.272159],[153.287708,68.272167],[153.2852,68.271944],[153.283954,68.271913],[153.28316,68.272012],[153.281903,68.272172],[153.279516,68.272929],[153.276481,68.273859],[153.275293,68.274082],[153.27097,68.274757],[153.263887,68.276335],[153.260117,68.277389],[153.257196,68.278306],[153.251616,68.279581],[153.250587,68.280086],[153.250093,68.280737],[153.249754,68.281444],[153.248849,68.281705],[153.247167,68.281932],[153.243529,68.283156],[153.241473,68.283847],[153.240985,68.284097],[153.240679,68.2843],[153.239832,68.285198],[153.238807,68.286461],[153.237949,68.287958],[153.23812,68.288763],[153.238131,68.289528],[153.239344,68.290672],[153.242556,68.291427],[153.244863,68.291996],[153.247471,68.293207],[153.24832,68.294059],[153.250867,68.295674],[153.256628,68.297648],[153.265907,68.301617],[153.271244,68.304487],[153.27889,68.308631],[153.28028,68.309822],[153.281379,68.310629],[153.281918,68.311167],[153.282828,68.312512],[153.28404,68.313446],[153.284769,68.313595],[153.288073,68.313984],[153.289771,68.314297],[153.292435,68.315242],[153.293833,68.315812],[153.295154,68.316608],[153.296356,68.317892],[153.297515,68.319478],[153.298931,68.322046],[153.299639,68.32329],[153.300304,68.323821],[153.300723,68.324242],[153.300658,68.325506],[153.300294,68.326783],[153.299417,68.329334],[153.30039,68.332174],[153.30124,68.336306],[153.301931,68.337621],[153.302962,68.338539],[153.3046,68.339479],[153.307557,68.343136],[153.311336,68.345196],[153.314338,68.34719],[153.316355,68.349058],[153.317213,68.349961],[153.317084,68.350705],[153.31511,68.352098],[153.314767,68.352494],[153.314849,68.352928],[153.31497,68.353689],[153.316062,68.35559],[153.317428,68.357021],[153.319215,68.359661],[153.320186,68.360332],[153.321762,68.361898],[153.322105,68.362228],[153.322176,68.362644],[153.322792,68.363027],[153.322856,68.363336],[153.323071,68.363518],[153.323328,68.363708],[153.324487,68.364056],[153.326614,68.365274],[153.328638,68.366155],[153.330603,68.36794],[153.331718,68.369696],[153.332982,68.370439],[153.335661,68.37219],[153.338327,68.374837],[153.338764,68.375983],[153.339047,68.376406],[153.339592,68.376987],[153.344323,68.381658],[153.346809,68.383668],[153.348083,68.384249],[153.348144,68.385076],[153.349114,68.387779],[153.348507,68.389365],[153.347425,68.393381],[153.346975,68.397853],[153.346097,68.406021],[153.345827,68.408193],[153.345293,68.409012],[153.345551,68.410332],[153.346039,68.411555],[153.348284,68.413679],[153.349648,68.417564],[153.350044,68.419187],[153.350145,68.420547],[153.349498,68.422892],[153.349433,68.423822],[153.349358,68.424362],[153.349423,68.425426],[153.349702,68.42601],[153.350045,68.426893],[153.350087,68.427567],[153.350002,68.428071],[153.349292,68.428728],[153.348844,68.429258],[153.348587,68.429537],[153.348799,68.429809],[153.349185,68.430014],[153.349144,68.430527],[153.349294,68.431197],[153.350859,68.43269],[153.352221,68.433632],[153.355266,68.434862],[153.357659,68.435456],[153.360661,68.435902],[153.362314,68.436203],[153.364133,68.436738],[153.365922,68.437462],[153.36715,68.438142],[153.368499,68.439485],[153.369015,68.440192],[153.369364,68.44051],[153.369743,68.440571],[153.370379,68.440549],[153.370865,68.440426],[153.37182,68.440081],[153.372381,68.440025],[153.372911,68.440064],[153.373101,68.440281],[153.37284,68.44047],[153.372472,68.4407],[153.372306,68.440933],[153.372406,68.441298],[153.372715,68.442343],[153.372901,68.442975],[153.373404,68.444393],[153.373564,68.445277],[153.37315,68.446859],[153.373611,68.447098],[153.374541,68.447502],[153.374524,68.448052],[153.374094,68.448887],[153.373594,68.449689],[153.373624,68.45009],[153.373851,68.45053],[153.373806,68.450842],[153.374109,68.45126],[153.374534,68.451483],[153.375004,68.451538],[153.375747,68.451516],[153.378536,68.451182],[153.381114,68.450987],[153.38266,68.450742],[153.383479,68.450803],[153.384874,68.451238],[153.385784,68.451566],[153.388149,68.452607],[153.394229,68.454601],[153.395502,68.455174],[153.397731,68.456216],[153.399293,68.45734],[153.400475,68.458576],[153.401233,68.459767],[153.401415,68.461649],[153.400263,68.464064],[153.399111,68.466858],[153.399416,68.468056],[153.399416,68.470102],[153.399931,68.470747],[153.40156,68.471424],[153.410866,68.474382],[153.412174,68.475217],[153.413145,68.476485],[153.413569,68.477331],[153.414358,68.47762],[153.418057,68.478221],[153.419513,68.478287],[153.421938,68.479177],[153.422848,68.479466],[153.426244,68.480201],[153.429034,68.481202],[153.429701,68.481891],[153.430368,68.483982],[153.432612,68.487719],[153.43431,68.48912],[153.436008,68.489587],[153.43989,68.490543],[153.441224,68.491299],[153.44183,68.492299],[153.44274,68.493522],[153.443832,68.494278],[153.445287,68.495056],[153.448077,68.497302],[153.44929,68.497724],[153.45214,68.498457],[153.453171,68.499213],[153.453596,68.50048],[153.455112,68.50128],[153.460267,68.504992],[153.462329,68.506836],[153.463784,68.507436],[153.467726,68.508547],[153.479552,68.512435],[153.480887,68.513146],[153.481554,68.514145],[153.481311,68.5149],[153.479856,68.515989],[153.478582,68.518476],[153.478764,68.519231],[153.479856,68.521075],[153.482342,68.521874],[153.485556,68.52234],[153.488043,68.523828],[153.489438,68.524028],[153.496048,68.524916],[153.501809,68.526292],[153.512241,68.529822],[153.512544,68.53031],[153.514303,68.532863],[153.516122,68.534483],[153.518669,68.536347],[153.519943,68.537035],[153.523339,68.537612],[153.524491,68.538211],[153.524794,68.53901],[153.524309,68.540119],[153.524127,68.541029],[153.524976,68.541739],[153.526856,68.543048],[153.527402,68.54449],[153.52716,68.546109],[153.525583,68.548283],[153.51685,68.558239],[153.510057,68.563471],[153.509815,68.564224],[153.509208,68.565266],[153.509815,68.566507],[153.509694,68.567681],[153.509694,68.568302],[153.512423,68.57085],[153.51503,68.572445],[153.519761,68.574351],[153.521944,68.576477],[153.522247,68.577939],[153.523885,68.58166],[153.523642,68.582214],[153.522854,68.5829],[153.521762,68.583277],[153.518123,68.584052],[153.517032,68.584716],[153.517032,68.586399],[153.51691,68.587794],[153.517638,68.588768],[153.518912,68.589764],[153.519397,68.591535],[153.522975,68.593882],[153.525583,68.596648],[153.530253,68.600388],[153.532375,68.603066],[153.536438,68.604924],[153.537348,68.605721],[153.541775,68.606871],[153.544565,68.607181],[153.546748,68.607844],[153.548507,68.609127],[153.551175,68.610587],[153.555117,68.611914],[153.558817,68.613484],[153.560818,68.613882],[153.562759,68.613971],[153.565185,68.614435],[153.566337,68.615099],[153.570097,68.618261],[153.576404,68.622373],[153.577011,68.623169],[153.579315,68.624031],[153.600238,68.633247],[153.61449,68.639565],[153.624315,68.643364],[153.634807,68.647759],[153.643904,68.651468],[153.64548,68.651711],[153.64736,68.652263],[153.648816,68.652815],[153.649604,68.653455],[153.649301,68.653941],[153.648331,68.654647],[153.647542,68.656876],[153.650211,68.659878],[153.653607,68.662283],[153.656093,68.66396],[153.659793,68.667248],[153.66331,68.668351],[153.666161,68.669675],[153.667192,68.670491],[153.673014,68.673072],[153.676592,68.674615],[153.679988,68.676181],[153.684536,68.678828],[153.686538,68.679533],[153.688115,68.680305],[153.690359,68.680856],[153.69242,68.681121],[153.694664,68.681033],[153.69612,68.6809],[153.698061,68.681121],[153.704853,68.682377],[153.70928,68.683017],[153.710796,68.683458],[153.711221,68.684538],[153.711463,68.687007],[153.710857,68.687646],[153.710857,68.688043],[153.712312,68.689101],[153.712616,68.689894],[153.714435,68.692781],[153.717043,68.69428],[153.718195,68.694676],[153.719347,68.695359],[153.721227,68.696263],[153.725776,68.700317],[153.726564,68.701462],[153.729354,68.702916],[153.729839,68.703643],[153.730446,68.704898],[153.73275,68.706616],[153.735055,68.708268],[153.737359,68.710624],[153.739967,68.712782],[153.741726,68.713729],[153.745547,68.715666],[153.747305,68.716987],[153.750338,68.720134],[153.751126,68.720465],[153.751672,68.720729],[153.751672,68.721213],[153.751187,68.721609],[153.751126,68.721917],[153.751854,68.723017],[153.751914,68.72425],[153.752703,68.725042],[153.754401,68.72568],[153.759495,68.727242],[153.760526,68.728189],[153.760587,68.728805],[153.761557,68.729201],[153.76186,68.729905],[153.761254,68.730653],[153.75992,68.732039],[153.759131,68.734238],[153.759738,68.736086],[153.763437,68.741034],[153.764893,68.74198],[153.767864,68.743475],[153.769805,68.744948],[153.771442,68.748267],[153.7712,68.748839],[153.770654,68.749894],[153.771442,68.750421],[153.772655,68.751037],[153.776779,68.75352],[153.778841,68.754158],[153.781692,68.754707],[153.790546,68.757388],[153.793882,68.757959],[153.800795,68.758662],[153.804131,68.758662],[153.805829,68.75886],[153.808255,68.760135],[153.811287,68.761672],[153.812257,68.762881],[153.813349,68.763474],[153.814744,68.764374],[153.817534,68.765736],[153.81905,68.767208],[153.832695,68.773928],[153.837547,68.776826],[153.840518,68.777967],[153.845431,68.780953],[153.847311,68.781677],[153.850646,68.783236],[153.851981,68.784267],[153.855983,68.786484],[153.865747,68.790433],[153.882122,68.797321],[153.887216,68.7998],[153.888914,68.800743],[153.893341,68.802388],[153.896798,68.804142],[153.903469,68.80708],[153.908503,68.809294],[153.910019,68.810259],[153.91481,68.811968],[153.922209,68.815979],[153.925362,68.817404],[153.928516,68.818565],[153.935976,68.822071],[153.94204,68.824634],[153.947316,68.826781],[153.953806,68.828555],[153.96266,68.831512],[153.966056,68.832826],[153.970544,68.834753],[153.981339,68.838453],[153.983704,68.839263],[153.985099,68.840402],[153.986251,68.841562],[153.987343,68.843094],[153.988374,68.844167],[153.990982,68.845414],[153.995166,68.846902],[153.99832,68.84804],[154.000382,68.849178],[154.010692,68.853095],[154.015665,68.854583],[154.02082,68.856901],[154.024094,68.858804],[154.029735,68.86261],[154.035617,68.867596],[154.043926,68.873323],[154.044654,68.874482],[154.045199,68.875553],[154.047079,68.876908],[154.050294,68.878241],[154.056722,68.87988],[154.064849,68.882611],[154.071217,68.884206],[154.077827,68.885102],[154.080435,68.885452],[154.08189,68.886042],[154.082254,68.886763],[154.081648,68.88768],[154.078191,68.890607],[154.077645,68.891546],[154.079222,68.895674],[154.079646,68.898097],[154.079525,68.89908],[154.078979,68.899779],[154.079161,68.901481],[154.079889,68.902289],[154.080374,68.903162],[154.080374,68.905913],[154.078919,68.90971],[154.076978,68.91366],[154.075037,68.916867],[154.073885,68.92208],[154.07431,68.924021],[154.076796,68.927903],[154.078494,68.929865],[154.078494,68.93174],[154.080314,68.934422],[154.08377,68.938912],[154.089896,68.947737],[154.09311,68.952267],[154.092867,68.953335],[154.096445,68.95732],[154.099114,68.960347],[154.100448,68.961501],[154.102389,68.96457],[154.105178,68.967313],[154.109727,68.969533],[154.1147,68.97123],[154.118824,68.973124],[154.122948,68.975473],[154.125677,68.977432],[154.127314,68.979498],[154.127981,68.980543],[154.130225,68.983131],[154.132045,68.984871],[154.13538,68.987415],[154.140171,68.992003],[154.142536,68.994938],[154.142779,68.996069],[154.144477,68.997568],[154.146721,68.999459],[154.152543,69.005479],[154.152119,69.009542],[154.153824,69.01383],[154.153267,69.014882],[154.152119,69.016644],[154.152811,69.01914],[154.152907,69.020879],[154.154241,69.024526],[154.153392,69.026176],[154.153513,69.027327],[154.155818,69.029215],[154.159335,69.031342],[154.163035,69.032861],[154.163156,69.033534],[154.162247,69.035009],[154.161458,69.035726],[154.161276,69.036463],[154.16255,69.03744],[154.163702,69.038004],[154.163459,69.039023],[154.161337,69.042993],[154.15879,69.045726],[154.157516,69.048437],[154.157698,69.049456],[154.158486,69.05041],[154.158244,69.052253],[154.152422,69.059321],[154.152301,69.060946],[154.149693,69.063243],[154.143507,69.070892],[154.140171,69.074293],[154.135562,69.080184],[154.136047,69.083129],[154.136229,69.085618],[154.137382,69.088606],[154.138958,69.093367],[154.140838,69.098431],[154.143992,69.10345],[154.144703,69.103989],[154.144962,69.104185],[154.147691,69.105245],[154.151997,69.106781],[154.154908,69.1089],[154.158911,69.11143],[154.161458,69.112382],[154.165521,69.113052],[154.173102,69.113982],[154.177833,69.114349],[154.181593,69.114284],[154.18881,69.113852],[154.200575,69.113679],[154.206033,69.113074],[154.221195,69.114003],[154.229746,69.115214],[154.234112,69.115711],[154.246241,69.117463],[154.252427,69.119235],[154.258735,69.120662],[154.263465,69.122477],[154.267953,69.123536],[154.268438,69.124163],[154.267771,69.127102],[154.268923,69.127772],[154.268681,69.128355],[154.26953,69.129262],[154.269833,69.131185],[154.271592,69.133],[154.275897,69.135376],[154.286511,69.144856],[154.29494,69.151009],[154.295426,69.151786],[154.302946,69.153879],[154.30992,69.156814],[154.314711,69.159209],[154.323201,69.161777],[154.327811,69.162359],[154.334785,69.163675],[154.338484,69.163956],[154.343821,69.165681],[154.349461,69.167924],[154.353646,69.169283],[154.359589,69.17021],[154.3625,69.170857],[154.367595,69.17103],[154.373538,69.170361],[154.379845,69.170016],[154.386334,69.170016],[154.400889,69.169261],[154.406105,69.169607],[154.409683,69.170232],[154.413261,69.17144],[154.418537,69.172151],[154.42533,69.173078],[154.433517,69.17338],[154.435882,69.173564],[154.43802,69.173628],[154.439657,69.173623],[154.440719,69.173531],[154.441189,69.173299],[154.441022,69.172998],[154.440233,69.172798],[154.439293,69.172599],[154.438156,69.172383],[154.437459,69.172264],[154.436974,69.172006],[154.436928,69.171752],[154.437214,69.170879],[154.437909,69.170257],[154.43872,69.170053],[154.440482,69.169895],[154.441978,69.169841],[154.444316,69.170121],[154.446786,69.170347],[154.449081,69.17037],[154.450742,69.170269],[154.45166,69.170113],[154.452403,69.169888],[154.453036,69.169484],[154.454807,69.168388],[154.456817,69.166888],[154.458937,69.165427],[154.46086,69.1643],[154.463396,69.163584],[154.466586,69.162916],[154.471479,69.161197],[154.475238,69.159098],[154.478341,69.157527],[154.479652,69.156703],[154.482625,69.15409],[154.483542,69.153032],[154.484723,69.15227],[154.485684,69.152083],[154.488656,69.152145],[154.491235,69.152083],[154.494557,69.152223],[154.499934,69.153157],[154.502338,69.153514],[154.504305,69.154136],[154.506315,69.154821],[154.509724,69.155396],[154.513221,69.155661],[154.516718,69.155552],[154.521876,69.155956],[154.52428,69.156112],[154.527296,69.156003],[154.532803,69.155256],[154.538048,69.15465],[154.545435,69.152581],[154.551205,69.150621],[154.555357,69.149423],[154.558723,69.149003],[154.566984,69.148303],[154.574021,69.147307],[154.57778,69.146576],[154.57848,69.146078],[154.581758,69.145331],[154.584949,69.14544],[154.588183,69.144864],[154.589669,69.144055],[154.597843,69.141518],[154.603176,69.139339],[154.605711,69.137596],[154.60912,69.13632],[154.618212,69.134078],[154.636395,69.130341],[154.64671,69.128441],[154.653267,69.127631],[154.661747,69.125825],[154.681328,69.123021],[154.696714,69.121027],[154.699949,69.121245],[154.709652,69.12271],[154.717782,69.123644],[154.723027,69.123769],[154.734479,69.122959],[154.738151,69.123021],[154.741823,69.122616],[154.745756,69.122492],[154.755198,69.121588],[154.76665,69.120498],[154.777227,69.11894],[154.786756,69.117444],[154.795236,69.11654],[154.796022,69.115606],[154.801442,69.113892],[154.809135,69.110899],[154.814643,69.109434],[154.820238,69.106286],[154.82557,69.103324],[154.830553,69.102045],[154.844365,69.100424],[154.856604,69.099083],[154.867356,69.098085],[154.889474,69.09743],[154.902761,69.097087],[154.906083,69.096806],[154.908531,69.097211],[154.915437,69.097929],[154.923654,69.100548],[154.926364,69.101235],[154.927763,69.100985],[154.928725,69.099769],[154.932047,69.096775],[154.936942,69.095527],[154.940177,69.094623],[154.94446,69.091784],[154.946908,69.089319],[154.948919,69.088383],[154.952066,69.088009],[154.956874,69.087946],[154.960283,69.087478],[154.972434,69.086323],[154.985547,69.085824],[154.999884,69.085793],[155.001833,69.085774],[155.003256,69.085568],[155.00399,69.085337],[155.005391,69.084638],[155.008276,69.083546],[155.019203,69.080603],[155.024592,69.078966],[155.033715,69.075461],[155.040009,69.073276],[155.041564,69.072917],[155.043392,69.072796],[155.045027,69.072968],[155.046181,69.072985],[155.047575,69.072745],[155.051903,69.072642],[155.06128,69.07235],[155.064549,69.07223],[155.065752,69.07192],[155.066184,69.071543],[155.066425,69.071182],[155.066732,69.071005],[155.067704,69.070773],[155.072003,69.069962],[155.076859,69.069327],[155.08489,69.068743],[155.089025,69.068554],[155.094747,69.068347],[155.101912,69.068296],[155.106865,69.068313],[155.110327,69.068141],[155.113116,69.067987],[155.117973,69.067643],[155.121435,69.06766],[155.125619,69.068176],[155.133649,69.069309],[155.135621,69.069413],[155.137448,69.069327],[155.139227,69.069602],[155.140958,69.069997],[155.143218,69.07089],[155.145238,69.071869],[155.148075,69.073294],[155.149566,69.073724],[155.1512,69.073844],[155.153124,69.073672],[155.157259,69.072848],[155.164905,69.071199],[155.179379,69.068811],[155.193372,69.066801],[155.196161,69.066406],[155.197796,69.066372],[155.199286,69.065856],[155.203518,69.065375],[155.205538,69.065564],[155.208134,69.065925],[155.210202,69.065822],[155.213472,69.065736],[155.217848,69.065942],[155.220492,69.066595],[155.224868,69.067506],[155.2316,69.068244],[155.234533,69.068708],[155.236601,69.069636],[155.238669,69.070718],[155.242083,69.071216],[155.249152,69.072504],[155.257326,69.074479],[155.258673,69.074583],[155.260211,69.074514],[155.261462,69.074634],[155.263145,69.075115],[155.268675,69.075905],[155.275166,69.076729],[155.282619,69.077038],[155.286082,69.077485],[155.290554,69.078412],[155.29291,69.078567],[155.295795,69.078412],[155.299065,69.078515],[155.306711,69.07903],[155.313923,69.079271],[155.316905,69.079408],[155.321377,69.079992],[155.326618,69.081279],[155.33234,69.082825],[155.33561,69.083185],[155.341621,69.083048],[155.351575,69.08279],[155.364366,69.082069],[155.386774,69.080352],[155.394852,69.079837],[155.40043,69.079717],[155.40721,69.080335],[155.415481,69.081022],[155.435244,69.082464],[155.439043,69.082842],[155.451209,69.083151],[155.455873,69.083116],[155.45746,69.083425],[155.458662,69.08437],[155.462173,69.08576],[155.463904,69.08612],[155.467125,69.086086],[155.471213,69.086704],[155.473761,69.086962],[155.482273,69.088747],[155.485206,69.09024],[155.486684,69.091377],[155.489041,69.092651],[155.489834,69.09287],[155.491914,69.093264],[155.495136,69.093916],[155.50431,69.096593],[155.507506,69.097272],[155.514987,69.098243],[155.525119,69.100111],[155.527909,69.100298],[155.535747,69.101499],[155.537622,69.102082],[155.539546,69.102339],[155.54623,69.1033],[155.55426,69.104638],[155.565512,69.106027],[155.572821,69.106473],[155.580419,69.107176],[155.581943,69.107403],[155.58247,69.107536],[155.584399,69.108112],[155.587932,69.108861],[155.593799,69.109752],[155.59779,69.110318],[155.600916,69.110901],[155.60231,69.111672],[155.602991,69.112222],[155.603917,69.112672],[155.605011,69.113199],[155.607692,69.114275],[155.610216,69.115578],[155.611166,69.116015],[155.611959,69.116396],[155.613306,69.117347],[155.613462,69.118436],[155.613883,69.119113],[155.615025,69.119803],[155.617297,69.120861],[155.619859,69.122231],[155.621117,69.124279],[155.621899,69.125539],[155.624211,69.126447],[155.630229,69.127501],[155.635329,69.128604],[155.646108,69.129549],[155.648284,69.129488],[155.649678,69.129161],[155.652194,69.128664],[155.659267,69.127962],[155.666373,69.127392],[155.669161,69.127405],[155.671746,69.127901],[155.678478,69.128834],[155.681504,69.129415],[155.692079,69.132444],[155.701599,69.134599],[155.705339,69.135181],[155.708808,69.135156],[155.712344,69.134805],[155.714248,69.134285],[155.717036,69.133279],[155.722374,69.13139],[155.727815,69.129791],[155.732575,69.128604],[155.738967,69.127865],[155.744782,69.127368],[155.749508,69.12675],[155.759471,69.124872],[155.78861,69.119359],[155.792758,69.118705],[155.798199,69.118353],[155.808059,69.117711],[155.810745,69.117941],[155.81299,69.118244],[155.817002,69.11782],[155.818702,69.117226],[155.819178,69.116111],[155.819484,69.115056],[155.82064,69.114147],[155.824006,69.112814],[155.829937,69.110937],[155.833133,69.110185],[155.837077,69.109749],[155.840001,69.109846],[155.844285,69.11067],[155.847414,69.110815],[155.851766,69.110864],[155.854282,69.111106],[155.859654,69.111276],[155.86217,69.111882],[155.867475,69.112246],[155.870671,69.111979],[155.874207,69.111349],[155.880055,69.111131],[155.88842,69.111397],[155.894064,69.11187],[155.896444,69.11187],[155.901613,69.111652],[155.905659,69.112113],[155.910113,69.112998],[155.920416,69.113228],[155.930038,69.113579],[155.935615,69.113483],[155.938335,69.112682],[155.940851,69.112513],[155.945135,69.111349],[155.946223,69.110646],[155.948739,69.110088],[155.953704,69.109846],[155.958464,69.110282],[155.96472,69.111252],[155.966488,69.111131],[155.967276,69.110724],[155.968647,69.110587],[155.972199,69.110697],[155.984287,69.1114],[155.997508,69.11272],[156.002435,69.113141],[156.006515,69.113407],[156.016852,69.113771],[156.021849,69.113851],[156.033389,69.114578],[156.034361,69.11458],[156.036187,69.114197],[156.037581,69.114039],[156.039825,69.114342],[156.043089,69.115094],[156.046693,69.116621],[156.050433,69.117991],[156.051726,69.118718],[156.05278,69.119554],[156.054375,69.120009],[156.055908,69.12033],[156.059206,69.120839],[156.061263,69.121515],[156.063728,69.122257],[156.069951,69.122693],[156.075561,69.123662],[156.089876,69.125177],[156.095656,69.125516],[156.101402,69.126558],[156.103442,69.126509],[156.105007,69.126206],[156.106333,69.125661],[156.107557,69.12531],[156.109427,69.125383],[156.111603,69.125673],[156.116363,69.125831],[156.118335,69.125782],[156.120885,69.126291],[156.127074,69.126328],[156.129182,69.126727],[156.130474,69.126425],[156.133772,69.126194],[156.138618,69.126455],[156.140029,69.126509],[156.140871,69.126402],[156.141693,69.126106],[156.142035,69.125686],[156.143089,69.125068],[156.143871,69.123783],[156.143565,69.123323],[156.142443,69.122475],[156.143021,69.121966],[156.146183,69.12073],[156.148903,69.120306],[156.150025,69.119809],[156.151963,69.119409],[156.156009,69.119433],[156.161518,69.120403],[156.163014,69.120463],[156.1657,69.120948],[156.167162,69.12159],[156.168556,69.122656],[156.170188,69.123068],[156.174336,69.123565],[156.182531,69.123371],[156.186169,69.123468],[156.189022,69.123821],[156.190181,69.124038],[156.190578,69.124211],[156.191022,69.12441],[156.191297,69.124532],[156.19246,69.125152],[156.19289,69.125249],[156.19335,69.125305],[156.195826,69.125309],[156.197569,69.125202],[156.198182,69.125069],[156.198206,69.124941],[156.19793,69.124727],[156.197723,69.124576],[156.19752,69.124441],[156.197461,69.124401],[156.197064,69.124255],[156.197004,69.124097],[156.197149,69.124011],[156.197627,69.124051],[156.19815,69.124157],[156.199084,69.12426],[156.200319,69.124402],[156.201621,69.124474],[156.202931,69.12441],[156.203845,69.124208],[156.204289,69.124037],[156.205302,69.123521],[156.20621,69.123309],[156.207112,69.123188],[156.20921,69.123157],[156.21065,69.123376],[156.212692,69.124011],[156.214772,69.124555],[156.215743,69.124899],[156.216075,69.125243],[156.215145,69.125738],[156.214279,69.126055],[156.21113,69.127125],[156.208713,69.128226],[156.207788,69.128744],[156.207764,69.128946],[156.208124,69.12913],[156.208821,69.129284],[156.209795,69.129297],[156.210625,69.12919],[156.211274,69.128984],[156.211574,69.128702],[156.211502,69.128376],[156.211238,69.128106],[156.211466,69.127742],[156.212055,69.127425],[156.21363,69.126907],[156.215121,69.12644],[156.21785,69.125909],[156.218186,69.125639],[156.218126,69.125391],[156.218342,69.125044],[156.219316,69.124525],[156.220627,69.123956],[156.22243,69.123206],[156.223572,69.122615],[156.224257,69.122143],[156.224269,69.121775],[156.223969,69.121449],[156.223812,69.121055],[156.224233,69.119826],[156.223956,69.118026],[156.224153,69.116938],[156.224634,69.115618],[156.224923,69.112481],[156.2255,69.11063],[156.227519,69.109669],[156.229635,69.109172],[156.231508,69.107761],[156.232188,69.107155],[156.232227,69.106912],[156.232141,69.106598],[156.231703,69.105862],[156.232376,69.104593],[156.232376,69.103324],[156.233963,69.101866],[156.235021,69.101214],[156.238146,69.100511],[156.240695,69.100082],[156.245552,69.098521],[156.246417,69.097355],[156.247427,69.093803],[156.247427,69.088998],[156.24685,69.088466],[156.244878,69.088088],[156.239348,69.086887],[156.238579,69.086372],[156.239012,69.085685],[156.240454,69.084707],[156.242234,69.084192],[156.244975,69.083694],[156.25113,69.081497],[156.252524,69.080449],[156.254063,69.078595],[156.256227,69.076878],[156.259016,69.07547],[156.260122,69.074319],[156.261901,69.072121],[156.262622,69.069183],[156.261949,69.066675],[156.263055,69.064218],[156.265652,69.062551],[156.269931,69.061349],[156.281039,69.059046],[156.287146,69.057946],[156.289743,69.057052],[156.290993,69.055815],[156.292339,69.055247],[156.295705,69.05456],[156.303784,69.051792],[156.311814,69.049041],[156.313545,69.048491],[156.314459,69.047683],[156.315565,69.046978],[156.316334,69.045791],[156.318738,69.043074],[156.320614,69.041543],[156.325278,69.039582],[156.32975,69.037862],[156.330952,69.037621],[156.331674,69.037054],[156.335905,69.0348],[156.338165,69.033441],[156.340425,69.031032],[156.342926,69.028519],[156.343791,69.027366],[156.345522,69.026109],[156.349514,69.024354],[156.355765,69.022753],[156.357736,69.021806],[156.363218,69.020618],[156.382789,69.015332],[156.38577,69.014471],[156.389569,69.013334],[156.394522,69.012112],[156.395965,69.011285],[156.396397,69.010096],[156.397984,69.007358],[156.399427,69.004033],[156.403851,69.001706],[156.405582,69.001017],[156.407698,69.000828],[156.413324,69.000724],[156.415343,69.000707],[156.416401,69.0005],[156.416593,68.999863],[156.416593,68.999328],[156.417122,68.998915],[156.416738,68.998518],[156.416738,68.998139],[156.417796,68.997829],[156.41818,68.997209],[156.418228,68.996347],[156.41794,68.995209],[156.418613,68.994589],[156.420392,68.994037],[156.426211,68.992796],[156.431693,68.991296],[156.436309,68.989865],[156.442271,68.986934],[156.446695,68.984624],[156.450206,68.983123],[156.454579,68.981982],[156.456835,68.981719],[156.457736,68.981588],[156.459153,68.981241],[156.460344,68.981072],[156.462007,68.980853],[156.468358,68.979783],[156.469227,68.979744],[156.470686,68.979718],[156.471673,68.979671],[156.472135,68.979502],[156.472373,68.979243],[156.472037,68.97876],[156.471844,68.978191],[156.472229,68.977673],[156.473239,68.977276],[156.476172,68.976103],[156.478143,68.975311],[156.479875,68.97474],[156.484351,68.97378],[156.48797,68.972909],[156.490695,68.972254],[156.49214,68.972056],[156.496124,68.971577],[156.497349,68.971543],[156.501561,68.971221],[156.50964,68.97041],[156.5144,68.969547],[156.517959,68.968581],[156.519065,68.967977],[156.519642,68.966924],[156.520459,68.965888],[156.524114,68.962781],[156.529259,68.959242],[156.530894,68.95831],[156.533491,68.957844],[156.534548,68.957775],[156.535222,68.957982],[156.535077,68.958379],[156.535462,68.958621],[156.536472,68.958759],[156.538059,68.958586],[156.539838,68.958276],[156.541425,68.958224],[156.544454,68.958448],[156.547484,68.958621],[156.553062,68.958379],[156.557005,68.957758],[156.560996,68.956376],[156.565901,68.954304],[156.572296,68.950799],[156.577441,68.948035],[156.58225,68.945668],[156.584023,68.94486],[156.584412,68.944727],[156.585098,68.944611],[156.585964,68.944549],[156.588242,68.944478],[156.589078,68.944373],[156.589529,68.944226],[156.590104,68.943848],[156.590751,68.943605],[156.593117,68.94306],[156.594315,68.942711],[156.595195,68.942515],[156.596943,68.942318],[156.597769,68.942268],[156.598949,68.94219],[156.602232,68.941882],[156.608133,68.941489],[156.609137,68.941428],[156.611727,68.941508],[156.613313,68.941522],[156.617113,68.941365],[156.619613,68.941211],[156.620289,68.941053],[156.622834,68.940053],[156.623101,68.939803],[156.623197,68.939153],[156.623444,68.938828],[156.624666,68.938262],[156.625912,68.937081],[156.626008,68.936027],[156.624614,68.934575],[156.621825,68.932708],[156.615237,68.929614],[156.614179,68.928853],[156.610909,68.927747],[156.610279,68.927012],[156.609894,68.926352],[156.610172,68.925608],[156.61015,68.924927],[156.610644,68.924597],[156.611524,68.924296],[156.612117,68.923866],[156.613111,68.92347],[156.615381,68.922992],[156.622305,68.921522],[156.633461,68.920951],[156.636202,68.920381],[156.644012,68.919635],[156.646541,68.919256],[156.648667,68.918902],[156.649764,68.91857],[156.650397,68.918328],[156.650898,68.918061],[156.650984,68.91786],[156.650889,68.917548],[156.647262,68.914067],[156.64695,68.913715],[156.647187,68.913338],[156.647723,68.913028],[156.649089,68.91251],[156.649418,68.912263],[156.650051,68.911991],[156.653898,68.911455],[156.655773,68.910849],[156.656302,68.91052],[156.657216,68.910486],[156.658803,68.910849],[156.66164,68.911126],[156.664525,68.910901],[156.672267,68.909257],[156.674527,68.908496],[156.677268,68.907181],[156.679864,68.90545],[156.681163,68.904239],[156.681692,68.90185],[156.681451,68.900015],[156.682701,68.898613],[156.682317,68.89747],[156.680826,68.896882],[156.677604,68.896293],[156.676931,68.896085],[156.675921,68.895358],[156.673421,68.8947],[156.672507,68.89399],[156.67169,68.892588],[156.671786,68.892051],[156.672796,68.890994],[156.67621,68.889626],[156.676787,68.888985],[156.677172,68.887583],[156.678085,68.885833],[156.681692,68.882819],[156.683471,68.881727],[156.692992,68.87802],[156.694675,68.877604],[156.696839,68.877621],[156.702753,68.878557],[156.704196,68.878626],[156.707418,68.878002],[156.709437,68.877378],[156.712082,68.877413],[156.713861,68.876668],[156.716746,68.876044],[156.720257,68.874987],[156.724152,68.872924],[156.731124,68.87029],[156.733817,68.86899],[156.735981,68.868747],[156.738,68.868903],[156.739539,68.869371],[156.742376,68.869648],[156.745357,68.869683],[156.748002,68.869232],[156.749541,68.868452],[156.750647,68.867187],[156.751657,68.865956],[156.751897,68.864465],[156.752426,68.863719],[156.754205,68.862818],[156.756129,68.862107],[156.758196,68.862003],[156.760264,68.862159],[156.762188,68.862263],[156.765121,68.862037],[156.765938,68.861413],[156.76815,68.86065],[156.772718,68.859835],[156.775459,68.859488],[156.779835,68.859644],[156.782239,68.859956],[156.783442,68.859835],[156.783826,68.859211],[156.784067,68.858656],[156.78676,68.856193],[156.787096,68.855048],[156.786279,68.853868],[156.786567,68.853504],[156.788202,68.852966],[156.790029,68.852012],[156.792674,68.850312],[156.796184,68.848681],[156.800897,68.847276],[156.803061,68.846772],[156.803542,68.846234],[156.807052,68.84436],[156.809985,68.843579],[156.827056,68.841375],[156.830854,68.84075],[156.834894,68.839778],[156.837298,68.838737],[156.838837,68.837279],[156.838933,68.836706],[156.837635,68.83589],[156.837106,68.835161],[156.836865,68.833876],[156.837923,68.833459],[156.854368,68.829483],[156.873507,68.825193],[156.877209,68.824724],[156.879373,68.824863],[156.881922,68.825384],[156.883749,68.825922],[156.885961,68.826235],[156.888894,68.826113],[156.892116,68.826374],[156.899281,68.826773],[156.906301,68.827208],[156.911687,68.826895],[156.913562,68.826235],[156.913851,68.82455],[156.915438,68.823334],[156.917121,68.820676],[156.918179,68.818435],[156.919333,68.817306],[156.922074,68.816611],[156.926546,68.816124],[156.946309,68.814056],[156.949483,68.813657],[156.953474,68.812753],[156.955349,68.812023],[156.960735,68.811397],[156.962514,68.811084],[156.967467,68.809259],[156.975882,68.806739],[156.982373,68.805261],[156.985547,68.804044],[156.989105,68.80387],[156.991991,68.803975],[156.993722,68.803731],[156.995212,68.802862],[156.996511,68.801801],[157.004637,68.79528],[157.006368,68.794602],[157.012571,68.793175],[157.014976,68.79281],[157.017813,68.793036],[157.020554,68.793228],[157.022958,68.793262],[157.025891,68.793488],[157.030796,68.793245],[157.032816,68.792984],[157.035605,68.792288],[157.037576,68.791958],[157.040557,68.791627],[157.045655,68.789801],[157.047963,68.789574],[157.053925,68.789975],[157.058109,68.790288],[157.061956,68.790914],[157.06537,68.791175],[157.068495,68.791227],[157.07316,68.791175],[157.076718,68.790949],[157.079459,68.790131],[157.08089,68.789092],[157.08095,68.78887],[157.080721,68.788591],[157.080817,68.788096],[157.081214,68.787743],[157.082392,68.78716],[157.086789,68.785534],[157.092434,68.784229],[157.107734,68.781596],[157.111475,68.78039],[157.113583,68.779332],[157.114059,68.778569],[157.113447,68.777879],[157.112631,68.777042],[157.112903,68.776058],[157.114739,68.775097],[157.118139,68.774334],[157.119839,68.774408],[157.121879,68.773916],[157.122763,68.773152],[157.123103,68.772512],[157.125075,68.772094],[157.134936,68.770813],[157.137112,68.770641],[157.142076,68.771158],[157.146701,68.772291],[157.148333,68.772438],[157.149285,68.772118],[157.150509,68.770936],[157.151597,68.769779],[157.152821,68.769213],[157.157037,68.768572],[157.16071,68.768006],[157.164042,68.768326],[157.165674,68.768104],[157.166966,68.767883],[157.169278,68.768228],[157.170638,68.768277],[157.172066,68.767834],[157.173562,68.767489],[157.177166,68.767292],[157.178799,68.767489],[157.180703,68.768301],[157.182675,68.768917],[157.184307,68.768942],[157.186483,68.768597],[157.190631,68.768006],[157.193011,68.767637],[157.195527,68.766651],[157.200152,68.765124],[157.204164,68.763868],[157.227693,68.757882],[157.24381,68.753619],[157.255167,68.750711],[157.257479,68.750095],[157.259791,68.749725],[157.262715,68.74864],[157.276996,68.743365],[157.287061,68.741368],[157.289033,68.741417],[157.294065,68.740949],[157.298281,68.740209],[157.303314,68.738754],[157.307462,68.73799],[157.337792,68.734167],[157.342416,68.733254],[157.344592,68.733279],[157.346088,68.733896],[157.34738,68.734315],[157.349148,68.734142],[157.350372,68.733526],[157.3518,68.732292],[157.353705,68.730862],[157.359825,68.728049],[157.361661,68.727457],[157.363021,68.726273],[157.366149,68.725212],[157.368665,68.724669],[157.370433,68.72383],[157.38281,68.721461],[157.387144,68.720652],[157.391103,68.72017],[157.393141,68.719884],[157.394642,68.719641],[157.39637,68.719323],[157.398013,68.719262],[157.398119,68.719265],[157.398966,68.71937],[157.399571,68.719398],[157.400941,68.719385],[157.401466,68.719455],[157.401992,68.719638],[157.403065,68.720012],[157.404095,68.720207],[157.40535,68.720674],[157.406015,68.720791],[157.406831,68.721099],[157.407571,68.72127],[157.40874,68.721546],[157.411165,68.722411],[157.412217,68.722878],[157.413276,68.723953],[157.413752,68.725681],[157.41348,68.727359],[157.414092,68.728],[157.416948,68.72911],[157.419056,68.729505],[157.425857,68.732144],[157.430889,68.733082],[157.432317,68.733649],[157.435037,68.734093],[157.436737,68.734586],[157.438097,68.735252],[157.440817,68.735326],[157.442354,68.735267],[157.443965,68.735232],[157.445961,68.735049],[157.447163,68.734796],[157.448052,68.734403],[157.44887,68.733854],[157.449952,68.733444],[157.450697,68.732947],[157.452885,68.732764],[157.455145,68.731909],[157.458198,68.73129],[157.460098,68.730924],[157.461853,68.730915],[157.463849,68.731299],[157.466036,68.731787],[157.473225,68.733008],[157.481911,68.736606],[157.483543,68.737592],[157.486739,68.73811],[157.490071,68.738209],[157.492315,68.737839],[157.493676,68.738011],[157.494492,68.738677],[157.49558,68.739244],[157.497552,68.739294],[157.50068,68.739072],[157.503808,68.73917],[157.506936,68.739318],[157.512445,68.741735],[157.515029,68.745433],[157.516865,68.749451],[157.517069,68.751521],[157.516321,68.754947],[157.516185,68.755809],[157.517273,68.756228],[157.518973,68.756622],[157.520197,68.757583],[157.522373,68.758372],[157.522373,68.758963],[157.521285,68.759751],[157.520809,68.761082],[157.521693,68.762067],[157.523053,68.762215],[157.527133,68.762042],[157.533866,68.762831],[157.538558,68.763841],[157.545495,68.765786],[157.550051,68.766378],[157.555219,68.766254],[157.560591,68.765614],[157.577456,68.761131],[157.585549,68.757509],[157.588337,68.753394],[157.590173,68.752236],[157.594797,68.748021],[157.596429,68.747307],[157.600714,68.743337],[157.608194,68.739688],[157.612206,68.738061],[157.615198,68.736852],[157.622815,68.735077],[157.624243,68.735101],[157.625535,68.735447],[157.627167,68.735447],[157.628527,68.735175],[157.628935,68.734583],[157.629479,68.734065],[157.630771,68.73372],[157.631315,68.733227],[157.630499,68.732462],[157.628867,68.731031],[157.628527,68.729601],[157.628935,68.728565],[157.631451,68.726986],[157.636688,68.72437],[157.643896,68.722149],[157.645664,68.721458],[157.648384,68.719607],[157.655457,68.718176],[157.663481,68.717855],[157.666269,68.71741],[157.670962,68.715732],[157.673138,68.714374],[157.674838,68.712967],[157.677762,68.711807],[157.683814,68.710523],[157.688575,68.70993],[157.694083,68.70877],[157.698231,68.707733],[157.703876,68.707115],[157.710064,68.707486],[157.716184,68.708819],[157.719244,68.709288],[157.726317,68.711856],[157.734681,68.711436],[157.738149,68.710943],[157.753518,68.707041],[157.756375,68.706448],[157.758415,68.706523],[157.759639,68.706374],[157.759911,68.70588],[157.761203,68.704226],[157.766371,68.700175],[157.769023,68.699088],[157.77392,68.698001],[157.778272,68.697729],[157.782284,68.6981],[157.788812,68.699631],[157.790852,68.699854],[157.794321,68.699459],[157.799013,68.698841],[157.803773,68.697803],[157.808806,68.696049],[157.810982,68.69516],[157.81207,68.693924],[157.81377,68.69343],[157.81717,68.693257],[157.819822,68.69343],[157.821794,68.693974],[157.823018,68.693998],[157.824582,68.69348],[157.826147,68.692714],[157.829275,68.69217],[157.831995,68.691256],[157.834307,68.689971],[157.835667,68.68913],[157.839475,68.688562],[157.850424,68.687227],[157.862597,68.684434],[157.867085,68.683025],[157.868309,68.682184],[157.871165,68.681344],[157.872525,68.679094],[157.875381,68.67536],[157.874973,68.671848],[157.877081,68.669399],[157.879919,68.667285],[157.88225,68.665367],[157.888802,68.661065],[157.890948,68.659538],[157.892171,68.658566],[157.8926,68.658168],[157.892729,68.657867],[157.89245,68.657598],[157.891903,68.65727],[157.890884,68.656282],[157.890658,68.655809],[157.89068,68.654739],[157.890251,68.654021],[157.890251,68.653325],[157.890326,68.652923],[157.890969,68.652169],[157.891023,68.65197],[157.890873,68.651767],[157.890594,68.651462],[157.890068,68.651154],[157.889317,68.650716],[157.888845,68.650369],[157.888448,68.650158],[157.888008,68.650029],[157.887762,68.649845],[157.88759,68.6494],[157.887962,68.647844],[157.890206,68.645318],[157.892268,68.643888],[157.893963,68.642696],[157.89481,68.642372],[157.896259,68.642161],[157.897042,68.641977],[157.897332,68.641782],[157.897321,68.64161],[157.897075,68.641289],[157.897063,68.640832],[157.897042,68.640571],[157.897214,68.640387],[157.897686,68.640262],[157.899981,68.639913],[157.903005,68.639758],[157.905529,68.639553],[157.905928,68.639604],[157.906157,68.63967],[157.906268,68.639779],[157.907115,68.640534],[157.909767,68.642695],[157.912691,68.644639],[157.917486,68.647214],[157.924116,68.650061],[157.928366,68.65172],[157.932651,68.652896],[157.940709,68.654913],[157.944865,68.655847],[157.949289,68.656513],[157.955059,68.65688],[157.963907,68.65709],[157.969533,68.657178],[157.97689,68.656863],[157.984103,68.65625],[157.990691,68.655077],[157.99467,68.653939],[158.006199,68.650219],[158.010851,68.648827],[158.01465,68.647654],[158.027693,68.643815],[158.030615,68.642992],[158.036734,68.641267],[158.039523,68.640632],[158.049344,68.638426],[158.052446,68.637725],[158.060897,68.635943],[158.06258,68.635658],[158.064287,68.635461],[158.067448,68.635216],[158.073207,68.634883],[158.080516,68.634515],[158.085529,68.634261],[158.094401,68.633801],[158.097274,68.633735],[158.101878,68.633678],[158.105941,68.633705],[158.11658,68.633814],[158.121873,68.633963],[158.130305,68.634347],[158.136187,68.63478],[158.145708,68.635796],[158.159853,68.637431],[158.176174,68.639784],[158.208068,68.645134],[158.238329,68.650333],[158.263831,68.654814],[158.296609,68.66068],[158.301233,68.661595],[158.312726,68.664515],[158.316942,68.665702],[158.324626,68.667484],[158.337819,68.670823],[158.348632,68.673519],[158.362948,68.677219],[158.371156,68.679706],[158.381331,68.683281],[158.388428,68.686047],[158.395012,68.689466],[158.402622,68.693785],[158.408009,68.697171],[158.414165,68.703041],[158.416816,68.706022],[158.418526,68.711207],[158.419894,68.715491],[158.42169,68.721667],[158.423999,68.728306],[158.425538,68.732556],[158.427675,68.738014],[158.429455,68.742664],[158.430694,68.744734],[158.431478,68.745864],[158.434896,68.750245],[158.436628,68.752368],[158.438979,68.755265],[158.440454,68.756481],[158.443447,68.758766],[158.447337,68.761593],[158.45204,68.765216],[158.454263,68.76678],[158.457127,68.768414],[158.46027,68.769923],[158.46369,68.771169],[158.469636,68.773546],[158.477799,68.776703],[158.484283,68.779155],[158.48906,68.781005],[158.500608,68.785271],[158.507924,68.787503],[158.516418,68.789264],[158.522737,68.790314],[158.529025,68.790708],[158.535343,68.790773],[158.546528,68.790762],[158.555235,68.790697],[158.56252,68.790347],[158.56899,68.789789],[158.578391,68.788225],[158.58734,68.786529],[158.591814,68.785512],[158.600399,68.783302],[158.608622,68.780972],[158.614184,68.779363],[158.618084,68.778039],[158.6215,68.776562],[158.626881,68.774286],[158.630146,68.772567],[158.634439,68.769557],[158.638127,68.766535],[158.645473,68.76071],[158.652849,68.755168],[158.662402,68.74683],[158.668841,68.740703],[158.672106,68.737799],[158.676188,68.73486],[158.679029,68.733227],[158.682294,68.731571],[158.683927,68.73088],[158.685499,68.730244],[158.698165,68.726043],[158.701944,68.724859],[158.704423,68.724201],[158.70932,68.722851],[158.714671,68.722138],[158.718359,68.721787],[158.726797,68.721248],[158.741186,68.720392],[158.7508,68.719888],[158.759427,68.719596],[158.771569,68.719658],[158.780205,68.719999],[158.786105,68.720589],[158.792432,68.721396],[158.804146,68.722947],[158.812953,68.724157],[158.825095,68.72577],[158.835783,68.727228],[158.848096,68.728935],[158.860751,68.730641],[158.875372,68.732688],[158.885034,68.733959],[158.892815,68.735138],[158.900853,68.736037],[158.911285,68.737029],[158.918638,68.737866],[158.92488,68.738332],[158.937107,68.739045],[158.951814,68.739758],[158.965324,68.740471],[158.977466,68.741153],[158.989522,68.741928],[159.008333,68.74292],[159.028341,68.743943],[159.045528,68.744873],[159.060149,68.745617],[159.071436,68.746237],[159.090333,68.747291],[159.098969,68.747725],[159.111538,68.748313],[159.124193,68.748964],[159.137189,68.749677],[159.149588,68.750328],[159.160267,68.750927],[159.163473,68.751004],[159.167214,68.750958],[159.173028,68.750756],[159.1757,68.750617],[159.179569,68.750206],[159.182412,68.749803],[159.18626,68.749276],[159.191775,68.748502],[159.195537,68.747742],[159.200475,68.746464],[159.216358,68.742636],[159.220484,68.741434],[159.225443,68.739427],[159.23814,68.734396],[159.240278,68.733403],[159.242095,68.732139],[159.243143,68.730984],[159.243784,68.729635],[159.244104,68.728092],[159.244254,68.726292],[159.245215,68.722801],[159.246968,68.718193],[159.248298,68.713825],[159.248722,68.711674],[159.249205,68.710621],[159.249931,68.709216],[159.25247,68.707196],[159.254768,68.705747],[159.256521,68.704627],[159.258788,68.704034],[159.261267,68.703765],[159.263111,68.703644],[159.265076,68.703699],[159.267072,68.704028],[159.269021,68.704632],[159.2715,68.705538],[159.275255,68.707029],[159.278312,68.707899],[159.281412,68.708465],[159.286392,68.709086],[159.290497,68.709669],[159.293041,68.710452],[159.294686,68.711694],[159.295264,68.712804],[159.295349,68.714077],[159.295264,68.717095],[159.295456,68.718189],[159.296332,68.71919],[159.298235,68.719927],[159.3008,68.720237],[159.303964,68.720237],[159.309222,68.719733],[159.313562,68.719368],[159.318863,68.718918],[159.321856,68.718926],[159.32363,68.719066],[159.325768,68.719547],[159.328653,68.720765],[159.330556,68.72234],[159.333314,68.72462],[159.334788,68.725481],[159.336627,68.726164],[159.338059,68.726489],[159.33994,68.726637],[159.341586,68.726575],[159.34289,68.726396],[159.344194,68.725993],[159.345177,68.725512],[159.346246,68.724659],[159.346674,68.723852],[159.346738,68.722991],[159.346652,68.721603],[159.346823,68.719128],[159.347294,68.717049],[159.347871,68.715155],[159.34864,68.712983],[159.349517,68.710608],[159.350094,68.708566],[159.35065,68.70755],[159.351804,68.706525],[159.353642,68.705586],[159.358623,68.703707],[159.362962,68.702045],[159.364459,68.701354],[159.365763,68.700267],[159.367943,68.697798],[159.370102,68.695569],[159.373202,68.692843],[159.376088,68.690155],[159.377605,68.689106],[159.379529,68.688329],[159.383462,68.687413],[159.392676,68.68568],[159.40238,68.683862],[159.405202,68.683551],[159.407511,68.683427],[159.410845,68.683629],[159.414394,68.68411],[159.417814,68.684872],[159.421833,68.685649],[159.424569,68.685882],[159.426279,68.685696],[159.427733,68.685183],[159.428331,68.684561],[159.428288,68.683846],[159.427562,68.68296],[159.426493,68.68223],[159.424312,68.681282],[159.420508,68.68038],[159.416874,68.679914],[159.412898,68.679494],[159.410033,68.679106],[159.408195,68.678639],[159.40704,68.678095],[159.406613,68.677302],[159.407254,68.676525],[159.408323,68.676059],[159.41123,68.675608],[159.414437,68.675219],[159.419567,68.674706],[159.425082,68.674224],[159.428459,68.673804],[159.431495,68.673167],[159.434317,68.67211],[159.439148,68.669279],[159.44462,68.665936],[159.450306,68.663042],[159.457275,68.660227],[159.461678,68.658111],[159.466253,68.65573],[159.467621,68.655186],[159.469887,68.654843],[159.472666,68.654859],[159.477369,68.655014],[159.484294,68.655403],[159.486432,68.655481],[159.489724,68.655372],[159.496693,68.655108],[159.506141,68.655045],[159.516744,68.655108],[159.519993,68.655045],[159.5229,68.654905],[159.529826,68.65447],[159.534529,68.654096],[159.537308,68.653801],[159.540471,68.653411],[159.544063,68.652727],[159.546735,68.652112],[159.548541,68.651567],[159.549214,68.651166],[159.549845,68.650575],[159.550162,68.649787],[159.549909,68.649178],[159.549312,68.648531],[159.548072,68.647836],[159.546683,68.647197],[159.541488,68.645501],[159.53794,68.644313],[159.535727,68.643379],[159.533557,68.642239],[159.531505,68.641075],[159.530062,68.640207],[159.528587,68.639129],[159.527839,68.638439],[159.526706,68.636769],[159.526086,68.635547],[159.526065,68.634137],[159.526322,68.632751],[159.526813,68.63191],[159.527359,68.631415],[159.528054,68.630881],[159.5289,68.630402],[159.529868,68.630038],[159.531787,68.62946],[159.534674,68.628876],[159.538574,68.628463],[159.543232,68.628092],[159.546952,68.627944],[159.551911,68.627905],[159.555908,68.628053],[159.559093,68.628427],[159.56168,68.629089],[159.564747,68.630074],[159.570519,68.632329],[159.573832,68.633525],[159.576098,68.634085],[159.578631,68.634537],[159.581335,68.634864],[159.584285,68.635055],[159.588732,68.635082],[159.591168,68.635],[159.593851,68.634786],[159.596876,68.634366],[159.599324,68.63391],[159.601846,68.633287],[159.604785,68.632364],[159.606816,68.631558],[159.609702,68.630257],[159.612438,68.62875],[159.616704,68.626204],[159.618669,68.624893],[159.619969,68.623648],[159.622962,68.620606],[159.62532,68.618325],[159.62668,68.617267],[159.628071,68.616484],[159.630822,68.615415],[159.634178,68.614555],[159.637775,68.613949],[159.643126,68.6131],[159.645968,68.612858],[159.647175,68.612838],[159.649912,68.61306],[159.652594,68.613555],[159.655266,68.614191],[159.657885,68.615204],[159.662032,68.617682],[159.666542,68.620309],[159.669407,68.621711],[159.674152,68.623971],[159.67924,68.626199],[159.682233,68.627243],[159.686123,68.628209],[159.69074,68.628848],[159.695657,68.629004],[159.700573,68.628785],[159.704806,68.628116],[159.707371,68.627586],[159.710236,68.626604],[159.713314,68.625295],[159.716691,68.623488],[159.719652,68.621509],[159.726359,68.616305],[159.728415,68.614629],[159.732254,68.61216],[159.734673,68.610936],[159.739298,68.609304],[159.742775,68.608444],[159.746614,68.607805],[159.750151,68.60754],[159.754716,68.607529],[159.759553,68.607827],[159.763997,68.608532],[159.767836,68.609679],[159.770587,68.610859],[159.774048,68.612992],[159.776104,68.615053],[159.777782,68.617941],[159.778976,68.620123],[159.781742,68.625578],[159.784841,68.630458],[159.785944,68.631852],[159.789375,68.6346],[159.792731,68.636665],[159.796543,68.638553],[159.799279,68.639713],[159.80193,68.640593],[159.805949,68.641418],[159.811699,68.642204],[159.816744,68.642687],[159.819523,68.642835],[159.822344,68.64285],[159.825594,68.642664],[159.828864,68.64236],[159.835127,68.641519],[159.839595,68.640421],[159.842502,68.639472],[159.844554,68.638413],[159.849813,68.635508],[159.853212,68.63367],[159.860223,68.630383],[159.864156,68.628919],[159.866508,68.628089],[159.869169,68.627494],[159.871873,68.627096],[159.875016,68.626804],[159.882401,68.626376],[159.891988,68.625959],[159.906049,68.625651],[159.914967,68.625497],[159.92446,68.625574],[159.933347,68.62585],[159.942288,68.626161],[159.952329,68.627016],[159.964132,68.628241],[159.972633,68.62919],[159.983492,68.631091],[159.991615,68.633038],[159.996404,68.634642],[159.998798,68.635857],[160.000038,68.636823],[160.000764,68.637819],[160.000893,68.638754],[160.000689,68.639645],[160.000492,68.640448],[160.00016,68.641081],[159.999344,68.642262],[159.998119,68.643831],[159.997409,68.644927],[159.997258,68.646],[159.997666,68.646715],[159.99886,68.647849],[160.000432,68.648785],[160.002503,68.649627],[160.004997,68.650188],[160.007068,68.650353],[160.008987,68.650309],[160.011557,68.65005],[160.01399,68.649632],[160.015789,68.649192],[160.019175,68.648102],[160.021639,68.647079],[160.023634,68.645983],[160.024949,68.645212],[160.026157,68.643885],[160.027569,68.641752],[160.028521,68.640821],[160.031983,68.636978],[160.034541,68.634365],[160.039266,68.629871],[160.043573,68.625898],[160.045689,68.624052],[160.047155,68.623055],[160.050254,68.62116],[160.052098,68.620223],[160.053609,68.619766],[160.056693,68.619099],[160.059519,68.61873],[160.062951,68.618476],[160.064598,68.618471],[160.067772,68.618625],[160.071476,68.618934],[160.076947,68.619688],[160.084853,68.621072],[160.089025,68.621628],[160.092335,68.621893],[160.094995,68.62187],[160.096945,68.621744],[160.098653,68.621386],[160.099756,68.620956],[160.100694,68.620372],[160.101676,68.619385],[160.102991,68.617898],[160.105228,68.61577],[160.106453,68.614789],[160.107783,68.614183],[160.109506,68.613698],[160.112529,68.61324],[160.115854,68.613009],[160.118681,68.613042],[160.121553,68.613279],[160.125135,68.61367],[160.128642,68.614343],[160.133887,68.615842],[160.140205,68.617749],[160.145148,68.619363],[160.1513,68.621815],[160.154157,68.623099],[160.155925,68.624256],[160.157905,68.626487],[160.160308,68.629572],[160.161548,68.631285],[160.161896,68.632254],[160.16176,68.633256],[160.161185,68.634809],[160.159946,68.637304],[160.1586,68.638884],[160.156847,68.640541],[160.15467,68.642479],[160.152358,68.644136],[160.149667,68.645517],[160.14548,68.647427],[160.136789,68.651136],[160.131922,68.653293],[160.126208,68.655742],[160.125029,68.656336],[160.123744,68.657166],[160.122792,68.658377],[160.122565,68.659092],[160.122717,68.659647],[160.123215,68.660115],[160.124168,68.660637],[160.125422,68.66122],[160.127342,68.661902],[160.129806,68.662507],[160.132315,68.66303],[160.135066,68.663426],[160.138119,68.663607],[160.140915,68.663629],[160.144014,68.663404],[160.148005,68.662837],[160.150529,68.662276],[160.159462,68.659642],[160.162213,68.658712],[160.164919,68.657673],[160.173761,68.654399],[160.178417,68.652749],[160.183344,68.651103],[160.187153,68.649959],[160.192368,68.648511],[160.198868,68.646833],[160.201897,68.646303],[160.206407,68.64589],[160.210918,68.645664],[160.214701,68.645571],[160.216354,68.645577],[160.218002,68.645678],[160.220042,68.645995],[160.221735,68.646295],[160.226829,68.647269],[160.234039,68.648714],[160.237324,68.649476],[160.239942,68.650312],[160.243234,68.651884],[160.246825,68.653884],[160.250716,68.656133],[160.25202,68.657035],[160.252747,68.657829],[160.253195,68.658894],[160.253452,68.660372],[160.253089,68.66213],[160.252298,68.663678],[160.250951,68.66514],[160.248984,68.666735],[160.246612,68.668321],[160.243747,68.669744],[160.236586,68.672862],[160.230921,68.675466],[160.226988,68.677176],[160.22485,68.678202],[160.223846,68.678886],[160.223418,68.679694],[160.223482,68.680471],[160.223846,68.68135],[160.22485,68.682282],[160.226496,68.683098],[160.228591,68.683704],[160.232653,68.684435],[160.236543,68.684878],[160.240434,68.685173],[160.24379,68.685266],[160.247488,68.685165],[160.25093,68.684924],[160.254478,68.684474],[160.258411,68.683673],[160.262494,68.682624],[160.266064,68.681513],[160.269164,68.680386],[160.27051,68.679826],[160.271697,68.679189],[160.27268,68.678431],[160.274219,68.676951],[160.275309,68.675602],[160.275929,68.674323],[160.276025,68.673079],[160.275405,68.670871],[160.274337,68.668375],[160.272904,68.665389],[160.271729,68.662706],[160.2716,68.660995],[160.272327,68.659672],[160.273599,68.658307],[160.274411,68.657704],[160.277051,68.656136],[160.280621,68.654102],[160.284437,68.652343],[160.289386,68.650374],[160.292389,68.649433],[160.295884,68.648728],[160.298748,68.648347],[160.301303,68.648269],[160.304413,68.648328],[160.308047,68.648561],[160.311446,68.649051],[160.314973,68.649752],[160.319259,68.651032],[160.321984,68.651981],[160.324111,68.653188],[160.326922,68.655374],[160.328098,68.656806],[160.329594,68.658626],[160.33118,68.660198],[160.332869,68.66152],[160.3346,68.662555],[160.338256,68.6639],[160.342616,68.665191],[160.346827,68.666241],[160.351765,68.667042],[160.354373,68.667361],[160.356906,68.667592],[160.361161,68.667911],[160.373068,68.668472],[160.375819,68.668527],[160.379598,68.668406],[160.386067,68.667922],[160.391146,68.667416],[160.394471,68.66702],[160.398915,68.66619],[160.407713,68.66436],[160.410807,68.663598],[160.413044,68.662855],[160.415387,68.661865],[160.418349,68.660325],[160.419695,68.65944],[160.420541,68.658373],[160.421176,68.657129],[160.421327,68.656106],[160.421157,68.655258],[160.420543,68.653933],[160.418301,68.6516],[160.416222,68.649812],[160.413091,68.647477],[160.411744,68.64645],[160.410697,68.645664],[160.407341,68.643321],[160.403493,68.640409],[160.402531,68.63963],[160.401911,68.638688],[160.401505,68.637551],[160.401505,68.636446],[160.402061,68.634608],[160.402659,68.633479],[160.404455,68.631897],[160.406293,68.630784],[160.409051,68.629678],[160.411787,68.628953],[160.415057,68.62847],[160.419033,68.628322],[160.423651,68.628486],[160.427926,68.628883],[160.431196,68.629405],[160.440645,68.631049],[160.451504,68.632832],[160.461936,68.634631],[160.473265,68.636438],[160.478545,68.637014],[160.482564,68.637372],[160.486604,68.637473],[160.492589,68.637559],[160.500734,68.63745],[160.505116,68.637333],[160.510759,68.637061],[160.516253,68.636718],[160.520977,68.636399],[160.524868,68.636305],[160.527839,68.636523],[160.530447,68.637076],[160.533525,68.637933],[160.535577,68.638704],[160.536967,68.639778],[160.538335,68.641398],[160.538976,68.642962],[160.539297,68.644659],[160.539938,68.649477],[160.540408,68.650684],[160.542182,68.652489],[160.544128,68.653781],[160.547997,68.655804],[160.552272,68.657546],[160.556504,68.658744],[160.561314,68.659483],[160.566145,68.659935],[160.569245,68.660152],[160.573841,68.660152],[160.5788,68.659849],[160.582797,68.659437],[160.587222,68.65855],[160.591946,68.657336],[160.595794,68.655959],[160.602656,68.652645],[160.606269,68.650396],[160.608192,68.648886],[160.609325,68.647625],[160.6111,68.645095],[160.614092,68.641172],[160.617042,68.637123],[160.620265,68.632765],[160.622351,68.629482],[160.623198,68.627772],[160.624096,68.626011],[160.624567,68.625268],[160.62564,68.624463],[160.626392,68.62406],[160.62784,68.623565],[160.628725,68.623281],[160.630675,68.622822],[160.632131,68.622523],[160.633655,68.622344],[160.637116,68.62213],[160.641359,68.622169],[160.647195,68.622422],[160.653255,68.62264],[160.655328,68.622644],[160.658214,68.622531],[160.663879,68.622149],[160.667267,68.621881],[160.673252,68.62116],[160.675443,68.620868],[160.681707,68.619983],[160.685212,68.619449],[160.688483,68.618989],[160.69589,68.617856],[160.70047,68.617073],[160.70241,68.616687],[160.71317,68.614306],[160.721181,68.612449],[160.72759,68.611076],[160.732653,68.610139],[160.73947,68.608849],[160.749447,68.607212],[160.754616,68.606611],[160.75847,68.606429],[160.761584,68.606368],[160.764668,68.606462],[160.768008,68.606704],[160.771409,68.607173],[160.774357,68.607829],[160.777622,68.608921],[160.780826,68.610404],[160.783154,68.6116],[160.784605,68.612631],[160.785769,68.613965],[160.787311,68.616274],[160.790031,68.620176],[160.792042,68.622595],[160.793311,68.623845],[160.795427,68.625256],[160.79774,68.626611],[160.801035,68.628032],[160.803907,68.628977],[160.807391,68.6298],[160.81111,68.630497],[160.815402,68.631042],[160.820526,68.631604],[160.825326,68.63197],[160.833503,68.632488],[160.8371,68.632623],[160.84286,68.632789],[160.849614,68.633007],[160.856049,68.633225],[160.86026,68.633513],[160.867571,68.634362],[160.874411,68.635149],[160.882983,68.636216],[160.889973,68.63715],[160.896878,68.638209],[160.905407,68.639509],[160.911606,68.640677],[160.919888,68.642479],[160.932713,68.645818],[160.939383,68.647453],[160.949729,68.649873],[160.95689,68.650955],[160.96279,68.651383],[160.968818,68.651352],[160.973777,68.651079],[160.979485,68.650394],[160.987137,68.649336],[160.991178,68.648573],[160.995688,68.647297],[161.000669,68.645546],[161.007103,68.642533],[161.013302,68.639271],[161.020313,68.635362],[161.024631,68.633041],[161.027453,68.631741],[161.031344,68.630635],[161.037094,68.629785],[161.041904,68.629505],[161.046606,68.629482],[161.051053,68.629809],[161.054045,68.630307],[161.056952,68.63111],[161.061591,68.633158],[161.065311,68.635346],[161.066593,68.636546],[161.067363,68.637838],[161.068154,68.639629],[161.068367,68.640953],[161.067854,68.642463],[161.067085,68.644199],[161.065738,68.645787],[161.063023,68.647818],[161.059945,68.649702],[161.056739,68.651313],[161.053835,68.652488],[161.051232,68.653452],[161.048964,68.65432],[161.045518,68.655783],[161.042654,68.657176],[161.040495,68.658732],[161.038629,68.66032],[161.03745,68.662014],[161.03736,68.663301],[161.038055,68.664687],[161.039687,68.666271],[161.04132,68.667469],[161.044101,68.668701],[161.046822,68.669581],[161.049784,68.670339],[161.052248,68.670697],[161.055695,68.670928],[161.058748,68.67106],[161.064341,68.671071],[161.069057,68.670917],[161.074286,68.670548],[161.081345,68.669746],[161.088359,68.668838],[161.099318,68.667165],[161.101827,68.666671],[161.108599,68.664944],[161.122444,68.660984],[161.135141,68.657453],[161.143001,68.655186],[161.15068,68.653293],[161.157752,68.651955],[161.16596,68.650865],[161.173741,68.649854],[161.181404,68.649204],[161.190686,68.648427],[161.197745,68.648078],[161.207681,68.648015],[161.212169,68.648126],[161.218793,68.64849],[161.224588,68.649665],[161.231168,68.651267],[161.235613,68.652647],[161.239056,68.654233],[161.240929,68.655565],[161.242542,68.656898],[161.243326,68.657707],[161.244372,68.658785],[161.245984,68.661179],[161.246507,68.662749],[161.24642,68.664683],[161.245853,68.666015],[161.244633,68.667505],[161.242716,68.669138],[161.239884,68.671135],[161.238533,68.672562],[161.237661,68.674321],[161.236397,68.676333],[161.235482,68.67787],[161.234567,68.679423],[161.23387,68.681942],[161.233609,68.684825],[161.232911,68.68907],[161.233042,68.692031],[161.233521,68.695578],[161.234001,68.697351],[161.235526,68.699266],[161.237923,68.701356],[161.241104,68.703144],[161.245548,68.705439],[161.251257,68.708288],[161.254569,68.710012],[161.257837,68.71237],[161.262107,68.715881],[161.26616,68.719203],[161.270779,68.723504],[161.272348,68.724959],[161.276183,68.728516],[161.279806,68.732199],[161.284813,68.73784],[161.289018,68.742464],[161.291013,68.744117],[161.293799,68.746008],[161.29621,68.747721],[161.298973,68.74901],[161.30133,68.749869],[161.30363,68.750316],[161.304488,68.750449],[161.305668,68.750441],[161.308685,68.750354],[161.312673,68.750083],[161.314321,68.749965],[161.31745,68.749769],[161.319083,68.749691],[161.319863,68.7497],[161.319934,68.750488],[161.320006,68.750734],[161.320119,68.750945],[161.32035,68.751186],[161.321031,68.751737],[161.321165,68.751803],[161.321353,68.751863],[161.32153,68.751889],[161.321838,68.751908],[161.32239,68.751923],[161.323041,68.751934],[161.32579,68.751969],[161.328567,68.752001],[161.329931,68.752022],[161.331446,68.752036],[161.331558,68.752039],[161.332766,68.75207],[161.334084,68.751933],[161.335276,68.751865],[161.335976,68.751826],[161.336349,68.751805],[161.337075,68.751767],[161.337817,68.751728],[161.33843,68.751698],[161.340539,68.751729],[161.341398,68.751716],[161.342034,68.751659],[161.342369,68.751596],[161.342752,68.751459],[161.343546,68.75185],[161.346902,68.753867],[161.348293,68.754462],[161.351349,68.755433],[161.359623,68.75782],[161.360232,68.757999],[161.367011,68.759986],[161.368477,68.760353],[161.369647,68.760497],[161.371528,68.760488],[161.380874,68.760217],[161.381952,68.760355],[161.384429,68.760866],[161.392851,68.76276],[161.396761,68.763767],[161.398957,68.76444],[161.399873,68.765194],[161.402003,68.767376],[161.402844,68.767857],[161.405773,68.768571],[161.411425,68.769867],[161.412222,68.770387],[161.413485,68.771776],[161.414016,68.771932],[161.416734,68.772056],[161.425272,68.772176],[161.425772,68.772304],[161.428467,68.772194],[161.428954,68.772208],[161.429359,68.772246],[161.430057,68.77234],[161.430908,68.772568],[161.432624,68.773154],[161.433298,68.773424],[161.43904,68.775078],[161.445512,68.777018],[161.448374,68.777983],[161.450239,68.778321],[161.451786,68.778465],[161.453545,68.778465],[161.456437,68.778415],[161.458867,68.778636],[161.464746,68.779234],[161.472476,68.779896],[161.474815,68.780144],[161.478522,68.780779],[161.480443,68.781032],[161.483543,68.78116],[161.485009,68.781268],[161.485973,68.781519],[161.486596,68.781845],[161.48769,68.782505],[161.49038,68.783547],[161.49152,68.784],[161.492799,68.784299],[161.495747,68.784515],[161.49888,68.785196],[161.500546,68.785415],[161.501798,68.785382],[161.51021,68.784971],[161.512873,68.78502],[161.517956,68.785623],[161.521604,68.786221],[161.524439,68.786778],[161.526754,68.787277],[161.53318,68.788921],[161.533996,68.788996],[161.534704,68.788993],[161.537686,68.788775],[161.538673,68.788789],[161.539671,68.788903],[161.542876,68.789501],[161.544016,68.789625],[161.545818,68.789623],[161.548137,68.789498],[161.550268,68.789043],[161.557531,68.7867],[161.559388,68.786377],[161.560855,68.786246],[161.562529,68.786347],[161.564065,68.786648],[161.56961,68.788047],[161.575318,68.78946],[161.577485,68.789833],[161.579371,68.78974],[161.585922,68.789685],[161.588815,68.789716],[161.590596,68.789879],[161.593385,68.790415],[161.595059,68.790656],[161.597441,68.790687],[161.601462,68.79071],[161.605294,68.79092],[161.609907,68.791013],[161.613341,68.790997],[161.619008,68.790279],[161.626801,68.789022],[161.635067,68.787597],[161.638942,68.786639],[161.641643,68.78578],[161.64424,68.784798],[161.647779,68.783612],[161.648563,68.783466],[161.649695,68.783363],[161.651659,68.78339],[161.653386,68.78355],[161.654974,68.783519],[161.657431,68.783236],[161.660767,68.782606],[161.663364,68.782012],[161.667768,68.781377],[161.668476,68.781284],[161.670391,68.781201],[161.67243,68.781228],[161.67464,68.781441],[161.675864,68.781719],[161.679045,68.782943],[161.681262,68.784076],[161.684143,68.785345],[161.686246,68.786025],[161.690994,68.786988],[161.695168,68.788083],[161.696734,68.788159],[161.699423,68.788094],[161.703726,68.787573],[161.711737,68.787174],[161.716849,68.787356],[161.722615,68.78763],[161.724418,68.787513],[161.72705,68.787366],[161.728246,68.787146],[161.735164,68.785459],[161.739495,68.784486],[161.741698,68.784136],[161.744739,68.783778],[161.746252,68.783797],[161.747961,68.784089],[161.755279,68.785808],[161.756792,68.786091],[161.758548,68.786109],[161.764738,68.785868],[161.76724,68.785939],[161.783482,68.787545],[161.786117,68.787696],[161.790445,68.787677],[161.797022,68.787413],[161.800088,68.787121],[161.806336,68.78595],[161.812963,68.784531],[161.81672,68.783297],[161.820145,68.782145],[161.823321,68.781427],[161.826857,68.780964],[161.830391,68.780587],[161.832348,68.780587],[161.836313,68.780955],[161.839559,68.781064],[161.843173,68.781302],[161.850422,68.781395],[161.851717,68.781359],[161.852233,68.781344],[161.85635,68.780823],[161.861039,68.780186],[161.864777,68.779397],[161.869004,68.778368],[161.873533,68.777795],[161.88231,68.776979],[161.887867,68.776318],[161.89313,68.775798],[161.898537,68.775166],[161.905164,68.774316],[161.907982,68.774146],[161.910645,68.774089],[161.913748,68.774344],[161.917583,68.774694],[161.920186,68.775187],[161.924966,68.77595],[161.927514,68.776158],[161.928242,68.776207],[161.930497,68.776356],[161.932271,68.776195],[161.934366,68.775863],[161.938599,68.774521],[161.940907,68.773881],[161.941664,68.773513],[161.942655,68.772852],[161.944081,68.772014],[161.948656,68.769748],[161.950234,68.769073],[161.951904,68.768563],[161.957709,68.767604],[161.959483,68.767202],[161.961398,68.766829],[161.964874,68.766445],[161.967492,68.766347],[161.97078,68.766366],[161.974354,68.766045],[161.976859,68.76612],[161.979024,68.766432],[161.983743,68.766803],[161.987334,68.767148],[161.990177,68.767493],[161.99342,68.768057],[161.9958,68.768839],[161.997339,68.769481],[161.99773,68.769982],[161.999866,68.771036],[162.000913,68.772382],[162.002113,68.773402],[162.004383,68.774054],[162.006966,68.774639],[162.010503,68.774764],[162.014897,68.774573],[162.019307,68.774483],[162.02202,68.774257],[162.029377,68.773425],[162.033185,68.773342],[162.053223,68.772764],[162.066203,68.772676],[162.068564,68.772632],[162.07086,68.77284],[162.073364,68.773614],[162.074721,68.773803],[162.07688,68.773581],[162.078635,68.773029],[162.080723,68.772039],[162.082131,68.771801],[162.085162,68.771649],[162.087401,68.771971],[162.089915,68.772849],[162.096584,68.774068],[162.098534,68.774079],[162.100602,68.773747],[162.102585,68.773539],[162.105136,68.773207],[162.10749,68.772613],[162.10869,68.772027],[162.110099,68.772065],[162.111038,68.772311],[162.113968,68.772513],[162.116308,68.77233],[162.119387,68.77216],[162.123384,68.772487],[162.128048,68.772896],[162.131974,68.772411],[162.134727,68.77148],[162.13536,68.770613],[162.135301,68.768948],[162.135354,68.767965],[162.135197,68.767209],[162.132118,68.765433],[162.131959,68.764936],[162.131366,68.763726],[162.12977,68.762692],[162.127057,68.760594],[162.126196,68.759254],[162.128203,68.758793],[162.131504,68.758291],[162.134571,68.757267],[162.138923,68.756116],[162.143389,68.755339],[162.147309,68.754904],[162.151216,68.754904],[162.154921,68.754979],[162.156486,68.754866],[162.157716,68.754436],[162.15993,68.753486],[162.16151,68.75231],[162.162743,68.748466],[162.171869,68.747662],[162.176803,68.746499],[162.193575,68.744353],[162.21824,68.739524],[162.235259,68.734068],[162.249811,68.729147],[162.253018,68.726373],[162.279163,68.720913],[162.291249,68.721719],[162.366724,68.712318],[162.399035,68.708468],[162.417534,68.704885],[162.423454,68.705422],[162.427647,68.703989],[162.43406,68.704885],[162.447379,68.702466],[162.451572,68.700316],[162.466125,68.698255],[162.471551,68.694671],[162.474757,68.691444],[162.477224,68.686424],[162.483637,68.684811],[162.494243,68.678265],[162.505835,68.672076],[162.519648,68.668487],[162.522854,68.663283],[162.536667,68.659333],[162.544313,68.660231],[162.554179,68.655653],[162.567991,68.653409],[162.583531,68.649637],[162.590437,68.642901],[162.605482,68.638859],[162.624228,68.631581],[162.637794,68.62421],[162.658266,68.614948],[162.663939,68.616387],[162.681944,68.621423],[162.703403,68.626278],[162.716722,68.6243],[162.724237,68.624052],[162.732015,68.62385],[162.756186,68.620344],[162.772712,68.619894],[162.786771,68.622232],[162.80231,68.625828],[162.822782,68.630862],[162.834427,68.633519],[162.835386,68.633786],[162.836062,68.634017],[162.837059,68.634505],[162.83869,68.635435],[162.839887,68.635999],[162.842402,68.636772],[162.844645,68.637284],[162.848786,68.638355],[162.853593,68.639207],[162.85801,68.640019],[162.862422,68.64084],[162.865266,68.641278],[162.869986,68.642036],[162.87402,68.642509],[162.878139,68.642769],[162.886294,68.643618],[162.888515,68.64372],[162.893107,68.643829],[162.896798,68.643931],[162.899115,68.64388],[162.904351,68.643872],[162.906087,68.643972],[162.909157,68.644329],[162.911282,68.644486],[162.91317,68.644439],[162.916442,68.644158],[162.917551,68.643968],[162.918899,68.643521],[162.920347,68.643161],[162.923512,68.642657],[162.93098,68.641282],[162.933347,68.640613],[162.935239,68.639992],[162.93599,68.639262],[162.93621,68.638468],[162.936108,68.637663],[162.936248,68.637229],[162.936687,68.636776],[162.939105,68.635308],[162.941344,68.634404],[162.942974,68.633919],[162.944692,68.633796],[162.947438,68.633692],[162.949315,68.633567],[162.95012,68.633379],[162.950912,68.632827],[162.952845,68.631667],[162.953124,68.631269],[162.952952,68.630291],[162.953357,68.629334],[162.95918,68.623131],[162.97324,68.61297],[162.987522,68.603386],[163.001126,68.593076],[163.012986,68.589129],[163.022404,68.589002],[163.028682,68.589511],[163.040891,68.580341],[163.037752,68.575118],[163.029729,68.570658],[163.021706,68.56403],[163.023101,68.558675],[163.028333,68.552171],[163.02057,68.544585],[163.018738,68.542941],[163.018248,68.541986],[163.018901,68.540812],[163.021404,68.539458],[163.023604,68.538229],[163.025092,68.535436],[163.024342,68.532719],[163.024808,68.530922],[163.028113,68.526054],[163.029513,68.523687],[163.029642,68.521668],[163.033454,68.517906],[163.034685,68.517063],[163.037182,68.516147],[163.039794,68.51519],[163.043237,68.514484],[163.04703,68.513616],[163.050462,68.513284],[163.056442,68.513317],[163.059924,68.512998],[163.064621,68.512245],[163.068093,68.512021],[163.076559,68.511782],[163.075025,68.510803],[163.073823,68.510253],[163.072997,68.509648],[163.072858,68.50903],[163.072472,68.508496],[163.071871,68.507875],[163.070906,68.507117],[163.070605,68.506766],[163.070261,68.505988],[163.070068,68.504879],[163.069028,68.503287],[163.068792,68.502929],[163.068813,68.50162],[163.068952,68.500728],[163.068727,68.500425],[163.068159,68.499918],[163.06729,68.499155],[163.067,68.498663],[163.067225,68.498223],[163.067129,68.497865],[163.066667,68.497362],[163.066785,68.496992],[163.067622,68.496194],[163.068319,68.494947],[163.068706,68.494416],[163.069156,68.494042],[163.070444,68.493397],[163.071088,68.492933],[163.071474,68.492516],[163.071731,68.49195],[163.07245,68.491206],[163.072482,68.490954],[163.072557,68.490553],[163.072869,68.490278],[163.073534,68.489924],[163.073512,68.489676],[163.073331,68.489063],[163.079985,68.488991],[163.083807,68.488931],[163.086601,68.48881],[163.089231,68.488685],[163.09282,68.488428],[163.118435,68.486822],[163.139122,68.48549],[163.167637,68.483728],[163.20106,68.481596],[163.213458,68.4808],[163.217049,68.4804],[163.219734,68.479877],[163.221706,68.479395],[163.242581,68.472965],[163.244718,68.472362],[163.247047,68.471859],[163.250033,68.471347],[163.263621,68.469527],[163.288414,68.466189],[163.292715,68.465787],[163.296523,68.465626],[163.300085,68.465575],[163.303564,68.465706],[163.307865,68.465968],[163.312029,68.46639],[163.352,68.470563],[163.389477,68.474423],[163.400764,68.475549],[163.405147,68.47576],[163.417003,68.476349],[163.425921,68.476791],[163.443309,68.477529],[163.494101,68.479931],[163.526729,68.481408],[163.532317,68.481538],[163.537167,68.481368],[163.548508,68.480584],[163.597681,68.477351],[163.614251,68.476316],[163.67261,68.472433],[163.690665,68.471267],[163.696631,68.470584],[163.750639,68.4641],[163.760635,68.462535],[163.788453,68.457642],[163.799921,68.455636],[163.802594,68.454797],[163.805306,68.453431],[163.807359,68.451795],[163.81391,68.446443],[163.81497,68.445609],[163.819014,68.442489],[163.826857,68.436083],[163.828126,68.43494],[163.830605,68.433018],[163.831061,68.432689],[163.832139,68.431821],[163.834291,68.430109],[163.83584,68.428883],[163.836799,68.428199],[163.838055,68.427546],[163.839071,68.42715],[163.84026,68.426811],[163.841782,68.426457],[163.843484,68.426125],[163.844672,68.425965],[163.845988,68.425837],[163.847055,68.42575],[163.848215,68.42573],[163.84936,68.425718],[163.850569,68.425748],[163.852607,68.425866],[163.862743,68.426943],[163.883513,68.429214],[163.898457,68.430821],[163.904128,68.431425],[163.91158,68.431848],[163.916908,68.431883],[163.921696,68.431776],[163.92279,68.431717],[163.924863,68.431606],[163.929321,68.431221],[163.936604,68.430234],[163.982265,68.422141],[164.002322,68.418591],[164.01514,68.416313],[164.037018,68.412404],[164.040423,68.41195],[164.042082,68.411813],[164.044757,68.411825],[164.048313,68.41205],[164.050964,68.412253],[164.066395,68.413345],[164.077265,68.414143],[164.08038,68.414479],[164.08275,68.41494],[164.084477,68.415426],[164.086238,68.416273],[164.089184,68.418091],[164.091859,68.420059],[164.094873,68.422301],[164.097446,68.423534],[164.099309,68.424318],[164.101374,68.424866],[164.104693,68.425638],[164.116545,68.427792],[164.133069,68.430742],[164.136828,68.431253],[164.139435,68.431452],[164.143058,68.431539],[164.145835,68.43144],[164.164391,68.429971],[164.17543,68.429049],[164.179121,68.429],[164.182067,68.428987],[164.184438,68.429049],[164.186706,68.429286],[164.189178,68.429635],[164.198793,68.431222],[164.199694,68.431377],[164.202671,68.431889],[164.213153,68.433742],[164.236788,68.437912],[164.241291,68.438712],[164.242951,68.439007],[164.244136,68.439218],[164.24654,68.43938],[164.249893,68.439529],[164.255818,68.439567],[164.276813,68.439268],[164.288529,68.439156],[164.291543,68.439106],[164.293947,68.439032],[164.296487,68.438795],[164.311758,68.436978],[164.331127,68.434526],[164.333396,68.434203],[164.335529,68.433767],[164.339627,68.432423],[164.342625,68.431482],[164.366005,68.424144],[164.379544,68.419937],[164.388978,68.416933],[164.393407,68.415718],[164.395323,68.415286],[164.398148,68.414881],[164.400543,68.414635],[164.405369,68.414295],[164.416939,68.413898],[164.425387,68.413608],[164.457184,68.412515],[164.471167,68.412092],[164.496356,68.411176],[164.537157,68.409714],[164.544214,68.409515],[164.555929,68.409097],[164.55985,68.408943],[164.560883,68.408902],[164.572498,68.408445],[164.575707,68.408233],[164.578245,68.407934],[164.581262,68.407405],[164.585141,68.406612],[164.610569,68.401395],[164.632789,68.396882],[164.652184,68.392914],[164.655249,68.392227],[164.657308,68.391609],[164.659511,68.390781],[164.662451,68.389685],[164.675553,68.383284],[164.692601,68.375256],[164.695283,68.374003],[164.696911,68.37335],[164.703472,68.371373],[164.707872,68.370297],[164.720334,68.366732],[164.723872,68.3656],[164.736562,68.361945],[164.739771,68.360939],[164.741495,68.360179],[164.74369,68.359102],[164.749861,68.355116],[164.751758,68.353755],[164.755866,68.350977],[164.756567,68.350502],[164.759261,68.34868],[164.772047,68.340321],[164.7754,68.338253],[164.777315,68.337458],[164.779374,68.336733],[164.781673,68.336167],[164.784833,68.335531],[164.786988,68.335177],[164.788569,68.335036],[164.792639,68.334806],[164.815961,68.333727],[164.837893,68.332667],[164.855899,68.331782],[164.866147,68.331305],[164.87017,68.331181],[164.875437,68.331093],[164.905415,68.33127],[164.910243,68.331292],[164.914753,68.331358],[164.917962,68.331447],[164.930269,68.33203],[164.960822,68.333533],[164.990656,68.334965],[164.995971,68.335142],[164.999036,68.335018],[165.001718,68.334841],[165.004639,68.334417],[165.009715,68.333374],[165.013546,68.332366],[165.025327,68.32913],[165.03074,68.327568],[165.033203,68.326888],[165.054586,68.320994],[165.065217,68.318146],[165.067899,68.317668],[165.070231,68.317337],[165.075351,68.31677],[165.079105,68.316376],[165.081834,68.316164],[165.085713,68.316093],[165.096499,68.316064],[165.101323,68.316061],[165.104699,68.31607],[165.108831,68.316051],[165.111718,68.316043],[165.116119,68.316041],[165.119537,68.316037],[165.12294,68.316038],[165.125097,68.316034],[165.127259,68.316029],[165.129041,68.316027],[165.130912,68.316024],[165.132685,68.316021],[165.134739,68.316014],[165.136022,68.316011],[165.1375,68.316012],[165.139371,68.316011],[165.1414,68.316015],[165.142039,68.316015],[165.143191,68.316016],[165.144183,68.316016],[165.149592,68.316017],[165.153157,68.316005],[165.155418,68.316064],[165.157869,68.316311],[165.161626,68.316734],[165.168567,68.317722],[165.174871,68.318616],[165.184932,68.320051],[165.191872,68.321004],[165.197125,68.321651],[165.202442,68.322098],[165.205339,68.32225],[165.208587,68.32238],[165.211707,68.32238],[165.213904,68.322321],[165.216897,68.322156],[165.221354,68.32178],[165.225945,68.321292],[165.228197,68.321009],[165.231258,68.320593],[165.23477,68.319995],[165.237472,68.319296],[165.248795,68.316674],[165.273199,68.310867],[165.304356,68.303428],[165.333533,68.296502],[165.361584,68.289741],[165.382655,68.284677],[165.38596,68.283889],[165.398369,68.280929],[165.407059,68.278896],[165.432409,68.272796],[165.456632,68.266912],[165.472751,68.263093],[165.480676,68.261226],[165.483017,68.260642],[165.485583,68.259742],[165.48797,68.258674],[165.491617,68.256973],[165.499947,68.253003],[165.501818,68.25207],[165.502423,68.251768],[165.508366,68.247964],[165.522234,68.238986],[165.533671,68.231807],[165.545872,68.224074],[165.558216,68.216007],[165.563125,68.212885],[165.566596,68.210663],[165.567116,68.21033],[165.567617,68.210009],[165.568867,68.20923],[165.570318,68.208445],[165.5718,68.207774],[165.573668,68.207121],[165.57589,68.206474],[165.57782,68.206049],[165.579379,68.205763],[165.580691,68.205562],[165.581987,68.205402],[165.583963,68.205196],[165.586217,68.204966],[165.591465,68.204582],[165.594537,68.204359],[165.597824,68.204026],[165.603983,68.203258],[165.610281,68.202404],[165.613588,68.201942],[165.615384,68.20167],[165.617,68.201383],[165.617824,68.201223],[165.618702,68.20102],[165.620945,68.200438],[165.626468,68.199107],[165.627775,68.19875],[165.629534,68.198234],[165.631078,68.197761],[165.633362,68.19699],[165.635855,68.19605],[165.63736,68.19545],[165.638657,68.194917],[165.64037,68.194166],[165.643573,68.192758],[165.646189,68.191589],[165.648265,68.190651],[165.650697,68.189584],[165.654596,68.187809],[165.656422,68.187022],[165.657542,68.186519],[165.661448,68.184792],[165.665078,68.18316],[165.667367,68.182136],[165.672305,68.179962],[165.675735,68.178431],[165.678943,68.177018],[165.682653,68.175375],[165.685769,68.174016],[165.686641,68.173676],[165.68777,68.173268],[165.688919,68.172864],[165.6901,68.172486],[165.693158,68.17156],[165.695685,68.170812],[165.699598,68.169695],[165.703401,68.168527],[165.704199,68.168319],[165.704353,68.168276],[165.707658,68.167305],[165.709503,68.166766],[165.710871,68.16639],[165.71163,68.166162],[165.712044,68.166037],[165.715629,68.164951],[165.720663,68.16343],[165.72579,68.161913],[165.731768,68.160146],[165.737745,68.158436],[165.741075,68.157461],[165.743669,68.156708],[165.744495,68.156502],[165.748133,68.155712],[165.75178,68.154986],[165.752723,68.154855],[165.753739,68.154753],[165.755019,68.154662],[165.756597,68.154618],[165.75864,68.15454],[165.759428,68.15451],[165.761115,68.154463],[165.763056,68.154453],[165.7684,68.154443],[165.772154,68.154444],[165.774208,68.154476],[165.776284,68.154504],[165.778354,68.154499],[165.780107,68.154503],[165.782649,68.154508],[165.784383,68.154506],[165.785289,68.154504],[165.787884,68.154507],[165.792778,68.154468],[165.796437,68.154459],[165.798254,68.154443],[165.798962,68.154395],[165.800028,68.154255],[165.801163,68.154109],[165.802664,68.153897],[165.807135,68.15324],[165.813539,68.152312],[165.828529,68.150254],[165.837263,68.149282],[165.847871,68.148082],[165.854866,68.147294],[165.859868,68.146733],[165.864549,68.1462],[165.86622,68.145988],[165.866642,68.145963],[165.866973,68.145976],[165.867907,68.146077],[165.868943,68.14622],[165.869494,68.146312],[165.870033,68.146396],[165.872558,68.146733],[165.874739,68.147081],[165.878293,68.147666],[165.880117,68.147957],[165.880649,68.148058],[165.880994,68.148195],[165.881334,68.148369],[165.881544,68.148556],[165.881746,68.148796],[165.882274,68.149647],[165.882889,68.15064],[165.883043,68.150888],[165.88362,68.15182],[165.899405,68.177294],[165.90175,68.181105],[165.90392,68.184418],[165.904057,68.184627],[165.904509,68.185058],[165.905052,68.185466],[165.905801,68.186054],[165.910963,68.189704],[165.91583,68.19312],[165.924544,68.199235],[165.931371,68.203973],[165.935124,68.206677],[165.936754,68.207768],[165.938198,68.20869],[165.939618,68.209404],[165.940544,68.209813],[165.94105,68.210023],[165.941964,68.21028],[165.94694,68.211325],[165.953385,68.212695],[165.959904,68.214042],[165.979461,68.218093],[165.989273,68.22014],[165.999068,68.222148],[166.018513,68.226215],[166.01924,68.226422],[166.019633,68.22665],[166.019707,68.22686],[166.019891,68.227708],[166.019925,68.228708],[166.020068,68.22906],[166.020566,68.22937],[166.021184,68.229575],[166.021928,68.229765],[166.023015,68.230001],[166.023747,68.230111],[166.024661,68.230168],[166.025237,68.230173],[166.025816,68.230139],[166.026382,68.230067],[166.027146,68.229862],[166.027734,68.22959],[166.039638,68.223182],[166.040872,68.222561],[166.041945,68.222109],[166.042573,68.221873],[166.043528,68.221628],[166.044901,68.221343],[166.046372,68.221151],[166.05934,68.22025],[166.068825,68.218973],[166.073379,68.219101],[166.075903,68.218977],[166.078415,68.217995],[166.079507,68.217742],[166.080224,68.21769],[166.087134,68.218169],[166.092709,68.219087],[166.097294,68.219257],[166.101849,68.219619],[166.107554,68.219622],[166.11244,68.219895],[166.115895,68.219788],[166.12214,68.218472],[166.131587,68.215632],[166.138123,68.213243],[166.139091,68.212928],[166.139565,68.212829],[166.140101,68.212741],[166.140811,68.212711],[166.141355,68.212765],[166.141866,68.212869],[166.142347,68.213027],[166.143071,68.213287],[166.143974,68.213566],[166.144397,68.213711],[166.144632,68.21389],[166.144775,68.214102],[166.145045,68.214507],[166.145279,68.214752],[166.14549,68.214987],[166.145604,68.215255],[166.145572,68.215508],[166.145365,68.215803],[166.144939,68.216309],[166.14491,68.216381],[166.144974,68.216468],[166.145121,68.216507],[166.145287,68.216511],[166.145452,68.216507],[166.145563,68.216475],[166.145718,68.21639],[166.146111,68.216049],[166.146372,68.215819],[166.147233,68.215264],[166.148291,68.213848],[166.148691,68.21351],[166.14886,68.21335],[166.148928,68.213195],[166.148893,68.213028],[166.148806,68.212875],[166.148604,68.212722],[166.147947,68.212465],[166.147556,68.212306],[166.147242,68.212118],[166.147165,68.211919],[166.147308,68.211674],[166.147732,68.211092],[166.147968,68.210657],[166.148185,68.210365],[166.148467,68.21021],[166.148852,68.21007],[166.149374,68.209939],[166.149964,68.209853],[166.150743,68.209817],[166.151566,68.209814],[166.152393,68.209829],[166.154019,68.209887],[166.155159,68.209999],[166.156168,68.210124],[166.157099,68.210217],[166.157527,68.210274],[166.157973,68.210397],[166.158329,68.210624],[166.159136,68.211273],[166.159358,68.211376],[166.159661,68.211458],[166.159963,68.211528],[166.160398,68.211565],[166.161239,68.211591],[166.162097,68.21159],[166.162668,68.211606],[166.163012,68.211645],[166.163414,68.211735],[166.163711,68.211864],[166.163962,68.21199],[166.164957,68.21256],[166.16549,68.21288],[166.165907,68.2132],[166.166857,68.214011],[166.167275,68.214371],[166.16752,68.214534],[166.167761,68.214672],[166.16805,68.214773],[166.168332,68.21481],[166.168671,68.214812],[166.169105,68.214745],[166.169348,68.214625],[166.169436,68.214463],[166.169398,68.214203],[166.169237,68.213705],[166.169165,68.213435],[166.169068,68.213038],[166.168733,68.212421],[166.168593,68.212051],[166.168543,68.211695],[166.168588,68.211394],[166.168787,68.210986],[166.169093,68.210587],[166.16942,68.210125],[166.169514,68.209779],[166.169616,68.209455],[166.169825,68.209082],[166.170402,68.208469],[166.170716,68.208109],[166.170989,68.207707],[166.171209,68.207417],[166.171683,68.207134],[166.174181,68.205975],[166.17625,68.205145],[166.178624,68.204568],[166.183889,68.203616],[166.190241,68.202533],[166.194704,68.200684],[166.201399,68.197178],[166.207369,68.193309],[166.208446,68.192848],[166.210034,68.192398],[166.210616,68.192267],[166.211203,68.192214],[166.211729,68.192211],[166.213853,68.192198],[166.214191,68.192198],[166.215631,68.192144],[166.217598,68.191925],[166.218992,68.19164],[166.219594,68.191464],[166.220398,68.191158],[166.22426,68.189065],[166.226781,68.18758],[166.227174,68.18651],[166.226923,68.181716],[166.226569,68.178874],[166.226124,68.176188],[166.226025,68.175627],[166.225893,68.174817],[166.225886,68.17448],[166.225766,68.174202],[166.225443,68.173908],[166.224507,68.173345],[166.223377,68.172795],[166.222321,68.17209],[166.221822,68.171498],[166.221289,68.170682],[166.220912,68.170319],[166.220421,68.170067],[166.219848,68.169806],[166.219575,68.169694],[166.219301,68.169439],[166.219124,68.16914],[166.219083,68.168909],[166.218738,68.167807],[166.218565,68.167523],[166.218386,68.167296],[166.218256,68.167173],[166.21802,68.166992],[166.217632,68.166727],[166.217398,68.166556],[166.217251,68.16641],[166.217166,68.166255],[166.217138,68.166081],[166.217134,68.165923],[166.217236,68.164348],[166.216966,68.162197],[166.2169,68.159919],[166.21731,68.157675],[166.217467,68.157203],[166.217805,68.156756],[166.2188,68.155803],[166.220233,68.154682],[166.220815,68.154013],[166.22123,68.153215],[166.221612,68.151455],[166.221995,68.150383],[166.222594,68.149587],[166.223468,68.148724],[166.225425,68.147151],[166.226703,68.146325],[166.22937,68.144908],[166.231728,68.143689],[166.238861,68.140014],[166.24226,68.138463],[166.248907,68.135696],[166.252685,68.134138],[166.255625,68.133153],[166.259513,68.131843],[166.264822,68.130056],[166.267581,68.129145],[166.269077,68.128529],[166.269734,68.128143],[166.271012,68.127276],[166.2718,68.126671],[166.275648,68.124164],[166.279496,68.121995],[166.283559,68.119774],[166.287406,68.117605],[166.289519,68.116638],[166.321867,68.103724],[166.336334,68.101196],[166.338054,68.100788],[166.350347,68.095923],[166.35737,68.093961],[166.37214,68.090352],[166.403899,68.07998],[166.41146,68.077534],[166.430661,68.071229],[166.433966,68.070139],[166.43626,68.069174],[166.437712,68.068043],[166.438207,68.066371],[166.438245,68.066243],[166.438416,68.065665],[166.43871,68.064672],[166.439307,68.063182],[166.448804,68.063664],[166.451282,68.063756],[166.451147,68.06407],[166.450628,68.064489],[166.450387,68.064988],[166.44995,68.065424],[166.449475,68.065772],[166.449489,68.065933],[166.450086,68.066246],[166.450239,68.066379],[166.451159,68.06717],[166.451796,68.067709],[166.452645,68.068084],[166.45323,68.068258],[166.453684,68.068364],[166.454179,68.068418],[166.454727,68.068463],[166.455359,68.068431],[166.458028,68.067708],[166.458659,68.067565],[166.459109,68.067604],[166.46063,68.067796],[166.461351,68.068217],[166.461827,68.068517],[166.462215,68.068752],[166.464748,68.07028],[166.466214,68.071216],[166.466647,68.071582],[166.466883,68.072005],[166.467022,68.072299],[166.467334,68.072857],[166.467472,68.072982],[166.467812,68.073105],[166.469338,68.073417],[166.469865,68.073473],[166.4703,68.073417],[166.471973,68.072878],[166.474084,68.072238],[166.475151,68.072105],[166.478893,68.072465],[166.480001,68.072379],[166.480775,68.072355],[166.482657,68.072582],[166.482991,68.072777],[166.482908,68.073261],[166.484434,68.074518],[166.4855,68.074963],[166.488093,68.075525],[166.488741,68.075915],[166.489034,68.076579],[166.490937,68.079171],[166.493048,68.079881],[166.494324,68.080568],[166.496017,68.08159],[166.496874,68.082917],[166.497115,68.083399],[166.498035,68.083891],[166.498621,68.08446],[166.499457,68.084749],[166.501862,68.086021],[166.503565,68.086775],[166.504053,68.087167],[166.504289,68.087443],[166.506876,68.089043],[166.507076,68.089266],[166.507364,68.090353],[166.507911,68.090869],[166.509493,68.091702],[166.511659,68.092482],[166.512162,68.093048],[166.512539,68.093663],[166.513485,68.093974],[166.515,68.094297],[166.516545,68.095119],[166.517617,68.096057],[166.51849,68.097206],[166.519643,68.099773],[166.521447,68.100865],[166.522274,68.101593],[166.522422,68.102971],[166.522082,68.105182],[166.522881,68.107431],[166.522585,68.109537],[166.522851,68.111477],[166.522703,68.113153],[166.523709,68.11453],[166.52495,68.115489],[166.527907,68.117705],[166.530716,68.119027],[166.531189,68.11938],[166.531012,68.120316],[166.531426,68.12155],[166.531899,68.122487],[166.533318,68.123071],[166.536364,68.123611],[166.539824,68.123886],[166.541332,68.124283],[166.542485,68.124944],[166.546181,68.126442],[166.551621,68.128182],[166.554105,68.12848],[166.565194,68.129339],[166.570664,68.130231],[166.57507,68.131057],[166.578322,68.132324],[166.580747,68.133623],[166.581131,68.134615],[166.581072,68.135363],[166.581782,68.135826],[166.583704,68.136949],[166.584177,68.137643],[166.584029,68.138237],[166.582876,68.138953],[166.580747,68.140527],[166.580806,68.141001],[166.581723,68.141309],[166.583083,68.141287],[166.584443,68.140847],[166.585626,68.140406],[166.587725,68.139922],[166.589529,68.139779],[166.590623,68.139966],[166.591835,68.140737],[166.593195,68.141265],[166.594585,68.141672],[166.598666,68.144127],[166.599286,68.145382],[166.599109,68.146252],[166.599198,68.146747],[166.5997,68.147044],[166.600528,68.147044],[166.601238,68.14689],[166.60384,68.145712],[166.605052,68.14558],[166.609665,68.145778],[166.613775,68.146857],[166.61824,68.148046],[166.621138,68.149476],[166.623296,68.150489],[166.624775,68.150852],[166.626401,68.150786],[166.627466,68.150412],[166.629181,68.149828],[166.630748,68.149784],[166.632226,68.150059],[166.632936,68.150687],[166.633172,68.151501],[166.633793,68.152491],[166.635124,68.153152],[166.637223,68.153537],[166.639293,68.153438],[166.64086,68.15302],[166.641599,68.152425],[166.641126,68.151424],[166.640831,68.150258],[166.640062,68.14963],[166.640269,68.149234],[166.641392,68.148948],[166.64293,68.149124],[166.645296,68.149828],[166.647986,68.15039],[166.650293,68.150511],[166.652895,68.150357],[166.656029,68.150621],[166.657685,68.150742],[166.659518,68.151171],[166.660405,68.151589],[166.661174,68.152557],[166.662445,68.154791],[166.663214,68.155682],[166.663717,68.157718],[166.664101,68.158455],[166.665284,68.159016],[166.667916,68.159478],[166.671339,68.16001],[166.672446,68.160246],[166.673559,68.160589],[166.675173,68.161333],[166.675959,68.161682],[166.67663,68.162045],[166.677339,68.162489],[166.678087,68.163097],[166.679625,68.164537],[166.680719,68.165087],[166.681695,68.165285],[166.682966,68.165109],[166.683942,68.164735],[166.685066,68.164229],[166.687017,68.164075],[166.688732,68.16435],[166.690654,68.165274],[166.693788,68.166693],[166.695356,68.167111],[166.697011,68.167067],[166.697662,68.166869],[166.699081,68.165813],[166.699998,68.165516],[166.701506,68.165604],[166.704492,68.166517],[166.706434,68.167942],[166.707228,68.168568],[166.70766,68.16888],[166.707742,68.169196],[166.707561,68.16973],[166.707065,68.170717],[166.70603,68.171421],[166.705971,68.171982],[166.706887,68.172344],[166.708809,68.172476],[166.711323,68.17229],[166.713925,68.17263],[166.716261,68.172531],[166.718833,68.172301],[166.724304,68.172224],[166.731163,68.172355],[166.736338,68.173158],[166.738142,68.173675],[166.738319,68.174049],[166.737373,68.174323],[166.733854,68.174796],[166.732051,68.174829],[166.730543,68.174807],[166.729892,68.175027],[166.729892,68.175302],[166.731518,68.175895],[166.733411,68.176379],[166.735067,68.177335],[166.73829,68.17794],[166.740212,68.178083],[166.741039,68.177731],[166.742045,68.177258],[166.743612,68.17705],[166.74512,68.17661],[166.747574,68.176544],[166.750206,68.176643],[166.753399,68.177203],[166.756179,68.178588],[166.757805,68.178973],[166.761028,68.179556],[166.762902,68.180104],[166.763598,68.180483],[166.763748,68.181402],[166.763955,68.18227],[166.764362,68.183626],[166.766585,68.185662],[166.769278,68.187233],[166.770186,68.188094],[166.77147,68.188653],[166.772409,68.188722],[166.77435,68.188257],[166.775978,68.187978],[166.777387,68.188082],[166.778577,68.188548],[166.778953,68.189502],[166.779203,68.1902],[166.778922,68.190886],[166.779266,68.191607],[166.780926,68.192317],[166.783869,68.192712],[166.787282,68.193259],[166.790663,68.194608],[166.791133,68.195329],[166.790945,68.19662],[166.7901,68.197911],[166.789724,68.199993],[166.789943,68.201225],[166.791227,68.202446],[166.792448,68.203074],[166.793982,68.203155],[166.795329,68.203167],[166.798836,68.203632],[166.800933,68.203725],[166.802155,68.203841],[166.802812,68.204167],[166.803031,68.204992],[166.803188,68.205864],[166.80444,68.206689],[166.805599,68.207119],[166.806851,68.207247],[166.807884,68.207166],[166.809262,68.206852],[166.812769,68.206631],[166.814053,68.206736],[166.814344,68.206801],[166.815149,68.20698],[166.81637,68.20755],[166.817434,68.207991],[166.81972,68.208514],[166.821442,68.209444],[166.822695,68.210025],[166.825763,68.211164],[166.827485,68.212082],[166.829207,68.212559],[166.831493,68.212838],[166.834374,68.213035],[166.836378,68.213303],[166.839446,68.213861],[166.843986,68.214465],[166.846178,68.215069],[166.84909,68.215592],[166.853192,68.216092],[166.854976,68.216254],[166.856354,68.216138],[166.85792,68.215859],[166.859141,68.215592],[166.860769,68.215325],[166.862429,68.215302],[166.864777,68.215755],[166.868002,68.216615],[166.868941,68.217219],[166.869912,68.217707],[166.873888,68.218787],[166.875861,68.218962],[166.877928,68.218962],[166.880746,68.218671],[166.882718,68.218706],[166.884503,68.219078],[166.886006,68.219775],[166.886601,68.220437],[166.886757,68.221076],[166.887321,68.221576],[166.888354,68.221843],[166.888761,68.22218],[166.88945,68.222354],[166.891047,68.222424],[166.896495,68.22247],[166.900879,68.2224],[166.907454,68.222191],[166.910648,68.222156],[166.913372,68.222331],[166.91572,68.222203],[166.918162,68.221785],[166.920573,68.221727],[166.922076,68.221866],[166.923204,68.222203],[166.924205,68.222958],[166.925427,68.223852],[166.926961,68.224236],[166.928307,68.224363],[166.929873,68.224131],[166.932065,68.224154],[166.934663,68.224224],[166.936166,68.224027],[166.939736,68.223527],[166.941489,68.223492],[166.942992,68.223539],[166.944088,68.223829],[166.947063,68.22477],[166.952542,68.226071],[166.955141,68.22664],[166.956456,68.226779],[166.96037,68.227674],[166.962342,68.227918],[166.964847,68.227894],[166.967415,68.22786],[166.969575,68.22808],[166.971548,68.228545],[166.973489,68.229172],[166.975493,68.229462],[166.978468,68.229555],[166.980941,68.229706],[166.9821,68.229625],[166.983571,68.229242],[166.98498,68.229021],[166.986389,68.229079],[166.991681,68.229822],[166.992307,68.230089],[166.992464,68.230461],[166.9919,68.230972],[166.99093,68.23211],[166.991117,68.232667],[166.992182,68.233399],[166.994029,68.234014],[166.995313,68.23442],[166.997254,68.234571],[167.000761,68.235163],[167.001826,68.235558],[167.002984,68.236626],[167.003924,68.237253],[167.006053,68.237938],[167.009278,68.239378],[167.011031,68.239784],[167.012033,68.239842],[167.012941,68.239679],[167.015071,68.23925],[167.016887,68.239111],[167.018922,68.239273],[167.021114,68.239749],[167.021942,68.240028],[167.022147,68.240097],[167.023525,68.240921],[167.024808,68.241444],[167.026562,68.241908],[167.02819,68.242686],[167.029599,68.243626],[167.031258,68.244322],[167.03345,68.244949],[167.03536,68.245738],[167.036769,68.246446],[167.03727,68.247119],[167.037489,68.248476],[167.037896,68.248999],[167.039712,68.249451],[167.042405,68.249985],[167.043814,68.250553],[167.047759,68.252015],[167.049388,68.252526],[167.05064,68.252584],[167.053552,68.252549],[167.05662,68.252816],[167.058499,68.253152],[167.061035,68.253836],[167.06329,68.253894],[167.065325,68.253836],[167.066984,68.253813],[167.070585,68.254184],[167.073341,68.254382],[167.074593,68.25466],[167.075783,68.255194],[167.082577,68.256377],[167.084894,68.256644],[167.086523,68.25662],[167.08734,68.256854],[167.088095,68.25707],[167.088714,68.257247],[167.095759,68.260262],[167.102272,68.262443],[167.105591,68.263683],[167.108785,68.264356],[167.111603,68.265411],[167.112104,68.265898],[167.1132,68.266315],[167.114891,68.267324],[167.116049,68.268182],[167.116639,68.268635],[167.11737,68.268904],[167.1184,68.269103],[167.119662,68.269133],[167.122974,68.269001],[167.125575,68.269099],[167.127966,68.269472],[167.129317,68.269878],[167.131052,68.270452],[167.132289,68.270724],[167.134025,68.270925],[167.135929,68.270917],[167.13925,68.271105],[167.142616,68.27104],[167.144807,68.271105],[167.14773,68.271523],[167.152667,68.272212],[167.156188,68.272777],[167.160151,68.273531],[167.172948,68.276449],[167.175826,68.276982],[167.184239,68.278244],[167.194977,68.279505],[167.201199,68.279931],[167.211981,68.28121],[167.224775,68.281522],[167.236067,68.282424],[167.245986,68.2828],[167.249351,68.283128],[167.252273,68.283784],[167.254797,68.284111],[167.2571,68.284078],[167.266709,68.284996],[167.271713,68.285258],[167.276894,68.285356],[167.279683,68.285455],[167.282916,68.285406],[167.284421,68.285242],[167.285351,68.284816],[167.286192,68.284406],[167.288849,68.283964],[167.291196,68.283571],[167.294074,68.282981],[167.297351,68.28285],[167.302089,68.282981],[167.30727,68.282948],[167.314532,68.282964],[167.316746,68.282833],[167.318916,68.282374],[167.326178,68.280883],[167.328481,68.280097],[167.330517,68.278802],[167.331226,68.278081],[167.332953,68.277409],[167.337558,68.276213],[167.347565,68.274344],[167.370503,68.271017],[167.379492,68.269721],[167.387949,68.267836],[167.397514,68.266656],[167.403536,68.265623],[167.409824,68.263507],[167.413721,68.263097],[167.423728,68.262277],[167.425898,68.261884],[167.428245,68.261178],[167.4313,68.260227],[167.43564,68.25962],[167.441618,68.258735],[167.445072,68.25839],[167.463404,68.257619],[167.472747,68.257029],[167.480673,68.256307],[167.487271,68.256012],[167.492496,68.255077],[167.499005,68.254158],[167.503921,68.253764],[167.51136,68.253895],[167.515522,68.254355],[167.518179,68.254338],[167.524467,68.254076],[167.530843,68.25401],[167.539124,68.253239],[167.545766,68.25255],[167.552895,68.252304],[167.564984,68.253354],[167.569987,68.253731],[167.572113,68.254437],[167.576452,68.255503],[167.58274,68.256356],[167.592659,68.25675],[167.594829,68.25652],[167.597796,68.256389],[167.598903,68.256783],[167.600098,68.258423],[167.601692,68.259063],[167.604925,68.259653],[167.617633,68.260916],[167.625382,68.261178],[167.632157,68.260949],[167.639331,68.260358],[167.648098,68.259276],[167.655759,68.258325],[167.659169,68.258079],[167.662313,68.257193],[167.667006,68.256176],[167.67061,68.255566],[167.679997,68.254976],[167.697267,68.253959],[167.720558,68.252548],[167.752086,68.250152],[167.776795,68.24838],[167.79557,68.247428],[167.802832,68.247494],[167.832057,68.244901],[167.846138,68.243522],[167.872618,68.240042],[167.896352,68.237153],[167.905386,68.236759],[167.932928,68.236365],[167.947275,68.235511],[167.967556,68.234132],[167.985622,68.232096],[168.011217,68.229008],[168.061431,68.223062],[168.085785,68.220335],[168.102789,68.219251],[168.119616,68.217903],[168.130686,68.217575],[168.137594,68.216687],[168.147247,68.215274],[168.15504,68.214124],[168.159291,68.213105],[168.163985,68.212217],[168.172443,68.211231],[168.176206,68.210738],[168.178863,68.210229],[168.179869,68.209917],[168.180338,68.209702],[168.180636,68.209656],[168.180949,68.209685],[168.180076,68.208943],[168.179183,68.208235],[168.178891,68.20793],[168.178874,68.207802],[168.180299,68.206132],[168.18181,68.205278],[168.182325,68.205125],[168.183578,68.205119],[168.184818,68.205054],[168.18517,68.204798],[168.185432,68.204431],[168.185517,68.203175],[168.186243,68.20185],[168.186307,68.201352],[168.186414,68.200846],[168.186371,68.200392],[168.18621,68.200033],[168.185856,68.19981],[168.185084,68.199563],[168.184301,68.199288],[168.183882,68.199033],[168.183646,68.198806],[168.183668,68.198455],[168.183711,68.198216],[168.183539,68.198033],[168.182584,68.19775],[168.181447,68.19765],[168.180921,68.197638],[168.18032,68.197618],[168.180181,68.197574],[168.180771,68.197315],[168.181693,68.196957],[168.182369,68.196682],[168.182912,68.196552],[168.183217,68.196479],[168.187004,68.196184],[168.18797,68.196136],[168.190534,68.196793],[168.192072,68.197144],[168.194632,68.197455],[168.196853,68.197655],[168.202284,68.197843],[168.208803,68.198166],[168.212786,68.198139],[168.216915,68.198569],[168.224519,68.198381],[168.22872,68.198004],[168.236252,68.196363],[168.240236,68.19518],[168.244292,68.194131],[168.24842,68.193108],[168.251969,68.192005],[168.25559,68.191413],[168.257763,68.190848],[168.261022,68.190418],[168.268772,68.189368],[168.272755,68.189045],[168.279926,68.188049],[168.287965,68.187027],[168.290717,68.186462],[168.293976,68.18595],[168.303174,68.183474],[168.305526,68.182802],[168.308244,68.181967],[168.315192,68.180374],[168.321858,68.179057],[168.333376,68.176313],[168.339315,68.174994],[168.342937,68.17424],[168.345732,68.173633],[168.349315,68.172785],[168.35618,68.171004],[168.360125,68.169951],[168.365786,68.168458],[168.370386,68.167076],[168.37886,68.164787],[168.38393,68.163278],[168.386754,68.162335],[168.390303,68.160773],[168.401457,68.156731],[168.404427,68.155303],[168.411379,68.15285],[168.415942,68.150775],[168.417536,68.150182],[168.421374,68.146758],[168.42674,68.141732],[168.427942,68.140521],[168.428618,68.139611],[168.429025,68.138712],[168.429283,68.137581],[168.42924,68.137242],[168.428779,68.136966],[168.428006,68.136478],[168.427545,68.135939],[168.427362,68.135128],[168.42747,68.134601],[168.427738,68.134089],[168.428167,68.133682],[168.429197,68.133466],[168.430174,68.133186],[168.43086,68.129589],[168.4313,68.128015],[168.431632,68.127383],[168.431826,68.127243],[168.431954,68.127187],[168.432051,68.127023],[168.43204,68.12672],[168.432856,68.125816],[168.433113,68.125588],[168.433124,68.125373],[168.433081,68.125093],[168.433253,68.124893],[168.433789,68.124465],[168.434809,68.124137],[168.435497,68.124029],[168.435896,68.123786],[168.437163,68.12268],[168.437163,68.122126],[168.43586,68.121519],[168.43452,68.120615],[168.434829,68.120035],[168.43821,68.119042],[168.442921,68.118164],[168.44794,68.115339],[168.450091,68.113545],[168.454803,68.108428],[168.458388,68.104685],[168.460334,68.102202],[168.461051,68.100827],[168.464328,68.096281],[168.46566,68.094714],[168.466684,68.093873],[168.468835,68.093033],[168.47283,68.091848],[168.480204,68.088981],[168.485121,68.087147],[168.490084,68.085596],[168.490555,68.085449],[168.491441,68.085105],[168.498539,68.082559],[168.501202,68.081144],[168.507347,68.077894],[168.513083,68.074644],[168.516054,68.071545],[168.520765,68.068906],[168.521486,68.068495],[168.522044,68.068236],[168.522726,68.067956],[168.523525,68.067725],[168.523986,68.067621],[168.524287,68.067601],[168.524705,68.067605],[168.524812,68.067585],[168.524898,68.067543],[168.52507,68.067431],[168.525295,68.06729],[168.525971,68.067114],[168.527967,68.066625],[168.531827,68.065425],[168.538997,68.063894],[168.550264,68.060948],[168.561019,68.057273],[168.565218,68.055972],[168.571364,68.053599],[168.572068,68.053348],[168.573741,68.052528],[168.574487,68.0522],[168.575377,68.051748],[168.576386,68.051297],[168.581811,68.049043],[168.584884,68.047358],[168.597995,68.041767],[168.609671,68.036711],[168.611572,68.03587],[168.612285,68.035566],[168.615002,68.034372],[168.616158,68.03387],[168.618067,68.033024],[168.619763,68.032263],[168.623371,68.030601],[168.646207,68.019727],[168.654555,68.017791],[168.662647,68.015855],[168.671712,68.012557],[168.673222,68.012104],[168.675278,68.011496],[168.676375,68.011083],[168.676849,68.010486],[168.677074,68.010236],[168.677531,68.010067],[168.678774,68.009794],[168.679958,68.009604],[168.681377,68.009443],[168.682427,68.009359],[168.683043,68.009258],[168.684482,68.009012],[168.686657,68.008679],[168.69123,68.008097],[168.696174,68.007422],[168.698836,68.007022],[168.702687,68.006292],[168.706492,68.005529],[168.708871,68.004966],[168.712422,68.00411],[168.715047,68.003485],[168.715533,68.003225],[168.715993,68.003062],[168.716617,68.002945],[168.717667,68.002822],[168.721496,68.001881],[168.731161,67.999609],[168.73306,67.999061],[168.733558,67.998878],[168.734754,67.997945],[168.735563,67.997456],[168.735914,67.997316],[168.736678,67.997157],[168.737675,67.997017],[168.738745,67.996965],[168.739185,67.996981],[168.74033,67.997102],[168.741388,67.99717],[168.742616,67.997223],[168.744743,67.997278],[168.746803,67.99734],[168.747938,67.997334],[168.749335,67.997224],[168.755906,67.996272],[168.762974,67.994776],[168.766866,67.993605],[168.767941,67.992818],[168.770041,67.992185],[168.772755,67.991571],[168.778491,67.991149],[168.790014,67.990131],[168.800922,67.989325],[168.80589,67.988596],[168.811329,67.987322],[168.811997,67.987166],[168.815467,67.986408],[168.825454,67.984181],[168.836413,67.982376],[168.842149,67.981666],[168.846758,67.981435],[168.849882,67.981608],[168.860535,67.981647],[168.871904,67.982184],[168.875796,67.981992],[168.878869,67.981301],[168.882505,67.979112],[168.88366,67.978359],[168.884989,67.977494],[168.885934,67.976996],[168.887415,67.976376],[168.888692,67.975901],[168.890001,67.975543],[168.891857,67.975145],[168.893487,67.974859],[168.89839,67.974147],[168.899828,67.973942],[168.903036,67.97327],[168.903723,67.973129],[168.904313,67.972924],[168.905697,67.97259],[168.906748,67.972457],[168.907757,67.972361],[168.908637,67.97228],[168.909345,67.972244],[168.91001,67.972276],[168.912392,67.972393],[168.915181,67.972618],[168.916447,67.972719],[168.917434,67.972755],[168.918534,67.972699],[168.926139,67.971833],[168.928802,67.971219],[168.930492,67.96997],[168.931823,67.968049],[168.933769,67.962458],[168.938123,67.95748],[168.947648,67.949426],[168.956098,67.942561],[168.959376,67.939445],[168.96209,67.935463],[168.964702,67.930499],[168.965829,67.927285],[168.966239,67.925264],[168.964958,67.923243],[168.963319,67.920991],[168.960912,67.916756],[168.9604,67.914696],[168.962227,67.912216],[168.963177,67.911076],[168.963434,67.910685],[168.964208,67.909702],[168.965675,67.908186],[168.969721,67.905509],[168.971258,67.901039],[168.976328,67.892426],[168.978009,67.890122],[168.978519,67.889522],[168.97891,67.889102],[168.979186,67.888661],[168.982012,67.885775],[168.987595,67.878853],[168.989797,67.875748],[168.991077,67.874455],[168.99374,67.871253],[168.995328,67.869652],[168.997479,67.868398],[169.001639,67.867157],[169.004461,67.866304],[169.006156,67.865732],[169.007733,67.865253],[169.011134,67.864162],[169.012047,67.863851],[169.016786,67.861606],[169.019449,67.860351],[169.023341,67.858266],[169.02708,67.855738],[169.032765,67.853325],[169.039035,67.850411],[169.040161,67.849954],[169.042495,67.849231],[169.04515,67.848429],[169.048369,67.847389],[169.051373,67.846475],[169.053411,67.845848],[169.058433,67.844278],[169.091199,67.833489],[169.095962,67.831885],[169.099803,67.830261],[169.104924,67.827015],[169.106819,67.825526],[169.109636,67.822897],[169.112043,67.821254],[169.113528,67.820113],[169.115218,67.817523],[169.114859,67.816652],[169.115218,67.816285],[169.117061,67.816092],[169.118342,67.815666],[169.123105,67.815512],[169.128021,67.815415],[169.129353,67.814893],[169.130428,67.814274],[169.131606,67.813017],[169.134218,67.811721],[169.136574,67.810851],[169.140978,67.809806],[169.143231,67.809052],[169.145741,67.808356],[169.149479,67.806673],[169.150504,67.805551],[169.150606,67.804854],[169.151989,67.804003],[169.15542,67.803616],[169.158083,67.803306],[169.162078,67.803306],[169.169094,67.803945],[169.176674,67.804622],[169.191577,67.804603],[169.195976,67.804973],[169.19747,67.805209],[169.198534,67.805405],[169.199085,67.805544],[169.199804,67.805617],[169.200364,67.805703],[169.201201,67.80595],[169.202129,67.806225],[169.204001,67.806789],[169.205853,67.807248],[169.206285,67.807392],[169.207019,67.807545],[169.2076,67.807739],[169.209215,67.808082],[169.210284,67.808398],[169.212838,67.809022],[169.214581,67.809472],[169.216031,67.80976],[169.217547,67.810156],[169.21923,67.810555],[169.220764,67.810795],[169.221687,67.810929],[169.224555,67.811513],[169.228738,67.812308],[169.230699,67.812586],[169.232553,67.812713],[169.236962,67.812777],[169.251732,67.812855],[169.253354,67.812867],[169.256156,67.812823],[169.259499,67.812949],[169.261139,67.813123],[169.262873,67.813466],[169.270547,67.815144],[169.282582,67.817523],[169.287397,67.818547],[169.290213,67.818876],[169.294464,67.819881],[169.297178,67.820191],[169.300302,67.820829],[169.30655,67.821621],[169.310545,67.822066],[169.315769,67.822491],[169.331081,67.823593],[169.347828,67.824386],[169.351515,67.824946],[169.357763,67.825352],[169.367494,67.826647],[169.373127,67.827498],[169.378044,67.828194],[169.382805,67.828629],[169.387569,67.829025],[169.391596,67.829342],[169.402268,67.830184],[169.41795,67.831498],[169.423631,67.83199],[169.402627,67.825702],[169.398984,67.825008],[169.394848,67.824278],[169.392593,67.823832],[169.391412,67.823473],[169.390479,67.823075],[169.389943,67.822795],[169.389423,67.822435],[169.388913,67.822026],[169.388183,67.821503],[169.387354,67.821119],[169.326969,67.803502],[169.292269,67.791384],[169.279208,67.785274],[169.273859,67.782857],[169.268972,67.780452],[169.264574,67.778269],[169.26268,67.776674],[169.260896,67.774838],[169.260243,67.773135],[169.259954,67.770897],[169.264176,67.762967],[169.264076,67.760684],[169.263624,67.759295],[169.262295,67.757819],[169.260009,67.75608],[169.25545,67.754414],[169.252585,67.753558],[169.246554,67.752664],[169.235128,67.751704],[169.219373,67.750251],[169.210931,67.749491],[169.207705,67.749081],[169.205553,67.748691],[169.202942,67.747911],[169.200372,67.746878],[169.198073,67.745926],[169.196805,67.745229],[169.19591,67.74456],[169.194483,67.742557],[169.193126,67.739663],[169.191869,67.738482],[169.188865,67.73651],[169.164627,67.728465],[169.155442,67.725572],[169.150971,67.724416],[169.129978,67.719505],[169.118828,67.716771],[169.114193,67.715418],[169.108589,67.713342],[169.099436,67.709737],[169.091854,67.706875],[169.089044,67.706026],[169.082017,67.704495],[169.075131,67.702917],[169.068917,67.70106],[169.06248,67.699057],[169.059566,67.698008],[169.057623,67.697232],[169.055233,67.696147],[169.052798,67.694432],[169.047228,67.690173],[169.044374,67.688316],[169.042115,67.68669],[169.039786,67.685612],[169.031282,67.683413],[169.017367,67.677181],[168.998937,67.66875],[168.988761,67.662897],[168.977114,67.655696],[168.971757,67.652485],[168.964333,67.648728],[168.955729,67.644107],[168.952632,67.642903],[168.950333,67.642246],[168.947765,67.641809],[168.945286,67.641411],[168.94394,67.641144],[168.942465,67.640833],[168.946437,67.639346],[168.948076,67.638787],[168.948588,67.63865],[168.949352,67.638511],[168.951609,67.638406],[168.951927,67.638399],[168.952295,67.63839],[168.955682,67.638374],[168.95697,67.638276],[168.95815,67.638158],[168.959287,67.637946],[168.960028,67.637905],[168.961015,67.637921],[168.962828,67.637979],[168.965714,67.63826],[168.969094,67.638623],[168.969716,67.638803],[168.971486,67.638991],[168.974988,67.639003],[168.978207,67.639061],[168.981314,67.638991],[168.984897,67.638991],[168.989834,67.6389],[168.990948,67.63886],[168.993791,67.638766],[168.997556,67.638594],[168.999637,67.638514],[169.000935,67.638233],[169.004329,67.637527],[169.005926,67.637322],[169.008161,67.637185],[169.009898,67.636942],[169.011815,67.636623],[169.013212,67.636494],[169.018981,67.636236],[169.021916,67.636092],[169.024311,67.635788],[169.0304,67.635378],[169.031538,67.635248],[169.037187,67.635218],[169.042637,67.635294],[169.047408,67.635195],[169.048885,67.634983],[169.051839,67.634815],[169.054235,67.634664],[169.056091,67.634588],[169.057429,67.634603],[169.059166,67.634702],[169.060842,67.634702],[169.061721,67.634656],[169.063358,67.634777],[169.065154,67.634884],[169.066432,67.635066],[169.06727,67.635203],[169.068708,67.635659],[169.069307,67.635826],[169.071183,67.635932],[169.07262,67.636038],[169.074058,67.636175],[169.076852,67.637102],[169.080086,67.638241],[169.083081,67.638788],[169.086982,67.63946],[169.088231,67.639547],[169.089289,67.639566],[169.090415,67.639656],[169.092765,67.639966],[169.093805,67.640187],[169.094819,67.640322],[169.096713,67.640566],[169.098515,67.640725],[169.100232,67.640789],[169.101348,67.640838],[169.101809,67.640844],[169.103971,67.640744],[169.106927,67.640509],[169.110264,67.640313],[169.112356,67.640187],[169.115038,67.640003],[169.116958,67.639934],[169.121196,67.639611],[169.123481,67.639366],[169.125091,67.639232],[169.126067,67.63906],[169.126915,67.63884],[169.127515,67.638599],[169.127912,67.638411],[169.128438,67.638297],[169.129533,67.638297],[169.130498,67.638293],[169.131839,67.638191],[169.133298,67.638056],[169.135047,67.637893],[169.135948,67.637848],[169.13671,67.637819],[169.137386,67.637852],[169.13804,67.637983],[169.139113,67.638183],[169.140809,67.638452],[169.142911,67.638901],[169.146141,67.639558],[169.147128,67.639766],[169.14848,67.640183],[169.150035,67.640525],[169.151859,67.640938],[169.153436,67.641268],[169.154069,67.64144],[169.156172,67.641754],[169.158597,67.642015],[169.160399,67.642244],[169.161998,67.642354],[169.163554,67.642325],[169.165142,67.642272],[169.165764,67.642284],[169.16718,67.642268],[169.168146,67.642391],[169.169497,67.642558],[169.170334,67.642599],[169.171193,67.642591],[169.172394,67.642672],[169.17322,67.642901],[169.174154,67.643088],[169.175109,67.643052],[169.17616,67.643015],[169.177855,67.642917],[169.180087,67.642954],[169.181288,67.642958],[169.182565,67.642844],[169.183509,67.642819],[169.185153,67.642921],[169.186129,67.642847],[169.187707,67.642651],[169.190421,67.642031],[169.192792,67.641386],[169.193554,67.641121],[169.194399,67.640652],[169.195054,67.640428],[169.195772,67.640276],[169.196266,67.640113],[169.197178,67.639615],[169.197607,67.639395],[169.198444,67.639277],[169.199737,67.639236],[169.201083,67.63915],[169.202875,67.638817],[169.204366,67.638807],[169.20545,67.63873],[169.20648,67.638521],[169.209677,67.637579],[169.2112,67.637174],[169.212863,67.636868],[169.214194,67.636587],[169.216404,67.636105],[169.219151,67.635566],[169.222627,67.634909],[169.225255,67.63437],[169.225985,67.634247],[169.227075,67.634155],[169.228238,67.634158],[169.229547,67.634137],[169.231027,67.633994],[169.232958,67.63386],[169.234503,67.633696],[169.235458,67.633419],[169.236392,67.632965],[169.238484,67.631732],[169.239535,67.630985],[169.240029,67.630214],[169.240469,67.629095],[169.240887,67.628654],[169.241198,67.628368],[169.242378,67.627853],[169.245382,67.626971],[169.246691,67.626498],[169.248247,67.626126],[169.249556,67.625701],[169.250865,67.625203],[169.253858,67.623251],[169.25462,67.622658],[169.25624,67.621323],[169.256658,67.621012],[169.259566,67.618851],[169.261647,67.617066],[169.262506,67.616555],[169.263579,67.615942],[169.26492,67.615207],[169.267688,67.613973],[169.270269,67.612912],[169.27361,67.611525],[169.279092,67.609196],[169.281764,67.607941],[169.288001,67.604937],[169.291132,67.603771],[169.296523,67.602158],[169.3093,67.598814],[169.316041,67.596718],[169.319329,67.595922],[169.323925,67.59509],[169.32939,67.593841],[169.333626,67.593159],[169.347484,67.591132],[169.353145,67.590353],[169.363483,67.589519],[169.374519,67.588743],[169.377199,67.588425],[169.382824,67.586984],[169.391441,67.584951],[169.406082,67.581626],[169.410075,67.580795],[169.415033,67.580026],[169.425501,67.576863],[169.426781,67.576315],[169.430985,67.573191],[169.432624,67.572115],[169.433646,67.571204],[169.430152,67.566876],[169.426948,67.563388],[169.424277,67.559478],[169.423634,67.558218],[169.423299,67.557059],[169.423205,67.556089],[169.423591,67.555089],[169.424198,67.554355],[169.425064,67.552707],[169.424782,67.551016],[169.423651,67.548713],[169.42139,67.545367],[169.419788,67.542056],[169.418898,67.540356],[169.418827,67.539059],[169.418237,67.53754],[169.417754,67.536665],[169.416805,67.5356],[169.415909,67.534878],[169.414317,67.533904],[169.411747,67.532617],[169.410931,67.531565],[169.410544,67.530284],[169.410332,67.527624],[169.410545,67.526365],[169.4112,67.524945],[169.412991,67.522855],[169.414902,67.52108],[169.417954,67.519298],[169.421279,67.517575],[169.424492,67.515487],[169.427291,67.513589],[169.429967,67.512312],[169.430875,67.511745],[169.431602,67.510381],[169.433183,67.508183],[169.434604,67.506035],[169.434249,67.504539],[169.432969,67.5025],[169.433112,67.500949],[169.43305,67.499943],[169.432082,67.498729],[169.430482,67.497739],[169.427212,67.495944],[169.425861,67.494447],[169.425079,67.491699],[169.424298,67.489522],[169.423658,67.485304],[169.422947,67.480921],[169.422805,67.478335],[169.421668,67.475476],[169.421028,67.473788],[169.420886,67.469839],[169.420388,67.468504],[169.418824,67.46559],[169.417687,67.463465],[169.416905,67.461939],[169.416976,67.458724],[169.41591,67.452783],[169.415484,67.448749],[169.416336,67.443214],[169.417474,67.439506],[169.420388,67.433042],[169.420815,67.426958],[169.421525,67.420572],[169.422663,67.418607],[169.423763,67.416726],[169.425291,67.414992],[169.425719,67.413393],[169.425991,67.411641],[169.426143,67.409498],[169.425506,67.405666],[169.426501,67.403044],[169.428918,67.398018],[169.430197,67.395368],[169.430908,67.393483],[169.430908,67.392226],[169.432116,67.390559],[169.434674,67.387904],[169.438695,67.385101],[169.443113,67.382588],[169.445886,67.381003],[169.448018,67.379171],[169.448712,67.377918],[169.449767,67.375753],[169.450923,67.373375],[169.451476,67.371209],[169.451627,67.369487],[169.453888,67.36649],[169.454743,67.364459],[169.454531,67.362827],[169.455034,67.36184],[169.455666,67.360843],[169.455989,67.359112],[169.455536,67.357855],[169.455335,67.354894],[169.454933,67.353423],[169.453677,67.352804],[169.453777,67.351701],[169.453325,67.350423],[169.447294,67.344829],[169.441966,67.33993],[169.439973,67.337959],[169.437129,67.334645],[169.429737,67.328837],[169.425614,67.325302],[169.421847,67.322946],[169.421563,67.321466],[169.414099,67.316642],[169.406707,67.312036],[169.403366,67.309404],[169.401091,67.307211],[169.397182,67.305401],[169.390714,67.302466],[169.389008,67.301341],[169.386662,67.298955],[169.383108,67.295334],[169.379767,67.292233],[169.378914,67.290944],[169.379412,67.290093],[169.38032,67.289275],[169.381971,67.287788],[169.383376,67.286256],[169.384755,67.285399],[169.385067,67.284285],[169.38453,67.282957],[169.384059,67.281629],[169.383321,67.280047],[169.382539,67.278674],[169.382183,67.277605],[169.375573,67.272112],[169.373455,67.269788],[169.372248,67.267477],[169.372047,67.265845],[169.372299,67.263592],[169.371545,67.262251],[169.370539,67.261299],[169.37059,67.259143],[169.371394,67.257122],[169.372349,67.255956],[169.375164,67.254849],[169.377576,67.254071],[169.381497,67.253566],[169.386573,67.252964],[169.390493,67.2524],[169.393157,67.251603],[169.396173,67.249582],[169.397379,67.248513],[169.39748,67.245694],[169.392604,67.242136],[169.389689,67.239706],[169.386422,67.236244],[169.382653,67.231537],[169.381346,67.229553],[169.379637,67.227977],[169.375566,67.225779],[169.36677,67.221012],[169.361857,67.218303],[169.358289,67.216571],[169.35467,67.21517],[169.352157,67.214177],[169.349845,67.211821],[169.347734,67.209232],[169.34512,67.206156],[169.342758,67.202378],[169.341853,67.199982],[169.341451,67.198502],[169.341652,67.196184],[169.342708,67.194138],[169.344718,67.191898],[169.345824,67.190144],[169.345723,67.189423],[169.344014,67.188235],[169.342808,67.187591],[169.338787,67.18611],[169.335771,67.184337],[169.331901,67.181745],[169.328232,67.178372],[169.326222,67.176286],[169.325418,67.17535],[169.32019,67.170534],[169.317828,67.168779],[169.31627,67.16755],[169.315013,67.165931],[169.314159,67.163708],[169.314109,67.160645],[169.316169,67.158889],[169.321598,67.154811],[169.324362,67.152957],[169.328991,67.149665],[169.334068,67.145956],[169.33643,67.144433],[169.341557,67.141954],[169.347236,67.139337],[169.350704,67.137072],[169.352866,67.135354],[169.354826,67.133323],[169.355881,67.131506],[169.356032,67.129592],[169.356686,67.127541],[169.359148,67.125118],[169.36523,67.119119],[169.367592,67.116598],[169.370206,67.114644],[169.376489,67.110832],[169.381766,67.107821],[169.392371,67.101681],[169.398493,67.098817],[169.406786,67.094162],[169.409401,67.092334],[169.410103,67.090542],[169.410355,67.088488],[169.410958,67.087274],[169.411913,67.085729],[169.415934,67.083223],[169.420809,67.08019],[169.423573,67.078663],[169.425182,67.07739],[169.431314,67.072692],[169.434329,67.070459],[169.436742,67.069108],[169.440461,67.067365],[169.445782,67.064932],[169.449853,67.062836],[169.45116,67.062503],[169.457543,67.061308],[169.459403,67.060721],[169.46272,67.058037],[169.464731,67.05596],[169.465484,67.054314],[169.46659,67.052766],[169.467646,67.051884],[169.470109,67.050277],[169.476767,67.045604],[169.482346,67.041624],[169.486266,67.039193],[169.490237,67.037134],[169.493353,67.035663],[169.496771,67.034212],[169.498329,67.033212],[169.499786,67.032173],[169.502601,67.030917],[169.506119,67.029544],[169.509638,67.028897],[169.513458,67.028348],[169.516524,67.027642],[169.518132,67.026602],[169.519037,67.025484],[169.518865,67.023078],[169.518392,67.017499],[169.518419,67.016097],[169.518484,67.013856],[169.519238,67.012698],[169.51979,67.010931],[169.520092,67.00993],[169.524768,67.008068],[169.526677,67.00726],[169.530415,67.005847],[169.535241,67.004056],[169.53915,67.002592],[169.539918,67.00239],[169.540584,67.002339],[169.541802,67.002335],[169.543892,67.002335],[169.545055,67.002324],[169.546929,67.002321],[169.548138,67.002324],[169.549188,67.002292],[169.550144,67.002138],[169.550988,67.001958],[169.55259,67.00164],[169.553284,67.00146],[169.557473,66.999858],[169.558586,66.999387],[169.561158,66.998325],[169.565035,66.997108],[169.570993,66.995305],[169.572371,66.994834],[169.573643,66.994029],[169.574697,66.993401],[169.581254,66.989239],[169.582062,66.988695],[169.582831,66.98797],[169.583003,66.98769],[169.583335,66.985306],[169.583586,66.983441],[169.583878,66.981196],[169.584117,66.979004],[169.584315,66.977091],[169.583759,66.975028],[169.583215,66.973021],[169.582526,66.970403],[169.58181,66.967867],[169.581201,66.965642],[169.580631,66.963904],[169.580206,66.962379],[169.579769,66.960626],[169.579332,66.958816],[169.578656,66.95604],[169.578112,66.953783],[169.577834,66.951821],[169.577714,66.949828],[169.577635,66.948292],[169.578324,66.947073],[169.57953,66.945116],[169.580591,66.943361],[169.581174,66.942364],[169.581466,66.941316],[169.581969,66.939488],[169.582155,66.938419],[169.582685,66.933994],[169.582871,66.932114],[169.581196,66.930417],[169.580559,66.929844],[169.580231,66.929448],[169.580109,66.929077],[169.580175,66.928728],[169.580344,66.928412],[169.580606,66.928162],[169.581337,66.927619],[169.582462,66.926715],[169.584711,66.925091],[169.585649,66.924434],[169.586342,66.92389],[169.586773,66.923229],[169.586923,66.92263],[169.586961,66.922307],[169.586998,66.921825],[169.586876,66.921458],[169.58653,66.920705],[169.586501,66.919985],[169.586923,66.918621],[169.587559,66.917114],[169.587513,66.916231],[169.587159,66.914943],[169.587123,66.911613],[169.586563,66.90986],[169.586282,66.909077],[169.586019,66.908393],[169.585663,66.907698],[169.585241,66.90718],[169.584857,66.906676],[169.584454,66.906195],[169.583685,66.905596],[169.582748,66.905055],[169.580695,66.903908],[169.577734,66.902265],[169.576496,66.901595],[169.575494,66.901047],[169.574556,66.900544],[169.5736,66.899808],[169.572719,66.898823],[169.572093,66.898092],[169.571708,66.896927],[169.571826,66.895331],[169.571797,66.894132],[169.571767,66.893176],[169.571618,66.891417],[169.571618,66.890648],[169.570253,66.889437],[169.569511,66.888854],[169.568843,66.888213],[169.568145,66.887421],[169.567923,66.887048],[169.567982,66.886174],[169.568042,66.885411],[169.56819,66.884164],[169.568546,66.882579],[169.568472,66.881921],[169.568413,66.881332],[169.568324,66.88058],[169.568205,66.880003],[169.568056,66.879374],[169.567908,66.878954],[169.567715,66.878488],[169.567359,66.878028],[169.566824,66.87741],[169.566053,66.87653],[169.565296,66.875673],[169.564672,66.874909],[169.564123,66.874175],[169.563633,66.873615],[169.563411,66.873096],[169.563262,66.872356],[169.563277,66.872164],[169.564361,66.870444],[169.564361,66.870181],[169.564153,66.869971],[169.563233,66.869214],[169.562728,66.86859],[169.560472,66.863884],[169.560205,66.863365],[169.559982,66.861977],[169.5597,66.859947],[169.559552,66.85916],[169.559522,66.858063],[169.559493,66.857538],[169.559255,66.856751],[169.559062,66.855847],[169.55881,66.855012],[169.558632,66.854412],[169.558409,66.853659],[169.558142,66.852871],[169.558008,66.852247],[169.557994,66.851868],[169.557964,66.851384],[169.55789,66.850998],[169.557771,66.850666],[169.557667,66.850222],[169.557593,66.849102],[169.557489,66.848659],[169.557355,66.847847],[169.557281,66.847375],[169.557281,66.84696],[169.5574,66.846283],[169.557474,66.845642],[169.557608,66.844865],[169.557756,66.844083],[169.55783,66.843745],[169.557845,66.843254],[169.557949,66.842828],[169.558008,66.842256],[169.558142,66.841252],[169.558186,66.839682],[169.558097,66.838235],[169.558083,66.836763],[169.558083,66.835923],[169.558023,66.835491],[169.557979,66.834983],[169.557815,66.834481],[169.557652,66.834002],[169.557385,66.833529],[169.557029,66.833155],[169.556346,66.832735],[169.551522,66.830574],[169.547307,66.828805],[169.546847,66.828665],[169.546684,66.828629],[169.546424,66.828627],[169.54609,66.828665],[169.545704,66.828802],[169.545185,66.828913],[169.544406,66.828957],[169.543879,66.828904],[169.54304,66.828749],[169.542558,66.828592],[169.542179,66.828443],[169.541979,66.82827],[169.541897,66.828078],[169.542031,66.827841],[169.542186,66.827578],[169.542253,66.827262],[169.542216,66.826859],[169.542149,66.82648],[169.542097,66.826211],[169.54203,66.825898],[169.541971,66.825332],[169.541941,66.824669],[169.541882,66.824307],[169.541815,66.82393],[169.541682,66.823501],[169.541541,66.823033],[169.5414,66.822616],[169.541162,66.822102],[169.540962,66.82159],[169.540836,66.821252],[169.54068,66.820834],[169.540531,66.82044],[169.540428,66.820165],[169.54016,66.819628],[169.539982,66.819242],[169.53976,66.818763],[169.53969,66.818549],[169.539515,66.818164],[169.538632,66.816449],[169.538335,66.81578],[169.537927,66.814848],[169.53766,66.814343],[169.537392,66.813539],[169.537274,66.81306],[169.537058,66.812265],[169.536865,66.81169],[169.536695,66.811354],[169.536457,66.810883],[169.536207,66.81041],[169.53586,66.809894],[169.535273,66.809034],[169.534811,66.808298],[169.534559,66.807815],[169.534265,66.807269],[169.533845,66.806563],[169.533405,66.805905],[169.533111,66.805451],[169.532817,66.805066],[169.532355,66.804583],[169.532019,66.804231],[169.531862,66.803979],[169.531788,66.803686],[169.531788,66.803458],[169.531568,66.801896],[169.531589,66.801643],[169.531725,66.801342],[169.532051,66.800866],[169.532502,66.800349],[169.533279,66.799622],[169.534402,66.798634],[169.535378,66.797728],[169.53628,66.796938],[169.536826,66.796467],[169.537613,66.796277],[169.538096,66.796227],[169.539408,66.796244],[169.54052,66.796293],[169.541685,66.796388],[169.542672,66.796525],[169.543396,66.796661],[169.54412,66.796823],[169.54476,66.796951],[169.545232,66.797025],[169.54561,66.797042],[169.546093,66.797025],[169.546513,66.796951],[169.54688,66.796839],[169.547216,66.796686],[169.54751,66.796417],[169.547783,66.796037],[169.548097,66.795657],[169.548345,66.795547],[169.549304,66.795107],[169.550763,66.794371],[169.551267,66.794069],[169.551414,66.793961],[169.551529,66.793754],[169.551729,66.792944],[169.551803,66.792521],[169.551886,66.792046],[169.552001,66.791314],[169.552043,66.79045],[169.552022,66.790107],[169.551928,66.789883],[169.55175,66.789734],[169.551424,66.789557],[169.550081,66.789184],[169.549295,66.788967],[169.547929,66.788601],[169.547394,66.788423],[169.547174,66.788299],[169.547153,66.788167],[169.547279,66.788005],[169.547625,66.78789],[169.548465,66.7876],[169.548643,66.787517],[169.548738,66.787422],[169.548769,66.787335],[169.548706,66.787224],[169.548423,66.786951],[169.54838,66.786917],[169.548097,66.786694],[169.547762,66.786413],[169.547594,66.786189],[169.54752,66.786028],[169.54752,66.785962],[169.54752,66.785883],[169.547646,66.785577],[169.547961,66.785184],[169.548255,66.784857],[169.548486,66.784551],[169.54857,66.784299],[169.548528,66.783989],[169.548433,66.783182],[169.548412,66.782859],[169.548454,66.782599],[169.548622,66.782259],[169.548727,66.782015],[169.548908,66.781804],[169.549,66.781697],[169.549388,66.781436],[169.549924,66.781134],[169.550753,66.780675],[169.551141,66.780385],[169.551403,66.780124],[169.551634,66.779826],[169.551771,66.779524],[169.55176,66.779284],[169.551687,66.779036],[169.551666,66.778498],[169.551634,66.778022],[169.551571,66.777646],[169.551519,66.777389],[169.551666,66.777042],[169.551727,66.776914],[169.55175,66.776868],[169.5524,66.776152],[169.552978,66.775469],[169.553334,66.774976],[169.553586,66.774381],[169.553796,66.773942],[169.554006,66.773636],[169.554184,66.773408],[169.554352,66.773126],[169.554436,66.772721],[169.554426,66.772266],[169.554426,66.771893],[169.554384,66.771587],[169.554268,66.771326],[169.553964,66.77104],[169.553639,66.770722],[169.553114,66.770254],[169.552789,66.769968],[169.552442,66.769616],[169.552127,66.769277],[169.552004,66.769125],[169.551939,66.769045],[169.551666,66.76871],[169.551582,66.768532],[169.551534,66.768312],[169.551477,66.768052],[169.55134,66.767696],[169.551214,66.767224],[169.551172,66.76695],[169.551078,66.766541],[169.55091,66.766147],[169.5507,66.765717],[169.550595,66.765373],[169.550522,66.765112],[169.550364,66.764827],[169.55027,66.764557],[169.55027,66.764342],[169.55028,66.764077],[169.550196,66.763845],[169.550028,66.763589],[169.54984,66.763328],[169.54963,66.763096],[169.549367,66.762707],[169.549157,66.762313],[169.549031,66.761941],[169.54901,66.761601],[169.548968,66.76132],[169.548906,66.761021],[169.548864,66.76057],[169.548811,66.760251],[169.548664,66.75997],[169.54857,66.7597],[169.548612,66.759402],[169.548759,66.758914],[169.548937,66.758595],[169.549147,66.758292],[169.549336,66.758044],[169.549451,66.757771],[169.549577,66.757323],[169.549682,66.756996],[169.549756,66.756673],[169.549525,66.756159],[169.54922,66.755667],[169.548832,66.755149],[169.548654,66.754859],[169.548601,66.754672],[169.548591,66.754445],[169.548538,66.754217],[169.548696,66.753914],[169.548769,66.753662],[169.548696,66.753451],[169.54837,66.75309],[169.547908,66.75278],[169.547604,66.752556],[169.547216,66.752212],[169.546849,66.751876],[169.546618,66.751657],[169.546502,66.751537],[169.546376,66.751408],[169.546187,66.751305],[169.545872,66.751201],[169.545442,66.751027],[169.544938,66.750795],[169.544319,66.750476],[169.543679,66.750132],[169.543091,66.749797],[169.542073,66.749271],[169.541853,66.748935],[169.541758,66.748711],[169.541685,66.748604],[169.541654,66.748455],[169.541654,66.748334],[169.541664,66.748177],[169.541601,66.748003],[169.541307,66.747821],[169.54095,66.747688],[169.541003,66.747597],[169.541013,66.747444],[169.541024,66.747261],[169.540856,66.74712],[169.540646,66.747004],[169.539827,66.746644],[169.539618,66.746561]]}}"
  },
  {
    "path": "app/src/main/assets/maine_polygon.geojson",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"name\": \"Polygon over Maine region\"\n      },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          [\n          [-67.13734, 45.13745],\n          [-66.96466, 44.8097],\n          [-68.03252, 44.3252],\n          [-69.06, 43.98],\n          [-70.11617, 43.68405],\n          [-70.64573, 43.09008],\n          [-70.75102, 43.08003],\n          [-70.79761, 43.21973],\n          [-70.98176, 43.36789],\n          [-70.94416, 43.46633],\n          [-71.08482, 45.30524],\n          [-70.66002, 45.46022],\n          [-70.30495, 45.91479],\n          [-70.00014, 46.69317],\n          [-69.23708, 47.44777],\n          [-68.90478, 47.18479],\n          [-68.2343, 47.35462],\n          [-67.79035, 47.06624],\n          [-67.79141, 45.70258],\n          [-67.13734, 45.13745]\n         ]\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "app/src/main/assets/multiple_geometry_example.geojson",
    "content": "{\n   \"type\":\"FeatureCollection\",\n   \"features\":[\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Takoma\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.018178,\n               38.976086\n            ]\n         },\n         \"id\":\"0ae7fd895624cc8f53d8d7a7e1266d26\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Brookland-CUA\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -76.994536,\n               38.933218\n            ]\n         },\n         \"id\":\"186e133e182f046b1e23b742b52000c4\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Friendship Heights\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.084998,\n               38.959491\n            ]\n         },\n         \"id\":\"2d9e49375605d7e80bb5fe0184f57421\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Fort Totten\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.002205,\n               38.951854\n            ]\n         },\n         \"id\":\"4d8934c588b5b3a49df98e8b405ffa92\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Tenleytown-AU\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.079589,\n               38.948859\n            ]\n         },\n         \"id\":\"5a8b14c4fd539a8a04713264f1d3a5eb\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Judiciary Sq\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.016641,\n               38.896098\n            ]\n         },\n         \"id\":\"5d0ef0a0bcd98b436545bbdc83c95c8c\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Woodley Park-Zoo Adams Morgan\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.05242,\n               38.925092\n            ]\n         },\n         \"id\":\"6d570a86a953fb761551644cfb21b2a4\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Rhode Island Ave\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -76.995939,\n               38.921067\n            ]\n         },\n         \"id\":\"7da63d4a9af4cf3f7ab04f36a26a0aa5\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Union metro-station\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.007416,\n               38.897773\n            ]\n         },\n         \"id\":\"8a43ffb29f3e1146e19e15d3291ab840\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Van Ness-UDC\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.062988,\n               38.943273\n            ]\n         },\n         \"id\":\"96a659edc000c1267f5f44c36b87b201\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Dupont Circle\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.043416,\n               38.909605\n            ]\n         },\n         \"id\":\"994446c244acadeb15d3f9fc18278c73\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Metro Center\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.02808,\n               38.898322\n            ]\n         },\n         \"id\":\"b82be4037a512e9ca43335ec6c0caf44\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Farragut North\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.039703,\n               38.903209\n            ]\n         },\n         \"id\":\"ba844cf983f766faeebd9dd35950be57\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Cleveland Park\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.058044,\n               38.93477\n            ]\n         },\n         \"id\":\"c2274c3347ca230ab96afbc7021e3192\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Gallery Pl-Chinatown\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.021917,\n               38.898324\n            ]\n         },\n         \"id\":\"ca44b6b9141375e291b1fd9bc243b4e3\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"NoMa - Gallaudet U\",\n            \"TYPE\":\"metro-station\"\n         },\n         \"geometry\":{\n            \"type\":\"Point\",\n            \"coordinates\":[\n               -77.003022,\n               38.907024\n            ]\n         },\n         \"id\":\"d0d9099ecafaf63d973e88b635998815\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"NAME\":\"Red\",\n            \"TYPE\":\"Rail line\"\n         },\n         \"geometry\":{\n            \"type\":\"LineString\",\n            \"coordinates\":[\n               [\n                  -77.020294,\n                  38.979839\n               ],\n               [\n                  -77.020057,\n                  38.979409\n               ],\n               [\n                  -77.019948,\n                  38.979213\n               ],\n               [\n                  -77.019934,\n                  38.979188\n               ],\n               [\n                  -77.01992,\n                  38.979163\n               ],\n               [\n                  -77.019906,\n                  38.979138\n               ],\n               [\n                  -77.019893,\n                  38.979112\n               ],\n               [\n                  -77.019879,\n                  38.979087\n               ],\n               [\n                  -77.019865,\n                  38.979062\n               ],\n               [\n                  -77.019851,\n                  38.979037\n               ],\n               [\n                  -77.019837,\n                  38.979012\n               ],\n               [\n                  -77.019823,\n                  38.978986\n               ],\n               [\n                  -77.019809,\n                  38.978961\n               ],\n               [\n                  -77.019708,\n                  38.978774\n               ],\n               [\n                  -77.019695,\n                  38.978749\n               ],\n               [\n                  -77.019681,\n                  38.978723\n               ],\n               [\n                  -77.019667,\n                  38.978698\n               ],\n               [\n                  -77.019654,\n                  38.978673\n               ],\n               [\n                  -77.01964,\n                  38.978647\n               ],\n               [\n                  -77.019627,\n                  38.978622\n               ],\n               [\n                  -77.019614,\n                  38.978597\n               ],\n               [\n                  -77.0196,\n                  38.978571\n               ],\n               [\n                  -77.019587,\n                  38.978546\n               ],\n               [\n                  -77.019573,\n                  38.97852\n               ],\n               [\n                  -77.019238,\n                  38.977889\n               ],\n               [\n                  -77.019225,\n                  38.977863\n               ],\n               [\n                  -77.019211,\n                  38.977838\n               ],\n               [\n                  -77.019198,\n                  38.977813\n               ],\n               [\n                  -77.019185,\n                  38.977787\n               ],\n               [\n                  -77.019171,\n                  38.977762\n               ],\n               [\n                  -77.019158,\n                  38.977737\n               ],\n               [\n                  -77.019144,\n                  38.977711\n               ],\n               [\n                  -77.019131,\n                  38.977686\n               ],\n               [\n                  -77.019117,\n                  38.977661\n               ],\n               [\n                  -77.019103,\n                  38.977635\n               ],\n               [\n                  -77.018905,\n                  38.977272\n               ],\n               [\n                  -77.018891,\n                  38.977246\n               ],\n               [\n                  -77.018877,\n                  38.977221\n               ],\n               [\n                  -77.018863,\n                  38.977196\n               ],\n               [\n                  -77.018849,\n                  38.977171\n               ],\n               [\n                  -77.018835,\n                  38.977146\n               ],\n               [\n                  -77.018821,\n                  38.977121\n               ],\n               [\n                  -77.018806,\n                  38.977096\n               ],\n               [\n                  -77.018792,\n                  38.97707\n               ],\n               [\n                  -77.018778,\n                  38.977045\n               ],\n               [\n                  -77.018764,\n                  38.97702\n               ],\n               [\n                  -77.018614,\n                  38.976753\n               ],\n               [\n                  -77.017765,\n                  38.975244\n               ],\n               [\n                  -77.01768,\n                  38.975092\n               ],\n               [\n                  -77.017666,\n                  38.975067\n               ],\n               [\n                  -77.017652,\n                  38.975042\n               ],\n               [\n                  -77.017638,\n                  38.975017\n               ],\n               [\n                  -77.017624,\n                  38.974992\n               ],\n               [\n                  -77.017609,\n                  38.974967\n               ],\n               [\n                  -77.017595,\n                  38.974942\n               ],\n               [\n                  -77.017581,\n                  38.974916\n               ],\n               [\n                  -77.017567,\n                  38.974891\n               ],\n               [\n                  -77.017553,\n                  38.974866\n               ],\n               [\n                  -77.017538,\n                  38.974841\n               ],\n               [\n                  -77.017248,\n                  38.974343\n               ],\n               [\n                  -77.017233,\n                  38.974318\n               ],\n               [\n                  -77.017218,\n                  38.974293\n               ],\n               [\n                  -77.017204,\n                  38.974268\n               ],\n               [\n                  -77.017189,\n                  38.974243\n               ],\n               [\n                  -77.017174,\n                  38.974218\n               ],\n               [\n                  -77.017159,\n                  38.974193\n               ],\n               [\n                  -77.017144,\n                  38.974169\n               ],\n               [\n                  -77.017129,\n                  38.974144\n               ],\n               [\n                  -77.017114,\n                  38.974119\n               ],\n               [\n                  -77.017099,\n                  38.974094\n               ],\n               [\n                  -77.01694,\n                  38.97383\n               ],\n               [\n                  -77.016925,\n                  38.973805\n               ],\n               [\n                  -77.01691,\n                  38.97378\n               ],\n               [\n                  -77.016895,\n                  38.973755\n               ],\n               [\n                  -77.01688,\n                  38.973731\n               ],\n               [\n                  -77.016865,\n                  38.973706\n               ],\n               [\n                  -77.01685,\n                  38.973681\n               ],\n               [\n                  -77.016835,\n                  38.973656\n               ],\n               [\n                  -77.01682,\n                  38.973631\n               ],\n               [\n                  -77.016805,\n                  38.973606\n               ],\n               [\n                  -77.01679,\n                  38.973581\n               ],\n               [\n                  -77.016499,\n                  38.97308\n               ],\n               [\n                  -77.016484,\n                  38.973055\n               ],\n               [\n                  -77.01647,\n                  38.97303\n               ],\n               [\n                  -77.016456,\n                  38.973005\n               ],\n               [\n                  -77.016442,\n                  38.97298\n               ],\n               [\n                  -77.016428,\n                  38.972955\n               ],\n               [\n                  -77.016413,\n                  38.97293\n               ],\n               [\n                  -77.016399,\n                  38.972904\n               ],\n               [\n                  -77.016385,\n                  38.972879\n               ],\n               [\n                  -77.016371,\n                  38.972854\n               ],\n               [\n                  -77.016357,\n                  38.972829\n               ],\n               [\n                  -77.014078,\n                  38.968776\n               ],\n               [\n                  -77.014036,\n                  38.9687\n               ],\n               [\n                  -77.013993,\n                  38.968625\n               ],\n               [\n                  -77.013951,\n                  38.968549\n               ],\n               [\n                  -77.013908,\n                  38.968474\n               ],\n               [\n                  -77.013864,\n                  38.968399\n               ],\n               [\n                  -77.013821,\n                  38.968323\n               ],\n               [\n                  -77.013777,\n                  38.968248\n               ],\n               [\n                  -77.013732,\n                  38.968174\n               ],\n               [\n                  -77.013687,\n                  38.968099\n               ],\n               [\n                  -77.013641,\n                  38.968024\n               ],\n               [\n                  -77.013447,\n                  38.967726\n               ],\n               [\n                  -77.013242,\n                  38.967432\n               ],\n               [\n                  -77.013024,\n                  38.967143\n               ],\n               [\n                  -77.012795,\n                  38.96686\n               ],\n               [\n                  -77.012555,\n                  38.966583\n               ],\n               [\n                  -77.012304,\n                  38.966312\n               ],\n               [\n                  -77.012041,\n                  38.966047\n               ],\n               [\n                  -77.011769,\n                  38.965789\n               ],\n               [\n                  -77.0117,\n                  38.965726\n               ],\n               [\n                  -77.01163,\n                  38.965664\n               ],\n               [\n                  -77.01156,\n                  38.965602\n               ],\n               [\n                  -77.01149,\n                  38.96554\n               ],\n               [\n                  -77.011419,\n                  38.965479\n               ],\n               [\n                  -77.011348,\n                  38.965418\n               ],\n               [\n                  -77.011277,\n                  38.965357\n               ],\n               [\n                  -77.011205,\n                  38.965296\n               ],\n               [\n                  -77.011134,\n                  38.965236\n               ],\n               [\n                  -77.011062,\n                  38.965175\n               ],\n               [\n                  -77.008385,\n                  38.962908\n               ],\n               [\n                  -77.008326,\n                  38.962857\n               ],\n               [\n                  -77.008266,\n                  38.962807\n               ],\n               [\n                  -77.008207,\n                  38.962756\n               ],\n               [\n                  -77.008148,\n                  38.962706\n               ],\n               [\n                  -77.008089,\n                  38.962655\n               ],\n               [\n                  -77.00803,\n                  38.962604\n               ],\n               [\n                  -77.007971,\n                  38.962553\n               ],\n               [\n                  -77.007912,\n                  38.962502\n               ],\n               [\n                  -77.007854,\n                  38.962451\n               ],\n               [\n                  -77.007796,\n                  38.9624\n               ],\n               [\n                  -77.007463,\n                  38.962091\n               ],\n               [\n                  -77.007143,\n                  38.961775\n               ],\n               [\n                  -77.006835,\n                  38.96145\n               ],\n               [\n                  -77.006542,\n                  38.961118\n               ],\n               [\n                  -77.006262,\n                  38.960779\n               ],\n               [\n                  -77.005996,\n                  38.960433\n               ],\n               [\n                  -77.005745,\n                  38.96008\n               ],\n               [\n                  -77.005509,\n                  38.959721\n               ],\n               [\n                  -77.005288,\n                  38.959356\n               ],\n               [\n                  -77.005081,\n                  38.958986\n               ],\n               [\n                  -77.004891,\n                  38.958611\n               ],\n               [\n                  -77.004716,\n                  38.958232\n               ],\n               [\n                  -77.004687,\n                  38.958167\n               ],\n               [\n                  -77.00466,\n                  38.958102\n               ],\n               [\n                  -77.004632,\n                  38.958037\n               ],\n               [\n                  -77.004605,\n                  38.957972\n               ],\n               [\n                  -77.004578,\n                  38.957906\n               ],\n               [\n                  -77.004552,\n                  38.957841\n               ],\n               [\n                  -77.004525,\n                  38.957776\n               ],\n               [\n                  -77.004499,\n                  38.95771\n               ],\n               [\n                  -77.004473,\n                  38.957645\n               ],\n               [\n                  -77.004447,\n                  38.957579\n               ],\n               [\n                  -77.003667,\n                  38.955625\n               ],\n               [\n                  -77.003651,\n                  38.955586\n               ],\n               [\n                  -77.003635,\n                  38.955547\n               ],\n               [\n                  -77.00362,\n                  38.955507\n               ],\n               [\n                  -77.003604,\n                  38.955468\n               ],\n               [\n                  -77.003588,\n                  38.955429\n               ],\n               [\n                  -77.003573,\n                  38.955389\n               ],\n               [\n                  -77.003557,\n                  38.95535\n               ],\n               [\n                  -77.003542,\n                  38.955311\n               ],\n               [\n                  -77.003526,\n                  38.955271\n               ],\n               [\n                  -77.003511,\n                  38.955232\n               ],\n               [\n                  -77.003332,\n                  38.954746\n               ],\n               [\n                  -77.003318,\n                  38.954706\n               ],\n               [\n                  -77.003304,\n                  38.954666\n               ],\n               [\n                  -77.00329,\n                  38.954627\n               ],\n               [\n                  -77.003277,\n                  38.954587\n               ],\n               [\n                  -77.003263,\n                  38.954547\n               ],\n               [\n                  -77.00325,\n                  38.954507\n               ],\n               [\n                  -77.003236,\n                  38.954468\n               ],\n               [\n                  -77.003222,\n                  38.954428\n               ],\n               [\n                  -77.003209,\n                  38.954388\n               ],\n               [\n                  -77.003195,\n                  38.954348\n               ],\n               [\n                  -77.003084,\n                  38.954019\n               ],\n               [\n                  -77.00307,\n                  38.953979\n               ],\n               [\n                  -77.003057,\n                  38.953939\n               ],\n               [\n                  -77.003043,\n                  38.953899\n               ],\n               [\n                  -77.00303,\n                  38.953859\n               ],\n               [\n                  -77.003016,\n                  38.95382\n               ],\n               [\n                  -77.003003,\n                  38.95378\n               ],\n               [\n                  -77.002989,\n                  38.95374\n               ],\n               [\n                  -77.002975,\n                  38.9537\n               ],\n               [\n                  -77.002961,\n                  38.953661\n               ],\n               [\n                  -77.002947,\n                  38.953621\n               ],\n               [\n                  -77.00277,\n                  38.953139\n               ],\n               [\n                  -77.002755,\n                  38.9531\n               ],\n               [\n                  -77.002739,\n                  38.953061\n               ],\n               [\n                  -77.002724,\n                  38.953021\n               ],\n               [\n                  -77.002708,\n                  38.952982\n               ],\n               [\n                  -77.002693,\n                  38.952942\n               ],\n               [\n                  -77.002677,\n                  38.952903\n               ],\n               [\n                  -77.002662,\n                  38.952864\n               ],\n               [\n                  -77.002646,\n                  38.952824\n               ],\n               [\n                  -77.00263,\n                  38.952785\n               ],\n               [\n                  -77.002614,\n                  38.952746\n               ],\n               [\n                  -77.002614,\n                  38.952745\n               ],\n               [\n                  -77.002545,\n                  38.952572\n               ],\n               [\n                  -77.001925,\n                  38.951018\n               ],\n               [\n                  -77.001917,\n                  38.950998\n               ],\n               [\n                  -77.001914,\n                  38.950992\n               ],\n               [\n                  -77.001904,\n                  38.950966\n               ],\n               [\n                  -77.001893,\n                  38.950939\n               ],\n               [\n                  -77.001883,\n                  38.950913\n               ],\n               [\n                  -77.001872,\n                  38.950887\n               ],\n               [\n                  -77.001862,\n                  38.950861\n               ],\n               [\n                  -77.001851,\n                  38.950835\n               ],\n               [\n                  -77.001841,\n                  38.950808\n               ],\n               [\n                  -77.00183,\n                  38.950782\n               ],\n               [\n                  -77.00182,\n                  38.950756\n               ],\n               [\n                  -77.001661,\n                  38.950366\n               ],\n               [\n                  -77.001651,\n                  38.95034\n               ],\n               [\n                  -77.00164,\n                  38.950314\n               ],\n               [\n                  -77.001629,\n                  38.950288\n               ],\n               [\n                  -77.001618,\n                  38.950262\n               ],\n               [\n                  -77.001607,\n                  38.950236\n               ],\n               [\n                  -77.001597,\n                  38.95021\n               ],\n               [\n                  -77.001586,\n                  38.950184\n               ],\n               [\n                  -77.001575,\n                  38.950157\n               ],\n               [\n                  -77.001564,\n                  38.950131\n               ],\n               [\n                  -77.001553,\n                  38.950105\n               ],\n               [\n                  -76.999744,\n                  38.94574\n               ],\n               [\n                  -76.999734,\n                  38.945714\n               ],\n               [\n                  -76.999723,\n                  38.945688\n               ],\n               [\n                  -76.999712,\n                  38.945662\n               ],\n               [\n                  -76.999701,\n                  38.945636\n               ],\n               [\n                  -76.99969,\n                  38.94561\n               ],\n               [\n                  -76.999679,\n                  38.945584\n               ],\n               [\n                  -76.999668,\n                  38.945558\n               ],\n               [\n                  -76.999658,\n                  38.945532\n               ],\n               [\n                  -76.999647,\n                  38.945505\n               ],\n               [\n                  -76.999636,\n                  38.945479\n               ],\n               [\n                  -76.999202,\n                  38.944488\n               ],\n               [\n                  -76.999191,\n                  38.944462\n               ],\n               [\n                  -76.999179,\n                  38.944436\n               ],\n               [\n                  -76.999167,\n                  38.94441\n               ],\n               [\n                  -76.999155,\n                  38.944384\n               ],\n               [\n                  -76.999143,\n                  38.944359\n               ],\n               [\n                  -76.999131,\n                  38.944333\n               ],\n               [\n                  -76.999119,\n                  38.944307\n               ],\n               [\n                  -76.999108,\n                  38.944281\n               ],\n               [\n                  -76.999096,\n                  38.944255\n               ],\n               [\n                  -76.999084,\n                  38.944229\n               ],\n               [\n                  -76.99879,\n                  38.943592\n               ],\n               [\n                  -76.998779,\n                  38.943566\n               ],\n               [\n                  -76.998767,\n                  38.94354\n               ],\n               [\n                  -76.998755,\n                  38.943514\n               ],\n               [\n                  -76.998743,\n                  38.943489\n               ],\n               [\n                  -76.998731,\n                  38.943463\n               ],\n               [\n                  -76.998719,\n                  38.943437\n               ],\n               [\n                  -76.998707,\n                  38.943411\n               ],\n               [\n                  -76.998696,\n                  38.943385\n               ],\n               [\n                  -76.998684,\n                  38.943359\n               ],\n               [\n                  -76.998672,\n                  38.943333\n               ],\n               [\n                  -76.998239,\n                  38.942342\n               ],\n               [\n                  -76.998228,\n                  38.942316\n               ],\n               [\n                  -76.998217,\n                  38.94229\n               ],\n               [\n                  -76.998206,\n                  38.942264\n               ],\n               [\n                  -76.998195,\n                  38.942238\n               ],\n               [\n                  -76.998184,\n                  38.942212\n               ],\n               [\n                  -76.998173,\n                  38.942185\n               ],\n               [\n                  -76.998162,\n                  38.942159\n               ],\n               [\n                  -76.998152,\n                  38.942133\n               ],\n               [\n                  -76.998141,\n                  38.942107\n               ],\n               [\n                  -76.99813,\n                  38.942081\n               ],\n               [\n                  -76.996692,\n                  38.93861\n               ],\n               [\n                  -76.995351,\n                  38.935374\n               ],\n               [\n                  -76.995338,\n                  38.935343\n               ],\n               [\n                  -76.995325,\n                  38.935312\n               ],\n               [\n                  -76.995312,\n                  38.93528\n               ],\n               [\n                  -76.995299,\n                  38.935249\n               ],\n               [\n                  -76.995286,\n                  38.935218\n               ],\n               [\n                  -76.995273,\n                  38.935186\n               ],\n               [\n                  -76.995261,\n                  38.935155\n               ],\n               [\n                  -76.995248,\n                  38.935123\n               ],\n               [\n                  -76.995235,\n                  38.935092\n               ],\n               [\n                  -76.995222,\n                  38.935061\n               ],\n               [\n                  -76.995018,\n                  38.934521\n               ],\n               [\n                  -76.994835,\n                  38.933977\n               ],\n               [\n                  -76.994817,\n                  38.933915\n               ],\n               [\n                  -76.994674,\n                  38.933429\n               ],\n               [\n                  -76.994535,\n                  38.932877\n               ],\n               [\n                  -76.994418,\n                  38.932322\n               ],\n               [\n                  -76.994415,\n                  38.932308\n               ],\n               [\n                  -76.994412,\n                  38.932289\n               ],\n               [\n                  -76.994405,\n                  38.932256\n               ],\n               [\n                  -76.994399,\n                  38.932224\n               ],\n               [\n                  -76.994393,\n                  38.932191\n               ],\n               [\n                  -76.994388,\n                  38.932159\n               ],\n               [\n                  -76.994382,\n                  38.932126\n               ],\n               [\n                  -76.994376,\n                  38.932093\n               ],\n               [\n                  -76.99437,\n                  38.932061\n               ],\n               [\n                  -76.994364,\n                  38.932028\n               ],\n               [\n                  -76.994358,\n                  38.931996\n               ],\n               [\n                  -76.994189,\n                  38.931045\n               ],\n               [\n                  -76.994179,\n                  38.93099\n               ],\n               [\n                  -76.99417,\n                  38.930936\n               ],\n               [\n                  -76.99416,\n                  38.930882\n               ],\n               [\n                  -76.994151,\n                  38.930827\n               ],\n               [\n                  -76.994141,\n                  38.930773\n               ],\n               [\n                  -76.994132,\n                  38.930718\n               ],\n               [\n                  -76.994123,\n                  38.930664\n               ],\n               [\n                  -76.994114,\n                  38.930609\n               ],\n               [\n                  -76.994106,\n                  38.930555\n               ],\n               [\n                  -76.994098,\n                  38.9305\n               ],\n               [\n                  -76.994079,\n                  38.930364\n               ],\n               [\n                  -76.994072,\n                  38.930309\n               ],\n               [\n                  -76.994065,\n                  38.930255\n               ],\n               [\n                  -76.994059,\n                  38.9302\n               ],\n               [\n                  -76.994053,\n                  38.930145\n               ],\n               [\n                  -76.994047,\n                  38.93009\n               ],\n               [\n                  -76.994041,\n                  38.930036\n               ],\n               [\n                  -76.994035,\n                  38.929981\n               ],\n               [\n                  -76.99403,\n                  38.929926\n               ],\n               [\n                  -76.994024,\n                  38.929872\n               ],\n               [\n                  -76.994019,\n                  38.929817\n               ],\n               [\n                  -76.993868,\n                  38.928292\n               ],\n               [\n                  -76.99386,\n                  38.928209\n               ],\n               [\n                  -76.993852,\n                  38.928127\n               ],\n               [\n                  -76.993844,\n                  38.928045\n               ],\n               [\n                  -76.993837,\n                  38.927963\n               ],\n               [\n                  -76.99383,\n                  38.927881\n               ],\n               [\n                  -76.993824,\n                  38.927799\n               ],\n               [\n                  -76.993818,\n                  38.927717\n               ],\n               [\n                  -76.993814,\n                  38.927636\n               ],\n               [\n                  -76.99381,\n                  38.927554\n               ],\n               [\n                  -76.993808,\n                  38.927472\n               ],\n               [\n                  -76.993808,\n                  38.927241\n               ],\n               [\n                  -76.993817,\n                  38.92701\n               ],\n               [\n                  -76.993837,\n                  38.926779\n               ],\n               [\n                  -76.993867,\n                  38.926549\n               ],\n               [\n                  -76.993906,\n                  38.926321\n               ],\n               [\n                  -76.993956,\n                  38.926093\n               ],\n               [\n                  -76.994015,\n                  38.925866\n               ],\n               [\n                  -76.994084,\n                  38.925642\n               ],\n               [\n                  -76.994111,\n                  38.925563\n               ],\n               [\n                  -76.994139,\n                  38.925484\n               ],\n               [\n                  -76.994168,\n                  38.925405\n               ],\n               [\n                  -76.994198,\n                  38.925326\n               ],\n               [\n                  -76.994228,\n                  38.925247\n               ],\n               [\n                  -76.994259,\n                  38.925169\n               ],\n               [\n                  -76.994291,\n                  38.925091\n               ],\n               [\n                  -76.994323,\n                  38.925012\n               ],\n               [\n                  -76.994355,\n                  38.924934\n               ],\n               [\n                  -76.994387,\n                  38.924855\n               ],\n               [\n                  -76.995684,\n                  38.921716\n               ],\n               [\n                  -76.996332,\n                  38.920148\n               ],\n               [\n                  -76.996518,\n                  38.919699\n               ],\n               [\n                  -76.996612,\n                  38.919472\n               ],\n               [\n                  -76.996634,\n                  38.91942\n               ],\n               [\n                  -76.996655,\n                  38.919368\n               ],\n               [\n                  -76.996677,\n                  38.919315\n               ],\n               [\n                  -76.996699,\n                  38.919263\n               ],\n               [\n                  -76.996722,\n                  38.919211\n               ],\n               [\n                  -76.996745,\n                  38.919159\n               ],\n               [\n                  -76.996768,\n                  38.919107\n               ],\n               [\n                  -76.996791,\n                  38.919056\n               ],\n               [\n                  -76.996816,\n                  38.919004\n               ],\n               [\n                  -76.996841,\n                  38.918953\n               ],\n               [\n                  -76.996918,\n                  38.918806\n               ],\n               [\n                  -76.997001,\n                  38.91866\n               ],\n               [\n                  -76.99709,\n                  38.918517\n               ],\n               [\n                  -76.997122,\n                  38.918468\n               ],\n               [\n                  -76.997155,\n                  38.91842\n               ],\n               [\n                  -76.997188,\n                  38.918371\n               ],\n               [\n                  -76.997222,\n                  38.918323\n               ],\n               [\n                  -76.997256,\n                  38.918275\n               ],\n               [\n                  -76.997291,\n                  38.918228\n               ],\n               [\n                  -76.997326,\n                  38.91818\n               ],\n               [\n                  -76.997361,\n                  38.918132\n               ],\n               [\n                  -76.997396,\n                  38.918085\n               ],\n               [\n                  -76.997432,\n                  38.918037\n               ],\n               [\n                  -76.997642,\n                  38.917755\n               ],\n               [\n                  -76.997687,\n                  38.917695\n               ],\n               [\n                  -76.997731,\n                  38.917636\n               ],\n               [\n                  -76.997775,\n                  38.917576\n               ],\n               [\n                  -76.997819,\n                  38.917517\n               ],\n               [\n                  -76.997862,\n                  38.917457\n               ],\n               [\n                  -76.997905,\n                  38.917398\n               ],\n               [\n                  -76.997948,\n                  38.917338\n               ],\n               [\n                  -76.997991,\n                  38.917277\n               ],\n               [\n                  -76.998032,\n                  38.917217\n               ],\n               [\n                  -76.998074,\n                  38.917157\n               ],\n               [\n                  -76.998227,\n                  38.916919\n               ],\n               [\n                  -76.998371,\n                  38.916677\n               ],\n               [\n                  -76.998406,\n                  38.916615\n               ],\n               [\n                  -76.998441,\n                  38.916551\n               ],\n               [\n                  -76.998475,\n                  38.916488\n               ],\n               [\n                  -76.998509,\n                  38.916425\n               ],\n               [\n                  -76.998542,\n                  38.916361\n               ],\n               [\n                  -76.998575,\n                  38.916298\n               ],\n               [\n                  -76.998608,\n                  38.916234\n               ],\n               [\n                  -76.99864,\n                  38.91617\n               ],\n               [\n                  -76.998672,\n                  38.916106\n               ],\n               [\n                  -76.998705,\n                  38.916042\n               ],\n               [\n                  -76.999284,\n                  38.914894\n               ],\n               [\n                  -77.002237,\n                  38.909038\n               ],\n               [\n                  -77.002269,\n                  38.908975\n               ],\n               [\n                  -77.0023,\n                  38.908912\n               ],\n               [\n                  -77.002332,\n                  38.90885\n               ],\n               [\n                  -77.002363,\n                  38.908787\n               ],\n               [\n                  -77.002394,\n                  38.908724\n               ],\n               [\n                  -77.002424,\n                  38.908661\n               ],\n               [\n                  -77.002455,\n                  38.908598\n               ],\n               [\n                  -77.002484,\n                  38.908535\n               ],\n               [\n                  -77.002513,\n                  38.908472\n               ],\n               [\n                  -77.002542,\n                  38.908409\n               ],\n               [\n                  -77.002618,\n                  38.908231\n               ],\n               [\n                  -77.002689,\n                  38.908053\n               ],\n               [\n                  -77.002713,\n                  38.907988\n               ],\n               [\n                  -77.002737,\n                  38.907924\n               ],\n               [\n                  -77.00276,\n                  38.907859\n               ],\n               [\n                  -77.002782,\n                  38.907794\n               ],\n               [\n                  -77.002804,\n                  38.907729\n               ],\n               [\n                  -77.002826,\n                  38.907664\n               ],\n               [\n                  -77.002848,\n                  38.907599\n               ],\n               [\n                  -77.002869,\n                  38.907534\n               ],\n               [\n                  -77.00289,\n                  38.907468\n               ],\n               [\n                  -77.002912,\n                  38.907403\n               ],\n               [\n                  -77.003043,\n                  38.906997\n               ],\n               [\n                  -77.003052,\n                  38.906971\n               ],\n               [\n                  -77.003061,\n                  38.906944\n               ],\n               [\n                  -77.003069,\n                  38.906917\n               ],\n               [\n                  -77.003078,\n                  38.906891\n               ],\n               [\n                  -77.003087,\n                  38.906864\n               ],\n               [\n                  -77.003095,\n                  38.906838\n               ],\n               [\n                  -77.003104,\n                  38.906811\n               ],\n               [\n                  -77.003113,\n                  38.906784\n               ],\n               [\n                  -77.003122,\n                  38.906758\n               ],\n               [\n                  -77.00313,\n                  38.906731\n               ],\n               [\n                  -77.003213,\n                  38.90649\n               ],\n               [\n                  -77.003222,\n                  38.906463\n               ],\n               [\n                  -77.003232,\n                  38.906437\n               ],\n               [\n                  -77.003241,\n                  38.90641\n               ],\n               [\n                  -77.003251,\n                  38.906384\n               ],\n               [\n                  -77.00326,\n                  38.906357\n               ],\n               [\n                  -77.00327,\n                  38.906331\n               ],\n               [\n                  -77.003279,\n                  38.906305\n               ],\n               [\n                  -77.003289,\n                  38.906278\n               ],\n               [\n                  -77.003298,\n                  38.906252\n               ],\n               [\n                  -77.003308,\n                  38.906225\n               ],\n               [\n                  -77.003863,\n                  38.904683\n               ],\n               [\n                  -77.003892,\n                  38.904604\n               ],\n               [\n                  -77.003921,\n                  38.904525\n               ],\n               [\n                  -77.00395,\n                  38.904446\n               ],\n               [\n                  -77.003979,\n                  38.904367\n               ],\n               [\n                  -77.004009,\n                  38.904289\n               ],\n               [\n                  -77.00404,\n                  38.90421\n               ],\n               [\n                  -77.004073,\n                  38.904132\n               ],\n               [\n                  -77.004106,\n                  38.904055\n               ],\n               [\n                  -77.00414,\n                  38.903977\n               ],\n               [\n                  -77.004176,\n                  38.903901\n               ],\n               [\n                  -77.004246,\n                  38.903763\n               ],\n               [\n                  -77.00432,\n                  38.903628\n               ],\n               [\n                  -77.0044,\n                  38.903494\n               ],\n               [\n                  -77.004485,\n                  38.903363\n               ],\n               [\n                  -77.004535,\n                  38.903291\n               ],\n               [\n                  -77.004586,\n                  38.903219\n               ],\n               [\n                  -77.004638,\n                  38.903148\n               ],\n               [\n                  -77.004691,\n                  38.903078\n               ],\n               [\n                  -77.004745,\n                  38.903008\n               ],\n               [\n                  -77.004801,\n                  38.902938\n               ],\n               [\n                  -77.004856,\n                  38.902868\n               ],\n               [\n                  -77.004913,\n                  38.902799\n               ],\n               [\n                  -77.004969,\n                  38.902729\n               ],\n               [\n                  -77.005026,\n                  38.90266\n               ],\n               [\n                  -77.005336,\n                  38.902282\n               ],\n               [\n                  -77.005404,\n                  38.902199\n               ],\n               [\n                  -77.005469,\n                  38.902119\n               ],\n               [\n                  -77.005534,\n                  38.902039\n               ],\n               [\n                  -77.005599,\n                  38.901959\n               ],\n               [\n                  -77.005663,\n                  38.901879\n               ],\n               [\n                  -77.005726,\n                  38.901798\n               ],\n               [\n                  -77.005788,\n                  38.901716\n               ],\n               [\n                  -77.005849,\n                  38.901634\n               ],\n               [\n                  -77.005908,\n                  38.901552\n               ],\n               [\n                  -77.005966,\n                  38.901468\n               ],\n               [\n                  -77.006021,\n                  38.901384\n               ],\n               [\n                  -77.006092,\n                  38.90127\n               ],\n               [\n                  -77.006158,\n                  38.901154\n               ],\n               [\n                  -77.006221,\n                  38.901037\n               ],\n               [\n                  -77.006264,\n                  38.900948\n               ],\n               [\n                  -77.006306,\n                  38.900859\n               ],\n               [\n                  -77.006346,\n                  38.90077\n               ],\n               [\n                  -77.006384,\n                  38.90068\n               ],\n               [\n                  -77.00642,\n                  38.900589\n               ],\n               [\n                  -77.006456,\n                  38.900499\n               ],\n               [\n                  -77.00649,\n                  38.900408\n               ],\n               [\n                  -77.006523,\n                  38.900317\n               ],\n               [\n                  -77.006557,\n                  38.900226\n               ],\n               [\n                  -77.006589,\n                  38.900135\n               ],\n               [\n                  -77.007249,\n                  38.898302\n               ],\n               [\n                  -77.007819,\n                  38.896718\n               ],\n               [\n                  -77.007874,\n                  38.896565\n               ],\n               [\n                  -77.007894,\n                  38.896507\n               ],\n               [\n                  -77.007916,\n                  38.896449\n               ],\n               [\n                  -77.007937,\n                  38.896391\n               ],\n               [\n                  -77.007959,\n                  38.896333\n               ],\n               [\n                  -77.007983,\n                  38.896275\n               ],\n               [\n                  -77.008007,\n                  38.896218\n               ],\n               [\n                  -77.008032,\n                  38.896161\n               ],\n               [\n                  -77.008059,\n                  38.896104\n               ],\n               [\n                  -77.008088,\n                  38.896048\n               ],\n               [\n                  -77.008118,\n                  38.895993\n               ],\n               [\n                  -77.008157,\n                  38.895928\n               ],\n               [\n                  -77.008199,\n                  38.895864\n               ],\n               [\n                  -77.008243,\n                  38.895802\n               ],\n               [\n                  -77.00829,\n                  38.895741\n               ],\n               [\n                  -77.008339,\n                  38.895681\n               ],\n               [\n                  -77.008392,\n                  38.895622\n               ],\n               [\n                  -77.008447,\n                  38.895565\n               ],\n               [\n                  -77.008504,\n                  38.89551\n               ],\n               [\n                  -77.008564,\n                  38.895455\n               ],\n               [\n                  -77.008626,\n                  38.895403\n               ],\n               [\n                  -77.00869,\n                  38.895352\n               ],\n               [\n                  -77.008757,\n                  38.895303\n               ],\n               [\n                  -77.008825,\n                  38.895256\n               ],\n               [\n                  -77.008896,\n                  38.895211\n               ],\n               [\n                  -77.008969,\n                  38.895168\n               ],\n               [\n                  -77.009043,\n                  38.895126\n               ],\n               [\n                  -77.00912,\n                  38.895087\n               ],\n               [\n                  -77.009198,\n                  38.89505\n               ],\n               [\n                  -77.009277,\n                  38.895015\n               ],\n               [\n                  -77.009358,\n                  38.894982\n               ],\n               [\n                  -77.009441,\n                  38.894951\n               ],\n               [\n                  -77.009525,\n                  38.894923\n               ],\n               [\n                  -77.00961,\n                  38.894896\n               ],\n               [\n                  -77.009696,\n                  38.894873\n               ],\n               [\n                  -77.009783,\n                  38.894851\n               ],\n               [\n                  -77.009871,\n                  38.894832\n               ],\n               [\n                  -77.00996,\n                  38.894815\n               ],\n               [\n                  -77.010049,\n                  38.894801\n               ],\n               [\n                  -77.010139,\n                  38.894788\n               ],\n               [\n                  -77.01023,\n                  38.894779\n               ],\n               [\n                  -77.010307,\n                  38.894773\n               ],\n               [\n                  -77.010384,\n                  38.894768\n               ],\n               [\n                  -77.010461,\n                  38.894765\n               ],\n               [\n                  -77.010538,\n                  38.894763\n               ],\n               [\n                  -77.010616,\n                  38.894762\n               ],\n               [\n                  -77.010693,\n                  38.894762\n               ],\n               [\n                  -77.01077,\n                  38.894762\n               ],\n               [\n                  -77.010847,\n                  38.894763\n               ],\n               [\n                  -77.010925,\n                  38.894765\n               ],\n               [\n                  -77.011002,\n                  38.894767\n               ],\n               [\n                  -77.013428,\n                  38.89482\n               ],\n               [\n                  -77.013512,\n                  38.894822\n               ],\n               [\n                  -77.013595,\n                  38.894824\n               ],\n               [\n                  -77.013679,\n                  38.894827\n               ],\n               [\n                  -77.013762,\n                  38.89483\n               ],\n               [\n                  -77.013846,\n                  38.894834\n               ],\n               [\n                  -77.013929,\n                  38.894839\n               ],\n               [\n                  -77.014012,\n                  38.894845\n               ],\n               [\n                  -77.014095,\n                  38.894852\n               ],\n               [\n                  -77.014178,\n                  38.894862\n               ],\n               [\n                  -77.01426,\n                  38.894873\n               ],\n               [\n                  -77.014345,\n                  38.894886\n               ],\n               [\n                  -77.014429,\n                  38.894902\n               ],\n               [\n                  -77.014512,\n                  38.89492\n               ],\n               [\n                  -77.014594,\n                  38.89494\n               ],\n               [\n                  -77.014676,\n                  38.894962\n               ],\n               [\n                  -77.014756,\n                  38.894986\n               ],\n               [\n                  -77.014836,\n                  38.895012\n               ],\n               [\n                  -77.014914,\n                  38.89504\n               ],\n               [\n                  -77.014991,\n                  38.89507\n               ],\n               [\n                  -77.015067,\n                  38.895102\n               ],\n               [\n                  -77.015142,\n                  38.895136\n               ],\n               [\n                  -77.015215,\n                  38.895172\n               ],\n               [\n                  -77.015284,\n                  38.895208\n               ],\n               [\n                  -77.015352,\n                  38.895246\n               ],\n               [\n                  -77.015419,\n                  38.895285\n               ],\n               [\n                  -77.015485,\n                  38.895326\n               ],\n               [\n                  -77.01555,\n                  38.895367\n               ],\n               [\n                  -77.015613,\n                  38.895409\n               ],\n               [\n                  -77.015677,\n                  38.895452\n               ],\n               [\n                  -77.015739,\n                  38.895495\n               ],\n               [\n                  -77.015801,\n                  38.895539\n               ],\n               [\n                  -77.015864,\n                  38.895582\n               ],\n               [\n                  -77.016004,\n                  38.89568\n               ],\n               [\n                  -77.017569,\n                  38.896783\n               ],\n               [\n                  -77.018529,\n                  38.89746\n               ],\n               [\n                  -77.018551,\n                  38.897475\n               ],\n               [\n                  -77.018617,\n                  38.897521\n               ],\n               [\n                  -77.018682,\n                  38.897567\n               ],\n               [\n                  -77.018748,\n                  38.897612\n               ],\n               [\n                  -77.018814,\n                  38.897657\n               ],\n               [\n                  -77.018881,\n                  38.897702\n               ],\n               [\n                  -77.018948,\n                  38.897746\n               ],\n               [\n                  -77.019017,\n                  38.897789\n               ],\n               [\n                  -77.019086,\n                  38.897831\n               ],\n               [\n                  -77.019156,\n                  38.897872\n               ],\n               [\n                  -77.019228,\n                  38.897912\n               ],\n               [\n                  -77.019324,\n                  38.897962\n               ],\n               [\n                  -77.019423,\n                  38.89801\n               ],\n               [\n                  -77.019523,\n                  38.898055\n               ],\n               [\n                  -77.019626,\n                  38.898097\n               ],\n               [\n                  -77.01973,\n                  38.898136\n               ],\n               [\n                  -77.019836,\n                  38.898173\n               ],\n               [\n                  -77.019943,\n                  38.898207\n               ],\n               [\n                  -77.020052,\n                  38.898238\n               ],\n               [\n                  -77.020162,\n                  38.898266\n               ],\n               [\n                  -77.020273,\n                  38.898291\n               ],\n               [\n                  -77.020385,\n                  38.898313\n               ],\n               [\n                  -77.020498,\n                  38.898333\n               ],\n               [\n                  -77.020612,\n                  38.898349\n               ],\n               [\n                  -77.020727,\n                  38.898362\n               ],\n               [\n                  -77.020814,\n                  38.89837\n               ],\n               [\n                  -77.020901,\n                  38.898376\n               ],\n               [\n                  -77.020989,\n                  38.898381\n               ],\n               [\n                  -77.021077,\n                  38.898385\n               ],\n               [\n                  -77.021165,\n                  38.898388\n               ],\n               [\n                  -77.021252,\n                  38.89839\n               ],\n               [\n                  -77.02134,\n                  38.898391\n               ],\n               [\n                  -77.021428,\n                  38.898391\n               ],\n               [\n                  -77.021516,\n                  38.898392\n               ],\n               [\n                  -77.021604,\n                  38.898392\n               ],\n               [\n                  -77.021744,\n                  38.898392\n               ],\n               [\n                  -77.023852,\n                  38.898393\n               ],\n               [\n                  -77.02415,\n                  38.898393\n               ],\n               [\n                  -77.024185,\n                  38.898393\n               ],\n               [\n                  -77.02422,\n                  38.898393\n               ],\n               [\n                  -77.024255,\n                  38.898393\n               ],\n               [\n                  -77.02429,\n                  38.898392\n               ],\n               [\n                  -77.024325,\n                  38.898392\n               ],\n               [\n                  -77.02436,\n                  38.898392\n               ],\n               [\n                  -77.024395,\n                  38.898392\n               ],\n               [\n                  -77.024431,\n                  38.898392\n               ],\n               [\n                  -77.024466,\n                  38.898392\n               ],\n               [\n                  -77.024501,\n                  38.898392\n               ],\n               [\n                  -77.024918,\n                  38.898385\n               ],\n               [\n                  -77.024953,\n                  38.898384\n               ],\n               [\n                  -77.024988,\n                  38.898383\n               ],\n               [\n                  -77.025023,\n                  38.898382\n               ],\n               [\n                  -77.025059,\n                  38.898381\n               ],\n               [\n                  -77.025094,\n                  38.89838\n               ],\n               [\n                  -77.025129,\n                  38.898378\n               ],\n               [\n                  -77.025164,\n                  38.898377\n               ],\n               [\n                  -77.025199,\n                  38.898376\n               ],\n               [\n                  -77.025234,\n                  38.898375\n               ],\n               [\n                  -77.025269,\n                  38.898374\n               ],\n               [\n                  -77.02562,\n                  38.898362\n               ],\n               [\n                  -77.025655,\n                  38.898361\n               ],\n               [\n                  -77.02569,\n                  38.898359\n               ],\n               [\n                  -77.025725,\n                  38.898358\n               ],\n               [\n                  -77.02576,\n                  38.898357\n               ],\n               [\n                  -77.025795,\n                  38.898356\n               ],\n               [\n                  -77.02583,\n                  38.898355\n               ],\n               [\n                  -77.025865,\n                  38.898354\n               ],\n               [\n                  -77.025901,\n                  38.898353\n               ],\n               [\n                  -77.025936,\n                  38.898352\n               ],\n               [\n                  -77.025971,\n                  38.898351\n               ],\n               [\n                  -77.026386,\n                  38.898344\n               ],\n               [\n                  -77.026421,\n                  38.898344\n               ],\n               [\n                  -77.026456,\n                  38.898343\n               ],\n               [\n                  -77.026491,\n                  38.898343\n               ],\n               [\n                  -77.026527,\n                  38.898343\n               ],\n               [\n                  -77.026562,\n                  38.898343\n               ],\n               [\n                  -77.026597,\n                  38.898343\n               ],\n               [\n                  -77.026632,\n                  38.898343\n               ],\n               [\n                  -77.026667,\n                  38.898343\n               ],\n               [\n                  -77.026702,\n                  38.898343\n               ],\n               [\n                  -77.026737,\n                  38.898343\n               ],\n               [\n                  -77.027031,\n                  38.898343\n               ],\n               [\n                  -77.028085,\n                  38.898343\n               ],\n               [\n                  -77.029139,\n                  38.898343\n               ],\n               [\n                  -77.032279,\n                  38.898344\n               ],\n               [\n                  -77.032374,\n                  38.898345\n               ],\n               [\n                  -77.032469,\n                  38.898345\n               ],\n               [\n                  -77.032563,\n                  38.898345\n               ],\n               [\n                  -77.032658,\n                  38.898346\n               ],\n               [\n                  -77.032753,\n                  38.898348\n               ],\n               [\n                  -77.032848,\n                  38.898351\n               ],\n               [\n                  -77.032943,\n                  38.898354\n               ],\n               [\n                  -77.033037,\n                  38.898359\n               ],\n               [\n                  -77.033132,\n                  38.898365\n               ],\n               [\n                  -77.033226,\n                  38.898372\n               ],\n               [\n                  -77.033368,\n                  38.898387\n               ],\n               [\n                  -77.033509,\n                  38.898405\n               ],\n               [\n                  -77.033649,\n                  38.898427\n               ],\n               [\n                  -77.033789,\n                  38.898453\n               ],\n               [\n                  -77.033927,\n                  38.898482\n               ],\n               [\n                  -77.034063,\n                  38.898515\n               ],\n               [\n                  -77.034199,\n                  38.898552\n               ],\n               [\n                  -77.034287,\n                  38.898578\n               ],\n               [\n                  -77.034375,\n                  38.898605\n               ],\n               [\n                  -77.034463,\n                  38.898634\n               ],\n               [\n                  -77.03455,\n                  38.898664\n               ],\n               [\n                  -77.034636,\n                  38.898695\n               ],\n               [\n                  -77.034722,\n                  38.898726\n               ],\n               [\n                  -77.034807,\n                  38.898759\n               ],\n               [\n                  -77.034892,\n                  38.898791\n               ],\n               [\n                  -77.034977,\n                  38.898824\n               ],\n               [\n                  -77.035062,\n                  38.898857\n               ],\n               [\n                  -77.035928,\n                  38.899195\n               ],\n               [\n                  -77.036013,\n                  38.899228\n               ],\n               [\n                  -77.036097,\n                  38.899261\n               ],\n               [\n                  -77.036182,\n                  38.899295\n               ],\n               [\n                  -77.036266,\n                  38.899329\n               ],\n               [\n                  -77.03635,\n                  38.899363\n               ],\n               [\n                  -77.036434,\n                  38.899399\n               ],\n               [\n                  -77.036516,\n                  38.899435\n               ],\n               [\n                  -77.036598,\n                  38.899472\n               ],\n               [\n                  -77.03668,\n                  38.89951\n               ],\n               [\n                  -77.03676,\n                  38.89955\n               ],\n               [\n                  -77.036883,\n                  38.899615\n               ],\n               [\n                  -77.037003,\n                  38.899683\n               ],\n               [\n                  -77.037119,\n                  38.899754\n               ],\n               [\n                  -77.037233,\n                  38.899829\n               ],\n               [\n                  -77.037343,\n                  38.899906\n               ],\n               [\n                  -77.03745,\n                  38.899987\n               ],\n               [\n                  -77.037553,\n                  38.90007\n               ],\n               [\n                  -77.037652,\n                  38.900156\n               ],\n               [\n                  -77.037747,\n                  38.900245\n               ],\n               [\n                  -77.037838,\n                  38.900336\n               ],\n               [\n                  -77.037925,\n                  38.90043\n               ],\n               [\n                  -77.038007,\n                  38.900526\n               ],\n               [\n                  -77.038086,\n                  38.900625\n               ],\n               [\n                  -77.038133,\n                  38.900689\n               ],\n               [\n                  -77.038179,\n                  38.900754\n               ],\n               [\n                  -77.038224,\n                  38.900819\n               ],\n               [\n                  -77.038267,\n                  38.900885\n               ],\n               [\n                  -77.038309,\n                  38.900951\n               ],\n               [\n                  -77.038351,\n                  38.901018\n               ],\n               [\n                  -77.038391,\n                  38.901085\n               ],\n               [\n                  -77.038431,\n                  38.901153\n               ],\n               [\n                  -77.03847,\n                  38.90122\n               ],\n               [\n                  -77.038509,\n                  38.901287\n               ],\n               [\n                  -77.039166,\n                  38.902418\n               ],\n               [\n                  -77.040038,\n                  38.903919\n               ],\n               [\n                  -77.041722,\n                  38.906819\n               ],\n               [\n                  -77.04186,\n                  38.907056\n               ],\n               [\n                  -77.041875,\n                  38.907081\n               ],\n               [\n                  -77.041889,\n                  38.907106\n               ],\n               [\n                  -77.041904,\n                  38.907131\n               ],\n               [\n                  -77.041918,\n                  38.907156\n               ],\n               [\n                  -77.041933,\n                  38.907181\n               ],\n               [\n                  -77.041948,\n                  38.907206\n               ],\n               [\n                  -77.041962,\n                  38.907231\n               ],\n               [\n                  -77.041977,\n                  38.907256\n               ],\n               [\n                  -77.041992,\n                  38.907281\n               ],\n               [\n                  -77.042006,\n                  38.907306\n               ],\n               [\n                  -77.042163,\n                  38.907564\n               ],\n               [\n                  -77.042178,\n                  38.907589\n               ],\n               [\n                  -77.042194,\n                  38.907613\n               ],\n               [\n                  -77.042209,\n                  38.907638\n               ],\n               [\n                  -77.042225,\n                  38.907663\n               ],\n               [\n                  -77.04224,\n                  38.907687\n               ],\n               [\n                  -77.042256,\n                  38.907712\n               ],\n               [\n                  -77.042271,\n                  38.907737\n               ],\n               [\n                  -77.042287,\n                  38.907761\n               ],\n               [\n                  -77.042302,\n                  38.907786\n               ],\n               [\n                  -77.042318,\n                  38.90781\n               ],\n               [\n                  -77.042462,\n                  38.908037\n               ],\n               [\n                  -77.042477,\n                  38.908062\n               ],\n               [\n                  -77.042493,\n                  38.908086\n               ],\n               [\n                  -77.042508,\n                  38.908111\n               ],\n               [\n                  -77.042524,\n                  38.908136\n               ],\n               [\n                  -77.042539,\n                  38.90816\n               ],\n               [\n                  -77.042555,\n                  38.908185\n               ],\n               [\n                  -77.04257,\n                  38.908209\n               ],\n               [\n                  -77.042586,\n                  38.908234\n               ],\n               [\n                  -77.042601,\n                  38.908259\n               ],\n               [\n                  -77.042617,\n                  38.908284\n               ],\n               [\n                  -77.042773,\n                  38.908542\n               ],\n               [\n                  -77.042788,\n                  38.908567\n               ],\n               [\n                  -77.042803,\n                  38.908591\n               ],\n               [\n                  -77.042817,\n                  38.908616\n               ],\n               [\n                  -77.042832,\n                  38.908641\n               ],\n               [\n                  -77.042847,\n                  38.908666\n               ],\n               [\n                  -77.042861,\n                  38.908691\n               ],\n               [\n                  -77.042876,\n                  38.908716\n               ],\n               [\n                  -77.04289,\n                  38.908741\n               ],\n               [\n                  -77.042905,\n                  38.908766\n               ],\n               [\n                  -77.042919,\n                  38.908791\n               ],\n               [\n                  -77.043137,\n                  38.909168\n               ],\n               [\n                  -77.044009,\n                  38.910667\n               ],\n               [\n                  -77.045291,\n                  38.912873\n               ],\n               [\n                  -77.045326,\n                  38.912934\n               ],\n               [\n                  -77.045362,\n                  38.912996\n               ],\n               [\n                  -77.045398,\n                  38.913058\n               ],\n               [\n                  -77.045433,\n                  38.913119\n               ],\n               [\n                  -77.045468,\n                  38.913181\n               ],\n               [\n                  -77.045502,\n                  38.913243\n               ],\n               [\n                  -77.045537,\n                  38.913305\n               ],\n               [\n                  -77.04557,\n                  38.913367\n               ],\n               [\n                  -77.045603,\n                  38.91343\n               ],\n               [\n                  -77.045636,\n                  38.913493\n               ],\n               [\n                  -77.04575,\n                  38.91373\n               ],\n               [\n                  -77.045854,\n                  38.91397\n               ],\n               [\n                  -77.045947,\n                  38.914213\n               ],\n               [\n                  -77.046029,\n                  38.914459\n               ],\n               [\n                  -77.046049,\n                  38.914525\n               ],\n               [\n                  -77.046068,\n                  38.914591\n               ],\n               [\n                  -77.046086,\n                  38.914657\n               ],\n               [\n                  -77.046104,\n                  38.914723\n               ],\n               [\n                  -77.046122,\n                  38.914789\n               ],\n               [\n                  -77.046139,\n                  38.914855\n               ],\n               [\n                  -77.046156,\n                  38.914921\n               ],\n               [\n                  -77.046172,\n                  38.914988\n               ],\n               [\n                  -77.046189,\n                  38.915054\n               ],\n               [\n                  -77.046205,\n                  38.915121\n               ],\n               [\n                  -77.046275,\n                  38.915407\n               ],\n               [\n                  -77.046289,\n                  38.915461\n               ],\n               [\n                  -77.046302,\n                  38.915515\n               ],\n               [\n                  -77.046315,\n                  38.915569\n               ],\n               [\n                  -77.046329,\n                  38.915623\n               ],\n               [\n                  -77.046342,\n                  38.915677\n               ],\n               [\n                  -77.046356,\n                  38.915731\n               ],\n               [\n                  -77.04637,\n                  38.915784\n               ],\n               [\n                  -77.046385,\n                  38.915838\n               ],\n               [\n                  -77.0464,\n                  38.915892\n               ],\n               [\n                  -77.046415,\n                  38.915945\n               ],\n               [\n                  -77.046494,\n                  38.916202\n               ],\n               [\n                  -77.046584,\n                  38.916456\n               ],\n               [\n                  -77.046683,\n                  38.916709\n               ],\n               [\n                  -77.046792,\n                  38.916958\n               ],\n               [\n                  -77.046816,\n                  38.91701\n               ],\n               [\n                  -77.046841,\n                  38.917061\n               ],\n               [\n                  -77.046865,\n                  38.917113\n               ],\n               [\n                  -77.04689,\n                  38.917164\n               ],\n               [\n                  -77.046915,\n                  38.917215\n               ],\n               [\n                  -77.046941,\n                  38.917267\n               ],\n               [\n                  -77.046967,\n                  38.917318\n               ],\n               [\n                  -77.046992,\n                  38.917369\n               ],\n               [\n                  -77.047018,\n                  38.91742\n               ],\n               [\n                  -77.047044,\n                  38.917471\n               ],\n               [\n                  -77.047683,\n                  38.918732\n               ],\n               [\n                  -77.047709,\n                  38.918783\n               ],\n               [\n                  -77.047735,\n                  38.918834\n               ],\n               [\n                  -77.047761,\n                  38.918885\n               ],\n               [\n                  -77.047787,\n                  38.918936\n               ],\n               [\n                  -77.047813,\n                  38.918987\n               ],\n               [\n                  -77.04784,\n                  38.919038\n               ],\n               [\n                  -77.047866,\n                  38.919089\n               ],\n               [\n                  -77.047893,\n                  38.919139\n               ],\n               [\n                  -77.04792,\n                  38.91919\n               ],\n               [\n                  -77.047948,\n                  38.91924\n               ],\n               [\n                  -77.048111,\n                  38.919524\n               ],\n               [\n                  -77.048285,\n                  38.919803\n               ],\n               [\n                  -77.048471,\n                  38.920078\n               ],\n               [\n                  -77.048669,\n                  38.920348\n               ],\n               [\n                  -77.048877,\n                  38.920613\n               ],\n               [\n                  -77.048915,\n                  38.920659\n               ],\n               [\n                  -77.048953,\n                  38.920705\n               ],\n               [\n                  -77.048992,\n                  38.920751\n               ],\n               [\n                  -77.04903,\n                  38.920797\n               ],\n               [\n                  -77.049069,\n                  38.920843\n               ],\n               [\n                  -77.049109,\n                  38.920888\n               ],\n               [\n                  -77.049148,\n                  38.920934\n               ],\n               [\n                  -77.049187,\n                  38.920979\n               ],\n               [\n                  -77.049227,\n                  38.921025\n               ],\n               [\n                  -77.049266,\n                  38.92107\n               ],\n               [\n                  -77.049319,\n                  38.921131\n               ],\n               [\n                  -77.050728,\n                  38.922755\n               ],\n               [\n                  -77.050777,\n                  38.922812\n               ],\n               [\n                  -77.050827,\n                  38.922868\n               ],\n               [\n                  -77.050876,\n                  38.922925\n               ],\n               [\n                  -77.050925,\n                  38.922982\n               ],\n               [\n                  -77.050974,\n                  38.923039\n               ],\n               [\n                  -77.051022,\n                  38.923097\n               ],\n               [\n                  -77.05107,\n                  38.923154\n               ],\n               [\n                  -77.051118,\n                  38.923212\n               ],\n               [\n                  -77.051165,\n                  38.92327\n               ],\n               [\n                  -77.051212,\n                  38.923328\n               ],\n               [\n                  -77.051392,\n                  38.923562\n               ],\n               [\n                  -77.051563,\n                  38.9238\n               ],\n               [\n                  -77.051724,\n                  38.924042\n               ],\n               [\n                  -77.051763,\n                  38.924103\n               ],\n               [\n                  -77.051802,\n                  38.924165\n               ],\n               [\n                  -77.05184,\n                  38.924227\n               ],\n               [\n                  -77.051878,\n                  38.924289\n               ],\n               [\n                  -77.051915,\n                  38.924351\n               ],\n               [\n                  -77.051952,\n                  38.924413\n               ],\n               [\n                  -77.051989,\n                  38.924475\n               ],\n               [\n                  -77.052025,\n                  38.924538\n               ],\n               [\n                  -77.052062,\n                  38.9246\n               ],\n               [\n                  -77.052098,\n                  38.924663\n               ],\n               [\n                  -77.052196,\n                  38.924832\n               ],\n               [\n                  -77.053067,\n                  38.926332\n               ],\n               [\n                  -77.057631,\n                  38.934182\n               ],\n               [\n                  -77.058503,\n                  38.935682\n               ],\n               [\n                  -77.062457,\n                  38.942481\n               ],\n               [\n                  -77.063329,\n                  38.943981\n               ],\n               [\n                  -77.063564,\n                  38.944385\n               ],\n               [\n                  -77.063601,\n                  38.944448\n               ],\n               [\n                  -77.063638,\n                  38.944512\n               ],\n               [\n                  -77.063676,\n                  38.944575\n               ],\n               [\n                  -77.063714,\n                  38.944639\n               ],\n               [\n                  -77.063754,\n                  38.944701\n               ],\n               [\n                  -77.063794,\n                  38.944764\n               ],\n               [\n                  -77.063835,\n                  38.944826\n               ],\n               [\n                  -77.063878,\n                  38.944887\n               ],\n               [\n                  -77.063922,\n                  38.944948\n               ],\n               [\n                  -77.063968,\n                  38.945008\n               ],\n               [\n                  -77.064034,\n                  38.945088\n               ],\n               [\n                  -77.064103,\n                  38.945166\n               ],\n               [\n                  -77.064175,\n                  38.945243\n               ],\n               [\n                  -77.064251,\n                  38.945317\n               ],\n               [\n                  -77.06433,\n                  38.94539\n               ],\n               [\n                  -77.064412,\n                  38.94546\n               ],\n               [\n                  -77.064498,\n                  38.945528\n               ],\n               [\n                  -77.064586,\n                  38.945593\n               ],\n               [\n                  -77.064677,\n                  38.945656\n               ],\n               [\n                  -77.06477,\n                  38.945717\n               ],\n               [\n                  -77.064867,\n                  38.945775\n               ],\n               [\n                  -77.064966,\n                  38.945831\n               ],\n               [\n                  -77.065067,\n                  38.945884\n               ],\n               [\n                  -77.06517,\n                  38.945934\n               ],\n               [\n                  -77.065276,\n                  38.945981\n               ],\n               [\n                  -77.065383,\n                  38.946026\n               ],\n               [\n                  -77.065493,\n                  38.946067\n               ],\n               [\n                  -77.065604,\n                  38.946106\n               ],\n               [\n                  -77.065717,\n                  38.946142\n               ],\n               [\n                  -77.065831,\n                  38.946174\n               ],\n               [\n                  -77.065947,\n                  38.946204\n               ],\n               [\n                  -77.066064,\n                  38.94623\n               ],\n               [\n                  -77.066182,\n                  38.946253\n               ],\n               [\n                  -77.066301,\n                  38.946273\n               ],\n               [\n                  -77.066421,\n                  38.94629\n               ],\n               [\n                  -77.066542,\n                  38.946304\n               ],\n               [\n                  -77.066631,\n                  38.946312\n               ],\n               [\n                  -77.06672,\n                  38.946318\n               ],\n               [\n                  -77.066809,\n                  38.946323\n               ],\n               [\n                  -77.066898,\n                  38.946327\n               ],\n               [\n                  -77.066988,\n                  38.94633\n               ],\n               [\n                  -77.067077,\n                  38.946332\n               ],\n               [\n                  -77.067167,\n                  38.946333\n               ],\n               [\n                  -77.067256,\n                  38.946333\n               ],\n               [\n                  -77.067346,\n                  38.946334\n               ],\n               [\n                  -77.067436,\n                  38.946334\n               ],\n               [\n                  -77.076112,\n                  38.946339\n               ],\n               [\n                  -77.076189,\n                  38.946339\n               ],\n               [\n                  -77.076266,\n                  38.946339\n               ],\n               [\n                  -77.076344,\n                  38.94634\n               ],\n               [\n                  -77.076421,\n                  38.946341\n               ],\n               [\n                  -77.076498,\n                  38.946343\n               ],\n               [\n                  -77.076576,\n                  38.946346\n               ],\n               [\n                  -77.076653,\n                  38.946349\n               ],\n               [\n                  -77.07673,\n                  38.946354\n               ],\n               [\n                  -77.076807,\n                  38.946361\n               ],\n               [\n                  -77.076884,\n                  38.946369\n               ],\n               [\n                  -77.076974,\n                  38.94638\n               ],\n               [\n                  -77.077064,\n                  38.946395\n               ],\n               [\n                  -77.077154,\n                  38.946411\n               ],\n               [\n                  -77.077242,\n                  38.94643\n               ],\n               [\n                  -77.07733,\n                  38.946451\n               ],\n               [\n                  -77.077417,\n                  38.946475\n               ],\n               [\n                  -77.077502,\n                  38.946501\n               ],\n               [\n                  -77.077587,\n                  38.946529\n               ],\n               [\n                  -77.07767,\n                  38.94656\n               ],\n               [\n                  -77.077751,\n                  38.946593\n               ],\n               [\n                  -77.077831,\n                  38.946628\n               ],\n               [\n                  -77.07791,\n                  38.946665\n               ],\n               [\n                  -77.077987,\n                  38.946704\n               ],\n               [\n                  -77.078062,\n                  38.946745\n               ],\n               [\n                  -77.078135,\n                  38.946789\n               ],\n               [\n                  -77.078206,\n                  38.946834\n               ],\n               [\n                  -77.078276,\n                  38.946881\n               ],\n               [\n                  -77.078343,\n                  38.94693\n               ],\n               [\n                  -77.078408,\n                  38.946981\n               ],\n               [\n                  -77.07847,\n                  38.947033\n               ],\n               [\n                  -77.07853,\n                  38.947088\n               ],\n               [\n                  -77.078588,\n                  38.947143\n               ],\n               [\n                  -77.078643,\n                  38.947201\n               ],\n               [\n                  -77.078696,\n                  38.947259\n               ],\n               [\n                  -77.078746,\n                  38.947319\n               ],\n               [\n                  -77.078794,\n                  38.947381\n               ],\n               [\n                  -77.078831,\n                  38.947434\n               ],\n               [\n                  -77.078867,\n                  38.947487\n               ],\n               [\n                  -77.078902,\n                  38.947541\n               ],\n               [\n                  -77.078935,\n                  38.947596\n               ],\n               [\n                  -77.078967,\n                  38.947651\n               ],\n               [\n                  -77.078997,\n                  38.947706\n               ],\n               [\n                  -77.079027,\n                  38.947762\n               ],\n               [\n                  -77.079057,\n                  38.947818\n               ],\n               [\n                  -77.079085,\n                  38.947874\n               ],\n               [\n                  -77.079114,\n                  38.94793\n               ],\n               [\n                  -77.079221,\n                  38.94814\n               ],\n               [\n                  -77.080002,\n                  38.949669\n               ],\n               [\n                  -77.080269,\n                  38.950194\n               ],\n               [\n                  -77.080301,\n                  38.950257\n               ],\n               [\n                  -77.080334,\n                  38.950321\n               ],\n               [\n                  -77.080367,\n                  38.950385\n               ],\n               [\n                  -77.080399,\n                  38.950449\n               ],\n               [\n                  -77.080432,\n                  38.950512\n               ],\n               [\n                  -77.080464,\n                  38.950576\n               ],\n               [\n                  -77.080497,\n                  38.95064\n               ],\n               [\n                  -77.080529,\n                  38.950704\n               ],\n               [\n                  -77.080562,\n                  38.950767\n               ],\n               [\n                  -77.080594,\n                  38.950831\n               ],\n               [\n                  -77.081763,\n                  38.95313\n               ],\n               [\n                  -77.081795,\n                  38.953194\n               ],\n               [\n                  -77.081828,\n                  38.953258\n               ],\n               [\n                  -77.08186,\n                  38.953321\n               ],\n               [\n                  -77.081892,\n                  38.953385\n               ],\n               [\n                  -77.081925,\n                  38.953449\n               ],\n               [\n                  -77.081957,\n                  38.953513\n               ],\n               [\n                  -77.081989,\n                  38.953577\n               ],\n               [\n                  -77.082022,\n                  38.953641\n               ],\n               [\n                  -77.082054,\n                  38.953704\n               ],\n               [\n                  -77.082086,\n                  38.953768\n               ],\n               [\n                  -77.082213,\n                  38.954018\n               ],\n               [\n                  -77.082245,\n                  38.954082\n               ],\n               [\n                  -77.082278,\n                  38.954146\n               ],\n               [\n                  -77.08231,\n                  38.95421\n               ],\n               [\n                  -77.082342,\n                  38.954273\n               ],\n               [\n                  -77.082375,\n                  38.954337\n               ],\n               [\n                  -77.082407,\n                  38.954401\n               ],\n               [\n                  -77.082439,\n                  38.954465\n               ],\n               [\n                  -77.082472,\n                  38.954529\n               ],\n               [\n                  -77.082504,\n                  38.954593\n               ],\n               [\n                  -77.082536,\n                  38.954656\n               ],\n               [\n                  -77.083705,\n                  38.956955\n               ],\n               [\n                  -77.083738,\n                  38.957019\n               ],\n               [\n                  -77.08377,\n                  38.957083\n               ],\n               [\n                  -77.083803,\n                  38.957146\n               ],\n               [\n                  -77.083835,\n                  38.95721\n               ],\n               [\n                  -77.083868,\n                  38.957274\n               ],\n               [\n                  -77.0839,\n                  38.957338\n               ],\n               [\n                  -77.083933,\n                  38.957401\n               ],\n               [\n                  -77.083965,\n                  38.957465\n               ],\n               [\n                  -77.083998,\n                  38.957529\n               ],\n               [\n                  -77.08403,\n                  38.957593\n               ],\n               [\n                  -77.084545,\n                  38.9586\n               ],\n               [\n                  -77.084565,\n                  38.958638\n               ],\n               [\n                  -77.085346,\n                  38.960169\n               ],\n               [\n                  -77.085757,\n                  38.960976\n               ]\n            ]\n         },\n         \"id\":\"e0369f23e7e33d9f11a695f0bf6a2498\"\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"TYPE\":\"neighborhood-region\"\n         },\n         \"geometry\":{\n            \"type\":\"Polygon\",\n            \"coordinates\":[\n               [\n                  [\n                     -77.0911931991577,\n                     38.95653886174238\n                  ],\n                  [\n                     -77.10097789764404,\n                     38.948929645671186\n                  ],\n                  [\n                     -77.08587169647217,\n                     38.93798162119452\n                  ],\n                  [\n                     -77.07870483398436,\n                     38.9461927980471\n                  ],\n                  [\n                     -77.08016395568848,\n                     38.94882951896179\n                  ],\n                  [\n                     -77.0911931991577,\n                     38.95653886174238\n                  ]\n               ]\n            ]\n         }\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"TYPE\":\"neighborhood-region\"\n         },\n         \"geometry\":{\n            \"type\":\"Polygon\",\n            \"coordinates\":[\n               [\n                  [\n                     -77.06917762756348,\n                     38.91072104167239\n                  ],\n                  [\n                     -77.06896305084229,\n                     38.90506061276737\n                  ],\n                  [\n                     -77.05810546875,\n                     38.90529438572799\n                  ],\n                  [\n                     -77.05823421478271,\n                     38.910554073829196\n                  ],\n                  [\n                     -77.06490755081177,\n                     38.91037040874808\n                  ],\n                  [\n                     -77.0651650428772,\n                     38.910804525446686\n                  ],\n                  [\n                     -77.06917762756348,\n                     38.91072104167239\n                  ]\n               ]\n            ]\n         }\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"TYPE\":\"neighborhood-region\"\n         },\n         \"geometry\":{\n            \"type\":\"Polygon\",\n            \"coordinates\":[\n               [\n                  [\n                     -77.0364761352539,\n                     38.94198719211628\n                  ],\n                  [\n                     -77.0366048812866,\n                     38.92656450268364\n                  ],\n                  [\n                     -77.03488826751709,\n                     38.92743253530554\n                  ],\n                  [\n                     -77.02308654785156,\n                     38.92816701615101\n                  ],\n                  [\n                     -77.0245885848999,\n                     38.93851571039129\n                  ],\n                  [\n                     -77.02553272247314,\n                     38.94192043445515\n                  ],\n                  [\n                     -77.0364761352539,\n                     38.94198719211628\n                  ]\n               ]\n            ]\n         }\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"TYPE\":\"neighborhood-region\"\n         },\n         \"geometry\":{\n            \"type\":\"Polygon\",\n            \"coordinates\":[\n               [\n                  [\n                     -76.99317455291747,\n                     38.904025323260214\n                  ],\n                  [\n                     -76.98343276977539,\n                     38.90001760864653\n                  ],\n                  [\n                     -76.97875499725342,\n                     38.90736491263297\n                  ],\n                  [\n                     -76.9857931137085,\n                     38.91053737702329\n                  ],\n                  [\n                     -76.99317455291747,\n                     38.904025323260214\n                  ]\n               ]\n            ]\n         }\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"TYPE\":\"neighborhood-region\"\n         },\n         \"geometry\":{\n            \"type\":\"Polygon\",\n            \"coordinates\":[\n               [\n                  [\n                     -76.98446273803711,\n                     38.8666446046702\n                  ],\n                  [\n                     -76.97064399719238,\n                     38.873494197093706\n                  ],\n                  [\n                     -76.97463512420654,\n                     38.87536519049013\n                  ],\n                  [\n                     -76.9887113571167,\n                     38.86941793380272\n                  ],\n                  [\n                     -76.9881534576416,\n                     38.86851577836779\n                  ],\n                  [\n                     -76.98862552642822,\n                     38.8674465422857\n                  ],\n                  [\n                     -76.98446273803711,\n                     38.8666446046702\n                  ]\n               ]\n            ]\n         }\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"TYPE\":\"neighborhood-region\"\n         },\n         \"geometry\":{\n            \"type\":\"Polygon\",\n            \"coordinates\":[\n               [\n                  [\n                     -77.00356006622314,\n                     38.88769246895389\n                  ],\n                  [\n                     -77.0035171508789,\n                     38.88328295649315\n                  ],\n                  [\n                     -76.99845314025877,\n                     38.883216143593515\n                  ],\n                  [\n                     -76.98729515075684,\n                     38.88628947194888\n                  ],\n                  [\n                     -76.98849678039551,\n                     38.88762566020101\n                  ],\n                  [\n                     -77.00356006622314,\n                     38.88769246895389\n                  ]\n               ]\n            ]\n         }\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"TYPE\":\"neighborhood-region\"\n         },\n         \"geometry\":{\n            \"type\":\"Polygon\",\n            \"coordinates\":[\n               [\n                  [\n                     -76.96369171142578,\n                     38.93531111487067\n                  ],\n                  [\n                     -76.97802543640137,\n                     38.946393058773296\n                  ],\n                  [\n                     -76.98102951049803,\n                     38.94272152224007\n                  ],\n                  [\n                     -76.98343276977539,\n                     38.94265476527037\n                  ],\n                  [\n                     -76.97150230407713,\n                     38.93137193448086\n                  ],\n                  [\n                     -76.96369171142578,\n                     38.93531111487067\n                  ]\n               ]\n            ]\n         }\n      },\n      {\n         \"type\":\"Feature\",\n         \"properties\":{\n            \"TYPE\":\"neighborhood-region\"\n         },\n         \"geometry\":{\n            \"type\":\"Polygon\",\n            \"coordinates\":[\n               [\n                  [\n                     -77.03630447387695,\n                     38.992237864985896\n                  ],\n                  [\n                     -77.03639030456543,\n                     38.97242213571127\n                  ],\n                  [\n                     -77.02445983886719,\n                     38.97235540671589\n                  ],\n                  [\n                     -77.02445983886719,\n                     38.98269765061846\n                  ],\n                  [\n                     -77.03630447387695,\n                     38.992237864985896\n                  ]\n               ]\n            ]\n         }\n      }\n   ]\n}"
  },
  {
    "path": "app/src/main/assets/navigation_route.json",
    "content": "{\"routes\":[{\"weight_typical\":22891.49,\"duration_typical\":23763.41,\"weight_name\":\"auto\",\"weight\":23587.498,\"duration\":24540.543,\"distance\":630864.75,\"legs\":[{\"via_waypoints\":[],\"admins\":[{\"iso_3166_1_alpha3\":\"USA\",\"iso_3166_1\":\"US\"}],\"annotation\":{\"maxspeed\":[{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":32,\"unit\":\"km/h\"},{\"speed\":40,\"unit\":\"km/h\"},{\"speed\":40,\"unit\":\"km/h\"},{\"speed\":40,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":24,\"unit\":\"km/h\"},{\"speed\":24,\"unit\":\"km/h\"},{\"speed\":24,\"unit\":\"km/h\"},{\"speed\":24,\"unit\":\"km/h\"},{\"speed\":24,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true}],\"congestion_numeric\":[null,null,null,null,null,null,null,0,0,0,0,null,null,null,14,null,null,null,11,null,0,0,4,20,null,8,20,0,0,0,0,9,9,59,59,59,3,0,0,0,0,14,6,4,9,11,11,null,0,4,37,37,37,0,0,0,14,14,0,17,1,1,0,null,4,0,0,0,0,46,46,46,null,0,0,0,1,1,null,null,null,null,null,30,null,null,null,6,6,null,4,4,4,29,29,29,null,0,0,59,59,61,32,33,null,27,0,0,null,0,0,6,6,11,11,11,11,11,12,12,12,29,4,4,4,0,0,8,8,8,6,null,0,0,0,0,0,0,0,0,16,16,null,null,77,53,80,43,null,20,20,null,null,null,null,45,11,11,null,null,null,0,0,0,0,0,0,0,0,16,16,9,9,6,32,14,14,14,14,0,0,0,0,0,0,25,25,25,8,22,22,20,14,14,0,0,0,0,0,0,0,0,0,0,0,0,0,14,14,14,14,null,null,null,35,35,35,35,35,35,35,35,35,null,null,null,14,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,null,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,4,1,3,1,4,4,4,4,4,1,3,3,3,3,3,3,4,1,3,8,8,8,8,8,1,1,1,1,1,4,3,1,1,1,3,6,0,0,0,0,0,0,0,0,0,1,1,1,1,1,12,6,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,4,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,1,4,4,4,3,4,4,6,6,4,6,6,6,4,6,6,6,6,6,6,6,1,0,1,1,1,1,1,0,0,0,0,0,0,0,null,1,1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,25,25,25,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,3,3,1,1,4,4,4,4,4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,1,1,1,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,0,3,3,3,3,3,3,1,1,1,1,1,1,1,1,0,0,0,0,0,3,3,3,3,3,3,3,3,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,11,11,null,null,0,0,0,0,0,0,0,null,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,null,0,0,0,0,4,0,6,6,6,6,6,6,4,4,4,4,4,6,4,4,9,9,22,22,null,null,null,50,50,50,50,50,50,50,50,50,1,1,1,1,1,1,9,29,29,29,29,29,19,12,12,19,19,19,19,19,19,19,19,41,41,41,41,16,54,25,25,25,null,20,20,20,20,20,20,9,9,0,4,4,4,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,0,0,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,null,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,6,6,3,3,3,3,3,3,3,3,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1,1,4,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,null,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,4,4,4,11,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,3,3,3,4,4,4,4,8,8,8,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8,8,8,8,72,72,72,72,72,72,72,72,72,69,30,30,30,30,0,35,35,35,22,22,22,22,20,20,43,51,51,14,14,14,14,null,20,20,20,20,6,6,null,0,0,0,0,0,0,0,null,null,null,null,null,null,null,null,null,null,8,null,null,null,null,8,8,3,3,3,null,null,null,null,null,null,null,null,16,16],\"speed\":[2.5,6.1,7.2,4.4,4.4,9.7,8.9,6.1,6.1,6.1,6.1,8.1,8.1,6.7,7.2,15.6,8.1,7.5,8.1,8.1,5.3,8.1,8.6,8.1,9.2,8.3,6.1,5.3,5.3,5.3,6.4,7.2,7.2,4.4,4.4,4.4,7.5,8.9,8.9,9.4,9.4,10,12.2,12.8,12.2,7.8,7.8,5.8,6.4,8.1,7.2,7.2,7.2,9.4,9.4,8.1,9.2,9.2,13.3,10.3,12.2,12.2,12.8,8.9,8.3,6.9,6.9,6.9,7.8,5,5,5,6.9,6.1,6.1,6.1,8.1,8.1,7.8,7.8,8.1,7.5,6.4,5.6,6.4,5.8,5.8,6.9,6.9,7.5,5.6,5.6,5.6,7.2,7.2,7.2,8.6,5,5,3.3,3.3,3.9,6.7,6.9,5.8,4.7,5.6,5.6,5.8,5.6,5.6,6.9,6.9,4.2,4.2,4.2,4.2,4.2,6.9,6.9,6.9,7.8,10.6,10.6,10.6,6.7,6.7,8.3,8.3,8.3,10,10.3,9.4,10,7.8,7.8,7.8,7.8,8.3,8.3,8.3,8.3,9.7,8.6,2.2,4.4,1.7,4.4,15.6,2.8,2.8,6.4,6.4,5.8,5.8,4.4,6.1,6.1,6.1,6.1,6.1,9.4,9.4,9.4,9.4,9.4,10.6,11.1,11.1,8.3,8.3,9.7,9.7,10.6,7.8,6.4,6.4,6.4,6.4,6.7,6.7,6.7,11.1,11.1,11.1,8.3,8.3,8.3,11.1,8.9,8.9,8.1,7.2,7.2,7.2,7.2,10.6,10.6,7.2,7.2,7.2,7.2,7.8,7.8,7.2,7.2,7.2,4.7,4.7,4.7,4.7,5.8,5.8,5.8,7.8,7.8,7.8,7.8,7.8,7.8,7.8,7.8,7.8,21.7,21.7,21.7,21.4,22.2,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,24.4,24.4,24.4,24.4,25,25,25,25,25,25,25,25,25,25,25,24.4,24.4,24.4,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,25,25,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25,25,25,25,25,25,25,25.6,25.6,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,25,23.9,23.9,23.9,23.9,23.9,24.7,25.6,25.6,25.6,25.6,25.6,25.6,25,25.6,25,25,25,25,25,25.6,26.7,26.7,26.7,25.6,25.6,25.6,25.6,25.6,26.7,26.1,26.1,26.1,26.1,26.1,26.1,25.6,27.2,26.7,25,25,25,25,25,27.2,27.2,27.2,27.2,27.2,26.1,29.2,26.7,26.7,26.7,26.7,25.6,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,26.7,25.6,26.4,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,28.1,28.1,28.3,28.3,28.3,28.3,28.3,28.3,27.2,28.3,28.3,26.7,26.7,26.7,26.7,26.9,26.9,26.9,26.9,26.9,27.2,27.2,27.2,26.7,26.1,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25.8,25.6,26.1,26.1,26.1,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,25.6,25.6,25,25,25,25,25,25,28.9,27.8,27.8,27.8,27.8,27.8,28.3,28.3,28.3,28.3,27.8,27.8,27.8,27.5,26.9,26.9,26.9,26.9,26.7,26.7,26.9,28.9,28.9,28.9,26.9,28.3,28.3,28.3,26.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.2,28.9,28.9,28.9,28.3,28.9,28.9,28.9,28.9,28.9,28.9,25,25.8,25.8,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.1,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,25.6,25.6,25,25,25.6,24.4,24.4,24.4,25,25.6,25,25,25,25,25,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,25.8,25.6,25,25.8,25.8,25.8,25,25,25,25,25,25,25,25,25,25,25.6,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,28.3,28.3,27.8,27.8,27.8,27.8,27.8,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,20.3,20.3,20.3,22.2,22.2,22.2,22.2,22.2,22.2,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25.3,25.3,25.3,25.3,25,25,25,25,25,25,25,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,28.1,28.1,28.1,28.1,28.1,28.1,28.1,28.1,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,27.8,27.8,28.1,28.9,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.4,26.4,26.4,26.4,25.8,25.8,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.4,26.4,26.4,26.4,26.4,26.4,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,28.9,29.2,28.6,28.6,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,30.6,32.2,28.9,28.9,28.9,27.2,27.2,27.2,26.7,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,24.7,24.7,25.3,24.2,24.2,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,25,24.7,24.7,24.7,24.7,24.7,24.7,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.3,25.6,25.6,23.3,23.3,23.3,23.3,23.3,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,24.7,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,26.4,35,35,35,35,35,35,35,27.5,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.1,31.4,31.4,31.4,26.9,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.1,26.1,25.6,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.9,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,28.3,28.3,28.3,28.3,28.3,27.8,27.8,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,27.2,27.2,27.2,27.2,25.6,25.6,25.6,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,26.9,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.9,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.9,27.2,27.2,27.2,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.5,27.5,27.2,27.2,27.2,27.2,27.2,27.2,27.5,27.2,27.2,27.2,27.2,26.9,27.8,27.8,27.8,27.8,27.2,27.8,27.8,27.8,27.8,27.8,26.9,29.4,29.4,29.4,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,28.9,28.9,28.9,28.9,28.9,28.9,28.9,31.4,27.8,27.8,27.8,26.7,27.2,27.2,26.7,26.7,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,31.4,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.9,26.9,26.9,26.9,26.9,26.9,26.9,26.9,27.2,27.2,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.2,31.4,31.4,31.4,31.4,31.4,31.4,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,26.7,27.8,27.2,27.2,26.9,26.9,26.9,26.9,26.9,26.9,26.9,28.1,28.1,28.1,28.1,28.1,31.4,31.4,31.4,31.4,31.4,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,26.9,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.4,26.1,26.1,26.1,25.8,24.5,19.8,11.4,11.4,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,20.6,25,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.5,35,35,35,35,35,35,35,35,35,35,35,35,28.3,28.9,28.9,28.9,28.9,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,30,30,29.2,29.2,29.2,25.6,25.6,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,30.3,30.3,30.3,30.3,28.9,28.9,28.9,28.9,30.6,30,30,30,30,30,30,29.4,28.9,28.9,28.9,28.9,28.9,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.5,26.7,26.7,26.7,26.7,26.7,26.7,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.5,27.2,27.2,26.1,26.1,26.1,26.1,26.1,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25,25,25,26.1,26.1,26.1,26.1,26.4,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,22.8,22.8,22.5,22.8,23.3,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,23.1,23.1,23.1,23.1,23.1,22.5,22.5,22.5,22.5,22.5,22.5,22.3,22.2,22.2,22.2,22.2,22.2,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,20.8,20.8,20.8,20.8,21.4,21.4,22.8,22.8,22.8,22.8,22.5,22.5,22.5,22.8,22.8,22.8,22.8,22.8,22.8,21.9,21.9,20.8,20,19.2,20.6,20.6,18.3,18.3,17.5,17.5,22.8,22.8,22.8,22.8,22.8,23.9,23.9,23.4,23.1,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,21.4,21.4,21.4,20,21.7,21.7,21.7,21.7,20.3,20.8,12.8,12.8,12.8,12.8,12.8,12.8,12.5,12.5,12.5,12.5,12.5,16.1,17.5,17.6,17.2,17.2,15,15,17.5,17.5,16.4,6.1,6.1,6.1,6.1,6.1,6.1,6.1,6.1,6.1,13.6,13.6,13.6,13.6,13.6,13.6,15.6,12.8,12.8,12.8,12.8,12.8,14.4,16.1,16.1,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,12.2,12.2,12.2,12.2,16.7,9.4,13.3,13.3,13.3,9.2,12.8,12.8,12.8,12.8,12.8,12.8,3.9,3.9,8.9,10,10,10,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,27.5,27.8,27.8,28.1,26.7,26.7,23.9,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,26.1,26.1,26.1,25.6,26.1,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,30,31.1,31.1,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,31.1,31.1,31.1,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30.6,30,32.5,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,29.4,29.5,29.5,29.4,29.4,29.4,29.4,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.4,29.4,29.4,29.4,29.4,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.4,29.4,29.4,29.1,29.2,30,29.2,29.2,29.2,29.2,30,30,29.7,29.7,30,30,30.3,30.3,30.3,30.3,30.3,30.3,30.3,30.3,29.4,29.4,29.4,29.4,29.4,29.4,29.4,32.2,32.2,32.2,32.2,32.2,32.2,31.1,31.1,31.1,31.1,31.1,29.2,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,26.7,26.7,26.7,25.6,25.6,25.6,24.4,24.4,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,25,25,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.2,27.2,27.2,27.2,27.2,26.7,26.7,26.7,25.8,25.8,25.6,27.8,27.8,27.8,27.8,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.9,26.9,24.2,24.2,24.2,24.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,28.3,28.3,28.3,28.3,28.3,28.3,27.2,27.2,27.2,27.8,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.7,27.8,27.8,27.8,27.8,27.8,27.8,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,30.6,30.6,30.6,30.6,30.6,33.9,33.9,33.9,35,34.4,34.4,34.4,34.4,34.4,34.4,34.4,34.4,34.4,32.8,32.8,32.8,32.8,32.8,32.8,32.8,32.8,32.8,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,25.6,24.7,24.7,24.7,24.7,24.7,24.7,24.4,24.4,24.4,24.4,24.4,24.4,24.4,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,25,25,25,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,28.1,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,27.8,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,28.6,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.5,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,28.9,28.9,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,29.5,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.7,31.7,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.7,31.7,31.4,31.1,31.1,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,27.8,28.6,28.6,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.6,28.6,27.8,27.8,27.8,27.8,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.4,28.4,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.3,28.3,28.3,28.3,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,30,29.2,29.2,29.2,29.2,29.2,29.2,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,27.8,27.8,27.8,27.8,27.8,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,29.2,29.2,29.2,29.2,29.2,29.2,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,28.3,23.3,23.3,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,24.5,24.5,24.5,24.5,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,27.2,25.6,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,25,25.6,25.6,25.6,25.6,25.6,25.6,25,25,25,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,25,26.1,26.1,26.1,26.1,26.1,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,26.7,26.1,26.4,25.9,25.8,25.3,22.8,22.8,22.8,26.4,26.4,26.4,26.4,26.4,26.4,26.4,26.4,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,26.7,26.7,26.7,26.7,25,25,25,25,26.4,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,24.5,25.6,26.1,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.7,25.3,25,25,25.3,25.3,25.3,25.3,25.3,25.3,25.3,25.3,25.3,25.3,26.4,26.4,26.4,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.3,25.3,25.3,22.8,22.8,22.8,23.9,23.6,23.6,23.6,23.6,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,20,20,20,20,20,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.2,3.3,3.3,3.3,3.3,8.9,6.1,6.1,6.1,7.2,7.2,7.2,7.2,3.9,3.9,6.1,5.6,5.6,6.1,6.1,6.1,6.1,6.4,8.3,8.3,8.3,8.3,6.7,6.7,5.3,5.6,6.9,6.9,6.7,6.7,6.7,6.7,5.6,5.3,5.3,5.3,5.3,5.3,5.3,5.3,5.3,5.3,5.8,6.1,6.1,7.8,7.8,5.8,5.8,6.1,6.1,6.1,6.1,6.1,5.3,5.3,7.2,7.2,5.8,5.8,5.3,5.3],\"distance\":[49.3,99.6,67.1,35.3,11.8,21.3,17.7,6.9,13.2,40.8,13.9,13.8,10.4,16,7,2.8,10.2,22.5,9.7,10.8,79.7,18.3,57.7,15.4,9,40.2,37.8,21.3,12.6,16.7,113.1,43.2,33,47.9,13.5,40.1,53.6,2.7,50.3,47,7.7,51.5,61.7,64.7,65.1,127.5,19.6,4.5,20,40.7,4.8,55.2,162.2,29.9,43.6,44.2,3.7,36.4,50.3,22.2,28.5,19,56.2,47,39.7,13.7,21.5,8.9,13.4,12.1,25.3,60.9,34,33.2,2.7,12.9,17,26.7,6.9,20,9.4,33.1,4.9,49.2,14.5,9.5,32.1,36.2,11.6,2,76.8,20.8,7.6,8.8,27.5,35.2,25.6,63.5,44.5,39.9,7.8,51.5,3.3,31.7,18.6,18.9,8.2,1.2,18.7,14.6,9.5,12.1,26.9,14.2,15.8,68,76.4,12.8,14.1,38.4,5.1,32.7,9.4,18,11.5,60.9,13.7,15.8,36.4,10.5,50.1,11.6,5.2,4.3,26.7,13.2,19.3,7.5,9.1,20.3,14.6,5.2,15.9,9.8,22.8,28.5,17.6,24.8,1.7,32.6,10,10.9,31.6,1.9,9.4,52.7,13.4,6.2,19,33,12.6,12.6,14.6,36.6,5.6,11.6,39.2,20.1,8.1,7.6,13.4,20.9,4.1,19.6,50.3,4.6,79,2.6,24.8,22.4,4.5,11.1,12.2,4.7,25.9,56.6,17.5,77.8,50.2,4.8,21.2,36.2,29.9,8.9,40.1,10.8,13.6,38.2,41.7,17.7,34.6,7.5,32.6,12.9,50.1,7,47.6,9.2,22.2,17.1,120.4,10.2,20.8,20.1,13.3,57.4,17.3,21,13.6,15.1,16.8,12.8,14.4,15.7,15.8,58,47.8,48.8,126.5,29.2,29.9,30.6,28.4,30.7,14.2,48.6,31.3,31.7,128.5,66.4,137.7,1.3,44.7,44.2,27.8,29.4,28.6,28.6,27.6,28.5,29.2,30.9,29.2,27.5,30.1,28.5,28.1,28.4,248.9,29.1,28.3,29.3,28.3,28.5,29.5,30.3,27.4,28.7,28.8,27.7,29.6,302.6,29.3,26.7,30.8,28.7,30.6,28.7,30,29.3,28.4,26.6,27,28.9,28.9,29.1,28,29.5,395.5,31.1,29,28.7,28.3,28.3,29.3,28.7,29.2,27.2,28.4,28.7,28.5,54.7,30.6,28.6,28.1,28.7,29.5,28.2,28.7,27.7,24.4,32.5,36.7,29.1,28.4,28.7,29.9,28.7,28.4,23.5,23,21.9,21.8,22.2,21.4,30.3,223.9,13.7,245.7,43.2,68.1,48.1,76.8,28,28.1,29.2,28.9,29.4,27.6,29,29.5,25.9,28.1,27.8,29.4,26.7,28.8,29,27.6,27.2,284.9,29.6,28.1,27.1,118.2,28.9,30.5,28.3,29.9,28.6,29.2,30.4,29.2,28.9,29.7,29,29.7,29.3,29.9,30.2,28.9,28.6,29.1,29.8,29.5,29.5,29.3,357.1,29.6,28.5,26.9,27.3,29.1,55.6,27.6,60.6,28.4,28.8,29.6,29.9,30.2,32.9,142.4,34.3,56.1,28.4,143.8,32.8,109.5,30,30.1,29.8,30,29.9,28.1,29.8,29.6,29.8,27.7,22.7,43.1,23.6,23.5,34.5,44,85.8,68.9,104.4,149.8,55.4,48,59.2,56.5,73.8,194,39.1,36.1,103.6,27.7,29,29.4,29,27.1,25.5,27.9,29.8,26.5,27.6,28.7,30.1,28.4,28.2,217.9,29.6,42.1,58.4,34.6,25,30.9,30.3,33.6,27.9,27.8,16.8,28.8,29.7,27.5,53.6,50.1,109.3,98.5,29.1,35.5,37.9,45.3,27,97.5,33,70.7,416.2,107.9,65.5,55.1,85.5,28.1,128.1,39.1,124.8,125,41.8,40.6,141.9,289.6,52.1,260.8,88.2,15.5,25.2,45.2,21.6,6.1,68.7,37.2,53,40.8,38,135.9,67.6,44.8,81.4,193.4,61.5,39.9,68.3,54.7,127.1,55.7,41.9,44.2,261.5,56.9,59.6,34.8,55.4,38.7,84.8,49.8,293.9,41.5,42.3,41.7,42.3,42,40.7,41,37.5,51.3,36.9,40.9,237.5,451.1,46.1,157,108.5,41.8,250.1,41.9,40.7,39.9,42.8,41.3,53.8,64.4,131.6,160.2,56.1,83.8,53.6,68.5,52,967.4,44.7,306.5,323.3,48.8,233.2,68.9,35.6,33.9,38.2,37.8,61.4,47.5,59.1,60.4,39.9,70,152.9,39.3,33.4,40,60.1,32.3,58.1,39.9,35.7,30.2,43.4,31.8,40,38.4,436.3,170.2,67,45.1,443.3,263.6,125.5,51.4,86.1,230,336.4,183.5,46.8,329.9,276.2,226.4,50.9,400.8,107.1,63.4,46.3,37.6,37.7,49.5,94.7,47.3,180,53.6,93.5,98.2,48,74.5,45.6,65.7,191,92.1,29.7,30.7,47.6,38.2,44.8,123.6,93.2,55.4,47.9,64.7,88.5,84.6,177.3,48.3,144.6,84.9,58.9,63.6,46.7,329.6,102.1,94.3,47.5,53.3,40.1,62,379.2,85.2,73.6,48.8,109.7,269.6,90,745.1,478,39.8,84.9,283.5,42,425.2,178.2,2.3,120.6,120.1,323.7,239.6,96.6,114.5,59.6,32.5,60.6,85.2,77.8,91,66.8,48.5,84.8,33.1,40.8,33.4,206.7,216.4,255.6,57.9,46.4,42,52.2,94.3,77.3,15.6,54.1,49.9,69.8,140.6,345.3,57.5,32.4,31.4,30.1,32.3,27.4,31.4,32.3,60.2,31,29.8,26.2,30.4,32.2,29.1,218.5,30.1,36.8,33.5,30.7,30,32.8,126.2,400.9,39.2,44.4,37.6,39.9,41.9,40.3,41.2,37.1,35.3,245.2,32.3,36,34.8,33.9,40.1,40.8,51.2,41.4,40.1,48.4,48.8,84.7,89.5,89.3,83,69.4,57.3,53.2,54.1,53.1,55.6,55,91.5,552.5,230.3,212,54.8,51.4,64.3,61.5,49.1,599.8,69,88,68.4,59.2,30.5,22.8,136.3,131.1,62.4,148.6,81.3,57.5,59.4,502.3,699.8,676.2,32.7,399.5,198.7,70.1,188.5,127.7,215.5,539.1,216.2,208.9,87,68.5,94.7,400.8,360,220,198.2,46.4,43,44.2,44.6,148.4,48.7,51.9,49.3,52.1,52.7,342,444.6,95,149.9,178.5,50.3,174.1,48.4,40,30.1,30,27.2,29.2,28.2,32,32.7,32.1,33.8,47.1,301,690.6,95.8,48.5,46.7,44.8,44.9,46.4,47.5,120.6,740.4,84.4,72.7,45.9,43.3,41,40,43.4,42.2,41,28.3,5.7,55.7,40.4,423.3,39,41.7,37.7,38.6,46.2,40.5,41.1,44.4,47.4,42.6,42.4,41.1,43.9,43.9,47.2,38.6,44,45,44.3,263.2,45,45.1,43.8,43.8,45.4,45.2,45.2,44.7,44.9,44.7,46.1,103,43.9,44,44.4,38.3,43.8,43.9,42.7,43.9,44.5,44.9,40.4,927.1,66.5,67.7,67.8,63.5,67.8,65.1,65.5,58.7,65.6,65.3,65.3,64.5,60.3,60.2,58.8,58.2,91.2,259.1,359,72.6,432.8,58.1,183.2,53.3,51.1,56,56.7,81.9,50.1,49.3,50.2,45.6,41.5,54,30.2,54.6,52.2,173.9,55.5,50.9,48.2,55.9,291.6,328.8,87.7,568,49.5,50.5,49.5,50.1,49,58.6,96.5,64.6,46.4,50.4,180.4,54,52,53.1,49,49.1,1312.4,49.9,49.2,41.2,8.5,51.2,48.8,48.7,61.6,61,44.3,39.2,44,102.4,46.8,48.1,50.6,46.6,51.1,45,40.3,38.9,42,326.7,59.9,59.4,218.1,46.6,48.6,43.3,43.7,209.9,56.1,52.3,52.9,55.3,55.3,49.7,159.1,50.3,48.2,49.5,49.9,50.9,57.9,47,42.4,44,46.4,47.3,276.2,45.1,45,40.3,46.4,38.3,42.5,40.9,143.1,53,59.2,52.9,25,44.7,44.3,103.6,150.2,93,72,62.7,59.3,73,73.3,61.6,49.2,130.9,161.1,91.1,67,53.1,50.2,46.4,97.3,77.9,77.3,84,83.1,449.2,53.1,51.2,73.2,69.9,98.5,81.3,75.3,128.5,127.4,59.3,60.7,60.9,73.1,485.2,46.7,49.6,116.1,58.2,56.6,72.6,73.7,17.3,69.2,90.9,48.9,32.2,129.7,99.4,46.6,770.1,22,73.8,83.8,116.7,302.3,88.4,82.2,56.3,55.6,280.1,59.6,86.9,99.9,85.3,83.5,66.2,66.8,619.5,226.6,226.4,55.6,38.3,52.8,48.2,42.2,46,70.2,62.9,104.3,103.2,64,80.6,46.5,54.2,51.4,57,43.9,47.5,51.9,51.1,101.1,48.4,47.4,72.6,57.9,44.4,44.2,55.1,60.5,54.6,65.8,76.3,27.2,28,80.7,140.9,95.5,73.3,61,59.3,75.3,59,57.5,63,40.2,530.3,37.8,36.7,52.1,55.1,51.9,53.2,62.3,68.1,36,36.1,64.2,54.1,901.4,55.7,86.6,65.6,77.7,71.7,230.3,11,39,60.5,84.4,83.9,85.5,99.7,108.8,107.1,96.8,73,123.7,93,50.3,48.3,24,65.9,92.1,65.3,48.8,74.6,104.9,76.3,77.6,84.8,37.5,53.9,50.4,49.6,50,55,47.1,58.5,48.9,49.9,49.7,45.4,45.4,42.9,70.6,54.4,49.3,45.8,45.8,42.3,38.3,62.4,63.2,58.3,68.6,55.6,59,55.2,66.6,62.1,57.6,101.1,58.7,64.5,64.3,47.6,937,45.5,44.1,44.1,44.9,46,918,48.4,50.5,51,53.7,268.3,49.6,49.6,49.5,48.4,48.2,137.3,175.4,201.1,59,385.6,45.6,50.5,47.9,45.9,48.9,46.4,44.1,1021.1,75.7,71.7,67.2,66.2,70.3,69.8,80.8,71.1,73.2,1786,6,74.2,71.1,85.7,102.6,29.9,69.7,68.7,573.7,152.6,79.4,45.7,45.7,44.4,40.6,39.7,61,59.5,62.3,62.2,61.2,56.1,67.5,311.3,50,80.2,56.2,70.2,66.8,61,64,64.6,61.3,128.4,65.7,66.9,67.5,66.3,69.4,67,65.3,76.4,74,69.8,66.6,73,70.9,1266.7,593.2,89.9,76.5,11.5,88.5,77.5,461.2,53.8,52.6,53.7,52,50.5,53.6,53.5,50.5,52.5,49.9,51.3,55.5,48.9,347.8,337.7,506.4,64,224.5,337.3,748.8,49.1,50.6,45.8,43.9,51.1,48.9,44,46.6,47.1,48.7,47.6,49.2,448.4,792,56.2,48.7,49,46.1,43.7,44.8,44.1,48.2,48.4,48.2,46.8,44.9,47.6,45.6,43.2,47.8,51.9,53.2,54.1,49.9,51.7,58.1,57.3,54.4,59.6,31.1,370.3,103.5,454.8,50.4,304.8,233.8,187.1,229.4,493.2,50.5,41,41.2,39.7,36.6,38.5,39.5,41.5,44,42.4,44.7,46.1,44.3,45.7,47,45.8,46.8,34.8,37.5,90.6,482.5,368.5,102,183.6,275.3,1042.9,97.5,96.4,97.9,87.5,77,86.9,1117.2,73,194.7,94.3,46.2,117.9,85.9,77.7,237.6,81,63.5,62.4,63.5,68.3,70.7,290.1,61.6,49.7,103.6,58.1,41.6,6,77.9,163.1,189.7,196.4,124.7,82.9,105.2,42.6,40.1,40.2,47.5,165.8,50.5,169.1,147.3,260.9,49.5,36,40.3,41,43.4,36.1,44.5,43.6,49.6,46.8,38.9,58.4,48.2,43.6,41.7,143,500.7,44.9,68.7,70.6,53,281.8,115.6,37.3,32.2,110.3,77.9,161.9,52.6,12,71.3,84.3,75.4,92.8,93.9,66.8,73,148.6,174.8,60,53,53.6,55.3,59.2,52.6,51.8,50.8,54.9,54.7,59,51.9,53.5,799.7,193.1,128.6,79,53.5,29.3,29.1,31.1,31.2,29.2,28.9,29.5,30,27.8,30.6,29.3,344.8,882.6,240.7,378.9,648.4,759.4,93.5,686,545,378.3,514.4,175.5,578.2,302.5,203.8,405.7,137,144.9,96,61.8,34.4,64,64.4,63.3,122.1,61.2,91.2,61.8,61.3,60.9,61.1,61.4,61.5,61.4,61.4,61.4,222.8,423.5,734.4,499.8,245.9,4.9,124.9,123.9,150.2,147.7,292.5,941.2,863.3,492.5,409.3,905.3,881.6,1171,20.2,45.1,730.6,959.6,496.5,855.9,164.6,1177.5,929.2,1341.7,936.5,930.5,1029.8,848.1,1099.1,615,1145.9,1250.7,3.5,900.5,101.5,492.4,771.5,604.1,632,1203.1,122.2,604.6,213.2,445.1,779,553.5,27.6,590.9,572.3,726.2,554.3,648,92.7,519.2,618.5,758.8,668.9,606.8,20.6,429.8,357.8,635.3,594.5,624.2,750.4,411.7,731.9,311.8,357.9,127.3,1059.1,954.7,949.7,6.7,1145.5,865.1,1218.7,847,1168,1096.4,630.2,985.2,979.6,11.3,1079.8,964.3,596.8,543.9,782.6,248.7,106.9,162,133.7,100.4,425.8,522.4,1310.1,825.4,52.2,3233.4,343.3,190.8,824.1,798,961.6,4742.3,1217.7,119.7,96,163.4,519.9,404.6,184.5,717.8,599,1421.7,1034.4,437.4,2322.8,1694.8,1739.6,274.1,1905.6,1072.9,713.9,235.5,678.3,150.5,133.4,541.6,204.3,615.3,195.8,1935,3090.3,1779.5,3968.4,49.9,739.8,1446.1,1078.8,889.5,533.7,3020.7,2378.2,1268.3,5536.3,474,389.9,293.6,292.8,289.7,710.5,106,562.5,513.5,635.6,221.1,315.6,570.2,202.3,403.3,177.3,186.8,295.5,547.3,261,50.5,324,93.4,132.8,134.8,152.6,523.9,69.4,72.1,188.3,138.6,120.5,63.1,127.1,122.2,127.5,190.2,235.1,5.4,435.1,230.9,237.2,216.9,399.2,352.5,755.2,506.1,592.5,156.1,76.1,71.9,76.1,110.5,95,96.7,37.8,52.3,53.9,403.4,850.4,600.7,1798.8,83.1,182.3,346.2,280,434,310.8,589,175.3,257.6,99.1,200.8,177.8,239.7,221,183.5,294.5,358.8,203.8,362.9,219.3,311.5,173,234.2,233.7,185,457.6,132.6,351.5,494.2,884.5,485.6,353.8,160.2,453.9,290.9,173.9,189.2,53.5,186.1,485.9,520.3,583.7,556.4,530.3,549.4,688.6,444.1,745.4,399.5,597.9,450.2,449.1,490.6,383.4,90.8,372.3,80.2,76.8,81.8,45.5,59.5,65.3,96.9,402.1,451,55.8,760.8,197.2,47.1,950.9,1091.7,394.7,3070.8,497.3,495,3563.9,81.3,1277,78.8,144.1,123.1,137.1,174,52.8,1748.8,887.3,913.5,905.3,1712.3,60.1,1028,6.6,1348.5,149.4,480.7,266.4,2006.1,254.5,1296.3,650,554.4,83.3,89.3,265,74.1,130,87.1,551.8,337.6,733.4,346.8,17,692,860.6,950.9,945.9,707.3,789.5,48.1,1241.2,1163.2,390.3,845.4,1185.3,997.1,495.6,54.3,1377.5,1027,269.6,60.5,1013.2,1003.5,223.9,379.6,449.2,701.4,601,14.4,600.1,545.8,19.9,630.7,686.5,445.4,187.7,639,61.5,72.9,276.2,321.7,1258.9,310.6,154.6,137.6,84.3,30.3,52.4,1218.5,1006.4,644.8,280.6,283.4,780,350.2,207.7,459.4,100,354.5,94.7,307.6,501.7,354.1,295,385.8,338.8,2812.4,412.1,362.5,3983.6,40.3,6.8,920.9,194.4,123.8,0.6,399.3,42.4,64.7,770.3,843.2,465.2,289.1,187,184.8,210.4,511.6,847.2,901.8,840,302.3,89.4,967.4,210.2,168.5,345.2,1253.5,1049.2,80.5,97.7,447.6,60.7,385.5,601.7,681.4,195.5,522,1031.1,825,4580.3,28.8,611.7,1580.7,729.4,3135.3,54.4,5299.2,676.9,410.7,115.3,225.2,144.4,151.6,839.1,990.6,631.9,3.1,336.3,192.7,255.5,132.2,148.4,244.9,164.4,31.3,515.2,317.4,319,345.6,354.3,363.1,219.3,103,192.8,184.7,232.2,313.4,485.8,131.3,466.7,367.3,224.9,313.9,191.4,107.9,136.6,310.8,326.8,347.3,333,323.7,355.3,367.6,323.4,374.7,351.9,233.3,2.6,138.5,47.1,222.9,64.3,186.6,418.5,48.2,247.2,122.2,318.3,136.3,58.1,51.5,69.9,22.7,86.7,59.2,273.7,246.8,130.4,146,315.2,177.7,182.8,397.5,254.8,342.2,217.1,51.8,45.6,86.6,191.4,172.9,309.9,112.4,26.5,276.2,98,137.8,236.1,320,146.7,86.1,63.3,155.7,219.1,144.3,314.2,33.9,211.2,268.9,120.5,1.6,390.3,86.4,166.7,58.6,2.9,240.2,64.2,304,75,41.5,222.5,162.1,183.6,205.7,45.8,141.7,148,58.8,184.4,392.5,182.5,252.9,342.8,37.7,388.1,226.3,253.1,401.8,28.3,13.2,19.7,40.7,15.3,12.1,11.5,10.7,9.7,9.5,7.7,9.8,11.2,9.1,9.4,8,9.5,9.5,9.5,9.4,10,8.6,9.6,10.9,11.3,14.2,51.8,44.1,332.9,832.9,1151.5,197.9,314.5,848.8,391.6,48.1,187.2,126.8,167.2,307.8,127,157.2,603.1,397.6,62.4,25.4,30.4,103.4,150.8,560.7,93.8,69.6,16.5,12.5,42.1,78.8,41,74.2,49.8,138,83.6,107.8,78.3,91.4,95.6,124.7,36.9,111,158.4,92.5,124.8,75.6,129,199.4,140.8,44.3,201.4,30.5,19.4,184.9,200.5,215.6,198.2,64.2,83.6,42.7,477.9,117.6,165.6,65.9,128.9,169.3,48.9,15.9,16.6,29.1,12.6,37.6,12,37.3,383.7,32,60.4,79.2,89.1,33.8,26.6,31.2,57.4,55.8,184.4,90,77.8,117.4,24,25.6,18.3,22.7,37.9,51.2,188.3,4.2,34.1,27.5,178.9,21.6,56.4,23.5,24.2,22.8,33.4,198.2,112,143.9,141,14.9,57.4,67.7,181,190.2,100.3,41.5,20.7,30,18.3,39.6,21.2,28.7,18.5,47.4,168.4,34.1,58.9,83.8,61.8,55.5,35.2,20.7,30.4,20.9,34.1,22.4,23.2,19.9,25.5,21.2,27.3,27.7,16.2,31.4,133.8,344.2,455.3,386.7,176.2,203.6,196.2,34.5,24.7,17.1,34,34.6,23.4,14.3,34,84.2,237.1,32.1,507.8,53.5,14.1,28.9,45.9,33.1,35.7,33.2,41.2,41.1,46.6,48.4,33.4,30.7,31.1,25.5,27.4,23.6,26.1,16,44.5,63.5,31.4,19.5,15.8,30.5,221.8,34.6,45.3,149.2,26.2,28.2,32.4,16.5,20.3,28.9,23.2,33.2,30.9,51.3,48.3,31.8,330.8,79.9,102.3,24.8,47.6,25.5,19.1,23,22.2,24.9,51.3,245.3,86.9,88.6,19.5,18.5,22.3,17.7,19.1,20.8,15.6,41.2,15.8,28.5,23.8,24.9,27.6,50.7,18.7,58.3,124,124.2,130.6,101.9,154.5,46.3,55.1,36,49.8,26.4,23.9,24.4,30.5,37.3,16.3,99.8,91.9,118,56.3,33.9,27.8,17.2,40.1,23.5,33.2,25.5,17.9,23.3,45.9,26.2,23.8,38.8,33,19.8,40.4,22.8,18.9,29,83.2,142,165,27.2,90.4,86.4,52.7,46.5,53.6,30.4,61.5,66,21.6,181.5,192,62.4,276.9,127.5,94.2,80.9,57.9,120.3,189.5,1167.2,230.2,535.9,83.1,45.7,44.5,232.8,73,72.3,50.8,59.2,91,143,86.4,77.6,64,352.5,80.5,43.2,41.4,39.2,40.3,36.5,33.5,63.5,60.3,291.7,32.9,39.2,46.4,30.5,39.4,136.6,33,21.4,36.5,33.4,62.6,65.1,99.4,79.5,69,67.5,64.4,193.5,231,45.4,65,62.4,63.6,47.8,16.8,50.5,53.8,130.9,98.2,34.4,70.4,48.8,64.8,39.3,330.7,61.4,55.2,85,39.3,48.6,45.9,47.1,36.4,41.3,40.2,37,231.3,77.8,55.4,390.4,213.1,139.6,184.4,32.3,59.1,90.8,189.7,130.2,240.8,82.6,114.4,75.3,118.9,26,52.1,69.7,69.1,231.9,122.9,78.2,39.5,74.1,105,128.6,64.8,73,80.2,51.7,291.6,2.1,173.5,193.2,50.9,308.4,62.5,251.6,62.1,80.6,82.1,46.7,58.9,75.8,56.8,185.3,76,89,122.7,116.2,362.8,58.2,208.3,141.9,97.8,69.8,256,164.9,64.1,89.7,73.8,97.8,116.9,115.1,102.3,55.9,488.3,46.7,45.5,41.2,178.5,44.6,43.5,42.9,44.6,41.7,462.8,261.7,43.8,40.4,39.7,38.5,41.4,40.2,41.6,41.9,46.7,45,44.3,44.1,45.1,44.7,44.8,55.1,50,147.8,49.7,50.6,53.7,174.8,22,76,47.2,46,38.9,40.6,40.1,39.8,42.9,123,130.3,206.7,103,109.7,23.8,92.6,21.7,22.9,21.3,21.9,21.3,21.5,24.6,34.6,16.7,16.6,17.4,17.1,195.4,48,85.6,69.3,196.5,43.6,39.5,39.9,38.9,115.7,97.7,79.9,47.1,45.2,43.9,99.4,58.6,55.8,52.4,36.9,27.8,51,47.4,42.3,41.4,43.5,44.6,46.5,41.3,49.3,45.7,47.3,38.4,47.1,38.9,50,43.8,69.7,441.9,184.4,65.6,37.3,39.5,30.6,37.9,47.1,59.4,112.5,72.5,40.2,115.1,80.1,10.6,14.1,33.1,122.5,97.2,7,44.2,134.5,50.5,6.2,47.8,30.9,33.6,26.6,26,21.4,24.7,21.1,35.9,190.9,42.6,44.7,47.8,28.4,21.6,24.3,24.4,30.7,30.5,28,26.3,29.9,28.8,29.3,35.1,27,27.7,24,34.1,27.9,30.9,31.6,40.1,39,43.2,79.4,32.7,35.4,36.3,97.1,25.1,25.3,21.5,29.2,188.7,31.4,7.5,26.5,37.4,18.9,16.1,27.5,5.7,32.5,36.5,42.9,94.7,62.9,6.3,37.3,22.7,23.2,28.4,59.6,164.7,69.3,52.4,328.1,56.3,35.4,30.7,27.5,26.3,25.6,24.6,26,22.2,23.8,23.3,27.1,23.2,26.3,143.1,31.4,28.7,26.8,22.8,24.1,24.5,45.8,85,30.5,27.5,26.1,22.6,24.9,24.7,29.4,31.8,19.6,93.2,181,106.9,40.7,30.1,37.3,88.1,36.7,27.2,3.3,32.8,28,30.8,30.9,29.5,26.8,34.3,103.9,58,43.5,46,3.3,38.2,191.9,268,234.8,20.5,43.8,31.6,104.4,13.8,167.2,60.7,47.5,46,54.7,5.1,60.1,69,262.6,102.2,136.7,198.8,6.5,25.5,30,14.4,18.1,8.1,31.2,31.9,134.3,379,32.1,246.8,9.9,25.9,17.6,238.3,5.1,47.8,2.5,78.1,41.3,33.6,35.7,160.3,69.4,19.2,208.7,87.3,34.9,57.3,16.3,41.5,59.1,33.3,174.8,87.7,67.8,371,45.9,27,25.3,15.8,28.5,32.8,66,101.6,14.5,112.7,6.3,18.2,202.5,250.2,314.8,21.5,10.8,41.2,23.9,42.2,34.6,27.1,30.9,27.6,18.3,26.8,23.8,26,24,26.7,29.1,27.3,11.8,21.7,25.8,68.2,30.9,37.2,33.6,70.1,141.8,110.5,62.8,116.1,20.1,24.3,10.4,48.3,64.9,28.2,23.9,63.8,51.9,47.9,65.6,170.1,67.2,54.9,257.2,19.5,36.3,34.1,44.3,43.8,44.8,107.8,145.8,44.6,17.9,12.7,27.4,21.5,21.8,22.3,22.7,21.5,20.4,23.9,22.3,56.8,35.1,61.6,13.5,11.8,13.4,14.7,15.4,19.4,19,11.2,14.4,12.4,18.5,18.4,37,38.4,36.4,33.3,35.6,211.9,225.4,86,801.7,666.9,60.7,71.3,513.5,577.8,600.6,55.5,58.9,59.6,58.5,56.9,60.7,56.9,57.9,58.4,59.7,174.7,720,566.3,195.9,871.6,91.8,41.1,450.5,85.3,57.7,59,58.6,59.1,60,57.5,59.8,63.4,660.2,814,772.2,81.5,550.4,47.3,42.8,46,43.8,45.8,46.6,43.6,46.9,44.6,42.3,45.3,47.2,43.1,46.9,43.5,43.3,408.7,1068.2,47.9,41.9,45.5,42,41,43.5,44.4,43.3,43.9,44.5,41.1,45,41.8,42.6,41.4,462.7,329.6,480.5,706.2,238,45.6,46.1,44.5,42.5,44.8,40.9,49,44.3,45.4,44.7,44.6,37.4,5.5,619.4,830.8,713.2,72.1,273.9,201.5,44.4,46.8,43.8,43.3,46.4,41.6,41.5,41.7,2.1,235.6,43.5,44.3,42.7,43.1,43.9,44.7,44.6,46.6,41.4,41.3,41.7,42.2,429.3,62.9,36.9,58.8,28.3,82.4,43.5,44,42.3,41.8,43.5,44.5,763.1,42.2,42.6,40.5,42.6,43.2,41.9,42.3,42.2,41.9,41,41.4,41.9,42.9,42.1,370.1,41.4,45.4,43.3,41.5,43.5,42.9,43.8,43.2,43.3,44.7,43.5,111.2,507.5,77.6,399.7,43.5,632.4,59.1,55,53.5,57.7,58.5,56.7,59.6,54.6,55.2,59,60.8,1068.3,259.5,46.9,45.5,43,44.6,39.1,45.5,41.5,45.9,42.4,43,163.9,264.2,313.2,52.3,47.6,45.9,43,42.9,46.4,44.3,1235.3,43.6,43.7,41.4,45.3,42.7,40.9,46.9,47.9,40.6,46.9,44.3,204.4,202.3,214.4,95.9,88.8,101,539.2,137.8,145.5,116.5,29.6,129.7,40.3,20.3,62.4,76.2,34.2,28.7,28.7,28.2,23.1,16.9,30.2,23.4,27.2,22.8,19.3,10,14.4,16.3,18,16.6,15.2,17.1,19.4,20,24.5,22.1,47.6,41,113.1,37,16.8,16.1,52.2,41.7,156.4,109.8,23.3,16.5,142.1,180.9,90.5,219.4,78.3,41.9,46.8,56.8,42.9,39.2,78.5,39.1,68.7,52.2,44.4,46.5,48.3,50.7,605.5,243.9,65.1,34.4,30.5,73.6,77,50.5,34.7,33.3,32.1,184.5,62,692.2,106.5,38.4,33.9,27.2,26.3,47.6,82.3,33,32.2,30.9,29,31.8,33.6,48.3,40.7,258.6,512.6,78,361.5,193.5,81.6,200.2,14.5,122.9,63.3,37.5,72.9,58.2,52.2,37.3,33,29.7,41.5,20.9,19.2,42,27.4,29.7,23.8,25.4,27.1,22.8,101.4,57,18.8,325.8,54.2,50.3,281.9,40.1,56.1,73.6,181,112.6,155.1,120.7,306.7,20.4,44.5,60.9,20.1,73.3,24.1,44.2,72.9,28.7,27.3,37,35.1,36.6,14.7,20.1,35.3,48.8,57.4,175.6,76,117.1,97.5,417.5,304.9,72.7,44.6,46.5,42.1,45.7,26.1,29.4,41.1,25.3,25.4,502.1,332.6,165.9,342.7,63.3,169.8,39.6,14.4,70.4,54.9,235.4,399.6,414.5,36.2,32.4,30.9,18.4,23.2,25.1,7.8,15.6,31.3,37,17.9,19.3,464.3,67.1,217.6,571.8,165.4,171.4,11.1,339.3,104.6,127.2,142.3,43.8,122.2,29.4,288,54.3,94.8,30.9,28.4,78.7,115.8,70.6,113.2,68.4,36.6,34.1,17.3,83.2,241.6,160.2,243.3,84.7,81.7,100.1,74.1,96.4,93.4,544.5,175.3,65.4,66,80,32.6,265.4,68.7,61.4,62.1,61.8,59.4,228,64.2,64.1,66,57.3,344.5,59.1,56.8,52.7,68.1,67.3,80.7,127.8,53,270.8,760.1,52.7,49.5,48,44.2,44.2,38.1,1072.5,308,93.4,64.9,58.1,60.2,60,50.9,1.5,657,927.5,44.8,44.9,45,43.8,43.4,45.9,43.9,41.5,467.7,265,102.3,33,52.6,49.9,55.6,42,14.1,15.9,56.5,59,16.2,3.8,121.1,23.5,27.5,27.8,26.4,48.8,53.6,13,39.8,38.2,67,140.7,16.6,29.3,26,35.8,29.4,35.6,18.4,90.1,42.9,18.3,15.3,16,15,14.3,11.8,13.1,13.4,13.2,14.2,12.5,12.7,13.4,16.3,19,18.2,17.2,15.7,18.3,16.9,19.4,19.4,18.7,18.3,19,16.8,19.8,20.2,155.9,14.8,12.1,12.4,12.8,7.8,8.5,6.7,8.1,14.7,14.8,14.6,12.6,12.3,22,23,20.2,27.8,174.7,34.7,20.5,45.2,45.6,47.3,51,45.4,45.7,48.5,25.1,26.4,25.8,11.3,38.5,40.3,288.8,45.9,44.5,42.8,47,42.3,46.5,44,46.5,45.3,44.3,43.2,42,44.2,43.8,45.2,46.4,241.4,48.1,45.2,44.1,39.8,418.2,42.2,43.6,60.2,25.7,84.6,48.2,43,41.1,38.7,43.4,241.5,42.8,43.3,43.2,42,43,42.5,500.8,42.3,42.4,40.7,42.5,43.3,28.6,29.1,28,29.7,30.3,126.2,85,43.1,21.3,21.2,42.5,36.6,40,22.2,21.3,51,43,42.6,42.5,42.6,42.4,42.9,44.3,43.2,128.5,40.9,42.4,43.3,42,42.8,41.8,42.6,42.5,42.4,42.4,42.4,42.7,42.1,42.7,42.9,42.1,43,100.3,145.9,47.7,34.5,31.7,35,35.2,42.9,42.8,43.4,42.5,43.5,42.8,32.1,97.3,42.8,42.8,42.9,42.2,43.3,43.1,122,44.8,44.4,42,45.3,46.5,45.6,325.3,26.9,110.5,48.3,49.7,51,49.6,49.4,50.9,48.5,51.1,48.5,50.3,48.8,203.1,26.5,202.5,97.9,51,51.8,49.5,41.8,47.3,312.2,34.5,32.7,30.4,30.1,31.8,30.1,30.3,29.3,26.7,29.5,30.4,29.4,27.1,24.8,30.4,30.4,29.7,31.9,226.7,34.4,30.6,30.2,30.1,30.6,31.4,33.1,33.2,32.3,25.2,19.2,21.8,37.5,40,33.6,41,36,40.8,42.8,40.8,32.2,80.4,10.8,158.8,68.7,31.4,41.9,39.8,43.1,40,38.7,35.8,28.7,29.4,31.3,31.5,129,36.1,35.7,33.3,33.5,35.7,33.6,35.8,32.8,36.9,49.4,46.1,138.5,36.3,33,35.5,36,38.3,48.8,47.3,53.1,49.4,49.3,44.6,45.7,45,47.4,629.6,110,117.3,360.5,346,49.4,46.2,47,47.3,47,47,45.3,42.5,44.1,43.9,46.5,106.4,128.4,363.8,91.8,254.3,355.8,42.3,44.2,46.4,45.2,41.1,39.1,39.9,36.2,39,82.4,84,45.8,45.7,43,39,39.2,36.4,39,35.4,38.4,38.6,38.3,39.2,42.1,38.6,299.9,51.1,47.3,42.8,41.8,40.6,40,43.1,41.8,41,38.3,249.1,77.7,324.1,49.4,43.9,48.1,262.3,36.7,38.4,38.7,36.1,188.1,224.3,61.9,56.2,58.9,57.3,476.8,70.9,377,117.5,108.7,0.7,89.4,300.6,41.9,41.8,42.6,43.1,42.3,44.1,43.1,40.9,42.6,42.6,41.8,42.4,41,40.4,41.7,40.4,40.1,41.5,39.7,298.6,77.6,33.1,34.8,42.8,43.9,44.3,44.4,43.4,43.4,43.5,44,37.1,36.1,27.7,26.7,39.8,35.5,43.7,43.5,44,43.9,43.3,410.7,67.5,55.4,59.6,300.5,771.5,36.1,35.9,36.5,35,36.1,35.2,37.5,36.9,35.9,40.3,40.9,31.1,36.2,32.2,37.2,20.2,20.4,24.1,25.3,29.8,31,29.1,32.2,33.7,157.4,60.3,24,29,28.7,33.6,28.8,28.9,17.2,16.8,32.6,29.8,30.3,29,28.8,31.6,29.4,26.9,29.9,26.4,29.6,32,22.8,27.2,29.3,29.6,30.1,30.3,28.3,31.9,28.4,205.1,48.4,96,43.6,27,28.2,27.9,24.7,29.8,28.6,27.3,26.7,29.3,28.8,28.1,26.8,28.8,27.5,27.1,27.8,28.3,28.2,26.9,30.6,26.2,28.3,27.5,26.8,29,26.5,82.1,199.8,333.9,87.6,29.6,30.4,29.6,30.1,30.3,34.2,33.2,30.4,29.5,31.1,28.9,31.6,29.6,33.5,27.9,29.2,29.6,29.9,29.4,30.8,30.8,29.5,29.7,28.8,30,30.4,30.8,30.4,28.7,27.4,29,31.2,31,29.5,30.4,27.1,30.1,32.1,33,31.6,33,32,34.6,167.6,179,43.5,43.8,43.2,43.2,44.1,42.6,43.5,43.6,44.4,43.6,42.7,178.6,31.7,68.9,40,33.7,35.8,37.1,40.9,42.4,49.7,51.8,54.9,50,54.4,52.9,51.2,51.9,173.7,50.6,51.9,49.4,49.9,49,49.5,51.5,50.7,49.6,46.3,53.7,312.2,274.2,162.1,96.1,178.4,87.9,58.6,59.1,72.9,58.9,53.8,3.6,56.4,59.8,901.8,40.3,40.4,38.4,40,39.6,35.6,38.9,39.3,37.8,39.1,38.6,38,40,199.1,38,34.3,36.3,36.3,38.6,37.5,200.8,37.1,39.5,34.1,24.2,14.5,14.7,14.8,14.7,14.3,15,14.5,15.4,13.9,12.5,501.6,181.7,14.9,14.4,14.8,14.5,14.5,14.5,14.5,14.6,14.5,15.3,14.8,14.6,14.9,14.2,15.3,14.2,14.6,14.9,14.5,14.8,29.7,468.1,14.5,14.5,14.3,14.9,15.1,14.4,14.6,14.6,15.1,14.7,14.5,15.3,14.2,14.7,14.4,14.4,14.7,14.6,14.7,14.9,14.5,14.7,14.7,14.6,15,14.7,14.6,14.5,29.7,176,331.8,34.5,386.9,14.9,13.9,15.2,14.7,14.8,14.5,14.8,14.7,15.2,14.2,14.6,14.7,14.3,14.8,14.7,15.2,14.3,14,15.6,14.4,14.9,14.5,14.4,15.2,14.3,14.7,14.5,14.6,14.4,15.4,14.8,14.3,14.7,14.7,14.5,14.6,15,366.9,14.6,14.5,14.8,14.6,15.1,13.7,15,15.1,14.3,14.3,14.9,14.3,14.8,15,14.3,14.8,14.6,14,14.6,718.7,14.1,14.4,14.7,14.8,14.6,14.5,14.7,14.5,14.7,14.8,14.7,14.6,14.4,14.7,14.7,14.5,14.4,14.8,14.5,14.6,14.7,131.1,14.8,15.2,14.8,15,15,15,15.3,15.2,15.3,15.4,15.1,15.2,14.5,14.3,14.8,14.6,14.6,14.8,14.5,14.6,15,14.4,15,14.7,14.9,14.6,14.8,14.9,616.4,14.6,14.7,14.7,14.7,14.7,14.5,14.5,14.8,14.4,15,15.1,14.3,14.8,14.3,14.7,14.7,14.9,14.8,103.4,219.8,14.4,14.9,14.5,14.8,14.9,14.3,14.7,14.4,14.5,14.7,12.2,2.3,14.6,14.7,14.8,15,14.4,14.8,14.5,67.9,34.7,203.9,14.8,14.5,14.4,14.6,15.1,13.9,15.1,14.6,14.7,14.8,14.5,14.8,14.5,14.4,14.5,14.9,14.8,14.7,14.6,14.7,14.6,15,14,14.6,14.7,14.5,15,14.3,14.9,14.5,14.8,14.4,14.8,14.5,131.6,14.3,14.7,14.8,14.6,14.8,14.5,14.9,15,14.2,14.4,14.8,14.7,14.3,14.9,14.9,142.4,28.3,134.5,438.2,307.8,14.5,14.9,34,15.4,15.4,8.3,14.6,14.8,14.3,14.4,14.6,14.7,14.3,15.1,14.9,14.8,14.9,190.1,175.2,14.8,219.4,14.6,14.6,14.3,14.7,14.7,15,14.4,14.7,14.4,14.7,14.8,14.7,14.5,14.6,14.7,14.8,14.5,14.5,14.7,15.1,14.5,14.8,14.7,14.7,14.2,15,15.9,14.6,13.3,14.8,14.7,14.7,14.6,14.9,15,15.6,13,15,15,14.7,15.2,13.6,14.7,14.7,14.6,14.9,14.5,14.5,14.8,14.6,14.7,14.9,14.5,14.9,14.7,14.6,14.9,14.9,14.6,15.2,14.2,14.6,14.5,14.6,14.6,14.7,14.6,14.4,15.2,14.4,14.9,14.1,15,15,14.6,14.7,14.1,14.5,14.8,14.7,14.8,14.8,14.5,14.5,14.9,14.3,14.6,131.8,14.9,14.1,14.8,14.9,14.2,15.3,14.6,14.2,14.5,14.9,14.3,14.8,14.4,15.9,13.9,14.6,14.4,14.7,14.6,6.4,18.2,14.8,14.5,14.7,14.7,14.4,14.8,15.1,14.3,14.6,14.6,14.8,14.7,14.4,14.4,14.4,4.1,5.7,14,14.4,11.9,8.5,6.8,16.7,14.7,14.8,14.7,14.5,14.4,14.8,14.7,14.3,14.7,29.3,117.2,321.8,147.7,26.3,49.5,86.3,14.9,7.5,7.4,7.5,7.1,7.4,6.9,7.4,4.3,9.4,8.2,8.2,7.5,6.9,7.2,7.9,8.1,6.5,7,6.7,6.4,8,7.9,7.2,8.1,6.9,7.7,6.6,7.6,7.1,7.7,7.1,7.6,7.2,7.7,6.9,7.7,6.2,6.6,8.1,8.9,6.9,7.5,7,8,6.7,7.8,7.2,7.4,14.7,14.5,14.9,14.5,14.9,14.3,59.6,19.8,21.1,110.4,28.2,50.4,92.2,68.6,264,41.2,33.7,18.9,55.5,85.4,28.5,27.8,29.3,28,28.9,30,29.4,29,29.1,20.8,32.6,25.4,24.6,66.4,6.1,3.7,26.4,103.4,49,15.4,30.8,46.4,28.6,31.2,26.7,28.5,23.2,23.1,24.8,21.4,26.7,26.3,29.8,26.1,27.1,33.4,25.7,21.3,21.9,23.4,22.2,21.1,21.1,24,22.3,21.9,22.7,21.1,24,21.5,21.7,23.4,20,22.3,22.1,23,36.6,193.5,33.1,22.3,22.6,24.2,27.9,78.8,118.5,18.2,14.8,139.4,320.4,137.1,81.9,48.2,94.9,35.4,30.7,114.8,45.1,126.6,14.2,6.6,30.4,29.5,29.7,27,27.2,27,30.3,26.5,30.8,28.9,30.7,29.4,29,30.4,149.2,55.7,29,29.3,28.3,27.4,28.8,28.8,33.8,31.2,30.5,34.2,30.3,29.2,31.1,28.8,319.6,30.3,28.9,30.3,29.2,29.4,28.9,27.8,30.6,29.3,28.1,32.4,29.7,28.2,28.7,28.7,87.4,131.6,305.4,29.3,28.9,29,29.5,29.3,29.3,29.1,29,29.1,29,29.1,29.1,29.1,29.6,27.3,14.2,12.3,29.4,29.2,29.2,29,29.5,29,9.7,22.5,29,29.4,29.3,29.3,29.3,29,29.3,29.2,29.1,29.2,29.2,29.3,29.4,29.3,29,28.9,29.3,30.1,29.4,29.2,58.7,57.9,58.5,58.2,58.1,671.7,204.1,321.4,147.4,363.1,320.2,335.5,174.9,58.6,58.1,58.3,58.6,38.1,19.7,39.8,26,52.7,53.8,94.4,58.2,37.6,13.6,15.3,15.2,13.8,15.5,15.1,14.8,13.9,14.4,14.3,15.2,15,14.7,14.5,15.1,14.6,14.8,14.4,14.7,14.2,14.9,13.9,119,28.9,14.4,14.2,14.9,14.2,14.5,14.6,14.4,14.9,15.6,14.9,13.9,14.5,15,12.9,14.8,14.5,14.8,14.6,14.5,14.9,190.2,8,79.8,80.7,35.4,30.6,73.4,59.1,159.5,48.4,5,116.3,65.5,12,252.1,11.9,168.6,35.9,228.6,43.2,38.9,38,56.1,6.3,29.9,32.5,68,31.7,131.3,47,28.4,25.9,29.2,28.2,25.7,28.7,29.6,30.2,30.2,26.1,28.6,30,22.4,28.3,31.6,40.3,32.2,29.3,29.6,31.8,27.5,29.4,30.9,27.5,33.3,30.1,29.8,139.3,30.7,31.8,27.8,30.7,14.6,15.1,14.5,14.6,14.9,15.3,14.4,14.3,14.7,14.8,117.6,136.3,197.8,119.8,14.1,15.6,14.6,14.6,14.5,14.7,15,14.6,14.2,15,15.1,14.1,15.7,14,15.3,14.5,14.6,29.9,102.9,160.2,14.5,15.3,14,15.9,14.3,14.5,14.5,14.4,14.7,14.6,15.2,14.8,14.5,14.9,14.8,16.1,14.3,14.5,14.6,14.8,14.5,14.7,14.3,15.1,14.4,14.8,14.7,14.2,14.1,14.6,15,14.4,14.6,13.9,15.2,14.3,14.4,14.6,14.2,14.4,14.5,14.8,14.6,13.8,15,14.4,14.3,15.2,14.3,14.5,14.5,14.6,14.3,14.6,15.8,13.5,15.1,14.7,14.8,14.6,14.8,14.7,15.7,13.6,15.3,14.7,14.8,14.6,4.6,10.3,14.7,14.8,15.4,26.3,85.7,14.4,14.3,14.7,12.1,8.1,157.8,7.2,7.1,7.2,7.4,7.7,7.6,7.7,7.6,7.6,6.7,5.7,5.3,5.1,5.8,5.7,5.5,10.2,10.7,138,14.9,13.1,16.4,15.6,45.8,13.7,12.4,7.3,7.2,7.8,7.3,7.3,7.4,6.3,6.3,6.9,6.3,6.6,6.3,7.9,8.6,8.4,10,9.9,9.6,10.3,11.4,9.9,9.2,9,9.2,10.1,18.8,9.7,9.1,30.9,29.2,46.1,15.2,30.1,269.3,29.8,40.3,20.1,20.1,19.7,20.1,19.6,25,74.4,56.6,38.1,18.2,7,6.7,9.6,24.5,27.1,49.5,10.1,10.7,10.4,10.6,10,10.9,56.8,34.8,35.1,58.3,6.9,4.9,46.1,5.7,8.4,7.9,12.4,14.3,4.4,26.8,11.1,6.7,14.6,19.9,13.9,5.6,1.9,9.6,0.2,6.2,5.3,3.1,3,1.3,1.6,4.9,5,30.5,74.6,105.2,139.2,7.2,8.7,40.4,88.7,8.7,10.1,128.4,8.4,10.4,62.7,65,8.3,9.5,67.1,60.8,9.2,9.6,35.6],\"duration\":[19.706,16.303,9.294,7.941,2.655,2.192,1.993,1.132,2.16,6.672,2.28,1.714,1.285,2.405,0.971,0.179,1.271,2.998,1.202,1.34,15.102,2.266,6.696,1.907,0.984,4.822,6.193,4.029,2.383,3.164,17.704,5.98,4.562,10.77,3.031,9.017,7.141,0.301,5.662,4.974,0.813,5.154,5.046,5.062,5.328,16.388,2.519,0.763,3.136,5.058,0.663,7.645,22.458,3.171,4.62,5.486,0.401,3.971,3.774,2.155,2.332,1.557,4.4,5.285,4.769,1.972,3.094,1.282,1.719,2.427,5.054,12.178,4.889,5.428,0.437,2.113,2.114,3.317,0.887,2.576,1.161,4.408,0.767,8.857,2.265,1.622,5.496,5.211,1.668,0.267,13.826,3.748,1.362,1.218,3.807,4.871,2.974,12.692,8.906,11.957,2.338,13.254,0.501,4.569,3.187,4.008,1.483,0.22,3.206,2.625,1.703,1.747,3.879,3.42,3.794,16.324,18.328,3.072,2.036,5.533,0.737,4.208,0.886,1.709,1.086,9.134,2.054,1.897,4.369,1.256,5.01,1.127,0.554,0.434,3.436,1.703,2.476,0.959,1.095,2.431,1.75,0.628,1.637,1.138,10.269,6.412,10.554,5.586,0.108,11.742,3.609,1.708,4.949,0.324,1.603,11.847,2.186,1.02,3.115,5.392,2.058,1.332,1.544,3.878,0.59,1.226,3.712,1.813,0.731,0.908,1.603,2.153,0.424,1.856,6.469,0.714,12.371,0.401,3.886,3.357,0.668,1.67,1.102,0.421,2.334,6.786,2.098,9.338,4.519,0.539,2.38,4.491,4.146,1.233,5.549,1.495,1.287,3.617,5.78,2.451,4.794,1.033,4.194,1.66,6.936,0.972,6.597,1.958,4.691,3.63,25.507,1.756,3.569,3.454,1.708,7.386,2.227,2.696,1.75,1.947,2.163,1.65,1.851,0.723,0.731,2.677,2.234,2.194,5.176,1.194,1.223,1.254,1.161,1.256,0.579,1.945,1.25,1.296,5.258,2.716,5.633,0.052,1.827,1.807,1.113,1.176,1.146,1.143,1.104,1.14,1.167,1.235,1.168,1.102,1.203,1.14,1.123,1.134,9.957,1.163,1.13,1.171,1.13,1.139,1.178,1.211,1.097,1.148,1.15,1.108,1.185,12.104,1.174,1.068,1.233,1.229,1.313,1.231,1.287,1.255,1.218,1.141,1.155,1.238,1.181,1.192,1.147,1.206,15.82,1.245,1.159,1.149,1.13,1.133,1.172,1.149,1.168,1.088,1.137,1.174,1.164,2.24,1.28,1.196,1.178,1.202,1.234,1.179,1.202,1.158,1.023,1.362,1.536,1.218,1.187,1.2,1.254,1.201,1.188,0.962,0.941,0.896,0.891,0.908,0.874,1.241,9.161,0.559,10.05,1.726,2.723,1.923,3.07,1.145,1.15,1.197,1.183,1.202,1.129,1.186,1.206,1.058,1.151,1.136,1.201,1.093,1.18,1.188,1.129,1.114,11.656,1.212,1.15,1.107,4.837,1.182,1.247,1.184,1.25,1.197,1.223,1.271,1.22,1.209,1.244,1.213,1.242,1.227,1.251,1.263,1.209,1.199,1.216,1.246,1.206,1.209,1.197,14.61,1.21,1.164,1.1,1.118,1.192,2.273,1.131,2.481,1.16,1.179,1.211,1.224,1.237,1.344,5.827,1.34,2.197,1.112,5.627,1.285,4.286,1.172,1.18,1.166,1.175,1.171,1.1,1.165,1.157,1.167,1.083,0.89,1.688,0.922,0.92,1.351,1.721,3.358,2.755,4.177,5.994,2.217,1.919,2.369,2.261,2.887,7.593,1.565,1.442,4.143,1.107,1.162,1.176,1.161,1.083,1.02,1.115,1.191,1.059,1.103,1.149,1.205,1.137,1.126,8.716,1.183,1.722,2.388,1.414,1.021,1.265,1.238,1.375,1.14,1.137,0.689,1.177,1.216,1.125,2.192,2.05,4.373,3.94,1.164,1.486,1.587,1.894,1.128,4.082,1.336,2.765,16.287,4.222,2.564,2.156,3.347,1.123,5.013,1.563,4.993,5,1.672,1.623,5.551,10.861,1.954,9.779,3.452,0.605,0.988,1.767,0.845,0.229,2.63,1.423,2.029,1.563,1.457,5.205,2.645,1.645,3.052,7.735,2.461,1.596,2.731,2.187,4.67,2.048,1.537,1.623,9.606,2.178,2.045,1.303,2.076,1.452,3.179,1.95,10.582,1.493,1.522,1.501,1.521,1.511,1.466,1.474,1.349,1.886,1.355,1.504,8.723,16.917,1.806,5.951,3.906,1.506,9.005,1.51,1.467,1.437,1.539,1.486,1.938,2.319,4.689,5.712,1.98,2.956,1.89,2.417,1.835,34.142,1.642,10.817,11.412,1.83,8.746,2.583,1.337,1.257,1.419,1.405,2.278,1.762,2.172,2.22,1.467,2.623,5.855,1.606,1.368,1.636,2.46,1.323,2.376,1.634,1.462,1.234,1.775,1.302,1.636,1.571,17.849,6.962,2.739,1.744,17.347,10.094,4.806,1.97,3.37,8.999,13.165,7.182,1.831,12.909,10.807,8.86,1.948,15.683,4.192,2.538,1.853,1.504,1.51,1.979,3.788,1.637,6.48,1.931,3.366,3.536,1.728,2.628,1.609,2.32,6.741,3.315,1.068,1.105,1.732,1.417,1.662,4.586,3.46,2.079,1.796,2.401,3.062,2.928,6.137,1.792,5.104,2.996,2.08,2.362,1.646,11.634,3.602,3.329,1.676,1.88,1.414,2.188,13.383,3.007,2.598,1.724,3.873,9.514,3.177,26.296,17.559,1.378,2.938,9.813,1.482,14.72,6.169,0.081,4.174,4.156,11.205,9.586,3.738,4.431,2.236,1.22,2.271,3.195,2.917,3.411,2.504,1.819,3.18,1.242,1.531,1.253,7.751,8.116,9.586,2.216,1.778,1.608,1.998,3.61,2.959,0.611,2.117,1.953,2.731,5.502,13.51,2.204,1.242,1.201,1.151,1.236,1.051,1.201,1.236,2.304,1.187,1.141,1.005,1.162,1.233,1.113,8.367,1.154,1.41,1.283,1.176,1.15,1.256,4.833,21.225,2.075,2.352,1.99,2.114,2.218,2.131,2.179,1.393,1.325,9.195,1.212,1.351,1.304,1.27,1.504,1.53,1.921,1.553,1.505,1.814,1.829,3.176,3.357,3.348,3.112,2.602,2.147,1.995,2.031,1.99,2.083,2.064,3.431,20.717,8.819,8.119,2.097,1.969,2.464,2.355,1.88,22.972,2.641,3.371,2.62,2.267,1.169,0.875,5.219,5.019,2.391,5.691,3.113,2.201,2.274,19.237,26.802,26.46,1.279,15.98,7.949,2.744,7.712,5.225,8.818,21.566,8.46,8.355,3.481,2.739,3.789,16.033,14.087,8.609,7.755,1.815,1.681,1.731,1.746,5.806,1.906,2.031,1.931,2.038,2.061,13.381,17.026,3.677,5.867,7.14,1.946,6.741,1.874,1.601,1.204,1.202,1.087,1.169,1.128,1.278,1.31,1.283,1.353,1.843,11.529,26.449,3.592,1.817,1.751,1.679,1.682,1.742,1.78,4.521,27.764,3.037,2.617,1.652,1.559,1.477,1.438,1.564,1.52,1.476,1.019,0.218,2.133,1.549,16.212,1.495,1.599,1.444,1.479,1.732,1.52,1.542,1.666,1.776,1.598,1.589,1.54,1.647,1.647,1.77,1.449,1.649,1.686,1.66,9.869,1.652,1.657,1.61,1.607,1.669,1.662,1.662,1.641,1.649,1.643,1.694,3.782,1.612,1.617,1.632,1.408,1.607,1.614,1.57,1.612,1.633,1.648,1.485,34.057,2.445,2.488,2.489,2.331,2.49,2.393,2.405,2.156,2.411,2.399,2.4,2.369,2.216,2.21,2.159,2.138,3.349,9.329,12.923,2.614,15.276,2.049,6.596,1.919,1.84,2.016,2.041,3.509,2.146,2.115,2.153,1.953,1.778,2.315,1.294,2.341,2.239,7.454,2.377,2.181,2.067,2.395,12.497,14.091,3.758,24.342,2.123,2.166,2.122,2.149,2.1,2.51,4.137,2.769,1.986,2.16,7.73,2.313,2.229,2.277,2.1,2.102,56.248,2.138,2.108,1.766,0.363,2.195,2.093,2.086,2.64,2.615,1.9,1.679,1.885,4.388,2.007,2.06,2.17,1.996,2.191,1.929,1.729,1.669,1.799,14.002,2.569,2.545,9.348,1.997,2.084,1.854,1.875,8.997,2.406,2.241,2.267,2.371,2.426,2.183,6.983,2.208,2.116,2.172,2.19,2.236,2.541,2.317,2.091,2.168,2.089,2.128,12.431,2.028,2.024,1.814,1.897,1.567,1.74,1.675,5.854,2.17,2.42,2.118,0.998,1.789,1.772,4.145,6.007,3.72,2.879,2.507,2.371,2.92,2.933,2.463,1.968,5.234,6.373,3.605,2.649,2.102,2.008,1.855,3.891,3.115,3.092,3.359,3.326,18.377,2.171,2.093,2.996,2.86,4.028,3.327,3.081,5.258,5.21,2.426,2.484,2.491,2.989,19.848,1.911,2.029,4.749,2.382,2.315,2.97,3.015,0.708,2.832,3.717,2.002,1.318,5.307,4.067,1.906,31.502,0.9,3.019,3.428,4.774,12.367,3.615,3.363,2.303,2.273,11.458,2.437,3.557,4.085,3.49,3.416,2.708,2.732,25.345,9.27,9.26,2.274,1.565,2.161,1.973,1.724,1.88,2.871,2.572,4.269,4.223,2.619,3.297,1.902,2.216,2.103,2.332,1.796,1.941,2.122,2.091,4.138,1.98,1.939,2.968,2.37,1.818,1.809,2.255,2.473,2.234,2.69,3.12,1.112,1.146,3.303,5.763,3.908,2.999,2.496,2.426,3.082,2.412,2.351,2.578,1.644,21.695,1.547,1.502,2.13,2.254,2.122,2.177,2.547,2.785,1.474,1.476,2.628,2.214,36.876,2.277,3.542,2.682,3.179,2.935,9.423,0.451,1.594,2.474,3.452,3.431,3.497,4.08,4.452,4.381,3.961,2.986,5.06,3.805,2.058,1.978,0.983,2.696,3.281,2.326,1.74,2.658,3.74,2.719,2.765,3.022,1.229,1.762,1.649,1.622,1.635,1.801,1.54,1.913,1.601,1.633,1.626,1.486,1.487,1.405,2.311,1.78,1.613,1.5,1.498,1.385,1.254,2.041,2.068,1.907,2.246,1.82,1.932,1.806,2.181,2.032,1.886,3.308,1.92,2.11,2.103,1.559,30.664,1.489,1.444,1.443,1.468,1.507,30.044,1.584,1.651,1.668,1.757,8.78,1.623,1.623,1.621,1.585,1.579,4.492,6.314,7.239,2.102,13.347,1.748,1.936,1.834,1.757,1.873,1.776,1.691,39.104,2.899,2.747,2.575,2.537,2.692,2.673,3.095,2.724,2.805,68.398,0.23,2.841,2.722,3.28,3.931,1.123,2.613,2.576,21.515,5.724,3.008,1.731,1.733,1.681,1.572,1.538,2.336,2.231,2.337,2.334,2.294,2.103,2.533,11.674,1.877,3.009,2.107,2.659,2.532,2.312,2.424,2.446,2.324,4.669,2.388,2.434,2.453,2.411,2.524,2.436,2.373,2.777,2.69,2.539,2.42,2.655,2.577,46.063,21.572,3.27,2.782,0.417,3.217,2.818,16.771,1.956,1.912,1.952,1.891,1.838,1.95,1.945,1.835,1.909,1.815,1.865,2.017,1.777,12.648,12.278,17.531,2.195,7.848,11.789,28.078,1.841,1.898,1.718,1.645,1.916,1.834,1.651,1.748,1.765,1.828,1.784,1.846,16.817,29.701,2.108,1.827,1.838,1.729,1.639,1.681,1.654,1.809,1.814,1.808,1.756,1.684,1.783,1.712,1.619,1.511,1.64,1.681,1.708,1.575,1.633,1.835,1.81,1.718,1.881,1.018,11.491,3.584,15.742,1.743,11.196,8.587,6.872,8.602,19.73,2.019,1.639,1.649,1.587,1.464,1.542,1.579,1.66,1.759,1.697,1.787,1.844,1.772,1.828,1.88,1.832,1.872,1.391,1.5,3.622,16.703,12.755,3.529,6.355,9.53,36.099,3.375,3.338,3.389,3.028,2.665,3.007,38.674,2.527,7.877,3.815,1.829,4.879,3.553,2.689,8.225,2.802,2.197,2.159,2.198,2.364,2.448,10.043,2.132,1.719,3.587,2.011,1.439,0.207,2.695,5.646,6.565,6.798,4.317,2.871,3.642,1.475,1.388,1.392,1.645,5.741,1.747,5.853,5.098,9.03,1.714,1.247,1.397,1.42,1.501,1.248,1.541,1.511,1.717,1.622,1.346,2.02,1.668,1.51,1.443,4.951,17.33,1.553,2.38,2.443,1.835,9.754,4.002,1.292,1.115,3.817,2.696,5.604,1.822,0.416,2.468,2.917,2.61,3.212,3.252,2.313,2.525,5.145,7.317,2.513,2.219,2.245,2.316,2.48,2.201,2.167,2.127,2.297,2.292,2.471,2.173,2.239,33.476,8.081,5.383,3.161,2.162,1.184,1.178,1.26,1.264,1.181,1.129,1.153,1.173,1.09,1.198,1.145,13.494,34.536,9.42,14.826,25.371,29.717,3.657,26.843,21.325,14.965,20.127,6.868,24.78,12.962,8.734,17.387,5.869,5.795,3.839,2.473,1.377,2.561,2.578,2.534,4.883,2.449,3.649,2.473,2.451,2.436,2.446,2.455,2.459,2.456,2.456,2.457,9.013,13.493,23.397,15.923,7.832,0.157,3.979,3.946,4.785,4.706,9.318,29.985,27.504,15.692,13.039,34.305,25.189,33.458,0.578,1.29,20.875,27.416,14.185,31.123,6.046,43.255,34.132,49.287,34.402,34.182,37.829,31.155,40.373,22.591,43.887,39.847,0.111,28.689,3.769,18.087,28.341,22.192,23.216,44.197,4.487,22.21,7.83,17.419,30.483,21.659,1.079,23.12,22.396,28.418,21.691,25.358,3.626,20.317,24.202,29.691,26.174,22.755,0.771,16.117,13.701,24.331,22.768,23.907,28.737,15.439,27.444,11.94,13.707,4.982,40.562,36.561,36.372,0.257,43.869,33.131,46.673,32.439,44.73,41.114,23.632,36.946,36.736,0.424,40.492,36.16,22.379,20.395,29.348,9.326,3.968,5.95,4.912,3.687,15.643,19.19,48.126,29.714,1.878,116.401,12.61,7.008,30.275,29.313,35.322,167.376,42.976,4.225,3.388,5.768,18.715,14.566,6.511,25.334,21.142,50.176,36.508,15.439,81.98,59.816,61.399,9.675,67.256,37.866,25.197,8.48,24.919,5.527,4.9,19.897,7.996,24.078,7.662,61.645,98.453,56.691,126.427,1.59,23.569,46.071,34.37,33.012,20.014,113.277,89.184,47.562,207.612,17.774,14.62,11.011,10.98,10.862,26.643,3.976,21.095,19.257,23.836,8.292,11.835,21.384,7.585,15.126,6.648,7.005,11.081,20.522,9.787,1.894,12.151,3.502,4.979,5.054,5.722,19.646,2.602,2.705,7.062,5.197,4.519,2.027,4.086,3.926,4.099,6.112,7.557,0.175,13.986,7.422,7.624,6.971,12.83,11.329,24.275,16.266,19.044,5.619,2.738,2.588,2.741,3.978,3.419,3.482,1.361,1.884,1.939,14.521,30.614,21.626,64.756,3.085,6.698,12.716,10.285,15.944,11.418,21.638,6.438,9.461,3.679,7.376,6.532,8.804,7.799,6.477,10.395,12.664,7.193,12.808,7.742,10.996,6.107,8.267,8.249,6.529,16.152,4.68,12.407,17.442,31.219,17.14,12.487,5.656,16.02,10.266,6.137,6.679,1.887,6.568,17.149,18.362,20.601,19.639,18.718,19.392,24.303,15.676,26.308,14.099,21.102,15.888,15.852,17.314,13.532,3.206,13.676,2.946,2.82,3.006,1.67,2.186,2.4,3.561,14.77,16.569,2.028,27.665,7.246,1.731,34.931,40.103,14.501,112.807,18.085,18.185,130.919,2.987,46.912,2.924,5.189,4.433,4.935,6.264,1.94,62.957,31.943,32.886,32.592,61.642,2.229,34.912,0.224,45.798,5.488,17.658,9.788,73.695,9.351,47.619,23.878,20.364,3.062,3.28,9.734,2.721,4.775,3.199,20.27,12.402,26.942,12.738,0.625,25.419,31.616,34.932,34.747,25.982,29.002,1.805,42.966,40.264,13.51,29.263,41.029,34.515,17.156,1.729,49.591,36.973,9.707,2.267,37.219,36.865,8.395,14.235,15.699,24.513,21.007,0.504,20.976,19.078,0.697,22.043,23.995,15.568,6.559,22.333,2.15,2.323,10.358,12.065,47.209,11.649,5.799,5.16,3.161,1.138,1.944,45.224,37.352,23.93,10.414,10.519,28.949,12.996,7.63,16.874,3.749,13.293,3.551,11.536,18.813,13.28,11.061,14.467,12.705,105.466,15.455,13.593,149.384,1.482,0.218,29.338,6.193,3.943,0.019,12.719,1.557,2.375,28.296,30.976,17.09,10.621,6.868,6.789,7.729,18.793,31.121,33.128,30.858,11.106,3.285,35.538,7.72,6.19,12.68,46.048,38.542,2.957,3.553,16.276,2.207,14.02,21.882,24.777,7.108,18.981,37.495,30,166.555,1.049,22.242,57.479,27.351,112.872,1.998,194.665,25.124,15.243,4.278,8.358,5.359,5.625,31.144,35.31,22.525,0.11,11.987,6.867,8.139,4.213,4.727,7.801,5.236,1.151,18.924,11.66,11.72,12.697,13.015,13.337,8.055,3.785,7.082,6.787,8.528,11.511,18.217,4.925,17.146,13.494,8.263,11.53,7.032,3.963,5.018,11.419,12.004,12.759,12.234,11.889,13.054,13.505,11.88,13.765,12.926,8.569,0.095,5.089,1.731,8.023,2.316,6.719,15.065,1.735,8.899,4.398,11.457,4.905,2.091,1.855,2.515,0.815,3.12,2.132,9.853,8.884,4.695,5.255,11.347,6.397,6.582,14.311,9.174,12.319,7.817,1.864,1.641,3.116,6.892,6.224,11.156,4.047,0.955,9.943,3.526,4.961,8.5,11.521,5.282,3.1,2.277,5.605,7.888,5.195,11.313,1.246,6.729,8.567,3.838,0.052,12.435,2.752,5.312,1.868,0.094,7.652,2.045,9.685,2.39,1.54,8.343,6.077,6.884,7.713,1.717,5.315,5.55,2.205,6.914,14.717,6.845,9.483,12.855,1.429,14.865,8.665,9.695,15.551,1.155,0.67,1.733,3.572,1.569,1.244,1.179,1.1,1,0.973,0.795,1.012,1.147,0.932,0.965,0.823,0.98,0.974,0.977,0.966,1.033,0.886,0.99,1.121,1.159,1.462,5.331,2.144,13.314,30.595,42.301,7.271,11.552,31.181,14.384,1.766,6.877,4.657,6.142,8.657,3.573,4.42,16.962,11.184,1.754,0.716,0.856,2.909,4.24,15.768,2.637,1.957,0.464,0.353,1.183,2.215,1.153,2.087,1.4,3.881,2.351,3.081,2.236,2.612,2.733,3.564,1.054,3.173,4.527,2.644,3.567,2.159,3.686,7.039,4.875,1.535,6.972,1.056,0.698,6.658,7.217,7.762,7.136,2.312,3.011,1.538,17.203,4.232,5.96,2.374,4.64,6.094,1.761,0.571,0.597,1.047,0.453,1.355,0.431,1.344,13.811,1.153,2.174,2.852,3.272,1.24,0.979,1.144,2.109,2.051,6.772,3.306,2.857,4.314,0.883,0.941,0.673,0.833,1.391,1.882,6.917,0.155,1.252,1.01,6.572,0.794,2.071,0.862,0.887,0.837,1.228,7.281,4.114,5.286,5.18,0.549,2.108,2.485,6.65,6.987,3.683,1.525,0.759,1.078,0.569,1.23,0.658,0.89,0.575,1.472,5.227,1.06,1.827,2.6,1.918,1.723,1.092,0.643,0.942,0.648,1.058,0.695,0.719,0.618,0.791,0.659,0.848,0.86,0.502,0.974,4.153,10.681,14.131,12,5.467,6.318,6.089,1.071,0.766,0.53,1.054,1.074,0.727,0.444,1.056,2.612,7.359,0.996,15.76,1.661,0.437,0.896,1.424,1.029,1.107,1.031,1.278,1.275,1.446,1.501,1.037,0.953,0.964,0.792,0.85,0.733,0.811,0.496,1.382,1.971,0.975,0.605,0.492,0.947,6.885,1.073,1.407,4.629,0.814,0.874,1.007,0.511,0.63,0.897,0.721,1.03,0.959,1.591,1.5,0.986,10.265,2.479,3.287,0.798,1.531,0.819,0.614,0.741,0.713,0.799,1.65,7.885,2.793,2.847,0.628,0.594,0.717,0.568,0.615,0.668,0.501,1.324,0.507,0.917,0.764,0.8,0.888,1.629,0.602,1.874,3.986,3.991,4.199,3.277,4.967,1.488,1.773,1.158,1.601,0.849,0.767,0.783,0.981,1.2,0.526,3.208,2.953,3.792,1.81,1.089,0.894,0.553,1.288,0.756,1.067,0.82,0.574,0.75,1.476,0.844,0.764,1.248,1.061,0.636,1.297,0.732,0.606,0.933,2.676,4.565,5.303,0.873,2.907,2.776,1.692,1.495,1.724,0.976,1.975,2.12,0.695,5.834,6.17,2.005,9.228,4.25,3.229,2.775,1.986,4.706,7.413,42.017,8.288,19.293,2.991,1.644,1.601,8.38,2.629,2.602,1.827,2.131,3.276,5.147,3.11,2.793,2.303,12.691,2.897,1.554,1.491,1.411,1.449,1.314,1.206,2.287,2.17,10.503,1.184,1.412,1.67,1.098,1.417,4.918,1.187,0.77,1.314,1.203,2.252,2.344,3.58,2.86,2.485,2.229,2.128,6.39,7.629,1.572,2.251,2.16,2.2,1.562,0.559,1.685,1.794,4.364,3.274,1.147,2.391,1.688,2.243,1.36,11.446,2.127,2.116,3.254,1.506,1.862,1.758,1.804,1.394,1.582,1.54,1.416,8.858,2.981,2.123,14.952,8.162,5.348,7.063,1.236,2.263,3.337,6.97,4.781,8.844,3.035,4.201,2.767,4.368,0.957,1.895,2.614,2.59,8.698,4.608,2.934,1.48,2.564,3.636,4.452,2.243,2.528,2.775,1.791,10.093,0.072,6.007,6.689,1.762,10.677,2.249,9.057,2.234,2.903,2.955,1.68,2.12,2.728,2.066,6.808,2.79,3.409,4.699,4.452,13.893,2.23,8.152,5.553,3.826,2.731,10.017,6.451,2.509,3.51,2.888,3.827,4.573,4.504,4.004,2.187,19.107,1.827,1.78,1.613,6.985,1.746,1.703,1.68,1.747,1.63,18.108,10.47,1.753,1.616,1.519,1.473,1.584,1.54,1.576,1.57,1.75,1.686,1.661,1.652,1.69,1.677,1.68,2.068,1.916,5.662,1.902,1.94,2.057,6.693,0.842,2.911,1.809,1.688,1.43,1.492,1.473,1.463,1.576,4.517,4.788,7.593,3.782,5.561,1.207,4.694,1.099,1.163,1.081,1.111,1.081,1.092,1.248,1.755,0.849,0.84,0.882,0.869,9.908,2.435,4.341,2.97,8.422,1.867,1.693,1.712,1.668,4.96,4.187,3.425,2.017,1.936,1.88,4.259,2.511,2.391,2.247,1.583,1.191,2.186,2.031,1.812,1.773,1.864,1.91,1.995,1.772,2.112,1.959,2.028,1.646,2.016,1.665,2.144,1.879,2.989,18.94,7.903,2.813,1.598,1.693,1.311,1.624,2.018,2.546,4.819,3.108,1.722,4.935,3.434,0.465,0.619,1.473,5.378,4.163,0.299,1.872,5.698,2.138,0.264,2.024,1.311,1.423,1.128,1.1,0.908,1.044,0.892,1.52,8.085,1.802,1.895,2.026,1.15,0.873,0.981,0.987,1.241,1.233,1.132,1.064,1.21,1.164,1.184,1.419,1.094,1.12,0.971,1.379,1.129,1.249,1.279,1.623,1.576,1.748,3.442,1.42,1.535,1.576,4.213,1.114,1.126,0.956,1.3,8.385,1.394,0.336,1.191,1.683,0.85,0.725,1.238,0.229,1.315,1.478,1.737,3.832,2.546,0.255,1.51,0.919,0.94,1.151,2.411,6.663,2.804,2.119,13.272,2.277,1.43,1.244,1.113,1.064,1.034,0.996,1.051,0.898,0.964,0.943,1.095,0.939,1.063,5.787,1.271,1.161,1.083,0.921,0.974,0.991,1.852,3.437,1.235,1.111,1.054,0.914,1.009,0.999,1.187,1.285,0.795,3.772,7.323,4.323,1.646,1.219,1.511,3.564,1.485,1.099,0.132,1.326,1.132,1.246,1.251,1.192,1.086,1.388,4.204,2.784,2.09,2.206,0.159,1.786,8.972,11.767,10.306,0.902,1.924,1.405,4.638,0.615,7.339,2.664,2.086,2.018,2.401,0.225,2.739,3.143,12.604,5.109,7.132,9.669,0.316,1.392,1.635,0.825,1.033,0.357,1.368,1.4,5.895,16.639,1.344,10.331,0.424,1.122,0.755,10.211,0.219,2.048,0.105,3.349,1.769,1.439,1.532,6.868,2.974,0.895,9.757,4.081,1.745,2.644,0.753,1.914,2.729,1.64,8.391,6.865,5.304,29.036,3.595,2.114,1.983,1.268,2.279,2.626,5.276,8.131,0.896,6.44,0.361,1.056,11.759,16.678,20.989,1.225,0.614,2.511,3.91,6.906,5.656,4.434,5.061,4.524,2.991,4.383,3.887,1.91,1.761,1.965,2.139,2.003,0.864,1.395,2.02,5.341,2.416,2.913,2.632,4.853,8.801,6.857,3.766,6.966,1.207,1.457,0.622,2.895,3.895,1.689,1.956,5.217,4.245,3.921,3.936,18.007,5.04,4.118,19.288,2.132,2.84,2.668,3.464,3.429,3.507,8.44,37.501,11.48,2.014,1.267,2.738,2.146,1.634,1.676,1.706,1.611,1.532,1.789,1.673,4.26,2.629,4.619,1.014,0.888,1.007,1.105,1.154,1.452,1.424,0.839,1.083,0.932,1.391,1.38,2.771,2.879,2.73,2.501,2.667,15.895,8.198,3.097,28.861,23.771,2.277,2.673,21.497,23.112,24.025,2.219,2.354,2.386,2.338,2.276,2.427,2.275,2.316,2.335,2.388,6.99,28.8,22.652,7.836,34.863,3.592,1.608,17.627,3.339,2.258,2.309,2.294,2.314,2.296,2.202,2.289,2.427,25.284,31.852,29.572,3.188,21.538,1.852,1.676,1.798,1.715,1.793,1.825,1.705,1.835,1.745,1.655,1.774,1.846,1.688,1.837,1.701,1.693,15.992,41.799,1.873,1.638,1.78,1.644,1.605,1.704,1.736,1.695,1.719,1.742,1.609,1.76,1.637,1.667,1.621,18.106,12.898,18.4,27.046,9.112,1.747,1.766,1.706,1.626,1.714,1.568,1.876,1.698,1.74,1.711,1.709,1.434,0.209,23.722,31.816,23.771,2.318,8.803,6.842,1.508,1.589,1.486,1.469,1.576,1.414,1.411,1.415,0.071,8.002,1.477,1.505,1.451,1.463,1.492,1.517,1.514,1.584,1.405,1.403,1.417,1.433,14.581,2.137,1.185,1.891,0.909,2.747,1.45,1.467,1.411,1.392,1.449,1.485,25.437,1.406,1.419,1.351,1.421,1.439,1.396,1.409,1.406,1.398,1.366,1.382,1.395,1.429,1.404,12.336,1.381,1.513,1.442,1.384,1.449,1.431,1.46,1.44,1.442,1.491,1.45,3.705,16.917,2.541,13.326,1.339,21.477,2.006,1.869,1.817,1.96,1.988,1.924,2.026,1.854,1.873,2.003,2.064,36.281,8.813,1.593,1.545,1.461,1.514,1.327,1.545,1.41,1.558,1.441,1.461,5.565,8.808,10.44,1.743,1.588,1.531,1.434,1.429,1.547,1.477,41.177,1.454,1.458,1.38,1.509,1.423,1.364,1.563,1.597,1.355,1.563,1.476,6.814,6.742,7.146,3.198,2.96,3.368,17.974,4.593,4.939,3.957,1.004,4.406,1.369,0.689,2.12,2.563,1.152,0.966,0.966,0.949,0.777,0.57,1.026,0.795,0.923,0.775,0.656,0.337,0.483,0.548,0.604,0.557,0.51,0.577,0.651,0.673,0.824,0.743,1.616,1.391,3.841,1.27,0.576,0.537,1.79,1.43,5.363,3.763,0.776,0.549,4.78,6.086,3.015,7.314,2.587,1.384,1.547,1.875,1.418,1.295,2.594,1.292,2.334,1.772,1.508,1.579,1.642,1.722,20.563,7.569,2.021,1.066,0.945,2.284,2.389,1.625,1.116,1.07,1.033,5.929,2.126,23.073,3.551,1.279,1.132,0.907,0.878,1.588,2.742,1.099,1.074,1.032,0.966,1.061,1.121,1.611,1.355,8.62,17.086,2.924,13.555,7.256,3.195,7.835,0.568,5.025,2.592,1.435,2.792,2.231,1.998,1.43,1.264,1.138,1.591,0.837,0.766,1.576,1.029,1.115,0.894,0.954,1.015,0.856,3.803,2.137,0.691,11.969,1.99,1.849,10.356,1.502,2.103,2.762,7.007,4.361,6.07,4.344,11.041,0.736,1.602,2.236,0.724,2.638,0.866,1.59,2.624,1.034,0.983,1.333,1.303,1.358,0.608,0.831,1.459,2.02,2.068,6.323,2.736,4.217,3.511,15.029,10.975,2.617,1.606,1.676,1.515,1.644,0.941,1.058,1.478,0.91,0.913,18.075,11.972,5.972,12.587,2.374,6.237,1.456,0.527,2.584,2.015,8.648,14.68,15.228,1.328,1.192,1.135,0.676,0.851,0.923,0.286,0.573,1.15,1.36,0.657,0.71,17.055,2.463,7.994,21.005,6.076,6.295,0.392,11.974,3.693,4.488,5.022,1.544,4.488,1.078,10.579,1.954,3.481,1.134,1.041,2.834,4.168,2.542,4.076,2.463,1.316,1.227,0.624,2.996,8.695,5.768,8.759,3.05,2.94,3.604,2.669,3.613,3.364,19.601,6.313,2.356,2.375,2.881,1.152,9.366,2.424,2.168,2.191,2.181,2.098,8.047,2.267,2.261,2.331,2.021,11.273,1.935,1.859,1.726,2.228,1.984,2.382,3.771,1.512,7.861,22.068,1.53,1.438,1.393,1.283,1.283,1.106,31.138,9.397,2.85,1.981,1.772,1.838,1.831,1.552,0.047,20.045,34.782,1.68,1.682,1.687,1.644,1.628,1.721,1.645,1.555,17.537,9.938,3.918,1.262,2.015,1.909,2.129,1.61,0.539,0.609,2.163,2.26,0.62,0.146,4.636,0.899,1.054,1.064,1.01,1.868,2.054,0.5,1.525,1.461,2.565,5.39,0.637,1.124,0.996,1.369,1.126,1.363,0.704,3.524,1.735,0.742,0.619,0.646,0.608,0.579,0.482,0.538,0.549,0.541,0.582,0.51,0.519,0.587,0.714,0.833,0.798,0.757,0.691,0.801,0.74,0.852,0.85,0.82,0.805,0.833,0.736,0.87,0.887,6.845,0.652,0.533,0.545,0.562,0.34,0.375,0.296,0.354,0.647,0.65,0.642,0.551,0.538,0.967,1.01,0.885,1.114,6.986,1.389,0.803,1.769,1.785,1.851,1.996,1.778,1.787,1.898,0.96,1.013,0.947,0.414,1.413,1.481,10.608,1.688,1.634,1.572,1.727,1.555,1.707,1.615,1.707,1.666,1.627,1.585,1.544,1.622,1.61,1.662,1.704,8.866,1.768,1.662,1.619,1.462,15.363,1.551,1.601,2.212,0.915,2.987,1.7,1.516,1.45,1.368,1.531,8.524,1.509,1.527,1.523,1.483,1.519,1.501,17.675,1.492,1.498,1.435,1.499,1.529,1.01,1.028,0.989,1.05,1.068,4.456,3.002,1.522,0.752,0.748,1.5,1.292,1.41,0.818,0.784,1.836,1.549,1.534,1.53,1.532,1.525,1.544,1.595,1.554,4.72,1.502,1.556,1.592,1.543,1.574,1.536,1.566,1.56,1.558,1.556,1.469,1.477,1.458,1.476,1.486,1.456,1.488,3.472,5.051,1.719,1.194,1.096,1.211,1.219,1.484,1.483,1.501,1.47,1.504,1.482,1.11,3.573,1.573,1.571,1.576,1.55,1.59,1.583,4.482,1.645,1.63,1.542,1.663,1.706,1.676,11.949,1.008,4.059,1.776,1.826,1.872,1.822,1.816,1.87,1.783,1.877,1.782,1.849,1.792,7.462,0.927,7.149,3.456,1.8,1.83,1.748,1.476,1.668,11.02,1.216,1.154,1.074,1.063,1.122,1.061,1.069,1.035,0.943,1.042,1.073,1.037,0.958,0.901,1.094,1.095,1.068,1.148,8.16,1.238,1.102,1.087,1.082,1.1,1.13,1.192,1.196,1.163,0.907,0.704,0.799,1.379,1.469,1.236,1.506,1.323,1.501,1.572,1.498,1.182,2.952,0.389,5.719,2.472,1.132,1.509,1.433,1.553,1.441,1.394,1.29,0.992,1.016,1.126,1.133,4.645,1.298,1.286,1.198,1.207,1.284,1.209,1.29,1.18,1.33,1.779,1.659,4.987,1.306,1.189,1.278,1.296,1.377,1.758,1.703,1.912,1.78,1.775,1.606,1.644,1.619,1.705,22.666,3.96,4.221,12.978,12.457,1.777,1.663,1.692,1.702,1.691,1.458,1.405,1.32,1.368,1.361,1.443,3.303,3.984,11.29,3.115,8.174,11.436,1.359,1.42,1.491,1.453,1.322,1.256,1.283,1.165,1.254,2.65,2.652,1.446,1.419,1.333,1.211,1.216,1.13,1.209,1.1,1.191,1.197,1.188,1.217,1.308,1.198,9.305,1.587,1.469,1.329,1.299,1.259,1.241,1.337,1.297,1.272,1.19,7.729,2.497,10.416,1.588,1.411,1.547,8.43,1.18,1.235,1.245,1.161,6.047,7.21,1.988,1.806,1.892,1.811,15.057,2.258,12.118,3.777,3.433,0.021,2.822,9.492,1.323,1.319,1.347,1.361,1.336,1.392,1.36,1.292,1.346,1.347,1.446,1.469,1.421,1.4,1.443,1.397,1.389,1.436,1.375,10.338,2.738,1.167,1.227,1.51,1.548,1.562,1.565,1.531,1.531,1.536,1.551,1.336,1.3,0.966,0.934,1.403,1.255,1.542,1.535,1.553,1.549,1.528,14.494,2.382,1.956,2.104,10.605,27.231,1.274,1.267,1.287,1.234,1.276,1.243,1.324,1.303,1.267,1.424,1.443,1.096,1.278,1.138,1.314,0.705,0.713,0.869,0.909,1.073,1.116,1.028,1.138,1.191,5.554,2.127,0.845,1.025,1.014,1.185,1.016,1.018,0.607,0.592,1.152,1.053,1.068,1.024,1.017,1.114,1.036,0.949,1.057,0.933,1.026,1.108,0.805,0.961,1.034,1.046,1.062,1.068,0.997,1.127,1.003,7.238,1.709,3.388,1.525,0.944,0.986,0.976,0.864,1.04,0.998,0.956,0.934,1.024,1.007,0.982,0.938,1.008,0.961,0.949,0.972,0.99,0.985,0.939,1.071,0.916,0.989,0.961,0.938,1.014,0.927,2.87,6.984,11.67,3.061,1.034,1.064,1.035,1.051,1.059,1.197,1.159,1.063,1.031,1.089,1.01,1.103,1.036,1.17,0.976,1.019,1.023,1.034,1.017,1.066,1.068,1.022,1.03,0.996,1.039,1.053,1.066,1.053,0.994,0.947,1.003,1.081,1.073,1.022,1.052,0.937,1.042,1.11,1.144,1.095,1.142,1.107,1.198,5.801,6.196,1.534,1.545,1.524,1.526,1.526,1.474,1.504,1.509,1.536,1.51,1.477,6.183,1.117,2.431,1.411,1.189,1.263,1.31,1.444,1.497,1.756,1.829,1.937,1.764,1.921,1.868,1.807,1.833,6.13,1.788,1.831,1.744,1.761,1.728,1.749,1.817,1.788,1.749,1.635,1.894,11.019,9.677,5.721,3.392,6.298,3.104,2.068,2.085,2.571,2.079,1.897,0.127,1.989,2.112,31.83,1.423,1.427,1.354,1.411,1.396,1.255,1.4,1.414,1.362,1.406,1.389,1.367,1.441,7.167,1.368,1.236,1.306,1.305,1.389,1.35,7.229,1.335,1.423,1.229,0.872,0.521,0.528,0.533,0.529,0.517,0.539,0.521,0.553,0.499,0.448,18.426,6.674,0.549,0.529,0.542,0.531,0.532,0.532,0.534,0.536,0.533,0.563,0.544,0.535,0.547,0.52,0.562,0.523,0.538,0.548,0.532,0.542,1.092,17.196,0.531,0.532,0.526,0.547,0.555,0.529,0.537,0.537,0.554,0.542,0.533,0.56,0.522,0.541,0.529,0.528,0.541,0.538,0.542,0.545,0.534,0.541,0.541,0.538,0.552,0.541,0.536,0.531,1.092,6.465,11.943,1.242,13.927,0.538,0.502,0.546,0.529,0.532,0.521,0.531,0.528,0.548,0.51,0.525,0.529,0.515,0.533,0.528,0.548,0.516,0.504,0.561,0.517,0.536,0.52,0.517,0.548,0.514,0.531,0.521,0.524,0.519,0.553,0.533,0.516,0.53,0.528,0.523,0.525,0.539,13.209,0.525,0.522,0.534,0.525,0.545,0.494,0.539,0.542,0.514,0.515,0.537,0.515,0.534,0.54,0.515,0.534,0.527,0.504,0.525,25.875,0.508,0.517,0.529,0.531,0.524,0.523,0.529,0.524,0.528,0.533,0.53,0.526,0.519,0.53,0.528,0.522,0.519,0.532,0.521,0.525,0.529,4.72,0.532,0.547,0.534,0.542,0.541,0.539,0.552,0.545,0.55,0.555,0.542,0.548,0.523,0.513,0.533,0.525,0.526,0.533,0.522,0.525,0.539,0.52,0.539,0.531,0.538,0.526,0.532,0.537,22.19,0.525,0.53,0.529,0.531,0.529,0.522,0.522,0.533,0.52,0.54,0.545,0.514,0.534,0.516,0.531,0.53,0.535,0.533,3.724,7.914,0.518,0.536,0.522,0.533,0.537,0.513,0.53,0.52,0.52,0.53,0.439,0.082,0.525,0.53,0.531,0.541,0.519,0.532,0.52,2.444,1.201,7.059,0.512,0.504,0.497,0.507,0.523,0.481,0.522,0.506,0.509,0.511,0.503,0.511,0.501,0.498,0.503,0.517,0.511,0.507,0.504,0.507,0.505,0.521,0.486,0.505,0.509,0.501,0.518,0.496,0.516,0.502,0.513,0.499,0.511,0.501,4.556,0.493,0.508,0.513,0.506,0.513,0.503,0.515,0.518,0.493,0.5,0.512,0.507,0.496,0.515,0.514,4.927,0.944,4.613,15.023,10.554,0.497,0.509,1.166,0.533,0.534,0.292,0.514,0.521,0.505,0.507,0.514,0.52,0.506,0.532,0.526,0.521,0.526,6.711,6.063,0.512,7.745,0.515,0.514,0.503,0.519,0.517,0.53,0.509,0.52,0.509,0.52,0.522,0.52,0.512,0.514,0.517,0.521,0.512,0.513,0.517,0.534,0.512,0.522,0.52,0.52,0.502,0.529,0.561,0.514,0.469,0.521,0.52,0.517,0.516,0.526,0.529,0.551,0.458,0.529,0.528,0.52,0.535,0.479,0.519,0.519,0.515,0.527,0.512,0.513,0.521,0.514,0.52,0.525,0.513,0.526,0.519,0.516,0.525,0.526,0.515,0.536,0.503,0.516,0.513,0.514,0.516,0.519,0.515,0.51,0.535,0.509,0.526,0.496,0.528,0.53,0.514,0.519,0.497,0.512,0.521,0.518,0.521,0.522,0.513,0.511,0.524,0.506,0.514,4.652,0.527,0.499,0.521,0.527,0.502,0.54,0.515,0.5,0.512,0.525,0.505,0.522,0.509,0.561,0.499,0.526,0.519,0.528,0.524,0.231,0.641,0.521,0.513,0.52,0.519,0.507,0.523,0.534,0.503,0.516,0.517,0.521,0.519,0.508,0.51,0.508,0.144,0.195,0.481,0.494,0.406,0.29,0.235,0.589,0.517,0.521,0.519,0.512,0.508,0.522,0.517,0.504,0.52,1.032,4.217,11.358,6.328,1.126,1.896,3.236,0.559,0.281,0.278,0.28,0.268,0.279,0.26,0.278,0.162,0.384,0.337,0.335,0.307,0.271,0.283,0.309,0.318,0.253,0.275,0.262,0.25,0.313,0.309,0.28,0.318,0.269,0.3,0.259,0.296,0.279,0.302,0.28,0.299,0.283,0.303,0.271,0.302,0.243,0.258,0.316,0.349,0.271,0.292,0.274,0.312,0.262,0.305,0.28,0.291,0.575,0.568,0.581,0.568,0.582,0.558,2.332,0.756,0.809,4.228,1.079,1.851,3.386,2.52,9.696,1.514,1.236,0.693,2.172,3.204,1.068,1.044,1.1,1.048,1.085,1.125,1.103,1.087,1.091,0.778,1.303,0.994,0.962,2.6,0.239,0.146,1.033,4.134,1.961,0.615,1.155,1.738,1.074,1.169,1.002,1.068,0.869,0.867,0.929,0.803,1.003,0.987,1.118,0.978,1.015,1.396,1.075,0.89,0.916,0.981,0.929,0.883,0.885,1.003,0.933,0.915,0.95,0.884,1.005,0.901,0.907,0.979,0.838,0.934,0.925,0.963,1.534,7.74,1.268,0.855,0.866,0.928,1.068,3.017,4.538,0.669,0.545,5.12,11.768,5.037,3.009,1.807,3.633,1.341,1.187,4.444,1.782,5.56,0.622,0.289,1.152,1.118,1.127,1.022,1.029,1.024,1.147,1.004,1.13,1.063,1.128,1.081,1.064,1.119,5.482,2.007,1.045,1.054,1.018,0.988,1.038,1.038,1.218,1.124,1.098,1.232,1.138,1.095,1.165,1.081,11.985,1.135,1.083,1.135,1.094,1.103,1.083,1.042,1.146,1.097,1.055,1.216,1.112,1.059,1.075,1.075,3.279,4.834,11.217,1.078,1.062,1.064,1.084,1.075,1.075,1.068,1.065,1.069,1.066,1.068,1.07,1.067,1.086,1.001,0.521,0.461,1.102,1.094,1.095,1.087,1.104,1.087,0.365,0.809,1.045,1.057,1.055,1.055,1.055,1.045,1.055,1.05,1.049,1.05,1.052,1.054,1.058,1.055,1.044,1.04,1.076,1.106,1.081,1.074,2.157,2.128,2.15,2.138,2.135,24.674,7.498,11.808,5.415,13.34,11.764,12.324,6.426,2.152,2.136,2.14,2.196,1.428,0.738,1.493,0.974,2.107,2.152,3.777,2.326,1.423,0.521,0.585,0.582,0.527,0.593,0.576,0.565,0.532,0.553,0.548,0.583,0.576,0.565,0.556,0.577,0.561,0.566,0.552,0.564,0.544,0.569,0.533,4.556,1.107,0.55,0.543,0.571,0.543,0.555,0.561,0.551,0.569,0.597,0.57,0.532,0.556,0.576,0.493,0.567,0.554,0.566,0.558,0.555,0.571,7.283,0.325,3.123,3.09,1.355,1.172,2.811,2.264,6.109,1.815,0.189,4.36,2.458,0.449,9.454,0.471,6.743,1.436,9.044,1.71,1.541,1.502,2.219,0.249,1.184,1.287,2.69,1.256,4.974,1.782,1.076,1.014,1.144,1.103,1.007,1.124,1.159,1.181,1.183,1.034,1.133,1.188,0.983,1.241,1.389,1.688,1.364,1.242,1.253,1.348,1.127,1.202,1.263,1.124,1.361,1.233,1.221,5.7,1.257,1.3,1.137,1.257,0.596,0.616,0.567,0.571,0.585,0.597,0.565,0.56,0.574,0.579,4.601,5.333,7.739,7.986,0.941,1.039,0.976,0.972,0.968,0.979,0.999,0.974,0.948,0.999,1.005,0.937,1.047,0.935,1.017,0.965,0.973,1.993,5.293,8.239,0.747,0.784,0.723,0.819,0.737,0.745,0.748,0.74,0.754,0.751,0.78,0.763,0.745,0.768,0.759,0.83,0.736,0.748,0.749,0.762,0.744,0.758,0.736,0.776,0.738,0.761,0.756,0.733,0.724,0.75,0.77,0.741,0.752,0.716,0.781,0.736,0.742,0.749,0.73,0.741,0.748,0.762,0.75,0.711,0.77,0.74,0.735,0.784,0.734,0.745,0.746,0.753,0.735,0.772,0.838,0.715,0.8,0.776,0.785,0.775,0.782,0.777,0.831,0.718,0.808,0.777,0.784,0.772,0.244,0.548,0.778,0.783,0.816,1.395,4.535,0.761,0.756,0.78,0.639,0.426,8.357,0.379,0.375,0.382,0.39,0.407,0.4,0.406,0.402,0.404,0.355,0.304,0.279,0.272,0.307,0.303,0.291,0.541,0.567,7.304,0.811,0.713,0.897,0.851,2.497,0.746,0.675,0.401,0.394,0.427,0.4,0.399,0.402,0.341,0.341,0.378,0.343,0.361,0.344,0.43,0.467,0.46,0.546,0.542,0.523,0.562,0.622,0.542,0.503,0.493,0.499,0.548,1.028,0.527,0.497,1.687,1.591,2.307,0.758,1.506,13.465,1.489,14.491,7.218,7.253,7.099,7.22,7.072,9.013,26.79,20.372,17.125,5.465,2.09,2.02,2.895,2.761,4.436,8.107,1.652,1.479,1.437,1.47,1.391,2.798,14.618,5.689,6.32,10.498,1.126,0.808,7.538,0.938,1.312,0.943,1.483,1.715,0.53,4.023,1.669,1.27,2.62,2.871,1.994,0.834,0.292,1.443,0.035,1.113,1,0.591,0.576,0.242,0.295,0.921,0.939,5.786,14.138,18.032,22.782,1.183,1.121,5.192,15.202,1.496,1.645,21.018,1.371,1.705,10.254,12.31,1.568,1.309,9.292,10.421,1.573,1.825,6.74]},\"weight_typical\":22891.49,\"duration_typical\":23763.41,\"weight\":23587.498,\"duration\":24540.543,\"steps\":[{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Drive west. Then Turn right onto Menlo Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Drive west. Then Turn right onto Menlo Avenue.\",\"distanceAlongGeometry\":49},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn right onto Menlo Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn right onto Menlo Avenue.\",\"distanceAlongGeometry\":33.333}],\"intersections\":[{\"bearings\":[270],\"entry\":[true],\"mapbox_streets_v8\":{\"class\":\"service\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"geometry_index\":0,\"location\":[-118.289795,34.03084]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Menlo Avenue\"}],\"type\":\"turn\",\"modifier\":\"right\",\"text\":\"Menlo Avenue\"},\"distanceAlongGeometry\":49}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"depart\",\"instruction\":\"Drive west.\",\"bearing_after\":270,\"bearing_before\":0,\"location\":[-118.289795,34.03084]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":24.01,\"duration_typical\":19.6,\"duration\":19.6,\"distance\":49,\"driving_side\":\"right\",\"weight\":24.01,\"mode\":\"driving\",\"geometry\":\"ona|_Adwyr`FDj`@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 700 feet, Turn left onto West Adams Boulevard.</prosody></amazon:effect></speak>\",\"announcement\":\"In 700 feet, Turn left onto West Adams Boulevard.\",\"distanceAlongGeometry\":204},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn left onto West Adams Boulevard. Then, in 400 feet, Turn right onto Vermont Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn left onto West Adams Boulevard. Then, in 400 feet, Turn right onto Vermont Avenue.\",\"distanceAlongGeometry\":70.833}],\"intersections\":[{\"entry\":[true,false],\"in\":1,\"bearings\":[0,90],\"duration\":18.469,\"turn_weight\":8,\"turn_duration\":2.105,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":28.045,\"geometry_index\":1,\"location\":[-118.290329,34.030837]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":9.284,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":11.864,\"geometry_index\":2,\"location\":[-118.290326,34.031732]},{\"bearings\":[180,359],\"entry\":[false,true],\"in\":0,\"turn_weight\":0.5,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":3,\"location\":[-118.290324,34.032335]}],\"bannerInstructions\":[{\"sub\":{\"components\":[{\"type\":\"text\",\"text\":\"Vermont Avenue\"}],\"type\":\"turn\",\"modifier\":\"right\",\"text\":\"Vermont Avenue\"},\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"West Adams Boulevard\"}],\"type\":\"turn\",\"modifier\":\"left\",\"text\":\"West Adams Boulevard\"},\"distanceAlongGeometry\":214}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"turn\",\"instruction\":\"Turn right onto Menlo Avenue.\",\"modifier\":\"right\",\"bearing_after\":0,\"bearing_before\":270,\"location\":[-118.290329,34.030837]},\"speedLimitSign\":\"mutcd\",\"name\":\"Menlo Avenue\",\"weight_typical\":53.364,\"duration_typical\":38.347,\"duration\":38.347,\"distance\":214,\"driving_side\":\"right\",\"weight\":53.364,\"mode\":\"driving\",\"geometry\":\"ina|_Apxzr`F}v@Eud@CyRJsEB\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn right onto Vermont Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn right onto Vermont Avenue.\",\"distanceAlongGeometry\":93.333}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[179,269],\"duration\":7.555,\"turn_weight\":20,\"turn_duration\":5.395,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":22.646,\"geometry_index\":5,\"location\":[-118.290332,34.032758]},{\"entry\":[false,true],\"in\":0,\"bearings\":[89,270],\"duration\":2.032,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.981,\"geometry_index\":6,\"location\":[-118.290563,34.032756]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":1.152,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.903,\"geometry_index\":7,\"location\":[-118.290755,34.032755]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,268],\"duration\":2.15,\"turn_weight\":0.5,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.106,\"geometry_index\":8,\"location\":[-118.29083,34.032755]},{\"entry\":[false,true],\"in\":0,\"bearings\":[88,270],\"duration\":6.709,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.719,\"geometry_index\":9,\"location\":[-118.290973,34.032751]},{\"bearings\":[90,270],\"entry\":[false,true],\"in\":0,\"turn_weight\":2,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":10,\"location\":[-118.291415,34.032752]}],\"bannerInstructions\":[{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"left\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"right\",\"active\":true,\"directions\":[\"straight\",\"right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Vermont Avenue\"}],\"type\":\"turn\",\"modifier\":\"right\",\"text\":\"Vermont Avenue\"},\"distanceAlongGeometry\":114}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"end of road\",\"instruction\":\"Turn left onto West Adams Boulevard.\",\"modifier\":\"left\",\"bearing_after\":269,\"bearing_before\":359,\"location\":[-118.290332,34.032758]},\"speedLimitSign\":\"mutcd\",\"name\":\"West Adams Boulevard\",\"weight_typical\":44.161,\"duration_typical\":21.896,\"duration\":21.896,\"distance\":114,\"driving_side\":\"right\",\"weight\":44.161,\"mode\":\"driving\",\"geometry\":\"kfe|_Avxzr`FBlM@~J?tCF|GArZAlH\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 3 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 3 miles.\",\"distanceAlongGeometry\":5360.332},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a quarter mile, Turn left to take the U.S. 1 o1 North ramp.</prosody></amazon:effect></speak>\",\"announcement\":\"In a quarter mile, Turn left to take the U.S. 1 o1 North ramp.\",\"distanceAlongGeometry\":402.336},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn left to take the U.S. 1 o1 North ramp.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn left to take the U.S. 1 o1 North ramp.\",\"distanceAlongGeometry\":130.667}],\"intersections\":[{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"right\",\"valid\":true,\"active\":true}],\"location\":[-118.291566,34.032753],\"geometry_index\":11,\"admin_index\":0,\"weight\":11.129,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":4.105,\"turn_weight\":9,\"duration\":5.843,\"bearings\":[0,90],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.248,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.521,\"geometry_index\":12,\"location\":[-118.291566,34.032877]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.407,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.94,\"geometry_index\":13,\"location\":[-118.291566,34.03297]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.976,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.187,\"geometry_index\":14,\"location\":[-118.291567,34.033114]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.2,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.236,\"geometry_index\":15,\"location\":[-118.291567,34.033177]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":1.241,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.521,\"geometry_index\":16,\"location\":[-118.291567,34.033202]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":2.941,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.593,\"geometry_index\":17,\"location\":[-118.291568,34.033294]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.248,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.521,\"geometry_index\":18,\"location\":[-118.291568,34.033496]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.372,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.673,\"geometry_index\":19,\"location\":[-118.291568,34.033583]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":15.165,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":18.568,\"geometry_index\":20,\"location\":[-118.291569,34.03368]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":4.241,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.737,\"geometry_index\":21,\"location\":[-118.291571,34.034396]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":8.742,\"turn_weight\":0.5,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.751,\"geometry_index\":22,\"location\":[-118.291571,34.03456]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.869,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.281,\"geometry_index\":23,\"location\":[-118.291572,34.035078]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,180],\"duration\":0.989,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.203,\"geometry_index\":24,\"location\":[-118.291573,34.035216]},{\"entry\":[false,true],\"in\":0,\"bearings\":[181,360],\"duration\":4.821,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.88,\"geometry_index\":25,\"location\":[-118.291572,34.035297]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":6.225,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.617,\"geometry_index\":26,\"location\":[-118.291574,34.035658]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.986,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.874,\"geometry_index\":27,\"location\":[-118.291575,34.035998]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.463,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.017,\"geometry_index\":28,\"location\":[-118.291575,34.036189]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.228,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.946,\"geometry_index\":29,\"location\":[-118.291576,34.036302]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"location\":[-118.291576,34.036452],\"geometry_index\":30,\"admin_index\":0,\"weight\":23.667,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":19.694,\"bearings\":[1,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,181],\"duration\":7.975,\"turn_weight\":2,\"turn_duration\":2.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":9.293,\"geometry_index\":31,\"location\":[-118.291564,34.037468]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":4.569,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.597,\"geometry_index\":32,\"location\":[-118.291562,34.037856]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":13.732,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":16.813,\"geometry_index\":33,\"location\":[-118.29156,34.038152]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":9,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":11.025,\"geometry_index\":35,\"location\":[-118.29156,34.038703]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":7.219,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.82,\"geometry_index\":36,\"location\":[-118.29156,34.039063]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,358],\"duration\":0.357,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.413,\"geometry_index\":37,\"location\":[-118.291573,34.039544]},{\"entry\":[false,true],\"in\":0,\"bearings\":[178,359],\"duration\":5.625,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.891,\"geometry_index\":38,\"location\":[-118.291574,34.039568]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"location\":[-118.291586,34.04002],\"geometry_index\":39,\"admin_index\":0,\"weight\":8.096,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":6.984,\"bearings\":[0,179],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.847,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.038,\"geometry_index\":40,\"location\":[-118.291586,34.040442]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.207,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.37,\"geometry_index\":41,\"location\":[-118.291586,34.040511]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.08,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.214,\"geometry_index\":42,\"location\":[-118.291586,34.040974]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.094,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.232,\"geometry_index\":43,\"location\":[-118.291586,34.041528]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.325,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.515,\"geometry_index\":44,\"location\":[-118.291586,34.042109]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":16.335,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":20.003,\"geometry_index\":45,\"location\":[-118.291586,34.042694]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.571,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.15,\"geometry_index\":46,\"location\":[-118.291592,34.043839]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.693,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.84,\"geometry_index\":47,\"location\":[-118.291593,34.044015]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.137,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.835,\"geometry_index\":48,\"location\":[-118.291593,34.044055]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291594,34.044235],\"geometry_index\":49,\"admin_index\":0,\"weight\":8.235,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":7.097,\"bearings\":[180,360],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.699,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.848,\"geometry_index\":50,\"location\":[-118.291596,34.044601]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":30.046,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":36.807,\"geometry_index\":51,\"location\":[-118.291596,34.044644]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.183,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.891,\"geometry_index\":53,\"location\":[-118.291605,34.046597]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.659,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.707,\"geometry_index\":54,\"location\":[-118.291606,34.046866]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291607,34.047258],\"geometry_index\":55,\"admin_index\":0,\"weight\":8.691,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":7.469,\"bearings\":[180,360],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.443,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.535,\"geometry_index\":56,\"location\":[-118.291608,34.047655]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.927,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.811,\"geometry_index\":57,\"location\":[-118.291608,34.047688]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.757,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.594,\"geometry_index\":58,\"location\":[-118.291608,34.048015]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.147,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.622,\"geometry_index\":59,\"location\":[-118.291608,34.048467]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.298,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.806,\"geometry_index\":60,\"location\":[-118.291608,34.048666]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.555,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.904,\"geometry_index\":61,\"location\":[-118.291608,34.048922]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.39,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.369,\"geometry_index\":62,\"location\":[-118.291608,34.049093]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.294,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.477,\"geometry_index\":63,\"location\":[-118.291611,34.049598]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.807,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.88,\"geometry_index\":64,\"location\":[-118.291614,34.05002]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.023,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.47,\"geometry_index\":65,\"location\":[-118.291616,34.050377]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.024,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.704,\"geometry_index\":66,\"location\":[-118.291617,34.0505]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":1.315,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.588,\"geometry_index\":67,\"location\":[-118.291618,34.050693]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291619,34.050773],\"geometry_index\":68,\"admin_index\":0,\"weight\":2.547,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.019,\"turn_weight\":0.5,\"duration\":3.691,\"bearings\":[179,358],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,178],\"duration\":4.408,\"turn_weight\":0.5,\"turn_duration\":2.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.44,\"geometry_index\":69,\"location\":[-118.291624,34.050893]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.007,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.125,\"geometry_index\":70,\"location\":[-118.291623,34.051002]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":12.2,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.945,\"geometry_index\":71,\"location\":[-118.291624,34.051229]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.903,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.998,\"geometry_index\":72,\"location\":[-118.291625,34.051776]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.898,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":7.216,\"geometry_index\":73,\"location\":[-118.291626,34.052081]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.134,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.606,\"geometry_index\":75,\"location\":[-118.291626,34.052403]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"location\":[-118.291626,34.052519],\"geometry_index\":76,\"admin_index\":0,\"weight\":4.585,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":4.117,\"bearings\":[0,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.359,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.106,\"geometry_index\":77,\"location\":[-118.291626,34.052672]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.907,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.103,\"geometry_index\":78,\"location\":[-118.291628,34.052912]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.571,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.15,\"geometry_index\":79,\"location\":[-118.291628,34.052974]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.124,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.369,\"geometry_index\":80,\"location\":[-118.291629,34.053154]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.407,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.39,\"geometry_index\":81,\"location\":[-118.291629,34.053238]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":0.802,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.959,\"geometry_index\":82,\"location\":[-118.29163,34.053535]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,360],\"duration\":8.827,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.805,\"geometry_index\":83,\"location\":[-118.291631,34.053579]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.198,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.684,\"geometry_index\":84,\"location\":[-118.291632,34.054021]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.55,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.89,\"geometry_index\":85,\"location\":[-118.291633,34.054151]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.486,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.72,\"geometry_index\":86,\"location\":[-118.291633,34.054236]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,180],\"duration\":8.919,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":8.467,\"geometry_index\":87,\"location\":[-118.291634,34.054524]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,182],\"duration\":0.287,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.327,\"geometry_index\":89,\"location\":[-118.291622,34.054953]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":13.867,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":16.979,\"geometry_index\":90,\"location\":[-118.291622,34.054971]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":3.78,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.63,\"geometry_index\":91,\"location\":[-118.291623,34.055661]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":1.447,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.764,\"geometry_index\":92,\"location\":[-118.291628,34.055848]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291628,34.055916],\"geometry_index\":93,\"admin_index\":0,\"weight\":3.527,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.254,\"bearings\":[2,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[false,true],\"in\":0,\"bearings\":[182,359],\"duration\":3.761,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.58,\"geometry_index\":94,\"location\":[-118.291625,34.055995]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":4.846,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.937,\"geometry_index\":95,\"location\":[-118.291629,34.056242]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":3.026,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.699,\"geometry_index\":96,\"location\":[-118.291633,34.056558]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,179],\"duration\":12.608,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":15.435,\"geometry_index\":97,\"location\":[-118.291637,34.056788]},{\"entry\":[false,true],\"in\":0,\"bearings\":[181,360],\"duration\":9,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.025,\"geometry_index\":98,\"location\":[-118.291627,34.057358]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291629,34.057758],\"geometry_index\":99,\"admin_index\":0,\"weight\":16.7,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.019,\"turn_weight\":2,\"duration\":14.019,\"bearings\":[180,359],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":2.4,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.94,\"geometry_index\":100,\"location\":[-118.291634,34.058116]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":13.378,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":16.38,\"geometry_index\":101,\"location\":[-118.291634,34.058186]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.457,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.551,\"geometry_index\":102,\"location\":[-118.291638,34.058649]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.615,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.645,\"geometry_index\":103,\"location\":[-118.291638,34.058679]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.264,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.99,\"geometry_index\":104,\"location\":[-118.291641,34.058964]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":4.043,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.929,\"geometry_index\":105,\"location\":[-118.291642,34.059131]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.447,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.764,\"geometry_index\":106,\"location\":[-118.291644,34.059301]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":0.18,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.221,\"geometry_index\":107,\"location\":[-118.291645,34.059375]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":3.276,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.99,\"geometry_index\":108,\"location\":[-118.291645,34.059386]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":2.707,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.307,\"geometry_index\":109,\"location\":[-118.291647,34.059554]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":1.639,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.984,\"geometry_index\":110,\"location\":[-118.291647,34.059685]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291649,34.05977],\"geometry_index\":111,\"admin_index\":0,\"weight\":4.117,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.735,\"bearings\":[179,360],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.895,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.763,\"geometry_index\":112,\"location\":[-118.29165,34.059879]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.367,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.116,\"geometry_index\":113,\"location\":[-118.29165,34.060121]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.84,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.704,\"geometry_index\":114,\"location\":[-118.291651,34.060249]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":16.327,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.992,\"geometry_index\":115,\"location\":[-118.29165,34.060391]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":18.24,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":22.344,\"geometry_index\":116,\"location\":[-118.291654,34.061002]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.127,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.822,\"geometry_index\":117,\"location\":[-118.29165,34.061688]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.29165,34.061803],\"geometry_index\":118,\"admin_index\":0,\"weight\":4.47,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":4.023,\"bearings\":[0,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[2,180],\"duration\":5.479,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.703,\"geometry_index\":119,\"location\":[-118.291649,34.06193]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,182],\"duration\":0.72,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.882,\"geometry_index\":120,\"location\":[-118.291637,34.062275]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.25,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.198,\"geometry_index\":121,\"location\":[-118.291637,34.062321]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.86,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.044,\"geometry_index\":122,\"location\":[-118.291639,34.062615]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.705,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.089,\"geometry_index\":123,\"location\":[-118.291639,34.062699]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.042,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.277,\"geometry_index\":124,\"location\":[-118.29164,34.062861]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":9.157,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.209,\"geometry_index\":125,\"location\":[-118.291641,34.062964]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":2.119,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.573,\"geometry_index\":126,\"location\":[-118.291646,34.063511]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291648,34.063634],\"geometry_index\":127,\"admin_index\":0,\"weight\":4.352,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.927,\"bearings\":[179,360],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":4.339,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.292,\"geometry_index\":128,\"location\":[-118.291649,34.063776]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.2,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.47,\"geometry_index\":129,\"location\":[-118.291654,34.064103]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":5.007,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.125,\"geometry_index\":130,\"location\":[-118.291656,34.064197]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.174,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.43,\"geometry_index\":131,\"location\":[-118.291665,34.064647]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":0.537,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.649,\"geometry_index\":132,\"location\":[-118.291667,34.064751]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":0.419,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.49,\"geometry_index\":133,\"location\":[-118.291667,34.064798]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":3.478,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.253,\"geometry_index\":134,\"location\":[-118.291668,34.064837]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":4.243,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.198,\"geometry_index\":135,\"location\":[-118.291673,34.065077]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":0.919,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.102,\"geometry_index\":137,\"location\":[-118.291672,34.065369]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":3.087,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.323,\"geometry_index\":138,\"location\":[-118.291673,34.065436]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":2.407,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.94,\"geometry_index\":139,\"location\":[-118.291674,34.065518]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.807,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.205,\"geometry_index\":140,\"location\":[-118.291677,34.0657]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":0.6,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.735,\"geometry_index\":141,\"location\":[-118.29168,34.065831]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.653,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.016,\"geometry_index\":142,\"location\":[-118.291681,34.065878]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,179],\"duration\":1.169,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.423,\"geometry_index\":143,\"location\":[-118.291683,34.066021]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,181],\"duration\":10.371,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":12.679,\"geometry_index\":144,\"location\":[-118.291682,34.066109]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":6.307,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":7.718,\"geometry_index\":145,\"location\":[-118.291681,34.066314]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":10.807,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":13.23,\"geometry_index\":146,\"location\":[-118.29168,34.06657]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.632,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.891,\"geometry_index\":147,\"location\":[-118.291679,34.066728]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.135,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.157,\"geometry_index\":148,\"location\":[-118.29168,34.066951]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":11.88,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":14.553,\"geometry_index\":149,\"location\":[-118.29168,34.066966]},{\"entry\":[true,false],\"in\":1,\"bearings\":[2,180],\"duration\":3.607,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.41,\"geometry_index\":150,\"location\":[-118.29168,34.067259]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291676,34.067349],\"geometry_index\":151,\"admin_index\":0,\"weight\":4.109,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.021,\"turn_weight\":2,\"duration\":3.742,\"bearings\":[0,182],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":5.028,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.136,\"geometry_index\":152,\"location\":[-118.291675,34.067447]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":0.35,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.42,\"geometry_index\":153,\"location\":[-118.291678,34.067731]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.543,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.89,\"geometry_index\":154,\"location\":[-118.291678,34.067748]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":11.932,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":14.608,\"geometry_index\":155,\"location\":[-118.291678,34.067832]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.134,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.606,\"geometry_index\":156,\"location\":[-118.291676,34.068305]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.982,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.203,\"geometry_index\":157,\"location\":[-118.291675,34.068425]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":8.516,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":10.424,\"geometry_index\":158,\"location\":[-118.291675,34.068481]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.134,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.606,\"geometry_index\":160,\"location\":[-118.291675,34.068948]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291675,34.069061],\"geometry_index\":161,\"admin_index\":0,\"weight\":3.686,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.383,\"bearings\":[0,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.595,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.946,\"geometry_index\":162,\"location\":[-118.291675,34.069174]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":3.937,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.799,\"geometry_index\":163,\"location\":[-118.291674,34.069305]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,358],\"duration\":0.654,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.778,\"geometry_index\":164,\"location\":[-118.291678,34.069634]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,178],\"duration\":1.271,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.556,\"geometry_index\":165,\"location\":[-118.29168,34.069684]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.702,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.434,\"geometry_index\":166,\"location\":[-118.29168,34.069788]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.807,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.16,\"geometry_index\":167,\"location\":[-118.291682,34.07014]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":0.739,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.864,\"geometry_index\":168,\"location\":[-118.291681,34.070321]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":2.967,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.152,\"geometry_index\":169,\"location\":[-118.291682,34.070394]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.567,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.872,\"geometry_index\":170,\"location\":[-118.291682,34.070462]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.167,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.592,\"geometry_index\":171,\"location\":[-118.291681,34.070582]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.411,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.494,\"geometry_index\":172,\"location\":[-118.291681,34.07077]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.902,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.274,\"geometry_index\":173,\"location\":[-118.291681,34.070807]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":6.435,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.714,\"geometry_index\":174,\"location\":[-118.291682,34.070983]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.79,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.939,\"geometry_index\":175,\"location\":[-118.291686,34.071435]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":12.372,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":14.838,\"geometry_index\":176,\"location\":[-118.291686,34.071476]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.47,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.563,\"geometry_index\":177,\"location\":[-118.291686,34.072186]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.92,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.696,\"geometry_index\":178,\"location\":[-118.291686,34.072209]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":4.069,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.86,\"geometry_index\":179,\"location\":[-118.291688,34.072432]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,360],\"duration\":1.657,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.98,\"geometry_index\":181,\"location\":[-118.291692,34.072673]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291693,34.072773],\"geometry_index\":182,\"admin_index\":0,\"weight\":3.296,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.087,\"bearings\":[0,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.797,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.348,\"geometry_index\":183,\"location\":[-118.291693,34.072883]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":6.847,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":8.708,\"geometry_index\":185,\"location\":[-118.291693,34.073158]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,358],\"duration\":2.04,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.448,\"geometry_index\":186,\"location\":[-118.291693,34.073666]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,178],\"duration\":9.36,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":11.232,\"geometry_index\":187,\"location\":[-118.291699,34.073823]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":4.507,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.4,\"geometry_index\":188,\"location\":[-118.291694,34.074522]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,358],\"duration\":0.583,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.675,\"geometry_index\":189,\"location\":[-118.291692,34.074973]},{\"entry\":[false,true],\"in\":0,\"bearings\":[178,360],\"duration\":2.362,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.835,\"geometry_index\":190,\"location\":[-118.291694,34.075016]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.476,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.363,\"geometry_index\":191,\"location\":[-118.291696,34.075206]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":4.161,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.985,\"geometry_index\":192,\"location\":[-118.291698,34.075531]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.246,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.495,\"geometry_index\":193,\"location\":[-118.291697,34.0758]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.545,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.646,\"geometry_index\":194,\"location\":[-118.291697,34.07588]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.53,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.828,\"geometry_index\":195,\"location\":[-118.2917,34.07624]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.2917,34.076337],\"geometry_index\":196,\"admin_index\":0,\"weight\":3.592,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.019,\"turn_weight\":2,\"duration\":3.345,\"bearings\":[180,359],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":3.607,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.32,\"geometry_index\":197,\"location\":[-118.291703,34.076459]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.822,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.979,\"geometry_index\":198,\"location\":[-118.291703,34.076802]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":2.492,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.991,\"geometry_index\":199,\"location\":[-118.291706,34.077177]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,179],\"duration\":4.846,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.815,\"geometry_index\":200,\"location\":[-118.291708,34.077336]},{\"entry\":[false,true],\"in\":0,\"bearings\":[181,359],\"duration\":0.992,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.163,\"geometry_index\":201,\"location\":[-118.291703,34.077647]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,179],\"duration\":7.922,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"turn_duration\":2.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":7.097,\"geometry_index\":202,\"location\":[-118.291705,34.077714]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":6.93,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.308,\"geometry_index\":204,\"location\":[-118.291701,34.078123]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,358],\"duration\":0.969,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.163,\"geometry_index\":205,\"location\":[-118.291703,34.078573]},{\"entry\":[false,true],\"in\":0,\"bearings\":[178,360],\"duration\":6.646,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.975,\"geometry_index\":206,\"location\":[-118.291706,34.078636]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"location\":[-118.29171,34.079064],\"geometry_index\":207,\"admin_index\":0,\"weight\":4.287,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.021,\"turn_weight\":2,\"duration\":3.927,\"bearings\":[180,358],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[178,360],\"duration\":4.667,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.591,\"geometry_index\":208,\"location\":[-118.291714,34.079147]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":3.6,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.32,\"geometry_index\":209,\"location\":[-118.291716,34.079346]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,360],\"duration\":25.412,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":30.494,\"geometry_index\":210,\"location\":[-118.291718,34.0795]},{\"lanes\":[{\"indications\":[\"left\"],\"valid_indication\":\"left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"location\":[-118.291722,34.080582],\"geometry_index\":211,\"admin_index\":0,\"weight\":2.557,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":0.5,\"duration\":3.722,\"bearings\":[1,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,181],\"duration\":3.621,\"lanes\":[{\"indications\":[\"left\"],\"valid_indication\":\"left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.32,\"geometry_index\":212,\"location\":[-118.291721,34.080674]},{\"bearings\":[180,360],\"entry\":[false,true],\"in\":0,\"lanes\":[{\"indications\":[\"left\"],\"valid_indication\":\"left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":213,\"location\":[-118.291721,34.080861]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"turn\",\"modifier\":\"left\",\"text\":\"US 101 North\"},\"distanceAlongGeometry\":5378.998},{\"sub\":{\"components\":[{\"active_direction\":\"left\",\"active\":true,\"directions\":[\"left\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"turn\",\"modifier\":\"left\",\"text\":\"US 101 North\"},\"distanceAlongGeometry\":402.336}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"turn\",\"instruction\":\"Turn right onto Vermont Avenue.\",\"modifier\":\"right\",\"bearing_after\":0,\"bearing_before\":270,\"location\":[-118.291566,34.032753]},\"speedLimitSign\":\"mutcd\",\"name\":\"Vermont Avenue\",\"weight_typical\":1007.249,\"duration_typical\":846.093,\"duration\":865.862,\"distance\":5378.998,\"driving_side\":\"right\",\"weight\":1031.835,\"mode\":\"driving\",\"geometry\":\"afe|_Aze}r`FwF?yD?_H@}B?q@?wD@sK?mD?aE@wk@BgI?k_@@sG@aDAqUBgT@}J?aF@kH?o~@WgWCoQC{Y?qF?oU?a]Xo@@g[VkY?iC?}[?sa@?ic@?qc@?qfAJ_J@oA?gJ@{UBuA?_^BazALyO@oW@yW@aA?mS?g[?mK?_O?uI?q^DkYDiUBuF@aK@_D@oFHyEAeM@ea@@aR@sQ?o@?gF?qH?_NB{B?gJ@gD?qQ@wA@sZ@cG@iD?_Q@iSOoEGc@?cj@@uJHgC?}CEmNFwRFkMFsb@S_XBkUHkC?}[F{@?yPDmI@sIBsC@U?oIBeG?iDByE@cN?_G@{GAee@F{i@GeF?}FAqTW{A?kQBgD?cI@mE@ea@HuFB{G@mSH{DBc[PoEB}A?mA@_NHmFAyI?eC@cD@kJDeGD}A@}GBoDAyKA_OA{HA}L@]?iQ?sDGcEAwPDa@?gD?q\\\\CoFAoB?uI?oQ?aF?aF?eGAqSFcBBoE?_UBiJAqC@gC?oFAwJ?iA?_J@g[FqA?kk@?m@?}LBqKDoA@gE@{E?sAAqM@w^?yHJuj@Ie[CuAB{JBiSByOA_D?oUDaE?sFDmT?mVD}HBmRIeCBiQKgFBc[B}BDwYFeDFmKBsHBsbAFwDAuJ?iJ@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 7 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 7 miles.\",\"distanceAlongGeometry\":11040.995},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Keep left to take California 1 70 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Keep left to take California 1 70 North.\",\"distanceAlongGeometry\":1609.344},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to take California 1 70 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to take California 1 70 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take California 1 70 North, Hollywood Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take California 1 70 North, Hollywood Freeway.\",\"distanceAlongGeometry\":197.778}],\"intersections\":[{\"lanes\":[{\"indications\":[\"left\"],\"valid_indication\":\"left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"location\":[-118.291722,34.081042],\"geometry_index\":214,\"admin_index\":0,\"weight\":14.006,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"turn_duration\":7.395,\"turn_weight\":12,\"duration\":9.066,\"bearings\":[180,271],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[91,273],\"duration\":7.336,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.794,\"geometry_index\":215,\"location\":[-118.291866,34.081045]},{\"entry\":[false,true],\"in\":0,\"bearings\":[93,275],\"duration\":12.8,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":2,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":12.96,\"geometry_index\":216,\"location\":[-118.292488,34.081075]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,291],\"duration\":3.48,\"turn_duration\":0.009,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.166,\"geometry_index\":221,\"location\":[-118.293382,34.081195]},{\"entry\":[false,true],\"in\":0,\"bearings\":[112,295],\"duration\":4.154,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.985,\"geometry_index\":223,\"location\":[-118.293656,34.081286]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.294547,34.081605],\"geometry_index\":226,\"admin_index\":0,\"weight\":9.693,\"is_urban\":true,\"turn_weight\":7,\"duration\":2.254,\"bearings\":[113,299],\"out\":1,\"in\":0,\"turn_duration\":0.01,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.294999,34.081815],\"geometry_index\":227,\"admin_index\":0,\"weight\":2.646,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":2.226,\"bearings\":[119,299],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[119,299],\"duration\":11.823,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.187,\"geometry_index\":228,\"location\":[-118.295461,34.082028]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,305],\"duration\":3.2,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.76,\"geometry_index\":235,\"location\":[-118.298155,34.083361]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,308],\"duration\":6.545,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.691,\"geometry_index\":237,\"location\":[-118.298851,34.083788]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,310],\"duration\":2.7,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.24,\"geometry_index\":239,\"location\":[-118.300195,34.0847]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,310],\"duration\":9.327,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.193,\"geometry_index\":240,\"location\":[-118.300748,34.085082]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[129,310],\"duration\":11.487,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.776,\"geometry_index\":244,\"location\":[-118.302653,34.086385]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.304762,34.088271],\"geometry_index\":254,\"admin_index\":0,\"weight\":25.776,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":21.487,\"bearings\":[146,327],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,321],\"duration\":22.502,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":26.976,\"geometry_index\":265,\"location\":[-118.307543,34.0925]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.312219,34.095718],\"geometry_index\":275,\"admin_index\":0,\"weight\":13.769,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":11.065,\"bearings\":[131,313],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.314011,34.097491],\"geometry_index\":284,\"admin_index\":0,\"weight\":5.695,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":4.754,\"bearings\":[147,329],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.314603,34.098405],\"geometry_index\":288,\"admin_index\":0,\"weight\":32.148,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.367,\"bearings\":[154,334],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,302],\"duration\":4.603,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.384,\"geometry_index\":299,\"location\":[-118.318499,34.103535]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.31956,34.104022],\"geometry_index\":302,\"admin_index\":0,\"weight\":12.493,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.665,\"bearings\":[117,288],\"out\":1,\"in\":0,\"turn_duration\":0.033,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,271],\"duration\":1.381,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.623,\"geometry_index\":311,\"location\":[-118.322266,34.104402]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,272],\"duration\":8.791,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.329,\"geometry_index\":312,\"location\":[-118.322619,34.104408]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[109,292],\"duration\":6.709,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.715,\"geometry_index\":319,\"location\":[-118.324852,34.104717]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,306],\"duration\":9.164,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.538,\"geometry_index\":326,\"location\":[-118.326408,34.105423]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":0.58,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.659,\"geometry_index\":327,\"location\":[-118.328379,34.106599]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.328499,34.106671],\"geometry_index\":328,\"admin_index\":0,\"weight\":11.322,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.071,\"bearings\":[126,306],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,305],\"duration\":1.72,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.935,\"geometry_index\":329,\"location\":[-118.33065,34.107974]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,304],\"duration\":7.72,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.685,\"geometry_index\":330,\"location\":[-118.331033,34.108197]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.332728,34.109213],\"geometry_index\":333,\"admin_index\":0,\"weight\":46.26,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":42.062,\"bearings\":[127,307],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.337153,34.117409],\"geometry_index\":357,\"admin_index\":0,\"weight\":5.72,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":4.875,\"bearings\":[166,345],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,339],\"duration\":16.01,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":16.79,\"geometry_index\":361,\"location\":[-118.337535,34.118401]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.339551,34.121389],\"geometry_index\":374,\"admin_index\":0,\"weight\":19.115,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":18.224,\"bearings\":[142,321],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":24.873,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":26.116,\"geometry_index\":378,\"location\":[-118.342872,34.124294]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.346766,34.128674],\"geometry_index\":393,\"admin_index\":0,\"weight\":41.098,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":38.238,\"bearings\":[139,320],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.354864,34.133945],\"geometry_index\":416,\"admin_index\":0,\"weight\":8.285,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":6.927,\"bearings\":[106,287],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.356636,34.134465],\"geometry_index\":418,\"admin_index\":0,\"weight\":17.105,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":14.767,\"bearings\":[111,291],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.360183,34.135957],\"geometry_index\":423,\"admin_index\":0,\"weight\":12.06,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.495,\"bearings\":[128,311],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.36238,34.137532],\"geometry_index\":425,\"admin_index\":0,\"weight\":1.794,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":1.567,\"bearings\":[131,311],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":1.44,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.656,\"geometry_index\":426,\"location\":[-118.362702,34.137761]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,310],\"duration\":28.64,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":32.936,\"geometry_index\":427,\"location\":[-118.362999,34.137972]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.367252,34.143186],\"geometry_index\":443,\"admin_index\":0,\"weight\":1.91,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.221,\"bearings\":[160,338],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,339],\"duration\":1.718,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.019,\"geometry_index\":444,\"location\":[-118.36737,34.143433]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,340],\"duration\":6.095,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.162,\"geometry_index\":445,\"location\":[-118.367537,34.143785]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.368141,34.145024],\"geometry_index\":449,\"admin_index\":0,\"weight\":13.267,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.319,\"bearings\":[155,330],\"out\":1,\"in\":0,\"turn_duration\":0.028,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,311],\"duration\":2.045,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.403,\"geometry_index\":458,\"location\":[-118.370106,34.146873]},{\"bearings\":[131,311],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":459,\"location\":[-118.370519,34.147166]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-134\",\"type\":\"icon\",\"text\":\"CA 134\"},{\"type\":\"text\",\"text\":\"East\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-170\",\"type\":\"icon\",\"text\":\"CA 170\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"CA 134 East / CA 170 North\"},\"distanceAlongGeometry\":11068.995}],\"destinations\":\"US 101 North, CA 2 West\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"turn\",\"instruction\":\"Turn left to take the US 101 North ramp.\",\"modifier\":\"left\",\"bearing_after\":271,\"bearing_before\":360,\"location\":[-118.291722,34.081042]},\"speedLimitSign\":\"mutcd\",\"name\":\"Hollywood Freeway\",\"weight_typical\":584.735,\"duration_typical\":502.22,\"duration\":474.974,\"distance\":11068.995,\"driving_side\":\"right\",\"weight\":552.978,\"mode\":\"driving\",\"ref\":\"US 101 North\",\"geometry\":\"cpc_`Aro}r`FE~G{@ze@]tJWdMc@bHu@`I_BxImAdGgB|GyBpHoBzHsKfc@cLf[iLz[}a@tiAcGdPkGpP}GvPuGbOqHhPuCvFyNzY{IrO_JzO_m@bbA{Vpa@mp@vfAMT{NlVuNdVaIlMwIbNyIjMeJzLeJ|K{J|KmKzKsL|KeLvJwKpIeM`JsLbIwLhHcMzGc|BdjAoM`HeMpGmMnHsLxHkLpIkLvJeL|KmJlKqJpLcJbMcIfMgIxNqeBpbDaIvNoH~LiJxNaJbM_KzMyJfLsKnLuKrKmK`K_KvIqKdIsLrI}L~HiMpH_MtG{MvG_gEnsBmNzH_M~HkLzIuKnJcKlKaKnLkJxL}IvMmHnMeHvNsGlO}FvO{Lb`@kDtR}ClQaClQiB`RqAvRq@~Q_@lRSvQIpOK`USzWa@tRu@bRqAdRuBxRoCtQeDdQ{CxMgDfMmDhLyD~KkE|KqEbKyHxOohAdzBoCnFmpAleC}L|VsT`e@}NhY}Xph@qH`NyH|MoIfNwItMiJnM_JdLaKdL_LjKyJdIgLjImLpHsMdHsLpF}MpFiNvEyMnDuMbDmyCjq@aOfDiNrCwMjCy_AhPwNtCsO|CiN`D_O`EgN`EmNtE{NnFcNpF{MxFcNnGqMvGuMnHkMtHkMlIkMxIuLnIeLbJgLnJgLhK{KpKsK~KkK`LunC|gD_KzLyJ~KoJxJiK`JqL`JsYrRoLfHy\\\\zRwLtHuLlIsLnJiLjKgLxKeMfMy{@v}@uM~McWnWiKfKo|@d~@_MnMsm@lo@wKfL}KdLiKtL_KhMiJ~MeIpMeI~NmHnOwGfPoFlOuDxL}HtYuC|MeCbNeDpUeEz[}K`w@sJpk@{SdaAm]v}AkKna@iK|[mQl`@uR`]eZvd@gfApbBiMbSeLpQwd@lt@cIfMwIxM}I|MeJhMsIbLoIvJ_KbKqLxJiK`IeLxH_MtH_NlHkMjGsMfF}qBrq@mNjF_UlIy]nLaQpGyKzEwNxGuMhIwNpKoKjJ_K`KiFfFyJhLwJhMkIxLkRxZiQxXag@dw@kb@jr@wIzM\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 11 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 11 miles.\",\"distanceAlongGeometry\":18373.996},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep left to take Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep left to take Interstate 5 North.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to take Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to take Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take Interstate 5 North, Golden State Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take Interstate 5 North, Golden State Freeway.\",\"distanceAlongGeometry\":233.333}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,310],\"duration\":10.191,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":12.207,\"geometry_index\":462,\"location\":[-118.372478,34.148545]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,327],\"duration\":1.335,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.602,\"geometry_index\":467,\"location\":[-118.3741,34.150254]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,328],\"duration\":2.778,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.334,\"geometry_index\":468,\"location\":[-118.374297,34.150502]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,326],\"duration\":28.565,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":34.278,\"geometry_index\":469,\"location\":[-118.374708,34.151038]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.378893,34.156599],\"geometry_index\":474,\"admin_index\":0,\"weight\":1.872,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.128,\"bearings\":[154,336],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,339],\"duration\":5.009,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.136,\"geometry_index\":475,\"location\":[-118.379018,34.156829]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,343],\"duration\":14.84,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":18.179,\"geometry_index\":476,\"location\":[-118.379524,34.157901]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,340],\"duration\":5.564,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.668,\"geometry_index\":481,\"location\":[-118.380885,34.16104]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.381423,34.162234],\"geometry_index\":482,\"admin_index\":0,\"weight\":13.05,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.882,\"bearings\":[160,340],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":1.95,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.389,\"geometry_index\":483,\"location\":[-118.382491,34.164681]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":9.787,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.745,\"geometry_index\":484,\"location\":[-118.382681,34.165122]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,337],\"duration\":4.094,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.883,\"geometry_index\":485,\"location\":[-118.38365,34.167323]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,332],\"duration\":3.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.32,\"geometry_index\":487,\"location\":[-118.384095,34.168178]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,329],\"duration\":0.225,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.27,\"geometry_index\":490,\"location\":[-118.384607,34.168887]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.384641,34.168934],\"geometry_index\":491,\"admin_index\":0,\"weight\":17.188,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":14.354,\"bearings\":[149,322],\"out\":1,\"in\":0,\"turn_duration\":0.03,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,308],\"duration\":2.661,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.193,\"geometry_index\":497,\"location\":[-118.38749,34.171304]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,308],\"duration\":1.653,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.984,\"geometry_index\":498,\"location\":[-118.388068,34.171678]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,309],\"duration\":3.037,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.645,\"geometry_index\":499,\"location\":[-118.388451,34.171926]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[129,309],\"duration\":10.2,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":12.24,\"geometry_index\":500,\"location\":[-118.389136,34.172388]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.391276,34.17384],\"geometry_index\":502,\"admin_index\":0,\"weight\":8.161,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":6.528,\"bearings\":[130,313],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.392473,34.174914],\"geometry_index\":505,\"admin_index\":0,\"weight\":22.877,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":19.48,\"bearings\":[141,327],\"out\":1,\"in\":0,\"turn_duration\":0.01,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,335],\"duration\":2.183,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.62,\"geometry_index\":510,\"location\":[-118.394953,34.179196]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,333],\"duration\":2.057,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.469,\"geometry_index\":511,\"location\":[-118.395214,34.179659]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,331],\"duration\":4.858,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.805,\"geometry_index\":512,\"location\":[-118.395504,34.180138]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,322],\"duration\":3.188,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.825,\"geometry_index\":515,\"location\":[-118.396238,34.181122]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,319],\"duration\":1.957,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.299,\"geometry_index\":516,\"location\":[-118.396802,34.181724]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.397154,34.182064],\"geometry_index\":517,\"admin_index\":0,\"weight\":26.353,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":22.452,\"bearings\":[139,315],\"out\":1,\"in\":0,\"turn_duration\":0.024,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.401189,34.186467],\"geometry_index\":526,\"admin_index\":0,\"weight\":2.701,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.883,\"bearings\":[161,344],\"out\":1,\"in\":0,\"turn_duration\":0.009,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,347],\"duration\":11.571,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.886,\"geometry_index\":527,\"location\":[-118.40134,34.186911]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.401786,34.189717],\"geometry_index\":530,\"admin_index\":0,\"weight\":20.795,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":16.933,\"bearings\":[174,354],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[174,354],\"duration\":1.8,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.16,\"geometry_index\":531,\"location\":[-118.402322,34.193745]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[174,354],\"duration\":5.949,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.139,\"geometry_index\":532,\"location\":[-118.402377,34.194157]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.402567,34.195559],\"geometry_index\":533,\"admin_index\":0,\"weight\":26.222,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":21.873,\"bearings\":[174,354],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,343],\"duration\":1.944,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.333,\"geometry_index\":541,\"location\":[-118.403427,34.20096]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[163,340],\"duration\":2.304,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.765,\"geometry_index\":542,\"location\":[-118.4036,34.201422]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.403842,34.201965],\"geometry_index\":543,\"admin_index\":0,\"weight\":12.99,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":10.432,\"bearings\":[160,336],\"out\":1,\"in\":0,\"turn_duration\":0.024,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.405062,34.204384],\"geometry_index\":545,\"admin_index\":0,\"weight\":53.624,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":45.219,\"bearings\":[158,339],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[167,348],\"duration\":1.653,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.942,\"geometry_index\":551,\"location\":[-118.408393,34.215548]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.408498,34.21594],\"geometry_index\":552,\"admin_index\":0,\"weight\":12.69,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.807,\"bearings\":[168,348],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,347],\"duration\":11.4,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.11,\"geometry_index\":553,\"location\":[-118.409213,34.218629]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[167,348],\"duration\":1.838,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.113,\"geometry_index\":554,\"location\":[-118.409999,34.22146]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,347],\"duration\":8.738,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.048,\"geometry_index\":555,\"location\":[-118.410113,34.221888]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[167,349],\"duration\":3.938,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.528,\"geometry_index\":556,\"location\":[-118.410674,34.223931]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.410864,34.224856],\"geometry_index\":558,\"admin_index\":0,\"weight\":5.195,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":4.092,\"bearings\":[173,358],\"out\":1,\"in\":0,\"turn_duration\":0.01,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[4,180],\"duration\":4.045,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.652,\"geometry_index\":561,\"location\":[-118.410899,34.225843]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[12,188],\"duration\":5.841,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.571,\"geometry_index\":563,\"location\":[-118.410777,34.226815]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.41031,34.228193],\"geometry_index\":566,\"admin_index\":0,\"weight\":2.953,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":2.646,\"bearings\":[17,199],\"out\":0,\"in\":1,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[21,197],\"duration\":5.869,\"turn_duration\":0.009,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.739,\"geometry_index\":567,\"location\":[-118.410092,34.228795]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[15,201],\"duration\":21.396,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":24.605,\"geometry_index\":568,\"location\":[-118.409487,34.230074]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,315],\"duration\":24.791,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":27.89,\"geometry_index\":581,\"location\":[-118.410578,34.23448]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,309],\"duration\":2.741,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.083,\"geometry_index\":583,\"location\":[-118.415196,34.238366]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.415762,34.238744],\"geometry_index\":584,\"admin_index\":0,\"weight\":7.46,\"is_urban\":true,\"turn_weight\":5.5,\"duration\":1.755,\"bearings\":[129,319],\"out\":1,\"in\":0,\"turn_duration\":0.014,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,318],\"duration\":17.335,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.502,\"geometry_index\":585,\"location\":[-118.416084,34.239049]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.419285,34.242025],\"geometry_index\":586,\"admin_index\":0,\"weight\":16.76,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":14.905,\"bearings\":[138,318],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,319],\"duration\":1.953,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.197,\"geometry_index\":588,\"location\":[-118.422058,34.244662]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.422427,34.245009],\"geometry_index\":589,\"admin_index\":0,\"weight\":4.286,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":3.373,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":9,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.125,\"geometry_index\":590,\"location\":[-118.423045,34.24559]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.424696,34.247141],\"geometry_index\":591,\"admin_index\":0,\"weight\":15.62,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":13.155,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.427096,34.249421],\"geometry_index\":592,\"admin_index\":0,\"weight\":8.28,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":7.207,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":1.839,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.115,\"geometry_index\":593,\"location\":[-118.428408,34.250663]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":12.913,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.85,\"geometry_index\":594,\"location\":[-118.428742,34.25098]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.431117,34.2532],\"geometry_index\":595,\"admin_index\":0,\"weight\":12.42,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.819,\"bearings\":[139,318],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,319],\"duration\":8.844,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.17,\"geometry_index\":596,\"location\":[-118.433113,34.255053]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":1.953,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.246,\"geometry_index\":597,\"location\":[-118.434733,34.256584]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":19.878,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":22.86,\"geometry_index\":598,\"location\":[-118.435098,34.256927]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.43873,34.260363],\"geometry_index\":600,\"admin_index\":0,\"weight\":10.81,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":9.419,\"bearings\":[139,318],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.440232,34.262059],\"geometry_index\":605,\"admin_index\":0,\"weight\":4.37,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":3.808,\"bearings\":[149,331],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,332],\"duration\":1.627,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.871,\"geometry_index\":606,\"location\":[-118.440729,34.262804]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,332],\"duration\":6.48,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.452,\"geometry_index\":607,\"location\":[-118.440968,34.26318]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,332],\"duration\":1.944,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.236,\"geometry_index\":608,\"location\":[-118.441879,34.264611]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,332],\"duration\":8.64,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.936,\"geometry_index\":609,\"location\":[-118.442149,34.265038]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,322],\"duration\":13.33,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":15.635,\"geometry_index\":612,\"location\":[-118.44348,34.266887]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.446164,34.269442],\"geometry_index\":616,\"admin_index\":0,\"weight\":6.93,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":5.48,\"bearings\":[138,319],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,323],\"duration\":1.745,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.051,\"geometry_index\":619,\"location\":[-118.447249,34.270477]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.44756,34.270819],\"geometry_index\":620,\"admin_index\":0,\"weight\":13.083,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.155,\"bearings\":[143,323],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,329],\"duration\":2.062,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.423,\"geometry_index\":624,\"location\":[-118.449268,34.27311]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.449582,34.273535],\"geometry_index\":625,\"admin_index\":0,\"weight\":2.115,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":1.821,\"bearings\":[149,327],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,325],\"duration\":2.412,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.834,\"geometry_index\":626,\"location\":[-118.449867,34.273895]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,321],\"duration\":12.115,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.236,\"geometry_index\":627,\"location\":[-118.450267,34.274373]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,318],\"duration\":1.781,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.138,\"geometry_index\":630,\"location\":[-118.452749,34.276759]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,319],\"duration\":10.165,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.944,\"geometry_index\":631,\"location\":[-118.453102,34.27708]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[146,331],\"duration\":2.375,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.791,\"geometry_index\":634,\"location\":[-118.455083,34.279084]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.455414,34.279586],\"geometry_index\":635,\"admin_index\":0,\"weight\":2.449,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.667,\"bearings\":[151,334],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"bearings\":[154,334],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":636,\"location\":[-118.455638,34.279962]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden State Freeway\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 5 North / Golden State Freeway\"},\"distanceAlongGeometry\":18408.996}],\"destinations\":\"CA 134 East, CA 170 North\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take CA 170 North/Hollywood Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":310,\"bearing_before\":311,\"location\":[-118.372478,34.148545]},\"speedLimitSign\":\"mutcd\",\"name\":\"Hollywood Freeway\",\"weight_typical\":818.366,\"duration_typical\":687.755,\"duration\":691.934,\"distance\":18408.996,\"driving_side\":\"right\",\"weight\":819.942,\"mode\":\"driving\",\"ref\":\"CA 170 North\",\"geometry\":\"akgc`Azf{w`F}KhQwNhP_S|QcK|I_m@zb@oNhKo`@tX_aEl|C}q@rf@y^hUoZbPij@`XkMxF_bAr^}S|F_aAn[{`Af\\\\cUlHgT|HsiAr`@}wCvaAqZzJqhCp{@wl@|UuFzCqK|FsT~NcI`G}AbAk]t[gOxN_UdWqObR_MnR}o@veAkVbc@oN|V{[xi@mcAzdBiUz^kNtR{Zx^{VhVuz@hn@oZ`QgTbKwU|JmgCp`A}[hO}\\\\bQaPlJsYjRyP`Nsd@fb@gT~TwsB~kCoPpQyQnPiR~NgS|MySjLqS`KiTlI{RhGwZlHeSrDuUlCocCxPwzFn`@wXlBsvAzJs{@bFkVvAqjCzQkVlBuUnBaUvCkVrEoUtE{[xI}`@bNubAvb@orAng@i\\\\|Lok@jQs[bJcd@`Ki[pG{pOboCoWpEagDtk@}oDbp@wYbFu~B`b@}d@`H{RxA_RZmTh@gT?ka@}AkYuCm_@oGo_@yJeT{Gsd@sL}nAyd@gTaFkQsCgUuBw`@YcQf@g_@zDuTzE_RxFyNhFyTbLmNzIgQxNkPlNelDppEudA`nAsVjb@aRbS_yD`gEcmBpvBuu@vt@uT`Vic@re@}_BdfBomC~tCslA~pAyRzSwiClsCyrBv{Bu~AfdBmTxUihDhrDml@tn@sYr[kSpRkPnMuPbM}V`Pqm@`^oV|MmxA|w@uYzOkm@v\\\\um@nb@oU|P{_@f^eRnSkZ|\\\\goA`uA_f@`h@oKhLeLlLkTlRePnNiTbOiz@pj@kl@p^qYrRoUxP{\\\\~Wue@td@mb@fe@_jAdnAaS`Ua|@v_Auc@xc@oZfUk^tSoV~L}dDdbBop@|a@wi@xd@gS~SkThXiN|RuU|^m|BdoEi\\\\vl@g[nc@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":3566.999},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to stay on Interstate 5 North, Golden State Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to stay on Interstate 5 North, Golden State Freeway.\",\"distanceAlongGeometry\":245}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,318],\"duration\":5.622,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.173,\"geometry_index\":646,\"location\":[-118.464607,34.288295]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,321],\"duration\":9.529,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.482,\"geometry_index\":648,\"location\":[-118.465732,34.289374]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":29.471,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":31.681,\"geometry_index\":649,\"location\":[-118.467594,34.291244]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.473351,34.297045],\"geometry_index\":651,\"admin_index\":0,\"weight\":18.937,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":17.566,\"bearings\":[141,321],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.476647,34.300365],\"geometry_index\":652,\"admin_index\":0,\"weight\":1.454,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":1.392,\"bearings\":[141,321],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":2.942,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.089,\"geometry_index\":653,\"location\":[-118.476922,34.300641]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,322],\"duration\":9.803,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.286,\"geometry_index\":654,\"location\":[-118.477508,34.30123]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":1.482,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.556,\"geometry_index\":655,\"location\":[-118.479427,34.303223]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":14.711,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.447,\"geometry_index\":656,\"location\":[-118.47971,34.303519]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.482548,34.306535],\"geometry_index\":657,\"admin_index\":0,\"weight\":27.578,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":25.808,\"bearings\":[142,321],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"bearings\":[148,329],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":662,\"location\":[-118.48721,34.311995]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden State Freeway\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 5 North / Golden State Freeway\"},\"distanceAlongGeometry\":3601.999}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take I 5 North/Golden State Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":318,\"bearing_before\":313,\"location\":[-118.464607,34.288295]},\"speedLimitSign\":\"mutcd\",\"name\":\"Golden State Freeway\",\"weight_typical\":137.115,\"duration_typical\":128.268,\"duration\":127.935,\"distance\":3601.999,\"driving_side\":\"right\",\"weight\":136.764,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"mixk`A|do}`FgSjUen@|n@{sBjsBef@re@kbId`IonE~lEgPdPyc@rc@q{B|vBoQtPo{DjpDamAxjA_@^mt@hq@au@vo@uyCnrBgrB`sA\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1.5 miles, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1.5 miles, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":2614.999},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to stay on Interstate 5 North, Golden State Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to stay on Interstate 5 North, Golden State Freeway.\",\"distanceAlongGeometry\":245}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":3.762,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.849,\"geometry_index\":663,\"location\":[-118.488555,34.313839]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":4.413,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.523,\"geometry_index\":664,\"location\":[-118.489103,34.314579]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,330],\"duration\":2.25,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.306,\"geometry_index\":665,\"location\":[-118.489749,34.315458]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,328],\"duration\":1.238,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.269,\"geometry_index\":666,\"location\":[-118.490077,34.31592]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,329],\"duration\":31.087,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":31.087,\"geometry_index\":667,\"location\":[-118.490262,34.316169]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.496616,34.321344],\"geometry_index\":678,\"admin_index\":0,\"weight\":17.758,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":17.708,\"bearings\":[125,305],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,306],\"duration\":7.59,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.393,\"geometry_index\":680,\"location\":[-118.500823,34.323775]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[134,320],\"duration\":6.587,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.423,\"geometry_index\":684,\"location\":[-118.502475,34.324919]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,328],\"duration\":12.913,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.267,\"geometry_index\":686,\"location\":[-118.503635,34.326125]},{\"bearings\":[158,338],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":691,\"location\":[-118.505183,34.328792]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden State Freeway\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 5 North / Golden State Freeway\"},\"distanceAlongGeometry\":2649.999}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to stay on I 5 North/Golden State Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":329,\"bearing_before\":329,\"location\":[-118.488555,34.313839]},\"speedLimitSign\":\"mutcd\",\"name\":\"Golden State Freeway\",\"weight_typical\":97.629,\"duration_typical\":98.876,\"duration\":101.048,\"distance\":2649.999,\"driving_side\":\"right\",\"weight\":99.7,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"}ejm`At}}~`Fgm@fa@}u@jg@{[nSqNpJe\\\\bTcf@h`@ya@|^ue@jg@eZf^}QtV{^xi@sJpPkMrTgJdQkaAfrBqdArwBkqAhmCiRr^iOrWuNhTeStXsg@`h@wa@l^oFnDuXrRuW`Osb@vRehAxb@srDfwA\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 36 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 36 miles.\",\"distanceAlongGeometry\":58074.98},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to stay on Interstate 5 North, Golden State Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to stay on Interstate 5 North, Golden State Freeway.\",\"distanceAlongGeometry\":245}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,337],\"duration\":40.31,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.268,\"geometry_index\":692,\"location\":[-118.506595,34.331666]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.5147,34.338099],\"geometry_index\":715,\"admin_index\":0,\"weight\":24.251,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":25.684,\"bearings\":[120,301],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[117,295],\"duration\":10.641,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.843,\"geometry_index\":718,\"location\":[-118.519255,34.340288]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.521308,34.340894],\"geometry_index\":723,\"admin_index\":0,\"weight\":73.198,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":80.794,\"bearings\":[104,283],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[115,295],\"duration\":8.809,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.928,\"geometry_index\":750,\"location\":[-118.541288,34.349997]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[115,295],\"duration\":53.923,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":48.531,\"geometry_index\":751,\"location\":[-118.543551,34.350885]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.554104,34.359653],\"geometry_index\":763,\"admin_index\":0,\"weight\":10.273,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.114,\"bearings\":[161,341],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,345],\"duration\":2.375,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.256,\"geometry_index\":766,\"location\":[-118.554925,34.362169]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,344],\"duration\":10.991,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.717,\"geometry_index\":767,\"location\":[-118.5551,34.362711]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.556124,34.365145],\"geometry_index\":770,\"admin_index\":0,\"weight\":48.332,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":48.351,\"bearings\":[155,334],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.562927,34.374976],\"geometry_index\":773,\"admin_index\":0,\"weight\":28.437,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.751,\"bearings\":[152,333],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,341],\"duration\":23.928,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":25.116,\"geometry_index\":775,\"location\":[-118.566432,34.380647]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,343],\"duration\":2.739,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.876,\"geometry_index\":777,\"location\":[-118.568576,34.385721]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[163,342],\"duration\":21.764,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.852,\"geometry_index\":778,\"location\":[-118.568805,34.386322]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.570279,34.390928],\"geometry_index\":781,\"admin_index\":0,\"weight\":22.638,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":21.579,\"bearings\":[170,349],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[169,349],\"duration\":8.459,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.086,\"geometry_index\":782,\"location\":[-118.571443,34.395675]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[169,349],\"duration\":18.367,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.737,\"geometry_index\":783,\"location\":[-118.571889,34.397582]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":16.04,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":16.842,\"geometry_index\":787,\"location\":[-118.573138,34.401567]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.574642,34.404947],\"geometry_index\":788,\"admin_index\":0,\"weight\":23.83,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":22.715,\"bearings\":[160,339],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.576838,34.409832],\"geometry_index\":790,\"admin_index\":0,\"weight\":28.234,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":26.432,\"bearings\":[160,339],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,339],\"duration\":17.491,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":18.366,\"geometry_index\":799,\"location\":[-118.579211,34.415566]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.581092,34.419266],\"geometry_index\":802,\"admin_index\":0,\"weight\":18.321,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":17.063,\"bearings\":[157,336],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,337],\"duration\":3.677,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.953,\"geometry_index\":803,\"location\":[-118.583032,34.422925]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":5.87,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.31,\"geometry_index\":804,\"location\":[-118.583443,34.423708]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":7.16,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.697,\"geometry_index\":805,\"location\":[-118.584092,34.424944]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.584863,34.426416],\"geometry_index\":806,\"admin_index\":0,\"weight\":2.581,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.956,\"bearings\":[157,336],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,337],\"duration\":6.736,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.241,\"geometry_index\":807,\"location\":[-118.585082,34.42683]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":1.858,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.997,\"geometry_index\":808,\"location\":[-118.585834,34.428266]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":12.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.545,\"geometry_index\":809,\"location\":[-118.586044,34.428665]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,317],\"duration\":1.839,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.023,\"geometry_index\":819,\"location\":[-118.587885,34.431039]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,316],\"duration\":11.528,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":12.392,\"geometry_index\":820,\"location\":[-118.588233,34.43135]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":26.485,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.787,\"geometry_index\":821,\"location\":[-118.590511,34.433295]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.595752,34.437745],\"geometry_index\":822,\"admin_index\":0,\"weight\":19.527,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":18.583,\"bearings\":[136,315],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.599968,34.440493],\"geometry_index\":830,\"admin_index\":0,\"weight\":28.444,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.757,\"bearings\":[123,302],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.606793,34.444036],\"geometry_index\":831,\"admin_index\":0,\"weight\":18.286,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":17.359,\"bearings\":[122,302],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.610876,34.446715],\"geometry_index\":841,\"admin_index\":0,\"weight\":24.289,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":23.216,\"bearings\":[144,325],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,332],\"duration\":2.911,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.983,\"geometry_index\":847,\"location\":[-118.614433,34.451299]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,336],\"duration\":34.357,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":34.35,\"geometry_index\":849,\"location\":[-118.614805,34.451912]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[9,189],\"duration\":114.301,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":111.425,\"geometry_index\":865,\"location\":[-118.615263,34.45997]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,328],\"duration\":24.895,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.254,\"geometry_index\":906,\"location\":[-118.617133,34.487125]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":15.289,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.9,\"geometry_index\":909,\"location\":[-118.621089,34.492404]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":2.047,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.996,\"geometry_index\":910,\"location\":[-118.623558,34.495717]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,329],\"duration\":14.4,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.04,\"geometry_index\":911,\"location\":[-118.623894,34.496159]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,341],\"duration\":292.207,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":270.285,\"geometry_index\":916,\"location\":[-118.625888,34.499345]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,321],\"duration\":25.077,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.935,\"geometry_index\":987,\"location\":[-118.66799,34.548523]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,344],\"duration\":6.559,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.739,\"geometry_index\":996,\"location\":[-118.670769,34.553034]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,333],\"duration\":22.5,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":19.688,\"geometry_index\":999,\"location\":[-118.67123,34.554169]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,311],\"duration\":17.329,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.141,\"geometry_index\":1005,\"location\":[-118.674304,34.557867]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,303],\"duration\":3.128,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.808,\"geometry_index\":1012,\"location\":[-118.678215,34.559873]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,307],\"duration\":40.72,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":36.648,\"geometry_index\":1014,\"location\":[-118.678917,34.560267]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,336],\"duration\":6.392,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.732,\"geometry_index\":1027,\"location\":[-118.686155,34.566944]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,334],\"duration\":6.25,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.625,\"geometry_index\":1028,\"location\":[-118.686856,34.568271]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,329],\"duration\":2.097,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.887,\"geometry_index\":1030,\"location\":[-118.68763,34.56954]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,328],\"duration\":20.64,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":18.576,\"geometry_index\":1031,\"location\":[-118.687927,34.56995]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[116,294],\"duration\":462.578,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":404.739,\"geometry_index\":1038,\"location\":[-118.692175,34.572895]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":24.512,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.441,\"geometry_index\":1148,\"location\":[-118.753769,34.650821]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[0,181],\"duration\":50.912,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":44.53,\"geometry_index\":1155,\"location\":[-118.754531,34.656112]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,322],\"duration\":22.25,\"turn_duration\":0.009,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":19.461,\"geometry_index\":1171,\"location\":[-118.761729,34.665038]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,323],\"duration\":160.694,\"turn_duration\":0.036,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":140.576,\"geometry_index\":1179,\"location\":[-118.765001,34.669939]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,340],\"duration\":13.543,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.844,\"geometry_index\":1233,\"location\":[-118.794512,34.704675]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":2.103,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.84,\"geometry_index\":1235,\"location\":[-118.795912,34.707855]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":13.361,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.691,\"geometry_index\":1236,\"location\":[-118.796132,34.708353]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,341],\"duration\":157.871,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":138.131,\"geometry_index\":1237,\"location\":[-118.797559,34.711612]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[1,183],\"duration\":1.125,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":1.013,\"geometry_index\":1260,\"location\":[-118.79544,34.748359]},{\"bearings\":[0,181],\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"geometry_index\":1261,\"location\":[-118.795435,34.748628]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden State Freeway\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 5 North / Golden State Freeway\"},\"distanceAlongGeometry\":58109.98}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to stay on I 5 North/Golden State Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":337,\"bearing_before\":338,\"location\":[-118.506595,34.331666]},\"speedLimitSign\":\"mutcd\",\"name\":\"Golden State Freeway\",\"weight_typical\":1975.393,\"duration_typical\":2118.145,\"duration\":2276.43,\"distance\":58109.98,\"driving_side\":\"right\",\"weight\":2117.475,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"c`mn`Adea`aFu\\\\lNiOxHmNfIwM|HwMvK_L~H{LbLmMfLgYvXyKfM}JdMgIxKgJnN}JlOiIhNykAxrBmIbOmK~RcJjQ{HbPgH`P{HxQgb@liAuqBpiF}IbVeJ~Y{GdVsG`X}FxYwEbYuDbZsCrW{BpVyTrcDgBrToCzV}CzUgDbUqFtXkGxXkKl^_JxW_JxVaNjZuNdZw]|j@{b@ri@of@jd@kd@t`@a]~\\\\aVbZmSjYiRl[{Pz[aPr^iNn_@kU~v@saCvsIov@llCkq@raCsMv_@oNn\\\\gTjb@aVb^qQtWyxFppGm^jZoi@p]ea@dTo]~NeOxEcK`DkiAvTweAnW{`@|IaoAl[}i@vQc\\\\xO_]rPelFxwDgzIv}EgpIfrEePxFurExxAmhBdk@qd@hMocBfg@acAjZivBnWugHvgAevBzZarBlZkn@nMuc@|L}p@dUgrE~|Ag|D~tAasBfr@agBvn@oWtIyUnHuV`H}V|GqnA|\\\\_YfIuZ~IcYdJkZlKoZdLkoD|zAucFfxB}o@tXglApg@_{Ado@{XtLwxA~m@}WbLsSxIiNtG}MnHcLlH{LrIcLvIoMxKsMnLaMrLeMhNmRvTqxBjmCcuGpfIae@`m@qQbWkPxV}NpViNfWaNxX}MvYoc@bdAm|EpiLcXto@wTzh@cMbYeM|ViMzTsMrSwOnTkPpRiOtR{KhJmAnAaY|S}QdNmgEzyCoQfMcSpMuQ`KsRdJuVxKgTzHyTdH{VvGwX`GkVdEmV~C{UnBqWrAsWt@oYUuT@sWgAaXsBqWqC}pC_[}WwCeXeBqWu@qWOoXZiXrAeX|BuWhDqWzEeWdGsWtHyu@fUsVnG_WdFmW`EgT`CmW`BsWz@_WDsW_@{WqA}WiCkUsCw~NmrB_d@iE{d@aC_e@gAsb@?_e@jAmc@zBkc@lEm_@~E{b@dIgb@fK{a@xL{`@nNa^jOk]|Pe\\\\tQc[dSwj@f_@uzB|{AojDl_Cwa@zXanEhyCsZ~SwvAb`AgYlP_YvMc\\\\jM_]|Kmj@fQiY~JkXnLoXrMiUdN{RvMuWjTsLfKaW`VsShXedArrAwUxXcU|TcU|QaYdTkkCfeBq{CtuB{i@j\\\\qwG|vDsVxPuUtSgTvTsRnWcPbYgQd`@oYjx@oQzd@sMbY_QnYecAzyAcUbXcUbV_WnT}UlQqWbNmmTddIkXjMaWlOgRrN}BdB}U`TmSdUwQbWqUx^qVd]wQzRoPdOkS|Ogq@z`@kUvOcUvQqTnUoQlUwPjZkOjVkNdSsNpQsP~QyrCzbCoYdXuXxXc|Ap_BiRlTiRlV_OdUoNbVigA~oBmSb\\\\sRnY_TnX}UlXgWnVuUvR_iAt{@iWlPiWlM}X`KwY`I}ZjFw^jGkXvGsU~G}U`JeVlMuUvOo`CrfBmSbQiRvR_OlRcPxV_LxSgLbWqJbWue@ntAsMn^cPpa@kOb]gGvL}MnWuNlVec@hv@kr@dpAm`@to@eXje@kWx]gWtZw_@|\\\\eb@|Xq]rR}WlMmcAl_@}qAxj@am@`Zg`@hTsXpQ}V`Q_SfSof@xl@u[`g@qYth@qWzo@ySvq@keB|vG_Lp_@iMf]gU~h@gXnc@_d@zp@aa@|c@gb@j[uy@~q@_{@fn@iZbVeYnYsWx[{Zpc@iqDbyFcPbWgRlWmr@ro@uY|UuZ|Qic@nUwe@rPiHjBgd@nLaq@zJgZfCaQ`@wgAhCyv@YcYw@wmLal@iKi@ih@yB_n@oAi`AjEcfD~b@qo@hK}l@jDq^z@e^Ig|C^m`@`@qo@~Dyu@hMyl@~Omj@lTaa@`Qia@jQo{HhnDerBr`AkrBv_A_[vO_RdKwXzPaVfP_SjNuSvQk]n]sXn\\\\{g@~q@cg@xq@mS|b@eXtl@cO|WqT`YgS~WmWbXeRxQ}TjQ_W`SwUfTkk@`j@wShTaSfTu]p_@iVpZmPtToNpVeQl]}Ovb@yMr_@iOfg@mO`o@wCrPyAxQkB|u@_@b_BgB``AgCvp@uD`h@{Fhf@gLxo@{Jpd@gLvb@iPnd@cKbVmbDnmHeKbTqKzRsQjZgThZySvWcV~UyZvXg^vYqPdKmQdI_`@tPm[~Ku{MrmEm\\\\vKem@lQcc@pGgj@|Eeg@fBi`CgAeEA{T?y`@vB{m@jGul@zLml@xQcr@vZyr@jf@on@xk@kf@pl@uYxd@ij@~`Ag_@|p@iPbZcQpWgH|JmZd]yg@pe@e^jVaW|Nud@dUwt@h\\\\we@dUwe@dWih@v[}OfNgVnViTrUsR~VgRxWeSl[}MnYmPx`@aLj\\\\gKr]eJ`^{G`\\\\{Fn\\\\cF~Z{J~l@mHhb@uG|^_Hh\\\\iIr[uIxX{IpUkQfc@kTla@_Tn]_Zl`@}VjWcYxWeX|Ti_@|Ui^rQm\\\\hOct@fWc]dOa_@lSu]`V_UnQqhL`wJ_TtP_T~NmT`NkU`MqV|KquMv~FaXvKkYpKgZrI}[fIqpCbn@{YxGsYzHmYnIyXjIqXzIwgA|]o{A`h@giBlm@c^vLujEdxAgW`IiZjHeYjFkXjDgZ`C}XtAwWr@c{P|j@mi@tAgg@t@wd@Hed@Smf@_Acf@wAel@_Duf@kDwg@uE{~]arDiBSih@kEuf@aD}n@uCqx@kByOIcf@?qe@HaaIjFutAx@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 22 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 22 miles.\",\"distanceAlongGeometry\":35760.992},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep right to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep right to stay on Interstate 5 North.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to stay on Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to stay on Interstate 5 North.\",\"distanceAlongGeometry\":226}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[179,359],\"duration\":8.154,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.333,\"geometry_index\":1265,\"location\":[-118.795587,34.756395]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[175,352],\"duration\":3.097,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.787,\"geometry_index\":1269,\"location\":[-118.795698,34.758325]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,349],\"duration\":2.336,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.103,\"geometry_index\":1271,\"location\":[-118.795834,34.759038]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[169,347],\"duration\":11.31,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.159,\"geometry_index\":1272,\"location\":[-118.795961,34.759576]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,335],\"duration\":2.55,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.295,\"geometry_index\":1277,\"location\":[-118.797007,34.762137]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":13.538,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.184,\"geometry_index\":1278,\"location\":[-118.797319,34.762687]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,334],\"duration\":3.019,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.7,\"geometry_index\":1280,\"location\":[-118.798991,34.765628]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,332],\"duration\":2.1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.89,\"geometry_index\":1281,\"location\":[-118.799378,34.766275]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,332],\"duration\":14.703,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.233,\"geometry_index\":1282,\"location\":[-118.799668,34.76672]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.801888,34.769686],\"geometry_index\":1288,\"admin_index\":0,\"weight\":161.373,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":183.874,\"bearings\":[145,324],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[99,279],\"duration\":17.522,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.326,\"geometry_index\":1325,\"location\":[-118.846715,34.794443]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[99,279],\"duration\":2.194,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.92,\"geometry_index\":1326,\"location\":[-118.852187,34.795153]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[99,279],\"duration\":19.643,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.188,\"geometry_index\":1327,\"location\":[-118.852879,34.795241]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[99,278],\"duration\":66.396,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":59.737,\"geometry_index\":1329,\"location\":[-118.858952,34.796016]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":56.175,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":50.558,\"geometry_index\":1343,\"location\":[-118.875914,34.80217]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[6,184],\"duration\":16.998,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":15.291,\"geometry_index\":1359,\"location\":[-118.884484,34.813056]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[40,220],\"duration\":1.015,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":0.913,\"geometry_index\":1369,\"location\":[-118.882044,34.817356]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[40,220],\"duration\":11.483,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":10.334,\"geometry_index\":1370,\"location\":[-118.881824,34.817569]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[41,220],\"duration\":21.088,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":18.973,\"geometry_index\":1371,\"location\":[-118.879194,34.820099]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[40,221],\"duration\":26.69,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":24.002,\"geometry_index\":1374,\"location\":[-118.87486,34.824251]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.869695,34.829202],\"geometry_index\":1377,\"admin_index\":0,\"weight\":8.229,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":8.608,\"bearings\":[40,221],\"out\":0,\"in\":1,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[41,220],\"duration\":55.647,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":50.076,\"geometry_index\":1378,\"location\":[-118.868085,34.830783]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":95.095,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":85.58,\"geometry_index\":1399,\"location\":[-118.864214,34.841577]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,323],\"duration\":47.389,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":42.649,\"geometry_index\":1408,\"location\":[-118.879833,34.862656]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":2.527,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.274,\"geometry_index\":1412,\"location\":[-118.889384,34.872127]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":11.697,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.521,\"geometry_index\":1413,\"location\":[-118.889897,34.87263]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":1.827,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.592,\"geometry_index\":1415,\"location\":[-118.891927,34.874622]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,317],\"duration\":8.462,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.386,\"geometry_index\":1416,\"location\":[-118.892254,34.874939]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.893804,34.876255],\"geometry_index\":1418,\"admin_index\":0,\"weight\":69.406,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":78.771,\"bearings\":[135,312],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,302],\"duration\":141.723,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":124.001,\"geometry_index\":1440,\"location\":[-118.911126,34.890157]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.923023,34.922652],\"geometry_index\":1487,\"admin_index\":0,\"weight\":69.287,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":78.633,\"bearings\":[16,196],\"out\":0,\"in\":1,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,330],\"duration\":5.4,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.725,\"geometry_index\":1503,\"location\":[-118.928862,34.938097]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,334],\"duration\":3.16,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.765,\"geometry_index\":1504,\"location\":[-118.929557,34.939102]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,331],\"duration\":8.232,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.185,\"geometry_index\":1505,\"location\":[-118.929939,34.939739]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":20.395,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.838,\"geometry_index\":1511,\"location\":[-118.930873,34.941395]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,345],\"duration\":113.889,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":99.636,\"geometry_index\":1518,\"location\":[-118.932392,34.945903]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,344],\"duration\":3.639,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.275,\"geometry_index\":1523,\"location\":[-118.94037,34.971213]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,346],\"duration\":48.169,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":43.353,\"geometry_index\":1524,\"location\":[-118.940644,34.972022]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,345],\"duration\":14.961,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.458,\"geometry_index\":1526,\"location\":[-118.943968,34.982739]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,345],\"duration\":27.007,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.3,\"geometry_index\":1527,\"location\":[-118.945047,34.98602]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,345],\"duration\":37.779,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":34.925,\"geometry_index\":1529,\"location\":[-118.946877,34.992032]},{\"bearings\":[165,345],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":1531,\"location\":[-118.94936,34.999677]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"I 5 North\"},\"distanceAlongGeometry\":35795.992}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to stay on I 5 North/Golden State Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":359,\"bearing_before\":359,\"location\":[-118.795587,34.756395]},\"speedLimitSign\":\"mutcd\",\"name\":\"Golden State Freeway\",\"weight_typical\":1141.438,\"duration_typical\":1282.112,\"duration\":1328.865,\"distance\":35795.992,\"driving_side\":\"right\",\"weight\":1182.333,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"uqjhaAdsuqaFqk@ZsXj@sX~@yWtAqU~B_UnCs`@|Fo_@jHs`@vJa`@vL}^jN}[bNka@nRm}CxxAkXtMmg@dWyZbQua@vUo_@xUe\\\\xTi]lVi]dWk[vVay@~r@}[xZ}[d\\\\s[d]yZb]s[d_@_Zz^sXz^o\\\\zd@yZpd@qXdc@_Wza@iXff@_Wre@ubL`zTmcEnfIq]|o@qY`h@_CdE}^hm@}[pf@qnDvfFoS~Y_RnZ}Pn\\\\wOb\\\\eNd\\\\{Mz^wLn_@qJn^mIp`@qGn_@mFz`@aEdd@}B``@yZjjF_]|bFkk@~tIoDfj@aSpvCk[~bFsz@vyNcCd`@yDz`@{Ed]uFn[oIn_@yJd]yJlYaMzYmNbYiPxXeQxVkR~V_uDzrEm_InvJ_VhY}SlTeUxRqTlPeT`NsUlLyUvJsXtIcY`HmY`F{XtDaXjBuY^sX?eW_AuYuBs[wE}[aHs[kK{XaLcYmNc[cSkYmU}VcVmXmYiLwLc}CkcD}j@km@aaEciEoTkUcaCkfCccBkfBenAasAyaBscBmqEizEwTcUmQwOqRaNoRcLmQaJcSuH{SaHqUaFgWuDsVuBaXi@{XHwW~AiX`DwX`FkW~HmWvJsPfImQjKmj@d_@kgFthDcpDfaCwo@pc@ovAjaAqcCz_B{tNnnJum@xa@ml@zb@cl@fe@if@zb@y`@x_@wd@rd@a`NriNm^`_@csAbtAkg@vh@yRlSmo@~u@y`@zh@g\\\\lf@kvAzyBu]zg@}Yl[{YjZm\\\\nW_`@xVeb@lUqvCvgAg]lS}VlPom@ri@aVb[mNhTgA`BwX`j@wn@f~Aus@xoBsz@`pBkc@|gAcWpo@y]l|@wKtWmKzU_LnUeNvYiy@nwA{PxYo{@dxAgs@bmAo|AlhC}QxWiMlPiPxPsP`QaSxOyOvL{SvOwTvLyXvKuV|LiSvHk^nJkYjFeWtCcVjCmnAjMquGzl@_XtBoe@jBsf@Uu\\\\uAg|CcTs_AkF}S`@aQ\\\\g|@~Igj@xFsxAlQi\\\\rCuE`@{f@jCin@^ii@k@}r@_Dgs@wG{c@kGyf@wJkoAkZo}Ai_@}_@uGe\\\\aF}\\\\_Ca^Ig`@^m\\\\tA{[~B_[tEu\\\\`Ie\\\\vJw]`NkYbNcY`QcfK|kG{}A|~@y}@lj@yf@zVgYvPsMbHyMlGcOfGiOzFkN|EeNzEsNrE_OjE_NjDqOrD{NdDozDzy@s~MzvC}aCzg@}lE``Am_JdnB}{Kr`Cqq@bPytJdpB_gHp}AalElbAkvGfxAk_BbXqxHpeBgcDrs@wmB`b@g{EzeAqiA|U\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 183 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 183 miles.\",\"distanceAlongGeometry\":294145.156},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Take exit 4 o3B.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Take exit 4 o3B.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Take exit 4 o3B.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Take exit 4 o3B.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Take exit 4 o3B onto California 1 52 West toward Gilroy, Hollister.</prosody></amazon:effect></speak>\",\"announcement\":\"Take exit 4 o3B onto California 1 52 West toward Gilroy, Hollister.\",\"distanceAlongGeometry\":276.222}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,350],\"duration\":54.25,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":50.172,\"geometry_index\":1534,\"location\":[-118.951422,35.006166]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,316],\"duration\":9.02,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.569,\"geometry_index\":1553,\"location\":[-118.954517,35.017759]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,315],\"duration\":173.756,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":160.724,\"geometry_index\":1554,\"location\":[-118.956226,35.01919]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,319],\"duration\":34.302,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.865,\"geometry_index\":1568,\"location\":[-118.995428,35.056093]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.00197,35.062213],\"geometry_index\":1569,\"admin_index\":0,\"weight\":111.2,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":123.007,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":31.135,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":28.015,\"geometry_index\":1576,\"location\":[-119.033099,35.091304]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":333.265,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":299.932,\"geometry_index\":1577,\"location\":[-119.039277,35.097097]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,318],\"duration\":43.896,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":39.5,\"geometry_index\":1587,\"location\":[-119.106053,35.157581]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,318],\"duration\":68.662,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":61.79,\"geometry_index\":1588,\"location\":[-119.114496,35.165218]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,318],\"duration\":3.786,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.407,\"geometry_index\":1591,\"location\":[-119.130362,35.179587]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,317],\"duration\":136.029,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":119.025,\"geometry_index\":1592,\"location\":[-119.131114,35.180261]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,318],\"duration\":34.55,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.214,\"geometry_index\":1597,\"location\":[-119.15829,35.205025]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.165065,35.2114],\"geometry_index\":1600,\"admin_index\":0,\"weight\":259.177,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":295.638,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":22.77,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":19.917,\"geometry_index\":1614,\"location\":[-119.219535,35.26265]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.223937,35.266748],\"geometry_index\":1615,\"admin_index\":0,\"weight\":15.266,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":16.882,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.227205,35.269789],\"geometry_index\":1617,\"admin_index\":0,\"weight\":99.758,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":113.446,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":42.907,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":38.61,\"geometry_index\":1622,\"location\":[-119.24856,35.289892]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.25688,35.2976],\"geometry_index\":1624,\"admin_index\":0,\"weight\":22.952,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":25.686,\"bearings\":[139,314],\"out\":1,\"in\":0,\"turn_duration\":0.026,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[134,312],\"duration\":4.97,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.348,\"geometry_index\":1626,\"location\":[-119.262176,35.301784]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,314],\"duration\":314.579,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":275.256,\"geometry_index\":1627,\"location\":[-119.263221,35.302546]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":41.107,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":36.99,\"geometry_index\":1636,\"location\":[-119.330857,35.35152]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.339968,35.357984],\"geometry_index\":1637,\"admin_index\":0,\"weight\":230.743,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":255.832,\"bearings\":[131,311],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,311],\"duration\":3.99,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.574,\"geometry_index\":1647,\"location\":[-119.39644,35.398428]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,313],\"duration\":14.547,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.092,\"geometry_index\":1648,\"location\":[-119.397326,35.399061]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.400536,35.401472],\"geometry_index\":1651,\"admin_index\":0,\"weight\":75.152,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":82.955,\"bearings\":[133,312],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,312],\"duration\":29.707,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.473,\"geometry_index\":1654,\"location\":[-119.419052,35.415029]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.425835,35.419971],\"geometry_index\":1655,\"admin_index\":0,\"weight\":106.967,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":118.304,\"bearings\":[132,312],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,312],\"duration\":114.546,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":103.085,\"geometry_index\":1657,\"location\":[-119.452831,35.439649]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,312],\"duration\":223.737,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":201.356,\"geometry_index\":1662,\"location\":[-119.478497,35.458283]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,319],\"duration\":33.273,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.77,\"geometry_index\":1667,\"location\":[-119.530561,35.49629]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":498.29,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":448.454,\"geometry_index\":1669,\"location\":[-119.537298,35.502526]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":8.496,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.646,\"geometry_index\":1682,\"location\":[-119.638597,35.59886]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":55.249,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":49.724,\"geometry_index\":1683,\"location\":[-119.640187,35.600535]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,330],\"duration\":39.725,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":36.738,\"geometry_index\":1687,\"location\":[-119.649614,35.61164]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.655373,35.619469],\"geometry_index\":1690,\"admin_index\":0,\"weight\":415.659,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":448.828,\"bearings\":[149,329],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":33.001,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.52,\"geometry_index\":1698,\"location\":[-119.735986,35.727761]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":832.02,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":769.611,\"geometry_index\":1699,\"location\":[-119.741062,35.734607]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,320],\"duration\":147.748,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":132.956,\"geometry_index\":1736,\"location\":[-119.87684,35.900394]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":25.928,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.68,\"geometry_index\":1752,\"location\":[-119.909371,35.932181]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,323],\"duration\":135.345,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":118.408,\"geometry_index\":1760,\"location\":[-119.914451,35.937173]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":3.08,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.695,\"geometry_index\":1766,\"location\":[-119.941099,35.963155]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,321],\"duration\":78.686,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":70.817,\"geometry_index\":1767,\"location\":[-119.941695,35.963725]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,319],\"duration\":15.913,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.11,\"geometry_index\":1773,\"location\":[-119.956852,35.978553]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,322],\"duration\":3.674,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.49,\"geometry_index\":1775,\"location\":[-119.959989,35.981498]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,320],\"duration\":22.702,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.567,\"geometry_index\":1776,\"location\":[-119.960674,35.982195]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.96496,35.986532],\"geometry_index\":1779,\"admin_index\":0,\"weight\":510.284,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":551.126,\"bearings\":[142,324],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[127,307],\"duration\":28.696,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":25.821,\"geometry_index\":1821,\"location\":[-120.098461,36.074854]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.105103,36.079352],\"geometry_index\":1828,\"admin_index\":0,\"weight\":32.78,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":34.905,\"bearings\":[138,318],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,322],\"duration\":29.729,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":26.738,\"geometry_index\":1831,\"location\":[-120.111459,36.086163]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.116872,36.092051],\"geometry_index\":1833,\"admin_index\":0,\"weight\":6.832,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":7.244,\"bearings\":[143,324],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,323],\"duration\":1.727,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.511,\"geometry_index\":1834,\"location\":[-120.118158,36.093486]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,323],\"duration\":202.335,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":177.043,\"geometry_index\":1835,\"location\":[-120.118475,36.093823]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,324],\"duration\":18.08,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.813,\"geometry_index\":1839,\"location\":[-120.154856,36.133629]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.15814,36.137224],\"geometry_index\":1840,\"admin_index\":0,\"weight\":130.968,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":149.113,\"bearings\":[144,324],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,325],\"duration\":2.976,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.604,\"geometry_index\":1842,\"location\":[-120.184975,36.166549]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,323],\"duration\":46.91,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":41.047,\"geometry_index\":1843,\"location\":[-120.185498,36.167145]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,324],\"duration\":2.932,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.565,\"geometry_index\":1844,\"location\":[-120.193974,36.176353]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,323],\"duration\":20.808,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":18.207,\"geometry_index\":1845,\"location\":[-120.194487,36.176927]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,332],\"duration\":1.947,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.703,\"geometry_index\":1849,\"location\":[-120.197819,36.181358]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,333],\"duration\":222.012,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":194.261,\"geometry_index\":1850,\"location\":[-120.198099,36.181775]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,334],\"duration\":2.227,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.948,\"geometry_index\":1855,\"location\":[-120.229166,36.23118]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,333],\"duration\":80.932,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":70.815,\"geometry_index\":1856,\"location\":[-120.229464,36.231663]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,332],\"duration\":23.162,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.828,\"geometry_index\":1859,\"location\":[-120.24148,36.250751]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.244671,36.255792],\"geometry_index\":1861,\"admin_index\":0,\"weight\":9.294,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":9.779,\"bearings\":[153,333],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.246003,36.257931],\"geometry_index\":1862,\"admin_index\":0,\"weight\":139.589,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":154.55,\"bearings\":[153,333],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,333],\"duration\":26.714,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.035,\"geometry_index\":1866,\"location\":[-120.26727,36.29161]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.270941,36.297432],\"geometry_index\":1869,\"admin_index\":0,\"weight\":241.218,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":275.125,\"bearings\":[153,332],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,322],\"duration\":1.8,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.575,\"geometry_index\":1884,\"location\":[-120.31928,36.352243]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,324],\"duration\":218.7,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":191.362,\"geometry_index\":1885,\"location\":[-120.319607,36.352586]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,325],\"duration\":1.721,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.505,\"geometry_index\":1892,\"location\":[-120.360781,36.398653]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,324],\"duration\":96.264,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":84.231,\"geometry_index\":1893,\"location\":[-120.361129,36.399052]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,323],\"duration\":2.25,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.969,\"geometry_index\":1896,\"location\":[-120.378544,36.418562]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,324],\"duration\":74.094,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":64.832,\"geometry_index\":1897,\"location\":[-120.378953,36.418994]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,323],\"duration\":22.633,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":19.786,\"geometry_index\":1899,\"location\":[-120.39208,36.433713]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.39607,36.438081],\"geometry_index\":1901,\"admin_index\":0,\"weight\":166.364,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":195.141,\"bearings\":[144,324],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,325],\"duration\":2.325,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.977,\"geometry_index\":1914,\"location\":[-120.433244,36.478334]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,325],\"duration\":10.35,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.798,\"geometry_index\":1915,\"location\":[-120.433709,36.478872]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,325],\"duration\":86.182,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":73.249,\"geometry_index\":1916,\"location\":[-120.435471,36.480909]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,321],\"duration\":1.93,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.688,\"geometry_index\":1923,\"location\":[-120.450587,36.497579]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":169.386,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":148.212,\"geometry_index\":1924,\"location\":[-120.450958,36.497943]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":24.51,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.052,\"geometry_index\":1931,\"location\":[-120.484766,36.528563]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":386.37,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":347.727,\"geometry_index\":1933,\"location\":[-120.49018,36.532684]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":1.47,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.322,\"geometry_index\":1946,\"location\":[-120.574117,36.596092]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":29.564,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":26.608,\"geometry_index\":1947,\"location\":[-120.574446,36.59634]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":22.882,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.587,\"geometry_index\":1949,\"location\":[-120.581997,36.602059]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,312],\"duration\":162.228,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":141.942,\"geometry_index\":1953,\"location\":[-120.587872,36.606459]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":33.142,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":28.993,\"geometry_index\":1964,\"location\":[-120.620048,36.636178]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":30.864,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27,\"geometry_index\":1965,\"location\":[-120.625348,36.643073]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":11.094,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.707,\"geometry_index\":1966,\"location\":[-120.630276,36.6495]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":3.27,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.86,\"geometry_index\":1967,\"location\":[-120.63205,36.651813]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,329],\"duration\":149.657,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":130.95,\"geometry_index\":1968,\"location\":[-120.632577,36.652496]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,328],\"duration\":3.583,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.118,\"geometry_index\":1975,\"location\":[-120.656471,36.683678]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":16.291,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.255,\"geometry_index\":1976,\"location\":[-120.657044,36.684426]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,327],\"duration\":403.801,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":353.31,\"geometry_index\":1977,\"location\":[-120.659668,36.687852]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":27.345,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.604,\"geometry_index\":1989,\"location\":[-120.721477,36.774401]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":112.867,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":98.753,\"geometry_index\":1990,\"location\":[-120.725455,36.780126]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":1.983,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.735,\"geometry_index\":1991,\"location\":[-120.742397,36.804808]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":194.657,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":170.325,\"geometry_index\":1992,\"location\":[-120.742689,36.805237]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":25.133,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.613,\"geometry_index\":1993,\"location\":[-120.77136,36.846943]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":15.261,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.729,\"geometry_index\":1994,\"location\":[-120.775032,36.852267]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,330],\"duration\":23.604,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.244,\"geometry_index\":1995,\"location\":[-120.77726,36.855497]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":31.146,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.246,\"geometry_index\":1999,\"location\":[-120.780715,36.860501]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.785235,36.867115],\"geometry_index\":2000,\"admin_index\":0,\"weight\":67.71,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":76.818,\"bearings\":[151,331],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":24.889,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.771,\"geometry_index\":2005,\"location\":[-120.796924,36.884062]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,325],\"duration\":5.225,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.571,\"geometry_index\":2009,\"location\":[-120.801348,36.890117]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,323],\"duration\":1.139,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.996,\"geometry_index\":2010,\"location\":[-120.80242,36.891319]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,325],\"duration\":89.412,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":78.235,\"geometry_index\":2011,\"location\":[-120.802633,36.891543]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,325],\"duration\":37.696,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":32.979,\"geometry_index\":2018,\"location\":[-120.818261,36.909483]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":23.158,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.245,\"geometry_index\":2023,\"location\":[-120.825544,36.916602]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,321],\"duration\":38.91,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":35.012,\"geometry_index\":2025,\"location\":[-120.830285,36.920645]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,319],\"duration\":22.537,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.267,\"geometry_index\":2028,\"location\":[-120.837799,36.928022]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.842402,36.93212],\"geometry_index\":2031,\"admin_index\":0,\"weight\":125.637,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":139.062,\"bearings\":[136,316],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,317],\"duration\":5.187,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.662,\"geometry_index\":2043,\"location\":[-120.872115,36.956447]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,315],\"duration\":1.727,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.554,\"geometry_index\":2045,\"location\":[-120.873204,36.957369]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,316],\"duration\":287.676,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":251.717,\"geometry_index\":2046,\"location\":[-120.87358,36.957667]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,322],\"duration\":1.249,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.093,\"geometry_index\":2092,\"location\":[-120.928514,37.01429]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":49.284,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":43.124,\"geometry_index\":2093,\"location\":[-120.928749,37.01453]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":14.121,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.349,\"geometry_index\":2103,\"location\":[-120.939377,37.02554]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,324],\"duration\":1.559,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.364,\"geometry_index\":2106,\"location\":[-120.942435,37.028685]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,322],\"duration\":43.801,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":38.325,\"geometry_index\":2107,\"location\":[-120.942709,37.028987]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":50.82,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":44.461,\"geometry_index\":2115,\"location\":[-120.950748,37.037288]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,320],\"duration\":1.439,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.296,\"geometry_index\":2120,\"location\":[-120.960094,37.046906]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,323],\"duration\":33.242,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":29.918,\"geometry_index\":2121,\"location\":[-120.960368,37.047165]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,322],\"duration\":15.582,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.005,\"geometry_index\":2124,\"location\":[-120.966304,37.053353]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.969088,37.056197],\"geometry_index\":2125,\"admin_index\":0,\"weight\":1.531,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":1.164,\"bearings\":[142,321],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"bearings\":[141,324],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":2126,\"location\":[-120.969287,37.056395]}],\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Gilroy\"},{\"type\":\"text\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Hollister\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Gilroy / Hollister\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"403B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-152\",\"type\":\"icon\",\"text\":\"CA 152\"},{\"type\":\"text\",\"text\":\"West\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Exit 403B CA 152 West\"},\"distanceAlongGeometry\":294182.812}],\"destinations\":\"I 5 North\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to stay on I 5 North.\",\"modifier\":\"slight right\",\"bearing_after\":350,\"bearing_before\":346,\"location\":[-118.951422,35.006166]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":9035.988,\"duration_typical\":10106.535,\"duration\":10602.092,\"distance\":294182.812,\"driving_side\":\"right\",\"weight\":9479.526,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"klrwaAz~e{aFaoAnPkt@`Hga@zEiR`@}b@Sac@qBqb@MocA}Aka@X}q@nEea@hFi`@nIu_@fKe_@pM_^jQa]tS{[~UsZdXgYhZmxAxiB_fDtmEwcHpaJ{eEvpF_aBvuB}@jAsp@n{@qq@hy@k~@|bAu_Aj~@ubCxvBodLfdKw}JfjJ{oEj|EymDduDo}JzwKatJllKykNvrOqGbHcRhSgtHhhIouK`oL{oEp`FaiJbaKsdAfiAkiN||OobK|iLynPdgRwdKnnL}aKdlLkkLxyMeaJddKmfMd|NgaGhwGi|MtnOqgOp_Qm@r@awJl|Kci@~m@uiE~dFeaIfaJ_zFbvGmfGzaHm{Nf_Psq@rw@_aG~lGyxAx_BozDfiE_jI||IqhF|yFsJnKezFfhGarFh`GyrHjfIsjF|wFmrG`bHae@lj@gzEfjFofG|sGe_IbwIi|G`jHc_GbrGuGhHktD|aEmvCr`DklGj}GuyF|lGyhGxvGc~H|oIylDtyD}rHhlIoxBjyC_kCroDsn@h`AazKnmOsjJpaN}}I|jNoAnBueL`qQy|HdaMgaMpvRsuHlxLknLn|Q_sKlxP{eFvgI}iJz~NygJ`|NeCzDcoKpmPkfJroNg}EprHihErxGycHzpKa|At~Bqf@jv@m|@fqAyq@xbAme@pq@g_DtxE}`E|lGclNr|S{sH|fLoRxYkyd@l{r@o_ChoDcfAhaBgrHtgL}iHrxKyeJdnNujv@ngkAceMrrRam@b{@ef@ll@k_AhoAozEhkFgiDvwD{lAzrAslHhgIczFxqG{tQthSkrLfwMkuDbiEop]zc`@efU~gW}zU~yW{xBprBcjYxhXgzMbfMwxHvqHugBjbB}lHn|GydAny@g~@hp@abGzbE_bBhfAcgHzyEe}AvdAca\\\\pqT_km@fqa@}vYfyRgpz@dmk@}VzPebJdhGsvTtbOeeOhaK{jLf|H}~F~~Diil@fz`@oub@vrYw_RlfMearAva}@_~EbrDmvDhrCqhC`oBwhCtmB{fCfmBekIloGeo@bj@{xFhmFoeFttE{xG`mGkbBxzAklCxbCa|F~pFayAjtA}rDthDcmAbkAsrAbmAuaCb}BksFzdFksB|lBoUfTumChjCig@jh@ox@py@az@jy@u`AzbAqaFpfF_]t]q^h^epArrAmz@~|@gs@`t@iZxZav@`w@is@vu@_w@`v@upAzsAacBhiBiAlAy{Dj~DgcBndBifBvfBw|A|~AukDjoDewCd{CweItlIqyEd_Fs~FzeGmbAbdAi`@~_@g^p^y`@h_@{m@dq@}g@di@kh@lj@_PtNkV~TaWrU{jDbuDunJdwJcbGtiGwhWzzWsb@fd@aoAxmAusCryCaxBzzBozDh_EkfC`gCa}FrdGaiA`oA_mB~rBqj@xi@iuArxAmmAhkAiiB|dBscBtxA_rAljAk_Cx_Ce_D~uCayAfvAq`DlxC_aBd{AshCldCcmAjfAcdB|fBm{AbrBsaAnaBa~ClxFim@`gAwyB`~DelD~jG}tHv~MuhDzfG}zB|~D{v@dvAo~CvtFs{AheDqv@fbB}z@nkB}Or]_z@riBmxC|uGybD`jH{wDrmI{lD~_I}eD|oHuuDlrHkeF~~JysCnvFqyFr}KkeCb}EwgExkIquCbzFquCfyFodDjoGoaCxrEm]rq@w{BnnEg[jj@o[~f@a^zh@yPrUiVr\\\\mZb]wg@rk@esDfgDwkEjwDyWrVevItyHuxAjoAaTxRkkLhiKylNj`MqqDnaDcjj@rrf@u_FflEo~EpkEihq@r_m@gd@t_@o~PvpO{b@`_@{_A|z@_y@rm@qaAzn@ovAxt@aYnP_kZndP{{LxtG_hMn_HwcMj}GexYnzOe]rQy`OzdIiB`A{bT`fL{hAfp@epFduCudCfrAuj^|xRy~BhnAyfSnzKsdIlkE}tGxlDkh@bZqk@n[ubCztAac@tXw|@fo@og@~`@i~FvxEmzCreCqqIzaHw}CxjCyFzEkwHt}Ga}JdnJioLzcKkoLx}JkaIz~GieJ~bImTlSavP~uNmpOxyMsoD``DsbKdsI}zOdbNidM`wKe`F`jE}WvTkrR|pPetMn_LyyB~lB_ZpX}lMp{K_iMzvKccBl}A{kD|yCqkEhvDi~Hl}GwoG|uFqE|DulGbzFaqFthFyGpGiwG~kGeqHbbHgeEp|DatAhlA{dHz~Fk[nWs`@`\\\\i~BbmBisCf_CycQ~sN}iCbbCgaAxdAyy@h}@sb@ve@cLnLwUdVmoOp{OgrLh_M_uGn_HyxBh{BwrBzfC_kH~kKoeClqDeoAjhBkpD~gFie@`r@kfCptDmc@do@ouBj{Cm`Ex}FqgCzrDwpBxtC}rC|cE}aCvjDmx`@jwk@_~ChpEqjClwDwzn@pl~@oNpSsAnByaJlsMkiAnbB}m@x~@GHmxCpjEaOzToWj`@}fHzgKmcIplLgqDzlFeoBdqCklAjwAaoAfqAqaBbpAwsFhzDitKduH}mLfjIupK~rHqoCzmBui@|_@cnMv`JicBllA}nA`~@udDh|BqvQnjMotNh`Kwe@~[wm@xb@cuE~bDs[`VmvDhnCu_HzyEmdIxyFm|AxfAgxFf_E}jNt{JioKtaHgmeAdgo@eMvHgkH`oEojWppOydJrwFseo@za`@yYfQsmpA|~v@wkIndF{hEfjCew@bg@}mBxjA{eAdp@wiAxq@k|KnyGafNtnIeuHjvEo@`@wdD`pBu}Aj`Aq|BtuAs_Atl@}fAns@isBrzAcjA~aA_MhLulF`mEqpCp_CarCz~Bg~CtiCmbDxlCyeDnqCmdBfvAsn@`h@gwAjmAsrAvkAkbBnhBa}BnxCqcEnkFcw@xz@}iEjnEe_DnaD}`BvbBqcCfpC}nAzxAsj@ps@ev@raAg}BvuCk`CvaDwkCzgDodCxbDg`Cx~CgnCvlDmrCvsDw`C|}CevC`vDukCplDy|AjqBa@f@qw@xaAsQnVmxAnlBoX~^}jAjyAifDlmEcSrU}aBxxBwo@j{@}~Bb{Cev@haAwWpYeUfVg]f^yHbIke@ld@uYxW{|BhmBapBfcBo{@rr@kaAd{@spCz|BspAxfAmsA`hA{uDd_DsuBbcBe{C`kCucB`uA{VvS}SlQ_f@hc@}wApjAsnAndAqmCz{Bmr@xl@{JfJ{}BrnB{k@xf@e}@rx@chBbdBumCvgC_`Aj~@ud@|d@{ZpZydAz`Ai`Bf}Aa_Ab}@ckCfeC_NtMu|A`zAovBprBqt@tr@WTolDtfDee@ld@ciArfAyY~Vi@d@uiBhfBo[rZoeCrbCq`@z^{QbPsaB~~AegAjdAcpArnAg{A~uAaSbSs}@n|@aaAb~@{XtXepAloAqnDxeDmpA|lAunBxlBgvCbtCeObPalD|dDqcBf`BcpBxjBwpD~lDkKlK_EnD\"},{\"ref\":\"CA 152\",\"mode\":\"driving\",\"weight\":1432.557,\"distance\":46584.988,\"geometry\":\"u}vteA|hkveFoIlCgSfLoFdDqEdAmE?{Dq@uCoBcCeCmAoCkAgEg@uFCkEj@kEv@eD`BoDzBqCtCeB|CiArDOxCR`DjAbDdCfCzDjB`H|C|b@G~]cAdiFcC|hQoBbiXOfjCQf|EWdtQb@nrG?x`@a@tbCPdxAGrtBMpwEAjxAQpmBLhgL{@vvGUzj@WzPs@hTyG|fAgMpgBmu@ncKaIv_A{Gtn@sAbJu@pGyF|ZiOnr@{H`Y_Sxl@oM|\\\\uk@hnAiZxn@cc@z{@aZjj@o\\\\rs@i_@vt@yg@hfAoKtS}c@|}@us@xxAe]~s@wh@peAwWdj@aj@~gAcaAfpBgm@joAuMdXibAzpBeIfPoE|I_|@hhBgbAbpBqfAjyBcaAdoBsS`d@{Zjn@gMdWg}CpnGcf@raAav@z|A}Tjd@si@hhA{v@j_BuNf[uCnHsCbI_FnQuAdGkEfXw@bGsCrXef@nhGkCzTyHtg@oLbt@oOdz@kEjUgDpP}DrSsHpe@{Gtd@}_@~yBsOxz@oL`s@_SvmA}CvNuDpOwClJsErLoKpTsPn[s}@xiBk@jA{JxQmHhNo|@pbB}FnJmTd\\\\uHdJsIpIkIjHsO|Iw_B|cAew@jb@_eApq@cdAjo@mFzC{[|Peb@|Pa`Bxd@_eBrf@qt@tT}TzHkInE}MtHyGtEeQ`OoH~GaKjLeFlHaPrX_t@daBqI`SkQla@iYzo@cRhc@sNx`@aFbVqBzLyCnSeAlMmAxVUvNEhOJ~Lh@zPr@xMdBxQbCxQbBtIdEtS`_@dtAhsA~xEdnBr_Hj}AbtF`j@rnBtq@l_Czn@j{BdHjT~E~MhD~HlJbRvKjQlHnJbEnEhNhMff@~_@lmBd|A~MnKrjFfhEzWbTlEvDjKbLlQpUfKpPfLxQhKpPzLdVpKfWhK|[vJt]rE~TvDjSzC~SlBlPhBxQ~@lObAdQ\\\\dJ~@f^Htk@c@`UStLc@`JmAfT}QhyCqAbW_Bt^uIbgBUlQFxRXxUTpJj@dMhAbSdAbO~BxUhC`TvGja@dH~^~D`Tz{@|zEtMbt@xQ~bAzCjOxF`_@vBhP`AdLx@`O`@pNDnPQbc@mCpkDuA`|@k@h}@@vLN~Kf@rNj@hKz@fLxAdMpAnIvFhZvB`InFvPxD`NtEjNxG~NjPf[bFtHtVh[tu@~t@~u@tt@fy@zv@rl@hj@ddAr`ApQxUpQ`^tJtSfLz]rDdPjCzNdChOrB~S~A~X^lJz@deAr@r_Ar@~qAPrf@\\\\xVfAjRr@|JpDhZvBzNbE`UvDlOjChJnEfMrMrYhHhMxGpK`NvRrLvNzGjGtQ`O|IhGhHhEvMtGjj@xT~iA|`@nuAnh@jMjEbo@hSfm@fQzYlNfUbPhVzVdK|MbUd`@dQlg@nCbM|\\\\`yBp_@v_CzHbi@jl@hyDxQpuAlNj~@zMxt@nKrd@h_@hiAfs@bsBbgIxeUzcA`hChqDtnHvVhq@xHt\\\\hGn\\\\~[t~CxKxo@dP`m@xMn]xRl`@ra@`n@vw@bfAfc@jg@v`@na@h\\\\~XhkD~xBnc@j`@bPnThLzVlJpVdHzXxDrWjAjVpApk@uC~h@wh@leEaCpUkAlZDr_@hAfTlCbZ|Sl{ArBvU`AxMh@rXm@lVeEhj@{Kzi@eVr~@uPhr@cNtk@kKzk@sFhk@gOpeCgRt_DL|^~@tl@~Dfj@lHbj@hHn^dCpIfLl^fNt_@vk@`hAjb@~s@dLtPpZnb@tT|Sp^tUhRjLdaDdpBb]`TnYdSl`@ri@nLzTxLn\\\\jIp\\\\zFr^rBdX~@|[]f[oBrX_Wz~CLvu@xBte@~q@`jGlYdqCtVr|Atd@xwBhGdSdLbe@nP~z@ld@|{BdVxuAne@haDzObu@vXthAvP`o@b\\\\fjAbF~N|Nv]lXfd@h\\\\x^~kBfxApy@tl@xf@fVzShHhg@vKjy@nI|fAzFlb@hIre@fPvf@lYtV`T|rBvoCX`@~bAjvAnjAp`BtR|XbyBvxC~Wx]lbBr|B~Vr^rVjo@zR`s@bHv]bGbg@~G`s@~Dff@dTp~BtEvs@rIb|@nPlrAbSvlAxcA`oF~Ipe@nf@zhChYd}AtSt~@tQbj@xeAr{Cfl@bdBlPlf@~Vlv@bV`j@`_@xv@~j@|{@po@jt@`l@rk@pWlWluEztExRnTdQlUpNlT~~@p_BhOxVzObUtPnShR~R|QdPjwE`sDjyBzdBrSxOpRjMxRvKpRlJtTjIpTjGrUdF`VtD|XtCdX`AzWHtW_AbXuBtWuDjWwFt\\\\_JpYmJ~mA{^fYwJfYuL~YyOvuAkx@~I_Fbf@iTlXkHdXaFtTiBvUaAnUTfUtAxVnCxbAfO|fAxObqBlY`x@rJ\",\"duration\":1639.643,\"driving_side\":\"right\",\"duration_typical\":1678.725,\"weight_typical\":1467.99,\"name\":\"\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"off ramp\",\"instruction\":\"Take exit 403B onto CA 152 West toward Gilroy/Hollister/San Jose.\",\"modifier\":\"slight right\",\"bearing_after\":340,\"bearing_before\":324,\"location\":[-120.969375,37.056491]},\"speedLimitUnit\":\"mph\",\"destinations\":\"CA 152 West: Gilroy, Hollister, San Jose\",\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-152\",\"type\":\"icon\",\"text\":\"CA 152\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"CA 152\"},\"distanceAlongGeometry\":46584.988}],\"exits\":\"403B\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 29 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 29 miles.\",\"distanceAlongGeometry\":46571.656},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Keep right to stay on California 1 52.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Keep right to stay on California 1 52.\",\"distanceAlongGeometry\":1609.344},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to stay on California 1 52.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to stay on California 1 52.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to stay on California 1 52.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to stay on California 1 52.\",\"distanceAlongGeometry\":178}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[144,340],\"duration\":5.289,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"trunk_link\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.741,\"geometry_index\":2127,\"location\":[-120.969375,37.056491]},{\"entry\":[false,true],\"in\":0,\"bearings\":[152,336],\"duration\":28.594,\"mapbox_streets_v8\":{\"class\":\"trunk_link\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":25.734,\"geometry_index\":2129,\"location\":[-120.969658,37.056983]},{\"entry\":[false,true],\"in\":0,\"bearings\":[80,271],\"duration\":2.154,\"turn_weight\":7,\"turn_duration\":0.014,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.927,\"geometry_index\":2152,\"location\":[-120.969718,37.056799]},{\"entry\":[false,true],\"in\":0,\"bearings\":[91,271],\"duration\":13.34,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.988,\"geometry_index\":2153,\"location\":[-120.970214,37.056803]},{\"entry\":[false,true],\"in\":0,\"bearings\":[91,271],\"duration\":80.176,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":70.636,\"geometry_index\":2154,\"location\":[-120.973961,37.056837]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":42.729,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.382,\"geometry_index\":2157,\"location\":[-120.998526,37.056967]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":14.406,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.6,\"geometry_index\":2159,\"location\":[-121.011621,37.056988]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":1.764,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.543,\"geometry_index\":2160,\"location\":[-121.016029,37.05697]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,271],\"duration\":17.67,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.461,\"geometry_index\":2161,\"location\":[-121.01657,37.05697]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":88.375,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":77.822,\"geometry_index\":2164,\"location\":[-121.021986,37.056982]},{\"entry\":[false,true],\"in\":0,\"bearings\":[125,306],\"duration\":2.363,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.067,\"geometry_index\":2185,\"location\":[-121.056567,37.060494]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,307],\"duration\":35.037,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.65,\"geometry_index\":2186,\"location\":[-121.057332,37.060931]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,306],\"duration\":7.023,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.146,\"geometry_index\":2198,\"location\":[-121.068454,37.067454]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,306],\"duration\":14.436,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.63,\"geometry_index\":2199,\"location\":[-121.070266,37.068512]},{\"entry\":[false,true],\"in\":0,\"bearings\":[127,307],\"duration\":66.104,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":57.834,\"geometry_index\":2203,\"location\":[-121.074053,37.070727]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,306],\"duration\":32.111,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.295,\"geometry_index\":2215,\"location\":[-121.090725,37.08048]},{\"entry\":[false,true],\"in\":0,\"bearings\":[100,284],\"duration\":6.191,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.264,\"geometry_index\":2226,\"location\":[-121.099825,37.083442]},{\"entry\":[false,true],\"in\":0,\"bearings\":[108,289],\"duration\":8.75,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.432,\"geometry_index\":2229,\"location\":[-121.101676,37.083885]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,286],\"duration\":95.105,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":80.84,\"geometry_index\":2234,\"location\":[-121.104209,37.084584]},{\"entry\":[false,true],\"in\":0,\"bearings\":[154,333],\"duration\":1.08,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.918,\"geometry_index\":2268,\"location\":[-121.122511,37.100841]},{\"entry\":[false,true],\"in\":0,\"bearings\":[153,328],\"duration\":158.551,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.026,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":134.745,\"geometry_index\":2269,\"location\":[-121.122666,37.10108]},{\"entry\":[false,true],\"in\":0,\"bearings\":[97,277],\"duration\":26.41,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.109,\"geometry_index\":2342,\"location\":[-121.170282,37.08707]},{\"entry\":[false,true],\"in\":0,\"bearings\":[71,251],\"duration\":2.482,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.173,\"geometry_index\":2356,\"location\":[-121.179537,37.08564]},{\"entry\":[false,true],\"in\":0,\"bearings\":[71,251],\"duration\":122.793,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":107.438,\"geometry_index\":2357,\"location\":[-121.180387,37.085405]},{\"entry\":[false,true],\"in\":0,\"bearings\":[39,224],\"duration\":5.078,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.443,\"geometry_index\":2432,\"location\":[-121.212859,37.068613]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,249],\"duration\":6.525,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.709,\"geometry_index\":2435,\"location\":[-121.214276,37.067773]},{\"entry\":[false,true],\"in\":0,\"bearings\":[73,252],\"duration\":6.172,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.4,\"geometry_index\":2437,\"location\":[-121.216455,37.067222]},{\"entry\":[false,true],\"in\":0,\"bearings\":[72,254],\"duration\":1.992,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.744,\"geometry_index\":2438,\"location\":[-121.218515,37.066701]},{\"entry\":[false,true],\"in\":0,\"bearings\":[74,253],\"duration\":13.488,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.783,\"geometry_index\":2439,\"location\":[-121.219189,37.066543]},{\"entry\":[false,true],\"in\":0,\"bearings\":[75,253],\"duration\":3.244,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.82,\"geometry_index\":2441,\"location\":[-121.223555,37.065516]},{\"entry\":[false,true],\"in\":0,\"bearings\":[73,251],\"duration\":4.766,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.17,\"geometry_index\":2442,\"location\":[-121.224569,37.065269]},{\"entry\":[false,true],\"in\":0,\"bearings\":[67,241],\"duration\":12.16,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.03,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.614,\"geometry_index\":2444,\"location\":[-121.226032,37.064831]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,240],\"duration\":89.48,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":76.541,\"geometry_index\":2446,\"location\":[-121.229079,37.063478]},{\"entry\":[false,true],\"in\":0,\"bearings\":[65,239],\"duration\":83.943,\"turn_duration\":0.028,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":71.328,\"geometry_index\":2455,\"location\":[-121.253329,37.052659]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,293],\"duration\":2.844,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.488,\"geometry_index\":2486,\"location\":[-121.274546,37.045711]},{\"entry\":[false,true],\"in\":0,\"bearings\":[113,293],\"duration\":2.484,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.174,\"geometry_index\":2487,\"location\":[-121.275367,37.045994]},{\"entry\":[false,true],\"in\":0,\"bearings\":[113,289],\"duration\":2.236,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.936,\"geometry_index\":2488,\"location\":[-121.276082,37.046236]},{\"entry\":[false,true],\"in\":0,\"bearings\":[109,282],\"duration\":16.15,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.131,\"geometry_index\":2489,\"location\":[-121.2768,37.046434]},{\"entry\":[false,true],\"in\":0,\"bearings\":[99,269],\"duration\":8.207,\"turn_duration\":0.038,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.148,\"geometry_index\":2492,\"location\":[-121.282233,37.047124]},{\"entry\":[false,true],\"in\":0,\"bearings\":[75,250],\"duration\":1.57,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.375,\"geometry_index\":2496,\"location\":[-121.284857,37.046838]},{\"entry\":[false,true],\"in\":0,\"bearings\":[70,243],\"duration\":12.834,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.229,\"geometry_index\":2497,\"location\":[-121.285361,37.046689]},{\"entry\":[false,true],\"in\":0,\"bearings\":[47,226],\"duration\":2.377,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.08,\"geometry_index\":2503,\"location\":[-121.288856,37.044673]},{\"entry\":[false,true],\"in\":0,\"bearings\":[46,218],\"duration\":3.945,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.453,\"geometry_index\":2504,\"location\":[-121.289424,37.044232]},{\"entry\":[false,true],\"in\":0,\"bearings\":[30,209],\"duration\":1.371,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.182,\"geometry_index\":2506,\"location\":[-121.290122,37.04338]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":11.457,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.025,\"geometry_index\":2507,\"location\":[-121.290336,37.043071]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":2.111,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.848,\"geometry_index\":2508,\"location\":[-121.292147,37.040476]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,211],\"duration\":67.719,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":59.246,\"geometry_index\":2509,\"location\":[-121.292484,37.039994]},{\"entry\":[false,true],\"in\":0,\"bearings\":[69,243],\"duration\":1.225,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.072,\"geometry_index\":2526,\"location\":[-121.311114,37.036382]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"in\":0,\"bearings\":[63,247],\"duration\":2.26,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.977,\"geometry_index\":2527,\"location\":[-121.311437,37.036249]},{\"entry\":[false,true],\"in\":0,\"bearings\":[67,250],\"duration\":3.352,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.926,\"geometry_index\":2528,\"location\":[-121.312047,37.036038]},{\"entry\":[false,true],\"in\":0,\"bearings\":[70,249],\"duration\":27.846,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.365,\"geometry_index\":2529,\"location\":[-121.313007,37.035758]},{\"entry\":[false,true],\"in\":0,\"bearings\":[66,245],\"duration\":2.756,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.41,\"geometry_index\":2534,\"location\":[-121.321037,37.03349]},{\"entry\":[false,true],\"in\":0,\"bearings\":[65,244],\"duration\":5.346,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.66,\"geometry_index\":2535,\"location\":[-121.321806,37.033206]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,237],\"duration\":1.891,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.654,\"geometry_index\":2537,\"location\":[-121.323266,37.032626]},{\"entry\":[false,true],\"in\":0,\"bearings\":[57,229],\"duration\":22.912,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.049,\"geometry_index\":2538,\"location\":[-121.323758,37.032371]},{\"entry\":[false,true],\"in\":0,\"bearings\":[20,194],\"duration\":42.883,\"turn_duration\":0.028,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.498,\"geometry_index\":2544,\"location\":[-121.327543,37.027843]},{\"entry\":[false,true],\"in\":0,\"bearings\":[46,226],\"duration\":1.766,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.545,\"geometry_index\":2555,\"location\":[-121.334534,37.018749]},{\"entry\":[false,true],\"in\":0,\"bearings\":[46,225],\"duration\":10.682,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.328,\"geometry_index\":2556,\"location\":[-121.334949,37.018434]},{\"entry\":[false,true],\"in\":0,\"bearings\":[45,225],\"duration\":2.232,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.953,\"geometry_index\":2557,\"location\":[-121.337409,37.01648]},{\"entry\":[false,true],\"in\":0,\"bearings\":[45,225],\"duration\":9.072,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.938,\"geometry_index\":2558,\"location\":[-121.337902,37.01608]},{\"entry\":[false,true],\"in\":0,\"bearings\":[45,226],\"duration\":2.232,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.953,\"geometry_index\":2559,\"location\":[-121.339912,37.014489]},{\"entry\":[false,true],\"in\":0,\"bearings\":[46,239],\"duration\":12.4,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.017,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.527,\"geometry_index\":2560,\"location\":[-121.340418,37.014105]},{\"entry\":[false,true],\"in\":0,\"bearings\":[78,259],\"duration\":2.072,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.762,\"geometry_index\":2565,\"location\":[-121.343992,37.012989]},{\"entry\":[false,true],\"in\":0,\"bearings\":[79,258],\"duration\":6.797,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.947,\"geometry_index\":2566,\"location\":[-121.34462,37.012893]},{\"entry\":[false,true],\"in\":0,\"bearings\":[78,261],\"duration\":2.791,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.443,\"geometry_index\":2567,\"location\":[-121.346661,37.012554]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,258],\"duration\":3.434,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.982,\"geometry_index\":2568,\"location\":[-121.347505,37.012447]},{\"entry\":[false,true],\"in\":0,\"bearings\":[78,255],\"duration\":23.055,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.174,\"geometry_index\":2569,\"location\":[-121.348483,37.012277]},{\"entry\":[false,true],\"in\":0,\"bearings\":[70,250],\"duration\":2.221,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.943,\"geometry_index\":2572,\"location\":[-121.354903,37.010574]},{\"entry\":[false,true],\"in\":0,\"bearings\":[70,250],\"duration\":36.75,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":32.15,\"geometry_index\":2573,\"location\":[-121.35552,37.010398]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,241],\"duration\":2.504,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.191,\"geometry_index\":2579,\"location\":[-121.365066,37.006858]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,242],\"duration\":23.33,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.406,\"geometry_index\":2580,\"location\":[-121.365697,37.006579]},{\"entry\":[false,true],\"in\":0,\"bearings\":[38,218],\"duration\":2.191,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.918,\"geometry_index\":2586,\"location\":[-121.370709,37.00311]},{\"entry\":[false,true],\"in\":0,\"bearings\":[38,219],\"duration\":57.922,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":50.674,\"geometry_index\":2587,\"location\":[-121.3711,37.002717]},{\"entry\":[false,true],\"in\":0,\"bearings\":[34,214],\"duration\":13.848,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.109,\"geometry_index\":2598,\"location\":[-121.381652,36.992517]},{\"entry\":[false,true],\"in\":0,\"bearings\":[30,207],\"duration\":1.531,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.34,\"geometry_index\":2601,\"location\":[-121.383781,36.989916]},{\"entry\":[false,true],\"in\":0,\"bearings\":[27,205],\"duration\":4.596,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.021,\"geometry_index\":2602,\"location\":[-121.383985,36.989599]},{\"entry\":[false,true],\"in\":0,\"bearings\":[17,194],\"duration\":1.592,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.393,\"geometry_index\":2605,\"location\":[-121.384468,36.988594]},{\"entry\":[false,true],\"in\":0,\"bearings\":[14,191],\"duration\":15.449,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.52,\"geometry_index\":2606,\"location\":[-121.384583,36.988232]},{\"entry\":[true,false],\"in\":1,\"bearings\":[161,344],\"duration\":21.049,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":18.396,\"geometry_index\":2615,\"location\":[-121.384305,36.98459]},{\"entry\":[true,false],\"in\":1,\"bearings\":[156,333],\"duration\":4.711,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":4.24,\"geometry_index\":2622,\"location\":[-121.381906,36.980065]},{\"entry\":[true,false],\"in\":1,\"bearings\":[167,344],\"duration\":1.699,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.009,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":1.521,\"geometry_index\":2624,\"location\":[-121.381415,36.979032]},{\"entry\":[true,false],\"in\":1,\"bearings\":[173,347],\"duration\":1.434,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":1.289,\"geometry_index\":2625,\"location\":[-121.381302,36.978629]},{\"entry\":[true,false],\"in\":1,\"bearings\":[176,353],\"duration\":15.318,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":13.787,\"geometry_index\":2626,\"location\":[-121.381249,36.978282]},{\"entry\":[false,true],\"in\":0,\"bearings\":[11,190],\"duration\":7.604,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.844,\"geometry_index\":2632,\"location\":[-121.381871,36.974585]},{\"bearings\":[10,189],\"entry\":[false,true],\"in\":0,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":2633,\"location\":[-121.382294,36.972759]}]},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 12 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 12 miles.\",\"distanceAlongGeometry\":19234.33},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Take the U.S. 1 o1 North ramp.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Take the U.S. 1 o1 North ramp.\",\"distanceAlongGeometry\":1609.344},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Take the U.S. 1 o1 North ramp.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Take the U.S. 1 o1 North ramp.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Take the U.S. 1 o1 North ramp toward San Jose.</prosody></amazon:effect></speak>\",\"announcement\":\"Take the U.S. 1 o1 North ramp toward San Jose.\",\"distanceAlongGeometry\":186.667}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[9,190],\"duration\":34.436,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.125,\"geometry_index\":2634,\"location\":[-121.38248,36.971846]},{\"entry\":[false,true],\"in\":0,\"bearings\":[65,245],\"duration\":6.801,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.945,\"geometry_index\":2650,\"location\":[-121.386757,36.967372]},{\"entry\":[false,true],\"in\":0,\"bearings\":[64,246],\"duration\":43.508,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":38.062,\"geometry_index\":2652,\"location\":[-121.388109,36.966848]},{\"entry\":[false,true],\"in\":0,\"bearings\":[47,229],\"duration\":6.215,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.438,\"geometry_index\":2666,\"location\":[-121.397677,36.961995]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,248],\"duration\":72.857,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":63.75,\"geometry_index\":2669,\"location\":[-121.39901,36.961252]},{\"entry\":[false,true],\"in\":0,\"bearings\":[121,302],\"duration\":7.379,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.449,\"geometry_index\":2695,\"location\":[-121.414045,36.969052]},{\"entry\":[false,true],\"in\":0,\"bearings\":[119,299],\"duration\":4.844,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.238,\"geometry_index\":2697,\"location\":[-121.415714,36.969829]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,297],\"duration\":8.377,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.312,\"geometry_index\":2699,\"location\":[-121.416826,36.970314]},{\"entry\":[false,true],\"in\":0,\"bearings\":[116,300],\"duration\":0.492,\"turn_weight\":0.5,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.922,\"geometry_index\":2701,\"location\":[-121.418788,36.971101]},{\"entry\":[false,true],\"in\":0,\"bearings\":[120,284],\"duration\":0.676,\"turn_duration\":0.061,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.537,\"geometry_index\":2702,\"location\":[-121.418891,36.971149]},{\"entry\":[false,true],\"in\":0,\"bearings\":[104,287],\"duration\":1.475,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.283,\"geometry_index\":2703,\"location\":[-121.419045,36.971179]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,287],\"duration\":5.406,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.725,\"geometry_index\":2704,\"location\":[-121.419401,36.971267]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,287],\"duration\":4.164,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.637,\"geometry_index\":2705,\"location\":[-121.420718,36.97159]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,290],\"duration\":2.168,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.891,\"geometry_index\":2706,\"location\":[-121.421762,36.971847]},{\"entry\":[false,true],\"in\":0,\"bearings\":[113,292],\"duration\":5.738,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.004,\"geometry_index\":2708,\"location\":[-121.422297,36.972017]},{\"entry\":[false,true],\"in\":0,\"bearings\":[112,293],\"duration\":2.125,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.854,\"geometry_index\":2709,\"location\":[-121.423696,36.972477]},{\"entry\":[false,true],\"in\":0,\"bearings\":[113,293],\"duration\":10.088,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.82,\"geometry_index\":2710,\"location\":[-121.424217,36.972657]},{\"entry\":[false,true],\"in\":0,\"bearings\":[75,256],\"duration\":1.531,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.334,\"geometry_index\":2719,\"location\":[-121.426814,36.97292]},{\"entry\":[false,true],\"in\":0,\"bearings\":[76,255],\"duration\":13.826,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.082,\"geometry_index\":2720,\"location\":[-121.427206,36.972842]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,276],\"duration\":26.828,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.465,\"geometry_index\":2724,\"location\":[-121.430791,36.972303]},{\"entry\":[false,true],\"in\":0,\"bearings\":[158,336],\"duration\":12.209,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.664,\"geometry_index\":2746,\"location\":[-121.435803,36.976156]},{\"entry\":[false,true],\"in\":0,\"bearings\":[141,330],\"duration\":12.9,\"turn_duration\":0.012,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.277,\"geometry_index\":2751,\"location\":[-121.437497,36.978266]},{\"entry\":[false,true],\"in\":0,\"bearings\":[166,346],\"duration\":1.385,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.205,\"geometry_index\":2756,\"location\":[-121.438509,36.980726]},{\"entry\":[false,true],\"in\":0,\"bearings\":[166,346],\"duration\":0.322,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.275,\"geometry_index\":2757,\"location\":[-121.438597,36.980999]},{\"entry\":[false,true],\"in\":0,\"bearings\":[166,343],\"duration\":3.756,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.268,\"geometry_index\":2758,\"location\":[-121.438618,36.981064]},{\"entry\":[false,true],\"in\":0,\"bearings\":[164,343],\"duration\":1.988,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.732,\"geometry_index\":2761,\"location\":[-121.438882,36.981777]},{\"entry\":[false,true],\"in\":0,\"bearings\":[161,335],\"duration\":8.602,\"turn_duration\":0.026,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.504,\"geometry_index\":2763,\"location\":[-121.439035,36.982149]},{\"entry\":[false,true],\"in\":0,\"bearings\":[142,324],\"duration\":2.557,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.23,\"geometry_index\":2768,\"location\":[-121.440343,36.983736]},{\"entry\":[false,true],\"in\":0,\"bearings\":[144,320],\"duration\":7.225,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.119,\"geometry_index\":2769,\"location\":[-121.440756,36.984195]},{\"entry\":[false,true],\"in\":0,\"bearings\":[124,304],\"duration\":6.682,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.674,\"geometry_index\":2775,\"location\":[-121.442265,36.985225]},{\"entry\":[false,true],\"in\":0,\"bearings\":[124,304],\"duration\":2.799,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.373,\"geometry_index\":2776,\"location\":[-121.443803,36.98605]},{\"entry\":[false,true],\"in\":0,\"bearings\":[124,304],\"duration\":58.578,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":49.785,\"geometry_index\":2777,\"location\":[-121.444453,36.986394]},{\"entry\":[false,true],\"in\":0,\"bearings\":[58,238],\"duration\":38.92,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":34.049,\"geometry_index\":2811,\"location\":[-121.459225,36.987218]},{\"entry\":[false,true],\"in\":0,\"bearings\":[92,272],\"duration\":7.256,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.342,\"geometry_index\":2829,\"location\":[-121.468385,36.983253]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,276],\"duration\":10.762,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.408,\"geometry_index\":2833,\"location\":[-121.470078,36.983325]},{\"entry\":[false,true],\"in\":0,\"bearings\":[101,281],\"duration\":24.9,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.781,\"geometry_index\":2835,\"location\":[-121.472625,36.983685]},{\"entry\":[false,true],\"in\":0,\"bearings\":[102,282],\"duration\":6.674,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.834,\"geometry_index\":2839,\"location\":[-121.478886,36.984655]},{\"entry\":[false,true],\"in\":0,\"bearings\":[104,284],\"duration\":16.734,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.637,\"geometry_index\":2842,\"location\":[-121.480526,36.984963]},{\"entry\":[false,true],\"in\":0,\"bearings\":[114,296],\"duration\":5.887,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.145,\"geometry_index\":2848,\"location\":[-121.484607,36.985988]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,298],\"duration\":12.631,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.047,\"geometry_index\":2850,\"location\":[-121.485902,36.986511]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,298],\"duration\":5.107,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.463,\"geometry_index\":2851,\"location\":[-121.488514,36.987612]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,298],\"duration\":7.154,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.254,\"geometry_index\":2852,\"location\":[-121.48953,36.988041]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,295],\"duration\":9.994,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.727,\"geometry_index\":2853,\"location\":[-121.49089,36.988614]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,295],\"duration\":3.008,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.625,\"geometry_index\":2855,\"location\":[-121.492981,36.989395]},{\"entry\":[false,true],\"in\":0,\"bearings\":[119,301],\"duration\":1.893,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.65,\"geometry_index\":2857,\"location\":[-121.493537,36.989621]},{\"entry\":[false,true],\"in\":0,\"bearings\":[124,306],\"duration\":25.646,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.434,\"geometry_index\":2859,\"location\":[-121.493845,36.989778]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,319],\"duration\":1.348,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.172,\"geometry_index\":2864,\"location\":[-121.498202,36.993694]},{\"entry\":[false,true],\"in\":0,\"bearings\":[139,319],\"duration\":10.348,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.047,\"geometry_index\":2865,\"location\":[-121.498437,36.993913]},{\"entry\":[false,true],\"in\":0,\"bearings\":[139,320],\"duration\":0.436,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.375,\"geometry_index\":2866,\"location\":[-121.500241,36.995598]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":1.135,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.986,\"geometry_index\":2867,\"location\":[-121.500313,36.995666]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":11.193,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.787,\"geometry_index\":2868,\"location\":[-121.500502,36.995843]},{\"entry\":[false,true],\"in\":0,\"bearings\":[143,324],\"duration\":2.064,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.801,\"geometry_index\":2871,\"location\":[-121.50227,36.997714]},{\"entry\":[false,true],\"in\":0,\"bearings\":[144,324],\"duration\":18.049,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.787,\"geometry_index\":2872,\"location\":[-121.502583,36.998063]},{\"entry\":[false,true],\"in\":0,\"bearings\":[137,317],\"duration\":0.895,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.777,\"geometry_index\":2879,\"location\":[-121.505677,37.000917]},{\"entry\":[false,true],\"in\":0,\"bearings\":[137,320],\"duration\":9.779,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.551,\"geometry_index\":2880,\"location\":[-121.505824,37.001043]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":4.074,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.559,\"geometry_index\":2881,\"location\":[-121.507318,37.002489]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":1.758,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.531,\"geometry_index\":2882,\"location\":[-121.507952,37.003088]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":2.639,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.303,\"geometry_index\":2883,\"location\":[-121.508206,37.003327]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":0.738,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.646,\"geometry_index\":2884,\"location\":[-121.508622,37.00372]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":1.9,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.656,\"geometry_index\":2885,\"location\":[-121.508739,37.003833]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":2.73,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.383,\"geometry_index\":2886,\"location\":[-121.509038,37.004119]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":1.635,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.424,\"geometry_index\":2887,\"location\":[-121.509464,37.004527]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":8.408,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.35,\"geometry_index\":2888,\"location\":[-121.509703,37.004757]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,319],\"duration\":6.895,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.025,\"geometry_index\":2889,\"location\":[-121.510961,37.005964]},{\"entry\":[false,true],\"in\":0,\"bearings\":[139,318],\"duration\":34.357,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.062,\"geometry_index\":2890,\"location\":[-121.511608,37.006559]},{\"entry\":[false,true],\"in\":0,\"bearings\":[138,313],\"duration\":7.67,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.902,\"geometry_index\":2892,\"location\":[-121.514883,37.009508]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"location\":[-121.515821,37.009914],\"geometry_index\":2895,\"admin_index\":0,\"weight\":6.295,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.071,\"turn_weight\":0.75,\"duration\":8.23,\"bearings\":[97,259],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[44,210],\"duration\":13.439,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.096,\"geometry_index\":2898,\"location\":[-121.516553,37.00959]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":0.889,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.781,\"geometry_index\":2900,\"location\":[-121.517473,37.008276]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":6.479,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.811,\"geometry_index\":2901,\"location\":[-121.517551,37.008162]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":0.363,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.309,\"geometry_index\":2902,\"location\":[-121.518162,37.007275]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":12.854,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.549,\"geometry_index\":2903,\"location\":[-121.518196,37.007225]},{\"entry\":[false,true],\"in\":0,\"bearings\":[30,209],\"duration\":37.688,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":33.9,\"geometry_index\":2905,\"location\":[-121.519431,37.005505]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":1.221,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.08,\"geometry_index\":2907,\"location\":[-121.522474,37.001049]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":0.648,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.566,\"geometry_index\":2908,\"location\":[-121.52259,37.00088]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,208],\"duration\":2.521,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.252,\"geometry_index\":2909,\"location\":[-121.522648,37.000795]},{\"entry\":[false,true],\"in\":0,\"bearings\":[28,209],\"duration\":33.553,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.191,\"geometry_index\":2910,\"location\":[-121.522867,37.000469]},{\"entry\":[false,true],\"in\":0,\"bearings\":[72,257],\"duration\":8.346,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.512,\"geometry_index\":2917,\"location\":[-121.524543,36.999289]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.525102,36.999213],\"geometry_index\":2919,\"admin_index\":0,\"weight\":10.088,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.013,\"turn_weight\":0.5,\"duration\":12.666,\"bearings\":[85,273],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[121,305],\"duration\":1.424,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.273,\"geometry_index\":2925,\"location\":[-121.526634,36.999596]},{\"entry\":[false,true],\"in\":0,\"bearings\":[125,306],\"duration\":2.043,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.832,\"geometry_index\":2926,\"location\":[-121.526833,36.999709]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,305],\"duration\":13.312,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.975,\"geometry_index\":2927,\"location\":[-121.527069,36.999844]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,295],\"duration\":4.854,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.361,\"geometry_index\":2931,\"location\":[-121.528697,37.000637]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,295],\"duration\":8.82,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.932,\"geometry_index\":2932,\"location\":[-121.52941,37.000906]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,295],\"duration\":6.836,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.145,\"geometry_index\":2933,\"location\":[-121.530853,37.001449]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,294],\"duration\":3.799,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.402,\"geometry_index\":2934,\"location\":[-121.531977,37.001872]},{\"entry\":[false,true],\"in\":0,\"bearings\":[114,296],\"duration\":6.969,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.438,\"geometry_index\":2935,\"location\":[-121.53262,37.002105]},{\"entry\":[false,true],\"in\":0,\"bearings\":[116,295],\"duration\":2.641,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.441,\"geometry_index\":2936,\"location\":[-121.533798,37.002555]},{\"entry\":[false,true],\"in\":0,\"bearings\":[112,290],\"duration\":9.119,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.436,\"geometry_index\":2938,\"location\":[-121.534255,37.002715]},{\"entry\":[false,true],\"in\":0,\"bearings\":[101,281],\"duration\":11.463,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.596,\"geometry_index\":2942,\"location\":[-121.535901,37.003065]},{\"entry\":[false,true],\"in\":0,\"bearings\":[92,270],\"duration\":3.928,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.633,\"geometry_index\":2945,\"location\":[-121.537461,37.003188]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":3.967,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.662,\"geometry_index\":2946,\"location\":[-121.538,37.00319]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":20.008,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.1,\"geometry_index\":2947,\"location\":[-121.538738,37.003193]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,276],\"duration\":28.436,\"turn_weight\":0.5,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.504,\"geometry_index\":2948,\"location\":[-121.540651,37.003201]},{\"entry\":[false,true],\"in\":0,\"bearings\":[99,279],\"duration\":4.189,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.127,\"geometry_index\":2951,\"location\":[-121.544862,37.003741]},{\"entry\":[false,true],\"in\":0,\"bearings\":[99,279],\"duration\":26.346,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.73,\"geometry_index\":2952,\"location\":[-121.545079,37.003769]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,275],\"duration\":37.551,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.543,\"geometry_index\":2958,\"location\":[-121.548556,37.004078]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,276],\"duration\":11.572,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.572,\"geometry_index\":2959,\"location\":[-121.550191,37.004185]},{\"entry\":[false,true],\"in\":0,\"bearings\":[96,273],\"duration\":4.047,\"turn_weight\":2,\"turn_duration\":2.022,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.025,\"geometry_index\":2960,\"location\":[-121.55069,37.00423]},{\"entry\":[false,true],\"in\":0,\"bearings\":[93,275],\"duration\":3.309,\"turn_weight\":2,\"turn_duration\":2.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.332,\"geometry_index\":2961,\"location\":[-121.550891,37.004239]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,274],\"duration\":4.908,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.023,\"geometry_index\":2962,\"location\":[-121.551033,37.004248]},{\"bearings\":[93,271],\"entry\":[false,true],\"in\":0,\"turn_weight\":0.5,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":2964,\"location\":[-121.551581,37.004278]}],\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Jose\"}],\"type\":\"turn\",\"modifier\":\"slight right\",\"text\":\"San Jose\"},\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"turn\",\"modifier\":\"slight right\",\"text\":\"US 101 North\"},\"distanceAlongGeometry\":19263.996}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to stay on CA 152.\",\"modifier\":\"slight right\",\"bearing_after\":190,\"bearing_before\":189,\"location\":[-121.38248,36.971846]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":873.471,\"duration_typical\":984.115,\"duration\":1052.635,\"distance\":19263.996,\"driving_side\":\"right\",\"weight\":936.428,\"mode\":\"driving\",\"ref\":\"CA 152\",\"geometry\":\"ksqoeA~crofFr{@nLbLbBjq@~NtJfC`KrDxIlEvInF`IbGtH`HdItJvLdPxDfH~CxHvCtIbCzIxm@d{BlJp]hT|t@tNpk@xk@d}BhIvZ|HxWbJjWnJfV|b@vbAp]~w@lXfm@xNnYxNxWpOxUpd@rr@fUh]pSp\\\\xN`^`ItUxDbQbGja@`Dt_@v@r\\\\F`\\\\cAl]{B|]aEx^uExZcHt_@wGd]uIl]eJ`VcM|Z}L~SwPfZiO`Vc\\\\v_@kyD~kEslAvtAkZz]aNdQcNhSeJhOqKnTmLn[{Pfb@u]`dAqRtk@wIxWu\\\\zfAoRvq@_BlE{@rHoDfUeShqAaOf`Ac@vCoHt[w[lvAgJp_@m@~BqIz]{CzSgBfV{@pQ?fQL`NbAbP~AhMzCnWrZr`C|Bn\\\\hAh^Er`@u@zRw@~M_BrOkBrOsDjSkEzR{EtPiF`O_HvPyH`OwIpNcMdPqJhK_KjKwIdIcPtI_MxG_OjGcOhH_TdIcSvImUpJwg@pUgOvIwOjLyNbOii@`j@cK|GmKrGcJzDmN~EseBx_@aPnDaCh@eMpDeSfFeItBuGbBqMlE_Bh@iOfI_QhKcSrOwh@fh@u[xXyAtA{NbP_HhJqGhKmHbOuQva@qr@b_BoTrg@gOt]gfB~}DcPf`@uI|SwFhRcDfQiCtPqAtPu@dPMfQZpNt@rOpA`OhCfQbD~MlErObh@juApGhRzEfQbDtP~ApNpArOZdP?d_@mBpz@[lT?hRh@fQpApN~AbPbDbOzEvQbGzRzDtJ~Zjv@~t@xjB|]j_AzKrVtJhN`OzOfd@vg@pMfQrHzMb@v@tIvQzEtPzEzRtC|S~AjSt@vQ?bWcA~gA[vg@g@p]cAd_@GhAkAtYcSncCs[|wDoWbaDkAbMcDb]sBvTwLhfA{@lH}U|pB{Hxg@qGr^mH`]_Kjb@g@fBsM`e@aQzi@ycAfbDyYn~@yb@~sAgn@p}Bq@bCaEfOaGnQ}BzG{DjIuArCgIvP_KrOmx@b|@kaDdkDuLtMihBvoBgCnCaJxJoF`GcjBhcBiAbAyTpRc@^sb@`_@kQtPqM~M_NtOc`AvlAq[d`@{FdHkyAj|Amd@rf@}MzNqW~XaFhF{PtQoXrYkM|MmjArmAed@lg@k[v^}zC|kDuPnV_ElPu@tP`@`J~DpQdLbOb_@`V~p@la@bFzClv@de@bBbA|GdEpaB~eAjzB`sAbzCbiBpIfFhDrBjStLtJfGhRdPpM`OjH~MlHfQlEtP|AhKnBhQf@rOYfQeArOyBdQmExQ{EbPyBvEaFlKmGvMgU`f@kHfQ{H`VaGjTyOpk@}`@dyAmYfeAqMdg@c[rhA{CvKcDxNeAvEqGd_@cGnk@_BlRqAnO{Bpk@g@lc@Ct`@Ebm@OpvBgC|m@}Dzd@qVjqDw@pLgBdX}AtVcBz]uAr]iAj^_DpjAuEdeByAd^QpKQzGe@dRU`NEhNRtN`@|Nv@|MpA~LtBbObCxM\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 20 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 20 miles.\",\"distanceAlongGeometry\":32806.32},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep right to take exit 3 77B.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep right to take exit 3 77B.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to take exit 3 77B.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to take exit 3 77B.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to take exit 3 77B onto California 85 North toward Cupertino, Mountain View.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to take exit 3 77B onto California 85 North toward Cupertino, Mountain View.\",\"distanceAlongGeometry\":291.667}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[71,254],\"duration\":11.484,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.762,\"geometry_index\":2971,\"location\":[-121.55329,37.00406]},{\"entry\":[false,true],\"in\":0,\"bearings\":[72,261],\"duration\":43.125,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":45.281,\"geometry_index\":2974,\"location\":[-121.554932,37.003638]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.558396,37.007551],\"geometry_index\":2992,\"admin_index\":0,\"weight\":10.795,\"is_urban\":true,\"turn_weight\":2,\"duration\":8.189,\"bearings\":[154,336],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,337],\"duration\":3.096,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.328,\"geometry_index\":2993,\"location\":[-121.559408,37.009408]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":28.871,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.316,\"geometry_index\":2994,\"location\":[-121.559793,37.010117]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":23.795,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.369,\"geometry_index\":2995,\"location\":[-121.563374,37.016727]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,336],\"duration\":2.287,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.344,\"geometry_index\":2996,\"location\":[-121.566361,37.022223]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,338],\"duration\":2.662,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.729,\"geometry_index\":2997,\"location\":[-121.566634,37.022723]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.566937,37.023316],\"geometry_index\":2998,\"admin_index\":0,\"weight\":22.016,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":21.537,\"bearings\":[158,336],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.569243,37.027546],\"geometry_index\":2999,\"admin_index\":0,\"weight\":126.158,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":128.887,\"bearings\":[156,337],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":42.688,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":40.547,\"geometry_index\":3014,\"location\":[-121.582266,37.054542]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":35.342,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":33.568,\"geometry_index\":3016,\"location\":[-121.586199,37.063603]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,338],\"duration\":34.525,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":32.781,\"geometry_index\":3024,\"location\":[-121.589581,37.071254]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.593609,37.07868],\"geometry_index\":3029,\"admin_index\":0,\"weight\":31.557,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":31.859,\"bearings\":[156,336],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":29.572,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":28.826,\"geometry_index\":3030,\"location\":[-121.597295,37.085375]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":131.172,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":127.887,\"geometry_index\":3031,\"location\":[-121.600792,37.091726]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,332],\"duration\":23.055,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.625,\"geometry_index\":3063,\"location\":[-121.623657,37.115236]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":12.92,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.559,\"geometry_index\":3067,\"location\":[-121.626527,37.120002]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":18.391,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.762,\"geometry_index\":3068,\"location\":[-121.628112,37.12268]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":27.045,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":29.066,\"geometry_index\":3069,\"location\":[-121.63042,37.126584]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":12.645,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.586,\"geometry_index\":3070,\"location\":[-121.633812,37.132323]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,332],\"duration\":72.555,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":76.162,\"geometry_index\":3073,\"location\":[-121.635407,37.134998]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":23.773,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.361,\"geometry_index\":3086,\"location\":[-121.648098,37.148653]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,321],\"duration\":11.141,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.4,\"geometry_index\":3087,\"location\":[-121.653018,37.153719]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":61.174,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":59.637,\"geometry_index\":3089,\"location\":[-121.655422,37.156166]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,327],\"duration\":3.986,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.688,\"geometry_index\":3114,\"location\":[-121.668385,37.168529]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,323],\"duration\":88.4,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":79.561,\"geometry_index\":3117,\"location\":[-121.669193,37.169437]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,311],\"duration\":16.92,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.211,\"geometry_index\":3152,\"location\":[-121.688419,37.187599]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":2.553,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.297,\"geometry_index\":3153,\"location\":[-121.69274,37.190588]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":13.334,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12,\"geometry_index\":3154,\"location\":[-121.693398,37.191048]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":1.361,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.219,\"geometry_index\":3155,\"location\":[-121.696778,37.193424]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":79.133,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":71.219,\"geometry_index\":3156,\"location\":[-121.697147,37.193682]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,305],\"duration\":29.248,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":26.316,\"geometry_index\":3169,\"location\":[-121.717867,37.206523]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.724938,37.211743],\"geometry_index\":3181,\"admin_index\":0,\"weight\":87.574,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":94.141,\"bearings\":[142,322],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":13.908,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.205,\"geometry_index\":3203,\"location\":[-121.747275,37.229699]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":6.166,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.012,\"geometry_index\":3205,\"location\":[-121.751096,37.231879]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,306],\"duration\":3.367,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.283,\"geometry_index\":3207,\"location\":[-121.752791,37.232845]},{\"lanes\":[{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":17.967,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.967,\"geometry_index\":3208,\"location\":[-121.753718,37.233373]},{\"lanes\":[{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":4.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.715,\"geometry_index\":3209,\"location\":[-121.758662,37.236196]},{\"lanes\":[{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"location\":[-121.759926,37.236917],\"geometry_index\":3210,\"admin_index\":0,\"weight\":5.047,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":4.932,\"bearings\":[126,306],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"bearings\":[126,307],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":3211,\"location\":[-121.761251,37.237688]}],\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Cupertino\"},{\"type\":\"text\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Mountain View\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Cupertino / Mountain View\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"377B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-85\",\"type\":\"icon\",\"text\":\"CA 85\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 377B CA 85 North\"},\"distanceAlongGeometry\":32835.988},{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight right\",\"active\":true,\"directions\":[\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Cupertino\"},{\"type\":\"text\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Mountain View\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Cupertino / Mountain View\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"377B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-85\",\"type\":\"icon\",\"text\":\"CA 85\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 377B CA 85 North\"},\"distanceAlongGeometry\":3218.688}],\"destinations\":\"US 101 North: San Jose\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"on ramp\",\"instruction\":\"Take the US 101 North ramp toward San Jose.\",\"modifier\":\"slight right\",\"bearing_after\":254,\"bearing_before\":251,\"location\":[-121.55329,37.00406]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":1148.91,\"duration_typical\":1173.932,\"duration\":1225.777,\"distance\":32835.988,\"driving_side\":\"right\",\"weight\":1198.906,\"mode\":\"driving\",\"ref\":\"US 101 North\",\"geometry\":\"wppqeArw_zfFxGje@`F~UnIfh@f@jHZfGAlHYhIaAnI}BtKoDlJ}BbE{D~EoDjD}GtEsHtCgRtH}RfIwQdI_PxHeQhIijBj_AasBf~@ik@`Wc|Kx~EovItyDg^`Pad@|QkgGboCshHt`DotHvfDq[pNm]bO{]fOm]jNw\\\\pMy^fN_]tLq]zL{]vLu^tLw{A`g@_}JtdDkkHraC}fB`l@kmMvgEuo@dTyTlH}mF|fBil@nRo]tLe^~Ly]nM}]bNg^tN{\\\\hN_^bOu_@rPirI~yDmaLjeF}kKpyE{h@`V{yG~zCgWrLwTzK}UxMuTpMiU`OmU|OsSnO{TjQmSbQaRvP_SvRuSvSiQzRmRhUwP~SgPlTu_DjlEacLvwOcRtVcPdS{QpT{PhRyPhQkRtQ{RxQyRtPmShPaTzOwR~M}TtNwSxLiTrL{SzK}iF`jCkfD`bB_sFfoCueJ~rE{wBjfAaV~LgVhMcUrM{SlM}TjNuRzMiVhQ{S~OcT|PmSfQeSrQuO`OmAhA{qGfjG{oJbeJs{HnrHg^h_@uxB|tBcxAjvAkRtRcSdTmQjS{PrSwQtUsOrSeO`T{NpTY`@ixAlyBsOlUePpUcP`ToP|SaQ`TyQxScRfSkSrSkQxPqQlPeRzOoRzOygEhfD}[lXkPbMwYhWsK`K_d@za@gRzQ_RxRaQjRuPhRiQfSoQbTywHlnJkPdSuPdS}O`RcQrRqQpRcQxQqQpQyQ`QwQzPsQ|OaRvOiRxO}R|OsRpOakDdqCeRnOuStQkRjQaQnQsQxR_QbScQzSqP~SaPtTcP`ViOxUyi@~w@yyD`mGw[bh@osCfrEcO`VyiFhmIwTl^eSj\\\\mRv[uSh^yS|^wRh^sSb`@uQn]uQ~]uRl`@{Rxa@qzItdRisAdtCqNtYyNdXoNfVoOrV{MfS_QvU{OdSaRvTaQnR{Q|QygAreAatBlqB_jCffCaVxU{S~SwRxS}PhSuPnS{QpUqPbUyfNbjRaP`UaPdU_OdTgPlV{NpUyM`UwOnXuOnY_MrUuNpYuMdXwaAftB_aA`sBgeAvyBm^|u@}[~q@_`@|x@moD~sHal@~mAeo@xqAkf@r`A\"},{\"ref\":\"CA 85 North\",\"mode\":\"driving\",\"weight\":1170.943,\"distance\":29571,\"geometry\":\"{az_fAx~wfgF_MfJwl@dfA{MlTsFrIkWr^_]he@eLpPeItNuHdOcHfO{ExLyChI{FzQuDzM{DtPwC|MqBzKo@xEeAvHgAbJkAhK{@lJs@nIo@|Jg@pL]`MUfPEpNl@n`@tAt[nJlmA~BrXz@rJr@dJjDdc@lDr[zNnkBhIhkApAbOz@jJzMlaBpRd|BtHr}@nVzvCnGdu@pC~[bCr_@zBvf@|@d]d@rZYjv@c@pZaBho@kCjc@wCv]{D|^eFz_@oGba@qjB`tKmj@bbDcJvj@gDhVgCxSwHlq@iFnt@wBhb@}@jWy@jVa@rUiA`aCOvj@sDbgNYbjAQ`Zm@zVe@bRw@lQyBf`@aIrw@aDjUgDvTuDrSsDdRyEvSwFrTcKn]_JbXqjAvzCsuC`sHyU|m@iiBdxEuw@lsB_W`p@yy@jwBiCtGyb@`iAsQ`e@}IpUwTpj@{Odb@}Lj_@aHvVmFhT_EpRoFvZqB`M}A~K}Dt[eB|QaBrS_ArOw@xPm@~QY`O}@nfA_@dg@OfLiEtdFe@de@Wnb@UzeEFf[Epf@H|r@Gt~B}AjnAwDdlB_DzsAsKvvE[jMkAf^aAzi@@dMBtr@X|O|@`^bD~q@pA~RxA|QnCnXzC~VhD|WdA~HpBlLvEjVrHf_@jLzc@|h@boBbQpo@xX~jAvQr_A|fAfwGvs@pkEzJ`p@jEl]rD`_@hCd\\\\~Bx^`AfQt@rSx@z[VxPNzPtAbaJb@piFE~sBl@tpFVrk@n@vvBR|Z@bIPrp@Jte@d@`eD~@zxG`AjcHBnXOzUc@vT[|Ki@fOm@rPQlD_@|ImAzTuBtXu@lKkAhLcw@x~H{Ffm@{X~tCafAhhK}StpBwTvtBm@rFki@hhF}MjfAeUftA{]p{A_Id[uZzmAuE|Qi`AxxDkK~a@iTf|@{E~R}E~PaOvr@}ShlA}Jnn@wQhkAuKpl@kF`WkFdUmCzIqRht@uaAjsCkk@haBkbAhtC_Vhs@{Trq@{Xt}@mRfm@yXvz@_Yfx@{wCrkIap@fjB}Qpf@oRpf@aWtn@aIfRioAt|CwRrh@iOde@}Mpf@iLfg@wJff@ei@zvCaLfi@cMph@gOzh@gNpb@c~ArrEmPnb@{Pd`@kPb]{Vnd@gWjc@q^zg@{p@x_AaTjYeiBvgC}gHf`KaTbYySdVaTbT_SlQqSlP{PvMqvN`~K{oCtuB_k@zb@c]xXkYbWuYbYsXnZ}SlWSVklGx{Hi{Jf~L}QxSuRvRqSlQoSbPaTlN}UvMmUvKqT`JasFvxBoiCjcAqt@bYkP~F{ZhKyYbIc]fI_VtEuFhAwGfAc^rFs_@hF\",\"duration\":1032.742,\"driving_side\":\"right\",\"duration_typical\":1054.998,\"weight_typical\":1196.506,\"name\":\"\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to take exit 377B onto CA 85 North toward Cupertino/Mountain View.\",\"modifier\":\"slight right\",\"bearing_after\":327,\"bearing_before\":307,\"location\":[-121.762301,37.238318]},\"speedLimitUnit\":\"mph\",\"destinations\":\"CA 85 North: Cupertino, Mountain View\",\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"19\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-280\",\"type\":\"icon\",\"text\":\"I 280\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Exit 19 I 280 North\"},\"distanceAlongGeometry\":29571},{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight right\",\"active\":true,\"directions\":[\"straight\",\"slight right\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight right\",\"active\":true,\"directions\":[\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"19\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-280\",\"type\":\"icon\",\"text\":\"I 280\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Exit 19 I 280 North\"},\"distanceAlongGeometry\":3218.688}],\"exits\":\"377B\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 18 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 18 miles.\",\"distanceAlongGeometry\":29536},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Take exit 19.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Take exit 19.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Take exit 19.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Take exit 19.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Take exit 19 onto Interstate 2 80 North toward San Francisco.</prosody></amazon:effect></speak>\",\"announcement\":\"Take exit 19 onto Interstate 2 80 North toward San Francisco.\",\"distanceAlongGeometry\":245}],\"intersections\":[{\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.762301,37.238318],\"geometry_index\":3212,\"admin_index\":0,\"weight\":6.07,\"is_urban\":false,\"turn_weight\":5,\"duration\":1.045,\"bearings\":[127,327],\"out\":1,\"in\":0,\"turn_duration\":0.026,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,309],\"duration\":8.592,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.021,\"geometry_index\":3213,\"location\":[-121.762481,37.238542]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[134,315],\"duration\":7.939,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.338,\"geometry_index\":3217,\"location\":[-121.764639,37.240024]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,298],\"duration\":4.178,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.387,\"geometry_index\":3224,\"location\":[-121.766689,37.241366]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[110,286],\"duration\":6.494,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.98,\"geometry_index\":3229,\"location\":[-121.767957,37.24181]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,267],\"duration\":6.861,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.375,\"geometry_index\":3240,\"location\":[-121.770106,37.242072]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[80,259],\"duration\":1.27,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.395,\"geometry_index\":3243,\"location\":[-121.772356,37.241822]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.772766,37.241758],\"geometry_index\":3244,\"admin_index\":0,\"weight\":1.592,\"is_urban\":true,\"turn_weight\":0.95,\"duration\":0.59,\"bearings\":[79,259],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,260],\"duration\":0.533,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.586,\"geometry_index\":3245,\"location\":[-121.772952,37.241728]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[80,259],\"duration\":1.803,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.961,\"geometry_index\":3246,\"location\":[-121.773131,37.241702]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,257],\"duration\":1.439,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.584,\"geometry_index\":3247,\"location\":[-121.77371,37.241616]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[77,260],\"duration\":9.119,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.031,\"geometry_index\":3248,\"location\":[-121.774168,37.241529]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.777125,37.24111],\"geometry_index\":3250,\"admin_index\":0,\"weight\":1.363,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":0.785,\"bearings\":[80,259],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,258],\"duration\":0.533,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.6,\"geometry_index\":3251,\"location\":[-121.777383,37.241069]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[78,259],\"duration\":4.777,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.375,\"geometry_index\":3252,\"location\":[-121.777565,37.241039]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,259],\"duration\":6.09,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.004,\"geometry_index\":3253,\"location\":[-121.77914,37.240801]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.781143,37.240488],\"geometry_index\":3254,\"admin_index\":0,\"weight\":3.949,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":3.008,\"bearings\":[79,259],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,259],\"duration\":7.301,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.395,\"geometry_index\":3255,\"location\":[-121.782145,37.240333]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,259],\"duration\":2.584,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.027,\"geometry_index\":3256,\"location\":[-121.784575,37.239957]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,259],\"duration\":10.105,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.875,\"geometry_index\":3257,\"location\":[-121.785442,37.239821]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,273],\"duration\":1.287,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.48,\"geometry_index\":3263,\"location\":[-121.788875,37.239583]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[93,275],\"duration\":31.109,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":35.775,\"geometry_index\":3264,\"location\":[-121.789316,37.239601]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.799227,37.241862],\"geometry_index\":3271,\"admin_index\":0,\"weight\":18.701,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":16.27,\"bearings\":[108,288],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[100,278],\"duration\":1.662,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.926,\"geometry_index\":3277,\"location\":[-121.804906,37.24316]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[98,276],\"duration\":9.16,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.535,\"geometry_index\":3278,\"location\":[-121.805471,37.24322]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,271],\"duration\":2.146,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.445,\"geometry_index\":3282,\"location\":[-121.808678,37.243334]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,271],\"duration\":53.1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":61.064,\"geometry_index\":3283,\"location\":[-121.809378,37.243342]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,302],\"duration\":17.1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.238,\"geometry_index\":3300,\"location\":[-121.826647,37.245904]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.831576,37.248314],\"geometry_index\":3301,\"admin_index\":0,\"weight\":26.705,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":23.756,\"bearings\":[122,301],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.837665,37.251287],\"geometry_index\":3304,\"admin_index\":0,\"weight\":4.189,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":3.217,\"bearings\":[121,302],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[122,302],\"duration\":8.412,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.676,\"geometry_index\":3305,\"location\":[-121.83845,37.251671]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.840515,37.252681],\"geometry_index\":3307,\"admin_index\":0,\"weight\":6.287,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":5.051,\"bearings\":[122,301],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,302],\"duration\":2.578,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.963,\"geometry_index\":3308,\"location\":[-121.8417,37.253254]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[122,301],\"duration\":1.418,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.629,\"geometry_index\":3309,\"location\":[-121.842309,37.253552]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,302],\"duration\":12.447,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.314,\"geometry_index\":3310,\"location\":[-121.84267,37.253727]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[109,287],\"duration\":1.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.84,\"geometry_index\":3317,\"location\":[-121.845926,37.255048]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[106,285],\"duration\":6.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.59,\"geometry_index\":3319,\"location\":[-121.846359,37.255152]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[95,274],\"duration\":6.787,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.805,\"geometry_index\":3325,\"location\":[-121.848306,37.25543]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-121.85035,37.25549],\"geometry_index\":3328,\"admin_index\":0,\"weight\":14.574,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":12.682,\"bearings\":[92,273],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.854237,37.255599],\"geometry_index\":3330,\"admin_index\":0,\"weight\":16.307,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":14.186,\"bearings\":[92,272],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[90,269],\"duration\":1.5,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.762,\"geometry_index\":3333,\"location\":[-121.858598,37.255641]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.85905,37.255637],\"geometry_index\":3334,\"admin_index\":0,\"weight\":2.967,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":2.107,\"bearings\":[89,270],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[90,270],\"duration\":2.775,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.26,\"geometry_index\":3335,\"location\":[-121.859683,37.25564]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[90,270],\"duration\":11.381,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.373,\"geometry_index\":3336,\"location\":[-121.860514,37.255635]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.863827,37.255686],\"geometry_index\":3338,\"admin_index\":0,\"weight\":7.627,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":6.072,\"bearings\":[93,274],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[94,274],\"duration\":17.713,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":20.812,\"geometry_index\":3339,\"location\":[-121.865574,37.255778]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[95,273],\"duration\":2.24,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.633,\"geometry_index\":3343,\"location\":[-121.871114,37.256112]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.8718,37.256145],\"geometry_index\":3344,\"admin_index\":0,\"weight\":6.854,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":5.854,\"bearings\":[93,270],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[86,263],\"duration\":5.977,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.021,\"geometry_index\":3348,\"location\":[-121.873622,37.256098]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[77,256],\"duration\":2.672,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.141,\"geometry_index\":3352,\"location\":[-121.875469,37.255858]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[75,253],\"duration\":4.924,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.785,\"geometry_index\":3354,\"location\":[-121.876252,37.255695]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.877517,37.255341],\"geometry_index\":3358,\"admin_index\":0,\"weight\":10.355,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":8.41,\"bearings\":[69,246],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.879901,37.254456],\"geometry_index\":3360,\"admin_index\":0,\"weight\":3.646,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":2.742,\"bearings\":[65,245],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[65,247],\"duration\":84.096,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":94.607,\"geometry_index\":3361,\"location\":[-121.880678,37.254166]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.906392,37.250776],\"geometry_index\":3378,\"admin_index\":0,\"weight\":14.176,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":12.607,\"bearings\":[90,270],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[90,269],\"duration\":2.363,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.658,\"geometry_index\":3379,\"location\":[-121.910259,37.250753]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[89,269],\"duration\":8.229,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.258,\"geometry_index\":3380,\"location\":[-121.910973,37.250741]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.913498,37.250706],\"geometry_index\":3383,\"admin_index\":0,\"weight\":3.393,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":2.578,\"bearings\":[89,269],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[89,269],\"duration\":10.652,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.984,\"geometry_index\":3384,\"location\":[-121.914292,37.250697]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[89,269],\"duration\":14.693,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":16.531,\"geometry_index\":3386,\"location\":[-121.917568,37.250672]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[89,269],\"duration\":21.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":24.301,\"geometry_index\":3387,\"location\":[-121.922078,37.25064]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[96,277],\"duration\":3.086,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.471,\"geometry_index\":3395,\"location\":[-121.928714,37.250698]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-121.92965,37.250812],\"geometry_index\":3398,\"admin_index\":0,\"weight\":20.746,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":18.447,\"bearings\":[100,280],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[102,282],\"duration\":2.469,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.77,\"geometry_index\":3401,\"location\":[-121.935179,37.251775]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[102,282],\"duration\":28.984,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":32.607,\"geometry_index\":3402,\"location\":[-121.935919,37.251901]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.944612,37.253452],\"geometry_index\":3404,\"admin_index\":0,\"weight\":6.971,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":6.068,\"bearings\":[103,283],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[103,283],\"duration\":6.281,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.225,\"geometry_index\":3405,\"location\":[-121.946431,37.253787]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-121.948315,37.254135],\"geometry_index\":3406,\"admin_index\":0,\"weight\":31.172,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.113,\"bearings\":[103,283],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.956608,37.256084],\"geometry_index\":3412,\"admin_index\":0,\"weight\":5.654,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":4.488,\"bearings\":[114,294],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":1.064,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.225,\"geometry_index\":3413,\"location\":[-121.95787,37.256527]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":10.58,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.902,\"geometry_index\":3414,\"location\":[-121.958173,37.256634]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":1.943,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.188,\"geometry_index\":3415,\"location\":[-121.961146,37.257679]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":5.656,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.365,\"geometry_index\":3416,\"location\":[-121.961706,37.257877]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.963294,37.258439],\"geometry_index\":3419,\"admin_index\":0,\"weight\":3.699,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":2.867,\"bearings\":[116,291],\"out\":1,\"in\":0,\"turn_duration\":0.024,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[111,289],\"duration\":16.416,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":18.469,\"geometry_index\":3420,\"location\":[-121.964122,37.258696]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.968983,37.260032],\"geometry_index\":3427,\"admin_index\":0,\"weight\":13.369,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":11.707,\"bearings\":[116,295],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[119,300],\"duration\":5.76,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.336,\"geometry_index\":3429,\"location\":[-121.97221,37.261412]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[120,300],\"duration\":21.023,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":22.602,\"geometry_index\":3430,\"location\":[-121.973783,37.262122]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[118,298],\"duration\":3.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.869,\"geometry_index\":3435,\"location\":[-121.979562,37.264643]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[118,300],\"duration\":36.9,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":39.668,\"geometry_index\":3436,\"location\":[-121.980518,37.265056]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[122,303],\"duration\":1.164,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.252,\"geometry_index\":3442,\"location\":[-121.990501,37.269703]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[123,303],\"duration\":37.342,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":40.143,\"geometry_index\":3443,\"location\":[-121.990809,37.269864]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.001524,37.27398],\"geometry_index\":3454,\"admin_index\":0,\"weight\":20.441,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":19.021,\"bearings\":[118,299],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[129,310],\"duration\":1.977,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.125,\"geometry_index\":3459,\"location\":[-122.007091,37.276727]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,314],\"duration\":6.168,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.629,\"geometry_index\":3460,\"location\":[-122.007673,37.277115]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[134,315],\"duration\":1.514,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.627,\"geometry_index\":3462,\"location\":[-122.009364,37.278418]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,314],\"duration\":7.867,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.457,\"geometry_index\":3463,\"location\":[-122.009786,37.278755]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.011974,37.280454],\"geometry_index\":3464,\"admin_index\":0,\"weight\":66.32,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":61.236,\"bearings\":[134,314],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.026716,37.295204],\"geometry_index\":3472,\"admin_index\":0,\"weight\":45.439,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":41.316,\"bearings\":[147,327],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.036318,37.304622],\"geometry_index\":3481,\"admin_index\":0,\"weight\":74.244,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":65.557,\"bearings\":[137,317],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,339],\"duration\":9.938,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.18,\"geometry_index\":3491,\"location\":[-122.047504,37.317295]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.048598,37.319511],\"geometry_index\":3492,\"admin_index\":0,\"weight\":14.434,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":12.836,\"bearings\":[159,339],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"bearings\":[167,347],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":3498,\"location\":[-122.049774,37.322371]}]},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to take Interstate 2 80 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to take Interstate 2 80 North.\",\"distanceAlongGeometry\":620},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take Interstate 2 80 North toward San Francisco. Then Keep left to take Interstate 2 80 North.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take Interstate 2 80 North toward San Francisco. Then Keep left to take Interstate 2 80 North.\",\"distanceAlongGeometry\":233.333}],\"intersections\":[{\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"location\":[-122.050086,37.323654],\"geometry_index\":3502,\"admin_index\":0,\"weight\":0.881,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"duration\":0.803,\"bearings\":[16,170],\"out\":0,\"in\":1,\"turn_duration\":0.037,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[196,352],\"duration\":13.098,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":15.062,\"geometry_index\":3504,\"location\":[-122.050024,37.323823]},{\"bearings\":[170,341],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"turn_duration\":0.036,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":3512,\"location\":[-122.05074,37.326832]}],\"exits\":\"19\",\"bannerInstructions\":[{\"sub\":{\"components\":[{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\",\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-280\",\"type\":\"icon\",\"text\":\"I 280\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 280 North\"},\"distanceAlongGeometry\":648}],\"destinations\":\"I 280 North, I 280 South: San Francisco, San Jose\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"off ramp\",\"instruction\":\"Take exit 19 onto I 280 North toward San Francisco.\",\"modifier\":\"slight right\",\"bearing_after\":16,\"bearing_before\":350,\"location\":[-122.050086,37.323654]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":33.174,\"duration_typical\":28.92,\"duration\":24.889,\"distance\":648,\"driving_side\":\"right\",\"weight\":28.539,\"mode\":\"driving\",\"geometry\":\"kw`efAjajxgFmGgCcAJibAzJaLdAgNbBiNvBoMxBuYvFs[vJiFNcTdHyRfIsa@lQaeA|l@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take Interstate 2 80 North toward San Francisco.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take Interstate 2 80 North toward San Francisco.\",\"distanceAlongGeometry\":163}],\"intersections\":[{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"location\":[-122.052081,37.329162],\"geometry_index\":3516,\"admin_index\":0,\"weight\":6.033,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"duration\":5.254,\"bearings\":[152,333],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"bearings\":[158,338],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":3521,\"location\":[-122.052702,37.33029]}],\"bannerInstructions\":[{\"sub\":{\"components\":[{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-280\",\"type\":\"icon\",\"text\":\"I 280\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 280 North\"},\"distanceAlongGeometry\":191}],\"destinations\":\"I 280 North, CA 85 North: San Francisco, Mountain View\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take I 280 North toward San Francisco.\",\"modifier\":\"slight left\",\"bearing_after\":333,\"bearing_before\":332,\"location\":[-122.052081,37.329162]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":8.594,\"duration_typical\":7.482,\"duration\":7.322,\"distance\":191,\"driving_side\":\"right\",\"weight\":8.412,\"mode\":\"driving\",\"geometry\":\"sokefA`~mxgFgGnD_NpGoL~EoQxHgN|FoQnHsHtC\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 31 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 31 miles.\",\"distanceAlongGeometry\":50366.977},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Take exit 43B.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Take exit 43B.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Take exit 43B.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Take exit 43B.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Take exit 43B onto Interstate 3 80 East toward U.S. 1 o1, San Francisco International Airport.</prosody></amazon:effect></speak>\",\"announcement\":\"Take exit 43B onto Interstate 3 80 East toward U.S. 1 o1, San Francisco International Airport.\",\"distanceAlongGeometry\":315}],\"intersections\":[{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.052929,37.33074],\"geometry_index\":3523,\"admin_index\":0,\"weight\":4.051,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"duration\":3.541,\"bearings\":[159,338],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,338],\"duration\":1.74,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2,\"geometry_index\":3524,\"location\":[-122.053304,37.331492]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,336],\"duration\":3.195,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.676,\"geometry_index\":3525,\"location\":[-122.053486,37.331849]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,319],\"duration\":3.723,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.281,\"geometry_index\":3530,\"location\":[-122.053923,37.332465]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,302],\"duration\":21.732,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":24.447,\"geometry_index\":3537,\"location\":[-122.054662,37.333029]},{\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"location\":[-122.059998,37.332874],\"geometry_index\":3558,\"admin_index\":0,\"weight\":1.637,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.018,\"bearings\":[81,264],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[84,273],\"duration\":6.234,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.014,\"geometry_index\":3561,\"location\":[-122.060257,37.332854]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.061817,37.333044],\"geometry_index\":3570,\"admin_index\":0,\"weight\":8.51,\"is_urban\":true,\"turn_weight\":7.25,\"duration\":1.18,\"bearings\":[81,294],\"out\":1,\"in\":0,\"turn_duration\":0.059,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":8.359,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.195,\"geometry_index\":3571,\"location\":[-122.062104,37.333146]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.064263,37.333915],\"geometry_index\":3573,\"admin_index\":0,\"weight\":15.021,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":13.68,\"bearings\":[114,292],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,268],\"duration\":0.957,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.053,\"geometry_index\":3581,\"location\":[-122.068116,37.334483]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.068399,37.334474],\"geometry_index\":3582,\"admin_index\":0,\"weight\":1.596,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.018,\"bearings\":[88,266],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[86,265],\"duration\":0.955,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.051,\"geometry_index\":3583,\"location\":[-122.068697,37.334459]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[85,261],\"duration\":76.262,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":80.074,\"geometry_index\":3584,\"location\":[-122.068987,37.334437]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,301],\"duration\":0.926,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.949,\"geometry_index\":3613,\"location\":[-122.089402,37.340774]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,301],\"duration\":62.859,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":64.43,\"geometry_index\":3614,\"location\":[-122.08965,37.340894]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.105048,37.35079],\"geometry_index\":3639,\"admin_index\":0,\"weight\":5.521,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":5.283,\"bearings\":[151,326],\"out\":1,\"in\":0,\"turn_duration\":0.024,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,324],\"duration\":4.941,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.188,\"geometry_index\":3642,\"location\":[-122.105986,37.351906]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,313],\"duration\":1.617,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.697,\"geometry_index\":3646,\"location\":[-122.107027,37.352854]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,310],\"duration\":14.184,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.893,\"geometry_index\":3648,\"location\":[-122.107387,37.353121]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[108,287],\"duration\":20.297,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.291,\"geometry_index\":3657,\"location\":[-122.111281,37.354782]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.116765,37.357015],\"geometry_index\":3668,\"admin_index\":0,\"weight\":19.771,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":18.84,\"bearings\":[133,316],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,334],\"duration\":1.729,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.814,\"geometry_index\":3677,\"location\":[-122.119929,37.36117]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,331],\"duration\":14.746,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.484,\"geometry_index\":3678,\"location\":[-122.120164,37.361556]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.123517,37.364232],\"geometry_index\":3689,\"admin_index\":0,\"weight\":40.789,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":39.344,\"bearings\":[121,291],\"out\":1,\"in\":0,\"turn_duration\":0.038,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[111,291],\"duration\":1.012,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.037,\"geometry_index\":3704,\"location\":[-122.135181,37.36638]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[111,290],\"duration\":31.592,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":31.592,\"geometry_index\":3705,\"location\":[-122.135465,37.366466]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,325],\"duration\":0.943,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.943,\"geometry_index\":3718,\"location\":[-122.142772,37.371262]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,324],\"duration\":44.012,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":44.012,\"geometry_index\":3719,\"location\":[-122.142946,37.371456]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[162,344],\"duration\":0.908,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.908,\"geometry_index\":3740,\"location\":[-122.151143,37.380478]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,345],\"duration\":23.76,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.166,\"geometry_index\":3741,\"location\":[-122.151221,37.380692]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,323],\"duration\":1.506,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.469,\"geometry_index\":3756,\"location\":[-122.153265,37.386337]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,319],\"duration\":4.078,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.977,\"geometry_index\":3758,\"location\":[-122.153546,37.386629]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,308],\"duration\":11.535,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.246,\"geometry_index\":3761,\"location\":[-122.154425,37.387341]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.157576,37.38859],\"geometry_index\":3768,\"admin_index\":0,\"weight\":8.139,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":8.625,\"bearings\":[107,272],\"out\":1,\"in\":0,\"turn_duration\":0.056,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[102,279],\"duration\":9.756,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.268,\"geometry_index\":3771,\"location\":[-122.160225,37.388952]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[117,299],\"duration\":2.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.908,\"geometry_index\":3778,\"location\":[-122.163123,37.389697]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[122,303],\"duration\":15.66,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.486,\"geometry_index\":3780,\"location\":[-122.163689,37.38996]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.167846,37.39202],\"geometry_index\":3790,\"admin_index\":0,\"weight\":1.85,\"is_urban\":false,\"turn_weight\":0.75,\"duration\":1.229,\"bearings\":[115,284],\"out\":1,\"in\":0,\"turn_duration\":0.041,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[104,280],\"duration\":96.516,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":89.277,\"geometry_index\":3791,\"location\":[-122.168206,37.39209]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.189986,37.407383],\"geometry_index\":3819,\"admin_index\":0,\"weight\":11.086,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.691,\"bearings\":[130,307],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,292],\"duration\":3.973,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.873,\"geometry_index\":3826,\"location\":[-122.193728,37.408949]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,292],\"duration\":11.297,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.297,\"geometry_index\":3827,\"location\":[-122.195077,37.409375]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,292],\"duration\":3.145,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.125,\"geometry_index\":3828,\"location\":[-122.198893,37.410596]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,292],\"duration\":34.264,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":34.264,\"geometry_index\":3829,\"location\":[-122.199856,37.410903]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":2.652,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.719,\"geometry_index\":3841,\"location\":[-122.210223,37.415473]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,320],\"duration\":1.453,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.488,\"geometry_index\":3842,\"location\":[-122.210815,37.416063]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.211145,37.41638],\"geometry_index\":3843,\"admin_index\":0,\"weight\":46.242,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":46.262,\"bearings\":[140,317],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.225796,37.422325],\"geometry_index\":3868,\"admin_index\":0,\"weight\":48.92,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":49.668,\"bearings\":[131,311],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.238669,37.431696],\"geometry_index\":3883,\"admin_index\":0,\"weight\":16.441,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":16.869,\"bearings\":[135,315],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,317],\"duration\":2.262,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.205,\"geometry_index\":3885,\"location\":[-122.242835,37.435172]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,317],\"duration\":15.91,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.514,\"geometry_index\":3886,\"location\":[-122.243384,37.435636]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.247241,37.438854],\"geometry_index\":3888,\"admin_index\":0,\"weight\":29.68,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":29.199,\"bearings\":[136,315],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.255387,37.443916],\"geometry_index\":3902,\"admin_index\":0,\"weight\":23.123,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":23.15,\"bearings\":[110,284],\"out\":1,\"in\":0,\"turn_duration\":0.028,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[84,264],\"duration\":2.754,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.754,\"geometry_index\":3912,\"location\":[-122.26288,37.44396]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[84,266],\"duration\":14.717,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.35,\"geometry_index\":3913,\"location\":[-122.263753,37.44389]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[107,290],\"duration\":2.637,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.562,\"geometry_index\":3923,\"location\":[-122.268412,37.444308]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,293],\"duration\":1.887,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.84,\"geometry_index\":3925,\"location\":[-122.269187,37.44454]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[115,296],\"duration\":88.307,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":83.891,\"geometry_index\":3927,\"location\":[-122.269748,37.444741]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[163,344],\"duration\":1.434,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.326,\"geometry_index\":3955,\"location\":[-122.290217,37.459872]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,348],\"duration\":3.961,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.662,\"geometry_index\":3957,\"location\":[-122.29034,37.460223]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[177,349],\"duration\":13.939,\"turn_duration\":0.033,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.863,\"geometry_index\":3961,\"location\":[-122.290527,37.461199]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.290763,37.464734],\"geometry_index\":3969,\"admin_index\":0,\"weight\":2.971,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":3.232,\"bearings\":[175,354],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,349],\"duration\":1.199,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.109,\"geometry_index\":3972,\"location\":[-122.290909,37.465545]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,347],\"duration\":10.412,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.631,\"geometry_index\":3974,\"location\":[-122.290986,37.465844]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,333],\"duration\":2.146,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.984,\"geometry_index\":3984,\"location\":[-122.292068,37.468341]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,330],\"duration\":16.342,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.115,\"geometry_index\":3986,\"location\":[-122.292393,37.468831]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":5.09,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.574,\"geometry_index\":3996,\"location\":[-122.295514,37.472166]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":36.672,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":32.998,\"geometry_index\":3998,\"location\":[-122.296543,37.473174]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.298733,37.482054],\"geometry_index\":4027,\"admin_index\":0,\"weight\":29.953,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":31.848,\"bearings\":[8,187],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":40.402,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.367,\"geometry_index\":4045,\"location\":[-122.298943,37.490103]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.309379,37.495794],\"geometry_index\":4074,\"admin_index\":0,\"weight\":6.18,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":6.148,\"bearings\":[107,288],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[113,294],\"duration\":16.727,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.465,\"geometry_index\":4078,\"location\":[-122.311221,37.496337]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,305],\"duration\":1.129,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.045,\"geometry_index\":4086,\"location\":[-122.315883,37.498586]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,305],\"duration\":14.117,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.412,\"geometry_index\":4087,\"location\":[-122.316176,37.49875]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[110,286],\"duration\":29.707,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":28.197,\"geometry_index\":4096,\"location\":[-122.320163,37.500426]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.329457,37.50181],\"geometry_index\":4110,\"admin_index\":0,\"weight\":26.387,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.785,\"bearings\":[115,298],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[127,308],\"duration\":5.717,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.432,\"geometry_index\":4116,\"location\":[-122.336643,37.505971]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,308],\"duration\":3.389,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.219,\"geometry_index\":4117,\"location\":[-122.338098,37.506859]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.338961,37.507385],\"geometry_index\":4118,\"admin_index\":0,\"weight\":15.822,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":16.148,\"bearings\":[128,307],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.343016,37.509933],\"geometry_index\":4123,\"admin_index\":0,\"weight\":46.369,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":48.291,\"bearings\":[131,313],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.353348,37.519079],\"geometry_index\":4135,\"admin_index\":0,\"weight\":29.703,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":32.119,\"bearings\":[146,327],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.35824,37.526061],\"geometry_index\":4150,\"admin_index\":0,\"weight\":9.791,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":10.053,\"bearings\":[144,326],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":18.441,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.52,\"geometry_index\":4164,\"location\":[-122.359592,37.528314]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":17.449,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":16.576,\"geometry_index\":4165,\"location\":[-122.36141,37.532583]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,334],\"duration\":24.227,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.998,\"geometry_index\":4186,\"location\":[-122.36332,37.536568]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.3666,37.541885],\"geometry_index\":4199,\"admin_index\":0,\"weight\":16.379,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":16.721,\"bearings\":[149,329],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.369703,37.545145],\"geometry_index\":4218,\"admin_index\":0,\"weight\":11.354,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.959,\"bearings\":[141,321],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":1.225,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.162,\"geometry_index\":4219,\"location\":[-122.372086,37.54745]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":21.852,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.76,\"geometry_index\":4220,\"location\":[-122.372333,37.54769]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,325],\"duration\":126.871,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":120.521,\"geometry_index\":4236,\"location\":[-122.376628,37.551944]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.400947,37.576263],\"geometry_index\":4349,\"admin_index\":0,\"weight\":19.34,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":19.844,\"bearings\":[161,341],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":1.211,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.182,\"geometry_index\":4370,\"location\":[-122.403428,37.580784]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":15.682,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.289,\"geometry_index\":4371,\"location\":[-122.403631,37.581051]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,319],\"duration\":5.58,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.434,\"geometry_index\":4389,\"location\":[-122.406463,37.584437]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.407707,37.58549],\"geometry_index\":4400,\"admin_index\":0,\"weight\":19.643,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":20.166,\"bearings\":[135,313],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":0.934,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.91,\"geometry_index\":4423,\"location\":[-122.412313,37.589202]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":32.365,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":31.557,\"geometry_index\":4424,\"location\":[-122.412511,37.589402]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,320],\"duration\":1.072,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.047,\"geometry_index\":4430,\"location\":[-122.4191,37.596083]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,319],\"duration\":12.705,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.389,\"geometry_index\":4432,\"location\":[-122.419324,37.596296]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":6.598,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.412,\"geometry_index\":4445,\"location\":[-122.422132,37.598639]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.423633,37.599863],\"geometry_index\":4447,\"admin_index\":0,\"weight\":66.275,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":64.68,\"bearings\":[136,316],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[13,195],\"duration\":2.844,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.057,\"geometry_index\":4550,\"location\":[-122.424289,37.614632]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[7,189],\"duration\":8.506,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":9.357,\"geometry_index\":4556,\"location\":[-122.424118,37.615324]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,348],\"duration\":2.092,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.301,\"geometry_index\":4573,\"location\":[-122.4242,37.617482]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,342],\"duration\":6.246,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.871,\"geometry_index\":4579,\"location\":[-122.424367,37.618016]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,333],\"duration\":4.219,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.738,\"geometry_index\":4590,\"location\":[-122.425154,37.61948]},{\"bearings\":[153,333],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":4591,\"location\":[-122.425759,37.620417]}],\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"San Francisco International Airport\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"US 101 / San Francisco International Airport\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"43B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-380\",\"type\":\"icon\",\"text\":\"I 380\"},{\"type\":\"text\",\"text\":\"East\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Exit 43B I 380 East\"},\"distanceAlongGeometry\":50394.977}],\"destinations\":\"I 280 North: San Francisco\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take I 280 North toward San Francisco.\",\"modifier\":\"slight left\",\"bearing_after\":338,\"bearing_before\":339,\"location\":[-122.052929,37.33074]},\"speedLimitSign\":\"mutcd\",\"name\":\"Junipero Serra Freeway\",\"weight_typical\":1758.598,\"duration_typical\":1779.252,\"duration\":1776.461,\"distance\":50394.977,\"driving_side\":\"right\",\"weight\":1754.516,\"mode\":\"driving\",\"ref\":\"I 280 North\",\"geometry\":\"grnefA`soxgF_n@lViUjJoH~CsF~CwFtDcFtDoE|DcDfDoDdEmDpEeDtEiDnFkCzEiCbFaC|FwCxHcDvJiCrJqBhJwApIuAlKy@tJq@pL[rLIdLH|Kd@hLd@vJhAtL~AvLfZrgBnA~Hl@jGf@rG`@|GNlDN~DFvC?tDQjIa@jIk@dIs@rGw@jG}BvMiChNvAxLkE|Peg@noB{FlUiClLgGd]mFx]{Dp_@yCnb@}Az^q@d_@Ifa@PtP\\\\rQj@bQZzFlBxYxCxZ~b@xeExCz^|Ad^`@d]Gd`@s@x\\\\eBp_@qCn]kEx^wFn]qHz[mInZeJbYaLnYkMbX_OxWsPbWi}AjyB{PnX_OxW}MxWaLxUmeCbqF_L|W}KbYmPlc@oFnNuW`r@uMp[yLzWiMvUcMxSwOfU_cBdrBgP~SkOpUgNtV{L~ViLjX}J~XccCdwHeKrXmLvWiMjU{NjUaPxTyJtLoKfLmKbK}LpJqM~I{|@nj@uf@j`@kSlOuHxGsHxGmQ`RiNfP{N|RqGlJcG`JkQrZmMjWiL~W_K|XeJpY}HdZ}Gb[iGn\\\\iF`\\\\uTpuAeFlZcGb[oHd[iItYgJvYeKfXoLzWkM|ViN|UcO~TePvS{P`SqQlQqRjPgSlOmSzMqTrLwq@t]ohAnl@cWtM{O|JeNrJeO~LoNlNgQvRiP~ScO|UwMpV{LfX{LtWiHjR_S|~@iFx[_Ef\\\\sCv\\\\_Bp\\\\w@n]Ul]OduAQr^g@h^eBj\\\\eDh^iFn^qGj]i_A`vEkDvPuTbhAcIt^}Jv^oLv^qMz\\\\uNx[wPd[yP|X_SzX_SfV_UhU}TrSw{AnrAcKzIq{AbrAok@rg@iV|SiV|TsT~T}P`R{RbUmaCjrCoMbOgMpMwLvK}L`KaN`KqMvI{MjIuMjHqL`GeNjG{NzFqNzEoMzDkLzCoOnDsOzCkOzBsP~Bm|B~Y}QtCuOdDgO`EaOnEcOjFcO|GyO~HkOfJiNfKqJfIuG~FqHpH{NlP_OxRsKtPcMzUoJ|ScKnWyI~YmHfYqEdToLdu@ZpFkNpmBcGln@yA|TyC~[iDhZiF`\\\\gGhY}G|WcHpUwFvPuGrPuHlQgIbQkk@`gAuJxScJ~SoHfSsG`TaG`VyEbUsGzUkCnUmBvXqBra@s@n_@cDt`BcAnX{A`VaCpWaDrWkExXoHj_@eJh]cM``@{Mn\\\\uOxZ}NhW{PbVoQrTwS|SguGlqGso@|n@or@rr@{|Cl~C{uC`yCmTbUqRlT}QbV}PrWcPfXyNpYgMnYoKrXyJjZqI~ZiId]sUrdAsYhsAikAnmFeRd{@ms@dfDqiAhhFsHhZ_J~ZcLh[gMlYcM~UcMbTeNvSsMxPqO`Q_c@rc@{c@~c@yRrSsQfUsO~ToMtSwLrTuJbT{JbV{HvTqHhWsG~WsFhX}EhY_Ex[oCtY{]joEqEdb@aGz^cGn[kHbZ}HxX}ItWiLlXuL~VqMlUgMhSuzA|cCo[ph@qvBtkDsQzXePfU_RdW{hBz_CoMlQaNlRwMbSmLbRgdAlcB{pAnwBeVp_@qT~[iVn\\\\wUt[oaEtfF_\\\\ha@{xC`vDgn@~x@ij@du@GHcb@bl@gtBzwCyN|TaNrUoM~VuLbXmKnX}JhZuIhZqHhYoGd[gGh[sDt[qDd\\\\kCn[eBh[mAh\\\\e@n[?j[\\\\h\\\\z@~ZxObqEjCpu@j@hV\\\\pW@f]W~]cAd^aBb^aCf]cD~\\\\aEx\\\\iFt\\\\aFtWmFvVeE|PkEbPyHfXqH`UuKlYoLrXmMfXkNfWyNfVqwCvxE_Xzb@gSv\\\\mTj_@yjBlbDcsGlcLeLjRwLpQqMbQsMnOsNhOsNfNcPlNiPjMiP~K{RtLsStKyNfH{QnH_PxF_StF{I|BaJvBgLpB{LtBoOlBkP^aOzBaQj@}QRiwAbBy`@p@mLRgOv@aOx@wQnA_O|A}NtBoHdAeHrA{P`DeOlDkOtDsNxDmN`EuOnFgNzF{LnFiNvGmL|FyMpHyNvIcJ~F_LbI{LbJwLxJyLfKuLtKuK~JaM~LoKnK}xApyAgTjTwh@|i@aRjR{JzJuK|JwKnJsJpHeMbJ}L~HqL`HoLfG_NnG_NrFwM`FgMdEmNbE{MdDwMxCgNdCsNtBsNdB}MrAcP`AuMf@{NTmNGaNWgOm@yM{@ul@wFknB}OyxDk^yo@mFqOs@aPc@sOE{OD_PXeRl@oQrA}OtAkOdBeP`CyNpCePlD{NhEwPxFoMnF_NfGcNrGaNhHqMvHcNpIwMlJ_MdJuL`K{KhKcLhLaLzLyKrMmKvMmJhMoIbM}IdNiJzOwIfPqH`PgH`QyFlOeGrQiGbSaG`TcFnS{EtTaEhTgEdVa[dpBq[lxBkFh\\\\gGd\\\\{Gl[mHd[eIl[iIdZcJjZ}J|YsK`ZoLvXoL|Wkx@tfBgIhQiUxf@qKlVaIdScIzTuHfViIzXqHnZkIt_@wHpa@kGjd@sEja@qDzd@gC`d@uA`c@y@tc@wDtyBsAtb@qCfc@yDda@qF~`@uGz_@aIt_@cK``@iLt^gMb]wM~YyPr]}iB`nD_|AryCov@|yA{_@|t@}{@fcBc]hp@iSr_@_Tj_@{Yze@mUr]mTvYm@x@uUxZsWx[muJtlLaPvQqPbQaPpOaQxOeQ`OsO|LkQzM_RbMsQzKkR|KmR`KiRjJqSlJyeBhv@kRfJiPtIyPlKmPfLaQ`NcPlNwzArqAePxM_RlMwOvJeKrFkFhCqFbCuF~BuFvBqFnB}FnBuFhBeGlBkFbBsExAyiGrpBq_Blh@}FlBsFjByFnBsFnBsFpBsFpBsFtBsFvBqFxB_G~BuF~BqF|BuFbCiF|B{FhCiF`CoFfCsFjCkFhCoFlCaN`HolF~lCiFlCiFnCeFpCmFxCoF~CcFxCeF~CeF~CkFfDcFhD_FfDiFrDyEfD_FpDyEnDwEpD{ExDyExDyE|DyE`EsE~DuEbEsEfEqEfEuEnEoElEkEnEiElE}KhLmkA~mAaoC|sC_NlN}fDvlDoEtEaEfEsEvEmEnEoEnEmEfEqEjEoEjEyEnEkE~DqEdEsEdEoE|DwEbEuE`E_FdEsEvDoEpDiF`EwEpDaFrD{ElD{EhDiFpD{EdDcFhD_FdDaFdD_FbDoFjDgFbDaFzCgF~CgF|CeFzCgFxCmF|CmuDtwBgFxCeFxCkFzCeF|CmFdDuExCgFjDgFnDyEhDwEnD_FxDuErD{E|D{EbEoE|DuEfEqEfEeEbEmEjEa{Hn{HeEfEcErEeEzEaEbFyDfFuDjFsDrFmDtFiD|FeDdGaDfGyCjGsCjGqCtGkCxGeCxG_CzG{BfHuBbHmBjHkBnHw[ntAgBrHkBzHmBpHsBrHyBnH}BjHeCnHiCfHmCfHuCdHuCzG}CxGyChGwCbGeDdGeD~FiDzFoDzFoDpFuDlF}DnFyDbFeEdFeE|EkEzEiErEoEnEuEjEasGhfGqEdEuEbEwE~D{ExD}ErD}EjD_FfDgFbDcFzCoFxCsFvCgFhCsFfCmFzBuFzBwFrB{FnB{FjBav@hV_tBpp@sFjB{FpBsFrBwFxBwF~BkF|BqFdCkFfCiFlCmFpCcEzBc@VgFxCgF~CgF`DiFhD}EfDcFjD}EhDq_@~WuOtK}`BxiAaFnD}ElD{EhD{EtDcFxDoElD}EbEwEzDwE~DuEdEqEbEqEjEmEfEkEfEkElEoEtEkEtEgEvEeEvEcE|EcEzEeEfFwDxE}DbF}DfFwDfF}DnFsDfFwDtFqDnFsDvFkDrFoDxFiDvFwn@dfAeDtFiD|FmD|FoDtFsDvFuDjF{DnF_ElFyD|E_EzEeE~EgEvEeEnEoErEqEnE_~@`}@oKjKqz@ry@{`Eb~DggCdeCkEjEqEnE}M~MuE|EsE`FqBvBeEvEgEzE_EvE_ExEaE|E_EdF{D|EcEjF_EjF}DhF_EjFmkA`}AoeApuA_EfFuwA|jB}DbF_E~E_EtEgExEkEpEqEtEmEdEsEfEsEzDyE|D}EvD_FpD}EjDaFdDeF`DiF|CgFtCiFpCmFlCwFjCoF~BuF|BwFrBwFrBqFfB_GhBqGdB{FvAeFnAaGlAaGhAaG`AaG|@gGv@iGr@uGn@gF^kG\\\\kGZgGRoGLsFDgG@gGCeGIkGOcGUcG[gGa@cGe@eGm@gGs@aGs@gGy@cG{@aG}@eGcAeGeA_GgAiGmAwFoA}FsA{FuA{FwA{F}A{FcByFcBuFgBaGmBsFmB{FqBkFqByF{ByF_CqF}BqFeCgF_CmFeCoFmCmFoCmFsCkFyCgFwCeFyCiFaD_F_DcFaDk_Aam@iFeD}E{CiF}CoFwCeFkCyFoCqF_CkFwBsFsB{FoBsFeB}FaBwF}AsG{AqFiA_GiA}F_AcGu@aGu@qBUcIq@gGa@cG[gGSgGMaGGiGAoGD_GLeGTeGZgG^eGh@_Gj@_Gt@}Fz@gAPcBXuFbA{FhAmEbAqCt@uBj@}GpByFfByFnBwFrBqFxBmF~BqFhCmFlCeFnCkFvCsMlHqy@xd@{_DxfB\"},{\"ref\":\"I 380 East\",\"mode\":\"driving\",\"weight\":123.305,\"distance\":2539.999,\"geometry\":\"}kiwfAv`kohFskA|f@mLtFkXjMik@vWuFdC{B`A{B|@}Bx@yBp@_Cn@wBh@aCd@kAReDd@qC\\\\qCVeCR{BHaCDmC@qCAsBE}BIwBKqBOmC[kC]}B_@mCi@wBe@cCq@qBi@_Cy@wBw@_CcAuB_A{BiAsBiAyBsAkBmAuB{A}AkAaBsAsBmB_CyB_BcBeBmB{AkBgB{BuAiBcB{ByAsB{AyBqDuFiDyFeDgG}CeG{CqGuCeGkRma@{D{JcEyK{\\\\qcAsFoPsLi^oX{w@wRwh@amAa~CaK}WoHsSgDsJmNea@iV}s@sFwP}EuPyE}QwDmQeDmRyCkScCeSiBcSqAkSi@sMs@_VQ_QCmPlA_n@HiCHsAfAoQlGogA~Bka@b@yI`AuTbBs_@t@eSb@aUD}QIeS\",\"duration\":97.596,\"driving_side\":\"right\",\"duration_typical\":101,\"weight_typical\":128.582,\"name\":\"Quentin L. Kopp Freeway\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"off ramp\",\"instruction\":\"Take exit 43B onto I 380 East toward US 101/San Francisco International Airport.\",\"modifier\":\"slight right\",\"bearing_after\":338,\"bearing_before\":333,\"location\":[-122.42742,37.622991]},\"speedLimitUnit\":\"mph\",\"destinations\":\"I 380 East, US 101: San Francisco International Airport\",\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"6B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 6B US 101 North\"},\"distanceAlongGeometry\":2539.999},{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"slight left\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"slight left\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"6B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 6B US 101 North\"},\"distanceAlongGeometry\":804.672}],\"exits\":\"43B\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 1.5 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 1.5 miles.\",\"distanceAlongGeometry\":2511.999},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to take exit 6B.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to take exit 6B.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to take exit 6B onto U.S. 1 o1 North toward San Francisco.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to take exit 6B onto U.S. 1 o1 North toward San Francisco.\",\"distanceAlongGeometry\":247.222}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,338],\"duration\":7.467,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.389,\"geometry_index\":4592,\"location\":[-122.42742,37.622991]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":1.914,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.201,\"geometry_index\":4594,\"location\":[-122.428182,37.624432]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":5.887,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.771,\"geometry_index\":4595,\"location\":[-122.428412,37.624838]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,351],\"duration\":1.35,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.553,\"geometry_index\":4605,\"location\":[-122.429067,37.626145]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[172,358],\"duration\":16.082,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":18.494,\"geometry_index\":4609,\"location\":[-122.429123,37.626441]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.426673,37.629347],\"geometry_index\":4652,\"admin_index\":0,\"weight\":8.846,\"is_urban\":true,\"turn_weight\":7,\"duration\":1.578,\"bearings\":[58,235],\"out\":0,\"in\":1,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[61,239],\"duration\":5.324,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.256,\"geometry_index\":4654,\"location\":[-122.426278,37.629539]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.424901,37.630139],\"geometry_index\":4656,\"admin_index\":0,\"weight\":24.244,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":20.211,\"bearings\":[61,241],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[60,240],\"duration\":0.697,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.855,\"geometry_index\":4662,\"location\":[-122.419548,37.632675]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[60,240],\"duration\":2.191,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.684,\"geometry_index\":4663,\"location\":[-122.419362,37.632759]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[61,240],\"duration\":3.188,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.904,\"geometry_index\":4664,\"location\":[-122.418815,37.633006]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.417968,37.633379],\"geometry_index\":4665,\"admin_index\":0,\"weight\":13.408,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":10.545,\"bearings\":[62,241],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.414961,37.634154],\"geometry_index\":4675,\"admin_index\":0,\"weight\":2.084,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.328,\"bearings\":[85,263],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[88,265],\"duration\":4.539,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.447,\"geometry_index\":4676,\"location\":[-122.414593,37.63418]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[98,274],\"duration\":1.408,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.691,\"geometry_index\":4679,\"location\":[-122.413274,37.634152]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.412867,37.634106],\"geometry_index\":4682,\"admin_index\":0,\"weight\":4.943,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":4.127,\"bearings\":[98,279],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[98,278],\"duration\":2.561,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.072,\"geometry_index\":4683,\"location\":[-122.411707,37.633971]},{\"bearings\":[97,278],\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"geometry_index\":4685,\"location\":[-122.410984,37.633889]}]},{\"ref\":\"US 101 North\",\"mode\":\"driving\",\"weight\":715.219,\"distance\":15895.994,\"geometry\":\"em~wfAxufnhFCmOWkOg@oPq@aNyAsQoBcQmCkSgCuPcDaQ{E_U{DsOiDoL{DsLkFwLoFqKsFmJiGuIkIyIeIeHuIsFqJwEcJeD_LoC}JkAcKg@cL@eJj@iK|A}JfCcKrDyQnIabBhw@cPbHsJ|D}JlDaLxCcNbDoj@bIw_AhReI`@iGVamA|EmrDtNykArE{l@bC_ZjAct@vCyRx@ePn@i_ApDgXbA}eAdE}FRuBFaPLqOCuOQcN_@eNu@aNgAyOaBuM_B_P{B{NkCwOcD{NyDkNuE}NyFslAyf@_\\\\{M_NaGaNiGiMuGoLkH_MgIuL}IoN{L_MiLeLyLeMkOaKeNgJaNqJoOgIyN}oBcoDuIuOkIwN}ImOsIwN_JqNeJyM{IcMeKgN}JgMsJoLwLaNuKsLeKyKuKoKyKiKmf@}c@wy@sw@ogCabCgLkKiLwJkLuJyLqJwLkJ{LcJ{L{I}LsIcMkIeMcIiM}HmMuHoMmH{MiHyLiGeFiCgEuB_NuG_NiGaNeGaNyFkNuFeNkFcDkA{JkDkNyEsNsEuNgEyNwD}NcD}NiCeOwBeOaBgOkAiOy@kOc@mOQoOBmOXgOj@cOdAiOtAuOjBgOvBeOlBq_@nEc_@jEm_@rEe_@bFc_@fFgrJtrAyoBnXupD|f@opAfQugEll@_pD|f@mxDxh@u_BxTk_@jFc_@hFe_@jFk_@fFaTrC{InA_U~CkMdBc\\\\pEw\\\\pEes@xJc_@jFwSvCoFx@kGhAiGlAoFjAkG|AcG|A}F~AmF|AuFfBqFlB_GxByF`CqFfCkFjCsFrCiFvCiF|C_FbDcFhDyEfDaFrDqEjDsv@vm@qLfJwEpDyEdDeFlD}E|CeFxCiFvCgFnCqFlC_GnCwF|BgFrBsFrB}FrB{ExA}FbByFxA_GxA}FnA}FfAeGfAogBvZkCd@yj@xJyj@rMgRdE{ObCyf@lLo^dLctAdb@}XdIwAZa~@jT_b@jMoEdAwfCtq@iExAgxAzf@eQ~I{tBd_AoUnJeSrIoRzIu[lOgBv@kNpGsOpHma@zSeOlHgaAxg@uVvMqMdGiLlFgNtFyM`FwLrDoNrDcObDqOpCuOzBoMxA_O`AyOp@qKR{NFwPWqUqA}P}AgOiBeOuCgP{DyMsDuNmEcOaG_MeGqO}IuMsI}LwJc`Ayu@sMqJ{NiIcMkGaO}FsFwB}FuBuFkByFcBaG}AiGsA{FmAyFkA_GmAaGoAa_AcSeiAuVujBga@e`A}SuFmAoGsA_GkA_GeA_G_AcGw@iGs@cGm@}Fc@kGa@mGY{FSyGM{FEqGAcGDeGLwOj@sx@nDuxApGcG\\\\oGh@yFj@yG|@{F`A{FpAyF~AsFjBsF|BmFjCqF|CeFhDyErDyEdEoEnEyEpF{D|EyDfFuDlFsDvFmDrFoDxFkDpFuD|FqDjF{DlF}DfF_EtEcEhEqEdE_FzD}EfDgFzCaFfC{FbCqFlBwF~A}FnAyF~@_Gp@cG`@iGNeG@wFMkG[_Gm@{F}@iGqAuF{AuFkBqFyBqFaCiFeCkFoC}FaDwEkCqF{CkFsCoFqCoFgCsFcCuFwBiGuBgF}AgG}A_GoAcGgAaGy@qAOwDa@eGg@gGc@sG]wMk@\",\"duration\":634.688,\"driving_side\":\"right\",\"duration_typical\":638.385,\"weight_typical\":720.746,\"name\":\"\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to take exit 6B onto US 101 North toward San Francisco.\",\"modifier\":\"slight right\",\"bearing_after\":89,\"bearing_before\":89,\"location\":[-122.408813,37.633763]},\"speedLimitUnit\":\"mph\",\"destinations\":\"US 101 North: San Francisco\",\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Golden Gate Bridge\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Golden Gate Bridge\"},\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Ninth Street\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Ninth Street\"},\"distanceAlongGeometry\":15895.994},{\"sub\":{\"components\":[{\"active_direction\":\"slight left\",\"active\":true,\"directions\":[\"slight left\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight left\",\"active\":true,\"directions\":[\"slight left\",\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Golden Gate Bridge\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Golden Gate Bridge\"},\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Ninth Street\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Ninth Street\"},\"distanceAlongGeometry\":1609.344}],\"exits\":\"6B\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 10 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 10 miles.\",\"distanceAlongGeometry\":15867.994},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Keep left to stay on U.S. 1 o1 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Keep left to stay on U.S. 1 o1 North.\",\"distanceAlongGeometry\":1609.344},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to stay on U.S. 1 o1 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to stay on U.S. 1 o1 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to stay on U.S. 1 o1 North toward Golden Gate Bridge.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to stay on U.S. 1 o1 North toward Golden Gate Bridge.\",\"distanceAlongGeometry\":213.333}],\"intersections\":[{\"lanes\":[{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.408813,37.633763],\"geometry_index\":4691,\"admin_index\":0,\"weight\":10.09,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"duration\":8.594,\"bearings\":[89,269],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[68,250],\"duration\":7.074,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":8.135,\"geometry_index\":4700,\"location\":[-122.406281,37.634144]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[45,230],\"duration\":14.568,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":16.752,\"geometry_index\":4707,\"location\":[-122.404625,37.634887]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":7.721,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.07,\"geometry_index\":4722,\"location\":[-122.404087,37.637748]},{\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"location\":[-122.404988,37.639333],\"geometry_index\":4723,\"admin_index\":0,\"weight\":15.215,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":12.531,\"bearings\":[156,337],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.405946,37.642167],\"geometry_index\":4730,\"admin_index\":0,\"weight\":14.424,\"is_urban\":true,\"turn_weight\":7,\"duration\":6.33,\"bearings\":[167,355],\"out\":1,\"in\":0,\"turn_duration\":0.011,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.406086,37.643712],\"geometry_index\":4733,\"admin_index\":0,\"weight\":19.727,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":16.795,\"bearings\":[176,356],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":3.012,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.539,\"geometry_index\":4735,\"location\":[-122.406443,37.647812]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.406509,37.648546],\"geometry_index\":4736,\"admin_index\":0,\"weight\":2.615,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.807,\"bearings\":[176,356],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":3.639,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.275,\"geometry_index\":4737,\"location\":[-122.406547,37.648978]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":1.326,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.559,\"geometry_index\":4738,\"location\":[-122.406623,37.649828]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":1.199,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.41,\"geometry_index\":4739,\"location\":[-122.406652,37.650145]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.406676,37.65042],\"geometry_index\":4740,\"admin_index\":0,\"weight\":5.23,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":4.459,\"bearings\":[176,356],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":1.779,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.092,\"geometry_index\":4741,\"location\":[-122.406765,37.651449]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":6.453,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.422,\"geometry_index\":4742,\"location\":[-122.406799,37.651853]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[177,359],\"duration\":8.641,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.936,\"geometry_index\":4745,\"location\":[-122.406912,37.653174]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[10,189],\"duration\":12.049,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":13.555,\"geometry_index\":4753,\"location\":[-122.406732,37.655209]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.405556,37.658],\"geometry_index\":4760,\"admin_index\":0,\"weight\":14.637,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":12.859,\"bearings\":[22,202],\"out\":0,\"in\":1,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.40351,37.660743],\"geometry_index\":4771,\"admin_index\":0,\"weight\":38.076,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":36.271,\"bearings\":[45,222],\"out\":0,\"in\":1,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[37,217],\"duration\":4.855,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":4.971,\"geometry_index\":4792,\"location\":[-122.395605,37.666712]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.394699,37.667652],\"geometry_index\":4793,\"admin_index\":0,\"weight\":11.203,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.211,\"bearings\":[37,217],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.392602,37.669836],\"geometry_index\":4794,\"admin_index\":0,\"weight\":16.117,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":16.537,\"bearings\":[36,217],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[25,205],\"duration\":7.387,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":7.018,\"geometry_index\":4810,\"location\":[-122.389996,37.673302]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[20,201],\"duration\":17.641,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":16.758,\"geometry_index\":4818,\"location\":[-122.38913,37.674935]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[174,353],\"duration\":64.453,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":61.211,\"geometry_index\":4835,\"location\":[-122.388355,37.679244]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":25.09,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.836,\"geometry_index\":4848,\"location\":[-122.391787,37.694766]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.393153,37.700809],\"geometry_index\":4850,\"admin_index\":0,\"weight\":25.164,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":25.17,\"bearings\":[170,350],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":3.645,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.729,\"geometry_index\":4855,\"location\":[-122.394524,37.70687]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":2.25,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.307,\"geometry_index\":4857,\"location\":[-122.394714,37.707725]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":0.975,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1,\"geometry_index\":4859,\"location\":[-122.394834,37.708251]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":2.119,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.174,\"geometry_index\":4860,\"location\":[-122.394885,37.708481]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":8.24,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.445,\"geometry_index\":4861,\"location\":[-122.39499,37.708947]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":1.439,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.512,\"geometry_index\":4864,\"location\":[-122.395402,37.710772]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.395478,37.711104],\"geometry_index\":4865,\"admin_index\":0,\"weight\":7.078,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":6.76,\"bearings\":[170,349],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,336],\"duration\":5.592,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.871,\"geometry_index\":4877,\"location\":[-122.396043,37.712618]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,326],\"duration\":4.557,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.898,\"geometry_index\":4887,\"location\":[-122.396837,37.713766]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[146,327],\"duration\":10.578,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.363,\"geometry_index\":4888,\"location\":[-122.397585,37.714656]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,347],\"duration\":8.961,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.857,\"geometry_index\":4906,\"location\":[-122.398893,37.716892]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.399449,37.718949],\"geometry_index\":4910,\"admin_index\":0,\"weight\":0.869,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":0.334,\"bearings\":[168,348],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,348],\"duration\":3.131,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.521,\"geometry_index\":4911,\"location\":[-122.399468,37.719019]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,345],\"duration\":3.102,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.49,\"geometry_index\":4912,\"location\":[-122.399657,37.71972]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,346],\"duration\":13.711,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":15.768,\"geometry_index\":4913,\"location\":[-122.399891,37.720421]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[162,343],\"duration\":1.801,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.115,\"geometry_index\":4918,\"location\":[-122.401045,37.723502]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[163,346],\"duration\":0.188,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.221,\"geometry_index\":4919,\"location\":[-122.401208,37.723917]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,345],\"duration\":4.35,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.111,\"geometry_index\":4920,\"location\":[-122.401222,37.723961]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.401564,37.72497],\"geometry_index\":4921,\"admin_index\":0,\"weight\":14.541,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":12.396,\"bearings\":[165,342],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,341],\"duration\":0.475,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.57,\"geometry_index\":4924,\"location\":[-122.40264,37.727806]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":8.199,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.84,\"geometry_index\":4925,\"location\":[-122.402685,37.727907]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.403499,37.729626],\"geometry_index\":4927,\"admin_index\":0,\"weight\":10.871,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":9.068,\"bearings\":[154,337],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,338],\"duration\":7.24,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.869,\"geometry_index\":4928,\"location\":[-122.404526,37.731512]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":2.453,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.004,\"geometry_index\":4933,\"location\":[-122.405345,37.733018]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,334],\"duration\":3.955,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.846,\"geometry_index\":4935,\"location\":[-122.405635,37.73353]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.40612,37.73434],\"geometry_index\":4937,\"admin_index\":0,\"weight\":9.609,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":7.863,\"bearings\":[155,334],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":8.922,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.93,\"geometry_index\":4940,\"location\":[-122.40714,37.736012]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,351],\"duration\":3.363,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.119,\"geometry_index\":4948,\"location\":[-122.407892,37.737964]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.407995,37.738721],\"geometry_index\":4951,\"admin_index\":0,\"weight\":4.91,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":3.607,\"bearings\":[176,358],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[5,182],\"duration\":1.674,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.051,\"geometry_index\":4954,\"location\":[-122.407997,37.73946]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[7,185],\"duration\":5.209,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.381,\"geometry_index\":4955,\"location\":[-122.407956,37.739821]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.407687,37.740903],\"geometry_index\":4959,\"admin_index\":0,\"weight\":25.506,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":20.422,\"bearings\":[17,195],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.405094,37.744858],\"geometry_index\":4973,\"admin_index\":0,\"weight\":17.783,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":14.539,\"bearings\":[19,201],\"out\":0,\"in\":1,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[14,194],\"duration\":7.748,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":9.49,\"geometry_index\":4983,\"location\":[-122.404044,37.748088]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[14,194],\"duration\":26.666,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":32.666,\"geometry_index\":4984,\"location\":[-122.403496,37.749811]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.402861,37.753345],\"geometry_index\":5003,\"admin_index\":0,\"weight\":6.988,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":5.305,\"bearings\":[176,356],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":48.086,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":58.904,\"geometry_index\":5004,\"location\":[-122.402949,37.754267]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.405894,37.761785],\"geometry_index\":5058,\"admin_index\":0,\"weight\":13.424,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.967,\"bearings\":[26,204],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"bearings\":[9,193],\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"geometry_index\":5072,\"location\":[-122.405023,37.763501]}]},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Keep right to take exit 4 34A.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Keep right to take exit 4 34A.\",\"distanceAlongGeometry\":1373.333},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to take exit 4 34A.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to take exit 4 34A.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to take exit 4 34A onto U.S. 1 o1 North, Duboce Avenue toward Duboce Avenue, Golden Gate Bridge.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to take exit 4 34A onto U.S. 1 o1 North, Duboce Avenue toward Duboce Avenue, Golden Gate Bridge.\",\"distanceAlongGeometry\":275.556}],\"intersections\":[{\"lanes\":[{\"indications\":[\"slight left\"],\"valid_indication\":\"slight left\",\"valid\":true,\"active\":true},{\"indications\":[\"slight left\",\"straight\"],\"valid_indication\":\"slight left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"location\":[-122.404894,37.7644],\"geometry_index\":5079,\"admin_index\":0,\"weight\":37.16,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":30.363,\"bearings\":[184,358],\"out\":1,\"in\":0,\"turn_duration\":0.028,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.406891,37.769019],\"geometry_index\":5105,\"admin_index\":0,\"weight\":16.037,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":13.113,\"bearings\":[134,311],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[59,231],\"duration\":10.691,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.096,\"geometry_index\":5127,\"location\":[-122.409187,37.769736]},{\"bearings\":[95,274],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5142,\"location\":[-122.411291,37.7695]}],\"bannerInstructions\":[{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight right\",\"active\":true,\"directions\":[\"straight\",\"slight right\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Duboce Avenue\"},{\"type\":\"text\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden Gate Bridge\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Duboce Avenue / Golden Gate Bridge\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"434A\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Duboce Avenue\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 434A US 101 North / Duboce Avenue\"},\"distanceAlongGeometry\":1400}],\"destinations\":\"Ninth Street, Golden Gate Bridge, Civic Center\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to stay on US 101 North toward Golden Gate Bridge.\",\"modifier\":\"slight left\",\"bearing_after\":358,\"bearing_before\":4,\"location\":[-122.404894,37.7644]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":151.717,\"duration_typical\":123.498,\"duration\":73.725,\"distance\":1400,\"driving_side\":\"right\",\"weight\":90.742,\"mode\":\"driving\",\"ref\":\"US 101 North\",\"geometry\":\"_r}_gAz`_nhFao@~@aGL_GPgGVwEToCPewA`J_CP}BT_CXaC^eCh@aCp@aCx@}B`A{BhAiBfAyA~@oA~@kA`AsAlAoApAkAnAgCzCgCjDwt@peAoD|F{C|E}D|GoDrGcOhXwCrFaCbFgAjC}@nCy@`Di@|C]`DQdDElCBlCNzCTjC`@nCj@bC~@~CnAdDtA|CnBpDnBnDhBjDhB~DbB`F`ApEd@jERjE?nEKbFc@hLSxEQlEs@zTq@rS{@t_@MvIUjTsCd~DYbT\"},{\"ref\":\"US 101 North\",\"mode\":\"driving\",\"weight\":151.482,\"distance\":334,\"geometry\":\"eyg`gAxetnhFqC~ZiA|LqA|LqArLwAxLkArLwAlPwF|r@{Dnf@uBrY\",\"duration\":123.672,\"driving_side\":\"right\",\"duration_typical\":57.27,\"weight_typical\":70.141,\"name\":\"\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to take exit 434A onto US 101 North/Duboce Avenue/Mission Street toward Duboce Avenue/Golden Gate Bridge.\",\"modifier\":\"slight right\",\"bearing_after\":282,\"bearing_before\":273,\"location\":[-122.415725,37.769635]},\"speedLimitUnit\":\"mph\",\"destinations\":\"US 101 North: Duboce Avenue, Mission Street, Duboce Avenue, Golden Gate Bridge, Mission Street\",\"bannerInstructions\":[{\"sub\":{\"components\":[{\"type\":\"text\",\"text\":\"Duboce Avenue\"}],\"type\":\"turn\",\"modifier\":\"straight\",\"text\":\"Duboce Avenue\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"434A\"},{\"type\":\"text\",\"text\":\"Duboce Avenue\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Exit 434A Duboce Avenue\"},\"distanceAlongGeometry\":334}],\"exits\":\"434A\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a quarter mile, Keep left to take exit 4 34A.</prosody></amazon:effect></speak>\",\"announcement\":\"In a quarter mile, Keep left to take exit 4 34A.\",\"distanceAlongGeometry\":307.333},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take exit 4 34A toward Duboce Avenue. Then Continue on Duboce Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take exit 4 34A toward Duboce Avenue. Then Continue on Duboce Avenue.\",\"distanceAlongGeometry\":188.889}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[93,282],\"duration\":86.053,\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":false}],\"turn_duration\":0.013,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":105.398,\"geometry_index\":5147,\"location\":[-122.415725,37.769635]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"entry\":[false,true],\"in\":0,\"bearings\":[101,281],\"duration\":20.52,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":25.137,\"geometry_index\":5155,\"location\":[-122.418386,37.770077]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"bearings\":[101,280],\"entry\":[false,true],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5156,\"location\":[-122.419018,37.770171]}]},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue on Duboce Avenue for a half mile.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue on Duboce Avenue for a half mile.\",\"distanceAlongGeometry\":42}],\"intersections\":[{\"bearings\":[100,270],\"entry\":[false,true],\"in\":0,\"turn_duration\":0.038,\"mapbox_streets_v8\":{\"class\":\"secondary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5157,\"location\":[-122.419444,37.77023]}],\"exits\":\"434A\",\"bannerInstructions\":[{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Duboce Avenue\"}],\"type\":\"turn\",\"modifier\":\"straight\",\"text\":\"Duboce Avenue\"},\"distanceAlongGeometry\":42}],\"destinations\":\"Duboce Avenue\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take exit 434A toward Duboce Avenue.\",\"modifier\":\"slight left\",\"bearing_after\":270,\"bearing_before\":280,\"location\":[-122.419444,37.77023]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":9.748,\"duration_typical\":7.996,\"duration\":12.639,\"distance\":42,\"driving_side\":\"right\",\"weight\":15.436,\"mode\":\"driving\",\"geometry\":\"k~h`gAfn{nhFC|KF|CVtCd@tE\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a quarter mile, Turn left onto Waller Street.</prosody></amazon:effect></speak>\",\"announcement\":\"In a quarter mile, Turn left onto Waller Street.\",\"distanceAlongGeometry\":402.336},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn left onto Waller Street.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn left onto Waller Street.\",\"distanceAlongGeometry\":50}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[80,251],\"duration\":4.848,\"turn_weight\":3.5,\"turn_duration\":2.036,\"mapbox_streets_v8\":{\"class\":\"secondary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.566,\"geometry_index\":5161,\"location\":[-122.419912,37.770197]},{\"entry\":[false,true],\"in\":0,\"bearings\":[71,265],\"duration\":16.256,\"turn_weight\":7,\"turn_duration\":2.019,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":24.439,\"geometry_index\":5162,\"location\":[-122.420176,37.770126]},{\"entry\":[false,true],\"in\":0,\"bearings\":[69,259],\"duration\":4.443,\"turn_weight\":0.5,\"turn_duration\":0.014,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.928,\"geometry_index\":5165,\"location\":[-122.421134,37.769989]},{\"entry\":[false,true],\"in\":0,\"bearings\":[80,262],\"duration\":1.393,\"turn_weight\":0.5,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.195,\"geometry_index\":5168,\"location\":[-122.421488,37.769937]},{\"entry\":[false,true],\"in\":0,\"bearings\":[82,265],\"duration\":17.494,\"turn_weight\":0.5,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":21.92,\"geometry_index\":5169,\"location\":[-122.421601,37.769924]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":7.734,\"turn_weight\":2,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.016,\"geometry_index\":5171,\"location\":[-122.422368,37.769874]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":6.307,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.217,\"geometry_index\":5172,\"location\":[-122.422762,37.76985]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":10.447,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.289,\"geometry_index\":5173,\"location\":[-122.42316,37.769827]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,265],\"duration\":1.164,\"turn_weight\":0.5,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.902,\"geometry_index\":5174,\"location\":[-122.423821,37.769788]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,266],\"duration\":0.818,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.502,\"geometry_index\":5175,\"location\":[-122.423899,37.769783]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":7.527,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.721,\"geometry_index\":5176,\"location\":[-122.423955,37.76978]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.424477,37.769749],\"geometry_index\":5177,\"admin_index\":0,\"weight\":3.203,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":0.007,\"turn_weight\":2,\"duration\":0.988,\"bearings\":[86,266],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"location\":[-122.424542,37.769745],\"geometry_index\":5178,\"admin_index\":0,\"weight\":3.533,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":2.019,\"turn_weight\":2,\"duration\":3.271,\"bearings\":[86,265],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"location\":[-122.424637,37.769739],\"geometry_index\":5179,\"admin_index\":0,\"weight\":3.176,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":2.008,\"turn_weight\":2,\"duration\":2.969,\"bearings\":[85,266],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,265],\"duration\":1.459,\"turn_weight\":2,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.764,\"geometry_index\":5180,\"location\":[-122.424726,37.769734]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,266],\"duration\":1.688,\"turn_weight\":0.5,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.559,\"geometry_index\":5181,\"location\":[-122.424866,37.769725]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":0.48,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.088,\"geometry_index\":5182,\"location\":[-122.425028,37.769716]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":4.057,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.461,\"geometry_index\":5183,\"location\":[-122.425078,37.769713]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,265],\"duration\":1.65,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.521,\"geometry_index\":5184,\"location\":[-122.425382,37.769695]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,266],\"duration\":1.334,\"turn_weight\":0.5,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.125,\"geometry_index\":5185,\"location\":[-122.425508,37.769687]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":2.707,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.807,\"geometry_index\":5186,\"location\":[-122.425584,37.769683]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":2.887,\"turn_weight\":2,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.527,\"geometry_index\":5187,\"location\":[-122.425749,37.769673]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"left\",\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.425975,37.769659],\"geometry_index\":5188,\"admin_index\":0,\"weight\":4.469,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":0.007,\"turn_weight\":2,\"duration\":2.023,\"bearings\":[86,266],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"left\",\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.426132,37.76965],\"geometry_index\":5189,\"admin_index\":0,\"weight\":5.123,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":2.019,\"turn_weight\":2,\"duration\":4.568,\"bearings\":[86,265],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,265],\"duration\":3.088,\"turn_weight\":2,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.322,\"geometry_index\":5193,\"location\":[-122.426329,37.769637]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,275],\"duration\":3.529,\"turn_weight\":7,\"turn_duration\":2.014,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.857,\"geometry_index\":5194,\"location\":[-122.426399,37.769632]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,290],\"duration\":0.777,\"turn_weight\":2,\"turn_duration\":0.02,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.928,\"geometry_index\":5196,\"location\":[-122.426493,37.769639]},{\"entry\":[false,true],\"in\":0,\"bearings\":[110,332],\"duration\":8.072,\"turn_weight\":2,\"turn_duration\":0.115,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.748,\"geometry_index\":5198,\"location\":[-122.426539,37.769652]},{\"entry\":[false,true],\"in\":0,\"bearings\":[171,351],\"duration\":14.211,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":17.908,\"geometry_index\":5202,\"location\":[-122.426664,37.770005]},{\"bearings\":[171,351],\"entry\":[false,true],\"in\":0,\"turn_weight\":2,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5203,\"location\":[-122.426797,37.770667]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Waller Street\"}],\"type\":\"turn\",\"modifier\":\"left\",\"text\":\"Waller Street\"},\"distanceAlongGeometry\":811}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"new name\",\"instruction\":\"Continue on Duboce Avenue.\",\"modifier\":\"straight\",\"bearing_after\":265,\"bearing_before\":260,\"location\":[-122.419912,37.770197]},\"speedLimitSign\":\"mutcd\",\"name\":\"Duboce Avenue\",\"weight_typical\":203.807,\"duration_typical\":144.416,\"duration\":156.199,\"distance\":811,\"driving_side\":\"right\",\"weight\":218.865,\"mode\":\"driving\",\"geometry\":\"i|h`gAnk|nhFlCnOf@dR`Cxa@fBzDd@lF`@fF^lFX`FRtFnAfg@n@rWl@zWlAhh@HzCDnB|@r_@F`CJ|DHpDPvGPbIDbBb@~QNzFFvCRhIZbMPxHF|BBj@LxE?DHjC@vBObAO`AIXK^eA`AqAj@}OjBkh@hGiy@xJ\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for a half mile.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for a half mile.\",\"distanceAlongGeometry\":766.578},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a quarter mile, Your destination will be on the right.</prosody></amazon:effect></speak>\",\"announcement\":\"In a quarter mile, Your destination will be on the right.\",\"distanceAlongGeometry\":402.336},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Your destination is on the right.</prosody></amazon:effect></speak>\",\"announcement\":\"Your destination is on the right.\",\"distanceAlongGeometry\":41.667}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[171,261],\"duration\":28.141,\"turn_weight\":12.5,\"turn_duration\":5.395,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":40.363,\"geometry_index\":5204,\"location\":[-122.426986,37.7716]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,260],\"duration\":1.166,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.402,\"geometry_index\":5205,\"location\":[-122.428548,37.771401]},{\"entry\":[false,true],\"in\":0,\"bearings\":[80,261],\"duration\":1.164,\"turn_weight\":2,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.418,\"geometry_index\":5206,\"location\":[-122.428629,37.77139]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":5.164,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.301,\"geometry_index\":5207,\"location\":[-122.428727,37.771378]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":15.277,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.189,\"geometry_index\":5208,\"location\":[-122.42918,37.77132]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.564,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.891,\"geometry_index\":5209,\"location\":[-122.430175,37.771193]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.656,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.004,\"geometry_index\":5210,\"location\":[-122.430273,37.771181]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":20.967,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":27.658,\"geometry_index\":5211,\"location\":[-122.430386,37.771167]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.33,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.604,\"geometry_index\":5212,\"location\":[-122.431827,37.770983]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.656,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.004,\"geometry_index\":5213,\"location\":[-122.431921,37.770971]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":10.33,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.629,\"geometry_index\":5214,\"location\":[-122.432038,37.770956]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":12.336,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":15.586,\"geometry_index\":5215,\"location\":[-122.432741,37.770866]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.537,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.857,\"geometry_index\":5216,\"location\":[-122.43347,37.770773]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.268,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.527,\"geometry_index\":5217,\"location\":[-122.433563,37.770762]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":9.297,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.363,\"geometry_index\":5218,\"location\":[-122.433669,37.770748]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":10.479,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.049,\"geometry_index\":5219,\"location\":[-122.434422,37.770652]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.564,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.852,\"geometry_index\":5220,\"location\":[-122.435104,37.770565]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.916,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.273,\"geometry_index\":5221,\"location\":[-122.435207,37.770552]},{\"bearings\":[81,261],\"entry\":[false,true],\"in\":0,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5222,\"location\":[-122.435315,37.770538]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Your destination will be on the right\"}],\"type\":\"arrive\",\"modifier\":\"right\",\"text\":\"Your destination will be on the right\"},\"distanceAlongGeometry\":776.578},{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Your destination is on the right\"}],\"type\":\"arrive\",\"modifier\":\"right\",\"text\":\"Your destination is on the right\"},\"distanceAlongGeometry\":41.667}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"turn\",\"instruction\":\"Turn left onto Waller Street.\",\"modifier\":\"left\",\"bearing_after\":261,\"bearing_before\":351,\"location\":[-122.426986,37.7716]},\"speedLimitSign\":\"mutcd\",\"name\":\"Waller Street\",\"weight_typical\":200.061,\"duration_typical\":133.574,\"duration\":133.574,\"distance\":776.578,\"driving_side\":\"right\",\"weight\":200.061,\"mode\":\"driving\",\"geometry\":\"_tk`gArejohFlKr`BT`DVbErBh[|Fd}@VbEZ`FnJ`yAVzD\\\\hFrD|j@xDpl@TxDZrE~D`n@lDri@XlEZvEdB|W\"},{\"voiceInstructions\":[],\"intersections\":[{\"bearings\":[81],\"entry\":[true],\"in\":0,\"admin_index\":0,\"geometry_index\":5223,\"location\":[-122.435714,37.770487]}],\"bannerInstructions\":[],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"arrive\",\"instruction\":\"Your destination is on the right.\",\"modifier\":\"right\",\"bearing_after\":0,\"bearing_before\":261,\"location\":[-122.435714,37.770487]},\"speedLimitSign\":\"mutcd\",\"name\":\"Waller Street\",\"weight_typical\":0,\"duration_typical\":0,\"duration\":0,\"distance\":0,\"driving_side\":\"right\",\"weight\":0,\"mode\":\"driving\",\"geometry\":\"mni`gAbg{ohF??\"}],\"distance\":630864.75,\"summary\":\"I 5 North, CA 152\"}],\"geometry\":\"ona|_Adwyr`FDj`@}v@Eud@CyRJsEBBlM@~J?tCF|GArZAlHwF?yD?_H@}B?q@?wD@sK?mD?aE@wk@BgI?k_@@sG@aDAqUBgT@}J?aF@kH?o~@WgWCoQC{Y?qF?oU?a]Xo@@g[VkY?iC?}[?sa@?ic@?qc@?qfAJ_J@oA?gJ@{UBuA?_^BazALyO@oW@yW@aA?mS?g[?mK?_O?uI?q^DkYDiUBuF@aK@_D@oFHyEAeM@ea@@aR@sQ?o@?gF?qH?_NB{B?gJ@gD?qQ@wA@sZ@cG@iD?_Q@iSOoEGc@?cj@@uJHgC?}CEmNFwRFkMFsb@S_XBkUHkC?}[F{@?yPDmI@sIBsC@U?oIBeG?iDByE@cN?_G@{GAee@F{i@GeF?}FAqTW{A?kQBgD?cI@mE@ea@HuFB{G@mSH{DBc[PoEB}A?mA@_NHmFAyI?eC@cD@kJDeGD}A@}GBoDAyKA_OA{HA}L@]?iQ?sDGcEAwPDa@?gD?q\\\\CoFAoB?uI?oQ?aF?aF?eGAqSFcBBoE?_UBiJAqC@gC?oFAwJ?iA?_J@g[FqA?kk@?m@?}LBqKDoA@gE@{E?sAAqM@w^?yHJuj@Ie[CuAB{JBiSByOA_D?oUDaE?sFDmT?mVD}HBmRIeCBiQKgFBc[B}BDwYFeDFmKBsHBsbAFwDAuJ?iJ@E~G{@ze@]tJWdMc@bHu@`I_BxImAdGgB|GyBpHoBzHsKfc@cLf[iLz[}a@tiAcGdPkGpP}GvPuGbOqHhPuCvFyNzY{IrO_JzO_m@bbA{Vpa@mp@vfAMT{NlVuNdVaIlMwIbNyIjMeJzLeJ|K{J|KmKzKsL|KeLvJwKpIeM`JsLbIwLhHcMzGc|BdjAoM`HeMpGmMnHsLxHkLpIkLvJeL|KmJlKqJpLcJbMcIfMgIxNqeBpbDaIvNoH~LiJxNaJbM_KzMyJfLsKnLuKrKmK`K_KvIqKdIsLrI}L~HiMpH_MtG{MvG_gEnsBmNzH_M~HkLzIuKnJcKlKaKnLkJxL}IvMmHnMeHvNsGlO}FvO{Lb`@kDtR}ClQaClQiB`RqAvRq@~Q_@lRSvQIpOK`USzWa@tRu@bRqAdRuBxRoCtQeDdQ{CxMgDfMmDhLyD~KkE|KqEbKyHxOohAdzBoCnFmpAleC}L|VsT`e@}NhY}Xph@qH`NyH|MoIfNwItMiJnM_JdLaKdL_LjKyJdIgLjImLpHsMdHsLpF}MpFiNvEyMnDuMbDmyCjq@aOfDiNrCwMjCy_AhPwNtCsO|CiN`D_O`EgN`EmNtE{NnFcNpF{MxFcNnGqMvGuMnHkMtHkMlIkMxIuLnIeLbJgLnJgLhK{KpKsK~KkK`LunC|gD_KzLyJ~KoJxJiK`JqL`JsYrRoLfHy\\\\zRwLtHuLlIsLnJiLjKgLxKeMfMy{@v}@uM~McWnWiKfKo|@d~@_MnMsm@lo@wKfL}KdLiKtL_KhMiJ~MeIpMeI~NmHnOwGfPoFlOuDxL}HtYuC|MeCbNeDpUeEz[}K`w@sJpk@{SdaAm]v}AkKna@iK|[mQl`@uR`]eZvd@gfApbBiMbSeLpQwd@lt@cIfMwIxM}I|MeJhMsIbLoIvJ_KbKqLxJiK`IeLxH_MtH_NlHkMjGsMfF}qBrq@mNjF_UlIy]nLaQpGyKzEwNxGuMhIwNpKoKjJ_K`KiFfFyJhLwJhMkIxLkRxZiQxXag@dw@kb@jr@wIzM}KhQwNhP_S|QcK|I_m@zb@oNhKo`@tX_aEl|C}q@rf@y^hUoZbPij@`XkMxF_bAr^}S|F_aAn[{`Af\\\\cUlHgT|HsiAr`@}wCvaAqZzJqhCp{@wl@|UuFzCqK|FsT~NcI`G}AbAk]t[gOxN_UdWqObR_MnR}o@veAkVbc@oN|V{[xi@mcAzdBiUz^kNtR{Zx^{VhVuz@hn@oZ`QgTbKwU|JmgCp`A}[hO}\\\\bQaPlJsYjRyP`Nsd@fb@gT~TwsB~kCoPpQyQnPiR~NgS|MySjLqS`KiTlI{RhGwZlHeSrDuUlCocCxPwzFn`@wXlBsvAzJs{@bFkVvAqjCzQkVlBuUnBaUvCkVrEoUtE{[xI}`@bNubAvb@orAng@i\\\\|Lok@jQs[bJcd@`Ki[pG{pOboCoWpEagDtk@}oDbp@wYbFu~B`b@}d@`H{RxA_RZmTh@gT?ka@}AkYuCm_@oGo_@yJeT{Gsd@sL}nAyd@gTaFkQsCgUuBw`@YcQf@g_@zDuTzE_RxFyNhFyTbLmNzIgQxNkPlNelDppEudA`nAsVjb@aRbS_yD`gEcmBpvBuu@vt@uT`Vic@re@}_BdfBomC~tCslA~pAyRzSwiClsCyrBv{Bu~AfdBmTxUihDhrDml@tn@sYr[kSpRkPnMuPbM}V`Pqm@`^oV|MmxA|w@uYzOkm@v\\\\um@nb@oU|P{_@f^eRnSkZ|\\\\goA`uA_f@`h@oKhLeLlLkTlRePnNiTbOiz@pj@kl@p^qYrRoUxP{\\\\~Wue@td@mb@fe@_jAdnAaS`Ua|@v_Auc@xc@oZfUk^tSoV~L}dDdbBop@|a@wi@xd@gS~SkThXiN|RuU|^m|BdoEi\\\\vl@g[nc@gSjUen@|n@{sBjsBef@re@kbId`IonE~lEgPdPyc@rc@q{B|vBoQtPo{DjpDamAxjA_@^mt@hq@au@vo@uyCnrBgrB`sAgm@fa@}u@jg@{[nSqNpJe\\\\bTcf@h`@ya@|^ue@jg@eZf^}QtV{^xi@sJpPkMrTgJdQkaAfrBqdArwBkqAhmCiRr^iOrWuNhTeStXsg@`h@wa@l^oFnDuXrRuW`Osb@vRehAxb@srDfwAu\\\\lNiOxHmNfIwM|HwMvK_L~H{LbLmMfLgYvXyKfM}JdMgIxKgJnN}JlOiIhNykAxrBmIbOmK~RcJjQ{HbPgH`P{HxQgb@liAuqBpiF}IbVeJ~Y{GdVsG`X}FxYwEbYuDbZsCrW{BpVyTrcDgBrToCzV}CzUgDbUqFtXkGxXkKl^_JxW_JxVaNjZuNdZw]|j@{b@ri@of@jd@kd@t`@a]~\\\\aVbZmSjYiRl[{Pz[aPr^iNn_@kU~v@saCvsIov@llCkq@raCsMv_@oNn\\\\gTjb@aVb^qQtWyxFppGm^jZoi@p]ea@dTo]~NeOxEcK`DkiAvTweAnW{`@|IaoAl[}i@vQc\\\\xO_]rPelFxwDgzIv}EgpIfrEePxFurExxAmhBdk@qd@hMocBfg@acAjZivBnWugHvgAevBzZarBlZkn@nMuc@|L}p@dUgrE~|Ag|D~tAasBfr@agBvn@oWtIyUnHuV`H}V|GqnA|\\\\_YfIuZ~IcYdJkZlKoZdLkoD|zAucFfxB}o@tXglApg@_{Ado@{XtLwxA~m@}WbLsSxIiNtG}MnHcLlH{LrIcLvIoMxKsMnLaMrLeMhNmRvTqxBjmCcuGpfIae@`m@qQbWkPxV}NpViNfWaNxX}MvYoc@bdAm|EpiLcXto@wTzh@cMbYeM|ViMzTsMrSwOnTkPpRiOtR{KhJmAnAaY|S}QdNmgEzyCoQfMcSpMuQ`KsRdJuVxKgTzHyTdH{VvGwX`GkVdEmV~C{UnBqWrAsWt@oYUuT@sWgAaXsBqWqC}pC_[}WwCeXeBqWu@qWOoXZiXrAeX|BuWhDqWzEeWdGsWtHyu@fUsVnG_WdFmW`EgT`CmW`BsWz@_WDsW_@{WqA}WiCkUsCw~NmrB_d@iE{d@aC_e@gAsb@?_e@jAmc@zBkc@lEm_@~E{b@dIgb@fK{a@xL{`@nNa^jOk]|Pe\\\\tQc[dSwj@f_@uzB|{AojDl_Cwa@zXanEhyCsZ~SwvAb`AgYlP_YvMc\\\\jM_]|Kmj@fQiY~JkXnLoXrMiUdN{RvMuWjTsLfKaW`VsShXedArrAwUxXcU|TcU|QaYdTkkCfeBq{CtuB{i@j\\\\qwG|vDsVxPuUtSgTvTsRnWcPbYgQd`@oYjx@oQzd@sMbY_QnYecAzyAcUbXcUbV_WnT}UlQqWbNmmTddIkXjMaWlOgRrN}BdB}U`TmSdUwQbWqUx^qVd]wQzRoPdOkS|Ogq@z`@kUvOcUvQqTnUoQlUwPjZkOjVkNdSsNpQsP~QyrCzbCoYdXuXxXc|Ap_BiRlTiRlV_OdUoNbVigA~oBmSb\\\\sRnY_TnX}UlXgWnVuUvR_iAt{@iWlPiWlM}X`KwY`I}ZjFw^jGkXvGsU~G}U`JeVlMuUvOo`CrfBmSbQiRvR_OlRcPxV_LxSgLbWqJbWue@ntAsMn^cPpa@kOb]gGvL}MnWuNlVec@hv@kr@dpAm`@to@eXje@kWx]gWtZw_@|\\\\eb@|Xq]rR}WlMmcAl_@}qAxj@am@`Zg`@hTsXpQ}V`Q_SfSof@xl@u[`g@qYth@qWzo@ySvq@keB|vG_Lp_@iMf]gU~h@gXnc@_d@zp@aa@|c@gb@j[uy@~q@_{@fn@iZbVeYnYsWx[{Zpc@iqDbyFcPbWgRlWmr@ro@uY|UuZ|Qic@nUwe@rPiHjBgd@nLaq@zJgZfCaQ`@wgAhCyv@YcYw@wmLal@iKi@ih@yB_n@oAi`AjEcfD~b@qo@hK}l@jDq^z@e^Ig|C^m`@`@qo@~Dyu@hMyl@~Omj@lTaa@`Qia@jQo{HhnDerBr`AkrBv_A_[vO_RdKwXzPaVfP_SjNuSvQk]n]sXn\\\\{g@~q@cg@xq@mS|b@eXtl@cO|WqT`YgS~WmWbXeRxQ}TjQ_W`SwUfTkk@`j@wShTaSfTu]p_@iVpZmPtToNpVeQl]}Ovb@yMr_@iOfg@mO`o@wCrPyAxQkB|u@_@b_BgB``AgCvp@uD`h@{Fhf@gLxo@{Jpd@gLvb@iPnd@cKbVmbDnmHeKbTqKzRsQjZgThZySvWcV~UyZvXg^vYqPdKmQdI_`@tPm[~Ku{MrmEm\\\\vKem@lQcc@pGgj@|Eeg@fBi`CgAeEA{T?y`@vB{m@jGul@zLml@xQcr@vZyr@jf@on@xk@kf@pl@uYxd@ij@~`Ag_@|p@iPbZcQpWgH|JmZd]yg@pe@e^jVaW|Nud@dUwt@h\\\\we@dUwe@dWih@v[}OfNgVnViTrUsR~VgRxWeSl[}MnYmPx`@aLj\\\\gKr]eJ`^{G`\\\\{Fn\\\\cF~Z{J~l@mHhb@uG|^_Hh\\\\iIr[uIxX{IpUkQfc@kTla@_Tn]_Zl`@}VjWcYxWeX|Ti_@|Ui^rQm\\\\hOct@fWc]dOa_@lSu]`V_UnQqhL`wJ_TtP_T~NmT`NkU`MqV|KquMv~FaXvKkYpKgZrI}[fIqpCbn@{YxGsYzHmYnIyXjIqXzIwgA|]o{A`h@giBlm@c^vLujEdxAgW`IiZjHeYjFkXjDgZ`C}XtAwWr@c{P|j@mi@tAgg@t@wd@Hed@Smf@_Acf@wAel@_Duf@kDwg@uE{~]arDiBSih@kEuf@aD}n@uCqx@kByOIcf@?qe@HaaIjFutAx@qk@ZsXj@sX~@yWtAqU~B_UnCs`@|Fo_@jHs`@vJa`@vL}^jN}[bNka@nRm}CxxAkXtMmg@dWyZbQua@vUo_@xUe\\\\xTi]lVi]dWk[vVay@~r@}[xZ}[d\\\\s[d]yZb]s[d_@_Zz^sXz^o\\\\zd@yZpd@qXdc@_Wza@iXff@_Wre@ubL`zTmcEnfIq]|o@qY`h@_CdE}^hm@}[pf@qnDvfFoS~Y_RnZ}Pn\\\\wOb\\\\eNd\\\\{Mz^wLn_@qJn^mIp`@qGn_@mFz`@aEdd@}B``@yZjjF_]|bFkk@~tIoDfj@aSpvCk[~bFsz@vyNcCd`@yDz`@{Ed]uFn[oIn_@yJd]yJlYaMzYmNbYiPxXeQxVkR~V_uDzrEm_InvJ_VhY}SlTeUxRqTlPeT`NsUlLyUvJsXtIcY`HmY`F{XtDaXjBuY^sX?eW_AuYuBs[wE}[aHs[kK{XaLcYmNc[cSkYmU}VcVmXmYiLwLc}CkcD}j@km@aaEciEoTkUcaCkfCccBkfBenAasAyaBscBmqEizEwTcUmQwOqRaNoRcLmQaJcSuH{SaHqUaFgWuDsVuBaXi@{XHwW~AiX`DwX`FkW~HmWvJsPfImQjKmj@d_@kgFthDcpDfaCwo@pc@ovAjaAqcCz_B{tNnnJum@xa@ml@zb@cl@fe@if@zb@y`@x_@wd@rd@a`NriNm^`_@csAbtAkg@vh@yRlSmo@~u@y`@zh@g\\\\lf@kvAzyBu]zg@}Yl[{YjZm\\\\nW_`@xVeb@lUqvCvgAg]lS}VlPom@ri@aVb[mNhTgA`BwX`j@wn@f~Aus@xoBsz@`pBkc@|gAcWpo@y]l|@wKtWmKzU_LnUeNvYiy@nwA{PxYo{@dxAgs@bmAo|AlhC}QxWiMlPiPxPsP`QaSxOyOvL{SvOwTvLyXvKuV|LiSvHk^nJkYjFeWtCcVjCmnAjMquGzl@_XtBoe@jBsf@Uu\\\\uAg|CcTs_AkF}S`@aQ\\\\g|@~Igj@xFsxAlQi\\\\rCuE`@{f@jCin@^ii@k@}r@_Dgs@wG{c@kGyf@wJkoAkZo}Ai_@}_@uGe\\\\aF}\\\\_Ca^Ig`@^m\\\\tA{[~B_[tEu\\\\`Ie\\\\vJw]`NkYbNcY`QcfK|kG{}A|~@y}@lj@yf@zVgYvPsMbHyMlGcOfGiOzFkN|EeNzEsNrE_OjE_NjDqOrD{NdDozDzy@s~MzvC}aCzg@}lE``Am_JdnB}{Kr`Cqq@bPytJdpB_gHp}AalElbAkvGfxAk_BbXqxHpeBgcDrs@wmB`b@g{EzeAqiA|UaoAnPkt@`Hga@zEiR`@}b@Sac@qBqb@MocA}Aka@X}q@nEea@hFi`@nIu_@fKe_@pM_^jQa]tS{[~UsZdXgYhZmxAxiB_fDtmEwcHpaJ{eEvpF_aBvuB}@jAsp@n{@qq@hy@k~@|bAu_Aj~@ubCxvBodLfdKw}JfjJ{oEj|EymDduDo}JzwKatJllKykNvrOqGbHcRhSgtHhhIouK`oL{oEp`FaiJbaKsdAfiAkiN||OobK|iLynPdgRwdKnnL}aKdlLkkLxyMeaJddKmfMd|NgaGhwGi|MtnOqgOp_Qm@r@awJl|Kci@~m@uiE~dFeaIfaJ_zFbvGmfGzaHm{Nf_Psq@rw@_aG~lGyxAx_BozDfiE_jI||IqhF|yFsJnKezFfhGarFh`GyrHjfIsjF|wFmrG`bHae@lj@gzEfjFofG|sGe_IbwIi|G`jHc_GbrGuGhHktD|aEmvCr`DklGj}GuyF|lGyhGxvGc~H|oIylDtyD}rHhlIoxBjyC_kCroDsn@h`AazKnmOsjJpaN}}I|jNoAnBueL`qQy|HdaMgaMpvRsuHlxLknLn|Q_sKlxP{eFvgI}iJz~NygJ`|NeCzDcoKpmPkfJroNg}EprHihErxGycHzpKa|At~Bqf@jv@m|@fqAyq@xbAme@pq@g_DtxE}`E|lGclNr|S{sH|fLoRxYkyd@l{r@o_ChoDcfAhaBgrHtgL}iHrxKyeJdnNujv@ngkAceMrrRam@b{@ef@ll@k_AhoAozEhkFgiDvwD{lAzrAslHhgIczFxqG{tQthSkrLfwMkuDbiEop]zc`@efU~gW}zU~yW{xBprBcjYxhXgzMbfMwxHvqHugBjbB}lHn|GydAny@g~@hp@abGzbE_bBhfAcgHzyEe}AvdAca\\\\pqT_km@fqa@}vYfyRgpz@dmk@}VzPebJdhGsvTtbOeeOhaK{jLf|H}~F~~Diil@fz`@oub@vrYw_RlfMearAva}@_~EbrDmvDhrCqhC`oBwhCtmB{fCfmBekIloGeo@bj@{xFhmFoeFttE{xG`mGkbBxzAklCxbCa|F~pFayAjtA}rDthDcmAbkAsrAbmAuaCb}BksFzdFksB|lBoUfTumChjCig@jh@ox@py@az@jy@u`AzbAqaFpfF_]t]q^h^epArrAmz@~|@gs@`t@iZxZav@`w@is@vu@_w@`v@upAzsAacBhiBiAlAy{Dj~DgcBndBifBvfBw|A|~AukDjoDewCd{CweItlIqyEd_Fs~FzeGmbAbdAi`@~_@g^p^y`@h_@{m@dq@}g@di@kh@lj@_PtNkV~TaWrU{jDbuDunJdwJcbGtiGwhWzzWsb@fd@aoAxmAusCryCaxBzzBozDh_EkfC`gCa}FrdGaiA`oA_mB~rBqj@xi@iuArxAmmAhkAiiB|dBscBtxA_rAljAk_Cx_Ce_D~uCayAfvAq`DlxC_aBd{AshCldCcmAjfAcdB|fBm{AbrBsaAnaBa~ClxFim@`gAwyB`~DelD~jG}tHv~MuhDzfG}zB|~D{v@dvAo~CvtFs{AheDqv@fbB}z@nkB}Or]_z@riBmxC|uGybD`jH{wDrmI{lD~_I}eD|oHuuDlrHkeF~~JysCnvFqyFr}KkeCb}EwgExkIquCbzFquCfyFodDjoGoaCxrEm]rq@w{BnnEg[jj@o[~f@a^zh@yPrUiVr\\\\mZb]wg@rk@esDfgDwkEjwDyWrVevItyHuxAjoAaTxRkkLhiKylNj`MqqDnaDcjj@rrf@u_FflEo~EpkEihq@r_m@gd@t_@o~PvpO{b@`_@{_A|z@_y@rm@qaAzn@ovAxt@aYnP_kZndP{{LxtG_hMn_HwcMj}GexYnzOe]rQy`OzdIiB`A{bT`fL{hAfp@epFduCudCfrAuj^|xRy~BhnAyfSnzKsdIlkE}tGxlDkh@bZqk@n[ubCztAac@tXw|@fo@og@~`@i~FvxEmzCreCqqIzaHw}CxjCyFzEkwHt}Ga}JdnJioLzcKkoLx}JkaIz~GieJ~bImTlSavP~uNmpOxyMsoD``DsbKdsI}zOdbNidM`wKe`F`jE}WvTkrR|pPetMn_LyyB~lB_ZpX}lMp{K_iMzvKccBl}A{kD|yCqkEhvDi~Hl}GwoG|uFqE|DulGbzFaqFthFyGpGiwG~kGeqHbbHgeEp|DatAhlA{dHz~Fk[nWs`@`\\\\i~BbmBisCf_CycQ~sN}iCbbCgaAxdAyy@h}@sb@ve@cLnLwUdVmoOp{OgrLh_M_uGn_HyxBh{BwrBzfC_kH~kKoeClqDeoAjhBkpD~gFie@`r@kfCptDmc@do@ouBj{Cm`Ex}FqgCzrDwpBxtC}rC|cE}aCvjDmx`@jwk@_~ChpEqjClwDwzn@pl~@oNpSsAnByaJlsMkiAnbB}m@x~@GHmxCpjEaOzToWj`@}fHzgKmcIplLgqDzlFeoBdqCklAjwAaoAfqAqaBbpAwsFhzDitKduH}mLfjIupK~rHqoCzmBui@|_@cnMv`JicBllA}nA`~@udDh|BqvQnjMotNh`Kwe@~[wm@xb@cuE~bDs[`VmvDhnCu_HzyEmdIxyFm|AxfAgxFf_E}jNt{JioKtaHgmeAdgo@eMvHgkH`oEojWppOydJrwFseo@za`@yYfQsmpA|~v@wkIndF{hEfjCew@bg@}mBxjA{eAdp@wiAxq@k|KnyGafNtnIeuHjvEo@`@wdD`pBu}Aj`Aq|BtuAs_Atl@}fAns@isBrzAcjA~aA_MhLulF`mEqpCp_CarCz~Bg~CtiCmbDxlCyeDnqCmdBfvAsn@`h@gwAjmAsrAvkAkbBnhBa}BnxCqcEnkFcw@xz@}iEjnEe_DnaD}`BvbBqcCfpC}nAzxAsj@ps@ev@raAg}BvuCk`CvaDwkCzgDodCxbDg`Cx~CgnCvlDmrCvsDw`C|}CevC`vDukCplDy|AjqBa@f@qw@xaAsQnVmxAnlBoX~^}jAjyAifDlmEcSrU}aBxxBwo@j{@}~Bb{Cev@haAwWpYeUfVg]f^yHbIke@ld@uYxW{|BhmBapBfcBo{@rr@kaAd{@spCz|BspAxfAmsA`hA{uDd_DsuBbcBe{C`kCucB`uA{VvS}SlQ_f@hc@}wApjAsnAndAqmCz{Bmr@xl@{JfJ{}BrnB{k@xf@e}@rx@chBbdBumCvgC_`Aj~@ud@|d@{ZpZydAz`Ai`Bf}Aa_Ab}@ckCfeC_NtMu|A`zAovBprBqt@tr@WTolDtfDee@ld@ciArfAyY~Vi@d@uiBhfBo[rZoeCrbCq`@z^{QbPsaB~~AegAjdAcpArnAg{A~uAaSbSs}@n|@aaAb~@{XtXepAloAqnDxeDmpA|lAunBxlBgvCbtCeObPalD|dDqcBf`BcpBxjBwpD~lDkKlK_EnDoIlCgSfLoFdDqEdAmE?{Dq@uCoBcCeCmAoCkAgEg@uFCkEj@kEv@eD`BoDzBqCtCeB|CiArDOxCR`DjAbDdCfCzDjB`H|C|b@G~]cAdiFcC|hQoBbiXOfjCQf|EWdtQb@nrG?x`@a@tbCPdxAGrtBMpwEAjxAQpmBLhgL{@vvGUzj@WzPs@hTyG|fAgMpgBmu@ncKaIv_A{Gtn@sAbJu@pGyF|ZiOnr@{H`Y_Sxl@oM|\\\\uk@hnAiZxn@cc@z{@aZjj@o\\\\rs@i_@vt@yg@hfAoKtS}c@|}@us@xxAe]~s@wh@peAwWdj@aj@~gAcaAfpBgm@joAuMdXibAzpBeIfPoE|I_|@hhBgbAbpBqfAjyBcaAdoBsS`d@{Zjn@gMdWg}CpnGcf@raAav@z|A}Tjd@si@hhA{v@j_BuNf[uCnHsCbI_FnQuAdGkEfXw@bGsCrXef@nhGkCzTyHtg@oLbt@oOdz@kEjUgDpP}DrSsHpe@{Gtd@}_@~yBsOxz@oL`s@_SvmA}CvNuDpOwClJsErLoKpTsPn[s}@xiBk@jA{JxQmHhNo|@pbB}FnJmTd\\\\uHdJsIpIkIjHsO|Iw_B|cAew@jb@_eApq@cdAjo@mFzC{[|Peb@|Pa`Bxd@_eBrf@qt@tT}TzHkInE}MtHyGtEeQ`OoH~GaKjLeFlHaPrX_t@daBqI`SkQla@iYzo@cRhc@sNx`@aFbVqBzLyCnSeAlMmAxVUvNEhOJ~Lh@zPr@xMdBxQbCxQbBtIdEtS`_@dtAhsA~xEdnBr_Hj}AbtF`j@rnBtq@l_Czn@j{BdHjT~E~MhD~HlJbRvKjQlHnJbEnEhNhMff@~_@lmBd|A~MnKrjFfhEzWbTlEvDjKbLlQpUfKpPfLxQhKpPzLdVpKfWhK|[vJt]rE~TvDjSzC~SlBlPhBxQ~@lObAdQ\\\\dJ~@f^Htk@c@`UStLc@`JmAfT}QhyCqAbW_Bt^uIbgBUlQFxRXxUTpJj@dMhAbSdAbO~BxUhC`TvGja@dH~^~D`Tz{@|zEtMbt@xQ~bAzCjOxF`_@vBhP`AdLx@`O`@pNDnPQbc@mCpkDuA`|@k@h}@@vLN~Kf@rNj@hKz@fLxAdMpAnIvFhZvB`InFvPxD`NtEjNxG~NjPf[bFtHtVh[tu@~t@~u@tt@fy@zv@rl@hj@ddAr`ApQxUpQ`^tJtSfLz]rDdPjCzNdChOrB~S~A~X^lJz@deAr@r_Ar@~qAPrf@\\\\xVfAjRr@|JpDhZvBzNbE`UvDlOjChJnEfMrMrYhHhMxGpK`NvRrLvNzGjGtQ`O|IhGhHhEvMtGjj@xT~iA|`@nuAnh@jMjEbo@hSfm@fQzYlNfUbPhVzVdK|MbUd`@dQlg@nCbM|\\\\`yBp_@v_CzHbi@jl@hyDxQpuAlNj~@zMxt@nKrd@h_@hiAfs@bsBbgIxeUzcA`hChqDtnHvVhq@xHt\\\\hGn\\\\~[t~CxKxo@dP`m@xMn]xRl`@ra@`n@vw@bfAfc@jg@v`@na@h\\\\~XhkD~xBnc@j`@bPnThLzVlJpVdHzXxDrWjAjVpApk@uC~h@wh@leEaCpUkAlZDr_@hAfTlCbZ|Sl{ArBvU`AxMh@rXm@lVeEhj@{Kzi@eVr~@uPhr@cNtk@kKzk@sFhk@gOpeCgRt_DL|^~@tl@~Dfj@lHbj@hHn^dCpIfLl^fNt_@vk@`hAjb@~s@dLtPpZnb@tT|Sp^tUhRjLdaDdpBb]`TnYdSl`@ri@nLzTxLn\\\\jIp\\\\zFr^rBdX~@|[]f[oBrX_Wz~CLvu@xBte@~q@`jGlYdqCtVr|Atd@xwBhGdSdLbe@nP~z@ld@|{BdVxuAne@haDzObu@vXthAvP`o@b\\\\fjAbF~N|Nv]lXfd@h\\\\x^~kBfxApy@tl@xf@fVzShHhg@vKjy@nI|fAzFlb@hIre@fPvf@lYtV`T|rBvoCX`@~bAjvAnjAp`BtR|XbyBvxC~Wx]lbBr|B~Vr^rVjo@zR`s@bHv]bGbg@~G`s@~Dff@dTp~BtEvs@rIb|@nPlrAbSvlAxcA`oF~Ipe@nf@zhChYd}AtSt~@tQbj@xeAr{Cfl@bdBlPlf@~Vlv@bV`j@`_@xv@~j@|{@po@jt@`l@rk@pWlWluEztExRnTdQlUpNlT~~@p_BhOxVzObUtPnShR~R|QdPjwE`sDjyBzdBrSxOpRjMxRvKpRlJtTjIpTjGrUdF`VtD|XtCdX`AzWHtW_AbXuBtWuDjWwFt\\\\_JpYmJ~mA{^fYwJfYuL~YyOvuAkx@~I_Fbf@iTlXkHdXaFtTiBvUaAnUTfUtAxVnCxbAfO|fAxObqBlY`x@rJr{@nLbLbBjq@~NtJfC`KrDxIlEvInF`IbGtH`HdItJvLdPxDfH~CxHvCtIbCzIxm@d{BlJp]hT|t@tNpk@xk@d}BhIvZ|HxWbJjWnJfV|b@vbAp]~w@lXfm@xNnYxNxWpOxUpd@rr@fUh]pSp\\\\xN`^`ItUxDbQbGja@`Dt_@v@r\\\\F`\\\\cAl]{B|]aEx^uExZcHt_@wGd]uIl]eJ`VcM|Z}L~SwPfZiO`Vc\\\\v_@kyD~kEslAvtAkZz]aNdQcNhSeJhOqKnTmLn[{Pfb@u]`dAqRtk@wIxWu\\\\zfAoRvq@_BlE{@rHoDfUeShqAaOf`Ac@vCoHt[w[lvAgJp_@m@~BqIz]{CzSgBfV{@pQ?fQL`NbAbP~AhMzCnWrZr`C|Bn\\\\hAh^Er`@u@zRw@~M_BrOkBrOsDjSkEzR{EtPiF`O_HvPyH`OwIpNcMdPqJhK_KjKwIdIcPtI_MxG_OjGcOhH_TdIcSvImUpJwg@pUgOvIwOjLyNbOii@`j@cK|GmKrGcJzDmN~EseBx_@aPnDaCh@eMpDeSfFeItBuGbBqMlE_Bh@iOfI_QhKcSrOwh@fh@u[xXyAtA{NbP_HhJqGhKmHbOuQva@qr@b_BoTrg@gOt]gfB~}DcPf`@uI|SwFhRcDfQiCtPqAtPu@dPMfQZpNt@rOpA`OhCfQbD~MlErObh@juApGhRzEfQbDtP~ApNpArOZdP?d_@mBpz@[lT?hRh@fQpApN~AbPbDbOzEvQbGzRzDtJ~Zjv@~t@xjB|]j_AzKrVtJhN`OzOfd@vg@pMfQrHzMb@v@tIvQzEtPzEzRtC|S~AjSt@vQ?bWcA~gA[vg@g@p]cAd_@GhAkAtYcSncCs[|wDoWbaDkAbMcDb]sBvTwLhfA{@lH}U|pB{Hxg@qGr^mH`]_Kjb@g@fBsM`e@aQzi@ycAfbDyYn~@yb@~sAgn@p}Bq@bCaEfOaGnQ}BzG{DjIuArCgIvP_KrOmx@b|@kaDdkDuLtMihBvoBgCnCaJxJoF`GcjBhcBiAbAyTpRc@^sb@`_@kQtPqM~M_NtOc`AvlAq[d`@{FdHkyAj|Amd@rf@}MzNqW~XaFhF{PtQoXrYkM|MmjArmAed@lg@k[v^}zC|kDuPnV_ElPu@tP`@`J~DpQdLbOb_@`V~p@la@bFzClv@de@bBbA|GdEpaB~eAjzB`sAbzCbiBpIfFhDrBjStLtJfGhRdPpM`OjH~MlHfQlEtP|AhKnBhQf@rOYfQeArOyBdQmExQ{EbPyBvEaFlKmGvMgU`f@kHfQ{H`VaGjTyOpk@}`@dyAmYfeAqMdg@c[rhA{CvKcDxNeAvEqGd_@cGnk@_BlRqAnO{Bpk@g@lc@Ct`@Ebm@OpvBgC|m@}Dzd@qVjqDw@pLgBdX}AtVcBz]uAr]iAj^_DpjAuEdeByAd^QpKQzGe@dRU`NEhNRtN`@|Nv@|MpA~LtBbObCxMxGje@`F~UnIfh@f@jHZfGAlHYhIaAnI}BtKoDlJ}BbE{D~EoDjD}GtEsHtCgRtH}RfIwQdI_PxHeQhIijBj_AasBf~@ik@`Wc|Kx~EovItyDg^`Pad@|QkgGboCshHt`DotHvfDq[pNm]bO{]fOm]jNw\\\\pMy^fN_]tLq]zL{]vLu^tLw{A`g@_}JtdDkkHraC}fB`l@kmMvgEuo@dTyTlH}mF|fBil@nRo]tLe^~Ly]nM}]bNg^tN{\\\\hN_^bOu_@rPirI~yDmaLjeF}kKpyE{h@`V{yG~zCgWrLwTzK}UxMuTpMiU`OmU|OsSnO{TjQmSbQaRvP_SvRuSvSiQzRmRhUwP~SgPlTu_DjlEacLvwOcRtVcPdS{QpT{PhRyPhQkRtQ{RxQyRtPmShPaTzOwR~M}TtNwSxLiTrL{SzK}iF`jCkfD`bB_sFfoCueJ~rE{wBjfAaV~LgVhMcUrM{SlM}TjNuRzMiVhQ{S~OcT|PmSfQeSrQuO`OmAhA{qGfjG{oJbeJs{HnrHg^h_@uxB|tBcxAjvAkRtRcSdTmQjS{PrSwQtUsOrSeO`T{NpTY`@ixAlyBsOlUePpUcP`ToP|SaQ`TyQxScRfSkSrSkQxPqQlPeRzOoRzOygEhfD}[lXkPbMwYhWsK`K_d@za@gRzQ_RxRaQjRuPhRiQfSoQbTywHlnJkPdSuPdS}O`RcQrRqQpRcQxQqQpQyQ`QwQzPsQ|OaRvOiRxO}R|OsRpOakDdqCeRnOuStQkRjQaQnQsQxR_QbScQzSqP~SaPtTcP`ViOxUyi@~w@yyD`mGw[bh@osCfrEcO`VyiFhmIwTl^eSj\\\\mRv[uSh^yS|^wRh^sSb`@uQn]uQ~]uRl`@{Rxa@qzItdRisAdtCqNtYyNdXoNfVoOrV{MfS_QvU{OdSaRvTaQnR{Q|QygAreAatBlqB_jCffCaVxU{S~SwRxS}PhSuPnS{QpUqPbUyfNbjRaP`UaPdU_OdTgPlV{NpUyM`UwOnXuOnY_MrUuNpYuMdXwaAftB_aA`sBgeAvyBm^|u@}[~q@_`@|x@moD~sHal@~mAeo@xqAkf@r`A_MfJwl@dfA{MlTsFrIkWr^_]he@eLpPeItNuHdOcHfO{ExLyChI{FzQuDzM{DtPwC|MqBzKo@xEeAvHgAbJkAhK{@lJs@nIo@|Jg@pL]`MUfPEpNl@n`@tAt[nJlmA~BrXz@rJr@dJjDdc@lDr[zNnkBhIhkApAbOz@jJzMlaBpRd|BtHr}@nVzvCnGdu@pC~[bCr_@zBvf@|@d]d@rZYjv@c@pZaBho@kCjc@wCv]{D|^eFz_@oGba@qjB`tKmj@bbDcJvj@gDhVgCxSwHlq@iFnt@wBhb@}@jWy@jVa@rUiA`aCOvj@sDbgNYbjAQ`Zm@zVe@bRw@lQyBf`@aIrw@aDjUgDvTuDrSsDdRyEvSwFrTcKn]_JbXqjAvzCsuC`sHyU|m@iiBdxEuw@lsB_W`p@yy@jwBiCtGyb@`iAsQ`e@}IpUwTpj@{Odb@}Lj_@aHvVmFhT_EpRoFvZqB`M}A~K}Dt[eB|QaBrS_ArOw@xPm@~QY`O}@nfA_@dg@OfLiEtdFe@de@Wnb@UzeEFf[Epf@H|r@Gt~B}AjnAwDdlB_DzsAsKvvE[jMkAf^aAzi@@dMBtr@X|O|@`^bD~q@pA~RxA|QnCnXzC~VhD|WdA~HpBlLvEjVrHf_@jLzc@|h@boBbQpo@xX~jAvQr_A|fAfwGvs@pkEzJ`p@jEl]rD`_@hCd\\\\~Bx^`AfQt@rSx@z[VxPNzPtAbaJb@piFE~sBl@tpFVrk@n@vvBR|Z@bIPrp@Jte@d@`eD~@zxG`AjcHBnXOzUc@vT[|Ki@fOm@rPQlD_@|ImAzTuBtXu@lKkAhLcw@x~H{Ffm@{X~tCafAhhK}StpBwTvtBm@rFki@hhF}MjfAeUftA{]p{A_Id[uZzmAuE|Qi`AxxDkK~a@iTf|@{E~R}E~PaOvr@}ShlA}Jnn@wQhkAuKpl@kF`WkFdUmCzIqRht@uaAjsCkk@haBkbAhtC_Vhs@{Trq@{Xt}@mRfm@yXvz@_Yfx@{wCrkIap@fjB}Qpf@oRpf@aWtn@aIfRioAt|CwRrh@iOde@}Mpf@iLfg@wJff@ei@zvCaLfi@cMph@gOzh@gNpb@c~ArrEmPnb@{Pd`@kPb]{Vnd@gWjc@q^zg@{p@x_AaTjYeiBvgC}gHf`KaTbYySdVaTbT_SlQqSlP{PvMqvN`~K{oCtuB_k@zb@c]xXkYbWuYbYsXnZ}SlWSVklGx{Hi{Jf~L}QxSuRvRqSlQoSbPaTlN}UvMmUvKqT`JasFvxBoiCjcAqt@bYkP~F{ZhKyYbIc]fI_VtEuFhAwGfAc^rFs_@hFmGgCcAJibAzJaLdAgNbBiNvBoMxBuYvFs[vJiFNcTdHyRfIsa@lQaeA|l@gGnD_NpGoL~EoQxHgN|FoQnHsHtC_n@lViUjJoH~CsF~CwFtDcFtDoE|DcDfDoDdEmDpEeDtEiDnFkCzEiCbFaC|FwCxHcDvJiCrJqBhJwApIuAlKy@tJq@pL[rLIdLH|Kd@hLd@vJhAtL~AvLfZrgBnA~Hl@jGf@rG`@|GNlDN~DFvC?tDQjIa@jIk@dIs@rGw@jG}BvMiChNvAxLkE|Peg@noB{FlUiClLgGd]mFx]{Dp_@yCnb@}Az^q@d_@Ifa@PtP\\\\rQj@bQZzFlBxYxCxZ~b@xeExCz^|Ad^`@d]Gd`@s@x\\\\eBp_@qCn]kEx^wFn]qHz[mInZeJbYaLnYkMbX_OxWsPbWi}AjyB{PnX_OxW}MxWaLxUmeCbqF_L|W}KbYmPlc@oFnNuW`r@uMp[yLzWiMvUcMxSwOfU_cBdrBgP~SkOpUgNtV{L~ViLjX}J~XccCdwHeKrXmLvWiMjU{NjUaPxTyJtLoKfLmKbK}LpJqM~I{|@nj@uf@j`@kSlOuHxGsHxGmQ`RiNfP{N|RqGlJcG`JkQrZmMjWiL~W_K|XeJpY}HdZ}Gb[iGn\\\\iF`\\\\uTpuAeFlZcGb[oHd[iItYgJvYeKfXoLzWkM|ViN|UcO~TePvS{P`SqQlQqRjPgSlOmSzMqTrLwq@t]ohAnl@cWtM{O|JeNrJeO~LoNlNgQvRiP~ScO|UwMpV{LfX{LtWiHjR_S|~@iFx[_Ef\\\\sCv\\\\_Bp\\\\w@n]Ul]OduAQr^g@h^eBj\\\\eDh^iFn^qGj]i_A`vEkDvPuTbhAcIt^}Jv^oLv^qMz\\\\uNx[wPd[yP|X_SzX_SfV_UhU}TrSw{AnrAcKzIq{AbrAok@rg@iV|SiV|TsT~T}P`R{RbUmaCjrCoMbOgMpMwLvK}L`KaN`KqMvI{MjIuMjHqL`GeNjG{NzFqNzEoMzDkLzCoOnDsOzCkOzBsP~Bm|B~Y}QtCuOdDgO`EaOnEcOjFcO|GyO~HkOfJiNfKqJfIuG~FqHpH{NlP_OxRsKtPcMzUoJ|ScKnWyI~YmHfYqEdToLdu@ZpFkNpmBcGln@yA|TyC~[iDhZiF`\\\\gGhY}G|WcHpUwFvPuGrPuHlQgIbQkk@`gAuJxScJ~SoHfSsG`TaG`VyEbUsGzUkCnUmBvXqBra@s@n_@cDt`BcAnX{A`VaCpWaDrWkExXoHj_@eJh]cM``@{Mn\\\\uOxZ}NhW{PbVoQrTwS|SguGlqGso@|n@or@rr@{|Cl~C{uC`yCmTbUqRlT}QbV}PrWcPfXyNpYgMnYoKrXyJjZqI~ZiId]sUrdAsYhsAikAnmFeRd{@ms@dfDqiAhhFsHhZ_J~ZcLh[gMlYcM~UcMbTeNvSsMxPqO`Q_c@rc@{c@~c@yRrSsQfUsO~ToMtSwLrTuJbT{JbV{HvTqHhWsG~WsFhX}EhY_Ex[oCtY{]joEqEdb@aGz^cGn[kHbZ}HxX}ItWiLlXuL~VqMlUgMhSuzA|cCo[ph@qvBtkDsQzXePfU_RdW{hBz_CoMlQaNlRwMbSmLbRgdAlcB{pAnwBeVp_@qT~[iVn\\\\wUt[oaEtfF_\\\\ha@{xC`vDgn@~x@ij@du@GHcb@bl@gtBzwCyN|TaNrUoM~VuLbXmKnX}JhZuIhZqHhYoGd[gGh[sDt[qDd\\\\kCn[eBh[mAh\\\\e@n[?j[\\\\h\\\\z@~ZxObqEjCpu@j@hV\\\\pW@f]W~]cAd^aBb^aCf]cD~\\\\aEx\\\\iFt\\\\aFtWmFvVeE|PkEbPyHfXqH`UuKlYoLrXmMfXkNfWyNfVqwCvxE_Xzb@gSv\\\\mTj_@yjBlbDcsGlcLeLjRwLpQqMbQsMnOsNhOsNfNcPlNiPjMiP~K{RtLsStKyNfH{QnH_PxF_StF{I|BaJvBgLpB{LtBoOlBkP^aOzBaQj@}QRiwAbBy`@p@mLRgOv@aOx@wQnA_O|A}NtBoHdAeHrA{P`DeOlDkOtDsNxDmN`EuOnFgNzF{LnFiNvGmL|FyMpHyNvIcJ~F_LbI{LbJwLxJyLfKuLtKuK~JaM~LoKnK}xApyAgTjTwh@|i@aRjR{JzJuK|JwKnJsJpHeMbJ}L~HqL`HoLfG_NnG_NrFwM`FgMdEmNbE{MdDwMxCgNdCsNtBsNdB}MrAcP`AuMf@{NTmNGaNWgOm@yM{@ul@wFknB}OyxDk^yo@mFqOs@aPc@sOE{OD_PXeRl@oQrA}OtAkOdBeP`CyNpCePlD{NhEwPxFoMnF_NfGcNrGaNhHqMvHcNpIwMlJ_MdJuL`K{KhKcLhLaLzLyKrMmKvMmJhMoIbM}IdNiJzOwIfPqH`PgH`QyFlOeGrQiGbSaG`TcFnS{EtTaEhTgEdVa[dpBq[lxBkFh\\\\gGd\\\\{Gl[mHd[eIl[iIdZcJjZ}J|YsK`ZoLvXoL|Wkx@tfBgIhQiUxf@qKlVaIdScIzTuHfViIzXqHnZkIt_@wHpa@kGjd@sEja@qDzd@gC`d@uA`c@y@tc@wDtyBsAtb@qCfc@yDda@qF~`@uGz_@aIt_@cK``@iLt^gMb]wM~YyPr]}iB`nD_|AryCov@|yA{_@|t@}{@fcBc]hp@iSr_@_Tj_@{Yze@mUr]mTvYm@x@uUxZsWx[muJtlLaPvQqPbQaPpOaQxOeQ`OsO|LkQzM_RbMsQzKkR|KmR`KiRjJqSlJyeBhv@kRfJiPtIyPlKmPfLaQ`NcPlNwzArqAePxM_RlMwOvJeKrFkFhCqFbCuF~BuFvBqFnB}FnBuFhBeGlBkFbBsExAyiGrpBq_Blh@}FlBsFjByFnBsFnBsFpBsFpBsFtBsFvBqFxB_G~BuF~BqF|BuFbCiF|B{FhCiF`CoFfCsFjCkFhCoFlCaN`HolF~lCiFlCiFnCeFpCmFxCoF~CcFxCeF~CeF~CkFfDcFhD_FfDiFrDyEfD_FpDyEnDwEpD{ExDyExDyE|DyE`EsE~DuEbEsEfEqEfEuEnEoElEkEnEiElE}KhLmkA~mAaoC|sC_NlN}fDvlDoEtEaEfEsEvEmEnEoEnEmEfEqEjEoEjEyEnEkE~DqEdEsEdEoE|DwEbEuE`E_FdEsEvDoEpDiF`EwEpDaFrD{ElD{EhDiFpD{EdDcFhD_FdDaFdD_FbDoFjDgFbDaFzCgF~CgF|CeFzCgFxCmF|CmuDtwBgFxCeFxCkFzCeF|CmFdDuExCgFjDgFnDyEhDwEnD_FxDuErD{E|D{EbEoE|DuEfEqEfEeEbEmEjEa{Hn{HeEfEcErEeEzEaEbFyDfFuDjFsDrFmDtFiD|FeDdGaDfGyCjGsCjGqCtGkCxGeCxG_CzG{BfHuBbHmBjHkBnHw[ntAgBrHkBzHmBpHsBrHyBnH}BjHeCnHiCfHmCfHuCdHuCzG}CxGyChGwCbGeDdGeD~FiDzFoDzFoDpFuDlF}DnFyDbFeEdFeE|EkEzEiErEoEnEuEjEasGhfGqEdEuEbEwE~D{ExD}ErD}EjD_FfDgFbDcFzCoFxCsFvCgFhCsFfCmFzBuFzBwFrB{FnB{FjBav@hV_tBpp@sFjB{FpBsFrBwFxBwF~BkF|BqFdCkFfCiFlCmFpCcEzBc@VgFxCgF~CgF`DiFhD}EfDcFjD}EhDq_@~WuOtK}`BxiAaFnD}ElD{EhD{EtDcFxDoElD}EbEwEzDwE~DuEdEqEbEqEjEmEfEkEfEkElEoEtEkEtEgEvEeEvEcE|EcEzEeEfFwDxE}DbF}DfFwDfF}DnFsDfFwDtFqDnFsDvFkDrFoDxFiDvFwn@dfAeDtFiD|FmD|FoDtFsDvFuDjF{DnF_ElFyD|E_EzEeE~EgEvEeEnEoErEqEnE_~@`}@oKjKqz@ry@{`Eb~DggCdeCkEjEqEnE}M~MuE|EsE`FqBvBeEvEgEzE_EvE_ExEaE|E_EdF{D|EcEjF_EjF}DhF_EjFmkA`}AoeApuA_EfFuwA|jB}DbF_E~E_EtEgExEkEpEqEtEmEdEsEfEsEzDyE|D}EvD_FpD}EjDaFdDeF`DiF|CgFtCiFpCmFlCwFjCoF~BuF|BwFrBwFrBqFfB_GhBqGdB{FvAeFnAaGlAaGhAaG`AaG|@gGv@iGr@uGn@gF^kG\\\\kGZgGRoGLsFDgG@gGCeGIkGOcGUcG[gGa@cGe@eGm@gGs@aGs@gGy@cG{@aG}@eGcAeGeA_GgAiGmAwFoA}FsA{FuA{FwA{F}A{FcByFcBuFgBaGmBsFmB{FqBkFqByF{ByF_CqF}BqFeCgF_CmFeCoFmCmFoCmFsCkFyCgFwCeFyCiFaD_F_DcFaDk_Aam@iFeD}E{CiF}CoFwCeFkCyFoCqF_CkFwBsFsB{FoBsFeB}FaBwF}AsG{AqFiA_GiA}F_AcGu@aGu@qBUcIq@gGa@cG[gGSgGMaGGiGAoGD_GLeGTeGZgG^eGh@_Gj@_Gt@}Fz@gAPcBXuFbA{FhAmEbAqCt@uBj@}GpByFfByFnBwFrBqFxBmF~BqFhCmFlCeFnCkFvCsMlHqy@xd@{_DxfBskA|f@mLtFkXjMik@vWuFdC{B`A{B|@}Bx@yBp@_Cn@wBh@aCd@kAReDd@qC\\\\qCVeCR{BHaCDmC@qCAsBE}BIwBKqBOmC[kC]}B_@mCi@wBe@cCq@qBi@_Cy@wBw@_CcAuB_A{BiAsBiAyBsAkBmAuB{A}AkAaBsAsBmB_CyB_BcBeBmB{AkBgB{BuAiBcB{ByAsB{AyBqDuFiDyFeDgG}CeG{CqGuCeGkRma@{D{JcEyK{\\\\qcAsFoPsLi^oX{w@wRwh@amAa~CaK}WoHsSgDsJmNea@iV}s@sFwP}EuPyE}QwDmQeDmRyCkScCeSiBcSqAkSi@sMs@_VQ_QCmPlA_n@HiCHsAfAoQlGogA~Bka@b@yI`AuTbBs_@t@eSb@aUD}QIeSCmOWkOg@oPq@aNyAsQoBcQmCkSgCuPcDaQ{E_U{DsOiDoL{DsLkFwLoFqKsFmJiGuIkIyIeIeHuIsFqJwEcJeD_LoC}JkAcKg@cL@eJj@iK|A}JfCcKrDyQnIabBhw@cPbHsJ|D}JlDaLxCcNbDoj@bIw_AhReI`@iGVamA|EmrDtNykArE{l@bC_ZjAct@vCyRx@ePn@i_ApDgXbA}eAdE}FRuBFaPLqOCuOQcN_@eNu@aNgAyOaBuM_B_P{B{NkCwOcD{NyDkNuE}NyFslAyf@_\\\\{M_NaGaNiGiMuGoLkH_MgIuL}IoN{L_MiLeLyLeMkOaKeNgJaNqJoOgIyN}oBcoDuIuOkIwN}ImOsIwN_JqNeJyM{IcMeKgN}JgMsJoLwLaNuKsLeKyKuKoKyKiKmf@}c@wy@sw@ogCabCgLkKiLwJkLuJyLqJwLkJ{LcJ{L{I}LsIcMkIeMcIiM}HmMuHoMmH{MiHyLiGeFiCgEuB_NuG_NiGaNeGaNyFkNuFeNkFcDkA{JkDkNyEsNsEuNgEyNwD}NcD}NiCeOwBeOaBgOkAiOy@kOc@mOQoOBmOXgOj@cOdAiOtAuOjBgOvBeOlBq_@nEc_@jEm_@rEe_@bFc_@fFgrJtrAyoBnXupD|f@opAfQugEll@_pD|f@mxDxh@u_BxTk_@jFc_@hFe_@jFk_@fFaTrC{InA_U~CkMdBc\\\\pEw\\\\pEes@xJc_@jFwSvCoFx@kGhAiGlAoFjAkG|AcG|A}F~AmF|AuFfBqFlB_GxByF`CqFfCkFjCsFrCiFvCiF|C_FbDcFhDyEfDaFrDqEjDsv@vm@qLfJwEpDyEdDeFlD}E|CeFxCiFvCgFnCqFlC_GnCwF|BgFrBsFrB}FrB{ExA}FbByFxA_GxA}FnA}FfAeGfAogBvZkCd@yj@xJyj@rMgRdE{ObCyf@lLo^dLctAdb@}XdIwAZa~@jT_b@jMoEdAwfCtq@iExAgxAzf@eQ~I{tBd_AoUnJeSrIoRzIu[lOgBv@kNpGsOpHma@zSeOlHgaAxg@uVvMqMdGiLlFgNtFyM`FwLrDoNrDcObDqOpCuOzBoMxA_O`AyOp@qKR{NFwPWqUqA}P}AgOiBeOuCgP{DyMsDuNmEcOaG_MeGqO}IuMsI}LwJc`Ayu@sMqJ{NiIcMkGaO}FsFwB}FuBuFkByFcBaG}AiGsA{FmAyFkA_GmAaGoAa_AcSeiAuVujBga@e`A}SuFmAoGsA_GkA_GeA_G_AcGw@iGs@cGm@}Fc@kGa@mGY{FSyGM{FEqGAcGDeGLwOj@sx@nDuxApGcG\\\\oGh@yFj@yG|@{F`A{FpAyF~AsFjBsF|BmFjCqF|CeFhDyErDyEdEoEnEyEpF{D|EyDfFuDlFsDvFmDrFoDxFkDpFuD|FqDjF{DlF}DfF_EtEcEhEqEdE_FzD}EfDgFzCaFfC{FbCqFlBwF~A}FnAyF~@_Gp@cG`@iGNeG@wFMkG[_Gm@{F}@iGqAuF{AuFkBqFyBqFaCiFeCkFoC}FaDwEkCqF{CkFsCoFqCoFgCsFcCuFwBiGuBgF}AgG}A_GoAcGgAaGy@qAOwDa@eGg@gGc@sG]wMk@ao@~@aGL_GPgGVwEToCPewA`J_CP}BT_CXaC^eCh@aCp@aCx@}B`A{BhAiBfAyA~@oA~@kA`AsAlAoApAkAnAgCzCgCjDwt@peAoD|F{C|E}D|GoDrGcOhXwCrFaCbFgAjC}@nCy@`Di@|C]`DQdDElCBlCNzCTjC`@nCj@bC~@~CnAdDtA|CnBpDnBnDhBjDhB~DbB`F`ApEd@jERjE?nEKbFc@hLSxEQlEs@zTq@rS{@t_@MvIUjTsCd~DYbTqC~ZiA|LqA|LqArLwAxLkArLwAlPwF|r@{Dnf@uBrYC|KF|CVtCd@tElCnOf@dR`Cxa@fBzDd@lF`@fF^lFX`FRtFnAfg@n@rWl@zWlAhh@HzCDnB|@r_@F`CJ|DHpDPvGPbIDbBb@~QNzFFvCRhIZbMPxHF|BBj@LxE?DHjC@vBObAO`AIXK^eA`AqAj@}OjBkh@hGiy@xJlKr`BT`DVbErBh[|Fd}@VbEZ`FnJ`yAVzD\\\\hFrD|j@xDpl@TxDZrE~D`n@lDri@XlEZvEdB|W\",\"voiceLocale\":\"en-US\"}],\"waypoints\":[{\"distance\":22.086,\"name\":\"\",\"location\":[-118.289795,34.03084]},{\"distance\":25.649,\"name\":\"Waller Street\",\"location\":[-122.435714,37.770487]}],\"code\":\"Ok\",\"uuid\":\"r8Gx8SOkRcuY31EuPkGaqvGkgu4jjTmuh30UjmI1B4qlwzUi27_L_g==\"}"
  },
  {
    "path": "app/src/main/assets/sf_airport_route.geojson",
    "content": "      {\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"properties\": {},\n      \"geometry\": {\n        \"coordinates\": [\n          [\n            -122.385374,\n            37.61501\n          ],\n          [\n            -122.385237,\n            37.615063\n          ],\n          [\n            -122.385091,\n            37.615152\n          ],\n          [\n            -122.384963,\n            37.615247\n          ],\n          [\n            -122.384825,\n            37.615376\n          ],\n          [\n            -122.384626,\n            37.615639\n          ],\n          [\n            -122.384529,\n            37.615776\n          ],\n          [\n            -122.384404,\n            37.615979\n          ],\n          [\n            -122.384233,\n            37.616314\n          ],\n          [\n            -122.384216,\n            37.616416\n          ],\n          [\n            -122.384224,\n            37.616518\n          ],\n          [\n            -122.384422,\n            37.617035\n          ],\n          [\n            -122.384473,\n            37.617123\n          ],\n          [\n            -122.384542,\n            37.617191\n          ],\n          [\n            -122.384628,\n            37.617259\n          ],\n          [\n            -122.384748,\n            37.617327\n          ],\n          [\n            -122.385371,\n            37.617587\n          ],\n          [\n            -122.385718,\n            37.617722\n          ],\n          [\n            -122.385872,\n            37.617776\n          ],\n          [\n            -122.386061,\n            37.617803\n          ],\n          [\n            -122.386284,\n            37.617817\n          ],\n          [\n            -122.386542,\n            37.61779\n          ],\n          [\n            -122.386765,\n            37.617749\n          ],\n          [\n            -122.386971,\n            37.617667\n          ],\n          [\n            -122.387186,\n            37.617545\n          ],\n          [\n            -122.387297,\n            37.617443\n          ],\n          [\n            -122.387595,\n            37.617151\n          ],\n          [\n            -122.388088,\n            37.616662\n          ],\n          [\n            -122.388371,\n            37.616381\n          ],\n          [\n            -122.388444,\n            37.616318\n          ],\n          [\n            -122.388524,\n            37.616258\n          ],\n          [\n            -122.388605,\n            37.61621\n          ],\n          [\n            -122.388668,\n            37.616176\n          ],\n          [\n            -122.388743,\n            37.61614\n          ],\n          [\n            -122.388851,\n            37.616103\n          ],\n          [\n            -122.389008,\n            37.616065\n          ],\n          [\n            -122.39054,\n            37.615755\n          ],\n          [\n            -122.39074,\n            37.615706\n          ],\n          [\n            -122.3908,\n            37.615683\n          ],\n          [\n            -122.391003,\n            37.615578\n          ],\n          [\n            -122.391095,\n            37.615535\n          ],\n          [\n            -122.391196,\n            37.615503\n          ],\n          [\n            -122.391369,\n            37.615456\n          ],\n          [\n            -122.391598,\n            37.615409\n          ],\n          [\n            -122.39175,\n            37.615375\n          ],\n          [\n            -122.392229,\n            37.615255\n          ],\n          [\n            -122.392489,\n            37.615197\n          ],\n          [\n            -122.392752,\n            37.615141\n          ],\n          [\n            -122.393027,\n            37.615087\n          ],\n          [\n            -122.393329,\n            37.615035\n          ],\n          [\n            -122.393644,\n            37.614984\n          ],\n          [\n            -122.393829,\n            37.614947\n          ],\n          [\n            -122.394018,\n            37.614905\n          ],\n          [\n            -122.3942,\n            37.61486\n          ],\n          [\n            -122.395507,\n            37.614537\n          ],\n          [\n            -122.395656,\n            37.614503\n          ],\n          [\n            -122.395798,\n            37.614484\n          ],\n          [\n            -122.395942,\n            37.61448\n          ],\n          [\n            -122.396075,\n            37.614488\n          ],\n          [\n            -122.396207,\n            37.614507\n          ],\n          [\n            -122.396333,\n            37.614538\n          ],\n          [\n            -122.396462,\n            37.614579\n          ],\n          [\n            -122.396559,\n            37.614619\n          ],\n          [\n            -122.39676,\n            37.614732\n          ],\n          [\n            -122.396897,\n            37.614848\n          ],\n          [\n            -122.397027,\n            37.614992\n          ],\n          [\n            -122.397392,\n            37.615455\n          ],\n          [\n            -122.397596,\n            37.615748\n          ],\n          [\n            -122.397721,\n            37.615949\n          ],\n          [\n            -122.397832,\n            37.61616\n          ],\n          [\n            -122.397935,\n            37.616364\n          ],\n          [\n            -122.398047,\n            37.616616\n          ],\n          [\n            -122.398141,\n            37.616847\n          ],\n          [\n            -122.398219,\n            37.617091\n          ],\n          [\n            -122.398496,\n            37.617986\n          ],\n          [\n            -122.399087,\n            37.619704\n          ],\n          [\n            -122.401428,\n            37.626558\n          ],\n          [\n            -122.401524,\n            37.626858\n          ],\n          [\n            -122.401555,\n            37.627013\n          ],\n          [\n            -122.401588,\n            37.627131\n          ],\n          [\n            -122.401575,\n            37.62723\n          ],\n          [\n            -122.40174,\n            37.627921\n          ],\n          [\n            -122.401785,\n            37.628162\n          ],\n          [\n            -122.40194,\n            37.629536\n          ],\n          [\n            -122.401963,\n            37.629853\n          ],\n          [\n            -122.401995,\n            37.630469\n          ],\n          [\n            -122.40208,\n            37.631369\n          ],\n          [\n            -122.402174,\n            37.632234\n          ],\n          [\n            -122.402249,\n            37.632514\n          ],\n          [\n            -122.402545,\n            37.633875\n          ],\n          [\n            -122.402602,\n            37.634133\n          ],\n          [\n            -122.402713,\n            37.634614\n          ],\n          [\n            -122.402776,\n            37.634867\n          ],\n          [\n            -122.402848,\n            37.635113\n          ],\n          [\n            -122.402934,\n            37.635357\n          ],\n          [\n            -122.403035,\n            37.635592\n          ],\n          [\n            -122.403157,\n            37.635845\n          ],\n          [\n            -122.40328,\n            37.636078\n          ],\n          [\n            -122.403413,\n            37.636299\n          ],\n          [\n            -122.403562,\n            37.636525\n          ],\n          [\n            -122.403855,\n            37.636946\n          ],\n          [\n            -122.404032,\n            37.637208\n          ],\n          [\n            -122.404189,\n            37.637463\n          ],\n          [\n            -122.404769,\n            37.638312\n          ],\n          [\n            -122.404927,\n            37.638635\n          ],\n          [\n            -122.405083,\n            37.63898\n          ],\n          [\n            -122.405245,\n            37.639369\n          ],\n          [\n            -122.405415,\n            37.639824\n          ],\n          [\n            -122.405561,\n            37.640263\n          ],\n          [\n            -122.405682,\n            37.640698\n          ],\n          [\n            -122.405792,\n            37.641149\n          ],\n          [\n            -122.405764,\n            37.641341\n          ],\n          [\n            -122.406064,\n            37.643761\n          ],\n          [\n            -122.406436,\n            37.647832\n          ],\n          [\n            -122.406506,\n            37.648639\n          ],\n          [\n            -122.406535,\n            37.648976\n          ],\n          [\n            -122.406609,\n            37.649821\n          ],\n          [\n            -122.406636,\n            37.650139\n          ],\n          [\n            -122.406667,\n            37.6505\n          ],\n          [\n            -122.406749,\n            37.651442\n          ],\n          [\n            -122.406785,\n            37.651851\n          ],\n          [\n            -122.406899,\n            37.653172\n          ],\n          [\n            -122.406914,\n            37.653435\n          ],\n          [\n            -122.406916,\n            37.653712\n          ],\n          [\n            -122.406907,\n            37.653978\n          ],\n          [\n            -122.406891,\n            37.654221\n          ],\n          [\n            -122.406865,\n            37.654463\n          ],\n          [\n            -122.406829,\n            37.654704\n          ],\n          [\n            -122.40678,\n            37.654974\n          ],\n          [\n            -122.406731,\n            37.655209\n          ],\n          [\n            -122.40667,\n            37.65548\n          ],\n          [\n            -122.4066,\n            37.655734\n          ],\n          [\n            -122.406518,\n            37.656002\n          ],\n          [\n            -122.406425,\n            37.656257\n          ],\n          [\n            -122.406317,\n            37.656503\n          ],\n          [\n            -122.406192,\n            37.656757\n          ],\n          [\n            -122.405555,\n            37.657999\n          ],\n          [\n            -122.405317,\n            37.658464\n          ],\n          [\n            -122.405188,\n            37.658704\n          ],\n          [\n            -122.405056,\n            37.658944\n          ],\n          [\n            -122.404916,\n            37.659174\n          ],\n          [\n            -122.404767,\n            37.65939\n          ],\n          [\n            -122.404603,\n            37.659614\n          ],\n          [\n            -122.404427,\n            37.659832\n          ],\n          [\n            -122.404206,\n            37.660081\n          ],\n          [\n            -122.403993,\n            37.660304\n          ],\n          [\n            -122.403771,\n            37.660516\n          ],\n          [\n            -122.403509,\n            37.660743\n          ],\n          [\n            -122.403266,\n            37.660936\n          ],\n          [\n            -122.403026,\n            37.661116\n          ],\n          [\n            -122.402762,\n            37.661301\n          ],\n          [\n            -122.402509,\n            37.661465\n          ],\n          [\n            -122.399691,\n            37.663271\n          ],\n          [\n            -122.399424,\n            37.663443\n          ],\n          [\n            -122.399171,\n            37.663608\n          ],\n          [\n            -122.398909,\n            37.663784\n          ],\n          [\n            -122.398657,\n            37.663954\n          ],\n          [\n            -122.398407,\n            37.66413\n          ],\n          [\n            -122.398171,\n            37.664309\n          ],\n          [\n            -122.397944,\n            37.664483\n          ],\n          [\n            -122.3977,\n            37.664678\n          ],\n          [\n            -122.397472,\n            37.664868\n          ],\n          [\n            -122.397257,\n            37.665054\n          ],\n          [\n            -122.397016,\n            37.665275\n          ],\n          [\n            -122.396798,\n            37.665478\n          ],\n          [\n            -122.396593,\n            37.665673\n          ],\n          [\n            -122.396393,\n            37.665875\n          ],\n          [\n            -122.396195,\n            37.66608\n          ],\n          [\n            -122.395685,\n            37.66661\n          ],\n          [\n            -122.39489,\n            37.667439\n          ],\n          [\n            -122.392727,\n            37.669689\n          ],\n          [\n            -122.392491,\n            37.669939\n          ],\n          [\n            -122.392297,\n            37.670151\n          ],\n          [\n            -122.392106,\n            37.67037\n          ],\n          [\n            -122.391924,\n            37.670583\n          ],\n          [\n            -122.39174,\n            37.670806\n          ],\n          [\n            -122.391564,\n            37.671023\n          ],\n          [\n            -122.391384,\n            37.671247\n          ],\n          [\n            -122.391218,\n            37.671463\n          ],\n          [\n            -122.391044,\n            37.671695\n          ],\n          [\n            -122.39088,\n            37.67192\n          ],\n          [\n            -122.390722,\n            37.672147\n          ],\n          [\n            -122.390564,\n            37.672379\n          ],\n          [\n            -122.390415,\n            37.672612\n          ],\n          [\n            -122.390267,\n            37.672848\n          ],\n          [\n            -122.390112,\n            37.673107\n          ],\n          [\n            -122.389984,\n            37.673324\n          ],\n          [\n            -122.38982,\n            37.673621\n          ],\n          [\n            -122.389675,\n            37.673886\n          ],\n          [\n            -122.389538,\n            37.674144\n          ],\n          [\n            -122.389377,\n            37.674451\n          ],\n          [\n            -122.389226,\n            37.674758\n          ],\n          [\n            -122.389082,\n            37.675058\n          ],\n          [\n            -122.388948,\n            37.675362\n          ],\n          [\n            -122.388811,\n            37.675672\n          ],\n          [\n            -122.388677,\n            37.676004\n          ],\n          [\n            -122.388559,\n            37.676337\n          ],\n          [\n            -122.388471,\n            37.676645\n          ],\n          [\n            -122.388396,\n            37.676972\n          ],\n          [\n            -122.388332,\n            37.677286\n          ],\n          [\n            -122.388285,\n            37.677629\n          ],\n          [\n            -122.388268,\n            37.677962\n          ],\n          [\n            -122.388259,\n            37.678274\n          ],\n          [\n            -122.388268,\n            37.678593\n          ],\n          [\n            -122.388294,\n            37.678913\n          ],\n          [\n            -122.388345,\n            37.679293\n          ],\n          [\n            -122.388403,\n            37.679641\n          ],\n          [\n            -122.388489,\n            37.680042\n          ],\n          [\n            -122.388583,\n            37.680502\n          ],\n          [\n            -122.388755,\n            37.681378\n          ],\n          [\n            -122.388896,\n            37.682058\n          ],\n          [\n            -122.392967,\n            37.699955\n          ],\n          [\n            -122.39466,\n            37.707399\n          ],\n          [\n            -122.394866,\n            37.708328\n          ],\n          [\n            -122.394899,\n            37.708476\n          ],\n          [\n            -122.395013,\n            37.708993\n          ],\n          [\n            -122.395135,\n            37.709545\n          ],\n          [\n            -122.395408,\n            37.710769\n          ],\n          [\n            -122.395491,\n            37.711139\n          ],\n          [\n            -122.39556,\n            37.711375\n          ],\n          [\n            -122.395635,\n            37.711616\n          ],\n          [\n            -122.395722,\n            37.711864\n          ],\n          [\n            -122.395825,\n            37.712115\n          ],\n          [\n            -122.395931,\n            37.712364\n          ],\n          [\n            -122.395985,\n            37.712477\n          ],\n          [\n            -122.396048,\n            37.712608\n          ],\n          [\n            -122.396189,\n            37.712849\n          ],\n          [\n            -122.396452,\n            37.713237\n          ],\n          [\n            -122.396634,\n            37.7135\n          ],\n          [\n            -122.396819,\n            37.71375\n          ],\n          [\n            -122.397314,\n            37.71434\n          ],\n          [\n            -122.397782,\n            37.714898\n          ],\n          [\n            -122.397967,\n            37.715139\n          ],\n          [\n            -122.398141,\n            37.715384\n          ],\n          [\n            -122.398289,\n            37.715614\n          ],\n          [\n            -122.398446,\n            37.715878\n          ],\n          [\n            -122.398613,\n            37.716213\n          ],\n          [\n            -122.398723,\n            37.716454\n          ],\n          [\n            -122.398816,\n            37.716699\n          ],\n          [\n            -122.3989,\n            37.716949\n          ],\n          [\n            -122.398974,\n            37.717198\n          ],\n          [\n            -122.399406,\n            37.718907\n          ],\n          [\n            -122.399451,\n            37.719034\n          ],\n          [\n            -122.399656,\n            37.719719\n          ],\n          [\n            -122.39989,\n            37.72042\n          ],\n          [\n            -122.399989,\n            37.720729\n          ],\n          [\n            -122.400055,\n            37.720999\n          ],\n          [\n            -122.40027,\n            37.721636\n          ],\n          [\n            -122.400481,\n            37.722139\n          ],\n          [\n            -122.401044,\n            37.723502\n          ],\n          [\n            -122.401207,\n            37.723917\n          ],\n          [\n            -122.401564,\n            37.724969\n          ],\n          [\n            -122.401793,\n            37.72553\n          ],\n          [\n            -122.401829,\n            37.725633\n          ],\n          [\n            -122.40264,\n            37.727806\n          ],\n          [\n            -122.402685,\n            37.727907\n          ],\n          [\n            -122.403323,\n            37.729335\n          ],\n          [\n            -122.403499,\n            37.729626\n          ],\n          [\n            -122.404526,\n            37.731511\n          ],\n          [\n            -122.404709,\n            37.731871\n          ],\n          [\n            -122.40488,\n            37.732195\n          ],\n          [\n            -122.405054,\n            37.732507\n          ],\n          [\n            -122.405316,\n            37.732966\n          ],\n          [\n            -122.405482,\n            37.733264\n          ],\n          [\n            -122.405635,\n            37.733529\n          ],\n          [\n            -122.405969,\n            37.734081\n          ],\n          [\n            -122.40612,\n            37.73434\n          ],\n          [\n            -122.406773,\n            37.7354\n          ],\n          [\n            -122.407008,\n            37.735779\n          ],\n          [\n            -122.40714,\n            37.736011\n          ],\n          [\n            -122.407259,\n            37.736224\n          ],\n          [\n            -122.407382,\n            37.736468\n          ],\n          [\n            -122.407495,\n            37.736706\n          ],\n          [\n            -122.407585,\n            37.736925\n          ],\n          [\n            -122.407674,\n            37.737173\n          ],\n          [\n            -122.407756,\n            37.737431\n          ],\n          [\n            -122.40783,\n            37.737696\n          ],\n          [\n            -122.407892,\n            37.737964\n          ],\n          [\n            -122.407936,\n            37.738196\n          ],\n          [\n            -122.407969,\n            37.738451\n          ],\n          [\n            -122.407995,\n            37.738721\n          ],\n          [\n            -122.408004,\n            37.738921\n          ],\n          [\n            -122.408008,\n            37.739176\n          ],\n          [\n            -122.407996,\n            37.73946\n          ],\n          [\n            -122.407956,\n            37.739821\n          ],\n          [\n            -122.407909,\n            37.740108\n          ],\n          [\n            -122.407855,\n            37.740368\n          ],\n          [\n            -122.40778,\n            37.740627\n          ],\n          [\n            -122.407686,\n            37.740902\n          ],\n          [\n            -122.407597,\n            37.74114\n          ],\n          [\n            -122.407493,\n            37.74139\n          ],\n          [\n            -122.407365,\n            37.741649\n          ],\n          [\n            -122.407233,\n            37.741873\n          ],\n          [\n            -122.407059,\n            37.742138\n          ],\n          [\n            -122.406888,\n            37.742372\n          ],\n          [\n            -122.406701,\n            37.742596\n          ],\n          [\n            -122.405824,\n            37.743637\n          ],\n          [\n            -122.405639,\n            37.743872\n          ],\n          [\n            -122.405484,\n            37.744091\n          ],\n          [\n            -122.405327,\n            37.744343\n          ],\n          [\n            -122.4052,\n            37.744576\n          ],\n          [\n            -122.405078,\n            37.744832\n          ],\n          [\n            -122.404968,\n            37.745101\n          ],\n          [\n            -122.404877,\n            37.745361\n          ],\n          [\n            -122.404015,\n            37.74808\n          ],\n          [\n            -122.403466,\n            37.749812\n          ],\n          [\n            -122.403071,\n            37.751057\n          ],\n          [\n            -122.403005,\n            37.751277\n          ],\n          [\n            -122.402947,\n            37.751503\n          ],\n          [\n            -122.402892,\n            37.751777\n          ],\n          [\n            -122.402852,\n            37.752033\n          ],\n          [\n            -122.402827,\n            37.752301\n          ],\n          [\n            -122.402811,\n            37.75255\n          ],\n          [\n            -122.402815,\n            37.752808\n          ],\n          [\n            -122.402829,\n            37.753077\n          ],\n          [\n            -122.402851,\n            37.753336\n          ],\n          [\n            -122.403052,\n            37.755442\n          ],\n          [\n            -122.403071,\n            37.755631\n          ],\n          [\n            -122.403094,\n            37.75583\n          ],\n          [\n            -122.403125,\n            37.75603\n          ],\n          [\n            -122.403163,\n            37.756217\n          ],\n          [\n            -122.403214,\n            37.756402\n          ],\n          [\n            -122.403277,\n            37.756576\n          ],\n          [\n            -122.403356,\n            37.756751\n          ],\n          [\n            -122.403453,\n            37.756931\n          ],\n          [\n            -122.403552,\n            37.757084\n          ],\n          [\n            -122.403663,\n            37.757233\n          ],\n          [\n            -122.403781,\n            37.757368\n          ],\n          [\n            -122.403904,\n            37.757501\n          ],\n          [\n            -122.404047,\n            37.757633\n          ],\n          [\n            -122.404195,\n            37.757757\n          ],\n          [\n            -122.404367,\n            37.75789\n          ],\n          [\n            -122.404528,\n            37.758008\n          ],\n          [\n            -122.40488,\n            37.758259\n          ],\n          [\n            -122.405061,\n            37.758389\n          ],\n          [\n            -122.405232,\n            37.758522\n          ],\n          [\n            -122.405406,\n            37.758665\n          ],\n          [\n            -122.405555,\n            37.758803\n          ],\n          [\n            -122.405698,\n            37.758957\n          ],\n          [\n            -122.405823,\n            37.759114\n          ],\n          [\n            -122.405928,\n            37.759264\n          ],\n          [\n            -122.406026,\n            37.759429\n          ],\n          [\n            -122.406103,\n            37.759583\n          ],\n          [\n            -122.406172,\n            37.759754\n          ],\n          [\n            -122.406221,\n            37.759921\n          ],\n          [\n            -122.40626,\n            37.760092\n          ],\n          [\n            -122.406284,\n            37.760252\n          ],\n          [\n            -122.406296,\n            37.760409\n          ],\n          [\n            -122.406294,\n            37.760569\n          ],\n          [\n            -122.40628,\n            37.760723\n          ],\n          [\n            -122.406257,\n            37.760874\n          ],\n          [\n            -122.406223,\n            37.761029\n          ],\n          [\n            -122.406177,\n            37.761183\n          ],\n          [\n            -122.406118,\n            37.761336\n          ],\n          [\n            -122.406051,\n            37.761482\n          ],\n          [\n            -122.405966,\n            37.761641\n          ],\n          [\n            -122.405882,\n            37.761786\n          ],\n          [\n            -122.405579,\n            37.762265\n          ],\n          [\n            -122.405475,\n            37.762438\n          ],\n          [\n            -122.405369,\n            37.762617\n          ],\n          [\n            -122.405273,\n            37.762797\n          ],\n          [\n            -122.405187,\n            37.762988\n          ],\n          [\n            -122.405114,\n            37.763172\n          ],\n          [\n            -122.40505,\n            37.763373\n          ],\n          [\n            -122.405001,\n            37.763567\n          ],\n          [\n            -122.40496,\n            37.763763\n          ],\n          [\n            -122.404929,\n            37.763957\n          ],\n          [\n            -122.404907,\n            37.764158\n          ],\n          [\n            -122.404887,\n            37.764385\n          ],\n          [\n            -122.404918,\n            37.765253\n          ],\n          [\n            -122.405144,\n            37.767124\n          ],\n          [\n            -122.405177,\n            37.767311\n          ],\n          [\n            -122.405205,\n            37.767419\n          ],\n          [\n            -122.405242,\n            37.767523\n          ],\n          [\n            -122.405297,\n            37.767639\n          ],\n          [\n            -122.405376,\n            37.76777\n          ],\n          [\n            -122.405473,\n            37.767886\n          ],\n          [\n            -122.405566,\n            37.767984\n          ],\n          [\n            -122.405661,\n            37.768067\n          ],\n          [\n            -122.40576,\n            37.768143\n          ],\n          [\n            -122.406917,\n            37.769032\n          ],\n          [\n            -122.408374,\n            37.770141\n          ],\n          [\n            -122.408457,\n            37.770217\n          ],\n          [\n            -122.408528,\n            37.770296\n          ],\n          [\n            -122.408586,\n            37.770378\n          ],\n          [\n            -122.408631,\n            37.77046\n          ],\n          [\n            -122.408664,\n            37.770552\n          ],\n          [\n            -122.408677,\n            37.770639\n          ],\n          [\n            -122.408685,\n            37.770725\n          ],\n          [\n            -122.408677,\n            37.770798\n          ],\n          [\n            -122.408658,\n            37.770868\n          ],\n          [\n            -122.40863,\n            37.770942\n          ],\n          [\n            -122.408559,\n            37.771113\n          ],\n          [\n            -122.408538,\n            37.771202\n          ],\n          [\n            -122.408536,\n            37.7713\n          ],\n          [\n            -122.409081,\n            37.771736\n          ],\n          [\n            -122.410083,\n            37.772537\n          ],\n          [\n            -122.410697,\n            37.773018\n          ],\n          [\n            -122.411079,\n            37.773323\n          ],\n          [\n            -122.411627,\n            37.773773\n          ],\n          [\n            -122.412165,\n            37.774203\n          ],\n          [\n            -122.412622,\n            37.774568\n          ],\n          [\n            -122.413152,\n            37.774999\n          ],\n          [\n            -122.413443,\n            37.775228\n          ],\n          [\n            -122.413712,\n            37.775441\n          ],\n          [\n            -122.413461,\n            37.775637\n          ]\n        ],\n        \"type\": \"LineString\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.10)\n\nif (NOT ANDROID_NDK_TOOLCHAIN_INCLUDED)\n    message(FATAL_ERROR \"-- Toolchain file not included, see https://developer.android.com/ndk/guides/cmake\")\nendif ()\n\nadd_library(\n    example-cpp-custom-layer MODULE\n    ${PROJECT_SOURCE_DIR}/example_custom_layer.cpp\n)\n\ntarget_include_directories(\n    example-cpp-custom-layer\n    PRIVATE\n        ${PROJECT_SOURCE_DIR}\n)\n\n# Use the same compile_options as in mapbox-gl\ntarget_compile_options(\n    example-cpp-custom-layer\n    PRIVATE\n        $<$<CONFIG:Release>:-Oz>\n        $<$<CONFIG:Release>:-Qunused-arguments>\n        $<$<CONFIG:Release>:-flto>\n        $<$<CONFIG:Release>:-fvisibility=hidden>\n        $<$<CONFIG:Release>:-fvisibility-inlines-hidden>)\n\n# Use the same linker options as in mapbox-gl\ntarget_link_libraries(\n    example-cpp-custom-layer\n    PRIVATE\n        GLESv2\n        log\n        $<$<CONFIG:Release>:-Wl,--gc-sections>\n        $<$<CONFIG:Release>:-Wl,--icf=all>\n        $<$<CONFIG:Release>:-flto>\n        $<$<CONFIG:Release>:-fuse-ld=lld>\n        $<$<CONFIG:Release>:-Wl,--lto-new-pass-manager>\n        $<$<CONFIG:Release>:-Wl,--pack-dyn-relocs=android>\n        $<$<CONFIG:Release>:-Wl,--lto-O3>\n)"
  },
  {
    "path": "app/src/main/cpp/example_custom_layer.cpp",
    "content": "#include <GLES2/gl2.h>\n#include <android/log.h>\n#include <jni.h>\n#include <sstream>\n\n// DEBUGGING\n\nconst char* LOG_TAG = \"Custom Layer Cpp Example\";\n\n#define LOG(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\n\nconst char* stringFromError(GLenum err) {\n    switch (err) {\n        case GL_INVALID_ENUM:\n            return \"GL_INVALID_ENUM\";\n\n        case GL_INVALID_VALUE:\n            return \"GL_INVALID_VALUE\";\n\n        case GL_INVALID_OPERATION:\n            return \"GL_INVALID_OPERATION\";\n\n        case GL_INVALID_FRAMEBUFFER_OPERATION:\n            return \"GL_INVALID_FRAMEBUFFER_OPERATION\";\n\n        case GL_OUT_OF_MEMORY:\n            return \"GL_OUT_OF_MEMORY\";\n\n#ifdef GL_TABLE_TOO_LARGE\n        case GL_TABLE_TOO_LARGE:\n        return \"GL_TABLE_TOO_LARGE\";\n#endif\n\n#ifdef GL_STACK_OVERFLOW\n        case GL_STACK_OVERFLOW:\n        return \"GL_STACK_OVERFLOW\";\n#endif\n\n#ifdef GL_STACK_UNDERFLOW\n        case GL_STACK_UNDERFLOW:\n        return \"GL_STACK_UNDERFLOW\";\n#endif\n\n#ifdef GL_CONTEXT_LOST\n        case GL_CONTEXT_LOST:\n        return \"GL_CONTEXT_LOST\";\n#endif\n\n        default:\n            return \"GL_UNKNOWN\";\n    }\n}\n\nstruct Error : std::runtime_error {\n    using std::runtime_error::runtime_error;\n};\n\nvoid checkError(const char *cmd, const char *file, int line) {\n\n    GLenum err = GL_NO_ERROR;\n    if ((err = glGetError()) != GL_NO_ERROR) {\n        std::ostringstream message;\n        message << cmd  << \": Error \" << stringFromError(err);\n\n        // Check for further errors\n        while ((err = glGetError()) != GL_NO_ERROR) {\n            message << \", \" << stringFromError(err);\n        }\n\n        message << \" at \" << file << \":\" << line;\n        __android_log_write(ANDROID_LOG_ERROR, LOG_TAG, message.str().c_str());\n// TODO: getError is not working properly, needs to be fixed in gl-native.\n// https://github.com/mapbox/mapbox-maps-android/issues/860\n//        throw Error(message.str());\n    }\n}\n\n#ifndef NDEBUG\n#define GL_CHECK_ERROR(cmd) ([&]() { struct __MBGL_C_E { ~__MBGL_C_E() noexcept(false) { checkError(#cmd, __FILE__, __LINE__); } } __MBGL_C_E; return cmd; }())\n#else\n#define GL_CHECK_ERROR(cmd) (cmd)\n#endif\n\nvoid checkLinkStatus(GLuint program) {\n    GLint isLinked = 0;\n    glGetProgramiv(program, GL_LINK_STATUS, &isLinked);\n    if (isLinked == GL_FALSE) {\n        GLint maxLength = 0;\n        glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);\n        GLchar infoLog[maxLength];\n        glGetProgramInfoLog(program, maxLength, &maxLength, &infoLog[0]);\n        __android_log_write(ANDROID_LOG_ERROR, LOG_TAG, &infoLog[0]);\n        throw Error(infoLog);\n    }\n\n}\n\nvoid checkCompileStatus(GLuint shader) {\n    GLint isCompiled = 0;\n    glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);\n    if (isCompiled == GL_FALSE) {\n        GLint maxLength = 0;\n        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);\n\n        // The maxLength includes the NULL character\n        GLchar errorLog[maxLength];\n        glGetShaderInfoLog(shader, maxLength, &maxLength, &errorLog[0]);\n        __android_log_write(ANDROID_LOG_ERROR, LOG_TAG, &errorLog[0]);\n        throw Error(errorLog);\n    }\n}\n\n// /DEBUGGING\n\nstatic const GLchar * vertexShaderSource = \"attribute vec2 a_pos; void main() { gl_Position = vec4(a_pos, 0, 1); }\";\nstatic const GLchar * fragmentShaderSource = \"uniform highp vec4 fill_color; void main() { gl_FragColor = fill_color; }\";\n\nGLuint program = 0;\nGLuint vertexShader = 0;\nGLuint fragmentShader = 0;\nGLuint buffer = 0;\nGLuint a_pos = 0;\nGLuint fill_color = 0;\n\nstatic GLfloat color[]= { 0.0f, 1.0f, 0.0f, 1.0f };\n\nvoid JNICALL nativeInitialize(JNIEnv*, jobject) {\n    LOG(\"nativeInitialize\");\n\n    // Debug info\n    int maxAttrib;\n    GL_CHECK_ERROR(glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttrib));\n    LOG(\"Max vertex attributes: %i\", maxAttrib);\n\n    program = GL_CHECK_ERROR(glCreateProgram());\n    vertexShader = GL_CHECK_ERROR(glCreateShader(GL_VERTEX_SHADER));\n    fragmentShader = GL_CHECK_ERROR(glCreateShader(GL_FRAGMENT_SHADER));\n\n    GL_CHECK_ERROR(glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr));\n    GL_CHECK_ERROR(glCompileShader(vertexShader));\n    checkCompileStatus(vertexShader);\n    GL_CHECK_ERROR(glAttachShader(program, vertexShader));\n    GL_CHECK_ERROR(glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr));\n    GL_CHECK_ERROR(glCompileShader(fragmentShader));\n    checkCompileStatus(fragmentShader);\n    GL_CHECK_ERROR(glAttachShader(program, fragmentShader));\n    GL_CHECK_ERROR(glLinkProgram(program));\n    checkLinkStatus(program);\n\n    a_pos = GL_CHECK_ERROR(glGetAttribLocation(program, \"a_pos\"));\n    fill_color = GL_CHECK_ERROR(glGetUniformLocation(program, \"fill_color\"));\n\n    GLfloat background[] = { -1, -1, 1, -1, -1, 1, 1, 1 };\n    GL_CHECK_ERROR(glGenBuffers(1, &buffer));\n    GL_CHECK_ERROR(glBindBuffer(GL_ARRAY_BUFFER, buffer));\n    GL_CHECK_ERROR(glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), background, GL_STATIC_DRAW));\n}\n\nvoid JNICALL nativeRender(JNIEnv* env, jobject, jobject parameters) {\n    LOG(\"nativeRender\");\n\n    // Parse out CustomLayerRenderParameters.\n    jclass cls = env->FindClass(\"com/mapbox/maps/CustomLayerRenderParameters\");\n    jfieldID getWidth = env->GetFieldID(cls, \"width\", \"D\");\n    jfieldID getHeight = env->GetFieldID(cls, \"height\", \"D\");\n    jfieldID getLatitude = env->GetFieldID(cls, \"latitude\", \"D\");\n    jfieldID getLongitude = env->GetFieldID(cls, \"longitude\", \"D\");\n    jfieldID getZoom = env->GetFieldID(cls, \"zoom\", \"D\");\n    jfieldID getBearing = env->GetFieldID(cls, \"bearing\", \"D\");\n    jfieldID getPitch = env->GetFieldID(cls, \"pitch\", \"D\");\n    jfieldID getFieldOfView = env->GetFieldID(cls, \"fieldOfView\", \"D\");\n    jfieldID getProjectionMatrix = env->GetFieldID(cls, \"projectionMatrix\", \"Ljava/util/List;\");\n    double width = env->GetDoubleField(parameters, getWidth);\n    double height = env->GetDoubleField(parameters, getHeight);\n    double latitude = env->GetDoubleField(parameters, getLatitude);\n    double longitude = env->GetDoubleField(parameters, getLongitude);\n    double zoom = env->GetDoubleField(parameters, getZoom);\n    double bearing = env->GetDoubleField(parameters, getBearing);\n    double pitch = env->GetDoubleField(parameters, getPitch);\n    double fieldOfView = env->GetDoubleField(parameters, getFieldOfView);\n    jobject projectionMatric = env->GetObjectField(parameters, getProjectionMatrix);\n\n    LOG(\"width: %f, height: %f \", width, height);\n    LOG(\"lat: %f, lng: %f \", latitude, longitude);\n    LOG(\"zoom: %f, bearing: %f, pitch: %f, filedOfView: %f\", zoom, bearing, pitch, fieldOfView);\n\n    // Parse out projectionMatric from CustomLayerRenderParameters.\n    jclass arrayCls = env->FindClass(\"java/util/List\");\n    jmethodID getSize = env->GetMethodID(arrayCls, \"size\", \"()I\");\n    jmethodID getItem = env->GetMethodID(arrayCls, \"get\", \"(I)Ljava/lang/Object;\");\n    jclass doubleCls = env->FindClass(\"java/lang/Double\");\n    jmethodID getDoubleValue = env->GetMethodID(doubleCls, \"doubleValue\", \"()D\");\n    jvalue arg;\n    int size = env->CallIntMethodA(projectionMatric, getSize, &arg);\n    double* projectionMatricArray = new double[size];\n    for (int i = 0; i < size; i++) {\n        arg.i = i;\n        jobject element = env->CallObjectMethodA(projectionMatric, getItem, &arg);\n        projectionMatricArray[i] = env->CallDoubleMethodA(element, getDoubleValue, &arg);\n        env->DeleteLocalRef(element);\n        LOG(\"projectionMatrix[%d]: %f\", i, projectionMatricArray[i]);\n    }\n\n    // Open GL code starts here\n    glUseProgram(program);\n    glBindBuffer(GL_ARRAY_BUFFER, buffer);\n    glEnableVertexAttribArray(a_pos);\n    glVertexAttribPointer(a_pos, 2, GL_FLOAT, GL_FALSE, 0, NULL);\n    glDisable(GL_STENCIL_TEST);\n    glDisable(GL_DEPTH_TEST);\n    glUniform4fv(fill_color, 1, color);\n\n    GL_CHECK_ERROR(glUseProgram(program));\n    GL_CHECK_ERROR(glBindBuffer(GL_ARRAY_BUFFER, buffer));\n    GL_CHECK_ERROR(glEnableVertexAttribArray(a_pos));\n    GL_CHECK_ERROR(glVertexAttribPointer(a_pos, 2, GL_FLOAT, GL_FALSE, 0, NULL));\n    GL_CHECK_ERROR(glDisable(GL_STENCIL_TEST));\n    GL_CHECK_ERROR(glDisable(GL_DEPTH_TEST));\n    GL_CHECK_ERROR(glUniform4fv(fill_color, 1, color));\n    GL_CHECK_ERROR(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4));\n}\n\nvoid JNICALL nativeContextLost(JNIEnv*, jobject) {\n    LOG(\"nativeContextLost\");\n    program = 0;\n}\n\nvoid JNICALL nativeDeinitialize(JNIEnv*, jobject, jfloat red, jfloat green, jfloat blue, jfloat alpha) {\n    LOG(\"nativeDeinitialize\");\n    if (program) {\n        glDeleteBuffers(1, &buffer);\n        glDetachShader(program, vertexShader);\n        glDetachShader(program, fragmentShader);\n        glDeleteShader(vertexShader);\n        glDeleteShader(fragmentShader);\n        glDeleteProgram(program);\n    }\n}\n\nvoid JNICALL nativeSetColor(JNIEnv*, jobject, jfloat red, jfloat green, jfloat blue, jfloat alpha) {\n    LOG(\"nativeSetColor: %.2f, %.2f, %.2f, %.2f\", red, green, blue, alpha);\n    color[0] = red;\n    color[1] = green;\n    color[2] = blue;\n    color[3] = alpha;\n}\n\nextern \"C\" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {\n    __android_log_write(ANDROID_LOG_INFO, LOG_TAG, \"OnLoad\");\n\n    JNIEnv *env = nullptr;\n    vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6);\n\n    jclass customLayerClass = env->FindClass(\"com/mapbox/maps/testapp/examples/customlayer/NativeExampleCustomLayer\");\n\n    JNINativeMethod methods[] = {\n        {\"initialize\", \"()V\", reinterpret_cast<void *>(&nativeInitialize)},\n        {\"render\", \"(Lcom/mapbox/maps/CustomLayerRenderParameters;)V\", reinterpret_cast<void *>(&nativeRender)},\n        {\"contextLost\", \"()V\", reinterpret_cast<void *>(&nativeContextLost)},\n        {\"deinitialize\", \"()V\", reinterpret_cast<void *>(&nativeDeinitialize)},\n        {\"setColor\", \"(FFFF)V\", reinterpret_cast<void *>(&nativeSetColor)}\n    };\n\n    if (env->RegisterNatives(customLayerClass, methods, sizeof(methods)/sizeof(JNINativeMethod)) < 0) {\n        env->ExceptionDescribe();\n        return JNI_ERR;\n    }\n\n    return JNI_VERSION_1_6;\n}\n\nextern \"C\" JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *, void *) {\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/EmptyActivity.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport androidx.appcompat.app.AppCompatActivity\n\nclass EmptyActivity : AppCompatActivity()"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/EmptyFragmentActivity.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport android.os.Bundle\nimport androidx.fragment.app.FragmentActivity\nimport com.mapbox.maps.MapView\n\nclass EmptyFragmentActivity : FragmentActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/ExampleOverviewActivity.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport android.annotation.SuppressLint\nimport android.content.ComponentName\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Bundle\nimport android.text.Editable\nimport android.text.TextWatcher\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.snackbar.Snackbar\nimport com.mapbox.maps.Map\nimport com.mapbox.maps.Version\nimport com.mapbox.maps.testapp.adapter.ExampleAdapter\nimport com.mapbox.maps.testapp.adapter.ExampleSectionAdapter\nimport com.mapbox.maps.testapp.databinding.ActivityExampleOverviewBinding\nimport com.mapbox.maps.testapp.model.SpecificExample\nimport com.mapbox.maps.testapp.utils.ItemClickSupport\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.channels.trySendBlocking\nimport kotlinx.coroutines.flow.callbackFlow\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.flow.conflate\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n/**\n * Activity shown when application is started\n *\n * This activity will generate data for RecyclerView based on the AndroidManifest entries.\n * It uses tags as category and description to order the different entries.\n *\n */\nclass ExampleOverviewActivity : AppCompatActivity() {\n\n  private lateinit var sectionAdapter: ExampleSectionAdapter\n  private var currentlyDisplayedExampleList: List<SpecificExample> = ArrayList()\n  private var allExampleList: List<SpecificExample> = ArrayList()\n\n  private lateinit var binding: ActivityExampleOverviewBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityExampleOverviewBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    @SuppressLint(\"RestrictedApi\")\n    val glNativeVersion =\n      \"Maps: ${Version.getVersionString()} (${Version.getRevisionString()})\"\n    @SuppressLint(\"RestrictedApi\")\n    val commonVersion =\n      \"Common: ${com.mapbox.common.Version.getCommonSDKVersionString()} (${com.mapbox.common.Version.getCommonSDKRevisionString()})\"\n    @SuppressLint(\"RestrictedApi\")\n    val renderBackend = Map.getSupportedRenderBackend()\n    @SuppressLint(\"SetTextI18n\")\n    binding.sdkVersions.text = \"$glNativeVersion; $commonVersion; Renderer: $renderBackend\"\n\n    binding.recyclerView.apply {\n      layoutManager = LinearLayoutManager(this@ExampleOverviewActivity)\n      addOnItemTouchListener(RecyclerView.SimpleOnItemTouchListener())\n      setHasFixedSize(true)\n      ItemClickSupport.addTo(this)\n        .setOnItemClickListener { _, position, _ ->\n          if (!sectionAdapter.isSectionHeaderPosition(position)) {\n            val itemPosition = sectionAdapter.getConvertedPosition(position)\n            if (currentlyDisplayedExampleList.isNotEmpty()) {\n              startExample(currentlyDisplayedExampleList.elementAtOrNull(itemPosition))\n            } else {\n              startExample(allExampleList.elementAtOrNull(itemPosition))\n            }\n          }\n        }\n    }\n\n    lifecycleScope.launch {\n      // Always load the examples list. Otherwise, filtering will not work.\n      allExampleList = loadExamples()\n      if (savedInstanceState == null || !savedInstanceState.containsKey(KEY_STATE_EXAMPLES)) {\n        displayExampleList(allExampleList)\n      } else {\n        @Suppress(\"DEPRECATION\")\n        displayExampleList(savedInstanceState.getParcelableArrayList(KEY_STATE_EXAMPLES)!!)\n      }\n    }\n\n    lifecycleScope.launch {\n      callbackFlow {\n        val callback = object : TextWatcher {\n          override fun afterTextChanged(s: Editable) {\n            // Empty because this callback isn't useful for the app\n          }\n\n          override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {\n            // Empty because this callback isn't useful for the app\n          }\n\n          override fun onTextChanged(text: CharSequence, start: Int, before: Int, count: Int) {\n            trySendBlocking(text.toString())\n          }\n        }\n        binding.exampleSearchEdittext.addTextChangedListener(callback)\n        awaitClose {\n          binding.exampleSearchEdittext.removeTextChangedListener(callback)\n        }\n      }.conflate()\n        .onEach {\n          if (it.isEmpty()) {\n            binding.clearSearchImageview.visibility = View.INVISIBLE\n          } else {\n            binding.clearSearchImageview.visibility = View.VISIBLE\n          }\n        }\n        .flowOn(Dispatchers.Main)\n        .map { textFilter ->\n          if (textFilter.isEmpty()) {\n            allExampleList\n          } else {\n            allExampleList.filter { example ->\n              with(example) {\n                simpleName.contains(textFilter, true) ||\n                  category.contains(textFilter, true) ||\n                  description.contains(textFilter, true) ||\n                  label.contains(textFilter, true)\n              }\n            }\n          }\n        }\n        .flowOn(Dispatchers.Default)\n        .collectLatest { filteredExamples ->\n          displayExampleList(filteredExamples)\n          if (filteredExamples.isEmpty() && allExampleList.isNotEmpty()) {\n            Snackbar.make(\n              binding.rootLayout,\n              getString(R.string.no_results_for_search_query),\n              Snackbar.LENGTH_SHORT\n            ).show()\n          }\n        }\n    }\n\n    binding.clearSearchImageview.setOnClickListener {\n      binding.exampleSearchEdittext.text.clear()\n    }\n  }\n\n  private suspend fun displayExampleList(specificExamplesList: List<SpecificExample>) = withContext(Dispatchers.Default) {\n    if (specificExamplesList.isEmpty()) {\n      return@withContext\n    }\n    val sections = arrayListOf<ExampleSectionAdapter.Section>()\n    var currentCat = \"\"\n    for (i in specificExamplesList.indices) {\n      val category = specificExamplesList[i].category\n      if (currentCat != category) {\n        sections.add(ExampleSectionAdapter.Section(i, category))\n        currentCat = category\n      }\n    }\n    sectionAdapter = ExampleSectionAdapter(\n      this@ExampleOverviewActivity,\n      R.layout.section_main_layout,\n      R.id.section_text, ExampleAdapter(specificExamplesList)\n    )\n    sectionAdapter.setSections(sections.toTypedArray())\n    withContext(Dispatchers.Main.immediate) {\n      binding.recyclerView.adapter = sectionAdapter\n    }\n    currentlyDisplayedExampleList = specificExamplesList\n  }\n\n  private fun startExample(specificExample: SpecificExample?) {\n    specificExample?.let {\n      startActivity(Intent().withComponent(packageName, it.name))\n    }\n  }\n\n  private fun Intent.withComponent(packageName: String, exampleName: String): Intent {\n    component = ComponentName(packageName, exampleName)\n    return this\n  }\n\n  override fun onSaveInstanceState(outState: Bundle) {\n    super.onSaveInstanceState(outState)\n    if (currentlyDisplayedExampleList.isNotEmpty()) {\n      outState.putParcelableArrayList(\n        KEY_STATE_EXAMPLES,\n        currentlyDisplayedExampleList as ArrayList<SpecificExample>?\n      )\n    }\n  }\n\n  private suspend fun loadExamples(): List<SpecificExample> = withContext(Dispatchers.Default) {\n    val categorizedExamples = mutableListOf<SpecificExample>()\n    val nonCategorizedExamples = mutableListOf<SpecificExample>()\n    @Suppress(\"DEPRECATION\")\n    val appPackageInfo = packageManager.getPackageInfo(\n      packageName,\n      PackageManager.GET_ACTIVITIES or PackageManager.GET_META_DATA\n    )\n    // We use this activity package name in case the `applicationId`/`packageName` is different\n    val packageName = ExampleOverviewActivity::class.java.`package`!!.name\n    val categoryKey = getString(R.string.category)\n    for (info in appPackageInfo.activities.orEmpty()) {\n      if (info.labelRes != 0 && info.name.startsWith(packageName) &&\n        info.name != ExampleOverviewActivity::class.java.name\n      ) {\n        val label = getString(info.labelRes)\n        val description = runCatching { getString(info.descriptionRes) }.getOrDefault(\"-\")\n        val category = info.metaData?.getString(categoryKey)\n        if (category != null) {\n          categorizedExamples.add(SpecificExample(info.name, label, description, category))\n        } else {\n          nonCategorizedExamples.add(SpecificExample(info.name, label, description, \"Other\"))\n        }\n      }\n    }\n\n    if (categorizedExamples.isNotEmpty()) {\n      val comparator =\n        Comparator<SpecificExample> { lhs, rhs ->\n          var result = lhs.category.compareTo(rhs.category, true)\n\n          if (result == 0) {\n            result = lhs.label.compareTo(rhs.label, true)\n          }\n          result\n        }\n      categorizedExamples.sortWith(comparator)\n    }\n    return@withContext categorizedExamples + nonCategorizedExamples\n  }\n\n  companion object {\n    private const val KEY_STATE_EXAMPLES = \"examplesList\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/MapboxApplication.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport android.app.Application\nimport android.os.StrictMode\nimport com.mapbox.android.core.permissions.PermissionsManager\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.common.MapboxTracing\nimport com.mapbox.common.geofencing.GeofencingError\nimport com.mapbox.common.geofencing.GeofencingEvent\nimport com.mapbox.common.geofencing.GeofencingFactory\nimport com.mapbox.common.geofencing.GeofencingObserver\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.testapp.examples.geofence.ExtendedGeofencingActivity\n\n/**\n * Application class of the test application.\n **/\nclass MapboxApplication : Application() {\n\n  @MapboxExperimental\n  private val geofencingObserver: GeofencingObserver = object : GeofencingObserver {\n\n    override fun onEntry(event: GeofencingEvent) {\n      ExtendedGeofencingActivity.showNotification(\n        this@MapboxApplication,\n        \"Entry into feature id = ${event.feature.id()} at ${event.timestamp}\",\n        event.feature.id(),\n        ExtendedGeofencingActivity.NOTIFICATION_FEATURE_ENTRY\n      )\n    }\n\n    override fun onExit(event: GeofencingEvent) {\n      ExtendedGeofencingActivity.showNotification(\n        this@MapboxApplication,\n        \"Exit from feature id = ${event.feature.id()} at ${event.timestamp}\",\n        event.feature.id(),\n        ExtendedGeofencingActivity.NOTIFICATION_FEATURE_EXIT\n      )\n    }\n\n    override fun onDwell(event: GeofencingEvent) {\n      ExtendedGeofencingActivity.showNotification(\n        this@MapboxApplication,\n        \"Dwell into feature id = ${event.feature.id()} at ${event.timestamp}\",\n        event.feature.id(),\n        ExtendedGeofencingActivity.NOTIFICATION_FEATURE_DWELL\n      )\n    }\n\n    override fun onError(error: GeofencingError) {\n      logD(\"MapboxApplication\", \"onError() called with: error = $error\")\n    }\n\n    override fun onUserConsentChanged(isConsentGiven: Boolean) {\n      logW(\"MapboxApplication\", \"onUserConsentChanged() called with: isConsentGiven = $isConsentGiven\")\n    }\n  }\n\n  // TODO: temporary workaround to avoid double adding of listener if we don't\n  // have location permissions on the start of the app\n  private var isObserverAdded: Boolean = false\n\n  override fun onCreate() {\n    super.onCreate()\n    // Enable all traces. Useful when capturing Perfetto traces\n    MapboxTracing.enableAll()\n    initializeStrictMode()\n    if (ENABLE_BACKGROUND_GEOFENCING) {\n      registerGeofencingObserver()\n    }\n  }\n\n  private fun initializeStrictMode() {\n    StrictMode.setThreadPolicy(\n      StrictMode.ThreadPolicy.Builder()\n        .detectAll()\n        .build()\n    )\n    StrictMode.setVmPolicy(\n      StrictMode.VmPolicy.Builder()\n        .detectLeakedSqlLiteObjects()\n        .penaltyLog()\n        .penaltyDeath()\n        .build()\n    )\n  }\n\n  @MapboxExperimental\n  fun registerGeofencingObserver() {\n    if (PermissionsManager.areLocationPermissionsGranted(this) && !isObserverAdded) {\n      val geofencing = GeofencingFactory.getOrCreate()\n      geofencing.addObserver(geofencingObserver) { it ->\n        it.error?.let {\n          logW(\"MapboxApplication\", \"Failed to registerGeofencingObserver: ${it.message}\")\n        }\n      }\n      isObserverAdded = true\n    }\n  }\n\n  companion object {\n\n    /**\n     * Flag to showcase background behavior of the geofence engine. When enabled, notifications will\n     * be created for the different geofencing events.\n     */\n    const val ENABLE_BACKGROUND_GEOFENCING = true\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/TestMapActivity.kt",
    "content": "package com.mapbox.maps.testapp\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport java.util.concurrent.CountDownLatch\n\nclass TestMapActivity : AppCompatActivity() {\n  var startLatch = CountDownLatch(1)\n    private set\n  var stopLatch = CountDownLatch(0)\n    private set\n\n  lateinit var mapView: MapView\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    mapView = MapView(this)\n    setContentView(mapView)\n    mapView.mapboxMap\n      .apply {\n        setCamera(\n          CameraOptions.Builder()\n            .center(Point.fromLngLat(LONGITUDE, LATITUDE))\n            .zoom(9.0)\n            .build()\n        )\n      }\n  }\n\n  override fun onStart() {\n    super.onStart()\n    startLatch.countDown()\n    stopLatch = CountDownLatch(1)\n  }\n\n  override fun onStop() {\n    super.onStop()\n\n    stopLatch.countDown()\n    startLatch = CountDownLatch(1)\n  }\n\n  companion object {\n    private const val LATITUDE = 40.0\n    private const val LONGITUDE = -74.5\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/adapter/ExampleAdapter.kt",
    "content": "package com.mapbox.maps.testapp.adapter\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.recyclerview.widget.RecyclerView\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.model.SpecificExample\n\n/**\n * Adapter used for the ExampleOverviewActivity.\n *\n * Adapts a SpecificExample to a visual representation to be shown in\n * a RecyclerView [ExampleSectionAdapter.Section].\n */\nclass ExampleAdapter(private val specificExampleList: List<SpecificExample>) :\n  RecyclerView.Adapter<ExampleAdapter.ViewHolder>() {\n\n  open class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {\n    var labelView: TextView = view.findViewById(R.id.nameView)\n    var descriptionView: TextView = view.findViewById(R.id.descriptionView)\n  }\n\n  override fun getItemCount(): Int {\n    return specificExampleList.size\n  }\n\n  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n    val view =\n      LayoutInflater.from(parent.context).inflate(R.layout.item_single_example, parent, false)\n    return ViewHolder(view)\n  }\n\n  override fun onBindViewHolder(holder: ViewHolder, position: Int) {\n    holder.labelView.text = specificExampleList[position].label\n    holder.descriptionView.text = specificExampleList[position].description\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/adapter/ExampleSectionAdapter.kt",
    "content": "package com.mapbox.maps.testapp.adapter\n\nimport android.content.Context\nimport android.util.SparseArray\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.annotation.IdRes\nimport androidx.annotation.LayoutRes\nimport androidx.annotation.NonNull\nimport androidx.recyclerview.widget.RecyclerView\nimport java.util.*\n\nclass ExampleSectionAdapter(\n  private val context: Context,\n  @field:LayoutRes\n  private val sectionRes: Int,\n  @field:IdRes\n  private val textRes: Int,\n  private val adapter: ExampleAdapter\n) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {\n  private var sections: SparseArray<Section> = SparseArray()\n  private var valid = true\n\n  init {\n    adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {\n      override fun onChanged() {\n        valid = adapter.itemCount > 0\n        notifyDataSetChanged()\n      }\n\n      override fun onItemRangeChanged(positionStart: Int, itemCount: Int) {\n        valid = adapter.itemCount > 0\n        notifyItemRangeChanged(positionStart, itemCount)\n      }\n\n      override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {\n        valid = adapter.itemCount > 0\n        notifyItemRangeInserted(positionStart, itemCount)\n      }\n\n      override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {\n        valid = adapter.itemCount > 0\n        notifyItemRangeRemoved(positionStart, itemCount)\n      }\n    })\n  }\n\n  override fun getItemCount(): Int {\n    return if (valid) adapter.itemCount + sections.size() else 0\n  }\n\n  class SectionViewHolder(@NonNull view: View, @IdRes textRes: Int) : RecyclerView.ViewHolder(view) {\n    var title: TextView = view.findViewById<View>(textRes) as TextView\n  }\n\n  override fun onCreateViewHolder(parent: ViewGroup, typeView: Int): RecyclerView.ViewHolder {\n    return if (typeView == SECTION_TYPE) {\n      val view = LayoutInflater.from(context).inflate(sectionRes, parent, false)\n      SectionViewHolder(view, textRes)\n    } else {\n      adapter.onCreateViewHolder(parent, typeView - 1)\n    }\n  }\n\n  override fun onBindViewHolder(sectionViewHolder: RecyclerView.ViewHolder, position: Int) {\n    if (isSectionHeaderPosition(position)) {\n      val cleanTitle = sections.get(position).title.toString().replace(\"_\", \" \")\n      val newSectionViewHolder = sectionViewHolder as SectionViewHolder\n      newSectionViewHolder.title.text = cleanTitle\n    } else {\n      adapter.onBindViewHolder(sectionViewHolder as ExampleAdapter.ViewHolder, getConvertedPosition(position))\n    }\n  }\n\n  override fun getItemViewType(position: Int): Int {\n    return if (isSectionHeaderPosition(position))\n      SECTION_TYPE\n    else\n      adapter.getItemViewType(getConvertedPosition(position)) + 1\n  }\n\n  class Section(internal var firstPosition: Int, title: CharSequence) {\n    internal var sectionedPosition: Int = 0\n    var title: CharSequence\n      internal set\n\n    init {\n      this.title = title\n    }\n  }\n\n  fun setSections(sections: Array<Section>) {\n    this.sections.clear()\n\n    Arrays.sort(sections) { section, section1 ->\n      when {\n        section.firstPosition == section1.firstPosition -> 0\n        section.firstPosition < section1.firstPosition -> -1\n        else -> 1\n      }\n    }\n\n    for ((offset, section) in sections.withIndex()) {\n      section.sectionedPosition = section.firstPosition + offset\n      this.sections.append(section.sectionedPosition, section)\n    }\n\n    notifyDataSetChanged()\n  }\n\n  fun getConvertedPosition(sectionedPosition: Int): Int {\n    if (isSectionHeaderPosition(sectionedPosition)) {\n      return RecyclerView.NO_POSITION\n    }\n\n    var offset = 0\n    for (i in 0 until sections.size()) {\n      if (sections.valueAt(i).sectionedPosition > sectionedPosition) {\n        break\n      }\n      --offset\n    }\n    return sectionedPosition + offset\n  }\n\n  fun isSectionHeaderPosition(position: Int): Boolean {\n    return sections.get(position) != null\n  }\n\n  override fun getItemId(position: Int): Long {\n    return (\n      if (isSectionHeaderPosition(position))\n        Integer.MAX_VALUE - sections.indexOfKey(position).toLong()\n      else\n        adapter.getItemId(getConvertedPosition(position))\n      )\n  }\n\n  companion object {\n    private const val SECTION_TYPE = 0\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/AnimatedImageSourceActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.rasterLayer\nimport com.mapbox.maps.extension.style.sources.generated.ImageSource\nimport com.mapbox.maps.extension.style.sources.generated.imageSource\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.extension.style.sources.updateImage\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityAnimatedImagesourceBinding\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\nimport com.mapbox.maps.toMapboxImage\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\n\n/**\n * Load a raster image to a style using ImageSource and display it on a map as\n * animated weather data using RasterLayer.\n */\nclass AnimatedImageSourceActivity : AppCompatActivity() {\n\n  @OptIn(MapboxDelicateApi::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityAnimatedImagesourceBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    val mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(\n      style(style = Style.STANDARD) {\n        +imageSource(ID_IMAGE_SOURCE) {\n          coordinates(\n            listOf(\n              listOf(-80.425, 46.437),\n              listOf(-71.516, 46.437),\n              listOf(-71.516, 37.936),\n              listOf(-80.425, 37.936)\n            )\n          )\n        }\n        +rasterLayer(ID_IMAGE_LAYER, ID_IMAGE_SOURCE) { }\n      }\n    )\n    val drawables: List<Image> = listOf(\n      bitmapFromDrawableRes(R.drawable.southeast_radar_0).toMapboxImage(),\n      bitmapFromDrawableRes(R.drawable.southeast_radar_1).toMapboxImage(),\n      bitmapFromDrawableRes(R.drawable.southeast_radar_2).toMapboxImage(),\n      bitmapFromDrawableRes(R.drawable.southeast_radar_3).toMapboxImage(),\n    )\n    var drawableIndex = 0\n    mapboxMap.getStyle {\n      val imageSource: ImageSource = it.getSourceAs(ID_IMAGE_SOURCE)!!\n      // Create a new coroutine in the lifecycleScope\n      lifecycleScope.launch {\n        // repeatOnLifecycle launches the block in a new coroutine every time the\n        // lifecycle is in the STARTED state (or above) and cancels it when it's STOPPED.\n        repeatOnLifecycle(Lifecycle.State.STARTED) {\n          while (isActive) {\n            imageSource.updateImage(drawables[drawableIndex++])\n            drawableIndex %= drawables.size\n            delay(1000L)\n          }\n        }\n      }\n    }\n  }\n\n  companion object {\n    private const val ID_IMAGE_SOURCE = \"animated_image_source\"\n    private const val ID_IMAGE_LAYER = \"animated_image_layer\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/BasicLocationPulsingCircleActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityLocationLayerBasicPulsingCircleBinding\nimport com.mapbox.maps.testapp.utils.LocationPermissionHelper\nimport java.lang.ref.WeakReference\n\n/**\n * This activity shows a basic usage of the LocationComponent's pulsing circle. There's no\n * customization of the pulsing circle's color, radius, speed, etc.\n */\nclass BasicLocationPulsingCircleActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var locationPermissionHelper: LocationPermissionHelper\n  private var lastStyleTheme = StyleTheme.DARK\n  private lateinit var binding: ActivityLocationLayerBasicPulsingCircleBinding\n  private enum class StyleTheme {\n    LIGHT,\n    DARK\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityLocationLayerBasicPulsingCircleBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    binding.mapView.location.addOnIndicatorPositionChangedListener {\n      mapboxMap.setCamera(CameraOptions.Builder().center(it).build())\n      binding.mapView.gestures.focalPoint = binding.mapView.mapboxMap.pixelForCoordinate(it)\n    }\n    locationPermissionHelper = LocationPermissionHelper(WeakReference(this))\n    locationPermissionHelper.checkPermissions {\n      onMapReady()\n    }\n  }\n\n  private fun onMapReady() {\n    mapboxMap.loadStyle(\n      Style.STANDARD\n    )\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_pulsing_location_mode, menu)\n    return true\n  }\n\n  @SuppressLint(\"MissingPermission\")\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    when (item.itemId) {\n      R.id.action_map_style_change -> {\n        toggleMapStyle()\n        return true\n      }\n      R.id.action_component_disable -> {\n        binding.mapView.location.enabled = false\n        return true\n      }\n      R.id.action_component_enabled -> {\n        binding.mapView.location.enabled = true\n        return true\n      }\n      R.id.action_stop_pulsing -> {\n        binding.mapView.location.pulsingEnabled = false\n        return true\n      }\n      R.id.action_start_pulsing -> {\n        binding.mapView.location.apply {\n          pulsingEnabled = true\n          pulsingMaxRadius = 10f * resources.displayMetrics.density\n        }\n        return true\n      }\n      R.id.action_pulsing_follow_accuracy_radius -> {\n        binding.mapView.location.apply {\n          showAccuracyRing = true\n          pulsingEnabled = true\n          pulsingMaxRadius = LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY\n        }\n        return true\n      }\n      else -> return super.onOptionsItemSelected(item)\n    }\n  }\n\n  private fun toggleMapStyle() {\n    if (lastStyleTheme == StyleTheme.DARK) {\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\n        \"basemap\",\n        \"theme\",\n        Value.valueOf(\"monochrome\")\n      )\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\n        \"basemap\",\n        \"lightPreset\",\n        Value.valueOf(\"day\")\n      )\n      lastStyleTheme = StyleTheme.LIGHT\n    } else {\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\n        \"basemap\",\n        \"theme\",\n        Value.valueOf(\"monochrome\")\n      )\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\n        \"basemap\",\n        \"lightPreset\",\n        Value.valueOf(\"night\")\n      )\n      lastStyleTheme = StyleTheme.DARK\n    }\n  }\n\n  override fun onRequestPermissionsResult(\n    requestCode: Int,\n    permissions: Array<String>,\n    grantResults: IntArray\n  ) {\n    super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n    locationPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/CircleLayerClusteringActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.format\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.get\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.has\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.toString\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.division\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.interpolate\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.step\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.transition\nimport com.mapbox.maps.plugin.animation.flyTo\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\n\n/**\n * Example of using GeoJSON and circle layers to visualize point data in clusters.\n */\nclass CircleLayerClusteringActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    val mapboxMap = mapView.mapboxMap\n\n    mapboxMap.loadStyle(\n      styleExtension = style(Style.STANDARD) {\n        +transition {\n            duration(0)\n            delay(0)\n            enablePlacementTransitions(false)\n        }\n      },\n      onStyleLoaded = {\n        mapboxMap.flyTo(\n          CameraOptions.Builder()\n            .center(Point.fromLngLat(-79.045, 12.099))\n            .zoom(3.0)\n            .build()\n        )\n        mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n\n        addClusteredGeoJsonSource(it)\n\n        it.addImage(CROSS_ICON_ID, bitmapFromDrawableRes(R.drawable.ic_cross), true)\n\n        Toast.makeText(\n          this@CircleLayerClusteringActivity,\n          R.string.zoom_map_in_and_out_instruction,\n          Toast.LENGTH_SHORT\n        ).show()\n      }\n    )\n  }\n\n  private fun addClusteredGeoJsonSource(style: Style) {\n\n    // Add a new source from the GeoJSON data and set the 'cluster' option to true.\n    style.addSource(\n      // Point to GeoJSON data. This example visualizes all M1.0+ earthquakes from 12/22/15 to 1/21/16 as logged by USGS' Earthquake hazards program.\n      geoJsonSource(GEOJSON_SOURCE_ID) {\n        data(\"https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson\")\n        cluster(true)\n        maxzoom(14)\n        clusterRadius(50)\n      }\n    )\n\n    // Creating a marker layer for single data points\n    style.addLayer(\n      symbolLayer(\"unclustered-points\", GEOJSON_SOURCE_ID) {\n        iconImage(CROSS_ICON_ID)\n        iconSize(\n          division {\n            get {\n              literal(\"mag\")\n            }\n            literal(4.0)\n          }\n        )\n        iconColor(\n          interpolate {\n            exponential {\n              literal(1)\n            }\n            get {\n              literal(\"mag\")\n            }\n            stop {\n              literal(2.0)\n              rgb {\n                literal(0)\n                literal(255)\n                literal(0)\n              }\n            }\n            stop {\n              literal(4.5)\n              rgb {\n                literal(0)\n                literal(0)\n                literal(255)\n              }\n            }\n            stop {\n              literal(7.0)\n              rgb {\n                literal(255)\n                literal(0)\n                literal(0)\n              }\n            }\n          }\n        )\n        filter(\n          has {\n            literal(\"mag\")\n          }\n        )\n      }\n    )\n\n    // Use the earthquakes GeoJSON source to create three layers: One layer for each cluster category.\n    // Each point range gets a different fill color.\n    val layers = arrayOf(\n      intArrayOf(150, ContextCompat.getColor(this, R.color.red)),\n      intArrayOf(20, ContextCompat.getColor(this, R.color.green)),\n      intArrayOf(0, ContextCompat.getColor(this, R.color.blue))\n    )\n\n    // Add clusters' circles\n    style.addLayer(\n      circleLayer(\"clusters\", GEOJSON_SOURCE_ID) {\n        circleColor(\n          step(\n            input = get(\"point_count\"),\n            output = literal(ColorUtils.colorToRgbaString(layers[2][1])),\n            stops = arrayOf(\n              literal(layers[1][0].toDouble()) to literal(ColorUtils.colorToRgbaString(layers[1][1])),\n              literal(layers[0][0].toDouble()) to literal(ColorUtils.colorToRgbaString(layers[0][1]))\n            )\n          )\n        )\n        circleRadius(18.0)\n        filter(\n          has(\"point_count\")\n        )\n      }\n    )\n\n    style.addLayer(\n      symbolLayer(\"count\", GEOJSON_SOURCE_ID) {\n        textField(\n          format {\n            formatSection(\n              toString {\n                get {\n                  literal(\"point_count\")\n                }\n              }\n            )\n          }\n        )\n        textSize(12.0)\n        textColor(Color.WHITE)\n        textIgnorePlacement(true)\n        textAllowOverlap(true)\n      }\n    )\n  }\n\n  companion object {\n    private const val GEOJSON_SOURCE_ID = \"earthquakes\"\n    private const val CROSS_ICON_ID = \"cross-icon-id\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/ClipLayerActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.generated.ClipLayer\nimport com.mapbox.maps.extension.style.layers.generated.clipLayer\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.layers.getLayerAs\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\n\n/**\n * Example showcasing the usage of [com.mapbox.maps.extension.style.layers.generated.ClipLayer].\n */\nclass ClipLayerActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapboxMap = mapView.mapboxMap.apply {\n      setCamera(START_CAMERA_POSITION)\n    }\n    mapboxMap.loadStyle(\n      style(style = Style.STANDARD) {\n        +geoJsonSource(SOURCE_ID) {\n          geometry(Polygon.fromLngLats(POLYGON_POINTS))\n        }\n        +fillLayer(FILL_LAYER_ID, SOURCE_ID) {\n          fillOpacity(0.8)\n          fillColor(ContextCompat.getColor(this@ClipLayerActivity, R.color.blue))\n          slot(\"bottom\")\n        }\n        +clipLayer(CLIP_LAYER_ID, SOURCE_ID) {\n          visibility(Visibility.NONE)\n        }\n      }\n    )\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_clip_layer, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.menu_action_clip_reset -> {\n        mapboxMap.getStyle { style ->\n          style.getLayerAs<ClipLayer>(CLIP_LAYER_ID)?.visibility(Visibility.NONE)\n        }\n        true\n      }\n\n      R.id.menu_action_clip_model -> {\n        updateClipLayerTypes(\"model\")\n        true\n      }\n\n      R.id.menu_action_clip_symbol -> {\n        updateClipLayerTypes(\"symbol\")\n        true\n      }\n\n      R.id.menu_action_clip_model_and_symbol -> {\n        updateClipLayerTypes(\"model\", \"symbol\")\n        true\n      }\n\n      else -> {\n        super.onOptionsItemSelected(item)\n      }\n    }\n  }\n\n  private fun updateClipLayerTypes(vararg clipLayerTypes: String) {\n    mapboxMap.getStyle { style ->\n      style.getLayerAs<ClipLayer>(CLIP_LAYER_ID)?.visibility(Visibility.VISIBLE)\n      style.getLayerAs<ClipLayer>(CLIP_LAYER_ID)?.clipLayerTypes(clipLayerTypes.asList())\n    }\n  }\n\n  companion object {\n    private const val CLIP_LAYER_ID = \"clip-layer-id\"\n    private const val FILL_LAYER_ID = \"fill-layer-id\"\n    private const val SOURCE_ID = \"source-id\"\n    private val CENTER = Point.fromLngLat(-74.0027, 40.7130)\n    private val START_CAMERA_POSITION = cameraOptions {\n      center(CENTER)\n      zoom(16.5)\n      bearing(60.0)\n      pitch(30.0)\n    }\n\n    private val POLYGON_POINTS = listOf(\n      listOf(\n        Point.fromLngLat(\n          -74.00438542864366,\n          40.71275107696869\n        ),\n        Point.fromLngLat(\n          -74.00465916994656,\n          40.712458268827675\n        ),\n        Point.fromLngLat(\n          -74.00417333128154,\n          40.71212099900339\n        ),\n        Point.fromLngLat(\n          -74.00314623457163,\n          40.71238635014873\n        ),\n        Point.fromLngLat(\n          -74.00088173461268,\n          40.71296692136764\n        ),\n        Point.fromLngLat(\n          -74.00081475001514,\n          40.713220461793924\n        ),\n        Point.fromLngLat(\n          -74.0024425998592,\n          40.71419501190087\n        ),\n        Point.fromLngLat(\n          -74.00341033210208,\n          40.71374214594772\n        ),\n        Point.fromLngLat(\n          -74.00438542864366,\n          40.71275107696869\n        ),\n      )\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/CustomAttributionActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.app.Activity\nimport android.app.AlertDialog\nimport android.content.ActivityNotFoundException\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.widget.ArrayAdapter\nimport android.widget.CheckedTextView\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.module.MapTelemetry\nimport com.mapbox.maps.plugin.attribution.Attribution\nimport com.mapbox.maps.plugin.attribution.AttributionDialogManager\nimport com.mapbox.maps.plugin.attribution.AttributionParserConfig\nimport com.mapbox.maps.plugin.attribution.attribution\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityCustomAttributionBinding\n\n/**\n * This activity demonstrates how to use a custom attribution dialog.\n */\nclass CustomAttributionActivity : AppCompatActivity() {\n\n  private lateinit var checkBoxes: List<CheckedTextView>\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityCustomAttributionBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    binding.mapView.mapboxMap.loadStyle(Style.STANDARD)\n    checkBoxes = listOf(\n      binding.withImproveMap,\n      binding.withCopyrightSign,\n      binding.withTelemetryAttribution,\n      binding.withMapboxAttribution,\n      binding.withMapboxPrivacyPolicy,\n    )\n    checkBoxes.forEach { checkedTextView ->\n      checkedTextView.setOnClickListener { checkedTextView.toggle() }\n    }\n    val attributionPlugin = binding.mapView.attribution\n    // set custom content description for the attribution plugin.\n    attributionPlugin.setContentDescription(\"Show Mapbox Attributions\")\n    binding.customAttributionFab.setOnClickListener {\n      Toast.makeText(this, R.string.custom_attribution_custom, Toast.LENGTH_LONG).show()\n      val config = AttributionParserConfig(\n        withImproveMap = checkBoxes[0].isChecked,\n        withCopyrightSign = checkBoxes[1].isChecked,\n        withTelemetryAttribution = checkBoxes[2].isChecked,\n        withMapboxAttribution = checkBoxes[3].isChecked,\n        withMapboxPrivacyPolicy = checkBoxes[4].isChecked,\n        withMapboxGeofencingConsent = false // This custom dialog does not support geofencing user consent\n      )\n      attributionPlugin.setCustomAttributionDialogManager(\n        CustomAttributionDialog(this, config)\n      )\n    }\n  }\n\n  inner class CustomAttributionDialog(\n    private val context: Context,\n    private val attributionParserConfig: AttributionParserConfig\n  ) : AttributionDialogManager, DialogInterface.OnClickListener {\n\n    private lateinit var attributionList: MutableList<Attribution>\n    private var dialog: AlertDialog? = null\n    private var telemetryDialog: AlertDialog? = null\n    private var mapAttributionDelegate: MapAttributionDelegate? = null\n    private var telemetry: MapTelemetry? = null\n\n    override fun showAttribution(mapAttributionDelegate: MapAttributionDelegate) {\n      this.mapAttributionDelegate = mapAttributionDelegate\n      this.telemetry = mapAttributionDelegate.telemetry()\n      attributionList =\n        mapAttributionDelegate.parseAttributions(context, attributionParserConfig).toMutableList()\n      // Add additional Attribution\n      attributionList.add(0, Attribution(\"Custom title\", \"https://www.mapbox.com/\"))\n      var isActivityFinishing = false\n      if (context is Activity) {\n        isActivityFinishing = context.isFinishing\n      }\n      // check if hosting activity isn't finishing\n      if (!isActivityFinishing) {\n        val attributionTitles = attributionList.map { it.title }.toTypedArray()\n        val builder = AlertDialog.Builder(context)\n        builder.setTitle(com.mapbox.maps.plugin.attribution.R.string.mapbox_attributionsDialogTitle)\n        builder.setAdapter(\n          ArrayAdapter(\n            context,\n            com.mapbox.maps.plugin.attribution.R.layout.mapbox_attribution_list_item,\n            attributionTitles\n          ),\n          this\n        )\n        dialog = builder.show()\n      }\n    }\n\n    override fun onStop() {\n      dialog?.takeIf { it.isShowing }?.dismiss()\n      telemetryDialog?.takeIf { it.isShowing }?.dismiss()\n    }\n\n    override fun onClick(dialog: DialogInterface?, which: Int) {\n      if (attributionList[which].title.contains(TELEMETRY_KEY_WORLD)) {\n        showTelemetryDialog()\n      } else {\n        showWebPage(attributionList[which].url)\n      }\n    }\n\n    private fun showTelemetryDialog() {\n      val builder = AlertDialog.Builder(context)\n      builder.setTitle(com.mapbox.maps.plugin.attribution.R.string.mapbox_attributionTelemetryTitle)\n      builder.setMessage(com.mapbox.maps.plugin.attribution.R.string.mapbox_attributionTelemetryMessage)\n      builder.setPositiveButton(com.mapbox.maps.plugin.attribution.R.string.mapbox_attributionTelemetryPositive) { dialog, _ ->\n        telemetry?.setUserTelemetryRequestState(true)\n        dialog.cancel()\n      }\n      builder.setNeutralButton(com.mapbox.maps.plugin.attribution.R.string.mapbox_attributionTelemetryNeutral) { dialog, _ ->\n        showWebPage(context.resources.getString(com.mapbox.maps.plugin.attribution.R.string.mapbox_telemetryLink))\n        dialog.cancel()\n      }\n      builder.setNegativeButton(com.mapbox.maps.plugin.attribution.R.string.mapbox_attributionTelemetryNegative) { dialog, _ ->\n        telemetry?.setUserTelemetryRequestState(false)\n        dialog.cancel()\n      }\n      telemetryDialog = builder.show()\n    }\n\n    private fun showWebPage(url: String) {\n      val webUrl = if (url.contains(FEEDBACK_KEY_WORLD) && mapAttributionDelegate != null) {\n        mapAttributionDelegate!!.buildMapBoxFeedbackUrl(context)\n      } else {\n        url\n      }\n      if (context is Activity) {\n        try {\n          val intent = Intent(Intent.ACTION_VIEW)\n          intent.data = Uri.parse(webUrl)\n          context.startActivity(intent)\n        } catch (exception: ActivityNotFoundException) { // explicitly handling if the device hasn't have a web browser installed. #8899\n          Toast.makeText(\n            context,\n            com.mapbox.maps.plugin.attribution.R.string.mapbox_attributionErrorNoBrowser,\n            Toast.LENGTH_LONG\n          ).show()\n        }\n      }\n    }\n  }\n\n  companion object {\n    private const val FEEDBACK_KEY_WORLD = \"feedback\"\n    private const val TELEMETRY_KEY_WORLD = \"Telemetry\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/DSLStylingActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.QueriedRenderedFeature\nimport com.mapbox.maps.RenderedQueryGeometry\nimport com.mapbox.maps.RenderedQueryOptions\nimport com.mapbox.maps.ScreenBox\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.concat\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.format\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.get\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgb\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.subtract\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.all\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.layers.generated.rasterLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor\nimport com.mapbox.maps.extension.style.light.dynamicLight\nimport com.mapbox.maps.extension.style.light.generated.ambientLight\nimport com.mapbox.maps.extension.style.light.generated.directionalLight\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.imageSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.addOnMapClickListener\nimport java.text.DateFormat.getDateTimeInstance\nimport java.util.Date\n\n/**\n * Example showcasing usage of style extension.\n */\nclass DSLStylingActivity : AppCompatActivity(), OnMapClickListener {\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    mapboxMap = mapView.mapboxMap\n    mapboxMap.loadStyle(createStyle()) {\n      mapboxMap.setCamera(\n        cameraOptions {\n          center(Point.fromLngLat(-122.40276277449118, 37.79608281254676))\n          zoom(4.0)\n          bearing(359.63)\n          pitch(60.0)\n        }\n      )\n    }\n    mapboxMap.addOnMapClickListener(this)\n  }\n\n  override fun onMapClick(point: Point): Boolean {\n    val clicked = mapboxMap.pixelForCoordinate(point)\n    mapboxMap.queryRenderedFeatures(\n      RenderedQueryGeometry(\n        ScreenBox(\n          ScreenCoordinate(clicked.x - 50, clicked.y - 50),\n          ScreenCoordinate(clicked.x + 50, clicked.y + 50)\n        )\n      ),\n      RenderedQueryOptions(listOf(\"earthquakeCircle\", \"earthquakeText\"), literal(true))\n    ) { expected: Expected<String, MutableList<QueriedRenderedFeature>> ->\n      val features = expected.value!!\n      features.takeIf { it.isNotEmpty() }?.let {\n        val time = it.first().queriedFeature.feature.getNumberProperty(\"time\")\n        // log feature layers\n        val featureLayer = it.first().layers.joinToString(\" \")\n        Toast.makeText(\n          this,\n          \"time = ${getDateTime(time.toLong())}, layers = $featureLayer\",\n          Toast.LENGTH_SHORT\n        ).show()\n      }\n    }\n    return true\n  }\n\n  private fun getDateTime(time: Long): String = try {\n    val sdf = getDateTimeInstance()\n    val netDate = Date(time)\n    sdf.format(netDate)\n  } catch (e: Exception) {\n    e.toString()\n  }\n\n  private fun createStyle() = style(style = Style.STANDARD) {\n    +imageSource(\"imag\") {\n      url(IMAGE_URL)\n      coordinates(\n        listOf(\n          listOf(-35.859375, 58.44773280389084),\n          listOf(-16.171875, 58.44773280389084),\n          listOf(-16.171875, 54.7246201949245),\n          listOf(-35.859375, 54.7246201949245)\n        )\n      )\n    }\n    +geoJsonSource(id = \"earthquakes\") {\n      data(GEOJSON_URL)\n      cluster(false)\n    }\n    +circleLayer(layerId = \"earthquakeCircle\", sourceId = \"earthquakes\") {\n      circleRadius(get { literal(\"mag\") })\n      circleColor(rgb(255.0, 0.0, 0.0))\n      circleOpacity(0.3)\n      circleStrokeColor(Color.WHITE)\n    }\n    +layerAtPosition(\n      symbolLayer(\n        layerId = \"earthquakeText\",\n        sourceId = \"earthquakes\"\n      ) {\n        // Only show the magnitude scale if the value is >4.0 and:\n        // - the map pitch is < 70º or\n        // - objects are close to the camera\n        filter(\n          all {\n            gt {\n              get {\n                literal(\"mag\")\n              }\n              literal(4.0)\n            }\n            switchCase {\n              // 1st case: return true if pitch <70º\n              lt {\n                pitch()\n                literal(70.0)\n              }\n              literal(true)\n\n              // 2nd case: return true if close to camera\n              lte {\n                distanceFromCenter()\n                literal(-0.5)\n              }\n              literal(true)\n\n              // otherwise: return false\n              literal(false)\n            }\n          }\n        )\n        textField(\n          format {\n            formatSection(\n              concat {\n                literal(\"mag\")\n                toString {\n                  get {\n                    literal(\"mag\")\n                  }\n                }\n              }\n            ) {\n              textFont(listOf(\"Open Sans Regular\", \"Arial Unicode MS Regular\"))\n              textColor(Color.BLACK)\n            }\n          }\n        )\n        textHaloColor(Color.WHITE)\n        textHaloWidth(1.0)\n        textAnchor(TextAnchor.TOP)\n        textOffset(listOf(0.0, 1.0))\n        textSize(10.0)\n        textIgnorePlacement(false)\n        symbolSortKey(\n          subtract {\n            toNumber {\n              get {\n                literal(\"mag\")\n              }\n            }\n          }\n        )\n      },\n      above = \"earthquakeCircle\"\n    )\n    +rasterLayer(\"raster\", \"imag\") {\n      rasterOpacity(0.8)\n    }\n    +dynamicLight(\n      ambientLight {\n        intensity(0.2)\n        color(Color.YELLOW)\n      },\n      directionalLight {\n        shadowIntensity(0.5)\n        castShadows(true)\n        color(Color.WHITE)\n      }\n    )\n  }\n\n  companion object {\n    private const val IMAGE_URL =\n      \"https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Mapbox_logo_2019.svg/2560px-Mapbox_logo_2019.svg.png\"\n    private const val GEOJSON_URL =\n      \"https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/DebugModeActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.annotation.SuppressLint\nimport android.app.AlertDialog\nimport android.content.Context\nimport android.graphics.BlurMaskFilter\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.CornerPathEffect\nimport android.graphics.Paint\nimport android.graphics.Path\nimport android.graphics.PorterDuff\nimport android.graphics.PorterDuffXfermode\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport com.google.android.material.snackbar.Snackbar\nimport com.google.gson.Gson\nimport com.google.gson.annotations.SerializedName\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.PerformanceSamplerOptions\nimport com.mapbox.maps.PerformanceStatisticsOptions\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.Vec2\nimport com.mapbox.maps.debugoptions.MapViewDebugOptions\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.plugin.compass.compass\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityDebugBinding\n\n/**\n * Example of enabling and visualizing some debug information for a map.\n */\n@OptIn(MapboxExperimental::class)\nclass DebugModeActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private val debugOptions: MutableSet<MapViewDebugOptions> = mutableSetOf(\n    MapViewDebugOptions.TILE_BORDERS,\n    MapViewDebugOptions.PARSE_STATUS,\n    MapViewDebugOptions.TIMESTAMPS,\n    MapViewDebugOptions.COLLISION,\n    MapViewDebugOptions.STENCIL_CLIP,\n    MapViewDebugOptions.DEPTH_BUFFER,\n    MapViewDebugOptions.CAMERA,\n    MapViewDebugOptions.PADDING,\n  )\n  private var resourceRequestCancelable: Cancelable? = null\n  private var untypedEventCancelable: Cancelable? = null\n\n  private lateinit var binding: ActivityDebugBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityDebugBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    mapboxMap = binding.mapView.mapboxMap\n\n    mapboxMap.subscribeResourceRequest {\n      logI(\n        TAG,\n        \"extensionObservable DataSource: ${it.source}\\nRequest: ${it.request}\\nResponse: ${it.response}\\nCancelled: ${it.cancelled}\"\n      )\n    }\n\n    mapboxMap.loadStyle(Style.STANDARD)\n    setupPerformanceStatisticsCollection()\n    setupScreenShapeButton()\n    binding.mapView.compass.opacity = 0.5f\n    binding.mapView.debugOptions = debugOptions\n    registerListeners(mapboxMap)\n  }\n  private var overlayView: HexSpotlightView? = null\n\n  private fun setupScreenShapeButton() {\n    binding.screenShapeButton.setOnClickListener {\n      when (binding.screenShapeButton.text) {\n        SCREEN_SHAPE_RECT -> {\n          binding.screenShapeButton.text = SCREEN_SHAPE_CUSTOM\n\n          mapboxMap.setScreenCullingShape(emptyList())\n          (overlayView?.parent as? ViewGroup)?.removeView(overlayView)\n        }\n        SCREEN_SHAPE_CUSTOM -> {\n          val shape = listOf(\n            Vec2(0.35, 0.34),\n            Vec2(0.65, 0.34),\n            Vec2(0.85, 0.50),\n            Vec2(0.65, 0.66),\n            Vec2(0.35, 0.66),\n            Vec2(0.15, 0.50)\n          )\n\n          overlayView = HexSpotlightView(this, shape)\n          addContentView(overlayView, ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))\n          mapboxMap.setScreenCullingShape(shape)\n          binding.screenShapeButton.text = SCREEN_SHAPE_RECT\n        }\n      }\n    }\n  }\n\n  private fun setupPerformanceStatisticsCollection() {\n    binding.perfStatButton.setOnClickListener {\n      when (binding.perfStatButton.text) {\n        PERF_STAT_START_COLLECT_BUTTON -> {\n          mapboxMap.startPerformanceStatisticsCollection(\n            PerformanceStatisticsOptions.Builder()\n              .samplerOptions(\n                listOf(\n                  PerformanceSamplerOptions.PER_FRAME_RENDERING_STATS,\n                  PerformanceSamplerOptions.CUMULATIVE_RENDERING_STATS\n                )\n              )\n              // we should be collecting the results every 5 seconds\n              .samplingDurationMillis(5_000.0)\n              .build()\n          ) { performanceStatistics ->\n            logI(TAG_PERFORMANCE_STATISTICS, \"Collection duration:\\n ${performanceStatistics.collectionDurationMillis}\")\n            logI(TAG_PERFORMANCE_STATISTICS, \"Per frame performance statistics:\\n ${performanceStatistics.perFrameStatistics}\")\n            logI(TAG_PERFORMANCE_STATISTICS, \"Cumulative performance statistics:\\n ${performanceStatistics.cumulativeStatistics}\")\n            logI(TAG_PERFORMANCE_STATISTICS, \"Render duration statistics:\\n ${performanceStatistics.mapRenderDurationStatistics}\")\n            val mostExpensiveLayerData = performanceStatistics.perFrameStatistics?.topRenderLayers?.firstOrNull()\n            val snackBar = Snackbar.make(\n              binding.mapView,\n              \"The most expensive layer to render is ${mostExpensiveLayerData?.name} \" +\n                \"(time ${mostExpensiveLayerData?.durationMillis} ms)\",\n              Snackbar.LENGTH_LONG\n            )\n            snackBar.animationMode = Snackbar.ANIMATION_MODE_SLIDE\n            snackBar.view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text).maxLines = 5\n            snackBar.show()\n          }\n          @SuppressLint(\"SetTextI18n\")\n          binding.perfStatButton.text = PERF_STAT_STOP_COLLECT_BUTTON\n        }\n        PERF_STAT_STOP_COLLECT_BUTTON -> {\n          mapboxMap.stopPerformanceStatisticsCollection()\n          @SuppressLint(\"SetTextI18n\")\n          binding.perfStatButton.text = PERF_STAT_START_COLLECT_BUTTON\n        }\n      }\n    }\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  private fun registerListeners(mapboxMap: MapboxMap) {\n    mapboxMap.subscribeStyleLoaded {\n      logI(TAG, \"StyleLoadedCallback: $it\")\n    }\n    mapboxMap.subscribeStyleDataLoaded {\n      logI(TAG, \"StyleDataLoadedCallback: $it\")\n    }\n    mapboxMap.subscribeStyleImageMissing {\n      logI(TAG, \"StyleImageMissingCallback: $it\")\n    }\n    mapboxMap.subscribeStyleImageRemoveUnused {\n      logI(TAG, \"StyleImageRemoveUnusedCallback: $it\")\n    }\n    mapboxMap.subscribeMapIdle {\n      logI(TAG, \"MapIdleCallback: $it\")\n    }\n    mapboxMap.subscribeMapLoadingError {\n      logE(TAG, \"MapLoadingErrorCallback: $it\")\n    }\n    mapboxMap.subscribeMapLoaded {\n      logI(TAG, \"MapLoadedCallback: $it\")\n    }\n    mapboxMap.subscribeCameraChanged {\n      logI(TAG, \"CameraChangedCallback: $it\")\n    }\n    mapboxMap.subscribeCameraChangedCoalesced {\n      logI(TAG, \"CameraChangedCoalescedCallback: $it\")\n    }\n    mapboxMap.subscribeRenderFrameStarted {\n      logI(TAG, \"RenderFrameStartedCallback: $it\")\n    }\n    mapboxMap.subscribeRenderFrameFinished {\n      logI(TAG, \"RenderFrameFinishedCallback: $it\")\n    }\n    mapboxMap.subscribeSourceAdded {\n      logI(\n        TAG,\n        \"SourceAddedCallback: $it\"\n      )\n    }\n    mapboxMap.subscribeSourceDataLoaded {\n      logI(\n        TAG,\n        \"SourceDataLoadedCallback: $it\"\n      )\n    }\n    mapboxMap.subscribeSourceRemoved {\n      logI(\n        TAG,\n        \"SourceRemovedCallback: $it\"\n      )\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_debug_mode, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    when (item.itemId) {\n      R.id.menu_debug_mode_tile_borders -> {\n        item.isChecked = toggleDebugOptions(MapViewDebugOptions.TILE_BORDERS)\n      }\n      R.id.menu_debug_mode_parse_status -> {\n        item.isChecked = toggleDebugOptions(MapViewDebugOptions.PARSE_STATUS)\n      }\n      R.id.menu_debug_mode_timestamps -> {\n        item.isChecked = toggleDebugOptions(MapViewDebugOptions.TIMESTAMPS)\n      }\n      R.id.menu_debug_mode_collision -> {\n        item.isChecked = toggleDebugOptions(MapViewDebugOptions.COLLISION)\n      }\n      R.id.menu_debug_mode_overdraw -> {\n        item.isChecked = toggleDebugOptions(MapViewDebugOptions.OVERDRAW)\n      }\n      R.id.menu_debug_mode_stencil_clip -> {\n        item.isChecked = toggleDebugOptions(MapViewDebugOptions.STENCIL_CLIP)\n      }\n      R.id.menu_debug_mode_depth_buffer -> {\n        item.isChecked = toggleDebugOptions(MapViewDebugOptions.DEPTH_BUFFER)\n      }\n      R.id.menu_debug_mode_camera_overlay -> {\n        item.isChecked = toggleDebugOptions(MapViewDebugOptions.CAMERA)\n      }\n      R.id.menu_debug_mode_padding_overlay -> {\n        item.isChecked = toggleDebugOptions(MapViewDebugOptions.PADDING)\n      }\n      R.id.menu_debug_mode_info -> {\n        showMapInfo()\n      }\n      else -> {\n        return super.onOptionsItemSelected(item)\n      }\n    }\n    return true\n  }\n\n  private fun showMapInfo() {\n    // Get style information\n    val styleInfo = extractStyleInfo()\n    val styleMessage = \"\"\"\nStyle URL: ${styleInfo.styleURL}\nModified: ${styleInfo.modifiedDate}\nSDK Compatibility:\n${styleInfo.sdkCompatibility}\n    \"\"\".trimIndent()\n\n    AlertDialog.Builder(this)\n      .setTitle(\"Style Info\")\n      .setMessage(styleMessage)\n      .setPositiveButton(\"OK\") { dialog, _ -> dialog.dismiss() }\n      .show()\n  }\n\n  private fun extractStyleInfo(): StyleInfo {\n    val style = mapboxMap.style\n    val styleJSON = style?.styleJSON ?: return StyleInfo(\"Unknown\", \"Unknown\", \"Unknown\")\n\n    return runCatching {\n      val parsedStyle = Gson().fromJson(styleJSON, StyleJson::class.java)\n\n      val modifiedDate = parsedStyle.modified ?: \"Unknown\"\n\n      val sdkCompatibility = parsedStyle.metadata?.compatibility?.let { compatibility ->\n        val compatibilityParts = mutableListOf<String>()\n        compatibility.ios?.let { compatibilityParts.add(\"iOS: $it\") }\n        compatibility.android?.let { compatibilityParts.add(\"Android: $it\") }\n        compatibility.js?.let { compatibilityParts.add(\"JS: $it\") }\n\n        if (compatibilityParts.isEmpty()) \"Unknown\" else compatibilityParts.joinToString(\"\\n\")\n      } ?: \"Unknown\"\n\n      val styleURL = parsedStyle.metadata?.origin?.takeIf { it.isNotBlank() }\n        ?: style.styleURI ?: \"Unknown\"\n\n      StyleInfo(modifiedDate, sdkCompatibility, styleURL)\n    }.getOrElse { StyleInfo(\"Unknown\", \"Unknown\", \"Unknown\") }\n  }\n\n  private fun toggleDebugOptions(option: MapViewDebugOptions): Boolean {\n    if (debugOptions.add(option)) {\n      binding.mapView.debugOptions = debugOptions\n      return true\n    }\n\n    debugOptions.remove(option)\n    binding.mapView.debugOptions = debugOptions\n    return false\n  }\n\n  override fun onStart() {\n    super.onStart()\n    binding.mapView.setOnFpsChangedListener {\n      runOnUiThread {\n        binding.fpsView.text = getString(R.string.fps, String.format(\"%.2f\", it))\n      }\n    }\n  }\n\n  override fun onStop() {\n    super.onStop()\n    resourceRequestCancelable?.cancel()\n    untypedEventCancelable?.cancel()\n  }\n\n  private companion object {\n    private const val TAG = \"DebugModeActivity\"\n    private const val TAG_PERFORMANCE_STATISTICS = \"PerformanceStatistics\"\n    private const val PERF_STAT_STOP_COLLECT_BUTTON = \"Stop collecting\"\n    private const val PERF_STAT_START_COLLECT_BUTTON = \"Collect Perf Stats\"\n    private const val SCREEN_SHAPE_CUSTOM = \"Hex screen\"\n    private const val SCREEN_SHAPE_RECT = \"Rect screen\"\n  }\n}\n\n@SuppressLint(\"ViewConstructor\")\nclass HexSpotlightView(context: Context, private val shape: List<Vec2>) : View(context) {\n\n  private val overlayPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n    color = Color.parseColor(\"#80000000\") // dimmed background\n  }\n\n  private val clearPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n    xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)\n  }\n\n  private val strokePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n    color = Color.WHITE\n    style = Paint.Style.STROKE\n    strokeWidth = 4F * context.resources.displayMetrics.density\n    strokeJoin = Paint.Join.ROUND\n    pathEffect = CornerPathEffect(12F * context.resources.displayMetrics.density)\n  }\n  private var hexPath: Path = createPath(width.toFloat(), height.toFloat())\n\n  private val glowPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n    color = Color.WHITE\n    style = Paint.Style.STROKE\n    strokeWidth = 4F * context.resources.displayMetrics.density\n    maskFilter = BlurMaskFilter(32F, BlurMaskFilter.Blur.OUTER)\n    strokeJoin = Paint.Join.ROUND\n    pathEffect = CornerPathEffect(12F * context.resources.displayMetrics.density)\n  }\n\n  override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {\n    super.onLayout(changed, left, top, right, bottom)\n\n    hexPath = createPath(width.toFloat(), height.toFloat())\n  }\n\n  override fun onDraw(canvas: Canvas) {\n    super.onDraw(canvas)\n\n    val layer = canvas.saveLayer(null, null)\n\n    // Draw full dim overlay\n    canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), overlayPaint)\n\n    // Draw hexagon cutout\n    canvas.drawPath(hexPath, clearPaint)\n    canvas.drawPath(hexPath, glowPaint)\n    canvas.drawPath(hexPath, glowPaint)\n    canvas.drawPath(hexPath, strokePaint)\n\n    canvas.restoreToCount(layer)\n  }\n\n  private fun createPath(w: Float, h: Float): Path {\n    val path = Path()\n    shape.forEachIndexed { index, pt ->\n      val x = pt.x * w\n      val y = pt.y * h\n      if (index == 0) path.moveTo(x.toFloat(), y.toFloat()) else path.lineTo(x.toFloat(), y.toFloat())\n    }\n    path.close()\n    return path\n  }\n}\n\ndata class StyleInfo(\n  val modifiedDate: String,\n  val sdkCompatibility: String,\n  val styleURL: String\n)\n\ndata class StyleJson(\n  @SerializedName(\"modified\")\n  val modified: String?,\n\n  @SerializedName(\"metadata\")\n  val metadata: Metadata?\n)\n\ndata class Metadata(\n  @SerializedName(\"mapbox:origin\")\n  val origin: String?,\n\n  @SerializedName(\"mapbox:compatibility\")\n  val compatibility: Compatibility?\n)\n\ndata class Compatibility(\n  @SerializedName(\"ios\")\n  val ios: String?,\n\n  @SerializedName(\"android\")\n  val android: String?,\n\n  @SerializedName(\"js\")\n  val js: String?\n)"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/DistanceExpressionActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.lt\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.turf.TurfConstants\nimport com.mapbox.turf.TurfTransformation\n\n/**\n * An Activity that showcases the within expression to filter features outside a geometry\n */\nclass DistanceExpressionActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    val center = Point.fromLngLat(LON, LAT)\n    val circle = TurfTransformation.circle(center, RADIUS, TurfConstants.UNIT_METERS)\n\n    // Setup camera position above Georgetown\n    mapView.mapboxMap.setCamera(CameraOptions.Builder().center(center).zoom(16.0).build())\n\n    mapView.mapboxMap.loadStyle(\n      style(Style.MAPBOX_STREETS) {\n        +geoJsonSource(POINT_ID) {\n          geometry(center)\n        }\n        +geoJsonSource(CIRCLE_ID) {\n          geometry(circle)\n        }\n        +layerAtPosition(\n          fillLayer(CIRCLE_ID, CIRCLE_ID) {\n            fillOpacity(0.5)\n            fillColor(\"#3bb2d0\")\n          },\n          below = POI_LABEL\n        )\n      }\n    ) {\n      val symbolLayer = it.getLayer(\"poi-label\") as SymbolLayer\n      symbolLayer.filter(\n        lt {\n          distance(Point.fromLngLat(LON, LAT))\n          literal(150)\n        }\n      )\n      // Hide other types of labels to highlight POI labels\n      (it.getLayer(ROAD_LABEL) as SymbolLayer).visibility(Visibility.NONE)\n      (it.getLayer(TRANSIT_LABEL) as SymbolLayer).visibility(Visibility.NONE)\n      (it.getLayer(ROAD_NUMBER_SHIELD) as SymbolLayer).visibility(Visibility.NONE)\n    }\n  }\n\n  companion object {\n    const val POINT_ID = \"point\"\n    const val CIRCLE_ID = \"circle\"\n    const val LAT = 37.78794572301525\n    const val LON = -122.40752220153807\n    const val RADIUS = 150.0\n    const val POI_LABEL = \"poi-label\"\n    const val ROAD_LABEL = \"road-label\"\n    const val TRANSIT_LABEL = \"transit-label\"\n    const val ROAD_NUMBER_SHIELD = \"road-number-shield\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/EdgeToEdgeActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Build\nimport android.os.Bundle\nimport android.util.TypedValue\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowCompat\nimport androidx.core.view.WindowInsetsCompat\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.plugin.attribution.attribution\nimport com.mapbox.maps.plugin.compass.compass\nimport com.mapbox.maps.plugin.logo.logo\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport com.mapbox.maps.testapp.databinding.ActivityEdgeToEdgeBinding\n\n/**\n * This example shows how to handle system insets (status bar, navigation bar, display cutouts)\n * in the Edge-to-Edge layout to prevent map ornaments from being obscured.\n *\n * Key concepts:\n * - Combine WindowInsetsCompat.Type.systemBars() and WindowInsetsCompat.Type.displayCutout()\n * - Apply insets to map ornaments (logo, attribution, compass, scale bar)\n * - Configure system bar appearance.\n *\n * Note: Starting with Android 15 (API 35), edge-to-edge is enforced by default for all apps\n * targeting API 35+. See:\n * https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge\n *\n * For apps targeting API 34 or lower, you need to explicitly enable edge-to-edge by calling\n * WindowCompat.setDecorFitsSystemWindows(window, false) or WindowCompat.enableEdgeToEdge(). See:\n * https://developer.android.com/develop/ui/views/layout/edge-to-edge#enable-edge-to-edge-display\n */\nclass EdgeToEdgeActivity : AppCompatActivity() {\n\n  private lateinit var binding: ActivityEdgeToEdgeBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    binding = ActivityEdgeToEdgeBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    // Configure system bar appearance\n    configureSystemBarAppearance()\n\n    binding.mapView.mapboxMap.apply {\n      loadStyle(Style.STANDARD)\n      setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(LONGITUDE, LATITUDE))\n          .zoom(ZOOM)\n          .build()\n      )\n    }\n\n    setupEdgeToEdgeInsets()\n  }\n\n  /**\n   * Set up window insets handling for edge-to-edge layout.\n   *\n   * This method applies system insets to map ornaments to ensure they don't overlap\n   * with system UI elements like status bar, navigation bar or display cutouts.\n   */\n  private fun setupEdgeToEdgeInsets() {\n    ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->\n      val systemInsets = insets.getInsets(\n        WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout()\n      )\n\n      val padding4Dp = dpToPx(4f)\n      val padding8Dp = dpToPx(8f)\n      val logoSize = dpToPx(82f)\n\n      with(binding.mapView.logo) {\n        marginLeft = systemInsets.left.toFloat() + padding4Dp\n        marginTop = systemInsets.top.toFloat()\n        marginRight = systemInsets.right.toFloat()\n        marginBottom = systemInsets.bottom.toFloat() + padding4Dp\n      }\n\n      with(binding.mapView.attribution) {\n        marginLeft = systemInsets.left.toFloat() + logoSize + padding8Dp\n        marginTop = systemInsets.top.toFloat()\n        marginRight = systemInsets.right.toFloat() + padding4Dp\n        marginBottom = systemInsets.bottom.toFloat() + padding4Dp\n      }\n\n      with(binding.mapView.compass) {\n        marginLeft = systemInsets.left.toFloat()\n        marginTop = systemInsets.top.toFloat() + padding8Dp\n        marginRight = systemInsets.right.toFloat() + padding8Dp\n        marginBottom = systemInsets.bottom.toFloat()\n      }\n\n      with(binding.mapView.scalebar) {\n        marginLeft = systemInsets.left.toFloat() + padding8Dp\n        marginTop = systemInsets.top.toFloat() + padding8Dp\n        marginRight = systemInsets.right.toFloat()\n        marginBottom = systemInsets.bottom.toFloat()\n      }\n\n      insets\n    }\n  }\n\n  /**\n   * Configure system bar appearance for edge-to-edge display.\n   *\n   * This example uses dark system bar icons (for better visibility on light map backgrounds).\n   * For theme-aware icon colors or other customizations, see:\n   * https://developer.android.com/develop/ui/views/layout/edge-to-edge#system-bar-icons\n   */\n  @Suppress(\"DEPRECATION\")\n  private fun configureSystemBarAppearance() {\n    // Disable automatic contrast enforcement for true transparency (API 29+)\n    // Note: This only affects 3-button navigation (removes scrim). Gesture navigation is unaffected.\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n      window.isNavigationBarContrastEnforced = false\n      window.isStatusBarContrastEnforced = false\n    }\n\n    // Set dark system bar icons (more visible on light map backgrounds)\n    WindowCompat.getInsetsController(window, window.decorView).apply {\n      isAppearanceLightStatusBars = true // true = dark icons\n      isAppearanceLightNavigationBars = true\n    }\n  }\n\n  private fun dpToPx(dp: Float): Float {\n    return TypedValue.applyDimension(\n      TypedValue.COMPLEX_UNIT_DIP,\n      dp,\n      resources.displayMetrics\n    )\n  }\n\n  companion object {\n    private const val LATITUDE = 40.7128\n    private const val LONGITUDE = -74.0060\n    private const val ZOOM = 12.0\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/ElevatedLineActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.google.gson.JsonArray\nimport com.google.gson.JsonObject\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.atInterpolated\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.projection.generated.projection\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\n\n/**\n * Example of adding an elevated line to a map.\n * This example is based on mapbox-gl-js example: https://docs.mapbox.com/mapbox-gl-js/example/elevated-line/\n */\nclass ElevatedLineActivity : AppCompatActivity() {\n\n  @OptIn(MapboxExperimental::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapInitOptions = MapInitOptions(\n      this,\n      cameraOptions = CAMERA_OPTIONS,\n    )\n    val mapView = MapView(this, mapInitOptions)\n    setContentView(mapView)\n    mapView.mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +geoJsonSource(LINE_SOURCE_ID) {\n          lineMetrics(true)\n          feature(createLineStringFeature(COORDINATES, ELEVATIONS))\n        }\n        // add the elevated line layer\n        +lineLayer(LINE_LAYER_ID, LINE_SOURCE_ID) {\n          lineJoin(LineJoin.ROUND)\n          lineWidth(8.0)\n          lineColor(Color.BLUE)\n          lineEmissiveStrength(1.0)\n          lineElevationReference(LineElevationReference.SEA)\n          lineZOffset(\n            atInterpolated {\n              product {\n                lineProgress()\n                subtract {\n                  length { get(ELEVATION_PROPERTY_KEY) }\n                  literal(1)\n                }\n              }\n              get(ELEVATION_PROPERTY_KEY)\n            }\n          )\n        }\n      }\n    )\n  }\n\n  private fun createLineStringFeature(coordinates: List<Point>, elevations: List<Double>): Feature {\n    val properties = JsonObject()\n    // add an array of elevation values.\n    // the number of values doesn't need to match the number of coordinates.\n    JsonArray().apply {\n      elevations.forEach(::add)\n    }.let { elevationsArray ->\n      properties.add(ELEVATION_PROPERTY_KEY, elevationsArray)\n    }\n    return Feature.fromGeometry(LineString.fromLngLats(coordinates), properties)\n  }\n\n  companion object {\n    private const val ELEVATION_PROPERTY_KEY = \"elevation\"\n    private const val LINE_SOURCE_ID = \"geojson\"\n    private const val LINE_LAYER_ID = \"elevated-line\"\n\n    private val CAMERA_OPTIONS = cameraOptions {\n      center(Point.fromLngLat(6.7782, 45.8418))\n      zoom(11.0)\n      bearing(-150.0)\n      pitch(62.0)\n      projection(ProjectionName.MERCATOR)\n    }\n\n    private val ELEVATIONS = arrayOf(\n      4600, 4600, 4600, 4599, 4598, 4596, 4593, 4590, 4584, 4578, 4569,\n      4559, 4547, 4533, 4516, 4497, 4475, 4450, 4422, 4390, 4355, 4316,\n      4275, 4227, 4177, 4124, 4068, 4009, 3946, 3880, 3776, 3693, 3599,\n      3502, 3398, 3290, 3171, 3052, 2922, 2786, 2642, 2490, 2332, 2170,\n      1994, 1810, 1612, 1432, 1216, 1000\n    ).map { it.toDouble() }\n\n    private val COORDINATES = listOf(\n      Point.fromLngLat(6.862885, 45.833563),\n      Point.fromLngLat(6.863605, 45.846851),\n      Point.fromLngLat(6.859783, 45.862445),\n      Point.fromLngLat(6.848727, 45.876361),\n      Point.fromLngLat(6.827155, 45.892361),\n      Point.fromLngLat(6.802194, 45.905032),\n      Point.fromLngLat(6.780023, 45.909602),\n      Point.fromLngLat(6.753605, 45.906074),\n      Point.fromLngLat(6.728807, 45.899120),\n      Point.fromLngLat(6.700449, 45.883872),\n      Point.fromLngLat(6.683772, 45.863866),\n      Point.fromLngLat(6.684058, 45.841619),\n      Point.fromLngLat(6.691115, 45.825417),\n      Point.fromLngLat(6.704446, 45.813349),\n      Point.fromLngLat(6.720959, 45.807886),\n      Point.fromLngLat(6.748477, 45.809517),\n      Point.fromLngLat(6.775554, 45.817254),\n      Point.fromLngLat(6.791236, 45.828871),\n      Point.fromLngLat(6.801289, 45.838797),\n      Point.fromLngLat(6.806307, 45.849788),\n      Point.fromLngLat(6.803161, 45.866159),\n      Point.fromLngLat(6.794599, 45.880461),\n      Point.fromLngLat(6.769846, 45.890231),\n      Point.fromLngLat(6.744712, 45.889576),\n      Point.fromLngLat(6.722788, 45.881677),\n      Point.fromLngLat(6.708097, 45.868556),\n      Point.fromLngLat(6.699435, 45.851973),\n      Point.fromLngLat(6.707324, 45.832980),\n      Point.fromLngLat(6.723743, 45.822384),\n      Point.fromLngLat(6.739347, 45.818626),\n      Point.fromLngLat(6.756019, 45.822069),\n      Point.fromLngLat(6.773963, 45.832436),\n      Point.fromLngLat(6.785920, 45.848229),\n      Point.fromLngLat(6.786155, 45.860521),\n      Point.fromLngLat(6.774430, 45.870586),\n      Point.fromLngLat(6.749012, 45.875670),\n      Point.fromLngLat(6.731251, 45.868501),\n      Point.fromLngLat(6.716033, 45.853689),\n      Point.fromLngLat(6.714748, 45.846970),\n      Point.fromLngLat(6.714635, 45.838934),\n      Point.fromLngLat(6.717850, 45.832829),\n      Point.fromLngLat(6.724010, 45.828151),\n      Point.fromLngLat(6.730551, 45.827333),\n      Point.fromLngLat(6.733951, 45.829900),\n      Point.fromLngLat(6.735957, 45.834154),\n      Point.fromLngLat(6.735286, 45.839871),\n      Point.fromLngLat(6.734471, 45.843933),\n      Point.fromLngLat(6.730893, 45.847233),\n      Point.fromLngLat(6.728550, 45.847899),\n      Point.fromLngLat(6.726590, 45.847822),\n      Point.fromLngLat(6.724876, 45.846455),\n      Point.fromLngLat(6.725096, 45.843900),\n      Point.fromLngLat(6.726635, 45.841201),\n      Point.fromLngLat(6.728074, 45.837041),\n      Point.fromLngLat(6.727822, 45.834292),\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/FragmentBackStackActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityEmptyFabBinding\nimport com.mapbox.maps.testapp.examples.fragment.MapFragment\n\nclass FragmentBackStackActivity : AppCompatActivity() {\n\n  private lateinit var mapFragment: MapFragment\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityEmptyFabBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    if (savedInstanceState == null) {\n      mapFragment = MapFragment()\n      mapFragment.getMapAsync {\n        initMap(it)\n      }\n      supportFragmentManager.beginTransaction().apply {\n        add(R.id.container, mapFragment, FRAGMENT_TAG)\n      }.commit()\n    } else {\n      supportFragmentManager.findFragmentByTag(FRAGMENT_TAG)?.also { fragment ->\n        if (fragment is MapFragment) {\n          fragment.getMapAsync {\n            initMap(it)\n          }\n        }\n      }\n    }\n\n    binding.displayOnSecondDisplayButton.setOnClickListener { handleClick() }\n    binding.fragmentButton.setOnClickListener { addNewFragment() }\n  }\n\n  private fun addNewFragment() {\n    supportFragmentManager.beginTransaction().apply {\n      replace(\n        R.id.container,\n        MapFragment().also {\n          it.getMapAsync { mapboxMap -> initMap(mapboxMap) }\n        }\n      )\n      addToBackStack(\"map_new_fragment_${System.currentTimeMillis()}\")\n    }.commit()\n  }\n\n  private fun initMap(mapboxMap: MapboxMap) {\n    mapboxMap.loadStyle(Style.STANDARD_SATELLITE)\n  }\n\n  private fun handleClick() {\n    supportFragmentManager.beginTransaction().apply {\n      replace(R.id.container, EmptyFragment.newInstance())\n      addToBackStack(\"map_empty_fragment\")\n    }.commit()\n  }\n\n  class EmptyFragment : androidx.fragment.app.Fragment() {\n\n    companion object {\n      fun newInstance(): EmptyFragment {\n        return EmptyFragment()\n      }\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    override fun onCreateView(\n      inflater: LayoutInflater,\n      container: ViewGroup?,\n      savedInstanceState: Bundle?\n    ): View {\n      val textView = TextView(inflater.context)\n      textView.text = \"This is an empty Fragment\"\n      return textView\n    }\n  }\n\n  companion object {\n    private const val FRAGMENT_TAG = \"map_fragment\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/GeoJsonLayerInStackActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\n\nclass GeoJsonLayerInStackActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapboxMap = mapView.mapboxMap\n\n    mapboxMap.loadStyle(\n      style(style = Style.MAPBOX_STREETS) {\n        +geoJsonSource(\"urban-areas\") {\n          data(\"https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_50m_urban_areas.geojson\")\n        }\n        +layerAtPosition(\n          fillLayer(layerId = \"urban-areas-fill\", sourceId = \"urban-areas\") {\n            fillColor(\"#ff0088\")\n            fillOpacity(0.4)\n          },\n          below = \"water\"\n        )\n      }\n    )\n\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(-84.381546, 33.749909))\n        .zoom(8.471903)\n        .build()\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/GesturesActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewTreeObserver\nimport android.widget.RelativeLayout\nimport android.widget.TextView\nimport androidx.annotation.ColorInt\nimport androidx.annotation.IntDef\nimport androidx.annotation.NonNull\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.mapbox.android.gestures.AndroidGesturesManager\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.android.gestures.RotateGestureDetector\nimport com.mapbox.android.gestures.ShoveGestureDetector\nimport com.mapbox.android.gestures.StandardScaleGestureDetector\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.plugin.ScrollMode\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport com.mapbox.maps.plugin.gestures.OnMoveListener\nimport com.mapbox.maps.plugin.gestures.OnRotateListener\nimport com.mapbox.maps.plugin.gestures.OnScaleListener\nimport com.mapbox.maps.plugin.gestures.OnShoveListener\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityGesturesBinding\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\n\n/**\n * Test activity showcasing APIs around gestures implementation.\n */\nclass GesturesActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var gesturesPlugin: GesturesPlugin\n  private lateinit var gesturesManager: AndroidGesturesManager\n  private val gestureAlertsAdapter: GestureAlertsAdapter = GestureAlertsAdapter()\n  private var focalPointLatLng: Point? = null\n  private var pointAnnotationManager: PointAnnotationManager? = null\n  private lateinit var binding: ActivityGesturesBinding\n  private val rotateListener: OnRotateListener = object : OnRotateListener {\n    override fun onRotateBegin(detector: RotateGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_START, \"ROTATE START\"))\n    }\n\n    override fun onRotate(detector: RotateGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_PROGRESS, \"ROTATE PROGRESS\"))\n      recalculateFocalPoint()\n    }\n\n    override fun onRotateEnd(detector: RotateGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_END, \"ROTATE END\"))\n    }\n  }\n  private val moveListener: OnMoveListener = object : OnMoveListener {\n    override fun onMoveBegin(detector: MoveGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_START, \"MOVE START\"))\n    }\n\n    override fun onMove(detector: MoveGestureDetector): Boolean {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_PROGRESS, \"MOVE PROGRESS\"))\n      return false\n    }\n\n    override fun onMoveEnd(detector: MoveGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_END, \"MOVE END\"))\n      recalculateFocalPoint()\n    }\n  }\n  private val scaleListener: OnScaleListener = object : OnScaleListener {\n    override fun onScaleBegin(detector: StandardScaleGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_START, \"SCALE START\"))\n      if (focalPointLatLng != null) {\n        gestureAlertsAdapter.addAlert(\n          GestureAlert(\n            GestureAlert.TYPE_OTHER,\n            \"INCREASING MOVE THRESHOLD\"\n          )\n        )\n        gesturesManager.moveGestureDetector.moveThreshold = 175 * resources.displayMetrics.density\n\n        gestureAlertsAdapter.addAlert(\n          GestureAlert(\n            GestureAlert.TYPE_OTHER,\n            \"MANUALLY INTERRUPTING MOVE\"\n          )\n        )\n        gesturesManager.moveGestureDetector.interrupt()\n      }\n      recalculateFocalPoint()\n    }\n\n    override fun onScale(detector: StandardScaleGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_PROGRESS, \"SCALE PROGRESS\"))\n    }\n\n    override fun onScaleEnd(detector: StandardScaleGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_END, \"SCALE END\"))\n\n      if (focalPointLatLng != null) {\n        gestureAlertsAdapter.addAlert(\n          GestureAlert(\n            GestureAlert.TYPE_OTHER,\n            \"REVERTING MOVE THRESHOLD\"\n          )\n        )\n        gesturesManager.moveGestureDetector.moveThreshold = 0f\n      }\n    }\n  }\n  private val shoveListener: OnShoveListener = object : OnShoveListener {\n    override fun onShoveBegin(detector: ShoveGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_START, \"SHOVE START\"))\n    }\n\n    override fun onShove(detector: ShoveGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_PROGRESS, \"SHOVE PROGRESS\"))\n    }\n\n    override fun onShoveEnd(detector: ShoveGestureDetector) {\n      gestureAlertsAdapter.addAlert(GestureAlert(GestureAlert.TYPE_END, \"SHOVE END\"))\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityGesturesBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(-0.11968, 51.50325))\n        .zoom(15.0)\n        .build()\n    )\n    mapboxMap.loadStyle(Style.STANDARD) {\n      it.addImage(MARKER_IMAGE_ID, bitmapFromDrawableRes(R.drawable.ic_red_marker))\n    }\n\n    binding.mapView.waitForLayout {\n      initializeMap()\n    }\n\n    binding.recycler.layoutManager = LinearLayoutManager(this)\n    binding.recycler.adapter = gestureAlertsAdapter\n  }\n\n  override fun onPause() {\n    super.onPause()\n    gestureAlertsAdapter.cancelUpdates()\n  }\n\n  override fun onDestroy() {\n    gesturesPlugin.removeOnMoveListener(moveListener)\n    gesturesPlugin.removeOnRotateListener(rotateListener)\n    gesturesPlugin.removeOnScaleListener(scaleListener)\n    gesturesPlugin.removeOnShoveListener(shoveListener)\n    super.onDestroy()\n  }\n\n  private fun initializeMap() {\n    gesturesPlugin = binding.mapView.gestures\n    gesturesManager = gesturesPlugin.getGesturesManager()\n\n    val layoutParams = binding.recycler.layoutParams as RelativeLayout.LayoutParams\n    layoutParams.height = (binding.mapView.height / 1.75).toInt()\n    layoutParams.width = binding.mapView.width / 3\n    binding.recycler.layoutParams = layoutParams\n\n    attachListeners()\n\n    fixedFocalPointEnabled(gesturesPlugin.getSettings().focalPoint != null)\n  }\n\n  private fun attachListeners() {\n    gesturesPlugin.addOnMoveListener(moveListener)\n    gesturesPlugin.addOnRotateListener(rotateListener)\n    gesturesPlugin.addOnScaleListener(scaleListener)\n    gesturesPlugin.addOnShoveListener(shoveListener)\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_gestures, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    when (item.itemId) {\n      R.id.menu_gesture_focus_point -> {\n        fixedFocalPointEnabled(focalPointLatLng == null)\n        item.isChecked = focalPointLatLng == null\n      }\n      R.id.menu_gesture_animation -> {\n        gesturesPlugin.pinchToZoomDecelerationEnabled =\n          !gesturesPlugin.pinchToZoomDecelerationEnabled\n        gesturesPlugin.rotateDecelerationEnabled =\n          !gesturesPlugin.rotateDecelerationEnabled\n        gesturesPlugin.scrollDecelerationEnabled =\n          !gesturesPlugin.scrollDecelerationEnabled\n        item.isChecked = gesturesPlugin.pinchToZoomDecelerationEnabled &&\n          gesturesPlugin.rotateDecelerationEnabled &&\n          gesturesPlugin.scrollDecelerationEnabled\n      }\n      R.id.menu_gesture_rotate -> {\n        gesturesPlugin.rotateEnabled = !gesturesPlugin.rotateEnabled\n        item.isChecked = gesturesPlugin.rotateEnabled\n      }\n      R.id.menu_gesture_pitch -> {\n        gesturesPlugin.pitchEnabled = !gesturesPlugin.pitchEnabled\n        item.isChecked = gesturesPlugin.pitchEnabled\n      }\n      R.id.menu_gesture_zoom -> {\n        gesturesPlugin.pinchToZoomEnabled = !gesturesPlugin.pinchToZoomEnabled\n        item.isChecked = gesturesPlugin.pinchToZoomEnabled\n      }\n      R.id.menu_gesture_scroll -> {\n        gesturesPlugin.scrollEnabled = !gesturesPlugin.scrollEnabled\n        item.isChecked = gesturesPlugin.scrollEnabled\n      }\n      R.id.menu_gesture_double_tap -> {\n        gesturesPlugin.doubleTapToZoomInEnabled = !gesturesPlugin.doubleTapToZoomInEnabled\n        item.isChecked = gesturesPlugin.doubleTapToZoomInEnabled\n      }\n      R.id.menu_gesture_double_touch -> {\n        gesturesPlugin.doubleTouchToZoomOutEnabled = !gesturesPlugin.doubleTouchToZoomOutEnabled\n        item.isChecked = gesturesPlugin.doubleTouchToZoomOutEnabled\n      }\n      R.id.menu_gesture_quick_zoom -> {\n        gesturesPlugin.quickZoomEnabled = !gesturesPlugin.quickZoomEnabled\n        item.isChecked = gesturesPlugin.quickZoomEnabled\n      }\n      R.id.menu_gesture_pan_scroll_horizontal_vertical -> {\n        binding.mapView.gestures.updateSettings {\n          scrollMode = ScrollMode.HORIZONTAL_AND_VERTICAL\n        }\n        item.isChecked = true\n      }\n      R.id.menu_gesture_pan_scroll_horizontal -> {\n        binding.mapView.gestures.updateSettings {\n          scrollMode = ScrollMode.HORIZONTAL\n        }\n        item.isChecked = true\n      }\n      R.id.menu_gesture_pan_scroll_vertical -> {\n        binding.mapView.gestures.updateSettings {\n          scrollMode = ScrollMode.VERTICAL\n        }\n        item.isChecked = true\n      }\n      else -> {\n        return super.onOptionsItemSelected(item)\n      }\n    }\n    return true\n  }\n\n  private fun fixedFocalPointEnabled(enabled: Boolean) {\n    if (enabled) {\n      focalPointLatLng = FOCAL_POINT\n      pointAnnotationManager =\n        binding.mapView.annotations.createPointAnnotationManager().apply {\n          create(\n            PointAnnotationOptions()\n              .withPoint(FOCAL_POINT)\n              .withIconImage(MARKER_IMAGE_ID)\n          )\n        }\n      mapboxMap.setCamera(CameraOptions.Builder().center(focalPointLatLng).zoom(16.0).build())\n      recalculateFocalPoint()\n    } else {\n      pointAnnotationManager?.let {\n        binding.mapView.annotations.removeAnnotationManager(it)\n      }\n      pointAnnotationManager = null\n      focalPointLatLng = null\n      gesturesPlugin.focalPoint = null\n    }\n  }\n\n  private fun recalculateFocalPoint() {\n    focalPointLatLng?.let {\n      gesturesPlugin.focalPoint = mapboxMap.pixelForCoordinate(it)\n    }\n  }\n\n  private class GestureAlertsAdapter : RecyclerView.Adapter<GestureAlertsAdapter.ViewHolder>() {\n\n    private var isUpdating: Boolean = false\n    private val updateHandler = Handler(Looper.getMainLooper())\n    private val alerts = ArrayList<GestureAlert>()\n\n    @SuppressLint(\"NotifyDataSetChanged\")\n    private val updateRunnable = Runnable {\n      notifyDataSetChanged()\n      isUpdating = false\n    }\n\n    class ViewHolder internal constructor(view: View) : RecyclerView.ViewHolder(view) {\n      internal var alertMessageTv: TextView = view.findViewById(R.id.alert_message)\n    }\n\n    @NonNull\n    override fun onCreateViewHolder(@NonNull parent: ViewGroup, viewType: Int): ViewHolder {\n      val view =\n        LayoutInflater.from(parent.context).inflate(R.layout.item_gesture_alert, parent, false)\n      return ViewHolder(view)\n    }\n\n    override fun onBindViewHolder(@NonNull holder: ViewHolder, position: Int) {\n      val alert = alerts[position]\n      holder.alertMessageTv.text = alert.message\n      holder.alertMessageTv.setTextColor(\n        ContextCompat.getColor(holder.alertMessageTv.context, alert.color)\n      )\n    }\n\n    override fun getItemCount(): Int {\n      return alerts.size\n    }\n\n    fun addAlert(alert: GestureAlert) {\n      for (gestureAlert in alerts) {\n        if (gestureAlert.alertType != GestureAlert.TYPE_PROGRESS) {\n          break\n        }\n\n        if (alert.alertType == GestureAlert.TYPE_PROGRESS && gestureAlert == alert) {\n          return\n        }\n      }\n\n      if (itemCount >= MAX_NUMBER_OF_ALERTS) {\n        alerts.removeAt(itemCount - 1)\n      }\n\n      alerts.add(0, alert)\n      if (!isUpdating) {\n        isUpdating = true\n        updateHandler.postDelayed(updateRunnable, 250)\n      }\n    }\n\n    fun cancelUpdates() {\n      updateHandler.removeCallbacksAndMessages(null)\n    }\n  }\n\n  @SuppressLint(\"ResourceAsColor\")\n  private class GestureAlert(\n    @param:Type @field:Type val alertType: Int,\n    val message: String?\n  ) {\n\n    @ColorInt\n    var color: Int = 0\n      private set\n\n    @kotlin.annotation.Retention(AnnotationRetention.SOURCE)\n    @IntDef(TYPE_NONE, TYPE_START, TYPE_PROGRESS, TYPE_END, TYPE_OTHER)\n    annotation class Type\n\n    init {\n\n      when (alertType) {\n        TYPE_NONE -> color = android.R.color.black\n        TYPE_END -> color = android.R.color.holo_red_dark\n        TYPE_OTHER -> color = android.R.color.holo_purple\n        TYPE_PROGRESS -> color = android.R.color.holo_orange_dark\n        TYPE_START -> color = android.R.color.holo_green_dark\n      }\n    }\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) {\n        return true\n      }\n      if (other == null || javaClass != other.javaClass) {\n        return false\n      }\n\n      val that = other as GestureAlert?\n\n      if (alertType != that?.alertType) {\n        return false\n      }\n      return if (message != null) message == that.message else that.message == null\n    }\n\n    override fun hashCode(): Int {\n      var result = alertType\n      result = 31 * result + (message?.hashCode() ?: 0)\n      return result\n    }\n\n    companion object {\n      internal const val TYPE_NONE = 0\n      internal const val TYPE_START = 1\n      internal const val TYPE_END = 2\n      internal const val TYPE_PROGRESS = 3\n      internal const val TYPE_OTHER = 4\n    }\n  }\n\n  companion object {\n    private const val MAX_NUMBER_OF_ALERTS = 30\n    private const val MARKER_IMAGE_ID = \"MARKER_IMAGE_ID\"\n    private val FOCAL_POINT = Point.fromLngLat(-0.12968, 51.50325)\n  }\n}\n\ninline fun View.waitForLayout(crossinline f: () -> Unit) {\n  viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {\n    override fun onGlobalLayout() {\n      viewTreeObserver.removeOnGlobalLayoutListener(this)\n      f()\n    }\n  })\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/IconPropertyActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.BitmapFactory\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.switchCase\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.sources.generated.vectorSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityIconPropertyBinding\n\n/**\n * Add point data and several images to a style and use the switchCase and\n * get expressions to choose which image to display at each point in a SymbolLayer\n * based on a data property.\n */\nclass IconPropertyActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityIconPropertyBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    binding.mapView.mapboxMap.loadStyle(\n      styleExtension = style(Style.STANDARD) {\n        // Add icons from the U.S. National Parks Service to the map's style.\n        +image(RESTROOMS, BitmapFactory.decodeResource(resources, R.drawable.nps_restrooms))\n        +image(TRAIL_HEAD, BitmapFactory.decodeResource(resources, R.drawable.nps_trailhead))\n        +image(PICNIC_AREA, BitmapFactory.decodeResource(resources, R.drawable.nps_picnic_area))\n        // Access a vector tileset that contains places of interest at Yosemite National Park.\n        // This tileset was created by uploading NPS shape files to Mapbox Studio.\n        +vectorSource(SOURCE_ID) {\n          url(SOURCE_URI)\n        }\n        // Create a symbol layer and access the layer contained.\n        +symbolLayer(LAYER_ID, SOURCE_ID) {\n          // Access the layer that contains the Point of Interest (POI) data.\n          // The source layer property is a unique identifier for a layer within a vector tile source.\n          sourceLayer(SOURCE_LAYER_ID)\n          // Expression that adds conditions to the source to determine styling.\n          // `POITYPE` refers to a key in the data source. The values tell us which icon to use from the sprite sheet\n          iconImage(\n            switchCase {\n              eq {\n                get {\n                  literal(ICON_KEY)\n                }\n                literal(KEY_PICNIC_AREA)\n              }\n              literal(PICNIC_AREA)\n              eq {\n                get {\n                  literal(ICON_KEY)\n                }\n                literal(KEY_RESTROOMS)\n              }\n              literal(RESTROOMS)\n              eq {\n                get {\n                  literal(ICON_KEY)\n                }\n                literal(KEY_TRAIL_HEAD)\n              }\n              literal(TRAIL_HEAD)\n              // default case is to return an empty string so no icon will be loaded\n              literal(\"\")\n            }\n          )\n          iconAllowOverlap(true)\n          iconAnchor(IconAnchor.BOTTOM)\n        }\n      }\n    )\n  }\n\n  companion object {\n    private const val SOURCE_URI = \"mapbox://examples.ciuz0vpc\"\n    private const val SOURCE_LAYER_ID = \"Yosemite_POI-38jhes\"\n    private const val RESTROOMS = \"restrooms\"\n    private const val TRAIL_HEAD = \"trailhead\"\n    private const val PICNIC_AREA = \"picnic-area\"\n    private const val KEY_PICNIC_AREA = \"Picnic Area\"\n    private const val KEY_RESTROOMS = \"Restroom\"\n    private const val KEY_TRAIL_HEAD = \"Trailhead\"\n    private const val SOURCE_ID = \"source_id\"\n    private const val LAYER_ID = \"layer_id\"\n    private const val ICON_KEY = \"POITYPE\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/ImageSourceActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.rasterLayer\nimport com.mapbox.maps.extension.style.sources.generated.ImageSource\nimport com.mapbox.maps.extension.style.sources.generated.imageSource\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.extension.style.sources.updateImage\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityImageSourceBinding\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\n\nclass ImageSourceActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityImageSourceBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    val map = binding.mapView.mapboxMap\n\n    map.loadStyle(\n      style(style = Style.STANDARD) {\n        +imageSource(ID_IMAGE_SOURCE) {\n          coordinates(\n            listOf(\n              listOf(-80.11725, 25.7836),\n              listOf(-80.1397431334, 25.783548),\n              listOf(-80.13964, 25.7680),\n              listOf(-80.11725, 25.76795)\n            )\n          )\n        }\n        +rasterLayer(ID_IMAGE_LAYER, ID_IMAGE_SOURCE) {\n          rasterEmissiveStrength(1.0)\n        }\n      }\n    ) {\n      val imageSource: ImageSource = it.getSourceAs(ID_IMAGE_SOURCE)!!\n      imageSource.updateImage(bitmapFromDrawableRes(R.drawable.miami_beach))\n      map.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n      map.setStyleImportConfigProperty(\"basemap\", \"lightPreset\", Value.valueOf(\"night\"))\n    }\n  }\n\n  companion object {\n    private const val ID_IMAGE_SOURCE = \"image_source-id\"\n    private const val ID_IMAGE_LAYER = \"image_layer-id\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/IndoorExampleActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.indoorselector.indoorSelector\nimport com.mapbox.maps.plugin.locationcomponent.createDefault2DPuck\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.utils.LocationPermissionHelper\nimport java.lang.ref.WeakReference\n\n/**\n * Example showcasing the Indoor Manager API for controlling indoor map floor display.\n */\nclass IndoorExampleActivity : AppCompatActivity() {\n    private lateinit var locationPermissionHelper: LocationPermissionHelper\n\n    override fun onRequestPermissionsResult(\n        requestCode: Int,\n        permissions: Array<String>,\n        grantResults: IntArray\n    ) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        locationPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults)\n    }\n\n    @OptIn(MapboxExperimental::class)\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val mapInitOptions = MapInitOptions(\n            context = this,\n            cameraOptions = cameraOptions {\n                center(Point.fromLngLat(LONGITUDE, LATITUDE))\n                zoom(ZOOM)\n                bearing(BEARING)\n                pitch(PITCH)\n            },\n            styleUri = STYLE_URI,\n            plugins = MapInitOptions.defaultPluginList + Plugin.Mapbox(Plugin.MAPBOX_INDOOR_SELECTOR_PLUGIN_ID)\n        )\n\n        setContentView(R.layout.activity_indoor_example)\n        val container = findViewById<android.view.ViewGroup>(R.id.container)\n        val mapView = MapView(this, mapInitOptions)\n        container.addView(mapView, 0)\n\n        val styleInput = findViewById<android.widget.EditText>(R.id.styleInput)\n        findViewById<android.view.View>(R.id.loadStyleButton).setOnClickListener {\n            val style = styleInput.text.toString()\n            if (style.trim().startsWith(\"{\")) {\n                mapView.mapboxMap.loadStyleJson(style)\n            } else {\n                mapView.mapboxMap.loadStyle(style)\n            }\n        }\n\n        mapView.scalebar.enabled = true\n\n        mapView.indoorSelector.enabled = true\n        mapView.indoorSelector.marginTop = 160f\n\n        locationPermissionHelper = LocationPermissionHelper(WeakReference(this))\n        locationPermissionHelper.checkPermissions {\n            mapView.location.apply {\n                enabled = true\n                puckBearingEnabled = true\n                locationPuck = createDefault2DPuck(withBearing = true)\n            }\n        }\n    }\n\n    companion object {\n        private const val STYLE_URI = \"mapbox://styles/mapbox/standard\"\n        private const val LATITUDE = 35.55025\n        private const val LONGITUDE = 139.794131\n        private const val ZOOM = 16.0\n        private const val BEARING = 12.0\n        private const val PITCH = 60.0\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/InsetMapActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.coroutine.cameraChangedCoalescedEvents\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSource\nimport com.mapbox.maps.plugin.attribution.attribution\nimport com.mapbox.maps.plugin.compass.compass\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.plugin.logo.logo\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityInsetMapBinding\nimport com.mapbox.maps.testapp.examples.fragment.MapFragment\nimport kotlinx.coroutines.launch\n\n/**\n * Example demonstrating displaying two maps: main map and small map with lower zoom\n * in bottom-right corner with optional bounds showing what area is covered by main map.\n */\nclass InsetMapActivity : AppCompatActivity() {\n\n  private lateinit var mainMapboxMap: MapboxMap\n  private var insetMapboxMap: MapboxMap? = null\n\n  @OptIn(MapboxExperimental::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityInsetMapBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mainMapboxMap = binding.mapView.mapboxMap\n    mainMapboxMap.setCamera(MAIN_MAP_CAMERA_POSITION)\n    mainMapboxMap.loadStyle(\n      style = STYLE_URL\n    )\n\n    lifecycleScope.launch {\n      // repeatOnLifecycle launches the block in a new coroutine every time the\n      // lifecycle is in the STARTED state (or above) and cancels it when it's STOPPED.\n      repeatOnLifecycle(Lifecycle.State.STARTED) {\n        mainMapboxMap.cameraChangedCoalescedEvents.collect { cameraEvent ->\n          updateInsetMapCamera(cameraEvent.cameraState)\n        }\n      }\n    }\n\n    var insetMapFragment: MapFragment? =\n      supportFragmentManager.findFragmentByTag(INSET_FRAGMENT_TAG) as? MapFragment\n    if (insetMapFragment == null) {\n      // Create fragment transaction for the inset fragment\n      val transaction = supportFragmentManager.beginTransaction()\n      insetMapFragment = MapFragment()\n      // Add fragmentMap fragment to parent container\n      transaction.add(R.id.mini_map_fragment_container, insetMapFragment, INSET_FRAGMENT_TAG)\n      transaction.commit()\n    }\n    setInsetMapStyle(insetMapFragment)\n\n    binding.showBoundsToggleFab.setOnClickListener {\n      // Toggle the visibility of the camera bounds LineLayer\n      insetMapboxMap?.getStyle { style ->\n        style.getLayer(BOUNDS_LINE_LAYER_LAYER_ID)?.apply {\n          visibility(if (visibility == Visibility.VISIBLE) Visibility.NONE else Visibility.VISIBLE)\n        }\n      }\n    }\n  }\n\n  private fun setInsetMapStyle(insetMapFragment: MapFragment) {\n    insetMapFragment.getMapAsync {\n      insetMapboxMap = it\n      insetMapboxMap?.apply {\n        setCamera(INSET_CAMERA_POSITION)\n        loadStyle(\n          style = STYLE_URL\n        ) { style ->\n          style.addSource(geoJsonSource(BOUNDS_LINE_LAYER_SOURCE_ID) {})\n          // The layer properties for our line. This is where we make the line dotted, set the color, etc.\n          val layer = lineLayer(BOUNDS_LINE_LAYER_LAYER_ID, BOUNDS_LINE_LAYER_SOURCE_ID) {\n            lineCap(LineCap.ROUND)\n            lineJoin(LineJoin.ROUND)\n            lineWidth(3.0)\n            lineColor(Color.YELLOW)\n            visibility(Visibility.VISIBLE)\n          }\n          style.addLayer(layer)\n          updateInsetMapLineLayerBounds(style, mainMapboxMap.cameraState)\n        }\n      }\n      insetMapFragment.getMapView().apply {\n        logo.enabled = false\n        scalebar.enabled = false\n        attribution.enabled = false\n        compass.enabled = false\n\n        gestures.updateSettings {\n          scrollEnabled = false\n          pinchToZoomEnabled = false\n        }\n      }\n    }\n  }\n\n  private fun updateInsetMapCamera(mainCameraPosition: CameraState) {\n    val insetCameraPosition = CameraOptions.Builder()\n      .zoom(mainCameraPosition.zoom.minus(ZOOM_DISTANCE_BETWEEN_MAIN_AND_INSET_MAPS))\n      .pitch(mainCameraPosition.pitch)\n      .bearing(mainCameraPosition.bearing)\n      .center(mainCameraPosition.center)\n      .build()\n    insetMapboxMap?.setCamera(insetCameraPosition)\n    insetMapboxMap?.getStyle { style -> updateInsetMapLineLayerBounds(style, mainCameraPosition) }\n  }\n\n  private fun updateInsetMapLineLayerBounds(\n    fullyLoadedStyle: Style,\n    mainMapCameraState: CameraState\n  ) {\n    (fullyLoadedStyle.getSource(BOUNDS_LINE_LAYER_SOURCE_ID) as? GeoJsonSource)?.apply {\n      feature(Feature.fromGeometry(LineString.fromLngLats(getRectanglePoints(mainMapCameraState))))\n    }\n  }\n\n  private fun getRectanglePoints(mainMapCameraState: CameraState): List<Point> {\n    val bounds = mainMapboxMap.coordinateBoundsForCamera(\n      mainMapCameraState.toCameraOptions()\n    )\n    return listOf(\n      Point.fromLngLat(bounds.northeast.longitude(), bounds.northeast.latitude()),\n      Point.fromLngLat(bounds.northeast.longitude(), bounds.southwest.latitude()),\n      Point.fromLngLat(bounds.southwest.longitude(), bounds.southwest.latitude()),\n      Point.fromLngLat(bounds.southwest.longitude(), bounds.northeast.latitude()),\n      Point.fromLngLat(bounds.northeast.longitude(), bounds.northeast.latitude())\n    )\n  }\n\n  companion object {\n    private const val STYLE_URL = \"mapbox://styles/mapbox/cj5l80zrp29942rmtg0zctjto\"\n    private const val INSET_FRAGMENT_TAG = \"com.mapbox.insetMapFragment\"\n    private const val BOUNDS_LINE_LAYER_SOURCE_ID = \"BOUNDS_LINE_LAYER_SOURCE_ID\"\n    private const val BOUNDS_LINE_LAYER_LAYER_ID = \"BOUNDS_LINE_LAYER_LAYER_ID\"\n    private const val ZOOM_DISTANCE_BETWEEN_MAIN_AND_INSET_MAPS = 3\n    private val MAIN_MAP_CAMERA_POSITION = cameraOptions {\n      center(Point.fromLngLat(106.025839, 11.302318))\n      zoom(5.11)\n    }\n\n    private val INSET_CAMERA_POSITION = CameraOptions.Builder()\n      .zoom(MAIN_MAP_CAMERA_POSITION.zoom?.minus(ZOOM_DISTANCE_BETWEEN_MAIN_AND_INSET_MAPS))\n      .pitch(MAIN_MAP_CAMERA_POSITION.pitch)\n      .bearing(MAIN_MAP_CAMERA_POSITION.bearing)\n      .center(MAIN_MAP_CAMERA_POSITION.center)\n      .build()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/Interactive3DModelSourceActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.graphics.drawable.GradientDrawable\nimport android.os.Bundle\nimport android.widget.SeekBar\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.generated.modelLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.ModelType\nimport com.mapbox.maps.extension.style.light.dynamicLight\nimport com.mapbox.maps.extension.style.light.generated.ambientLight\nimport com.mapbox.maps.extension.style.light.generated.directionalLight\nimport com.mapbox.maps.extension.style.sources.generated.ModelSourceModel\nimport com.mapbox.maps.extension.style.sources.generated.modelMaterialOverride\nimport com.mapbox.maps.extension.style.sources.generated.modelNodeOverride\nimport com.mapbox.maps.extension.style.sources.generated.modelSource\nimport com.mapbox.maps.extension.style.sources.generated.modelSourceModel\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.databinding.ActivityInteractive3dModelSourceBinding\nimport kotlin.math.roundToInt\n\n/**\n * Showcase interactive 3D model with source-based updates.\n * Demonstrates node overrides for doors/hood/trunk and material overrides for colors/lights.\n */\n@MapboxExperimental\nclass Interactive3DModelSourceActivity : AppCompatActivity() {\n\n  private lateinit var binding: ActivityInteractive3dModelSourceBinding\n\n  // Vehicle parameters\n  private var doorsFrontLeft = 0.5\n  private var doorsFrontRight = 0.0\n  private var trunk = 0.0\n  private var hood = 0.0\n  private var brakeLights = 0.0\n  private var vehicleColor = Color.WHITE\n  private lateinit var model: ModelSourceModel\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityInteractive3dModelSourceBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    model = createCarModel()\n\n    binding.mapView.mapboxMap.apply {\n      setCamera(\n        cameraOptions {\n          center(CAR_POSITION)\n          zoom(19.3)\n          bearing(45.0)\n          pitch(60.0)\n        }\n      )\n\n      loadStyle(\n        style(Style.STANDARD) {\n          +dynamicLight(\n            ambientLight(\"environment\") {\n              intensity(0.4)\n            },\n            directionalLight(\"sun_light\") {\n              castShadows(true)\n            }\n          )\n          +modelSource(SOURCE_ID) {\n            models(listOf(model))\n          }\n          +modelLayer(LAYER_ID, SOURCE_ID) {\n            modelScale(listOf(10.0, 10.0, 10.0))\n            modelType(ModelType.LOCATION_INDICATOR)\n          }\n        }\n      ) {\n        binding.mapView.mapboxMap.setStyleImportConfigProperty(\n          \"basemap\",\n          \"show3dObjects\",\n          Value.valueOf(false)\n        )\n        setupControls()\n      }\n    }\n  }\n\n  private fun setupControls() {\n    // Color picker view\n    updateColorPickerBackground()\n    binding.colorPickerButton.setOnClickListener {\n      showColorPickerDialog()\n    }\n\n    // Trunk slider\n    binding.seekBarTrunk.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        trunk = progress / 100.0\n        model.nodeOverrides(\n          listOf(\n            modelNodeOverride(\"trunk\") {\n              orientation(listOf(mix(trunk, 0.0, -60.0), 0.0, 0.0))\n            }\n          )\n        )\n      }\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n\n    // Hood slider\n    binding.seekBarHood.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        hood = progress / 100.0\n        model.nodeOverrides(\n          listOf(\n            modelNodeOverride(\"hood\") {\n              orientation(listOf(mix(hood, 0.0, 45.0), 0.0, 0.0))\n            }\n          )\n        )\n      }\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n\n    // Front left door slider\n    binding.seekBarDoorLeft.progress = (doorsFrontLeft * 100).roundToInt()\n    binding.seekBarDoorLeft.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        doorsFrontLeft = progress / 100.0\n        model.nodeOverrides(\n          listOf(\n            modelNodeOverride(\"doors_front-left\") {\n              orientation(listOf(0.0, mix(doorsFrontLeft, 0.0, -80.0), 0.0))\n            }\n          )\n        )\n      }\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n\n    // Front right door slider\n    binding.seekBarDoorRight.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        doorsFrontRight = progress / 100.0\n        model.nodeOverrides(\n          listOf(\n            modelNodeOverride(\"doors_front-right\") {\n              orientation(listOf(0.0, mix(doorsFrontRight, 0.0, 80.0), 0.0))\n            }\n          )\n        )\n      }\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n\n    // Brake lights slider\n    binding.seekBarBrake.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        brakeLights = progress / 100.0\n        model.materialOverrides(\n          listOf(\n            modelMaterialOverride(\"lights_brakes\") {\n              modelColor(Color.rgb(224, 0, 0))\n              modelColorMixIntensity(brakeLights)\n              modelEmissiveStrength(brakeLights)\n            },\n            modelMaterialOverride(\"lights-brakes_reverse\") {\n              modelColor(Color.rgb(224, 0, 0))\n              modelColorMixIntensity(brakeLights)\n              modelEmissiveStrength(brakeLights)\n            },\n            modelMaterialOverride(\"lights_brakes_volume\") {\n              modelColor(Color.rgb(224, 0, 0))\n              modelColorMixIntensity(1.0)\n              modelEmissiveStrength(0.8)\n              modelOpacity(brakeLights)\n            },\n            modelMaterialOverride(\"lights-brakes_reverse_volume\") {\n              modelColor(Color.rgb(224, 0, 0))\n              modelColorMixIntensity(1.0)\n              modelEmissiveStrength(0.8)\n              modelOpacity(brakeLights)\n            }\n          )\n        )\n      }\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n  }\n\n  private fun showColorPickerDialog() {\n    val colors = intArrayOf(\n      Color.WHITE,\n      Color.BLACK,\n      Color.RED,\n      Color.rgb(0, 100, 200), // Blue\n      Color.rgb(0, 150, 0), // Green\n      Color.YELLOW,\n      Color.rgb(150, 75, 0), // Brown\n      Color.GRAY\n    )\n\n    androidx.appcompat.app.AlertDialog.Builder(this)\n      .setTitle(\"Vehicle Color\")\n      .setItems(arrayOf(\"White\", \"Black\", \"Red\", \"Blue\", \"Green\", \"Yellow\", \"Brown\", \"Gray\")) { _, which ->\n        vehicleColor = colors[which]\n        updateColorPickerBackground()\n\n        model.materialOverrides(\n          listOf(\n            modelMaterialOverride(\"body\") {\n              modelColor(vehicleColor)\n              modelColorMixIntensity(1.0)\n            }\n          )\n        )\n      }\n      .show()\n  }\n\n  private fun updateColorPickerBackground() {\n    val drawable = GradientDrawable().apply {\n      shape = GradientDrawable.RECTANGLE\n      setColor(vehicleColor)\n      cornerRadius = 8f * resources.displayMetrics.density\n      setStroke((2 * resources.displayMetrics.density).toInt(), Color.GRAY)\n    }\n    binding.colorPickerButton.background = drawable\n  }\n\n  // Create initial model with all overrides\n  private fun createCarModel(): ModelSourceModel {\n    val doorOpeningDegMax = 80.0\n\n    // Material overrides\n    val materialOverrides = listOf(\n      modelMaterialOverride(\"body\") {\n        modelColor(vehicleColor)\n        modelColorMixIntensity(1.0)\n      },\n      modelMaterialOverride(\"lights_brakes\") {\n        modelColor(Color.rgb(224, 0, 0))\n        modelColorMixIntensity(brakeLights)\n        modelEmissiveStrength(brakeLights)\n      },\n      modelMaterialOverride(\"lights-brakes_reverse\") {\n        modelColor(Color.rgb(224, 0, 0))\n        modelColorMixIntensity(brakeLights)\n        modelEmissiveStrength(brakeLights)\n      },\n      modelMaterialOverride(\"lights_brakes_volume\") {\n        modelColor(Color.rgb(224, 0, 0))\n        modelColorMixIntensity(1.0)\n        modelEmissiveStrength(0.8)\n        modelOpacity(brakeLights)\n      },\n      modelMaterialOverride(\"lights-brakes_reverse_volume\") {\n        modelColor(Color.rgb(224, 0, 0))\n        modelColorMixIntensity(1.0)\n        modelEmissiveStrength(0.8)\n        modelOpacity(brakeLights)\n      }\n    )\n\n    // Node overrides for door/hood/trunk animations\n    val nodeOverrides = listOf(\n      modelNodeOverride(\"doors_front-left\") {\n        orientation(listOf(0.0, mix(doorsFrontLeft, 0.0, -doorOpeningDegMax), 0.0))\n      },\n      modelNodeOverride(\"doors_front-right\") {\n        orientation(listOf(0.0, mix(doorsFrontRight, 0.0, doorOpeningDegMax), 0.0))\n      },\n      modelNodeOverride(\"hood\") {\n        orientation(listOf(mix(hood, 0.0, 45.0), 0.0, 0.0))\n      },\n      modelNodeOverride(\"trunk\") {\n        orientation(listOf(mix(trunk, 0.0, -60.0), 0.0, 0.0))\n      }\n    )\n\n    return modelSourceModel(CAR_MODEL_KEY) {\n      uri(CAR_MODEL_URI)\n      position(listOf(CAR_POSITION.longitude(), CAR_POSITION.latitude()))\n      orientation(listOf(0.0, 0.0, 0.0))\n      nodeOverrides(nodeOverrides)\n      materialOverrides(materialOverrides)\n    }\n  }\n\n  // Helper function to mix values (linear interpolation)\n  private fun mix(t: Double, a: Double, b: Double): Double {\n    return b * t - a * (t - 1)\n  }\n\n  private companion object {\n    const val SOURCE_ID = \"3d-model-source\"\n    const val LAYER_ID = \"3d-model-layer-for-source-based-updates\"\n    const val CAR_MODEL_KEY = \"car\"\n    const val CAR_MODEL_URI = \"https://docs.mapbox.com/mapbox-gl-js/assets/ego_car.glb\"\n    val CAR_POSITION: Point = Point.fromLngLat(-74.0138, 40.7154)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/JavaInterfaceChecker.java",
    "content": "package com.mapbox.maps.testapp.examples;\n\nimport static com.mapbox.maps.extension.localization.StyleInterfaceExtensionKt.localizeLabels;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.division;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.literal;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.pi;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.rgba;\nimport static com.mapbox.maps.extension.style.image.ImageUtils.image9Patch;\nimport static com.mapbox.maps.extension.style.image.NinePatchUtils.addImage9Patch;\nimport static com.mapbox.maps.extension.style.layers.LayerUtils.addPersistentLayer;\nimport static com.mapbox.maps.extension.style.terrain.generated.TerrainKt.terrain;\nimport static com.mapbox.maps.plugin.animation.CameraAnimationsUtils.easeTo;\nimport static com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManagerKt.createCircleAnnotationManager;\nimport static com.mapbox.maps.plugin.annotation.generated.PointAnnotationManagerKt.createPointAnnotationManager;\nimport static com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManagerKt.createPolygonAnnotationManager;\nimport static com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManagerKt.createPolylineAnnotationManager;\n\nimport android.animation.Animator;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.Color;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.os.Bundle;\nimport android.util.AttributeSet;\nimport android.view.Surface;\n\nimport androidx.annotation.DrawableRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.OptIn;\n\nimport com.mapbox.android.gestures.AndroidGesturesManager;\nimport com.mapbox.android.gestures.MoveGestureDetector;\nimport com.mapbox.android.gestures.RotateGestureDetector;\nimport com.mapbox.android.gestures.ShoveGestureDetector;\nimport com.mapbox.android.gestures.StandardScaleGestureDetector;\nimport com.mapbox.bindgen.Value;\nimport com.mapbox.common.Cancelable;\nimport com.mapbox.common.MapboxOptions;\nimport com.mapbox.common.TileStore;\nimport com.mapbox.geojson.Feature;\nimport com.mapbox.maps.CameraOptions;\nimport com.mapbox.maps.CameraState;\nimport com.mapbox.maps.ClickInteraction;\nimport com.mapbox.maps.ExtensionUtils;\nimport com.mapbox.maps.FeatureStateOperationCallback;\nimport com.mapbox.maps.FeaturesetFeatureId;\nimport com.mapbox.maps.ImageHolder;\nimport com.mapbox.maps.LayerPosition;\nimport com.mapbox.maps.MapInitOptions;\nimport com.mapbox.maps.MapOptions;\nimport com.mapbox.maps.MapSnapshotOptions;\nimport com.mapbox.maps.MapSurface;\nimport com.mapbox.maps.MapView;\nimport com.mapbox.maps.MapboxExperimental;\nimport com.mapbox.maps.MapboxMap;\nimport com.mapbox.maps.MapboxMapsOptions;\nimport com.mapbox.maps.QueryFeatureExtensionCallback;\nimport com.mapbox.maps.QueryFeatureStateCallback;\nimport com.mapbox.maps.ScreenCoordinate;\nimport com.mapbox.maps.SnapshotOverlayOptions;\nimport com.mapbox.maps.Snapshotter;\nimport com.mapbox.maps.Style;\nimport com.mapbox.maps.TileStoreUsageMode;\nimport com.mapbox.maps.TransitionOptions;\nimport com.mapbox.maps.debugoptions.MapViewDebugOptions;\nimport com.mapbox.maps.extension.style.StyleContract;\nimport com.mapbox.maps.extension.style.expressions.generated.Expression;\nimport com.mapbox.maps.extension.style.expressions.types.FormatSection;\nimport com.mapbox.maps.extension.style.layers.Layer;\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer;\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor;\nimport com.mapbox.maps.extension.style.types.Formatted;\nimport com.mapbox.maps.extension.style.types.FormattedSection;\nimport com.mapbox.maps.interactions.FeatureState;\nimport com.mapbox.maps.interactions.FeatureStateKey;\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor;\nimport com.mapbox.maps.interactions.standard.generated.StandardBuildingsState;\nimport com.mapbox.maps.interactions.standard.generated.StandardInteractions;\nimport com.mapbox.maps.module.MapTelemetry;\nimport com.mapbox.maps.plugin.LocationPuck;\nimport com.mapbox.maps.plugin.LocationPuck2D;\nimport com.mapbox.maps.plugin.LocationPuck3D;\nimport com.mapbox.maps.plugin.Plugin;\nimport com.mapbox.maps.plugin.ScrollMode;\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin;\nimport com.mapbox.maps.plugin.animation.CameraAnimationsUtils;\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions;\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig;\nimport com.mapbox.maps.plugin.annotation.AnnotationPlugin;\nimport com.mapbox.maps.plugin.annotation.AnnotationSourceOptions;\nimport com.mapbox.maps.plugin.annotation.ClusterOptions;\nimport com.mapbox.maps.plugin.attribution.AttributionParserConfig;\nimport com.mapbox.maps.plugin.attribution.generated.AttributionSettings;\nimport com.mapbox.maps.plugin.compass.generated.CompassSettings;\nimport com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener;\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin;\nimport com.mapbox.maps.plugin.gestures.GesturesUtils;\nimport com.mapbox.maps.plugin.gestures.OnMoveListener;\nimport com.mapbox.maps.plugin.gestures.OnRotateListener;\nimport com.mapbox.maps.plugin.gestures.OnScaleListener;\nimport com.mapbox.maps.plugin.gestures.OnShoveListener;\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettings;\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentPlugin;\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentUtils;\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings;\nimport com.mapbox.maps.plugin.logo.LogoPlugin;\nimport com.mapbox.maps.plugin.logo.LogoUtils;\nimport com.mapbox.maps.plugin.logo.generated.LogoSettings;\nimport com.mapbox.maps.plugin.overlay.MapOverlayPlugin;\nimport com.mapbox.maps.plugin.overlay.MapOverlayUtils;\nimport com.mapbox.maps.plugin.scalebar.ScaleBarPlugin;\nimport com.mapbox.maps.plugin.scalebar.ScaleBarUtils;\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings;\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin;\nimport com.mapbox.maps.plugin.viewport.ViewportUtils;\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions;\nimport com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason;\n\nimport org.jetbrains.annotations.NotNull;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Locale;\n\nimport kotlin.Pair;\n\n/** @noinspection UnusedAssignment*/\n@SuppressWarnings(\"unused\")\npublic class JavaInterfaceChecker {\n  private void getClusterLeaves(MapboxMap mapboxMap, String sourceId, Feature cluster, QueryFeatureExtensionCallback callback) {\n    mapboxMap.getGeoJsonClusterLeaves(sourceId, cluster, callback);\n    mapboxMap.getGeoJsonClusterLeaves(sourceId, cluster, 1, callback);\n    mapboxMap.getGeoJsonClusterLeaves(sourceId, cluster, 1, 2, callback);\n  }\n\n  private void scaleBarSettings() {\n    ScaleBarSettings scaleBarSettings = new ScaleBarSettings.Builder()\n            .setEnabled(true)\n            .setPosition(1)\n            .setMarginLeft(1f)\n            .setMarginTop(1f)\n            .setMarginRight(1f)\n            .setMarginBottom(1f)\n            .setPrimaryColor(Color.BLACK)\n            .setSecondaryColor(Color.BLACK)\n            .setTextColor(Color.BLACK)\n            .setBorderWidth(1f)\n            .setHeight(1f)\n            .setTextBarMargin(1f)\n            .setTextBorderWidth(1f)\n            .setTextSize(1f)\n            .setIsMetricUnits(true)\n            .setRefreshInterval(1L)\n            .setShowTextBorder(true)\n            .setRatio(1f)\n            .setUseContinuousRendering(true)\n            .build();\n  }\n\n  private void logoSettings() {\n    LogoSettings logoSettings = new LogoSettings.Builder()\n            .setEnabled(true)\n            .setPosition(1)\n            .setMarginLeft(1f)\n            .setMarginTop(1f)\n            .setMarginRight(1f)\n            .setMarginBottom(1f)\n            .build();\n  }\n\n  private void locationComponentSettings(LocationPuck locationPuck) {\n    LocationComponentSettings locationComponentSettings = new LocationComponentSettings.Builder(locationPuck)\n            .setEnabled(true)\n            .setPulsingColor(Color.BLACK)\n            .setPulsingMaxRadius(1f)\n            .setAccuracyRingColor(Color.BLACK)\n            .setAccuracyRingBorderColor(Color.BLACK)\n            .setLayerAbove(\"id1\")\n            .setLayerBelow(\"id2\")\n            .build();\n  }\n\n  private void gesturesSettings(ScrollMode scrollMode, ScreenCoordinate screenCoordinate) {\n    GesturesSettings gesturesSettings = new GesturesSettings.Builder()\n            .setDoubleTapToZoomInEnabled(true)\n            .setDoubleTouchToZoomOutEnabled(true)\n            .setFocalPoint(screenCoordinate)\n            .setIncreasePinchToZoomThresholdWhenRotating(true)\n            .setIncreaseRotateThresholdWhenPinchingToZoom(true)\n            .setPinchScrollEnabled(true)\n            .setPinchToZoomDecelerationEnabled(true)\n            .setPinchToZoomEnabled(true)\n            .setPitchEnabled(true)\n            .setQuickZoomEnabled(true)\n            .setRotateDecelerationEnabled(true)\n            .setRotateEnabled(true)\n            .setScrollDecelerationEnabled(true)\n            .setScrollEnabled(true)\n            .setScrollMode(scrollMode)\n            .setSimultaneousRotateAndPinchToZoomEnabled(true)\n            .setZoomAnimationAmount(1f)\n            .build();\n\n  }\n\n  private void compassSettings(Drawable drawable) {\n    CompassSettings compassSettings = new CompassSettings.Builder()\n            .setEnabled(true)\n            .setMarginBottom(1f)\n            .setClickable(true)\n            .setFadeWhenFacingNorth(true)\n            .setMarginLeft(1f)\n            .setImage(ImageHolder.from(((BitmapDrawable)drawable).getBitmap()))\n            .setMarginRight(1f)\n            .setMarginTop(1f)\n            .setPosition(1)\n            .setOpacity(1f)\n            .setVisibility(true)\n            .setRotation(1f)\n            .build();\n  }\n\n  private void attributionSettings() {\n    AttributionSettings attributionSettings = new AttributionSettings.Builder()\n            .setEnabled(true)\n            .setClickable(true)\n            .setMarginBottom(1f)\n            .setMarginLeft(1f)\n            .setIconColor(Color.BLACK)\n            .setMarginRight(1f)\n            .setMarginTop(1f)\n            .setPosition(1)\n            .setEnabled(true)\n            .build();\n  }\n\n  private void annotationManager(AnnotationPlugin annotationPlugin, MapView mapView, AnnotationConfig annotationConfig) {\n    createPolylineAnnotationManager(annotationPlugin, annotationConfig);\n    createPolygonAnnotationManager(annotationPlugin, annotationConfig);\n    createPointAnnotationManager(annotationPlugin, annotationConfig);\n    createCircleAnnotationManager(annotationPlugin, annotationConfig);\n  }\n\n  private void attribution() {\n    AttributionParserConfig attributionParserConfig = new AttributionParserConfig();\n    attributionParserConfig = new AttributionParserConfig(true);\n    attributionParserConfig = new AttributionParserConfig(true, true);\n    attributionParserConfig = new AttributionParserConfig(true, true, true);\n    attributionParserConfig = new AttributionParserConfig(true, true, true, true);\n  }\n\n  private void annotation(String belowLayerId, String layerId, String sourceId, Value expression, List<Pair<Integer, Integer>> colorLevels, HashMap<String, Object> clusterProperties) {\n    ClusterOptions clusterOptions = new ClusterOptions();\n    clusterOptions = new ClusterOptions(true);\n    clusterOptions = new ClusterOptions(true, 1L);\n    clusterOptions = new ClusterOptions(true, 1L, expression);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0, expression);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0, expression, Color.BLACK);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0, expression, Color.BLACK, expression);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0, expression, Color.BLACK, expression, 1.0);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0, expression, Color.BLACK, expression, 1.0, expression);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0, expression, Color.BLACK, expression, 1.0, expression, 1L);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0, expression, Color.BLACK, expression, 1.0, expression, 1L, 2L);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0, expression, Color.BLACK, expression, 1.0, expression, 1L, 2L, colorLevels);\n    clusterOptions = new ClusterOptions(true, 1L, expression, 1.0, expression, Color.BLACK, expression, 1.0, expression, 1L, 2L, colorLevels, clusterProperties);\n\n    AnnotationSourceOptions options = new AnnotationSourceOptions();\n    options = new AnnotationSourceOptions(1L);\n    options = new AnnotationSourceOptions(1L, 1L);\n    options = new AnnotationSourceOptions(1L, 1L, true);\n    options = new AnnotationSourceOptions(1L, 1L, true, 1.0);\n    options = new AnnotationSourceOptions(1L, 1L, true, 1.0, clusterOptions);\n\n    AnnotationConfig config = new AnnotationConfig();\n    config = new AnnotationConfig(belowLayerId);\n    config = new AnnotationConfig(belowLayerId, layerId);\n    config = new AnnotationConfig(belowLayerId, layerId, sourceId);\n    config = new AnnotationConfig(belowLayerId, layerId, sourceId, options);\n  }\n\n  private void cameraTest(MapboxMap mapboxMap, CameraOptions cameraOptions, MapAnimationOptions mapAnimationOptions, ScreenCoordinate screenCoordinate) {\n    CameraAnimationsUtils.easeTo(mapboxMap, cameraOptions);\n    CameraAnimationsUtils.easeTo(mapboxMap, cameraOptions, mapAnimationOptions);\n    CameraAnimationsUtils.flyTo(mapboxMap, cameraOptions);\n    CameraAnimationsUtils.flyTo(mapboxMap, cameraOptions, mapAnimationOptions);\n    CameraAnimationsUtils.moveBy(mapboxMap, screenCoordinate, mapAnimationOptions);\n    CameraAnimationsUtils.moveBy(mapboxMap, screenCoordinate);\n    CameraAnimationsUtils.pitchBy(mapboxMap, 1.0, mapAnimationOptions);\n    CameraAnimationsUtils.pitchBy(mapboxMap, 1.0);\n    CameraAnimationsUtils.rotateBy(mapboxMap, screenCoordinate, screenCoordinate);\n    CameraAnimationsUtils.rotateBy(mapboxMap, screenCoordinate, screenCoordinate, mapAnimationOptions);\n  }\n\n  private void terrainTest() {\n    terrain(\"id\");\n    terrain(\"id\", receiver -> null);\n  }\n\n  private void addLayer(Style style, Layer layer, LayerPosition position) {\n    addPersistentLayer(style, layer);\n    addPersistentLayer(style, layer, position);\n  }\n\n  private void image9PatchTest(Style style, Bitmap bitmap) {\n    image9Patch(\"id\", bitmap);\n    image9Patch(\"id\", bitmap, builder -> null);\n    addImage9Patch(style, \"id\", bitmap);\n    addImage9Patch(style, \"id\", bitmap, 1.0f);\n    addImage9Patch(style, \"id\", bitmap, 1.0f, true);\n  }\n\n  private void formatSection(Expression expression) {\n    FormatSection formatSection = new FormatSection(expression);\n    formatSection = new FormatSection(expression, expression);\n    formatSection = new FormatSection(expression, expression, expression);\n    formatSection = new FormatSection(expression, expression, expression, expression);\n  }\n\n  private void localization(Style style, Locale locale, List<String> layerId) {\n    localizeLabels(style, locale);\n    localizeLabels(style, locale, layerId);\n  }\n\n  private void featureState(\n      MapboxMap mapboxMap,\n      QueryFeatureStateCallback getCallback,\n      FeatureStateOperationCallback setCallback,\n      FeatureStateOperationCallback removeCallback,\n      FeatureStateOperationCallback resetCallback,\n      Value state,\n      String sourceId,\n      String featureId,\n      String sourceLayerId\n  ) {\n    mapboxMap.getFeatureState(sourceId, featureId, getCallback);\n    mapboxMap.getFeatureState(sourceId, sourceLayerId, featureId, getCallback);\n    mapboxMap.setFeatureState(sourceId, featureId, state, setCallback);\n    mapboxMap.setFeatureState(sourceId, sourceLayerId, featureId, state, setCallback);\n    mapboxMap.removeFeatureState(sourceId, featureId, removeCallback);\n    mapboxMap.removeFeatureState(sourceId, sourceLayerId, featureId, removeCallback);\n    mapboxMap.removeFeatureState(sourceId, sourceLayerId, featureId, \"stateKey\", removeCallback);\n    mapboxMap.resetFeatureStates(sourceId, resetCallback);\n    mapboxMap.resetFeatureStates(sourceId, sourceLayerId, resetCallback);\n  }\n\n  private void mapSurface(Context context, Surface surface, MapInitOptions mapInitOptions) {\n    MapSurface mapSurface = new MapSurface(context, surface);\n    mapSurface = new MapSurface(context, surface, mapInitOptions);\n  }\n\n  private void locationPuck(@DrawableRes int imageId, List<Float> floatList) {\n    LocationPuck2D locationPuck2D = new LocationPuck2D();\n    locationPuck2D = new LocationPuck2D(ImageHolder.from(imageId));\n    locationPuck2D = new LocationPuck2D(ImageHolder.from(imageId), ImageHolder.from(imageId));\n    locationPuck2D = new LocationPuck2D(ImageHolder.from(imageId), ImageHolder.from(imageId), ImageHolder.from(imageId));\n    locationPuck2D = new LocationPuck2D(ImageHolder.from(imageId), ImageHolder.from(imageId), ImageHolder.from(imageId), \"scale\");\n\n    LocationPuck3D locationPuck3D = new LocationPuck3D(\"uri\");\n    locationPuck3D = new LocationPuck3D(\"uri\", floatList);\n    locationPuck3D = new LocationPuck3D(\"uri\", floatList, 1.0f);\n    locationPuck3D = new LocationPuck3D(\"uri\", floatList, 1.0f, floatList);\n    locationPuck3D = new LocationPuck3D(\"uri\", floatList, 1.0f, floatList, \"scale\");\n    locationPuck3D = new LocationPuck3D(\"uri\", floatList, 1.0f, floatList, \"scale\", floatList);\n    locationPuck3D = new LocationPuck3D(\"uri\", floatList, 1.0f, floatList, \"scale\", floatList, floatList);\n  }\n\n  /** @noinspection deprecation*/\n  private void mapboxMapOverLoad(MapView mapView, StyleContract.StyleExtension styleExtension,\n                                 Style.OnStyleLoaded onStyleLoaded,\n                                 OnMapLoadErrorListener onMapLoadErrorListener) {\n    final MapboxMap mapboxMap = mapView.getMapboxMap();\n    mapboxMap.getStyle();\n\n    mapboxMap.loadStyle(Style.STANDARD);\n    mapboxMap.loadStyle(Style.STANDARD, onStyleLoaded);\n    mapboxMap.loadStyle(\"json\");\n    mapboxMap.loadStyle(\"json\", onStyleLoaded);\n    mapboxMap.loadStyle(styleExtension);\n    mapboxMap.loadStyle(styleExtension, onStyleLoaded);\n\n    // deprecated to confirm we don't introduce breaking changes\n    mapboxMap.loadStyleUri(Style.STANDARD);\n    mapboxMap.loadStyleUri(Style.STANDARD, onStyleLoaded);\n    mapboxMap.loadStyleUri(Style.STANDARD, onStyleLoaded, onMapLoadErrorListener);\n    mapboxMap.loadStyleUri(Style.STANDARD, new TransitionOptions.Builder().build(), onStyleLoaded, onMapLoadErrorListener);\n    mapboxMap.loadStyleJson(\"json\");\n    mapboxMap.loadStyleJson(\"json\", onStyleLoaded);\n    mapboxMap.loadStyleJson(\"json\", onStyleLoaded, onMapLoadErrorListener);\n    mapboxMap.loadStyleJson(\"json\", new TransitionOptions.Builder().build(), onStyleLoaded, onMapLoadErrorListener);\n    mapboxMap.loadStyle(styleExtension, onStyleLoaded, onMapLoadErrorListener);\n    mapboxMap.loadStyle(styleExtension, new TransitionOptions.Builder().build(), onStyleLoaded, onMapLoadErrorListener);\n  }\n\n  private void mapInitOptionsOverloads(Context context,\n                                       MapOptions mapOptions, List<Plugin> plugins,\n                                       CameraOptions cameraOptions,\n                                       AttributeSet attrs) {\n    MapInitOptions mapInitOptions = new MapInitOptions(context);\n    mapInitOptions = new MapInitOptions(context);\n    mapInitOptions = new MapInitOptions(context, mapOptions);\n    mapInitOptions = new MapInitOptions(context, mapOptions, plugins);\n    mapInitOptions = new MapInitOptions(context, mapOptions, plugins, cameraOptions);\n    mapInitOptions = new MapInitOptions(context, mapOptions, plugins, cameraOptions, false);\n    mapInitOptions = new MapInitOptions(context, mapOptions, plugins, cameraOptions, false, Style.STANDARD);\n    mapInitOptions = new MapInitOptions(context, mapOptions, plugins, cameraOptions, false, Style.STANDARD, attrs);\n    mapInitOptions = new MapInitOptions(context, mapOptions, plugins, cameraOptions, false, Style.STANDARD, attrs, 4);\n  }\n\n  private void mapboxOptions() {\n    MapboxOptions.getAccessToken();\n    MapboxOptions.setAccessToken(\"\");\n    MapboxMapsOptions.getBaseUrl();\n    MapboxMapsOptions.setBaseUrl(\"https://api.mapbox.com\");\n    MapboxMapsOptions.getTileStoreUsageMode();\n    MapboxMapsOptions.setTileStoreUsageMode(TileStoreUsageMode.DISABLED);\n    MapboxMapsOptions.getTileStore();\n    MapboxMapsOptions.setTileStore(null);\n    MapboxMapsOptions.setTileStore(TileStore.create());\n    MapboxMapsOptions.getDataPath();\n    MapboxMapsOptions.setDataPath(\"/tmp/data\");\n  }\n\n  private void snapshotter(Context context, MapSnapshotOptions options) {\n    SnapshotOverlayOptions overlayOptions = new SnapshotOverlayOptions();\n    overlayOptions = new SnapshotOverlayOptions(false);\n    overlayOptions = new SnapshotOverlayOptions(false, false);\n    Snapshotter snapshotter = new Snapshotter(context, options);\n    snapshotter = new Snapshotter(context, options, overlayOptions);\n  }\n\n  private void cameraState(CameraState state, ScreenCoordinate screenCoordinate) {\n    CameraOptions options = ExtensionUtils.toCameraOptions(state);\n    options = ExtensionUtils.toCameraOptions(state, screenCoordinate);\n  }\n\n  private void addSymbolLayer(Style style) {\n    Formatted formatted = new Formatted();\n    formatted.add(new FormattedSection(\"test\", 0.7, new ArrayList<>(), \"#1000\"));\n    SymbolLayer symbolLayer = new SymbolLayer(\"test\", \"test\")\n        .iconAnchor(IconAnchor.BOTTOM)\n        .textField(formatted)\n        .iconOpacity(literal(0.9));\n    symbolLayer.bindTo(style);\n\n    Expression expression = division(\n        literal(2.0),\n        pi());\n    symbolLayer.iconOpacity(expression);\n    symbolLayer.iconColor(rgba(255.0, 0.0, 0.0, 1.0));\n  }\n\n  private void cameraAnimations(MapView mapView) {\n    final MapboxMap mapboxMap = mapView.getMapboxMap();\n    final CameraOptions cameraOptions = new CameraOptions.Builder().build();\n    final MapAnimationOptions mapAnimationOptions = new MapAnimationOptions.Builder().build();\n    Animator.AnimatorListener animationListener = new Animator.AnimatorListener() {\n      @Override\n      public void onAnimationStart(@NonNull Animator animation) {\n\n      }\n\n      @Override\n      public void onAnimationEnd(@NonNull Animator animation) {\n\n      }\n\n      @Override\n      public void onAnimationCancel(@NonNull Animator animation) {\n\n      }\n\n      @Override\n      public void onAnimationRepeat(@NonNull Animator animation) {\n\n      }\n    };\n    // plugin itself\n    final CameraAnimationsPlugin plugin = CameraAnimationsUtils.getCamera(mapView);\n    plugin.easeTo(cameraOptions, mapAnimationOptions, animationListener);\n    plugin.flyTo(cameraOptions, mapAnimationOptions, animationListener);\n    plugin.moveBy(new ScreenCoordinate(0.0, 1.1), mapAnimationOptions, animationListener);\n    plugin.pitchBy(1, mapAnimationOptions, animationListener);\n    plugin.scaleBy(1, new ScreenCoordinate(0.0, 1.1), mapAnimationOptions, animationListener);\n    plugin.rotateBy(new ScreenCoordinate(0.0, 1.1), new ScreenCoordinate(1.1, 0.0), mapAnimationOptions, animationListener);\n\n    // animation utils\n    easeTo(mapboxMap, cameraOptions, mapAnimationOptions);\n    CameraAnimationsUtils.flyTo(mapboxMap, cameraOptions, mapAnimationOptions);\n    CameraAnimationsUtils.moveBy(mapboxMap, new ScreenCoordinate(0.0, 1.1), mapAnimationOptions);\n    CameraAnimationsUtils.pitchBy(mapboxMap, 1, mapAnimationOptions);\n    CameraAnimationsUtils.scaleBy(mapboxMap, 1, new ScreenCoordinate(0.0, 1.1), mapAnimationOptions);\n    CameraAnimationsUtils.rotateBy(mapboxMap, new ScreenCoordinate(0.0, 1.1), new ScreenCoordinate(1.1, 0.0), mapAnimationOptions);\n  }\n\n  private void gesture(MapView mapView) {\n    final MapboxMap mapboxMap = mapView.getMapboxMap();\n    final GesturesPlugin gesturesPlugin = GesturesUtils.getGestures(mapView);\n    GesturesUtils.addOnFlingListener(mapboxMap, () -> {\n    });\n    GesturesUtils.removeOnFlingListener(mapboxMap, () -> {\n    });\n    GesturesUtils.addOnMapClickListener(mapboxMap, point -> false);\n    GesturesUtils.removeOnMapClickListener(mapboxMap, point -> false);\n    GesturesUtils.addOnMapLongClickListener(mapboxMap, point -> false);\n    GesturesUtils.removeOnMapLongClickListener(mapboxMap, point -> false);\n    OnMoveListener onMoveListener = new OnMoveListener() {\n      @Override\n      public void onMoveBegin(@NotNull MoveGestureDetector detector) {\n\n      }\n\n      @Override\n      public boolean onMove(@NotNull MoveGestureDetector detector) {\n        return false;\n      }\n\n      @Override\n      public void onMoveEnd(@NotNull MoveGestureDetector detector) {\n\n      }\n    };\n    GesturesUtils.addOnMoveListener(mapboxMap, onMoveListener);\n    GesturesUtils.removeOnMoveListener(mapboxMap, onMoveListener);\n    OnRotateListener onRotateListener = new OnRotateListener() {\n      @Override\n      public void onRotateBegin(@NotNull RotateGestureDetector detector) {\n\n      }\n\n      @Override\n      public void onRotate(@NotNull RotateGestureDetector detector) {\n\n      }\n\n      @Override\n      public void onRotateEnd(@NotNull RotateGestureDetector detector) {\n\n      }\n    };\n    GesturesUtils.addOnRotateListener(mapboxMap, onRotateListener);\n    GesturesUtils.removeOnRotateListener(mapboxMap, onRotateListener);\n    OnScaleListener onScaleListener = new OnScaleListener() {\n      @Override\n      public void onScaleBegin(@NotNull StandardScaleGestureDetector detector) {\n\n      }\n\n      @Override\n      public void onScale(@NotNull StandardScaleGestureDetector detector) {\n\n      }\n\n      @Override\n      public void onScaleEnd(@NotNull StandardScaleGestureDetector detector) {\n\n      }\n    };\n    GesturesUtils.addOnScaleListener(mapboxMap, onScaleListener);\n    GesturesUtils.removeOnScaleListener(mapboxMap, onScaleListener);\n    OnShoveListener onShoveListener = new OnShoveListener() {\n      @Override\n      public void onShoveBegin(@NotNull ShoveGestureDetector detector) {\n\n      }\n\n      @Override\n      public void onShove(@NotNull ShoveGestureDetector detector) {\n\n      }\n\n      @Override\n      public void onShoveEnd(@NotNull ShoveGestureDetector detector) {\n\n      }\n    };\n    GesturesUtils.addOnShoveListener(mapboxMap, onShoveListener);\n    GesturesUtils.removeOnShoveListener(mapboxMap, onShoveListener);\n    AndroidGesturesManager gesturesManager = GesturesUtils.getGesturesManager(mapboxMap);\n    //noinspection DataFlowIssue\n    GesturesUtils.setGesturesManager(mapboxMap, gesturesManager, false, false);\n  }\n\n  private void locationComponent(MapView mapView) {\n    LocationComponentPlugin locationComponent = LocationComponentUtils.getLocationComponent(mapView);\n    locationComponent.setLocationPuck(LocationComponentUtils.createDefault2DPuck());\n    locationComponent.setLocationPuck(LocationComponentUtils.createDefault2DPuck(true));\n  }\n\n  private void logo(MapView mapView) {\n    LogoPlugin logo = LogoUtils.getLogo(mapView);\n  }\n\n  @OptIn(markerClass = MapboxExperimental.class)\n  private void overlay(MapView mapView) {\n    MapOverlayPlugin overlay = MapOverlayUtils.getOverlay(mapView);\n  }\n\n  private void scaleBar(MapView mapView) {\n    ScaleBarPlugin scaleBar = ScaleBarUtils.getScaleBar(mapView);\n  }\n\n  private void viewport(MapView mapView) {\n    ViewportPlugin viewport = ViewportUtils.getViewport(mapView);\n    viewport.addStatusObserver((from, to, reason) -> {\n      if (reason == ViewportStatusChangeReason.USER_INTERACTION) {\n        viewport.transitionTo(\n            viewport.makeFollowPuckViewportState(new FollowPuckViewportStateOptions.Builder().build()),\n            viewport.makeImmediateViewportTransition(),\n            isFinished -> {\n              // no-ops\n            });\n      }\n    });\n  }\n\n  private void debugOptions(MapView mapView) {\n    mapView.setDebugOptions(\n        new HashSet<>(\n            Arrays.asList(\n                MapViewDebugOptions.TILE_BORDERS,\n                MapViewDebugOptions.PARSE_STATUS,\n                MapViewDebugOptions.TIMESTAMPS,\n                MapViewDebugOptions.COLLISION,\n                MapViewDebugOptions.OVERDRAW,\n                MapViewDebugOptions.STENCIL_CLIP,\n                MapViewDebugOptions.DEPTH_BUFFER,\n                MapViewDebugOptions.MODEL_BOUNDS,\n                MapViewDebugOptions.TERRAIN_WIREFRAME,\n                MapViewDebugOptions.LAYERS2_DWIREFRAME,\n                MapViewDebugOptions.LAYERS3_DWIREFRAME,\n                MapViewDebugOptions.LIGHT,\n                MapViewDebugOptions.CAMERA,\n                MapViewDebugOptions.PADDING\n            )\n        )\n    );\n  }\n\n  private static class CustomTelemetry implements MapTelemetry {\n    @Override\n    public void onAppUserTurnstileEvent() {\n\n    }\n\n    @Override\n    public void setUserTelemetryRequestState(boolean enabled) {\n\n    }\n\n    @Override\n    public void disableTelemetrySession() {\n\n    }\n\n    @Override\n    public void onPerformanceEvent(@Nullable Bundle data) {\n\n    }\n  }\n\n  @MapboxExperimental\n  private void interactions(final MapboxMap mapboxMap) {\n    final Cancelable cancelable1 = mapboxMap.addInteraction(\n            ClickInteraction.featureset(\n                    \"featuresetId\",\n                    \"importId\",\n                    (selectedFeature, context) -> {\n                      mapboxMap.setFeatureState(\n                              selectedFeature,\n                              new FeatureState.Builder().addBooleanState(\"active\", true).build()\n                      );\n                      mapboxMap.removeFeatureState(selectedFeature);\n                      mapboxMap.removeFeatureState(selectedFeature.getDescriptor(), selectedFeature.getId(), FeatureStateKey.create(\"key\"));\n                      return true;\n                    }\n            )\n    );\n\n    final TypedFeaturesetDescriptor.Layer layer = new TypedFeaturesetDescriptor.Layer(\"layerId\");\n    final Cancelable cancelable2 = mapboxMap.addInteraction(\n            ClickInteraction.layer(\n                    layer.getLayerId(),\n                    (selectedFeature, context) -> {\n                      mapboxMap.setFeatureState(layer, selectedFeature.getId(), new FeatureState.Builder().build());\n                      mapboxMap.getFeatureState(layer, new FeaturesetFeatureId(\"featureId\", null), result -> {\n                        result.getBooleanState(\"active\");\n                      });\n                      return true;\n                    }\n            )\n    );\n\n    final Cancelable cancelable3 = mapboxMap.addInteraction(\n            ClickInteraction.map(context ->\n                    !context.getScreenCoordinate().equals(new ScreenCoordinate(0.0, 0.0))\n            )\n    );\n\n    mapboxMap.loadStyle(Style.STANDARD);\n    mapboxMap.addInteraction(\n            StandardInteractions.standardBuildings(\n                    ClickInteraction.Companion,\n                    (clickedBuilding, context) -> {\n                      mapboxMap.setFeatureState(\n                              clickedBuilding,\n                              new StandardBuildingsState.Builder()\n                                      .highlight(true)\n                                      .build()\n                      );\n                      return true;\n                    }\n            )\n    );\n\n    StandardInteractions.standardPlaceLabels(\n            ClickInteraction.Companion,\n            (placeLabelsFeature, context) -> {\n              placeLabelsFeature.getClass();\n              return true;\n            }\n    );\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/LargeGeojsonPerformanceActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.animation.flyTo\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n/**\n * Example of passing large geojson to verify it does not block UI thread\n * for parsing before passed to core.\n */\nclass LargeGeojsonPerformanceActivity : AppCompatActivity() {\n\n  private var jsonUpdateCounter = 0\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    mapView.mapboxMap.apply {\n      subscribeSourceDataLoaded {\n        if (it.dataId.isNullOrBlank().not()) {\n          // log whenever update with corresponding data-id is rendered on the map\n          logI(TAG, \"GeoJsonSource was updated, data-id : ${it.dataId}\")\n        }\n      }\n\n      setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(LONGITUDE, LATITUDE))\n          .zoom(START_ZOOM)\n          .build()\n      )\n      loadStyle(\n        style(Style.STANDARD) {\n          // add an icon that uses very small geojson source\n          +image(\n            \"icon\",\n            ContextCompat.getDrawable(\n              this@LargeGeojsonPerformanceActivity,\n              R.drawable.ic_blue_marker\n            )!!.toBitmap()\n          )\n          +geoJsonSource(\"${SOURCE}_marker\") {\n            logI(TAG, \"Update marker ${SOURCE}_marker, data-id : $jsonUpdateCounter\")\n            geometry(Point.fromLngLat(LONGITUDE, LATITUDE), jsonUpdateCounter++.toString())\n          }\n          +symbolLayer(\"${LAYER}_marker\", \"${SOURCE}_marker\") {\n            iconImage(\"icon\")\n            iconAnchor(IconAnchor.BOTTOM)\n          }\n        }\n      ) {\n        lifecycleScope.launch {\n          // start an animation that uses UI thread to update map camera\n          flyTo(\n            CameraOptions.Builder().zoom(END_ZOOM).build(),\n            MapAnimationOptions.mapAnimationOptions { duration(ANIMATION_DURATION_MS) }\n          )\n          // Converting a big String to Feature takes some time so we'll do it in a worker thread\n          val routePoints = withContext(Dispatchers.Default) {\n            Feature.fromJson(\n              AnnotationUtils.loadStringFromAssets(\n                this@LargeGeojsonPerformanceActivity,\n                LARGE_GEOJSON_ASSET_NAME\n              )\n            )\n          }\n\n          addGeoJsonLines(routePoints, mapView.mapboxMap)\n        }\n      }\n    }\n  }\n\n  private fun addGeoJsonLines(routePoints: Feature, mapboxStyleManager: MapboxStyleManager) {\n    repeat(LARGE_SOURCE_COUNT) {\n      mapboxStyleManager.addSource(\n        geoJsonSource(\"${SOURCE}_$it\") {\n          logI(TAG, \"Update routePoints ${SOURCE}_$it, data-id : $jsonUpdateCounter\")\n          feature(routePoints, jsonUpdateCounter++.toString())\n        }\n      )\n      mapboxStyleManager.addLayer(\n        lineLayer(\"${LAYER}_$it\", \"${SOURCE}_$it\") {\n          lineColor(\"blue\")\n          lineOffset(5.0 * it)\n        }\n      )\n    }\n  }\n\n  companion object {\n    private const val LARGE_GEOJSON_ASSET_NAME = \"long_route.json\"\n    private const val ANIMATION_DURATION_MS = 10_000L\n    private const val SOURCE = \"source\"\n    private const val LAYER = \"layer\"\n    private const val LARGE_SOURCE_COUNT = 6\n    private const val LATITUDE = 51.1079\n    private const val LONGITUDE = 17.0385\n    private const val START_ZOOM = 5.9\n    private const val END_ZOOM = 2.0\n    private const val TAG = \"LargeGeojsonUpdate\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/LegacyOfflineActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.testapp.databinding.ActivityLegacyOfflineBinding\n\n/**\n * Example app that downloads an offline region and when succeeded\n * shows a button to load a map at the offline region definition.\n */\n@Suppress(\"DEPRECATION\")\nclass LegacyOfflineActivity : AppCompatActivity() {\n\n  private lateinit var offlineManager: OfflineRegionManager\n  private lateinit var offlineRegion: OfflineRegion\n  private var mapView: MapView? = null\n  private lateinit var binding: ActivityLegacyOfflineBinding\n\n  private val regionObserver: OfflineRegionObserver = object : OfflineRegionObserver {\n    override fun errorOccurred(error: OfflineRegionError) {\n      if (error.isFatal) {\n        logE(TAG, \"Fatal error: ${error.type}, ${error.message}\")\n      } else {\n        logW(TAG, \"Error downloading some resources:  ${error.type}, ${error.message}\")\n      }\n      offlineRegion.setOfflineRegionDownloadState(OfflineRegionDownloadState.INACTIVE)\n    }\n\n    override fun statusChanged(status: OfflineRegionStatus) {\n      logD(\n        TAG,\n        \"${status.completedResourceCount}/${status.requiredResourceCount} resources; ${status.completedResourceSize} bytes downloaded.\"\n      )\n      if (status.downloadState == OfflineRegionDownloadState.INACTIVE) {\n        downloadComplete()\n        return\n      }\n    }\n  }\n\n  private val callback: OfflineRegionCreateCallback = OfflineRegionCreateCallback { expected ->\n    if (expected.isValue) {\n      expected.value?.let {\n        offlineRegion = it\n        it.setOfflineRegionObserver(regionObserver)\n        it.setOfflineRegionDownloadState(OfflineRegionDownloadState.ACTIVE)\n      }\n    } else {\n      logE(TAG, expected.error!!)\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityLegacyOfflineBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    offlineManager = OfflineRegionManager()\n    offlineManager.createOfflineRegion(\n      OfflineRegionGeometryDefinition.Builder()\n        .geometry(point)\n        .pixelRatio(2f)\n        .minZoom(zoom - 2)\n        .maxZoom(zoom + 2)\n        .styleURL(styleUrl)\n        .glyphsRasterizationMode(GlyphsRasterizationMode.NO_GLYPHS_RASTERIZED_LOCALLY)\n        .build(),\n      callback\n    )\n  }\n\n  private fun downloadComplete() {\n    binding.downloadProgress.visibility = View.GONE\n    binding.showMapButton.visibility = View.VISIBLE\n    binding.showMapButton.setOnClickListener {\n      it.visibility = View.GONE\n      // create mapView\n      mapView = MapView(\n        this@LegacyOfflineActivity,\n        MapInitOptions(context = this@LegacyOfflineActivity, styleUri = styleUrl)\n      )\n      mapView?.mapboxMap?.setCamera(CameraOptions.Builder().zoom(zoom).center(point).build())\n      setContentView(mapView)\n\n      mapView?.onStart()\n    }\n  }\n\n  override fun onStart() {\n    super.onStart()\n    mapView?.onStart()\n  }\n\n  override fun onStop() {\n    super.onStop()\n    mapView?.onStop()\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    offlineRegion.invalidate { }\n    mapView?.onDestroy()\n  }\n\n  companion object {\n    private const val TAG = \"Offline\"\n    private const val zoom = 16.0\n    private val point: Point = Point.fromLngLat(57.818901, 20.071357)\n    private const val styleUrl = Style.STANDARD_SATELLITE\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/LocationComponentActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.layers.properties.generated.Anchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.light.generated.flatLight\nimport com.mapbox.maps.extension.style.light.setLight\nimport com.mapbox.maps.extension.style.projection.generated.getProjection\nimport com.mapbox.maps.extension.style.projection.generated.projection\nimport com.mapbox.maps.extension.style.projection.generated.setProjection\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.plugin.locationcomponent.DefaultLocationProvider\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.createDefault2DPuck\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityLocationComponentBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils.showShortToast\nimport com.mapbox.maps.testapp.utils.LocationPermissionHelper\nimport java.lang.ref.WeakReference\n\n@OptIn(MapboxExperimental::class)\nclass LocationComponentActivity : AppCompatActivity() {\n\n  private var lastStyleTheme = StyleTheme.DARK\n  private lateinit var locationPermissionHelper: LocationPermissionHelper\n  private val onIndicatorPositionChangedListener = OnIndicatorPositionChangedListener {\n    // Jump to the current indicator position\n    binding.mapView.mapboxMap.setCamera(CameraOptions.Builder().center(it).build())\n    // Set the gestures plugin's focal point to the current indicator location.\n    binding.mapView.gestures.focalPoint = binding.mapView.mapboxMap.pixelForCoordinate(it)\n  }\n  private lateinit var binding: ActivityLocationComponentBinding\n  private enum class StyleTheme {\n    LIGHT,\n    DARK\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityLocationComponentBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    locationPermissionHelper = LocationPermissionHelper(WeakReference(this))\n    locationPermissionHelper.checkPermissions {\n      binding.mapView.apply {\n        mapboxMap.loadStyle(Style.STANDARD) {\n          it.setLight(\n            flatLight {\n              anchor(Anchor.MAP)\n              color(Color.YELLOW)\n              position(\n                radialCoordinate = 10.0,\n                azimuthalAngle = 40.0,\n                polarAngle = 50.0\n              )\n            }\n          )\n          // Disable scroll gesture, since we are updating the camera position based on the indicator location.\n          gestures.scrollEnabled = false\n          gestures.addOnMapClickListener { point ->\n            location\n              .isLocatedAt(point) { isPuckLocatedAtPoint ->\n                if (isPuckLocatedAtPoint) {\n                  Toast.makeText(context, \"Clicked on location puck\", Toast.LENGTH_SHORT).show()\n                }\n              }\n            true\n          }\n          gestures.addOnMapLongClickListener { point ->\n            location.isLocatedAt(point) { isPuckLocatedAtPoint ->\n              if (isPuckLocatedAtPoint) {\n                Toast.makeText(context, \"Long-clicked on location puck\", Toast.LENGTH_SHORT)\n                  .show()\n              }\n            }\n            true\n          }\n          val locationProvider = location.getLocationProvider() as DefaultLocationProvider\n          locationProvider.addOnCompassCalibrationListener {\n            Toast.makeText(context, \"Compass needs to be calibrated\", Toast.LENGTH_LONG).show()\n          }\n        }\n      }\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_location_component, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    when (item.itemId) {\n      R.id.action_customise_location_puck_change -> {\n        toggleCustomisedPuck()\n        return true\n      }\n      R.id.action_map_style_change -> {\n        toggleMapStyle()\n        return true\n      }\n      R.id.action_map_projection_change -> {\n        toggleMapProjection()\n        return true\n      }\n      R.id.action_component_disable -> {\n        binding.mapView.location.enabled = false\n        return true\n      }\n      R.id.action_component_enabled -> {\n        binding.mapView.location.enabled = true\n        return true\n      }\n      R.id.action_show_bearing -> {\n        binding.mapView.location.puckBearingEnabled = true\n        if (binding.mapView.location.locationPuck is LocationPuck2D) {\n          binding.mapView.location.locationPuck = createDefault2DPuck(withBearing = true)\n        }\n        return true\n      }\n      R.id.action_hide_bearing -> {\n        binding.mapView.location.puckBearingEnabled = false\n        if (binding.mapView.location.locationPuck is LocationPuck2D) {\n          binding.mapView.location.locationPuck = createDefault2DPuck(withBearing = false)\n        }\n        return true\n      }\n      R.id.heading -> {\n        binding.mapView.location.puckBearing = PuckBearing.HEADING\n        item.isChecked = true\n        return true\n      }\n      R.id.course -> {\n        binding.mapView.location.puckBearing = PuckBearing.COURSE\n        item.isChecked = true\n        return true\n      }\n      R.id.location_no_animation -> {\n        (binding.mapView.location.getLocationProvider() as DefaultLocationProvider).locationAnimatorOptions {\n            duration = 0\n          }\n        item.isChecked = true\n        return true\n      }\n      R.id.location_1s_animation -> {\n        (binding.mapView.location.getLocationProvider() as DefaultLocationProvider).locationAnimatorOptions {\n          duration = 1000\n        }\n        item.isChecked = true\n        return true\n      }\n      R.id.location_300ms_animation -> {\n        (binding.mapView.location.getLocationProvider() as DefaultLocationProvider).locationAnimatorOptions {\n            duration = 300\n          }\n        item.isChecked = true\n        return true\n      }\n      R.id.action_accuracy_enabled -> {\n        val location = binding.mapView.location\n        location.showAccuracyRing = true\n        if (location.locationPuck is LocationPuck3D) {\n          showShortToast(\"showAccuracyRing works for 2D location puck only\")\n        }\n        item.isChecked = true\n        return true\n      }\n      R.id.action_accuracy_disable -> {\n        binding.mapView.location.showAccuracyRing = false\n        item.isChecked = true\n        return true\n      }\n      R.id.toggle_opacity -> {\n        val location = binding.mapView.location\n        location.locationPuck = location.locationPuck.run {\n          when (this) {\n            is LocationPuck3D -> copy(modelOpacity = if (modelOpacity == 1.0F) 0.5F else 1.0F)\n            is LocationPuck2D -> copy(opacity = if (opacity == 1.0F) 0.5F else 1.0F)\n          }\n        }\n        return true\n      }\n      R.id.move_to_bottom_slot -> {\n        val location = binding.mapView.location\n        location.slot = \"bottom\"\n        return true\n      }\n\n      R.id.reset_slot -> {\n        val location = binding.mapView.location\n        location.slot = null\n        return true\n      }\n\n      else -> return super.onOptionsItemSelected(item)\n    }\n  }\n\n  private fun toggleCustomisedPuck() {\n    binding.mapView.location.let {\n      when (it.locationPuck) {\n        is LocationPuck3D -> it.locationPuck = LocationPuck2D(\n          topImage = ImageHolder.from(com.mapbox.maps.plugin.locationcomponent.R.drawable.mapbox_user_icon),\n          bearingImage = ImageHolder.from(com.mapbox.maps.plugin.locationcomponent.R.drawable.mapbox_user_bearing_icon),\n          shadowImage = ImageHolder.from(com.mapbox.maps.plugin.locationcomponent.R.drawable.mapbox_user_stroke_icon),\n          scaleExpression = interpolate {\n            linear()\n            zoom()\n            stop {\n              literal(0.0)\n              literal(0.6)\n            }\n            stop {\n              literal(20.0)\n              literal(1.0)\n            }\n          }.toJson()\n        )\n        is LocationPuck2D -> it.locationPuck = LocationPuck3D(\n          modelUri = \"asset://sportcar.glb\",\n          modelScale = listOf(10f, 10f, 10f),\n          modelTranslation = listOf(0.1f, 0.1f, 0.1f),\n          modelRotation = listOf(0.0f, 0.0f, 180.0f),\n          modelCastShadows = false,\n          modelReceiveShadows = false,\n          modelEmissiveStrength = 1.1f\n        )\n      }\n    }\n  }\n\n  private fun toggleMapStyle() {\n    if (lastStyleTheme == StyleTheme.DARK) {\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\n        \"basemap\",\n        \"theme\",\n        Value.valueOf(\"monochrome\")\n      )\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\n        \"basemap\",\n        \"lightPreset\",\n        Value.valueOf(\"day\")\n      )\n      lastStyleTheme = StyleTheme.LIGHT\n    } else {\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\n        \"basemap\",\n        \"theme\",\n        Value.valueOf(\"monochrome\")\n      )\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\n        \"basemap\",\n        \"lightPreset\",\n        Value.valueOf(\"night\")\n      )\n      lastStyleTheme = StyleTheme.DARK\n    }\n  }\n\n  private fun toggleMapProjection() {\n    binding.mapView.mapboxMap.getStyle { style ->\n      style.setProjection(\n        projection(\n          when (style.getProjection()?.name) {\n            ProjectionName.MERCATOR -> ProjectionName.GLOBE\n            ProjectionName.GLOBE -> ProjectionName.MERCATOR\n            else -> ProjectionName.GLOBE\n          }\n        )\n      )\n    }\n  }\n\n  override fun onRequestPermissionsResult(\n    requestCode: Int,\n    permissions: Array<String>,\n    grantResults: IntArray\n  ) {\n    super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n    locationPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults)\n  }\n\n  override fun onStart() {\n    super.onStart()\n    binding.mapView.location\n      .addOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n  }\n\n  override fun onStop() {\n    super.onStop()\n    binding.mapView.location\n      .removeOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/LocationComponentAnimationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.interpolator.view.animation.FastOutSlowInInterpolator\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.LocationConsumer\nimport com.mapbox.maps.plugin.locationcomponent.LocationProvider\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityLocationComponentAnimationBinding\n\n/**\n * Example that demonstrates using custom [LocationProvider] and sending custom location updates\n * with [LocationConsumer] with using custom puck transition options.\n */\nclass LocationComponentAnimationActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  private var emitCount = 0\n  private var delta = 0f\n  private val handler = Handler(Looper.getMainLooper())\n\n  private inner class FakeLocationProvider : LocationProvider {\n\n    private var locationConsumer: LocationConsumer? = null\n\n    private fun emitFakeLocations() {\n      // after several first emits we update puck animator options\n      if (emitCount == 5) {\n        locationConsumer?.let {\n          it.onPuckLocationAnimatorDefaultOptionsUpdated {\n            // set same duration as our location emit frequency - it will make puck position change smooth\n            duration = 2000\n            interpolator = FastOutSlowInInterpolator()\n          }\n          it.onPuckBearingAnimatorDefaultOptionsUpdated {\n            // set duration bigger than our location emit frequency -\n            // this will result in cancelling ongoing animation and starting new one with a visible non-smooth `jump`\n            duration = 5000\n          }\n        }\n      }\n      handler.postDelayed(\n        {\n          when (emitCount) {\n            // set duration > location emit frequency -> location animator will interrupt running one\n            // and start from last interpolated point. Because of constant change of target point\n            // it will result in increasing puck speed.\n            in 1..5 -> {\n              locationConsumer?.onLocationUpdated(\n                Point.fromLngLat(\n                  POINT_LNG + delta,\n                  POINT_LAT + delta\n                )\n              ) {\n                duration = 4000\n              }\n            }\n            // set duration = emit frequency -> location animators do not interrupt each other\n            else -> {\n              locationConsumer?.onLocationUpdated(\n                Point.fromLngLat(\n                  POINT_LNG + delta,\n                  POINT_LAT + delta\n                )\n              )\n            }\n          }\n          locationConsumer?.onBearingUpdated(BEARING + delta * 10000.0 * 5)\n          delta += 0.001f\n          emitCount++\n          emitFakeLocations()\n        },\n        2000\n      )\n    }\n\n    override fun registerLocationConsumer(locationConsumer: LocationConsumer) {\n      this.locationConsumer = locationConsumer\n      emitFakeLocations()\n    }\n\n    override fun unRegisterLocationConsumer(locationConsumer: LocationConsumer) {\n      this.locationConsumer = null\n      handler.removeCallbacksAndMessages(null)\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityLocationComponentAnimationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap.apply {\n      loadStyle(\n        Style.STANDARD\n      ) {\n        setCamera(\n          CameraOptions.Builder()\n            .zoom(14.0)\n            .pitch(0.0)\n            .bearing(0.0)\n            .center(Point.fromLngLat(POINT_LNG, POINT_LAT))\n            .build()\n        )\n        binding.mapView.location.apply {\n          setLocationProvider(FakeLocationProvider())\n          updateSettings {\n            puckBearingEnabled = true\n            puckBearing = PuckBearing.COURSE\n            enabled = true\n            locationPuck = LocationPuck2D(\n              bearingImage = ImageHolder.from(R.drawable.mapbox_mylocation_icon_bearing),\n            )\n          }\n        }\n      }\n    }\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    handler.removeCallbacksAndMessages(null)\n  }\n\n  companion object {\n    private const val POINT_LAT = 60.1699\n    private const val POINT_LNG = 24.9384\n    private const val BEARING = 60.0\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/LocationComponentModelAnimationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.animation.ValueAnimator\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.os.CountDownTimer\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.animation.LinearInterpolator\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.api.directions.v5.models.DirectionsResponse\nimport com.mapbox.core.constants.Constants\nimport com.mapbox.geojson.LineString\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.plugin.locationcomponent.DefaultLocationProvider\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.locationcomponent.model.ModelMaterialPart\nimport com.mapbox.maps.plugin.locationcomponent.model.ModelNodePart\nimport com.mapbox.maps.plugin.locationcomponent.model.createAnimatableModel\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityLocationComponentBinding\nimport com.mapbox.maps.testapp.examples.OpenableNode.Companion.DEFAULT_OPEN_DEGREES\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.utils.LocationPermissionHelper\nimport com.mapbox.maps.testapp.utils.SimulateRouteLocationProvider\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.lang.ref.WeakReference\nimport kotlin.random.Random\n\n/**\n * Showcase customise 3D location puck and animating the model parts, e.g. the wheel rotation, lights\n * on/off etc.\n *\n * Please note the model part override ids are corresponding to the specific 3d model, please update\n * according to your own model when using these API.\n */\n@OptIn(MapboxExperimental::class)\nclass LocationComponentModelAnimationActivity : AppCompatActivity() {\n  private var loadingJob: Job? = null\n\n  private lateinit var locationPermissionHelper: LocationPermissionHelper\n  private val onIndicatorPositionChangedListener = OnIndicatorPositionChangedListener {\n    // Jump to the current indicator position\n    binding.mapView.mapboxMap.setCamera(CameraOptions.Builder().center(it).build())\n    // Set the gestures plugin's focal point to the current indicator location.\n    binding.mapView.gestures.focalPoint = binding.mapView.mapboxMap.pixelForCoordinate(it)\n  }\n  private lateinit var binding: ActivityLocationComponentBinding\n\n  // Create overridable model node parts\n  private val hood = OpenableNode(\n    nodeOverride = MODEL_HOOD_ID,\n    openRotation = listOf(DEFAULT_OPEN_DEGREES, 0.0, 0.0)\n  )\n  private val trunk = OpenableNode(\n    nodeOverride = MODEL_TRUNK_ID,\n    openRotation = listOf(-DEFAULT_OPEN_DEGREES, 0.0, 0.0)\n  )\n  private val frontLeftDoor = OpenableNode(\n    nodeOverride = MODEL_FRONT_LEFT_DOOR_ID,\n    openRotation = listOf(0.0, -DEFAULT_OPEN_DEGREES, 0.0)\n  )\n  private val frontRightDoor = OpenableNode(\n    nodeOverride = MODEL_FRONT_RIGHT_DOOR_ID,\n    openRotation = listOf(0.0, DEFAULT_OPEN_DEGREES, 0.0)\n  )\n  private val backLeftDoor = OpenableNode(\n    nodeOverride = MODEL_BACK_LEFT_DOOR_ID,\n    openRotation = listOf(0.0, -DEFAULT_OPEN_DEGREES, 0.0)\n  )\n  private val backRightDoor = OpenableNode(\n    nodeOverride = MODEL_BACK_RIGHT_DOOR_ID,\n    openRotation = listOf(0.0, DEFAULT_OPEN_DEGREES, 0.0)\n  )\n  private val frontLeftWheel = WheelNode(nodeOverride = MODEL_FRONT_LEFT_WHEEL_ID)\n  private val frontRightWheel = WheelNode(nodeOverride = MODEL_FRONT_RIGHT_WHEEL_ID)\n  private val backLeftWheel = WheelNode(nodeOverride = MODEL_BACK_LEFT_WHEEL_ID)\n  private val backRightWheel = WheelNode(nodeOverride = MODEL_BACK_RIGHT_WHEEL_ID)\n\n  // Create overridable model material parts\n  private val frontLight: List<BaseLightMaterialPart> = listOf(\n    BaseLightMaterialPart(\n      materialOverride = MODEL_FRONT_LIGHT_ID,\n      lightOnColor = Color.argb(255, 225, 225, 225),\n      lightOffColor = Color.argb(255, 120, 120, 120)\n    ),\n    BaseLightVolume(\n      materialOverride = MODEL_FRONT_LIGHT_VOLUME_ID,\n      lightOnColor = Color.argb(255, 225, 225, 225),\n      lightOffColor = Color.argb(255, 120, 120, 120)\n    )\n  )\n  private val brakesLights: List<BaseLightMaterialPart> = listOf(\n    BaseLightMaterialPart(\n      featureStateId = \"lights_brakes\",\n      materialOverrides = listOf(\n        MODEL_BRAKES_LIGHT_ID,\n        MODEL_BRAKES_LIGHT_REVERSE_ID\n      ),\n      lightOnColor = Color.argb(255, 225, 0, 0),\n      lightOffColor = Color.argb(255, 120, 0, 0)\n    ),\n    BaseLightVolume(\n      featureStateId = \"lights_brakes_volume\",\n      materialOverrides = listOf(\n        MODEL_BRAKES_LIGHT_VOLUME_ID,\n        MODEL_BRAKES_LIGHT_REVERSE_VOLUME_ID\n      ),\n      lightOnColor = Color.argb(255, 225, 0, 0),\n      lightOffColor = Color.argb(255, 120, 0, 0)\n    )\n  )\n  private val leftTurnLights: List<BlinkerMaterialPart> = listOf(\n    BlinkerMaterialPart(\n      featureStateId = \"indicator-light-left\",\n      materialOverrides = listOf(\n        MODEL_FRONT_LEFT_TURN_LIGHT_ID,\n        MODEL_BRAKE_LEFT_TURN_LIGHT_ID,\n      ),\n      lightOnColor = Color.argb(255, 250, 155, 0),\n      lightOffColor = Color.argb(255, 160, 120, 0)\n    ),\n    BlinkerVolume(\n      featureStateId = \"indicator-light-left_volume\",\n      materialOverrides = listOf(\n        MODEL_FRONT_LEFT_TURN_LIGHT_VOLUME_ID,\n        MODEL_BRAKE_LEFT_TURN_LIGHT_VOLUME_ID,\n        MODEL_LEFT_TURN_LIGHT_VOLUME_ID\n      ),\n      lightOnColor = Color.argb(255, 250, 155, 0),\n      lightOffColor = Color.argb(255, 160, 120, 0)\n    )\n  )\n  private val rightTurnLights: List<BlinkerMaterialPart> = listOf(\n    BlinkerMaterialPart(\n      featureStateId = \"indicator-light-right\",\n      materialOverrides = listOf(\n        MODEL_FRONT_RIGHT_TURN_LIGHT_ID,\n        MODEL_BRAKE_RIGHT_TURN_LIGHT_ID\n      ),\n      lightOnColor = Color.argb(255, 250, 155, 0),\n      lightOffColor = Color.argb(255, 160, 120, 0)\n    ),\n    BlinkerVolume(\n      featureStateId = \"indicator-light-right_volume\",\n      materialOverrides = listOf(\n        MODEL_FRONT_RIGHT_TURN_LIGHT_VOLUME_ID,\n        MODEL_BRAKE_RIGHT_TURN_LIGHT_VOLUME_ID,\n        MODEL_RIGHT_TURN_LIGHT_VOLUME_ID\n      ),\n      lightOnColor = Color.argb(255, 250, 155, 0),\n      lightOffColor = Color.argb(255, 160, 120, 0)\n    )\n  )\n  private val body = ModelMaterialPart(\n    materialOverride = MODEL_BODY_ID\n  )\n  private val modelParts = listOf(\n    // node part overrides\n    hood,\n    trunk,\n    frontLeftWheel,\n    frontRightWheel,\n    backLeftWheel,\n    backRightWheel,\n    frontLeftDoor,\n    frontRightDoor,\n    backLeftDoor,\n    backRightDoor,\n    // material part override for body\n    body\n  ) + listOf(\n    // material parts overrides for lights\n    brakesLights,\n    frontLight,\n    leftTurnLights,\n    rightTurnLights,\n  ).flatten()\n\n  private val carModel by lazy {\n    binding.mapView.location.createAnimatableModel(\n      modelUri = MODEL_URI,\n      modelParts = modelParts\n    )\n  }\n\n  private var lastBearing: Double? = null\n\n  override fun onCreateOptionsMenu(menu: Menu?): Boolean {\n    menuInflater.inflate(R.menu.menu_location_component_model_customisation, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    when (item.itemId) {\n      R.id.action_hood -> {\n        hood.opened = !hood.opened\n        return true\n      }\n\n      R.id.action_trunk -> {\n        trunk.opened = !trunk.opened\n        return true\n      }\n\n      R.id.action_doorsFrontLeft -> {\n        frontLeftDoor.opened = !frontLeftDoor.opened\n        return true\n      }\n\n      R.id.action_doorsFrontRight -> {\n        frontRightDoor.opened = !frontRightDoor.opened\n        return true\n      }\n\n      R.id.action_doorsBackLeft -> {\n        backLeftDoor.opened = !backLeftDoor.opened\n        return true\n      }\n\n      R.id.action_doorsBackRight -> {\n        backRightDoor.opened = !backRightDoor.opened\n        return true\n      }\n\n      R.id.action_headlights -> {\n        val lightsOn = !frontLight.first().lightsOnOffState\n        frontLight.forEach { it.lightsOnOffState = lightsOn }\n        return true\n      }\n\n      R.id.action_breaking -> {\n        val lightsOn = !brakesLights.first().lightsOnOffState\n        brakesLights.forEach { it.lightsOnOffState = lightsOn }\n        return true\n      }\n\n      R.id.action_indicatorLeft -> {\n        val blinkerOn = !leftTurnLights.first().blinkerOn\n        leftTurnLights.forEach { it.blinkerOn = blinkerOn }\n        return true\n      }\n\n      R.id.action_indicatorRight -> {\n        val blinkerOn = !rightTurnLights.first().blinkerOn\n        rightTurnLights.forEach { it.blinkerOn = blinkerOn }\n        return true\n      }\n\n      R.id.action_rotate_wheels -> {\n        val rotationSpeed = 1.0 // 1 rotation per second\n        val forwardRotation = WheelNode.Rotation.ForwardRotation(rotationSpeed)\n        val backwardRotation = WheelNode.Rotation.BackwardRotation(rotationSpeed)\n        when (frontLeftWheel.wheelRotation) {\n          is WheelNode.Rotation.BackwardRotation -> {\n            frontLeftWheel.wheelRotation = WheelNode.Rotation.Stopped\n            frontRightWheel.wheelRotation = WheelNode.Rotation.Stopped\n            backLeftWheel.wheelRotation = WheelNode.Rotation.Stopped\n            backRightWheel.wheelRotation = WheelNode.Rotation.Stopped\n          }\n\n          is WheelNode.Rotation.ForwardRotation -> {\n            frontLeftWheel.wheelRotation = backwardRotation\n            frontRightWheel.wheelRotation = backwardRotation\n            backLeftWheel.wheelRotation = backwardRotation\n            backRightWheel.wheelRotation = backwardRotation\n          }\n\n          WheelNode.Rotation.Stopped -> {\n            frontLeftWheel.wheelRotation = forwardRotation\n            frontRightWheel.wheelRotation = forwardRotation\n            backLeftWheel.wheelRotation = forwardRotation\n            backRightWheel.wheelRotation = forwardRotation\n          }\n        }\n        return true\n      }\n\n      R.id.action_body_color -> {\n        body.updateColor(generateRandomColor())\n        return true\n      }\n\n      R.id.action_simulate_route -> {\n        if (binding.mapView.location.getLocationProvider() is DefaultLocationProvider) {\n          loadingJob?.cancel()\n          loadingJob = lifecycleScope.launch {\n            val routePoints = withContext(Dispatchers.Default) {\n              LineString.fromPolyline(\n                DirectionsResponse.fromJson(\n                  AnnotationUtils.loadStringFromAssets(\n                    this@LocationComponentModelAnimationActivity,\n                    NAVIGATION_ROUTE_JSON_NAME\n                  )\n                ).routes()[0].geometry()!!,\n                Constants.PRECISION_6\n              )\n            }\n            val simulateRouteLocationProvider = SimulateRouteLocationProvider(route = routePoints)\n            binding.mapView.location.setLocationProvider(simulateRouteLocationProvider)\n          }\n        } else {\n          binding.mapView.location.setLocationProvider(DefaultLocationProvider(this))\n        }\n\n        return true\n      }\n\n      else -> return super.onOptionsItemSelected(item)\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityLocationComponentBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    locationPermissionHelper = LocationPermissionHelper(WeakReference(this))\n    locationPermissionHelper.checkPermissions {\n      binding.mapView.apply {\n        mapboxMap.loadStyle(Style.STANDARD) {\n          mapboxMap.setCamera(\n            cameraOptions {\n              pitch(60.0)\n              zoom(14.0)\n            }\n          )\n          // Disable scroll gesture, since we are updating the camera position based on the indicator location.\n          gestures.scrollEnabled = false\n          gestures.addOnMapClickListener { point ->\n            location\n              .isLocatedAt(point) { isPuckLocatedAtPoint ->\n                if (isPuckLocatedAtPoint) {\n                  Toast.makeText(context, \"Clicked on location puck\", Toast.LENGTH_SHORT).show()\n                }\n              }\n            true\n          }\n          gestures.addOnMapLongClickListener { point ->\n            location.isLocatedAt(point) { isPuckLocatedAtPoint ->\n              if (isPuckLocatedAtPoint) {\n                Toast.makeText(context, \"Long-clicked on location puck\", Toast.LENGTH_SHORT)\n                  .show()\n              }\n            }\n            true\n          }\n          val locationProvider = location.getLocationProvider() as DefaultLocationProvider\n          locationProvider.addOnCompassCalibrationListener {\n            Toast.makeText(context, \"Compass needs to be calibrated\", Toast.LENGTH_LONG).show()\n          }\n          setupLocationComponent()\n        }\n      }\n    }\n  }\n\n  private fun setupLocationComponent() {\n    binding.mapView.location.updateSettings {\n      enabled = true\n      locationPuck = carModel.getLocationPuck3D().copy(modelScale = listOf(70f, 70f, 70f))\n      puckBearingEnabled = true\n      puckBearing = PuckBearing.COURSE\n    }\n    // setup the initial 3D model wheels rotation\n    val forwardRotation = WheelNode.Rotation.ForwardRotation(1.0)\n    frontLeftWheel.wheelRotation = forwardRotation\n    frontRightWheel.wheelRotation = forwardRotation\n    backLeftWheel.wheelRotation = forwardRotation\n    backRightWheel.wheelRotation = forwardRotation\n    // Setup the lights\n    frontLight.forEach { it.lightsOnOffState = true }\n    brakesLights.forEach { it.lightsOnOffState = true }\n    rightTurnLights.forEach { it.blinkerOn = false }\n    leftTurnLights.forEach { it.blinkerOn = false }\n\n    binding.mapView.location.addOnIndicatorBearingChangedListener { bearing ->\n      // Adjust wheel direction based on bearing changes.\n      lastBearing?.let {\n        val scaleFactor = 60.0 // assuming animator is interpolated at 60 fps\n        val diff = (it - bearing) * scaleFactor\n        frontLeftWheel.wheelDirection = diff\n        frontRightWheel.wheelDirection = diff\n        if (diff > 40.0) {\n          leftTurnLights.forEach { it.blinkForThreeSecond() }\n          rightTurnLights.forEach { it.blinkerOn = false }\n        } else if (diff < -40.0) {\n          rightTurnLights.forEach { it.blinkForThreeSecond() }\n          leftTurnLights.forEach { it.blinkerOn = false }\n        }\n      }\n      lastBearing = bearing\n    }\n  }\n\n  override fun onRequestPermissionsResult(\n    requestCode: Int,\n    permissions: Array<String>,\n    grantResults: IntArray\n  ) {\n    super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n    locationPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults)\n  }\n\n  override fun onStart() {\n    super.onStart()\n    binding.mapView.location\n      .addOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n  }\n\n  override fun onStop() {\n    super.onStop()\n    binding.mapView.location\n      .removeOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    modelParts.filterIsInstance<AnimatablePart>().forEach { it.cleanUpAnimator() }\n  }\n\n  private companion object {\n    private const val NAVIGATION_ROUTE_JSON_NAME = \"navigation_route.json\"\n    private fun generateRandomColor(): Int {\n      val rnd = Random.Default\n      return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))\n    }\n\n    private const val MODEL_URI = \"asset://ego_car.glb\"\n\n    // IDs associated with the model\n    // Model node override IDs\n    private const val MODEL_HOOD_ID = \"hood\"\n    private const val MODEL_TRUNK_ID = \"trunk\"\n    private const val MODEL_FRONT_LEFT_DOOR_ID = \"doors_front-left\"\n    private const val MODEL_FRONT_RIGHT_DOOR_ID = \"doors_front-right\"\n    private const val MODEL_BACK_LEFT_DOOR_ID = \"doors_back-left\"\n    private const val MODEL_BACK_RIGHT_DOOR_ID = \"doors_back-right\"\n    private const val MODEL_FRONT_LEFT_WHEEL_ID = \"wheels_front-left\"\n    private const val MODEL_FRONT_RIGHT_WHEEL_ID = \"wheels_front-right\"\n    private const val MODEL_BACK_LEFT_WHEEL_ID = \"wheels_back-left\"\n    private const val MODEL_BACK_RIGHT_WHEEL_ID = \"wheels_back-right\"\n\n    // Model material override IDs\n    private const val MODEL_FRONT_LIGHT_ID = \"lights_front\"\n    private const val MODEL_FRONT_LIGHT_VOLUME_ID = \"lights_front_volume\"\n    private const val MODEL_BRAKES_LIGHT_ID = \"lights_brakes\"\n    private const val MODEL_BRAKES_LIGHT_VOLUME_ID = \"lights_brakes_volume\"\n    private const val MODEL_BRAKES_LIGHT_REVERSE_ID = \"lights-brakes_reverse\"\n    private const val MODEL_BRAKES_LIGHT_REVERSE_VOLUME_ID = \"lights-brakes_reverse_volume\"\n    private const val MODEL_FRONT_LEFT_TURN_LIGHT_ID = \"lights-front_turn-left\"\n    private const val MODEL_FRONT_LEFT_TURN_LIGHT_VOLUME_ID = \"lights-front_turn-left_volume\"\n    private const val MODEL_BRAKE_LEFT_TURN_LIGHT_ID = \"lights-brakes_turn-left\"\n    private const val MODEL_BRAKE_LEFT_TURN_LIGHT_VOLUME_ID = \"lights-brakes_turn-left_volume\"\n    private const val MODEL_LEFT_TURN_LIGHT_VOLUME_ID = \"lights_turn-left_volume\"\n    private const val MODEL_FRONT_RIGHT_TURN_LIGHT_ID = \"lights-front_turn-right\"\n    private const val MODEL_FRONT_RIGHT_TURN_LIGHT_VOLUME_ID = \"lights-front_turn-right_volume\"\n    private const val MODEL_BRAKE_RIGHT_TURN_LIGHT_ID = \"lights-brakes_turn-right\"\n    private const val MODEL_BRAKE_RIGHT_TURN_LIGHT_VOLUME_ID = \"lights-brakes_turn-right_volume\"\n    private const val MODEL_RIGHT_TURN_LIGHT_VOLUME_ID = \"lights_turn-right_volume\"\n    private const val MODEL_BODY_ID = \"body\"\n  }\n}\n\n/**\n * The part is driven by an animator, so we will need to clean up the animator when the activity is destroyed.\n */\ninterface AnimatablePart {\n  /**\n   * Clean up the animator.\n   */\n  fun cleanUpAnimator()\n}\n\n// Node overrides\n/**\n * A [ModelNodePart] that represents a car wheel, additional animators are introduced\n * here to animate the rotation of the wheel based on the car's status.\n *\n * @param nodeOverride the node id to override\n */\n@MapboxExperimental\nclass WheelNode(nodeOverride: String) : ModelNodePart(nodeOverride), AnimatablePart {\n  private var currentWheelRotation: Double = 0.0\n  private val animator = ValueAnimator().apply {\n    setObjectValues(360f, 0f)\n    addUpdateListener {\n      currentWheelRotation = (it.animatedValue as Float).toDouble()\n      rotation = listOf(currentWheelRotation, wheelDirection, 0.0)\n    }\n    interpolator = LinearInterpolator()\n    repeatCount = ValueAnimator.INFINITE\n    repeatMode = ValueAnimator.RESTART\n    start()\n    pause()\n  }\n\n  /**\n   * The wheel's rotation status.\n   */\n  sealed class Rotation {\n    /**\n     * Wheel will rotate forward simulating driving forward\n     *\n     * @param speed rotations per second\n     */\n    class ForwardRotation(val speed: Double) : Rotation()\n\n    /**\n     * Wheel will rotate backward simulating driving backward\n     *\n     * @param speed rotations per second\n     */\n    class BackwardRotation(val speed: Double) : Rotation()\n\n    /**\n     * No rotation\n     */\n    object Stopped : Rotation()\n  }\n\n  /**\n   * The rotation of the wheel.\n   */\n  var wheelRotation: Rotation = Rotation.Stopped\n    set(value) {\n      field = value\n      when (value) {\n        is Rotation.BackwardRotation -> {\n          animator.setObjectValues(0f, 360f)\n          animator.duration = (1000.0 / value.speed).toLong()\n          animator.resume()\n        }\n\n        is Rotation.ForwardRotation -> {\n          animator.setObjectValues(360f, 0f)\n          animator.duration = (1000.0 / value.speed).toLong()\n          animator.resume()\n        }\n\n        Rotation.Stopped -> animator.pause()\n      }\n    }\n  var wheelDirection: Double = 0.0\n    set(value) {\n      field = value.coerceIn(-MAX_WHEEL_ROTATION_DEGREES, MAX_WHEEL_ROTATION_DEGREES)\n      rotation = listOf(currentWheelRotation, field, 0.0)\n    }\n\n  override fun cleanUpAnimator() {\n    animator.cancel()\n  }\n\n  companion object {\n    private const val MAX_WHEEL_ROTATION_DEGREES = 60.0\n  }\n}\n\n/**\n * A [ModelNodePart] that is openable, meaning a [opened] state is available to switch between two\n * rotation states.\n *\n * @param nodeOverride the node id to override\n * @param openRotation the rotation(a list rotation around x, y and z axis in degrees) when the [opened] state is true.\n */\n@MapboxExperimental\nclass OpenableNode(nodeOverride: String, private val openRotation: List<Double>) :\n  ModelNodePart(nodeOverride) {\n  private val defaultRotation = listOf(0.0, 0.0, 0.0)\n\n  /**\n   * Whether the node is opened or not.\n   */\n  var opened: Boolean = false\n    set(value) {\n      field = value\n      if (value) {\n        rotation = listOf(openRotation[0], openRotation[1], openRotation[2])\n      } else {\n        rotation = listOf(defaultRotation[0], defaultRotation[1], defaultRotation[2])\n      }\n    }\n\n  companion object {\n    const val DEFAULT_OPEN_DEGREES = 60.0\n  }\n}\n\n// Material overrides\n/**\n * A [ModelMaterialPart] that presents a light.\n *\n * @param featureStateId the feature state id to customise this part\n * @param materialOverrides the material ids to override\n * @param lightOnColor the color of the light when [lightsOnOffState] is true\n * @param lightOffColor the color of the light when [lightsOnOffState] is false\n */\n@MapboxExperimental\nopen class BaseLightMaterialPart(\n  featureStateId: String,\n  materialOverrides: List<String>,\n  private val lightOnColor: Int = Color.argb(255, 225, 225, 225),\n  private val lightOffColor: Int = Color.argb(255, 120, 0, 0)\n) : ModelMaterialPart(featureStateId, materialOverrides) {\n  /**\n   * A [ModelMaterialPart] that presents a light.\n   *\n   * @param materialOverride the material id to override\n   * @param lightOnColor the color of the light when [lightsOnOffState] is true\n   * @param lightOffColor the color of the light when [lightsOnOffState] is false\n   */\n  constructor(\n    materialOverride: String,\n    lightOnColor: Int = Color.argb(255, 225, 225, 225),\n    lightOffColor: Int = Color.argb(255, 120, 0, 0)\n  ) : this(\n    featureStateId = materialOverride,\n    materialOverrides = listOf(materialOverride),\n    lightOnColor = lightOnColor,\n    lightOffColor = lightOffColor\n  )\n\n  /**\n   * Whether the light is on or off.\n   */\n  var lightsOnOffState: Boolean = false\n    set(value) {\n      field = value\n      updateLight(value)\n    }\n\n  open fun updateLight(on: Boolean) {\n    if (on) {\n      updateColor(lightOnColor)\n      emissiveStrength = 0.8\n    } else {\n      updateColor(lightOffColor)\n      emissiveStrength = 0.0\n    }\n  }\n}\n\n/**\n * A [ModelMaterialPart] that presents a light volume to show bloom effect.\n *\n * @param featureStateId the feature state id to customise this part\n * @param materialOverrides the material ids to override\n * @param lightOnColor the color of the light when [lightsOnOffState] is true\n * @param lightOffColor the color of the light when [lightsOnOffState] is false\n */\n@MapboxExperimental\nclass BaseLightVolume(\n  featureStateId: String,\n  materialOverrides: List<String>,\n  lightOnColor: Int = Color.argb(255, 225, 225, 225),\n  lightOffColor: Int = Color.argb(255, 120, 0, 0)\n) : BaseLightMaterialPart(\n  featureStateId, materialOverrides, lightOnColor, lightOffColor\n) {\n  /**\n   * A [ModelMaterialPart] that presents a light volume to show bloom effect.\n   *\n   * @param materialOverride the material id to override\n   * @param lightOnColor the color of the light when [lightsOnOffState] is true\n   * @param lightOffColor the color of the light when [lightsOnOffState] is false\n   */\n  constructor(\n    materialOverride: String,\n    lightOnColor: Int = Color.argb(255, 225, 225, 225),\n    lightOffColor: Int = Color.argb(255, 120, 0, 0)\n  ) : this(\n    featureStateId = materialOverride,\n    materialOverrides = listOf(materialOverride),\n    lightOnColor = lightOnColor,\n    lightOffColor = lightOffColor\n  )\n\n  override fun updateLight(on: Boolean) {\n    super.updateLight(on)\n    // update bloom effect\n    opacity = if (on) 1.0 else 0.0\n  }\n}\n\n/**\n * A [ModelMaterialPart] that presents a light.\n *\n * @param featureStateId the feature state id to customise this part\n * @param materialOverrides the material ids to override\n * @param lightOnColor the color of the light when [blinkerOn] is true\n * @param lightOffColor the color of the light when [blinkerOn] is false\n */\n@MapboxExperimental\nopen class BlinkerMaterialPart(\n  featureStateId: String,\n  materialOverrides: List<String> = listOf(featureStateId),\n  private val lightOnColor: Int = Color.argb(255, 250, 155, 0),\n  private val lightOffColor: Int = Color.argb(255, 160, 120, 0)\n) : ModelMaterialPart(featureStateId, materialOverrides), AnimatablePart {\n  private val countdownTimer = object : CountDownTimer(3000, 1000) {\n    override fun onTick(p0: Long) {\n    }\n\n    override fun onFinish() {\n      blinkerOn = false\n    }\n  }\n  private val animator = ValueAnimator().apply {\n    setObjectValues(1f, 0f)\n    addUpdateListener {\n      onAnimatedValueUpdated(it.animatedValue as Float)\n    }\n    duration = 1000\n    interpolator = LinearInterpolator()\n    repeatCount = ValueAnimator.INFINITE\n    repeatMode = ValueAnimator.RESTART\n  }\n\n  open fun onAnimatedValueUpdated(animatedValue: Float) {\n    if (animatedValue > 0.5f) {\n      updateColor(lightOnColor)\n    } else {\n      updateColor(lightOffColor)\n    }\n    emissiveStrength = animatedValue.toDouble()\n  }\n\n  open fun onBlinkerOff() {\n    animator.cancel()\n    updateColor(lightOffColor)\n    emissiveStrength = 0.0\n  }\n\n  /**\n   * Whether the blinker is on or off.\n   */\n  var blinkerOn: Boolean = false\n    set(value) {\n      field = value\n      if (value) {\n        animator.start()\n      } else {\n        onBlinkerOff()\n      }\n    }\n\n  /**\n   * Blink the lights for 3 seconds.\n   */\n  fun blinkForThreeSecond() {\n    countdownTimer.cancel()\n    countdownTimer.start()\n    blinkerOn = true\n  }\n\n  override fun cleanUpAnimator() {\n    animator.cancel()\n  }\n}\n\n/**\n * A [ModelMaterialPart] that presents a light volume for blinker, the volume is used to render the\n * bloom effect of the blinker.\n *\n * @param featureStateId the feature state id to customise this part\n * @param materialOverrides the material ids to override\n * @param lightOnColor the color of the light when [blinkerOn] is true\n * @param lightOffColor the color of the light when [blinkerOn] is false\n */\n@MapboxExperimental\nclass BlinkerVolume(\n  featureStateId: String,\n  materialOverrides: List<String> = listOf(featureStateId),\n  lightOnColor: Int = Color.argb(255, 250, 155, 0),\n  lightOffColor: Int = Color.argb(255, 160, 120, 0)\n) : BlinkerMaterialPart(\n  featureStateId, materialOverrides, lightOnColor, lightOffColor\n) {\n  override fun onAnimatedValueUpdated(animatedValue: Float) {\n    super.onAnimatedValueUpdated(animatedValue)\n    // Update bloom effect\n    opacity = if (animatedValue > 0.5f) {\n      1.0\n    } else {\n      0.0\n    }\n  }\n\n  override fun onBlinkerOff() {\n    super.onBlinkerOff()\n    opacity = 0.0\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/LocationTrackingActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.gestures.OnMoveListener\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.utils.LocationPermissionHelper\nimport java.lang.ref.WeakReference\n\n/**\n * Tracks the user location on screen, simulates a navigation session.\n */\nclass LocationTrackingActivity : AppCompatActivity() {\n\n  private lateinit var locationPermissionHelper: LocationPermissionHelper\n\n  private val onIndicatorBearingChangedListener = OnIndicatorBearingChangedListener {\n    mapView.mapboxMap.setCamera(CameraOptions.Builder().bearing(it).build())\n  }\n\n  private val onIndicatorPositionChangedListener = OnIndicatorPositionChangedListener {\n    mapView.mapboxMap.setCamera(CameraOptions.Builder().center(it).build())\n    mapView.gestures.focalPoint = mapView.mapboxMap.pixelForCoordinate(it)\n  }\n\n  private val onMoveListener = object : OnMoveListener {\n    override fun onMoveBegin(detector: MoveGestureDetector) {\n      onCameraTrackingDismissed()\n    }\n\n    override fun onMove(detector: MoveGestureDetector): Boolean {\n      return false\n    }\n\n    override fun onMoveEnd(detector: MoveGestureDetector) {}\n  }\n  private lateinit var mapView: MapView\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    mapView = MapView(this)\n    setContentView(mapView)\n    locationPermissionHelper = LocationPermissionHelper(WeakReference(this))\n    locationPermissionHelper.checkPermissions {\n      onMapReady()\n    }\n  }\n\n  private fun onMapReady() {\n    mapView.mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .zoom(14.0)\n        .build()\n    )\n    mapView.mapboxMap.loadStyle(\n      Style.STANDARD\n    ) {\n      initLocationComponent()\n      setupGesturesListener()\n    }\n  }\n\n  private fun setupGesturesListener() {\n    mapView.gestures.addOnMoveListener(onMoveListener)\n  }\n\n  private fun initLocationComponent() {\n    val locationComponentPlugin = mapView.location\n    locationComponentPlugin.updateSettings {\n      puckBearing = PuckBearing.COURSE\n      puckBearingEnabled = true\n      enabled = true\n      locationPuck = LocationPuck2D(\n        bearingImage = ImageHolder.from(R.drawable.mapbox_user_puck_icon),\n        shadowImage = ImageHolder.from(R.drawable.mapbox_user_icon_shadow),\n        scaleExpression = interpolate {\n          linear()\n          zoom()\n          stop {\n            literal(0.0)\n            literal(0.6)\n          }\n          stop {\n            literal(20.0)\n            literal(1.0)\n          }\n        }.toJson()\n      )\n    }\n    locationComponentPlugin.addOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n    locationComponentPlugin.addOnIndicatorBearingChangedListener(onIndicatorBearingChangedListener)\n  }\n\n  private fun onCameraTrackingDismissed() {\n    Toast.makeText(this, \"onCameraTrackingDismissed\", Toast.LENGTH_SHORT).show()\n    mapView.location\n      .removeOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n    mapView.location\n      .removeOnIndicatorBearingChangedListener(onIndicatorBearingChangedListener)\n    mapView.gestures.removeOnMoveListener(onMoveListener)\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    mapView.location\n      .removeOnIndicatorBearingChangedListener(onIndicatorBearingChangedListener)\n    mapView.location\n      .removeOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n    mapView.gestures.removeOnMoveListener(onMoveListener)\n  }\n\n  override fun onRequestPermissionsResult(\n    requestCode: Int,\n    permissions: Array<String>,\n    grantResults: IntArray\n  ) {\n    super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n    locationPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/MapOverlayActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.addOnMapClickListener\nimport com.mapbox.maps.plugin.overlay.MapOverlayCoordinatesProvider\nimport com.mapbox.maps.plugin.overlay.MapOverlayPlugin\nimport com.mapbox.maps.plugin.overlay.mapboxOverlay\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityMapOverlayBinding\n\nclass MapOverlayActivity : AppCompatActivity(), OnMapClickListener {\n\n  private val markerCoordinates = mutableListOf<Point>(\n    Point.fromLngLat(-71.065634, 42.354950), // Boston Common Park\n    Point.fromLngLat(-71.097293, 42.346645), // Fenway Park\n    Point.fromLngLat(-71.053694, 42.363725) // The Paul Revere House\n  )\n  private lateinit var mapOverlayPlugin: MapOverlayPlugin\n  private lateinit var mapboxMap: MapboxMap\n  private val provider = MapOverlayCoordinatesProvider { markerCoordinates }\n  private lateinit var binding: ActivityMapOverlayBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityMapOverlayBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(\n      styleExtension = style(Style.STANDARD) {\n        +geoJsonSource(sourceId) {\n          featureCollection(\n            FeatureCollection.fromFeatures(\n              markerCoordinates.map {\n                Feature.fromGeometry(it)\n              }\n            )\n          )\n        }\n        // Add the marker image to map\n        +image(\n          imageId,\n          ContextCompat.getDrawable(\n            this@MapOverlayActivity,\n            R.drawable.ic_blue_marker\n          )!!.toBitmap()\n        )\n        +symbolLayer(layerId, sourceId) {\n          iconImage(imageId)\n          iconAllowOverlap(true)\n          iconOffset(listOf(0.0, -9.0))\n        }\n      }\n    ) {\n      mapboxMap.addOnMapClickListener(this@MapOverlayActivity)\n      mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n    mapOverlayPlugin = binding.mapView.mapboxOverlay\n      .apply {\n        registerMapOverlayCoordinatesProvider(provider)\n        registerOverlay(binding.locationTopLeft)\n        registerOverlay(binding.locationTopRight)\n        registerOverlay(binding.locationBottomLeft)\n        registerOverlay(binding.locationBottomRight)\n        registerOverlay(binding.reframeButton)\n        setDisplayingAreaMargins(100, 50, 50, 50)\n      }\n\n    val cameraAnimationsPlugin = binding.mapView.camera\n    binding.reframeButton.setOnClickListener {\n      mapOverlayPlugin.reframe { it?.let { cameraAnimationsPlugin.flyTo(it, mapAnimationOptions { duration(1000L) }) } }\n    }\n  }\n\n  override fun onMapClick(point: Point): Boolean {\n    markerCoordinates.add(point)\n    mapboxMap.style?.getSourceAs<GeoJsonSource>(sourceId)!!.featureCollection(\n      FeatureCollection.fromFeatures(\n        markerCoordinates.map {\n          Feature.fromGeometry(it)\n        }\n      )\n    )\n    return true\n  }\n\n  companion object {\n    private const val sourceId = \"marker-source\"\n    private const val imageId = \"marker-image\"\n    private const val layerId = \"marker-layer\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/MapViewCustomizationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport android.widget.LinearLayout\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.common.TileStore\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.ConstrainMode\nimport com.mapbox.maps.GlyphsRasterizationMode\nimport com.mapbox.maps.GlyphsRasterizationOptions\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.TileStoreUsageMode\nimport com.mapbox.maps.applyDefaultParams\nimport com.mapbox.maps.mapsOptions\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_ATTRIBUTION_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_LOGO_PLUGIN_ID\nimport com.mapbox.maps.testapp.databinding.ActivityMapViewCustomizationBinding\n\n/**\n * Example of customizing your [MapView].\n * This example will show how to create [MapView] both programmatically and from xml\n * and apply various options.\n */\nclass MapViewCustomizationActivity : AppCompatActivity() {\n\n  private lateinit var customMapView: MapView\n  // Users should keep a reference to the customised tileStore instance (if there's any)\n  private val tileStore by lazy { TileStore.create() }\n  private lateinit var binding: ActivityMapViewCustomizationBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    val initialTileStore = MapboxOptions.mapsOptions.tileStore\n    val initialTileStoreUsageMode = MapboxOptions.mapsOptions.tileStoreUsageMode\n    // Set tile store and tile store usage mode so that all MapViews created from now on will apply\n    // these settings.\n    MapboxOptions.mapsOptions.tileStore = tileStore\n    MapboxOptions.mapsOptions.tileStoreUsageMode = TileStoreUsageMode.READ_ONLY\n\n    binding = ActivityMapViewCustomizationBinding.inflate(layoutInflater)\n\n    setContentView(binding.root)\n\n    // all options provided in xml file - so we just load style\n    // But you can also add your style to the map layout with xml attribute `app:mapbox_styleUri=\"mapbox://styles/mapbox/standard\"`\n    binding.mapView.mapboxMap.loadStyle(Style.STANDARD)\n    configureMapViewFromCode()\n\n    // Reset to original state\n    MapboxOptions.mapsOptions.tileStore = initialTileStore\n    MapboxOptions.mapsOptions.tileStoreUsageMode = initialTileStoreUsageMode\n  }\n\n  private fun configureMapViewFromCode() {\n    // set map options\n    val mapOptions = MapOptions.Builder().applyDefaultParams(this)\n      .constrainMode(ConstrainMode.HEIGHT_ONLY)\n      .glyphsRasterizationOptions(\n        GlyphsRasterizationOptions.Builder()\n          .rasterizationMode(GlyphsRasterizationMode.IDEOGRAPHS_RASTERIZED_LOCALLY)\n          // Font family is required when the GlyphsRasterizationMode is set to IDEOGRAPHS_RASTERIZED_LOCALLY or ALL_GLYPHS_RASTERIZED_LOCALLY\n          .fontFamily(\"sans-serif\")\n          .build()\n      )\n      .build()\n\n    // plugins configuration\n    val plugins = listOf(\n      Plugin.Mapbox(MAPBOX_LOGO_PLUGIN_ID),\n      Plugin.Mapbox(MAPBOX_ATTRIBUTION_PLUGIN_ID)\n    )\n\n    // Set tile store and tile store usage mode so that all MapViews created from now on will apply\n    // these settings.\n    MapboxOptions.mapsOptions.tileStore = tileStore\n    MapboxOptions.mapsOptions.tileStoreUsageMode = TileStoreUsageMode.DISABLED\n\n    // set initial camera position\n    val initialCameraOptions = CameraOptions.Builder()\n      .center(Point.fromLngLat(-122.4194, 37.7749))\n      .zoom(9.0)\n      .bearing(120.0)\n      .build()\n\n    // set MapInitOptions together with desired style\n    val mapInitOptions =\n      MapInitOptions(this, mapOptions, plugins, initialCameraOptions, true, Style.STANDARD_SATELLITE)\n\n    // create view programmatically and add to root layout\n    customMapView = MapView(this, mapInitOptions)\n    val params = LinearLayout.LayoutParams(\n      LinearLayout.LayoutParams.MATCH_PARENT,\n      0,\n      1.0f\n    )\n    binding.rootLayout.addView(customMapView, params)\n  }\n\n  override fun onStart() {\n    super.onStart()\n    customMapView.onStart()\n  }\n\n  override fun onStop() {\n    super.onStop()\n    customMapView.onStop()\n  }\n\n  override fun onLowMemory() {\n    super.onLowMemory()\n    customMapView.onLowMemory()\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    customMapView.onDestroy()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/MapboxMapRecorderActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMapRecorder\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.mapPlayerOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.flyTo\nimport com.mapbox.maps.plugin.gestures.gestures\n\n/**\n * Showcase how to use [MapboxMapRecorder] to record and replay sessions.\n */\n@OptIn(MapboxExperimental::class)\nclass MapboxMapRecorderActivity : AppCompatActivity() {\n\n  private var activityStopped = false\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    // do not allow panning the map in this activity\n    mapView.gestures.scrollEnabled = false\n    val mapboxMap = mapView.mapboxMap\n    // Make the ``MapboxMapRecorder`` and start the recording\n    val recorder = mapboxMap.createRecorder()\n    recorder.startRecording()\n    mapboxMap.loadStyle(Style.STANDARD) {\n      // Build a new set of CameraOptions for the map to fly to\n      val cameraOptions = cameraOptions {\n        center(Point.fromLngLat(-73.581, 45.4588))\n        zoom(11.0)\n        pitch(35.0)\n      }\n      mapboxMap.flyTo(\n        cameraOptions,\n        mapAnimationOptions { duration(10_000L) },\n        object : AnimatorListenerAdapter() {\n          override fun onAnimationEnd(animation: Animator) {\n            // When the camera animation is complete, stop the map recording\n            val recording = recorder.stopRecording()\n            if (activityStopped) {\n              return\n            }\n            // Replay the camera animation twice at double speed by passing the recorded sequence returned from the stop method\n            logI(TAG, \"Replay started\")\n            recorder.replay(\n              recording,\n              mapPlayerOptions {\n                playbackCount(2)\n                playbackSpeedMultiplier(2.0)\n                avoidPlaybackPauses(false)\n              }\n            ) {\n              logI(TAG, \"Replay ended, state = ${recorder.getPlaybackState()}\")\n            }\n          }\n        }\n      )\n    }\n  }\n\n  override fun onStop() {\n    activityStopped = true\n    // super.onStop will cancel the animation above and call onAnimationEnd\n    super.onStop()\n  }\n\n  private companion object {\n    private const val TAG = \"MapboxMapRecorderActivity\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/MapboxStudioStyleActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.testapp.databinding.ActivityStyleMapboxStudioBinding\n\n/**\n * Example of displaying a custom Mapbox-hosted style, the default style uri is set in layout file.\n */\nclass MapboxStudioStyleActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityStyleMapboxStudioBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/MultiDisplayActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.app.ActivityOptions\nimport android.content.Context\nimport android.content.Intent\nimport android.hardware.display.DisplayManager\nimport android.os.Build\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.flyTo\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityMultiDisplayBinding\n\n/**\n * Example of displaying a map on the second screen.\n *\n * To use this example, you need to attach a second display to your device, or\n * have the simulated secondary display enabled in the developer settings.\n */\nclass MultiDisplayActivity : AppCompatActivity() {\n\n  private lateinit var binding: ActivityMultiDisplayBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityMultiDisplayBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +image(\n          IMAGE_ID,\n          ContextCompat.getDrawable(\n            this@MultiDisplayActivity,\n            R.drawable.ic_red_marker\n          )!!.toBitmap()\n        )\n        +geoJsonSource(SOURCE_ID) {\n          geometry(HELSINKI)\n        }\n        +symbolLayer(LAYER_ID, SOURCE_ID) {\n          iconImage(IMAGE_ID)\n          iconAllowOverlap(true)\n        }\n      }\n    ) {\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"lightPreset\", Value.valueOf(\"night\"))\n    }\n\n    binding.displayOnSecondDisplayButton.setOnClickListener {\n      displayMapInSecondaryScreen()\n    }\n    binding.moveCameraButton.setOnClickListener {\n      moveCamera()\n    }\n  }\n\n  private fun moveCamera() {\n    val cameraOption = CameraOptions.Builder()\n      .center(HELSINKI)\n      .zoom(ZOOM)\n      .build()\n\n    binding.mapView.mapboxMap.flyTo(\n      cameraOption,\n      mapAnimationOptions {\n        duration(DURATION)\n      }\n    )\n  }\n\n  private fun displayMapInSecondaryScreen() {\n    val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager\n    val displays = displayManager.displays\n    if (displays.size > 1) {\n      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n        // Use activity options to select the display screen.\n        val options = ActivityOptions.makeBasic()\n        options.launchDisplayId = displays[1].displayId\n        // To display on the second screen, the intent must be launched using singleTask launchMode.\n        startActivity(\n          Intent(this, SecondaryDisplayActivity::class.java),\n          options.toBundle()\n        )\n      }\n    } else {\n      Toast.makeText(this, \"Second screen not found.\", Toast.LENGTH_SHORT).show()\n    }\n  }\n\n  companion object {\n    private val HELSINKI = Point.fromLngLat(24.9384, 60.1699)\n    private const val ZOOM = 14.0\n    private const val DURATION = 3000L\n    private const val IMAGE_ID = \"test-image\"\n    private const val LAYER_ID = \"symbol-layer-id\"\n    private const val SOURCE_ID = \"source-id\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/MultiMapActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.examples.fragment.MapFragment\n\n/**\n * Example showing using several map views in one activity.\n */\nclass MultiMapActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContentView(R.layout.activity_multi_map)\n    initFragmentStyle(R.id.map1, Style.STANDARD, generateCamera(38.913187, -77.032546, 12.0))\n    initFragmentStyle(R.id.map2, Style.LIGHT, generateCamera(37.775732, -122.413985, 13.0))\n    initFragmentStyle(R.id.map3, Style.STANDARD_SATELLITE, generateCamera(12.97913, 77.59188, 14.0))\n    initFragmentStyle(R.id.map4, Style.DARK, generateCamera(-13.155980, -74.217134, 15.0))\n  }\n\n  private fun initFragmentStyle(\n    fragmentId: Int,\n    styleId: String,\n    cameraOptions: CameraOptions\n  ) {\n    val fragment = supportFragmentManager.findFragmentById(fragmentId) as MapFragment\n    fragment.getMapAsync {\n      it.setCamera(cameraOptions)\n      it.loadStyle(styleId)\n    }\n  }\n\n  private fun generateCamera(lat: Double, lng: Double, zoom: Double): CameraOptions {\n    return CameraOptions.Builder().center(Point.fromLngLat(lng, lat)).zoom(zoom).build()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/NinePatchImageActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.BitmapFactory\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.image.image9Patch\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\n\n/**\n * Example showcasing of adding 9-patch image to style\n * and demonstrating how it works when stretching image.\n */\nclass NinePatchImageActivity : AppCompatActivity() {\n\n  private var appendTextCounter = 1\n  private lateinit var style: Style\n  private lateinit var mapView: MapView\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    mapView = MapView(this)\n    setContentView(mapView)\n    mapView.mapboxMap.loadStyle(\n      styleExtension = style(Style.STANDARD) {\n        +image9Patch(\n          NINE_PATCH_ID,\n          BitmapFactory.decodeResource(resources, R.drawable.blue_round_nine)\n        )\n        +geoJsonSource(SOURCE_ID) {\n          feature(Feature.fromGeometry(CENTER))\n        }\n        +symbolLayer(LAYER_ID, SOURCE_ID) {\n          iconImage(NINE_PATCH_ID)\n          // make sure we stretch image both in X and Y\n          iconTextFit(IconTextFit.BOTH)\n          iconTextFitPadding(listOf(5.0, 5.0, 5.0, 5.0))\n          textField(TEXT_BASE)\n        }\n      }\n    ) {\n      style = it\n      updateIconText()\n    }\n    mapView.mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(CENTER)\n        .zoom(ZOOM)\n        .build()\n    )\n  }\n\n  private val runnable = {\n    if (style.isValid()) {\n      val layer = (style.getLayer(LAYER_ID) as SymbolLayer)\n      layer.textField(\"${layer.textField?.getTextAsString()} $TEXT_BASE\")\n      appendTextCounter++\n      if (appendTextCounter.rem(3) == 0) {\n        layer.textField(\"${layer.textField?.getTextAsString()}\\n\")\n      }\n      updateIconText()\n    }\n  }\n\n  // start appending text in a loop, stretching icon in both X and Y\n  private fun updateIconText() {\n    mapView.postDelayed(\n      runnable,\n      TEXT_UPDATE_TIME_MS\n    )\n  }\n\n  override fun onStop() {\n    super.onStop()\n    mapView.removeCallbacks(runnable)\n  }\n  companion object {\n    private const val NINE_PATCH_ID = \"red\"\n    private const val SOURCE_ID = \"source_id\"\n    private const val LAYER_ID = \"layer_id\"\n    private val CENTER = Point.fromLngLat(12.554729, 55.70651)\n    private const val ZOOM = 9.0\n    private const val TEXT_BASE = \"Hi!\"\n    private const val TEXT_UPDATE_TIME_MS = 1500L\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/OfflineActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.annotation.SuppressLint\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.Cancelable\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.common.NetworkRestriction\nimport com.mapbox.common.OfflineSwitch\nimport com.mapbox.common.TileRegionLoadOptions\nimport com.mapbox.common.TileStore\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.GlyphsRasterizationMode\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.OfflineManager\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.StylePackLoadOptions\nimport com.mapbox.maps.TilesetDescriptorOptions\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.mapsOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.flyTo\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createCircleAnnotationManager\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityOfflineBinding\nimport kotlinx.coroutines.launch\n\n/**\n * Example app that shows how to use OfflineManager and TileStore to\n * download regions for offline use.\n *\n * Please refer to our [offline guide](https://docs.mapbox.com/android/maps/guides/offline/#limits) for the limitations of the offline usage.\n */\nclass OfflineActivity : AppCompatActivity() {\n  // We use the default tile store\n  private val tileStore: TileStore = MapboxOptions.mapsOptions.tileStore!!\n  private val offlineManager: OfflineManager = OfflineManager()\n  private val offlineLogsAdapter: OfflineLogsAdapter = OfflineLogsAdapter()\n  private lateinit var binding: ActivityOfflineBinding\n  private val cancelables = mutableListOf<Cancelable>()\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityOfflineBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    // Initialize a logger that writes into the recycler view\n    binding.recycler.layoutManager = LinearLayoutManager(this)\n    binding.recycler.adapter = offlineLogsAdapter\n\n    prepareDownloadButton()\n  }\n\n  private fun prepareDownloadButton() {\n    updateButton(\"DOWNLOAD\") {\n      downloadOfflineRegion()\n    }\n  }\n\n  private fun prepareCancelButton() {\n    updateButton(\"CANCEL DOWNLOAD\") {\n      cancelables.forEach { it.cancel() }\n      cancelables.clear()\n      prepareDownloadButton()\n    }\n  }\n\n  private fun prepareViewMapButton() {\n    // Disable network stack, so that the map can only load from downloaded region.\n    OfflineSwitch.getInstance().isMapboxStackConnected = false\n    logInfoMessage(\"Mapbox network stack disabled.\")\n    lifecycleScope.launch {\n      updateButton(\"VIEW STANDARD SATELLITE MAP\") {\n        val context = this@OfflineActivity\n        // create a Mapbox MapView\n        // Note that the MapView will use the current tile store set in MapboxOptions.mapsOptions.tileStore\n        // It must be the same TileStore that is used to create the tile regions. (i.e. the\n        // tileStorePath must be consistent).\n        val mapView = MapView(context, MapInitOptions(context, styleUri = Style.STANDARD_SATELLITE))\n        binding.container.addView(mapView)\n\n        mapView.mapboxMap.setCamera(CameraOptions.Builder().zoom(ZOOM).center(TOKYO).build())\n        // Add a circle annotation to the offline geometry.\n        mapView.annotations.createCircleAnnotationManager().create(\n          CircleAnnotationOptions()\n            .withPoint(TOKYO)\n            .withCircleColor(Color.RED)\n        )\n        prepareViewStandardMapButton(mapView)\n      }\n    }\n  }\n\n  private fun prepareViewStandardMapButton(mapView: MapView) {\n    lifecycleScope.launch {\n      updateButton(\"VIEW STANDARD MAP\") {\n        // Load standard style and animate camera to show 3D buildings.\n        mapView.mapboxMap.loadStyle(Style.STANDARD)\n        mapView.mapboxMap.flyTo(\n          cameraOptions {\n            center(\n              Point.fromLngLat(\n                139.76567069012344,\n                35.68134814430844\n              )\n            )\n            zoom(15.0)\n            bearing(356.1)\n            pitch(59.8)\n          },\n          mapAnimationOptions { duration(1000L) }\n        )\n        prepareShowDownloadedRegionButton()\n      }\n    }\n  }\n\n  private fun prepareShowDownloadedRegionButton() {\n    updateButton(\"SHOW DOWNLOADED REGIONS\") {\n      showDownloadedRegions()\n      prepareRemoveOfflineRegionButton()\n    }\n  }\n\n  private fun prepareRemoveOfflineRegionButton() {\n    updateButton(\"REMOVE DOWNLOADED REGIONS\") {\n      removeOfflineRegions()\n      showDownloadedRegions()\n      binding.container.removeAllViews()\n\n      // Re-enable the Mapbox network stack, so that the new offline region download can succeed.\n      OfflineSwitch.getInstance().isMapboxStackConnected = true\n      logInfoMessage(\"Mapbox network stack enabled.\")\n\n      prepareDownloadButton()\n    }\n  }\n\n  private fun updateButton(text: String, listener: View.OnClickListener) {\n    binding.button.text = text\n    binding.button.setOnClickListener(listener)\n  }\n\n  private fun downloadOfflineRegion() {\n    // 1. Create style package with loadStylePack() call.\n\n    // A style pack (a Style offline package) contains the loaded style and its resources: loaded\n    // sources, fonts, sprites. Style packs are identified with their style URI.\n\n    // Style packs are stored in the disk cache database, but their resources are not subject to\n    // the data eviction algorithm and are not considered when calculating the disk cache size.\n    cancelables.add(\n      offlineManager.loadStylePack(\n        Style.STANDARD_SATELLITE,\n        // Build Style pack load options\n        StylePackLoadOptions.Builder()\n          .glyphsRasterizationMode(GlyphsRasterizationMode.IDEOGRAPHS_RASTERIZED_LOCALLY)\n          .metadata(Value(STYLE_PACK_STANDARD_SATELLITE_METADATA))\n          .build(),\n        { progress ->\n          // Update the download progress to UI\n          updateSatelliteStandardStylePackDownloadProgress(\n            progress.completedResourceCount,\n            progress.requiredResourceCount,\n            \"StylePackLoadProgress: $progress\"\n          )\n        },\n        { expected ->\n          expected.value?.let { stylePack ->\n            // Style pack download finishes successfully\n            logSuccessMessage(\"StylePack downloaded: $stylePack\")\n            if (allResourcesDownloadLoaded()) {\n              prepareViewMapButton()\n            } else {\n              logInfoMessage(\"Waiting for tile region download to be finished.\")\n            }\n          }\n          expected.error?.let {\n            // Handle error occurred during the style pack download.\n            logErrorMessage(\"StylePackError: $it\")\n          }\n        }\n      )\n    )\n\n    // Download standard style pack\n    cancelables.add(\n      offlineManager.loadStylePack(\n        Style.STANDARD,\n        // Build Style pack load options\n        StylePackLoadOptions.Builder()\n          .glyphsRasterizationMode(GlyphsRasterizationMode.IDEOGRAPHS_RASTERIZED_LOCALLY)\n          .metadata(Value(STYLE_PACK_STANDARD_METADATA))\n          .build(),\n        { progress ->\n          // Update the download progress to UI\n          updateStandardStylePackDownloadProgress(\n            progress.completedResourceCount,\n            progress.requiredResourceCount,\n            \"StylePackStandardLoadProgress: $progress\"\n          )\n        },\n        { expected ->\n          expected.value?.let { stylePack ->\n            // Style pack download finishes successfully\n            logSuccessMessage(\"StylePack downloaded: $stylePack\")\n            if (allResourcesDownloadLoaded()) {\n              prepareViewMapButton()\n            } else {\n              logInfoMessage(\"Waiting for tile region download to be finished.\")\n            }\n          }\n          expected.error?.let {\n            // Handle error occurred during the style pack download.\n            logErrorMessage(\"StylePackError: $it\")\n          }\n        }\n      )\n    )\n\n    // 2. Create a tile region with tiles for the satellite street style\n\n    // A Tile Region represents an identifiable geographic tile region with metadata, consisting of\n    // a set of tiles packs that cover a given area (a polygon). Tile Regions allow caching tiles\n    // packs in an explicit way: By creating a Tile Region, developers can ensure that all tiles in\n    // that region will be downloaded and remain cached until explicitly deleted.\n\n    // Creating a Tile Region requires supplying a description of the area geometry, the tilesets\n    // and zoom ranges of the tiles within the region.\n\n    // The tileset descriptor encapsulates the tile-specific data, such as which tilesets, zoom ranges,\n    // pixel ratio etc. the cached tile packs should have. It is passed to the Tile Store along with\n    // the region area geometry to load a new Tile Region.\n\n    // The OfflineManager is responsible for creating tileset descriptors for the given style and zoom range.\n    val tilesetDescriptors = listOf(\n      offlineManager.createTilesetDescriptor(\n        TilesetDescriptorOptions.Builder()\n          .styleURI(Style.STANDARD_SATELLITE)\n          .pixelRatio(resources.displayMetrics.density)\n          .minZoom(0)\n          .maxZoom(16)\n          .build()\n      ),\n      offlineManager.createTilesetDescriptor(\n        TilesetDescriptorOptions.Builder()\n          .styleURI(Style.STANDARD)\n          .pixelRatio(resources.displayMetrics.density)\n          .minZoom(0)\n          .maxZoom(16)\n          .build()\n      )\n    )\n\n    // Use the the default TileStore to load this region. You can create custom TileStores that are\n    // unique for a particular file path, i.e. there is only ever one TileStore per unique path.\n\n    // Note that the TileStore path must be the same with the TileStore used when initialise the MapView.\n    cancelables.add(\n      tileStore.loadTileRegion(\n        TILE_REGION_ID,\n        TileRegionLoadOptions.Builder()\n          .geometry(TOKYO)\n          .descriptors(tilesetDescriptors)\n          .metadata(Value(TILE_REGION_METADATA))\n          .acceptExpired(true)\n          .networkRestriction(NetworkRestriction.NONE)\n          .build(),\n        { progress ->\n          updateTileRegionDownloadProgress(\n            progress.completedResourceCount,\n            progress.requiredResourceCount,\n            \"TileRegionLoadProgress: $progress\"\n          )\n        }\n      ) { expected ->\n        // Tile pack download finishes successfully\n        expected.value?.let { region ->\n          logSuccessMessage(\"TileRegion downloaded: $region\")\n          if (allResourcesDownloadLoaded()) {\n            prepareViewMapButton()\n          } else {\n            logInfoMessage(\"Waiting for style pack download to be finished.\")\n          }\n        }\n        expected.error?.let {\n          // Handle error occurred during the tile region download.\n          logErrorMessage(\"TileRegionError: $it\")\n        }\n      }\n    )\n    prepareCancelButton()\n  }\n\n  private fun allResourcesDownloadLoaded(): Boolean = binding.satelliteStandardStylePackDownloadProgress.max > 0 &&\n    binding.standardStylePackDownloadProgress.max > 0 &&\n    binding.tilePackDownloadProgress.max > 0 &&\n    binding.satelliteStandardStylePackDownloadProgress.progress == binding.satelliteStandardStylePackDownloadProgress.max &&\n    binding.standardStylePackDownloadProgress.progress == binding.standardStylePackDownloadProgress.max &&\n    binding.tilePackDownloadProgress.progress == binding.tilePackDownloadProgress.max\n\n  private fun showDownloadedRegions() {\n    // Get a list of tile regions that are currently available.\n    tileStore.getAllTileRegions { expected ->\n      expected.value?.let { tileRegionList ->\n        logInfoMessage(\"Existing tile regions: $tileRegionList\")\n      }\n      expected.error?.let { tileRegionError ->\n        logErrorMessage(\"TileRegionError: $tileRegionError\")\n      }\n    }\n    // Get a list of style packs that are currently available.\n    offlineManager.getAllStylePacks { expected ->\n      expected.value?.let { stylePackList ->\n        logInfoMessage(\"Existing style packs: $stylePackList\")\n      }\n      expected.error?.let { stylePackError ->\n        logErrorMessage(\"StylePackError: $stylePackError\")\n      }\n    }\n  }\n\n  private fun removeOfflineRegions() {\n    // Remove the tile region with the tile region ID.\n    // Note this will not remove the downloaded tile packs, instead, it will just mark the tileset\n    // not a part of a tile region. The tiles still exists as a predictive cache in TileStore.\n    tileStore.removeTileRegion(TILE_REGION_ID)\n\n    // Remove the style pack with the style url.\n    // Note this will not remove the downloaded style pack, instead, it will just mark the resources\n    // not a part of the existing style pack. The resources still exists as disk cache.\n    offlineManager.removeStylePack(Style.STANDARD_SATELLITE)\n    offlineManager.removeStylePack(Style.STANDARD)\n\n    MapboxMap.clearData {\n      it.error?.let { error ->\n        logErrorMessage(error)\n      }\n    }\n\n    // Explicitly clear ambient cache data (so that if we try to download tile store regions again - it would actually truly download it from network).\n    // Ambient cache data is anything not associated with an offline region or a style pack, including predictively cached data.\n    // Note that it is advisable to rely on internal TileStore implementation to clear cache when needed.\n    tileStore.clearAmbientCache {\n      it.error?.let { error ->\n        logErrorMessage(error.message)\n      }\n    }\n\n    // Reset progressbar.\n    updateSatelliteStandardStylePackDownloadProgress(0, 0)\n    updateStandardStylePackDownloadProgress(0, 0)\n    updateTileRegionDownloadProgress(0, 0)\n  }\n\n  private fun updateSatelliteStandardStylePackDownloadProgress(progress: Long, max: Long, message: String? = null) {\n    binding.satelliteStandardStylePackDownloadProgress.max = max.toInt()\n    binding.satelliteStandardStylePackDownloadProgress.progress = progress.toInt()\n    message?.let {\n      offlineLogsAdapter.addLog(OfflineLog.StylePackProgress(it))\n    }\n  }\n\n  private fun updateStandardStylePackDownloadProgress(progress: Long, max: Long, message: String? = null) {\n    binding.standardStylePackDownloadProgress.max = max.toInt()\n    binding.standardStylePackDownloadProgress.progress = progress.toInt()\n    message?.let {\n      offlineLogsAdapter.addLog(OfflineLog.StylePackProgress(it))\n    }\n  }\n\n  private fun updateTileRegionDownloadProgress(progress: Long, max: Long, message: String? = null) {\n    binding.tilePackDownloadProgress.max = max.toInt()\n    binding.tilePackDownloadProgress.progress = progress.toInt()\n    message?.let {\n      offlineLogsAdapter.addLog(OfflineLog.TilePackProgress(it))\n    }\n  }\n\n  private fun logInfoMessage(message: String) {\n    offlineLogsAdapter.addLog(OfflineLog.Info(message))\n  }\n\n  private fun logErrorMessage(message: String) {\n    offlineLogsAdapter.addLog(OfflineLog.Error(message))\n  }\n\n  private fun logSuccessMessage(message: String) {\n    offlineLogsAdapter.addLog(OfflineLog.Success(message))\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    // Cancel the current downloading jobs\n    cancelables.forEach { it.cancel() }\n    cancelables.clear()\n    // Remove downloaded style packs and tile regions.\n    removeOfflineRegions()\n    // Bring back the network connectivity when exiting the OfflineActivity.\n    OfflineSwitch.getInstance().isMapboxStackConnected = true\n  }\n\n  private class OfflineLogsAdapter : RecyclerView.Adapter<OfflineLogsAdapter.ViewHolder>() {\n    private var isUpdating: Boolean = false\n    private val updateHandler = Handler(Looper.getMainLooper())\n    private val logs = ArrayList<OfflineLog>()\n\n    @SuppressLint(\"NotifyDataSetChanged\")\n    private val updateRunnable = Runnable {\n      notifyDataSetChanged()\n      isUpdating = false\n    }\n\n    class ViewHolder internal constructor(view: View) : RecyclerView.ViewHolder(view) {\n      internal var alertMessageTv: TextView = view.findViewById(R.id.alert_message)\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n      val view =\n        LayoutInflater.from(parent.context).inflate(R.layout.item_gesture_alert, parent, false)\n      return ViewHolder(view)\n    }\n\n    override fun onBindViewHolder(holder: ViewHolder, position: Int) {\n      val alert = logs[position]\n      holder.alertMessageTv.text = alert.message\n      holder.alertMessageTv.setTextColor(\n        ContextCompat.getColor(holder.alertMessageTv.context, alert.color)\n      )\n    }\n\n    override fun getItemCount(): Int {\n      return logs.size\n    }\n\n    fun addLog(alert: OfflineLog) {\n      when (alert) {\n        is OfflineLog.Error -> Log.e(TAG, alert.message)\n        else -> Log.d(TAG, alert.message)\n      }\n      logs.add(0, alert)\n      if (!isUpdating) {\n        isUpdating = true\n        updateHandler.postDelayed(updateRunnable, 250)\n      }\n    }\n  }\n\n  private sealed class OfflineLog(val message: String, val color: Int) {\n    class Info(message: String) : OfflineLog(message, android.R.color.black)\n    class Error(message: String) : OfflineLog(message, android.R.color.holo_red_dark)\n    class Success(message: String) : OfflineLog(message, android.R.color.holo_green_dark)\n    class TilePackProgress(message: String) : OfflineLog(message, android.R.color.holo_purple)\n    class StylePackProgress(message: String) : OfflineLog(message, android.R.color.holo_orange_dark)\n  }\n\n  companion object {\n    private const val TAG = \"OfflineActivity\"\n    private const val ZOOM = 12.0\n    private val TOKYO = Point.fromLngLat(139.769305, 35.682027)\n    private const val TILE_REGION_ID = \"myTileRegion\"\n    private const val STYLE_PACK_STANDARD_SATELLITE_METADATA = \"my-standard-satellite-style-pack\"\n    private const val STYLE_PACK_STANDARD_METADATA = \"my-standard-style-pack\"\n    private const val TILE_REGION_METADATA = \"my-offline-region\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/OngoingAnimationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.animation.ValueAnimator\nimport android.os.Bundle\nimport android.view.animation.LinearInterpolator\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.gestures.gestures\nimport java.util.concurrent.TimeUnit\n\nclass OngoingAnimationActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapView.mapboxMap\n      .apply {\n        setCamera(\n          CameraOptions.Builder()\n            .center(Point.fromLngLat(LONGITUDE, LATITUDE))\n            .zoom(9.0)\n            .build()\n        )\n      }\n\n    mapView.gestures.addProtectedAnimationOwner(OWNER)\n\n    val anim = mapView.camera.createPitchAnimator(\n      CameraAnimatorOptions.cameraAnimatorOptions(0.0, 30.0) {\n        owner(OWNER)\n      }\n    ) {\n      repeatCount = ValueAnimator.INFINITE\n      repeatMode = ValueAnimator.REVERSE\n      duration = TimeUnit.SECONDS.toMillis(2)\n      interpolator = LinearInterpolator()\n    }\n\n    mapView.camera.registerAnimators(anim)\n\n    anim.start()\n  }\n\n  companion object {\n    private const val OWNER = \"Example\"\n    private const val LATITUDE = 40.0\n    private const val LONGITUDE = -74.5\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/OrnamentMarginActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport android.view.Gravity\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.android.gestures.RotateGestureDetector\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.plugin.attribution.attribution\nimport com.mapbox.maps.plugin.compass.compass\nimport com.mapbox.maps.plugin.gestures.OnRotateListener\nimport com.mapbox.maps.plugin.gestures.addOnRotateListener\nimport com.mapbox.maps.plugin.logo.logo\nimport com.mapbox.maps.plugin.scalebar.scalebar\n\n/**\n * Test activity to validate correct margin displacement of ornaments when the map rotates.\n */\nclass OrnamentMarginActivity : AppCompatActivity(), OnRotateListener {\n\n  private lateinit var mapView: MapView\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    mapView = MapView(this)\n    setContentView(mapView)\n    with(mapView.mapboxMap) {\n      mapView.attribution.position = Gravity.END or Gravity.BOTTOM\n      setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(23.760833, 61.498056))\n          .zoom(14.0)\n          .build()\n      )\n      addOnRotateListener(this@OrnamentMarginActivity)\n    }\n  }\n\n  override fun onRotate(detector: RotateGestureDetector) {\n    val bearing = mapView.mapboxMap.cameraState.bearing.toFloat()\n    val margin = 2f * if (bearing <= 180f) bearing else 180f - (bearing % 180f)\n    with(mapView.logo) {\n      marginLeft = margin\n      marginBottom = margin\n      marginRight = margin\n      marginTop = margin\n    }\n    with(mapView.attribution) {\n      marginLeft = margin\n      marginBottom = margin\n      marginRight = margin\n      marginTop = margin\n    }\n    with(mapView.scalebar) {\n      marginLeft = margin\n      marginBottom = margin\n      marginRight = margin\n      marginTop = margin\n    }\n    with(mapView.compass) {\n      marginLeft = margin\n      marginBottom = margin\n      marginRight = margin\n      marginTop = margin\n    }\n  }\n\n  override fun onRotateEnd(detector: RotateGestureDetector) {\n  }\n\n  override fun onRotateBegin(detector: RotateGestureDetector) {\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/RawExpressionActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.style.layers.getLayerAs\n\n/**\n * Example showcasing raw expression support through the Value API.\n * This example manipulates the water fill layer of mapbox-streets to:\n * ```\n *         {\n *           \"id\": \"water\",\n *           \"type\": \"fill\",\n *           \"source\": \"composite\",\n *           \"source-layer\": \"water\",\n *           \"layout\": {},\n *           \"paint\": {\n *               \"fill-color\": [\n *                   \"interpolate\",\n *                   [\"linear\"],\n *                   [\"zoom\"],\n *                   0, \"hsl(103, 80%, 70%)\",\n *                   8.53, \"hsl(360, 80%, 70%)\",\n *                   22, \"hsl(196, 80%, 70%)\"\n *               ]\n *           }\n *       }\n * ```\n */\nclass RawExpressionActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this, MapInitOptions(context = this, styleUri = Style.MAPBOX_STREETS))\n    setContentView(mapView)\n    mapView.mapboxMap.getStyle {\n      addExpressionToStyle(it)\n    }\n  }\n\n  private fun addExpressionToStyle(style: Style) {\n    style.getLayerAs<FillLayer>(\"water\")?.fillColor(\n      Expression.fromRaw(\n        \"\"\"\n        [\n          \"interpolate\",\n           [\"linear\"],\n           [\"zoom\"],\n           0, \"hsl(103, 80%, 70%)\",\n           8.53, \"hsl(360, 80%, 70%)\",\n           22, \"hsl(196, 80%, 70%)\"\n         ]  \n        \"\"\".trimIndent()\n      )\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/RawGeoJsonActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\n\n/**\n * Example showcasing raw geojson conversion support through the Value API.\n * This converts the following geojson to a value object:\n * ```\n * {\n *  \"type\": \"FeatureCollection\",\n *  \"features\": [\n *    {\n *      \"type\": \"Feature\",\n *      \"properties\": {},\n *      \"geometry\": {\n *        \"type\": \"Point\",\n *        \"coordinates\": [\n *          6.0033416748046875,\n *          43.70908256335716\n *        ]\n *      }\n *    }\n *   ]\n * }\n * ```\n */\nclass RawGeoJsonActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapboxMap = mapView.mapboxMap.apply {\n      setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(6.0033416748046875, 43.70908256335716))\n          .zoom(16.0)\n          .build()\n      )\n      loadStyle(Style.STANDARD) { addGeoJsonSource(it) }\n    }\n  }\n\n  private fun addGeoJsonSource(style: Style) {\n    val geojson = Value.fromJson(\n      \"\"\"\n      {\n        \"type\": \"FeatureCollection\",\n        \"features\": [\n          {\n            \"type\": \"Feature\",\n            \"properties\": {},\n            \"geometry\": {\n              \"type\": \"Point\",\n              \"coordinates\": [\n                6.0033416748046875,\n                43.70908256335716\n              ]\n            }\n          }\n        ]\n      }\n      \"\"\".trimIndent()\n    )\n\n    if (geojson.isError) {\n      throw RuntimeException(\"Invalid GeoJson:\" + geojson.error)\n    }\n\n    val sourceParams = HashMap<String, Value>()\n    sourceParams[\"type\"] = Value(\"geojson\")\n    sourceParams[\"data\"] = geojson.value!!\n    val expected = style.addStyleSource(\"source\", Value(sourceParams))\n\n    if (expected.isError) {\n      throw RuntimeException(\"Invalid GeoJson:\" + expected.error)\n    }\n\n    style.addLayer(\n      circleLayer(\"circle\", \"source\") {\n        circleColor(Color.BLACK)\n        circleRadius(10.0)\n      }\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/RawSourceLayerActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\n\n/**\n * Example showcasing raw source/layer json conversion support through the Value API.\n *\n * Source:\n * ```\n * {\n *    \"type\": \"geojson\",\n *    \"data\": {\n *        \"type\": \"Feature\",\n *        \"geometry\": {\n *        \"type\": \"Point\",\n *          \"coordinates\": [-77.032667, 38.913175]\n *        },\n *        \"properties\": {\n *          \"title\": \"Mapbox DC\",\n *          \"marker-symbol\": \"monument\"\n *        }\n *    }\n * }\n * ```\n *\n * Layer:\n * ```\n * {\n *    \"id\": \"custom\",\n *    \"type\": \"circle\",\n *    \"source\": \"source\",\n *    \"source-layer\": \"\",\n *    \"layout\": {},\n *    \"paint\": {\n *        \"circle-radius\": 20,\n *        \"circle-color\": \"#FF3300\",\n *        \"circle-pitch-alignment\": \"map\"\n *    }\n * }\n * ```\n */\nclass RawSourceLayerActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapView.mapboxMap.apply {\n      setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(-77.032667, 38.913175))\n          .zoom(16.0)\n          .build()\n      )\n      loadStyle(Style.STANDARD) { addGeoJsonSource(it) }\n    }\n  }\n\n  private fun addGeoJsonSource(style: Style) {\n    val source = Value.fromJson(\n      \"\"\"\n        {\n          \"type\": \"geojson\",\n          \"data\": {\n            \"type\": \"Feature\",\n            \"geometry\": {\n              \"type\": \"Point\",\n              \"coordinates\": [-77.032667, 38.913175]\n            },\n            \"properties\": {\n              \"title\": \"Mapbox Garage\",\n              \"marker-symbol\": \"monument\"\n            }\n          }\n        }\n      \"\"\".trimIndent()\n    )\n\n    if (source.isError) {\n      throw RuntimeException(\"Invalid GeoJson:\" + source.error)\n    }\n\n    val expected = style.addStyleSource(\"source\", source.value!!)\n    if (expected.isError) {\n      throw RuntimeException(\"Invalid GeoJson:\" + expected.error)\n    }\n\n    val layer = Value.fromJson(\n      \"\"\"\n        {\n            \"id\": \"custom\",\n            \"type\": \"circle\",\n            \"source\": \"source\",\n            \"source-layer\": \"\",\n            \"layout\": {},\n            \"paint\": {\n                \"circle-radius\": 20,\n                \"circle-color\": \"#FF3300\",\n                \"circle-pitch-alignment\": \"map\"\n            }\n        }\n      \"\"\".trimIndent()\n    )\n\n    if (layer.isError) {\n      throw RuntimeException(\"Invalid GeoJson:\" + layer.error)\n    }\n\n    val expectedLayer = style.addStyleLayer(layer.value!!, null)\n\n    if (expectedLayer.isError) {\n      throw RuntimeException(\"Invalid GeoJson:\" + expectedLayer.error)\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/RuntimeStylingActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.*\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.style.layers.generated.fillExtrusionLayer\nimport com.mapbox.maps.extension.style.layers.generated.rasterLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.light.generated.flatLight\nimport com.mapbox.maps.extension.style.light.setLight\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.extension.style.sources.getSource\nimport com.mapbox.maps.testapp.R\n\n/**\n * Example showcasing usage of style extension.\n */\nclass RuntimeStylingActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this, MapInitOptions(context = this, styleUri = Style.MAPBOX_STREETS))\n    setContentView(mapView)\n\n    mapboxMap = mapView.mapboxMap\n    mapboxMap.getStyle { setupStyle(it) }\n  }\n\n  private fun setupStyle(style: Style) {\n    addImage(style)\n    addSymbolSource(style)\n    addSymbolLayer(style)\n\n    addFillSource(style)\n    setFillLayer(style)\n    addFillExtrusionLayer(style)\n    addFillExtrusionLight(style)\n\n    addImageSource(style)\n    addRasterLayer(style)\n\n    addLayerWithoutStyleExtension(style)\n\n    val source = style.getSource(\"composite\") as VectorSource\n    logE(TAG, \"getSource: $source\")\n  }\n\n  private fun addImage(style: Style) {\n    val bitmap = ContextCompat.getDrawable(this, R.drawable.android_symbol)?.toBitmap(64, 64)!!\n    val expected = style.addImage(\n      \"myImage\",\n      bitmap,\n      true\n    )\n    expected.error?.let {\n      logE(TAG, it)\n    }\n    expected.value?.let {\n      logD(TAG, it.toString())\n    }\n  }\n\n  private fun addSymbolSource(style: Style) {\n    val source = geoJsonSource(id = \"points\") {\n      featureCollection(\n        FeatureCollection.fromJson(\n          \"\"\"\n        {\n          \"type\": \"FeatureCollection\",\n          \"features\": [\n            {\n              \"type\": \"Feature\",\n              \"properties\": {\n                \"count\": 0\n              },\n              \"geometry\": {\n                \"type\": \"Point\",\n                \"coordinates\": [\n                  -42.978515625,\n                  22.024545601240337\n                ]\n              }\n            },\n            {\n              \"type\": \"Feature\",\n              \"properties\": {\n                \"count\": 0\n              },\n              \"geometry\": {\n                \"type\": \"Point\",\n                \"coordinates\": [\n                  -29.355468750000004,\n                  25.64152637306577\n                ]\n              }\n            },\n            {\n              \"type\": \"Feature\",\n              \"properties\": {\n                \"count\": 1\n              },\n              \"geometry\": {\n                \"type\": \"Point\",\n                \"coordinates\": [\n                  -3.69140625,\n                  -4.214943141390639\n                ]\n              }\n            },\n            {\n              \"type\": \"Feature\",\n              \"properties\": {\n                \"count\": 1              \n              },\n              \"geometry\": {\n                \"type\": \"Point\",\n                \"coordinates\": [\n                  -27.861328125,\n                  3.337953961416485\n                ]\n              }\n            },\n            {\n              \"type\": \"Feature\",\n              \"properties\": {\n                \"count\": 1\n              },\n              \"geometry\": {\n                \"type\": \"Point\",\n                \"coordinates\": [\n                  -27.773437499999996,\n                  -17.644022027872712\n                ]\n              }\n            }\n          ]\n        }\n          \"\"\".trimIndent()\n        )\n      )\n      cluster(true)\n      prefetchZoomDelta(1)\n    }\n    logI(TAG, source.toString())\n    style.addSource(source)\n    logI(TAG, \"prefetchZoomDelta : ${source.prefetchZoomDelta}\")\n  }\n\n  private fun addSymbolLayer(style: Style) {\n    val symbolLayer = symbolLayer(layerId = \"symbollayer\", sourceId = \"points\") {\n      filter(\n        eq {\n          get {\n            literal(\"count\")\n          }\n          literal(0)\n        }\n      )\n      iconImage(literal(\"myImage\"))\n      iconOpacity(\n        subtract {\n          literal(1.0)\n          literal(0.6)\n        }\n      )\n      textField(\n        format {\n          formatSection(\"London\") {\n            fontScale(1.0)\n            textFont(\n              listOf(\n                \"Open Sans Regular\",\n                \"Arial Unicode MS Regular\"\n              )\n            )\n            textColor(Color.RED)\n          }\n          formatSection(\n            image {\n              literal(\"london-underground\")\n            }\n          ) {\n            fontScale(0.9)\n          }\n          formatSection(\"underground\") {\n            fontScale(0.8)\n            textFont(\n              listOf(\n                \"Open Sans Regular\",\n                \"Arial Unicode MS Regular\"\n              )\n            )\n            textColor(Color.WHITE)\n          }\n        }\n      )\n      iconColor(Color.GREEN)\n      textAnchor(TextAnchor.CENTER)\n      iconAnchor(IconAnchor.BOTTOM)\n      textIgnorePlacement(false)\n      iconIgnorePlacement(false)\n    }\n    style.addLayer(symbolLayer)\n    logI(TAG, symbolLayer.iconOpacityAsExpression.toString())\n  }\n\n  private fun addFillSource(style: Style) {\n    val polygon = geoJsonSource(id = \"polygon\") {\n      featureCollection(\n        FeatureCollection.fromJson(\n          \"\"\"\n        {\n          \"type\": \"FeatureCollection\",\n          \"features\": [\n            {\n              \"type\": \"Feature\",\n              \"properties\": {},\n              \"geometry\": {\n                \"type\": \"Polygon\",\n                \"coordinates\": [\n                  [\n                    [\n                      -366.85546875,\n                      18.145851771694467\n                    ],\n                    [\n                      -373.27148437499994,\n                      12.726084296948196\n                    ],\n                    [\n                      -364.39453125,\n                      6.577303118123887\n                    ],\n                    [\n                      -366.85546875,\n                      18.145851771694467\n                    ]\n                  ]\n                ]\n              }\n            }\n          ]\n        }\n          \"\"\".trimIndent()\n        )\n      )\n    }\n    logI(TAG, polygon.toString())\n    style.addSource(polygon)\n  }\n\n  private fun setFillLayer(style: Style) {\n    val fillLayer = style.getLayer(\"water\") as FillLayer\n    fillLayer.fillColor(\n      interpolate {\n        exponential {\n          literal(0.5)\n        }\n        zoom()\n        stop {\n          literal(1.0)\n          color(Color.RED)\n        }\n        stop {\n          literal(5.0)\n          color(Color.BLUE)\n        }\n        stop {\n          literal(10.0)\n          color(Color.GREEN)\n        }\n      }\n    )\n    fillLayer.visibility(Visibility.VISIBLE)\n    logI(TAG, fillLayer.fillColorAsExpression.toString())\n  }\n\n  private fun addFillExtrusionLayer(style: Style) {\n    val fillExtrusionLayer = fillExtrusionLayer(\"fillextrusion\", \"polygon\") {\n      fillExtrusionHeight(1000000.0)\n      fillExtrusionColor(Color.GRAY)\n      fillExtrusionOpacity(1.0)\n    }\n    style.addLayer(fillExtrusionLayer)\n  }\n\n  private fun addFillExtrusionLight(style: Style) {\n    val light = flatLight {\n      anchor(Anchor.MAP)\n      color(Color.YELLOW)\n      position(\n        radialCoordinate = 10.0,\n        azimuthalAngle = 40.0,\n        polarAngle = 50.0\n      )\n    }\n    style.setLight(light)\n  }\n\n  private fun addImageSource(style: Style) {\n    val imageSource = imageSource(\"imag\") {\n      url(\"https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Mapbox_logo_2019.svg/2560px-Mapbox_logo_2019.svg.png\")\n      coordinates(\n        listOf(\n          listOf(-35.859375, 58.44773280389084),\n          listOf(-16.171875, 58.44773280389084),\n          listOf(-16.171875, 54.7246201949245),\n          listOf(-35.859375, 54.7246201949245)\n        )\n      )\n    }\n    style.addSource(imageSource)\n  }\n\n  private fun addRasterLayer(style: Style) {\n    val raster = rasterLayer(\"raster\", \"imag\") {}\n    style.addLayer(raster)\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  private fun addLayerWithoutStyleExtension(style: Style) {\n    val bitmap = ContextCompat.getDrawable(this, R.drawable.android_symbol)!!.toBitmap(64, 64)\n    val expected = style.addStyleImage(\n      \"myImage\",\n      1f,\n      bitmap.toMapboxImage(),\n      false,\n      mutableListOf(),\n      mutableListOf(),\n      null\n    )\n    expected.error?.let {\n      logE(TAG, it)\n    }\n    expected.value?.let {\n      logD(TAG, it.toString())\n    }\n\n    val sourceParams = HashMap<String, Value>()\n    sourceParams[\"type\"] = Value(\"geojson\")\n    val data = HashMap<String, Value>()\n    data[\"type\"] = Value(\"Feature\")\n    val geometry = HashMap<String, Value>()\n    geometry[\"type\"] = Value(\"Point\")\n    geometry[\"coordinates\"] = Value(listOf(Value(24.9384), Value(60.1699)))\n    data[\"geometry\"] = Value(geometry)\n    sourceParams[\"data\"] = Value(data)\n    style.addStyleSource(\"source\", Value(sourceParams))\n\n    val layerParams = HashMap<String, Value>()\n    layerParams[\"id\"] = Value(\"layer\")\n    layerParams[\"type\"] = Value(\"symbol\")\n    layerParams[\"source\"] = Value(\"source\")\n    style.addStyleLayer(Value(layerParams), null)\n    style.setStyleLayerProperty(\"layer\", \"icon-image\", Value(\"myImage\"))\n    style.setStyleLayerProperty(\"layer\", \"icon-opacity\", Value(1.0))\n    style.setStyleLayerProperty(\"layer\", \"icon-size\", Value(5.0))\n    style.setStyleLayerProperty(\"layer\", \"icon-color\", Value(\"white\"))\n  }\n\n  companion object {\n    private const val TAG = \"RuntimeStylingActivity\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/ScaleBarActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.testapp.R\n\n/**\n * Activity to showcase scale bar custom configuration using xml attributes.\n */\nclass ScaleBarActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContentView(R.layout.activity_scale_bar)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/SecondaryDisplayActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.animation.flyTo\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivitySecondaryDisplayBinding\n\n/**\n * Example of displaying a map on a secondary display.\n */\nclass SecondaryDisplayActivity : AppCompatActivity() {\n\n  private lateinit var binding: ActivitySecondaryDisplayBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivitySecondaryDisplayBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +image(\n          IMAGE_ID,\n          ContextCompat.getDrawable(\n            this@SecondaryDisplayActivity,\n            R.drawable.ic_red_marker\n          )!!.toBitmap()\n        ) {\n          // Note: The default scale doesn't work with secondary displays.\n          // we need to manually set the scale to the pixel for the current context\n          scale(this@SecondaryDisplayActivity.resources.displayMetrics.density)\n        }\n        +geoJsonSource(SOURCE_ID) {\n          geometry(HELSINKI)\n        }\n        +symbolLayer(LAYER_ID, SOURCE_ID) {\n          iconImage(IMAGE_ID)\n          iconAllowOverlap(true)\n        }\n      }\n    )\n    binding.moveCameraButton.setOnClickListener {\n      moveCamera()\n    }\n  }\n\n  private fun moveCamera() {\n    val cameraOption = CameraOptions.Builder()\n      .center(HELSINKI)\n      .zoom(ZOOM)\n      .build()\n\n    binding.mapView.mapboxMap.flyTo(\n      cameraOption,\n      MapAnimationOptions.mapAnimationOptions {\n        duration(DURATION)\n      }\n    )\n  }\n\n  companion object {\n    private val HELSINKI = Point.fromLngLat(24.9384, 60.1699)\n    private const val ZOOM = 14.0\n    private const val DURATION = 3000L\n    private const val IMAGE_ID = \"test-image\"\n    private const val LAYER_ID = \"symbol-layer-id\"\n    private const val SOURCE_ID = \"source-id\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/SecondaryDisplayPresentationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.app.Presentation\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.hardware.display.DisplayManager\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Display\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.WindowManager\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.children\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LifecycleRegistry\nimport androidx.lifecycle.setViewTreeLifecycleOwner\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivitySecondaryDisplayPresentationBinding\nimport com.mapbox.maps.testapp.databinding.ItemDisplayInfoBinding\n\n/**\n * Example of displaying a map on a secondary display using [Presentation].\n *\n * To use this example, you either need to:\n * - attach a second display to your device\n * - have the simulated secondary display enabled in the developer settings\n * - in the emulator's extended controls, add a new secondary display\n */\nclass SecondaryDisplayPresentationActivity : AppCompatActivity() {\n  private lateinit var displayManager: DisplayManager\n  private var currentPresentation: Presentation? = null\n  private lateinit var binding: ActivitySecondaryDisplayPresentationBinding\n  private val onDismissListener = DialogInterface.OnDismissListener { dialog ->\n    if (dialog == currentPresentation) {\n      Log.i(TAG, \"Presentation was dismissed.\")\n      currentPresentation = null\n      updateDisplaysInfo()\n    }\n  }\n  private val displayListener = object : DisplayManager.DisplayListener {\n    override fun onDisplayAdded(displayId: Int) {\n      Log.d(TAG, \"Display #$displayId added.\")\n      updateDisplaysInfo()\n    }\n\n    override fun onDisplayRemoved(displayId: Int) {\n      Log.d(TAG, \"Display #$displayId removed.\")\n      updateDisplaysInfo()\n    }\n\n    override fun onDisplayChanged(displayId: Int) {\n      Log.d(TAG, \"Display #$displayId changed.\")\n      updateDisplaysInfo()\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivitySecondaryDisplayPresentationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    displayManager = ContextCompat.getSystemService(this, DisplayManager::class.java)!!\n  }\n\n  override fun onResume() {\n    super.onResume()\n    updateDisplaysInfo()\n    // Register to receive events from the display manager.\n    displayManager.registerDisplayListener(displayListener, null)\n  }\n\n  override fun onPause() {\n    // Unregister from the display manager.\n    displayManager.unregisterDisplayListener(displayListener)\n    super.onPause()\n  }\n\n  override fun onStop() {\n    // Dismiss the presentation when the activity is not visible.\n    currentPresentation?.let {\n      Log.i(TAG, \"Dismissing presentation because the activity is no longer visible.\")\n      it.dismiss()\n      currentPresentation = null\n    }\n    super.onStop()\n  }\n\n  private fun updateDisplaysInfo() {\n    clearDisplaysInfo()\n\n    @Suppress(\"DEPRECATION\")\n    val thisActivityDisplay = windowManager.defaultDisplay\n    val displays = displayManager.displays\n    val secondaryDisplays = displays.filterNot { it.displayId == thisActivityDisplay.displayId }\n    if (secondaryDisplays.isEmpty()) {\n      binding.displayNone.visibility = View.VISIBLE\n    } else {\n      binding.displayNone.visibility = View.GONE\n      secondaryDisplays.forEach { display ->\n        Log.d(TAG, \"updatePresentation: Found display $display\")\n        ItemDisplayInfoBinding.inflate(\n          LayoutInflater.from(binding.root.context),\n          binding.root,\n          true\n        ).apply {\n          root.tag = DISPLAY_INFO_TAG\n          displayInfo.text = \"${display.name} [${display.displayId}]\"\n          displayBt.isEnabled = true\n          displayBt.setOnClickListener {\n            updatePresentation(display)\n          }\n          // Disable the PRESENT button for those displays that are already presenting\n          currentPresentation?.let {\n            if (it.display == display) {\n              displayBt.isEnabled = false\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun clearDisplaysInfo() {\n    // Remove all the views related to display info\n    binding.root.children.filter { it.tag == DISPLAY_INFO_TAG }\n      .toList() // Accumulate all the views to remove\n      .forEach {\n        Log.d(TAG, \"clearDisplaysInfo: removing $it\")\n        binding.root.removeView(it)\n      }\n  }\n\n  private fun updatePresentation(display: Display) {\n    currentPresentation?.let { presentation ->\n      // Dismiss the current presentation if the display has changed.\n      if (presentation.display !== display) {\n        Log.i(TAG, \"Dismissing old presentation. A new display will be used.\")\n        currentPresentation = null\n        presentation.dismiss()\n      }\n    }\n\n    // Show a new presentation if needed.\n    if (currentPresentation == null) {\n      Log.i(TAG, \"Showing presentation on display: $display\")\n      val presentation = DemoPresentation(this, display)\n      presentation.setOnDismissListener(onDismissListener)\n      currentPresentation = try {\n        presentation.show()\n        presentation\n      } catch (ex: WindowManager.InvalidDisplayException) {\n        Log.e(TAG, \"Couldn't show presentation!  Display was removed in the meantime.\", ex)\n        null\n      }\n    }\n    updateDisplaysInfo()\n  }\n\n  private companion object {\n    private const val TAG = \"SecondaryDisplayPresent\"\n\n    private const val DISPLAY_INFO_TAG = \"DisplayInfo\"\n  }\n\n  /**\n   * The presentation to show on the secondary display.\n   *\n   * Note that this display may have different metrics from the display on which\n   * the main activity is showing so we must be careful to use the presentation's\n   * own [Context] whenever we load resources.\n   *\n   */\n  private class DemoPresentation(context: Context?, display: Display?) :\n    Presentation(context, display), LifecycleOwner {\n    private lateinit var lifecycleRegistry: LifecycleRegistry\n    override fun onCreate(savedInstanceState: Bundle?) {\n      super.onCreate(savedInstanceState)\n\n      // MapView uses Lifecycle events to handle its own state.\n      // Let's expose this Presentation lifecycle manually\n      lifecycleRegistry = LifecycleRegistry(this)\n      lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)\n\n      // Set the application theme which inherits from `Theme.AppCompat` which is needed for some\n      // of the views inside Mapview (e.g. CompassView)\n      context.setTheme(R.style.AppTheme)\n\n      // Notice that we are getting the context of the presentation.\n      val mapView = MapView(context)\n      setContentView(mapView)\n    }\n\n    public override fun onStart() {\n      super.onStart()\n      // Only after we show does the dialog window actually return a decor view.\n      val decorView: View = window!!.decorView\n      // Set the lifecycle owner for this dialog to be this class. This allows Mapview to get the\n      // right lifecycle registry\n      decorView.setViewTreeLifecycleOwner(this)\n      lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)\n    }\n\n    override fun onStop() {\n      lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)\n      lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)\n      super.onStop()\n    }\n\n    override val lifecycle: Lifecycle\n      get() = lifecycleRegistry\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/ShowHideLayersActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.sources.generated.vectorSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.databinding.ActivityShowHideLayersBinding\n\n/**\n * Allow the user to toggle the visibility of a CircleLayer on a map.\n */\nclass ShowHideLayersActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityShowHideLayersBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +vectorSource(SOURCE_ID) {\n          url(SOURCE_URL)\n        }\n        +circleLayer(LAYER_ID, SOURCE_ID) {\n          sourceLayer(SOURCE_LAYER)\n          visibility(Visibility.VISIBLE)\n          circleRadius(8.0)\n          circleColor(Color.argb(255, 55, 148, 179))\n        }\n      }\n    ) {\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n    binding.fabLayerToggle.setOnClickListener {\n      binding.mapView.mapboxMap.getStyle {\n        it.getLayer(LAYER_ID)?.let { layer ->\n          if (layer.visibility == Visibility.VISIBLE) {\n            layer.visibility(Visibility.NONE)\n          } else {\n            layer.visibility(Visibility.VISIBLE)\n          }\n        }\n      }\n    }\n  }\n\n  companion object {\n    private const val SOURCE_ID = \"museums_source\"\n    private const val SOURCE_URL = \"mapbox://mapbox.2opop9hr\"\n    private const val SOURCE_LAYER = \"museum-cusco\"\n    private const val LAYER_ID = \"museums\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/SimpleMapActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\n\n/**\n * Example of displaying a map.\n */\nclass SimpleMapActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapView.mapboxMap\n      .apply {\n        setCamera(\n          CameraOptions.Builder()\n            .center(Point.fromLngLat(LONGITUDE, LATITUDE))\n            .zoom(9.0)\n            .build()\n        )\n      }\n  }\n\n  companion object {\n    private const val LATITUDE = 40.0\n    private const val LONGITUDE = -74.5\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/SimulateNavigationRouteActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport android.view.WindowManager\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.api.directions.v5.models.DirectionsResponse\nimport com.mapbox.core.constants.Constants\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.renderer.RenderThreadStats\nimport com.mapbox.maps.renderer.RenderThreadStatsRecorder\nimport com.mapbox.maps.testapp.examples.SimulateNavigationRouteActivity.Companion.SIMULATION_DURATION\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.utils.NavigationSimulator\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n/**\n * Simulate a navigation route with pre-defined route (from LA to San Francisco) with location puck,\n * route line and camera tracking. Gestures are disabled.\n * The simulation will run [repetitions] times, and the network stack will be disabled after the 5th.\n * On each iteration, the simulation will run for [SIMULATION_DURATION] milliseconds and some frame\n * stats will be logged.\n */\n@OptIn(MapboxExperimental::class)\nclass SimulateNavigationRouteActivity : AppCompatActivity() {\n\n  private val repetitions = 3\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapView.mapboxMap.setCamera(\n      cameraOptions {\n        center(Point.fromLngLat(-118.289795, 34.03084))\n        bearing(0.0)\n        pitch(0.0)\n        zoom(9.0)\n      }\n    )\n    // Prevent screen from sleeping while running the simulation\n    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n    lifecycleScope.launch {\n      val routePoints = withContext(Dispatchers.Default) {\n        LineString.fromPolyline(\n          DirectionsResponse.fromJson(\n            AnnotationUtils.loadStringFromAssets(\n              this@SimulateNavigationRouteActivity,\n              NAVIGATION_ROUTE_JSON_NAME\n            )\n          ).routes()[0].geometry()!!,\n          Constants.PRECISION_6\n        )\n      }\n      repeat(repetitions) {\n        val renderThreadStatsRecorder = RenderThreadStatsRecorder()\n        mapView.setRenderThreadStatsRecorder(renderThreadStatsRecorder)\n        val navigationSimulator = NavigationSimulator(mapView, routePoints)\n        navigationSimulator.disableGestures()\n        renderThreadStatsRecorder.start()\n        navigationSimulator.playCustomNavigationScripts(\n          NavigationSimulator.NavigationStep(INITIAL_OVERVIEW_DELAY_MS) {\n            setCameraTrackingMode(NavigationSimulator.CameraFollowMode.FOLLOW)\n          },\n          NavigationSimulator.NavigationStep(FIRST_FOLLOW_MODE_DELAY_MS) {\n            setCameraTrackingMode(NavigationSimulator.CameraFollowMode.OVERVIEW)\n          },\n          NavigationSimulator.NavigationStep(SECOND_OVERVIEW_MODE_DELAY_MS) {\n            setCameraTrackingMode(NavigationSimulator.CameraFollowMode.FOLLOW)\n          }\n        )\n        delay(SIMULATION_DURATION)\n        logStats(renderThreadStatsRecorder.end())\n        navigationSimulator.onDestroy()\n      }\n      finish()\n    }\n  }\n\n  private fun logStats(renderThreadStats: RenderThreadStats) = with(renderThreadStats) {\n    logI(TAG, \"RenderThread Stats:\")\n    logI(TAG, \"\\ttotal time: $totalTime ms\")\n    logI(TAG, \"\\ttotal frames (rendered + skipped): $totalFrames\")\n    logI(TAG, \"\\taverage FPS: ${(totalFrames / (totalTime / 1000F)).format()}\")\n    logI(TAG, \"\\tskipped frames: $totalDroppedFrames\")\n    logI(TAG, \"\\t50 percentile: ${percentile50.format()} ms\")\n    logI(TAG, \"\\t90 percentile: ${percentile90.format()} ms\")\n    logI(TAG, \"\\t95 percentile: ${percentile95.format()} ms\")\n    logI(TAG, \"\\t99 percentile: ${percentile99.format()} ms\")\n  }\n\n  private fun Number?.format() = \"%.3f\".format(this)\n\n  companion object {\n    private const val TAG = \"SimulateNavigationRoute\"\n    private const val NAVIGATION_ROUTE_JSON_NAME = \"navigation_route.json\"\n    private const val INITIAL_OVERVIEW_DELAY_MS = 3000L\n    private const val FIRST_FOLLOW_MODE_DELAY_MS = 8000L\n    private const val SECOND_OVERVIEW_MODE_DELAY_MS = 4000L\n    private const val SIMULATION_DURATION = 20_000L\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/SlotLayerActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.addLayerBelow\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.layers.generated.slotLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPolygonAnnotationManager\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivitySlotLayerBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils.showShortToast\nimport com.mapbox.turf.TurfConstants\nimport com.mapbox.turf.TurfMeasurement\n\n/**\n * Example showcasing the usage of [com.mapbox.maps.extension.style.layers.generated.SlotLayer].\n */\nclass SlotLayerActivity : AppCompatActivity() {\n\n  private lateinit var binding: ActivitySlotLayerBinding\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var annotationManager: PolygonAnnotationManager\n\n  @OptIn(MapboxExperimental::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivitySlotLayerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(createStyle()) {\n      mapboxMap.setCamera(START_CAMERA_POSITION)\n      annotationManager = binding.mapView.annotations.createPolygonAnnotationManager()\n      // We set annotations in a custom slot (below \"middle\") associated with slotLayer\n      annotationManager.slot = SLOT_LAYER_ID\n      annotationManager.create(createTriangleAnnotationOption())\n      binding.addOrRemoveSlotLayer.setOnClickListener {\n        swapLayer()\n        showShortToast(\"Current slots: ${mapboxMap.style?.styleSlots}\")\n      }\n    }\n  }\n\n  private fun swapLayer() {\n    mapboxMap.getStyle { style ->\n      if (style.styleLayerExists(SLOT_LAYER_ID)) {\n        style.removeStyleLayer(SLOT_LAYER_ID)\n        // move annotation to a \"middle\" slot - annotation will move above the rectangle\n        annotationManager.slot = MIDDLE_SLOT\n        binding.addOrRemoveSlotLayer.setImageResource(R.drawable.ic_layers)\n      } else {\n        // Add SlotLayer below FillLayer to keep the original order as shown in createStyle()\n        style.addLayerBelow(\n          slotLayer(SLOT_LAYER_ID) {\n            slot(MIDDLE_SLOT)\n          },\n          below = LAYER_ID\n        )\n        // move annotation to a custom slot below \"middle\" - annotation will move below the rectangle\n        annotationManager.slot = SLOT_LAYER_ID\n        binding.addOrRemoveSlotLayer.setImageResource(R.drawable.ic_layers_clear)\n      }\n    }\n  }\n\n  private fun createStyle() = style(style = Style.STANDARD) {\n    +geoJsonSource(SOURCE_ID) {\n      geometry(Polygon.fromLngLats(RECTANGLE_POINTS))\n    }\n\n    // Placeholder for annotations.\n    // Added new layer will be placed before the items in the \"middle\" slot.\n    +slotLayer(SLOT_LAYER_ID) {\n      slot(MIDDLE_SLOT)\n    }\n\n    // Rendered rectangle will be placed above the annotation placeholder in middle slot.\n    +fillLayer(LAYER_ID, SOURCE_ID) {\n      fillOpacity(0.8)\n      fillColor(ContextCompat.getColor(this@SlotLayerActivity, R.color.pink))\n      slot(MIDDLE_SLOT)\n    }\n  }\n\n  private fun createTriangleAnnotationOption(): PolygonAnnotationOptions {\n    val vertex1 = TurfMeasurement.destination(\n      CENTER, 500.0, 45.0, TurfConstants.UNIT_METERS\n    )\n\n    val vertex2 = TurfMeasurement.destination(\n      CENTER, 500.0, -45.0, TurfConstants.UNIT_METERS\n    )\n\n    val trianglePoints = listOf(\n      listOf(\n        CENTER,\n        vertex1,\n        vertex2,\n        CENTER,\n      )\n    )\n\n    return PolygonAnnotationOptions()\n      .withPoints(trianglePoints)\n      .withFillColor(Color.YELLOW)\n  }\n\n  companion object {\n    private const val LAYER_ID = \"layer-id\"\n    private const val SOURCE_ID = \"source-id\"\n    private const val SLOT_LAYER_ID = \"annotation-placeholder\"\n    private const val MIDDLE_SLOT = \"middle\"\n    private val CENTER = Point.fromLngLat(24.9389, 60.1699)\n    private val START_CAMERA_POSITION = cameraOptions {\n      center(CENTER)\n      zoom(14.0)\n      bearing(0.0)\n      pitch(0.0)\n    }\n\n    private val RECTANGLE_POINTS = listOf(\n      listOf(\n        Point.fromLngLat(24.9349, 60.1725),\n        Point.fromLngLat(24.9429, 60.1725),\n        Point.fromLngLat(24.9429, 60.1673),\n        Point.fromLngLat(24.9349, 60.1673),\n        Point.fromLngLat(24.9349, 60.1725),\n      )\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/SpaceStationLocationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.BitmapFactory\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSource\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.flyTo\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.model.IssModel\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\nimport retrofit2.Retrofit\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.GET\n\n/**\n * Display the space station's real-time location\n */\nclass SpaceStationLocationActivity : AppCompatActivity() {\n\n  private val handler = Handler(Looper.getMainLooper())\n  private var runnable: (() -> Unit) = {}\n  private var call: Call<IssModel>? = null\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this, MapInitOptions(context = this, styleUri = Style.STANDARD_SATELLITE))\n    setContentView(mapView)\n    mapboxMap = mapView.mapboxMap\n    mapboxMap.getStyle {\n      initSpaceStationSymbolLayer(it)\n      callApi()\n      showHintToast()\n    }\n\n    mapboxMap.setCamera(CameraOptions.Builder().zoom(2.0).build())\n  }\n\n  private fun showHintToast() = Toast.makeText(\n    this@SpaceStationLocationActivity,\n    R.string.space_station_toast,\n    Toast.LENGTH_LONG\n  ).show()\n\n  private fun callApi() {\n\n    // Build our client, The API we are using is very basic only returning a handful of\n    // information, mainly, the current latitude and longitude of the International Space Station.\n    val client = Retrofit.Builder()\n      .baseUrl(\"http://api.open-notify.org/\")\n      .addConverterFactory(GsonConverterFactory.create())\n      .build()\n    val service = client.create(IssApiService::class.java)\n\n    // A handler is needed to called the API every x amount of seconds.\n    runnable = {\n      call = service.loadLocation()\n      call?.enqueue(object : Callback<IssModel?> {\n\n        override fun onResponse(\n          call: Call<IssModel?>,\n          response: Response<IssModel?>\n        ) {\n\n          // We only need the latitude and longitude from the API.\n          val latitude = response.body()?.issPosition?.latitude\n          val longitude = response.body()?.issPosition?.longitude\n          if (latitude != null && longitude != null) {\n            updateMarkerPosition(longitude = longitude, latitude = latitude)\n          } else {\n            logW(TAG, \"Wrong response position\")\n          }\n        }\n\n        override fun onFailure(\n          call: Call<IssModel?>,\n          throwable: Throwable\n        ) {\n          // If retrofit fails or the API was unreachable, an error will be called.\n          // to check if throwable is null, then give a custom message.\n          if (throwable.message == null) {\n            logE(TAG, \"Http connection failed\")\n          } else {\n            logE(TAG, \"onFailure: ${throwable.message}\")\n          }\n        }\n      })\n\n      // Schedule the next execution time for this runnable.\n      handler.postDelayed(runnable, apiCallTime.toLong())\n    }\n\n    // The first time this runs we don't need a delay so we immediately post.\n    handler.post(runnable)\n  }\n\n  private fun initSpaceStationSymbolLayer(style: Style) {\n    style.addImage(\n      \"space-station-icon-id\",\n      BitmapFactory.decodeResource(\n        this.resources, R.drawable.iss\n      )\n    )\n\n    style.addSource(\n      geoJsonSource(\"source-id\") {\n        feature(Feature.fromGeometry(Point.fromLngLat(0.0, 0.0)))\n      }\n    )\n\n    style.addLayer(\n      symbolLayer(\"layer-id\", \"source-id\") {\n        iconImage(\"space-station-icon-id\")\n        iconIgnorePlacement(true)\n        iconAllowOverlap(true)\n        iconSize(.7)\n      }\n    )\n  }\n\n  private fun updateMarkerPosition(longitude: Double, latitude: Double) {\n    // This method is where we update the marker position once we have new coordinates. First we\n    // check if this is the first time we are executing this handler, the best way to do this is\n    // check if marker is null;\n\n    val geoPoint = Point.fromLngLat(longitude, latitude)\n\n    mapboxMap.getStyle {\n      val spaceStationSource = it.getSource(\"source-id\") as? GeoJsonSource\n      spaceStationSource?.featureCollection(\n        FeatureCollection.fromFeature(\n          Feature.fromGeometry(\n            geoPoint\n          )\n        )\n      )\n    }\n\n    // Lastly, animate the camera to the new position so the user\n    // wont have to search for the marker and then return.\n    mapboxMap.flyTo(\n      CameraOptions.Builder().center(geoPoint).build(),\n      mapAnimationOptions { duration(300) }\n    )\n  }\n\n  // Interface used for Retrofit.\n  fun interface IssApiService {\n    @GET(\"iss-now\")\n    fun loadLocation(): Call<IssModel>?\n  }\n\n  override fun onStart() {\n    super.onStart()\n    // When the user returns to the activity we want to resume the API calling.\n    handler.post(runnable)\n  }\n\n  override fun onStop() {\n    super.onStop()\n    // When the user leaves the activity, there is no need in calling the API since the map\n    // isn't in view.\n    handler.removeCallbacksAndMessages(null)\n    call?.cancel()\n  }\n\n  companion object {\n    private const val TAG = \"SpaceStationActivity\"\n\n    // apiCallTime is the time interval when we call the API in milliseconds, by default this is set\n    // to 2000 and you should only increase the value, reducing the interval will only cause server\n    // traffic, the latitude and longitude values aren't updated that frequently.\n    private const val apiCallTime = 2000\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/StandardStyleActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.google.android.material.snackbar.Snackbar\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgb\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.testapp.databinding.ActivityStandardStyleBinding\n\n/**\n * Example of working with style imports and the Standard style.\n * Additionally showcases the map interactions.\n */\nclass StandardStyleActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private val line = LineString.fromLngLats(LINE_COORDINATES)\n  private var lightSetting: LightPresets = LightPresets.DUSK\n  private var themeSetting: Theme = Theme.DEFAULT\n  private var labelsSetting = true\n  private var show3dObjectsSetting = true\n  private lateinit var binding: ActivityStandardStyleBinding\n\n  private var hotelPriceAlertBar: Snackbar? = null\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityStandardStyleBinding.inflate(layoutInflater)\n    mapboxMap = binding.mapView.mapboxMap\n    setContentView(binding.root)\n\n    // Set the camera options to center on New York City\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(LONGITUDE, LATITUDE))\n        .zoom(11.0)\n        .pitch(45.0)\n        .build()\n    )\n\n    // Load a style which imports Mapbox Standard as a basemap\n    mapboxMap.loadStyle(\n      style(style = STYLE_URL) {\n        // Create a new GeoJSON data source of the line's coordinates\n        +geoJsonSource(id = \"line-layer\") {\n          geometry(line)\n        }\n        // Create and apply basic styling to the fill layer, assign the layer to the \"middle\" slot\n        +lineLayer(layerId = \"line-layer\", sourceId = \"line-layer\") {\n          lineColor(rgb(255.0, 165.0, 0.0))\n          lineWidth(8.0)\n          // Order of adding layers matter. This line layer has the same slot as the water layer\n          // (see [STYLE_URL]) but it will be rendered on top of the water because it's added later.\n          slot(\"bottom\")\n        }\n      }\n    )\n    addOnClickListeners()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun addOnClickListeners() {\n    binding.mapView.mapboxMap.addInteraction(\n      ClickInteraction.featureset(\n        id = \"hotels-price\"\n      ) { selectedPriceLabel, _ ->\n        hotelPriceAlertBar = Snackbar.make(\n          binding.mapView,\n          \"Last selected hotel price: ${selectedPriceLabel.properties.getString(\"price\")}\",\n          Snackbar.LENGTH_INDEFINITE\n        ).apply {\n          show()\n        }\n        mapboxMap.setFeatureState(\n          selectedPriceLabel,\n          FeatureState {\n            addBooleanState(\"active\", true)\n          }\n        ) {\n          mapboxMap.getFeatureState(selectedPriceLabel) {\n            logI(TAG, \"getFeatureState returned state: ${it.asJsonString()}\")\n          }\n        }\n        // return true meaning we consume this click and\n        // do not dispatch it to the map interaction declared below\n        return@featureset true\n      }\n    )\n\n    binding.mapView.mapboxMap.addInteraction(\n      // handle click interactions on the map itself (outside of hotels' price POIs)\n      ClickInteraction { _ ->\n        hotelPriceAlertBar?.dismiss()\n        mapboxMap.resetFeatureStates(TypedFeaturesetDescriptor.Featureset(featuresetId = \"hotels-price\"))\n        return@ClickInteraction true\n      }\n    )\n\n    binding.fabThemeSetting.setOnClickListener {\n      mapboxMap.getStyle { style ->\n        themeSetting = when (themeSetting) {\n          Theme.DEFAULT -> Theme.FADED\n          Theme.FADED -> Theme.MONOCHROME\n          Theme.MONOCHROME -> Theme.DEFAULT\n        }\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"theme\",\n          themeSetting.value\n        )\n        showAction(it, themeSetting.value.toString())\n      }\n    }\n\n    // When a user clicks the light setting button change the `lightPreset` config property on the Standard style import\n    binding.fabLightSetting.setOnClickListener {\n      mapboxMap.getStyle { style ->\n        lightSetting = when (lightSetting) {\n          LightPresets.DAY -> LightPresets.DAWN\n          LightPresets.DAWN -> LightPresets.DUSK\n          LightPresets.DUSK -> LightPresets.NIGHT\n          LightPresets.NIGHT -> LightPresets.DAY\n        }\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"lightPreset\",\n          lightSetting.value\n        )\n        showAction(it, lightSetting.value.toString())\n      }\n    }\n\n    // When a user clicks the labels setting button change the label config properties on the Standard style import to show/hide them\n    // To identify which configuration properties are available on an imported style you can use `style.getStyleImportSchema()`\n    binding.fabLabelsSetting.setOnClickListener {\n      mapboxMap.getStyle { style ->\n        labelsSetting = !labelsSetting\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"showPlaceLabels\",\n          Value.valueOf(labelsSetting)\n        )\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"showRoadLabels\",\n          Value.valueOf(labelsSetting)\n        )\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"showPointInterestLabels\",\n          Value.valueOf(labelsSetting)\n        )\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"showTransitLabels\",\n          Value.valueOf(labelsSetting)\n        )\n        showAction(it, labelsSetting.toString())\n      }\n    }\n    binding.fab3dObjectsSetting.setOnClickListener {\n      mapboxMap.getStyle { style ->\n        show3dObjectsSetting = !show3dObjectsSetting\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"show3dObjects\",\n          Value.valueOf(show3dObjectsSetting)\n        )\n        showAction(it, show3dObjectsSetting.toString())\n      }\n    }\n  }\n\n  private fun showAction(it: View, value: String) {\n    Toast.makeText(\n      this@StandardStyleActivity,\n      it.contentDescription.toString() + value,\n      Toast.LENGTH_SHORT\n    ).show()\n  }\n\n  private enum class LightPresets(val value: Value) {\n    DAY(Value.valueOf(\"day\")),\n    DAWN(Value.valueOf(\"dawn\")),\n    DUSK(Value.valueOf(\"dusk\")),\n    NIGHT(Value.valueOf(\"night\"))\n  }\n\n  private enum class Theme(val value: Value) {\n    FADED(Value.valueOf(\"faded\")),\n    MONOCHROME(Value.valueOf(\"monochrome\")),\n    DEFAULT(Value.valueOf(\"default\"))\n  }\n\n  companion object {\n    private const val TAG = \"StandardStyleActivity\"\n\n    /**\n     * The ID used in [STYLE_URL] that references the `standard` style.\n     */\n    private const val IMPORT_ID_FOR_STANDARD_STYLE = \"standard\"\n    private const val LATITUDE = 40.72\n    private const val LONGITUDE = -73.99\n    private const val STYLE_URL = \"asset://fragment-realestate-NY.json\"\n\n    /**\n     * Boundary line between New York and New Jersey.\n     */\n    private val LINE_COORDINATES = listOf(\n      Point.fromLngLat(-73.91912400100642, 40.913503418907936),\n      Point.fromLngLat(-73.9615887363045, 40.82943110786286),\n      Point.fromLngLat(-74.01409059085539, 40.75461056309348),\n      Point.fromLngLat(-74.02798814058939, 40.69522028220487),\n      Point.fromLngLat(-74.05655532615407, 40.65188756398558),\n      Point.fromLngLat(-74.13916853846217, 40.64339339389301)\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/StandardStyleInteractionsActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.annotation.SuppressLint\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.view.Gravity\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.ViewGroup\nimport android.view.ViewGroup.LayoutParams.WRAP_CONTENT\nimport android.widget.TextView\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.ViewAnnotationAnchor\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.boolean\nimport com.mapbox.maps.interactions.standard.generated.StandardBuildings\nimport com.mapbox.maps.interactions.standard.generated.StandardBuildingsState\nimport com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState\nimport com.mapbox.maps.interactions.standard.generated.StandardPoiFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardPoiState\nimport com.mapbox.maps.interactions.standard.generated.StandardPoiStateKey\nimport com.mapbox.maps.interactions.standard.generated.standardBuildings\nimport com.mapbox.maps.interactions.standard.generated.standardPlaceLabels\nimport com.mapbox.maps.interactions.standard.generated.standardPoi\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.viewannotation.annotationAnchor\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\n\n/**\n * Interactive map elements when using experimental Mapbox Standard Style.\n */\n@OptIn(MapboxExperimental::class)\nclass StandardStyleInteractionsActivity : AppCompatActivity() {\n  private lateinit var mapboxMap: MapboxMap\n\n  @OptIn(MapboxDelicateApi::class)\n  @SuppressLint(\"SetTextI18n\")\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(\n      this,\n      MapInitOptions(\n        this,\n        cameraOptions = cameraOptions {\n          center(HELSINKI)\n          zoom(15.0)\n          pitch(30.0)\n        }\n      )\n    )\n    setContentView(mapView)\n    mapboxMap = mapView.mapboxMap\n    val map = mapView.mapboxMap\n    val selectedPoiList = mutableListOf<StandardPoiFeature>()\n\n    map.loadStyle(Style.STANDARD)\n\n    // the most basic use-case to highlight clicked building\n    map.addInteraction(\n      ClickInteraction.standardBuildings { selectedBuilding, _ ->\n        map.setFeatureState(\n          selectedBuilding,\n          StandardBuildingsState {\n            select(true)\n          }\n        )\n        return@standardBuildings true\n      }\n    )\n\n    // a bit more advanced use-case to fade a place label and also show a pop-up\n    // with clicked place label class\n    map.addInteraction(\n      ClickInteraction.standardPlaceLabels { selectedPlaceLabel, _ ->\n        Toast.makeText(this, selectedPlaceLabel.`class` ?: \"No class!\", Toast.LENGTH_SHORT).show()\n        map.setFeatureState(\n          selectedPlaceLabel,\n          StandardPlaceLabelsState {\n            select(true)\n          }\n        )\n        return@standardPlaceLabels true\n      }\n    )\n\n    // the most advanced use case to:\n    //  1. Hide clicked POI.\n    //  2. Show the Android View Annotation instead in the place where user clicked.\n    //  3. Clicking the Android View Annotation removes it and shows hidden POI again.\n    //  4. Text color of the Android View Annotation is driven by POI type: RED if it's transit and BLUE otherwise.\n    map.addInteraction(\n      ClickInteraction.standardPoi { selectedPoi, _ ->\n        map.setFeatureState(\n          selectedPoi,\n          StandardPoiState {\n            hide(true)\n          }\n        ) {\n          selectedPoiList.add(selectedPoi)\n          mapView.viewAnnotationManager.addViewAnnotation(\n            TextView(this).apply {\n              text = \"${selectedPoi.name}\\nGroup: ${selectedPoi.group}\"\n              if (selectedPoi.group == \"transit\") {\n                setTextColor(Color.RED)\n              } else {\n                setTextColor(Color.BLUE)\n              }\n              gravity = Gravity.CENTER\n              layoutParams = ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)\n              // when clicking on the view annotation - remove it and bring the map POI back\n              setOnClickListener { selectedPoiView ->\n                // check with getter to get the most actual state\n                map.getFeatureState(selectedPoi) { currentState ->\n                  if (currentState.hide == true) {\n                    // show POI again and remove the view annotation\n                    map.setFeatureState(\n                      selectedPoi,\n                      StandardPoiState {\n                        hide(false)\n                      }\n                    )\n                    mapView.viewAnnotationManager.removeViewAnnotation(selectedPoiView)\n                  }\n                }\n              }\n            },\n            viewAnnotationOptions {\n              geometry(selectedPoi.geometry)\n              annotationAnchor {\n                anchor(ViewAnnotationAnchor.CENTER)\n              }\n            }\n          )\n        }\n        return@standardPoi true\n      }\n    )\n\n    // when clicked on the map - remove the feature state from all selected POIs\n    // and show them as defined in Mapbox Standard Style\n    map.addInteraction(\n      ClickInteraction { _ ->\n        selectedPoiList.forEach { selectedPoi ->\n          map.removeFeatureState(\n            selectedPoi,\n            StandardPoiStateKey.HIDE\n          )\n        }\n        map.resetFeatureStateExpressions()\n        selectedPoiList.clear()\n        mapView.viewAnnotationManager.removeAllViewAnnotations()\n\n        Toast.makeText(this, \"Map clicked, removing selected POIs if any\", Toast.LENGTH_SHORT).show()\n        true\n      }\n    )\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_standard_style_interactions, menu)\n    return true\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.menu_action_select_all -> {\n        mapboxMap.setFeatureStateExpression(1, StandardBuildings(), boolean { literal(true) }, StandardBuildingsState.Builder().select(true).build())\n        true\n      }\n      else -> super.onOptionsItemSelected(item)\n    }\n  }\n\n  private companion object {\n    private val HELSINKI = Point.fromLngLat(24.94180921290157, 60.171227338006844)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/StyleCirclesCategoricallyActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.exponentialInterpolator\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.match\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.rgb\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.zoom\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.sources.generated.vectorSource\nimport com.mapbox.maps.extension.style.style\n\n/**\n * Add point data to a style from a vector tileset and use the match and\n * get expressions to assign the color of each point in a CircleLayer\n * based on a data property.\n */\nclass StyleCirclesCategoricallyActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapboxMap = mapView.mapboxMap\n    mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n\n        +vectorSource(\"ethnicity-source\") {\n          url(\"http://api.mapbox.com/v4/examples.8fgz4egr.json?access_token=\" + MapboxOptions.accessToken)\n        }\n\n        +circleLayer(\"population\", \"ethnicity-source\") {\n          sourceLayer(\"sf2010\")\n          circleRadius(\n            exponentialInterpolator(\n              base = 1.75,\n              input = zoom(),\n              stops = arrayOf(\n                literal(12) to literal(2),\n                literal(22) to literal(180)\n              )\n            )\n          )\n          circleColor(\n            match(\n              input = Expression.get(\"ethnicity\"),\n              stops = arrayOf(\n                literal(\"white\") to rgb(251.0, 176.0, 59.0),\n                literal(\"Black\") to rgb(34.0, 59.0, 83.0),\n                literal(\"Hispanic\") to rgb(229.0, 94.0, 94.0),\n                literal(\"Asian\") to rgb(59.0, 178.0, 208.0),\n                literal(\"Other\") to rgb(204.0, 204.0, 204.0),\n              ),\n              fallback = rgb(0.0, 0.0, 0.0)\n            )\n          )\n        }\n      }\n    ) {\n      mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(-122.447303, 37.753574))\n        .zoom(12.0)\n        .build()\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/StyleSwitchActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport android.webkit.URLUtil\nimport android.widget.EditText\nimport android.widget.Toast\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.testapp.databinding.ActivityStyleSwitchBinding\n\n/**\n * Example of changing style for a map in runtime.\n */\nclass StyleSwitchActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var binding: ActivityStyleSwitchBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityStyleSwitchBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(-0.1213, 51.5015))\n        .zoom(15.0)\n        .bearing(57.0)\n        .pitch(60.0)\n        .build()\n    )\n\n    // Instead of this you can add your default style to the map layout with xml attribute `app:mapbox_styleUri=\"mapbox://styles/streets-v12\"`\n    mapboxMap.loadStyle(Style.STANDARD)\n\n    binding.streetsButton.setOnClickListener {\n      mapboxMap.loadStyle(Style.MAPBOX_STREETS)\n    }\n    binding.lightButton.setOnClickListener {\n      mapboxMap.loadStyle(Style.LIGHT)\n    }\n    binding.darkButton.setOnClickListener {\n      mapboxMap.loadStyle(Style.DARK)\n    }\n    binding.customStyleButton.setOnClickListener {\n      showStyleInputDialog()\n    }\n    binding.satelliteButton.setOnClickListener {\n      mapboxMap.loadStyle(Style.SATELLITE)\n    }\n    binding.outdoorsButton.setOnClickListener {\n      mapboxMap.loadStyle(Style.OUTDOORS)\n    }\n    binding.standardButton.setOnClickListener {\n      mapboxMap.loadStyle(Style.STANDARD)\n    }\n    binding.standardSatelliteButton.setOnClickListener {\n      mapboxMap.loadStyle(Style.STANDARD_SATELLITE)\n    }\n  }\n\n  private fun showStyleInputDialog() {\n    val editText = EditText(this)\n    val dialog = AlertDialog.Builder(this)\n      .setTitle(\"Mapbox Style URL\")\n      .setMessage(\"Paste the “Share URL” for your public Mapbox style\")\n      .setView(editText)\n      .setPositiveButton(\"Save\") { _, _ ->\n        val input = editText.text.toString()\n        saveStyleURLInput(input)\n      }\n      .setNegativeButton(\"Cancel\", null)\n      .create()\n    dialog.show()\n  }\n\n  private fun saveStyleURLInput(input: String) {\n    if (input.isValidUri()) {\n      mapboxMap.loadStyle(input)\n    } else {\n      Toast.makeText(this, \"Invalid URL. Please check your Mapbox Studio Style URL.\", Toast.LENGTH_SHORT).show()\n    }\n  }\n\n  private fun String.isValidUri(): Boolean {\n    val isMapboxStyleUri = startsWith(\"mapbox://\", ignoreCase = true)\n    val isMapboxAssetUri = startsWith(\"asset://\", ignoreCase = true)\n    val isMapboxFileUri = startsWith(\"file://\", ignoreCase = true)\n    return isMapboxStyleUri || isMapboxAssetUri || isMapboxFileUri || URLUtil.isValidUrl(this)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/SurfaceActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.animation.ValueAnimator\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.graphics.BitmapFactory\nimport android.os.Bundle\nimport android.view.SurfaceHolder\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.*\nimport com.mapbox.maps.renderer.widget.BitmapWidget\nimport com.mapbox.maps.renderer.widget.WidgetPosition\nimport com.mapbox.maps.testapp.databinding.ActivitySurfaceBinding\n\n/**\n * Example integration with MapSurface through using SurfaceView directly.\n */\n@OptIn(MapboxExperimental::class)\nclass SurfaceActivity : AppCompatActivity(), SurfaceHolder.Callback {\n\n  private lateinit var surfaceHolder: SurfaceHolder\n  private lateinit var mapSurface: MapSurface\n  private val animator = ValueAnimator.ofFloat(0f, 1f).also {\n    it.duration = ANIMATION_DURATION\n    it.repeatCount = ValueAnimator.INFINITE\n  }\n\n  @SuppressLint(\"ClickableViewAccessibility\")\n  public override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivitySurfaceBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    // Setup map surface\n    surfaceHolder = binding.surface.holder\n    surfaceHolder.addCallback(this)\n    val mapOptions = MapInitOptions.getDefaultMapOptions(this).toBuilder().also {\n      it.contextMode(ContextMode.SHARED)\n    }.build()\n    val mapInitOptions = MapInitOptions(this, mapOptions = mapOptions)\n    mapSurface = MapSurface(\n      this,\n      surfaceHolder.surface,\n      mapInitOptions,\n    )\n\n    // Show tile borders to make sure widgets are still rendered as expected\n    mapSurface.mapboxMap.setDebug(\n      listOf(MapDebugOptions.TILE_BORDERS),\n      enabled = true\n    )\n\n    // Load a map style\n    mapSurface.mapboxMap.loadStyle(Style.STANDARD)\n\n    // Touch handling (verify plugin integration)\n    binding.surface.setOnTouchListener { _, event -> mapSurface.onTouchEvent(event) }\n    binding.surface.setOnGenericMotionListener { _, event -> mapSurface.onGenericMotionEvent(event) }\n\n    val widgetPosition = WidgetPosition\n      .Builder()\n      .setHorizontalAlignment(WidgetPosition.Horizontal.CENTER)\n      .setVerticalAlignment(WidgetPosition.Vertical.CENTER)\n      .build()\n    val rotatingWidget = LogoWidget(this, widgetPosition)\n    mapSurface.addWidget(rotatingWidget)\n    animator.addUpdateListener {\n      val angle = (it.animatedFraction * 360f) % 360f\n      rotatingWidget.setRotation(angle)\n    }\n    animator.start()\n\n    // add second widget to make sure both are rendered\n    val staticWidgetPosition = WidgetPosition\n      .Builder()\n      .setHorizontalAlignment(WidgetPosition.Horizontal.LEFT)\n      .setVerticalAlignment(WidgetPosition.Vertical.BOTTOM)\n      .setOffsetX(20f)\n      .setOffsetY(-20f)\n      .build()\n    mapSurface.addWidget(LogoWidget(this, staticWidgetPosition))\n  }\n\n  override fun surfaceCreated(holder: SurfaceHolder) {\n    mapSurface.surfaceCreated()\n  }\n\n  override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {\n    mapSurface.surfaceChanged(width, height)\n  }\n\n  override fun surfaceDestroyed(holder: SurfaceHolder) {\n    mapSurface.surfaceDestroyed()\n  }\n\n  override fun onStart() {\n    super.onStart()\n    mapSurface.onStart()\n  }\n\n  override fun onStop() {\n    super.onStop()\n    mapSurface.onStop()\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    mapSurface.onDestroy()\n  }\n\n  override fun onResume() {\n    super.onResume()\n    animator.resume()\n  }\n\n  override fun onPause() {\n    super.onPause()\n    animator.pause()\n  }\n\n  private companion object {\n    private const val ANIMATION_DURATION = 10000L\n  }\n\n  private class LogoWidget constructor(context: Context, position: WidgetPosition) : BitmapWidget(\n    BitmapFactory.decodeResource(context.resources, R.drawable.mapbox_logo_icon),\n    position,\n  )\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/SurfaceRecyclerViewActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityRecyclerBinding\n\n/**\n * Test activity showcasing how to integrate multiple SurfaceView MapViews in a RecyclerView.\n *\n * It requires calling the correct lifecycle methods when detaching and attaching the View to\n * the RecyclerView with onViewAttachedToWindow and onViewDetachedFromWindow.\n *\n */\n@SuppressLint(\"ClickableViewAccessibility\")\nclass SurfaceRecyclerViewActivity : AppCompatActivity() {\n\n  private lateinit var mapView: MapView\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityRecyclerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.recyclerView.layoutManager = LinearLayoutManager(this)\n    binding.recyclerView.adapter = ItemAdapter(this, LayoutInflater.from(this))\n  }\n\n  fun getMapItemLayoutId(): Int {\n    return R.layout.item_map\n  }\n\n  class ItemAdapter(\n    private val activity: SurfaceRecyclerViewActivity,\n    private val inflater: LayoutInflater\n  ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {\n\n    private val items = List(75) {\n      if (it == 4)\n        MapItem(Style.STANDARD)\n      else\n        \"Row $it\"\n    }\n\n    private var mapHolders: MutableList<MapHolder> = mutableListOf()\n\n    companion object {\n      const val TYPE_MAP = 0\n      const val TYPE_TEXT = 1\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {\n      return if (viewType == TYPE_MAP) {\n        activity.mapView = inflater.inflate(activity.getMapItemLayoutId(), parent, false) as MapView\n        val mapHolder = MapHolder(activity.mapView)\n        mapHolders.add(mapHolder)\n        return mapHolder\n      } else {\n        TextHolder(inflater.inflate(android.R.layout.simple_list_item_1, parent, false) as TextView)\n      }\n    }\n\n    override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder) {\n      super.onViewAttachedToWindow(holder)\n      if (holder is MapHolder) {\n        val mapView = holder.mapView\n        mapView.onStart()\n      }\n    }\n\n    override fun onViewDetachedFromWindow(holder: RecyclerView.ViewHolder) {\n      super.onViewDetachedFromWindow(holder)\n      if (holder is MapHolder) {\n        val mapView = holder.mapView\n        mapView.onStop()\n      }\n    }\n\n    override fun getItemCount(): Int {\n      return items.count()\n    }\n\n    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {\n      if (holder is TextHolder) {\n        holder.bind(items[position] as String)\n      } else if (holder is MapHolder) {\n        holder.bind(items[position] as MapItem)\n      }\n    }\n\n    override fun getItemViewType(position: Int): Int {\n      return if (items[position] is MapItem) {\n        TYPE_MAP\n      } else {\n        TYPE_TEXT\n      }\n    }\n\n    data class MapItem(val style: String)\n    class MapHolder(val mapView: MapView) : RecyclerView.ViewHolder(mapView) {\n\n      init {\n        // unfortunately, if there are multiple maps hosted in one activity, state saving is not possible\n        mapView.setOnTouchListener { view, motionEvent ->\n          // Disallow the touch request for recyclerView scroll\n          view.parent.requestDisallowInterceptTouchEvent(true)\n          mapView.onTouchEvent(motionEvent)\n          true\n        }\n      }\n\n      fun bind(mapItem: MapItem) {\n        mapView.gestures.scrollEnabled = false\n        mapView.mapboxMap.loadStyle(mapItem.style)\n      }\n    }\n  }\n\n  class TextHolder(private val textView: TextView) : RecyclerView.ViewHolder(textView) {\n    fun bind(item: String) {\n      this.textView.text = item\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/TextureViewActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.testapp.databinding.ActivityTextureViewBinding\n\n/**\n * Example of displaying a map using TextureView as render surface.\n */\nclass TextureViewActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityTextureViewBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(Style.STANDARD)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/TextureViewAnimateActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.animation.ObjectAnimator\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.testapp.databinding.ActivityTextureViewBinding\n\n/**\n * Example of applying animation to a map which renders to TextureView.\n */\nclass TextureViewAnimateActivity : AppCompatActivity() {\n\n  private val handler: Handler = Handler(Looper.getMainLooper())\n  private lateinit var animation: ObjectAnimator\n\n  private val places: Array<Point> = arrayOf(\n    Point.fromLngLat(-122.4194, 37.7749), // SF\n    Point.fromLngLat(-77.0369, 38.9072), // DC\n    Point.fromLngLat(4.8952, 52.3702), // AMS\n    Point.fromLngLat(24.9384, 60.1699), // HEL\n    Point.fromLngLat(-74.2236, -13.1639), // AYA\n    Point.fromLngLat(13.4050, 52.5200), // BER\n    Point.fromLngLat(77.5946, 12.9716), // BAN\n    Point.fromLngLat(121.4737, 31.2304), // SHA\n    Point.fromLngLat(27.56667, 53.9) // MSK\n  )\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityTextureViewBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    binding.mapView.mapboxMap.loadStyle(Style.STANDARD)\n    val cameraPlugin = binding.mapView.camera\n\n    for (i in places.indices) {\n      handler.postDelayed(\n        {\n          cameraPlugin.flyTo(\n            CameraOptions.Builder()\n              .center(places[i])\n              .zoom(14.0 - i)\n              .build(),\n            mapAnimationOptions { duration(DURATION_MS) }\n          )\n        },\n        i * DURATION_MS\n      )\n    }\n\n    // Animate the map view\n    animation = ObjectAnimator.ofFloat(\n      binding.mapView,\n      \"rotationY\",\n      0.0f,\n      360f\n    ).apply {\n      duration = 5_000L\n      repeatCount = ObjectAnimator.INFINITE\n      start()\n    }\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    animation.cancel()\n    handler.removeCallbacksAndMessages(null)\n  }\n\n  companion object {\n    private const val DURATION_MS = 10_000L\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/TintFillPatternActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Bitmap\nimport android.graphics.BitmapFactory\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.graphics.PorterDuff\nimport android.graphics.PorterDuffColorFilter\nimport android.os.Bundle\nimport androidx.annotation.ColorInt\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.eq\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.zoom\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.linearInterpolator\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityRtsFillPatternTintBinding\n\n/**\n * Add an image to a style and use it to display a pattern in the landuse\n * FillLayer in the Mapbox Streets style.\n */\nclass TintFillPatternActivity : AppCompatActivity() {\n\n  private lateinit var initialBitmap: Bitmap\n\n  public override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityRtsFillPatternTintBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    initialBitmap = BitmapFactory.decodeResource(resources, R.drawable.fill_pattern)\n\n    binding.fabPaint.setOnClickListener {\n      binding.mapView.mapboxMap.style?.apply {\n        addImage(FILL_PATTERN_ID, changeBitmapColor(initialBitmap, randomColor()))\n      }\n    }\n\n    binding.mapView.mapboxMap.loadStyle(\n      style(Style.MAPBOX_STREETS) {\n        +image(FILL_PATTERN_ID, changeBitmapColor(initialBitmap, randomColor()))\n        +fillLayer(FILL_LAYER_ID, STREETS_SOURCE_ID) {\n          sourceLayer(SOURCE_LAYER)\n          fillPattern(FILL_PATTERN_ID)\n          fillOpacity(\n            linearInterpolator(\n              input = zoom(),\n              stops = arrayOf(\n                literal(13.0) to literal(0.0),\n                literal(15.0) to literal(0.5),\n                literal(17.0) to literal(0.75)\n              )\n            )\n          )\n          filter(\n            eq {\n              get { literal(FILTER_FIELD) }\n              literal(FILTER_VALUE)\n            }\n          )\n        }\n      }\n    )\n  }\n\n  private fun changeBitmapColor(sourceBitmap: Bitmap, @ColorInt color: Int): Bitmap {\n    val config = sourceBitmap.config ?: return sourceBitmap\n    val resultBitmap: Bitmap = sourceBitmap.copy(config, true)\n    val paint = Paint()\n    paint.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)\n    val canvas = Canvas(resultBitmap)\n    canvas.drawBitmap(resultBitmap, 0f, 0f, paint)\n    return resultBitmap\n  }\n\n  private fun randomColor(): Int {\n    return (Math.random() * 16777215).toInt() or (0xFF shl 24)\n  }\n\n  companion object {\n    private const val FILL_LAYER_ID = \"fill_layer_id\"\n    private const val FILL_PATTERN_ID = \"fill_pattern_id\"\n    private const val STREETS_SOURCE_ID = \"composite\"\n    private const val SOURCE_LAYER = \"landuse\"\n    private const val FILTER_FIELD = \"class\"\n    private const val FILTER_VALUE = \"parking\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/TransparentBackgroundActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.net.Uri\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityTransparentBackgroundBinding\n\n/**\n * Example of using custom video as a background for MapView.\n * This is possible when using `texture_view` rendering for MapView because it supports alpha channel translucency.\n */\nclass TransparentBackgroundActivity : AppCompatActivity() {\n\n  private lateinit var binding: ActivityTransparentBackgroundBinding\n\n  private fun initVideoView() {\n    val path = \"android.resource://\" + packageName + \"/\" + R.raw.moving_background_water\n    binding.videoView.apply {\n      setVideoURI(Uri.parse(path))\n      start()\n      setOnCompletionListener { binding.videoView.start() }\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityTransparentBackgroundBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    binding.mapView.mapboxMap.loadStyle(\n      \"\"\"\n      {\n        \"version\": 8,\n        \"name\": \"Land\",\n        \"metadata\": {\n          \"mapbox:autocomposite\": true\n        },\n        \"sources\": {\n          \"composite\": {\n            \"url\": \"mapbox://mapbox.mapbox-terrain-v2\",\n            \"type\": \"vector\"\n          }\n        },\n        \"glyphs\": \"mapbox://fonts/mapbox/{fontstack}/{range}.pbf\",\n        \"layers\": [\n          {\n            \"layout\": {\n              \"visibility\": \"visible\"\n            },\n            \"type\": \"fill\",\n            \"source\": \"composite\",\n            \"id\": \"admin\",\n            \"paint\": {\n              \"fill-color\": \"hsl(359, 100%, 50%)\",\n              \"fill-opacity\": 1\n            },\n            \"source-layer\": \"landcover\"\n          },\n          {\n            \"layout\": {\n              \"visibility\": \"visible\"\n            },\n            \"type\": \"fill\",\n            \"source\": \"composite\",\n            \"id\": \"layer-0\",\n            \"paint\": {\n              \"fill-opacity\": 1,\n              \"fill-color\": \"hsl(359, 100%, 50%)\"\n            },\n            \"source-layer\": \"Layer_0\"\n          }\n        ]\n      }\n      \"\"\".trimIndent()\n    ) { initVideoView() }\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    binding.videoView.stopPlayback()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/VectorTileSourceActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.sources.generated.vectorSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.databinding.ActivityStyleVectorSourceBinding\n\n/**\n * Add a vector source to a map using an URL and visualize it with a line layer.\n */\nclass VectorTileSourceActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityStyleVectorSourceBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +vectorSource(\"terrain-data\") {\n          url(\"mapbox://mapbox.mapbox-terrain-v2\")\n        }\n        +lineLayer(\"terrain-data\", \"terrain-data\") {\n          sourceLayer(\"contour\")\n          lineJoin(LineJoin.ROUND)\n          lineCap(LineCap.ROUND)\n          lineColor(Color.parseColor(\"#ff69b4\"))\n          lineWidth(1.9)\n          slot(\"middle\")\n        }\n      }\n    ) {\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/ViewPagerActivity.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\n\npackage com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentStatePagerAdapter\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.testapp.databinding.ActivityViewpagerBinding\nimport com.mapbox.maps.testapp.examples.fragment.MapFragment\n\n/**\n * Test activity showcasing using the Android SDK ViewPager API to show MapFragments.\n */\nclass ViewPagerActivity : AppCompatActivity() {\n\n  private lateinit var binding: ActivityViewpagerBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityViewpagerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.viewPager.adapter = MapFragmentAdapter(supportFragmentManager)\n  }\n\n  override fun onRestoreInstanceState(savedInstanceState: Bundle) {\n    super.onRestoreInstanceState(savedInstanceState)\n    val currentPosition = binding.viewPager.currentItem\n    val offscreenLimit = binding.viewPager.offscreenPageLimit\n    for (i in currentPosition - offscreenLimit..currentPosition + offscreenLimit) {\n      if (i < 0 || i > binding.viewPager.adapter?.count ?: 0) {\n        continue\n      }\n      val mapFragment = binding.viewPager.adapter?.instantiateItem(binding.viewPager, i) as MapFragment\n      mapFragment.getMapAsync(i)\n    }\n  }\n\n  internal class MapFragmentAdapter(\n    fragmentManager: FragmentManager\n  ) : FragmentStatePagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n\n    override fun getCount(): Int {\n      return NUM_ITEMS\n    }\n\n    override fun getItem(position: Int): Fragment {\n      val fragment = MapFragment()\n      fragment.getMapAsync(position)\n      return fragment\n    }\n\n    override fun getPageTitle(position: Int): CharSequence {\n      return \"Page $position\"\n    }\n\n    companion object {\n      private const val NUM_ITEMS = 6\n    }\n  }\n}\n\nfun MapFragment.getMapAsync(index: Int) {\n  this.getMapAsync {\n    it.loadStyle(getStyleFromIndex(index))\n  }\n}\n\nfun getStyleFromIndex(index: Int): String {\n  return when (index) {\n    0 -> Style.STANDARD\n    1 -> Style.DARK\n    2 -> Style.SATELLITE\n    3 -> Style.LIGHT\n    4 -> Style.TRAFFIC_NIGHT\n    5 -> Style.STANDARD_SATELLITE\n    else -> Style.STANDARD\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/WithinExpressionActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.*\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.within\nimport com.mapbox.maps.extension.style.layers.addLayerBelow\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.camera\n\n/**\n * An Activity that showcases the within expression to filter features outside a geometry\n */\nclass WithinExpressionActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    val center = Point.fromLngLat(LON, LAT)\n\n    // Setup camera position above Georgetown\n    mapView.mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(center)\n        .zoom(15.5)\n        .build()\n    )\n\n    // Assume the route is represented by an array of coordinates.\n    val coordinates = listOf<Point>(\n      Point.fromLngLat(\n        -77.06866264343262,\n        38.90506061276737\n      ),\n      Point.fromLngLat(\n        -77.06283688545227,\n        38.905194197410545\n      ),\n      Point.fromLngLat(\n        -77.06285834312439,\n        38.906429843444094\n      ),\n      Point.fromLngLat(\n        -77.0630407333374,\n        38.90680554236621\n      )\n    )\n\n    // Create buffer around linestring\n    val bufferedRouteGeometry = bufferLineStringGeometry()\n\n    mapView.mapboxMap.loadStyle(\n      style(Style.MAPBOX_STREETS) {\n        +geoJsonSource(POINT_ID) {\n          geometry(LineString.fromLngLats(coordinates))\n        }\n        +geoJsonSource(FILL_ID) {\n          featureCollection(FeatureCollection.fromFeature(Feature.fromGeometry(bufferedRouteGeometry)))\n          buffer(0)\n          tolerance(0.0)\n        }\n        +layerAtPosition(\n          lineLayer(LINE_ID, POINT_ID) {\n            lineWidth(7.5)\n            lineColor(Color.LTGRAY)\n          },\n          below = POI_LABEL\n        )\n      }\n    ) { // Add fill layer to represent buffered LineString\n      it.addLayerBelow(\n        fillLayer(FILL_ID, FILL_ID) {\n          fillOpacity(0.12)\n          fillColor(Color.YELLOW)\n        },\n        LINE_ID\n      )\n\n      // Move to a new camera position\n      mapView.camera.easeTo(\n        CameraOptions.Builder()\n          .zoom(16.0)\n          .center(Point.fromLngLat(-77.06535338052844, 38.905156245642814))\n          .bearing(80.68015859462369)\n          .pitch(55.0)\n          .build(),\n        mapAnimationOptions {\n          duration(1750)\n          startDelay(2000)\n        }\n      )\n\n      // Show only POI labels inside geometry using within expression\n      val symbolLayer = it.getLayer(POI_LABEL) as SymbolLayer\n      symbolLayer.filter(within(bufferedRouteGeometry))\n\n      // Hide other types of labels to highlight POI labels\n      (it.getLayer(ROAD_LABEL) as SymbolLayer).visibility(\n        Visibility.NONE\n      )\n      (it.getLayer(TRANSIT_LABEL) as SymbolLayer).visibility(\n        Visibility.NONE\n      )\n      (it.getLayer(ROAD_NUMBER_SHIELD) as SymbolLayer).visibility(\n        Visibility.NONE\n      )\n    }\n  }\n\n  private fun bufferLineStringGeometry(): Polygon {\n    // TODO replace static data by Turf#Buffer: mapbox-java/issues/987\n    return FeatureCollection.fromJson(\n      \"\"\"\n    {\n      \"type\": \"FeatureCollection\",\n      \"features\": [\n        {\n          \"type\": \"Feature\",\n          \"properties\": {},\n          \"geometry\": {\n            \"type\": \"Polygon\",\n            \"coordinates\": [\n              [\n                [\n                  -77.06867337226866,\n                  38.90467655551809\n                ],\n                [\n                  -77.06233263015747,\n                  38.90479344272695\n                ],\n                [\n                  -77.06234335899353,\n                  38.906463238984344\n                ],\n                [\n                  -77.06290125846863,\n                  38.907206285691615\n                ],\n                [\n                  -77.06364154815674,\n                  38.90684728656818\n                ],\n                [\n                  -77.06326603889465,\n                  38.90637140121084\n                ],\n                [\n                  -77.06321239471436,\n                  38.905561553883246\n                ],\n                [\n                  -77.0691454410553,\n                  38.905436318935635\n                ],\n                [\n                  -77.06912398338318,\n                  38.90466820642439\n                ],\n                [\n                  -77.06867337226866,\n                  38.90467655551809\n                ]\n              ]\n            ]\n          }\n        }\n      ]\n    }\n      \"\"\".trimIndent()\n    ).features()!![0].geometry() as Polygon\n  }\n\n  companion object {\n    const val POINT_ID = \"point\"\n    const val FILL_ID = \"fill\"\n    const val LINE_ID = \"line\"\n    const val LAT = 38.90628988399711\n    const val LON = -77.06574689337494\n    const val POI_LABEL = \"poi-label\"\n    const val ROAD_LABEL = \"road-label\"\n    const val TRANSIT_LABEL = \"transit-label\"\n    const val ROAD_NUMBER_SHIELD = \"road-number-shield\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/WmsSourceActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.RasterLayer\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.rasterSource\nimport com.mapbox.maps.testapp.databinding.ActivityWmsSourceBinding\n\n/**\n * Adding an external Web Map Service layer to the map.\n */\nclass WmsSourceActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityWmsSourceBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.loadStyle(\n      Style.STANDARD\n    ) {\n      it.addSource(\n        rasterSource(WMS_SOURCE_ID) {\n          tileSize(256)\n          tileSet(TILESET_JSON, listOf(WMS_SOURCE_URL)) {}\n        }\n      )\n      it.addLayer(RasterLayer(RASTER_LAYER_ID, WMS_SOURCE_ID).slot(\"bottom\"))\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n  }\n\n  companion object {\n    const val WMS_SOURCE_URL = \"https://img.nj.gov/imagerywms/Natural2015?bbox={bbox-epsg-3857}\" +\n      \"&format=image/png&service=WMS&version=1.1.1&request=GetMap&srs=EPSG:3857\" +\n      \"&transparent=true&width=256&height=256&layers=Natural2015\"\n    const val WMS_SOURCE_ID = \"web-map-source\"\n    const val RASTER_LAYER_ID = \"web-map-layer\"\n    const val TILESET_JSON = \"tileset\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/annotation/AnimatePointAnnotationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.annotation\n\nimport android.animation.TypeEvaluator\nimport android.animation.ValueAnimator\nimport android.os.Bundle\nimport android.view.View\nimport android.view.animation.LinearInterpolator\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.animation.addListener\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CoordinateBounds\nimport com.mapbox.maps.MapLoaded\nimport com.mapbox.maps.MapLoadedCallback\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityAnnotationBinding\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\nimport com.mapbox.maps.toCameraOptions\nimport com.mapbox.turf.TurfMeasurement\nimport java.util.Random\n\n/**\n * Example showing how to add point annotations and animate them\n */\nclass AnimatePointAnnotationActivity : AppCompatActivity(), MapLoadedCallback {\n  private var pointAnnotationManager: PointAnnotationManager? = null\n  private var animateCarList = listOf<PointAnnotation>()\n  private val animators: MutableList<ValueAnimator> = mutableListOf()\n  private var noAnimateCarNum: Int = 10\n  private var animateCarNum: Int = 10\n  private var animateDuration = 5000L\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var binding: ActivityAnnotationBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityAnnotationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.apply {\n      setCamera(\n        cameraOptions {\n          center(\n            Point.fromLngLat(\n              LONGITUDE,\n              LATITUDE\n            )\n          )\n          zoom(12.0)\n        }\n      )\n      subscribeMapLoaded(this@AnimatePointAnnotationActivity)\n    }\n\n    binding.deleteAll.visibility = View.GONE\n    binding.changeStyle.visibility = View.GONE\n    binding.changeSlot.visibility = View.GONE\n  }\n\n  override fun run(eventData: MapLoaded) {\n    pointAnnotationManager = binding.mapView.annotations.createPointAnnotationManager().apply {\n      iconPitchAlignment = IconPitchAlignment.MAP\n      val carTop = bitmapFromDrawableRes(R.drawable.ic_car_top)\n      val noAnimationOptionList = List(noAnimateCarNum) {\n        PointAnnotationOptions()\n          .withPoint(getPointInBounds())\n          .withIconImage(carTop)\n      }\n      create(noAnimationOptionList)\n\n      val taxiTop = bitmapFromDrawableRes(R.drawable.ic_taxi_top)\n      val animationOptionList = List(animateCarNum) {\n        PointAnnotationOptions()\n          .withPoint(getPointInBounds())\n          .withIconImage(taxiTop)\n      }\n      animateCarList = create(animationOptionList)\n    }\n    animateCars()\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    cleanAnimation()\n  }\n\n  private fun animateCars() {\n    cleanAnimation()\n    val carEvaluator = CarEvaluator()\n    animateCarList.forEach { animatedCar ->\n      val nextPoint = getPointInBounds()\n      val animator =\n        ValueAnimator.ofObject(\n          carEvaluator,\n          animatedCar.point,\n          nextPoint\n        ).setDuration(animateDuration)\n      animatedCar.iconRotate = TurfMeasurement.bearing(animatedCar.point, nextPoint)\n      animator.interpolator = LinearInterpolator()\n      animator.addUpdateListener { valueAnimator ->\n        animatedCar.point = valueAnimator.animatedValue as Point\n      }\n      animator.start()\n      animators.add(animator)\n    }\n    // Endless repeat animations\n    animators[0].addListener(\n      onEnd = {\n        runOnUiThread {\n          animateCars()\n        }\n      }\n    )\n    animators[0].addUpdateListener {\n      // Update all annotations in batch\n      pointAnnotationManager?.update(animateCarList)\n    }\n  }\n\n  private fun getPointInBounds(): Point {\n    val bounds: CoordinateBounds =\n      mapboxMap.coordinateBoundsForCamera(mapboxMap.cameraState.toCameraOptions())\n    val generator = Random()\n    val lat =\n      bounds.southwest.latitude() + (bounds.northeast.latitude() - bounds.southwest.latitude()) * generator.nextDouble()\n    val lon =\n      bounds.southwest.longitude() + (bounds.northeast.longitude() - bounds.southwest.longitude()) * generator.nextDouble()\n    return Point.fromLngLat(lon, lat)\n  }\n\n  private fun cleanAnimation() {\n    animators.forEach {\n      it.removeAllListeners()\n      it.cancel()\n    }\n    animators.clear()\n  }\n\n  private class CarEvaluator : TypeEvaluator<Point> {\n    override fun evaluate(\n      fraction: Float,\n      startValue: Point,\n      endValue: Point\n    ): Point {\n      val lat =\n        startValue.latitude() + (endValue.latitude() - startValue.latitude()) * fraction\n      val lon =\n        startValue.longitude() + (endValue.longitude() - startValue.longitude()) * fraction\n      return Point.fromLngLat(lon, lat)\n    }\n  }\n\n  companion object {\n    private const val LATITUDE = 55.665957\n    private const val LONGITUDE = 12.550343\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/annotation/AnnotationUtils.kt",
    "content": "package com.mapbox.maps.testapp.examples.annotation\n\nimport android.content.Context\nimport android.widget.Toast\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.logE\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport okhttp3.Cache\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport java.io.File\nimport java.io.IOException\nimport java.util.*\n\n/**\n * Useful utilities used throughout the testapp.\n */\nobject AnnotationUtils {\n  private const val TAG = \"AnnotationUtils\"\n\n  val STYLES =\n    arrayOf(Style.STANDARD, Style.OUTDOORS, Style.LIGHT, Style.DARK, Style.SATELLITE_STREETS, Style.STANDARD_SATELLITE)\n  val SLOTS = arrayOf(\"top\", \"middle\", \"bottom\")\n\n  /**\n   * Show short toast message.\n   */\n  internal fun Context.showShortToast(string: String) {\n    Toast.makeText(this, string, Toast.LENGTH_SHORT).show()\n  }\n\n  /**\n   * Utility for getting a list of random points.\n   *\n   * @return a a list of random points\n   */\n  fun createRandomPoints(): List<Point> {\n    val random = Random()\n    val points: MutableList<Point> = ArrayList<Point>()\n    for (i in 0 until random.nextInt(8) + 2) {\n      points.add(\n        Point.fromLngLat(\n          random.nextDouble() * -360.0 + 180.0,\n          random.nextDouble() * -180.0 + 90.0\n        )\n      )\n    }\n    return points\n  }\n\n  /**\n   * Utility for getting a list of lists of random points\n   *\n   * @return a list of lists of random points\n   */\n  fun createRandomPointsList(): List<List<Point>> {\n    val random = Random()\n    val points = mutableListOf<Point>()\n    val firstLast = Point.fromLngLat(\n      random.nextDouble() * -360.0 + 180.0,\n      random.nextDouble() * -180.0 + 90.0\n    )\n    points.add(firstLast)\n    for (i in 0 until random.nextInt(6) + 4) {\n      points.add(\n        Point.fromLngLat(\n          random.nextDouble() * -360.0 + 180.0,\n          random.nextDouble() * -180.0 + 90.0\n        )\n      )\n    }\n    points.add(firstLast)\n    return listOf(points)\n  }\n\n  /**\n   * Utility for getting a random point\n   *\n   * @return a random point\n   */\n  fun createRandomPoint(): Point {\n    val random = Random()\n    return Point.fromLngLat(\n      random.nextDouble() * -360.0 + 180.0,\n      random.nextDouble() * -180.0 + 90.0\n    )\n  }\n\n  /**\n   * Load the string content from an assets file in the background\n   *\n   * @param context the context\n   * @param fileName the file to load\n   * @return the contents of the file\n   *\n   * @throws IOException if the given [fileName] can't be read\n   */\n  suspend fun loadStringFromAssets(context: Context, fileName: String): String =\n    withContext(Dispatchers.IO) {\n        context.assets.open(fileName).bufferedReader().readText()\n    }\n\n  /**\n   * Load the string content from net\n   *\n   * @param url the url of the file to load\n   */\n  fun loadStringFromNet(context: Context, url: String): String? {\n    val client = OkHttpClient.Builder()\n      .cache(Cache(File(context.externalCacheDir.toString(), \"cache\"), 10 * 1024 * 1024L))\n      .build()\n    val request: Request = Request.Builder()\n      .url(url)\n      .build()\n\n    return try {\n      val response = client.newCall(request).execute()\n      if (!response.isSuccessful) {\n        logE(TAG, \"HTTP error ${response.code} for $url\")\n        response.close()\n        return null\n      }\n      response.body?.string()\n    } catch (e: IOException) {\n      logE(TAG, \"Unable to download $url\")\n      null\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/camera/CameraPredefinedAnimatorsActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.camera\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.animation.AnticipateInterpolator\nimport android.view.animation.AnticipateOvershootInterpolator\nimport android.view.animation.BounceInterpolator\nimport android.widget.AdapterView\nimport android.widget.ArrayAdapter\nimport android.widget.Spinner\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.interpolator.view.animation.FastOutLinearInInterpolator\nimport androidx.interpolator.view.animation.FastOutSlowInInterpolator\nimport androidx.interpolator.view.animation.LinearOutSlowInInterpolator\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.animation.*\nimport com.mapbox.maps.plugin.animation.CameraAnimatorsFactory.Companion.DEFAULT_ANIMATION_DURATION_MS\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.animator.CameraAnimator\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityCameraPredefinedAnimatorsBinding\n\n/**\n * Example of using predefined animators with camera animation system.\n */\nclass CameraPredefinedAnimatorsActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var cameraAnimationsPlugin: CameraAnimationsPlugin\n\n  private var currentAnimators: Array<CameraAnimator<Any>> = arrayOf()\n  private var runningCancelableAnimator: Cancelable? = null\n  private lateinit var binding: ActivityCameraPredefinedAnimatorsBinding\n  private val animatorListener = object : AnimatorListenerAdapter() {\n    override fun onAnimationStart(animation: Animator) {\n      super.onAnimationStart(animation)\n      runOnUiThread {\n        binding.buttonCancel.visibility = View.VISIBLE\n      }\n    }\n\n    override fun onAnimationEnd(animation: Animator) {\n      super.onAnimationEnd(animation)\n      runOnUiThread {\n        binding.buttonCancel.visibility = View.INVISIBLE\n      }\n    }\n\n    override fun onAnimationCancel(animation: Animator) {\n      super.onAnimationCancel(animation)\n      runOnUiThread {\n        binding.buttonCancel.visibility = View.INVISIBLE\n      }\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityCameraPredefinedAnimatorsBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    cameraAnimationsPlugin = binding.mapView.camera\n    mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        mapboxMap.setCamera(START_CAMERA_POSITION)\n      }\n    )\n    binding.buttonCancel.setOnClickListener {\n      runningCancelableAnimator?.cancel()\n    }\n    initSpinner()\n  }\n\n  private fun initSpinner() {\n    val spinner: Spinner = findViewById(R.id.spinnerView)\n    val adapter = ArrayAdapter.createFromResource(\n      this, R.array.interpolators_array, R.layout.item_spinner_view\n    )\n    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)\n    spinner.adapter = adapter\n    spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {\n      override fun onNothingSelected(parent: AdapterView<*>?) {}\n\n      override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {\n        stopAnimation()\n        mapboxMap.setCamera(START_CAMERA_POSITION)\n        when (position) {\n          0 -> {\n            CameraAnimatorsFactory.setDefaultAnimatorOptions {\n              duration = DEFAULT_ANIMATION_DURATION_MS\n              interpolator = FastOutSlowInInterpolator()\n            }\n          }\n          1 -> {\n            CameraAnimatorsFactory.setDefaultAnimatorOptions {\n              duration = DEFAULT_ANIMATION_DURATION_MS\n              interpolator = CameraAnimatorsFactory.CUBIC_BEZIER_INTERPOLATOR\n            }\n          }\n          2 -> {\n            CameraAnimatorsFactory.setDefaultAnimatorOptions {\n              duration = DEFAULT_ANIMATION_DURATION_MS\n              interpolator = FastOutLinearInInterpolator()\n            }\n          }\n          3 -> {\n            CameraAnimatorsFactory.setDefaultAnimatorOptions {\n              duration = DEFAULT_ANIMATION_DURATION_MS\n              interpolator = LinearOutSlowInInterpolator()\n            }\n          }\n          4 -> {\n            CameraAnimatorsFactory.setDefaultAnimatorOptions {\n              duration = DEFAULT_ANIMATION_DURATION_MS\n              interpolator = BounceInterpolator()\n            }\n          }\n          5 -> {\n            CameraAnimatorsFactory.setDefaultAnimatorOptions {\n              duration = DEFAULT_ANIMATION_DURATION_MS\n              interpolator = AnticipateInterpolator()\n            }\n          }\n          6 -> {\n            CameraAnimatorsFactory.setDefaultAnimatorOptions {\n              duration = DEFAULT_ANIMATION_DURATION_MS\n              interpolator = AnticipateOvershootInterpolator()\n            }\n          }\n        }\n      }\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_predefined_animators, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    if (item.itemId != android.R.id.home) {\n      resetCameraPosition()\n      playAnimation(item.itemId)\n    }\n    return super.onOptionsItemSelected(item)\n  }\n\n  private fun resetCameraPosition() {\n    mapboxMap.setCamera(START_CAMERA_POSITION)\n  }\n\n  private fun stopAnimation() {\n    cameraAnimationsPlugin.cancelAllAnimators()\n    cameraAnimationsPlugin.unregisterAnimators(*currentAnimators)\n  }\n\n  private fun prepareAnimationOptions(duration: Long) = mapAnimationOptions {\n    duration(duration)\n  }\n\n  private fun playAnimation(itemId: Int) {\n    stopAnimation()\n    runningCancelableAnimator = when (itemId) {\n      R.id.menu_action_jump_to -> {\n        mapboxMap.setCamera(START_CAMERA_POSITION)\n        null\n      }\n      R.id.menu_action_ease_to ->\n        mapboxMap.easeTo(\n          EASE_TO_TARGET_CAMERA_POSITION,\n          prepareAnimationOptions(2000),\n          animatorListener\n        )\n      R.id.menu_action_fly_to ->\n        mapboxMap.flyTo(\n          EASE_TO_TARGET_CAMERA_POSITION,\n          prepareAnimationOptions(2000),\n          animatorListener\n        )\n      R.id.menu_action_pitch_by ->\n        mapboxMap.pitchBy(\n          70.0,\n          prepareAnimationOptions(2000),\n          animatorListener\n        )\n      R.id.menu_action_scale_by ->\n        mapboxMap.scaleBy(\n          15.0,\n          ScreenCoordinate(10.0, 10.0),\n          prepareAnimationOptions(2000),\n          animatorListener\n        )\n      R.id.menu_action_move_by ->\n        mapboxMap.moveBy(\n          ScreenCoordinate(500.0, 500.0),\n          prepareAnimationOptions(3000),\n          animatorListener\n        )\n      R.id.menu_action_rotate_by ->\n        mapboxMap.rotateBy(\n          ScreenCoordinate(0.0, 0.0),\n          ScreenCoordinate(500.0, 500.0),\n          prepareAnimationOptions(7000),\n          animatorListener\n        )\n      else -> null\n    }\n  }\n\n  companion object {\n\n    private val START_CAMERA_POSITION = cameraOptions {\n      center(Point.fromLngLat(-0.11968, 51.50325)) // Sets the new camera position\n      zoom(15.0) // Sets the zoom\n      bearing(0.0) // Rotate the camera\n      pitch(0.0) // Set the camera pitch\n    }\n\n    private val EASE_TO_TARGET_CAMERA_POSITION = cameraOptions {\n      center(Point.fromLngLat(-0.07520, 51.50550))\n      zoom(17.0)\n      bearing(180.0)\n      pitch(30.0)\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/camera/LowLevelCameraAnimatorActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.camera\n\nimport android.os.Bundle\nimport android.view.animation.AccelerateDecelerateInterpolator\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion.cameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.camera\n\nclass LowLevelCameraAnimatorActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapboxMap = mapView.mapboxMap\n    mapboxMap.setCamera(CAMERA_TARGET)\n    mapboxMap.loadStyle(\n      Style.STANDARD\n    ) {\n      mapView.camera.apply {\n        val bearing = createBearingAnimator(cameraAnimatorOptions(-45.0)) {\n          duration = 4000\n          interpolator = AccelerateDecelerateInterpolator()\n        }\n        val zoom = createZoomAnimator(\n          cameraAnimatorOptions(14.0) {\n            startValue(3.0)\n          }\n        ) {\n          duration = 4000\n          interpolator = AccelerateDecelerateInterpolator()\n        }\n        val pitch = createPitchAnimator(\n          cameraAnimatorOptions(55.0) {\n            startValue(0.0)\n          }\n        ) {\n          duration = 4000\n          interpolator = AccelerateDecelerateInterpolator()\n        }\n        playAnimatorsSequentially(zoom, pitch, bearing)\n      }\n    }\n  }\n\n  private companion object {\n    private val CAMERA_TARGET = cameraOptions {\n      center(Point.fromLngLat(-74.0060, 40.7128))\n      zoom(3.0)\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/camera/RestrictBoundsActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.camera\n\nimport android.annotation.SuppressLint\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.view.Gravity\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.CameraBoundsOptions\nimport com.mapbox.maps.CoordinateBounds\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.layers.getLayerAs\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityRestrictBoundsBinding\n\n/**\n * Test activity showcasing restricting user gestures to a bounds around Iceland, almost worldview and IDL.\n */\nclass RestrictBoundsActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var binding: ActivityRestrictBoundsBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityRestrictBoundsBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +geoJsonSource(BOUNDS_ID) {\n          featureCollection(FeatureCollection.fromFeatures(listOf()))\n        }\n        +fillLayer(BOUNDS_ID, BOUNDS_ID) {\n          fillColor(Color.RED)\n          fillOpacity(0.15)\n          visibility(Visibility.NONE)\n          slot(\"bottom\")\n        }\n      }\n    ) { setupBounds(SAN_FRANCISCO_BOUND) }\n    showCrosshair()\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_bounds, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.menu_action_san_francisco_bounds -> {\n        setupBounds(SAN_FRANCISCO_BOUND)\n        true\n      }\n      R.id.menu_action_allmost_world_bounds -> {\n        setupBounds(ALMOST_WORLD_BOUNDS)\n        true\n      }\n      R.id.menu_action_cross_idl -> {\n        setupBounds(CROSS_IDL_BOUNDS)\n        true\n      }\n      R.id.menu_action_reset -> {\n        setupBounds(INFINITE_BOUNDS)\n        true\n      }\n      R.id.menu_action_toggle_bounds -> {\n        toggleShowBounds()\n        true\n      }\n      else -> {\n        super.onOptionsItemSelected(item)\n      }\n    }\n  }\n\n  private fun toggleShowBounds() {\n    mapboxMap.getStyle {\n      val boundsFillLayer = it.getLayerAs<FillLayer>(BOUNDS_ID)!!\n      val visibility: Visibility = boundsFillLayer.visibility!!\n      when (visibility) {\n        Visibility.NONE -> boundsFillLayer.visibility(Visibility.VISIBLE)\n        Visibility.VISIBLE -> boundsFillLayer.visibility(Visibility.NONE)\n      }\n    }\n  }\n\n  private fun setupBounds(bounds: CameraBoundsOptions) {\n    mapboxMap.getStyle { style ->\n      setupBoundsArea(bounds, style)\n    }\n  }\n\n  private fun setupBoundsArea(boundsOptions: CameraBoundsOptions, style: Style) {\n    mapboxMap.setBounds(boundsOptions)\n    // In this example we always have bounds\n    val bounds = boundsOptions.bounds!!\n    if (!bounds.infiniteBounds) {\n      val northEast = bounds.northeast\n      val southWest = bounds.southwest\n      val northWest = Point.fromLngLat(southWest.longitude(), northEast.latitude())\n      val southEast = Point.fromLngLat(northEast.longitude(), southWest.latitude())\n      val boundsBox = listOf(northEast, southEast, southWest, northWest, northEast)\n      // Update the source with the new bounds\n      style.getSourceAs<GeoJsonSource>(BOUNDS_ID)!!.geometry(\n        // We only want one polygon: the box around the bounds\n        Polygon.fromLngLats(listOf(boundsBox))\n      )\n    }\n  }\n\n  private fun showCrosshair() {\n    val crosshair = View(this)\n    crosshair.layoutParams = FrameLayout.LayoutParams(10, 10, Gravity.CENTER)\n    crosshair.setBackgroundColor(Color.BLUE)\n    binding.mapView.addView(crosshair)\n  }\n\n  companion object {\n    private const val BOUNDS_ID = \"BOUNDS_ID\"\n    private val SAN_FRANCISCO_BOUND: CameraBoundsOptions = CameraBoundsOptions.Builder()\n      .bounds(\n        CoordinateBounds(\n          Point.fromLngLat(-122.66336, 37.492987),\n          Point.fromLngLat(-122.250481, 37.87165),\n          false\n        )\n      )\n      .minZoom(10.0)\n      .build()\n\n    private val ALMOST_WORLD_BOUNDS: CameraBoundsOptions = CameraBoundsOptions.Builder()\n      .bounds(\n        CoordinateBounds(\n          Point.fromLngLat(-170.0, -20.0),\n          Point.fromLngLat(170.0, 20.0),\n          false\n        )\n      )\n      .minZoom(2.0)\n      .build()\n\n    @SuppressLint(\"Range\")\n    private val CROSS_IDL_BOUNDS: CameraBoundsOptions = CameraBoundsOptions.Builder()\n      .bounds(\n        CoordinateBounds(\n          Point.fromLngLat(170.0202020, -20.0),\n          Point.fromLngLat(190.0, 20.0),\n          false\n        )\n      )\n      .minZoom(2.0)\n      .build()\n\n    private val INFINITE_BOUNDS: CameraBoundsOptions = CameraBoundsOptions.Builder()\n      .bounds(\n        CoordinateBounds(\n          Point.fromLngLat(0.0, 0.0),\n          Point.fromLngLat(0.0, 0.0),\n          true\n        )\n      )\n      .build()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/coroutines/featurestate/FeatureStateActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.coroutines.featurestate\n\nimport android.graphics.Color\nimport android.graphics.Rect\nimport android.os.Bundle\nimport android.view.Gravity\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.doOnLayout\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.QueriedFeature\nimport com.mapbox.maps.RenderedQueryGeometry\nimport com.mapbox.maps.RenderedQueryOptions\nimport com.mapbox.maps.ScreenBox\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.coroutine.cameraChangedCoalescedEvents\nimport com.mapbox.maps.coroutine.getFeatureState\nimport com.mapbox.maps.coroutine.queryRenderedFeatures\nimport com.mapbox.maps.coroutine.setFeatureState\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.switchCase\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport com.mapbox.maps.testapp.databinding.ActivityFeatureStateBinding\nimport kotlinx.coroutines.flow.distinctUntilChangedBy\nimport kotlinx.coroutines.flow.fold\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport java.text.DateFormat.getDateTimeInstance\nimport java.text.SimpleDateFormat\nimport java.util.Calendar\nimport java.util.Date\nimport java.util.Locale\nimport java.util.TimeZone\nimport kotlin.coroutines.resume\n\n/**\n * Example showcasing usage of feature state.\n */\nclass FeatureStateActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var crosshair: View\n  private lateinit var binding: ActivityFeatureStateBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityFeatureStateBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    mapboxMap = binding.mapView.mapboxMap\n    binding.mapView.scalebar.enabled = false\n    mapboxMap.loadStyle(createStyle()) {\n      mapboxMap.setCamera(\n        cameraOptions {\n          center(CAMERA_CENTER)\n          zoom(CAMERA_ZOOM)\n        }\n      )\n    }\n    showCrosshair()\n\n    lifecycleScope.launch {\n      repeatOnLifecycle(Lifecycle.State.STARTED) {\n        highlightFeatureOnHover()\n      }\n    }\n  }\n\n  /**\n   * Wait for the first layout pass to get the [ScreenBox] of the crosshair.\n   */\n  private suspend fun getCrosshairScreenBox() = suspendCancellableCoroutine { cont ->\n    binding.mapView.doOnLayout {\n      val rect = Rect()\n      crosshair.getDrawingRect(rect)\n      binding.mapView.offsetDescendantRectToMyCoords(crosshair, rect)\n      val screenBox = ScreenBox(\n        ScreenCoordinate(rect.left.toDouble(), rect.top.toDouble()),\n        ScreenCoordinate(rect.right.toDouble(), rect.bottom.toDouble())\n      )\n      cont.resume(screenBox)\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private suspend fun highlightFeatureOnHover() {\n    val crosshairScreenBox = getCrosshairScreenBox()\n\n    // Observe camera changes and query the rendered features under the crosshair.\n    mapboxMap.cameraChangedCoalescedEvents\n      .map { _ ->\n        mapboxMap\n          .queryRenderedFeatures(\n            RenderedQueryGeometry(crosshairScreenBox),\n            RenderedQueryOptions(listOf(LAYER_ID), literal(true))\n          ).value?.firstOrNull()?.queriedFeature\n      }\n      .distinctUntilChangedBy { queriedFeature ->\n        queriedFeature?.feature?.id()\n      }\n      .fold(null) { lastFeatureId: String?, queriedFeature: QueriedFeature? ->\n        // Clear the state of the last feature\n        lastFeatureId?.let { lastId ->\n          setHoverFeatureState(lastId, false)\n        }\n\n        val selectedFeature = queriedFeature?.feature\n        val selectedFeatureId = selectedFeature?.id()\n        if (selectedFeatureId != null) {\n          setHoverFeatureState(selectedFeatureId, true)\n          logHoverFeatureState(selectedFeatureId)\n\n          // Update Magnitude, location and date text view.\n          val time = selectedFeature.getNumberProperty(\"time\")\n          binding.date.text = getDateTime(time.toLong())\n          binding.location.text = if (selectedFeature.hasNonNullValueForProperty(\"place\")) {\n            selectedFeature.getStringProperty(\"place\")\n          } else {\n            \"N/A\"\n          }\n          binding.magnitude.text = if (selectedFeature.hasNonNullValueForProperty(\"mag\")) {\n            selectedFeature.getNumberProperty(\"mag\").toString()\n          } else {\n            \"N/A\"\n          }\n        }\n\n        // Pass this id to the next iteration of the fold\n        queriedFeature?.feature?.id()\n      }\n  }\n\n  private suspend fun setHoverFeatureState(featureId: String, hover: Boolean) {\n    mapboxMap.setFeatureState(\n      sourceId = SOURCE_ID,\n      featureId = featureId,\n      state = Value(\n        hashMapOf(\n          \"hover\" to Value(hover)\n        )\n      )\n    )\n  }\n\n  private suspend fun logHoverFeatureState(featureId: String) {\n    val featureState = mapboxMap.getFeatureState(\n      sourceId = SOURCE_ID,\n      featureId = featureId,\n    )\n\n    logD(TAG, \"getFeatureState: ${featureState.value}\")\n  }\n\n  private fun showCrosshair() {\n    crosshair = View(this)\n    crosshair.layoutParams = FrameLayout.LayoutParams(20, 20, Gravity.CENTER)\n    crosshair.setBackgroundColor(Color.RED)\n    binding.mapView.addView(crosshair)\n  }\n\n  private fun getDateTime(time: Long): String = try {\n    val sdf = getDateTimeInstance()\n    val netDate = Date(time)\n    sdf.format(netDate)\n  } catch (e: Exception) {\n    e.toString()\n  }\n\n  private fun createStyle() = style(style = Style.STANDARD) {\n    +geoJsonSource(id = SOURCE_ID) {\n      data(GEOJSON_URL)\n      cluster(false)\n      generateId(true)\n    }\n    +circleLayer(layerId = LAYER_ID, sourceId = SOURCE_ID) {\n      circleRadius(\n        switchCase {\n          boolean {\n            featureState {\n              literal(\"hover\")\n            }\n            literal(false)\n          }\n          interpolate {\n            linear()\n            get(\"mag\")\n            stop {\n              literal(1.0)\n              literal(8.0)\n            }\n            stop {\n              literal(1.5)\n              literal(10.0)\n            }\n            stop {\n              literal(2.0)\n              literal(12.0)\n            }\n            stop {\n              literal(2.5)\n              literal(14.0)\n            }\n            stop {\n              literal(3.0)\n              literal(16.0)\n            }\n            stop {\n              literal(3.5)\n              literal(18.0)\n            }\n            stop {\n              literal(4.5)\n              literal(20.0)\n            }\n            stop {\n              literal(6.5)\n              literal(22.0)\n            }\n            stop {\n              literal(8.5)\n              literal(24.0)\n            }\n            stop {\n              literal(10.5)\n              literal(26.0)\n            }\n          }\n          literal(5.0)\n        }\n      )\n      circleStrokeColor(Color.BLACK)\n      circleStrokeWidth(1.0)\n      circleColor(\n        switchCase {\n          boolean {\n            featureState {\n              literal(\"hover\")\n            }\n            literal(false)\n          }\n          interpolate {\n            linear()\n            get(\"mag\")\n            stop {\n              literal(1.0)\n              literal(\"#fff7ec\")\n            }\n            stop {\n              literal(1.5)\n              literal(\"#fee8c8\")\n            }\n            stop {\n              literal(2.0)\n              literal(\"#fdd49e\")\n            }\n            stop {\n              literal(2.5)\n              literal(\"#fdbb84\")\n            }\n            stop {\n              literal(3.0)\n              literal(\"#fc8d59\")\n            }\n            stop {\n              literal(3.5)\n              literal(\"#ef6548\")\n            }\n            stop {\n              literal(4.5)\n              literal(\"#d7301f\")\n            }\n            stop {\n              literal(6.5)\n              literal(\"#b30000\")\n            }\n            stop {\n              literal(8.5)\n              literal(\"#7f0000\")\n            }\n            stop {\n              literal(10.5)\n              literal(\"#000\")\n            }\n          }\n          literal(\"#000\")\n        }\n      )\n    }\n  }\n\n  companion object {\n    /**\n     * Use data from the USGS Earthquake Catalog API, which returns information about recent earthquakes,\n     * including the magnitude, location, and the time at which the earthquake happened.\n     */\n    private val GEOJSON_URL =\n      \"https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&eventtype=earthquake&minmagnitude=1&starttime=${\n        // Get the date seven days ago as an ISO 8601 timestamp, as required by the USGS Earthquake Catalog API.\n        SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss'Z'\", Locale.US).apply {\n          timeZone = TimeZone.getTimeZone(\"UTC\")\n        }.format(\n          Calendar.getInstance().apply {\n            add(Calendar.DATE, -7)\n          }.time\n        )\n      }\"\n    private const val LAYER_ID = \"earthquakes-viz\"\n    private const val SOURCE_ID = \"earthquakes\"\n    private val CAMERA_CENTER = Point.fromLngLat(-122.44121, 37.76132)\n    private const val CAMERA_ZOOM = 3.5\n    private const val TAG = \"FeatureStateActivity\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/CustomLayerActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.CustomLayer\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.customLayer\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityCustomLayerBinding\n\n/**\n * Test activity showcasing the Custom Layer API\n */\nclass CustomLayerActivity : AppCompatActivity() {\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var binding: ActivityCustomLayerBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityCustomLayerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +customLayer(\n          layerId = CUSTOM_LAYER_ID,\n          host = ExampleCustomLayer()\n        ).slot(\"top\")\n      }\n    ) {\n      mapboxMap.setCamera(\n        cameraOptions {\n          center(Point.fromLngLat(116.39053, 39.91448))\n          pitch(0.0)\n          bearing(0.0)\n          zoom(10.0)\n        }\n      )\n      initFab()\n    }\n  }\n\n  private fun initFab() {\n    binding.fab.setOnClickListener {\n      swapCustomLayer()\n    }\n  }\n\n  private fun swapCustomLayer() {\n    mapboxMap.style?.let { style ->\n      if (style.styleLayerExists(CUSTOM_LAYER_ID)) {\n        style.removeStyleLayer(CUSTOM_LAYER_ID)\n        binding.fab.setImageResource(R.drawable.ic_layers)\n      } else {\n        style.addLayer(\n          CustomLayer(CUSTOM_LAYER_ID, ExampleCustomLayer()).slot(\"bottom\")\n        )\n        binding.fab.setImageResource(R.drawable.ic_layers_clear)\n      }\n    }\n  }\n\n  private fun updateLayer() {\n    mapboxMap.triggerRepaint()\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_custom_layer, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.action_update_layer -> {\n        updateLayer()\n        true\n      }\n\n      R.id.action_set_color_red -> {\n        ExampleCustomLayer.color = floatArrayOf(1.0f, 0.0f, 0.0f, 1.0f)\n        true\n      }\n\n      R.id.action_set_color_green -> {\n        ExampleCustomLayer.color = floatArrayOf(0.0f, 1.0f, 0.0f, 1.0f)\n        true\n      }\n\n      R.id.action_set_color_blue -> {\n        ExampleCustomLayer.color = floatArrayOf(0.0f, 0.0f, 1.0f, 1.0f)\n        true\n      }\n\n      else -> super.onOptionsItemSelected(item)\n    }\n  }\n\n  companion object {\n    private const val CUSTOM_LAYER_ID = \"customId\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/ExampleCustomLayer.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer\n\nimport android.opengl.GLES20\nimport com.mapbox.maps.CustomLayerHost\nimport com.mapbox.maps.CustomLayerRenderParameters\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.testapp.BuildConfig\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport java.nio.FloatBuffer\n\nclass ExampleCustomLayer : CustomLayerHost {\n  private var program = 0\n  private var positionHandle = 0\n  private var colorHandle = 0\n  private var vertexShader = 0\n  private var fragmentShader = 0\n\n  private val vertexBuffer: FloatBuffer by lazy {\n    // initialize vertex byte buffer for shape coordinates\n    // (number of coordinate values * 4 bytes per float)\n    ByteBuffer.allocateDirect(BACKGROUND_COORDINATES.size * BYTES_PER_FLOAT).run {\n      // use the device hardware's native byte order\n      order(ByteOrder.nativeOrder())\n\n      // create a floating point buffer from the ByteBuffer\n      asFloatBuffer().apply {\n        // add the coordinates to the FloatBuffer\n        put(BACKGROUND_COORDINATES)\n        // set the buffer to read the first coordinate\n        rewind()\n      }\n    }\n  }\n\n  override fun initialize() {\n    logD(TAG) {\n      val maxAttrib = IntArray(1)\n      GLES20.glGetIntegerv(GLES20.GL_MAX_VERTEX_ATTRIBS, maxAttrib, 0)\n      \"Max vertex attributes: ${maxAttrib[0]}\"\n    }\n\n    // load and compile shaders\n    vertexShader = loadShader(\n      GLES20.GL_VERTEX_SHADER,\n      VERTEX_SHADER_CODE\n    ).also { checkCompileStatus(it) }\n\n    fragmentShader = loadShader(\n      GLES20.GL_FRAGMENT_SHADER,\n      FRAGMENT_SHADER_CODE\n    ).also { checkCompileStatus(it) }\n\n    // create empty OpenGL ES Program\n    program = GLES20.glCreateProgram().also {\n      checkError(\"glCreateProgram\")\n      // add the vertex shader to program\n      GLES20.glAttachShader(it, vertexShader).also { checkError(\"glAttachShader\") }\n\n      // add the fragment shader to program\n      GLES20.glAttachShader(it, fragmentShader).also { checkError(\"glAttachShader\") }\n\n      // creates OpenGL ES program executables\n      GLES20.glLinkProgram(it).also {\n        checkError(\"glLinkProgram\")\n      }\n    }\n\n    // get handle to vertex shader's vPosition member\n    positionHandle =\n      GLES20.glGetAttribLocation(program, \"a_pos\").also { checkError(\"glGetAttribLocation\") }\n\n    // get handle to fragment shader's vColor member\n    colorHandle = GLES20.glGetUniformLocation(program, \"fill_color\")\n      .also { checkError(\"glGetUniformLocation\") }\n  }\n\n  override fun render(parameters: CustomLayerRenderParameters) {\n    if (program != 0) {\n      // Add program to OpenGL ES environment\n      GLES20.glUseProgram(program).also { checkError(\"glUseProgram\") }\n\n      GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, positionHandle)\n\n      // Enable a handle to the vertices\n      GLES20.glEnableVertexAttribArray(positionHandle)\n        .also { checkError(\"glEnableVertexAttribArray\") }\n\n      // Prepare the coordinate data\n      GLES20.glVertexAttribPointer(\n        positionHandle, COORDS_PER_VERTEX,\n        GLES20.GL_FLOAT, false,\n        VERTEX_STRIDE, vertexBuffer\n      ).also { checkError(\"glVertexAttribPointer\") }\n\n      // Set color for drawing the background\n      GLES20.glUniform4fv(colorHandle, 1, color, 0).also { checkError(\"glUniform4fv\") }\n\n      // Draw the background\n      GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, VERTEX_COUNT)\n        .also { checkError(\"glDrawArrays\") }\n    }\n  }\n\n  override fun contextLost() {\n    logW(TAG, \"contextLost\")\n    program = 0\n  }\n\n  override fun deinitialize() {\n    if (program != 0) {\n      // Disable vertex array\n      GLES20.glDisableVertexAttribArray(positionHandle)\n      GLES20.glDetachShader(program, vertexShader)\n      GLES20.glDetachShader(program, fragmentShader)\n      GLES20.glDeleteShader(vertexShader)\n      GLES20.glDeleteShader(fragmentShader)\n      GLES20.glDeleteProgram(program)\n      program = 0\n    }\n  }\n\n  private fun checkCompileStatus(shader: Int) {\n    if (BuildConfig.DEBUG) {\n      val isCompiled = IntArray(1)\n      GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, isCompiled, 0)\n      if (isCompiled[0] == GLES20.GL_FALSE) {\n        val infoLog = GLES20.glGetShaderInfoLog(program)\n        throw RuntimeException(\"checkCompileStatus error: $infoLog\")\n      }\n    }\n  }\n\n  companion object {\n    private const val TAG = \"ExampleCustomLayer\"\n\n    // number of coordinates per vertex in this array\n    private const val COORDS_PER_VERTEX = 2\n    private const val BYTES_PER_FLOAT = 4\n    private const val VERTEX_STRIDE = COORDS_PER_VERTEX * BYTES_PER_FLOAT // 4 bytes per vertex\n    private val BACKGROUND_COORDINATES = floatArrayOf( // in counterclockwise order:\n      -1.0f, -1.0f,\n      1.0f, -1.0f,\n      -1.0f, 1.0f,\n      1.0f, 1.0f\n    )\n    private val VERTEX_COUNT = BACKGROUND_COORDINATES.size / COORDS_PER_VERTEX\n\n    // Set color with red, green, blue and alpha (opacity) values\n    var color = floatArrayOf(0.0f, 1.0f, 0.0f, 1.0f)\n\n    private val VERTEX_SHADER_CODE = \"\"\"\n      attribute vec2 a_pos;\n      void main() {\n        gl_Position = vec4(a_pos, 0.0, 1.0);\n      }\n    \"\"\".trimIndent()\n\n    private val FRAGMENT_SHADER_CODE = \"\"\"\n      precision mediump float;\n      uniform vec4 fill_color;\n      void main() {\n        gl_FragColor = fill_color;\n      }\n    \"\"\".trimIndent()\n\n    private fun loadShader(type: Int, shaderCode: String): Int {\n      // create a vertex shader type (GLES20.GL_VERTEX_SHADER)\n      // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)\n      return GLES20.glCreateShader(type).also { shader ->\n\n        // add the source code to the shader and compile it\n        GLES20.glShaderSource(shader, shaderCode)\n        GLES20.glCompileShader(shader)\n      }\n    }\n\n    private fun checkError(cmd: String? = null) {\n      if (BuildConfig.DEBUG) {\n        when (val error = GLES20.glGetError()) {\n          GLES20.GL_NO_ERROR -> {\n            logD(TAG, \"$cmd -> no error\")\n          }\n          GLES20.GL_INVALID_ENUM -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_ENUM\")\n          GLES20.GL_INVALID_VALUE -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_VALUE\")\n          GLES20.GL_INVALID_OPERATION -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_OPERATION\")\n          GLES20.GL_INVALID_FRAMEBUFFER_OPERATION -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_FRAMEBUFFER_OPERATION\")\n          GLES20.GL_OUT_OF_MEMORY -> throw RuntimeException(\"$cmd -> error in gl: GL_OUT_OF_MEMORY\")\n          else -> throw RuntimeException(\"$cmd -> error in gl: $error\")\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/NativeCustomLayerActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.CustomLayer\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.customLayer\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityCustomLayerBinding\n\n/**\n * Test activity showcasing the Custom Layer API where [CustomLayerHost] is implemented in C++.\n *\n * Additionally we make use of `slot` here initially placing custom layer in the \"middle\"\n * and placing it in the \"bottom\" when turning it on / off.\n */\nclass NativeCustomLayerActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private val nativeCustomLayer = NativeExampleCustomLayer()\n  private lateinit var binding: ActivityCustomLayerBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityCustomLayerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +customLayer(\n          layerId = CUSTOM_LAYER_ID,\n          host = nativeCustomLayer\n        ) {\n          slot(\"middle\")\n        }\n      }\n    ) {\n      mapboxMap.setCamera(\n        cameraOptions {\n          center(Point.fromLngLat(116.39053, 39.91448))\n          pitch(0.0)\n          bearing(0.0)\n          zoom(10.0)\n        }\n      )\n      initFab()\n    }\n  }\n\n  private fun initFab() {\n    binding.fab.setOnClickListener {\n      swapCustomLayer()\n    }\n  }\n\n  private fun swapCustomLayer() {\n    mapboxMap.style?.let { style ->\n      if (style.styleLayerExists(CUSTOM_LAYER_ID)) {\n        style.removeStyleLayer(CUSTOM_LAYER_ID)\n        binding.fab.setImageResource(R.drawable.ic_layers)\n      } else {\n        style.addLayer(\n          CustomLayer(CUSTOM_LAYER_ID, nativeCustomLayer).apply { slot(\"bottom\") },\n        )\n        binding.fab.setImageResource(R.drawable.ic_layers_clear)\n      }\n    }\n  }\n\n  private fun updateLayer() {\n    mapboxMap.triggerRepaint()\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_custom_layer, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.action_update_layer -> {\n        updateLayer()\n        true\n      }\n      R.id.action_set_color_red -> {\n        nativeCustomLayer.setColor(1.0f, 0.0f, 0.0f, 1.0f)\n        true\n      }\n      R.id.action_set_color_green -> {\n        nativeCustomLayer.setColor(0.0f, 1.0f, 0.0f, 1.0f)\n        true\n      }\n      R.id.action_set_color_blue -> {\n        nativeCustomLayer.setColor(0.0f, 0.0f, 1.0f, 1.0f)\n        true\n      }\n      else -> super.onOptionsItemSelected(item)\n    }\n  }\n\n  companion object {\n    private const val CUSTOM_LAYER_ID = \"customId\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/NativeExampleCustomLayer.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer\n\nimport androidx.annotation.Keep\nimport com.mapbox.maps.CustomLayerHost\nimport com.mapbox.maps.CustomLayerRenderParameters\n\n@Keep\nclass NativeExampleCustomLayer : CustomLayerHost {\n  external override fun initialize()\n\n  external override fun render(parameters: CustomLayerRenderParameters)\n\n  external override fun contextLost()\n\n  external override fun deinitialize()\n\n  external fun setColor(red: Float, green: Float, blue: Float, alpha: Float)\n\n  companion object {\n    init {\n      System.loadLibrary(\"example-cpp-custom-layer\")\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/TriangleCustomLayer.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer\n\nimport android.opengl.GLES20\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.testapp.BuildConfig\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.pow\n\nclass TriangleCustomLayer : CustomLayerHost {\n  private var program = 0\n  private var vertexShader = 0\n  private var fragmentShader = 0\n  private var positionHandle = 0\n  private var colorHandle = 0\n  private var projectionMatrixHandle = 0\n\n  // initialize vertex byte buffer for shape coordinates\n  // (number of coordinate values * 4 bytes per float)\n  private val vertexBuffer =\n    ByteBuffer.allocateDirect(VERTEX_COUNT * COORDS_PER_VERTEX * BYTES_PER_FLOAT).run {\n      // use the device hardware's native byte order\n      order(ByteOrder.nativeOrder())\n      // create a floating point buffer from the ByteBuffer\n      asFloatBuffer()\n    }\n\n  // initialize vertex byte buffer for color\n  // (number of color values * 4 bytes per float)\n  private val colorBuffer =\n    ByteBuffer.allocateDirect(COLOR_COUNT * COLOR_SIZE * BYTES_PER_FLOAT).run {\n      // use the device hardware's native byte order\n      order(ByteOrder.nativeOrder())\n      // create a floating point buffer from the ByteBuffer\n      asFloatBuffer()\n    }\n\n  override fun initialize() {\n    vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, VERTEX_SHADER_CODE).also {\n      checkCompileStatus(it)\n    }\n    fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER_CODE).also {\n      checkCompileStatus(it)\n    }\n    program = GLES20.glCreateProgram().also {\n      // add the vertex shader to program\n      GLES20.glAttachShader(it, vertexShader)\n      // add the fragment shader to program\n      GLES20.glAttachShader(it, fragmentShader)\n      // creates OpenGL ES program executables\n      GLES20.glLinkProgram(it)\n      checkError(\"glCreateProgram\")\n    }\n\n    // get handle to vertex shader's a_position member\n    positionHandle = GLES20.glGetAttribLocation(program, \"a_position\").also { checkError(\"glGetAttribLocation\") }\n\n    // get handle to vertex shader's a_color member\n    colorHandle = GLES20.glGetAttribLocation(program, \"a_color\").also { checkError(\"glGetAttribLocation\") }\n  }\n\n  override fun render(parameters: CustomLayerRenderParameters) {\n    if (program != 0) {\n      // Add program to OpenGL ES environment\n      GLES20.glUseProgram(program).also { checkError(\"glUseProgram\") }\n\n      GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, positionHandle).also { checkError(\"glBindBuffer\") }\n\n      // Enable a handle to the triangle vertices\n      GLES20.glEnableVertexAttribArray(positionHandle).also { checkError(\"glEnableVertexAttribArray\") }\n\n      // Calculate the point in Mercator projection\n      val zoomScale = 2.0.pow(parameters.zoom)\n      val helsinki = Projection.project(HELSINKI, zoomScale)\n      val berlin = Projection.project(BERLIN, zoomScale)\n      val kyiv = Projection.project(KYIV, zoomScale)\n      val triangleCoordinates = floatArrayOf(\n        helsinki.x.toFloat(), helsinki.y.toFloat(),\n        berlin.x.toFloat(), berlin.y.toFloat(),\n        kyiv.x.toFloat(), kyiv.y.toFloat()\n      )\n      // Fill the coordinates to the vertex buffer\n      vertexBuffer.apply {\n        clear()\n        // add the coordinates to the FloatBuffer\n        put(triangleCoordinates)\n        // set the buffer to read the first coordinate\n        rewind()\n      }\n\n      // Prepare the triangle coordinate data\n      GLES20.glVertexAttribPointer(\n        positionHandle, COORDS_PER_VERTEX,\n        GLES20.GL_FLOAT, false,\n        VERTEX_STRIDE, vertexBuffer\n      ).also { checkError(\"glVertexAttribPointer\") }\n\n      // Enable a handle to the color\n      GLES20.glEnableVertexAttribArray(colorHandle).also { checkError(\"glEnableVertexAttribArray\") }\n\n      // Fill the color to the color buffer\n      colorBuffer.apply {\n        clear()\n        // add the color to the FloatBuffer\n        put(color)\n        // rewind the buffer to the beginning\n        rewind()\n      }\n\n      GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, positionHandle).also { checkError(\"glBindBuffer\") }\n\n      // Set color for drawing the triangle\n      GLES20.glVertexAttribPointer(\n        colorHandle, COLOR_SIZE,\n        GLES20.GL_FLOAT, false,\n        COLOR_STRIDE, colorBuffer\n      ).also { checkError(\"glVertexAttribPointer\") }\n\n      // get handle to shape's transformation matrix\n      projectionMatrixHandle = GLES20.glGetUniformLocation(program, \"u_matrix\").also {\n        checkError(\"glGetUniformLocation\")\n      }\n\n      // Apply the projection transformation\n      GLES20.glUniformMatrix4fv(\n        projectionMatrixHandle,\n        1,\n        false,\n        parameters.projectionMatrix.map { it.toFloat() }.toFloatArray(),\n        0\n      ).also {\n        checkError(\"glUniformMatrix4fv\")\n      }\n\n      // Draw the triangle\n      GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, VERTEX_COUNT).also { checkError(\"glDrawArrays\") }\n\n      // Disable vertex array\n      GLES20.glDisableVertexAttribArray(positionHandle).also { checkError(\"glDisableVertexAttribArray\") }\n      GLES20.glDisableVertexAttribArray(colorHandle).also { checkError(\"glDisableVertexAttribArray\") }\n    }\n  }\n\n  override fun contextLost() {\n    logW(TAG, \"contextLost\")\n    program = 0\n  }\n\n  override fun deinitialize() {\n    if (program != 0) {\n      // Disable vertex array\n      GLES20.glDisableVertexAttribArray(positionHandle)\n      GLES20.glDisableVertexAttribArray(colorHandle)\n      GLES20.glDeleteShader(vertexShader)\n      GLES20.glDeleteShader(fragmentShader)\n      GLES20.glDeleteProgram(program)\n      program = 0\n    }\n  }\n\n  private fun checkCompileStatus(shader: Int) {\n    if (BuildConfig.DEBUG) {\n      val isCompiled = IntArray(1)\n      GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, isCompiled, 0)\n      if (isCompiled[0] == GLES20.GL_FALSE) {\n        val infoLog = GLES20.glGetShaderInfoLog(program)\n        throw RuntimeException(\"checkCompileStatus error: $infoLog\")\n      }\n    }\n  }\n\n  companion object {\n    private const val TAG = \"TriangleCustomLayer\"\n    // number of coordinates per vertex in this array\n    private const val COORDS_PER_VERTEX = 2\n    private const val VERTEX_COUNT = 3\n    private const val BYTES_PER_FLOAT = 4\n    private const val VERTEX_STRIDE = COORDS_PER_VERTEX * BYTES_PER_FLOAT\n\n    private const val COLOR_SIZE = 4\n    private const val COLOR_COUNT = 3\n    private const val COLOR_STRIDE = COLOR_SIZE * BYTES_PER_FLOAT\n\n    private val HELSINKI = Point.fromLngLat(25.004, 60.239)\n    private val BERLIN = Point.fromLngLat(13.403, 52.562)\n    private val KYIV = Point.fromLngLat(30.498, 50.541)\n\n    var color = floatArrayOf(\n      1.0f, 0.0f, 0.0f, 0.5f,\n      0.0f, 1.0f, 0.0f, 0.5f,\n      0.0f, 0.0f, 1.0f, 0.5f\n    )\n\n    private val VERTEX_SHADER_CODE = \"\"\"\n      uniform mat4 u_matrix;\n      attribute vec2 a_position;\n      attribute vec4 a_color;\n      varying vec4 v_color;\n      void main() {\n        gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\n        v_color = a_color;\n      }\n    \"\"\".trimIndent()\n    private val FRAGMENT_SHADER_CODE = \"\"\"\n      precision mediump float;\n      varying vec4 v_color;\n      void main() {\n        gl_FragColor = v_color;\n      }\n    \"\"\".trimIndent()\n\n    private fun loadShader(type: Int, shaderCode: String): Int {\n      // create a vertex shader type (GLES20.GL_VERTEX_SHADER)\n      // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)\n      return GLES20.glCreateShader(type).also { shader ->\n\n        // add the source code to the shader and compile it\n        GLES20.glShaderSource(shader, shaderCode)\n        GLES20.glCompileShader(shader)\n      }\n    }\n\n    private fun checkError(cmd: String? = null) {\n      if (BuildConfig.DEBUG) {\n        when (val error = GLES20.glGetError()) {\n          GLES20.GL_NO_ERROR -> {\n            logD(TAG, \"$cmd -> no error\")\n          }\n          GLES20.GL_INVALID_ENUM -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_ENUM\")\n          GLES20.GL_INVALID_VALUE -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_VALUE\")\n          GLES20.GL_INVALID_OPERATION -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_OPERATION\")\n          GLES20.GL_INVALID_FRAMEBUFFER_OPERATION -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_FRAMEBUFFER_OPERATION\")\n          GLES20.GL_OUT_OF_MEMORY -> throw RuntimeException(\"$cmd -> error in gl: GL_OUT_OF_MEMORY\")\n          else -> throw RuntimeException(\"$cmd -> error in gl: $error\")\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/TriangleCustomLayerActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.customLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.projection.generated.projection\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityCustomLayerBinding\n\n/**\n * Test activity showcasing the Custom Layer API\n */\nclass TriangleCustomLayerActivity : AppCompatActivity() {\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var binding: ActivityCustomLayerBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityCustomLayerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +customLayer(\n          layerId = CUSTOM_LAYER_ID,\n          host = TriangleCustomLayer()\n        ).slot(\"middle\")\n        // triangle is floating when using default ProjectionName.GLOBE\n        +projection(ProjectionName.MERCATOR)\n      }\n    ) {\n      mapboxMap.setCamera(CAMERA)\n      initFab()\n    }\n  }\n\n  private fun addCustomLayer(style: Style) {\n    style.addLayer(\n      customLayer(CUSTOM_LAYER_ID, TriangleCustomLayer()) {\n        slot(\"middle\")\n      }\n    )\n    binding.fab.setImageResource(R.drawable.ic_layers_clear)\n  }\n\n  private fun initFab() {\n    binding.fab.setOnClickListener {\n      swapCustomLayer()\n    }\n  }\n\n  private fun swapCustomLayer() {\n    mapboxMap.style?.let { style ->\n      if (style.styleLayerExists(CUSTOM_LAYER_ID)) {\n        style.removeStyleLayer(CUSTOM_LAYER_ID)\n        binding.fab.setImageResource(R.drawable.ic_layers)\n      } else {\n        addCustomLayer(style)\n      }\n    }\n  }\n\n  private fun updateLayer() {\n    mapboxMap.triggerRepaint()\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_custom_layer, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.action_update_layer -> {\n        updateLayer()\n        true\n      }\n\n      R.id.action_set_color_red -> {\n        TriangleCustomLayer.color = floatArrayOf(\n          1.0f, 0.0f, 0.0f, 0.5f,\n          0.0f, 1.0f, 0.0f, 0.5f,\n          0.0f, 0.0f, 1.0f, 0.5f,\n        )\n        true\n      }\n\n      R.id.action_set_color_green -> {\n        TriangleCustomLayer.color = floatArrayOf(\n          0.0f, 1.0f, 0.0f, 0.5f,\n          0.0f, 0.0f, 1.0f, 0.5f,\n          1.0f, 0.0f, 0.0f, 0.5f,\n        )\n        true\n      }\n\n      R.id.action_set_color_blue -> {\n        TriangleCustomLayer.color = floatArrayOf(\n          0.0f, 0.0f, 1.0f, 0.5f,\n          1.0f, 0.0f, 0.0f, 0.5f,\n          0.0f, 1.0f, 0.0f, 0.5f,\n        )\n        true\n      }\n\n      else -> super.onOptionsItemSelected(item)\n    }\n  }\n\n  companion object {\n    private const val CUSTOM_LAYER_ID = \"customId\"\n    private val CAMERA =\n      CameraOptions.Builder().center(Point.fromLngLat(20.0, 58.0)).pitch(0.0).zoom(3.0).build()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/globe/Cube.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer.globe\n\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Projection\nimport com.mapbox.maps.Vec3\n\n/**\n * Creates data and vertices for a cube in ECEF coordinates\n * */\nclass Cube(\n  val location: Point,\n  val sizeMeters: Float,\n  val altitudeMeters: Float,\n  colors: IntArray,\n  mesh: CubeMesh,\n) {\n\n  private val _ecefVertices = ArrayList<Vec3>(mesh.vertices.size)\n  val ecefVertices: List<Vec3> get() = _ecefVertices\n\n  // NxN grid, of quads.\n  private val _colorVertices = ArrayList<Int>(mesh.verticesPerCubeSide * colors.size)\n  val colorVertices: List<Int> get() = _colorVertices\n\n  init {\n    // normalized to [0, 1]\n    val positionMercator = Projection.latLngToMercatorXY(location)\n    val metersToMercator = metersToMercator(location.latitude())\n    for (vertex in mesh.vertices) {\n      val x = positionMercator.x + vertex.x * sizeMeters * metersToMercator\n      val y = positionMercator.y + vertex.y * sizeMeters * metersToMercator\n      val altitude = vertex.z * sizeMeters + altitudeMeters\n\n      val vertexEcef = toEcef(\n        latitude = latFromMercatorY(y),\n        longitude = lngFromMercatorX(x),\n        altitude,\n      )\n\n      _ecefVertices.add(vertexEcef)\n    }\n\n    // Create vertex buffer for cube side colors\n    for (color in colors) {\n      repeat(mesh.verticesPerCubeSide) {\n        _colorVertices.add(color)\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/globe/CubeMesh.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer.globe\n\nimport com.mapbox.maps.Vec3\nimport kotlin.math.max\n\n/**\n * Create a static cube mesh to be rendered with a transformation matrix.\n * It defines vertices in OpenGL local space [-1.0; 1.0]\n * */\nclass CubeMesh(\n  tessellation: Int = 1,\n) {\n\n  val tessellation = max(tessellation, 1)\n  val verticesPerCubeSide = tessellation * tessellation * 6\n  val vertices = ArrayList<Vec3>(sides.size * this.tessellation * this.tessellation)\n\n  init {\n    val step = 1.0 / this.tessellation\n    for (side in sides) {\n      // Create vertices for the side\n      repeat(this.tessellation) { y ->\n        repeat(this.tessellation) { x ->\n          val topLeft =\n            side.topLeft + side.right * step * x.toDouble() + side.down * step * y.toDouble()\n          val v00 = topLeft\n          val v10 = topLeft + side.right * step\n          val v11 = topLeft + side.right * step + side.down * step\n          val v01 = topLeft + side.down * step\n\n          vertices.add(v00)\n          vertices.add(v10)\n          vertices.add(v11)\n\n          vertices.add(v11)\n          vertices.add(v01)\n          vertices.add(v00)\n        }\n      }\n    }\n  }\n\n  companion object {\n\n    private val sides = arrayOf(\n      Side(Vec3(-0.5, 0.5, 0.5), Vec3(1.0, 0.0, 0.0), Vec3(0.0, -1.0, 0.0)),\n      Side(Vec3(0.5, 0.5, 0.5), Vec3(0.0, 0.0, -1.0), Vec3(0.0, -1.0, 0.0)),\n      Side(Vec3(0.5, 0.5, -0.5), Vec3(-1.0, 0.0, 0.0), Vec3(0.0, -1.0, 0.0)),\n      Side(Vec3(-0.5, 0.5, -0.5), Vec3(0.0, 0.0, 1.0), Vec3(0.0, -1.0, 0.0)),\n      Side(Vec3(-0.5, 0.5, -0.5), Vec3(1.0, 0.0, 0.0), Vec3(0.0, 0.0, 1.0)),\n      Side(Vec3(-0.5, -0.5, 0.5), Vec3(1.0, 0.0, 0.0), Vec3(0.0, 0.0, -1.0)),\n    )\n\n    private data class Side(val topLeft: Vec3, val right: Vec3, val down: Vec3)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/globe/GlobeCustomLayerActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer.globe\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.CustomLayer\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.customLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.projection.generated.projection\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityGlobeCustomLayerBinding\n\n/**\n * Test activity showcasing the Custom Layer API in globe projection.\n * */\nclass GlobeCustomLayerActivity : AppCompatActivity() {\n\n  private var _binding: ActivityGlobeCustomLayerBinding? = null\n  private val binding get() = _binding!!\n  private val mapboxMap get() = binding.mapView.mapboxMap\n  private var _host: GlobeCustomLayerHost? = null\n  private val host: GlobeCustomLayerHost get() = _host!!\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    _binding = ActivityGlobeCustomLayerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    val repaint = Runnable(mapboxMap::triggerRepaint)\n    _host = GlobeCustomLayerHost {\n      binding.mapView.post(repaint)\n    }\n    mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +customLayer(\n          layerId = CUSTOM_LAYER_ID,\n          host = host\n        )\n        +projection(ProjectionName.GLOBE)\n      }\n    ) {\n      mapboxMap.setCamera(CAMERA)\n      binding.fabSwapVisibility.setOnClickListener {\n        swapCustomLayer()\n      }\n    }\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    _binding = null\n    _host = null\n  }\n\n  private fun addCustomLayer(style: Style) {\n    style.addLayer(\n      CustomLayer(CUSTOM_LAYER_ID, host),\n    )\n    binding.fabSwapVisibility.setImageResource(R.drawable.ic_layers_clear)\n  }\n\n  private fun swapCustomLayer() {\n    val style = mapboxMap.style ?: return\n    if (style.styleLayerExists(CUSTOM_LAYER_ID)) {\n      style.removeStyleLayer(CUSTOM_LAYER_ID)\n      binding.fabSwapVisibility.setImageResource(R.drawable.ic_layers)\n    } else {\n      addCustomLayer(style)\n    }\n  }\n\n  companion object {\n    private const val CUSTOM_LAYER_ID = \"customId\"\n    private val CAMERA =\n      CameraOptions.Builder().center(Point.fromLngLat(20.0, 58.0)).pitch(0.0).zoom(1.0).build()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/globe/GlobeCustomLayerHost.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer.globe\n\nimport android.opengl.GLES30.*\nimport android.os.SystemClock\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CustomLayerHost\nimport com.mapbox.maps.CustomLayerRenderParameters\nimport com.mapbox.maps.Projection\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.testapp.examples.customlayer.globe.VertexFloatBuffer.Companion.put\nimport kotlin.math.pow\nimport kotlin.math.sin\n\nclass GlobeCustomLayerHost(\n  private val simulatedPointCount: Int = 128,\n  private val cubeTesselation: Int = 8,\n  private val requestRender: () -> Unit,\n) : CustomLayerHost {\n\n  private lateinit var globeProgram: Program\n  private lateinit var simpleProgram: Program\n  private var startTime = SystemClock.elapsedRealtime()\n\n  private val cubeMesh = CubeMesh(cubeTesselation)\n  private val newYorkCube = Cube(\n    location = Point.fromLngLat(-74.0060, 40.7128),\n    sizeMeters = 2_000_000f,\n    altitudeMeters = 1_200_000f,\n    colors = intArrayOf(0xfea3aa, 0xf8b88b, 0xfaf884, 0xbaed91, 0xb2cefe, 0xf2a2e8),\n    mesh = cubeMesh,\n  )\n\n  // keeps references to vertex buffer objects\n  private val vbo = object {\n    val buffer = IntArray(5)\n    val staticCube get() = buffer[0]\n    val deformedCubeEcef get() = buffer[1]\n    val cubeColor get() = buffer[2]\n    val pointsEcef get() = buffer[3]\n    val pointsMerc get() = buffer[4]\n  }\n\n  // keeps references to vertex array objects\n  private val vao = object {\n    val buffer = IntArray(3)\n    val staticCube get() = buffer[0]\n    val deformedCube get() = buffer[1]\n    val points get() = buffer[2]\n  }\n\n  override fun initialize() {\n    startTime = SystemClock.elapsedRealtime()\n    simpleProgram = Program(\n      vertexShaderSource = VERTEX_SIMPLE_SHADER_SOURCE,\n      fragmentShaderSource = FRAGMENT_SHADER_CODE,\n      attributes = listOf(SIMPLE_POSITION, COLOR),\n      uniforms = listOf(SIMPLE_MATRIX),\n    )\n    globeProgram = Program(\n      vertexShaderSource = VERTEX_SHADER_SOURCE,\n      fragmentShaderSource = FRAGMENT_SHADER_CODE,\n      attributes = listOf(POSITION_MERCATOR, POSITION_ECEF, COLOR),\n      uniforms = listOf(MATRIX_MERCATOR, MATRIX_ECEF, ECEF_TRANSITION),\n    )\n    initializeVbo()\n    initializeVao()\n  }\n\n  private fun initializeVbo() {\n    glGenBuffers(vbo.buffer.size, vbo.buffer, 0)\n\n    sequenceOf(\n      vbo.staticCube to cubeMesh.vertices,\n      vbo.deformedCubeEcef to newYorkCube.ecefVertices,\n    ).forEach { (vboId, vertices) ->\n      val buffer = VertexFloatBuffer.fromVec3(vertices)\n      glBindBuffer(GL_ARRAY_BUFFER, vboId)\n      glBufferData(GL_ARRAY_BUFFER, buffer.size, buffer.value, GL_STATIC_DRAW)\n    }\n\n    run {\n      val buffer = VertexIntBuffer(newYorkCube.colorVertices)\n      glBindBuffer(GL_ARRAY_BUFFER, vbo.cubeColor)\n      glBufferData(GL_ARRAY_BUFFER, buffer.size, buffer.value, GL_STATIC_DRAW)\n    }\n\n    sequenceOf(\n      vbo.pointsMerc,\n      vbo.pointsEcef,\n    ).forEach { vboId ->\n      glBindBuffer(GL_ARRAY_BUFFER, vboId)\n      val size = simulatedPointCount * 3 * Float.SIZE_BYTES\n      glBufferData(GL_ARRAY_BUFFER, size, null, GL_STREAM_DRAW)\n    }\n  }\n\n  private fun initializeVao() {\n    glGenVertexArrays(vao.buffer.size, vao.buffer, 0)\n\n    with(simpleProgram) {\n      glBindVertexArray(vao.staticCube)\n      attribute(SIMPLE_POSITION).let { index ->\n        glBindBuffer(GL_ARRAY_BUFFER, vbo.staticCube)\n        glEnableVertexAttribArray(index)\n        glVertexAttribPointer(index, 3, GL_FLOAT, false, 0, 0)\n      }\n      attribute(COLOR).let { index ->\n        glBindBuffer(GL_ARRAY_BUFFER, vbo.cubeColor)\n        glEnableVertexAttribArray(index)\n        glVertexAttribPointer(index, 4, GL_UNSIGNED_BYTE, true, 0, 0)\n      }\n    }\n\n    with(globeProgram) {\n      glBindVertexArray(vao.deformedCube)\n      attribute(POSITION_MERCATOR).let { index ->\n        glBindBuffer(GL_ARRAY_BUFFER, vbo.staticCube)\n        glEnableVertexAttribArray(index)\n        glVertexAttribPointer(index, 3, GL_FLOAT, false, 0, 0)\n      }\n      attribute(POSITION_ECEF).let { index ->\n        glBindBuffer(GL_ARRAY_BUFFER, vbo.deformedCubeEcef)\n        glEnableVertexAttribArray(index)\n        glVertexAttribPointer(index, 3, GL_FLOAT, false, 0, 0)\n      }\n      attribute(COLOR).let { index ->\n        glBindBuffer(GL_ARRAY_BUFFER, vbo.cubeColor)\n        glEnableVertexAttribArray(index)\n        glVertexAttribPointer(index, 4, GL_UNSIGNED_BYTE, true, 0, 0)\n      }\n    }\n\n    with(globeProgram) {\n      glBindVertexArray(vao.points)\n      attribute(POSITION_MERCATOR).let { index ->\n        glBindBuffer(GL_ARRAY_BUFFER, vbo.pointsMerc)\n        glEnableVertexAttribArray(index)\n        glVertexAttribPointer(index, 3, GL_FLOAT, false, 0, 0)\n      }\n      attribute(POSITION_ECEF).let { index ->\n        glBindBuffer(GL_ARRAY_BUFFER, vbo.pointsEcef)\n        glEnableVertexAttribArray(index)\n        glVertexAttribPointer(index, 3, GL_FLOAT, false, 0, 0)\n      }\n      attribute(COLOR).let { index ->\n        glBindBuffer(GL_ARRAY_BUFFER, vbo.cubeColor)\n        glEnableVertexAttribArray(index)\n        glVertexAttribPointer(index, 4, GL_UNSIGNED_BYTE, true, 0, 0)\n      }\n    }\n\n    glBindVertexArray(0)\n  }\n\n  override fun render(parameters: CustomLayerRenderParameters) = with(parameters) {\n    glEnable(GL_DEPTH_TEST)\n    glDepthFunc(GL_LESS)\n    glDepthMask(true)\n    glDepthRangef(depthRange.min, depthRange.max)\n\n    glEnable(GL_CULL_FACE)\n    glFrontFace(GL_CCW)\n    glCullFace(GL_BACK)\n    glDisable(GL_STENCIL_TEST)\n\n    val projectionMatrix = Matrix4f(projectionMatrix)\n\n    renderCubes(projectionMatrix)\n    renderModelsInPixels(projectionMatrix)\n    renderDeformedCube(projectionMatrix)\n    renderPoints(projectionMatrix)\n\n    glBindVertexArray(0)\n  }\n\n  // Example 1. Render 3D models defined in meters\n  private fun CustomLayerRenderParameters.renderCubes(\n    projectionMatrix: Matrix4f\n  ) = with(simpleProgram) {\n    glUseProgram(program)\n    glBindVertexArray(vao.staticCube)\n\n    val simpleMatrix = uniform(SIMPLE_MATRIX)\n\n    for (loc in metricCubeLocations) {\n      // Create a transformation (VP) matrix for placing a 100km^3 sized cube on 100km altitude.\n      // The matrix transforms a unit cube from it's local coordinate space into mapbox's world coordinates\n      // where the position is defined in `pixels` and altitude in meters. Cubes positioned closer to poles\n      // appear larger due to distortion of mercator projection\n      val modelMatrix = createModelMatrixMeters(loc, 100_000f, 100_000f)\n      val pModelMatrix = modelMatrix.value.map(Float::toDouble)\n\n      val transformedMatrix =\n        projection.convertMercatorModelMatrix(pModelMatrix, false) ?: continue\n\n      val finalMatrix = projectionMatrix * Matrix4f(transformedMatrix)\n\n      glUniformMatrix4fv(simpleMatrix, 1, false, VertexFloatBuffer.fromMatrix(finalMatrix).value)\n      glDrawArrays(GL_TRIANGLES, 0, 6 * cubeMesh.verticesPerCubeSide)\n    }\n  }\n\n  // Example 2. Render 3D models defined in pixels\n  private fun CustomLayerRenderParameters.renderModelsInPixels(\n    projectionMatrix: Matrix4f\n  ) = with(simpleProgram) {\n    glUseProgram(program)\n    glBindVertexArray(vao.staticCube)\n\n    for (loc in pixelCubeLocations) {\n      // Render another set of cubes whose size is defined in pixels.\n      // Note that `ignoreDistortion` passed to `prepareModelMatrix` is set to true\n      // as we want to keep the size identical at each latitude location\n      val modelMatrix = createModelMatrixPixels(loc, 0f, 128f)\n      val pModelMatrix = modelMatrix.value.map { it.toDouble() }\n\n      val transformedMatrix =\n        projection.convertMercatorModelMatrix(pModelMatrix, true) ?: continue\n\n      val wvp = projectionMatrix * Matrix4f(transformedMatrix)\n\n      val wvpBuffer = VertexFloatBuffer.fromMatrix(wvp).value\n      glUniformMatrix4fv(uniform(SIMPLE_MATRIX), 1, false, wvpBuffer)\n      glDrawArrays(GL_TRIANGLES, 0, 6 * cubeMesh.verticesPerCubeSide)\n    }\n  }\n\n  // Example 3. Render a deformed cube over New York\n  private fun CustomLayerRenderParameters.renderDeformedCube(\n    projectionMatrix: Matrix4f\n  ) = with(globeProgram) {\n    glUseProgram(program)\n    glBindVertexArray(vao.deformedCube)\n\n    // Model matrix transforms ecef coordinates into world pixel coordinates.\n    val globeWvp = projectionMatrix * Matrix4f(projection.modelMatrix)\n\n    val mercModelMatrix = createModelMatrixMeters(\n      newYorkCube.location,\n      newYorkCube.altitudeMeters,\n      newYorkCube.sizeMeters,\n    )\n\n    val mercWvp = projectionMatrix * Matrix4f(projection.transitionMatrix) * mercModelMatrix\n\n    // Interpolate between ecef and mercator coordinates in the vertex shader\n    // in order to support transitions between the two projections\n    val transitionPhase = projection.transitionPhase\n\n    glUniformMatrix4fv(uniform(MATRIX_MERCATOR), 1, false, mercWvp.value, 0)\n    glUniformMatrix4fv(uniform(MATRIX_ECEF), 1, false, globeWvp.value, 0)\n    glUniform1f(uniform(ECEF_TRANSITION), transitionPhase)\n\n    glDrawArrays(GL_TRIANGLES, 0, 6 * cubeMesh.verticesPerCubeSide)\n  }\n\n  // Example 4. Render a bunch of moving points\n  private fun CustomLayerRenderParameters.renderPoints(\n    projectionMatrix: Matrix4f,\n  ) = with(globeProgram) {\n    glUseProgram(program)\n    glBindVertexArray(vao.points)\n\n    val elapsed = (SystemClock.elapsedRealtime() - startTime).toDouble() / 1000.0\n\n    // Simulate points going up and down. Compute both ecef and mercator positions\n    // and use the transition matrix for interpolating between them.\n\n    val ecefPoints = VertexFloatBuffer(simulatedPointCount * 3)\n    val mercatorPoints = VertexFloatBuffer(simulatedPointCount * 3)\n\n    val start = CAPE_TOWN\n    val end = TOKYO\n\n    val worldSize = Projection.worldSize(2.0.pow(zoom))\n\n    repeat(simulatedPointCount) { index ->\n      val phase = index.toDouble() / (simulatedPointCount - 1)\n      val wavePhase = M2_PI * phase * 8.0 + elapsed * M2_PI\n\n      // Note: produces a linear line in mercator projection but not on the globe\n\n      val lat = interpolate(start.latitude(), end.latitude(), phase)\n      val lng = interpolate(start.longitude(), end.longitude(), phase)\n      val altitude = sin(wavePhase) * 300_000.0 + 400_000.0\n\n      val location = Point.fromLngLat(lng, lat)\n      val ecef = location.toEcef(altitude)\n      val mercator = Projection.latLngToMercatorXY(location)\n\n      ecefPoints.put(ecef)\n      mercatorPoints.put(mercator.x * worldSize, mercator.y * worldSize, altitude)\n    }\n\n    ecefPoints.rewind()\n    mercatorPoints.rewind()\n\n    glBindBuffer(GL_ARRAY_BUFFER, vbo.pointsEcef)\n    glBufferSubData(GL_ARRAY_BUFFER, 0, ecefPoints.size, ecefPoints.value)\n\n    glBindBuffer(GL_ARRAY_BUFFER, vbo.pointsMerc)\n    glBufferSubData(GL_ARRAY_BUFFER, 0, mercatorPoints.size, mercatorPoints.value)\n\n    // Model matrix transforms ecef coordinates into world pixel coordinates.\n    val globeModelMatrix = Matrix4f(projection.modelMatrix)\n    val globeWvp = projectionMatrix * globeModelMatrix\n\n    val mercWvp = projectionMatrix * Matrix4f(projection.transitionMatrix)\n\n    // Interpolate between ecef and mercator coordinates in the vertex shader\n    // in order to support transitions between the two projections\n    val transitionPhase = projection.transitionPhase\n\n    glUniformMatrix4fv(uniform(MATRIX_MERCATOR), 1, false, mercWvp.value, 0)\n    glUniformMatrix4fv(uniform(MATRIX_ECEF), 1, false, globeWvp.value, 0)\n    glUniform1f(uniform(ECEF_TRANSITION), transitionPhase)\n\n    glDrawArrays(GL_POINTS, 0, simulatedPointCount)\n    requestRender()\n  }\n\n  fun CustomLayerRenderParameters.createModelMatrixPixels(\n    location: Point,\n    altitude: Float,\n    size: Float\n  ): Matrix4f {\n    val translation = createTranslationMatrix(location, altitude)\n\n    // set height to 1 pixel\n    val pixelsToMeters =\n      Projection.getMetersPerPixelAtLatitude(location.latitude(), zoom)\n    val scale = createMetricScaleMatrix(size, size, pixelsToMeters, location.latitude())\n\n    return translation * scale\n  }\n\n  fun CustomLayerRenderParameters.createModelMatrixMeters(\n    location: Point,\n    altitude: Float,\n    sizeMeters: Float,\n  ): Matrix4f {\n    val translation = createTranslationMatrix(location, altitude)\n\n    val metersToPixels =\n      1.0 / Projection.getMetersPerPixelAtLatitude(location.latitude(), zoom)\n    val xSize = sizeMeters * metersToPixels\n    val ySize = sizeMeters * metersToPixels\n\n    val scale = createMetricScaleMatrix(xSize, ySize, sizeMeters, location.latitude())\n\n    return translation * scale\n  }\n\n  /**\n   * Convert lat&lng to world coordinates where x & y are in pixels and z in meters\n   * */\n  fun CustomLayerRenderParameters.createTranslationMatrix(\n    location: Point,\n    altitude: Float,\n  ): Matrix4f {\n    // in range [0,1]\n    val mercatorPos = Projection.latLngToMercatorXY(location)\n    // tileSize (512) * 2^zoom\n    val worldPos = mercatorPos * Projection.worldSize(2.0.pow(zoom))\n    val altitudeScalar = heightScalarForLatitude(location.latitude(), latitude)\n\n    return Matrix4f.translation(worldPos.x, worldPos.y, altitude * altitudeScalar)\n  }\n\n  /**\n   * Creates a matrix that scales from meters into world units (i.e. pixel units)\n   * */\n  fun CustomLayerRenderParameters.createMetricScaleMatrix(\n    x: Number,\n    y: Number,\n    z: Number,\n    latitude: Double,\n  ) = Matrix4f.scale(x, y, z.toDouble() * heightScalarForLatitude(latitude, latitude))\n\n  /**\n   * Height of renderable models (i.e. the z-axis) is defined meters and the conversion into pixels\n   * is baked into the projection matrix. Because the projection matrix uses `metersToPixels` computed at\n   * the map center whereas the value is actually a function of latitude, we might need to apply compensation\n   * to transformation matrices of models located at different latitudue coordinates.\n   * */\n  fun heightScalarForLatitude(latitude: Double, centerLatitude: Double) =\n    Projection.getLatitudeScale(centerLatitude) / Projection.getLatitudeScale(latitude)\n\n  override fun contextLost() = logW(TAG, \"contextLost\")\n\n  override fun deinitialize() {\n    if (!::globeProgram.isInitialized) return\n    globeProgram.deinitialize()\n    simpleProgram.deinitialize()\n    glDeleteBuffers(vbo.buffer.size, vbo.buffer, 0)\n    glDeleteVertexArrays(vao.buffer.size, vao.buffer, 0)\n  }\n\n  companion object {\n    private const val TAG = \"GlobeCustomLayer\"\n\n    private val CAPE_TOWN = Point.fromLngLat(19.0114, -32.3117)\n    private val TOKYO = Point.fromLngLat(139.7543, 35.6821)\n\n    private val metricCubeLocations = listOf(\n      Point.fromLngLat(15.4912, 78.2357),\n      Point.fromLngLat(25.7294, 66.5039),\n      Point.fromLngLat(13.4050, 52.5200),\n      Point.fromLngLat(12.4822, 41.8967),\n    )\n\n    val pixelCubeLocations = listOf(\n      Point.fromLngLat(-9.1393, 38.7223),\n      Point.fromLngLat(0.1276, 51.5072),\n      Point.fromLngLat(-21.9408, 64.1470),\n    )\n\n    private const val SIMPLE_MATRIX = \"u_matrix\"\n\n    private const val SIMPLE_POSITION = \"a_pos\"\n    private const val COLOR = \"a_color\"\n\n    private val VERTEX_SIMPLE_SHADER_SOURCE = \"\"\"\n      uniform mat4 $SIMPLE_MATRIX;\n      attribute vec3 $SIMPLE_POSITION;\n      attribute vec3 $COLOR;\n      varying vec4 v_color;\n      void main() {\n          gl_Position = $SIMPLE_MATRIX * vec4($SIMPLE_POSITION, 1.0);\n          v_color = vec4($COLOR, 0.85);\n      }\n    \"\"\".trimIndent()\n\n    private const val POSITION_MERCATOR = \"a_pos_merc\"\n    private const val POSITION_ECEF = \"a_pos_ecef\"\n\n    private const val MATRIX_MERCATOR = \"u_matrix_merc\"\n    private const val MATRIX_ECEF = \"u_matrix_ecef\"\n    private const val ECEF_TRANSITION = \"u_transition\"\n\n    private val VERTEX_SHADER_SOURCE = \"\"\"\n      uniform mat4 $MATRIX_MERCATOR;\n      uniform mat4 $MATRIX_ECEF;\n      uniform float $ECEF_TRANSITION;\n      \n      attribute vec3 $POSITION_MERCATOR;\n      attribute vec3 $POSITION_ECEF;\n      attribute vec3 $COLOR;\n      \n      varying vec4 v_color;\n      \n      void main() {\n          vec4 pos_merc = $MATRIX_MERCATOR * vec4($POSITION_MERCATOR, 1.0);\n          vec4 pos_ecef = $MATRIX_ECEF * vec4($POSITION_ECEF, 1.0);\n          gl_Position = mix(pos_merc, pos_ecef, clamp($ECEF_TRANSITION, 0.0, 1.0));\n          gl_PointSize = 32.0;\n          v_color = vec4($COLOR, 0.85);\n      }\n    \"\"\".trimIndent()\n\n    private val FRAGMENT_SHADER_CODE = \"\"\"\n      precision mediump float;\n      varying vec4 v_color;\n      void main() {\n        gl_FragColor = v_color;\n      }\n    \"\"\".trimIndent()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/globe/Matrix4f.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer.globe\n\nimport android.opengl.Matrix\n\n@JvmInline\nvalue class Matrix4f private constructor(\n  val value: FloatArray = FloatArray(16),\n) {\n\n  constructor(values: List<Number>) : this(\n    kotlin.run {\n      if (values.size != 16) {\n        throw IllegalArgumentException(\"values size must be 16 but was ${values.size}\")\n      }\n      FloatArray(16) { i ->\n        values[i].toFloat()\n      }\n    }\n  )\n\n  constructor(vararg values: Number) : this(values.toList())\n\n  operator fun get(index: Int): Float = value[index]\n  operator fun set(index: Int, value: Number) {\n    this.value[index] = value.toFloat()\n  }\n\n  operator fun set(row: Int, column: Int, value: Number) {\n    this.value[row * 4 + column] = value.toFloat()\n  }\n\n  operator fun times(other: Matrix4f) = Matrix4f().also { result ->\n    Matrix.multiplyMM(result.value, 0, this.value, 0, other.value, 0)\n  }\n\n  companion object {\n    fun identity() = Matrix4f(\n      1, 0, 0, 0,\n      0, 1, 0, 0,\n      0, 0, 1, 0,\n      0, 0, 0, 1,\n    )\n\n    fun translation(x: Number, y: Number, z: Number) = Matrix4f(\n      1, 0, 0, 0,\n      0, 1, 0, 0,\n      0, 0, 1, 0,\n      x, y, z, 1,\n    )\n\n    fun scale(x: Number, y: Number, z: Number) = Matrix4f(\n      x, 0, 0, 0,\n      0, y, 0, 0,\n      0, 0, z, 0,\n      0, 0, 0, 1,\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/globe/Program.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer.globe\n\nimport android.opengl.GLES30.*\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.testapp.BuildConfig\nimport java.nio.IntBuffer\n\n/**\n * Helper class to define OpenGL program, shaders, their attributes and uniforms\n * */\nclass Program(\n  vertexShaderSource: String,\n  fragmentShaderSource: String,\n  attributes: List<String>,\n  uniforms: List<String>,\n) {\n\n  val vertexShader = loadShader(GL_VERTEX_SHADER, vertexShaderSource)\n  val fragmentShader = loadShader(GL_FRAGMENT_SHADER, fragmentShaderSource)\n  val program = glCreateProgram().also { program ->\n    glAttachShader(program, vertexShader)\n    glAttachShader(program, fragmentShader)\n    glLinkProgram(program)\n    checkError(\"glCreateProgram\")\n  }\n\n  private val _attributes = attributes.associate { key ->\n    key to glGetAttribLocation(program, key).also { checkError(\"glGetAttribLocation\") }\n  }\n\n  private val _uniforms = uniforms.associate { key ->\n    key to glGetUniformLocation(program, key).also { checkError(\"glGetUniformLocation\") }\n  }\n\n  fun attribute(name: String) = _attributes[name]\n    ?: throw IllegalArgumentException(\"no attribute $name\")\n\n  fun uniform(name: String) = _uniforms[name]\n    ?: throw IllegalArgumentException(\"no uniform $name\")\n\n  fun deinitialize() {\n    glDetachShader(program, vertexShader)\n    glDetachShader(program, fragmentShader)\n    glDeleteShader(vertexShader)\n    glDeleteShader(fragmentShader)\n    glDeleteProgram(program)\n  }\n\n  /**\n   * Creates and compiles a shader.\n   * @param type is [GL_VERTEX_SHADER] or [GL_FRAGMENT_SHADER]\n   * */\n  private fun loadShader(type: Int, shaderCode: String): Int {\n    val shader = glCreateShader(type)\n    glShaderSource(shader, shaderCode)\n    glCompileShader(shader)\n    checkCompileStatus(shader)\n    return shader\n  }\n\n  private fun checkCompileStatus(shader: Int) {\n    if (!BuildConfig.DEBUG) return\n    val isCompiled = IntBuffer.allocate(1)\n    glGetShaderiv(shader, GL_COMPILE_STATUS, isCompiled)\n    if (isCompiled[0] == GL_FALSE) {\n      val infoLog = glGetShaderInfoLog(program)\n      throw RuntimeException(\"checkCompileStatus error: $infoLog\")\n    }\n  }\n\n  private fun checkError(cmd: String? = null) {\n    if (!BuildConfig.DEBUG) return\n    when (val error = glGetError()) {\n      GL_NO_ERROR -> logD(\"Program\", \"$cmd -> no error\")\n      GL_INVALID_ENUM -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_ENUM\")\n      GL_INVALID_VALUE -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_VALUE\")\n      GL_INVALID_OPERATION -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_OPERATION\")\n      GL_INVALID_FRAMEBUFFER_OPERATION -> throw RuntimeException(\"$cmd -> error in gl: GL_INVALID_FRAMEBUFFER_OPERATION\")\n      GL_OUT_OF_MEMORY -> throw RuntimeException(\"$cmd -> error in gl: GL_OUT_OF_MEMORY\")\n      else -> throw RuntimeException(\"$cmd -> error in gl: $error\")\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/globe/Utils.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer.globe\n\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Projection\nimport com.mapbox.maps.Vec2\nimport com.mapbox.maps.Vec3\nimport kotlin.math.atan\nimport kotlin.math.cos\nimport kotlin.math.exp\nimport kotlin.math.sin\n\nprivate const val DEG_TO_RAD = Math.PI / 180.0\nprivate const val RAD_TO_DEG = 180.0 / Math.PI\nconst val M2_PI = Math.PI * 2.0\nprivate const val PI_HALF = Math.PI / 2.0\nprivate const val EXTENT = 8192.0\n\nfun metersToMercator(latitude: Double): Double {\n  val pixelsPerMeters = 1.0 / Projection.getMetersPerPixelAtLatitude(latitude, 0.0)\n  val pixelsToMercator = 1.0 / Projection.worldSize(1.0)\n  return pixelsPerMeters * pixelsToMercator\n}\n\nfun lngFromMercatorX(x: Double) = x * 360.0 - 180.0\n\nfun latFromMercatorY(y: Double) =\n  RAD_TO_DEG * (2.0 * atan(exp(Math.PI - y * M2_PI)) - PI_HALF)\n\nfun Point.toEcef(altitude: Double = 0.0) = toEcef(latitude(), longitude(), altitude)\n\n/**\n * Transforms a point from its latitude/longitude/altitude representation to an (x, y, z) position\n * in a 3D space.\n * Custom \"Earth-Centered, Earth-Fixed\", the Y-axis aligns with the Earth's polar axis.\n * */\nfun toEcef(latitude: Double, longitude: Double, altitude: Double = 0.0): Vec3 {\n  // The circumference of the world in custom \"map units\" at the equator.  8192 (2¹³)\n  val radius = EXTENT / M2_PI\n  // How many Mercator units correspond to one meter at the equator (where distortion is zero) and\n  // then scales it by the world extent.\n  val ecefPerMeter = metersToMercator(latitude = 0.0) * EXTENT\n  val z = radius + altitude * ecefPerMeter\n  val lat = latitude * DEG_TO_RAD\n  val lng = longitude * DEG_TO_RAD\n  val sx = cos(lat) * sin(lng) * z\n  // Reversed polar axis. Positive Y-axis points South.\n  val sy = -sin(lat) * z\n  val sz = cos(lat) * cos(lng) * z\n  return Vec3(sx, sy, sz)\n}\n\nfun interpolate(a: Double, b: Double, t: Double) = a * (1.0 - t) + b * t\n\noperator fun Vec2.times(other: Double) = Vec2(x * other, y * other)\n\noperator fun Vec3.plus(other: Vec3) = Vec3(x + other.x, y + other.y, z + other.z)\noperator fun Vec3.times(other: Double) = Vec3(x * other, y * other, z * other)"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/globe/VertexFloatBuffer.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer.globe\n\nimport com.mapbox.maps.Vec3\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport java.nio.FloatBuffer\n\n/**\n * Helper wrapper over float buffer with native order\n * */\n@JvmInline\nvalue class VertexFloatBuffer private constructor(\n  val value: FloatBuffer,\n) {\n\n  // is bytes\n  val size get() = value.capacity() * Float.SIZE_BYTES\n\n  constructor(size: Int) : this(\n    ByteBuffer.allocateDirect(size * Float.SIZE_BYTES)\n      .run {\n        // use the device hardware's native byte order\n        order(ByteOrder.nativeOrder())\n        // create a floating point buffer from the ByteBuffer\n        asFloatBuffer()\n      }\n  )\n\n  fun put(vararg numbers: Number) {\n    numbers.forEach { number ->\n      value.put(number.toFloat())\n    }\n  }\n\n  fun rewind() = value.rewind() as FloatBuffer\n\n  companion object {\n\n    fun VertexFloatBuffer.put(vec3: Vec3) = with(vec3) {\n      put(x)\n      put(y)\n      put(z)\n    }\n\n    fun fromVec3(list: List<Vec3>) = VertexFloatBuffer(list.size * 3 * Float.SIZE_BYTES).also {\n      val buffer = it.value\n      list.forEach { vec3 ->\n        it.put(vec3)\n      }\n      buffer.rewind()\n    }\n\n    fun fromMatrix(matrix: Matrix4f) = VertexFloatBuffer(16).also { buffer ->\n      matrix.value.forEach {\n        buffer.put(it)\n      }\n      buffer.rewind()\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/customlayer/globe/VertexIntBuffer.kt",
    "content": "package com.mapbox.maps.testapp.examples.customlayer.globe\n\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport java.nio.IntBuffer\n\n/**\n * Helper wrapper over int buffer with native order\n * */\n@JvmInline\nvalue class VertexIntBuffer(\n  val value: IntBuffer,\n) {\n\n  // is bytes\n  val size get() = value.capacity() * Int.SIZE_BYTES\n\n  constructor(list: List<Int>) : this(\n    ByteBuffer.allocateDirect(list.size * Int.SIZE_BYTES)\n      .run {\n        // use the device hardware's native byte order\n        order(ByteOrder.nativeOrder())\n        asIntBuffer()\n      }.also { buffer ->\n        list.forEach { value ->\n          buffer.put(value)\n        }\n        buffer.rewind()\n      }\n  )\n\n  fun put(vararg numbers: Number) {\n    numbers.forEach { number ->\n      value.put(number.toInt())\n    }\n  }\n\n  fun rewind() = value.rewind() as IntBuffer\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/datajoin/CountriesData.kt",
    "content": "package com.mapbox.maps.testapp.examples.datajoin\n\nimport android.content.Context\nimport com.mapbox.maps.logE\nimport org.json.JSONArray\nimport java.io.IOException\n\ndata class Country(val code: String, val hdi: Double)\n\nobject CountriesData {\n\n    /**\n     * Loads a list of countries and their HDI values from a JSON file in the assets folder.\n     * @param context The Android context used to access assets.\n     * @return List of Country objects, or an empty list if loading/parsing fails.\n     */\n    fun loadCountriesFromJSON(context: Context): List<Country> {\n        return try {\n            val jsonString =\n                context.assets.open(\"countries_hdi.json\").bufferedReader().use { it.readText() }\n            val jsonArray = JSONArray(jsonString)\n\n            return (0 until jsonArray.length())\n                .map(jsonArray::getJSONObject)\n                .map { jsonCountry ->\n                    Country(\n                        jsonCountry.getString(\"code\"),\n                        jsonCountry.getDouble(\"hdi\"),\n                    )\n                }\n        } catch (e: IOException) {\n            logE(\"CountriesData\", \"Failed to read JSON file: ${e.message}\")\n            emptyList()\n        } catch (e: Exception) {\n            logE(\"CountriesData\", \"Failed to parse JSON: ${e.message}\")\n            emptyList()\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/datajoin/DataJoinActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.datajoin\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.match\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.rgb\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.rgba\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.sources.generated.vectorSource\nimport com.mapbox.maps.extension.style.style\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n/**\n * Example of joining JSON data with vector tiles and coloring them based on data values.\n */\nclass DataJoinActivity : AppCompatActivity() {\n  private var countries: List<Country> = emptyList()\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    lifecycleScope.launch {\n      countries = withContext(Dispatchers.IO) {\n        CountriesData.loadCountriesFromJSON(this@DataJoinActivity)\n      }\n\n      setupMap(mapView)\n    }\n  }\n\n  private fun setupMap(mapView: MapView) {\n    mapView.mapboxMap.apply {\n      setCamera(\n        cameraOptions {\n          center(Point.fromLngLat(12.0, 50.0))\n          zoom(1.6)\n          pitch(0.0)\n          bearing(0.0)\n        }\n      )\n\n      loadStyle(\n        style(Style.STANDARD) {\n          +vectorSource(\"countries\") { url(\"mapbox://mapbox.country-boundaries-v1\") }\n          +fillLayer(\"countries\", \"countries\") {\n            sourceLayer(\"country_boundaries\")\n            fillColor(createColorExpression(countries))\n          }\n        }\n      ) { style ->\n        // Set map to monochrome theme after style loads\n        style.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n      }\n    }\n  }\n\n  private fun createColorExpression(countries: List<Country>) = match(\n    input = Expression.get(\"iso_3166_1_alpha_3\"),\n    stops = countries.map { country ->\n      literal(country.code) to rgb(0.0, (country.hdi * 255), 0.0)\n    }.toTypedArray(),\n    fallback = rgba(0.0, 0.0, 0.0, 0.0)\n  )\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/fragment/MapFragment.kt",
    "content": "package com.mapbox.maps.testapp.examples.fragment\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\n\nclass MapFragment : Fragment() {\n\n  private lateinit var mapView: MapView\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var onMapReady: (MapboxMap) -> Unit\n\n  override fun onCreateView(\n    inflater: LayoutInflater,\n    container: ViewGroup?,\n    savedInstanceState: Bundle?\n  ): View {\n    mapView = MapView(\n      inflater.context,\n      // Use TextureView as render surface for the MapView, for smooth transitions following holding views, e.g. in a ViewPager.\n      MapInitOptions(inflater.context, textureView = true, mapName = \"fragmentMap\")\n    )\n    return mapView\n  }\n\n  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n    super.onViewCreated(view, savedInstanceState)\n    mapboxMap = mapView.mapboxMap\n    if (::onMapReady.isInitialized) {\n      onMapReady.invoke(mapboxMap)\n    }\n  }\n\n  fun getMapAsync(callback: (MapboxMap) -> Unit) = if (::mapboxMap.isInitialized) {\n    callback.invoke(mapboxMap)\n  } else this.onMapReady = callback\n\n  fun getMapView(): MapView {\n    return mapView\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/fragment/MapViewPager.kt",
    "content": "package com.mapbox.maps.testapp.examples.fragment\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.SurfaceView\nimport android.view.View\nimport androidx.viewpager.widget.PagerTabStrip\nimport androidx.viewpager.widget.ViewPager\n\nclass MapViewPager(\n  context: Context?,\n  attrs: AttributeSet?\n) :\n  ViewPager(context!!, attrs) {\n  override fun canScroll(\n    v: View,\n    checkV: Boolean,\n    dx: Int,\n    x: Int,\n    y: Int\n  ): Boolean {\n    return v is SurfaceView || v is PagerTabStrip || super.canScroll(v, checkV, dx, x, y)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/geofence/ExtendedGeofencingActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.geofence\n\nimport android.Manifest\nimport android.annotation.SuppressLint\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.Toast\nimport androidx.activity.result.ActivityResultLauncher\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.app.ActivityCompat\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.NotificationManagerCompat\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.isVisible\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.api.isochrone.IsochroneCriteria\nimport com.mapbox.api.isochrone.MapboxIsochrone\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.common.geofencing.GeofencingError\nimport com.mapbox.common.geofencing.GeofencingEvent\nimport com.mapbox.common.geofencing.GeofencingFactory\nimport com.mapbox.common.geofencing.GeofencingObserver\nimport com.mapbox.common.geofencing.GeofencingOptions\nimport com.mapbox.common.geofencing.GeofencingPropertiesKeys\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.GeometryCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.InteractionContext\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.createDefault2DPuck\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.viewport\nimport com.mapbox.maps.testapp.MapboxApplication\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityExtendedGeofencingBinding\nimport com.mapbox.maps.testapp.utils.LocationPermissionHelper\nimport kotlinx.coroutines.launch\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\nimport java.lang.ref.WeakReference\nimport java.util.Date\n\n/**\n * This example shows how to get updates from the geofence engine.\n * Every tap onto the map calls [MapboxIsochrone] service to create a [Feature] that connects points of equal travel time around a given location.\n * Every returned [Feature] is persisted in the geofence engine so that geofencing works even without network.\n * Geofence callbacks are called when device location enters, dwells, or leaves any loaded geofence zone.\n * Each aforementioned event is accompanied by rendering received feature (Blue, Green, Red colors ) onto the map and showing a notification.\n * Subscription to notifications happens in [MapboxApplication] class to have the ability to receive geofence notifications in the background,\n * even when GeofenceActivity or the whole app is closed.\n * [MapboxApplication.ENABLE_BACKGROUND_GEOFENCING] flag turns ON/OFF showcase of background behavior of the geofence engine.\n */\nclass ExtendedGeofencingActivity : AppCompatActivity() {\n\n  private var requestNotificationPermissionLauncher: ActivityResultLauncher<String> =\n    registerForActivityResult(\n      ActivityResultContracts.RequestPermission()\n    ) { isGranted: Boolean ->\n      if (isGranted) {\n        createNotificationChannel()\n      } else {\n        Toast.makeText(\n          this,\n          \"Notification permission is denied and no toasts from the geofence would be shown\",\n          Toast.LENGTH_LONG\n        ).show()\n        logD(TAG, \"Notification permission denied\")\n      }\n    }\n  private lateinit var locationPermissionHelper: LocationPermissionHelper\n  private lateinit var binding: ActivityExtendedGeofencingBinding\n\n  private lateinit var mapboxMap: MapboxMap\n\n  private var entryFeatures = mutableListOf<Feature>()\n  private var dwellFeatures = mutableListOf<Feature>()\n  private var exitFeature: Feature? = null\n  private var justAddedFeature: Feature? = null\n\n  private var geofencingStarted: Boolean = false\n\n  // NOTE: You need to grant location permissions before initialising GeofencingService with getOrCreate()\n  private val geofencing by lazy {\n    GeofencingFactory.getOrCreate()\n  }\n\n  private val observer: GeofencingObserver = object : GeofencingObserver {\n    override fun onEntry(event: GeofencingEvent) {\n      logD(TAG, \"onEntry() called with: feature id = ${event.feature.id()} at ${event.timestamp}\")\n\n      removeExitFeatureIfNeeded(event)\n      lifecycleScope.launch {\n        mapboxMap.getStyle { style ->\n          val isNewFeature = justAddedFeature?.id() == event.feature.id()\n          if (isNewFeature) {\n            justAddedFeature.removeFeature(style, JUST_ADDED_ZONE_SOURCE_ID, CUSTOM_ZONE_DATA_ID)\n            justAddedFeature = null\n          }\n          event.feature.addFeature(style, ENTRY_SOURCE_ID, ENTRY_DATA_ID)\n          entryFeatures.add(event.feature)\n          moveCameraToActiveFeatures()\n        }\n      }\n    }\n\n    override fun onDwell(event: GeofencingEvent) {\n      logD(TAG, \"onDwell() called with:  feature id = ${event.feature.id()} at ${event.timestamp}\")\n\n      removeExitFeatureIfNeeded(event)\n      lifecycleScope.launch {\n        mapboxMap.getStyle { style ->\n          entryFeatures.remove(event.feature)\n          event.feature.removeFeature(style, ENTRY_SOURCE_ID, ENTRY_DATA_ID)\n          event.feature.addFeature(style, DWELL_SOURCE_ID, DWELL_DATA_ID)\n          dwellFeatures.add(event.feature)\n          moveCameraToActiveFeatures()\n        }\n      }\n    }\n\n    override fun onExit(event: GeofencingEvent) {\n      logD(TAG, \"onExit() called with:  feature id = ${event.feature.id()} at ${event.timestamp}\")\n\n      fun updateExitFeature(style: Style, newFeature: Feature) {\n        newFeature.addFeature(style, EXIT_SOURCE_ID, EXIT_DATA_ID)\n        exitFeature.removeFeature(style, EXIT_SOURCE_ID, EXIT_DATA_ID)\n        exitFeature = newFeature\n      }\n\n      lifecycleScope.launch {\n        mapboxMap.getStyle { style ->\n          if (entryFeatures.contains(event.feature)) {\n            entryFeatures.remove(event.feature)\n            event.feature.removeFeature(style, ENTRY_SOURCE_ID, ENTRY_DATA_ID)\n          }\n          if (dwellFeatures.contains(event.feature)) {\n            dwellFeatures.remove(event.feature)\n            event.feature.removeFeature(style, DWELL_SOURCE_ID, DWELL_DATA_ID)\n          }\n          updateExitFeature(style, event.feature)\n          moveCameraToActiveFeatures()\n        }\n      }\n    }\n\n    private fun removeExitFeatureIfNeeded(event: GeofencingEvent) {\n      if (exitFeature?.id() == event.feature.id()) {\n        lifecycleScope.launch {\n          mapboxMap.getStyle { style ->\n            exitFeature.removeFeature(style, EXIT_SOURCE_ID, EXIT_DATA_ID)\n            exitFeature = null\n          }\n        }\n      }\n    }\n\n    override fun onError(error: GeofencingError) {\n      logD(TAG, \"onError() called with: error = $error\")\n    }\n\n    override fun onUserConsentChanged(isConsentGiven: Boolean) {\n      logD(TAG, \"onUserConsentChanged() called with: isConsentGiven = $isConsentGiven\")\n      userRevokedConsentUi(isConsentGiven)\n    }\n  }\n\n  private fun moveCameraToActiveFeatures() {\n    val geometries = buildList {\n      addAll(entryFeatures.map { it.geometry() })\n      add(exitFeature?.geometry())\n      addAll(dwellFeatures.map { it.geometry() })\n    }.filterNotNull()\n    binding.mapView.viewport.transitionTo(\n      binding.mapView.viewport.makeOverviewViewportState(\n        OverviewViewportStateOptions.Builder()\n          .geometry(GeometryCollection.fromGeometries(geometries))\n          .padding(\n            EdgeInsets(\n              /* top = */ 100.0,\n              /* left = */ 100.0,\n              /* bottom = */ 100.0,\n              /* right = */ 100.0\n            )\n          )\n          .build()\n      )\n    )\n  }\n\n  @SuppressLint(\"SetTextI18n\")\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    binding = ActivityExtendedGeofencingBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n\n    mapboxMap.setCamera(\n      CameraOptions.Builder().center(\n        Point.fromLngLat(\n          LATITUDE, LONGITUDE\n        )\n      ).zoom(ZOOM).build()\n    )\n\n    locationPermissionHelper = LocationPermissionHelper(WeakReference(this))\n    locationPermissionHelper.checkBackgroundPermission {\n      // Postpone access to Geofence engine until we get location permissions\n      geofencing.configure(\n        GeofencingOptions.Builder().apply {\n          maximumMonitoredFeatures = 300_000\n        }.build(),\n        logGeofencingError(\"configure\")\n      )\n      startGeofencing()\n      (this.applicationContext as? MapboxApplication)?.registerGeofencingObserver()\n\n      requestNotificationPermission()\n\n      // Once we've location permission enable location puck\n      with(binding.mapView) {\n        location.locationPuck = createDefault2DPuck()\n        location.enabled = true\n        location.puckBearing = PuckBearing.COURSE\n        val onIndicatorPositionChangedListener = object : OnIndicatorPositionChangedListener {\n          override fun onIndicatorPositionChanged(point: Point) {\n            mapboxMap.setCamera(CameraOptions.Builder().center(point).zoom(ZOOM).pitch(0.0).build())\n            // We use only the first location to move camera so remove the listener immediate\n            location.removeOnIndicatorPositionChangedListener(this)\n          }\n        }\n        location.addOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n      }\n\n      mapboxMap.loadStyle(\n        styleExtension = style(Style.STANDARD) {\n          +geoJsonSource(DWELL_SOURCE_ID)\n          +geoJsonSource(ENTRY_SOURCE_ID)\n          +geoJsonSource(EXIT_SOURCE_ID)\n          +geoJsonSource(JUST_ADDED_ZONE_SOURCE_ID)\n\n          +fillLayer(layerId = ENTRY_LAYER_ID, sourceId = ENTRY_SOURCE_ID) {\n            fillColor(DARK_BLUE)\n            fillOpacity(LAYER_OPACITY)\n            fillOutlineColor(LAYER_OUTLINE_COLOR)\n          }\n          +fillLayer(layerId = EXIT_LAYER_ID, sourceId = EXIT_SOURCE_ID) {\n            fillColor(RED)\n            fillOpacity(LAYER_OPACITY)\n            fillOutlineColor(LAYER_OUTLINE_COLOR)\n          }\n          +fillLayer(layerId = DWELL_LAYER_ID, sourceId = DWELL_SOURCE_ID) {\n            fillColor(GREEN)\n            fillOpacity(LAYER_OPACITY)\n            fillOutlineColor(LAYER_OUTLINE_COLOR)\n          }\n          +fillLayer(layerId = JUST_ADDED_ZONE_LAYER_ID, sourceId = JUST_ADDED_ZONE_SOURCE_ID) {\n            fillColor(YELLOW)\n            fillOpacity(LAYER_OPACITY)\n            fillOutlineColor(LAYER_OUTLINE_COLOR)\n          }\n        }\n      )\n    }\n\n    binding.mapView.mapboxMap.addInteraction(\n      ClickInteraction { interactionContext ->\n        loadIsochroneGeofence(interactionContext)\n        return@ClickInteraction true\n      }\n    )\n    handleGeofenceIntent(intent)\n  }\n\n  private fun loadIsochroneGeofence(interactionContext: InteractionContext) {\n    showProgress(true)\n\n    val mapboxIsochroneRequest = MapboxIsochrone.builder()\n      .accessToken(resources.getString(R.string.mapbox_access_token))\n      .profile(IsochroneCriteria.PROFILE_DRIVING)\n      .addContoursMinutes(ISOCHRONE_CONTOURS_MINUTES)\n      .polygons(true)\n      .denoise(ISOCHRONE_DENOISE)\n      .coordinates(interactionContext.coordinateInfo.coordinate)\n      .build()\n\n    mapboxIsochroneRequest.enqueueCall(object : Callback<FeatureCollection> {\n      override fun onResponse(\n        call: Call<FeatureCollection>,\n        response: Response<FeatureCollection>\n      ) {\n        val responseFeature = response.body()?.features()?.first()\n        if (responseFeature == null) {\n          Toast.makeText(\n            this@ExtendedGeofencingActivity,\n            \"Isochrone request returned empty feature\",\n            Toast.LENGTH_LONG\n          ).show()\n          logD(TAG, \"Isochrone request returned empty feature\")\n        } else {\n          val properties = responseFeature.properties()!!\n          properties.addProperty(GeofencingPropertiesKeys.DWELL_TIME_KEY, DWELL_TIME)\n          val featureId = System.currentTimeMillis().toString()\n          val isoFeature = Feature.fromGeometry(\n            responseFeature.geometry(),\n            properties,\n            featureId\n          )\n\n          geofencing.addFeature(isoFeature, logGeofencingError<String>(\"addIsochroneFeature\"))\n          mapboxMap.getStyle { style ->\n            isoFeature.addFeature(style, JUST_ADDED_ZONE_SOURCE_ID, CUSTOM_ZONE_DATA_ID)\n            justAddedFeature.removeFeature(style, JUST_ADDED_ZONE_SOURCE_ID, CUSTOM_ZONE_DATA_ID)\n            justAddedFeature = isoFeature\n          }\n          showProgress(false)\n        }\n      }\n\n      override fun onFailure(call: Call<FeatureCollection>, t: Throwable) {\n        showProgress(false)\n        Toast.makeText(\n          this@ExtendedGeofencingActivity,\n          \"Isochrone request failed\",\n          Toast.LENGTH_LONG\n        ).show()\n        logD(TAG, \"Isochrone request failed\")\n      }\n    })\n  }\n\n  private fun requestNotificationPermission() {\n    if (ContextCompat.checkSelfPermission(\n        this,\n        Manifest.permission.POST_NOTIFICATIONS\n      ) == PackageManager.PERMISSION_GRANTED\n    ) {\n      createNotificationChannel()\n    } else {\n      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n        requestNotificationPermissionLauncher.launch(\n          Manifest.permission.POST_NOTIFICATIONS\n        )\n      }\n    }\n  }\n\n  override fun onRequestPermissionsResult(\n    requestCode: Int,\n    permissions: Array<String>,\n    grantResults: IntArray\n  ) {\n    super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n    locationPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults)\n  }\n\n  private fun showProgress(inProgress: Boolean) {\n    with(binding) {\n      progress.isVisible = inProgress\n    }\n  }\n\n  private fun startGeofencing() {\n    logD(TAG, \"startGeofencing\")\n    geofencing.addObserver(observer, logGeofencingError(\"addObserver\"))\n    geofencingStarted = true\n  }\n\n  private fun stopGeofencing() {\n    logD(TAG, \"stopGeofencingListeningToRenderOnMap\")\n    geofencing.removeObserver(observer, logGeofencingError(\"removeObserver\"))\n  }\n\n  private fun clearGeofences() =\n    geofencing.clearFeatures(logGeofencingError(\"clearFeatures\"))\n\n  override fun onDestroy() {\n    if (geofencingStarted) {\n      stopGeofencing()\n\n      if (!MapboxApplication.ENABLE_BACKGROUND_GEOFENCING) {\n        clearGeofences()\n      }\n    }\n\n    super.onDestroy()\n  }\n\n  @SuppressLint(\"MissingSuperCall\")\n  override fun onNewIntent(intent: Intent?) {\n    super.onNewIntent(intent)\n\n    handleGeofenceIntent(intent)\n  }\n\n  private fun handleGeofenceIntent(intent: Intent?) {\n    val featureId = intent?.getStringExtra(NOTIFICATION_FEATURE_ID)\n    val featureType = intent?.getStringExtra(NOTIFICATION_FEATURE_TYPE)\n\n    featureId?.let {\n      geofencing.getFeature(featureId) {\n        it.value?.let { geofenceState ->\n\n          val geofencingEvent = GeofencingEvent.Builder(\n            feature = geofenceState.feature,\n            timestamp = geofenceState.timestamp ?: Date()\n          ).build()\n          when (featureType) {\n            NOTIFICATION_FEATURE_EXIT -> observer.onExit(geofencingEvent)\n            NOTIFICATION_FEATURE_ENTRY -> observer.onEntry(geofencingEvent)\n            NOTIFICATION_FEATURE_DWELL -> observer.onDwell(geofencingEvent)\n            else -> {\n              logW(TAG, \"Unknown feature type $featureType\")\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun userRevokedConsentUi(isConsentGiven: Boolean) = lifecycleScope.launch {\n    with(binding) {\n      if (isConsentGiven) {\n        textGeofencesDisabled.visibility = View.GONE\n      } else {\n        textGeofencesDisabled.visibility = View.VISIBLE\n      }\n    }\n  }\n\n  private fun createNotificationChannel() {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n      val importance = NotificationManager.IMPORTANCE_HIGH\n      val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, importance)\n      val notificationManager: NotificationManager =\n        getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n      notificationManager.createNotificationChannel(channel)\n    }\n  }\n\n  private fun Feature?.removeFeature(style: Style, sourceId: String, dataId: String) {\n    this?.id()?.let { featureId ->\n      style.removeGeoJSONSourceFeatures(\n        sourceId, dataId, featureIds = listOf(featureId)\n      )\n    }\n  }\n\n  private fun Feature.addFeature(style: Style, sourceId: String, dataId: String) {\n    style.addGeoJSONSourceFeatures(\n      sourceId, dataId, features = listOf(this)\n    )\n  }\n\n  private fun <T> logGeofencingError(functionName: String): (result: Expected<GeofencingError, T>) -> Unit =\n    {\n      it.error?.let { geofenceError ->\n        logD(TAG, \"geofence.$functionName() error $geofenceError\")\n      }\n    }\n\n  companion object {\n    private const val TAG = \"GeofencingActivity\"\n\n    private const val ENTRY_SOURCE_ID = \"entry_source_id\"\n    private const val ENTRY_LAYER_ID = \"entry_layer_id\"\n    private const val ENTRY_DATA_ID = \"entry_data_id\"\n    private const val DWELL_SOURCE_ID = \"dwell_source_id\"\n    private const val DWELL_LAYER_ID = \"dwell_layer_id\"\n    private const val DWELL_DATA_ID = \"dwell_data_id\"\n    private const val EXIT_SOURCE_ID = \"exit_source_id\"\n    private const val EXIT_LAYER_ID = \"exit_layer_id\"\n    private const val EXIT_DATA_ID = \"exit_data_id\"\n    private const val JUST_ADDED_ZONE_SOURCE_ID = \"custom_zone_source_id\"\n    private const val JUST_ADDED_ZONE_LAYER_ID = \"custom_zone_layer_id\"\n    private const val CUSTOM_ZONE_DATA_ID = \"custom_zone_data_id\"\n    private const val CUSTOM_GEOFENCE_RADIUS = 500\n    private const val ISOCHRONE_CONTOURS_MINUTES = 5\n    private const val ISOCHRONE_DENOISE = .4f\n    private const val DWELL_TIME = 1\n    private const val LAYER_OPACITY = 0.6\n    private const val LAYER_OUTLINE_COLOR = \"#000\"\n    private const val DARK_BLUE = \"#4264fb\"\n    private const val RED = \"#f74e4e\"\n    private const val GREEN = \"#33c377\"\n    private const val YELLOW = \"#ffff00\"\n    private const val LATITUDE = 24.932492\n    private const val LONGITUDE = 60.167948\n    private const val ZOOM = 14.0\n    private const val CHANNEL_ID = \"GEOFENCE_NOTIFICATIONS_ID\"\n    private const val CHANNEL_NAME = \"GEOFENCE_NOTIFICATIONS\"\n    private const val ALERT_TITLE = \"Geofence alert\"\n    private const val NOTIFICATION_FEATURE_ID = \"notification_feature_id\"\n    private const val NOTIFICATION_FEATURE_TYPE = \"notification_feature_type\"\n    const val NOTIFICATION_FEATURE_DWELL = \"notification_feature_dwell\"\n    const val NOTIFICATION_FEATURE_ENTRY = \"notification_feature_entry\"\n    const val NOTIFICATION_FEATURE_EXIT = \"notification_feature_exit\"\n    private var notificationCounter = 0\n\n    fun showNotification(\n      appContext: Context,\n      text: String,\n      featureId: String?,\n      featureType: String\n    ) {\n\n      val intent = Intent(appContext, ExtendedGeofencingActivity::class.java).apply {\n        action = Intent.ACTION_VIEW\n        flags = Intent.FLAG_ACTIVITY_SINGLE_TOP\n        putExtra(NOTIFICATION_FEATURE_ID, featureId)\n        putExtra(NOTIFICATION_FEATURE_TYPE, featureType)\n      }\n      val pendingIntent: PendingIntent =\n        PendingIntent.getActivity(\n          appContext,\n          notificationCounter,\n          intent,\n          PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE\n        )\n\n      val builder = NotificationCompat.Builder(appContext, CHANNEL_ID)\n        .setSmallIcon(R.drawable.mapbox_logo_helmet)\n        .setContentTitle(ALERT_TITLE)\n        .setContentText(text)\n        .setPriority(NotificationCompat.PRIORITY_HIGH)\n        .setContentIntent(pendingIntent)\n        .setAutoCancel(true)\n\n      with(NotificationManagerCompat.from(appContext)) {\n        if (ActivityCompat.checkSelfPermission(\n            appContext,\n            Manifest.permission.POST_NOTIFICATIONS\n          ) == PackageManager.PERMISSION_GRANTED\n        ) {\n          try {\n            notify(++notificationCounter, builder.build())\n          } catch (e: SecurityException) {\n            logD(TAG, \"postGeofenceNotification: failed to post notification $e\")\n          }\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/geofence/SimpleGeofencingActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.geofence\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.google.gson.JsonObject\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.common.geofencing.GeofencingError\nimport com.mapbox.common.geofencing.GeofencingEvent\nimport com.mapbox.common.geofencing.GeofencingFactory\nimport com.mapbox.common.geofencing.GeofencingObserver\nimport com.mapbox.common.geofencing.GeofencingOptions\nimport com.mapbox.common.geofencing.GeofencingPropertiesKeys\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.GeometryCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.layers.getLayerAs\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.createDefault2DPuck\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.viewport\nimport com.mapbox.maps.testapp.databinding.ActivitySimpleGeofencingBinding\nimport com.mapbox.maps.testapp.utils.LocationPermissionHelper\nimport com.mapbox.turf.TurfConstants\nimport com.mapbox.turf.TurfTransformation\nimport kotlinx.coroutines.launch\nimport java.lang.ref.WeakReference\n\n/**\n * This example shows how to get updates from the geofence engine.\n * After the current location is received around it's created geofence zone and rendered in Yellow color.\n * Geofence callbacks are called when device location enters, dwells, or leaves loaded geofence zone.\n * Each aforementioned event is accompanied by rendering received feature (Blue, Green, Red colors ).\n */\nclass SimpleGeofencingActivity : AppCompatActivity() {\n\n  private lateinit var locationPermissionHelper: LocationPermissionHelper\n  private lateinit var binding: ActivitySimpleGeofencingBinding\n\n  private lateinit var mapboxMap: MapboxMap\n  private val customZonesFeatures = mutableListOf<Feature>()\n\n  private var geofencingStarted: Boolean = false\n\n  // NOTE: You need to grant location permissions before initialising GeofencingService with getOrCreate()\n  private val geofencing by lazy {\n    GeofencingFactory.getOrCreate()\n  }\n\n  private val observer: GeofencingObserver = object : GeofencingObserver {\n    override fun onEntry(event: GeofencingEvent) {\n      logD(TAG, \"onEntry() called with: feature id = ${event.feature.id()} at ${event.timestamp}\")\n      updateGeofenceZoneLayerColor(DARK_BLUE)\n    }\n\n    override fun onDwell(event: GeofencingEvent) {\n      logD(TAG, \"onDwell() called with:  feature id = ${event.feature.id()} at ${event.timestamp}\")\n      updateGeofenceZoneLayerColor(GREEN)\n    }\n\n    override fun onExit(event: GeofencingEvent) {\n      logD(TAG, \"onExit() called with:  feature id = ${event.feature.id()} at ${event.timestamp}\")\n      updateGeofenceZoneLayerColor(RED)\n    }\n\n    override fun onError(error: GeofencingError) {\n      logD(TAG, \"onError() called with: error = $error\")\n    }\n\n    override fun onUserConsentChanged(isConsentGiven: Boolean) {\n      logD(TAG, \"onUserConsentChanged() called with: isConsentGiven = $isConsentGiven\")\n      userRevokedConsentUi(isConsentGiven)\n    }\n\n    private fun updateGeofenceZoneLayerColor(fillColor: String) {\n      lifecycleScope.launch {\n        mapboxMap.getStyle { style ->\n          val layer = style.getLayerAs<FillLayer>(CUSTOM_GEOZONE_LAYER_ID)\n          layer?.fillColor(fillColor)\n          moveCameraToActiveFeatures()\n        }\n      }\n    }\n  }\n\n  private fun moveCameraToActiveFeatures() {\n    val geometries = buildList {\n      addAll(customZonesFeatures.map { it.geometry() })\n    }.filterNotNull()\n    binding.mapView.viewport.transitionTo(\n      binding.mapView.viewport.makeOverviewViewportState(\n        OverviewViewportStateOptions.Builder()\n          .geometry(GeometryCollection.fromGeometries(geometries))\n          .padding(\n            EdgeInsets(\n              /* top = */ 100.0,\n              /* left = */ 100.0,\n              /* bottom = */ 100.0,\n              /* right = */ 100.0\n            )\n          )\n          .build()\n      )\n    )\n  }\n\n  @SuppressLint(\"SetTextI18n\")\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    binding = ActivitySimpleGeofencingBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n\n    locationPermissionHelper = LocationPermissionHelper(WeakReference(this))\n    locationPermissionHelper.checkPermissions {\n      // Postpone access to Geofence engine until we get location permissions\n      geofencing.configure(\n        GeofencingOptions.Builder().apply {\n          maximumMonitoredFeatures = 300_000\n        }.build(),\n        logGeofencingError(\"configure\")\n      )\n      startGeofencing()\n\n      // Once we've location permission enable location puck\n      with(binding.mapView) {\n        location.locationPuck = createDefault2DPuck()\n        location.enabled = true\n        location.puckBearing = PuckBearing.COURSE\n        val onIndicatorPositionChangedListener = object : OnIndicatorPositionChangedListener {\n          override fun onIndicatorPositionChanged(point: Point) {\n            mapboxMap.setCamera(CameraOptions.Builder().center(point).zoom(ZOOM).pitch(0.0).build())\n            // We use only the first location to create the geofence so remove the listener immediate\n            location.removeOnIndicatorPositionChangedListener(this)\n            loadGeofenceAroundLocation(point)\n          }\n        }\n        location.addOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n      }\n\n      mapboxMap.loadStyle(\n        styleExtension = style(Style.STANDARD) {\n          +geoJsonSource(CUSTOM_GEOZONE_SOURCE_ID)\n\n          +fillLayer(layerId = CUSTOM_GEOZONE_LAYER_ID, sourceId = CUSTOM_GEOZONE_SOURCE_ID) {\n            fillColor(YELLOW)\n            fillOpacity(LAYER_OPACITY)\n            fillOutlineColor(LAYER_OUTLINE_COLOR)\n          }\n        }\n      )\n    }\n  }\n\n  /**\n   * Adds point Feature to GeofencingService to track it.\n   * Adds Polygon Feature, based on point, to the map to render the same geofence zone\n   */\n  private fun loadGeofenceAroundLocation(point: Point) {\n    val featureId = System.currentTimeMillis().toString()\n    val circleFeature = circleFeature(point, featureId)\n\n    val properties = JsonObject()\n    properties.addProperty(GeofencingPropertiesKeys.DWELL_TIME_KEY, DWELL_TIME)\n    properties.addProperty(GeofencingPropertiesKeys.POINT_RADIUS_KEY, CUSTOM_GEOFENCE_RADIUS)\n    // for geofences represented by Point the defaultRadius from [GeofencingOptions] is used.\n    val pointFeature = Feature.fromGeometry(\n      point,\n      properties,\n      featureId\n    )\n\n    geofencing.addFeature(pointFeature, logGeofencingError<String>(\"addCustomFeature\"))\n    mapboxMap.getStyle { style ->\n      style.addGeoJSONSourceFeatures(\n        CUSTOM_GEOZONE_SOURCE_ID,\n        CUSTOM_GEOZONE_DATA_ID,\n        features = listOf(circleFeature)\n      )\n\n      customZonesFeatures.add(circleFeature)\n    }\n  }\n\n  private fun circleFeature(\n    point: Point,\n    featureId: String\n  ): Feature = Feature.fromGeometry(\n    TurfTransformation.circle(\n      point, CUSTOM_GEOFENCE_RADIUS.toDouble(),\n      TurfConstants.UNIT_METERS\n    ),\n    JsonObject(),\n    featureId\n  )\n\n  override fun onRequestPermissionsResult(\n    requestCode: Int,\n    permissions: Array<String>,\n    grantResults: IntArray\n  ) {\n    super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n    locationPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults)\n  }\n\n  private fun startGeofencing() {\n    logD(TAG, \"startGeofencing\")\n    geofencing.addObserver(observer, logGeofencingError(\"addObserver\"))\n    geofencingStarted = true\n  }\n\n  private fun stopGeofencing() {\n    logD(TAG, \"stopGeofencingListeningToRenderOnMap\")\n    geofencing.removeObserver(observer, logGeofencingError(\"removeObserver\"))\n  }\n\n  private fun clearGeofences() =\n    geofencing.clearFeatures(logGeofencingError(\"clearFeatures\"))\n\n  override fun onDestroy() {\n    if (geofencingStarted) {\n      stopGeofencing()\n      clearGeofences()\n    }\n\n    super.onDestroy()\n  }\n\n  private fun userRevokedConsentUi(isConsentGiven: Boolean) = lifecycleScope.launch {\n    with(binding) {\n      if (isConsentGiven) {\n        textGeofencesDisabled.visibility = View.GONE\n      } else {\n        textGeofencesDisabled.visibility = View.VISIBLE\n      }\n    }\n  }\n\n  private fun <T> logGeofencingError(functionName: String): (result: Expected<GeofencingError, T>) -> Unit =\n    {\n      it.error?.let { geofenceError ->\n        logD(TAG, \"geofence.$functionName() error $geofenceError\")\n      }\n    }\n\n  companion object {\n    private const val TAG = \"GeofencingActivity\"\n\n    private const val CUSTOM_GEOZONE_SOURCE_ID = \"custom_geozone_source_id\"\n    private const val CUSTOM_GEOZONE_LAYER_ID = \"custom_geozone_layer_id\"\n    private const val CUSTOM_GEOZONE_DATA_ID = \"custom_geozone_data_id\"\n    private const val CUSTOM_GEOFENCE_RADIUS = 500\n    private const val DWELL_TIME = 1\n    private const val LAYER_OPACITY = 0.6\n    private const val LAYER_OUTLINE_COLOR = \"#000\"\n    private const val DARK_BLUE = \"#4264fb\"\n    private const val RED = \"#f74e4e\"\n    private const val GREEN = \"#33c377\"\n    private const val YELLOW = \"#ffff00\"\n    private const val ZOOM = 14.0\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/globe/GlobeActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.globe\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.atmosphere.generated.atmosphere\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.projection.generated.projection\nimport com.mapbox.maps.extension.style.style\n\n/**\n * This example uses the Style DSL [projection] to display the map as a 3D globe instead of the default Mercator projection.\n * A starry sky and atmosphere effects are added with Style DSL [atmosphere].\n */\nclass GlobeActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    mapView.mapboxMap.apply {\n      setCamera(\n        cameraOptions {\n          center(CENTER)\n          zoom(ZOOM)\n        }\n      )\n      loadStyle(\n        style(Style.STANDARD_SATELLITE) {\n          +atmosphere { }\n          +projection(ProjectionName.GLOBE)\n        }\n      )\n    }\n  }\n\n  private companion object {\n    private const val ZOOM = 0.45\n    private val CENTER = Point.fromLngLat(30.0, 50.0)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/globe/GlobeFlyToActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.globe\n\nimport android.graphics.Color.rgb\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.atmosphere.generated.atmosphere\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.projection.generated.projection\nimport com.mapbox.maps.extension.style.sources.generated.rasterDemSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.extension.style.terrain.generated.terrain\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.flyTo\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.addOnMapClickListener\nimport com.mapbox.maps.testapp.R\n\n/**\n * Use [MapboxMap.flyTo] on a map with globe projection, atmosphere and terrain to slowly zoom to a location.\n */\nclass GlobeFlyToActivity : AppCompatActivity(), OnMapClickListener {\n\n  private lateinit var mapboxMap: MapboxMap\n  private var isAtStart = true\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapboxMap = mapView.mapboxMap\n    mapboxMap.loadStyle(\n      style(Style.STANDARD_SATELLITE) {\n        +projection(ProjectionName.GLOBE)\n        +atmosphere {\n          color(rgb(220, 159, 159)) // Pink fog / lower atmosphere\n          highColor(rgb(220, 159, 159)) // Blue sky / upper atmosphere\n          horizonBlend(0.4) // Exaggerate atmosphere (default is .1)\n        }\n        +rasterDemSource(\"raster-dem\") {\n          url(\"mapbox://mapbox.terrain-rgb\")\n        }\n        +terrain(\"raster-dem\")\n      }\n    ) {\n      // Toast instructing user to tap on the map\n      Toast.makeText(\n        this@GlobeFlyToActivity,\n        getString(R.string.tap_on_map_instruction),\n        Toast.LENGTH_LONG\n      ).show()\n      mapboxMap.addOnMapClickListener(this@GlobeFlyToActivity)\n    }\n  }\n\n  override fun onMapClick(point: Point): Boolean {\n    val target = if (isAtStart) CAMERA_END else CAMERA_START\n    isAtStart = !isAtStart\n    mapboxMap.flyTo(\n      target,\n      mapAnimationOptions {\n        duration(12_000)\n      }\n    )\n    return true\n  }\n\n  private companion object {\n    private val CAMERA_START = cameraOptions {\n      center(Point.fromLngLat(80.0, 36.0))\n      zoom(1.0)\n      pitch(0.0)\n      bearing(0.0)\n    }\n    private val CAMERA_END = cameraOptions {\n      center(Point.fromLngLat(8.11862, 46.58842))\n      zoom(12.5)\n      pitch(75.0)\n      bearing(130.0)\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/globe/HeatmapLayerGlobeActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.globe\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.style.layers.generated.HeatmapLayer\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.layers.generated.heatmapLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.projection.generated.projection\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.databinding.ActivityHeatmapLayerBinding\n\n/**\n * Add earthquake frequency data to a style from a GeoJSON file and render\n * it on a map in globe projection using a HeatmapLayer.\n */\nclass HeatmapLayerGlobeActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityHeatmapLayerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    mapboxMap = binding.mapView.mapboxMap.apply {\n      loadStyle(\n        style(Style.STANDARD) {\n          +projection(ProjectionName.GLOBE)\n        }\n      ) { style ->\n        addRuntimeLayers(style)\n        mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n        mapboxMap.setStyleImportConfigProperty(\"basemap\", \"lightPreset\", Value.valueOf(\"night\"))\n      }\n    }\n  }\n\n  private fun addRuntimeLayers(style: Style) {\n    style.addSource(createEarthquakeSource())\n    style.addLayer(createHeatmapLayer())\n    style.addLayer(createCircleLayer())\n  }\n\n  private fun createEarthquakeSource(): GeoJsonSource {\n    return geoJsonSource(EARTHQUAKE_SOURCE_ID) {\n      data(EARTHQUAKE_SOURCE_URL)\n    }\n  }\n\n  private fun createHeatmapLayer(): HeatmapLayer {\n    return heatmapLayer(\n      HEATMAP_LAYER_ID,\n      EARTHQUAKE_SOURCE_ID\n    ) {\n      maxZoom(9.0)\n      sourceLayer(HEATMAP_LAYER_SOURCE)\n      // Begin color ramp at 0-stop with a 0-transparancy color\n      // to create a blur-like effect.\n      heatmapColor(\n        interpolate {\n          linear()\n          heatmapDensity()\n          stop {\n            literal(0)\n            rgba(33.0, 102.0, 172.0, 0.0)\n          }\n          stop {\n            literal(0.2)\n            rgb(103.0, 169.0, 207.0)\n          }\n          stop {\n            literal(0.4)\n            rgb(209.0, 229.0, 240.0)\n          }\n          stop {\n            literal(0.6)\n            rgb(253.0, 219.0, 240.0)\n          }\n          stop {\n            literal(0.8)\n            rgb(239.0, 138.0, 98.0)\n          }\n          stop {\n            literal(1)\n            rgb(178.0, 24.0, 43.0)\n          }\n        }\n      )\n      // Increase the heatmap weight based on frequency and property magnitude\n      heatmapWeight(\n        interpolate {\n          linear()\n          get { literal(\"mag\") }\n          stop {\n            literal(0)\n            literal(0)\n          }\n          stop {\n            literal(6)\n            literal(1)\n          }\n        }\n      )\n      // Increase the heatmap color weight weight by zoom level\n      // heatmap-intensity is a multiplier on top of heatmap-weight\n      heatmapIntensity(\n        interpolate {\n          linear()\n          zoom()\n          stop {\n            literal(0)\n            literal(1)\n          }\n          stop {\n            literal(9)\n            literal(3)\n          }\n        }\n      )\n      // Adjust the heatmap radius by zoom level\n      heatmapRadius(\n        interpolate {\n          linear()\n          zoom()\n          stop {\n            literal(0)\n            literal(2)\n          }\n          stop {\n            literal(9)\n            literal(20)\n          }\n        }\n      )\n      // Transition from heatmap to circle layer by zoom level\n      heatmapOpacity(\n        interpolate {\n          linear()\n          zoom()\n          stop {\n            literal(7)\n            literal(1)\n          }\n          stop {\n            literal(9)\n            literal(0)\n          }\n        }\n      )\n      slot(\"middle\")\n    }\n  }\n\n  private fun createCircleLayer(): CircleLayer {\n    return circleLayer(\n      CIRCLE_LAYER_ID,\n      EARTHQUAKE_SOURCE_ID\n    ) {\n      circleRadius(\n        interpolate {\n          linear()\n          zoom()\n          stop {\n            literal(7)\n            interpolate {\n              linear()\n              get { literal(\"mag\") }\n              stop {\n                literal(1)\n                literal(1)\n              }\n              stop {\n                literal(6)\n                literal(4)\n              }\n            }\n          }\n          stop {\n            literal(16)\n            interpolate {\n              linear()\n              get { literal(\"mag\") }\n              stop {\n                literal(1)\n                literal(5)\n              }\n              stop {\n                literal(6)\n                literal(50)\n              }\n            }\n          }\n        }\n      )\n      circleColor(\n        interpolate {\n          linear()\n          get { literal(\"mag\") }\n          stop {\n            literal(1)\n            rgba(33.0, 102.0, 172.0, 0.0)\n          }\n          stop {\n            literal(2)\n            rgb(102.0, 169.0, 207.0)\n          }\n          stop {\n            literal(3)\n            rgb(209.0, 229.0, 240.0)\n          }\n          stop {\n            literal(4)\n            rgb(253.0, 219.0, 199.0)\n          }\n          stop {\n            literal(5)\n            rgb(239.0, 138.0, 98.0)\n          }\n          stop {\n            literal(6)\n            rgb(178.0, 24.0, 43.0)\n          }\n        }\n      )\n      circleOpacity(\n        interpolate {\n          linear()\n          zoom()\n          stop {\n            literal(7)\n            literal(0)\n          }\n          stop {\n            literal(8)\n            literal(1)\n          }\n        }\n      )\n      circleStrokeColor(\"white\")\n      circleStrokeWidth(0.1)\n      slot(\"middle\")\n    }\n  }\n\n  companion object {\n    private const val EARTHQUAKE_SOURCE_URL =\n      \"https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson\"\n    private const val EARTHQUAKE_SOURCE_ID = \"earthquakes\"\n    private const val HEATMAP_LAYER_ID = \"earthquakes-heat\"\n    private const val HEATMAP_LAYER_SOURCE = \"earthquakes\"\n    private const val CIRCLE_LAYER_ID = \"earthquakes-circle\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/globe/SpinningGlobeActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.globe\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.os.Bundle\nimport android.view.animation.LinearInterpolator\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.android.gestures.RotateGestureDetector\nimport com.mapbox.android.gestures.StandardScaleGestureDetector\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.atmosphere.generated.atmosphere\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.projection.generated.projection\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.easeTo\nimport com.mapbox.maps.plugin.gestures.OnMoveListener\nimport com.mapbox.maps.plugin.gestures.OnRotateListener\nimport com.mapbox.maps.plugin.gestures.OnScaleListener\nimport com.mapbox.maps.plugin.gestures.gestures\n\n/**\n * This example combines a [GlobeActivity] and camera animation to create a rotating planet effect.\n *\n * The rotation animation is continued indefinitely by calling [MapboxMap.easeTo] on animation end.\n * Rotation is paused on user interaction and slows to a stop at high zoom levels.\n */\nclass SpinningGlobeActivity : AppCompatActivity() {\n\n  private var userInteracting = false\n  private var spinEnabled = true\n\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var runningAnimation: Cancelable\n\n  private fun spinGlobe() {\n    val zoom = mapboxMap.cameraState.zoom\n    if (spinEnabled && !userInteracting && zoom < MAX_SPIN_ZOOM) {\n      var distancePerSecond = 360.0 / SECONDS_PER_REVOLUTION\n      if (zoom > SLOW_SPIN_ZOOM) {\n        // Slow spinning at higher zooms\n        val zoomDif = (MAX_SPIN_ZOOM - zoom) / (MAX_SPIN_ZOOM - SLOW_SPIN_ZOOM)\n        distancePerSecond *= zoomDif\n      }\n      val center = mapboxMap.cameraState.center\n      val targetCenter = Point.fromLngLat(center.longitude() - distancePerSecond, center.latitude())\n      // Smoothly animate the map over one second.\n      // When this animation is complete, call it again\n      runningAnimation = mapboxMap.easeTo(\n        cameraOptions { center(targetCenter) },\n        mapAnimationOptions {\n          duration(1_000L)\n          interpolator(LinearInterpolator())\n        },\n        animatorListener = object : AnimatorListenerAdapter() {\n          override fun onAnimationEnd(animation: Animator) {\n            spinGlobe()\n          }\n        }\n      )\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    mapView.gestures.addOnMoveListener(object : OnMoveListener {\n      override fun onMoveBegin(detector: MoveGestureDetector) {\n        userInteracting = true\n        runningAnimation.cancel()\n      }\n\n      override fun onMove(detector: MoveGestureDetector): Boolean {\n        // return false in order to actually handle user movement\n        return false\n      }\n\n      override fun onMoveEnd(detector: MoveGestureDetector) {\n        userInteracting = false\n        spinGlobe()\n      }\n    })\n\n    mapView.gestures.addOnRotateListener(object : OnRotateListener {\n      override fun onRotateBegin(detector: RotateGestureDetector) {\n        userInteracting = true\n        runningAnimation.cancel()\n      }\n\n      override fun onRotate(detector: RotateGestureDetector) {\n        // no-op\n      }\n\n      override fun onRotateEnd(detector: RotateGestureDetector) {\n        userInteracting = false\n        spinGlobe()\n      }\n    })\n\n    mapView.gestures.addOnScaleListener(object : OnScaleListener {\n      override fun onScaleBegin(detector: StandardScaleGestureDetector) {\n        userInteracting = true\n        runningAnimation.cancel()\n      }\n\n      override fun onScale(detector: StandardScaleGestureDetector) {\n        // no-op\n      }\n\n      override fun onScaleEnd(detector: StandardScaleGestureDetector) {\n        userInteracting = false\n        spinGlobe()\n      }\n    })\n\n    mapboxMap = mapView.mapboxMap.apply {\n      loadStyle(\n        style(Style.STANDARD_SATELLITE) {\n          +atmosphere { }\n          +projection(ProjectionName.GLOBE)\n        }\n      ) {\n        setCamera(\n          cameraOptions {\n            center(CENTER)\n            zoom(ZOOM)\n          }\n        )\n        spinGlobe()\n      }\n    }\n  }\n\n  private companion object {\n    private const val ZOOM = 1.5\n    private val CENTER = Point.fromLngLat(-90.0, 40.0)\n\n    private const val EASE_TO_DURATION = 1_000L\n    // At low zooms, complete a revolution every two minutes.\n    private const val SECONDS_PER_REVOLUTION = 120\n    // Above zoom level 5, do not rotate.\n    private const val MAX_SPIN_ZOOM = 5\n    // Rotate at intermediate speeds between zoom levels 3 and 5.\n    private const val SLOW_SPIN_ZOOM = 3\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/java/DSLStylingJavaActivity.java",
    "content": "package com.mapbox.maps.testapp.examples.java;\n\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.concat;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.get;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.gt;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.literal;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.rgb;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.subtract;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.toNumber;\nimport static java.text.DateFormat.getDateTimeInstance;\n\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport com.mapbox.geojson.Point;\nimport com.mapbox.maps.MapLoadingError;\nimport com.mapbox.maps.MapLoadingErrorCallback;\nimport com.mapbox.maps.MapView;\nimport com.mapbox.maps.MapboxMap;\nimport com.mapbox.maps.QueriedRenderedFeature;\nimport com.mapbox.maps.RenderedQueryGeometry;\nimport com.mapbox.maps.RenderedQueryOptions;\nimport com.mapbox.maps.ScreenBox;\nimport com.mapbox.maps.ScreenCoordinate;\nimport com.mapbox.maps.Style;\nimport com.mapbox.maps.extension.style.StyleContract;\nimport com.mapbox.maps.extension.style.StyleExtensionImpl;\nimport com.mapbox.maps.extension.style.expressions.generated.Expression;\nimport com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl;\nimport com.mapbox.maps.extension.style.image.ImageUtils;\nimport com.mapbox.maps.extension.style.layers.generated.CircleLayer;\nimport com.mapbox.maps.extension.style.layers.generated.RasterLayer;\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer;\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor;\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource;\nimport com.mapbox.maps.extension.style.sources.generated.ImageSource;\nimport com.mapbox.maps.plugin.gestures.GesturesUtils;\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener;\nimport com.mapbox.maps.testapp.R;\n\nimport org.jetbrains.annotations.NotNull;\n\nimport java.text.DateFormat;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Example showcasing usage of creating style with java codes.\n */\npublic class DSLStylingJavaActivity extends AppCompatActivity implements OnMapClickListener, MapLoadingErrorCallback {\n    public static final ArrayList<ArrayList<Double>> POINT_LIST = new ArrayList<ArrayList<Double>>() {\n        {\n            add(new ArrayList<Double>() {\n                {\n                    add(-35.859375);\n                    add(58.44773280389084);\n                }\n            });\n            add(new ArrayList<Double>() {\n                {\n                    add(-16.171875);\n                    add(58.44773280389084);\n                }\n            });\n            add(new ArrayList<Double>() {\n                {\n                    add(-16.171875);\n                    add(54.7246201949245);\n                }\n            });\n            add(new ArrayList<Double>() {\n                {\n                    add(-35.859375);\n                    add(54.7246201949245);\n                }\n            });\n        }\n    };\n    private static final String IMAGE_URL = \"https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Mapbox_logo_2019.svg/2560px-Mapbox_logo_2019.svg.png\";\n    private static final String GEOJSON_URL = \"https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson\";\n    private static final String SOURCE_ID = \"earthquakes\";\n    private static final String IMAGE_SOURCE_ID = \"image\";\n    private static final String CIRCLE_LAYER_ID = \"earthquakeCircle\";\n    private static final String SYMBOL_LAYER_ID = \"earthquakeText\";\n    private static final String RASTER_LAYER_ID = \"raster\";\n    private static final String IMAGE_9_PATCH_ID = \"image9patch\";\n    private static final Expression MAG_KEY = literal(\"mag\");\n    private static final List<String> QUERY_LIST = new ArrayList<String>() {\n        {\n            add(CIRCLE_LAYER_ID);\n            add(SYMBOL_LAYER_ID);\n        }\n    };\n    public static final ArrayList<String> TEXT_FONT = new ArrayList<String>() {\n        {\n            add(\"Open Sans Regular\");\n            add(\"Arial Unicode MS Regular\");\n        }\n    };\n    private MapboxMap mapboxMap;\n\n    private static final String TAG = \"StylingJavaActivity\";\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        MapView mapView = new MapView(this);\n        setContentView(mapView);\n        mapboxMap = mapView.getMapboxMap();\n        mapboxMap.subscribeMapLoadingError(this);\n        mapboxMap.loadStyle(createStyle(), style -> {\n            Bitmap bitmap = BitmapFactory.decodeResource(DSLStylingJavaActivity.this.getResources(), R.drawable.blue_round_nine);\n            ImageUtils.addImage9Patch(style, new ImageNinePatchExtensionImpl.Builder(IMAGE_9_PATCH_ID, bitmap).build());\n            ImageUtils.image9Patch(IMAGE_9_PATCH_ID, bitmap, builder -> {\n                builder.build();\n                return null;\n            });\n        });\n        GesturesUtils.addOnMapClickListener(mapboxMap, this);\n\n        // subscribe to map idle event\n        mapboxMap.subscribeMapIdle(mapIdle -> Log.d(TAG, \"mapIdle event : \" + mapIdle.getTimestamp()));\n    }\n\n    @Override\n    public boolean onMapClick(@NotNull Point point) {\n        ScreenCoordinate clicked = mapboxMap.pixelForCoordinate(point);\n        mapboxMap.queryRenderedFeatures(\n                new RenderedQueryGeometry(new ScreenBox(\n                        new ScreenCoordinate(clicked.getX() - 50, clicked.getY() - 50),\n                        new ScreenCoordinate(clicked.getX() + 50, clicked.getY() + 50)\n                )),\n                new RenderedQueryOptions(QUERY_LIST, literal(true)), features -> {\n                    List<QueriedRenderedFeature> featureList = features.getValue();\n                    if (featureList != null && !featureList.isEmpty()) {\n                        Number time = featureList.get(0).getQueriedFeature().getFeature().getNumberProperty(\"time\");\n                        Toast.makeText(DSLStylingJavaActivity.this, getDateTime(time.longValue()), Toast.LENGTH_SHORT).show();\n                    }\n                });\n        return true;\n    }\n\n    private String getDateTime(Long time) {\n        String dateTime = null;\n        try {\n            DateFormat sdf = getDateTimeInstance();\n            Date netDate = new Date(time);\n            dateTime = sdf.format(netDate);\n        } catch (Exception e) {\n            Log.w(TAG, \"getDateTime: Unable to parse \" + time, e);\n        }\n        return dateTime;\n    }\n\n    private StyleContract.StyleExtension createStyle() {\n        StyleExtensionImpl.Builder builder = new StyleExtensionImpl.Builder(Style.STANDARD);\n\n        // Add a image source\n        builder.addSource(\n                new ImageSource.Builder(IMAGE_SOURCE_ID)\n                        .coordinates(POINT_LIST)\n                        .url(IMAGE_URL)\n                        .build()\n        );\n        // Add a rasterLayer show the image\n        RasterLayer rasterLayer = new RasterLayer(RASTER_LAYER_ID, IMAGE_SOURCE_ID);\n        rasterLayer.rasterOpacity(0.8);\n        builder.addLayer(rasterLayer);\n        // Add the earthquake source\n        builder.addSource(new GeoJsonSource.Builder(SOURCE_ID)\n                .data(GEOJSON_URL)\n                .cluster(false)\n                .build()\n        );\n\n        // Add circleLayer which will show the earthquake locations\n        CircleLayer circleLayer = new CircleLayer(CIRCLE_LAYER_ID, SOURCE_ID);\n        circleLayer.circleRadius(get(MAG_KEY));\n        circleLayer.circleColor(rgb(255.0, 0.0, 0.0));\n        circleLayer.circleOpacity(0.3);\n        circleLayer.circleStrokeColor(Color.WHITE);\n        builder.addLayer(circleLayer);\n\n        // Add symbolLayer show earthquakes those greater than mag 5.0\n        SymbolLayer symbolLayer = new SymbolLayer(SYMBOL_LAYER_ID, SOURCE_ID);\n        symbolLayer.filter(gt(get(MAG_KEY), literal(5.0)));\n        Expression concat = concat(MAG_KEY, Expression.toString(get(MAG_KEY)));\n        symbolLayer.textField(concat);\n        symbolLayer.textFont(TEXT_FONT);\n        symbolLayer.textColor(Color.BLACK);\n        symbolLayer.textHaloColor(Color.WHITE);\n        symbolLayer.textHaloWidth(1.0);\n        symbolLayer.textAnchor(TextAnchor.TOP);\n        symbolLayer.textOffset(new ArrayList<Double>() {{\n            add(0.0);\n            add(1.0);\n        }});\n        symbolLayer.textSize(10.0);\n        symbolLayer.textIgnorePlacement(false);\n        symbolLayer.symbolSortKey(subtract(toNumber(get(MAG_KEY))));\n        builder.addLayerAtPosition(builder.layerAtPosition(symbolLayer, CIRCLE_LAYER_ID));\n\n        return builder.build();\n    }\n\n    @Override\n    public void run(@NonNull MapLoadingError mapLoadingError) {\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/java/RuntimeStylingJavaActivity.java",
    "content": "package com.mapbox.maps.testapp.examples.java;\n\nimport static com.mapbox.maps.MapboxLogger.logD;\nimport static com.mapbox.maps.MapboxLogger.logE;\nimport static com.mapbox.maps.MapboxLogger.logI;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.eq;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.get;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.image;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.literal;\nimport static com.mapbox.maps.extension.style.expressions.generated.Expression.subtract;\n\nimport android.graphics.Bitmap;\nimport android.graphics.Color;\nimport android.graphics.drawable.Drawable;\nimport android.os.Bundle;\n\nimport androidx.annotation.OptIn;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.graphics.drawable.DrawableKt;\n\nimport com.mapbox.bindgen.Expected;\nimport com.mapbox.bindgen.None;\nimport com.mapbox.bindgen.Value;\nimport com.mapbox.geojson.FeatureCollection;\nimport com.mapbox.maps.ExtensionUtils;\nimport com.mapbox.maps.MapView;\nimport com.mapbox.maps.MapboxDelicateApi;\nimport com.mapbox.maps.MapboxMap;\nimport com.mapbox.maps.Style;\nimport com.mapbox.maps.extension.style.expressions.generated.Expression;\nimport com.mapbox.maps.extension.style.image.ImageUtils;\nimport com.mapbox.maps.extension.style.layers.LayerUtils;\nimport com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer;\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer;\nimport com.mapbox.maps.extension.style.layers.generated.RasterLayer;\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer;\nimport com.mapbox.maps.extension.style.layers.properties.generated.Anchor;\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor;\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor;\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility;\nimport com.mapbox.maps.extension.style.light.LightUtils;\nimport com.mapbox.maps.extension.style.light.generated.FlatLight;\nimport com.mapbox.maps.extension.style.sources.SourceUtils;\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource;\nimport com.mapbox.maps.extension.style.sources.generated.ImageSource;\nimport com.mapbox.maps.extension.style.sources.generated.VectorSource;\nimport com.mapbox.maps.testapp.R;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\n/**\n * Example showcasing usage of creating runtime style with java codes.\n */\npublic class RuntimeStylingJavaActivity extends AppCompatActivity {\n    private static String TAG = \"RuntimeStylingJavaActivity\";\n    private static final String POLYGON_SOURCE_ID = \"polygon\";\n    private static final String FILL_EXTRUSION_LAYER_ID = \"fillextrusion\";\n    private static final String RASTER_LAYER_ID = \"raster\";\n    private static final String IMAGE_SOURCE_URL = \"https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Mapbox_logo_2019.svg/2560px-Mapbox_logo_2019.svg.png\";\n    private static final String GEOJSON_SOURCE_ID = \"geojsonSource\";\n    private static final String SYMBOL_LAYER_ID = \"symbolLayer\";\n    private static final String IMAGE_ID = \"image\";\n    private static final String IMAGE_SOURCE_ID = \"imageSource\";\n    private static final ArrayList<String> TEXT_FONT = new ArrayList<String>() {\n        {\n            add(\"Open Sans Regular\");\n            add(\"Arial Unicode MS Regular\");\n        }\n    };\n    private static final ArrayList<ArrayList<Double>> POINT_LIST = new ArrayList<ArrayList<Double>>() {\n        {\n            add(new ArrayList<Double>() {\n                {\n                    add(-35.859375);\n                    add(58.44773280389084);\n                }\n            });\n            add(new ArrayList<Double>() {\n                {\n                    add(-16.171875);\n                    add(58.44773280389084);\n                }\n            });\n            add(new ArrayList<Double>() {\n                {\n                    add(-16.171875);\n                    add(54.7246201949245);\n                }\n            });\n            add(new ArrayList<Double>() {\n                {\n                    add(-35.859375);\n                    add(54.7246201949245);\n                }\n            });\n        }\n    };\n    private static String SYMBOL_SOURCE_FEATURECOLLECTION = \"{\\n\" +\n            \"\\\"type\\\": \\\"FeatureCollection\\\",\\n\" +\n            \"\\\"features\\\": [\\n\" +\n            \"  {\\n\" +\n            \"    \\\"type\\\": \\\"Feature\\\",\\n\" +\n            \"    \\\"properties\\\": {\\n\" +\n            \"      \\\"count\\\": 0\\n\" +\n            \"    },\\n\" +\n            \"    \\\"geometry\\\": {\\n\" +\n            \"      \\\"type\\\": \\\"Point\\\",\\n\" +\n            \"      \\\"coordinates\\\": [\\n\" +\n            \"-42.978515625,\\n\" +\n            \"22.024545601240337\\n\" +\n            \"      ]\\n\" +\n            \"    }\\n\" +\n            \"  },\\n\" +\n            \"  {\\n\" +\n            \"    \\\"type\\\": \\\"Feature\\\",\\n\" +\n            \"    \\\"properties\\\": {\\n\" +\n            \"      \\\"count\\\": 0\\n\" +\n            \"    },\\n\" +\n            \"    \\\"geometry\\\": {\\n\" +\n            \"      \\\"type\\\": \\\"Point\\\",\\n\" +\n            \"      \\\"coordinates\\\": [\\n\" +\n            \"-29.355468750000004,\\n\" +\n            \"25.64152637306577\\n\" +\n            \"      ]\\n\" +\n            \"    }\\n\" +\n            \"  },\\n\" +\n            \"  {\\n\" +\n            \"    \\\"type\\\": \\\"Feature\\\",\\n\" +\n            \"    \\\"properties\\\": {\\n\" +\n            \"      \\\"count\\\": 1\\n\" +\n            \"    },\\n\" +\n            \"    \\\"geometry\\\": {\\n\" +\n            \"      \\\"type\\\": \\\"Point\\\",\\n\" +\n            \"      \\\"coordinates\\\": [\\n\" +\n            \"-3.69140625,\\n\" +\n            \"-4.214943141390639\\n\" +\n            \"      ]\\n\" +\n            \"    }\\n\" +\n            \"  },\\n\" +\n            \"  {\\n\" +\n            \"    \\\"type\\\": \\\"Feature\\\",\\n\" +\n            \"    \\\"properties\\\": {\\n\" +\n            \"      \\\"count\\\": 1              \\n\" +\n            \"    },\\n\" +\n            \"    \\\"geometry\\\": {\\n\" +\n            \"      \\\"type\\\": \\\"Point\\\",\\n\" +\n            \"      \\\"coordinates\\\": [\\n\" +\n            \"-27.861328125,\\n\" +\n            \"3.337953961416485\\n\" +\n            \"      ]\\n\" +\n            \"    }\\n\" +\n            \"  },\\n\" +\n            \"  {\\n\" +\n            \"    \\\"type\\\": \\\"Feature\\\",\\n\" +\n            \"    \\\"properties\\\": {\\n\" +\n            \"      \\\"count\\\": 1\\n\" +\n            \"    },\\n\" +\n            \"    \\\"geometry\\\": {\\n\" +\n            \"      \\\"type\\\": \\\"Point\\\",\\n\" +\n            \"      \\\"coordinates\\\": [\\n\" +\n            \"-27.773437499999996,\\n\" +\n            \"-17.644022027872712\\n\" +\n            \"      ]\\n\" +\n            \"    }\\n\" +\n            \"  }\\n\" +\n            \"]\\n\" +\n            \"}\";\n    private static final String FILL_FEATURE_COLLECTION = \"{\\n\" +\n            \"\\\"type\\\": \\\"FeatureCollection\\\",\\n\" +\n            \"\\\"features\\\": [\\n\" +\n            \"  {\\n\" +\n            \"    \\\"type\\\": \\\"Feature\\\",\\n\" +\n            \"    \\\"properties\\\": {},\\n\" +\n            \"    \\\"geometry\\\": {\\n\" +\n            \"      \\\"type\\\": \\\"Polygon\\\",\\n\" +\n            \"      \\\"coordinates\\\": [\\n\" +\n            \"        [\\n\" +\n            \"          [\\n\" +\n            \"            -366.85546875,\\n\" +\n            \"            18.145851771694467\\n\" +\n            \"          ],\\n\" +\n            \"          [\\n\" +\n            \"            -373.27148437499994,\\n\" +\n            \"            12.726084296948196\\n\" +\n            \"          ],\\n\" +\n            \"          [\\n\" +\n            \"            -364.39453125,\\n\" +\n            \"            6.577303118123887\\n\" +\n            \"          ],\\n\" +\n            \"          [\\n\" +\n            \"            -366.85546875,\\n\" +\n            \"            18.145851771694467\\n\" +\n            \"          ]\\n\" +\n            \"        ]\\n\" +\n            \"      ]\\n\" +\n            \"    }\\n\" +\n            \"  }\\n\" +\n            \"]\\n\" +\n            \"      }\";\n    private MapboxMap mapboxMap;\n    private MapView mapView;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        mapView = new MapView(this);\n        setContentView(mapView);\n        mapboxMap = mapView.getMapboxMap();\n        mapboxMap.loadStyle(Style.MAPBOX_STREETS, this::setUpStyle);\n    }\n\n    private void setUpStyle(Style style) {\n        addImage(style);\n        addSymbolSource(style);\n        addSymbolLayer(style);\n\n        addFillSource(style);\n        setFillLayer(style);\n        addFillExtrusionLayer(style);\n        addFillExtrusionLight(style);\n\n        addImageSource(style);\n        addRasterLayer(style);\n\n        addLayerWithoutStyleExtension(style);\n\n        final VectorSource source = (VectorSource) SourceUtils.getSource(style, \"composite\");\n        logE(TAG, \"getSource: \" + source);\n    }\n\n    private void addImage(Style style) {\n        final Drawable drawable = ContextCompat.getDrawable(this, R.drawable.android_symbol);\n        final Bitmap bitmap = DrawableKt.toBitmap(drawable, 64, 64, null);\n        ImageUtils.addImage(style, delegate -> delegate.addImage(IMAGE_ID, bitmap));\n    }\n\n    private void addSymbolSource(Style style) {\n        final FeatureCollection featureCollection = FeatureCollection.fromJson(SYMBOL_SOURCE_FEATURECOLLECTION);\n        final GeoJsonSource geoJsonSource = new GeoJsonSource.Builder(GEOJSON_SOURCE_ID)\n                .featureCollection(featureCollection)\n                .cluster(true)\n                .prefetchZoomDelta(1)\n                .build();\n        logI(TAG, geoJsonSource.toString());\n        SourceUtils.addSource(style, geoJsonSource);\n        logI(TAG, \"prefetchZoomDelta :\" + geoJsonSource.getPrefetchZoomDelta());\n    }\n\n    private void addSymbolLayer(Style style) {\n        final Expression textField = new Expression.FormatBuilder()\n                .formatSection(\"London\", formatSectionBuilder -> {\n                    formatSectionBuilder.fontScale(1.0);\n                    formatSectionBuilder.textFont(TEXT_FONT);\n                    formatSectionBuilder.textColor(Color.RED);\n                    return null;\n                }).formatSection(image(literal(\"london-underground\")), formatSectionBuilder -> {\n                    formatSectionBuilder.fontScale(0.9);\n                    return null;\n                }).formatSection(\"underground\", formatSectionBuilder -> {\n                    formatSectionBuilder.fontScale(0.8);\n                    formatSectionBuilder.textFont(TEXT_FONT);\n                    formatSectionBuilder.textColor(Color.WHITE);\n                    return null;\n                }).build();\n\n        SymbolLayer symbolLayer = new SymbolLayer(SYMBOL_LAYER_ID, GEOJSON_SOURCE_ID);\n        symbolLayer.filter(eq(get(\"count\"), literal(0)));\n        symbolLayer.iconImage(literal(IMAGE_ID));\n        symbolLayer.iconOpacity(subtract(literal(1.0), literal(0.6)));\n        symbolLayer.textField(textField);\n        symbolLayer.iconColor(Color.GREEN);\n        symbolLayer.textAnchor(TextAnchor.CENTER);\n        symbolLayer.iconAnchor(IconAnchor.BOTTOM);\n        symbolLayer.textIgnorePlacement(false);\n        symbolLayer.iconIgnorePlacement(false);\n        LayerUtils.addLayer(style, symbolLayer);\n        logI(TAG, symbolLayer.getIconOpacityAsExpression().toString());\n    }\n\n    private void addFillSource(Style style) {\n        final GeoJsonSource polygon = new GeoJsonSource.Builder(POLYGON_SOURCE_ID)\n                .featureCollection(FeatureCollection.fromJson(FILL_FEATURE_COLLECTION))\n                .build();\n        logI(TAG, polygon.toString());\n        SourceUtils.addSource(style, polygon);\n    }\n\n    private void setFillLayer(Style style) {\n        final FillLayer fillLayer = (FillLayer) LayerUtils.getLayer(style, \"water\");\n        final Expression.InterpolatorBuilder interpolateBuilder = new Expression.InterpolatorBuilder(\"interpolate\");\n        interpolateBuilder.exponential(builder -> {\n            builder.literal(0.5);\n            return null;\n        });\n        interpolateBuilder.zoom();\n        interpolateBuilder.stop(builder -> {\n            builder.literal(1.0);\n            builder.color(Color.RED);\n            return null;\n        });\n        interpolateBuilder.stop(builder -> {\n            builder.literal(5.0);\n            builder.color(Color.BLUE);\n            return null;\n        });\n        interpolateBuilder.stop(builder -> {\n            builder.literal(10.0);\n            builder.color(Color.GREEN);\n            return null;\n        });\n        fillLayer.fillColor(interpolateBuilder.build());\n        fillLayer.visibility(Visibility.VISIBLE);\n        logI(TAG, fillLayer.getFillColorAsExpression().toString());\n    }\n\n\n    private void addFillExtrusionLayer(Style style) {\n        final FillExtrusionLayer fillExtrusionLayer = new FillExtrusionLayer(FILL_EXTRUSION_LAYER_ID, POLYGON_SOURCE_ID);\n        fillExtrusionLayer.fillExtrusionHeight(1000000.0);\n        fillExtrusionLayer.fillExtrusionColor(Color.GRAY);\n        fillExtrusionLayer.fillExtrusionOpacity(1.0);\n        LayerUtils.addLayer(style, fillExtrusionLayer);\n    }\n\n    private void addFillExtrusionLight(Style style) {\n        final FlatLight light = new FlatLight(\"flat\");\n        light.anchor(Anchor.MAP);\n        light.color(Color.YELLOW);\n        light.position(10.0, 40.0, 50.0);\n        LightUtils.setLight(style, light);\n    }\n\n    private void addImageSource(Style style) {\n        final ImageSource imageSource = new ImageSource.Builder(IMAGE_SOURCE_ID).build();\n        imageSource.url(IMAGE_SOURCE_URL);\n        imageSource.coordinates(POINT_LIST);\n        SourceUtils.addSource(style, imageSource);\n    }\n\n    private void addRasterLayer(Style style) {\n        final RasterLayer raster = new RasterLayer(RASTER_LAYER_ID, IMAGE_SOURCE_ID);\n        LayerUtils.addLayer(style, raster);\n    }\n\n    @OptIn(markerClass = MapboxDelicateApi.class)\n    private void addLayerWithoutStyleExtension(Style style) {\n        final Drawable drawable = ContextCompat.getDrawable(this, R.drawable.android_symbol);\n        final Bitmap bitmap = DrawableKt.toBitmap(drawable, 64, 64, null);\n        final Expected<String, None> expected = style.addStyleImage(\n                IMAGE_ID,\n                1f,\n                ExtensionUtils.toMapboxImage(bitmap),\n                false,\n                new ArrayList<>(),\n                new ArrayList<>(),\n                null\n        );\n        if (expected.isError()) {\n            logE(TAG, expected.getError());\n        }\n        if (expected.isValue()) {\n            logD(TAG, expected.getValue().toString());\n        }\n\n        final HashMap<String, Value> sourceParams = new HashMap<>();\n        sourceParams.put(\"type\", new Value(\"geojson\"));\n        final HashMap<String, Value> data = new HashMap<>();\n        data.put(\"type\", new Value(\"Feature\"));\n        final HashMap<String, Value> geometry = new HashMap<>();\n        geometry.put(\"type\", new Value(\"Point\"));\n        geometry.put(\"coordinates\", new Value(new ArrayList<Value>() {\n            {\n                add(new Value(24.9384));\n                add(new Value(60.1699));\n            }\n        }));\n        data.put(\"geometry\", new Value(geometry));\n        sourceParams.put(\"data\", new Value(data));\n        style.addStyleSource(\"source\", new Value(sourceParams));\n\n        final HashMap<String, Value> layerParams = new HashMap<>();\n        layerParams.put(\"id\", new Value(\"layer\"));\n        layerParams.put(\"type\", new Value(\"symbol\"));\n        layerParams.put(\"source\", new Value(\"source\"));\n        style.addStyleLayer(new Value(layerParams), null);\n        style.setStyleLayerProperty(\"layer\", \"icon-image\", new Value(IMAGE_ID));\n        style.setStyleLayerProperty(\"layer\", \"icon-opacity\", new Value(1.0));\n        style.setStyleLayerProperty(\"layer\", \"icon-size\", new Value(5.0));\n        style.setStyleLayerProperty(\"layer\", \"icon-color\", new Value(\"white\"));\n    }\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n        mapView.onStart();\n    }\n\n    @Override\n    protected void onStop() {\n        super.onStop();\n        mapView.onStop();\n    }\n\n    @Override\n    public void onLowMemory() {\n        super.onLowMemory();\n        mapView.onLowMemory();\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        mapView.onDestroy();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/linesandpolygons/DrawGeoJsonLineActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.linesandpolygons\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\n\n/**\n * Load a polyline to a style using GeoJsonSource and display it on a map using LineLayer.\n */\nclass DrawGeoJsonLineActivity : AppCompatActivity() {\n\n  public override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapView.mapboxMap.setCamera(\n      CameraOptions.Builder().center(\n        Point.fromLngLat(\n          LATITUDE,\n          LONGITUDE\n        )\n      ).zoom(ZOOM).build()\n    )\n    mapView.mapboxMap.loadStyle(\n      (\n        style(style = Style.STANDARD) {\n          +geoJsonSource(GEOJSON_SOURCE_ID) {\n            data(\"asset://from_crema_to_council_crest.geojson\")\n          }\n          +lineLayer(\"linelayer\", GEOJSON_SOURCE_ID) {\n            lineCap(LineCap.ROUND)\n            lineJoin(LineJoin.ROUND)\n            lineOpacity(0.7)\n            lineWidth(8.0)\n            lineColor(\"#888\")\n          }\n        }\n        )\n    )\n  }\n\n  companion object {\n    private const val GEOJSON_SOURCE_ID = \"line\"\n    private const val LATITUDE = -122.486052\n    private const val LONGITUDE = 37.830348\n    private const val ZOOM = 14.0\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/linesandpolygons/DrawPolygonActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.linesandpolygons\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.style.layers.generated.fillLayer\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityDdsDrawPolygonBinding\n\n/**\n * Draw a vector polygon on a map with the Mapbox Android SDK.\n */\nclass DrawPolygonActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityDdsDrawPolygonBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.setCamera(\n      START_CAMERA_POSITION\n    )\n    binding.mapView.mapboxMap.loadStyle(\n      style(style = Style.STANDARD) {\n        +geoJsonSource(SOURCE_ID) {\n          data(SOURCE_URL)\n        }\n        +fillLayer(LAYER_ID, SOURCE_ID) {\n          fillColor(Color.parseColor(\"#0080ff\")).fillOpacity(0.5)\n          slot(\"middle\")\n        }\n        +lineLayer(\n          TOP_LAYER_ID, SOURCE_ID\n        ) {\n          lineColor(ContextCompat.getColor(this@DrawPolygonActivity, R.color.black))\n          lineWidth(3.0)\n        }\n      }\n    ) {\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n    binding.patternFab.setOnClickListener {\n      binding.mapView.mapboxMap.getStyle { style ->\n        val bitmap = ContextCompat.getDrawable(this@DrawPolygonActivity, R.drawable.pattern)\n          ?.toBitmap(128, 128)!!\n        style.addImage(IMAGE_ID, bitmap)\n        val layer = style.getLayer(LAYER_ID) as FillLayer\n        layer.fillPattern(IMAGE_ID)\n        layer.fillOpacity(0.7)\n      }\n    }\n  }\n\n  companion object {\n    private const val IMAGE_ID = \"stripe-pattern\"\n    private const val LAYER_ID = \"layer-id\"\n    private const val SOURCE_ID = \"source-id\"\n    private const val TOP_LAYER_ID = \"line-layer\"\n    private const val SETTLEMENT_LABEL = \"settlement-major-label\"\n    private const val SOURCE_URL = \"asset://maine_polygon.geojson\"\n    private val START_CAMERA_POSITION = cameraOptions {\n      center(\n        Point.fromLngLat(-68.137343, 45.137451)\n      )\n      zoom(5.0)\n      bearing(0.0)\n      pitch(0.0)\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/linesandpolygons/LineGradientActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.linesandpolygons\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.layers.generated.LineLayer\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.getLayerAs\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.testapp.databinding.ActivityLineGradientBinding\n\nclass LineGradientActivity : AppCompatActivity() {\n\n  @OptIn(MapboxExperimental::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityLineGradientBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.loadStyle(createStyle()) { style ->\n      logI(TAG, \"Style loaded: ${style.styleURI}\")\n      // Increase trim offset when user click the increase trim offset button.\n      binding.trimOffsetButton.setOnClickListener {\n        val lineLayer = style.getLayerAs<LineLayer>(LAYER_ID)\n        val lastTrimPosition = lineLayer?.lineTrimOffset?.last() ?: 0.0\n        lineLayer?.let { layer ->\n          layer.lineTrimOffset(listOf(0.0, (lastTrimPosition + 0.05).coerceAtMost(1.0)))\n          layer.lineTrimColor(\"rgba(6, 1, 255, 0.2)\")\n          layer.lineTrimFadeRange(listOf(0.0, 0.0001))\n        }\n      }\n    }\n  }\n\n  private fun createStyle() = style(style = Style.STANDARD) {\n    +geoJsonSource(id = SOURCE_ID) {\n      feature(Feature.fromGeometry(LineString.fromLngLats(POINTS)))\n      lineMetrics(true)\n    }\n    +lineLayer(LAYER_ID, SOURCE_ID) {\n      lineCap(LineCap.ROUND)\n      lineJoin(LineJoin.ROUND)\n      lineWidth(LINE_WIDTH)\n      lineGradient(\n        interpolate {\n          linear()\n          lineProgress()\n          // blue\n          stop { literal(0.0); rgb { literal(6); literal(1); literal(255) } }\n          // royal blue\n          stop { literal(0.1); rgb { literal(59); literal(118); literal(227) } }\n          // cyan\n          stop { literal(0.3); rgb { literal(7); literal(238); literal(251) } }\n          // lime\n          stop { literal(0.5); rgb { literal(0); literal(255); literal(42) } }\n          // yellow\n          stop { literal(0.7); rgb { literal(255); literal(252); literal(0) } }\n          // red\n          stop { literal(1.0); rgb { literal(255); literal(30); literal(0) } }\n        }\n      )\n    }\n  }\n\n  companion object {\n    private const val TAG = \"LineGradientActivity\"\n    private const val LAYER_ID = \"layer-id\"\n    private const val SOURCE_ID = \"source-id\"\n    private const val LINE_WIDTH = 14.0\n    private val POINTS = listOf(\n      Point.fromLngLat(-77.044211, 38.852924),\n      Point.fromLngLat(-77.045659, 38.860158),\n      Point.fromLngLat(-77.044232, 38.862326),\n      Point.fromLngLat(-77.040879, 38.865454),\n      Point.fromLngLat(-77.039936, 38.867698),\n      Point.fromLngLat(-77.040338, 38.86943),\n      Point.fromLngLat(-77.04264, 38.872528),\n      Point.fromLngLat(-77.03696, 38.878424),\n      Point.fromLngLat(-77.032309, 38.87937),\n      Point.fromLngLat(-77.030056, 38.880945),\n      Point.fromLngLat(-77.027645, 38.881779),\n      Point.fromLngLat(-77.026946, 38.882645),\n      Point.fromLngLat(-77.026942, 38.885502),\n      Point.fromLngLat(-77.028054, 38.887449),\n      Point.fromLngLat(-77.02806, 38.892088),\n      Point.fromLngLat(-77.03364, 38.892108),\n      Point.fromLngLat(-77.033643, 38.899926)\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/linesandpolygons/MovingIconWithTrailingLineActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.linesandpolygons\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.TypeEvaluator\nimport android.animation.ValueAnimator\nimport android.graphics.BitmapFactory\nimport android.os.Bundle\nimport android.view.animation.LinearInterpolator\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.api.directions.v5.DirectionsCriteria\nimport com.mapbox.api.directions.v5.MapboxDirections\nimport com.mapbox.api.directions.v5.models.DirectionsResponse\nimport com.mapbox.api.directions.v5.models.RouteOptions\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.core.constants.Constants.PRECISION_6\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.coroutine.awaitCameraForCoordinates\nimport com.mapbox.maps.coroutine.awaitStyle\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.easeTo\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityDdsMovingIconWithTrailingLineBinding\nimport com.mapbox.maps.toMapboxImage\nimport com.mapbox.turf.TurfMeasurement\nimport kotlinx.coroutines.launch\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\nimport java.util.concurrent.CopyOnWriteArrayList\n\n/**\n * Make a directions request with the Mapbox Directions API and then draw a line behind a moving\n * SymbolLayer icon which moves along the Directions response route.\n */\nclass MovingIconWithTrailingLineActivity : AppCompatActivity() {\n\n  private lateinit var pointSource: GeoJsonSource\n  private lateinit var lineSource: GeoJsonSource\n  private lateinit var routeCoordinateList: MutableList<Point>\n  private var markerLinePointList = CopyOnWriteArrayList<Point>()\n\n  private var routeIndex: Int = 0\n  private lateinit var currentAnimator: Animator\n  private var directionsClient: MapboxDirections? = null\n\n  private var count = 0\n  private lateinit var binding: ActivityDdsMovingIconWithTrailingLineBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityDdsMovingIconWithTrailingLineBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.loadStyle(\n      Style.STANDARD\n    ) { // Use the Mapbox Directions API to get a directions route\n      getRoute()\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n  }\n\n  /**\n   * Add data to the map once the GeoJSON has been loaded\n   *\n   * @param featureCollection returned GeoJSON FeatureCollection from the Directions API route request\n   */\n  private fun initData(style: Style, featureCollection: FeatureCollection) {\n    featureCollection.features()?.firstOrNull()?.geometry()?.let {\n      (it as? LineString)?.let { lineString ->\n        routeCoordinateList = lineString.coordinates()\n        initSources(style, featureCollection)\n        initSymbolLayer(style)\n        initDotLinePath(style)\n        animate()\n      }\n    }\n  }\n\n  /**\n   * Set up the repeat logic for moving the icon along the route.\n   */\n  private fun animate() {\n    if (routeCoordinateList.size - 1 > routeIndex) {\n      val indexPoint = routeCoordinateList[routeIndex]\n      val newPoint = Point.fromLngLat(indexPoint.longitude(), indexPoint.latitude())\n      currentAnimator = createPointAnimator(indexPoint, newPoint)\n      currentAnimator.start()\n      routeIndex++\n    }\n  }\n\n  private fun createPointAnimator(curretPosition: Point, targetPosition: Point): Animator {\n    val pointEvaluator = TypeEvaluator<Point> { fraction, startValue, endValue ->\n      Point.fromLngLat(\n        startValue.longitude() + ((endValue.longitude() - startValue.longitude() * fraction)),\n        startValue.latitude() + ((endValue.latitude() - startValue.latitude()) * fraction)\n      )\n    }\n    return ValueAnimator.ofObject(pointEvaluator, curretPosition, targetPosition).apply {\n      duration = TurfMeasurement.distance(curretPosition, targetPosition, \"meters\").toLong()\n      interpolator = LinearInterpolator()\n\n      addListener(object : AnimatorListenerAdapter() {\n        override fun onAnimationEnd(animation: Animator) {\n          super.onAnimationEnd(animation)\n          animate()\n        }\n      })\n\n      addUpdateListener { animation ->\n        (animation.animatedValue as? Point)?.let {\n          markerLinePointList.add(it)\n          pointSource.geometry(it)\n          if (++count > 1) {\n            lineSource.geometry(LineString.fromLngLats(markerLinePointList))\n          }\n        }\n      }\n    }\n  }\n\n  private fun getRoute() {\n    val routeOptions =\n      RouteOptions.builder()\n        .coordinatesList(listOf(originPoint, destinationPoint))\n        .overview(DirectionsCriteria.OVERVIEW_FULL)\n        .profile(DirectionsCriteria.PROFILE_WALKING)\n        .build()\n    directionsClient = MapboxDirections.builder()\n      .routeOptions(routeOptions)\n      .accessToken(MapboxOptions.accessToken)\n      .build()\n\n    directionsClient?.enqueueCall(object : Callback<DirectionsResponse> {\n      override fun onResponse(\n        call: Call<DirectionsResponse>,\n        response: Response<DirectionsResponse>\n      ) {\n        response.body()?.let { body ->\n          if (body.routes().size < 1) {\n            logE(TAG, \"No routes found\")\n            return\n          }\n\n          val currentRoute = body.routes()[0]\n          lifecycleScope.launch {\n            val map = binding.mapView.mapboxMap\n            val cameraOptionsForCoordinates = map.awaitCameraForCoordinates(\n              coordinates = listOf(originPoint, destinationPoint),\n              camera = cameraOptions { },\n              coordinatesPadding = EdgeInsets(50.0, 50.0, 50.0, 50.0),\n              maxZoom = null,\n              offset = null\n            )\n            map.easeTo(\n              cameraOptionsForCoordinates,\n              mapAnimationOptions {\n                duration(5000L)\n              }\n            )\n            currentRoute.geometry()?.let {\n              initData(\n                binding.mapView.mapboxMap.awaitStyle(),\n                FeatureCollection.fromFeature(\n                  Feature.fromGeometry(\n                    LineString.fromPolyline(\n                      it,\n                      PRECISION_6\n                    )\n                  )\n                )\n              )\n            }\n          }\n        } ?: run {\n          logE(TAG, \"No routes found, make sure you set the right user and access token.\")\n          return\n        }\n      }\n\n      override fun onFailure(call: Call<DirectionsResponse>, t: Throwable) {\n        logE(TAG, \"Error: ${t.message}\")\n        Toast.makeText(\n          this@MovingIconWithTrailingLineActivity,\n          \"Error: ${t.message}\",\n          Toast.LENGTH_SHORT\n        ).show()\n      }\n    })\n  }\n\n  /**\n   * Add various sources to the map.\n   */\n  private fun initSources(style: Style, featureCollection: FeatureCollection) {\n    pointSource = geoJsonSource(DOT_SOURCE_ID) {\n      featureCollection(featureCollection)\n    }\n    lineSource = geoJsonSource(LINE_SOURCE_ID) {\n      featureCollection(featureCollection)\n    }\n    style.addSource(pointSource)\n    style.addSource(lineSource)\n  }\n\n  /**\n   * Add the marker icon SymbolLayer.\n   */\n  private fun initSymbolLayer(style: Style) {\n    @OptIn(MapboxDelicateApi::class)\n    val image = BitmapFactory.decodeResource(resources, R.drawable.pink_dot).toMapboxImage()\n    style.addImage(MARKER_ID, image)\n    style.addLayer(\n      symbolLayer(SYMBOL_LAYER_ID, DOT_SOURCE_ID) {\n        iconImage(MARKER_ID)\n        iconSize(1.0)\n        iconOffset(listOf(5.0, 5.0))\n        iconIgnorePlacement(true)\n        iconAllowOverlap(true)\n      }\n    )\n  }\n\n  /**\n   * Add the LineLayer for the marker icon's travel route. Adding it under the \"road-label-simple\" layer, so that the\n   * this LineLayer doesn't block the street name.\n   */\n  private fun initDotLinePath(style: Style) {\n    style.addLayer(\n      lineLayer(LINE_LAYER_ID, LINE_SOURCE_ID) {\n        lineColor(\"#F13C6E\")\n        lineCap(LineCap.ROUND)\n        lineJoin(LineJoin.ROUND)\n        lineWidth(4.0)\n        slot(\"middle\")\n      }\n    )\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    directionsClient?.cancelCall()\n    if (::currentAnimator.isInitialized) {\n      currentAnimator.removeAllListeners()\n      currentAnimator.cancel()\n    }\n  }\n\n  companion object {\n    private const val TAG = \"MovingIconWithTrailingLineActivity\"\n    private const val DOT_SOURCE_ID = \"dot-source-id\"\n    private const val LINE_SOURCE_ID = \"line-source-id\"\n    private const val LINE_LAYER_ID = \"line-layer-id\"\n    private const val MARKER_ID = \"moving-red-marker\"\n    private const val SYMBOL_LAYER_ID = \"symbol-layer-id\"\n    private val originPoint = Point.fromLngLat(38.7508, 9.0309)\n    private val destinationPoint = Point.fromLngLat(38.795902, 8.984467)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/linesandpolygons/PolygonHolesActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.linesandpolygons\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.addLayerBelow\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\n\n/**\n * Add holes to a polygon drawn on top of the map.\n */\nclass PolygonHolesActivity : AppCompatActivity() {\n\n  private lateinit var mapView: MapView\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    mapView = MapView(this)\n    setContentView(mapView)\n    with(mapView.mapboxMap) {\n      // TODO attributionTintColor(RED_COLOR) missing\n      // TODO compassFadesWhenFacingNorth missing\n      setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(55.3089185, 25.255377))\n          .zoom(13.0)\n          .build()\n      )\n      loadStyle(\n        Style.STANDARD\n      ) { style ->\n        val outerLineString: LineString = LineString.fromLngLats(POLYGON_COORDINATES)\n        val innerLineString: LineString = LineString.fromLngLats(HOLE_COORDINATES[0])\n        val secondInnerLineString: LineString = LineString.fromLngLats(HOLE_COORDINATES[1])\n        val innerList: MutableList<LineString> = ArrayList()\n        innerList.add(innerLineString)\n        innerList.add(secondInnerLineString)\n        style.addSource(\n          geoJsonSource(\n            \"source-id\"\n          ) {\n            feature(Feature.fromGeometry(Polygon.fromOuterInner(outerLineString, innerList)))\n          }\n        )\n        val polygonFillLayer: FillLayer = FillLayer(\"layer-id\", \"source-id\").apply {\n          fillColor(BLUE_COLOR)\n        }\n        if (style.getLayer(\"road-number-shield\") != null) {\n          style.addLayerBelow(polygonFillLayer, \"road-number-shield\")\n        } else {\n          style.addLayer(polygonFillLayer)\n        }\n      }\n    }\n  }\n\n  override fun onStart() {\n    super.onStart()\n    mapView.onStart()\n  }\n\n  override fun onStop() {\n    super.onStop()\n    mapView.onStop()\n  }\n\n  override fun onLowMemory() {\n    super.onLowMemory()\n    mapView.onLowMemory()\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    mapView.onDestroy()\n  }\n\n  companion object {\n    val BLUE_COLOR = Color.parseColor(\"#3bb2d0\")\n    val POLYGON_COORDINATES = listOf(\n      Point.fromLngLat(55.30122473231012, 25.26476622289597),\n      Point.fromLngLat(55.29743486255916, 25.25827212207261),\n      Point.fromLngLat(55.28978863411328, 25.251356725509737),\n      Point.fromLngLat(55.300027931336984, 25.246425506635504),\n      Point.fromLngLat(55.307474692951274, 25.244200378933655),\n      Point.fromLngLat(55.31212891895635, 25.256408010450187),\n      Point.fromLngLat(55.30774064871093, 25.26266169122738),\n      Point.fromLngLat(55.301357710197806, 25.264946609615492),\n      Point.fromLngLat(55.30122473231012, 25.26476622289597)\n    )\n    val HOLE_COORDINATES = listOf(\n      listOf(\n        Point.fromLngLat(55.30084858315658, 25.256531695820797),\n        Point.fromLngLat(55.298280197635705, 25.252243254705405),\n        Point.fromLngLat(55.30163885563897, 25.250501032248863),\n        Point.fromLngLat(55.304059065092645, 25.254700192612702),\n        Point.fromLngLat(55.30084858315658, 25.256531695820797)\n      ),\n      listOf(\n        Point.fromLngLat(55.30173763969924, 25.262517391695198),\n        Point.fromLngLat(55.301095543307355, 25.26122200491396),\n        Point.fromLngLat(55.30396028103232, 25.259479911263526),\n        Point.fromLngLat(55.30489872958182, 25.261132667394975),\n        Point.fromLngLat(55.30173763969924, 25.262517391695198)\n      )\n    )\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/linesandpolygons/SnakingDirectionsRouteActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.linesandpolygons\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.api.directions.v5.DirectionsCriteria\nimport com.mapbox.api.directions.v5.DirectionsCriteria.GEOMETRY_POLYLINE\nimport com.mapbox.api.directions.v5.MapboxDirections\nimport com.mapbox.api.directions.v5.models.DirectionsResponse\nimport com.mapbox.api.directions.v5.models.LegStep\nimport com.mapbox.api.directions.v5.models.RouteOptions\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.core.constants.Constants.PRECISION_5\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityJavaservicesSnakingDirectionsRouteBinding\nimport com.mapbox.turf.TurfConstants\nimport com.mapbox.turf.TurfMisc\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\n\n/**\n * Rather than showing the directions route all at once, have it \"snake\" from the origin to destination.\n */\nclass SnakingDirectionsRouteActivity : AppCompatActivity() {\n\n  private var mapboxDirectionsClient: MapboxDirections? = null\n  private lateinit var binding: ActivityJavaservicesSnakingDirectionsRouteBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityJavaservicesSnakingDirectionsRouteBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    binding.mapView.mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +image(\n          ICON_ID,\n          ContextCompat.getDrawable(\n            this@SnakingDirectionsRouteActivity,\n            R.drawable.ic_red_marker\n          )!!.toBitmap()\n        )\n        +geoJsonSource(SOURCE_ID) {\n          featureCollection(\n            FeatureCollection.fromFeatures(\n              listOf(\n                Feature.fromGeometry(PARIS_ORIGIN_POINT),\n                Feature.fromGeometry(TULLINS_DESTINATION_POINT)\n              )\n            )\n          )\n        }\n        +symbolLayer(LAYER_ID, SOURCE_ID) {\n          iconImage(ICON_ID)\n          iconOffset(listOf(0.0, -8.0))\n        }\n        // Add a source and LineLayer for the snaking directions route line\n        +geoJsonSource(DRIVING_ROUTE_POLYLINE_SOURCE_ID) {\n          geometry(PARIS_ORIGIN_POINT)\n        }\n        +layerAtPosition(\n          lineLayer(DRIVING_ROUTE_POLYLINE_LINE_LAYER_ID, DRIVING_ROUTE_POLYLINE_SOURCE_ID) {\n            lineWidth(NAVIGATION_LINE_WIDTH)\n            lineOpacity(NAVIGATION_LINE_OPACITY)\n            lineCap(LineCap.ROUND)\n            lineJoin(LineJoin.ROUND)\n            lineColor(\"#d742f4\")\n          },\n          below = LAYER_ID\n        )\n      }\n    ) {\n      requestDirectionRoute()\n      binding.mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n  }\n\n  /**\n   * Build and execute the Mapbox Directions API request\n   */\n  private fun requestDirectionRoute() {\n    val routeOptions =\n      RouteOptions.builder()\n        .coordinatesList(listOf(PARIS_ORIGIN_POINT, TULLINS_DESTINATION_POINT))\n        .overview(DirectionsCriteria.OVERVIEW_FULL)\n        .profile(DirectionsCriteria.PROFILE_DRIVING)\n        .geometries(GEOMETRY_POLYLINE)\n        .alternatives(true)\n        .steps(true)\n        .build()\n    mapboxDirectionsClient = MapboxDirections.builder()\n      .routeOptions(routeOptions)\n      .accessToken(MapboxOptions.accessToken)\n      .build()\n\n    mapboxDirectionsClient?.enqueueCall(object : Callback<DirectionsResponse> {\n      override fun onResponse(\n        call: Call<DirectionsResponse>,\n        response: Response<DirectionsResponse>\n      ) {\n        response.body()?.let { body ->\n          if (body.routes().isEmpty()) {\n            logE(TAG, \"No routes found\")\n            return\n          }\n          body.routes()[0]?.legs()?.get(0)?.steps()?.let { steps ->\n            drawRoute(steps)\n          }\n        } ?: run {\n          logE(TAG, \"No routes found, make sure you set the right user and access token.\")\n          return\n        }\n      }\n\n      override fun onFailure(call: Call<DirectionsResponse>, t: Throwable) {\n        Toast.makeText(\n          this@SnakingDirectionsRouteActivity,\n          R.string.snaking_directions_activity_error, Toast.LENGTH_SHORT\n        ).show()\n      }\n    })\n  }\n\n  private fun drawRoute(steps: List<LegStep>) {\n    val totalDistance = steps.sumOf(LegStep::distance)\n    val singleAnimationDistance = totalDistance / ANIMATION_STEPS\n\n    val line = steps\n      .mapNotNull { it.geometry() }\n      .map { LineString.fromPolyline(it, PRECISION_5) }\n      .flatMap { it.coordinates() }\n      .let(LineString::fromLngLats)\n\n    val features = MutableList(ANIMATION_STEPS) { index ->\n        TurfMisc.lineSliceAlong(\n          line,\n          singleAnimationDistance * index,\n          singleAnimationDistance * (index + 1),\n          TurfConstants.UNIT_METERS\n        )\n    }\n\n    val map = binding.mapView.mapboxMap\n      binding.mapView.postDelayed(\n        {\n          setCurrentLine(map, features, features.removeAt(0))\n        },\n        DRAW_SPEED_MILLISECONDS\n      )\n  }\n\n  private fun setCurrentLine(\n    map: MapboxMap,\n    features: MutableList<LineString>,\n    currentLineString: LineString\n  ) {\n    if (map.isValid()) {\n      // Draw current line\n      map.getStyle {\n        (it.getSource(DRIVING_ROUTE_POLYLINE_SOURCE_ID) as? GeoJsonSource)\n          ?.geometry(currentLineString)\n      }\n\n      // Extend the current line with the next segment\n      if (features.isNotEmpty()) {\n        val currentSegmentLngLats = currentLineString.flattenCoordinates().flattenLngLatArray\n        val nextSegmentLngLats = features.removeAt(0).flattenCoordinates().flattenLngLatArray\n        // Merge the current segment and the next one\n        val lngLats = DoubleArray(nextSegmentLngLats.size + currentSegmentLngLats.size)\n        System.arraycopy(currentSegmentLngLats, 0, lngLats, 0, currentSegmentLngLats.size)\n        System.arraycopy(\n          nextSegmentLngLats,\n          0,\n          lngLats,\n          currentSegmentLngLats.size,\n          nextSegmentLngLats.size\n        )\n        val nextLine = LineString.fromFlattenArrayOfPoints(lngLats, null)\n        binding.mapView.postDelayed(\n          { setCurrentLine(map, features, nextLine) },\n          DRAW_SPEED_MILLISECONDS\n        )\n      }\n    }\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    mapboxDirectionsClient?.cancelCall()\n  }\n\n  companion object {\n    private const val TAG = \"SnakingDirectionsRouteActivity\"\n    private const val ICON_ID = \"icon-id\"\n    private const val SOURCE_ID = \"source-id\"\n    private const val LAYER_ID = \"layer-id\"\n    private const val NAVIGATION_LINE_WIDTH = 6.0\n    private const val NAVIGATION_LINE_OPACITY = 0.8\n    private const val DRIVING_ROUTE_POLYLINE_LINE_LAYER_ID = \"DRIVING_ROUTE_POLYLINE_LINE_LAYER_ID\"\n    private const val DRIVING_ROUTE_POLYLINE_SOURCE_ID = \"DRIVING_ROUTE_POLYLINE_SOURCE_ID\"\n    private const val DRAW_SPEED_MILLISECONDS = 50L\n    private const val ANIMATION_STEPS = 200\n    private val PARIS_ORIGIN_POINT = Point.fromLngLat(2.35222, 48.856614)\n    private val TULLINS_DESTINATION_POINT = Point.fromLngLat(5.486011, 45.299410)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/localization/LocalizationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.localization\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.localization.localizeLabels\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityMapLocalizationBinding\nimport java.util.*\n\n/**\n * Example showcasing how to localize a map client side to a specific locale using Style#localizeLabels(locale: Locale).\n * This function will attempt to localize a map into a selected locale if the symbol layers are using\n * a Mapbox source and the locale is being provided as part of the vector source data.\n *\n * This feature supports both v7 and v8 of Mapbox style spec version and does not support [Style.STANDARD].\n */\nclass LocalizationActivity : AppCompatActivity() {\n  private lateinit var mapboxMap: MapboxMap\n  private var applySelectedLanguage: Boolean = false\n  private var index: Int = 0\n  private val styles =\n    arrayOf(\n      Style.MAPBOX_STREETS,\n      MAPBOX_STREETS_V10\n    )\n\n  private val nextStyle: String\n    get() {\n      return styles[index++ % styles.size]\n    }\n  private lateinit var locale: Locale\n  private lateinit var selectedLocale: Locale\n  private var layerIdList = mutableSetOf<String>()\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityMapLocalizationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    @Suppress(\"DEPRECATION\")\n    locale = resources.configuration.locale\n    selectedLocale = locale\n    applySelectedLanguage = false\n    Toast.makeText(this, R.string.change_language_instruction, Toast.LENGTH_LONG).show()\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(nextStyle) {\n      it.localizeLabels(locale)\n    }\n    binding.fabStyles.setOnClickListener {\n      val styleUri = nextStyle\n      mapboxMap.loadStyle(styleUri) {\n        it.localizeLabels(selectedLocale)\n      }\n      Toast.makeText(this, styleUri, Toast.LENGTH_SHORT).show()\n    }\n    binding.fabLocalize.setOnClickListener {\n      applySelectedLanguage = if (!applySelectedLanguage) {\n        mapboxMap.style?.localizeLabels(selectedLocale)\n        Toast.makeText(this, R.string.map_not_localized, Toast.LENGTH_SHORT).show()\n        true\n      } else {\n        mapboxMap.style?.localizeLabels(locale)\n        Toast.makeText(this, R.string.map_localized, Toast.LENGTH_SHORT).show()\n        false\n      }\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_languages, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    when (item.groupId) {\n      R.id.layers -> {\n        item.isChecked = !item.isChecked\n        when (item.itemId) {\n          R.id.country_label -> {\n            if (item.isChecked) {\n              layerIdList.add(COUNTRY_LABEL)\n            } else {\n              layerIdList.remove(COUNTRY_LABEL)\n            }\n          }\n          R.id.state_label -> {\n            if (item.isChecked) {\n              layerIdList.add(STATE_LABEL)\n            } else {\n              layerIdList.remove(STATE_LABEL)\n            }\n          }\n        }\n      }\n      R.id.group -> {\n        applySelectedLanguage = true\n        item.isChecked = true\n        selectedLocale = when (item.itemId) {\n          R.id.english -> Locale.ENGLISH\n          R.id.spanish -> Locale(\"es\", \"ES\")\n          R.id.french -> Locale.FRENCH\n          R.id.german -> Locale.GERMAN\n          R.id.russian -> Locale(\"ru\", \"RU\")\n          R.id.chinese -> Locale.CHINESE\n          R.id.simplified_chinese -> Locale.SIMPLIFIED_CHINESE\n          R.id.portuguese -> Locale(\"pt\", \"PT\")\n          R.id.japanese -> Locale.JAPANESE\n          R.id.korean -> Locale.KOREAN\n          R.id.vietnamese -> Locale(\"vi\", \"VN\")\n          R.id.italian -> Locale.ITALIAN\n          else -> locale\n        }\n      }\n      else -> return super.onOptionsItemSelected(item)\n    }\n    mapboxMap.style?.localizeLabels(selectedLocale, layerIdList.toList())\n    return true\n  }\n\n  companion object {\n    private const val MAPBOX_STREETS_V10 = \"mapbox://styles/mapbox/streets-v10\"\n    private const val STATE_LABEL = \"state-label\"\n    private const val COUNTRY_LABEL = \"country-label\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/AddMarkersSymbolActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.match\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityAddMarkerSymbolBinding\n\n/**\n * Example showing how to add 2 different markers based on their type\n */\nclass AddMarkersSymbolActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityAddMarkerSymbolBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    binding.mapView.mapboxMap.loadStyle(\n      styleExtension = style(Style.STANDARD) {\n        // prepare red marker from resources\n        +image(\n          RED_ICON_ID,\n          ContextCompat.getDrawable(this@AddMarkersSymbolActivity, R.drawable.ic_red_marker)!!.toBitmap()\n        )\n        // prepare blue marker from resources\n        +image(\n          BLUE_ICON_ID,\n          ContextCompat.getDrawable(this@AddMarkersSymbolActivity, R.drawable.ic_blue_marker)!!.toBitmap()\n        )\n        // prepare source that will hold icons and add extra string property to each of it\n        // to identify what marker icon should be used\n        +geoJsonSource(SOURCE_ID) {\n          featureCollection(\n            FeatureCollection.fromFeatures(\n              arrayOf(\n                Feature.fromGeometry(\n                  Point.fromLngLat(\n                    12.554729,\n                    55.70651\n                  )\n                ).apply {\n                  addStringProperty(ICON_KEY, ICON_RED_PROPERTY)\n                },\n                Feature.fromGeometry(\n                  Point.fromLngLat(\n                    12.65147,\n                    55.608166\n                  )\n                ).apply {\n                  addStringProperty(ICON_KEY, ICON_BLUE_PROPERTY)\n                }\n              )\n            )\n          )\n        }\n        // finally prepare symbol layer with\n        // if get(ICON_KEY) == ICON_RED_PROPERTY\n        //  then\n        //    RED_MARKER\n        //  else if get(ICON_KEY) == ICON_BLUE_PROPERTY\n        //    BLUE_MARKER\n        //  else\n        //    RED_MARKER\n        // rotate the blue marker with 45 degrees.\n        +symbolLayer(LAYER_ID, SOURCE_ID) {\n          iconImage(\n            match {\n              get {\n                literal(ICON_KEY)\n              }\n              stop {\n                literal(ICON_RED_PROPERTY)\n                literal(RED_ICON_ID)\n              }\n              stop {\n                literal(ICON_BLUE_PROPERTY)\n                literal(BLUE_ICON_ID)\n              }\n              literal(RED_ICON_ID)\n            }\n          )\n          iconRotate(\n            match {\n              get {\n                literal(ICON_KEY)\n              }\n              stop {\n                literal(ICON_BLUE_PROPERTY)\n                literal(45.0)\n              }\n              literal(0.0)\n            }\n          )\n          iconAllowOverlap(true)\n          iconAnchor(IconAnchor.BOTTOM)\n        }\n      }\n    )\n  }\n\n  companion object {\n    private const val RED_ICON_ID = \"red\"\n    private const val BLUE_ICON_ID = \"blue\"\n    private const val SOURCE_ID = \"source_id\"\n    private const val LAYER_ID = \"layer_id\"\n    private const val ICON_KEY = \"icon_key\"\n    private const val ICON_RED_PROPERTY = \"icon_red_property\"\n    private const val ICON_BLUE_PROPERTY = \"icon_blue_property\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/AddOneMarkerSymbolActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\n\n/**\n * Add a blue teardrop-shaped marker image to a style and display it on the\n * map using a SymbolLayer.\n */\nclass AddOneMarkerSymbolActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    mapView.mapboxMap.also {\n      it.setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(LONGITUDE, LATITUDE))\n          .zoom(8.0)\n          .build()\n      )\n    }.loadStyle(\n      styleExtension = style(Style.STANDARD) {\n        // prepare blue marker from resources\n        +image(\n          BLUE_ICON_ID,\n          ContextCompat.getDrawable(this@AddOneMarkerSymbolActivity, R.drawable.ic_blue_marker)!!.toBitmap()\n        )\n        +geoJsonSource(SOURCE_ID) {\n          geometry(Point.fromLngLat(LONGITUDE, LATITUDE))\n        }\n        +symbolLayer(LAYER_ID, SOURCE_ID) {\n          iconImage(BLUE_ICON_ID)\n          iconAnchor(IconAnchor.BOTTOM)\n        }\n      }\n    )\n  }\n\n  companion object {\n    private const val BLUE_ICON_ID = \"blue\"\n    private const val SOURCE_ID = \"source_id\"\n    private const val LAYER_ID = \"layer_id\"\n    private const val LATITUDE = 55.665957\n    private const val LONGITUDE = 12.550343\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/AnimatedMarkerActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts\n\nimport android.animation.TypeEvaluator\nimport android.animation.ValueAnimator\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.addOnMapClickListener\nimport com.mapbox.maps.plugin.gestures.removeOnMapClickListener\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityAnimatedMarkerBinding\n\n/**\n * Example of animating a map marker on click.\n */\nclass AnimatedMarkerActivity : AppCompatActivity(), OnMapClickListener {\n\n  private lateinit var geojsonSource: GeoJsonSource\n  private var currentPoint = Point.fromLngLat(-18.167040, 64.900932)\n  private var animator: ValueAnimator? = null\n  private lateinit var binding: ActivityAnimatedMarkerBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityAnimatedMarkerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    geojsonSource = geoJsonSource(\"source-id\") {\n      feature(Feature.fromGeometry(currentPoint))\n    }\n\n    val mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(\n      style(Style.STANDARD_SATELLITE) {\n        +image(\n          \"marker_icon\",\n          ContextCompat.getDrawable(this@AnimatedMarkerActivity, R.drawable.ic_red_marker)!!.toBitmap()\n        )\n        +geojsonSource\n        +symbolLayer(layerId = \"layer-id\", sourceId = \"source-id\") {\n          iconImage(\"marker_icon\")\n          iconIgnorePlacement(true)\n          iconAllowOverlap(true)\n        }\n      }\n    ) {\n      Toast.makeText(\n        this@AnimatedMarkerActivity,\n        getString(R.string.tap_on_map_instruction),\n        Toast.LENGTH_LONG\n      ).show()\n      mapboxMap.addOnMapClickListener(this@AnimatedMarkerActivity)\n    }\n  }\n\n  override fun onMapClick(point: Point): Boolean {\n    // When the user clicks on the map, we want to animate the marker to that location.\n    animator?.let {\n      if (it.isStarted) {\n        currentPoint = it.animatedValue as Point\n        it.cancel()\n      }\n    }\n\n    val pointEvaluator = TypeEvaluator<Point> { fraction, startValue, endValue ->\n      Point.fromLngLat(\n        startValue.longitude() + fraction * (endValue.longitude() - startValue.longitude()),\n        startValue.latitude() + fraction * (endValue.latitude() - startValue.latitude())\n      )\n    }\n    animator = ValueAnimator().apply {\n      setObjectValues(currentPoint, point)\n      setEvaluator(pointEvaluator)\n      addUpdateListener {\n        geojsonSource.geometry(it.animatedValue as Point)\n      }\n      duration = 2000\n      start()\n    }\n    currentPoint = point\n    return true\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    animator?.cancel()\n    binding.mapView.mapboxMap.removeOnMapClickListener(this)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/CircleAnnotationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.plugin.annotation.AnnotationPlugin\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationInteractionListener\nimport com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.createCircleAnnotationManager\nimport com.mapbox.maps.testapp.databinding.ActivityAnnotationBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils.showShortToast\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.util.Random\n\n/**\n * Example showing how to add Circle annotations\n */\nclass CircleAnnotationActivity : AppCompatActivity() {\n  private val random = Random()\n  private var styleIndex: Int = 0\n  private var slotIndex: Int = 0\n  private val nextStyle: String\n    get() {\n      return AnnotationUtils.STYLES[styleIndex++ % AnnotationUtils.STYLES.size]\n    }\n  private val nextSlot: String\n    get() {\n      return AnnotationUtils.SLOTS[slotIndex++ % AnnotationUtils.SLOTS.size]\n    }\n  private lateinit var annotationPlugin: AnnotationPlugin\n  private lateinit var binding: ActivityAnnotationBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityAnnotationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    // Load initial style\n    switchToNextStyle()\n    Toast.makeText(this, \"Long click a circle to enable dragging.\", Toast.LENGTH_LONG).show()\n    annotationPlugin = binding.mapView.annotations\n    val circleAnnotationManager = annotationPlugin.createCircleAnnotationManager().apply {\n      // Setup the default properties for all annotations added to this manager\n      circleColorInt = Color.YELLOW\n      circleRadius = 8.0\n\n      addClickListener(\n        OnCircleAnnotationClickListener {\n          Toast.makeText(this@CircleAnnotationActivity, \"click: ${it.id}\", Toast.LENGTH_SHORT)\n            .show()\n          false\n        }\n      )\n      addLongClickListener(\n        OnCircleAnnotationLongClickListener {\n          it.isDraggable = true\n          Toast.makeText(this@CircleAnnotationActivity, \"long click: ${it.id}\", Toast.LENGTH_SHORT)\n            .show()\n          false\n        }\n      )\n      binding.mapView.mapboxMap.setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(CIRCLE_LONGITUDE, CIRCLE_LATITUDE))\n          .pitch(0.0)\n          .zoom(3.0)\n          .bearing(0.0)\n          .build()\n      )\n      addInteractionListener(\n        object : OnCircleAnnotationInteractionListener {\n          override fun onSelectAnnotation(annotation: CircleAnnotation) {\n            Toast.makeText(\n              this@CircleAnnotationActivity,\n              \"onSelectAnnotation: ${annotation.id}\",\n              Toast.LENGTH_SHORT\n            ).show()\n          }\n\n          override fun onDeselectAnnotation(annotation: CircleAnnotation) {\n            Toast.makeText(\n              this@CircleAnnotationActivity,\n              \"onDeselectAnnotation: ${annotation.id}\",\n              Toast.LENGTH_SHORT\n            ).show()\n          }\n        }\n      )\n\n      val circleAnnotationOptions: CircleAnnotationOptions = CircleAnnotationOptions()\n        .withPoint(Point.fromLngLat(CIRCLE_LONGITUDE, CIRCLE_LATITUDE))\n        // overwrite circleAnnotationManager base circle annotation's radius to the specific value of 12.0\n        .withCircleRadius(12.0)\n        .withDraggable(false)\n      create(circleAnnotationOptions)\n\n      lifecycleScope.launch {\n        // random add circles across the globe\n        val circleAnnotationOptionsList = withContext(Dispatchers.Default) {\n          List(2_000) {\n            val color =\n              Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256))\n            CircleAnnotationOptions()\n              .withPoint(AnnotationUtils.createRandomPoint())\n              // overwrite circleAnnotationManager base circle color for this specific annotation to random color.\n              .withCircleColor(color)\n              .withDraggable(false)\n          }\n        }\n        create(circleAnnotationOptionsList)\n        val annotationsJsonContents = withContext(Dispatchers.Default) {\n          FeatureCollection.fromJson(\n            AnnotationUtils.loadStringFromAssets(\n              this@CircleAnnotationActivity,\n              \"annotations.json\"\n            )\n          )\n        }\n        create(annotationsJsonContents)\n      }\n    }\n\n    binding.deleteAll.setOnClickListener {\n      annotationPlugin.removeAnnotationManager(circleAnnotationManager)\n    }\n    binding.changeStyle.setOnClickListener {\n      switchToNextStyle()\n    }\n    binding.changeSlot.setOnClickListener {\n      val slot = nextSlot\n      showShortToast(\"Switching to $slot slot\")\n      circleAnnotationManager.slot = slot\n    }\n  }\n\n  private fun switchToNextStyle() {\n    val style = nextStyle\n    binding.mapView.mapboxMap.loadStyle(style)\n    // only standard based styles support slots\n    binding.changeSlot.isEnabled = (style == Style.STANDARD || style == Style.STANDARD_SATELLITE)\n  }\n\n  companion object {\n    private const val CIRCLE_LONGITUDE = 0.381457\n    private const val CIRCLE_LATITUDE = 6.687337\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/MultipleGeometriesActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.eq\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.testapp.databinding.ActivityMultipleGeometriesBinding\nimport java.net.URISyntaxException\n\n/**\n * Example showing drawing several different geometries for one source.\n */\nclass MultipleGeometriesActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityMultipleGeometriesBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(\n      Style.STANDARD\n    ) {\n      createGeoJsonSource(it)\n      addPolygonLayer(it)\n      addLineStringLayer(it)\n      addPointLayer(it)\n      mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n  }\n\n  private fun createGeoJsonSource(loadedMapStyle: Style) {\n    try {\n      // Load data from GeoJSON file in the assets folder\n      loadedMapStyle.addSource(\n        geoJsonSource(GEOJSON_SOURCE_ID) {\n          data(GEOJSON_SOURCE_URL)\n        }\n      )\n    } catch (exception: URISyntaxException) {\n      logE(TAG, \"Creating geojson source failed ${exception.message}\")\n    }\n  }\n\n  private fun addPolygonLayer(loadedMapStyle: Style) {\n    // Create and style a FillLayer that uses the Polygon Feature's coordinates in the GeoJSON data\n    loadedMapStyle.addLayer(\n      fillLayer(POLYGON_LAYER_ID, GEOJSON_SOURCE_ID) {\n        fillColor(Color.parseColor(\"#4469f7\"))\n        fillOpacity(POLYGON_OPACITY)\n        filter(\n          eq {\n            literal(\"\\$type\")\n            literal(\"Polygon\")\n          }\n        )\n      }\n    )\n  }\n\n  private fun addLineStringLayer(loadedMapStyle: Style) {\n    // Create and style a LineLayer that uses the Line String Feature's coordinates in the GeoJSON data\n    loadedMapStyle.addLayer(\n      lineLayer(LINE_LAYER_ID, GEOJSON_SOURCE_ID) {\n        lineColor(Color.RED)\n        lineWidth(LINE_WIDTH)\n        filter(\n          eq {\n            literal(\"\\$type\")\n            literal(\"LineString\")\n          }\n        )\n      }\n    )\n  }\n\n  private fun addPointLayer(loadedMapStyle: Style) {\n    // Create and style a Circle layer that uses the Point Feature's coordinates in the GeoJSON data\n    loadedMapStyle.addLayer(\n      circleLayer(CIRCLE_LAYER_ID, GEOJSON_SOURCE_ID) {\n        filter(\n          eq {\n            literal(\"\\$type\")\n            literal(\"Point\")\n          }\n        )\n        circleColor(Color.RED)\n        circleRadius(CIRCLE_RADIUS)\n        circleStrokeWidth(CIRCLE_STROKE_WIDTH)\n        circleStrokeColor(Color.BLACK)\n      }\n    )\n  }\n\n  companion object {\n    private val TAG = MultipleGeometriesActivity::class.java.simpleName\n    private const val GEOJSON_SOURCE_ID = \"geojson_sample\"\n    private const val CIRCLE_LAYER_ID = \"circle-layer\"\n    private const val LINE_LAYER_ID = \"line_string\"\n    private const val POLYGON_LAYER_ID = \"polygon\"\n    private const val GEOJSON_SOURCE_URL = \"asset://multiple_geometry_example.geojson\"\n    private const val LINE_WIDTH = 2.0\n    private const val CIRCLE_RADIUS = 6.0\n    private const val CIRCLE_STROKE_WIDTH = 2.0\n    private const val POLYGON_OPACITY = 0.3\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/PointAnnotationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts\n\nimport android.animation.ValueAnimator\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.animation.LinearInterpolator\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.eq\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.get\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.not\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.AnnotationPlugin\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationInteractionListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createCircleAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\nimport com.mapbox.maps.plugin.gestures.addOnMapClickListener\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityAnnotationBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils.showShortToast\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n/**\n * Example showing how to add Symbol annotations\n */\nclass PointAnnotationActivity : AppCompatActivity() {\n  private var pointAnnotationManager: PointAnnotationManager? = null\n  private var circleAnnotationManager: CircleAnnotationManager? = null\n  private var pointAnnotation: PointAnnotation? = null\n  private var circleAnnotation: CircleAnnotation? = null\n  private val animators: MutableList<ValueAnimator> = mutableListOf()\n  private var styleIndex: Int = 0\n  private var slotIndex: Int = 0\n  private var consumeClickEvent = false\n  private val nextStyle: String\n    get() {\n      return AnnotationUtils.STYLES[styleIndex++ % AnnotationUtils.STYLES.size]\n    }\n  private val nextSlot: String\n    get() {\n      return AnnotationUtils.SLOTS[slotIndex++ % AnnotationUtils.SLOTS.size]\n    }\n  private lateinit var annotationPlugin: AnnotationPlugin\n  private lateinit var blueBitmap: Bitmap\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityAnnotationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(\n          Point.fromLngLat(\n            AIRPORT_LONGITUDE,\n            AIRPORT_LATITUDE\n          )\n        )\n        .pitch(45.0)\n        .zoom(10.5)\n        .bearing(-17.6)\n        .build()\n    )\n    binding.mapView.mapboxMap.loadStyle(nextStyle) {\n      annotationPlugin = binding.mapView.annotations\n      circleAnnotationManager = annotationPlugin.createCircleAnnotationManager().apply {\n        val circleAnnotationOptions: CircleAnnotationOptions = CircleAnnotationOptions()\n          .withPoint(Point.fromLngLat(AIRPORT_LONGITUDE, AIRPORT_LATITUDE))\n          .withCircleColor(Color.YELLOW)\n          .withCircleRadius(12.0)\n          .withDraggable(false)\n        circleAnnotation = create(circleAnnotationOptions)\n      }\n      pointAnnotationManager = annotationPlugin.createPointAnnotationManager().apply {\n        textFont = listOf(\"Arial Unicode MS Bold\", \"Open Sans Regular\")\n\n        addDragListener(object : OnPointAnnotationDragListener {\n          override fun onAnnotationDragStarted(annotation: Annotation<*>) {}\n\n          override fun onAnnotationDrag(annotation: Annotation<*>) {\n            circleAnnotation?.let {\n              it.point = (annotation as PointAnnotation).point\n              circleAnnotationManager?.update(it)\n            }\n          }\n\n          override fun onAnnotationDragFinished(annotation: Annotation<*>) {}\n        })\n        addClickListener(\n          OnPointAnnotationClickListener {\n            Toast.makeText(this@PointAnnotationActivity, \"Click1: ${it.id}\", Toast.LENGTH_SHORT)\n              .show()\n            consumeClickEvent\n          }\n        )\n\n        addClickListener(\n          OnPointAnnotationClickListener {\n            Toast.makeText(this@PointAnnotationActivity, \"Click2: ${it.id}\", Toast.LENGTH_SHORT)\n              .show()\n            consumeClickEvent\n          }\n        )\n\n        addLongClickListener(\n          OnPointAnnotationLongClickListener {\n            Toast.makeText(this@PointAnnotationActivity, \"LongClick1: ${it.id}\", Toast.LENGTH_SHORT)\n              .show()\n            consumeClickEvent\n          }\n        )\n\n        addLongClickListener(\n          OnPointAnnotationLongClickListener {\n            Toast.makeText(this@PointAnnotationActivity, \"LongClick2: ${it.id}\", Toast.LENGTH_SHORT)\n              .show()\n            consumeClickEvent\n          }\n        )\n\n        addInteractionListener(object : OnPointAnnotationInteractionListener {\n          override fun onSelectAnnotation(annotation: PointAnnotation) {\n            Toast.makeText(\n              this@PointAnnotationActivity,\n              \"onSelectAnnotation: ${annotation.id}\",\n              Toast.LENGTH_SHORT\n            ).show()\n          }\n\n          override fun onDeselectAnnotation(annotation: PointAnnotation) {\n            Toast.makeText(\n              this@PointAnnotationActivity,\n              \"onDeselectAnnotation: ${annotation.id}\",\n              Toast.LENGTH_SHORT\n            ).show()\n          }\n        })\n\n        val airplaneBitmap = bitmapFromDrawableRes(R.drawable.ic_airplanemode_active_black_24dp)\n        // create a symbol\n        val pointAnnotationOptions: PointAnnotationOptions = PointAnnotationOptions()\n          .withPoint(Point.fromLngLat(AIRPORT_LONGITUDE, AIRPORT_LATITUDE))\n          .withIconImage(airplaneBitmap)\n          .withTextField(ID_ICON_AIRPORT)\n          .withTextOffset(listOf(0.0, -2.0))\n          .withTextColor(Color.RED)\n          .withIconSize(1.3)\n          .withIconOffset(listOf(0.0, -5.0))\n          .withSymbolSortKey(10.0)\n          .withDraggable(true)\n        pointAnnotation = create(pointAnnotationOptions)\n\n        blueBitmap = bitmapFromDrawableRes(R.drawable.mapbox_user_icon)\n        // create nearby symbols\n        val nearbyOptions: PointAnnotationOptions = PointAnnotationOptions()\n          .withPoint(Point.fromLngLat(NEARBY_LONGITUDE, NEARBY_LATITUDE))\n          .withIconImage(blueBitmap)\n          .withIconSize(2.5)\n          .withTextField(ID_ICON_AIRPORT)\n          .withSymbolSortKey(5.0)\n          .withDraggable(true)\n        create(nearbyOptions)\n\n        // random add symbols across the globe\n        val pointAnnotationOptionsList = List(25) {\n          PointAnnotationOptions()\n            .withPoint(AnnotationUtils.createRandomPoint())\n            .withIconImage(airplaneBitmap)\n            .withDraggable(true)\n        }\n        create(pointAnnotationOptionsList)\n        lifecycleScope.launch {\n          val featureCollection = withContext(Dispatchers.Default) {\n            FeatureCollection.fromJson(\n              AnnotationUtils.loadStringFromAssets(\n                this@PointAnnotationActivity,\n                \"annotations.json\"\n              )\n            )\n          }\n          create(featureCollection)\n        }\n      }\n\n      binding.mapView.mapboxMap.addOnMapClickListener {\n        Toast.makeText(this@PointAnnotationActivity, \"OnMapClick\", Toast.LENGTH_SHORT).show()\n        true\n      }\n    }\n\n    binding.deleteAll.setOnClickListener {\n      pointAnnotationManager?.let {\n        annotationPlugin.removeAnnotationManager(it)\n        pointAnnotationManager = null\n      }\n    }\n    binding.changeStyle.setOnClickListener {\n      binding.mapView.mapboxMap.loadStyle(nextStyle)\n    }\n    binding.changeSlot.setOnClickListener {\n      val slot = nextSlot\n      showShortToast(\"Switching to $slot slot\")\n      pointAnnotationManager?.slot = slot\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_symbol, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    when (item.itemId) {\n      R.id.menu_action_draggable -> {\n        pointAnnotationManager?.annotations?.forEach {\n          it.isDraggable = !it.isDraggable\n        }\n      }\n      R.id.menu_action_consume_click -> {\n        consumeClickEvent = !consumeClickEvent\n        val message = getString(R.string.consume_click_event_toast) + consumeClickEvent\n        Toast.makeText(this@PointAnnotationActivity, message, Toast.LENGTH_LONG).show()\n      }\n      R.id.menu_action_filter -> {\n        if (pointAnnotationManager != null && pointAnnotation != null) {\n          val idKey = pointAnnotationManager!!.getAnnotationIdKey()\n          val expression: Expression =\n            eq(get(idKey), literal(pointAnnotation!!.id))\n          val filter = pointAnnotationManager!!.layerFilter\n          if (filter != null && filter == expression) {\n            pointAnnotationManager!!.layerFilter = not(eq(get(idKey), literal(\"\")))\n          } else {\n            pointAnnotationManager!!.layerFilter = expression\n          }\n        } else {\n          Toast.makeText(\n            this@PointAnnotationActivity,\n            \"pointAnnotationManager or pointAnnotation is null.\",\n            Toast.LENGTH_LONG\n          ).show()\n        }\n      }\n\n      R.id.menu_action_bitmap_blue -> pointAnnotation?.iconImageBitmap = blueBitmap\n      R.id.menu_action_rotation -> pointAnnotation?.iconRotate = 45.0\n      R.id.menu_action_text -> pointAnnotation?.textField = \"Hello world!\"\n      R.id.menu_action_anchor -> pointAnnotation?.iconAnchor = IconAnchor.BOTTOM\n      R.id.menu_action_opacity -> pointAnnotation?.iconOpacity = 0.5\n      R.id.menu_action_offset -> pointAnnotation?.iconOffset = listOf(10.0, 20.0)\n      R.id.menu_action_text_anchor -> pointAnnotation?.textAnchor = TextAnchor.TOP\n      R.id.menu_action_text_color -> pointAnnotation?.textColorInt = Color.WHITE\n      R.id.menu_action_text_size -> pointAnnotation?.textSize = 22.0\n      R.id.menu_action_z_index -> pointAnnotation?.symbolSortKey = 0.0\n      R.id.menu_action_halo -> {\n        pointAnnotation?.iconHaloWidth = 5.0\n        pointAnnotation?.iconHaloColorInt = Color.RED\n        pointAnnotation?.iconHaloBlur = 1.0\n      }\n\n      R.id.menu_action_animate -> {\n        resetSymbol()\n        pointAnnotation?.let {\n          easeSymbol(\n            it,\n            Point.fromLngLat(AIRPORT_LATITUDE, AIRPORT_LONGITUDE)\n          )\n        }\n        return true\n      }\n      R.id.z_order_auto -> {\n        item.isChecked = true\n        pointAnnotationManager?.symbolZOrder = SymbolZOrder.AUTO\n      }\n      R.id.z_order_viewport_y -> {\n        item.isChecked = true\n        pointAnnotationManager?.symbolZOrder = SymbolZOrder.VIEWPORT_Y\n      }\n      R.id.z_order_source -> {\n        item.isChecked = true\n        pointAnnotationManager?.symbolZOrder = SymbolZOrder.SOURCE\n      }\n      else -> return super.onOptionsItemSelected(item)\n    }\n    pointAnnotation?.let { pointAnnotationManager?.update(it) }\n    return true\n  }\n\n  private fun resetSymbol() {\n    pointAnnotation?.iconRotate = 0.0\n    pointAnnotation?.geometry = Point.fromLngLat(AIRPORT_LONGITUDE, AIRPORT_LATITUDE)\n    pointAnnotation?.let { pointAnnotationManager?.update(it) }\n  }\n\n  private fun easeSymbol(\n    pointAnnotation: PointAnnotation,\n    location: Point,\n    rotation: Double = 180.0\n  ) {\n    val originalPosition: Point = pointAnnotation.point\n    val originalRotation = pointAnnotation.iconRotate\n    if (originalPosition == location || originalRotation == rotation) {\n      return\n    }\n    val moveSymbol = ValueAnimator.ofFloat(0f, 1f).setDuration(5000)\n    moveSymbol.interpolator = LinearInterpolator()\n    moveSymbol.addUpdateListener { animation: ValueAnimator ->\n      pointAnnotationManager?.let {\n        if (!it.annotations.contains(pointAnnotation)) {\n          return@addUpdateListener\n        }\n        val fraction = animation.animatedValue as Float\n        if (originalPosition != location) {\n          val lat =\n            (location.latitude() - originalPosition.latitude()) * fraction + originalPosition.latitude()\n          val lng =\n            (location.longitude() - originalPosition.longitude()) * fraction + originalPosition.longitude()\n          pointAnnotation.geometry = Point.fromLngLat(lng, lat)\n        }\n        if (originalRotation != null && originalRotation != rotation) {\n          pointAnnotation.iconRotate = (rotation - originalRotation) * fraction + originalRotation\n        }\n        it.update(pointAnnotation)\n      }\n    }\n    moveSymbol.start()\n    animators.add(moveSymbol)\n  }\n\n  companion object {\n    private const val ID_ICON_AIRPORT = \"airport\"\n    private const val AIRPORT_LONGITUDE = 0.381457\n    private const val AIRPORT_LATITUDE = 6.687337\n    private const val NEARBY_LONGITUDE = 0.367099\n    private const val NEARBY_LATITUDE = 6.526384\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/PointAnnotationClusterActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.color\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationSourceOptions\nimport com.mapbox.maps.plugin.annotation.ClusterOptions\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\nimport com.mapbox.maps.testapp.databinding.ActivityAnnotationBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils.showShortToast\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\n\n/**\n * Example showing how to add Symbol cluster annotations\n */\nclass PointAnnotationClusterActivity : AppCompatActivity(), CoroutineScope {\n  private var mapboxMap: MapboxMap? = null\n  private val job = Job()\n  override val coroutineContext = job + Dispatchers.IO\n  private var pointAnnotationManager: PointAnnotationManager? = null\n  private var options: List<PointAnnotationOptions>? = null\n  private var styleIndex: Int = 0\n  private var slotIndex: Int = 0\n\n  // STANDARD style doesn't support ICON_FIRE_STATION image\n  private val styles =\n    AnnotationUtils.STYLES.filterNot { it == Style.STANDARD || it == Style.STANDARD_SATELLITE }\n  private val nextStyle: String\n    get() = styles[styleIndex++ % styles.size]\n  private val nextSlot: String\n    get() = AnnotationUtils.SLOTS[slotIndex++ % AnnotationUtils.SLOTS.size]\n  private lateinit var binding: ActivityAnnotationBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityAnnotationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.progress.visibility = View.VISIBLE\n    mapboxMap = binding.mapView.mapboxMap\n      .apply {\n        setCamera(\n          CameraOptions.Builder()\n            .center(Point.fromLngLat(LONGITUDE, LATITUDE))\n            .zoom(10.0)\n            .build()\n        )\n        loadStyle(nextStyle) {\n          val annotationPlugin = binding.mapView.annotations\n          val annotationConfig = AnnotationConfig(\n            annotationSourceOptions = AnnotationSourceOptions(\n              clusterOptions = ClusterOptions(\n                textColorExpression = color(Color.YELLOW),\n                textColor = Color.BLACK, // Will not be applied as textColorExpression has been set\n                textSize = 20.0,\n                circleRadiusExpression = literal(25.0),\n                colorLevels = listOf(\n                  Pair(100, Color.RED),\n                  Pair(50, Color.BLUE),\n                  Pair(0, Color.GREEN)\n                )\n              )\n            )\n          )\n          pointAnnotationManager =\n            annotationPlugin.createPointAnnotationManager(annotationConfig).apply {\n              // Set the icon image for this point annotation manager, so it will be applied to all annotations\n              iconImage = ICON_FIRE_STATION\n              addClickListener(\n                OnPointAnnotationClickListener {\n                  Toast.makeText(\n                    this@PointAnnotationClusterActivity,\n                    \"Click: ${it.id}\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  true\n                }\n              )\n              addLongClickListener(\n                OnPointAnnotationLongClickListener {\n                  Toast.makeText(\n                    this@PointAnnotationClusterActivity,\n                    \"Long Click: ${it.id}\",\n                    Toast.LENGTH_SHORT\n                  )\n                    .show()\n                  true\n                }\n              )\n              addClusterClickListener {\n                Toast.makeText(\n                  this@PointAnnotationClusterActivity,\n                  \"Cluster Click ID: ${it.clusterId}, points:  ${it.pointCount}, abbreviatedCount: ${it.pointCountAbbreviated}\",\n                  Toast.LENGTH_SHORT\n                ).show()\n                true\n              }\n              addClusterLongClickListener {\n                Toast.makeText(\n                  this@PointAnnotationClusterActivity,\n                  \"Cluster Long Click ID:${it.clusterId}, points:  ${it.pointCount}, abbreviatedCount: ${it.pointCountAbbreviated}\",\n                  Toast.LENGTH_SHORT\n                ).show()\n                true\n              }\n            }\n\n          launch {\n            loadData()\n          }\n        }\n      }\n\n    binding.deleteAll.setOnClickListener { pointAnnotationManager?.deleteAll() }\n    binding.changeStyle.setOnClickListener {\n      binding.mapView.mapboxMap.loadStyle(nextStyle)\n    }\n    binding.changeSlot.setOnClickListener {\n      val slot = nextSlot\n      showShortToast(\"Switching to $slot slot\")\n      pointAnnotationManager?.slot = slot\n    }\n  }\n\n  private fun loadData() {\n    val json = AnnotationUtils.loadStringFromNet(this@PointAnnotationClusterActivity, POINTS_URL)\n    if (json == null) {\n      runOnUiThread {\n        Toast.makeText(this@PointAnnotationClusterActivity, \"Failed to download data from network\", Toast.LENGTH_LONG).show()\n        binding.progress.visibility = View.GONE\n      }\n      return\n    }\n    try {\n      FeatureCollection.fromJson(json).features()?.let { features ->\n        features.shuffle()\n        options = features.take(AMOUNT).map { feature ->\n          PointAnnotationOptions()\n            .withGeometry((feature.geometry() as Point))\n        }\n      }\n    } catch (e: Exception) {\n      logE(TAG, \"Failed to parse GeoJSON: ${e.message}\")\n      runOnUiThread {\n        Toast.makeText(this@PointAnnotationClusterActivity, \"Failed to parse GeoJSON: ${e.message}\", Toast.LENGTH_LONG).show()\n      }\n    }\n    runOnUiThread {\n      options?.let {\n        pointAnnotationManager?.create(it)\n      }\n      binding.progress.visibility = View.GONE\n    }\n  }\n\n  companion object {\n    private const val TAG = \"PointAnnotationCluster\"\n    private const val AMOUNT = 10000\n    private const val ICON_FIRE_STATION = \"fire-station\"\n    private const val LONGITUDE = -77.00897\n    private const val LATITUDE = 38.87031\n    private const val POINTS_URL =\n      \"https://opendata.arcgis.com/datasets/01d0ff375695466d93d1fa2a976e2bdd_5.geojson\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/PolygonAnnotationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.google.gson.JsonPrimitive\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.annotation.AnnotationPlugin\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationInteractionListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPolygonAnnotationManager\nimport com.mapbox.maps.testapp.databinding.ActivityAnnotationBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils.showShortToast\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n/**\n * Example showing how to add Polygon annotations\n */\nclass PolygonAnnotationActivity : AppCompatActivity() {\n  private var polygonAnnotationManager: PolygonAnnotationManager? = null\n  private var styleIndex: Int = 0\n  private var slotIndex: Int = 0\n\n  private val nextStyle: String\n    get() {\n      return AnnotationUtils.STYLES[styleIndex++ % AnnotationUtils.STYLES.size]\n    }\n  private val nextSlot: String\n    get() {\n      return AnnotationUtils.SLOTS[slotIndex++ % AnnotationUtils.SLOTS.size]\n    }\n  private lateinit var annotationPlugin: AnnotationPlugin\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityAnnotationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.setCamera(INITIAL_CAMERA_POS)\n    binding.mapView.mapboxMap.loadStyle(nextStyle) {\n      annotationPlugin = binding.mapView.annotations\n      polygonAnnotationManager = annotationPlugin.createPolygonAnnotationManager().apply {\n        addClickListener(\n          OnPolygonAnnotationClickListener {\n            Toast.makeText(this@PolygonAnnotationActivity, \"click ${it.id}\", Toast.LENGTH_SHORT)\n              .show()\n            false\n          }\n        )\n\n        addLongClickListener(\n          OnPolygonAnnotationLongClickListener {\n            Toast.makeText(this@PolygonAnnotationActivity, \"long click ${it.id}\", Toast.LENGTH_SHORT)\n              .show()\n            false\n          }\n        )\n\n        addInteractionListener(object : OnPolygonAnnotationInteractionListener {\n          override fun onSelectAnnotation(annotation: PolygonAnnotation) {\n            Toast.makeText(\n              this@PolygonAnnotationActivity,\n              \"onSelectAnnotation ${annotation.id}\",\n              Toast.LENGTH_SHORT\n            ).show()\n          }\n\n          override fun onDeselectAnnotation(annotation: PolygonAnnotation) {\n            Toast.makeText(\n              this@PolygonAnnotationActivity,\n              \"onDeselectAnnotation ${annotation.id}\",\n              Toast.LENGTH_SHORT\n            ).show()\n          }\n        })\n\n        val points = listOf(\n          listOf(\n            Point.fromLngLat(-89.857177734375, 24.51713945052515),\n            Point.fromLngLat(-87.967529296875, 24.51713945052515),\n            Point.fromLngLat(-87.967529296875, 26.244156283890756),\n            Point.fromLngLat(-89.857177734375, 26.244156283890756),\n            Point.fromLngLat(-89.857177734375, 24.51713945052515)\n          )\n        )\n\n        val polygonAnnotationOptions: PolygonAnnotationOptions = PolygonAnnotationOptions()\n          .withPoints(points)\n          .withData(JsonPrimitive(\"Foobar\"))\n          .withFillColor(Color.RED)\n          .withDraggable(true)\n        create(polygonAnnotationOptions)\n\n        lifecycleScope.launch {\n          val featureCollection = withContext(Dispatchers.Default) {\n            FeatureCollection.fromJson(\n              AnnotationUtils.loadStringFromAssets(\n                this@PolygonAnnotationActivity,\n                \"annotations.json\"\n              )\n            )\n          }\n          create(featureCollection)\n        }\n      }\n    }\n\n    binding.deleteAll.setOnClickListener {\n      polygonAnnotationManager?.let {\n        annotationPlugin.removeAnnotationManager(it)\n      }\n    }\n    binding.changeStyle.setOnClickListener { binding.mapView.mapboxMap.loadStyle(nextStyle) }\n    binding.changeSlot.setOnClickListener {\n      val slot = nextSlot\n      showShortToast(\"Switching to $slot slot\")\n      polygonAnnotationManager?.slot = slot\n    }\n  }\n\n  private companion object {\n    private val INITIAL_CAMERA_POS = cameraOptions {\n      center(Point.fromLngLat(-88.90136, 25.04579))\n      zoom(5.0)\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/PolylineAnnotationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationPlugin\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationInteractionListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPolylineAnnotationManager\nimport com.mapbox.maps.testapp.databinding.ActivityAnnotationBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils.showShortToast\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.util.Random\n\n/**\n * Example showing how to add Line annotations\n */\nclass PolylineAnnotationActivity : AppCompatActivity() {\n  private val random = Random()\n  private var polylineAnnotationManager: PolylineAnnotationManager? = null\n  private var styleIndex: Int = 0\n  private var slotIndex: Int = 0\n  private val nextStyle: String\n    get() {\n      return AnnotationUtils.STYLES[styleIndex++ % AnnotationUtils.STYLES.size]\n    }\n  private val nextSlot: String\n    get() {\n      return AnnotationUtils.SLOTS[slotIndex++ % AnnotationUtils.SLOTS.size]\n    }\n\n  private lateinit var annotationPlugin: AnnotationPlugin\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityAnnotationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(-7.0, -1.0))\n        .pitch(0.0)\n        .zoom(4.0)\n        .bearing(0.0)\n        .build()\n    )\n    binding.mapView.mapboxMap.loadStyle(nextStyle) {\n      annotationPlugin = binding.mapView.annotations\n      polylineAnnotationManager = annotationPlugin.createPolylineAnnotationManager(\n        annotationConfig = AnnotationConfig(PITCH_OUTLINE, LAYER_ID, SOURCE_ID)\n      ).apply {\n        it.getLayer(LAYER_ID)?.let { layer ->\n          Toast.makeText(this@PolylineAnnotationActivity, layer.layerId, Toast.LENGTH_LONG).show()\n        }\n        addClickListener(\n          OnPolylineAnnotationClickListener {\n            Toast.makeText(this@PolylineAnnotationActivity, \"click ${it.id}\", Toast.LENGTH_SHORT)\n              .show()\n            false\n          }\n        )\n        addLongClickListener(\n          OnPolylineAnnotationLongClickListener {\n            Toast.makeText(this@PolylineAnnotationActivity, \"long click ${it.id}\", Toast.LENGTH_SHORT)\n              .show()\n            false\n          }\n        )\n\n        addInteractionListener(object : OnPolylineAnnotationInteractionListener {\n          override fun onSelectAnnotation(annotation: PolylineAnnotation) {\n            Toast.makeText(\n              this@PolylineAnnotationActivity,\n              \"onSelectAnnotation ${annotation.id}\",\n              Toast.LENGTH_SHORT\n            ).show()\n          }\n\n          override fun onDeselectAnnotation(annotation: PolylineAnnotation) {\n            Toast.makeText(\n              this@PolylineAnnotationActivity,\n              \"onDeselectAnnotation ${annotation.id}\",\n              Toast.LENGTH_SHORT\n            ).show()\n          }\n        })\n\n        val points = listOf(\n          Point.fromLngLat(-4.375974, -2.178992),\n          Point.fromLngLat(-7.639772, -4.107888),\n          Point.fromLngLat(-11.439207, 2.798737),\n        )\n\n        val polylineAnnotationOptions: PolylineAnnotationOptions = PolylineAnnotationOptions()\n          .withPoints(points)\n          .withLineColor(Color.RED)\n          .withLineWidth(5.0)\n        create(polylineAnnotationOptions)\n\n        // random add lines across the globe\n        val lineOptionsList = List(100) {\n          val color = Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256))\n          PolylineAnnotationOptions()\n            .withPoints(AnnotationUtils.createRandomPoints())\n            .withLineColor(color)\n        }\n\n        create(lineOptionsList)\n\n        lifecycleScope.launch {\n          val featureCollection = withContext(Dispatchers.Default) {\n            FeatureCollection.fromJson(\n              AnnotationUtils.loadStringFromAssets(\n                this@PolylineAnnotationActivity,\n                \"annotations.json\"\n              )\n            )\n          }\n          create(featureCollection)\n        }\n      }\n    }\n\n    binding.deleteAll.setOnClickListener {\n      polylineAnnotationManager?.let {\n        annotationPlugin.removeAnnotationManager(it)\n      }\n    }\n    binding.changeStyle.setOnClickListener {\n      binding.mapView.mapboxMap.loadStyle(nextStyle)\n    }\n    binding.changeSlot.setOnClickListener {\n      val slot = nextSlot\n      showShortToast(\"Switching to $slot slot\")\n      polylineAnnotationManager?.slot = slot\n    }\n  }\n\n  companion object {\n    private const val LAYER_ID = \"line_layer\"\n    private const val SOURCE_ID = \"line_source\"\n    private const val PITCH_OUTLINE = \"pitch-outline\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/infowindow/InfoWindowActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts.infowindow\n\nimport android.graphics.Bitmap\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.gestures.OnMapLongClickListener\nimport com.mapbox.maps.plugin.gestures.addOnMapLongClickListener\nimport com.mapbox.maps.plugin.gestures.removeOnMapLongClickListener\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\nimport java.text.DecimalFormat\n\n/**\n * Test activity showcasing markers above Washington D.C\n * using View Annotation API and point annotations.\n *\n * This example is replicating similar activity from Maps v9 that was using InfoWindow API.\n */\nclass InfoWindowActivity : AppCompatActivity(), OnMapLongClickListener {\n\n  private lateinit var mapView: MapView\n  private lateinit var icon: Bitmap\n\n  private lateinit var markerManager: MarkerManager\n  private var customMarker: Marker? = null\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    mapView = MapView(this)\n    setContentView(mapView)\n\n    icon = bitmapFromDrawableRes(R.drawable.ic_blue_marker)\n    mapView.mapboxMap.apply {\n      setCamera(\n        cameraOptions {\n          center(Point.fromLngLat(-77.03655168667463, 38.897705003219784))\n          zoom(15.0)\n        }\n      )\n      getStyle {\n        markerManager = MarkerManager(mapView)\n        addMarkers()\n      }\n      addOnMapLongClickListener(this@InfoWindowActivity)\n    }\n  }\n\n  private fun addMarkers() {\n    markerManager.addMarker(\n      Marker(\n        title = \"Intersection\",\n        snippet = \"H St NW with 15th St NW\",\n        position = Point.fromLngLat(-77.03364419, 38.9002073),\n        icon = icon,\n      )\n    )\n    markerManager.addMarker(\n      Marker(\n        title = \"The Ellipse\",\n        icon = icon,\n        position = Point.fromLngLat(-77.03654, 38.89393)\n      )\n    )\n    val marker = markerManager.addMarker(\n      Marker(\n        title = \"White House\",\n        snippet = \"\"\"\n          The official residence and principal workplace of the President of the United States,\n          located at 1600 Pennsylvania Avenue NW in Washington, D.C. It has been the residence of every\n          U.S. president since John Adams in 1800.\n        \"\"\".trimIndent(),\n        icon = icon,\n        position = Point.fromLngLat(-77.03655168667463, 38.897705003219784)\n      )\n    )\n    // open InfoWindow at startup\n    markerManager.selectMarker(marker)\n  }\n\n  override fun onMapLongClick(point: Point): Boolean {\n    customMarker?.let {\n      markerManager.removeMarker(it)\n    }\n    customMarker = markerManager.addMarker(\n      Marker(\n        position = point,\n        icon = icon,\n        title = \"Custom marker\",\n        snippet = \"${DecimalFormat(\"#.#####\").format(point.latitude())}, ${DecimalFormat(\"#.#####\").format(point.longitude())}\"\n      )\n    )\n    return true\n  }\n\n  override fun onDestroy() {\n    mapView.mapboxMap.removeOnMapLongClickListener(this)\n    markerManager.destroy()\n    super.onDestroy()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/infowindow/Marker.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts.infowindow\n\nimport android.graphics.Bitmap\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.ViewAnnotationAnchor\nimport com.mapbox.maps.ViewAnnotationAnchorConfig\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.viewannotation.annotatedLayerFeature\nimport com.mapbox.maps.viewannotation.annotationAnchor\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\n\n/**\n * Class representing a marker that contains marker icon and view annotation on top of it.\n */\ndata class Marker(\n  val position: Point,\n  val icon: Bitmap,\n  val title: String? = null,\n  val snippet: String? = null,\n) {\n\n  init {\n    if (title == null && snippet == null) {\n      throw RuntimeException(\"Marker should have either title or snippet!\")\n    }\n  }\n\n  var anchor: ViewAnnotationAnchorConfig? = null\n\n  private var layerId: String = \"\"\n  internal var prepared = false\n    private set\n\n  internal lateinit var pointAnnotation: PointAnnotation\n    private set\n  internal lateinit var viewAnnotation: View\n    private set\n\n  internal fun prepareAnnotationMarker(pointAnnotationManager: PointAnnotationManager, layerId: String) {\n    val pointAnnotationOptions: PointAnnotationOptions = PointAnnotationOptions()\n      .withPoint(position)\n      .withIconImage(icon)\n      .withIconAnchor(IconAnchor.BOTTOM)\n    pointAnnotation = pointAnnotationManager.create(pointAnnotationOptions)\n    this.layerId = layerId\n  }\n\n  internal fun prepareViewAnnotation(mapView: MapView) {\n    viewAnnotation = LayoutInflater.from(mapView.context)\n      .inflate(R.layout.item_legacy_callout_view, mapView.rootView as ViewGroup, false)\n    viewAnnotation.findViewById<TextView>(R.id.infowindow_title).text = title\n    viewAnnotation.findViewById<TextView>(R.id.infowindow_description).text = snippet\n\n    mapView.viewAnnotationManager.addViewAnnotation(\n      view = viewAnnotation,\n      options = viewAnnotationOptions {\n        // attach view annotation to the feature/layer ids of the annotation\n        annotatedLayerFeature(layerId) {\n          featureId(pointAnnotation.id)\n        }\n        annotationAnchor {\n          // same anchor with the annotation\n          anchor(ViewAnnotationAnchor.BOTTOM)\n          // needed to display info window above the marker\n          offsetY((pointAnnotation.iconImageBitmap?.height!! + MARKER_PADDING_PX).toDouble())\n        }\n      }.also {\n        anchor = it.variableAnchors!!.first()\n      }\n    )\n    prepared = true\n  }\n\n  private companion object {\n    // padding between marker and info window\n    const val MARKER_PADDING_PX = 10\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/infowindow/MarkerManager.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts.infowindow\n\nimport android.view.View\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.addOnMapClickListener\nimport com.mapbox.maps.plugin.gestures.removeOnMapClickListener\nimport com.mapbox.maps.viewannotation.OnViewAnnotationUpdatedListener\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport java.util.concurrent.CopyOnWriteArrayList\nimport kotlin.math.abs\n\n/**\n * Manager class helping to control the [Marker]s.\n */\nclass MarkerManager(\n  private val mapView: MapView\n) : OnPointAnnotationClickListener, OnMapClickListener {\n\n  private val pointAnnotationManager: PointAnnotationManager =\n    mapView.annotations.createPointAnnotationManager(\n      AnnotationConfig(\n        layerId = LAYER_ID\n      )\n    )\n\n  // using copy on write just in case as potentially remove may be called while we're iterating in on click listener\n  private val markerList = CopyOnWriteArrayList<Marker>()\n\n  init {\n    pointAnnotationManager.addClickListener(this)\n    // by adding regular map click listener we implement deselecting all info windows on map click\n    // in legacy code it was controlled by flag in API\n    mapView.mapboxMap.addOnMapClickListener(this)\n  }\n\n  override fun onAnnotationClick(annotation: PointAnnotation): Boolean {\n    markerList.forEach { marker ->\n      if (marker.pointAnnotation == annotation) {\n        selectMarker(marker, deselectIfSelected = true)\n      }\n    }\n    return true\n  }\n\n  override fun onMapClick(point: Point): Boolean {\n    markerList.forEach(::deselectMarker)\n    return true\n  }\n\n  fun addMarker(marker: Marker): Marker {\n    marker.prepareAnnotationMarker(pointAnnotationManager, LAYER_ID)\n    marker.prepareViewAnnotation(mapView)\n    markerList.add(marker)\n    // do not show info window by default\n    deselectMarker(marker)\n    return marker\n  }\n\n  fun removeMarker(marker: Marker) {\n    if (!marker.prepared) {\n      return\n    }\n    markerList.remove(marker)\n    mapView.viewAnnotationManager.removeViewAnnotation(marker.viewAnnotation)\n    pointAnnotationManager.delete(marker.pointAnnotation)\n  }\n\n  fun selectMarker(marker: Marker, deselectIfSelected: Boolean = false) {\n    if (marker.isSelected()) {\n      if (deselectIfSelected) {\n        deselectMarker(marker)\n      }\n      return\n    }\n    // Need to deselect any currently selected annotation first\n    markerList.forEach(::deselectMarker)\n    adjustViewAnnotationXOffset(marker)\n    mapView.viewAnnotationManager.updateViewAnnotation(\n      marker.viewAnnotation,\n      viewAnnotationOptions {\n        selected(true)\n      }\n    )\n    marker.viewAnnotation.visibility = View.VISIBLE\n  }\n\n  private fun deselectMarker(marker: Marker) {\n    mapView.viewAnnotationManager.updateViewAnnotation(\n      marker.viewAnnotation,\n      viewAnnotationOptions {\n        selected(false)\n        marker.anchor?.let {\n          variableAnchors(\n            listOf(it.toBuilder().offsetX(0.0).build())\n          )\n        }\n      }\n    )\n    marker.viewAnnotation.visibility = View.INVISIBLE\n  }\n\n  fun destroy() {\n    markerList.forEach(::removeMarker)\n    pointAnnotationManager.removeClickListener(this)\n    mapView.mapboxMap.removeOnMapClickListener(this)\n  }\n\n  // adjust offsetX to fit on the screen if the info window is shown near screen edge\n  private fun adjustViewAnnotationXOffset(marker: Marker) {\n    mapView.viewAnnotationManager.addOnViewAnnotationUpdatedListener(\n      object : OnViewAnnotationUpdatedListener {\n        override fun onViewAnnotationPositionUpdated(\n          view: View,\n          leftTopCoordinate: ScreenCoordinate,\n          width: Double,\n          height: Double,\n        ) {\n          if (view == marker.viewAnnotation) {\n            updateOffsetX(marker, leftTopCoordinate, width)\n            mapView.viewAnnotationManager.removeOnViewAnnotationUpdatedListener(this)\n          }\n        }\n      })\n  }\n\n  private fun updateOffsetX(marker: Marker, leftTop: ScreenCoordinate, width: Double) {\n    val resultOffsetX = if (leftTop.x < 0) {\n      abs(leftTop.x) + ADDITIONAL_EDGE_PADDING_PX\n    } else if (leftTop.x + width > mapView.mapboxMap.getSize().width) {\n      mapView.mapboxMap.getSize().width - leftTop.x - width - ADDITIONAL_EDGE_PADDING_PX\n    } else {\n      0.0\n    }\n    val anchor = marker.anchor?.toBuilder()\n      ?.offsetX(resultOffsetX)\n      ?.build()\n\n    mapView.viewAnnotationManager.updateViewAnnotation(\n      marker.viewAnnotation,\n      viewAnnotationOptions {\n        if (anchor != null) {\n          variableAnchors(listOf(anchor))\n        }\n      }\n    )\n  }\n\n  private fun Marker.isSelected() =\n    mapView.viewAnnotationManager.getViewAnnotationOptions(viewAnnotation)?.selected == true\n\n  private companion object {\n    // additional padding when offsetting view near the screen edge\n    const val ADDITIONAL_EDGE_PADDING_PX = 20.0\n    const val LAYER_ID = \"annotation-layer\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/viewannotation/DynamicViewAnnotationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts.viewannotation\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.Rect\nimport android.graphics.drawable.Drawable\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.Button\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat.getColor\nimport androidx.core.content.ContextCompat.getDrawable\nimport androidx.core.graphics.drawable.toDrawable\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.GeometryCollection\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.ViewAnnotationAnchor\nimport com.mapbox.maps.ViewAnnotationAnchorConfig\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.style.layers.generated.LineLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.viewport\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityDynamicViewAnnotationsBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.utils.BitmapUtils\nimport com.mapbox.maps.testapp.utils.SimulateRouteLocationProvider\nimport com.mapbox.maps.viewannotation.OnViewAnnotationUpdatedListener\nimport com.mapbox.maps.viewannotation.ViewAnnotationManager\nimport com.mapbox.maps.viewannotation.annotatedLayerFeature\nimport com.mapbox.maps.viewannotation.annotationAnchors\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n/**\n * Example how to use dynamic view annotations on line layers and fixed positions.\n *\n * The example adds following 5 view annotations to the map:\n *\n * - ETA view annotation\n *    - Attached to the default route line geometry, configured to fit into the camera\n *    padding([ViewAnnotationOptions.ignoreCameraPadding]=false) and not overlapping with other view\n *    annotations or location puck([ViewAnnotationOptions.allowOverlap]=false and\n *    [ViewAnnotationOptions.allowOverlapWithPuck]=false).\n *\n * - Alternative ETA view annotation\n *    - Attached to the alternative routine line geometry, configured to fit into the camera\n *    padding([ViewAnnotationOptions.ignoreCameraPadding]=false) and not overlapping with other view\n *    annotations or location puck([ViewAnnotationOptions.allowOverlap]=false and\n *    [ViewAnnotationOptions.allowOverlapWithPuck]=false).\n *\n * - 2 parking view annotations\n *    - Attached to polygon geometries, configured to ignore the camera\n *    padding([ViewAnnotationOptions.ignoreCameraPadding]=true) and allow overlapping with other view\n *    annotations([ViewAnnotationOptions.allowOverlap]=true), so they would be visible on a further\n *    distance in the follow puck mode, where the padding top is set to 500.\n *    The parking view annotations are not allowed to overlap with the location puck ([ViewAnnotationOptions.allowOverlapWithPuck]=false).\n *\n * - Construction site view annotation\n *    - Attached to point geometry, configured to ignore the camera\n *    padding([ViewAnnotationOptions.ignoreCameraPadding]=true), allow overlapping with other view\n *    annotations([ViewAnnotationOptions.allowOverlap]=true), and allow overlapping with the location\n *    puck([ViewAnnotationOptions.allowOverlapWithPuck]=true). This is useful for high priority labels\n *    that shouldn't be covered by anything.\n */\nclass DynamicViewAnnotationActivity : AppCompatActivity() {\n\n  private lateinit var viewAnnotationManager: ViewAnnotationManager\n\n  private lateinit var featureRouteMain: Feature\n  private lateinit var featureRouteAlt: Feature\n  private lateinit var featureCollectionParkings: FeatureCollection\n  private lateinit var featureCollectionConstructionSite: FeatureCollection\n\n  // dynamic view annotations\n  private lateinit var alternativeEtaView: View\n  private lateinit var etaView: View\n\n  private val routeSourceMain: GeoJsonSource = geoJsonSource(SOURCE_MAIN_ID)\n  private val routeSourceAlt: GeoJsonSource = geoJsonSource(SOURCE_ALT_ID)\n  private val parkingSource: GeoJsonSource = geoJsonSource(SOURCE_PARKING)\n  private val constructionSource: GeoJsonSource = geoJsonSource(SOURCE_CONSTRUCTION)\n  private val routeLayerMain: LineLayer = LineLayer(\n    layerId = LAYER_MAIN_ID,\n    sourceId = SOURCE_MAIN_ID\n  )\n  private val routeLayerAlt: LineLayer = LineLayer(\n    layerId = LAYER_ALT_ID,\n    sourceId = SOURCE_ALT_ID,\n  )\n  private val parkingLayer = FillLayer(\n    layerId = LAYER_PARKING,\n    sourceId = SOURCE_PARKING\n  )\n  private val constructionLayer = CircleLayer(\n    layerId = LAYER_CONSTRUCTION,\n    sourceId = SOURCE_CONSTRUCTION\n  )\n\n  private var isMainActive = true\n  private var isOverview = true\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityDynamicViewAnnotationsBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    val mapView = binding.mapView\n    viewAnnotationManager = mapView.viewAnnotationManager\n\n    lifecycleScope.launch {\n      mapView.mapboxMap.setCamera(\n        cameraOptions {\n        center(Point.fromLngLat(-122.3004315, 37.535426700013154))\n        zoom(9.614)\n      }\n      )\n      binding.btnMode.isEnabled = false\n      binding.btnMode.setOnClickListener {\n        isOverview = !isOverview\n        if (isOverview) {\n          overviewRoute(binding.mapView)\n          refreshButton(binding.btnMode)\n        } else {\n          followLocationIndicator(binding.mapView)\n          refreshButton(binding.btnMode)\n        }\n      }\n\n      loadAssets()\n\n      mapView.mapboxMap.apply {\n        initStyleWithLayers {\n          setupLocation(mapView)\n          overviewRoute(mapView)\n\n          addViewAnnotations()\n          observeViewAnnotationUpdate()\n        }\n      }\n      mapView.showPaddingZone()\n      refreshButton(binding.btnMode)\n    }\n  }\n\n  private suspend fun loadAssets() {\n    withContext(Dispatchers.Default) {\n      featureRouteMain = getFeatureFromAsset(ROUTE_MAIN_GEOJSON)\n      featureRouteAlt = getFeatureFromAsset(ROUTE_ALT_GEOJSON)\n      featureCollectionParkings = getFeatureCollectionFromAsset(PARKINGS_GEOJSON)\n      featureCollectionConstructionSite = getFeatureCollectionFromAsset(CONSTRUCTION_GEOJSON)\n    }\n  }\n\n  @OptIn(com.mapbox.maps.MapboxExperimental::class)\n  private fun MapboxMap.initStyleWithLayers(onLoaded: (Style) -> Unit) {\n    refreshRoutes()\n\n    loadStyle(\n      style(Style.STANDARD) {\n        // source for displaying main route\n        +routeSourceMain\n        // source for displaying alt route\n        +routeSourceAlt\n        // layer for alternative route\n        +routeLayerAlt.apply {\n          lineColor(Color.parseColor(\"#FF999999\"))\n          // make map elements around (30m) route line visible through obstructing 3D buildings and other aboveground features\n          lineWidth(15.0)\n          lineBorderWidth(2.0)\n          lineBorderColor(Color.parseColor(\"#FF333333\"))\n        }\n        // layer for main route\n        +routeLayerMain.apply {\n          lineColor(Color.parseColor(\"#FF57A9FB\"))\n          // make map elements around (30m) route line visible through obstructing 3D buildings and other aboveground features\n          lineWidth(15.0)\n          lineCap(LineCap.ROUND)\n          lineBorderWidth(2.0)\n          lineBorderColor(Color.parseColor(\"#FF327AC2\"))\n        }\n        +parkingSource.apply {\n          featureCollection(featureCollectionParkings)\n        }\n        // layer for parkings\n        +parkingLayer.apply {\n          fillColor(Color.parseColor(\"#0080ff\")).fillOpacity(0.5)\n        }\n        +constructionSource.apply {\n          featureCollection(featureCollectionConstructionSite)\n        }\n        // layer for construction sites\n        +constructionLayer.apply {\n          circleColor(Color.TRANSPARENT)\n        }\n      },\n      onLoaded\n    )\n  }\n\n  private fun setupLocation(mapView: MapView) {\n    // simulates movement along the route\n    val simulatedLocationProvider = SimulateRouteLocationProvider(\n      featureRouteMain.geometry() as LineString\n    )\n    mapView.apply {\n      location.setLocationProvider(simulatedLocationProvider)\n      location.locationPuck = LocationPuck2D(\n        bearingImage = ImageHolder.from(R.drawable.mapbox_user_puck_icon),\n      )\n      location.enabled = true\n      location.puckBearingEnabled = true\n      location.puckBearing = PuckBearing.COURSE\n    }\n  }\n\n  private fun followLocationIndicator(mapView: MapView) {\n    mapView.viewport.apply {\n      transitionTo(\n        makeFollowPuckViewportState(\n          FollowPuckViewportStateOptions.Builder()\n            .pitch(70.0)\n            .zoom(18.0)\n            .padding(\n              EdgeInsets(\n                /* top = */ 500.0,\n                /* left = */ 100.0,\n                /* bottom = */ 100.0,\n                /* right = */ 100.0\n              )\n            )\n            .build()\n        )\n      )\n    }\n  }\n\n  private fun overviewRoute(mapView: MapView) {\n    mapView.viewport.transitionTo(\n      mapView.viewport.makeOverviewViewportState(\n        OverviewViewportStateOptions.Builder()\n          .geometry(\n            GeometryCollection.fromGeometries(\n              listOf(\n                featureRouteMain.geometry(),\n                featureRouteAlt.geometry(),\n              )\n            )\n          )\n          .padding(\n            EdgeInsets(\n              /* top = */ 100.0,\n              /* left = */ 100.0,\n              /* bottom = */ 100.0,\n              /* right = */ 100.0\n            )\n          )\n          .build()\n      )\n    )\n  }\n\n  /**\n   * Renders the padding on top of the MapView.\n   */\n  @OptIn(MapboxExperimental::class)\n  private fun MapView.showPaddingZone() {\n    val paddingView = PaddingView(context)\n    addView(paddingView)\n    mapboxMap.subscribeCameraChangedCoalesced {\n      it.cameraState.padding.let { padding ->\n        paddingView.updateRect(\n          Rect(\n            /* left = */ padding.left.toInt(),\n            /* top = */ padding.top.toInt(),\n            /* right = */ width - padding.right.toInt(),\n            /* bottom = */ height - padding.bottom.toInt()\n          )\n        )\n      }\n    }\n  }\n\n  /**\n   * A View that draw a box to showcase padding position.\n   */\n  private class PaddingView(context: Context) : View(context) {\n    val paint = Paint()\n    var rect = Rect()\n\n    init {\n      paint.style = Paint.Style.STROKE\n      paint.color = getColor(context, R.color.primary)\n      paint.strokeWidth = 3f\n    }\n\n    @UiThread\n    fun updateRect(rect: Rect) {\n      this.rect = rect\n      invalidate()\n    }\n\n    override fun onDraw(canvas: Canvas) {\n      super.onDraw(canvas)\n      canvas.drawRect(rect, paint)\n    }\n  }\n\n  private fun refreshButton(btnMode: Button) {\n    btnMode.isEnabled = true\n    btnMode.text = getString(R.string.dynamic_mode, if (isOverview) \"follow\" else \"overview\")\n  }\n\n  private fun addViewAnnotations() {\n    etaView = viewAnnotationManager.addViewAnnotation(\n      resId = R.layout.item_dva_eta,\n      options = viewAnnotationOptions {\n        annotatedLayerFeature(LAYER_MAIN_ID)\n        annotationAnchors(\n          {\n            anchor(ViewAnnotationAnchor.TOP_RIGHT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.TOP_LEFT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.BOTTOM_RIGHT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.BOTTOM_LEFT)\n          },\n        )\n        minZoom(8f)\n      }\n    )\n    alternativeEtaView = viewAnnotationManager.addViewAnnotation(\n      resId = R.layout.item_dva_alt_eta,\n      options = viewAnnotationOptions {\n        annotatedLayerFeature(LAYER_ALT_ID)\n        annotationAnchors(\n          {\n            anchor(ViewAnnotationAnchor.TOP_RIGHT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.TOP_LEFT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.BOTTOM_RIGHT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.BOTTOM_LEFT)\n          },\n        )\n        minZoom(8f)\n      }\n    )\n    alternativeEtaView.setOnClickListener {\n      toggleActiveRoute()\n    }\n\n    viewAnnotationManager.addViewAnnotation(\n      resId = R.layout.item_dva_parking,\n      options = viewAnnotationOptions {\n        allowOverlap(true)\n        ignoreCameraPadding(true)\n        annotatedLayerFeature(LAYER_PARKING) {\n          featureId(PARKING_FEATURE_ID_1)\n        }\n        minZoom(10f)\n      }\n    )\n\n    viewAnnotationManager.addViewAnnotation(\n      resId = R.layout.item_dva_parking,\n      options = viewAnnotationOptions {\n        allowOverlap(true)\n        ignoreCameraPadding(true)\n        annotatedLayerFeature(LAYER_PARKING) {\n          featureId(PARKING_FEATURE_ID_2)\n        }\n        minZoom(12f)\n      }\n    )\n\n    viewAnnotationManager.addViewAnnotation(\n      resId = R.layout.item_dva_construction,\n      options = viewAnnotationOptions {\n        allowOverlap(true)\n        allowOverlapWithPuck(true)\n        ignoreCameraPadding(true)\n        annotatedLayerFeature(LAYER_CONSTRUCTION) {\n          featureId(CONSTRUCTION_FEATURE_ID_1)\n        }\n        minZoom(10f)\n      }\n    )\n  }\n\n  private fun toggleActiveRoute() {\n    isMainActive = !isMainActive\n    refreshRoutes()\n  }\n\n  private fun refreshRoutes() {\n    if (isMainActive) {\n      routeSourceMain.feature(featureRouteMain)\n      routeSourceAlt.feature(featureRouteAlt)\n    } else {\n      routeSourceMain.feature(featureRouteAlt)\n      routeSourceAlt.feature(featureRouteMain)\n    }\n  }\n\n  private fun observeViewAnnotationUpdate() {\n    viewAnnotationManager.addOnViewAnnotationUpdatedListener(\n      object : OnViewAnnotationUpdatedListener {\n        override fun onViewAnnotationAnchorUpdated(\n          view: View,\n          anchor: ViewAnnotationAnchorConfig\n        ) {\n          // set different background according to the anchor\n          when (view) {\n            etaView -> {\n              view.background = getBackground(anchor, getColor(R.color.primary))\n            }\n\n            alternativeEtaView -> {\n              view.background = getBackground(anchor, getColor(R.color.white))\n            }\n\n            else -> {\n              // no-op\n            }\n          }\n        }\n      }\n    )\n  }\n\n  private suspend fun getFeatureFromAsset(featureGeojson: String) =\n    Feature.fromJson(\n      AnnotationUtils.loadStringFromAssets(\n        this, featureGeojson\n      )\n    )\n\n  private suspend fun getFeatureCollectionFromAsset(featureGeojson: String) =\n    FeatureCollection.fromJson(\n      AnnotationUtils.loadStringFromAssets(\n        this, featureGeojson\n      )\n    )\n\n  private fun getBackground(\n    anchorConfig: ViewAnnotationAnchorConfig,\n    @ColorInt tint: Int,\n  ): Drawable {\n    var flipX = false\n    var flipY = false\n\n    when (anchorConfig.anchor) {\n      ViewAnnotationAnchor.BOTTOM_RIGHT -> {\n        flipX = true\n        flipY = true\n      }\n\n      ViewAnnotationAnchor.TOP_RIGHT -> {\n        flipX = true\n      }\n\n      ViewAnnotationAnchor.BOTTOM_LEFT -> {\n        flipY = true\n      }\n\n      else -> {\n        // no-op\n      }\n    }\n\n    return BitmapUtils.drawableToBitmap(\n      getDrawable(this, R.drawable.bg_dva_eta)!!,\n      flipX = flipX,\n      flipY = flipY,\n      tint = tint,\n    ).toDrawable(resources)\n  }\n\n  private companion object {\n    const val LAYER_MAIN_ID = \"layer-main\"\n    const val LAYER_ALT_ID = \"layer-alt\"\n    const val LAYER_PARKING = \"layer-parking\"\n    const val LAYER_CONSTRUCTION = \"layer-construction\"\n    const val SOURCE_MAIN_ID = \"source-main\"\n    const val SOURCE_ALT_ID = \"source-alt\"\n    const val SOURCE_PARKING = \"source-parking\"\n    const val SOURCE_CONSTRUCTION = \"source-construction\"\n    const val PARKING_FEATURE_ID_1 = \"parking-1\"\n    const val PARKING_FEATURE_ID_2 = \"parking-2\"\n    const val CONSTRUCTION_FEATURE_ID_1 = \"construction-1\"\n\n    const val ROUTE_MAIN_GEOJSON = \"dva-sf-route-main.geojson\"\n    const val ROUTE_ALT_GEOJSON = \"dva-sf-route-alternative.geojson\"\n    const val PARKINGS_GEOJSON = \"dva-sf-parkings.geojson\"\n    const val CONSTRUCTION_GEOJSON = \"dva-sf-construction.geojson\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/viewannotation/ViewAnnotationAnimationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts.viewannotation\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.TypeEvaluator\nimport android.animation.ValueAnimator\nimport android.animation.ValueAnimator.AnimatorUpdateListener\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.ViewAnnotationOptions\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ItemCalloutViewBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.viewannotation.ViewAnnotationManager\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.turf.TurfConstants.UNIT_DEFAULT\nimport com.mapbox.turf.TurfMeasurement\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport kotlin.math.roundToLong\n\n/**\n * Example how to animate a view annotations on top of a route.\n */\nclass ViewAnnotationAnimationActivity : AppCompatActivity() {\n\n  private lateinit var viewAnnotationManager: ViewAnnotationManager\n  private lateinit var annotationView: View\n  private lateinit var textView: TextView\n  private var routeCoordinateList = mutableListOf<Point>()\n  private var currentRouteCoordinate = 0\n  private var totalLength = 0.0\n  private var currentAnimator: Animator? = null\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n\n    lifecycleScope.launch {\n      // load feature collection from assets file\n      val featureCollection = withContext(Dispatchers.Default) {\n        FeatureCollection.fromJson(\n          AnnotationUtils.loadStringFromAssets(\n            this@ViewAnnotationAnimationActivity, ROUTE_FILE_NAME\n          )\n        )\n      }\n\n      // calculate the route length, get coordinates from route geometry\n      val lineString = featureCollection.features()!![0].geometry() as LineString\n      routeCoordinateList = lineString.coordinates()\n      totalLength = TurfMeasurement.length(lineString, UNIT_DEFAULT)\n\n      // initialize the mapview\n      mapView.mapboxMap.apply {\n        loadStyle(\n          style(Style.STANDARD) {\n          // source for displaying the route\n          +geoJsonSource(SOURCE_ID) {\n            featureCollection(featureCollection)\n          }\n          // layer for displaying the route\n          +lineLayer(LINE_ID, SOURCE_ID) {\n            lineColor(Color.parseColor(COLOR_PINK_HEX))\n            lineWidth(4.0)\n          }\n        }\n        ) {\n          mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n          // center camera around SF airport\n          setCamera(\n            CameraOptions.Builder()\n              .center(Point.fromLngLat(-122.3915, 37.6177))\n              .zoom(11.0)\n              .build()\n          )\n          // get initial point\n          val initialPoint = routeCoordinateList[0]\n\n          // create view annotation callout item\n          viewAnnotationManager = mapView.viewAnnotationManager\n          annotationView = viewAnnotationManager.addViewAnnotation(\n            R.layout.item_callout_view,\n            ViewAnnotationOptions.Builder()\n              .geometry(initialPoint)\n              .build()\n          )\n\n          ItemCalloutViewBinding.bind(annotationView).apply {\n            textView = textNativeView\n          }\n\n          animateNextStep()\n        }\n      }\n    }\n  }\n\n  override fun onStop() {\n    super.onStop()\n    currentAnimator?.removeAllListeners()\n    currentAnimator?.cancel()\n  }\n\n  private fun animateNextStep() {\n    currentRouteCoordinate %= (routeCoordinateList.size - 1)\n    val currentPoint = routeCoordinateList[currentRouteCoordinate]\n    val nextPoint = routeCoordinateList[currentRouteCoordinate + 1]\n\n    val progress = TurfMeasurement.distance(currentPoint, nextPoint) / totalLength\n    val animateDuration = progress * ANIMATION_DURATION_TOTAL_MS\n    currentAnimator = ValueAnimator.ofObject(pointEvaluator, currentPoint, nextPoint).apply {\n      duration = animateDuration.roundToLong()\n      addUpdateListener(animatorUpdateListener)\n      addListener(object : AnimatorListenerAdapter() {\n        override fun onAnimationEnd(animation: Animator) {\n          super.onAnimationEnd(animation)\n          currentRouteCoordinate++\n          animateNextStep()\n        }\n      })\n      start()\n    }\n  }\n\n  private val animatorUpdateListener =\n    AnimatorUpdateListener { valueAnimator ->\n      val animatedPosition: Point = valueAnimator.animatedValue as Point\n      viewAnnotationManager.updateViewAnnotation(\n        annotationView,\n        ViewAnnotationOptions.Builder().geometry(animatedPosition).build()\n      )\n      textView.text = \"lat=%.4f\\nlon=%.4f\".format(\n        animatedPosition.latitude(),\n        animatedPosition.longitude()\n      )\n    }\n\n  private val pointEvaluator: TypeEvaluator<Point> =\n    TypeEvaluator<Point> { fraction, startValue, endValue ->\n      Point.fromLngLat(\n        (\n          startValue.longitude() +\n            ((endValue.longitude() - startValue.longitude()) * fraction)\n          ),\n        startValue.latitude() +\n          (endValue.latitude() - startValue.latitude()) * fraction\n      )\n    }\n\n  private companion object {\n    const val LINE_ID = \"line\"\n    const val SOURCE_ID = \"source\"\n    const val COLOR_PINK_HEX = \"#F13C6E\"\n    const val ANIMATION_DURATION_TOTAL_MS = 50000\n    const val ROUTE_FILE_NAME = \"sf_airport_route.geojson\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/viewannotation/ViewAnnotationBasicAddActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts.viewannotation\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.plugin.animation.flyTo\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.addOnMapClickListener\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityViewAnnotationShowcaseBinding\nimport com.mapbox.maps.testapp.databinding.ItemCalloutViewBinding\nimport com.mapbox.maps.viewannotation.ViewAnnotationManager\nimport com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\n\n/**\n * Example how to add view annotations by clicking on the map.\n */\nclass ViewAnnotationBasicAddActivity : AppCompatActivity(), OnMapClickListener {\n\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var viewAnnotationManager: ViewAnnotationManager\n  private val viewAnnotationViews = mutableListOf<View>()\n\n  // Increase-on-access priority assigned to the most recent selected annotation,\n  // keeping it on top of other selected annotation.\n  private var topPriority: Long = 0\n    get() = ++field\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityViewAnnotationShowcaseBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    viewAnnotationManager = binding.mapView.viewAnnotationManager\n\n    mapboxMap = binding.mapView.mapboxMap.apply {\n      loadStyle(Style.STANDARD) {\n        addOnMapClickListener(this@ViewAnnotationBasicAddActivity)\n        binding.fabStyleToggle.setOnClickListener {\n          when (style?.styleURI) {\n            Style.STANDARD -> loadStyle(Style.STANDARD_SATELLITE)\n            Style.STANDARD_SATELLITE -> loadStyle(Style.STANDARD)\n          }\n        }\n        Toast.makeText(this@ViewAnnotationBasicAddActivity, STARTUP_TEXT, Toast.LENGTH_LONG).show()\n      }\n    }\n\n    binding.fabReframe.setOnClickListener {\n      if (viewAnnotationViews.isNotEmpty()) {\n        viewAnnotationManager.cameraForAnnotations(viewAnnotationViews) {\n          mapboxMap.flyTo(it)\n        }\n      } else {\n        Toast.makeText(this@ViewAnnotationBasicAddActivity, ADD_VIEW_ANNOTATION_TEXT, Toast.LENGTH_LONG).show()\n      }\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_view_annotation, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.action_view_annotation_fixed_delay -> {\n        viewAnnotationManager.setViewAnnotationUpdateMode(ViewAnnotationUpdateMode.MAP_FIXED_DELAY)\n        true\n      }\n      R.id.action_view_annotation_map_synchronized -> {\n        viewAnnotationManager.setViewAnnotationUpdateMode(ViewAnnotationUpdateMode.MAP_SYNCHRONIZED)\n        true\n      }\n      else -> super.onOptionsItemSelected(item)\n    }\n  }\n\n  override fun onMapClick(point: Point): Boolean {\n    addViewAnnotation(point)\n    return true\n  }\n\n  @SuppressLint(\"SetTextI18n\")\n  private fun addViewAnnotation(point: Point) {\n    val viewAnnotation = viewAnnotationManager.addViewAnnotation(\n      resId = R.layout.item_callout_view,\n      options = viewAnnotationOptions {\n        geometry(point)\n        allowOverlap(true)\n        ignoreCameraPadding(true)\n        allowOverlapWithPuck(true)\n      }\n    )\n    viewAnnotationViews.add(viewAnnotation)\n    ItemCalloutViewBinding.bind(viewAnnotation).apply {\n      textNativeView.text = \"lat=%.2f\\nlon=%.2f\".format(point.latitude(), point.longitude())\n      closeNativeView.setOnClickListener {\n        viewAnnotationManager.removeViewAnnotation(viewAnnotation)\n        viewAnnotationViews.remove(viewAnnotation)\n      }\n      selectButton.setOnClickListener { b ->\n        val button = b as Button\n        val isSelected = button.text.toString().equals(\"SELECT\", true)\n        val pxDelta = if (isSelected) SELECTED_ADD_COEF_PX else -SELECTED_ADD_COEF_PX\n        button.text = if (isSelected) \"DESELECT\" else \"SELECT\"\n        viewAnnotationManager.updateViewAnnotation(\n          viewAnnotation,\n          viewAnnotationOptions {\n            allowOverlap(true)\n            priority(if (isSelected) topPriority else 0)\n          }\n        )\n        (button.layoutParams as ViewGroup.MarginLayoutParams).apply {\n          bottomMargin += pxDelta\n          rightMargin += pxDelta\n          leftMargin += pxDelta\n        }\n        button.requestLayout()\n      }\n    }\n  }\n\n  private companion object {\n    const val SELECTED_ADD_COEF_PX = 25\n    const val STARTUP_TEXT = \"Click on a map to add a view annotation.\"\n    const val ADD_VIEW_ANNOTATION_TEXT = \"Add view annotations to re-frame map camera\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/viewannotation/ViewAnnotationShowcaseActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts.viewannotation\n\nimport android.annotation.SuppressLint\nimport android.graphics.Bitmap\nimport android.os.Bundle\nimport android.util.TypedValue\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport android.widget.ImageView\nimport android.widget.TextView\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.asynclayoutinflater.view.AsyncLayoutInflater\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.rasterDemSource\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.extension.style.terrain.generated.terrain\nimport com.mapbox.maps.plugin.gestures.*\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityViewAnnotationShowcaseBinding\nimport com.mapbox.maps.viewannotation.ViewAnnotationManager\nimport com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode\nimport com.mapbox.maps.viewannotation.annotatedLayerFeature\nimport com.mapbox.maps.viewannotation.annotationAnchor\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport java.util.concurrent.CopyOnWriteArrayList\n\n/**\n * Example how to add view annotations to the map.\n *\n * Specifically view annotations will be associated with marker icons\n * showcasing how to implement functionality similar to MarkerView from Maps v9.\n */\nclass ViewAnnotationShowcaseActivity :\n  AppCompatActivity(),\n  OnMapClickListener,\n  OnMapLongClickListener {\n\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var viewAnnotationManager: ViewAnnotationManager\n  private val pointList = CopyOnWriteArrayList<Feature>()\n  private var markerId = 0\n\n  private var markerWidth = 0\n  private var markerHeight = 0\n\n  private val asyncInflater by lazy { AsyncLayoutInflater(this) }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityViewAnnotationShowcaseBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    viewAnnotationManager = binding.mapView.viewAnnotationManager\n\n    val bitmap = ContextCompat.getDrawable(this, R.drawable.ic_blue_marker)!!.toBitmap()\n    markerWidth = bitmap.width\n    markerHeight = bitmap.height\n\n    mapboxMap = binding.mapView.mapboxMap.apply {\n      loadStyle(\n        styleExtension = prepareStyle(Style.STANDARD, bitmap)\n      ) {\n        addOnMapClickListener(this@ViewAnnotationShowcaseActivity)\n        addOnMapLongClickListener(this@ViewAnnotationShowcaseActivity)\n        binding.fabStyleToggle.setOnClickListener {\n          when (style?.styleURI) {\n            Style.STANDARD -> loadStyle(prepareStyle(Style.STANDARD_SATELLITE, bitmap))\n            Style.STANDARD_SATELLITE -> loadStyle(prepareStyle(Style.STANDARD, bitmap))\n          }\n        }\n        Toast.makeText(this@ViewAnnotationShowcaseActivity, STARTUP_TEXT, Toast.LENGTH_LONG).show()\n      }\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_view_annotation, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.action_view_annotation_fixed_delay -> {\n        viewAnnotationManager.setViewAnnotationUpdateMode(ViewAnnotationUpdateMode.MAP_FIXED_DELAY)\n        true\n      }\n\n      R.id.action_view_annotation_map_synchronized -> {\n        viewAnnotationManager.setViewAnnotationUpdateMode(ViewAnnotationUpdateMode.MAP_SYNCHRONIZED)\n        true\n      }\n\n      else -> super.onOptionsItemSelected(item)\n    }\n  }\n\n  private fun prepareStyle(styleUri: String, bitmap: Bitmap) = style(styleUri) {\n    +image(BLUE_ICON_ID, bitmap)\n    +geoJsonSource(SOURCE_ID) {\n      featureCollection(FeatureCollection.fromFeatures(pointList))\n    }\n    if (styleUri == Style.STANDARD_SATELLITE) {\n      +rasterDemSource(TERRAIN_SOURCE) {\n        url(TERRAIN_URL_TILE_RESOURCE)\n      }\n      +terrain(TERRAIN_SOURCE)\n    }\n    +symbolLayer(LAYER_ID, SOURCE_ID) {\n      iconImage(BLUE_ICON_ID)\n      iconAnchor(IconAnchor.BOTTOM)\n      iconAllowOverlap(false)\n    }\n  }\n\n  override fun onMapLongClick(point: Point): Boolean {\n    val markerId = addMarkerAndReturnId(point)\n    addViewAnnotation(point, markerId)\n    return true\n  }\n\n  override fun onMapClick(point: Point): Boolean {\n    mapboxMap.queryRenderedFeatures(\n      RenderedQueryGeometry(mapboxMap.pixelForCoordinate(point)),\n      RenderedQueryOptions(listOf(LAYER_ID), null)\n    ) {\n      onFeatureClicked(it) { feature ->\n        feature.id()?.let { featureId ->\n          viewAnnotationManager.getViewAnnotation(\n            AnnotatedLayerFeature.Builder()\n              .layerId(LAYER_ID)\n              .featureId(featureId)\n              .build()\n          )?.toggleViewVisibility()\n        }\n      }\n    }\n    return true\n  }\n\n  private fun onFeatureClicked(\n    expected: Expected<String, List<QueriedRenderedFeature>>,\n    onFeatureClicked: (Feature) -> Unit\n  ) {\n    if (expected.isValue && expected.value?.size!! > 0) {\n      expected.value?.get(0)?.queriedFeature?.feature?.let { feature ->\n        onFeatureClicked.invoke(feature)\n      }\n    }\n  }\n\n  private fun View.toggleViewVisibility() {\n    visibility = if (visibility == View.VISIBLE) View.GONE else View.VISIBLE\n  }\n\n  private fun addMarkerAndReturnId(point: Point): String {\n    val currentId = \"$MARKER_ID_PREFIX${(markerId++)}\"\n    pointList.add(Feature.fromGeometry(point, null, currentId))\n    val featureCollection = FeatureCollection.fromFeatures(pointList)\n    mapboxMap.getStyle { style ->\n      style.getSourceAs<GeoJsonSource>(SOURCE_ID)?.featureCollection(featureCollection)\n    }\n    return currentId\n  }\n\n  @SuppressLint(\"SetTextI18n\")\n  private fun addViewAnnotation(point: Point, featureId: String) {\n    viewAnnotationManager.addViewAnnotation(\n      resId = R.layout.item_callout_view,\n      options = viewAnnotationOptions {\n        annotatedLayerFeature(LAYER_ID) {\n          featureId(featureId)\n        }\n        annotationAnchor {\n          anchor(ViewAnnotationAnchor.BOTTOM)\n        }\n        allowOverlap(false)\n      },\n      asyncInflater = asyncInflater\n    ) { viewAnnotation ->\n      viewAnnotation.visibility = View.GONE\n      // calculate offsetY manually taking into account icon height only because of bottom anchoring\n      viewAnnotationManager.updateViewAnnotation(\n        viewAnnotation,\n        viewAnnotationOptions {\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.BOTTOM)\n            offsetY(markerHeight.toDouble())\n          }\n        }\n      )\n      viewAnnotation.findViewById<TextView>(R.id.textNativeView).text =\n        \"lat=%.2f\\nlon=%.2f\".format(point.latitude(), point.longitude())\n      viewAnnotation.findViewById<ImageView>(R.id.closeNativeView).setOnClickListener { _ ->\n        viewAnnotationManager.removeViewAnnotation(viewAnnotation)\n      }\n      viewAnnotation.findViewById<Button>(R.id.selectButton).setOnClickListener { b ->\n        val button = b as Button\n        val isSelected = button.text.toString().equals(\"SELECT\", true)\n        val pxDelta =\n          (if (isSelected) SELECTED_ADD_COEF_DP.dpToPx() else -SELECTED_ADD_COEF_DP.dpToPx()).toInt()\n        button.text = if (isSelected) \"DESELECT\" else \"SELECT\"\n        viewAnnotationManager.updateViewAnnotation(\n          viewAnnotation,\n          viewAnnotationOptions {\n            priority(if (isSelected) 1 else 0)\n          }\n        )\n        (button.layoutParams as ViewGroup.MarginLayoutParams).apply {\n          bottomMargin += pxDelta\n          rightMargin += pxDelta\n          leftMargin += pxDelta\n        }\n        button.requestLayout()\n      }\n    }\n  }\n\n  private fun Float.dpToPx() = TypedValue.applyDimension(\n    TypedValue.COMPLEX_UNIT_DIP,\n    this,\n    this@ViewAnnotationShowcaseActivity.resources.displayMetrics\n  )\n\n  private companion object {\n    const val BLUE_ICON_ID = \"blue\"\n    const val SOURCE_ID = \"source_id\"\n    const val LAYER_ID = \"layer_id\"\n    const val TERRAIN_SOURCE = \"TERRAIN_SOURCE\"\n    const val TERRAIN_URL_TILE_RESOURCE = \"mapbox://mapbox.mapbox-terrain-dem-v1\"\n    const val MARKER_ID_PREFIX = \"view_annotation_\"\n    const val SELECTED_ADD_COEF_DP: Float = 8f\n    const val STARTUP_TEXT =\n      \"Long click on a map to add a marker and click on a marker to pop-up annotation.\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/markersandcallouts/viewannotation/ViewAnnotationWithPointAnnotationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.markersandcallouts.viewannotation\n\nimport android.annotation.SuppressLint\nimport android.graphics.Bitmap\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.isVisible\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.ViewAnnotationAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityViewAnnotationShowcaseBinding\nimport com.mapbox.maps.testapp.databinding.ItemCalloutViewBinding\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\nimport com.mapbox.maps.viewannotation.ViewAnnotationManager\nimport com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode\nimport com.mapbox.maps.viewannotation.annotationAnchor\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\n\n/**\n * Example how to add view annotation to the point annotation.\n */\nclass ViewAnnotationWithPointAnnotationActivity : AppCompatActivity() {\n\n  private lateinit var viewAnnotationManager: ViewAnnotationManager\n  private lateinit var pointAnnotationManager: PointAnnotationManager\n  private lateinit var pointAnnotation: PointAnnotation\n  private lateinit var viewAnnotation: View\n  private lateinit var binding: ActivityViewAnnotationShowcaseBinding\n\n  @SuppressLint(\"SetTextI18n\")\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityViewAnnotationShowcaseBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    viewAnnotationManager = binding.mapView.viewAnnotationManager\n\n    resetCamera()\n\n    binding.mapView.mapboxMap.loadStyle(Style.STANDARD) {\n      prepareAnnotationMarker(binding.mapView, bitmapFromDrawableRes(R.drawable.ic_blue_marker))\n      prepareViewAnnotation()\n      // show / hide view annotation based on a marker click\n      pointAnnotationManager.addClickListener { clickedAnnotation ->\n        if (pointAnnotation == clickedAnnotation) {\n          viewAnnotation.toggleViewVisibility()\n        }\n        true\n      }\n      // show / hide view annotation based on marker visibility\n      binding.fabStyleToggle.setOnClickListener {\n        if (pointAnnotation.iconImageBitmap == null) {\n          pointAnnotation.iconImageBitmap = bitmapFromDrawableRes(R.drawable.ic_blue_marker)\n          viewAnnotation.isVisible = true\n        } else {\n          pointAnnotation.iconImageBitmap = null\n          viewAnnotation.isVisible = false\n        }\n        pointAnnotationManager.update(pointAnnotation)\n      }\n\n      // reset annotations and camera position\n      binding.fabReframe.setOnClickListener {\n        resetCamera()\n        pointAnnotation.point = POINT\n        pointAnnotationManager.update(pointAnnotation)\n        syncAnnotationPosition()\n      }\n\n      // update view annotation geometry if dragging the marker\n      pointAnnotationManager.addDragListener(object : OnPointAnnotationDragListener {\n        override fun onAnnotationDragStarted(annotation: Annotation<*>) {\n        }\n\n        override fun onAnnotationDrag(annotation: Annotation<*>) {\n          if (annotation == pointAnnotation) {\n            syncAnnotationPosition()\n          }\n        }\n\n        override fun onAnnotationDragFinished(annotation: Annotation<*>) {\n        }\n      })\n    }\n  }\n\n  private fun resetCamera() {\n    binding.mapView.mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(POINT)\n        .pitch(45.0)\n        .zoom(12.5)\n        .bearing(-17.6)\n        .build()\n    )\n  }\n\n  private fun syncAnnotationPosition() {\n    viewAnnotationManager.updateViewAnnotation(\n      viewAnnotation,\n      viewAnnotationOptions {\n        geometry(pointAnnotation.geometry)\n      }\n    )\n    ItemCalloutViewBinding.bind(viewAnnotation).apply {\n      textNativeView.text = \"lat=%.2f\\nlon=%.2f\".format(\n        pointAnnotation.geometry.latitude(),\n        pointAnnotation.geometry.longitude()\n      )\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_view_annotation, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.action_view_annotation_fixed_delay -> {\n        viewAnnotationManager.setViewAnnotationUpdateMode(ViewAnnotationUpdateMode.MAP_FIXED_DELAY)\n        true\n      }\n\n      R.id.action_view_annotation_map_synchronized -> {\n        viewAnnotationManager.setViewAnnotationUpdateMode(ViewAnnotationUpdateMode.MAP_SYNCHRONIZED)\n        true\n      }\n\n      else -> super.onOptionsItemSelected(item)\n    }\n  }\n\n  private fun View.toggleViewVisibility() {\n    visibility = if (visibility == View.VISIBLE) View.GONE else View.VISIBLE\n  }\n\n  @SuppressLint(\"SetTextI18n\")\n  private fun prepareViewAnnotation() {\n    viewAnnotation = viewAnnotationManager.addViewAnnotation(\n      resId = R.layout.item_callout_view,\n      options = viewAnnotationOptions {\n        geometry(pointAnnotation.geometry)\n        annotationAnchor {\n          anchor(ViewAnnotationAnchor.BOTTOM)\n          offsetY((pointAnnotation.iconImageBitmap?.height!!.toDouble()))\n        }\n      }\n    )\n    ItemCalloutViewBinding.bind(viewAnnotation).apply {\n      textNativeView.text = \"lat=%.2f\\nlon=%.2f\".format(POINT.latitude(), POINT.longitude())\n      closeNativeView.setOnClickListener {\n        viewAnnotationManager.removeViewAnnotation(viewAnnotation)\n      }\n      selectButton.setOnClickListener { b ->\n        val button = b as Button\n        val isSelected = button.text.toString().equals(\"SELECT\", true)\n        val pxDelta = if (isSelected) SELECTED_ADD_COEF_PX else -SELECTED_ADD_COEF_PX\n        button.text = if (isSelected) \"DESELECT\" else \"SELECT\"\n        (button.layoutParams as ViewGroup.MarginLayoutParams).apply {\n          bottomMargin += pxDelta\n          rightMargin += pxDelta\n          leftMargin += pxDelta\n        }\n        button.requestLayout()\n      }\n    }\n  }\n\n  private fun prepareAnnotationMarker(mapView: MapView, iconBitmap: Bitmap) {\n    val annotationPlugin = mapView.annotations\n    val pointAnnotationOptions: PointAnnotationOptions = PointAnnotationOptions()\n      .withPoint(POINT)\n      .withIconImage(iconBitmap)\n      .withIconAnchor(IconAnchor.BOTTOM)\n      .withDraggable(true)\n    pointAnnotationManager = annotationPlugin.createPointAnnotationManager(\n      AnnotationConfig(\n        layerId = LAYER_ID\n      )\n    )\n    pointAnnotation = pointAnnotationManager.create(pointAnnotationOptions)\n  }\n\n  private companion object {\n    const val SELECTED_ADD_COEF_PX = 25\n    val POINT: Point = Point.fromLngLat(0.381457, 6.687337)\n    val LAYER_ID = \"layer-id\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/sky/SkyLayerShowcaseActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.sky\n\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.SeekBar\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.layers.generated.SkyLayer\nimport com.mapbox.maps.extension.style.layers.generated.skyLayer\nimport com.mapbox.maps.extension.style.layers.getLayerAs\nimport com.mapbox.maps.extension.style.layers.properties.generated.SkyType\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivitySkyLayerBinding\n\n/**\n * Showcase for Sky layer.\n */\nclass SkyLayerShowcaseActivity : AppCompatActivity() {\n\n  private var skyLayer: SkyLayer? = null\n  private var skyType = SkyType.GRADIENT\n\n  // could be between 0.0 and 180.0\n  private var skyGradientRadius = 10.0\n\n  // azimuth, could be between -180.0 and 180.0\n  private var skyGradientCenterA = 0.0\n\n  // polar, could be between 0.0 and 180.0\n  private var skyGradientCenterP = 90.0\n\n  // could be between 0.0 and 100.0\n  private var skyAtmosphereSunIntensity = 10.0\n\n  // azimuth, could be between -180.0 and 180.0\n  private var skyAtmosphereCenterA = 0.0\n\n  // polar, could be between 0.0 and 180.0\n  private var skyAtmosphereCenterP = 90.0\n\n  private lateinit var binding: ActivitySkyLayerBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivitySkyLayerBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    applyControls()\n    binding.mapView.mapboxMap.loadStyle(\n      styleExtension = style(Style.STANDARD_SATELLITE) {\n        +skyLayer(SKY_LAYER) {\n          skyType(skyType)\n          when (skyType) {\n            SkyType.GRADIENT -> {\n              skyGradient(\n                interpolate {\n                  linear()\n                  skyRadialProgress()\n                  literal(0.0)\n                  literal(SKY_GRADIENT_COLOR_START)\n                  literal(1.0)\n                  literal(SKY_GRADIENT_COLOR_END)\n                }\n              )\n              skyGradientRadius(skyGradientRadius)\n              skyGradientCenter(listOf(skyGradientCenterA, skyGradientCenterP))\n            }\n            SkyType.ATMOSPHERE -> {\n              skyAtmosphereColor(SKY_ATMOSPHERE_COLOR)\n              skyAtmosphereHaloColor(SKY_ATMOSPHERE_HALO_COLOR)\n              skyAtmosphereSun(listOf(skyAtmosphereCenterA, skyAtmosphereCenterP))\n              skyAtmosphereSunIntensity(skyAtmosphereSunIntensity)\n            }\n          }\n        }\n      }\n    ) {\n      binding.mapView.mapboxMap.setCamera(\n        cameraOptions {\n          zoom(16.0)\n          pitch(85.0)\n        }\n      )\n      binding.mapView.scalebar.enabled = false\n      skyLayer = it.getLayerAs(SKY_LAYER)\n    }\n  }\n\n  private fun applyControls() {\n    applyInitials()\n    binding.switchSkyMode.setOnCheckedChangeListener { _, isChecked ->\n      if (isChecked) {\n        skyType = SkyType.ATMOSPHERE\n        binding.textSkyMode.text = getString(R.string.sky_mode, skyType.value)\n        binding.layoutGradient.visibility = View.GONE\n        binding.layoutAtmosphere.visibility = View.VISIBLE\n      } else {\n        skyType = SkyType.GRADIENT\n        binding.textSkyMode.text = getString(R.string.sky_mode, skyType.value)\n        binding.layoutGradient.visibility = View.VISIBLE\n        binding.layoutAtmosphere.visibility = View.GONE\n      }\n      applySkyProperties()\n    }\n    applySkyGradientControls()\n    applySkyAtmosphereControls()\n  }\n\n  private fun applyInitials() {\n    binding.textSkyMode.text = getString(R.string.sky_mode, skyType.value)\n    binding.captionAtmosphereCenterA.text = getString(R.string.sky_center_azimuth, skyAtmosphereCenterA.toInt())\n    binding.captionAtmosphereCenterP.text = getString(R.string.sky_center_polar, skyAtmosphereCenterP.toInt())\n    binding.captionGradientCenterA.text = getString(R.string.sky_center_azimuth, skyGradientCenterA.toInt())\n    binding.captionGradientCenterP.text = getString(R.string.sky_center_polar, skyGradientCenterP.toInt())\n    binding.captionAtmosphereSunIntensity.text = getString(R.string.sky_sun_intensity, skyAtmosphereSunIntensity.toInt())\n    binding.captionGradientRadius.text = getString(R.string.sky_gradient_radius, skyGradientRadius.toInt())\n  }\n\n  private fun applySkyGradientControls() {\n    binding.seekBarGradientRadius.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        skyGradientRadius = progress.toDouble()\n        binding.captionGradientRadius.text = getString(R.string.sky_gradient_radius, skyGradientRadius.toInt())\n        applySkyProperties()\n      }\n\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n    binding.seekBarGradientCenterA.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        // convert [0, 360] range to [-180, 180]\n        skyGradientCenterA = progress.toDouble() - 180.0\n        binding.captionGradientCenterA.text = getString(R.string.sky_center_azimuth, skyGradientCenterA.toInt())\n        applySkyProperties()\n      }\n\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n    binding.seekBarGradientCenterP.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        skyGradientCenterP = progress.toDouble()\n        binding.captionGradientCenterP.text = getString(R.string.sky_center_polar, skyGradientCenterP.toInt())\n        applySkyProperties()\n      }\n\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n  }\n\n  private fun applySkyAtmosphereControls() {\n    binding.seekBarAtmosphereSunIntensity.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        skyAtmosphereSunIntensity = progress.toDouble()\n        binding.captionAtmosphereSunIntensity.text = getString(R.string.sky_sun_intensity, skyAtmosphereSunIntensity.toInt())\n        applySkyProperties()\n      }\n\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n    binding.seekBarAtmosphereCenterA.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        // convert [0, 360] range to [-180, 180]\n        skyAtmosphereCenterA = progress.toDouble() - 180.0\n        binding.captionAtmosphereCenterA.text = getString(R.string.sky_center_azimuth, skyAtmosphereCenterA.toInt())\n        applySkyProperties()\n      }\n\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n    binding.seekBarAtmosphereCenterP.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {\n      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n        skyAtmosphereCenterP = progress.toDouble()\n        binding.captionAtmosphereCenterP.text = getString(R.string.sky_center_polar, skyAtmosphereCenterP.toInt())\n        applySkyProperties()\n      }\n\n      override fun onStartTrackingTouch(seekBar: SeekBar?) {}\n\n      override fun onStopTrackingTouch(seekBar: SeekBar?) {}\n    })\n  }\n\n  private fun applySkyProperties() {\n    skyLayer?.skyType(skyType)\n    when (skyType) {\n      SkyType.GRADIENT -> applySkyGradientProperties()\n      SkyType.ATMOSPHERE -> applySkyAtmosphereProperties()\n    }\n  }\n\n  private fun applySkyGradientProperties() {\n    skyLayer?.skyGradientRadius(skyGradientRadius)\n    skyLayer?.skyGradientCenter(listOf(skyGradientCenterA, skyGradientCenterP))\n  }\n\n  private fun applySkyAtmosphereProperties() {\n    skyLayer?.skyAtmosphereSunIntensity(skyAtmosphereSunIntensity)\n    skyLayer?.skyAtmosphereSun(listOf(skyAtmosphereCenterA, skyAtmosphereCenterP))\n  }\n\n  companion object {\n    private const val SKY_LAYER = \"sky\"\n\n    private const val SKY_GRADIENT_COLOR_START = \"yellow\"\n    private const val SKY_GRADIENT_COLOR_END = \"pink\"\n\n    private const val SKY_ATMOSPHERE_COLOR = \"blue\"\n    private const val SKY_ATMOSPHERE_HALO_COLOR = \"pink\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/sky/SkyLayerSnapshotterActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.sky\n\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.skyLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.SkyType\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.compass.compass\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport com.mapbox.maps.testapp.databinding.ActivitySkySnapshotterBinding\n\n/**\n * Prototype for Junction view showing upcoming maneuver.\n */\nclass SkyLayerSnapshotterActivity : AppCompatActivity() {\n\n  private var snapshotter: Snapshotter? = null\n  private lateinit var binding: ActivitySkySnapshotterBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivitySkySnapshotterBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    binding.mapView.scalebar.enabled = false\n    binding.mapView.compass.enabled = false\n    binding.mapView.mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(24.827187523937795, 60.55932732152849))\n        .zoom(16.0)\n        .pitch(85.0)\n        .bearing(330.1)\n        .build()\n    )\n    binding.mapView.mapboxMap.loadStyle(\n      styleExtension = style(Style.STANDARD) {\n        +skyLayer(\"sky\") {\n          skyType(SkyType.GRADIENT)\n          skyGradient(\n            interpolate {\n              linear()\n              skyRadialProgress()\n              literal(0.0)\n              literal(\"yellow\")\n              literal(1.0)\n              literal(\"pink\")\n            }\n          )\n          skyGradientCenter(listOf(-34.0, 90.0))\n          skyGradientRadius(8.0)\n        }\n      }\n    ) { prepareSnapshotter() }\n  }\n\n  private fun prepareSnapshotter() {\n    val snapshotMapOptions = MapSnapshotOptions.Builder()\n      .size(Size(512.0f, 512.0f))\n      .build()\n\n    snapshotter = Snapshotter(this, snapshotMapOptions).apply {\n      setStyleListener(object : SnapshotStyleListener {\n        override fun onDidFinishLoadingStyle(style: Style) {\n          style.addLayer(\n            skyLayer(\"sky_snapshotter\") {\n              skyType(SkyType.ATMOSPHERE)\n              skyAtmosphereSun(listOf(0.0, 90.0))\n            }\n          )\n        }\n      })\n      setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(24.81958807097479, 60.56524768721757))\n          .zoom(16.0)\n          .pitch(85.0)\n          .bearing(330.1)\n          .build()\n      )\n      setStyleUri(Style.STANDARD)\n      start { bitmap, error ->\n        if (bitmap != null) {\n          binding.maneuverView.setImageBitmap(bitmap)\n          binding.maneuverCaption.visibility = View.VISIBLE\n        } else {\n          Toast.makeText(\n            this@SkyLayerSnapshotterActivity,\n            \"Snapshotter error: $error\",\n            Toast.LENGTH_SHORT\n          ).show()\n        }\n      }\n    }\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    snapshotter?.cancel()\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/snapshotter/DataDrivenMapSnapshotterActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.snapshotter\n\nimport android.os.Bundle\nimport android.widget.ImageView\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.Snapshotter\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.heatmapDensity\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.zoom\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.get\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.interpolate\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.linear\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.rgb\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.rgba\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.HeatmapLayer\n\n/**\n * Example that showcases using Snapshotter with data driven styling.\n *\n * In this example we highlight both the usage of the low as high level API of Style\n *\n */\nclass DataDrivenMapSnapshotterActivity : AppCompatActivity() {\n  private lateinit var snapshotter: Snapshotter\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val snapshotMapOptions = MapSnapshotOptions.Builder()\n      .size(Size(512.0f, 512.0f))\n      .build()\n\n    snapshotter = Snapshotter(this, snapshotMapOptions).apply {\n      setStyleListener(object : SnapshotStyleListener {\n        override fun onDidFinishLoadingStyle(style: Style) {\n          Toast.makeText(\n            this@DataDrivenMapSnapshotterActivity,\n            \"Map load style success!\",\n            Toast.LENGTH_LONG\n          ).show()\n\n          // GeoJSON earthquake source using low level style API\n          val properties = HashMap<String, Value>()\n          properties[\"type\"] = Value.valueOf(\"geojson\")\n          properties[\"data\"] = Value.valueOf(EARTHQUAKE_SOURCE_URL)\n          val sourceResult = style.addStyleSource(EARTHQUAKE_SOURCE_ID, Value.valueOf(properties))\n          if (sourceResult.isError) {\n            throw RuntimeException(sourceResult.error)\n          }\n\n          // Heatmap layer using high level style PI\n          style.addLayer(getHeatmapLayer())\n        }\n      })\n      setCamera(\n        CameraOptions.Builder()\n          .center(Point.fromLngLat(-94.0, 15.0))\n          .zoom(5.0)\n          .padding(EdgeInsets(1.0, 1.0, 1.0, 1.0))\n          .build()\n      )\n      setStyleUri(Style.OUTDOORS)\n    }\n    // ignore error in this example\n    snapshotter.start { bitmap, _ ->\n      val imageView = ImageView(this@DataDrivenMapSnapshotterActivity)\n      imageView.setImageBitmap(bitmap)\n      setContentView(imageView)\n    }\n  }\n\n  private fun getHeatmapLayer(): HeatmapLayer {\n    val layer = HeatmapLayer(LAYER_ID, EARTHQUAKE_SOURCE_ID)\n    layer.maxZoom(9.0)\n    layer.sourceLayer(HEATMAP_LAYER_SOURCE)\n    layer.heatmapColor(\n      // Color ramp for heatmap.  Domain is 0 (low) to 1 (high).\n      // Begin color ramp at 0-stop with a 0-transparency color\n      // to create a blur-like effect.\n      interpolate(\n        linear(), heatmapDensity(),\n        literal(0), rgba(33.0, 102.0, 172.0, 0.0),\n        literal(0.2), rgb(103.0, 169.0, 207.0),\n        literal(0.4), rgb(209.0, 229.0, 240.0),\n        literal(0.6), rgb(253.0, 219.0, 199.0),\n        literal(0.8), rgb(239.0, 138.0, 98.0),\n        literal(1), rgb(178.0, 24.0, 43.0)\n      )\n    )\n    // Increase the heatmap weight based on frequency and property magnitude\n    layer.heatmapWeight(\n      interpolate(\n        linear(), get(\"mag\"),\n        literal(0), literal(0),\n        literal(6), literal(1)\n      )\n    )\n\n    // Increase the heatmap color weight weight by zoom level\n    // heatmap-intensity is a multiplier on top of heatmap-weight\n    layer.heatmapIntensity(\n      interpolate(\n        linear(), zoom(),\n        literal(0), literal(1),\n        literal(9), literal(3)\n      )\n    )\n\n    // Adjust the heatmap radius by zoom level\n    layer.heatmapRadius(\n      interpolate(\n        linear(), zoom(),\n        literal(0), literal(2),\n        literal(9), literal(20)\n      )\n    )\n\n    // Transition from heatmap to circle layer by zoom level\n    layer.heatmapOpacity(\n      interpolate(\n        linear(), zoom(),\n        literal(7), literal(1),\n        literal(9), literal(0)\n      )\n    )\n    return layer\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    snapshotter.destroy()\n  }\n\n  companion object {\n    const val TAG: String = \"DataDrivenMapSnapshotterActivity\"\n    private const val EARTHQUAKE_SOURCE_URL =\n      \"https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson\"\n    private const val EARTHQUAKE_SOURCE_ID = \"earthquakes\"\n    private const val LAYER_ID = \"earthquakes-heat\"\n    private const val HEATMAP_LAYER_SOURCE = \"earthquakes\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/snapshotter/LocalStyleMapSnapshotterActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.snapshotter\n\nimport android.os.Bundle\nimport android.widget.ImageView\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\n\n/**\n * Activity to validate creating a snapshot from a configuration not using style URI or JSON\n */\nclass LocalStyleMapSnapshotterActivity : AppCompatActivity() {\n  private lateinit var mapSnapshotter: Snapshotter\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val snapshotterOptions = MapSnapshotOptions.Builder()\n      .size(Size(512.0f, 512.0f))\n      .pixelRatio(1.0f)\n      .build()\n\n    mapSnapshotter = Snapshotter(this, snapshotterOptions)\n    mapSnapshotter.setCamera(\n      CameraOptions.Builder().zoom(14.0).center(\n        Point.fromLngLat(\n          4.895033, 52.374724\n        )\n      ).build()\n    )\n    mapSnapshotter.setStyleJson(\n      \"\"\"\n        {\n          \"version\": 8,\n          \"metadata\": {\n            \"test\": {\n              \"width\": 64,\n              \"height\": 64\n            }\n          },\n          \"sources\": {},\n          \"layers\": [\n            {\n              \"id\": \"background\",\n              \"type\": \"background\",\n              \"paint\": {\n                \"background-color\": \"red\"\n              }\n            }\n          ]\n        }\n      \"\"\".trimIndent()\n    )\n    // ignore error in this example\n    mapSnapshotter.start { bitmap, _ ->\n      val imageView = ImageView(this)\n      imageView.setImageBitmap(bitmap)\n      setContentView(imageView)\n    }\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    mapSnapshotter.destroy()\n  }\n\n  companion object {\n    const val TAG: String = \"LocalStyleMapSnapshotterActivity\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/snapshotter/MapSnapshotterActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.snapshotter\n\nimport android.graphics.Paint\nimport android.graphics.RectF\nimport android.os.Bundle\nimport android.widget.ImageView\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.Snapshotter\n\n/**\n * Example demonstrating taking simple snapshot using [Snapshotter].\n */\nclass MapSnapshotterActivity : AppCompatActivity(), SnapshotStyleListener {\n\n  private lateinit var mapSnapshotter: Snapshotter\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val snapshotterOptions = MapSnapshotOptions.Builder()\n      .size(Size(512.0f, 512.0f))\n      .pixelRatio(1.0f)\n      .build()\n\n    mapSnapshotter = Snapshotter(this, snapshotterOptions,).apply {\n      setStyleListener(this@MapSnapshotterActivity)\n      setStyleUri(Style.STANDARD)\n      setCamera(\n        CameraOptions.Builder().zoom(14.0).center(\n          Point.fromLngLat(\n            4.895033, 52.374724\n          )\n        ).build()\n      )\n      start(\n        overlayCallback = { overlay ->\n          overlay.canvas.drawOval(\n            RectF(0f, 0f, 100f, 100f),\n            Paint().apply { alpha = 128 }\n          )\n        }\n      ) { bitmap, errorMessage ->\n        if (errorMessage != null) {\n          Toast.makeText(\n            this@MapSnapshotterActivity,\n            errorMessage,\n            Toast.LENGTH_SHORT\n          ).show()\n        }\n        val imageView = ImageView(this@MapSnapshotterActivity)\n        imageView.setImageBitmap(bitmap)\n        setContentView(imageView)\n      }\n    }\n  }\n\n  override fun onDidFinishLoadingStyle(style: Style) {\n    logI(TAG, \"OnStyleLoaded: ${style.styleURI}\")\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    mapSnapshotter.destroy()\n  }\n\n  companion object {\n    const val TAG: String = \"MapSnapshotterActivity\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/snapshotter/MapViewSnapshotActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.snapshotter\n\nimport android.os.Bundle\nimport android.widget.ImageView\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Snapshotter\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.testapp.databinding.ActivityViewSnapshotBinding\n\n/**\n * Example demonstrating taking simple snapshot or screenshot not using [Snapshotter] appearing\n * in bottom-left corner as [ImageView].\n */\nclass MapViewSnapshotActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityViewSnapshotBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(Style.STANDARD)\n\n    binding.fab.setOnClickListener {\n      binding.mapView.snapshot { bitmap ->\n        binding.imageView.post {\n          binding.imageView.setImageBitmap(bitmap)\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/style/ColorThemeActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.style\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.atmosphere.generated.atmosphere\nimport com.mapbox.maps.extension.style.atmosphere.generated.getAtmosphere\nimport com.mapbox.maps.extension.style.color.colorTheme\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils.showShortToast\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\n\n/**\n * Example showcasing the usage of Color Theme API.\n * To create custom LUT, you can follow [this](https://docs.mapbox.com/help/tutorials/create-a-custom-color-theme/) guide.\n */\n@OptIn(MapboxExperimental::class)\nclass ColorThemeActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private var atmosphereUseTheme = true\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    MapView(\n      this,\n      MapInitOptions(\n        this, cameraOptions = START_CAMERA_POSITION\n      )\n    ).also { mapView ->\n      mapboxMap = mapView.mapboxMap\n      setContentView(mapView)\n      mapboxMap.loadStyle(\n        style(Style.MAPBOX_STREETS) {\n          +colorTheme(base64 = BASE64_ENCODED_RED_THEME)\n          +atmosphere {\n            color(COLOR_GREEN)\n          }\n        }\n      )\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_color_theme, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    when (item.itemId) {\n      R.id.menu_action_color_theme_image -> {\n        mapboxMap.setStyleColorTheme(bitmap = bitmapFromDrawableRes(R.drawable.monochrome_lut))\n      }\n\n      R.id.menu_action_color_theme_base64 -> {\n        mapboxMap.setStyleColorTheme(base64 = BASE64_ENCODED_RED_THEME)\n      }\n\n      R.id.menu_action_color_theme_toggle_atmosphere -> {\n        atmosphereUseTheme = !atmosphereUseTheme\n        showShortToast(\"Color theme will ${\"not \".takeUnless { atmosphereUseTheme } ?: \"\"}affect atmosphere.\")\n        mapboxMap.getStyle {\n          it.getAtmosphere().colorUseTheme(\n            if (atmosphereUseTheme) COLOR_USE_THEME_DEFAULT else COLOR_USE_THEME_NONE\n          )\n        }\n      }\n\n      R.id.menu_action_color_theme_reset -> {\n        mapboxMap.setStyleColorTheme(colorTheme = null)\n        atmosphereUseTheme = true\n        mapboxMap.getStyle {\n          it.getAtmosphere().colorUseTheme(COLOR_USE_THEME_DEFAULT)\n        }\n      }\n\n      else -> return super.onOptionsItemSelected(item)\n    }\n    return true\n  }\n\n  companion object {\n    /**\n     * Base64 encoded version of a custom LUT (Look-Up Table) image.\n     * LUT image can be created by following [this](https://docs.mapbox.com/help/tutorials/create-a-custom-color-theme/) guide.\n     *\n     * To convert your LUT image to a Base64 string, you can use an online tool or a script.\n     * For example, you can use the following command in a terminal:\n     *\n     * ```sh\n     * base64 -i path/to/your/lut-image.png -o output.txt\n     * ```\n     */\n    private const val BASE64_ENCODED_RED_THEME =\n      \"iVBORw0KGgoAAAANSUhEUgAABAAAAAAgCAYAAACM/gqmAAAAAXNSR0IArs4c6QAABSFJREFUeF7t3cFO40AQAFHnBv//wSAEEgmJPeUDsid5h9VqtcMiZsfdPdXVzmVZlo+3ZVm+fr3//L7257Lm778x+prL1ff0/b//H+z/4/M4OkuP/n70Nc7f+nnb+yzb//sY6vxt5xXPn+dP/aH+GsXJekb25izxR/ypZ6ucUefv9g4z2jPP3/HPHwAAgABAABgACIACkAAsAL1SD4yKWQAUAHUBdAG8buKNYoYL8PEX4FcHQAAAAAAAAAAAAAAAAAAAAAAA8LAeGF1mABAABAABQACQbZP7+hk5AwACAAAAAAAAAAAAAAAAAAAAAAAA4EE9AICMx4QBAAAAAAAANgvJsxGQV1dA/PxmMEtxU9YoABQACoC5CgDxX/wvsb2sEf/Ff/Ff/N96l5n73+/5YAB4CeBqx2VvMqXgUfD2npkzBCAXEBeQcrkoa5x/FxAXEBcQF5A2Wy3/t32qNYr8I//Mln+MABgBMAJgBMAIgBEAIwBGAIwAGAEwAmAE4K4eAGCNQIw+qQ0AmQ+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/6gEABAB5RgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/UAAPKcAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEFNODICRtDkDO/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOhvlPUWem+h9xKQ+V4CUt9wO6KZnn/Pv+ff8z/bW5DFP59CUnJbWSP+iX/iX78znqED/urxnwHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADoNMcHUAdQAQcAUfAe8xEwH0O86t3IPz8OvClu17WqD/UH+oP9cf1Gdia01d/LQsDgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABkCnSQwABgACj8Aj8D1mItAMAB1wHfDS3S5r5F/5V/6Vf3XAW12h/mIArHY89iZTAAQA2XtmBKAWqOslyf4rgBXACmAFcIur8k/bJ/mnQTr5V/6Vf+fKv0YAjAAYATACYATACIARACMARgCMABgBMAJgBMAIgBEAIwCdZuiA64AjwAgwAtxjpg6cDlztLlLA7/Pr1gueyr56/jx/5ZzUNeof9Y/6R/0zk4HGAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaQ4DgAGAgCPgCHiPmTqQOpC1u8gAYACMjAf5V/6Vf+XfmTrQ8l97v8Z/5X8GAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADIBO0xgADAAdCB0IHYgeMxkADAAdkGM7IPbf/pfuWlmj/lH/qH/UPzMZGAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAJ3mMAAYAAg4Ao6A95jJAGAA6EDrQJfuclkj/8q/8q/8O1MHWv47Nv8xABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAB0msYAYADoQOhA6ED0mMkAYADogBzbAbH/9r/YFWWN+kf9o/5R/8xkYDAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgAHSawwBgACDgCDgC3mMmA4ABoAOtA126y2WN/Cv/yr/y70wdaPnv2PzHAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaRoDgAGgA6EDoQPRYyYDgAGgA3JsB8T+2/9iV5Q16h/1j/pH/TOTgcEAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAPgyQ2AT4NBIB3ew5dkAAAAAElFTkSuQmCC\"\n    private const val COLOR_USE_THEME_DEFAULT = \"default\"\n    private const val COLOR_USE_THEME_NONE = \"none\"\n    private const val COLOR_GREEN = \"#00ff00\"\n    private const val LATITUDE = 40.72\n    private const val LONGITUDE = -73.99\n    private val CENTER = Point.fromLngLat(LONGITUDE, LATITUDE)\n    private val START_CAMERA_POSITION = cameraOptions {\n      center(CENTER)\n      zoom(2.0)\n      pitch(45.0)\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/style/CustomRasterSourceActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.style\n\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CanonicalTileID\nimport com.mapbox.maps.CustomRasterSourceClient\nimport com.mapbox.maps.CustomRasterSourceTileData\nimport com.mapbox.maps.CustomRasterSourceTileStatus\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.layers.generated.rasterLayer\nimport com.mapbox.maps.extension.style.sources.CustomRasterSource\nimport com.mapbox.maps.extension.style.sources.customRasterSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.testapp.databinding.ActivityCustomRasterSourceBinding\nimport com.mapbox.maps.toMapboxImage\n\n/**\n * Example of using custom raster source.\n */\n@OptIn(MapboxExperimental::class)\nclass CustomRasterSourceActivity : AppCompatActivity() {\n\n  private lateinit var customRasterSource: CustomRasterSource\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityCustomRasterSourceBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    binding.mapView.gestures.apply {\n      // simplify the demo by not needing to handle camera changes\n      doubleTapToZoomInEnabled = false\n      doubleTouchToZoomOutEnabled = false\n      quickZoomEnabled = false\n      pinchToZoomEnabled = false\n      pitchEnabled = false\n      rotateEnabled = false\n      scrollEnabled = false\n    }\n    val requiredTiles = mutableListOf<CanonicalTileID>()\n    val client = CustomRasterSourceClient { tileId: CanonicalTileID, status: CustomRasterSourceTileStatus ->\n      logI(\n        TAG,\n        \"tileStatusChangedFunction called: status=${status.name}, tileId=[x=${tileId.x}, y=${tileId.y}, z=${tileId.z}]\"\n      )\n      if (status == CustomRasterSourceTileStatus.REQUIRED) {\n        requiredTiles.add(tileId)\n        refresh(requiredTiles)\n      } else {\n        if (requiredTiles.contains(tileId)) {\n          requiredTiles.remove(tileId)\n          customRasterSource.setTileData(listOf(CustomRasterSourceTileData(tileId, null)))\n        }\n      }\n    }\n    customRasterSource = customRasterSource(CUSTOM_RASTER_SOURCE_ID) {\n      tileSize(TILE_SIZE.toShort())\n      clientCallback(client)\n    }\n    binding.mapView.mapboxMap.apply {\n      setCamera(INITIAL_CAMERA)\n      loadStyle(\n        style(Style.STANDARD) {\n          +customRasterSource\n          +rasterLayer(RASTER_LAYER_ID, CUSTOM_RASTER_SOURCE_ID) { }\n        }\n      ) {\n        refresh(requiredTiles)\n        binding.refreshBtn.setOnClickListener {\n          refresh(requiredTiles)\n        }\n      }\n    }\n  }\n\n  private fun refresh(requiredTiles: List<CanonicalTileID>) {\n    val tiles = RasterTileProvider.createTiles(\n      requiredTiles,\n      nextColor,\n      TILE_SIZE,\n      TILE_SIZE\n    )\n    customRasterSource.setTileData(tiles)\n  }\n\n  companion object {\n    private const val TAG = \"CRSActivity\"\n    private val INITIAL_CAMERA = cameraOptions {\n      center(Point.fromLngLat(24.945389069265598, 60.17195694011002))\n      zoom(5.0)\n    }\n    private const val CUSTOM_RASTER_SOURCE_ID = \"custom-raster-source-id\"\n    private const val RASTER_LAYER_ID = \"raster-layer-id\"\n    private const val TILE_SIZE = 256\n    private val colors = intArrayOf(\n      Color.CYAN,\n      Color.RED,\n      Color.GREEN,\n      Color.BLUE,\n      Color.YELLOW,\n    )\n    private var colorIndex = 0\n    private val nextColor: Int\n      get() {\n        colorIndex = (colorIndex + 1) % colors.size\n        return colors[colorIndex]\n      }\n  }\n}\n\n/**\n * Utility to provide raster tiles.\n */\nobject RasterTileProvider {\n  @OptIn(MapboxDelicateApi::class)\n  fun createTiles(\n    requiredTiles: List<CanonicalTileID>,\n    color: Int,\n    width: Int,\n    height: Int,\n  ): List<CustomRasterSourceTileData> {\n    val image = createBitmap(color, width, height).toMapboxImage()\n    return requiredTiles.map {\n      CustomRasterSourceTileData(it, image)\n    }\n  }\n\n  private fun createBitmap(\n    color: Int,\n    width: Int,\n    height: Int,\n  ): Bitmap {\n    val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)\n    val canvas = Canvas(bitmap)\n    canvas.drawColor(color)\n    return bitmap\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/style/PrecipitationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.precipitations.generated.rain\nimport com.mapbox.maps.extension.style.precipitations.generated.removeRain\nimport com.mapbox.maps.extension.style.precipitations.generated.removeSnow\nimport com.mapbox.maps.extension.style.precipitations.generated.setRain\nimport com.mapbox.maps.extension.style.precipitations.generated.setSnow\nimport com.mapbox.maps.extension.style.precipitations.generated.snow\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.databinding.ActivityPrecipitationsBinding\n\n/**\n * Showcase snow and rain effect.\n */\n@OptIn(MapboxExperimental::class)\nclass PrecipitationActivity : AppCompatActivity() {\n\n  private var isSnowing: Boolean = true\n  private var isRaining: Boolean = true\n  private val rain = rain {\n    intensity(0.6)\n    opacity(0.5)\n    vignette(0.5)\n  }\n  private val snow = snow {\n    intensity(0.6)\n    opacity(0.5)\n    vignette(0.5)\n  }\n  private lateinit var binding: ActivityPrecipitationsBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityPrecipitationsBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    val mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(24.943849, 60.171924))\n        .bearing(-17.6)\n        .pitch(45.0)\n        .zoom(16.0)\n        .build()\n    )\n\n    mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +snow\n        +rain\n      }\n    )\n\n    // change snow intensity on fab click\n    binding.toggleSnow.setOnClickListener {\n      isSnowing = !isSnowing\n      if (isSnowing) {\n        mapboxMap.setSnow(snow)\n      } else {\n        mapboxMap.removeSnow()\n      }\n    }\n\n    binding.toggleRain.setOnClickListener {\n      isRaining = !isRaining\n      if (isRaining) {\n        mapboxMap.setRain(rain)\n      } else {\n        mapboxMap.removeRain()\n      }\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/style/RasterColorizationActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.generated.backgroundLayer\nimport com.mapbox.maps.extension.style.layers.generated.rasterLayer\nimport com.mapbox.maps.extension.style.sources.generated.rasterSource\nimport com.mapbox.maps.extension.style.style\n\n/**\n * Example of raster colorization using raster-color property.\n */\nclass RasterColorizationActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapView.mapboxMap\n      .apply {\n        loadStyle(\n          styleExtension = style {\n            +rasterSource(RASTER_SOURCE_ID) {\n              url(\"mapbox://mapbox.terrain-rgb\")\n              tileSize(256)\n            }\n\n            +backgroundLayer(BACKGROUND_LAYER_ID) {\n              backgroundColor(Expression.rgb(4.0, 7.0, 14.0))\n            }\n            +rasterLayer(RASTER_LAYER_ID, RASTER_SOURCE_ID) {\n              rasterColor(\n                interpolate {\n                  linear()\n                  rasterValue()\n                  stop {\n                    literal(35.392)\n                    rgb(48.0, 167.0, 228.0)\n                  }\n                  stop {\n                    literal(44.24)\n                    rgb(57.0, 143.0, 83.0)\n                  }\n                  stop {\n                    literal(274.288)\n                    rgb(116.0, 166.0, 129.0)\n                  }\n                  stop {\n                    literal(486.64)\n                    rgb(178.0, 205.0, 174.0)\n                  }\n                  stop {\n                    literal(672.448)\n                    rgb(188.0, 195.0, 169.0)\n                  }\n                  stop {\n                    literal(955.584)\n                    rgb(221.0, 207.0, 153.0)\n                  }\n                  stop {\n                    literal(1353.744)\n                    rgb(211.0, 174.0, 114.0)\n                  }\n                  stop {\n                    literal(1813.84)\n                    rgb(207.0, 155.0, 103.0)\n                  }\n                  stop {\n                    literal(2450.896)\n                    rgb(179.0, 120.0, 85.0)\n                  }\n                  stop {\n                    literal(3318)\n                    rgb(227.0, 210.0, 197.0)\n                  }\n                  stop {\n                    literal(5839.68)\n                    rgb(255.0, 255.0, 255.0)\n                  }\n                }\n              )\n              rasterColorMix(\n                listOf(\n                  1667721.6,\n                  6553.6,\n                  25.6,\n                  -10000.0\n                )\n              )\n              rasterColorRange(listOf(0.0, 8848.0))\n            }\n          }\n        )\n      }\n  }\n\n  companion object {\n    private const val RASTER_SOURCE_ID = \"raster-source-id\"\n    private const val BACKGROUND_LAYER_ID = \"background-layer-id\"\n    private const val RASTER_LAYER_ID = \"raster-layer-id\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/style/RasterParticlesActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.layers.generated.rasterParticleLayer\nimport com.mapbox.maps.extension.style.sources.generated.rasterArraySource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.gestures.gestures\n\n/**\n * Activity showcasing the wind with [rasterParticleLayer].\n */\n@OptIn(MapboxExperimental::class)\nclass RasterParticlesActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(\n      this,\n      MapInitOptions(\n        this,\n        cameraOptions = cameraOptions {\n          zoom(1.0)\n        }\n      )\n    )\n    setContentView(mapView)\n    // disable zooming in as raster particles will be too pixelated\n    mapView.gestures.pinchToZoomEnabled = false\n    mapView.gestures.doubleTapToZoomInEnabled = false\n    mapView.gestures.doubleTouchToZoomOutEnabled = false\n    mapView.mapboxMap.loadStyle(\n      styleExtension = style(Style.STANDARD) {\n        +rasterArraySource(RASTER_ARRAY_SOURCE_ID) {\n          url(RASTER_ARRAY_TILE_JSON_URL)\n          tileSize(512)\n        }\n        +rasterParticleLayer(RASTER_LAYER_ID, RASTER_ARRAY_SOURCE_ID) {\n          sourceLayer(\"10winds\")\n          rasterParticleSpeedFactor(0.4)\n          rasterParticleMaxSpeed(70.0)\n          rasterParticleCount(2048L)\n          rasterParticleFadeOpacityFactor(0.8)\n          rasterParticleResetRateFactor(0.4)\n          rasterParticleColor(\n            interpolate {\n              linear()\n              rasterParticleSpeed()\n              stop {\n                literal(1.5)\n                rgba(134.0, 163.0, 171.0, 1.0)\n              }\n              stop {\n                literal(2.5)\n                rgba(126.0, 152.0, 188.0, 1.0)\n              }\n              stop {\n                literal(4.12)\n                rgba(110.0, 143.0, 208.0, 1.0)\n              }\n              stop {\n                literal(4.63)\n                rgba(110.0, 143.0, 208.0, 1.0)\n              }\n              stop {\n                literal(6.17)\n                rgba(15.0, 147.0, 167.0, 1.0)\n              }\n              stop {\n                literal(7.72)\n                rgba(15.0, 147.0, 167.0, 1.0)\n              }\n              stop {\n                literal(9.26)\n                rgba(57.0, 163.0, 57.0, 1.0)\n              }\n              stop {\n                literal(10.29)\n                rgba(57.0, 163.0, 57.0, 1.0)\n              }\n              stop {\n                literal(11.83)\n                rgba(194.0, 134.0, 62.0, 1.0)\n              }\n              stop {\n                literal(13.37)\n                rgba(194.0, 134.0, 63.0, 1.0)\n              }\n              stop {\n                literal(14.92)\n                rgba(200.0, 66.0, 13.0, 1.0)\n              }\n              stop {\n                literal(16.46)\n                rgba(200.0, 66.0, 13.0, 1.0)\n              }\n              stop {\n                literal(18.00)\n                rgba(210.0, 0.0, 50.0, 1.0)\n              }\n              stop {\n                literal(20.06)\n                rgba(215.0, 0.0, 50.0, 1.0)\n              }\n              stop {\n                literal(21.60)\n                rgba(175.0, 80.0, 136.0, 1.0)\n              }\n              stop {\n                literal(23.66)\n                rgba(175.0, 80.0, 136.0, 1.0)\n              }\n              stop {\n                literal(25.21)\n                rgba(117.0, 74.0, 147.0, 1.0)\n              }\n              stop {\n                literal(27.78)\n                rgba(117.0, 74.0, 147.0, 1.0)\n              }\n              stop {\n                literal(29.32)\n                rgba(68.0, 105.0, 141.0, 1.0)\n              }\n              stop {\n                literal(31.89)\n                rgba(68.0, 105.0, 141.0, 1.0)\n              }\n              stop {\n                literal(33.44)\n                rgba(194.0, 251.0, 119.0, 1.0)\n              }\n              stop {\n                literal(42.18)\n                rgba(194.0, 251.0, 119.0, 1.0)\n              }\n              stop {\n                literal(43.72)\n                rgba(241.0, 255.0, 109.0, 1.0)\n              }\n              stop {\n                literal(48.87)\n                rgba(241.0, 255.0, 109.0, 1.0)\n              }\n              stop {\n                literal(50.41)\n                rgba(255.0, 255.0, 255.0, 1.0)\n              }\n              stop {\n                literal(57.61)\n                rgba(255.0, 255.0, 255.0, 1.0)\n              }\n              stop {\n                literal(59.16)\n                rgba(0.0, 255.0, 255.0, 1.0)\n              }\n              stop {\n                literal(68.93)\n                rgba(0.0, 255.0, 255.0, 1.0)\n              }\n              stop {\n                literal(69.44)\n                rgba(255.0, 37.0, 255.0, 1.0)\n              }\n            }\n          )\n        }\n      }\n    ) {\n      mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n      mapView.mapboxMap.setStyleImportConfigProperty(\"basemap\", \"lightPreset\", Value.valueOf(\"night\"))\n    }\n  }\n\n  private companion object {\n    private const val RASTER_ARRAY_SOURCE_ID = \"wind-mrt-source\"\n    private const val RASTER_ARRAY_TILE_JSON_URL = \"mapbox://rasterarrayexamples.gfs-winds\"\n    private const val RASTER_LAYER_ID = \"layer_particles\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/style/ThirdPartyVectorSourceActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.vectorSource\n\n/**\n * Activity renders vector tiles using a third party vector tile source.\n *\n * In this case, Mapillary provides the vector tiles, which are added to the map using addSource.\n */\nclass ThirdPartyVectorSourceActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapboxMap = mapView.mapboxMap\n\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .zoom(12.0)\n        .center(Point.fromLngLat(-87.622088, 41.878781))\n        .build()\n    )\n\n    mapboxMap.loadStyle(Style.STANDARD) {\n      it.addSource(\n        vectorSource(SOURCE_ID) {\n          tiles(listOf(\"https://tiles.mapillary.com/maps/vtp/mly1_public/2/{z}/{x}/{y}?access_token=MLY|4142433049200173|72206abe5035850d6743b23a49c41333\"))\n          minzoom(6)\n          maxzoom(14)\n        }\n      )\n\n      it.addLayer(\n        lineLayer(LAYER_ID, SOURCE_ID) {\n          sourceLayer(SOURCE_LAYER_ID)\n          lineCap(LineCap.ROUND)\n          lineJoin(LineJoin.ROUND)\n          lineOpacity(0.6)\n          lineColor(Expression.rgb(53.0, 175.0, 109.0))\n          lineWidth(2.0)\n          slot(\"middle\")\n        }\n      )\n      mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n    }\n  }\n\n  private companion object {\n    const val SOURCE_ID = \"mapillary\"\n    const val LAYER_ID = SOURCE_ID\n    const val TAG = SOURCE_ID\n    const val SOURCE_LAYER_ID = \"sequence\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/style/TileJsonActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.style\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport com.mapbox.common.ValueConverter\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.rasterLayer\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.RasterSource\nimport com.mapbox.maps.extension.style.sources.generated.Scheme\nimport com.mapbox.maps.extension.style.sources.generated.rasterSource\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.testapp.R\n\n/**\n * Activity showcases usage of TileSet to load a TileJSON compatible configuration as a source.\n *\n * This example uses OSM tiles as a raster source and visualises them using a raster layer.\n */\nclass TileJsonActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContentView(R.layout.activity_custom_layer)\n    val mapView: MapView = findViewById(R.id.mapView)\n\n    val tileSet = TileSet.Builder(TILE_JSON_VERSION, listOf(OSM_RASTER_TILE_URL))\n      .name(TILE_JSON_NAME)\n      .description(TILE_JSON_DESCRIPTION)\n      .attribution(TILE_JSON_ATTRIBUTION)\n      .scheme(Scheme.XYZ)\n      .minZoom(TILE_JSON_MIN_ZOOM)\n      .maxZoom(TILE_JSON_MAX_ZOOM)\n      .bounds(MERCATOR_BOUNDS)\n      .center(CENTER_MAP_LOCATION)\n      .build()\n\n    mapboxMap = mapView.mapboxMap\n    mapboxMap.loadStyle(\"{}\") {\n      it.addSource(\n        rasterSource(SOURCE_ID) {\n          tileSet(tileSet)\n          tileSize(RASTER_TILE_SIZE_PIXELS)\n        }\n      )\n      it.addLayer(rasterLayer(LAYER_ID, SOURCE_ID) {})\n    }\n\n    // Click on button to print out tile set information\n    findViewById<FloatingActionButton>(R.id.fab).setOnClickListener {\n      if (::mapboxMap.isInitialized) {\n        mapboxMap.getStyle {\n          val properties = it.getStyleSourceProperties(SOURCE_ID).value!!\n          val propertiesJson = ValueConverter.toJson(properties)\n          logI(TAG, propertiesJson)\n          Toast.makeText(this, propertiesJson, Toast.LENGTH_LONG).show()\n        }\n      }\n    }\n  }\n\n  override fun onCreateOptionsMenu(menu: Menu): Boolean {\n    menuInflater.inflate(R.menu.menu_tilejson, menu)\n    return true\n  }\n\n  override fun onOptionsItemSelected(item: MenuItem): Boolean {\n    return when (item.itemId) {\n      R.id.menu_set_tile_request_delay -> {\n        item.isChecked = !item.isChecked\n        setTileDelay(TILE_REQUEST, item.isChecked)\n        true\n      }\n      R.id.menu_set_tile_network_request_delay -> {\n        item.isChecked = !item.isChecked\n        setTileDelay(NETWORK_REQUEST, item.isChecked)\n        true\n      }\n      else -> {\n        super.onOptionsItemSelected(item)\n      }\n    }\n  }\n\n  private fun setTileDelay(requestType: String, isChecked: Boolean = false) {\n    mapboxMap.getStyle {\n      it.getSourceAs<RasterSource>(SOURCE_ID)?.apply {\n        if (requestType == TILE_REQUEST) {\n          tileRequestsDelay(if (isChecked) RASTER_TILE_DELAY else DEFAULT_RASTER_TILE_DELAY)\n        }\n        if (requestType == NETWORK_REQUEST) {\n          tileNetworkRequestsDelay(if (isChecked) RASTER_TILE_DELAY else DEFAULT_RASTER_TILE_DELAY)\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val SOURCE_ID = \"osm\"\n    const val LAYER_ID = SOURCE_ID\n    const val TAG = SOURCE_ID\n\n    const val TILE_JSON_VERSION = \"2.0.0\"\n    const val TILE_JSON_NAME = \"OpenStreetMap\"\n    const val TILE_JSON_DESCRIPTION = \"A free editable map of the whole world.\"\n    const val TILE_JSON_ATTRIBUTION = \"&copy; OpenStreetMap contributors, CC-BY-SA\"\n    const val TILE_JSON_MIN_ZOOM = 0\n    const val TILE_JSON_MAX_ZOOM = 18\n\n    const val RASTER_TILE_DELAY = 2000.0\n    const val DEFAULT_RASTER_TILE_DELAY = 0.0\n    const val TILE_REQUEST = \"tile\"\n    const val NETWORK_REQUEST = \"network\"\n    const val OSM_RASTER_TILE_URL = \"http://tile.openstreetmap.org/{z}/{x}/{y}.png\"\n    const val RASTER_TILE_SIZE_PIXELS = 256L\n\n    val MERCATOR_BOUNDS = listOf(-180.0, -85.0, 180.0, 85.0)\n    val CENTER_MAP_LOCATION = listOf(11.9, 57.7, 8.0)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/terrain3D/FillExtrusionActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.terrain3D\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.all\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.eq\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.get\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.gt\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.lte\nimport com.mapbox.maps.extension.style.layers.generated.fillExtrusionLayer\nimport com.mapbox.maps.extension.style.light.generated.ambientLight\nimport com.mapbox.maps.extension.style.light.generated.directionalLight\nimport com.mapbox.maps.extension.style.light.setLight\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.testapp.databinding.ActivityFillExtrusionBinding\n\n/**\n * Extrude the building layer in the Mapbox Light style using FillExtrusionLayer\n * and set up the light position.\n */\nclass FillExtrusionActivity : AppCompatActivity() {\n\n  private var isRedColor: Boolean = false\n  private lateinit var binding: ActivityFillExtrusionBinding\n\n  @OptIn(MapboxExperimental::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityFillExtrusionBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    val mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(-74.0066, 40.7135))\n        .pitch(45.0)\n        .zoom(15.5)\n        .bearing(-17.6)\n        .build()\n    )\n\n    // buildings lower than 20 meters will be rendered in wall-only mode\n    val wallOnlyThreshold = 20.0\n    val extrudeFilter = eq(get(\"extrude\"), literal(\"true\"))\n\n    mapboxMap.loadStyle(\n      style(style = Style.STANDARD) {\n        +fillExtrusionLayer(\"3d-buildings\", \"composite\") {\n          sourceLayer(\"building\")\n          filter(\n            all(\n              extrudeFilter,\n              gt(get(\"height\"), literal(wallOnlyThreshold))\n            )\n          )\n          minZoom(15.0)\n          fillExtrusionColor(Color.parseColor(\"#aaaaaa\"))\n          fillExtrusionHeight(get(\"height\"))\n          fillExtrusionBase(get(\"min_height\"))\n          fillExtrusionOpacity(0.6)\n          fillExtrusionAmbientOcclusionIntensity(0.3)\n          fillExtrusionAmbientOcclusionRadius(3.0)\n          fillExtrusionEdgeRadius(0.6)\n        }\n\n        +fillExtrusionLayer(\"3d-buildings-wall\", \"composite\") {\n          sourceLayer(\"building\")\n          filter(\n            all(\n              extrudeFilter,\n              lte(get(\"height\"), literal(wallOnlyThreshold))\n            )\n          )\n          fillExtrusionLineWidth(2.0)\n          minZoom(15.0)\n          fillExtrusionColor(Color.parseColor(\"#aaaaaa\"))\n          fillExtrusionHeight(get(\"height\"))\n          fillExtrusionBase(get(\"min_height\"))\n          fillExtrusionOpacity(0.6)\n        }\n      }\n    ) {\n      mapboxMap.setStyleImportConfigProperty(\"basemap\", \"theme\", Value.valueOf(\"monochrome\"))\n      setupLights3D(it)\n    }\n  }\n\n  private fun setupLights3D(style: Style) {\n    // setup 3d light\n    val ambientLight = ambientLight {\n      color(Color.BLUE)\n      intensity(0.9)\n    }\n    val directionalLight = directionalLight {\n      color(Color.YELLOW)\n      intensity(0.9)\n      castShadows(true)\n      direction(listOf(0.0, 15.0))\n    }\n    style.setLight(ambientLight, directionalLight)\n    // change color on fab click\n    binding.fabLightColor.setOnClickListener {\n      isRedColor = !isRedColor\n      if (isRedColor) {\n        ambientLight.color(Color.RED)\n      } else {\n        ambientLight.color(Color.BLUE)\n      }\n    }\n\n    binding.fabLightPosition.setOnClickListener {\n      directionalLight.direction(listOf(0.0, (directionalLight.direction!![1] + 5.0) % 90.0))\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/terrain3D/Lights3DActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.terrain3D\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.light.generated.ambientLight\nimport com.mapbox.maps.extension.style.light.generated.directionalLight\nimport com.mapbox.maps.extension.style.light.setLight\nimport com.mapbox.maps.testapp.databinding.ActivityFillExtrusionBinding\n\n/**\n * Extrude the building layer in the Mapbox Standard style\n * and set up the light position.\n */\nclass Lights3DActivity : AppCompatActivity() {\n\n  private var isRedColor: Boolean = false\n  private lateinit var binding: ActivityFillExtrusionBinding\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityFillExtrusionBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    val mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(24.943849, 60.171924))\n        .bearing(-17.6)\n        .pitch(45.0)\n        .zoom(16.0)\n        .build()\n    )\n\n    mapboxMap.loadStyle(\n      Style.STANDARD\n    ) { style ->\n      setupLights3D(style)\n    }\n  }\n\n  private fun setupLights3D(style: Style) {\n    // setup 3d light\n    val ambientLight = ambientLight(AMBIENT_LIGHT_ID) {\n      color(Color.WHITE)\n      intensity(0.5)\n    }\n    val directionalLight = directionalLight(DIRECTIONAL_LIGHT_ID) {\n      color(Color.YELLOW)\n      intensity(0.9)\n      castShadows(true)\n      direction(listOf(0.0, 15.0))\n    }\n    style.setLight(\n      ambientLight,\n      directionalLight,\n    )\n    // change color on fab click\n    binding.fabLightColor.setOnClickListener {\n      isRedColor = !isRedColor\n      if (isRedColor) {\n        ambientLight.color(Color.RED)\n      } else {\n        ambientLight.color(Color.WHITE)\n      }\n    }\n\n    binding.fabLightPosition.setOnClickListener {\n      directionalLight.direction(listOf(0.0, (directionalLight.direction!![1] + 5.0) % 90.0))\n    }\n  }\n\n  private companion object {\n    private const val AMBIENT_LIGHT_ID = \"ambient_id\"\n    private const val DIRECTIONAL_LIGHT_ID = \"directional_id\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/terrain3D/ModelLayerActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.terrain3D\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.get\nimport com.mapbox.maps.extension.style.layers.generated.modelLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.ModelType\nimport com.mapbox.maps.extension.style.model.model\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.turf.TurfMeasurement\n\n/**\n * Showcase adding 3D models using model layer.\n */\n@MapboxExperimental\nclass ModelLayerActivity : AppCompatActivity() {\n  private lateinit var mapView: MapView\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    mapView = MapView(this)\n    setContentView(mapView)\n\n    mapView.mapboxMap.apply {\n      setCamera(\n        cameraOptions {\n          center(TurfMeasurement.midpoint(MODEL1_COORDINATES, MAPBOX_HELSINKI))\n          zoom(CAMERA_ZOOM)\n          pitch(CAMERA_PITCH)\n        }\n      )\n      loadStyle(\n        style(Style.STANDARD) {\n          +model(MODEL_ID_1) {\n            uri(SAMPLE_MODEL_URI_1)\n          }\n          +model(MODEL_ID_2) {\n            uri(SAMPLE_MODEL_URI_2)\n          }\n          +geoJsonSource(SOURCE_ID) {\n            featureCollection(\n              FeatureCollection.fromFeatures(\n                listOf(\n                  Feature.fromGeometry(MODEL1_COORDINATES).also { it.addStringProperty(MODEL_ID_KEY, MODEL_ID_1) },\n                  Feature.fromGeometry(MAPBOX_HELSINKI).also { it.addStringProperty(MODEL_ID_KEY, MODEL_ID_2) }\n                )\n              )\n            )\n          }\n          +modelLayer(MODEL_LAYER_ID, SOURCE_ID) {\n            modelId(get(MODEL_ID_KEY))\n            modelType(ModelType.COMMON_3D)\n            modelScale(listOf(40.0, 40.0, 40.0))\n            modelTranslation(listOf(0.0, 0.0, 0.0))\n            modelRotation(listOf(0.0, 0.0, 90.0))\n            modelOpacity(0.7)\n            modelAmbientOcclusionIntensity(1.0)\n          }\n        }\n      )\n    }\n  }\n\n  private companion object {\n    const val CAMERA_ZOOM = 16.0\n    const val CAMERA_PITCH = 45.0\n    const val SOURCE_ID = \"source-id\"\n    const val MODEL_LAYER_ID = \"model-layer-id\"\n    const val MODEL_ID_KEY = \"model-id-key\"\n    const val MODEL_ID_1 = \"model-id-1\"\n    const val MODEL_ID_2 = \"model-id-2\"\n    const val SAMPLE_MODEL_URI_1 =\n      \"https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Embedded/Duck.gltf\"\n    const val SAMPLE_MODEL_URI_2 = \"asset://sportcar.glb\"\n    val MAPBOX_HELSINKI = Point.fromLngLat(24.945389069265598, 60.17195694011002)\n    val MODEL1_COORDINATES = Point.fromLngLat(MAPBOX_HELSINKI.longitude() - 0.002, MAPBOX_HELSINKI.latitude() + 0.002)\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/terrain3D/SantaCatalinaActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.terrain3D\n\nimport android.animation.TimeAnimator\nimport android.graphics.Color.rgb\nimport android.os.Bundle\nimport android.view.Window\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.api.directions.v5.DirectionsCriteria\nimport com.mapbox.api.directions.v5.MapboxDirections\nimport com.mapbox.api.directions.v5.models.DirectionsResponse\nimport com.mapbox.api.directions.v5.models.RouteOptions\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.core.constants.Constants.PRECISION_6\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.generated.locationIndicatorLayer\nimport com.mapbox.maps.extension.style.layers.getLayerAs\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.rasterDemSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.extension.style.terrain.generated.terrain\nimport com.mapbox.maps.plugin.compass.compass\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.plugin.scalebar.scalebar\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.utils.BitmapUtils.bitmapFromDrawableRes\nimport com.mapbox.turf.TurfConstants\nimport com.mapbox.turf.TurfMeasurement\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\n\n/**\n * Example showcasing terrain with animating the free camera with a line string.\n */\nclass SantaCatalinaActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n  private var timeAnimator: TimeAnimator? = null\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    requestWindowFeature(Window.FEATURE_NO_TITLE)\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapView.disablePlugins()\n\n    // get map and setup initial camera\n    mapboxMap = mapView.mapboxMap\n    mapboxMap.setCamera(\n      CameraOptions.Builder()\n        .center(POINT_START)\n        .zoom(14.0)\n        .bearing(215.0)\n        .build()\n    )\n\n    // load satellite style and add terrain with a line layer to visualize the route\n    mapboxMap.loadStyle(\n      style(style = Style.STANDARD_SATELLITE) {\n        +rasterDemSource(SOURCE) {\n          url(TERRAIN_URL_TILE_RESOURCE)\n          // 514 specifies padded DEM tile and provides better performance than 512 tiles.\n          tileSize(514)\n        }\n        +terrain(SOURCE) {\n          exaggeration(TERRAIN_EXEGERATION)\n        }\n        +lineLayer(LINE_LAYER_ID, GEOJSON_SOURCE_ID) {\n          lineColor(rgb(255, 79, 60))\n          lineWidth(5.0)\n          slot(\"middle\")\n        }\n        +locationIndicatorLayer(LOCATION_LAYER_ID) {\n          topImage(FOREGROUND_ICON)\n          bearingImage(BACKGROUND_ICON)\n          imagePitchDisplacement(5.0)\n          topImageSize(1.5)\n          bearingImageSize(1.5)\n        }\n        +image(\n          FOREGROUND_ICON,\n          bitmapFromDrawableRes(R.drawable.mapbox_mylocation_icon_default)\n        )\n        +image(\n          BACKGROUND_ICON,\n          bitmapFromDrawableRes(R.drawable.mapbox_mylocation_bg_shape)\n        )\n      }\n    ) { style ->\n      // hide road labels\n      style.getLayerAs<SymbolLayer>(LAYER_ROAD_ID)?.visibility(Visibility.NONE)\n\n      // execute direction request\n      executeDirectionsRequestForRoute {\n        // add a source to visualize the route\n        addSourceForRoute(style, it)\n        // animate the route\n        animateRoute(it)\n      }\n    }\n  }\n\n  /**\n   * Executes a directions request.\n   * propagates the linestring geometry as high order function.\n   */\n  private fun executeDirectionsRequestForRoute(animateRoute: (LineString) -> Unit) {\n    val routeOptions = RouteOptions.builder()\n      .coordinatesList(listOf(POINT_START, POINT_END))\n      .overview(DirectionsCriteria.OVERVIEW_SIMPLIFIED)\n      .profile(DirectionsCriteria.PROFILE_WALKING)\n      .steps(true)\n      .build()\n    val client = MapboxDirections.builder()\n      .routeOptions(routeOptions)\n      .accessToken(MapboxOptions.accessToken)\n      .build()\n    client.enqueueCall(object : Callback<DirectionsResponse> {\n      override fun onResponse(\n        call: Call<DirectionsResponse>,\n        response: Response<DirectionsResponse>\n      ) {\n        response.body()?.let { body ->\n          if (body.routes().isNotEmpty()) {\n            body.routes()[0].geometry()?.let {\n              animateRoute(\n                LineString.fromPolyline(it, PRECISION_6)\n              )\n              return\n            }\n          }\n        } ?: throw RuntimeException(\"Not able to retrieve a directions route\")\n      }\n\n      override fun onFailure(call: Call<DirectionsResponse>, t: Throwable) {}\n    })\n  }\n\n  /**\n   * Adds a GeoJsonSource to a style to visualize a LineString\n   */\n  private fun addSourceForRoute(style: Style, lineString: LineString) {\n    style.addSource(\n      geoJsonSource(GEOJSON_SOURCE_ID) {\n        geometry(lineString)\n      }\n    )\n  }\n\n  /**\n   * Animate the route using FreeCamera API\n   */\n  private fun animateRoute(lineString: LineString) {\n    // get the overall distance of each route so we can interpolate along them\n    val routeDistance = TurfMeasurement.length(\n      lineString, TurfConstants.UNIT_KILOMETERS\n    )\n\n    mapboxMap.getStyle {\n      // get reference to the location layer\n      val locationLayer = it.getLayerAs<LocationIndicatorLayer>(LOCATION_LAYER_ID)\n\n      // cache the camera\n      val camera = mapboxMap.getFreeCameraOptions()\n\n      // use time animator to animate the lineString and location layer\n      timeAnimator = TimeAnimator().apply {\n        setTimeListener { animator, totalTime, _ ->\n\n          // phase determines how far through the animation we are\n          val phase: Double = totalTime / ANIMATION_DURATION\n\n          // phase is normalized between 0 and 1\n          // when the animation is finished, cancel the animation\n          if (phase > 1) {\n            animator.cancel()\n          }\n\n          // use phase to get a point that is the appropriate distance along the route\n          val cameraLookingAt = TurfMeasurement.along(\n            lineString, routeDistance * phase,\n            TurfConstants.UNIT_KILOMETERS\n          )\n\n          // at start, we hover the current position first before trailing it\n          var cameraPhase = phase - PHASE_DROP_OFF\n          if (cameraPhase < 0) {\n            cameraPhase = 0.0\n          }\n\n          // use phase that trails behind to be able to create a tilted camera\n          val cameraLocation = TurfMeasurement.along(\n            lineString, routeDistance * cameraPhase,\n            TurfConstants.UNIT_KILOMETERS\n          )\n\n          // calculate the elevation of the user location\n          val elevation = (ELEVATION_MAX * phase) + ELEVATION_MIN\n\n          // Update location indicator\n          locationLayer?.location(\n            listOf(\n              cameraLookingAt.latitude(),\n              cameraLookingAt.longitude(),\n              elevation\n            )\n          )\n\n          // place the camera above the elevation of the user position\n          val elevationDifference = BASE_CAMERA_ELEVATION + elevation\n\n          // set the position and altitude of the camera\n          camera.setLocation(cameraLocation, elevationDifference)\n\n          // set the position to look with a decreased elevation for creating tilted camera\n          camera.lookAtPoint(cameraLookingAt, elevation)\n\n          // set the updated camera position\n          mapboxMap.setCamera(camera)\n        }\n        duration = ANIMATION_DURATION.toLong()\n        start()\n      }\n    }\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    timeAnimator?.cancel()\n  }\n\n  companion object {\n    // Style constants\n    private const val GEOJSON_SOURCE_ID = \"geojson\"\n    private const val LINE_LAYER_ID = \"line\"\n    private const val LOCATION_LAYER_ID = \"location\"\n    private const val SOURCE = \"TERRAIN_SOURCE\"\n    private const val TERRAIN_URL_TILE_RESOURCE = \"mapbox://mapbox.mapbox-terrain-dem-v1\"\n    private const val TERRAIN_EXEGERATION = 1.7\n    private const val FOREGROUND_ICON = \"mapbox-location-icon\"\n    private const val BACKGROUND_ICON = \"mapbox-location-stroke-icon\"\n    private const val LAYER_ROAD_ID = \"road-label\"\n\n    // Camera animation constants\n    private const val ANIMATION_DURATION = 75000.0\n    private const val BASE_CAMERA_ELEVATION = 45.0\n    private const val PHASE_DROP_OFF = 0.15\n    private const val ELEVATION_MAX = 225.0\n    private const val ELEVATION_MIN = 65.0\n    private val POINT_START = Point.fromLngLat(-118.33283, 33.33470)\n    private val POINT_END = Point.fromLngLat(-118.34183, 33.32387)\n  }\n}\n\nfun MapView.disablePlugins() {\n  scalebar.enabled = false\n  compass.enabled = false\n\n  gestures.pitchEnabled = false\n  gestures.rotateEnabled = false\n  gestures.pinchToZoomEnabled = false\n  gestures.doubleTouchToZoomOutEnabled = false\n  gestures.doubleTapToZoomInEnabled = false\n  gestures.scrollEnabled = false\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/terrain3D/Terrain3DShowcaseActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.terrain3D\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.atmosphere.generated.atmosphere\nimport com.mapbox.maps.extension.style.layers.generated.skyLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.layers.properties.generated.SkyType\nimport com.mapbox.maps.extension.style.projection.generated.projection\nimport com.mapbox.maps.extension.style.sources.generated.rasterDemSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.extension.style.terrain.generated.terrain\nimport com.mapbox.maps.testapp.databinding.ActivityTerrainShowcaseBinding\n\n/**\n * Example that demonstrates realistic map with 3D terrain and atmosphere sky layer.\n */\nclass Terrain3DShowcaseActivity : AppCompatActivity() {\n\n  private lateinit var mapboxMap: MapboxMap\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityTerrainShowcaseBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    mapboxMap = binding.mapView.mapboxMap\n    mapboxMap.loadStyle(\n      styleExtension = style(Style.STANDARD_SATELLITE) {\n        +rasterDemSource(SOURCE) {\n          url(TERRAIN_URL_TILE_RESOURCE)\n          // 514 specifies padded DEM tile and provides better performance than 512 tiles.\n          tileSize(514)\n        }\n        +terrain(SOURCE)\n        +skyLayer(SKY_LAYER) {\n          skyType(SkyType.ATMOSPHERE)\n          skyAtmosphereSun(listOf(-50.0, 90.2))\n        }\n        +atmosphere { }\n        +projection(ProjectionName.GLOBE)\n      }\n    )\n  }\n\n  companion object {\n    private const val SOURCE = \"TERRAIN_SOURCE\"\n    private const val SKY_LAYER = \"sky\"\n    private const val TERRAIN_URL_TILE_RESOURCE = \"mapbox://mapbox.mapbox-terrain-dem-v1\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/viewport/AdvancedViewportGesturesExample.kt",
    "content": "package com.mapbox.maps.testapp.examples.viewport\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.android.gestures.RotateGestureDetector\nimport com.mapbox.android.gestures.ShoveGestureDetector\nimport com.mapbox.android.gestures.StandardScaleGestureDetector\nimport com.mapbox.api.directions.v5.models.DirectionsResponse\nimport com.mapbox.core.constants.Constants\nimport com.mapbox.geojson.LineString\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.gestures.OnRotateListener\nimport com.mapbox.maps.plugin.gestures.OnScaleListener\nimport com.mapbox.maps.plugin.gestures.OnShoveListener\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.ViewportStatus\nimport com.mapbox.maps.plugin.viewport.ViewportStatusObserver\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.ViewportOptions\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState\nimport com.mapbox.maps.plugin.viewport.state.OverviewViewportState\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.plugin.viewport.viewport\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.utils.SimulateRouteLocationProvider\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n/**\n * Showcase the usage of viewport plugin with advanced gestures customisation.\n *\n * Touch the map to toggle the following and overview mode.\n *\n * @see [User location guide](https://docs.mapbox.com/android/maps/guides/user-location/#location-tracking)\n */\nclass AdvancedViewportGesturesExample : AppCompatActivity() {\n  private lateinit var mapView: MapView\n  private lateinit var routePoints: LineString\n  private val followPuckViewportState: FollowPuckViewportState by lazy {\n    mapView.viewport.makeFollowPuckViewportState(\n      FollowPuckViewportStateOptions.Builder()\n        .bearing(FollowPuckViewportStateBearing.Constant(0.0))\n        .padding(EdgeInsets(200.0 * resources.displayMetrics.density, 0.0, 0.0, 0.0))\n        .build()\n    )\n  }\n  private val overviewViewportState: OverviewViewportState by lazy {\n    mapView.viewport.makeOverviewViewportState(\n      OverviewViewportStateOptions.Builder()\n        .geometry(routePoints)\n        .padding(EdgeInsets(100.0, 100.0, 100.0, 100.0))\n        .build()\n    )\n  }\n  private val onIndicatorPositionChangedListener = OnIndicatorPositionChangedListener {\n    mapView.gestures.focalPoint = mapView.mapboxMap.pixelForCoordinate(it)\n  }\n\n  private val viewportStatusObserver = ViewportStatusObserver { from, to, _ ->\n    // Clean up the gestures settings when current viewport is moving away from followPuckViewportState\n    if (from == ViewportStatus.State(followPuckViewportState)) {\n      clearAdvancedGesturesForFollowPuckViewportState()\n    }\n    // Set up the gestures settings when current viewport has entered the followPuckViewportState\n    if (to == ViewportStatus.State(followPuckViewportState)) {\n      setupAdvancedGesturesForFollowPuckViewportState()\n    }\n  }\n\n  private val onScaleListener = object : OnScaleListener {\n    override fun onScaleBegin(detector: StandardScaleGestureDetector) {\n      // set the default zoom that will be generated for camera following frames to null,\n      // thus allows gestures to adjust the camera zoom using zoom gestures.\n      followPuckViewportState.apply {\n        options = options.toBuilder().zoom(null).build()\n      }\n    }\n\n    override fun onScale(detector: StandardScaleGestureDetector) {\n      // no-ops\n    }\n\n    override fun onScaleEnd(detector: StandardScaleGestureDetector) {\n      // set the default zoom to current value on scale gesture end\n      followPuckViewportState.apply {\n        options = options.toBuilder().zoom(mapView.mapboxMap.cameraState.zoom).build()\n      }\n    }\n  }\n\n  private val onRotateListener = object : OnRotateListener {\n    override fun onRotateBegin(detector: RotateGestureDetector) {\n      // set the default bearing that will be generated for camera following frames to null,\n      // thus allows gestures to adjust the camera bearing using rotate gestures.\n      followPuckViewportState.apply {\n        options = options.toBuilder().bearing(null).build()\n      }\n    }\n\n    override fun onRotate(detector: RotateGestureDetector) {\n      // no-ops\n    }\n\n    override fun onRotateEnd(detector: RotateGestureDetector) {\n      // set the default bearing to current value on rotate gesture end\n      followPuckViewportState.apply {\n        options = options.toBuilder()\n          .bearing(FollowPuckViewportStateBearing.Constant(mapView.mapboxMap.cameraState.bearing))\n          .build()\n      }\n    }\n  }\n\n  private val onShoveListener = object : OnShoveListener {\n    override fun onShoveBegin(detector: ShoveGestureDetector) {\n      // set the default pitch that will be generated for camera following frames to null,\n      // thus allows gestures to adjust the camera pitch using shove gestures.\n      followPuckViewportState.apply {\n        options = options.toBuilder()\n          .pitch(null)\n          .build()\n      }\n    }\n\n    override fun onShove(detector: ShoveGestureDetector) {\n      // no-ops\n    }\n\n    override fun onShoveEnd(detector: ShoveGestureDetector) {\n      // set the default pitch to current value on shove gesture end\n      followPuckViewportState.apply {\n        options = options.toBuilder()\n          .pitch(mapView.mapboxMap.cameraState.pitch)\n          .build()\n      }\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    mapView = MapView(this, MapInitOptions(this))\n    setContentView(mapView)\n\n    lifecycleScope.launch {\n      routePoints = withContext(Dispatchers.Default) {\n        LineString.fromPolyline(\n          DirectionsResponse.fromJson(\n            AnnotationUtils.loadStringFromAssets(\n              this@AdvancedViewportGesturesExample,\n              NAVIGATION_ROUTE_JSON_NAME\n            )\n          ).routes()[0].geometry()!!,\n          Constants.PRECISION_6\n        )\n      }\n      mapView.mapboxMap.loadStyle(\n        style(Style.STANDARD) {\n        // Show the route line on the map\n        +geoJsonSource(GEOJSON_SOURCE_ID) {\n          geometry(routePoints)\n        }\n        +lineLayer(\n          ROUTE_LINE_LAYER_ID,\n          GEOJSON_SOURCE_ID\n        ) {\n          lineColor(mapView.context.getColor(R.color.mapbox_blue))\n          lineWidth(10.0)\n          lineCap(LineCap.ROUND)\n          lineJoin(LineJoin.ROUND)\n        }\n      }\n      ) {\n        // Prepare the location component with puck styling and a simulated route.\n        setupLocationComponent(routePoints)\n\n        // Observe the viewport status to setup/clean up the gestures settings\n        // specifically for followPuckViewportState\n        mapView.viewport.addStatusObserver(viewportStatusObserver)\n\n        // Switch ViewportStates by single tapping on the map.\n        mapView.gestures.addOnMapClickListener {\n          mapView.viewport.transitionTo(\n            when (mapView.viewport.status.getCurrentOrNextState()) {\n              followPuckViewportState -> overviewViewportState\n              else -> followPuckViewportState\n            }\n          )\n          false\n        }\n        mapView.viewport.transitionTo(overviewViewportState)\n      }\n    }\n  }\n\n  private fun setupAdvancedGesturesForFollowPuckViewportState() {\n    // Disable viewport's transitionsToIdleUponUserInteraction so that we can customise the gestures\n    // within the state.\n    mapView.viewport.options =\n      ViewportOptions.Builder().transitionsToIdleUponUserInteraction(false).build()\n\n    // Advanced gestures handling\n\n    // Disable scroll gesture\n    mapView.gestures.scrollEnabled = false\n    // Set the focal point of the gestures to the puck's location\n    mapView.location.addOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n\n    // Add hooks to the gesture to adjust the followPuckViewportState's options.\n    mapView.gestures.addOnScaleListener(onScaleListener)\n    mapView.gestures.addOnRotateListener(onRotateListener)\n    mapView.gestures.addOnShoveListener(onShoveListener)\n  }\n\n  private fun clearAdvancedGesturesForFollowPuckViewportState() {\n    // Re-enable the default viewport behaviour, which will transition to idle upon user interactions.\n    mapView.viewport.options =\n      ViewportOptions.Builder().transitionsToIdleUponUserInteraction(true).build()\n    // Stop updating the focal point to the puck's position, set the focal point to null(reset to the default behaviour)\n    mapView.location.removeOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n    mapView.gestures.focalPoint = null\n    // Re-enable scroll gesture.\n    mapView.gestures.scrollEnabled = true\n\n    // Remove the hooks to the gesture that updates the followPuckViewportState's options.\n    mapView.gestures.removeOnScaleListener(onScaleListener)\n    mapView.gestures.removeOnRotateListener(onRotateListener)\n    mapView.gestures.removeOnShoveListener(onShoveListener)\n  }\n\n  private fun setupLocationComponent(routePoints: LineString) {\n    // setup the location component\n    mapView.location.apply {\n      enabled = true\n      puckBearingEnabled = true\n      puckBearing = PuckBearing.COURSE\n      locationPuck = LocationPuck2D(\n        bearingImage = ImageHolder.from(R.drawable.mapbox_user_puck_icon),\n        scaleExpression = interpolate {\n          linear()\n          zoom()\n          stop {\n            literal(0.0)\n            literal(0.6)\n          }\n          stop {\n            literal(20.0)\n            literal(1.0)\n          }\n        }.toJson()\n      )\n      setLocationProvider(SimulateRouteLocationProvider(routePoints))\n    }\n  }\n\n  override fun onDestroy() {\n    super.onDestroy()\n    mapView.location.removeOnIndicatorPositionChangedListener(onIndicatorPositionChangedListener)\n    mapView.viewport.removeStatusObserver(viewportStatusObserver)\n    mapView.gestures.removeOnScaleListener(onScaleListener)\n    mapView.gestures.removeOnRotateListener(onRotateListener)\n    mapView.gestures.removeOnShoveListener(onShoveListener)\n  }\n\n  companion object {\n    private const val NAVIGATION_ROUTE_JSON_NAME = \"navigation_route.json\"\n    private const val GEOJSON_SOURCE_ID = \"source_id\"\n    private const val ROUTE_LINE_LAYER_ID = \"route_line_layer_id\"\n  }\n}\n\nprivate fun ViewportStatus.getCurrentOrNextState(): ViewportState? =\n  when (this) {\n    is ViewportStatus.State -> state\n    is ViewportStatus.Transition -> toState\n    ViewportStatus.Idle -> null\n  }"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/examples/viewport/ViewportShowcaseActivity.kt",
    "content": "package com.mapbox.maps.testapp.examples.viewport\n\nimport android.annotation.SuppressLint\nimport android.content.res.Configuration\nimport android.os.Bundle\nimport android.widget.Button\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.mapbox.api.directions.v5.models.DirectionsResponse\nimport com.mapbox.core.constants.Constants\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.ViewportStatus\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState\nimport com.mapbox.maps.plugin.viewport.state.OverviewViewportState\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.plugin.viewport.viewport\nimport com.mapbox.maps.testapp.R\nimport com.mapbox.maps.testapp.databinding.ActivityViewportAnimationBinding\nimport com.mapbox.maps.testapp.examples.annotation.AnnotationUtils\nimport com.mapbox.maps.testapp.utils.SimulateRouteLocationProvider\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n/**\n * Showcase the use age of viewport plugin.\n *\n * Use button to toggle the following and overview mode.\n *\n * @see [User location guide](https://docs.mapbox.com/android/maps/guides/user-location/#location-tracking)\n */\nclass ViewportShowcaseActivity : AppCompatActivity() {\n  private lateinit var viewportButton: Button\n  private lateinit var followPuckViewportState: FollowPuckViewportState\n  private lateinit var overviewViewportState: OverviewViewportState\n  private val pixelDensity by lazy { resources.displayMetrics.density }\n  private lateinit var simulateRouteLocationProvider: SimulateRouteLocationProvider\n\n  private val overviewPadding: EdgeInsets by lazy {\n    EdgeInsets(\n      140.0 * pixelDensity,\n      40.0 * pixelDensity,\n      120.0 * pixelDensity,\n      40.0 * pixelDensity\n    )\n  }\n  private val landscapeOverviewPadding: EdgeInsets by lazy {\n    EdgeInsets(\n      30.0 * pixelDensity,\n      380.0 * pixelDensity,\n      20.0 * pixelDensity,\n      20.0 * pixelDensity\n    )\n  }\n  private val followingPadding: EdgeInsets by lazy {\n    EdgeInsets(\n      180.0 * pixelDensity,\n      40.0 * pixelDensity,\n      150.0 * pixelDensity,\n      40.0 * pixelDensity\n    )\n  }\n  private val landscapeFollowingPadding: EdgeInsets by lazy {\n    EdgeInsets(\n      30.0 * pixelDensity,\n      380.0 * pixelDensity,\n      110.0 * pixelDensity,\n      40.0 * pixelDensity\n    )\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val binding = ActivityViewportAnimationBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    viewportButton = binding.switchButton\n    val mapView = binding.mapView\n    lifecycleScope.launch {\n      mapView.mapboxMap.apply {\n        setCamera(\n          CameraOptions.Builder()\n            .zoom(14.0)\n            .center(Point.fromLngLat(POINT_LNG, POINT_LAT))\n            .build()\n        )\n        val route = withContext(Dispatchers.Default) {\n          LineString.fromPolyline(\n            DirectionsResponse.fromJson(\n              AnnotationUtils.loadStringFromAssets(\n                this@ViewportShowcaseActivity,\n                NAVIGATION_ROUTE_JSON_NAME\n              )\n            ).routes()[0].geometry()!!,\n            Constants.PRECISION_6\n          )\n        }\n        simulateRouteLocationProvider = SimulateRouteLocationProvider(route)\n        mapView.location.apply {\n          setLocationProvider(simulateRouteLocationProvider)\n          updateSettings {\n            locationPuck = LocationPuck2D(\n              bearingImage = ImageHolder.from(R.drawable.mapbox_mylocation_icon_bearing)\n            )\n            puckBearingEnabled = true\n          }\n        }\n        setupViewportPlugin(mapView.viewport)\n      }\n    }\n  }\n\n  @SuppressLint(\"SetTextI18n\")\n  private fun setupViewportPlugin(viewport: ViewportPlugin) {\n    followPuckViewportState =\n      viewport.makeFollowPuckViewportState(FollowPuckViewportStateOptions.Builder().build())\n    overviewViewportState =\n      viewport.makeOverviewViewportState(\n        OverviewViewportStateOptions.Builder().geometry(simulateRouteLocationProvider.route).build()\n      )\n    viewport.addStatusObserver { from, to, reason ->\n      logI(\n        TAG,\n        \"\"\"\n        ViewportStatus changed:\n            from:         $from,\n            to:           $to,\n            with reason:         $reason\n        \"\"\".trimIndent()\n      )\n      when (to.getCurrentOrNextState()) {\n        is FollowPuckViewportState -> viewportButton.text = OVERVIEW\n        else -> viewportButton.text = FOLLOW\n      }\n    }\n    if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {\n      followPuckViewportState.apply {\n        options = options.toBuilder().padding(landscapeFollowingPadding).build()\n      }\n      overviewViewportState.apply {\n        options = options.toBuilder().padding(landscapeOverviewPadding).build()\n      }\n    } else {\n      followPuckViewportState.apply {\n        options = options.toBuilder().padding(followingPadding).build()\n      }\n      overviewViewportState.apply {\n        options = options.toBuilder().padding(overviewPadding).build()\n      }\n    }\n    viewportButton.setOnClickListener {\n      when (viewportButton.text) {\n        FOLLOW -> viewport.transitionTo(followPuckViewportState)\n        OVERVIEW -> viewport.transitionTo(overviewViewportState)\n      }\n    }\n  }\n\n  companion object {\n    private const val TAG = \"ViewportShowcase\"\n    private const val FOLLOW = \"Follow\"\n    private const val OVERVIEW = \"Overview\"\n    private const val POINT_LAT = 34.052235\n    private const val POINT_LNG = -118.243683\n    private const val NAVIGATION_ROUTE_JSON_NAME = \"navigation_route.json\"\n  }\n}\n\nprivate fun ViewportStatus.getCurrentOrNextState(): ViewportState? =\n  when (this) {\n    is ViewportStatus.State -> state\n    is ViewportStatus.Transition -> toState\n    ViewportStatus.Idle -> null\n  }"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/model/IssModel.kt",
    "content": "package com.mapbox.maps.testapp.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class IssModel(\n  @SerializedName(\"iss_position\") var issPosition: IssPosition? = null,\n  @SerializedName(\"message\") var message: String? = null,\n  @SerializedName(\"timestamp\") var timestamp: Int? = null\n)"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/model/IssPosition.kt",
    "content": "package com.mapbox.maps.testapp.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class IssPosition(\n  @SerializedName(\"latitude\") var latitude: Double? = null,\n  @SerializedName(\"longitude\") var longitude: Double? = null\n)"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/model/SpecificExample.kt",
    "content": "package com.mapbox.maps.testapp.model\n\nimport android.os.Parcel\nimport android.os.Parcelable\n\ndata class SpecificExample(\n  val name: String,\n  private val _label: String? = null,\n  private val _description: String? = null,\n  val category: String\n) : Parcelable {\n\n  val simpleName: String = buildSimpleName()\n\n  constructor(parcel: Parcel) : this(\n    parcel.readString()!!,\n    parcel.readString(),\n    parcel.readString(),\n    parcel.readString()!!\n  )\n\n  private fun buildSimpleName(): String {\n    val split =\n      name.split(\"\\\\.\".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()\n    return split[split.size - 1]\n  }\n\n  val label: String = _label ?: simpleName\n\n  val description: String = _description ?: \"-\"\n\n  override fun writeToParcel(parcel: Parcel, flags: Int) {\n    parcel.writeString(name)\n    parcel.writeString(label)\n    parcel.writeString(description)\n    parcel.writeString(category)\n  }\n\n  override fun describeContents(): Int {\n    return 0\n  }\n\n  companion object CREATOR : Parcelable.Creator<SpecificExample> {\n    override fun createFromParcel(parcel: Parcel): SpecificExample {\n      return SpecificExample(parcel)\n    }\n\n    override fun newArray(size: Int): Array<SpecificExample?> {\n      return arrayOfNulls(size)\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/utils/BitmapUtils.kt",
    "content": "package com.mapbox.maps.testapp.utils\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.graphics.drawable.BitmapDrawable\nimport android.graphics.drawable.Drawable\nimport androidx.annotation.ColorInt\nimport androidx.annotation.DrawableRes\nimport androidx.appcompat.content.res.AppCompatResources\n\n/**\n * Utility class to work with bitmaps and drawables.\n */\nobject BitmapUtils {\n\n  /**\n   * Convert given drawable id to bitmap.\n   */\n  fun Context.bitmapFromDrawableRes(@DrawableRes resourceId: Int): Bitmap =\n    drawableToBitmap(AppCompatResources.getDrawable(this, resourceId)!!)\n\n  fun drawableToBitmap(\n    sourceDrawable: Drawable,\n    flipX: Boolean = false,\n    flipY: Boolean = false,\n    @ColorInt tint: Int? = null,\n  ): Bitmap {\n    return if (sourceDrawable is BitmapDrawable) {\n      sourceDrawable.bitmap\n    } else {\n      // copying drawable object to not manipulate on the same reference\n      val constantState = sourceDrawable.constantState!!\n      val drawable = constantState.newDrawable().mutate()\n      val bitmap = Bitmap.createBitmap(\n        drawable.intrinsicWidth, drawable.intrinsicHeight,\n        Bitmap.Config.ARGB_8888\n      )\n      tint?.let(drawable::setTint)\n      val canvas = Canvas(bitmap)\n      drawable.setBounds(0, 0, canvas.width, canvas.height)\n      canvas.scale(\n        if (flipX) -1f else 1f,\n        if (flipY) -1f else 1f,\n        canvas.width / 2f,\n        canvas.height / 2f\n      )\n      drawable.draw(canvas)\n      bitmap\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/utils/ItemClickSupport.kt",
    "content": "package com.mapbox.maps.testapp.utils\n\nimport android.view.View\nimport androidx.recyclerview.widget.RecyclerView\nimport com.mapbox.maps.testapp.R\n\nclass ItemClickSupport private constructor(private val recyclerView: RecyclerView) {\n  private var onItemClickListener: OnItemClickListener? = null\n  private var onItemLongClickListener: OnItemLongClickListener? = null\n  private val onClickListener = View.OnClickListener { view ->\n    if (onItemClickListener != null) {\n      val holder = recyclerView.getChildViewHolder(view)\n      onItemClickListener!!.onItemClicked(recyclerView, holder.adapterPosition, view)\n    }\n  }\n  private val onLongClickListener = View.OnLongClickListener { view ->\n    if (onItemLongClickListener != null) {\n      val holder = recyclerView.getChildViewHolder(view)\n      return@OnLongClickListener onItemLongClickListener!!.onItemLongClicked(\n        recyclerView,\n        holder.adapterPosition,\n        view\n      )\n    }\n    false\n  }\n  private val attachListener = object : RecyclerView.OnChildAttachStateChangeListener {\n    override fun onChildViewAttachedToWindow(view: View) {\n      if (onItemClickListener != null) {\n        view.setOnClickListener(onClickListener)\n      }\n      if (onItemLongClickListener != null) {\n        view.setOnLongClickListener(onLongClickListener)\n      }\n    }\n\n    override fun onChildViewDetachedFromWindow(view: View) {\n      // Empty on purpose. Not used.\n    }\n  }\n\n  init {\n    this.recyclerView.setTag(R.id.item_click_support, this)\n    this.recyclerView.addOnChildAttachStateChangeListener(attachListener)\n  }\n\n  fun setOnItemClickListener(listener: OnItemClickListener): ItemClickSupport {\n    onItemClickListener = listener\n    return this\n  }\n\n  fun setOnItemLongClickListener(listener: OnItemLongClickListener): ItemClickSupport {\n    onItemLongClickListener = listener\n    return this\n  }\n\n  private fun detach(view: RecyclerView) {\n    view.removeOnChildAttachStateChangeListener(attachListener)\n    view.setTag(R.id.item_click_support, null)\n  }\n\n  fun interface OnItemClickListener {\n\n    fun onItemClicked(recyclerView: RecyclerView, position: Int, view: View)\n  }\n\n  fun interface OnItemLongClickListener {\n\n    fun onItemLongClicked(recyclerView: RecyclerView, position: Int, view: View): Boolean\n  }\n\n  companion object {\n\n    fun addTo(view: RecyclerView): ItemClickSupport {\n      var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as? ItemClickSupport\n      if (support == null) {\n        support = ItemClickSupport(view)\n      }\n      return support\n    }\n\n    fun removeFrom(view: RecyclerView): ItemClickSupport? {\n      val support = view.getTag(R.id.item_click_support) as ItemClickSupport\n      support.detach(view)\n      return support\n    }\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/utils/LocationPermissionHelper.kt",
    "content": "package com.mapbox.maps.testapp.utils\n\nimport android.Manifest\nimport android.app.Activity\nimport android.os.Build\nimport android.widget.Toast\nimport androidx.core.app.ActivityCompat\nimport com.mapbox.android.core.permissions.PermissionsListener\nimport com.mapbox.android.core.permissions.PermissionsManager\nimport java.lang.ref.WeakReference\n\nclass LocationPermissionHelper(val activityRef: WeakReference<Activity>) {\n  private lateinit var permissionsManager: PermissionsManager\n\n  fun checkPermissions(onMapReady: () -> Unit) {\n    activityRef.get()?.let { activity: Activity ->\n      if (PermissionsManager.areLocationPermissionsGranted(activity)) {\n        onMapReady()\n      } else {\n        permissionsManager = createPermissionsManager(onMapReady)\n        // TODO: temporary workaround to fix broken request foreground permissions\n        val permissions: List<String> = buildList {\n          add(Manifest.permission.ACCESS_FINE_LOCATION)\n          add(Manifest.permission.ACCESS_COARSE_LOCATION)\n        }\n        ActivityCompat.requestPermissions(activity, permissions.toTypedArray(), 0)\n        // TODO: uncomment after the fix\n        // permissionsManager.requestLocationPermissions(activity)\n      }\n    }\n  }\n\n  /**\n   * PermissionsManager reads all location permission declared in Android manifest and request them all together\n   * It doesn't work if we want to get background permission. In this case we need first request regular location permissions\n   * and only then background permission\n   */\n  // TODO: move this logic to PermissionsManager\n  fun checkBackgroundPermission(onMapReady: () -> Unit) {\n    activityRef.get()?.let { activity: Activity ->\n      if (PermissionsManager.areLocationPermissionsGranted(activity)) {\n        if (PermissionsManager.isBackgroundLocationPermissionGranted(activity) || Build.VERSION.SDK_INT < 29) {\n          onMapReady()\n        } else {\n          // Request background permission only\n          permissionsManager = createPermissionsManager(\n            onMapReady,\n            onCustomPermissionResult = {\n              activityRef.get()?.let {\n                if (PermissionsManager.areLocationPermissionsGranted(activity) &&\n                  PermissionsManager.isBackgroundLocationPermissionGranted(activity)\n                ) {\n                  onMapReady()\n                } else {\n                  it.finish()\n                }\n              }\n            }\n          )\n          // TODO: make this call in PermissionsManager\n          ActivityCompat.requestPermissions(\n            activity,\n            arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),\n            0\n          )\n        }\n      } else {\n        // request regular location permissions\n        permissionsManager = createPermissionsManager(\n          onMapReady,\n          onCustomPermissionResult = { granted ->\n            activityRef.get()?.let {\n              if (granted) {\n                checkBackgroundPermission(onMapReady = onMapReady)\n              } else {\n                it.finish()\n              }\n            }\n          }\n        )\n\n        // TODO: make this call in PermissionsManager\n        ActivityCompat.requestPermissions(\n          activity,\n          arrayOf(\n            Manifest.permission.ACCESS_FINE_LOCATION,\n            Manifest.permission.ACCESS_COARSE_LOCATION\n          ),\n          0\n        )\n      }\n    }\n  }\n\n  fun onRequestPermissionsResult(\n    requestCode: Int,\n    permissions: Array<String>,\n    grantResults: IntArray\n  ) {\n    if (permissions.any { it == Manifest.permission.ACCESS_FINE_LOCATION || it == Manifest.permission.ACCESS_COARSE_LOCATION || it == Manifest.permission.ACCESS_BACKGROUND_LOCATION }) {\n      if (::permissionsManager.isInitialized) {\n        permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults)\n      }\n    }\n  }\n\n  /**\n   * [onCustomPermissionResult] - PermissionsManager doesn't check result of background permission, so wee need to have custom logic here\n   * //TODO: move this logic to PermissionsManager\n   */\n  private fun createPermissionsManager(\n    onMapReady: () -> Unit,\n    onCustomPermissionResult: ((Boolean) -> Unit)? = null\n  ) =\n    PermissionsManager(object : PermissionsListener {\n\n      override fun onExplanationNeeded(permissionsToExplain: List<String>) {\n        activityRef.get()?.let {\n          Toast.makeText(\n            it, \"You need to accept location permissions.\",\n            Toast.LENGTH_SHORT\n          ).show()\n        }\n      }\n\n      override fun onPermissionResult(granted: Boolean) {\n        if (onCustomPermissionResult == null) {\n          activityRef.get()?.let {\n            if (granted) {\n              onMapReady()\n            } else {\n              it.finish()\n            }\n          }\n        } else {\n          onCustomPermissionResult(granted)\n        }\n      }\n    })\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/utils/NavigationSimulator.kt",
    "content": "package com.mapbox.maps.testapp.utils\n\nimport android.os.Handler\nimport android.os.Looper\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.LineLayer\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.gestures\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.ViewportStatus\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.ViewportOptions\nimport com.mapbox.maps.plugin.viewport.viewport\nimport com.mapbox.maps.testapp.R\n\n/**\n * Simulate a navigation route with pre-defined route as LineString.\n *\n * The simulator provides 3 camera tracking modes: OVERVIEW, TRACKING and NONE.\n * APIs are exposed so that user can play the navigation route scripts by switching the camera modes.\n */\nclass NavigationSimulator(\n  private val mapView: MapView,\n  routePoints: LineString,\n) :\n  NavigationSimulatorCameraController, OnIndicatorPositionChangedListener {\n  private val locationProvider = SimulateRouteLocationProvider(route = routePoints)\n  private lateinit var routeLayer: LineLayer\n  private lateinit var casingLayer: LineLayer\n  private val handler = Handler(Looper.getMainLooper())\n  private val viewportPlugin = mapView.viewport\n  private val followPuckViewportState =\n    viewportPlugin.makeFollowPuckViewportState(FollowPuckViewportStateOptions.Builder().build())\n  private val overviewViewportState = viewportPlugin.makeOverviewViewportState(\n    OverviewViewportStateOptions.Builder().geometry(routePoints)\n      .padding(EdgeInsets(100.0, 100.0, 100.0, 100.0)).build()\n  )\n  private var gesturesEnabled = true\n\n  private val onMapClickListener = OnMapClickListener {\n    with(viewportPlugin.status) {\n      if (this is ViewportStatus.State) {\n        when (state) {\n          followPuckViewportState -> viewportPlugin.transitionTo(overviewViewportState)\n          else -> viewportPlugin.transitionTo(followPuckViewportState)\n        }\n      }\n    }\n    true\n  }\n\n  init {\n    viewportPlugin.defaultTransition = viewportPlugin.makeDefaultViewportTransition(\n      DefaultViewportTransitionOptions.Builder()\n        .maxDurationMs(DEFAULT_VIEWPORT_TRANSITION_MAX_DURATION).build()\n    )\n    initMapboxMap()\n  }\n\n  private fun initMapboxMap() {\n    routeLayer = lineLayer(ROUTE_LINE_LAYER_ID, GEOJSON_SOURCE_ID) {\n      lineWidth(\n        interpolate {\n          exponential {\n            literal(1.5)\n          }\n          zoom()\n          stop {\n            literal(4.0)\n            product(3.0, 1.0)\n          }\n          stop {\n            literal(10.0)\n            product(4.0, 1.0)\n          }\n          stop {\n            literal(13.0)\n            product(6.0, 1.0)\n          }\n          stop {\n            literal(16.0)\n            product(10.0, 1.0)\n          }\n          stop {\n            literal(19.0)\n            product(14.0, 1.0)\n          }\n          stop {\n            literal(22.0)\n            product(18.0, 1.0)\n          }\n        }\n      )\n      lineCap(LineCap.ROUND)\n      lineJoin(LineJoin.ROUND)\n      lineGradient(\n        interpolate {\n          linear()\n          lineProgress()\n          stop {\n            literal(0)\n            rgba(6.0, 1.0, 255.0, 1.0)\n          }\n          stop {\n            literal(0.1)\n            rgba(59.0, 118.0, 227.0, 1.0)\n          }\n          stop {\n            literal(0.3)\n            rgba(7.0, 238.0, 251.0, 1.0)\n          }\n          stop {\n            literal(0.5)\n            rgba(0.0, 255.0, 42.0, 1.0)\n          }\n          stop {\n            literal(0.7)\n            rgba(255.0, 252.0, 0.0, 1.0)\n          }\n          stop {\n            literal(1.0)\n            rgba(255.0, 30.0, 0.0, 1.0)\n          }\n        }\n      )\n    }\n    casingLayer = lineLayer(ROUTE_CASING_LAYER_ID, GEOJSON_SOURCE_ID) {\n      lineWidth(\n        interpolate {\n          exponential {\n            literal(1.5)\n          }\n          zoom()\n          stop {\n            literal(10)\n            product(7.0, 1.0)\n          }\n          stop {\n            literal(14.0)\n            product(10.5, 1.0)\n          }\n          stop {\n            literal(16.5)\n            product(15.5, 1.0)\n          }\n          stop {\n            literal(19.0)\n            product(24.0, 1.0)\n          }\n          stop {\n            literal(22.0)\n            product(29.0, 1.0)\n          }\n        }\n      )\n      lineCap(LineCap.ROUND)\n      lineJoin(LineJoin.ROUND)\n      lineGradient(\n        interpolate {\n          linear()\n          lineProgress()\n          stop {\n            literal(0)\n            rgba(47.0, 122.0, 198.0, 1.0)\n          }\n          stop {\n            literal(1.0)\n            rgba(47.0, 122.0, 198.0, 1.0)\n          }\n        }\n      )\n    }\n    mapView.mapboxMap.getStyle {\n      it.addSource(\n        geoJsonSource(GEOJSON_SOURCE_ID) {\n          geometry(locationProvider.route)\n          lineMetrics(true)\n        }\n      )\n      it.addLayer(casingLayer)\n      it.addLayer(routeLayer)\n      initLocationComponent()\n      viewportPlugin.transitionTo(overviewViewportState)\n      enableGestures()\n    }\n  }\n\n  /**\n   * Play a pre-defined 20 seconds script to simulate a navigation route with switching between follow and overview mode.\n   */\n  fun playDefaultNavigationScripts(finishCallback: () -> Unit) {\n    disableGestures()\n    playCustomNavigationScripts(\n      NavigationStep(DEFAULT_CAMERA_MODE_SWITCH_INTERVAL_MS) {\n        setCameraTrackingMode(CameraFollowMode.FOLLOW)\n      },\n      NavigationStep(DEFAULT_CAMERA_MODE_SWITCH_INTERVAL_MS) {\n        setCameraTrackingMode(CameraFollowMode.OVERVIEW)\n      },\n      NavigationStep(DEFAULT_CAMERA_MODE_SWITCH_INTERVAL_MS) {\n        setCameraTrackingMode(CameraFollowMode.FOLLOW)\n      },\n      NavigationStep(DEFAULT_CAMERA_MODE_SWITCH_INTERVAL_MS) {\n        setCameraTrackingMode(CameraFollowMode.OVERVIEW)\n      }\n    )\n    // Invoke callback when the simulation finishes.\n    handler.postDelayed(\n      {\n        finishCallback.invoke()\n      },\n      DEFAULT_SCRIPT_DURATION_MS\n    )\n  }\n\n  /**\n   * Play a repeated script to simulate a navigation route with switching between follow and overview mode.\n   */\n  fun playDefaultNavigationScriptsInLoop() {\n    playDefaultNavigationScripts {\n      playDefaultNavigationScriptsInLoop()\n    }\n  }\n\n  /**\n   * Play a customised script to simulate a navigation route with provided NavigationSteps.\n   */\n  fun playCustomNavigationScripts(\n    vararg navigationStep: NavigationStep\n  ) {\n    var playOffset = 0L\n    navigationStep.forEach {\n      handler.postDelayed(\n        {\n          this.apply(it.action)\n        },\n        it.delay + playOffset\n      )\n      playOffset += it.delay\n    }\n  }\n\n  override fun enableGestures() {\n    mapView.gestures.apply {\n      updateSettings {\n        scrollEnabled = true\n        pinchToZoomEnabled = true\n        pitchEnabled = true\n        rotateEnabled = true\n        doubleTapToZoomInEnabled = true\n        doubleTouchToZoomOutEnabled = true\n      }\n      viewportPlugin.options =\n        ViewportOptions.Builder().transitionsToIdleUponUserInteraction(true).build()\n      addOnMapClickListener(onMapClickListener)\n    }\n    gesturesEnabled = true\n  }\n\n  override fun setCameraTrackingMode(cameraMode: CameraFollowMode) {\n    when (cameraMode) {\n      CameraFollowMode.FOLLOW -> viewportPlugin.transitionTo(followPuckViewportState)\n      CameraFollowMode.OVERVIEW -> viewportPlugin.transitionTo(overviewViewportState)\n      CameraFollowMode.NONE -> viewportPlugin.idle()\n    }\n  }\n\n  /**\n   * Disable gestures in order to get stable benchmark result.\n   */\n  override fun disableGestures() {\n    if (gesturesEnabled) {\n      mapView.gestures.apply {\n        viewportPlugin.options =\n          ViewportOptions.Builder().transitionsToIdleUponUserInteraction(false).build()\n        removeOnMapClickListener(onMapClickListener)\n      }\n      mapView.gestures.updateSettings {\n        scrollEnabled = false\n        pinchToZoomEnabled = false\n        pitchEnabled = false\n        rotateEnabled = false\n        doubleTapToZoomInEnabled = false\n        doubleTouchToZoomOutEnabled = false\n      }\n    }\n    gesturesEnabled = false\n  }\n\n  private fun initLocationComponent() {\n    val locationComponentPlugin = mapView.location\n    locationComponentPlugin.setLocationProvider(locationProvider)\n    locationComponentPlugin.updateSettings {\n      puckBearing = PuckBearing.COURSE\n      puckBearingEnabled = true\n      enabled = true\n      locationPuck = LocationPuck2D(\n        bearingImage = ImageHolder.from(R.drawable.mapbox_user_puck_icon),\n        scaleExpression = interpolate {\n          linear()\n          zoom()\n          stop {\n            literal(0.0)\n            literal(0.6)\n          }\n          stop {\n            literal(20.0)\n            literal(1.0)\n          }\n        }.toJson()\n      )\n    }\n    locationComponentPlugin.addOnIndicatorPositionChangedListener(this)\n  }\n\n  override fun onIndicatorPositionChanged(point: Point) {\n    // use altitude to pass through interpolated progress data, reduce the overhead to\n    // calculate the progress on each frame.\n    if (point.hasAltitude()) {\n      with(point.altitude()) {\n        routeLayer.lineTrimOffset(listOf(0.0, this))\n        casingLayer.lineTrimOffset(listOf(0.0, this))\n      }\n    }\n  }\n\n  fun onDestroy() {\n    mapView.mapboxMap.getStyle {\n      it.removeStyleLayer(casingLayer.layerId)\n      it.removeStyleLayer(routeLayer.layerId)\n      it.removeStyleSourceUnchecked(GEOJSON_SOURCE_ID)\n    }\n    handler.removeCallbacksAndMessages(null)\n    mapView.location.removeOnIndicatorPositionChangedListener(this)\n    mapView.gestures.apply {\n      removeOnMapClickListener(onMapClickListener)\n    }\n  }\n\n  /**\n   * Defines camera follow modes.\n   */\n  enum class CameraFollowMode {\n    FOLLOW,\n    OVERVIEW,\n    NONE\n  }\n\n  /**\n   * Defines a navigation simulation step.\n   */\n  data class NavigationStep(\n    /**\n     * Delay(in ms) before the simulation action takes place.\n     */\n    val delay: Long = DEFAULT_CAMERA_MODE_SWITCH_INTERVAL_MS,\n    /**\n     * The action to be executed by the simulator.\n     */\n    val action: NavigationSimulatorCameraController.() -> Unit\n  )\n\n  companion object {\n    private const val DEFAULT_CAMERA_MODE_SWITCH_INTERVAL_MS = 5000L\n    private const val DEFAULT_SCRIPT_DURATION_MS = 20000L\n    private const val DEFAULT_VIEWPORT_TRANSITION_MAX_DURATION = 2000L\n    private const val GEOJSON_SOURCE_ID = \"source_id\"\n    private const val ROUTE_LINE_LAYER_ID = \"route_line_layer_id\"\n    private const val ROUTE_CASING_LAYER_ID = \"route_casing_layer_id\"\n  }\n}\n\n/**\n * Camera Controller interface for navigation simulator.\n */\ninterface NavigationSimulatorCameraController {\n  /**\n   * Disable all gestures for the simulation.\n   */\n  fun disableGestures()\n\n  /**\n   * Enable gestures control for the simulation(enabled by default).\n   *\n   * When enabled, user interaction will set the camera tracking mode to NONE.\n   * Single touch on the screen will toggle the camera tracking mode between TRACKING and OVERVIEW.\n   */\n  fun enableGestures()\n\n  /**\n   * Set the camera tracking mode to either TRACKING, OVERVIEW or NONE.\n   */\n  fun setCameraTrackingMode(cameraMode: NavigationSimulator.CameraFollowMode)\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/utils/SimulateRouteLocationProvider.kt",
    "content": "package com.mapbox.maps.testapp.utils\n\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.plugin.locationcomponent.LocationConsumer\nimport com.mapbox.maps.plugin.locationcomponent.LocationProvider\nimport com.mapbox.turf.TurfConstants\nimport com.mapbox.turf.TurfMeasurement\nimport com.mapbox.turf.TurfMisc\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.cancelAndJoin\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.util.concurrent.CopyOnWriteArraySet\n\n/**\n * A location provider implementation that takes in a line string as route and animate the location\n * updates along the route.\n */\nclass SimulateRouteLocationProvider(\n  val route: LineString,\n) : LocationProvider {\n  private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)\n  private var emitLocationsJob: Job? = null\n  private val totalRouteLength by lazy { TurfMeasurement.length(route, TurfConstants.UNIT_CENTIMETERS) }\n  private val routeStartPoint = Point.fromLngLat(\n    route.flattenCoordinates().flattenLngLatArray[0],\n    route.flattenCoordinates().flattenLngLatArray[1]\n  )\n  private val locationConsumers = CopyOnWriteArraySet<LocationConsumer>()\n  private var isFakeLocationEmitting = false\n\n  override fun registerLocationConsumer(locationConsumer: LocationConsumer) {\n    locationConsumers.add(locationConsumer)\n    if (!isFakeLocationEmitting) {\n      emitFakeLocations()\n      isFakeLocationEmitting = true\n    }\n  }\n\n  override fun unRegisterLocationConsumer(locationConsumer: LocationConsumer) {\n    locationConsumers.remove(locationConsumer)\n    if (locationConsumers.isEmpty()) {\n      emitLocationsJob?.cancel()\n      isFakeLocationEmitting = false\n    }\n  }\n\n  private fun emitFakeLocations() {\n    val previousEmitLocationsJob = emitLocationsJob\n    emitLocationsJob = scope.launch {\n      // Make sure previous job is cancelled before starting a new one\n      previousEmitLocationsJob?.cancelAndJoin()\n      val flattenCoordinates = route.flattenCoordinates()\n      var lastLocation: Point = routeStartPoint\n      var nextLocationIdx = 1\n      val flattenLngLatArray = flattenCoordinates.flattenLngLatArray\n      while (isActive && nextLocationIdx < flattenCoordinates.size()) {\n        val point = Point.fromLngLat(\n          flattenLngLatArray[nextLocationIdx * 2],\n          flattenLngLatArray[(nextLocationIdx * 2) + 1]\n        ).insertProgressInfo()\n        val bearing = TurfMeasurement.bearing(lastLocation, point)\n        lastLocation = point\n        nextLocationIdx++\n\n        withContext(Dispatchers.Main) {\n          locationConsumers.forEach { it.onLocationUpdated(point) }\n          locationConsumers.forEach { it.onBearingUpdated(bearing) }\n        }\n        delay(LOCATION_UPDATE_INTERVAL_MS)\n      }\n    }\n  }\n\n  // use altitude of Point to pass through progress data, and use internal animator to interpolate\n  // the progress, thus reduce the overhead to calculate the progress on each frame.\n  private fun Point.insertProgressInfo() = Point.fromLngLat(\n    longitude(),\n    latitude(),\n    TurfMeasurement.length(\n      TurfMisc.lineSlice(routeStartPoint, this, route),\n      TurfConstants.UNIT_CENTIMETERS\n    ) / totalRouteLength\n  )\n\n  private companion object {\n    const val LOCATION_UPDATE_INTERVAL_MS = 1000L\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/utils/StorageUtils.kt",
    "content": "package com.mapbox.maps.testapp.utils\n\nimport android.content.Context\nimport java.io.BufferedWriter\nimport java.io.File\nimport java.io.FileWriter\n\nclass StorageUtils(context: Context) {\n  private val directory: File = File(context.filesDir, LOG_DIR)\n    .apply { mkdirs() }\n\n  fun fileExists(fileName: String): Boolean {\n    val deviceInfo = File(directory, fileName)\n    return deviceInfo.exists() && deviceInfo.length() > 0\n  }\n\n  fun writeToFile(fileName: String, content: String) {\n    val file = File(directory, fileName).apply { delete() }\n    file.write(content)\n  }\n\n  private fun File.write(results: String) {\n    val fw = FileWriter(this, true)\n    val writer = BufferedWriter(fw)\n    writer.write(results)\n    writer.close()\n    fw.close()\n  }\n\n  companion object {\n    const val LOG_DIR = \"logs\"\n  }\n}"
  },
  {
    "path": "app/src/main/java/com/mapbox/maps/testapp/wallpaper/MapWallpaper.kt",
    "content": "package com.mapbox.maps.testapp.wallpaper\n\nimport android.content.Context\nimport android.service.wallpaper.WallpaperService\nimport android.util.Log\nimport android.view.SurfaceHolder\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\n\n/**\n * Example integration of rendering to a Surface.\n */\nclass MapWallpaper : WallpaperService() {\n\n  override fun onCreateEngine(): Engine {\n    return MapEngine(applicationContext)\n  }\n\n  inner class MapEngine(val context: Context) : Engine(), SurfaceHolder.Callback {\n\n    private lateinit var mapSurface: MapSurface\n    private lateinit var mapboxMap: MapboxMap\n\n    private var lightPreset: LightPresets = LightPresets.DAY\n      set(value) {\n        if (field != value) {\n          mapboxMap.getStyle { style ->\n            style.setStyleImportConfigProperty(\n              IMPORT_ID_FOR_STANDARD_STYLE,\n              \"lightPreset\",\n              value.value\n            )\n          }\n        }\n        field = value\n      }\n\n    override fun onCreate(surfaceHolder: SurfaceHolder) {\n      super.onCreate(surfaceHolder)\n      surfaceHolder.addCallback(this)\n\n      mapSurface = MapSurface(context, surfaceHolder.surface)\n      mapboxMap = mapSurface.mapboxMap\n\n      // Custom configuration\n      mapboxMap.loadStyle(Style.STANDARD) { style ->\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"showPlaceLabels\",\n          Value.valueOf(false)\n        )\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"showRoadLabels\",\n          Value.valueOf(false)\n        )\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"showPointInterestLabels\",\n          Value.valueOf(true)\n        )\n        style.setStyleImportConfigProperty(\n          IMPORT_ID_FOR_STANDARD_STYLE,\n          \"showTransitLabels\",\n          Value.valueOf(false)\n        )\n      }\n      mapboxMap.setCamera(\n        CameraOptions.Builder()\n          .center(TARGET)\n          .zoom(ZOOM_START)\n          .pitch(PITCH_START)\n          .bearing(BEARING_START)\n          .build()\n      )\n    }\n\n    override fun surfaceCreated(holder: SurfaceHolder) {\n      mapSurface.surfaceCreated()\n    }\n\n    override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {\n      mapSurface.surfaceChanged(width, height)\n    }\n\n    override fun surfaceDestroyed(holder: SurfaceHolder) {\n      mapSurface.surfaceDestroyed()\n    }\n\n    override fun onDestroy() {\n      super.onDestroy()\n      Log.i(TAG, \"onDestroy\")\n      mapSurface.onDestroy()\n    }\n\n    override fun onVisibilityChanged(visible: Boolean) {\n      super.onVisibilityChanged(visible)\n      Log.v(TAG, \"OnVisibilityChanged $visible\")\n      if (visible) {\n        mapSurface.onStart()\n      } else {\n        mapSurface.onStop()\n      }\n    }\n\n    override fun onOffsetsChanged(\n      xOffset: Float,\n      yOffset: Float,\n      xStep: Float,\n      yStep: Float,\n      xPixels: Int,\n      yPixels: Int\n    ) {\n      super.onOffsetsChanged(xOffset, yOffset, xStep, yStep, xPixels, yPixels)\n      val zoom = ZOOM_START + xOffset * (ZOOM_END - ZOOM_START)\n      val pitch = PITCH_START + xOffset * (PITCH_END - PITCH_START)\n      val bearing = BEARING_START + xOffset * (BEARING_END - BEARING_START)\n      mapboxMap.setCamera(\n        CameraOptions.Builder()\n          .center(TARGET)\n          .zoom(zoom)\n          .pitch(pitch)\n          .bearing(bearing)\n          .build()\n      )\n      lightPreset = when (xOffset) {\n        in 0f..0.25f -> LightPresets.DAY\n        in 0.25f..0.5f -> LightPresets.DAWN\n        in 0.5f..0.75f -> LightPresets.DUSK\n        else -> LightPresets.NIGHT\n      }\n    }\n  }\n\n  private enum class LightPresets(val value: Value) {\n    DAY(Value.valueOf(\"day\")),\n    DAWN(Value.valueOf(\"dawn\")),\n    DUSK(Value.valueOf(\"dusk\")),\n    NIGHT(Value.valueOf(\"night\"))\n  }\n\n  companion object {\n    private const val TAG = \"MapWallpaper\"\n    private const val ZOOM_START = 15.5\n    private const val PITCH_START = 40.0\n    private const val BEARING_START = 22.5\n    private val TARGET: Point = Point.fromLngLat(2.294694, 48.858093)\n\n    private const val ZOOM_END = 16.0\n    private const val PITCH_END = 60.0\n    private const val BEARING_END = 135.0\n\n    private const val IMPORT_ID_FOR_STANDARD_STYLE = \"basemap\"\n  }\n}"
  },
  {
    "path": "app/src/main/res/drawable/arrow_straight.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"48\"\n    android:viewportHeight=\"48\">\n  <group>\n    <clip-path\n        android:pathData=\"M0,0h48v48h-48z\"/>\n    <path\n        android:pathData=\"M20,14C20,12.895 20.895,12 22,12H26C27.105,12 28,12.895 28,14V46C28,47.105 27.105,48 26,48H22C20.895,48 20,47.105 20,46V14Z\"\n        android:fillColor=\"#3D3D3D\"/>\n    <path\n        android:pathData=\"M10.87,18.696L22.336,1.496C23.128,0.309 24.872,0.309 25.664,1.496L37.13,18.696C38.144,20.217 36.755,22.189 34.981,21.745L24.485,19.121C24.167,19.042 23.833,19.042 23.515,19.121L13.019,21.745C11.245,22.189 9.856,20.217 10.87,18.696Z\"\n        android:fillColor=\"#3D3D3D\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/bg_dva_eta.xml",
    "content": "<vector\n    android:viewportHeight=\"50\"\n    android:viewportWidth=\"100\"\n    android:height=\"50dp\"\n    android:width=\"100dp\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/primary\"\n        android:pathData=\"M0,0 L20,5 L85,5 Q90,5 90,10 L90,10 L90,40 Q90,45 85,45 L85,45 L15,45 Q10,45 10,40 L10,40 L10,10z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/bg_dva_parking.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"#FFFFFFFF\"/>\n    <corners android:radius=\"30dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/bg_rounded_corner.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"#FFFFFFFF\"/>\n    <padding\n            android:left=\"7.5dp\"\n            android:right=\"7.5dp\"\n            android:top=\"2dp\"\n            android:bottom=\"3dp\"/>\n    <corners android:radius=\"7.5dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/ic_airplanemode_active_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10.18,9\"/>\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21,16v-2l-8,-5V3.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S10,2.67 10,3.5V9l-8,5v2l8,-2.5V19l-2,1.5V22l3.5,-1 3.5,1v-1.5L13,19v-5.5l8,2.5z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_refresh_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_blue_marker.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"52dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"52\">\n  <path\n      android:pathData=\"M11.25,39.063a8.75,2.188 0,1 0,17.5 0a8.75,2.188 0,1 0,-17.5 0z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"0.3\"/>\n  <path\n      android:pathData=\"M27.917,29.259C31.504,25.178 35,21.201 35,15C35,6.716 28.284,0 20,0C11.716,0 5,6.716 5,15C5,21.201 8.496,25.178 12.083,29.259C14.655,32.183 17.273,35.161 18.685,39.051C18.888,39.608 19.406,40 20,40C20.594,40 21.112,39.608 21.315,39.051C22.727,35.161 25.345,32.183 27.917,29.259Z\"\n      android:fillColor=\"#3064F5\"/>\n  <path\n      android:pathData=\"M25.5,15C25.5,18.038 23.038,20.5 20,20.5C16.962,20.5 14.5,18.038 14.5,15C14.5,11.962 16.962,9.5 20,9.5C23.038,9.5 25.5,11.962 25.5,15Z\"\n      android:fillColor=\"#ffffff\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_callout_item_background.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <corners\n        android:radius=\"5dp\" />\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@android:color/white\" />\n    <solid android:color=\"@color/green\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/ic_cross.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"512\"\n    android:viewportWidth=\"512\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#000000\" android:pathData=\"M256.01,204.645l100.118,-100.146 51.344,51.33 -100.118,100.146 -51.344,-51.329z\"/>\n    <path android:fillColor=\"#000000\" android:pathData=\"M155.827,407.483l-51.344,-51.358 100.161,-100.132 51.344,51.358 -100.161,100.132z\"/>\n    <path android:fillColor=\"#000000\" android:pathData=\"M407.498,356.112l-51.373,51.358 -100.118,-100.146 51.373,-51.358 100.118,100.146z\"/>\n    <path android:fillColor=\"#000000\" android:pathData=\"M104.502,155.857l51.337,-51.351 100.153,100.125 -51.337,51.351 -100.153,-100.125z\"/>\n    <path android:fillColor=\"#000000\" android:pathData=\"M255.983,307.36l-51.351,-51.365 51.365,-51.351 51.351,51.365 -51.365,51.351z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_layers.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M11.99,18.54l-7.37,-5.73L3,14.07l9,7 9,-7 -1.63,-1.27 -7.38,5.74zM12,16l7.36,-5.73L21,9l-9,-7 -9,7 1.63,1.27L12,16z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_layers_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11.99,18.54l-7.37,-5.73L3,14.07l9,7 9,-7 -1.63,-1.27 -7.38,5.74zM12,16l7.36,-5.73L21,9l-9,-7 -9,7 1.63,1.27L12,16z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_layers_clear.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M19.81,14.99l1.19,-0.92 -1.43,-1.43 -1.19,0.92 1.43,1.43zM19.36,10.27L21,9l-9,-7 -2.91,2.27 7.87,7.88 2.4,-1.88zM3.27,1L2,2.27l4.22,4.22L3,9l1.63,1.27L12,16l2.1,-1.63 1.43,1.43L12,18.54l-7.37,-5.73L3,14.07l9,7 4.95,-3.85L20.73,21 22,19.73 3.27,1z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_legacy_callout.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <corners\n        android:radius=\"6dp\" />\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@android:color/darker_gray\" />\n    <solid android:color=\"@android:color/white\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/ic_paint.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M18,4V3c0,-0.55 -0.45,-1 -1,-1H5c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1V6h1v4H9v11c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-9h8V4h-3z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_red_marker.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"52dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"52\">\n  <path\n      android:pathData=\"M11.25,39.063a8.75,2.188 0,1 0,17.5 0a8.75,2.188 0,1 0,-17.5 0z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"0.3\"/>\n  <path\n      android:pathData=\"M27.917,29.259C31.504,25.178 35,21.201 35,15C35,6.716 28.284,0 20,0C11.716,0 5,6.716 5,15C5,21.201 8.496,25.178 12.083,29.259C14.655,32.183 17.273,35.161 18.685,39.051C18.888,39.608 19.406,40 20,40C20.594,40 21.112,39.608 21.315,39.051C22.727,35.161 25.345,32.183 27.917,29.259Z\"\n      android:fillColor=\"#EB252A\"/>\n  <path\n      android:pathData=\"M25.5,15C25.5,18.038 23.038,20.5 20,20.5C16.962,20.5 14.5,18.038 14.5,15C14.5,11.962 16.962,9.5 20,9.5C23.038,9.5 25.5,11.962 25.5,15Z\"\n      android:fillColor=\"#ffffff\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_swap_horiz_white_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M6.99,11L3,15l3.99,4v-3H14v-2H6.99v-3zM21,9l-3.99,-4v3H10v2h7.01v3L21,9z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_translate_white_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M12.87,15.07l-2.54,-2.51 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53L17,6L17,4h-7L10,2L8,2v2L1,4v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/mapbox_mylocation_bg_shape.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n\n    <solid android:color=\"@android:color/white\" />\n\n    <size\n        android:width=\"@dimen/mapbox_my_locationview_outer_circle\"\n        android:height=\"@dimen/mapbox_my_locationview_outer_circle\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable-hdpi/android_symbol.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"78.5885\"\n                android:endY=\"90.9159\"\n                android:startX=\"48.7653\"\n                android:startY=\"61.0927\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-hdpi/line_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <size\n        android:width=\"1dp\"\n        android:height=\"1dp\"/>\n\n    <solid android:color=\"@android:color/darker_gray\"/>\n\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable-mdpi/android_symbol.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"78.5885\"\n                android:endY=\"90.9159\"\n                android:startX=\"48.7653\"\n                android:startY=\"61.0927\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-mdpi/line_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <size\n        android:width=\"1dp\"\n        android:height=\"1dp\"/>\n\n    <solid android:color=\"@android:color/darker_gray\"/>\n\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable-xhdpi/android_symbol.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"78.5885\"\n                android:endY=\"90.9159\"\n                android:startX=\"48.7653\"\n                android:startY=\"61.0927\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-xhdpi/line_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <size\n        android:width=\"1dp\"\n        android:height=\"1dp\"/>\n\n    <solid android:color=\"@android:color/darker_gray\"/>\n\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable-xxhdpi/android_symbol.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"78.5885\"\n                android:endY=\"90.9159\"\n                android:startX=\"48.7653\"\n                android:startY=\"61.0927\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-xxhdpi/line_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <size\n        android:width=\"1dp\"\n        android:height=\"1dp\"/>\n\n    <solid android:color=\"@android:color/darker_gray\"/>\n\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable-xxxhdpi/android_symbol.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"78.5885\"\n                android:endY=\"90.9159\"\n                android:startX=\"48.7653\"\n                android:startY=\"61.0927\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-xxxhdpi/line_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <size\n        android:width=\"1dp\"\n        android:height=\"1dp\"/>\n\n    <solid android:color=\"@android:color/darker_gray\"/>\n\n</shape>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_add_marker_symbol.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"55.665957\"\n    mapbox:mapbox_cameraTargetLng=\"12.550343\"\n    mapbox:mapbox_cameraZoom=\"8\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_animated_imagesource.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"43.043493218594804\"\n    mapbox:mapbox_cameraTargetLng=\"-76.1255491524373\"\n    mapbox:mapbox_cameraZoom=\"6\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_animated_marker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"64.900932\"\n    mapbox:mapbox_cameraTargetLng=\"-18.167040\"\n    mapbox:mapbox_cameraZoom=\"4.5\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_annotation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progress\"\n        style=\"?android:attr/progressBarStyleLarge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:visibility=\"gone\"/>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/changeSlot\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"156dp\"\n        android:src=\"@drawable/ic_swap_horiz_white_24dp\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/deleteAll\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:src=\"@drawable/ic_clear\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/changeStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"86dp\"\n        android:src=\"@drawable/ic_layers\" />\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_camera_predefined_animators.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/constraint_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toTopOf=\"@id/spinnerView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <androidx.appcompat.widget.AppCompatSpinner\n        android:id=\"@+id/spinnerView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:entries=\"@array/interpolators_array\"\n        android:theme=\"@style/CameraPredefinedAnimationsActivityTheme\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n    <Button\n        android:id=\"@+id/buttonCancel\"\n        android:visibility=\"invisible\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"50dp\"\n        android:layout_marginBottom=\"20dp\"\n        android:padding=\"10dp\"\n        android:text=\"@string/cancel_animation\"\n        android:textSize=\"18sp\"\n        app:layout_constraintBottom_toTopOf=\"@id/spinnerView\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_custom_attribution.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:background=\"@color/simi_transparent_blue\"\n        android:orientation=\"vertical\">\n\n        <CheckedTextView\n            android:id=\"@+id/withImproveMap\"\n            style=\"@style/CustomAttributionCheckbox\"\n            android:text=\"@string/custom_attribution_withImproveMap\" />\n\n        <CheckedTextView\n            android:id=\"@+id/withCopyrightSign\"\n            style=\"@style/CustomAttributionCheckbox\"\n            android:text=\"@string/custom_attribution_withCopyrightSign\" />\n\n        <CheckedTextView\n            android:id=\"@+id/withTelemetryAttribution\"\n            style=\"@style/CustomAttributionCheckbox\"\n            android:text=\"@string/custom_attribution_withTelemetryAttribution\" />\n\n        <CheckedTextView\n            android:id=\"@+id/withMapboxAttribution\"\n            style=\"@style/CustomAttributionCheckbox\"\n            android:text=\"@string/custom_attribution_withMapboxAttribution\" />\n\n        <CheckedTextView\n            android:id=\"@+id/withMapboxPrivacyPolicy\"\n            style=\"@style/CustomAttributionCheckbox\"\n            android:text=\"@string/custom_attribution_withMapboxAttribution\" />\n    </LinearLayout>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/custom_attribution_fab\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:src=\"@drawable/ic_baseline_refresh_24\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_custom_layer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/coordinator_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fab\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_margin=\"@dimen/fab_margin\"\n        android:src=\"@drawable/ic_layers\"\n        android:tint=\"@color/primary\"\n        app:backgroundTint=\"@android:color/white\"/>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_custom_raster_source.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/refreshBtn\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:src=\"@drawable/ic_baseline_refresh_24\"\n        android:contentDescription=\"refresh\"\n        tools:ignore=\"HardcodedText\" />\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_dds_draw_polygon.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/pattern_fab\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:contentDescription=\"@null\"\n        android:src=\"@drawable/pattern\" />\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_dds_moving_icon_with_trailing_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"9.014140\"\n    mapbox:mapbox_cameraTargetLng=\"38.754359\"\n    mapbox:mapbox_cameraZoom=\"12.580466\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_debug.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHeight_default=\"percent\"\n        app:layout_constraintHeight_percent=\"0.5\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:mapbox_scaleBarBorderWidth=\"1dp\"\n        app:mapbox_scaleBarHeight=\"3dp\"\n        app:mapbox_scaleBarMarginLeft=\"5dp\"\n        app:mapbox_scaleBarMarginTop=\"5dp\"\n        app:mapbox_scaleBarPrimaryColor=\"@color/white\"\n        app:mapbox_scaleBarSecondaryColor=\"@color/design_default_color_on_secondary\"\n        app:mapbox_scaleBarTextBarMargin=\"5dp\"\n        app:mapbox_scaleBarTextBorderWidth=\"1dp\"\n        app:mapbox_scaleBarTextColor=\"@color/accent\"\n        app:mapbox_scaleBarTextSize=\"10dp\"\n        tools:context=\".examples.SimpleMapActivity\" />\n\n    <TextView\n        android:id=\"@+id/fpsView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:padding=\"10dp\"\n        android:textColor=\"@color/green\"\n        android:textSize=\"18sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"30 FPS\" />\n\n    <Button\n        android:id=\"@+id/perfStatButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"10dp\"\n        android:textSize=\"18sp\"\n        android:text=\"Collect Perf Stats\"\n        android:layout_marginStart=\"12dp\"\n        android:layout_marginBottom=\"12dp\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        tools:ignore=\"HardcodedText\" />\n\n    <Button\n        android:id=\"@+id/screenShapeButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"10dp\"\n        android:textSize=\"18sp\"\n        android:text=\"Hex screen\"\n        android:layout_marginEnd=\"12dp\"\n        android:layout_marginBottom=\"12dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        tools:ignore=\"HardcodedText\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_dynamic_view_annotations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <androidx.appcompat.widget.AppCompatButton\n        android:id=\"@+id/btn_mode\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"16dp\"\n        android:textColor=\"@color/white\"\n        android:backgroundTint=\"@color/mapbox_blue\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        tools:text=\"Mode : overview\"\n        tools:backgroundTint=\"@color/blue\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_edge_to_edge.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_empty_fab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <FrameLayout\n        android:id=\"@+id/container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <Button\n        android:id=\"@+id/displayOnSecondDisplayButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"58dp\"\n        android:text=\"REPLACE WITH EMPTY FRAGMENT\"\n        android:layout_gravity=\"bottom\"\n        android:layout_marginTop=\"64dp\"\n        tools:ignore=\"HardcodedText\" />\n    <Button\n        android:id=\"@+id/fragmentButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"58dp\"\n        android:text=\"REPLACE WITH NEW FRAGMENT\"\n        android:layout_gravity=\"bottom\"\n        android:layout_marginBottom=\"64dp\"\n        tools:ignore=\"HardcodedText\" />\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_example_overview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/root_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:id=\"@+id/sdkVersions\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"12dp\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Caption\"\n        android:textSize=\"10sp\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:ignore=\"SmallSp\"\n        tools:text=\"Maps core SDK: X.Y.Z (abcdefg123); Common SDK: X.Y.Z (abcdefg123)\" />\n\n    <EditText\n        android:id=\"@+id/example_search_edittext\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:hint=\"@string/search_edittext_hint\"\n        android:importantForAutofill=\"no\"\n        android:inputType=\"text\"\n        android:singleLine=\"true\"\n        app:layout_constraintEnd_toStartOf=\"@+id/clear_search_imageview\"\n        app:layout_constraintHorizontal_bias=\"0.5\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/sdkVersions\" />\n\n    <ImageView\n        android:id=\"@+id/clear_search_imageview\"\n        android:layout_width=\"30dp\"\n        android:layout_height=\"30dp\"\n        android:src=\"@drawable/ic_clear\"\n        android:visibility=\"invisible\"\n        tools:visibility=\"visible\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/example_search_edittext\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.5\"\n        app:layout_constraintStart_toEndOf=\"@+id/example_search_edittext\"\n        app:layout_constraintTop_toTopOf=\"@+id/example_search_edittext\"\n        android:contentDescription=\"@string/clear_search_imageview_content_description\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/recyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:scrollbars=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/example_search_edittext\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_extended_geofencing.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".examples.geofence.ExtendedGeofencingActivity\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/progress\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:background=\"#667D7F80\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:visibility=\"visible\">\n\n        <ProgressBar\n            style=\"?android:attr/progressBarStyleHorizontal\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"false\"\n            android:indeterminate=\"true\"\n            android:progressTint=\"@android:color/holo_orange_dark\"\n            android:visibility=\"visible\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:visibility=\"visible\" />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n\n    <TextView\n        android:id=\"@+id/text_geofences_disabled\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"20dp\"\n        android:background=\"@color/design_default_color_secondary\"\n        android:padding=\"8dp\"\n        android:text=\"User consent revoked\"\n        android:textAppearance=\"@style/TextAppearance.MaterialComponents.Button\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        tools:visibility=\"visible\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_feature_state.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <androidx.appcompat.widget.LinearLayoutCompat\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"10dp\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"#97cdcfd3\"\n        android:orientation=\"vertical\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/magnitude\" />\n\n            <TextView\n                android:id=\"@+id/magnitude\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/location\" />\n\n            <TextView\n                android:id=\"@+id/location\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/date\" />\n\n            <TextView\n                android:id=\"@+id/date\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"\" />\n        </LinearLayout>\n\n    </androidx.appcompat.widget.LinearLayoutCompat>\n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_fill_extrusion.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fabLightPosition\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"82dp\"\n        android:src=\"@drawable/ic_clear\"\n        app:backgroundTint=\"@color/accent\"\n        app:layout_anchorGravity=\"top\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fabLightColor\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_margin=\"16dp\"\n        android:src=\"@drawable/ic_paint\"\n        app:backgroundTint=\"@color/primary\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_gestures.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/recycler\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"#97cdcfd3\" />\n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_globe_custom_layer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/coordinator_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fabSwapVisibility\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_margin=\"@dimen/fab_margin\"\n        android:src=\"@drawable/ic_layers\"\n        android:tint=\"@color/primary\"\n        app:backgroundTint=\"@android:color/white\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_heatmap_layer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"50\"\n    mapbox:mapbox_cameraTargetLng=\"-120\"\n    mapbox:mapbox_cameraZoom=\"2\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_icon_property.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\" 37.761\"\n    mapbox:mapbox_cameraTargetLng=\"-119.624\"\n    mapbox:mapbox_cameraZoom=\"10.0\" />\n"
  },
  {
    "path": "app/src/main/res/layout/activity_image_source.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"25.7845\"\n    mapbox:mapbox_cameraTargetLng=\"-80.1263\"\n    mapbox:mapbox_cameraZoom=\"12\" />\n"
  },
  {
    "path": "app/src/main/res/layout/activity_indoor_example.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        android:background=\"#E0FFFFFF\"\n        android:padding=\"8dp\"\n        android:layout_gravity=\"bottom\">\n\n        <EditText\n            android:id=\"@+id/styleInput\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:hint=\"Style URI or JSON\"\n            android:text=\"mapbox://styles/mapbox/standard\"\n            android:inputType=\"textUri\"\n            android:singleLine=\"true\" />\n\n        <Button\n            android:id=\"@+id/loadStyleButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Load\" />\n    </LinearLayout>\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_inset_map.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <androidx.cardview.widget.CardView\n        android:id=\"@+id/cardview\"\n        android:layout_width=\"150dp\"\n        android:layout_height=\"150dp\"\n        android:layout_gravity=\"bottom|end\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"90dp\">\n\n        <FrameLayout\n            android:id=\"@+id/mini_map_fragment_container\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n    </androidx.cardview.widget.CardView>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/show_bounds_toggle_fab\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:src=\"@drawable/ic_swap_horiz_white_24dp\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_interactive_3d_model_source.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <!-- Control panel at bottom -->\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/controlPanel\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"16dp\"\n        app:cardCornerRadius=\"12dp\"\n        app:cardElevation=\"4dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\">\n\n            <!-- Vehicle color row -->\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"horizontal\">\n\n                <TextView\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:text=\"Vehicle color\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textSize=\"14sp\" />\n\n                <View\n                    android:id=\"@+id/colorPickerButton\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:background=\"@drawable/bg_rounded_corner\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\" />\n\n            </LinearLayout>\n\n            <!-- Trunk -->\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"24dp\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"horizontal\">\n\n                <TextView\n                    android:layout_width=\"80dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"Trunk\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textSize=\"12sp\" />\n\n                <SeekBar\n                    android:id=\"@+id/seekBarTrunk\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:max=\"100\"\n                    android:progress=\"0\" />\n\n            </LinearLayout>\n\n            <!-- Hood -->\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"24dp\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"horizontal\">\n\n                <TextView\n                    android:layout_width=\"80dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"Hood\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textSize=\"12sp\" />\n\n                <SeekBar\n                    android:id=\"@+id/seekBarHood\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:max=\"100\"\n                    android:progress=\"0\" />\n\n            </LinearLayout>\n\n            <!-- Front left door -->\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"24dp\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"horizontal\">\n\n                <TextView\n                    android:layout_width=\"80dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"Left door\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textSize=\"12sp\" />\n\n                <SeekBar\n                    android:id=\"@+id/seekBarDoorLeft\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:max=\"100\"\n                    android:progress=\"50\" />\n\n            </LinearLayout>\n\n            <!-- Front right door -->\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"24dp\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"horizontal\">\n\n                <TextView\n                    android:layout_width=\"80dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"Right door\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textSize=\"12sp\" />\n\n                <SeekBar\n                    android:id=\"@+id/seekBarDoorRight\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:max=\"100\"\n                    android:progress=\"0\" />\n\n            </LinearLayout>\n\n            <!-- Brake lights -->\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"24dp\"\n                android:layout_marginBottom=\"16dp\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"horizontal\">\n\n                <TextView\n                    android:layout_width=\"80dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"Brake lights\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textSize=\"12sp\" />\n\n                <SeekBar\n                    android:id=\"@+id/seekBarBrake\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:max=\"100\"\n                    android:progress=\"0\" />\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n    </com.google.android.material.card.MaterialCardView>\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_javaservices_snaking_directions_route.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"47.097562\"\n    mapbox:mapbox_cameraTargetLng=\"3.709416\"\n    mapbox:mapbox_cameraZoom=\"5.991072\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_legacy_offline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    <ProgressBar\n        android:id=\"@+id/download_progress\"\n        style=\"?android:attr/progressBarStyleLarge\"\n        android:layout_width=\"50dp\"\n        android:layout_height=\"50dp\"\n        android:layout_gravity=\"center\"\n        android:clickable=\"false\"\n        android:indeterminate=\"true\" />\n\n    <Button\n        android:id=\"@+id/show_map_button\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:text=\"@string/view_map\"\n        android:visibility=\"gone\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_line_gradient.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        mapbox:mapbox_cameraTargetLat=\"38.875\"\n        mapbox:mapbox_cameraTargetLng=\"-77.035\"\n        mapbox:mapbox_cameraZoom=\"12\" />\n\n    <androidx.appcompat.widget.AppCompatButton\n        android:id=\"@+id/trimOffsetButton\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/trim_offset\"\n        mapbox:layout_constraintBottom_toBottomOf=\"parent\"\n        mapbox:layout_constraintEnd_toEndOf=\"parent\"\n        mapbox:layout_constraintStart_toStartOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_location_component.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_locationComponentEnabled = \"true\"\n    mapbox:mapbox_locationComponentPuckBearing = \"heading\"\n    tools:context=\".examples.LocationComponentActivity\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_location_component_animation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_locationComponentEnabled=\"true\"\n    mapbox:mapbox_locationComponentPulsingEnabled=\"true\"\n    mapbox:mapbox_locationComponentPulsingMaxRadius=\"25dp\"\n    tools:context=\".examples.LocationComponentActivity\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_location_layer_basic_pulsing_circle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_locationComponentEnabled = \"true\"\n    mapbox:mapbox_locationComponentPulsingEnabled = \"true\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_map_localization.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginBottom=\"0dp\"\n        mapbox:mapbox_cameraTargetLat=\"46.49839225859763\"\n        mapbox:mapbox_cameraTargetLng=\"4.658203125\"\n        mapbox:mapbox_cameraZoom=\"3\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fabStyles\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"8dp\"\n        android:layout_marginEnd=\"16dp\"\n        app:srcCompat=\"@drawable/ic_layers\"\n        android:tint=\"@android:color/white\"\n        app:backgroundTint=\"@color/accent\"\n        app:fabSize=\"normal\"\n        app:layout_constraintBottom_toTopOf=\"@id/fabLocalize\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"/>\n\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fabLocalize\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        app:srcCompat=\"@drawable/ic_translate_white_24dp\"\n        app:backgroundTint=\"@color/primary\"\n        app:fabSize=\"normal\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"/>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_map_overlay.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginBottom=\"0dp\"\n        mapbox:mapbox_cameraTargetLat=\"42.353517\"\n        mapbox:mapbox_cameraTargetLng=\"-71.078625\"\n        mapbox:mapbox_cameraZoom=\"12\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/location_top_left\"\n        style=\"@style/MapOverlayStyle\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/location_top_right\"\n        style=\"@style/MapOverlayStyle\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/location_bottom_left\"\n        style=\"@style/MapOverlayStyle\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/location_bottom_right\"\n        style=\"@style/MapOverlayStyle\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/reframe_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"116dp\"\n        android:src=\"@drawable/ic_baseline_refresh_24\"\n        app:backgroundTint=\"@color/primary\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_map_view_customization.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/rootLayout\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"\n        app:mapbox_cameraTargetLat=\"52.52\"\n        app:mapbox_cameraTargetLng=\"13.4050\"\n        app:mapbox_cameraPitch=\"65\"\n        app:mapbox_cameraZoom=\"15\"\n        app:mapbox_mapOrientation=\"downwards\"\n        app:mapbox_mapSurface=\"surface_view\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_mapview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_multi_display.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".examples.MultiDisplayActivity\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        android:orientation=\"vertical\"\n        android:gravity=\"center\"\n        android:layout_marginBottom=\"10dp\">\n\n        <Button\n            android:id=\"@+id/displayOnSecondDisplayButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"10dp\"\n            android:text=\"@string/display_the_second_screen\" />\n\n        <Button\n            android:id=\"@+id/moveCameraButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/move_camera\" />\n\n    </LinearLayout>\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_multi_map.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:ignore=\"NestedWeights\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_weight=\"0.5\"\n        android:baselineAligned=\"false\"\n        android:orientation=\"horizontal\">\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/map1\"\n            android:name=\"com.mapbox.maps.testapp.examples.fragment.MapFragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"0.5\" />\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/map2\"\n            android:name=\"com.mapbox.maps.testapp.examples.fragment.MapFragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"0.5\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_weight=\"0.5\"\n        android:baselineAligned=\"false\"\n        android:orientation=\"horizontal\">\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/map3\"\n            android:name=\"com.mapbox.maps.testapp.examples.fragment.MapFragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"0.5\" />\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/map4\"\n            android:name=\"com.mapbox.maps.testapp.examples.fragment.MapFragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"0.5\" />\n    </LinearLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_multiple_geometries.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLng=\"-77.039679\"\n    mapbox:mapbox_cameraTargetLat=\"38.897435\"\n    mapbox:mapbox_cameraZoom=\"11.3\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_offline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"fill_parent\">\n\n    <LinearLayout\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"fill_parent\"\n        android:orientation=\"vertical\"\n        android:weightSum=\"10\">\n\n        <FrameLayout\n            android:id=\"@+id/container\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"6\" />\n\n        <LinearLayout\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:paddingLeft=\"10dp\"\n            android:paddingRight=\"10dp\"\n            android:weightSum=\"10\">\n\n            <TextView\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"2\"\n                android:gravity=\"center\"\n                android:text=\"@string/satellite_style_pack\"\n                android:textSize=\"12sp\" />\n\n            <ProgressBar\n                android:id=\"@+id/satellite_standard_style_pack_download_progress\"\n                style=\"?android:attr/progressBarStyleHorizontal\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\"\n                android:layout_weight=\"8\"\n                android:clickable=\"false\"\n                android:indeterminate=\"false\"\n                android:progressTint=\"@android:color/holo_orange_dark\"\n                android:max=\"100\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:paddingLeft=\"10dp\"\n            android:paddingRight=\"10dp\"\n            android:weightSum=\"10\">\n\n            <TextView\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"2\"\n                android:text=\"@string/standard_style_pack\"\n                android:textSize=\"12sp\"\n                android:gravity=\"center\"\n                />\n\n            <ProgressBar\n                android:id=\"@+id/standard_style_pack_download_progress\"\n                style=\"?android:attr/progressBarStyleHorizontal\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\"\n                android:layout_weight=\"8\"\n                android:clickable=\"false\"\n                android:indeterminate=\"false\"\n                android:progressTint=\"@android:color/holo_orange_dark\"\n                android:max=\"100\" />\n        </LinearLayout>\n\n\n        <LinearLayout\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:paddingLeft=\"10dp\"\n            android:paddingRight=\"10dp\"\n            android:weightSum=\"10\">\n\n            <TextView\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"2\"\n                android:gravity=\"center\"\n                android:textSize=\"12sp\"\n                android:text=\"@string/tile_region\" />\n\n            <ProgressBar\n                android:id=\"@+id/tile_pack_download_progress\"\n                style=\"?android:attr/progressBarStyleHorizontal\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"8\"\n                android:layout_gravity=\"center\"\n                android:clickable=\"false\"\n                android:indeterminate=\"false\"\n                android:progressTint=\"@android:color/holo_purple\"\n                android:max=\"100\" />\n        </LinearLayout>\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recycler\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"4\"\n            android:background=\"#97cdcfd3\" />\n    </LinearLayout>\n\n    <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton\n        android:id=\"@+id/button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\" />\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_precipitations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton\n        android:id=\"@+id/toggle_rain\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"82dp\"\n        android:text=\"Toggle rain\"\n        app:backgroundTint=\"@color/accent\"\n        app:layout_anchorGravity=\"top\"\n        tools:ignore=\"HardcodedText\" />\n\n    <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton\n        android:id=\"@+id/toggle_snow\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_margin=\"16dp\"\n        android:text=\"Toggle snow\"\n        app:backgroundTint=\"@color/primary\"\n        tools:ignore=\"HardcodedText\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_recycler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/recyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_restrict_bounds.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        mapbox:mapbox_cameraTargetLat=\"37.742646\"\n        mapbox:mapbox_cameraTargetLng=\" -122.433247\"\n        mapbox:mapbox_cameraZoom=\"12\"/>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_rts_fill_pattern_tint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".examples.linesandpolygons.DrawGeoJsonLineActivity\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        mapbox:mapbox_cameraTargetLat=\"37.785301\"\n        mapbox:mapbox_cameraTargetLng=\"-122.395922\"\n        mapbox:mapbox_cameraZoom=\"16\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fabPaint\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_margin=\"16dp\"\n        android:src=\"@drawable/ic_paint\"\n        mapbox:backgroundTint=\"@color/primary\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_scale_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    app:mapbox_cameraTargetLat=\"61.489557808394814\"\n    app:mapbox_cameraTargetLng=\"23.735379149896005\"\n    app:mapbox_cameraZoom=\"14.940602577615023\"\n\n    app:mapbox_scaleBarBorderWidth=\"1dp\"\n    app:mapbox_scaleBarHeight=\"5dp\"\n    app:mapbox_scaleBarGravity=\"bottom|center_horizontal\"\n    app:mapbox_scaleBarDistanceUnits=\"metric\"\n    app:mapbox_scaleBarMarginBottom=\"50dp\"\n    app:mapbox_scaleBarMarginRight=\"0dp\"\n    app:mapbox_scaleBarPrimaryColor=\"@android:color/black\"\n    app:mapbox_scaleBarRatio=\"0.8\"\n    app:mapbox_scaleBarSecondaryColor=\"@android:color/white\"\n    app:mapbox_scaleBarShowTextBorder=\"true\"\n    app:mapbox_scaleBarTextBarMargin=\"10dp\"\n    app:mapbox_scaleBarTextBorderWidth=\"5dp\"\n    app:mapbox_scaleBarTextColor=\"@android:color/black\"\n    app:mapbox_scaleBarTextSize=\"10dp\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_secondary_display.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".examples.SecondaryDisplayActivity\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <Button\n        android:id=\"@+id/moveCameraButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginBottom=\"10dp\"\n        android:text=\"@string/move_camera\" />\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_secondary_display_presentation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".examples.SecondaryDisplayPresentationActivity\">\n\n    <TextView\n        android:visibility=\"gone\"\n        android:id=\"@+id/display_none\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"No secondary displays available.\"\n        android:textSize=\"20sp\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_show_hide_layers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        mapbox:mapbox_cameraTargetLat=\"-13.517379300798098\"\n        mapbox:mapbox_cameraTargetLng=\"-71.97722138410576\"\n        mapbox:mapbox_cameraZoom=\"15\"/>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fab_layer_toggle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_margin=\"16dp\"\n        android:src=\"@drawable/ic_layers_24dp\"\n        tools:backgroundTint=\"@color/pink\"/>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_simple_geofencing.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".examples.geofence.ExtendedGeofencingActivity\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/text_geofences_disabled\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"20dp\"\n        android:background=\"@color/design_default_color_secondary\"\n        android:padding=\"8dp\"\n        android:text=\"User consent revoked\"\n        android:textAppearance=\"@style/TextAppearance.MaterialComponents.Button\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        tools:visibility=\"visible\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_sky_layer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        mapbox:mapbox_cameraPitch=\"85\"\n        mapbox:mapbox_cameraTargetLat=\"60.192\"\n        mapbox:mapbox_cameraTargetLng=\"24.946\"\n        mapbox:mapbox_cameraZoom=\"3.05\" />\n\n    <TextView\n        android:id=\"@+id/textSkyMode\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"14sp\"\n        android:textColor=\"@android:color/black\"\n        android:layout_marginStart=\"10dp\"\n        android:layout_marginTop=\"10dp\"\n        mapbox:layout_constraintStart_toStartOf=\"parent\"\n        mapbox:layout_constraintTop_toTopOf=\"parent\" />\n\n    <com.google.android.material.switchmaterial.SwitchMaterial\n        android:id=\"@+id/switchSkyMode\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:layout_marginTop=\"10dp\"\n        mapbox:layout_constraintStart_toEndOf=\"@id/textSkyMode\"\n        mapbox:layout_constraintTop_toTopOf=\"parent\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/layoutGradient\"\n        android:layout_width=\"300dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:visibility=\"visible\"\n        mapbox:layout_constraintStart_toStartOf=\"parent\"\n        mapbox:layout_constraintTop_toBottomOf=\"@id/switchSkyMode\">\n\n        <TextView\n            android:id=\"@+id/captionGradientRadius\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:maxLines=\"1\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"12sp\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintBottom_toBottomOf=\"@id/seekBarGradientRadius\"\n            mapbox:layout_constraintStart_toStartOf=\"parent\"\n            mapbox:layout_constraintTop_toTopOf=\"@id/seekBarGradientRadius\" />\n\n        <SeekBar\n            android:id=\"@+id/seekBarGradientRadius\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dp\"\n            android:max=\"180\"\n            android:progress=\"10\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintEnd_toEndOf=\"parent\"\n            mapbox:layout_constraintStart_toEndOf=\"@id/captionGradientRadius\"\n            mapbox:layout_constraintTop_toTopOf=\"parent\" />\n\n        <TextView\n            android:id=\"@+id/captionGradientCenterA\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:maxLines=\"1\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"12sp\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintBottom_toBottomOf=\"@id/seekBarGradientCenterA\"\n            mapbox:layout_constraintStart_toStartOf=\"parent\"\n            mapbox:layout_constraintTop_toTopOf=\"@id/seekBarGradientCenterA\" />\n\n        <SeekBar\n            android:id=\"@+id/seekBarGradientCenterA\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dp\"\n            android:max=\"360\"\n            android:progress=\"180\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintEnd_toEndOf=\"parent\"\n            mapbox:layout_constraintStart_toEndOf=\"@id/captionGradientCenterA\"\n            mapbox:layout_constraintTop_toBottomOf=\"@id/seekBarGradientRadius\" />\n\n        <TextView\n            android:id=\"@+id/captionGradientCenterP\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:maxLines=\"1\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"12sp\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintBottom_toBottomOf=\"@id/seekBarGradientCenterP\"\n            mapbox:layout_constraintStart_toStartOf=\"parent\"\n            mapbox:layout_constraintTop_toTopOf=\"@id/seekBarGradientCenterP\" />\n\n        <SeekBar\n            android:id=\"@+id/seekBarGradientCenterP\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dp\"\n            android:max=\"180\"\n            android:progress=\"90\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintEnd_toEndOf=\"parent\"\n            mapbox:layout_constraintStart_toEndOf=\"@id/captionGradientCenterP\"\n            mapbox:layout_constraintTop_toBottomOf=\"@id/seekBarGradientCenterA\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/layoutAtmosphere\"\n        android:layout_width=\"300dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:visibility=\"gone\"\n        mapbox:layout_constraintStart_toStartOf=\"parent\"\n        mapbox:layout_constraintTop_toBottomOf=\"@id/switchSkyMode\">\n\n        <TextView\n            android:id=\"@+id/captionAtmosphereSunIntensity\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:maxLines=\"1\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"12sp\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintBottom_toBottomOf=\"@id/seekBarAtmosphereSunIntensity\"\n            mapbox:layout_constraintStart_toStartOf=\"parent\"\n            mapbox:layout_constraintTop_toTopOf=\"@id/seekBarAtmosphereSunIntensity\" />\n\n        <SeekBar\n            android:id=\"@+id/seekBarAtmosphereSunIntensity\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dp\"\n            android:max=\"100\"\n            android:progress=\"10\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintEnd_toEndOf=\"parent\"\n            mapbox:layout_constraintStart_toEndOf=\"@id/captionAtmosphereSunIntensity\"\n            mapbox:layout_constraintTop_toTopOf=\"parent\" />\n\n        <TextView\n            android:id=\"@+id/captionAtmosphereCenterA\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:maxLines=\"1\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"12sp\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintBottom_toBottomOf=\"@id/seekBarAtmosphereCenterA\"\n            mapbox:layout_constraintStart_toStartOf=\"parent\"\n            mapbox:layout_constraintTop_toTopOf=\"@id/seekBarAtmosphereCenterA\" />\n\n        <SeekBar\n            android:id=\"@+id/seekBarAtmosphereCenterA\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dp\"\n            android:max=\"360\"\n            android:progress=\"180\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintEnd_toEndOf=\"parent\"\n            mapbox:layout_constraintStart_toEndOf=\"@id/captionAtmosphereCenterA\"\n            mapbox:layout_constraintTop_toBottomOf=\"@id/seekBarAtmosphereSunIntensity\" />\n\n        <TextView\n            android:id=\"@+id/captionAtmosphereCenterP\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:maxLines=\"1\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"12sp\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintBottom_toBottomOf=\"@id/seekBarAtmosphereCenterP\"\n            mapbox:layout_constraintStart_toStartOf=\"parent\"\n            mapbox:layout_constraintTop_toTopOf=\"@id/seekBarAtmosphereCenterP\" />\n\n        <SeekBar\n            android:id=\"@+id/seekBarAtmosphereCenterP\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dp\"\n            android:max=\"180\"\n            android:progress=\"90\"\n            mapbox:layout_constrainedWidth=\"true\"\n            mapbox:layout_constraintEnd_toEndOf=\"parent\"\n            mapbox:layout_constraintStart_toEndOf=\"@id/captionAtmosphereCenterP\"\n            mapbox:layout_constraintTop_toBottomOf=\"@id/seekBarAtmosphereCenterA\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_sky_snapshotter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        mapbox:mapbox_cameraPitch=\"85\"\n        mapbox:mapbox_cameraTargetLat=\"60.192\"\n        mapbox:mapbox_cameraTargetLng=\"24.946\"\n        mapbox:mapbox_cameraZoom=\"3.05\" />\n\n    <TextView\n        android:id=\"@+id/maneuverCaption\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"10dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/sky_snapshotter_maneuver\"\n        android:textSize=\"25sp\"\n        android:textStyle=\"bold\"\n        android:visibility=\"invisible\"\n        mapbox:layout_constraintEnd_toEndOf=\"@id/maneuverView\"\n        mapbox:layout_constraintStart_toStartOf=\"@id/maneuverView\"\n        mapbox:layout_constraintTop_toBottomOf=\"@id/maneuverView\" />\n\n    <ImageView\n        android:id=\"@+id/maneuverView\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"200dp\"\n        android:layout_margin=\"10dp\"\n        android:adjustViewBounds=\"true\"\n        android:contentDescription=\"@string/sky_snapshotter_maneuver\"\n        mapbox:layout_constraintEnd_toEndOf=\"parent\"\n        mapbox:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_slot_layer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/addOrRemoveSlotLayer\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:src=\"@drawable/ic_layers_clear\" />\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_standard_style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fab3dObjectsSetting\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"214dp\"\n        android:contentDescription=\"3dObjects: \"\n        android:src=\"@android:drawable/ic_popup_reminder\"\n        app:backgroundTint=\"@color/blue\"\n        app:layout_anchorGravity=\"top\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fabThemeSetting\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"148dp\"\n        android:contentDescription=\"Theme: \"\n        android:src=\"@android:drawable/ic_menu_mapmode\"\n        app:backgroundTint=\"@color/accent\"\n        app:layout_anchorGravity=\"top\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fabLightSetting\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"82dp\"\n        android:contentDescription=\"LightPreset: \"\n        android:src=\"@android:drawable/ic_menu_view\"\n        app:backgroundTint=\"@color/red\"\n        app:layout_anchorGravity=\"top\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fabLabelsSetting\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_margin=\"16dp\"\n        android:contentDescription=\"Label visibility: \"\n        android:src=\"@android:drawable/ic_dialog_info\"\n        app:backgroundTint=\"@color/primary\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_style_mapbox_studio.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"41.89010\"\n    mapbox:mapbox_cameraTargetLng=\"12.49200\"\n    mapbox:mapbox_cameraZoom=\"15\"\n    mapbox:mapbox_styleUri=\"mapbox://styles/mapbox/cj3kbeqzo00022smj7akz3o1e\"\n    tools:context=\".examples.MapboxStudioStyleActivity\" />\n"
  },
  {
    "path": "app/src/main/res/layout/activity_style_switch.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".examples.StyleSwitchActivity\">\n\n    <Button\n        android:id=\"@+id/light_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"@string/menu_map_style_light\"\n        android:textAllCaps=\"false\"\n        app:layout_constraintEnd_toStartOf=\"@+id/streets_button\"\n        app:layout_constraintHorizontal_bias=\"0.5\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@+id/guideline\" />\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toTopOf=\"@+id/guideline\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"1.0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_bias=\"0.0\"\n        app:mapbox_attributionEnabled=\"true\"\n        app:mapbox_attributionGravity=\"top|right\"\n        app:mapbox_attributionMarginBottom=\"32dp\"\n        app:mapbox_attributionMarginLeft=\"32dp\"\n        app:mapbox_attributionMarginRight=\"32dp\"\n        app:mapbox_attributionMarginTop=\"32dp\"\n        app:mapbox_compassEnabled=\"true\"\n        app:mapbox_compassFadeWhenFacingNorth=\"false\"\n        app:mapbox_compassGravity=\"left|top\"\n        app:mapbox_compassImage=\"@drawable/custom_compass\"\n        app:mapbox_compassMarginBottom=\"32dp\"\n        app:mapbox_compassMarginLeft=\"32dp\"\n        app:mapbox_compassMarginRight=\"32dp\"\n        app:mapbox_compassMarginTop=\"32dp\"\n        app:mapbox_gesturesDoubleTapToZoomInEnabled=\"true\"\n        app:mapbox_gesturesPinchToZoomEnabled=\"true\"\n        app:mapbox_gesturesPitchEnabled=\"true\"\n        app:mapbox_gesturesQuickZoomEnabled=\"true\"\n        app:mapbox_gesturesRotateEnabled=\"true\"\n        app:mapbox_gesturesScrollEnabled=\"true\"\n        app:mapbox_logoEnabled=\"true\"\n        app:mapbox_logoGravity=\"bottom|right\"\n        app:mapbox_logoMarginBottom=\"32dp\"\n        app:mapbox_logoMarginLeft=\"32dp\"\n        app:mapbox_logoMarginRight=\"32dp\"\n        app:mapbox_logoMarginTop=\"32dp\" />\n\n    <Button\n        android:id=\"@+id/custom_style_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"@string/menu_map_style_custom_style\"\n        android:textAllCaps=\"false\"\n        app:layout_constraintEnd_toEndOf=\"@+id/streets_button\"\n        app:layout_constraintStart_toStartOf=\"@+id/streets_button\"\n        app:layout_constraintTop_toBottomOf=\"@+id/streets_button\" />\n\n    <Button\n        android:id=\"@+id/satellite_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/menu_map_style_satellite\"\n        android:textAllCaps=\"false\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@+id/custom_style_button\"\n        app:layout_constraintStart_toStartOf=\"@+id/custom_style_button\"\n        app:layout_constraintTop_toTopOf=\"@+id/outdoors_button\"\n        app:layout_constraintVertical_bias=\"0.0\" />\n\n    <Button\n        android:id=\"@+id/standard_satellite_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"@string/menu_map_style_standard_satellite\"\n        android:textAllCaps=\"false\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@+id/satellite_button\"\n        app:layout_constraintStart_toStartOf=\"@+id/satellite_button\"\n        app:layout_constraintTop_toBottomOf=\"@+id/satellite_button\"\n        app:layout_constraintVertical_bias=\"0.0\" />\n\n    <Button\n        android:id=\"@+id/dark_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"@string/menu_map_style_dark\"\n        android:textAllCaps=\"false\"\n        app:layout_constraintStart_toStartOf=\"@+id/light_button\"\n        app:layout_constraintTop_toBottomOf=\"@+id/light_button\" />\n\n    <Button\n        android:id=\"@+id/streets_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"@string/menu_map_style_streets\"\n        android:textAllCaps=\"false\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.5\"\n        app:layout_constraintStart_toEndOf=\"@+id/light_button\"\n        app:layout_constraintTop_toTopOf=\"@+id/guideline\" />\n\n\n    <Button\n        android:id=\"@+id/outdoors_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"@string/menu_map_style_outdoors\"\n        android:textAllCaps=\"false\"\n        app:layout_constraintEnd_toEndOf=\"@+id/dark_button\"\n        app:layout_constraintHorizontal_bias=\"0.784\"\n        app:layout_constraintStart_toEndOf=\"@+id/light_button\"\n        app:layout_constraintStart_toStartOf=\"@+id/dark_button\"\n        app:layout_constraintTop_toBottomOf=\"@+id/dark_button\" />\n\n    <Button\n        android:id=\"@+id/standard_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"@string/menu_map_style_standard\"\n        android:textAllCaps=\"false\"\n        app:layout_constraintEnd_toEndOf=\"@+id/outdoors_button\"\n        app:layout_constraintHorizontal_bias=\"0.784\"\n        app:layout_constraintStart_toEndOf=\"@+id/light_button\"\n        app:layout_constraintStart_toStartOf=\"@+id/outdoors_button\"\n        app:layout_constraintTop_toBottomOf=\"@+id/outdoors_button\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/guideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        app:layout_constraintGuide_percent=\"0.67\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_style_vector_source.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"37.753574\"\n    mapbox:mapbox_cameraTargetLng=\"-122.447303\"\n    mapbox:mapbox_cameraZoom=\"13\"\n    tools:context=\".examples.VectorTileSourceActivity\" />\n"
  },
  {
    "path": "app/src/main/res/layout/activity_surface.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<SurfaceView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/surface\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:ignore=\"MissingDefaultResource\" />\n"
  },
  {
    "path": "app/src/main/res/layout/activity_terrain_showcase.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraPitch=\"80\"\n    mapbox:mapbox_cameraTargetLat=\"35.3606\"\n    mapbox:mapbox_cameraTargetLng=\"138.7274\"\n    mapbox:mapbox_cameraZoom=\"11\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_texture_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_mapSurface=\"texture_view\"\n    tools:context=\".examples.TextureViewActivity\" />"
  },
  {
    "path": "app/src/main/res/layout/activity_transparent_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <VideoView\n        android:id=\"@+id/videoView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scaleX=\"10.8\"\n        android:scaleY=\"3.8\" />\n\n    <com.mapbox.maps.MapView xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        mapbox:mapbox_cameraTargetLat=\"48.507879\"\n        mapbox:mapbox_cameraTargetLng=\"8.363795\"\n        mapbox:mapbox_cameraZoom=\"2\"\n        mapbox:mapbox_mapSurface=\"texture_view\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_view_annotation_showcase.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fab_style_toggle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"16dp\"\n        android:src=\"@drawable/ic_layers_24dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        tools:backgroundTint=\"@color/blue\"/>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fab_reframe\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"16dp\"\n        android:src=\"@drawable/ic_baseline_refresh_24\"\n        app:layout_constraintBottom_toTopOf=\"@+id/fab_style_toggle\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        tools:backgroundTint=\"@color/blue\"/>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_view_snapshot.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/coordinator_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fab\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end|bottom\"\n        android:layout_margin=\"@dimen/fab_margin\"\n        android:src=\"@drawable/ic_layers\"\n        android:tint=\"@color/primary\"\n        app:backgroundTint=\"@android:color/white\"/>\n\n    <ImageView\n        android:id=\"@+id/imageView\"\n        android:layout_width=\"128dp\"\n        android:layout_height=\"128dp\"\n        android:contentDescription=\"@string/content_description_snaphot\"\n        android:layout_gravity=\"start|bottom\"/>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_viewpager.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.testapp.examples.fragment.MapViewPager\n        android:id=\"@+id/viewPager\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.viewpager.widget.PagerTabStrip\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"top\"\n            android:background=\"@color/semi_transparent_dark\"\n            android:textColor=\"@android:color/white\"\n            android:paddingBottom=\"4dp\"\n            android:paddingTop=\"4dp\"/>\n\n    </com.mapbox.maps.testapp.examples.fragment.MapViewPager>\n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_viewport_animation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.mapbox.maps.MapView\n        android:id=\"@+id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        mapbox:mapbox_locationComponentEnabled=\"true\"\n        mapbox:mapbox_locationComponentPulsingEnabled=\"true\"\n        mapbox:mapbox_locationComponentPulsingMaxRadius=\"25dp\"\n        tools:context=\".examples.viewport.ViewportShowcaseActivity\" />\n\n    <androidx.appcompat.widget.AppCompatButton\n        android:id=\"@+id/switchButton\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/follow\"\n        mapbox:layout_constraintBottom_toBottomOf=\"parent\"\n        mapbox:layout_constraintEnd_toEndOf=\"parent\"\n        mapbox:layout_constraintStart_toStartOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_wms_source.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_cameraTargetLat=\"40.6892\"\n    mapbox:mapbox_cameraTargetLng=\"-74.5447\"\n    mapbox:mapbox_cameraZoom=\"8\"\n    tools:context=\".examples.WmsSourceActivity\" />"
  },
  {
    "path": "app/src/main/res/layout/generated_test_attribution.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    mapbox:mapbox_attributionEnabled = \"false\"\n    mapbox:mapbox_attributionIconColor = \"#000000\"\n    mapbox:mapbox_attributionGravity = \"bottom|end\"\n    mapbox:mapbox_attributionMarginLeft = \"10dp\"\n    mapbox:mapbox_attributionMarginTop = \"10dp\"\n    mapbox:mapbox_attributionMarginRight = \"10dp\"\n    mapbox:mapbox_attributionMarginBottom = \"10dp\"\n    mapbox:mapbox_attributionClickable = \"false\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n<!-- End of generated file. -->"
  },
  {
    "path": "app/src/main/res/layout/generated_test_compass.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    mapbox:mapbox_compassEnabled = \"false\"\n    mapbox:mapbox_compassGravity = \"bottom|end\"\n    mapbox:mapbox_compassMarginLeft = \"10dp\"\n    mapbox:mapbox_compassMarginTop = \"10dp\"\n    mapbox:mapbox_compassMarginRight = \"10dp\"\n    mapbox:mapbox_compassMarginBottom = \"10dp\"\n    mapbox:mapbox_compassOpacity = \"0.9\"\n    mapbox:mapbox_compassRotation = \"0.9\"\n    mapbox:mapbox_compassVisibility = \"false\"\n    mapbox:mapbox_compassFadeWhenFacingNorth = \"false\"\n    mapbox:mapbox_compassClickable = \"false\"\n    mapbox:mapbox_compassImage = \"@drawable/mapbox_logo_icon\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n<!-- End of generated file. -->"
  },
  {
    "path": "app/src/main/res/layout/generated_test_gestures.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    mapbox:mapbox_gesturesRotateEnabled = \"false\"\n    mapbox:mapbox_gesturesPinchToZoomEnabled = \"false\"\n    mapbox:mapbox_gesturesScrollEnabled = \"false\"\n    mapbox:mapbox_gesturesSimultaneousRotateAndPinchToZoomEnabled = \"false\"\n    mapbox:mapbox_gesturesPitchEnabled = \"false\"\n    mapbox:mapbox_gesturesScrollMode = \"horizontal_and_vertical\"\n    mapbox:mapbox_gesturesDoubleTapToZoomInEnabled = \"false\"\n    mapbox:mapbox_gesturesDoubleTouchToZoomOutEnabled = \"false\"\n    mapbox:mapbox_gesturesQuickZoomEnabled = \"false\"\n    mapbox:mapbox_gesturesFocalPointX = \"10.0\"\n    mapbox:mapbox_gesturesFocalPointY = \"20.0\"\n    mapbox:mapbox_gesturesPinchToZoomDecelerationEnabled = \"false\"\n    mapbox:mapbox_gesturesRotateDecelerationEnabled = \"false\"\n    mapbox:mapbox_gesturesScrollDecelerationEnabled = \"false\"\n    mapbox:mapbox_gesturesIncreaseRotateThresholdWhenPinchingToZoom = \"false\"\n    mapbox:mapbox_gesturesIncreasePinchToZoomThresholdWhenRotating = \"false\"\n    mapbox:mapbox_gesturesZoomAnimationAmount = \"0.9\"\n    mapbox:mapbox_gesturesPinchScrollEnabled = \"false\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n<!-- End of generated file. -->"
  },
  {
    "path": "app/src/main/res/layout/generated_test_locationcomponent.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    mapbox:mapbox_locationComponentEnabled = \"false\"\n    mapbox:mapbox_locationComponentPulsingEnabled = \"false\"\n    mapbox:mapbox_locationComponentPulsingColor = \"#000000\"\n    mapbox:mapbox_locationComponentPulsingMaxRadius = \"10dp\"\n    mapbox:mapbox_locationComponentShowAccuracyRing = \"false\"\n    mapbox:mapbox_locationComponentAccuracyRingColor = \"#000000\"\n    mapbox:mapbox_locationComponentAccuracyRingBorderColor = \"#000000\"\n    mapbox:mapbox_locationComponentLayerAbove = \"testString\"\n    mapbox:mapbox_locationComponentLayerBelow = \"testString\"\n    mapbox:mapbox_locationComponentPuckBearingEnabled = \"false\"\n    mapbox:mapbox_locationComponentPuckBearing = \"heading\"\n    mapbox:mapbox_locationComponentSlot = \"testString\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n<!-- End of generated file. -->"
  },
  {
    "path": "app/src/main/res/layout/generated_test_logo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    mapbox:mapbox_logoEnabled = \"false\"\n    mapbox:mapbox_logoGravity = \"bottom|end\"\n    mapbox:mapbox_logoMarginLeft = \"10dp\"\n    mapbox:mapbox_logoMarginTop = \"10dp\"\n    mapbox:mapbox_logoMarginRight = \"10dp\"\n    mapbox:mapbox_logoMarginBottom = \"10dp\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n<!-- End of generated file. -->"
  },
  {
    "path": "app/src/main/res/layout/generated_test_scalebar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:mapbox=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/mapView\"\n    mapbox:mapbox_scaleBarEnabled = \"false\"\n    mapbox:mapbox_scaleBarGravity = \"bottom|end\"\n    mapbox:mapbox_scaleBarMarginLeft = \"10dp\"\n    mapbox:mapbox_scaleBarMarginTop = \"10dp\"\n    mapbox:mapbox_scaleBarMarginRight = \"10dp\"\n    mapbox:mapbox_scaleBarMarginBottom = \"10dp\"\n    mapbox:mapbox_scaleBarTextColor = \"#000000\"\n    mapbox:mapbox_scaleBarPrimaryColor = \"#000000\"\n    mapbox:mapbox_scaleBarSecondaryColor = \"#000000\"\n    mapbox:mapbox_scaleBarBorderWidth = \"10dp\"\n    mapbox:mapbox_scaleBarHeight = \"10dp\"\n    mapbox:mapbox_scaleBarTextBarMargin = \"10dp\"\n    mapbox:mapbox_scaleBarTextBorderWidth = \"10dp\"\n    mapbox:mapbox_scaleBarTextSize = \"10dp\"\n    mapbox:mapbox_scaleBarIsMetricUnits = \"false\"\n    mapbox:mapbox_scaleBarDistanceUnits = \"imperial\"\n    mapbox:mapbox_scaleBarRefreshInterval = \"1000000\"\n    mapbox:mapbox_scaleBarShowTextBorder = \"false\"\n    mapbox:mapbox_scaleBarRatio = \"0.9\"\n    mapbox:mapbox_scaleBarUseContinuousRendering = \"false\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n<!-- End of generated file. -->"
  },
  {
    "path": "app/src/main/res/layout/item_callout_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/ic_callout_item_background\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <TextView\n        android:id=\"@+id/textNativeView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"10sp\"\n        android:padding=\"3dp\"\n        android:gravity=\"center\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/closeNativeView\"\n        tools:ignore=\"SmallSp\" />\n\n    <ImageView\n        android:id=\"@+id/closeNativeView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:src=\"@drawable/ic_clear\"\n        android:contentDescription=\"@string/content_description_close\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <Button\n        android:id=\"@+id/selectButton\"\n        android:layout_width=\"70dp\"\n        android:layout_height=\"30dp\"\n        android:text=\"Select\"\n        android:gravity=\"center\"\n        android:textSize=\"6sp\"\n        android:layout_marginStart=\"12dp\"\n        android:layout_marginEnd=\"12dp\"\n        android:layout_marginBottom=\"4dp\"\n        app:layout_constraintTop_toBottomOf=\"@id/textNativeView\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        tools:ignore=\"HardcodedText,SmallSp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_display_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:padding=\"4dp\">\n\n    <TextView\n        tools:text=\"Built-in Screen [0]\"\n        android:layout_weight=\"1\"\n        android:id=\"@+id/display_info\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"start|center_vertical\"\n        android:textSize=\"20sp\" />\n\n    <Button\n        android:layout_gravity=\"end\"\n        android:id=\"@+id/display_bt\"\n        android:layout_width=\"100dp\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Present\"\n        android:textSize=\"12sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_dva_alt_eta.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"180dp\"\n    android:layout_height=\"70dp\"\n    android:padding=\"8dp\"\n    android:background=\"@drawable/bg_dva_eta\"\n    android:backgroundTint=\"@color/white\"\n    android:backgroundTintMode=\"src_atop\">\n\n    <ImageView\n        android:id=\"@+id/arrow\"\n        android:layout_width=\"30dp\"\n        android:layout_height=\"30dp\"\n        android:layout_margin=\"16dp\"\n        android:src=\"@drawable/arrow_straight\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:tint=\"#09AA74\"\n        tools:ignore=\"ContentDescription,HardcodedText,SmallSp\" />\n\n    <TextView\n        android:id=\"@+id/eta\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:text=\"Save 10 min\"\n        android:layout_marginBottom=\"8dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginStart=\"4dp\"\n        android:textColor=\"@color/black\"\n        android:textSize=\"18sp\"\n        app:layout_constraintStart_toEndOf=\"@id/arrow\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:ignore=\"HardcodedText,SmallSp\" />\n\n    <TextView\n        android:id=\"@+id/textNativeView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:text=\"Avoid traffic\"\n        android:textColor=\"@color/black\"\n        android:textSize=\"12sp\"\n        app:layout_constraintStart_toStartOf=\"@id/eta\"\n        app:layout_constraintTop_toBottomOf=\"@+id/eta\"\n        tools:ignore=\"HardcodedText,SmallSp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_dva_construction.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"40dp\"\n    android:layout_height=\"40dp\"\n    android:padding=\"4dp\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <TextView\n        android:id=\"@+id/construction_icon\"\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        android:textSize=\"20sp\"\n        android:text=\"🚧\"\n        android:textColor=\"#ff000000\"\n        android:gravity=\"center\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        tools:ignore=\"HardcodedText,SmallSp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_dva_eta.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"120dp\"\n    android:layout_height=\"60dp\"\n    android:background=\"@drawable/bg_dva_eta\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <TextView\n        android:id=\"@+id/textNativeView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"25sp\"\n        android:text=\"25 min\"\n        android:textColor=\"@color/white\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        tools:ignore=\"HardcodedText,SmallSp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_dva_parking.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"110dp\"\n    android:layout_height=\"40dp\"\n    android:padding=\"4dp\"\n    android:background=\"@drawable/bg_dva_parking\"\n    tools:backgroundTint=\"@color/green\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <TextView\n        android:id=\"@+id/parking_icon\"\n        android:layout_width=\"30dp\"\n        android:layout_height=\"30dp\"\n        android:textSize=\"20sp\"\n        android:text=\"P\"\n        android:gravity=\"center\"\n        android:textColor=\"@color/white\"\n        android:background=\"@drawable/mapbox_mylocation_bg_shape\"\n        android:backgroundTint=\"@color/primary\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        tools:ignore=\"HardcodedText,SmallSp\" />\n\n    <TextView\n        android:id=\"@+id/parking_price\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"25sp\"\n        android:text=\"$4/hr\"\n        android:gravity=\"center\"\n        android:textColor=\"@color/black\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/parking_icon\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginBottom=\"4dp\"\n        tools:ignore=\"HardcodedText,SmallSp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_gesture_alert.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <TextView\n        android:id=\"@+id/alert_message\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"2dp\"\n        android:paddingTop=\"2dp\"\n        android:textSize=\"12sp\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_legacy_callout_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"16dp\"\n    android:paddingLeft=\"20dp\"\n    android:paddingRight=\"20dp\"\n    android:paddingTop=\"14dp\"\n    android:background=\"@drawable/ic_legacy_callout\">\n\n    <TextView\n        android:id=\"@+id/infowindow_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"2dp\"\n        android:textIsSelectable=\"false\"\n        android:maxEms=\"17\"\n        android:textColor=\"@android:color/black\"\n        android:textSize=\"18sp\"\n        android:textStyle=\"bold\"/>\n\n    <TextView\n        android:id=\"@+id/infowindow_description\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"2dp\"\n        android:layout_marginTop=\"2dp\"\n        android:textIsSelectable=\"false\"\n        android:lineSpacingExtra=\"1dp\"\n        android:maxEms=\"17\"\n        android:textColor=\"@color/mapbox_gray\"\n        android:textSize=\"14sp\"/>\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:maxEms=\"17\"\n        android:textColor=\"@android:color/black\"\n        android:textSize=\"12sp\"\n        android:visibility=\"gone\"/>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_map.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mapbox.maps.MapView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:id=\"@id/mapView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"256dp\" />"
  },
  {
    "path": "app/src/main/res/layout/item_single_example.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"72dp\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"16dp\"\n    android:paddingEnd=\"16dp\"\n    >\n\n    <TextView\n        android:id=\"@+id/nameView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_weight=\"1\"\n        android:gravity=\"bottom\"\n        android:maxLines=\"1\"\n        android:textColor=\"@android:color/black\"\n        android:textIsSelectable=\"false\"\n        android:textSize=\"16sp\"\n        tools:text=\"Section name\"\n        />\n\n    <TextView\n        android:id=\"@+id/descriptionView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_weight=\"1\"\n        android:alpha=\"0.56\"\n        android:maxLines=\"1\"\n        android:textColor=\"@android:color/black\"\n        android:textIsSelectable=\"false\"\n        android:textSize=\"14sp\"\n        tools:text=\"Section description\"\n        />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_spinner_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/text_view_spinner\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"48dp\"\n    android:paddingStart=\"8dp\"\n    android:paddingEnd=\"8dp\"\n    android:textSize=\"16sp\"\n    android:gravity=\"center_vertical\"\n    android:textColor=\"@android:color/black\"/>"
  },
  {
    "path": "app/src/main/res/layout/section_main_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"48dp\">\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0.25dp\"\n        android:alpha=\"0.56\"\n        android:background=\"@drawable/line_divider\"/>\n\n    <TextView\n        android:id=\"@+id/section_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"48dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginLeft=\"16dp\"\n        android:layout_marginRight=\"16dp\"\n        android:layout_marginStart=\"16dp\"\n        android:textIsSelectable=\"false\"\n        android:layout_marginTop=\"16dp\"\n        android:alpha=\"0.54\"\n        android:background=\"@android:color/transparent\"\n        android:maxLines=\"1\"\n        android:textColor=\"@android:color/black\"\n        android:textSize=\"14sp\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_bounds.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/menu_action_san_francisco_bounds\"\n        android:title=\"@string/restrict_san_francisco\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_allmost_world_bounds\"\n        android:title=\"@string/restrict_almost_worldview\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_cross_idl\"\n        android:title=\"@string/restrict_across_idl\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_reset\"\n        android:title=\"@string/restrict_reset\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_toggle_bounds\"\n        android:title=\"@string/toggle_show_bounds\"\n        app:showAsAction=\"never\"/>\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_clip_layer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/menu_action_clip_model\"\n        android:title=\"@string/clip_model\"/>\n    <item\n        android:id=\"@+id/menu_action_clip_symbol\"\n        android:title=\"@string/clip_symbol\"/>\n    <item\n        android:id=\"@+id/menu_action_clip_model_and_symbol\"\n        android:title=\"@string/clip_model_and_symbol\"/>\n    <item\n        android:id=\"@+id/menu_action_clip_reset\"\n        android:title=\"@string/clip_reset\"/>\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_color_theme.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/menu_action_color_theme_image\"\n        android:title=\"@string/color_theme_monochrome\" />\n    <item\n        android:id=\"@+id/menu_action_color_theme_base64\"\n        android:title=\"@string/color_theme_red\" />\n    <item\n        android:id=\"@+id/menu_action_color_theme_toggle_atmosphere\"\n        android:title=\"@string/color_theme_toggle_atmosphere\" />\n    <item\n        android:id=\"@+id/menu_action_color_theme_reset\"\n        android:title=\"@string/color_theme_reset\" />\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_custom_layer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/action_update_layer\"\n        android:title=\"@string/update_layer_invalidate\"/>\n    <item\n        android:id=\"@+id/action_set_color_red\"\n        android:title=\"@string/red\"/>\n    <item\n        android:id=\"@+id/action_set_color_green\"\n        android:title=\"@string/green\"/>\n    <item\n        android:id=\"@+id/action_set_color_blue\"\n        android:title=\"@string/blue\"/>\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_debug_mode.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/menu_debug_mode_tile_borders\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_tile_borders\" />\n    <item\n        android:id=\"@+id/menu_debug_mode_parse_status\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_parse_status\" />\n    <item\n        android:id=\"@+id/menu_debug_mode_timestamps\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_timestamps\" />\n    <item\n        android:id=\"@+id/menu_debug_mode_collision\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_collision\" />\n    <item\n        android:id=\"@+id/menu_debug_mode_overdraw\"\n        android:checkable=\"true\"\n        android:checked=\"false\"\n        android:title=\"@string/toggle_overdraw\" />\n    <item\n        android:id=\"@+id/menu_debug_mode_stencil_clip\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_stencil_clip\" />\n    <item\n        android:id=\"@+id/menu_debug_mode_depth_buffer\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_depth_buffer\" />\n    <item\n        android:id=\"@+id/menu_debug_mode_camera_overlay\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_camera_overlay\" />\n    <item\n        android:id=\"@+id/menu_debug_mode_padding_overlay\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_padding_overlay\" />\n    <item\n        android:id=\"@+id/menu_debug_mode_info\"\n        android:checkable=\"false\"\n        android:title=\"@string/show_map_info\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_gestures.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/menu_gesture_focus_point\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_focus_on_a_point\" />\n    <item\n        android:id=\"@+id/menu_gesture_animation\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_velocity_animations\" />\n    <item\n        android:id=\"@+id/menu_gesture_rotate\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_rotate_enabled\" />\n    <item\n        android:id=\"@+id/menu_gesture_pitch\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_pitch_enabled\" />\n    <item\n        android:id=\"@+id/menu_gesture_zoom\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_zoom_enabled\" />\n    <item\n        android:id=\"@+id/menu_gesture_scroll\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_scroll_enabled\" />\n    <item\n        android:id=\"@+id/menu_gesture_double_tap\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_double_tap_enabled\" />\n    <item\n        android:id=\"@+id/menu_gesture_double_touch\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_double_touch_enabled\" />\n    <item\n        android:id=\"@+id/menu_gesture_quick_zoom\"\n        android:checkable=\"true\"\n        android:checked=\"true\"\n        android:title=\"@string/toggle_quick_zoom_enabled\" />\n    <group android:id=\"@+id/group\"\n        android:checkableBehavior=\"single\">\n        <item\n            android:id=\"@+id/menu_gesture_pan_scroll_horizontal_vertical\"\n            android:title=\"@string/pan_scroll_horizontal_vertical\"\n            android:checked=\"true\" />\n        <item\n            android:id=\"@+id/menu_gesture_pan_scroll_horizontal\"\n            android:title=\"@string/pan_scroll_horizontal\" />\n        <item\n            android:id=\"@+id/menu_gesture_pan_scroll_vertical\"\n            android:title=\"@string/pan_scroll_vertical\" />\n    </group>\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_languages.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <group\n        android:id=\"@+id/layers\"\n        android:checkableBehavior=\"all\">\n    <item\n        android:id=\"@+id/country_label\"\n        android:title=\"@string/country_label\"\n        app:showAsAction=\"never\" />\n        <item\n            android:id=\"@+id/state_label\"\n            android:title=\"@string/state_label\"\n            app:showAsAction=\"never\" />\n    </group>\n    <group\n        android:id=\"@+id/group\"\n        android:checkableBehavior=\"single\">\n        <item\n            android:id=\"@+id/english\"\n            android:title=\"@string/english\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/spanish\"\n            android:title=\"@string/spanish\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/french\"\n            android:title=\"@string/french\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/german\"\n            android:title=\"@string/german\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/russian\"\n            android:title=\"@string/russian\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/chinese\"\n            android:title=\"@string/chinese\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/simplified_chinese\"\n            android:title=\"@string/simplified_chinese\"\n            app:showAsAction=\"never\" />\n\n\n        <item\n            android:id=\"@+id/portuguese\"\n            android:title=\"@string/portuguese\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/japanese\"\n            android:title=\"@string/japanese\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/korean\"\n            android:title=\"@string/korean\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/vietnamese\"\n            android:title=\"@string/vietnamese\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/italian\"\n            android:title=\"@string/italian\"\n            app:showAsAction=\"never\" />\n\n        <item\n            android:id=\"@+id/local\"\n            android:title=\"@string/local_names\"\n            app:showAsAction=\"never\" />\n    </group>\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_location_component.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item android:id=\"@+id/action_customise_location_puck_change\"\n        android:title=\"@string/toggle_customised_puck\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_map_style_change\"\n        android:title=\"@string/toggle_custom_map_style\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_map_projection_change\"\n        android:title=\"@string/toggle_custom_map_projection\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_component_disable\"\n        android:title=\"@string/location_disable_component\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_component_enabled\"\n        android:title=\"@string/location_enable_component\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_show_bearing\"\n        android:title=\"@string/location_show_bearing\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_hide_bearing\"\n        android:title=\"@string/location_hide_bearing\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_accuracy_disable\"\n        android:title=\"@string/location_disable_accuracy\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_accuracy_enabled\"\n        android:title=\"@string/location_enable_accuracy\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/toggle_opacity\"\n        android:title=\"@string/toggle_opacity\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/move_to_bottom_slot\"\n        android:title=\"@string/move_to_bottom_slot\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/reset_slot\"\n        android:title=\"@string/reset_slot\"\n        app:showAsAction=\"never\"/>\n\n    <group\n        android:id=\"@+id/group\"\n        android:checkableBehavior=\"single\">\n    <item\n        android:id=\"@+id/heading\"\n        android:title=\"@string/heading\"\n        android:checked=\"true\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/course\"\n        android:title=\"@string/course\"\n        app:showAsAction=\"never\" />\n    </group>\n\n    <group\n        android:id=\"@+id/location_animation_group\"\n        android:checkableBehavior=\"single\">\n        <item\n            android:id=\"@+id/location_1s_animation\"\n            android:checked=\"true\"\n            android:title=\"@string/location_1s_animation\"\n            app:showAsAction=\"never\" />\n        <item\n            android:id=\"@+id/location_300ms_animation\"\n            android:checked=\"false\"\n            android:title=\"@string/location_300ms_animation\"\n            app:showAsAction=\"never\" />\n        <item\n            android:id=\"@+id/location_no_animation\"\n            android:checked=\"false\"\n            android:title=\"@string/location_no_animation\"\n            app:showAsAction=\"never\" />\n    </group>\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_location_component_model_customisation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item android:id=\"@+id/action_hood\"\n        android:title=\"Toggle hood\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n\n    <item android:id=\"@+id/action_trunk\"\n        android:title=\"Toggle trunk\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n\n    <item android:id=\"@+id/action_doorsFrontLeft\"\n        android:title=\"Toggle doors front left\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n\n    <item android:id=\"@+id/action_doorsFrontRight\"\n        android:title=\"Toggle doors front right\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n\n    <item android:id=\"@+id/action_doorsBackLeft\"\n        android:title=\"Toggle doors back left\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n\n    <item android:id=\"@+id/action_doorsBackRight\"\n        android:title=\"Toggle doors back right\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n\n    <item android:id=\"@+id/action_headlights\"\n        android:title=\"Toggle head lights\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n\n    <item android:id=\"@+id/action_breaking\"\n        android:title=\"Toggle breaking lights\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n\n    <item android:id=\"@+id/action_indicatorLeft\"\n        android:title=\"Toggle left indicator\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n\n    <item android:id=\"@+id/action_indicatorRight\"\n        android:title=\"Toggle right indicator\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n    <item android:id=\"@+id/action_rotate_wheels\"\n        android:title=\"Toggle wheel rotation\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n    <item android:id=\"@+id/action_body_color\"\n        android:title=\"Toggle body color\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n    <item android:id=\"@+id/action_simulate_route\"\n        android:title=\"Toggle simulating navigation\"\n        app:showAsAction=\"never\"\n        tools:ignore=\"HardcodedText\" />\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_predefined_animators.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/menu_action_jump_to\"\n        android:title=\"@string/menu_animator_jump_to\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_ease_to\"\n        android:title=\"@string/menu_animator_ease_to\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_fly_to\"\n        android:title=\"@string/menu_animator_fly_to\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_move_by\"\n        android:title=\"@string/menu_animator_move_by\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_pitch_by\"\n        android:title=\"@string/menu_animator_pitch_by\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_rotate_by\"\n        android:title=\"@string/menu_animator_rotate_by\"\n        app:showAsAction=\"never\"/>\n    <item\n        android:id=\"@+id/menu_action_scale_by\"\n        android:title=\"@string/menu_animator_scale_by\"\n        app:showAsAction=\"never\"/>\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_pulsing_location_mode.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item android:id=\"@+id/action_map_style_change\"\n        android:title=\"@string/toggle_custom_map_style\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_component_disable\"\n        android:title=\"@string/location_disable_component\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_component_enabled\"\n        android:title=\"@string/location_enable_component\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_stop_pulsing\"\n        android:title=\"@string/location_stop_pulsing\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_start_pulsing\"\n        android:title=\"@string/location_start_pulsing\"\n        app:showAsAction=\"never\"/>\n\n    <item android:id=\"@+id/action_pulsing_follow_accuracy_radius\"\n        android:title=\"@string/location_pulsing_puck_follow_accuracy_radius\"\n        app:showAsAction=\"never\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_standard_style_interactions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/menu_action_select_all\"\n        android:title=\"@string/select_all\"/>\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_symbol.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/menu_action_draggable\"\n        android:title=\"@string/toggle_draggable_state\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_consume_click\"\n        android:title=\"@string/consume_click_event\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menu_action_bitmap_blue\"\n        android:title=\"@string/change_icon_to_bitmap_blue\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_rotation\"\n        android:title=\"@string/set_icon_rotation_to_45\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_anchor\"\n        android:title=\"@string/set_icon_anchor_bottom\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_opacity\"\n        android:title=\"@string/set_icon_opacity_to_0_5f\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_offset\"\n        android:title=\"@string/offset_icon_by_10_20\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_text\"\n        android:title=\"@string/add_text\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_text_color\"\n        android:title=\"@string/set_text_color_to_white\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_text_size\"\n        android:title=\"@string/set_text_size\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_text_anchor\"\n        android:title=\"@string/set_text_anchor_top\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_z_index\"\n        android:title=\"@string/change_z_index\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_halo\"\n        android:title=\"@string/add_icon_halo\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_filter\"\n        android:title=\"@string/filter\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/menu_action_animate\"\n        android:title=\"@string/animate_symbol\"\n        app:showAsAction=\"never\" />\n    <group\n        android:id=\"@+id/group\"\n        android:checkableBehavior=\"single\">\n    <item\n        android:id=\"@+id/z_order_auto\"\n        android:title=\"@string/z_order_auto\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/z_order_viewport_y\"\n        android:title=\"@string/z_order_viewport_y\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/z_order_source\"\n        android:title=\"@string/z_order_source\"\n        app:showAsAction=\"never\" />\n    </group>\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_tilejson.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/menu_set_tile_request_delay\"\n        android:checkable=\"true\"\n        android:checked=\"false\"\n        android:title=\"@string/set_tile_request_delay\" />\n    <item\n        android:id=\"@+id/menu_set_tile_network_request_delay\"\n        android:checkable=\"true\"\n        android:checked=\"false\"\n        android:title=\"@string/set_tile_network_request_delay\" />\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_view_annotation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/action_view_annotation_fixed_delay\"\n        android:title=\"@string/view_annotation_mode_map_fixed_delay\"/>\n    <item\n        android:id=\"@+id/action_view_annotation_map_synchronized\"\n        android:title=\"@string/view_annotation_mode_map_sync\"/>\n</menu>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/values/actions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"update_layer_invalidate\">Update layer (invalidate)</string>\n    <string name=\"red\">Red</string>\n    <string name=\"green\">Green</string>\n    <string name=\"blue\">Blue</string>\n    <string name=\"view_annotation_mode_map_sync\">Map Synchronized</string>\n    <string name=\"view_annotation_mode_map_fixed_delay\">Map Fixed Delay</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"primary\">#4264fb</color>\n    <color name=\"primaryDark\">#003ac7</color>\n    <color name=\"accent\">#EE4E8B</color>\n    <color name=\"white\">#F9F9F9</color>\n    <color name=\"pink\">#ee4e8b</color>\n    <color name=\"green\">#33c377</color>\n    <color name=\"blue\">#1E8CAB</color>\n    <color name=\"red\">#f74e4e</color>\n    <color name=\"simi_transparent_blue\">#334264fb</color>\n    <color name=\"black\">#000000</color>\n    <color name=\"semi_transparent_dark\">#CC303030</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"fab_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/example_categories.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"category\">category</string>\n    <string name=\"category_basic\">Basic</string>\n    <string name=\"category_custom_layer\">Custom layer</string>\n    <string name=\"category_styles\">Styles</string>\n    <string name=\"category_integration\">Integration</string>\n    <string name=\"category_gestures\">Gestures</string>\n    <string name=\"category_snapshot\">Snapshot</string>\n    <string name=\"category_location\">Location</string>\n    <string name=\"category_config\">Map configuration</string>\n    <string name=\"category_lab\">Lab</string>\n    <string name=\"category_camera\">Camera</string>\n    <string name=\"category_offline\">Offline</string>\n    <string name=\"category_sky\">Sky</string>\n    <string name=\"category_annotation\">Annotation</string>\n    <string name=\"category_3D\">3D</string>\n    <string name=\"category_viewport\">Viewport</string>\n    <string name=\"category_lines_and_polygons\">Lines and polygons</string>\n    <string name=\"category_markers_and_callouts\">Markers and callouts</string>\n    <string name=\"category_data_visualization\">Data Visualization</string>\n    <string name=\"category_globe\">Globe and atmosphere</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/example_descriptions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"description_simple_map\">Create and display a map that uses the default Mapbox streets style. This example also shows how to update the starting camera for a map.</string>\n    <string name=\"description_standard_style\">Use the Standard style and modify settings at runtime.</string>\n    <string name=\"description_studio_style_map\">Use a custom style designed in Mapbox Studio.</string>\n    <string name=\"description_runtime_styling\">Shows runtime styling</string>\n    <string name=\"description_tint_fill\">Add an image to a style and use it to display a pattern in the landuse FillLayer in the Mapbox Streets style.</string>\n    <string name=\"description_dsl_styling\">Shows runtime styling using dsl</string>\n    <string name=\"description_heatmap_layer\">Add earthquake frequency data to a style from a GeoJSON file and render it on a map using a HeatmapLayer.</string>\n    <string name=\"description_default_styles\">Switch between custom and default Mapbox styles for the same map view.</string>\n    <string name=\"description_map_recycle\">MapView integration inside a RecyclerView</string>\n    <string name=\"description_gestures\">Manipulate gesture interaction with the map</string>\n    <string name=\"description_raw_geojson\">Use a GeoJSON string as data for a GeoJSON source through Value API</string>\n    <string name=\"description_geojson_layer_in_stack\">Insert a specific layer above or below other layers.</string>\n    <string name=\"description_raw_expression\">Use a JSON string as an expression</string>\n    <string name=\"description_raw_source_layer\">Use a JSON string as an Source/Layer</string>\n    <string name=\"description_map_fragment\">Use a MapView inside a map fragment and fragment backstack</string>\n    <string name=\"description_map_viewpager\">Use a MapView inside a ViewPager</string>\n    <string name=\"description_map_multi\">Using multiple map fragments in one Activity</string>\n    <string name=\"description_debug_mode\">Use variations of debug modes of the Map</string>\n    <string name=\"description_mapbox_recorder\">Showcasing recording / replaying session with MapboxMapRecorder</string>\n    <string name=\"description_snapshotter\">Create a static, non-interactive image of a map style with specified camera position. The resulting snapshot is provided as a bitmap on Android.</string>\n    <string name=\"description_snapshotter_dds\">Use data driven styling with static map image generation</string>\n    <string name=\"description_snapshotter_local\">Use an local style with static map image generation</string>\n    <string name=\"description_location_tracking\">Display the user\\'s location on a map with the default user location puck.</string>\n    <string name=\"description_simulate_navigation_route\">Simulate a navigation route</string>\n    <string name=\"description_location_basic_pulsing_circle\">Display the LocationComponent\\'s default pulsing circle</string>\n    <string name=\"description_simple_geofencing\">Display geofence area around current location</string>\n    <string name=\"description_extended_geofencing\">Display geofence created by isochrone</string>\n    <string name=\"description_restrict_bounds\">Restrict the map\\'s viewport to a specified set of coordinates for gesture-based camera changes. The viewport can still be changed programmatically.</string>\n    <string name=\"description_texture_view\">Use TextureView as render surface</string>\n    <string name=\"description_texture_view_animation\">Apply ViewAnimation on a TextureView</string>\n    <string name=\"description_style_circles_categorically\">Add point data to a style from a vector tileset and use the match and get expressions to assign the color of each point in a CircleLayer based on a data property.</string>\n    <string name=\"description_space_station_location\">See the International Space Station location in real time.</string>\n    <string name=\"description_inset_map\">Show a smaller inset map fragment and link it to a larger map for two map interaction. Great for gaming!</string>\n    <string name=\"description_dds_gradient_line\">Style a line with colored gradient</string>\n    <string name=\"description_dds_polygon_holes\">Add a polygon layer with interior holes.</string>\n    <string name=\"description_dds_polygon\">Draw a vector polygon on a map.</string>\n    <string name=\"description_dds_geojson_line\">Load a polyline to a style using GeoJsonSource and display it on a map using LineLayer.</string>\n    <string name=\"activity_camera_animate_description\">Animate the camera changes with the fly-to animation. This causes the camera to ease from a starting point to an end destination.</string>\n    <string name=\"activity_camera_predefined_animators_description\">Use setCamera to animate the camera position.</string>\n    <string name=\"description_camera_low_level\">Animate the map camera to a new position using camera animators. Individual camera properties such as zoom, bearing, and center coordinate can be animated independently.</string>\n    <string name=\"description_animate_camera_during_gesture\">Animate the map camera properties during user gestures.</string>\n    <string name=\"description_fill_extrusion\">Extrude the building layer in the Mapbox Light style using FillExtrusionLayer and set up the light position.</string>\n    <string name=\"description_lights3d\">Extrude the building layer in the Mapbox Standard style and set up the light position.</string>\n    <string name=\"description_icon_property\">Add point data and several images to a style and use the switchCase and get expressions to choose which image to display at each point in a SymbolLayer based on a data property.</string>\n    <string name=\"description_animated_image_source\">Load a raster image to a style using ImageSource and display it on a map as animated weather data using RasterLayer.</string>\n    <string name=\"description_dds_multiple_geometries\">Display multiple shapes on a map</string>\n    <string name=\"description_wms_source\">Add an external WMS source to your map using TileSet API</string>\n    <string name=\"description_within\">Usage of the within expression on a buffered geometry</string>\n    <string name=\"description_vector_tile_source\">Add a vector source to a map using an URL.</string>\n    <string name=\"description_distance_style\">Show POIs on a map with distance expression filter</string>\n    <string name=\"description_lab_moving_icon_with_trailing_line_title\">Draw a line behind a moving icon</string>\n    <string name=\"description_labs_snaking_directions_route_title\">Animate updates to a polyline.</string>\n    <string name=\"description_animate_marker_position\">Animate updates to a marker/annotation\\'s position.</string>\n    <string name=\"description_styles_show_hide_layers\">Allow the user to toggle the visibility of a CircleLayer on a map.</string>\n    <string name=\"description_styles_dds_geojson_circle_layer_clusters_description\">Create a circle layer from a geoJSON source and cluster the points from that source. The clusters will update as the map\\'s camera changes.</string>\n    <string name=\"description_change_icon_size\">Change icon size with Symbol layer</string>\n    <string name=\"description_add_marker_symbol\">Add markers that use different icons.</string>\n    <string name=\"description_add_one_marker_symbol\">Add a blue teardrop-shaped marker image to a style and display it on the map using a SymbolLayer.</string>\n    <string name=\"description_style_image_source\">Use an image source to easily display images on the map.</string>\n    <string name=\"description_legacy_offline\">Use OfflineManager to download tiles</string>\n    <string name=\"description_offline\">Use OfflineManager to download tiles</string>\n    <string name=\"description_sky_layer\">Add a customizable sky layer to simulate natural lighting with a Terrain layer</string>\n    <string name=\"description_sky_snapshotter\">Junction view showcase</string>\n    <string name=\"description_custom_layer\">Custom Layer Example using Kotlin</string>\n    <string name=\"description_native_custom_layer\">Custom Layer Example using C++</string>\n    <string name=\"description_triangle_custom_layer\">Triangle Custom Layer Example</string>\n    <string name=\"description_globe_custom_layer\">Globe Custom Layer Example</string>\n    <string name=\"description_map_overlay\">Use Map Overlay</string>\n    <string name=\"description_localization\">Automatically localize the map labels into the device\\'s current language.</string>\n    <string name=\"description_transparent_bg\">MapView with transparent background</string>\n    <string name=\"description_surface\">MapSurface with SurfaceView host and Widget</string>\n    <string name=\"description_view_snapshot\">Create a bitmap snapshot from a MapView</string>\n    <string name=\"description_custom_attribution\">Custom attribution showcase</string>\n    <string name=\"description_annotation_fill\">Show polygon annotations on a map</string>\n    <string name=\"description_annotation_circle\">Show circle annotations on a map</string>\n    <string name=\"description_annotation_symbol\">Show point annotations on a map</string>\n    <string name=\"description_animate_annotation_symbol\">Animate PointAnnotations on a map</string>\n    <string name=\"description_annotation_symbol_cluster\">Show fire hydrants in Washington DC area in a cluster</string>\n    <string name=\"description_annotation_line\">Show polyline annotations on a map</string>\n    <string name=\"description_terrain_showcase\">Terrain 3D camera fly</string>\n    <string name=\"description_location_component\">Shows location puck on the map</string>\n    <string name=\"description_location_component_animation\">Animates puck with custom location provider updates</string>\n    <string name=\"description_santa_catalina\">Santa Catalina Walking Route</string>\n    <string name=\"description_multiple_display\">Display the map on a secondary display</string>\n    <string name=\"description_map_view_customization\">Customize your map view</string>\n    <string name=\"description_ornaments_margin\">Update margins of ornaments when the map rotates</string>\n    <string name=\"description_scale_bar\">Show scale bar at custom position</string>\n    <string name=\"description_large_geojson\">Display long route as large geojson</string>\n    <string name=\"description_nine_patch\">Add 9-patch image to the style</string>\n    <string name=\"description_feature_state\">Create interactive hover effects with feature state</string>\n    <string name=\"description_3d_globe\">Create a map using the globe projection.</string>\n    <string name=\"description_spinning_globe\">Display your map as an interactive, rotating globe.</string>\n    <string name=\"description_osm\">Using raster source and layer to render OSM tiles with TileSet class</string>\n    <string name=\"description_view_annotation\">Add view annotation anchored to a symbol layer feature</string>\n    <string name=\"description_view_annotation_basic\">Add view annotation on a map click</string>\n    <string name=\"description_view_annotation_animation\">Animate a view annotation on screen</string>\n    <string name=\"description_view_annotation_point_annotation\">Add view annotation to a point annotation</string>\n    <string name=\"description_dynamic_view_annotations\">Add dynamic view annotations to line layers and fixed coordinates</string>\n    <string name=\"description_info_window\">Legacy InfoWindow implementation using view annotations</string>\n    <string name=\"description_viewport\">Viewport camera showcase</string>\n    <string name=\"description_advanced_viewport\">Advanced viewport with gestures showcase</string>\n    <string name=\"description_third_party_source\">Add a third party vector tile source.</string>\n    <string name=\"description_raster_colorization\">Raster colorization using raster-color</string>\n    <string name=\"description_secondary_display_presentation\">Displaying a map on a secondary display using Presentation.</string>\n    <string name=\"description_model_layer\">Showcase the usage of a 3D model layer.</string>\n    <string name=\"description_custom_raster_source\">Showcase the usage of a custom raster source.</string>\n    <string name=\"description_slot_layer\">Showcase the usage of slot layer.</string>\n    <string name=\"description_raster_particles\">Showcase the usage of a raster particle layer.</string>\n    <string name=\"description_clip_layer\">Showcase the usage of clip layer.</string>\n    <string name=\"description_standard_interactions\">Showcase of the Standard Style interactions.</string>\n    <string name=\"description_location_component_model_animation\">Animate 3D location puck on the map</string>\n    <string name=\"description_precipitation\">Showcase rain and snow effects.</string>\n    <string name=\"description_color_theme\">Showcase color theme.</string>\n    <string name=\"description_elevated_line\">Showcase line elevation</string>\n    <string name=\"description_data_join\">Showcase join JSON data with vector tiles and style it.</string>\n    <string name=\"description_3d_model_source_interactions_label\">3D model with source-driven interactions</string>\n    <string name=\"description_3d_model_source_interactions\">Use a model layer and source to interactively change material and orientation of model parts.</string>\n    <string name=\"description_edge_to_edge\">Showcase edge-to-edge layout with proper handling of system insets (system bars, navigation bars, and display cutouts).</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/example_titles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"activity_simple_map\">Display a map view</string>\n    <string name=\"activity_standard_style\">Work with the Standard style</string>\n    <string name=\"activity_studio_style\">Mapbox Studio style</string>\n    <string name=\"activity_runtime_styling\">Runtime styling</string>\n    <string name=\"activity_tint_fill\">Tint a fill layer</string>\n    <string name=\"activity_dsl_styling\">DSL styling</string>\n    <string name=\"activity_java_dsl_styling\">Java DSL styling</string>\n    <string name=\"activity_java_runtime_dsl_styling\">Runtime Java DSL styling</string>\n    <string name=\"activity_heatmap_layer\">Visualize data as a heatmap</string>\n    <string name=\"activity_default_styles\">Change the map\\'s style</string>\n    <string name=\"activity_map_recycle\">RecyclerView</string>\n    <string name=\"activity_gestures\">Gestures</string>\n    <string name=\"activity_raw_expression\">Raw Expression</string>\n    <string name=\"activity_raw_geojson\">Raw GeoJSON</string>\n    <string name=\"activity_geojson_in_stack\">Adjust layer order</string>\n    <string name=\"activity_raw_souce_layer\">Raw Source/Layer</string>\n    <string name=\"activity_map_fragment\">Map Fragment</string>\n    <string name=\"activity_map_viewpager\">ViewPager</string>\n    <string name=\"activity_map_multi\">Multi map fragments</string>\n    <string name=\"activity_debug_mode\">Debug mode</string>\n    <string name=\"activity_mapbox_recorder\">Mapbox Recorder</string>\n    <string name=\"activity_fill_extrusion\">Display 3D buildings</string>\n    <string name=\"activity_lights3d\">Display 3D buildings with 3D lights</string>\n    <string name=\"activity_icon_property\">Display multiple icon images in a symbol layer</string>\n    <string name=\"activity_snapshotter\">Create a snapshot</string>\n    <string name=\"activity_snapshotter_dds\">DDS MapSnapshotter</string>\n    <string name=\"activity_snapshotter_local\">Local Style MapSnapshotter</string>\n    <string name=\"activity_location_tracking\">Display the user\\'s location\t</string>\n    <string name=\"activity_simulate_navigation_route\">Simulate a navigation route</string>\n    <string name=\"activity_basic_location_pulsing_circle\">Basic Pulsing Circle</string>\n    <string name=\"activity_simple_geofencing\">Simple Geofencing</string>\n    <string name=\"activity_extended_geofencing\">Extended Geofencing</string>\n    <string name=\"activity_restrict_bounds\">Restrict map panning</string>\n    <string name=\"activity_texture_view\">TextureView</string>\n    <string name=\"activity_texture_view_animation\">Animated TextureView</string>\n    <string name=\"activity_style_circles_categorically\">Style circles categorically</string>\n    <string name=\"activity_space_station_location_title\">Space station current location</string>\n    <string name=\"activity_inset_map_title\">Inset map</string>\n    <string name=\"activity_dds_gradient_line_title\">Line gradient</string>\n    <string name=\"activity_dds_polygon_holes_title\">Draw a polygon with holes</string>\n    <string name=\"activity_dds_polygon_title\">Draw a polygon</string>\n    <string name=\"activity_dds_geojson_line_title\">Draw a GeoJSON line</string>\n    <string name=\"activity_camera_animate_title\">Fly-to camera animation</string>\n    <string name=\"activity_animated_image_source\">Add animated weather data</string>\n    <string name=\"activity_camera_predefined_animators_title\">Using camera animations</string>\n    <string name=\"activity_camera_low_level\">Using custom camera animations</string>\n    <string name=\"activity_camera_animate_during_gesture\">Continue camera animation during gestures</string>\n    <string name=\"activity_dds_multiple_geometries_title\">Draw multiple geometries</string>\n    <string name=\"activity_wms_source\">WMS Source</string>\n    <string name=\"activity_within\">Within expression</string>\n    <string name=\"activity_vector_tile_source\">Vector tile source</string>\n    <string name=\"activity_distance_style\">Distance Expression</string>\n    <string name=\"activity_lab_moving_icon_with_trailing_line_title\">Line behind moving icon</string>\n    <string name=\"activity_labs_snaking_directions_route_title\">Animate a line</string>\n    <string name=\"activity_animate_marker_position\">Animate Marker Position</string>\n    <string name=\"activity_styles_show_hide_layers_title\">Show and hide layers</string>\n    <string name=\"activity_styles_dds_geojson_circle_layer_clusters_title\">Cluster points within a layer</string>\n    <string name=\"activity_style_change_icon_size_title\">Change icon size</string>\n    <string name=\"activity_basic_add_marker_title\">Add markers to map</string>\n    <string name=\"activity_basic_add_one_marker_title\">Add a marker symbol</string>\n    <string name=\"activity_style_image_source_title\">Use an image source</string>\n    <string name=\"activity_offline\">Offline Map</string>\n    <string name=\"activity_legacy_offline\">Legacy offline Map</string>\n    <string name=\"activity_sky_layer\">Add a sky layer</string>\n    <string name=\"activity_sky_snapshotter\">Sky Snapshotter</string>\n    <string name=\"activity_custom_layer\">Custom Layer</string>\n    <string name=\"activity_native_custom_layer\">Native Custom Layer</string>\n    <string name=\"activity_triangle_custom_layer\">Triangle Custom Layer</string>\n    <string name=\"activity_globe_custom_layer\">Globe Custom Layer</string>\n    <string name=\"activity_overlay\">Map overlay</string>\n    <string name=\"activity_localization\">Localization Plugin</string>\n    <string name=\"activity_transparent_bg\">Transparent background</string>\n    <string name=\"activity_mapsurface\">MapSurface</string>\n    <string name=\"activity_view_snapshot\">MapView Snapshot</string>\n    <string name=\"activity_custom_attribution\">Custom Attribution</string>\n    <string name=\"activity_fill\">Add a Fill/Polygon Annotation</string>\n    <string name=\"activity_circle\">Add Circle Annotations</string>\n    <string name=\"activity_symbol\">Add Point Annotations</string>\n    <string name=\"activity_animate_symbol\">AnimatePointAnnotation</string>\n    <string name=\"activity_symbol_cluster\">Add Cluster Symbol Annotations</string>\n    <string name=\"activity_line\">Add Polylines Annotations</string>\n    <string name=\"activity_terrain_showcase\">Use 3D Terrain</string>\n    <string name=\"activity_location_component\">Location component</string>\n    <string name=\"activity_location_component_animation\">Location component animation</string>\n    <string name=\"activity_santa_catalina\">Add a Line to 3D Terrain</string>\n    <string name=\"activity_multiple_display\">Multi display</string>\n    <string name=\"activity_map_view_customization\">Creating a map view</string>\n    <string name=\"activity_ornaments\">Ornaments</string>\n    <string name=\"activity_scale_bar\">Scale Bar</string>\n    <string name=\"activity_large_geojson\">Geojson performance</string>\n    <string name=\"activity_nine_patch\">9-patch image</string>\n    <string name=\"activity_feature_state\">Feature state</string>\n    <string name=\"activity_globe\">Display a globe</string>\n    <string name=\"activity_spinning_globe\">Create a rotating globe</string>\n    <string name=\"activity_osm\">TileJson</string>\n    <string name=\"activity_view_annotations\">View annotations: advanced example</string>\n    <string name=\"activity_view_annotations_basic\">View annotations: basic example</string>\n    <string name=\"activity_view_annotations_point_annotation\">View annotation with point annotation</string>\n    <string name=\"activity_view_annotations_animation\">View annotations: animation</string>\n    <string name=\"activity_dynamic_view_annotations\">Dynamic view annotations</string>\n    <string name=\"activity_info_window\">View annotation as InfoWindow</string>\n    <string name=\"activity_viewport\">Viewport camera</string>\n    <string name=\"activity_advanced_viewport\">Advanced Viewport with gestures</string>\n    <string name=\"activity_third_party_source\">External Vector Source</string>\n    <string name=\"activity_raster_colorization\">Raster Colorization</string>\n    <string name=\"activity_secondary_display_presentation\">Secondary Display using Presentation</string>\n    <string name=\"activity_model_layer\">Display 3D model in a model layer</string>\n    <string name=\"activity_custom_raster_source\">Custom Raster Source</string>\n    <string name=\"actvity_slot_layer\">Slot layer example</string>\n    <string name=\"activity_raster_particles\">Raster Particles</string>\n    <string name=\"activity_clip_layer\">Clip layer example</string>\n    <string name=\"activity_standard_interactions\">Standard Style interactions</string>\n    <string name=\"activity_location_component_model_animation\">Location component model animation</string>\n    <string name=\"activity_precipitation\">Precipitations example</string>\n    <string name=\"activity_color_theme\">Color theme example</string>\n    <string name=\"activity_elevated_line\">Elevated line example</string>\n    <string name=\"activity_join_data\">Join local JSON data with vector tiles</string>\n    <string name=\"activity_edge_to_edge\">Edge-to-Edge layout</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#000000</color>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"mapView\" type=\"id\" />\n    <item name=\"fab\" type=\"id\" />\n    <item name=\"progress\" type=\"id\" />\n    <item name=\"imageView\" type=\"id\" />\n    <item name=\"textView\" type=\"id\" />\n    <item name=\"toolbar\" type=\"id\" />\n    <item name=\"container\" type=\"id\" />\n    <item name=\"item_click_support\" type=\"id\" />\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/interpolators.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string-array name=\"interpolators_array\">\n        <item>FastOutSlowInInterpolator</item>\n        <item>CubicBezier [0, 0, 0.25, 1]</item>\n        <item>FastOutLinearInInterpolator</item>\n        <item>LinearOutSlowInInterpolator</item>\n        <item>BounceInterpolator</item>\n        <item>AnticipateInterpolator</item>\n        <item>AnticipateOvershootInterpolator</item>\n    </string-array>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Mapbox Maps SDK Test App</string>\n\n    <!--Default style names-->\n    <string name=\"menu_map_style_streets\">Streets</string>\n    <string name=\"menu_map_style_dark\">Dark</string>\n    <string name=\"menu_map_style_light\">Light</string>\n    <string name=\"menu_map_style_outdoors\">Outdoors</string>\n    <string name=\"menu_map_style_standard\">Standard</string>\n    <string name=\"menu_map_style_satellite\">Satellite</string>\n    <string name=\"menu_map_style_standard_satellite\">Standard Satellite</string>\n    <string name=\"menu_map_style_custom_style\">Custom</string>\n    <string name=\"toggle_focus_on_a_point\">Toggle focus on a point</string>\n    <string name=\"toggle_velocity_animations\">Toggle deceleration animations</string>\n    <string name=\"toggle_rotate_enabled\">Toggle rotate enabled</string>\n    <string name=\"toggle_pitch_enabled\">Toggle pitch enabled</string>\n    <string name=\"toggle_zoom_enabled\">Toggle pinch-to-zoom enabled</string>\n    <string name=\"toggle_scroll_enabled\">Toggle scroll enabled</string>\n    <string name=\"toggle_double_tap_enabled\">Toggle double tap to zoom in enabled</string>\n    <string name=\"toggle_double_touch_enabled\">Toggle double touch to zoom out enabled</string>\n    <string name=\"toggle_quick_zoom_enabled\">Toggle quick zoom enabled</string>\n    <string name=\"pan_scroll_horizontal_vertical\">Scroll horizontal and vertical</string>\n    <string name=\"pan_scroll_horizontal\">Scroll horizontal</string>\n    <string name=\"pan_scroll_vertical\">Scroll vertical</string>\n\n    <!--Search-->\n    <string name=\"search_edittext_hint\">Search for examples here</string>\n    <string name=\"clear_search_imageview_content_description\">Clear example search button</string>\n    <string name=\"no_results_for_search_query\">No results for that search query</string>\n\n    <!--Location-->\n    <string name=\"toggle_customised_puck\">Toggle customised puck style</string>\n    <string name=\"toggle_custom_map_style\">Toggle custom Map style</string>\n    <string name=\"toggle_custom_map_projection\">Toggle custom Map projection</string>\n    <string name=\"location_disable_component\">Disable Component</string>\n    <string name=\"location_enable_component\">Enable Component</string>\n    <string name=\"location_show_bearing\">Show bearing image</string>\n    <string name=\"location_hide_bearing\">Hide bearing image</string>\n    <string name=\"location_stop_pulsing\">Stop pulsing</string>\n    <string name=\"location_start_pulsing\">Start pulsing</string>\n    <string name=\"location_disable_accuracy\">Disable Accuracy Ring</string>\n    <string name=\"location_enable_accuracy\">Enable Accuracy Ring</string>\n    <string name=\"toggle_opacity\">Toggle opacity</string>\n    <string name=\"location_pulsing_puck_follow_accuracy_radius\">Pulsing follow accuracy Ring</string>\n    <!--RestrictBounds-->\n    <string name=\"restrict_san_francisco\">Restrict San Francisco</string>\n    <string name=\"restrict_almost_worldview\">Restrict almost worldview</string>\n    <string name=\"restrict_across_idl\">Restrict across IDL</string>\n    <string name=\"restrict_reset\">Reset bounds</string>\n    <string name=\"toggle_show_bounds\">Toggle show bounds</string>\n\n    <!--Space station toast-->\n    <string name=\"space_station_toast\">Zoom in closely on the space station\\nto see it moving across the map</string>\n\n    <!--On map click toast-->\n    <string name=\"tap_on_map_instruction\">Tap anywhere on the map</string>\n\n    <!-- Camera -->\n    <string name=\"menu_animator_ease_to\">Ease To</string>\n    <string name=\"menu_animator_fly_to\">Fly To</string>\n    <string name=\"menu_animator_jump_to\">Jump To Start</string>\n    <string name=\"menu_animator_move_by\">Move By</string>\n    <string name=\"menu_animator_pitch_by\">Pitch By</string>\n    <string name=\"menu_animator_scale_by\">Scale By</string>\n    <string name=\"menu_animator_rotate_by\">Rotate By</string>\n    <string name=\"cancel_animation\">Cancel animation</string>\n\n    <!--Marker strings for DirectionsActivity activity-->\n    <string name=\"snaking_directions_activity_error\">Direction route retrieval failed</string>\n\n    <!--Zoom in and out map instruction for toast-->\n    <string name=\"zoom_map_in_and_out_instruction\">Zoom in and out to see cluster numbers change</string>\n\n    <!--OfflineManager-->\n    <string name=\"view_map\">View map</string>\n\n    <!-- Sky layer-->\n    <string name=\"sky_mode\">Mode: %1$s</string>\n    <string name=\"sky_gradient_radius\">Radius = %1$d</string>\n    <string name=\"sky_sun_intensity\">Intensity = %1$d</string>\n    <string name=\"sky_center_azimuth\">CenterA = %1$d</string>\n    <string name=\"sky_center_polar\">CenterP = %1$d</string>\n    <string name=\"sky_snapshotter_maneuver\">Next maneuver</string>\n\n    <!-- MapView Snapshot -->\n    <string name=\"content_description_snaphot\">Snapshot image of the MapView</string>\n\n    <!-- Custom attribution-->\n    <string name=\"custom_attribution_custom\">Applied the custom attribution</string>\n    <string name=\"custom_attribution_withImproveMap\">WithImproveMap</string>\n    <string name=\"custom_attribution_withCopyrightSign\">WithCopyrightSign</string>\n    <string name=\"custom_attribution_withTelemetryAttribution\">WithTelemetry</string>\n    <string name=\"custom_attribution_withMapboxAttribution\">WithMapbox</string>\n    <string name=\"custom_attribution_withMapboxPrivacyPolicy\">WithPrivacyPolicy</string>\n\n    <!-- Symbol Activity-->\n    <string name=\"toggle_draggable_state\">Toggle draggable state</string>\n    <string name=\"consume_click_event\">Toggle consume click state</string>\n    <string name=\"consume_click_event_toast\">Click listener will consume click event: </string>\n    <string name=\"change_icon_to_coffee\">Change icon to coffee</string>\n    <string name=\"change_icon_to_bitmap_blue\">Change icon to blue bitmap</string>\n    <string name=\"set_icon_rotation_to_45\">Set icon rotation to 45</string>\n    <string name=\"set_icon_anchor_bottom\">Set icon anchor bottom</string>\n    <string name=\"set_icon_opacity_to_0_5f\">Set icon opacity to 0.5f</string>\n    <string name=\"offset_icon_by_10_20\">Offset icon by 10, 20</string>\n    <string name=\"add_text\">Add text</string>\n    <string name=\"set_text_color_to_white\">Set text color to white</string>\n    <string name=\"set_text_size\">Set text size</string>\n    <string name=\"set_text_anchor_top\">Set text anchor top</string>\n    <string name=\"change_z_index\">Change Z index</string>\n    <string name=\"add_icon_halo\">Add icon halo</string>\n    <string name=\"filter\">Filter</string>\n    <string name=\"animate_symbol\">Animate symbol</string>\n    <string name=\"display_the_second_screen\">Display map in the second screen</string>\n    <string name=\"move_camera\">Move Camera</string>\n    <string name=\"satellite_style_pack\">Satellite style pack</string>\n    <string name=\"standard_style_pack\">Standard style pack</string>\n    <string name=\"tile_region\">Tile region</string>\n    <string name=\"move_to_bottom_slot\">Move to bottom slot</string>\n    <string name=\"reset_slot\">Reset slot</string>\n\n\n    <!--Debug Mode Activity-->\n    <string name=\"toggle_tile_borders\">Tile Borders</string>\n    <string name=\"toggle_parse_status\">Parse Status</string>\n    <string name=\"toggle_timestamps\">Timestamps</string>\n    <string name=\"toggle_collision\">Collision</string>\n    <string name=\"toggle_overdraw\">Overdraw</string>\n    <string name=\"toggle_stencil_clip\">Stencil Clip</string>\n    <string name=\"toggle_depth_buffer\">Depth Buffer</string>\n    <string name=\"toggle_camera_overlay\">Camera state</string>\n    <string name=\"toggle_padding_overlay\">Padding overlay</string>\n    <string name=\"show_map_info\">Style Info</string>\n    <string name=\"fps\">%1$s FPS</string>\n\n    <string name=\"change_language_instruction\">Make sure that the device\\'s default language is not English</string>\n    <string name=\"map_not_localized\">Map localized to selected language</string>\n    <string name=\"map_localized\">Map localized to device language</string>\n\n    <!--Location component Activity-->\n    <string name=\"heading\">Bearing source: Heading</string>\n    <string name=\"course\">Bearing source: Course</string>\n    <string name=\"location_no_animation\">No location animation</string>\n    <string name=\"location_300ms_animation\">300ms location animation</string>\n    <string name=\"location_1s_animation\">1s location animation</string>\n    <string name=\"english\">English</string>\n    <string name=\"spanish\">Spanish</string>\n    <string name=\"french\">French</string>\n    <string name=\"german\">German</string>\n    <string name=\"russian\">Russian</string>\n    <string name=\"chinese\">Chinese</string>\n    <string name=\"simplified_chinese\">Simplified Chinese</string>\n    <string name=\"portuguese\">Portuguese</string>\n    <string name=\"japanese\">Japanese</string>\n    <string name=\"korean\">Korean</string>\n    <string name=\"vietnamese\">Vietnamese</string>\n    <string name=\"italian\">Italian</string>\n    <string name=\"local_names\">Local names</string>\n    <string name=\"country_label\">Country label</string>\n    <string name=\"state_label\">State label</string>\n    <string name=\"magnitude\">Magnitude:</string>\n    <string name=\"location\">Location:</string>\n    <string name=\"date\">Date:</string>\n    <string name=\"z_order_auto\">SymbolZOrderAuto</string>\n    <string name=\"z_order_viewport_y\">SymbolZOrderViewportY</string>\n    <string name=\"z_order_source\">SymbolZOrderSource</string>\n\n    <!--3D Globe Activity-->\n    <string name=\"info_text\">Current zoom:\\n %1$s\\n\\nCurrent actual projection:\\n %2$s\\n\\nCurrent selected projection:\\n %3$s</string>\n\n    <!--View Annotations-->\n    <string name=\"content_description_close\">Close callout</string>\n    <string name=\"dynamic_mode\">Mode: %1$s</string>\n\n    <!-- Tile requests -->\n    <string name=\"set_tile_request_delay\">Set tile request delay to 2 sec</string>\n    <string name=\"set_tile_network_request_delay\">Set tile network delay to 2 sec</string>\n    <string name=\"follow\">Follow</string>\n\n    <!-- Line trim offset -->\n    <string name=\"trim_offset\">Increase trim offset</string>\n\n    <!-- Clip layer -->\n    <string name=\"clip_model\">Clip model</string>\n    <string name=\"clip_symbol\">Clip symbol</string>\n    <string name=\"clip_model_and_symbol\">Clip model and symbol</string>\n    <string name=\"clip_reset\">Reset</string>\n    <string name=\"color_theme_red\">Red</string>\n    <string name=\"color_theme_reset\">Reset</string>\n    <string name=\"color_theme_monochrome\">Monochrome</string>\n    <string name=\"color_theme_toggle_atmosphere\">Use theme color for Atmosphere</string>\n\n    <!-- Standard style interactions activity -->\n    <string name=\"select_all\">Select All</string>\n    <!-- Indoor Example Activity -->\n    <string name=\"activity_indoor_example\">Indoor Example</string>\n    <string name=\"description_indoor_example\">Showcase Indoor Manager API with Mapbox Standard Style</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.MaterialComponents.Light.DarkActionBar\">\n        <item name=\"colorPrimary\">@color/primary</item>\n        <item name=\"colorPrimaryDark\">@color/primaryDark</item>\n        <item name=\"colorAccent\">@color/accent</item>\n        <item name=\"android:windowBackground\">@color/white</item>\n        <item name=\"android:spinnerItemStyle\">@style/MySpinnerStyle</item>\n        <item name=\"android:spinnerDropDownItemStyle\">@style/SpinnerItem.DropDownItem</item>\n        <item name=\"android:windowOptOutEdgeToEdgeEnforcement\" tools:ignore=\"NewApi\">true</item>\n    </style>\n\n    <style name=\"MySpinnerStyle\">\n        <item name=\"android:popupBackground\">@android:color/background_light</item>\n        <item name=\"android:textColor\">@android:color/background_light</item>\n    </style>\n\n    <style name=\"MapOverlayStyle\">\n        <item name=\"android:layout_width\">100dp</item>\n        <item name=\"android:layout_height\">100dp</item>\n        <item name=\"android:background\">@color/simi_transparent_blue</item>\n        <item name=\"android:textColor\">@color/accent</item>\n        <item name=\"android:textSize\">18sp</item>\n        <item name=\"android:gravity\">center</item>\n        <item name=\"android:textStyle\">bold</item>\n    </style>\n\n    <style name=\"CustomAttributionCheckbox\" parent=\"@android:style/Widget.Holo.CheckedTextView\">\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:checkMark\">?android:attr/listChoiceIndicatorMultiple</item>\n        <item name=\"android:checked\">true</item>\n        <item name=\"android:gravity\">center</item>\n        <item name=\"android:padding\">10dp</item>\n        <item name=\"android:textSize\">20sp</item>\n    </style>\n\n    <style name=\"SpinnerItem.DropDownItem\" parent=\"@android:style/Widget.DropDownItem.Spinner\">\n        <item name=\"android:textColor\">@android:color/background_light</item>\n    </style>\n\n    <style name=\"CameraPredefinedAnimationsActivityTheme\" parent=\"AppTheme\">\n        <item name=\"android:spinnerDropDownItemStyle\">@style/PredefinedAnimationsDropDownSpinner</item>\n    </style>\n\n    <style name=\"PredefinedAnimationsDropDownSpinner\" parent=\"@android:style/Widget.DropDownItem.Spinner\">\n        <item name=\"android:textColor\">@android:color/background_dark</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/xml/map_wallpaper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<wallpaper xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:settingsActivity=\"com.mapbox.maps.testapp.ExampleOverviewActivity\"/>"
  },
  {
    "path": "build.gradle.kts",
    "content": "buildscript {\n  repositories {\n    mavenLocal()\n    google()\n    mavenCentral()\n    maven {\n      url = uri(\"https://api.mapbox.com/downloads/v2/releases/maven\")\n      credentials {\n        username = \"mapbox\"\n        password = System.getenv(\"SDK_REGISTRY_TOKEN\") ?: project.property(\"SDK_REGISTRY_TOKEN\") as String\n      }\n      authentication {\n        create<BasicAuthentication>(\"basic\")\n      }\n    }\n    maven {\n      url = uri(\"https://plugins.gradle.org/m2/\")\n    }\n    gradlePluginPortal()\n  }\n  dependencies {\n    classpath(libs.plugin.gradle)\n    classpath(libs.plugin.kotlin)\n    classpath(libs.plugin.jacoco)\n    classpath(libs.plugin.license)\n    classpath(libs.plugin.mapbox.accessToken)\n    classpath(libs.plugin.mapbox.sdkRegistry)\n    classpath(libs.plugin.mapbox.sdkVersions)\n    classpath(libs.plugin.mapbox.ndk)\n    classpath(libs.plugin.playPublisher)\n    classpath(libs.plugin.gradleVersions)\n  }\n}\n\nallprojects {\n  repositories {\n    mavenLocal()\n    google()\n    mavenCentral()\n    maven {\n      url = uri(\"https://api.mapbox.com/downloads/v2/releases/maven\")\n      credentials {\n        username = \"mapbox\"\n        password = System.getenv(\"SDK_REGISTRY_TOKEN\") ?: project.property(\"SDK_REGISTRY_TOKEN\") as String\n      }\n      authentication {\n        create<BasicAuthentication>(\"basic\")\n      }\n    }\n    if (!isBuildingReleaseTag && !isTargettingReleaseBranch) {\n      maven {\n        url = uri(\"https://api.mapbox.com/downloads/v2/snapshots/maven\")\n        credentials {\n          username = \"mapbox\"\n          password = System.getenv(\"SDK_REGISTRY_TOKEN\") ?: project.property(\"SDK_REGISTRY_TOKEN\") as String\n        }\n        authentication {\n          create<BasicAuthentication>(\"basic\")\n        }\n      }\n    }\n    maven {\n      url = uri(\"https://oss.jfrog.org/artifactory/oss-snapshot-local/\")\n    }\n    maven {\n      url = uri(\"https://jitpack.io\")\n    }\n  }\n}\n\n// hack to fix unit test, see https://github.com/robolectric/robolectric/issues/5131#issuecomment-509631890.\nsubprojects {\n  tasks.withType<Test> {\n    maxParallelForks = 2\n    forkEvery = 80\n    maxHeapSize = \"2048m\"\n    minHeapSize = \"1024m\"\n  }\n}\n\nplugins {\n  id(\"com.mapbox.gradle.root\")\n  // the IDE mistakenly highlights `libs` as an error, see https://github.com/gradle/gradle/issues/22797\n  alias(libs.plugins.binaryCompatibilityValidatorId)\n  // Used to print dependency tree of the task, useful to debug gradle tasks\n  // Ticket to track adding this feature to gradle officially: https://github.com/gradle/gradle/issues/980\n  alias(libs.plugins.taskTreeId)\n}\n\napiValidation {\n  /**\n   * Packages that are excluded from public API dumps even if they\n   * contain public API.\n   */\n//  ignoredPackages.add(\"kotlinx.coroutines.internal\")\n\n  /**\n   * Sub-projects that are excluded from API validation\n   */\n  ignoredProjects.addAll(listOf(\"extension-style-app\", \"android-auto-app\", \"app\"))\n\n  /**\n   * Classes (fully qualified) that are excluded from public API dumps even if they\n   * contain public API.\n   */\n  ignoredClasses.addAll(\n    listOf(\n      \"com.mapbox.maps.extension.androidauto.BuildConfig\",\n      \"com.mapbox.maps.extension.style.BuildConfig\",\n      \"com.mapbox.maps.extension.localization.BuildConfig\",\n      \"com.mapbox.maps.module.telemetry.BuildConfig\",\n      \"com.mapbox.maps.plugin.camera.animation.BuildConfig\",\n      \"com.mapbox.maps.plugin.annotation.BuildConfig\",\n      \"com.mapbox.maps.plugin.attribution.BuildConfig\",\n      \"com.mapbox.maps.plugin.compass.BuildConfig\",\n      \"com.mapbox.maps.plugin.gestures.BuildConfig\",\n      \"com.mapbox.maps.plugin.indoorselector.BuildConfig\",\n      \"com.mapbox.maps.plugin.lifecycle.BuildConfig\",\n      \"com.mapbox.maps.plugin.locationcomponent.BuildConfig\",\n      \"com.mapbox.maps.plugin.logo.BuildConfig\",\n      \"com.mapbox.maps.plugin.overlay.BuildConfig\",\n      \"com.mapbox.maps.plugin.scalebar.BuildConfig\",\n      \"com.mapbox.maps.plugin.viewport.BuildConfig\",\n      \"com.mapbox.maps.BuildConfig\",\n      \"com.mapbox.maps.base.BuildConfig\"\n    )\n  )\n\n  /**\n   * Set of annotations that exclude API from being public.\n   * Typically, it is all kinds of `@InternalApi` annotations that mark\n   * effectively private API that cannot be actually private for technical reasons.\n   */\n//  nonPublicMarkers.add(\"com.mapbox.maps.MapboxExperimental\")\n\n  /**\n   * Flag to programmatically disable compatibility validator\n   */\n  validationDisabled = false\n}\n\n/**\n * @return True if this build is part of Circleci job triggered from a release tag\n */\npublic val isBuildingReleaseTag = \"^v[0-9]+\\\\.[0-9]+\\\\.[0-9]+.*\\$\".toRegex().matches(System.getenv(\"CIRCLE_TAG\") ?: \"\")\n\n/**\n * @return True if this build is part of Circleci job triggered from a PR that targets a release branch\n */\npublic val isTargettingReleaseBranch = \"^v[0-9]+\\\\.[0-9]+\\$\".toRegex().matches(System.getenv(\"PR_TARGET_BRANCH\") ?: \"\")\n"
  },
  {
    "path": "cloudformation/ci.template.js",
    "content": "var cf = require('@mapbox/cloudfriend');\n\nmodule.exports = {\nAWSTemplateFormatVersion: '2010-09-09',\n  Resources: {\n    User: {\n      Type: 'AWS::IAM::User',\n      Properties: {\n        Policies: [\n          {\n            PolicyName: 'publish-android',\n            PolicyDocument: {\n              Statement: [\n                {\n                  Action: ['publish-android:*'],\n                  Effect: 'Allow',\n                  Resource: '*'\n                }\n              ]\n            }\n          },\n          {\n            PolicyName: 'upload-sdk-registry',\n            PolicyDocument: {\n              Statement: [\n                {\n                  Action: ['s3:ListBucket'],\n                  Effect: 'Allow',\n                  Resource: [\n                    'arn:aws:s3:::mapbox-api-downloads-production',\n                    'arn:aws:s3:::mapbox-api-downloads-staging'\n                  ]\n                },\n                {\n                  Action: ['s3:PutObject'],\n                  Effect: 'Allow',\n                  Resource: [\n                    'arn:aws:s3:::mapbox-api-downloads-production/v2/*',\n                    'arn:aws:s3:::mapbox-api-downloads-staging/v2/*'\n                  ]\n                }\n              ]\n            }\n          },\n          {\n            PolicyName: 'get-signing-key',\n            PolicyDocument: {\n              Statement: [\n                {\n                  Action: ['s3:GetObject'],\n                  Effect: 'Allow',\n                  Resource: ['arn:aws:s3:::mapbox/android/signing-credentials/secring.gpg']\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    AccessKey: {\n      Type: 'AWS::IAM::AccessKey',\n      Properties: {\n        UserName: cf.ref('User')\n      }\n    }\n  },\n  Outputs: {\n    AccessKeyId: { Value: cf.ref('AccessKey') },\n    SecretAccessKey: { Value: cf.getAtt('AccessKey', 'SecretAccessKey') }\n  }\n};"
  },
  {
    "path": "codecov.yml",
    "content": "coverage:\n  status:\n    project:\n      default:\n        target: auto\n        threshold: 1%\ncomment:\n  layout: \"reach, diff, flags, files\"\n  behavior: default\n  require_changes: true\n\n"
  },
  {
    "path": "compose-app/.gitignore",
    "content": "/build"
  },
  {
    "path": "compose-app/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.application\")\n  id(\"org.jetbrains.kotlin.plugin.parcelize\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.compose.testapp\"\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    applicationId = \"com.mapbox.maps.compose.testapp\"\n    versionCode = 1\n    versionName = \"0.1.0\"\n    multiDexEnabled = true\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    testInstrumentationRunnerArguments[\"clearPackageData\"] = \"true\"\n    vectorDrawables {\n      useSupportLibrary = true\n    }\n  }\n\n  buildTypes {\n    getByName(\"release\") {\n      isMinifyEnabled = true\n      // For local testing only, should use a different keystore if used besides testing.\n      signingConfig = signingConfigs.getByName(\"debug\")\n      proguardFiles(\n        getDefaultProguardFile(\"proguard-android.txt\"),\n        \"proguard-rules.pro\",\n        \"mapbox-services-proguard-rules.pro\",\n        \"retrofit2-proguard-rules.pro\"\n      )\n    }\n    getByName(\"debug\") {\n      isMinifyEnabled = false\n      signingConfig = signingConfigs.getByName(\"debug\")\n    }\n  }\n\n  compileOptions {\n    sourceCompatibility = JavaVersion.VERSION_1_8\n    targetCompatibility = JavaVersion.VERSION_1_8\n  }\n\n  composeOptions {\n    kotlinCompilerExtensionVersion = libs.versions.compose.get()\n  }\n\n  kotlinOptions {\n    freeCompilerArgs += \"-Xexplicit-api=strict\"\n  }\n\n  testOptions {\n    if (!project.hasProperty(\"android.injected.invoked.from.ide\")) {\n      execution = \"ANDROIDX_TEST_ORCHESTRATOR\"\n    }\n  }\n\n  buildFeatures {\n    compose = true\n  }\n}\n\ndependencies {\n  implementation(project(\":maps-sdk\"))\n  implementation(project(\":extension-compose\"))\n  implementation(platform(libs.compose.bom))\n  implementation(libs.compose.ui)\n  implementation(libs.compose.material)\n  implementation(appsLibs.androidx.activityCompose)\n  implementation(appsLibs.compose.uiToolingPreview)\n  implementation(appsLibs.compose.uiTooling)\n  implementation(appsLibs.googleMaterialDesign)\n  implementation(appsLibs.mapbox.turf)\n  implementation(appsLibs.mapbox.services)\n\n  implementation(libs.androidx.appCompat)\n  implementation(libs.androidx.coreKtx)\n  implementation(appsLibs.googlePlayServicesLocation)\n  androidTestUtil(libs.androidx.orchestrator)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n  androidTestImplementation(libs.androidx.testJUnit)\n  androidTestImplementation(libs.androidx.uiAutomator)\n  testImplementation(libs.junit)\n  debugImplementation(appsLibs.squareLeakCanary)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "compose-app/mapbox-services-proguard-rules.pro",
    "content": "# AutoValue are required by com.mapbox.api.directions.v5.MapboxDirections\n-dontwarn com.google.auto.value.AutoValue$Builder\n-dontwarn com.google.auto.value.AutoValue"
  },
  {
    "path": "compose-app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "compose-app/retrofit2-proguard-rules.pro",
    "content": "# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and\n# EnclosingMethod is required to use InnerClasses.\n-keepattributes Signature, InnerClasses, EnclosingMethod\n\n# Retrofit does reflection on method and parameter annotations.\n-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations\n\n# Keep annotation default values (e.g., retrofit2.http.Field.encoded).\n-keepattributes AnnotationDefault\n\n# Retain service method parameters when optimizing.\n-keepclassmembers,allowshrinking,allowobfuscation interface * {\n    @retrofit2.http.* <methods>;\n}\n\n# Ignore annotation used for build tooling.\n-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement\n\n# Ignore JSR 305 annotations for embedding nullability information.\n-dontwarn javax.annotation.**\n\n# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.\n-dontwarn kotlin.Unit\n\n# Top-level functions that can only be used by Kotlin.\n-dontwarn retrofit2.KotlinExtensions\n-dontwarn retrofit2.KotlinExtensions$*\n\n# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy\n# and replaces all potential values with null. Explicitly keeping the interfaces prevents this.\n-if interface * { @retrofit2.http.* <methods>; }\n-keep,allowobfuscation interface <1>\n\n# Keep inherited services.\n-if interface * { @retrofit2.http.* <methods>; }\n-keep,allowobfuscation interface * extends <1>\n\n# With R8 full mode generic signatures are stripped for classes that are not\n# kept. Suspend functions are wrapped in continuations where the type argument\n# is used.\n-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation\n\n# R8 full mode strips generic signatures from return types if not kept.\n-if interface * { @retrofit2.http.* public *** *(...); }\n-keep,allowoptimization,allowshrinking,allowobfuscation class <3>\n\n# With R8 full mode generic signatures are stripped for classes that are not kept.\n-keep,allowobfuscation,allowshrinking class retrofit2.Response\n"
  },
  {
    "path": "compose-app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n    <uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />\n\n    <application\n        android:name=\".MapboxApplication\"\n        android:icon=\"@mipmap/ic_launcher_round\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.MapboxMapCompose\">\n        <activity\n            android:name=\".ExampleOverviewActivity\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTop\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".examples.basic.SimpleMapActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_simple_map\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_simple_map\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n        </activity>\n        <activity\n            android:name=\".examples.basic.LazyColumnMapActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_lazy_column_map\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_lazy_column_map\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n        </activity>\n        <activity\n            android:name=\".examples.basic.DebugModeActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_debug_mode\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_debug_mode\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n        </activity>\n        <activity\n            android:name=\".examples.basic.AccessibilityScaleActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_accessibility_scale\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_accessibility_scale\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_lab\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.MarkersActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_markers\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_markers\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.CircleAnnotationActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_circle_annotation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_circle_annotation\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.PointAnnotationClusterActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_point_annotation_cluster\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_point_annotation_cluster\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.PolygonAnnotationActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_polygon_annotation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_polygon_annotation\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.PolylineAnnotationActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_polyline_annotation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_polyline_annotation\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.CustomVectorIconsActivity\"\n            android:description=\"@string/description_custom_vector_icons\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_custom_vector_icons\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.ViewAnnotationActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_view_annotation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_view_annotation\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.DynamicViewAnnotationActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_dynamic_view_annotation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_dynamic_view_annotation\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n        </activity>\n        <activity\n            android:name=\".examples.animation.MapViewportAnimationsActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_map_viewport_animation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_map_viewport_animation\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_camera\" />\n        </activity>\n        <activity\n            android:name=\".examples.basic.MultiDisplayActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_multiple_display\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_multiple_display\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n        </activity>\n        <activity\n            android:name=\".examples.ornaments.OrnamentCustomisationActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_ornaments_customisation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_ornaments_customisation\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_ornaments\" />\n        </activity>\n        <activity\n            android:name=\".examples.ornaments.CustomAttributionActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_custom_attribution\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_custom_attribution\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_ornaments\" />\n        </activity>\n        <activity\n            android:name=\".examples.location.LocationComponentActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_location_location_component\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_location_location_component\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.StyleCompositionActivity\"\n            android:description=\"@string/description_style_composition\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_style_composition\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.location.NavigationSimulationActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_navigation_simulation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_navigation_simulation\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_location\" />\n        </activity>\n        <activity\n            android:name=\".examples.basic.MultiMapActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_multi_map\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_multi_map\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.StyleStatesActivity\"\n            android:description=\"@string/description_style_states\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_style_states\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.GenericStylePositionsActivity\"\n            android:description=\"@string/description_style_positions\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_style_positions\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.ModelLayerActivity\"\n            android:description=\"@string/description_model_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_model_layer\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.ImageSourceActivity\"\n            android:description=\"@string/description_style_image_source\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_style_image_source_title\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.TerrainActivity\"\n            android:description=\"@string/description_terrain\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_terrain\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.AnimatedImageSourceActivity\"\n            android:description=\"@string/description_animated_image_source\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_animated_image_source\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.StyleImportsActivity\"\n            android:description=\"@string/description_style_imports\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_style_imports\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.basic.QueryRenderedFeatureActivity\"\n            android:description=\"@string/description_query_rendered_feature\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_query_rendered_feature\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.StandardStyleActivity\"\n            android:description=\"@string/description_standard_style\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_standard_style\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.annotation.PointAnnotationActivity\"\n            android:configChanges=\"orientation|screenSize|screenLayout\"\n            android:description=\"@string/description_point_annotation\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_point_annotation\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_annotation\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.ClipLayerActivity\"\n            android:description=\"@string/description_clip_layer\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_clip_layer\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.InteractionsActivity\"\n            android:description=\"@string/description_interactions\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_interactions\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.AppearancesActivity\"\n            android:description=\"@string/description_appearances\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_appearances\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.PrecipitationsActivity\"\n            android:description=\"@string/description_precipitations\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_precipitations\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.ColorThemeActivity\"\n            android:description=\"@string/description_color_theme\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_color_theme\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.style.ElevatedLineActivity\"\n            android:description=\"@string/description_elevated_line\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_elevated_line\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_styles\" />\n        </activity>\n        <activity\n            android:name=\".examples.model.Interactive3DModelFeatureStateActivity\"\n            android:description=\"@string/description_3d_model_feature_state_interactions\"\n            android:label=\"@string/activity_3d_model_feature_state_interactions\"\n            android:exported=\"true\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_3D\" />\n        </activity>\n        <activity\n            android:name=\".examples.model.Animated3DModelActivity\"\n            android:description=\"@string/description_animated_3d_model\"\n            android:label=\"@string/activity_animated_3d_model\"\n            android:exported=\"true\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_3D\" />\n        </activity>\n        <activity\n            android:name=\".examples.basic.EdgeToEdgeActivity\"\n            android:description=\"@string/description_edge_to_edge\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_edge_to_edge\"\n            android:parentActivityName=\".ExampleOverviewActivity\">\n            <meta-data\n                android:name=\"@string/category\"\n                android:value=\"@string/category_basic\" />\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "compose-app/src/main/assets/dva-sf-construction.geojson",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"id\": \"construction-1\",\n      \"properties\": {},\n      \"geometry\": {\n        \"coordinates\": [\n          -122.41444169500868,\n          37.6344580806383\n        ],\n        \"type\": \"Point\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "compose-app/src/main/assets/dva-sf-parkings.geojson",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"id\": \"parking-1\",\n      \"properties\": {},\n      \"geometry\": {\n        \"coordinates\": [\n          [\n            [\n              -122.3990874275777,\n              37.631443435105766\n            ],\n            [\n              -122.40109800352596,\n              37.62571512403454\n            ],\n            [\n              -122.39624128759871,\n              37.62534287193719\n            ],\n            [\n              -122.39665906961409,\n              37.630823061723746\n            ],\n            [\n              -122.3990874275777,\n              37.631443435105766\n            ]\n          ]\n        ],\n        \"type\": \"Polygon\"\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"parking-2\",\n      \"properties\": {},\n      \"geometry\": {\n        \"coordinates\": [\n          [\n            [\n              -122.40255715731259,\n              37.63562891958904\n            ],\n            [\n              -122.40219921691639,\n              37.63472700673118\n            ],\n            [\n              -122.40075660865297,\n              37.63514790076043\n            ],\n            [\n              -122.4016243429468,\n              37.63669402162793\n            ],\n            [\n              -122.40255715731259,\n              37.63562891958904\n            ]\n          ]\n        ],\n        \"type\": \"Polygon\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "compose-app/src/main/assets/dva-sf-route-alternative.geojson",
    "content": "{\n  \"type\": \"Feature\",\n  \"id\": \"route-sf-2\",\n  \"properties\": {},\n  \"geometry\": {\n    \"coordinates\": [\n      [\n        -122.407122,\n        37.652918\n      ],\n      [\n        -122.40703,\n        37.651854\n      ],\n      [\n        -122.406994,\n        37.651448\n      ],\n      [\n        -122.406878,\n        37.650131\n      ],\n      [\n        -122.406851,\n        37.649815\n      ],\n      [\n        -122.406772,\n        37.648917\n      ],\n      [\n        -122.406733,\n        37.648485\n      ],\n      [\n        -122.406676,\n        37.647823\n      ],\n      [\n        -122.406364,\n        37.644247\n      ],\n      [\n        -122.406231,\n        37.642768\n      ],\n      [\n        -122.406206,\n        37.642476\n      ],\n      [\n        -122.406181,\n        37.642169\n      ],\n      [\n        -122.406169,\n        37.642037\n      ],\n      [\n        -122.406155,\n        37.641901\n      ],\n      [\n        -122.406134,\n        37.641737\n      ],\n      [\n        -122.406113,\n        37.641594\n      ],\n      [\n        -122.406124,\n        37.640978\n      ],\n      [\n        -122.406109,\n        37.640702\n      ],\n      [\n        -122.406071,\n        37.640439\n      ],\n      [\n        -122.406003,\n        37.64011\n      ],\n      [\n        -122.405936,\n        37.639844\n      ],\n      [\n        -122.405864,\n        37.639579\n      ],\n      [\n        -122.405791,\n        37.639341\n      ],\n      [\n        -122.4057,\n        37.639076\n      ],\n      [\n        -122.405616,\n        37.638864\n      ],\n      [\n        -122.40506,\n        37.637567\n      ],\n      [\n        -122.404993,\n        37.637389\n      ],\n      [\n        -122.404954,\n        37.637253\n      ],\n      [\n        -122.404929,\n        37.637124\n      ],\n      [\n        -122.404911,\n        37.636997\n      ],\n      [\n        -122.404902,\n        37.636848\n      ],\n      [\n        -122.404905,\n        37.636681\n      ],\n      [\n        -122.404921,\n        37.636531\n      ],\n      [\n        -122.40495,\n        37.636375\n      ],\n      [\n        -122.404989,\n        37.63623\n      ],\n      [\n        -122.405049,\n        37.636066\n      ],\n      [\n        -122.405131,\n        37.635897\n      ],\n      [\n        -122.405231,\n        37.635737\n      ],\n      [\n        -122.405342,\n        37.635578\n      ],\n      [\n        -122.405473,\n        37.635425\n      ],\n      [\n        -122.40565,\n        37.635254\n      ],\n      [\n        -122.405853,\n        37.635083\n      ],\n      [\n        -122.406059,\n        37.63494\n      ],\n      [\n        -122.406273,\n        37.63481\n      ],\n      [\n        -122.406478,\n        37.634695\n      ],\n      [\n        -122.406679,\n        37.634598\n      ],\n      [\n        -122.406877,\n        37.634515\n      ],\n      [\n        -122.407049,\n        37.634453\n      ],\n      [\n        -122.407305,\n        37.634373\n      ],\n      [\n        -122.40756,\n        37.634306\n      ],\n      [\n        -122.407819,\n        37.63425\n      ],\n      [\n        -122.40807,\n        37.634205\n      ],\n      [\n        -122.408326,\n        37.634167\n      ],\n      [\n        -122.408554,\n        37.634143\n      ],\n      [\n        -122.408857,\n        37.634115\n      ],\n      [\n        -122.409329,\n        37.634083\n      ],\n      [\n        -122.409639,\n        37.634089\n      ],\n      [\n        -122.409887,\n        37.634099\n      ],\n      [\n        -122.410988,\n        37.634155\n      ],\n      [\n        -122.411571,\n        37.634204\n      ],\n      [\n        -122.412807,\n        37.634316\n      ],\n      [\n        -122.413372,\n        37.634363\n      ],\n      [\n        -122.413698,\n        37.63438\n      ],\n      [\n        -122.414031,\n        37.634389\n      ],\n      [\n        -122.414365,\n        37.634387\n      ],\n      [\n        -122.414673,\n        37.634374\n      ],\n      [\n        -122.414974,\n        37.634355\n      ],\n      [\n        -122.415253,\n        37.634327\n      ],\n      [\n        -122.415592,\n        37.634282\n      ],\n      [\n        -122.415918,\n        37.634227\n      ],\n      [\n        -122.416237,\n        37.634162\n      ],\n      [\n        -122.416566,\n        37.634085\n      ],\n      [\n        -122.41688,\n        37.634\n      ],\n      [\n        -122.417181,\n        37.633906\n      ],\n      [\n        -122.417482,\n        37.6338\n      ],\n      [\n        -122.417774,\n        37.633685\n      ],\n      [\n        -122.418057,\n        37.633564\n      ],\n      [\n        -122.418915,\n        37.633186\n      ],\n      [\n        -122.419464,\n        37.632942\n      ],\n      [\n        -122.420803,\n        37.632342\n      ],\n      [\n        -122.422168,\n        37.63173\n      ],\n      [\n        -122.423618,\n        37.631112\n      ],\n      [\n        -122.424039,\n        37.630935\n      ],\n      [\n        -122.424416,\n        37.630779\n      ],\n      [\n        -122.424821,\n        37.630624\n      ],\n      [\n        -122.426551,\n        37.629969\n      ],\n      [\n        -122.426657,\n        37.629934\n      ],\n      [\n        -122.426756,\n        37.629903\n      ],\n      [\n        -122.426872,\n        37.62987\n      ],\n      [\n        -122.426979,\n        37.629843\n      ],\n      [\n        -122.427159,\n        37.629804\n      ],\n      [\n        -122.427316,\n        37.629776\n      ],\n      [\n        -122.428386,\n        37.629594\n      ],\n      [\n        -122.428621,\n        37.62956\n      ],\n      [\n        -122.428861,\n        37.629531\n      ],\n      [\n        -122.430099,\n        37.629379\n      ],\n      [\n        -122.430261,\n        37.629359\n      ],\n      [\n        -122.430348,\n        37.629347\n      ],\n      [\n        -122.430423,\n        37.629337\n      ],\n      [\n        -122.430506,\n        37.629324\n      ],\n      [\n        -122.430584,\n        37.629309\n      ],\n      [\n        -122.430661,\n        37.629292\n      ],\n      [\n        -122.430734,\n        37.629273\n      ],\n      [\n        -122.430813,\n        37.629247\n      ],\n      [\n        -122.430892,\n        37.629219\n      ],\n      [\n        -122.43097,\n        37.629189\n      ],\n      [\n        -122.431041,\n        37.629158\n      ],\n      [\n        -122.43111,\n        37.629125\n      ],\n      [\n        -122.431176,\n        37.62909\n      ],\n      [\n        -122.431247,\n        37.629051\n      ],\n      [\n        -122.431311,\n        37.629011\n      ],\n      [\n        -122.431372,\n        37.62897\n      ],\n      [\n        -122.431435,\n        37.628924\n      ],\n      [\n        -122.431499,\n        37.628873\n      ],\n      [\n        -122.431562,\n        37.628819\n      ],\n      [\n        -122.431606,\n        37.628777\n      ],\n      [\n        -122.431644,\n        37.628738\n      ],\n      [\n        -122.431693,\n        37.628682\n      ],\n      [\n        -122.431736,\n        37.628631\n      ],\n      [\n        -122.431781,\n        37.628572\n      ],\n      [\n        -122.431822,\n        37.628515\n      ],\n      [\n        -122.43186,\n        37.628455\n      ],\n      [\n        -122.431891,\n        37.628399\n      ],\n      [\n        -122.431924,\n        37.628334\n      ],\n      [\n        -122.431952,\n        37.628272\n      ],\n      [\n        -122.431976,\n        37.628207\n      ],\n      [\n        -122.431996,\n        37.628145\n      ],\n      [\n        -122.432014,\n        37.628074\n      ],\n      [\n        -122.432026,\n        37.628009\n      ],\n      [\n        -122.432036,\n        37.627942\n      ],\n      [\n        -122.432042,\n        37.627878\n      ],\n      [\n        -122.432046,\n        37.627813\n      ],\n      [\n        -122.432046,\n        37.627747\n      ],\n      [\n        -122.432042,\n        37.627679\n      ],\n      [\n        -122.432036,\n        37.627612\n      ],\n      [\n        -122.432026,\n        37.62755\n      ],\n      [\n        -122.432013,\n        37.627488\n      ],\n      [\n        -122.431992,\n        37.627415\n      ],\n      [\n        -122.431971,\n        37.627349\n      ],\n      [\n        -122.431946,\n        37.627285\n      ],\n      [\n        -122.43192,\n        37.627224\n      ],\n      [\n        -122.431887,\n        37.627159\n      ],\n      [\n        -122.431854,\n        37.6271\n      ],\n      [\n        -122.431816,\n        37.627041\n      ],\n      [\n        -122.431777,\n        37.626984\n      ],\n      [\n        -122.431732,\n        37.626925\n      ],\n      [\n        -122.431687,\n        37.626872\n      ],\n      [\n        -122.431648,\n        37.62683\n      ],\n      [\n        -122.431613,\n        37.626794\n      ],\n      [\n        -122.431587,\n        37.626769\n      ],\n      [\n        -122.431527,\n        37.626714\n      ],\n      [\n        -122.431461,\n        37.626659\n      ],\n      [\n        -122.431401,\n        37.626613\n      ],\n      [\n        -122.431333,\n        37.626565\n      ],\n      [\n        -122.431268,\n        37.626522\n      ],\n      [\n        -122.431202,\n        37.62648\n      ],\n      [\n        -122.429964,\n        37.625695\n      ],\n      [\n        -122.429899,\n        37.625653\n      ],\n      [\n        -122.429834,\n        37.625609\n      ],\n      [\n        -122.429778,\n        37.625569\n      ],\n      [\n        -122.429717,\n        37.625524\n      ],\n      [\n        -122.429662,\n        37.62548\n      ],\n      [\n        -122.429604,\n        37.625431\n      ],\n      [\n        -122.429549,\n        37.625383\n      ],\n      [\n        -122.429496,\n        37.625333\n      ],\n      [\n        -122.429445,\n        37.625283\n      ],\n      [\n        -122.429396,\n        37.625231\n      ],\n      [\n        -122.429346,\n        37.625176\n      ],\n      [\n        -122.4293,\n        37.625122\n      ],\n      [\n        -122.429256,\n        37.625069\n      ],\n      [\n        -122.42921,\n        37.625012\n      ],\n      [\n        -122.429081,\n        37.624849\n      ],\n      [\n        -122.428994,\n        37.624735\n      ],\n      [\n        -122.428904,\n        37.624616\n      ],\n      [\n        -122.428855,\n        37.62455\n      ],\n      [\n        -122.428805,\n        37.62448\n      ],\n      [\n        -122.428539,\n        37.624103\n      ],\n      [\n        -122.427542,\n        37.622764\n      ],\n      [\n        -122.426218,\n        37.620714\n      ],\n      [\n        -122.425555,\n        37.619685\n      ],\n      [\n        -122.425332,\n        37.619341\n      ],\n      [\n        -122.425186,\n        37.619113\n      ],\n      [\n        -122.425115,\n        37.618999\n      ],\n      [\n        -122.425045,\n        37.618881\n      ],\n      [\n        -122.424981,\n        37.618767\n      ],\n      [\n        -122.424919,\n        37.618648\n      ],\n      [\n        -122.424859,\n        37.618529\n      ],\n      [\n        -122.424803,\n        37.618411\n      ],\n      [\n        -122.424749,\n        37.618288\n      ],\n      [\n        -122.424699,\n        37.618168\n      ],\n      [\n        -122.424652,\n        37.618045\n      ],\n      [\n        -122.424602,\n        37.617904\n      ],\n      [\n        -122.424569,\n        37.617801\n      ],\n      [\n        -122.42453,\n        37.617671\n      ],\n      [\n        -122.424497,\n        37.617545\n      ],\n      [\n        -122.424464,\n        37.617414\n      ],\n      [\n        -122.424433,\n        37.617271\n      ],\n      [\n        -122.424405,\n        37.617118\n      ],\n      [\n        -122.424385,\n        37.61699\n      ],\n      [\n        -122.424368,\n        37.616861\n      ],\n      [\n        -122.424355,\n        37.616732\n      ],\n      [\n        -122.424345,\n        37.616609\n      ],\n      [\n        -122.424338,\n        37.616482\n      ],\n      [\n        -122.424336,\n        37.616351\n      ],\n      [\n        -122.424336,\n        37.616216\n      ],\n      [\n        -122.42434,\n        37.616082\n      ],\n      [\n        -122.424346,\n        37.615952\n      ],\n      [\n        -122.424357,\n        37.615823\n      ],\n      [\n        -122.424371,\n        37.615694\n      ],\n      [\n        -122.424389,\n        37.61556\n      ],\n      [\n        -122.424409,\n        37.61543\n      ],\n      [\n        -122.424432,\n        37.615305\n      ],\n      [\n        -122.424459,\n        37.615176\n      ],\n      [\n        -122.424492,\n        37.615042\n      ],\n      [\n        -122.424509,\n        37.614972\n      ],\n      [\n        -122.424546,\n        37.614843\n      ],\n      [\n        -122.424587,\n        37.614713\n      ],\n      [\n        -122.424628,\n        37.614588\n      ],\n      [\n        -122.424674,\n        37.614463\n      ],\n      [\n        -122.424723,\n        37.614341\n      ],\n      [\n        -122.424776,\n        37.614216\n      ],\n      [\n        -122.424831,\n        37.614095\n      ],\n      [\n        -122.424892,\n        37.613968\n      ],\n      [\n        -122.424954,\n        37.613849\n      ],\n      [\n        -122.425006,\n        37.613754\n      ],\n      [\n        -122.425089,\n        37.613608\n      ],\n      [\n        -122.42516,\n        37.613491\n      ],\n      [\n        -122.425236,\n        37.613373\n      ],\n      [\n        -122.425315,\n        37.613256\n      ],\n      [\n        -122.425395,\n        37.613143\n      ],\n      [\n        -122.425478,\n        37.613028\n      ],\n      [\n        -122.425559,\n        37.612914\n      ],\n      [\n        -122.425644,\n        37.612796\n      ],\n      [\n        -122.425726,\n        37.61268\n      ],\n      [\n        -122.426297,\n        37.611883\n      ],\n      [\n        -122.42638,\n        37.611765\n      ],\n      [\n        -122.426457,\n        37.611654\n      ],\n      [\n        -122.426536,\n        37.611536\n      ],\n      [\n        -122.426611,\n        37.611419\n      ],\n      [\n        -122.426685,\n        37.611302\n      ],\n      [\n        -122.42676,\n        37.611183\n      ],\n      [\n        -122.426833,\n        37.611062\n      ],\n      [\n        -122.4269,\n        37.610948\n      ],\n      [\n        -122.42697,\n        37.610826\n      ],\n      [\n        -122.427035,\n        37.610707\n      ],\n      [\n        -122.427099,\n        37.61059\n      ],\n      [\n        -122.427162,\n        37.61047\n      ],\n      [\n        -122.427225,\n        37.610348\n      ],\n      [\n        -122.427286,\n        37.610224\n      ],\n      [\n        -122.427344,\n        37.610102\n      ],\n      [\n        -122.427402,\n        37.609979\n      ],\n      [\n        -122.427456,\n        37.609856\n      ],\n      [\n        -122.42751,\n        37.609732\n      ],\n      [\n        -122.427563,\n        37.609607\n      ],\n      [\n        -122.427614,\n        37.609481\n      ],\n      [\n        -122.427664,\n        37.609354\n      ],\n      [\n        -122.427711,\n        37.609228\n      ],\n      [\n        -122.427756,\n        37.609104\n      ],\n      [\n        -122.427798,\n        37.60898\n      ],\n      [\n        -122.427842,\n        37.608851\n      ],\n      [\n        -122.427882,\n        37.608724\n      ],\n      [\n        -122.42792,\n        37.608597\n      ],\n      [\n        -122.427958,\n        37.608468\n      ],\n      [\n        -122.427995,\n        37.608339\n      ],\n      [\n        -122.428028,\n        37.608209\n      ],\n      [\n        -122.428061,\n        37.608079\n      ],\n      [\n        -122.428092,\n        37.607947\n      ],\n      [\n        -122.428121,\n        37.607814\n      ],\n      [\n        -122.428149,\n        37.607684\n      ],\n      [\n        -122.428174,\n        37.607554\n      ],\n      [\n        -122.428197,\n        37.607428\n      ],\n      [\n        -122.428219,\n        37.607294\n      ],\n      [\n        -122.428237,\n        37.607164\n      ],\n      [\n        -122.428253,\n        37.607033\n      ],\n      [\n        -122.428267,\n        37.606899\n      ],\n      [\n        -122.428277,\n        37.606777\n      ],\n      [\n        -122.428284,\n        37.606645\n      ],\n      [\n        -122.428288,\n        37.606514\n      ],\n      [\n        -122.428291,\n        37.606384\n      ],\n      [\n        -122.428291,\n        37.606254\n      ],\n      [\n        -122.428286,\n        37.606122\n      ],\n      [\n        -122.42828,\n        37.605992\n      ],\n      [\n        -122.428269,\n        37.605859\n      ],\n      [\n        -122.428256,\n        37.605731\n      ],\n      [\n        -122.428241,\n        37.605604\n      ],\n      [\n        -122.428223,\n        37.605476\n      ],\n      [\n        -122.4282,\n        37.605334\n      ],\n      [\n        -122.428176,\n        37.605208\n      ],\n      [\n        -122.428149,\n        37.605078\n      ],\n      [\n        -122.428119,\n        37.604952\n      ],\n      [\n        -122.428086,\n        37.604822\n      ],\n      [\n        -122.428055,\n        37.604704\n      ],\n      [\n        -122.428017,\n        37.604573\n      ],\n      [\n        -122.427971,\n        37.604434\n      ],\n      [\n        -122.427927,\n        37.604308\n      ],\n      [\n        -122.42788,\n        37.604181\n      ],\n      [\n        -122.42783,\n        37.604055\n      ],\n      [\n        -122.427779,\n        37.603931\n      ],\n      [\n        -122.42772,\n        37.603799\n      ],\n      [\n        -122.427662,\n        37.603677\n      ],\n      [\n        -122.427603,\n        37.603555\n      ],\n      [\n        -122.42754,\n        37.603433\n      ],\n      [\n        -122.427477,\n        37.603318\n      ],\n      [\n        -122.427408,\n        37.603197\n      ],\n      [\n        -122.427339,\n        37.603082\n      ],\n      [\n        -122.427266,\n        37.602966\n      ],\n      [\n        -122.427189,\n        37.602848\n      ],\n      [\n        -122.427112,\n        37.602735\n      ],\n      [\n        -122.427031,\n        37.602619\n      ],\n      [\n        -122.426945,\n        37.602502\n      ],\n      [\n        -122.426859,\n        37.602392\n      ],\n      [\n        -122.426771,\n        37.602281\n      ],\n      [\n        -122.426683,\n        37.602174\n      ],\n      [\n        -122.426588,\n        37.602063\n      ],\n      [\n        -122.426495,\n        37.601958\n      ],\n      [\n        -122.426395,\n        37.601852\n      ],\n      [\n        -122.426296,\n        37.601748\n      ],\n      [\n        -122.426194,\n        37.601644\n      ],\n      [\n        -122.426088,\n        37.601541\n      ],\n      [\n        -122.425982,\n        37.601442\n      ],\n      [\n        -122.425874,\n        37.601343\n      ],\n      [\n        -122.425761,\n        37.601245\n      ],\n      [\n        -122.425648,\n        37.60115\n      ],\n      [\n        -122.425532,\n        37.601055\n      ],\n      [\n        -122.425415,\n        37.600961\n      ],\n      [\n        -122.425298,\n        37.600867\n      ],\n      [\n        -122.425185,\n        37.600775\n      ],\n      [\n        -122.425069,\n        37.600683\n      ],\n      [\n        -122.424837,\n        37.600498\n      ],\n      [\n        -122.422635,\n        37.598721\n      ],\n      [\n        -122.420554,\n        37.59703\n      ],\n      [\n        -122.420442,\n        37.596938\n      ],\n      [\n        -122.420327,\n        37.596843\n      ],\n      [\n        -122.420211,\n        37.596746\n      ],\n      [\n        -122.420099,\n        37.59665\n      ],\n      [\n        -122.419992,\n        37.596556\n      ],\n      [\n        -122.419879,\n        37.596456\n      ],\n      [\n        -122.419769,\n        37.596357\n      ],\n      [\n        -122.419661,\n        37.596257\n      ],\n      [\n        -122.419546,\n        37.596148\n      ],\n      [\n        -122.419433,\n        37.596039\n      ],\n      [\n        -122.419329,\n        37.59594\n      ],\n      [\n        -122.419239,\n        37.595853\n      ],\n      [\n        -122.419137,\n        37.595754\n      ],\n      [\n        -122.419032,\n        37.59565\n      ],\n      [\n        -122.418929,\n        37.595545\n      ],\n      [\n        -122.416797,\n        37.593379\n      ],\n      [\n        -122.413741,\n        37.590279\n      ],\n      [\n        -122.412737,\n        37.58926\n      ],\n      [\n        -122.412633,\n        37.589155\n      ],\n      [\n        -122.41254,\n        37.58906\n      ],\n      [\n        -122.411298,\n        37.587802\n      ],\n      [\n        -122.411193,\n        37.587697\n      ],\n      [\n        -122.411089,\n        37.587596\n      ],\n      [\n        -122.410982,\n        37.587495\n      ],\n      [\n        -122.410875,\n        37.587397\n      ],\n      [\n        -122.410764,\n        37.587297\n      ],\n      [\n        -122.410653,\n        37.5872\n      ],\n      [\n        -122.41054,\n        37.587105\n      ],\n      [\n        -122.410425,\n        37.587013\n      ],\n      [\n        -122.410307,\n        37.586918\n      ],\n      [\n        -122.410188,\n        37.586825\n      ],\n      [\n        -122.410069,\n        37.586736\n      ],\n      [\n        -122.409946,\n        37.586643\n      ],\n      [\n        -122.409833,\n        37.586559\n      ],\n      [\n        -122.409708,\n        37.586466\n      ],\n      [\n        -122.40959,\n        37.586378\n      ],\n      [\n        -122.40887,\n        37.585841\n      ],\n      [\n        -122.408264,\n        37.585388\n      ],\n      [\n        -122.408144,\n        37.585297\n      ],\n      [\n        -122.408027,\n        37.585207\n      ],\n      [\n        -122.407908,\n        37.585114\n      ],\n      [\n        -122.407793,\n        37.585023\n      ],\n      [\n        -122.407676,\n        37.584928\n      ],\n      [\n        -122.407561,\n        37.584833\n      ],\n      [\n        -122.407449,\n        37.584738\n      ],\n      [\n        -122.407338,\n        37.584642\n      ],\n      [\n        -122.407228,\n        37.584545\n      ],\n      [\n        -122.407116,\n        37.584445\n      ],\n      [\n        -122.407009,\n        37.584347\n      ],\n      [\n        -122.406902,\n        37.584248\n      ],\n      [\n        -122.406797,\n        37.584148\n      ],\n      [\n        -122.406692,\n        37.584047\n      ],\n      [\n        -122.406585,\n        37.583943\n      ],\n      [\n        -122.406484,\n        37.58384\n      ],\n      [\n        -122.406382,\n        37.583735\n      ],\n      [\n        -122.406287,\n        37.583635\n      ],\n      [\n        -122.406186,\n        37.583528\n      ],\n      [\n        -122.406091,\n        37.583423\n      ],\n      [\n        -122.405997,\n        37.58332\n      ],\n      [\n        -122.405903,\n        37.583212\n      ],\n      [\n        -122.405808,\n        37.583103\n      ],\n      [\n        -122.405715,\n        37.582993\n      ],\n      [\n        -122.405623,\n        37.582883\n      ],\n      [\n        -122.405532,\n        37.58277\n      ],\n      [\n        -122.405443,\n        37.582659\n      ],\n      [\n        -122.405356,\n        37.582547\n      ],\n      [\n        -122.40527,\n        37.582434\n      ],\n      [\n        -122.40519,\n        37.582325\n      ],\n      [\n        -122.405105,\n        37.582208\n      ],\n      [\n        -122.405022,\n        37.582092\n      ],\n      [\n        -122.404944,\n        37.581979\n      ],\n      [\n        -122.404866,\n        37.581864\n      ],\n      [\n        -122.404789,\n        37.581748\n      ],\n      [\n        -122.404712,\n        37.581632\n      ],\n      [\n        -122.404637,\n        37.581515\n      ],\n      [\n        -122.404564,\n        37.581395\n      ],\n      [\n        -122.404492,\n        37.581274\n      ],\n      [\n        -122.404422,\n        37.581156\n      ],\n      [\n        -122.404353,\n        37.581036\n      ],\n      [\n        -122.404293,\n        37.580933\n      ],\n      [\n        -122.404116,\n        37.580627\n      ],\n      [\n        -122.402009,\n        37.576976\n      ],\n      [\n        -122.400426,\n        37.574232\n      ],\n      [\n        -122.400356,\n        37.574113\n      ],\n      [\n        -122.400282,\n        37.573993\n      ],\n      [\n        -122.400209,\n        37.573879\n      ],\n      [\n        -122.40013,\n        37.573763\n      ],\n      [\n        -122.40005,\n        37.57365\n      ],\n      [\n        -122.399966,\n        37.573536\n      ],\n      [\n        -122.39988,\n        37.573426\n      ],\n      [\n        -122.39979,\n        37.573313\n      ],\n      [\n        -122.3997,\n        37.573206\n      ],\n      [\n        -122.399606,\n        37.573098\n      ],\n      [\n        -122.399507,\n        37.57299\n      ],\n      [\n        -122.399408,\n        37.572886\n      ],\n      [\n        -122.399307,\n        37.572782\n      ],\n      [\n        -122.395326,\n        37.568764\n      ],\n      [\n        -122.39522,\n        37.568658\n      ],\n      [\n        -122.395119,\n        37.568558\n      ],\n      [\n        -122.395015,\n        37.568457\n      ],\n      [\n        -122.394908,\n        37.568358\n      ],\n      [\n        -122.394799,\n        37.568259\n      ],\n      [\n        -122.394686,\n        37.568162\n      ],\n      [\n        -122.394571,\n        37.568066\n      ],\n      [\n        -122.394455,\n        37.567973\n      ],\n      [\n        -122.394339,\n        37.567884\n      ],\n      [\n        -122.394216,\n        37.567794\n      ],\n      [\n        -122.394093,\n        37.567706\n      ],\n      [\n        -122.393968,\n        37.56762\n      ],\n      [\n        -122.39384,\n        37.567535\n      ],\n      [\n        -122.393712,\n        37.567453\n      ],\n      [\n        -122.393581,\n        37.567374\n      ],\n      [\n        -122.39345,\n        37.567297\n      ],\n      [\n        -122.393314,\n        37.56722\n      ],\n      [\n        -122.393178,\n        37.567147\n      ],\n      [\n        -122.393042,\n        37.567076\n      ],\n      [\n        -122.3929,\n        37.567005\n      ],\n      [\n        -122.392756,\n        37.566936\n      ],\n      [\n        -122.392616,\n        37.566871\n      ],\n      [\n        -122.392468,\n        37.566807\n      ],\n      [\n        -122.392324,\n        37.566747\n      ],\n      [\n        -122.392175,\n        37.566688\n      ],\n      [\n        -122.392026,\n        37.566631\n      ],\n      [\n        -122.391874,\n        37.566576\n      ],\n      [\n        -122.391723,\n        37.566524\n      ],\n      [\n        -122.390811,\n        37.566217\n      ],\n      [\n        -122.390269,\n        37.566034\n      ],\n      [\n        -122.390119,\n        37.565983\n      ],\n      [\n        -122.38997,\n        37.565932\n      ],\n      [\n        -122.389823,\n        37.565879\n      ],\n      [\n        -122.389672,\n        37.565822\n      ],\n      [\n        -122.389528,\n        37.565763\n      ],\n      [\n        -122.389382,\n        37.565699\n      ],\n      [\n        -122.38924,\n        37.565634\n      ],\n      [\n        -122.389097,\n        37.565565\n      ],\n      [\n        -122.38896,\n        37.565494\n      ],\n      [\n        -122.388824,\n        37.565421\n      ],\n      [\n        -122.388689,\n        37.565344\n      ],\n      [\n        -122.388556,\n        37.565264\n      ],\n      [\n        -122.388429,\n        37.565183\n      ],\n      [\n        -122.388302,\n        37.565099\n      ],\n      [\n        -122.388179,\n        37.565013\n      ],\n      [\n        -122.388059,\n        37.564926\n      ],\n      [\n        -122.38794,\n        37.564834\n      ],\n      [\n        -122.387825,\n        37.564741\n      ],\n      [\n        -122.387713,\n        37.564646\n      ],\n      [\n        -122.387603,\n        37.564548\n      ],\n      [\n        -122.387494,\n        37.564446\n      ],\n      [\n        -122.387391,\n        37.564346\n      ],\n      [\n        -122.387289,\n        37.564245\n      ],\n      [\n        -122.382253,\n        37.559212\n      ],\n      [\n        -122.382152,\n        37.559109\n      ],\n      [\n        -122.382049,\n        37.559002\n      ],\n      [\n        -122.38195,\n        37.558895\n      ],\n      [\n        -122.381854,\n        37.55879\n      ],\n      [\n        -122.381755,\n        37.558679\n      ],\n      [\n        -122.381666,\n        37.558577\n      ],\n      [\n        -122.381572,\n        37.558465\n      ],\n      [\n        -122.381479,\n        37.558353\n      ],\n      [\n        -122.381391,\n        37.558242\n      ],\n      [\n        -122.381306,\n        37.558132\n      ],\n      [\n        -122.381225,\n        37.558026\n      ],\n      [\n        -122.381141,\n        37.557913\n      ],\n      [\n        -122.381056,\n        37.557795\n      ],\n      [\n        -122.380975,\n        37.557679\n      ],\n      [\n        -122.380895,\n        37.557561\n      ],\n      [\n        -122.38082,\n        37.557449\n      ],\n      [\n        -122.378211,\n        37.553502\n      ],\n      [\n        -122.378133,\n        37.553387\n      ],\n      [\n        -122.378054,\n        37.553269\n      ],\n      [\n        -122.377975,\n        37.553153\n      ],\n      [\n        -122.377896,\n        37.55304\n      ],\n      [\n        -122.377814,\n        37.552926\n      ],\n      [\n        -122.377731,\n        37.552814\n      ],\n      [\n        -122.377649,\n        37.552702\n      ],\n      [\n        -122.377563,\n        37.55259\n      ],\n      [\n        -122.377474,\n        37.552476\n      ],\n      [\n        -122.377386,\n        37.552365\n      ],\n      [\n        -122.377293,\n        37.552252\n      ],\n      [\n        -122.377203,\n        37.552143\n      ],\n      [\n        -122.377111,\n        37.552035\n      ],\n      [\n        -122.377017,\n        37.551927\n      ],\n      [\n        -122.376923,\n        37.55182\n      ],\n      [\n        -122.376825,\n        37.551712\n      ],\n      [\n        -122.376728,\n        37.551606\n      ],\n      [\n        -122.376288,\n        37.551134\n      ],\n      [\n        -122.376232,\n        37.551074\n      ],\n      [\n        -122.372783,\n        37.547371\n      ],\n      [\n        -122.372562,\n        37.547134\n      ],\n      [\n        -122.370154,\n        37.544547\n      ],\n      [\n        -122.368581,\n        37.542858\n      ],\n      [\n        -122.368484,\n        37.542753\n      ],\n      [\n        -122.368387,\n        37.542647\n      ],\n      [\n        -122.368292,\n        37.542541\n      ],\n      [\n        -122.368195,\n        37.542433\n      ],\n      [\n        -122.3681,\n        37.542324\n      ],\n      [\n        -122.368006,\n        37.542216\n      ],\n      [\n        -122.367911,\n        37.542105\n      ],\n      [\n        -122.367821,\n        37.541998\n      ],\n      [\n        -122.36773,\n        37.541889\n      ],\n      [\n        -122.36764,\n        37.541781\n      ],\n      [\n        -122.36755,\n        37.541671\n      ],\n      [\n        -122.367461,\n        37.541558\n      ],\n      [\n        -122.36737,\n        37.541444\n      ],\n      [\n        -122.367284,\n        37.541334\n      ],\n      [\n        -122.367197,\n        37.541222\n      ],\n      [\n        -122.367112,\n        37.54111\n      ],\n      [\n        -122.367029,\n        37.540998\n      ],\n      [\n        -122.366944,\n        37.540885\n      ],\n      [\n        -122.366859,\n        37.54077\n      ],\n      [\n        -122.366777,\n        37.540655\n      ],\n      [\n        -122.366694,\n        37.540539\n      ],\n      [\n        -122.366615,\n        37.540426\n      ],\n      [\n        -122.366533,\n        37.540308\n      ],\n      [\n        -122.366452,\n        37.540189\n      ],\n      [\n        -122.363065,\n        37.535193\n      ],\n      [\n        -122.362987,\n        37.535077\n      ],\n      [\n        -122.362909,\n        37.534962\n      ],\n      [\n        -122.362833,\n        37.534848\n      ],\n      [\n        -122.362753,\n        37.534722\n      ],\n      [\n        -122.36268,\n        37.534607\n      ],\n      [\n        -122.362608,\n        37.534487\n      ],\n      [\n        -122.362537,\n        37.534367\n      ],\n      [\n        -122.362465,\n        37.534243\n      ],\n      [\n        -122.362401,\n        37.53413\n      ],\n      [\n        -122.362334,\n        37.534007\n      ],\n      [\n        -122.362267,\n        37.533884\n      ],\n      [\n        -122.362204,\n        37.533762\n      ],\n      [\n        -122.362142,\n        37.533641\n      ],\n      [\n        -122.362083,\n        37.53352\n      ],\n      [\n        -122.362024,\n        37.533397\n      ],\n      [\n        -122.361967,\n        37.533274\n      ],\n      [\n        -122.36191,\n        37.533151\n      ],\n      [\n        -122.361855,\n        37.533025\n      ],\n      [\n        -122.361802,\n        37.532903\n      ],\n      [\n        -122.361745,\n        37.53277\n      ],\n      [\n        -122.361691,\n        37.532642\n      ],\n      [\n        -122.36164,\n        37.532521\n      ],\n      [\n        -122.361185,\n        37.531454\n      ],\n      [\n        -122.361112,\n        37.531284\n      ],\n      [\n        -122.359819,\n        37.528253\n      ],\n      [\n        -122.359742,\n        37.52807\n      ],\n      [\n        -122.359687,\n        37.527941\n      ],\n      [\n        -122.359634,\n        37.527816\n      ],\n      [\n        -122.359584,\n        37.5277\n      ],\n      [\n        -122.35953,\n        37.527575\n      ],\n      [\n        -122.359471,\n        37.527442\n      ],\n      [\n        -122.359413,\n        37.527315\n      ],\n      [\n        -122.359351,\n        37.527188\n      ],\n      [\n        -122.35929,\n        37.52707\n      ],\n      [\n        -122.359224,\n        37.526944\n      ],\n      [\n        -122.359091,\n        37.52673\n      ],\n      [\n        -122.358942,\n        37.526501\n      ],\n      [\n        -122.358731,\n        37.526208\n      ],\n      [\n        -122.358495,\n        37.52591\n      ],\n      [\n        -122.357159,\n        37.524423\n      ],\n      [\n        -122.356929,\n        37.524157\n      ],\n      [\n        -122.356719,\n        37.523891\n      ],\n      [\n        -122.356526,\n        37.523634\n      ],\n      [\n        -122.356338,\n        37.523353\n      ],\n      [\n        -122.356172,\n        37.523085\n      ],\n      [\n        -122.356004,\n        37.522786\n      ],\n      [\n        -122.355169,\n        37.521156\n      ],\n      [\n        -122.354981,\n        37.520785\n      ],\n      [\n        -122.354812,\n        37.520471\n      ],\n      [\n        -122.354625,\n        37.520149\n      ],\n      [\n        -122.354418,\n        37.519813\n      ],\n      [\n        -122.354212,\n        37.519494\n      ],\n      [\n        -122.353994,\n        37.519186\n      ],\n      [\n        -122.353777,\n        37.518901\n      ],\n      [\n        -122.353546,\n        37.518603\n      ],\n      [\n        -122.353278,\n        37.518284\n      ],\n      [\n        -122.353021,\n        37.517988\n      ],\n      [\n        -122.352742,\n        37.517682\n      ],\n      [\n        -122.352396,\n        37.51733\n      ],\n      [\n        -122.352183,\n        37.517128\n      ],\n      [\n        -122.34916,\n        37.514313\n      ],\n      [\n        -122.349158,\n        37.514311\n      ],\n      [\n        -122.348295,\n        37.513508\n      ],\n      [\n        -122.348078,\n        37.513306\n      ],\n      [\n        -122.347863,\n        37.513109\n      ],\n      [\n        -122.347639,\n        37.51291\n      ],\n      [\n        -122.347416,\n        37.512714\n      ],\n      [\n        -122.347193,\n        37.512524\n      ],\n      [\n        -122.346967,\n        37.512331\n      ],\n      [\n        -122.346734,\n        37.512138\n      ],\n      [\n        -122.346504,\n        37.511951\n      ],\n      [\n        -122.346266,\n        37.511762\n      ],\n      [\n        -122.346033,\n        37.511581\n      ],\n      [\n        -122.345794,\n        37.511396\n      ],\n      [\n        -122.345556,\n        37.511217\n      ],\n      [\n        -122.345313,\n        37.511036\n      ],\n      [\n        -122.345072,\n        37.510863\n      ],\n      [\n        -122.344817,\n        37.510682\n      ],\n      [\n        -122.344567,\n        37.510508\n      ],\n      [\n        -122.344313,\n        37.510334\n      ],\n      [\n        -122.344058,\n        37.510165\n      ],\n      [\n        -122.343805,\n        37.509997\n      ],\n      [\n        -122.343622,\n        37.50988\n      ],\n      [\n        -122.343551,\n        37.509834\n      ],\n      [\n        -122.343319,\n        37.509688\n      ],\n      [\n        -122.34289,\n        37.509421\n      ],\n      [\n        -122.341187,\n        37.508385\n      ],\n      [\n        -122.340327,\n        37.507859\n      ],\n      [\n        -122.339612,\n        37.507421\n      ],\n      [\n        -122.339482,\n        37.507342\n      ],\n      [\n        -122.338544,\n        37.506771\n      ],\n      [\n        -122.338493,\n        37.50674\n      ],\n      [\n        -122.337514,\n        37.506142\n      ],\n      [\n        -122.337191,\n        37.505944\n      ],\n      [\n        -122.336936,\n        37.50579\n      ],\n      [\n        -122.336675,\n        37.505628\n      ],\n      [\n        -122.336414,\n        37.505467\n      ],\n      [\n        -122.336153,\n        37.505304\n      ],\n      [\n        -122.335896,\n        37.50514\n      ],\n      [\n        -122.33564,\n        37.504974\n      ],\n      [\n        -122.335391,\n        37.50481\n      ],\n      [\n        -122.335137,\n        37.50464\n      ],\n      [\n        -122.334885,\n        37.504469\n      ],\n      [\n        -122.334635,\n        37.504297\n      ],\n      [\n        -122.332513,\n        37.502815\n      ],\n      [\n        -122.332388,\n        37.502726\n      ],\n      [\n        -122.332272,\n        37.502643\n      ],\n      [\n        -122.331661,\n        37.502202\n      ],\n      [\n        -122.331402,\n        37.502037\n      ],\n      [\n        -122.33114,\n        37.50188\n      ],\n      [\n        -122.330869,\n        37.50173\n      ],\n      [\n        -122.330589,\n        37.501585\n      ],\n      [\n        -122.330308,\n        37.501449\n      ],\n      [\n        -122.330028,\n        37.501323\n      ],\n      [\n        -122.329719,\n        37.501196\n      ],\n      [\n        -122.329408,\n        37.501078\n      ],\n      [\n        -122.329095,\n        37.500966\n      ],\n      [\n        -122.328695,\n        37.500833\n      ],\n      [\n        -122.32811,\n        37.50067\n      ],\n      [\n        -122.327558,\n        37.500548\n      ],\n      [\n        -122.326959,\n        37.500446\n      ],\n      [\n        -122.326361,\n        37.500367\n      ],\n      [\n        -122.325782,\n        37.500318\n      ],\n      [\n        -122.325187,\n        37.500297\n      ],\n      [\n        -122.323247,\n        37.500282\n      ],\n      [\n        -122.322673,\n        37.500264\n      ],\n      [\n        -122.322086,\n        37.500228\n      ],\n      [\n        -122.321491,\n        37.50017\n      ],\n      [\n        -122.320855,\n        37.500077\n      ],\n      [\n        -122.320231,\n        37.499965\n      ],\n      [\n        -122.319669,\n        37.49983\n      ],\n      [\n        -122.319339,\n        37.49974\n      ],\n      [\n        -122.318859,\n        37.499596\n      ],\n      [\n        -122.318471,\n        37.499462\n      ],\n      [\n        -122.318115,\n        37.499328\n      ],\n      [\n        -122.317734,\n        37.499175\n      ],\n      [\n        -122.317399,\n        37.49903\n      ],\n      [\n        -122.317038,\n        37.498858\n      ],\n      [\n        -122.31668,\n        37.498672\n      ],\n      [\n        -122.316276,\n        37.498448\n      ],\n      [\n        -122.315982,\n        37.498284\n      ],\n      [\n        -122.314428,\n        37.497426\n      ],\n      [\n        -122.314031,\n        37.497202\n      ],\n      [\n        -122.313616,\n        37.496977\n      ],\n      [\n        -122.31319,\n        37.496764\n      ],\n      [\n        -122.312745,\n        37.496561\n      ],\n      [\n        -122.312309,\n        37.496373\n      ],\n      [\n        -122.312048,\n        37.496254\n      ],\n      [\n        -122.311228,\n        37.495946\n      ],\n      [\n        -122.310623,\n        37.495736\n      ],\n      [\n        -122.309981,\n        37.495551\n      ],\n      [\n        -122.309593,\n        37.495447\n      ],\n      [\n        -122.309197,\n        37.495349\n      ],\n      [\n        -122.307588,\n        37.494965\n      ],\n      [\n        -122.305761,\n        37.494516\n      ],\n      [\n        -122.305391,\n        37.494414\n      ],\n      [\n        -122.305052,\n        37.494313\n      ],\n      [\n        -122.304742,\n        37.494215\n      ],\n      [\n        -122.304442,\n        37.494112\n      ],\n      [\n        -122.304137,\n        37.493996\n      ],\n      [\n        -122.303843,\n        37.493871\n      ],\n      [\n        -122.303561,\n        37.493742\n      ],\n      [\n        -122.30329,\n        37.493608\n      ],\n      [\n        -122.303013,\n        37.493462\n      ],\n      [\n        -122.302751,\n        37.493314\n      ],\n      [\n        -122.302491,\n        37.493159\n      ],\n      [\n        -122.302246,\n        37.493004\n      ],\n      [\n        -122.301998,\n        37.492833\n      ],\n      [\n        -122.301766,\n        37.49267\n      ],\n      [\n        -122.301532,\n        37.492489\n      ],\n      [\n        -122.301312,\n        37.492308\n      ],\n      [\n        -122.301097,\n        37.492121\n      ],\n      [\n        -122.300884,\n        37.491925\n      ],\n      [\n        -122.300683,\n        37.491725\n      ],\n      [\n        -122.300493,\n        37.491524\n      ],\n      [\n        -122.300308,\n        37.491316\n      ],\n      [\n        -122.300127,\n        37.4911\n      ],\n      [\n        -122.299959,\n        37.490876\n      ],\n      [\n        -122.299802,\n        37.490652\n      ],\n      [\n        -122.299743,\n        37.490563\n      ],\n      [\n        -122.299651,\n        37.490425\n      ],\n      [\n        -122.299514,\n        37.490199\n      ],\n      [\n        -122.299378,\n        37.489967\n      ],\n      [\n        -122.29925,\n        37.489727\n      ],\n      [\n        -122.299134,\n        37.489486\n      ],\n      [\n        -122.299031,\n        37.489253\n      ],\n      [\n        -122.299023,\n        37.489234\n      ],\n      [\n        -122.298913,\n        37.488976\n      ],\n      [\n        -122.298822,\n        37.488725\n      ],\n      [\n        -122.298747,\n        37.488479\n      ],\n      [\n        -122.29868,\n        37.488234\n      ],\n      [\n        -122.298625,\n        37.487976\n      ],\n      [\n        -122.298579,\n        37.487716\n      ],\n      [\n        -122.29854,\n        37.487417\n      ],\n      [\n        -122.298513,\n        37.487148\n      ],\n      [\n        -122.298502,\n        37.486885\n      ],\n      [\n        -122.298501,\n        37.486619\n      ],\n      [\n        -122.29851,\n        37.486364\n      ],\n      [\n        -122.298525,\n        37.486097\n      ],\n      [\n        -122.298555,\n        37.48584\n      ],\n      [\n        -122.298595,\n        37.485579\n      ],\n      [\n        -122.298678,\n        37.485065\n      ],\n      [\n        -122.299173,\n        37.482099\n      ],\n      [\n        -122.299447,\n        37.480314\n      ],\n      [\n        -122.29957,\n        37.479585\n      ],\n      [\n        -122.299603,\n        37.479329\n      ],\n      [\n        -122.299632,\n        37.479062\n      ],\n      [\n        -122.29965,\n        37.478804\n      ],\n      [\n        -122.299652,\n        37.478543\n      ],\n      [\n        -122.299644,\n        37.478283\n      ],\n      [\n        -122.299624,\n        37.478024\n      ],\n      [\n        -122.299596,\n        37.477757\n      ],\n      [\n        -122.299556,\n        37.477503\n      ],\n      [\n        -122.299505,\n        37.477244\n      ],\n      [\n        -122.299444,\n        37.476984\n      ],\n      [\n        -122.29937,\n        37.47672\n      ],\n      [\n        -122.299293,\n        37.476474\n      ],\n      [\n        -122.299203,\n        37.47622\n      ],\n      [\n        -122.299102,\n        37.475971\n      ],\n      [\n        -122.298988,\n        37.475716\n      ],\n      [\n        -122.298873,\n        37.475474\n      ],\n      [\n        -122.298747,\n        37.475236\n      ],\n      [\n        -122.29861,\n        37.474997\n      ],\n      [\n        -122.298466,\n        37.474766\n      ],\n      [\n        -122.29831,\n        37.474536\n      ],\n      [\n        -122.298146,\n        37.474311\n      ],\n      [\n        -122.297969,\n        37.474086\n      ],\n      [\n        -122.297785,\n        37.47387\n      ],\n      [\n        -122.297599,\n        37.473665\n      ],\n      [\n        -122.297401,\n        37.473462\n      ],\n      [\n        -122.297196,\n        37.473259\n      ],\n      [\n        -122.296882,\n        37.472963\n      ],\n      [\n        -122.29665,\n        37.472754\n      ],\n      [\n        -122.296413,\n        37.472543\n      ],\n      [\n        -122.296179,\n        37.472328\n      ],\n      [\n        -122.29432,\n        37.470577\n      ],\n      [\n        -122.294107,\n        37.470376\n      ],\n      [\n        -122.2939,\n        37.470173\n      ],\n      [\n        -122.293698,\n        37.469966\n      ],\n      [\n        -122.293498,\n        37.469749\n      ],\n      [\n        -122.293305,\n        37.469532\n      ],\n      [\n        -122.293115,\n        37.469309\n      ],\n      [\n        -122.29293,\n        37.469082\n      ],\n      [\n        -122.29276,\n        37.468859\n      ],\n      [\n        -122.292602,\n        37.468646\n      ],\n      [\n        -122.292542,\n        37.468557\n      ],\n      [\n        -122.292457,\n        37.468431\n      ],\n      [\n        -122.292437,\n        37.468401\n      ],\n      [\n        -122.292436,\n        37.468399\n      ],\n      [\n        -122.292355,\n        37.46827\n      ],\n      [\n        -122.292286,\n        37.46816\n      ],\n      [\n        -122.292172,\n        37.467966\n      ],\n      [\n        -122.292072,\n        37.467791\n      ],\n      [\n        -122.291954,\n        37.467571\n      ],\n      [\n        -122.291836,\n        37.467331\n      ],\n      [\n        -122.29172,\n        37.467081\n      ],\n      [\n        -122.291612,\n        37.466834\n      ],\n      [\n        -122.291517,\n        37.466588\n      ],\n      [\n        -122.291424,\n        37.466331\n      ],\n      [\n        -122.291343,\n        37.466078\n      ],\n      [\n        -122.291261,\n        37.465794\n      ],\n      [\n        -122.291217,\n        37.465639\n      ],\n      [\n        -122.29118,\n        37.465487\n      ],\n      [\n        -122.291133,\n        37.465264\n      ],\n      [\n        -122.291087,\n        37.46503\n      ],\n      [\n        -122.291048,\n        37.464778\n      ],\n      [\n        -122.291009,\n        37.464493\n      ],\n      [\n        -122.290986,\n        37.464237\n      ],\n      [\n        -122.290972,\n        37.464006\n      ],\n      [\n        -122.290949,\n        37.4635\n      ],\n      [\n        -122.290901,\n        37.462065\n      ],\n      [\n        -122.290889,\n        37.461779\n      ],\n      [\n        -122.290868,\n        37.461476\n      ],\n      [\n        -122.290831,\n        37.461188\n      ],\n      [\n        -122.290781,\n        37.460878\n      ],\n      [\n        -122.290723,\n        37.460605\n      ],\n      [\n        -122.290644,\n        37.460293\n      ],\n      [\n        -122.290584,\n        37.460104\n      ],\n      [\n        -122.290523,\n        37.459927\n      ],\n      [\n        -122.290436,\n        37.459691\n      ],\n      [\n        -122.290347,\n        37.459468\n      ],\n      [\n        -122.290227,\n        37.459194\n      ],\n      [\n        -122.290088,\n        37.458907\n      ],\n      [\n        -122.289928,\n        37.458616\n      ],\n      [\n        -122.289739,\n        37.458307\n      ],\n      [\n        -122.289508,\n        37.457975\n      ],\n      [\n        -122.289285,\n        37.457676\n      ],\n      [\n        -122.28905,\n        37.457391\n      ],\n      [\n        -122.2888,\n        37.457109\n      ],\n      [\n        -122.288548,\n        37.456852\n      ],\n      [\n        -122.288284,\n        37.456601\n      ],\n      [\n        -122.288022,\n        37.456373\n      ],\n      [\n        -122.287728,\n        37.456134\n      ],\n      [\n        -122.287407,\n        37.455896\n      ],\n      [\n        -122.287086,\n        37.455673\n      ],\n      [\n        -122.280366,\n        37.451252\n      ],\n      [\n        -122.277735,\n        37.449531\n      ],\n      [\n        -122.277231,\n        37.449195\n      ],\n      [\n        -122.276769,\n        37.44888\n      ],\n      [\n        -122.276168,\n        37.448467\n      ],\n      [\n        -122.272679,\n        37.446025\n      ],\n      [\n        -122.272313,\n        37.445772\n      ],\n      [\n        -122.271923,\n        37.445523\n      ],\n      [\n        -122.271518,\n        37.445289\n      ],\n      [\n        -122.271108,\n        37.445072\n      ],\n      [\n        -122.270697,\n        37.444874\n      ],\n      [\n        -122.270314,\n        37.444703\n      ],\n      [\n        -122.269933,\n        37.444545\n      ],\n      [\n        -122.269583,\n        37.444413\n      ],\n      [\n        -122.269305,\n        37.444313\n      ],\n      [\n        -122.26901,\n        37.444216\n      ],\n      [\n        -122.268687,\n        37.444118\n      ],\n      [\n        -122.268322,\n        37.44402\n      ],\n      [\n        -122.267978,\n        37.443934\n      ],\n      [\n        -122.267503,\n        37.443832\n      ],\n      [\n        -122.267031,\n        37.443747\n      ],\n      [\n        -122.266544,\n        37.443673\n      ],\n      [\n        -122.26605,\n        37.443615\n      ],\n      [\n        -122.265572,\n        37.443575\n      ],\n      [\n        -122.265134,\n        37.443554\n      ],\n      [\n        -122.264666,\n        37.443545\n      ],\n      [\n        -122.264208,\n        37.443547\n      ],\n      [\n        -122.26406,\n        37.443551\n      ],\n      [\n        -122.263935,\n        37.443555\n      ],\n      [\n        -122.263834,\n        37.44356\n      ],\n      [\n        -122.263765,\n        37.443564\n      ],\n      [\n        -122.263655,\n        37.44357\n      ],\n      [\n        -122.263539,\n        37.443578\n      ],\n      [\n        -122.263348,\n        37.443591\n      ],\n      [\n        -122.263035,\n        37.44362\n      ],\n      [\n        -122.260005,\n        37.44395\n      ],\n      [\n        -122.259514,\n        37.444\n      ],\n      [\n        -122.259046,\n        37.444033\n      ],\n      [\n        -122.258603,\n        37.444046\n      ],\n      [\n        -122.258142,\n        37.44404\n      ],\n      [\n        -122.257713,\n        37.444025\n      ],\n      [\n        -122.257265,\n        37.443991\n      ],\n      [\n        -122.256817,\n        37.44394\n      ],\n      [\n        -122.256382,\n        37.443874\n      ],\n      [\n        -122.255913,\n        37.443786\n      ],\n      [\n        -122.255462,\n        37.443686\n      ],\n      [\n        -122.255031,\n        37.443567\n      ],\n      [\n        -122.254593,\n        37.443437\n      ],\n      [\n        -122.254183,\n        37.443294\n      ],\n      [\n        -122.253767,\n        37.44313\n      ],\n      [\n        -122.253341,\n        37.442943\n      ],\n      [\n        -122.252933,\n        37.442743\n      ],\n      [\n        -122.252539,\n        37.442526\n      ],\n      [\n        -122.252163,\n        37.442298\n      ],\n      [\n        -122.251807,\n        37.442066\n      ],\n      [\n        -122.251477,\n        37.441825\n      ],\n      [\n        -122.249017,\n        37.43994\n      ],\n      [\n        -122.248322,\n        37.439401\n      ],\n      [\n        -122.247451,\n        37.4387\n      ],\n      [\n        -122.246531,\n        37.437945\n      ],\n      [\n        -122.243639,\n        37.435517\n      ],\n      [\n        -122.243085,\n        37.43505\n      ],\n      [\n        -122.241987,\n        37.434126\n      ],\n      [\n        -122.239324,\n        37.43189\n      ],\n      [\n        -122.238902,\n        37.431549\n      ],\n      [\n        -122.238398,\n        37.431149\n      ],\n      [\n        -122.237923,\n        37.430795\n      ],\n      [\n        -122.237425,\n        37.430433\n      ],\n      [\n        -122.233967,\n        37.427934\n      ],\n      [\n        -122.233382,\n        37.427506\n      ],\n      [\n        -122.23277,\n        37.427048\n      ],\n      [\n        -122.230212,\n        37.425096\n      ],\n      [\n        -122.229855,\n        37.424834\n      ],\n      [\n        -122.229404,\n        37.424517\n      ],\n      [\n        -122.226652,\n        37.422606\n      ],\n      [\n        -122.226043,\n        37.422072\n      ],\n      [\n        -122.22534,\n        37.421492\n      ],\n      [\n        -122.225072,\n        37.421286\n      ],\n      [\n        -122.224039,\n        37.420545\n      ],\n      [\n        -122.223396,\n        37.420152\n      ],\n      [\n        -122.222905,\n        37.419863\n      ],\n      [\n        -122.222484,\n        37.419645\n      ],\n      [\n        -122.222031,\n        37.419441\n      ],\n      [\n        -122.221602,\n        37.419257\n      ],\n      [\n        -122.221307,\n        37.419153\n      ],\n      [\n        -122.220981,\n        37.419048\n      ],\n      [\n        -122.220649,\n        37.418957\n      ],\n      [\n        -122.220311,\n        37.418885\n      ],\n      [\n        -122.219971,\n        37.418817\n      ],\n      [\n        -122.219696,\n        37.418753\n      ],\n      [\n        -122.219188,\n        37.418634\n      ],\n      [\n        -122.219067,\n        37.418587\n      ],\n      [\n        -122.218965,\n        37.418521\n      ],\n      [\n        -122.21889,\n        37.418438\n      ],\n      [\n        -122.218844,\n        37.418348\n      ],\n      [\n        -122.218823,\n        37.418248\n      ],\n      [\n        -122.218828,\n        37.418148\n      ],\n      [\n        -122.218858,\n        37.41805\n      ],\n      [\n        -122.218917,\n        37.417958\n      ],\n      [\n        -122.219013,\n        37.417871\n      ],\n      [\n        -122.219137,\n        37.417801\n      ],\n      [\n        -122.219282,\n        37.41776\n      ],\n      [\n        -122.219421,\n        37.41775\n      ],\n      [\n        -122.219569,\n        37.417767\n      ],\n      [\n        -122.219687,\n        37.417807\n      ],\n      [\n        -122.219794,\n        37.417867\n      ],\n      [\n        -122.21988,\n        37.417948\n      ],\n      [\n        -122.219944,\n        37.418046\n      ],\n      [\n        -122.219982,\n        37.418144\n      ],\n      [\n        -122.219984,\n        37.418233\n      ],\n      [\n        -122.219965,\n        37.41834\n      ],\n      [\n        -122.219915,\n        37.418438\n      ],\n      [\n        -122.219837,\n        37.418525\n      ],\n      [\n        -122.219739,\n        37.418636\n      ],\n      [\n        -122.217942,\n        37.419215\n      ],\n      [\n        -122.217027,\n        37.419501\n      ],\n      [\n        -122.216651,\n        37.419622\n      ],\n      [\n        -122.21575,\n        37.419912\n      ],\n      [\n        -122.214929,\n        37.420178\n      ],\n      [\n        -122.214641,\n        37.420261\n      ],\n      [\n        -122.214349,\n        37.420321\n      ],\n      [\n        -122.214046,\n        37.420361\n      ],\n      [\n        -122.21374,\n        37.420378\n      ],\n      [\n        -122.213449,\n        37.420378\n      ],\n      [\n        -122.211867,\n        37.420344\n      ],\n      [\n        -122.211681,\n        37.42034\n      ],\n      [\n        -122.211444,\n        37.420336\n      ],\n      [\n        -122.211195,\n        37.42034\n      ],\n      [\n        -122.210956,\n        37.42035\n      ],\n      [\n        -122.21085,\n        37.420352\n      ],\n      [\n        -122.210709,\n        37.420359\n      ],\n      [\n        -122.210551,\n        37.420365\n      ],\n      [\n        -122.210218,\n        37.420385\n      ],\n      [\n        -122.209883,\n        37.42041\n      ],\n      [\n        -122.209553,\n        37.42044\n      ],\n      [\n        -122.209205,\n        37.420478\n      ],\n      [\n        -122.208867,\n        37.420525\n      ],\n      [\n        -122.208513,\n        37.420578\n      ],\n      [\n        -122.208177,\n        37.42064\n      ],\n      [\n        -122.20782,\n        37.420715\n      ],\n      [\n        -122.207265,\n        37.42084\n      ],\n      [\n        -122.206957,\n        37.420902\n      ],\n      [\n        -122.206597,\n        37.420968\n      ],\n      [\n        -122.20623,\n        37.421024\n      ],\n      [\n        -122.205838,\n        37.421077\n      ],\n      [\n        -122.205455,\n        37.421124\n      ],\n      [\n        -122.20508,\n        37.421161\n      ],\n      [\n        -122.205051,\n        37.421164\n      ],\n      [\n        -122.20438,\n        37.421232\n      ],\n      [\n        -122.204275,\n        37.421242\n      ],\n      [\n        -122.204147,\n        37.421255\n      ],\n      [\n        -122.201533,\n        37.421537\n      ],\n      [\n        -122.201107,\n        37.421588\n      ],\n      [\n        -122.200678,\n        37.421648\n      ],\n      [\n        -122.200278,\n        37.421714\n      ],\n      [\n        -122.19986,\n        37.421795\n      ],\n      [\n        -122.199519,\n        37.421863\n      ],\n      [\n        -122.199213,\n        37.421932\n      ],\n      [\n        -122.199178,\n        37.42194\n      ],\n      [\n        -122.198883,\n        37.422018\n      ],\n      [\n        -122.198561,\n        37.422108\n      ],\n      [\n        -122.198474,\n        37.422139\n      ],\n      [\n        -122.198425,\n        37.422156\n      ],\n      [\n        -122.19825,\n        37.422219\n      ],\n      [\n        -122.197896,\n        37.422349\n      ],\n      [\n        -122.197548,\n        37.422485\n      ],\n      [\n        -122.197186,\n        37.42264\n      ],\n      [\n        -122.196845,\n        37.4228\n      ],\n      [\n        -122.196499,\n        37.422973\n      ],\n      [\n        -122.196177,\n        37.42315\n      ],\n      [\n        -122.196094,\n        37.4232\n      ],\n      [\n        -122.195885,\n        37.423328\n      ],\n      [\n        -122.195579,\n        37.423522\n      ],\n      [\n        -122.195313,\n        37.423703\n      ],\n      [\n        -122.195225,\n        37.423768\n      ],\n      [\n        -122.195027,\n        37.423914\n      ],\n      [\n        -122.194766,\n        37.424106\n      ],\n      [\n        -122.194498,\n        37.424304\n      ],\n      [\n        -122.193153,\n        37.425214\n      ],\n      [\n        -122.192575,\n        37.42561\n      ],\n      [\n        -122.19256,\n        37.425619\n      ],\n      [\n        -122.192405,\n        37.42572\n      ],\n      [\n        -122.192282,\n        37.425805\n      ],\n      [\n        -122.19216,\n        37.42589\n      ],\n      [\n        -122.191762,\n        37.426167\n      ],\n      [\n        -122.191563,\n        37.426312\n      ],\n      [\n        -122.191375,\n        37.426482\n      ],\n      [\n        -122.191241,\n        37.426644\n      ],\n      [\n        -122.191149,\n        37.426777\n      ],\n      [\n        -122.191129,\n        37.426806\n      ],\n      [\n        -122.190952,\n        37.427104\n      ],\n      [\n        -122.19026,\n        37.428271\n      ],\n      [\n        -122.190215,\n        37.428335\n      ],\n      [\n        -122.190208,\n        37.428345\n      ],\n      [\n        -122.190096,\n        37.428462\n      ],\n      [\n        -122.189939,\n        37.428643\n      ],\n      [\n        -122.189722,\n        37.428852\n      ],\n      [\n        -122.189509,\n        37.429051\n      ],\n      [\n        -122.189337,\n        37.4292\n      ],\n      [\n        -122.189138,\n        37.429349\n      ],\n      [\n        -122.188893,\n        37.429529\n      ],\n      [\n        -122.188533,\n        37.429792\n      ],\n      [\n        -122.188524,\n        37.429799\n      ],\n      [\n        -122.188418,\n        37.429874\n      ],\n      [\n        -122.188319,\n        37.429947\n      ],\n      [\n        -122.188,\n        37.430182\n      ],\n      [\n        -122.186839,\n        37.431034\n      ],\n      [\n        -122.186485,\n        37.431281\n      ],\n      [\n        -122.186284,\n        37.431428\n      ],\n      [\n        -122.186063,\n        37.43159\n      ],\n      [\n        -122.185817,\n        37.43177\n      ],\n      [\n        -122.185654,\n        37.43189\n      ],\n      [\n        -122.185552,\n        37.431966\n      ],\n      [\n        -122.184702,\n        37.432608\n      ],\n      [\n        -122.183286,\n        37.433649\n      ],\n      [\n        -122.182827,\n        37.433971\n      ],\n      [\n        -122.182634,\n        37.434112\n      ],\n      [\n        -122.182513,\n        37.434202\n      ],\n      [\n        -122.182166,\n        37.434457\n      ],\n      [\n        -122.18214,\n        37.434476\n      ],\n      [\n        -122.182126,\n        37.434486\n      ],\n      [\n        -122.181998,\n        37.434592\n      ],\n      [\n        -122.181882,\n        37.434681\n      ],\n      [\n        -122.181665,\n        37.434834\n      ],\n      [\n        -122.181345,\n        37.435062\n      ],\n      [\n        -122.180965,\n        37.435357\n      ],\n      [\n        -122.178991,\n        37.43681\n      ],\n      [\n        -122.178669,\n        37.43705\n      ],\n      [\n        -122.178411,\n        37.43725\n      ],\n      [\n        -122.178231,\n        37.437383\n      ],\n      [\n        -122.178125,\n        37.437455\n      ],\n      [\n        -122.178033,\n        37.437514\n      ],\n      [\n        -122.177808,\n        37.437668\n      ],\n      [\n        -122.177521,\n        37.437894\n      ],\n      [\n        -122.176832,\n        37.438394\n      ],\n      [\n        -122.176418,\n        37.438698\n      ],\n      [\n        -122.17632,\n        37.438768\n      ],\n      [\n        -122.176186,\n        37.438864\n      ],\n      [\n        -122.176054,\n        37.43896\n      ],\n      [\n        -122.176026,\n        37.43898\n      ],\n      [\n        -122.175893,\n        37.439076\n      ],\n      [\n        -122.175795,\n        37.439148\n      ],\n      [\n        -122.175016,\n        37.439717\n      ],\n      [\n        -122.174925,\n        37.439791\n      ],\n      [\n        -122.174726,\n        37.439978\n      ],\n      [\n        -122.174614,\n        37.440109\n      ],\n      [\n        -122.174533,\n        37.440215\n      ],\n      [\n        -122.174491,\n        37.440273\n      ],\n      [\n        -122.174394,\n        37.440424\n      ],\n      [\n        -122.174352,\n        37.440496\n      ],\n      [\n        -122.174341,\n        37.440515\n      ],\n      [\n        -122.1743,\n        37.44059\n      ],\n      [\n        -122.174209,\n        37.440557\n      ],\n      [\n        -122.173548,\n        37.440299\n      ],\n      [\n        -122.173114,\n        37.440158\n      ],\n      [\n        -122.172817,\n        37.440052\n      ],\n      [\n        -122.172788,\n        37.440041\n      ],\n      [\n        -122.172673,\n        37.44\n      ],\n      [\n        -122.1726,\n        37.439972\n      ],\n      [\n        -122.171888,\n        37.439701\n      ],\n      [\n        -122.171322,\n        37.439484\n      ],\n      [\n        -122.171295,\n        37.439474\n      ],\n      [\n        -122.171193,\n        37.439438\n      ],\n      [\n        -122.171069,\n        37.439398\n      ],\n      [\n        -122.171022,\n        37.439511\n      ],\n      [\n        -122.170978,\n        37.43961\n      ],\n      [\n        -122.170854,\n        37.439888\n      ],\n      [\n        -122.170636,\n        37.440392\n      ],\n      [\n        -122.170463,\n        37.440781\n      ],\n      [\n        -122.170458,\n        37.440792\n      ],\n      [\n        -122.170422,\n        37.440861\n      ],\n      [\n        -122.17038,\n        37.441018\n      ],\n      [\n        -122.170353,\n        37.441062\n      ],\n      [\n        -122.170277,\n        37.441179\n      ],\n      [\n        -122.170257,\n        37.441204\n      ],\n      [\n        -122.170162,\n        37.441316\n      ],\n      [\n        -122.169916,\n        37.441521\n      ],\n      [\n        -122.169533,\n        37.44184\n      ],\n      [\n        -122.169256,\n        37.442069\n      ],\n      [\n        -122.169091,\n        37.442204\n      ],\n      [\n        -122.168977,\n        37.442298\n      ],\n      [\n        -122.168948,\n        37.442321\n      ],\n      [\n        -122.168933,\n        37.442334\n      ],\n      [\n        -122.168817,\n        37.442429\n      ],\n      [\n        -122.168893,\n        37.442547\n      ],\n      [\n        -122.16896,\n        37.4426\n      ],\n      [\n        -122.169369,\n        37.442909\n      ],\n      [\n        -122.169588,\n        37.443091\n      ],\n      [\n        -122.169599,\n        37.4431\n      ],\n      [\n        -122.169614,\n        37.443111\n      ],\n      [\n        -122.169649,\n        37.443139\n      ],\n      [\n        -122.169562,\n        37.443224\n      ],\n      [\n        -122.169546,\n        37.443239\n      ],\n      [\n        -122.169517,\n        37.443266\n      ],\n      [\n        -122.169457,\n        37.44332\n      ],\n      [\n        -122.169396,\n        37.443375\n      ]\n    ],\n    \"type\": \"LineString\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/assets/dva-sf-route-main.geojson",
    "content": "{\n  \"type\": \"Feature\",\n  \"id\": \"route-sf-1\",\n  \"properties\": {},\n  \"geometry\": {\n    \"coordinates\": [\n      [\n        -122.407122,\n        37.652918\n      ],\n      [\n        -122.40703,\n        37.651854\n      ],\n      [\n        -122.406994,\n        37.651448\n      ],\n      [\n        -122.406878,\n        37.650131\n      ],\n      [\n        -122.406851,\n        37.649815\n      ],\n      [\n        -122.406772,\n        37.648917\n      ],\n      [\n        -122.406733,\n        37.648485\n      ],\n      [\n        -122.406676,\n        37.647823\n      ],\n      [\n        -122.406364,\n        37.644247\n      ],\n      [\n        -122.406231,\n        37.642768\n      ],\n      [\n        -122.406206,\n        37.642476\n      ],\n      [\n        -122.406181,\n        37.642169\n      ],\n      [\n        -122.406169,\n        37.642037\n      ],\n      [\n        -122.406155,\n        37.641901\n      ],\n      [\n        -122.406134,\n        37.641737\n      ],\n      [\n        -122.406113,\n        37.641594\n      ],\n      [\n        -122.406092,\n        37.641458\n      ],\n      [\n        -122.406066,\n        37.641299\n      ],\n      [\n        -122.406039,\n        37.641152\n      ],\n      [\n        -122.406009,\n        37.641006\n      ],\n      [\n        -122.40598,\n        37.640867\n      ],\n      [\n        -122.405949,\n        37.640727\n      ],\n      [\n        -122.405908,\n        37.64057\n      ],\n      [\n        -122.405868,\n        37.640419\n      ],\n      [\n        -122.405827,\n        37.640276\n      ],\n      [\n        -122.405785,\n        37.640137\n      ],\n      [\n        -122.405741,\n        37.639993\n      ],\n      [\n        -122.405692,\n        37.639838\n      ],\n      [\n        -122.405648,\n        37.639713\n      ],\n      [\n        -122.405599,\n        37.639576\n      ],\n      [\n        -122.405539,\n        37.639419\n      ],\n      [\n        -122.405483,\n        37.639279\n      ],\n      [\n        -122.405426,\n        37.639136\n      ],\n      [\n        -122.405366,\n        37.638994\n      ],\n      [\n        -122.405306,\n        37.638854\n      ],\n      [\n        -122.405243,\n        37.638712\n      ],\n      [\n        -122.405181,\n        37.638577\n      ],\n      [\n        -122.405114,\n        37.638439\n      ],\n      [\n        -122.405045,\n        37.638299\n      ],\n      [\n        -122.404974,\n        37.63816\n      ],\n      [\n        -122.404901,\n        37.63802\n      ],\n      [\n        -122.404323,\n        37.636939\n      ],\n      [\n        -122.404251,\n        37.636803\n      ],\n      [\n        -122.404184,\n        37.636672\n      ],\n      [\n        -122.404117,\n        37.636538\n      ],\n      [\n        -122.404064,\n        37.636428\n      ],\n      [\n        -122.404002,\n        37.636293\n      ],\n      [\n        -122.40395,\n        37.636178\n      ],\n      [\n        -122.403894,\n        37.63605\n      ],\n      [\n        -122.403843,\n        37.635931\n      ],\n      [\n        -122.403789,\n        37.6358\n      ],\n      [\n        -122.403732,\n        37.635658\n      ],\n      [\n        -122.403684,\n        37.635533\n      ],\n      [\n        -122.40364,\n        37.63541\n      ],\n      [\n        -122.403595,\n        37.635288\n      ],\n      [\n        -122.403551,\n        37.635157\n      ],\n      [\n        -122.403508,\n        37.635026\n      ],\n      [\n        -122.403468,\n        37.6349\n      ],\n      [\n        -122.40343,\n        37.634774\n      ],\n      [\n        -122.403391,\n        37.634642\n      ],\n      [\n        -122.403353,\n        37.63451\n      ],\n      [\n        -122.403318,\n        37.634376\n      ],\n      [\n        -122.403285,\n        37.634245\n      ],\n      [\n        -122.403253,\n        37.634111\n      ],\n      [\n        -122.403221,\n        37.633966\n      ],\n      [\n        -122.403193,\n        37.63384\n      ],\n      [\n        -122.40317,\n        37.633726\n      ],\n      [\n        -122.403138,\n        37.633567\n      ],\n      [\n        -122.403111,\n        37.633403\n      ],\n      [\n        -122.40309,\n        37.633268\n      ],\n      [\n        -122.403064,\n        37.633087\n      ],\n      [\n        -122.403047,\n        37.632951\n      ],\n      [\n        -122.40303,\n        37.632806\n      ],\n      [\n        -122.402911,\n        37.63176\n      ],\n      [\n        -122.402811,\n        37.63089\n      ],\n      [\n        -122.402642,\n        37.629404\n      ],\n      [\n        -122.402623,\n        37.629241\n      ],\n      [\n        -122.402607,\n        37.629108\n      ],\n      [\n        -122.402587,\n        37.628957\n      ],\n      [\n        -122.402566,\n        37.628812\n      ],\n      [\n        -122.402544,\n        37.628667\n      ],\n      [\n        -122.402517,\n        37.628512\n      ],\n      [\n        -122.402492,\n        37.628367\n      ],\n      [\n        -122.402465,\n        37.628224\n      ],\n      [\n        -122.402436,\n        37.628087\n      ],\n      [\n        -122.402403,\n        37.627941\n      ],\n      [\n        -122.402369,\n        37.627793\n      ],\n      [\n        -122.402331,\n        37.627639\n      ],\n      [\n        -122.402296,\n        37.627503\n      ],\n      [\n        -122.40226,\n        37.627369\n      ],\n      [\n        -122.402213,\n        37.627208\n      ],\n      [\n        -122.402174,\n        37.627078\n      ],\n      [\n        -122.402127,\n        37.626933\n      ],\n      [\n        -122.402079,\n        37.626785\n      ],\n      [\n        -122.402028,\n        37.626631\n      ],\n      [\n        -122.40198,\n        37.626488\n      ],\n      [\n        -122.401772,\n        37.625875\n      ],\n      [\n        -122.401515,\n        37.625117\n      ],\n      [\n        -122.40142,\n        37.624803\n      ],\n      [\n        -122.401324,\n        37.624488\n      ],\n      [\n        -122.400341,\n        37.621582\n      ],\n      [\n        -122.399869,\n        37.620178\n      ],\n      [\n        -122.398952,\n        37.617466\n      ],\n      [\n        -122.398743,\n        37.616845\n      ],\n      [\n        -122.398701,\n        37.616722\n      ],\n      [\n        -122.398663,\n        37.616608\n      ],\n      [\n        -122.398618,\n        37.616485\n      ],\n      [\n        -122.39857,\n        37.61636\n      ],\n      [\n        -122.398508,\n        37.616213\n      ],\n      [\n        -122.3984,\n        37.615968\n      ],\n      [\n        -122.398284,\n        37.61573\n      ],\n      [\n        -122.39816,\n        37.615493\n      ],\n      [\n        -122.398022,\n        37.615251\n      ],\n      [\n        -122.397882,\n        37.615023\n      ],\n      [\n        -122.397725,\n        37.614781\n      ],\n      [\n        -122.397568,\n        37.614549\n      ],\n      [\n        -122.397402,\n        37.614317\n      ],\n      [\n        -122.397228,\n        37.614089\n      ],\n      [\n        -122.397051,\n        37.61387\n      ],\n      [\n        -122.396867,\n        37.613653\n      ],\n      [\n        -122.39667,\n        37.613431\n      ],\n      [\n        -122.39646,\n        37.613209\n      ],\n      [\n        -122.396245,\n        37.612995\n      ],\n      [\n        -122.396045,\n        37.612802\n      ],\n      [\n        -122.395829,\n        37.612604\n      ],\n      [\n        -122.395603,\n        37.612407\n      ],\n      [\n        -122.395394,\n        37.612232\n      ],\n      [\n        -122.395166,\n        37.61205\n      ],\n      [\n        -122.39493,\n        37.611869\n      ],\n      [\n        -122.394687,\n        37.611692\n      ],\n      [\n        -122.394458,\n        37.611531\n      ],\n      [\n        -122.394185,\n        37.61135\n      ],\n      [\n        -122.393921,\n        37.611179\n      ],\n      [\n        -122.393654,\n        37.611007\n      ],\n      [\n        -122.393397,\n        37.610841\n      ],\n      [\n        -122.393147,\n        37.610683\n      ],\n      [\n        -122.392891,\n        37.610521\n      ],\n      [\n        -122.392612,\n        37.610347\n      ],\n      [\n        -122.39236,\n        37.61019\n      ],\n      [\n        -122.392101,\n        37.610026\n      ],\n      [\n        -122.391844,\n        37.609862\n      ],\n      [\n        -122.391581,\n        37.609692\n      ],\n      [\n        -122.39133,\n        37.60953\n      ],\n      [\n        -122.389329,\n        37.608223\n      ],\n      [\n        -122.388638,\n        37.607793\n      ],\n      [\n        -122.387492,\n        37.607043\n      ],\n      [\n        -122.3848,\n        37.605286\n      ],\n      [\n        -122.383524,\n        37.604454\n      ],\n      [\n        -122.381873,\n        37.603398\n      ],\n      [\n        -122.378533,\n        37.601208\n      ],\n      [\n        -122.376497,\n        37.599876\n      ],\n      [\n        -122.375465,\n        37.599208\n      ],\n      [\n        -122.374245,\n        37.598423\n      ],\n      [\n        -122.373929,\n        37.598218\n      ],\n      [\n        -122.373674,\n        37.598053\n      ],\n      [\n        -122.373418,\n        37.597889\n      ],\n      [\n        -122.373162,\n        37.597724\n      ],\n      [\n        -122.372907,\n        37.597561\n      ],\n      [\n        -122.37265,\n        37.597395\n      ],\n      [\n        -122.372394,\n        37.597228\n      ],\n      [\n        -122.368822,\n        37.594894\n      ],\n      [\n        -122.367297,\n        37.593897\n      ],\n      [\n        -122.365383,\n        37.592646\n      ],\n      [\n        -122.360976,\n        37.589762\n      ],\n      [\n        -122.360722,\n        37.589597\n      ],\n      [\n        -122.360468,\n        37.589432\n      ],\n      [\n        -122.360219,\n        37.589274\n      ],\n      [\n        -122.359957,\n        37.589115\n      ],\n      [\n        -122.359695,\n        37.588967\n      ],\n      [\n        -122.359427,\n        37.588824\n      ],\n      [\n        -122.35915,\n        37.588687\n      ],\n      [\n        -122.358867,\n        37.588555\n      ],\n      [\n        -122.358581,\n        37.588431\n      ],\n      [\n        -122.358289,\n        37.588311\n      ],\n      [\n        -122.357994,\n        37.5882\n      ],\n      [\n        -122.357698,\n        37.588091\n      ],\n      [\n        -122.357402,\n        37.587989\n      ],\n      [\n        -122.357098,\n        37.587889\n      ],\n      [\n        -122.356792,\n        37.587796\n      ],\n      [\n        -122.356484,\n        37.587708\n      ],\n      [\n        -122.356163,\n        37.587624\n      ],\n      [\n        -122.355841,\n        37.587546\n      ],\n      [\n        -122.355524,\n        37.587478\n      ],\n      [\n        -122.355205,\n        37.587414\n      ],\n      [\n        -122.354873,\n        37.587356\n      ],\n      [\n        -122.354553,\n        37.587305\n      ],\n      [\n        -122.354231,\n        37.587261\n      ],\n      [\n        -122.353893,\n        37.587222\n      ],\n      [\n        -122.353563,\n        37.58719\n      ],\n      [\n        -122.353235,\n        37.587165\n      ],\n      [\n        -122.352907,\n        37.587146\n      ],\n      [\n        -122.352572,\n        37.587134\n      ],\n      [\n        -122.352244,\n        37.587126\n      ],\n      [\n        -122.351913,\n        37.587117\n      ],\n      [\n        -122.350092,\n        37.587071\n      ],\n      [\n        -122.348434,\n        37.587029\n      ],\n      [\n        -122.342158,\n        37.586869\n      ],\n      [\n        -122.338352,\n        37.586771\n      ],\n      [\n        -122.334706,\n        37.586675\n      ],\n      [\n        -122.334539,\n        37.58667\n      ],\n      [\n        -122.334374,\n        37.586666\n      ],\n      [\n        -122.334208,\n        37.58666\n      ],\n      [\n        -122.334043,\n        37.586654\n      ],\n      [\n        -122.333876,\n        37.586644\n      ],\n      [\n        -122.333713,\n        37.586632\n      ],\n      [\n        -122.333549,\n        37.586616\n      ],\n      [\n        -122.333401,\n        37.586599\n      ],\n      [\n        -122.333238,\n        37.586578\n      ],\n      [\n        -122.333073,\n        37.586554\n      ],\n      [\n        -122.332912,\n        37.586527\n      ],\n      [\n        -122.332757,\n        37.586499\n      ],\n      [\n        -122.332598,\n        37.586467\n      ],\n      [\n        -122.332439,\n        37.586432\n      ],\n      [\n        -122.332284,\n        37.586394\n      ],\n      [\n        -122.332129,\n        37.586353\n      ],\n      [\n        -122.331973,\n        37.586307\n      ],\n      [\n        -122.331819,\n        37.586259\n      ],\n      [\n        -122.331668,\n        37.586208\n      ],\n      [\n        -122.331517,\n        37.586154\n      ],\n      [\n        -122.331368,\n        37.586097\n      ],\n      [\n        -122.33122,\n        37.586036\n      ],\n      [\n        -122.331076,\n        37.585974\n      ],\n      [\n        -122.330939,\n        37.585911\n      ],\n      [\n        -122.330797,\n        37.585841\n      ],\n      [\n        -122.330659,\n        37.585771\n      ],\n      [\n        -122.330522,\n        37.585697\n      ],\n      [\n        -122.330388,\n        37.585619\n      ],\n      [\n        -122.330255,\n        37.58554\n      ],\n      [\n        -122.330128,\n        37.585459\n      ],\n      [\n        -122.33,\n        37.585373\n      ],\n      [\n        -122.329877,\n        37.585286\n      ],\n      [\n        -122.329755,\n        37.585196\n      ],\n      [\n        -122.329637,\n        37.585105\n      ],\n      [\n        -122.329528,\n        37.585016\n      ],\n      [\n        -122.329416,\n        37.584919\n      ],\n      [\n        -122.329307,\n        37.584822\n      ],\n      [\n        -122.329199,\n        37.584723\n      ],\n      [\n        -122.32909,\n        37.584624\n      ],\n      [\n        -122.328981,\n        37.584525\n      ],\n      [\n        -122.328761,\n        37.584324\n      ],\n      [\n        -122.32855,\n        37.58413\n      ],\n      [\n        -122.32586,\n        37.581655\n      ],\n      [\n        -122.322973,\n        37.578998\n      ],\n      [\n        -122.322116,\n        37.578206\n      ],\n      [\n        -122.320062,\n        37.576311\n      ],\n      [\n        -122.320017,\n        37.57627\n      ],\n      [\n        -122.319869,\n        37.576134\n      ],\n      [\n        -122.316743,\n        37.573261\n      ],\n      [\n        -122.315547,\n        37.572164\n      ],\n      [\n        -122.314233,\n        37.570954\n      ],\n      [\n        -122.313924,\n        37.57067\n      ],\n      [\n        -122.310821,\n        37.567812\n      ],\n      [\n        -122.307349,\n        37.564604\n      ],\n      [\n        -122.303966,\n        37.561465\n      ],\n      [\n        -122.303806,\n        37.561318\n      ],\n      [\n        -122.303563,\n        37.561094\n      ],\n      [\n        -122.303229,\n        37.560786\n      ],\n      [\n        -122.302745,\n        37.560339\n      ],\n      [\n        -122.302578,\n        37.560184\n      ],\n      [\n        -122.302221,\n        37.559834\n      ],\n      [\n        -122.301877,\n        37.559462\n      ],\n      [\n        -122.301503,\n        37.559045\n      ],\n      [\n        -122.300259,\n        37.557614\n      ],\n      [\n        -122.299811,\n        37.557113\n      ],\n      [\n        -122.299097,\n        37.556349\n      ],\n      [\n        -122.298297,\n        37.555496\n      ],\n      [\n        -122.297836,\n        37.554994\n      ],\n      [\n        -122.297302,\n        37.554435\n      ],\n      [\n        -122.296463,\n        37.55358\n      ],\n      [\n        -122.296045,\n        37.553142\n      ],\n      [\n        -122.29561,\n        37.552672\n      ],\n      [\n        -122.295214,\n        37.552246\n      ],\n      [\n        -122.293655,\n        37.550567\n      ],\n      [\n        -122.293004,\n        37.549875\n      ],\n      [\n        -122.292169,\n        37.548986\n      ],\n      [\n        -122.291948,\n        37.548743\n      ],\n      [\n        -122.289392,\n        37.54597\n      ],\n      [\n        -122.288405,\n        37.544944\n      ],\n      [\n        -122.287796,\n        37.544278\n      ],\n      [\n        -122.286169,\n        37.542512\n      ],\n      [\n        -122.285673,\n        37.541977\n      ],\n      [\n        -122.285448,\n        37.541735\n      ],\n      [\n        -122.285224,\n        37.541487\n      ],\n      [\n        -122.284387,\n        37.54056\n      ],\n      [\n        -122.283855,\n        37.53998\n      ],\n      [\n        -122.281894,\n        37.537856\n      ],\n      [\n        -122.278507,\n        37.534197\n      ],\n      [\n        -122.278221,\n        37.533889\n      ],\n      [\n        -122.276436,\n        37.53196\n      ],\n      [\n        -122.276115,\n        37.531611\n      ],\n      [\n        -122.27579,\n        37.531271\n      ],\n      [\n        -122.275406,\n        37.530884\n      ],\n      [\n        -122.275046,\n        37.530531\n      ],\n      [\n        -122.274708,\n        37.530208\n      ],\n      [\n        -122.274342,\n        37.529869\n      ],\n      [\n        -122.273655,\n        37.529205\n      ],\n      [\n        -122.273154,\n        37.528815\n      ],\n      [\n        -122.272342,\n        37.528105\n      ],\n      [\n        -122.272189,\n        37.527971\n      ],\n      [\n        -122.270415,\n        37.526418\n      ],\n      [\n        -122.269845,\n        37.52592\n      ],\n      [\n        -122.266637,\n        37.523089\n      ],\n      [\n        -122.264819,\n        37.521483\n      ],\n      [\n        -122.264759,\n        37.52143\n      ],\n      [\n        -122.264614,\n        37.521302\n      ],\n      [\n        -122.262626,\n        37.51954\n      ],\n      [\n        -122.261998,\n        37.518984\n      ],\n      [\n        -122.260906,\n        37.518025\n      ],\n      [\n        -122.259427,\n        37.516714\n      ],\n      [\n        -122.258951,\n        37.516295\n      ],\n      [\n        -122.258289,\n        37.515711\n      ],\n      [\n        -122.256591,\n        37.51421\n      ],\n      [\n        -122.255976,\n        37.513661\n      ],\n      [\n        -122.254131,\n        37.512029\n      ],\n      [\n        -122.252182,\n        37.510308\n      ],\n      [\n        -122.251133,\n        37.509364\n      ],\n      [\n        -122.247718,\n        37.506343\n      ],\n      [\n        -122.246359,\n        37.505143\n      ],\n      [\n        -122.24495,\n        37.5039\n      ],\n      [\n        -122.242977,\n        37.502159\n      ],\n      [\n        -122.241503,\n        37.500843\n      ],\n      [\n        -122.240626,\n        37.500077\n      ],\n      [\n        -122.239936,\n        37.49948\n      ],\n      [\n        -122.23961,\n        37.499205\n      ],\n      [\n        -122.239275,\n        37.498933\n      ],\n      [\n        -122.238925,\n        37.49867\n      ],\n      [\n        -122.238549,\n        37.498412\n      ],\n      [\n        -122.238179,\n        37.498179\n      ],\n      [\n        -122.237781,\n        37.497947\n      ],\n      [\n        -122.237643,\n        37.497874\n      ],\n      [\n        -122.237525,\n        37.497812\n      ],\n      [\n        -122.237316,\n        37.497702\n      ],\n      [\n        -122.236836,\n        37.497476\n      ],\n      [\n        -122.236428,\n        37.497294\n      ],\n      [\n        -122.236015,\n        37.497131\n      ],\n      [\n        -122.235562,\n        37.496967\n      ],\n      [\n        -122.235117,\n        37.496826\n      ],\n      [\n        -122.234679,\n        37.496692\n      ],\n      [\n        -122.233317,\n        37.496306\n      ],\n      [\n        -122.232849,\n        37.496174\n      ],\n      [\n        -122.231907,\n        37.495907\n      ],\n      [\n        -122.228972,\n        37.495072\n      ],\n      [\n        -122.227971,\n        37.494786\n      ],\n      [\n        -122.227474,\n        37.494646\n      ],\n      [\n        -122.226952,\n        37.494495\n      ],\n      [\n        -122.22654,\n        37.494367\n      ],\n      [\n        -122.226136,\n        37.494237\n      ],\n      [\n        -122.225754,\n        37.494108\n      ],\n      [\n        -122.225217,\n        37.493918\n      ],\n      [\n        -122.224802,\n        37.493767\n      ],\n      [\n        -122.224342,\n        37.493593\n      ],\n      [\n        -122.2239,\n        37.493416\n      ],\n      [\n        -122.223464,\n        37.493236\n      ],\n      [\n        -122.223043,\n        37.493054\n      ],\n      [\n        -122.222589,\n        37.492856\n      ],\n      [\n        -122.219022,\n        37.49127\n      ],\n      [\n        -122.218915,\n        37.491223\n      ],\n      [\n        -122.218667,\n        37.491016\n      ],\n      [\n        -122.218287,\n        37.490841\n      ],\n      [\n        -122.217089,\n        37.490211\n      ],\n      [\n        -122.216943,\n        37.490137\n      ],\n      [\n        -122.216767,\n        37.490056\n      ],\n      [\n        -122.21625,\n        37.489824\n      ],\n      [\n        -122.215678,\n        37.489556\n      ],\n      [\n        -122.21556,\n        37.4895\n      ],\n      [\n        -122.215443,\n        37.48944\n      ],\n      [\n        -122.215323,\n        37.489376\n      ],\n      [\n        -122.215209,\n        37.489308\n      ],\n      [\n        -122.215104,\n        37.489236\n      ],\n      [\n        -122.215016,\n        37.489169\n      ],\n      [\n        -122.214926,\n        37.489094\n      ],\n      [\n        -122.214847,\n        37.48902\n      ],\n      [\n        -122.214767,\n        37.488942\n      ],\n      [\n        -122.214698,\n        37.488867\n      ],\n      [\n        -122.214621,\n        37.488776\n      ],\n      [\n        -122.214555,\n        37.488684\n      ],\n      [\n        -122.21447,\n        37.488563\n      ],\n      [\n        -122.214334,\n        37.488336\n      ],\n      [\n        -122.214307,\n        37.488277\n      ],\n      [\n        -122.214295,\n        37.488247\n      ],\n      [\n        -122.214267,\n        37.488169\n      ],\n      [\n        -122.21425,\n        37.488091\n      ],\n      [\n        -122.21424,\n        37.488022\n      ],\n      [\n        -122.214235,\n        37.487956\n      ],\n      [\n        -122.214233,\n        37.487888\n      ],\n      [\n        -122.214238,\n        37.487805\n      ],\n      [\n        -122.214277,\n        37.48743\n      ],\n      [\n        -122.214289,\n        37.487265\n      ],\n      [\n        -122.214258,\n        37.487107\n      ],\n      [\n        -122.214226,\n        37.487011\n      ],\n      [\n        -122.214242,\n        37.486949\n      ],\n      [\n        -122.214349,\n        37.486538\n      ],\n      [\n        -122.214483,\n        37.485984\n      ],\n      [\n        -122.214552,\n        37.485753\n      ],\n      [\n        -122.214665,\n        37.485488\n      ],\n      [\n        -122.214706,\n        37.485392\n      ],\n      [\n        -122.214767,\n        37.485278\n      ],\n      [\n        -122.214801,\n        37.485214\n      ],\n      [\n        -122.214865,\n        37.485139\n      ],\n      [\n        -122.214904,\n        37.485092\n      ],\n      [\n        -122.215076,\n        37.484894\n      ],\n      [\n        -122.215308,\n        37.484683\n      ],\n      [\n        -122.215548,\n        37.484513\n      ],\n      [\n        -122.215745,\n        37.484384\n      ],\n      [\n        -122.215994,\n        37.484247\n      ],\n      [\n        -122.216226,\n        37.484125\n      ],\n      [\n        -122.216647,\n        37.483914\n      ],\n      [\n        -122.217136,\n        37.483614\n      ],\n      [\n        -122.217325,\n        37.483498\n      ],\n      [\n        -122.217488,\n        37.483369\n      ],\n      [\n        -122.217668,\n        37.483212\n      ],\n      [\n        -122.217848,\n        37.483015\n      ],\n      [\n        -122.218003,\n        37.482797\n      ],\n      [\n        -122.218468,\n        37.482138\n      ],\n      [\n        -122.21858,\n        37.48198\n      ],\n      [\n        -122.218728,\n        37.481757\n      ],\n      [\n        -122.218895,\n        37.481507\n      ],\n      [\n        -122.218943,\n        37.481437\n      ],\n      [\n        -122.219068,\n        37.481255\n      ],\n      [\n        -122.219133,\n        37.481162\n      ],\n      [\n        -122.219207,\n        37.481063\n      ],\n      [\n        -122.219258,\n        37.480995\n      ],\n      [\n        -122.219381,\n        37.480828\n      ],\n      [\n        -122.219599,\n        37.480447\n      ],\n      [\n        -122.220208,\n        37.479485\n      ],\n      [\n        -122.220388,\n        37.479186\n      ],\n      [\n        -122.220642,\n        37.478779\n      ],\n      [\n        -122.220783,\n        37.478562\n      ],\n      [\n        -122.221435,\n        37.47764\n      ],\n      [\n        -122.221572,\n        37.477428\n      ],\n      [\n        -122.221667,\n        37.477265\n      ],\n      [\n        -122.221817,\n        37.476852\n      ],\n      [\n        -122.22183,\n        37.476781\n      ],\n      [\n        -122.221873,\n        37.476604\n      ],\n      [\n        -122.222001,\n        37.47623\n      ],\n      [\n        -122.222044,\n        37.476066\n      ],\n      [\n        -122.222087,\n        37.47593\n      ],\n      [\n        -122.22213,\n        37.475848\n      ],\n      [\n        -122.22219,\n        37.475773\n      ],\n      [\n        -122.222268,\n        37.475726\n      ],\n      [\n        -122.222353,\n        37.475705\n      ],\n      [\n        -122.222448,\n        37.475698\n      ],\n      [\n        -122.222517,\n        37.475713\n      ],\n      [\n        -122.222542,\n        37.475719\n      ],\n      [\n        -122.222628,\n        37.47576\n      ],\n      [\n        -122.222825,\n        37.475903\n      ],\n      [\n        -122.222912,\n        37.475969\n      ],\n      [\n        -122.222947,\n        37.476045\n      ],\n      [\n        -122.222946,\n        37.476121\n      ],\n      [\n        -122.222928,\n        37.47627\n      ],\n      [\n        -122.22263,\n        37.47652\n      ],\n      [\n        -122.222594,\n        37.47655\n      ],\n      [\n        -122.222491,\n        37.476584\n      ],\n      [\n        -122.222388,\n        37.476597\n      ],\n      [\n        -122.222319,\n        37.476604\n      ],\n      [\n        -122.222225,\n        37.476597\n      ],\n      [\n        -122.222096,\n        37.476584\n      ],\n      [\n        -122.221332,\n        37.476032\n      ],\n      [\n        -122.22085,\n        37.475689\n      ],\n      [\n        -122.220826,\n        37.475671\n      ],\n      [\n        -122.220491,\n        37.475426\n      ],\n      [\n        -122.220111,\n        37.475153\n      ],\n      [\n        -122.219933,\n        37.475031\n      ],\n      [\n        -122.219426,\n        37.474642\n      ],\n      [\n        -122.219111,\n        37.474418\n      ],\n      [\n        -122.218984,\n        37.474329\n      ],\n      [\n        -122.218438,\n        37.473942\n      ],\n      [\n        -122.218246,\n        37.473806\n      ],\n      [\n        -122.217956,\n        37.473599\n      ],\n      [\n        -122.217753,\n        37.473453\n      ],\n      [\n        -122.217597,\n        37.473341\n      ],\n      [\n        -122.217293,\n        37.473124\n      ],\n      [\n        -122.217201,\n        37.473056\n      ],\n      [\n        -122.216937,\n        37.472866\n      ],\n      [\n        -122.216873,\n        37.472818\n      ],\n      [\n        -122.216781,\n        37.472753\n      ],\n      [\n        -122.216497,\n        37.472549\n      ],\n      [\n        -122.216231,\n        37.472364\n      ],\n      [\n        -122.21616,\n        37.472314\n      ],\n      [\n        -122.215981,\n        37.47218\n      ],\n      [\n        -122.215688,\n        37.47196\n      ],\n      [\n        -122.21551,\n        37.471831\n      ],\n      [\n        -122.215298,\n        37.47168\n      ],\n      [\n        -122.214841,\n        37.471347\n      ],\n      [\n        -122.214388,\n        37.471018\n      ],\n      [\n        -122.214135,\n        37.470836\n      ],\n      [\n        -122.213987,\n        37.470729\n      ],\n      [\n        -122.213938,\n        37.470694\n      ],\n      [\n        -122.21374,\n        37.47055\n      ],\n      [\n        -122.213118,\n        37.470071\n      ],\n      [\n        -122.212899,\n        37.469903\n      ],\n      [\n        -122.212764,\n        37.469802\n      ],\n      [\n        -122.211952,\n        37.469198\n      ],\n      [\n        -122.211189,\n        37.468636\n      ],\n      [\n        -122.210886,\n        37.468403\n      ],\n      [\n        -122.210823,\n        37.468356\n      ],\n      [\n        -122.210787,\n        37.46833\n      ],\n      [\n        -122.209994,\n        37.467759\n      ],\n      [\n        -122.209111,\n        37.467113\n      ],\n      [\n        -122.209036,\n        37.467059\n      ],\n      [\n        -122.208672,\n        37.466796\n      ],\n      [\n        -122.207682,\n        37.466081\n      ],\n      [\n        -122.207634,\n        37.46605\n      ],\n      [\n        -122.207348,\n        37.46586\n      ],\n      [\n        -122.207012,\n        37.465631\n      ],\n      [\n        -122.205867,\n        37.46491\n      ],\n      [\n        -122.205539,\n        37.46472\n      ],\n      [\n        -122.204714,\n        37.46432\n      ],\n      [\n        -122.204381,\n        37.464152\n      ],\n      [\n        -122.202995,\n        37.463452\n      ],\n      [\n        -122.202472,\n        37.463172\n      ],\n      [\n        -122.201557,\n        37.462724\n      ],\n      [\n        -122.201411,\n        37.462652\n      ],\n      [\n        -122.20133,\n        37.462613\n      ],\n      [\n        -122.201141,\n        37.462519\n      ],\n      [\n        -122.200654,\n        37.462275\n      ],\n      [\n        -122.200446,\n        37.462171\n      ],\n      [\n        -122.199618,\n        37.461727\n      ],\n      [\n        -122.199131,\n        37.461504\n      ],\n      [\n        -122.198617,\n        37.461246\n      ],\n      [\n        -122.198202,\n        37.461053\n      ],\n      [\n        -122.197882,\n        37.460903\n      ],\n      [\n        -122.197571,\n        37.460753\n      ],\n      [\n        -122.196942,\n        37.460444\n      ],\n      [\n        -122.196618,\n        37.460277\n      ],\n      [\n        -122.196329,\n        37.460129\n      ],\n      [\n        -122.195924,\n        37.459924\n      ],\n      [\n        -122.195921,\n        37.459922\n      ],\n      [\n        -122.195644,\n        37.459787\n      ],\n      [\n        -122.19511,\n        37.459519\n      ],\n      [\n        -122.19475,\n        37.459341\n      ],\n      [\n        -122.194172,\n        37.459052\n      ],\n      [\n        -122.193782,\n        37.45886\n      ],\n      [\n        -122.192701,\n        37.458335\n      ],\n      [\n        -122.192625,\n        37.458297\n      ],\n      [\n        -122.192049,\n        37.458007\n      ],\n      [\n        -122.191368,\n        37.457658\n      ],\n      [\n        -122.191114,\n        37.457533\n      ],\n      [\n        -122.190972,\n        37.457464\n      ],\n      [\n        -122.190877,\n        37.457417\n      ],\n      [\n        -122.190749,\n        37.45735\n      ],\n      [\n        -122.188289,\n        37.456126\n      ],\n      [\n        -122.187751,\n        37.455859\n      ],\n      [\n        -122.187711,\n        37.455841\n      ],\n      [\n        -122.187618,\n        37.455797\n      ],\n      [\n        -122.18752,\n        37.45575\n      ],\n      [\n        -122.187341,\n        37.455668\n      ],\n      [\n        -122.187015,\n        37.455511\n      ],\n      [\n        -122.186836,\n        37.455421\n      ],\n      [\n        -122.186443,\n        37.455228\n      ],\n      [\n        -122.185899,\n        37.45496\n      ],\n      [\n        -122.18546,\n        37.454744\n      ],\n      [\n        -122.185238,\n        37.454633\n      ],\n      [\n        -122.185154,\n        37.454591\n      ],\n      [\n        -122.185028,\n        37.454527\n      ],\n      [\n        -122.184786,\n        37.454405\n      ],\n      [\n        -122.184634,\n        37.454333\n      ],\n      [\n        -122.184583,\n        37.45431\n      ],\n      [\n        -122.184561,\n        37.454299\n      ],\n      [\n        -122.184454,\n        37.454243\n      ],\n      [\n        -122.18437,\n        37.454199\n      ],\n      [\n        -122.184146,\n        37.454092\n      ],\n      [\n        -122.18412,\n        37.454079\n      ],\n      [\n        -122.183666,\n        37.45386\n      ],\n      [\n        -122.183433,\n        37.453742\n      ],\n      [\n        -122.18319,\n        37.453619\n      ],\n      [\n        -122.183141,\n        37.453594\n      ],\n      [\n        -122.183127,\n        37.453589\n      ],\n      [\n        -122.182998,\n        37.453527\n      ],\n      [\n        -122.182907,\n        37.453483\n      ],\n      [\n        -122.18276,\n        37.453408\n      ],\n      [\n        -122.18259,\n        37.453321\n      ],\n      [\n        -122.182114,\n        37.453092\n      ],\n      [\n        -122.181892,\n        37.452989\n      ],\n      [\n        -122.181876,\n        37.452982\n      ],\n      [\n        -122.181819,\n        37.452956\n      ],\n      [\n        -122.18174,\n        37.452914\n      ],\n      [\n        -122.181604,\n        37.452843\n      ],\n      [\n        -122.180831,\n        37.45245\n      ],\n      [\n        -122.180626,\n        37.452346\n      ],\n      [\n        -122.180224,\n        37.452134\n      ],\n      [\n        -122.180135,\n        37.452084\n      ],\n      [\n        -122.179883,\n        37.45195\n      ],\n      [\n        -122.179796,\n        37.451902\n      ],\n      [\n        -122.179728,\n        37.451864\n      ],\n      [\n        -122.179527,\n        37.451756\n      ],\n      [\n        -122.179273,\n        37.451614\n      ],\n      [\n        -122.178833,\n        37.451367\n      ],\n      [\n        -122.178453,\n        37.451156\n      ],\n      [\n        -122.177805,\n        37.450771\n      ],\n      [\n        -122.177636,\n        37.450668\n      ],\n      [\n        -122.177325,\n        37.450473\n      ],\n      [\n        -122.177314,\n        37.450465\n      ],\n      [\n        -122.17723,\n        37.450409\n      ],\n      [\n        -122.177044,\n        37.45029\n      ],\n      [\n        -122.176814,\n        37.450146\n      ],\n      [\n        -122.176559,\n        37.449983\n      ],\n      [\n        -122.176216,\n        37.449744\n      ],\n      [\n        -122.175957,\n        37.449576\n      ],\n      [\n        -122.175489,\n        37.449279\n      ],\n      [\n        -122.175471,\n        37.449267\n      ],\n      [\n        -122.175313,\n        37.44916\n      ],\n      [\n        -122.175275,\n        37.449134\n      ],\n      [\n        -122.175101,\n        37.449013\n      ],\n      [\n        -122.174987,\n        37.448939\n      ],\n      [\n        -122.174854,\n        37.448853\n      ],\n      [\n        -122.174724,\n        37.448764\n      ],\n      [\n        -122.174514,\n        37.448626\n      ],\n      [\n        -122.174456,\n        37.448585\n      ],\n      [\n        -122.174235,\n        37.44844\n      ],\n      [\n        -122.174214,\n        37.448427\n      ],\n      [\n        -122.17414,\n        37.448378\n      ],\n      [\n        -122.173788,\n        37.448139\n      ],\n      [\n        -122.173724,\n        37.448096\n      ],\n      [\n        -122.173252,\n        37.447803\n      ],\n      [\n        -122.173125,\n        37.447721\n      ],\n      [\n        -122.172867,\n        37.447556\n      ],\n      [\n        -122.172704,\n        37.447446\n      ],\n      [\n        -122.172548,\n        37.447337\n      ],\n      [\n        -122.172379,\n        37.447219\n      ],\n      [\n        -122.172238,\n        37.447122\n      ],\n      [\n        -122.17198,\n        37.446936\n      ],\n      [\n        -122.171784,\n        37.446802\n      ],\n      [\n        -122.17157,\n        37.446657\n      ],\n      [\n        -122.17147,\n        37.446588\n      ],\n      [\n        -122.171426,\n        37.446553\n      ],\n      [\n        -122.171342,\n        37.446485\n      ],\n      [\n        -122.171325,\n        37.446471\n      ],\n      [\n        -122.171294,\n        37.446447\n      ],\n      [\n        -122.171135,\n        37.446322\n      ],\n      [\n        -122.171128,\n        37.446316\n      ],\n      [\n        -122.171065,\n        37.446265\n      ],\n      [\n        -122.171055,\n        37.446257\n      ],\n      [\n        -122.170988,\n        37.446208\n      ],\n      [\n        -122.170274,\n        37.445654\n      ],\n      [\n        -122.169405,\n        37.444985\n      ],\n      [\n        -122.169492,\n        37.444918\n      ],\n      [\n        -122.169512,\n        37.444904\n      ],\n      [\n        -122.169937,\n        37.444555\n      ],\n      [\n        -122.169907,\n        37.444532\n      ],\n      [\n        -122.1699,\n        37.444528\n      ],\n      [\n        -122.169889,\n        37.444518\n      ],\n      [\n        -122.169773,\n        37.444425\n      ],\n      [\n        -122.169636,\n        37.444319\n      ],\n      [\n        -122.169486,\n        37.444209\n      ],\n      [\n        -122.16944,\n        37.44417\n      ],\n      [\n        -122.169341,\n        37.444094\n      ],\n      [\n        -122.169185,\n        37.443983\n      ],\n      [\n        -122.169035,\n        37.443864\n      ],\n      [\n        -122.169019,\n        37.443821\n      ],\n      [\n        -122.169084,\n        37.443758\n      ],\n      [\n        -122.169323,\n        37.443542\n      ],\n      [\n        -122.169363,\n        37.44341\n      ],\n      [\n        -122.169396,\n        37.443375\n      ]\n    ],\n    \"type\": \"LineString\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/assets/fragment-realestate-NY.json",
    "content": "{\n    \"imports\": [\n        {\n            \"id\": \"standard\",\n            \"url\": \"mapbox://styles/mapbox/standard\",\n            \"config\": {\n                \"font\": \"Montserrat\",\n                \"lightPreset\": \"dusk\",\n                \"showLandmarkIcons\": true,\n                \"showPointOfInterestLabels\": true,\n                \"showTransitLabels\": false,\n                \"showPlaceLabels\": true,\n                \"showRoadLabels\": false,\n                \"theme\": \"monochrome\",\n                \"show3dObjects\": true\n            }\n        }\n    ],\n    \"version\": 8,\n    \"sprite\": \"mapbox://sprites/examples/clkiip5x600b501pb4al5g7wv/du1h5vs55f48z8rgjod0dggl9\",\n    \"projection\": { \"name\": \"globe\" },\n    \"sources\": {\n        \"water_source\": {\n            \"type\": \"vector\",\n            \"url\": \"mapbox://mapbox.mapbox-streets-v8\"\n        },\n        \"ny_subway\": {\n            \"url\": \"mapbox://examples.clkicyt9103ld2hnxxfo3vpnm-3wmoh\",\n            \"type\": \"vector\"\n        },\n        \"hotels_data\": {\n            \"type\": \"vector\",\n            \"url\": \"mapbox://examples.clkiiizwk04l62jo3rjx61lgj-7xsxp\"\n        }\n    },\n    \"featuresets\": {\n      \"hotels-price\": {\n          \"selectors\": [\n              {\n                  \"layer\": \"NY-hotels-price\",\n                  \"properties\": {\n                      \"price\": [\"get\", \"price\"]\n                  }\n              }\n          ]\n        }\n    },\n    \"layers\": [\n        {\n            \"id\": \"water\",\n            \"type\": \"fill\",\n            \"slot\": \"bottom\",\n            \"source\": \"water_source\",\n            \"source-layer\": \"water\",\n            \"layout\": { },\n            \"paint\": {\n                \"fill-emissive-strength\": 1,\n                \"fill-color\": [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"measure-light\", \"brightness\" ],\n                    0.1,\n                    \"hsl(250, 50%, 40%)\",\n                    0.4,\n                    \"hsl(250, 50%, 80%)\"\n                ]\n            }\n        },\n        {\n            \"id\": \"subway-lines\",\n            \"type\": \"line\",\n            \"slot\": \"middle\",\n            \"source\": \"ny_subway\",\n            \"source-layer\": \"NY_subway\",\n            \"minzoom\": 9,\n            \"layout\": {},\n            \"paint\": {\n                \"line-emissive-strength\": 1,\n                \"line-depth-occlusion-factor\": 0.9,\n                \"line-color\": [\n                    \"match\",\n                    [\"get\", \"name\"],\n                    [\"A\", \"C\", \"E\"],\n                    \"#0039a6\",\n                    [\"B\", \"D\", \"F\", \"M\"],\n                    \"#ff6319\",\n                    [\"N-Q-R-W\"],\n                    \"hsl(245, 65%, 55%)\",\n                    [\"N-R\", \"Q\", \"W\"],\n                    \"#fccc0a\",\n                    [\"1\", \"2-3\"],\n                    \"#EE352e\",\n                    [\"G\"],\n                    \"#6cbe45\",\n                    [\"L\"],\n                    \"#a7a9ac\",\n                    [\"6\", \"4-5\"],\n                    \"#00933c\",\n                    [\"7\"],\n                    \"#b933ad\",\n                    [\"J-Z\"],\n                    \"#996333\",\n                    [\"S\"],\n                    \"#808183\",\n                    [\"T\"],\n                    \"#00add0\",\n                    \"#000000\"\n                ],\n                \"line-opacity\": [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"zoom\" ],\n                    9,\n                    0,\n                    10,\n                    1\n                ],\n                \"line-width\": [\n                    \"interpolate\",\n                    [\"linear\"],\n                    [\"zoom\"],\n                    9,\n                    1,\n                    13,\n                    2,\n                    22,\n                    7\n                ]\n            }\n        },\n        {\n            \"id\": \"subway-entrances\",\n            \"type\": \"symbol\",\n            \"slot\": \"top\",\n            \"source\": \"ny_subway\",\n            \"source-layer\": \"NY_subway\",\n            \"minzoom\":16,\n            \"filter\":[\n                \"all\",\n                [\n                    \"match\",\n                    [\"geometry-type\"],\n                    [\"Point\"],\n                    true,\n                    false\n                ]\n            ],\n            \"layout\": {\n                \"text-size\": 12,\n                \"icon-image\": \"new-york-subway\",\n                \"text-font\": [\n                    \"DIN Pro Medium\",\n                    \"Arial Unicode MS Regular\"\n                ],\n                \"text-justify\": [\n                    \"match\",\n                    [\n                        \"get\",\n                        \"stop_type\"\n                    ],\n                    \"entrance\",\n                    \"left\",\n                    \"center\"\n                ],\n                \"text-offset\": [\n                    \"match\",\n                    [\n                        \"get\",\n                        \"stop_type\"\n                    ],\n                    \"entrance\",\n                    [\n                        \"literal\",\n                        [\n                            1,\n                            0\n                        ]\n                    ],\n                    [\n                        \"literal\",\n                        [\n                            0,\n                            0.8\n                        ]\n                    ]\n                ],\n                \"text-anchor\": [\n                    \"match\",\n                    [\n                        \"get\",\n                        \"stop_type\"\n                    ],\n                    \"entrance\",\n                    \"left\",\n                    \"top\"\n                ],\n                \"text-field\": [\n                    \"to-string\",\n                    [\n                        \"get\",\n                        \"name\"\n                    ]\n                ],\n                \"text-letter-spacing\": 0.01,\n                \"text-max-width\": [\n                    \"match\",\n                    [\n                        \"get\",\n                        \"stop_type\"\n                    ],\n                    \"entrance\",\n                    15,\n                    9\n                ]\n            },\n            \"paint\": {\n                \"text-halo-color\": [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"measure-light\", \"brightness\" ],\n                    0.25,\n                    \"hsl(0, 0%, 0%)\",\n                    0.3,\n                    \"hsl(0, 0%, 100%)\"\n                ],\n                \"text-halo-blur\": 0.5,\n                \"text-halo-width\": 0.5,\n                \"text-color\":\n                [ \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"measure-light\", \"brightness\" ],\n                    0.25,\n                    \"hsl(225, 80%, 90%)\",\n                    0.3,\n                \"hsl(225, 60%, 58%)\" ]\n            }\n        },\n        {\n            \"id\": \"subway-lines-text\",\n            \"type\": \"symbol\",\n            \"slot\": \"middle\",\n            \"source\": \"ny_subway\",\n            \"source-layer\": \"NY_subway\",\n            \"minzoom\": 12,\n            \"layout\": {\n                \"text-field\": [\"to-string\", [\"get\", \"name\"]],\n                \"text-font\": [\"Montserrat Bold\", \"Arial Unicode MS Regular\"],\n                \"text-size\": [\n                    \"interpolate\",\n                    [\"linear\"],\n                    [\"zoom\"],\n                    12,\n                    8,\n                    22,\n                    12\n                ],\n                \"text-opacity\": [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"zoom\" ],\n                    11.5,\n                    0,\n                    12,\n                    1\n                ],\n                \"symbol-placement\": \"line\",\n                \"symbol-spacing\": [\n                    \"interpolate\",\n                    [\"linear\"],\n                    [\"zoom\"],\n                    0,\n                    50,\n                    16,\n                    200\n                ],\n                \"text-pitch-alignment\": \"viewport\"\n            },\n            \"paint\": {\n                \"text-halo-color\": [\n                    \"match\",\n                    [\"get\", \"name\"],\n                    [\"A\", \"C\", \"E\"],\n                    \"#0039a6\",\n                    [\"B\", \"D\", \"F\", \"M\"],\n                    \"#ff6319\",\n                    [\"N-Q-R-W\"],\n                    \"hsl(245, 65%, 55%)\",\n                    [\"N-R\", \"Q\", \"W\"],\n                    \"#fccc0a\",\n                    [\"1\", \"2-3\"],\n                    \"#EE352e\",\n                    [\"G\"],\n                    \"#6cbe45\",\n                    [\"L\"],\n                    \"#a7a9ac\",\n                    [\"6\", \"4-5\"],\n                    \"#00933c\",\n                    [\"7\"],\n                    \"#b933ad\",\n                    [\"J-Z\"],\n                    \"#996333\",\n                    [\"S\"],\n                    \"#808183\",\n                    [\"T\"],\n                    \"#00add0\",\n                    \"#000000\"\n                ],\n                \"text-halo-width\": 40,\n                \"text-color\": \"#ffffff\"\n            }\n        },\n        {\n            \"id\": \"NY-hotels\",\n            \"type\": \"circle\",\n            \"slot\": \"top\",\n            \"source\": \"hotels_data\",\n            \"source-layer\": \"NY_hotels\",\n            \"minzoom\": 9,\n            \"paint\": {\n                \"circle-emissive-strength\": 1,\n                \"circle-radius\": [\n                    \"interpolate\",\n                    [\"linear\"],\n                    [\"zoom\"],\n                    8,\n                    2,\n                    22,\n                    4\n                ],\n                \"circle-color\": \"hsl(220, 100%, 100%)\",\n                \"circle-stroke-color\":\n                [\n                    \"interpolate\",\n                    [ \"linear\" ],\n                    [ \"measure-light\", \"brightness\" ],\n                    0.25,\n                    \"hsl(0, 0%, 0%)\",\n                    0.3,\n                    \"hsl(220, 100%, 20%)\"\n                ],\n                \"circle-stroke-width\": 1\n            }\n        },\n        {\n            \"id\": \"NY-hotels-price\",\n            \"type\": \"symbol\",\n            \"slot\": \"top\",\n            \"source\": \"hotels_data\",\n            \"source-layer\": \"NY_hotels\",\n            \"minzoom\": 9,\n            \"layout\": {\n                \"text-field\": [\"to-string\", [\"concat\", \"$ \", [\"get\", \"price\"]]],\n                \"text-offset\": [0, -0.2],\n                \"text-size\": 14,\n                \"icon-image\": \"price_1.2\",\n                \"text-font\": [\"Open Sans ExtraBold\", \"Arial Unicode MS Regular\"]\n            },\n            \"paint\": {\n                \"text-color\": [\n                    \"case\",\n                    [\"to-boolean\", [\"feature-state\", \"active\"]],\n                    \"red\",\n                    \"hsl(220, 100%, 20%)\"\n                ]\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "compose-app/src/main/assets/navigation_route.json",
    "content": "{\"routes\":[{\"weight_typical\":22891.49,\"duration_typical\":23763.41,\"weight_name\":\"auto\",\"weight\":23587.498,\"duration\":24540.543,\"distance\":630864.75,\"legs\":[{\"via_waypoints\":[],\"admins\":[{\"iso_3166_1_alpha3\":\"USA\",\"iso_3166_1\":\"US\"}],\"annotation\":{\"maxspeed\":[{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"speed\":56,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"speed\":113,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":105,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":89,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":80,\"unit\":\"km/h\"},{\"speed\":32,\"unit\":\"km/h\"},{\"speed\":40,\"unit\":\"km/h\"},{\"speed\":40,\"unit\":\"km/h\"},{\"speed\":40,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"speed\":24,\"unit\":\"km/h\"},{\"speed\":24,\"unit\":\"km/h\"},{\"speed\":24,\"unit\":\"km/h\"},{\"speed\":24,\"unit\":\"km/h\"},{\"speed\":24,\"unit\":\"km/h\"},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true},{\"unknown\":true}],\"congestion_numeric\":[null,null,null,null,null,null,null,0,0,0,0,null,null,null,14,null,null,null,11,null,0,0,4,20,null,8,20,0,0,0,0,9,9,59,59,59,3,0,0,0,0,14,6,4,9,11,11,null,0,4,37,37,37,0,0,0,14,14,0,17,1,1,0,null,4,0,0,0,0,46,46,46,null,0,0,0,1,1,null,null,null,null,null,30,null,null,null,6,6,null,4,4,4,29,29,29,null,0,0,59,59,61,32,33,null,27,0,0,null,0,0,6,6,11,11,11,11,11,12,12,12,29,4,4,4,0,0,8,8,8,6,null,0,0,0,0,0,0,0,0,16,16,null,null,77,53,80,43,null,20,20,null,null,null,null,45,11,11,null,null,null,0,0,0,0,0,0,0,0,16,16,9,9,6,32,14,14,14,14,0,0,0,0,0,0,25,25,25,8,22,22,20,14,14,0,0,0,0,0,0,0,0,0,0,0,0,0,14,14,14,14,null,null,null,35,35,35,35,35,35,35,35,35,null,null,null,14,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,null,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,4,1,3,1,4,4,4,4,4,1,3,3,3,3,3,3,4,1,3,8,8,8,8,8,1,1,1,1,1,4,3,1,1,1,3,6,0,0,0,0,0,0,0,0,0,1,1,1,1,1,12,6,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,4,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,1,4,4,4,3,4,4,6,6,4,6,6,6,4,6,6,6,6,6,6,6,1,0,1,1,1,1,1,0,0,0,0,0,0,0,null,1,1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,25,25,25,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,3,3,1,1,4,4,4,4,4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,1,1,1,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,0,3,3,3,3,3,3,1,1,1,1,1,1,1,1,0,0,0,0,0,3,3,3,3,3,3,3,3,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,11,11,null,null,0,0,0,0,0,0,0,null,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,null,0,0,0,0,4,0,6,6,6,6,6,6,4,4,4,4,4,6,4,4,9,9,22,22,null,null,null,50,50,50,50,50,50,50,50,50,1,1,1,1,1,1,9,29,29,29,29,29,19,12,12,19,19,19,19,19,19,19,19,41,41,41,41,16,54,25,25,25,null,20,20,20,20,20,20,9,9,0,4,4,4,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,0,0,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,null,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,6,6,3,3,3,3,3,3,3,3,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1,1,4,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,null,null,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,null,null,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,4,4,4,11,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,3,3,3,4,4,4,4,8,8,8,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8,8,8,8,72,72,72,72,72,72,72,72,72,69,30,30,30,30,0,35,35,35,22,22,22,22,20,20,43,51,51,14,14,14,14,null,20,20,20,20,6,6,null,0,0,0,0,0,0,0,null,null,null,null,null,null,null,null,null,null,8,null,null,null,null,8,8,3,3,3,null,null,null,null,null,null,null,null,16,16],\"speed\":[2.5,6.1,7.2,4.4,4.4,9.7,8.9,6.1,6.1,6.1,6.1,8.1,8.1,6.7,7.2,15.6,8.1,7.5,8.1,8.1,5.3,8.1,8.6,8.1,9.2,8.3,6.1,5.3,5.3,5.3,6.4,7.2,7.2,4.4,4.4,4.4,7.5,8.9,8.9,9.4,9.4,10,12.2,12.8,12.2,7.8,7.8,5.8,6.4,8.1,7.2,7.2,7.2,9.4,9.4,8.1,9.2,9.2,13.3,10.3,12.2,12.2,12.8,8.9,8.3,6.9,6.9,6.9,7.8,5,5,5,6.9,6.1,6.1,6.1,8.1,8.1,7.8,7.8,8.1,7.5,6.4,5.6,6.4,5.8,5.8,6.9,6.9,7.5,5.6,5.6,5.6,7.2,7.2,7.2,8.6,5,5,3.3,3.3,3.9,6.7,6.9,5.8,4.7,5.6,5.6,5.8,5.6,5.6,6.9,6.9,4.2,4.2,4.2,4.2,4.2,6.9,6.9,6.9,7.8,10.6,10.6,10.6,6.7,6.7,8.3,8.3,8.3,10,10.3,9.4,10,7.8,7.8,7.8,7.8,8.3,8.3,8.3,8.3,9.7,8.6,2.2,4.4,1.7,4.4,15.6,2.8,2.8,6.4,6.4,5.8,5.8,4.4,6.1,6.1,6.1,6.1,6.1,9.4,9.4,9.4,9.4,9.4,10.6,11.1,11.1,8.3,8.3,9.7,9.7,10.6,7.8,6.4,6.4,6.4,6.4,6.7,6.7,6.7,11.1,11.1,11.1,8.3,8.3,8.3,11.1,8.9,8.9,8.1,7.2,7.2,7.2,7.2,10.6,10.6,7.2,7.2,7.2,7.2,7.8,7.8,7.2,7.2,7.2,4.7,4.7,4.7,4.7,5.8,5.8,5.8,7.8,7.8,7.8,7.8,7.8,7.8,7.8,7.8,7.8,21.7,21.7,21.7,21.4,22.2,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,24.4,24.4,24.4,24.4,25,25,25,25,25,25,25,25,25,25,25,24.4,24.4,24.4,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,25,25,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25,25,25,25,25,25,25,25.6,25.6,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,25,23.9,23.9,23.9,23.9,23.9,24.7,25.6,25.6,25.6,25.6,25.6,25.6,25,25.6,25,25,25,25,25,25.6,26.7,26.7,26.7,25.6,25.6,25.6,25.6,25.6,26.7,26.1,26.1,26.1,26.1,26.1,26.1,25.6,27.2,26.7,25,25,25,25,25,27.2,27.2,27.2,27.2,27.2,26.1,29.2,26.7,26.7,26.7,26.7,25.6,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,26.7,25.6,26.4,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,28.1,28.1,28.3,28.3,28.3,28.3,28.3,28.3,27.2,28.3,28.3,26.7,26.7,26.7,26.7,26.9,26.9,26.9,26.9,26.9,27.2,27.2,27.2,26.7,26.1,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25.8,25.6,26.1,26.1,26.1,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,25.6,25.6,25,25,25,25,25,25,28.9,27.8,27.8,27.8,27.8,27.8,28.3,28.3,28.3,28.3,27.8,27.8,27.8,27.5,26.9,26.9,26.9,26.9,26.7,26.7,26.9,28.9,28.9,28.9,26.9,28.3,28.3,28.3,26.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.2,28.9,28.9,28.9,28.3,28.9,28.9,28.9,28.9,28.9,28.9,25,25.8,25.8,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.1,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,25.6,25.6,25,25,25.6,24.4,24.4,24.4,25,25.6,25,25,25,25,25,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,25.8,25.6,25,25.8,25.8,25.8,25,25,25,25,25,25,25,25,25,25,25.6,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,28.3,28.3,27.8,27.8,27.8,27.8,27.8,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,20.3,20.3,20.3,22.2,22.2,22.2,22.2,22.2,22.2,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25.3,25.3,25.3,25.3,25,25,25,25,25,25,25,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,28.1,28.1,28.1,28.1,28.1,28.1,28.1,28.1,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,30.6,27.8,27.8,28.1,28.9,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.4,26.4,26.4,26.4,25.8,25.8,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.4,26.4,26.4,26.4,26.4,26.4,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,28.9,29.2,28.6,28.6,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,30.6,32.2,28.9,28.9,28.9,27.2,27.2,27.2,26.7,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,24.7,24.7,25.3,24.2,24.2,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,25,24.7,24.7,24.7,24.7,24.7,24.7,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.3,25.6,25.6,23.3,23.3,23.3,23.3,23.3,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,24.7,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,26.4,35,35,35,35,35,35,35,27.5,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.1,31.4,31.4,31.4,26.9,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.1,26.1,25.6,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.9,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,28.3,28.3,28.3,28.3,28.3,27.8,27.8,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,27.2,27.2,27.2,27.2,25.6,25.6,25.6,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,26.9,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.9,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.9,27.2,27.2,27.2,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.5,27.5,27.2,27.2,27.2,27.2,27.2,27.2,27.5,27.2,27.2,27.2,27.2,26.9,27.8,27.8,27.8,27.8,27.2,27.8,27.8,27.8,27.8,27.8,26.9,29.4,29.4,29.4,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,28.9,28.9,28.9,28.9,28.9,28.9,28.9,31.4,27.8,27.8,27.8,26.7,27.2,27.2,26.7,26.7,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,31.4,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.9,26.9,26.9,26.9,26.9,26.9,26.9,26.9,27.2,27.2,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.2,31.4,31.4,31.4,31.4,31.4,31.4,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,27.5,26.7,27.8,27.2,27.2,26.9,26.9,26.9,26.9,26.9,26.9,26.9,28.1,28.1,28.1,28.1,28.1,31.4,31.4,31.4,31.4,31.4,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,31.4,26.9,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.4,26.1,26.1,26.1,25.8,24.5,19.8,11.4,11.4,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,20.6,25,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.6,35.5,35,35,35,35,35,35,35,35,35,35,35,35,28.3,28.9,28.9,28.9,28.9,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,30,30,29.2,29.2,29.2,25.6,25.6,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,30.3,30.3,30.3,30.3,28.9,28.9,28.9,28.9,30.6,30,30,30,30,30,30,29.4,28.9,28.9,28.9,28.9,28.9,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.5,26.7,26.7,26.7,26.7,26.7,26.7,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.5,27.2,27.2,26.1,26.1,26.1,26.1,26.1,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25,25,25,26.1,26.1,26.1,26.1,26.4,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,19.7,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,22.8,22.8,22.5,22.8,23.3,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,23.6,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,23.1,23.1,23.1,23.1,23.1,22.5,22.5,22.5,22.5,22.5,22.5,22.3,22.2,22.2,22.2,22.2,22.2,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,24.7,20.8,20.8,20.8,20.8,21.4,21.4,22.8,22.8,22.8,22.8,22.5,22.5,22.5,22.8,22.8,22.8,22.8,22.8,22.8,21.9,21.9,20.8,20,19.2,20.6,20.6,18.3,18.3,17.5,17.5,22.8,22.8,22.8,22.8,22.8,23.9,23.9,23.4,23.1,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,23.3,21.4,21.4,21.4,20,21.7,21.7,21.7,21.7,20.3,20.8,12.8,12.8,12.8,12.8,12.8,12.8,12.5,12.5,12.5,12.5,12.5,16.1,17.5,17.6,17.2,17.2,15,15,17.5,17.5,16.4,6.1,6.1,6.1,6.1,6.1,6.1,6.1,6.1,6.1,13.6,13.6,13.6,13.6,13.6,13.6,15.6,12.8,12.8,12.8,12.8,12.8,14.4,16.1,16.1,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,12.2,12.2,12.2,12.2,16.7,9.4,13.3,13.3,13.3,9.2,12.8,12.8,12.8,12.8,12.8,12.8,3.9,3.9,8.9,10,10,10,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,13.3,27.5,27.8,27.8,28.1,26.7,26.7,23.9,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,26.1,26.1,26.1,25.6,26.1,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,30,31.1,31.1,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,31.1,31.1,31.1,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30.6,30,32.5,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,29.4,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,29.4,29.5,29.5,29.4,29.4,29.4,29.4,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.4,29.4,29.4,29.4,29.4,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.7,29.4,29.4,29.4,29.1,29.2,30,29.2,29.2,29.2,29.2,30,30,29.7,29.7,30,30,30.3,30.3,30.3,30.3,30.3,30.3,30.3,30.3,29.4,29.4,29.4,29.4,29.4,29.4,29.4,32.2,32.2,32.2,32.2,32.2,32.2,31.1,31.1,31.1,31.1,31.1,29.2,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,26.7,26.7,26.7,25.6,25.6,25.6,24.4,24.4,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,25,25,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.2,27.2,27.2,27.2,27.2,26.7,26.7,26.7,25.8,25.8,25.6,27.8,27.8,27.8,27.8,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.9,26.9,24.2,24.2,24.2,24.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,28.3,28.3,28.3,28.3,28.3,28.3,27.2,27.2,27.2,27.8,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.7,27.8,27.8,27.8,27.8,27.8,27.8,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,30.6,30.6,30.6,30.6,30.6,33.9,33.9,33.9,35,34.4,34.4,34.4,34.4,34.4,34.4,34.4,34.4,34.4,32.8,32.8,32.8,32.8,32.8,32.8,32.8,32.8,32.8,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,25.6,24.7,24.7,24.7,24.7,24.7,24.7,24.4,24.4,24.4,24.4,24.4,24.4,24.4,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,22.8,25,25,25,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,28.1,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,27.8,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,28.6,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.5,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,28.9,28.9,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,29.5,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.7,31.7,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,32.2,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.1,31.7,31.7,31.4,31.1,31.1,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,31.7,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,27.8,28.6,28.6,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.6,28.6,27.8,27.8,27.8,27.8,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.4,28.4,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.6,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.3,28.3,28.3,28.3,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,28.9,30,29.2,29.2,29.2,29.2,29.2,29.2,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.9,28.9,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,27.8,27.8,27.8,27.8,27.8,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,29.2,29.2,29.2,29.2,29.2,29.2,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,28.3,27.8,28.3,23.3,23.3,26.1,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,24.5,24.5,24.5,24.5,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,26.1,26.1,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,27.2,25.6,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,25,25.6,25.6,25.6,25.6,25.6,25.6,25,25,25,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,23.9,25,26.1,26.1,26.1,26.1,26.1,26.1,26.1,27.2,27.2,27.2,27.2,27.2,27.2,26.7,26.1,26.4,25.9,25.8,25.3,22.8,22.8,22.8,26.4,26.4,26.4,26.4,26.4,26.4,26.4,26.4,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,26.7,26.7,26.7,26.7,26.7,26.7,26.7,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,26.7,26.7,26.7,26.7,26.7,25,25,25,25,26.4,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,26.1,24.5,25.6,26.1,26.1,26.1,26.1,26.1,26.1,26.7,26.7,26.7,26.7,26.7,26.7,25.3,25,25,25.3,25.3,25.3,25.3,25.3,25.3,25.3,25.3,25.3,25.3,26.4,26.4,26.4,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.3,25.3,25.3,22.8,22.8,22.8,23.9,23.6,23.6,23.6,23.6,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,24.4,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,25.6,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,19.4,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.9,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,18.3,20,20,20,20,20,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.8,2.2,3.3,3.3,3.3,3.3,8.9,6.1,6.1,6.1,7.2,7.2,7.2,7.2,3.9,3.9,6.1,5.6,5.6,6.1,6.1,6.1,6.1,6.4,8.3,8.3,8.3,8.3,6.7,6.7,5.3,5.6,6.9,6.9,6.7,6.7,6.7,6.7,5.6,5.3,5.3,5.3,5.3,5.3,5.3,5.3,5.3,5.3,5.8,6.1,6.1,7.8,7.8,5.8,5.8,6.1,6.1,6.1,6.1,6.1,5.3,5.3,7.2,7.2,5.8,5.8,5.3,5.3],\"distance\":[49.3,99.6,67.1,35.3,11.8,21.3,17.7,6.9,13.2,40.8,13.9,13.8,10.4,16,7,2.8,10.2,22.5,9.7,10.8,79.7,18.3,57.7,15.4,9,40.2,37.8,21.3,12.6,16.7,113.1,43.2,33,47.9,13.5,40.1,53.6,2.7,50.3,47,7.7,51.5,61.7,64.7,65.1,127.5,19.6,4.5,20,40.7,4.8,55.2,162.2,29.9,43.6,44.2,3.7,36.4,50.3,22.2,28.5,19,56.2,47,39.7,13.7,21.5,8.9,13.4,12.1,25.3,60.9,34,33.2,2.7,12.9,17,26.7,6.9,20,9.4,33.1,4.9,49.2,14.5,9.5,32.1,36.2,11.6,2,76.8,20.8,7.6,8.8,27.5,35.2,25.6,63.5,44.5,39.9,7.8,51.5,3.3,31.7,18.6,18.9,8.2,1.2,18.7,14.6,9.5,12.1,26.9,14.2,15.8,68,76.4,12.8,14.1,38.4,5.1,32.7,9.4,18,11.5,60.9,13.7,15.8,36.4,10.5,50.1,11.6,5.2,4.3,26.7,13.2,19.3,7.5,9.1,20.3,14.6,5.2,15.9,9.8,22.8,28.5,17.6,24.8,1.7,32.6,10,10.9,31.6,1.9,9.4,52.7,13.4,6.2,19,33,12.6,12.6,14.6,36.6,5.6,11.6,39.2,20.1,8.1,7.6,13.4,20.9,4.1,19.6,50.3,4.6,79,2.6,24.8,22.4,4.5,11.1,12.2,4.7,25.9,56.6,17.5,77.8,50.2,4.8,21.2,36.2,29.9,8.9,40.1,10.8,13.6,38.2,41.7,17.7,34.6,7.5,32.6,12.9,50.1,7,47.6,9.2,22.2,17.1,120.4,10.2,20.8,20.1,13.3,57.4,17.3,21,13.6,15.1,16.8,12.8,14.4,15.7,15.8,58,47.8,48.8,126.5,29.2,29.9,30.6,28.4,30.7,14.2,48.6,31.3,31.7,128.5,66.4,137.7,1.3,44.7,44.2,27.8,29.4,28.6,28.6,27.6,28.5,29.2,30.9,29.2,27.5,30.1,28.5,28.1,28.4,248.9,29.1,28.3,29.3,28.3,28.5,29.5,30.3,27.4,28.7,28.8,27.7,29.6,302.6,29.3,26.7,30.8,28.7,30.6,28.7,30,29.3,28.4,26.6,27,28.9,28.9,29.1,28,29.5,395.5,31.1,29,28.7,28.3,28.3,29.3,28.7,29.2,27.2,28.4,28.7,28.5,54.7,30.6,28.6,28.1,28.7,29.5,28.2,28.7,27.7,24.4,32.5,36.7,29.1,28.4,28.7,29.9,28.7,28.4,23.5,23,21.9,21.8,22.2,21.4,30.3,223.9,13.7,245.7,43.2,68.1,48.1,76.8,28,28.1,29.2,28.9,29.4,27.6,29,29.5,25.9,28.1,27.8,29.4,26.7,28.8,29,27.6,27.2,284.9,29.6,28.1,27.1,118.2,28.9,30.5,28.3,29.9,28.6,29.2,30.4,29.2,28.9,29.7,29,29.7,29.3,29.9,30.2,28.9,28.6,29.1,29.8,29.5,29.5,29.3,357.1,29.6,28.5,26.9,27.3,29.1,55.6,27.6,60.6,28.4,28.8,29.6,29.9,30.2,32.9,142.4,34.3,56.1,28.4,143.8,32.8,109.5,30,30.1,29.8,30,29.9,28.1,29.8,29.6,29.8,27.7,22.7,43.1,23.6,23.5,34.5,44,85.8,68.9,104.4,149.8,55.4,48,59.2,56.5,73.8,194,39.1,36.1,103.6,27.7,29,29.4,29,27.1,25.5,27.9,29.8,26.5,27.6,28.7,30.1,28.4,28.2,217.9,29.6,42.1,58.4,34.6,25,30.9,30.3,33.6,27.9,27.8,16.8,28.8,29.7,27.5,53.6,50.1,109.3,98.5,29.1,35.5,37.9,45.3,27,97.5,33,70.7,416.2,107.9,65.5,55.1,85.5,28.1,128.1,39.1,124.8,125,41.8,40.6,141.9,289.6,52.1,260.8,88.2,15.5,25.2,45.2,21.6,6.1,68.7,37.2,53,40.8,38,135.9,67.6,44.8,81.4,193.4,61.5,39.9,68.3,54.7,127.1,55.7,41.9,44.2,261.5,56.9,59.6,34.8,55.4,38.7,84.8,49.8,293.9,41.5,42.3,41.7,42.3,42,40.7,41,37.5,51.3,36.9,40.9,237.5,451.1,46.1,157,108.5,41.8,250.1,41.9,40.7,39.9,42.8,41.3,53.8,64.4,131.6,160.2,56.1,83.8,53.6,68.5,52,967.4,44.7,306.5,323.3,48.8,233.2,68.9,35.6,33.9,38.2,37.8,61.4,47.5,59.1,60.4,39.9,70,152.9,39.3,33.4,40,60.1,32.3,58.1,39.9,35.7,30.2,43.4,31.8,40,38.4,436.3,170.2,67,45.1,443.3,263.6,125.5,51.4,86.1,230,336.4,183.5,46.8,329.9,276.2,226.4,50.9,400.8,107.1,63.4,46.3,37.6,37.7,49.5,94.7,47.3,180,53.6,93.5,98.2,48,74.5,45.6,65.7,191,92.1,29.7,30.7,47.6,38.2,44.8,123.6,93.2,55.4,47.9,64.7,88.5,84.6,177.3,48.3,144.6,84.9,58.9,63.6,46.7,329.6,102.1,94.3,47.5,53.3,40.1,62,379.2,85.2,73.6,48.8,109.7,269.6,90,745.1,478,39.8,84.9,283.5,42,425.2,178.2,2.3,120.6,120.1,323.7,239.6,96.6,114.5,59.6,32.5,60.6,85.2,77.8,91,66.8,48.5,84.8,33.1,40.8,33.4,206.7,216.4,255.6,57.9,46.4,42,52.2,94.3,77.3,15.6,54.1,49.9,69.8,140.6,345.3,57.5,32.4,31.4,30.1,32.3,27.4,31.4,32.3,60.2,31,29.8,26.2,30.4,32.2,29.1,218.5,30.1,36.8,33.5,30.7,30,32.8,126.2,400.9,39.2,44.4,37.6,39.9,41.9,40.3,41.2,37.1,35.3,245.2,32.3,36,34.8,33.9,40.1,40.8,51.2,41.4,40.1,48.4,48.8,84.7,89.5,89.3,83,69.4,57.3,53.2,54.1,53.1,55.6,55,91.5,552.5,230.3,212,54.8,51.4,64.3,61.5,49.1,599.8,69,88,68.4,59.2,30.5,22.8,136.3,131.1,62.4,148.6,81.3,57.5,59.4,502.3,699.8,676.2,32.7,399.5,198.7,70.1,188.5,127.7,215.5,539.1,216.2,208.9,87,68.5,94.7,400.8,360,220,198.2,46.4,43,44.2,44.6,148.4,48.7,51.9,49.3,52.1,52.7,342,444.6,95,149.9,178.5,50.3,174.1,48.4,40,30.1,30,27.2,29.2,28.2,32,32.7,32.1,33.8,47.1,301,690.6,95.8,48.5,46.7,44.8,44.9,46.4,47.5,120.6,740.4,84.4,72.7,45.9,43.3,41,40,43.4,42.2,41,28.3,5.7,55.7,40.4,423.3,39,41.7,37.7,38.6,46.2,40.5,41.1,44.4,47.4,42.6,42.4,41.1,43.9,43.9,47.2,38.6,44,45,44.3,263.2,45,45.1,43.8,43.8,45.4,45.2,45.2,44.7,44.9,44.7,46.1,103,43.9,44,44.4,38.3,43.8,43.9,42.7,43.9,44.5,44.9,40.4,927.1,66.5,67.7,67.8,63.5,67.8,65.1,65.5,58.7,65.6,65.3,65.3,64.5,60.3,60.2,58.8,58.2,91.2,259.1,359,72.6,432.8,58.1,183.2,53.3,51.1,56,56.7,81.9,50.1,49.3,50.2,45.6,41.5,54,30.2,54.6,52.2,173.9,55.5,50.9,48.2,55.9,291.6,328.8,87.7,568,49.5,50.5,49.5,50.1,49,58.6,96.5,64.6,46.4,50.4,180.4,54,52,53.1,49,49.1,1312.4,49.9,49.2,41.2,8.5,51.2,48.8,48.7,61.6,61,44.3,39.2,44,102.4,46.8,48.1,50.6,46.6,51.1,45,40.3,38.9,42,326.7,59.9,59.4,218.1,46.6,48.6,43.3,43.7,209.9,56.1,52.3,52.9,55.3,55.3,49.7,159.1,50.3,48.2,49.5,49.9,50.9,57.9,47,42.4,44,46.4,47.3,276.2,45.1,45,40.3,46.4,38.3,42.5,40.9,143.1,53,59.2,52.9,25,44.7,44.3,103.6,150.2,93,72,62.7,59.3,73,73.3,61.6,49.2,130.9,161.1,91.1,67,53.1,50.2,46.4,97.3,77.9,77.3,84,83.1,449.2,53.1,51.2,73.2,69.9,98.5,81.3,75.3,128.5,127.4,59.3,60.7,60.9,73.1,485.2,46.7,49.6,116.1,58.2,56.6,72.6,73.7,17.3,69.2,90.9,48.9,32.2,129.7,99.4,46.6,770.1,22,73.8,83.8,116.7,302.3,88.4,82.2,56.3,55.6,280.1,59.6,86.9,99.9,85.3,83.5,66.2,66.8,619.5,226.6,226.4,55.6,38.3,52.8,48.2,42.2,46,70.2,62.9,104.3,103.2,64,80.6,46.5,54.2,51.4,57,43.9,47.5,51.9,51.1,101.1,48.4,47.4,72.6,57.9,44.4,44.2,55.1,60.5,54.6,65.8,76.3,27.2,28,80.7,140.9,95.5,73.3,61,59.3,75.3,59,57.5,63,40.2,530.3,37.8,36.7,52.1,55.1,51.9,53.2,62.3,68.1,36,36.1,64.2,54.1,901.4,55.7,86.6,65.6,77.7,71.7,230.3,11,39,60.5,84.4,83.9,85.5,99.7,108.8,107.1,96.8,73,123.7,93,50.3,48.3,24,65.9,92.1,65.3,48.8,74.6,104.9,76.3,77.6,84.8,37.5,53.9,50.4,49.6,50,55,47.1,58.5,48.9,49.9,49.7,45.4,45.4,42.9,70.6,54.4,49.3,45.8,45.8,42.3,38.3,62.4,63.2,58.3,68.6,55.6,59,55.2,66.6,62.1,57.6,101.1,58.7,64.5,64.3,47.6,937,45.5,44.1,44.1,44.9,46,918,48.4,50.5,51,53.7,268.3,49.6,49.6,49.5,48.4,48.2,137.3,175.4,201.1,59,385.6,45.6,50.5,47.9,45.9,48.9,46.4,44.1,1021.1,75.7,71.7,67.2,66.2,70.3,69.8,80.8,71.1,73.2,1786,6,74.2,71.1,85.7,102.6,29.9,69.7,68.7,573.7,152.6,79.4,45.7,45.7,44.4,40.6,39.7,61,59.5,62.3,62.2,61.2,56.1,67.5,311.3,50,80.2,56.2,70.2,66.8,61,64,64.6,61.3,128.4,65.7,66.9,67.5,66.3,69.4,67,65.3,76.4,74,69.8,66.6,73,70.9,1266.7,593.2,89.9,76.5,11.5,88.5,77.5,461.2,53.8,52.6,53.7,52,50.5,53.6,53.5,50.5,52.5,49.9,51.3,55.5,48.9,347.8,337.7,506.4,64,224.5,337.3,748.8,49.1,50.6,45.8,43.9,51.1,48.9,44,46.6,47.1,48.7,47.6,49.2,448.4,792,56.2,48.7,49,46.1,43.7,44.8,44.1,48.2,48.4,48.2,46.8,44.9,47.6,45.6,43.2,47.8,51.9,53.2,54.1,49.9,51.7,58.1,57.3,54.4,59.6,31.1,370.3,103.5,454.8,50.4,304.8,233.8,187.1,229.4,493.2,50.5,41,41.2,39.7,36.6,38.5,39.5,41.5,44,42.4,44.7,46.1,44.3,45.7,47,45.8,46.8,34.8,37.5,90.6,482.5,368.5,102,183.6,275.3,1042.9,97.5,96.4,97.9,87.5,77,86.9,1117.2,73,194.7,94.3,46.2,117.9,85.9,77.7,237.6,81,63.5,62.4,63.5,68.3,70.7,290.1,61.6,49.7,103.6,58.1,41.6,6,77.9,163.1,189.7,196.4,124.7,82.9,105.2,42.6,40.1,40.2,47.5,165.8,50.5,169.1,147.3,260.9,49.5,36,40.3,41,43.4,36.1,44.5,43.6,49.6,46.8,38.9,58.4,48.2,43.6,41.7,143,500.7,44.9,68.7,70.6,53,281.8,115.6,37.3,32.2,110.3,77.9,161.9,52.6,12,71.3,84.3,75.4,92.8,93.9,66.8,73,148.6,174.8,60,53,53.6,55.3,59.2,52.6,51.8,50.8,54.9,54.7,59,51.9,53.5,799.7,193.1,128.6,79,53.5,29.3,29.1,31.1,31.2,29.2,28.9,29.5,30,27.8,30.6,29.3,344.8,882.6,240.7,378.9,648.4,759.4,93.5,686,545,378.3,514.4,175.5,578.2,302.5,203.8,405.7,137,144.9,96,61.8,34.4,64,64.4,63.3,122.1,61.2,91.2,61.8,61.3,60.9,61.1,61.4,61.5,61.4,61.4,61.4,222.8,423.5,734.4,499.8,245.9,4.9,124.9,123.9,150.2,147.7,292.5,941.2,863.3,492.5,409.3,905.3,881.6,1171,20.2,45.1,730.6,959.6,496.5,855.9,164.6,1177.5,929.2,1341.7,936.5,930.5,1029.8,848.1,1099.1,615,1145.9,1250.7,3.5,900.5,101.5,492.4,771.5,604.1,632,1203.1,122.2,604.6,213.2,445.1,779,553.5,27.6,590.9,572.3,726.2,554.3,648,92.7,519.2,618.5,758.8,668.9,606.8,20.6,429.8,357.8,635.3,594.5,624.2,750.4,411.7,731.9,311.8,357.9,127.3,1059.1,954.7,949.7,6.7,1145.5,865.1,1218.7,847,1168,1096.4,630.2,985.2,979.6,11.3,1079.8,964.3,596.8,543.9,782.6,248.7,106.9,162,133.7,100.4,425.8,522.4,1310.1,825.4,52.2,3233.4,343.3,190.8,824.1,798,961.6,4742.3,1217.7,119.7,96,163.4,519.9,404.6,184.5,717.8,599,1421.7,1034.4,437.4,2322.8,1694.8,1739.6,274.1,1905.6,1072.9,713.9,235.5,678.3,150.5,133.4,541.6,204.3,615.3,195.8,1935,3090.3,1779.5,3968.4,49.9,739.8,1446.1,1078.8,889.5,533.7,3020.7,2378.2,1268.3,5536.3,474,389.9,293.6,292.8,289.7,710.5,106,562.5,513.5,635.6,221.1,315.6,570.2,202.3,403.3,177.3,186.8,295.5,547.3,261,50.5,324,93.4,132.8,134.8,152.6,523.9,69.4,72.1,188.3,138.6,120.5,63.1,127.1,122.2,127.5,190.2,235.1,5.4,435.1,230.9,237.2,216.9,399.2,352.5,755.2,506.1,592.5,156.1,76.1,71.9,76.1,110.5,95,96.7,37.8,52.3,53.9,403.4,850.4,600.7,1798.8,83.1,182.3,346.2,280,434,310.8,589,175.3,257.6,99.1,200.8,177.8,239.7,221,183.5,294.5,358.8,203.8,362.9,219.3,311.5,173,234.2,233.7,185,457.6,132.6,351.5,494.2,884.5,485.6,353.8,160.2,453.9,290.9,173.9,189.2,53.5,186.1,485.9,520.3,583.7,556.4,530.3,549.4,688.6,444.1,745.4,399.5,597.9,450.2,449.1,490.6,383.4,90.8,372.3,80.2,76.8,81.8,45.5,59.5,65.3,96.9,402.1,451,55.8,760.8,197.2,47.1,950.9,1091.7,394.7,3070.8,497.3,495,3563.9,81.3,1277,78.8,144.1,123.1,137.1,174,52.8,1748.8,887.3,913.5,905.3,1712.3,60.1,1028,6.6,1348.5,149.4,480.7,266.4,2006.1,254.5,1296.3,650,554.4,83.3,89.3,265,74.1,130,87.1,551.8,337.6,733.4,346.8,17,692,860.6,950.9,945.9,707.3,789.5,48.1,1241.2,1163.2,390.3,845.4,1185.3,997.1,495.6,54.3,1377.5,1027,269.6,60.5,1013.2,1003.5,223.9,379.6,449.2,701.4,601,14.4,600.1,545.8,19.9,630.7,686.5,445.4,187.7,639,61.5,72.9,276.2,321.7,1258.9,310.6,154.6,137.6,84.3,30.3,52.4,1218.5,1006.4,644.8,280.6,283.4,780,350.2,207.7,459.4,100,354.5,94.7,307.6,501.7,354.1,295,385.8,338.8,2812.4,412.1,362.5,3983.6,40.3,6.8,920.9,194.4,123.8,0.6,399.3,42.4,64.7,770.3,843.2,465.2,289.1,187,184.8,210.4,511.6,847.2,901.8,840,302.3,89.4,967.4,210.2,168.5,345.2,1253.5,1049.2,80.5,97.7,447.6,60.7,385.5,601.7,681.4,195.5,522,1031.1,825,4580.3,28.8,611.7,1580.7,729.4,3135.3,54.4,5299.2,676.9,410.7,115.3,225.2,144.4,151.6,839.1,990.6,631.9,3.1,336.3,192.7,255.5,132.2,148.4,244.9,164.4,31.3,515.2,317.4,319,345.6,354.3,363.1,219.3,103,192.8,184.7,232.2,313.4,485.8,131.3,466.7,367.3,224.9,313.9,191.4,107.9,136.6,310.8,326.8,347.3,333,323.7,355.3,367.6,323.4,374.7,351.9,233.3,2.6,138.5,47.1,222.9,64.3,186.6,418.5,48.2,247.2,122.2,318.3,136.3,58.1,51.5,69.9,22.7,86.7,59.2,273.7,246.8,130.4,146,315.2,177.7,182.8,397.5,254.8,342.2,217.1,51.8,45.6,86.6,191.4,172.9,309.9,112.4,26.5,276.2,98,137.8,236.1,320,146.7,86.1,63.3,155.7,219.1,144.3,314.2,33.9,211.2,268.9,120.5,1.6,390.3,86.4,166.7,58.6,2.9,240.2,64.2,304,75,41.5,222.5,162.1,183.6,205.7,45.8,141.7,148,58.8,184.4,392.5,182.5,252.9,342.8,37.7,388.1,226.3,253.1,401.8,28.3,13.2,19.7,40.7,15.3,12.1,11.5,10.7,9.7,9.5,7.7,9.8,11.2,9.1,9.4,8,9.5,9.5,9.5,9.4,10,8.6,9.6,10.9,11.3,14.2,51.8,44.1,332.9,832.9,1151.5,197.9,314.5,848.8,391.6,48.1,187.2,126.8,167.2,307.8,127,157.2,603.1,397.6,62.4,25.4,30.4,103.4,150.8,560.7,93.8,69.6,16.5,12.5,42.1,78.8,41,74.2,49.8,138,83.6,107.8,78.3,91.4,95.6,124.7,36.9,111,158.4,92.5,124.8,75.6,129,199.4,140.8,44.3,201.4,30.5,19.4,184.9,200.5,215.6,198.2,64.2,83.6,42.7,477.9,117.6,165.6,65.9,128.9,169.3,48.9,15.9,16.6,29.1,12.6,37.6,12,37.3,383.7,32,60.4,79.2,89.1,33.8,26.6,31.2,57.4,55.8,184.4,90,77.8,117.4,24,25.6,18.3,22.7,37.9,51.2,188.3,4.2,34.1,27.5,178.9,21.6,56.4,23.5,24.2,22.8,33.4,198.2,112,143.9,141,14.9,57.4,67.7,181,190.2,100.3,41.5,20.7,30,18.3,39.6,21.2,28.7,18.5,47.4,168.4,34.1,58.9,83.8,61.8,55.5,35.2,20.7,30.4,20.9,34.1,22.4,23.2,19.9,25.5,21.2,27.3,27.7,16.2,31.4,133.8,344.2,455.3,386.7,176.2,203.6,196.2,34.5,24.7,17.1,34,34.6,23.4,14.3,34,84.2,237.1,32.1,507.8,53.5,14.1,28.9,45.9,33.1,35.7,33.2,41.2,41.1,46.6,48.4,33.4,30.7,31.1,25.5,27.4,23.6,26.1,16,44.5,63.5,31.4,19.5,15.8,30.5,221.8,34.6,45.3,149.2,26.2,28.2,32.4,16.5,20.3,28.9,23.2,33.2,30.9,51.3,48.3,31.8,330.8,79.9,102.3,24.8,47.6,25.5,19.1,23,22.2,24.9,51.3,245.3,86.9,88.6,19.5,18.5,22.3,17.7,19.1,20.8,15.6,41.2,15.8,28.5,23.8,24.9,27.6,50.7,18.7,58.3,124,124.2,130.6,101.9,154.5,46.3,55.1,36,49.8,26.4,23.9,24.4,30.5,37.3,16.3,99.8,91.9,118,56.3,33.9,27.8,17.2,40.1,23.5,33.2,25.5,17.9,23.3,45.9,26.2,23.8,38.8,33,19.8,40.4,22.8,18.9,29,83.2,142,165,27.2,90.4,86.4,52.7,46.5,53.6,30.4,61.5,66,21.6,181.5,192,62.4,276.9,127.5,94.2,80.9,57.9,120.3,189.5,1167.2,230.2,535.9,83.1,45.7,44.5,232.8,73,72.3,50.8,59.2,91,143,86.4,77.6,64,352.5,80.5,43.2,41.4,39.2,40.3,36.5,33.5,63.5,60.3,291.7,32.9,39.2,46.4,30.5,39.4,136.6,33,21.4,36.5,33.4,62.6,65.1,99.4,79.5,69,67.5,64.4,193.5,231,45.4,65,62.4,63.6,47.8,16.8,50.5,53.8,130.9,98.2,34.4,70.4,48.8,64.8,39.3,330.7,61.4,55.2,85,39.3,48.6,45.9,47.1,36.4,41.3,40.2,37,231.3,77.8,55.4,390.4,213.1,139.6,184.4,32.3,59.1,90.8,189.7,130.2,240.8,82.6,114.4,75.3,118.9,26,52.1,69.7,69.1,231.9,122.9,78.2,39.5,74.1,105,128.6,64.8,73,80.2,51.7,291.6,2.1,173.5,193.2,50.9,308.4,62.5,251.6,62.1,80.6,82.1,46.7,58.9,75.8,56.8,185.3,76,89,122.7,116.2,362.8,58.2,208.3,141.9,97.8,69.8,256,164.9,64.1,89.7,73.8,97.8,116.9,115.1,102.3,55.9,488.3,46.7,45.5,41.2,178.5,44.6,43.5,42.9,44.6,41.7,462.8,261.7,43.8,40.4,39.7,38.5,41.4,40.2,41.6,41.9,46.7,45,44.3,44.1,45.1,44.7,44.8,55.1,50,147.8,49.7,50.6,53.7,174.8,22,76,47.2,46,38.9,40.6,40.1,39.8,42.9,123,130.3,206.7,103,109.7,23.8,92.6,21.7,22.9,21.3,21.9,21.3,21.5,24.6,34.6,16.7,16.6,17.4,17.1,195.4,48,85.6,69.3,196.5,43.6,39.5,39.9,38.9,115.7,97.7,79.9,47.1,45.2,43.9,99.4,58.6,55.8,52.4,36.9,27.8,51,47.4,42.3,41.4,43.5,44.6,46.5,41.3,49.3,45.7,47.3,38.4,47.1,38.9,50,43.8,69.7,441.9,184.4,65.6,37.3,39.5,30.6,37.9,47.1,59.4,112.5,72.5,40.2,115.1,80.1,10.6,14.1,33.1,122.5,97.2,7,44.2,134.5,50.5,6.2,47.8,30.9,33.6,26.6,26,21.4,24.7,21.1,35.9,190.9,42.6,44.7,47.8,28.4,21.6,24.3,24.4,30.7,30.5,28,26.3,29.9,28.8,29.3,35.1,27,27.7,24,34.1,27.9,30.9,31.6,40.1,39,43.2,79.4,32.7,35.4,36.3,97.1,25.1,25.3,21.5,29.2,188.7,31.4,7.5,26.5,37.4,18.9,16.1,27.5,5.7,32.5,36.5,42.9,94.7,62.9,6.3,37.3,22.7,23.2,28.4,59.6,164.7,69.3,52.4,328.1,56.3,35.4,30.7,27.5,26.3,25.6,24.6,26,22.2,23.8,23.3,27.1,23.2,26.3,143.1,31.4,28.7,26.8,22.8,24.1,24.5,45.8,85,30.5,27.5,26.1,22.6,24.9,24.7,29.4,31.8,19.6,93.2,181,106.9,40.7,30.1,37.3,88.1,36.7,27.2,3.3,32.8,28,30.8,30.9,29.5,26.8,34.3,103.9,58,43.5,46,3.3,38.2,191.9,268,234.8,20.5,43.8,31.6,104.4,13.8,167.2,60.7,47.5,46,54.7,5.1,60.1,69,262.6,102.2,136.7,198.8,6.5,25.5,30,14.4,18.1,8.1,31.2,31.9,134.3,379,32.1,246.8,9.9,25.9,17.6,238.3,5.1,47.8,2.5,78.1,41.3,33.6,35.7,160.3,69.4,19.2,208.7,87.3,34.9,57.3,16.3,41.5,59.1,33.3,174.8,87.7,67.8,371,45.9,27,25.3,15.8,28.5,32.8,66,101.6,14.5,112.7,6.3,18.2,202.5,250.2,314.8,21.5,10.8,41.2,23.9,42.2,34.6,27.1,30.9,27.6,18.3,26.8,23.8,26,24,26.7,29.1,27.3,11.8,21.7,25.8,68.2,30.9,37.2,33.6,70.1,141.8,110.5,62.8,116.1,20.1,24.3,10.4,48.3,64.9,28.2,23.9,63.8,51.9,47.9,65.6,170.1,67.2,54.9,257.2,19.5,36.3,34.1,44.3,43.8,44.8,107.8,145.8,44.6,17.9,12.7,27.4,21.5,21.8,22.3,22.7,21.5,20.4,23.9,22.3,56.8,35.1,61.6,13.5,11.8,13.4,14.7,15.4,19.4,19,11.2,14.4,12.4,18.5,18.4,37,38.4,36.4,33.3,35.6,211.9,225.4,86,801.7,666.9,60.7,71.3,513.5,577.8,600.6,55.5,58.9,59.6,58.5,56.9,60.7,56.9,57.9,58.4,59.7,174.7,720,566.3,195.9,871.6,91.8,41.1,450.5,85.3,57.7,59,58.6,59.1,60,57.5,59.8,63.4,660.2,814,772.2,81.5,550.4,47.3,42.8,46,43.8,45.8,46.6,43.6,46.9,44.6,42.3,45.3,47.2,43.1,46.9,43.5,43.3,408.7,1068.2,47.9,41.9,45.5,42,41,43.5,44.4,43.3,43.9,44.5,41.1,45,41.8,42.6,41.4,462.7,329.6,480.5,706.2,238,45.6,46.1,44.5,42.5,44.8,40.9,49,44.3,45.4,44.7,44.6,37.4,5.5,619.4,830.8,713.2,72.1,273.9,201.5,44.4,46.8,43.8,43.3,46.4,41.6,41.5,41.7,2.1,235.6,43.5,44.3,42.7,43.1,43.9,44.7,44.6,46.6,41.4,41.3,41.7,42.2,429.3,62.9,36.9,58.8,28.3,82.4,43.5,44,42.3,41.8,43.5,44.5,763.1,42.2,42.6,40.5,42.6,43.2,41.9,42.3,42.2,41.9,41,41.4,41.9,42.9,42.1,370.1,41.4,45.4,43.3,41.5,43.5,42.9,43.8,43.2,43.3,44.7,43.5,111.2,507.5,77.6,399.7,43.5,632.4,59.1,55,53.5,57.7,58.5,56.7,59.6,54.6,55.2,59,60.8,1068.3,259.5,46.9,45.5,43,44.6,39.1,45.5,41.5,45.9,42.4,43,163.9,264.2,313.2,52.3,47.6,45.9,43,42.9,46.4,44.3,1235.3,43.6,43.7,41.4,45.3,42.7,40.9,46.9,47.9,40.6,46.9,44.3,204.4,202.3,214.4,95.9,88.8,101,539.2,137.8,145.5,116.5,29.6,129.7,40.3,20.3,62.4,76.2,34.2,28.7,28.7,28.2,23.1,16.9,30.2,23.4,27.2,22.8,19.3,10,14.4,16.3,18,16.6,15.2,17.1,19.4,20,24.5,22.1,47.6,41,113.1,37,16.8,16.1,52.2,41.7,156.4,109.8,23.3,16.5,142.1,180.9,90.5,219.4,78.3,41.9,46.8,56.8,42.9,39.2,78.5,39.1,68.7,52.2,44.4,46.5,48.3,50.7,605.5,243.9,65.1,34.4,30.5,73.6,77,50.5,34.7,33.3,32.1,184.5,62,692.2,106.5,38.4,33.9,27.2,26.3,47.6,82.3,33,32.2,30.9,29,31.8,33.6,48.3,40.7,258.6,512.6,78,361.5,193.5,81.6,200.2,14.5,122.9,63.3,37.5,72.9,58.2,52.2,37.3,33,29.7,41.5,20.9,19.2,42,27.4,29.7,23.8,25.4,27.1,22.8,101.4,57,18.8,325.8,54.2,50.3,281.9,40.1,56.1,73.6,181,112.6,155.1,120.7,306.7,20.4,44.5,60.9,20.1,73.3,24.1,44.2,72.9,28.7,27.3,37,35.1,36.6,14.7,20.1,35.3,48.8,57.4,175.6,76,117.1,97.5,417.5,304.9,72.7,44.6,46.5,42.1,45.7,26.1,29.4,41.1,25.3,25.4,502.1,332.6,165.9,342.7,63.3,169.8,39.6,14.4,70.4,54.9,235.4,399.6,414.5,36.2,32.4,30.9,18.4,23.2,25.1,7.8,15.6,31.3,37,17.9,19.3,464.3,67.1,217.6,571.8,165.4,171.4,11.1,339.3,104.6,127.2,142.3,43.8,122.2,29.4,288,54.3,94.8,30.9,28.4,78.7,115.8,70.6,113.2,68.4,36.6,34.1,17.3,83.2,241.6,160.2,243.3,84.7,81.7,100.1,74.1,96.4,93.4,544.5,175.3,65.4,66,80,32.6,265.4,68.7,61.4,62.1,61.8,59.4,228,64.2,64.1,66,57.3,344.5,59.1,56.8,52.7,68.1,67.3,80.7,127.8,53,270.8,760.1,52.7,49.5,48,44.2,44.2,38.1,1072.5,308,93.4,64.9,58.1,60.2,60,50.9,1.5,657,927.5,44.8,44.9,45,43.8,43.4,45.9,43.9,41.5,467.7,265,102.3,33,52.6,49.9,55.6,42,14.1,15.9,56.5,59,16.2,3.8,121.1,23.5,27.5,27.8,26.4,48.8,53.6,13,39.8,38.2,67,140.7,16.6,29.3,26,35.8,29.4,35.6,18.4,90.1,42.9,18.3,15.3,16,15,14.3,11.8,13.1,13.4,13.2,14.2,12.5,12.7,13.4,16.3,19,18.2,17.2,15.7,18.3,16.9,19.4,19.4,18.7,18.3,19,16.8,19.8,20.2,155.9,14.8,12.1,12.4,12.8,7.8,8.5,6.7,8.1,14.7,14.8,14.6,12.6,12.3,22,23,20.2,27.8,174.7,34.7,20.5,45.2,45.6,47.3,51,45.4,45.7,48.5,25.1,26.4,25.8,11.3,38.5,40.3,288.8,45.9,44.5,42.8,47,42.3,46.5,44,46.5,45.3,44.3,43.2,42,44.2,43.8,45.2,46.4,241.4,48.1,45.2,44.1,39.8,418.2,42.2,43.6,60.2,25.7,84.6,48.2,43,41.1,38.7,43.4,241.5,42.8,43.3,43.2,42,43,42.5,500.8,42.3,42.4,40.7,42.5,43.3,28.6,29.1,28,29.7,30.3,126.2,85,43.1,21.3,21.2,42.5,36.6,40,22.2,21.3,51,43,42.6,42.5,42.6,42.4,42.9,44.3,43.2,128.5,40.9,42.4,43.3,42,42.8,41.8,42.6,42.5,42.4,42.4,42.4,42.7,42.1,42.7,42.9,42.1,43,100.3,145.9,47.7,34.5,31.7,35,35.2,42.9,42.8,43.4,42.5,43.5,42.8,32.1,97.3,42.8,42.8,42.9,42.2,43.3,43.1,122,44.8,44.4,42,45.3,46.5,45.6,325.3,26.9,110.5,48.3,49.7,51,49.6,49.4,50.9,48.5,51.1,48.5,50.3,48.8,203.1,26.5,202.5,97.9,51,51.8,49.5,41.8,47.3,312.2,34.5,32.7,30.4,30.1,31.8,30.1,30.3,29.3,26.7,29.5,30.4,29.4,27.1,24.8,30.4,30.4,29.7,31.9,226.7,34.4,30.6,30.2,30.1,30.6,31.4,33.1,33.2,32.3,25.2,19.2,21.8,37.5,40,33.6,41,36,40.8,42.8,40.8,32.2,80.4,10.8,158.8,68.7,31.4,41.9,39.8,43.1,40,38.7,35.8,28.7,29.4,31.3,31.5,129,36.1,35.7,33.3,33.5,35.7,33.6,35.8,32.8,36.9,49.4,46.1,138.5,36.3,33,35.5,36,38.3,48.8,47.3,53.1,49.4,49.3,44.6,45.7,45,47.4,629.6,110,117.3,360.5,346,49.4,46.2,47,47.3,47,47,45.3,42.5,44.1,43.9,46.5,106.4,128.4,363.8,91.8,254.3,355.8,42.3,44.2,46.4,45.2,41.1,39.1,39.9,36.2,39,82.4,84,45.8,45.7,43,39,39.2,36.4,39,35.4,38.4,38.6,38.3,39.2,42.1,38.6,299.9,51.1,47.3,42.8,41.8,40.6,40,43.1,41.8,41,38.3,249.1,77.7,324.1,49.4,43.9,48.1,262.3,36.7,38.4,38.7,36.1,188.1,224.3,61.9,56.2,58.9,57.3,476.8,70.9,377,117.5,108.7,0.7,89.4,300.6,41.9,41.8,42.6,43.1,42.3,44.1,43.1,40.9,42.6,42.6,41.8,42.4,41,40.4,41.7,40.4,40.1,41.5,39.7,298.6,77.6,33.1,34.8,42.8,43.9,44.3,44.4,43.4,43.4,43.5,44,37.1,36.1,27.7,26.7,39.8,35.5,43.7,43.5,44,43.9,43.3,410.7,67.5,55.4,59.6,300.5,771.5,36.1,35.9,36.5,35,36.1,35.2,37.5,36.9,35.9,40.3,40.9,31.1,36.2,32.2,37.2,20.2,20.4,24.1,25.3,29.8,31,29.1,32.2,33.7,157.4,60.3,24,29,28.7,33.6,28.8,28.9,17.2,16.8,32.6,29.8,30.3,29,28.8,31.6,29.4,26.9,29.9,26.4,29.6,32,22.8,27.2,29.3,29.6,30.1,30.3,28.3,31.9,28.4,205.1,48.4,96,43.6,27,28.2,27.9,24.7,29.8,28.6,27.3,26.7,29.3,28.8,28.1,26.8,28.8,27.5,27.1,27.8,28.3,28.2,26.9,30.6,26.2,28.3,27.5,26.8,29,26.5,82.1,199.8,333.9,87.6,29.6,30.4,29.6,30.1,30.3,34.2,33.2,30.4,29.5,31.1,28.9,31.6,29.6,33.5,27.9,29.2,29.6,29.9,29.4,30.8,30.8,29.5,29.7,28.8,30,30.4,30.8,30.4,28.7,27.4,29,31.2,31,29.5,30.4,27.1,30.1,32.1,33,31.6,33,32,34.6,167.6,179,43.5,43.8,43.2,43.2,44.1,42.6,43.5,43.6,44.4,43.6,42.7,178.6,31.7,68.9,40,33.7,35.8,37.1,40.9,42.4,49.7,51.8,54.9,50,54.4,52.9,51.2,51.9,173.7,50.6,51.9,49.4,49.9,49,49.5,51.5,50.7,49.6,46.3,53.7,312.2,274.2,162.1,96.1,178.4,87.9,58.6,59.1,72.9,58.9,53.8,3.6,56.4,59.8,901.8,40.3,40.4,38.4,40,39.6,35.6,38.9,39.3,37.8,39.1,38.6,38,40,199.1,38,34.3,36.3,36.3,38.6,37.5,200.8,37.1,39.5,34.1,24.2,14.5,14.7,14.8,14.7,14.3,15,14.5,15.4,13.9,12.5,501.6,181.7,14.9,14.4,14.8,14.5,14.5,14.5,14.5,14.6,14.5,15.3,14.8,14.6,14.9,14.2,15.3,14.2,14.6,14.9,14.5,14.8,29.7,468.1,14.5,14.5,14.3,14.9,15.1,14.4,14.6,14.6,15.1,14.7,14.5,15.3,14.2,14.7,14.4,14.4,14.7,14.6,14.7,14.9,14.5,14.7,14.7,14.6,15,14.7,14.6,14.5,29.7,176,331.8,34.5,386.9,14.9,13.9,15.2,14.7,14.8,14.5,14.8,14.7,15.2,14.2,14.6,14.7,14.3,14.8,14.7,15.2,14.3,14,15.6,14.4,14.9,14.5,14.4,15.2,14.3,14.7,14.5,14.6,14.4,15.4,14.8,14.3,14.7,14.7,14.5,14.6,15,366.9,14.6,14.5,14.8,14.6,15.1,13.7,15,15.1,14.3,14.3,14.9,14.3,14.8,15,14.3,14.8,14.6,14,14.6,718.7,14.1,14.4,14.7,14.8,14.6,14.5,14.7,14.5,14.7,14.8,14.7,14.6,14.4,14.7,14.7,14.5,14.4,14.8,14.5,14.6,14.7,131.1,14.8,15.2,14.8,15,15,15,15.3,15.2,15.3,15.4,15.1,15.2,14.5,14.3,14.8,14.6,14.6,14.8,14.5,14.6,15,14.4,15,14.7,14.9,14.6,14.8,14.9,616.4,14.6,14.7,14.7,14.7,14.7,14.5,14.5,14.8,14.4,15,15.1,14.3,14.8,14.3,14.7,14.7,14.9,14.8,103.4,219.8,14.4,14.9,14.5,14.8,14.9,14.3,14.7,14.4,14.5,14.7,12.2,2.3,14.6,14.7,14.8,15,14.4,14.8,14.5,67.9,34.7,203.9,14.8,14.5,14.4,14.6,15.1,13.9,15.1,14.6,14.7,14.8,14.5,14.8,14.5,14.4,14.5,14.9,14.8,14.7,14.6,14.7,14.6,15,14,14.6,14.7,14.5,15,14.3,14.9,14.5,14.8,14.4,14.8,14.5,131.6,14.3,14.7,14.8,14.6,14.8,14.5,14.9,15,14.2,14.4,14.8,14.7,14.3,14.9,14.9,142.4,28.3,134.5,438.2,307.8,14.5,14.9,34,15.4,15.4,8.3,14.6,14.8,14.3,14.4,14.6,14.7,14.3,15.1,14.9,14.8,14.9,190.1,175.2,14.8,219.4,14.6,14.6,14.3,14.7,14.7,15,14.4,14.7,14.4,14.7,14.8,14.7,14.5,14.6,14.7,14.8,14.5,14.5,14.7,15.1,14.5,14.8,14.7,14.7,14.2,15,15.9,14.6,13.3,14.8,14.7,14.7,14.6,14.9,15,15.6,13,15,15,14.7,15.2,13.6,14.7,14.7,14.6,14.9,14.5,14.5,14.8,14.6,14.7,14.9,14.5,14.9,14.7,14.6,14.9,14.9,14.6,15.2,14.2,14.6,14.5,14.6,14.6,14.7,14.6,14.4,15.2,14.4,14.9,14.1,15,15,14.6,14.7,14.1,14.5,14.8,14.7,14.8,14.8,14.5,14.5,14.9,14.3,14.6,131.8,14.9,14.1,14.8,14.9,14.2,15.3,14.6,14.2,14.5,14.9,14.3,14.8,14.4,15.9,13.9,14.6,14.4,14.7,14.6,6.4,18.2,14.8,14.5,14.7,14.7,14.4,14.8,15.1,14.3,14.6,14.6,14.8,14.7,14.4,14.4,14.4,4.1,5.7,14,14.4,11.9,8.5,6.8,16.7,14.7,14.8,14.7,14.5,14.4,14.8,14.7,14.3,14.7,29.3,117.2,321.8,147.7,26.3,49.5,86.3,14.9,7.5,7.4,7.5,7.1,7.4,6.9,7.4,4.3,9.4,8.2,8.2,7.5,6.9,7.2,7.9,8.1,6.5,7,6.7,6.4,8,7.9,7.2,8.1,6.9,7.7,6.6,7.6,7.1,7.7,7.1,7.6,7.2,7.7,6.9,7.7,6.2,6.6,8.1,8.9,6.9,7.5,7,8,6.7,7.8,7.2,7.4,14.7,14.5,14.9,14.5,14.9,14.3,59.6,19.8,21.1,110.4,28.2,50.4,92.2,68.6,264,41.2,33.7,18.9,55.5,85.4,28.5,27.8,29.3,28,28.9,30,29.4,29,29.1,20.8,32.6,25.4,24.6,66.4,6.1,3.7,26.4,103.4,49,15.4,30.8,46.4,28.6,31.2,26.7,28.5,23.2,23.1,24.8,21.4,26.7,26.3,29.8,26.1,27.1,33.4,25.7,21.3,21.9,23.4,22.2,21.1,21.1,24,22.3,21.9,22.7,21.1,24,21.5,21.7,23.4,20,22.3,22.1,23,36.6,193.5,33.1,22.3,22.6,24.2,27.9,78.8,118.5,18.2,14.8,139.4,320.4,137.1,81.9,48.2,94.9,35.4,30.7,114.8,45.1,126.6,14.2,6.6,30.4,29.5,29.7,27,27.2,27,30.3,26.5,30.8,28.9,30.7,29.4,29,30.4,149.2,55.7,29,29.3,28.3,27.4,28.8,28.8,33.8,31.2,30.5,34.2,30.3,29.2,31.1,28.8,319.6,30.3,28.9,30.3,29.2,29.4,28.9,27.8,30.6,29.3,28.1,32.4,29.7,28.2,28.7,28.7,87.4,131.6,305.4,29.3,28.9,29,29.5,29.3,29.3,29.1,29,29.1,29,29.1,29.1,29.1,29.6,27.3,14.2,12.3,29.4,29.2,29.2,29,29.5,29,9.7,22.5,29,29.4,29.3,29.3,29.3,29,29.3,29.2,29.1,29.2,29.2,29.3,29.4,29.3,29,28.9,29.3,30.1,29.4,29.2,58.7,57.9,58.5,58.2,58.1,671.7,204.1,321.4,147.4,363.1,320.2,335.5,174.9,58.6,58.1,58.3,58.6,38.1,19.7,39.8,26,52.7,53.8,94.4,58.2,37.6,13.6,15.3,15.2,13.8,15.5,15.1,14.8,13.9,14.4,14.3,15.2,15,14.7,14.5,15.1,14.6,14.8,14.4,14.7,14.2,14.9,13.9,119,28.9,14.4,14.2,14.9,14.2,14.5,14.6,14.4,14.9,15.6,14.9,13.9,14.5,15,12.9,14.8,14.5,14.8,14.6,14.5,14.9,190.2,8,79.8,80.7,35.4,30.6,73.4,59.1,159.5,48.4,5,116.3,65.5,12,252.1,11.9,168.6,35.9,228.6,43.2,38.9,38,56.1,6.3,29.9,32.5,68,31.7,131.3,47,28.4,25.9,29.2,28.2,25.7,28.7,29.6,30.2,30.2,26.1,28.6,30,22.4,28.3,31.6,40.3,32.2,29.3,29.6,31.8,27.5,29.4,30.9,27.5,33.3,30.1,29.8,139.3,30.7,31.8,27.8,30.7,14.6,15.1,14.5,14.6,14.9,15.3,14.4,14.3,14.7,14.8,117.6,136.3,197.8,119.8,14.1,15.6,14.6,14.6,14.5,14.7,15,14.6,14.2,15,15.1,14.1,15.7,14,15.3,14.5,14.6,29.9,102.9,160.2,14.5,15.3,14,15.9,14.3,14.5,14.5,14.4,14.7,14.6,15.2,14.8,14.5,14.9,14.8,16.1,14.3,14.5,14.6,14.8,14.5,14.7,14.3,15.1,14.4,14.8,14.7,14.2,14.1,14.6,15,14.4,14.6,13.9,15.2,14.3,14.4,14.6,14.2,14.4,14.5,14.8,14.6,13.8,15,14.4,14.3,15.2,14.3,14.5,14.5,14.6,14.3,14.6,15.8,13.5,15.1,14.7,14.8,14.6,14.8,14.7,15.7,13.6,15.3,14.7,14.8,14.6,4.6,10.3,14.7,14.8,15.4,26.3,85.7,14.4,14.3,14.7,12.1,8.1,157.8,7.2,7.1,7.2,7.4,7.7,7.6,7.7,7.6,7.6,6.7,5.7,5.3,5.1,5.8,5.7,5.5,10.2,10.7,138,14.9,13.1,16.4,15.6,45.8,13.7,12.4,7.3,7.2,7.8,7.3,7.3,7.4,6.3,6.3,6.9,6.3,6.6,6.3,7.9,8.6,8.4,10,9.9,9.6,10.3,11.4,9.9,9.2,9,9.2,10.1,18.8,9.7,9.1,30.9,29.2,46.1,15.2,30.1,269.3,29.8,40.3,20.1,20.1,19.7,20.1,19.6,25,74.4,56.6,38.1,18.2,7,6.7,9.6,24.5,27.1,49.5,10.1,10.7,10.4,10.6,10,10.9,56.8,34.8,35.1,58.3,6.9,4.9,46.1,5.7,8.4,7.9,12.4,14.3,4.4,26.8,11.1,6.7,14.6,19.9,13.9,5.6,1.9,9.6,0.2,6.2,5.3,3.1,3,1.3,1.6,4.9,5,30.5,74.6,105.2,139.2,7.2,8.7,40.4,88.7,8.7,10.1,128.4,8.4,10.4,62.7,65,8.3,9.5,67.1,60.8,9.2,9.6,35.6],\"duration\":[19.706,16.303,9.294,7.941,2.655,2.192,1.993,1.132,2.16,6.672,2.28,1.714,1.285,2.405,0.971,0.179,1.271,2.998,1.202,1.34,15.102,2.266,6.696,1.907,0.984,4.822,6.193,4.029,2.383,3.164,17.704,5.98,4.562,10.77,3.031,9.017,7.141,0.301,5.662,4.974,0.813,5.154,5.046,5.062,5.328,16.388,2.519,0.763,3.136,5.058,0.663,7.645,22.458,3.171,4.62,5.486,0.401,3.971,3.774,2.155,2.332,1.557,4.4,5.285,4.769,1.972,3.094,1.282,1.719,2.427,5.054,12.178,4.889,5.428,0.437,2.113,2.114,3.317,0.887,2.576,1.161,4.408,0.767,8.857,2.265,1.622,5.496,5.211,1.668,0.267,13.826,3.748,1.362,1.218,3.807,4.871,2.974,12.692,8.906,11.957,2.338,13.254,0.501,4.569,3.187,4.008,1.483,0.22,3.206,2.625,1.703,1.747,3.879,3.42,3.794,16.324,18.328,3.072,2.036,5.533,0.737,4.208,0.886,1.709,1.086,9.134,2.054,1.897,4.369,1.256,5.01,1.127,0.554,0.434,3.436,1.703,2.476,0.959,1.095,2.431,1.75,0.628,1.637,1.138,10.269,6.412,10.554,5.586,0.108,11.742,3.609,1.708,4.949,0.324,1.603,11.847,2.186,1.02,3.115,5.392,2.058,1.332,1.544,3.878,0.59,1.226,3.712,1.813,0.731,0.908,1.603,2.153,0.424,1.856,6.469,0.714,12.371,0.401,3.886,3.357,0.668,1.67,1.102,0.421,2.334,6.786,2.098,9.338,4.519,0.539,2.38,4.491,4.146,1.233,5.549,1.495,1.287,3.617,5.78,2.451,4.794,1.033,4.194,1.66,6.936,0.972,6.597,1.958,4.691,3.63,25.507,1.756,3.569,3.454,1.708,7.386,2.227,2.696,1.75,1.947,2.163,1.65,1.851,0.723,0.731,2.677,2.234,2.194,5.176,1.194,1.223,1.254,1.161,1.256,0.579,1.945,1.25,1.296,5.258,2.716,5.633,0.052,1.827,1.807,1.113,1.176,1.146,1.143,1.104,1.14,1.167,1.235,1.168,1.102,1.203,1.14,1.123,1.134,9.957,1.163,1.13,1.171,1.13,1.139,1.178,1.211,1.097,1.148,1.15,1.108,1.185,12.104,1.174,1.068,1.233,1.229,1.313,1.231,1.287,1.255,1.218,1.141,1.155,1.238,1.181,1.192,1.147,1.206,15.82,1.245,1.159,1.149,1.13,1.133,1.172,1.149,1.168,1.088,1.137,1.174,1.164,2.24,1.28,1.196,1.178,1.202,1.234,1.179,1.202,1.158,1.023,1.362,1.536,1.218,1.187,1.2,1.254,1.201,1.188,0.962,0.941,0.896,0.891,0.908,0.874,1.241,9.161,0.559,10.05,1.726,2.723,1.923,3.07,1.145,1.15,1.197,1.183,1.202,1.129,1.186,1.206,1.058,1.151,1.136,1.201,1.093,1.18,1.188,1.129,1.114,11.656,1.212,1.15,1.107,4.837,1.182,1.247,1.184,1.25,1.197,1.223,1.271,1.22,1.209,1.244,1.213,1.242,1.227,1.251,1.263,1.209,1.199,1.216,1.246,1.206,1.209,1.197,14.61,1.21,1.164,1.1,1.118,1.192,2.273,1.131,2.481,1.16,1.179,1.211,1.224,1.237,1.344,5.827,1.34,2.197,1.112,5.627,1.285,4.286,1.172,1.18,1.166,1.175,1.171,1.1,1.165,1.157,1.167,1.083,0.89,1.688,0.922,0.92,1.351,1.721,3.358,2.755,4.177,5.994,2.217,1.919,2.369,2.261,2.887,7.593,1.565,1.442,4.143,1.107,1.162,1.176,1.161,1.083,1.02,1.115,1.191,1.059,1.103,1.149,1.205,1.137,1.126,8.716,1.183,1.722,2.388,1.414,1.021,1.265,1.238,1.375,1.14,1.137,0.689,1.177,1.216,1.125,2.192,2.05,4.373,3.94,1.164,1.486,1.587,1.894,1.128,4.082,1.336,2.765,16.287,4.222,2.564,2.156,3.347,1.123,5.013,1.563,4.993,5,1.672,1.623,5.551,10.861,1.954,9.779,3.452,0.605,0.988,1.767,0.845,0.229,2.63,1.423,2.029,1.563,1.457,5.205,2.645,1.645,3.052,7.735,2.461,1.596,2.731,2.187,4.67,2.048,1.537,1.623,9.606,2.178,2.045,1.303,2.076,1.452,3.179,1.95,10.582,1.493,1.522,1.501,1.521,1.511,1.466,1.474,1.349,1.886,1.355,1.504,8.723,16.917,1.806,5.951,3.906,1.506,9.005,1.51,1.467,1.437,1.539,1.486,1.938,2.319,4.689,5.712,1.98,2.956,1.89,2.417,1.835,34.142,1.642,10.817,11.412,1.83,8.746,2.583,1.337,1.257,1.419,1.405,2.278,1.762,2.172,2.22,1.467,2.623,5.855,1.606,1.368,1.636,2.46,1.323,2.376,1.634,1.462,1.234,1.775,1.302,1.636,1.571,17.849,6.962,2.739,1.744,17.347,10.094,4.806,1.97,3.37,8.999,13.165,7.182,1.831,12.909,10.807,8.86,1.948,15.683,4.192,2.538,1.853,1.504,1.51,1.979,3.788,1.637,6.48,1.931,3.366,3.536,1.728,2.628,1.609,2.32,6.741,3.315,1.068,1.105,1.732,1.417,1.662,4.586,3.46,2.079,1.796,2.401,3.062,2.928,6.137,1.792,5.104,2.996,2.08,2.362,1.646,11.634,3.602,3.329,1.676,1.88,1.414,2.188,13.383,3.007,2.598,1.724,3.873,9.514,3.177,26.296,17.559,1.378,2.938,9.813,1.482,14.72,6.169,0.081,4.174,4.156,11.205,9.586,3.738,4.431,2.236,1.22,2.271,3.195,2.917,3.411,2.504,1.819,3.18,1.242,1.531,1.253,7.751,8.116,9.586,2.216,1.778,1.608,1.998,3.61,2.959,0.611,2.117,1.953,2.731,5.502,13.51,2.204,1.242,1.201,1.151,1.236,1.051,1.201,1.236,2.304,1.187,1.141,1.005,1.162,1.233,1.113,8.367,1.154,1.41,1.283,1.176,1.15,1.256,4.833,21.225,2.075,2.352,1.99,2.114,2.218,2.131,2.179,1.393,1.325,9.195,1.212,1.351,1.304,1.27,1.504,1.53,1.921,1.553,1.505,1.814,1.829,3.176,3.357,3.348,3.112,2.602,2.147,1.995,2.031,1.99,2.083,2.064,3.431,20.717,8.819,8.119,2.097,1.969,2.464,2.355,1.88,22.972,2.641,3.371,2.62,2.267,1.169,0.875,5.219,5.019,2.391,5.691,3.113,2.201,2.274,19.237,26.802,26.46,1.279,15.98,7.949,2.744,7.712,5.225,8.818,21.566,8.46,8.355,3.481,2.739,3.789,16.033,14.087,8.609,7.755,1.815,1.681,1.731,1.746,5.806,1.906,2.031,1.931,2.038,2.061,13.381,17.026,3.677,5.867,7.14,1.946,6.741,1.874,1.601,1.204,1.202,1.087,1.169,1.128,1.278,1.31,1.283,1.353,1.843,11.529,26.449,3.592,1.817,1.751,1.679,1.682,1.742,1.78,4.521,27.764,3.037,2.617,1.652,1.559,1.477,1.438,1.564,1.52,1.476,1.019,0.218,2.133,1.549,16.212,1.495,1.599,1.444,1.479,1.732,1.52,1.542,1.666,1.776,1.598,1.589,1.54,1.647,1.647,1.77,1.449,1.649,1.686,1.66,9.869,1.652,1.657,1.61,1.607,1.669,1.662,1.662,1.641,1.649,1.643,1.694,3.782,1.612,1.617,1.632,1.408,1.607,1.614,1.57,1.612,1.633,1.648,1.485,34.057,2.445,2.488,2.489,2.331,2.49,2.393,2.405,2.156,2.411,2.399,2.4,2.369,2.216,2.21,2.159,2.138,3.349,9.329,12.923,2.614,15.276,2.049,6.596,1.919,1.84,2.016,2.041,3.509,2.146,2.115,2.153,1.953,1.778,2.315,1.294,2.341,2.239,7.454,2.377,2.181,2.067,2.395,12.497,14.091,3.758,24.342,2.123,2.166,2.122,2.149,2.1,2.51,4.137,2.769,1.986,2.16,7.73,2.313,2.229,2.277,2.1,2.102,56.248,2.138,2.108,1.766,0.363,2.195,2.093,2.086,2.64,2.615,1.9,1.679,1.885,4.388,2.007,2.06,2.17,1.996,2.191,1.929,1.729,1.669,1.799,14.002,2.569,2.545,9.348,1.997,2.084,1.854,1.875,8.997,2.406,2.241,2.267,2.371,2.426,2.183,6.983,2.208,2.116,2.172,2.19,2.236,2.541,2.317,2.091,2.168,2.089,2.128,12.431,2.028,2.024,1.814,1.897,1.567,1.74,1.675,5.854,2.17,2.42,2.118,0.998,1.789,1.772,4.145,6.007,3.72,2.879,2.507,2.371,2.92,2.933,2.463,1.968,5.234,6.373,3.605,2.649,2.102,2.008,1.855,3.891,3.115,3.092,3.359,3.326,18.377,2.171,2.093,2.996,2.86,4.028,3.327,3.081,5.258,5.21,2.426,2.484,2.491,2.989,19.848,1.911,2.029,4.749,2.382,2.315,2.97,3.015,0.708,2.832,3.717,2.002,1.318,5.307,4.067,1.906,31.502,0.9,3.019,3.428,4.774,12.367,3.615,3.363,2.303,2.273,11.458,2.437,3.557,4.085,3.49,3.416,2.708,2.732,25.345,9.27,9.26,2.274,1.565,2.161,1.973,1.724,1.88,2.871,2.572,4.269,4.223,2.619,3.297,1.902,2.216,2.103,2.332,1.796,1.941,2.122,2.091,4.138,1.98,1.939,2.968,2.37,1.818,1.809,2.255,2.473,2.234,2.69,3.12,1.112,1.146,3.303,5.763,3.908,2.999,2.496,2.426,3.082,2.412,2.351,2.578,1.644,21.695,1.547,1.502,2.13,2.254,2.122,2.177,2.547,2.785,1.474,1.476,2.628,2.214,36.876,2.277,3.542,2.682,3.179,2.935,9.423,0.451,1.594,2.474,3.452,3.431,3.497,4.08,4.452,4.381,3.961,2.986,5.06,3.805,2.058,1.978,0.983,2.696,3.281,2.326,1.74,2.658,3.74,2.719,2.765,3.022,1.229,1.762,1.649,1.622,1.635,1.801,1.54,1.913,1.601,1.633,1.626,1.486,1.487,1.405,2.311,1.78,1.613,1.5,1.498,1.385,1.254,2.041,2.068,1.907,2.246,1.82,1.932,1.806,2.181,2.032,1.886,3.308,1.92,2.11,2.103,1.559,30.664,1.489,1.444,1.443,1.468,1.507,30.044,1.584,1.651,1.668,1.757,8.78,1.623,1.623,1.621,1.585,1.579,4.492,6.314,7.239,2.102,13.347,1.748,1.936,1.834,1.757,1.873,1.776,1.691,39.104,2.899,2.747,2.575,2.537,2.692,2.673,3.095,2.724,2.805,68.398,0.23,2.841,2.722,3.28,3.931,1.123,2.613,2.576,21.515,5.724,3.008,1.731,1.733,1.681,1.572,1.538,2.336,2.231,2.337,2.334,2.294,2.103,2.533,11.674,1.877,3.009,2.107,2.659,2.532,2.312,2.424,2.446,2.324,4.669,2.388,2.434,2.453,2.411,2.524,2.436,2.373,2.777,2.69,2.539,2.42,2.655,2.577,46.063,21.572,3.27,2.782,0.417,3.217,2.818,16.771,1.956,1.912,1.952,1.891,1.838,1.95,1.945,1.835,1.909,1.815,1.865,2.017,1.777,12.648,12.278,17.531,2.195,7.848,11.789,28.078,1.841,1.898,1.718,1.645,1.916,1.834,1.651,1.748,1.765,1.828,1.784,1.846,16.817,29.701,2.108,1.827,1.838,1.729,1.639,1.681,1.654,1.809,1.814,1.808,1.756,1.684,1.783,1.712,1.619,1.511,1.64,1.681,1.708,1.575,1.633,1.835,1.81,1.718,1.881,1.018,11.491,3.584,15.742,1.743,11.196,8.587,6.872,8.602,19.73,2.019,1.639,1.649,1.587,1.464,1.542,1.579,1.66,1.759,1.697,1.787,1.844,1.772,1.828,1.88,1.832,1.872,1.391,1.5,3.622,16.703,12.755,3.529,6.355,9.53,36.099,3.375,3.338,3.389,3.028,2.665,3.007,38.674,2.527,7.877,3.815,1.829,4.879,3.553,2.689,8.225,2.802,2.197,2.159,2.198,2.364,2.448,10.043,2.132,1.719,3.587,2.011,1.439,0.207,2.695,5.646,6.565,6.798,4.317,2.871,3.642,1.475,1.388,1.392,1.645,5.741,1.747,5.853,5.098,9.03,1.714,1.247,1.397,1.42,1.501,1.248,1.541,1.511,1.717,1.622,1.346,2.02,1.668,1.51,1.443,4.951,17.33,1.553,2.38,2.443,1.835,9.754,4.002,1.292,1.115,3.817,2.696,5.604,1.822,0.416,2.468,2.917,2.61,3.212,3.252,2.313,2.525,5.145,7.317,2.513,2.219,2.245,2.316,2.48,2.201,2.167,2.127,2.297,2.292,2.471,2.173,2.239,33.476,8.081,5.383,3.161,2.162,1.184,1.178,1.26,1.264,1.181,1.129,1.153,1.173,1.09,1.198,1.145,13.494,34.536,9.42,14.826,25.371,29.717,3.657,26.843,21.325,14.965,20.127,6.868,24.78,12.962,8.734,17.387,5.869,5.795,3.839,2.473,1.377,2.561,2.578,2.534,4.883,2.449,3.649,2.473,2.451,2.436,2.446,2.455,2.459,2.456,2.456,2.457,9.013,13.493,23.397,15.923,7.832,0.157,3.979,3.946,4.785,4.706,9.318,29.985,27.504,15.692,13.039,34.305,25.189,33.458,0.578,1.29,20.875,27.416,14.185,31.123,6.046,43.255,34.132,49.287,34.402,34.182,37.829,31.155,40.373,22.591,43.887,39.847,0.111,28.689,3.769,18.087,28.341,22.192,23.216,44.197,4.487,22.21,7.83,17.419,30.483,21.659,1.079,23.12,22.396,28.418,21.691,25.358,3.626,20.317,24.202,29.691,26.174,22.755,0.771,16.117,13.701,24.331,22.768,23.907,28.737,15.439,27.444,11.94,13.707,4.982,40.562,36.561,36.372,0.257,43.869,33.131,46.673,32.439,44.73,41.114,23.632,36.946,36.736,0.424,40.492,36.16,22.379,20.395,29.348,9.326,3.968,5.95,4.912,3.687,15.643,19.19,48.126,29.714,1.878,116.401,12.61,7.008,30.275,29.313,35.322,167.376,42.976,4.225,3.388,5.768,18.715,14.566,6.511,25.334,21.142,50.176,36.508,15.439,81.98,59.816,61.399,9.675,67.256,37.866,25.197,8.48,24.919,5.527,4.9,19.897,7.996,24.078,7.662,61.645,98.453,56.691,126.427,1.59,23.569,46.071,34.37,33.012,20.014,113.277,89.184,47.562,207.612,17.774,14.62,11.011,10.98,10.862,26.643,3.976,21.095,19.257,23.836,8.292,11.835,21.384,7.585,15.126,6.648,7.005,11.081,20.522,9.787,1.894,12.151,3.502,4.979,5.054,5.722,19.646,2.602,2.705,7.062,5.197,4.519,2.027,4.086,3.926,4.099,6.112,7.557,0.175,13.986,7.422,7.624,6.971,12.83,11.329,24.275,16.266,19.044,5.619,2.738,2.588,2.741,3.978,3.419,3.482,1.361,1.884,1.939,14.521,30.614,21.626,64.756,3.085,6.698,12.716,10.285,15.944,11.418,21.638,6.438,9.461,3.679,7.376,6.532,8.804,7.799,6.477,10.395,12.664,7.193,12.808,7.742,10.996,6.107,8.267,8.249,6.529,16.152,4.68,12.407,17.442,31.219,17.14,12.487,5.656,16.02,10.266,6.137,6.679,1.887,6.568,17.149,18.362,20.601,19.639,18.718,19.392,24.303,15.676,26.308,14.099,21.102,15.888,15.852,17.314,13.532,3.206,13.676,2.946,2.82,3.006,1.67,2.186,2.4,3.561,14.77,16.569,2.028,27.665,7.246,1.731,34.931,40.103,14.501,112.807,18.085,18.185,130.919,2.987,46.912,2.924,5.189,4.433,4.935,6.264,1.94,62.957,31.943,32.886,32.592,61.642,2.229,34.912,0.224,45.798,5.488,17.658,9.788,73.695,9.351,47.619,23.878,20.364,3.062,3.28,9.734,2.721,4.775,3.199,20.27,12.402,26.942,12.738,0.625,25.419,31.616,34.932,34.747,25.982,29.002,1.805,42.966,40.264,13.51,29.263,41.029,34.515,17.156,1.729,49.591,36.973,9.707,2.267,37.219,36.865,8.395,14.235,15.699,24.513,21.007,0.504,20.976,19.078,0.697,22.043,23.995,15.568,6.559,22.333,2.15,2.323,10.358,12.065,47.209,11.649,5.799,5.16,3.161,1.138,1.944,45.224,37.352,23.93,10.414,10.519,28.949,12.996,7.63,16.874,3.749,13.293,3.551,11.536,18.813,13.28,11.061,14.467,12.705,105.466,15.455,13.593,149.384,1.482,0.218,29.338,6.193,3.943,0.019,12.719,1.557,2.375,28.296,30.976,17.09,10.621,6.868,6.789,7.729,18.793,31.121,33.128,30.858,11.106,3.285,35.538,7.72,6.19,12.68,46.048,38.542,2.957,3.553,16.276,2.207,14.02,21.882,24.777,7.108,18.981,37.495,30,166.555,1.049,22.242,57.479,27.351,112.872,1.998,194.665,25.124,15.243,4.278,8.358,5.359,5.625,31.144,35.31,22.525,0.11,11.987,6.867,8.139,4.213,4.727,7.801,5.236,1.151,18.924,11.66,11.72,12.697,13.015,13.337,8.055,3.785,7.082,6.787,8.528,11.511,18.217,4.925,17.146,13.494,8.263,11.53,7.032,3.963,5.018,11.419,12.004,12.759,12.234,11.889,13.054,13.505,11.88,13.765,12.926,8.569,0.095,5.089,1.731,8.023,2.316,6.719,15.065,1.735,8.899,4.398,11.457,4.905,2.091,1.855,2.515,0.815,3.12,2.132,9.853,8.884,4.695,5.255,11.347,6.397,6.582,14.311,9.174,12.319,7.817,1.864,1.641,3.116,6.892,6.224,11.156,4.047,0.955,9.943,3.526,4.961,8.5,11.521,5.282,3.1,2.277,5.605,7.888,5.195,11.313,1.246,6.729,8.567,3.838,0.052,12.435,2.752,5.312,1.868,0.094,7.652,2.045,9.685,2.39,1.54,8.343,6.077,6.884,7.713,1.717,5.315,5.55,2.205,6.914,14.717,6.845,9.483,12.855,1.429,14.865,8.665,9.695,15.551,1.155,0.67,1.733,3.572,1.569,1.244,1.179,1.1,1,0.973,0.795,1.012,1.147,0.932,0.965,0.823,0.98,0.974,0.977,0.966,1.033,0.886,0.99,1.121,1.159,1.462,5.331,2.144,13.314,30.595,42.301,7.271,11.552,31.181,14.384,1.766,6.877,4.657,6.142,8.657,3.573,4.42,16.962,11.184,1.754,0.716,0.856,2.909,4.24,15.768,2.637,1.957,0.464,0.353,1.183,2.215,1.153,2.087,1.4,3.881,2.351,3.081,2.236,2.612,2.733,3.564,1.054,3.173,4.527,2.644,3.567,2.159,3.686,7.039,4.875,1.535,6.972,1.056,0.698,6.658,7.217,7.762,7.136,2.312,3.011,1.538,17.203,4.232,5.96,2.374,4.64,6.094,1.761,0.571,0.597,1.047,0.453,1.355,0.431,1.344,13.811,1.153,2.174,2.852,3.272,1.24,0.979,1.144,2.109,2.051,6.772,3.306,2.857,4.314,0.883,0.941,0.673,0.833,1.391,1.882,6.917,0.155,1.252,1.01,6.572,0.794,2.071,0.862,0.887,0.837,1.228,7.281,4.114,5.286,5.18,0.549,2.108,2.485,6.65,6.987,3.683,1.525,0.759,1.078,0.569,1.23,0.658,0.89,0.575,1.472,5.227,1.06,1.827,2.6,1.918,1.723,1.092,0.643,0.942,0.648,1.058,0.695,0.719,0.618,0.791,0.659,0.848,0.86,0.502,0.974,4.153,10.681,14.131,12,5.467,6.318,6.089,1.071,0.766,0.53,1.054,1.074,0.727,0.444,1.056,2.612,7.359,0.996,15.76,1.661,0.437,0.896,1.424,1.029,1.107,1.031,1.278,1.275,1.446,1.501,1.037,0.953,0.964,0.792,0.85,0.733,0.811,0.496,1.382,1.971,0.975,0.605,0.492,0.947,6.885,1.073,1.407,4.629,0.814,0.874,1.007,0.511,0.63,0.897,0.721,1.03,0.959,1.591,1.5,0.986,10.265,2.479,3.287,0.798,1.531,0.819,0.614,0.741,0.713,0.799,1.65,7.885,2.793,2.847,0.628,0.594,0.717,0.568,0.615,0.668,0.501,1.324,0.507,0.917,0.764,0.8,0.888,1.629,0.602,1.874,3.986,3.991,4.199,3.277,4.967,1.488,1.773,1.158,1.601,0.849,0.767,0.783,0.981,1.2,0.526,3.208,2.953,3.792,1.81,1.089,0.894,0.553,1.288,0.756,1.067,0.82,0.574,0.75,1.476,0.844,0.764,1.248,1.061,0.636,1.297,0.732,0.606,0.933,2.676,4.565,5.303,0.873,2.907,2.776,1.692,1.495,1.724,0.976,1.975,2.12,0.695,5.834,6.17,2.005,9.228,4.25,3.229,2.775,1.986,4.706,7.413,42.017,8.288,19.293,2.991,1.644,1.601,8.38,2.629,2.602,1.827,2.131,3.276,5.147,3.11,2.793,2.303,12.691,2.897,1.554,1.491,1.411,1.449,1.314,1.206,2.287,2.17,10.503,1.184,1.412,1.67,1.098,1.417,4.918,1.187,0.77,1.314,1.203,2.252,2.344,3.58,2.86,2.485,2.229,2.128,6.39,7.629,1.572,2.251,2.16,2.2,1.562,0.559,1.685,1.794,4.364,3.274,1.147,2.391,1.688,2.243,1.36,11.446,2.127,2.116,3.254,1.506,1.862,1.758,1.804,1.394,1.582,1.54,1.416,8.858,2.981,2.123,14.952,8.162,5.348,7.063,1.236,2.263,3.337,6.97,4.781,8.844,3.035,4.201,2.767,4.368,0.957,1.895,2.614,2.59,8.698,4.608,2.934,1.48,2.564,3.636,4.452,2.243,2.528,2.775,1.791,10.093,0.072,6.007,6.689,1.762,10.677,2.249,9.057,2.234,2.903,2.955,1.68,2.12,2.728,2.066,6.808,2.79,3.409,4.699,4.452,13.893,2.23,8.152,5.553,3.826,2.731,10.017,6.451,2.509,3.51,2.888,3.827,4.573,4.504,4.004,2.187,19.107,1.827,1.78,1.613,6.985,1.746,1.703,1.68,1.747,1.63,18.108,10.47,1.753,1.616,1.519,1.473,1.584,1.54,1.576,1.57,1.75,1.686,1.661,1.652,1.69,1.677,1.68,2.068,1.916,5.662,1.902,1.94,2.057,6.693,0.842,2.911,1.809,1.688,1.43,1.492,1.473,1.463,1.576,4.517,4.788,7.593,3.782,5.561,1.207,4.694,1.099,1.163,1.081,1.111,1.081,1.092,1.248,1.755,0.849,0.84,0.882,0.869,9.908,2.435,4.341,2.97,8.422,1.867,1.693,1.712,1.668,4.96,4.187,3.425,2.017,1.936,1.88,4.259,2.511,2.391,2.247,1.583,1.191,2.186,2.031,1.812,1.773,1.864,1.91,1.995,1.772,2.112,1.959,2.028,1.646,2.016,1.665,2.144,1.879,2.989,18.94,7.903,2.813,1.598,1.693,1.311,1.624,2.018,2.546,4.819,3.108,1.722,4.935,3.434,0.465,0.619,1.473,5.378,4.163,0.299,1.872,5.698,2.138,0.264,2.024,1.311,1.423,1.128,1.1,0.908,1.044,0.892,1.52,8.085,1.802,1.895,2.026,1.15,0.873,0.981,0.987,1.241,1.233,1.132,1.064,1.21,1.164,1.184,1.419,1.094,1.12,0.971,1.379,1.129,1.249,1.279,1.623,1.576,1.748,3.442,1.42,1.535,1.576,4.213,1.114,1.126,0.956,1.3,8.385,1.394,0.336,1.191,1.683,0.85,0.725,1.238,0.229,1.315,1.478,1.737,3.832,2.546,0.255,1.51,0.919,0.94,1.151,2.411,6.663,2.804,2.119,13.272,2.277,1.43,1.244,1.113,1.064,1.034,0.996,1.051,0.898,0.964,0.943,1.095,0.939,1.063,5.787,1.271,1.161,1.083,0.921,0.974,0.991,1.852,3.437,1.235,1.111,1.054,0.914,1.009,0.999,1.187,1.285,0.795,3.772,7.323,4.323,1.646,1.219,1.511,3.564,1.485,1.099,0.132,1.326,1.132,1.246,1.251,1.192,1.086,1.388,4.204,2.784,2.09,2.206,0.159,1.786,8.972,11.767,10.306,0.902,1.924,1.405,4.638,0.615,7.339,2.664,2.086,2.018,2.401,0.225,2.739,3.143,12.604,5.109,7.132,9.669,0.316,1.392,1.635,0.825,1.033,0.357,1.368,1.4,5.895,16.639,1.344,10.331,0.424,1.122,0.755,10.211,0.219,2.048,0.105,3.349,1.769,1.439,1.532,6.868,2.974,0.895,9.757,4.081,1.745,2.644,0.753,1.914,2.729,1.64,8.391,6.865,5.304,29.036,3.595,2.114,1.983,1.268,2.279,2.626,5.276,8.131,0.896,6.44,0.361,1.056,11.759,16.678,20.989,1.225,0.614,2.511,3.91,6.906,5.656,4.434,5.061,4.524,2.991,4.383,3.887,1.91,1.761,1.965,2.139,2.003,0.864,1.395,2.02,5.341,2.416,2.913,2.632,4.853,8.801,6.857,3.766,6.966,1.207,1.457,0.622,2.895,3.895,1.689,1.956,5.217,4.245,3.921,3.936,18.007,5.04,4.118,19.288,2.132,2.84,2.668,3.464,3.429,3.507,8.44,37.501,11.48,2.014,1.267,2.738,2.146,1.634,1.676,1.706,1.611,1.532,1.789,1.673,4.26,2.629,4.619,1.014,0.888,1.007,1.105,1.154,1.452,1.424,0.839,1.083,0.932,1.391,1.38,2.771,2.879,2.73,2.501,2.667,15.895,8.198,3.097,28.861,23.771,2.277,2.673,21.497,23.112,24.025,2.219,2.354,2.386,2.338,2.276,2.427,2.275,2.316,2.335,2.388,6.99,28.8,22.652,7.836,34.863,3.592,1.608,17.627,3.339,2.258,2.309,2.294,2.314,2.296,2.202,2.289,2.427,25.284,31.852,29.572,3.188,21.538,1.852,1.676,1.798,1.715,1.793,1.825,1.705,1.835,1.745,1.655,1.774,1.846,1.688,1.837,1.701,1.693,15.992,41.799,1.873,1.638,1.78,1.644,1.605,1.704,1.736,1.695,1.719,1.742,1.609,1.76,1.637,1.667,1.621,18.106,12.898,18.4,27.046,9.112,1.747,1.766,1.706,1.626,1.714,1.568,1.876,1.698,1.74,1.711,1.709,1.434,0.209,23.722,31.816,23.771,2.318,8.803,6.842,1.508,1.589,1.486,1.469,1.576,1.414,1.411,1.415,0.071,8.002,1.477,1.505,1.451,1.463,1.492,1.517,1.514,1.584,1.405,1.403,1.417,1.433,14.581,2.137,1.185,1.891,0.909,2.747,1.45,1.467,1.411,1.392,1.449,1.485,25.437,1.406,1.419,1.351,1.421,1.439,1.396,1.409,1.406,1.398,1.366,1.382,1.395,1.429,1.404,12.336,1.381,1.513,1.442,1.384,1.449,1.431,1.46,1.44,1.442,1.491,1.45,3.705,16.917,2.541,13.326,1.339,21.477,2.006,1.869,1.817,1.96,1.988,1.924,2.026,1.854,1.873,2.003,2.064,36.281,8.813,1.593,1.545,1.461,1.514,1.327,1.545,1.41,1.558,1.441,1.461,5.565,8.808,10.44,1.743,1.588,1.531,1.434,1.429,1.547,1.477,41.177,1.454,1.458,1.38,1.509,1.423,1.364,1.563,1.597,1.355,1.563,1.476,6.814,6.742,7.146,3.198,2.96,3.368,17.974,4.593,4.939,3.957,1.004,4.406,1.369,0.689,2.12,2.563,1.152,0.966,0.966,0.949,0.777,0.57,1.026,0.795,0.923,0.775,0.656,0.337,0.483,0.548,0.604,0.557,0.51,0.577,0.651,0.673,0.824,0.743,1.616,1.391,3.841,1.27,0.576,0.537,1.79,1.43,5.363,3.763,0.776,0.549,4.78,6.086,3.015,7.314,2.587,1.384,1.547,1.875,1.418,1.295,2.594,1.292,2.334,1.772,1.508,1.579,1.642,1.722,20.563,7.569,2.021,1.066,0.945,2.284,2.389,1.625,1.116,1.07,1.033,5.929,2.126,23.073,3.551,1.279,1.132,0.907,0.878,1.588,2.742,1.099,1.074,1.032,0.966,1.061,1.121,1.611,1.355,8.62,17.086,2.924,13.555,7.256,3.195,7.835,0.568,5.025,2.592,1.435,2.792,2.231,1.998,1.43,1.264,1.138,1.591,0.837,0.766,1.576,1.029,1.115,0.894,0.954,1.015,0.856,3.803,2.137,0.691,11.969,1.99,1.849,10.356,1.502,2.103,2.762,7.007,4.361,6.07,4.344,11.041,0.736,1.602,2.236,0.724,2.638,0.866,1.59,2.624,1.034,0.983,1.333,1.303,1.358,0.608,0.831,1.459,2.02,2.068,6.323,2.736,4.217,3.511,15.029,10.975,2.617,1.606,1.676,1.515,1.644,0.941,1.058,1.478,0.91,0.913,18.075,11.972,5.972,12.587,2.374,6.237,1.456,0.527,2.584,2.015,8.648,14.68,15.228,1.328,1.192,1.135,0.676,0.851,0.923,0.286,0.573,1.15,1.36,0.657,0.71,17.055,2.463,7.994,21.005,6.076,6.295,0.392,11.974,3.693,4.488,5.022,1.544,4.488,1.078,10.579,1.954,3.481,1.134,1.041,2.834,4.168,2.542,4.076,2.463,1.316,1.227,0.624,2.996,8.695,5.768,8.759,3.05,2.94,3.604,2.669,3.613,3.364,19.601,6.313,2.356,2.375,2.881,1.152,9.366,2.424,2.168,2.191,2.181,2.098,8.047,2.267,2.261,2.331,2.021,11.273,1.935,1.859,1.726,2.228,1.984,2.382,3.771,1.512,7.861,22.068,1.53,1.438,1.393,1.283,1.283,1.106,31.138,9.397,2.85,1.981,1.772,1.838,1.831,1.552,0.047,20.045,34.782,1.68,1.682,1.687,1.644,1.628,1.721,1.645,1.555,17.537,9.938,3.918,1.262,2.015,1.909,2.129,1.61,0.539,0.609,2.163,2.26,0.62,0.146,4.636,0.899,1.054,1.064,1.01,1.868,2.054,0.5,1.525,1.461,2.565,5.39,0.637,1.124,0.996,1.369,1.126,1.363,0.704,3.524,1.735,0.742,0.619,0.646,0.608,0.579,0.482,0.538,0.549,0.541,0.582,0.51,0.519,0.587,0.714,0.833,0.798,0.757,0.691,0.801,0.74,0.852,0.85,0.82,0.805,0.833,0.736,0.87,0.887,6.845,0.652,0.533,0.545,0.562,0.34,0.375,0.296,0.354,0.647,0.65,0.642,0.551,0.538,0.967,1.01,0.885,1.114,6.986,1.389,0.803,1.769,1.785,1.851,1.996,1.778,1.787,1.898,0.96,1.013,0.947,0.414,1.413,1.481,10.608,1.688,1.634,1.572,1.727,1.555,1.707,1.615,1.707,1.666,1.627,1.585,1.544,1.622,1.61,1.662,1.704,8.866,1.768,1.662,1.619,1.462,15.363,1.551,1.601,2.212,0.915,2.987,1.7,1.516,1.45,1.368,1.531,8.524,1.509,1.527,1.523,1.483,1.519,1.501,17.675,1.492,1.498,1.435,1.499,1.529,1.01,1.028,0.989,1.05,1.068,4.456,3.002,1.522,0.752,0.748,1.5,1.292,1.41,0.818,0.784,1.836,1.549,1.534,1.53,1.532,1.525,1.544,1.595,1.554,4.72,1.502,1.556,1.592,1.543,1.574,1.536,1.566,1.56,1.558,1.556,1.469,1.477,1.458,1.476,1.486,1.456,1.488,3.472,5.051,1.719,1.194,1.096,1.211,1.219,1.484,1.483,1.501,1.47,1.504,1.482,1.11,3.573,1.573,1.571,1.576,1.55,1.59,1.583,4.482,1.645,1.63,1.542,1.663,1.706,1.676,11.949,1.008,4.059,1.776,1.826,1.872,1.822,1.816,1.87,1.783,1.877,1.782,1.849,1.792,7.462,0.927,7.149,3.456,1.8,1.83,1.748,1.476,1.668,11.02,1.216,1.154,1.074,1.063,1.122,1.061,1.069,1.035,0.943,1.042,1.073,1.037,0.958,0.901,1.094,1.095,1.068,1.148,8.16,1.238,1.102,1.087,1.082,1.1,1.13,1.192,1.196,1.163,0.907,0.704,0.799,1.379,1.469,1.236,1.506,1.323,1.501,1.572,1.498,1.182,2.952,0.389,5.719,2.472,1.132,1.509,1.433,1.553,1.441,1.394,1.29,0.992,1.016,1.126,1.133,4.645,1.298,1.286,1.198,1.207,1.284,1.209,1.29,1.18,1.33,1.779,1.659,4.987,1.306,1.189,1.278,1.296,1.377,1.758,1.703,1.912,1.78,1.775,1.606,1.644,1.619,1.705,22.666,3.96,4.221,12.978,12.457,1.777,1.663,1.692,1.702,1.691,1.458,1.405,1.32,1.368,1.361,1.443,3.303,3.984,11.29,3.115,8.174,11.436,1.359,1.42,1.491,1.453,1.322,1.256,1.283,1.165,1.254,2.65,2.652,1.446,1.419,1.333,1.211,1.216,1.13,1.209,1.1,1.191,1.197,1.188,1.217,1.308,1.198,9.305,1.587,1.469,1.329,1.299,1.259,1.241,1.337,1.297,1.272,1.19,7.729,2.497,10.416,1.588,1.411,1.547,8.43,1.18,1.235,1.245,1.161,6.047,7.21,1.988,1.806,1.892,1.811,15.057,2.258,12.118,3.777,3.433,0.021,2.822,9.492,1.323,1.319,1.347,1.361,1.336,1.392,1.36,1.292,1.346,1.347,1.446,1.469,1.421,1.4,1.443,1.397,1.389,1.436,1.375,10.338,2.738,1.167,1.227,1.51,1.548,1.562,1.565,1.531,1.531,1.536,1.551,1.336,1.3,0.966,0.934,1.403,1.255,1.542,1.535,1.553,1.549,1.528,14.494,2.382,1.956,2.104,10.605,27.231,1.274,1.267,1.287,1.234,1.276,1.243,1.324,1.303,1.267,1.424,1.443,1.096,1.278,1.138,1.314,0.705,0.713,0.869,0.909,1.073,1.116,1.028,1.138,1.191,5.554,2.127,0.845,1.025,1.014,1.185,1.016,1.018,0.607,0.592,1.152,1.053,1.068,1.024,1.017,1.114,1.036,0.949,1.057,0.933,1.026,1.108,0.805,0.961,1.034,1.046,1.062,1.068,0.997,1.127,1.003,7.238,1.709,3.388,1.525,0.944,0.986,0.976,0.864,1.04,0.998,0.956,0.934,1.024,1.007,0.982,0.938,1.008,0.961,0.949,0.972,0.99,0.985,0.939,1.071,0.916,0.989,0.961,0.938,1.014,0.927,2.87,6.984,11.67,3.061,1.034,1.064,1.035,1.051,1.059,1.197,1.159,1.063,1.031,1.089,1.01,1.103,1.036,1.17,0.976,1.019,1.023,1.034,1.017,1.066,1.068,1.022,1.03,0.996,1.039,1.053,1.066,1.053,0.994,0.947,1.003,1.081,1.073,1.022,1.052,0.937,1.042,1.11,1.144,1.095,1.142,1.107,1.198,5.801,6.196,1.534,1.545,1.524,1.526,1.526,1.474,1.504,1.509,1.536,1.51,1.477,6.183,1.117,2.431,1.411,1.189,1.263,1.31,1.444,1.497,1.756,1.829,1.937,1.764,1.921,1.868,1.807,1.833,6.13,1.788,1.831,1.744,1.761,1.728,1.749,1.817,1.788,1.749,1.635,1.894,11.019,9.677,5.721,3.392,6.298,3.104,2.068,2.085,2.571,2.079,1.897,0.127,1.989,2.112,31.83,1.423,1.427,1.354,1.411,1.396,1.255,1.4,1.414,1.362,1.406,1.389,1.367,1.441,7.167,1.368,1.236,1.306,1.305,1.389,1.35,7.229,1.335,1.423,1.229,0.872,0.521,0.528,0.533,0.529,0.517,0.539,0.521,0.553,0.499,0.448,18.426,6.674,0.549,0.529,0.542,0.531,0.532,0.532,0.534,0.536,0.533,0.563,0.544,0.535,0.547,0.52,0.562,0.523,0.538,0.548,0.532,0.542,1.092,17.196,0.531,0.532,0.526,0.547,0.555,0.529,0.537,0.537,0.554,0.542,0.533,0.56,0.522,0.541,0.529,0.528,0.541,0.538,0.542,0.545,0.534,0.541,0.541,0.538,0.552,0.541,0.536,0.531,1.092,6.465,11.943,1.242,13.927,0.538,0.502,0.546,0.529,0.532,0.521,0.531,0.528,0.548,0.51,0.525,0.529,0.515,0.533,0.528,0.548,0.516,0.504,0.561,0.517,0.536,0.52,0.517,0.548,0.514,0.531,0.521,0.524,0.519,0.553,0.533,0.516,0.53,0.528,0.523,0.525,0.539,13.209,0.525,0.522,0.534,0.525,0.545,0.494,0.539,0.542,0.514,0.515,0.537,0.515,0.534,0.54,0.515,0.534,0.527,0.504,0.525,25.875,0.508,0.517,0.529,0.531,0.524,0.523,0.529,0.524,0.528,0.533,0.53,0.526,0.519,0.53,0.528,0.522,0.519,0.532,0.521,0.525,0.529,4.72,0.532,0.547,0.534,0.542,0.541,0.539,0.552,0.545,0.55,0.555,0.542,0.548,0.523,0.513,0.533,0.525,0.526,0.533,0.522,0.525,0.539,0.52,0.539,0.531,0.538,0.526,0.532,0.537,22.19,0.525,0.53,0.529,0.531,0.529,0.522,0.522,0.533,0.52,0.54,0.545,0.514,0.534,0.516,0.531,0.53,0.535,0.533,3.724,7.914,0.518,0.536,0.522,0.533,0.537,0.513,0.53,0.52,0.52,0.53,0.439,0.082,0.525,0.53,0.531,0.541,0.519,0.532,0.52,2.444,1.201,7.059,0.512,0.504,0.497,0.507,0.523,0.481,0.522,0.506,0.509,0.511,0.503,0.511,0.501,0.498,0.503,0.517,0.511,0.507,0.504,0.507,0.505,0.521,0.486,0.505,0.509,0.501,0.518,0.496,0.516,0.502,0.513,0.499,0.511,0.501,4.556,0.493,0.508,0.513,0.506,0.513,0.503,0.515,0.518,0.493,0.5,0.512,0.507,0.496,0.515,0.514,4.927,0.944,4.613,15.023,10.554,0.497,0.509,1.166,0.533,0.534,0.292,0.514,0.521,0.505,0.507,0.514,0.52,0.506,0.532,0.526,0.521,0.526,6.711,6.063,0.512,7.745,0.515,0.514,0.503,0.519,0.517,0.53,0.509,0.52,0.509,0.52,0.522,0.52,0.512,0.514,0.517,0.521,0.512,0.513,0.517,0.534,0.512,0.522,0.52,0.52,0.502,0.529,0.561,0.514,0.469,0.521,0.52,0.517,0.516,0.526,0.529,0.551,0.458,0.529,0.528,0.52,0.535,0.479,0.519,0.519,0.515,0.527,0.512,0.513,0.521,0.514,0.52,0.525,0.513,0.526,0.519,0.516,0.525,0.526,0.515,0.536,0.503,0.516,0.513,0.514,0.516,0.519,0.515,0.51,0.535,0.509,0.526,0.496,0.528,0.53,0.514,0.519,0.497,0.512,0.521,0.518,0.521,0.522,0.513,0.511,0.524,0.506,0.514,4.652,0.527,0.499,0.521,0.527,0.502,0.54,0.515,0.5,0.512,0.525,0.505,0.522,0.509,0.561,0.499,0.526,0.519,0.528,0.524,0.231,0.641,0.521,0.513,0.52,0.519,0.507,0.523,0.534,0.503,0.516,0.517,0.521,0.519,0.508,0.51,0.508,0.144,0.195,0.481,0.494,0.406,0.29,0.235,0.589,0.517,0.521,0.519,0.512,0.508,0.522,0.517,0.504,0.52,1.032,4.217,11.358,6.328,1.126,1.896,3.236,0.559,0.281,0.278,0.28,0.268,0.279,0.26,0.278,0.162,0.384,0.337,0.335,0.307,0.271,0.283,0.309,0.318,0.253,0.275,0.262,0.25,0.313,0.309,0.28,0.318,0.269,0.3,0.259,0.296,0.279,0.302,0.28,0.299,0.283,0.303,0.271,0.302,0.243,0.258,0.316,0.349,0.271,0.292,0.274,0.312,0.262,0.305,0.28,0.291,0.575,0.568,0.581,0.568,0.582,0.558,2.332,0.756,0.809,4.228,1.079,1.851,3.386,2.52,9.696,1.514,1.236,0.693,2.172,3.204,1.068,1.044,1.1,1.048,1.085,1.125,1.103,1.087,1.091,0.778,1.303,0.994,0.962,2.6,0.239,0.146,1.033,4.134,1.961,0.615,1.155,1.738,1.074,1.169,1.002,1.068,0.869,0.867,0.929,0.803,1.003,0.987,1.118,0.978,1.015,1.396,1.075,0.89,0.916,0.981,0.929,0.883,0.885,1.003,0.933,0.915,0.95,0.884,1.005,0.901,0.907,0.979,0.838,0.934,0.925,0.963,1.534,7.74,1.268,0.855,0.866,0.928,1.068,3.017,4.538,0.669,0.545,5.12,11.768,5.037,3.009,1.807,3.633,1.341,1.187,4.444,1.782,5.56,0.622,0.289,1.152,1.118,1.127,1.022,1.029,1.024,1.147,1.004,1.13,1.063,1.128,1.081,1.064,1.119,5.482,2.007,1.045,1.054,1.018,0.988,1.038,1.038,1.218,1.124,1.098,1.232,1.138,1.095,1.165,1.081,11.985,1.135,1.083,1.135,1.094,1.103,1.083,1.042,1.146,1.097,1.055,1.216,1.112,1.059,1.075,1.075,3.279,4.834,11.217,1.078,1.062,1.064,1.084,1.075,1.075,1.068,1.065,1.069,1.066,1.068,1.07,1.067,1.086,1.001,0.521,0.461,1.102,1.094,1.095,1.087,1.104,1.087,0.365,0.809,1.045,1.057,1.055,1.055,1.055,1.045,1.055,1.05,1.049,1.05,1.052,1.054,1.058,1.055,1.044,1.04,1.076,1.106,1.081,1.074,2.157,2.128,2.15,2.138,2.135,24.674,7.498,11.808,5.415,13.34,11.764,12.324,6.426,2.152,2.136,2.14,2.196,1.428,0.738,1.493,0.974,2.107,2.152,3.777,2.326,1.423,0.521,0.585,0.582,0.527,0.593,0.576,0.565,0.532,0.553,0.548,0.583,0.576,0.565,0.556,0.577,0.561,0.566,0.552,0.564,0.544,0.569,0.533,4.556,1.107,0.55,0.543,0.571,0.543,0.555,0.561,0.551,0.569,0.597,0.57,0.532,0.556,0.576,0.493,0.567,0.554,0.566,0.558,0.555,0.571,7.283,0.325,3.123,3.09,1.355,1.172,2.811,2.264,6.109,1.815,0.189,4.36,2.458,0.449,9.454,0.471,6.743,1.436,9.044,1.71,1.541,1.502,2.219,0.249,1.184,1.287,2.69,1.256,4.974,1.782,1.076,1.014,1.144,1.103,1.007,1.124,1.159,1.181,1.183,1.034,1.133,1.188,0.983,1.241,1.389,1.688,1.364,1.242,1.253,1.348,1.127,1.202,1.263,1.124,1.361,1.233,1.221,5.7,1.257,1.3,1.137,1.257,0.596,0.616,0.567,0.571,0.585,0.597,0.565,0.56,0.574,0.579,4.601,5.333,7.739,7.986,0.941,1.039,0.976,0.972,0.968,0.979,0.999,0.974,0.948,0.999,1.005,0.937,1.047,0.935,1.017,0.965,0.973,1.993,5.293,8.239,0.747,0.784,0.723,0.819,0.737,0.745,0.748,0.74,0.754,0.751,0.78,0.763,0.745,0.768,0.759,0.83,0.736,0.748,0.749,0.762,0.744,0.758,0.736,0.776,0.738,0.761,0.756,0.733,0.724,0.75,0.77,0.741,0.752,0.716,0.781,0.736,0.742,0.749,0.73,0.741,0.748,0.762,0.75,0.711,0.77,0.74,0.735,0.784,0.734,0.745,0.746,0.753,0.735,0.772,0.838,0.715,0.8,0.776,0.785,0.775,0.782,0.777,0.831,0.718,0.808,0.777,0.784,0.772,0.244,0.548,0.778,0.783,0.816,1.395,4.535,0.761,0.756,0.78,0.639,0.426,8.357,0.379,0.375,0.382,0.39,0.407,0.4,0.406,0.402,0.404,0.355,0.304,0.279,0.272,0.307,0.303,0.291,0.541,0.567,7.304,0.811,0.713,0.897,0.851,2.497,0.746,0.675,0.401,0.394,0.427,0.4,0.399,0.402,0.341,0.341,0.378,0.343,0.361,0.344,0.43,0.467,0.46,0.546,0.542,0.523,0.562,0.622,0.542,0.503,0.493,0.499,0.548,1.028,0.527,0.497,1.687,1.591,2.307,0.758,1.506,13.465,1.489,14.491,7.218,7.253,7.099,7.22,7.072,9.013,26.79,20.372,17.125,5.465,2.09,2.02,2.895,2.761,4.436,8.107,1.652,1.479,1.437,1.47,1.391,2.798,14.618,5.689,6.32,10.498,1.126,0.808,7.538,0.938,1.312,0.943,1.483,1.715,0.53,4.023,1.669,1.27,2.62,2.871,1.994,0.834,0.292,1.443,0.035,1.113,1,0.591,0.576,0.242,0.295,0.921,0.939,5.786,14.138,18.032,22.782,1.183,1.121,5.192,15.202,1.496,1.645,21.018,1.371,1.705,10.254,12.31,1.568,1.309,9.292,10.421,1.573,1.825,6.74]},\"weight_typical\":22891.49,\"duration_typical\":23763.41,\"weight\":23587.498,\"duration\":24540.543,\"steps\":[{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Drive west. Then Turn right onto Menlo Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Drive west. Then Turn right onto Menlo Avenue.\",\"distanceAlongGeometry\":49},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn right onto Menlo Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn right onto Menlo Avenue.\",\"distanceAlongGeometry\":33.333}],\"intersections\":[{\"bearings\":[270],\"entry\":[true],\"mapbox_streets_v8\":{\"class\":\"service\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"geometry_index\":0,\"location\":[-118.289795,34.03084]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Menlo Avenue\"}],\"type\":\"turn\",\"modifier\":\"right\",\"text\":\"Menlo Avenue\"},\"distanceAlongGeometry\":49}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"depart\",\"instruction\":\"Drive west.\",\"bearing_after\":270,\"bearing_before\":0,\"location\":[-118.289795,34.03084]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":24.01,\"duration_typical\":19.6,\"duration\":19.6,\"distance\":49,\"driving_side\":\"right\",\"weight\":24.01,\"mode\":\"driving\",\"geometry\":\"ona|_Adwyr`FDj`@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 700 feet, Turn left onto West Adams Boulevard.</prosody></amazon:effect></speak>\",\"announcement\":\"In 700 feet, Turn left onto West Adams Boulevard.\",\"distanceAlongGeometry\":204},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn left onto West Adams Boulevard. Then, in 400 feet, Turn right onto Vermont Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn left onto West Adams Boulevard. Then, in 400 feet, Turn right onto Vermont Avenue.\",\"distanceAlongGeometry\":70.833}],\"intersections\":[{\"entry\":[true,false],\"in\":1,\"bearings\":[0,90],\"duration\":18.469,\"turn_weight\":8,\"turn_duration\":2.105,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":28.045,\"geometry_index\":1,\"location\":[-118.290329,34.030837]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":9.284,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":11.864,\"geometry_index\":2,\"location\":[-118.290326,34.031732]},{\"bearings\":[180,359],\"entry\":[false,true],\"in\":0,\"turn_weight\":0.5,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":3,\"location\":[-118.290324,34.032335]}],\"bannerInstructions\":[{\"sub\":{\"components\":[{\"type\":\"text\",\"text\":\"Vermont Avenue\"}],\"type\":\"turn\",\"modifier\":\"right\",\"text\":\"Vermont Avenue\"},\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"West Adams Boulevard\"}],\"type\":\"turn\",\"modifier\":\"left\",\"text\":\"West Adams Boulevard\"},\"distanceAlongGeometry\":214}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"turn\",\"instruction\":\"Turn right onto Menlo Avenue.\",\"modifier\":\"right\",\"bearing_after\":0,\"bearing_before\":270,\"location\":[-118.290329,34.030837]},\"speedLimitSign\":\"mutcd\",\"name\":\"Menlo Avenue\",\"weight_typical\":53.364,\"duration_typical\":38.347,\"duration\":38.347,\"distance\":214,\"driving_side\":\"right\",\"weight\":53.364,\"mode\":\"driving\",\"geometry\":\"ina|_Apxzr`F}v@Eud@CyRJsEB\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn right onto Vermont Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn right onto Vermont Avenue.\",\"distanceAlongGeometry\":93.333}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[179,269],\"duration\":7.555,\"turn_weight\":20,\"turn_duration\":5.395,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":22.646,\"geometry_index\":5,\"location\":[-118.290332,34.032758]},{\"entry\":[false,true],\"in\":0,\"bearings\":[89,270],\"duration\":2.032,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.981,\"geometry_index\":6,\"location\":[-118.290563,34.032756]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":1.152,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.903,\"geometry_index\":7,\"location\":[-118.290755,34.032755]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,268],\"duration\":2.15,\"turn_weight\":0.5,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.106,\"geometry_index\":8,\"location\":[-118.29083,34.032755]},{\"entry\":[false,true],\"in\":0,\"bearings\":[88,270],\"duration\":6.709,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.719,\"geometry_index\":9,\"location\":[-118.290973,34.032751]},{\"bearings\":[90,270],\"entry\":[false,true],\"in\":0,\"turn_weight\":2,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":10,\"location\":[-118.291415,34.032752]}],\"bannerInstructions\":[{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"left\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"right\",\"active\":true,\"directions\":[\"straight\",\"right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Vermont Avenue\"}],\"type\":\"turn\",\"modifier\":\"right\",\"text\":\"Vermont Avenue\"},\"distanceAlongGeometry\":114}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"end of road\",\"instruction\":\"Turn left onto West Adams Boulevard.\",\"modifier\":\"left\",\"bearing_after\":269,\"bearing_before\":359,\"location\":[-118.290332,34.032758]},\"speedLimitSign\":\"mutcd\",\"name\":\"West Adams Boulevard\",\"weight_typical\":44.161,\"duration_typical\":21.896,\"duration\":21.896,\"distance\":114,\"driving_side\":\"right\",\"weight\":44.161,\"mode\":\"driving\",\"geometry\":\"kfe|_Avxzr`FBlM@~J?tCF|GArZAlH\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 3 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 3 miles.\",\"distanceAlongGeometry\":5360.332},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a quarter mile, Turn left to take the U.S. 1 o1 North ramp.</prosody></amazon:effect></speak>\",\"announcement\":\"In a quarter mile, Turn left to take the U.S. 1 o1 North ramp.\",\"distanceAlongGeometry\":402.336},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn left to take the U.S. 1 o1 North ramp.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn left to take the U.S. 1 o1 North ramp.\",\"distanceAlongGeometry\":130.667}],\"intersections\":[{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"right\",\"valid\":true,\"active\":true}],\"location\":[-118.291566,34.032753],\"geometry_index\":11,\"admin_index\":0,\"weight\":11.129,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":4.105,\"turn_weight\":9,\"duration\":5.843,\"bearings\":[0,90],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.248,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.521,\"geometry_index\":12,\"location\":[-118.291566,34.032877]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.407,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.94,\"geometry_index\":13,\"location\":[-118.291566,34.03297]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.976,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.187,\"geometry_index\":14,\"location\":[-118.291567,34.033114]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.2,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.236,\"geometry_index\":15,\"location\":[-118.291567,34.033177]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":1.241,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.521,\"geometry_index\":16,\"location\":[-118.291567,34.033202]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":2.941,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.593,\"geometry_index\":17,\"location\":[-118.291568,34.033294]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.248,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.521,\"geometry_index\":18,\"location\":[-118.291568,34.033496]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.372,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.673,\"geometry_index\":19,\"location\":[-118.291568,34.033583]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":15.165,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":18.568,\"geometry_index\":20,\"location\":[-118.291569,34.03368]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":4.241,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.737,\"geometry_index\":21,\"location\":[-118.291571,34.034396]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":8.742,\"turn_weight\":0.5,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.751,\"geometry_index\":22,\"location\":[-118.291571,34.03456]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.869,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.281,\"geometry_index\":23,\"location\":[-118.291572,34.035078]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,180],\"duration\":0.989,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.203,\"geometry_index\":24,\"location\":[-118.291573,34.035216]},{\"entry\":[false,true],\"in\":0,\"bearings\":[181,360],\"duration\":4.821,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.88,\"geometry_index\":25,\"location\":[-118.291572,34.035297]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":6.225,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.617,\"geometry_index\":26,\"location\":[-118.291574,34.035658]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.986,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.874,\"geometry_index\":27,\"location\":[-118.291575,34.035998]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.463,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.017,\"geometry_index\":28,\"location\":[-118.291575,34.036189]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.228,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.946,\"geometry_index\":29,\"location\":[-118.291576,34.036302]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"location\":[-118.291576,34.036452],\"geometry_index\":30,\"admin_index\":0,\"weight\":23.667,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":19.694,\"bearings\":[1,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,181],\"duration\":7.975,\"turn_weight\":2,\"turn_duration\":2.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":9.293,\"geometry_index\":31,\"location\":[-118.291564,34.037468]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":4.569,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.597,\"geometry_index\":32,\"location\":[-118.291562,34.037856]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":13.732,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":16.813,\"geometry_index\":33,\"location\":[-118.29156,34.038152]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":9,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":11.025,\"geometry_index\":35,\"location\":[-118.29156,34.038703]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":7.219,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.82,\"geometry_index\":36,\"location\":[-118.29156,34.039063]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,358],\"duration\":0.357,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.413,\"geometry_index\":37,\"location\":[-118.291573,34.039544]},{\"entry\":[false,true],\"in\":0,\"bearings\":[178,359],\"duration\":5.625,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.891,\"geometry_index\":38,\"location\":[-118.291574,34.039568]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"location\":[-118.291586,34.04002],\"geometry_index\":39,\"admin_index\":0,\"weight\":8.096,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":6.984,\"bearings\":[0,179],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.847,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.038,\"geometry_index\":40,\"location\":[-118.291586,34.040442]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.207,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.37,\"geometry_index\":41,\"location\":[-118.291586,34.040511]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.08,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.214,\"geometry_index\":42,\"location\":[-118.291586,34.040974]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.094,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.232,\"geometry_index\":43,\"location\":[-118.291586,34.041528]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.325,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.515,\"geometry_index\":44,\"location\":[-118.291586,34.042109]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":16.335,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":20.003,\"geometry_index\":45,\"location\":[-118.291586,34.042694]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.571,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.15,\"geometry_index\":46,\"location\":[-118.291592,34.043839]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.693,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.84,\"geometry_index\":47,\"location\":[-118.291593,34.044015]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.137,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.835,\"geometry_index\":48,\"location\":[-118.291593,34.044055]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291594,34.044235],\"geometry_index\":49,\"admin_index\":0,\"weight\":8.235,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":7.097,\"bearings\":[180,360],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.699,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.848,\"geometry_index\":50,\"location\":[-118.291596,34.044601]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":30.046,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":36.807,\"geometry_index\":51,\"location\":[-118.291596,34.044644]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.183,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.891,\"geometry_index\":53,\"location\":[-118.291605,34.046597]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.659,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.707,\"geometry_index\":54,\"location\":[-118.291606,34.046866]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291607,34.047258],\"geometry_index\":55,\"admin_index\":0,\"weight\":8.691,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":7.469,\"bearings\":[180,360],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.443,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.535,\"geometry_index\":56,\"location\":[-118.291608,34.047655]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.927,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.811,\"geometry_index\":57,\"location\":[-118.291608,34.047688]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.757,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.594,\"geometry_index\":58,\"location\":[-118.291608,34.048015]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.147,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.622,\"geometry_index\":59,\"location\":[-118.291608,34.048467]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.298,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.806,\"geometry_index\":60,\"location\":[-118.291608,34.048666]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.555,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.904,\"geometry_index\":61,\"location\":[-118.291608,34.048922]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.39,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.369,\"geometry_index\":62,\"location\":[-118.291608,34.049093]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.294,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.477,\"geometry_index\":63,\"location\":[-118.291611,34.049598]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.807,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.88,\"geometry_index\":64,\"location\":[-118.291614,34.05002]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.023,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.47,\"geometry_index\":65,\"location\":[-118.291616,34.050377]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.024,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.704,\"geometry_index\":66,\"location\":[-118.291617,34.0505]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":1.315,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.588,\"geometry_index\":67,\"location\":[-118.291618,34.050693]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291619,34.050773],\"geometry_index\":68,\"admin_index\":0,\"weight\":2.547,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.019,\"turn_weight\":0.5,\"duration\":3.691,\"bearings\":[179,358],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,178],\"duration\":4.408,\"turn_weight\":0.5,\"turn_duration\":2.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.44,\"geometry_index\":69,\"location\":[-118.291624,34.050893]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.007,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.125,\"geometry_index\":70,\"location\":[-118.291623,34.051002]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":12.2,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.945,\"geometry_index\":71,\"location\":[-118.291624,34.051229]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.903,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.998,\"geometry_index\":72,\"location\":[-118.291625,34.051776]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":5.898,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":7.216,\"geometry_index\":73,\"location\":[-118.291626,34.052081]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.134,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.606,\"geometry_index\":75,\"location\":[-118.291626,34.052403]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"location\":[-118.291626,34.052519],\"geometry_index\":76,\"admin_index\":0,\"weight\":4.585,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":4.117,\"bearings\":[0,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.359,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.106,\"geometry_index\":77,\"location\":[-118.291626,34.052672]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.907,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.103,\"geometry_index\":78,\"location\":[-118.291628,34.052912]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.571,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.15,\"geometry_index\":79,\"location\":[-118.291628,34.052974]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.124,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.369,\"geometry_index\":80,\"location\":[-118.291629,34.053154]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.407,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.39,\"geometry_index\":81,\"location\":[-118.291629,34.053238]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":0.802,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.959,\"geometry_index\":82,\"location\":[-118.29163,34.053535]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,360],\"duration\":8.827,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.805,\"geometry_index\":83,\"location\":[-118.291631,34.053579]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":2.198,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.684,\"geometry_index\":84,\"location\":[-118.291632,34.054021]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.55,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.89,\"geometry_index\":85,\"location\":[-118.291633,34.054151]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.486,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.72,\"geometry_index\":86,\"location\":[-118.291633,34.054236]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,180],\"duration\":8.919,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":8.467,\"geometry_index\":87,\"location\":[-118.291634,34.054524]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,182],\"duration\":0.287,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.327,\"geometry_index\":89,\"location\":[-118.291622,34.054953]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":13.867,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":16.979,\"geometry_index\":90,\"location\":[-118.291622,34.054971]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":3.78,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.63,\"geometry_index\":91,\"location\":[-118.291623,34.055661]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":1.447,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.764,\"geometry_index\":92,\"location\":[-118.291628,34.055848]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291628,34.055916],\"geometry_index\":93,\"admin_index\":0,\"weight\":3.527,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.254,\"bearings\":[2,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[false,true],\"in\":0,\"bearings\":[182,359],\"duration\":3.761,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.58,\"geometry_index\":94,\"location\":[-118.291625,34.055995]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":4.846,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.937,\"geometry_index\":95,\"location\":[-118.291629,34.056242]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":3.026,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.699,\"geometry_index\":96,\"location\":[-118.291633,34.056558]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,179],\"duration\":12.608,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":15.435,\"geometry_index\":97,\"location\":[-118.291637,34.056788]},{\"entry\":[false,true],\"in\":0,\"bearings\":[181,360],\"duration\":9,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.025,\"geometry_index\":98,\"location\":[-118.291627,34.057358]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291629,34.057758],\"geometry_index\":99,\"admin_index\":0,\"weight\":16.7,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.019,\"turn_weight\":2,\"duration\":14.019,\"bearings\":[180,359],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":2.4,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.94,\"geometry_index\":100,\"location\":[-118.291634,34.058116]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":13.378,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":16.38,\"geometry_index\":101,\"location\":[-118.291634,34.058186]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.457,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.551,\"geometry_index\":102,\"location\":[-118.291638,34.058649]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.615,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.645,\"geometry_index\":103,\"location\":[-118.291638,34.058679]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.264,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.99,\"geometry_index\":104,\"location\":[-118.291641,34.058964]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":4.043,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.929,\"geometry_index\":105,\"location\":[-118.291642,34.059131]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.447,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.764,\"geometry_index\":106,\"location\":[-118.291644,34.059301]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":0.18,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.221,\"geometry_index\":107,\"location\":[-118.291645,34.059375]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":3.276,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.99,\"geometry_index\":108,\"location\":[-118.291645,34.059386]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":2.707,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.307,\"geometry_index\":109,\"location\":[-118.291647,34.059554]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":1.639,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.984,\"geometry_index\":110,\"location\":[-118.291647,34.059685]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291649,34.05977],\"geometry_index\":111,\"admin_index\":0,\"weight\":4.117,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.735,\"bearings\":[179,360],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.895,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.763,\"geometry_index\":112,\"location\":[-118.29165,34.059879]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.367,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.116,\"geometry_index\":113,\"location\":[-118.29165,34.060121]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.84,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.704,\"geometry_index\":114,\"location\":[-118.291651,34.060249]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":16.327,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.992,\"geometry_index\":115,\"location\":[-118.29165,34.060391]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":18.24,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":22.344,\"geometry_index\":116,\"location\":[-118.291654,34.061002]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":3.127,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.822,\"geometry_index\":117,\"location\":[-118.29165,34.061688]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.29165,34.061803],\"geometry_index\":118,\"admin_index\":0,\"weight\":4.47,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":4.023,\"bearings\":[0,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[2,180],\"duration\":5.479,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.703,\"geometry_index\":119,\"location\":[-118.291649,34.06193]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,182],\"duration\":0.72,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.882,\"geometry_index\":120,\"location\":[-118.291637,34.062275]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.25,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.198,\"geometry_index\":121,\"location\":[-118.291637,34.062321]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.86,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.044,\"geometry_index\":122,\"location\":[-118.291639,34.062615]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.705,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.089,\"geometry_index\":123,\"location\":[-118.291639,34.062699]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.042,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.277,\"geometry_index\":124,\"location\":[-118.29164,34.062861]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":9.157,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.209,\"geometry_index\":125,\"location\":[-118.291641,34.062964]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":2.119,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.573,\"geometry_index\":126,\"location\":[-118.291646,34.063511]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291648,34.063634],\"geometry_index\":127,\"admin_index\":0,\"weight\":4.352,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.927,\"bearings\":[179,360],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":4.339,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.292,\"geometry_index\":128,\"location\":[-118.291649,34.063776]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.2,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.47,\"geometry_index\":129,\"location\":[-118.291654,34.064103]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":5.007,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.125,\"geometry_index\":130,\"location\":[-118.291656,34.064197]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.174,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.43,\"geometry_index\":131,\"location\":[-118.291665,34.064647]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":0.537,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.649,\"geometry_index\":132,\"location\":[-118.291667,34.064751]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":0.419,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.49,\"geometry_index\":133,\"location\":[-118.291667,34.064798]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":3.478,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.253,\"geometry_index\":134,\"location\":[-118.291668,34.064837]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":4.243,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.198,\"geometry_index\":135,\"location\":[-118.291673,34.065077]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":0.919,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.102,\"geometry_index\":137,\"location\":[-118.291672,34.065369]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":3.087,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.323,\"geometry_index\":138,\"location\":[-118.291673,34.065436]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":2.407,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.94,\"geometry_index\":139,\"location\":[-118.291674,34.065518]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.807,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.205,\"geometry_index\":140,\"location\":[-118.291677,34.0657]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":0.6,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.735,\"geometry_index\":141,\"location\":[-118.29168,34.065831]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,359],\"duration\":1.653,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.016,\"geometry_index\":142,\"location\":[-118.291681,34.065878]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,179],\"duration\":1.169,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.423,\"geometry_index\":143,\"location\":[-118.291683,34.066021]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,181],\"duration\":10.371,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":12.679,\"geometry_index\":144,\"location\":[-118.291682,34.066109]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":6.307,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":7.718,\"geometry_index\":145,\"location\":[-118.291681,34.066314]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":10.807,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":13.23,\"geometry_index\":146,\"location\":[-118.29168,34.06657]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.632,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.891,\"geometry_index\":147,\"location\":[-118.291679,34.066728]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.135,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.157,\"geometry_index\":148,\"location\":[-118.29168,34.066951]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":11.88,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":14.553,\"geometry_index\":149,\"location\":[-118.29168,34.066966]},{\"entry\":[true,false],\"in\":1,\"bearings\":[2,180],\"duration\":3.607,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.41,\"geometry_index\":150,\"location\":[-118.29168,34.067259]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291676,34.067349],\"geometry_index\":151,\"admin_index\":0,\"weight\":4.109,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.021,\"turn_weight\":2,\"duration\":3.742,\"bearings\":[0,182],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":5.028,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.136,\"geometry_index\":152,\"location\":[-118.291675,34.067447]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":0.35,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.42,\"geometry_index\":153,\"location\":[-118.291678,34.067731]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.543,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.89,\"geometry_index\":154,\"location\":[-118.291678,34.067748]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":11.932,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":14.608,\"geometry_index\":155,\"location\":[-118.291678,34.067832]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.134,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.606,\"geometry_index\":156,\"location\":[-118.291676,34.068305]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.982,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.203,\"geometry_index\":157,\"location\":[-118.291675,34.068425]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":8.516,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":10.424,\"geometry_index\":158,\"location\":[-118.291675,34.068481]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.134,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.606,\"geometry_index\":160,\"location\":[-118.291675,34.068948]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291675,34.069061],\"geometry_index\":161,\"admin_index\":0,\"weight\":3.686,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.383,\"bearings\":[0,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.595,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.946,\"geometry_index\":162,\"location\":[-118.291675,34.069174]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":3.937,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.799,\"geometry_index\":163,\"location\":[-118.291674,34.069305]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,358],\"duration\":0.654,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.778,\"geometry_index\":164,\"location\":[-118.291678,34.069634]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,178],\"duration\":1.271,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.556,\"geometry_index\":165,\"location\":[-118.29168,34.069684]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.702,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.434,\"geometry_index\":166,\"location\":[-118.29168,34.069788]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.807,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.16,\"geometry_index\":167,\"location\":[-118.291682,34.07014]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":0.739,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.864,\"geometry_index\":168,\"location\":[-118.291681,34.070321]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":2.967,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.152,\"geometry_index\":169,\"location\":[-118.291682,34.070394]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.567,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.872,\"geometry_index\":170,\"location\":[-118.291682,34.070462]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.167,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.592,\"geometry_index\":171,\"location\":[-118.291681,34.070582]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.411,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.494,\"geometry_index\":172,\"location\":[-118.291681,34.07077]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":1.902,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.274,\"geometry_index\":173,\"location\":[-118.291681,34.070807]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":6.435,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.714,\"geometry_index\":174,\"location\":[-118.291682,34.070983]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.79,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.939,\"geometry_index\":175,\"location\":[-118.291686,34.071435]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":12.372,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":14.838,\"geometry_index\":176,\"location\":[-118.291686,34.071476]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":0.47,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.563,\"geometry_index\":177,\"location\":[-118.291686,34.072186]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":3.92,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.696,\"geometry_index\":178,\"location\":[-118.291686,34.072209]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":4.069,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.86,\"geometry_index\":179,\"location\":[-118.291688,34.072432]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,360],\"duration\":1.657,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.98,\"geometry_index\":181,\"location\":[-118.291692,34.072673]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.291693,34.072773],\"geometry_index\":182,\"admin_index\":0,\"weight\":3.296,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":2,\"duration\":3.087,\"bearings\":[0,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":2.797,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.348,\"geometry_index\":183,\"location\":[-118.291693,34.072883]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":6.847,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":8.708,\"geometry_index\":185,\"location\":[-118.291693,34.073158]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,358],\"duration\":2.04,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.448,\"geometry_index\":186,\"location\":[-118.291693,34.073666]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,178],\"duration\":9.36,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":11.232,\"geometry_index\":187,\"location\":[-118.291699,34.073823]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":4.507,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.4,\"geometry_index\":188,\"location\":[-118.291694,34.074522]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,358],\"duration\":0.583,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.675,\"geometry_index\":189,\"location\":[-118.291692,34.074973]},{\"entry\":[false,true],\"in\":0,\"bearings\":[178,360],\"duration\":2.362,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.835,\"geometry_index\":190,\"location\":[-118.291694,34.075016]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":4.476,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.363,\"geometry_index\":191,\"location\":[-118.291696,34.075206]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":4.161,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.985,\"geometry_index\":192,\"location\":[-118.291698,34.075531]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.246,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.495,\"geometry_index\":193,\"location\":[-118.291697,34.0758]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.545,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.646,\"geometry_index\":194,\"location\":[-118.291697,34.07588]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,180],\"duration\":1.53,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.828,\"geometry_index\":195,\"location\":[-118.2917,34.07624]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.2917,34.076337],\"geometry_index\":196,\"admin_index\":0,\"weight\":3.592,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.019,\"turn_weight\":2,\"duration\":3.345,\"bearings\":[180,359],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,179],\"duration\":3.607,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.32,\"geometry_index\":197,\"location\":[-118.291703,34.076459]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":5.822,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.979,\"geometry_index\":198,\"location\":[-118.291703,34.076802]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":2.492,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.991,\"geometry_index\":199,\"location\":[-118.291706,34.077177]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,179],\"duration\":4.846,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.815,\"geometry_index\":200,\"location\":[-118.291708,34.077336]},{\"entry\":[false,true],\"in\":0,\"bearings\":[181,359],\"duration\":0.992,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.163,\"geometry_index\":201,\"location\":[-118.291703,34.077647]},{\"entry\":[true,false],\"in\":1,\"bearings\":[1,179],\"duration\":7.922,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"turn_duration\":2.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":7.097,\"geometry_index\":202,\"location\":[-118.291705,34.077714]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,360],\"duration\":6.93,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.308,\"geometry_index\":204,\"location\":[-118.291701,34.078123]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,358],\"duration\":0.969,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.163,\"geometry_index\":205,\"location\":[-118.291703,34.078573]},{\"entry\":[false,true],\"in\":0,\"bearings\":[178,360],\"duration\":6.646,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.975,\"geometry_index\":206,\"location\":[-118.291706,34.078636]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"location\":[-118.29171,34.079064],\"geometry_index\":207,\"admin_index\":0,\"weight\":4.287,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.021,\"turn_weight\":2,\"duration\":3.927,\"bearings\":[180,358],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[178,360],\"duration\":4.667,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.591,\"geometry_index\":208,\"location\":[-118.291714,34.079147]},{\"entry\":[false,true],\"in\":0,\"bearings\":[180,359],\"duration\":3.6,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.32,\"geometry_index\":209,\"location\":[-118.291716,34.079346]},{\"entry\":[false,true],\"in\":0,\"bearings\":[179,360],\"duration\":25.412,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":30.494,\"geometry_index\":210,\"location\":[-118.291718,34.0795]},{\"lanes\":[{\"indications\":[\"left\"],\"valid_indication\":\"left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"location\":[-118.291722,34.080582],\"geometry_index\":211,\"admin_index\":0,\"weight\":2.557,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.007,\"turn_weight\":0.5,\"duration\":3.722,\"bearings\":[1,180],\"out\":0,\"in\":1,\"entry\":[true,false]},{\"entry\":[true,false],\"in\":1,\"bearings\":[0,181],\"duration\":3.621,\"lanes\":[{\"indications\":[\"left\"],\"valid_indication\":\"left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.32,\"geometry_index\":212,\"location\":[-118.291721,34.080674]},{\"bearings\":[180,360],\"entry\":[false,true],\"in\":0,\"lanes\":[{\"indications\":[\"left\"],\"valid_indication\":\"left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":213,\"location\":[-118.291721,34.080861]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"turn\",\"modifier\":\"left\",\"text\":\"US 101 North\"},\"distanceAlongGeometry\":5378.998},{\"sub\":{\"components\":[{\"active_direction\":\"left\",\"active\":true,\"directions\":[\"left\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"turn\",\"modifier\":\"left\",\"text\":\"US 101 North\"},\"distanceAlongGeometry\":402.336}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"turn\",\"instruction\":\"Turn right onto Vermont Avenue.\",\"modifier\":\"right\",\"bearing_after\":0,\"bearing_before\":270,\"location\":[-118.291566,34.032753]},\"speedLimitSign\":\"mutcd\",\"name\":\"Vermont Avenue\",\"weight_typical\":1007.249,\"duration_typical\":846.093,\"duration\":865.862,\"distance\":5378.998,\"driving_side\":\"right\",\"weight\":1031.835,\"mode\":\"driving\",\"geometry\":\"afe|_Aze}r`FwF?yD?_H@}B?q@?wD@sK?mD?aE@wk@BgI?k_@@sG@aDAqUBgT@}J?aF@kH?o~@WgWCoQC{Y?qF?oU?a]Xo@@g[VkY?iC?}[?sa@?ic@?qc@?qfAJ_J@oA?gJ@{UBuA?_^BazALyO@oW@yW@aA?mS?g[?mK?_O?uI?q^DkYDiUBuF@aK@_D@oFHyEAeM@ea@@aR@sQ?o@?gF?qH?_NB{B?gJ@gD?qQ@wA@sZ@cG@iD?_Q@iSOoEGc@?cj@@uJHgC?}CEmNFwRFkMFsb@S_XBkUHkC?}[F{@?yPDmI@sIBsC@U?oIBeG?iDByE@cN?_G@{GAee@F{i@GeF?}FAqTW{A?kQBgD?cI@mE@ea@HuFB{G@mSH{DBc[PoEB}A?mA@_NHmFAyI?eC@cD@kJDeGD}A@}GBoDAyKA_OA{HA}L@]?iQ?sDGcEAwPDa@?gD?q\\\\CoFAoB?uI?oQ?aF?aF?eGAqSFcBBoE?_UBiJAqC@gC?oFAwJ?iA?_J@g[FqA?kk@?m@?}LBqKDoA@gE@{E?sAAqM@w^?yHJuj@Ie[CuAB{JBiSByOA_D?oUDaE?sFDmT?mVD}HBmRIeCBiQKgFBc[B}BDwYFeDFmKBsHBsbAFwDAuJ?iJ@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 7 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 7 miles.\",\"distanceAlongGeometry\":11040.995},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Keep left to take California 1 70 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Keep left to take California 1 70 North.\",\"distanceAlongGeometry\":1609.344},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to take California 1 70 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to take California 1 70 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take California 1 70 North, Hollywood Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take California 1 70 North, Hollywood Freeway.\",\"distanceAlongGeometry\":197.778}],\"intersections\":[{\"lanes\":[{\"indications\":[\"left\"],\"valid_indication\":\"left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"location\":[-118.291722,34.081042],\"geometry_index\":214,\"admin_index\":0,\"weight\":14.006,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"turn_duration\":7.395,\"turn_weight\":12,\"duration\":9.066,\"bearings\":[180,271],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[91,273],\"duration\":7.336,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.794,\"geometry_index\":215,\"location\":[-118.291866,34.081045]},{\"entry\":[false,true],\"in\":0,\"bearings\":[93,275],\"duration\":12.8,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":2,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":12.96,\"geometry_index\":216,\"location\":[-118.292488,34.081075]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,291],\"duration\":3.48,\"turn_duration\":0.009,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.166,\"geometry_index\":221,\"location\":[-118.293382,34.081195]},{\"entry\":[false,true],\"in\":0,\"bearings\":[112,295],\"duration\":4.154,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.985,\"geometry_index\":223,\"location\":[-118.293656,34.081286]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.294547,34.081605],\"geometry_index\":226,\"admin_index\":0,\"weight\":9.693,\"is_urban\":true,\"turn_weight\":7,\"duration\":2.254,\"bearings\":[113,299],\"out\":1,\"in\":0,\"turn_duration\":0.01,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.294999,34.081815],\"geometry_index\":227,\"admin_index\":0,\"weight\":2.646,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":2.226,\"bearings\":[119,299],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[119,299],\"duration\":11.823,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.187,\"geometry_index\":228,\"location\":[-118.295461,34.082028]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,305],\"duration\":3.2,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.76,\"geometry_index\":235,\"location\":[-118.298155,34.083361]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,308],\"duration\":6.545,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.691,\"geometry_index\":237,\"location\":[-118.298851,34.083788]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,310],\"duration\":2.7,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.24,\"geometry_index\":239,\"location\":[-118.300195,34.0847]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,310],\"duration\":9.327,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.193,\"geometry_index\":240,\"location\":[-118.300748,34.085082]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[129,310],\"duration\":11.487,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.776,\"geometry_index\":244,\"location\":[-118.302653,34.086385]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.304762,34.088271],\"geometry_index\":254,\"admin_index\":0,\"weight\":25.776,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":21.487,\"bearings\":[146,327],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,321],\"duration\":22.502,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":26.976,\"geometry_index\":265,\"location\":[-118.307543,34.0925]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.312219,34.095718],\"geometry_index\":275,\"admin_index\":0,\"weight\":13.769,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":11.065,\"bearings\":[131,313],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.314011,34.097491],\"geometry_index\":284,\"admin_index\":0,\"weight\":5.695,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":4.754,\"bearings\":[147,329],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.314603,34.098405],\"geometry_index\":288,\"admin_index\":0,\"weight\":32.148,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.367,\"bearings\":[154,334],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,302],\"duration\":4.603,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.384,\"geometry_index\":299,\"location\":[-118.318499,34.103535]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.31956,34.104022],\"geometry_index\":302,\"admin_index\":0,\"weight\":12.493,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.665,\"bearings\":[117,288],\"out\":1,\"in\":0,\"turn_duration\":0.033,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,271],\"duration\":1.381,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.623,\"geometry_index\":311,\"location\":[-118.322266,34.104402]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,272],\"duration\":8.791,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.329,\"geometry_index\":312,\"location\":[-118.322619,34.104408]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[109,292],\"duration\":6.709,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.715,\"geometry_index\":319,\"location\":[-118.324852,34.104717]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,306],\"duration\":9.164,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.538,\"geometry_index\":326,\"location\":[-118.326408,34.105423]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":0.58,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.659,\"geometry_index\":327,\"location\":[-118.328379,34.106599]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.328499,34.106671],\"geometry_index\":328,\"admin_index\":0,\"weight\":11.322,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.071,\"bearings\":[126,306],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,305],\"duration\":1.72,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.935,\"geometry_index\":329,\"location\":[-118.33065,34.107974]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,304],\"duration\":7.72,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.685,\"geometry_index\":330,\"location\":[-118.331033,34.108197]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.332728,34.109213],\"geometry_index\":333,\"admin_index\":0,\"weight\":46.26,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":42.062,\"bearings\":[127,307],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.337153,34.117409],\"geometry_index\":357,\"admin_index\":0,\"weight\":5.72,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":4.875,\"bearings\":[166,345],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,339],\"duration\":16.01,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":16.79,\"geometry_index\":361,\"location\":[-118.337535,34.118401]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.339551,34.121389],\"geometry_index\":374,\"admin_index\":0,\"weight\":19.115,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":18.224,\"bearings\":[142,321],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":24.873,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":26.116,\"geometry_index\":378,\"location\":[-118.342872,34.124294]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.346766,34.128674],\"geometry_index\":393,\"admin_index\":0,\"weight\":41.098,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":38.238,\"bearings\":[139,320],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.354864,34.133945],\"geometry_index\":416,\"admin_index\":0,\"weight\":8.285,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":6.927,\"bearings\":[106,287],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.356636,34.134465],\"geometry_index\":418,\"admin_index\":0,\"weight\":17.105,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":14.767,\"bearings\":[111,291],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.360183,34.135957],\"geometry_index\":423,\"admin_index\":0,\"weight\":12.06,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.495,\"bearings\":[128,311],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.36238,34.137532],\"geometry_index\":425,\"admin_index\":0,\"weight\":1.794,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":1.567,\"bearings\":[131,311],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":1.44,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.656,\"geometry_index\":426,\"location\":[-118.362702,34.137761]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,310],\"duration\":28.64,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":32.936,\"geometry_index\":427,\"location\":[-118.362999,34.137972]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.367252,34.143186],\"geometry_index\":443,\"admin_index\":0,\"weight\":1.91,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.221,\"bearings\":[160,338],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,339],\"duration\":1.718,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.019,\"geometry_index\":444,\"location\":[-118.36737,34.143433]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,340],\"duration\":6.095,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.162,\"geometry_index\":445,\"location\":[-118.367537,34.143785]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.368141,34.145024],\"geometry_index\":449,\"admin_index\":0,\"weight\":13.267,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.319,\"bearings\":[155,330],\"out\":1,\"in\":0,\"turn_duration\":0.028,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,311],\"duration\":2.045,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.403,\"geometry_index\":458,\"location\":[-118.370106,34.146873]},{\"bearings\":[131,311],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":459,\"location\":[-118.370519,34.147166]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-134\",\"type\":\"icon\",\"text\":\"CA 134\"},{\"type\":\"text\",\"text\":\"East\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-170\",\"type\":\"icon\",\"text\":\"CA 170\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"CA 134 East / CA 170 North\"},\"distanceAlongGeometry\":11068.995}],\"destinations\":\"US 101 North, CA 2 West\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"turn\",\"instruction\":\"Turn left to take the US 101 North ramp.\",\"modifier\":\"left\",\"bearing_after\":271,\"bearing_before\":360,\"location\":[-118.291722,34.081042]},\"speedLimitSign\":\"mutcd\",\"name\":\"Hollywood Freeway\",\"weight_typical\":584.735,\"duration_typical\":502.22,\"duration\":474.974,\"distance\":11068.995,\"driving_side\":\"right\",\"weight\":552.978,\"mode\":\"driving\",\"ref\":\"US 101 North\",\"geometry\":\"cpc_`Aro}r`FE~G{@ze@]tJWdMc@bHu@`I_BxImAdGgB|GyBpHoBzHsKfc@cLf[iLz[}a@tiAcGdPkGpP}GvPuGbOqHhPuCvFyNzY{IrO_JzO_m@bbA{Vpa@mp@vfAMT{NlVuNdVaIlMwIbNyIjMeJzLeJ|K{J|KmKzKsL|KeLvJwKpIeM`JsLbIwLhHcMzGc|BdjAoM`HeMpGmMnHsLxHkLpIkLvJeL|KmJlKqJpLcJbMcIfMgIxNqeBpbDaIvNoH~LiJxNaJbM_KzMyJfLsKnLuKrKmK`K_KvIqKdIsLrI}L~HiMpH_MtG{MvG_gEnsBmNzH_M~HkLzIuKnJcKlKaKnLkJxL}IvMmHnMeHvNsGlO}FvO{Lb`@kDtR}ClQaClQiB`RqAvRq@~Q_@lRSvQIpOK`USzWa@tRu@bRqAdRuBxRoCtQeDdQ{CxMgDfMmDhLyD~KkE|KqEbKyHxOohAdzBoCnFmpAleC}L|VsT`e@}NhY}Xph@qH`NyH|MoIfNwItMiJnM_JdLaKdL_LjKyJdIgLjImLpHsMdHsLpF}MpFiNvEyMnDuMbDmyCjq@aOfDiNrCwMjCy_AhPwNtCsO|CiN`D_O`EgN`EmNtE{NnFcNpF{MxFcNnGqMvGuMnHkMtHkMlIkMxIuLnIeLbJgLnJgLhK{KpKsK~KkK`LunC|gD_KzLyJ~KoJxJiK`JqL`JsYrRoLfHy\\\\zRwLtHuLlIsLnJiLjKgLxKeMfMy{@v}@uM~McWnWiKfKo|@d~@_MnMsm@lo@wKfL}KdLiKtL_KhMiJ~MeIpMeI~NmHnOwGfPoFlOuDxL}HtYuC|MeCbNeDpUeEz[}K`w@sJpk@{SdaAm]v}AkKna@iK|[mQl`@uR`]eZvd@gfApbBiMbSeLpQwd@lt@cIfMwIxM}I|MeJhMsIbLoIvJ_KbKqLxJiK`IeLxH_MtH_NlHkMjGsMfF}qBrq@mNjF_UlIy]nLaQpGyKzEwNxGuMhIwNpKoKjJ_K`KiFfFyJhLwJhMkIxLkRxZiQxXag@dw@kb@jr@wIzM\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 11 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 11 miles.\",\"distanceAlongGeometry\":18373.996},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep left to take Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep left to take Interstate 5 North.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to take Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to take Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take Interstate 5 North, Golden State Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take Interstate 5 North, Golden State Freeway.\",\"distanceAlongGeometry\":233.333}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,310],\"duration\":10.191,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":12.207,\"geometry_index\":462,\"location\":[-118.372478,34.148545]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,327],\"duration\":1.335,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.602,\"geometry_index\":467,\"location\":[-118.3741,34.150254]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,328],\"duration\":2.778,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.334,\"geometry_index\":468,\"location\":[-118.374297,34.150502]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,326],\"duration\":28.565,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":34.278,\"geometry_index\":469,\"location\":[-118.374708,34.151038]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.378893,34.156599],\"geometry_index\":474,\"admin_index\":0,\"weight\":1.872,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.128,\"bearings\":[154,336],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,339],\"duration\":5.009,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.136,\"geometry_index\":475,\"location\":[-118.379018,34.156829]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,343],\"duration\":14.84,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":18.179,\"geometry_index\":476,\"location\":[-118.379524,34.157901]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,340],\"duration\":5.564,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.668,\"geometry_index\":481,\"location\":[-118.380885,34.16104]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.381423,34.162234],\"geometry_index\":482,\"admin_index\":0,\"weight\":13.05,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.882,\"bearings\":[160,340],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":1.95,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.389,\"geometry_index\":483,\"location\":[-118.382491,34.164681]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":9.787,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.745,\"geometry_index\":484,\"location\":[-118.382681,34.165122]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,337],\"duration\":4.094,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.883,\"geometry_index\":485,\"location\":[-118.38365,34.167323]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,332],\"duration\":3.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.32,\"geometry_index\":487,\"location\":[-118.384095,34.168178]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,329],\"duration\":0.225,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.27,\"geometry_index\":490,\"location\":[-118.384607,34.168887]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.384641,34.168934],\"geometry_index\":491,\"admin_index\":0,\"weight\":17.188,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":14.354,\"bearings\":[149,322],\"out\":1,\"in\":0,\"turn_duration\":0.03,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,308],\"duration\":2.661,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.193,\"geometry_index\":497,\"location\":[-118.38749,34.171304]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,308],\"duration\":1.653,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.984,\"geometry_index\":498,\"location\":[-118.388068,34.171678]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,309],\"duration\":3.037,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.645,\"geometry_index\":499,\"location\":[-118.388451,34.171926]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[129,309],\"duration\":10.2,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":12.24,\"geometry_index\":500,\"location\":[-118.389136,34.172388]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.391276,34.17384],\"geometry_index\":502,\"admin_index\":0,\"weight\":8.161,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":6.528,\"bearings\":[130,313],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.392473,34.174914],\"geometry_index\":505,\"admin_index\":0,\"weight\":22.877,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":19.48,\"bearings\":[141,327],\"out\":1,\"in\":0,\"turn_duration\":0.01,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,335],\"duration\":2.183,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.62,\"geometry_index\":510,\"location\":[-118.394953,34.179196]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,333],\"duration\":2.057,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.469,\"geometry_index\":511,\"location\":[-118.395214,34.179659]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,331],\"duration\":4.858,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.805,\"geometry_index\":512,\"location\":[-118.395504,34.180138]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,322],\"duration\":3.188,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.825,\"geometry_index\":515,\"location\":[-118.396238,34.181122]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,319],\"duration\":1.957,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.299,\"geometry_index\":516,\"location\":[-118.396802,34.181724]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.397154,34.182064],\"geometry_index\":517,\"admin_index\":0,\"weight\":26.353,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":22.452,\"bearings\":[139,315],\"out\":1,\"in\":0,\"turn_duration\":0.024,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.401189,34.186467],\"geometry_index\":526,\"admin_index\":0,\"weight\":2.701,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.883,\"bearings\":[161,344],\"out\":1,\"in\":0,\"turn_duration\":0.009,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,347],\"duration\":11.571,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.886,\"geometry_index\":527,\"location\":[-118.40134,34.186911]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.401786,34.189717],\"geometry_index\":530,\"admin_index\":0,\"weight\":20.795,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":16.933,\"bearings\":[174,354],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[174,354],\"duration\":1.8,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.16,\"geometry_index\":531,\"location\":[-118.402322,34.193745]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[174,354],\"duration\":5.949,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.139,\"geometry_index\":532,\"location\":[-118.402377,34.194157]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.402567,34.195559],\"geometry_index\":533,\"admin_index\":0,\"weight\":26.222,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":21.873,\"bearings\":[174,354],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,343],\"duration\":1.944,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.333,\"geometry_index\":541,\"location\":[-118.403427,34.20096]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[163,340],\"duration\":2.304,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.765,\"geometry_index\":542,\"location\":[-118.4036,34.201422]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.403842,34.201965],\"geometry_index\":543,\"admin_index\":0,\"weight\":12.99,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":10.432,\"bearings\":[160,336],\"out\":1,\"in\":0,\"turn_duration\":0.024,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.405062,34.204384],\"geometry_index\":545,\"admin_index\":0,\"weight\":53.624,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":45.219,\"bearings\":[158,339],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[167,348],\"duration\":1.653,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.942,\"geometry_index\":551,\"location\":[-118.408393,34.215548]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.408498,34.21594],\"geometry_index\":552,\"admin_index\":0,\"weight\":12.69,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.807,\"bearings\":[168,348],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,347],\"duration\":11.4,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.11,\"geometry_index\":553,\"location\":[-118.409213,34.218629]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[167,348],\"duration\":1.838,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.113,\"geometry_index\":554,\"location\":[-118.409999,34.22146]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,347],\"duration\":8.738,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.048,\"geometry_index\":555,\"location\":[-118.410113,34.221888]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[167,349],\"duration\":3.938,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.528,\"geometry_index\":556,\"location\":[-118.410674,34.223931]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.410864,34.224856],\"geometry_index\":558,\"admin_index\":0,\"weight\":5.195,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":4.092,\"bearings\":[173,358],\"out\":1,\"in\":0,\"turn_duration\":0.01,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[4,180],\"duration\":4.045,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":4.652,\"geometry_index\":561,\"location\":[-118.410899,34.225843]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[12,188],\"duration\":5.841,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.571,\"geometry_index\":563,\"location\":[-118.410777,34.226815]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.41031,34.228193],\"geometry_index\":566,\"admin_index\":0,\"weight\":2.953,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":2.646,\"bearings\":[17,199],\"out\":0,\"in\":1,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[21,197],\"duration\":5.869,\"turn_duration\":0.009,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.739,\"geometry_index\":567,\"location\":[-118.410092,34.228795]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[15,201],\"duration\":21.396,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":24.605,\"geometry_index\":568,\"location\":[-118.409487,34.230074]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,315],\"duration\":24.791,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":27.89,\"geometry_index\":581,\"location\":[-118.410578,34.23448]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,309],\"duration\":2.741,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.083,\"geometry_index\":583,\"location\":[-118.415196,34.238366]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.415762,34.238744],\"geometry_index\":584,\"admin_index\":0,\"weight\":7.46,\"is_urban\":true,\"turn_weight\":5.5,\"duration\":1.755,\"bearings\":[129,319],\"out\":1,\"in\":0,\"turn_duration\":0.014,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,318],\"duration\":17.335,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.502,\"geometry_index\":585,\"location\":[-118.416084,34.239049]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.419285,34.242025],\"geometry_index\":586,\"admin_index\":0,\"weight\":16.76,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":14.905,\"bearings\":[138,318],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,319],\"duration\":1.953,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.197,\"geometry_index\":588,\"location\":[-118.422058,34.244662]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.422427,34.245009],\"geometry_index\":589,\"admin_index\":0,\"weight\":4.286,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":3.373,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":9,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.125,\"geometry_index\":590,\"location\":[-118.423045,34.24559]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.424696,34.247141],\"geometry_index\":591,\"admin_index\":0,\"weight\":15.62,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":13.155,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.427096,34.249421],\"geometry_index\":592,\"admin_index\":0,\"weight\":8.28,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":7.207,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":1.839,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.115,\"geometry_index\":593,\"location\":[-118.428408,34.250663]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":12.913,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.85,\"geometry_index\":594,\"location\":[-118.428742,34.25098]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.431117,34.2532],\"geometry_index\":595,\"admin_index\":0,\"weight\":12.42,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.819,\"bearings\":[139,318],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,319],\"duration\":8.844,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.17,\"geometry_index\":596,\"location\":[-118.433113,34.255053]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":1.953,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.246,\"geometry_index\":597,\"location\":[-118.434733,34.256584]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":19.878,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":22.86,\"geometry_index\":598,\"location\":[-118.435098,34.256927]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.43873,34.260363],\"geometry_index\":600,\"admin_index\":0,\"weight\":10.81,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":9.419,\"bearings\":[139,318],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.440232,34.262059],\"geometry_index\":605,\"admin_index\":0,\"weight\":4.37,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":3.808,\"bearings\":[149,331],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,332],\"duration\":1.627,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.871,\"geometry_index\":606,\"location\":[-118.440729,34.262804]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,332],\"duration\":6.48,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.452,\"geometry_index\":607,\"location\":[-118.440968,34.26318]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,332],\"duration\":1.944,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.236,\"geometry_index\":608,\"location\":[-118.441879,34.264611]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,332],\"duration\":8.64,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.936,\"geometry_index\":609,\"location\":[-118.442149,34.265038]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,322],\"duration\":13.33,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":15.635,\"geometry_index\":612,\"location\":[-118.44348,34.266887]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.446164,34.269442],\"geometry_index\":616,\"admin_index\":0,\"weight\":6.93,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":5.48,\"bearings\":[138,319],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,323],\"duration\":1.745,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.051,\"geometry_index\":619,\"location\":[-118.447249,34.270477]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.44756,34.270819],\"geometry_index\":620,\"admin_index\":0,\"weight\":13.083,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.155,\"bearings\":[143,323],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,329],\"duration\":2.062,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.423,\"geometry_index\":624,\"location\":[-118.449268,34.27311]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.449582,34.273535],\"geometry_index\":625,\"admin_index\":0,\"weight\":2.115,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":1.821,\"bearings\":[149,327],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,325],\"duration\":2.412,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.834,\"geometry_index\":626,\"location\":[-118.449867,34.273895]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,321],\"duration\":12.115,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.236,\"geometry_index\":627,\"location\":[-118.450267,34.274373]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,318],\"duration\":1.781,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.138,\"geometry_index\":630,\"location\":[-118.452749,34.276759]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,319],\"duration\":10.165,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.944,\"geometry_index\":631,\"location\":[-118.453102,34.27708]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[146,331],\"duration\":2.375,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.791,\"geometry_index\":634,\"location\":[-118.455083,34.279084]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.455414,34.279586],\"geometry_index\":635,\"admin_index\":0,\"weight\":2.449,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.667,\"bearings\":[151,334],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"bearings\":[154,334],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":636,\"location\":[-118.455638,34.279962]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden State Freeway\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 5 North / Golden State Freeway\"},\"distanceAlongGeometry\":18408.996}],\"destinations\":\"CA 134 East, CA 170 North\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take CA 170 North/Hollywood Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":310,\"bearing_before\":311,\"location\":[-118.372478,34.148545]},\"speedLimitSign\":\"mutcd\",\"name\":\"Hollywood Freeway\",\"weight_typical\":818.366,\"duration_typical\":687.755,\"duration\":691.934,\"distance\":18408.996,\"driving_side\":\"right\",\"weight\":819.942,\"mode\":\"driving\",\"ref\":\"CA 170 North\",\"geometry\":\"akgc`Azf{w`F}KhQwNhP_S|QcK|I_m@zb@oNhKo`@tX_aEl|C}q@rf@y^hUoZbPij@`XkMxF_bAr^}S|F_aAn[{`Af\\\\cUlHgT|HsiAr`@}wCvaAqZzJqhCp{@wl@|UuFzCqK|FsT~NcI`G}AbAk]t[gOxN_UdWqObR_MnR}o@veAkVbc@oN|V{[xi@mcAzdBiUz^kNtR{Zx^{VhVuz@hn@oZ`QgTbKwU|JmgCp`A}[hO}\\\\bQaPlJsYjRyP`Nsd@fb@gT~TwsB~kCoPpQyQnPiR~NgS|MySjLqS`KiTlI{RhGwZlHeSrDuUlCocCxPwzFn`@wXlBsvAzJs{@bFkVvAqjCzQkVlBuUnBaUvCkVrEoUtE{[xI}`@bNubAvb@orAng@i\\\\|Lok@jQs[bJcd@`Ki[pG{pOboCoWpEagDtk@}oDbp@wYbFu~B`b@}d@`H{RxA_RZmTh@gT?ka@}AkYuCm_@oGo_@yJeT{Gsd@sL}nAyd@gTaFkQsCgUuBw`@YcQf@g_@zDuTzE_RxFyNhFyTbLmNzIgQxNkPlNelDppEudA`nAsVjb@aRbS_yD`gEcmBpvBuu@vt@uT`Vic@re@}_BdfBomC~tCslA~pAyRzSwiClsCyrBv{Bu~AfdBmTxUihDhrDml@tn@sYr[kSpRkPnMuPbM}V`Pqm@`^oV|MmxA|w@uYzOkm@v\\\\um@nb@oU|P{_@f^eRnSkZ|\\\\goA`uA_f@`h@oKhLeLlLkTlRePnNiTbOiz@pj@kl@p^qYrRoUxP{\\\\~Wue@td@mb@fe@_jAdnAaS`Ua|@v_Auc@xc@oZfUk^tSoV~L}dDdbBop@|a@wi@xd@gS~SkThXiN|RuU|^m|BdoEi\\\\vl@g[nc@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":3566.999},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to stay on Interstate 5 North, Golden State Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to stay on Interstate 5 North, Golden State Freeway.\",\"distanceAlongGeometry\":245}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,318],\"duration\":5.622,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.173,\"geometry_index\":646,\"location\":[-118.464607,34.288295]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,321],\"duration\":9.529,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.482,\"geometry_index\":648,\"location\":[-118.465732,34.289374]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":29.471,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":31.681,\"geometry_index\":649,\"location\":[-118.467594,34.291244]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.473351,34.297045],\"geometry_index\":651,\"admin_index\":0,\"weight\":18.937,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":17.566,\"bearings\":[141,321],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.476647,34.300365],\"geometry_index\":652,\"admin_index\":0,\"weight\":1.454,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":1.392,\"bearings\":[141,321],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":2.942,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.089,\"geometry_index\":653,\"location\":[-118.476922,34.300641]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,322],\"duration\":9.803,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.286,\"geometry_index\":654,\"location\":[-118.477508,34.30123]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":1.482,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.556,\"geometry_index\":655,\"location\":[-118.479427,34.303223]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":14.711,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.447,\"geometry_index\":656,\"location\":[-118.47971,34.303519]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.482548,34.306535],\"geometry_index\":657,\"admin_index\":0,\"weight\":27.578,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":25.808,\"bearings\":[142,321],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"bearings\":[148,329],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":662,\"location\":[-118.48721,34.311995]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden State Freeway\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 5 North / Golden State Freeway\"},\"distanceAlongGeometry\":3601.999}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take I 5 North/Golden State Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":318,\"bearing_before\":313,\"location\":[-118.464607,34.288295]},\"speedLimitSign\":\"mutcd\",\"name\":\"Golden State Freeway\",\"weight_typical\":137.115,\"duration_typical\":128.268,\"duration\":127.935,\"distance\":3601.999,\"driving_side\":\"right\",\"weight\":136.764,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"mixk`A|do}`FgSjUen@|n@{sBjsBef@re@kbId`IonE~lEgPdPyc@rc@q{B|vBoQtPo{DjpDamAxjA_@^mt@hq@au@vo@uyCnrBgrB`sA\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1.5 miles, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1.5 miles, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":2614.999},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to stay on Interstate 5 North, Golden State Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to stay on Interstate 5 North, Golden State Freeway.\",\"distanceAlongGeometry\":245}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":3.762,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.849,\"geometry_index\":663,\"location\":[-118.488555,34.313839]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":4.413,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.523,\"geometry_index\":664,\"location\":[-118.489103,34.314579]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,330],\"duration\":2.25,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.306,\"geometry_index\":665,\"location\":[-118.489749,34.315458]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,328],\"duration\":1.238,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.269,\"geometry_index\":666,\"location\":[-118.490077,34.31592]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,329],\"duration\":31.087,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":31.087,\"geometry_index\":667,\"location\":[-118.490262,34.316169]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.496616,34.321344],\"geometry_index\":678,\"admin_index\":0,\"weight\":17.758,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":17.708,\"bearings\":[125,305],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,306],\"duration\":7.59,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.393,\"geometry_index\":680,\"location\":[-118.500823,34.323775]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[134,320],\"duration\":6.587,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.423,\"geometry_index\":684,\"location\":[-118.502475,34.324919]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,328],\"duration\":12.913,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.267,\"geometry_index\":686,\"location\":[-118.503635,34.326125]},{\"bearings\":[158,338],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":691,\"location\":[-118.505183,34.328792]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden State Freeway\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 5 North / Golden State Freeway\"},\"distanceAlongGeometry\":2649.999}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to stay on I 5 North/Golden State Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":329,\"bearing_before\":329,\"location\":[-118.488555,34.313839]},\"speedLimitSign\":\"mutcd\",\"name\":\"Golden State Freeway\",\"weight_typical\":97.629,\"duration_typical\":98.876,\"duration\":101.048,\"distance\":2649.999,\"driving_side\":\"right\",\"weight\":99.7,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"}ejm`At}}~`Fgm@fa@}u@jg@{[nSqNpJe\\\\bTcf@h`@ya@|^ue@jg@eZf^}QtV{^xi@sJpPkMrTgJdQkaAfrBqdArwBkqAhmCiRr^iOrWuNhTeStXsg@`h@wa@l^oFnDuXrRuW`Osb@vRehAxb@srDfwA\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 36 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 36 miles.\",\"distanceAlongGeometry\":58074.98},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to stay on Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to stay on Interstate 5 North, Golden State Freeway.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to stay on Interstate 5 North, Golden State Freeway.\",\"distanceAlongGeometry\":245}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,337],\"duration\":40.31,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.268,\"geometry_index\":692,\"location\":[-118.506595,34.331666]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.5147,34.338099],\"geometry_index\":715,\"admin_index\":0,\"weight\":24.251,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":25.684,\"bearings\":[120,301],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[117,295],\"duration\":10.641,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.843,\"geometry_index\":718,\"location\":[-118.519255,34.340288]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.521308,34.340894],\"geometry_index\":723,\"admin_index\":0,\"weight\":73.198,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":80.794,\"bearings\":[104,283],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[115,295],\"duration\":8.809,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.928,\"geometry_index\":750,\"location\":[-118.541288,34.349997]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[115,295],\"duration\":53.923,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":48.531,\"geometry_index\":751,\"location\":[-118.543551,34.350885]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.554104,34.359653],\"geometry_index\":763,\"admin_index\":0,\"weight\":10.273,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.114,\"bearings\":[161,341],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,345],\"duration\":2.375,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.256,\"geometry_index\":766,\"location\":[-118.554925,34.362169]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,344],\"duration\":10.991,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.717,\"geometry_index\":767,\"location\":[-118.5551,34.362711]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.556124,34.365145],\"geometry_index\":770,\"admin_index\":0,\"weight\":48.332,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":48.351,\"bearings\":[155,334],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.562927,34.374976],\"geometry_index\":773,\"admin_index\":0,\"weight\":28.437,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.751,\"bearings\":[152,333],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,341],\"duration\":23.928,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":25.116,\"geometry_index\":775,\"location\":[-118.566432,34.380647]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,343],\"duration\":2.739,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.876,\"geometry_index\":777,\"location\":[-118.568576,34.385721]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[163,342],\"duration\":21.764,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.852,\"geometry_index\":778,\"location\":[-118.568805,34.386322]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-118.570279,34.390928],\"geometry_index\":781,\"admin_index\":0,\"weight\":22.638,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":21.579,\"bearings\":[170,349],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[169,349],\"duration\":8.459,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.086,\"geometry_index\":782,\"location\":[-118.571443,34.395675]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[169,349],\"duration\":18.367,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.737,\"geometry_index\":783,\"location\":[-118.571889,34.397582]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":16.04,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":16.842,\"geometry_index\":787,\"location\":[-118.573138,34.401567]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.574642,34.404947],\"geometry_index\":788,\"admin_index\":0,\"weight\":23.83,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":22.715,\"bearings\":[160,339],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.576838,34.409832],\"geometry_index\":790,\"admin_index\":0,\"weight\":28.234,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":26.432,\"bearings\":[160,339],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,339],\"duration\":17.491,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":18.366,\"geometry_index\":799,\"location\":[-118.579211,34.415566]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.581092,34.419266],\"geometry_index\":802,\"admin_index\":0,\"weight\":18.321,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":17.063,\"bearings\":[157,336],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,337],\"duration\":3.677,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.953,\"geometry_index\":803,\"location\":[-118.583032,34.422925]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":5.87,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.31,\"geometry_index\":804,\"location\":[-118.583443,34.423708]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":7.16,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.697,\"geometry_index\":805,\"location\":[-118.584092,34.424944]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.584863,34.426416],\"geometry_index\":806,\"admin_index\":0,\"weight\":2.581,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.956,\"bearings\":[157,336],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,337],\"duration\":6.736,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.241,\"geometry_index\":807,\"location\":[-118.585082,34.42683]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":1.858,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.997,\"geometry_index\":808,\"location\":[-118.585834,34.428266]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":12.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.545,\"geometry_index\":809,\"location\":[-118.586044,34.428665]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,317],\"duration\":1.839,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.023,\"geometry_index\":819,\"location\":[-118.587885,34.431039]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,316],\"duration\":11.528,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":12.392,\"geometry_index\":820,\"location\":[-118.588233,34.43135]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":26.485,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.787,\"geometry_index\":821,\"location\":[-118.590511,34.433295]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.595752,34.437745],\"geometry_index\":822,\"admin_index\":0,\"weight\":19.527,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":18.583,\"bearings\":[136,315],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-118.599968,34.440493],\"geometry_index\":830,\"admin_index\":0,\"weight\":28.444,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.757,\"bearings\":[123,302],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.606793,34.444036],\"geometry_index\":831,\"admin_index\":0,\"weight\":18.286,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":17.359,\"bearings\":[122,302],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.610876,34.446715],\"geometry_index\":841,\"admin_index\":0,\"weight\":24.289,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":23.216,\"bearings\":[144,325],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,332],\"duration\":2.911,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.983,\"geometry_index\":847,\"location\":[-118.614433,34.451299]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,336],\"duration\":34.357,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":34.35,\"geometry_index\":849,\"location\":[-118.614805,34.451912]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[9,189],\"duration\":114.301,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":111.425,\"geometry_index\":865,\"location\":[-118.615263,34.45997]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,328],\"duration\":24.895,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.254,\"geometry_index\":906,\"location\":[-118.617133,34.487125]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":15.289,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.9,\"geometry_index\":909,\"location\":[-118.621089,34.492404]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":2.047,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.996,\"geometry_index\":910,\"location\":[-118.623558,34.495717]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,329],\"duration\":14.4,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.04,\"geometry_index\":911,\"location\":[-118.623894,34.496159]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,341],\"duration\":292.207,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":270.285,\"geometry_index\":916,\"location\":[-118.625888,34.499345]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,321],\"duration\":25.077,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.935,\"geometry_index\":987,\"location\":[-118.66799,34.548523]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,344],\"duration\":6.559,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.739,\"geometry_index\":996,\"location\":[-118.670769,34.553034]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,333],\"duration\":22.5,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":19.688,\"geometry_index\":999,\"location\":[-118.67123,34.554169]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,311],\"duration\":17.329,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.141,\"geometry_index\":1005,\"location\":[-118.674304,34.557867]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,303],\"duration\":3.128,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.808,\"geometry_index\":1012,\"location\":[-118.678215,34.559873]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,307],\"duration\":40.72,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":36.648,\"geometry_index\":1014,\"location\":[-118.678917,34.560267]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,336],\"duration\":6.392,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.732,\"geometry_index\":1027,\"location\":[-118.686155,34.566944]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,334],\"duration\":6.25,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.625,\"geometry_index\":1028,\"location\":[-118.686856,34.568271]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,329],\"duration\":2.097,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.887,\"geometry_index\":1030,\"location\":[-118.68763,34.56954]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,328],\"duration\":20.64,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":18.576,\"geometry_index\":1031,\"location\":[-118.687927,34.56995]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[116,294],\"duration\":462.578,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":404.739,\"geometry_index\":1038,\"location\":[-118.692175,34.572895]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":24.512,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.441,\"geometry_index\":1148,\"location\":[-118.753769,34.650821]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[0,181],\"duration\":50.912,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":44.53,\"geometry_index\":1155,\"location\":[-118.754531,34.656112]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,322],\"duration\":22.25,\"turn_duration\":0.009,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":19.461,\"geometry_index\":1171,\"location\":[-118.761729,34.665038]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,323],\"duration\":160.694,\"turn_duration\":0.036,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":140.576,\"geometry_index\":1179,\"location\":[-118.765001,34.669939]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,340],\"duration\":13.543,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.844,\"geometry_index\":1233,\"location\":[-118.794512,34.704675]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":2.103,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.84,\"geometry_index\":1235,\"location\":[-118.795912,34.707855]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":13.361,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.691,\"geometry_index\":1236,\"location\":[-118.796132,34.708353]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,341],\"duration\":157.871,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":138.131,\"geometry_index\":1237,\"location\":[-118.797559,34.711612]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[1,183],\"duration\":1.125,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":1.013,\"geometry_index\":1260,\"location\":[-118.79544,34.748359]},{\"bearings\":[0,181],\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"geometry_index\":1261,\"location\":[-118.795435,34.748628]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden State Freeway\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 5 North / Golden State Freeway\"},\"distanceAlongGeometry\":58109.98}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to stay on I 5 North/Golden State Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":337,\"bearing_before\":338,\"location\":[-118.506595,34.331666]},\"speedLimitSign\":\"mutcd\",\"name\":\"Golden State Freeway\",\"weight_typical\":1975.393,\"duration_typical\":2118.145,\"duration\":2276.43,\"distance\":58109.98,\"driving_side\":\"right\",\"weight\":2117.475,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"c`mn`Adea`aFu\\\\lNiOxHmNfIwM|HwMvK_L~H{LbLmMfLgYvXyKfM}JdMgIxKgJnN}JlOiIhNykAxrBmIbOmK~RcJjQ{HbPgH`P{HxQgb@liAuqBpiF}IbVeJ~Y{GdVsG`X}FxYwEbYuDbZsCrW{BpVyTrcDgBrToCzV}CzUgDbUqFtXkGxXkKl^_JxW_JxVaNjZuNdZw]|j@{b@ri@of@jd@kd@t`@a]~\\\\aVbZmSjYiRl[{Pz[aPr^iNn_@kU~v@saCvsIov@llCkq@raCsMv_@oNn\\\\gTjb@aVb^qQtWyxFppGm^jZoi@p]ea@dTo]~NeOxEcK`DkiAvTweAnW{`@|IaoAl[}i@vQc\\\\xO_]rPelFxwDgzIv}EgpIfrEePxFurExxAmhBdk@qd@hMocBfg@acAjZivBnWugHvgAevBzZarBlZkn@nMuc@|L}p@dUgrE~|Ag|D~tAasBfr@agBvn@oWtIyUnHuV`H}V|GqnA|\\\\_YfIuZ~IcYdJkZlKoZdLkoD|zAucFfxB}o@tXglApg@_{Ado@{XtLwxA~m@}WbLsSxIiNtG}MnHcLlH{LrIcLvIoMxKsMnLaMrLeMhNmRvTqxBjmCcuGpfIae@`m@qQbWkPxV}NpViNfWaNxX}MvYoc@bdAm|EpiLcXto@wTzh@cMbYeM|ViMzTsMrSwOnTkPpRiOtR{KhJmAnAaY|S}QdNmgEzyCoQfMcSpMuQ`KsRdJuVxKgTzHyTdH{VvGwX`GkVdEmV~C{UnBqWrAsWt@oYUuT@sWgAaXsBqWqC}pC_[}WwCeXeBqWu@qWOoXZiXrAeX|BuWhDqWzEeWdGsWtHyu@fUsVnG_WdFmW`EgT`CmW`BsWz@_WDsW_@{WqA}WiCkUsCw~NmrB_d@iE{d@aC_e@gAsb@?_e@jAmc@zBkc@lEm_@~E{b@dIgb@fK{a@xL{`@nNa^jOk]|Pe\\\\tQc[dSwj@f_@uzB|{AojDl_Cwa@zXanEhyCsZ~SwvAb`AgYlP_YvMc\\\\jM_]|Kmj@fQiY~JkXnLoXrMiUdN{RvMuWjTsLfKaW`VsShXedArrAwUxXcU|TcU|QaYdTkkCfeBq{CtuB{i@j\\\\qwG|vDsVxPuUtSgTvTsRnWcPbYgQd`@oYjx@oQzd@sMbY_QnYecAzyAcUbXcUbV_WnT}UlQqWbNmmTddIkXjMaWlOgRrN}BdB}U`TmSdUwQbWqUx^qVd]wQzRoPdOkS|Ogq@z`@kUvOcUvQqTnUoQlUwPjZkOjVkNdSsNpQsP~QyrCzbCoYdXuXxXc|Ap_BiRlTiRlV_OdUoNbVigA~oBmSb\\\\sRnY_TnX}UlXgWnVuUvR_iAt{@iWlPiWlM}X`KwY`I}ZjFw^jGkXvGsU~G}U`JeVlMuUvOo`CrfBmSbQiRvR_OlRcPxV_LxSgLbWqJbWue@ntAsMn^cPpa@kOb]gGvL}MnWuNlVec@hv@kr@dpAm`@to@eXje@kWx]gWtZw_@|\\\\eb@|Xq]rR}WlMmcAl_@}qAxj@am@`Zg`@hTsXpQ}V`Q_SfSof@xl@u[`g@qYth@qWzo@ySvq@keB|vG_Lp_@iMf]gU~h@gXnc@_d@zp@aa@|c@gb@j[uy@~q@_{@fn@iZbVeYnYsWx[{Zpc@iqDbyFcPbWgRlWmr@ro@uY|UuZ|Qic@nUwe@rPiHjBgd@nLaq@zJgZfCaQ`@wgAhCyv@YcYw@wmLal@iKi@ih@yB_n@oAi`AjEcfD~b@qo@hK}l@jDq^z@e^Ig|C^m`@`@qo@~Dyu@hMyl@~Omj@lTaa@`Qia@jQo{HhnDerBr`AkrBv_A_[vO_RdKwXzPaVfP_SjNuSvQk]n]sXn\\\\{g@~q@cg@xq@mS|b@eXtl@cO|WqT`YgS~WmWbXeRxQ}TjQ_W`SwUfTkk@`j@wShTaSfTu]p_@iVpZmPtToNpVeQl]}Ovb@yMr_@iOfg@mO`o@wCrPyAxQkB|u@_@b_BgB``AgCvp@uD`h@{Fhf@gLxo@{Jpd@gLvb@iPnd@cKbVmbDnmHeKbTqKzRsQjZgThZySvWcV~UyZvXg^vYqPdKmQdI_`@tPm[~Ku{MrmEm\\\\vKem@lQcc@pGgj@|Eeg@fBi`CgAeEA{T?y`@vB{m@jGul@zLml@xQcr@vZyr@jf@on@xk@kf@pl@uYxd@ij@~`Ag_@|p@iPbZcQpWgH|JmZd]yg@pe@e^jVaW|Nud@dUwt@h\\\\we@dUwe@dWih@v[}OfNgVnViTrUsR~VgRxWeSl[}MnYmPx`@aLj\\\\gKr]eJ`^{G`\\\\{Fn\\\\cF~Z{J~l@mHhb@uG|^_Hh\\\\iIr[uIxX{IpUkQfc@kTla@_Tn]_Zl`@}VjWcYxWeX|Ti_@|Ui^rQm\\\\hOct@fWc]dOa_@lSu]`V_UnQqhL`wJ_TtP_T~NmT`NkU`MqV|KquMv~FaXvKkYpKgZrI}[fIqpCbn@{YxGsYzHmYnIyXjIqXzIwgA|]o{A`h@giBlm@c^vLujEdxAgW`IiZjHeYjFkXjDgZ`C}XtAwWr@c{P|j@mi@tAgg@t@wd@Hed@Smf@_Acf@wAel@_Duf@kDwg@uE{~]arDiBSih@kEuf@aD}n@uCqx@kByOIcf@?qe@HaaIjFutAx@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 22 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 22 miles.\",\"distanceAlongGeometry\":35760.992},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep right to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep right to stay on Interstate 5 North.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to stay on Interstate 5 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to stay on Interstate 5 North.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to stay on Interstate 5 North.\",\"distanceAlongGeometry\":226}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[179,359],\"duration\":8.154,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.333,\"geometry_index\":1265,\"location\":[-118.795587,34.756395]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[175,352],\"duration\":3.097,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.787,\"geometry_index\":1269,\"location\":[-118.795698,34.758325]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,349],\"duration\":2.336,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.103,\"geometry_index\":1271,\"location\":[-118.795834,34.759038]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[169,347],\"duration\":11.31,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.159,\"geometry_index\":1272,\"location\":[-118.795961,34.759576]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,335],\"duration\":2.55,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.295,\"geometry_index\":1277,\"location\":[-118.797007,34.762137]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":13.538,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.184,\"geometry_index\":1278,\"location\":[-118.797319,34.762687]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,334],\"duration\":3.019,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.7,\"geometry_index\":1280,\"location\":[-118.798991,34.765628]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,332],\"duration\":2.1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.89,\"geometry_index\":1281,\"location\":[-118.799378,34.766275]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,332],\"duration\":14.703,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.233,\"geometry_index\":1282,\"location\":[-118.799668,34.76672]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.801888,34.769686],\"geometry_index\":1288,\"admin_index\":0,\"weight\":161.373,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":183.874,\"bearings\":[145,324],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[99,279],\"duration\":17.522,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.326,\"geometry_index\":1325,\"location\":[-118.846715,34.794443]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[99,279],\"duration\":2.194,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.92,\"geometry_index\":1326,\"location\":[-118.852187,34.795153]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[99,279],\"duration\":19.643,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.188,\"geometry_index\":1327,\"location\":[-118.852879,34.795241]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[99,278],\"duration\":66.396,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":59.737,\"geometry_index\":1329,\"location\":[-118.858952,34.796016]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":56.175,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":50.558,\"geometry_index\":1343,\"location\":[-118.875914,34.80217]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[6,184],\"duration\":16.998,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":15.291,\"geometry_index\":1359,\"location\":[-118.884484,34.813056]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[40,220],\"duration\":1.015,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":0.913,\"geometry_index\":1369,\"location\":[-118.882044,34.817356]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[40,220],\"duration\":11.483,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":10.334,\"geometry_index\":1370,\"location\":[-118.881824,34.817569]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[41,220],\"duration\":21.088,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":18.973,\"geometry_index\":1371,\"location\":[-118.879194,34.820099]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[40,221],\"duration\":26.69,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":24.002,\"geometry_index\":1374,\"location\":[-118.87486,34.824251]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.869695,34.829202],\"geometry_index\":1377,\"admin_index\":0,\"weight\":8.229,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":8.608,\"bearings\":[40,221],\"out\":0,\"in\":1,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[41,220],\"duration\":55.647,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":50.076,\"geometry_index\":1378,\"location\":[-118.868085,34.830783]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":95.095,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":85.58,\"geometry_index\":1399,\"location\":[-118.864214,34.841577]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,323],\"duration\":47.389,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":42.649,\"geometry_index\":1408,\"location\":[-118.879833,34.862656]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":2.527,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.274,\"geometry_index\":1412,\"location\":[-118.889384,34.872127]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":11.697,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.521,\"geometry_index\":1413,\"location\":[-118.889897,34.87263]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":1.827,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.592,\"geometry_index\":1415,\"location\":[-118.891927,34.874622]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,317],\"duration\":8.462,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.386,\"geometry_index\":1416,\"location\":[-118.892254,34.874939]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.893804,34.876255],\"geometry_index\":1418,\"admin_index\":0,\"weight\":69.406,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":78.771,\"bearings\":[135,312],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,302],\"duration\":141.723,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":124.001,\"geometry_index\":1440,\"location\":[-118.911126,34.890157]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-118.923023,34.922652],\"geometry_index\":1487,\"admin_index\":0,\"weight\":69.287,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":78.633,\"bearings\":[16,196],\"out\":0,\"in\":1,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,330],\"duration\":5.4,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.725,\"geometry_index\":1503,\"location\":[-118.928862,34.938097]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,334],\"duration\":3.16,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.765,\"geometry_index\":1504,\"location\":[-118.929557,34.939102]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,331],\"duration\":8.232,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.185,\"geometry_index\":1505,\"location\":[-118.929939,34.939739]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[160,340],\"duration\":20.395,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.838,\"geometry_index\":1511,\"location\":[-118.930873,34.941395]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,345],\"duration\":113.889,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":99.636,\"geometry_index\":1518,\"location\":[-118.932392,34.945903]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,344],\"duration\":3.639,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.275,\"geometry_index\":1523,\"location\":[-118.94037,34.971213]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,346],\"duration\":48.169,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":43.353,\"geometry_index\":1524,\"location\":[-118.940644,34.972022]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,345],\"duration\":14.961,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.458,\"geometry_index\":1526,\"location\":[-118.943968,34.982739]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,345],\"duration\":27.007,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.3,\"geometry_index\":1527,\"location\":[-118.945047,34.98602]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,345],\"duration\":37.779,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":34.925,\"geometry_index\":1529,\"location\":[-118.946877,34.992032]},{\"bearings\":[165,345],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":1531,\"location\":[-118.94936,34.999677]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-5\",\"type\":\"icon\",\"text\":\"I 5\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"I 5 North\"},\"distanceAlongGeometry\":35795.992}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to stay on I 5 North/Golden State Freeway.\",\"modifier\":\"slight left\",\"bearing_after\":359,\"bearing_before\":359,\"location\":[-118.795587,34.756395]},\"speedLimitSign\":\"mutcd\",\"name\":\"Golden State Freeway\",\"weight_typical\":1141.438,\"duration_typical\":1282.112,\"duration\":1328.865,\"distance\":35795.992,\"driving_side\":\"right\",\"weight\":1182.333,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"uqjhaAdsuqaFqk@ZsXj@sX~@yWtAqU~B_UnCs`@|Fo_@jHs`@vJa`@vL}^jN}[bNka@nRm}CxxAkXtMmg@dWyZbQua@vUo_@xUe\\\\xTi]lVi]dWk[vVay@~r@}[xZ}[d\\\\s[d]yZb]s[d_@_Zz^sXz^o\\\\zd@yZpd@qXdc@_Wza@iXff@_Wre@ubL`zTmcEnfIq]|o@qY`h@_CdE}^hm@}[pf@qnDvfFoS~Y_RnZ}Pn\\\\wOb\\\\eNd\\\\{Mz^wLn_@qJn^mIp`@qGn_@mFz`@aEdd@}B``@yZjjF_]|bFkk@~tIoDfj@aSpvCk[~bFsz@vyNcCd`@yDz`@{Ed]uFn[oIn_@yJd]yJlYaMzYmNbYiPxXeQxVkR~V_uDzrEm_InvJ_VhY}SlTeUxRqTlPeT`NsUlLyUvJsXtIcY`HmY`F{XtDaXjBuY^sX?eW_AuYuBs[wE}[aHs[kK{XaLcYmNc[cSkYmU}VcVmXmYiLwLc}CkcD}j@km@aaEciEoTkUcaCkfCccBkfBenAasAyaBscBmqEizEwTcUmQwOqRaNoRcLmQaJcSuH{SaHqUaFgWuDsVuBaXi@{XHwW~AiX`DwX`FkW~HmWvJsPfImQjKmj@d_@kgFthDcpDfaCwo@pc@ovAjaAqcCz_B{tNnnJum@xa@ml@zb@cl@fe@if@zb@y`@x_@wd@rd@a`NriNm^`_@csAbtAkg@vh@yRlSmo@~u@y`@zh@g\\\\lf@kvAzyBu]zg@}Yl[{YjZm\\\\nW_`@xVeb@lUqvCvgAg]lS}VlPom@ri@aVb[mNhTgA`BwX`j@wn@f~Aus@xoBsz@`pBkc@|gAcWpo@y]l|@wKtWmKzU_LnUeNvYiy@nwA{PxYo{@dxAgs@bmAo|AlhC}QxWiMlPiPxPsP`QaSxOyOvL{SvOwTvLyXvKuV|LiSvHk^nJkYjFeWtCcVjCmnAjMquGzl@_XtBoe@jBsf@Uu\\\\uAg|CcTs_AkF}S`@aQ\\\\g|@~Igj@xFsxAlQi\\\\rCuE`@{f@jCin@^ii@k@}r@_Dgs@wG{c@kGyf@wJkoAkZo}Ai_@}_@uGe\\\\aF}\\\\_Ca^Ig`@^m\\\\tA{[~B_[tEu\\\\`Ie\\\\vJw]`NkYbNcY`QcfK|kG{}A|~@y}@lj@yf@zVgYvPsMbHyMlGcOfGiOzFkN|EeNzEsNrE_OjE_NjDqOrD{NdDozDzy@s~MzvC}aCzg@}lE``Am_JdnB}{Kr`Cqq@bPytJdpB_gHp}AalElbAkvGfxAk_BbXqxHpeBgcDrs@wmB`b@g{EzeAqiA|U\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 183 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 183 miles.\",\"distanceAlongGeometry\":294145.156},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Take exit 4 o3B.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Take exit 4 o3B.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Take exit 4 o3B.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Take exit 4 o3B.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Take exit 4 o3B onto California 1 52 West toward Gilroy, Hollister.</prosody></amazon:effect></speak>\",\"announcement\":\"Take exit 4 o3B onto California 1 52 West toward Gilroy, Hollister.\",\"distanceAlongGeometry\":276.222}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,350],\"duration\":54.25,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":50.172,\"geometry_index\":1534,\"location\":[-118.951422,35.006166]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,316],\"duration\":9.02,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.569,\"geometry_index\":1553,\"location\":[-118.954517,35.017759]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,315],\"duration\":173.756,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":160.724,\"geometry_index\":1554,\"location\":[-118.956226,35.01919]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,319],\"duration\":34.302,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.865,\"geometry_index\":1568,\"location\":[-118.995428,35.056093]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.00197,35.062213],\"geometry_index\":1569,\"admin_index\":0,\"weight\":111.2,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":123.007,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":31.135,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":28.015,\"geometry_index\":1576,\"location\":[-119.033099,35.091304]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":333.265,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":299.932,\"geometry_index\":1577,\"location\":[-119.039277,35.097097]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,318],\"duration\":43.896,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":39.5,\"geometry_index\":1587,\"location\":[-119.106053,35.157581]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,318],\"duration\":68.662,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":61.79,\"geometry_index\":1588,\"location\":[-119.114496,35.165218]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,318],\"duration\":3.786,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.407,\"geometry_index\":1591,\"location\":[-119.130362,35.179587]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[138,317],\"duration\":136.029,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":119.025,\"geometry_index\":1592,\"location\":[-119.131114,35.180261]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,318],\"duration\":34.55,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.214,\"geometry_index\":1597,\"location\":[-119.15829,35.205025]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.165065,35.2114],\"geometry_index\":1600,\"admin_index\":0,\"weight\":259.177,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":295.638,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":22.77,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":19.917,\"geometry_index\":1614,\"location\":[-119.219535,35.26265]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.223937,35.266748],\"geometry_index\":1615,\"admin_index\":0,\"weight\":15.266,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":16.882,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.227205,35.269789],\"geometry_index\":1617,\"admin_index\":0,\"weight\":99.758,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":113.446,\"bearings\":[139,319],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":42.907,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":38.61,\"geometry_index\":1622,\"location\":[-119.24856,35.289892]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.25688,35.2976],\"geometry_index\":1624,\"admin_index\":0,\"weight\":22.952,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":25.686,\"bearings\":[139,314],\"out\":1,\"in\":0,\"turn_duration\":0.026,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[134,312],\"duration\":4.97,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.348,\"geometry_index\":1626,\"location\":[-119.262176,35.301784]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,314],\"duration\":314.579,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":275.256,\"geometry_index\":1627,\"location\":[-119.263221,35.302546]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":41.107,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":36.99,\"geometry_index\":1636,\"location\":[-119.330857,35.35152]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.339968,35.357984],\"geometry_index\":1637,\"admin_index\":0,\"weight\":230.743,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":255.832,\"bearings\":[131,311],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,311],\"duration\":3.99,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.574,\"geometry_index\":1647,\"location\":[-119.39644,35.398428]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,313],\"duration\":14.547,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.092,\"geometry_index\":1648,\"location\":[-119.397326,35.399061]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.400536,35.401472],\"geometry_index\":1651,\"admin_index\":0,\"weight\":75.152,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":82.955,\"bearings\":[133,312],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,312],\"duration\":29.707,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.473,\"geometry_index\":1654,\"location\":[-119.419052,35.415029]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.425835,35.419971],\"geometry_index\":1655,\"admin_index\":0,\"weight\":106.967,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":118.304,\"bearings\":[132,312],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,312],\"duration\":114.546,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":103.085,\"geometry_index\":1657,\"location\":[-119.452831,35.439649]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,312],\"duration\":223.737,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":201.356,\"geometry_index\":1662,\"location\":[-119.478497,35.458283]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,319],\"duration\":33.273,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.77,\"geometry_index\":1667,\"location\":[-119.530561,35.49629]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[139,319],\"duration\":498.29,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":448.454,\"geometry_index\":1669,\"location\":[-119.537298,35.502526]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":8.496,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.646,\"geometry_index\":1682,\"location\":[-119.638597,35.59886]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":55.249,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":49.724,\"geometry_index\":1683,\"location\":[-119.640187,35.600535]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,330],\"duration\":39.725,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":36.738,\"geometry_index\":1687,\"location\":[-119.649614,35.61164]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.655373,35.619469],\"geometry_index\":1690,\"admin_index\":0,\"weight\":415.659,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":448.828,\"bearings\":[149,329],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":33.001,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.52,\"geometry_index\":1698,\"location\":[-119.735986,35.727761]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":832.02,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":769.611,\"geometry_index\":1699,\"location\":[-119.741062,35.734607]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,320],\"duration\":147.748,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":132.956,\"geometry_index\":1736,\"location\":[-119.87684,35.900394]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":25.928,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.68,\"geometry_index\":1752,\"location\":[-119.909371,35.932181]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,323],\"duration\":135.345,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":118.408,\"geometry_index\":1760,\"location\":[-119.914451,35.937173]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,320],\"duration\":3.08,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.695,\"geometry_index\":1766,\"location\":[-119.941099,35.963155]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,321],\"duration\":78.686,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":70.817,\"geometry_index\":1767,\"location\":[-119.941695,35.963725]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,319],\"duration\":15.913,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.11,\"geometry_index\":1773,\"location\":[-119.956852,35.978553]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,322],\"duration\":3.674,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.49,\"geometry_index\":1775,\"location\":[-119.959989,35.981498]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,320],\"duration\":22.702,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.567,\"geometry_index\":1776,\"location\":[-119.960674,35.982195]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-119.96496,35.986532],\"geometry_index\":1779,\"admin_index\":0,\"weight\":510.284,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":551.126,\"bearings\":[142,324],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[127,307],\"duration\":28.696,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":25.821,\"geometry_index\":1821,\"location\":[-120.098461,36.074854]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.105103,36.079352],\"geometry_index\":1828,\"admin_index\":0,\"weight\":32.78,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":34.905,\"bearings\":[138,318],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,322],\"duration\":29.729,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":26.738,\"geometry_index\":1831,\"location\":[-120.111459,36.086163]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.116872,36.092051],\"geometry_index\":1833,\"admin_index\":0,\"weight\":6.832,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":7.244,\"bearings\":[143,324],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,323],\"duration\":1.727,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.511,\"geometry_index\":1834,\"location\":[-120.118158,36.093486]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,323],\"duration\":202.335,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":177.043,\"geometry_index\":1835,\"location\":[-120.118475,36.093823]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,324],\"duration\":18.08,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.813,\"geometry_index\":1839,\"location\":[-120.154856,36.133629]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.15814,36.137224],\"geometry_index\":1840,\"admin_index\":0,\"weight\":130.968,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":149.113,\"bearings\":[144,324],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,325],\"duration\":2.976,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.604,\"geometry_index\":1842,\"location\":[-120.184975,36.166549]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,323],\"duration\":46.91,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":41.047,\"geometry_index\":1843,\"location\":[-120.185498,36.167145]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,324],\"duration\":2.932,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.565,\"geometry_index\":1844,\"location\":[-120.193974,36.176353]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,323],\"duration\":20.808,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":18.207,\"geometry_index\":1845,\"location\":[-120.194487,36.176927]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,332],\"duration\":1.947,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.703,\"geometry_index\":1849,\"location\":[-120.197819,36.181358]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,333],\"duration\":222.012,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":194.261,\"geometry_index\":1850,\"location\":[-120.198099,36.181775]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,334],\"duration\":2.227,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.948,\"geometry_index\":1855,\"location\":[-120.229166,36.23118]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,333],\"duration\":80.932,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":70.815,\"geometry_index\":1856,\"location\":[-120.229464,36.231663]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,332],\"duration\":23.162,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.828,\"geometry_index\":1859,\"location\":[-120.24148,36.250751]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.244671,36.255792],\"geometry_index\":1861,\"admin_index\":0,\"weight\":9.294,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":9.779,\"bearings\":[153,333],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.246003,36.257931],\"geometry_index\":1862,\"admin_index\":0,\"weight\":139.589,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":154.55,\"bearings\":[153,333],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,333],\"duration\":26.714,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.035,\"geometry_index\":1866,\"location\":[-120.26727,36.29161]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.270941,36.297432],\"geometry_index\":1869,\"admin_index\":0,\"weight\":241.218,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":275.125,\"bearings\":[153,332],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,322],\"duration\":1.8,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.575,\"geometry_index\":1884,\"location\":[-120.31928,36.352243]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,324],\"duration\":218.7,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":191.362,\"geometry_index\":1885,\"location\":[-120.319607,36.352586]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,325],\"duration\":1.721,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.505,\"geometry_index\":1892,\"location\":[-120.360781,36.398653]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,324],\"duration\":96.264,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":84.231,\"geometry_index\":1893,\"location\":[-120.361129,36.399052]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,323],\"duration\":2.25,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.969,\"geometry_index\":1896,\"location\":[-120.378544,36.418562]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,324],\"duration\":74.094,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":64.832,\"geometry_index\":1897,\"location\":[-120.378953,36.418994]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,323],\"duration\":22.633,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":19.786,\"geometry_index\":1899,\"location\":[-120.39208,36.433713]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.39607,36.438081],\"geometry_index\":1901,\"admin_index\":0,\"weight\":166.364,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":195.141,\"bearings\":[144,324],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,325],\"duration\":2.325,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.977,\"geometry_index\":1914,\"location\":[-120.433244,36.478334]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,325],\"duration\":10.35,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.798,\"geometry_index\":1915,\"location\":[-120.433709,36.478872]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,325],\"duration\":86.182,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":73.249,\"geometry_index\":1916,\"location\":[-120.435471,36.480909]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,321],\"duration\":1.93,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.688,\"geometry_index\":1923,\"location\":[-120.450587,36.497579]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":169.386,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":148.212,\"geometry_index\":1924,\"location\":[-120.450958,36.497943]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":24.51,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.052,\"geometry_index\":1931,\"location\":[-120.484766,36.528563]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":386.37,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":347.727,\"geometry_index\":1933,\"location\":[-120.49018,36.532684]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":1.47,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.322,\"geometry_index\":1946,\"location\":[-120.574117,36.596092]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":29.564,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":26.608,\"geometry_index\":1947,\"location\":[-120.574446,36.59634]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,313],\"duration\":22.882,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.587,\"geometry_index\":1949,\"location\":[-120.581997,36.602059]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,312],\"duration\":162.228,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":141.942,\"geometry_index\":1953,\"location\":[-120.587872,36.606459]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":33.142,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":28.993,\"geometry_index\":1964,\"location\":[-120.620048,36.636178]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":30.864,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27,\"geometry_index\":1965,\"location\":[-120.625348,36.643073]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":11.094,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.707,\"geometry_index\":1966,\"location\":[-120.630276,36.6495]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":3.27,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.86,\"geometry_index\":1967,\"location\":[-120.63205,36.651813]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,329],\"duration\":149.657,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":130.95,\"geometry_index\":1968,\"location\":[-120.632577,36.652496]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,328],\"duration\":3.583,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.118,\"geometry_index\":1975,\"location\":[-120.656471,36.683678]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,328],\"duration\":16.291,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.255,\"geometry_index\":1976,\"location\":[-120.657044,36.684426]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,327],\"duration\":403.801,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":353.31,\"geometry_index\":1977,\"location\":[-120.659668,36.687852]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":27.345,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.604,\"geometry_index\":1989,\"location\":[-120.721477,36.774401]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":112.867,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":98.753,\"geometry_index\":1990,\"location\":[-120.725455,36.780126]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":1.983,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.735,\"geometry_index\":1991,\"location\":[-120.742397,36.804808]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":194.657,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":170.325,\"geometry_index\":1992,\"location\":[-120.742689,36.805237]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":25.133,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.613,\"geometry_index\":1993,\"location\":[-120.77136,36.846943]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":15.261,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.729,\"geometry_index\":1994,\"location\":[-120.775032,36.852267]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,330],\"duration\":23.604,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.244,\"geometry_index\":1995,\"location\":[-120.77726,36.855497]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":31.146,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.246,\"geometry_index\":1999,\"location\":[-120.780715,36.860501]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.785235,36.867115],\"geometry_index\":2000,\"admin_index\":0,\"weight\":67.71,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":76.818,\"bearings\":[151,331],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[151,331],\"duration\":24.889,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.771,\"geometry_index\":2005,\"location\":[-120.796924,36.884062]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[148,325],\"duration\":5.225,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.571,\"geometry_index\":2009,\"location\":[-120.801348,36.890117]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,323],\"duration\":1.139,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.996,\"geometry_index\":2010,\"location\":[-120.80242,36.891319]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,325],\"duration\":89.412,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":78.235,\"geometry_index\":2011,\"location\":[-120.802633,36.891543]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,325],\"duration\":37.696,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":32.979,\"geometry_index\":2018,\"location\":[-120.818261,36.909483]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":23.158,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.245,\"geometry_index\":2023,\"location\":[-120.825544,36.916602]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,321],\"duration\":38.91,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":35.012,\"geometry_index\":2025,\"location\":[-120.830285,36.920645]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,319],\"duration\":22.537,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.267,\"geometry_index\":2028,\"location\":[-120.837799,36.928022]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.842402,36.93212],\"geometry_index\":2031,\"admin_index\":0,\"weight\":125.637,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":139.062,\"bearings\":[136,316],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,317],\"duration\":5.187,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.662,\"geometry_index\":2043,\"location\":[-120.872115,36.956447]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,315],\"duration\":1.727,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.554,\"geometry_index\":2045,\"location\":[-120.873204,36.957369]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,316],\"duration\":287.676,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":251.717,\"geometry_index\":2046,\"location\":[-120.87358,36.957667]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,322],\"duration\":1.249,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.093,\"geometry_index\":2092,\"location\":[-120.928514,37.01429]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":49.284,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":43.124,\"geometry_index\":2093,\"location\":[-120.928749,37.01453]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":14.121,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.349,\"geometry_index\":2103,\"location\":[-120.939377,37.02554]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,324],\"duration\":1.559,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.364,\"geometry_index\":2106,\"location\":[-120.942435,37.028685]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,322],\"duration\":43.801,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":38.325,\"geometry_index\":2107,\"location\":[-120.942709,37.028987]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":50.82,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":44.461,\"geometry_index\":2115,\"location\":[-120.950748,37.037288]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,320],\"duration\":1.439,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.296,\"geometry_index\":2120,\"location\":[-120.960094,37.046906]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,323],\"duration\":33.242,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":29.918,\"geometry_index\":2121,\"location\":[-120.960368,37.047165]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,322],\"duration\":15.582,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.005,\"geometry_index\":2124,\"location\":[-120.966304,37.053353]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-120.969088,37.056197],\"geometry_index\":2125,\"admin_index\":0,\"weight\":1.531,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":1.164,\"bearings\":[142,321],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"bearings\":[141,324],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":2126,\"location\":[-120.969287,37.056395]}],\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Gilroy\"},{\"type\":\"text\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Hollister\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Gilroy / Hollister\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"403B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-152\",\"type\":\"icon\",\"text\":\"CA 152\"},{\"type\":\"text\",\"text\":\"West\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Exit 403B CA 152 West\"},\"distanceAlongGeometry\":294182.812}],\"destinations\":\"I 5 North\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to stay on I 5 North.\",\"modifier\":\"slight right\",\"bearing_after\":350,\"bearing_before\":346,\"location\":[-118.951422,35.006166]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":9035.988,\"duration_typical\":10106.535,\"duration\":10602.092,\"distance\":294182.812,\"driving_side\":\"right\",\"weight\":9479.526,\"mode\":\"driving\",\"ref\":\"I 5 North\",\"geometry\":\"klrwaAz~e{aFaoAnPkt@`Hga@zEiR`@}b@Sac@qBqb@MocA}Aka@X}q@nEea@hFi`@nIu_@fKe_@pM_^jQa]tS{[~UsZdXgYhZmxAxiB_fDtmEwcHpaJ{eEvpF_aBvuB}@jAsp@n{@qq@hy@k~@|bAu_Aj~@ubCxvBodLfdKw}JfjJ{oEj|EymDduDo}JzwKatJllKykNvrOqGbHcRhSgtHhhIouK`oL{oEp`FaiJbaKsdAfiAkiN||OobK|iLynPdgRwdKnnL}aKdlLkkLxyMeaJddKmfMd|NgaGhwGi|MtnOqgOp_Qm@r@awJl|Kci@~m@uiE~dFeaIfaJ_zFbvGmfGzaHm{Nf_Psq@rw@_aG~lGyxAx_BozDfiE_jI||IqhF|yFsJnKezFfhGarFh`GyrHjfIsjF|wFmrG`bHae@lj@gzEfjFofG|sGe_IbwIi|G`jHc_GbrGuGhHktD|aEmvCr`DklGj}GuyF|lGyhGxvGc~H|oIylDtyD}rHhlIoxBjyC_kCroDsn@h`AazKnmOsjJpaN}}I|jNoAnBueL`qQy|HdaMgaMpvRsuHlxLknLn|Q_sKlxP{eFvgI}iJz~NygJ`|NeCzDcoKpmPkfJroNg}EprHihErxGycHzpKa|At~Bqf@jv@m|@fqAyq@xbAme@pq@g_DtxE}`E|lGclNr|S{sH|fLoRxYkyd@l{r@o_ChoDcfAhaBgrHtgL}iHrxKyeJdnNujv@ngkAceMrrRam@b{@ef@ll@k_AhoAozEhkFgiDvwD{lAzrAslHhgIczFxqG{tQthSkrLfwMkuDbiEop]zc`@efU~gW}zU~yW{xBprBcjYxhXgzMbfMwxHvqHugBjbB}lHn|GydAny@g~@hp@abGzbE_bBhfAcgHzyEe}AvdAca\\\\pqT_km@fqa@}vYfyRgpz@dmk@}VzPebJdhGsvTtbOeeOhaK{jLf|H}~F~~Diil@fz`@oub@vrYw_RlfMearAva}@_~EbrDmvDhrCqhC`oBwhCtmB{fCfmBekIloGeo@bj@{xFhmFoeFttE{xG`mGkbBxzAklCxbCa|F~pFayAjtA}rDthDcmAbkAsrAbmAuaCb}BksFzdFksB|lBoUfTumChjCig@jh@ox@py@az@jy@u`AzbAqaFpfF_]t]q^h^epArrAmz@~|@gs@`t@iZxZav@`w@is@vu@_w@`v@upAzsAacBhiBiAlAy{Dj~DgcBndBifBvfBw|A|~AukDjoDewCd{CweItlIqyEd_Fs~FzeGmbAbdAi`@~_@g^p^y`@h_@{m@dq@}g@di@kh@lj@_PtNkV~TaWrU{jDbuDunJdwJcbGtiGwhWzzWsb@fd@aoAxmAusCryCaxBzzBozDh_EkfC`gCa}FrdGaiA`oA_mB~rBqj@xi@iuArxAmmAhkAiiB|dBscBtxA_rAljAk_Cx_Ce_D~uCayAfvAq`DlxC_aBd{AshCldCcmAjfAcdB|fBm{AbrBsaAnaBa~ClxFim@`gAwyB`~DelD~jG}tHv~MuhDzfG}zB|~D{v@dvAo~CvtFs{AheDqv@fbB}z@nkB}Or]_z@riBmxC|uGybD`jH{wDrmI{lD~_I}eD|oHuuDlrHkeF~~JysCnvFqyFr}KkeCb}EwgExkIquCbzFquCfyFodDjoGoaCxrEm]rq@w{BnnEg[jj@o[~f@a^zh@yPrUiVr\\\\mZb]wg@rk@esDfgDwkEjwDyWrVevItyHuxAjoAaTxRkkLhiKylNj`MqqDnaDcjj@rrf@u_FflEo~EpkEihq@r_m@gd@t_@o~PvpO{b@`_@{_A|z@_y@rm@qaAzn@ovAxt@aYnP_kZndP{{LxtG_hMn_HwcMj}GexYnzOe]rQy`OzdIiB`A{bT`fL{hAfp@epFduCudCfrAuj^|xRy~BhnAyfSnzKsdIlkE}tGxlDkh@bZqk@n[ubCztAac@tXw|@fo@og@~`@i~FvxEmzCreCqqIzaHw}CxjCyFzEkwHt}Ga}JdnJioLzcKkoLx}JkaIz~GieJ~bImTlSavP~uNmpOxyMsoD``DsbKdsI}zOdbNidM`wKe`F`jE}WvTkrR|pPetMn_LyyB~lB_ZpX}lMp{K_iMzvKccBl}A{kD|yCqkEhvDi~Hl}GwoG|uFqE|DulGbzFaqFthFyGpGiwG~kGeqHbbHgeEp|DatAhlA{dHz~Fk[nWs`@`\\\\i~BbmBisCf_CycQ~sN}iCbbCgaAxdAyy@h}@sb@ve@cLnLwUdVmoOp{OgrLh_M_uGn_HyxBh{BwrBzfC_kH~kKoeClqDeoAjhBkpD~gFie@`r@kfCptDmc@do@ouBj{Cm`Ex}FqgCzrDwpBxtC}rC|cE}aCvjDmx`@jwk@_~ChpEqjClwDwzn@pl~@oNpSsAnByaJlsMkiAnbB}m@x~@GHmxCpjEaOzToWj`@}fHzgKmcIplLgqDzlFeoBdqCklAjwAaoAfqAqaBbpAwsFhzDitKduH}mLfjIupK~rHqoCzmBui@|_@cnMv`JicBllA}nA`~@udDh|BqvQnjMotNh`Kwe@~[wm@xb@cuE~bDs[`VmvDhnCu_HzyEmdIxyFm|AxfAgxFf_E}jNt{JioKtaHgmeAdgo@eMvHgkH`oEojWppOydJrwFseo@za`@yYfQsmpA|~v@wkIndF{hEfjCew@bg@}mBxjA{eAdp@wiAxq@k|KnyGafNtnIeuHjvEo@`@wdD`pBu}Aj`Aq|BtuAs_Atl@}fAns@isBrzAcjA~aA_MhLulF`mEqpCp_CarCz~Bg~CtiCmbDxlCyeDnqCmdBfvAsn@`h@gwAjmAsrAvkAkbBnhBa}BnxCqcEnkFcw@xz@}iEjnEe_DnaD}`BvbBqcCfpC}nAzxAsj@ps@ev@raAg}BvuCk`CvaDwkCzgDodCxbDg`Cx~CgnCvlDmrCvsDw`C|}CevC`vDukCplDy|AjqBa@f@qw@xaAsQnVmxAnlBoX~^}jAjyAifDlmEcSrU}aBxxBwo@j{@}~Bb{Cev@haAwWpYeUfVg]f^yHbIke@ld@uYxW{|BhmBapBfcBo{@rr@kaAd{@spCz|BspAxfAmsA`hA{uDd_DsuBbcBe{C`kCucB`uA{VvS}SlQ_f@hc@}wApjAsnAndAqmCz{Bmr@xl@{JfJ{}BrnB{k@xf@e}@rx@chBbdBumCvgC_`Aj~@ud@|d@{ZpZydAz`Ai`Bf}Aa_Ab}@ckCfeC_NtMu|A`zAovBprBqt@tr@WTolDtfDee@ld@ciArfAyY~Vi@d@uiBhfBo[rZoeCrbCq`@z^{QbPsaB~~AegAjdAcpArnAg{A~uAaSbSs}@n|@aaAb~@{XtXepAloAqnDxeDmpA|lAunBxlBgvCbtCeObPalD|dDqcBf`BcpBxjBwpD~lDkKlK_EnD\"},{\"ref\":\"CA 152\",\"mode\":\"driving\",\"weight\":1432.557,\"distance\":46584.988,\"geometry\":\"u}vteA|hkveFoIlCgSfLoFdDqEdAmE?{Dq@uCoBcCeCmAoCkAgEg@uFCkEj@kEv@eD`BoDzBqCtCeB|CiArDOxCR`DjAbDdCfCzDjB`H|C|b@G~]cAdiFcC|hQoBbiXOfjCQf|EWdtQb@nrG?x`@a@tbCPdxAGrtBMpwEAjxAQpmBLhgL{@vvGUzj@WzPs@hTyG|fAgMpgBmu@ncKaIv_A{Gtn@sAbJu@pGyF|ZiOnr@{H`Y_Sxl@oM|\\\\uk@hnAiZxn@cc@z{@aZjj@o\\\\rs@i_@vt@yg@hfAoKtS}c@|}@us@xxAe]~s@wh@peAwWdj@aj@~gAcaAfpBgm@joAuMdXibAzpBeIfPoE|I_|@hhBgbAbpBqfAjyBcaAdoBsS`d@{Zjn@gMdWg}CpnGcf@raAav@z|A}Tjd@si@hhA{v@j_BuNf[uCnHsCbI_FnQuAdGkEfXw@bGsCrXef@nhGkCzTyHtg@oLbt@oOdz@kEjUgDpP}DrSsHpe@{Gtd@}_@~yBsOxz@oL`s@_SvmA}CvNuDpOwClJsErLoKpTsPn[s}@xiBk@jA{JxQmHhNo|@pbB}FnJmTd\\\\uHdJsIpIkIjHsO|Iw_B|cAew@jb@_eApq@cdAjo@mFzC{[|Peb@|Pa`Bxd@_eBrf@qt@tT}TzHkInE}MtHyGtEeQ`OoH~GaKjLeFlHaPrX_t@daBqI`SkQla@iYzo@cRhc@sNx`@aFbVqBzLyCnSeAlMmAxVUvNEhOJ~Lh@zPr@xMdBxQbCxQbBtIdEtS`_@dtAhsA~xEdnBr_Hj}AbtF`j@rnBtq@l_Czn@j{BdHjT~E~MhD~HlJbRvKjQlHnJbEnEhNhMff@~_@lmBd|A~MnKrjFfhEzWbTlEvDjKbLlQpUfKpPfLxQhKpPzLdVpKfWhK|[vJt]rE~TvDjSzC~SlBlPhBxQ~@lObAdQ\\\\dJ~@f^Htk@c@`UStLc@`JmAfT}QhyCqAbW_Bt^uIbgBUlQFxRXxUTpJj@dMhAbSdAbO~BxUhC`TvGja@dH~^~D`Tz{@|zEtMbt@xQ~bAzCjOxF`_@vBhP`AdLx@`O`@pNDnPQbc@mCpkDuA`|@k@h}@@vLN~Kf@rNj@hKz@fLxAdMpAnIvFhZvB`InFvPxD`NtEjNxG~NjPf[bFtHtVh[tu@~t@~u@tt@fy@zv@rl@hj@ddAr`ApQxUpQ`^tJtSfLz]rDdPjCzNdChOrB~S~A~X^lJz@deAr@r_Ar@~qAPrf@\\\\xVfAjRr@|JpDhZvBzNbE`UvDlOjChJnEfMrMrYhHhMxGpK`NvRrLvNzGjGtQ`O|IhGhHhEvMtGjj@xT~iA|`@nuAnh@jMjEbo@hSfm@fQzYlNfUbPhVzVdK|MbUd`@dQlg@nCbM|\\\\`yBp_@v_CzHbi@jl@hyDxQpuAlNj~@zMxt@nKrd@h_@hiAfs@bsBbgIxeUzcA`hChqDtnHvVhq@xHt\\\\hGn\\\\~[t~CxKxo@dP`m@xMn]xRl`@ra@`n@vw@bfAfc@jg@v`@na@h\\\\~XhkD~xBnc@j`@bPnThLzVlJpVdHzXxDrWjAjVpApk@uC~h@wh@leEaCpUkAlZDr_@hAfTlCbZ|Sl{ArBvU`AxMh@rXm@lVeEhj@{Kzi@eVr~@uPhr@cNtk@kKzk@sFhk@gOpeCgRt_DL|^~@tl@~Dfj@lHbj@hHn^dCpIfLl^fNt_@vk@`hAjb@~s@dLtPpZnb@tT|Sp^tUhRjLdaDdpBb]`TnYdSl`@ri@nLzTxLn\\\\jIp\\\\zFr^rBdX~@|[]f[oBrX_Wz~CLvu@xBte@~q@`jGlYdqCtVr|Atd@xwBhGdSdLbe@nP~z@ld@|{BdVxuAne@haDzObu@vXthAvP`o@b\\\\fjAbF~N|Nv]lXfd@h\\\\x^~kBfxApy@tl@xf@fVzShHhg@vKjy@nI|fAzFlb@hIre@fPvf@lYtV`T|rBvoCX`@~bAjvAnjAp`BtR|XbyBvxC~Wx]lbBr|B~Vr^rVjo@zR`s@bHv]bGbg@~G`s@~Dff@dTp~BtEvs@rIb|@nPlrAbSvlAxcA`oF~Ipe@nf@zhChYd}AtSt~@tQbj@xeAr{Cfl@bdBlPlf@~Vlv@bV`j@`_@xv@~j@|{@po@jt@`l@rk@pWlWluEztExRnTdQlUpNlT~~@p_BhOxVzObUtPnShR~R|QdPjwE`sDjyBzdBrSxOpRjMxRvKpRlJtTjIpTjGrUdF`VtD|XtCdX`AzWHtW_AbXuBtWuDjWwFt\\\\_JpYmJ~mA{^fYwJfYuL~YyOvuAkx@~I_Fbf@iTlXkHdXaFtTiBvUaAnUTfUtAxVnCxbAfO|fAxObqBlY`x@rJ\",\"duration\":1639.643,\"driving_side\":\"right\",\"duration_typical\":1678.725,\"weight_typical\":1467.99,\"name\":\"\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"off ramp\",\"instruction\":\"Take exit 403B onto CA 152 West toward Gilroy/Hollister/San Jose.\",\"modifier\":\"slight right\",\"bearing_after\":340,\"bearing_before\":324,\"location\":[-120.969375,37.056491]},\"speedLimitUnit\":\"mph\",\"destinations\":\"CA 152 West: Gilroy, Hollister, San Jose\",\"bannerInstructions\":[{\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-152\",\"type\":\"icon\",\"text\":\"CA 152\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"CA 152\"},\"distanceAlongGeometry\":46584.988}],\"exits\":\"403B\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 29 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 29 miles.\",\"distanceAlongGeometry\":46571.656},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Keep right to stay on California 1 52.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Keep right to stay on California 1 52.\",\"distanceAlongGeometry\":1609.344},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to stay on California 1 52.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to stay on California 1 52.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to stay on California 1 52.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to stay on California 1 52.\",\"distanceAlongGeometry\":178}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[144,340],\"duration\":5.289,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"trunk_link\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.741,\"geometry_index\":2127,\"location\":[-120.969375,37.056491]},{\"entry\":[false,true],\"in\":0,\"bearings\":[152,336],\"duration\":28.594,\"mapbox_streets_v8\":{\"class\":\"trunk_link\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":25.734,\"geometry_index\":2129,\"location\":[-120.969658,37.056983]},{\"entry\":[false,true],\"in\":0,\"bearings\":[80,271],\"duration\":2.154,\"turn_weight\":7,\"turn_duration\":0.014,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.927,\"geometry_index\":2152,\"location\":[-120.969718,37.056799]},{\"entry\":[false,true],\"in\":0,\"bearings\":[91,271],\"duration\":13.34,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.988,\"geometry_index\":2153,\"location\":[-120.970214,37.056803]},{\"entry\":[false,true],\"in\":0,\"bearings\":[91,271],\"duration\":80.176,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":70.636,\"geometry_index\":2154,\"location\":[-120.973961,37.056837]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":42.729,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.382,\"geometry_index\":2157,\"location\":[-120.998526,37.056967]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":14.406,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.6,\"geometry_index\":2159,\"location\":[-121.011621,37.056988]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":1.764,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.543,\"geometry_index\":2160,\"location\":[-121.016029,37.05697]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,271],\"duration\":17.67,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.461,\"geometry_index\":2161,\"location\":[-121.01657,37.05697]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":88.375,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":77.822,\"geometry_index\":2164,\"location\":[-121.021986,37.056982]},{\"entry\":[false,true],\"in\":0,\"bearings\":[125,306],\"duration\":2.363,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.067,\"geometry_index\":2185,\"location\":[-121.056567,37.060494]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,307],\"duration\":35.037,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.65,\"geometry_index\":2186,\"location\":[-121.057332,37.060931]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,306],\"duration\":7.023,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.146,\"geometry_index\":2198,\"location\":[-121.068454,37.067454]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,306],\"duration\":14.436,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.63,\"geometry_index\":2199,\"location\":[-121.070266,37.068512]},{\"entry\":[false,true],\"in\":0,\"bearings\":[127,307],\"duration\":66.104,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":57.834,\"geometry_index\":2203,\"location\":[-121.074053,37.070727]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,306],\"duration\":32.111,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.295,\"geometry_index\":2215,\"location\":[-121.090725,37.08048]},{\"entry\":[false,true],\"in\":0,\"bearings\":[100,284],\"duration\":6.191,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.264,\"geometry_index\":2226,\"location\":[-121.099825,37.083442]},{\"entry\":[false,true],\"in\":0,\"bearings\":[108,289],\"duration\":8.75,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.432,\"geometry_index\":2229,\"location\":[-121.101676,37.083885]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,286],\"duration\":95.105,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":80.84,\"geometry_index\":2234,\"location\":[-121.104209,37.084584]},{\"entry\":[false,true],\"in\":0,\"bearings\":[154,333],\"duration\":1.08,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.918,\"geometry_index\":2268,\"location\":[-121.122511,37.100841]},{\"entry\":[false,true],\"in\":0,\"bearings\":[153,328],\"duration\":158.551,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.026,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":134.745,\"geometry_index\":2269,\"location\":[-121.122666,37.10108]},{\"entry\":[false,true],\"in\":0,\"bearings\":[97,277],\"duration\":26.41,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.109,\"geometry_index\":2342,\"location\":[-121.170282,37.08707]},{\"entry\":[false,true],\"in\":0,\"bearings\":[71,251],\"duration\":2.482,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.173,\"geometry_index\":2356,\"location\":[-121.179537,37.08564]},{\"entry\":[false,true],\"in\":0,\"bearings\":[71,251],\"duration\":122.793,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":107.438,\"geometry_index\":2357,\"location\":[-121.180387,37.085405]},{\"entry\":[false,true],\"in\":0,\"bearings\":[39,224],\"duration\":5.078,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.443,\"geometry_index\":2432,\"location\":[-121.212859,37.068613]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,249],\"duration\":6.525,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.709,\"geometry_index\":2435,\"location\":[-121.214276,37.067773]},{\"entry\":[false,true],\"in\":0,\"bearings\":[73,252],\"duration\":6.172,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.4,\"geometry_index\":2437,\"location\":[-121.216455,37.067222]},{\"entry\":[false,true],\"in\":0,\"bearings\":[72,254],\"duration\":1.992,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.744,\"geometry_index\":2438,\"location\":[-121.218515,37.066701]},{\"entry\":[false,true],\"in\":0,\"bearings\":[74,253],\"duration\":13.488,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.783,\"geometry_index\":2439,\"location\":[-121.219189,37.066543]},{\"entry\":[false,true],\"in\":0,\"bearings\":[75,253],\"duration\":3.244,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.82,\"geometry_index\":2441,\"location\":[-121.223555,37.065516]},{\"entry\":[false,true],\"in\":0,\"bearings\":[73,251],\"duration\":4.766,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.17,\"geometry_index\":2442,\"location\":[-121.224569,37.065269]},{\"entry\":[false,true],\"in\":0,\"bearings\":[67,241],\"duration\":12.16,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.03,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.614,\"geometry_index\":2444,\"location\":[-121.226032,37.064831]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,240],\"duration\":89.48,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":76.541,\"geometry_index\":2446,\"location\":[-121.229079,37.063478]},{\"entry\":[false,true],\"in\":0,\"bearings\":[65,239],\"duration\":83.943,\"turn_duration\":0.028,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":71.328,\"geometry_index\":2455,\"location\":[-121.253329,37.052659]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,293],\"duration\":2.844,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.488,\"geometry_index\":2486,\"location\":[-121.274546,37.045711]},{\"entry\":[false,true],\"in\":0,\"bearings\":[113,293],\"duration\":2.484,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.174,\"geometry_index\":2487,\"location\":[-121.275367,37.045994]},{\"entry\":[false,true],\"in\":0,\"bearings\":[113,289],\"duration\":2.236,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.936,\"geometry_index\":2488,\"location\":[-121.276082,37.046236]},{\"entry\":[false,true],\"in\":0,\"bearings\":[109,282],\"duration\":16.15,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.131,\"geometry_index\":2489,\"location\":[-121.2768,37.046434]},{\"entry\":[false,true],\"in\":0,\"bearings\":[99,269],\"duration\":8.207,\"turn_duration\":0.038,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.148,\"geometry_index\":2492,\"location\":[-121.282233,37.047124]},{\"entry\":[false,true],\"in\":0,\"bearings\":[75,250],\"duration\":1.57,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.375,\"geometry_index\":2496,\"location\":[-121.284857,37.046838]},{\"entry\":[false,true],\"in\":0,\"bearings\":[70,243],\"duration\":12.834,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.229,\"geometry_index\":2497,\"location\":[-121.285361,37.046689]},{\"entry\":[false,true],\"in\":0,\"bearings\":[47,226],\"duration\":2.377,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.08,\"geometry_index\":2503,\"location\":[-121.288856,37.044673]},{\"entry\":[false,true],\"in\":0,\"bearings\":[46,218],\"duration\":3.945,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.453,\"geometry_index\":2504,\"location\":[-121.289424,37.044232]},{\"entry\":[false,true],\"in\":0,\"bearings\":[30,209],\"duration\":1.371,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.182,\"geometry_index\":2506,\"location\":[-121.290122,37.04338]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":11.457,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.025,\"geometry_index\":2507,\"location\":[-121.290336,37.043071]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":2.111,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.848,\"geometry_index\":2508,\"location\":[-121.292147,37.040476]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,211],\"duration\":67.719,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":59.246,\"geometry_index\":2509,\"location\":[-121.292484,37.039994]},{\"entry\":[false,true],\"in\":0,\"bearings\":[69,243],\"duration\":1.225,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.072,\"geometry_index\":2526,\"location\":[-121.311114,37.036382]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"in\":0,\"bearings\":[63,247],\"duration\":2.26,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.977,\"geometry_index\":2527,\"location\":[-121.311437,37.036249]},{\"entry\":[false,true],\"in\":0,\"bearings\":[67,250],\"duration\":3.352,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.926,\"geometry_index\":2528,\"location\":[-121.312047,37.036038]},{\"entry\":[false,true],\"in\":0,\"bearings\":[70,249],\"duration\":27.846,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.365,\"geometry_index\":2529,\"location\":[-121.313007,37.035758]},{\"entry\":[false,true],\"in\":0,\"bearings\":[66,245],\"duration\":2.756,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.41,\"geometry_index\":2534,\"location\":[-121.321037,37.03349]},{\"entry\":[false,true],\"in\":0,\"bearings\":[65,244],\"duration\":5.346,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.66,\"geometry_index\":2535,\"location\":[-121.321806,37.033206]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,237],\"duration\":1.891,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.654,\"geometry_index\":2537,\"location\":[-121.323266,37.032626]},{\"entry\":[false,true],\"in\":0,\"bearings\":[57,229],\"duration\":22.912,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.049,\"geometry_index\":2538,\"location\":[-121.323758,37.032371]},{\"entry\":[false,true],\"in\":0,\"bearings\":[20,194],\"duration\":42.883,\"turn_duration\":0.028,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.498,\"geometry_index\":2544,\"location\":[-121.327543,37.027843]},{\"entry\":[false,true],\"in\":0,\"bearings\":[46,226],\"duration\":1.766,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.545,\"geometry_index\":2555,\"location\":[-121.334534,37.018749]},{\"entry\":[false,true],\"in\":0,\"bearings\":[46,225],\"duration\":10.682,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.328,\"geometry_index\":2556,\"location\":[-121.334949,37.018434]},{\"entry\":[false,true],\"in\":0,\"bearings\":[45,225],\"duration\":2.232,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.953,\"geometry_index\":2557,\"location\":[-121.337409,37.01648]},{\"entry\":[false,true],\"in\":0,\"bearings\":[45,225],\"duration\":9.072,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.938,\"geometry_index\":2558,\"location\":[-121.337902,37.01608]},{\"entry\":[false,true],\"in\":0,\"bearings\":[45,226],\"duration\":2.232,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.953,\"geometry_index\":2559,\"location\":[-121.339912,37.014489]},{\"entry\":[false,true],\"in\":0,\"bearings\":[46,239],\"duration\":12.4,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.017,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.527,\"geometry_index\":2560,\"location\":[-121.340418,37.014105]},{\"entry\":[false,true],\"in\":0,\"bearings\":[78,259],\"duration\":2.072,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.762,\"geometry_index\":2565,\"location\":[-121.343992,37.012989]},{\"entry\":[false,true],\"in\":0,\"bearings\":[79,258],\"duration\":6.797,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.947,\"geometry_index\":2566,\"location\":[-121.34462,37.012893]},{\"entry\":[false,true],\"in\":0,\"bearings\":[78,261],\"duration\":2.791,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.443,\"geometry_index\":2567,\"location\":[-121.346661,37.012554]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,258],\"duration\":3.434,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.982,\"geometry_index\":2568,\"location\":[-121.347505,37.012447]},{\"entry\":[false,true],\"in\":0,\"bearings\":[78,255],\"duration\":23.055,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.174,\"geometry_index\":2569,\"location\":[-121.348483,37.012277]},{\"entry\":[false,true],\"in\":0,\"bearings\":[70,250],\"duration\":2.221,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.943,\"geometry_index\":2572,\"location\":[-121.354903,37.010574]},{\"entry\":[false,true],\"in\":0,\"bearings\":[70,250],\"duration\":36.75,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":32.15,\"geometry_index\":2573,\"location\":[-121.35552,37.010398]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,241],\"duration\":2.504,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.191,\"geometry_index\":2579,\"location\":[-121.365066,37.006858]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,242],\"duration\":23.33,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.406,\"geometry_index\":2580,\"location\":[-121.365697,37.006579]},{\"entry\":[false,true],\"in\":0,\"bearings\":[38,218],\"duration\":2.191,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.918,\"geometry_index\":2586,\"location\":[-121.370709,37.00311]},{\"entry\":[false,true],\"in\":0,\"bearings\":[38,219],\"duration\":57.922,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":50.674,\"geometry_index\":2587,\"location\":[-121.3711,37.002717]},{\"entry\":[false,true],\"in\":0,\"bearings\":[34,214],\"duration\":13.848,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.109,\"geometry_index\":2598,\"location\":[-121.381652,36.992517]},{\"entry\":[false,true],\"in\":0,\"bearings\":[30,207],\"duration\":1.531,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.34,\"geometry_index\":2601,\"location\":[-121.383781,36.989916]},{\"entry\":[false,true],\"in\":0,\"bearings\":[27,205],\"duration\":4.596,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.021,\"geometry_index\":2602,\"location\":[-121.383985,36.989599]},{\"entry\":[false,true],\"in\":0,\"bearings\":[17,194],\"duration\":1.592,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.393,\"geometry_index\":2605,\"location\":[-121.384468,36.988594]},{\"entry\":[false,true],\"in\":0,\"bearings\":[14,191],\"duration\":15.449,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.52,\"geometry_index\":2606,\"location\":[-121.384583,36.988232]},{\"entry\":[true,false],\"in\":1,\"bearings\":[161,344],\"duration\":21.049,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":18.396,\"geometry_index\":2615,\"location\":[-121.384305,36.98459]},{\"entry\":[true,false],\"in\":1,\"bearings\":[156,333],\"duration\":4.711,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":4.24,\"geometry_index\":2622,\"location\":[-121.381906,36.980065]},{\"entry\":[true,false],\"in\":1,\"bearings\":[167,344],\"duration\":1.699,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.009,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":1.521,\"geometry_index\":2624,\"location\":[-121.381415,36.979032]},{\"entry\":[true,false],\"in\":1,\"bearings\":[173,347],\"duration\":1.434,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":1.289,\"geometry_index\":2625,\"location\":[-121.381302,36.978629]},{\"entry\":[true,false],\"in\":1,\"bearings\":[176,353],\"duration\":15.318,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":13.787,\"geometry_index\":2626,\"location\":[-121.381249,36.978282]},{\"entry\":[false,true],\"in\":0,\"bearings\":[11,190],\"duration\":7.604,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.844,\"geometry_index\":2632,\"location\":[-121.381871,36.974585]},{\"bearings\":[10,189],\"entry\":[false,true],\"in\":0,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":2633,\"location\":[-121.382294,36.972759]}]},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 12 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 12 miles.\",\"distanceAlongGeometry\":19234.33},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Take the U.S. 1 o1 North ramp.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Take the U.S. 1 o1 North ramp.\",\"distanceAlongGeometry\":1609.344},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Take the U.S. 1 o1 North ramp.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Take the U.S. 1 o1 North ramp.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Take the U.S. 1 o1 North ramp toward San Jose.</prosody></amazon:effect></speak>\",\"announcement\":\"Take the U.S. 1 o1 North ramp toward San Jose.\",\"distanceAlongGeometry\":186.667}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[9,190],\"duration\":34.436,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.125,\"geometry_index\":2634,\"location\":[-121.38248,36.971846]},{\"entry\":[false,true],\"in\":0,\"bearings\":[65,245],\"duration\":6.801,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"trunk\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.945,\"geometry_index\":2650,\"location\":[-121.386757,36.967372]},{\"entry\":[false,true],\"in\":0,\"bearings\":[64,246],\"duration\":43.508,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":38.062,\"geometry_index\":2652,\"location\":[-121.388109,36.966848]},{\"entry\":[false,true],\"in\":0,\"bearings\":[47,229],\"duration\":6.215,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.438,\"geometry_index\":2666,\"location\":[-121.397677,36.961995]},{\"entry\":[false,true],\"in\":0,\"bearings\":[61,248],\"duration\":72.857,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":63.75,\"geometry_index\":2669,\"location\":[-121.39901,36.961252]},{\"entry\":[false,true],\"in\":0,\"bearings\":[121,302],\"duration\":7.379,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.449,\"geometry_index\":2695,\"location\":[-121.414045,36.969052]},{\"entry\":[false,true],\"in\":0,\"bearings\":[119,299],\"duration\":4.844,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.238,\"geometry_index\":2697,\"location\":[-121.415714,36.969829]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,297],\"duration\":8.377,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.312,\"geometry_index\":2699,\"location\":[-121.416826,36.970314]},{\"entry\":[false,true],\"in\":0,\"bearings\":[116,300],\"duration\":0.492,\"turn_weight\":0.5,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.922,\"geometry_index\":2701,\"location\":[-121.418788,36.971101]},{\"entry\":[false,true],\"in\":0,\"bearings\":[120,284],\"duration\":0.676,\"turn_duration\":0.061,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.537,\"geometry_index\":2702,\"location\":[-121.418891,36.971149]},{\"entry\":[false,true],\"in\":0,\"bearings\":[104,287],\"duration\":1.475,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.283,\"geometry_index\":2703,\"location\":[-121.419045,36.971179]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,287],\"duration\":5.406,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.725,\"geometry_index\":2704,\"location\":[-121.419401,36.971267]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,287],\"duration\":4.164,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.637,\"geometry_index\":2705,\"location\":[-121.420718,36.97159]},{\"entry\":[false,true],\"in\":0,\"bearings\":[107,290],\"duration\":2.168,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.891,\"geometry_index\":2706,\"location\":[-121.421762,36.971847]},{\"entry\":[false,true],\"in\":0,\"bearings\":[113,292],\"duration\":5.738,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.004,\"geometry_index\":2708,\"location\":[-121.422297,36.972017]},{\"entry\":[false,true],\"in\":0,\"bearings\":[112,293],\"duration\":2.125,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.854,\"geometry_index\":2709,\"location\":[-121.423696,36.972477]},{\"entry\":[false,true],\"in\":0,\"bearings\":[113,293],\"duration\":10.088,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.82,\"geometry_index\":2710,\"location\":[-121.424217,36.972657]},{\"entry\":[false,true],\"in\":0,\"bearings\":[75,256],\"duration\":1.531,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.334,\"geometry_index\":2719,\"location\":[-121.426814,36.97292]},{\"entry\":[false,true],\"in\":0,\"bearings\":[76,255],\"duration\":13.826,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.082,\"geometry_index\":2720,\"location\":[-121.427206,36.972842]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,276],\"duration\":26.828,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.465,\"geometry_index\":2724,\"location\":[-121.430791,36.972303]},{\"entry\":[false,true],\"in\":0,\"bearings\":[158,336],\"duration\":12.209,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.664,\"geometry_index\":2746,\"location\":[-121.435803,36.976156]},{\"entry\":[false,true],\"in\":0,\"bearings\":[141,330],\"duration\":12.9,\"turn_duration\":0.012,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.277,\"geometry_index\":2751,\"location\":[-121.437497,36.978266]},{\"entry\":[false,true],\"in\":0,\"bearings\":[166,346],\"duration\":1.385,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.205,\"geometry_index\":2756,\"location\":[-121.438509,36.980726]},{\"entry\":[false,true],\"in\":0,\"bearings\":[166,346],\"duration\":0.322,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.275,\"geometry_index\":2757,\"location\":[-121.438597,36.980999]},{\"entry\":[false,true],\"in\":0,\"bearings\":[166,343],\"duration\":3.756,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.268,\"geometry_index\":2758,\"location\":[-121.438618,36.981064]},{\"entry\":[false,true],\"in\":0,\"bearings\":[164,343],\"duration\":1.988,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.732,\"geometry_index\":2761,\"location\":[-121.438882,36.981777]},{\"entry\":[false,true],\"in\":0,\"bearings\":[161,335],\"duration\":8.602,\"turn_duration\":0.026,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.504,\"geometry_index\":2763,\"location\":[-121.439035,36.982149]},{\"entry\":[false,true],\"in\":0,\"bearings\":[142,324],\"duration\":2.557,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.23,\"geometry_index\":2768,\"location\":[-121.440343,36.983736]},{\"entry\":[false,true],\"in\":0,\"bearings\":[144,320],\"duration\":7.225,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.119,\"geometry_index\":2769,\"location\":[-121.440756,36.984195]},{\"entry\":[false,true],\"in\":0,\"bearings\":[124,304],\"duration\":6.682,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.674,\"geometry_index\":2775,\"location\":[-121.442265,36.985225]},{\"entry\":[false,true],\"in\":0,\"bearings\":[124,304],\"duration\":2.799,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.373,\"geometry_index\":2776,\"location\":[-121.443803,36.98605]},{\"entry\":[false,true],\"in\":0,\"bearings\":[124,304],\"duration\":58.578,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":49.785,\"geometry_index\":2777,\"location\":[-121.444453,36.986394]},{\"entry\":[false,true],\"in\":0,\"bearings\":[58,238],\"duration\":38.92,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":34.049,\"geometry_index\":2811,\"location\":[-121.459225,36.987218]},{\"entry\":[false,true],\"in\":0,\"bearings\":[92,272],\"duration\":7.256,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.342,\"geometry_index\":2829,\"location\":[-121.468385,36.983253]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,276],\"duration\":10.762,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.408,\"geometry_index\":2833,\"location\":[-121.470078,36.983325]},{\"entry\":[false,true],\"in\":0,\"bearings\":[101,281],\"duration\":24.9,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.781,\"geometry_index\":2835,\"location\":[-121.472625,36.983685]},{\"entry\":[false,true],\"in\":0,\"bearings\":[102,282],\"duration\":6.674,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.834,\"geometry_index\":2839,\"location\":[-121.478886,36.984655]},{\"entry\":[false,true],\"in\":0,\"bearings\":[104,284],\"duration\":16.734,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.637,\"geometry_index\":2842,\"location\":[-121.480526,36.984963]},{\"entry\":[false,true],\"in\":0,\"bearings\":[114,296],\"duration\":5.887,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.145,\"geometry_index\":2848,\"location\":[-121.484607,36.985988]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,298],\"duration\":12.631,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.047,\"geometry_index\":2850,\"location\":[-121.485902,36.986511]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,298],\"duration\":5.107,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.463,\"geometry_index\":2851,\"location\":[-121.488514,36.987612]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,298],\"duration\":7.154,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.254,\"geometry_index\":2852,\"location\":[-121.48953,36.988041]},{\"entry\":[false,true],\"in\":0,\"bearings\":[118,295],\"duration\":9.994,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.727,\"geometry_index\":2853,\"location\":[-121.49089,36.988614]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,295],\"duration\":3.008,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.625,\"geometry_index\":2855,\"location\":[-121.492981,36.989395]},{\"entry\":[false,true],\"in\":0,\"bearings\":[119,301],\"duration\":1.893,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.65,\"geometry_index\":2857,\"location\":[-121.493537,36.989621]},{\"entry\":[false,true],\"in\":0,\"bearings\":[124,306],\"duration\":25.646,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.434,\"geometry_index\":2859,\"location\":[-121.493845,36.989778]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,319],\"duration\":1.348,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.172,\"geometry_index\":2864,\"location\":[-121.498202,36.993694]},{\"entry\":[false,true],\"in\":0,\"bearings\":[139,319],\"duration\":10.348,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.047,\"geometry_index\":2865,\"location\":[-121.498437,36.993913]},{\"entry\":[false,true],\"in\":0,\"bearings\":[139,320],\"duration\":0.436,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.375,\"geometry_index\":2866,\"location\":[-121.500241,36.995598]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":1.135,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.986,\"geometry_index\":2867,\"location\":[-121.500313,36.995666]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":11.193,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.787,\"geometry_index\":2868,\"location\":[-121.500502,36.995843]},{\"entry\":[false,true],\"in\":0,\"bearings\":[143,324],\"duration\":2.064,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.801,\"geometry_index\":2871,\"location\":[-121.50227,36.997714]},{\"entry\":[false,true],\"in\":0,\"bearings\":[144,324],\"duration\":18.049,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.787,\"geometry_index\":2872,\"location\":[-121.502583,36.998063]},{\"entry\":[false,true],\"in\":0,\"bearings\":[137,317],\"duration\":0.895,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.777,\"geometry_index\":2879,\"location\":[-121.505677,37.000917]},{\"entry\":[false,true],\"in\":0,\"bearings\":[137,320],\"duration\":9.779,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.551,\"geometry_index\":2880,\"location\":[-121.505824,37.001043]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":4.074,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.559,\"geometry_index\":2881,\"location\":[-121.507318,37.002489]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":1.758,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.531,\"geometry_index\":2882,\"location\":[-121.507952,37.003088]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":2.639,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.303,\"geometry_index\":2883,\"location\":[-121.508206,37.003327]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":0.738,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.646,\"geometry_index\":2884,\"location\":[-121.508622,37.00372]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":1.9,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.656,\"geometry_index\":2885,\"location\":[-121.508739,37.003833]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":2.73,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.383,\"geometry_index\":2886,\"location\":[-121.509038,37.004119]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":1.635,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.424,\"geometry_index\":2887,\"location\":[-121.509464,37.004527]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,320],\"duration\":8.408,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.35,\"geometry_index\":2888,\"location\":[-121.509703,37.004757]},{\"entry\":[false,true],\"in\":0,\"bearings\":[140,319],\"duration\":6.895,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.025,\"geometry_index\":2889,\"location\":[-121.510961,37.005964]},{\"entry\":[false,true],\"in\":0,\"bearings\":[139,318],\"duration\":34.357,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.062,\"geometry_index\":2890,\"location\":[-121.511608,37.006559]},{\"entry\":[false,true],\"in\":0,\"bearings\":[138,313],\"duration\":7.67,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.902,\"geometry_index\":2892,\"location\":[-121.514883,37.009508]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"location\":[-121.515821,37.009914],\"geometry_index\":2895,\"admin_index\":0,\"weight\":6.295,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.071,\"turn_weight\":0.75,\"duration\":8.23,\"bearings\":[97,259],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[44,210],\"duration\":13.439,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.096,\"geometry_index\":2898,\"location\":[-121.516553,37.00959]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":0.889,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.781,\"geometry_index\":2900,\"location\":[-121.517473,37.008276]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":6.479,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.811,\"geometry_index\":2901,\"location\":[-121.517551,37.008162]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":0.363,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.309,\"geometry_index\":2902,\"location\":[-121.518162,37.007275]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":12.854,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.549,\"geometry_index\":2903,\"location\":[-121.518196,37.007225]},{\"entry\":[false,true],\"in\":0,\"bearings\":[30,209],\"duration\":37.688,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":33.9,\"geometry_index\":2905,\"location\":[-121.519431,37.005505]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":1.221,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.08,\"geometry_index\":2907,\"location\":[-121.522474,37.001049]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,209],\"duration\":0.648,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.566,\"geometry_index\":2908,\"location\":[-121.52259,37.00088]},{\"entry\":[false,true],\"in\":0,\"bearings\":[29,208],\"duration\":2.521,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.252,\"geometry_index\":2909,\"location\":[-121.522648,37.000795]},{\"entry\":[false,true],\"in\":0,\"bearings\":[28,209],\"duration\":33.553,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.191,\"geometry_index\":2910,\"location\":[-121.522867,37.000469]},{\"entry\":[false,true],\"in\":0,\"bearings\":[72,257],\"duration\":8.346,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.512,\"geometry_index\":2917,\"location\":[-121.524543,36.999289]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.525102,36.999213],\"geometry_index\":2919,\"admin_index\":0,\"weight\":10.088,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"turn_duration\":2.013,\"turn_weight\":0.5,\"duration\":12.666,\"bearings\":[85,273],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[121,305],\"duration\":1.424,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.273,\"geometry_index\":2925,\"location\":[-121.526634,36.999596]},{\"entry\":[false,true],\"in\":0,\"bearings\":[125,306],\"duration\":2.043,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.832,\"geometry_index\":2926,\"location\":[-121.526833,36.999709]},{\"entry\":[false,true],\"in\":0,\"bearings\":[126,305],\"duration\":13.312,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.975,\"geometry_index\":2927,\"location\":[-121.527069,36.999844]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,295],\"duration\":4.854,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.361,\"geometry_index\":2931,\"location\":[-121.528697,37.000637]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,295],\"duration\":8.82,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":7.932,\"geometry_index\":2932,\"location\":[-121.52941,37.000906]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,295],\"duration\":6.836,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.145,\"geometry_index\":2933,\"location\":[-121.530853,37.001449]},{\"entry\":[false,true],\"in\":0,\"bearings\":[115,294],\"duration\":3.799,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.402,\"geometry_index\":2934,\"location\":[-121.531977,37.001872]},{\"entry\":[false,true],\"in\":0,\"bearings\":[114,296],\"duration\":6.969,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.438,\"geometry_index\":2935,\"location\":[-121.53262,37.002105]},{\"entry\":[false,true],\"in\":0,\"bearings\":[116,295],\"duration\":2.641,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.441,\"geometry_index\":2936,\"location\":[-121.533798,37.002555]},{\"entry\":[false,true],\"in\":0,\"bearings\":[112,290],\"duration\":9.119,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.436,\"geometry_index\":2938,\"location\":[-121.534255,37.002715]},{\"entry\":[false,true],\"in\":0,\"bearings\":[101,281],\"duration\":11.463,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":10.596,\"geometry_index\":2942,\"location\":[-121.535901,37.003065]},{\"entry\":[false,true],\"in\":0,\"bearings\":[92,270],\"duration\":3.928,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.633,\"geometry_index\":2945,\"location\":[-121.537461,37.003188]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":3.967,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.662,\"geometry_index\":2946,\"location\":[-121.538,37.00319]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,270],\"duration\":20.008,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.1,\"geometry_index\":2947,\"location\":[-121.538738,37.003193]},{\"entry\":[false,true],\"in\":0,\"bearings\":[90,276],\"duration\":28.436,\"turn_weight\":0.5,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":27.504,\"geometry_index\":2948,\"location\":[-121.540651,37.003201]},{\"entry\":[false,true],\"in\":0,\"bearings\":[99,279],\"duration\":4.189,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.127,\"geometry_index\":2951,\"location\":[-121.544862,37.003741]},{\"entry\":[false,true],\"in\":0,\"bearings\":[99,279],\"duration\":26.346,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.73,\"geometry_index\":2952,\"location\":[-121.545079,37.003769]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,275],\"duration\":37.551,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.543,\"geometry_index\":2958,\"location\":[-121.548556,37.004078]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,276],\"duration\":11.572,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.572,\"geometry_index\":2959,\"location\":[-121.550191,37.004185]},{\"entry\":[false,true],\"in\":0,\"bearings\":[96,273],\"duration\":4.047,\"turn_weight\":2,\"turn_duration\":2.022,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.025,\"geometry_index\":2960,\"location\":[-121.55069,37.00423]},{\"entry\":[false,true],\"in\":0,\"bearings\":[93,275],\"duration\":3.309,\"turn_weight\":2,\"turn_duration\":2.008,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.332,\"geometry_index\":2961,\"location\":[-121.550891,37.004239]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,274],\"duration\":4.908,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.023,\"geometry_index\":2962,\"location\":[-121.551033,37.004248]},{\"bearings\":[93,271],\"entry\":[false,true],\"in\":0,\"turn_weight\":0.5,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"primary\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":2964,\"location\":[-121.551581,37.004278]}],\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Jose\"}],\"type\":\"turn\",\"modifier\":\"slight right\",\"text\":\"San Jose\"},\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"turn\",\"modifier\":\"slight right\",\"text\":\"US 101 North\"},\"distanceAlongGeometry\":19263.996}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to stay on CA 152.\",\"modifier\":\"slight right\",\"bearing_after\":190,\"bearing_before\":189,\"location\":[-121.38248,36.971846]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":873.471,\"duration_typical\":984.115,\"duration\":1052.635,\"distance\":19263.996,\"driving_side\":\"right\",\"weight\":936.428,\"mode\":\"driving\",\"ref\":\"CA 152\",\"geometry\":\"ksqoeA~crofFr{@nLbLbBjq@~NtJfC`KrDxIlEvInF`IbGtH`HdItJvLdPxDfH~CxHvCtIbCzIxm@d{BlJp]hT|t@tNpk@xk@d}BhIvZ|HxWbJjWnJfV|b@vbAp]~w@lXfm@xNnYxNxWpOxUpd@rr@fUh]pSp\\\\xN`^`ItUxDbQbGja@`Dt_@v@r\\\\F`\\\\cAl]{B|]aEx^uExZcHt_@wGd]uIl]eJ`VcM|Z}L~SwPfZiO`Vc\\\\v_@kyD~kEslAvtAkZz]aNdQcNhSeJhOqKnTmLn[{Pfb@u]`dAqRtk@wIxWu\\\\zfAoRvq@_BlE{@rHoDfUeShqAaOf`Ac@vCoHt[w[lvAgJp_@m@~BqIz]{CzSgBfV{@pQ?fQL`NbAbP~AhMzCnWrZr`C|Bn\\\\hAh^Er`@u@zRw@~M_BrOkBrOsDjSkEzR{EtPiF`O_HvPyH`OwIpNcMdPqJhK_KjKwIdIcPtI_MxG_OjGcOhH_TdIcSvImUpJwg@pUgOvIwOjLyNbOii@`j@cK|GmKrGcJzDmN~EseBx_@aPnDaCh@eMpDeSfFeItBuGbBqMlE_Bh@iOfI_QhKcSrOwh@fh@u[xXyAtA{NbP_HhJqGhKmHbOuQva@qr@b_BoTrg@gOt]gfB~}DcPf`@uI|SwFhRcDfQiCtPqAtPu@dPMfQZpNt@rOpA`OhCfQbD~MlErObh@juApGhRzEfQbDtP~ApNpArOZdP?d_@mBpz@[lT?hRh@fQpApN~AbPbDbOzEvQbGzRzDtJ~Zjv@~t@xjB|]j_AzKrVtJhN`OzOfd@vg@pMfQrHzMb@v@tIvQzEtPzEzRtC|S~AjSt@vQ?bWcA~gA[vg@g@p]cAd_@GhAkAtYcSncCs[|wDoWbaDkAbMcDb]sBvTwLhfA{@lH}U|pB{Hxg@qGr^mH`]_Kjb@g@fBsM`e@aQzi@ycAfbDyYn~@yb@~sAgn@p}Bq@bCaEfOaGnQ}BzG{DjIuArCgIvP_KrOmx@b|@kaDdkDuLtMihBvoBgCnCaJxJoF`GcjBhcBiAbAyTpRc@^sb@`_@kQtPqM~M_NtOc`AvlAq[d`@{FdHkyAj|Amd@rf@}MzNqW~XaFhF{PtQoXrYkM|MmjArmAed@lg@k[v^}zC|kDuPnV_ElPu@tP`@`J~DpQdLbOb_@`V~p@la@bFzClv@de@bBbA|GdEpaB~eAjzB`sAbzCbiBpIfFhDrBjStLtJfGhRdPpM`OjH~MlHfQlEtP|AhKnBhQf@rOYfQeArOyBdQmExQ{EbPyBvEaFlKmGvMgU`f@kHfQ{H`VaGjTyOpk@}`@dyAmYfeAqMdg@c[rhA{CvKcDxNeAvEqGd_@cGnk@_BlRqAnO{Bpk@g@lc@Ct`@Ebm@OpvBgC|m@}Dzd@qVjqDw@pLgBdX}AtVcBz]uAr]iAj^_DpjAuEdeByAd^QpKQzGe@dRU`NEhNRtN`@|Nv@|MpA~LtBbObCxM\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 20 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 20 miles.\",\"distanceAlongGeometry\":32806.32},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Keep right to take exit 3 77B.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Keep right to take exit 3 77B.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to take exit 3 77B.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to take exit 3 77B.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to take exit 3 77B onto California 85 North toward Cupertino, Mountain View.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to take exit 3 77B onto California 85 North toward Cupertino, Mountain View.\",\"distanceAlongGeometry\":291.667}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[71,254],\"duration\":11.484,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.762,\"geometry_index\":2971,\"location\":[-121.55329,37.00406]},{\"entry\":[false,true],\"in\":0,\"bearings\":[72,261],\"duration\":43.125,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":45.281,\"geometry_index\":2974,\"location\":[-121.554932,37.003638]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.558396,37.007551],\"geometry_index\":2992,\"admin_index\":0,\"weight\":10.795,\"is_urban\":true,\"turn_weight\":2,\"duration\":8.189,\"bearings\":[154,336],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,337],\"duration\":3.096,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.328,\"geometry_index\":2993,\"location\":[-121.559408,37.009408]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":28.871,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":30.316,\"geometry_index\":2994,\"location\":[-121.559793,37.010117]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,337],\"duration\":23.795,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.369,\"geometry_index\":2995,\"location\":[-121.563374,37.016727]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,336],\"duration\":2.287,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.344,\"geometry_index\":2996,\"location\":[-121.566361,37.022223]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,338],\"duration\":2.662,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.729,\"geometry_index\":2997,\"location\":[-121.566634,37.022723]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.566937,37.023316],\"geometry_index\":2998,\"admin_index\":0,\"weight\":22.016,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":21.537,\"bearings\":[158,336],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.569243,37.027546],\"geometry_index\":2999,\"admin_index\":0,\"weight\":126.158,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":128.887,\"bearings\":[156,337],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":42.688,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":40.547,\"geometry_index\":3014,\"location\":[-121.582266,37.054542]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":35.342,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":33.568,\"geometry_index\":3016,\"location\":[-121.586199,37.063603]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[159,338],\"duration\":34.525,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":32.781,\"geometry_index\":3024,\"location\":[-121.589581,37.071254]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.593609,37.07868],\"geometry_index\":3029,\"admin_index\":0,\"weight\":31.557,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":31.859,\"bearings\":[156,336],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":29.572,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":28.826,\"geometry_index\":3030,\"location\":[-121.597295,37.085375]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":131.172,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":127.887,\"geometry_index\":3031,\"location\":[-121.600792,37.091726]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[150,332],\"duration\":23.055,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.625,\"geometry_index\":3063,\"location\":[-121.623657,37.115236]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":12.92,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.559,\"geometry_index\":3067,\"location\":[-121.626527,37.120002]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":18.391,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.762,\"geometry_index\":3068,\"location\":[-121.628112,37.12268]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":27.045,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":29.066,\"geometry_index\":3069,\"location\":[-121.63042,37.126584]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,335],\"duration\":12.645,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.586,\"geometry_index\":3070,\"location\":[-121.633812,37.132323]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,332],\"duration\":72.555,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":76.162,\"geometry_index\":3073,\"location\":[-121.635407,37.134998]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":23.773,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":24.361,\"geometry_index\":3086,\"location\":[-121.648098,37.148653]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,321],\"duration\":11.141,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.4,\"geometry_index\":3087,\"location\":[-121.653018,37.153719]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":61.174,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":59.637,\"geometry_index\":3089,\"location\":[-121.655422,37.156166]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,327],\"duration\":3.986,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.688,\"geometry_index\":3114,\"location\":[-121.668385,37.168529]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[143,323],\"duration\":88.4,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":79.561,\"geometry_index\":3117,\"location\":[-121.669193,37.169437]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,311],\"duration\":16.92,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.211,\"geometry_index\":3152,\"location\":[-121.688419,37.187599]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":2.553,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.297,\"geometry_index\":3153,\"location\":[-121.69274,37.190588]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":13.334,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12,\"geometry_index\":3154,\"location\":[-121.693398,37.191048]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":1.361,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.219,\"geometry_index\":3155,\"location\":[-121.696778,37.193424]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[131,311],\"duration\":79.133,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":71.219,\"geometry_index\":3156,\"location\":[-121.697147,37.193682]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,305],\"duration\":29.248,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":26.316,\"geometry_index\":3169,\"location\":[-121.717867,37.206523]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.724938,37.211743],\"geometry_index\":3181,\"admin_index\":0,\"weight\":87.574,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":94.141,\"bearings\":[142,322],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":13.908,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.205,\"geometry_index\":3203,\"location\":[-121.747275,37.229699]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":6.166,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.012,\"geometry_index\":3205,\"location\":[-121.751096,37.231879]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,306],\"duration\":3.367,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.283,\"geometry_index\":3207,\"location\":[-121.752791,37.232845]},{\"lanes\":[{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":17.967,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.967,\"geometry_index\":3208,\"location\":[-121.753718,37.233373]},{\"lanes\":[{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[126,306],\"duration\":4.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.715,\"geometry_index\":3209,\"location\":[-121.758662,37.236196]},{\"lanes\":[{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"location\":[-121.759926,37.236917],\"geometry_index\":3210,\"admin_index\":0,\"weight\":5.047,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":4.932,\"bearings\":[126,306],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"bearings\":[126,307],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"geometry_index\":3211,\"location\":[-121.761251,37.237688]}],\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Cupertino\"},{\"type\":\"text\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Mountain View\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Cupertino / Mountain View\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"377B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-85\",\"type\":\"icon\",\"text\":\"CA 85\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 377B CA 85 North\"},\"distanceAlongGeometry\":32835.988},{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight right\",\"active\":true,\"directions\":[\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Cupertino\"},{\"type\":\"text\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Mountain View\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Cupertino / Mountain View\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"377B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/ca-85\",\"type\":\"icon\",\"text\":\"CA 85\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 377B CA 85 North\"},\"distanceAlongGeometry\":3218.688}],\"destinations\":\"US 101 North: San Jose\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"on ramp\",\"instruction\":\"Take the US 101 North ramp toward San Jose.\",\"modifier\":\"slight right\",\"bearing_after\":254,\"bearing_before\":251,\"location\":[-121.55329,37.00406]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":1148.91,\"duration_typical\":1173.932,\"duration\":1225.777,\"distance\":32835.988,\"driving_side\":\"right\",\"weight\":1198.906,\"mode\":\"driving\",\"ref\":\"US 101 North\",\"geometry\":\"wppqeArw_zfFxGje@`F~UnIfh@f@jHZfGAlHYhIaAnI}BtKoDlJ}BbE{D~EoDjD}GtEsHtCgRtH}RfIwQdI_PxHeQhIijBj_AasBf~@ik@`Wc|Kx~EovItyDg^`Pad@|QkgGboCshHt`DotHvfDq[pNm]bO{]fOm]jNw\\\\pMy^fN_]tLq]zL{]vLu^tLw{A`g@_}JtdDkkHraC}fB`l@kmMvgEuo@dTyTlH}mF|fBil@nRo]tLe^~Ly]nM}]bNg^tN{\\\\hN_^bOu_@rPirI~yDmaLjeF}kKpyE{h@`V{yG~zCgWrLwTzK}UxMuTpMiU`OmU|OsSnO{TjQmSbQaRvP_SvRuSvSiQzRmRhUwP~SgPlTu_DjlEacLvwOcRtVcPdS{QpT{PhRyPhQkRtQ{RxQyRtPmShPaTzOwR~M}TtNwSxLiTrL{SzK}iF`jCkfD`bB_sFfoCueJ~rE{wBjfAaV~LgVhMcUrM{SlM}TjNuRzMiVhQ{S~OcT|PmSfQeSrQuO`OmAhA{qGfjG{oJbeJs{HnrHg^h_@uxB|tBcxAjvAkRtRcSdTmQjS{PrSwQtUsOrSeO`T{NpTY`@ixAlyBsOlUePpUcP`ToP|SaQ`TyQxScRfSkSrSkQxPqQlPeRzOoRzOygEhfD}[lXkPbMwYhWsK`K_d@za@gRzQ_RxRaQjRuPhRiQfSoQbTywHlnJkPdSuPdS}O`RcQrRqQpRcQxQqQpQyQ`QwQzPsQ|OaRvOiRxO}R|OsRpOakDdqCeRnOuStQkRjQaQnQsQxR_QbScQzSqP~SaPtTcP`ViOxUyi@~w@yyD`mGw[bh@osCfrEcO`VyiFhmIwTl^eSj\\\\mRv[uSh^yS|^wRh^sSb`@uQn]uQ~]uRl`@{Rxa@qzItdRisAdtCqNtYyNdXoNfVoOrV{MfS_QvU{OdSaRvTaQnR{Q|QygAreAatBlqB_jCffCaVxU{S~SwRxS}PhSuPnS{QpUqPbUyfNbjRaP`UaPdU_OdTgPlV{NpUyM`UwOnXuOnY_MrUuNpYuMdXwaAftB_aA`sBgeAvyBm^|u@}[~q@_`@|x@moD~sHal@~mAeo@xqAkf@r`A\"},{\"ref\":\"CA 85 North\",\"mode\":\"driving\",\"weight\":1170.943,\"distance\":29571,\"geometry\":\"{az_fAx~wfgF_MfJwl@dfA{MlTsFrIkWr^_]he@eLpPeItNuHdOcHfO{ExLyChI{FzQuDzM{DtPwC|MqBzKo@xEeAvHgAbJkAhK{@lJs@nIo@|Jg@pL]`MUfPEpNl@n`@tAt[nJlmA~BrXz@rJr@dJjDdc@lDr[zNnkBhIhkApAbOz@jJzMlaBpRd|BtHr}@nVzvCnGdu@pC~[bCr_@zBvf@|@d]d@rZYjv@c@pZaBho@kCjc@wCv]{D|^eFz_@oGba@qjB`tKmj@bbDcJvj@gDhVgCxSwHlq@iFnt@wBhb@}@jWy@jVa@rUiA`aCOvj@sDbgNYbjAQ`Zm@zVe@bRw@lQyBf`@aIrw@aDjUgDvTuDrSsDdRyEvSwFrTcKn]_JbXqjAvzCsuC`sHyU|m@iiBdxEuw@lsB_W`p@yy@jwBiCtGyb@`iAsQ`e@}IpUwTpj@{Odb@}Lj_@aHvVmFhT_EpRoFvZqB`M}A~K}Dt[eB|QaBrS_ArOw@xPm@~QY`O}@nfA_@dg@OfLiEtdFe@de@Wnb@UzeEFf[Epf@H|r@Gt~B}AjnAwDdlB_DzsAsKvvE[jMkAf^aAzi@@dMBtr@X|O|@`^bD~q@pA~RxA|QnCnXzC~VhD|WdA~HpBlLvEjVrHf_@jLzc@|h@boBbQpo@xX~jAvQr_A|fAfwGvs@pkEzJ`p@jEl]rD`_@hCd\\\\~Bx^`AfQt@rSx@z[VxPNzPtAbaJb@piFE~sBl@tpFVrk@n@vvBR|Z@bIPrp@Jte@d@`eD~@zxG`AjcHBnXOzUc@vT[|Ki@fOm@rPQlD_@|ImAzTuBtXu@lKkAhLcw@x~H{Ffm@{X~tCafAhhK}StpBwTvtBm@rFki@hhF}MjfAeUftA{]p{A_Id[uZzmAuE|Qi`AxxDkK~a@iTf|@{E~R}E~PaOvr@}ShlA}Jnn@wQhkAuKpl@kF`WkFdUmCzIqRht@uaAjsCkk@haBkbAhtC_Vhs@{Trq@{Xt}@mRfm@yXvz@_Yfx@{wCrkIap@fjB}Qpf@oRpf@aWtn@aIfRioAt|CwRrh@iOde@}Mpf@iLfg@wJff@ei@zvCaLfi@cMph@gOzh@gNpb@c~ArrEmPnb@{Pd`@kPb]{Vnd@gWjc@q^zg@{p@x_AaTjYeiBvgC}gHf`KaTbYySdVaTbT_SlQqSlP{PvMqvN`~K{oCtuB_k@zb@c]xXkYbWuYbYsXnZ}SlWSVklGx{Hi{Jf~L}QxSuRvRqSlQoSbPaTlN}UvMmUvKqT`JasFvxBoiCjcAqt@bYkP~F{ZhKyYbIc]fI_VtEuFhAwGfAc^rFs_@hF\",\"duration\":1032.742,\"driving_side\":\"right\",\"duration_typical\":1054.998,\"weight_typical\":1196.506,\"name\":\"\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to take exit 377B onto CA 85 North toward Cupertino/Mountain View.\",\"modifier\":\"slight right\",\"bearing_after\":327,\"bearing_before\":307,\"location\":[-121.762301,37.238318]},\"speedLimitUnit\":\"mph\",\"destinations\":\"CA 85 North: Cupertino, Mountain View\",\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"19\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-280\",\"type\":\"icon\",\"text\":\"I 280\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Exit 19 I 280 North\"},\"distanceAlongGeometry\":29571},{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight right\",\"active\":true,\"directions\":[\"straight\",\"slight right\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight right\",\"active\":true,\"directions\":[\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"19\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-280\",\"type\":\"icon\",\"text\":\"I 280\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Exit 19 I 280 North\"},\"distanceAlongGeometry\":3218.688}],\"exits\":\"377B\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 18 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 18 miles.\",\"distanceAlongGeometry\":29536},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Take exit 19.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Take exit 19.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Take exit 19.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Take exit 19.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Take exit 19 onto Interstate 2 80 North toward San Francisco.</prosody></amazon:effect></speak>\",\"announcement\":\"Take exit 19 onto Interstate 2 80 North toward San Francisco.\",\"distanceAlongGeometry\":245}],\"intersections\":[{\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.762301,37.238318],\"geometry_index\":3212,\"admin_index\":0,\"weight\":6.07,\"is_urban\":false,\"turn_weight\":5,\"duration\":1.045,\"bearings\":[127,327],\"out\":1,\"in\":0,\"turn_duration\":0.026,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,309],\"duration\":8.592,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.021,\"geometry_index\":3213,\"location\":[-121.762481,37.238542]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[134,315],\"duration\":7.939,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.338,\"geometry_index\":3217,\"location\":[-121.764639,37.240024]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,298],\"duration\":4.178,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.387,\"geometry_index\":3224,\"location\":[-121.766689,37.241366]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[110,286],\"duration\":6.494,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.98,\"geometry_index\":3229,\"location\":[-121.767957,37.24181]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,267],\"duration\":6.861,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.375,\"geometry_index\":3240,\"location\":[-121.770106,37.242072]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[80,259],\"duration\":1.27,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.395,\"geometry_index\":3243,\"location\":[-121.772356,37.241822]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.772766,37.241758],\"geometry_index\":3244,\"admin_index\":0,\"weight\":1.592,\"is_urban\":true,\"turn_weight\":0.95,\"duration\":0.59,\"bearings\":[79,259],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,260],\"duration\":0.533,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.586,\"geometry_index\":3245,\"location\":[-121.772952,37.241728]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[80,259],\"duration\":1.803,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.961,\"geometry_index\":3246,\"location\":[-121.773131,37.241702]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,257],\"duration\":1.439,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.584,\"geometry_index\":3247,\"location\":[-121.77371,37.241616]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[77,260],\"duration\":9.119,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.031,\"geometry_index\":3248,\"location\":[-121.774168,37.241529]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.777125,37.24111],\"geometry_index\":3250,\"admin_index\":0,\"weight\":1.363,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":0.785,\"bearings\":[80,259],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,258],\"duration\":0.533,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.6,\"geometry_index\":3251,\"location\":[-121.777383,37.241069]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[78,259],\"duration\":4.777,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.375,\"geometry_index\":3252,\"location\":[-121.777565,37.241039]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,259],\"duration\":6.09,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.004,\"geometry_index\":3253,\"location\":[-121.77914,37.240801]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.781143,37.240488],\"geometry_index\":3254,\"admin_index\":0,\"weight\":3.949,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":3.008,\"bearings\":[79,259],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,259],\"duration\":7.301,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.395,\"geometry_index\":3255,\"location\":[-121.782145,37.240333]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,259],\"duration\":2.584,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.027,\"geometry_index\":3256,\"location\":[-121.784575,37.239957]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[79,259],\"duration\":10.105,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.875,\"geometry_index\":3257,\"location\":[-121.785442,37.239821]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,273],\"duration\":1.287,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.48,\"geometry_index\":3263,\"location\":[-121.788875,37.239583]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[93,275],\"duration\":31.109,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":35.775,\"geometry_index\":3264,\"location\":[-121.789316,37.239601]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.799227,37.241862],\"geometry_index\":3271,\"admin_index\":0,\"weight\":18.701,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":16.27,\"bearings\":[108,288],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[100,278],\"duration\":1.662,\"turn_duration\":0.022,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.926,\"geometry_index\":3277,\"location\":[-121.804906,37.24316]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[98,276],\"duration\":9.16,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.535,\"geometry_index\":3278,\"location\":[-121.805471,37.24322]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,271],\"duration\":2.146,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.445,\"geometry_index\":3282,\"location\":[-121.808678,37.243334]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,271],\"duration\":53.1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":61.064,\"geometry_index\":3283,\"location\":[-121.809378,37.243342]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,302],\"duration\":17.1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.238,\"geometry_index\":3300,\"location\":[-121.826647,37.245904]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.831576,37.248314],\"geometry_index\":3301,\"admin_index\":0,\"weight\":26.705,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":23.756,\"bearings\":[122,301],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.837665,37.251287],\"geometry_index\":3304,\"admin_index\":0,\"weight\":4.189,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":3.217,\"bearings\":[121,302],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[122,302],\"duration\":8.412,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.676,\"geometry_index\":3305,\"location\":[-121.83845,37.251671]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.840515,37.252681],\"geometry_index\":3307,\"admin_index\":0,\"weight\":6.287,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":5.051,\"bearings\":[122,301],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,302],\"duration\":2.578,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.963,\"geometry_index\":3308,\"location\":[-121.8417,37.253254]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[122,301],\"duration\":1.418,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.629,\"geometry_index\":3309,\"location\":[-121.842309,37.253552]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,302],\"duration\":12.447,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.314,\"geometry_index\":3310,\"location\":[-121.84267,37.253727]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[109,287],\"duration\":1.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.84,\"geometry_index\":3317,\"location\":[-121.845926,37.255048]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[106,285],\"duration\":6.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.59,\"geometry_index\":3319,\"location\":[-121.846359,37.255152]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[95,274],\"duration\":6.787,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.805,\"geometry_index\":3325,\"location\":[-121.848306,37.25543]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-121.85035,37.25549],\"geometry_index\":3328,\"admin_index\":0,\"weight\":14.574,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":12.682,\"bearings\":[92,273],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.854237,37.255599],\"geometry_index\":3330,\"admin_index\":0,\"weight\":16.307,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":14.186,\"bearings\":[92,272],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[90,269],\"duration\":1.5,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.762,\"geometry_index\":3333,\"location\":[-121.858598,37.255641]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.85905,37.255637],\"geometry_index\":3334,\"admin_index\":0,\"weight\":2.967,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":2.107,\"bearings\":[89,270],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[90,270],\"duration\":2.775,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.26,\"geometry_index\":3335,\"location\":[-121.859683,37.25564]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[90,270],\"duration\":11.381,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.373,\"geometry_index\":3336,\"location\":[-121.860514,37.255635]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.863827,37.255686],\"geometry_index\":3338,\"admin_index\":0,\"weight\":7.627,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":6.072,\"bearings\":[93,274],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[94,274],\"duration\":17.713,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":20.812,\"geometry_index\":3339,\"location\":[-121.865574,37.255778]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[95,273],\"duration\":2.24,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.633,\"geometry_index\":3343,\"location\":[-121.871114,37.256112]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.8718,37.256145],\"geometry_index\":3344,\"admin_index\":0,\"weight\":6.854,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":5.854,\"bearings\":[93,270],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[86,263],\"duration\":5.977,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.021,\"geometry_index\":3348,\"location\":[-121.873622,37.256098]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[77,256],\"duration\":2.672,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.141,\"geometry_index\":3352,\"location\":[-121.875469,37.255858]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[75,253],\"duration\":4.924,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.785,\"geometry_index\":3354,\"location\":[-121.876252,37.255695]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.877517,37.255341],\"geometry_index\":3358,\"admin_index\":0,\"weight\":10.355,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":8.41,\"bearings\":[69,246],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.879901,37.254456],\"geometry_index\":3360,\"admin_index\":0,\"weight\":3.646,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":2.742,\"bearings\":[65,245],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[65,247],\"duration\":84.096,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":94.607,\"geometry_index\":3361,\"location\":[-121.880678,37.254166]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.906392,37.250776],\"geometry_index\":3378,\"admin_index\":0,\"weight\":14.176,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":12.607,\"bearings\":[90,270],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[90,269],\"duration\":2.363,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.658,\"geometry_index\":3379,\"location\":[-121.910259,37.250753]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[89,269],\"duration\":8.229,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.258,\"geometry_index\":3380,\"location\":[-121.910973,37.250741]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.913498,37.250706],\"geometry_index\":3383,\"admin_index\":0,\"weight\":3.393,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":2.578,\"bearings\":[89,269],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[89,269],\"duration\":10.652,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.984,\"geometry_index\":3384,\"location\":[-121.914292,37.250697]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[89,269],\"duration\":14.693,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":16.531,\"geometry_index\":3386,\"location\":[-121.917568,37.250672]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[89,269],\"duration\":21.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":24.301,\"geometry_index\":3387,\"location\":[-121.922078,37.25064]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[96,277],\"duration\":3.086,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.471,\"geometry_index\":3395,\"location\":[-121.928714,37.250698]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-121.92965,37.250812],\"geometry_index\":3398,\"admin_index\":0,\"weight\":20.746,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":18.447,\"bearings\":[100,280],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[102,282],\"duration\":2.469,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.77,\"geometry_index\":3401,\"location\":[-121.935179,37.251775]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[102,282],\"duration\":28.984,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":32.607,\"geometry_index\":3402,\"location\":[-121.935919,37.251901]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-121.944612,37.253452],\"geometry_index\":3404,\"admin_index\":0,\"weight\":6.971,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":6.068,\"bearings\":[103,283],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[103,283],\"duration\":6.281,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.225,\"geometry_index\":3405,\"location\":[-121.946431,37.253787]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-121.948315,37.254135],\"geometry_index\":3406,\"admin_index\":0,\"weight\":31.172,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.113,\"bearings\":[103,283],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.956608,37.256084],\"geometry_index\":3412,\"admin_index\":0,\"weight\":5.654,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":4.488,\"bearings\":[114,294],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":1.064,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.225,\"geometry_index\":3413,\"location\":[-121.95787,37.256527]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":10.58,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.902,\"geometry_index\":3414,\"location\":[-121.958173,37.256634]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":1.943,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.188,\"geometry_index\":3415,\"location\":[-121.961146,37.257679]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":5.656,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.365,\"geometry_index\":3416,\"location\":[-121.961706,37.257877]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.963294,37.258439],\"geometry_index\":3419,\"admin_index\":0,\"weight\":3.699,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":2.867,\"bearings\":[116,291],\"out\":1,\"in\":0,\"turn_duration\":0.024,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[111,289],\"duration\":16.416,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":18.469,\"geometry_index\":3420,\"location\":[-121.964122,37.258696]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-121.968983,37.260032],\"geometry_index\":3427,\"admin_index\":0,\"weight\":13.369,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":11.707,\"bearings\":[116,295],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[119,300],\"duration\":5.76,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.336,\"geometry_index\":3429,\"location\":[-121.97221,37.261412]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[120,300],\"duration\":21.023,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":22.602,\"geometry_index\":3430,\"location\":[-121.973783,37.262122]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[118,298],\"duration\":3.6,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.869,\"geometry_index\":3435,\"location\":[-121.979562,37.264643]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[118,300],\"duration\":36.9,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":39.668,\"geometry_index\":3436,\"location\":[-121.980518,37.265056]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[122,303],\"duration\":1.164,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.252,\"geometry_index\":3442,\"location\":[-121.990501,37.269703]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[123,303],\"duration\":37.342,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":40.143,\"geometry_index\":3443,\"location\":[-121.990809,37.269864]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.001524,37.27398],\"geometry_index\":3454,\"admin_index\":0,\"weight\":20.441,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":19.021,\"bearings\":[118,299],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[129,310],\"duration\":1.977,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.125,\"geometry_index\":3459,\"location\":[-122.007091,37.276727]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[130,314],\"duration\":6.168,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.629,\"geometry_index\":3460,\"location\":[-122.007673,37.277115]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[134,315],\"duration\":1.514,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.627,\"geometry_index\":3462,\"location\":[-122.009364,37.278418]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,314],\"duration\":7.867,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.457,\"geometry_index\":3463,\"location\":[-122.009786,37.278755]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.011974,37.280454],\"geometry_index\":3464,\"admin_index\":0,\"weight\":66.32,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":61.236,\"bearings\":[134,314],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.026716,37.295204],\"geometry_index\":3472,\"admin_index\":0,\"weight\":45.439,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":41.316,\"bearings\":[147,327],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.036318,37.304622],\"geometry_index\":3481,\"admin_index\":0,\"weight\":74.244,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":65.557,\"bearings\":[137,317],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,339],\"duration\":9.938,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.18,\"geometry_index\":3491,\"location\":[-122.047504,37.317295]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.048598,37.319511],\"geometry_index\":3492,\"admin_index\":0,\"weight\":14.434,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":12.836,\"bearings\":[159,339],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"bearings\":[167,347],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":3498,\"location\":[-122.049774,37.322371]}]},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to take Interstate 2 80 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to take Interstate 2 80 North.\",\"distanceAlongGeometry\":620},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take Interstate 2 80 North toward San Francisco. Then Keep left to take Interstate 2 80 North.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take Interstate 2 80 North toward San Francisco. Then Keep left to take Interstate 2 80 North.\",\"distanceAlongGeometry\":233.333}],\"intersections\":[{\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true}],\"location\":[-122.050086,37.323654],\"geometry_index\":3502,\"admin_index\":0,\"weight\":0.881,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"duration\":0.803,\"bearings\":[16,170],\"out\":0,\"in\":1,\"turn_duration\":0.037,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[196,352],\"duration\":13.098,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":15.062,\"geometry_index\":3504,\"location\":[-122.050024,37.323823]},{\"bearings\":[170,341],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"turn_duration\":0.036,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":3512,\"location\":[-122.05074,37.326832]}],\"exits\":\"19\",\"bannerInstructions\":[{\"sub\":{\"components\":[{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\",\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-280\",\"type\":\"icon\",\"text\":\"I 280\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 280 North\"},\"distanceAlongGeometry\":648}],\"destinations\":\"I 280 North, I 280 South: San Francisco, San Jose\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"off ramp\",\"instruction\":\"Take exit 19 onto I 280 North toward San Francisco.\",\"modifier\":\"slight right\",\"bearing_after\":16,\"bearing_before\":350,\"location\":[-122.050086,37.323654]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":33.174,\"duration_typical\":28.92,\"duration\":24.889,\"distance\":648,\"driving_side\":\"right\",\"weight\":28.539,\"mode\":\"driving\",\"geometry\":\"kw`efAjajxgFmGgCcAJibAzJaLdAgNbBiNvBoMxBuYvFs[vJiFNcTdHyRfIsa@lQaeA|l@\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take Interstate 2 80 North toward San Francisco.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take Interstate 2 80 North toward San Francisco.\",\"distanceAlongGeometry\":163}],\"intersections\":[{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"location\":[-122.052081,37.329162],\"geometry_index\":3516,\"admin_index\":0,\"weight\":6.033,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"duration\":5.254,\"bearings\":[152,333],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"bearings\":[158,338],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":3521,\"location\":[-122.052702,37.33029]}],\"bannerInstructions\":[{\"sub\":{\"components\":[{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-280\",\"type\":\"icon\",\"text\":\"I 280\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"I 280 North\"},\"distanceAlongGeometry\":191}],\"destinations\":\"I 280 North, CA 85 North: San Francisco, Mountain View\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take I 280 North toward San Francisco.\",\"modifier\":\"slight left\",\"bearing_after\":333,\"bearing_before\":332,\"location\":[-122.052081,37.329162]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":8.594,\"duration_typical\":7.482,\"duration\":7.322,\"distance\":191,\"driving_side\":\"right\",\"weight\":8.412,\"mode\":\"driving\",\"geometry\":\"sokefA`~mxgFgGnD_NpGoL~EoQxHgN|FoQnHsHtC\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 31 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 31 miles.\",\"distanceAlongGeometry\":50366.977},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 2 miles, Take exit 43B.</prosody></amazon:effect></speak>\",\"announcement\":\"In 2 miles, Take exit 43B.\",\"distanceAlongGeometry\":3218.688},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Take exit 43B.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Take exit 43B.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Take exit 43B onto Interstate 3 80 East toward U.S. 1 o1, San Francisco International Airport.</prosody></amazon:effect></speak>\",\"announcement\":\"Take exit 43B onto Interstate 3 80 East toward U.S. 1 o1, San Francisco International Airport.\",\"distanceAlongGeometry\":315}],\"intersections\":[{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.052929,37.33074],\"geometry_index\":3523,\"admin_index\":0,\"weight\":4.051,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"duration\":3.541,\"bearings\":[159,338],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,338],\"duration\":1.74,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2,\"geometry_index\":3524,\"location\":[-122.053304,37.331492]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,336],\"duration\":3.195,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.676,\"geometry_index\":3525,\"location\":[-122.053486,37.331849]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,319],\"duration\":3.723,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.281,\"geometry_index\":3530,\"location\":[-122.053923,37.332465]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,302],\"duration\":21.732,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":24.447,\"geometry_index\":3537,\"location\":[-122.054662,37.333029]},{\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"location\":[-122.059998,37.332874],\"geometry_index\":3558,\"admin_index\":0,\"weight\":1.637,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.018,\"bearings\":[81,264],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[84,273],\"duration\":6.234,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.014,\"geometry_index\":3561,\"location\":[-122.060257,37.332854]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.061817,37.333044],\"geometry_index\":3570,\"admin_index\":0,\"weight\":8.51,\"is_urban\":true,\"turn_weight\":7.25,\"duration\":1.18,\"bearings\":[81,294],\"out\":1,\"in\":0,\"turn_duration\":0.059,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[114,294],\"duration\":8.359,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.195,\"geometry_index\":3571,\"location\":[-122.062104,37.333146]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.064263,37.333915],\"geometry_index\":3573,\"admin_index\":0,\"weight\":15.021,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":13.68,\"bearings\":[114,292],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[91,268],\"duration\":0.957,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.053,\"geometry_index\":3581,\"location\":[-122.068116,37.334483]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.068399,37.334474],\"geometry_index\":3582,\"admin_index\":0,\"weight\":1.596,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.018,\"bearings\":[88,266],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[86,265],\"duration\":0.955,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.051,\"geometry_index\":3583,\"location\":[-122.068697,37.334459]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[85,261],\"duration\":76.262,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":80.074,\"geometry_index\":3584,\"location\":[-122.068987,37.334437]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,301],\"duration\":0.926,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.949,\"geometry_index\":3613,\"location\":[-122.089402,37.340774]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[121,301],\"duration\":62.859,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":64.43,\"geometry_index\":3614,\"location\":[-122.08965,37.340894]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.105048,37.35079],\"geometry_index\":3639,\"admin_index\":0,\"weight\":5.521,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":5.283,\"bearings\":[151,326],\"out\":1,\"in\":0,\"turn_duration\":0.024,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,324],\"duration\":4.941,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.188,\"geometry_index\":3642,\"location\":[-122.105986,37.351906]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[135,313],\"duration\":1.617,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.697,\"geometry_index\":3646,\"location\":[-122.107027,37.352854]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[133,310],\"duration\":14.184,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.893,\"geometry_index\":3648,\"location\":[-122.107387,37.353121]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[108,287],\"duration\":20.297,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":21.291,\"geometry_index\":3657,\"location\":[-122.111281,37.354782]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.116765,37.357015],\"geometry_index\":3668,\"admin_index\":0,\"weight\":19.771,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":18.84,\"bearings\":[133,316],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,334],\"duration\":1.729,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.814,\"geometry_index\":3677,\"location\":[-122.119929,37.36117]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[154,331],\"duration\":14.746,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.484,\"geometry_index\":3678,\"location\":[-122.120164,37.361556]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.123517,37.364232],\"geometry_index\":3689,\"admin_index\":0,\"weight\":40.789,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":39.344,\"bearings\":[121,291],\"out\":1,\"in\":0,\"turn_duration\":0.038,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[111,291],\"duration\":1.012,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.037,\"geometry_index\":3704,\"location\":[-122.135181,37.36638]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[111,290],\"duration\":31.592,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":31.592,\"geometry_index\":3705,\"location\":[-122.135465,37.366466]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,325],\"duration\":0.943,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.943,\"geometry_index\":3718,\"location\":[-122.142772,37.371262]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,324],\"duration\":44.012,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":44.012,\"geometry_index\":3719,\"location\":[-122.142946,37.371456]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[162,344],\"duration\":0.908,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.908,\"geometry_index\":3740,\"location\":[-122.151143,37.380478]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,345],\"duration\":23.76,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.166,\"geometry_index\":3741,\"location\":[-122.151221,37.380692]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[145,323],\"duration\":1.506,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.469,\"geometry_index\":3756,\"location\":[-122.153265,37.386337]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,319],\"duration\":4.078,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.977,\"geometry_index\":3758,\"location\":[-122.153546,37.386629]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[132,308],\"duration\":11.535,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.246,\"geometry_index\":3761,\"location\":[-122.154425,37.387341]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.157576,37.38859],\"geometry_index\":3768,\"admin_index\":0,\"weight\":8.139,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":8.625,\"bearings\":[107,272],\"out\":1,\"in\":0,\"turn_duration\":0.056,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[102,279],\"duration\":9.756,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.268,\"geometry_index\":3771,\"location\":[-122.160225,37.388952]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[117,299],\"duration\":2.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.908,\"geometry_index\":3778,\"location\":[-122.163123,37.389697]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[122,303],\"duration\":15.66,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.486,\"geometry_index\":3780,\"location\":[-122.163689,37.38996]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.167846,37.39202],\"geometry_index\":3790,\"admin_index\":0,\"weight\":1.85,\"is_urban\":false,\"turn_weight\":0.75,\"duration\":1.229,\"bearings\":[115,284],\"out\":1,\"in\":0,\"turn_duration\":0.041,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[104,280],\"duration\":96.516,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":89.277,\"geometry_index\":3791,\"location\":[-122.168206,37.39209]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.189986,37.407383],\"geometry_index\":3819,\"admin_index\":0,\"weight\":11.086,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.691,\"bearings\":[130,307],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,292],\"duration\":3.973,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.873,\"geometry_index\":3826,\"location\":[-122.193728,37.408949]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,292],\"duration\":11.297,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":11.297,\"geometry_index\":3827,\"location\":[-122.195077,37.409375]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,292],\"duration\":3.145,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.125,\"geometry_index\":3828,\"location\":[-122.198893,37.410596]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,292],\"duration\":34.264,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":34.264,\"geometry_index\":3829,\"location\":[-122.199856,37.410903]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":2.652,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.719,\"geometry_index\":3841,\"location\":[-122.210223,37.415473]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,320],\"duration\":1.453,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.488,\"geometry_index\":3842,\"location\":[-122.210815,37.416063]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.211145,37.41638],\"geometry_index\":3843,\"admin_index\":0,\"weight\":46.242,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":46.262,\"bearings\":[140,317],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.225796,37.422325],\"geometry_index\":3868,\"admin_index\":0,\"weight\":48.92,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":49.668,\"bearings\":[131,311],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.238669,37.431696],\"geometry_index\":3883,\"admin_index\":0,\"weight\":16.441,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":16.869,\"bearings\":[135,315],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,317],\"duration\":2.262,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.205,\"geometry_index\":3885,\"location\":[-122.242835,37.435172]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[137,317],\"duration\":15.91,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.514,\"geometry_index\":3886,\"location\":[-122.243384,37.435636]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.247241,37.438854],\"geometry_index\":3888,\"admin_index\":0,\"weight\":29.68,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":29.199,\"bearings\":[136,315],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.255387,37.443916],\"geometry_index\":3902,\"admin_index\":0,\"weight\":23.123,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":23.15,\"bearings\":[110,284],\"out\":1,\"in\":0,\"turn_duration\":0.028,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[84,264],\"duration\":2.754,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.754,\"geometry_index\":3912,\"location\":[-122.26288,37.44396]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[84,266],\"duration\":14.717,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":14.35,\"geometry_index\":3913,\"location\":[-122.263753,37.44389]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[107,290],\"duration\":2.637,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.562,\"geometry_index\":3923,\"location\":[-122.268412,37.444308]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[112,293],\"duration\":1.887,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.84,\"geometry_index\":3925,\"location\":[-122.269187,37.44454]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[115,296],\"duration\":88.307,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":83.891,\"geometry_index\":3927,\"location\":[-122.269748,37.444741]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[163,344],\"duration\":1.434,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.326,\"geometry_index\":3955,\"location\":[-122.290217,37.459872]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,348],\"duration\":3.961,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.662,\"geometry_index\":3957,\"location\":[-122.29034,37.460223]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[177,349],\"duration\":13.939,\"turn_duration\":0.033,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.863,\"geometry_index\":3961,\"location\":[-122.290527,37.461199]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.290763,37.464734],\"geometry_index\":3969,\"admin_index\":0,\"weight\":2.971,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":3.232,\"bearings\":[175,354],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,349],\"duration\":1.199,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.109,\"geometry_index\":3972,\"location\":[-122.290909,37.465545]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,347],\"duration\":10.412,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":9.631,\"geometry_index\":3974,\"location\":[-122.290986,37.465844]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,333],\"duration\":2.146,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.984,\"geometry_index\":3984,\"location\":[-122.292068,37.468341]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[152,330],\"duration\":16.342,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.115,\"geometry_index\":3986,\"location\":[-122.292393,37.468831]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":5.09,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":4.574,\"geometry_index\":3996,\"location\":[-122.295514,37.472166]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":36.672,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":32.998,\"geometry_index\":3998,\"location\":[-122.296543,37.473174]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.298733,37.482054],\"geometry_index\":4027,\"admin_index\":0,\"weight\":29.953,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":31.848,\"bearings\":[8,187],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":40.402,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":37.367,\"geometry_index\":4045,\"location\":[-122.298943,37.490103]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.309379,37.495794],\"geometry_index\":4074,\"admin_index\":0,\"weight\":6.18,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":6.148,\"bearings\":[107,288],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[113,294],\"duration\":16.727,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.465,\"geometry_index\":4078,\"location\":[-122.311221,37.496337]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,305],\"duration\":1.129,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.045,\"geometry_index\":4086,\"location\":[-122.315883,37.498586]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[125,305],\"duration\":14.117,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":13.412,\"geometry_index\":4087,\"location\":[-122.316176,37.49875]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[110,286],\"duration\":29.707,\"turn_duration\":0.024,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":28.197,\"geometry_index\":4096,\"location\":[-122.320163,37.500426]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.329457,37.50181],\"geometry_index\":4110,\"admin_index\":0,\"weight\":26.387,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":27.785,\"bearings\":[115,298],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[127,308],\"duration\":5.717,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.432,\"geometry_index\":4116,\"location\":[-122.336643,37.505971]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[128,308],\"duration\":3.389,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.219,\"geometry_index\":4117,\"location\":[-122.338098,37.506859]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.338961,37.507385],\"geometry_index\":4118,\"admin_index\":0,\"weight\":15.822,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":16.148,\"bearings\":[128,307],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.343016,37.509933],\"geometry_index\":4123,\"admin_index\":0,\"weight\":46.369,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":48.291,\"bearings\":[131,313],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.353348,37.519079],\"geometry_index\":4135,\"admin_index\":0,\"weight\":29.703,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":32.119,\"bearings\":[146,327],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.35824,37.526061],\"geometry_index\":4150,\"admin_index\":0,\"weight\":9.791,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":10.053,\"bearings\":[144,326],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":18.441,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":17.52,\"geometry_index\":4164,\"location\":[-122.359592,37.528314]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":17.449,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":16.576,\"geometry_index\":4165,\"location\":[-122.36141,37.532583]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[155,334],\"duration\":24.227,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":22.998,\"geometry_index\":4186,\"location\":[-122.36332,37.536568]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.3666,37.541885],\"geometry_index\":4199,\"admin_index\":0,\"weight\":16.379,\"is_urban\":false,\"turn_weight\":0.5,\"duration\":16.721,\"bearings\":[149,329],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.369703,37.545145],\"geometry_index\":4218,\"admin_index\":0,\"weight\":11.354,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.959,\"bearings\":[141,321],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":1.225,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.162,\"geometry_index\":4219,\"location\":[-122.372086,37.54745]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,321],\"duration\":21.852,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":20.76,\"geometry_index\":4220,\"location\":[-122.372333,37.54769]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[144,325],\"duration\":126.871,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":120.521,\"geometry_index\":4236,\"location\":[-122.376628,37.551944]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.400947,37.576263],\"geometry_index\":4349,\"admin_index\":0,\"weight\":19.34,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":19.844,\"bearings\":[161,341],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":1.211,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.182,\"geometry_index\":4370,\"location\":[-122.403428,37.580784]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[149,329],\"duration\":15.682,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":15.289,\"geometry_index\":4371,\"location\":[-122.403631,37.581051]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,319],\"duration\":5.58,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.434,\"geometry_index\":4389,\"location\":[-122.406463,37.584437]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.407707,37.58549],\"geometry_index\":4400,\"admin_index\":0,\"weight\":19.643,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":20.166,\"bearings\":[135,313],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":0.934,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":0.91,\"geometry_index\":4423,\"location\":[-122.412313,37.589202]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[142,322],\"duration\":32.365,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":31.557,\"geometry_index\":4424,\"location\":[-122.412511,37.589402]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[141,320],\"duration\":1.072,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.047,\"geometry_index\":4430,\"location\":[-122.4191,37.596083]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[140,319],\"duration\":12.705,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":12.389,\"geometry_index\":4432,\"location\":[-122.419324,37.596296]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[136,316],\"duration\":6.598,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":6.412,\"geometry_index\":4445,\"location\":[-122.422132,37.598639]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.423633,37.599863],\"geometry_index\":4447,\"admin_index\":0,\"weight\":66.275,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":64.68,\"bearings\":[136,316],\"out\":1,\"in\":0,\"turn_duration\":0.021,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[13,195],\"duration\":2.844,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.057,\"geometry_index\":4550,\"location\":[-122.424289,37.614632]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[7,189],\"duration\":8.506,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":9.357,\"geometry_index\":4556,\"location\":[-122.424118,37.615324]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,348],\"duration\":2.092,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.301,\"geometry_index\":4573,\"location\":[-122.4242,37.617482]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,342],\"duration\":6.246,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.871,\"geometry_index\":4579,\"location\":[-122.424367,37.618016]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,333],\"duration\":4.219,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.738,\"geometry_index\":4590,\"location\":[-122.425154,37.61948]},{\"bearings\":[153,333],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":4591,\"location\":[-122.425759,37.620417]}],\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"San Francisco International Airport\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"US 101 / San Francisco International Airport\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"43B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/i-380\",\"type\":\"icon\",\"text\":\"I 380\"},{\"type\":\"text\",\"text\":\"East\"}],\"type\":\"off ramp\",\"modifier\":\"right\",\"text\":\"Exit 43B I 380 East\"},\"distanceAlongGeometry\":50394.977}],\"destinations\":\"I 280 North: San Francisco\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take I 280 North toward San Francisco.\",\"modifier\":\"slight left\",\"bearing_after\":338,\"bearing_before\":339,\"location\":[-122.052929,37.33074]},\"speedLimitSign\":\"mutcd\",\"name\":\"Junipero Serra Freeway\",\"weight_typical\":1758.598,\"duration_typical\":1779.252,\"duration\":1776.461,\"distance\":50394.977,\"driving_side\":\"right\",\"weight\":1754.516,\"mode\":\"driving\",\"ref\":\"I 280 North\",\"geometry\":\"grnefA`soxgF_n@lViUjJoH~CsF~CwFtDcFtDoE|DcDfDoDdEmDpEeDtEiDnFkCzEiCbFaC|FwCxHcDvJiCrJqBhJwApIuAlKy@tJq@pL[rLIdLH|Kd@hLd@vJhAtL~AvLfZrgBnA~Hl@jGf@rG`@|GNlDN~DFvC?tDQjIa@jIk@dIs@rGw@jG}BvMiChNvAxLkE|Peg@noB{FlUiClLgGd]mFx]{Dp_@yCnb@}Az^q@d_@Ifa@PtP\\\\rQj@bQZzFlBxYxCxZ~b@xeExCz^|Ad^`@d]Gd`@s@x\\\\eBp_@qCn]kEx^wFn]qHz[mInZeJbYaLnYkMbX_OxWsPbWi}AjyB{PnX_OxW}MxWaLxUmeCbqF_L|W}KbYmPlc@oFnNuW`r@uMp[yLzWiMvUcMxSwOfU_cBdrBgP~SkOpUgNtV{L~ViLjX}J~XccCdwHeKrXmLvWiMjU{NjUaPxTyJtLoKfLmKbK}LpJqM~I{|@nj@uf@j`@kSlOuHxGsHxGmQ`RiNfP{N|RqGlJcG`JkQrZmMjWiL~W_K|XeJpY}HdZ}Gb[iGn\\\\iF`\\\\uTpuAeFlZcGb[oHd[iItYgJvYeKfXoLzWkM|ViN|UcO~TePvS{P`SqQlQqRjPgSlOmSzMqTrLwq@t]ohAnl@cWtM{O|JeNrJeO~LoNlNgQvRiP~ScO|UwMpV{LfX{LtWiHjR_S|~@iFx[_Ef\\\\sCv\\\\_Bp\\\\w@n]Ul]OduAQr^g@h^eBj\\\\eDh^iFn^qGj]i_A`vEkDvPuTbhAcIt^}Jv^oLv^qMz\\\\uNx[wPd[yP|X_SzX_SfV_UhU}TrSw{AnrAcKzIq{AbrAok@rg@iV|SiV|TsT~T}P`R{RbUmaCjrCoMbOgMpMwLvK}L`KaN`KqMvI{MjIuMjHqL`GeNjG{NzFqNzEoMzDkLzCoOnDsOzCkOzBsP~Bm|B~Y}QtCuOdDgO`EaOnEcOjFcO|GyO~HkOfJiNfKqJfIuG~FqHpH{NlP_OxRsKtPcMzUoJ|ScKnWyI~YmHfYqEdToLdu@ZpFkNpmBcGln@yA|TyC~[iDhZiF`\\\\gGhY}G|WcHpUwFvPuGrPuHlQgIbQkk@`gAuJxScJ~SoHfSsG`TaG`VyEbUsGzUkCnUmBvXqBra@s@n_@cDt`BcAnX{A`VaCpWaDrWkExXoHj_@eJh]cM``@{Mn\\\\uOxZ}NhW{PbVoQrTwS|SguGlqGso@|n@or@rr@{|Cl~C{uC`yCmTbUqRlT}QbV}PrWcPfXyNpYgMnYoKrXyJjZqI~ZiId]sUrdAsYhsAikAnmFeRd{@ms@dfDqiAhhFsHhZ_J~ZcLh[gMlYcM~UcMbTeNvSsMxPqO`Q_c@rc@{c@~c@yRrSsQfUsO~ToMtSwLrTuJbT{JbV{HvTqHhWsG~WsFhX}EhY_Ex[oCtY{]joEqEdb@aGz^cGn[kHbZ}HxX}ItWiLlXuL~VqMlUgMhSuzA|cCo[ph@qvBtkDsQzXePfU_RdW{hBz_CoMlQaNlRwMbSmLbRgdAlcB{pAnwBeVp_@qT~[iVn\\\\wUt[oaEtfF_\\\\ha@{xC`vDgn@~x@ij@du@GHcb@bl@gtBzwCyN|TaNrUoM~VuLbXmKnX}JhZuIhZqHhYoGd[gGh[sDt[qDd\\\\kCn[eBh[mAh\\\\e@n[?j[\\\\h\\\\z@~ZxObqEjCpu@j@hV\\\\pW@f]W~]cAd^aBb^aCf]cD~\\\\aEx\\\\iFt\\\\aFtWmFvVeE|PkEbPyHfXqH`UuKlYoLrXmMfXkNfWyNfVqwCvxE_Xzb@gSv\\\\mTj_@yjBlbDcsGlcLeLjRwLpQqMbQsMnOsNhOsNfNcPlNiPjMiP~K{RtLsStKyNfH{QnH_PxF_StF{I|BaJvBgLpB{LtBoOlBkP^aOzBaQj@}QRiwAbBy`@p@mLRgOv@aOx@wQnA_O|A}NtBoHdAeHrA{P`DeOlDkOtDsNxDmN`EuOnFgNzF{LnFiNvGmL|FyMpHyNvIcJ~F_LbI{LbJwLxJyLfKuLtKuK~JaM~LoKnK}xApyAgTjTwh@|i@aRjR{JzJuK|JwKnJsJpHeMbJ}L~HqL`HoLfG_NnG_NrFwM`FgMdEmNbE{MdDwMxCgNdCsNtBsNdB}MrAcP`AuMf@{NTmNGaNWgOm@yM{@ul@wFknB}OyxDk^yo@mFqOs@aPc@sOE{OD_PXeRl@oQrA}OtAkOdBeP`CyNpCePlD{NhEwPxFoMnF_NfGcNrGaNhHqMvHcNpIwMlJ_MdJuL`K{KhKcLhLaLzLyKrMmKvMmJhMoIbM}IdNiJzOwIfPqH`PgH`QyFlOeGrQiGbSaG`TcFnS{EtTaEhTgEdVa[dpBq[lxBkFh\\\\gGd\\\\{Gl[mHd[eIl[iIdZcJjZ}J|YsK`ZoLvXoL|Wkx@tfBgIhQiUxf@qKlVaIdScIzTuHfViIzXqHnZkIt_@wHpa@kGjd@sEja@qDzd@gC`d@uA`c@y@tc@wDtyBsAtb@qCfc@yDda@qF~`@uGz_@aIt_@cK``@iLt^gMb]wM~YyPr]}iB`nD_|AryCov@|yA{_@|t@}{@fcBc]hp@iSr_@_Tj_@{Yze@mUr]mTvYm@x@uUxZsWx[muJtlLaPvQqPbQaPpOaQxOeQ`OsO|LkQzM_RbMsQzKkR|KmR`KiRjJqSlJyeBhv@kRfJiPtIyPlKmPfLaQ`NcPlNwzArqAePxM_RlMwOvJeKrFkFhCqFbCuF~BuFvBqFnB}FnBuFhBeGlBkFbBsExAyiGrpBq_Blh@}FlBsFjByFnBsFnBsFpBsFpBsFtBsFvBqFxB_G~BuF~BqF|BuFbCiF|B{FhCiF`CoFfCsFjCkFhCoFlCaN`HolF~lCiFlCiFnCeFpCmFxCoF~CcFxCeF~CeF~CkFfDcFhD_FfDiFrDyEfD_FpDyEnDwEpD{ExDyExDyE|DyE`EsE~DuEbEsEfEqEfEuEnEoElEkEnEiElE}KhLmkA~mAaoC|sC_NlN}fDvlDoEtEaEfEsEvEmEnEoEnEmEfEqEjEoEjEyEnEkE~DqEdEsEdEoE|DwEbEuE`E_FdEsEvDoEpDiF`EwEpDaFrD{ElD{EhDiFpD{EdDcFhD_FdDaFdD_FbDoFjDgFbDaFzCgF~CgF|CeFzCgFxCmF|CmuDtwBgFxCeFxCkFzCeF|CmFdDuExCgFjDgFnDyEhDwEnD_FxDuErD{E|D{EbEoE|DuEfEqEfEeEbEmEjEa{Hn{HeEfEcErEeEzEaEbFyDfFuDjFsDrFmDtFiD|FeDdGaDfGyCjGsCjGqCtGkCxGeCxG_CzG{BfHuBbHmBjHkBnHw[ntAgBrHkBzHmBpHsBrHyBnH}BjHeCnHiCfHmCfHuCdHuCzG}CxGyChGwCbGeDdGeD~FiDzFoDzFoDpFuDlF}DnFyDbFeEdFeE|EkEzEiErEoEnEuEjEasGhfGqEdEuEbEwE~D{ExD}ErD}EjD_FfDgFbDcFzCoFxCsFvCgFhCsFfCmFzBuFzBwFrB{FnB{FjBav@hV_tBpp@sFjB{FpBsFrBwFxBwF~BkF|BqFdCkFfCiFlCmFpCcEzBc@VgFxCgF~CgF`DiFhD}EfDcFjD}EhDq_@~WuOtK}`BxiAaFnD}ElD{EhD{EtDcFxDoElD}EbEwEzDwE~DuEdEqEbEqEjEmEfEkEfEkElEoEtEkEtEgEvEeEvEcE|EcEzEeEfFwDxE}DbF}DfFwDfF}DnFsDfFwDtFqDnFsDvFkDrFoDxFiDvFwn@dfAeDtFiD|FmD|FoDtFsDvFuDjF{DnF_ElFyD|E_EzEeE~EgEvEeEnEoErEqEnE_~@`}@oKjKqz@ry@{`Eb~DggCdeCkEjEqEnE}M~MuE|EsE`FqBvBeEvEgEzE_EvE_ExEaE|E_EdF{D|EcEjF_EjF}DhF_EjFmkA`}AoeApuA_EfFuwA|jB}DbF_E~E_EtEgExEkEpEqEtEmEdEsEfEsEzDyE|D}EvD_FpD}EjDaFdDeF`DiF|CgFtCiFpCmFlCwFjCoF~BuF|BwFrBwFrBqFfB_GhBqGdB{FvAeFnAaGlAaGhAaG`AaG|@gGv@iGr@uGn@gF^kG\\\\kGZgGRoGLsFDgG@gGCeGIkGOcGUcG[gGa@cGe@eGm@gGs@aGs@gGy@cG{@aG}@eGcAeGeA_GgAiGmAwFoA}FsA{FuA{FwA{F}A{FcByFcBuFgBaGmBsFmB{FqBkFqByF{ByF_CqF}BqFeCgF_CmFeCoFmCmFoCmFsCkFyCgFwCeFyCiFaD_F_DcFaDk_Aam@iFeD}E{CiF}CoFwCeFkCyFoCqF_CkFwBsFsB{FoBsFeB}FaBwF}AsG{AqFiA_GiA}F_AcGu@aGu@qBUcIq@gGa@cG[gGSgGMaGGiGAoGD_GLeGTeGZgG^eGh@_Gj@_Gt@}Fz@gAPcBXuFbA{FhAmEbAqCt@uBj@}GpByFfByFnBwFrBqFxBmF~BqFhCmFlCeFnCkFvCsMlHqy@xd@{_DxfB\"},{\"ref\":\"I 380 East\",\"mode\":\"driving\",\"weight\":123.305,\"distance\":2539.999,\"geometry\":\"}kiwfAv`kohFskA|f@mLtFkXjMik@vWuFdC{B`A{B|@}Bx@yBp@_Cn@wBh@aCd@kAReDd@qC\\\\qCVeCR{BHaCDmC@qCAsBE}BIwBKqBOmC[kC]}B_@mCi@wBe@cCq@qBi@_Cy@wBw@_CcAuB_A{BiAsBiAyBsAkBmAuB{A}AkAaBsAsBmB_CyB_BcBeBmB{AkBgB{BuAiBcB{ByAsB{AyBqDuFiDyFeDgG}CeG{CqGuCeGkRma@{D{JcEyK{\\\\qcAsFoPsLi^oX{w@wRwh@amAa~CaK}WoHsSgDsJmNea@iV}s@sFwP}EuPyE}QwDmQeDmRyCkScCeSiBcSqAkSi@sMs@_VQ_QCmPlA_n@HiCHsAfAoQlGogA~Bka@b@yI`AuTbBs_@t@eSb@aUD}QIeS\",\"duration\":97.596,\"driving_side\":\"right\",\"duration_typical\":101,\"weight_typical\":128.582,\"name\":\"Quentin L. Kopp Freeway\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"off ramp\",\"instruction\":\"Take exit 43B onto I 380 East toward US 101/San Francisco International Airport.\",\"modifier\":\"slight right\",\"bearing_after\":338,\"bearing_before\":333,\"location\":[-122.42742,37.622991]},\"speedLimitUnit\":\"mph\",\"destinations\":\"I 380 East, US 101: San Francisco International Airport\",\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"6B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 6B US 101 North\"},\"distanceAlongGeometry\":2539.999},{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"slight left\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"slight left\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"straight\",\"active\":true,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"San Francisco\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"San Francisco\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"6B\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 6B US 101 North\"},\"distanceAlongGeometry\":804.672}],\"exits\":\"43B\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 1.5 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 1.5 miles.\",\"distanceAlongGeometry\":2511.999},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to take exit 6B.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to take exit 6B.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to take exit 6B onto U.S. 1 o1 North toward San Francisco.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to take exit 6B onto U.S. 1 o1 North toward San Francisco.\",\"distanceAlongGeometry\":247.222}],\"intersections\":[{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[153,338],\"duration\":7.467,\"turn_duration\":0.01,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.389,\"geometry_index\":4592,\"location\":[-122.42742,37.622991]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":1.914,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.201,\"geometry_index\":4594,\"location\":[-122.428182,37.624432]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":5.887,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":6.771,\"geometry_index\":4595,\"location\":[-122.428412,37.624838]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,351],\"duration\":1.35,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.553,\"geometry_index\":4605,\"location\":[-122.429067,37.626145]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[172,358],\"duration\":16.082,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":18.494,\"geometry_index\":4609,\"location\":[-122.429123,37.626441]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.426673,37.629347],\"geometry_index\":4652,\"admin_index\":0,\"weight\":8.846,\"is_urban\":true,\"turn_weight\":7,\"duration\":1.578,\"bearings\":[58,235],\"out\":0,\"in\":1,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[61,239],\"duration\":5.324,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.256,\"geometry_index\":4654,\"location\":[-122.426278,37.629539]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.424901,37.630139],\"geometry_index\":4656,\"admin_index\":0,\"weight\":24.244,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":20.211,\"bearings\":[61,241],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[60,240],\"duration\":0.697,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":0.855,\"geometry_index\":4662,\"location\":[-122.419548,37.632675]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[60,240],\"duration\":2.191,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.684,\"geometry_index\":4663,\"location\":[-122.419362,37.632759]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[61,240],\"duration\":3.188,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.904,\"geometry_index\":4664,\"location\":[-122.418815,37.633006]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.417968,37.633379],\"geometry_index\":4665,\"admin_index\":0,\"weight\":13.408,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":10.545,\"bearings\":[62,241],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.414961,37.634154],\"geometry_index\":4675,\"admin_index\":0,\"weight\":2.084,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.328,\"bearings\":[85,263],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[88,265],\"duration\":4.539,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":5.447,\"geometry_index\":4676,\"location\":[-122.414593,37.63418]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[98,274],\"duration\":1.408,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":1.691,\"geometry_index\":4679,\"location\":[-122.413274,37.634152]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.412867,37.634106],\"geometry_index\":4682,\"admin_index\":0,\"weight\":4.943,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":4.127,\"bearings\":[98,279],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[98,278],\"duration\":2.561,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":3.072,\"geometry_index\":4683,\"location\":[-122.411707,37.633971]},{\"bearings\":[97,278],\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"geometry_index\":4685,\"location\":[-122.410984,37.633889]}]},{\"ref\":\"US 101 North\",\"mode\":\"driving\",\"weight\":715.219,\"distance\":15895.994,\"geometry\":\"em~wfAxufnhFCmOWkOg@oPq@aNyAsQoBcQmCkSgCuPcDaQ{E_U{DsOiDoL{DsLkFwLoFqKsFmJiGuIkIyIeIeHuIsFqJwEcJeD_LoC}JkAcKg@cL@eJj@iK|A}JfCcKrDyQnIabBhw@cPbHsJ|D}JlDaLxCcNbDoj@bIw_AhReI`@iGVamA|EmrDtNykArE{l@bC_ZjAct@vCyRx@ePn@i_ApDgXbA}eAdE}FRuBFaPLqOCuOQcN_@eNu@aNgAyOaBuM_B_P{B{NkCwOcD{NyDkNuE}NyFslAyf@_\\\\{M_NaGaNiGiMuGoLkH_MgIuL}IoN{L_MiLeLyLeMkOaKeNgJaNqJoOgIyN}oBcoDuIuOkIwN}ImOsIwN_JqNeJyM{IcMeKgN}JgMsJoLwLaNuKsLeKyKuKoKyKiKmf@}c@wy@sw@ogCabCgLkKiLwJkLuJyLqJwLkJ{LcJ{L{I}LsIcMkIeMcIiM}HmMuHoMmH{MiHyLiGeFiCgEuB_NuG_NiGaNeGaNyFkNuFeNkFcDkA{JkDkNyEsNsEuNgEyNwD}NcD}NiCeOwBeOaBgOkAiOy@kOc@mOQoOBmOXgOj@cOdAiOtAuOjBgOvBeOlBq_@nEc_@jEm_@rEe_@bFc_@fFgrJtrAyoBnXupD|f@opAfQugEll@_pD|f@mxDxh@u_BxTk_@jFc_@hFe_@jFk_@fFaTrC{InA_U~CkMdBc\\\\pEw\\\\pEes@xJc_@jFwSvCoFx@kGhAiGlAoFjAkG|AcG|A}F~AmF|AuFfBqFlB_GxByF`CqFfCkFjCsFrCiFvCiF|C_FbDcFhDyEfDaFrDqEjDsv@vm@qLfJwEpDyEdDeFlD}E|CeFxCiFvCgFnCqFlC_GnCwF|BgFrBsFrB}FrB{ExA}FbByFxA_GxA}FnA}FfAeGfAogBvZkCd@yj@xJyj@rMgRdE{ObCyf@lLo^dLctAdb@}XdIwAZa~@jT_b@jMoEdAwfCtq@iExAgxAzf@eQ~I{tBd_AoUnJeSrIoRzIu[lOgBv@kNpGsOpHma@zSeOlHgaAxg@uVvMqMdGiLlFgNtFyM`FwLrDoNrDcObDqOpCuOzBoMxA_O`AyOp@qKR{NFwPWqUqA}P}AgOiBeOuCgP{DyMsDuNmEcOaG_MeGqO}IuMsI}LwJc`Ayu@sMqJ{NiIcMkGaO}FsFwB}FuBuFkByFcBaG}AiGsA{FmAyFkA_GmAaGoAa_AcSeiAuVujBga@e`A}SuFmAoGsA_GkA_GeA_G_AcGw@iGs@cGm@}Fc@kGa@mGY{FSyGM{FEqGAcGDeGLwOj@sx@nDuxApGcG\\\\oGh@yFj@yG|@{F`A{FpAyF~AsFjBsF|BmFjCqF|CeFhDyErDyEdEoEnEyEpF{D|EyDfFuDlFsDvFmDrFoDxFkDpFuD|FqDjF{DlF}DfF_EtEcEhEqEdE_FzD}EfDgFzCaFfC{FbCqFlBwF~A}FnAyF~@_Gp@cG`@iGNeG@wFMkG[_Gm@{F}@iGqAuF{AuFkBqFyBqFaCiFeCkFoC}FaDwEkCqF{CkFsCoFqCoFgCsFcCuFwBiGuBgF}AgG}A_GoAcGgAaGy@qAOwDa@eGg@gGc@sG]wMk@\",\"duration\":634.688,\"driving_side\":\"right\",\"duration_typical\":638.385,\"weight_typical\":720.746,\"name\":\"\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to take exit 6B onto US 101 North toward San Francisco.\",\"modifier\":\"slight right\",\"bearing_after\":89,\"bearing_before\":89,\"location\":[-122.408813,37.633763]},\"speedLimitUnit\":\"mph\",\"destinations\":\"US 101 North: San Francisco\",\"bannerInstructions\":[{\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Golden Gate Bridge\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Golden Gate Bridge\"},\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Ninth Street\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Ninth Street\"},\"distanceAlongGeometry\":15895.994},{\"sub\":{\"components\":[{\"active_direction\":\"slight left\",\"active\":true,\"directions\":[\"slight left\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight left\",\"active\":true,\"directions\":[\"slight left\",\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Golden Gate Bridge\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Golden Gate Bridge\"},\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Ninth Street\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Ninth Street\"},\"distanceAlongGeometry\":1609.344}],\"exits\":\"6B\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for 10 miles.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for 10 miles.\",\"distanceAlongGeometry\":15867.994},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Keep left to stay on U.S. 1 o1 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Keep left to stay on U.S. 1 o1 North.\",\"distanceAlongGeometry\":1609.344},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep left to stay on U.S. 1 o1 North.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep left to stay on U.S. 1 o1 North.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to stay on U.S. 1 o1 North toward Golden Gate Bridge.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to stay on U.S. 1 o1 North toward Golden Gate Bridge.\",\"distanceAlongGeometry\":213.333}],\"intersections\":[{\"lanes\":[{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.408813,37.633763],\"geometry_index\":4691,\"admin_index\":0,\"weight\":10.09,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"duration\":8.594,\"bearings\":[89,269],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[68,250],\"duration\":7.074,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":8.135,\"geometry_index\":4700,\"location\":[-122.406281,37.634144]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[45,230],\"duration\":14.568,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":16.752,\"geometry_index\":4707,\"location\":[-122.404625,37.634887]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":7.721,\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.07,\"geometry_index\":4722,\"location\":[-122.404087,37.637748]},{\"mapbox_streets_v8\":{\"class\":\"motorway_link\"},\"location\":[-122.404988,37.639333],\"geometry_index\":4723,\"admin_index\":0,\"weight\":15.215,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":12.531,\"bearings\":[156,337],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.405946,37.642167],\"geometry_index\":4730,\"admin_index\":0,\"weight\":14.424,\"is_urban\":true,\"turn_weight\":7,\"duration\":6.33,\"bearings\":[167,355],\"out\":1,\"in\":0,\"turn_duration\":0.011,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.406086,37.643712],\"geometry_index\":4733,\"admin_index\":0,\"weight\":19.727,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":16.795,\"bearings\":[176,356],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":3.012,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.539,\"geometry_index\":4735,\"location\":[-122.406443,37.647812]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.406509,37.648546],\"geometry_index\":4736,\"admin_index\":0,\"weight\":2.615,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":1.807,\"bearings\":[176,356],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":3.639,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.275,\"geometry_index\":4737,\"location\":[-122.406547,37.648978]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":1.326,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.559,\"geometry_index\":4738,\"location\":[-122.406623,37.649828]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":1.199,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.41,\"geometry_index\":4739,\"location\":[-122.406652,37.650145]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.406676,37.65042],\"geometry_index\":4740,\"admin_index\":0,\"weight\":5.23,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":4.459,\"bearings\":[176,356],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":1.779,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.092,\"geometry_index\":4741,\"location\":[-122.406765,37.651449]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":6.453,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":7.422,\"geometry_index\":4742,\"location\":[-122.406799,37.651853]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[177,359],\"duration\":8.641,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.936,\"geometry_index\":4745,\"location\":[-122.406912,37.653174]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[10,189],\"duration\":12.049,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":13.555,\"geometry_index\":4753,\"location\":[-122.406732,37.655209]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.405556,37.658],\"geometry_index\":4760,\"admin_index\":0,\"weight\":14.637,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":12.859,\"bearings\":[22,202],\"out\":0,\"in\":1,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.40351,37.660743],\"geometry_index\":4771,\"admin_index\":0,\"weight\":38.076,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":36.271,\"bearings\":[45,222],\"out\":0,\"in\":1,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[37,217],\"duration\":4.855,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":4.971,\"geometry_index\":4792,\"location\":[-122.395605,37.666712]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.394699,37.667652],\"geometry_index\":4793,\"admin_index\":0,\"weight\":11.203,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":11.211,\"bearings\":[37,217],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.392602,37.669836],\"geometry_index\":4794,\"admin_index\":0,\"weight\":16.117,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":16.537,\"bearings\":[36,217],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[25,205],\"duration\":7.387,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":7.018,\"geometry_index\":4810,\"location\":[-122.389996,37.673302]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[20,201],\"duration\":17.641,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":0,\"weight\":16.758,\"geometry_index\":4818,\"location\":[-122.38913,37.674935]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[174,353],\"duration\":64.453,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":61.211,\"geometry_index\":4835,\"location\":[-122.388355,37.679244]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":25.09,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":23.836,\"geometry_index\":4848,\"location\":[-122.391787,37.694766]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.393153,37.700809],\"geometry_index\":4850,\"admin_index\":0,\"weight\":25.164,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":25.17,\"bearings\":[170,350],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":3.645,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":3.729,\"geometry_index\":4855,\"location\":[-122.394524,37.70687]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":2.25,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.307,\"geometry_index\":4857,\"location\":[-122.394714,37.707725]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":0.975,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1,\"geometry_index\":4859,\"location\":[-122.394834,37.708251]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":2.119,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":2.174,\"geometry_index\":4860,\"location\":[-122.394885,37.708481]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":8.24,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":8.445,\"geometry_index\":4861,\"location\":[-122.39499,37.708947]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,350],\"duration\":1.439,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":1.512,\"geometry_index\":4864,\"location\":[-122.395402,37.710772]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.395478,37.711104],\"geometry_index\":4865,\"admin_index\":0,\"weight\":7.078,\"is_urban\":false,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":6.76,\"bearings\":[170,349],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[158,336],\"duration\":5.592,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":false,\"admin_index\":0,\"out\":1,\"weight\":5.871,\"geometry_index\":4877,\"location\":[-122.396043,37.712618]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[147,326],\"duration\":4.557,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.898,\"geometry_index\":4887,\"location\":[-122.396837,37.713766]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[146,327],\"duration\":10.578,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.363,\"geometry_index\":4888,\"location\":[-122.397585,37.714656]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,347],\"duration\":8.961,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.857,\"geometry_index\":4906,\"location\":[-122.398893,37.716892]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.399449,37.718949],\"geometry_index\":4910,\"admin_index\":0,\"weight\":0.869,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":0.334,\"bearings\":[168,348],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,348],\"duration\":3.131,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.521,\"geometry_index\":4911,\"location\":[-122.399468,37.719019]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[168,345],\"duration\":3.102,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.49,\"geometry_index\":4912,\"location\":[-122.399657,37.71972]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[165,346],\"duration\":13.711,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":15.768,\"geometry_index\":4913,\"location\":[-122.399891,37.720421]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[162,343],\"duration\":1.801,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.115,\"geometry_index\":4918,\"location\":[-122.401045,37.723502]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[163,346],\"duration\":0.188,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.221,\"geometry_index\":4919,\"location\":[-122.401208,37.723917]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[166,345],\"duration\":4.35,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.111,\"geometry_index\":4920,\"location\":[-122.401222,37.723961]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.401564,37.72497],\"geometry_index\":4921,\"admin_index\":0,\"weight\":14.541,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":12.396,\"bearings\":[165,342],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[164,341],\"duration\":0.475,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":0.57,\"geometry_index\":4924,\"location\":[-122.40264,37.727806]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[161,341],\"duration\":8.199,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.84,\"geometry_index\":4925,\"location\":[-122.402685,37.727907]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.403499,37.729626],\"geometry_index\":4927,\"admin_index\":0,\"weight\":10.871,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":9.068,\"bearings\":[154,337],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[157,338],\"duration\":7.24,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.869,\"geometry_index\":4928,\"location\":[-122.404526,37.731512]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":2.453,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.004,\"geometry_index\":4933,\"location\":[-122.405345,37.733018]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,334],\"duration\":3.955,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.846,\"geometry_index\":4935,\"location\":[-122.405635,37.73353]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.40612,37.73434],\"geometry_index\":4937,\"admin_index\":0,\"weight\":9.609,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":7.863,\"bearings\":[155,334],\"out\":1,\"in\":0,\"turn_duration\":0.019,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[156,336],\"duration\":8.922,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":10.93,\"geometry_index\":4940,\"location\":[-122.40714,37.736012]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[170,351],\"duration\":3.363,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.119,\"geometry_index\":4948,\"location\":[-122.407892,37.737964]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.407995,37.738721],\"geometry_index\":4951,\"admin_index\":0,\"weight\":4.91,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":3.607,\"bearings\":[176,358],\"out\":1,\"in\":0,\"turn_duration\":0.008,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[5,182],\"duration\":1.674,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":2.051,\"geometry_index\":4954,\"location\":[-122.407997,37.73946]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[7,185],\"duration\":5.209,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":6.381,\"geometry_index\":4955,\"location\":[-122.407956,37.739821]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.407687,37.740903],\"geometry_index\":4959,\"admin_index\":0,\"weight\":25.506,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":20.422,\"bearings\":[17,195],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid\":false,\"active\":false}],\"location\":[-122.405094,37.744858],\"geometry_index\":4973,\"admin_index\":0,\"weight\":17.783,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":14.539,\"bearings\":[19,201],\"out\":0,\"in\":1,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[14,194],\"duration\":7.748,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":9.49,\"geometry_index\":4983,\"location\":[-122.404044,37.748088]},{\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"bearings\":[14,194],\"duration\":26.666,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"weight\":32.666,\"geometry_index\":4984,\"location\":[-122.403496,37.749811]},{\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"location\":[-122.402861,37.753345],\"geometry_index\":5003,\"admin_index\":0,\"weight\":6.988,\"is_urban\":true,\"turn_weight\":0.5,\"duration\":5.305,\"bearings\":[176,356],\"out\":1,\"in\":0,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[176,356],\"duration\":48.086,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":58.904,\"geometry_index\":5004,\"location\":[-122.402949,37.754267]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.405894,37.761785],\"geometry_index\":5058,\"admin_index\":0,\"weight\":13.424,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":10.967,\"bearings\":[26,204],\"out\":0,\"in\":1,\"turn_duration\":0.007,\"classes\":[\"motorway\"],\"entry\":[true,false]},{\"bearings\":[9,193],\"entry\":[true,false],\"classes\":[\"motorway\"],\"in\":1,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":0,\"geometry_index\":5072,\"location\":[-122.405023,37.763501]}]},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In 1 mile, Keep right to take exit 4 34A.</prosody></amazon:effect></speak>\",\"announcement\":\"In 1 mile, Keep right to take exit 4 34A.\",\"distanceAlongGeometry\":1373.333},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a half mile, Keep right to take exit 4 34A.</prosody></amazon:effect></speak>\",\"announcement\":\"In a half mile, Keep right to take exit 4 34A.\",\"distanceAlongGeometry\":804.672},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep right to take exit 4 34A onto U.S. 1 o1 North, Duboce Avenue toward Duboce Avenue, Golden Gate Bridge.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep right to take exit 4 34A onto U.S. 1 o1 North, Duboce Avenue toward Duboce Avenue, Golden Gate Bridge.\",\"distanceAlongGeometry\":275.556}],\"intersections\":[{\"lanes\":[{\"indications\":[\"slight left\"],\"valid_indication\":\"slight left\",\"valid\":true,\"active\":true},{\"indications\":[\"slight left\",\"straight\"],\"valid_indication\":\"slight left\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid\":false,\"active\":false}],\"location\":[-122.404894,37.7644],\"geometry_index\":5079,\"admin_index\":0,\"weight\":37.16,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":30.363,\"bearings\":[184,358],\"out\":1,\"in\":0,\"turn_duration\":0.028,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.406891,37.769019],\"geometry_index\":5105,\"admin_index\":0,\"weight\":16.037,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"duration\":13.113,\"bearings\":[134,311],\"out\":1,\"in\":0,\"turn_duration\":0.022,\"classes\":[\"motorway\"],\"entry\":[false,true]},{\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"bearings\":[59,231],\"duration\":10.691,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.096,\"geometry_index\":5127,\"location\":[-122.409187,37.769736]},{\"bearings\":[95,274],\"entry\":[false,true],\"classes\":[\"motorway\"],\"in\":0,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"motorway\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5142,\"location\":[-122.411291,37.7695]}],\"bannerInstructions\":[{\"sub\":{\"components\":[{\"active\":false,\"directions\":[\"straight\"],\"type\":\"lane\",\"text\":\"\"},{\"active_direction\":\"slight right\",\"active\":true,\"directions\":[\"straight\",\"slight right\"],\"type\":\"lane\",\"text\":\"\"},{\"active\":false,\"directions\":[\"slight right\"],\"type\":\"lane\",\"text\":\"\"}],\"text\":\"\"},\"secondary\":{\"components\":[{\"type\":\"text\",\"text\":\"Duboce Avenue\"},{\"type\":\"text\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Golden Gate Bridge\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Duboce Avenue / Golden Gate Bridge\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"434A\"},{\"imageBaseURL\":\"https://mapbox-navigation-shields.s3.amazonaws.com/public/shields/v4.1/US/us-101\",\"type\":\"icon\",\"text\":\"US 101\"},{\"type\":\"text\",\"text\":\"North\"},{\"type\":\"delimiter\",\"text\":\"/\"},{\"type\":\"text\",\"text\":\"Duboce Avenue\"}],\"type\":\"fork\",\"modifier\":\"right\",\"text\":\"Exit 434A US 101 North / Duboce Avenue\"},\"distanceAlongGeometry\":1400}],\"destinations\":\"Ninth Street, Golden Gate Bridge, Civic Center\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to stay on US 101 North toward Golden Gate Bridge.\",\"modifier\":\"slight left\",\"bearing_after\":358,\"bearing_before\":4,\"location\":[-122.404894,37.7644]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":151.717,\"duration_typical\":123.498,\"duration\":73.725,\"distance\":1400,\"driving_side\":\"right\",\"weight\":90.742,\"mode\":\"driving\",\"ref\":\"US 101 North\",\"geometry\":\"_r}_gAz`_nhFao@~@aGL_GPgGVwEToCPewA`J_CP}BT_CXaC^eCh@aCp@aCx@}B`A{BhAiBfAyA~@oA~@kA`AsAlAoApAkAnAgCzCgCjDwt@peAoD|F{C|E}D|GoDrGcOhXwCrFaCbFgAjC}@nCy@`Di@|C]`DQdDElCBlCNzCTjC`@nCj@bC~@~CnAdDtA|CnBpDnBnDhBjDhB~DbB`F`ApEd@jERjE?nEKbFc@hLSxEQlEs@zTq@rS{@t_@MvIUjTsCd~DYbT\"},{\"ref\":\"US 101 North\",\"mode\":\"driving\",\"weight\":151.482,\"distance\":334,\"geometry\":\"eyg`gAxetnhFqC~ZiA|LqA|LqArLwAxLkArLwAlPwF|r@{Dnf@uBrY\",\"duration\":123.672,\"driving_side\":\"right\",\"duration_typical\":57.27,\"weight_typical\":70.141,\"name\":\"\",\"speedLimitSign\":\"mutcd\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep right to take exit 434A onto US 101 North/Duboce Avenue/Mission Street toward Duboce Avenue/Golden Gate Bridge.\",\"modifier\":\"slight right\",\"bearing_after\":282,\"bearing_before\":273,\"location\":[-122.415725,37.769635]},\"speedLimitUnit\":\"mph\",\"destinations\":\"US 101 North: Duboce Avenue, Mission Street, Duboce Avenue, Golden Gate Bridge, Mission Street\",\"bannerInstructions\":[{\"sub\":{\"components\":[{\"type\":\"text\",\"text\":\"Duboce Avenue\"}],\"type\":\"turn\",\"modifier\":\"straight\",\"text\":\"Duboce Avenue\"},\"primary\":{\"components\":[{\"type\":\"exit\",\"text\":\"Exit\"},{\"type\":\"exit-number\",\"text\":\"434A\"},{\"type\":\"text\",\"text\":\"Duboce Avenue\"}],\"type\":\"fork\",\"modifier\":\"left\",\"text\":\"Exit 434A Duboce Avenue\"},\"distanceAlongGeometry\":334}],\"exits\":\"434A\",\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a quarter mile, Keep left to take exit 4 34A.</prosody></amazon:effect></speak>\",\"announcement\":\"In a quarter mile, Keep left to take exit 4 34A.\",\"distanceAlongGeometry\":307.333},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Keep left to take exit 4 34A toward Duboce Avenue. Then Continue on Duboce Avenue.</prosody></amazon:effect></speak>\",\"announcement\":\"Keep left to take exit 4 34A toward Duboce Avenue. Then Continue on Duboce Avenue.\",\"distanceAlongGeometry\":188.889}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[93,282],\"duration\":86.053,\"lanes\":[{\"indications\":[\"straight\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":true},{\"indications\":[\"slight right\"],\"valid_indication\":\"slight right\",\"valid\":true,\"active\":false}],\"turn_duration\":0.013,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":105.398,\"geometry_index\":5147,\"location\":[-122.415725,37.769635]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"entry\":[false,true],\"in\":0,\"bearings\":[101,281],\"duration\":20.52,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":25.137,\"geometry_index\":5155,\"location\":[-122.418386,37.770077]},{\"lanes\":[{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"right\"],\"valid\":false,\"active\":false}],\"bearings\":[101,280],\"entry\":[false,true],\"in\":0,\"mapbox_streets_v8\":{\"class\":\"primary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5156,\"location\":[-122.419018,37.770171]}]},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue on Duboce Avenue for a half mile.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue on Duboce Avenue for a half mile.\",\"distanceAlongGeometry\":42}],\"intersections\":[{\"bearings\":[100,270],\"entry\":[false,true],\"in\":0,\"turn_duration\":0.038,\"mapbox_streets_v8\":{\"class\":\"secondary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5157,\"location\":[-122.419444,37.77023]}],\"exits\":\"434A\",\"bannerInstructions\":[{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Duboce Avenue\"}],\"type\":\"turn\",\"modifier\":\"straight\",\"text\":\"Duboce Avenue\"},\"distanceAlongGeometry\":42}],\"destinations\":\"Duboce Avenue\",\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"fork\",\"instruction\":\"Keep left to take exit 434A toward Duboce Avenue.\",\"modifier\":\"slight left\",\"bearing_after\":270,\"bearing_before\":280,\"location\":[-122.419444,37.77023]},\"speedLimitSign\":\"mutcd\",\"name\":\"\",\"weight_typical\":9.748,\"duration_typical\":7.996,\"duration\":12.639,\"distance\":42,\"driving_side\":\"right\",\"weight\":15.436,\"mode\":\"driving\",\"geometry\":\"k~h`gAfn{nhFC|KF|CVtCd@tE\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a quarter mile, Turn left onto Waller Street.</prosody></amazon:effect></speak>\",\"announcement\":\"In a quarter mile, Turn left onto Waller Street.\",\"distanceAlongGeometry\":402.336},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Turn left onto Waller Street.</prosody></amazon:effect></speak>\",\"announcement\":\"Turn left onto Waller Street.\",\"distanceAlongGeometry\":50}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[80,251],\"duration\":4.848,\"turn_weight\":3.5,\"turn_duration\":2.036,\"mapbox_streets_v8\":{\"class\":\"secondary_link\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.566,\"geometry_index\":5161,\"location\":[-122.419912,37.770197]},{\"entry\":[false,true],\"in\":0,\"bearings\":[71,265],\"duration\":16.256,\"turn_weight\":7,\"turn_duration\":2.019,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":24.439,\"geometry_index\":5162,\"location\":[-122.420176,37.770126]},{\"entry\":[false,true],\"in\":0,\"bearings\":[69,259],\"duration\":4.443,\"turn_weight\":0.5,\"turn_duration\":0.014,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.928,\"geometry_index\":5165,\"location\":[-122.421134,37.769989]},{\"entry\":[false,true],\"in\":0,\"bearings\":[80,262],\"duration\":1.393,\"turn_weight\":0.5,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.195,\"geometry_index\":5168,\"location\":[-122.421488,37.769937]},{\"entry\":[false,true],\"in\":0,\"bearings\":[82,265],\"duration\":17.494,\"turn_weight\":0.5,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":21.92,\"geometry_index\":5169,\"location\":[-122.421601,37.769924]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":7.734,\"turn_weight\":2,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.016,\"geometry_index\":5171,\"location\":[-122.422368,37.769874]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":6.307,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.217,\"geometry_index\":5172,\"location\":[-122.422762,37.76985]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":10.447,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.289,\"geometry_index\":5173,\"location\":[-122.42316,37.769827]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,265],\"duration\":1.164,\"turn_weight\":0.5,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.902,\"geometry_index\":5174,\"location\":[-122.423821,37.769788]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,266],\"duration\":0.818,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.502,\"geometry_index\":5175,\"location\":[-122.423899,37.769783]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":7.527,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":9.721,\"geometry_index\":5176,\"location\":[-122.423955,37.76978]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.424477,37.769749],\"geometry_index\":5177,\"admin_index\":0,\"weight\":3.203,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":0.007,\"turn_weight\":2,\"duration\":0.988,\"bearings\":[86,266],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"location\":[-122.424542,37.769745],\"geometry_index\":5178,\"admin_index\":0,\"weight\":3.533,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":2.019,\"turn_weight\":2,\"duration\":3.271,\"bearings\":[86,265],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true},{\"indications\":[\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":false}],\"location\":[-122.424637,37.769739],\"geometry_index\":5179,\"admin_index\":0,\"weight\":3.176,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":2.008,\"turn_weight\":2,\"duration\":2.969,\"bearings\":[85,266],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,265],\"duration\":1.459,\"turn_weight\":2,\"turn_duration\":0.019,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.764,\"geometry_index\":5180,\"location\":[-122.424726,37.769734]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,266],\"duration\":1.688,\"turn_weight\":0.5,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.559,\"geometry_index\":5181,\"location\":[-122.424866,37.769725]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":0.48,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":1.088,\"geometry_index\":5182,\"location\":[-122.425028,37.769716]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":4.057,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.461,\"geometry_index\":5183,\"location\":[-122.425078,37.769713]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,265],\"duration\":1.65,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.521,\"geometry_index\":5184,\"location\":[-122.425382,37.769695]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,266],\"duration\":1.334,\"turn_weight\":0.5,\"turn_duration\":0.008,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.125,\"geometry_index\":5185,\"location\":[-122.425508,37.769687]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":2.707,\"turn_weight\":0.5,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.807,\"geometry_index\":5186,\"location\":[-122.425584,37.769683]},{\"entry\":[false,true],\"in\":0,\"bearings\":[86,266],\"duration\":2.887,\"turn_weight\":2,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":5.527,\"geometry_index\":5187,\"location\":[-122.425749,37.769673]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"left\",\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.425975,37.769659],\"geometry_index\":5188,\"admin_index\":0,\"weight\":4.469,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":0.007,\"turn_weight\":2,\"duration\":2.023,\"bearings\":[86,266],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"left\",\"straight\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"location\":[-122.426132,37.76965],\"geometry_index\":5189,\"admin_index\":0,\"weight\":5.123,\"is_urban\":true,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"turn_duration\":2.019,\"turn_weight\":2,\"duration\":4.568,\"bearings\":[86,265],\"out\":1,\"in\":0,\"entry\":[false,true]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,265],\"duration\":3.088,\"turn_weight\":2,\"turn_duration\":2.007,\"mapbox_streets_v8\":{\"class\":\"secondary\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.322,\"geometry_index\":5193,\"location\":[-122.426329,37.769637]},{\"entry\":[false,true],\"in\":0,\"bearings\":[85,275],\"duration\":3.529,\"turn_weight\":7,\"turn_duration\":2.014,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.857,\"geometry_index\":5194,\"location\":[-122.426399,37.769632]},{\"entry\":[false,true],\"in\":0,\"bearings\":[95,290],\"duration\":0.777,\"turn_weight\":2,\"turn_duration\":0.02,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":2.928,\"geometry_index\":5196,\"location\":[-122.426493,37.769639]},{\"entry\":[false,true],\"in\":0,\"bearings\":[110,332],\"duration\":8.072,\"turn_weight\":2,\"turn_duration\":0.115,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":11.748,\"geometry_index\":5198,\"location\":[-122.426539,37.769652]},{\"entry\":[false,true],\"in\":0,\"bearings\":[171,351],\"duration\":14.211,\"turn_weight\":0.5,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":17.908,\"geometry_index\":5202,\"location\":[-122.426664,37.770005]},{\"bearings\":[171,351],\"entry\":[false,true],\"in\":0,\"turn_weight\":2,\"lanes\":[{\"indications\":[\"left\"],\"valid\":false,\"active\":false},{\"indications\":[\"straight\",\"right\"],\"valid_indication\":\"straight\",\"valid\":true,\"active\":true}],\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5203,\"location\":[-122.426797,37.770667]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Waller Street\"}],\"type\":\"turn\",\"modifier\":\"left\",\"text\":\"Waller Street\"},\"distanceAlongGeometry\":811}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"new name\",\"instruction\":\"Continue on Duboce Avenue.\",\"modifier\":\"straight\",\"bearing_after\":265,\"bearing_before\":260,\"location\":[-122.419912,37.770197]},\"speedLimitSign\":\"mutcd\",\"name\":\"Duboce Avenue\",\"weight_typical\":203.807,\"duration_typical\":144.416,\"duration\":156.199,\"distance\":811,\"driving_side\":\"right\",\"weight\":218.865,\"mode\":\"driving\",\"geometry\":\"i|h`gAnk|nhFlCnOf@dR`Cxa@fBzDd@lF`@fF^lFX`FRtFnAfg@n@rWl@zWlAhh@HzCDnB|@r_@F`CJ|DHpDPvGPbIDbBb@~QNzFFvCRhIZbMPxHF|BBj@LxE?DHjC@vBObAO`AIXK^eA`AqAj@}OjBkh@hGiy@xJ\"},{\"voiceInstructions\":[{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Continue for a half mile.</prosody></amazon:effect></speak>\",\"announcement\":\"Continue for a half mile.\",\"distanceAlongGeometry\":766.578},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">In a quarter mile, Your destination will be on the right.</prosody></amazon:effect></speak>\",\"announcement\":\"In a quarter mile, Your destination will be on the right.\",\"distanceAlongGeometry\":402.336},{\"ssmlAnnouncement\":\"<speak><amazon:effect name=\\\"drc\\\"><prosody rate=\\\"1.08\\\">Your destination is on the right.</prosody></amazon:effect></speak>\",\"announcement\":\"Your destination is on the right.\",\"distanceAlongGeometry\":41.667}],\"intersections\":[{\"entry\":[false,true],\"in\":0,\"bearings\":[171,261],\"duration\":28.141,\"turn_weight\":12.5,\"turn_duration\":5.395,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":40.363,\"geometry_index\":5204,\"location\":[-122.426986,37.7716]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,260],\"duration\":1.166,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.402,\"geometry_index\":5205,\"location\":[-122.428548,37.771401]},{\"entry\":[false,true],\"in\":0,\"bearings\":[80,261],\"duration\":1.164,\"turn_weight\":2,\"turn_duration\":0.007,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.418,\"geometry_index\":5206,\"location\":[-122.428629,37.77139]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":5.164,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":8.301,\"geometry_index\":5207,\"location\":[-122.428727,37.771378]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":15.277,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":19.189,\"geometry_index\":5208,\"location\":[-122.42918,37.77132]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.564,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.891,\"geometry_index\":5209,\"location\":[-122.430175,37.771193]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.656,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.004,\"geometry_index\":5210,\"location\":[-122.430273,37.771181]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":20.967,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":27.658,\"geometry_index\":5211,\"location\":[-122.430386,37.771167]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.33,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.604,\"geometry_index\":5212,\"location\":[-122.431827,37.770983]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.656,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.004,\"geometry_index\":5213,\"location\":[-122.431921,37.770971]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":10.33,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":14.629,\"geometry_index\":5214,\"location\":[-122.432038,37.770956]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":12.336,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":15.586,\"geometry_index\":5215,\"location\":[-122.432741,37.770866]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.537,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.857,\"geometry_index\":5216,\"location\":[-122.43347,37.770773]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.268,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.527,\"geometry_index\":5217,\"location\":[-122.433563,37.770762]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":9.297,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.363,\"geometry_index\":5218,\"location\":[-122.433669,37.770748]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":10.479,\"turn_weight\":0.5,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":13.049,\"geometry_index\":5219,\"location\":[-122.434422,37.770652]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.564,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":3.852,\"geometry_index\":5220,\"location\":[-122.435104,37.770565]},{\"entry\":[false,true],\"in\":0,\"bearings\":[81,261],\"duration\":1.916,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"weight\":4.273,\"geometry_index\":5221,\"location\":[-122.435207,37.770552]},{\"bearings\":[81,261],\"entry\":[false,true],\"in\":0,\"turn_weight\":2,\"turn_duration\":0.021,\"mapbox_streets_v8\":{\"class\":\"street\"},\"is_urban\":true,\"admin_index\":0,\"out\":1,\"geometry_index\":5222,\"location\":[-122.435315,37.770538]}],\"bannerInstructions\":[{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Your destination will be on the right\"}],\"type\":\"arrive\",\"modifier\":\"right\",\"text\":\"Your destination will be on the right\"},\"distanceAlongGeometry\":776.578},{\"primary\":{\"components\":[{\"type\":\"text\",\"text\":\"Your destination is on the right\"}],\"type\":\"arrive\",\"modifier\":\"right\",\"text\":\"Your destination is on the right\"},\"distanceAlongGeometry\":41.667}],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"turn\",\"instruction\":\"Turn left onto Waller Street.\",\"modifier\":\"left\",\"bearing_after\":261,\"bearing_before\":351,\"location\":[-122.426986,37.7716]},\"speedLimitSign\":\"mutcd\",\"name\":\"Waller Street\",\"weight_typical\":200.061,\"duration_typical\":133.574,\"duration\":133.574,\"distance\":776.578,\"driving_side\":\"right\",\"weight\":200.061,\"mode\":\"driving\",\"geometry\":\"_tk`gArejohFlKr`BT`DVbErBh[|Fd}@VbEZ`FnJ`yAVzD\\\\hFrD|j@xDpl@TxDZrE~D`n@lDri@XlEZvEdB|W\"},{\"voiceInstructions\":[],\"intersections\":[{\"bearings\":[81],\"entry\":[true],\"in\":0,\"admin_index\":0,\"geometry_index\":5223,\"location\":[-122.435714,37.770487]}],\"bannerInstructions\":[],\"speedLimitUnit\":\"mph\",\"maneuver\":{\"type\":\"arrive\",\"instruction\":\"Your destination is on the right.\",\"modifier\":\"right\",\"bearing_after\":0,\"bearing_before\":261,\"location\":[-122.435714,37.770487]},\"speedLimitSign\":\"mutcd\",\"name\":\"Waller Street\",\"weight_typical\":0,\"duration_typical\":0,\"duration\":0,\"distance\":0,\"driving_side\":\"right\",\"weight\":0,\"mode\":\"driving\",\"geometry\":\"mni`gAbg{ohF??\"}],\"distance\":630864.75,\"summary\":\"I 5 North, CA 152\"}],\"geometry\":\"ona|_Adwyr`FDj`@}v@Eud@CyRJsEBBlM@~J?tCF|GArZAlHwF?yD?_H@}B?q@?wD@sK?mD?aE@wk@BgI?k_@@sG@aDAqUBgT@}J?aF@kH?o~@WgWCoQC{Y?qF?oU?a]Xo@@g[VkY?iC?}[?sa@?ic@?qc@?qfAJ_J@oA?gJ@{UBuA?_^BazALyO@oW@yW@aA?mS?g[?mK?_O?uI?q^DkYDiUBuF@aK@_D@oFHyEAeM@ea@@aR@sQ?o@?gF?qH?_NB{B?gJ@gD?qQ@wA@sZ@cG@iD?_Q@iSOoEGc@?cj@@uJHgC?}CEmNFwRFkMFsb@S_XBkUHkC?}[F{@?yPDmI@sIBsC@U?oIBeG?iDByE@cN?_G@{GAee@F{i@GeF?}FAqTW{A?kQBgD?cI@mE@ea@HuFB{G@mSH{DBc[PoEB}A?mA@_NHmFAyI?eC@cD@kJDeGD}A@}GBoDAyKA_OA{HA}L@]?iQ?sDGcEAwPDa@?gD?q\\\\CoFAoB?uI?oQ?aF?aF?eGAqSFcBBoE?_UBiJAqC@gC?oFAwJ?iA?_J@g[FqA?kk@?m@?}LBqKDoA@gE@{E?sAAqM@w^?yHJuj@Ie[CuAB{JBiSByOA_D?oUDaE?sFDmT?mVD}HBmRIeCBiQKgFBc[B}BDwYFeDFmKBsHBsbAFwDAuJ?iJ@E~G{@ze@]tJWdMc@bHu@`I_BxImAdGgB|GyBpHoBzHsKfc@cLf[iLz[}a@tiAcGdPkGpP}GvPuGbOqHhPuCvFyNzY{IrO_JzO_m@bbA{Vpa@mp@vfAMT{NlVuNdVaIlMwIbNyIjMeJzLeJ|K{J|KmKzKsL|KeLvJwKpIeM`JsLbIwLhHcMzGc|BdjAoM`HeMpGmMnHsLxHkLpIkLvJeL|KmJlKqJpLcJbMcIfMgIxNqeBpbDaIvNoH~LiJxNaJbM_KzMyJfLsKnLuKrKmK`K_KvIqKdIsLrI}L~HiMpH_MtG{MvG_gEnsBmNzH_M~HkLzIuKnJcKlKaKnLkJxL}IvMmHnMeHvNsGlO}FvO{Lb`@kDtR}ClQaClQiB`RqAvRq@~Q_@lRSvQIpOK`USzWa@tRu@bRqAdRuBxRoCtQeDdQ{CxMgDfMmDhLyD~KkE|KqEbKyHxOohAdzBoCnFmpAleC}L|VsT`e@}NhY}Xph@qH`NyH|MoIfNwItMiJnM_JdLaKdL_LjKyJdIgLjImLpHsMdHsLpF}MpFiNvEyMnDuMbDmyCjq@aOfDiNrCwMjCy_AhPwNtCsO|CiN`D_O`EgN`EmNtE{NnFcNpF{MxFcNnGqMvGuMnHkMtHkMlIkMxIuLnIeLbJgLnJgLhK{KpKsK~KkK`LunC|gD_KzLyJ~KoJxJiK`JqL`JsYrRoLfHy\\\\zRwLtHuLlIsLnJiLjKgLxKeMfMy{@v}@uM~McWnWiKfKo|@d~@_MnMsm@lo@wKfL}KdLiKtL_KhMiJ~MeIpMeI~NmHnOwGfPoFlOuDxL}HtYuC|MeCbNeDpUeEz[}K`w@sJpk@{SdaAm]v}AkKna@iK|[mQl`@uR`]eZvd@gfApbBiMbSeLpQwd@lt@cIfMwIxM}I|MeJhMsIbLoIvJ_KbKqLxJiK`IeLxH_MtH_NlHkMjGsMfF}qBrq@mNjF_UlIy]nLaQpGyKzEwNxGuMhIwNpKoKjJ_K`KiFfFyJhLwJhMkIxLkRxZiQxXag@dw@kb@jr@wIzM}KhQwNhP_S|QcK|I_m@zb@oNhKo`@tX_aEl|C}q@rf@y^hUoZbPij@`XkMxF_bAr^}S|F_aAn[{`Af\\\\cUlHgT|HsiAr`@}wCvaAqZzJqhCp{@wl@|UuFzCqK|FsT~NcI`G}AbAk]t[gOxN_UdWqObR_MnR}o@veAkVbc@oN|V{[xi@mcAzdBiUz^kNtR{Zx^{VhVuz@hn@oZ`QgTbKwU|JmgCp`A}[hO}\\\\bQaPlJsYjRyP`Nsd@fb@gT~TwsB~kCoPpQyQnPiR~NgS|MySjLqS`KiTlI{RhGwZlHeSrDuUlCocCxPwzFn`@wXlBsvAzJs{@bFkVvAqjCzQkVlBuUnBaUvCkVrEoUtE{[xI}`@bNubAvb@orAng@i\\\\|Lok@jQs[bJcd@`Ki[pG{pOboCoWpEagDtk@}oDbp@wYbFu~B`b@}d@`H{RxA_RZmTh@gT?ka@}AkYuCm_@oGo_@yJeT{Gsd@sL}nAyd@gTaFkQsCgUuBw`@YcQf@g_@zDuTzE_RxFyNhFyTbLmNzIgQxNkPlNelDppEudA`nAsVjb@aRbS_yD`gEcmBpvBuu@vt@uT`Vic@re@}_BdfBomC~tCslA~pAyRzSwiClsCyrBv{Bu~AfdBmTxUihDhrDml@tn@sYr[kSpRkPnMuPbM}V`Pqm@`^oV|MmxA|w@uYzOkm@v\\\\um@nb@oU|P{_@f^eRnSkZ|\\\\goA`uA_f@`h@oKhLeLlLkTlRePnNiTbOiz@pj@kl@p^qYrRoUxP{\\\\~Wue@td@mb@fe@_jAdnAaS`Ua|@v_Auc@xc@oZfUk^tSoV~L}dDdbBop@|a@wi@xd@gS~SkThXiN|RuU|^m|BdoEi\\\\vl@g[nc@gSjUen@|n@{sBjsBef@re@kbId`IonE~lEgPdPyc@rc@q{B|vBoQtPo{DjpDamAxjA_@^mt@hq@au@vo@uyCnrBgrB`sAgm@fa@}u@jg@{[nSqNpJe\\\\bTcf@h`@ya@|^ue@jg@eZf^}QtV{^xi@sJpPkMrTgJdQkaAfrBqdArwBkqAhmCiRr^iOrWuNhTeStXsg@`h@wa@l^oFnDuXrRuW`Osb@vRehAxb@srDfwAu\\\\lNiOxHmNfIwM|HwMvK_L~H{LbLmMfLgYvXyKfM}JdMgIxKgJnN}JlOiIhNykAxrBmIbOmK~RcJjQ{HbPgH`P{HxQgb@liAuqBpiF}IbVeJ~Y{GdVsG`X}FxYwEbYuDbZsCrW{BpVyTrcDgBrToCzV}CzUgDbUqFtXkGxXkKl^_JxW_JxVaNjZuNdZw]|j@{b@ri@of@jd@kd@t`@a]~\\\\aVbZmSjYiRl[{Pz[aPr^iNn_@kU~v@saCvsIov@llCkq@raCsMv_@oNn\\\\gTjb@aVb^qQtWyxFppGm^jZoi@p]ea@dTo]~NeOxEcK`DkiAvTweAnW{`@|IaoAl[}i@vQc\\\\xO_]rPelFxwDgzIv}EgpIfrEePxFurExxAmhBdk@qd@hMocBfg@acAjZivBnWugHvgAevBzZarBlZkn@nMuc@|L}p@dUgrE~|Ag|D~tAasBfr@agBvn@oWtIyUnHuV`H}V|GqnA|\\\\_YfIuZ~IcYdJkZlKoZdLkoD|zAucFfxB}o@tXglApg@_{Ado@{XtLwxA~m@}WbLsSxIiNtG}MnHcLlH{LrIcLvIoMxKsMnLaMrLeMhNmRvTqxBjmCcuGpfIae@`m@qQbWkPxV}NpViNfWaNxX}MvYoc@bdAm|EpiLcXto@wTzh@cMbYeM|ViMzTsMrSwOnTkPpRiOtR{KhJmAnAaY|S}QdNmgEzyCoQfMcSpMuQ`KsRdJuVxKgTzHyTdH{VvGwX`GkVdEmV~C{UnBqWrAsWt@oYUuT@sWgAaXsBqWqC}pC_[}WwCeXeBqWu@qWOoXZiXrAeX|BuWhDqWzEeWdGsWtHyu@fUsVnG_WdFmW`EgT`CmW`BsWz@_WDsW_@{WqA}WiCkUsCw~NmrB_d@iE{d@aC_e@gAsb@?_e@jAmc@zBkc@lEm_@~E{b@dIgb@fK{a@xL{`@nNa^jOk]|Pe\\\\tQc[dSwj@f_@uzB|{AojDl_Cwa@zXanEhyCsZ~SwvAb`AgYlP_YvMc\\\\jM_]|Kmj@fQiY~JkXnLoXrMiUdN{RvMuWjTsLfKaW`VsShXedArrAwUxXcU|TcU|QaYdTkkCfeBq{CtuB{i@j\\\\qwG|vDsVxPuUtSgTvTsRnWcPbYgQd`@oYjx@oQzd@sMbY_QnYecAzyAcUbXcUbV_WnT}UlQqWbNmmTddIkXjMaWlOgRrN}BdB}U`TmSdUwQbWqUx^qVd]wQzRoPdOkS|Ogq@z`@kUvOcUvQqTnUoQlUwPjZkOjVkNdSsNpQsP~QyrCzbCoYdXuXxXc|Ap_BiRlTiRlV_OdUoNbVigA~oBmSb\\\\sRnY_TnX}UlXgWnVuUvR_iAt{@iWlPiWlM}X`KwY`I}ZjFw^jGkXvGsU~G}U`JeVlMuUvOo`CrfBmSbQiRvR_OlRcPxV_LxSgLbWqJbWue@ntAsMn^cPpa@kOb]gGvL}MnWuNlVec@hv@kr@dpAm`@to@eXje@kWx]gWtZw_@|\\\\eb@|Xq]rR}WlMmcAl_@}qAxj@am@`Zg`@hTsXpQ}V`Q_SfSof@xl@u[`g@qYth@qWzo@ySvq@keB|vG_Lp_@iMf]gU~h@gXnc@_d@zp@aa@|c@gb@j[uy@~q@_{@fn@iZbVeYnYsWx[{Zpc@iqDbyFcPbWgRlWmr@ro@uY|UuZ|Qic@nUwe@rPiHjBgd@nLaq@zJgZfCaQ`@wgAhCyv@YcYw@wmLal@iKi@ih@yB_n@oAi`AjEcfD~b@qo@hK}l@jDq^z@e^Ig|C^m`@`@qo@~Dyu@hMyl@~Omj@lTaa@`Qia@jQo{HhnDerBr`AkrBv_A_[vO_RdKwXzPaVfP_SjNuSvQk]n]sXn\\\\{g@~q@cg@xq@mS|b@eXtl@cO|WqT`YgS~WmWbXeRxQ}TjQ_W`SwUfTkk@`j@wShTaSfTu]p_@iVpZmPtToNpVeQl]}Ovb@yMr_@iOfg@mO`o@wCrPyAxQkB|u@_@b_BgB``AgCvp@uD`h@{Fhf@gLxo@{Jpd@gLvb@iPnd@cKbVmbDnmHeKbTqKzRsQjZgThZySvWcV~UyZvXg^vYqPdKmQdI_`@tPm[~Ku{MrmEm\\\\vKem@lQcc@pGgj@|Eeg@fBi`CgAeEA{T?y`@vB{m@jGul@zLml@xQcr@vZyr@jf@on@xk@kf@pl@uYxd@ij@~`Ag_@|p@iPbZcQpWgH|JmZd]yg@pe@e^jVaW|Nud@dUwt@h\\\\we@dUwe@dWih@v[}OfNgVnViTrUsR~VgRxWeSl[}MnYmPx`@aLj\\\\gKr]eJ`^{G`\\\\{Fn\\\\cF~Z{J~l@mHhb@uG|^_Hh\\\\iIr[uIxX{IpUkQfc@kTla@_Tn]_Zl`@}VjWcYxWeX|Ti_@|Ui^rQm\\\\hOct@fWc]dOa_@lSu]`V_UnQqhL`wJ_TtP_T~NmT`NkU`MqV|KquMv~FaXvKkYpKgZrI}[fIqpCbn@{YxGsYzHmYnIyXjIqXzIwgA|]o{A`h@giBlm@c^vLujEdxAgW`IiZjHeYjFkXjDgZ`C}XtAwWr@c{P|j@mi@tAgg@t@wd@Hed@Smf@_Acf@wAel@_Duf@kDwg@uE{~]arDiBSih@kEuf@aD}n@uCqx@kByOIcf@?qe@HaaIjFutAx@qk@ZsXj@sX~@yWtAqU~B_UnCs`@|Fo_@jHs`@vJa`@vL}^jN}[bNka@nRm}CxxAkXtMmg@dWyZbQua@vUo_@xUe\\\\xTi]lVi]dWk[vVay@~r@}[xZ}[d\\\\s[d]yZb]s[d_@_Zz^sXz^o\\\\zd@yZpd@qXdc@_Wza@iXff@_Wre@ubL`zTmcEnfIq]|o@qY`h@_CdE}^hm@}[pf@qnDvfFoS~Y_RnZ}Pn\\\\wOb\\\\eNd\\\\{Mz^wLn_@qJn^mIp`@qGn_@mFz`@aEdd@}B``@yZjjF_]|bFkk@~tIoDfj@aSpvCk[~bFsz@vyNcCd`@yDz`@{Ed]uFn[oIn_@yJd]yJlYaMzYmNbYiPxXeQxVkR~V_uDzrEm_InvJ_VhY}SlTeUxRqTlPeT`NsUlLyUvJsXtIcY`HmY`F{XtDaXjBuY^sX?eW_AuYuBs[wE}[aHs[kK{XaLcYmNc[cSkYmU}VcVmXmYiLwLc}CkcD}j@km@aaEciEoTkUcaCkfCccBkfBenAasAyaBscBmqEizEwTcUmQwOqRaNoRcLmQaJcSuH{SaHqUaFgWuDsVuBaXi@{XHwW~AiX`DwX`FkW~HmWvJsPfImQjKmj@d_@kgFthDcpDfaCwo@pc@ovAjaAqcCz_B{tNnnJum@xa@ml@zb@cl@fe@if@zb@y`@x_@wd@rd@a`NriNm^`_@csAbtAkg@vh@yRlSmo@~u@y`@zh@g\\\\lf@kvAzyBu]zg@}Yl[{YjZm\\\\nW_`@xVeb@lUqvCvgAg]lS}VlPom@ri@aVb[mNhTgA`BwX`j@wn@f~Aus@xoBsz@`pBkc@|gAcWpo@y]l|@wKtWmKzU_LnUeNvYiy@nwA{PxYo{@dxAgs@bmAo|AlhC}QxWiMlPiPxPsP`QaSxOyOvL{SvOwTvLyXvKuV|LiSvHk^nJkYjFeWtCcVjCmnAjMquGzl@_XtBoe@jBsf@Uu\\\\uAg|CcTs_AkF}S`@aQ\\\\g|@~Igj@xFsxAlQi\\\\rCuE`@{f@jCin@^ii@k@}r@_Dgs@wG{c@kGyf@wJkoAkZo}Ai_@}_@uGe\\\\aF}\\\\_Ca^Ig`@^m\\\\tA{[~B_[tEu\\\\`Ie\\\\vJw]`NkYbNcY`QcfK|kG{}A|~@y}@lj@yf@zVgYvPsMbHyMlGcOfGiOzFkN|EeNzEsNrE_OjE_NjDqOrD{NdDozDzy@s~MzvC}aCzg@}lE``Am_JdnB}{Kr`Cqq@bPytJdpB_gHp}AalElbAkvGfxAk_BbXqxHpeBgcDrs@wmB`b@g{EzeAqiA|UaoAnPkt@`Hga@zEiR`@}b@Sac@qBqb@MocA}Aka@X}q@nEea@hFi`@nIu_@fKe_@pM_^jQa]tS{[~UsZdXgYhZmxAxiB_fDtmEwcHpaJ{eEvpF_aBvuB}@jAsp@n{@qq@hy@k~@|bAu_Aj~@ubCxvBodLfdKw}JfjJ{oEj|EymDduDo}JzwKatJllKykNvrOqGbHcRhSgtHhhIouK`oL{oEp`FaiJbaKsdAfiAkiN||OobK|iLynPdgRwdKnnL}aKdlLkkLxyMeaJddKmfMd|NgaGhwGi|MtnOqgOp_Qm@r@awJl|Kci@~m@uiE~dFeaIfaJ_zFbvGmfGzaHm{Nf_Psq@rw@_aG~lGyxAx_BozDfiE_jI||IqhF|yFsJnKezFfhGarFh`GyrHjfIsjF|wFmrG`bHae@lj@gzEfjFofG|sGe_IbwIi|G`jHc_GbrGuGhHktD|aEmvCr`DklGj}GuyF|lGyhGxvGc~H|oIylDtyD}rHhlIoxBjyC_kCroDsn@h`AazKnmOsjJpaN}}I|jNoAnBueL`qQy|HdaMgaMpvRsuHlxLknLn|Q_sKlxP{eFvgI}iJz~NygJ`|NeCzDcoKpmPkfJroNg}EprHihErxGycHzpKa|At~Bqf@jv@m|@fqAyq@xbAme@pq@g_DtxE}`E|lGclNr|S{sH|fLoRxYkyd@l{r@o_ChoDcfAhaBgrHtgL}iHrxKyeJdnNujv@ngkAceMrrRam@b{@ef@ll@k_AhoAozEhkFgiDvwD{lAzrAslHhgIczFxqG{tQthSkrLfwMkuDbiEop]zc`@efU~gW}zU~yW{xBprBcjYxhXgzMbfMwxHvqHugBjbB}lHn|GydAny@g~@hp@abGzbE_bBhfAcgHzyEe}AvdAca\\\\pqT_km@fqa@}vYfyRgpz@dmk@}VzPebJdhGsvTtbOeeOhaK{jLf|H}~F~~Diil@fz`@oub@vrYw_RlfMearAva}@_~EbrDmvDhrCqhC`oBwhCtmB{fCfmBekIloGeo@bj@{xFhmFoeFttE{xG`mGkbBxzAklCxbCa|F~pFayAjtA}rDthDcmAbkAsrAbmAuaCb}BksFzdFksB|lBoUfTumChjCig@jh@ox@py@az@jy@u`AzbAqaFpfF_]t]q^h^epArrAmz@~|@gs@`t@iZxZav@`w@is@vu@_w@`v@upAzsAacBhiBiAlAy{Dj~DgcBndBifBvfBw|A|~AukDjoDewCd{CweItlIqyEd_Fs~FzeGmbAbdAi`@~_@g^p^y`@h_@{m@dq@}g@di@kh@lj@_PtNkV~TaWrU{jDbuDunJdwJcbGtiGwhWzzWsb@fd@aoAxmAusCryCaxBzzBozDh_EkfC`gCa}FrdGaiA`oA_mB~rBqj@xi@iuArxAmmAhkAiiB|dBscBtxA_rAljAk_Cx_Ce_D~uCayAfvAq`DlxC_aBd{AshCldCcmAjfAcdB|fBm{AbrBsaAnaBa~ClxFim@`gAwyB`~DelD~jG}tHv~MuhDzfG}zB|~D{v@dvAo~CvtFs{AheDqv@fbB}z@nkB}Or]_z@riBmxC|uGybD`jH{wDrmI{lD~_I}eD|oHuuDlrHkeF~~JysCnvFqyFr}KkeCb}EwgExkIquCbzFquCfyFodDjoGoaCxrEm]rq@w{BnnEg[jj@o[~f@a^zh@yPrUiVr\\\\mZb]wg@rk@esDfgDwkEjwDyWrVevItyHuxAjoAaTxRkkLhiKylNj`MqqDnaDcjj@rrf@u_FflEo~EpkEihq@r_m@gd@t_@o~PvpO{b@`_@{_A|z@_y@rm@qaAzn@ovAxt@aYnP_kZndP{{LxtG_hMn_HwcMj}GexYnzOe]rQy`OzdIiB`A{bT`fL{hAfp@epFduCudCfrAuj^|xRy~BhnAyfSnzKsdIlkE}tGxlDkh@bZqk@n[ubCztAac@tXw|@fo@og@~`@i~FvxEmzCreCqqIzaHw}CxjCyFzEkwHt}Ga}JdnJioLzcKkoLx}JkaIz~GieJ~bImTlSavP~uNmpOxyMsoD``DsbKdsI}zOdbNidM`wKe`F`jE}WvTkrR|pPetMn_LyyB~lB_ZpX}lMp{K_iMzvKccBl}A{kD|yCqkEhvDi~Hl}GwoG|uFqE|DulGbzFaqFthFyGpGiwG~kGeqHbbHgeEp|DatAhlA{dHz~Fk[nWs`@`\\\\i~BbmBisCf_CycQ~sN}iCbbCgaAxdAyy@h}@sb@ve@cLnLwUdVmoOp{OgrLh_M_uGn_HyxBh{BwrBzfC_kH~kKoeClqDeoAjhBkpD~gFie@`r@kfCptDmc@do@ouBj{Cm`Ex}FqgCzrDwpBxtC}rC|cE}aCvjDmx`@jwk@_~ChpEqjClwDwzn@pl~@oNpSsAnByaJlsMkiAnbB}m@x~@GHmxCpjEaOzToWj`@}fHzgKmcIplLgqDzlFeoBdqCklAjwAaoAfqAqaBbpAwsFhzDitKduH}mLfjIupK~rHqoCzmBui@|_@cnMv`JicBllA}nA`~@udDh|BqvQnjMotNh`Kwe@~[wm@xb@cuE~bDs[`VmvDhnCu_HzyEmdIxyFm|AxfAgxFf_E}jNt{JioKtaHgmeAdgo@eMvHgkH`oEojWppOydJrwFseo@za`@yYfQsmpA|~v@wkIndF{hEfjCew@bg@}mBxjA{eAdp@wiAxq@k|KnyGafNtnIeuHjvEo@`@wdD`pBu}Aj`Aq|BtuAs_Atl@}fAns@isBrzAcjA~aA_MhLulF`mEqpCp_CarCz~Bg~CtiCmbDxlCyeDnqCmdBfvAsn@`h@gwAjmAsrAvkAkbBnhBa}BnxCqcEnkFcw@xz@}iEjnEe_DnaD}`BvbBqcCfpC}nAzxAsj@ps@ev@raAg}BvuCk`CvaDwkCzgDodCxbDg`Cx~CgnCvlDmrCvsDw`C|}CevC`vDukCplDy|AjqBa@f@qw@xaAsQnVmxAnlBoX~^}jAjyAifDlmEcSrU}aBxxBwo@j{@}~Bb{Cev@haAwWpYeUfVg]f^yHbIke@ld@uYxW{|BhmBapBfcBo{@rr@kaAd{@spCz|BspAxfAmsA`hA{uDd_DsuBbcBe{C`kCucB`uA{VvS}SlQ_f@hc@}wApjAsnAndAqmCz{Bmr@xl@{JfJ{}BrnB{k@xf@e}@rx@chBbdBumCvgC_`Aj~@ud@|d@{ZpZydAz`Ai`Bf}Aa_Ab}@ckCfeC_NtMu|A`zAovBprBqt@tr@WTolDtfDee@ld@ciArfAyY~Vi@d@uiBhfBo[rZoeCrbCq`@z^{QbPsaB~~AegAjdAcpArnAg{A~uAaSbSs}@n|@aaAb~@{XtXepAloAqnDxeDmpA|lAunBxlBgvCbtCeObPalD|dDqcBf`BcpBxjBwpD~lDkKlK_EnDoIlCgSfLoFdDqEdAmE?{Dq@uCoBcCeCmAoCkAgEg@uFCkEj@kEv@eD`BoDzBqCtCeB|CiArDOxCR`DjAbDdCfCzDjB`H|C|b@G~]cAdiFcC|hQoBbiXOfjCQf|EWdtQb@nrG?x`@a@tbCPdxAGrtBMpwEAjxAQpmBLhgL{@vvGUzj@WzPs@hTyG|fAgMpgBmu@ncKaIv_A{Gtn@sAbJu@pGyF|ZiOnr@{H`Y_Sxl@oM|\\\\uk@hnAiZxn@cc@z{@aZjj@o\\\\rs@i_@vt@yg@hfAoKtS}c@|}@us@xxAe]~s@wh@peAwWdj@aj@~gAcaAfpBgm@joAuMdXibAzpBeIfPoE|I_|@hhBgbAbpBqfAjyBcaAdoBsS`d@{Zjn@gMdWg}CpnGcf@raAav@z|A}Tjd@si@hhA{v@j_BuNf[uCnHsCbI_FnQuAdGkEfXw@bGsCrXef@nhGkCzTyHtg@oLbt@oOdz@kEjUgDpP}DrSsHpe@{Gtd@}_@~yBsOxz@oL`s@_SvmA}CvNuDpOwClJsErLoKpTsPn[s}@xiBk@jA{JxQmHhNo|@pbB}FnJmTd\\\\uHdJsIpIkIjHsO|Iw_B|cAew@jb@_eApq@cdAjo@mFzC{[|Peb@|Pa`Bxd@_eBrf@qt@tT}TzHkInE}MtHyGtEeQ`OoH~GaKjLeFlHaPrX_t@daBqI`SkQla@iYzo@cRhc@sNx`@aFbVqBzLyCnSeAlMmAxVUvNEhOJ~Lh@zPr@xMdBxQbCxQbBtIdEtS`_@dtAhsA~xEdnBr_Hj}AbtF`j@rnBtq@l_Czn@j{BdHjT~E~MhD~HlJbRvKjQlHnJbEnEhNhMff@~_@lmBd|A~MnKrjFfhEzWbTlEvDjKbLlQpUfKpPfLxQhKpPzLdVpKfWhK|[vJt]rE~TvDjSzC~SlBlPhBxQ~@lObAdQ\\\\dJ~@f^Htk@c@`UStLc@`JmAfT}QhyCqAbW_Bt^uIbgBUlQFxRXxUTpJj@dMhAbSdAbO~BxUhC`TvGja@dH~^~D`Tz{@|zEtMbt@xQ~bAzCjOxF`_@vBhP`AdLx@`O`@pNDnPQbc@mCpkDuA`|@k@h}@@vLN~Kf@rNj@hKz@fLxAdMpAnIvFhZvB`InFvPxD`NtEjNxG~NjPf[bFtHtVh[tu@~t@~u@tt@fy@zv@rl@hj@ddAr`ApQxUpQ`^tJtSfLz]rDdPjCzNdChOrB~S~A~X^lJz@deAr@r_Ar@~qAPrf@\\\\xVfAjRr@|JpDhZvBzNbE`UvDlOjChJnEfMrMrYhHhMxGpK`NvRrLvNzGjGtQ`O|IhGhHhEvMtGjj@xT~iA|`@nuAnh@jMjEbo@hSfm@fQzYlNfUbPhVzVdK|MbUd`@dQlg@nCbM|\\\\`yBp_@v_CzHbi@jl@hyDxQpuAlNj~@zMxt@nKrd@h_@hiAfs@bsBbgIxeUzcA`hChqDtnHvVhq@xHt\\\\hGn\\\\~[t~CxKxo@dP`m@xMn]xRl`@ra@`n@vw@bfAfc@jg@v`@na@h\\\\~XhkD~xBnc@j`@bPnThLzVlJpVdHzXxDrWjAjVpApk@uC~h@wh@leEaCpUkAlZDr_@hAfTlCbZ|Sl{ArBvU`AxMh@rXm@lVeEhj@{Kzi@eVr~@uPhr@cNtk@kKzk@sFhk@gOpeCgRt_DL|^~@tl@~Dfj@lHbj@hHn^dCpIfLl^fNt_@vk@`hAjb@~s@dLtPpZnb@tT|Sp^tUhRjLdaDdpBb]`TnYdSl`@ri@nLzTxLn\\\\jIp\\\\zFr^rBdX~@|[]f[oBrX_Wz~CLvu@xBte@~q@`jGlYdqCtVr|Atd@xwBhGdSdLbe@nP~z@ld@|{BdVxuAne@haDzObu@vXthAvP`o@b\\\\fjAbF~N|Nv]lXfd@h\\\\x^~kBfxApy@tl@xf@fVzShHhg@vKjy@nI|fAzFlb@hIre@fPvf@lYtV`T|rBvoCX`@~bAjvAnjAp`BtR|XbyBvxC~Wx]lbBr|B~Vr^rVjo@zR`s@bHv]bGbg@~G`s@~Dff@dTp~BtEvs@rIb|@nPlrAbSvlAxcA`oF~Ipe@nf@zhChYd}AtSt~@tQbj@xeAr{Cfl@bdBlPlf@~Vlv@bV`j@`_@xv@~j@|{@po@jt@`l@rk@pWlWluEztExRnTdQlUpNlT~~@p_BhOxVzObUtPnShR~R|QdPjwE`sDjyBzdBrSxOpRjMxRvKpRlJtTjIpTjGrUdF`VtD|XtCdX`AzWHtW_AbXuBtWuDjWwFt\\\\_JpYmJ~mA{^fYwJfYuL~YyOvuAkx@~I_Fbf@iTlXkHdXaFtTiBvUaAnUTfUtAxVnCxbAfO|fAxObqBlY`x@rJr{@nLbLbBjq@~NtJfC`KrDxIlEvInF`IbGtH`HdItJvLdPxDfH~CxHvCtIbCzIxm@d{BlJp]hT|t@tNpk@xk@d}BhIvZ|HxWbJjWnJfV|b@vbAp]~w@lXfm@xNnYxNxWpOxUpd@rr@fUh]pSp\\\\xN`^`ItUxDbQbGja@`Dt_@v@r\\\\F`\\\\cAl]{B|]aEx^uExZcHt_@wGd]uIl]eJ`VcM|Z}L~SwPfZiO`Vc\\\\v_@kyD~kEslAvtAkZz]aNdQcNhSeJhOqKnTmLn[{Pfb@u]`dAqRtk@wIxWu\\\\zfAoRvq@_BlE{@rHoDfUeShqAaOf`Ac@vCoHt[w[lvAgJp_@m@~BqIz]{CzSgBfV{@pQ?fQL`NbAbP~AhMzCnWrZr`C|Bn\\\\hAh^Er`@u@zRw@~M_BrOkBrOsDjSkEzR{EtPiF`O_HvPyH`OwIpNcMdPqJhK_KjKwIdIcPtI_MxG_OjGcOhH_TdIcSvImUpJwg@pUgOvIwOjLyNbOii@`j@cK|GmKrGcJzDmN~EseBx_@aPnDaCh@eMpDeSfFeItBuGbBqMlE_Bh@iOfI_QhKcSrOwh@fh@u[xXyAtA{NbP_HhJqGhKmHbOuQva@qr@b_BoTrg@gOt]gfB~}DcPf`@uI|SwFhRcDfQiCtPqAtPu@dPMfQZpNt@rOpA`OhCfQbD~MlErObh@juApGhRzEfQbDtP~ApNpArOZdP?d_@mBpz@[lT?hRh@fQpApN~AbPbDbOzEvQbGzRzDtJ~Zjv@~t@xjB|]j_AzKrVtJhN`OzOfd@vg@pMfQrHzMb@v@tIvQzEtPzEzRtC|S~AjSt@vQ?bWcA~gA[vg@g@p]cAd_@GhAkAtYcSncCs[|wDoWbaDkAbMcDb]sBvTwLhfA{@lH}U|pB{Hxg@qGr^mH`]_Kjb@g@fBsM`e@aQzi@ycAfbDyYn~@yb@~sAgn@p}Bq@bCaEfOaGnQ}BzG{DjIuArCgIvP_KrOmx@b|@kaDdkDuLtMihBvoBgCnCaJxJoF`GcjBhcBiAbAyTpRc@^sb@`_@kQtPqM~M_NtOc`AvlAq[d`@{FdHkyAj|Amd@rf@}MzNqW~XaFhF{PtQoXrYkM|MmjArmAed@lg@k[v^}zC|kDuPnV_ElPu@tP`@`J~DpQdLbOb_@`V~p@la@bFzClv@de@bBbA|GdEpaB~eAjzB`sAbzCbiBpIfFhDrBjStLtJfGhRdPpM`OjH~MlHfQlEtP|AhKnBhQf@rOYfQeArOyBdQmExQ{EbPyBvEaFlKmGvMgU`f@kHfQ{H`VaGjTyOpk@}`@dyAmYfeAqMdg@c[rhA{CvKcDxNeAvEqGd_@cGnk@_BlRqAnO{Bpk@g@lc@Ct`@Ebm@OpvBgC|m@}Dzd@qVjqDw@pLgBdX}AtVcBz]uAr]iAj^_DpjAuEdeByAd^QpKQzGe@dRU`NEhNRtN`@|Nv@|MpA~LtBbObCxMxGje@`F~UnIfh@f@jHZfGAlHYhIaAnI}BtKoDlJ}BbE{D~EoDjD}GtEsHtCgRtH}RfIwQdI_PxHeQhIijBj_AasBf~@ik@`Wc|Kx~EovItyDg^`Pad@|QkgGboCshHt`DotHvfDq[pNm]bO{]fOm]jNw\\\\pMy^fN_]tLq]zL{]vLu^tLw{A`g@_}JtdDkkHraC}fB`l@kmMvgEuo@dTyTlH}mF|fBil@nRo]tLe^~Ly]nM}]bNg^tN{\\\\hN_^bOu_@rPirI~yDmaLjeF}kKpyE{h@`V{yG~zCgWrLwTzK}UxMuTpMiU`OmU|OsSnO{TjQmSbQaRvP_SvRuSvSiQzRmRhUwP~SgPlTu_DjlEacLvwOcRtVcPdS{QpT{PhRyPhQkRtQ{RxQyRtPmShPaTzOwR~M}TtNwSxLiTrL{SzK}iF`jCkfD`bB_sFfoCueJ~rE{wBjfAaV~LgVhMcUrM{SlM}TjNuRzMiVhQ{S~OcT|PmSfQeSrQuO`OmAhA{qGfjG{oJbeJs{HnrHg^h_@uxB|tBcxAjvAkRtRcSdTmQjS{PrSwQtUsOrSeO`T{NpTY`@ixAlyBsOlUePpUcP`ToP|SaQ`TyQxScRfSkSrSkQxPqQlPeRzOoRzOygEhfD}[lXkPbMwYhWsK`K_d@za@gRzQ_RxRaQjRuPhRiQfSoQbTywHlnJkPdSuPdS}O`RcQrRqQpRcQxQqQpQyQ`QwQzPsQ|OaRvOiRxO}R|OsRpOakDdqCeRnOuStQkRjQaQnQsQxR_QbScQzSqP~SaPtTcP`ViOxUyi@~w@yyD`mGw[bh@osCfrEcO`VyiFhmIwTl^eSj\\\\mRv[uSh^yS|^wRh^sSb`@uQn]uQ~]uRl`@{Rxa@qzItdRisAdtCqNtYyNdXoNfVoOrV{MfS_QvU{OdSaRvTaQnR{Q|QygAreAatBlqB_jCffCaVxU{S~SwRxS}PhSuPnS{QpUqPbUyfNbjRaP`UaPdU_OdTgPlV{NpUyM`UwOnXuOnY_MrUuNpYuMdXwaAftB_aA`sBgeAvyBm^|u@}[~q@_`@|x@moD~sHal@~mAeo@xqAkf@r`A_MfJwl@dfA{MlTsFrIkWr^_]he@eLpPeItNuHdOcHfO{ExLyChI{FzQuDzM{DtPwC|MqBzKo@xEeAvHgAbJkAhK{@lJs@nIo@|Jg@pL]`MUfPEpNl@n`@tAt[nJlmA~BrXz@rJr@dJjDdc@lDr[zNnkBhIhkApAbOz@jJzMlaBpRd|BtHr}@nVzvCnGdu@pC~[bCr_@zBvf@|@d]d@rZYjv@c@pZaBho@kCjc@wCv]{D|^eFz_@oGba@qjB`tKmj@bbDcJvj@gDhVgCxSwHlq@iFnt@wBhb@}@jWy@jVa@rUiA`aCOvj@sDbgNYbjAQ`Zm@zVe@bRw@lQyBf`@aIrw@aDjUgDvTuDrSsDdRyEvSwFrTcKn]_JbXqjAvzCsuC`sHyU|m@iiBdxEuw@lsB_W`p@yy@jwBiCtGyb@`iAsQ`e@}IpUwTpj@{Odb@}Lj_@aHvVmFhT_EpRoFvZqB`M}A~K}Dt[eB|QaBrS_ArOw@xPm@~QY`O}@nfA_@dg@OfLiEtdFe@de@Wnb@UzeEFf[Epf@H|r@Gt~B}AjnAwDdlB_DzsAsKvvE[jMkAf^aAzi@@dMBtr@X|O|@`^bD~q@pA~RxA|QnCnXzC~VhD|WdA~HpBlLvEjVrHf_@jLzc@|h@boBbQpo@xX~jAvQr_A|fAfwGvs@pkEzJ`p@jEl]rD`_@hCd\\\\~Bx^`AfQt@rSx@z[VxPNzPtAbaJb@piFE~sBl@tpFVrk@n@vvBR|Z@bIPrp@Jte@d@`eD~@zxG`AjcHBnXOzUc@vT[|Ki@fOm@rPQlD_@|ImAzTuBtXu@lKkAhLcw@x~H{Ffm@{X~tCafAhhK}StpBwTvtBm@rFki@hhF}MjfAeUftA{]p{A_Id[uZzmAuE|Qi`AxxDkK~a@iTf|@{E~R}E~PaOvr@}ShlA}Jnn@wQhkAuKpl@kF`WkFdUmCzIqRht@uaAjsCkk@haBkbAhtC_Vhs@{Trq@{Xt}@mRfm@yXvz@_Yfx@{wCrkIap@fjB}Qpf@oRpf@aWtn@aIfRioAt|CwRrh@iOde@}Mpf@iLfg@wJff@ei@zvCaLfi@cMph@gOzh@gNpb@c~ArrEmPnb@{Pd`@kPb]{Vnd@gWjc@q^zg@{p@x_AaTjYeiBvgC}gHf`KaTbYySdVaTbT_SlQqSlP{PvMqvN`~K{oCtuB_k@zb@c]xXkYbWuYbYsXnZ}SlWSVklGx{Hi{Jf~L}QxSuRvRqSlQoSbPaTlN}UvMmUvKqT`JasFvxBoiCjcAqt@bYkP~F{ZhKyYbIc]fI_VtEuFhAwGfAc^rFs_@hFmGgCcAJibAzJaLdAgNbBiNvBoMxBuYvFs[vJiFNcTdHyRfIsa@lQaeA|l@gGnD_NpGoL~EoQxHgN|FoQnHsHtC_n@lViUjJoH~CsF~CwFtDcFtDoE|DcDfDoDdEmDpEeDtEiDnFkCzEiCbFaC|FwCxHcDvJiCrJqBhJwApIuAlKy@tJq@pL[rLIdLH|Kd@hLd@vJhAtL~AvLfZrgBnA~Hl@jGf@rG`@|GNlDN~DFvC?tDQjIa@jIk@dIs@rGw@jG}BvMiChNvAxLkE|Peg@noB{FlUiClLgGd]mFx]{Dp_@yCnb@}Az^q@d_@Ifa@PtP\\\\rQj@bQZzFlBxYxCxZ~b@xeExCz^|Ad^`@d]Gd`@s@x\\\\eBp_@qCn]kEx^wFn]qHz[mInZeJbYaLnYkMbX_OxWsPbWi}AjyB{PnX_OxW}MxWaLxUmeCbqF_L|W}KbYmPlc@oFnNuW`r@uMp[yLzWiMvUcMxSwOfU_cBdrBgP~SkOpUgNtV{L~ViLjX}J~XccCdwHeKrXmLvWiMjU{NjUaPxTyJtLoKfLmKbK}LpJqM~I{|@nj@uf@j`@kSlOuHxGsHxGmQ`RiNfP{N|RqGlJcG`JkQrZmMjWiL~W_K|XeJpY}HdZ}Gb[iGn\\\\iF`\\\\uTpuAeFlZcGb[oHd[iItYgJvYeKfXoLzWkM|ViN|UcO~TePvS{P`SqQlQqRjPgSlOmSzMqTrLwq@t]ohAnl@cWtM{O|JeNrJeO~LoNlNgQvRiP~ScO|UwMpV{LfX{LtWiHjR_S|~@iFx[_Ef\\\\sCv\\\\_Bp\\\\w@n]Ul]OduAQr^g@h^eBj\\\\eDh^iFn^qGj]i_A`vEkDvPuTbhAcIt^}Jv^oLv^qMz\\\\uNx[wPd[yP|X_SzX_SfV_UhU}TrSw{AnrAcKzIq{AbrAok@rg@iV|SiV|TsT~T}P`R{RbUmaCjrCoMbOgMpMwLvK}L`KaN`KqMvI{MjIuMjHqL`GeNjG{NzFqNzEoMzDkLzCoOnDsOzCkOzBsP~Bm|B~Y}QtCuOdDgO`EaOnEcOjFcO|GyO~HkOfJiNfKqJfIuG~FqHpH{NlP_OxRsKtPcMzUoJ|ScKnWyI~YmHfYqEdToLdu@ZpFkNpmBcGln@yA|TyC~[iDhZiF`\\\\gGhY}G|WcHpUwFvPuGrPuHlQgIbQkk@`gAuJxScJ~SoHfSsG`TaG`VyEbUsGzUkCnUmBvXqBra@s@n_@cDt`BcAnX{A`VaCpWaDrWkExXoHj_@eJh]cM``@{Mn\\\\uOxZ}NhW{PbVoQrTwS|SguGlqGso@|n@or@rr@{|Cl~C{uC`yCmTbUqRlT}QbV}PrWcPfXyNpYgMnYoKrXyJjZqI~ZiId]sUrdAsYhsAikAnmFeRd{@ms@dfDqiAhhFsHhZ_J~ZcLh[gMlYcM~UcMbTeNvSsMxPqO`Q_c@rc@{c@~c@yRrSsQfUsO~ToMtSwLrTuJbT{JbV{HvTqHhWsG~WsFhX}EhY_Ex[oCtY{]joEqEdb@aGz^cGn[kHbZ}HxX}ItWiLlXuL~VqMlUgMhSuzA|cCo[ph@qvBtkDsQzXePfU_RdW{hBz_CoMlQaNlRwMbSmLbRgdAlcB{pAnwBeVp_@qT~[iVn\\\\wUt[oaEtfF_\\\\ha@{xC`vDgn@~x@ij@du@GHcb@bl@gtBzwCyN|TaNrUoM~VuLbXmKnX}JhZuIhZqHhYoGd[gGh[sDt[qDd\\\\kCn[eBh[mAh\\\\e@n[?j[\\\\h\\\\z@~ZxObqEjCpu@j@hV\\\\pW@f]W~]cAd^aBb^aCf]cD~\\\\aEx\\\\iFt\\\\aFtWmFvVeE|PkEbPyHfXqH`UuKlYoLrXmMfXkNfWyNfVqwCvxE_Xzb@gSv\\\\mTj_@yjBlbDcsGlcLeLjRwLpQqMbQsMnOsNhOsNfNcPlNiPjMiP~K{RtLsStKyNfH{QnH_PxF_StF{I|BaJvBgLpB{LtBoOlBkP^aOzBaQj@}QRiwAbBy`@p@mLRgOv@aOx@wQnA_O|A}NtBoHdAeHrA{P`DeOlDkOtDsNxDmN`EuOnFgNzF{LnFiNvGmL|FyMpHyNvIcJ~F_LbI{LbJwLxJyLfKuLtKuK~JaM~LoKnK}xApyAgTjTwh@|i@aRjR{JzJuK|JwKnJsJpHeMbJ}L~HqL`HoLfG_NnG_NrFwM`FgMdEmNbE{MdDwMxCgNdCsNtBsNdB}MrAcP`AuMf@{NTmNGaNWgOm@yM{@ul@wFknB}OyxDk^yo@mFqOs@aPc@sOE{OD_PXeRl@oQrA}OtAkOdBeP`CyNpCePlD{NhEwPxFoMnF_NfGcNrGaNhHqMvHcNpIwMlJ_MdJuL`K{KhKcLhLaLzLyKrMmKvMmJhMoIbM}IdNiJzOwIfPqH`PgH`QyFlOeGrQiGbSaG`TcFnS{EtTaEhTgEdVa[dpBq[lxBkFh\\\\gGd\\\\{Gl[mHd[eIl[iIdZcJjZ}J|YsK`ZoLvXoL|Wkx@tfBgIhQiUxf@qKlVaIdScIzTuHfViIzXqHnZkIt_@wHpa@kGjd@sEja@qDzd@gC`d@uA`c@y@tc@wDtyBsAtb@qCfc@yDda@qF~`@uGz_@aIt_@cK``@iLt^gMb]wM~YyPr]}iB`nD_|AryCov@|yA{_@|t@}{@fcBc]hp@iSr_@_Tj_@{Yze@mUr]mTvYm@x@uUxZsWx[muJtlLaPvQqPbQaPpOaQxOeQ`OsO|LkQzM_RbMsQzKkR|KmR`KiRjJqSlJyeBhv@kRfJiPtIyPlKmPfLaQ`NcPlNwzArqAePxM_RlMwOvJeKrFkFhCqFbCuF~BuFvBqFnB}FnBuFhBeGlBkFbBsExAyiGrpBq_Blh@}FlBsFjByFnBsFnBsFpBsFpBsFtBsFvBqFxB_G~BuF~BqF|BuFbCiF|B{FhCiF`CoFfCsFjCkFhCoFlCaN`HolF~lCiFlCiFnCeFpCmFxCoF~CcFxCeF~CeF~CkFfDcFhD_FfDiFrDyEfD_FpDyEnDwEpD{ExDyExDyE|DyE`EsE~DuEbEsEfEqEfEuEnEoElEkEnEiElE}KhLmkA~mAaoC|sC_NlN}fDvlDoEtEaEfEsEvEmEnEoEnEmEfEqEjEoEjEyEnEkE~DqEdEsEdEoE|DwEbEuE`E_FdEsEvDoEpDiF`EwEpDaFrD{ElD{EhDiFpD{EdDcFhD_FdDaFdD_FbDoFjDgFbDaFzCgF~CgF|CeFzCgFxCmF|CmuDtwBgFxCeFxCkFzCeF|CmFdDuExCgFjDgFnDyEhDwEnD_FxDuErD{E|D{EbEoE|DuEfEqEfEeEbEmEjEa{Hn{HeEfEcErEeEzEaEbFyDfFuDjFsDrFmDtFiD|FeDdGaDfGyCjGsCjGqCtGkCxGeCxG_CzG{BfHuBbHmBjHkBnHw[ntAgBrHkBzHmBpHsBrHyBnH}BjHeCnHiCfHmCfHuCdHuCzG}CxGyChGwCbGeDdGeD~FiDzFoDzFoDpFuDlF}DnFyDbFeEdFeE|EkEzEiErEoEnEuEjEasGhfGqEdEuEbEwE~D{ExD}ErD}EjD_FfDgFbDcFzCoFxCsFvCgFhCsFfCmFzBuFzBwFrB{FnB{FjBav@hV_tBpp@sFjB{FpBsFrBwFxBwF~BkF|BqFdCkFfCiFlCmFpCcEzBc@VgFxCgF~CgF`DiFhD}EfDcFjD}EhDq_@~WuOtK}`BxiAaFnD}ElD{EhD{EtDcFxDoElD}EbEwEzDwE~DuEdEqEbEqEjEmEfEkEfEkElEoEtEkEtEgEvEeEvEcE|EcEzEeEfFwDxE}DbF}DfFwDfF}DnFsDfFwDtFqDnFsDvFkDrFoDxFiDvFwn@dfAeDtFiD|FmD|FoDtFsDvFuDjF{DnF_ElFyD|E_EzEeE~EgEvEeEnEoErEqEnE_~@`}@oKjKqz@ry@{`Eb~DggCdeCkEjEqEnE}M~MuE|EsE`FqBvBeEvEgEzE_EvE_ExEaE|E_EdF{D|EcEjF_EjF}DhF_EjFmkA`}AoeApuA_EfFuwA|jB}DbF_E~E_EtEgExEkEpEqEtEmEdEsEfEsEzDyE|D}EvD_FpD}EjDaFdDeF`DiF|CgFtCiFpCmFlCwFjCoF~BuF|BwFrBwFrBqFfB_GhBqGdB{FvAeFnAaGlAaGhAaG`AaG|@gGv@iGr@uGn@gF^kG\\\\kGZgGRoGLsFDgG@gGCeGIkGOcGUcG[gGa@cGe@eGm@gGs@aGs@gGy@cG{@aG}@eGcAeGeA_GgAiGmAwFoA}FsA{FuA{FwA{F}A{FcByFcBuFgBaGmBsFmB{FqBkFqByF{ByF_CqF}BqFeCgF_CmFeCoFmCmFoCmFsCkFyCgFwCeFyCiFaD_F_DcFaDk_Aam@iFeD}E{CiF}CoFwCeFkCyFoCqF_CkFwBsFsB{FoBsFeB}FaBwF}AsG{AqFiA_GiA}F_AcGu@aGu@qBUcIq@gGa@cG[gGSgGMaGGiGAoGD_GLeGTeGZgG^eGh@_Gj@_Gt@}Fz@gAPcBXuFbA{FhAmEbAqCt@uBj@}GpByFfByFnBwFrBqFxBmF~BqFhCmFlCeFnCkFvCsMlHqy@xd@{_DxfBskA|f@mLtFkXjMik@vWuFdC{B`A{B|@}Bx@yBp@_Cn@wBh@aCd@kAReDd@qC\\\\qCVeCR{BHaCDmC@qCAsBE}BIwBKqBOmC[kC]}B_@mCi@wBe@cCq@qBi@_Cy@wBw@_CcAuB_A{BiAsBiAyBsAkBmAuB{A}AkAaBsAsBmB_CyB_BcBeBmB{AkBgB{BuAiBcB{ByAsB{AyBqDuFiDyFeDgG}CeG{CqGuCeGkRma@{D{JcEyK{\\\\qcAsFoPsLi^oX{w@wRwh@amAa~CaK}WoHsSgDsJmNea@iV}s@sFwP}EuPyE}QwDmQeDmRyCkScCeSiBcSqAkSi@sMs@_VQ_QCmPlA_n@HiCHsAfAoQlGogA~Bka@b@yI`AuTbBs_@t@eSb@aUD}QIeSCmOWkOg@oPq@aNyAsQoBcQmCkSgCuPcDaQ{E_U{DsOiDoL{DsLkFwLoFqKsFmJiGuIkIyIeIeHuIsFqJwEcJeD_LoC}JkAcKg@cL@eJj@iK|A}JfCcKrDyQnIabBhw@cPbHsJ|D}JlDaLxCcNbDoj@bIw_AhReI`@iGVamA|EmrDtNykArE{l@bC_ZjAct@vCyRx@ePn@i_ApDgXbA}eAdE}FRuBFaPLqOCuOQcN_@eNu@aNgAyOaBuM_B_P{B{NkCwOcD{NyDkNuE}NyFslAyf@_\\\\{M_NaGaNiGiMuGoLkH_MgIuL}IoN{L_MiLeLyLeMkOaKeNgJaNqJoOgIyN}oBcoDuIuOkIwN}ImOsIwN_JqNeJyM{IcMeKgN}JgMsJoLwLaNuKsLeKyKuKoKyKiKmf@}c@wy@sw@ogCabCgLkKiLwJkLuJyLqJwLkJ{LcJ{L{I}LsIcMkIeMcIiM}HmMuHoMmH{MiHyLiGeFiCgEuB_NuG_NiGaNeGaNyFkNuFeNkFcDkA{JkDkNyEsNsEuNgEyNwD}NcD}NiCeOwBeOaBgOkAiOy@kOc@mOQoOBmOXgOj@cOdAiOtAuOjBgOvBeOlBq_@nEc_@jEm_@rEe_@bFc_@fFgrJtrAyoBnXupD|f@opAfQugEll@_pD|f@mxDxh@u_BxTk_@jFc_@hFe_@jFk_@fFaTrC{InA_U~CkMdBc\\\\pEw\\\\pEes@xJc_@jFwSvCoFx@kGhAiGlAoFjAkG|AcG|A}F~AmF|AuFfBqFlB_GxByF`CqFfCkFjCsFrCiFvCiF|C_FbDcFhDyEfDaFrDqEjDsv@vm@qLfJwEpDyEdDeFlD}E|CeFxCiFvCgFnCqFlC_GnCwF|BgFrBsFrB}FrB{ExA}FbByFxA_GxA}FnA}FfAeGfAogBvZkCd@yj@xJyj@rMgRdE{ObCyf@lLo^dLctAdb@}XdIwAZa~@jT_b@jMoEdAwfCtq@iExAgxAzf@eQ~I{tBd_AoUnJeSrIoRzIu[lOgBv@kNpGsOpHma@zSeOlHgaAxg@uVvMqMdGiLlFgNtFyM`FwLrDoNrDcObDqOpCuOzBoMxA_O`AyOp@qKR{NFwPWqUqA}P}AgOiBeOuCgP{DyMsDuNmEcOaG_MeGqO}IuMsI}LwJc`Ayu@sMqJ{NiIcMkGaO}FsFwB}FuBuFkByFcBaG}AiGsA{FmAyFkA_GmAaGoAa_AcSeiAuVujBga@e`A}SuFmAoGsA_GkA_GeA_G_AcGw@iGs@cGm@}Fc@kGa@mGY{FSyGM{FEqGAcGDeGLwOj@sx@nDuxApGcG\\\\oGh@yFj@yG|@{F`A{FpAyF~AsFjBsF|BmFjCqF|CeFhDyErDyEdEoEnEyEpF{D|EyDfFuDlFsDvFmDrFoDxFkDpFuD|FqDjF{DlF}DfF_EtEcEhEqEdE_FzD}EfDgFzCaFfC{FbCqFlBwF~A}FnAyF~@_Gp@cG`@iGNeG@wFMkG[_Gm@{F}@iGqAuF{AuFkBqFyBqFaCiFeCkFoC}FaDwEkCqF{CkFsCoFqCoFgCsFcCuFwBiGuBgF}AgG}A_GoAcGgAaGy@qAOwDa@eGg@gGc@sG]wMk@ao@~@aGL_GPgGVwEToCPewA`J_CP}BT_CXaC^eCh@aCp@aCx@}B`A{BhAiBfAyA~@oA~@kA`AsAlAoApAkAnAgCzCgCjDwt@peAoD|F{C|E}D|GoDrGcOhXwCrFaCbFgAjC}@nCy@`Di@|C]`DQdDElCBlCNzCTjC`@nCj@bC~@~CnAdDtA|CnBpDnBnDhBjDhB~DbB`F`ApEd@jERjE?nEKbFc@hLSxEQlEs@zTq@rS{@t_@MvIUjTsCd~DYbTqC~ZiA|LqA|LqArLwAxLkArLwAlPwF|r@{Dnf@uBrYC|KF|CVtCd@tElCnOf@dR`Cxa@fBzDd@lF`@fF^lFX`FRtFnAfg@n@rWl@zWlAhh@HzCDnB|@r_@F`CJ|DHpDPvGPbIDbBb@~QNzFFvCRhIZbMPxHF|BBj@LxE?DHjC@vBObAO`AIXK^eA`AqAj@}OjBkh@hGiy@xJlKr`BT`DVbErBh[|Fd}@VbEZ`FnJ`yAVzD\\\\hFrD|j@xDpl@TxDZrE~D`n@lDri@XlEZvEdB|W\",\"voiceLocale\":\"en-US\"}],\"waypoints\":[{\"distance\":22.086,\"name\":\"\",\"location\":[-118.289795,34.03084]},{\"distance\":25.649,\"name\":\"Waller Street\",\"location\":[-122.435714,37.770487]}],\"code\":\"Ok\",\"uuid\":\"r8Gx8SOkRcuY31EuPkGaqvGkgu4jjTmuh30UjmI1B4qlwzUi27_L_g==\"}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/ExampleCategoryItem.kt",
    "content": "package com.mapbox.maps.compose.testapp\n\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.CornerSize\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.Card\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.MaterialTheme.typography\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.compose.testapp.data.model.ExampleCategory\n\n/**\n * Display the [ExampleCategory] as a [Card] in the UI.\n */\n@Composable\ninternal fun ExampleCategoryItem(\n  category: ExampleCategory,\n  modifier: Modifier = Modifier,\n) {\n  Card(\n    modifier = modifier\n        .padding(8.dp)\n        .fillMaxWidth(),\n    backgroundColor = MaterialTheme.colors.secondary,\n\n    shape = RoundedCornerShape(corner = CornerSize(16.dp))\n  ) {\n    Text(\n      modifier = Modifier.padding(horizontal = 8.dp),\n      text = category.category,\n      style = typography.h4,\n    )\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/ExampleListItem.kt",
    "content": "package com.mapbox.maps.compose.testapp\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.CornerSize\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.Card\nimport androidx.compose.material.MaterialTheme.typography\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.compose.testapp.data.model.SpecificExample\n\n/**\n * Display the [SpecificExample] as a [Card] in the UI.\n */\n@Composable\ninternal fun ExampleListItem(\n  specificExample: SpecificExample,\n  navigateToExample: (SpecificExample) -> Unit,\n  modifier: Modifier = Modifier\n) {\n  Card(\n    modifier = modifier\n      .padding(8.dp)\n      .fillMaxSize(),\n    shape = RoundedCornerShape(corner = CornerSize(16.dp))\n  ) {\n    Row(Modifier.clickable { navigateToExample(specificExample) }) {\n      Column(\n        modifier = Modifier\n          .padding(8.dp)\n          .fillMaxWidth()\n          .align(Alignment.CenterVertically)\n      ) {\n        Text(text = specificExample.getLabel(), style = typography.h6)\n        Text(text = specificExample.getDescription(), style = typography.caption)\n      }\n    }\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/ExampleOverviewActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp\n\nimport android.annotation.SuppressLint\nimport android.content.ComponentName\nimport android.content.Intent\nimport android.content.res.Configuration.UI_MODE_NIGHT_YES\nimport android.content.res.Configuration.UI_MODE_TYPE_NORMAL\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.layout.wrapContentSize\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.platform.LocalInspectionMode\nimport androidx.compose.ui.tooling.preview.Devices.PHONE\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.sp\nimport com.mapbox.maps.Map\nimport com.mapbox.maps.compose.testapp.data.ExamplesProvider\nimport com.mapbox.maps.compose.testapp.data.model.SpecificExample\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.common.Version as CommonVersion\nimport com.mapbox.maps.Version as MapsVersion\n\n/**\n * Activity shown when application is started\n *\n * This activity will generate data for RecyclerView based on the AndroidManifest entries.\n * It uses tags as category and description to order the different entries.\n */\npublic class ExampleOverviewActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMapComposeTheme {\n        OverviewScreen {\n          startActivity(Intent().withComponent(packageName, it.name))\n        }\n      }\n    }\n  }\n\n  private fun Intent.withComponent(packageName: String, exampleName: String): Intent {\n    component = ComponentName(packageName, exampleName)\n    return this\n  }\n\n  @OptIn(ExperimentalFoundationApi::class)\n  @Composable\n  public fun OverviewScreen(navigateToExample: (SpecificExample) -> Unit) {\n    val examples =\n      if (LocalInspectionMode.current) {\n        remember { ExamplesProvider.loadMockExampleEntries() }\n      } else {\n        val context = LocalContext.current.applicationContext\n        remember { ExamplesProvider.loadExampleEntries(context) }\n      }\n    ExampleScaffold { innerPadding ->\n      LazyColumn(contentPadding = innerPadding) {\n        item {\n          SdkVersions(modifier = Modifier.wrapContentSize())\n        }\n        examples.forEach { (category, examples) ->\n          stickyHeader {\n            ExampleCategoryItem(category)\n          }\n\n          items(\n            items = examples,\n            itemContent = {\n              ExampleListItem(\n                specificExample = it,\n                navigateToExample = navigateToExample\n              )\n            }\n          )\n        }\n      }\n    }\n  }\n\n  @Composable\n  private fun SdkVersions(modifier: Modifier) {\n    @SuppressLint(\"RestrictedApi\")\n    val glNativeVersion =\n      if (LocalInspectionMode.current) {\n        \"Maps: preview version\"\n      } else {\n        \"Maps: ${MapsVersion.getVersionString()} (${MapsVersion.getRevisionString()})\"\n      }\n\n    @SuppressLint(\"RestrictedApi\")\n    val commonVersion =\n      if (LocalInspectionMode.current) {\n        \"Common: preview version\"\n      } else {\n        \"Common: ${CommonVersion.getCommonSDKVersionString()} (${CommonVersion.getCommonSDKRevisionString()})\"\n      }\n    @SuppressLint(\"RestrictedApi\")\n    val renderBackend = if (LocalInspectionMode.current) {\n      \"Renderer: preview\"\n    } else {\n      \"Renderer: ${Map.getSupportedRenderBackend()}\"\n    }\n    Text(\n      modifier = modifier,\n      text = \"$glNativeVersion; $commonVersion; $renderBackend\",\n      fontSize = 10.sp,\n    )\n  }\n\n  @Preview(name = \"Light\", device = PHONE, showSystemUi = true)\n  @Preview(\n    name = \"Dark\",\n    uiMode = UI_MODE_NIGHT_YES or UI_MODE_TYPE_NORMAL,\n    device = PHONE,\n    showSystemUi = true\n  )\n  @Composable\n  public fun DarkPreview() {\n    MapboxMapComposeTheme {\n      OverviewScreen { }\n    }\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/ExampleScaffold.kt",
    "content": "package com.mapbox.maps.compose.testapp\n\nimport android.app.Activity\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.statusBars\nimport androidx.compose.foundation.layout.windowInsetsPadding\nimport androidx.compose.material.FabPosition\nimport androidx.compose.material.Icon\nimport androidx.compose.material.IconButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Scaffold\nimport androidx.compose.material.SnackbarHost\nimport androidx.compose.material.SnackbarHostState\nimport androidx.compose.material.Surface\nimport androidx.compose.material.Text\nimport androidx.compose.material.TopAppBar\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.primarySurface\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.unit.dp\n\n/**\n * Customised Scaffold to be applied by all the activities. It adds the following UI elements to the\n * UI:\n *  * TopAppBar that shows the label for current activity.\n *  * Navigation icon that dismisses current activity, if the parent activity exists.\n *\n * Note: Edge-to-edge is enabled by default on Android 15 (API 35+).\n * The TopAppBar extends behind the status bar with internal padding to avoid content overlap.\n * See: https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge\n */\n@Composable\npublic fun ExampleScaffold(\n  modifier: Modifier = Modifier,\n  snackbarHost: @Composable (SnackbarHostState) -> Unit = { SnackbarHost(it) },\n  floatingActionButton: @Composable () -> Unit = {},\n  floatingActionButtonPosition: FabPosition = FabPosition.End,\n  bottomBar: @Composable () -> Unit = {},\n  content: @Composable (PaddingValues) -> Unit\n) {\n  val activity = LocalContext.current as? Activity\n  val name = remember {\n    activity?.title?.toString() ?: \"Example\"\n  }\n  val hasParentActivity = remember {\n    activity?.parentActivityIntent != null\n  }\n  Scaffold(\n    modifier = modifier,\n    snackbarHost = snackbarHost,\n    floatingActionButton = floatingActionButton,\n    floatingActionButtonPosition = floatingActionButtonPosition,\n    topBar = {\n      // Surface provides elevation and background for the entire top bar area including status bar\n      Surface(\n        color = MaterialTheme.colors.primarySurface,\n        elevation = 4.dp\n      ) {\n        Column(Modifier.windowInsetsPadding(WindowInsets.statusBars)) {\n          TopAppBar(\n            title = { Text(text = name) },\n            navigationIcon = if (hasParentActivity) {\n              {\n                IconButton(onClick = { activity?.finish() }) {\n                  Icon(Icons.Filled.ArrowBack, contentDescription = \"Back\")\n                }\n              }\n            } else null,\n            elevation = 0.dp // Prevent TopAppBar shadow (Surface provides elevation)\n          )\n        }\n      }\n    },\n    bottomBar = bottomBar,\n    content = content\n  )\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/MapboxApplication.kt",
    "content": "package com.mapbox.maps.compose.testapp\n\nimport android.app.Application\nimport android.os.StrictMode\n\n/**\n * Application class of the test application.\n **/\npublic class MapboxApplication : Application() {\n\n  override fun onCreate() {\n    super.onCreate()\n    initializeStrictMode()\n  }\n\n  private fun initializeStrictMode() {\n    StrictMode.setThreadPolicy(\n      StrictMode.ThreadPolicy.Builder()\n        .detectAll()\n        .build()\n    )\n    StrictMode.setVmPolicy(\n      StrictMode.VmPolicy.Builder()\n        .detectLeakedSqlLiteObjects()\n        .penaltyLog()\n        .penaltyDeath()\n        .build()\n    )\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/data/ExamplesProvider.kt",
    "content": "package com.mapbox.maps.compose.testapp.data\n\nimport android.content.Context\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport com.mapbox.maps.compose.testapp.ExampleOverviewActivity\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.data.model.ExampleCategory\nimport com.mapbox.maps.compose.testapp.data.model.ExampleEntry\nimport com.mapbox.maps.compose.testapp.data.model.SpecificExample\n\n/**\n * Provides the [ExampleEntry] list or mock data to be used in the UI.\n */\npublic object ExamplesProvider {\n  private fun loadExamplesFromManifest(context: Context): List<SpecificExample> {\n    val appPackageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n      context.packageManager.getPackageInfo(\n        context.packageName,\n        PackageManager.PackageInfoFlags.of(PackageManager.GET_ACTIVITIES.toLong() or PackageManager.GET_META_DATA.toLong())\n      )\n    } else {\n      @Suppress(\"DEPRECATION\")\n      context.packageManager.getPackageInfo(\n        context.packageName,\n        PackageManager.GET_ACTIVITIES or PackageManager.GET_META_DATA\n      )\n    }\n    // We use this activity package name in case the `applicationId`/`packageName` is different\n    val packageName = ExampleOverviewActivity::class.java.`package`!!.name\n    val categoryKey = context.getString(R.string.category)\n    return appPackageInfo.activities.orEmpty().filter { info ->\n      info.labelRes != 0 && info.name.startsWith(packageName) && info.name != ExampleOverviewActivity::class.java.name\n    }.mapNotNull { info ->\n      info.metaData?.getString(categoryKey)?.let {\n        val label = context.getString(info.labelRes)\n        val description = runCatching { context.getString(info.descriptionRes) }.getOrDefault(\"-\")\n        SpecificExample(info.name, label, description, it)\n      }\n    }\n  }\n\n  /**\n   * Load [ExampleEntry] list from the AndroidManifest.\n   */\n  public fun loadExampleEntries(context: Context): List<Pair<ExampleCategory, List<SpecificExample>>> =\n    loadExamplesFromManifest(context).groupBy(SpecificExample::category).mapKeys {\n      ExampleCategory(it.key)\n    }.toList().sortedBy { it.first.category }\n\n  /**\n   * Load mock [ExampleEntry] list to preview in Android Studio.\n   */\n  public fun loadMockExampleEntries(\n    categoriesCount: Int = 5,\n    examplesPerCategory: Int = 4\n  ): List<Pair<ExampleCategory, List<SpecificExample>>> =\n    List(categoriesCount) { categoryCount ->\n      val exampleCategory = ExampleCategory(\"${MockEntries.CATEGORY} $categoryCount\")\n      val examples = List(examplesPerCategory) {\n        SpecificExample(\n          name = \"${MockEntries.NAME} $it \",\n          label = \"${MockEntries.LABEL} $it \",\n          description = \"${MockEntries.DESCRIPTION} $it \",\n          category = \"${MockEntries.CATEGORY} $categoryCount\"\n        )\n      }\n      exampleCategory to examples\n    }\n\n  private object MockEntries {\n    const val CATEGORY = \"Category\"\n    const val NAME = \"Example\"\n    const val LABEL = \"Label\"\n    const val DESCRIPTION = \"Description\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/data/model/ExampleEntry.kt",
    "content": "package com.mapbox.maps.compose.testapp.data.model\n\nimport android.os.Parcelable\nimport kotlinx.parcelize.Parcelize\n\npublic sealed class ExampleEntry\n\n@Parcelize\npublic data class ExampleCategory(\n  val category: String\n) : ExampleEntry(), Parcelable\n\n@Parcelize\npublic data class SpecificExample(\n  val name: String,\n  private val label: String? = null,\n  private val description: String? = null,\n  val category: String\n) : ExampleEntry(), Parcelable {\n\n  private val simpleName: String\n    get() = buildSimpleName()\n\n  private fun buildSimpleName(): String {\n    val split =\n      name.split(\"\\\\.\".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()\n    return split.lastOrNull() ?: \"-\"\n  }\n\n  public fun getLabel(): String {\n    return label ?: simpleName\n  }\n\n  public fun getDescription(): String {\n    return description ?: \"-\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/animation/MapViewportAnimationsActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.animation\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.Divider\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Text\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.MultiPoint\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.examples.utils.offset\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.*\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\n\n/**\n * Showcase the basic camera animations based on [MapViewportState] API.\n */\npublic class MapViewportAnimationsActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          center(CityLocations.BERLIN)\n          zoom(15.0)\n        }\n        flyTo(\n          cameraOptions {\n            center(CityLocations.HELSINKI)\n          },\n          MapAnimationOptions.mapAnimationOptions { duration(5000) }\n        )\n      }\n      MapboxMapComposeTheme {\n        val cameraState = mapViewportState.cameraState\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                backgroundColor = if (cameraState != null) MaterialTheme.colors.secondary else Color.LightGray,\n                onClick = {\n                  if (cameraState != null) {\n                    val currentCenter = cameraState.center\n                    mapViewportState.easeTo(\n                      cameraOptions = cameraOptions {\n                        center(currentCenter.offset())\n                      }\n                    )\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"EaseTo Animation\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  mapViewportState.flyTo(\n                    cameraOptions = cameraOptions {\n                      center(CityLocations.BERLIN)\n                      zoom(ZOOM)\n                      pitch(PITCH)\n                    },\n                    MapAnimationOptions.mapAnimationOptions { duration(3000) }\n                  )\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"FlyTo Animation\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  mapViewportState.transitionToOverviewState(\n                    overviewViewportStateOptions = OverviewViewportStateOptions.Builder()\n                      .geometry(\n                        MultiPoint.fromLngLats(\n                          listOf(\n                            CityLocations.HELSINKI,\n                            CityLocations.BERLIN\n                          )\n                        )\n                      )\n                      .animationDurationMs(600L)\n                      .padding(EdgeInsets(100.0, 100.0, 100.0, 100.0))\n                      .build(),\n                    defaultTransitionOptions = DefaultViewportTransitionOptions.Builder()\n                      .maxDurationMs(5000L).build()\n                  )\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Transition to Overview\")\n              }\n            }\n          }\n        ) {\n          Box(modifier = Modifier.fillMaxSize()) {\n            MapboxMap(\n              Modifier.fillMaxSize(),\n              mapViewportState = mapViewportState\n            ) {\n              PolylineAnnotation(points = listOf(CityLocations.HELSINKI, CityLocations.BERLIN))\n            }\n            Column(\n              Modifier\n                .align(Alignment.TopCenter)\n                .fillMaxWidth(fraction = 0.9f)\n                .background(MaterialTheme.colors.background.copy(alpha = 0.6f))\n                .padding(top = 30.dp)\n            ) {\n              Text(\n                modifier = Modifier\n                  .padding(10.dp),\n                textAlign = TextAlign.Center,\n                text = mapViewportState.mapViewportStatus.toString()\n              )\n              Divider()\n              Text(\n                modifier = Modifier\n                  .padding(10.dp),\n                textAlign = TextAlign.Center,\n                text = mapViewportState.mapViewportStatusChangedReason.toString()\n              )\n              Divider()\n              Text(\n                modifier = Modifier\n                  .padding(10.dp),\n                textAlign = TextAlign.Center,\n                text = cameraState.toString()\n              )\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM = 15.7\n    const val PITCH = 60.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/annotation/CircleAnnotationActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.annotation\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroup\nimport com.mapbox.maps.extension.compose.annotation.generated.withCircleColor\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationSourceOptions\nimport com.mapbox.maps.plugin.annotation.ClusterOptions\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\n\n/**\n * Example to showcase usage of CircleAnnotation with Jetpack Compose.\n */\npublic class CircleAnnotationActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var groupColor by remember {\n        mutableStateOf(Color.White)\n      }\n      var individualColor by remember {\n        mutableStateOf(Color.Red)\n      }\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  groupColor = if (groupColor == Color.Black) Color.White else Color.Black\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle group color\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  individualColor = if (individualColor == Color.Red) Color.Yellow else Color.Red\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle individual color\")\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CityLocations.HELSINKI)\n              }\n            }\n          ) {\n            CircleAnnotation(\n              point = SINGLE_POINT,\n            ) {\n              interactionsState.onClicked {\n                Toast.makeText(\n                  this@CircleAnnotationActivity,\n                  \"Clicked on single Circle Annotation: $it\",\n                  Toast.LENGTH_SHORT\n                ).show()\n                true\n              }\n                .onLongClicked {\n                  Toast.makeText(\n                    this@CircleAnnotationActivity,\n                    \"Long Clicked on single Circle Annotation: $it\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  true\n                }\n                .onDragged {\n                  logD(\n                    this.javaClass.simpleName,\n                    \"Dragging single Circle Annotation: $it\",\n                  )\n                }\n              circleRadius = 20.0\n              circleColor = Color.Blue\n            }\n            CircleAnnotationGroup(\n              annotations = CLUSTER_POINTS.mapIndexed { index, item ->\n                CircleAnnotationOptions()\n                  .withPoint(item)\n                  .withCircleRadius(10.0)\n                  .apply {\n                    // Apply circle color for selected annotation to overwrite the group settings\n                    if (index % 3 == 0) {\n                      withCircleColor(individualColor)\n                    }\n                  }\n              },\n              annotationConfig = AnnotationConfig(\n                annotationSourceOptions = AnnotationSourceOptions(\n                  clusterOptions = ClusterOptions(\n                    textColorExpression = Expression.color(Color.Yellow.toArgb()),\n                    textColor = Color.Black.toArgb(), // Will not be applied as textColorExpression has been set\n                    textSize = 20.0,\n                    circleRadiusExpression = literal(25.0),\n                    colorLevels = listOf(\n                      Pair(100, Color.Red.toArgb()),\n                      Pair(50, Color.Blue.toArgb()),\n                      Pair(0, Color.Green.toArgb())\n                    )\n                  )\n                )\n              )\n            ) {\n              // Apply circle color to the whole CircleAnnotationGroup\n              circleColor = groupColor\n\n              interactionsState.isDraggable = true\n              interactionsState.onClicked {\n                Toast.makeText(\n                  this@CircleAnnotationActivity,\n                  \"Clicked on Circle Annotation Cluster's item: $it\",\n                  Toast.LENGTH_SHORT\n                ).show()\n                true\n              }\n                .onLongClicked {\n                  Toast.makeText(\n                    this@CircleAnnotationActivity,\n                    \"Long clicked on Circle Annotation Cluster's item: $it\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  true\n                }\n                .onClusterClicked {\n                  Toast.makeText(\n                    this@CircleAnnotationActivity,\n                    \"On cluster Click - ID: ${it.clusterId}, points:  ${it.pointCount}, abbreviatedCount: ${it.pointCountAbbreviated}\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  true\n                }\n                .onClusterLongClicked {\n                  Toast.makeText(\n                    this@CircleAnnotationActivity,\n                    \"On cluster Long Click - ID: ${it.clusterId}, points:  ${it.pointCount}, abbreviatedCount: ${it.pointCountAbbreviated}\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  true\n                }\n                .onDragged {\n                  logD(\n                    this.javaClass.simpleName,\n                    \"Dragging Circle Annotation Cluster's item: $it\"\n                  )\n                }\n                .onDragStarted {\n                  Toast.makeText(\n                    this@CircleAnnotationActivity,\n                    \"Dragged Started for Circle Annotation Cluster's item: $it\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                }\n                .onDragFinished {\n                  interactionsState.onDragged {\n                    logD(\n                      this.javaClass.simpleName,\n                      \"Updated dragging Circle Annotation Cluster's item: $it\"\n                    )\n                  }\n                }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 10.0\n    const val INTERVAL = 0.01\n    val CLUSTER_POINTS: List<Point> by lazy {\n      mutableListOf<Point>().apply {\n        repeat(10) { x ->\n          repeat(10) { y ->\n            add(\n              Point.fromLngLat(\n                CityLocations.HELSINKI.longitude() + INTERVAL * x,\n                CityLocations.HELSINKI.latitude() + INTERVAL * y\n              )\n            )\n          }\n        }\n      }\n    }\n    val SINGLE_POINT: Point = Point.fromLngLat(\n      CityLocations.HELSINKI.longitude() - INTERVAL,\n      CityLocations.HELSINKI.latitude() - INTERVAL\n    )\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/annotation/CustomVectorIconsActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.annotation\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.MapStyle\nimport com.mapbox.maps.extension.compose.style.layers.ImageValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberGeoJsonSourceState\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.image\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.switchCase\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\n\n/**\n * Example demonstrating custom vector icons with dynamic styling and interaction.\n * This example shows how to:\n * - Dynamically colorize vector icons based on feature properties using the image expression\n * - Interactively change icon size by tapping on icons\n *\n * Vector icons are parameterized SVG images that can be styled at runtime. In this example,\n * three flag icons are colored red, yellow, and purple using the 'flagColor' property.\n * Tap any flag to toggle its size between 1x and 2x.\n *\n * For this example to work, the SVGs must live inside the map style. The SVG file was uploaded\n * to Mapbox Studio with the name `flag`, making it available for customization at runtime.\n * You can add vector icons to your own style in Mapbox Studio.\n */\n@OptIn(MapboxDelicateApi::class, MapboxExperimental::class)\npublic class CustomVectorIconsActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var selectedFlagId by remember { mutableStateOf<String?>(null) }\n\n      // Create GeoJSON source with three flag locations\n      val geoJsonSource = rememberGeoJsonSourceState {\n        generateId = BooleanValue(true)\n      }\n      geoJsonSource.data = GeoJSONData(createFlagFeatures())\n\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(16.0)\n          center(Point.fromLngLat(24.6881, 60.185755))\n        }\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = mapViewportState,\n            style = {\n              MapStyle(style = \"mapbox://styles/mapbox-map-design/cm4r19bcm00ao01qvhp3jc2gi\")\n            }\n          ) {\n            // Create symbol layer with parameterized icon\n            SymbolLayer(\n              sourceState = geoJsonSource,\n              layerId = \"points\"\n            ) {\n              interactionsState.onClicked { feature, _ ->\n                feature.properties.optString(\"id\").takeIf { it.isNotEmpty() }?.let { id ->\n                  selectedFlagId = if (selectedFlagId == id) null else id\n                }\n                true\n              }\n              iconImage = ImageValue(\n                image {\n                  literal(\"flag\")\n                  imageOptions(\"flag_color\" to Expression.get(\"flagColor\"))\n                }\n              )\n              iconSize = DoubleValue(\n                switchCase {\n                  eq {\n                    get { literal(\"id\") }\n                    literal(selectedFlagId ?: \"\")\n                  }\n                  literal(2.0)\n                  literal(1.0)\n                }\n              )\n              iconAllowOverlap = BooleanValue(true)\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Creates GeoJSON features with flag locations and colors.\n   */\n  private fun createFlagFeatures(): List<Feature> {\n    return listOf(\n      createFlagFeature(\"flag-red\", 24.68727, 60.185755, \"red\"),\n      createFlagFeature(\"flag-yellow\", 24.68827, 60.186255, \"yellow\"),\n      createFlagFeature(\"flag-purple\", 24.68927, 60.186055, \"#800080\")\n    )\n  }\n\n  /**\n   * Creates a feature with a flag at the specified location and color.\n   */\n  private fun createFlagFeature(id: String, longitude: Double, latitude: Double, color: String): Feature {\n    val feature = Feature.fromGeometry(Point.fromLngLat(longitude, latitude))\n    feature.addStringProperty(\"id\", id)\n    feature.addStringProperty(\"flagColor\", color)\n    return feature\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/annotation/DynamicViewAnnotationActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.annotation\n\nimport android.graphics.Matrix\nimport android.os.Bundle\nimport android.view.View\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.layout.wrapContentSize\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.UiComposable\nimport androidx.compose.ui.draw.shadow\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.RoundRect\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.geometry.toRect\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.graphics.Outline\nimport androidx.compose.ui.graphics.Path\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.asAndroidPath\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.Density\nimport androidx.compose.ui.unit.LayoutDirection\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.GeometryCollection\nimport com.mapbox.geojson.LineString\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.ViewAnnotationAnchor\nimport com.mapbox.maps.ViewAnnotationAnchorConfig\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.examples.utils.AnnotationUtils\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.examples.utils.SimulateRouteLocationProvider\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.coroutine.mapLoadedEvents\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.ViewAnnotation\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.MapboxStyleComposable\nimport com.mapbox.maps.extension.compose.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.compose.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineLayer\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.generated.GeoJsonSourceState\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.ViewportStatus\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState\nimport com.mapbox.maps.viewannotation.OnViewAnnotationUpdatedListener\nimport com.mapbox.maps.viewannotation.annotatedLayerFeature\nimport com.mapbox.maps.viewannotation.annotationAnchors\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport kotlinx.coroutines.flow.firstOrNull\n\n/**\n * Example how to use dynamic view annotations on line layers and fixed positions.\n *\n * The example adds following 5 view annotations to the map:\n *\n * - ETA view annotation\n *    - Attached to the default route line geometry, configured to fit into the camera\n *    padding([ViewAnnotationOptions.ignoreCameraPadding]=false) and not overlapping with other view\n *    annotations or location puck([ViewAnnotationOptions.allowOverlap]=false and\n *    [ViewAnnotationOptions.allowOverlapWithPuck]=false).\n *\n * - Alternative ETA view annotation\n *    - Attached to the alternative routine line geometry, configured to fit into the camera\n *    padding([ViewAnnotationOptions.ignoreCameraPadding]=false) and not overlapping with other view\n *    annotations or location puck([ViewAnnotationOptions.allowOverlap]=false and\n *    [ViewAnnotationOptions.allowOverlapWithPuck]=false).\n *\n * - 2 parking view annotations\n *    - Attached to polygon geometries, configured to ignore the camera\n *    padding([ViewAnnotationOptions.ignoreCameraPadding]=true) and allow overlapping with other view\n *    annotations([ViewAnnotationOptions.allowOverlap]=true), so they would be visible on a further\n *    distance in the follow puck mode, where the padding top is set to 500.\n *    The parking view annotations are not allowed to overlap with the location puck ([ViewAnnotationOptions.allowOverlapWithPuck]=false).\n *\n * - Construction site view annotation\n *    - Attached to point geometry, configured to ignore the camera\n *    padding([ViewAnnotationOptions.ignoreCameraPadding]=true), allow overlapping with other view\n *    annotations([ViewAnnotationOptions.allowOverlap]=true), and allow overlapping with the location\n *    puck([ViewAnnotationOptions.allowOverlapWithPuck]=true). This is useful for high priority labels\n *    that shouldn't be covered by anything.\n */\npublic class DynamicViewAnnotationActivity : ComponentActivity() {\n  private val featureRouteMain: Feature by lazy { getFeatureFromAsset(ROUTE_MAIN_GEOJSON) }\n  private val featureRouteAlt: Feature by lazy { getFeatureFromAsset(ROUTE_ALT_GEOJSON) }\n  private val featureCollectionParkings: FeatureCollection by lazy {\n    getFeatureCollectionFromAsset(\n      PARKINGS_GEOJSON\n    )\n  }\n  private val featureCollectionConstructionSite: FeatureCollection by lazy {\n    getFeatureCollectionFromAsset(\n      CONSTRUCTION_GEOJSON\n    )\n  }\n  private val overviewViewportStateOptions: OverviewViewportStateOptions by lazy {\n    OverviewViewportStateOptions.Builder()\n      .geometry(\n        GeometryCollection.fromGeometries(\n          listOf(\n            featureRouteMain.geometry(),\n            featureRouteAlt.geometry(),\n          )\n        )\n      )\n      .padding(\n        EdgeInsets(\n          /* top = */ 100.0,\n          /* left = */ 100.0,\n          /* bottom = */ 100.0,\n          /* right = */ 100.0\n        )\n      )\n      .build()\n  }\n  private val followPuckViewportStateOption = FollowPuckViewportStateOptions.Builder()\n    .pitch(70.0)\n    .zoom(18.0)\n    .padding(\n      EdgeInsets(\n        /* top = */ 500.0,\n        /* left = */ 100.0,\n        /* bottom = */ 100.0,\n        /* right = */ 100.0\n      )\n    )\n    .build()\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      val viewportState = rememberMapViewportState {\n        setCameraOptions {\n          center(CityLocations.HELSINKI)\n          bearing(0.0)\n          pitch(0.0)\n          zoom(ZOOM)\n        }\n      }\n\n      var showDynamicViewAnnotations by remember {\n        mutableStateOf(false)\n      }\n\n      var isMainActive by remember {\n        mutableStateOf(true)\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            FloatingActionButton(\n              onClick = {\n                if ((viewportState.mapViewportStatus as? ViewportStatus.State)?.state is FollowPuckViewportState) {\n                  viewportState.transitionToOverviewState(overviewViewportStateOptions)\n                } else {\n                  viewportState.transitionToFollowPuckState(followPuckViewportStateOption)\n                }\n              },\n              shape = RoundedCornerShape(16.dp),\n            ) {\n              Text(\n                modifier = Modifier.padding(10.dp),\n                text = if ((viewportState.mapViewportStatus as? ViewportStatus.State)?.state is FollowPuckViewportState) \"Overview\" else \"Follow puck\"\n              )\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = viewportState,\n            style = {\n              NavigationStyle(isMainActive)\n            }\n          ) {\n            MapEffect(Unit) { mapView ->\n              mapView.location.apply {\n                setLocationProvider(\n                  SimulateRouteLocationProvider(\n                    featureRouteMain.geometry() as LineString\n                  )\n                )\n                locationPuck = LocationPuck2D(\n                  bearingImage = ImageHolder.from(R.drawable.mapbox_user_puck_icon),\n                )\n                enabled = true\n                puckBearingEnabled = true\n                puckBearing = PuckBearing.COURSE\n              }\n              // Only show view annotation and adjust location puck position after all the runtime layers\n              // are added.\n              mapView.mapboxMap.mapLoadedEvents.firstOrNull()?.let {\n                mapView.location.layerAbove = LAYER_CONSTRUCTION\n                showDynamicViewAnnotations = true\n                viewportState.transitionToOverviewState(overviewViewportStateOptions)\n              }\n            }\n\n            if (showDynamicViewAnnotations) {\n              DynamicViewAnnotations(isMainActive) {\n                isMainActive = !isMainActive\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  @Composable\n  @MapboxStyleComposable\n  private fun NavigationStyle(isMainActive: Boolean) {\n    val mainRouteSourceState = remember { GeoJsonSourceState() }\n    mainRouteSourceState.data = GeoJSONData(if (isMainActive) featureRouteMain else featureRouteAlt)\n\n    val altRouteSourceState = remember { GeoJsonSourceState() }\n    altRouteSourceState.data = GeoJSONData(if (isMainActive) featureRouteAlt else featureRouteMain)\n\n    val parkingSourceState = remember {\n      GeoJsonSourceState().apply {\n        data = GeoJSONData(featureCollectionParkings.features()!!)\n      }\n    }\n    val constructionSourceState = remember {\n      GeoJsonSourceState().apply {\n        data = GeoJSONData(featureCollectionConstructionSite.features()!!)\n      }\n    }\n\n    MapboxStandardStyle(\n      topSlot = {\n        LineLayer(\n          sourceState = altRouteSourceState,\n          layerId = LAYER_ALT_ID,\n        ) {\n          lineColor = ColorValue(\n            Color(0xFF999999)\n          )\n          lineWidth = DoubleValue(12.0)\n          lineBorderWidth = DoubleValue(2.0)\n          lineBorderColor = ColorValue(Color(0xFF333333))\n        }\n        LineLayer(\n          sourceState = mainRouteSourceState,\n          layerId = LAYER_MAIN_ID\n        ) {\n          lineColor = ColorValue(Color(0xFF57A9FB))\n          lineWidth = DoubleValue(12.0)\n          lineCap = LineCapValue.ROUND\n          lineBorderWidth = DoubleValue(2.0)\n          lineBorderColor = ColorValue(Color(0xFF327AC2))\n        }\n        FillLayer(\n          sourceState = parkingSourceState,\n          layerId = LAYER_PARKING\n        ) {\n          fillColor = ColorValue(Color(0xff0080ff))\n          fillOpacity = DoubleValue(0.5)\n        }\n        CircleLayer(\n          sourceState = constructionSourceState,\n          layerId = LAYER_CONSTRUCTION\n        ) {\n          circleColor = ColorValue(Color.Transparent)\n        }\n      }\n    )\n  }\n\n  @Composable\n  @MapboxMapComposable\n  private fun DynamicViewAnnotations(isMainActive: Boolean, toggleActiveRoute: () -> Unit) {\n    var etaViewAnnotationAnchor by remember {\n      mutableStateOf(ViewAnnotationAnchor.BOTTOM_LEFT)\n    }\n\n    var alternativeEtaViewAnnotationAnchor by remember {\n      mutableStateOf(ViewAnnotationAnchor.BOTTOM_LEFT)\n    }\n    // eta view\n    ViewAnnotation(\n      options = viewAnnotationOptions {\n        annotatedLayerFeature(LAYER_MAIN_ID)\n        annotationAnchors(\n          {\n            anchor(ViewAnnotationAnchor.TOP_RIGHT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.TOP_LEFT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.BOTTOM_RIGHT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.BOTTOM_LEFT)\n          },\n        )\n      },\n      onUpdatedListener = object : OnViewAnnotationUpdatedListener {\n        override fun onViewAnnotationAnchorUpdated(view: View, anchor: ViewAnnotationAnchorConfig) {\n          etaViewAnnotationAnchor = anchor.anchor\n        }\n      }\n    ) {\n      MainDVAContent(isInitial = isMainActive, etaViewAnnotationAnchor = etaViewAnnotationAnchor)\n    }\n\n    // alternative eta view\n    ViewAnnotation(\n      options = viewAnnotationOptions {\n        annotatedLayerFeature(LAYER_ALT_ID)\n        annotationAnchors(\n          {\n            anchor(ViewAnnotationAnchor.TOP_RIGHT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.TOP_LEFT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.BOTTOM_RIGHT)\n          },\n          {\n            anchor(ViewAnnotationAnchor.BOTTOM_LEFT)\n          },\n        )\n      },\n      onUpdatedListener = object : OnViewAnnotationUpdatedListener {\n        override fun onViewAnnotationAnchorUpdated(view: View, anchor: ViewAnnotationAnchorConfig) {\n          alternativeEtaViewAnnotationAnchor = anchor.anchor\n        }\n      }\n    ) {\n      AlternativeDVAContent(\n        isInitial = !isMainActive,\n        alternativeEtaViewAnnotationAnchor = alternativeEtaViewAnnotationAnchor,\n        onClick = toggleActiveRoute\n      )\n    }\n\n    // parking view annotation 1\n    ViewAnnotation(\n      options = viewAnnotationOptions {\n        allowOverlap(true)\n        ignoreCameraPadding(true)\n        annotatedLayerFeature(LAYER_PARKING) {\n          featureId(PARKING_FEATURE_ID_1)\n        }\n      }\n    ) {\n      ParkingDVAContent(\"$4/h\")\n    }\n\n    // parking view annotation 2\n    ViewAnnotation(\n      options = viewAnnotationOptions {\n        allowOverlap(true)\n        ignoreCameraPadding(true)\n        annotatedLayerFeature(LAYER_PARKING) {\n          featureId(PARKING_FEATURE_ID_2)\n        }\n      }\n    ) {\n      ParkingDVAContent(\"$6/h\")\n    }\n\n    // construction view annotation\n    ViewAnnotation(\n      options = viewAnnotationOptions {\n        allowOverlap(true)\n        ignoreCameraPadding(true)\n        allowOverlapWithPuck(true)\n        annotatedLayerFeature(LAYER_CONSTRUCTION) {\n          featureId(CONSTRUCTION_FEATURE_ID_1)\n        }\n      }\n    ) {\n      ConstructionDVAContent()\n    }\n  }\n\n  @Preview\n  @Composable\n  @UiComposable\n  public fun MainDVAContent(\n    isInitial: Boolean = true,\n    etaViewAnnotationAnchor: ViewAnnotationAnchor = ViewAnnotationAnchor.BOTTOM_LEFT,\n    onClick: () -> Unit = {}\n  ) {\n    // etaViewAnnotationAnchor change did not trigger recomposition of shadow, use key composable\n    // here to trigger recomposition of the box everytime the anchor changes.\n    key(etaViewAnnotationAnchor) {\n      Box(\n        modifier = Modifier\n            .clickable(\n                interactionSource = remember { MutableInteractionSource() },\n                indication = null,\n                onClick = onClick\n            )\n            .shadow(\n                elevation = 8.dp,\n                CalloutShape(etaViewAnnotationAnchor)\n            )\n            .background(MaterialTheme.colors.primary)\n            .wrapContentSize(unbounded = true)\n      ) {\n        Column(\n          modifier = Modifier\n              .align(Alignment.Center)\n              .padding(30.dp)\n        ) {\n          Text(\n            text = \"25 min\",\n            fontSize = 25.sp,\n            color = Color.White\n          )\n          if (isInitial) {\n            Text(\n              text = \"This is the initially suggested route\",\n              fontSize = 12.sp,\n              color = Color.White\n            )\n          }\n        }\n      }\n    }\n  }\n\n  @Preview\n  @Composable\n  @UiComposable\n  public fun AlternativeDVAContent(\n    isInitial: Boolean = true,\n    alternativeEtaViewAnnotationAnchor: ViewAnnotationAnchor = ViewAnnotationAnchor.BOTTOM_LEFT,\n    onClick: () -> Unit = {}\n  ) {\n    // alternativeEtaViewAnnotationAnchor change did not trigger recomposition of shadow, use key composable\n    // here to trigger recomposition of the box everytime the anchor changes.\n    key(alternativeEtaViewAnnotationAnchor) {\n      Box(\n        modifier = Modifier\n            .clickable(\n                interactionSource = remember { MutableInteractionSource() },\n                indication = null,\n                onClick = onClick\n            )\n            .shadow(\n                elevation = 8.dp,\n                CalloutShape(alternativeEtaViewAnnotationAnchor)\n            )\n            .background(Color.White)\n            .wrapContentSize(unbounded = true)\n      ) {\n        Row(\n          modifier = Modifier\n            .align(Alignment.Center)\n            .padding(30.dp)\n        ) {\n          Image(\n            modifier = Modifier\n                .width(30.dp)\n                .height(30.dp)\n                .padding(5.dp)\n                .align(Alignment.CenterVertically),\n            painter = painterResource(id = R.drawable.arrow_straight),\n            contentDescription = \"arrow\",\n            colorFilter = ColorFilter.tint(Color(0xFF09AA74))\n          )\n          Column {\n            Text(\n              text = \"Save 10 min\",\n              fontSize = 18.sp,\n              color = Color.Black\n            )\n            Text(\n              text = \"Avoid traffic\",\n              fontSize = 12.sp,\n              color = Color.Black\n            )\n            if (isInitial) {\n              Text(\n                text = \"This is the initially suggested route\",\n                fontSize = 12.sp,\n                color = Color.Black\n              )\n            }\n          }\n        }\n      }\n    }\n  }\n\n  @Preview\n  @Composable\n  @UiComposable\n  public fun ParkingDVAContent(price: String = \"$4/h\") {\n    Box(\n      modifier = Modifier\n          .width(110.dp)\n          .height(40.dp)\n          .background(Color.White, shape = CircleShape)\n    ) {\n      Row(\n        modifier = Modifier\n            .align(Alignment.CenterStart)\n            .padding(2.dp)\n      ) {\n        Text(\n          modifier = Modifier\n              .size(36.dp)\n              .align(Alignment.CenterVertically)\n              .background(MaterialTheme.colors.primary, shape = CircleShape),\n          text = \"P\",\n          fontSize = 25.sp,\n          textAlign = TextAlign.Center,\n          color = Color.White,\n        )\n        Text(\n          modifier = Modifier\n            .padding(start = 8.dp),\n          text = price,\n          textAlign = TextAlign.Center,\n          fontSize = 25.sp,\n          color = Color.Black,\n        )\n      }\n    }\n  }\n\n  @Preview\n  @Composable\n  @UiComposable\n  public fun ConstructionDVAContent() {\n    Text(\n      modifier = Modifier\n          .size(40.dp)\n          .padding(4.dp),\n      text = \"🚧\",\n      fontSize = 20.sp\n    )\n  }\n\n  private fun getFeatureFromAsset(featureGeojson: String) =\n    Feature.fromJson(\n      AnnotationUtils.loadStringFromAssets(\n        this, featureGeojson\n      )!!\n    )\n\n  private fun getFeatureCollectionFromAsset(featureGeojson: String) =\n    FeatureCollection.fromJson(\n      AnnotationUtils.loadStringFromAssets(\n        this, featureGeojson\n      )!!\n    )\n\n  private companion object {\n    const val ZOOM: Double = 2.0\n    const val LAYER_MAIN_ID = \"layer-main\"\n    const val LAYER_ALT_ID = \"layer-alt\"\n    const val LAYER_PARKING = \"layer-parking\"\n    const val LAYER_CONSTRUCTION = \"layer-construction\"\n\n    const val PARKING_FEATURE_ID_1 = \"parking-1\"\n    const val PARKING_FEATURE_ID_2 = \"parking-2\"\n    const val CONSTRUCTION_FEATURE_ID_1 = \"construction-1\"\n\n    const val ROUTE_MAIN_GEOJSON = \"dva-sf-route-main.geojson\"\n    const val ROUTE_ALT_GEOJSON = \"dva-sf-route-alternative.geojson\"\n    const val PARKINGS_GEOJSON = \"dva-sf-parkings.geojson\"\n    const val CONSTRUCTION_GEOJSON = \"dva-sf-construction.geojson\"\n  }\n}\n\n/**\n * Utility class to define the callout shape.\n */\nprivate data class CalloutShape(private val anchor: ViewAnnotationAnchor?) : Shape {\n\n  override fun createOutline(\n    size: Size,\n    layoutDirection: LayoutDirection,\n    density: Density\n  ): Outline {\n    val path = Path()\n    val scaledSize = size / density.density\n    path.addArrow(anchor, scaledSize)\n    path.addRoundRect(RoundRect(scaledSize.toRect().deflate(delta = 12f), CornerRadius(x = 16f)))\n    val matrix = Matrix()\n    matrix.setScale(density.density, density.density)\n    path.asAndroidPath().transform(matrix)\n    return Outline.Generic(path)\n  }\n}\n\nprivate fun Path.addArrow(anchor: ViewAnnotationAnchor?, size: Size) {\n  when (anchor) {\n    ViewAnnotationAnchor.TOP_LEFT -> addPath(\n      Path().apply {\n        moveTo(x = 32f, y = 12f)\n        cubicTo(x1 = 26f, y1 = 12f, x2 = 24.7f, y2 = 11.5f, x3 = 21.1f, y3 = 9.7f)\n        lineTo(x = 1.4f, y = 0.1f)\n        cubicTo(x1 = 0.6f, y1 = -0.3f, x2 = -0.3f, y2 = 0.6f, x3 = 0.1f, y3 = 1.5f)\n        lineTo(x = 9.8f, y = 21f)\n        cubicTo(x1 = 11.5f, y1 = 24.7f, x2 = 12f, y2 = 26f, x3 = 12f, y3 = 32f)\n      },\n    )\n\n    ViewAnnotationAnchor.TOP_RIGHT -> addPath(\n      Path().apply {\n        moveTo(x = 20f, y = 32f)\n        cubicTo(x1 = 20f, y1 = 26f, x2 = 20.5f, y2 = 24.7f, x3 = 22.2f, y3 = 21f)\n        lineTo(x = 31.9f, y = 1.5f)\n        cubicTo(x1 = 32.3f, y1 = 0.6f, x2 = 31.4f, y2 = -0.3f, x3 = 30.6f, y3 = 0.1f)\n        lineTo(x = 10.9f, y = 9.7f)\n        cubicTo(x1 = 7.3f, y1 = 11.5f, x2 = 6f, y2 = 12f, x3 = 0f, y3 = 12f)\n      },\n      Offset(x = size.width - 32f, y = 0f),\n    )\n\n    ViewAnnotationAnchor.BOTTOM_RIGHT -> addPath(\n      Path().apply {\n        moveTo(x = 0f, y = 20f)\n        cubicTo(x1 = 6f, y1 = 20f, x2 = 7.3f, y2 = 20.5f, x3 = 10.9f, y3 = 22.3f)\n        lineTo(x = 30.6f, y = 31.9f)\n        cubicTo(x1 = 31.4f, y1 = 32.3f, x2 = 32.3f, y2 = 31.4f, x3 = 31.9f, y3 = 30.5f)\n        lineTo(x = 22.2f, y = 11f)\n        cubicTo(x1 = 20.5f, y1 = 7.3f, x2 = 20f, y2 = 6f, x3 = 20f, y3 = 0f)\n      },\n      Offset(x = size.width - 32f, y = size.height - 32f),\n    )\n\n    ViewAnnotationAnchor.BOTTOM_LEFT -> addPath(\n      Path().apply {\n        moveTo(x = 12f, y = 0f)\n        cubicTo(x1 = 12f, y1 = 6f, x2 = 11.5f, y2 = 7.3f, x3 = 9.8f, y3 = 11f)\n        lineTo(x = 0.1f, y = 30.5f)\n        cubicTo(x1 = -0.3f, y1 = 31.4f, x2 = 0.6f, y2 = 32.3f, x3 = 1.4f, y3 = 31.9f)\n        lineTo(x = 21.1f, y = 22.3f)\n        cubicTo(x1 = 24.7f, y1 = 20.5f, x2 = 26f, y2 = 20f, x3 = 32f, y3 = 20f)\n      },\n      Offset(x = 0f, y = size.height - 32f),\n    )\n\n    else -> return\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/annotation/MarkersActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.annotation\n\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateListOf\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations.HELSINKI\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.Marker\nimport com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect\nimport com.mapbox.maps.extension.compose.rememberMapState\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\n\n/**\n * Example to showcase usage of Markers with animation.\n *\n * Demonstrates three preset markers with different animation types:\n * - Wiggle+Scale on appear, Scale on disappear\n * - Scale on appear, Scale on disappear\n * - Fade on appear, Fade on disappear\n *\n * Click the map to add new markers with animations.\n * Long press the map to remove all markers (demonstrates disappear animations).\n */\npublic class MarkersActivity : ComponentActivity() {\n  @OptIn(MapboxExperimental::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      val clickedPoints = remember { mutableStateListOf<Point>() }\n      var markerColor by remember { mutableStateOf(Color(0xffcfdaf7)) }\n      var strokeColor by remember { mutableStateOf(Color(0xff3a59fa)) }\n      var showStroke by remember { mutableStateOf(true) }\n      var showText by remember { mutableStateOf(true) }\n      var showPresetMarkers by remember { mutableStateOf(true) }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          Box(modifier = Modifier.fillMaxSize()) {\n            val mapState = rememberMapState { }\n            MapboxMap(\n              Modifier.fillMaxSize(),\n              mapViewportState = rememberMapViewportState {\n                setCameraOptions {\n                  zoom(ZOOM)\n                  pitch(PITCH)\n                  center(HELSINKI)\n                }\n              },\n              style = {\n                MapboxStandardStyle()\n              },\n              mapState = mapState,\n              onMapClickListener = { point ->\n                clickedPoints.add(point)\n                true\n              },\n              onMapLongClickListener = {\n                clickedPoints.clear()\n                showPresetMarkers = false\n                true\n              }\n            ) {\n            // Three preset markers demonstrating different animation types\n            if (showPresetMarkers) {\n              // Marker 1: Wiggle+Scale\n              val point1 = Point.fromLngLat(HELSINKI.longitude() - 0.01, HELSINKI.latitude())\n              Marker(\n                point = point1,\n                color = markerColor,\n                stroke = if (showStroke) strokeColor else null,\n                text = if (showText) \"Wiggle+Scale\" else null,\n                appearAnimation = listOf(MarkerAnimationEffect.wiggle, MarkerAnimationEffect.scale),\n                disappearAnimation = listOf(MarkerAnimationEffect.wiggle, MarkerAnimationEffect.scale(from = 1f, to = 0f)),\n                onClick = {\n                  Log.d(TAG, \"Marker clicked at: ${point1.latitude()}, ${point1.longitude()}\")\n                }\n              )\n\n              // Marker 2: Scale\n              val point2 = Point.fromLngLat(HELSINKI.longitude(), HELSINKI.latitude())\n              Marker(\n                point = point2,\n                color = markerColor,\n                stroke = if (showStroke) strokeColor else null,\n                text = if (showText) \"Scale\" else null,\n                appearAnimation = listOf(MarkerAnimationEffect.scale),\n                disappearAnimation = listOf(MarkerAnimationEffect.scale(from = 1f, to = 0f)),\n                onClick = {\n                  Log.d(TAG, \"Marker clicked at: ${point2.latitude()}, ${point2.longitude()}\")\n                }\n              )\n\n              // Marker 3: Fade\n              val point3 = Point.fromLngLat(HELSINKI.longitude() + 0.01, HELSINKI.latitude())\n              Marker(\n                point = point3,\n                color = markerColor,\n                stroke = if (showStroke) strokeColor else null,\n                text = if (showText) \"Fade\" else null,\n                appearAnimation = listOf(MarkerAnimationEffect.fadeIn),\n                disappearAnimation = listOf(MarkerAnimationEffect.fadeOut),\n                onClick = {\n                  Log.d(TAG, \"Marker clicked at: ${point3.latitude()}, ${point3.longitude()}\")\n                }\n              )\n            }\n\n            // User-added markers\n            clickedPoints.forEach { point ->\n              val coordText = remember(point) {\n                \"%.2f, %.2f\".format(point.latitude(), point.longitude())\n              }\n              Marker(\n                point = point,\n                color = markerColor,\n                stroke = if (showStroke) strokeColor else null,\n                text = if (showText) coordText else null,\n                appearAnimation = listOf(MarkerAnimationEffect.wiggle, MarkerAnimationEffect.scale),\n                disappearAnimation = listOf(MarkerAnimationEffect.wiggle, MarkerAnimationEffect.scale(from = 1f, to = 0f)),\n                onClick = {\n                  Log.d(TAG, \"Marker clicked at: ${point.latitude()}, ${point.longitude()}\")\n                }\n              )\n            }\n          }\n\n            // Centered info box overlay\n            Box(\n              modifier = Modifier\n                .align(Alignment.BottomCenter)\n                .padding(bottom = 40.dp)\n            ) {\n              SelectionBox(\n                markerColor = markerColor,\n                onMarkerColorChange = { markerColor = it },\n                strokeColor = strokeColor,\n                onStrokeColorChange = { strokeColor = it },\n                showText = showText,\n                onShowTextToggle = { showText = !showText },\n                showStroke = showStroke,\n                onShowStrokeToggle = { showStroke = !showStroke }\n              )\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val TAG = \"MarkersActivity\"\n    const val ZOOM: Double = 12.5\n    const val PITCH: Double = 45.0\n  }\n}\n\n@Composable\nprivate fun SelectionBox(\n  markerColor: Color,\n  onMarkerColorChange: (Color) -> Unit,\n  strokeColor: Color,\n  onStrokeColorChange: (Color) -> Unit,\n  showText: Boolean,\n  onShowTextToggle: () -> Unit,\n  showStroke: Boolean,\n  onShowStrokeToggle: () -> Unit\n) {\n  Column(\n    modifier = Modifier\n      .background(Color.Black.copy(alpha = 0.8f), shape = RoundedCornerShape(12.dp))\n      .padding(16.dp),\n    verticalArrangement = Arrangement.spacedBy(12.dp)\n  ) {\n    // Header\n    Text(\n      text = \"Marker Animations\",\n      color = Color.White,\n      style = androidx.compose.material.MaterialTheme.typography.subtitle1,\n      fontWeight = FontWeight.Bold\n    )\n\n    // Instructions\n    Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {\n      Text(\n        text = \"Tap map to add markers\",\n        color = Color.White.copy(alpha = 0.9f),\n        style = androidx.compose.material.MaterialTheme.typography.body2\n      )\n      Text(\n        text = \"Long press to remove all markers\",\n        color = Color.White.copy(alpha = 0.9f),\n        style = androidx.compose.material.MaterialTheme.typography.body2\n      )\n    }\n\n    androidx.compose.material.Divider(\n      color = Color.White.copy(alpha = 0.3f),\n      thickness = 1.dp\n    )\n\n    // Color Selectors\n    Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {\n      Row(\n        verticalAlignment = Alignment.CenterVertically,\n        horizontalArrangement = Arrangement.spacedBy(8.dp)\n      ) {\n        Text(\n          text = \"Color\",\n          color = Color.White,\n          style = androidx.compose.material.MaterialTheme.typography.body2,\n          modifier = Modifier.width(50.dp)\n        )\n        Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {\n          MarkerColors.OPTIONS.forEach { color ->\n            Box(\n              modifier = Modifier\n                .size(24.dp)\n                .background(color, shape = RoundedCornerShape(12.dp))\n                .clickable { onMarkerColorChange(color) }\n                .border(\n                  width = if (markerColor == color) 2.dp else 0.dp,\n                  color = if (markerColor == color) Color.White else Color.Transparent,\n                  shape = RoundedCornerShape(12.dp)\n                )\n            )\n          }\n        }\n      }\n\n      Row(\n        verticalAlignment = Alignment.CenterVertically,\n        horizontalArrangement = Arrangement.spacedBy(8.dp)\n      ) {\n        Text(\n          text = \"Stroke\",\n          color = Color.White,\n          style = androidx.compose.material.MaterialTheme.typography.body2,\n          modifier = Modifier.width(50.dp)\n        )\n        Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {\n          MarkerColors.OPTIONS.forEach { color ->\n            Box(\n              modifier = Modifier\n                .size(24.dp)\n                .background(color, shape = RoundedCornerShape(12.dp))\n                .clickable { onStrokeColorChange(color) }\n                .border(\n                  width = if (strokeColor == color) 2.dp else 0.dp,\n                  color = if (strokeColor == color) Color.White else Color.Transparent,\n                  shape = RoundedCornerShape(12.dp)\n                )\n            )\n          }\n        }\n      }\n    }\n\n    // Toggle Buttons\n    Row(\n      horizontalArrangement = Arrangement.spacedBy(8.dp),\n      modifier = Modifier.padding(top = 4.dp)\n    ) {\n      FloatingActionButton(\n        modifier = Modifier.weight(1f).size(height = 36.dp, width = 0.dp),\n        backgroundColor = if (showText) Color(0xFF2196F3) else Color(0xFF424242),\n        onClick = onShowTextToggle,\n        shape = RoundedCornerShape(18.dp)\n      ) {\n        Text(\n          text = \"Text\",\n          color = Color.White,\n          style = androidx.compose.material.MaterialTheme.typography.button\n        )\n      }\n      FloatingActionButton(\n        modifier = Modifier.weight(1f).size(height = 36.dp, width = 0.dp),\n        backgroundColor = if (showStroke) Color(0xFF2196F3) else Color(0xFF424242),\n        onClick = onShowStrokeToggle,\n        shape = RoundedCornerShape(18.dp)\n      ) {\n        Text(\n          text = \"Stroke\",\n          color = Color.White,\n          style = androidx.compose.material.MaterialTheme.typography.button\n        )\n      }\n    }\n  }\n}\n\nprivate object MarkerColors {\n  val OPTIONS = listOf(\n    Color.Red, Color.Green, Color(0xff4264fb), Color.Yellow, Color.Magenta, Color.Cyan,\n    Color.Black, Color.White, Color.Gray, Color(0xff0f38bf)\n  )\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/annotation/PointAnnotationActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.annotation\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.PointAnnotation\nimport com.mapbox.maps.extension.compose.annotation.rememberIconImage\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.ThemeValue\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\nimport com.mapbox.maps.logD\n\n/**\n * Example to showcase usage of point annotations with text and icon image.\n */\npublic class PointAnnotationActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    setContent {\n      var text by remember {\n        mutableStateOf(\"Hello!\")\n      }\n\n      var markerResourceId by remember {\n        mutableStateOf(R.drawable.ic_blue_marker)\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  text = \"$text!\"\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Update text field\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  markerResourceId =\n                    if (markerResourceId == R.drawable.ic_red_marker) R.drawable.ic_blue_marker else R.drawable.ic_red_marker\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Update icon image\")\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CityLocations.HELSINKI)\n              }\n            },\n            style = {\n              MapboxStandardStyle(\n                standardStyleState = rememberStandardStyleState {\n                  configurationsState.apply {\n                    theme = ThemeValue.MONOCHROME\n                  }\n                }\n              )\n            }\n          ) {\n            val marker =\n              rememberIconImage(key = markerResourceId, painter = painterResource(markerResourceId))\n            PointAnnotation(point = CityLocations.HELSINKI) {\n              iconImage = marker\n              textField = text\n              interactionsState.onClicked {\n                Toast.makeText(this@PointAnnotationActivity, \"First\", Toast.LENGTH_SHORT).show()\n                interactionsState.onClicked {\n                  Toast.makeText(this@PointAnnotationActivity, \"Second\", Toast.LENGTH_SHORT).show()\n                  true\n                }\n                true\n              }\n                .onDragged {\n                  logD(\n                    this.javaClass.simpleName,\n                    \"onDragged\"\n                  )\n                }.also { it.isDraggable = true }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 10.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/annotation/PointAnnotationClusterActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.annotation\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.material.CircularProgressIndicator\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.examples.utils.AnnotationUtils\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroup\nimport com.mapbox.maps.extension.compose.annotation.rememberIconImage\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.ThemeValue\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationSourceOptions\nimport com.mapbox.maps.plugin.annotation.ClusterOptions\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\n\n/**\n * Example to showcase usage of clustering of point annotations.\n */\npublic class PointAnnotationClusterActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    setContent {\n      var isLoadingInProgress by remember {\n        mutableStateOf(true)\n      }\n      var points by remember {\n        mutableStateOf<List<Point>>(listOf())\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CityLocations.WASHINGTON)\n              }\n            },\n            style = {\n              MapboxStandardStyle(\n                standardStyleState = rememberStandardStyleState {\n                  configurationsState.apply {\n                    theme = ThemeValue.MONOCHROME\n                  }\n                }\n              )\n            }\n          ) {\n            val marker = rememberIconImage(R.drawable.ic_red_marker)\n            PointAnnotationGroup(\n              annotations = points.map {\n                PointAnnotationOptions()\n                  .withPoint(it)\n              },\n              annotationConfig = AnnotationConfig(\n                annotationSourceOptions = AnnotationSourceOptions(\n                  clusterOptions = ClusterOptions(\n                    textColorExpression = Expression.color(Color.YELLOW),\n                    textColor = Color.BLACK, // Will not be applied as textColorExpression has been set\n                    textSize = 20.0,\n                    circleRadiusExpression = literal(25.0),\n                    colorLevels = listOf(\n                      Pair(100, Color.RED),\n                      Pair(50, Color.BLUE),\n                      Pair(0, Color.GREEN)\n                    )\n                  )\n                )\n              ),\n            ) {\n              iconImage = marker\n              interactionsState.isDraggable = true\n\n              interactionsState.onClicked {\n                Toast.makeText(\n                  this@PointAnnotationClusterActivity,\n                  \"Clicked on Point Annotation Cluster's item: $it\",\n                  Toast.LENGTH_SHORT\n                ).show()\n                true\n              }\n                .onLongClicked {\n                  Toast.makeText(\n                    this@PointAnnotationClusterActivity,\n                    \"Long clicked on Circle Annotation Cluster's item: $it\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  true\n                }\n                .onClusterClicked {\n                  Toast.makeText(\n                    this@PointAnnotationClusterActivity,\n                    \"On cluster Click - ID: ${it.clusterId}, points:  ${it.pointCount}, abbreviatedCount: ${it.pointCountAbbreviated}\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  true\n                }\n                .onClusterLongClicked {\n                  Toast.makeText(\n                    this@PointAnnotationClusterActivity,\n                    \"On cluster Long Click - ID: ${it.clusterId}, points:  ${it.pointCount}, abbreviatedCount: ${it.pointCountAbbreviated}\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  true\n                }\n            }\n          }\n          LaunchedEffect(Unit) {\n            withContext(Dispatchers.IO) {\n              points = loadData()\n              isLoadingInProgress = false\n            }\n          }\n          if (isLoadingInProgress) {\n            Box(\n              contentAlignment = Alignment.Center,\n              modifier = Modifier.fillMaxSize()\n            ) {\n              CircularProgressIndicator()\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun loadData(): List<Point> {\n    val json = AnnotationUtils.loadStringFromNet(this@PointAnnotationClusterActivity, POINTS_URL)\n    if (json == null) {\n      runOnUiThread {\n        Toast.makeText(this@PointAnnotationClusterActivity, \"Failed to download data from network\", Toast.LENGTH_LONG).show()\n      }\n      return emptyList()\n    }\n    return try {\n      FeatureCollection.fromJson(json).features()?.let { features ->\n        features.shuffled().take(AMOUNT).map { feature ->\n          feature.geometry() as Point\n        }\n      } ?: emptyList()\n    } catch (e: Exception) {\n      logE(TAG, \"Failed to parse GeoJSON: ${e.message}\")\n      runOnUiThread {\n        Toast.makeText(this@PointAnnotationClusterActivity, \"Failed to parse GeoJSON: ${e.message}\", Toast.LENGTH_LONG).show()\n      }\n      emptyList()\n    }\n  }\n\n  private companion object {\n    const val TAG = \"PointAnnotationCluster\"\n    const val ZOOM: Double = 10.0\n    const val AMOUNT = 10000\n    private const val POINTS_URL =\n      \"https://opendata.arcgis.com/datasets/01d0ff375695466d93d1fa2a976e2bdd_5.geojson\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/annotation/PolygonAnnotationActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.annotation\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.ThemeValue\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\n\n/**\n * Example to showcase usage of PolygonAnnotation with Jetpack Compose.\n */\npublic class PolygonAnnotationActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var color by remember {\n        mutableStateOf(Color.Red)\n      }\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            FloatingActionButton(\n              modifier = Modifier.padding(bottom = 10.dp),\n              onClick = {\n                color = if (color == Color.Red) Color.Blue else Color.Red\n              },\n              shape = RoundedCornerShape(16.dp),\n            ) {\n              Text(modifier = Modifier.padding(10.dp), text = \"Toggle color\")\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CAMERA_CENTER)\n              }\n            },\n            style = {\n              MapboxStandardStyle(\n                standardStyleState = rememberStandardStyleState {\n                  configurationsState.apply {\n                    theme = ThemeValue.MONOCHROME\n                  }\n                }\n              )\n            },\n          ) {\n            PolygonAnnotation(\n              points = POLYGON_POINTS,\n            ) {\n              interactionsState.isDraggable = true\n              interactionsState.onClicked {\n                Toast.makeText(\n                  this@PolygonAnnotationActivity,\n                  \"Clicked on Polygon Annotation: $it\",\n                  Toast.LENGTH_SHORT\n                ).show()\n                interactionsState.isDraggable = false\n                true\n              }\n                .onLongClicked {\n                  Toast.makeText(\n                    this@PolygonAnnotationActivity,\n                    \"Long Clicked on Polygon Annotation: $it\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  interactionsState.isDraggable = true\n                  true\n                }\n              fillColor = color\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 5.0\n    val CAMERA_CENTER: Point = Point.fromLngLat(-88.90136, 25.04579)\n    val POLYGON_POINTS = listOf(\n      listOf(\n        Point.fromLngLat(-89.857177734375, 24.51713945052515),\n        Point.fromLngLat(-87.967529296875, 24.51713945052515),\n        Point.fromLngLat(-87.967529296875, 26.244156283890756),\n        Point.fromLngLat(-89.857177734375, 26.244156283890756),\n        Point.fromLngLat(-89.857177734375, 24.51713945052515)\n      )\n    )\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/annotation/PolylineAnnotationActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.annotation\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.AnnotationUtils\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroup\nimport com.mapbox.maps.extension.compose.annotation.generated.withLineColor\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions\nimport java.util.Random\n\n/**\n * Example to showcase usage of PolylineAnnotation with Jetpack Compose.\n */\npublic class PolylineAnnotationActivity : ComponentActivity() {\n  private val random = Random()\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          val mapViewportState = rememberMapViewportState {\n            setCameraOptions {\n              center(CityLocations.NULLISLAND)\n              zoom(3.0)\n              pitch(0.0)\n              bearing(0.0)\n            }\n          }\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = mapViewportState\n          ) {\n            PolylineAnnotation(\n              points = POLYLINE_POINTS,\n            ) {\n              interactionsState.onClicked {\n                Toast.makeText(\n                  this@PolylineAnnotationActivity,\n                  \"Clicked on Polygon Annotation: $it\",\n                  Toast.LENGTH_SHORT\n                ).show()\n                true\n              }\n                .onLongClicked {\n                  Toast.makeText(\n                    this@PolylineAnnotationActivity,\n                    \"Long Clicked on Polygon Annotation: $it\",\n                    Toast.LENGTH_SHORT\n                  ).show()\n                  true\n                }\n                .onDragged {\n                  logD(\n                    this.javaClass.simpleName,\n                    \"Dragging Polyline Annotation: $it\"\n                  )\n                }.also { it.isDraggable = true }\n              lineColor = Color.Red\n              lineWidth = 5.0\n            }\n            PolylineAnnotationGroup(\n              annotations = mutableListOf<PolylineAnnotationOptions>().apply {\n                repeat(100) {\n                  add(\n                    PolylineAnnotationOptions()\n                      .withPoints(AnnotationUtils.createRandomPoints())\n                      .withLineColor(\n                        Color(\n                          random.nextInt(256),\n                          random.nextInt(256),\n                          random.nextInt(256),\n                        )\n                      )\n                  )\n                }\n              },\n              annotationConfig = AnnotationConfig(\n                PITCH_OUTLINE, LAYER_ID, SOURCE_ID\n              )\n            )\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    val POLYLINE_POINTS = listOf(\n      Point.fromLngLat(-4.375974, -2.178992),\n      Point.fromLngLat(-7.639772, -4.107888),\n      Point.fromLngLat(-11.439207, 2.798737),\n    )\n    private const val LAYER_ID = \"line_layer\"\n    private const val SOURCE_ID = \"line_source\"\n    private const val PITCH_OUTLINE = \"pitch-outline\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/annotation/ViewAnnotationActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.annotation\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport android.widget.Toast.LENGTH_SHORT\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.animation.animateColorAsState\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.Button\nimport androidx.compose.material.ButtonDefaults\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.ViewAnnotationAnchor\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations.HELSINKI\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.ViewAnnotation\nimport com.mapbox.maps.viewannotation.annotationAnchor\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport java.util.Random\n\n/**\n * Example to showcase usage of MapboxMap.\n */\npublic class ViewAnnotationActivity : ComponentActivity() {\n  private val random = Random()\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var buttonColor by remember {\n        mutableStateOf(Color.Blue)\n      }\n      var showViewAnnotation by remember {\n        mutableStateOf(true)\n      }\n      var allowZElevate by remember {\n        mutableStateOf(true)\n      }\n      val animatedColor by animateColorAsState(buttonColor, label = \"ButtonAnnotationColor\")\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showViewAnnotation = !showViewAnnotation\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle Visibility\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                backgroundColor = if (showViewAnnotation) MaterialTheme.colors.secondary else Color.LightGray,\n                onClick = {\n                  if (showViewAnnotation) {\n                    allowZElevate = !allowZElevate\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle allowZElevate\")\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                pitch(PITCH)\n                center(HELSINKI)\n              }\n            }\n          ) {\n            if (showViewAnnotation) {\n              ViewAnnotation(\n                options = viewAnnotationOptions {\n                  geometry(HELSINKI)\n                  annotationAnchor {\n                    anchor(ViewAnnotationAnchor.BOTTOM)\n                  }\n                  allowOverlap(false)\n                  allowZElevate(allowZElevate)\n                }\n              ) {\n                Button(\n                  onClick = {\n                    buttonColor =\n                      Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))\n                    Toast.makeText(applicationContext, \"Click\", LENGTH_SHORT).show()\n                  },\n                  colors = ButtonDefaults.buttonColors(\n                    backgroundColor = animatedColor\n                  ),\n                ) {\n                  Text(\n                    \"Click me\"\n                  )\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 16.0\n    const val PITCH: Double = 60.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/basic/AccessibilityScaleActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.basic\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material.AlertDialog\nimport androidx.compose.material.Divider\nimport androidx.compose.material.ExperimentalMaterialApi\nimport androidx.compose.material.Icon\nimport androidx.compose.material.IconButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Slider\nimport androidx.compose.material.Surface\nimport androidx.compose.material.Text\nimport androidx.compose.material.TextButton\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Info\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.shadow\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.text.font.FontStyle\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.SymbolScaleBehavior\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroup\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport kotlinx.coroutines.delay\n\n/**\n * Example demonstrating accessibility scaling for map symbols.\n *\n * This example shows:\n * - **Scale Factor**: Controls ALL symbols in the map (system labels + custom annotations)\n *   - Fixed: Manual control with slider\n *   - System: Automatic scaling based on system font size\n *   - Custom: System scaling with custom mapping\n * - **Icon/Text Size Scale Range**: Only affects the custom annotations (shown in blue)\n */\n@OptIn(MapboxExperimental::class)\npublic class AccessibilityScaleActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          AccessibilityScaleExample()\n        }\n      }\n    }\n  }\n}\n\nprivate enum class ScaleMode(val displayName: String) {\n  FIXED(\"Fixed\"),\n  SYSTEM(\"System\"),\n  CUSTOM(\"Custom\")\n}\n\nprivate data class Location(val name: String, val lat: Double, val lon: Double)\n\nprivate val sampleLocations = listOf(\n  Location(\"Harlem\", 40.8116, -73.9465),\n  Location(\"Upper West Side\", 40.7870, -73.9754),\n  Location(\"Midtown\", 40.7549, -73.9840)\n)\n\n@OptIn(MapboxExperimental::class, ExperimentalMaterialApi::class)\n@Composable\nprivate fun AccessibilityScaleExample() {\n  var scaleMode by remember { mutableStateOf(ScaleMode.FIXED) }\n  var scaleFactor by remember { mutableStateOf(1.0f) }\n  var iconSizeMin by remember { mutableStateOf(0.8) }\n  var iconSizeMax by remember { mutableStateOf(2.0) }\n  var textSizeMin by remember { mutableStateOf(0.8) }\n  var textSizeMax by remember { mutableStateOf(2.0) }\n  var showInfoDialog by remember { mutableStateOf(false) }\n\n  // Debounce scaleFactor and range sliders to avoid flooding the map renderer on every slider tick\n  var debouncedScaleFactor by remember { mutableStateOf(scaleFactor) }\n  LaunchedEffect(scaleFactor) { delay(150L); debouncedScaleFactor = scaleFactor }\n\n  var debouncedIconSizeMin by remember { mutableStateOf(iconSizeMin) }\n  var debouncedIconSizeMax by remember { mutableStateOf(iconSizeMax) }\n  var debouncedTextSizeMin by remember { mutableStateOf(textSizeMin) }\n  var debouncedTextSizeMax by remember { mutableStateOf(textSizeMax) }\n  LaunchedEffect(iconSizeMin) { delay(150L); debouncedIconSizeMin = iconSizeMin }\n  LaunchedEffect(iconSizeMax) { delay(150L); debouncedIconSizeMax = iconSizeMax }\n  LaunchedEffect(textSizeMin) { delay(150L); debouncedTextSizeMin = textSizeMin }\n  LaunchedEffect(textSizeMax) { delay(150L); debouncedTextSizeMax = textSizeMax }\n\n  Box(Modifier.fillMaxSize()) {\n    MapboxMap(\n      Modifier.fillMaxSize(),\n      mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          center(Point.fromLngLat(-73.9680, 40.7489))\n          zoom(11.5)\n        }\n      },\n      style = { MapboxStandardStyle() }\n    ) {\n      // Create bitmap from drawable for use in PointAnnotationOptions\n      val context = LocalContext.current\n      val iconBitmap = remember {\n        val drawable = requireNotNull(\n          androidx.core.content.ContextCompat.getDrawable(context, R.drawable.ic_blue_marker)\n        ) { \"ic_blue_marker drawable not found\" }\n        val bitmap = android.graphics.Bitmap.createBitmap(\n          drawable.intrinsicWidth,\n          drawable.intrinsicHeight,\n          android.graphics.Bitmap.Config.ARGB_8888\n        )\n        val canvas = android.graphics.Canvas(bitmap)\n        drawable.setBounds(0, 0, canvas.width, canvas.height)\n        drawable.draw(canvas)\n        bitmap\n      }\n\n      // Create annotations with icon set on each\n      val annotations = remember(iconBitmap) {\n        sampleLocations.map { (name, lat, lon) ->\n          PointAnnotationOptions()\n            .withPoint(Point.fromLngLat(lon, lat))\n            .withIconImage(iconBitmap)\n            .withIconAnchor(IconAnchor.BOTTOM)\n            .withTextField(name)\n            .withTextSize(16.0)\n            .withTextOffset(listOf(0.0, 0.3))\n            .withTextAnchor(TextAnchor.TOP)\n            .withTextColor(android.graphics.Color.parseColor(\"#007AFF\"))\n            .withTextHaloColor(android.graphics.Color.WHITE)\n            .withTextHaloWidth(2.0)\n        }\n      }\n\n      PointAnnotationGroup(\n        annotations = annotations\n      ) {\n        // Set group-level properties (scale ranges work here)\n        iconSize = 1.5\n        iconAllowOverlap = true\n        textAllowOverlap = true\n        iconSizeScaleRange = listOf(debouncedIconSizeMin, debouncedIconSizeMax)\n        textSizeScaleRange = listOf(debouncedTextSizeMin, debouncedTextSizeMax)\n      }\n\n      // Update scale behavior when mode or debounced factor changes\n      MapEffect(scaleMode, debouncedScaleFactor) { mapView ->\n        applyScaleBehavior(mapView.mapboxMap, scaleMode, debouncedScaleFactor)\n      }\n    }\n\n    // Info button in top-right corner\n    IconButton(\n      onClick = { showInfoDialog = true },\n      modifier = Modifier\n        .align(Alignment.TopEnd)\n        .padding(16.dp)\n        .shadow(2.dp, CircleShape)\n        .background(Color.White, CircleShape)\n    ) {\n      Icon(\n        Icons.Default.Info,\n        contentDescription = \"Information\",\n        tint = Color(0xFF2196F3) // Blue to match theme\n      )\n    }\n\n    // Settings Panel at bottom\n    Surface(\n      modifier = Modifier\n        .align(Alignment.BottomCenter)\n        .fillMaxWidth()\n        .padding(horizontal = 16.dp, vertical = 30.dp),\n      shape = RoundedCornerShape(10.dp),\n      elevation = 8.dp,\n    ) {\n        Column(\n          modifier = Modifier.padding(16.dp),\n          verticalArrangement = Arrangement.spacedBy(12.dp)\n        ) {\n          // Scale Factor Section\n          Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {\n            Text(\n              \"Scale Factor (all symbols)\",\n              style = MaterialTheme.typography.caption.copy(fontWeight = FontWeight.Bold)\n            )\n\n            // Mode picker\n            Row(\n              horizontalArrangement = Arrangement.spacedBy(4.dp),\n              modifier = Modifier.fillMaxWidth()\n            ) {\n              for (mode in ScaleMode.values()) {\n                Surface(\n                  modifier = Modifier.weight(1f),\n                  shape = RoundedCornerShape(8.dp),\n                  color = if (scaleMode == mode) Color(0xFF2196F3) else Color(0xFFE0E0E0),\n                  onClick = { scaleMode = mode }\n                ) {\n                  Text(\n                    mode.displayName,\n                    modifier = Modifier.padding(vertical = 8.dp),\n                    style = MaterialTheme.typography.button.copy(\n                      color = if (scaleMode == mode) Color.White else Color.Black,\n                      fontSize = 12.sp\n                    ),\n                    textAlign = TextAlign.Center\n                  )\n                }\n              }\n            }\n\n            // Mode-specific content\n            when (scaleMode) {\n              ScaleMode.FIXED -> {\n                Row(\n                  modifier = Modifier.fillMaxWidth(),\n                  horizontalArrangement = Arrangement.SpaceBetween\n                ) {\n                  Text(\"Scale:\", style = MaterialTheme.typography.caption)\n                  Text(\"%.1f\".format(scaleFactor), style = MaterialTheme.typography.caption)\n                }\n                Slider(\n                  value = scaleFactor,\n                  onValueChange = { scaleFactor = it },\n                  valueRange = 0.5f..3.0f,\n                  steps = 24\n                )\n              }\n              ScaleMode.SYSTEM -> {\n                Text(\n                  \"Automatic scaling from Settings → Accessibility\",\n                  style = MaterialTheme.typography.caption,\n                  color = Color.Gray\n                )\n              }\n              ScaleMode.CUSTOM -> {\n                Text(\n                  \"Custom mapping: dampens large accessibility scales\",\n                  style = MaterialTheme.typography.caption,\n                  color = Color.Gray\n                )\n              }\n            }\n          }\n\n          Divider()\n\n          // Scale Ranges Section\n          Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {\n            Text(\n              \"Scale Ranges (custom annotations)\",\n              style = MaterialTheme.typography.caption.copy(fontWeight = FontWeight.Bold)\n            )\n\n            // Icon Size Scale Range\n            Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {\n              Text(\"Icon Size Range\", style = MaterialTheme.typography.caption)\n              Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {\n                Column(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) {\n                  Text(\"Min: %.1f\".format(iconSizeMin), style = MaterialTheme.typography.caption)\n                  Slider(\n                    value = iconSizeMin.toFloat(),\n                    onValueChange = { iconSizeMin = it.toDouble().coerceAtMost(iconSizeMax) },\n                    valueRange = 0.1f..5.0f,\n                    steps = 48\n                  )\n                }\n                Column(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) {\n                  Text(\"Max: %.1f\".format(iconSizeMax), style = MaterialTheme.typography.caption)\n                  Slider(\n                    value = iconSizeMax.toFloat(),\n                    onValueChange = { iconSizeMax = it.toDouble().coerceAtLeast(iconSizeMin) },\n                    valueRange = 0.1f..5.0f,\n                    steps = 48\n                  )\n                }\n              }\n            }\n\n            // Text Size Scale Range\n            Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {\n              Text(\"Text Size Range\", style = MaterialTheme.typography.caption)\n              Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {\n                Column(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) {\n                  Text(\"Min: %.1f\".format(textSizeMin), style = MaterialTheme.typography.caption)\n                  Slider(\n                    value = textSizeMin.toFloat(),\n                    onValueChange = { textSizeMin = it.toDouble().coerceAtMost(textSizeMax) },\n                    valueRange = 0.1f..5.0f,\n                    steps = 48\n                  )\n                }\n                Column(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) {\n                  Text(\"Max: %.1f\".format(textSizeMax), style = MaterialTheme.typography.caption)\n                  Slider(\n                    value = textSizeMax.toFloat(),\n                    onValueChange = { textSizeMax = it.toDouble().coerceAtLeast(textSizeMin) },\n                    valueRange = 0.1f..5.0f,\n                    steps = 48\n                  )\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    // Info dialog\n    if (showInfoDialog) {\n      AccessibilityScaleInfoDialog(onDismiss = { showInfoDialog = false })\n    }\n  }\n\n@OptIn(MapboxExperimental::class)\nprivate fun applyScaleBehavior(\n  mapboxMap: MapboxMap,\n  mode: ScaleMode,\n  scaleFactor: Float\n) {\n  mapboxMap.symbolScaleBehavior = when (mode) {\n    ScaleMode.FIXED -> SymbolScaleBehavior.fixed(scaleFactor)\n    ScaleMode.SYSTEM -> SymbolScaleBehavior.system\n    ScaleMode.CUSTOM -> SymbolScaleBehavior.system { systemFontScale ->\n      when {\n        systemFontScale < 1.0f -> systemFontScale * 1.1f // Boost small scales by 10%\n        systemFontScale <= 1.3f -> systemFontScale // Keep medium scales unchanged\n        else -> 1.3f + (systemFontScale - 1.3f) * 0.4f // Dampen large scales\n      }\n    }\n  }\n}\n\n@Composable\nprivate fun AccessibilityScaleInfoDialog(onDismiss: () -> Unit) {\n  AlertDialog(\n    onDismissRequest = onDismiss,\n    title = { Text(\"Accessibility Scale Example\", style = MaterialTheme.typography.h6) },\n    text = {\n      Column(\n        modifier = Modifier.verticalScroll(rememberScrollState()),\n        verticalArrangement = Arrangement.spacedBy(12.dp)\n      ) {\n        Text(\n          \"This example demonstrates how to control symbol scaling for accessibility using the Maps SDK.\",\n          style = MaterialTheme.typography.body2\n        )\n\n        Spacer(Modifier.height(4.dp))\n\n        Text(\"Scale Factor\", style = MaterialTheme.typography.subtitle2.copy(fontWeight = FontWeight.Bold))\n        Text(\n          \"Adjusts the global scale factor for all symbol layers on the map using the symbolScaleBehavior property. This affects both system map labels and custom annotations.\",\n          style = MaterialTheme.typography.body2\n        )\n        Text(\"• Fixed: Manual control with a slider\", style = MaterialTheme.typography.body2)\n        Text(\"• System: Automatically scales based on the device's font scale (Settings → Accessibility → Font Size and Text Scaling)\", style = MaterialTheme.typography.body2)\n        Text(\"• Custom: Uses a custom mapping function to modify system scale values (e.g., dampen large scales)\", style = MaterialTheme.typography.body2)\n\n        Spacer(Modifier.height(4.dp))\n\n        Text(\"Icon Size Scale Range\", style = MaterialTheme.typography.subtitle2.copy(fontWeight = FontWeight.Bold))\n        Text(\n          \"Sets the minimum and maximum scaling limits for icons using the icon-size-scale-range layout property. This only affects the custom blue annotations in this example.\",\n          style = MaterialTheme.typography.body2\n        )\n        Text(\n          \"Example: Setting [1.0, 1.0] prevents icons from scaling regardless of the scale factor value.\",\n          style = MaterialTheme.typography.body2.copy(fontStyle = FontStyle.Italic)\n        )\n\n        Spacer(Modifier.height(4.dp))\n\n        Text(\"Text Size Scale Range\", style = MaterialTheme.typography.subtitle2.copy(fontWeight = FontWeight.Bold))\n        Text(\n          \"Sets the minimum and maximum scaling limits for text using the text-size-scale-range layout property. This only affects the custom blue text labels in this example.\",\n          style = MaterialTheme.typography.body2\n        )\n        Text(\n          \"Example: Setting [0.5, 3.0] allows text to scale from half size to triple size based on the scale factor.\",\n          style = MaterialTheme.typography.body2.copy(fontStyle = FontStyle.Italic)\n        )\n\n        Spacer(Modifier.height(8.dp))\n\n        Text(\"Try experimenting:\", style = MaterialTheme.typography.subtitle2.copy(fontWeight = FontWeight.Bold))\n        Text(\"• Set scale factor to 2.0 with icon range [1.0, 1.0] to see text scale while icons stay the same size\", style = MaterialTheme.typography.body2)\n        Text(\"• Switch to System mode and change your device's font size in Settings to see automatic scaling\", style = MaterialTheme.typography.body2)\n        Text(\"• Use Custom mode to see how mapping functions can dampen extreme scale values\", style = MaterialTheme.typography.body2)\n      }\n    },\n    confirmButton = {\n      TextButton(onClick = onDismiss) {\n        Text(\"Got it\")\n      }\n    }\n  )\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/basic/DebugModeActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.basic\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.debugoptions.MapViewDebugOptions\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.rememberMapState\nimport com.mapbox.maps.logI\nimport kotlinx.coroutines.launch\n\n/**\n * Example to showcase usage of MapEffect to enable debug mode.\n */\npublic class DebugModeActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMapComposeTheme {\n        MapScreen()\n      }\n    }\n  }\n\n  @Preview(showBackground = true)\n  @Composable\n  private fun MapScreen() {\n    val mapState = rememberMapState()\n    LaunchedEffect(Unit) {\n      mapState.apply {\n        launch {\n          mapLoadedEvents.collect {\n            logI(\"map events\", \"on map loaded\")\n          }\n        }\n        launch {\n          mapIdleEvents.collect {\n            logI(\"map events\", \"on map idle\")\n          }\n        }\n        launch {\n          mapLoadingErrorEvents.collect {\n            logI(\"map events\", \"on map loading error\")\n          }\n        }\n        launch {\n          styleLoadedEvents.collect {\n            logI(\"map events\", \"on style loaded\")\n          }\n        }\n        launch {\n          sourceDataLoadedEvents.collect {\n            logI(\"map events\", \"on source data loaded ${it.tileId}\")\n          }\n        }\n      }\n    }\n    ExampleScaffold {\n      MapboxMap(\n        Modifier.fillMaxSize(),\n        mapViewportState = rememberMapViewportState {\n          setCameraOptions {\n            center(CityLocations.BERLIN)\n            zoom(ZOOM)\n            pitch(0.0)\n            this.bearing(0.0)\n          }\n        },\n        onMapClickListener = {\n          Toast.makeText(this@DebugModeActivity, \"Clicked on $it\", Toast.LENGTH_SHORT).show()\n          false\n        },\n        onMapLongClickListener = {\n          Toast.makeText(this@DebugModeActivity, \"Long-clicked on $it\", Toast.LENGTH_SHORT).show()\n          false\n        },\n        mapState = mapState,\n      ) {\n        // Enable debug mode using MapEffect\n        MapEffect(Unit) { mapView ->\n          mapView.debugOptions = setOf(\n            MapViewDebugOptions.TILE_BORDERS,\n            MapViewDebugOptions.PARSE_STATUS,\n            MapViewDebugOptions.TIMESTAMPS,\n            MapViewDebugOptions.COLLISION,\n            MapViewDebugOptions.STENCIL_CLIP,\n            MapViewDebugOptions.DEPTH_BUFFER,\n            MapViewDebugOptions.MODEL_BOUNDS,\n            MapViewDebugOptions.TERRAIN_WIREFRAME,\n            MapViewDebugOptions.LAYERS2_DWIREFRAME,\n            MapViewDebugOptions.LAYERS3_DWIREFRAME,\n            MapViewDebugOptions.CAMERA,\n            MapViewDebugOptions.PADDING,\n          )\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 9.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/basic/EdgeToEdgeActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.basic\n\nimport android.os.Build\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.displayCutout\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.systemBars\nimport androidx.compose.foundation.layout.union\nimport androidx.compose.foundation.layout.windowInsetsPadding\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.core.view.WindowCompat\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\n\n/**\n * This example shows how to handle system insets (status bar, navigation bar, display cutouts)\n * in the Edge-to-Edge layout using Jetpack Compose to prevent map ornaments from being obscured,\n *\n * Key concepts:\n * - Combine WindowInsets.systemBars and WindowInsets.displayCutout for comprehensive coverage\n * - Use Modifier.windowInsetsPadding() to apply combined insets to map ornaments\n * - Use contentPadding parameter to preserve default map ornament spacing\n * - Configure system bar appearance.\n *\n * Note: Starting with Android 15 (API 35), edge-to-edge is enforced by default for all apps\n * targeting API 35+. See:\n * https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge\n *\n * For apps targeting API 34 or lower, you need to explicitly enable edge-to-edge by calling\n * WindowCompat.setDecorFitsSystemWindows(window, false) or WindowCompat.enableEdgeToEdge(). See:\n * https://developer.android.com/develop/ui/views/layout/edge-to-edge#enable-edge-to-edge-display\n *\n * The contentPadding parameter was introduced in v11.3.0-rc.1 to address the issue where\n * supplying custom padding via Modifier would unexpectedly remove the default ornament padding.\n * Now the default padding is separated into a contentPadding parameter, allowing you to add\n * system bar padding without losing the ornament's internal spacing.\n * See: https://github.com/mapbox/mapbox-maps-android/issues/2317\n */\npublic class EdgeToEdgeActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    setContent {\n      MapboxMapComposeTheme {\n        // Combine system bars (status bar, navigation bar) and cutout insets (punch-holes, notches)\n        val safeInsets = WindowInsets.systemBars.union(WindowInsets.displayCutout)\n\n        Box(modifier = Modifier.fillMaxSize()) {\n          MapboxMap(\n            modifier = Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CityLocations.HELSINKI)\n              }\n            },\n            logo = {\n              Logo(\n                // Apply safe insets to respect system UI and display cutouts\n                modifier = Modifier.windowInsetsPadding(safeInsets),\n                // Preserve the default 4dp content padding for the logo\n                // This is the key improvement from v11.3.0-rc.1:\n                // contentPadding is separate from the Modifier padding\n                contentPadding = PaddingValues(ORNAMENT_PADDING),\n                alignment = Alignment.BottomStart\n              )\n            },\n            // Customize Attribution ornament with edge-to-edge handling\n            attribution = {\n              Attribution(\n                // Apply safe insets to respect system UI and display cutouts\n                modifier = Modifier.windowInsetsPadding(safeInsets),\n                // Preserve the default 4dp content padding for the attribution\n                contentPadding = PaddingValues(ORNAMENT_PADDING),\n                alignment = Alignment.BottomEnd\n              )\n            },\n            // Customize Compass ornament with edge-to-edge handling\n            compass = {\n              Compass(\n                // Apply safe insets to respect system UI and display cutouts\n                modifier = Modifier.windowInsetsPadding(safeInsets),\n                // Preserve the default 4dp content padding for the compass\n                contentPadding = PaddingValues(ORNAMENT_PADDING),\n                alignment = Alignment.TopEnd\n              )\n            },\n            // Customize ScaleBar ornament with edge-to-edge handling\n            scaleBar = {\n              ScaleBar(\n                // Apply safe insets to respect system UI and display cutouts\n                modifier = Modifier.windowInsetsPadding(safeInsets),\n                // Preserve the default 4dp content padding for the scale bar\n                contentPadding = PaddingValues(ORNAMENT_PADDING),\n                alignment = Alignment.TopStart\n              )\n            }\n          )\n        }\n      }\n    }\n\n    // Configure system bar appearance (after setContent)\n    configureSystemBarAppearance()\n  }\n\n  /**\n   * Configure system bar appearance for edge-to-edge display.\n   *\n   * This example uses dark system bar icons (for better visibility on light map backgrounds).\n   * For theme-aware icon colors or other customizations, see:\n   * https://developer.android.com/develop/ui/views/layout/edge-to-edge#system-bar-icons\n   */\n  @Suppress(\"DEPRECATION\")\n  private fun configureSystemBarAppearance() {\n    // Disable automatic contrast enforcement for true transparency (API 29+)\n    // Note: This only affects 3-button navigation (removes scrim). Gesture navigation is unaffected.\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n      window.isNavigationBarContrastEnforced = false\n      window.isStatusBarContrastEnforced = false\n    }\n\n    // Set dark system bar icons (more visible on light map backgrounds)\n    val insetsController = WindowCompat.getInsetsController(window, window.decorView)\n    insetsController.apply {\n      isAppearanceLightStatusBars = true // true = dark icons\n      isAppearanceLightNavigationBars = true\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 12.0\n    val ORNAMENT_PADDING = 4.dp\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/basic/LazyColumnMapActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.basic\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\n\n/**\n * Example showcasing [MapboxMap] inside a [LazyColumn].\n */\npublic class LazyColumnMapActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          // Known issue on Compose Foundation 1.7.x (e.g. composeBom 2025.12.01):\n          // LazyColumn prefetch uses PausableComposition, which can apply changes to a deactivated\n          // AndroidView-backed slot and crash with \"Apply is called on a deactivated node\".\n          // Workaround: disable prefetch via a no-op LazyListPrefetchStrategy:\n          //\n          // val listState = rememberLazyListState(\n          //   prefetchStrategy = object : LazyListPrefetchStrategy {\n          //     override fun LazyListPrefetchScope.onScroll(delta: Float, layoutInfo: LazyListLayoutInfo) {}\n          //     override fun LazyListPrefetchScope.onVisibleItemsUpdated(layoutInfo: LazyListLayoutInfo) {}\n          //     override fun NestedPrefetchScope.onNestedPrefetch(firstVisibleItemIndex: Int) {}\n          //   }\n          // )\n          // LazyColumn(state = listState, modifier = Modifier.padding(it)) {\n          LazyColumn(modifier = Modifier.padding(it)) {\n            repeat(10) {\n              item {\n                MapboxMap(modifier = Modifier.height(MAP_ITEM_HEIGHT_DP.dp))\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val MAP_ITEM_HEIGHT_DP = 200\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/basic/MultiDisplayActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.basic\n\nimport android.app.ActivityOptions\nimport android.content.Context\nimport android.content.Intent\nimport android.hardware.display.DisplayManager\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.Display\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\n\n/**\n * Showcase showing a map in a secondary display.\n */\npublic class MultiDisplayActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var mapOnDefaultDisplay by remember {\n        mutableStateOf(false)\n      }\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  mapOnDefaultDisplay = !mapOnDefaultDisplay\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                val action = if (mapOnDefaultDisplay) \"Hide\" else \"Show\"\n                Text(modifier = Modifier.padding(10.dp), text = \"$action map on default display\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  displayMapInSecondaryScreen()\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Show map on secondary display\")\n              }\n            }\n          }\n        ) {\n          if (mapOnDefaultDisplay) {\n            MapboxMap(\n              Modifier.fillMaxSize(),\n              mapViewportState = rememberMapViewportState {\n                setCameraOptions {\n                  center(CityLocations.HELSINKI)\n                  zoom(15.0)\n                }\n              }\n            )\n          }\n        }\n      }\n    }\n  }\n\n  private fun displayMapInSecondaryScreen() {\n    val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager\n    displayManager.displays.firstOrNull {\n      it.displayId != Display.DEFAULT_DISPLAY\n    }?.apply {\n      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n        // Use activity options to select the display screen.\n        val options = ActivityOptions.makeBasic()\n        options.launchDisplayId = displayId\n        val intent = Intent(this@MultiDisplayActivity, SimpleMapActivity::class.java)\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n        // To display on the second screen, the intent must be launched using singleTask launchMode.\n        startActivity(\n          intent,\n          options.toBundle()\n        )\n      }\n    }\n      ?: Toast.makeText(this, \"Second screen not found.\", Toast.LENGTH_SHORT).show()\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/basic/MultiMapActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.basic\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.ViewAnnotation\nimport com.mapbox.maps.extension.compose.style.standard.LightPresetValue\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.ThemeValue\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\n\n/**\n * Example to showcase usage of multiple of MapboxMap in the same screen.\n */\npublic class MultiMapActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var viewAnnotationList1 by remember { mutableStateOf(emptyList<Point>()) }\n      var viewAnnotationList2 by remember { mutableStateOf(emptyList<Point>()) }\n\n      LaunchedEffect(Unit) {\n        launch {\n          delay(1000L)\n          viewAnnotationList1 = points1\n          viewAnnotationList2 = points1\n        }\n        launch {\n          delay(2000L)\n          viewAnnotationList2 = points1 + points2\n        }\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          Column(modifier = Modifier.padding(it)) {\n            MapboxMap(\n              modifier = Modifier\n                  .weight(1f)\n                  .fillMaxWidth(),\n              mapViewportState = rememberMapViewportState {\n                setCameraOptions {\n                  zoom(ZOOM)\n                  center(CityLocations.HELSINKI)\n                }\n              },\n              style = {\n                MapboxStandardStyle(\n                  standardStyleState = rememberStandardStyleState {\n                    configurationsState.apply {\n                      theme = ThemeValue.MONOCHROME\n                      lightPreset = LightPresetValue.NIGHT\n                    }\n                  }\n                )\n              }\n            ) {\n              viewAnnotationList1.forEachIndexed { index, point ->\n                ViewAnnotation(\n                  options = viewAnnotationOptions {\n                    geometry(point)\n                    allowOverlap(true)\n                  }\n                ) {\n                  Text(text = \"Annotation $index\", color = Color.Red)\n                }\n              }\n            }\n            MapboxMap(\n              modifier = Modifier\n                  .weight(1f)\n                  .fillMaxWidth(),\n              mapViewportState = rememberMapViewportState {\n                setCameraOptions {\n                  zoom(ZOOM)\n                  center(CityLocations.HELSINKI)\n                }\n              },\n              style = {\n                MapboxStandardStyle(\n                  standardStyleState = rememberStandardStyleState {\n                    configurationsState.apply {\n                      theme = ThemeValue.MONOCHROME\n                    }\n                  }\n                )\n              }\n            ) {\n              viewAnnotationList2.forEachIndexed { index, point ->\n                ViewAnnotation(\n                  options = viewAnnotationOptions {\n                    geometry(point)\n                    allowOverlap(true)\n                  }\n                ) {\n                  Text(text = \"Annotation $index\", color = Color.Blue)\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 13.0\n    val points1 = listOf(\n      Point.fromLngLat(24.94216010242652, 60.16876757234266),\n      Point.fromLngLat(24.929766009141733, 60.170292490574944),\n    )\n    val points2 = listOf(\n      Point.fromLngLat(24.947481155604, 60.1731440090149),\n      Point.fromLngLat(24.937481155604, 60.1631440090149)\n    )\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/basic/QueryRenderedFeatureActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.basic\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.RenderedQueryGeometry\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapState\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.extension.compose.rememberMapState\nimport com.mapbox.maps.extension.compose.style.MapStyle\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettings\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.launch\n\n/**\n * Example to showcase usage of query rendered features.\n */\n@OptIn(MapboxExperimental::class)\npublic class QueryRenderedFeatureActivity : ComponentActivity() {\n\n  private val buildingFeatureset = TypedFeaturesetDescriptor.Layer(\"building\")\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      val mapState = rememberMapState {\n        gesturesSettings = GesturesSettings {\n          doubleTapToZoomInEnabled = false\n          quickZoomEnabled = false\n          doubleTouchToZoomOutEnabled = false\n          pinchToZoomEnabled = false\n        }\n      }\n      var clickedBuilding by remember {\n        mutableStateOf(emptyList<List<Point>>())\n      }\n      var viewportHighlightedBuildings by remember {\n        mutableStateOf(emptyList<List<List<Point>>>())\n      }\n      LaunchedEffect(Unit) {\n        with(mapState) {\n          // wait and suspend for the first ever map idle event, meaning map is rendered.\n          mapIdleEvents.first()\n          clickedBuilding =\n            queryBuildingCoordinatesAt(CityLocations.HELSINKI)!!\n        }\n      }\n      val coroutineScope = rememberCoroutineScope()\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            FloatingActionButton(\n              onClick = {\n                coroutineScope.launch {\n                  viewportHighlightedBuildings = mapState.queryRenderedFeatures(\n                    buildingFeatureset\n                  ).map {\n                    (it.geometry as? Polygon)?.coordinates()?.toList() ?: emptyList()\n                  }\n                }\n              }\n            ) {\n              Text(modifier = Modifier.padding(10.dp), text = \"Highlight all\")\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CityLocations.HELSINKI)\n              }\n            },\n            style = {\n              MapStyle(style = Style.MAPBOX_STREETS)\n            },\n            onMapClickListener = { clickedPoint ->\n              coroutineScope.launch {\n                mapState.queryBuildingCoordinatesAt(clickedPoint)?.let {\n                  clickedBuilding = it\n                }\n              }\n              false\n            },\n            mapState = mapState\n          ) {\n            PolygonAnnotation(clickedBuilding) {\n              fillColor = Color.Red\n              fillOpacity = 0.5\n            }\n            viewportHighlightedBuildings.forEach { building ->\n              PolygonAnnotation(building) {\n                fillColor = Color.Blue\n                fillOpacity = 0.5\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private suspend fun MapState.queryBuildingCoordinatesAt(point: Point): List<List<Point>>? {\n    val selectedBuildings = queryRenderedFeatures(\n      geometry = RenderedQueryGeometry(pixelForCoordinate(point)),\n      descriptor = buildingFeatureset\n    )\n    if (selectedBuildings.isEmpty()) {\n      logD(TAG, \"Clicked outside of building\")\n      return null\n    }\n    logD(TAG) { \"Feature properties: ${selectedBuildings.first().properties}\" }\n    return (selectedBuildings.first().geometry as? Polygon)?.coordinates()?.toList()\n  }\n\n  private companion object {\n    const val TAG = \"QRFActivity\"\n    const val ZOOM: Double = 15.5\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/basic/SimpleMapActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.basic\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.ui.Modifier\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\n\n/**\n * Example to showcase usage of MapboxMap.\n */\npublic class SimpleMapActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CityLocations.HELSINKI)\n              }\n            },\n          )\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 9.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/location/LocationComponentActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.location\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.material.Button\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.SnackbarHost\nimport androidx.compose.material.SnackbarHostState\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.res.painterResource\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.examples.utils.RequestLocationPermission\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.createDefault2DPuck\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.ViewportStatus\nimport kotlinx.coroutines.launch\n\n/**\n * Example to showcase usage of Location Component.\n */\npublic class LocationComponentActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      val context = LocalContext.current\n      val snackbarHostState = remember { SnackbarHostState() }\n      val scope = rememberCoroutineScope()\n      var permissionRequestCount by remember {\n        mutableStateOf(1)\n      }\n      var showMap by remember {\n        mutableStateOf(false)\n      }\n      var showRequestPermissionButton by remember {\n        mutableStateOf(false)\n      }\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          center(CityLocations.HELSINKI)\n          zoom(ZOOM)\n          pitch(PITCH)\n        }\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            // Show locate button when viewport is in Idle state, e.g. camera is controlled by gestures.\n            if (mapViewportState.mapViewportStatus == ViewportStatus.Idle) {\n              FloatingActionButton(\n                onClick = {\n                  mapViewportState.transitionToFollowPuckState()\n                }\n              ) {\n                Image(\n                  painter = painterResource(id = android.R.drawable.ic_menu_mylocation),\n                  contentDescription = \"Locate button\"\n                )\n              }\n            }\n          },\n          snackbarHost = {\n            SnackbarHost(snackbarHostState)\n          }\n        ) {\n          RequestLocationPermission(\n            requestCount = permissionRequestCount,\n            onPermissionDenied = {\n              scope.launch {\n                snackbarHostState.showSnackbar(\"You need to accept location permissions.\")\n              }\n              showRequestPermissionButton = true\n            },\n            onPermissionReady = {\n              showRequestPermissionButton = false\n              showMap = true\n            }\n          )\n          if (showMap) {\n            MapboxMap(\n              Modifier.fillMaxSize(),\n              mapViewportState = mapViewportState,\n            ) {\n              MapEffect(Unit) { mapView ->\n                mapView.location.updateSettings {\n                  locationPuck = createDefault2DPuck(withBearing = true)\n                  puckBearingEnabled = true\n                  puckBearing = PuckBearing.HEADING\n                  enabled = true\n                }\n                mapViewportState.transitionToFollowPuckState()\n              }\n            }\n          }\n          if (showRequestPermissionButton) {\n            Box(modifier = Modifier.fillMaxSize()) {\n              Column(modifier = Modifier.align(Alignment.Center)) {\n                Button(\n                  modifier = Modifier.align(Alignment.CenterHorizontally),\n                  onClick = {\n                    permissionRequestCount += 1\n                  }\n                ) {\n                  Text(\"Request permission again ($permissionRequestCount)\")\n                }\n                Button(\n                  modifier = Modifier.align(Alignment.CenterHorizontally),\n                  onClick = {\n                    context.startActivity(\n                      Intent(\n                        android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,\n                        Uri.fromParts(\"package\", packageName, null)\n                      )\n                    )\n                  }\n                ) {\n                  Text(\"Show App Settings page\")\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 0.0\n    const val PITCH: Double = 0.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/location/NavigationSimulationActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.location\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.api.directions.v5.models.DirectionsResponse\nimport com.mapbox.core.constants.Constants\nimport com.mapbox.geojson.LineString\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.AnnotationUtils\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.examples.utils.SimulateRouteLocationProvider\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.compose.testapp.utils.RecordFrameStats\nimport com.mapbox.maps.extension.compose.DisposableMapEffect\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.MapboxStyleComposable\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineLayer\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberGeoJsonSourceState\nimport com.mapbox.maps.extension.compose.style.standard.LightPresetValue\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.createDefault2DPuck\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.ViewportStatus\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\n\n/**\n * Example to showcase usage of runtime styling with compose.\n */\npublic class NavigationSimulationActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          center(CityLocations.NULLISLAND)\n          zoom(0.0)\n          pitch(0.0)\n          bearing(0.0)\n        }\n      }\n      var progress by remember {\n        mutableStateOf(0.0)\n      }\n      var routeLine by remember {\n        mutableStateOf<LineString?>(null)\n      }\n\n      var lightPreset by remember {\n        mutableStateOf(LightPresetValue.DAY)\n      }\n\n      LaunchedEffect(Unit) {\n        withContext(Dispatchers.IO) {\n          routeLine = LineString.fromPolyline(\n            DirectionsResponse.fromJson(\n              AnnotationUtils.loadStringFromAssets(\n                this@NavigationSimulationActivity,\n                NAVIGATION_ROUTE_JSON_NAME\n              )!!\n            ).routes()[0].geometry()!!,\n            Constants.PRECISION_6\n          ).also {\n            // immediately transition to overview viewport state after route line is available\n            mapViewportState.transitionToOverviewState(\n              OverviewViewportStateOptions.Builder().geometry(it)\n                .padding(EdgeInsets(50.0, 50.0, 50.0, 50.0))\n                .build()\n            )\n          }\n        }\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              if (routeLine != null) {\n                FloatingActionButton(\n                  modifier = Modifier\n                      .padding(bottom = 10.dp)\n                      .align(Alignment.End),\n                  onClick = {\n                    if ((mapViewportState.mapViewportStatus as? ViewportStatus.State)?.state is FollowPuckViewportState) {\n                      routeLine?.let {\n                        mapViewportState.transitionToOverviewState(\n                          overviewViewportStateOptions = OverviewViewportStateOptions.Builder()\n                            .geometry(it)\n                            .padding(EdgeInsets(50.0, 50.0, 50.0, 50.0))\n                            .build()\n                        )\n                      }\n                    } else {\n                      mapViewportState.transitionToFollowPuckState()\n                    }\n                  }\n                ) {\n                  if ((mapViewportState.mapViewportStatus as? ViewportStatus.State)?.state is FollowPuckViewportState) {\n                    Image(\n                      painter = painterResource(id = android.R.drawable.ic_menu_directions),\n                      contentDescription = \"Overview button\"\n                    )\n                  } else {\n                    Image(\n                      painter = painterResource(id = android.R.drawable.ic_menu_mylocation),\n                      contentDescription = \"Follow puck button\"\n                    )\n                  }\n                }\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  lightPreset = if (lightPreset == LightPresetValue.DAY) {\n                    LightPresetValue.NIGHT\n                  } else {\n                    LightPresetValue.DAY\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle light preset\")\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = mapViewportState,\n            style = {\n              NavigationStyle(routeLine = routeLine, progress = progress, lightPreset = lightPreset)\n            }\n          ) {\n            RecordFrameStats()\n            MapEffect(routeLine) { map ->\n              routeLine?.let {\n                map.location.setLocationProvider(SimulateRouteLocationProvider(it))\n                map.location.enabled = true\n              }\n            }\n            DisposableMapEffect(Unit) { map ->\n              map.location.updateSettings {\n                locationPuck = createDefault2DPuck(withBearing = true)\n                puckBearingEnabled = true\n                puckBearing = PuckBearing.HEADING\n              }\n              val locationListener = OnIndicatorPositionChangedListener { point ->\n                // in SimulateRouteLocationProvider we use altitude field to insert animated progress info.\n                progress = point.altitude()\n              }\n              map.location.addOnIndicatorPositionChangedListener(locationListener)\n              onDispose {\n                map.location.removeOnIndicatorPositionChangedListener(locationListener)\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @MapboxStyleComposable\n  @Composable\n  public fun NavigationStyle(\n    routeLine: LineString?,\n    progress: Double,\n    lightPreset: LightPresetValue\n  ) {\n    val geoJsonSource = rememberGeoJsonSourceState {\n      lineMetrics = BooleanValue(true)\n    }\n    LaunchedEffect(routeLine) {\n      routeLine?.let {\n        geoJsonSource.data = GeoJSONData(it)\n      }\n    }\n    MapboxStandardStyle(\n      topSlot = {\n        if (routeLine != null) {\n          LineLayer(\n            sourceState = geoJsonSource\n          ) {\n            lineTrimOffset = DoubleListValue(listOf(0.0, progress))\n            lineWidth = DoubleValue(\n              interpolate {\n                exponential {\n                  literal(1.5)\n                }\n                zoom()\n                stop {\n                  literal(10)\n                  product(7.0, 1.0)\n                }\n                stop {\n                  literal(14.0)\n                  product(10.5, 1.0)\n                }\n                stop {\n                  literal(16.5)\n                  product(15.5, 1.0)\n                }\n                stop {\n                  literal(19.0)\n                  product(24.0, 1.0)\n                }\n                stop {\n                  literal(22.0)\n                  product(29.0, 1.0)\n                }\n              }\n            )\n            lineCap = LineCapValue.ROUND\n            lineJoin = LineJoinValue.ROUND\n            lineGradient = ColorValue(\n              interpolate {\n                linear()\n                lineProgress()\n                stop {\n                  literal(0)\n                  rgba(47.0, 122.0, 198.0, 1.0)\n                }\n                stop {\n                  literal(1.0)\n                  rgba(47.0, 122.0, 198.0, 1.0)\n                }\n              }\n            )\n          }\n          LineLayer(\n            sourceState = geoJsonSource\n          ) {\n            lineTrimOffset = DoubleListValue(listOf(0.0, progress))\n            lineWidth = DoubleValue(\n              interpolate {\n                exponential {\n                  literal(1.5)\n                }\n                zoom()\n                stop {\n                  literal(4.0)\n                  product(3.0, 1.0)\n                }\n                stop {\n                  literal(10.0)\n                  product(4.0, 1.0)\n                }\n                stop {\n                  literal(13.0)\n                  product(6.0, 1.0)\n                }\n                stop {\n                  literal(16.0)\n                  product(10.0, 1.0)\n                }\n                stop {\n                  literal(19.0)\n                  product(14.0, 1.0)\n                }\n                stop {\n                  literal(22.0)\n                  product(18.0, 1.0)\n                }\n              }\n            )\n            lineCap = LineCapValue.ROUND\n            lineJoin = LineJoinValue.ROUND\n            lineGradient = ColorValue(\n              interpolate {\n                linear()\n                lineProgress()\n                // blue\n                stop { literal(0.0); rgb { literal(6); literal(1); literal(255) } }\n                // royal blue\n                stop { literal(0.1); rgb { literal(59); literal(118); literal(227) } }\n                // cyan\n                stop { literal(0.3); rgb { literal(7); literal(238); literal(251) } }\n                // lime\n                stop { literal(0.5); rgb { literal(0); literal(255); literal(42) } }\n                // yellow\n                stop { literal(0.7); rgb { literal(255); literal(252); literal(0) } }\n                // red\n                stop { literal(1.0); rgb { literal(255); literal(30); literal(0) } }\n              }\n            )\n          }\n        }\n      }\n    ) {\n      this.lightPreset = lightPreset\n    }\n  }\n\n  private companion object {\n    private const val NAVIGATION_ROUTE_JSON_NAME = \"navigation_route.json\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/model/Animated3DModelActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.model\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.runtime.withFrameMillis\nimport androidx.compose.ui.Modifier\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.rememberMapState\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineLayer\nimport com.mapbox.maps.extension.compose.style.layers.generated.ModelLayer\nimport com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.ModelSourceModelsValue\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberGeoJsonSourceState\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberModelSourceState\nimport com.mapbox.maps.extension.compose.style.standard.LightPresetValue\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.match\nimport com.mapbox.maps.extension.style.sources.generated.modelSourceModel\nimport com.mapbox.turf.TurfMeasurement\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport java.net.URL\nimport kotlin.math.PI\nimport kotlin.math.atan2\nimport kotlin.math.max\nimport kotlin.math.min\nimport kotlin.math.sin\n\n/**\n * Showcase animated 3D airplane model following a flight path.\n * Demonstrates continuous animation using feature state to control model parts like propellers,\n * landing gear, and lights.\n */\npublic class Animated3DModelActivity : ComponentActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMapComposeTheme {\n        Animated3DModelScreen()\n      }\n    }\n  }\n}\n\n@OptIn(MapboxDelicateApi::class)\n@Composable\nprivate fun Animated3DModelScreen() {\n  var flightRoute by remember { mutableStateOf<FlightRoute?>(null) }\n  var airplane by remember { mutableStateOf(Airplane()) }\n  var animationPhase by remember { mutableStateOf(0f) }\n  var isStyleLoaded by remember { mutableStateOf(false) }\n\n  val mapState = rememberMapState()\n\n  LaunchedEffect(Unit) {\n    flightRoute = withContext(Dispatchers.IO) {\n      loadFlightRoute(FLIGHT_PATH_JSON_URI)\n    }\n  }\n\n  // Listen for style loaded event\n  LaunchedEffect(Unit) {\n    mapState.styleLoadedEvents.collect {\n      isStyleLoaded = true\n    }\n  }\n\n  val mapViewportState = rememberMapViewportState {\n    setCameraOptions {\n      center(INITIAL_CENTER)\n      zoom(19.0)\n      bearing(0.0)\n      pitch(45.0)\n    }\n  }\n\n  val flightPathSourceState = rememberGeoJsonSourceState(sourceId = FLIGHT_PATH_SOURCE_ID) {\n    data = GeoJSONData(FLIGHT_PATH_JSON_URI)\n  }\n  val modelSourceState = rememberModelSourceState(sourceId = MODEL_SOURCE_ID)\n\n  ExampleScaffold {\n    MapboxMap(\n      modifier = Modifier.fillMaxSize(),\n      mapViewportState = mapViewportState,\n      mapState = mapState,\n      style = {\n        MapboxStandardStyle(\n          standardStyleState = rememberStandardStyleState {\n            configurationsState.apply {\n              lightPreset = LightPresetValue(\"dusk\")\n              showPointOfInterestLabels = BooleanValue(false)\n              showRoadLabels = BooleanValue(false)\n            }\n          }\n        )\n      }\n    ) {\n      // Flight path line layer\n      LineLayer(flightPathSourceState, FLIGHT_PATH_LAYER_ID) {\n        lineColor = ColorValue(androidx.compose.ui.graphics.Color(0xFF007CBF))\n        lineWidth = DoubleValue(8.0)\n        lineEmissiveStrength = DoubleValue(1.0)\n        lineCap = LineCapValue.ROUND\n        lineJoin = LineJoinValue.ROUND\n      }\n\n      modelSourceState.models = ModelSourceModelsValue(\n        hashMapOf(\n          PLANE_MODEL_KEY to modelSourceModel(PLANE_MODEL_KEY) {\n            uri(AIRPLANE_MODEL_URI)\n            position(listOf(airplane.position[0], airplane.position[1]))\n            orientation(listOf(airplane.roll, airplane.pitch, airplane.bearing + 90.0))\n            materialOverrideNames(MATERIAL_OVERRIDE_NAMES)\n            nodeOverrideNames(NODE_OVERRIDE_NAMES)\n          }\n        )\n      )\n\n      // Airplane model layer\n      ModelLayer(modelSourceState, MODEL_LAYER_ID) {\n        modelType = ModelTypeValue.LOCATION_INDICATOR\n\n        // Altitude from feature state - build expression manually\n        modelTranslation = DoubleListValue(\n          Value.valueOf(\n            listOf(\n              Value.valueOf(0.0),\n              Value.valueOf(0.0),\n              Value.valueOf(\n                listOf(\n                  Value.valueOf(\"feature-state\"),\n                  Value.valueOf(\"z-elevation\")\n                )\n              )\n            )\n          )\n        )\n\n        // Scale model based on zoom to maintain constant viewport size\n        modelScale = DoubleListValue(\n          Value.valueOf(\n            listOf(\n              Value.valueOf(\"interpolate\"),\n              Value.valueOf(listOf(Value.valueOf(\"exponential\"), Value.valueOf(0.5))),\n              Value.valueOf(listOf(Value.valueOf(\"zoom\"))),\n              Value.valueOf(2.0),\n              Value.valueOf(listOf(Value.valueOf(40000.0), Value.valueOf(40000.0), Value.valueOf(40000.0))),\n              Value.valueOf(16.0),\n              Value.valueOf(listOf(Value.valueOf(1.0), Value.valueOf(1.0), Value.valueOf(1.0)))\n            )\n          )\n        )\n\n        // Model rotation for animated parts\n        modelRotation = DoubleListValue(\n          match {\n            get { literal(\"part\") }\n            // Gears\n            literal(\"front_gear\")\n            featureState { literal(\"front-gear-rotation\") }\n            literal(\"rear_gears\")\n            featureState { literal(\"rear-gear-rotation\") }\n            // Propellers\n            literal(\"propeller_left_outer\")\n            featureState { literal(\"propeller-rotation\") }\n            literal(\"propeller_left_inner\")\n            featureState { literal(\"propeller-rotation\") }\n            literal(\"propeller_right_outer\")\n            featureState { literal(\"propeller-rotation\") }\n            literal(\"propeller_right_inner\")\n            featureState { literal(\"propeller-rotation\") }\n            // Blurred propellers\n            literal(\"propeller_left_outer_blur\")\n            featureState { literal(\"propeller-rotation-blur\") }\n            literal(\"propeller_left_inner_blur\")\n            featureState { literal(\"propeller-rotation-blur\") }\n            literal(\"propeller_right_outer_blur\")\n            featureState { literal(\"propeller-rotation-blur\") }\n            literal(\"propeller_right_inner_blur\")\n            featureState { literal(\"propeller-rotation-blur\") }\n            literal(listOf(0.0, 0.0, 0.0))\n          }\n        )\n\n        // Emissive strength for lights\n        modelEmissiveStrength = DoubleValue(\n          match {\n            get { literal(\"part\") }\n            literal(\"lights_position_white\")\n            featureState { literal(\"light-emission-strobe\") }\n            literal(\"lights_position_white_volume\")\n            featureState { literal(\"light-emission-strobe\") }\n            literal(\"lights_anti_collision_red\")\n            featureState { literal(\"light-emission-strobe\") }\n            literal(\"lights_anti_collision_red_volume\")\n            featureState { literal(\"light-emission-strobe\") }\n            literal(\"lights_position_red\")\n            featureState { literal(\"light-emission\") }\n            literal(\"lights_position_red_volume\")\n            featureState { literal(\"light-emission\") }\n            literal(\"lights_position_green\")\n            featureState { literal(\"light-emission\") }\n            literal(\"lights_position_green_volume\")\n            featureState { literal(\"light-emission\") }\n            literal(\"lights_taxi_white\")\n            featureState { literal(\"light-emission-taxi\") }\n            literal(\"lights_taxi_white_volume\")\n            featureState { literal(\"light-emission-taxi\") }\n            literal(0.0)\n          }\n        )\n\n        // Opacity for light volumes and propeller blur\n        modelOpacity = DoubleValue(\n          match {\n            get { literal(\"part\") }\n            literal(\"lights_position_white_volume\")\n            product {\n              featureState { literal(\"light-emission-strobe\") }\n              literal(0.25)\n            }\n            literal(\"lights_anti_collision_red_volume\")\n            product {\n              featureState { literal(\"light-emission-strobe\") }\n              literal(0.45)\n            }\n            literal(\"lights_position_green_volume\")\n            product {\n              featureState { literal(\"light-emission\") }\n              literal(0.25)\n            }\n            literal(\"lights_position_red_volume\")\n            product {\n              featureState { literal(\"light-emission\") }\n              literal(0.25)\n            }\n            literal(\"lights_taxi_white\")\n            product {\n              featureState { literal(\"light-emission-taxi\") }\n              literal(0.25)\n            }\n            literal(\"lights_taxi_white_volume\")\n            product {\n              featureState { literal(\"light-emission-taxi\") }\n              literal(0.25)\n            }\n            literal(\"propeller_blur\")\n            literal(0.2)\n            literal(1.0)\n          }\n        )\n      }\n      // Animation loop - waits for both route and style to be loaded\n      LaunchedEffect(flightRoute, isStyleLoaded) {\n        val route = flightRoute ?: return@LaunchedEffect\n        if (!isStyleLoaded) return@LaunchedEffect\n\n        var lastFrameTime = 0L\n        var routeElevation = 0.0\n\n        while (true) {\n          withFrameMillis { frameTime ->\n            if (lastFrameTime == 0L) lastFrameTime = frameTime\n\n            val frameDeltaTime = frameTime - lastFrameTime\n            val animFade = clamp(\n              (routeElevation - FLIGHT_TRAVEL_ALTITUDE_MIN) /\n                (FLIGHT_TRAVEL_ALTITUDE_MAX - FLIGHT_TRAVEL_ALTITUDE_MIN)\n            )\n\n            val timelapseFactor = mix(0.001, 10.0, animFade * animFade)\n            animationPhase += ((frameDeltaTime * timelapseFactor) / ANIMATION_DURATION).toFloat()\n            lastFrameTime = frameTime\n\n            if (animationPhase > 1f) {\n              animationPhase = 0f\n              routeElevation = 0.0\n            }\n\n            route.sample(route.totalLength * animationPhase)?.let { target ->\n              routeElevation = target.altitude\n              airplane = airplane.update(target, frameDeltaTime.toDouble())\n            }\n          }\n        }\n      }\n\n      // Update camera, model source and feature state\n      MapEffect(airplane) { mapView ->\n        val animFade = clamp(\n          (airplane.altitude - FLIGHT_TRAVEL_ALTITUDE_MIN) /\n            (FLIGHT_TRAVEL_ALTITUDE_MAX - FLIGHT_TRAVEL_ALTITUDE_MIN)\n        )\n\n        // Then update camera to follow airplane using free camera API\n        val cameraOffsetLng = mix(-0.003, 0.0, airplane.altitude / 200.0)\n        val cameraOffsetLat = mix(0.003, 0.0, airplane.altitude / 200.0)\n        val cameraAltitude = airplane.altitude + 150.0 + mix(0.0, 10000000.0, animFade)\n\n        val camera = mapView.mapboxMap.getFreeCameraOptions()\n\n        // Set the position and altitude of the camera\n        camera.setLocation(\n          Point.fromLngLat(\n            airplane.position[0] + cameraOffsetLng,\n            airplane.position[1] + cameraOffsetLat\n          ),\n          cameraAltitude\n        )\n\n        // Tell the camera to look at the airplane position\n        camera.lookAtPoint(\n          Point.fromLngLat(airplane.position[0], airplane.position[1]),\n          airplane.altitude\n        )\n\n        mapView.mapboxMap.setCamera(camera)\n\n        // Update feature state\n        val featureState = hashMapOf(\n          \"z-elevation\" to Value.valueOf(airplane.altitude),\n          \"front-gear-rotation\" to Value.valueOf(\n            listOf(Value.valueOf(0.0), Value.valueOf(0.0), Value.valueOf(airplane.frontGearRotation))\n          ),\n          \"rear-gear-rotation\" to Value.valueOf(\n            listOf(Value.valueOf(0.0), Value.valueOf(0.0), Value.valueOf(airplane.rearGearRotation))\n          ),\n          \"propeller-rotation\" to Value.valueOf(\n            listOf(\n              Value.valueOf(0.0),\n              Value.valueOf(0.0),\n              Value.valueOf(-(airplane.animTimeS % 0.5) * 2.0 * 360.0)\n            )\n          ),\n          \"propeller-rotation-blur\" to Value.valueOf(\n            listOf(\n              Value.valueOf(0.0),\n              Value.valueOf(0.0),\n              Value.valueOf((airplane.animTimeS % 0.1) * 10.0 * 360.0)\n            )\n          ),\n          \"light-emission\" to Value.valueOf(airplane.lightPhase),\n          \"light-emission-strobe\" to Value.valueOf(airplane.lightPhaseStrobe),\n          \"light-emission-taxi\" to Value.valueOf(airplane.lightTaxiPhase)\n        )\n\n        mapView.mapboxMap.setFeatureState(MODEL_SOURCE_ID, PLANE_MODEL_KEY, Value.valueOf(featureState)) { result ->\n          result.error?.let { error ->\n            android.util.Log.e(\"3DModel\", \"Failed to set feature state: $error\")\n          }\n        }\n      }\n    }\n  }\n}\n\n// Data class to hold sampled route point\nprivate data class RoutePoint(\n  val position: List<Double>,\n  val altitude: Double,\n  val bearing: Double,\n  val pitch: Double\n)\n\n// FlightRoute class handles loading and sampling flight path data\nprivate class FlightRoute(\n  private val coordinates: List<Point>,\n  private val elevationData: List<Double>,\n  private val distances: List<Double>,\n  val maxElevation: Double\n) {\n  val totalLength: Double\n    get() = distances.lastOrNull() ?: 0.0\n\n  fun sample(currentDistance: Double): RoutePoint? {\n    if (distances.isEmpty()) return null\n\n    var segmentIndex = distances.indexOfFirst { it >= currentDistance } - 1\n    if (segmentIndex < 0) segmentIndex = 0\n    if (segmentIndex >= coordinates.size - 1) segmentIndex = coordinates.size - 2\n\n    val p1 = coordinates[segmentIndex]\n    val p2 = coordinates[segmentIndex + 1]\n    val segmentLength = distances[segmentIndex + 1] - distances[segmentIndex]\n    val segmentRatio = (currentDistance - distances[segmentIndex]) / segmentLength\n\n    val e1 = elevationData[segmentIndex]\n    val e2 = elevationData[segmentIndex + 1]\n    val bearing = TurfMeasurement.bearing(p1, p2)\n    val altitude = e1 + (e2 - e1) * segmentRatio\n    val pitch = rad2deg(atan2(e2 - e1, segmentLength))\n\n    return RoutePoint(\n      position = listOf(\n        p1.longitude() + (p2.longitude() - p1.longitude()) * segmentRatio,\n        p1.latitude() + (p2.latitude() - p1.latitude()) * segmentRatio\n      ),\n      altitude = altitude,\n      bearing = bearing,\n      pitch = pitch\n    )\n  }\n}\n\n// Airplane state\nprivate data class Airplane(\n  val position: List<Double> = listOf(INITIAL_CENTER.longitude(), INITIAL_CENTER.latitude()),\n  val altitude: Double = 0.0,\n  val bearing: Double = 0.0,\n  val pitch: Double = 0.0,\n  val roll: Double = 0.0,\n  val rearGearRotation: Double = 0.0,\n  val frontGearRotation: Double = 0.0,\n  val lightPhase: Double = 0.0,\n  val lightPhaseStrobe: Double = 0.0,\n  val lightTaxiPhase: Double = 0.0,\n  val animTimeS: Double = 0.0\n) {\n  fun update(target: RoutePoint, dtimeMs: Double): Airplane {\n    val newAnimTimeS = animTimeS + dtimeMs / 1000.0\n    return copy(\n      position = listOf(\n        mix(position[0], target.position[0], dtimeMs * 0.05),\n        mix(position[1], target.position[1], dtimeMs * 0.05)\n      ),\n      altitude = mix(altitude, target.altitude, dtimeMs * 0.05),\n      bearing = mix(bearing, target.bearing, dtimeMs * 0.01),\n      pitch = mix(pitch, target.pitch, dtimeMs * 0.01),\n      frontGearRotation = mix(0.0, 90.0, altitude / 50.0),\n      rearGearRotation = mix(0.0, -90.0, altitude / 50.0),\n      lightPhase = animSinPhaseFromTime(newAnimTimeS, 2.0) * 0.25 + 0.75,\n      lightPhaseStrobe = animSinPhaseFromTime(newAnimTimeS, 1.0),\n      lightTaxiPhase = mix(1.0, 0.0, altitude / 100.0),\n      roll = rad2deg(mix(0.0, sin(newAnimTimeS * PI * 0.2) * 0.1, (altitude - 50.0) / 100.0)),\n      animTimeS = newAnimTimeS\n    )\n  }\n}\n\n// Helper functions\nprivate fun clamp(v: Double): Double = max(0.0, min(v, 1.0))\n\nprivate fun mix(a: Double, b: Double, mixFactor: Double): Double {\n  val f = clamp(mixFactor)\n  return a * (1 - f) + b * f\n}\n\nprivate fun rad2deg(angRad: Double): Double = (angRad * 180.0) / PI\n\nprivate fun animSinPhaseFromTime(animTimeS: Double, phaseLen: Double): Double {\n  return sin(((animTimeS % phaseLen) / phaseLen) * PI * 2.0) * 0.5 + 0.5\n}\n\nprivate fun loadFlightRoute(url: String): FlightRoute {\n  val json = URL(url).readText()\n  val featureCollection = com.mapbox.geojson.FeatureCollection.fromJson(json)\n  val targetRouteFeature = featureCollection.features()?.firstOrNull()\n    ?: throw IllegalStateException(\"No features in flight path data\")\n\n  val geometry = targetRouteFeature.geometry() as? LineString\n    ?: throw IllegalStateException(\"Expected LineString geometry\")\n\n  val coordinates = geometry.coordinates()\n  val elevationData = targetRouteFeature.getProperty(\"elevation\")\n    .asJsonArray\n    .map { it.asDouble }\n\n  if (elevationData.size != coordinates.size) {\n    throw IllegalStateException(\"Number of elevation samples does not match coordinate data length\")\n  }\n\n  val distances = mutableListOf(0.0)\n  var maxElevation = elevationData[0]\n\n  for (i in 1 until coordinates.size) {\n    val segmentDistance = TurfMeasurement.distance(\n      coordinates[i - 1],\n      coordinates[i],\n      com.mapbox.turf.TurfConstants.UNIT_KILOMETERS\n    ) * 1000.0\n    distances.add(distances[i - 1] + segmentDistance)\n    maxElevation = max(maxElevation, elevationData[i])\n  }\n\n  return FlightRoute(coordinates, elevationData, distances, maxElevation)\n}\n\nprivate const val FLIGHT_PATH_JSON_URI = \"https://docs.mapbox.com/mapbox-gl-js/assets/flightpath.json\"\nprivate const val AIRPLANE_MODEL_URI = \"https://docs.mapbox.com/mapbox-gl-js/assets/airplane.glb\"\nprivate const val FLIGHT_PATH_SOURCE_ID = \"flightpath\"\nprivate const val MODEL_SOURCE_ID = \"3d-model-source\"\nprivate const val PLANE_MODEL_KEY = \"plane\"\nprivate const val FLIGHT_PATH_LAYER_ID = \"flight-path-line\"\nprivate const val MODEL_LAYER_ID = \"3d-model-layer\"\n\nprivate val INITIAL_CENTER = Point.fromLngLat(-122.37204647633236, 37.619836883832306)\n\nprivate const val ANIMATION_DURATION = 50000f\nprivate const val FLIGHT_TRAVEL_ALTITUDE_MIN = 200.0\nprivate const val FLIGHT_TRAVEL_ALTITUDE_MAX = 3000.0\n\nprivate val MATERIAL_OVERRIDE_NAMES = listOf(\n  \"propeller_blur\",\n  \"lights_position_white\",\n  \"lights_position_white_volume\",\n  \"lights_position_red\",\n  \"lights_position_red_volume\",\n  \"lights_position_green\",\n  \"lights_position_green_volume\",\n  \"lights_anti_collision_red\",\n  \"lights_anti_collision_red_volume\",\n  \"lights_taxi_white\",\n  \"lights_taxi_white_volume\"\n)\n\nprivate val NODE_OVERRIDE_NAMES = listOf(\n  \"front_gear\",\n  \"rear_gears\",\n  \"propeller_left_inner\",\n  \"propeller_left_outer\",\n  \"propeller_right_inner\",\n  \"propeller_right_outer\",\n  \"propeller_left_inner_blur\",\n  \"propeller_left_outer_blur\",\n  \"propeller_right_inner_blur\",\n  \"propeller_right_outer_blur\"\n)"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/model/Interactive3DModelFeatureStateActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.model\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.Card\nimport androidx.compose.material.Slider\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.ModelLayer\nimport com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue\nimport com.mapbox.maps.extension.compose.style.lights.LightsState\nimport com.mapbox.maps.extension.compose.style.lights.generated.rememberAmbientLightState\nimport com.mapbox.maps.extension.compose.style.lights.generated.rememberDirectionalLightState\nimport com.mapbox.maps.extension.compose.style.sources.ModelSourceModelsValue\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberModelSourceState\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.match\nimport com.mapbox.maps.extension.style.sources.generated.modelSourceModel\n\n/**\n * Showcase interactive 3D model with feature-state driven updates.\n * Demonstrates using expressions and feature state to control model materials and nodes.\n */\npublic class Interactive3DModelFeatureStateActivity : ComponentActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMapComposeTheme {\n        Interactive3DModelFeatureStateScreen()\n      }\n    }\n  }\n}\n\n@Composable\nprivate fun Interactive3DModelFeatureStateScreen() {\n  // Vehicle parameters\n  var doorsFrontLeft by remember { mutableStateOf(0.5f) }\n  var doorsFrontRight by remember { mutableStateOf(0f) }\n  var trunk by remember { mutableStateOf(0f) }\n  var hood by remember { mutableStateOf(0f) }\n  var brakeLights by remember { mutableStateOf(0f) }\n  var vehicleColor by remember { mutableStateOf(Color.WHITE) }\n  var showColorDialog by remember { mutableStateOf(false) }\n\n  val mapViewportState = rememberMapViewportState {\n    setCameraOptions {\n      center(CAR_POSITION)\n      zoom(19.4)\n      bearing(35.0)\n      pitch(60.0)\n      padding(EdgeInsets(0.0, 0.0, 600.0, 0.0))\n    }\n  }\n\n  val model = modelSourceModel(CAR_MODEL_URI) {\n    uri(CAR_MODEL_URI)\n    position(listOf(CAR_POSITION.longitude(), CAR_POSITION.latitude()))\n    orientation(listOf(0.0, 0.0, 0.0))\n    materialOverrideNames(\n      listOf(\n        \"body\",\n        \"lights_brakes\",\n        \"lights-brakes_reverse\",\n        \"lights_brakes_volume\",\n        \"lights-brakes_reverse_volume\"\n      )\n    )\n    nodeOverrideNames(\n      listOf(\n        \"doors_front-left\",\n        \"doors_front-right\",\n        \"hood\",\n        \"trunk\"\n      )\n    )\n  }\n\n  val modelSourceState = rememberModelSourceState(sourceId = SOURCE_ID) {\n    models = ModelSourceModelsValue(hashMapOf(CAR_MODEL_KEY to model))\n  }\n\n  val ambientLightState = rememberAmbientLightState(\"environment\") {\n    intensity = DoubleValue(0.4)\n  }\n  val directionalLightState = rememberDirectionalLightState(\"sun_light\") {\n    castShadows = BooleanValue(true)\n  }\n\n  ExampleScaffold {\n    Box(Modifier.fillMaxSize()) {\n      MapboxMap(\n        modifier = Modifier.fillMaxSize(),\n        mapViewportState = mapViewportState,\n        style = {\n          MapboxStandardStyle(\n            standardStyleState = rememberStandardStyleState {\n                configurationsState.apply {\n                  lightsState = LightsState(directionalLightState, ambientLightState)\n                  show3dObjects = BooleanValue(false)\n                }\n            },\n          )\n        }\n      ) {\n\n        ModelLayer(modelSourceState, LAYER_ID) {\n          modelScale = DoubleListValue(listOf(10.0, 10.0, 10.0))\n          modelType = ModelTypeValue.LOCATION_INDICATOR\n\n          modelColor = ColorValue(\n            match {\n              get { literal(\"part\") }\n              literal(\"lights_brakes\")\n              featureState { literal(\"brake-light-color\") }\n              literal(\"lights-brakes_reverse\")\n              featureState { literal(\"brake-light-color\") }\n              literal(\"lights_brakes_volume\")\n              featureState { literal(\"brake-light-color\") }\n              literal(\"lights-brakes_reverse_volume\")\n              featureState { literal(\"brake-light-color\") }\n              featureState { literal(\"vehicle-color\") }\n            }\n          )\n          modelColorMixIntensity = DoubleValue(\n            match {\n              get { literal(\"part\") }\n              literal(\"body\")\n              literal(1.0)\n              literal(\"lights_brakes\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(\"lights-brakes_reverse\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(\"lights_brakes_volume\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(\"lights-brakes_reverse_volume\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(0.0)\n            }\n          )\n          modelEmissiveStrength = DoubleValue(\n            match {\n              get { literal(\"part\") }\n              literal(\"lights_brakes\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(\"lights_brakes_volume\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(\"lights-brakes_reverse\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(\"lights-brakes_reverse_volume\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(0.0)\n            }\n          )\n          modelOpacity = DoubleValue(\n            match {\n              get { literal(\"part\") }\n              literal(\"lights_brakes_volume\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(\"lights-brakes_reverse_volume\")\n              featureState { literal(\"brake-light-emission\") }\n              literal(1.0)\n            }\n          )\n          modelRotation = DoubleListValue(\n            match {\n              get { literal(\"part\") }\n              literal(\"doors_front-left\")\n              featureState { literal(\"doors-front-left\") }\n              literal(\"doors_front-right\")\n              featureState { literal(\"doors-front-right\") }\n              literal(\"hood\")\n              featureState { literal(\"hood\") }\n              literal(\"trunk\")\n              featureState { literal(\"trunk\") }\n              literal(listOf(0.0, 0.0, 0.0))\n            }\n          )\n        }\n\n        // Granular feature state updates - each property updates independently\n        // setFeatureState merges the provided state with existing state, so we only need to update changed properties\n        val doorOpeningDegMax = 80.0\n        val mix = { t: Double, a: Double, b: Double -> b * t - a * (t - 1) }\n\n        // Centralized callback handler for feature state updates\n        val onFeatureStateResult: (expected: Expected<String, None>) -> Unit = { result ->\n          result.error?.let { error ->\n            android.util.Log.e(\"3DModel\", \"Failed to set feature state: $error\")\n          }\n        }\n\n        // Update vehicle color\n        MapEffect(vehicleColor) { mapView ->\n          val r = Color.red(vehicleColor)\n          val g = Color.green(vehicleColor)\n          val b = Color.blue(vehicleColor)\n          mapView.mapboxMap.setFeatureState(\n            SOURCE_ID,\n            null,\n            CAR_MODEL_KEY,\n            Value.valueOf(hashMapOf(\"vehicle-color\" to Value.valueOf(\"rgba($r, $g, $b, 1)\"))),\n            onFeatureStateResult\n          )\n        }\n\n        // Update brake lights\n        MapEffect(brakeLights) { mapView ->\n          mapView.mapboxMap.setFeatureState(\n            SOURCE_ID,\n            null,\n            CAR_MODEL_KEY,\n            Value.valueOf(hashMapOf(\"brake-light-emission\" to Value.valueOf(brakeLights.toDouble()))),\n            onFeatureStateResult\n          )\n        }\n\n        // Update left door\n        MapEffect(doorsFrontLeft) { mapView ->\n          mapView.mapboxMap.setFeatureState(\n            SOURCE_ID,\n            null,\n            CAR_MODEL_KEY,\n            Value.valueOf(\n              hashMapOf(\n                \"doors-front-left\" to Value.valueOf(\n                  listOf(\n                    Value.valueOf(0.0),\n                    Value.valueOf(mix(doorsFrontLeft.toDouble(), 0.0, -doorOpeningDegMax)),\n                    Value.valueOf(0.0)\n                  )\n                )\n              )\n            ),\n            onFeatureStateResult\n          )\n        }\n\n        // Update right door\n        MapEffect(doorsFrontRight) { mapView ->\n          mapView.mapboxMap.setFeatureState(\n            SOURCE_ID,\n            null,\n            CAR_MODEL_KEY,\n            Value.valueOf(\n              hashMapOf(\n                \"doors-front-right\" to Value.valueOf(\n                  listOf(\n                    Value.valueOf(0.0),\n                    Value.valueOf(mix(doorsFrontRight.toDouble(), 0.0, doorOpeningDegMax)),\n                    Value.valueOf(0.0)\n                  )\n                )\n              )\n            ),\n            onFeatureStateResult\n          )\n        }\n\n        // Update hood\n        MapEffect(hood) { mapView ->\n          mapView.mapboxMap.setFeatureState(\n            SOURCE_ID,\n            null,\n            CAR_MODEL_KEY,\n            Value.valueOf(\n              hashMapOf(\n                \"hood\" to Value.valueOf(\n                  listOf(\n                    Value.valueOf(mix(hood.toDouble(), 0.0, 45.0)),\n                    Value.valueOf(0.0),\n                    Value.valueOf(0.0)\n                  )\n                )\n              )\n            ),\n            onFeatureStateResult\n          )\n        }\n\n        // Update trunk\n        MapEffect(trunk) { mapView ->\n          mapView.mapboxMap.setFeatureState(\n            SOURCE_ID,\n            null,\n            CAR_MODEL_KEY,\n            Value.valueOf(\n              hashMapOf(\n                \"trunk\" to Value.valueOf(\n                  listOf(\n                    Value.valueOf(mix(trunk.toDouble(), 0.0, -60.0)),\n                    Value.valueOf(0.0),\n                    Value.valueOf(0.0)\n                  )\n                )\n              )\n            ),\n            onFeatureStateResult\n          )\n        }\n\n        // Initialize brake light color once (constant value)\n        MapEffect(Unit) { mapView ->\n          mapView.mapboxMap.setFeatureState(\n            SOURCE_ID,\n            null,\n            CAR_MODEL_KEY,\n            Value.valueOf(hashMapOf(\"brake-light-color\" to Value.valueOf(\"rgba(225, 0, 0, 1)\"))),\n            onFeatureStateResult\n          )\n        }\n      }\n\n      // Control panel at bottom\n      Card(\n        modifier = Modifier\n          .align(Alignment.BottomCenter)\n          .fillMaxWidth()\n          .padding(16.dp),\n        shape = RoundedCornerShape(12.dp),\n        elevation = 4.dp\n      ) {\n        Column(\n          modifier = Modifier.padding(16.dp),\n          verticalArrangement = Arrangement.spacedBy(8.dp)\n        ) {\n          // Color picker\n          Row(\n            modifier = Modifier.fillMaxWidth(),\n            horizontalArrangement = Arrangement.SpaceBetween,\n            verticalAlignment = Alignment.CenterVertically\n          ) {\n            Text(\"Vehicle color\", fontSize = 14.sp)\n            Box(\n              modifier = Modifier\n                .size(40.dp)\n                .background(\n                  androidx.compose.ui.graphics.Color(vehicleColor),\n                  RoundedCornerShape(8.dp)\n                )\n                .border(\n                  2.dp,\n                  androidx.compose.ui.graphics.Color.Gray,\n                  RoundedCornerShape(8.dp)\n                )\n                .clickable {\n                  showColorDialog = true\n                }\n            )\n          }\n\n          // Trunk\n          SliderControl(\"Trunk\", trunk) { trunk = it }\n\n          // Hood\n          SliderControl(\"Hood\", hood) { hood = it }\n\n          // Left door\n          SliderControl(\"Left door\", doorsFrontLeft) { doorsFrontLeft = it }\n\n          // Right door\n          SliderControl(\"Right door\", doorsFrontRight) { doorsFrontRight = it }\n\n          // Brake lights\n          SliderControl(\"Brake lights\", brakeLights) { brakeLights = it }\n        }\n      }\n\n      // Color picker dialog (simplified)\n      if (showColorDialog) {\n        ColorPickerDialog(\n          onColorSelected = { color ->\n            vehicleColor = color\n            showColorDialog = false\n          },\n          onDismiss = { showColorDialog = false }\n        )\n      }\n    }\n  }\n}\n\n@Composable\nprivate fun SliderControl(\n  label: String,\n  value: Float,\n  onValueChange: (Float) -> Unit\n) {\n  Row(\n    modifier = Modifier.fillMaxWidth(),\n    horizontalArrangement = Arrangement.spacedBy(8.dp),\n    verticalAlignment = Alignment.CenterVertically\n  ) {\n    Text(\n      text = label,\n      fontSize = 12.sp,\n      modifier = Modifier.size(80.dp, 24.dp)\n    )\n    Slider(\n      value = value,\n      onValueChange = onValueChange,\n      modifier = Modifier.weight(1f)\n    )\n  }\n}\n\n@Composable\nprivate fun ColorPickerDialog(\n  onColorSelected: (Int) -> Unit,\n  onDismiss: () -> Unit\n) {\n  val colors = listOf(\n    Color.WHITE to \"White\",\n    Color.BLACK to \"Black\",\n    Color.RED to \"Red\",\n    Color.rgb(0, 100, 200) to \"Blue\",\n    Color.rgb(0, 150, 0) to \"Green\",\n    Color.YELLOW to \"Yellow\",\n    Color.rgb(150, 75, 0) to \"Brown\",\n    Color.GRAY to \"Gray\"\n  )\n\n  androidx.compose.material.AlertDialog(\n    onDismissRequest = onDismiss,\n    title = { Text(\"Vehicle Color\") },\n    buttons = {\n      Column {\n        colors.forEach { (color, name) ->\n          Text(\n            text = name,\n            modifier = Modifier\n              .fillMaxWidth()\n              .clickable { onColorSelected(color) }\n              .padding(16.dp)\n          )\n        }\n      }\n    }\n  )\n}\n\nprivate const val SOURCE_ID = \"3d-model-source\"\nprivate const val LAYER_ID = \"3d-model-layer\"\nprivate const val CAR_MODEL_KEY = \"car\"\nprivate const val CAR_MODEL_URI = \"https://docs.mapbox.com/mapbox-gl-js/assets/ego_car.glb\"\nprivate val CAR_POSITION: Point = Point.fromLngLat(-74.0135, 40.7153)"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/ornaments/CustomAttributionActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.ornaments\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.wrapContentHeight\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.AlertDialog\nimport androidx.compose.material.Button\nimport androidx.compose.material.Divider\nimport androidx.compose.material.ExperimentalMaterialApi\nimport androidx.compose.material.FabPosition\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.ModalBottomSheetLayout\nimport androidx.compose.material.ModalBottomSheetValue\nimport androidx.compose.material.Text\nimport androidx.compose.material.primarySurface\nimport androidx.compose.material.rememberModalBottomSheetState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Alignment.Companion.CenterHorizontally\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalUriHandler\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.annotation.MapboxDelicateApi\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringListValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.RasterLayer\nimport com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberRasterSourceState\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardSatelliteStyle\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.plugin.attribution.Attribution\nimport com.mapbox.maps.plugin.attribution.isMapboxFeedback\nimport kotlinx.coroutines.launch\n\n/**\n * Example Activity to showcase custom UI for map attributions using Jetpack Compose.\n *\n * This activity demonstrates how to:\n * - Implement a custom attribution display using a modal bottom sheet\n * - Handle user consent dialogs for telemetry and geofencing\n * - Customize the appearance and behavior of attribution controls\n * - Integrate with MapboxMap's attribution system\n */\n@MapboxExperimental\npublic class CustomAttributionActivity : ComponentActivity() {\n\n    @OptIn(ExperimentalMaterialApi::class, MapboxDelicateApi::class)\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContent {\n            val sheetState = rememberModalBottomSheetState(\n                initialValue = ModalBottomSheetValue.Hidden\n            )\n            var showSatelliteStyle: Boolean by remember {\n                mutableStateOf(false)\n            }\n            var showOSMLayer: Boolean by remember {\n                mutableStateOf(false)\n            }\n            val coroutineScope = rememberCoroutineScope()\n\n            var userConsentState: MapAttributionScope.UserConsentState? by remember {\n                mutableStateOf(null)\n            }\n            val currentAttributionState = remember {\n                MapAttributionScope.AttributionState()\n            }\n\n            MapboxMapComposeTheme {\n                ExampleScaffold(\n                    floatingActionButton = {\n                        Column(\n                            verticalArrangement = Arrangement.Top,\n                            horizontalAlignment = Alignment.End\n                        ) {\n                            FloatingActionButton(\n                                modifier = Modifier\n                                    .padding(bottom = 10.dp),\n                                onClick = {\n                                    coroutineScope.launch {\n                                        if (!sheetState.isVisible) {\n                                            sheetState.show()\n                                        } else {\n                                            sheetState.hide()\n                                        }\n                                    }\n                                },\n                                shape = RoundedCornerShape(16.dp),\n                            ) {\n                                Text(\n                                    modifier = Modifier.padding(10.dp),\n                                    text = if (!sheetState.isVisible) \"Show Attribution\" else \"Hide Attribution\"\n                                )\n                            }\n                            FloatingActionButton(\n                                modifier = Modifier\n                                    .padding(bottom = 10.dp),\n                                onClick = {\n                                    showSatelliteStyle = !showSatelliteStyle\n                                },\n                                shape = RoundedCornerShape(16.dp),\n                            ) {\n                                Text(\n                                    modifier = Modifier.padding(10.dp),\n                                    text = if (showSatelliteStyle) \"Show Satellite Style\" else \"Show Standard Style\"\n                                )\n                            }\n                            FloatingActionButton(\n                                modifier = Modifier\n                                    .padding(bottom = 10.dp),\n                                onClick = {\n                                    showOSMLayer = !showOSMLayer\n                                },\n                                shape = RoundedCornerShape(16.dp),\n                            ) {\n                                Text(\n                                    modifier = Modifier.padding(10.dp),\n                                    text = if (!showOSMLayer) \"Show OSM layer\" else \"Hide OSM layer\"\n                                )\n                            }\n                        }\n                    },\n                    floatingActionButtonPosition = FabPosition.End\n                ) { scaffoldPadding ->\n                    ModalBottomSheetLayout(\n                        sheetContent = {\n                            CustomAttributionBottomSheetContent(currentAttributionState) {\n                                userConsentState = it\n                            }\n                        },\n                        sheetState = sheetState,\n                    ) {\n\n                        MapboxMap(\n                            modifier = Modifier.fillMaxSize(),\n                            attribution = {\n                                // Keep original built-in attribution control UI\n                                Attribution()\n                                // Add custom attribution control through [AttributionControl] and [AttributionState].\n                                AttributionControl(\n                                    userConsentState = userConsentState,\n                                    attributionState = currentAttributionState\n                                )\n                            },\n                            mapViewportState = rememberMapViewportState {\n                                setCameraOptions {\n                                    zoom(ZOOM)\n                                    center(CityLocations.HELSINKI)\n                                }\n                            },\n                            style = {\n                                if (showSatelliteStyle) {\n                                    MapboxStandardSatelliteStyle()\n                                } else {\n                                    MapboxStandardStyle()\n                                }\n                            }\n                        ) {\n                            if (showOSMLayer) {\n                                val source = rememberRasterSourceState {\n                                    tileSize = LongValue(RASTER_TILE_SIZE_PIXELS)\n                                    tiles = StringListValue(listOf(OSM_RASTER_TILE_URL))\n                                    attribution = StringValue(TILE_JSON_ATTRIBUTION)\n                                    scheme = SchemeValue.XYZ\n                                    minZoom = LongValue(TILE_JSON_MIN_ZOOM)\n                                    maxZoom = LongValue(TILE_JSON_MAX_ZOOM)\n                                    bounds = DoubleListValue(MERCATOR_BOUNDS)\n                                }\n                                RasterLayer(source) {\n                                    rasterOpacity = DoubleValue(0.7)\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Composable function that renders the content of the attribution bottom sheet.\n     *\n     * This function displays:\n     * - A title for the custom attribution interface\n     * - A list of attribution buttons for each attribution source\n     * - User consent dialogs for telemetry and geofencing when triggered\n     *\n     * @param attributionState The current attribution state containing available attributions\n     * and user consent information.\n     * @param onUserConsentStateChanged Callback invoked when user consent state changes,\n     * passing the updated consent state to the parent component.\n     */\n    @OptIn(ExperimentalMaterialApi::class)\n    @Composable\n    public fun CustomAttributionBottomSheetContent(\n        attributionState: MapAttributionScope.AttributionState,\n        onUserConsentStateChanged: (MapAttributionScope.UserConsentState) -> Unit\n    ) {\n        var showTelemetryDialog by remember {\n            mutableStateOf(false)\n        }\n        var showGeofencingConsentDialog by remember {\n            mutableStateOf(false)\n        }\n        val coroutineScope = rememberCoroutineScope()\n        val uriHandler = LocalUriHandler.current\n        Column(modifier = Modifier.wrapContentHeight(), horizontalAlignment = CenterHorizontally) {\n            Text(\n                modifier = Modifier.fillMaxWidth(),\n                text = \"Custom Attribution\",\n                textAlign = TextAlign.Center,\n                style = MaterialTheme.typography.h5,\n                color = MaterialTheme.colors.primarySurface\n            )\n            attributionState.userConsentState?.let { userConsentState ->\n                Divider()\n                Text(\"Telemetry Enable State: ${userConsentState.telemetryEnableState}\")\n                Text(\"Geofencing Consent State: ${userConsentState.geofencingUserConsentState}\")\n                if (showTelemetryDialog) {\n                    UserConsentDialog(\n                        title = stringResource(id = R.string.mapbox_attributionTelemetryTitle),\n                        body = stringResource(id = R.string.mapbox_attributionTelemetryMessage),\n                        onDismissRequest = { showTelemetryDialog = false },\n                        onConsent = { agree ->\n                            onUserConsentStateChanged(\n                                userConsentState.toBuilder()\n                                    .setTelemetryEnableState(agree)\n                                    .build()\n                            )\n                        }\n                    )\n                }\n\n                if (showGeofencingConsentDialog) {\n                    UserConsentDialog(\n                        title = stringResource(id = R.string.mapbox_attributionGeofencingTitle),\n                        body = stringResource(id = R.string.mapbox_attributionGeofencingMessage),\n                        onDismissRequest = { showGeofencingConsentDialog = false },\n                        onConsent = { agree ->\n                            onUserConsentStateChanged(\n                                userConsentState.toBuilder()\n                                    .setGeofencingUserConsentState(agree)\n                                    .build()\n                            )\n                        }\n                    )\n                }\n            }\n            Divider()\n            attributionState.attributions.forEach { attribution ->\n                Button(\n                    modifier = Modifier.fillMaxWidth(0.8f),\n                    onClick = {\n                        when (attribution.url) {\n                            Attribution.ABOUT_TELEMETRY_URL -> showTelemetryDialog = true\n                            Attribution.GEOFENCING_URL_MARKER -> showGeofencingConsentDialog = true\n\n                            else -> {\n                                if (attribution.isMapboxFeedback()) {\n                                    // For MapboxFeedback attribution, use AttributionState.buildMapboxFeedbackUrl() to build the URL with the current map state.\n                                    coroutineScope.launch {\n                                        uriHandler.openUri(attributionState.buildMapboxFeedbackUrl())\n                                    }\n                                } else {\n                                    uriHandler.openUri(attribution.url)\n                                }\n                            }\n                        }\n                    }\n                ) {\n                    Text(attribution.title)\n                }\n            }\n        }\n    }\n\n    /**\n     * Composable function that displays a user consent dialog for attribution-related permissions.\n     *\n     * This dialog presents the user with information about a specific feature (like telemetry\n     * or geofencing) and allows them to agree or disagree with the terms. The dialog uses\n     * Material Design's AlertDialog with custom button layout.\n     *\n     * @param title The title text displayed at the top of the dialog\n     * @param body The main message content explaining what the user is consenting to\n     * @param onDismissRequest Callback invoked when the dialog should be dismissed\n     * (e.g., when user taps outside the dialog or presses back)\n     * @param onConsent Callback invoked when user makes a choice, passing true for\n     * \"Agree\" and false for \"Disagree\"\n     */\n    @Composable\n    public fun UserConsentDialog(\n        title: String,\n        body: String,\n        onDismissRequest: () -> Unit,\n        onConsent: (Boolean) -> Unit\n    ) {\n        AlertDialog(\n            onDismissRequest = onDismissRequest,\n            title = {\n                Text(\n                    text = title,\n                    textAlign = TextAlign.Center,\n                    style = MaterialTheme.typography.h6\n                )\n            },\n            text = {\n                Text(\n                    text = body,\n                    textAlign = TextAlign.Start,\n                    style = MaterialTheme.typography.body1\n                )\n            },\n            buttons = {\n                Row(\n                    modifier = Modifier\n                        .fillMaxWidth()\n                        .padding(20.dp),\n                    horizontalArrangement = Arrangement.SpaceEvenly,\n                    verticalAlignment = Alignment.CenterVertically\n                ) {\n                    Button(\n                        onClick = {\n                            onConsent(true)\n                            onDismissRequest()\n                        }\n                    ) {\n                        Text(\"Agree\")\n                    }\n                    Button(\n                        onClick = {\n                            onConsent(false)\n                            onDismissRequest()\n                        }\n                    ) {\n                        Text(\"Disagree\")\n                    }\n                }\n            }\n        )\n    }\n\n    private companion object {\n        const val ZOOM: Double = 9.0\n        const val TILE_JSON_VERSION = \"2.0.0\"\n        const val TILE_JSON_NAME = \"OpenStreetMap\"\n        const val TILE_JSON_DESCRIPTION = \"A free editable map of the whole world.\"\n        const val TILE_JSON_ATTRIBUTION = \"&copy; OpenStreetMap contributors, CC-BY-SA\"\n        const val TILE_JSON_MIN_ZOOM = 0L\n        const val TILE_JSON_MAX_ZOOM = 18L\n\n        const val OSM_RASTER_TILE_URL = \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\"\n        const val RASTER_TILE_SIZE_PIXELS = 256L\n        val MERCATOR_BOUNDS = listOf(-180.0, -85.0, 180.0, 85.0)\n        val CENTER_MAP_LOCATION = listOf(11.9, 57.7, 8.0)\n    }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/ornaments/OrnamentCustomisationActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.ornaments\n\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.animation.AnimatedVisibility\nimport androidx.compose.animation.expandIn\nimport androidx.compose.animation.shrinkOut\nimport androidx.compose.animation.slideInVertically\nimport androidx.compose.animation.slideOutVertically\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.BottomAppBar\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Text\nimport androidx.compose.material.primarySurface\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.IntSize\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.R\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport java.util.Random\n\n/**\n * Example to showcase usage of ornaments customisation.\n */\npublic class OrnamentCustomisationActivity : ComponentActivity() {\n  private val random = Random()\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var showScaleBar by remember {\n        mutableStateOf(true)\n      }\n      var color by remember {\n        mutableStateOf(Color.Blue)\n      }\n      var showBottomBar by remember {\n        mutableStateOf(true)\n      }\n      val context = LocalContext.current\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier\n                  .padding(bottom = 10.dp)\n                  .align(Alignment.End),\n                onClick = {\n                  showScaleBar = !showScaleBar\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle ScaleBar Visibility\"\n                )\n              }\n\n              FloatingActionButton(\n                modifier = Modifier\n                  .padding(bottom = 10.dp)\n                  .align(Alignment.End),\n                onClick = {\n                  color = Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle Color\"\n                )\n              }\n\n              FloatingActionButton(\n                modifier = Modifier\n                  .padding(bottom = 10.dp)\n                  .align(Alignment.End),\n                onClick = {\n                  showBottomBar = !showBottomBar\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle Bottom Bar\"\n                )\n              }\n            }\n          },\n          bottomBar = {\n            AnimatedVisibility(\n              visible = showBottomBar,\n              enter = slideInVertically { it } + expandIn(initialSize = {\n                IntSize(\n                  width = it.width,\n                  height = 0\n                )\n              }),\n              exit = shrinkOut(targetSize = {\n                IntSize(\n                  width = it.width,\n                  height = 0\n                )\n              }) + slideOutVertically { it }\n            ) {\n              BottomAppBar(\n                backgroundColor = MaterialTheme.colors.primarySurface.copy(alpha = 0.5f),\n                elevation = 0.dp,\n              ) {\n                Text(\n                  modifier = Modifier.fillMaxWidth(),\n                  text = \"Showcase scaffoldPadding\",\n                  textAlign = TextAlign.Center\n                )\n              }\n            }\n          }\n        ) { scaffoldPadding ->\n          MapboxMap(\n            modifier = Modifier.fillMaxSize(),\n            compass = {\n              // Add a default Compass at with padding from scaffold, and also add\n              // a clickable without visual touch effects\n              val interactionSource = remember { MutableInteractionSource() }\n              Compass(\n                modifier = Modifier.padding(scaffoldPadding).clickable(\n                  interactionSource = interactionSource,\n                  indication = null\n                ) {\n                  Toast.makeText(context, \"Clicked on Compass!\", Toast.LENGTH_SHORT).show()\n                }\n              )\n              // Add another custom Compass.\n              Compass(\n                modifier = Modifier.padding(scaffoldPadding),\n                contentPadding = PaddingValues(0.dp),\n                alignment = Alignment.CenterEnd,\n              ) {\n                Image(\n                  painter = painterResource(id = R.drawable.mapbox_user_puck_icon),\n                  alpha = 0.9f,\n                  modifier = Modifier\n                    .height(55.dp)\n                    .width(55.dp),\n                  contentDescription = \"My customised compass\",\n                  colorFilter = ColorFilter.lighting(\n                    multiply = Color.White,\n                    add = color\n                  )\n                )\n              }\n            },\n            scaleBar = {\n              // Toggle ScaleBar visibility based on a mutable state.\n              if (showScaleBar) {\n                ScaleBar(\n                  modifier = Modifier.padding(scaffoldPadding),\n                  primaryColor = color\n                )\n              }\n            },\n            attribution = {\n              Attribution(\n                modifier = Modifier.padding(scaffoldPadding),\n                iconColor = color\n              )\n            },\n            logo = {\n              Logo(modifier = Modifier.padding(scaffoldPadding))\n            },\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CityLocations.HELSINKI)\n              }\n            }\n          )\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 9.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/AnimatedImageSourceActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.ImageBitmap\nimport androidx.compose.ui.graphics.asAndroidBitmap\nimport androidx.compose.ui.res.imageResource\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.PointListValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.RasterLayer\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberImageSourceState\nimport com.mapbox.maps.extension.style.sources.generated.ImageSource\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.extension.style.sources.updateImage\nimport com.mapbox.maps.toMapboxImage\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.isActive\n\n/**\n * Load a raster image to a style using ImageSource and display it on a map as\n * animated weather data using RasterLayer.\n */\npublic class AnimatedImageSourceActivity : ComponentActivity() {\n\n  @OptIn(MapboxDelicateApi::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    setContent {\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                center(Point.fromLngLat(-76.1255491524373, 43.043493218594804))\n                zoom(6.0)\n              }\n            }\n          ) {\n            val images = listOf(\n              ImageBitmap.imageResource(R.drawable.southeast_radar_0).asAndroidBitmap().toMapboxImage(),\n              ImageBitmap.imageResource(R.drawable.southeast_radar_1).asAndroidBitmap().toMapboxImage(),\n              ImageBitmap.imageResource(R.drawable.southeast_radar_2).asAndroidBitmap().toMapboxImage(),\n              ImageBitmap.imageResource(R.drawable.southeast_radar_3).asAndroidBitmap().toMapboxImage(),\n            )\n            MapEffect(Unit) {\n              val imageSource: ImageSource = it.mapboxMap.getSourceAs(ID_IMAGE_SOURCE)!!\n              var index = 0\n              while (isActive) {\n                imageSource.updateImage(images[index++])\n                index %= images.size\n                delay(1000L)\n              }\n            }\n            RasterLayer(\n              sourceState = rememberImageSourceState(sourceId = ID_IMAGE_SOURCE) {\n                coordinates = PointListValue(\n                  Point.fromLngLat(-80.425, 46.437),\n                  Point.fromLngLat(-71.516, 46.437),\n                  Point.fromLngLat(-71.516, 37.936),\n                  Point.fromLngLat(-80.425, 37.936)\n                )\n              }\n            )\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    private const val ID_IMAGE_SOURCE = \"image_source-id\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/AppearancesActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.graphics.BitmapFactory\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.rememberMapState\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * Example demonstrating the experimental Appearances API for dynamic icon states.\n * Shows how to use appearances with feature-state to change icon images based on user interaction.\n * - Default: hotel icon\n * - Currently Selected: hotel-active icon\n * - Previously Clicked: hotel-clicked icon\n */\npublic class AppearancesActivity : ComponentActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    val hotelBitmap = BitmapFactory.decodeResource(resources, R.drawable.hotel)\n    val hotelActiveBitmap = BitmapFactory.decodeResource(resources, R.drawable.hotel_active)\n    val hotelClickedBitmap = BitmapFactory.decodeResource(resources, R.drawable.hotel_clicked)\n    setContent {\n      var selectedFeature by remember { mutableStateOf<FeaturesetFeature<FeatureState>?>(null) }\n      val clickedFeatures = remember { mutableSetOf<FeaturesetFeature<FeatureState>>() }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          MapboxMap(\n            modifier = Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                center(Point.fromLngLat(1.8447281852, 42.10025506))\n                zoom(15.5)\n                pitch(0.0)\n                bearing(0.0)\n              }\n            },\n            mapState = rememberMapState(),\n            style = {\n              MapboxStandardStyle(\n                standardStyleState = rememberStandardStyleState {\n                  // When a hotel icon is clicked, set the currentlySelected feature state to true,\n                  // unselect the previous one if any, and store this feature both as the selected\n                  // feature and in the list of features that have been clicked\n                  interactionsState.onLayerClicked(\"points\") { feature, _ ->\n                    // Clear the currently selected feature by resetting its feature state\n                    selectedFeature?.setFeatureState(\n                      FeatureState { addBooleanState(CURRENTLY_SELECTED_KEY, false) }\n                    ) {}\n\n                    // Store this feature as the currently selected feature and in the list\n                    // of features that have been clicked\n                    clickedFeatures.add(feature)\n                    feature.setFeatureState(\n                      FeatureState {\n                        addBooleanState(CURRENTLY_SELECTED_KEY, true)\n                        addBooleanState(HAS_BEEN_CLICKED_KEY, true)\n                      }\n                    ) {}\n                    selectedFeature = feature\n                    true\n                  }\n\n                  // When the map is clicked outside of any feature, unselect the currently selected\n                  // feature if there's any, or remove all features from the list of features that\n                  // have been clicked to get back to the initial state\n                  interactionsState.onMapClicked {\n                    if (selectedFeature != null) {\n                      // Unselect the currently selected feature\n                      selectedFeature?.setFeatureState(\n                        FeatureState { addBooleanState(CURRENTLY_SELECTED_KEY, false) }\n                      ) {}\n                      selectedFeature = null\n                    } else {\n                      // Reset the state of all features to the default one\n                      clickedFeatures.forEach { clickedFeature ->\n                        clickedFeature.setFeatureState(\n                          FeatureState { addBooleanState(HAS_BEEN_CLICKED_KEY, false) }\n                        ) {}\n                      }\n                      clickedFeatures.clear()\n                    }\n                    true\n                  }\n                }\n              )\n            }\n          ) {\n            // Add images, source, and layer after the style has loaded\n            MapEffect(Unit) { mapView ->\n              mapView.mapboxMap.subscribeStyleLoaded {\n                mapView.mapboxMap.style?.let { style ->\n\n                  // Load an image for every feature state\n                  style.addImage(\"hotel\", hotelBitmap)\n                  style.addImage(\"hotel-active\", hotelActiveBitmap)\n                  style.addImage(\"hotel-clicked\", hotelClickedBitmap)\n\n                  // Add a GeoJSON source with hotel locations\n                  style.addStyleSource(\n                    \"points\",\n                    Value.fromJson(\n                      \"\"\"\n                      {\n                        \"type\": \"geojson\",\n                        \"data\": $HOTEL_GEOJSON\n                      }\n                    \"\"\".trimIndent()\n                    ).value!!\n                  )\n\n                  // Add a layer to show an icon on every point with appearances\n                  // - When currentlySelected feature state is true: use \"hotel-active\" icon\n                  // - When hasBeenClicked feature state is true and currentlySelected is not: use \"hotel-clicked\" icon\n                  // - Otherwise: use the default \"hotel\" icon defined in layout\n                  // Appearances are experimental and subject to change in future versions\n                  try {\n                    style.addStyleLayer(\n                      Value.fromJson(POINTS_LAYER_JSON).value!!,\n                      LayerPosition(null, null, null)\n                    )\n                  } catch (e: Exception) {\n                    Log.e(\"Appearances\", \"Error adding layer\", e)\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    private const val CURRENTLY_SELECTED_KEY = \"currentlySelected\"\n    private const val HAS_BEEN_CLICKED_KEY = \"hasBeenClicked\"\n  }\n}\n\nprivate const val POINTS_LAYER_JSON = \"\"\"\n{\n  \"id\": \"points\",\n  \"type\": \"symbol\",\n  \"source\": \"points\",\n  \"layout\": {\n    \"icon-allow-overlap\": true,\n    \"icon-image\": \"hotel\",\n    \"icon-size\": 1.0,\n    \"icon-anchor\": \"center\"\n  },\n  \"appearances\": [\n    {\n      \"name\": \"currently-selected\",\n      \"condition\": [\"boolean\", [\"feature-state\", \"currentlySelected\"], false],\n      \"properties\": {\n        \"icon-image\": \"hotel-active\"\n      }\n    },\n    {\n      \"name\": \"has-been-clicked\",\n      \"condition\": [\"boolean\", [\"feature-state\", \"hasBeenClicked\"], false],\n      \"properties\": {\n        \"icon-image\": \"hotel-clicked\"\n      }\n    }\n  ]\n}\n\"\"\"\n\nprivate const val HOTEL_GEOJSON = \"\"\"\n{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\"type\": \"Feature\", \"id\": \"1\", \"properties\": {}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [1.8452993238082342, 42.100164223399275]}},\n    {\"type\": \"Feature\", \"id\": \"2\", \"properties\": {}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [1.8438590191857145, 42.1004178052402]}},\n    {\"type\": \"Feature\", \"id\": \"3\", \"properties\": {}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [1.844225198327564, 42.10130533369667]}},\n    {\"type\": \"Feature\", \"id\": \"4\", \"properties\": {}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [1.8443594640122, 42.0990955459275]}},\n    {\"type\": \"Feature\", \"id\": \"5\", \"properties\": {}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [1.8449697625811154, 42.09869705141318]}},\n    {\"type\": \"Feature\", \"id\": \"6\", \"properties\": {}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [1.8471058075726603, 42.09978384873651]}},\n    {\"type\": \"Feature\", \"id\": \"7\", \"properties\": {}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [1.8455739474818813, 42.10182152060625]}},\n    {\"type\": \"Feature\", \"id\": \"8\", \"properties\": {}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [1.8427787800360136, 42.10039061289771]}},\n    {\"type\": \"Feature\", \"id\": \"9\", \"properties\": {}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [1.8433280487479635, 42.0994396753579]}}\n  ]\n}\n\"\"\""
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/ClipLayerActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.GenericStyle\nimport com.mapbox.maps.extension.compose.style.layers.generated.ClipLayer\nimport com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypes\nimport com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypesListValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.compose.style.slotsContent\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberGeoJsonSourceState\n\n/**\n * Example showcasing the usage of [com.mapbox.maps.extension.style.layers.generated.ClipLayer].\n */\npublic class ClipLayerActivity : ComponentActivity() {\n\n  @OptIn(MapboxDelicateApi::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var clipLayerTypesListValue by remember {\n        mutableStateOf(ClipLayerTypesListValue(emptyList()))\n      }\n      var showClipLayer by remember {\n        mutableStateOf(false)\n      }\n      val geoJsonSource = rememberGeoJsonSourceState {\n        data = GeoJSONData(\n          listOf(\n            Feature.fromGeometry(Polygon.fromLngLats(POLYGON_POINTS))\n          )\n        )\n      }\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showClipLayer = true\n                  clipLayerTypesListValue = ClipLayerTypesListValue(listOf(ClipLayerTypes.SYMBOL))\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Clip symbol\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showClipLayer = true\n                  clipLayerTypesListValue = ClipLayerTypesListValue(listOf(ClipLayerTypes.MODEL))\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Clip model\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showClipLayer = true\n                  clipLayerTypesListValue = ClipLayerTypesListValue(\n                    listOf(ClipLayerTypes.MODEL, ClipLayerTypes.SYMBOL)\n                  )\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Clip model and symbol\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showClipLayer = false\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Hide clip layer\")\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions(START_CAMERA_POSITION)\n            },\n            style = {\n              GenericStyle(\n                style = Style.STANDARD,\n                slotsContent = slotsContent {\n                  slot(\"bottom\") {\n                    FillLayer(sourceState = geoJsonSource) {\n                      fillColor = ColorValue(Color.Blue)\n                      fillOpacity = DoubleValue(0.4)\n                    }\n                  }\n                }\n              )\n            }\n          ) {\n            if (showClipLayer) {\n              ClipLayer(\n                sourceState = geoJsonSource,\n              ) {\n                clipLayerTypes = clipLayerTypesListValue\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  public companion object {\n    private val CENTER = Point.fromLngLat(-74.0027, 40.7130)\n    private val START_CAMERA_POSITION = cameraOptions {\n      center(CENTER)\n      zoom(16.5)\n      bearing(60.0)\n      pitch(30.0)\n    }\n\n    private val POLYGON_POINTS = listOf(\n      listOf(\n        Point.fromLngLat(\n          -74.00438542864366,\n          40.71275107696869\n        ),\n        Point.fromLngLat(\n          -74.00465916994656,\n          40.712458268827675\n        ),\n        Point.fromLngLat(\n          -74.00417333128154,\n          40.71212099900339\n        ),\n        Point.fromLngLat(\n          -74.00314623457163,\n          40.71238635014873\n        ),\n        Point.fromLngLat(\n          -74.00088173461268,\n          40.71296692136764\n        ),\n        Point.fromLngLat(\n          -74.00081475001514,\n          40.713220461793924\n        ),\n        Point.fromLngLat(\n          -74.0024425998592,\n          40.71419501190087\n        ),\n        Point.fromLngLat(\n          -74.00341033210208,\n          40.71374214594772\n        ),\n        Point.fromLngLat(\n          -74.00438542864366,\n          40.71275107696869\n        ),\n      )\n    )\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/ColorThemeActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.DropdownMenu\nimport androidx.compose.material.DropdownMenuItem\nimport androidx.compose.material.ExperimentalMaterialApi\nimport androidx.compose.material.FilterChip\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Icon\nimport androidx.compose.material.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Done\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.ColorTheme\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.GenericStyle\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.rememberAtmosphereState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.RainState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.rememberRainState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.rememberSnowState\nimport com.mapbox.maps.extension.compose.style.rememberColorTheme\nimport com.mapbox.maps.extension.compose.style.rememberStyleColorTheme\nimport com.mapbox.maps.extension.compose.style.rememberStyleState\nimport com.mapbox.maps.extension.style.color.colorTheme\n\n/**\n * Example showcasing the usage of Color Theme API.\n * To create custom LUT, you can follow [this](https://docs.mapbox.com/help/tutorials/create-a-custom-color-theme/) guide.\n */\npublic class ColorThemeActivity : ComponentActivity() {\n\n  @OptIn(MapboxExperimental::class, ExperimentalMaterialApi::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      // creating and style color theme using base64 encoded LUT image\n      val base64ColorTheme = rememberColorTheme(base64 = BASE64_ENCODED_RED_THEME)\n      // creating monochrome StyleColorTheme from a drawable LUT resource\n      val monochromeColorTheme = rememberColorTheme(resourceId = R.drawable.monochrome_lut)\n      // holder for current color theme\n      var currentColorTheme by remember {\n        mutableStateOf(base64ColorTheme)\n      }\n      val currentStyleColorTheme = rememberStyleColorTheme(currentColorTheme)\n      var atmosphereUseTheme by remember {\n        mutableStateOf(true)\n      }\n      val initialAtmosphereState = rememberAtmosphereState {\n        color = ColorValue(Color.Green)\n      }\n      val currentAtmosphereState by remember {\n        mutableStateOf(initialAtmosphereState)\n      }\n\n      val blueSnowState = rememberSnowState().apply {\n        color = ColorValue(Color.Blue)\n      }\n      var currentSnowState by remember {\n        mutableStateOf(SnowState.DISABLED)\n      }\n\n      val greenRainState = rememberRainState().apply {\n        color = ColorValue(Color.Green)\n        opacity = DoubleValue(0.8)\n      }\n      var currentRainState by remember {\n        mutableStateOf(RainState.DISABLED)\n      }\n\n      // When state is toggled, update atmosphere state with correct string value.\n      // Setting it to \"none\" means that color theme will not affect atmosphere.\n      currentAtmosphereState.colorUseTheme = StringValue(\n        if (atmosphereUseTheme) \"default\" else \"none\"\n      )\n\n      var showSnowMenu by remember { mutableStateOf(false) }\n      var showRainMenu by remember { mutableStateOf(false) }\n      var showThemeMenu by remember { mutableStateOf(false) }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column(modifier = Modifier.padding(horizontal = 32.dp)) {\n              Row(\n                horizontalArrangement = Arrangement.Absolute.SpaceBetween,\n                modifier = Modifier.fillMaxWidth()\n              ) {\n                Box {\n                  FloatingActionButton(\n                    modifier = Modifier.padding(bottom = 10.dp),\n                    onClick = { showThemeMenu = true },\n                    shape = RoundedCornerShape(16.dp),\n                  ) {\n                    Text(modifier = Modifier.padding(10.dp), text = \"Theme\")\n                  }\n                  ThemeSelector(\n                    items = listOf(\n                      \"Monochrome\" to monochromeColorTheme,\n                      \"Red\" to base64ColorTheme,\n                      \"Reset\" to colorTheme(),\n                    ),\n                    expanded = showThemeMenu,\n                    onDismissRequest = { showThemeMenu = false },\n                    {\n                      currentColorTheme = it\n                      showThemeMenu = false\n                    }\n                  )\n                }\n\n                Box {\n                  FloatingActionButton(\n                    modifier = Modifier.padding(bottom = 10.dp),\n                    onClick = { showSnowMenu = true },\n                    shape = RoundedCornerShape(16.dp),\n                  ) {\n                    Text(modifier = Modifier.padding(10.dp), text = \"Snow\")\n                  }\n                  DropdownMenu(\n                    expanded = showSnowMenu,\n                    onDismissRequest = { showSnowMenu = false }\n                  ) {\n                    DropdownMenuItem(\n                      onClick = {\n                        currentSnowState = blueSnowState.apply {\n                          colorUseTheme = StringValue(\"default\")\n                        }\n                        showSnowMenu = false\n                      },\n                      content = { Text(\"Enable (colorUseTheme=default)\") }\n                    )\n\n                    DropdownMenuItem(\n                      onClick = {\n                        currentSnowState = blueSnowState.apply {\n                          colorUseTheme = StringValue(\"none\")\n                        }\n                        showSnowMenu = false\n                      },\n                      content = { Text(\"Enable (colorUseTheme=none)\") }\n                    )\n\n                    DropdownMenuItem(\n                      onClick = {\n                        currentSnowState = SnowState.DISABLED\n                        showSnowMenu = false\n                      },\n                      content = { Text(\"Disable\") }\n                    )\n                  }\n                }\n\n                Box {\n                  FloatingActionButton(\n                    modifier = Modifier.padding(bottom = 10.dp),\n                    onClick = { showRainMenu = true },\n                    shape = RoundedCornerShape(16.dp),\n                  ) {\n                    Text(modifier = Modifier.padding(10.dp), text = \"Rain\")\n                  }\n                  DropdownMenu(\n                    expanded = showRainMenu,\n                    onDismissRequest = { showRainMenu = false }\n                  ) {\n                    DropdownMenuItem(\n                      onClick = {\n                        currentRainState = greenRainState.apply {\n                          colorUseTheme = StringValue(\"default\")\n                        }\n                        showRainMenu = false\n                      },\n                      content = { Text(\"Enable (colorUseTheme=default)\") }\n                    )\n\n                    DropdownMenuItem(\n                      onClick = {\n                        currentRainState = greenRainState.apply {\n                          colorUseTheme = StringValue(\"none\")\n                        }\n                        showRainMenu = false\n                      },\n                      content = { Text(\"Enable (colorUseTheme=none)\") }\n                    )\n\n                    DropdownMenuItem(\n                      onClick = {\n                        currentRainState = RainState.DISABLED\n                        showRainMenu = false\n                      },\n                      content = { Text(\"Disable\") }\n                    )\n                  }\n                }\n              }\n\n              FilterChip(\n                onClick = {\n                  atmosphereUseTheme = !atmosphereUseTheme\n                },\n                content = {\n                  Text(\"Use theme color for Atmosphere\")\n                },\n                selected = atmosphereUseTheme,\n                leadingIcon = if (atmosphereUseTheme) {\n                  {\n                    Icon(\n                      imageVector = Icons.Filled.Done,\n                      contentDescription = null,\n                    )\n                  }\n                } else {\n                  null\n                },\n              )\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions(START_CAMERA_POSITION)\n            },\n            style = {\n              GenericStyle(\n                style = Style.MAPBOX_STREETS,\n                styleState = rememberStyleState {\n                  styleColorTheme = currentStyleColorTheme\n                  atmosphereState = currentAtmosphereState\n                  snowState = currentSnowState\n                  rainState = currentRainState\n                },\n              )\n            }\n          )\n        }\n      }\n    }\n  }\n\n  @Composable\n  private fun ThemeSelector(\n    items: List<Pair<String, ColorTheme>>,\n    expanded: Boolean,\n    onDismissRequest: () -> Unit,\n    onThemeSelected: (ColorTheme) -> Unit\n  ) {\n    DropdownMenu(\n      expanded = expanded,\n      onDismissRequest = onDismissRequest\n    ) {\n      items.forEach { (name, theme) ->\n        DropdownMenuItem(onClick = { onThemeSelected(theme) }) {\n          Text(name)\n        }\n      }\n    }\n  }\n\n  public companion object {\n    /**\n     * Base64 encoded version of a custom LUT (Look-Up Table) image.\n     * LUT image can be created by following [this](https://docs.mapbox.com/help/tutorials/create-a-custom-color-theme/) guide.\n     *\n     * To convert your LUT image to a Base64 string, you can use an online tool or a script.\n     * For example, you can use the following command in a terminal:\n     *\n     * ```sh\n     * base64 -i path/to/your/lut-image.png -o output.txt\n     * ```\n     */\n    private const val BASE64_ENCODED_RED_THEME =\n      \"iVBORw0KGgoAAAANSUhEUgAABAAAAAAgCAYAAACM/gqmAAAAAXNSR0IArs4c6QAABSFJREFUeF7t3cFO40AQAFHnBv//wSAEEgmJPeUDsid5h9VqtcMiZsfdPdXVzmVZlo+3ZVm+fr3//L7257Lm778x+prL1ff0/b//H+z/4/M4OkuP/n70Nc7f+nnb+yzb//sY6vxt5xXPn+dP/aH+GsXJekb25izxR/ypZ6ucUefv9g4z2jPP3/HPHwAAgABAABgACIACkAAsAL1SD4yKWQAUAHUBdAG8buKNYoYL8PEX4FcHQAAAAAAAAAAAAAAAAAAAAAAA8LAeGF1mABAABAABQACQbZP7+hk5AwACAAAAAAAAAAAAAAAAAAAAAAAA4EE9AICMx4QBAAAAAAAANgvJsxGQV1dA/PxmMEtxU9YoABQACoC5CgDxX/wvsb2sEf/Ff/Ff/N96l5n73+/5YAB4CeBqx2VvMqXgUfD2npkzBCAXEBeQcrkoa5x/FxAXEBcQF5A2Wy3/t32qNYr8I//Mln+MABgBMAJgBMAIgBEAIwBGAIwAGAEwAmAE4K4eAGCNQIw+qQ0AmQ+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/6gEABAB5RgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/UAAPKcAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEFNODICRtDkDO/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOhvlPUWem+h9xKQ+V4CUt9wO6KZnn/Pv+ff8z/bW5DFP59CUnJbWSP+iX/iX78znqED/urxnwHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADoNMcHUAdQAQcAUfAe8xEwH0O86t3IPz8OvClu17WqD/UH+oP9cf1Gdia01d/LQsDgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABkCnSQwABgACj8Aj8D1mItAMAB1wHfDS3S5r5F/5V/6Vf3XAW12h/mIArHY89iZTAAQA2XtmBKAWqOslyf4rgBXACmAFcIur8k/bJ/mnQTr5V/6Vf+fKv0YAjAAYATACYATACIARACMARgCMABgBMAJgBMAIgBEAIwCdZuiA64AjwAgwAtxjpg6cDlztLlLA7/Pr1gueyr56/jx/5ZzUNeof9Y/6R/0zk4HGAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaQ4DgAGAgCPgCHiPmTqQOpC1u8gAYACMjAf5V/6Vf+XfmTrQ8l97v8Z/5X8GAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADIBO0xgADAAdCB0IHYgeMxkADAAdkGM7IPbf/pfuWlmj/lH/qH/UPzMZGAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAJ3mMAAYAAg4Ao6A95jJAGAA6EDrQJfuclkj/8q/8q/8O1MHWv47Nv8xABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAB0msYAYADoQOhA6ED0mMkAYADogBzbAbH/9r/YFWWN+kf9o/5R/8xkYDAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgAHSawwBgACDgCDgC3mMmA4ABoAOtA126y2WN/Cv/yr/y70wdaPnv2PzHAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaRoDgAGgA6EDoQPRYyYDgAGgA3JsB8T+2/9iV5Q16h/1j/pH/TOTgcEAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAPgyQ2AT4NBIB3ew5dkAAAAAElFTkSuQmCC\"\n    private const val LATITUDE = 40.72\n    private const val LONGITUDE = -73.99\n    private val CENTER = Point.fromLngLat(LONGITUDE, LATITUDE)\n    private val START_CAMERA_POSITION = cameraOptions {\n      center(CENTER)\n      zoom(2.0)\n      pitch(45.0)\n    }\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/ElevatedLineActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport com.google.gson.JsonArray\nimport com.google.gson.JsonObject\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.LineLayer\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.generated.GeoJsonSourceState\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.atInterpolated\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.projection.generated.projection\n\n/**\n * Example of adding an elevated line to a map.\n * This example is based on mapbox-gl-js example: https://docs.mapbox.com/mapbox-gl-js/example/elevated-line/\n */\npublic class ElevatedLineActivity : ComponentActivity() {\n  @OptIn(MapboxExperimental::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      val lineSourceState = remember { GeoJsonSourceState() }\n      lineSourceState.data = GeoJSONData(createLineStringFeature(COORDINATES, ELEVATIONS))\n      lineSourceState.lineMetrics = BooleanValue(true)\n\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions(CAMERA_OPTIONS)\n            },\n          ) {\n            // add the elevated line layer\n            LineLayer(lineSourceState) {\n              lineJoin = LineJoinValue.ROUND\n              lineWidth = DoubleValue(8.0)\n              lineColor = ColorValue(Color.Blue)\n              lineEmissiveStrength = DoubleValue(1.0)\n              lineElevationReference = LineElevationReferenceValue.SEA\n              lineZOffset = DoubleValue(\n                atInterpolated {\n                  product {\n                    lineProgress()\n                    subtract {\n                      length { get(ELEVATION_PROPERTY_KEY) }\n                      literal(1)\n                    }\n                  }\n                  get(ELEVATION_PROPERTY_KEY)\n                }\n              )\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun createLineStringFeature(coordinates: List<Point>, elevations: List<Double>): Feature {\n    val properties = JsonObject()\n    // add an array of elevation values.\n    // the number of values doesn't need to match the number of coordinates.\n    JsonArray().apply {\n      elevations.forEach(::add)\n    }.let { elevationsArray ->\n      properties.add(ELEVATION_PROPERTY_KEY, elevationsArray)\n    }\n    return Feature.fromGeometry(LineString.fromLngLats(coordinates), properties)\n  }\n\n  private companion object {\n    private const val ELEVATION_PROPERTY_KEY = \"elevation\"\n    private val CAMERA_OPTIONS = cameraOptions {\n      center(Point.fromLngLat(6.7782, 45.8418))\n      zoom(11.0)\n      bearing(-150.0)\n      pitch(62.0)\n      projection(ProjectionName.MERCATOR)\n    }\n\n    private val ELEVATIONS = arrayOf(\n      4600, 4600, 4600, 4599, 4598, 4596, 4593, 4590, 4584, 4578, 4569,\n      4559, 4547, 4533, 4516, 4497, 4475, 4450, 4422, 4390, 4355, 4316,\n      4275, 4227, 4177, 4124, 4068, 4009, 3946, 3880, 3776, 3693, 3599,\n      3502, 3398, 3290, 3171, 3052, 2922, 2786, 2642, 2490, 2332, 2170,\n      1994, 1810, 1612, 1432, 1216, 1000\n    ).map { it.toDouble() }\n\n    private val COORDINATES = listOf(\n      Point.fromLngLat(6.862885, 45.833563),\n      Point.fromLngLat(6.863605, 45.846851),\n      Point.fromLngLat(6.859783, 45.862445),\n      Point.fromLngLat(6.848727, 45.876361),\n      Point.fromLngLat(6.827155, 45.892361),\n      Point.fromLngLat(6.802194, 45.905032),\n      Point.fromLngLat(6.780023, 45.909602),\n      Point.fromLngLat(6.753605, 45.906074),\n      Point.fromLngLat(6.728807, 45.899120),\n      Point.fromLngLat(6.700449, 45.883872),\n      Point.fromLngLat(6.683772, 45.863866),\n      Point.fromLngLat(6.684058, 45.841619),\n      Point.fromLngLat(6.691115, 45.825417),\n      Point.fromLngLat(6.704446, 45.813349),\n      Point.fromLngLat(6.720959, 45.807886),\n      Point.fromLngLat(6.748477, 45.809517),\n      Point.fromLngLat(6.775554, 45.817254),\n      Point.fromLngLat(6.791236, 45.828871),\n      Point.fromLngLat(6.801289, 45.838797),\n      Point.fromLngLat(6.806307, 45.849788),\n      Point.fromLngLat(6.803161, 45.866159),\n      Point.fromLngLat(6.794599, 45.880461),\n      Point.fromLngLat(6.769846, 45.890231),\n      Point.fromLngLat(6.744712, 45.889576),\n      Point.fromLngLat(6.722788, 45.881677),\n      Point.fromLngLat(6.708097, 45.868556),\n      Point.fromLngLat(6.699435, 45.851973),\n      Point.fromLngLat(6.707324, 45.832980),\n      Point.fromLngLat(6.723743, 45.822384),\n      Point.fromLngLat(6.739347, 45.818626),\n      Point.fromLngLat(6.756019, 45.822069),\n      Point.fromLngLat(6.773963, 45.832436),\n      Point.fromLngLat(6.785920, 45.848229),\n      Point.fromLngLat(6.786155, 45.860521),\n      Point.fromLngLat(6.774430, 45.870586),\n      Point.fromLngLat(6.749012, 45.875670),\n      Point.fromLngLat(6.731251, 45.868501),\n      Point.fromLngLat(6.716033, 45.853689),\n      Point.fromLngLat(6.714748, 45.846970),\n      Point.fromLngLat(6.714635, 45.838934),\n      Point.fromLngLat(6.717850, 45.832829),\n      Point.fromLngLat(6.724010, 45.828151),\n      Point.fromLngLat(6.730551, 45.827333),\n      Point.fromLngLat(6.733951, 45.829900),\n      Point.fromLngLat(6.735957, 45.834154),\n      Point.fromLngLat(6.735286, 45.839871),\n      Point.fromLngLat(6.734471, 45.843933),\n      Point.fromLngLat(6.730893, 45.847233),\n      Point.fromLngLat(6.728550, 45.847899),\n      Point.fromLngLat(6.726590, 45.847822),\n      Point.fromLngLat(6.724876, 45.846455),\n      Point.fromLngLat(6.725096, 45.843900),\n      Point.fromLngLat(6.726635, 45.841201),\n      Point.fromLngLat(6.728074, 45.837041),\n      Point.fromLngLat(6.727822, 45.834292),\n    )\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/GenericStylePositionsActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.examples.utils.offset\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.GenericStyle\nimport com.mapbox.maps.extension.compose.style.MapboxStyleComposable\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layerPositionedContent\nimport com.mapbox.maps.extension.compose.style.layers.generated.BackgroundLayer\nimport com.mapbox.maps.extension.compose.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.compose.style.rememberStyleState\nimport com.mapbox.maps.extension.compose.style.slotsContent\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberGeoJsonSourceState\nimport com.mapbox.maps.extension.compose.style.styleImportsConfig\n\n/**\n * Example to showcase the usage of [slotsContent] and [layerPositionedContent] to arrange contents within the\n * base style using [GenericStyle] API.\n */\npublic class GenericStylePositionsActivity : ComponentActivity() {\n\n  @OptIn(MapboxDelicateApi::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var styleUri by remember {\n        mutableStateOf(Style.LIGHT)\n      }\n\n      var showTopSlotContent by remember {\n        mutableStateOf(true)\n      }\n\n      var showMiddleSlotContent by remember {\n        mutableStateOf(true)\n      }\n\n      var showLayerPositionedContent by remember {\n        mutableStateOf(true)\n      }\n\n      var lightPresetConfig by remember {\n        mutableStateOf(\"day\")\n      }\n\n      var showBottomAnnotation by remember {\n        mutableStateOf(true)\n      }\n\n      var showMiddleCircleLayer by remember {\n        mutableStateOf(true)\n      }\n\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          center(CityLocations.HELSINKI)\n        }\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              if (styleUri == Style.STANDARD) {\n                FloatingActionButton(\n                  modifier = Modifier.padding(bottom = 10.dp),\n                  backgroundColor = if (styleUri == Style.STANDARD) MaterialTheme.colors.secondary else Color.LightGray,\n                  onClick = {\n                    showTopSlotContent = !showTopSlotContent\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(10.dp),\n                    text = \"Toggle top slot content - current: $showTopSlotContent\"\n                  )\n                }\n                FloatingActionButton(\n                  modifier = Modifier.padding(bottom = 10.dp),\n                  backgroundColor = if (styleUri == Style.STANDARD) MaterialTheme.colors.secondary else Color.LightGray,\n                  onClick = {\n                    showMiddleSlotContent = !showMiddleSlotContent\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(10.dp),\n                    text = \"Toggle middle slot content - current: $showMiddleSlotContent\"\n                  )\n                }\n                FloatingActionButton(\n                  modifier = Modifier.padding(bottom = 10.dp),\n                  backgroundColor = if (styleUri == Style.STANDARD) MaterialTheme.colors.secondary else Color.LightGray,\n                  onClick = {\n                    lightPresetConfig = if (lightPresetConfig == \"day\") \"night\" else \"day\"\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(10.dp),\n                    text = \"Toggle light preset - current: $lightPresetConfig\"\n                  )\n                }\n              } else {\n                FloatingActionButton(\n                  modifier = Modifier.padding(bottom = 10.dp),\n                  backgroundColor = if (styleUri != Style.STANDARD) MaterialTheme.colors.secondary else Color.LightGray,\n                  onClick = {\n                    showLayerPositionedContent = !showLayerPositionedContent\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(10.dp),\n                    text = \"Toggle positioned layer content - current $showLayerPositionedContent\"\n                  )\n                }\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  styleUri = if (styleUri == Style.LIGHT) {\n                    Style.STANDARD\n                  } else {\n                    Style.LIGHT\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle Style - current: ${styleUri.substringAfterLast('/')}\"\n                )\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showBottomAnnotation = !showBottomAnnotation\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle bottom annotation - current: $showBottomAnnotation\"\n                )\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showMiddleCircleLayer = !showMiddleCircleLayer\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle middle annotation - current: $showMiddleCircleLayer\"\n                )\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = mapViewportState,\n            style = {\n              MyStyle(\n                styleUri = styleUri,\n                showTopSlotContent = showTopSlotContent,\n                showMiddleSlotContent = showMiddleSlotContent,\n                showLayerPositionedContent = showLayerPositionedContent,\n                lightPresetConfig = lightPresetConfig,\n              )\n            }\n          ) {\n            if (showBottomAnnotation) {\n              CircleAnnotation(\n                point = CityLocations.HELSINKI.offset(0.005),\n              ) {\n                circleRadius = 30.0\n                circleColor = Color.Red\n              }\n            }\n            if (showMiddleCircleLayer) {\n              CircleLayer(\n                sourceState = rememberGeoJsonSourceState {\n                  data = GeoJSONData(CityLocations.HELSINKI)\n                }\n              ) {\n                circleColor = ColorValue(Color.Yellow)\n                circleRadius = DoubleValue(30.0)\n              }\n            }\n            CircleAnnotation(\n              point = CityLocations.HELSINKI.offset(-0.005)\n            ) {\n              circleRadius = 30.0\n              circleColor = Color.Blue\n            }\n          }\n        }\n      }\n    }\n  }\n\n  @Composable\n  @MapboxStyleComposable\n  private fun MyStyle(\n    styleUri: String,\n    showTopSlotContent: Boolean,\n    showMiddleSlotContent: Boolean,\n    showLayerPositionedContent: Boolean,\n    lightPresetConfig: String\n  ) {\n    GenericStyle(\n      style = styleUri,\n      slotsContent = slotsContent {\n        // Only add slots contents for standard style, where the top and middle slot are available.\n        if (styleUri == Style.STANDARD) {\n          if (showTopSlotContent) {\n            slot(\"top\") {\n              CircleAnnotation(\n                point = CityLocations.HELSINKI.offset(0.008),\n              ) {\n                circleRadius = 30.0\n                circleColor = Color.Magenta\n              }\n              CircleLayer(\n                sourceState = rememberGeoJsonSourceState {\n                  data = GeoJSONData(CityLocations.HELSINKI.offset(-0.0010))\n                }\n              ) {\n                circleColor = ColorValue(Color.DarkGray)\n                circleRadius = DoubleValue(30.0)\n                circleColorTransition = Transition(durationMillis = 1000L)\n              }\n              CircleAnnotation(\n                point = CityLocations.HELSINKI.offset(-0.008)\n              ) {\n                circleRadius = 30.0\n                circleColor = Color.Green\n              }\n            }\n          }\n          if (showMiddleSlotContent) {\n            slot(\"middle\") {\n              BackgroundLayer {\n                backgroundColor = ColorValue(Color.Red)\n                backgroundOpacity = DoubleValue(0.3)\n              }\n            }\n          }\n        }\n      },\n      layerPositionedContent = layerPositionedContent {\n        // only add background layer below building layer if the style is not standard\n        // style, where layers are available in runtime styling.\n        if (styleUri != Style.STANDARD) {\n          belowLayer(\"building\") {\n            if (showLayerPositionedContent) {\n              CircleAnnotation(\n                point = CityLocations.HELSINKI.offset(0.008),\n              ) {\n                circleRadius = 30.0\n                circleColor = Color.Magenta\n              }\n              CircleLayer(\n                layerId = \"middle-circle-layer\",\n                sourceState = rememberGeoJsonSourceState {\n                  data = GeoJSONData(CityLocations.HELSINKI.offset(-0.0016))\n                }\n              ) {\n                circleColor = ColorValue(Color.DarkGray)\n                circleRadius = DoubleValue(30.0)\n              }\n              CircleAnnotation(\n                point = CityLocations.HELSINKI.offset(-0.008)\n              ) {\n                circleRadius = 30.0\n                circleColor = Color.Green\n              }\n            }\n          }\n        }\n      },\n      styleState = rememberStyleState {\n        styleImportsConfig = styleImportsConfig {\n          importConfig(\"basemap\") {\n            config(\"lightPreset\", Value(lightPresetConfig))\n          }\n        }\n      }\n    )\n  }\n\n  private companion object {\n    const val ZOOM: Double = 9.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/ImageSourceActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.ImageBitmap\nimport androidx.compose.ui.graphics.asAndroidBitmap\nimport androidx.compose.ui.res.imageResource\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.PointListValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.RasterLayer\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberImageSourceState\nimport com.mapbox.maps.extension.compose.style.standard.LightPresetValue\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.ThemeValue\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\nimport com.mapbox.maps.extension.style.sources.generated.ImageSource\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.extension.style.sources.updateImage\nimport com.mapbox.maps.toMapboxImage\n\n/**\n * Example to showcase usage of ImageSource.\n */\npublic class ImageSourceActivity : ComponentActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    setContent {\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                center(Point.fromLngLat(-80.1263, 25.7845))\n                zoom(12.0)\n              }\n            },\n            style = {\n              MapboxStandardStyle(\n                standardStyleState = rememberStandardStyleState {\n                  configurationsState.apply {\n                    theme = ThemeValue.MONOCHROME\n                    lightPreset = LightPresetValue.NIGHT\n                  }\n                }\n              )\n            }\n          ) {\n            @OptIn(MapboxDelicateApi::class)\n            val bitmap = ImageBitmap.imageResource(R.drawable.miami_beach).asAndroidBitmap().toMapboxImage()\n            MapEffect(Unit) {\n              val imageSource: ImageSource = it.mapboxMap.getSourceAs(ID_IMAGE_SOURCE)!!\n              imageSource.updateImage(bitmap)\n            }\n            RasterLayer(\n              sourceState = rememberImageSourceState(sourceId = ID_IMAGE_SOURCE) {\n                coordinates = PointListValue(\n                  Point.fromLngLat(-80.11725, 25.7836),\n                  Point.fromLngLat(-80.1397431334, 25.783548),\n                  Point.fromLngLat(-80.13964, 25.7680),\n                  Point.fromLngLat(-80.11725, 25.76795)\n                )\n              }\n            ) {\n              rasterEmissiveStrength = DoubleValue(1.0)\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    private const val ID_IMAGE_SOURCE = \"image_source-id\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/InteractionsActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.wrapContentWidth\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.rememberMapState\nimport com.mapbox.maps.extension.compose.style.imports.rememberStyleImportState\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeatureStateKey\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\npublic class InteractionsActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    setContent {\n\n      var selectedPriceLabel by remember {\n        mutableStateOf<FeaturesetFeature<FeatureState>?>(null)\n      }\n\n      var isActive: Boolean? by remember {\n        // null as we do not know the initial state\n        mutableStateOf(null)\n      }\n\n      val mapState = rememberMapState()\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions(\n          cameraOptions {\n            center(Point.fromLngLat(-73.99, 40.72))\n            zoom(11.0)\n            pitch(45.0)\n          }\n        )\n      }\n\n      LaunchedEffect(selectedPriceLabel) {\n        selectedPriceLabel?.let {\n          val camera = mapViewportState.cameraForCoordinates(\n            listOf(it.geometry as Point),\n            cameraOptions {\n              padding(\n                EdgeInsets(100.0, 100.0, 100.0, 100.0)\n              )\n            },\n            maxZoom = 11.0\n          )\n          mapViewportState.flyTo(camera)\n        }\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold {\n          Box(modifier = Modifier.fillMaxSize()) {\n            MapboxMap(\n              modifier = Modifier.fillMaxSize(),\n              mapState = mapState,\n              mapViewportState = mapViewportState,\n              style = {\n                MapboxStandardStyle(\n                  standardStyleState = rememberStandardStyleState {\n                    interactionsState\n                      .onMapClicked {\n                        selectedPriceLabel?.removeFeatureState(FeatureStateKey.create(\"active\"))\n                        selectedPriceLabel = null\n                        isActive = null\n                        true\n                      }\n                  },\n                  styleImportsContent = {\n                    StyleImport(\n                      importId = \"realestate\",\n                      style = \"asset://fragment-realestate-NY.json\",\n                      styleImportState = rememberStyleImportState {\n                        interactionsState\n                          .onFeaturesetClicked(id = \"hotels-price\") { priceLabel, _ ->\n                            if (selectedPriceLabel?.id != priceLabel.id) {\n                              selectedPriceLabel?.removeFeatureState(FeatureStateKey.create(\"active\"))\n                              selectedPriceLabel = priceLabel\n                            }\n                            val newActiveState = priceLabel.state.getBooleanState(\"active\")?.not() ?: true\n                            priceLabel.setFeatureState(\n                              FeatureState {\n                                addBooleanState(\"active\", newActiveState)\n                              }\n                            ) {\n                              isActive = newActiveState\n                            }\n                            return@onFeaturesetClicked true\n                          }\n                      }\n                    )\n                  }\n                )\n              }\n            )\n            selectedPriceLabel?.let { actualSelectedPriceLabel ->\n              Text(\n                modifier = Modifier\n                  .wrapContentWidth()\n                  .align(Alignment.BottomCenter)\n                  .padding(40.dp)\n                  .border(2.dp, MaterialTheme.colors.secondary, CircleShape)\n                  .background(MaterialTheme.colors.primary, CircleShape)\n                  .padding(10.dp),\n                textAlign = TextAlign.Center,\n                color = Color.White,\n                text = \"Feature with id: ${actualSelectedPriceLabel.id!!}; active: $isActive\",\n              )\n            }\n          }\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/ModelLayerActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.layers.ModelIdValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.ModelLayer\nimport com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberGeoJsonSourceState\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.model.addModel\nimport com.mapbox.maps.extension.style.model.model\nimport com.mapbox.turf.TurfMeasurement\n\n/**\n * Showcase adding 3D models using model layer.\n */\n@OptIn(MapboxExperimental::class)\npublic class ModelLayerActivity : ComponentActivity() {\n\n  @OptIn(MapboxDelicateApi::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    setContent {\n      var showModelLayer by remember {\n        mutableStateOf(true)\n      }\n      var modelUri by remember {\n        mutableStateOf(SAMPLE_MODEL_URI_1)\n      }\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showModelLayer = !showModelLayer\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle model layers\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  modelUri =\n                    if (modelUri == SAMPLE_MODEL_URI_1) SAMPLE_MODEL_URI_2 else SAMPLE_MODEL_URI_1\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle model uri\")\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                center(TurfMeasurement.midpoint(MODEL1_COORDINATES, MAPBOX_HELSINKI))\n                zoom(CAMERA_ZOOM)\n                pitch(CAMERA_PITCH)\n              }\n            },\n          ) {\n            MapEffect(Unit) {\n              it.mapboxMap.apply {\n                addModel(model(MODEL_ID_1) { uri(SAMPLE_MODEL_URI_1) })\n                addModel(model(MODEL_ID_2) { uri(SAMPLE_MODEL_URI_2) })\n              }\n            }\n            if (showModelLayer) {\n              // Add model through data driven expression.\n              ModelLayer(\n                sourceState = rememberGeoJsonSourceState {\n                  data = GeoJSONData(\n                    listOf(\n                      Feature.fromGeometry(MODEL1_COORDINATES)\n                        .also { it.addStringProperty(MODEL_ID_KEY, MODEL_ID_1) },\n                      Feature.fromGeometry(MAPBOX_HELSINKI)\n                        .also { it.addStringProperty(MODEL_ID_KEY, MODEL_ID_2) }\n                    )\n                  )\n                }\n              ) {\n                modelId = ModelIdValue(Expression.get(MODEL_ID_KEY))\n                modelType = ModelTypeValue.COMMON_3D\n                modelScale = DoubleListValue(listOf(40.0, 40.0, 40.0))\n                modelTranslation = DoubleListValue(listOf(0.0, 0.0, 0.0))\n                modelRotation = DoubleListValue(listOf(0.0, 0.0, 90.0))\n                modelOpacity = DoubleValue(0.7)\n                modelAmbientOcclusionIntensity = DoubleValue(1.0)\n              }\n              // Add model through inlined model uri.\n              ModelLayer(\n                sourceState = rememberGeoJsonSourceState {\n                  data = GeoJSONData(CityLocations.HELSINKI)\n                }\n              ) {\n                modelId = ModelIdValue(modelId = MODEL_ID_3, uri = modelUri)\n                modelType = ModelTypeValue.COMMON_3D\n                modelScale = DoubleListValue(listOf(40.0, 40.0, 40.0))\n                modelAmbientOcclusionIntensity = DoubleValue(1.0)\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val CAMERA_ZOOM = 15.0\n    const val CAMERA_PITCH = 45.0\n    const val MODEL_ID_KEY = \"model-id-key\"\n    const val MODEL_ID_1 = \"model-id-1\"\n    const val MODEL_ID_2 = \"model-id-2\"\n    const val MODEL_ID_3 = \"model-id-3\"\n    const val SAMPLE_MODEL_URI_1 =\n      \"https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Embedded/Duck.gltf\"\n    const val SAMPLE_MODEL_URI_2 = \"asset://sportcar.glb\"\n    val MAPBOX_HELSINKI: Point = Point.fromLngLat(24.945389069265598, 60.17195694011002)\n    val MODEL1_COORDINATES: Point =\n      Point.fromLngLat(MAPBOX_HELSINKI.longitude() - 0.002, MAPBOX_HELSINKI.latitude() + 0.002)\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/PrecipitationsActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.MapStyle\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.RainState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.rememberRainState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.rememberSnowState\nimport com.mapbox.maps.extension.compose.style.rememberStyleState\n\n/**\n * Example to showcase usage of [RainState] and [SnowState].\n */\n@OptIn(MapboxExperimental::class)\npublic class PrecipitationsActivity : ComponentActivity() {\n\n  /**\n   * Describes the heaviness of precipitation.\n   */\n  public sealed class PrecipitationState(\n    public val intensity: Double,\n    public val density: Double,\n    public val opacity: Double,\n    public val text: String\n  ) {\n    public object None : PrecipitationState(intensity = 0.0, density = 0.0, opacity = 0.0, text = \"no\")\n\n    public object Light : PrecipitationState(intensity = 0.2, density = 0.2, opacity = 0.3, text = \"light\")\n\n    public object Medium : PrecipitationState(intensity = 0.6, density = 0.6, opacity = 0.5, text = \"medium\")\n\n    public object Heavy : PrecipitationState(intensity = 1.0, density = 1.0, opacity = 0.8, text = \"heavy\")\n\n    public fun toggleNext(): PrecipitationState {\n      return when (this) {\n        Heavy -> None\n        None -> Light\n        Light -> Medium\n        Medium -> Heavy\n      }\n    }\n  }\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    setContent {\n      var snowPrecipitationState: PrecipitationState by remember {\n        mutableStateOf(PrecipitationState.Light)\n      }\n\n      var rainPrecipitationState: PrecipitationState by remember {\n        mutableStateOf(PrecipitationState.Light)\n      }\n\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          pitch(PITCH)\n          bearing(BEARING)\n          center(CityLocations.HELSINKI)\n        }\n      }\n\n      val rainState = rememberRainState().also {\n        it.opacity = DoubleValue(rainPrecipitationState.opacity)\n        it.intensity = DoubleValue(rainPrecipitationState.intensity)\n        it.density = DoubleValue(rainPrecipitationState.density)\n      }\n\n      val snowState = rememberSnowState().also {\n        it.opacity = DoubleValue(snowPrecipitationState.opacity)\n        it.intensity = DoubleValue(snowPrecipitationState.intensity)\n        it.density = DoubleValue(snowPrecipitationState.density)\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  rainPrecipitationState = rainPrecipitationState.toggleNext()\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"${rainPrecipitationState.text} rain\"\n                )\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  snowPrecipitationState = snowPrecipitationState.toggleNext()\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"${snowPrecipitationState.text} snow\"\n                )\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = mapViewportState,\n            style = {\n              MapStyle(\n                style = Style.STANDARD,\n                styleState = rememberStyleState().apply {\n                  this.rainState =\n                    if (rainPrecipitationState == PrecipitationState.None) RainState.DISABLED else rainState\n                  this.snowState =\n                    if (snowPrecipitationState == PrecipitationState.None) SnowState.DISABLED else snowState\n                }\n              )\n            }\n          )\n        }\n      }\n    }\n  }\n\n  private companion object {\n    private const val ZOOM: Double = 16.0\n    private const val PITCH: Double = 40.0\n    private const val BEARING: Double = 70.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/StandardStyleActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.IntrinsicSize\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.ButtonDefaults\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.standard.LightPresetValue\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardSatelliteStyle\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.compose.style.standard.ThemeValue\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardSatelliteStyleState\nimport com.mapbox.maps.extension.compose.style.standard.rememberStandardStyleState\nimport com.mapbox.maps.extension.style.utils.transition\n\n/**\n * Example to showcase usage of the configs of `MapboxStandardStyle`.\n */\npublic class StandardStyleActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var isStandardSatellite by remember {\n        mutableStateOf(false)\n      }\n      var enableLandmarkIcons by remember {\n        mutableStateOf(true)\n      }\n      var enablePlaceLabels by remember {\n        mutableStateOf(true)\n      }\n      var enableRoadLabels by remember {\n        mutableStateOf(true)\n      }\n      var enablePointOfInterestLabels by remember {\n        mutableStateOf(true)\n      }\n      var enableTransitLabels by remember {\n        mutableStateOf(true)\n      }\n      var selectedLightPreset by remember {\n        mutableStateOf(LightPresetValue.DAY)\n      }\n      var selectedFont by remember {\n        mutableStateOf(\"DIN Pro\")\n      }\n      var selectedTheme by remember {\n        mutableStateOf(ThemeValue.DEFAULT)\n      }\n      var enable3dObjects by remember {\n        mutableStateOf(true)\n      }\n      var enableRoadsAndTransit by remember {\n        mutableStateOf(true)\n      }\n      var enablePedestrianRoads by remember {\n        mutableStateOf(true)\n      }\n      var enableAdminBoundaries by remember {\n        mutableStateOf(true)\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column(\n              modifier = Modifier.width(IntrinsicSize.Max)\n            ) {\n              Row(\n                modifier = Modifier.fillMaxWidth()\n              ) {\n                FloatingActionButton(\n                  modifier = Modifier\n                    .defaultMinSize(\n                      minWidth = ButtonDefaults.MinWidth,\n                      minHeight = ButtonDefaults.MinHeight\n                    )\n                    .padding(end = 4.dp),\n                  onClick = {\n                    if (!isStandardSatellite) {\n                      enableLandmarkIcons = !enableLandmarkIcons\n                    }\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                  backgroundColor = if (isStandardSatellite) Color.Gray else MaterialTheme.colors.secondary,\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"showLandmarkIcons: $enableLandmarkIcons\"\n                  )\n                }\n              }\n              Row(\n                modifier = Modifier.fillMaxWidth()\n              ) {\n                FloatingActionButton(\n                  modifier = Modifier\n                    .defaultMinSize(\n                      minWidth = ButtonDefaults.MinWidth,\n                      minHeight = ButtonDefaults.MinHeight\n                    )\n                    .padding(end = 4.dp),\n                  onClick = {\n                    enablePlaceLabels = !enablePlaceLabels\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"showPlaceLabels: $enablePlaceLabels\"\n                  )\n                }\n                FloatingActionButton(\n                  modifier = Modifier\n                  .defaultMinSize(\n                    minWidth = ButtonDefaults.MinWidth,\n                    minHeight = ButtonDefaults.MinHeight\n                  ),\n                  onClick = {\n                    enableRoadLabels = !enableRoadLabels\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"showRoadLabels: $enableRoadLabels\"\n                  )\n                }\n              }\n              Row(\n                modifier = Modifier.fillMaxWidth()\n              ) {\n                FloatingActionButton(\n                modifier = Modifier\n                  .defaultMinSize(\n                    minWidth = ButtonDefaults.MinWidth,\n                    minHeight = ButtonDefaults.MinHeight\n                  )\n                  .padding(end = 4.dp),\n                  onClick = {\n                    enableTransitLabels = !enableTransitLabels\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"showTransitLabels: $enableTransitLabels\"\n                  )\n                }\n                FloatingActionButton(\n                  modifier = Modifier\n                    .defaultMinSize(\n                      minWidth = ButtonDefaults.MinWidth,\n                      minHeight = ButtonDefaults.MinHeight\n                    ),\n                  onClick = {\n                    selectedFont = when (selectedFont) {\n                      \"DIN Pro\" -> \"Roboto\"\n                      else -> \"DIN Pro\"\n                    }\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"font: $selectedFont\"\n                  )\n                }\n              }\n              FloatingActionButton(\n                modifier = Modifier\n                  .defaultMinSize(\n                    minWidth = ButtonDefaults.MinWidth,\n                    minHeight = ButtonDefaults.MinHeight\n                  ),\n                onClick = {\n                  enablePointOfInterestLabels = !enablePointOfInterestLabels\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(6.dp),\n                  text = \"showPointOfInterestLabels: $enablePointOfInterestLabels\"\n                )\n              }\n              Row(\n                modifier = Modifier.fillMaxWidth()\n              ) {\n                FloatingActionButton(\n                  modifier = Modifier\n                      .defaultMinSize(\n                          minWidth = ButtonDefaults.MinWidth,\n                          minHeight = ButtonDefaults.MinHeight\n                      )\n                      .padding(end = 4.dp),\n                  onClick = {\n                    selectedLightPreset = when (selectedLightPreset) {\n                      LightPresetValue.DAY -> LightPresetValue.DUSK\n                      LightPresetValue.DUSK -> LightPresetValue.NIGHT\n                      LightPresetValue.NIGHT -> LightPresetValue.DAWN\n                      LightPresetValue.DAWN -> LightPresetValue.DAY\n                      else -> LightPresetValue.NIGHT\n                    }\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"lightPreset: ${selectedLightPreset.presetNameOrNull}\"\n                  )\n                }\n                FloatingActionButton(\n                  modifier = Modifier\n                      .defaultMinSize(\n                          minWidth = ButtonDefaults.MinWidth,\n                          minHeight = ButtonDefaults.MinHeight\n                      )\n                      .padding(end = 4.dp),\n                  onClick = {\n                    if (!isStandardSatellite) {\n                      selectedTheme = when (selectedTheme) {\n                        ThemeValue.DEFAULT -> ThemeValue.FADED\n                        ThemeValue.FADED -> ThemeValue.MONOCHROME\n                        ThemeValue.MONOCHROME -> ThemeValue.DEFAULT\n                        else -> ThemeValue.DEFAULT\n                      }\n                    }\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                  backgroundColor = if (isStandardSatellite) Color.Gray else MaterialTheme.colors.secondary,\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"selectedTheme: ${selectedTheme.presetNameOrNull}\"\n                  )\n                }\n              }\n              Row(\n                modifier = Modifier.fillMaxWidth()\n              ) {\n                FloatingActionButton(\n                  modifier = Modifier\n                      .defaultMinSize(\n                          minWidth = ButtonDefaults.MinWidth,\n                          minHeight = ButtonDefaults.MinHeight\n                      )\n                      .padding(end = 4.dp),\n                  onClick = {\n                    if (!isStandardSatellite) {\n                      enable3dObjects = !enable3dObjects\n                    }\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                  backgroundColor = if (isStandardSatellite) Color.Gray else MaterialTheme.colors.secondary,\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"show3dObjects:$enable3dObjects\"\n                  )\n                }\n                FloatingActionButton(\n                  modifier = Modifier\n                    .defaultMinSize(\n                      minWidth = ButtonDefaults.MinWidth,\n                      minHeight = ButtonDefaults.MinHeight\n                    ),\n                  onClick = {\n                    isStandardSatellite = !isStandardSatellite\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"selectedStyle:${\n                      if (isStandardSatellite) {\n                        \"SATELLITE\"\n                      } else {\n                        \"STANDARD\"\n                      }\n                    }\"\n                  )\n                }\n              }\n              Row(\n                modifier = Modifier.fillMaxWidth()\n              ) {\n                FloatingActionButton(\n                  modifier = Modifier\n                    .defaultMinSize(\n                      minWidth = ButtonDefaults.MinWidth,\n                      minHeight = ButtonDefaults.MinHeight\n                    ),\n                  onClick = {\n                    enableAdminBoundaries = !enableAdminBoundaries\n                  },\n                  shape = RoundedCornerShape(16.dp),\n                ) {\n                  Text(\n                    modifier = Modifier.padding(6.dp),\n                    text = \"enableAdminBoundaries: $enableAdminBoundaries\"\n                  )\n                }\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CityLocations.HELSINKI)\n                pitch(40.0)\n              }\n            },\n            style =\n            {\n              if (isStandardSatellite) {\n                MapboxStandardSatelliteStyle(\n                  standardSatelliteStyleState = rememberStandardSatelliteStyleState {\n                    styleTransition = transition {\n                      duration(1_000)\n                      enablePlacementTransitions(true)\n                    }\n                    configurationsState.apply {\n                      showPlaceLabels = BooleanValue(enablePlaceLabels)\n                      showRoadLabels = BooleanValue(enableRoadLabels)\n                      showPointOfInterestLabels = BooleanValue(enablePointOfInterestLabels)\n                      showTransitLabels = BooleanValue(enableTransitLabels)\n                      lightPreset = selectedLightPreset\n                      font = StringValue(selectedFont)\n                      showAdminBoundaries = BooleanValue(enableAdminBoundaries)\n                    }\n                  }\n                )\n              } else {\n                MapboxStandardStyle(\n                  standardStyleState = rememberStandardStyleState {\n                    interactionsState.onBuildingsClicked { clickedBuilding, _ ->\n                      clickedBuilding.setStandardBuildingsState {\n                        highlight(true)\n                      }\n                      return@onBuildingsClicked true\n                    }\n                    interactionsState.onLandmarkIconsClicked { clickedLandmarkIcon, _ ->\n                      println(\"Feature name: ${clickedLandmarkIcon.name}\")\n                      return@onLandmarkIconsClicked true\n                    }\n                    styleTransition = transition {\n                      duration(1_000)\n                      enablePlacementTransitions(true)\n                    }\n                    configurationsState.apply {\n                      showLandmarkIcons = BooleanValue(enableLandmarkIcons)\n                      showPlaceLabels = BooleanValue(enablePlaceLabels)\n                      showRoadLabels = BooleanValue(enableRoadLabels)\n                      showPointOfInterestLabels = BooleanValue(enablePointOfInterestLabels)\n                      showTransitLabels = BooleanValue(enableTransitLabels)\n                      lightPreset = selectedLightPreset\n                      font = StringValue(selectedFont)\n                      theme = selectedTheme\n                      show3dObjects = BooleanValue(enable3dObjects)\n                      showAdminBoundaries = BooleanValue(enableAdminBoundaries)\n                    }\n                  }\n                )\n              }\n            }\n          )\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val ZOOM: Double = 9.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/StyleCompositionActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.animation.core.AnimationVector3D\nimport androidx.compose.animation.core.TweenSpec\nimport androidx.compose.animation.core.TwoWayConverter\nimport androidx.compose.animation.core.animateValueAsState\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.MapStyle\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.FormattedValue\nimport com.mapbox.maps.extension.compose.style.layers.ImageValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue\nimport com.mapbox.maps.extension.compose.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.compose.style.rememberStyleImage\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberGeoJsonSourceState\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.switchCase\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.interactions.FeatureState\n\n/**\n * Example to showcase usage of runtime styling with compose.\n */\n@OptIn(MapboxExperimental::class)\npublic class StyleCompositionActivity : ComponentActivity() {\n  @OptIn(MapboxDelicateApi::class)\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var text by remember {\n        mutableStateOf(FormattedValue(\"Hello Helsinki\"))\n      }\n\n      var showSymbolLayer by remember {\n        mutableStateOf(true)\n      }\n\n      var styleUri by remember {\n        mutableStateOf(Style.STANDARD)\n      }\n\n      var centerLocation by rememberSaveable {\n        mutableStateOf(CityLocations.HELSINKI)\n      }\n\n      var symbolTextColor by remember {\n        mutableStateOf(Color.Red)\n      }\n\n      var markerResource by remember {\n        mutableStateOf(R.drawable.ic_red_marker)\n      }\n\n      val animatedLocation by animateValueAsState(\n        targetValue = centerLocation,\n        typeConverter = PointToVector,\n        animationSpec = TweenSpec(durationMillis = 1_000),\n        label = \"Animate location\"\n      )\n\n      val geoJsonSource = rememberGeoJsonSourceState {\n        generateId = BooleanValue(true)\n      }\n      geoJsonSource.data = GeoJSONData(animatedLocation)\n\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          center(CityLocations.HELSINKI)\n        }\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  text = FormattedValue(\"Hello ${count++}\")\n                  showSymbolLayer = !showSymbolLayer\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle visibility\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  centerLocation = centerLocation.shiftPosition()\n                  centerLocation = centerLocation.shiftPosition()\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Animate Source\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  markerResource =\n                    if (markerResource == R.drawable.ic_red_marker) R.drawable.ic_blue_marker else R.drawable.ic_red_marker\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle icon image\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  symbolTextColor = if (symbolTextColor == Color.Red) {\n                    Color.Yellow\n                  } else {\n                    Color.Red\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Animate text color transition\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  styleUri = if (styleUri == Style.LIGHT) {\n                    Style.STANDARD\n                  } else {\n                    Style.LIGHT\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Toggle Style\")\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = mapViewportState,\n            style = { MapStyle(style = styleUri) }\n          ) {\n            if (showSymbolLayer) {\n              CircleLayer(\n                sourceState = geoJsonSource,\n              ) {\n                interactionsState.onClicked { featuresetFeature, _ ->\n                  val selected = featuresetFeature.state.getBooleanState(\"selected\") ?: false\n                  featuresetFeature.setFeatureState(\n                    FeatureState {\n                      addBooleanState(\"selected\", !selected)\n                    }\n                  )\n                  true\n                }\n                circleColor = ColorValue(\n                  switchCase {\n                    boolean {\n                      featureState {\n                        literal(\"selected\")\n                      }\n                      literal(false)\n                    }\n                    literal(\"yellow\")\n                    literal(\"white\")\n                  }\n                )\n                circleRadius = DoubleValue(50.0)\n                circleRadiusTransition = Transition(durationMillis = 1000L)\n              }\n              val styleImage = rememberStyleImage(imageId = \"icon_id\", resourceId = markerResource)\n\n              SymbolLayer(\n                sourceState = geoJsonSource\n              ) {\n                iconImage = ImageValue(styleImage)\n                iconAnchor = IconAnchorValue.BOTTOM\n                textField = text\n                textColor = ColorValue(symbolTextColor)\n                textColorTransition = Transition(durationMillis = 1000)\n                textSize = DoubleValue(\n                  Expression.interpolate {\n                    linear()\n                    zoom()\n                    stop {\n                      literal(0.0)\n                      literal(10.0)\n                    }\n                    stop {\n                      literal(10.0)\n                      literal(20.0)\n                    }\n                  }\n                )\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun Point.shiftPosition(offset: Double = OFFSET): Point {\n    return Point.fromLngLat(longitude() + offset, latitude() + offset, altitude())\n  }\n\n  private companion object {\n    private val PointToVector: TwoWayConverter<Point, AnimationVector3D> =\n      TwoWayConverter(\n        {\n          AnimationVector3D(\n            it.longitude().toFloat(),\n            it.latitude().toFloat(),\n            if (it.altitude().isFinite()) it.altitude().toFloat() else 0f\n          )\n        },\n        { Point.fromLngLat(it.v1.toDouble(), it.v2.toDouble(), it.v3.toDouble()) }\n      )\n    const val ZOOM: Double = 9.0\n    private var count = 0\n    private const val OFFSET = 0.03\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/StyleImportsActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.R\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.GenericStyle\nimport com.mapbox.maps.extension.compose.style.importConfigs\nimport com.mapbox.maps.extension.compose.style.imports.rememberStyleImportState\nimport com.mapbox.maps.extension.compose.style.layers.generated.BackgroundLayer\nimport com.mapbox.maps.extension.compose.style.rememberColorTheme\nimport com.mapbox.maps.extension.compose.style.rememberStyleColorTheme\nimport com.mapbox.maps.extension.compose.style.slotsContent\nimport com.mapbox.maps.extension.style.color.colorTheme\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeatureStateKey\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * Example to showcase usage of style imports.\n */\n@OptIn(MapboxExperimental::class)\npublic class StyleImportsActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      var showSatelliteImport by remember {\n        mutableStateOf(true)\n      }\n      var showStandardImport by remember {\n        mutableStateOf(true)\n      }\n      var showBackgroundLayer by remember {\n        mutableStateOf(true)\n      }\n      val defaultColorTheme by remember {\n        mutableStateOf(colorTheme())\n      }\n      // creating monochrome StyleColorTheme from a drawable LUT resource\n      val monochromeColorTheme = rememberColorTheme(resourceId = R.drawable.monochrome_lut)\n      var useMonochromeThemeInStyleImport by remember {\n        mutableStateOf(false)\n      }\n      // holder for current color theme\n      val currentColorTheme by remember(useMonochromeThemeInStyleImport) {\n        mutableStateOf(\n          if (useMonochromeThemeInStyleImport) monochromeColorTheme else defaultColorTheme\n        )\n      }\n      val currentStyleColorTheme = rememberStyleColorTheme(currentColorTheme)\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showStandardImport = !showStandardImport\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle standard import to ${if (showStandardImport) \"disabled\" else \"enabled\"}\"\n                )\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showSatelliteImport = !showSatelliteImport\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle satellite import to ${if (showSatelliteImport) \"disabled\" else \"enabled\"}\"\n                )\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  showBackgroundLayer = !showBackgroundLayer\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle background layer at top slot to ${if (showBackgroundLayer) \"disabled\" else \"enabled\"}\"\n                )\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  useMonochromeThemeInStyleImport = !useMonochromeThemeInStyleImport\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Toggle import color theme\"\n                )\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions(\n                cameraOptions {\n                  center(Point.fromLngLat(-73.99, 40.72))\n                  zoom(11.0)\n                  pitch(45.0)\n                }\n              )\n            },\n            style = {\n              GenericStyle(\n                /*\n                 * Load the map with an empty style.\n                 * The map will use `StyleImport`s to load the desired styles.\n                 */\n                style = \"\",\n                styleImportsContent = {\n                  if (showStandardImport) {\n                    StyleImport(\n                      importId = STANDARD_STYLE_IMPORT_ID,\n                      style = \"asset://fragment-realestate-NY.json\",\n                      styleImportState = rememberStyleImportState {\n                        styleColorTheme = currentStyleColorTheme\n                        importConfigs = importConfigs {\n                          config(\"showTransitLabels\", Value(false))\n                        }\n                        var selectedPriceLabel: FeaturesetFeature<FeatureState>? =\n                          null\n                        interactionsState\n                          .onFeaturesetClicked(id = \"hotels-price\") { priceLabel, _ ->\n                            if (selectedPriceLabel?.id != priceLabel.id) {\n                              selectedPriceLabel?.removeFeatureState(FeatureStateKey.create(\"active\"))\n                              selectedPriceLabel = priceLabel\n                            }\n                            val isActive = (priceLabel.state.getBooleanState(\"active\") ?: false).not()\n                            priceLabel.setFeatureState(\n                              FeatureState {\n                                addBooleanState(\"active\", isActive)\n                              }\n                            )\n                            return@onFeaturesetClicked true\n                          }\n                          .onMapClicked {\n                            selectedPriceLabel?.removeFeatureState(FeatureStateKey.create(\"active\"))\n                            selectedPriceLabel = null\n                            true\n                          }\n                      }\n                    )\n                  }\n                  if (showSatelliteImport) {\n                    StyleImport(\n                      importId = SATELLITE_STYLE_IMPORT_ID,\n                      style = Style.STANDARD_SATELLITE,\n                      styleImportState = rememberStyleImportState()\n                    )\n                  }\n                },\n                slotsContent {\n                  slot(\"top\") {\n                    if (showBackgroundLayer) {\n                      BackgroundLayer {\n                        backgroundColor = ColorValue(Color.Red)\n                        backgroundOpacity = DoubleValue(0.5)\n                      }\n                    }\n                  }\n                }\n              )\n            }\n          )\n        }\n      }\n    }\n  }\n\n  private companion object {\n    const val STANDARD_STYLE_IMPORT_ID = \"standard\"\n    const val SATELLITE_STYLE_IMPORT_ID = \"satellite\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/StyleStatesActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.examples.utils.CityLocations\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.rememberAtmosphereState\nimport com.mapbox.maps.extension.compose.style.lights.LightsState\nimport com.mapbox.maps.extension.compose.style.lights.generated.rememberAmbientLightState\nimport com.mapbox.maps.extension.compose.style.lights.generated.rememberDirectionalLightState\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport com.mapbox.maps.extension.compose.style.standard.LightPresetValue\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport kotlin.math.round\nimport kotlin.random.Random\n\n/**\n * Example to showcase usage of [AtmosphereState] and [Projection].\n */\npublic class StyleStatesActivity : ComponentActivity() {\n\n  private val projections =\n  // Standard style default projection is GLOBE so we make sure that MERCATOR is before and after\n    // default so the map changes visually.\n    listOf(Projection.DEFAULT, Projection.MERCATOR, Projection.GLOBE, Projection.MERCATOR)\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n\n    setContent {\n\n      var starIntensityIncrease by remember {\n        mutableStateOf(true)\n      }\n\n      var currentProjectionIdx by rememberSaveable {\n        mutableStateOf(0)\n      }\n\n      var currentLightIdx by rememberSaveable {\n        mutableStateOf(0)\n      }\n\n      var currentLightPresetIdx by rememberSaveable {\n        mutableStateOf(0)\n      }\n\n      val initialAtmosphereState = rememberAtmosphereState {\n        spaceColor = ColorValue(Color.Black)\n        starIntensity = DoubleValue(0.8)\n        horizonBlend = DoubleValue(0.01)\n      }\n      val anotherAtmosphereState = rememberAtmosphereState {\n        spaceColor = randomColor()\n        horizonBlend = DoubleValue(0.2)\n        starIntensity = DoubleValue(0.0)\n      }\n\n      var currentAtmosphereState by remember {\n        mutableStateOf(initialAtmosphereState)\n      }\n\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          center(CityLocations.HELSINKI)\n        }\n      }\n\n      val directionalLightState = rememberDirectionalLightState {\n        color = ColorValue(Color.Yellow)\n        intensity = DoubleValue(0.9)\n        castShadows = BooleanValue(true)\n        direction = DoubleListValue(0.0, 15.0)\n      }\n      val ambientLightState = rememberAmbientLightState {\n        color = ColorValue(Color.White)\n        intensity = DoubleValue(0.5)\n      }\n\n      val dynamicLight = remember {\n        LightsState(directionalLightState, ambientLightState)\n      }\n\n      val lightsStates = remember {\n        listOf(LightsState.DEFAULT, dynamicLight)\n      }\n      val lightsStatesNames = remember {\n        listOf(\"default\", \"3d light\")\n      }\n      val lightsPresets = remember {\n        listOf(LightPresetValue.DAY, LightPresetValue.NIGHT)\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  var starIntensity = currentAtmosphereState.starIntensity.doubleOrNull!!\n                  if (starIntensityIncrease) {\n                    starIntensity += 0.1\n                  } else {\n                    starIntensity -= 0.1\n                  }\n                  starIntensity = (round(starIntensity * 100)) / 100.0\n                  if (starIntensity >= 1.0) {\n                    starIntensityIncrease = false\n                  }\n                  if (starIntensity <= 0.0) {\n                    starIntensityIncrease = true\n                  }\n                  currentAtmosphereState.starIntensity = DoubleValue(starIntensity)\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                val starIntensity = currentAtmosphereState.starIntensity.doubleOrNull!!\n                val action = if (starIntensityIncrease) \"Increase\" else \"Decrease\"\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"$action star intensity ($starIntensity)\"\n                )\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  currentAtmosphereState.spaceColor = randomColor()\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Change atmosphere to random color\")\n              }\n\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  currentLightIdx = (currentLightIdx + 1) % lightsStates.size\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Change Light to ${lightsStatesNames[(currentLightIdx + 1) % lightsStates.size]}\")\n              }\n              val enableLightColorBtn = lightsStates[currentLightIdx] != LightsState.DEFAULT\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                backgroundColor = if (enableLightColorBtn) MaterialTheme.colors.secondary else Color.LightGray,\n                onClick = {\n                  if (enableLightColorBtn) {\n                    directionalLightState.color = randomColor()\n                    ambientLightState.color = randomColor()\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Change Light to random color\")\n              }\n              val enableLightPresetBtn = lightsStates[currentLightIdx] == LightsState.DEFAULT\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                backgroundColor = if (enableLightPresetBtn) MaterialTheme.colors.secondary else Color.LightGray,\n                onClick = {\n                  if (enableLightPresetBtn) {\n                    currentLightPresetIdx = (currentLightPresetIdx + 1) % lightsPresets.size\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Change Light preset to ${lightsPresets[(currentLightPresetIdx + 1) % lightsPresets.size].presetNameOrNull}\")\n              }\n              val enableProjectionBt = (mapViewportState.cameraState?.zoom ?: Double.NaN) < 6.0\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                backgroundColor = if (enableProjectionBt) MaterialTheme.colors.secondary else Color.LightGray,\n                onClick = {\n                  if (enableProjectionBt) {\n                    currentProjectionIdx = (currentProjectionIdx + 1) % projections.size\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                val nextProjectionName =\n                  projections[(currentProjectionIdx + 1) % projections.size].projectionNameOrNull\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Change projection to $nextProjectionName\"\n                )\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  currentAtmosphereState = if (currentAtmosphereState == initialAtmosphereState)\n                    anotherAtmosphereState\n                  else\n                    initialAtmosphereState\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = \"Switch Atmosphere\"\n                )\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = mapViewportState,\n            style = {\n              MapboxStandardStyle(\n                projection = projections[currentProjectionIdx],\n                atmosphereState = currentAtmosphereState,\n                lightsState = lightsStates[currentLightIdx],\n              ) {\n                lightPreset = lightsPresets[currentLightPresetIdx]\n              }\n            }\n          )\n        }\n      }\n    }\n  }\n\n  private fun randomColor() = ColorValue(\n    Color(\n      Random.nextInt(255),\n      Random.nextInt(255),\n      Random.nextInt(255),\n    )\n  )\n\n  private companion object {\n    private const val ZOOM: Double = 1.0\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/style/TerrainActivity.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.style\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.compose.testapp.ExampleScaffold\nimport com.mapbox.maps.compose.testapp.ui.theme.MapboxMapComposeTheme\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.GenericStyle\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.rememberStyleState\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberRasterDemSourceState\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\nimport com.mapbox.maps.extension.compose.style.terrain.generated.rememberTerrainState\nimport kotlin.math.round\n\n/**\n * Example to showcase usage of terrain.\n */\npublic class TerrainActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n\n      val rasterDemSourceState = rememberRasterDemSourceState().apply {\n        url = StringValue(TERRAIN_URL_TILE_RESOURCE)\n        tileSize = LongValue(TILE_SIZE)\n      }\n\n      val customTerrainState = rememberTerrainState(rasterDemSourceState) {\n        exaggeration = DoubleValue(1.0)\n      }\n\n      var currentTerrainState by rememberSaveable(stateSaver = TerrainState.Saver) {\n        mutableStateOf(customTerrainState)\n      }\n\n      MapboxMapComposeTheme {\n        ExampleScaffold(\n          floatingActionButton = {\n            Column {\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                backgroundColor = if (currentTerrainState == TerrainState.DISABLED) Color.LightGray else MaterialTheme.colors.secondary,\n                onClick = {\n                  if (currentTerrainState != TerrainState.DISABLED) {\n                    var exaggeration = currentTerrainState.exaggeration.doubleOrNull!! + 0.2\n                    exaggeration = (round(exaggeration * 100)) / 100.0\n                    currentTerrainState.exaggeration = DoubleValue(exaggeration)\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(modifier = Modifier.padding(10.dp), text = \"Increase exaggeration (${currentTerrainState.exaggeration.doubleOrNull})\")\n              }\n              FloatingActionButton(\n                modifier = Modifier.padding(bottom = 10.dp),\n                onClick = {\n                  currentTerrainState = if (currentTerrainState == TerrainState.DISABLED) {\n                    customTerrainState\n                  } else {\n                    TerrainState.DISABLED\n                  }\n                },\n                shape = RoundedCornerShape(16.dp),\n              ) {\n                Text(\n                  modifier = Modifier.padding(10.dp),\n                  text = if (currentTerrainState == TerrainState.DISABLED)\n                    \"Enable terrain\"\n                  else\n                    \"Disable terrain\"\n                )\n              }\n            }\n          }\n        ) {\n          MapboxMap(\n            Modifier.fillMaxSize(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CENTER)\n                pitch(PITCH)\n              }\n            },\n            style = {\n              GenericStyle(\n                style = Style.STANDARD_SATELLITE,\n                styleState = rememberStyleState {\n                  terrainState = currentTerrainState\n                },\n              )\n            }\n          )\n        }\n      }\n    }\n  }\n\n  private companion object {\n    private const val TILE_SIZE = 514L\n    private const val ZOOM: Double = 11.0\n    private const val PITCH: Double = 80.0\n    private val CENTER = Point.fromLngLat(138.7274, 35.3606)\n    private const val TERRAIN_URL_TILE_RESOURCE = \"mapbox://mapbox.mapbox-terrain-dem-v1\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/utils/AnnotationUtils.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.utils\n\nimport android.content.Context\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.logE\nimport okhttp3.Cache\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport java.io.BufferedReader\nimport java.io.File\nimport java.io.IOException\nimport java.io.InputStreamReader\nimport java.nio.charset.Charset\nimport java.util.*\n\n/**\n * Useful utilities used throughout the testapp.\n */\ninternal object AnnotationUtils {\n  private const val TAG = \"AnnotationUtils\"\n  val STYLES =\n    arrayOf(Style.MAPBOX_STREETS, Style.OUTDOORS, Style.LIGHT, Style.DARK, Style.SATELLITE_STREETS)\n\n  /**\n   * Utility for getting a list of random points.\n   *\n   * @return a a list of random points\n   */\n  fun createRandomPoints(): List<Point> {\n    val random = Random()\n    val points: MutableList<Point> = ArrayList<Point>()\n    for (i in 0 until random.nextInt(8) + 2) {\n      points.add(\n        Point.fromLngLat(\n          random.nextDouble() * -360.0 + 180.0,\n          random.nextDouble() * -180.0 + 90.0\n        )\n      )\n    }\n    return points\n  }\n\n  /**\n   * Utility for getting a list of lists of random points\n   *\n   * @return a list of lists of random points\n   */\n  fun createRandomPointsList(): List<List<Point>> {\n    val random = Random()\n    val points = mutableListOf<Point>()\n    val firstLast = Point.fromLngLat(\n      random.nextDouble() * -360.0 + 180.0,\n      random.nextDouble() * -180.0 + 90.0\n    )\n    points.add(firstLast)\n    for (i in 0 until random.nextInt(6) + 4) {\n      points.add(\n        Point.fromLngLat(\n          random.nextDouble() * -360.0 + 180.0,\n          random.nextDouble() * -180.0 + 90.0\n        )\n      )\n    }\n    points.add(firstLast)\n    return listOf(points)\n  }\n\n  /**\n   * Utility for getting a random point\n   *\n   * @return a random point\n   */\n  fun createRandomPoint(): Point {\n    val random = Random()\n    return Point.fromLngLat(\n      random.nextDouble() * -360.0 + 180.0,\n      random.nextDouble() * -180.0 + 90.0\n    )\n  }\n\n  /**\n   * Load the string content from a assets file\n   *\n   * @param context the context\n   * @param fileName the file to load\n   */\n  fun loadStringFromAssets(context: Context, fileName: String): String? {\n    return try {\n      val inputStream = context.assets.open(fileName)\n      val rd = BufferedReader(InputStreamReader(inputStream, Charset.forName(\"UTF-8\")))\n      val sb = StringBuilder()\n      rd.forEachLine {\n        sb.append(it)\n      }\n      sb.toString()\n    } catch (e: IOException) {\n      logE(TAG, \"Unable to parse $fileName\")\n      null\n    }\n  }\n\n  /**\n   * Load the string content from net\n   *\n   * @param url the url of the file to load\n   */\n  fun loadStringFromNet(context: Context, url: String): String? {\n    val client = OkHttpClient.Builder()\n      .cache(Cache(File(context.externalCacheDir.toString(), \"cache\"), 10 * 1024 * 1024L))\n      .build()\n    val request: Request = Request.Builder()\n      .url(url)\n      .build()\n\n    return try {\n      val response = client.newCall(request).execute()\n      if (!response.isSuccessful) {\n        logE(TAG, \"HTTP error ${response.code} for $url\")\n        response.close()\n        return null\n      }\n      response.body?.string()\n    } catch (e: IOException) {\n      logE(TAG, \"Unable to download $url\")\n      null\n    }\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/utils/CityLocations.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.utils\n\nimport com.mapbox.geojson.Point\n\ninternal object CityLocations {\n  val HELSINKI: Point = Point.fromLngLat(24.941526986277893, 60.17099952463323)\n  val BERLIN = Point.fromLngLat(13.403, 52.562)\n  val KYIV = Point.fromLngLat(30.498, 50.541)\n  val WASHINGTON = Point.fromLngLat(-77.00897, 38.87031)\n  val NULLISLAND = Point.fromLngLat(0.0, 0.0)\n}\n\n/**\n * Produce a new [Point] that offsets [offset] in both latitude and longitude.\n */\ninternal fun Point.offset(offset: Double = 0.01) =\n  Point.fromLngLat(longitude() + offset, latitude() + offset)"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/utils/PermissionUtils.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.utils\n\nimport android.content.Context\nimport android.content.pm.PackageManager\nimport androidx.activity.compose.ManagedActivityResultLauncher\nimport androidx.activity.compose.rememberLauncherForActivityResult\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.core.content.ContextCompat\n\n@Composable\npublic fun RequestLocationPermission(\n  requestCount: Int = 0,\n  onPermissionDenied: () -> Unit,\n  onPermissionReady: () -> Unit\n) {\n  val context = LocalContext.current\n  val launcher = rememberLauncherForActivityResult(\n    contract = ActivityResultContracts.RequestMultiplePermissions(),\n  ) { permissionsMap ->\n    val granted = permissionsMap.values.all { it }\n    if (granted) {\n      onPermissionReady()\n    } else {\n      onPermissionDenied()\n    }\n  }\n  LaunchedEffect(requestCount) {\n    context.checkAndRequestLocationPermission(\n      locationPermissions,\n      launcher,\n      onPermissionReady\n    )\n  }\n}\n\nprivate fun Context.checkAndRequestLocationPermission(\n  permissions: Array<String>,\n  launcher: ManagedActivityResultLauncher<Array<String>, Map<String, Boolean>>,\n  onPermissionReady: () -> Unit\n) {\n  if (permissions.all {\n      ContextCompat.checkSelfPermission(\n        this,\n        it\n      ) == PackageManager.PERMISSION_GRANTED\n    }\n  ) {\n    onPermissionReady()\n  } else {\n    launcher.launch(permissions)\n  }\n}\n\nprivate val locationPermissions = arrayOf(\n  android.Manifest.permission.ACCESS_FINE_LOCATION,\n  android.Manifest.permission.ACCESS_COARSE_LOCATION\n)"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/examples/utils/SimulateRouteLocationProvider.kt",
    "content": "package com.mapbox.maps.compose.testapp.examples.utils\n\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.plugin.locationcomponent.LocationConsumer\nimport com.mapbox.maps.plugin.locationcomponent.LocationProvider\nimport com.mapbox.turf.TurfConstants\nimport com.mapbox.turf.TurfMeasurement\nimport com.mapbox.turf.TurfMisc\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.cancelAndJoin\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.util.concurrent.CopyOnWriteArraySet\n\n/**\n * A location provider implementation that takes in a line string as route and animate the location\n * updates along the route.\n */\npublic class SimulateRouteLocationProvider(\n  private val route: LineString,\n) : LocationProvider {\n  private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)\n  private var emitLocationsJob: Job? = null\n  private val totalRouteLength by lazy { TurfMeasurement.length(route, TurfConstants.UNIT_CENTIMETERS) }\n  private val routeStartPoint = Point.fromLngLat(\n    route.flattenCoordinates().flattenLngLatArray[0],\n    route.flattenCoordinates().flattenLngLatArray[1]\n  )\n  private val locationConsumers = CopyOnWriteArraySet<LocationConsumer>()\n  private var isFakeLocationEmitting = false\n\n  override fun registerLocationConsumer(locationConsumer: LocationConsumer) {\n    locationConsumers.add(locationConsumer)\n    if (!isFakeLocationEmitting) {\n      emitFakeLocations()\n      isFakeLocationEmitting = true\n    }\n  }\n\n  override fun unRegisterLocationConsumer(locationConsumer: LocationConsumer) {\n    locationConsumers.remove(locationConsumer)\n    if (locationConsumers.isEmpty()) {\n      emitLocationsJob?.cancel()\n      isFakeLocationEmitting = false\n    }\n  }\n\n  private fun emitFakeLocations() {\n    val previousEmitLocationsJob = emitLocationsJob\n    emitLocationsJob = scope.launch {\n      // Make sure previous job is cancelled before starting a new one\n      previousEmitLocationsJob?.cancelAndJoin()\n      val flattenCoordinates = route.flattenCoordinates()\n      var lastLocation: Point = routeStartPoint\n      var nextLocationIdx = 1\n      val flattenLngLatArray = flattenCoordinates.flattenLngLatArray\n      while (isActive && nextLocationIdx < flattenCoordinates.size()) {\n        val point = Point.fromLngLat(\n          flattenLngLatArray[nextLocationIdx * 2],\n          flattenLngLatArray[(nextLocationIdx * 2) + 1]\n        ).insertProgressInfo()\n        val bearing = TurfMeasurement.bearing(lastLocation, point)\n        lastLocation = point\n        nextLocationIdx++\n\n        withContext(Dispatchers.Main) {\n          locationConsumers.forEach { it.onLocationUpdated(point) }\n          locationConsumers.forEach { it.onBearingUpdated(bearing) }\n        }\n        delay(LOCATION_UPDATE_INTERVAL_MS)\n      }\n    }\n  }\n\n  // use altitude of Point to pass through progress data, and use internal animator to interpolate\n  // the progress, thus reduce the overhead to calculate the progress on each frame.\n  private fun Point.insertProgressInfo() = Point.fromLngLat(\n    longitude(),\n    latitude(),\n    TurfMeasurement.length(\n      TurfMisc.lineSlice(routeStartPoint, this, route),\n      TurfConstants.UNIT_CENTIMETERS\n    ) / totalRouteLength\n  )\n\n  private companion object {\n    const val LOCATION_UPDATE_INTERVAL_MS = 1000L\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/ui/theme/Color.kt",
    "content": "package com.mapbox.maps.compose.testapp.ui.theme\n\nimport androidx.compose.ui.graphics.Color\n\npublic val Purple200: Color = Color(0xFFBB86FC)\npublic val Purple500: Color = Color(0xFF6200EE)\npublic val Purple700: Color = Color(0xFF3700B3)\npublic val Teal200: Color = Color(0xFF03DAC5)"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/ui/theme/Shape.kt",
    "content": "package com.mapbox.maps.compose.testapp.ui.theme\n\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.Shapes\nimport androidx.compose.ui.unit.dp\n\npublic val Shapes: Shapes = Shapes(\n  small = RoundedCornerShape(4.dp),\n  medium = RoundedCornerShape(4.dp),\n  large = RoundedCornerShape(0.dp)\n)"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/ui/theme/Theme.kt",
    "content": "package com.mapbox.maps.compose.testapp.ui.theme\n\nimport androidx.compose.foundation.isSystemInDarkTheme\nimport androidx.compose.material.MaterialTheme\nimport androidx.compose.material.darkColors\nimport androidx.compose.material.lightColors\nimport androidx.compose.runtime.Composable\n\nprivate val DarkColorPalette = darkColors(\n  primary = Purple200,\n  primaryVariant = Purple700,\n  secondary = Teal200\n)\n\nprivate val LightColorPalette = lightColors(\n  primary = Purple500,\n  primaryVariant = Purple700,\n  secondary = Teal200\n)\n\n@Composable\npublic fun MapboxMapComposeTheme(\n  darkTheme: Boolean = isSystemInDarkTheme(),\n  content: @Composable () -> Unit\n) {\n  val colors = if (darkTheme) {\n    DarkColorPalette\n  } else {\n    LightColorPalette\n  }\n\n  MaterialTheme(\n    colors = colors,\n    typography = Typography,\n    shapes = Shapes,\n    content = content\n  )\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/ui/theme/Type.kt",
    "content": "package com.mapbox.maps.compose.testapp.ui.theme\n\nimport androidx.compose.material.Typography\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.sp\n\npublic val Typography: Typography = Typography(\n  body1 = TextStyle(\n    fontFamily = FontFamily.Default,\n    fontWeight = FontWeight.Normal,\n    fontSize = 16.sp\n  )\n)"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/utils/FrameStatsRecorder.kt",
    "content": "package com.mapbox.maps.compose.testapp.utils\n\nimport android.content.Context\nimport android.widget.Toast\nimport androidx.compose.runtime.Composable\nimport com.google.gson.Gson\nimport com.google.gson.JsonObject\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.DisposableMapEffect\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.renderer.RenderThreadStatsRecorder\nimport kotlinx.coroutines.DelicateCoroutinesApi\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.math.BigDecimal\nimport java.math.RoundingMode\n\n/**\n * Utility class to record [MapView] frame stats.\n */\n@OptIn(MapboxExperimental::class)\npublic class FrameStatsRecorder {\n\n  private lateinit var recorder: RenderThreadStatsRecorder\n  private var writeSummaryJob: Job = Job().apply { cancel() }\n\n  public fun register(mapView: MapView) {\n    recorder = RenderThreadStatsRecorder()\n    mapView.setRenderThreadStatsRecorder(recorder)\n    recorder.start()\n  }\n\n  private fun getStatisticalModel(): JsonObject {\n    val stats = recorder.end()\n    val jsonObject = JsonObject()\n    // for TTRC SLAs no recorded render calls happen after \"CreateMap\" command\n    // so we return an empty JSON\n    if (stats.totalFrames == 0L) {\n      return jsonObject\n    }\n    jsonObject.addProperty(KEY_TOTAL_FRAMES, stats.totalFrames)\n    jsonObject.addProperty(KEY_TOTAL_TIME, stats.totalTime)\n    jsonObject.addProperty(KEY_DROPPED, stats.totalDroppedFrames)\n    jsonObject.addProperty(\n      KEY_DROPPED_PERCENT,\n      BigDecimal\n        .valueOf((stats.totalDroppedFrames.toDouble() / stats.totalFrames) * 100.0)\n        .setScale(2, RoundingMode.HALF_UP)\n        .toDouble()\n    )\n    jsonObject.addProperty(KEY_AVERAGE, stats.frameTimeList.average())\n    jsonObject.addProperty(KEY_PERCENTILE_50, stats.percentile50)\n    jsonObject.addProperty(KEY_PERCENTILE_90, stats.percentile90)\n    jsonObject.addProperty(KEY_PERCENTILE_95, stats.percentile95)\n    jsonObject.addProperty(KEY_PERCENTILE_99, stats.percentile99)\n    return jsonObject\n  }\n\n  public fun stop(mapView: MapView) {\n    writeSummary(mapView.context, getStatisticalModel())\n  }\n\n  @OptIn(DelicateCoroutinesApi::class)\n  private fun writeSummary(context: Context, jsonObject: JsonObject) {\n    val stats = Gson().toJson(jsonObject)\n    writeSummaryJob = GlobalScope.launch(Dispatchers.IO) {\n      StorageUtils(context).writeToFile(\n        FRAME_LOG_JSON_NAME,\n        stats\n      )\n\n      logI(TAG, stats)\n      withContext(Dispatchers.Main) {\n        Toast.makeText(context, stats, Toast.LENGTH_LONG).show()\n      }\n    }\n  }\n\n  private companion object {\n    private const val FRAMESTATS = \"framestats\"\n    const val KEY_TOTAL_FRAMES = \"${FRAMESTATS}_frames\"\n    const val KEY_TOTAL_TIME = \"${FRAMESTATS}_time\"\n    const val KEY_AVERAGE = \"${FRAMESTATS}_average\"\n    const val KEY_DROPPED = \"${FRAMESTATS}_dropped\"\n    const val KEY_DROPPED_PERCENT = \"${FRAMESTATS}_dropped_percentage\"\n    const val KEY_PERCENTILE_50 = \"${FRAMESTATS}_50_percentile\"\n    const val KEY_PERCENTILE_90 = \"${FRAMESTATS}_90_percentile\"\n    const val KEY_PERCENTILE_95 = \"${FRAMESTATS}_95_percentile\"\n    const val KEY_PERCENTILE_99 = \"${FRAMESTATS}_99_percentile\"\n    private const val FRAME_LOG_JSON_NAME = \"frame_log.json\"\n    private const val TAG = \"FrameStatsRecorder\"\n  }\n}\n\n/**\n * Record the MapboxMap's frame stats to identify potential performance changes.\n *\n * The composable function is a [MapboxMapComposable] which means it should be used within [MapboxMap] composable.\n *\n * When used, the [FrameStatsRecorder] will start logging frame stats once the map enters composition, and the recorder\n * will be stopped when [MapboxMap] leaves composition. Result will be printed in logcat and also saved on disk.\n */\n@MapboxMapComposable\n@Composable\npublic fun RecordFrameStats() {\n  DisposableMapEffect(Unit) {\n    val frameStatsRecorder = FrameStatsRecorder()\n    frameStatsRecorder.register(it)\n    onDispose {\n      frameStatsRecorder.stop(it)\n    }\n  }\n}"
  },
  {
    "path": "compose-app/src/main/java/com/mapbox/maps/compose/testapp/utils/StorageUtils.kt",
    "content": "package com.mapbox.maps.compose.testapp.utils\n\nimport android.content.Context\nimport java.io.BufferedWriter\nimport java.io.File\nimport java.io.FileWriter\n\npublic class StorageUtils(context: Context) {\n  private val directory: File = File(context.filesDir, LOG_DIR)\n    .apply { mkdirs() }\n\n  public fun fileExists(fileName: String): Boolean {\n    val deviceInfo = File(directory, fileName)\n    return deviceInfo.exists() && deviceInfo.length() > 0\n  }\n\n  public fun writeToFile(fileName: String, content: String) {\n    val file = File(directory, fileName).apply { delete() }\n    file.write(content)\n  }\n\n  private fun File.write(results: String) {\n    val fw = FileWriter(this, true)\n    val writer = BufferedWriter(fw)\n    writer.write(results)\n    writer.close()\n    fw.close()\n  }\n\n  public companion object {\n    public const val LOG_DIR: String = \"logs\"\n  }\n}"
  },
  {
    "path": "compose-app/src/main/res/drawable/arrow_straight.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"48\"\n    android:viewportHeight=\"48\">\n  <group>\n    <clip-path\n        android:pathData=\"M0,0h48v48h-48z\"/>\n    <path\n        android:pathData=\"M20,14C20,12.895 20.895,12 22,12H26C27.105,12 28,12.895 28,14V46C28,47.105 27.105,48 26,48H22C20.895,48 20,47.105 20,46V14Z\"\n        android:fillColor=\"#3D3D3D\"/>\n    <path\n        android:pathData=\"M10.87,18.696L22.336,1.496C23.128,0.309 24.872,0.309 25.664,1.496L37.13,18.696C38.144,20.217 36.755,22.189 34.981,21.745L24.485,19.121C24.167,19.042 23.833,19.042 23.515,19.121L13.019,21.745C11.245,22.189 9.856,20.217 10.87,18.696Z\"\n        android:fillColor=\"#3D3D3D\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "compose-app/src/main/res/drawable/bg_dva_eta.xml",
    "content": "<vector\n    android:viewportHeight=\"50\"\n    android:viewportWidth=\"100\"\n    android:height=\"50dp\"\n    android:width=\"100dp\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#4264fb\"\n        android:pathData=\"M0,0 L20,5 L85,5 Q90,5 90,10 L90,10 L90,40 Q90,45 85,45 L85,45 L15,45 Q10,45 10,40 L10,40 L10,10z\"/>\n</vector>\n"
  },
  {
    "path": "compose-app/src/main/res/drawable/bg_dva_parking.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"#FFFFFFFF\"/>\n    <corners android:radius=\"30dp\"/>\n</shape>"
  },
  {
    "path": "compose-app/src/main/res/drawable/ic_blue_marker.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"52dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"52\">\n  <path\n      android:pathData=\"M11.25,39.063a8.75,2.188 0,1 0,17.5 0a8.75,2.188 0,1 0,-17.5 0z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"0.3\"/>\n  <path\n      android:pathData=\"M27.917,29.259C31.504,25.178 35,21.201 35,15C35,6.716 28.284,0 20,0C11.716,0 5,6.716 5,15C5,21.201 8.496,25.178 12.083,29.259C14.655,32.183 17.273,35.161 18.685,39.051C18.888,39.608 19.406,40 20,40C20.594,40 21.112,39.608 21.315,39.051C22.727,35.161 25.345,32.183 27.917,29.259Z\"\n      android:fillColor=\"#3064F5\"/>\n  <path\n      android:pathData=\"M25.5,15C25.5,18.038 23.038,20.5 20,20.5C16.962,20.5 14.5,18.038 14.5,15C14.5,11.962 16.962,9.5 20,9.5C23.038,9.5 25.5,11.962 25.5,15Z\"\n      android:fillColor=\"#ffffff\"/>\n</vector>\n"
  },
  {
    "path": "compose-app/src/main/res/drawable/ic_red_marker.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"52dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"52\">\n  <path\n      android:pathData=\"M11.25,39.063a8.75,2.188 0,1 0,17.5 0a8.75,2.188 0,1 0,-17.5 0z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"0.3\"/>\n  <path\n      android:pathData=\"M27.917,29.259C31.504,25.178 35,21.201 35,15C35,6.716 28.284,0 20,0C11.716,0 5,6.716 5,15C5,21.201 8.496,25.178 12.083,29.259C14.655,32.183 17.273,35.161 18.685,39.051C18.888,39.608 19.406,40 20,40C20.594,40 21.112,39.608 21.315,39.051C22.727,35.161 25.345,32.183 27.917,29.259Z\"\n      android:fillColor=\"#EB252A\"/>\n  <path\n      android:pathData=\"M25.5,15C25.5,18.038 23.038,20.5 20,20.5C16.962,20.5 14.5,18.038 14.5,15C14.5,11.962 16.962,9.5 20,9.5C23.038,9.5 25.5,11.962 25.5,15Z\"\n      android:fillColor=\"#ffffff\"/>\n</vector>\n"
  },
  {
    "path": "compose-app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "compose-app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <color name=\"purple_200\">#FFBB86FC</color>\n  <color name=\"purple_500\">#FF6200EE</color>\n  <color name=\"purple_700\">#FF3700B3</color>\n  <color name=\"teal_200\">#FF03DAC5</color>\n  <color name=\"teal_700\">#FF018786</color>\n  <color name=\"black\">#FF000000</color>\n  <color name=\"white\">#FFFFFFFF</color>\n</resources>"
  },
  {
    "path": "compose-app/src/main/res/values/example_categories.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"category\">category</string>\n    <string name=\"category_basic\">Basic</string>\n    <string name=\"category_custom_layer\">Custom layer</string>\n    <string name=\"category_styles\">Styles</string>\n    <string name=\"category_integration\">Integration</string>\n    <string name=\"category_gestures\">Gestures</string>\n    <string name=\"category_snapshot\">Snapshot</string>\n    <string name=\"category_location\">Location</string>\n    <string name=\"category_config\">Map configuration</string>\n    <string name=\"category_lab\">Lab</string>\n    <string name=\"category_camera\">Camera</string>\n    <string name=\"category_offline\">Offline</string>\n    <string name=\"category_sky\">Sky</string>\n    <string name=\"category_annotation\">Annotation</string>\n    <string name=\"category_3D\">3D</string>\n    <string name=\"category_viewport\">Viewport</string>\n    <string name=\"category_lines_and_polygons\">Lines and polygons</string>\n    <string name=\"category_markers_and_callouts\">Markers and callouts</string>\n    <string name=\"category_data_visualization\">Data Visualization</string>\n    <string name=\"category_globe\">Globe and atmosphere</string>\n    <string name=\"category_ornaments\">Ornaments</string>\n</resources>"
  },
  {
    "path": "compose-app/src/main/res/values/example_descriptions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"description_simple_map\">Create and display a map that uses the default Mapbox streets style. This example also shows how to update the starting camera for a map.</string>\n    <string name=\"description_debug_mode\">Use variations of debug modes of the Map</string>\n    <string name=\"description_markers\">Add Markers on the Map</string>\n    <string name=\"description_circle_annotation\">Add CircleAnnotation on the Map</string>\n    <string name=\"description_point_annotation\">Add PointAnnotation on the Map</string>\n    <string name=\"description_point_annotation_cluster\">Add PointAnnotation cluster on the Map</string>\n    <string name=\"description_polygon_annotation\">Add PolygonAnnotation on the Map</string>\n    <string name=\"description_polyline_annotation\">Add PolylineAnnotation on the Map</string>\n    <string name=\"description_view_annotation\">Add ViewAnnotation on the Map</string>\n    <string name=\"description_dynamic_view_annotation\">Showcase using dynamic ViewAnnotation</string>\n    <string name=\"description_map_viewport_animation\">Use map viewport animations</string>\n    <string name=\"description_multiple_display\">Display the map on a secondary display</string>\n    <string name=\"description_ornaments_customisation\">Customise ornaments of the Map</string>\n    <string name=\"description_custom_attribution\">Customise attribution of the Map</string>\n    <string name=\"description_location_location_component\">Show Location on the Map</string>\n    <string name=\"description_style_composition\">Runtime styling with style composition</string>\n    <string name=\"description_navigation_simulation\">Simulate navigation experience with compose</string>\n    <string name=\"description_multi_map\">Showcase displaying two maps in the same Activity</string>\n    <string name=\"description_style_states\">Showcase using style states</string>\n    <string name=\"description_style_positions\">Showcase usage of slotsContent and layerPositionedContent to arrange contents within the base style using GenericStyle API.</string>\n    <string name=\"description_model_layer\">Showcase the usage of a 3D model layer.</string>\n    <string name=\"description_style_image_source\">Use an image source to easily display images on the map.</string>\n    <string name=\"description_animated_image_source\">Load a raster image to a style using ImageSource and display it on a map as animated weather data using RasterLayer.</string>\n    <string name=\"description_terrain\">Add terrain on top of raster-dem source</string>\n    <string name=\"description_style_imports\">Showcase usage of style imports</string>\n    <string name=\"description_query_rendered_feature\">Showcase usage of query rendered features</string>\n    <string name=\"description_standard_style\">Showcase usage of Standard style</string>\n    <string name=\"description_clip_layer\">Showcase the usage of clip layer.</string>\n    <string name=\"description_interactions\">Showcase the interactions.</string>\n    <string name=\"description_appearances\">Change icon images dynamically using the Appearances API with feature-state</string>\n    <string name=\"description_custom_vector_icons\">Dynamically style vector icons with custom colors and interactively change their size on tap</string>\n    <string name=\"description_precipitations\">Showcase the rain and snow effects.</string>\n    <string name=\"description_color_theme\">Showcase color theme.</string>\n    <string name=\"description_elevated_line\">Showcase line elevation</string>\n    <string name=\"description_3d_model_feature_state_interactions\">Use a style-driven method for overriding the materials and orientation of model parts using the model layer and model-source.</string>\n    <string name=\"description_animated_3d_model\">Animate a 3D airplane model along a flight path with animated propellers, landing gear, and lights using feature state.</string>\n    <string name=\"description_accessibility_scale\">Automatic map symbol scaling based on system font size preferences</string>\n    <string name=\"description_edge_to_edge\">Showcase edge-to-edge layout using Jetpack Compose with proper handling of system insets (system bars, navigation bars, and display cutouts).</string>\n    <string name=\"description_lazy_column_map\">Showcase MapboxMap inside a LazyColumn with correct scroll lifecycle management.</string>\n</resources>\n"
  },
  {
    "path": "compose-app/src/main/res/values/example_titles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"activity_simple_map\">Display a map view</string>\n    <string name=\"activity_debug_mode\">Debug mode</string>\n    <string name=\"activity_markers\">Markers</string>\n    <string name=\"activity_circle_annotation\">Circle Annotation</string>\n    <string name=\"activity_point_annotation\">Point Annotation</string>\n    <string name=\"activity_point_annotation_cluster\">Point Annotation Clustering</string>\n    <string name=\"activity_polygon_annotation\">Polygon Annotation</string>\n    <string name=\"activity_polyline_annotation\">Polyline Annotation</string>\n    <string name=\"activity_view_annotation\">View annotation</string>\n    <string name=\"activity_dynamic_view_annotation\">Dynamic view annotation</string>\n    <string name=\"activity_map_viewport_animation\">Map Viewport animation</string>\n    <string name=\"activity_multiple_display\">Multi display</string>\n    <string name=\"activity_ornaments_customisation\">Ornament customisation</string>\n    <string name=\"activity_custom_attribution\">Custom attribution</string>\n    <string name=\"activity_location_location_component\">Location Component</string>\n    <string name=\"activity_style_composition\">Style composition</string>\n    <string name=\"activity_navigation_simulation\">Simulate navigation</string>\n    <string name=\"activity_multi_map\">Display multiple maps</string>\n    <string name=\"activity_style_states\">Style States</string>\n    <string name=\"activity_style_positions\">Position content using GenericStyle</string>\n    <string name=\"activity_model_layer\">Display 3D model in a model layer</string>\n    <string name=\"activity_style_image_source_title\">Use an image source</string>\n    <string name=\"activity_animated_image_source\">Add animated weather data</string>\n    <string name=\"activity_terrain\">Terrain</string>\n    <string name=\"activity_style_imports\">Style imports</string>\n    <string name=\"activity_query_rendered_feature\">Query rendered feature</string>\n    <string name=\"activity_standard_style\">Standard style</string>\n    <string name=\"activity_clip_layer\">Clip layer example</string>\n    <string name=\"activity_interactions\">Interactions example</string>\n    <string name=\"activity_appearances\">Appearances</string>\n    <string name=\"activity_custom_vector_icons\">Custom Vector Icons</string>\n    <string name=\"activity_precipitations\">Precipitations example</string>\n    <string name=\"activity_color_theme\">Color theme example</string>\n    <string name=\"activity_elevated_line\">Elevated line example</string>\n    <string name=\"activity_3d_model_feature_state_interactions\">3D model with style-driven interactions</string>\n    <string name=\"activity_animated_3d_model\">Animated 3D airplane model</string>\n    <string name=\"activity_accessibility_scale\">Accessibility scale</string>\n    <string name=\"activity_edge_to_edge\">Edge-to-Edge layout</string>\n    <string name=\"activity_lazy_column_map\">Map in LazyColumn</string>\n</resources>\n"
  },
  {
    "path": "compose-app/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#000000</color>\n</resources>"
  },
  {
    "path": "compose-app/src/main/res/values/strings.xml",
    "content": "<resources>\n  <string name=\"app_name\" translatable=\"false\">Compose Mapbox Map Test App</string>\n</resources>"
  },
  {
    "path": "compose-app/src/main/res/values/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n  <!-- Base application theme. -->\n  <style name=\"Theme.MapboxMapCompose\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n    <!-- Primary brand color. -->\n    <item name=\"colorPrimary\">@color/purple_500</item>\n    <item name=\"colorPrimaryVariant\">@color/purple_700</item>\n    <item name=\"colorOnPrimary\">@color/white</item>\n    <!-- Secondary brand color. -->\n    <item name=\"colorSecondary\">@color/teal_200</item>\n    <item name=\"colorSecondaryVariant\">@color/teal_700</item>\n    <item name=\"colorOnSecondary\">@color/black</item>\n    <!-- Customize your theme here. -->\n  </style>\n\n  <style name=\"Theme.MapboxMapCompose.NoActionBar\">\n    <item name=\"windowActionBar\">false</item>\n    <item name=\"windowNoTitle\">true</item>\n  </style>\n\n  <style name=\"Theme.TestMapboxMapCompose.AppBarOverlay\" parent=\"ThemeOverlay.AppCompat.Dark.ActionBar\" />\n\n  <style name=\"Theme.TestMapboxMapCompose.PopupOverlay\" parent=\"ThemeOverlay.AppCompat.Light\" />\n</resources>"
  },
  {
    "path": "compose-app/src/main/res/values-night/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n  <!-- Base application theme. -->\n  <style name=\"Theme.MapboxMapCompose\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n    <!-- Primary brand color. -->\n    <item name=\"colorPrimary\">@color/purple_200</item>\n    <item name=\"colorPrimaryVariant\">@color/purple_700</item>\n    <item name=\"colorOnPrimary\">@color/black</item>\n    <!-- Secondary brand color. -->\n    <item name=\"colorSecondary\">@color/teal_200</item>\n    <item name=\"colorSecondaryVariant\">@color/teal_200</item>\n    <item name=\"colorOnSecondary\">@color/black</item>\n    <!-- Customize your theme here. -->\n  </style>\n</resources>"
  },
  {
    "path": "extension-androidauto/.gitignore",
    "content": "/build"
  },
  {
    "path": "extension-androidauto/CHANGELOG-v0.5.0.md",
    "content": "# Changelog for Mapbox Maps Android Auto Extension SDK\n\nMapbox welcomes participation and contributions from everyone.\n\n# Please refer to [release notes](../CHANGELOG.md) in the main SDK for the latest Android Auto Extension related changes.\n\n# 0.5.0 November 16, 2022\n\n## Features ✨ and improvements 🏁\n* Make the SDK compatible with Jetpack Car Library `v1.2.+`. ([#1828](https://github.com/mapbox/mapbox-maps-android/pull/1828))\n* Always use `MapOptions.contextMode = ContextMode.SHARED` when creating the map session preventing hard-catching runtime crashes or artifacts. ([1834](https://github.com/mapbox/mapbox-maps-android/pull/1834))\n\n## Dependencies\n* Android Auto car library `androidx.car.app:app:1.2.+`\n* Supports any version of [Mapbox Maps 10.5.+](https://github.com/mapbox/mapbox-maps-android/tree/main/extension-androidauto#compatibility-with-maps-sdk-v10)\n\n# 0.4.0 November 7, 2022\n\n## Features ✨ and improvements 🏁\n* Make the SDK compatible with any version of Mapbox Maps `v10.5.+`. ([#1706](https://github.com/mapbox/mapbox-maps-android/pull/1706))\n* Remove experimental annotation from `MapboxCarMap`, `MapboxCarMapObserver`, `MapboxCarMapSurface`, `MapboxCarMapGestureHandler`, and `DefaultMapboxCarMapGestureHandler`. ([#1767](https://github.com/mapbox/mapbox-maps-android/pull/1767))\n\n## Dependencies\n* Android Auto car library `androidx.car.app:app:1.1.+`\n* Supports any version of [Mapbox Maps 10.5.+](https://github.com/mapbox/mapbox-maps-android/tree/main/extension-androidauto#compatibility-with-maps-sdk-v10)\n\n# 0.3.0 September 26, 2022\n\n## Features ✨ and improvements 🏁\n* Allow `MapboxCarMap` to be initialized before the `CarContext` is created. ([#1603](https://github.com/mapbox/mapbox-maps-android/pull/1603))\n* Add `MapboxCarMapSessionInstaller` and `MapboxCarMapScreenInstaller` for simpler setup. ([#1603](https://github.com/mapbox/mapbox-maps-android/pull/1603))\n* Add `Session.mapboxMapInstaller` and `Screen.mapboxMapInstaller` extension functions to create the installers. ([#1603](https://github.com/mapbox/mapbox-maps-android/pull/1603))\n* Change `MapboxCarMapGestureHandler` to a java interface so default methods can be added without breaking java backwards compatibility. ([#1670](https://github.com/mapbox/mapbox-maps-android/pull/1670))\n* Change `MapboxCarMapObserver` to a java interface so default methods can be added without breaking java backwards compatibility. ([#1670](https://github.com/mapbox/mapbox-maps-android/pull/1648))\n* Change `MapboxCarMap#getEdgeInsets()` to `mapboxCarMap.getVisibleEdgeInsets()` with the addition of `mapboxCarMap.getStableEdgeInsets()`. ([#1670](https://github.com/mapbox/mapbox-maps-android/pull/1648))\n* Add `MapboxCarMapObserver#onStableAreaChanged` to support all the available functions from the SurfaceCallback. ([#1670](https://github.com/mapbox/mapbox-maps-android/pull/1648))\n* Add support for intercepting the `SurfaceCallback#onClick` when using `MapboxCarMap.prepareSurfaceCallback`. ([#1683](https://github.com/mapbox/mapbox-maps-android/pull/1683))\n\n## Dependencies\n* Android Auto car library `androidx.car.app:app:1.1.+`\n* Supports any version of [Mapbox Maps 10.5.+](https://github.com/mapbox/mapbox-maps-android/tree/main/extension-androidauto#compatibility-with-maps-sdk-v10)\n\n# 0.2.0 August 9, 2022\n\n## Bug fixes 🐞\n* Destroy previous surface when new surface becomes available. This adds better support for `androidx.car.app:app-automotive`. ([#1509](https://github.com/mapbox/mapbox-maps-android/pull/1509))\n\n## Dependencies\n* Android Auto car library `androidx.car.app:app:1.1.+`\n* Supports any version of Mapbox Maps 10.+\n\n# 0.1.0 April 7, 2022\n\n## Features ✨ and improvements 🏁\n* Add `MapboxCarMap`. Constructing this object will add mapbox map to the head unit. ([#1004](https://github.com/mapbox/mapbox-maps-android/pull/1004))\n* Add `MapboxCarMapObserver` and `MapboxCarMapSurface` which allows you to build customizations for the `MapboxMap`. ([#1004](https://github.com/mapbox/mapbox-maps-android/pull/1004))\n* Add `MapboxCarMapGestureHandler` and `DefaultMapboxCarMapGestureHandler` for handling panning and zooming gestures. (#[1159](https://github.com/mapbox/mapbox-maps-android/pull/1159))\n* Add an example to the `:android-auto-app:` module, it includes a 3D location puck, and follows the car location. ([#1004](https://github.com/mapbox/mapbox-maps-android/pull/1004))\n* Show Mapbox Logo and a Compass in an example with the `CarMapWidgets`. The `BitmapWidget` is available starting with Maps [v10.4.0](https://github.com/mapbox/mapbox-maps-android/releases/tag/android-v10.4.0). ([#1004](https://github.com/mapbox/mapbox-maps-android/pull/1004))\n\n## Dependencies\n* Android Auto car library `androidx.car.app:app:1.1.+`\n* Supports any version of Mapbox Maps 10.+\n"
  },
  {
    "path": "extension-androidauto/README.md",
    "content": "# Mapbox Maps Android Auto Extension\n\n## Overview\n\nThe Mapbox Maps Android Auto Extension is a public library for initialising the Mapbox `MapSurface` from a [Session](https://developer.android.com/reference/androidx/car/app/Session). The extension provides a simple framework for adding Mapbox to Android Auto head units.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\nWorking examples of the Android Auto extension can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/android-auto-app/src/main/java/com/mapbox/maps/testapp/auto). To see examples of an integration with the Mapbox Navigation and Search SDKs, you can also try the [navigation examples](https://github.com/mapbox/mapbox-navigation-android-examples).\n\n## Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) or building an app that uses the Mapbox Maps Android Auto Extension. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Extension System. To add the android auto extension to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In your build.gradle, add the extension with your other dependencies.\ndependencies {\n  // Note that the Mapbox Android Auto Extension depends on the entire Mapbox Maps SDK, it will bring the whole Mapbox Maps SDK with the same version as transitive dependency.\n  implementation 'com.mapbox.extension:maps-androidauto:11.22.0-rc.1'\n}\n```\n\n## AndroidManifest and permissions\n\nYou should become familiar with [Google's documentation for building a navigation app](https://developer.android.com/training/cars/apps/navigation). You will need to declare your own [CarAppService](https://developer.android.com/reference/androidx/car/app/CarAppService), your own `minCarApiLevel`, create your own `xml/automotive_app_desc`, and make your own car app theme.\n\nThe Mapbox Android Auto extension includes the `androidx.car.app.ACCESS_SURFACE` permission, you do not need to add this permission to your manifest. You will need to add the `androidx.car.app.NAVIGATION_TEMPLATES` permission, along with any other permission your app requires.\n\n``` xml\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.mapbox.maps.testapp.auto\">\n\n    <!-- You must include this in order to use the NavigationTemplate -->\n    <uses-permission android:name=\"androidx.car.app.NAVIGATION_TEMPLATES\" />\n\n    <application\n        <!-- snip -->\n        >\n\n        <!-- You must add xml/automotive_app_desc -->\n        <meta-data\n            android:name=\"com.google.android.gms.car.application\"\n            android:resource=\"@xml/automotive_app_desc\" />\n\n        <!-- Create a theme for your app -->\n        <meta-data\n            android:name=\"androidx.car.app.theme\"\n            android:resource= \"@style/CarAppTheme\" />\n\n        <!-- You choose your minCarApiLevel -->\n        <meta-data\n            android:name=\"androidx.car.app.minCarApiLevel\"\n            android:value=\"3\" />\n\n        <!-- Link to your implementation of CarAppService -->\n        <service\n            android:name=\".car.YourCarAppService\"\n            android:exported=\"true\"\n            tools:ignore=\"ExportedService\">\n\n            <intent-filter>\n                <action android:name=\"androidx.car.app.CarAppService\" />\n                <category android:name=\"androidx.car.app.category.NAVIGATION\" />\n            </intent-filter>\n        </service>\n    </application>\n</manifest>\n```\n\n## Example Session and MapScreen\n\nIn this example, the Session manages an instance of `MapboxCarMap` and then each `Screen` can register and unregister observers. Each screen can control map features. Your implementations of `MapboxCarMapObserver` give you control of the map.\n\n```kotlin\nclass MySession : Session() {\n\n  private val mapboxCarMap = mapboxMapInstaller()\n      .onCreated(CarMapWidgets())\n      .install { carContext ->\n        // Callback is triggered when the Session calls onCreate. This allows you to specify\n        // custom MapInitOptions.\n        MapInitOptions(carContext)\n      }\n\n  override fun onCreateScreen(intent: Intent): Screen = MapScreen(mapboxCarMap)\n}\n\nclass MyMapScreen(\n  mapboxCarMap: MapboxCarMap\n) : Screen(mapboxCarMap.carContext) {\n\n  private val carCameraController = CarCameraController()\n  private val myCustomExperience = MyCustomMapExperience()\n\n  init {\n    mapboxMapInstaller(mapboxCarMap)\n        .onCreated(carCameraController)\n        .gestureHandler(carCameraController.gestureHandler)\n        .onResumed(myCustomExperience)\n        .install()\n  }\n\n  override fun onGetTemplate(): Template {\n    val builder = NavigationTemplate.Builder()\n      --snip--\n\nclass MyCustomMapExperience : MapboxCarMapObserver {\n  override fun onAttached(mapboxCarMapSurface: MapboxCarMapSurface) {\n    val mapboxMap = mapboxCarMapSurface?.mapSurface?.getMapboxMap()!!\n    mapboxMap.loadStyle(\n      --snip--\n}\n```\n\n### Xiaomi animations\n\nThere is a known [issue](https://github.com/mapbox/mapbox-maps-android/issues/1413) related to Xiaomi devices used with the Mapbox Android Auto extension and the map is running in background on the device.\nWorkaround has been introduced in Maps SDK v10.9.0 allowing to execute all Mapbox animators on the background thread instead of the main thread fixing the map being stuck.\n\nFollowing method will move all subsequent animator calls on the background thread:\n```kotlin\nif (deviceRequiresBackgroundThreadAnimations()) {\n    AnimationThreadController.useBackgroundThread()\n}\n```\n\nWhen running animators should be switched back to the main thread following method should be called:\n```kotlin\nAnimationThreadController.useMainThread()\n```\n\nIt is highly recommended to use background thread for animators just when it is absolutely necessary - when Xiaomi device is used and the map is running in background. You could refer to our official [example](../android-auto-app/src/main/java/com/mapbox/maps/testapp/auto/car/CarAnimationThreadController.kt) how to implement that.\n\n## Compatibility with Maps SDK v11\n\nFrom v11.1.0, Mapbox Android Auto Extension for Android is released as a separate module following the same release cadence with the main SDK and have a api dependency. The features list can be found below:\n\n| Features                   | Supported? |\n|----------------------------|------------|\n| Xiaomi animations          | ✅          |\n| Logo Widget                | ✅          |\n| Compass Widget             | ✅          |\n| Map rendering              | ✅          |\n| Runtime styling            | ✅          |\n| Camera animation           | ✅          |\n| Viewport plugin            | ✅          |\n| Location Component plugin  | ✅          |\n| Gestures(scroll and scale) | ✅          |\n| Annotation plugin          | ✅          |\n| View annotation plugin     | ❌          |\n| Scale bar plugin           | ❌          |\n| Attribution                | ❌          |\n\n## Compatibility with Maps SDK v10\n\nThe Android Auto extension before v0.5.0 is released separately from the Android Maps SDK v10 and has a compileOnly dependency. When using the Android Auto extension you need to include a compatible Maps SDK. The feature compatibility checklist can be found below.\n\n| Features                   | Supported? | Compatible Maps SDK version |\n|----------------------------|------------|-----------------------------|\n| Xiaomi animations          | ✅          | v10.9+                      |\n| Logo Widget                | ✅          | v10.4+                      |\n| Compass Widget             | ✅          | v10.4+                      |\n| Map rendering              | ✅          | v10.0+                      |\n| Runtime styling            | ✅          | v10.0+                      |\n| Camera animation           | ✅          | v10.0+                      |\n| Viewport plugin            | ✅          | v10.0+                      |\n| Location Component plugin  | ✅          | v10.0+                      |\n| Gestures(scroll and scale) | ✅          | v10.0+                      |\n| Annotation plugin          | ✅          | v10.0+                      |\n| View annotation plugin     | ❌          | -                           |\n| Scale bar plugin           | ❌          | -                           |\n| Attribution                | ❌          | -                           |\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this extension.\n"
  },
  {
    "path": "extension-androidauto/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.extension.androidauto {\n\n  public class DefaultMapboxCarMapGestureHandler implements com.mapbox.maps.extension.androidauto.MapboxCarMapGestureHandler {\n    ctor public DefaultMapboxCarMapGestureHandler();\n  }\n\n  public final class MapboxCarMap {\n    ctor public MapboxCarMap();\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMap clearObservers();\n    method public androidx.car.app.CarContext getCarContext();\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMapSurface? getCarMapSurface();\n    method public com.mapbox.maps.MapInitOptions getMapInitOptions();\n    method public android.graphics.Rect? getStableArea();\n    method public com.mapbox.maps.EdgeInsets? getStableEdgeInsets();\n    method public android.graphics.Rect? getVisibleArea();\n    method public com.mapbox.maps.EdgeInsets? getVisibleEdgeInsets();\n    method @com.mapbox.maps.MapboxExperimental public androidx.car.app.SurfaceCallback prepareSurfaceCallback(androidx.car.app.CarContext carContext, com.mapbox.maps.MapInitOptions mapInitOptions);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMap registerObserver(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver mapboxCarMapObserver);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMap setGestureHandler(com.mapbox.maps.extension.androidauto.MapboxCarMapGestureHandler? gestureHandler);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMap setup(androidx.car.app.CarContext carContext, com.mapbox.maps.MapInitOptions mapInitOptions);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMap unregisterObserver(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver mapboxCarMapObserver);\n    property public final androidx.car.app.CarContext carContext;\n    property public final com.mapbox.maps.extension.androidauto.MapboxCarMapSurface? carMapSurface;\n    property public final com.mapbox.maps.MapInitOptions mapInitOptions;\n    property public final android.graphics.Rect? stableArea;\n    property public final com.mapbox.maps.EdgeInsets? stableEdgeInsets;\n    property public final android.graphics.Rect? visibleArea;\n    property public final com.mapbox.maps.EdgeInsets? visibleEdgeInsets;\n  }\n\n  public final class MapboxCarMapEx {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.androidauto.MapboxCarMapSessionInstaller mapboxMapInstaller(androidx.car.app.Session);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.androidauto.MapboxCarMapScreenInstaller mapboxMapInstaller(androidx.car.app.Screen, com.mapbox.maps.extension.androidauto.MapboxCarMap mapboxCarMap);\n  }\n\n  public interface MapboxCarMapGestureHandler {\n    method public default void onFling(com.mapbox.maps.extension.androidauto.MapboxCarMapSurface, float, float);\n    method public default void onScale(com.mapbox.maps.extension.androidauto.MapboxCarMapSurface, float, float, float);\n    method public default void onScroll(com.mapbox.maps.extension.androidauto.MapboxCarMapSurface, com.mapbox.maps.ScreenCoordinate, float, float);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public fun interface MapboxCarMapInitializer {\n    method public com.mapbox.maps.MapInitOptions onCreate(androidx.car.app.CarContext carContext);\n  }\n\n  public interface MapboxCarMapObserver {\n    method public default void onAttached(com.mapbox.maps.extension.androidauto.MapboxCarMapSurface);\n    method public default void onDetached(com.mapbox.maps.extension.androidauto.MapboxCarMapSurface);\n    method public default void onStableAreaChanged(android.graphics.Rect, com.mapbox.maps.EdgeInsets);\n    method public default void onVisibleAreaChanged(android.graphics.Rect, com.mapbox.maps.EdgeInsets);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class MapboxCarMapScreenInstaller {\n    ctor public MapboxCarMapScreenInstaller(androidx.car.app.Screen screen, com.mapbox.maps.extension.androidauto.MapboxCarMap mapboxCarMap);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMapScreenInstaller gestureHandler(com.mapbox.maps.extension.androidauto.MapboxCarMapGestureHandler? handler);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMap install();\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMapScreenInstaller onCreated(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver... observers);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMapScreenInstaller onResumed(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver... observers);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMapScreenInstaller onStarted(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver... observers);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class MapboxCarMapSessionInstaller {\n    ctor public MapboxCarMapSessionInstaller(androidx.car.app.Session session, com.mapbox.maps.extension.androidauto.MapboxCarMap mapboxCarMap = com.mapbox.maps.extension.androidauto.MapboxCarMap());\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMap install(com.mapbox.maps.extension.androidauto.MapboxCarMapInitializer initializer = com.mapbox.maps.extension.androidauto.MapboxCarMapSessionInstaller.defaultInitializer);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMap install();\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMapSessionInstaller onCreated(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver... observers);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMapSessionInstaller onResumed(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver... observers);\n    method public com.mapbox.maps.extension.androidauto.MapboxCarMapSessionInstaller onStarted(com.mapbox.maps.extension.androidauto.MapboxCarMapObserver... observers);\n  }\n\n  public final class MapboxCarMapSurface {\n    method public androidx.car.app.CarContext getCarContext();\n    method public com.mapbox.maps.MapSurface getMapSurface();\n    method public androidx.car.app.SurfaceContainer getSurfaceContainer();\n    property public final androidx.car.app.CarContext carContext;\n    property public final com.mapbox.maps.MapSurface mapSurface;\n    property public final androidx.car.app.SurfaceContainer surfaceContainer;\n  }\n\n}\n\npackage com.mapbox.maps.extension.androidauto.widgets {\n\n  @com.mapbox.maps.MapboxExperimental public final class CompassWidget extends com.mapbox.maps.renderer.widget.BitmapWidget {\n    ctor public CompassWidget(android.content.Context context, com.mapbox.maps.renderer.widget.WidgetPosition position = com.mapbox.maps.renderer.widget.WidgetPosition(com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal.RIGHT, com.mapbox.maps.renderer.widget.WidgetPosition.Vertical.TOP), float marginX = 20f, float marginY = 20f);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class LogoWidget extends com.mapbox.maps.renderer.widget.BitmapWidget {\n    ctor public LogoWidget(android.content.Context context, com.mapbox.maps.renderer.widget.WidgetPosition position = com.mapbox.maps.renderer.widget.WidgetPosition(com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal.LEFT, com.mapbox.maps.renderer.widget.WidgetPosition.Vertical.BOTTOM), float marginX = 20f, float marginY = 20f);\n  }\n\n}\n\n"
  },
  {
    "path": "extension-androidauto/api/extension-androidauto.api",
    "content": "public class com/mapbox/maps/extension/androidauto/DefaultMapboxCarMapGestureHandler : com/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler {\n\tpublic fun <init> ()V\n\tpublic fun onFling (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;FF)V\n\tpublic fun onScale (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;FFF)V\n\tpublic fun onScroll (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;Lcom/mapbox/maps/ScreenCoordinate;FF)V\n}\n\npublic final class com/mapbox/maps/extension/androidauto/MapboxCarMap {\n\tpublic fun <init> ()V\n\tpublic final fun clearObservers ()Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;\n\tpublic final fun getCarContext ()Landroidx/car/app/CarContext;\n\tpublic final fun getCarMapSurface ()Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;\n\tpublic final fun getMapInitOptions ()Lcom/mapbox/maps/MapInitOptions;\n\tpublic final fun getStableArea ()Landroid/graphics/Rect;\n\tpublic final fun getStableEdgeInsets ()Lcom/mapbox/maps/EdgeInsets;\n\tpublic final fun getVisibleArea ()Landroid/graphics/Rect;\n\tpublic final fun getVisibleEdgeInsets ()Lcom/mapbox/maps/EdgeInsets;\n\tpublic final fun prepareSurfaceCallback (Landroidx/car/app/CarContext;Lcom/mapbox/maps/MapInitOptions;)Landroidx/car/app/SurfaceCallback;\n\tpublic final fun registerObserver (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;\n\tpublic final fun setGestureHandler (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;\n\tpublic final fun setup (Landroidx/car/app/CarContext;Lcom/mapbox/maps/MapInitOptions;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;\n\tpublic final fun unregisterObserver (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;\n}\n\npublic final class com/mapbox/maps/extension/androidauto/MapboxCarMapEx {\n\tpublic static final fun mapboxMapInstaller (Landroidx/car/app/Screen;Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMapScreenInstaller;\n\tpublic static final fun mapboxMapInstaller (Landroidx/car/app/Session;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSessionInstaller;\n}\n\npublic abstract interface class com/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler {\n\tpublic fun onFling (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;FF)V\n\tpublic fun onScale (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;FFF)V\n\tpublic fun onScroll (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;Lcom/mapbox/maps/ScreenCoordinate;FF)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/androidauto/MapboxCarMapInitializer {\n\tpublic abstract fun onCreate (Landroidx/car/app/CarContext;)Lcom/mapbox/maps/MapInitOptions;\n}\n\npublic abstract interface class com/mapbox/maps/extension/androidauto/MapboxCarMapObserver {\n\tpublic fun onAttached (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;)V\n\tpublic fun onDetached (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSurface;)V\n\tpublic fun onStableAreaChanged (Landroid/graphics/Rect;Lcom/mapbox/maps/EdgeInsets;)V\n\tpublic fun onVisibleAreaChanged (Landroid/graphics/Rect;Lcom/mapbox/maps/EdgeInsets;)V\n}\n\npublic final class com/mapbox/maps/extension/androidauto/MapboxCarMapScreenInstaller {\n\tpublic fun <init> (Landroidx/car/app/Screen;Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;)V\n\tpublic final fun gestureHandler (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMapScreenInstaller;\n\tpublic final fun install ()Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;\n\tpublic final fun onCreated ([Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMapScreenInstaller;\n\tpublic final fun onResumed ([Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMapScreenInstaller;\n\tpublic final fun onStarted ([Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMapScreenInstaller;\n}\n\npublic final class com/mapbox/maps/extension/androidauto/MapboxCarMapSessionInstaller {\n\tpublic fun <init> (Landroidx/car/app/Session;Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;)V\n\tpublic synthetic fun <init> (Landroidx/car/app/Session;Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun install ()Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;\n\tpublic final fun install (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapInitializer;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;\n\tpublic static synthetic fun install$default (Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSessionInstaller;Lcom/mapbox/maps/extension/androidauto/MapboxCarMapInitializer;ILjava/lang/Object;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMap;\n\tpublic final fun onCreated ([Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSessionInstaller;\n\tpublic final fun onResumed ([Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSessionInstaller;\n\tpublic final fun onStarted ([Lcom/mapbox/maps/extension/androidauto/MapboxCarMapObserver;)Lcom/mapbox/maps/extension/androidauto/MapboxCarMapSessionInstaller;\n}\n\npublic final class com/mapbox/maps/extension/androidauto/MapboxCarMapSurface {\n\tpublic final fun getCarContext ()Landroidx/car/app/CarContext;\n\tpublic final fun getMapSurface ()Lcom/mapbox/maps/MapSurface;\n\tpublic final fun getSurfaceContainer ()Landroidx/car/app/SurfaceContainer;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/androidauto/widgets/CompassWidget : com/mapbox/maps/renderer/widget/BitmapWidget {\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/renderer/widget/WidgetPosition;FF)V\n\tpublic synthetic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/renderer/widget/WidgetPosition;FFILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic final class com/mapbox/maps/extension/androidauto/widgets/LogoWidget : com/mapbox/maps/renderer/widget/BitmapWidget {\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/renderer/widget/WidgetPosition;FF)V\n\tpublic synthetic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/renderer/widget/WidgetPosition;FFILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\n"
  },
  {
    "path": "extension-androidauto/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.autoCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.extension.androidauto\"\n  defaultConfig {\n    minSdk = libs.versions.autoMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n  testOptions {\n    targetSdk = libs.versions.autoTargetSdkVersion.get().toInt()\n    unitTests.apply {\n      isIncludeAndroidResources = true\n    }\n  }\n  lint {\n    targetSdk = libs.versions.autoTargetSdkVersion.get().toInt()\n  }\n}\n\nmapboxLibrary {\n  jApiCmp {\n    // The first release for extension-androidauto was 11.1.0 so we force it if the current one is \"11.1.0-SNAPSHOT\"\n    if (project.hasProperty(\"VERSION_NAME\") && project.property(\"VERSION_NAME\") == \"11.1.0-SNAPSHOT\") {\n      previousVersion = \"11.1.0\"\n    }\n  }\n  publish {\n    group = \"com.mapbox.extension\"\n    artifactId = \"maps-androidauto\"\n    artifactTitle = \"The android auto extension for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-androidauto\"\n  }\n}\n\ndependencies {\n  api(project(\":maps-sdk\"))\n  api(libs.googleCarAppLibrary)\n  implementation(libs.kotlin)\n  implementation(libs.androidx.coreKtx)\n  implementation(libs.androidx.annotations)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "extension-androidauto/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"androidx.car.app.ACCESS_SURFACE\" />\n\n</manifest>\n"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/CarMapSurfaceOwner.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport android.graphics.Rect\nimport androidx.annotation.RestrictTo\nimport androidx.car.app.CarContext\nimport androidx.car.app.SurfaceCallback\nimport androidx.car.app.SurfaceContainer\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logI\nimport java.util.concurrent.CopyOnWriteArraySet\n\n/**\n * @see MapboxCarMap to create new map experiences.\n *\n * Maintains the surface state for [MapboxCarMap].\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class CarMapSurfaceOwner(\n  internal var gestureHandler: MapboxCarMapGestureHandler? = DefaultMapboxCarMapGestureHandler()\n) : SurfaceCallback {\n\n  internal var mapboxCarMapSurface: MapboxCarMapSurface? = null\n    private set\n  internal var visibleArea: Rect? = null\n    private set\n  internal var visibleEdgeInsets: EdgeInsets? = null\n    private set\n  internal var visibleCenter: ScreenCoordinate = visibleCenter()\n    private set\n  internal var stableArea: Rect? = null\n    private set\n  internal var stableEdgeInsets: EdgeInsets? = null\n\n  internal lateinit var carContext: CarContext\n  internal lateinit var mapInitOptions: MapInitOptions\n\n  private val carMapObservers = CopyOnWriteArraySet<MapboxCarMapObserver>()\n\n  internal fun setup(carContext: CarContext, mapInitOptions: MapInitOptions) = apply {\n    this.carContext = carContext\n    this.mapInitOptions = mapInitOptions\n  }\n\n  internal fun isSetup(): Boolean = this::carContext.isInitialized && this::mapInitOptions.isInitialized\n\n  internal fun registerObserver(mapboxCarMapObserver: MapboxCarMapObserver) {\n    carMapObservers.add(mapboxCarMapObserver)\n    logD(TAG, \"registerObserver + 1 = ${carMapObservers.size}\")\n\n    mapboxCarMapSurface?.let { carMapSurface ->\n      mapboxCarMapObserver.onAttached(carMapSurface)\n    }\n    ifNonNull(mapboxCarMapSurface, visibleArea, visibleEdgeInsets) { _, area, edge ->\n      logD(TAG, \"registerObserver visibleAreaChanged\")\n      mapboxCarMapObserver.onVisibleAreaChanged(area, edge)\n    }\n    ifNonNull(mapboxCarMapSurface, stableArea, stableEdgeInsets) { _, area, edge ->\n      logD(TAG, \"registerObserver stableAreaChanged\")\n      mapboxCarMapObserver.onStableAreaChanged(area, edge)\n    }\n  }\n\n  internal fun unregisterObserver(mapboxCarMapObserver: MapboxCarMapObserver) {\n    carMapObservers.remove(mapboxCarMapObserver)\n    mapboxCarMapSurface?.let { mapboxCarMapObserver.onDetached(it) }\n    logD(TAG, \"unregisterObserver - 1 = ${carMapObservers.size}\")\n  }\n\n  internal fun clearObservers() {\n    this.mapboxCarMapSurface?.let { surface -> carMapObservers.forEach { it.onDetached(surface) } }\n    carMapObservers.clear()\n  }\n\n  /**\n   * Prepares the [MapSurface] and notifies any registered observers that the map has been attached\n   * with [MapboxCarMapObserver.onAttached].\n   *\n   * @see SurfaceCallback.onSurfaceAvailable\n   */\n  override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) {\n    logI(TAG, \"onSurfaceAvailable $surfaceContainer\")\n    surfaceContainer.surface?.let { surface ->\n      val mapSurface = MapSurfaceProvider.create(\n        carContext,\n        surface,\n        mapInitOptions\n      )\n      mapSurface.onStart()\n      mapSurface.surfaceCreated()\n      mapSurface.surfaceChanged(surfaceContainer.width, surfaceContainer.height)\n      val carMapSurface = MapboxCarMapSurface(carContext, mapSurface, surfaceContainer)\n      val oldCarMapSurface = this.mapboxCarMapSurface\n      this.mapboxCarMapSurface = carMapSurface\n      oldCarMapSurface?.mapSurface?.let { oldMapSurface ->\n        carMapObservers.forEach { it.onDetached(oldCarMapSurface) }\n        // The surface can become available without a call to surfaceDestroyed\n        // https://issuetracker.google.com/issues/235121269\n        oldMapSurface.onStop()\n        oldMapSurface.surfaceDestroyed()\n        oldMapSurface.onDestroy()\n      }\n      carMapObservers.forEach { it.onAttached(carMapSurface) }\n\n      notifyVisibleAreaChanged()\n    }\n  }\n\n  /**\n   * Destroys the resources used by [MapSurface] and notifies any registered observers that the map\n   * has been detached with [MapboxCarMapObserver.onDetached].\n   *\n   * @see SurfaceCallback.onSurfaceDestroyed\n   */\n  override fun onSurfaceDestroyed(surfaceContainer: SurfaceContainer) {\n    logI(TAG, \"onSurfaceDestroyed\")\n    val detachSurface = this.mapboxCarMapSurface\n    detachSurface?.mapSurface?.onStop()\n    detachSurface?.mapSurface?.surfaceDestroyed()\n    detachSurface?.mapSurface?.onDestroy()\n    this.mapboxCarMapSurface = null\n    detachSurface?.let { carMapObservers.forEach { it.onDetached(detachSurface) } }\n  }\n\n  /**\n   * Notifies any registered observers that the visible area has changed with\n   * [MapboxCarMapObserver.onVisibleAreaChanged].\n   *\n   * @see SurfaceCallback.onVisibleAreaChanged\n   */\n  override fun onVisibleAreaChanged(visibleArea: Rect) {\n    logI(TAG, \"onVisibleAreaChanged visibleArea:$visibleArea $visibleEdgeInsets\")\n    this.visibleArea = visibleArea\n    notifyVisibleAreaChanged()\n  }\n\n  private fun notifyVisibleAreaChanged() {\n    this.visibleEdgeInsets = visibleArea?.edgeInsets()\n    this.visibleCenter = visibleCenter()\n    ifNonNull(mapboxCarMapSurface, visibleArea, visibleEdgeInsets) { _, area, edge ->\n      logD(TAG, \"notifyVisibleAreaChanged $area $edge\")\n      carMapObservers.forEach {\n        it.onVisibleAreaChanged(area, edge)\n      }\n    }\n  }\n\n  /**\n   * Notifies any registered observers that the visible area has changed with\n   * [MapboxCarMapObserver.onStableAreaChanged].\n   *\n   * @see SurfaceCallback.onStableAreaChanged\n   */\n  override fun onStableAreaChanged(stableArea: Rect) {\n    logI(TAG, \"onStableAreaChanged stableArea:$stableArea $stableEdgeInsets\")\n    this.stableEdgeInsets = stableArea.edgeInsets()\n    this.stableArea = stableArea\n    ifNonNull(mapboxCarMapSurface, stableArea, stableEdgeInsets) { _, area, edge ->\n      logD(TAG, \"notifyStableAreaChanged $area $edge\")\n      carMapObservers.forEach {\n        it.onStableAreaChanged(area, edge)\n      }\n    }\n  }\n\n  /**\n   * Forwards the gesture to the [MapboxCarMapGestureHandler.onScroll].\n   *\n   * @see SurfaceCallback.onScroll\n   */\n  override fun onScroll(distanceX: Float, distanceY: Float) {\n    logD(TAG, \"onScroll $distanceX, $distanceY\")\n    val carMapSurface = mapboxCarMapSurface ?: return\n    gestureHandler?.onScroll(carMapSurface, visibleCenter, distanceX, distanceY)\n  }\n\n  /**\n   * Forwards the gesture to the [MapboxCarMapGestureHandler.onFling].\n   *\n   * @see SurfaceCallback.onFling\n   */\n  override fun onFling(velocityX: Float, velocityY: Float) {\n    logD(TAG, \"onFling $velocityX, $velocityY\")\n    val carMapSurface = mapboxCarMapSurface ?: return\n    gestureHandler?.onFling(carMapSurface, velocityX, velocityY)\n  }\n\n  /**\n   * Forwards the gesture to the [MapboxCarMapGestureHandler.onScale].\n   *\n   * @see SurfaceCallback.onScale\n   */\n  override fun onScale(focusX: Float, focusY: Float, scaleFactor: Float) {\n    logD(TAG, \"onScroll $focusX, $focusY, $scaleFactor\")\n    val carMapSurface = mapboxCarMapSurface ?: return\n    gestureHandler?.onScale(carMapSurface, focusX, focusY, scaleFactor)\n  }\n\n  private inline fun <R1, R2, R3, T> ifNonNull(\n    r1: R1?,\n    r2: R2?,\n    r3: R3?,\n    func: (R1, R2, R3) -> T\n  ): T? = if (r1 != null && r2 != null && r3 != null) {\n    func(r1, r2, r3)\n  } else {\n    null\n  }\n\n  private fun Rect.edgeInsets(): EdgeInsets? {\n    val surfaceContainer = mapboxCarMapSurface?.surfaceContainer ?: return null\n    return EdgeInsets(\n      top.toDouble(),\n      left.toDouble(),\n      (surfaceContainer.height - bottom).toDouble(),\n      (surfaceContainer.width - right).toDouble()\n    )\n  }\n\n  private fun visibleCenter(): ScreenCoordinate {\n    return visibleArea?.run(rectCenterMapper)\n      ?: mapboxCarMapSurface?.run(surfaceContainerCenterMapper)\n      ?: ScreenCoordinate(0.0, 0.0)\n  }\n\n  private companion object {\n    private const val TAG = \"CarMapSurfaceOwner\"\n\n    private val rectCenterMapper = { rect: Rect ->\n      ScreenCoordinate(rect.exactCenterX().toDouble(), rect.exactCenterY().toDouble())\n    }\n\n    private val surfaceContainerCenterMapper = { carMapSurface: MapboxCarMapSurface ->\n      val container = carMapSurface.surfaceContainer\n      ScreenCoordinate(container.width / 2.0, container.height / 2.0)\n    }\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/DefaultMapboxCarMapGestureHandler.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport androidx.car.app.SurfaceCallback\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.util.CoreGesturesHandler\n\n/**\n * This class contains the default map gestures. It Handles the gestures received from\n * [SurfaceCallback] and applies them to the [MapboxMap] camera. If you would like to customize\n * the map gestures, use [MapboxCarMap.setGestureHandler].\n */\nopen class DefaultMapboxCarMapGestureHandler : MapboxCarMapGestureHandler {\n  private var coreGestureHandler: CoreGesturesHandler? = null\n\n  /**\n   * @see [MapboxCarMapGestureHandler.onScroll]\n   * @see [SurfaceCallback.onScroll] for instructions to enable.\n   *\n   * @param mapboxCarMapSurface loaded and ready car map surface\n   * @param distanceX the distance in pixels along the X axis\n   * @param distanceY the distance in pixels along the Y axis\n   */\n  override fun onScroll(\n    mapboxCarMapSurface: MapboxCarMapSurface,\n    visibleCenter: ScreenCoordinate,\n    distanceX: Float,\n    distanceY: Float\n  ) {\n    with(mapboxCarMapSurface.mapSurface.mapboxMap) {\n      notifyCoreGestureStarted()\n      val toCoordinate = ScreenCoordinate(\n        visibleCenter.x - distanceX,\n        visibleCenter.y - distanceY\n      )\n      logI(TAG, \"scroll from $visibleCenter to $toCoordinate\")\n      setCamera(cameraForDrag(visibleCenter, toCoordinate))\n      coreGestureHandler?.notifyCoreTouchEnded()\n    }\n  }\n\n  /**\n   * @see [MapboxCarMapGestureHandler.onFling]\n   * @see [SurfaceCallback.onFling]\n   *\n   * @param mapboxCarMapSurface loaded and ready car map surface\n   * @param velocityX the velocity of this fling measured in pixels per second along the x axis\n   * @param velocityY the velocity of this fling measured in pixels per second along the y axis\n   */\n  override fun onFling(\n    mapboxCarMapSurface: MapboxCarMapSurface,\n    velocityX: Float,\n    velocityY: Float\n  ) {\n    logI(TAG, \"fling $velocityX, $velocityY\")\n    // TODO implement fling\n    // https://github.com/mapbox/mapbox-navigation-android-examples/issues/67\n  }\n\n  /**\n   * @see [MapboxCarMapGestureHandler.onScale]\n   * @see [SurfaceCallback.onScale]\n   *\n   * @param mapboxCarMapSurface loaded and ready car map surface\n   * @param focusX x coordinate of the focal point in pixels. A negative value indicates that the focal point is unavailable.\n   * @param focusY y coordinate of the focal point in pixels. A negative value indicates that the focal point is unavailable.\n   * @param scaleFactor the scaling factor from the previous state to the current state during the scale event. This value is defined as (current state) / (previous state)\n   */\n  @Suppress(\"LongParameterList\")\n  override fun onScale(\n    mapboxCarMapSurface: MapboxCarMapSurface,\n    focusX: Float,\n    focusY: Float,\n    scaleFactor: Float\n  ) {\n    with(mapboxCarMapSurface.mapSurface) {\n      val fromZoom = mapboxMap.cameraState.zoom\n      val toZoom = fromZoom - (1.0 - scaleFactor.toDouble())\n      val anchor = ScreenCoordinate(\n        focusX.toDouble(),\n        focusY.toDouble()\n      )\n\n      val cameraOptions = CameraOptions.Builder()\n        .zoom(toZoom)\n        .anchor(anchor)\n        .build()\n\n      logI(TAG, \"scale with $focusX, $focusY $scaleFactor -> $fromZoom $toZoom\")\n      if (scaleFactor == DOUBLE_TAP_SCALE_FACTOR) {\n        camera.easeTo(cameraOptions)\n      } else {\n        mapboxMap.setCamera(cameraOptions)\n      }\n    }\n  }\n\n  private fun MapboxMap.notifyCoreGestureStarted() {\n    if (coreGestureHandler == null) {\n      coreGestureHandler = CoreGesturesHandler(\n        mapTransformDelegate = this,\n        mapCameraManagerDelegate = this\n      )\n    }\n    coreGestureHandler?.notifyCoreGestureStarted()\n  }\n\n  private companion object {\n    private const val TAG = \"DefaultMapboxCarMapGestureHandler\"\n\n    /**\n     * This appears to be undocumented from android auto. But when running from the emulator,\n     * you can double tap the screen and zoom in to reproduce this value.\n     * It is a jarring experience if you do not easeTo the zoom.\n     */\n    private const val DOUBLE_TAP_SCALE_FACTOR = 2.0f\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapSurfaceProvider.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport android.content.Context\nimport android.view.Surface\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapSurface\n\n/**\n * This provider is needed for creating unit tests.\n */\ninternal object MapSurfaceProvider {\n  fun create(\n    context: Context,\n    surface: Surface,\n    mapInitOptions: MapInitOptions\n  ) = MapSurface(context, surface, mapInitOptions)\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarMap.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport android.graphics.Rect\nimport androidx.car.app.AppManager\nimport androidx.car.app.CarContext\nimport androidx.car.app.Session\nimport androidx.car.app.SurfaceCallback\nimport androidx.lifecycle.Lifecycle\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * This is the main entry point for controlling the Mapbox car map surface.\n *\n * You can add the [MapboxCarMap] to your entire [androidx.car.app.Session] using the [Lifecycle].\n * And then any [androidx.car.app.Screen] that is using a supported template will automatically\n * show the Mapbox map. You can also, specify a [MapboxCarMap] for each individual\n * [androidx.car.app.Screen] by constructing the [MapboxCarMap] with the screen Lifecycle.\n *\n * Supported templates include:\n *  - [androidx.car.app.navigation.model.NavigationTemplate]\n *  - [androidx.car.app.navigation.model.RoutePreviewNavigationTemplate]\n *  - [androidx.car.app.navigation.model.PlaceListNavigationTemplate]\n *\n * Customize your [MapboxCarMap] with your own implementations of [MapboxCarMapObserver].\n * Use the [registerObserver] and [unregisterObserver] functions to load and detach the observers.\n *\n * The internals of this class use [AppManager.setSurfaceCallback], which assumes there is a single\n * surface callback. Do not use setSurfaceCallback, and do not create multiple instances of\n * [MapboxCarMap].\n */\nclass MapboxCarMap {\n  private val carMapSurfaceOwner = CarMapSurfaceOwner()\n\n  /**\n   * The initial options used to [setup] the map.\n   */\n  val mapInitOptions: MapInitOptions by lazy {\n    check(carMapSurfaceOwner.isSetup()) {\n      \"You must call MapboxCarMap.setup before you can access the MapboxCarMap.mapInitOptions\"\n    }\n    carMapSurfaceOwner.mapInitOptions\n  }\n\n  /**\n   * Accessor for the carContext provided to the MapInitOptions. This makes it easier to create\n   * screens with the MapboxCarMap in the constructor.\n   *\n   * For example:\n   *  class YourMapScreen(val mapboxCarMap: MapboxCarMap) : Screen(mapboxCarMap.carContext) {\n   *\n   * The carContext can also be found in the [MapboxCarMapObserver] callbacks. Make sure to\n   * call [MapboxCarMap.clearObservers] when your car session is destroyed.\n   */\n  val carContext: CarContext by lazy {\n    check(carMapSurfaceOwner.isSetup()) {\n      \"You must call MapboxCarMap.setup before you can access the MapboxCarMap.carContext\"\n    }\n    carMapSurfaceOwner.carContext\n  }\n\n  /**\n   * Calls [AppManager.setSurfaceCallback] to give Mapbox access to render the map onto Android\n   * Auto head units. You should only call this once per [CarContext] in a [Session].\n   *\n   * @param carContext Android Auto CarContext\n   * @param mapInitOptions parameter to initialize the head unit map\n   */\n  @OptIn(MapboxExperimental::class)\n  fun setup(\n    carContext: CarContext,\n    mapInitOptions: MapInitOptions,\n  ): MapboxCarMap = apply {\n    val surfaceCallback = prepareSurfaceCallback(carContext, mapInitOptions)\n    carContext.getCarService(AppManager::class.java).setSurfaceCallback(surfaceCallback)\n  }\n\n  /**\n   * Instead of using [setup], this function allows you to create your own [SurfaceCallback] and\n   * forward the calls to the returned [SurfaceCallback]. This makes it possible for you to adopt\n   * new api versions or intercept the calls and continue to use the [MapboxCarMap] as designed.\n   *\n   * This may be a temporary solution, while androidx.car.app:app:1.3.0 is rolling out\n   * [SurfaceCallback.onClick]. If there is no use for this function in the future, it will be\n   * removed.\n   */\n  @MapboxExperimental\n  fun prepareSurfaceCallback(\n    carContext: CarContext,\n    mapInitOptions: MapInitOptions\n  ): SurfaceCallback {\n    check(mapInitOptions.context is CarContext) {\n      \"You must set up the MapboxCarMap MapInitOptions with a CarContext\"\n    }\n    MapboxCarTelemetryEvents.map.increment()\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    return carMapSurfaceOwner\n  }\n\n  /**\n   * Returns the current [MapboxCarMapSurface]. It is recommended to use [registerObserver] and\n   * [MapboxCarMapObserver] to attach and detach your customizations.\n   */\n  val carMapSurface: MapboxCarMapSurface?\n    get() {\n      return carMapSurfaceOwner.mapboxCarMapSurface\n    }\n\n  /**\n   * Accessor to the visible area calculated by the car library. It is recommended to\n   * use the values returned by [MapboxCarMapObserver.onVisibleAreaChanged].\n   */\n  val visibleArea: Rect?\n    get() {\n      return carMapSurfaceOwner.visibleArea\n    }\n\n  /**\n   * Accessor to the edgeInsets calculated by the car library. It is recommended to\n   * use the values returned by [MapboxCarMapObserver.onVisibleAreaChanged].\n   */\n  val visibleEdgeInsets: EdgeInsets?\n    get() {\n      return carMapSurfaceOwner.visibleEdgeInsets\n    }\n\n  /**\n   * Accessor to the stable area calculated by the car library. It is recommended to\n   * use the values returned by [MapboxCarMapObserver.onStableAreaChanged].\n   */\n  val stableArea: Rect?\n    get() {\n      return carMapSurfaceOwner.stableArea\n    }\n\n  /**\n   * Accessor to the stableEdgeInsets calculated by the car library. It is recommended to\n   * use the values returned by [MapboxCarMapObserver.onStableAreaChanged].\n   */\n  val stableEdgeInsets: EdgeInsets?\n    get() {\n      return carMapSurfaceOwner.stableEdgeInsets\n    }\n\n  /**\n   * @param mapboxCarMapObserver implements the desired mapbox car experiences\n   */\n  fun registerObserver(mapboxCarMapObserver: MapboxCarMapObserver): MapboxCarMap = apply {\n    carMapSurfaceOwner.registerObserver(mapboxCarMapObserver)\n  }\n\n  /**\n   * @param mapboxCarMapObserver the instance used in [registerObserver]\n   */\n  fun unregisterObserver(mapboxCarMapObserver: MapboxCarMapObserver): MapboxCarMap = apply {\n    carMapSurfaceOwner.unregisterObserver(mapboxCarMapObserver)\n  }\n\n  /**\n   * Optional function to clear all observers registered through [registerObserver]\n   */\n  fun clearObservers(): MapboxCarMap = apply {\n    carMapSurfaceOwner.clearObservers()\n  }\n\n  /**\n   * Override the car gestures with your own implementation. If you would like to build a custom\n   * experience for handling gestures, you can implement the [MapboxCarMapGestureHandler]\n   * interface, or override the [DefaultMapboxCarMapGestureHandler], or set to null to disable\n   * gesture handling.\n   */\n  fun setGestureHandler(gestureHandler: MapboxCarMapGestureHandler?): MapboxCarMap = apply {\n    carMapSurfaceOwner.gestureHandler = gestureHandler\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarMapEx.kt",
    "content": "@file:kotlin.jvm.JvmName(\"MapboxCarMapEx\")\n\npackage com.mapbox.maps.extension.androidauto\n\nimport androidx.car.app.Screen\nimport androidx.car.app.Session\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Shorthand extension for installing the map onto a [Session].\n */\n@MapboxExperimental\nfun Session.mapboxMapInstaller() = MapboxCarMapSessionInstaller(this)\n\n/**\n * Shorthand extension for installing an experience onto a [Screen].\n */\n@MapboxExperimental\nfun Screen.mapboxMapInstaller(mapboxCarMap: MapboxCarMap) =\n  MapboxCarMapScreenInstaller(this, mapboxCarMap)"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarMapGestureHandler.java",
    "content": "package com.mapbox.maps.extension.androidauto;\n\nimport androidx.annotation.NonNull;\nimport androidx.car.app.SurfaceCallback;\n\nimport com.mapbox.maps.ScreenCoordinate;\n\n/**\n * This interface captures gesture events from Android Auto's {@link SurfaceCallback}. In order to\n * customize the map gestures provided, you can set your own gestures\n * with {@link MapboxCarMap#setGestureHandler}.\n *\n * @since 1.0.0\n */\npublic interface MapboxCarMapGestureHandler {\n\n  /**\n   * Allows you to implement or observe the map scroll gesture handler. The surface is\n   * [MapboxCarMapObserver.onAttached] before this can be triggered.\n   *\n   * @see SurfaceCallback#onScroll for instructions to enable.\n   *\n   * @param mapboxCarMapSurface loaded and ready car map surface\n   * @param distanceX the distance in pixels along the X axis\n   * @param distanceY the distance in pixels along the Y axis\n   */\n  default void onScroll(\n    @NonNull MapboxCarMapSurface mapboxCarMapSurface,\n    @NonNull ScreenCoordinate visibleCenter,\n    float distanceX,\n    float distanceY\n  ) {\n    // Optional override\n  }\n\n  /**\n   * Allows you to implement or observe the map fling gesture handler. The surface is\n   * {@link MapboxCarMapObserver#onAttached} before this can be triggered.\n   *\n   * @see SurfaceCallback#onFling for instructions to enable.\n   *\n   * @param mapboxCarMapSurface loaded and ready car map surface\n   * @param velocityX the velocity of this fling measured in pixels per second along the x axis\n   * @param velocityY the velocity of this fling measured in pixels per second along the y axis\n   */\n  default void onFling(\n    @NonNull MapboxCarMapSurface mapboxCarMapSurface,\n    float velocityX,\n    float velocityY\n  ) {\n    // Optional override\n  }\n\n  /**\n   * Allows you to implement or observe the map scale gesture handler. The surface is\n   * {@link MapboxCarMapObserver#onAttached} before this can be triggered.\n   *\n   * @see SurfaceCallback#onScale for instructions to enable.\n   *\n   * @param mapboxCarMapSurface loaded and ready car map surface\n   * @param focusX x coordinate of the focal point in pixels. A negative value indicates that the focal point is unavailable.\n   * @param focusY y coordinate of the focal point in pixels. A negative value indicates that the focal point is unavailable.\n   * @param scaleFactor the scaling factor from the previous state to the current state during the scale event. This value is defined as (current state) / (previous state)\n   */\n  default void onScale(\n    @NonNull MapboxCarMapSurface mapboxCarMapSurface,\n    float focusX,\n    float focusY,\n    float scaleFactor\n  ) {\n    // Optional override\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarMapInitializer.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport androidx.car.app.CarContext\nimport androidx.car.app.Session\nimport androidx.lifecycle.Lifecycle\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Lazy initialization for the [MapInitOptions]. The [CarContext] is not created until the [Session]\n * has been created. Use this initializer to specify custom initial map options.\n */\n@MapboxExperimental\nfun interface MapboxCarMapInitializer {\n  /**\n   * Triggered once the [Session] reaches the [Lifecycle.State.CREATED] state.\n   *\n   * @param carContext from [Session.getCarContext].\n   * @return [MapInitOptions] for the initial [MapboxCarMap] configuration.\n   */\n  fun onCreate(carContext: CarContext): MapInitOptions\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarMapObserver.java",
    "content": "package com.mapbox.maps.extension.androidauto;\n\nimport android.graphics.Rect;\n\nimport androidx.annotation.NonNull;\nimport androidx.car.app.SurfaceCallback;\n\nimport com.mapbox.maps.EdgeInsets;\n\n/**\n * Many downstream services will not work until the surface has been created and the map has\n * loaded. This interface allows you to create custom Mapbox experiences for the car.\n *\n * @since 1.0.0\n */\npublic interface MapboxCarMapObserver {\n\n  /**\n   * Called when a {@link MapboxCarMapSurface} has been loaded.\n   * You can assume there will only be a single surface at a time.\n   *\n   * @see MapboxCarMap#registerObserver\n   *\n   * @param mapboxCarMapSurface loaded and ready to use car map surface\n   */\n  default void onAttached(@NonNull MapboxCarMapSurface mapboxCarMapSurface) {\n    // No op by default\n  }\n\n  /**\n   * Called when a {@link MapboxCarMapSurface} has been detached from this observer. Some examples that\n   * can cause this to detach are:\n   * - {@link MapboxCarMap} lifecycle is destroyed\n   * - This observer has been unregistered with {@link MapboxCarMap#unregisterObserver}\n   *\n   * You can assume that there was a corresponding call to {@link #onAttached} with the same\n   * [MapboxCarMapObserver] instance.\n   *\n   * @param mapboxCarMapSurface loaded and ready car map surface\n   */\n  default void onDetached(@NonNull MapboxCarMapSurface mapboxCarMapSurface) {\n    // No op by default\n  }\n\n  /**\n   * Called when the car library updates the visible regions for the surface. For example, this\n   * is triggered when the action buttons come in and out of visibility.\n   * You can assume this will be called after {@link #onAttached}.\n   *\n   * @see SurfaceCallback#onVisibleAreaChanged(Rect) for more details.\n   *\n   * @param visibleArea the visible area provided by the host\n   * @param edgeInsets distance from each side of the screen that creates the visibleArea\n   */\n  default void onVisibleAreaChanged(@NonNull Rect visibleArea, @NonNull EdgeInsets edgeInsets) {\n    // No op by default\n  }\n\n  /**\n   * Called when the car library updates the stable region for the surface. This area will remain\n   * constant while the visible area changes when views come in and out of view.\n   *\n   * @see SurfaceCallback#onStableAreaChanged(Rect) for more details.\n   *\n   * @param stableArea the stable area provided by the host\n   * @param edgeInsets distance from each side of the screen that creates the stableArea\n   */\n  default void onStableAreaChanged(@NonNull Rect stableArea, @NonNull EdgeInsets edgeInsets) {\n    // No op by default\n  }\n}\n"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarMapScreenInstaller.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport androidx.car.app.Screen\nimport androidx.lifecycle.DefaultLifecycleObserver\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleOwner\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * When attaching the many possible experiences onto [MapboxCarMap], this installer allows you to\n * remove all the boilerplate. Use this installer for creating experiences that will be\n * attached as long as a screen is in use. To assign an experience to the entire app lifecycle\n * please use the [MapboxCarMapSessionInstaller].\n *\n * Use this to setup each [Screen]. Use the [Screen.mapboxMapInstaller] extension!\n *\n * @param screen Android Auto Screen.\n * @param mapboxCarMap instance that can be also be found from the [install] function.\n */\n@MapboxExperimental\nclass MapboxCarMapScreenInstaller(\n  private val screen: Screen,\n  private val mapboxCarMap: MapboxCarMap\n) {\n  private val onCreated = mutableSetOf<MapboxCarMapObserver>()\n  private val onStarted = mutableSetOf<MapboxCarMapObserver>()\n  private val onResumed = mutableSetOf<MapboxCarMapObserver>()\n  private var gestureHandler: MapboxCarMapGestureHandler? = DefaultMapboxCarMapGestureHandler()\n\n  /**\n   * @param observers observers that will be attached while the [Screen] is in the\n   * [Lifecycle.State.CREATED] state.\n   */\n  fun onCreated(vararg observers: MapboxCarMapObserver): MapboxCarMapScreenInstaller = apply {\n    onCreated.addAll(observers)\n  }\n\n  /**\n   * @param observers observers that will be attached while the [Screen] is in the\n   * [Lifecycle.State.STARTED] state.\n   */\n  fun onStarted(vararg observers: MapboxCarMapObserver): MapboxCarMapScreenInstaller = apply {\n    onStarted.addAll(observers)\n  }\n\n  /**\n   * @param observers observers that will be attached while the [Screen] is in the\n   * [Lifecycle.State.RESUMED] state.\n   */\n  fun onResumed(vararg observers: MapboxCarMapObserver): MapboxCarMapScreenInstaller = apply {\n    onResumed.addAll(observers)\n  }\n\n  /**\n   * @param handler gesture handler that will be used while the [Screen] is in the\n   * [Lifecycle.State.RESUMED] state.\n   */\n  fun gestureHandler(handler: MapboxCarMapGestureHandler?): MapboxCarMapScreenInstaller = apply {\n    gestureHandler = handler\n  }\n\n  /**\n   * Subscribes to the [Screen] lifecycle and coordinates assigns the observers to their specified\n   * lifecycle.\n   *\n   * @return [mapboxCarMap]\n   */\n  fun install(): MapboxCarMap {\n    screen.lifecycle.addObserver(object : DefaultLifecycleObserver {\n      override fun onCreate(owner: LifecycleOwner) {\n        onCreated.forEach { mapboxCarMap.registerObserver(it) }\n      }\n\n      override fun onStart(owner: LifecycleOwner) {\n        onStarted.forEach { mapboxCarMap.registerObserver(it) }\n      }\n\n      override fun onResume(owner: LifecycleOwner) {\n        onResumed.forEach { mapboxCarMap.registerObserver(it) }\n        gestureHandler?.let { mapboxCarMap.setGestureHandler(it) }\n      }\n\n      override fun onPause(owner: LifecycleOwner) {\n        onResumed.reversed().forEach { mapboxCarMap.unregisterObserver(it) }\n        mapboxCarMap.setGestureHandler(DefaultMapboxCarMapGestureHandler())\n      }\n\n      override fun onStop(owner: LifecycleOwner) {\n        onStarted.reversed().forEach { mapboxCarMap.unregisterObserver(it) }\n      }\n\n      override fun onDestroy(owner: LifecycleOwner) {\n        onCreated.reversed().forEach { mapboxCarMap.unregisterObserver(it) }\n      }\n    })\n    return mapboxCarMap\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarMapSessionInstaller.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport androidx.car.app.Session\nimport androidx.lifecycle.DefaultLifecycleObserver\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleOwner\nimport com.mapbox.maps.ContextMode\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.logW\n\n/**\n * When attaching the many possible experiences onto [MapboxCarMap], this installer allows you to\n * remove all the boilerplate. Use this installer for creating experiences that will be\n * attached as long as the head unit is using your application. To assign an experience to a screen\n * please use the [MapboxCarMapScreenInstaller].\n *\n * Use this to setup the [Session]. Use the [Session.mapboxMapInstaller] extension!\n *\n * @param session Android Auto Session.\n * @param mapboxCarMap instance that can be also be found from the [install] function.\n */\n@MapboxExperimental\nclass MapboxCarMapSessionInstaller(\n  private val session: Session,\n  private val mapboxCarMap: MapboxCarMap = MapboxCarMap()\n) {\n  private val onCreated = mutableSetOf<MapboxCarMapObserver>()\n  private val onStarted = mutableSetOf<MapboxCarMapObserver>()\n  private val onResumed = mutableSetOf<MapboxCarMapObserver>()\n\n  /**\n   * @param observers observers that will be attached while the [Session] is in the\n   * [Lifecycle.State.CREATED] state.\n   */\n  fun onCreated(vararg observers: MapboxCarMapObserver): MapboxCarMapSessionInstaller = apply {\n    onCreated.addAll(observers)\n  }\n\n  /**\n   * @param observers observers that will be attached while the [Session] is in the\n   * [Lifecycle.State.STARTED] state.\n   */\n  fun onStarted(vararg observers: MapboxCarMapObserver): MapboxCarMapSessionInstaller = apply {\n    onStarted.addAll(observers)\n  }\n\n  /**\n   * @param observers observers that will be attached while the [Session] is in the\n   * [Lifecycle.State.RESUMED] state.\n   */\n  fun onResumed(vararg observers: MapboxCarMapObserver): MapboxCarMapSessionInstaller = apply {\n    onResumed.addAll(observers)\n  }\n\n  /**\n   * Subscribes to the [Session] lifecycle and coordinates assigns the observers to their specified\n   * lifecycle.\n   *\n   * @param initializer for specifying custom [MapInitOptions] configurations\n   * @return [mapboxCarMap]\n   */\n  @JvmOverloads\n  fun install(\n    initializer: MapboxCarMapInitializer = defaultInitializer\n  ): MapboxCarMap {\n    session.lifecycle.addObserver(object : DefaultLifecycleObserver {\n      override fun onCreate(owner: LifecycleOwner) {\n        val carContext = session.carContext\n        val mapInitOptions = initializer.onCreate(carContext)\n        enforceSharedContext(mapInitOptions)\n        mapboxCarMap.setup(carContext, mapInitOptions)\n        onCreated.forEach { mapboxCarMap.registerObserver(it) }\n      }\n\n      override fun onStart(owner: LifecycleOwner) {\n        onStarted.forEach { mapboxCarMap.registerObserver(it) }\n      }\n\n      override fun onResume(owner: LifecycleOwner) {\n        onResumed.forEach { mapboxCarMap.registerObserver(it) }\n      }\n\n      override fun onPause(owner: LifecycleOwner) {\n        onResumed.reversed().forEach { mapboxCarMap.unregisterObserver(it) }\n      }\n\n      override fun onStop(owner: LifecycleOwner) {\n        onStarted.reversed().forEach { mapboxCarMap.unregisterObserver(it) }\n      }\n\n      override fun onDestroy(owner: LifecycleOwner) {\n        mapboxCarMap.clearObservers()\n      }\n    })\n    return mapboxCarMap\n  }\n\n  private fun enforceSharedContext(mapInitOptions: MapInitOptions) {\n    if (mapInitOptions.mapOptions.contextMode != ContextMode.SHARED) {\n      if (mapInitOptions.mapOptions.contextMode == ContextMode.UNIQUE) {\n        logW(\n          TAG,\n          \"Explicitly switching context mode to MapOptions.contextMode = ContextMode.SHARED when creating the car map surface. \" +\n            \"ContextMode.UNIQUE is not allowed as it leads to graphical artifacts and crashes.\"\n        )\n      }\n      mapInitOptions.mapOptions = mapInitOptions.mapOptions.toBuilder()\n        .contextMode(ContextMode.SHARED)\n        .build()\n    }\n  }\n\n  private companion object {\n    private const val TAG = \"CarMapSessionInstaller\"\n    private val defaultInitializer = MapboxCarMapInitializer { carContext ->\n      MapInitOptions(context = carContext)\n    }\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarMapSurface.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport androidx.car.app.CarContext\nimport androidx.car.app.SurfaceContainer\nimport com.mapbox.maps.MapSurface\n\n/**\n * This contains the Android Auto head unit map information.\n * @see MapboxCarMap.registerObserver\n *\n * @property carContext reference to the context provided to the [MapboxCarMap]\n * @property mapSurface Mapbox controllable interface\n * @property surfaceContainer A container for the Surface created by the car.\n */\nclass MapboxCarMapSurface internal constructor(\n  val carContext: CarContext,\n  val mapSurface: MapSurface,\n  val surfaceContainer: SurfaceContainer,\n) {\n  /**\n   * Get a string representation of the map surface.\n   *\n   * @return the string representation\n   */\n  override fun toString(): String {\n    return \"MapboxCarMapSurface(carContext=$carContext,\" +\n      \" mapSurface=$mapSurface,\" +\n      \" surfaceContainer=$surfaceContainer\" +\n      \")\"\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/MapboxCarTelemetryEvents.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport com.mapbox.maps.module.TelemetryEvent\n\ninternal object MapboxCarTelemetryEvents {\n  val map = TelemetryEvent.create(\"androidauto/map\")\n}"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/widgets/CompassWidget.kt",
    "content": "package com.mapbox.maps.extension.androidauto.widgets\n\nimport android.content.Context\nimport android.graphics.BitmapFactory\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.androidauto.R\nimport com.mapbox.maps.renderer.widget.BitmapWidget\nimport com.mapbox.maps.renderer.widget.WidgetPosition\n\n/**\n * Widget shows compass. Positioned in the top right corner by default.\n *\n * Note: This feature is only available for Android Maps SDK v10.4.0 and above\n *\n * @since Maps SDK v10.4.0\n *\n * @param position position of compass\n * @param marginX horizontal margin in pixels\n * @param marginY vertical margin in pixels\n */\n@MapboxExperimental\nclass CompassWidget(\n  context: Context,\n  position: WidgetPosition = WidgetPosition(\n    horizontal = WidgetPosition.Horizontal.RIGHT,\n    vertical = WidgetPosition.Vertical.TOP,\n  ),\n  marginX: Float = 20f,\n  marginY: Float = 20f,\n) : BitmapWidget(\n  bitmap = BitmapFactory.decodeResource(context.resources, R.drawable.mapbox_compass_icon),\n  position = position,\n  marginX = marginX,\n  marginY = marginY,\n)"
  },
  {
    "path": "extension-androidauto/src/main/java/com/mapbox/maps/extension/androidauto/widgets/LogoWidget.kt",
    "content": "package com.mapbox.maps.extension.androidauto.widgets\n\nimport android.content.Context\nimport android.graphics.BitmapFactory\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.androidauto.R\nimport com.mapbox.maps.renderer.widget.BitmapWidget\nimport com.mapbox.maps.renderer.widget.WidgetPosition\n\n/**\n * Widget shows compass. Positioned in the bottom left corner by default.\n *\n * Note: This feature is only available for Android Maps SDK v10.4.0 and above\n *\n * @since Maps SDK v10.4.0\n *\n * @param position position of logo\n * @param marginX horizontal margin in pixels\n * @param marginY vertical margin in pixels\n */\n@MapboxExperimental\nclass LogoWidget constructor(\n  context: Context,\n  position: WidgetPosition = WidgetPosition(\n    horizontal = WidgetPosition.Horizontal.LEFT,\n    vertical = WidgetPosition.Vertical.BOTTOM,\n  ),\n  marginX: Float = 20f,\n  marginY: Float = 20f,\n) : BitmapWidget(\n  bitmap = BitmapFactory.decodeResource(context.resources, R.drawable.mapbox_logo_icon),\n  position = position,\n  marginX = marginX,\n  marginY = marginY,\n)"
  },
  {
    "path": "extension-androidauto/src/test/java/com/mapbox/maps/extension/androidauto/CarMapSurfaceOwnerTest.kt",
    "content": "@file:Suppress(\"NoMockkVerifyImport\")\n\npackage com.mapbox.maps.extension.androidauto\n\nimport android.graphics.Rect\nimport android.view.Surface\nimport androidx.car.app.AppManager\nimport androidx.car.app.CarContext\nimport androidx.car.app.SurfaceContainer\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapSurface\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.logI\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkObject\nimport io.mockk.mockkStatic\nimport io.mockk.slot\nimport io.mockk.unmockkAll\nimport io.mockk.verify\nimport io.mockk.verifyOrder\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass CarMapSurfaceOwnerTest {\n\n  private val carMapGestures = mockk<DefaultMapboxCarMapGestureHandler>(relaxed = true)\n  private val carContext: CarContext = mockk(relaxed = true)\n  private val mapInitOptions: MapInitOptions = mockk(relaxed = true)\n  private val testSurface: Surface = mockk(relaxed = true)\n  private val testMapSurface: MapSurface = mockk(relaxed = true)\n\n  private val carMapSurfaceOwner = CarMapSurfaceOwner(carMapGestures)\n\n  @Before\n  fun `set up mocks`() {\n    every {\n      carContext.getCarService(AppManager::class.java).setSurfaceCallback(carMapSurfaceOwner)\n    } just Runs\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    mockkObject(MapSurfaceProvider)\n    every { MapSurfaceProvider.create(any(), any(), any()) } returns testMapSurface\n  }\n\n  @After\n  fun teardown() {\n    unmockkAll()\n  }\n\n  @Test\n  fun `should not notify observer loaded when there is no surface`() {\n    val firstObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    val secondObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(firstObserver)\n    carMapSurfaceOwner.registerObserver(secondObserver)\n    carMapSurfaceOwner.unregisterObserver(firstObserver)\n    carMapSurfaceOwner.clearObservers()\n\n    verify(exactly = 0) { firstObserver.onAttached(any()) }\n    verify(exactly = 0) { secondObserver.onAttached(any()) }\n  }\n\n  @Test\n  fun `should not notify observer detached when there is no surface`() {\n    val firstObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    val secondObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(firstObserver)\n    carMapSurfaceOwner.registerObserver(secondObserver)\n    carMapSurfaceOwner.unregisterObserver(firstObserver)\n    carMapSurfaceOwner.clearObservers()\n\n    verify(exactly = 0) { firstObserver.onDetached(any()) }\n    verify(exactly = 0) { secondObserver.onDetached(any()) }\n  }\n\n  @Test\n  fun `onSurfaceAvailable should notify observers that map is loaded`() {\n    val firstObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    val secondObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(firstObserver)\n    carMapSurfaceOwner.registerObserver(secondObserver)\n\n    val surfaceContainer: SurfaceContainer = mockk(relaxed = true)\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(surfaceContainer)\n\n    verify(exactly = 1) { firstObserver.onAttached(any()) }\n    verify(exactly = 1) { secondObserver.onAttached(any()) }\n  }\n\n  @Test\n  fun `surfaceAvailable should not notify visibleAreaChanged when visible area is null`() {\n    val firstObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    val secondObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(firstObserver)\n    carMapSurfaceOwner.registerObserver(secondObserver)\n\n    val surfaceContainer: SurfaceContainer = mockk(relaxed = true)\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(surfaceContainer)\n\n    verify(exactly = 0) { firstObserver.onVisibleAreaChanged(any(), any()) }\n    verify(exactly = 0) { secondObserver.onVisibleAreaChanged(any(), any()) }\n  }\n\n  @Test\n  fun `surfaceVisibleAreaChanged should notify visibleAreaChanged when surface is available`() {\n    val firstObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    val secondObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(firstObserver)\n    carMapSurfaceOwner.registerObserver(secondObserver)\n\n    val surfaceContainer: SurfaceContainer = mockk {\n      every { width } returns 800\n      every { height } returns 400\n      every { surface } returns testSurface\n    }\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(surfaceContainer)\n    val visibleRect: Rect = mockk(relaxed = true)\n    carMapSurfaceOwner.onVisibleAreaChanged(visibleRect)\n\n    verify(exactly = 1) { firstObserver.onVisibleAreaChanged(any(), any()) }\n    verify(exactly = 1) { secondObserver.onVisibleAreaChanged(any(), any()) }\n  }\n\n  @Test\n  fun `surfaceVisibleAreaChanged should not notify visibleAreaChanged when surface is not available`() {\n    val firstObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    val secondObserver: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(firstObserver)\n    carMapSurfaceOwner.registerObserver(secondObserver)\n\n    val visibleRect: Rect = mockk(relaxed = true)\n    carMapSurfaceOwner.onVisibleAreaChanged(visibleRect)\n\n    verify(exactly = 0) { firstObserver.onVisibleAreaChanged(any(), any()) }\n    verify(exactly = 0) { secondObserver.onVisibleAreaChanged(any(), any()) }\n  }\n\n  @Test\n  fun `surfaceDestroyed should stop and destroy map before notifying observers`() {\n    val observer: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(observer)\n    val surfaceContainer: SurfaceContainer = mockk {\n      every { width } returns 800\n      every { height } returns 400\n      every { surface } returns testSurface\n    }\n\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(surfaceContainer)\n    carMapSurfaceOwner.onSurfaceDestroyed(surfaceContainer)\n\n    verifyOrder {\n      testMapSurface.onStop()\n      testMapSurface.surfaceDestroyed()\n      testMapSurface.onDestroy()\n      observer.onDetached(any())\n    }\n  }\n\n  @Test\n  fun `onDetached is called after mapboxCarMapSurface becomes null when surfaceDestroyed`() {\n    carMapSurfaceOwner.registerObserver(object : MapboxCarMapObserver {\n      override fun onDetached(mapboxCarMapSurface: MapboxCarMapSurface) {\n        assertNull(carMapSurfaceOwner.mapboxCarMapSurface)\n      }\n    })\n\n    val surfaceContainer: SurfaceContainer = mockk {\n      every { width } returns 800\n      every { height } returns 400\n      every { surface } returns testSurface\n    }\n\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(surfaceContainer)\n    carMapSurfaceOwner.onSurfaceDestroyed(surfaceContainer)\n  }\n\n  @Test\n  fun `onDetached is called after mapboxCarMapSurface becomes null when new surfaceAvailable`() {\n    carMapSurfaceOwner.registerObserver(object : MapboxCarMapObserver {\n      override fun onDetached(mapboxCarMapSurface: MapboxCarMapSurface) {\n        assertNotEquals(carMapSurfaceOwner.mapboxCarMapSurface, mapboxCarMapSurface)\n      }\n    })\n\n    val firstSurface: SurfaceContainer = mockk {\n      every { width } returns 800\n      every { height } returns 400\n      every { surface } returns mockk(relaxed = true)\n    }\n    val secondSurface: SurfaceContainer = mockk {\n      every { width } returns 400\n      every { height } returns 800\n      every { surface } returns mockk(relaxed = true)\n    }\n\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(firstSurface)\n    carMapSurfaceOwner.onVisibleAreaChanged(mockk(relaxed = true))\n    carMapSurfaceOwner.onSurfaceAvailable(secondSurface)\n  }\n\n  @Test\n  fun `should notify destroy and detached old surface when new surface is available`() {\n    val observer: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(observer)\n    val firstSurface: Surface = mockk(relaxed = true)\n    val firstMapSurface: MapSurface = mockk(relaxed = true)\n    every { MapSurfaceProvider.create(any(), firstSurface, mapInitOptions) } returns firstMapSurface\n    val firstContainer: SurfaceContainer = mockk {\n      every { width } returns 800\n      every { height } returns 400\n      every { surface } returns firstSurface\n    }\n    val secondSurface: Surface = mockk(relaxed = true)\n    val secondMapSurface: MapSurface = mockk(relaxed = true)\n    every { MapSurfaceProvider.create(any(), secondSurface, mapInitOptions) } returns secondMapSurface\n    val secondContainer: SurfaceContainer = mockk {\n      every { width } returns 400\n      every { height } returns 800\n      every { surface } returns secondSurface\n    }\n\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(firstContainer)\n    carMapSurfaceOwner.onVisibleAreaChanged(mockk(relaxed = true))\n    carMapSurfaceOwner.onSurfaceAvailable(secondContainer)\n\n    verifyOrder {\n      // Verify the initial setup\n      firstMapSurface.onStart()\n      firstMapSurface.surfaceCreated()\n      firstMapSurface.surfaceChanged(800, 400)\n      observer.onAttached(match { it.mapSurface == firstMapSurface })\n      observer.onVisibleAreaChanged(any(), any())\n\n      // Start attaching new surface and detaching the old one\n      secondMapSurface.onStart()\n      secondMapSurface.surfaceCreated()\n      secondMapSurface.surfaceChanged(400, 800)\n      observer.onDetached(match { it.mapSurface == firstMapSurface })\n      firstMapSurface.onStop()\n      firstMapSurface.surfaceDestroyed()\n      firstMapSurface.onDestroy()\n      observer.onAttached(match { it.mapSurface == secondMapSurface })\n      observer.onVisibleAreaChanged(any(), any())\n    }\n  }\n\n  @Test\n  fun `surfaceVisibleAreaChanged should notify visibleAreaChanged with edgeInsets`() {\n    val observer: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(observer)\n    val visibleAreaSlot = slot<Rect>()\n    val edgeInsets = slot<EdgeInsets>()\n    every {\n      observer.onVisibleAreaChanged(capture(visibleAreaSlot), capture(edgeInsets))\n    } just Runs\n    val surfaceContainer: SurfaceContainer = mockk {\n      every { width } returns 800\n      every { height } returns 400\n      every { surface } returns testSurface\n    }\n\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(surfaceContainer)\n    val visibleRect = Rect(30, 112, 779, 381)\n    carMapSurfaceOwner.onVisibleAreaChanged(visibleRect)\n\n    assertEquals(visibleRect, visibleAreaSlot.captured)\n    // edgeInset.left = visibleRect.left = 30\n    assertEquals(30.0, edgeInsets.captured.left, 0.0001)\n    // edgeInset.top = visibleRect.top = 112\n    assertEquals(112.0, edgeInsets.captured.top, 0.0001)\n    // edgeInset.right = surfaceContainer.width - visibleRect.right = 800 - 779 = 21\n    assertEquals(21.0, edgeInsets.captured.right, 0.0001)\n    // edgeInsets.bottom = surfaceContainer.height - visibleRect.bottom = 400 - 381 = 19\n    assertEquals(19.0, edgeInsets.captured.bottom, 0.0001)\n  }\n\n  @Test\n  fun `visibleCenter is zero by default`() {\n    val visibleCenter = carMapSurfaceOwner.visibleCenter\n    assertEquals(0.0, visibleCenter.x, 0.0001)\n    assertEquals(0.0, visibleCenter.y, 0.0001)\n  }\n\n  @Test\n  fun `surfaceAvailable finds the visibleCenter`() {\n    val observer: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(observer)\n    val visibleAreaSlot = slot<Rect>()\n    val edgeInsets = slot<EdgeInsets>()\n    every {\n      observer.onVisibleAreaChanged(capture(visibleAreaSlot), capture(edgeInsets))\n    } just Runs\n    val surfaceContainer: SurfaceContainer = mockk {\n      every { width } returns 805\n      every { height } returns 405\n      every { surface } returns testSurface\n    }\n\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(surfaceContainer)\n    val visibleCenter = carMapSurfaceOwner.visibleCenter\n\n    assertEquals(402.5, visibleCenter.x, 0.0001)\n    assertEquals(202.5, visibleCenter.y, 0.0001)\n  }\n\n  @Test\n  fun `surfaceVisibleAreaChanged finds the visibleCenter`() {\n    val observer: MapboxCarMapObserver = mockk(relaxed = true)\n    carMapSurfaceOwner.registerObserver(observer)\n    val visibleAreaSlot = slot<Rect>()\n    val edgeInsets = slot<EdgeInsets>()\n    every {\n      observer.onVisibleAreaChanged(capture(visibleAreaSlot), capture(edgeInsets))\n    } just Runs\n    val surfaceContainer: SurfaceContainer = mockk {\n      every { width } returns 805\n      every { height } returns 405\n      every { surface } returns testSurface\n    }\n\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(surfaceContainer)\n    val visibleRect = Rect(133, 112, 779, 381)\n    carMapSurfaceOwner.onVisibleAreaChanged(visibleRect)\n\n    val visibleCenter = carMapSurfaceOwner.visibleCenter\n    assertEquals(456.0, visibleCenter.x, 0.0001)\n    assertEquals(246.5, visibleCenter.y, 0.0001)\n  }\n\n  @Test\n  fun `gesture detector is not called before surface is ready`() {\n    carMapSurfaceOwner.onScroll(1f, 1f)\n    carMapSurfaceOwner.onFling(1f, 1f)\n    carMapSurfaceOwner.onScale(50f, 100f, 1f)\n\n    verify(exactly = 0) { carMapGestures.onScale(any(), any(), any(), any()) }\n    verify(exactly = 0) { carMapGestures.onFling(any(), any(), any()) }\n    verify(exactly = 0) { carMapGestures.onScale(any(), any(), any(), any()) }\n  }\n\n  @Test\n  fun `default gesture detector is called after surface is ready`() {\n    carMapSurfaceOwner.setup(carContext, mapInitOptions)\n    carMapSurfaceOwner.onSurfaceAvailable(\n      mockk {\n        every { width } returns 805\n        every { height } returns 405\n        every { surface } returns testSurface\n      }\n    )\n\n    carMapSurfaceOwner.onScroll(1f, 1f)\n    carMapSurfaceOwner.onFling(1f, 1f)\n    carMapSurfaceOwner.onScale(50f, 100f, 1f)\n\n    verify(exactly = 1) { carMapGestures.onScale(any(), any(), any(), any()) }\n    verify(exactly = 1) { carMapGestures.onFling(any(), any(), any()) }\n    verify(exactly = 1) { carMapGestures.onScale(any(), any(), any(), any()) }\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/test/java/com/mapbox/maps/extension/androidauto/DefaultMapboxCarMapGestureHandlerTest.kt",
    "content": "@file:Suppress(\"NoMockkVerifyImport\")\n\npackage com.mapbox.maps.extension.androidauto\n\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapCenterAltitudeMode\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.plugin.animation.camera\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass DefaultMapboxCarMapGestureHandlerTest {\n\n  private val surface = mockk<MapboxCarMapSurface>(relaxed = true) {\n    every { mapSurface } returns mockk {\n      every { mapboxMap } returns mockk {\n        every { getCenterAltitudeMode() } returns MapCenterAltitudeMode.TERRAIN\n        every { setCenterAltitudeMode(any()) } just runs\n        every { setGestureInProgress(any()) } just runs\n        every { cameraForDrag(any(), any()) } returns CameraOptions.Builder().build()\n        every { setCamera(any<CameraOptions>()) } just runs\n      }\n      every { camera } returns mockk(relaxed = true)\n    }\n  }\n  private val carMapGestures = DefaultMapboxCarMapGestureHandler()\n\n  @Before\n  fun `set up mocks`() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanup() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun `onScroll will start and stop dragging`() {\n    val center = ScreenCoordinate(450.0, 225.0)\n    val mapboxMap = surface.mapSurface.mapboxMap\n\n    carMapGestures.onScroll(surface, center, 3.0f, -3.0f)\n\n    verifyOrder {\n      mapboxMap.getCenterAltitudeMode()\n      mapboxMap.getCenterAltitudeMode()\n      mapboxMap.setGestureInProgress(true)\n      mapboxMap.setCenterAltitudeMode(MapCenterAltitudeMode.SEA)\n      mapboxMap.cameraForDrag(any(), any())\n      mapboxMap.setCamera(any<CameraOptions>())\n      mapboxMap.setCenterAltitudeMode(MapCenterAltitudeMode.TERRAIN)\n      mapboxMap.setGestureInProgress(false)\n    }\n  }\n\n  @Test\n  fun `onScroll with center altitude mode set to SEA`() {\n    val center = ScreenCoordinate(450.0, 225.0)\n    val mapboxMap = surface.mapSurface.mapboxMap\n\n    every { mapboxMap.getCenterAltitudeMode() } returns MapCenterAltitudeMode.SEA\n\n    carMapGestures.onScroll(surface, center, 3.0f, -3.0f)\n\n    verifyOrder {\n      mapboxMap.getCenterAltitudeMode()\n      mapboxMap.getCenterAltitudeMode()\n      mapboxMap.setGestureInProgress(true)\n      mapboxMap.cameraForDrag(any(), any())\n      mapboxMap.setCamera(any<CameraOptions>())\n      mapboxMap.setGestureInProgress(false)\n    }\n  }\n\n  @Test\n  fun `onScroll will move camera from visibleCenter to the delta distance`() {\n    val fromCoordinateSlot = slot<ScreenCoordinate>()\n    val toCoordinateSlot = slot<ScreenCoordinate>()\n    val mapboxMap = surface.mapSurface.mapboxMap\n    every {\n      mapboxMap.cameraForDrag(capture(fromCoordinateSlot), capture(toCoordinateSlot))\n    } returns mockk(relaxed = true)\n\n    val center = ScreenCoordinate(450.0, 225.0)\n    carMapGestures.onScroll(surface, center, 3.3f, -3.3f)\n\n    assertEquals(450.0, fromCoordinateSlot.captured.x, 0.0001)\n    assertEquals(225.0, fromCoordinateSlot.captured.y, 0.0001)\n    assertEquals(446.7, toCoordinateSlot.captured.x, 0.0001)\n    assertEquals(228.3, toCoordinateSlot.captured.y, 0.0001)\n  }\n\n  @Test\n  fun `onScale double-tap-gesture will easeTo new zoom`() {\n    every { surface.mapSurface.mapboxMap.cameraState } returns mockk {\n      every { zoom } returns 10.0\n    }\n    val cameraOptionsSlot = slot<CameraOptions>()\n    every {\n      surface.mapSurface.camera.easeTo(capture(cameraOptionsSlot))\n    } returns mockk(relaxed = true)\n\n    carMapGestures.onScale(surface, 526.0f, 260.0f, 2.0f)\n\n    with(cameraOptionsSlot.captured) {\n      assertEquals(526.0, anchor!!.x, 0.0001)\n      assertEquals(260.0, anchor!!.y, 0.0001)\n      assertEquals(11.0, zoom!!, 0.0001)\n    }\n  }\n\n  @Test\n  fun `onScale will use the focus as the anchor point`() {\n    val mapboxMap = surface.mapSurface.mapboxMap\n    every { mapboxMap.cameraState } returns mockk {\n      every { zoom } returns 16.50\n    }\n    val cameraOptionsSlot = slot<CameraOptions>()\n    every {\n      mapboxMap.setCamera(capture(cameraOptionsSlot))\n    } returns mockk(relaxed = true)\n\n    carMapGestures.onScale(surface, 224.4f, 117.1f, 0.98f)\n\n    with(cameraOptionsSlot.captured.anchor!!) {\n      assertEquals(224.4, x, 0.0001)\n      assertEquals(117.1, y, 0.0001)\n    }\n  }\n\n  @Test\n  fun `onScale with factor less than one will zoom out`() {\n    val expectedFromZoom = 16.50\n    val expectedToZoom = 16.48\n    val mapboxMap = surface.mapSurface.mapboxMap\n    every { mapboxMap.cameraState } returns mockk {\n      every { zoom } returns expectedFromZoom\n    }\n    val cameraOptionsSlot = slot<CameraOptions>()\n    every {\n      mapboxMap.setCamera(capture(cameraOptionsSlot))\n    } returns mockk(relaxed = true)\n\n    carMapGestures.onScale(surface, 400.0f, 200.0f, 0.98f)\n\n    assertEquals(expectedToZoom, cameraOptionsSlot.captured.zoom!!, 0.0001)\n  }\n\n  @Test\n  fun `onScale with factor greater than one will zoom in`() {\n    val expectedFromZoom = 16.50\n    val expectedToZoom = 16.52\n    val mapboxMap = surface.mapSurface.mapboxMap\n    every { mapboxMap.cameraState } returns mockk {\n      every { zoom } returns expectedFromZoom\n    }\n    val cameraOptionsSlot = slot<CameraOptions>()\n    every {\n      mapboxMap.setCamera(capture(cameraOptionsSlot))\n    } returns mockk(relaxed = true)\n\n    carMapGestures.onScale(surface, 400.0f, 200.0f, 1.02f)\n\n    assertEquals(expectedToZoom, cameraOptionsSlot.captured.zoom!!, 0.0001)\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/test/java/com/mapbox/maps/extension/androidauto/MapboxCarMapScreenInstallerTest.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport androidx.car.app.Screen\nimport androidx.lifecycle.Lifecycle\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.androidauto.testing.TestLifecycleOwner\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.verify\nimport io.mockk.verifyOrder\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass MapboxCarMapScreenInstallerTest {\n\n  @Test\n  fun `should attach created in created state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val screen = mockk<Screen> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapScreenInstaller(screen, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install()\n    lifecycleOwner.moveToState(Lifecycle.State.CREATED)\n\n    verify { mapboxCarMap.registerObserver(createdObserver) }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n    }\n  }\n\n  @Test\n  fun `should attach started in started state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val screen = mockk<Screen> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapScreenInstaller(screen, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install()\n    lifecycleOwner.moveToState(Lifecycle.State.STARTED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n    }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n    }\n  }\n\n  @Test\n  fun `should attach resumed in resumed state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val screen = mockk<Screen> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapScreenInstaller(screen, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install()\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n    }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n    }\n  }\n\n  @Test\n  fun `should detach resumed in started state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val screen = mockk<Screen> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapScreenInstaller(screen, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install()\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n    lifecycleOwner.moveToState(Lifecycle.State.STARTED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n    }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n    }\n  }\n\n  @Test\n  fun `should detach started in created state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val screen = mockk<Screen> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapScreenInstaller(screen, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install()\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n    lifecycleOwner.moveToState(Lifecycle.State.CREATED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n    }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n    }\n  }\n\n  @Test\n  fun `should detach observers when destroyed`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val screen = mockk<Screen> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapScreenInstaller(screen, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install()\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n    lifecycleOwner.moveToState(Lifecycle.State.DESTROYED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n      mapboxCarMap.unregisterObserver(createdObserver)\n    }\n  }\n\n  @Test\n  fun `should set gesture handler to resumed state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val screen = mockk<Screen> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val gestureHandler = mockk<MapboxCarMapGestureHandler>()\n    val mapboxCarMap = MapboxCarMapScreenInstaller(screen, mockk(relaxed = true))\n      .gestureHandler(gestureHandler)\n      .onResumed(resumedObserver)\n      .install()\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n    lifecycleOwner.moveToState(Lifecycle.State.DESTROYED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.setGestureHandler(gestureHandler)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n      mapboxCarMap.setGestureHandler(match { it is DefaultMapboxCarMapGestureHandler })\n    }\n  }\n\n  @Test\n  fun `should not setup anything before install`() {\n    val mapboxCarMap = mockk<MapboxCarMap>(relaxed = true)\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Screen> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    MapboxCarMapScreenInstaller(session, mapboxCarMap)\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n\n    verify(exactly = 0) {\n      mapboxCarMap.setup(any(), any())\n      mapboxCarMap.registerObserver(any())\n      mapboxCarMap.unregisterObserver(any())\n      mapboxCarMap.setGestureHandler(any())\n    }\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/test/java/com/mapbox/maps/extension/androidauto/MapboxCarMapSessionInstallerTest.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport androidx.car.app.CarContext\nimport androidx.car.app.Session\nimport androidx.lifecycle.Lifecycle\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.androidauto.testing.TestLifecycleOwner\nimport io.mockk.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass MapboxCarMapSessionInstallerTest {\n\n  @Test\n  fun `install should setup MapboxCarMap and then register created observers`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Session> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val observer = mockk<MapboxCarMapObserver>(relaxed = true)\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .onCreated(observer)\n      .install(mockCarInitializer())\n    lifecycleOwner.moveToState(Lifecycle.State.CREATED)\n\n    verifyOrder {\n      mapboxCarMap.setup(any(), any())\n      mapboxCarMap.registerObserver(observer)\n    }\n    verify(exactly = 0) { mapboxCarMap.unregisterObserver(observer) }\n  }\n\n  @Test\n  fun `install should setup MapboxCarMap with the session CarContext`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val sessionCarContext = mockk<CarContext>()\n    val session = mockk<Session> {\n      every { carContext } returns sessionCarContext\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .install(mockCarInitializer())\n    lifecycleOwner.moveToState(Lifecycle.State.CREATED)\n\n    verify { mapboxCarMap.setup(sessionCarContext, any()) }\n  }\n\n  @Test\n  fun `install should setup MapboxCarMap with the MapInitOptions`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val sessionCarContext = mockk<CarContext>()\n    val session = mockk<Session> {\n      every { carContext } returns sessionCarContext\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n    val mapInitOptions: MapInitOptions = mockk(relaxed = true)\n    every { mapInitOptions.mapOptions.contextMode } returns ContextMode.SHARED\n    val mockInitializer: MapboxCarMapInitializer = mockk {\n      every { onCreate(any()) } returns mapInitOptions\n    }\n\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .install(mockInitializer)\n    lifecycleOwner.moveToState(Lifecycle.State.CREATED)\n\n    verify { mapboxCarMap.setup(any(), mapInitOptions) }\n  }\n\n  @Test\n  fun `should attach created in created state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Session> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install(mockCarInitializer())\n    lifecycleOwner.moveToState(Lifecycle.State.CREATED)\n\n    verify { mapboxCarMap.registerObserver(createdObserver) }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n    }\n  }\n\n  @Test\n  fun `should attach started in started state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Session> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install(mockCarInitializer())\n    lifecycleOwner.moveToState(Lifecycle.State.STARTED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n    }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n    }\n  }\n\n  @Test\n  fun `should attach resumed in resumed state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Session> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install(mockCarInitializer())\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n    }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n    }\n  }\n\n  @Test\n  fun `should detach resumed in started state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Session> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install(mockCarInitializer())\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n    lifecycleOwner.moveToState(Lifecycle.State.STARTED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n    }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n    }\n  }\n\n  @Test\n  fun `should detach started in created state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Session> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install(mockCarInitializer())\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n    lifecycleOwner.moveToState(Lifecycle.State.CREATED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(resumedObserver)\n      mapboxCarMap.unregisterObserver(startedObserver)\n    }\n    verify(exactly = 0) {\n      mapboxCarMap.unregisterObserver(createdObserver)\n    }\n  }\n\n  @Test\n  fun `should clear observers when destroyed`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Session> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n      .install(mockCarInitializer())\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n    lifecycleOwner.moveToState(Lifecycle.State.DESTROYED)\n\n    verifyOrder {\n      mapboxCarMap.registerObserver(createdObserver)\n      mapboxCarMap.registerObserver(startedObserver)\n      mapboxCarMap.registerObserver(resumedObserver)\n      mapboxCarMap.clearObservers()\n    }\n  }\n\n  @Test\n  fun `should not attach observers before the created state`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Session> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .onCreated(mockk())\n      .onStarted(mockk())\n      .onResumed(mockk())\n      .install(mockCarInitializer())\n\n    verify(exactly = 0) {\n      mapboxCarMap.registerObserver(any())\n      mapboxCarMap.unregisterObserver(any())\n    }\n  }\n\n  @Test\n  fun `should not setup anything before install`() {\n    val mapboxCarMap = mockk<MapboxCarMap>(relaxed = true)\n    val lifecycleOwner = TestLifecycleOwner()\n    val session = mockk<Session> {\n      every { carContext } returns mockk()\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n\n    val createdObserver = mockk<MapboxCarMapObserver>()\n    val startedObserver = mockk<MapboxCarMapObserver>()\n    val resumedObserver = mockk<MapboxCarMapObserver>()\n    MapboxCarMapSessionInstaller(session, mapboxCarMap)\n      .onCreated(createdObserver)\n      .onStarted(startedObserver)\n      .onResumed(resumedObserver)\n    lifecycleOwner.moveToState(Lifecycle.State.RESUMED)\n\n    verify(exactly = 0) {\n      mapboxCarMap.setup(any(), any())\n      mapboxCarMap.registerObserver(any())\n      mapboxCarMap.unregisterObserver(any())\n      mapboxCarMap.setGestureHandler(any())\n    }\n  }\n\n  @Test\n  fun `setup with unique context mode - enforcing shared context with a warning`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val sessionCarContext = mockk<CarContext>()\n    val session = mockk<Session> {\n      every { carContext } returns sessionCarContext\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .install(mockCarInitializer(ContextMode.UNIQUE))\n    lifecycleOwner.moveToState(Lifecycle.State.CREATED)\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    val mapInitOptions = slot<MapInitOptions>()\n    verify(exactly = 1) {\n      mapboxCarMap.setup(sessionCarContext, capture(mapInitOptions))\n    }\n    assert(mapInitOptions.captured.mapOptions.contextMode == ContextMode.SHARED)\n  }\n\n  @Test\n  fun `setup without explicit context mode - enforcing shared context without warning`() {\n    val lifecycleOwner = TestLifecycleOwner()\n    val sessionCarContext = mockk<CarContext>()\n    val session = mockk<Session> {\n      every { carContext } returns sessionCarContext\n      every { lifecycle } returns lifecycleOwner.lifecycle\n    }\n    val mapboxCarMap = MapboxCarMapSessionInstaller(session, mockk(relaxed = true))\n      .install(mockCarInitializer(null))\n    lifecycleOwner.moveToState(Lifecycle.State.CREATED)\n    val mapInitOptions = slot<MapInitOptions>()\n    verify(exactly = 1) {\n      mapboxCarMap.setup(sessionCarContext, capture(mapInitOptions))\n    }\n    assert(mapInitOptions.captured.mapOptions.contextMode == ContextMode.SHARED)\n  }\n\n  private fun mockCarInitializer(contextMode: ContextMode? = ContextMode.SHARED): MapboxCarMapInitializer = mockk {\n    every { onCreate(any()) } answers {\n      spyk(\n        MapInitOptions(\n          firstArg<CarContext>(),\n          mapOptions = contextMode?.let { MapOptions.Builder().contextMode(contextMode).build() }\n            ?: MapOptions.Builder().build()\n        )\n      )\n    }\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/test/java/com/mapbox/maps/extension/androidauto/MapboxCarMapTest.kt",
    "content": "package com.mapbox.maps.extension.androidauto\n\nimport androidx.car.app.AppManager\nimport androidx.car.app.CarContext\nimport androidx.car.app.SurfaceCallback\nimport com.mapbox.maps.*\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkObject\nimport io.mockk.mockkStatic\nimport io.mockk.slot\nimport io.mockk.unmockkAll\nimport io.mockk.verify\nimport io.mockk.verifyOrder\nimport org.junit.After\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\n\n@OptIn(MapboxExperimental::class)\nclass MapboxCarMapTest {\n\n  private val surfaceCallbackSlot = slot<SurfaceCallback>()\n  private val carContext = mockk<CarContext> {\n    every { getCarService(AppManager::class.java) } returns mockk {\n      every { setSurfaceCallback(capture(surfaceCallbackSlot)) } just Runs\n    }\n  }\n  private val mapInitOptions = mockk<MapInitOptions> {\n    every { context } returns carContext\n  }\n\n  private val testMapSurface: MapSurface = mockk(relaxed = true)\n\n  @Before\n  fun setup() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    every { logD(any(), any<String>()) } just Runs\n    mockkObject(MapSurfaceProvider)\n    every { MapSurfaceProvider.create(any(), any(), any()) } returns testMapSurface\n  }\n\n  @After\n  fun teardown() {\n    unmockkAll()\n  }\n\n  @Test(expected = IllegalStateException::class)\n  fun `MapboxCarMap crashes when context is not a CarContext`() {\n    val mapInitOptions = mockk<MapInitOptions> {\n      every { context } returns mockk()\n    }\n\n    MapboxCarMap().setup(mockk(), mapInitOptions)\n  }\n\n  @Test(expected = IllegalStateException::class)\n  fun `MapboxCarMap crashes when carContext is accessed before setup`() {\n    MapboxCarMap().carContext\n  }\n\n  @Test(expected = IllegalStateException::class)\n  fun `MapboxCarMap crashes when mapInitOptions is accessed before setup`() {\n    MapboxCarMap().mapInitOptions\n  }\n\n  @Test\n  fun `MapboxCarMap constructor requests the surface callback`() {\n    MapboxCarMap().setup(carContext, mapInitOptions)\n\n    assertTrue(surfaceCallbackSlot.isCaptured)\n  }\n\n  @Test\n  fun `setup will call setSurfaceCallback`() {\n    MapboxCarMap().setup(carContext, mapInitOptions)\n\n    val appManager = carContext.getCarService(AppManager::class.java)\n    verify(exactly = 1) {\n      appManager.setSurfaceCallback(any())\n    }\n  }\n\n  @Test\n  fun `prepareSurfaceCallback does not call setSurfaceCallback`() {\n    MapboxCarMap().prepareSurfaceCallback(carContext, mapInitOptions)\n\n    val appManager = carContext.getCarService(AppManager::class.java)\n    verify(exactly = 0) {\n      appManager.setSurfaceCallback(any())\n    }\n  }\n\n  @Test\n  fun `carMapSurface is valid after onSurfaceAvailable`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    assertNull(mapboxCarMap.carMapSurface)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n\n    assertNotNull(mapboxCarMap.carMapSurface)\n  }\n\n  @Test\n  fun `visibleArea is valid after onVisibleAreaChanged`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    assertNull(mapboxCarMap.visibleArea)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onVisibleAreaChanged(mockk(relaxed = true))\n\n    assertNotNull(mapboxCarMap.visibleArea)\n  }\n\n  @Test\n  fun `visibleEdgeInsets is valid after onVisibleAreaChanged`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    assertNull(mapboxCarMap.visibleEdgeInsets)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onVisibleAreaChanged(mockk(relaxed = true))\n\n    assertNotNull(mapboxCarMap.visibleEdgeInsets)\n  }\n\n  @Test\n  fun `registerObserver includes onAttached and onVisibleAreaChanged`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    val observer = mockk<MapboxCarMapObserver>(relaxed = true)\n    mapboxCarMap.registerObserver(observer)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onVisibleAreaChanged(mockk(relaxed = true))\n\n    verifyOrder {\n      observer.onAttached(any())\n      observer.onVisibleAreaChanged(any(), any())\n    }\n  }\n\n  @Test\n  fun `registerObserver receives callbacks if registered after onVisibleAreaChanged`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onVisibleAreaChanged(mockk(relaxed = true))\n\n    val observer = mockk<MapboxCarMapObserver>(relaxed = true)\n    mapboxCarMap.registerObserver(observer)\n\n    verifyOrder {\n      observer.onAttached(any())\n      observer.onVisibleAreaChanged(any(), any())\n    }\n  }\n\n  @Test\n  fun `visibleArea is valid after onStableAreaChanged`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    assertNull(mapboxCarMap.stableArea)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onStableAreaChanged(mockk(relaxed = true))\n\n    assertNotNull(mapboxCarMap.stableArea)\n  }\n\n  @Test\n  fun `stableEdgeInsets is valid after onStableAreaChanged`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    assertNull(mapboxCarMap.stableEdgeInsets)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onStableAreaChanged(mockk(relaxed = true))\n\n    assertNotNull(mapboxCarMap.stableEdgeInsets)\n  }\n\n  @Test\n  fun `registerObserver includes onAttached and onStableAreaChanged`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    val observer = mockk<MapboxCarMapObserver>(relaxed = true)\n    mapboxCarMap.registerObserver(observer)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onStableAreaChanged(mockk(relaxed = true))\n\n    verifyOrder {\n      observer.onAttached(any())\n      observer.onStableAreaChanged(any(), any())\n    }\n  }\n\n  @Test\n  fun `registerObserver receives callbacks if registered after onStableAreaChanged`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onStableAreaChanged(mockk(relaxed = true))\n\n    val observer = mockk<MapboxCarMapObserver>(relaxed = true)\n    mapboxCarMap.registerObserver(observer)\n\n    verifyOrder {\n      observer.onAttached(any())\n      observer.onStableAreaChanged(any(), any())\n    }\n  }\n\n  @Test\n  fun `unregisterObserver will prevent callbacks`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    val observer = mockk<MapboxCarMapObserver>(relaxed = true)\n    mapboxCarMap.registerObserver(observer)\n    mapboxCarMap.unregisterObserver(observer)\n\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onVisibleAreaChanged(mockk(relaxed = true))\n\n    verify(exactly = 0) { observer.onAttached(any()) }\n    verify(exactly = 0) { observer.onVisibleAreaChanged(any(), any()) }\n    verify(exactly = 0) { observer.onStableAreaChanged(any(), any()) }\n    verify(exactly = 0) { observer.onDetached(any()) }\n  }\n\n  @Test\n  fun `clearObservers will prevent callbacks`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    val observer = mockk<MapboxCarMapObserver>(relaxed = true)\n    mapboxCarMap.registerObserver(observer)\n    mapboxCarMap.clearObservers()\n\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onVisibleAreaChanged(mockk(relaxed = true))\n\n    verify(exactly = 0) { observer.onAttached(any()) }\n    verify(exactly = 0) { observer.onVisibleAreaChanged(any(), any()) }\n    verify(exactly = 0) { observer.onStableAreaChanged(any(), any()) }\n    verify(exactly = 0) { observer.onDetached(any()) }\n  }\n\n  @Test\n  fun `setGestures allows you to provide custom gestures`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    val testGestures = TestMapboxCarMapGestures()\n    mapboxCarMap.setGestureHandler(testGestures)\n\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onVisibleAreaChanged(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onStableAreaChanged(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onScroll(0.0f, 0.0f)\n    surfaceCallbackSlot.captured.onFling(0.0f, 0.0f)\n    surfaceCallbackSlot.captured.onScale(0.0f, 0.0f, 0.0f)\n\n    assertTrue(testGestures.capturedOnScroll)\n    assertTrue(testGestures.capturedOnFling)\n    assertTrue(testGestures.capturedOnScale)\n  }\n\n  @Test\n  fun `setGestures is not called before surface is available`() {\n    val mapboxCarMap = MapboxCarMap().setup(carContext, mapInitOptions)\n    val testGestures = TestMapboxCarMapGestures()\n    mapboxCarMap.setGestureHandler(testGestures)\n\n    surfaceCallbackSlot.captured.onScroll(0.0f, 0.0f)\n    surfaceCallbackSlot.captured.onFling(0.0f, 0.0f)\n    surfaceCallbackSlot.captured.onScale(0.0f, 0.0f, 0.0f)\n    surfaceCallbackSlot.captured.onSurfaceAvailable(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onVisibleAreaChanged(mockk(relaxed = true))\n    surfaceCallbackSlot.captured.onStableAreaChanged(mockk(relaxed = true))\n\n    assertFalse(testGestures.capturedOnScroll)\n    assertFalse(testGestures.capturedOnFling)\n    assertFalse(testGestures.capturedOnScale)\n  }\n\n  private class TestMapboxCarMapGestures : MapboxCarMapGestureHandler {\n    var capturedOnScroll = false\n    var capturedOnScale = false\n    var capturedOnFling = false\n\n    override fun onScroll(\n      mapboxCarMapSurface: MapboxCarMapSurface,\n      visibleCenter: ScreenCoordinate,\n      distanceX: Float,\n      distanceY: Float\n    ) {\n      capturedOnScroll = true\n    }\n\n    override fun onFling(\n      mapboxCarMapSurface: MapboxCarMapSurface,\n      velocityX: Float,\n      velocityY: Float\n    ) {\n      capturedOnFling = true\n    }\n\n    override fun onScale(\n      mapboxCarMapSurface: MapboxCarMapSurface,\n      focusX: Float,\n      focusY: Float,\n      scaleFactor: Float\n    ) {\n      capturedOnScale = true\n    }\n  }\n}"
  },
  {
    "path": "extension-androidauto/src/test/java/com/mapbox/maps/extension/androidauto/testing/TestLifecycleOwner.kt",
    "content": "package com.mapbox.maps.extension.androidauto.testing\n\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LifecycleRegistry\n\nclass TestLifecycleOwner : LifecycleOwner {\n  private val lifecycleRegistry = LifecycleRegistry(this)\n    .also { it.currentState = Lifecycle.State.INITIALIZED }\n\n  override fun getLifecycle(): Lifecycle = lifecycleRegistry\n\n  fun moveToState(state: Lifecycle.State) {\n    lifecycleRegistry.currentState = state\n  }\n}"
  },
  {
    "path": "extension-compose/.gitignore",
    "content": "/build"
  },
  {
    "path": "extension-compose/CHANGELOG-v0.1.0.md",
    "content": "# Changelog for Mapbox Maps Compose Extension\n\nMapbox welcomes participation and contributions from everyone.\n\n# Please refer to [release notes](../CHANGELOG.md) in the main SDK for the latest Jetpack Compose Extension related changes.\n\n# 0.1.0 August 10, 2023\n## Features ✨ and improvements 🏁\n* Add experimental `MapboxMap` composable function as the entry point to inject a MapboxMap to the app.\n* Add experimental `MapEffect` to expose the raw `MapView` controller, so that user can use it to access the full\n  Maps SDK API surface.\n* Add experimental plugin settings classes(i.e. `AttributionSettings`, `CompassSettings`, `GesturesSettings`\n  , `LocationComponentSettings`, `LogoSettings`, `ScaleBarSettings`) as the input state\n  of `MapboxMap` composable function.\n* Add experimental `PointAnnotation`, `CircleAnnotation`, `PolylineAnnotation` and `PolygonAnnotation` composable\n  functions to add an annotation to the map.\n* Add experimental `PointAnnotationGroup`, `CircleAnnotationGroup`, `PolylineAnnotationGroup`and\n  `PolygonAnnotationGroup` composable functions to add an annotation group to the\n  map; `PointAnnotationGroup` and `CircleAnnotationGroup` can be clustered based on configuration.\n* Add experimental `ViewAnnotation` composable function to add a view annotation to the map.\n* Add experimental `MapViewportState` API hat can be hoisted to control and observe the map's camera state."
  },
  {
    "path": "extension-compose/README.md",
    "content": "# Mapbox Maps Compose Extension <!-- omit in toc -->\n\n## Overview <!-- omit in toc -->\n\nThe Mapbox Maps Compose Extension is a public library to extend the Mapbox Map to work together with Jetpack Compose UI framework.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\nWorking examples of the Compose extension can be found in our [compose test application](https://github.com/mapbox/mapbox-maps-android/tree/master/compose-app/).\n\n## Explore This Guide <!-- omit in toc -->\n\n- [Getting Started With Compose Extension](#getting-started-with-compose-extension)\n- [Tutorials](#tutorials)\n  - [Place a Mapbox map to your app](#place-a-mapbox-map-to-your-app)\n  - [Setup the map style and set the initial camera position](#setup-the-map-style-and-set-the-initial-camera-position)\n  - [Use raw `MapboxMap` methods through `MapEffect` or `DisposableMapEffect`](#use-raw-mapboxmap-methods-through-mapeffect-or-disposablemapeffect)\n  - [Use Camera Animation / Viewport APIs](#use-camera-animation--viewport-apis)\n  - [Add Annotations to the map](#add-annotations-to-the-map)\n    - [Add a single `CircleAnnotation` to the map](#add-a-single-circleannotation-to-the-map)\n    - [Add multiple `CircleAnnotations` to the map in a group(more efficient for large number of annotations)](#add-multiple-circleannotations-to-the-map-in-a-groupmore-efficient-for-large-number-of-annotations)\n    - [Add multiple `PointAnnotations` to the map as cluster(only supported for `PointAnnotation` and `CircleAnnotation`)](#add-multiple-pointannotations-to-the-map-as-clusteronly-supported-for-pointannotation-and-circleannotation)\n    - [Add `ViewAnnotation` to the map](#add-viewannotation-to-the-map)\n  - [Configure Map ornaments(Compass, ScaleBar, Attribution, Logo)](#configure-map-ornamentscompass-scalebar-attribution-logo)\n  - [Gestures settings](#gestures-settings)\n  - [Work with runtime styling](#work-with-runtime-styling)\n    - [Runtime styling with layers and sources](#runtime-styling-with-layers-and-sources)\n- [Compatibility with Maps SDK v11](#compatibility-with-maps-sdk-v11)\n\n## Getting Started With Compose Extension\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) or building an app that uses the Mapbox Maps Compose Extension. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Extension System. To add the compose extension to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In your build.gradle, add the compose extension with your other dependencies.\ndependencies {\n  implementation 'com.mapbox.extension:maps-compose:11.22.0-rc.1'\n\n  // Pick your versions of Android Mapbox Map SDK\n  // Note that Compose extension is compatible with Maps SDK v11.0+.\n  implementation 'com.mapbox.maps:android:11.22.0-rc.1'\n}\n```\n\nYou should also become familiar with [Google's documentation for Jetpack Compose](https://developer.android.com/jetpack/compose/setup).\n\nTo start using Compose, you need to first add some build configurations to your project. Add the following definition to your app’s build.gradle file:\n```groovy\nandroid {\n    buildFeatures {\n        compose true\n    }\n\n    composeOptions {\n        kotlinCompilerExtensionVersion = \"1.3.2\"\n    }\n}\n```\n\n## Tutorials\n\n### Place a Mapbox map to your app\n\nHere's a simple example on using Compose extension to insert a Mapbox map to your app:\n\n```kotlin\n...\nimport com.mapbox.maps.extension.compose.MapboxMap\n\npublic class SimpleMapActivity : ComponentActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMap(modifier = Modifier.fillMaxSize())\n    }\n  }\n  ...\n}\n```\n\n### Setup the map style and set the initial camera position\n\nYou can set the initial map style with `MapStyle` composable function and the initial camera position by creating and remember `MapViewportState`.\n\n```kotlin\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMap(\n        Modifier.fillMaxSize(),\n        mapViewportState = rememberMapViewportState {\n          setCameraOptions {\n            center(Point.fromLngLat(24.9384, 60.1699))\n            zoom(9.0)\n          }\n        },\n        style = {\n          MapStyle(style = Style.SATELLITE_STREETS)\n        }\n      )\n    }\n  }\n```\n\n### Use raw `MapboxMap` methods through `MapEffect` or `DisposableMapEffect`\n\nMapbox Compose Extension is built around the `MapView` in the base maps SDK. It's unlikely that we will be able to cover the full API surface in this wrapper, so we expose the reference to the raw `MapView` so that you can use all the API surface inside a `MapEffect`.\n\nPlease note that using raw `MapView` APIs in `MapEffect` might introduce internal state changes that interferes with the Compose states, and might result in unexpected behaviours, please use it with caution.\n\nThe following example showcases how to turn on debug features using `MapEffect`:\n\n```kotlin\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMap(modifier = Modifier.fillMaxSize()) {\n        // Get reference to the raw MapView using MapEffect\n        MapEffect(Unit) { mapView ->\n          // Use mapView to access all the Mapbox Maps APIs including plugins etc.\n          // For example, to enable debug mode:\n          mapView.debugOptions = setOf(\n              MapViewDebugOptions.TILE_BORDERS,\n              MapViewDebugOptions.PARSE_STATUS,\n              MapViewDebugOptions.TIMESTAMPS,\n              MapViewDebugOptions.COLLISION,\n              MapViewDebugOptions.STENCIL_CLIP,\n              MapViewDebugOptions.DEPTH_BUFFER,\n              MapViewDebugOptions.MODEL_BOUNDS,\n              MapViewDebugOptions.TERRAIN_WIREFRAME,\n          )\n        }\n      }\n    }\n  }\n```\n\n### Use Camera Animation / Viewport APIs\n\nThe camera/viewport animation of the map within Compose is exposed through `MapViewportState`, and internally it's implemented with the `ViewportPlugin` of the base maps SDK. Currently we expose high level camera animation APIs such as `setCamera`, `easeTo`, `flyTo` and the `FollowPuckViewportState` and `OverviewViewportState` with the `DefaultViewportTransition`.\n\nThe following example showcases adding a button to do a `flyTo` animation to the target camera position:\n\n```kotlin\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      // Hold the hoisted MapViewPortState to manipulate the map camera.\n      val mapViewportState = rememberMapViewportState {\n        // Set the initial camera position\n        setCameraOptions {\n          center(Point.fromLngLat(0.0, 0.0))\n          zoom(0.0)\n          pitch(0.0)\n        }\n      }\n      Box(modifier = Modifier.fillMaxSize()) {\n        // Add a MapboxMap with the mapViewportState\n        MapboxMap(\n          modifier = Modifier.fillMaxSize(),\n          mapViewportState = mapViewportState\n        )\n        // Add a button on top of the map\n        Button(\n          onClick = {\n            mapViewportState.flyTo(\n              cameraOptions = cameraOptions {\n                center(Point.fromLngLat(13.403, 52.562))\n                zoom(14.0)\n                pitch(45.0)\n              },\n              MapAnimationOptions.mapAnimationOptions { duration(5000) }\n            )\n          }\n        ) {\n          Text(text = \"Animate camera with FlyTo\")\n        }\n      }\n    }\n  }\n```\n\n### Add Annotations to the map\n\nThe full Annotation support is added with the initial compose extension release 0.1.0. `PointAnnotation`/`CircleAnnotation`/`PolygonAnnotation`/`PolylineAnnotation` can be added as composable functions within the content of the `MapboxMap` composable function.\n\n`AnnotationGroup` composable functions are also introduced additionally to efficiently add a list of annotations to the map, and Point and Circle annotations within the same group can be configured to be clustered.\n\n#### Add a single `CircleAnnotation` to the map\n\nThe following example showcases adding one circle annotation to the map:\n\n```kotlin\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMap(modifier = Modifier.fillMaxSize()) {\n        // Add a single circle annotation at null island.\n        CircleAnnotation(\n          point = Point.fromLngLat(0.0, 0.0)\n        ) {\n          interactionsState.onClicked {\n            Toast.makeText(\n              this@CircleAnnotationActivity,\n              \"Clicked on single Circle Annotation: $it\",\n              Toast.LENGTH_SHORT\n            ).show()\n            true\n          }\n            .onLongClicked {\n              Toast.makeText(\n                this@CircleAnnotationActivity,\n                \"Long Clicked on single Circle Annotation: $it\",\n                Toast.LENGTH_SHORT\n              ).show()\n              true\n            }\n          circleRadius = 20.0\n          circleColor = Color.Blue\n        }\n      }\n    }\n  }\n```\n\n#### Add multiple `CircleAnnotations` to the map in a group(more efficient for large number of annotations)\n\nAdding multiple Annotations to the map using `AnnotationGroup` is more efficient, as they are backed by the same `AnnotationManager` and will be processed in batch and rendered in the same layer.\n\n```kotlin\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMap(modifier = Modifier.fillMaxSize()) {\n        // Add a number of circle annotations as CircleAnnotationGroup\n        CircleAnnotationGroup(\n          annotations = POINTS_TO_ADD.map {\n            CircleAnnotationOptions()\n              .withPoint(it)\n              .withCircleRadius(10.0)\n              .withCircleColor(Color.RED)\n          }\n        ) {\n          interactionsState.onClicked {\n            Toast.makeText(\n              this@CircleAnnotationActivity,\n              \"Clicked on Circle Annotation Cluster's item: $it\",\n              Toast.LENGTH_SHORT\n            ).show()\n            true\n          }\n            .onLongClicked {\n              Toast.makeText(\n                this@CircleAnnotationActivity,\n                \"Long clicked on Circle Annotation Cluster's item: $it\",\n                Toast.LENGTH_SHORT\n              ).show()\n              true\n            }\n        }\n      }\n    }\n  }\n```\n\n#### Add multiple `PointAnnotations` to the map as cluster(only supported for `PointAnnotation` and `CircleAnnotation`)\n\nThe following example showcases adding multiple `PointAnnotations` with clustering support:\n\n```kotlin\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMap(modifier = Modifier.fillMaxSize()) {\n        PointAnnotationGroup(\n          annotations = points.map {\n            PointAnnotationOptions()\n              .withPoint(it)\n          },\n          annotationConfig = AnnotationConfig(\n            annotationSourceOptions = AnnotationSourceOptions(\n              clusterOptions = ClusterOptions(\n                textColorExpression = Expression.color(Color.YELLOW),\n                textColor = Color.BLACK,\n                textSize = 20.0,\n                circleRadiusExpression = literal(25.0),\n                colorLevels = listOf(\n                  Pair(100, Color.RED),\n                  Pair(50, Color.BLUE),\n                  Pair(0, Color.GREEN)\n                )\n              )\n            )\n          ),\n        ) {\n          // Apply icon image to the whole annotation group.\n          iconImage = IconImage(ICON_FIRE_STATION)\n\n          interactionsState.onClicked {\n            Toast.makeText(\n              this@PointAnnotationClusterActivity,\n              \"Clicked on Point Annotation Cluster: $it\",\n              Toast.LENGTH_SHORT\n            ).show()\n            true\n          }\n            .onLongClicked {\n              Toast.makeText(\n                this@PointAnnotationClusterActivity,\n                \"Long clicked on Circle Annotation Cluster's item: $it\",\n                Toast.LENGTH_SHORT\n              ).show()\n              true\n            }\n            .onClusterClicked {\n              Toast.makeText(\n                this@PointAnnotationClusterActivity,\n                \"On cluster Click - ID: ${it.clusterId}, points:  ${it.pointCount}\",\n                Toast.LENGTH_SHORT\n              ).show()\n              true\n            }\n            .onClusterLongClicked {\n              Toast.makeText(\n                this@PointAnnotationClusterActivity,\n                \"On cluster Long Click - ID: ${it.clusterId}, points:  ${it.pointCount}\",\n                Toast.LENGTH_SHORT\n              ).show()\n              true\n            }\n        }\n      }\n    }\n  }\n```\n\n#### Add `ViewAnnotation` to the map\n\nWith `ViewAnnotation` support for the compose extension, you are able to add a `ViewAnnotation` composable function to the content of `MapboxMap` and set its content using Android Composable functions.\n\nThe following example showcases adding `ViewAnnotation` that holds a `Button` to the map:\n\n```kotlin\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      MapboxMap(modifier = Modifier.fillMaxSize()) {\n        // Add a ViewAnnotation to the map\n        ViewAnnotation(\n          options = viewAnnotationOptions {\n            // set the view annotation associated geometry\n            geometry(Point.fromLngLat(0.0, 0.0))\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.BOTTOM)\n            }\n            allowOverlap(false)\n          }\n        ) {\n          // You can add the content to be drawn in the ViewAnnotation using Composable functions, e.g. to insert a button:\n          Button(\n            onClick = {\n              Toast.makeText(applicationContext, \"Click\", LENGTH_SHORT).show()\n            }\n          ) {\n            Text(\"Click me\")\n          }\n        }\n      }\n    }\n  }\n```\n\n### Configure Map ornaments(Compass, ScaleBar, Attribution, Logo)\n\nThe Map ornaments are introduced as composable functions within dedicated scope and can be set to the MapboxMap composable function.\n\nThe following example showcases customising map ornaments:\n\n```kotlin\nMapboxMap(\n  modifier = Modifier.fillMaxSize(),\n  compass = {\n    // Original compass\n    Compass()\n    // Add another compass with customised position and image\n    Compass(\n      modifier = Modifier.padding(scaffoldPadding),\n      contentPadding = PaddingValues(0.dp),\n      alignment = Alignment.TopEnd,\n    ) {\n      Image(\n        painter = painterResource(id = R.drawable.my_compass),\n        alpha = 0.9f,\n        modifier = Modifier\n          .height(55.dp)\n          .width(55.dp),\n        contentDescription = \"My customised compass\"\n      )\n    }\n  },\n  scaleBar = {\n    // Change the ScaleBar primary color\n    ScaleBar(\n      modifier = Modifier.padding(scaffoldPadding),\n      primaryColor = color\n    )\n  },\n  attribution = {\n    // Change the Attribution color\n    Attribution(\n      modifier = Modifier.padding(scaffoldPadding),\n      iconColor = color\n    )\n  },\n  logo = {\n    // Change the Mapbox logo position\n    Logo(modifier = Modifier.padding(scaffoldPadding), alignment = Alignment.BottomEnd)\n  }\n)\n```\n\n### Gestures settings\n\nThe following example showcases how to change the `GesturesSettings` through hoisted `MapState`:\n\n```kotlin\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      // Hold the hoisted mapState to manipulate the map settings including gestures settings.\n      val mapState = rememberMapState()\n      Box(modifier = Modifier.fillMaxSize()) {\n        // Add a MapboxMap with the mapState.\n        MapboxMap(\n          modifier = Modifier.fillMaxSize(),\n          mapState = mapState\n        )\n        // Add a button on top of the map\n        Button(\n          onClick = {\n            mapState.apply {\n              gesturesSettings = gesturesSettings.toBuilder().setScrollEnabled(false).build()\n            }\n          }\n        ) {\n          Text(text = \"Disable scroll gesture\")\n        }\n      }\n    }\n  }\n```\n\n### Work with runtime styling\n\nThe map style can be set through `MapboxStyleComposable`, currently we expose following Style composable functions:\n\n* `GenericStyle` for all the available style features as weakly typed APIs, it has full flexibility to control any style/slot/positioned layers and style import configs, but alternative strongly typed APIs should be preferred for safety and convenience to use.\n* `MapStyle` for simple loading style use cases if you don't need slots position your layer according to the layerIds defined in the style json.\n* `MapboxStandardStyle` for the default Mapbox Standard Style, it exposes available slots to position runtime-added layers and style import configs as strongly typed API.\n\n#### Runtime styling with layers and sources\n\nThe layers can be added to the style/map as `MapboxMapComposable` functions.\n\n* When added to the `slots` or `layerPositions` within the `MapboxStyleComposable`, the layer will be added to the style after the style is loaded.\n* When added to the content of `MapboxMap` composable function, the layer will be added to the map immediately as persistent layer.\n\nThe sources are exposed as source state, which can be hoisted outside of the map and be shared with multiple layers. Please note the source state can not be shared across multiple map instances.\n\nPlease also note that the layer id and source id are automatically generated and remembered by default, so that you can reuse the layers in different places without `layerId already exist` error.\nIn case if you need the layer/source id later for other purpose, e.g. query rendered features, you can provide your own id and reuse later.\n\nThe following example showcases how to work with runtime styling with composable functions:\n\n```kotlin\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      // Create a geoJsonSourceState to be used later with layers.\n      val geoJsonSource: GeoJsonSourceState = rememberGeoJsonSourceState {\n        // Set the initial geoJsonData as a Point\n        data = GeoJSONData(Point.fromLngLat(0.0, 0.0))\n      }\n      MapboxMap(\n        style = {\n          // Load mapbox standard style\n          MapboxStandardStyle(\n            // Add a background layer to the 'top' slot of the standard style\n            topSlot = {\n              BackgroundLayer {\n                backgroundColor = ColorValue(Color.Yellow)\n                backgroundOpacity = DoubleValue(0.3)\n              }\n            }\n          ) {\n            // Set the light preset of Mapbox standard style to dawn through configuration.\n            lightPreset = LightPresetValue.DAWN\n          }\n        }\n      ) {\n        // Insert a circle layer with the given geoJsonSource, to display a background circle.\n        CircleLayer(\n          sourceState = geoJsonSource\n        ) {\n          circleColor = ColorValue(Color.Cyan)\n          circleRadius = DoubleValue(50.0)\n          circleRadiusTransition = Transition(durationMillis = 1000L)\n        }\n        // Insert a symbol layer with the same geoJsonSource, to display a text above the circle.\n        SymbolLayer(\n          sourceState = geoJsonSource\n        ) {\n          textField = FormattedValue(\"Hello\")\n          textColor = ColorValue(Color.Black)\n          // Use expression to set the text size as data driven property\n          textSize = DoubleValue(\n            Expression.interpolate {\n              linear()\n              zoom()\n              stop {\n                literal(0.0)\n                literal(10.0)\n              }\n              stop {\n                literal(10.0)\n                literal(20.0)\n              }\n            }\n          )\n        }\n      }\n    }\n  }\n```\n\n## Compatibility with Maps SDK v11\n\nThe Compose extension is released separately from the Android Maps SDK v11 and has a compileOnly dependency. When using the Compose extension you need to include a compatible Maps SDK. The feature compatibility checklist can be found below.\n\nBelow is the full feature compatibility table:\n\nFeatures  | Supported? | Compatible Maps SDK version\n------------- | ------------- | -------------\nBasic Map rendering | ✅ | v11.0.0+\nAnnotations support | ✅ | v11.0.0+\nViewAnnotation support | ✅ | v11.0.0+\nMapViewportState support | ✅ | v11.0.0+\nGestures settings support | ✅ | v11.0.0+\nAccess to raw MapView using MapEffect | ✅ | v11.0.0+\nMap ornament(Compass, ScaleBar, Attribution, Logo) support | ✅ | v11.3.0+\nStyle composable function support | ✅ | v11.3.0+\nStyle layer/source support | ✅ | v11.3.0+\nStyle projection support | ✅ | v11.3.0+\nStyle terrain support | ✅ | v11.5.0+\nStyle light support | ✅ | v11.5.0+\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this extension.\n"
  },
  {
    "path": "extension-compose/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.extension.compose {\n\n  @androidx.compose.runtime.Immutable public final class ComposeMapInitOptions {\n    ctor public ComposeMapInitOptions(com.mapbox.maps.MapOptions mapOptions, boolean textureView = false, int antialiasingSampleCount = 1, String mapName = \"\");\n    ctor public ComposeMapInitOptions(float pixelRatio, boolean textureView = false, int antialiasingSampleCount = 1, String mapName = \"\");\n    method public com.mapbox.maps.MapOptions component1();\n    method public boolean component2();\n    method public int component3();\n    method public String component4();\n    method public com.mapbox.maps.extension.compose.ComposeMapInitOptions copy(com.mapbox.maps.MapOptions mapOptions, boolean textureView, int antialiasingSampleCount, String mapName);\n    method public int getAntialiasingSampleCount();\n    method public String getMapName();\n    method public com.mapbox.maps.MapOptions getMapOptions();\n    method public boolean getTextureView();\n    property public final int antialiasingSampleCount;\n    property public final String mapName;\n    property public final com.mapbox.maps.MapOptions mapOptions;\n    property public final boolean textureView;\n    field public static final com.mapbox.maps.extension.compose.ComposeMapInitOptions.Companion Companion;\n    field public static final int DEFAULT_ANTIALIASING_SAMPLE_COUNT = 1; // 0x1\n  }\n\n  public static final class ComposeMapInitOptions.Companion {\n  }\n\n  public final class DisposableMapEffectKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void DisposableMapEffect(Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.DisposableEffectScope,? super com.mapbox.maps.MapView,? extends androidx.compose.runtime.DisposableEffectResult> block);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void DisposableMapEffect(Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.DisposableEffectScope,? super com.mapbox.maps.MapView,? extends androidx.compose.runtime.DisposableEffectResult> block);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void DisposableMapEffect(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.DisposableEffectScope,? super com.mapbox.maps.MapView,? extends androidx.compose.runtime.DisposableEffectResult> block);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void DisposableMapEffect(Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.DisposableEffectScope,? super com.mapbox.maps.MapView,? extends androidx.compose.runtime.DisposableEffectResult> block);\n  }\n\n  public final class MapEffectKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void MapEffect(Object? key1, kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super com.mapbox.maps.MapView,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void MapEffect(Object? key1, Object? key2, kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super com.mapbox.maps.MapView,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void MapEffect(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super com.mapbox.maps.MapView,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void MapEffect(Object![]? keys, kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super com.mapbox.maps.MapView,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);\n  }\n\n  @androidx.compose.runtime.Stable public final class MapState {\n    ctor public MapState();\n    method @com.mapbox.maps.MapboxExperimental public kotlinx.coroutines.flow.Flow<com.mapbox.maps.GenericEvent> genericEvents(String eventName);\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.CameraChangedCoalesced> getCameraChangedCoalescedEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.CameraChanged> getCameraChangedEvents();\n    method @com.mapbox.maps.MapboxExperimental public suspend <FS extends com.mapbox.maps.interactions.FeatureState> Object? getFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature, kotlin.coroutines.Continuation<? super FS>);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings getGesturesSettings();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.MapIdle> getMapIdleEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.MapLoaded> getMapLoadedEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.MapLoadingError> getMapLoadingErrorEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.RenderFrameFinished> getRenderFrameFinishedEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.RenderFrameStarted> getRenderFrameStartedEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.ResourceRequest> getResourceRequestEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.SourceAdded> getSourceAddedEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.SourceDataLoaded> getSourceDataLoadedEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.SourceRemoved> getSourceRemovedEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleDataLoaded> getStyleDataLoadedEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleImageMissing> getStyleImageMissingEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleImageRemoveUnused> getStyleImageRemoveUnusedEvents();\n    method public kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleLoaded> getStyleLoadedEvents();\n    method public suspend Object? pixelForCoordinate(com.mapbox.geojson.Point coordinate, kotlin.coroutines.Continuation<? super com.mapbox.maps.ScreenCoordinate>);\n    method public suspend Object? queryRenderedFeatures(com.mapbox.maps.RenderedQueryGeometry geometry, com.mapbox.maps.RenderedQueryOptions options, kotlin.coroutines.Continuation<? super com.mapbox.bindgen.Expected<java.lang.String,java.util.List<? extends com.mapbox.maps.QueriedRenderedFeature>>>);\n    method @com.mapbox.maps.MapboxExperimental public suspend <FF extends com.mapbox.maps.interactions.FeaturesetFeature<?>> Object? queryRenderedFeatures(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<?,FF> descriptor, com.mapbox.maps.RenderedQueryGeometry? geometry = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, kotlin.coroutines.Continuation<? super java.util.List<? extends FF>> = null);\n    method @com.mapbox.maps.MapboxExperimental public suspend <FF extends com.mapbox.maps.interactions.FeaturesetFeature<?>> Object? queryRenderedFeatures(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<?,FF> descriptor, com.mapbox.maps.RenderedQueryGeometry? geometry = null, kotlin.coroutines.Continuation<? super java.util.List<? extends FF>> = null);\n    method @com.mapbox.maps.MapboxExperimental public suspend <FF extends com.mapbox.maps.interactions.FeaturesetFeature<?>> Object? queryRenderedFeatures(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<?,FF> descriptor, kotlin.coroutines.Continuation<? super java.util.List<? extends FF>> = null);\n    method @com.mapbox.maps.MapboxExperimental public suspend Object? queryRenderedRasterValues(com.mapbox.maps.ScreenCoordinate coordinate, com.mapbox.maps.RenderedRasterQueryOptions options, kotlin.coroutines.Continuation<? super com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.maps.QueriedRasterValues>>);\n    method @com.mapbox.maps.MapboxExperimental public suspend <FS extends com.mapbox.maps.interactions.FeatureState, FSK extends com.mapbox.maps.interactions.FeatureStateKey<FS>> Object? removeFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature, FSK? stateKey = null, kotlin.coroutines.Continuation<? super com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None>> = null);\n    method @com.mapbox.maps.MapboxExperimental public suspend <FS extends com.mapbox.maps.interactions.FeatureState, FSK extends com.mapbox.maps.interactions.FeatureStateKey<FS>> Object? removeFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature, kotlin.coroutines.Continuation<? super com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None>> = null);\n    method @com.mapbox.maps.MapboxExperimental public suspend Object? resetFeatureStates(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<?,?> descriptor, kotlin.coroutines.Continuation<? super com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None>>);\n    method @com.mapbox.maps.MapboxExperimental public suspend <FS extends com.mapbox.maps.interactions.FeatureState> Object? setFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature, FS state, kotlin.coroutines.Continuation<? super com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None>>);\n    method public void setGesturesSettings(com.mapbox.maps.plugin.gestures.generated.GesturesSettings);\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.CameraChangedCoalesced> cameraChangedCoalescedEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.CameraChanged> cameraChangedEvents;\n    property public final com.mapbox.maps.plugin.gestures.generated.GesturesSettings gesturesSettings;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.MapIdle> mapIdleEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.MapLoaded> mapLoadedEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.MapLoadingError> mapLoadingErrorEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.RenderFrameFinished> renderFrameFinishedEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.RenderFrameStarted> renderFrameStartedEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.ResourceRequest> resourceRequestEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.SourceAdded> sourceAddedEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.SourceDataLoaded> sourceDataLoadedEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.SourceRemoved> sourceRemovedEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleDataLoaded> styleDataLoadedEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleImageMissing> styleImageMissingEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleImageRemoveUnused> styleImageRemoveUnusedEvents;\n    property public final kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleLoaded> styleLoadedEvents;\n    field public static final com.mapbox.maps.extension.compose.MapState.Companion Companion;\n  }\n\n  public static final class MapState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.MapState,com.mapbox.maps.extension.compose.MapState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.MapState,com.mapbox.maps.extension.compose.MapState.Holder> Saver;\n  }\n\n  @kotlinx.parcelize.Parcelize public static final class MapState.Holder implements android.os.Parcelable {\n    ctor public MapState.Holder(java.util.Map<java.lang.String,? extends android.os.Parcelable> savedProperties);\n    method public java.util.Map<java.lang.String,android.os.Parcelable> component1();\n    method public com.mapbox.maps.extension.compose.MapState.Holder copy(java.util.Map<java.lang.String,? extends android.os.Parcelable> savedProperties);\n    method public java.util.Map<java.lang.String,android.os.Parcelable> getSavedProperties();\n    property public final java.util.Map<java.lang.String,android.os.Parcelable> savedProperties;\n  }\n\n  public final class MapStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.MapState rememberMapState(String? key = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.MapState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.ComposableTargetMarker(description=\"Mapbox Map Composable\") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface MapboxMapComposable {\n  }\n\n  public final class MapboxMapKt {\n    method @androidx.compose.runtime.Composable public static void MapboxMap(androidx.compose.ui.Modifier modifier = Modifier, com.mapbox.maps.extension.compose.ComposeMapInitOptions composeMapInitOptions = with(LocalDensity.current, { \n    return remember({ \n        return <init>(density)\n    })\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.ornaments.compass.MapCompassScope,kotlin.Unit> compass = { Compass() }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.ornaments.scalebar.MapScaleBarScope,kotlin.Unit> scaleBar = { ScaleBar() }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.ornaments.logo.MapLogoScope,kotlin.Unit> logo = { Logo() }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope,kotlin.Unit> attribution = { Attribution() }, com.mapbox.maps.extension.compose.animation.viewport.MapViewportState mapViewportState = rememberMapViewportState(), com.mapbox.maps.extension.compose.MapState mapState = rememberMapState(), com.mapbox.maps.plugin.gestures.OnMapClickListener? onMapClickListener = null, com.mapbox.maps.plugin.gestures.OnMapLongClickListener? onMapLongClickListener = null, kotlin.jvm.functions.Function0<kotlin.Unit> style = { MapboxStandardStyle() }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.MapboxMapScope,kotlin.Unit>? content = null);\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.extension.compose.MapboxMapScopeMarker public final class MapboxMapScope {\n    field public static final com.mapbox.maps.extension.compose.MapboxMapScope INSTANCE;\n  }\n\n  @kotlin.DslMarker public @interface MapboxMapScopeMarker {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.animation.viewport {\n\n  @androidx.compose.runtime.Stable public final class MapViewportState {\n    ctor public MapViewportState(com.mapbox.maps.CameraState initialCameraState = com.mapbox.maps.extension.compose.animation.viewport.MapViewportState.INIT_CAMERA_STATE);\n    method @UiThread public suspend Object? cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.CameraOptions camera = cameraOptions({ \n\n}), com.mapbox.maps.EdgeInsets? coordinatesPadding = null, Double? maxZoom = null, com.mapbox.maps.ScreenCoordinate? offset = null, kotlin.coroutines.Continuation<? super com.mapbox.maps.CameraOptions> = null);\n    method public void easeTo(com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, com.mapbox.maps.plugin.viewport.CompletionListener? completionListener = null);\n    method public void flyTo(com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, com.mapbox.maps.plugin.viewport.CompletionListener? completionListener = null);\n    method public com.mapbox.maps.CameraState? getCameraState();\n    method public com.mapbox.maps.plugin.viewport.ViewportStatus? getMapViewportStatus();\n    method public com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason? getMapViewportStatusChangedReason();\n    method public com.mapbox.maps.CameraOptions? getStyleDefaultCameraOptions();\n    method public void idle();\n    method @UiThread public void setCameraOptions(com.mapbox.maps.CameraOptions cameraOptions);\n    method @UiThread public void setCameraOptions(kotlin.jvm.functions.Function1<? super com.mapbox.maps.CameraOptions.Builder,kotlin.Unit> block);\n    method public void transitionToFollowPuckState(com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions followPuckViewportStateOptions = FollowPuckViewportStateOptions.<init>().build(), com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions defaultTransitionOptions = DefaultViewportTransitionOptions.<init>().build(), com.mapbox.maps.plugin.viewport.CompletionListener? completionListener = null);\n    method public void transitionToOverviewState(com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions overviewViewportStateOptions, com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions defaultTransitionOptions = DefaultViewportTransitionOptions.<init>().build(), com.mapbox.maps.plugin.viewport.CompletionListener? completionListener = null);\n    property public final com.mapbox.maps.CameraState? cameraState;\n    property public final com.mapbox.maps.plugin.viewport.ViewportStatus? mapViewportStatus;\n    property public final com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason? mapViewportStatusChangedReason;\n    property public final com.mapbox.maps.CameraOptions? styleDefaultCameraOptions;\n    field public static final com.mapbox.maps.extension.compose.animation.viewport.MapViewportState.Companion Companion;\n  }\n\n  public static final class MapViewportState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.animation.viewport.MapViewportState,com.mapbox.maps.CameraState> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.animation.viewport.MapViewportState,com.mapbox.maps.CameraState> Saver;\n  }\n\n  public final class MapViewportStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.animation.viewport.MapViewportState rememberMapViewportState(String? key = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.animation.viewport.MapViewportState,kotlin.Unit> init = {});\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.annotation {\n\n  @androidx.compose.runtime.Immutable @kotlinx.parcelize.Parcelize public final class IconImage implements android.os.Parcelable {\n    ctor public IconImage(String imageId);\n    ctor public IconImage(android.graphics.Bitmap bitmap);\n  }\n\n  public final class IconImageKt {\n    method @androidx.compose.runtime.Composable public static com.mapbox.maps.extension.compose.annotation.IconImage rememberIconImage(Object? key, androidx.compose.ui.graphics.painter.Painter painter);\n    method @androidx.compose.runtime.Composable public static com.mapbox.maps.extension.compose.annotation.IconImage rememberIconImage(@DrawableRes int resourceId);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public abstract sealed class MarkerAnimationEffect {\n    field public static final com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect.Companion Companion;\n  }\n\n  public static final class MarkerAnimationEffect.Companion {\n    method public com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect fade(float from, float to);\n    method public com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect getFadeIn();\n    method public com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect getFadeOut();\n    method public com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect getScale();\n    method public com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect getWiggle();\n    method public com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect scale(float from, float to);\n    property public final com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect fadeIn;\n    property public final com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect fadeOut;\n    property public final com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect scale;\n    property public final com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect wiggle;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public abstract sealed class MarkerAnimationTrigger {\n  }\n\n  public static final class MarkerAnimationTrigger.Appear extends com.mapbox.maps.extension.compose.annotation.MarkerAnimationTrigger {\n    field public static final com.mapbox.maps.extension.compose.annotation.MarkerAnimationTrigger.Appear INSTANCE;\n  }\n\n  public static final class MarkerAnimationTrigger.Disappear extends com.mapbox.maps.extension.compose.annotation.MarkerAnimationTrigger {\n    field public static final com.mapbox.maps.extension.compose.annotation.MarkerAnimationTrigger.Disappear INSTANCE;\n  }\n\n  public final class MarkerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental @com.mapbox.maps.extension.compose.MapboxMapComposable public static void Marker(com.mapbox.geojson.Point point, long color = Color(4291812087), long innerColor = Color(4294967295), androidx.compose.ui.graphics.Color? stroke = Color(4282014202), String? text = null, java.util.List<? extends com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect> appearAnimation = emptyList(), java.util.List<? extends com.mapbox.maps.extension.compose.annotation.MarkerAnimationEffect> disappearAnimation = emptyList(), kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);\n  }\n\n  public final class ViewAnnotationKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void ViewAnnotation(com.mapbox.maps.ViewAnnotationOptions options, androidx.compose.ui.Modifier modifier = Modifier, com.mapbox.maps.viewannotation.OnViewAnnotationUpdatedListener? onUpdatedListener = null, kotlin.jvm.functions.Function0<kotlin.Unit> content);\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.annotation.generated {\n\n  @androidx.compose.runtime.Stable public final class CircleAnnotationGroupInteractionsState {\n    ctor public CircleAnnotationGroupInteractionsState();\n    method public boolean isDraggable();\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState onClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState onClusterClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.ClusterFeature,java.lang.Boolean> onClusterClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState onClusterLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.ClusterFeature,java.lang.Boolean> onClusterLongClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState onDragFinished(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,kotlin.Unit> onDragFinish);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState onDragStarted(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,kotlin.Unit> onDragStart);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState onDragged(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,kotlin.Unit> onDrag);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState onLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,java.lang.Boolean> onLongClick);\n    method public void setDraggable(boolean);\n    property public final boolean isDraggable;\n  }\n\n  public final class CircleAnnotationGroupInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState rememberCircleAnnotationGroupInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState,kotlin.Unit> init = {});\n  }\n\n  public final class CircleAnnotationGroupKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void CircleAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,java.lang.Boolean> onClick = { it -> return false }, com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupState circleAnnotationGroupState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void CircleAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupState circleAnnotationGroupState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void CircleAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,java.lang.Boolean> onClick = { it -> return false }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void CircleAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class CircleAnnotationGroupState {\n    ctor public CircleAnnotationGroupState();\n    method public Double? getCircleBlur();\n    method public androidx.compose.ui.graphics.Color? getCircleColor();\n    method public String? getCircleColorUseTheme();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference? getCircleElevationReference();\n    method public Double? getCircleEmissiveStrength();\n    method public Double? getCircleOpacity();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment? getCirclePitchAlignment();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale? getCirclePitchScale();\n    method public Double? getCircleRadius();\n    method public Double? getCircleSortKey();\n    method public androidx.compose.ui.graphics.Color? getCircleStrokeColor();\n    method public String? getCircleStrokeColorUseTheme();\n    method public Double? getCircleStrokeOpacity();\n    method public Double? getCircleStrokeWidth();\n    method public java.util.List<java.lang.Double>? getCircleTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor? getCircleTranslateAnchor();\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState getInteractionsState();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public void setCircleBlur(Double?);\n    method public void setCircleColor(androidx.compose.ui.graphics.Color?);\n    method public void setCircleColorUseTheme(String?);\n    method public void setCircleElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference?);\n    method public void setCircleEmissiveStrength(Double?);\n    method public void setCircleOpacity(Double?);\n    method public void setCirclePitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment?);\n    method public void setCirclePitchScale(com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale?);\n    method public void setCircleRadius(Double?);\n    method public void setCircleSortKey(Double?);\n    method public void setCircleStrokeColor(androidx.compose.ui.graphics.Color?);\n    method public void setCircleStrokeColorUseTheme(String?);\n    method public void setCircleStrokeOpacity(Double?);\n    method public void setCircleStrokeWidth(Double?);\n    method public void setCircleTranslate(java.util.List<java.lang.Double>?);\n    method public void setCircleTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor?);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState);\n    method public void setMaxZoom(Double?);\n    method public void setMinZoom(Double?);\n    property public final Double? circleBlur;\n    property public final androidx.compose.ui.graphics.Color? circleColor;\n    property public final String? circleColorUseTheme;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference? circleElevationReference;\n    property public final Double? circleEmissiveStrength;\n    property public final Double? circleOpacity;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment? circlePitchAlignment;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale? circlePitchScale;\n    property public final Double? circleRadius;\n    property public final Double? circleSortKey;\n    property public final androidx.compose.ui.graphics.Color? circleStrokeColor;\n    property public final String? circleStrokeColorUseTheme;\n    property public final Double? circleStrokeOpacity;\n    property public final Double? circleStrokeWidth;\n    property public final java.util.List<java.lang.Double>? circleTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor? circleTranslateAnchor;\n    property public final com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroupInteractionsState interactionsState;\n    property public final Double? maxZoom;\n    property public final Double? minZoom;\n  }\n\n  @androidx.compose.runtime.Stable public final class CircleAnnotationInteractionsState {\n    ctor public CircleAnnotationInteractionsState();\n    method public boolean isDraggable();\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState onClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState onDragFinished(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,kotlin.Unit> onDragFinish);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState onDragStarted(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,kotlin.Unit> onDragStart);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState onDragged(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,kotlin.Unit> onDrag);\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState onLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,java.lang.Boolean> onLongClick);\n    method public void setDraggable(boolean);\n    property public final boolean isDraggable;\n  }\n\n  public final class CircleAnnotationInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState rememberCircleAnnotationInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState,kotlin.Unit> init = {});\n  }\n\n  public final class CircleAnnotationKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void CircleAnnotation(com.mapbox.geojson.Point point, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,java.lang.Boolean> onClick = { it -> return false }, com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationState circleAnnotationState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void CircleAnnotation(com.mapbox.geojson.Point point, com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationState circleAnnotationState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void CircleAnnotation(com.mapbox.geojson.Point point, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,java.lang.Boolean> onClick = { it -> return false }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void CircleAnnotation(com.mapbox.geojson.Point point, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationState,kotlin.Unit> init);\n  }\n\n  public final class CircleAnnotationOptionsExtKt {\n    method public static com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleColor(com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions, long circleColor);\n    method public static com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleStrokeColor(com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions, long circleStrokeColor);\n  }\n\n  @androidx.compose.runtime.Stable public final class CircleAnnotationState {\n    ctor public CircleAnnotationState();\n    method public Double? getCircleBlur();\n    method public androidx.compose.ui.graphics.Color? getCircleColor();\n    method public String? getCircleColorUseTheme();\n    method public Double? getCircleOpacity();\n    method public Double? getCircleRadius();\n    method public androidx.compose.ui.graphics.Color? getCircleStrokeColor();\n    method public String? getCircleStrokeColorUseTheme();\n    method public Double? getCircleStrokeOpacity();\n    method public Double? getCircleStrokeWidth();\n    method public com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState getInteractionsState();\n    method public void setCircleBlur(Double?);\n    method public void setCircleColor(androidx.compose.ui.graphics.Color?);\n    method public void setCircleColorUseTheme(String?);\n    method public void setCircleOpacity(Double?);\n    method public void setCircleRadius(Double?);\n    method public void setCircleStrokeColor(androidx.compose.ui.graphics.Color?);\n    method public void setCircleStrokeColorUseTheme(String?);\n    method public void setCircleStrokeOpacity(Double?);\n    method public void setCircleStrokeWidth(Double?);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState);\n    property public final Double? circleBlur;\n    property public final androidx.compose.ui.graphics.Color? circleColor;\n    property public final String? circleColorUseTheme;\n    property public final Double? circleOpacity;\n    property public final Double? circleRadius;\n    property public final androidx.compose.ui.graphics.Color? circleStrokeColor;\n    property public final String? circleStrokeColorUseTheme;\n    property public final Double? circleStrokeOpacity;\n    property public final Double? circleStrokeWidth;\n    property public final com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationInteractionsState interactionsState;\n  }\n\n  @androidx.compose.runtime.Stable public final class PointAnnotationGroupInteractionsState {\n    ctor public PointAnnotationGroupInteractionsState();\n    method public boolean isDraggable();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState onClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState onClusterClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.ClusterFeature,java.lang.Boolean> onClusterClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState onClusterLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.ClusterFeature,java.lang.Boolean> onClusterLongClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState onDragFinished(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,kotlin.Unit> onDragFinish);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState onDragStarted(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,kotlin.Unit> onDragStart);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState onDragged(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,kotlin.Unit> onDrag);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState onLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,java.lang.Boolean> onLongClick);\n    method public void setDraggable(boolean);\n    property public final boolean isDraggable;\n  }\n\n  public final class PointAnnotationGroupInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState rememberPointAnnotationGroupInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState,kotlin.Unit> init = {});\n  }\n\n  public final class PointAnnotationGroupKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PointAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,java.lang.Boolean> onClick = { it -> return false }, com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupState pointAnnotationGroupState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PointAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupState pointAnnotationGroupState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PointAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,java.lang.Boolean> onClick = { it -> return false }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PointAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class PointAnnotationGroupState {\n    ctor public PointAnnotationGroupState();\n    method public Boolean? getIconAllowOverlap();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? getIconAnchor();\n    method public androidx.compose.ui.graphics.Color? getIconColor();\n    method public Double? getIconColorBrightnessMax();\n    method public Double? getIconColorBrightnessMin();\n    method public Double? getIconColorContrast();\n    method public Double? getIconColorSaturation();\n    method public String? getIconColorUseTheme();\n    method public Double? getIconEmissiveStrength();\n    method public Double? getIconHaloBlur();\n    method public androidx.compose.ui.graphics.Color? getIconHaloColor();\n    method public String? getIconHaloColorUseTheme();\n    method public Double? getIconHaloWidth();\n    method public Boolean? getIconIgnorePlacement();\n    method public com.mapbox.maps.extension.compose.annotation.IconImage? getIconImage();\n    method public Double? getIconImageCrossFade();\n    method public Boolean? getIconKeepUpright();\n    method public Double? getIconOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getIconOffset();\n    method public Double? getIconOpacity();\n    method public Boolean? getIconOptional();\n    method public Double? getIconPadding();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment? getIconPitchAlignment();\n    method public Double? getIconRotate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment? getIconRotationAlignment();\n    method public Double? getIconSize();\n    method public java.util.List<java.lang.Double>? getIconSizeScaleRange();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? getIconTextFit();\n    method public java.util.List<java.lang.Double>? getIconTextFitPadding();\n    method public java.util.List<java.lang.Double>? getIconTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor? getIconTranslateAnchor();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState getInteractionsState();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode? getOcclusionOpacityMode();\n    method public Boolean? getSymbolAvoidEdges();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference? getSymbolElevationReference();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement? getSymbolPlacement();\n    method public Double? getSymbolSortKey();\n    method public Double? getSymbolSpacing();\n    method public Boolean? getSymbolZElevate();\n    method public Double? getSymbolZOffset();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder? getSymbolZOrder();\n    method public Boolean? getTextAllowOverlap();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? getTextAnchor();\n    method public androidx.compose.ui.graphics.Color? getTextColor();\n    method public String? getTextColorUseTheme();\n    method public Double? getTextEmissiveStrength();\n    method public String? getTextField();\n    method public java.util.List<java.lang.String>? getTextFont();\n    method public Double? getTextHaloBlur();\n    method public androidx.compose.ui.graphics.Color? getTextHaloColor();\n    method public String? getTextHaloColorUseTheme();\n    method public Double? getTextHaloWidth();\n    method public Boolean? getTextIgnorePlacement();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? getTextJustify();\n    method public Boolean? getTextKeepUpright();\n    method public Double? getTextLetterSpacing();\n    method public Double? getTextLineHeight();\n    method public Double? getTextMaxAngle();\n    method public Double? getTextMaxWidth();\n    method public Double? getTextOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getTextOffset();\n    method public Double? getTextOpacity();\n    method public Boolean? getTextOptional();\n    method public Double? getTextPadding();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment? getTextPitchAlignment();\n    method public Double? getTextRadialOffset();\n    method public Double? getTextRotate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment? getTextRotationAlignment();\n    method public Double? getTextSize();\n    method public java.util.List<java.lang.Double>? getTextSizeScaleRange();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? getTextTransform();\n    method public java.util.List<java.lang.Double>? getTextTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor? getTextTranslateAnchor();\n    method public java.util.List<java.lang.String>? getTextVariableAnchor();\n    method public java.util.List<java.lang.String>? getTextWritingMode();\n    method public void setIconAllowOverlap(Boolean?);\n    method public void setIconAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor?);\n    method public void setIconColor(androidx.compose.ui.graphics.Color?);\n    method public void setIconColorBrightnessMax(Double?);\n    method public void setIconColorBrightnessMin(Double?);\n    method public void setIconColorContrast(Double?);\n    method public void setIconColorSaturation(Double?);\n    method public void setIconColorUseTheme(String?);\n    method public void setIconEmissiveStrength(Double?);\n    method public void setIconHaloBlur(Double?);\n    method public void setIconHaloColor(androidx.compose.ui.graphics.Color?);\n    method public void setIconHaloColorUseTheme(String?);\n    method public void setIconHaloWidth(Double?);\n    method public void setIconIgnorePlacement(Boolean?);\n    method public void setIconImage(com.mapbox.maps.extension.compose.annotation.IconImage?);\n    method public void setIconImageCrossFade(Double?);\n    method public void setIconKeepUpright(Boolean?);\n    method public void setIconOcclusionOpacity(Double?);\n    method public void setIconOffset(java.util.List<java.lang.Double>?);\n    method public void setIconOpacity(Double?);\n    method public void setIconOptional(Boolean?);\n    method public void setIconPadding(Double?);\n    method public void setIconPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment?);\n    method public void setIconRotate(Double?);\n    method public void setIconRotationAlignment(com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment?);\n    method public void setIconSize(Double?);\n    method public void setIconSizeScaleRange(java.util.List<java.lang.Double>?);\n    method public void setIconTextFit(com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit?);\n    method public void setIconTextFitPadding(java.util.List<java.lang.Double>?);\n    method public void setIconTranslate(java.util.List<java.lang.Double>?);\n    method public void setIconTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor?);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState);\n    method public void setMaxZoom(Double?);\n    method public void setMinZoom(Double?);\n    method public void setOcclusionOpacityMode(com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode?);\n    method public void setSymbolAvoidEdges(Boolean?);\n    method public void setSymbolElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference?);\n    method public void setSymbolPlacement(com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement?);\n    method public void setSymbolSortKey(Double?);\n    method public void setSymbolSpacing(Double?);\n    method public void setSymbolZElevate(Boolean?);\n    method public void setSymbolZOffset(Double?);\n    method public void setSymbolZOrder(com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder?);\n    method public void setTextAllowOverlap(Boolean?);\n    method public void setTextAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor?);\n    method public void setTextColor(androidx.compose.ui.graphics.Color?);\n    method public void setTextColorUseTheme(String?);\n    method public void setTextEmissiveStrength(Double?);\n    method public void setTextField(String?);\n    method public void setTextFont(java.util.List<java.lang.String>?);\n    method public void setTextHaloBlur(Double?);\n    method public void setTextHaloColor(androidx.compose.ui.graphics.Color?);\n    method public void setTextHaloColorUseTheme(String?);\n    method public void setTextHaloWidth(Double?);\n    method public void setTextIgnorePlacement(Boolean?);\n    method public void setTextJustify(com.mapbox.maps.extension.style.layers.properties.generated.TextJustify?);\n    method public void setTextKeepUpright(Boolean?);\n    method public void setTextLetterSpacing(Double?);\n    method public void setTextLineHeight(Double?);\n    method public void setTextMaxAngle(Double?);\n    method public void setTextMaxWidth(Double?);\n    method public void setTextOcclusionOpacity(Double?);\n    method public void setTextOffset(java.util.List<java.lang.Double>?);\n    method public void setTextOpacity(Double?);\n    method public void setTextOptional(Boolean?);\n    method public void setTextPadding(Double?);\n    method public void setTextPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment?);\n    method public void setTextRadialOffset(Double?);\n    method public void setTextRotate(Double?);\n    method public void setTextRotationAlignment(com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment?);\n    method public void setTextSize(Double?);\n    method public void setTextSizeScaleRange(java.util.List<java.lang.Double>?);\n    method public void setTextTransform(com.mapbox.maps.extension.style.layers.properties.generated.TextTransform?);\n    method public void setTextTranslate(java.util.List<java.lang.Double>?);\n    method public void setTextTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor?);\n    method public void setTextVariableAnchor(java.util.List<java.lang.String>?);\n    method public void setTextWritingMode(java.util.List<java.lang.String>?);\n    property public final Boolean? iconAllowOverlap;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? iconAnchor;\n    property public final androidx.compose.ui.graphics.Color? iconColor;\n    property public final Double? iconColorBrightnessMax;\n    property public final Double? iconColorBrightnessMin;\n    property public final Double? iconColorContrast;\n    property public final Double? iconColorSaturation;\n    property public final String? iconColorUseTheme;\n    property public final Double? iconEmissiveStrength;\n    property public final Double? iconHaloBlur;\n    property public final androidx.compose.ui.graphics.Color? iconHaloColor;\n    property public final String? iconHaloColorUseTheme;\n    property public final Double? iconHaloWidth;\n    property public final Boolean? iconIgnorePlacement;\n    property public final com.mapbox.maps.extension.compose.annotation.IconImage? iconImage;\n    property public final Double? iconImageCrossFade;\n    property public final Boolean? iconKeepUpright;\n    property public final Double? iconOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? iconOffset;\n    property public final Double? iconOpacity;\n    property public final Boolean? iconOptional;\n    property public final Double? iconPadding;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment? iconPitchAlignment;\n    property public final Double? iconRotate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment? iconRotationAlignment;\n    property public final Double? iconSize;\n    property public final java.util.List<java.lang.Double>? iconSizeScaleRange;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? iconTextFit;\n    property public final java.util.List<java.lang.Double>? iconTextFitPadding;\n    property public final java.util.List<java.lang.Double>? iconTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor? iconTranslateAnchor;\n    property public final com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroupInteractionsState interactionsState;\n    property public final Double? maxZoom;\n    property public final Double? minZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode? occlusionOpacityMode;\n    property public final Boolean? symbolAvoidEdges;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference? symbolElevationReference;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement? symbolPlacement;\n    property public final Double? symbolSortKey;\n    property public final Double? symbolSpacing;\n    property public final Boolean? symbolZElevate;\n    property public final Double? symbolZOffset;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder? symbolZOrder;\n    property public final Boolean? textAllowOverlap;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? textAnchor;\n    property public final androidx.compose.ui.graphics.Color? textColor;\n    property public final String? textColorUseTheme;\n    property public final Double? textEmissiveStrength;\n    property public final String? textField;\n    property public final java.util.List<java.lang.String>? textFont;\n    property public final Double? textHaloBlur;\n    property public final androidx.compose.ui.graphics.Color? textHaloColor;\n    property public final String? textHaloColorUseTheme;\n    property public final Double? textHaloWidth;\n    property public final Boolean? textIgnorePlacement;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? textJustify;\n    property public final Boolean? textKeepUpright;\n    property public final Double? textLetterSpacing;\n    property public final Double? textLineHeight;\n    property public final Double? textMaxAngle;\n    property public final Double? textMaxWidth;\n    property public final Double? textOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? textOffset;\n    property public final Double? textOpacity;\n    property public final Boolean? textOptional;\n    property public final Double? textPadding;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment? textPitchAlignment;\n    property public final Double? textRadialOffset;\n    property public final Double? textRotate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment? textRotationAlignment;\n    property public final Double? textSize;\n    property public final java.util.List<java.lang.Double>? textSizeScaleRange;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? textTransform;\n    property public final java.util.List<java.lang.Double>? textTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor? textTranslateAnchor;\n    property public final java.util.List<java.lang.String>? textVariableAnchor;\n    property public final java.util.List<java.lang.String>? textWritingMode;\n  }\n\n  @androidx.compose.runtime.Stable public final class PointAnnotationInteractionsState {\n    ctor public PointAnnotationInteractionsState();\n    method public boolean isDraggable();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState onClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState onDragFinished(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,kotlin.Unit> onDragFinish);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState onDragStarted(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,kotlin.Unit> onDragStart);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState onDragged(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,kotlin.Unit> onDrag);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState onLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,java.lang.Boolean> onLongClick);\n    method public void setDraggable(boolean);\n    property public final boolean isDraggable;\n  }\n\n  public final class PointAnnotationInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState rememberPointAnnotationInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState,kotlin.Unit> init = {});\n  }\n\n  public final class PointAnnotationKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PointAnnotation(com.mapbox.geojson.Point point, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,java.lang.Boolean> onClick = { it -> return false }, com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationState pointAnnotationState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PointAnnotation(com.mapbox.geojson.Point point, com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationState pointAnnotationState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PointAnnotation(com.mapbox.geojson.Point point, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PointAnnotation,java.lang.Boolean> onClick = { it -> return false }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PointAnnotation(com.mapbox.geojson.Point point, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationState,kotlin.Unit> init);\n  }\n\n  public final class PointAnnotationOptionsExtKt {\n    method public static com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconColor(com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions, long iconColor);\n    method public static com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconHaloColor(com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions, long iconHaloColor);\n    method public static com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextColor(com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions, long textColor);\n    method public static com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextHaloColor(com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions, long textHaloColor);\n  }\n\n  @androidx.compose.runtime.Stable public final class PointAnnotationState {\n    ctor public PointAnnotationState();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? getIconAnchor();\n    method public androidx.compose.ui.graphics.Color? getIconColor();\n    method public String? getIconColorUseTheme();\n    method public Double? getIconEmissiveStrength();\n    method public Double? getIconHaloBlur();\n    method public androidx.compose.ui.graphics.Color? getIconHaloColor();\n    method public String? getIconHaloColorUseTheme();\n    method public Double? getIconHaloWidth();\n    method public com.mapbox.maps.extension.compose.annotation.IconImage? getIconImage();\n    method public Double? getIconImageCrossFade();\n    method public Double? getIconOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getIconOffset();\n    method public Double? getIconOpacity();\n    method public Double? getIconRotate();\n    method public Double? getIconSize();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? getIconTextFit();\n    method public java.util.List<java.lang.Double>? getIconTextFitPadding();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState getInteractionsState();\n    method public Double? getSymbolZOffset();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? getTextAnchor();\n    method public androidx.compose.ui.graphics.Color? getTextColor();\n    method public String? getTextColorUseTheme();\n    method public Double? getTextEmissiveStrength();\n    method public String? getTextField();\n    method public Double? getTextHaloBlur();\n    method public androidx.compose.ui.graphics.Color? getTextHaloColor();\n    method public String? getTextHaloColorUseTheme();\n    method public Double? getTextHaloWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? getTextJustify();\n    method public Double? getTextLetterSpacing();\n    method public Double? getTextLineHeight();\n    method public Double? getTextMaxWidth();\n    method public Double? getTextOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getTextOffset();\n    method public Double? getTextOpacity();\n    method public Double? getTextRadialOffset();\n    method public Double? getTextRotate();\n    method public Double? getTextSize();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? getTextTransform();\n    method public void setIconAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor?);\n    method public void setIconColor(androidx.compose.ui.graphics.Color?);\n    method public void setIconColorUseTheme(String?);\n    method public void setIconEmissiveStrength(Double?);\n    method public void setIconHaloBlur(Double?);\n    method public void setIconHaloColor(androidx.compose.ui.graphics.Color?);\n    method public void setIconHaloColorUseTheme(String?);\n    method public void setIconHaloWidth(Double?);\n    method public void setIconImage(com.mapbox.maps.extension.compose.annotation.IconImage?);\n    method public void setIconImageCrossFade(Double?);\n    method public void setIconOcclusionOpacity(Double?);\n    method public void setIconOffset(java.util.List<java.lang.Double>?);\n    method public void setIconOpacity(Double?);\n    method public void setIconRotate(Double?);\n    method public void setIconSize(Double?);\n    method public void setIconTextFit(com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit?);\n    method public void setIconTextFitPadding(java.util.List<java.lang.Double>?);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState);\n    method public void setSymbolZOffset(Double?);\n    method public void setTextAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor?);\n    method public void setTextColor(androidx.compose.ui.graphics.Color?);\n    method public void setTextColorUseTheme(String?);\n    method public void setTextEmissiveStrength(Double?);\n    method public void setTextField(String?);\n    method public void setTextHaloBlur(Double?);\n    method public void setTextHaloColor(androidx.compose.ui.graphics.Color?);\n    method public void setTextHaloColorUseTheme(String?);\n    method public void setTextHaloWidth(Double?);\n    method public void setTextJustify(com.mapbox.maps.extension.style.layers.properties.generated.TextJustify?);\n    method public void setTextLetterSpacing(Double?);\n    method public void setTextLineHeight(Double?);\n    method public void setTextMaxWidth(Double?);\n    method public void setTextOcclusionOpacity(Double?);\n    method public void setTextOffset(java.util.List<java.lang.Double>?);\n    method public void setTextOpacity(Double?);\n    method public void setTextRadialOffset(Double?);\n    method public void setTextRotate(Double?);\n    method public void setTextSize(Double?);\n    method public void setTextTransform(com.mapbox.maps.extension.style.layers.properties.generated.TextTransform?);\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? iconAnchor;\n    property public final androidx.compose.ui.graphics.Color? iconColor;\n    property public final String? iconColorUseTheme;\n    property public final Double? iconEmissiveStrength;\n    property public final Double? iconHaloBlur;\n    property public final androidx.compose.ui.graphics.Color? iconHaloColor;\n    property public final String? iconHaloColorUseTheme;\n    property public final Double? iconHaloWidth;\n    property public final com.mapbox.maps.extension.compose.annotation.IconImage? iconImage;\n    property public final Double? iconImageCrossFade;\n    property public final Double? iconOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? iconOffset;\n    property public final Double? iconOpacity;\n    property public final Double? iconRotate;\n    property public final Double? iconSize;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? iconTextFit;\n    property public final java.util.List<java.lang.Double>? iconTextFitPadding;\n    property public final com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationInteractionsState interactionsState;\n    property public final Double? symbolZOffset;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? textAnchor;\n    property public final androidx.compose.ui.graphics.Color? textColor;\n    property public final String? textColorUseTheme;\n    property public final Double? textEmissiveStrength;\n    property public final String? textField;\n    property public final Double? textHaloBlur;\n    property public final androidx.compose.ui.graphics.Color? textHaloColor;\n    property public final String? textHaloColorUseTheme;\n    property public final Double? textHaloWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? textJustify;\n    property public final Double? textLetterSpacing;\n    property public final Double? textLineHeight;\n    property public final Double? textMaxWidth;\n    property public final Double? textOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? textOffset;\n    property public final Double? textOpacity;\n    property public final Double? textRadialOffset;\n    property public final Double? textRotate;\n    property public final Double? textSize;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? textTransform;\n  }\n\n  @androidx.compose.runtime.Stable public final class PolygonAnnotationGroupInteractionsState {\n    ctor public PolygonAnnotationGroupInteractionsState();\n    method public boolean isDraggable();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState onClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState onDragFinished(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,kotlin.Unit> onDragFinish);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState onDragStarted(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,kotlin.Unit> onDragStart);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState onDragged(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,kotlin.Unit> onDrag);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState onLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,java.lang.Boolean> onLongClick);\n    method public void setDraggable(boolean);\n    property public final boolean isDraggable;\n  }\n\n  public final class PolygonAnnotationGroupInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState rememberPolygonAnnotationGroupInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState,kotlin.Unit> init = {});\n  }\n\n  public final class PolygonAnnotationGroupKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PolygonAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,java.lang.Boolean> onClick = { it -> return false }, com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupState polygonAnnotationGroupState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PolygonAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupState polygonAnnotationGroupState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PolygonAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,java.lang.Boolean> onClick = { it -> return false }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PolygonAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class PolygonAnnotationGroupState {\n    ctor public PolygonAnnotationGroupState();\n    method public Boolean? getFillAntialias();\n    method public androidx.compose.ui.graphics.Color? getFillBridgeGuardRailColor();\n    method public String? getFillBridgeGuardRailColorUseTheme();\n    method public androidx.compose.ui.graphics.Color? getFillColor();\n    method public String? getFillColorUseTheme();\n    method public Boolean? getFillConstructBridgeGuardRail();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference? getFillElevationReference();\n    method public Double? getFillEmissiveStrength();\n    method public Double? getFillOpacity();\n    method public androidx.compose.ui.graphics.Color? getFillOutlineColor();\n    method public String? getFillOutlineColorUseTheme();\n    method public String? getFillPattern();\n    method public Double? getFillPatternCrossFade();\n    method public Double? getFillSortKey();\n    method public java.util.List<java.lang.Double>? getFillTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor? getFillTranslateAnchor();\n    method public androidx.compose.ui.graphics.Color? getFillTunnelStructureColor();\n    method public String? getFillTunnelStructureColorUseTheme();\n    method public Double? getFillZOffset();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState getInteractionsState();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public void setFillAntialias(Boolean?);\n    method public void setFillBridgeGuardRailColor(androidx.compose.ui.graphics.Color?);\n    method public void setFillBridgeGuardRailColorUseTheme(String?);\n    method public void setFillColor(androidx.compose.ui.graphics.Color?);\n    method public void setFillColorUseTheme(String?);\n    method public void setFillConstructBridgeGuardRail(Boolean?);\n    method public void setFillElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference?);\n    method public void setFillEmissiveStrength(Double?);\n    method public void setFillOpacity(Double?);\n    method public void setFillOutlineColor(androidx.compose.ui.graphics.Color?);\n    method public void setFillOutlineColorUseTheme(String?);\n    method public void setFillPattern(String?);\n    method public void setFillPatternCrossFade(Double?);\n    method public void setFillSortKey(Double?);\n    method public void setFillTranslate(java.util.List<java.lang.Double>?);\n    method public void setFillTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor?);\n    method public void setFillTunnelStructureColor(androidx.compose.ui.graphics.Color?);\n    method public void setFillTunnelStructureColorUseTheme(String?);\n    method public void setFillZOffset(Double?);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState);\n    method public void setMaxZoom(Double?);\n    method public void setMinZoom(Double?);\n    property public final Boolean? fillAntialias;\n    property public final androidx.compose.ui.graphics.Color? fillBridgeGuardRailColor;\n    property public final String? fillBridgeGuardRailColorUseTheme;\n    property public final androidx.compose.ui.graphics.Color? fillColor;\n    property public final String? fillColorUseTheme;\n    property public final Boolean? fillConstructBridgeGuardRail;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference? fillElevationReference;\n    property public final Double? fillEmissiveStrength;\n    property public final Double? fillOpacity;\n    property public final androidx.compose.ui.graphics.Color? fillOutlineColor;\n    property public final String? fillOutlineColorUseTheme;\n    property public final String? fillPattern;\n    property public final Double? fillPatternCrossFade;\n    property public final Double? fillSortKey;\n    property public final java.util.List<java.lang.Double>? fillTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor? fillTranslateAnchor;\n    property public final androidx.compose.ui.graphics.Color? fillTunnelStructureColor;\n    property public final String? fillTunnelStructureColorUseTheme;\n    property public final Double? fillZOffset;\n    property public final com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroupInteractionsState interactionsState;\n    property public final Double? maxZoom;\n    property public final Double? minZoom;\n  }\n\n  @androidx.compose.runtime.Stable public final class PolygonAnnotationInteractionsState {\n    ctor public PolygonAnnotationInteractionsState();\n    method public boolean isDraggable();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState onClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState onDragFinished(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,kotlin.Unit> onDragFinish);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState onDragStarted(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,kotlin.Unit> onDragStart);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState onDragged(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,kotlin.Unit> onDrag);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState onLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,java.lang.Boolean> onLongClick);\n    method public void setDraggable(boolean);\n    property public final boolean isDraggable;\n  }\n\n  public final class PolygonAnnotationInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState rememberPolygonAnnotationInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState,kotlin.Unit> init = {});\n  }\n\n  public final class PolygonAnnotationKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PolygonAnnotation(java.util.List<? extends java.util.List<com.mapbox.geojson.Point>> points, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,java.lang.Boolean> onClick = { it -> return false }, com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationState polygonAnnotationState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PolygonAnnotation(java.util.List<? extends java.util.List<com.mapbox.geojson.Point>> points, com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationState polygonAnnotationState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PolygonAnnotation(java.util.List<? extends java.util.List<com.mapbox.geojson.Point>> points, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,java.lang.Boolean> onClick = { it -> return false }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PolygonAnnotation(java.util.List<? extends java.util.List<com.mapbox.geojson.Point>> points, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationState,kotlin.Unit> init);\n  }\n\n  public final class PolygonAnnotationOptionsExtKt {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillBridgeGuardRailColor(com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions, long fillBridgeGuardRailColor);\n    method public static com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillColor(com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions, long fillColor);\n    method public static com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillOutlineColor(com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions, long fillOutlineColor);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillTunnelStructureColor(com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions, long fillTunnelStructureColor);\n  }\n\n  @androidx.compose.runtime.Stable public final class PolygonAnnotationState {\n    ctor public PolygonAnnotationState();\n    method public androidx.compose.ui.graphics.Color? getFillBridgeGuardRailColor();\n    method public String? getFillBridgeGuardRailColorUseTheme();\n    method public androidx.compose.ui.graphics.Color? getFillColor();\n    method public String? getFillColorUseTheme();\n    method public Boolean? getFillConstructBridgeGuardRail();\n    method public Double? getFillOpacity();\n    method public androidx.compose.ui.graphics.Color? getFillOutlineColor();\n    method public String? getFillOutlineColorUseTheme();\n    method public String? getFillPattern();\n    method public androidx.compose.ui.graphics.Color? getFillTunnelStructureColor();\n    method public String? getFillTunnelStructureColorUseTheme();\n    method public Double? getFillZOffset();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState getInteractionsState();\n    method public void setFillBridgeGuardRailColor(androidx.compose.ui.graphics.Color?);\n    method public void setFillBridgeGuardRailColorUseTheme(String?);\n    method public void setFillColor(androidx.compose.ui.graphics.Color?);\n    method public void setFillColorUseTheme(String?);\n    method public void setFillConstructBridgeGuardRail(Boolean?);\n    method public void setFillOpacity(Double?);\n    method public void setFillOutlineColor(androidx.compose.ui.graphics.Color?);\n    method public void setFillOutlineColorUseTheme(String?);\n    method public void setFillPattern(String?);\n    method public void setFillTunnelStructureColor(androidx.compose.ui.graphics.Color?);\n    method public void setFillTunnelStructureColorUseTheme(String?);\n    method public void setFillZOffset(Double?);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState);\n    property public final androidx.compose.ui.graphics.Color? fillBridgeGuardRailColor;\n    property public final String? fillBridgeGuardRailColorUseTheme;\n    property public final androidx.compose.ui.graphics.Color? fillColor;\n    property public final String? fillColorUseTheme;\n    property public final Boolean? fillConstructBridgeGuardRail;\n    property public final Double? fillOpacity;\n    property public final androidx.compose.ui.graphics.Color? fillOutlineColor;\n    property public final String? fillOutlineColorUseTheme;\n    property public final String? fillPattern;\n    property public final androidx.compose.ui.graphics.Color? fillTunnelStructureColor;\n    property public final String? fillTunnelStructureColorUseTheme;\n    property public final Double? fillZOffset;\n    property public final com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationInteractionsState interactionsState;\n  }\n\n  @androidx.compose.runtime.Stable public final class PolylineAnnotationGroupInteractionsState {\n    ctor public PolylineAnnotationGroupInteractionsState();\n    method public boolean isDraggable();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState onClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState onDragFinished(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,kotlin.Unit> onDragFinish);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState onDragStarted(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,kotlin.Unit> onDragStart);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState onDragged(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,kotlin.Unit> onDrag);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState onLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,java.lang.Boolean> onLongClick);\n    method public void setDraggable(boolean);\n    property public final boolean isDraggable;\n  }\n\n  public final class PolylineAnnotationGroupInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState rememberPolylineAnnotationGroupInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState,kotlin.Unit> init = {});\n  }\n\n  public final class PolylineAnnotationGroupKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PolylineAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,java.lang.Boolean> onClick = { it -> return false }, com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupState polylineAnnotationGroupState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PolylineAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupState polylineAnnotationGroupState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PolylineAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,java.lang.Boolean> onClick = { it -> return false }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PolylineAnnotationGroup(java.util.List<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions> annotations, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class PolylineAnnotationGroupState {\n    ctor public PolylineAnnotationGroupState();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState getInteractionsState();\n    method public Double? getLineBlur();\n    method public androidx.compose.ui.graphics.Color? getLineBorderColor();\n    method public String? getLineBorderColorUseTheme();\n    method public Double? getLineBorderWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineCap? getLineCap();\n    method public androidx.compose.ui.graphics.Color? getLineColor();\n    method public String? getLineColorUseTheme();\n    method public Double? getLineCrossSlope();\n    method public Double? getLineCutoutFadeWidth();\n    method public Double? getLineCutoutOpacity();\n    method public java.util.List<java.lang.Double>? getLineDasharray();\n    method public Double? getLineDepthOcclusionFactor();\n    method public Double? getLineElevationGroundScale();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference? getLineElevationReference();\n    method public Double? getLineEmissiveStrength();\n    method public Double? getLineGapWidth();\n    method public String? getLineGradientUseTheme();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? getLineJoin();\n    method public Double? getLineMiterLimit();\n    method public Double? getLineOcclusionOpacity();\n    method public Double? getLineOffset();\n    method public Double? getLineOpacity();\n    method public String? getLinePattern();\n    method public Double? getLinePatternCrossFade();\n    method public Double? getLineRoundLimit();\n    method public Double? getLineSortKey();\n    method public java.util.List<java.lang.Double>? getLineTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor? getLineTranslateAnchor();\n    method public androidx.compose.ui.graphics.Color? getLineTrimColor();\n    method public String? getLineTrimColorUseTheme();\n    method public java.util.List<java.lang.Double>? getLineTrimFadeRange();\n    method public java.util.List<java.lang.Double>? getLineTrimOffset();\n    method public Double? getLineWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit? getLineWidthUnit();\n    method public Double? getLineZOffset();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState);\n    method public void setLineBlur(Double?);\n    method public void setLineBorderColor(androidx.compose.ui.graphics.Color?);\n    method public void setLineBorderColorUseTheme(String?);\n    method public void setLineBorderWidth(Double?);\n    method public void setLineCap(com.mapbox.maps.extension.style.layers.properties.generated.LineCap?);\n    method public void setLineColor(androidx.compose.ui.graphics.Color?);\n    method public void setLineColorUseTheme(String?);\n    method public void setLineCrossSlope(Double?);\n    method public void setLineCutoutFadeWidth(Double?);\n    method public void setLineCutoutOpacity(Double?);\n    method public void setLineDasharray(java.util.List<java.lang.Double>?);\n    method public void setLineDepthOcclusionFactor(Double?);\n    method public void setLineElevationGroundScale(Double?);\n    method public void setLineElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference?);\n    method public void setLineEmissiveStrength(Double?);\n    method public void setLineGapWidth(Double?);\n    method public void setLineGradientUseTheme(String?);\n    method public void setLineJoin(com.mapbox.maps.extension.style.layers.properties.generated.LineJoin?);\n    method public void setLineMiterLimit(Double?);\n    method public void setLineOcclusionOpacity(Double?);\n    method public void setLineOffset(Double?);\n    method public void setLineOpacity(Double?);\n    method public void setLinePattern(String?);\n    method public void setLinePatternCrossFade(Double?);\n    method public void setLineRoundLimit(Double?);\n    method public void setLineSortKey(Double?);\n    method public void setLineTranslate(java.util.List<java.lang.Double>?);\n    method public void setLineTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor?);\n    method public void setLineTrimColor(androidx.compose.ui.graphics.Color?);\n    method public void setLineTrimColorUseTheme(String?);\n    method public void setLineTrimFadeRange(java.util.List<java.lang.Double>?);\n    method public void setLineTrimOffset(java.util.List<java.lang.Double>?);\n    method public void setLineWidth(Double?);\n    method public void setLineWidthUnit(com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit?);\n    method public void setLineZOffset(Double?);\n    method public void setMaxZoom(Double?);\n    method public void setMinZoom(Double?);\n    property public final com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroupInteractionsState interactionsState;\n    property public final Double? lineBlur;\n    property public final androidx.compose.ui.graphics.Color? lineBorderColor;\n    property public final String? lineBorderColorUseTheme;\n    property public final Double? lineBorderWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineCap? lineCap;\n    property public final androidx.compose.ui.graphics.Color? lineColor;\n    property public final String? lineColorUseTheme;\n    property public final Double? lineCrossSlope;\n    property public final Double? lineCutoutFadeWidth;\n    property public final Double? lineCutoutOpacity;\n    property public final java.util.List<java.lang.Double>? lineDasharray;\n    property public final Double? lineDepthOcclusionFactor;\n    property public final Double? lineElevationGroundScale;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference? lineElevationReference;\n    property public final Double? lineEmissiveStrength;\n    property public final Double? lineGapWidth;\n    property public final String? lineGradientUseTheme;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? lineJoin;\n    property public final Double? lineMiterLimit;\n    property public final Double? lineOcclusionOpacity;\n    property public final Double? lineOffset;\n    property public final Double? lineOpacity;\n    property public final String? linePattern;\n    property public final Double? linePatternCrossFade;\n    property public final Double? lineRoundLimit;\n    property public final Double? lineSortKey;\n    property public final java.util.List<java.lang.Double>? lineTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor? lineTranslateAnchor;\n    property public final androidx.compose.ui.graphics.Color? lineTrimColor;\n    property public final String? lineTrimColorUseTheme;\n    property public final java.util.List<java.lang.Double>? lineTrimFadeRange;\n    property public final java.util.List<java.lang.Double>? lineTrimOffset;\n    property public final Double? lineWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit? lineWidthUnit;\n    property public final Double? lineZOffset;\n    property public final Double? maxZoom;\n    property public final Double? minZoom;\n  }\n\n  @androidx.compose.runtime.Stable public final class PolylineAnnotationInteractionsState {\n    ctor public PolylineAnnotationInteractionsState();\n    method public boolean isDraggable();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState onClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState onDragFinished(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,kotlin.Unit> onDragFinish);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState onDragStarted(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,kotlin.Unit> onDragStart);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState onDragged(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,kotlin.Unit> onDrag);\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState onLongClicked(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,java.lang.Boolean> onLongClick);\n    method public void setDraggable(boolean);\n    property public final boolean isDraggable;\n  }\n\n  public final class PolylineAnnotationInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState rememberPolylineAnnotationInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState,kotlin.Unit> init = {});\n  }\n\n  public final class PolylineAnnotationKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PolylineAnnotation(java.util.List<com.mapbox.geojson.Point> points, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,java.lang.Boolean> onClick = { it -> return false }, com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationState polylineAnnotationState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void PolylineAnnotation(java.util.List<com.mapbox.geojson.Point> points, com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationState polylineAnnotationState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PolylineAnnotation(java.util.List<com.mapbox.geojson.Point> points, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,java.lang.Boolean> onClick = { it -> return false }, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void PolylineAnnotation(java.util.List<com.mapbox.geojson.Point> points, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationState,kotlin.Unit> init);\n  }\n\n  public final class PolylineAnnotationOptionsExtKt {\n    method public static com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineBorderColor(com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions, long lineBorderColor);\n    method public static com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineColor(com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions, long lineColor);\n  }\n\n  @androidx.compose.runtime.Stable public final class PolylineAnnotationState {\n    ctor public PolylineAnnotationState();\n    method public com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState getInteractionsState();\n    method public Double? getLineBlur();\n    method public androidx.compose.ui.graphics.Color? getLineBorderColor();\n    method public String? getLineBorderColorUseTheme();\n    method public Double? getLineBorderWidth();\n    method public androidx.compose.ui.graphics.Color? getLineColor();\n    method public String? getLineColorUseTheme();\n    method public Double? getLineElevationGroundScale();\n    method public Double? getLineEmissiveStrength();\n    method public Double? getLineGapWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? getLineJoin();\n    method public Double? getLineOffset();\n    method public Double? getLineOpacity();\n    method public String? getLinePattern();\n    method public Double? getLineWidth();\n    method public Double? getLineZOffset();\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState);\n    method public void setLineBlur(Double?);\n    method public void setLineBorderColor(androidx.compose.ui.graphics.Color?);\n    method public void setLineBorderColorUseTheme(String?);\n    method public void setLineBorderWidth(Double?);\n    method public void setLineColor(androidx.compose.ui.graphics.Color?);\n    method public void setLineColorUseTheme(String?);\n    method public void setLineElevationGroundScale(Double?);\n    method public void setLineEmissiveStrength(Double?);\n    method public void setLineGapWidth(Double?);\n    method public void setLineJoin(com.mapbox.maps.extension.style.layers.properties.generated.LineJoin?);\n    method public void setLineOffset(Double?);\n    method public void setLineOpacity(Double?);\n    method public void setLinePattern(String?);\n    method public void setLineWidth(Double?);\n    method public void setLineZOffset(Double?);\n    property public final com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationInteractionsState interactionsState;\n    property public final Double? lineBlur;\n    property public final androidx.compose.ui.graphics.Color? lineBorderColor;\n    property public final String? lineBorderColorUseTheme;\n    property public final Double? lineBorderWidth;\n    property public final androidx.compose.ui.graphics.Color? lineColor;\n    property public final String? lineColorUseTheme;\n    property public final Double? lineElevationGroundScale;\n    property public final Double? lineEmissiveStrength;\n    property public final Double? lineGapWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? lineJoin;\n    property public final Double? lineOffset;\n    property public final Double? lineOpacity;\n    property public final String? linePattern;\n    property public final Double? lineWidth;\n    property public final Double? lineZOffset;\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.internal {\n\n  public final class MapPreviewPlaceholderKt {\n  }\n\n  public final class MapViewLifecycleKt {\n  }\n\n  public final class MapboxMapNodeKt {\n  }\n\n  public final class SettingsUtilsKt {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.ornaments.attribution {\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.extension.compose.MapboxMapScopeMarker public final class MapAttributionScope {\n    method @androidx.compose.runtime.Composable public void Attribution(androidx.compose.ui.Modifier modifier = Modifier, androidx.compose.foundation.layout.PaddingValues contentPadding = PaddingValues(92.dp, 4.dp, 4.dp, 4.dp), androidx.compose.ui.Alignment alignment = androidx.compose.ui.Alignment.Companion.BottomStart, long iconColor = Color(4280192171), kotlin.jvm.functions.Function3<? super java.util.List<com.mapbox.maps.plugin.attribution.Attribution>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.attribution.Attribution,kotlin.Unit>,kotlin.Unit> attributionDialog = { attributions, onDismissRequest, onAttributionClick -> AttributionDialog(attributions, onDismissRequest, onAttributionClick) }, kotlin.jvm.functions.Function4<? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> telemetryDialog = { onDismissRequest, onMoreInfo, onDisagree, onAgree -> TelemetryDialog(onDismissRequest, onMoreInfo, onDisagree, onAgree) });\n    method @androidx.compose.runtime.Composable public void Attribution(androidx.compose.ui.Modifier modifier = Modifier, androidx.compose.foundation.layout.PaddingValues contentPadding = PaddingValues(92.dp, 4.dp, 4.dp, 4.dp), androidx.compose.ui.Alignment alignment = androidx.compose.ui.Alignment.Companion.BottomStart, long iconColor = Color(4280192171), kotlin.jvm.functions.Function3<? super java.util.List<com.mapbox.maps.plugin.attribution.Attribution>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.attribution.Attribution,kotlin.Unit>,kotlin.Unit> attributionDialog = { attributions, onDismissRequest, onAttributionClick -> AttributionDialog(attributions, onDismissRequest, onAttributionClick) }, kotlin.jvm.functions.Function4<? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> telemetryDialog = { onDismissRequest, onMoreInfo, onDisagree, onAgree -> TelemetryDialog(onDismissRequest, onMoreInfo, onDisagree, onAgree) }, kotlin.jvm.functions.Function4<? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super kotlin.jvm.functions.Function0<kotlin.Unit>,? super java.lang.Boolean,kotlin.Unit> geofencingConsentDialog = { onDismissRequest, onDisagree, onAgree, currentUserConsent -> GeofencingConsentDialog(onDismissRequest, onDisagree, onAgree, currentUserConsent) });\n    method @androidx.compose.runtime.Composable @com.mapbox.annotation.MapboxDelicateApi @com.mapbox.annotation.MapboxExperimental public void AttributionControl(com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope.UserConsentState? userConsentState, com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope.AttributionState attributionState);\n    method @androidx.compose.runtime.Composable public void AttributionDialog(java.util.List<com.mapbox.maps.plugin.attribution.Attribution> attributions, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.attribution.Attribution,kotlin.Unit> onAttributionClick);\n    method @androidx.compose.runtime.Composable public void GeofencingConsentDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> onDisagree, kotlin.jvm.functions.Function0<kotlin.Unit> onAgree, boolean currentUserConsent);\n    method @androidx.compose.runtime.Composable public void TelemetryDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> onMoreInfo, kotlin.jvm.functions.Function0<kotlin.Unit> onDisagree, kotlin.jvm.functions.Function0<kotlin.Unit> onAgree);\n  }\n\n  @androidx.compose.runtime.Stable @com.mapbox.annotation.MapboxExperimental public static final class MapAttributionScope.AttributionState {\n    ctor public MapAttributionScope.AttributionState();\n    method public suspend Object? buildMapboxFeedbackUrl(kotlin.coroutines.Continuation<? super java.lang.String>);\n    method public java.util.List<com.mapbox.maps.plugin.attribution.Attribution> getAttributions();\n    method public com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope.UserConsentState? getUserConsentState();\n    property public final java.util.List<com.mapbox.maps.plugin.attribution.Attribution> attributions;\n    property public final com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope.UserConsentState? userConsentState;\n  }\n\n  @androidx.compose.runtime.Stable @com.mapbox.annotation.MapboxExperimental public static final class MapAttributionScope.UserConsentState {\n    method public boolean getGeofencingUserConsentState();\n    method public boolean getTelemetryEnableState();\n    method public com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope.UserConsentState.Builder toBuilder();\n    property public final boolean geofencingUserConsentState;\n    property public final boolean telemetryEnableState;\n  }\n\n  @com.mapbox.annotation.MapboxExperimental public static final class MapAttributionScope.UserConsentState.Builder {\n    ctor public MapAttributionScope.UserConsentState.Builder();\n    method public com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope.UserConsentState build();\n    method public boolean getGeofencingUserConsentState();\n    method public boolean getTelemetryEnableState();\n    method public com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope.UserConsentState.Builder setGeofencingUserConsentState(boolean geofencingUserConsentState);\n    method public com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope.UserConsentState.Builder setTelemetryEnableState(boolean telemetryEnableState);\n    property public final boolean geofencingUserConsentState;\n    property public final boolean telemetryEnableState;\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.ornaments.compass {\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.extension.compose.MapboxMapScopeMarker public final class MapCompassScope {\n    method @androidx.compose.runtime.Composable public void Compass(androidx.compose.ui.Modifier modifier = Modifier, androidx.compose.foundation.layout.PaddingValues contentPadding = PaddingValues(4.dp), androidx.compose.ui.Alignment alignment = androidx.compose.ui.Alignment.Companion.TopEnd, boolean fadeWhenFacingNorth = true, boolean resetToNorthUponClick = true, kotlin.jvm.functions.Function0<kotlin.Unit> content = { Image(painterResource(R.drawable.mapbox_compass_icon), \"Mapbox Compass\") });\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.ornaments.logo {\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.extension.compose.MapboxMapScopeMarker public final class MapLogoScope {\n    method @androidx.compose.runtime.Composable public void Logo(androidx.compose.ui.Modifier modifier = Modifier, androidx.compose.foundation.layout.PaddingValues contentPadding = PaddingValues(4.dp), androidx.compose.ui.Alignment alignment = androidx.compose.ui.Alignment.Companion.BottomStart);\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.ornaments.scalebar {\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.extension.compose.MapboxMapScopeMarker public final class MapScaleBarScope {\n    method @androidx.compose.runtime.Composable public void ScaleBar(androidx.compose.ui.Modifier modifier = Modifier, androidx.compose.foundation.layout.PaddingValues contentPadding = PaddingValues(4.dp), androidx.compose.ui.Alignment alignment = androidx.compose.ui.Alignment.Companion.TopStart, long textColor = Color.Black, long primaryColor = Color.Black, long secondaryColor = Color.White, float borderWidth = 2.dp, float height = 2.dp, float textBarMargin = 8.dp, float textBorderWidth = 2.dp, long textSize = 8.sp, boolean isMetricUnit = true, long refreshInterval = 15.milliseconds, boolean showTextBorder = true, float ratio = 0.5f, boolean useContinuousRendering = false);\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style {\n\n  @androidx.compose.runtime.Immutable public final class BooleanValue {\n    ctor public BooleanValue(com.mapbox.bindgen.Value value);\n    ctor public BooleanValue(boolean value);\n    ctor public BooleanValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue copy(com.mapbox.bindgen.Value value);\n    method public Boolean? getBooleanOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final Boolean? booleanOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.BooleanValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.BooleanValue DEFAULT;\n  }\n\n  public static final class BooleanValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class ColorValue {\n    ctor public ColorValue(com.mapbox.bindgen.Value value);\n    ctor public ColorValue(long value);\n    ctor public ColorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.ColorValue copy(com.mapbox.bindgen.Value value);\n    method public androidx.compose.ui.graphics.Color? getColorOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final androidx.compose.ui.graphics.Color? colorOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.ColorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.ColorValue DEFAULT;\n  }\n\n  public static final class ColorValue.Companion {\n  }\n\n  public final class DoubleListValue {\n    ctor public DoubleListValue(com.mapbox.bindgen.Value value);\n    ctor public DoubleListValue(double... value);\n    ctor public DoubleListValue(java.util.List<java.lang.Double> value);\n    ctor public DoubleListValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue copy(com.mapbox.bindgen.Value value);\n    method public java.util.List<java.lang.Double>? getDoubleListOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final java.util.List<java.lang.Double>? doubleListOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.DoubleListValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.DoubleListValue DEFAULT;\n  }\n\n  public static final class DoubleListValue.Companion {\n  }\n\n  public final class DoubleRangeValue {\n    ctor public DoubleRangeValue(com.mapbox.bindgen.Value value);\n    ctor public DoubleRangeValue(double lower, double upper);\n    ctor public DoubleRangeValue(android.util.Range<java.lang.Double> range);\n    ctor public DoubleRangeValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.DoubleRangeValue copy(com.mapbox.bindgen.Value value);\n    method public android.util.Range<java.lang.Double>? getRangeOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final android.util.Range<java.lang.Double>? rangeOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.DoubleRangeValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.DoubleRangeValue DEFAULT;\n  }\n\n  public static final class DoubleRangeValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class DoubleValue {\n    ctor public DoubleValue(com.mapbox.bindgen.Value value);\n    ctor public DoubleValue(double value);\n    ctor public DoubleValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue copy(com.mapbox.bindgen.Value value);\n    method public Double? getDoubleOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final Double? doubleOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.DoubleValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.DoubleValue DEFAULT;\n  }\n\n  public static final class DoubleValue.Companion {\n  }\n\n  public final class IdGenerator {\n    method public String generateRandomLayerId(String layerType);\n    method public String generateRandomLightId(String lightType);\n    method public String generateRandomSourceId(String sourceType);\n    field public static final com.mapbox.maps.extension.compose.style.IdGenerator INSTANCE;\n  }\n\n  @androidx.compose.runtime.Stable public final class ImportConfigs {\n    method public void config(String name, com.mapbox.bindgen.Value value);\n    method public com.mapbox.maps.extension.compose.style.ImportConfigs copy(java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value> configs);\n  }\n\n  @androidx.compose.runtime.Stable public final class LayerPositionedContent {\n    method public void aboveLayer(String layerId, kotlin.jvm.functions.Function0<kotlin.Unit> content);\n    method public void atIndex(int index, kotlin.jvm.functions.Function0<kotlin.Unit> content);\n    method public void belowLayer(String layerId, kotlin.jvm.functions.Function0<kotlin.Unit> content);\n    method public com.mapbox.maps.extension.compose.style.LayerPositionedContent copy(java.util.Map<com.mapbox.maps.LayerPosition,kotlin.jvm.functions.Function0<kotlin.Unit>> entries);\n    method public void layerPosition(com.mapbox.maps.LayerPosition layerPosition, kotlin.jvm.functions.Function0<kotlin.Unit> content);\n  }\n\n  @androidx.compose.runtime.Immutable public final class LongValue {\n    ctor public LongValue(com.mapbox.bindgen.Value value);\n    ctor public LongValue(long value);\n    ctor public LongValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.LongValue copy(com.mapbox.bindgen.Value value);\n    method public Long? getLongOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final Long? longOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.LongValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.LongValue DEFAULT;\n  }\n\n  public static final class LongValue.Companion {\n  }\n\n  @androidx.compose.runtime.ComposableTargetMarker(description=\"Mapbox Style Composable\") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface MapboxStyleComposable {\n  }\n\n  public final class PointListValue {\n    ctor public PointListValue(com.mapbox.bindgen.Value value);\n    ctor public PointListValue(com.mapbox.geojson.Point... point);\n    ctor public PointListValue(kotlin.Pair<java.lang.Double,java.lang.Double>... point);\n    ctor public PointListValue(java.util.List<? extends java.util.List<java.lang.Double>> points);\n    ctor public PointListValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.PointListValue copy(com.mapbox.bindgen.Value value);\n    method public java.util.List<com.mapbox.geojson.Point>? getPointsOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final java.util.List<com.mapbox.geojson.Point>? pointsOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.PointListValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.PointListValue DEFAULT;\n  }\n\n  public static final class PointListValue.Companion {\n  }\n\n  public final class PropertyTypesKt {\n  }\n\n  @androidx.compose.runtime.Stable public final class SlotsContent {\n    method public com.mapbox.maps.extension.compose.style.SlotsContent copy(java.util.Map<java.lang.String,kotlin.jvm.functions.Function0<kotlin.Unit>> entries);\n    method public void slot(String name, kotlin.jvm.functions.Function0<kotlin.Unit> content);\n  }\n\n  @androidx.compose.runtime.Immutable public final class StringListValue {\n    ctor public StringListValue(com.mapbox.bindgen.Value value);\n    ctor public StringListValue(java.lang.String... value);\n    ctor public StringListValue(java.util.List<java.lang.String> value);\n    ctor public StringListValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.StringListValue copy(com.mapbox.bindgen.Value value);\n    method public java.util.List<java.lang.String>? getStringListOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final java.util.List<java.lang.String>? stringListOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.StringListValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.StringListValue DEFAULT;\n  }\n\n  public static final class StringListValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class StringValue {\n    ctor public StringValue(com.mapbox.bindgen.Value value);\n    ctor public StringValue(String value);\n    ctor public StringValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.StringValue copy(com.mapbox.bindgen.Value value);\n    method public String? getStringOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final String? stringOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.StringValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.StringValue DEFAULT;\n  }\n\n  public static final class StringValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.MapboxExperimental public final class StyleColorTheme {\n    ctor public StyleColorTheme(com.mapbox.maps.ColorTheme colorTheme);\n    method public com.mapbox.maps.ColorTheme component1();\n    method public com.mapbox.maps.extension.compose.style.StyleColorTheme copy(com.mapbox.maps.ColorTheme colorTheme, boolean isStyleDefault);\n    method public com.mapbox.maps.ColorTheme getColorTheme();\n    property public final com.mapbox.maps.ColorTheme colorTheme;\n    field public static final com.mapbox.maps.extension.compose.style.StyleColorTheme.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.StyleColorTheme NONE;\n    field public static final com.mapbox.maps.extension.compose.style.StyleColorTheme STYLE_DEFAULT;\n  }\n\n  public static final class StyleColorTheme.Companion {\n  }\n\n  public final class StyleColorThemeKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.ColorTheme rememberColorTheme(String base64);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.ColorTheme rememberColorTheme(com.mapbox.maps.Image image);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.ColorTheme rememberColorTheme(androidx.compose.ui.graphics.ImageBitmap imageBitmap);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.ColorTheme rememberColorTheme(androidx.compose.ui.graphics.painter.Painter painter);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.ColorTheme rememberColorTheme(@DrawableRes int resourceId);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.compose.style.StyleColorTheme rememberStyleColorTheme(com.mapbox.maps.ColorTheme colorTheme);\n  }\n\n  @androidx.compose.runtime.Immutable public final class StyleImage {\n    ctor public StyleImage(String imageId, com.mapbox.maps.Image image, Float? scale = null, boolean sdf = false, java.util.List<com.mapbox.maps.ImageStretches> stretchX = listOf(), java.util.List<com.mapbox.maps.ImageStretches> stretchY = listOf(), com.mapbox.maps.ImageContent? content = null);\n    method public String component1();\n    method public com.mapbox.maps.Image component2();\n    method public Float? component3();\n    method public boolean component4();\n    method public java.util.List<com.mapbox.maps.ImageStretches> component5();\n    method public java.util.List<com.mapbox.maps.ImageStretches> component6();\n    method public com.mapbox.maps.ImageContent? component7();\n    method public com.mapbox.maps.extension.compose.style.StyleImage copy(String imageId, com.mapbox.maps.Image image, Float? scale, boolean sdf, java.util.List<com.mapbox.maps.ImageStretches> stretchX, java.util.List<com.mapbox.maps.ImageStretches> stretchY, com.mapbox.maps.ImageContent? content);\n    method public com.mapbox.maps.ImageContent? getContent();\n    method public com.mapbox.maps.Image getImage();\n    method public String getImageId();\n    method public Float? getScale();\n    method public boolean getSdf();\n    method public java.util.List<com.mapbox.maps.ImageStretches> getStretchX();\n    method public java.util.List<com.mapbox.maps.ImageStretches> getStretchY();\n    property public final com.mapbox.maps.ImageContent? content;\n    property public final com.mapbox.maps.Image image;\n    property public final String imageId;\n    property public final Float? scale;\n    property public final boolean sdf;\n    property public final java.util.List<com.mapbox.maps.ImageStretches> stretchX;\n    property public final java.util.List<com.mapbox.maps.ImageStretches> stretchY;\n  }\n\n  public final class StyleImageKt {\n    method @androidx.compose.runtime.Composable public static com.mapbox.maps.extension.compose.style.StyleImage rememberStyleImage(String imageId, androidx.compose.ui.graphics.ImageBitmap imageBitmap, Float? scale = null, boolean sdf = false, java.util.List<com.mapbox.maps.ImageStretches> stretchX = listOf(), java.util.List<com.mapbox.maps.ImageStretches> stretchY = listOf(), com.mapbox.maps.ImageContent? content = null);\n    method @androidx.compose.runtime.Composable public static com.mapbox.maps.extension.compose.style.StyleImage rememberStyleImage(Object? key, String imageId, androidx.compose.ui.graphics.painter.Painter painter, Float? scale = null, boolean sdf = false, java.util.List<com.mapbox.maps.ImageStretches> stretchX = listOf(), java.util.List<com.mapbox.maps.ImageStretches> stretchY = listOf(), com.mapbox.maps.ImageContent? content = null);\n    method @androidx.compose.runtime.Composable public static com.mapbox.maps.extension.compose.style.StyleImage rememberStyleImage(String imageId, @DrawableRes int resourceId, Float? scale = null, boolean sdf = false, java.util.List<com.mapbox.maps.ImageStretches> stretchX = listOf(), java.util.List<com.mapbox.maps.ImageStretches> stretchY = listOf(), com.mapbox.maps.ImageContent? content = null);\n  }\n\n  @androidx.compose.runtime.Stable public final class StyleImportsConfig {\n    method public com.mapbox.maps.extension.compose.style.StyleImportsConfig copy(java.util.Map<java.lang.String,com.mapbox.maps.extension.compose.style.ImportConfigs> entries);\n    method public void importConfig(String importId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.ImportConfigs,kotlin.Unit> configs);\n  }\n\n  public final class StyleKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void GenericStyle(String style, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, com.mapbox.maps.extension.compose.style.SlotsContent slotsContent = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.LayerPositionedContent layerPositionedContent = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.StyleImportsConfig styleImportsConfig = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.projection.generated.Projection projection = com.mapbox.maps.extension.compose.style.projection.generated.Projection.INITIAL, com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState = com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.INITIAL, com.mapbox.maps.extension.compose.style.lights.LightsState lightsState = com.mapbox.maps.extension.compose.style.lights.LightsState.INITIAL, com.mapbox.maps.TransitionOptions styleTransition = remember({ \n    return transition({ \n    \n    })\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void GenericStyle(String style, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, com.mapbox.maps.extension.compose.style.SlotsContent slotsContent = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.LayerPositionedContent layerPositionedContent = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.StyleState styleState = rememberStyleState());\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapStyle(String style, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, com.mapbox.maps.extension.compose.style.projection.generated.Projection projection = com.mapbox.maps.extension.compose.style.projection.generated.Projection.INITIAL, com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState = com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.INITIAL, com.mapbox.maps.extension.compose.style.lights.LightsState lightsState = com.mapbox.maps.extension.compose.style.lights.LightsState.INITIAL, com.mapbox.maps.TransitionOptions styleTransition = remember({ \n    return transition({ \n    \n    })\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapStyle(String style, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, com.mapbox.maps.extension.compose.style.StyleState styleState = rememberStyleState());\n    method public static com.mapbox.maps.extension.compose.style.ImportConfigs importConfigs(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.ImportConfigs,kotlin.Unit> init);\n    method public static com.mapbox.maps.extension.compose.style.LayerPositionedContent layerPositionedContent(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.LayerPositionedContent,kotlin.Unit> init);\n    method public static com.mapbox.maps.extension.compose.style.SlotsContent slotsContent(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.SlotsContent,kotlin.Unit> init);\n    method public static com.mapbox.maps.extension.compose.style.StyleImportsConfig styleImportsConfig(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.StyleImportsConfig,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class StyleState {\n    ctor public StyleState();\n    method public com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState getAtmosphereState();\n    method public com.mapbox.maps.extension.compose.style.lights.LightsState getLightsState();\n    method public com.mapbox.maps.extension.compose.style.projection.generated.Projection getProjection();\n    method public com.mapbox.maps.extension.compose.style.precipitations.generated.RainState getRainState();\n    method public com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState getSnowState();\n    method public com.mapbox.maps.extension.compose.style.StyleColorTheme getStyleColorTheme();\n    method public com.mapbox.maps.extension.compose.style.StyleImportsConfig getStyleImportsConfig();\n    method public com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState getStyleInteractionsState();\n    method public com.mapbox.maps.TransitionOptions getStyleTransition();\n    method public com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState getTerrainState();\n    method public void setAtmosphereState(com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState);\n    method public void setLightsState(com.mapbox.maps.extension.compose.style.lights.LightsState);\n    method public void setProjection(com.mapbox.maps.extension.compose.style.projection.generated.Projection);\n    method public void setRainState(com.mapbox.maps.extension.compose.style.precipitations.generated.RainState);\n    method public void setSnowState(com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState);\n    method public void setStyleColorTheme(com.mapbox.maps.extension.compose.style.StyleColorTheme);\n    method public void setStyleImportsConfig(com.mapbox.maps.extension.compose.style.StyleImportsConfig);\n    method public void setStyleInteractionsState(com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState);\n    method public void setStyleTransition(com.mapbox.maps.TransitionOptions);\n    method public void setTerrainState(com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState);\n    property public final com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState;\n    property public final com.mapbox.maps.extension.compose.style.lights.LightsState lightsState;\n    property public final com.mapbox.maps.extension.compose.style.projection.generated.Projection projection;\n    property public final com.mapbox.maps.extension.compose.style.precipitations.generated.RainState rainState;\n    property public final com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState snowState;\n    property public final com.mapbox.maps.extension.compose.style.StyleColorTheme styleColorTheme;\n    property public final com.mapbox.maps.extension.compose.style.StyleImportsConfig styleImportsConfig;\n    property public final com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState styleInteractionsState;\n    property public final com.mapbox.maps.TransitionOptions styleTransition;\n    property public final com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState;\n  }\n\n  public final class StyleStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.StyleState rememberStyleState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.StyleState,kotlin.Unit> init = {});\n  }\n\n  public final class Transition {\n    ctor public Transition(long durationMillis = 0L, long delayMillis = 0L);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.Transition copy(com.mapbox.bindgen.Value value);\n    method public long getDelayMillis();\n    method public long getDurationMillis();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final long delayMillis;\n    property public final long durationMillis;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.Transition.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.Transition DEFAULT;\n  }\n\n  public static final class Transition.Companion {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.atmosphere {\n\n  public final class AtmosphereStateApplierKt {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.atmosphere.generated {\n\n  @androidx.compose.runtime.Stable public final class AtmosphereState {\n    ctor public AtmosphereState();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getHighColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getHighColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getHighColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getHorizonBlend();\n    method public com.mapbox.maps.extension.compose.style.Transition getHorizonBlendTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleRangeValue getRange();\n    method public com.mapbox.maps.extension.compose.style.Transition getRangeTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getSpaceColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getSpaceColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSpaceColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getStarIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getStarIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleRangeValue getVerticalRange();\n    method public com.mapbox.maps.extension.compose.style.Transition getVerticalRangeTransition();\n    method public void setColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setHighColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setHighColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setHighColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setHorizonBlend(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setHorizonBlendTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRange(com.mapbox.maps.extension.compose.style.DoubleRangeValue);\n    method public void setRangeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setSpaceColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setSpaceColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setSpaceColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setStarIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setStarIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setVerticalRange(com.mapbox.maps.extension.compose.style.DoubleRangeValue);\n    method public void setVerticalRangeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    property public final com.mapbox.maps.extension.compose.style.ColorValue color;\n    property public final com.mapbox.maps.extension.compose.style.Transition colorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue colorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue highColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition highColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue highColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue horizonBlend;\n    property public final com.mapbox.maps.extension.compose.style.Transition horizonBlendTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleRangeValue range;\n    property public final com.mapbox.maps.extension.compose.style.Transition rangeTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue spaceColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition spaceColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue spaceColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue starIntensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition starIntensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleRangeValue verticalRange;\n    property public final com.mapbox.maps.extension.compose.style.Transition verticalRangeTransition;\n    field public static final com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState.Companion Companion;\n  }\n\n  public static final class AtmosphereState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState,com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState,com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState.Holder> Saver;\n  }\n\n  @kotlinx.parcelize.Parcelize @kotlinx.parcelize.TypeParceler public static final class AtmosphereState.Holder implements android.os.Parcelable {\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> component1();\n    method public com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState.Holder copy(java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties);\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> getSavedProperties();\n    property public final java.util.Map<java.lang.String,com.mapbox.bindgen.Value> savedProperties;\n  }\n\n  public final class AtmosphereStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState rememberAtmosphereState(String? key = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState,kotlin.Unit> init = {});\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.imports {\n\n  @androidx.compose.runtime.ComposableTargetMarker(description=\"Mapbox Style Import Composable\") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface MapboxStyleImportComposable {\n  }\n\n  @androidx.compose.runtime.Stable public final class StyleImportInteractionsState extends com.mapbox.maps.extension.compose.style.interactions.BasicStyleInteractions {\n    ctor public StyleImportInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.imports.StyleImportInteractionsState onFeaturesetClicked(String id, String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.imports.StyleImportInteractionsState onFeaturesetLongClicked(String id, String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.extension.compose.style.imports.StyleImportInteractionsState onMapClicked(kotlin.jvm.functions.Function2<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.imports.StyleImportInteractionsState onMapLongClicked(kotlin.jvm.functions.Function2<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n  }\n\n  public final class StyleImportInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.imports.StyleImportInteractionsState rememberStyleImportInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportInteractionsState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Stable public final class StyleImportState {\n    ctor public StyleImportState();\n    method public com.mapbox.maps.extension.compose.style.ImportConfigs? getImportConfigs();\n    method public com.mapbox.maps.extension.compose.style.imports.StyleImportInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.StyleColorTheme getStyleColorTheme();\n    method public void setImportConfigs(com.mapbox.maps.extension.compose.style.ImportConfigs?);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.imports.StyleImportInteractionsState);\n    method public void setStyleColorTheme(com.mapbox.maps.extension.compose.style.StyleColorTheme);\n    property public final com.mapbox.maps.extension.compose.style.ImportConfigs? importConfigs;\n    property public final com.mapbox.maps.extension.compose.style.imports.StyleImportInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.StyleColorTheme styleColorTheme;\n  }\n\n  public final class StyleImportStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.imports.StyleImportState rememberStyleImportState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.extension.compose.MapboxMapScopeMarker public final class StyleImportsScope {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.imports.MapboxStyleImportComposable public void StyleImport(String importId, String style, com.mapbox.maps.extension.compose.style.ImportConfigs? configs = null);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.imports.MapboxStyleImportComposable public void StyleImport(String importId, String style, com.mapbox.maps.extension.compose.style.imports.StyleImportState styleImportState = rememberStyleImportState());\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.interactions {\n\n  public abstract class BasicStyleInteractions {\n    ctor public BasicStyleInteractions();\n    method @androidx.compose.runtime.Composable protected final void BindToMap(com.mapbox.maps.MapboxMap map, String? importId = null);\n    method @androidx.compose.runtime.Composable protected final void UpdateInteractions(com.mapbox.maps.MapboxMap map, String? importId);\n    method protected final void clickInteractionFeatureset(String featuresetId, String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method protected final void clickInteractionLayer(String layerId, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method protected final void clickInteractionMap(kotlin.jvm.functions.Function2<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method protected final java.util.List<kotlin.jvm.functions.Function1<java.lang.String,com.mapbox.maps.MapInteraction>> getEntries();\n    method protected final com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope? getFeaturesetFeatureScope();\n    method protected final void longClickInteractionFeatureset(String featuresetId, String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method protected final void longClickInteractionLayer(String layerId, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method protected final void longClickInteractionMap(kotlin.jvm.functions.Function2<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method protected final void setFeaturesetFeatureScope(com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope?);\n    property protected final java.util.List<kotlin.jvm.functions.Function1<java.lang.String,com.mapbox.maps.MapInteraction>> entries;\n    property protected final com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope? featuresetFeatureScope;\n  }\n\n  @androidx.compose.runtime.Stable public final class StyleInteractionsState extends com.mapbox.maps.extension.compose.style.interactions.BasicStyleInteractions {\n    ctor public StyleInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState onFeaturesetClicked(String id, String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState onFeaturesetLongClicked(String id, String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState onLayerClicked(String id, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState onLayerLongClicked(String id, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState onMapClicked(kotlin.jvm.functions.Function2<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState onMapLongClicked(kotlin.jvm.functions.Function2<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n  }\n\n  public final class StyleInteractionsStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState rememberStyleInteractionStates(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState,kotlin.Unit> init = {});\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.interactions.generated {\n\n  public sealed interface FeaturesetFeatureScope {\n    method public <FS extends com.mapbox.maps.interactions.FeatureState, FSK extends com.mapbox.maps.interactions.FeatureStateKey<FS>> com.mapbox.common.Cancelable removeFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS>, FSK? stateKey = null, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method public <FS extends com.mapbox.maps.interactions.FeatureState> com.mapbox.common.Cancelable resetFeatureStates(com.mapbox.maps.interactions.FeaturesetFeature<FS>, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method public <FS extends com.mapbox.maps.interactions.FeatureState> com.mapbox.common.Cancelable setFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS>, FS state, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method public default void setStandardBuildingsState(com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature, kotlin.jvm.functions.Function1<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsState.Builder,kotlin.Unit> init);\n    method public default void setStandardLandmarkIconsState(com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature, kotlin.jvm.functions.Function1<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState.Builder,kotlin.Unit> init);\n    method public default void setStandardPlaceLabelsState(com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature, kotlin.jvm.functions.Function1<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState.Builder,kotlin.Unit> init);\n    method public default void setStandardPoiState(com.mapbox.maps.interactions.standard.generated.StandardPoiFeature, kotlin.jvm.functions.Function1<? super com.mapbox.maps.interactions.standard.generated.StandardPoiState.Builder,kotlin.Unit> init);\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.internal {\n\n  public final class StyleConfigKt {\n  }\n\n  public final class StyleLayerPositionKt {\n  }\n\n  public final class StyleSlotKt {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.layers {\n\n  @androidx.compose.runtime.Immutable public final class Filter {\n    ctor public Filter(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.Filter.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.Filter DEFAULT;\n  }\n\n  public static final class Filter.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class FormattedValue {\n    ctor public FormattedValue(String value);\n    ctor public FormattedValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.FormattedValue copy(com.mapbox.bindgen.Value value);\n    method public String? getStringOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public final String? stringOrNull;\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.FormattedValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.FormattedValue DEFAULT;\n  }\n\n  public static final class FormattedValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class ImageValue {\n    ctor public ImageValue(com.mapbox.maps.extension.compose.style.StyleImage styleImage);\n    ctor public ImageValue(String imageId);\n    ctor public ImageValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.StyleImage? component2();\n    method public com.mapbox.maps.extension.compose.style.layers.ImageValue copy(com.mapbox.bindgen.Value value, com.mapbox.maps.extension.compose.style.StyleImage? styleImage);\n    method public String? getImageIdOrNull();\n    method public com.mapbox.maps.extension.compose.style.StyleImage? getStyleImage();\n    method public com.mapbox.bindgen.Value getValue();\n    property public final String? imageIdOrNull;\n    property public final com.mapbox.maps.extension.compose.style.StyleImage? styleImage;\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.ImageValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.ImageValue DEFAULT;\n  }\n\n  public static final class ImageValue.Companion {\n  }\n\n  @androidx.compose.runtime.Stable @com.mapbox.maps.MapboxExperimental public final class LayerInteractionsState extends com.mapbox.maps.extension.compose.style.interactions.BasicStyleInteractions {\n    ctor public LayerInteractionsState();\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState onClicked(com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState onLongClicked(com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n  }\n\n  public final class LayerInteractionsStateKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static inline com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState rememberLayerInteractionsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.MapboxExperimental public final class ModelIdValue {\n    ctor public ModelIdValue(String value);\n    ctor public ModelIdValue(String modelId, String uri);\n    ctor public ModelIdValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public kotlin.Pair<java.lang.String,java.lang.String>? component2();\n    method public com.mapbox.maps.extension.compose.style.layers.ModelIdValue copy(com.mapbox.bindgen.Value value, kotlin.Pair<java.lang.String,java.lang.String>? modelInfo);\n    method public String? getModelIdOrNull();\n    method public kotlin.Pair<java.lang.String,java.lang.String>? getModelInfo();\n    method public String? getUriOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    property public final String? modelIdOrNull;\n    property public final kotlin.Pair<java.lang.String,java.lang.String>? modelInfo;\n    property public final String? uriOrNull;\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.ModelIdValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.ModelIdValue DEFAULT;\n  }\n\n  public static final class ModelIdValue.Companion {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.layers.generated {\n\n  public final class BackgroundLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void BackgroundLayer(String layerId = remember({ \n    return generateRandomLayerId(\"background\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.BackgroundLayerState backgroundLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void BackgroundLayer(String layerId = remember({ \n    return generateRandomLayerId(\"background\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.BackgroundLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class BackgroundLayerState {\n    ctor public BackgroundLayerState();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getBackgroundColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getBackgroundColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getBackgroundColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getBackgroundEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getBackgroundEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getBackgroundOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getBackgroundOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.ImageValue getBackgroundPattern();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.BackgroundPitchAlignmentValue getBackgroundPitchAlignment();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setBackgroundColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setBackgroundColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setBackgroundColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setBackgroundEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setBackgroundEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setBackgroundOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setBackgroundOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setBackgroundPattern(com.mapbox.maps.extension.compose.style.layers.ImageValue);\n    method public void setBackgroundPitchAlignment(com.mapbox.maps.extension.compose.style.layers.generated.BackgroundPitchAlignmentValue);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.ColorValue backgroundColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition backgroundColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue backgroundColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue backgroundEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition backgroundEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue backgroundOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition backgroundOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.ImageValue backgroundPattern;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.BackgroundPitchAlignmentValue backgroundPitchAlignment;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.MapboxExperimental public final class BackgroundPitchAlignmentValue {\n    ctor public BackgroundPitchAlignmentValue(com.mapbox.bindgen.Value value);\n    ctor public BackgroundPitchAlignmentValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.BackgroundPitchAlignmentValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.BackgroundPitchAlignmentValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.BackgroundPitchAlignmentValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.BackgroundPitchAlignmentValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.BackgroundPitchAlignmentValue VIEWPORT;\n  }\n\n  public static final class BackgroundPitchAlignmentValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.MapboxExperimental public final class CircleElevationReferenceValue {\n    ctor public CircleElevationReferenceValue(com.mapbox.bindgen.Value value);\n    ctor public CircleElevationReferenceValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.CircleElevationReferenceValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CircleElevationReferenceValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CircleElevationReferenceValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CircleElevationReferenceValue HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CircleElevationReferenceValue NONE;\n  }\n\n  public static final class CircleElevationReferenceValue.Companion {\n  }\n\n  public final class CircleLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void CircleLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"circle\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.CircleLayerState circleLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void CircleLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"circle\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.CircleLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class CircleLayerState {\n    ctor public CircleLayerState();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getCircleBlur();\n    method public com.mapbox.maps.extension.compose.style.Transition getCircleBlurTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getCircleColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getCircleColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getCircleColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.CircleElevationReferenceValue getCircleElevationReference();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getCircleEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getCircleEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getCircleOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getCircleOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchAlignmentValue getCirclePitchAlignment();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchScaleValue getCirclePitchScale();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getCircleRadius();\n    method public com.mapbox.maps.extension.compose.style.Transition getCircleRadiusTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getCircleSortKey();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getCircleStrokeColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getCircleStrokeColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getCircleStrokeColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getCircleStrokeOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getCircleStrokeOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getCircleStrokeWidth();\n    method public com.mapbox.maps.extension.compose.style.Transition getCircleStrokeWidthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getCircleTranslate();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.CircleTranslateAnchorValue getCircleTranslateAnchor();\n    method public com.mapbox.maps.extension.compose.style.Transition getCircleTranslateTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setCircleBlur(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setCircleBlurTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setCircleColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setCircleColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setCircleColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setCircleElevationReference(com.mapbox.maps.extension.compose.style.layers.generated.CircleElevationReferenceValue);\n    method public void setCircleEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setCircleEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setCircleOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setCircleOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setCirclePitchAlignment(com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchAlignmentValue);\n    method public void setCirclePitchScale(com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchScaleValue);\n    method public void setCircleRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setCircleRadiusTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setCircleSortKey(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setCircleStrokeColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setCircleStrokeColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setCircleStrokeColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setCircleStrokeOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setCircleStrokeOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setCircleStrokeWidth(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setCircleStrokeWidthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setCircleTranslate(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setCircleTranslateAnchor(com.mapbox.maps.extension.compose.style.layers.generated.CircleTranslateAnchorValue);\n    method public void setCircleTranslateTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue circleBlur;\n    property public final com.mapbox.maps.extension.compose.style.Transition circleBlurTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue circleColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition circleColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue circleColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.CircleElevationReferenceValue circleElevationReference;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue circleEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition circleEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue circleOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition circleOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchAlignmentValue circlePitchAlignment;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchScaleValue circlePitchScale;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue circleRadius;\n    property public final com.mapbox.maps.extension.compose.style.Transition circleRadiusTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue circleSortKey;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue circleStrokeColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition circleStrokeColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue circleStrokeColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue circleStrokeOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition circleStrokeOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue circleStrokeWidth;\n    property public final com.mapbox.maps.extension.compose.style.Transition circleStrokeWidthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue circleTranslate;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.CircleTranslateAnchorValue circleTranslateAnchor;\n    property public final com.mapbox.maps.extension.compose.style.Transition circleTranslateTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class CirclePitchAlignmentValue {\n    ctor public CirclePitchAlignmentValue(com.mapbox.bindgen.Value value);\n    ctor public CirclePitchAlignmentValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchAlignmentValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchAlignmentValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchAlignmentValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchAlignmentValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchAlignmentValue VIEWPORT;\n  }\n\n  public static final class CirclePitchAlignmentValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class CirclePitchScaleValue {\n    ctor public CirclePitchScaleValue(com.mapbox.bindgen.Value value);\n    ctor public CirclePitchScaleValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchScaleValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchScaleValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchScaleValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchScaleValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CirclePitchScaleValue VIEWPORT;\n  }\n\n  public static final class CirclePitchScaleValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class CircleTranslateAnchorValue {\n    ctor public CircleTranslateAnchorValue(com.mapbox.bindgen.Value value);\n    ctor public CircleTranslateAnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.CircleTranslateAnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CircleTranslateAnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CircleTranslateAnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CircleTranslateAnchorValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.CircleTranslateAnchorValue VIEWPORT;\n  }\n\n  public static final class CircleTranslateAnchorValue.Companion {\n  }\n\n  public final class ClipLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void ClipLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"clip\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerState clipLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void ClipLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"clip\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class ClipLayerState {\n    ctor public ClipLayerState();\n    method public com.mapbox.maps.extension.compose.style.StringListValue getClipLayerScope();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypesListValue getClipLayerTypes();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setClipLayerScope(com.mapbox.maps.extension.compose.style.StringListValue);\n    method public void setClipLayerTypes(com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypesListValue);\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.StringListValue clipLayerScope;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypesListValue clipLayerTypes;\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class ClipLayerTypes {\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypes copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypes.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypes MODEL;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypes SYMBOL;\n  }\n\n  public static final class ClipLayerTypes.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class ClipLayerTypesListValue {\n    ctor public ClipLayerTypesListValue(com.mapbox.bindgen.Value value);\n    ctor public ClipLayerTypesListValue(java.util.List<com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypes> value);\n    ctor public ClipLayerTypesListValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypesListValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypesListValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypesListValue DEFAULT;\n  }\n\n  public static final class ClipLayerTypesListValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.MapboxExperimental public final class FillElevationReferenceValue {\n    ctor public FillElevationReferenceValue(com.mapbox.bindgen.Value value);\n    ctor public FillElevationReferenceValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillElevationReferenceValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillElevationReferenceValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillElevationReferenceValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillElevationReferenceValue HD_ROAD_BASE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillElevationReferenceValue HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillElevationReferenceValue NONE;\n  }\n\n  public static final class FillElevationReferenceValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.MapboxExperimental public final class FillExtrusionBaseAlignmentValue {\n    ctor public FillExtrusionBaseAlignmentValue(com.mapbox.bindgen.Value value);\n    ctor public FillExtrusionBaseAlignmentValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionBaseAlignmentValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionBaseAlignmentValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionBaseAlignmentValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionBaseAlignmentValue FLAT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionBaseAlignmentValue TERRAIN;\n  }\n\n  public static final class FillExtrusionBaseAlignmentValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.MapboxExperimental public final class FillExtrusionHeightAlignmentValue {\n    ctor public FillExtrusionHeightAlignmentValue(com.mapbox.bindgen.Value value);\n    ctor public FillExtrusionHeightAlignmentValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionHeightAlignmentValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionHeightAlignmentValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionHeightAlignmentValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionHeightAlignmentValue FLAT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionHeightAlignmentValue TERRAIN;\n  }\n\n  public static final class FillExtrusionHeightAlignmentValue.Companion {\n  }\n\n  public final class FillExtrusionLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void FillExtrusionLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"fill-extrusion\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionLayerState fillExtrusionLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void FillExtrusionLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"fill-extrusion\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class FillExtrusionLayerState {\n    ctor public FillExtrusionLayerState();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionAmbientOcclusionGroundAttenuation();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionAmbientOcclusionGroundAttenuationTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionAmbientOcclusionGroundRadius();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionAmbientOcclusionGroundRadiusTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionAmbientOcclusionIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionAmbientOcclusionIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionAmbientOcclusionRadius();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionAmbientOcclusionRadiusTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionAmbientOcclusionWallRadius();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionAmbientOcclusionWallRadiusTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionBase();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionBaseAlignmentValue getFillExtrusionBaseAlignment();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionBaseTransition();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getFillExtrusionCastShadows();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getFillExtrusionColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getFillExtrusionColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionCutoffFadeRange();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionEdgeRadius();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getFillExtrusionFloodLightColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionFloodLightColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getFillExtrusionFloodLightColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionFloodLightGroundAttenuation();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionFloodLightGroundAttenuationTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionFloodLightGroundRadius();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionFloodLightGroundRadiusTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionFloodLightIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionFloodLightIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionFloodLightWallRadius();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionFloodLightWallRadiusTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionHeight();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionHeightAlignmentValue getFillExtrusionHeightAlignment();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionHeightTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionLineWidth();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionLineWidthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.ImageValue getFillExtrusionPattern();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionPatternCrossFade();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getFillExtrusionRoundedRoof();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getFillExtrusionTranslate();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionTranslateAnchorValue getFillExtrusionTranslateAnchor();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionTranslateTransition();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getFillExtrusionVerticalGradient();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillExtrusionVerticalScale();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillExtrusionVerticalScaleTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFillExtrusionAmbientOcclusionGroundAttenuation(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionAmbientOcclusionGroundAttenuationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionAmbientOcclusionGroundRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionAmbientOcclusionGroundRadiusTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionAmbientOcclusionIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionAmbientOcclusionIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionAmbientOcclusionRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionAmbientOcclusionRadiusTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionAmbientOcclusionWallRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionAmbientOcclusionWallRadiusTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionBase(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionBaseAlignment(com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionBaseAlignmentValue);\n    method public void setFillExtrusionBaseTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionCastShadows(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setFillExtrusionColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setFillExtrusionColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setFillExtrusionCutoffFadeRange(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionEdgeRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionFloodLightColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setFillExtrusionFloodLightColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionFloodLightColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setFillExtrusionFloodLightGroundAttenuation(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionFloodLightGroundAttenuationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionFloodLightGroundRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionFloodLightGroundRadiusTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionFloodLightIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionFloodLightIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionFloodLightWallRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionFloodLightWallRadiusTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionHeight(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionHeightAlignment(com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionHeightAlignmentValue);\n    method public void setFillExtrusionHeightTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionLineWidth(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionLineWidthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionPattern(com.mapbox.maps.extension.compose.style.layers.ImageValue);\n    method public void setFillExtrusionPatternCrossFade(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionRoundedRoof(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setFillExtrusionTranslate(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setFillExtrusionTranslateAnchor(com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionTranslateAnchorValue);\n    method public void setFillExtrusionTranslateTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillExtrusionVerticalGradient(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setFillExtrusionVerticalScale(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillExtrusionVerticalScaleTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionAmbientOcclusionGroundAttenuation;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionAmbientOcclusionGroundAttenuationTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionAmbientOcclusionGroundRadius;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionAmbientOcclusionGroundRadiusTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionAmbientOcclusionIntensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionAmbientOcclusionIntensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionAmbientOcclusionRadius;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionAmbientOcclusionRadiusTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionAmbientOcclusionWallRadius;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionAmbientOcclusionWallRadiusTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionBase;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionBaseAlignmentValue fillExtrusionBaseAlignment;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionBaseTransition;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue fillExtrusionCastShadows;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue fillExtrusionColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue fillExtrusionColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionCutoffFadeRange;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionEdgeRadius;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue fillExtrusionFloodLightColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionFloodLightColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue fillExtrusionFloodLightColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionFloodLightGroundAttenuation;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionFloodLightGroundAttenuationTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionFloodLightGroundRadius;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionFloodLightGroundRadiusTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionFloodLightIntensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionFloodLightIntensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionFloodLightWallRadius;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionFloodLightWallRadiusTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionHeight;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionHeightAlignmentValue fillExtrusionHeightAlignment;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionHeightTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionLineWidth;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionLineWidthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.ImageValue fillExtrusionPattern;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionPatternCrossFade;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue fillExtrusionRoundedRoof;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue fillExtrusionTranslate;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionTranslateAnchorValue fillExtrusionTranslateAnchor;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionTranslateTransition;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue fillExtrusionVerticalGradient;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillExtrusionVerticalScale;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillExtrusionVerticalScaleTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class FillExtrusionTranslateAnchorValue {\n    ctor public FillExtrusionTranslateAnchorValue(com.mapbox.bindgen.Value value);\n    ctor public FillExtrusionTranslateAnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionTranslateAnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionTranslateAnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionTranslateAnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionTranslateAnchorValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillExtrusionTranslateAnchorValue VIEWPORT;\n  }\n\n  public static final class FillExtrusionTranslateAnchorValue.Companion {\n  }\n\n  public final class FillLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void FillLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"fill\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.FillLayerState fillLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void FillLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"fill\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.FillLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class FillLayerState {\n    ctor public FillLayerState();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getFillAntialias();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getFillBridgeGuardRailColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillBridgeGuardRailColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getFillBridgeGuardRailColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getFillColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getFillColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getFillConstructBridgeGuardRail();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillElevationReferenceValue getFillElevationReference();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getFillOutlineColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillOutlineColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getFillOutlineColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.layers.ImageValue getFillPattern();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillPatternCrossFade();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillSortKey();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getFillTranslate();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillTranslateAnchorValue getFillTranslateAnchor();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillTranslateTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getFillTunnelStructureColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillTunnelStructureColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getFillTunnelStructureColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFillZOffset();\n    method public com.mapbox.maps.extension.compose.style.Transition getFillZOffsetTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFillAntialias(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setFillBridgeGuardRailColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setFillBridgeGuardRailColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillBridgeGuardRailColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setFillColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setFillColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setFillConstructBridgeGuardRail(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setFillElevationReference(com.mapbox.maps.extension.compose.style.layers.generated.FillElevationReferenceValue);\n    method public void setFillEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillOutlineColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setFillOutlineColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillOutlineColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setFillPattern(com.mapbox.maps.extension.compose.style.layers.ImageValue);\n    method public void setFillPatternCrossFade(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillSortKey(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillTranslate(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setFillTranslateAnchor(com.mapbox.maps.extension.compose.style.layers.generated.FillTranslateAnchorValue);\n    method public void setFillTranslateTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillTunnelStructureColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setFillTunnelStructureColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFillTunnelStructureColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setFillZOffset(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFillZOffsetTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue fillAntialias;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue fillBridgeGuardRailColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillBridgeGuardRailColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue fillBridgeGuardRailColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue fillColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue fillColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue fillConstructBridgeGuardRail;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.FillElevationReferenceValue fillElevationReference;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue fillOutlineColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillOutlineColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue fillOutlineColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.layers.ImageValue fillPattern;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillPatternCrossFade;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillSortKey;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue fillTranslate;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.FillTranslateAnchorValue fillTranslateAnchor;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillTranslateTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue fillTunnelStructureColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillTunnelStructureColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue fillTunnelStructureColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue fillZOffset;\n    property public final com.mapbox.maps.extension.compose.style.Transition fillZOffsetTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class FillTranslateAnchorValue {\n    ctor public FillTranslateAnchorValue(com.mapbox.bindgen.Value value);\n    ctor public FillTranslateAnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.FillTranslateAnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillTranslateAnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillTranslateAnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillTranslateAnchorValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.FillTranslateAnchorValue VIEWPORT;\n  }\n\n  public static final class FillTranslateAnchorValue.Companion {\n  }\n\n  public final class HeatmapLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void HeatmapLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"heatmap\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.HeatmapLayerState heatmapLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void HeatmapLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"heatmap\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.HeatmapLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class HeatmapLayerState {\n    ctor public HeatmapLayerState();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getHeatmapColor();\n    method public com.mapbox.maps.extension.compose.style.StringValue getHeatmapColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getHeatmapIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getHeatmapIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getHeatmapOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getHeatmapOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getHeatmapRadius();\n    method public com.mapbox.maps.extension.compose.style.Transition getHeatmapRadiusTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getHeatmapWeight();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setHeatmapColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setHeatmapColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setHeatmapIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setHeatmapIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setHeatmapOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setHeatmapOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setHeatmapRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setHeatmapRadiusTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setHeatmapWeight(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue heatmapColor;\n    property public final com.mapbox.maps.extension.compose.style.StringValue heatmapColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue heatmapIntensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition heatmapIntensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue heatmapOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition heatmapOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue heatmapRadius;\n    property public final com.mapbox.maps.extension.compose.style.Transition heatmapRadiusTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue heatmapWeight;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class HillshadeIlluminationAnchorValue {\n    ctor public HillshadeIlluminationAnchorValue(com.mapbox.bindgen.Value value);\n    ctor public HillshadeIlluminationAnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.HillshadeIlluminationAnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.HillshadeIlluminationAnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.HillshadeIlluminationAnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.HillshadeIlluminationAnchorValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.HillshadeIlluminationAnchorValue VIEWPORT;\n  }\n\n  public static final class HillshadeIlluminationAnchorValue.Companion {\n  }\n\n  public final class HillshadeLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void HillshadeLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"hillshade\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.HillshadeLayerState hillshadeLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void HillshadeLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"hillshade\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.HillshadeLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class HillshadeLayerState {\n    ctor public HillshadeLayerState();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getHillshadeAccentColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getHillshadeAccentColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getHillshadeAccentColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getHillshadeEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getHillshadeEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getHillshadeExaggeration();\n    method public com.mapbox.maps.extension.compose.style.Transition getHillshadeExaggerationTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getHillshadeHighlightColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getHillshadeHighlightColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getHillshadeHighlightColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.HillshadeIlluminationAnchorValue getHillshadeIlluminationAnchor();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getHillshadeIlluminationDirection();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getHillshadeShadowColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getHillshadeShadowColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getHillshadeShadowColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setHillshadeAccentColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setHillshadeAccentColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setHillshadeAccentColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setHillshadeEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setHillshadeEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setHillshadeExaggeration(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setHillshadeExaggerationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setHillshadeHighlightColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setHillshadeHighlightColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setHillshadeHighlightColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setHillshadeIlluminationAnchor(com.mapbox.maps.extension.compose.style.layers.generated.HillshadeIlluminationAnchorValue);\n    method public void setHillshadeIlluminationDirection(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setHillshadeShadowColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setHillshadeShadowColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setHillshadeShadowColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue hillshadeAccentColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition hillshadeAccentColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue hillshadeAccentColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue hillshadeEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition hillshadeEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue hillshadeExaggeration;\n    property public final com.mapbox.maps.extension.compose.style.Transition hillshadeExaggerationTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue hillshadeHighlightColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition hillshadeHighlightColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue hillshadeHighlightColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.HillshadeIlluminationAnchorValue hillshadeIlluminationAnchor;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue hillshadeIlluminationDirection;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue hillshadeShadowColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition hillshadeShadowColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue hillshadeShadowColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class IconAnchorValue {\n    ctor public IconAnchorValue(com.mapbox.bindgen.Value value);\n    ctor public IconAnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue BOTTOM;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue BOTTOM_LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue BOTTOM_RIGHT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue CENTER;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue RIGHT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue TOP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue TOP_LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue TOP_RIGHT;\n  }\n\n  public static final class IconAnchorValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class IconPitchAlignmentValue {\n    ctor public IconPitchAlignmentValue(com.mapbox.bindgen.Value value);\n    ctor public IconPitchAlignmentValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconPitchAlignmentValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconPitchAlignmentValue AUTO;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconPitchAlignmentValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconPitchAlignmentValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconPitchAlignmentValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconPitchAlignmentValue VIEWPORT;\n  }\n\n  public static final class IconPitchAlignmentValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class IconRotationAlignmentValue {\n    ctor public IconRotationAlignmentValue(com.mapbox.bindgen.Value value);\n    ctor public IconRotationAlignmentValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconRotationAlignmentValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconRotationAlignmentValue AUTO;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconRotationAlignmentValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconRotationAlignmentValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconRotationAlignmentValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconRotationAlignmentValue VIEWPORT;\n  }\n\n  public static final class IconRotationAlignmentValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class IconTextFitValue {\n    ctor public IconTextFitValue(com.mapbox.bindgen.Value value);\n    ctor public IconTextFitValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue BOTH;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue HEIGHT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue NONE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue WIDTH;\n  }\n\n  public static final class IconTextFitValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class IconTranslateAnchorValue {\n    ctor public IconTranslateAnchorValue(com.mapbox.bindgen.Value value);\n    ctor public IconTranslateAnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconTranslateAnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTranslateAnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTranslateAnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTranslateAnchorValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.IconTranslateAnchorValue VIEWPORT;\n  }\n\n  public static final class IconTranslateAnchorValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class LineCapValue {\n    ctor public LineCapValue(com.mapbox.bindgen.Value value);\n    ctor public LineCapValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue BUTT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue ROUND;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue SQUARE;\n  }\n\n  public static final class LineCapValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class LineElevationReferenceValue {\n    ctor public LineElevationReferenceValue(com.mapbox.bindgen.Value value);\n    ctor public LineElevationReferenceValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue GROUND;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue NONE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue SEA;\n  }\n\n  public static final class LineElevationReferenceValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class LineJoinValue {\n    ctor public LineJoinValue(com.mapbox.bindgen.Value value);\n    ctor public LineJoinValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue BEVEL;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue MITER;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue NONE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue ROUND;\n  }\n\n  public static final class LineJoinValue.Companion {\n  }\n\n  public final class LineLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void LineLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"line\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.LineLayerState lineLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void LineLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"line\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.LineLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class LineLayerState {\n    ctor public LineLayerState();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineBlur();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineBlurTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getLineBorderColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineBorderColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getLineBorderColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineBorderWidth();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineBorderWidthTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue getLineCap();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getLineColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getLineColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineCrossSlope();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineCutoutFadeWidth();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineCutoutFadeWidthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineCutoutOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineCutoutOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getLineDasharray();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineDepthOcclusionFactor();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineDepthOcclusionFactorTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineElevationGroundScale();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineElevationGroundScaleTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue getLineElevationReference();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineGapWidth();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineGapWidthTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getLineGradient();\n    method public com.mapbox.maps.extension.compose.style.StringValue getLineGradientUseTheme();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue getLineJoin();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineMiterLimit();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineOcclusionOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineOcclusionOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineOffset();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineOffsetTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.ImageValue getLinePattern();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLinePatternCrossFade();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineRoundLimit();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineSortKey();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getLineTranslate();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineTranslateAnchorValue getLineTranslateAnchor();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineTranslateTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getLineTrimColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineTrimColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getLineTrimColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleRangeValue getLineTrimFadeRange();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getLineTrimOffset();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineWidth();\n    method public com.mapbox.maps.extension.compose.style.Transition getLineWidthTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineWidthUnitValue getLineWidthUnit();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLineZOffset();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setLineBlur(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineBlurTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineBorderColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setLineBorderColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineBorderColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setLineBorderWidth(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineBorderWidthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineCap(com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue);\n    method public void setLineColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setLineColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setLineCrossSlope(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineCutoutFadeWidth(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineCutoutFadeWidthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineCutoutOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineCutoutOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineDasharray(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setLineDepthOcclusionFactor(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineDepthOcclusionFactorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineElevationGroundScale(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineElevationGroundScaleTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineElevationReference(com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue);\n    method public void setLineEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineGapWidth(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineGapWidthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineGradient(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setLineGradientUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setLineJoin(com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue);\n    method public void setLineMiterLimit(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineOcclusionOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineOcclusionOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineOffset(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineOffsetTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLinePattern(com.mapbox.maps.extension.compose.style.layers.ImageValue);\n    method public void setLinePatternCrossFade(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineRoundLimit(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineSortKey(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineTranslate(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setLineTranslateAnchor(com.mapbox.maps.extension.compose.style.layers.generated.LineTranslateAnchorValue);\n    method public void setLineTranslateTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineTrimColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setLineTrimColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineTrimColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setLineTrimFadeRange(com.mapbox.maps.extension.compose.style.DoubleRangeValue);\n    method public void setLineTrimOffset(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setLineWidth(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLineWidthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLineWidthUnit(com.mapbox.maps.extension.compose.style.layers.generated.LineWidthUnitValue);\n    method public void setLineZOffset(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineBlur;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineBlurTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue lineBorderColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineBorderColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue lineBorderColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineBorderWidth;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineBorderWidthTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.LineCapValue lineCap;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue lineColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue lineColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineCrossSlope;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineCutoutFadeWidth;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineCutoutFadeWidthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineCutoutOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineCutoutOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue lineDasharray;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineDepthOcclusionFactor;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineDepthOcclusionFactorTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineElevationGroundScale;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineElevationGroundScaleTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.LineElevationReferenceValue lineElevationReference;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineGapWidth;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineGapWidthTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue lineGradient;\n    property public final com.mapbox.maps.extension.compose.style.StringValue lineGradientUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.LineJoinValue lineJoin;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineMiterLimit;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineOcclusionOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineOcclusionOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineOffset;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineOffsetTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.ImageValue linePattern;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue linePatternCrossFade;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineRoundLimit;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineSortKey;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue lineTranslate;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.LineTranslateAnchorValue lineTranslateAnchor;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineTranslateTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue lineTrimColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineTrimColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue lineTrimColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleRangeValue lineTrimFadeRange;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue lineTrimOffset;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineWidth;\n    property public final com.mapbox.maps.extension.compose.style.Transition lineWidthTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.LineWidthUnitValue lineWidthUnit;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue lineZOffset;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class LineTranslateAnchorValue {\n    ctor public LineTranslateAnchorValue(com.mapbox.bindgen.Value value);\n    ctor public LineTranslateAnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineTranslateAnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineTranslateAnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineTranslateAnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineTranslateAnchorValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineTranslateAnchorValue VIEWPORT;\n  }\n\n  public static final class LineTranslateAnchorValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.MapboxExperimental public final class LineWidthUnitValue {\n    ctor public LineWidthUnitValue(com.mapbox.bindgen.Value value);\n    ctor public LineWidthUnitValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.LineWidthUnitValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineWidthUnitValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineWidthUnitValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineWidthUnitValue METERS;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.LineWidthUnitValue PIXELS;\n  }\n\n  public static final class LineWidthUnitValue.Companion {\n  }\n\n  public final class LocationIndicatorLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void LocationIndicatorLayer(String layerId = remember({ \n    return generateRandomLayerId(\"location-indicator\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.LocationIndicatorLayerState locationIndicatorLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void LocationIndicatorLayer(String layerId = remember({ \n    return generateRandomLayerId(\"location-indicator\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.LocationIndicatorLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class LocationIndicatorLayerState {\n    ctor public LocationIndicatorLayerState();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getAccuracyRadius();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getAccuracyRadiusBorderColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getAccuracyRadiusBorderColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getAccuracyRadiusBorderColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getAccuracyRadiusColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getAccuracyRadiusColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getAccuracyRadiusColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.Transition getAccuracyRadiusTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getBearing();\n    method public com.mapbox.maps.extension.compose.style.layers.ImageValue getBearingImage();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getBearingImageSize();\n    method public com.mapbox.maps.extension.compose.style.Transition getBearingImageSizeTransition();\n    method public com.mapbox.maps.extension.compose.style.Transition getBearingTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getEmphasisCircleColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getEmphasisCircleColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getEmphasisCircleColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleRangeValue getEmphasisCircleGlowRange();\n    method public com.mapbox.maps.extension.compose.style.Transition getEmphasisCircleGlowRangeTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getEmphasisCircleRadius();\n    method public com.mapbox.maps.extension.compose.style.Transition getEmphasisCircleRadiusTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getImagePitchDisplacement();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getLocation();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getLocationIndicatorOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getLocationIndicatorOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.Transition getLocationTransition();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getPerspectiveCompensation();\n    method public com.mapbox.maps.extension.compose.style.layers.ImageValue getShadowImage();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getShadowImageSize();\n    method public com.mapbox.maps.extension.compose.style.Transition getShadowImageSizeTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.ImageValue getTopImage();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTopImageSize();\n    method public com.mapbox.maps.extension.compose.style.Transition getTopImageSizeTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setAccuracyRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setAccuracyRadiusBorderColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setAccuracyRadiusBorderColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setAccuracyRadiusBorderColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setAccuracyRadiusColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setAccuracyRadiusColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setAccuracyRadiusColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setAccuracyRadiusTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setBearing(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setBearingImage(com.mapbox.maps.extension.compose.style.layers.ImageValue);\n    method public void setBearingImageSize(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setBearingImageSizeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setBearingTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setEmphasisCircleColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setEmphasisCircleColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setEmphasisCircleColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setEmphasisCircleGlowRange(com.mapbox.maps.extension.compose.style.DoubleRangeValue);\n    method public void setEmphasisCircleGlowRangeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setEmphasisCircleRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setEmphasisCircleRadiusTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setImagePitchDisplacement(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLocation(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setLocationIndicatorOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setLocationIndicatorOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setLocationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setPerspectiveCompensation(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setShadowImage(com.mapbox.maps.extension.compose.style.layers.ImageValue);\n    method public void setShadowImageSize(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setShadowImageSizeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setTopImage(com.mapbox.maps.extension.compose.style.layers.ImageValue);\n    method public void setTopImageSize(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTopImageSizeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue accuracyRadius;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue accuracyRadiusBorderColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition accuracyRadiusBorderColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue accuracyRadiusBorderColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue accuracyRadiusColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition accuracyRadiusColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue accuracyRadiusColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.Transition accuracyRadiusTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue bearing;\n    property public final com.mapbox.maps.extension.compose.style.layers.ImageValue bearingImage;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue bearingImageSize;\n    property public final com.mapbox.maps.extension.compose.style.Transition bearingImageSizeTransition;\n    property public final com.mapbox.maps.extension.compose.style.Transition bearingTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue emphasisCircleColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition emphasisCircleColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue emphasisCircleColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleRangeValue emphasisCircleGlowRange;\n    property public final com.mapbox.maps.extension.compose.style.Transition emphasisCircleGlowRangeTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue emphasisCircleRadius;\n    property public final com.mapbox.maps.extension.compose.style.Transition emphasisCircleRadiusTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue imagePitchDisplacement;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue location;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue locationIndicatorOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition locationIndicatorOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.Transition locationTransition;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue perspectiveCompensation;\n    property public final com.mapbox.maps.extension.compose.style.layers.ImageValue shadowImage;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue shadowImageSize;\n    property public final com.mapbox.maps.extension.compose.style.Transition shadowImageSizeTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.ImageValue topImage;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue topImageSize;\n    property public final com.mapbox.maps.extension.compose.style.Transition topImageSizeTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class ModelElevationReferenceValue {\n    ctor public ModelElevationReferenceValue(com.mapbox.bindgen.Value value);\n    ctor public ModelElevationReferenceValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.ModelElevationReferenceValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelElevationReferenceValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelElevationReferenceValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelElevationReferenceValue GROUND;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelElevationReferenceValue HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelElevationReferenceValue SEA;\n  }\n\n  public static final class ModelElevationReferenceValue.Companion {\n  }\n\n  public final class ModelLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void ModelLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"model\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.ModelLayerState modelLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void ModelLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"model\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.ModelLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class ModelLayerState {\n    ctor public ModelLayerState();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getModelAllowDensityReduction();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getModelAmbientOcclusionIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelAmbientOcclusionIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getModelCastShadows();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getModelColor();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getModelColorMixIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelColorMixIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getModelColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getModelCutoffFadeRange();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.ModelElevationReferenceValue getModelElevationReference();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getModelEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getModelHeightBasedEmissiveStrengthMultiplier();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelHeightBasedEmissiveStrengthMultiplierTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.ModelIdValue getModelId();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getModelOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getModelReceiveShadows();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getModelRotation();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelRotationTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getModelRoughness();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelRoughnessTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getModelScale();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.ModelScaleModeValue getModelScaleMode();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelScaleTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getModelTranslation();\n    method public com.mapbox.maps.extension.compose.style.Transition getModelTranslationTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue getModelType();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setModelAllowDensityReduction(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setModelAmbientOcclusionIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setModelAmbientOcclusionIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelCastShadows(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setModelColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setModelColorMixIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setModelColorMixIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setModelCutoffFadeRange(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setModelElevationReference(com.mapbox.maps.extension.compose.style.layers.generated.ModelElevationReferenceValue);\n    method public void setModelEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setModelEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelHeightBasedEmissiveStrengthMultiplier(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setModelHeightBasedEmissiveStrengthMultiplierTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelId(com.mapbox.maps.extension.compose.style.layers.ModelIdValue);\n    method public void setModelOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setModelOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelReceiveShadows(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setModelRotation(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setModelRotationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelRoughness(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setModelRoughnessTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelScale(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setModelScaleMode(com.mapbox.maps.extension.compose.style.layers.generated.ModelScaleModeValue);\n    method public void setModelScaleTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelTranslation(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setModelTranslationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setModelType(com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue modelAllowDensityReduction;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue modelAmbientOcclusionIntensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelAmbientOcclusionIntensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue modelCastShadows;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue modelColor;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue modelColorMixIntensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelColorMixIntensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue modelColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue modelCutoffFadeRange;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.ModelElevationReferenceValue modelElevationReference;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue modelEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue modelHeightBasedEmissiveStrengthMultiplier;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelHeightBasedEmissiveStrengthMultiplierTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.ModelIdValue modelId;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue modelOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue modelReceiveShadows;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue modelRotation;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelRotationTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue modelRoughness;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelRoughnessTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue modelScale;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.ModelScaleModeValue modelScaleMode;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelScaleTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue modelTranslation;\n    property public final com.mapbox.maps.extension.compose.style.Transition modelTranslationTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue modelType;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class ModelScaleModeValue {\n    ctor public ModelScaleModeValue(com.mapbox.bindgen.Value value);\n    ctor public ModelScaleModeValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.ModelScaleModeValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelScaleModeValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelScaleModeValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelScaleModeValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelScaleModeValue VIEWPORT;\n  }\n\n  public static final class ModelScaleModeValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class ModelTypeValue {\n    ctor public ModelTypeValue(com.mapbox.bindgen.Value value);\n    ctor public ModelTypeValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue COMMON_3D;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.ModelTypeValue LOCATION_INDICATOR;\n  }\n\n  public static final class ModelTypeValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class OcclusionOpacityModeValue {\n    ctor public OcclusionOpacityModeValue(com.mapbox.bindgen.Value value);\n    ctor public OcclusionOpacityModeValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.OcclusionOpacityModeValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.OcclusionOpacityModeValue ANCHOR;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.OcclusionOpacityModeValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.OcclusionOpacityModeValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.OcclusionOpacityModeValue PIXEL;\n  }\n\n  public static final class OcclusionOpacityModeValue.Companion {\n  }\n\n  public final class RasterLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void RasterLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"raster\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.RasterLayerState rasterLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void RasterLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"raster\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.RasterLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class RasterLayerState {\n    ctor public RasterLayerState();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.StringValue getRasterArrayBand();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterBrightnessMax();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterBrightnessMaxTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterBrightnessMin();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterBrightnessMinTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getRasterColor();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getRasterColorMix();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterColorMixTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleRangeValue getRasterColorRange();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterColorRangeTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getRasterColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterContrast();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterContrastTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterElevation();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterElevationTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterFadeDuration();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterHueRotate();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterHueRotateTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.RasterResamplingValue getRasterResampling();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterSaturation();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterSaturationTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setRasterArrayBand(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setRasterBrightnessMax(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterBrightnessMaxTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterBrightnessMin(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterBrightnessMinTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setRasterColorMix(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setRasterColorMixTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterColorRange(com.mapbox.maps.extension.compose.style.DoubleRangeValue);\n    method public void setRasterColorRangeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setRasterContrast(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterContrastTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterElevation(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterElevationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterFadeDuration(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterHueRotate(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterHueRotateTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterResampling(com.mapbox.maps.extension.compose.style.layers.generated.RasterResamplingValue);\n    method public void setRasterSaturation(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterSaturationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.StringValue rasterArrayBand;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterBrightnessMax;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterBrightnessMaxTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterBrightnessMin;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterBrightnessMinTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue rasterColor;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue rasterColorMix;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterColorMixTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleRangeValue rasterColorRange;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterColorRangeTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue rasterColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterContrast;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterContrastTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterElevation;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterElevationTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterFadeDuration;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterHueRotate;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterHueRotateTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.RasterResamplingValue rasterResampling;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterSaturation;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterSaturationTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  public final class RasterParticleLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental @com.mapbox.maps.extension.compose.MapboxMapComposable public static void RasterParticleLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"raster-particle\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.RasterParticleLayerState rasterParticleLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void RasterParticleLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"raster-particle\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.RasterParticleLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable @com.mapbox.maps.MapboxExperimental public final class RasterParticleLayerState {\n    ctor public RasterParticleLayerState();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.StringValue getRasterParticleArrayBand();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getRasterParticleColor();\n    method public com.mapbox.maps.extension.compose.style.StringValue getRasterParticleColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.LongValue getRasterParticleCount();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterParticleFadeOpacityFactor();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterParticleFadeOpacityFactorTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterParticleMaxSpeed();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterParticleResetRateFactor();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRasterParticleSpeedFactor();\n    method public com.mapbox.maps.extension.compose.style.Transition getRasterParticleSpeedFactorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setRasterParticleArrayBand(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setRasterParticleColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setRasterParticleColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setRasterParticleCount(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setRasterParticleFadeOpacityFactor(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterParticleFadeOpacityFactorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setRasterParticleMaxSpeed(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterParticleResetRateFactor(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterParticleSpeedFactor(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setRasterParticleSpeedFactorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.StringValue rasterParticleArrayBand;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue rasterParticleColor;\n    property public final com.mapbox.maps.extension.compose.style.StringValue rasterParticleColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.LongValue rasterParticleCount;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterParticleFadeOpacityFactor;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterParticleFadeOpacityFactorTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterParticleMaxSpeed;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterParticleResetRateFactor;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue rasterParticleSpeedFactor;\n    property public final com.mapbox.maps.extension.compose.style.Transition rasterParticleSpeedFactorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class RasterResamplingValue {\n    ctor public RasterResamplingValue(com.mapbox.bindgen.Value value);\n    ctor public RasterResamplingValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.RasterResamplingValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.RasterResamplingValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.RasterResamplingValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.RasterResamplingValue LINEAR;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.RasterResamplingValue NEAREST;\n  }\n\n  public static final class RasterResamplingValue.Companion {\n  }\n\n  public final class SkyLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void SkyLayer(String layerId = remember({ \n    return generateRandomLayerId(\"sky\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.SkyLayerState skyLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void SkyLayer(String layerId = remember({ \n    return generateRandomLayerId(\"sky\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.SkyLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class SkyLayerState {\n    ctor public SkyLayerState();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getSkyAtmosphereColor();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSkyAtmosphereColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getSkyAtmosphereHaloColor();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSkyAtmosphereHaloColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getSkyAtmosphereSun();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getSkyAtmosphereSunIntensity();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getSkyGradient();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getSkyGradientCenter();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getSkyGradientRadius();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSkyGradientUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getSkyOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getSkyOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.SkyTypeValue getSkyType();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setSkyAtmosphereColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setSkyAtmosphereColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setSkyAtmosphereHaloColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setSkyAtmosphereHaloColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setSkyAtmosphereSun(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setSkyAtmosphereSunIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setSkyGradient(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setSkyGradientCenter(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setSkyGradientRadius(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setSkyGradientUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setSkyOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setSkyOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setSkyType(com.mapbox.maps.extension.compose.style.layers.generated.SkyTypeValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue skyAtmosphereColor;\n    property public final com.mapbox.maps.extension.compose.style.StringValue skyAtmosphereColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue skyAtmosphereHaloColor;\n    property public final com.mapbox.maps.extension.compose.style.StringValue skyAtmosphereHaloColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue skyAtmosphereSun;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue skyAtmosphereSunIntensity;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue skyGradient;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue skyGradientCenter;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue skyGradientRadius;\n    property public final com.mapbox.maps.extension.compose.style.StringValue skyGradientUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue skyOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition skyOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.SkyTypeValue skyType;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class SkyTypeValue {\n    ctor public SkyTypeValue(com.mapbox.bindgen.Value value);\n    ctor public SkyTypeValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.SkyTypeValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SkyTypeValue ATMOSPHERE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SkyTypeValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SkyTypeValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SkyTypeValue GRADIENT;\n  }\n\n  public static final class SkyTypeValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable @com.mapbox.maps.MapboxExperimental public final class SymbolElevationReferenceValue {\n    ctor public SymbolElevationReferenceValue(com.mapbox.bindgen.Value value);\n    ctor public SymbolElevationReferenceValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.SymbolElevationReferenceValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolElevationReferenceValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolElevationReferenceValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolElevationReferenceValue GROUND;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolElevationReferenceValue HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolElevationReferenceValue SEA;\n  }\n\n  public static final class SymbolElevationReferenceValue.Companion {\n  }\n\n  public final class SymbolLayerKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static void SymbolLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"symbol\")\n}), com.mapbox.maps.extension.compose.style.layers.generated.SymbolLayerState symbolLayerState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.MapboxMapComposable public static inline void SymbolLayer(com.mapbox.maps.extension.compose.style.sources.SourceState sourceState, String layerId = remember({ \n    return generateRandomLayerId(\"symbol\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.layers.generated.SymbolLayerState,kotlin.Unit> init);\n  }\n\n  @androidx.compose.runtime.Stable public final class SymbolLayerState {\n    ctor public SymbolLayerState();\n    method public com.mapbox.maps.extension.compose.style.layers.Filter getFilter();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getIconAllowOverlap();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue getIconAnchor();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getIconColor();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconColorBrightnessMax();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconColorBrightnessMin();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconColorContrast();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconColorSaturation();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconColorSaturationTransition();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getIconColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconHaloBlur();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconHaloBlurTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getIconHaloColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconHaloColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getIconHaloColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconHaloWidth();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconHaloWidthTransition();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getIconIgnorePlacement();\n    method public com.mapbox.maps.extension.compose.style.layers.ImageValue getIconImage();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconImageCrossFade();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconImageCrossFadeTransition();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getIconKeepUpright();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconOcclusionOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconOcclusionOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getIconOffset();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getIconOptional();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconPadding();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconPitchAlignmentValue getIconPitchAlignment();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconRotate();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconRotationAlignmentValue getIconRotationAlignment();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIconSize();\n    method public com.mapbox.maps.extension.compose.style.DoubleRangeValue getIconSizeScaleRange();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue getIconTextFit();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getIconTextFitPadding();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getIconTranslate();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.IconTranslateAnchorValue getIconTranslateAnchor();\n    method public com.mapbox.maps.extension.compose.style.Transition getIconTranslateTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState getInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.OcclusionOpacityModeValue getOcclusionOpacityMode();\n    method public com.mapbox.maps.extension.compose.style.StringValue getSourceLayer();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getSymbolAvoidEdges();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.SymbolElevationReferenceValue getSymbolElevationReference();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.SymbolPlacementValue getSymbolPlacement();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getSymbolSortKey();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getSymbolSpacing();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getSymbolZElevate();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getSymbolZOffset();\n    method public com.mapbox.maps.extension.compose.style.Transition getSymbolZOffsetTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.SymbolZOrderValue getSymbolZOrder();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getTextAllowOverlap();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue getTextAnchor();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getTextColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getTextColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getTextColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextEmissiveStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getTextEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.FormattedValue getTextField();\n    method public com.mapbox.maps.extension.compose.style.StringListValue getTextFont();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextHaloBlur();\n    method public com.mapbox.maps.extension.compose.style.Transition getTextHaloBlurTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getTextHaloColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getTextHaloColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getTextHaloColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextHaloWidth();\n    method public com.mapbox.maps.extension.compose.style.Transition getTextHaloWidthTransition();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getTextIgnorePlacement();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue getTextJustify();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getTextKeepUpright();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextLetterSpacing();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextLineHeight();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextMaxAngle();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextMaxWidth();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextOcclusionOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getTextOcclusionOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getTextOffset();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getTextOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getTextOptional();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextPadding();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextPitchAlignmentValue getTextPitchAlignment();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextRadialOffset();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextRotate();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextRotationAlignmentValue getTextRotationAlignment();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTextSize();\n    method public com.mapbox.maps.extension.compose.style.DoubleRangeValue getTextSizeScaleRange();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextTransformValue getTextTransform();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getTextTranslate();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextTranslateAnchorValue getTextTranslateAnchor();\n    method public com.mapbox.maps.extension.compose.style.Transition getTextTranslateTransition();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchorListValue getTextVariableAnchor();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextWritingModeListValue getTextWritingMode();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue getVisibility();\n    method public void setFilter(com.mapbox.maps.extension.compose.style.layers.Filter);\n    method public void setIconAllowOverlap(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setIconAnchor(com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue);\n    method public void setIconColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setIconColorBrightnessMax(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconColorBrightnessMin(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconColorContrast(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconColorSaturation(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconColorSaturationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIconColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIconColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setIconEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIconHaloBlur(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconHaloBlurTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIconHaloColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setIconHaloColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIconHaloColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setIconHaloWidth(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconHaloWidthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIconIgnorePlacement(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setIconImage(com.mapbox.maps.extension.compose.style.layers.ImageValue);\n    method public void setIconImageCrossFade(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconImageCrossFadeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIconKeepUpright(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setIconOcclusionOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconOcclusionOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIconOffset(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setIconOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIconOptional(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setIconPadding(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconPitchAlignment(com.mapbox.maps.extension.compose.style.layers.generated.IconPitchAlignmentValue);\n    method public void setIconRotate(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconRotationAlignment(com.mapbox.maps.extension.compose.style.layers.generated.IconRotationAlignmentValue);\n    method public void setIconSize(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIconSizeScaleRange(com.mapbox.maps.extension.compose.style.DoubleRangeValue);\n    method public void setIconTextFit(com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue);\n    method public void setIconTextFitPadding(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setIconTranslate(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setIconTranslateAnchor(com.mapbox.maps.extension.compose.style.layers.generated.IconTranslateAnchorValue);\n    method public void setIconTranslateTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setOcclusionOpacityMode(com.mapbox.maps.extension.compose.style.layers.generated.OcclusionOpacityModeValue);\n    method public void setSourceLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setSymbolAvoidEdges(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setSymbolElevationReference(com.mapbox.maps.extension.compose.style.layers.generated.SymbolElevationReferenceValue);\n    method public void setSymbolPlacement(com.mapbox.maps.extension.compose.style.layers.generated.SymbolPlacementValue);\n    method public void setSymbolSortKey(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setSymbolSpacing(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setSymbolZElevate(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setSymbolZOffset(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setSymbolZOffsetTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setSymbolZOrder(com.mapbox.maps.extension.compose.style.layers.generated.SymbolZOrderValue);\n    method public void setTextAllowOverlap(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setTextAnchor(com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue);\n    method public void setTextColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setTextColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setTextColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setTextEmissiveStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextEmissiveStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setTextField(com.mapbox.maps.extension.compose.style.layers.FormattedValue);\n    method public void setTextFont(com.mapbox.maps.extension.compose.style.StringListValue);\n    method public void setTextHaloBlur(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextHaloBlurTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setTextHaloColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setTextHaloColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setTextHaloColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setTextHaloWidth(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextHaloWidthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setTextIgnorePlacement(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setTextJustify(com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue);\n    method public void setTextKeepUpright(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setTextLetterSpacing(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextLineHeight(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextMaxAngle(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextMaxWidth(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextOcclusionOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextOcclusionOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setTextOffset(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setTextOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setTextOptional(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setTextPadding(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextPitchAlignment(com.mapbox.maps.extension.compose.style.layers.generated.TextPitchAlignmentValue);\n    method public void setTextRadialOffset(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextRotate(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextRotationAlignment(com.mapbox.maps.extension.compose.style.layers.generated.TextRotationAlignmentValue);\n    method public void setTextSize(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTextSizeScaleRange(com.mapbox.maps.extension.compose.style.DoubleRangeValue);\n    method public void setTextTransform(com.mapbox.maps.extension.compose.style.layers.generated.TextTransformValue);\n    method public void setTextTranslate(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setTextTranslateAnchor(com.mapbox.maps.extension.compose.style.layers.generated.TextTranslateAnchorValue);\n    method public void setTextTranslateTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setTextVariableAnchor(com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchorListValue);\n    method public void setTextWritingMode(com.mapbox.maps.extension.compose.style.layers.generated.TextWritingModeListValue);\n    method public void setVisibility(com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue);\n    property public final com.mapbox.maps.extension.compose.style.layers.Filter filter;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue iconAllowOverlap;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.IconAnchorValue iconAnchor;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue iconColor;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconColorBrightnessMax;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconColorBrightnessMin;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconColorContrast;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconColorSaturation;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconColorSaturationTransition;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue iconColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconHaloBlur;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconHaloBlurTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue iconHaloColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconHaloColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue iconHaloColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconHaloWidth;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconHaloWidthTransition;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue iconIgnorePlacement;\n    property public final com.mapbox.maps.extension.compose.style.layers.ImageValue iconImage;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconImageCrossFade;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconImageCrossFadeTransition;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue iconKeepUpright;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconOcclusionOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconOcclusionOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue iconOffset;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue iconOptional;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconPadding;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.IconPitchAlignmentValue iconPitchAlignment;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconRotate;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.IconRotationAlignmentValue iconRotationAlignment;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue iconSize;\n    property public final com.mapbox.maps.extension.compose.style.DoubleRangeValue iconSizeScaleRange;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.IconTextFitValue iconTextFit;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue iconTextFitPadding;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue iconTranslate;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.IconTranslateAnchorValue iconTranslateAnchor;\n    property public final com.mapbox.maps.extension.compose.style.Transition iconTranslateTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState interactionsState;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.OcclusionOpacityModeValue occlusionOpacityMode;\n    property public final com.mapbox.maps.extension.compose.style.StringValue sourceLayer;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue symbolAvoidEdges;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.SymbolElevationReferenceValue symbolElevationReference;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.SymbolPlacementValue symbolPlacement;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue symbolSortKey;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue symbolSpacing;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue symbolZElevate;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue symbolZOffset;\n    property public final com.mapbox.maps.extension.compose.style.Transition symbolZOffsetTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.SymbolZOrderValue symbolZOrder;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue textAllowOverlap;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue textAnchor;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue textColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition textColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue textColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textEmissiveStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition textEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.FormattedValue textField;\n    property public final com.mapbox.maps.extension.compose.style.StringListValue textFont;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textHaloBlur;\n    property public final com.mapbox.maps.extension.compose.style.Transition textHaloBlurTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue textHaloColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition textHaloColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue textHaloColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textHaloWidth;\n    property public final com.mapbox.maps.extension.compose.style.Transition textHaloWidthTransition;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue textIgnorePlacement;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue textJustify;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue textKeepUpright;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textLetterSpacing;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textLineHeight;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textMaxAngle;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textMaxWidth;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textOcclusionOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition textOcclusionOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue textOffset;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textOpacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition textOpacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue textOptional;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textPadding;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.TextPitchAlignmentValue textPitchAlignment;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textRadialOffset;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textRotate;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.TextRotationAlignmentValue textRotationAlignment;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue textSize;\n    property public final com.mapbox.maps.extension.compose.style.DoubleRangeValue textSizeScaleRange;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.TextTransformValue textTransform;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue textTranslate;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.TextTranslateAnchorValue textTranslateAnchor;\n    property public final com.mapbox.maps.extension.compose.style.Transition textTranslateTransition;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchorListValue textVariableAnchor;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.TextWritingModeListValue textWritingMode;\n    property public final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue visibility;\n  }\n\n  @androidx.compose.runtime.Immutable public final class SymbolPlacementValue {\n    ctor public SymbolPlacementValue(com.mapbox.bindgen.Value value);\n    ctor public SymbolPlacementValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.SymbolPlacementValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolPlacementValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolPlacementValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolPlacementValue LINE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolPlacementValue LINE_CENTER;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolPlacementValue POINT;\n  }\n\n  public static final class SymbolPlacementValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class SymbolZOrderValue {\n    ctor public SymbolZOrderValue(com.mapbox.bindgen.Value value);\n    ctor public SymbolZOrderValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.SymbolZOrderValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolZOrderValue AUTO;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolZOrderValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolZOrderValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolZOrderValue SOURCE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.SymbolZOrderValue VIEWPORT_Y;\n  }\n\n  public static final class SymbolZOrderValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextAnchorValue {\n    ctor public TextAnchorValue(com.mapbox.bindgen.Value value);\n    ctor public TextAnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue BOTTOM;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue BOTTOM_LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue BOTTOM_RIGHT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue CENTER;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue RIGHT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue TOP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue TOP_LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextAnchorValue TOP_RIGHT;\n  }\n\n  public static final class TextAnchorValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextJustifyValue {\n    ctor public TextJustifyValue(com.mapbox.bindgen.Value value);\n    ctor public TextJustifyValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue AUTO;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue CENTER;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextJustifyValue RIGHT;\n  }\n\n  public static final class TextJustifyValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextPitchAlignmentValue {\n    ctor public TextPitchAlignmentValue(com.mapbox.bindgen.Value value);\n    ctor public TextPitchAlignmentValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextPitchAlignmentValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextPitchAlignmentValue AUTO;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextPitchAlignmentValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextPitchAlignmentValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextPitchAlignmentValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextPitchAlignmentValue VIEWPORT;\n  }\n\n  public static final class TextPitchAlignmentValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextRotationAlignmentValue {\n    ctor public TextRotationAlignmentValue(com.mapbox.bindgen.Value value);\n    ctor public TextRotationAlignmentValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextRotationAlignmentValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextRotationAlignmentValue AUTO;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextRotationAlignmentValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextRotationAlignmentValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextRotationAlignmentValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextRotationAlignmentValue VIEWPORT;\n  }\n\n  public static final class TextRotationAlignmentValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextTransformValue {\n    ctor public TextTransformValue(com.mapbox.bindgen.Value value);\n    ctor public TextTransformValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextTransformValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextTransformValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextTransformValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextTransformValue LOWERCASE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextTransformValue NONE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextTransformValue UPPERCASE;\n  }\n\n  public static final class TextTransformValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextTranslateAnchorValue {\n    ctor public TextTranslateAnchorValue(com.mapbox.bindgen.Value value);\n    ctor public TextTranslateAnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextTranslateAnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextTranslateAnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextTranslateAnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextTranslateAnchorValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextTranslateAnchorValue VIEWPORT;\n  }\n\n  public static final class TextTranslateAnchorValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextVariableAnchor {\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor BOTTOM;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor BOTTOM_LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor BOTTOM_RIGHT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor CENTER;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor RIGHT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor TOP;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor TOP_LEFT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor TOP_RIGHT;\n  }\n\n  public static final class TextVariableAnchor.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextVariableAnchorListValue {\n    ctor public TextVariableAnchorListValue(com.mapbox.bindgen.Value value);\n    ctor public TextVariableAnchorListValue(java.util.List<com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor> value);\n    ctor public TextVariableAnchorListValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchorListValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchorListValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchorListValue DEFAULT;\n  }\n\n  public static final class TextVariableAnchorListValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextWritingMode {\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextWritingMode copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextWritingMode.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextWritingMode HORIZONTAL;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextWritingMode VERTICAL;\n  }\n\n  public static final class TextWritingMode.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TextWritingModeListValue {\n    ctor public TextWritingModeListValue(com.mapbox.bindgen.Value value);\n    ctor public TextWritingModeListValue(java.util.List<com.mapbox.maps.extension.compose.style.layers.generated.TextWritingMode> value);\n    ctor public TextWritingModeListValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.TextWritingModeListValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextWritingModeListValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.TextWritingModeListValue DEFAULT;\n  }\n\n  public static final class TextWritingModeListValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class VisibilityValue {\n    ctor public VisibilityValue(com.mapbox.bindgen.Value value);\n    ctor public VisibilityValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue NONE;\n    field public static final com.mapbox.maps.extension.compose.style.layers.generated.VisibilityValue VISIBLE;\n  }\n\n  public static final class VisibilityValue.Companion {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.lights {\n\n  public final class LightsState {\n    ctor public LightsState(com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState directionalLightState, com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState ambientLightState);\n    ctor public LightsState(com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState flatLightState);\n    field public static final com.mapbox.maps.extension.compose.style.lights.LightsState.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.lights.LightsState DEFAULT;\n  }\n\n  public static final class LightsState.Companion {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.lights.generated {\n\n  @androidx.compose.runtime.Stable public final class AmbientLightState {\n    ctor public AmbientLightState(String id = generateRandomLightId(\"ambient\"));\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getColorUseTheme();\n    method public String getId();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getIntensityTransition();\n    method public void setColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    property public final com.mapbox.maps.extension.compose.style.ColorValue color;\n    property public final com.mapbox.maps.extension.compose.style.Transition colorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue colorUseTheme;\n    property public final String id;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue intensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition intensityTransition;\n    field public static final com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState.Companion Companion;\n  }\n\n  public static final class AmbientLightState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState,com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState,com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState.Holder> Saver;\n  }\n\n  @kotlinx.parcelize.Parcelize @kotlinx.parcelize.TypeParceler public static final class AmbientLightState.Holder implements android.os.Parcelable {\n    ctor public AmbientLightState.Holder(java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties);\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> component1();\n    method public com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState.Holder copy(java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties);\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> getSavedProperties();\n    property public final java.util.Map<java.lang.String,com.mapbox.bindgen.Value> savedProperties;\n  }\n\n  public final class AmbientLightStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState rememberAmbientLightState(String id = remember({ \n    return generateRandomLightId(\"ambient\")\n}), String? key = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Immutable public final class AnchorValue {\n    ctor public AnchorValue(com.mapbox.bindgen.Value value);\n    ctor public AnchorValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.lights.generated.AnchorValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.lights.generated.AnchorValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.lights.generated.AnchorValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.lights.generated.AnchorValue MAP;\n    field public static final com.mapbox.maps.extension.compose.style.lights.generated.AnchorValue VIEWPORT;\n  }\n\n  public static final class AnchorValue.Companion {\n  }\n\n  @androidx.compose.runtime.Stable public final class DirectionalLightState {\n    ctor public DirectionalLightState(String id = generateRandomLightId(\"directional\"));\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getCastShadows();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getDirection();\n    method public com.mapbox.maps.extension.compose.style.Transition getDirectionTransition();\n    method public String getId();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getShadowDrawBeforeLayer();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getShadowIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getShadowIntensityTransition();\n    method public void setCastShadows(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setDirection(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setDirectionTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setShadowDrawBeforeLayer(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setShadowIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setShadowIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue castShadows;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue color;\n    property public final com.mapbox.maps.extension.compose.style.Transition colorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue colorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue direction;\n    property public final com.mapbox.maps.extension.compose.style.Transition directionTransition;\n    property public final String id;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue intensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition intensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue shadowDrawBeforeLayer;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue shadowIntensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition shadowIntensityTransition;\n    field public static final com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState.Companion Companion;\n  }\n\n  public static final class DirectionalLightState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState,com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState,com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState.Holder> Saver;\n  }\n\n  @kotlinx.parcelize.Parcelize @kotlinx.parcelize.TypeParceler public static final class DirectionalLightState.Holder implements android.os.Parcelable {\n    ctor public DirectionalLightState.Holder(java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties);\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> component1();\n    method public com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState.Holder copy(java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties);\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> getSavedProperties();\n    property public final java.util.Map<java.lang.String,com.mapbox.bindgen.Value> savedProperties;\n  }\n\n  public final class DirectionalLightStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState rememberDirectionalLightState(String id = remember({ \n    return generateRandomLightId(\"directional\")\n}), String? key = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Stable public final class FlatLightState {\n    ctor public FlatLightState(String id = generateRandomLightId(\"flat\"));\n    method public com.mapbox.maps.extension.compose.style.lights.generated.AnchorValue getAnchor();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getColorUseTheme();\n    method public String getId();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getPosition();\n    method public com.mapbox.maps.extension.compose.style.Transition getPositionTransition();\n    method public void setAnchor(com.mapbox.maps.extension.compose.style.lights.generated.AnchorValue);\n    method public void setColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setPosition(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setPositionTransition(com.mapbox.maps.extension.compose.style.Transition);\n    property public final com.mapbox.maps.extension.compose.style.lights.generated.AnchorValue anchor;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue color;\n    property public final com.mapbox.maps.extension.compose.style.Transition colorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue colorUseTheme;\n    property public final String id;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue intensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition intensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue position;\n    property public final com.mapbox.maps.extension.compose.style.Transition positionTransition;\n    field public static final com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState.Companion Companion;\n  }\n\n  public static final class FlatLightState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState,com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState,com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState.Holder> Saver;\n  }\n\n  @kotlinx.parcelize.Parcelize @kotlinx.parcelize.TypeParceler public static final class FlatLightState.Holder implements android.os.Parcelable {\n    ctor public FlatLightState.Holder(java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties);\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> component1();\n    method public com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState.Holder copy(java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties);\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> getSavedProperties();\n    property public final java.util.Map<java.lang.String,com.mapbox.bindgen.Value> savedProperties;\n  }\n\n  public final class FlatLightStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState rememberFlatLightState(String id = remember({ \n    return generateRandomLightId(\"flat\")\n}), String? key = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState,kotlin.Unit> init = {});\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.precipitations {\n\n  public final class RainStateApplierKt {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.precipitations.generated {\n\n  @androidx.compose.runtime.Stable @com.mapbox.maps.MapboxExperimental public final class RainState {\n    ctor public RainState();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getCenterThinning();\n    method public com.mapbox.maps.extension.compose.style.Transition getCenterThinningTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getDensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getDensityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getDirection();\n    method public com.mapbox.maps.extension.compose.style.Transition getDirectionTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getDistortionStrength();\n    method public com.mapbox.maps.extension.compose.style.Transition getDistortionStrengthTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getDropletSize();\n    method public com.mapbox.maps.extension.compose.style.Transition getDropletSizeTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getVignette();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getVignetteColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getVignetteColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getVignetteColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.Transition getVignetteTransition();\n    method public void setCenterThinning(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setCenterThinningTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setDensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setDensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setDirection(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setDirectionTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setDistortionStrength(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setDistortionStrengthTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setDropletSize(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setDropletSizeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setVignette(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setVignetteColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setVignetteColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setVignetteColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVignetteTransition(com.mapbox.maps.extension.compose.style.Transition);\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue centerThinning;\n    property public final com.mapbox.maps.extension.compose.style.Transition centerThinningTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue color;\n    property public final com.mapbox.maps.extension.compose.style.Transition colorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue colorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue density;\n    property public final com.mapbox.maps.extension.compose.style.Transition densityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue direction;\n    property public final com.mapbox.maps.extension.compose.style.Transition directionTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue distortionStrength;\n    property public final com.mapbox.maps.extension.compose.style.Transition distortionStrengthTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue dropletSize;\n    property public final com.mapbox.maps.extension.compose.style.Transition dropletSizeTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue intensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition intensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue opacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition opacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue vignette;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue vignetteColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition vignetteColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue vignetteColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.Transition vignetteTransition;\n    field public static final com.mapbox.maps.extension.compose.style.precipitations.generated.RainState.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.precipitations.generated.RainState DISABLED;\n  }\n\n  public static final class RainState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.precipitations.generated.RainState,com.mapbox.maps.extension.compose.style.precipitations.generated.RainState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.precipitations.generated.RainState,com.mapbox.maps.extension.compose.style.precipitations.generated.RainState.Holder> Saver;\n  }\n\n  @kotlinx.parcelize.Parcelize @kotlinx.parcelize.TypeParceler public static final class RainState.Holder implements android.os.Parcelable {\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> component1();\n    method public boolean component2();\n    method public com.mapbox.maps.extension.compose.style.precipitations.generated.RainState.Holder copy(java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties, boolean enabled);\n    method public boolean getEnabled();\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> getSavedProperties();\n    property public final boolean enabled;\n    property public final java.util.Map<java.lang.String,com.mapbox.bindgen.Value> savedProperties;\n  }\n\n  public final class RainStateKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static inline com.mapbox.maps.extension.compose.style.precipitations.generated.RainState rememberRainState(String? key = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.precipitations.generated.RainState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Stable @com.mapbox.maps.MapboxExperimental public final class SnowState {\n    ctor public SnowState();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getCenterThinning();\n    method public com.mapbox.maps.extension.compose.style.Transition getCenterThinningTransition();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getDensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getDensityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getDirection();\n    method public com.mapbox.maps.extension.compose.style.Transition getDirectionTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getFlakeSize();\n    method public com.mapbox.maps.extension.compose.style.Transition getFlakeSizeTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getIntensity();\n    method public com.mapbox.maps.extension.compose.style.Transition getIntensityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getOpacity();\n    method public com.mapbox.maps.extension.compose.style.Transition getOpacityTransition();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getVignette();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getVignetteColor();\n    method public com.mapbox.maps.extension.compose.style.Transition getVignetteColorTransition();\n    method public com.mapbox.maps.extension.compose.style.StringValue getVignetteColorUseTheme();\n    method public com.mapbox.maps.extension.compose.style.Transition getVignetteTransition();\n    method public void setCenterThinning(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setCenterThinningTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setDensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setDensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setDirection(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setDirectionTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setFlakeSize(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFlakeSizeTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setIntensity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setIntensityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setOpacity(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setOpacityTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setVignette(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setVignetteColor(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setVignetteColorTransition(com.mapbox.maps.extension.compose.style.Transition);\n    method public void setVignetteColorUseTheme(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVignetteTransition(com.mapbox.maps.extension.compose.style.Transition);\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue centerThinning;\n    property public final com.mapbox.maps.extension.compose.style.Transition centerThinningTransition;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue color;\n    property public final com.mapbox.maps.extension.compose.style.Transition colorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue colorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue density;\n    property public final com.mapbox.maps.extension.compose.style.Transition densityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue direction;\n    property public final com.mapbox.maps.extension.compose.style.Transition directionTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue flakeSize;\n    property public final com.mapbox.maps.extension.compose.style.Transition flakeSizeTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue intensity;\n    property public final com.mapbox.maps.extension.compose.style.Transition intensityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue opacity;\n    property public final com.mapbox.maps.extension.compose.style.Transition opacityTransition;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue vignette;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue vignetteColor;\n    property public final com.mapbox.maps.extension.compose.style.Transition vignetteColorTransition;\n    property public final com.mapbox.maps.extension.compose.style.StringValue vignetteColorUseTheme;\n    property public final com.mapbox.maps.extension.compose.style.Transition vignetteTransition;\n    field public static final com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState DISABLED;\n  }\n\n  public static final class SnowState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState,com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState,com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState.Holder> Saver;\n  }\n\n  @kotlinx.parcelize.Parcelize @kotlinx.parcelize.TypeParceler public static final class SnowState.Holder implements android.os.Parcelable {\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> component1();\n    method public boolean component2();\n    method public com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState.Holder copy(java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties, boolean enabled);\n    method public boolean getEnabled();\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> getSavedProperties();\n    property public final boolean enabled;\n    property public final java.util.Map<java.lang.String,com.mapbox.bindgen.Value> savedProperties;\n  }\n\n  public final class SnowStateKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static inline com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState rememberSnowState(String? key = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState,kotlin.Unit> init = {});\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.projection.generated {\n\n  @androidx.compose.runtime.Immutable public final class Projection {\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.projection.generated.Projection copy(com.mapbox.bindgen.Value value);\n    method public String? getProjectionNameOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    property public final String? projectionNameOrNull;\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.projection.generated.Projection.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.projection.generated.Projection DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.projection.generated.Projection GLOBE;\n    field public static final com.mapbox.maps.extension.compose.style.projection.generated.Projection MERCATOR;\n  }\n\n  public static final class Projection.Companion {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.sources {\n\n  @androidx.compose.runtime.Immutable public final class ClusterProperties {\n    ctor public ClusterProperties(com.mapbox.bindgen.Value value);\n    ctor public ClusterProperties(java.util.HashMap<java.lang.String,java.lang.Object> value);\n    ctor public ClusterProperties(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.sources.ClusterProperties copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.sources.ClusterProperties.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.sources.ClusterProperties DEFAULT;\n  }\n\n  public static final class ClusterProperties.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class GeoJSONData {\n    ctor public GeoJSONData(com.mapbox.maps.GeoJSONSourceData data);\n    ctor public GeoJSONData(String value);\n    ctor public GeoJSONData(com.mapbox.geojson.Feature value);\n    ctor public GeoJSONData(java.util.List<com.mapbox.geojson.Feature> value);\n    ctor public GeoJSONData(com.mapbox.geojson.Geometry value);\n    method public com.mapbox.maps.extension.compose.style.sources.GeoJSONData copy(com.mapbox.maps.GeoJSONSourceData data);\n    field public static final com.mapbox.maps.extension.compose.style.sources.GeoJSONData.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.sources.GeoJSONData DEFAULT;\n  }\n\n  public static final class GeoJSONData.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class ModelSourceModelsValue {\n    ctor public ModelSourceModelsValue(com.mapbox.bindgen.Value value);\n    ctor public ModelSourceModelsValue(java.util.HashMap<java.lang.String,com.mapbox.maps.extension.style.sources.generated.ModelSourceModel> value);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.sources.ModelSourceModelsValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.sources.ModelSourceModelsValue.Companion Companion;\n  }\n\n  public static final class ModelSourceModelsValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class PromoteIdValue {\n    ctor public PromoteIdValue(com.mapbox.bindgen.Value value);\n    ctor public PromoteIdValue(String propertyName, String? sourceId = null);\n    ctor public PromoteIdValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression, String? sourceId = null);\n    ctor public PromoteIdValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.sources.PromoteIdValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.sources.PromoteIdValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.sources.PromoteIdValue DEFAULT;\n  }\n\n  public static final class PromoteIdValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class RasterLayers {\n    ctor public RasterLayers(com.mapbox.bindgen.Value value);\n    ctor public RasterLayers(java.util.List<com.mapbox.maps.extension.style.sources.generated.RasterArraySource.RasterDataLayer> value);\n    ctor public RasterLayers(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.sources.RasterLayers copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.sources.RasterLayers.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.sources.RasterLayers DEFAULT;\n  }\n\n  public static final class RasterLayers.Companion {\n  }\n\n  public abstract class SourceState {\n    method protected final com.mapbox.maps.extension.compose.style.sources.GeoJSONData getGeoJSONData();\n    method protected final com.mapbox.bindgen.Value? getProperty(String name);\n    method protected final kotlin.reflect.KFunction<kotlin.Unit> getSetBuilderPropertyAction();\n    method protected final kotlin.reflect.KFunction<kotlin.Unit> getSetPropertyAction();\n    method public final String getSourceId();\n    method protected final void setGeoJSONData(com.mapbox.maps.extension.compose.style.sources.GeoJSONData);\n    property protected final com.mapbox.maps.extension.compose.style.sources.GeoJSONData geoJSONData;\n    property protected final kotlin.reflect.KFunction<kotlin.Unit> setBuilderPropertyAction;\n    property protected final kotlin.reflect.KFunction<kotlin.Unit> setPropertyAction;\n    property public final String sourceId;\n  }\n\n  @kotlinx.parcelize.Parcelize @kotlinx.parcelize.TypeParceler @kotlinx.parcelize.TypeParceler @kotlinx.parcelize.TypeParceler public static final class SourceState.Holder implements android.os.Parcelable {\n    ctor public SourceState.Holder(String sourcedId, java.util.Map<java.lang.String,? extends kotlin.Pair<java.lang.Boolean,? extends com.mapbox.bindgen.Value>> savedProperties, com.mapbox.maps.extension.compose.style.sources.GeoJSONData geoJSONData);\n    method public String component1();\n    method public java.util.Map<java.lang.String,kotlin.Pair<java.lang.Boolean,com.mapbox.bindgen.Value>> component2();\n    method public com.mapbox.maps.extension.compose.style.sources.GeoJSONData component3();\n    method public com.mapbox.maps.extension.compose.style.sources.SourceState.Holder copy(String sourcedId, java.util.Map<java.lang.String,? extends kotlin.Pair<java.lang.Boolean,? extends com.mapbox.bindgen.Value>> savedProperties, com.mapbox.maps.extension.compose.style.sources.GeoJSONData geoJSONData);\n    method public com.mapbox.maps.extension.compose.style.sources.GeoJSONData getGeoJSONData();\n    method public java.util.Map<java.lang.String,kotlin.Pair<java.lang.Boolean,com.mapbox.bindgen.Value>> getSavedProperties();\n    method public String getSourcedId();\n    property public final com.mapbox.maps.extension.compose.style.sources.GeoJSONData geoJSONData;\n    property public final java.util.Map<java.lang.String,kotlin.Pair<java.lang.Boolean,com.mapbox.bindgen.Value>> savedProperties;\n    property public final String sourcedId;\n  }\n\n  public final class SourceStateKt {\n  }\n\n  @androidx.compose.runtime.Immutable public final class TileCacheBudget {\n    ctor public TileCacheBudget(com.mapbox.bindgen.Value value);\n    ctor public TileCacheBudget(com.mapbox.maps.TileCacheBudgetInMegabytes value);\n    ctor public TileCacheBudget(com.mapbox.maps.TileCacheBudgetInTiles value);\n    ctor public TileCacheBudget(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.sources.TileCacheBudget copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.sources.TileCacheBudget.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.sources.TileCacheBudget DEFAULT;\n  }\n\n  public static final class TileCacheBudget.Companion {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.sources.generated {\n\n  @androidx.compose.runtime.Immutable public final class EncodingValue {\n    ctor public EncodingValue(com.mapbox.bindgen.Value value);\n    ctor public EncodingValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.sources.generated.EncodingValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.EncodingValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.EncodingValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.EncodingValue MAPBOX;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.EncodingValue TERRARIUM;\n  }\n\n  public static final class EncodingValue.Companion {\n  }\n\n  @androidx.compose.runtime.Stable public final class GeoJsonSourceState extends com.mapbox.maps.extension.compose.style.sources.SourceState {\n    ctor public GeoJsonSourceState(String sourceId = generateRandomSourceId(\"geojson\"));\n    method public com.mapbox.maps.extension.compose.style.StringValue getAttribution();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getAutoMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getBuffer();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getCluster();\n    method public com.mapbox.maps.extension.compose.style.LongValue getClusterMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getClusterMinPoints();\n    method public com.mapbox.maps.extension.compose.style.sources.ClusterProperties getClusterProperties();\n    method public com.mapbox.maps.extension.compose.style.LongValue getClusterRadius();\n    method public com.mapbox.maps.extension.compose.style.sources.GeoJSONData getData();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getGenerateId();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getLineMetrics();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.compose.style.sources.PromoteIdValue getPromoteId();\n    method public com.mapbox.maps.extension.compose.style.sources.TileCacheBudget getTileCacheBudget();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTolerance();\n    method public void setAttribution(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setAutoMaxZoom(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setBuffer(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setCluster(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setClusterMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setClusterMinPoints(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setClusterProperties(com.mapbox.maps.extension.compose.style.sources.ClusterProperties);\n    method public void setClusterRadius(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setData(com.mapbox.maps.extension.compose.style.sources.GeoJSONData);\n    method public void setGenerateId(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setLineMetrics(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setPrefetchZoomDelta(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setPromoteId(com.mapbox.maps.extension.compose.style.sources.PromoteIdValue);\n    method public void setTileCacheBudget(com.mapbox.maps.extension.compose.style.sources.TileCacheBudget);\n    method public void setTolerance(com.mapbox.maps.extension.compose.style.DoubleValue);\n    property public final com.mapbox.maps.extension.compose.style.StringValue attribution;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue autoMaxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue buffer;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue cluster;\n    property public final com.mapbox.maps.extension.compose.style.LongValue clusterMaxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue clusterMinPoints;\n    property public final com.mapbox.maps.extension.compose.style.sources.ClusterProperties clusterProperties;\n    property public final com.mapbox.maps.extension.compose.style.LongValue clusterRadius;\n    property public final com.mapbox.maps.extension.compose.style.sources.GeoJSONData data;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue generateId;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue lineMetrics;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue prefetchZoomDelta;\n    property public final com.mapbox.maps.extension.compose.style.sources.PromoteIdValue promoteId;\n    property public final com.mapbox.maps.extension.compose.style.sources.TileCacheBudget tileCacheBudget;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue tolerance;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.GeoJsonSourceState.Companion Companion;\n  }\n\n  public static final class GeoJsonSourceState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.GeoJsonSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.GeoJsonSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> Saver;\n  }\n\n  public final class GeoJsonSourceStateKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxDelicateApi public static inline com.mapbox.maps.extension.compose.style.sources.generated.GeoJsonSourceState rememberGeoJsonSourceState(String? key = null, String sourceId = remember({ \n    return generateRandomSourceId(\"geojson\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.sources.generated.GeoJsonSourceState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Stable public final class ImageSourceState extends com.mapbox.maps.extension.compose.style.sources.SourceState {\n    ctor public ImageSourceState(String sourceId = generateRandomSourceId(\"image\"));\n    method public com.mapbox.maps.extension.compose.style.PointListValue getCoordinates();\n    method public com.mapbox.maps.extension.compose.style.LongValue getPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.compose.style.StringValue getUrl();\n    method public void setCoordinates(com.mapbox.maps.extension.compose.style.PointListValue);\n    method public void setPrefetchZoomDelta(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setUrl(com.mapbox.maps.extension.compose.style.StringValue);\n    property public final com.mapbox.maps.extension.compose.style.PointListValue coordinates;\n    property public final com.mapbox.maps.extension.compose.style.LongValue prefetchZoomDelta;\n    property public final com.mapbox.maps.extension.compose.style.StringValue url;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.ImageSourceState.Companion Companion;\n  }\n\n  public static final class ImageSourceState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.ImageSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.ImageSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> Saver;\n  }\n\n  public final class ImageSourceStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.sources.generated.ImageSourceState rememberImageSourceState(String? key = null, String sourceId = remember({ \n    return generateRandomSourceId(\"image\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.sources.generated.ImageSourceState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Stable public final class ModelSourceState extends com.mapbox.maps.extension.compose.style.sources.SourceState {\n    ctor public ModelSourceState(String sourceId = generateRandomSourceId(\"model\"));\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.sources.ModelSourceModelsValue getModels();\n    method public com.mapbox.maps.extension.compose.style.StringListValue getTiles();\n    method public com.mapbox.maps.extension.compose.style.StringValue getUrl();\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setModels(com.mapbox.maps.extension.compose.style.sources.ModelSourceModelsValue);\n    method public void setTiles(com.mapbox.maps.extension.compose.style.StringListValue);\n    method public void setUrl(com.mapbox.maps.extension.compose.style.StringValue);\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.sources.ModelSourceModelsValue models;\n    property public final com.mapbox.maps.extension.compose.style.StringListValue tiles;\n    property public final com.mapbox.maps.extension.compose.style.StringValue url;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.ModelSourceState.Companion Companion;\n  }\n\n  public static final class ModelSourceState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.ModelSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.ModelSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> Saver;\n  }\n\n  public final class ModelSourceStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.sources.generated.ModelSourceState rememberModelSourceState(String? key = null, String sourceId = remember({ \n    return generateRandomSourceId(\"model\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.sources.generated.ModelSourceState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Stable @com.mapbox.maps.MapboxExperimental public final class RasterArraySourceState extends com.mapbox.maps.extension.compose.style.sources.SourceState {\n    ctor public RasterArraySourceState(String sourceId = generateRandomSourceId(\"raster-array\"));\n    method public com.mapbox.maps.extension.compose.style.StringValue getAttribution();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getBounds();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.sources.RasterLayers getRasterLayers();\n    method public com.mapbox.maps.extension.compose.style.sources.TileCacheBudget getTileCacheBudget();\n    method public com.mapbox.maps.extension.compose.style.LongValue getTileSize();\n    method public com.mapbox.maps.extension.compose.style.StringListValue getTiles();\n    method public com.mapbox.maps.extension.compose.style.StringValue getUrl();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getVolatile();\n    method public void setAttribution(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setBounds(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setRasterLayers(com.mapbox.maps.extension.compose.style.sources.RasterLayers);\n    method public void setTileCacheBudget(com.mapbox.maps.extension.compose.style.sources.TileCacheBudget);\n    method public void setTileSize(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setTiles(com.mapbox.maps.extension.compose.style.StringListValue);\n    method public void setUrl(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVolatile(com.mapbox.maps.extension.compose.style.BooleanValue);\n    property public final com.mapbox.maps.extension.compose.style.StringValue attribution;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue bounds;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.sources.RasterLayers rasterLayers;\n    property public final com.mapbox.maps.extension.compose.style.sources.TileCacheBudget tileCacheBudget;\n    property public final com.mapbox.maps.extension.compose.style.LongValue tileSize;\n    property public final com.mapbox.maps.extension.compose.style.StringListValue tiles;\n    property public final com.mapbox.maps.extension.compose.style.StringValue url;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue volatile;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.RasterArraySourceState.Companion Companion;\n  }\n\n  public static final class RasterArraySourceState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.RasterArraySourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.RasterArraySourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> Saver;\n  }\n\n  public final class RasterArraySourceStateKt {\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.MapboxExperimental public static inline com.mapbox.maps.extension.compose.style.sources.generated.RasterArraySourceState rememberRasterArraySourceState(String? key = null, String sourceId = remember({ \n    return generateRandomSourceId(\"raster-array\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.sources.generated.RasterArraySourceState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Stable public final class RasterDemSourceState extends com.mapbox.maps.extension.compose.style.sources.SourceState {\n    ctor public RasterDemSourceState(String sourceId = generateRandomSourceId(\"raster-dem\"));\n    method public com.mapbox.maps.extension.compose.style.StringValue getAttribution();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getBounds();\n    method public com.mapbox.maps.extension.compose.style.sources.generated.EncodingValue getEncoding();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxOverscaleFactorForParentTiles();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getMinimumTileUpdateInterval();\n    method public com.mapbox.maps.extension.compose.style.LongValue getPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.compose.style.sources.TileCacheBudget getTileCacheBudget();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTileNetworkRequestsDelay();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTileRequestsDelay();\n    method public com.mapbox.maps.extension.compose.style.LongValue getTileSize();\n    method public com.mapbox.maps.extension.compose.style.StringListValue getTiles();\n    method public com.mapbox.maps.extension.compose.style.StringValue getUrl();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getVolatile();\n    method public void setAttribution(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setBounds(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setEncoding(com.mapbox.maps.extension.compose.style.sources.generated.EncodingValue);\n    method public void setMaxOverscaleFactorForParentTiles(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinimumTileUpdateInterval(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setPrefetchZoomDelta(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setTileCacheBudget(com.mapbox.maps.extension.compose.style.sources.TileCacheBudget);\n    method public void setTileNetworkRequestsDelay(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTileRequestsDelay(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTileSize(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setTiles(com.mapbox.maps.extension.compose.style.StringListValue);\n    method public void setUrl(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVolatile(com.mapbox.maps.extension.compose.style.BooleanValue);\n    property public final com.mapbox.maps.extension.compose.style.StringValue attribution;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue bounds;\n    property public final com.mapbox.maps.extension.compose.style.sources.generated.EncodingValue encoding;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxOverscaleFactorForParentTiles;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue minimumTileUpdateInterval;\n    property public final com.mapbox.maps.extension.compose.style.LongValue prefetchZoomDelta;\n    property public final com.mapbox.maps.extension.compose.style.sources.TileCacheBudget tileCacheBudget;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue tileNetworkRequestsDelay;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue tileRequestsDelay;\n    property public final com.mapbox.maps.extension.compose.style.LongValue tileSize;\n    property public final com.mapbox.maps.extension.compose.style.StringListValue tiles;\n    property public final com.mapbox.maps.extension.compose.style.StringValue url;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue volatile;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.RasterDemSourceState.Companion Companion;\n  }\n\n  public static final class RasterDemSourceState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.RasterDemSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.RasterDemSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> Saver;\n  }\n\n  public final class RasterDemSourceStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.sources.generated.RasterDemSourceState rememberRasterDemSourceState(String? key = null, String sourceId = remember({ \n    return generateRandomSourceId(\"raster-dem\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.sources.generated.RasterDemSourceState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Stable public final class RasterSourceState extends com.mapbox.maps.extension.compose.style.sources.SourceState {\n    ctor public RasterSourceState(String sourceId = generateRandomSourceId(\"raster\"));\n    method public com.mapbox.maps.extension.compose.style.StringValue getAttribution();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getBounds();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxOverscaleFactorForParentTiles();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getMinimumTileUpdateInterval();\n    method public com.mapbox.maps.extension.compose.style.LongValue getPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue getScheme();\n    method public com.mapbox.maps.extension.compose.style.sources.TileCacheBudget getTileCacheBudget();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTileNetworkRequestsDelay();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTileRequestsDelay();\n    method public com.mapbox.maps.extension.compose.style.LongValue getTileSize();\n    method public com.mapbox.maps.extension.compose.style.StringListValue getTiles();\n    method public com.mapbox.maps.extension.compose.style.StringValue getUrl();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getVolatile();\n    method public void setAttribution(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setBounds(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setMaxOverscaleFactorForParentTiles(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinimumTileUpdateInterval(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setPrefetchZoomDelta(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setScheme(com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue);\n    method public void setTileCacheBudget(com.mapbox.maps.extension.compose.style.sources.TileCacheBudget);\n    method public void setTileNetworkRequestsDelay(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTileRequestsDelay(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTileSize(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setTiles(com.mapbox.maps.extension.compose.style.StringListValue);\n    method public void setUrl(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVolatile(com.mapbox.maps.extension.compose.style.BooleanValue);\n    property public final com.mapbox.maps.extension.compose.style.StringValue attribution;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue bounds;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxOverscaleFactorForParentTiles;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue minimumTileUpdateInterval;\n    property public final com.mapbox.maps.extension.compose.style.LongValue prefetchZoomDelta;\n    property public final com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue scheme;\n    property public final com.mapbox.maps.extension.compose.style.sources.TileCacheBudget tileCacheBudget;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue tileNetworkRequestsDelay;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue tileRequestsDelay;\n    property public final com.mapbox.maps.extension.compose.style.LongValue tileSize;\n    property public final com.mapbox.maps.extension.compose.style.StringListValue tiles;\n    property public final com.mapbox.maps.extension.compose.style.StringValue url;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue volatile;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.RasterSourceState.Companion Companion;\n  }\n\n  public static final class RasterSourceState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.RasterSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.RasterSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> Saver;\n  }\n\n  public final class RasterSourceStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.sources.generated.RasterSourceState rememberRasterSourceState(String? key = null, String sourceId = remember({ \n    return generateRandomSourceId(\"raster\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.sources.generated.RasterSourceState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Immutable public final class SchemeValue {\n    ctor public SchemeValue(com.mapbox.bindgen.Value value);\n    ctor public SchemeValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue copy(com.mapbox.bindgen.Value value);\n    method public com.mapbox.bindgen.Value getValue();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean isNotInitial();\n    property public com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue TMS;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue XYZ;\n  }\n\n  public static final class SchemeValue.Companion {\n  }\n\n  @androidx.compose.runtime.Stable public final class VectorSourceState extends com.mapbox.maps.extension.compose.style.sources.SourceState {\n    ctor public VectorSourceState(String sourceId = generateRandomSourceId(\"vector\"));\n    method public com.mapbox.maps.extension.compose.style.StringValue getAttribution();\n    method public com.mapbox.maps.extension.compose.style.DoubleListValue getBounds();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxOverscaleFactorForParentTiles();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMaxZoom();\n    method public com.mapbox.maps.extension.compose.style.LongValue getMinZoom();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getMinimumTileUpdateInterval();\n    method public com.mapbox.maps.extension.compose.style.LongValue getPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.compose.style.sources.PromoteIdValue getPromoteId();\n    method public com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue getScheme();\n    method public com.mapbox.maps.extension.compose.style.sources.TileCacheBudget getTileCacheBudget();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTileNetworkRequestsDelay();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getTileRequestsDelay();\n    method public com.mapbox.maps.extension.compose.style.StringListValue getTiles();\n    method public com.mapbox.maps.extension.compose.style.StringValue getUrl();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getVolatile();\n    method public void setAttribution(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setBounds(com.mapbox.maps.extension.compose.style.DoubleListValue);\n    method public void setMaxOverscaleFactorForParentTiles(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMaxZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinZoom(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setMinimumTileUpdateInterval(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setPrefetchZoomDelta(com.mapbox.maps.extension.compose.style.LongValue);\n    method public void setPromoteId(com.mapbox.maps.extension.compose.style.sources.PromoteIdValue);\n    method public void setScheme(com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue);\n    method public void setTileCacheBudget(com.mapbox.maps.extension.compose.style.sources.TileCacheBudget);\n    method public void setTileNetworkRequestsDelay(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTileRequestsDelay(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setTiles(com.mapbox.maps.extension.compose.style.StringListValue);\n    method public void setUrl(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setVolatile(com.mapbox.maps.extension.compose.style.BooleanValue);\n    property public final com.mapbox.maps.extension.compose.style.StringValue attribution;\n    property public final com.mapbox.maps.extension.compose.style.DoubleListValue bounds;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxOverscaleFactorForParentTiles;\n    property public final com.mapbox.maps.extension.compose.style.LongValue maxZoom;\n    property public final com.mapbox.maps.extension.compose.style.LongValue minZoom;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue minimumTileUpdateInterval;\n    property public final com.mapbox.maps.extension.compose.style.LongValue prefetchZoomDelta;\n    property public final com.mapbox.maps.extension.compose.style.sources.PromoteIdValue promoteId;\n    property public final com.mapbox.maps.extension.compose.style.sources.generated.SchemeValue scheme;\n    property public final com.mapbox.maps.extension.compose.style.sources.TileCacheBudget tileCacheBudget;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue tileNetworkRequestsDelay;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue tileRequestsDelay;\n    property public final com.mapbox.maps.extension.compose.style.StringListValue tiles;\n    property public final com.mapbox.maps.extension.compose.style.StringValue url;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue volatile;\n    field public static final com.mapbox.maps.extension.compose.style.sources.generated.VectorSourceState.Companion Companion;\n  }\n\n  public static final class VectorSourceState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.VectorSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.sources.generated.VectorSourceState,com.mapbox.maps.extension.compose.style.sources.SourceState.Holder> Saver;\n  }\n\n  public final class VectorSourceStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.sources.generated.VectorSourceState rememberVectorSourceState(String? key = null, String sourceId = remember({ \n    return generateRandomSourceId(\"vector\")\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.sources.generated.VectorSourceState,kotlin.Unit> init = {});\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.standard {\n\n  @androidx.compose.runtime.Immutable public final class BackgroundPointOfInterestLabelsValue {\n    ctor public BackgroundPointOfInterestLabelsValue(com.mapbox.bindgen.Value value);\n    ctor public BackgroundPointOfInterestLabelsValue(String value);\n    ctor public BackgroundPointOfInterestLabelsValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue copy(com.mapbox.bindgen.Value value);\n    method public String? getPresetNameOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    property public final String? presetNameOrNull;\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue CIRCLE;\n    field public static final com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue NONE;\n  }\n\n  public static final class BackgroundPointOfInterestLabelsValue.Companion {\n  }\n\n  @androidx.compose.runtime.Stable public class BaseStandardStyleState {\n    ctor protected BaseStandardStyleState(com.mapbox.maps.extension.compose.style.projection.generated.Projection initialProjection, com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState initialAtmosphereState, com.mapbox.maps.extension.compose.style.precipitations.generated.RainState initialRainState, com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState initialSnowState, com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState initialTerrainState = com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.INITIAL, com.mapbox.maps.extension.compose.style.lights.LightsState initialLightsState = com.mapbox.maps.extension.compose.style.lights.LightsState.INITIAL, com.mapbox.maps.TransitionOptions initialStyleTransition);\n    method public final com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState getAtmosphereState();\n    method public final com.mapbox.maps.extension.compose.style.lights.LightsState getLightsState();\n    method public final com.mapbox.maps.extension.compose.style.projection.generated.Projection getProjection();\n    method public final com.mapbox.maps.extension.compose.style.precipitations.generated.RainState getRainState();\n    method public final com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState getSnowState();\n    method public final com.mapbox.maps.TransitionOptions getStyleTransition();\n    method public final com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState getTerrainState();\n    method public final void setAtmosphereState(com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState);\n    method public final void setLightsState(com.mapbox.maps.extension.compose.style.lights.LightsState);\n    method public final void setProjection(com.mapbox.maps.extension.compose.style.projection.generated.Projection);\n    method public final void setRainState(com.mapbox.maps.extension.compose.style.precipitations.generated.RainState);\n    method public final void setSnowState(com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState);\n    method public final void setStyleTransition(com.mapbox.maps.TransitionOptions);\n    method public final void setTerrainState(com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState);\n    property public final com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState;\n    property public final com.mapbox.maps.extension.compose.style.lights.LightsState lightsState;\n    property public final com.mapbox.maps.extension.compose.style.projection.generated.Projection projection;\n    property public final com.mapbox.maps.extension.compose.style.precipitations.generated.RainState rainState;\n    property public final com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState snowState;\n    property public final com.mapbox.maps.TransitionOptions styleTransition;\n    property public final com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState;\n  }\n\n  @androidx.compose.runtime.Stable public abstract class BaseStyleConfigurationState {\n    ctor protected BaseStyleConfigurationState(com.mapbox.maps.extension.compose.style.BooleanValue initialShowPlaceLabels = com.mapbox.maps.extension.compose.style.BooleanValue.INITIAL, com.mapbox.maps.extension.compose.style.BooleanValue initialShowRoadLabels = com.mapbox.maps.extension.compose.style.BooleanValue.INITIAL, com.mapbox.maps.extension.compose.style.BooleanValue initialShowPointOfInterestLabels = com.mapbox.maps.extension.compose.style.BooleanValue.INITIAL, com.mapbox.maps.extension.compose.style.BooleanValue initialShowTransitLabels = com.mapbox.maps.extension.compose.style.BooleanValue.INITIAL, com.mapbox.maps.extension.compose.style.standard.LightPresetValue initialLightPreset = com.mapbox.maps.extension.compose.style.standard.LightPresetValue.INITIAL, com.mapbox.maps.extension.compose.style.StringValue initialFont = com.mapbox.maps.extension.compose.style.StringValue.INITIAL);\n    method public final com.mapbox.maps.extension.compose.style.StringValue getFont();\n    method public final com.mapbox.maps.extension.compose.style.standard.LightPresetValue getLightPreset();\n    method public final com.mapbox.maps.extension.compose.style.BooleanValue getShowPlaceLabels();\n    method public final com.mapbox.maps.extension.compose.style.BooleanValue getShowPointOfInterestLabels();\n    method public final com.mapbox.maps.extension.compose.style.BooleanValue getShowRoadLabels();\n    method public final com.mapbox.maps.extension.compose.style.BooleanValue getShowTransitLabels();\n    method public final void setFont(com.mapbox.maps.extension.compose.style.StringValue);\n    method public final void setLightPreset(com.mapbox.maps.extension.compose.style.standard.LightPresetValue);\n    method public final void setShowPlaceLabels(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public final void setShowPointOfInterestLabels(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public final void setShowRoadLabels(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public final void setShowTransitLabels(com.mapbox.maps.extension.compose.style.BooleanValue);\n    property public final com.mapbox.maps.extension.compose.style.StringValue font;\n    property public final com.mapbox.maps.extension.compose.style.standard.LightPresetValue lightPreset;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showPlaceLabels;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showPointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showRoadLabels;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showTransitLabels;\n  }\n\n  @androidx.compose.runtime.Immutable public final class ColorModePointOfInterestLabelsValue {\n    ctor public ColorModePointOfInterestLabelsValue(com.mapbox.bindgen.Value value);\n    ctor public ColorModePointOfInterestLabelsValue(String value);\n    ctor public ColorModePointOfInterestLabelsValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue copy(com.mapbox.bindgen.Value value);\n    method public String? getPresetNameOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    property public final String? presetNameOrNull;\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue DEFAULT_COLOR;\n    field public static final com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue SINGLE;\n  }\n\n  public static final class ColorModePointOfInterestLabelsValue.Companion {\n  }\n\n  @androidx.compose.runtime.Immutable public final class LightPresetValue {\n    ctor public LightPresetValue(com.mapbox.bindgen.Value value);\n    ctor public LightPresetValue(String value);\n    ctor public LightPresetValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.standard.LightPresetValue copy(com.mapbox.bindgen.Value value);\n    method public String? getPresetNameOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    property public final String? presetNameOrNull;\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.standard.LightPresetValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.standard.LightPresetValue DAWN;\n    field public static final com.mapbox.maps.extension.compose.style.standard.LightPresetValue DAY;\n    field public static final com.mapbox.maps.extension.compose.style.standard.LightPresetValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.standard.LightPresetValue DUSK;\n    field public static final com.mapbox.maps.extension.compose.style.standard.LightPresetValue NIGHT;\n  }\n\n  public static final class LightPresetValue.Companion {\n  }\n\n  public final class MapboxStandardSatelliteStyleKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapboxStandardSatelliteStyle(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, kotlin.jvm.functions.Function0<kotlin.Unit>? topSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? middleSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? bottomSlot = null, com.mapbox.maps.extension.compose.style.projection.generated.Projection projection = com.mapbox.maps.extension.compose.style.projection.generated.Projection.INITIAL, com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState = com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.INITIAL, com.mapbox.maps.extension.compose.style.lights.LightsState lightsState = com.mapbox.maps.extension.compose.style.lights.LightsState.INITIAL, com.mapbox.maps.TransitionOptions styleTransition = remember({ \n    return transition({ \n    \n    })\n}), com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleConfigurationState standardSatelliteStyleConfigurationState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapboxStandardSatelliteStyle(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, kotlin.jvm.functions.Function0<kotlin.Unit>? topSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? middleSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? bottomSlot = null, com.mapbox.maps.extension.compose.style.projection.generated.Projection projection = com.mapbox.maps.extension.compose.style.projection.generated.Projection.INITIAL, com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState = com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.INITIAL, com.mapbox.maps.extension.compose.style.lights.LightsState lightsState = com.mapbox.maps.extension.compose.style.lights.LightsState.INITIAL, com.mapbox.maps.TransitionOptions styleTransition = remember({ \n    return transition({ \n    \n    })\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleConfigurationState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapboxStandardSatelliteStyle(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, kotlin.jvm.functions.Function0<kotlin.Unit>? topSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? middleSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? bottomSlot = null, com.mapbox.maps.extension.compose.style.projection.generated.Projection projection = com.mapbox.maps.extension.compose.style.projection.generated.Projection.INITIAL, com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState = com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.INITIAL, com.mapbox.maps.extension.compose.style.lights.LightsState lightsState = com.mapbox.maps.extension.compose.style.lights.LightsState.INITIAL, com.mapbox.maps.TransitionOptions styleTransition = remember({ \n    return transition({ \n    \n    })\n}), com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState? styleInteractionsState = null, com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleConfigurationState standardSatelliteStyleConfigurationState = remember({ \n    return <init>()\n}));\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapboxStandardSatelliteStyle(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, kotlin.jvm.functions.Function0<kotlin.Unit>? topSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? middleSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? bottomSlot = null, com.mapbox.maps.extension.compose.style.projection.generated.Projection projection = com.mapbox.maps.extension.compose.style.projection.generated.Projection.INITIAL, com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState = com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.INITIAL, com.mapbox.maps.extension.compose.style.lights.LightsState lightsState = com.mapbox.maps.extension.compose.style.lights.LightsState.INITIAL, com.mapbox.maps.TransitionOptions styleTransition = remember({ \n    return transition({ \n    \n    })\n}), com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState? styleInteractionsState = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleConfigurationState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapboxStandardSatelliteStyle(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, kotlin.jvm.functions.Function0<kotlin.Unit>? topSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? middleSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? bottomSlot = null, com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleState standardSatelliteStyleState = rememberStandardSatelliteStyleState());\n  }\n\n  public final class MapboxStandardStyleKt {\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapboxStandardStyle(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, kotlin.jvm.functions.Function0<kotlin.Unit>? topSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? middleSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? bottomSlot = null, com.mapbox.maps.extension.compose.style.projection.generated.Projection projection = com.mapbox.maps.extension.compose.style.projection.generated.Projection.INITIAL, com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState = com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.INITIAL, com.mapbox.maps.extension.compose.style.lights.LightsState lightsState = com.mapbox.maps.extension.compose.style.lights.LightsState.INITIAL, com.mapbox.maps.TransitionOptions styleTransition = remember({ \n    return transition({ \n    \n    })\n}), com.mapbox.maps.extension.compose.style.standard.StandardStyleConfigurationState standardStyleConfigurationState = remember({ \n    return <init>()\n}));\n    method @Deprecated @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapboxStandardStyle(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, kotlin.jvm.functions.Function0<kotlin.Unit>? topSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? middleSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? bottomSlot = null, com.mapbox.maps.extension.compose.style.projection.generated.Projection projection = com.mapbox.maps.extension.compose.style.projection.generated.Projection.INITIAL, com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState atmosphereState = remember({ \n    return <init>()\n}), com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState terrainState = com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.INITIAL, com.mapbox.maps.extension.compose.style.lights.LightsState lightsState = com.mapbox.maps.extension.compose.style.lights.LightsState.INITIAL, com.mapbox.maps.TransitionOptions styleTransition = remember({ \n    return transition({ \n    \n    })\n}), kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.standard.StandardStyleConfigurationState,kotlin.Unit> init);\n    method @androidx.compose.runtime.Composable @com.mapbox.maps.extension.compose.style.MapboxStyleComposable public static void MapboxStandardStyle(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.imports.StyleImportsScope,kotlin.Unit>? styleImportsContent = null, kotlin.jvm.functions.Function0<kotlin.Unit>? topSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? middleSlot = null, kotlin.jvm.functions.Function0<kotlin.Unit>? bottomSlot = null, com.mapbox.maps.extension.compose.style.standard.StandardStyleState standardStyleState = rememberStandardStyleState());\n  }\n\n  @androidx.compose.runtime.Stable public final class StandardSatelliteStyleConfigurationState extends com.mapbox.maps.extension.compose.style.standard.BaseStyleConfigurationState {\n    ctor public StandardSatelliteStyleConfigurationState();\n    method public com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue getBackgroundPointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorAdminBoundaries();\n    method public com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue getColorModePointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorMotorways();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorPlaceLabelHighlight();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorPlaceLabelSelect();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorPlaceLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorPointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorRoadLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorRoads();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorTrunks();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getDensityPointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.StringValue getFuelingStationModePointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRoadsBrightness();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShowAdminBoundaries();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShowPedestrianRoads();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShowRoadsAndTransit();\n    method public void setBackgroundPointOfInterestLabels(com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue);\n    method public void setColorAdminBoundaries(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorModePointOfInterestLabels(com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue);\n    method public void setColorMotorways(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorPlaceLabelHighlight(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorPlaceLabelSelect(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorPlaceLabels(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorPointOfInterestLabels(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorRoadLabels(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorRoads(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorTrunks(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setDensityPointOfInterestLabels(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFuelingStationModePointOfInterestLabels(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setRoadsBrightness(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setShowAdminBoundaries(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShowPedestrianRoads(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShowRoadsAndTransit(com.mapbox.maps.extension.compose.style.BooleanValue);\n    property public final com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue backgroundPointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorAdminBoundaries;\n    property public final com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue colorModePointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorMotorways;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorPlaceLabelHighlight;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorPlaceLabelSelect;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorPlaceLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorPointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorRoadLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorRoads;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorTrunks;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue densityPointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.StringValue fuelingStationModePointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue roadsBrightness;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showAdminBoundaries;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showPedestrianRoads;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showRoadsAndTransit;\n  }\n\n  @androidx.compose.runtime.Stable public final class StandardSatelliteStyleState extends com.mapbox.maps.extension.compose.style.standard.BaseStandardStyleState {\n    ctor public StandardSatelliteStyleState();\n    method public com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleConfigurationState getConfigurationsState();\n    method public com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState? getInteractionsState();\n    method public void setConfigurationsState(com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleConfigurationState);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState?);\n    property public final com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleConfigurationState configurationsState;\n    property public final com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState? interactionsState;\n  }\n\n  public final class StandardSatelliteStyleStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleState rememberStandardSatelliteStyleState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.standard.StandardSatelliteStyleState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Stable public final class StandardStyleConfigurationState extends com.mapbox.maps.extension.compose.style.standard.BaseStyleConfigurationState {\n    ctor public StandardStyleConfigurationState();\n    method public com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue getBackgroundPointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorAdminBoundaries();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorBuildingHighlight();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorBuildingSelect();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorBuildings();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorCommercial();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorEducation();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorGreenspace();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorIndustrial();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorLand();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorMedical();\n    method public com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue getColorModePointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorMotorways();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorPlaceLabelHighlight();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorPlaceLabelSelect();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorPlaceLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorPointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorRoadLabels();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorRoads();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorTrunks();\n    method public com.mapbox.maps.extension.compose.style.ColorValue getColorWater();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getDensityPointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.StringValue getFuelingStationModePointOfInterestLabels();\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getRoadsBrightness();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShow3dBuildings();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShow3dFacades();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShow3dLandmarks();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShow3dObjects();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShow3dTrees();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShowAdminBoundaries();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShowLandmarkIconLabels();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShowLandmarkIcons();\n    method public com.mapbox.maps.extension.compose.style.BooleanValue getShowPedestrianRoads();\n    method public com.mapbox.maps.extension.compose.style.standard.ThemeValue getTheme();\n    method public com.mapbox.maps.extension.compose.style.StringValue getThemeData();\n    method public void setBackgroundPointOfInterestLabels(com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue);\n    method public void setColorAdminBoundaries(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorBuildingHighlight(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorBuildingSelect(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorBuildings(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorCommercial(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorEducation(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorGreenspace(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorIndustrial(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorLand(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorMedical(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorModePointOfInterestLabels(com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue);\n    method public void setColorMotorways(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorPlaceLabelHighlight(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorPlaceLabelSelect(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorPlaceLabels(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorPointOfInterestLabels(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorRoadLabels(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorRoads(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorTrunks(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setColorWater(com.mapbox.maps.extension.compose.style.ColorValue);\n    method public void setDensityPointOfInterestLabels(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setFuelingStationModePointOfInterestLabels(com.mapbox.maps.extension.compose.style.StringValue);\n    method public void setRoadsBrightness(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setShow3dBuildings(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShow3dFacades(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShow3dLandmarks(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShow3dObjects(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShow3dTrees(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShowAdminBoundaries(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShowLandmarkIconLabels(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShowLandmarkIcons(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setShowPedestrianRoads(com.mapbox.maps.extension.compose.style.BooleanValue);\n    method public void setTheme(com.mapbox.maps.extension.compose.style.standard.ThemeValue);\n    method public void setThemeData(com.mapbox.maps.extension.compose.style.StringValue);\n    property public final com.mapbox.maps.extension.compose.style.standard.BackgroundPointOfInterestLabelsValue backgroundPointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorAdminBoundaries;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorBuildingHighlight;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorBuildingSelect;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorBuildings;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorCommercial;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorEducation;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorGreenspace;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorIndustrial;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorLand;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorMedical;\n    property public final com.mapbox.maps.extension.compose.style.standard.ColorModePointOfInterestLabelsValue colorModePointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorMotorways;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorPlaceLabelHighlight;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorPlaceLabelSelect;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorPlaceLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorPointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorRoadLabels;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorRoads;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorTrunks;\n    property public final com.mapbox.maps.extension.compose.style.ColorValue colorWater;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue densityPointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.StringValue fuelingStationModePointOfInterestLabels;\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue roadsBrightness;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue show3dBuildings;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue show3dFacades;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue show3dLandmarks;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue show3dObjects;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue show3dTrees;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showAdminBoundaries;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showLandmarkIconLabels;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showLandmarkIcons;\n    property public final com.mapbox.maps.extension.compose.style.BooleanValue showPedestrianRoads;\n    property public final com.mapbox.maps.extension.compose.style.standard.ThemeValue theme;\n    property public final com.mapbox.maps.extension.compose.style.StringValue themeData;\n  }\n\n  @androidx.compose.runtime.Stable public final class StandardStyleState extends com.mapbox.maps.extension.compose.style.standard.BaseStandardStyleState {\n    ctor public StandardStyleState();\n    method public com.mapbox.maps.extension.compose.style.standard.StandardStyleConfigurationState getConfigurationsState();\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState getInteractionsState();\n    method public void setConfigurationsState(com.mapbox.maps.extension.compose.style.standard.StandardStyleConfigurationState);\n    method public void setInteractionsState(com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState);\n    property public final com.mapbox.maps.extension.compose.style.standard.StandardStyleConfigurationState configurationsState;\n    property public final com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState interactionsState;\n  }\n\n  public final class StandardStyleStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.standard.StandardStyleState rememberStandardStyleState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.standard.StandardStyleState,kotlin.Unit> init = {});\n  }\n\n  @androidx.compose.runtime.Immutable public final class ThemeValue {\n    ctor public ThemeValue(com.mapbox.bindgen.Value value);\n    ctor public ThemeValue(String value);\n    ctor public ThemeValue(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.bindgen.Value component1();\n    method public com.mapbox.maps.extension.compose.style.standard.ThemeValue copy(com.mapbox.bindgen.Value value);\n    method public String? getPresetNameOrNull();\n    method public com.mapbox.bindgen.Value getValue();\n    property public final String? presetNameOrNull;\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.compose.style.standard.ThemeValue.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.standard.ThemeValue DEFAULT;\n    field public static final com.mapbox.maps.extension.compose.style.standard.ThemeValue FADED;\n    field public static final com.mapbox.maps.extension.compose.style.standard.ThemeValue MONOCHROME;\n  }\n\n  public static final class ThemeValue.Companion {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.standard.generated {\n\n  public final class StandardStyleInteractionsState extends com.mapbox.maps.extension.compose.style.interactions.BasicStyleInteractions {\n    ctor public StandardStyleInteractionsState();\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onBuildingsClicked(String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onBuildingsLongClicked(String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onFeaturesetClicked(String id, String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onFeaturesetLongClicked(String id, String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onLandmarkIconsClicked(String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onLandmarkIconsLongClicked(String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onLayerClicked(String id, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onLayerLongClicked(String id, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onMapClicked(kotlin.jvm.functions.Function2<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onMapLongClicked(kotlin.jvm.functions.Function2<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onPlaceLabelsClicked(String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onPlaceLabelsLongClicked(String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onPoiClicked(String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState onPoiLongClicked(String? importId = null, com.mapbox.maps.extension.style.expressions.generated.Expression? filter = null, Double? radius = null, kotlin.jvm.functions.Function3<? super com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope,? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.terrain {\n\n  public final class TerrainStateApplierKt {\n  }\n\n}\n\npackage com.mapbox.maps.extension.compose.style.terrain.generated {\n\n  @androidx.compose.runtime.Stable public final class TerrainState {\n    ctor public TerrainState(com.mapbox.maps.extension.compose.style.sources.generated.RasterDemSourceState rasterDemSourceState);\n    method public com.mapbox.maps.extension.compose.style.DoubleValue getExaggeration();\n    method public com.mapbox.maps.extension.compose.style.Transition getExaggerationTransition();\n    method public void setExaggeration(com.mapbox.maps.extension.compose.style.DoubleValue);\n    method public void setExaggerationTransition(com.mapbox.maps.extension.compose.style.Transition);\n    property public final com.mapbox.maps.extension.compose.style.DoubleValue exaggeration;\n    property public final com.mapbox.maps.extension.compose.style.Transition exaggerationTransition;\n    field public static final com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.Companion Companion;\n    field public static final com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState DISABLED;\n  }\n\n  public static final class TerrainState.Companion {\n    method public androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState,com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.Holder> getSaver();\n    property public final androidx.compose.runtime.saveable.Saver<com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState,com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.Holder> Saver;\n  }\n\n  @kotlinx.parcelize.Parcelize @kotlinx.parcelize.TypeParceler public static final class TerrainState.Holder implements android.os.Parcelable {\n    method public com.mapbox.maps.extension.compose.style.sources.SourceState.Holder? component1();\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> component2();\n    method public boolean component3();\n    method public com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState.Holder copy(com.mapbox.maps.extension.compose.style.sources.SourceState.Holder? rasterDemSourceStateHolder, java.util.Map<java.lang.String,? extends com.mapbox.bindgen.Value> savedProperties, boolean initial);\n    method public boolean getInitial();\n    method public com.mapbox.maps.extension.compose.style.sources.SourceState.Holder? getRasterDemSourceStateHolder();\n    method public java.util.Map<java.lang.String,com.mapbox.bindgen.Value> getSavedProperties();\n    property public final boolean initial;\n    property public final com.mapbox.maps.extension.compose.style.sources.SourceState.Holder? rasterDemSourceStateHolder;\n    property public final java.util.Map<java.lang.String,com.mapbox.bindgen.Value> savedProperties;\n  }\n\n  public final class TerrainStateKt {\n    method @androidx.compose.runtime.Composable public static inline com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState rememberTerrainState(com.mapbox.maps.extension.compose.style.sources.generated.RasterDemSourceState rasterDemSourceState, String? key = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState,kotlin.Unit> init = {});\n  }\n\n}\n\n"
  },
  {
    "path": "extension-compose/api/extension-compose.api",
    "content": "public final class com/mapbox/maps/extension/compose/BuildConfig {\n\tpublic static final field BUILD_TYPE Ljava/lang/String;\n\tpublic static final field DEBUG Z\n\tpublic static final field LIBRARY_PACKAGE_NAME Ljava/lang/String;\n\tpublic fun <init> ()V\n}\n\npublic final class com/mapbox/maps/extension/compose/ComposableSingletons$MapboxMapKt {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/extension/compose/ComposableSingletons$MapboxMapKt;\n\tpublic static field lambda-1 Lkotlin/jvm/functions/Function3;\n\tpublic static field lambda-2 Lkotlin/jvm/functions/Function3;\n\tpublic static field lambda-3 Lkotlin/jvm/functions/Function3;\n\tpublic static field lambda-4 Lkotlin/jvm/functions/Function3;\n\tpublic static field lambda-5 Lkotlin/jvm/functions/Function2;\n\tpublic fun <init> ()V\n\tpublic final fun getLambda-1$extension_compose_release ()Lkotlin/jvm/functions/Function3;\n\tpublic final fun getLambda-2$extension_compose_release ()Lkotlin/jvm/functions/Function3;\n\tpublic final fun getLambda-3$extension_compose_release ()Lkotlin/jvm/functions/Function3;\n\tpublic final fun getLambda-4$extension_compose_release ()Lkotlin/jvm/functions/Function3;\n\tpublic final fun getLambda-5$extension_compose_release ()Lkotlin/jvm/functions/Function2;\n}\n\npublic final class com/mapbox/maps/extension/compose/ComposeMapInitOptions {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/ComposeMapInitOptions$Companion;\n\tpublic static final field DEFAULT_ANTIALIASING_SAMPLE_COUNT I\n\tpublic fun <init> (FZILjava/lang/String;)V\n\tpublic synthetic fun <init> (FZILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Lcom/mapbox/maps/MapOptions;ZILjava/lang/String;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/MapOptions;ZILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Lcom/mapbox/maps/MapOptions;\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()I\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun copy (Lcom/mapbox/maps/MapOptions;ZILjava/lang/String;)Lcom/mapbox/maps/extension/compose/ComposeMapInitOptions;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/ComposeMapInitOptions;Lcom/mapbox/maps/MapOptions;ZILjava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/ComposeMapInitOptions;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAntialiasingSampleCount ()I\n\tpublic final fun getMapName ()Ljava/lang/String;\n\tpublic final fun getMapOptions ()Lcom/mapbox/maps/MapOptions;\n\tpublic final fun getTextureView ()Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/ComposeMapInitOptions$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/DisposableMapEffectKt {\n\tpublic static final fun DisposableMapEffect (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun DisposableMapEffect (Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun DisposableMapEffect (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun DisposableMapEffect ([Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/MapEffectKt {\n\tpublic static final fun MapEffect (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun MapEffect (Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun MapEffect (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun MapEffect ([Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/MapState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/MapState$Companion;\n\tpublic fun <init> ()V\n\tpublic final fun genericEvents (Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getCameraChangedCoalescedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getCameraChangedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun getGesturesSettings ()Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;\n\tpublic final fun getMapIdleEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getMapLoadedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getMapLoadingErrorEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getRenderFrameFinishedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getRenderFrameStartedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getResourceRequestEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getSourceAddedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getSourceDataLoadedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getSourceRemovedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getStyleDataLoadedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getStyleImageMissingEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getStyleImageRemoveUnusedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun getStyleLoadedEvents ()Lkotlinx/coroutines/flow/Flow;\n\tpublic final fun pixelForCoordinate (Lcom/mapbox/geojson/Point;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun queryRenderedFeatures (Lcom/mapbox/maps/RenderedQueryGeometry;Lcom/mapbox/maps/RenderedQueryOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun queryRenderedFeatures (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/RenderedQueryGeometry;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun queryRenderedFeatures (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/RenderedQueryGeometry;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun queryRenderedFeatures (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun queryRenderedFeatures$default (Lcom/mapbox/maps/extension/compose/MapState;Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/RenderedQueryGeometry;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun queryRenderedRasterValues (Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/RenderedRasterQueryOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun removeFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureStateKey;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun removeFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun removeFeatureState$default (Lcom/mapbox/maps/extension/compose/MapState;Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureStateKey;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun resetFeatureStates (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun setFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureState;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun setGesturesSettings (Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/MapState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/MapState$Holder : android/os/Parcelable {\n\tpublic static final field $stable I\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic fun <init> (Ljava/util/Map;)V\n\tpublic final fun component1 ()Ljava/util/Map;\n\tpublic final fun copy (Ljava/util/Map;)Lcom/mapbox/maps/extension/compose/MapState$Holder;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/MapState$Holder;Ljava/util/Map;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/MapState$Holder;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getSavedProperties ()Ljava/util/Map;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/MapState$Holder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/MapState$Holder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/MapState$Holder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/MapStateKt {\n\tpublic static final fun rememberMapState (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/MapState;\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/compose/MapboxMapComposable : java/lang/annotation/Annotation {\n}\n\npublic final class com/mapbox/maps/extension/compose/MapboxMapKt {\n\tpublic static final fun MapboxMap (Landroidx/compose/ui/Modifier;Lcom/mapbox/maps/extension/compose/ComposeMapInitOptions;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lcom/mapbox/maps/extension/compose/animation/viewport/MapViewportState;Lcom/mapbox/maps/extension/compose/MapState;Lcom/mapbox/maps/plugin/gestures/OnMapClickListener;Lcom/mapbox/maps/plugin/gestures/OnMapLongClickListener;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;III)V\n}\n\npublic final class com/mapbox/maps/extension/compose/MapboxMapScope {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/extension/compose/MapboxMapScope;\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/compose/MapboxMapScopeMarker : java/lang/annotation/Annotation {\n}\n\npublic final class com/mapbox/maps/extension/compose/animation/viewport/MapViewportState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/animation/viewport/MapViewportState$Companion;\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lcom/mapbox/maps/CameraState;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/CameraState;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun cameraForCoordinates$default (Lcom/mapbox/maps/extension/compose/animation/viewport/MapViewportState;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun easeTo (Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Lcom/mapbox/maps/plugin/viewport/CompletionListener;)V\n\tpublic static synthetic fun easeTo$default (Lcom/mapbox/maps/extension/compose/animation/viewport/MapViewportState;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Lcom/mapbox/maps/plugin/viewport/CompletionListener;ILjava/lang/Object;)V\n\tpublic final fun flyTo (Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Lcom/mapbox/maps/plugin/viewport/CompletionListener;)V\n\tpublic static synthetic fun flyTo$default (Lcom/mapbox/maps/extension/compose/animation/viewport/MapViewportState;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Lcom/mapbox/maps/plugin/viewport/CompletionListener;ILjava/lang/Object;)V\n\tpublic final fun getCameraState ()Lcom/mapbox/maps/CameraState;\n\tpublic final fun getMapViewportStatus ()Lcom/mapbox/maps/plugin/viewport/ViewportStatus;\n\tpublic final fun getMapViewportStatusChangedReason ()Lcom/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason;\n\tpublic final fun getStyleDefaultCameraOptions ()Lcom/mapbox/maps/CameraOptions;\n\tpublic final fun idle ()V\n\tpublic final fun setCameraOptions (Lcom/mapbox/maps/CameraOptions;)V\n\tpublic final fun setCameraOptions (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun transitionToFollowPuckState (Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions;Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions;Lcom/mapbox/maps/plugin/viewport/CompletionListener;)V\n\tpublic static synthetic fun transitionToFollowPuckState$default (Lcom/mapbox/maps/extension/compose/animation/viewport/MapViewportState;Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions;Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions;Lcom/mapbox/maps/plugin/viewport/CompletionListener;ILjava/lang/Object;)V\n\tpublic final fun transitionToOverviewState (Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions;Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions;Lcom/mapbox/maps/plugin/viewport/CompletionListener;)V\n\tpublic static synthetic fun transitionToOverviewState$default (Lcom/mapbox/maps/extension/compose/animation/viewport/MapViewportState;Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions;Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions;Lcom/mapbox/maps/plugin/viewport/CompletionListener;ILjava/lang/Object;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/animation/viewport/MapViewportState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/animation/viewport/MapViewportStateKt {\n\tpublic static final fun rememberMapViewportState (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/animation/viewport/MapViewportState;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/IconImage : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic fun <init> (Landroid/graphics/Bitmap;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Landroid/graphics/Bitmap;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/IconImage$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/annotation/IconImage;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/annotation/IconImage;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/IconImageKt {\n\tpublic static final fun rememberIconImage (ILandroidx/compose/runtime/Composer;I)Lcom/mapbox/maps/extension/compose/annotation/IconImage;\n\tpublic static final fun rememberIconImage (Ljava/lang/Object;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/runtime/Composer;I)Lcom/mapbox/maps/extension/compose/annotation/IconImage;\n}\n\npublic abstract class com/mapbox/maps/extension/compose/annotation/MarkerAnimationEffect {\n\tpublic static final field $stable I\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/annotation/MarkerAnimationEffect$Companion;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/MarkerAnimationEffect$Companion {\n\tpublic final fun fade (FF)Lcom/mapbox/maps/extension/compose/annotation/MarkerAnimationEffect;\n\tpublic final fun getFadeIn ()Lcom/mapbox/maps/extension/compose/annotation/MarkerAnimationEffect;\n\tpublic final fun getFadeOut ()Lcom/mapbox/maps/extension/compose/annotation/MarkerAnimationEffect;\n\tpublic final fun getScale ()Lcom/mapbox/maps/extension/compose/annotation/MarkerAnimationEffect;\n\tpublic final fun getWiggle ()Lcom/mapbox/maps/extension/compose/annotation/MarkerAnimationEffect;\n\tpublic final fun scale (FF)Lcom/mapbox/maps/extension/compose/annotation/MarkerAnimationEffect;\n}\n\npublic abstract class com/mapbox/maps/extension/compose/annotation/MarkerAnimationTrigger {\n\tpublic static final field $stable I\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/MarkerAnimationTrigger$Appear : com/mapbox/maps/extension/compose/annotation/MarkerAnimationTrigger {\n\tpublic static final field $stable I\n\tpublic static final field INSTANCE Lcom/mapbox/maps/extension/compose/annotation/MarkerAnimationTrigger$Appear;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/MarkerAnimationTrigger$Disappear : com/mapbox/maps/extension/compose/annotation/MarkerAnimationTrigger {\n\tpublic static final field $stable I\n\tpublic static final field INSTANCE Lcom/mapbox/maps/extension/compose/annotation/MarkerAnimationTrigger$Disappear;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/MarkerKt {\n\tpublic static final fun Marker-02sZxzM (Lcom/mapbox/geojson/Point;JJLandroidx/compose/ui/graphics/Color;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/ViewAnnotationKt {\n\tpublic static final fun ViewAnnotation (Lcom/mapbox/maps/ViewAnnotationOptions;Landroidx/compose/ui/Modifier;Lcom/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState {\n\tpublic fun <init> ()V\n\tpublic final fun isDraggable ()Z\n\tpublic final fun onClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;\n\tpublic final fun onClusterClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;\n\tpublic final fun onClusterLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;\n\tpublic final fun onDragFinished (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;\n\tpublic final fun onDragStarted (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;\n\tpublic final fun onDragged (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;\n\tpublic final fun onLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;\n\tpublic final fun setDraggable (Z)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsStateKt {\n\tpublic static final fun rememberCircleAnnotationGroupInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupKt {\n\tpublic static final fun CircleAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun CircleAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun CircleAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun CircleAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupState {\n\tpublic fun <init> ()V\n\tpublic final fun getCircleBlur ()Ljava/lang/Double;\n\tpublic final fun getCircleColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getCircleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;\n\tpublic final fun getCircleEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getCircleOpacity ()Ljava/lang/Double;\n\tpublic final fun getCirclePitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;\n\tpublic final fun getCirclePitchScale ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;\n\tpublic final fun getCircleRadius ()Ljava/lang/Double;\n\tpublic final fun getCircleSortKey ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getCircleStrokeColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeWidth ()Ljava/lang/Double;\n\tpublic final fun getCircleTranslate ()Ljava/util/List;\n\tpublic final fun getCircleTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;\n\tpublic final fun getMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun setCircleBlur (Ljava/lang/Double;)V\n\tpublic final fun setCircleColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setCircleColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;)V\n\tpublic final fun setCircleEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setCircleOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCirclePitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;)V\n\tpublic final fun setCirclePitchScale (Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;)V\n\tpublic final fun setCircleRadius (Ljava/lang/Double;)V\n\tpublic final fun setCircleSortKey (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setCircleStrokeColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleStrokeOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeWidth (Ljava/lang/Double;)V\n\tpublic final fun setCircleTranslate (Ljava/util/List;)V\n\tpublic final fun setCircleTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState;)V\n\tpublic final fun setMaxZoom (Ljava/lang/Double;)V\n\tpublic final fun setMinZoom (Ljava/lang/Double;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState {\n\tpublic fun <init> ()V\n\tpublic final fun isDraggable ()Z\n\tpublic final fun onClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState;\n\tpublic final fun onDragFinished (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState;\n\tpublic final fun onDragStarted (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState;\n\tpublic final fun onDragged (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState;\n\tpublic final fun onLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState;\n\tpublic final fun setDraggable (Z)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsStateKt {\n\tpublic static final fun rememberCircleAnnotationInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationKt {\n\tpublic static final fun CircleAnnotation (Lcom/mapbox/geojson/Point;Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun CircleAnnotation (Lcom/mapbox/geojson/Point;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun CircleAnnotation (Lcom/mapbox/geojson/Point;Lkotlin/jvm/functions/Function1;Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun CircleAnnotation (Lcom/mapbox/geojson/Point;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationOptionsExtKt {\n\tpublic static final fun withCircleColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic static final fun withCircleStrokeColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationState {\n\tpublic fun <init> ()V\n\tpublic final fun getCircleBlur ()Ljava/lang/Double;\n\tpublic final fun getCircleColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getCircleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleRadius ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getCircleStrokeColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeWidth ()Ljava/lang/Double;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState;\n\tpublic final fun setCircleBlur (Ljava/lang/Double;)V\n\tpublic final fun setCircleColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setCircleColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCircleRadius (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setCircleStrokeColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleStrokeOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeWidth (Ljava/lang/Double;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState {\n\tpublic fun <init> ()V\n\tpublic final fun isDraggable ()Z\n\tpublic final fun onClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;\n\tpublic final fun onClusterClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;\n\tpublic final fun onClusterLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;\n\tpublic final fun onDragFinished (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;\n\tpublic final fun onDragStarted (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;\n\tpublic final fun onDragged (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;\n\tpublic final fun onLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;\n\tpublic final fun setDraggable (Z)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsStateKt {\n\tpublic static final fun rememberPointAnnotationGroupInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupKt {\n\tpublic static final fun PointAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PointAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PointAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PointAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupState {\n\tpublic fun <init> ()V\n\tpublic final fun getIconAllowOverlap ()Ljava/lang/Boolean;\n\tpublic final fun getIconAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic final fun getIconColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getIconColorBrightnessMax ()Ljava/lang/Double;\n\tpublic final fun getIconColorBrightnessMin ()Ljava/lang/Double;\n\tpublic final fun getIconColorContrast ()Ljava/lang/Double;\n\tpublic final fun getIconColorSaturation ()Ljava/lang/Double;\n\tpublic final fun getIconColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getIconHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getIconHaloColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getIconHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getIconIgnorePlacement ()Ljava/lang/Boolean;\n\tpublic final fun getIconImage ()Lcom/mapbox/maps/extension/compose/annotation/IconImage;\n\tpublic final fun getIconImageCrossFade ()Ljava/lang/Double;\n\tpublic final fun getIconKeepUpright ()Ljava/lang/Boolean;\n\tpublic final fun getIconOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconOffset ()Ljava/util/List;\n\tpublic final fun getIconOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconOptional ()Ljava/lang/Boolean;\n\tpublic final fun getIconPadding ()Ljava/lang/Double;\n\tpublic final fun getIconPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;\n\tpublic final fun getIconRotate ()Ljava/lang/Double;\n\tpublic final fun getIconRotationAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;\n\tpublic final fun getIconSize ()Ljava/lang/Double;\n\tpublic final fun getIconSizeScaleRange ()Ljava/util/List;\n\tpublic final fun getIconTextFit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic final fun getIconTextFitPadding ()Ljava/util/List;\n\tpublic final fun getIconTranslate ()Ljava/util/List;\n\tpublic final fun getIconTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;\n\tpublic final fun getMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getOcclusionOpacityMode ()Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;\n\tpublic final fun getSymbolAvoidEdges ()Ljava/lang/Boolean;\n\tpublic final fun getSymbolElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;\n\tpublic final fun getSymbolPlacement ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;\n\tpublic final fun getSymbolSortKey ()Ljava/lang/Double;\n\tpublic final fun getSymbolSpacing ()Ljava/lang/Double;\n\tpublic final fun getSymbolZElevate ()Ljava/lang/Boolean;\n\tpublic final fun getSymbolZOffset ()Ljava/lang/Double;\n\tpublic final fun getSymbolZOrder ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;\n\tpublic final fun getTextAllowOverlap ()Ljava/lang/Boolean;\n\tpublic final fun getTextAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic final fun getTextColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getTextColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getTextField ()Ljava/lang/String;\n\tpublic final fun getTextFont ()Ljava/util/List;\n\tpublic final fun getTextHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getTextHaloColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getTextHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getTextIgnorePlacement ()Ljava/lang/Boolean;\n\tpublic final fun getTextJustify ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic final fun getTextKeepUpright ()Ljava/lang/Boolean;\n\tpublic final fun getTextLetterSpacing ()Ljava/lang/Double;\n\tpublic final fun getTextLineHeight ()Ljava/lang/Double;\n\tpublic final fun getTextMaxAngle ()Ljava/lang/Double;\n\tpublic final fun getTextMaxWidth ()Ljava/lang/Double;\n\tpublic final fun getTextOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextOffset ()Ljava/util/List;\n\tpublic final fun getTextOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextOptional ()Ljava/lang/Boolean;\n\tpublic final fun getTextPadding ()Ljava/lang/Double;\n\tpublic final fun getTextPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;\n\tpublic final fun getTextRadialOffset ()Ljava/lang/Double;\n\tpublic final fun getTextRotate ()Ljava/lang/Double;\n\tpublic final fun getTextRotationAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;\n\tpublic final fun getTextSize ()Ljava/lang/Double;\n\tpublic final fun getTextSizeScaleRange ()Ljava/util/List;\n\tpublic final fun getTextTransform ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic final fun getTextTranslate ()Ljava/util/List;\n\tpublic final fun getTextTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;\n\tpublic final fun getTextVariableAnchor ()Ljava/util/List;\n\tpublic final fun getTextWritingMode ()Ljava/util/List;\n\tpublic final fun setIconAllowOverlap (Ljava/lang/Boolean;)V\n\tpublic final fun setIconAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;)V\n\tpublic final fun setIconColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setIconColorBrightnessMax (Ljava/lang/Double;)V\n\tpublic final fun setIconColorBrightnessMin (Ljava/lang/Double;)V\n\tpublic final fun setIconColorContrast (Ljava/lang/Double;)V\n\tpublic final fun setIconColorSaturation (Ljava/lang/Double;)V\n\tpublic final fun setIconColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setIconHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setIconIgnorePlacement (Ljava/lang/Boolean;)V\n\tpublic final fun setIconImage (Lcom/mapbox/maps/extension/compose/annotation/IconImage;)V\n\tpublic final fun setIconImageCrossFade (Ljava/lang/Double;)V\n\tpublic final fun setIconKeepUpright (Ljava/lang/Boolean;)V\n\tpublic final fun setIconOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconOffset (Ljava/util/List;)V\n\tpublic final fun setIconOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconOptional (Ljava/lang/Boolean;)V\n\tpublic final fun setIconPadding (Ljava/lang/Double;)V\n\tpublic final fun setIconPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;)V\n\tpublic final fun setIconRotate (Ljava/lang/Double;)V\n\tpublic final fun setIconRotationAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;)V\n\tpublic final fun setIconSize (Ljava/lang/Double;)V\n\tpublic final fun setIconSizeScaleRange (Ljava/util/List;)V\n\tpublic final fun setIconTextFit (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;)V\n\tpublic final fun setIconTextFitPadding (Ljava/util/List;)V\n\tpublic final fun setIconTranslate (Ljava/util/List;)V\n\tpublic final fun setIconTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState;)V\n\tpublic final fun setMaxZoom (Ljava/lang/Double;)V\n\tpublic final fun setMinZoom (Ljava/lang/Double;)V\n\tpublic final fun setOcclusionOpacityMode (Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;)V\n\tpublic final fun setSymbolAvoidEdges (Ljava/lang/Boolean;)V\n\tpublic final fun setSymbolElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;)V\n\tpublic final fun setSymbolPlacement (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;)V\n\tpublic final fun setSymbolSortKey (Ljava/lang/Double;)V\n\tpublic final fun setSymbolSpacing (Ljava/lang/Double;)V\n\tpublic final fun setSymbolZElevate (Ljava/lang/Boolean;)V\n\tpublic final fun setSymbolZOffset (Ljava/lang/Double;)V\n\tpublic final fun setSymbolZOrder (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;)V\n\tpublic final fun setTextAllowOverlap (Ljava/lang/Boolean;)V\n\tpublic final fun setTextAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;)V\n\tpublic final fun setTextColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setTextColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setTextField (Ljava/lang/String;)V\n\tpublic final fun setTextFont (Ljava/util/List;)V\n\tpublic final fun setTextHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setTextHaloColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setTextHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextIgnorePlacement (Ljava/lang/Boolean;)V\n\tpublic final fun setTextJustify (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;)V\n\tpublic final fun setTextKeepUpright (Ljava/lang/Boolean;)V\n\tpublic final fun setTextLetterSpacing (Ljava/lang/Double;)V\n\tpublic final fun setTextLineHeight (Ljava/lang/Double;)V\n\tpublic final fun setTextMaxAngle (Ljava/lang/Double;)V\n\tpublic final fun setTextMaxWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextOffset (Ljava/util/List;)V\n\tpublic final fun setTextOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextOptional (Ljava/lang/Boolean;)V\n\tpublic final fun setTextPadding (Ljava/lang/Double;)V\n\tpublic final fun setTextPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;)V\n\tpublic final fun setTextRadialOffset (Ljava/lang/Double;)V\n\tpublic final fun setTextRotate (Ljava/lang/Double;)V\n\tpublic final fun setTextRotationAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;)V\n\tpublic final fun setTextSize (Ljava/lang/Double;)V\n\tpublic final fun setTextSizeScaleRange (Ljava/util/List;)V\n\tpublic final fun setTextTransform (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;)V\n\tpublic final fun setTextTranslate (Ljava/util/List;)V\n\tpublic final fun setTextTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;)V\n\tpublic final fun setTextVariableAnchor (Ljava/util/List;)V\n\tpublic final fun setTextWritingMode (Ljava/util/List;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState {\n\tpublic fun <init> ()V\n\tpublic final fun isDraggable ()Z\n\tpublic final fun onClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState;\n\tpublic final fun onDragFinished (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState;\n\tpublic final fun onDragStarted (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState;\n\tpublic final fun onDragged (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState;\n\tpublic final fun onLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState;\n\tpublic final fun setDraggable (Z)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsStateKt {\n\tpublic static final fun rememberPointAnnotationInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationKt {\n\tpublic static final fun PointAnnotation (Lcom/mapbox/geojson/Point;Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PointAnnotation (Lcom/mapbox/geojson/Point;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun PointAnnotation (Lcom/mapbox/geojson/Point;Lkotlin/jvm/functions/Function1;Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PointAnnotation (Lcom/mapbox/geojson/Point;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationOptionsExtKt {\n\tpublic static final fun withIconColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic static final fun withIconHaloColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic static final fun withTextColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic static final fun withTextHaloColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationState {\n\tpublic fun <init> ()V\n\tpublic final fun getIconAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic final fun getIconColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getIconColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getIconHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getIconHaloColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getIconHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getIconImage ()Lcom/mapbox/maps/extension/compose/annotation/IconImage;\n\tpublic final fun getIconImageCrossFade ()Ljava/lang/Double;\n\tpublic final fun getIconOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconOffset ()Ljava/util/List;\n\tpublic final fun getIconOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconRotate ()Ljava/lang/Double;\n\tpublic final fun getIconSize ()Ljava/lang/Double;\n\tpublic final fun getIconTextFit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic final fun getIconTextFitPadding ()Ljava/util/List;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState;\n\tpublic final fun getSymbolZOffset ()Ljava/lang/Double;\n\tpublic final fun getTextAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic final fun getTextColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getTextColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getTextField ()Ljava/lang/String;\n\tpublic final fun getTextHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getTextHaloColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getTextHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getTextJustify ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic final fun getTextLetterSpacing ()Ljava/lang/Double;\n\tpublic final fun getTextLineHeight ()Ljava/lang/Double;\n\tpublic final fun getTextMaxWidth ()Ljava/lang/Double;\n\tpublic final fun getTextOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextOffset ()Ljava/util/List;\n\tpublic final fun getTextOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextRadialOffset ()Ljava/lang/Double;\n\tpublic final fun getTextRotate ()Ljava/lang/Double;\n\tpublic final fun getTextSize ()Ljava/lang/Double;\n\tpublic final fun getTextTransform ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic final fun setIconAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;)V\n\tpublic final fun setIconColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setIconColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setIconHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setIconImage (Lcom/mapbox/maps/extension/compose/annotation/IconImage;)V\n\tpublic final fun setIconImageCrossFade (Ljava/lang/Double;)V\n\tpublic final fun setIconOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconOffset (Ljava/util/List;)V\n\tpublic final fun setIconOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconRotate (Ljava/lang/Double;)V\n\tpublic final fun setIconSize (Ljava/lang/Double;)V\n\tpublic final fun setIconTextFit (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;)V\n\tpublic final fun setIconTextFitPadding (Ljava/util/List;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState;)V\n\tpublic final fun setSymbolZOffset (Ljava/lang/Double;)V\n\tpublic final fun setTextAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;)V\n\tpublic final fun setTextColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setTextColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setTextField (Ljava/lang/String;)V\n\tpublic final fun setTextHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setTextHaloColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setTextHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextJustify (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;)V\n\tpublic final fun setTextLetterSpacing (Ljava/lang/Double;)V\n\tpublic final fun setTextLineHeight (Ljava/lang/Double;)V\n\tpublic final fun setTextMaxWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextOffset (Ljava/util/List;)V\n\tpublic final fun setTextOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextRadialOffset (Ljava/lang/Double;)V\n\tpublic final fun setTextRotate (Ljava/lang/Double;)V\n\tpublic final fun setTextSize (Ljava/lang/Double;)V\n\tpublic final fun setTextTransform (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState {\n\tpublic fun <init> ()V\n\tpublic final fun isDraggable ()Z\n\tpublic final fun onClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState;\n\tpublic final fun onDragFinished (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState;\n\tpublic final fun onDragStarted (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState;\n\tpublic final fun onDragged (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState;\n\tpublic final fun onLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState;\n\tpublic final fun setDraggable (Z)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsStateKt {\n\tpublic static final fun rememberPolygonAnnotationGroupInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupKt {\n\tpublic static final fun PolygonAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolygonAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolygonAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolygonAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupState {\n\tpublic fun <init> ()V\n\tpublic final fun getFillAntialias ()Ljava/lang/Boolean;\n\tpublic final fun getFillBridgeGuardRailColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getFillBridgeGuardRailColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getFillColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillConstructBridgeGuardRail ()Ljava/lang/Boolean;\n\tpublic final fun getFillElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;\n\tpublic final fun getFillEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getFillOpacity ()Ljava/lang/Double;\n\tpublic final fun getFillOutlineColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getFillOutlineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillPattern ()Ljava/lang/String;\n\tpublic final fun getFillPatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getFillSortKey ()Ljava/lang/Double;\n\tpublic final fun getFillTranslate ()Ljava/util/List;\n\tpublic final fun getFillTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;\n\tpublic final fun getFillTunnelStructureColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getFillTunnelStructureColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillZOffset ()Ljava/lang/Double;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState;\n\tpublic final fun getMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun setFillAntialias (Ljava/lang/Boolean;)V\n\tpublic final fun setFillBridgeGuardRailColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setFillBridgeGuardRailColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setFillColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillConstructBridgeGuardRail (Ljava/lang/Boolean;)V\n\tpublic final fun setFillElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;)V\n\tpublic final fun setFillEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setFillOpacity (Ljava/lang/Double;)V\n\tpublic final fun setFillOutlineColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setFillOutlineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillPattern (Ljava/lang/String;)V\n\tpublic final fun setFillPatternCrossFade (Ljava/lang/Double;)V\n\tpublic final fun setFillSortKey (Ljava/lang/Double;)V\n\tpublic final fun setFillTranslate (Ljava/util/List;)V\n\tpublic final fun setFillTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;)V\n\tpublic final fun setFillTunnelStructureColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setFillTunnelStructureColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillZOffset (Ljava/lang/Double;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState;)V\n\tpublic final fun setMaxZoom (Ljava/lang/Double;)V\n\tpublic final fun setMinZoom (Ljava/lang/Double;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState {\n\tpublic fun <init> ()V\n\tpublic final fun isDraggable ()Z\n\tpublic final fun onClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState;\n\tpublic final fun onDragFinished (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState;\n\tpublic final fun onDragStarted (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState;\n\tpublic final fun onDragged (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState;\n\tpublic final fun onLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState;\n\tpublic final fun setDraggable (Z)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsStateKt {\n\tpublic static final fun rememberPolygonAnnotationInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationKt {\n\tpublic static final fun PolygonAnnotation (Ljava/util/List;Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolygonAnnotation (Ljava/util/List;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun PolygonAnnotation (Ljava/util/List;Lkotlin/jvm/functions/Function1;Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolygonAnnotation (Ljava/util/List;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationOptionsExtKt {\n\tpublic static final fun withFillBridgeGuardRailColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic static final fun withFillColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic static final fun withFillOutlineColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic static final fun withFillTunnelStructureColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationState {\n\tpublic fun <init> ()V\n\tpublic final fun getFillBridgeGuardRailColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getFillBridgeGuardRailColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getFillColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillConstructBridgeGuardRail ()Ljava/lang/Boolean;\n\tpublic final fun getFillOpacity ()Ljava/lang/Double;\n\tpublic final fun getFillOutlineColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getFillOutlineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillPattern ()Ljava/lang/String;\n\tpublic final fun getFillTunnelStructureColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getFillTunnelStructureColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillZOffset ()Ljava/lang/Double;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState;\n\tpublic final fun setFillBridgeGuardRailColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setFillBridgeGuardRailColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setFillColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillConstructBridgeGuardRail (Ljava/lang/Boolean;)V\n\tpublic final fun setFillOpacity (Ljava/lang/Double;)V\n\tpublic final fun setFillOutlineColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setFillOutlineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillPattern (Ljava/lang/String;)V\n\tpublic final fun setFillTunnelStructureColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setFillTunnelStructureColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillZOffset (Ljava/lang/Double;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState {\n\tpublic fun <init> ()V\n\tpublic final fun isDraggable ()Z\n\tpublic final fun onClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState;\n\tpublic final fun onDragFinished (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState;\n\tpublic final fun onDragStarted (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState;\n\tpublic final fun onDragged (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState;\n\tpublic final fun onLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState;\n\tpublic final fun setDraggable (Z)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsStateKt {\n\tpublic static final fun rememberPolylineAnnotationGroupInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupKt {\n\tpublic static final fun PolylineAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolylineAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolylineAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolylineAnnotationGroup (Ljava/util/List;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupState {\n\tpublic fun <init> ()V\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState;\n\tpublic final fun getLineBlur ()Ljava/lang/Double;\n\tpublic final fun getLineBorderColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getLineBorderColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineBorderWidth ()Ljava/lang/Double;\n\tpublic final fun getLineCap ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;\n\tpublic final fun getLineColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getLineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineCrossSlope ()Ljava/lang/Double;\n\tpublic final fun getLineCutoutFadeWidth ()Ljava/lang/Double;\n\tpublic final fun getLineCutoutOpacity ()Ljava/lang/Double;\n\tpublic final fun getLineDasharray ()Ljava/util/List;\n\tpublic final fun getLineDepthOcclusionFactor ()Ljava/lang/Double;\n\tpublic final fun getLineElevationGroundScale ()Ljava/lang/Double;\n\tpublic final fun getLineElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n\tpublic final fun getLineEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getLineGapWidth ()Ljava/lang/Double;\n\tpublic final fun getLineGradientUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineJoin ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic final fun getLineMiterLimit ()Ljava/lang/Double;\n\tpublic final fun getLineOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getLineOffset ()Ljava/lang/Double;\n\tpublic final fun getLineOpacity ()Ljava/lang/Double;\n\tpublic final fun getLinePattern ()Ljava/lang/String;\n\tpublic final fun getLinePatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getLineRoundLimit ()Ljava/lang/Double;\n\tpublic final fun getLineSortKey ()Ljava/lang/Double;\n\tpublic final fun getLineTranslate ()Ljava/util/List;\n\tpublic final fun getLineTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;\n\tpublic final fun getLineTrimColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getLineTrimColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineTrimFadeRange ()Ljava/util/List;\n\tpublic final fun getLineTrimOffset ()Ljava/util/List;\n\tpublic final fun getLineWidth ()Ljava/lang/Double;\n\tpublic final fun getLineWidthUnit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;\n\tpublic final fun getLineZOffset ()Ljava/lang/Double;\n\tpublic final fun getMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState;)V\n\tpublic final fun setLineBlur (Ljava/lang/Double;)V\n\tpublic final fun setLineBorderColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setLineBorderColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineBorderWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineCap (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;)V\n\tpublic final fun setLineColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setLineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineCrossSlope (Ljava/lang/Double;)V\n\tpublic final fun setLineCutoutFadeWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineCutoutOpacity (Ljava/lang/Double;)V\n\tpublic final fun setLineDasharray (Ljava/util/List;)V\n\tpublic final fun setLineDepthOcclusionFactor (Ljava/lang/Double;)V\n\tpublic final fun setLineElevationGroundScale (Ljava/lang/Double;)V\n\tpublic final fun setLineElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;)V\n\tpublic final fun setLineEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setLineGapWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineGradientUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineJoin (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;)V\n\tpublic final fun setLineMiterLimit (Ljava/lang/Double;)V\n\tpublic final fun setLineOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setLineOffset (Ljava/lang/Double;)V\n\tpublic final fun setLineOpacity (Ljava/lang/Double;)V\n\tpublic final fun setLinePattern (Ljava/lang/String;)V\n\tpublic final fun setLinePatternCrossFade (Ljava/lang/Double;)V\n\tpublic final fun setLineRoundLimit (Ljava/lang/Double;)V\n\tpublic final fun setLineSortKey (Ljava/lang/Double;)V\n\tpublic final fun setLineTranslate (Ljava/util/List;)V\n\tpublic final fun setLineTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;)V\n\tpublic final fun setLineTrimColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setLineTrimColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineTrimFadeRange (Ljava/util/List;)V\n\tpublic final fun setLineTrimOffset (Ljava/util/List;)V\n\tpublic final fun setLineWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineWidthUnit (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;)V\n\tpublic final fun setLineZOffset (Ljava/lang/Double;)V\n\tpublic final fun setMaxZoom (Ljava/lang/Double;)V\n\tpublic final fun setMinZoom (Ljava/lang/Double;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState {\n\tpublic fun <init> ()V\n\tpublic final fun isDraggable ()Z\n\tpublic final fun onClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState;\n\tpublic final fun onDragFinished (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState;\n\tpublic final fun onDragStarted (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState;\n\tpublic final fun onDragged (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState;\n\tpublic final fun onLongClicked (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState;\n\tpublic final fun setDraggable (Z)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsStateKt {\n\tpublic static final fun rememberPolylineAnnotationInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationKt {\n\tpublic static final fun PolylineAnnotation (Ljava/util/List;Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolylineAnnotation (Ljava/util/List;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V\n\tpublic static final fun PolylineAnnotation (Ljava/util/List;Lkotlin/jvm/functions/Function1;Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun PolylineAnnotation (Ljava/util/List;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationOptionsExtKt {\n\tpublic static final fun withLineBorderColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic static final fun withLineColor-4WTKRHQ (Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;J)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationState {\n\tpublic fun <init> ()V\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState;\n\tpublic final fun getLineBlur ()Ljava/lang/Double;\n\tpublic final fun getLineBorderColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getLineBorderColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineBorderWidth ()Ljava/lang/Double;\n\tpublic final fun getLineColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic final fun getLineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineElevationGroundScale ()Ljava/lang/Double;\n\tpublic final fun getLineEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getLineGapWidth ()Ljava/lang/Double;\n\tpublic final fun getLineJoin ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic final fun getLineOffset ()Ljava/lang/Double;\n\tpublic final fun getLineOpacity ()Ljava/lang/Double;\n\tpublic final fun getLinePattern ()Ljava/lang/String;\n\tpublic final fun getLineWidth ()Ljava/lang/Double;\n\tpublic final fun getLineZOffset ()Ljava/lang/Double;\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState;)V\n\tpublic final fun setLineBlur (Ljava/lang/Double;)V\n\tpublic final fun setLineBorderColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setLineBorderColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineBorderWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineColor-Y2TPw74 (Landroidx/compose/ui/graphics/Color;)V\n\tpublic final fun setLineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineElevationGroundScale (Ljava/lang/Double;)V\n\tpublic final fun setLineEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setLineGapWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineJoin (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;)V\n\tpublic final fun setLineOffset (Ljava/lang/Double;)V\n\tpublic final fun setLineOpacity (Ljava/lang/Double;)V\n\tpublic final fun setLinePattern (Ljava/lang/String;)V\n\tpublic final fun setLineWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineZOffset (Ljava/lang/Double;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/ornaments/attribution/ComposableSingletons$MapAttributionScopeKt {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/extension/compose/ornaments/attribution/ComposableSingletons$MapAttributionScopeKt;\n\tpublic static field lambda-1 Lkotlin/jvm/functions/Function2;\n\tpublic static field lambda-2 Lkotlin/jvm/functions/Function2;\n\tpublic static field lambda-3 Lkotlin/jvm/functions/Function4;\n\tpublic fun <init> ()V\n\tpublic final fun getLambda-1$extension_compose_release ()Lkotlin/jvm/functions/Function2;\n\tpublic final fun getLambda-2$extension_compose_release ()Lkotlin/jvm/functions/Function2;\n\tpublic final fun getLambda-3$extension_compose_release ()Lkotlin/jvm/functions/Function4;\n}\n\npublic final class com/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope {\n\tpublic final fun Attribution-fWhpE4E (Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/Alignment;JLkotlin/jvm/functions/Function5;Lkotlin/jvm/functions/Function6;Landroidx/compose/runtime/Composer;II)V\n\tpublic final fun Attribution-hYmLsZ8 (Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/Alignment;JLkotlin/jvm/functions/Function5;Lkotlin/jvm/functions/Function6;Lkotlin/jvm/functions/Function6;Landroidx/compose/runtime/Composer;II)V\n\tpublic final fun AttributionControl (Lcom/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$UserConsentState;Lcom/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$AttributionState;Landroidx/compose/runtime/Composer;I)V\n\tpublic final fun AttributionDialog (Ljava/util/List;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V\n\tpublic final fun GeofencingConsentDialog (Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;ZLandroidx/compose/runtime/Composer;I)V\n\tpublic final fun TelemetryDialog (Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$AttributionState {\n\tpublic fun <init> ()V\n\tpublic final fun buildMapboxFeedbackUrl (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun getAttributions ()Ljava/util/List;\n\tpublic final fun getUserConsentState ()Lcom/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$UserConsentState;\n}\n\npublic final class com/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$UserConsentState {\n\tpublic synthetic fun <init> (ZZLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getGeofencingUserConsentState ()Z\n\tpublic final fun getTelemetryEnableState ()Z\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$UserConsentState$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$UserConsentState$Builder {\n\tpublic static final field $stable I\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$UserConsentState;\n\tpublic final fun getGeofencingUserConsentState ()Z\n\tpublic final fun getTelemetryEnableState ()Z\n\tpublic final fun setGeofencingUserConsentState (Z)Lcom/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$UserConsentState$Builder;\n\tpublic final synthetic fun setGeofencingUserConsentState (Z)V\n\tpublic final fun setTelemetryEnableState (Z)Lcom/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope$UserConsentState$Builder;\n\tpublic final synthetic fun setTelemetryEnableState (Z)V\n}\n\npublic final class com/mapbox/maps/extension/compose/ornaments/compass/ComposableSingletons$MapCompassScopeKt {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/extension/compose/ornaments/compass/ComposableSingletons$MapCompassScopeKt;\n\tpublic static field lambda-1 Lkotlin/jvm/functions/Function2;\n\tpublic fun <init> ()V\n\tpublic final fun getLambda-1$extension_compose_release ()Lkotlin/jvm/functions/Function2;\n}\n\npublic final class com/mapbox/maps/extension/compose/ornaments/compass/MapCompassScope {\n\tpublic final fun Compass (Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/Alignment;ZZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/ornaments/logo/MapLogoScope {\n\tpublic final fun Logo (Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/Alignment;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/ornaments/scalebar/MapScaleBarScope {\n\tpublic final fun ScaleBar-vLKV3eY (Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/Alignment;JJJFFFFJZJZFZLandroidx/compose/runtime/Composer;III)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/BooleanValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/BooleanValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Z)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBooleanOrNull ()Ljava/lang/Boolean;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/BooleanValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/ColorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/ColorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic synthetic fun <init> (JLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/ColorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getColorOrNull-QN2ZGVo ()Landroidx/compose/ui/graphics/Color;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/ColorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/DoubleListValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field $stable I\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/DoubleListValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic fun <init> ([D)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDoubleListOrNull ()Ljava/util/List;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/DoubleListValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/DoubleRangeValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field $stable I\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic fun <init> (DD)V\n\tpublic fun <init> (Landroid/util/Range;)V\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getRangeOrNull ()Landroid/util/Range;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/DoubleRangeValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/DoubleValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/DoubleValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic fun <init> (D)V\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDoubleOrNull ()Ljava/lang/Double;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/DoubleValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/IdGenerator {\n\tpublic static final field $stable I\n\tpublic static final field INSTANCE Lcom/mapbox/maps/extension/compose/style/IdGenerator;\n\tpublic final fun generateRandomLayerId (Ljava/lang/String;)Ljava/lang/String;\n\tpublic final fun generateRandomLightId (Ljava/lang/String;)Ljava/lang/String;\n\tpublic final fun generateRandomSourceId (Ljava/lang/String;)Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/ImportConfigs {\n\tpublic fun <init> ()V\n\tpublic final fun config (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)V\n\tpublic final fun copy (Ljava/util/HashMap;)Lcom/mapbox/maps/extension/compose/style/ImportConfigs;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/ImportConfigs;Ljava/util/HashMap;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/ImportConfigs;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/LayerPositionedContent {\n\tpublic fun <init> ()V\n\tpublic final fun aboveLayer (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V\n\tpublic final fun atIndex (ILkotlin/jvm/functions/Function2;)V\n\tpublic final fun belowLayer (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V\n\tpublic final fun copy (Ljava/util/Map;)Lcom/mapbox/maps/extension/compose/style/LayerPositionedContent;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/LayerPositionedContent;Ljava/util/Map;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/LayerPositionedContent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic final fun layerPosition (Lcom/mapbox/maps/LayerPosition;Lkotlin/jvm/functions/Function2;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/LongValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/LongValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic fun <init> (J)V\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getLongOrNull ()Ljava/lang/Long;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/LongValue$Companion {\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/compose/style/MapboxStyleComposable : java/lang/annotation/Annotation {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/PointListValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field $stable I\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/PointListValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/PointListValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic fun <init> ([Lcom/mapbox/geojson/Point;)V\n\tpublic fun <init> ([Lkotlin/Pair;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/PointListValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/PointListValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/PointListValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getPointsOrNull ()Ljava/util/List;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/PointListValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/SlotsContent {\n\tpublic fun <init> ()V\n\tpublic final fun copy (Ljava/util/Map;)Lcom/mapbox/maps/extension/compose/style/SlotsContent;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/SlotsContent;Ljava/util/Map;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/SlotsContent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic final fun slot (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StringListValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/StringListValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic fun <init> ([Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/StringListValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getStringListOrNull ()Ljava/util/List;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StringListValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StringValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/StringValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getStringOrNull ()Ljava/lang/String;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StringValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StyleColorTheme {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/StyleColorTheme$Companion;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;\n\tpublic static final field STYLE_DEFAULT Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;\n\tpublic fun <init> (Lcom/mapbox/maps/ColorTheme;)V\n\tpublic final fun component1 ()Lcom/mapbox/maps/ColorTheme;\n\tpublic final fun copy (Lcom/mapbox/maps/ColorTheme;Z)Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;Lcom/mapbox/maps/ColorTheme;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getColorTheme ()Lcom/mapbox/maps/ColorTheme;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StyleColorTheme$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StyleColorThemeKt {\n\tpublic static final fun rememberColorTheme (ILandroidx/compose/runtime/Composer;I)Lcom/mapbox/maps/ColorTheme;\n\tpublic static final fun rememberColorTheme (Landroidx/compose/ui/graphics/ImageBitmap;Landroidx/compose/runtime/Composer;I)Lcom/mapbox/maps/ColorTheme;\n\tpublic static final fun rememberColorTheme (Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/runtime/Composer;I)Lcom/mapbox/maps/ColorTheme;\n\tpublic static final fun rememberColorTheme (Lcom/mapbox/maps/Image;Landroidx/compose/runtime/Composer;I)Lcom/mapbox/maps/ColorTheme;\n\tpublic static final fun rememberColorTheme (Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Lcom/mapbox/maps/ColorTheme;\n\tpublic static final fun rememberStyleColorTheme (Lcom/mapbox/maps/ColorTheme;Landroidx/compose/runtime/Composer;I)Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StyleImage {\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/Image;Ljava/lang/Float;ZLjava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/Image;Ljava/lang/Float;ZLjava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Lcom/mapbox/maps/Image;\n\tpublic final fun component3 ()Ljava/lang/Float;\n\tpublic final fun component4 ()Z\n\tpublic final fun component5 ()Ljava/util/List;\n\tpublic final fun component6 ()Ljava/util/List;\n\tpublic final fun component7 ()Lcom/mapbox/maps/ImageContent;\n\tpublic final fun copy (Ljava/lang/String;Lcom/mapbox/maps/Image;Ljava/lang/Float;ZLjava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;)Lcom/mapbox/maps/extension/compose/style/StyleImage;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/StyleImage;Ljava/lang/String;Lcom/mapbox/maps/Image;Ljava/lang/Float;ZLjava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/StyleImage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getContent ()Lcom/mapbox/maps/ImageContent;\n\tpublic final fun getImage ()Lcom/mapbox/maps/Image;\n\tpublic final fun getImageId ()Ljava/lang/String;\n\tpublic final fun getScale ()Ljava/lang/Float;\n\tpublic final fun getSdf ()Z\n\tpublic final fun getStretchX ()Ljava/util/List;\n\tpublic final fun getStretchY ()Ljava/util/List;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StyleImageKt {\n\tpublic static final fun rememberStyleImage (Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/Float;ZLjava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/StyleImage;\n\tpublic static final fun rememberStyleImage (Ljava/lang/String;ILjava/lang/Float;ZLjava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/StyleImage;\n\tpublic static final fun rememberStyleImage (Ljava/lang/String;Landroidx/compose/ui/graphics/ImageBitmap;Ljava/lang/Float;ZLjava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/StyleImage;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StyleImportsConfig {\n\tpublic fun <init> ()V\n\tpublic final fun copy (Ljava/util/Map;)Lcom/mapbox/maps/extension/compose/style/StyleImportsConfig;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/StyleImportsConfig;Ljava/util/Map;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/StyleImportsConfig;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic final fun importConfig (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StyleKt {\n\tpublic static final fun GenericStyle (Ljava/lang/String;Lkotlin/jvm/functions/Function3;Lcom/mapbox/maps/extension/compose/style/SlotsContent;Lcom/mapbox/maps/extension/compose/style/LayerPositionedContent;Lcom/mapbox/maps/extension/compose/style/StyleImportsConfig;Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun GenericStyle (Ljava/lang/String;Lkotlin/jvm/functions/Function3;Lcom/mapbox/maps/extension/compose/style/SlotsContent;Lcom/mapbox/maps/extension/compose/style/LayerPositionedContent;Lcom/mapbox/maps/extension/compose/style/StyleState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun MapStyle (Ljava/lang/String;Lkotlin/jvm/functions/Function3;Lcom/mapbox/maps/extension/compose/style/StyleState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun MapStyle (Ljava/lang/String;Lkotlin/jvm/functions/Function3;Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun importConfigs (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/style/ImportConfigs;\n\tpublic static final fun layerPositionedContent (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/style/LayerPositionedContent;\n\tpublic static final fun slotsContent (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/style/SlotsContent;\n\tpublic static final fun styleImportsConfig (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/compose/style/StyleImportsConfig;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StyleState {\n\tpublic fun <init> ()V\n\tpublic final fun getAtmosphereState ()Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;\n\tpublic final fun getLightsState ()Lcom/mapbox/maps/extension/compose/style/lights/LightsState;\n\tpublic final fun getProjection ()Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;\n\tpublic final fun getRainState ()Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState;\n\tpublic final fun getSnowState ()Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState;\n\tpublic final fun getStyleColorTheme ()Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;\n\tpublic final fun getStyleImportsConfig ()Lcom/mapbox/maps/extension/compose/style/StyleImportsConfig;\n\tpublic final fun getStyleInteractionsState ()Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic final fun getStyleTransition ()Lcom/mapbox/maps/TransitionOptions;\n\tpublic final fun getTerrainState ()Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;\n\tpublic final fun setAtmosphereState (Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;)V\n\tpublic final fun setLightsState (Lcom/mapbox/maps/extension/compose/style/lights/LightsState;)V\n\tpublic final fun setProjection (Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;)V\n\tpublic final fun setRainState (Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState;)V\n\tpublic final fun setSnowState (Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState;)V\n\tpublic final fun setStyleColorTheme (Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;)V\n\tpublic final fun setStyleImportsConfig (Lcom/mapbox/maps/extension/compose/style/StyleImportsConfig;)V\n\tpublic final fun setStyleInteractionsState (Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;)V\n\tpublic final fun setStyleTransition (Lcom/mapbox/maps/TransitionOptions;)V\n\tpublic final fun setTerrainState (Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/StyleStateKt {\n\tpublic static final fun rememberStyleState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/StyleState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/Transition : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field $stable I\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/Transition$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic fun <init> (JJ)V\n\tpublic synthetic fun <init> (JJILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDelayMillis ()J\n\tpublic final fun getDurationMillis ()J\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/Transition$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState$Companion;\n\tpublic fun <init> ()V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/compose/style/atmosphere/AtmosphereStateApplier;Lcom/mapbox/maps/extension/compose/style/ColorValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/ColorValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/ColorValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getHighColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getHighColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getHighColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getHorizonBlend ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getHorizonBlendTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRange ()Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic final fun getRangeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getSpaceColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getSpaceColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getSpaceColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getStarIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getStarIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getVerticalRange ()Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic final fun getVerticalRangeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic fun hashCode ()I\n\tpublic final fun setColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setHighColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setHighColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setHighColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setHorizonBlend (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setHorizonBlendTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRange (Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;)V\n\tpublic final fun setRangeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setSpaceColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setSpaceColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setSpaceColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setStarIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setStarIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setVerticalRange (Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;)V\n\tpublic final fun setVerticalRangeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState$Holder : android/os/Parcelable {\n\tpublic static final field $stable I\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic final fun component1 ()Ljava/util/Map;\n\tpublic final fun copy (Ljava/util/Map;)Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState$Holder;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState$Holder;Ljava/util/Map;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState$Holder;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getSavedProperties ()Ljava/util/Map;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState$Holder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState$Holder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState$Holder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereStateKt {\n\tpublic static final fun rememberAtmosphereState (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/compose/style/imports/MapboxStyleImportComposable : java/lang/annotation/Annotation {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState : com/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions {\n\tpublic fun <init> ()V\n\tpublic final fun onFeaturesetClicked (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;\n\tpublic static synthetic fun onFeaturesetClicked$default (Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;\n\tpublic final fun onFeaturesetLongClicked (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;\n\tpublic static synthetic fun onFeaturesetLongClicked$default (Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;\n\tpublic final fun onMapClicked (Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;\n\tpublic final fun onMapLongClicked (Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsStateKt {\n\tpublic static final fun rememberStyleImportInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/imports/StyleImportState {\n\tpublic fun <init> ()V\n\tpublic final fun getImportConfigs ()Lcom/mapbox/maps/extension/compose/style/ImportConfigs;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;\n\tpublic final fun getStyleColorTheme ()Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;\n\tpublic final fun setImportConfigs (Lcom/mapbox/maps/extension/compose/style/ImportConfigs;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState;)V\n\tpublic final fun setStyleColorTheme (Lcom/mapbox/maps/extension/compose/style/StyleColorTheme;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/imports/StyleImportStateKt {\n\tpublic static final fun rememberStyleImportState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/imports/StyleImportState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/imports/StyleImportsScope {\n\tpublic final fun StyleImport (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/ImportConfigs;Landroidx/compose/runtime/Composer;II)V\n\tpublic final fun StyleImport (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/imports/StyleImportState;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic abstract class com/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions {\n\tpublic static final field $stable I\n\tpublic fun <init> ()V\n\tprotected final fun BindToMap (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)V\n\tprotected final fun UpdateInteractions (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Landroidx/compose/runtime/Composer;I)V\n\tprotected final fun clickInteractionFeatureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)V\n\tpublic static synthetic fun clickInteractionFeatureset$default (Lcom/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V\n\tprotected final fun clickInteractionLayer (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)V\n\tpublic static synthetic fun clickInteractionLayer$default (Lcom/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V\n\tprotected final fun clickInteractionMap (Lkotlin/jvm/functions/Function2;)V\n\tprotected final fun getEntries ()Ljava/util/List;\n\tprotected final fun getFeaturesetFeatureScope ()Lcom/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope;\n\tprotected final fun longClickInteractionFeatureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)V\n\tpublic static synthetic fun longClickInteractionFeatureset$default (Lcom/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V\n\tprotected final fun longClickInteractionLayer (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)V\n\tpublic static synthetic fun longClickInteractionLayer$default (Lcom/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V\n\tprotected final fun longClickInteractionMap (Lkotlin/jvm/functions/Function2;)V\n\tprotected final fun setFeaturesetFeatureScope (Lcom/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState : com/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions {\n\tpublic fun <init> ()V\n\tpublic final fun onFeaturesetClicked (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic static synthetic fun onFeaturesetClicked$default (Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic final fun onFeaturesetLongClicked (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic static synthetic fun onFeaturesetLongClicked$default (Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic final fun onLayerClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic static synthetic fun onLayerClicked$default (Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic final fun onLayerLongClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic static synthetic fun onLayerLongClicked$default (Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic final fun onMapClicked (Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic final fun onMapLongClicked (Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/interactions/StyleInteractionsStateKt {\n\tpublic static final fun rememberStyleInteractionStates (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n}\n\npublic abstract interface class com/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope {\n\tpublic abstract fun removeFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureStateKey;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun resetFeatureStates (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun setFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun setStandardBuildingsState (Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsFeature;Lkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun setStandardLandmarkIconsState (Lcom/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsFeature;Lkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun setStandardPlaceLabelsState (Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsFeature;Lkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun setStandardPoiState (Lcom/mapbox/maps/interactions/standard/generated/StandardPoiFeature;Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope$DefaultImpls {\n\tpublic static synthetic fun removeFeatureState$default (Lcom/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope;Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureStateKey;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun resetFeatureStates$default (Lcom/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope;Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun setFeatureState$default (Lcom/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope;Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static fun setStandardBuildingsState (Lcom/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope;Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsFeature;Lkotlin/jvm/functions/Function1;)V\n\tpublic static fun setStandardLandmarkIconsState (Lcom/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope;Lcom/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsFeature;Lkotlin/jvm/functions/Function1;)V\n\tpublic static fun setStandardPlaceLabelsState (Lcom/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope;Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsFeature;Lkotlin/jvm/functions/Function1;)V\n\tpublic static fun setStandardPoiState (Lcom/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope;Lcom/mapbox/maps/interactions/standard/generated/StandardPoiFeature;Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/Filter : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/Filter$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/Filter;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/Filter$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/FormattedValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/FormattedValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/FormattedValue;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/FormattedValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/FormattedValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/FormattedValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getStringOrNull ()Ljava/lang/String;\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/FormattedValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/ImageValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/ImageValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/compose/style/StyleImage;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun component2 ()Lcom/mapbox/maps/extension/compose/style/StyleImage;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/extension/compose/style/StyleImage;)Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/extension/compose/style/StyleImage;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getImageIdOrNull ()Ljava/lang/String;\n\tpublic final fun getStyleImage ()Lcom/mapbox/maps/extension/compose/style/StyleImage;\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/ImageValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/LayerInteractionsState : com/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions {\n\tpublic fun <init> ()V\n\tpublic final fun onClicked (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic static synthetic fun onClicked$default (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun onLongClicked (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic static synthetic fun onLongClicked$default (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/LayerInteractionsStateKt {\n\tpublic static final fun rememberLayerInteractionsState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/ModelIdValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/ModelIdValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/ModelIdValue;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun component2 ()Lkotlin/Pair;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;Lkotlin/Pair;)Lcom/mapbox/maps/extension/compose/style/layers/ModelIdValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/ModelIdValue;Lcom/mapbox/bindgen/Value;Lkotlin/Pair;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/ModelIdValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getModelIdOrNull ()Ljava/lang/String;\n\tpublic final fun getModelInfo ()Lkotlin/Pair;\n\tpublic final fun getUriOrNull ()Ljava/lang/String;\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/ModelIdValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/BackgroundLayerKt {\n\tpublic static final fun BackgroundLayer (Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun BackgroundLayer (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/BackgroundLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getBackgroundColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getBackgroundColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getBackgroundColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getBackgroundEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getBackgroundEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getBackgroundOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getBackgroundOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getBackgroundPattern ()Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic final fun getBackgroundPitchAlignment ()Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setBackgroundColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setBackgroundColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setBackgroundColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setBackgroundEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setBackgroundEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setBackgroundOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setBackgroundOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setBackgroundPattern (Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;)V\n\tpublic final fun setBackgroundPitchAlignment (Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/BackgroundPitchAlignmentValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CircleLayerKt {\n\tpublic static final fun CircleLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun CircleLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CircleLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getCircleBlur ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getCircleBlurTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getCircleColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getCircleColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getCircleColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getCircleElevationReference ()Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue;\n\tpublic final fun getCircleEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getCircleEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getCircleOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getCircleOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getCirclePitchAlignment ()Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue;\n\tpublic final fun getCirclePitchScale ()Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue;\n\tpublic final fun getCircleRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getCircleRadiusTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getCircleSortKey ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getCircleStrokeColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getCircleStrokeColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getCircleStrokeColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getCircleStrokeOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getCircleStrokeOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getCircleStrokeWidth ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getCircleStrokeWidthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getCircleTranslate ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getCircleTranslateAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue;\n\tpublic final fun getCircleTranslateTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setCircleBlur (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setCircleBlurTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setCircleColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setCircleColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setCircleColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setCircleElevationReference (Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleElevationReferenceValue;)V\n\tpublic final fun setCircleEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setCircleEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setCircleOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setCircleOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setCirclePitchAlignment (Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue;)V\n\tpublic final fun setCirclePitchScale (Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue;)V\n\tpublic final fun setCircleRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setCircleRadiusTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setCircleSortKey (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setCircleStrokeColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setCircleStrokeColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setCircleStrokeColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setCircleStrokeOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setCircleStrokeOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setCircleStrokeWidth (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setCircleStrokeWidthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setCircleTranslate (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setCircleTranslateAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue;)V\n\tpublic final fun setCircleTranslateTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CirclePitchAlignmentValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CirclePitchScaleValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/CircleTranslateAnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ClipLayerKt {\n\tpublic static final fun ClipLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun ClipLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ClipLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getClipLayerScope ()Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic final fun getClipLayerTypes ()Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypesListValue;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setClipLayerScope (Lcom/mapbox/maps/extension/compose/style/StringListValue;)V\n\tpublic final fun setClipLayerTypes (Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypesListValue;)V\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypes {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypes$Companion;\n\tpublic static final field MODEL Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypes;\n\tpublic static final field SYMBOL Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypes;\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypes;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypes;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypes;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypes$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypesListValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypesListValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypesListValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypesListValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypesListValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypesListValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ClipLayerTypesListValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue;\n\tpublic static final field HD_ROAD_BASE Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue;\n\tpublic static final field FLAT Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue;\n\tpublic static final field TERRAIN Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue;\n\tpublic static final field FLAT Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue;\n\tpublic static final field TERRAIN Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionLayerKt {\n\tpublic static final fun FillExtrusionLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun FillExtrusionLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundAttenuation ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundAttenuationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundRadiusTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionAmbientOcclusionIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionAmbientOcclusionIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionAmbientOcclusionRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionAmbientOcclusionRadiusTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionAmbientOcclusionWallRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionAmbientOcclusionWallRadiusTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionBase ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionBaseAlignment ()Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue;\n\tpublic final fun getFillExtrusionBaseTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionCastShadows ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getFillExtrusionColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getFillExtrusionColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getFillExtrusionCutoffFadeRange ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionEdgeRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionFloodLightColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getFillExtrusionFloodLightColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionFloodLightColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getFillExtrusionFloodLightGroundAttenuation ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionFloodLightGroundAttenuationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionFloodLightGroundRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionFloodLightGroundRadiusTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionFloodLightIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionFloodLightIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionFloodLightWallRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionFloodLightWallRadiusTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionHeight ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionHeightAlignment ()Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue;\n\tpublic final fun getFillExtrusionHeightTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionLineWidth ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionLineWidthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionPattern ()Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic final fun getFillExtrusionPatternCrossFade ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionRoundedRoof ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getFillExtrusionTranslate ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getFillExtrusionTranslateAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue;\n\tpublic final fun getFillExtrusionTranslateTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillExtrusionVerticalGradient ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getFillExtrusionVerticalScale ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillExtrusionVerticalScaleTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFillExtrusionAmbientOcclusionGroundAttenuation (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionAmbientOcclusionGroundAttenuationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionAmbientOcclusionGroundRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionAmbientOcclusionGroundRadiusTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionAmbientOcclusionIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionAmbientOcclusionIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionAmbientOcclusionRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionAmbientOcclusionRadiusTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionAmbientOcclusionWallRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionAmbientOcclusionWallRadiusTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionBase (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionBaseAlignment (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionBaseAlignmentValue;)V\n\tpublic final fun setFillExtrusionBaseTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionCastShadows (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setFillExtrusionColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setFillExtrusionColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setFillExtrusionCutoffFadeRange (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionEdgeRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionFloodLightColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setFillExtrusionFloodLightColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionFloodLightColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setFillExtrusionFloodLightGroundAttenuation (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionFloodLightGroundAttenuationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionFloodLightGroundRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionFloodLightGroundRadiusTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionFloodLightIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionFloodLightIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionFloodLightWallRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionFloodLightWallRadiusTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionHeight (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionHeightAlignment (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionHeightAlignmentValue;)V\n\tpublic final fun setFillExtrusionHeightTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionLineWidth (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionLineWidthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionPattern (Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;)V\n\tpublic final fun setFillExtrusionPatternCrossFade (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionRoundedRoof (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setFillExtrusionTranslate (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setFillExtrusionTranslateAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue;)V\n\tpublic final fun setFillExtrusionTranslateTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillExtrusionVerticalGradient (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setFillExtrusionVerticalScale (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillExtrusionVerticalScaleTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionTranslateAnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillLayerKt {\n\tpublic static final fun FillLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/FillLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun FillLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFillAntialias ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getFillBridgeGuardRailColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getFillBridgeGuardRailColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillBridgeGuardRailColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getFillColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getFillColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getFillConstructBridgeGuardRail ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getFillElevationReference ()Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue;\n\tpublic final fun getFillEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillOutlineColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getFillOutlineColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillOutlineColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getFillPattern ()Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic final fun getFillPatternCrossFade ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillSortKey ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillTranslate ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getFillTranslateAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue;\n\tpublic final fun getFillTranslateTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillTunnelStructureColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getFillTunnelStructureColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFillTunnelStructureColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getFillZOffset ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFillZOffsetTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFillAntialias (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setFillBridgeGuardRailColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setFillBridgeGuardRailColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillBridgeGuardRailColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setFillColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setFillColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setFillConstructBridgeGuardRail (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setFillElevationReference (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillElevationReferenceValue;)V\n\tpublic final fun setFillEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillOutlineColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setFillOutlineColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillOutlineColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setFillPattern (Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;)V\n\tpublic final fun setFillPatternCrossFade (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillSortKey (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillTranslate (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setFillTranslateAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue;)V\n\tpublic final fun setFillTranslateTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillTunnelStructureColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setFillTunnelStructureColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFillTunnelStructureColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setFillZOffset (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFillZOffsetTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/FillTranslateAnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/HeatmapLayerKt {\n\tpublic static final fun HeatmapLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/HeatmapLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun HeatmapLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/HeatmapLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getHeatmapColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getHeatmapColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getHeatmapIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getHeatmapIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getHeatmapOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getHeatmapOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getHeatmapRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getHeatmapRadiusTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getHeatmapWeight ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setHeatmapColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setHeatmapColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setHeatmapIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setHeatmapIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setHeatmapOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setHeatmapOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setHeatmapRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setHeatmapRadiusTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setHeatmapWeight (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/HillshadeLayerKt {\n\tpublic static final fun HillshadeLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun HillshadeLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/HillshadeLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getHillshadeAccentColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getHillshadeAccentColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getHillshadeAccentColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getHillshadeEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getHillshadeEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getHillshadeExaggeration ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getHillshadeExaggerationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getHillshadeHighlightColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getHillshadeHighlightColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getHillshadeHighlightColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getHillshadeIlluminationAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue;\n\tpublic final fun getHillshadeIlluminationDirection ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getHillshadeShadowColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getHillshadeShadowColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getHillshadeShadowColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setHillshadeAccentColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setHillshadeAccentColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setHillshadeAccentColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setHillshadeEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setHillshadeEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setHillshadeExaggeration (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setHillshadeExaggerationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setHillshadeHighlightColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setHillshadeHighlightColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setHillshadeHighlightColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setHillshadeIlluminationAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/HillshadeIlluminationAnchorValue;)V\n\tpublic final fun setHillshadeIlluminationDirection (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setHillshadeShadowColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setHillshadeShadowColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setHillshadeShadowColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field BOTTOM Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static final field BOTTOM_LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static final field BOTTOM_RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static final field CENTER Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static final field LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static final field RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static final field TOP Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static final field TOP_LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static final field TOP_RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field BOTH Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;\n\tpublic static final field HEIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;\n\tpublic static final field WIDTH Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineCapValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field BUTT Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue;\n\tpublic static final field ROUND Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue;\n\tpublic static final field SQUARE Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineCapValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;\n\tpublic static final field GROUND Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;\n\tpublic static final field SEA Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field BEVEL Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;\n\tpublic static final field MITER Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;\n\tpublic static final field ROUND Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineLayerKt {\n\tpublic static final fun LineLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/LineLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun LineLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getLineBlur ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineBlurTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineBorderColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getLineBorderColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineBorderColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getLineBorderWidth ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineBorderWidthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineCap ()Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue;\n\tpublic final fun getLineColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getLineColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getLineCrossSlope ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineCutoutFadeWidth ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineCutoutFadeWidthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineCutoutOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineCutoutOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineDasharray ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getLineDepthOcclusionFactor ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineDepthOcclusionFactorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineElevationGroundScale ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineElevationGroundScaleTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineElevationReference ()Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;\n\tpublic final fun getLineEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineGapWidth ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineGapWidthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineGradient ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getLineGradientUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getLineJoin ()Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;\n\tpublic final fun getLineMiterLimit ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineOcclusionOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineOcclusionOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineOffset ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineOffsetTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLinePattern ()Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic final fun getLinePatternCrossFade ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineRoundLimit ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineSortKey ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineTranslate ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getLineTranslateAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue;\n\tpublic final fun getLineTranslateTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineTrimColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getLineTrimColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineTrimColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getLineTrimFadeRange ()Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic final fun getLineTrimOffset ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getLineWidth ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLineWidthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLineWidthUnit ()Lcom/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue;\n\tpublic final fun getLineZOffset ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setLineBlur (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineBlurTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineBorderColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setLineBorderColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineBorderColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setLineBorderWidth (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineBorderWidthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineCap (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineCapValue;)V\n\tpublic final fun setLineColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setLineColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setLineCrossSlope (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineCutoutFadeWidth (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineCutoutFadeWidthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineCutoutOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineCutoutOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineDasharray (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setLineDepthOcclusionFactor (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineDepthOcclusionFactorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineElevationGroundScale (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineElevationGroundScaleTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineElevationReference (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineElevationReferenceValue;)V\n\tpublic final fun setLineEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineGapWidth (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineGapWidthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineGradient (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setLineGradientUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setLineJoin (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineJoinValue;)V\n\tpublic final fun setLineMiterLimit (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineOcclusionOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineOcclusionOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineOffset (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineOffsetTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLinePattern (Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;)V\n\tpublic final fun setLinePatternCrossFade (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineRoundLimit (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineSortKey (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineTranslate (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setLineTranslateAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue;)V\n\tpublic final fun setLineTranslateTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineTrimColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setLineTrimColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineTrimColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setLineTrimFadeRange (Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;)V\n\tpublic final fun setLineTrimOffset (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setLineWidth (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLineWidthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLineWidthUnit (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue;)V\n\tpublic final fun setLineZOffset (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineTranslateAnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue;\n\tpublic static final field METERS Lcom/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue;\n\tpublic static final field PIXELS Lcom/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LineWidthUnitValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LocationIndicatorLayerKt {\n\tpublic static final fun LocationIndicatorLayer (Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/LocationIndicatorLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun LocationIndicatorLayer (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/LocationIndicatorLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getAccuracyRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getAccuracyRadiusBorderColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getAccuracyRadiusBorderColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getAccuracyRadiusBorderColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getAccuracyRadiusColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getAccuracyRadiusColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getAccuracyRadiusColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getAccuracyRadiusTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getBearing ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getBearingImage ()Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic final fun getBearingImageSize ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getBearingImageSizeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getBearingTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getEmphasisCircleColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getEmphasisCircleColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getEmphasisCircleColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getEmphasisCircleGlowRange ()Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic final fun getEmphasisCircleGlowRangeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getEmphasisCircleRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getEmphasisCircleRadiusTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getImagePitchDisplacement ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLocation ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getLocationIndicatorOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getLocationIndicatorOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getLocationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getPerspectiveCompensation ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getShadowImage ()Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic final fun getShadowImageSize ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getShadowImageSizeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getTopImage ()Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic final fun getTopImageSize ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTopImageSizeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setAccuracyRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setAccuracyRadiusBorderColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setAccuracyRadiusBorderColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setAccuracyRadiusBorderColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setAccuracyRadiusColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setAccuracyRadiusColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setAccuracyRadiusColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setAccuracyRadiusTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setBearing (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setBearingImage (Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;)V\n\tpublic final fun setBearingImageSize (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setBearingImageSizeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setBearingTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setEmphasisCircleColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setEmphasisCircleColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setEmphasisCircleColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setEmphasisCircleGlowRange (Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;)V\n\tpublic final fun setEmphasisCircleGlowRangeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setEmphasisCircleRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setEmphasisCircleRadiusTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setImagePitchDisplacement (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLocation (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setLocationIndicatorOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setLocationIndicatorOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setLocationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setPerspectiveCompensation (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setShadowImage (Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;)V\n\tpublic final fun setShadowImageSize (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setShadowImageSizeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setTopImage (Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;)V\n\tpublic final fun setTopImageSize (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTopImageSizeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue;\n\tpublic static final field GROUND Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue;\n\tpublic static final field SEA Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ModelLayerKt {\n\tpublic static final fun ModelLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun ModelLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ModelLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getModelAllowDensityReduction ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getModelAmbientOcclusionIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getModelAmbientOcclusionIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelCastShadows ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getModelColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getModelColorMixIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getModelColorMixIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getModelCutoffFadeRange ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getModelElevationReference ()Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue;\n\tpublic final fun getModelEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getModelEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelHeightBasedEmissiveStrengthMultiplier ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getModelHeightBasedEmissiveStrengthMultiplierTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelId ()Lcom/mapbox/maps/extension/compose/style/layers/ModelIdValue;\n\tpublic final fun getModelOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getModelOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelReceiveShadows ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getModelRotation ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getModelRotationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelRoughness ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getModelRoughnessTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelScale ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getModelScaleMode ()Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue;\n\tpublic final fun getModelScaleTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelTranslation ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getModelTranslationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getModelType ()Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setModelAllowDensityReduction (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setModelAmbientOcclusionIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setModelAmbientOcclusionIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelCastShadows (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setModelColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setModelColorMixIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setModelColorMixIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setModelCutoffFadeRange (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setModelElevationReference (Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelElevationReferenceValue;)V\n\tpublic final fun setModelEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setModelEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelHeightBasedEmissiveStrengthMultiplier (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setModelHeightBasedEmissiveStrengthMultiplierTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelId (Lcom/mapbox/maps/extension/compose/style/layers/ModelIdValue;)V\n\tpublic final fun setModelOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setModelOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelReceiveShadows (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setModelRotation (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setModelRotationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelRoughness (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setModelRoughnessTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelScale (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setModelScaleMode (Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue;)V\n\tpublic final fun setModelScaleTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelTranslation (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setModelTranslationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setModelType (Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ModelScaleModeValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field COMMON_3D Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue;\n\tpublic static final field LOCATION_INDICATOR Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/ModelTypeValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field ANCHOR Lcom/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue;\n\tpublic static final field PIXEL Lcom/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/RasterLayerKt {\n\tpublic static final fun RasterLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun RasterLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/RasterLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getRasterArrayBand ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getRasterBrightnessMax ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterBrightnessMaxTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterBrightnessMin ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterBrightnessMinTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getRasterColorMix ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getRasterColorMixTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterColorRange ()Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic final fun getRasterColorRangeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getRasterContrast ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterContrastTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterElevation ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterElevationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterFadeDuration ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterHueRotate ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterHueRotateTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterResampling ()Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue;\n\tpublic final fun getRasterSaturation ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterSaturationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setRasterArrayBand (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setRasterBrightnessMax (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterBrightnessMaxTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterBrightnessMin (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterBrightnessMinTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setRasterColorMix (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setRasterColorMixTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterColorRange (Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;)V\n\tpublic final fun setRasterColorRangeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setRasterContrast (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterContrastTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterElevation (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterElevationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterFadeDuration (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterHueRotate (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterHueRotateTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterResampling (Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue;)V\n\tpublic final fun setRasterSaturation (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterSaturationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/RasterParticleLayerKt {\n\tpublic static final fun RasterParticleLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterParticleLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun RasterParticleLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/RasterParticleLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getRasterParticleArrayBand ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getRasterParticleColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getRasterParticleColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getRasterParticleCount ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getRasterParticleFadeOpacityFactor ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterParticleFadeOpacityFactorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getRasterParticleMaxSpeed ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterParticleResetRateFactor ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterParticleSpeedFactor ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getRasterParticleSpeedFactorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setRasterParticleArrayBand (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setRasterParticleColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setRasterParticleColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setRasterParticleCount (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setRasterParticleFadeOpacityFactor (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterParticleFadeOpacityFactorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setRasterParticleMaxSpeed (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterParticleResetRateFactor (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterParticleSpeedFactor (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setRasterParticleSpeedFactorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue;\n\tpublic static final field LINEAR Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue;\n\tpublic static final field NEAREST Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/RasterResamplingValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SkyLayerKt {\n\tpublic static final fun SkyLayer (Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun SkyLayer (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SkyLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getSkyAtmosphereColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getSkyAtmosphereColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getSkyAtmosphereHaloColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getSkyAtmosphereHaloColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getSkyAtmosphereSun ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getSkyAtmosphereSunIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getSkyGradient ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getSkyGradientCenter ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getSkyGradientRadius ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getSkyGradientUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getSkyOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getSkyOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getSkyType ()Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setSkyAtmosphereColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setSkyAtmosphereColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setSkyAtmosphereHaloColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setSkyAtmosphereHaloColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setSkyAtmosphereSun (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setSkyAtmosphereSunIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setSkyGradient (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setSkyGradientCenter (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setSkyGradientRadius (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setSkyGradientUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setSkyOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setSkyOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setSkyType (Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field ATMOSPHERE Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue;\n\tpublic static final field GRADIENT Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SkyTypeValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue;\n\tpublic static final field GROUND Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue;\n\tpublic static final field SEA Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SymbolLayerKt {\n\tpublic static final fun SymbolLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolLayerState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun SymbolLayer (Lcom/mapbox/maps/extension/compose/style/sources/SourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SymbolLayerState {\n\tpublic fun <init> ()V\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/compose/style/layers/Filter;\n\tpublic final fun getIconAllowOverlap ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getIconAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;\n\tpublic final fun getIconColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getIconColorBrightnessMax ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconColorBrightnessMin ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconColorContrast ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconColorSaturation ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconColorSaturationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIconColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIconColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getIconEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIconHaloBlur ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconHaloBlurTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIconHaloColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getIconHaloColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIconHaloColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getIconHaloWidth ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconHaloWidthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIconIgnorePlacement ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getIconImage ()Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;\n\tpublic final fun getIconImageCrossFade ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconImageCrossFadeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIconKeepUpright ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getIconOcclusionOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconOcclusionOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIconOffset ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getIconOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIconOptional ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getIconPadding ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconPitchAlignment ()Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue;\n\tpublic final fun getIconRotate ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconRotationAlignment ()Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue;\n\tpublic final fun getIconSize ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIconSizeScaleRange ()Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic final fun getIconTextFit ()Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;\n\tpublic final fun getIconTextFitPadding ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getIconTranslate ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getIconTranslateAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue;\n\tpublic final fun getIconTranslateTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getOcclusionOpacityMode ()Lcom/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue;\n\tpublic final fun getSourceLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getSymbolAvoidEdges ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getSymbolElevationReference ()Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue;\n\tpublic final fun getSymbolPlacement ()Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue;\n\tpublic final fun getSymbolSortKey ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getSymbolSpacing ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getSymbolZElevate ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getSymbolZOffset ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getSymbolZOffsetTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getSymbolZOrder ()Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue;\n\tpublic final fun getTextAllowOverlap ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getTextAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic final fun getTextColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getTextColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getTextColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getTextEmissiveStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getTextField ()Lcom/mapbox/maps/extension/compose/style/layers/FormattedValue;\n\tpublic final fun getTextFont ()Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic final fun getTextHaloBlur ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextHaloBlurTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getTextHaloColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getTextHaloColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getTextHaloColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getTextHaloWidth ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextHaloWidthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getTextIgnorePlacement ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getTextJustify ()Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;\n\tpublic final fun getTextKeepUpright ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getTextLetterSpacing ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextLineHeight ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextMaxAngle ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextMaxWidth ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextOcclusionOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextOcclusionOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getTextOffset ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getTextOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getTextOptional ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getTextPadding ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextPitchAlignment ()Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue;\n\tpublic final fun getTextRadialOffset ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextRotate ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextRotationAlignment ()Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue;\n\tpublic final fun getTextSize ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTextSizeScaleRange ()Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;\n\tpublic final fun getTextTransform ()Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue;\n\tpublic final fun getTextTranslate ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getTextTranslateAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue;\n\tpublic final fun getTextTranslateTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getTextVariableAnchor ()Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchorListValue;\n\tpublic final fun getTextWritingMode ()Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingModeListValue;\n\tpublic final fun getVisibility ()Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic final fun setFilter (Lcom/mapbox/maps/extension/compose/style/layers/Filter;)V\n\tpublic final fun setIconAllowOverlap (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setIconAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconAnchorValue;)V\n\tpublic final fun setIconColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setIconColorBrightnessMax (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconColorBrightnessMin (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconColorContrast (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconColorSaturation (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconColorSaturationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIconColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIconColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setIconEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIconHaloBlur (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconHaloBlurTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIconHaloColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setIconHaloColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIconHaloColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setIconHaloWidth (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconHaloWidthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIconIgnorePlacement (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setIconImage (Lcom/mapbox/maps/extension/compose/style/layers/ImageValue;)V\n\tpublic final fun setIconImageCrossFade (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconImageCrossFadeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIconKeepUpright (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setIconOcclusionOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconOcclusionOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIconOffset (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setIconOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIconOptional (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setIconPadding (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconPitchAlignment (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconPitchAlignmentValue;)V\n\tpublic final fun setIconRotate (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconRotationAlignment (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconRotationAlignmentValue;)V\n\tpublic final fun setIconSize (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIconSizeScaleRange (Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;)V\n\tpublic final fun setIconTextFit (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTextFitValue;)V\n\tpublic final fun setIconTextFitPadding (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setIconTranslate (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setIconTranslateAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/IconTranslateAnchorValue;)V\n\tpublic final fun setIconTranslateTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/layers/LayerInteractionsState;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setOcclusionOpacityMode (Lcom/mapbox/maps/extension/compose/style/layers/generated/OcclusionOpacityModeValue;)V\n\tpublic final fun setSourceLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setSymbolAvoidEdges (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setSymbolElevationReference (Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolElevationReferenceValue;)V\n\tpublic final fun setSymbolPlacement (Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue;)V\n\tpublic final fun setSymbolSortKey (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setSymbolSpacing (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setSymbolZElevate (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setSymbolZOffset (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setSymbolZOffsetTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setSymbolZOrder (Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue;)V\n\tpublic final fun setTextAllowOverlap (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setTextAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;)V\n\tpublic final fun setTextColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setTextColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setTextColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setTextEmissiveStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextEmissiveStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setTextField (Lcom/mapbox/maps/extension/compose/style/layers/FormattedValue;)V\n\tpublic final fun setTextFont (Lcom/mapbox/maps/extension/compose/style/StringListValue;)V\n\tpublic final fun setTextHaloBlur (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextHaloBlurTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setTextHaloColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setTextHaloColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setTextHaloColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setTextHaloWidth (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextHaloWidthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setTextIgnorePlacement (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setTextJustify (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;)V\n\tpublic final fun setTextKeepUpright (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setTextLetterSpacing (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextLineHeight (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextMaxAngle (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextMaxWidth (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextOcclusionOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextOcclusionOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setTextOffset (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setTextOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setTextOptional (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setTextPadding (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextPitchAlignment (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue;)V\n\tpublic final fun setTextRadialOffset (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextRotate (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextRotationAlignment (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue;)V\n\tpublic final fun setTextSize (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTextSizeScaleRange (Lcom/mapbox/maps/extension/compose/style/DoubleRangeValue;)V\n\tpublic final fun setTextTransform (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue;)V\n\tpublic final fun setTextTranslate (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setTextTranslateAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue;)V\n\tpublic final fun setTextTranslateTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setTextVariableAnchor (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchorListValue;)V\n\tpublic final fun setTextWritingMode (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingModeListValue;)V\n\tpublic final fun setVisibility (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue;\n\tpublic static final field LINE Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue;\n\tpublic static final field LINE_CENTER Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue;\n\tpublic static final field POINT Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SymbolPlacementValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue;\n\tpublic static final field SOURCE Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue;\n\tpublic static final field VIEWPORT_Y Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/SymbolZOrderValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field BOTTOM Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static final field BOTTOM_LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static final field BOTTOM_RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static final field CENTER Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static final field LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static final field RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static final field TOP Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static final field TOP_LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static final field TOP_RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextAnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;\n\tpublic static final field CENTER Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;\n\tpublic static final field LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;\n\tpublic static final field RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextJustifyValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextPitchAlignmentValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextRotationAlignmentValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue;\n\tpublic static final field LOWERCASE Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue;\n\tpublic static final field UPPERCASE Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextTransformValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextTranslateAnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor {\n\tpublic static final field BOTTOM Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic static final field BOTTOM_LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic static final field BOTTOM_RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic static final field CENTER Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor$Companion;\n\tpublic static final field LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic static final field RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic static final field TOP Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic static final field TOP_LEFT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic static final field TOP_RIGHT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchor$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchorListValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchorListValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchorListValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchorListValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchorListValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchorListValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextVariableAnchorListValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextWritingMode {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingMode$Companion;\n\tpublic static final field HORIZONTAL Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingMode;\n\tpublic static final field VERTICAL Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingMode;\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingMode;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingMode;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingMode;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextWritingMode$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextWritingModeListValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingModeListValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingModeListValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingModeListValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingModeListValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/TextWritingModeListValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/TextWritingModeListValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic static final field VISIBLE Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/layers/generated/VisibilityValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/LightsState {\n\tpublic static final field $stable I\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/lights/LightsState$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/lights/LightsState;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState;Lcom/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/compose/style/lights/generated/FlatLightState;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/LightsState$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic fun hashCode ()I\n\tpublic final fun setColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState$Holder : android/os/Parcelable {\n\tpublic static final field $stable I\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic fun <init> (Ljava/util/Map;)V\n\tpublic final fun component1 ()Ljava/util/Map;\n\tpublic final fun copy (Ljava/util/Map;)Lcom/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState$Holder;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState$Holder;Ljava/util/Map;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState$Holder;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getSavedProperties ()Ljava/util/Map;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState$Holder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState$Holder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState$Holder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/AmbientLightStateKt {\n\tpublic static final fun rememberAmbientLightState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/AnchorValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/lights/generated/AnchorValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/lights/generated/AnchorValue;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/compose/style/lights/generated/AnchorValue;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/compose/style/lights/generated/AnchorValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/lights/generated/AnchorValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/lights/generated/AnchorValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/lights/generated/AnchorValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/AnchorValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCastShadows ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getDirection ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getDirectionTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getShadowDrawBeforeLayer ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getShadowIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getShadowIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic fun hashCode ()I\n\tpublic final fun setCastShadows (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setDirection (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setDirectionTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setShadowDrawBeforeLayer (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setShadowIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setShadowIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState$Holder : android/os/Parcelable {\n\tpublic static final field $stable I\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic fun <init> (Ljava/util/Map;)V\n\tpublic final fun component1 ()Ljava/util/Map;\n\tpublic final fun copy (Ljava/util/Map;)Lcom/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState$Holder;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState$Holder;Ljava/util/Map;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState$Holder;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getSavedProperties ()Ljava/util/Map;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState$Holder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState$Holder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState$Holder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightStateKt {\n\tpublic static final fun rememberDirectionalLightState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/FlatLightState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/lights/generated/FlatLightState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAnchor ()Lcom/mapbox/maps/extension/compose/style/lights/generated/AnchorValue;\n\tpublic final fun getColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getPosition ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getPositionTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic fun hashCode ()I\n\tpublic final fun setAnchor (Lcom/mapbox/maps/extension/compose/style/lights/generated/AnchorValue;)V\n\tpublic final fun setColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setPosition (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setPositionTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/FlatLightState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/FlatLightState$Holder : android/os/Parcelable {\n\tpublic static final field $stable I\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic fun <init> (Ljava/util/Map;)V\n\tpublic final fun component1 ()Ljava/util/Map;\n\tpublic final fun copy (Ljava/util/Map;)Lcom/mapbox/maps/extension/compose/style/lights/generated/FlatLightState$Holder;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/lights/generated/FlatLightState$Holder;Ljava/util/Map;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/lights/generated/FlatLightState$Holder;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getSavedProperties ()Ljava/util/Map;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/FlatLightState$Holder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/style/lights/generated/FlatLightState$Holder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/style/lights/generated/FlatLightState$Holder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/lights/generated/FlatLightStateKt {\n\tpublic static final fun rememberFlatLightState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/lights/generated/FlatLightState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/RainState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState$Companion;\n\tpublic static final field DISABLED Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState;\n\tpublic fun <init> ()V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/compose/style/precipitations/RainStateApplier;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/ColorValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleListValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleListValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/ColorValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCenterThinning ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getCenterThinningTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getDensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getDensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getDirection ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getDirectionTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getDistortionStrength ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getDistortionStrengthTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getDropletSize ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getDropletSizeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getVignette ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getVignetteColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getVignetteColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getVignetteColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVignetteTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic fun hashCode ()I\n\tpublic final fun setCenterThinning (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setCenterThinningTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setDensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setDensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setDirection (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setDirectionTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setDistortionStrength (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setDistortionStrengthTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setDropletSize (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setDropletSizeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setVignette (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setVignetteColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setVignetteColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setVignetteColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVignetteTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/RainState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/RainState$Holder : android/os/Parcelable {\n\tpublic static final field $stable I\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic final fun component1 ()Ljava/util/Map;\n\tpublic final fun component2 ()Z\n\tpublic final fun copy (Ljava/util/Map;Z)Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState$Holder;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState$Holder;Ljava/util/Map;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState$Holder;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getSavedProperties ()Ljava/util/Map;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/RainState$Holder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState$Holder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState$Holder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/RainStateKt {\n\tpublic static final fun rememberRainState (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/SnowState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState$Companion;\n\tpublic static final field DISABLED Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState;\n\tpublic fun <init> ()V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/compose/style/precipitations/SnowStateApplier;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/ColorValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleListValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/ColorValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCenterThinning ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getCenterThinningTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getDensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getDensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getDirection ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getDirectionTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getFlakeSize ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFlakeSizeTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getIntensity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getOpacity ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getOpacityTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getVignette ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getVignetteColor ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getVignetteColorTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic final fun getVignetteColorUseTheme ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVignetteTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic fun hashCode ()I\n\tpublic final fun setCenterThinning (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setCenterThinningTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setDensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setDensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setDirection (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setDirectionTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setFlakeSize (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFlakeSizeTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setIntensity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setIntensityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setOpacity (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setOpacityTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setVignette (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setVignetteColor (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setVignetteColorTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic final fun setVignetteColorUseTheme (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVignetteTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/SnowState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/SnowState$Holder : android/os/Parcelable {\n\tpublic static final field $stable I\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic final fun component1 ()Ljava/util/Map;\n\tpublic final fun component2 ()Z\n\tpublic final fun copy (Ljava/util/Map;Z)Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState$Holder;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState$Holder;Ljava/util/Map;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState$Holder;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getSavedProperties ()Ljava/util/Map;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/SnowState$Holder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState$Holder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState$Holder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/precipitations/generated/SnowStateKt {\n\tpublic static final fun rememberSnowState (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/projection/generated/Projection {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;\n\tpublic static final field GLOBE Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;\n\tpublic static final field MERCATOR Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getProjectionNameOrNull ()Ljava/lang/String;\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/projection/generated/Projection$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/ClusterProperties : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/ClusterProperties$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/sources/ClusterProperties;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/util/HashMap;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/sources/ClusterProperties;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/sources/ClusterProperties;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/sources/ClusterProperties;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/ClusterProperties$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/GeoJSONData {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;\n\tpublic fun <init> (Lcom/mapbox/geojson/Feature;)V\n\tpublic fun <init> (Lcom/mapbox/geojson/Geometry;)V\n\tpublic fun <init> (Lcom/mapbox/maps/GeoJSONSourceData;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic final fun copy (Lcom/mapbox/maps/GeoJSONSourceData;)Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;Lcom/mapbox/maps/GeoJSONSourceData;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/GeoJSONData$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/ModelSourceModelsValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/ModelSourceModelsValue$Companion;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Ljava/util/HashMap;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/sources/ModelSourceModelsValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/sources/ModelSourceModelsValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/sources/ModelSourceModelsValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/ModelSourceModelsValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/PromoteIdValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/PromoteIdValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/RasterLayers : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/RasterLayers$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/sources/RasterLayers;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/sources/RasterLayers;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/sources/RasterLayers;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/sources/RasterLayers;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/RasterLayers$Companion {\n}\n\npublic abstract class com/mapbox/maps/extension/compose/style/sources/SourceState {\n\tpublic static final field $stable I\n\tprotected final fun getGeoJSONData ()Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;\n\tprotected final fun getProperty (Ljava/lang/String;)Lcom/mapbox/bindgen/Value;\n\tprotected final fun getSetBuilderPropertyAction ()Lkotlin/reflect/KFunction;\n\tprotected final fun getSetPropertyAction ()Lkotlin/reflect/KFunction;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tprotected final fun setGeoJSONData (Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/SourceState$Holder : android/os/Parcelable {\n\tpublic static final field $stable I\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/util/Map;\n\tpublic final fun component3 ()Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;\n\tpublic final fun copy (Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;)Lcom/mapbox/maps/extension/compose/style/sources/SourceState$Holder;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/sources/SourceState$Holder;Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/sources/SourceState$Holder;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getGeoJSONData ()Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;\n\tpublic final fun getSavedProperties ()Ljava/util/Map;\n\tpublic final fun getSourcedId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/SourceState$Holder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/style/sources/SourceState$Holder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/style/sources/SourceState$Holder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/TileCacheBudget : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/TileCacheBudgetInMegabytes;)V\n\tpublic fun <init> (Lcom/mapbox/maps/TileCacheBudgetInTiles;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/TileCacheBudget$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/EncodingValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue;\n\tpublic static final field MAPBOX Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue;\n\tpublic static final field TERRARIUM Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/EncodingValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/GeoJsonSourceState : com/mapbox/maps/extension/compose/style/sources/SourceState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/generated/GeoJsonSourceState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/sources/ClusterProperties;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAttribution ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getAutoMaxZoom ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getBuffer ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getCluster ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getClusterMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getClusterMinPoints ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getClusterProperties ()Lcom/mapbox/maps/extension/compose/style/sources/ClusterProperties;\n\tpublic final fun getClusterRadius ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getData ()Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;\n\tpublic final fun getGenerateId ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getLineMetrics ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getPrefetchZoomDelta ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getPromoteId ()Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;\n\tpublic final fun getTolerance ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic fun hashCode ()I\n\tpublic final fun setAttribution (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setAutoMaxZoom (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setBuffer (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setCluster (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setClusterMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setClusterMinPoints (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setClusterProperties (Lcom/mapbox/maps/extension/compose/style/sources/ClusterProperties;)V\n\tpublic final fun setClusterRadius (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setData (Lcom/mapbox/maps/extension/compose/style/sources/GeoJSONData;)V\n\tpublic final fun setGenerateId (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setLineMetrics (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setPrefetchZoomDelta (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setPromoteId (Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;)V\n\tpublic final fun setTileCacheBudget (Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;)V\n\tpublic final fun setTolerance (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/GeoJsonSourceState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/GeoJsonSourceStateKt {\n\tpublic static final fun rememberGeoJsonSourceState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/sources/generated/GeoJsonSourceState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/ImageSourceState : com/mapbox/maps/extension/compose/style/sources/SourceState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/generated/ImageSourceState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/PointListValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCoordinates ()Lcom/mapbox/maps/extension/compose/style/PointListValue;\n\tpublic final fun getPrefetchZoomDelta ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getUrl ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic fun hashCode ()I\n\tpublic final fun setCoordinates (Lcom/mapbox/maps/extension/compose/style/PointListValue;)V\n\tpublic final fun setPrefetchZoomDelta (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setUrl (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/ImageSourceState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/ImageSourceStateKt {\n\tpublic static final fun rememberImageSourceState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/sources/generated/ImageSourceState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/ModelSourceState : com/mapbox/maps/extension/compose/style/sources/SourceState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/generated/ModelSourceState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/StringListValue;Lcom/mapbox/maps/extension/compose/style/sources/ModelSourceModelsValue;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getModels ()Lcom/mapbox/maps/extension/compose/style/sources/ModelSourceModelsValue;\n\tpublic final fun getTiles ()Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic final fun getUrl ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic fun hashCode ()I\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setModels (Lcom/mapbox/maps/extension/compose/style/sources/ModelSourceModelsValue;)V\n\tpublic final fun setTiles (Lcom/mapbox/maps/extension/compose/style/StringListValue;)V\n\tpublic final fun setUrl (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/ModelSourceState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/ModelSourceStateKt {\n\tpublic static final fun rememberModelSourceState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/sources/generated/ModelSourceState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/RasterArraySourceState : com/mapbox/maps/extension/compose/style/sources/SourceState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/generated/RasterArraySourceState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/StringListValue;Lcom/mapbox/maps/extension/compose/style/DoubleListValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/sources/RasterLayers;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAttribution ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getBounds ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getRasterLayers ()Lcom/mapbox/maps/extension/compose/style/sources/RasterLayers;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;\n\tpublic final fun getTileSize ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getTiles ()Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic final fun getUrl ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVolatile ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic fun hashCode ()I\n\tpublic final fun setAttribution (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setBounds (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setRasterLayers (Lcom/mapbox/maps/extension/compose/style/sources/RasterLayers;)V\n\tpublic final fun setTileCacheBudget (Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;)V\n\tpublic final fun setTileSize (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setTiles (Lcom/mapbox/maps/extension/compose/style/StringListValue;)V\n\tpublic final fun setUrl (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVolatile (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/RasterArraySourceState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/RasterArraySourceStateKt {\n\tpublic static final fun rememberRasterArraySourceState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/sources/generated/RasterArraySourceState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/RasterDemSourceState : com/mapbox/maps/extension/compose/style/sources/SourceState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/generated/RasterDemSourceState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/StringListValue;Lcom/mapbox/maps/extension/compose/style/DoubleListValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAttribution ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getBounds ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getEncoding ()Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue;\n\tpublic final fun getMaxOverscaleFactorForParentTiles ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinimumTileUpdateInterval ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getPrefetchZoomDelta ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;\n\tpublic final fun getTileNetworkRequestsDelay ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTileRequestsDelay ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTileSize ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getTiles ()Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic final fun getUrl ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVolatile ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic fun hashCode ()I\n\tpublic final fun setAttribution (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setBounds (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setEncoding (Lcom/mapbox/maps/extension/compose/style/sources/generated/EncodingValue;)V\n\tpublic final fun setMaxOverscaleFactorForParentTiles (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinimumTileUpdateInterval (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setPrefetchZoomDelta (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setTileCacheBudget (Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;)V\n\tpublic final fun setTileNetworkRequestsDelay (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTileRequestsDelay (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTileSize (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setTiles (Lcom/mapbox/maps/extension/compose/style/StringListValue;)V\n\tpublic final fun setUrl (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVolatile (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/RasterDemSourceState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/RasterDemSourceStateKt {\n\tpublic static final fun rememberRasterDemSourceState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/sources/generated/RasterDemSourceState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/RasterSourceState : com/mapbox/maps/extension/compose/style/sources/SourceState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/generated/RasterSourceState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/StringListValue;Lcom/mapbox/maps/extension/compose/style/DoubleListValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAttribution ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getBounds ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getMaxOverscaleFactorForParentTiles ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinimumTileUpdateInterval ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getPrefetchZoomDelta ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getScheme ()Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;\n\tpublic final fun getTileNetworkRequestsDelay ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTileRequestsDelay ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTileSize ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getTiles ()Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic final fun getUrl ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVolatile ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic fun hashCode ()I\n\tpublic final fun setAttribution (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setBounds (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setMaxOverscaleFactorForParentTiles (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinimumTileUpdateInterval (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setPrefetchZoomDelta (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setScheme (Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;)V\n\tpublic final fun setTileCacheBudget (Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;)V\n\tpublic final fun setTileNetworkRequestsDelay (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTileRequestsDelay (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTileSize (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setTiles (Lcom/mapbox/maps/extension/compose/style/StringListValue;)V\n\tpublic final fun setUrl (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVolatile (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/RasterSourceState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/RasterSourceStateKt {\n\tpublic static final fun rememberRasterSourceState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/sources/generated/RasterSourceState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/SchemeValue : com/mapbox/maps/extension/compose/style/HoldsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;\n\tpublic static final field TMS Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;\n\tpublic static final field XYZ Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun isNotInitial ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/SchemeValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/VectorSourceState : com/mapbox/maps/extension/compose/style/sources/SourceState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/sources/generated/VectorSourceState$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/StringListValue;Lcom/mapbox/maps/extension/compose/style/DoubleListValue;Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/StringValue;Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/LongValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAttribution ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getBounds ()Lcom/mapbox/maps/extension/compose/style/DoubleListValue;\n\tpublic final fun getMaxOverscaleFactorForParentTiles ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMaxZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinZoom ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getMinimumTileUpdateInterval ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getPrefetchZoomDelta ()Lcom/mapbox/maps/extension/compose/style/LongValue;\n\tpublic final fun getPromoteId ()Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;\n\tpublic final fun getScheme ()Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;\n\tpublic final fun getTileNetworkRequestsDelay ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTileRequestsDelay ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getTiles ()Lcom/mapbox/maps/extension/compose/style/StringListValue;\n\tpublic final fun getUrl ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getVolatile ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic fun hashCode ()I\n\tpublic final fun setAttribution (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setBounds (Lcom/mapbox/maps/extension/compose/style/DoubleListValue;)V\n\tpublic final fun setMaxOverscaleFactorForParentTiles (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMaxZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinZoom (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setMinimumTileUpdateInterval (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setPrefetchZoomDelta (Lcom/mapbox/maps/extension/compose/style/LongValue;)V\n\tpublic final fun setPromoteId (Lcom/mapbox/maps/extension/compose/style/sources/PromoteIdValue;)V\n\tpublic final fun setScheme (Lcom/mapbox/maps/extension/compose/style/sources/generated/SchemeValue;)V\n\tpublic final fun setTileCacheBudget (Lcom/mapbox/maps/extension/compose/style/sources/TileCacheBudget;)V\n\tpublic final fun setTileNetworkRequestsDelay (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTileRequestsDelay (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setTiles (Lcom/mapbox/maps/extension/compose/style/StringListValue;)V\n\tpublic final fun setUrl (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setVolatile (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/VectorSourceState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/sources/generated/VectorSourceStateKt {\n\tpublic static final fun rememberVectorSourceState (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/sources/generated/VectorSourceState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue {\n\tpublic static final field CIRCLE Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getPresetNameOrNull ()Ljava/lang/String;\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue$Companion {\n}\n\npublic class com/mapbox/maps/extension/compose/style/standard/BaseStandardStyleState {\n\tprotected fun <init> (Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState;Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState;Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getAtmosphereState ()Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;\n\tpublic final fun getLightsState ()Lcom/mapbox/maps/extension/compose/style/lights/LightsState;\n\tpublic final fun getProjection ()Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;\n\tpublic final fun getRainState ()Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState;\n\tpublic final fun getSnowState ()Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState;\n\tpublic final fun getStyleTransition ()Lcom/mapbox/maps/TransitionOptions;\n\tpublic final fun getTerrainState ()Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;\n\tpublic final fun setAtmosphereState (Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;)V\n\tpublic final fun setLightsState (Lcom/mapbox/maps/extension/compose/style/lights/LightsState;)V\n\tpublic final fun setProjection (Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;)V\n\tpublic final fun setRainState (Lcom/mapbox/maps/extension/compose/style/precipitations/generated/RainState;)V\n\tpublic final fun setSnowState (Lcom/mapbox/maps/extension/compose/style/precipitations/generated/SnowState;)V\n\tpublic final fun setStyleTransition (Lcom/mapbox/maps/TransitionOptions;)V\n\tpublic final fun setTerrainState (Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;)V\n}\n\npublic abstract class com/mapbox/maps/extension/compose/style/standard/BaseStyleConfigurationState {\n\tprotected fun <init> ()V\n\tprotected fun <init> (Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/BooleanValue;Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;Lcom/mapbox/maps/extension/compose/style/StringValue;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getFont ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getLightPreset ()Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;\n\tpublic final fun getShowPlaceLabels ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShowPointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShowRoadLabels ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShowTransitLabels ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun setFont (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setLightPreset (Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;)V\n\tpublic final fun setShowPlaceLabels (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShowPointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShowRoadLabels (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShowTransitLabels (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;\n\tpublic static final field DEFAULT_COLOR Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;\n\tpublic static final field SINGLE Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getPresetNameOrNull ()Ljava/lang/String;\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/LightPresetValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue$Companion;\n\tpublic static final field DAWN Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;\n\tpublic static final field DAY Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;\n\tpublic static final field DUSK Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;\n\tpublic static final field NIGHT Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/LightPresetValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getPresetNameOrNull ()Ljava/lang/String;\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/LightPresetValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/MapboxStandardSatelliteStyleKt {\n\tpublic static final fun MapboxStandardSatelliteStyle (Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;Lcom/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleConfigurationState;Landroidx/compose/runtime/Composer;III)V\n\tpublic static final fun MapboxStandardSatelliteStyle (Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V\n\tpublic static final fun MapboxStandardSatelliteStyle (Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleConfigurationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun MapboxStandardSatelliteStyle (Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun MapboxStandardSatelliteStyle (Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lcom/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleState;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/MapboxStandardStyleKt {\n\tpublic static final fun MapboxStandardStyle (Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/extension/compose/style/standard/StandardStyleConfigurationState;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun MapboxStandardStyle (Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lcom/mapbox/maps/extension/compose/style/projection/generated/Projection;Lcom/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState;Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;Lcom/mapbox/maps/extension/compose/style/lights/LightsState;Lcom/mapbox/maps/TransitionOptions;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V\n\tpublic static final fun MapboxStandardStyle (Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lcom/mapbox/maps/extension/compose/style/standard/StandardStyleState;Landroidx/compose/runtime/Composer;II)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleConfigurationState : com/mapbox/maps/extension/compose/style/standard/BaseStyleConfigurationState {\n\tpublic fun <init> ()V\n\tpublic final fun getBackgroundPointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;\n\tpublic final fun getColorAdminBoundaries ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorModePointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;\n\tpublic final fun getColorMotorways ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorPlaceLabelHighlight ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorPlaceLabelSelect ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorPlaceLabels ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorPointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorRoadLabels ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorRoads ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorTrunks ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getDensityPointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFuelingStationModePointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getRoadsBrightness ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getShowAdminBoundaries ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShowPedestrianRoads ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShowRoadsAndTransit ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun setBackgroundPointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;)V\n\tpublic final fun setColorAdminBoundaries (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorModePointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;)V\n\tpublic final fun setColorMotorways (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorPlaceLabelHighlight (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorPlaceLabelSelect (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorPlaceLabels (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorPointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorRoadLabels (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorRoads (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorTrunks (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setDensityPointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFuelingStationModePointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setRoadsBrightness (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setShowAdminBoundaries (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShowPedestrianRoads (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShowRoadsAndTransit (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleState : com/mapbox/maps/extension/compose/style/standard/BaseStandardStyleState {\n\tpublic fun <init> ()V\n\tpublic final fun getConfigurationsState ()Lcom/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleConfigurationState;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;\n\tpublic final fun setConfigurationsState (Lcom/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleConfigurationState;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleStateKt {\n\tpublic static final fun rememberStandardSatelliteStyleState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/StandardStyleConfigurationState : com/mapbox/maps/extension/compose/style/standard/BaseStyleConfigurationState {\n\tpublic fun <init> ()V\n\tpublic final fun getBackgroundPointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;\n\tpublic final fun getColorAdminBoundaries ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorBuildingHighlight ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorBuildingSelect ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorBuildings ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorCommercial ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorEducation ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorGreenspace ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorIndustrial ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorLand ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorMedical ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorModePointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;\n\tpublic final fun getColorMotorways ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorPlaceLabelHighlight ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorPlaceLabelSelect ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorPlaceLabels ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorPointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorRoadLabels ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorRoads ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorTrunks ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getColorWater ()Lcom/mapbox/maps/extension/compose/style/ColorValue;\n\tpublic final fun getDensityPointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getFuelingStationModePointOfInterestLabels ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun getRoadsBrightness ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getShow3dBuildings ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShow3dFacades ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShow3dLandmarks ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShow3dObjects ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShow3dTrees ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShowAdminBoundaries ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShowLandmarkIconLabels ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShowLandmarkIcons ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getShowPedestrianRoads ()Lcom/mapbox/maps/extension/compose/style/BooleanValue;\n\tpublic final fun getTheme ()Lcom/mapbox/maps/extension/compose/style/standard/ThemeValue;\n\tpublic final fun getThemeData ()Lcom/mapbox/maps/extension/compose/style/StringValue;\n\tpublic final fun setBackgroundPointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/standard/BackgroundPointOfInterestLabelsValue;)V\n\tpublic final fun setColorAdminBoundaries (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorBuildingHighlight (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorBuildingSelect (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorBuildings (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorCommercial (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorEducation (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorGreenspace (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorIndustrial (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorLand (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorMedical (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorModePointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/standard/ColorModePointOfInterestLabelsValue;)V\n\tpublic final fun setColorMotorways (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorPlaceLabelHighlight (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorPlaceLabelSelect (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorPlaceLabels (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorPointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorRoadLabels (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorRoads (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorTrunks (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setColorWater (Lcom/mapbox/maps/extension/compose/style/ColorValue;)V\n\tpublic final fun setDensityPointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setFuelingStationModePointOfInterestLabels (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n\tpublic final fun setRoadsBrightness (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setShow3dBuildings (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShow3dFacades (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShow3dLandmarks (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShow3dObjects (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShow3dTrees (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShowAdminBoundaries (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShowLandmarkIconLabels (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShowLandmarkIcons (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setShowPedestrianRoads (Lcom/mapbox/maps/extension/compose/style/BooleanValue;)V\n\tpublic final fun setTheme (Lcom/mapbox/maps/extension/compose/style/standard/ThemeValue;)V\n\tpublic final fun setThemeData (Lcom/mapbox/maps/extension/compose/style/StringValue;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/StandardStyleState : com/mapbox/maps/extension/compose/style/standard/BaseStandardStyleState {\n\tpublic fun <init> ()V\n\tpublic final fun getConfigurationsState ()Lcom/mapbox/maps/extension/compose/style/standard/StandardStyleConfigurationState;\n\tpublic final fun getInteractionsState ()Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun setConfigurationsState (Lcom/mapbox/maps/extension/compose/style/standard/StandardStyleConfigurationState;)V\n\tpublic final fun setInteractionsState (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/StandardStyleStateKt {\n\tpublic static final fun rememberStandardStyleState (Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/standard/StandardStyleState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/ThemeValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/standard/ThemeValue$Companion;\n\tpublic static final field DEFAULT Lcom/mapbox/maps/extension/compose/style/standard/ThemeValue;\n\tpublic static final field FADED Lcom/mapbox/maps/extension/compose/style/standard/ThemeValue;\n\tpublic static final field MONOCHROME Lcom/mapbox/maps/extension/compose/style/standard/ThemeValue;\n\tpublic fun <init> (Lcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/compose/style/standard/ThemeValue;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/standard/ThemeValue;Lcom/mapbox/bindgen/Value;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/ThemeValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getPresetNameOrNull ()Ljava/lang/String;\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/ThemeValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState : com/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions {\n\tpublic static final field $stable I\n\tpublic fun <init> ()V\n\tpublic final fun onBuildingsClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onBuildingsClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onBuildingsLongClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onBuildingsLongClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onFeaturesetClicked (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onFeaturesetClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onFeaturesetLongClicked (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onFeaturesetLongClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onLandmarkIconsClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onLandmarkIconsClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onLandmarkIconsLongClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onLandmarkIconsLongClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onLayerClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onLayerClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onLayerLongClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onLayerLongClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onMapClicked (Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onMapLongClicked (Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onPlaceLabelsClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onPlaceLabelsClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onPlaceLabelsLongClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onPlaceLabelsLongClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onPoiClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onPoiClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic final fun onPoiLongClicked (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n\tpublic static synthetic fun onPoiLongClicked$default (Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/Double;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/terrain/generated/TerrainState {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState$Companion;\n\tpublic static final field DISABLED Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/compose/style/sources/generated/RasterDemSourceState;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/compose/style/terrain/TerrainStateApplier;Lcom/mapbox/maps/extension/compose/style/DoubleValue;Lcom/mapbox/maps/extension/compose/style/Transition;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getExaggeration ()Lcom/mapbox/maps/extension/compose/style/DoubleValue;\n\tpublic final fun getExaggerationTransition ()Lcom/mapbox/maps/extension/compose/style/Transition;\n\tpublic fun hashCode ()I\n\tpublic final fun setExaggeration (Lcom/mapbox/maps/extension/compose/style/DoubleValue;)V\n\tpublic final fun setExaggerationTransition (Lcom/mapbox/maps/extension/compose/style/Transition;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/terrain/generated/TerrainState$Companion {\n\tpublic final fun getSaver ()Landroidx/compose/runtime/saveable/Saver;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/terrain/generated/TerrainState$Holder : android/os/Parcelable {\n\tpublic static final field $stable I\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic final fun component1 ()Lcom/mapbox/maps/extension/compose/style/sources/SourceState$Holder;\n\tpublic final fun component2 ()Ljava/util/Map;\n\tpublic final fun component3 ()Z\n\tpublic final fun copy (Lcom/mapbox/maps/extension/compose/style/sources/SourceState$Holder;Ljava/util/Map;Z)Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState$Holder;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState$Holder;Lcom/mapbox/maps/extension/compose/style/sources/SourceState$Holder;Ljava/util/Map;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState$Holder;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getInitial ()Z\n\tpublic final fun getRasterDemSourceStateHolder ()Lcom/mapbox/maps/extension/compose/style/sources/SourceState$Holder;\n\tpublic final fun getSavedProperties ()Ljava/util/Map;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/extension/compose/style/terrain/generated/TerrainState$Holder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState$Holder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState$Holder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/extension/compose/style/terrain/generated/TerrainStateKt {\n\tpublic static final fun rememberTerrainState (Lcom/mapbox/maps/extension/compose/style/sources/generated/RasterDemSourceState;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Lcom/mapbox/maps/extension/compose/style/terrain/generated/TerrainState;\n}\n\n"
  },
  {
    "path": "extension-compose/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n  id(\"kotlin-parcelize\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.extension.compose\"\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    unitTests.apply {\n      isIncludeAndroidResources = true\n    }\n  }\n\n  composeOptions {\n    kotlinCompilerExtensionVersion = libs.versions.compose.get()\n  }\n\n  buildFeatures {\n    compose = true\n  }\n\n  kotlinOptions {\n    freeCompilerArgs += \"-Xexplicit-api=strict\"\n  }\n\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    warningsAsErrors = true\n  }\n\n  buildTypes {\n    debug {\n      ndk {\n        var abi: String =\n          if (System.getenv(\"ANDROID_ABI\") != null) System.getenv(\"ANDROID_ABI\") else \"\"\n        if (abi.isNotBlank()) {\n          abiFilters.add(abi)\n        }\n      }\n    }\n  }\n}\n\nmapboxLibrary {\n  // we skip verifying Java binary compatibility for Compose extension as it is pure Kotlin only\n  jApiCmpEnabled = false\n\n  publish {\n    group = \"com.mapbox.extension\"\n    artifactId = \"maps-compose\"\n    artifactTitle = \"The Jetpack Compose extension for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-compose\"\n  }\n}\n\ndependencies {\n  dependencies {\n    compileOnly(project(\":maps-sdk\"))\n    implementation(platform(libs.compose.bom))\n    implementation(libs.compose.ui)\n    implementation(libs.compose.material)\n    implementation(libs.bundles.base.dependencies)\n\n    implementation(libs.androidx.coreKtx)\n    debugImplementation(libs.compose.uiTestManifest)\n\n    androidTestUtil(libs.androidx.orchestrator)\n\n    androidTestImplementation(libs.androidx.testRunner)\n    androidTestImplementation(libs.androidx.jUnitTestRules)\n    androidTestImplementation(libs.androidx.testJUnit)\n    androidTestImplementation(libs.androidx.espresso)\n    androidTestImplementation(libs.androidx.uiAutomator)\n    androidTestImplementation(project(\":maps-sdk\"))\n    androidTestImplementation(libs.compose.uiTest)\n\n    testImplementation(libs.bundles.base.dependenciesTests)\n    testImplementation(project(\":maps-sdk\"))\n    testImplementation(libs.junit)\n  }\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "extension-compose/lint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<lint>\n    <issue id=\"InvalidColorHexValue\" severity=\"error\" />\n    <issue id=\"MissingColorAlphaChannel\" severity=\"error\" />\n\n    <issue id=\"ComposableLambdaParameterNaming\" severity=\"error\" />\n    <issue id=\"ComposableLambdaParameterPosition\" severity=\"error\" />\n    <issue id=\"ComposableNaming\" severity=\"error\" />\n    <issue id=\"CompositionLocalNaming\" severity=\"error\" />\n<!--    <issue id=\"MutableCollectionMutableState\" severity=\"error\" />-->\n\n    <issue id=\"UnnecessaryComposedModifier\" severity=\"error\" />\n    <issue id=\"ComposableModifierFactory\" severity=\"error\" />\n    <issue id=\"ModifierFactoryReturnType\" severity=\"error\" />\n    <issue id=\"ModifierFactoryExtensionFunction\" severity=\"error\" />\n    <issue id=\"ModifierParameter\" severity=\"error\" />\n<!--    <issue id=\"MultipleAwaitPointerEventScopes\" severity=\"error\" />-->\n<!--    <issue id=\"ReturnFromAwaitPointerEventScope\" severity=\"error\" />-->\n\n<!--    <issue id=\"FrequentlyChangedStateReadInComposition\" severity=\"error\" />-->\n<!--    <issue id=\"UseOfNonLambdaOffsetOverload\" severity=\"error\" />-->\n\n</lint>"
  },
  {
    "path": "extension-compose/src/androidTest/java/com/mapbox/maps/extension/compose/MapIntegrationTests.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material.FloatingActionButton\nimport androidx.compose.material.Icon\nimport androidx.compose.material.Scaffold\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Add\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.platform.testTag\nimport androidx.compose.ui.test.doubleClick\nimport androidx.compose.ui.test.junit4.ComposeContentTestRule\nimport androidx.compose.ui.test.junit4.createComposeRule\nimport androidx.compose.ui.test.onNodeWithContentDescription\nimport androidx.compose.ui.test.onNodeWithTag\nimport androidx.compose.ui.test.onNodeWithText\nimport androidx.compose.ui.test.performClick\nimport androidx.compose.ui.test.performTouchInput\nimport androidx.compose.ui.test.swipeLeft\nimport androidx.compose.ui.test.swipeUp\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.internal.utils.CityLocations\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettings\nimport org.junit.Assert.assertEquals\nimport org.junit.Rule\nimport org.junit.Test\n\npublic class MapIntegrationTests {\n\n  @get:Rule\n  public val composeTestRule: ComposeContentTestRule = createComposeRule()\n\n  @Test\n  public fun testMapViewWhenMapIsLoaded() {\n    var mapView: MapView? = null\n    composeTestRule.setContent {\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapState = rememberMapState()\n        ) {\n          MapEffect(Unit) {\n            mapView = it\n          }\n        }\n      }\n    }\n    composeTestRule.waitUntil(timeoutMillis = 3_000) { mapView != null }\n  }\n\n  @Test\n  public fun testMapDoubleTap() {\n    lateinit var cameraState: CameraState\n    composeTestRule.setContent {\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          center(CityLocations.HELSINKI)\n        }\n      }\n      val mapState = rememberMapState()\n      LaunchedEffect(Unit) {\n        mapState.cameraChangedEvents.collect {\n          cameraState = it.cameraState\n        }\n      }\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapViewportState = mapViewportState,\n          mapState = mapState\n        )\n      }\n    }\n    composeTestRule.onNodeWithTag(MAP_TEST_TAG).performTouchInput { doubleClick() }\n    composeTestRule.waitUntil {\n      cameraState.zoom == ZOOM + 1\n    }\n  }\n\n  @Test\n  public fun testMapDoubleTapDisabled() {\n    lateinit var cameraState: CameraState\n    composeTestRule.setContent {\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          center(CityLocations.HELSINKI)\n        }\n      }\n      val mapState = rememberMapState {\n        gesturesSettings = GesturesSettings { doubleTapToZoomInEnabled = false }\n      }\n      LaunchedEffect(Unit) {\n        mapState.cameraChangedEvents.collect {\n          cameraState = it.cameraState\n        }\n      }\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapViewportState = mapViewportState,\n          mapState = mapState,\n        )\n      }\n    }\n    composeTestRule.onNodeWithTag(MAP_TEST_TAG).performTouchInput { doubleClick() }\n    assertEquals(ZOOM, cameraState.zoom, EPS)\n  }\n\n  @Test\n  public fun testMapPinchToZoomOut() {\n    lateinit var cameraState: CameraState\n    composeTestRule.setContent {\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          center(CityLocations.HELSINKI)\n        }\n      }\n      val mapState = rememberMapState()\n      LaunchedEffect(Unit) {\n        mapState.cameraChangedEvents.collect {\n          cameraState = it.cameraState\n        }\n      }\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapViewportState = mapViewportState,\n          mapState = mapState,\n        )\n      }\n    }\n    composeTestRule.onNodeWithTag(MAP_TEST_TAG).performTouchInput {\n      down(0, center + Offset(0f, -10f))\n      down(1, center + Offset(0f, 10f))\n\n      moveBy(0, Offset(0f, -50f))\n      moveBy(1, Offset(0f, +50f))\n      up(0)\n      up(1)\n    }\n    composeTestRule.waitUntil {\n      cameraState.zoom < ZOOM\n    }\n  }\n\n  @Test\n  public fun testMapScrollDisabled() {\n    lateinit var cameraState: CameraState\n    composeTestRule.setContent {\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          center(CityLocations.HELSINKI)\n        }\n      }\n      val mapState = rememberMapState {\n        gesturesSettings = GesturesSettings {\n          scrollEnabled = false\n        }\n      }\n\n      LaunchedEffect(Unit) {\n        mapState.cameraChangedEvents.collect {\n          cameraState = it.cameraState\n        }\n      }\n\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapState = mapState,\n          mapViewportState = mapViewportState,\n        )\n      }\n    }\n    composeTestRule.onNodeWithTag(MAP_TEST_TAG).performTouchInput {\n      swipeLeft()\n      swipeUp()\n    }\n    assertEquals(CityLocations.HELSINKI.latitude(), cameraState.center.latitude(), EPS)\n    assertEquals(CityLocations.HELSINKI.longitude(), cameraState.center.longitude(), EPS)\n  }\n\n  @Test\n  public fun testMapScrollHorizontally() {\n    lateinit var cameraState: CameraState\n    composeTestRule.setContent {\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          center(CityLocations.HELSINKI)\n        }\n      }\n      val mapState = rememberMapState()\n      LaunchedEffect(Unit) {\n        mapState.cameraChangedEvents.collect {\n          cameraState = it.cameraState\n        }\n      }\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapViewportState = mapViewportState,\n          mapState = mapState,\n        )\n      }\n    }\n    composeTestRule.onNodeWithTag(MAP_TEST_TAG).performTouchInput {\n      swipeLeft()\n      swipeUp()\n    }\n    composeTestRule.waitUntil {\n      cameraState.center.longitude() != CityLocations.HELSINKI.longitude() &&\n        cameraState.center.latitude() != CityLocations.HELSINKI.latitude()\n    }\n  }\n\n  @Test\n  public fun testMapPinchToZoomDisabled() {\n    lateinit var cameraState: CameraState\n    composeTestRule.setContent {\n      val mapViewportState = rememberMapViewportState {\n        setCameraOptions {\n          zoom(ZOOM)\n          center(CityLocations.HELSINKI)\n        }\n      }\n      val mapState = rememberMapState {\n        gesturesSettings = GesturesSettings { pinchToZoomEnabled = false }\n      }\n      LaunchedEffect(Unit) {\n        mapState.cameraChangedEvents.collect {\n          cameraState = it.cameraState\n        }\n      }\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapViewportState = mapViewportState,\n          mapState = mapState,\n        )\n      }\n    }\n    composeTestRule.onNodeWithTag(MAP_TEST_TAG).performTouchInput {\n      down(0, center + Offset(0f, -10f))\n      down(1, center + Offset(0f, 10f))\n\n      moveBy(0, Offset(0f, -50f))\n      moveBy(1, Offset(0f, +50f))\n      up(0)\n      up(1)\n    }\n    composeTestRule.waitUntil { ZOOM == cameraState.zoom }\n  }\n\n  @Test\n  public fun testMapOrnaments() {\n    val compassTag = \"compass\"\n    val scaleBarTag = \"scalebar\"\n    val logoTag = \"logo\"\n    val attributionTag = \"attribution\"\n    composeTestRule.setContent {\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapViewportState = rememberMapViewportState {\n            setCameraOptions {\n              zoom(ZOOM)\n              center(CityLocations.HELSINKI)\n              bearing(30.0)\n            }\n          },\n          compass = {\n            Compass(modifier = Modifier.testTag(compassTag))\n          },\n          scaleBar = {\n            ScaleBar(modifier = Modifier.testTag(scaleBarTag))\n          },\n          logo = {\n            Logo(modifier = Modifier.testTag(logoTag))\n          },\n          attribution = {\n            Attribution(modifier = Modifier.testTag(attributionTag))\n          }\n        )\n      }\n    }\n    composeTestRule.onNodeWithTag(compassTag).assertExists()\n    composeTestRule.onNodeWithTag(scaleBarTag).assertExists()\n    composeTestRule.onNodeWithTag(logoTag).assertExists()\n    composeTestRule.onNodeWithTag(attributionTag).assertExists().performClick()\n    val attributionDialogTitle = InstrumentationRegistry\n      .getInstrumentation()\n      .context\n      .resources\n      .getString(R.string.mapbox_attributionsDialogTitle)\n    composeTestRule.onNodeWithText(attributionDialogTitle).assertExists()\n  }\n\n  @Test\n  public fun testMapWithCompass() {\n    val compassTag = \"compass\"\n    var bearing = -1.0\n    composeTestRule.setContent {\n      val mapState = rememberMapState()\n      LaunchedEffect(Unit) {\n        mapState.cameraChangedEvents.collect {\n          bearing = it.cameraState.bearing\n        }\n      }\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapViewportState = rememberMapViewportState {\n            setCameraOptions {\n              zoom(ZOOM)\n              center(CityLocations.HELSINKI)\n              bearing(30.0)\n            }\n          },\n          mapState = mapState,\n          compass = {\n            Compass(modifier = Modifier.testTag(compassTag))\n          }\n        )\n      }\n    }\n    composeTestRule.onNodeWithTag(compassTag)\n      .assertExists()\n      .performClick()\n    composeTestRule.onNodeWithContentDescription(compassTag).assertDoesNotExist()\n    composeTestRule.waitUntil { bearing == 0.0 }\n  }\n\n  @Test\n  public fun testMapEffectWithState() {\n    var actualRefreshCount = 0\n    val contentDescription = \"Increment\"\n    composeTestRule.setContent {\n      var count by remember {\n        mutableStateOf(0)\n      }\n      Scaffold(\n        floatingActionButton = {\n          FloatingActionButton(onClick = { count += 1 }) {\n            Icon(Icons.Filled.Add, contentDescription)\n          }\n        }\n      ) { padding ->\n        MapboxMap(\n          modifier = Modifier\n            .fillMaxSize()\n            .padding(padding)\n            .testTag(MAP_TEST_TAG)\n        ) {\n          MapEffect(count) {\n            actualRefreshCount += 1\n          }\n        }\n      }\n    }\n    composeTestRule.onNodeWithContentDescription(contentDescription)\n      .performClick()\n      .performClick()\n    composeTestRule.waitUntil { actualRefreshCount == 2 }\n  }\n\n  @Test\n  public fun testMapViewPort() {\n    var actualZoom = 0.0\n    lateinit var actualCenter: Point\n    composeTestRule.setContent {\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapViewportState = rememberMapViewportState {\n            setCameraOptions {\n              zoom(ZOOM)\n              center(CityLocations.HELSINKI)\n            }\n          },\n        ) {\n          MapEffect(Unit) {\n            actualZoom = it.mapboxMap.cameraState.zoom\n            actualCenter = it.mapboxMap.cameraState.center\n          }\n        }\n      }\n    }\n    assertEquals(ZOOM, actualZoom, EPS)\n    assertEquals(CityLocations.HELSINKI.latitude(), actualCenter.latitude(), EPS)\n    assertEquals(CityLocations.HELSINKI.longitude(), actualCenter.longitude(), EPS)\n  }\n\n  private companion object {\n    private const val MAP_TEST_TAG = \"map_tag\"\n    private const val ZOOM: Double = 10.0\n    private const val EPS = 0.0001\n  }\n}"
  },
  {
    "path": "extension-compose/src/androidTest/java/com/mapbox/maps/extension/compose/annotation/AnnotationTests.kt",
    "content": "package com.mapbox.maps.extension.compose.annotation\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.offset\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport androidx.compose.ui.platform.LocalDensity\nimport androidx.compose.ui.platform.testTag\nimport androidx.compose.ui.test.SemanticsNodeInteraction\nimport androidx.compose.ui.test.junit4.ComposeContentTestRule\nimport androidx.compose.ui.test.junit4.createComposeRule\nimport androidx.compose.ui.test.onAllNodesWithTag\nimport androidx.compose.ui.test.onNodeWithTag\nimport androidx.compose.ui.test.performClick\nimport androidx.compose.ui.test.performTouchInput\nimport androidx.compose.ui.unit.IntOffset\nimport androidx.compose.ui.unit.dp\nimport androidx.core.content.ContextCompat\nimport androidx.core.graphics.drawable.toBitmap\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.R\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroup\nimport com.mapbox.maps.extension.compose.annotation.generated.PointAnnotation\nimport com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationGroup\nimport com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.extension.compose.annotation.generated.PolygonAnnotationGroup\nimport com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.extension.compose.annotation.generated.PolylineAnnotationGroup\nimport com.mapbox.maps.extension.compose.annotation.generated.withCircleColor\nimport com.mapbox.maps.extension.compose.annotation.generated.withLineColor\nimport com.mapbox.maps.extension.compose.internal.utils.CityLocations.HELSINKI\nimport com.mapbox.maps.extension.compose.style.MapStyle\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationSourceOptions\nimport com.mapbox.maps.plugin.annotation.ClusterOptions\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions\nimport org.junit.Assert.assertEquals\nimport org.junit.Rule\nimport org.junit.Test\n\npublic class AnnotationTests {\n\n  @get:Rule\n  public val composeTestRule: ComposeContentTestRule = createComposeRule()\n\n  @Test\n  public fun testCircleAnnotation() {\n    var clickedAnnotation: CircleAnnotation? = null\n    var longClickedAnnotation: CircleAnnotation? = null\n    val testTag = \"circle_annotation\"\n\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint = SINGLE_POINT,\n      testTag\n    ) {\n      CircleAnnotation(\n        point = SINGLE_POINT,\n      ) {\n        interactionsState.onClicked {\n          clickedAnnotation = it\n          true\n        }\n          .onLongClicked {\n            longClickedAnnotation = it\n            true\n          }\n        circleRadius = 20.0\n        circleColor = Color.Blue\n      }\n    }\n\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { clickedAnnotation != null }\n    assertEquals(SINGLE_POINT, clickedAnnotation!!.point)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { longClickedAnnotation != null }\n    assertEquals(SINGLE_POINT, longClickedAnnotation!!.point)\n  }\n\n  @Test\n  public fun testCircleAnnotationGroup() {\n    var clickedAnnotation: CircleAnnotation? = null\n    var longClickedAnnotation: CircleAnnotation? = null\n    val testTag = \"circle_annotation\"\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint = CLUSTER_POINTS[2],\n      zoom = ZOOM + 2,\n      testTag = testTag\n    ) {\n      CircleAnnotationGroup(\n        annotations = CLUSTER_POINTS.map {\n          CircleAnnotationOptions()\n            .withPoint(it)\n            .withCircleRadius(10.0)\n            .withCircleColor(Color.Red)\n        },\n        annotationConfig = AnnotationConfig(\n          annotationSourceOptions = AnnotationSourceOptions(\n            clusterOptions = ClusterOptions(\n              colorLevels = listOf(\n                Pair(100, Color.Red.toArgb()),\n                Pair(50, Color.Blue.toArgb()),\n                Pair(0, Color.Green.toArgb())\n              )\n            )\n          )\n        )\n      ) {\n        interactionsState.onClicked {\n          clickedAnnotation = it\n          true\n        }\n          .onLongClicked {\n            longClickedAnnotation = it\n            true\n          }\n      }\n    }\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { clickedAnnotation != null }\n    assertEquals(CLUSTER_POINTS[2], clickedAnnotation!!.point)\n    assertEquals(Color.Red.toArgb(), clickedAnnotation!!.circleColorInt)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { longClickedAnnotation != null }\n    assertEquals(CLUSTER_POINTS[2], longClickedAnnotation!!.point)\n    assertEquals(Color.Red.toArgb(), longClickedAnnotation!!.circleColorInt)\n  }\n\n  @Test\n  public fun testCircleAnnotationGroupCluster() {\n    val expectedPointsInCluster: Long = 2\n    var actualPointsInClickedCluster: Long? = null\n    var actualPointsInLongClickedCluster: Long? = null\n    val testTag = \"circle_annotation\"\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint =\n      Point.fromLngLat(\n        CLUSTER_POINTS[0].longitude() + INTERVAL / 2,\n        CLUSTER_POINTS[0].latitude()\n      ), // point above the cluster\n      zoom = ZOOM + 1, // Zoom level enough for clustering\n      testTag = testTag\n    ) {\n      CircleAnnotationGroup(\n        annotations = CLUSTER_POINTS.map {\n          CircleAnnotationOptions()\n            .withPoint(it)\n            .withCircleRadius(10.0)\n            .withCircleColor(Color.Red)\n        },\n        annotationConfig = AnnotationConfig(\n          annotationSourceOptions = AnnotationSourceOptions(\n            clusterOptions = ClusterOptions(\n              colorLevels = listOf(\n                Pair(100, Color.Red.toArgb()),\n                Pair(50, Color.Blue.toArgb()),\n                Pair(0, Color.Green.toArgb())\n              )\n            )\n          )\n        )\n      ) {\n        interactionsState.onClusterClicked {\n          actualPointsInClickedCluster = it.pointCount\n          true\n        }\n          .onClusterLongClicked {\n            actualPointsInLongClickedCluster = it.pointCount\n            true\n          }\n      }\n    }\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { actualPointsInClickedCluster != null }\n    assertEquals(expectedPointsInCluster, actualPointsInClickedCluster)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { actualPointsInLongClickedCluster != null }\n    assertEquals(expectedPointsInCluster, actualPointsInLongClickedCluster)\n  }\n\n  @Test\n  public fun testPointAnnotation() {\n    var clickedAnnotation: PointAnnotation? = null\n    var longClickedAnnotation: PointAnnotation? = null\n    val testTag = \"point_annotation\"\n    val annotationIconAnchor = IconAnchor.BOTTOM_LEFT\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint = SINGLE_POINT,\n      testTag\n    ) {\n      val icon = rememberIconImage(resourceId = R.drawable.mapbox_mylocation_icon_bearing)\n      PointAnnotation(\n        point = SINGLE_POINT\n      ) {\n        iconImage = icon\n        iconAnchor = annotationIconAnchor\n        interactionsState.onClicked {\n          clickedAnnotation = it\n          true\n        }\n          .onLongClicked {\n            longClickedAnnotation = it\n            true\n          }\n      }\n    }\n\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { clickedAnnotation != null }\n    assertEquals(SINGLE_POINT, clickedAnnotation!!.point)\n    assertEquals(annotationIconAnchor, clickedAnnotation!!.iconAnchor)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { longClickedAnnotation != null }\n    assertEquals(SINGLE_POINT, longClickedAnnotation!!.point)\n  }\n\n  @Test\n  public fun testPointAnnotationGroup() {\n    var clickedAnnotation: PointAnnotation? = null\n    var longClickedAnnotation: PointAnnotation? = null\n    val testTag = \"point_annotation\"\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint = CLUSTER_POINTS[2],\n      zoom = ZOOM + 2,\n      testTag = testTag\n    ) {\n      PointAnnotationGroup(\n        annotations = CLUSTER_POINTS.map {\n          PointAnnotationOptions()\n            .withIconImage(\"bitmap\")\n            .withTextAnchor(TextAnchor.TOP_LEFT)\n            .withPoint(it)\n        },\n        annotationConfig = AnnotationConfig(\n          annotationSourceOptions = AnnotationSourceOptions(\n            clusterOptions = ClusterOptions(\n              colorLevels = listOf(\n                Pair(100, Color.Red.toArgb()),\n                Pair(50, Color.Blue.toArgb()),\n                Pair(0, Color.Green.toArgb())\n              )\n            )\n          )\n        )\n      ) {\n        interactionsState.onClicked {\n          clickedAnnotation = it\n          true\n        }\n          .onLongClicked {\n            longClickedAnnotation = it\n            true\n          }\n      }\n\n      MapEffect(Unit) { mapView ->\n        mapView.mapboxMap.loadStyle(Style.STANDARD) {\n          it.addImage(\n            \"bitmap\",\n            ContextCompat.getDrawable(mapView.context, R.drawable.mapbox_mylocation_icon_bearing)!!\n              .toBitmap()\n          )\n        }\n      }\n    }\n\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { clickedAnnotation != null }\n    assertEquals(CLUSTER_POINTS[2], clickedAnnotation!!.point)\n    assertEquals(TextAnchor.TOP_LEFT, clickedAnnotation!!.textAnchor)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { longClickedAnnotation != null }\n    assertEquals(CLUSTER_POINTS[2], longClickedAnnotation!!.point)\n  }\n\n  @Test\n  public fun testPointAnnotationGroupCluster() {\n    val expectedPointsInCluster: Long = 2\n    var actualPointsInClickedCluster: Long? = null\n    var actualPointsInLongClickedCluster: Long? = null\n    val testTag = \"point_annotation\"\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint =\n      Point.fromLngLat(\n        CLUSTER_POINTS[0].longitude() + INTERVAL / 2,\n        CLUSTER_POINTS[0].latitude()\n      ), // point above the cluster\n      zoom = ZOOM + 1, // Zoom level enough for clustering\n      testTag = testTag\n    ) {\n      PointAnnotationGroup(\n        annotations = CLUSTER_POINTS.map {\n          PointAnnotationOptions()\n            .withIconImage(\"bitmap\")\n            .withPoint(it)\n        },\n        annotationConfig = AnnotationConfig(\n          annotationSourceOptions = AnnotationSourceOptions(\n            clusterOptions = ClusterOptions(\n              colorLevels = listOf(\n                Pair(100, Color.Red.toArgb()),\n                Pair(50, Color.Blue.toArgb()),\n                Pair(0, Color.Green.toArgb())\n              )\n            )\n          )\n        )\n      ) {\n        interactionsState.onClusterClicked {\n          actualPointsInClickedCluster = it.pointCount\n          true\n        }\n          .onClusterLongClicked {\n            actualPointsInLongClickedCluster = it.pointCount\n            true\n          }\n      }\n\n      MapEffect(Unit) { mapView ->\n        mapView.mapboxMap.loadStyle(Style.STANDARD) {\n          it.addImage(\n            \"bitmap\",\n            ContextCompat.getDrawable(mapView.context, R.drawable.mapbox_mylocation_icon_bearing)!!\n              .toBitmap()\n          )\n        }\n      }\n    }\n\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { actualPointsInClickedCluster != null }\n    assertEquals(expectedPointsInCluster, actualPointsInClickedCluster)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { actualPointsInLongClickedCluster != null }\n    assertEquals(expectedPointsInCluster, actualPointsInLongClickedCluster)\n  }\n\n  @Test\n  public fun testPolygonAnnotation() {\n    var clickedAnnotation: PolygonAnnotation? = null\n    var longClickedAnnotation: PolygonAnnotation? = null\n    val testTag = \"polygon_annotation\"\n\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint = POLYGON_CENTER,\n      testTag = testTag\n    ) {\n      PolygonAnnotation(\n        points = POLYGON_POINTS\n      ) {\n        interactionsState.onClicked {\n          clickedAnnotation = it\n          true\n        }\n          .onLongClicked {\n            longClickedAnnotation = it\n            true\n          }\n        fillColor = Color.Red\n      }\n    }\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { clickedAnnotation != null }\n    assertEquals(Color.Red.toArgb(), clickedAnnotation!!.fillColorInt)\n    assertEquals(POLYGON_POINTS, clickedAnnotation!!.points)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { longClickedAnnotation != null }\n    assertEquals(Color.Red.toArgb(), clickedAnnotation!!.fillColorInt)\n    assertEquals(POLYGON_POINTS, longClickedAnnotation!!.points)\n  }\n\n  @Test\n  public fun testPolygonAnnotationGroup() {\n    var clickedAnnotation: PolygonAnnotation? = null\n    var longClickedAnnotation: PolygonAnnotation? = null\n    val testTag = \"polygon_annotation\"\n\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint = POLYGON_CENTER,\n      testTag = testTag\n    ) {\n      PolygonAnnotationGroup(\n        annotations = POLYGON_GROUP_POINTS.map {\n          PolygonAnnotationOptions()\n            .withFillColor(Color.Yellow.toArgb())\n            .withPoints(it)\n        },\n        annotationConfig = AnnotationConfig()\n      ) {\n        interactionsState.onClicked {\n          clickedAnnotation = it\n          true\n        }\n          .onLongClicked {\n            longClickedAnnotation = it\n            true\n          }\n      }\n    }\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { clickedAnnotation != null }\n    assertEquals(Color.Yellow.toArgb(), clickedAnnotation!!.fillColorInt)\n    assertEquals(POLYGON_POINTS, clickedAnnotation!!.points)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { longClickedAnnotation != null }\n    assertEquals(Color.Yellow.toArgb(), clickedAnnotation!!.fillColorInt)\n    assertEquals(POLYGON_POINTS, longClickedAnnotation!!.points)\n  }\n\n  @Test\n  public fun testPolylineAnnotation() {\n    var clickedAnnotation: PolylineAnnotation? = null\n    var longClickedAnnotation: PolylineAnnotation? = null\n    val testTag = \"polyline_annotation\"\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint = HELSINKI,\n      testTag = testTag\n    ) {\n      PolylineAnnotation(\n        points = POLYLINE_POINTS\n      ) {\n        interactionsState.onClicked {\n          clickedAnnotation = it\n          true\n        }\n          .onLongClicked {\n            longClickedAnnotation = it\n            true\n          }\n        lineColor = Color.Red\n        lineWidth = 15.0\n      }\n    }\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { clickedAnnotation != null }\n    assertEquals(Color.Red.toArgb(), clickedAnnotation!!.lineColorInt)\n    assertEquals(POLYLINE_POINTS, clickedAnnotation!!.points)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { longClickedAnnotation != null }\n    assertEquals(Color.Red.toArgb(), longClickedAnnotation!!.lineColorInt)\n    assertEquals(POLYLINE_POINTS, longClickedAnnotation!!.points)\n  }\n\n  @Test\n  public fun testPolylineAnnotationGroup() {\n    var clickedAnnotation: PolylineAnnotation? = null\n    var longClickedAnnotation: PolylineAnnotation? = null\n    val testTag = \"polyline_annotation\"\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationPoint = HELSINKI,\n      testTag = testTag\n    ) {\n      PolylineAnnotationGroup(\n        annotations = POLYLINE_GROUP_POINTS.map {\n          PolylineAnnotationOptions()\n            .withPoints(it)\n            .withLineWidth(15.0)\n            .withLineColor(Color.Blue)\n        },\n        annotationConfig = AnnotationConfig(),\n      ) {\n        interactionsState.onClicked {\n          clickedAnnotation = it\n          true\n        }\n          .onLongClicked {\n            longClickedAnnotation = it\n            true\n          }\n      }\n    }\n    composeTestRule.onNodeWithTag(testTag).performClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { clickedAnnotation != null }\n    assertEquals(Color.Blue.toArgb(), clickedAnnotation!!.lineColorInt)\n    assertEquals(POLYLINE_POINTS, clickedAnnotation!!.points)\n\n    composeTestRule.onNodeWithTag(testTag).performLongClick()\n    composeTestRule.waitUntil(WAIT_TIMEOUT) { longClickedAnnotation != null }\n    assertEquals(Color.Blue.toArgb(), longClickedAnnotation!!.lineColorInt)\n    assertEquals(POLYLINE_POINTS, longClickedAnnotation!!.points)\n  }\n\n  /**\n   * @param cameraCenter coordinate of camera's center.\n   * @param annotationPoint coordinate of annotation to be tested.\n   */\n  private fun setMapContent(\n    cameraCenter: Point,\n    annotationPoint: Point,\n    testTag: String,\n    zoom: Double = ZOOM,\n    annotationBlock: @MapboxMapComposable @Composable () -> Unit,\n  ) {\n    composeTestRule.setContent {\n      val density = LocalDensity.current\n      // screen coordinate of given annotation which can be used for adding Box with testTag\n      var offset: IntOffset? by remember {\n        mutableStateOf(null)\n      }\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          modifier = Modifier.testTag(MAP_TEST_TAG),\n          mapViewportState = rememberMapViewportState {\n            setCameraOptions {\n              zoom(zoom)\n              center(cameraCenter)\n            }\n          },\n          style = {\n            MapStyle(style = Style.DARK)\n          },\n        ) {\n          annotationBlock()\n          MapEffect(Unit) { mapView ->\n            mapView.mapboxMap.subscribeMapLoaded {\n              val screenCoordinate = mapView.mapboxMap.pixelForCoordinate(annotationPoint)\n              // Center the box on the coordinate\n              val boxSizePx = with(density) { 5.dp.roundToPx() }\n              val halfSize = boxSizePx / 2\n              offset = IntOffset(\n                screenCoordinate.x.toInt() - halfSize,\n                screenCoordinate.y.toInt() - halfSize\n              )\n            }\n          }\n        }\n        if (offset != null) {\n          Box(\n            modifier = Modifier\n                .size(5.dp)\n                .offset { offset ?: IntOffset.Zero }\n                .testTag(testTag)\n                .background(Color.Cyan)\n          )\n        }\n      }\n    }\n\n    composeTestRule.waitUntil(WAIT_TIMEOUT) {\n      composeTestRule.onAllNodesWithTag(testTag)\n        .fetchSemanticsNodes().size == 1\n    }\n  }\n\n  // [TouchInjectionScope.longClick] from compose.ui.test doesn't trigger mapbox [GesturePlugin]\n  // long click event, thus we need to use custom realisation\n  private fun SemanticsNodeInteraction.performLongClick(): SemanticsNodeInteraction {\n    return performTouchInput {\n      down(this.center)\n      advanceEventTime(1500)\n      move()\n    }\n  }\n\n  public companion object {\n    public const val MAP_TEST_TAG: String = \"map_tag\"\n    // Increase timeout for Firebase/CI environments\n    public const val WAIT_TIMEOUT: Long = 10_000L\n    public const val ZOOM: Double = 10.0\n    private const val INTERVAL = 0.01\n    public val CLUSTER_POINTS: List<Point> by lazy {\n      mutableListOf<Point>().apply {\n        repeat(10) { x ->\n          repeat(10) { y ->\n            add(\n              Point.fromLngLat(\n                HELSINKI.longitude() + INTERVAL * x,\n                HELSINKI.latitude() + INTERVAL * y\n              )\n            )\n          }\n        }\n      }\n    }\n\n    private val POLYGON_POINTS = listOf(\n      listOf(\n        Point.fromLngLat(24.9349, 60.1725),\n        Point.fromLngLat(24.9429, 60.1725),\n        Point.fromLngLat(24.9429, 60.1673),\n        Point.fromLngLat(24.9349, 60.1673),\n        Point.fromLngLat(24.9349, 60.1725),\n      )\n    )\n\n    // Center point of POLYGON_POINTS for click testing\n    private val POLYGON_CENTER = Point.fromLngLat(\n      (24.9349 + 24.9429) / 2,\n      (60.1725 + 60.1673) / 2\n    )\n\n    private val POLYGON_POINTS_2 = listOf(\n      listOf(\n        Point.fromLngLat(24.9349, 60.1825),\n        Point.fromLngLat(24.9429, 60.1825),\n        Point.fromLngLat(24.9429, 60.1773),\n        Point.fromLngLat(24.9349, 60.1773),\n        Point.fromLngLat(24.9349, 60.1825),\n      )\n    )\n\n    private val POLYGON_GROUP_POINTS = listOf(\n      POLYGON_POINTS,\n      POLYGON_POINTS_2\n    )\n\n    private val SINGLE_POINT = Point.fromLngLat(\n      HELSINKI.longitude() - INTERVAL,\n      HELSINKI.latitude() - INTERVAL\n    )\n\n    private val POLYLINE_POINTS = listOf(\n      Point.fromLngLat(24.9439358, 60.1718468),\n      HELSINKI,\n      Point.fromLngLat(24.9389362, 60.1697015)\n    )\n\n    private val POLYLINE_GROUP_POINTS = listOf(\n      POLYLINE_POINTS,\n      listOf(\n        Point.fromLngLat(24.9379887, 60.1748898),\n        Point.fromLngLat(24.9364867, 60.1732249),\n        Point.fromLngLat(24.9338259, 60.1730755)\n      )\n    )\n  }\n}"
  },
  {
    "path": "extension-compose/src/androidTest/java/com/mapbox/maps/extension/compose/annotation/ViewAnnotationTest.kt",
    "content": "package com.mapbox.maps.extension.compose.annotation\n\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.testTag\nimport androidx.compose.ui.test.hasText\nimport androidx.compose.ui.test.junit4.ComposeContentTestRule\nimport androidx.compose.ui.test.junit4.createComposeRule\nimport androidx.compose.ui.test.onAllNodesWithText\nimport androidx.compose.ui.test.onNodeWithTag\nimport androidx.compose.ui.test.onNodeWithText\nimport androidx.compose.ui.test.performTouchInput\nimport androidx.compose.ui.test.swipeLeft\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.ViewAnnotationAnchor\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.internal.utils.CityLocations.HELSINKI\nimport com.mapbox.maps.extension.compose.internal.utils.CityLocations.MINSK\nimport com.mapbox.maps.extension.compose.rememberMapState\nimport com.mapbox.maps.viewannotation.annotationAnchor\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport org.junit.Rule\nimport org.junit.Test\n\npublic class ViewAnnotationTest {\n\n  @get:Rule\n  public val composeTestRule: ComposeContentTestRule = createComposeRule()\n\n  @Test\n  public fun testVisibleViewAnnotation() {\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationCenter = HELSINKI,\n      visible = true\n    ) {\n      Text(VIEW_ANNOTATION_TEXT)\n    }\n\n    composeTestRule.waitUntil(timeoutMillis = VIEW_APPEAR_TIMEOUT_MS, condition = {\n      composeTestRule\n        .onAllNodesWithText(VIEW_ANNOTATION_TEXT)\n        .fetchSemanticsNodes().size == 1\n    })\n    composeTestRule.onNodeWithText(VIEW_ANNOTATION_TEXT).assertExists()\n\n    val textSize = composeTestRule.onNode(hasText(VIEW_ANNOTATION_TEXT)).fetchSemanticsNode().size\n    assert(textSize.width > 0)\n    assert(textSize.height > 0)\n  }\n\n  @Test\n  public fun testSwipeAction() {\n    setMapContent(\n      cameraCenter = HELSINKI,\n      annotationCenter = HELSINKI,\n      visible = true,\n    ) {\n      Text(VIEW_ANNOTATION_TEXT)\n    }\n    composeTestRule.waitUntil(timeoutMillis = VIEW_APPEAR_TIMEOUT_MS, condition = {\n      composeTestRule\n        .onAllNodesWithText(VIEW_ANNOTATION_TEXT)\n        .fetchSemanticsNodes().size == 1\n    })\n    composeTestRule.onNodeWithTag(MAP_TEST_TAG).performTouchInput {\n      swipeLeft(durationMillis = 10L)\n    }\n    composeTestRule.waitUntil(timeoutMillis = VIEW_DISAPPEAR_TIMEOUT_MS) {\n      composeTestRule\n        .onAllNodesWithText(VIEW_ANNOTATION_TEXT)\n        .fetchSemanticsNodes().isEmpty()\n    }\n  }\n\n  @Test\n  public fun testInvisibleViewAnnotation() {\n    setMapContent(cameraCenter = HELSINKI, annotationCenter = HELSINKI, visible = false) {\n      Text(VIEW_ANNOTATION_TEXT)\n    }\n    composeTestRule.onNodeWithText(VIEW_ANNOTATION_TEXT).assertDoesNotExist()\n  }\n\n  @Test\n  public fun testAnotherCameraCenterPoint() {\n    setMapContent(cameraCenter = MINSK, annotationCenter = HELSINKI, visible = false) {\n      Text(VIEW_ANNOTATION_TEXT)\n    }\n    composeTestRule.onNodeWithText(VIEW_ANNOTATION_TEXT).assertDoesNotExist()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  public fun testMarker() {\n    var viewAnnotationCount = 0\n\n    composeTestRule.setContent {\n      MapboxMap(\n        Modifier\n          .fillMaxSize()\n          .testTag(MAP_TEST_TAG),\n        mapViewportState = rememberMapViewportState {\n          setCameraOptions {\n            zoom(ZOOM)\n            center(HELSINKI)\n          }\n        },\n        mapState = rememberMapState(),\n      ) {\n        Marker(\n          point = HELSINKI,\n          text = VIEW_ANNOTATION_TEXT\n        )\n\n        // Use MapEffect to access ViewAnnotationManager and count annotations\n        MapEffect(Unit) { mapView ->\n          viewAnnotationCount = mapView.viewAnnotationManager.annotations.size\n        }\n      }\n    }\n    composeTestRule.waitForIdle()\n\n    // Test that the Marker actually adds a ViewAnnotation to the map\n    composeTestRule.waitUntil(timeoutMillis = VIEW_APPEAR_TIMEOUT_MS, condition = {\n      viewAnnotationCount > 0\n    })\n\n    // Verify that exactly one view annotation was added by the Marker\n    assert(viewAnnotationCount == 1) { \"Expected 1 view annotation, got $viewAnnotationCount\" }\n\n    // Verify the map node exists\n    composeTestRule.onNodeWithTag(MAP_TEST_TAG).assertExists()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  public fun testMarkerClickGesture() {\n    var clicked = false\n    val onClickCallback = { clicked = true }\n    var viewAnnotationCount = 0\n\n    composeTestRule.setContent {\n      MapboxMap(\n        Modifier\n          .fillMaxSize()\n          .testTag(MAP_TEST_TAG),\n        mapViewportState = rememberMapViewportState {\n          setCameraOptions {\n            zoom(ZOOM)\n            center(HELSINKI)\n          }\n        },\n        mapState = rememberMapState(),\n      ) {\n        // Create a marker with click functionality\n        Marker(\n          point = HELSINKI,\n          text = VIEW_ANNOTATION_TEXT\n        )\n\n        // Use MapEffect to count annotations\n        MapEffect(Unit) { mapView ->\n          viewAnnotationCount = mapView.viewAnnotationManager.annotations.size\n        }\n      }\n    }\n    composeTestRule.waitForIdle()\n\n    // Wait for marker to be added\n    composeTestRule.waitUntil(timeoutMillis = VIEW_APPEAR_TIMEOUT_MS, condition = {\n      viewAnnotationCount > 0\n    })\n\n    // Verify marker was created\n    assert(viewAnnotationCount == 1) { \"Expected 1 view annotation, got $viewAnnotationCount\" }\n\n    // Verify callback is not yet triggered\n    assert(!clicked) { \"Click callback should not be triggered yet\" }\n\n    // Execute the click action directly (similar to how iOS test calls marker.tapAction?())\n    onClickCallback()\n\n    // Verify that our click callback was invoked\n    assert(clicked) { \"Expected click callback to be triggered\" }\n  }\n\n  private fun setMapContent(\n    cameraCenter: Point,\n    annotationCenter: Point,\n    visible: Boolean = true,\n    viewAnnotationBlock: @Composable () -> Unit,\n  ) {\n    composeTestRule.setContent {\n      MapboxMap(\n        Modifier\n          .fillMaxSize()\n          .testTag(MAP_TEST_TAG),\n        mapViewportState = rememberMapViewportState {\n          setCameraOptions {\n            zoom(ZOOM)\n            center(cameraCenter)\n          }\n        },\n        mapState = rememberMapState(),\n      ) {\n        ViewAnnotation(\n          options = viewAnnotationOptions {\n            geometry(annotationCenter)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.BOTTOM)\n            }\n            // specifying the size here because when composeTestRule adds view annotations,\n            // view layout is not yet attached (all of them - mapView / viewAnnotationView / rootView)\n            width(100.0)\n            height(100.0)\n            allowOverlap(false)\n            visible(visible)\n          }\n        ) {\n          viewAnnotationBlock()\n        }\n      }\n    }\n    composeTestRule.waitForIdle()\n  }\n\n  private companion object {\n    private const val ZOOM: Double = 9.0\n    private const val VIEW_ANNOTATION_TEXT = \"Test annotation\"\n    private const val MAP_TEST_TAG = \"map_tag\"\n    private const val VIEW_APPEAR_TIMEOUT_MS = 5000L\n    private const val VIEW_DISAPPEAR_TIMEOUT_MS = 5000L\n  }\n}"
  },
  {
    "path": "extension-compose/src/androidTest/java/com/mapbox/maps/extension/compose/internal/utils/CityLocations.kt",
    "content": "package com.mapbox.maps.extension.compose.internal.utils\n\nimport com.mapbox.geojson.Point\n\ninternal object CityLocations {\n  val HELSINKI: Point = Point.fromLngLat(24.9384, 60.1699)\n  val MINSK: Point = Point.fromLngLat(27.561481, 53.902496)\n  val BERLIN = Point.fromLngLat(13.403, 52.562)\n  val KYIV = Point.fromLngLat(30.498, 50.541)\n  val WASHINGTON = Point.fromLngLat(-77.00897, 38.87031)\n}\n\n/**\n * Produce a new [Point] that offsets [offset] in both latitude and longitude.\n */\ninternal fun Point.offset(offset: Double = 0.01) =\n  Point.fromLngLat(longitude() + offset, latitude() + offset)"
  },
  {
    "path": "extension-compose/src/androidTest/java/com/mapbox/maps/extension/compose/multimap/MultiMapTest.kt",
    "content": "package com.mapbox.maps.extension.compose.multimap\n\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.test.junit4.ComposeContentTestRule\nimport androidx.compose.ui.test.junit4.createComposeRule\nimport androidx.compose.ui.test.onAllNodesWithText\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.ViewAnnotation\nimport com.mapbox.maps.extension.compose.internal.utils.CityLocations\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport org.junit.Rule\nimport org.junit.Test\n\npublic class MultiMapTest {\n\n  @get:Rule\n  public val composeTestRule: ComposeContentTestRule = createComposeRule()\n\n  @Test\n  public fun testNodesManipulationWithMultipleMaps() {\n    composeTestRule.setContent {\n      var viewAnnotationList1 by remember { mutableStateOf(emptyList<Point>()) }\n      var viewAnnotationList2 by remember { mutableStateOf(emptyList<Point>()) }\n      var showMap1 by remember { mutableStateOf(true) }\n\n      LaunchedEffect(Unit) {\n        launch {\n          // add view annotation for map1 after 500ms delay\n          // This will add 2 annotation nodes to map1 and 2 annotation nodes to map2\n          // There would be in total 4 annotations across 2 maps\n          delay(ADD_ANNOTATIONS_DELAY)\n          viewAnnotationList1 = points1\n          viewAnnotationList2 = points1\n          // Remove map1 from the tree, this will clear map1's node tree\n          // There would be in total 2 annotations across 2 maps\n          showMap1 = false\n\n          // add 2 more view annotation for map2 after 1000ms delay\n          // This will add 2 more annotation nodes to map2(relative to map2's node tree)\n          // Since map1 is detached, there would be in total 4 annotations across 2 maps\n          delay(ADD_ANNOTATIONS_DELAY)\n          viewAnnotationList2 = points1 + points2\n          // Add map1 back after map2's annotation has been added\n          // There would be in total 6 annotations across 2 maps\n          showMap1 = true\n        }\n      }\n      Column {\n        if (showMap1) {\n          MapboxMap(\n            modifier = Modifier\n              .weight(1f)\n              .fillMaxWidth(),\n            mapViewportState = rememberMapViewportState {\n              setCameraOptions {\n                zoom(ZOOM)\n                center(CityLocations.HELSINKI)\n              }\n            },\n          ) {\n            viewAnnotationList1.forEachIndexed { index, point ->\n              ViewAnnotation(\n                options = viewAnnotationOptions {\n                  geometry(point)\n                  allowOverlap(true)\n                }\n              ) {\n                Text(text = \"Annotation $index\", color = Color.Red)\n              }\n            }\n          }\n        }\n        MapboxMap(\n          modifier = Modifier\n            .weight(1f)\n            .fillMaxWidth(),\n          mapViewportState = rememberMapViewportState {\n            setCameraOptions {\n              zoom(ZOOM)\n              center(CityLocations.HELSINKI)\n            }\n          }\n        ) {\n          viewAnnotationList2.forEachIndexed { index, point ->\n            ViewAnnotation(\n              options = viewAnnotationOptions {\n                geometry(point)\n                allowOverlap(true)\n              }\n            ) {\n              Text(text = \"Annotation $index\", color = Color.Blue)\n            }\n          }\n        }\n      }\n    }\n    // The above use case will result in following crash, if the root node is static and shared across multiple map instances:\n    // java.lang.IndexOutOfBoundsException: index=1 count=0\n\n    // The reason is that if these two maps would be using the same tree, removal of the nodes added in map1 would result in new\n    // nodes added to map2 to be inserted at non-exist index position.\n\n    // It's important to make sure each MapboxMap node tree have its own RootNode, so the two trees won't interfere with each other.\n    composeTestRule.waitUntil(timeoutMillis = TEST_TIMEOUT, condition = {\n      composeTestRule\n        .onAllNodesWithText(text = \"Annotation\", substring = true)\n        .fetchSemanticsNodes().size == 6\n    })\n  }\n\n  private companion object {\n    const val ZOOM: Double = 13.0\n    const val TEST_TIMEOUT = 5000L\n    const val ADD_ANNOTATIONS_DELAY = 500L\n\n    val points1 = listOf(\n      Point.fromLngLat(24.94216010242652, 60.16876757234266),\n      Point.fromLngLat(24.929766009141733, 60.170292490574944),\n    )\n    val points2 = listOf(\n      Point.fromLngLat(24.947481155604, 60.1731440090149),\n      Point.fromLngLat(24.937481155604, 60.1631440090149)\n    )\n  }\n}"
  },
  {
    "path": "extension-compose/src/androidTest/java/com/mapbox/maps/extension/compose/style/LayerPositionAwareNodeTest.kt",
    "content": "package com.mapbox.maps.extension.compose.style\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.material.Button\nimport androidx.compose.material.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.platform.testTag\nimport androidx.compose.ui.test.junit4.ComposeContentTestRule\nimport androidx.compose.ui.test.junit4.createComposeRule\nimport androidx.compose.ui.test.onNodeWithTag\nimport androidx.compose.ui.test.performClick\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.coroutine.styleDataLoadedEvents\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.extension.compose.annotation.generated.CircleAnnotationGroup\nimport com.mapbox.maps.extension.compose.internal.utils.CityLocations.HELSINKI\nimport com.mapbox.maps.extension.compose.internal.utils.offset\nimport com.mapbox.maps.extension.compose.rememberMapState\nimport com.mapbox.maps.extension.compose.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.generated.rememberGeoJsonSourceState\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationSourceOptions\nimport com.mapbox.maps.plugin.annotation.ClusterOptions\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport kotlinx.coroutines.flow.first\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\n\npublic class LayerPositionAwareNodeTest {\n\n  @get:Rule\n  public val composeTestRule: ComposeContentTestRule = createComposeRule()\n\n  @Test\n  public fun testLayersInMapContent() {\n    val mapboxMap = setMapContent(\n      mapContent = { btn1State, btn2State, btn3State ->\n        if (btn1State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI.offset(0.005))\n            },\n            layerId = remember { \"circle-layer-1\" }\n          ) {\n            circleColor = ColorValue(Color.Red)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n        if (btn2State) {\n          CircleAnnotation(\n            point = HELSINKI\n          ) {\n            circleRadius = 30.0\n            circleColor = Color.Yellow\n          }\n        }\n        if (btn3State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI.offset(-0.005))\n            },\n            layerId = remember { \"circle-layer-2\" }\n          ) {\n            circleColor = ColorValue(Color.Blue)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n      }\n    )\n\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-2\",\n        )\n      )\n    }\n    // Hide circle 1\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-2\",\n        )\n      )\n    }\n    // Show circle 1 again, it should be placed under circle 2\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-2\",\n        )\n      )\n    }\n\n    // Hide circle annotation in middle\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n        )\n      )\n    }\n    // Show circle annotation in middle again, it should be placed under circle 3\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-2\",\n        )\n      )\n    }\n\n    // Hide everything\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(emptyList())\n    }\n\n    // Show middle circle annotation\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n        )\n      )\n    }\n\n    // Show circle 2, it should be placed above circle annotation\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-2\",\n        )\n      )\n    }\n\n    // Show circle 1, it should be placed below circle annotation\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-2\",\n        )\n      )\n    }\n  }\n\n  @Test\n  public fun testLayersWithClusterInMapContent() {\n    val mapboxMap = setMapContent(\n      mapContent = { btn1State, btn2State, btn3State ->\n        if (btn1State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI.offset(0.005))\n            },\n            layerId = remember { \"circle-layer-1\" }\n          ) {\n            circleColor = ColorValue(Color.Red)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n        if (btn2State) {\n          CircleAnnotationGroup(\n            annotations = CLUSTER_POINTS.map {\n              CircleAnnotationOptions()\n                .withPoint(it)\n                .withCircleRadius(10.0)\n                .withCircleColor(android.graphics.Color.RED)\n            },\n            annotationConfig = AnnotationConfig(\n              annotationSourceOptions = AnnotationSourceOptions(\n                clusterOptions = ClusterOptions(\n                  textColorExpression = Expression.color(android.graphics.Color.YELLOW),\n                  textColor = android.graphics.Color.BLACK, // Will not be applied as textColorExpression has been set\n                  textSize = 20.0,\n                  circleRadiusExpression = literal(25.0),\n                  colorLevels = listOf(\n                    Pair(100, android.graphics.Color.RED),\n                    Pair(50, android.graphics.Color.BLUE),\n                    Pair(0, android.graphics.Color.GREEN)\n                  )\n                )\n              )\n            )\n          )\n        }\n        if (btn3State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI.offset(-0.005))\n            },\n            layerId = remember { \"circle-layer-2\" }\n          ) {\n            circleColor = ColorValue(Color.Blue)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n      }\n    )\n\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-0-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-1-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-2-.*\",\n          \"mapbox-android-circleAnnotation-cluster-text-layer-.*\",\n          \"circle-layer-2\"\n        )\n      )\n    }\n    // Hide circle annotation cluster\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"circle-layer-2\"\n        )\n      )\n    }\n    // Show circle annotation cluster again, it should be placed under circle 2 and above circle 1\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-0-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-1-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-2-.*\",\n          \"mapbox-android-circleAnnotation-cluster-text-layer-.*\",\n          \"circle-layer-2\"\n        )\n      )\n    }\n\n    // Hide circle layer 1\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-0-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-1-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-2-.*\",\n          \"mapbox-android-circleAnnotation-cluster-text-layer-.*\",\n          \"circle-layer-2\"\n        )\n      )\n    }\n    // Show circle layer 1, it should be placed under circle annotation cluster\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-0-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-1-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-2-.*\",\n          \"mapbox-android-circleAnnotation-cluster-text-layer-.*\",\n          \"circle-layer-2\"\n        )\n      )\n    }\n\n    // Hide circle layer 2\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-0-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-1-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-2-.*\",\n          \"mapbox-android-circleAnnotation-cluster-text-layer-.*\",\n        )\n      )\n    }\n    // Show circle layer 2, it should be placed above circle annotation cluster\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-0-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-1-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-2-.*\",\n          \"mapbox-android-circleAnnotation-cluster-text-layer-.*\",\n          \"circle-layer-2\"\n        )\n      )\n    }\n\n    // Hide everything\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        emptyList()\n      )\n    }\n\n    // Show circle layer 2\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-2\"\n        )\n      )\n    }\n\n    // Show circle annotation cluster again, it should be placed under circle 2\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-0-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-1-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-2-.*\",\n          \"mapbox-android-circleAnnotation-cluster-text-layer-.*\",\n          \"circle-layer-2\"\n        )\n      )\n    }\n    // Show circle layer 1, it should be placed under circle annotation cluster\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-0-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-1-.*\",\n          \"mapbox-android-circleAnnotation-cluster-circle-layer-2-.*\",\n          \"mapbox-android-circleAnnotation-cluster-text-layer-.*\",\n          \"circle-layer-2\"\n        )\n      )\n    }\n  }\n\n  @Test\n  public fun testAnnotationsInStyleSlot() {\n    val mapboxMap = setMapContent(\n      slotContent = { btn1State, btn2State, btn3State ->\n        if (btn1State) {\n          CircleAnnotation(\n            point = HELSINKI.offset(0.005)\n          ) {\n            circleRadius = 30.0\n            circleColor = Color.Red\n          }\n        }\n        if (btn2State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI)\n            },\n            layerId = remember { \"circle-layer-1\" }\n          ) {\n            circleColor = ColorValue(Color.Yellow)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n        if (btn3State) {\n          CircleAnnotation(\n            point = HELSINKI.offset(-0.005)\n          ) {\n            circleRadius = 30.0\n            circleColor = Color.Blue\n          }\n        }\n      }\n    )\n\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n        )\n      )\n    }\n    // Hide circle annotation 1\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n        )\n      )\n    }\n    // Show circle 1 again, it should be placed under circle layer 1\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n        )\n      )\n    }\n\n    // Hide circle layer 1\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n        )\n      )\n    }\n    // Show circle layer 1, it should be placed above circle annotation 1 and below circle annotation 2\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n        )\n      )\n    }\n\n    // Hide circle 3\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-1\",\n        )\n      )\n    }\n    // Show circle annotation 2, it should be placed above circle layer 1\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n        )\n      )\n    }\n\n    // Hide everything\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(emptyList())\n    }\n\n    // Show circle annotation 2\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          )\n      )\n    }\n    // Show circle layer 1, it should be placed below circle annotation 2\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n        )\n      )\n    }\n    // Show circle annotation 1 again, it should be placed below circle layer 1\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n          \"circle-layer-1\",\n          \"mapbox-android-circleAnnotation-layer-.*\",\n          \"mapbox-android-circleAnnotation-draglayer-.*\",\n        )\n      )\n    }\n  }\n\n  @Test\n  public fun testLayerInStyleSlot() {\n    val mapboxMap = setMapContent(\n      slotContent = { btn1State, btn2State, btn3State ->\n        if (btn1State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI.offset(0.005))\n            },\n            layerId = remember { \"circle-layer-1\" }\n          ) {\n            circleColor = ColorValue(Color.Red)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n        if (btn2State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI)\n            },\n            layerId = remember { \"circle-layer-2\" }\n          ) {\n            circleColor = ColorValue(Color.Yellow)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n        if (btn3State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI.offset(-0.005))\n            },\n            layerId = remember { \"circle-layer-3\" }\n          ) {\n            circleColor = ColorValue(Color.Blue)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n      }\n    )\n\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"circle-layer-3\"\n        )\n      )\n    }\n    // Hide circle 1\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-2\",\n          \"circle-layer-3\"\n        )\n      )\n    }\n    // Show circle 1 again, it should be placed under circle 2\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"circle-layer-3\"\n        )\n      )\n    }\n\n    // Hide circle 2\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"circle-layer-3\"\n        )\n      )\n    }\n    // Show circle 2, it should be placed above circle 1 and below circle 3\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"circle-layer-3\"\n        )\n      )\n    }\n\n    // Hide circle 3\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"circle-layer-2\"\n        )\n      )\n    }\n    // Show circle 3, it should be placed above circle 2\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"circle-layer-3\"\n        )\n      )\n    }\n\n    // Hide circle 1\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-2\",\n          \"circle-layer-3\"\n        )\n      )\n    }\n    // Hide circle 2\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-3\"\n        )\n      )\n    }\n    // Hide circle 3\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        emptyList()\n      )\n    }\n\n    // Show circle 3, it should be placed above circle 2\n    composeTestRule.clickAndWait(BTN3_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-3\"\n        )\n      )\n    }\n    // Show circle 2, it should be placed above circle 1 and below circle 3\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-2\",\n          \"circle-layer-3\"\n        )\n      )\n    }\n    // Show circle 1 again, it should be placed under circle 2\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"circle-layer-3\"\n        )\n      )\n    }\n  }\n\n  @Test\n  public fun testLayersInBelowLayerContent() {\n    val mapboxMap = setMapContent(\n      contentBelowCountryLabel = { btn1State, btn2State, _ ->\n        if (btn1State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI.offset(0.005))\n            },\n            layerId = remember { \"circle-layer-1\" }\n          ) {\n            circleColor = ColorValue(Color.Red)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n        if (btn2State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI)\n            },\n            layerId = remember { \"circle-layer-2\" }\n          ) {\n            circleColor = ColorValue(Color.Yellow)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n      }\n    )\n\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"country-label\",\n          \"continent-label\"\n        )\n      )\n    }\n\n    // Hide circle 1\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"settlement-major-label\",\n          \"state-label\",\n          \"circle-layer-2\",\n          \"country-label\",\n          \"continent-label\"\n        )\n      )\n    }\n    // Show circle 1 again, it should be placed under circle 2\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"country-label\",\n          \"continent-label\"\n        )\n      )\n    }\n\n    // Hide circle 2\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"settlement-major-label\",\n          \"state-label\",\n          \"circle-layer-1\",\n          \"country-label\",\n          \"continent-label\"\n        )\n      )\n    }\n    // Show circle 2, it should be placed above circle 1 and below \"country-label\"\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"country-label\",\n          \"continent-label\"\n        )\n      )\n    }\n\n    // Hide circle 1 and 2\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"settlement-major-label\",\n          \"state-label\",\n          \"country-label\",\n          \"continent-label\"\n        )\n      )\n    }\n\n    // Show circle 2, it should be placed  below \"country-label\"\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"circle-layer-2\",\n          \"country-label\",\n          \"continent-label\"\n        )\n      )\n    }\n    // Show circle 1, it should be placed below circle 1 and below \"country-label\"\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"country-label\",\n          \"continent-label\"\n        )\n      )\n    }\n  }\n\n  @Test\n  public fun testLayersInAboveLayerContent() {\n    val mapboxMap = setMapContent(\n      contentAboveCountryLabel = { btn1State, btn2State, _ ->\n        if (btn1State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI.offset(0.005))\n            },\n            layerId = remember { \"circle-layer-1\" }\n          ) {\n            circleColor = ColorValue(Color.Red)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n        if (btn2State) {\n          CircleLayer(\n            sourceState = rememberGeoJsonSourceState {\n              data = GeoJSONData(HELSINKI)\n            },\n            layerId = remember { \"circle-layer-2\" }\n          ) {\n            circleColor = ColorValue(Color.Yellow)\n            circleRadius = DoubleValue(30.0)\n          }\n        }\n      }\n    )\n\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"country-label\",\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"continent-label\"\n        )\n      )\n    }\n\n    // Hide circle 1\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"settlement-major-label\",\n          \"state-label\",\n          \"country-label\",\n          \"circle-layer-2\",\n          \"continent-label\"\n        )\n      )\n    }\n    // Show circle 1 again, it should be placed under circle 2\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"country-label\",\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"continent-label\"\n        )\n      )\n    }\n\n    // Hide circle 2\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"settlement-major-label\",\n          \"state-label\",\n          \"country-label\",\n          \"circle-layer-1\",\n          \"continent-label\"\n        )\n      )\n    }\n    // Show circle 2, it should be placed above circle 1 and above \"country-label\"\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"country-label\",\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"continent-label\"\n        )\n      )\n    }\n\n    // Hide both circle, it should be placed above circle 1 and above \"country-label\"\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"country-label\",\n          \"continent-label\"\n        )\n      )\n    }\n\n    // Show circle 2, it should be placed above \"country-label\"\n    composeTestRule.clickAndWait(BTN2_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"country-label\",\n          \"circle-layer-2\",\n          \"continent-label\"\n        )\n      )\n    }\n\n    // Show circle 1, it should be placed above \"country-label\" but below circle 2\n    composeTestRule.clickAndWait(BTN1_TAG)\n    composeTestRule.runOnUiThread {\n      mapboxMap.assertLayersPattern(\n        listOf(\n          \"state-label\",\n          \"country-label\",\n          \"circle-layer-1\",\n          \"circle-layer-2\",\n          \"continent-label\"\n        )\n      )\n    }\n  }\n\n  private fun setMapContent(\n    cameraCenter: Point = HELSINKI,\n    // if not null, try to load mapbox-street style so layer positions from style are available, and content will be inserted below \"country-label\" layer\n    contentBelowCountryLabel: (@Composable @MapboxMapComposable (Boolean, Boolean, Boolean) -> Unit)? = null,\n    slotContent: @Composable @MapboxMapComposable ((Boolean, Boolean, Boolean) -> Unit)? = null,\n    mapContent: @Composable @MapboxMapComposable (Boolean, Boolean, Boolean) -> Unit = { _, _, _ -> },\n    contentAboveCountryLabel: (@Composable @MapboxMapComposable (Boolean, Boolean, Boolean) -> Unit)? = null,\n  ): MapboxMap {\n    val mapLoadLatch = CountDownLatch(1)\n    lateinit var mapboxMap: MapboxMap\n    composeTestRule.setContent {\n      var btn1State by remember {\n        mutableStateOf(true)\n      }\n      var btn2State by remember {\n        mutableStateOf(true)\n      }\n      var btn3State by remember {\n        mutableStateOf(true)\n      }\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          Modifier\n            .fillMaxSize()\n            .testTag(MAP_TEST_TAG),\n          mapViewportState = rememberMapViewportState {\n            setCameraOptions {\n              zoom(ZOOM)\n              center(cameraCenter)\n            }\n          },\n          mapState = rememberMapState(),\n          style = {\n            if (contentBelowCountryLabel != null || contentAboveCountryLabel != null) {\n              GenericStyle(\n                style = Style.MAPBOX_STREETS,\n                layerPositionedContent = layerPositionedContent {\n                  belowLayer(\"country-label\") {\n                    contentBelowCountryLabel?.invoke(btn1State, btn2State, btn3State)\n                  }\n                  aboveLayer(\"country-label\") {\n                    contentAboveCountryLabel?.invoke(btn1State, btn2State, btn3State)\n                  }\n                }\n              )\n            } else if (slotContent != null) {\n              MapboxStandardStyle(\n                topSlot = {\n                  slotContent(btn1State, btn2State, btn3State)\n                }\n              )\n            } else {\n              GenericStyle(style = \"{}\")\n            }\n          }\n        ) {\n          MapEffect(Unit) {\n            it.mapboxMap.apply {\n              styleDataLoadedEvents.first()\n              mapboxMap = this\n              mapLoadLatch.countDown()\n            }\n          }\n          mapContent(btn1State, btn2State, btn3State)\n        }\n        Column {\n          Button(\n            modifier = Modifier.testTag(BTN1_TAG),\n            onClick = { btn1State = !btn1State }\n          ) {\n            Text(text = \"Button1\")\n          }\n          Button(\n            modifier = Modifier.testTag(BTN2_TAG),\n            onClick = { btn2State = !btn2State }\n          ) {\n            Text(text = \"Button2\")\n          }\n          Button(\n            modifier = Modifier.testTag(BTN3_TAG),\n            onClick = { btn3State = !btn3State }\n          ) {\n            Text(text = \"Button3\")\n          }\n        }\n      }\n    }\n\n    composeTestRule.waitForIdle()\n    Assert.assertTrue(mapLoadLatch.await(TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS))\n    return mapboxMap\n  }\n\n  private companion object {\n    private const val TAG = \"LayerPositionAwareNodeTest\"\n    private const val ZOOM: Double = 9.0\n    private const val BTN1_TAG = \"button1\"\n    private const val BTN2_TAG = \"button2\"\n    private const val BTN3_TAG = \"button3\"\n    private const val MAP_TEST_TAG = \"map_tag\"\n    private const val TEST_TIMEOUT_MS = 5000L\n    private const val INTERVAL = 0.01\n    private val CLUSTER_POINTS: List<Point> by lazy {\n      mutableListOf<Point>().apply {\n        repeat(10) { x ->\n          repeat(10) { y ->\n            add(\n              Point.fromLngLat(\n                HELSINKI.longitude() + INTERVAL * x,\n                HELSINKI.latitude() + INTERVAL * y\n              )\n            )\n          }\n        }\n      }\n    }\n  }\n\n  private fun ComposeContentTestRule.clickAndWait(tag: String) {\n    onNodeWithTag(tag).performClick()\n    waitForIdle()\n  }\n\n  private fun MapboxMap.assertLayersPattern(\n    layersPattern: List<String>,\n  ) {\n    styleLayers.map { it.id }.takeLast(layersPattern.size)\n      .onEach { logD(TAG, it) }\n      .forEachIndexed { index, layer ->\n        val regex = layersPattern[index].toRegex()\n        Assert.assertTrue(\n          \"match pattern failed for $layer, pattern: $regex\",\n          layer.matches(regex)\n        )\n      }\n  }\n}"
  },
  {
    "path": "extension-compose/src/androidTest/java/com/mapbox/maps/extension/compose/style/standard/StandardStyleConfigurationTest.kt",
    "content": "package com.mapbox.maps.extension.compose.style.standard\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.platform.testTag\nimport androidx.compose.ui.test.junit4.ComposeContentTestRule\nimport androidx.compose.ui.test.junit4.createComposeRule\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.coroutine.awaitStyle\nimport com.mapbox.maps.extension.compose.MapEffect\nimport com.mapbox.maps.extension.compose.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.internal.utils.CityLocations.HELSINKI\nimport com.mapbox.maps.extension.compose.rememberMapState\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\n\npublic class StandardStyleConfigurationTest {\n\n  @get:Rule\n  public val composeTestRule: ComposeContentTestRule = createComposeRule()\n\n  @Test\n  public fun testComprehensiveMapboxStandardStyleWithAllParameters() {\n    val configVerificationLatch = CountDownLatch(1)\n\n    createMapAndVerifyStyle(\n      styleContent = {\n        val standardStyleState = rememberStandardStyleState()\n        standardStyleState.configurationsState.apply {\n          // ALL Enum parameters from schema\n          theme = ThemeValue(\"faded\")\n          lightPreset = LightPresetValue.NIGHT\n          backgroundPointOfInterestLabels = BackgroundPointOfInterestLabelsValue.NONE\n          colorModePointOfInterestLabels = ColorModePointOfInterestLabelsValue.SINGLE\n\n          // ALL String parameters from schema\n          font = StringValue(\"Montserrat\")\n          themeData = StringValue(\"custom-theme\")\n\n          // ALL Boolean parameters from schema\n          showPointOfInterestLabels = BooleanValue(false)\n          showTransitLabels = BooleanValue(false)\n          showPlaceLabels = BooleanValue(true)\n          showRoadLabels = BooleanValue(true)\n          showPedestrianRoads = BooleanValue(false)\n          show3dObjects = BooleanValue(false)\n          showAdminBoundaries = BooleanValue(false)\n          showLandmarkIconLabels = BooleanValue(false)\n          showLandmarkIcons = BooleanValue(true)\n\n          // ALL Color parameters from schema\n          colorAdminBoundaries = ColorValue(Color.Red)\n          colorBuildingHighlight = ColorValue(Color.Green)\n          colorBuildingSelect = ColorValue(Color.Blue)\n          colorGreenspace = ColorValue(Color(0xFF228B22))\n          colorMotorways = ColorValue(Color.Yellow)\n          colorPlaceLabelHighlight = ColorValue(Color.Magenta)\n          colorPlaceLabels = ColorValue(Color.Black)\n          colorPlaceLabelSelect = ColorValue(Color.Cyan)\n          colorPointOfInterestLabels = ColorValue(Color.Gray)\n          colorRoadLabels = ColorValue(Color.White)\n          colorRoads = ColorValue(Color(0xFF696969))\n          colorTrunks = ColorValue(Color(0xFFA0A0A0))\n          colorWater = ColorValue(Color(0xFF87CEEB))\n\n          // ALL Number parameters from schema\n          densityPointOfInterestLabels = DoubleValue(5.0)\n          roadsBrightness = DoubleValue(0.8)\n        }\n        MapboxStandardStyle(standardStyleState = standardStyleState)\n      },\n      verification = { style ->\n        // Get ALL configuration properties at once\n        val allPropertiesResult = style.getStyleImportConfigProperties(\"basemap\")\n        Assert.assertTrue(\"Should be able to get config properties\", allPropertiesResult.isValue)\n\n        val allProperties = allPropertiesResult.value!! as Map<String, *>\n\n        // Define expected properties with their expected values\n        val expectedProperties = mapOf(\n          // Enum values\n          \"theme\" to \"faded\",\n          \"lightPreset\" to \"night\",\n          \"backgroundPointOfInterestLabels\" to \"none\",\n          \"colorModePointOfInterestLabels\" to \"single\",\n\n          // String values\n          \"font\" to \"Montserrat\",\n          \"theme-data\" to \"custom-theme\",\n\n          // Boolean values\n          \"showPointOfInterestLabels\" to false,\n          \"showTransitLabels\" to false,\n          \"showPlaceLabels\" to true,\n          \"showRoadLabels\" to true,\n          \"showPedestrianRoads\" to false,\n          \"show3dObjects\" to false,\n          \"showAdminBoundaries\" to false,\n          \"showLandmarkIconLabels\" to false,\n          \"showLandmarkIcons\" to true,\n\n          // Number values\n          \"densityPointOfInterestLabels\" to 5.0,\n          \"roadsBrightness\" to 0.8\n        )\n\n        // Color properties with their expected RGBA string values\n        val expectedColorProperties = mapOf(\n          \"colorAdminBoundaries\" to \"rgba(255, 0, 0, 1)\", // Color.Red\n          \"colorBuildingHighlight\" to \"rgba(0, 255, 0, 1)\", // Color.Green\n          \"colorBuildingSelect\" to \"rgba(0, 0, 255, 1)\", // Color.Blue\n          \"colorGreenspace\" to \"rgba(34, 139, 34, 1)\", // Color(0xFF228B22) - Forest Green\n          \"colorMotorways\" to \"rgba(255, 255, 0, 1)\", // Color.Yellow\n          \"colorPlaceLabelHighlight\" to \"rgba(255, 0, 255, 1)\", // Color.Magenta\n          \"colorPlaceLabels\" to \"rgba(0, 0, 0, 1)\", // Color.Black\n          \"colorPlaceLabelSelect\" to \"rgba(0, 255, 255, 1)\", // Color.Cyan\n          \"colorPointOfInterestLabels\" to \"rgba(136, 136, 136, 1)\", // Color.Gray\n          \"colorRoadLabels\" to \"rgba(255, 255, 255, 1)\", // Color.White\n          \"colorRoads\" to \"rgba(105, 105, 105, 1)\", // Color(0xFF696969) - Dim Gray\n          \"colorTrunks\" to \"rgba(160, 160, 160, 1)\", // Color(0xFFA0A0A0) - Dark Gray\n          \"colorWater\" to \"rgba(135, 206, 235, 1)\" // Color(0xFF87CEEB) - Sky Blue\n        )\n\n        // Verify all expected properties are set with correct values\n        expectedProperties.forEach { (key, expectedValue) ->\n          Assert.assertTrue(\"Property '$key' should be present\", allProperties.containsKey(key))\n          val stylePropertyValue = allProperties[key] as com.mapbox.maps.StylePropertyValue\n          val actualValue = stylePropertyValue.value.contents\n          Assert.assertEquals(\"Property '$key' should have correct value\", expectedValue, actualValue)\n        }\n\n        // Verify all color properties are present and have correct RGBA string values\n        expectedColorProperties.forEach { (colorProperty, expectedRgba) ->\n          Assert.assertTrue(\"Color property '$colorProperty' should be present\", allProperties.containsKey(colorProperty))\n          val stylePropertyValue = allProperties[colorProperty] as com.mapbox.maps.StylePropertyValue\n          val actualColorString = stylePropertyValue.value.contents as String\n          Assert.assertEquals(\n            \"Color '$colorProperty' should have correct RGBA value\",\n                             expectedRgba, actualColorString\n          )\n        }\n\n        // Verify we have all expected properties (should be 26 total for Standard style)\n        val totalExpectedProperties = expectedProperties.size + expectedColorProperties.size\n        Assert.assertEquals(\n          \"Should have all $totalExpectedProperties configuration properties\",\n                           totalExpectedProperties, allProperties.size\n        )\n\n        configVerificationLatch.countDown()\n      }\n    )\n\n    Assert.assertTrue(\"Configuration verification should complete\", configVerificationLatch.await(TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS))\n  }\n\n  @Test\n  public fun testComprehensiveMapboxStandardSatelliteStyleWithAllParameters() {\n    val configVerificationLatch = CountDownLatch(1)\n\n    createMapAndVerifyStyle(\n      styleContent = {\n        val standardSatelliteStyleState = rememberStandardSatelliteStyleState()\n        standardSatelliteStyleState.configurationsState.apply {\n          // ALL StandardSatellite Enum parameters from schema\n          lightPreset = LightPresetValue.DAWN\n          backgroundPointOfInterestLabels = BackgroundPointOfInterestLabelsValue.CIRCLE\n          colorModePointOfInterestLabels = ColorModePointOfInterestLabelsValue.DEFAULT_COLOR\n\n          // ALL StandardSatellite String parameters from schema\n          font = StringValue(\"Roboto\")\n\n          // ALL StandardSatellite Boolean parameters from schema (including satellite-specific ones)\n          showPointOfInterestLabels = BooleanValue(false)\n          showTransitLabels = BooleanValue(false)\n          showPlaceLabels = BooleanValue(true)\n          showRoadLabels = BooleanValue(true)\n          showRoadsAndTransit = BooleanValue(false) // This is satellite-specific\n          showPedestrianRoads = BooleanValue(false)\n          showAdminBoundaries = BooleanValue(true)\n\n          // ALL StandardSatellite Color parameters from schema\n          colorAdminBoundaries = ColorValue(Color.Cyan)\n          colorMotorways = ColorValue(Color.Magenta)\n          colorPlaceLabelHighlight = ColorValue(Color.Yellow)\n          colorPlaceLabels = ColorValue(Color.Black)\n          colorPlaceLabelSelect = ColorValue(Color.Red)\n          colorPointOfInterestLabels = ColorValue(Color.Gray)\n          colorRoadLabels = ColorValue(Color.White)\n          colorRoads = ColorValue(Color(0xFF808080))\n          colorTrunks = ColorValue(Color(0xFF90EE90))\n\n          // ALL StandardSatellite Number parameters from schema\n          densityPointOfInterestLabels = DoubleValue(2.0)\n          roadsBrightness = DoubleValue(0.5)\n        }\n        MapboxStandardSatelliteStyle(standardSatelliteStyleState = standardSatelliteStyleState)\n      },\n      verification = { style ->\n        // Get ALL configuration properties at once\n        val allPropertiesResult = style.getStyleImportConfigProperties(\"basemap\")\n        Assert.assertTrue(\"Should be able to get config properties\", allPropertiesResult.isValue)\n\n        val allProperties = allPropertiesResult.value!! as Map<String, *>\n\n        // Define expected properties with their expected values for StandardSatellite\n        val expectedProperties = mapOf(\n          // Enum values\n          \"lightPreset\" to \"dawn\",\n          \"backgroundPointOfInterestLabels\" to \"circle\",\n          \"colorModePointOfInterestLabels\" to \"default\",\n\n          // String values\n          \"font\" to \"Roboto\",\n\n          // Boolean values (including satellite-specific ones)\n          \"showPointOfInterestLabels\" to false,\n          \"showTransitLabels\" to false,\n          \"showPlaceLabels\" to true,\n          \"showRoadLabels\" to true,\n          \"showRoadsAndTransit\" to false, // This is satellite-specific\n          \"showPedestrianRoads\" to false,\n          \"showAdminBoundaries\" to true,\n\n          // Number values\n          \"densityPointOfInterestLabels\" to 2.0,\n          \"roadsBrightness\" to 0.5\n        )\n\n        // Color properties for StandardSatellite with their expected RGBA string values\n        val expectedColorProperties = mapOf(\n          \"colorAdminBoundaries\" to \"rgba(0, 255, 255, 1)\", // Color.Cyan\n          \"colorMotorways\" to \"rgba(255, 0, 255, 1)\", // Color.Magenta\n          \"colorPlaceLabelHighlight\" to \"rgba(255, 255, 0, 1)\", // Color.Yellow\n          \"colorPlaceLabels\" to \"rgba(0, 0, 0, 1)\", // Color.Black\n          \"colorPlaceLabelSelect\" to \"rgba(255, 0, 0, 1)\", // Color.Red\n          \"colorPointOfInterestLabels\" to \"rgba(136, 136, 136, 1)\", // Color.Gray\n          \"colorRoadLabels\" to \"rgba(255, 255, 255, 1)\", // Color.White\n          \"colorRoads\" to \"rgba(128, 128, 128, 1)\", // Color(0xFF808080) - Gray\n          \"colorTrunks\" to \"rgba(144, 238, 144, 1)\" // Color(0xFF90EE90) - Light Green\n        )\n\n        // Verify all expected properties are set with correct values\n        expectedProperties.forEach { (key, expectedValue) ->\n          Assert.assertTrue(\"Property '$key' should be present\", allProperties.containsKey(key))\n          val stylePropertyValue = allProperties[key] as com.mapbox.maps.StylePropertyValue\n          val actualValue = stylePropertyValue.value.contents\n          Assert.assertEquals(\"Property '$key' should have correct value\", expectedValue, actualValue)\n        }\n\n        // Verify all color properties are present and have correct RGBA string values\n        expectedColorProperties.forEach { (colorProperty, expectedRgba) ->\n          Assert.assertTrue(\"Color property '$colorProperty' should be present\", allProperties.containsKey(colorProperty))\n          val stylePropertyValue = allProperties[colorProperty] as com.mapbox.maps.StylePropertyValue\n          val actualColorString = stylePropertyValue.value.contents as String\n          Assert.assertEquals(\n            \"Color '$colorProperty' should have correct RGBA value\",\n                             expectedRgba, actualColorString\n          )\n        }\n\n        // Verify we have all expected properties (should be 22 total for StandardSatellite style)\n        val totalExpectedProperties = expectedProperties.size + expectedColorProperties.size\n        Assert.assertEquals(\n          \"Should have all $totalExpectedProperties configuration properties\",\n                           totalExpectedProperties, allProperties.size\n        )\n\n        configVerificationLatch.countDown()\n      }\n    )\n\n    Assert.assertTrue(\"Configuration verification should complete\", configVerificationLatch.await(TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS))\n  }\n\n  private fun createMapAndVerifyStyle(\n    styleContent: @Composable () -> Unit,\n    verification: (Style) -> Unit\n  ) {\n    val mapLoadLatch = CountDownLatch(1)\n\n    composeTestRule.setContent {\n      Box(modifier = Modifier.fillMaxSize()) {\n        MapboxMap(\n          Modifier\n            .fillMaxSize()\n            .testTag(MAP_TEST_TAG),\n          mapViewportState = rememberMapViewportState {\n            setCameraOptions {\n              zoom(ZOOM)\n              center(HELSINKI)\n            }\n          },\n          mapState = rememberMapState(),\n          style = styleContent\n        ) {\n          MapEffect(Unit) {\n            it.mapboxMap.apply {\n              awaitStyle()\n              // Verify configuration after style is loaded\n              verification(style!!)\n              mapLoadLatch.countDown()\n            }\n          }\n        }\n      }\n    }\n\n    composeTestRule.waitForIdle()\n    Assert.assertTrue(\"Map should load within timeout\", mapLoadLatch.await(TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS))\n  }\n\n  private companion object {\n    private const val ZOOM: Double = 9.0\n    private const val MAP_TEST_TAG = \"map_tag\"\n    private const val TEST_TIMEOUT_MS = 10000L\n  }\n}"
  },
  {
    "path": "extension-compose/src/androidTest/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"test_app_name\">Compose instrumentation app</string>\n</resources>"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/ComposeMapInitOptions.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport android.content.Context\nimport androidx.compose.runtime.Immutable\nimport com.mapbox.maps.MapInitOptions\nimport com.mapbox.maps.MapOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.applyDefaultParams\nimport com.mapbox.maps.plugin.Plugin\n\n/**\n * Defines configuration [ComposeMapInitOptions] for a [MapboxMap] composable function.\n *\n * @property mapOptions Describes the map options value when using a MapView.\n * @property textureView Flag indicating to use a TextureView as render surface for the MapView. Default is false.\n * @property antialiasingSampleCount Sample count to control multisample anti-aliasing (MSAA) option for rendering. E.g. passing 4 enables MSAA x4 if it is supported. Default is 1 (MSAA turned off).\n * @property mapName Custom name which will be appended to map render related logs. May be useful when using several [MapView]s. Defaults to an empty string.\n */\n@Immutable\npublic data class ComposeMapInitOptions(\n  val mapOptions: MapOptions,\n  val textureView: Boolean = false,\n  val antialiasingSampleCount: Int = DEFAULT_ANTIALIASING_SAMPLE_COUNT,\n  val mapName: String = \"\",\n) {\n  public constructor(\n    pixelRatio: Float,\n    textureView: Boolean = false,\n    antialiasingSampleCount: Int = DEFAULT_ANTIALIASING_SAMPLE_COUNT,\n    mapName: String = \"\",\n  ) : this(\n    mapOptions = MapOptions.Builder().applyDefaultParams(pixelRatio).build(),\n    textureView = textureView,\n    antialiasingSampleCount = antialiasingSampleCount,\n    mapName = mapName\n  )\n\n  internal fun getMapInitOptions(context: Context): MapInitOptions {\n    return MapInitOptions(\n      context = context,\n      mapOptions = mapOptions,\n      // specifically disable following plugins because these are handled within compose extension.\n      plugins = MapInitOptions.defaultPluginList - setOf<Plugin>(\n        Plugin.Mapbox(Plugin.MAPBOX_LIFECYCLE_PLUGIN_ID),\n        Plugin.Mapbox(Plugin.MAPBOX_LOGO_PLUGIN_ID),\n        Plugin.Mapbox(Plugin.MAPBOX_ATTRIBUTION_PLUGIN_ID),\n        Plugin.Mapbox(Plugin.MAPBOX_SCALEBAR_PLUGIN_ID),\n        Plugin.Mapbox(Plugin.MAPBOX_COMPASS_PLUGIN_ID),\n      ),\n      // specifically set cameraOptions to null, since the camera is controlled through MapViewportState.\n      cameraOptions = null,\n      textureView = textureView,\n      // specifically set styleUri to null, since the default style is provided through style composable function.\n      styleUri = null,\n      attrs = null,\n      antialiasingSampleCount = antialiasingSampleCount,\n      mapName = mapName\n    )\n  }\n\n  /**\n   * Companion object.\n   */\n  public companion object {\n    /**\n     * Defines the default antialiasing sample count.\n     */\n    public const val DEFAULT_ANTIALIASING_SAMPLE_COUNT: Int = 1\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/DisposableMapEffect.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.DisposableEffectResult\nimport androidx.compose.runtime.DisposableEffectScope\nimport androidx.compose.runtime.currentComposer\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.extension.compose.internal.MapApplier\n\n/**\n * [DisposableMapEffect] is a [DisposableEffect] that provides the raw map controller. Use this API\n * to interact with all the raw Mapbox Maps SDK APIs.\n *\n * Note: Use raw map controller with caution, as it may alter the map state without notifying the compose\n * node tree and result in unexpected behaviour.\n */\n@Composable\n@MapboxMapComposable\npublic fun DisposableMapEffect(key1: Any?, block: DisposableEffectScope.(MapView) -> DisposableEffectResult) {\n  val map = (currentComposer.applier as MapApplier).mapView\n  DisposableEffect(key1 = key1) {\n    block(map)\n  }\n}\n\n/**\n * [DisposableMapEffect] is a [DisposableEffect] that provides the raw map controller. Use this API\n * to interact with all the raw Mapbox Maps SDK APIs.\n *\n * Note: Use raw map controller with caution, as it may alter the map state without notifying the compose\n * node tree and result in unexpected behaviour.\n */\n@Composable\n@MapboxMapComposable\npublic fun DisposableMapEffect(key1: Any?, key2: Any?, block: DisposableEffectScope.(MapView) -> DisposableEffectResult) {\n  val map = (currentComposer.applier as MapApplier).mapView\n  DisposableEffect(key1 = key1, key2 = key2) {\n    block(map)\n  }\n}\n\n/**\n * [DisposableMapEffect] is a [DisposableEffect] that provides the raw map controller. Use this API\n * to interact with all the raw Mapbox Maps SDK APIs.\n *\n * Note: Use raw map controller with caution, as it may alter the map state without notifying the compose\n * node tree and result in unexpected behaviour.\n */\n@Composable\n@MapboxMapComposable\npublic fun DisposableMapEffect(\n  key1: Any?,\n  key2: Any?,\n  key3: Any?,\n  block: DisposableEffectScope.(MapView) -> DisposableEffectResult\n) {\n  val map = (currentComposer.applier as MapApplier).mapView\n  DisposableEffect(key1 = key1, key2 = key2, key3 = key3) {\n    block(map)\n  }\n}\n\n/**\n * [DisposableMapEffect] is a [DisposableEffect] that provides the raw map controller. Use this API\n * to interact with all the raw Mapbox Maps SDK APIs.\n *\n * Note: Use raw map controller with caution, as it may alter the map state without notifying the compose\n * node tree and result in unexpected behaviour.\n */\n@Composable\n@MapboxMapComposable\npublic fun DisposableMapEffect(vararg keys: Any?, block: DisposableEffectScope.(MapView) -> DisposableEffectResult) {\n  val map = (currentComposer.applier as MapApplier).mapView\n  DisposableEffect(keys = keys) {\n    block(map)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/MapEffect.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.currentComposer\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport kotlinx.coroutines.CoroutineScope\n\n/**\n * When MapEffect enters the composition it will launch [block] into the composition's CoroutineContext.\n * The coroutine will be cancelled and re-launched when [MapEffect] is recomposed with a different [key1].\n *\n * The coroutine will be cancelled when the [MapEffect] leaves the composition.\n *\n * This function should not be used to (re-)launch ongoing tasks in response to callback events by\n * way of storing callback data in MutableState passed to key. Instead, see rememberCoroutineScope\n * to obtain a CoroutineScope that may be used to launch ongoing jobs scoped to the composition in\n * response to event callbacks.\n */\n@Composable\n@MapboxMapComposable\npublic fun MapEffect(key1: Any?, block: suspend CoroutineScope.(MapView) -> Unit) {\n  val map = (currentComposer.applier as MapApplier).mapView\n  LaunchedEffect(key1 = key1) {\n    block(map)\n  }\n}\n\n/**\n * When MapEffect enters the composition it will launch [block] into the composition's CoroutineContext.\n * The coroutine will be cancelled and re-launched when [MapEffect] is recomposed with a different [key1]\n * or [key2].\n *\n * The coroutine will be cancelled when the [MapEffect] leaves the composition.\n *\n * This function should not be used to (re-)launch ongoing tasks in response to callback events by\n * way of storing callback data in MutableState passed to key. Instead, see rememberCoroutineScope\n * to obtain a CoroutineScope that may be used to launch ongoing jobs scoped to the composition in\n * response to event callbacks.\n */\n@Composable\n@MapboxMapComposable\npublic fun MapEffect(key1: Any?, key2: Any?, block: suspend CoroutineScope.(MapView) -> Unit) {\n  val map = (currentComposer.applier as MapApplier).mapView\n  LaunchedEffect(key1 = key1, key2 = key2) {\n    block(map)\n  }\n}\n\n/**\n * When MapEffect enters the composition it will launch [block] into the composition's CoroutineContext.\n * The coroutine will be cancelled and re-launched when [MapEffect] is recomposed with a different [key1],\n * [key2] or [key3].\n *\n * The coroutine will be cancelled when the [MapEffect] leaves the composition.\n *\n * This function should not be used to (re-)launch ongoing tasks in response to callback events by\n * way of storing callback data in MutableState passed to key. Instead, see rememberCoroutineScope\n * to obtain a CoroutineScope that may be used to launch ongoing jobs scoped to the composition in\n * response to event callbacks.\n */\n@Composable\n@MapboxMapComposable\npublic fun MapEffect(\n  key1: Any?,\n  key2: Any?,\n  key3: Any?,\n  block: suspend CoroutineScope.(MapView) -> Unit\n) {\n  val map = (currentComposer.applier as MapApplier).mapView\n  LaunchedEffect(key1 = key1, key2 = key2, key3 = key3) {\n    block(map)\n  }\n}\n\n/**\n * When MapEffect enters the composition it will launch [block] into the composition's CoroutineContext.\n * The coroutine will be cancelled and re-launched when [MapEffect] is recomposed with any different [keys].\n *\n * The coroutine will be cancelled when the [MapEffect] leaves the composition.\n *\n * This function should not be used to (re-)launch ongoing tasks in response to callback events by\n * way of storing callback data in MutableState passed to key. Instead, see rememberCoroutineScope\n * to obtain a CoroutineScope that may be used to launch ongoing jobs scoped to the composition in\n * response to event callbacks.\n */\n@Composable\n@MapboxMapComposable\npublic fun MapEffect(vararg keys: Any?, block: suspend CoroutineScope.(MapView) -> Unit) {\n  val map = (currentComposer.applier as MapApplier).mapView\n  LaunchedEffect(keys = keys) {\n    block(map)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/MapState.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport android.os.Parcelable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraChanged\nimport com.mapbox.maps.CameraChangedCoalesced\nimport com.mapbox.maps.GenericEvent\nimport com.mapbox.maps.MapIdle\nimport com.mapbox.maps.MapLoaded\nimport com.mapbox.maps.MapLoadingError\nimport com.mapbox.maps.MapOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.QueriedRasterValues\nimport com.mapbox.maps.QueriedRenderedFeature\nimport com.mapbox.maps.RenderFrameFinished\nimport com.mapbox.maps.RenderFrameStarted\nimport com.mapbox.maps.RenderedQueryGeometry\nimport com.mapbox.maps.RenderedQueryOptions\nimport com.mapbox.maps.RenderedRasterQueryOptions\nimport com.mapbox.maps.ResourceRequest\nimport com.mapbox.maps.ScreenBox\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.SourceAdded\nimport com.mapbox.maps.SourceDataLoaded\nimport com.mapbox.maps.SourceRemoved\nimport com.mapbox.maps.StyleDataLoaded\nimport com.mapbox.maps.StyleImageMissing\nimport com.mapbox.maps.StyleImageRemoveUnused\nimport com.mapbox.maps.StyleLoaded\nimport com.mapbox.maps.coroutine.cameraChangedCoalescedEvents\nimport com.mapbox.maps.coroutine.cameraChangedEvents\nimport com.mapbox.maps.coroutine.genericEvents\nimport com.mapbox.maps.coroutine.mapIdleEvents\nimport com.mapbox.maps.coroutine.mapLoadedEvents\nimport com.mapbox.maps.coroutine.mapLoadingErrorEvents\nimport com.mapbox.maps.coroutine.queryRenderedFeatures\nimport com.mapbox.maps.coroutine.queryRenderedRasterValues\nimport com.mapbox.maps.coroutine.renderFrameFinishedEvents\nimport com.mapbox.maps.coroutine.renderFrameStartedEvents\nimport com.mapbox.maps.coroutine.resourceRequestEvents\nimport com.mapbox.maps.coroutine.sourceAddedEvents\nimport com.mapbox.maps.coroutine.sourceDataLoadedEvents\nimport com.mapbox.maps.coroutine.sourceRemovedEvents\nimport com.mapbox.maps.coroutine.styleDataLoadedEvents\nimport com.mapbox.maps.coroutine.styleImageMissingEvents\nimport com.mapbox.maps.coroutine.styleImageRemoveUnusedEvents\nimport com.mapbox.maps.coroutine.styleLoadedEvents\nimport com.mapbox.maps.extension.compose.animation.viewport.MapViewportState\nimport com.mapbox.maps.extension.compose.internal.applySettings\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeatureStateKey\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettings\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.emptyFlow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport kotlinx.parcelize.Parcelize\nimport kotlin.coroutines.resume\n\n/**\n * Create and [rememberSaveable] a [MapState] using [MapState.Saver].\n * [init] will be called when the [MapState] is first created to configure its\n * initial state.\n */\n@Composable\npublic inline fun rememberMapState(\n  key: String? = null,\n  crossinline init: MapState.() -> Unit = {}\n): MapState = rememberSaveable(key = key, saver = MapState.Saver) {\n  MapState().apply(init)\n}\n\n/**\n * The [MapState] that can be hoisted to observe map events, query rendered features and control gestures settings.\n */\n@OptIn(ExperimentalCoroutinesApi::class)\n@Stable\npublic class MapState internal constructor(initialGesturesSettings: GesturesSettings) {\n\n  /**\n   * Constructor for the [MapState].\n   */\n  public constructor() : this(initialGesturesSettings = GesturesSettings { })\n\n  /**\n   * A flow used to indicate the [MapState] is attached to the map.\n   */\n  private val mapboxMapFlow: MutableStateFlow<MapboxMap?> = MutableStateFlow(null)\n\n  private val gesturesState: MutableState<GesturesSettings> =\n    mutableStateOf(initialGesturesSettings)\n\n  /**\n   * Gesture configuration allows to control the user touch interaction.\n   */\n  public var gesturesSettings: GesturesSettings by gesturesState\n\n  @Composable\n  private fun UpdateGesturesSettings(mapboxMap: MapboxMap) {\n    mapboxMap.gesturesPlugin { applySettings(gesturesSettings) }\n  }\n\n  /**\n   * Conflated [Flow] of [MapLoaded] updates from [MapboxMap.subscribeMapLoaded].\n   */\n  public val mapLoadedEvents: Flow<MapLoaded> = mapboxMapFlow.flatMapLatest {\n    it?.mapLoadedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [MapLoadingError] updates from [MapboxMap.subscribeMapLoadingError].\n   */\n  public val mapLoadingErrorEvents: Flow<MapLoadingError> = mapboxMapFlow.flatMapLatest {\n    it?.mapLoadingErrorEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [StyleLoaded] updates from [MapboxMap.subscribeStyleLoaded].\n   */\n  public val styleLoadedEvents: Flow<StyleLoaded> = mapboxMapFlow.flatMapLatest {\n    it?.styleLoadedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [StyleDataLoaded] updates from [MapboxMap.subscribeStyleDataLoaded].\n   */\n  public val styleDataLoadedEvents: Flow<StyleDataLoaded> = mapboxMapFlow.flatMapLatest {\n    it?.styleDataLoadedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [CameraChanged] updates from [MapboxMap.subscribeCameraChanged].\n   */\n  public val cameraChangedEvents: Flow<CameraChanged> = mapboxMapFlow.flatMapLatest {\n    it?.cameraChangedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [CameraChangedCoalesced] updates from [MapboxMap.subscribeCameraChangedCoalesced].\n   */\n  @com.mapbox.annotation.MapboxExperimental\n  public val cameraChangedCoalescedEvents: Flow<CameraChangedCoalesced> = mapboxMapFlow.flatMapLatest {\n    it?.cameraChangedCoalescedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [MapIdle] updates from [MapboxMap.subscribeMapIdle].\n   */\n  public val mapIdleEvents: Flow<MapIdle> = mapboxMapFlow.flatMapLatest {\n    it?.mapIdleEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [SourceAdded] updates from [MapboxMap.subscribeSourceAdded].\n   */\n  public val sourceAddedEvents: Flow<SourceAdded> = mapboxMapFlow.flatMapLatest {\n    it?.sourceAddedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [SourceRemoved] updates from [MapboxMap.subscribeSourceRemoved].\n   */\n  public val sourceRemovedEvents: Flow<SourceRemoved> = mapboxMapFlow.flatMapLatest {\n    it?.sourceRemovedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [SourceDataLoaded] updates from [MapboxMap.subscribeSourceDataLoaded].\n   */\n  public val sourceDataLoadedEvents: Flow<SourceDataLoaded> = mapboxMapFlow.flatMapLatest {\n    it?.sourceDataLoadedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [StyleImageMissing] updates from [MapboxMap.subscribeStyleImageMissing].\n   */\n  public val styleImageMissingEvents: Flow<StyleImageMissing> = mapboxMapFlow.flatMapLatest {\n    it?.styleImageMissingEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [StyleImageRemoveUnused] updates from [MapboxMap.subscribeStyleImageRemoveUnused].\n   */\n  public val styleImageRemoveUnusedEvents: Flow<StyleImageRemoveUnused> =\n    mapboxMapFlow.flatMapLatest {\n      it?.styleImageRemoveUnusedEvents ?: emptyFlow()\n    }\n\n  /**\n   * Conflated [Flow] of [RenderFrameStarted] updates from [MapboxMap.subscribeRenderFrameStarted].\n   */\n  public val renderFrameStartedEvents: Flow<RenderFrameStarted> = mapboxMapFlow.flatMapLatest {\n    it?.renderFrameStartedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [RenderFrameFinished] updates from [MapboxMap.subscribeRenderFrameFinished].\n   */\n  public val renderFrameFinishedEvents: Flow<RenderFrameFinished> = mapboxMapFlow.flatMapLatest {\n    it?.renderFrameFinishedEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [ResourceRequest] updates from [MapboxMap.subscribeResourceRequest].\n   */\n  public val resourceRequestEvents: Flow<ResourceRequest> = mapboxMapFlow.flatMapLatest {\n    it?.resourceRequestEvents ?: emptyFlow()\n  }\n\n  /**\n   * Conflated [Flow] of [GenericEvent] updates from [MapboxMap.subscribeGenericEvent].\n   */\n  @MapboxExperimental\n  public fun genericEvents(eventName: String): Flow<GenericEvent> = mapboxMapFlow.flatMapLatest {\n    it?.genericEvents(eventName) ?: emptyFlow()\n  }\n\n  /**\n   * Queries the map for rendered features.\n   *\n   * It will suspend until current [MapState] is set to the [MapboxMap] composable function.\n   *\n   * @param geometry The `screen pixel coordinates` (point, line string or box) to query for rendered features.\n   * @param options The `render query options` for querying rendered features.\n   *\n   * @return a list of [QueriedRenderedFeature] or a string describing an error.\n   */\n  public suspend fun queryRenderedFeatures(\n    geometry: RenderedQueryGeometry,\n    options: RenderedQueryOptions\n  ): Expected<String, List<QueriedRenderedFeature>> =\n    mapboxMapFlow.filterNotNull().first().queryRenderedFeatures(geometry, options)\n\n  /**\n   * Queries the map for given [descriptor] and returns typed [FeaturesetFeature] list of rendered features.\n   *\n   * @param geometry The optional geometry ([ScreenCoordinate], [ScreenBox] or list of [ScreenCoordinate]s) to query for rendered features.\n   *  Passing NULL is equivalent to passing a bounding box encompassing the entire map viewport.\n   * @param descriptor [TypedFeaturesetDescriptor] object representing either a featureset or a single layer.\n   * @param filter optional global filter.\n   *\n   * @return A typed instance list of the [FeaturesetFeature].\n   */\n  @MapboxExperimental\n  @JvmOverloads\n  public suspend fun <FF : FeaturesetFeature<*>> queryRenderedFeatures(\n    descriptor: TypedFeaturesetDescriptor<*, FF>,\n    geometry: RenderedQueryGeometry? = null,\n    filter: Expression? = null,\n  ): List<FF> {\n    mapboxMapFlow.filterNotNull().first().apply {\n      return suspendCancellableCoroutine { continuation ->\n        val cancelable = queryRenderedFeatures(\n          geometry = geometry,\n          descriptor = descriptor,\n          filter = filter,\n          callback = continuation::resume\n        )\n        continuation.invokeOnCancellation {\n          cancelable.cancel()\n        }\n      }\n    }\n  }\n\n  /**\n   * Queries the map for rendered raster values at a specific coordinate.\n   *\n   * @param coordinate The position on the screen to query.\n   * @param options The options for configuring the rendered raster value query.\n   *\n   * @return [QueriedRasterValues] containing raster values or a string describing an error.\n   */\n  @MapboxExperimental\n  public suspend fun queryRenderedRasterValues(\n    coordinate: ScreenCoordinate,\n    options: RenderedRasterQueryOptions\n  ): Expected<String, QueriedRasterValues> =\n    mapboxMapFlow.filterNotNull().first().queryRenderedRasterValues(coordinate, options)\n\n  /**\n   * Gets the state map of a feature from a featureset asynchronously.\n   *\n   * @param featuresetFeature the featureset feature coming from an interaction callback or [queryRenderedFeatures].\n   *\n   * @return A concrete instance of [FeatureState].\n   */\n  @MapboxExperimental\n  public suspend fun <FS : FeatureState> getFeatureState(\n    featuresetFeature: FeaturesetFeature<FS>,\n  ): FS {\n    mapboxMapFlow.filterNotNull().first().apply {\n      return suspendCancellableCoroutine { continuation ->\n        val cancelable = getFeatureState(\n          featuresetFeature = featuresetFeature,\n          callback = continuation::resume\n        )\n        continuation.invokeOnCancellation {\n          cancelable.cancel()\n        }\n      }\n    }\n  }\n\n  /**\n   * Sets the state map for given [featuresetFeature] coming from an interaction callback asynchronously.\n   *\n   * @param featuresetFeature the featureset feature coming from an interaction callback or [queryRenderedFeatures].\n   * @param state describes the new state of the map for given [featuresetFeature].\n   *\n   * @return the optional error wrapped in [Expected].\n   */\n  @MapboxExperimental\n  public suspend fun <FS : FeatureState> setFeatureState(\n    featuresetFeature: FeaturesetFeature<FS>,\n    state: FS,\n  ): Expected<String, com.mapbox.bindgen.None> {\n    mapboxMapFlow.filterNotNull().first().apply {\n      return suspendCancellableCoroutine { continuation ->\n        val cancelable = setFeatureState(\n          featuresetFeature = featuresetFeature,\n          state = state,\n          callback = continuation::resume\n        )\n        continuation.invokeOnCancellation {\n          cancelable.cancel()\n        }\n      }\n    }\n  }\n\n  /**\n   * Removes entries from a feature state based on [featuresetFeature] coming from an interaction callback.\n   *\n   * Removes a specified property or all property from a feature's state object, depending on the value of\n   * [stateKey].\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using [getFeatureState].\n   *\n   * @param featuresetFeature The featureset feature coming from an interaction callback.\n   * @param stateKey The generic key of the property to remove. If `null`, all feature's state object properties are removed.\n   *\n   * @return the optional error wrapped in [Expected].\n   */\n  @MapboxExperimental\n  @JvmOverloads\n  public suspend fun <FS, FSK> removeFeatureState(\n    featuresetFeature: FeaturesetFeature<FS>,\n    stateKey: FSK? = null,\n  ): Expected<String, com.mapbox.bindgen.None> where FS : FeatureState, FSK : FeatureStateKey<FS> {\n    mapboxMapFlow.filterNotNull().first().apply {\n      return suspendCancellableCoroutine { continuation ->\n        val cancelable = removeFeatureState(\n          featuresetFeature = featuresetFeature,\n          stateKey = stateKey,\n          callback = continuation::resume\n        )\n        continuation.invokeOnCancellation {\n          cancelable.cancel()\n        }\n      }\n    }\n  }\n\n  /**\n   * Reset all the feature states within a style source.\n   *\n   * Remove all feature state entries from the specified style source or source layer.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using [getFeatureState].\n   *\n   * @param descriptor [TypedFeaturesetDescriptor] object representing either a featureset or a single layer.\n   *\n   * @return the optional error wrapped in [Expected].\n   */\n  @MapboxExperimental\n  public suspend fun resetFeatureStates(\n    descriptor: TypedFeaturesetDescriptor<*, *>,\n  ): Expected<String, com.mapbox.bindgen.None> {\n    mapboxMapFlow.filterNotNull().first().apply {\n      return suspendCancellableCoroutine { continuation ->\n        val cancelable = resetFeatureStates(\n          descriptor = descriptor,\n          callback = continuation::resume\n        )\n        continuation.invokeOnCancellation {\n          cancelable.cancel()\n        }\n      }\n    }\n  }\n\n  /**\n   * Calculate a screen coordinate that corresponds to a geographical coordinate\n   * (i.e., longitude-latitude pair).\n   *\n   * The screen coordinate is in [MapOptions.size] platform pixels relative to the top left\n   * of the map (not of the whole screen).\n   *\n   * Map must be fully loaded for getting an altitude-compliant result if using 3D terrain.\n   *\n   * If the screen coordinate is outside of the bounds of [MapView] the returned screen coordinate\n   * contains -1 for both coordinates.\n   *\n   * This API isn't supported by Globe projection and will return a no-op result matching center of\n   * the screen.\n   * See [com.mapbox.maps.extension.style.projection.generated.setProjection]\n   * and [com.mapbox.maps.extension.style.projection.generated.getProjection]\n   *\n   * It will suspend until current [MapState] is set to the [MapboxMap] composable function.\n   *\n   * @param coordinate A geographical coordinate on the map to convert to a screen coordinate.\n   *\n   * @return Returns a screen coordinate on the screen in [MapOptions.size] platform pixels. If the screen coordinate is outside of the bounds of [MapView] the returned screen coordinate contains -1 for both coordinates.\n   */\n  public suspend fun pixelForCoordinate(coordinate: Point): ScreenCoordinate =\n    mapboxMapFlow.filterNotNull().first().pixelForCoordinate(coordinate)\n\n  /**\n   * Attach the [MapState] to the [MapboxMap].\n   */\n  @Composable\n  internal fun BindToMap(mapboxMap: MapboxMap) {\n    UpdateGesturesSettings(mapboxMap = mapboxMap)\n    DisposableEffect(Unit) {\n      mapboxMapFlow.value = mapboxMap\n      onDispose {\n        mapboxMapFlow.value = null\n      }\n    }\n  }\n\n  /**\n   * [MapState] Holder class to be used within [Saver].\n   *\n   * @param savedProperties properties to be saved\n   */\n  @Parcelize\n  public data class Holder(\n    val savedProperties: Map<String, Parcelable>\n  ) : Parcelable\n\n  /**\n   * Public companion object of [MapState].\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [MapViewportState]\n     */\n    public val Saver: Saver<MapState, Holder> = Saver(\n      save = { mapState ->\n        Holder(\n          mapOf(GESTURES_SETTINGS_KEY to mapState.gesturesSettings)\n        ).also { logD(TAG, \"save: $it\") }\n      },\n      restore = { holder ->\n        MapState(\n          (\n            holder.savedProperties[GESTURES_SETTINGS_KEY] as? GesturesSettings\n              ?: GesturesSettings { }\n            ).also { logD(TAG, \"restore: $it\") }\n        )\n      }\n    )\n    private const val TAG = \"MapState\"\n    private const val GESTURES_SETTINGS_KEY = \"GesturesSettings\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/MapboxMap.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Composition\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCompositionContext\nimport androidx.compose.runtime.rememberUpdatedState\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.platform.LocalDensity\nimport androidx.compose.ui.platform.LocalInspectionMode\nimport androidx.compose.ui.viewinterop.AndroidView\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.animation.viewport.MapViewportState\nimport com.mapbox.maps.extension.compose.animation.viewport.rememberMapViewportState\nimport com.mapbox.maps.extension.compose.internal.ComposeTelemetryEvents\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.internal.MapPreviewPlaceHolder\nimport com.mapbox.maps.extension.compose.internal.MapViewLifecycle\nimport com.mapbox.maps.extension.compose.internal.MapboxMapComposeNode\nimport com.mapbox.maps.extension.compose.ornaments.attribution.MapAttributionScope\nimport com.mapbox.maps.extension.compose.ornaments.compass.MapCompassScope\nimport com.mapbox.maps.extension.compose.ornaments.logo.MapLogoScope\nimport com.mapbox.maps.extension.compose.ornaments.scalebar.MapScaleBarScope\nimport com.mapbox.maps.extension.compose.style.MapboxStyleComposable\nimport com.mapbox.maps.extension.compose.style.standard.MapboxStandardStyle\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.OnMapLongClickListener\nimport kotlinx.coroutines.awaitCancellation\n\n/**\n * Entry point for adding a Mapbox Map instance to the Jetpack Compose UI.\n *\n * @param modifier Modifier to be applied to the Mapbox map.\n * @param composeMapInitOptions Defines the initialisation configurations for a [MapboxMap]. It should only be set once and not mutated after the initialisation. Mutating the [ComposeMapInitOptions] will result in internal [MapView] recreation and impact performance.\n * @param compass The Mapbox Compass ornament of the map, consider using [MapCompassScope.Compass].\n * @param scaleBar The Mapbox ScaleBar ornament of the map, consider using [MapScaleBarScope.ScaleBar].\n * @param logo The Mapbox Logo ornament of the map, consider using [MapLogoScope.Logo].\n * @param attribution The Mapbox Attribution ornament of the map, consider using [MapAttributionScope.Attribution].\n * @param mapViewportState A state object that can be hoisted to control and observe the map's camera state. A [MapViewportState] may only be used by a single [MapboxMap] composable at a time as it reflects instance state for a single view of a map.\n * @param mapState A state object that can be hoisted to query map rendered features and gestures settings.\n * @param onMapClickListener Callback to be invoked when the user clicks on the map view.\n * @param onMapLongClickListener Callback to be invoked when the user long clicks on the map view.\n * @param style The Style of the map.\n * @param content The content of the map.\n */\n@Composable\npublic fun MapboxMap(\n  modifier: Modifier = Modifier,\n  composeMapInitOptions: ComposeMapInitOptions = with(LocalDensity.current) {\n    remember {\n      ComposeMapInitOptions(density)\n    }\n  },\n  compass: (@Composable MapCompassScope.() -> Unit) = { Compass() },\n  scaleBar: (@Composable MapScaleBarScope.() -> Unit) = { ScaleBar() },\n  logo: (@Composable MapLogoScope.() -> Unit) = { Logo() },\n  attribution: (@Composable MapAttributionScope.() -> Unit) = { Attribution() },\n  mapViewportState: MapViewportState = rememberMapViewportState(),\n  mapState: MapState = rememberMapState(),\n  onMapClickListener: OnMapClickListener? = null,\n  onMapLongClickListener: OnMapLongClickListener? = null,\n  style: @Composable @MapboxStyleComposable () -> Unit = { MapboxStandardStyle() },\n  content: (@Composable @MapboxMapComposable MapboxMapScope.() -> Unit)? = null\n) {\n  // display placeholder when in preview mode.\n  if (LocalInspectionMode.current) {\n    MapPreviewPlaceHolder(modifier)\n    return\n  }\n\n  // Workaround for \"place is called on a deactivated node\" crash in LazyColumn.\n  // During fast scroll, LazyColumn can deactivate a slot mid-layout-pass. At that point the slot\n  // root's MeasurePolicy calls place() on its direct children — crashing if AndroidView's holder\n  // node is one of them. Box acts as a stable intermediate LayoutNode: it stays as the direct\n  // child of the slot root, while key() safely resets the map content inside it.\n  Box(modifier = modifier) {\n    // Re-create the map every time the init options change\n    key(composeMapInitOptions) {\n      val context = LocalContext.current\n      val mapView = remember {\n        ComposeTelemetryEvents.map.increment()\n        MapView(\n          context,\n          mapInitOptions = composeMapInitOptions.getMapInitOptions(context)\n        )\n      }\n      MapViewLifecycle(mapView = mapView)\n\n      Box(modifier = Modifier.fillMaxSize()) {\n        AndroidView(\n          factory = { mapView },\n          modifier = Modifier.fillMaxSize(),\n        )\n        MapCompassScope(mapView, this).compass()\n        MapScaleBarScope(mapView, this).scaleBar()\n        MapLogoScope(this).logo()\n        MapAttributionScope(mapView, this).attribution()\n      }\n\n      key(mapViewportState) {\n        mapViewportState.BindToMap(mapView = mapView)\n      }\n      key(mapState) {\n        mapState.BindToMap(mapboxMap = mapView.mapboxMap)\n      }\n\n      val parentComposition = rememberCompositionContext()\n      val currentOnMapClickListener by rememberUpdatedState(onMapClickListener)\n      val currentOnMapLongClickListener by rememberUpdatedState(onMapLongClickListener)\n      val currentContent by rememberUpdatedState(content)\n      val currentStyle by rememberUpdatedState(style)\n      LaunchedEffect(Unit) {\n        disposingComposition(\n          Composition(\n            MapApplier(mapView), parentComposition\n          ).apply {\n            setContent {\n              MapboxMapComposeNode(\n                currentOnMapClickListener,\n                currentOnMapLongClickListener,\n              )\n              // add Style node with the styleUri\n              currentStyle.invoke()\n              currentContent?.let { MapboxMapScope.it() }\n            }\n          }\n        )\n      }\n    }\n  }\n}\n\nprivate suspend inline fun disposingComposition(composition: Composition) {\n  try {\n    awaitCancellation()\n  } finally {\n    composition.dispose()\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/MapboxMapComposable.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport androidx.compose.runtime.ComposableTargetMarker\n\n/**\n * Marks a composable function as being expected to be used inside another composable function that is\n * also marked or inferred to be marked as a [MapboxMapComposable].\n *\n * This will produce build warnings when [MapboxMapComposable] composable functions are used outside\n * of a [MapboxMapComposable] content lambda, and vice versa.\n */\n@Retention(AnnotationRetention.BINARY)\n@ComposableTargetMarker(description = \"Mapbox Map Composable\")\n@Target(\n  AnnotationTarget.FILE,\n  AnnotationTarget.FUNCTION,\n  AnnotationTarget.PROPERTY_GETTER,\n  AnnotationTarget.TYPE,\n  AnnotationTarget.TYPE_PARAMETER,\n)\npublic annotation class MapboxMapComposable"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/MapboxMapScope.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport androidx.compose.runtime.Immutable\n\n/**\n * A MapboxMapScope provides a scope for the children of MapboxMap.\n */\n@MapboxMapScopeMarker\n@Immutable\npublic object MapboxMapScope {\n  // Add needed extensions here\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/MapboxMapScopeMarker.kt",
    "content": "package com.mapbox.maps.extension.compose\n\n/**\n * Marks the scope of DSL used within [MapboxMap] composable function.\n */\n@DslMarker\npublic annotation class MapboxMapScopeMarker"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/animation/viewport/MapViewportState.kt",
    "content": "package com.mapbox.maps.extension.compose.animation.viewport\n\nimport android.animation.Animator\nimport android.animation.Animator.AnimatorListener\nimport androidx.annotation.UiThread\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.coroutine.cameraChangedCoalescedEvents\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.viewport.CompletionListener\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.ViewportStatus\nimport com.mapbox.maps.plugin.viewport.ViewportStatusObserver\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState\nimport com.mapbox.maps.plugin.viewport.state.OverviewViewportState\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.plugin.viewport.state.ViewportStateDataObserver\nimport com.mapbox.maps.plugin.viewport.transition.ViewportTransition\nimport com.mapbox.maps.plugin.viewport.viewport\nimport com.mapbox.maps.toCameraOptions\nimport kotlinx.coroutines.channels.Channel\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\n/**\n * Create and [rememberSaveable] a [MapViewportState] using [MapViewportState.Saver].\n * [init] will be called when the [MapViewportState] is first created to configure its\n * initial state.\n */\n@Composable\npublic inline fun rememberMapViewportState(\n  key: String? = null,\n  crossinline init: MapViewportState.() -> Unit = {}\n): MapViewportState = rememberSaveable(key = key, saver = MapViewportState.Saver) {\n  MapViewportState().apply(init)\n}\n\n/**\n * A state object that can be hoisted to control and observe the map's camera state.\n * A [MapViewportState] may only be used by a single [MapboxMap] composable at a time\n * as it reflects instance state for a single view of a map.\n *\n * @param initialCameraState the initial camera position\n */\n@Stable\npublic class MapViewportState(\n  initialCameraState: CameraState = INIT_CAMERA_STATE\n) {\n  private val viewportActionChannel: Channel<(MapView) -> Unit> =\n    Channel(capacity = Channel.Factory.UNLIMITED)\n\n  private var mapView: MapView? = null\n\n  private val _cameraState: MutableState<CameraState?> =\n    mutableStateOf(if (initialCameraState == INIT_CAMERA_STATE) null else initialCameraState)\n  private val _mapViewportStatus: MutableState<ViewportStatus?> = mutableStateOf(null)\n  private val _mapViewportStatusChangedReason: MutableState<ViewportStatusChangeReason?> =\n    mutableStateOf(null)\n\n  @OptIn(MapboxExperimental::class)\n  @Composable\n  private fun UpdateCameraState(mapView: MapView) {\n    LaunchedEffect(Unit) {\n      // If the user has provided a specific camera state then we need to enqueue it\n      cameraState?.let {\n        setCameraOptions(it.toCameraOptions())\n      }\n      mapView.mapboxMap.cameraChangedCoalescedEvents.collect {\n        _cameraState.value = it.cameraState\n      }\n    }\n  }\n\n  @Composable\n  private fun UpdateViewportStatus(mapView: MapView) {\n    DisposableEffect(Unit) {\n      val viewportStatusObserver = ViewportStatusObserver { _, to, reason ->\n        _mapViewportStatus.value = to\n        _mapViewportStatusChangedReason.value = reason\n      }\n      mapView.viewport.addStatusObserver(viewportStatusObserver)\n      onDispose {\n        mapView.viewport.removeStatusObserver(viewportStatusObserver)\n        _mapViewportStatus.value = null\n        _mapViewportStatusChangedReason.value = null\n      }\n    }\n  }\n\n  @Composable\n  private fun DrainActionQueue(mapView: MapView) {\n    LaunchedEffect(Unit) {\n      for (action in viewportActionChannel) {\n        action(mapView)\n      }\n    }\n  }\n\n  @Composable\n  internal fun BindToMap(mapView: MapView) {\n    UpdateCameraState(mapView)\n    UpdateViewportStatus(mapView)\n    DrainActionQueue(mapView)\n    DisposableEffect(Unit) {\n      this@MapViewportState.mapView = mapView\n      onDispose {\n        mapView.viewport.idle()\n        this@MapViewportState.mapView = null\n      }\n    }\n  }\n\n  /**\n   * The current [CameraState] of the map or null if this [MapViewportState] is not yet associated\n   * with a map.\n   */\n  public val cameraState: CameraState? by _cameraState\n\n  /**\n   * The reason why the [ViewportStatus] has been changed or null if this [MapViewportState] is not\n   * yet associated with a map.\n   */\n  public val mapViewportStatusChangedReason: ViewportStatusChangeReason? by _mapViewportStatusChangedReason\n\n  /**\n   * The current [ViewportStatus] that represents the status of the viewport or null if this\n   * [MapViewportState] is not yet associated with a map.\n   *\n   * It could be either a [ViewportStatus.State], [ViewportStatus.Transition] or\n   * [ViewportStatus.Idle].\n   */\n  public val mapViewportStatus: ViewportStatus? by _mapViewportStatus\n\n  /**\n   * Move the camera instantaneously as specified by [cameraOptions]. Any camera animation in progress\n   * will be cancelled.\n   *\n   * This method must be called from the map's UI thread.\n   */\n  @UiThread\n  public fun setCameraOptions(cameraOptions: CameraOptions) {\n    viewportActionChannel.trySend { mapView ->\n      mapView.apply {\n        viewport.transitionTo(\n          CameraViewportState(cameraOptions) {\n            camera.easeToImmediately(it)\n          },\n          viewport.makeImmediateViewportTransition()\n        )\n      }\n    }\n  }\n\n  /**\n   * Move the camera instantaneously as specified by [block] camera options.\n   * Any camera animation in progress will be cancelled.\n   *\n   * This method must be called from the map's UI thread.\n   */\n  @UiThread\n  public fun setCameraOptions(block: CameraOptions.Builder.() -> Unit) {\n    setCameraOptions(cameraOptions(block))\n  }\n\n  /**\n   * Convenience method that returns the [CameraOptions] object for given parameters.\n   *\n   * @param coordinates The `coordinates` representing the bounds of the camera.\n   * @param camera The [CameraOptions] which will be applied before calculating the camera for the coordinates. If any of the fields in [CameraOptions] are not provided then the current value from the map for that field will be used.\n   * @param coordinatesPadding The amount of padding in pixels to add to the given `coordinates`.\n   *                           Note: This padding is not applied to the map but to the coordinates provided. If you want to apply padding to the map use param `camera`.\n   * @param maxZoom The maximum zoom level allowed in the returned camera options.\n   * @param offset The center of the given bounds relative to map center in pixels.\n   *\n   * @return The [CameraOptions] object representing the provided parameters.\n   */\n  @UiThread\n  public suspend fun cameraForCoordinates(\n    coordinates: List<Point>,\n    camera: CameraOptions = cameraOptions { },\n    coordinatesPadding: EdgeInsets? = null,\n    maxZoom: Double? = null,\n    offset: ScreenCoordinate? = null,\n  ): CameraOptions = suspendCoroutine { continuation ->\n    viewportActionChannel.trySend { mapView ->\n      mapView.mapboxMap.cameraForCoordinates(\n        coordinates,\n        camera,\n        coordinatesPadding,\n        maxZoom,\n        offset,\n        continuation::resume\n      )\n    }\n  }\n\n  /**\n   * A utility function to get the default [CameraOptions] defined in the style or null if this\n   * [MapViewportState] is not yet associated with a map.\n   */\n  public val styleDefaultCameraOptions: CameraOptions?\n    get() = mapView?.mapboxMap?.style?.styleDefaultCamera\n\n  /**\n   * Ease the map camera to a given camera options.\n   *\n   * @param cameraOptions The camera options to ease to\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   * @param completionListener the optional [CompletionListener] to observe the completion if the transition\n   */\n  public fun easeTo(\n    cameraOptions: CameraOptions,\n    animationOptions: MapAnimationOptions? = null,\n    completionListener: CompletionListener? = null\n  ) {\n    viewportActionChannel.trySend { mapView ->\n      mapView.apply {\n        viewport.transitionTo(\n          targetState = CameraViewportState(cameraOptions) {\n            camera.easeToImmediately(it)\n          },\n          transition = GenericViewportTransition { cameraOptions, transitionCompletionListener ->\n            camera.easeTo(\n              cameraOptions,\n              animationOptions,\n              OnAnimationCompletedListener(listOf(completionListener, transitionCompletionListener))\n            )\n          }\n        )\n      }\n    }\n  }\n\n  /**\n   * Fly the map camera to a given camera options.\n   *\n   * This method implements an “optimal path” animation, as detailed in:\n\n   * Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and\n   * panning.” INFOVIS ’03. pp. 15–22.\n   * [The online documentation](https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5).\n\n   * Where applicable, local variable documentation begins with the associated\n   * variable or function in van Wijk (2003).\n   *\n   * @param cameraOptions The camera options to fly to\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   * @param completionListener the optional [CompletionListener] to observe the completion if the transition\n   */\n  public fun flyTo(\n    cameraOptions: CameraOptions,\n    animationOptions: MapAnimationOptions? = null,\n    completionListener: CompletionListener? = null\n  ) {\n    viewportActionChannel.trySend { mapView ->\n      mapView.apply {\n        viewport.transitionTo(\n          targetState = CameraViewportState(cameraOptions) {\n            camera.easeToImmediately(it)\n          },\n          transition = GenericViewportTransition { cameraOptions, transitionCompletionListener ->\n            camera.flyTo(\n              cameraOptions,\n              animationOptions,\n              OnAnimationCompletedListener(listOf(completionListener, transitionCompletionListener))\n            )\n          }\n        )\n      }\n    }\n  }\n\n  /**\n   * Transition to a new [OverviewViewportState].\n   * @param overviewViewportStateOptions the target [OverviewViewportStateOptions] to transition to\n   * @param defaultTransitionOptions the defaultTransitionOptions for the transition\n   * @param completionListener the optional [CompletionListener] to observe the completion if the transition\n   */\n  public fun transitionToOverviewState(\n    overviewViewportStateOptions: OverviewViewportStateOptions,\n    defaultTransitionOptions: DefaultViewportTransitionOptions = DefaultViewportTransitionOptions.Builder()\n      .build(),\n    completionListener: CompletionListener? = null\n  ) {\n    viewportActionChannel.trySend { mapView ->\n      mapView.viewport.apply {\n        transitionTo(\n          targetState = makeOverviewViewportState(overviewViewportStateOptions),\n          transition = makeDefaultViewportTransition(defaultTransitionOptions),\n          completionListener\n        )\n      }\n    }\n  }\n\n  /**\n   * Transition to a new [FollowPuckViewportState].\n   *\n   * @param followPuckViewportStateOptions the target [FollowPuckViewportStateOptions] to transition to\n   * @param defaultTransitionOptions the defaultTransitionOptions for the transition\n   * @param completionListener the optional [CompletionListener] to observe the completion if the transition\n   */\n  public fun transitionToFollowPuckState(\n    followPuckViewportStateOptions: FollowPuckViewportStateOptions = FollowPuckViewportStateOptions.Builder()\n      .build(),\n    defaultTransitionOptions: DefaultViewportTransitionOptions = DefaultViewportTransitionOptions.Builder()\n      .build(),\n    completionListener: CompletionListener? = null\n  ) {\n    viewportActionChannel.trySend { mapView ->\n      mapView.viewport.apply {\n        transitionTo(\n          targetState = makeFollowPuckViewportState(followPuckViewportStateOptions),\n          transition = makeDefaultViewportTransition(defaultTransitionOptions),\n          completionListener\n        )\n      }\n    }\n  }\n\n  /**\n   * Sets [ViewportPlugin.status] to [ViewportStatus.Idle] synchronously.\n   *\n   * This cancels any active [ViewportState] or [ViewportTransition].\n   */\n  public fun idle() {\n    viewportActionChannel.trySend { mapView ->\n      mapView.viewport.idle()\n    }\n  }\n\n  /**\n   * Companion object of [MapViewportState].\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [MapViewportState]\n     */\n    public val Saver: Saver<MapViewportState, CameraState> = Saver(\n      save = { it.cameraState },\n      restore = { MapViewportState(it) }\n    )\n    private const val TAG = \"MapViewportState\"\n    private val INIT_CAMERA_STATE = CameraState(\n      /* center = */ Point.fromLngLat(0.0, 0.0),\n      /* padding = */ EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      /* zoom = */ 0.0,\n      /* bearing = */ 0.0,\n      /* pitch = */ 0.0,\n    )\n  }\n}\n\n/**\n * A viewport state that contains one CameraOptions, this is introduced to replace the simple camera animations\n * using [MapViewportState] API.\n */\nprivate class CameraViewportState(\n  private val cameraOptions: CameraOptions,\n  private val doSetCamera: (CameraOptions) -> Unit\n) : ViewportState {\n  override fun observeDataSource(viewportStateDataObserver: ViewportStateDataObserver): Cancelable {\n    viewportStateDataObserver.onNewData(cameraOptions = cameraOptions)\n    return Cancelable {\n      // Dummy cancelable, as this state contains only one camera update\n    }\n  }\n\n  override fun startUpdatingCamera() {\n    // set the camera options immediately\n    doSetCamera.invoke(cameraOptions)\n  }\n\n  override fun stopUpdatingCamera() {\n    // no-op\n  }\n\n  override fun toString(): String {\n    return \"CameraViewportState(targetCamera=$cameraOptions)\"\n  }\n}\n\n/**\n * A generic viewport transition that can be wrapped with basic camera animation types, e.g. easeTo, flyTo\n */\nprivate class GenericViewportTransition(private val doTransition: (CameraOptions, CompletionListener) -> Cancelable) :\n  ViewportTransition {\n  override fun run(to: ViewportState, completionListener: CompletionListener): Cancelable {\n    lateinit var cancelable: Cancelable\n    to.observeDataSource {\n      cancelable = doTransition.invoke(it, completionListener)\n      false\n    }\n    return cancelable\n  }\n}\n\n/**\n * Utility function to perform an immediately setCameraOptions call through the animations plugin, so\n * it can interrupt other ongoing animations.\n */\nprivate fun CameraAnimationsPlugin.easeToImmediately(cameraOptions: CameraOptions) {\n  easeTo(\n    cameraOptions,\n    MapAnimationOptions.mapAnimationOptions { duration(0) }\n  )\n}\n\nprivate class OnAnimationCompletedListener(val completionListener: List<CompletionListener?>) :\n  AnimatorListener {\n  private var isCancelled = false\n  override fun onAnimationStart(animation: Animator) {\n    // no-ops\n  }\n\n  override fun onAnimationEnd(animation: Animator) {\n    // no-ops\n    completionListener.forEach {\n      it?.onComplete(!isCancelled)\n    }\n  }\n\n  override fun onAnimationCancel(animation: Animator) {\n    isCancelled = true\n  }\n\n  override fun onAnimationRepeat(animation: Animator) {\n    // no-ops\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/IconImage.kt",
    "content": "package com.mapbox.maps.extension.compose.annotation\n\nimport android.graphics.Bitmap\nimport android.os.Parcelable\nimport androidx.annotation.DrawableRes\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.graphics.asAndroidBitmap\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.res.painterResource\nimport com.mapbox.maps.extension.compose.annotation.generated.PointAnnotationState\nimport com.mapbox.maps.extension.compose.style.drawToBitmap\nimport kotlinx.parcelize.Parcelize\nimport java.util.Objects\n\n/**\n * Represents an [IconImage] for [PointAnnotationState], it can either be a [String] image id or a [Bitmap] to be added to the map.\n */\n@Immutable\n@Parcelize\npublic class IconImage private constructor(\n  internal val imageId: String?,\n  internal val bitmap: Bitmap?\n) : Parcelable {\n  /**\n   * Construct a [IconImage] with [imageId] as a [String].\n   */\n  public constructor(imageId: String) : this(imageId = imageId, bitmap = null)\n\n  /**\n   * Construct a [IconImage] with [bitmap] as a [Bitmap].\n   */\n  public constructor(bitmap: Bitmap) : this(imageId = null, bitmap = bitmap)\n\n  /**\n   * Override the hashcode.\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(imageId, bitmap)\n  }\n\n  /**\n   * Override the equals.\n   */\n  override fun equals(other: Any?): Boolean {\n    return other is IconImage && other.imageId == imageId && other.bitmap == bitmap\n  }\n\n  /**\n   * Override toString.\n   */\n  override fun toString(): String {\n    return \"IconImage(${imageId ?: bitmap.toString()})\"\n  }\n}\n\n/**\n * Create and remember a [Bitmap] with [Painter].\n *\n * @param painter the [Painter] to provide the bitmap\n *\n * @return a [Bitmap]\n */\n@Composable\npublic fun rememberIconImage(key: Any?, painter: Painter): IconImage {\n  return remember(key, painter) {\n    IconImage(painter.drawToBitmap().asAndroidBitmap())\n  }\n}\n\n/**\n * Create and remember a [Bitmap] with [resourceId].\n *\n * @param resourceId the resource id to be loaded to the image\n *\n * @return a [Bitmap]\n */\n@Composable\npublic fun rememberIconImage(@DrawableRes resourceId: Int): IconImage {\n  return rememberIconImage(key = resourceId, painter = painterResource(id = resourceId))\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/Marker.kt",
    "content": "package com.mapbox.maps.extension.compose.annotation\n\nimport android.graphics.Paint.Join\nimport android.graphics.Paint.Style\nimport android.graphics.Typeface\nimport android.os.Build\nimport android.text.Layout\nimport android.text.StaticLayout\nimport android.text.TextPaint\nimport android.text.TextUtils\nimport androidx.compose.foundation.Canvas\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.Indication\nimport androidx.compose.foundation.IndicationInstance\nimport androidx.compose.foundation.LocalIndication\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.offset\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.layout.wrapContentSize\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.SideEffect\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.alpha\nimport androidx.compose.ui.draw.blur\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.graphics.TransformOrigin\nimport androidx.compose.ui.graphics.drawscope.drawIntoCanvas\nimport androidx.compose.ui.graphics.graphicsLayer\nimport androidx.compose.ui.graphics.nativeCanvas\nimport androidx.compose.ui.graphics.toArgb\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.LocalDensity\nimport androidx.compose.ui.platform.LocalView\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.TextUnit\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.ViewAnnotationAnchor\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.R\nimport com.mapbox.maps.viewannotation.annotationAnchor\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\n\n/**\n * Composable function to add a simple [Marker] to the Map.\n *\n * `Marker` is a convenience which creates a simple `ViewAnnotation` with limited customization options.\n * Use `Marker` to quickly add a pin annotation at the specific coordinates.\n * If you need greater customization use `ViewAnnotation` directly.\n *\n * `Marker` is great for displaying unique interactive features. However, it may be suboptimal for\n * large amounts of data and doesn't support clustering. Each marker creates Compose views with\n * custom text rendering, so for scenarios with 100+ markers, consider using `PointAnnotation`.\n *\n * Markers support animations via two parameters:\n * - `appearAnimation`: Effects that play when the marker first appears\n * - `disappearAnimation`: Effects that play when the marker is removed\n *\n * Available effects: [MarkerAnimationEffect.wiggle], [MarkerAnimationEffect.scale], [MarkerAnimationEffect.fadeIn], [MarkerAnimationEffect.fadeOut]\n *\n * Example:\n * ```\n * Marker(\n *   point = point,\n *   appearAnimation = listOf(MarkerAnimationEffect.wiggle, MarkerAnimationEffect.scale),\n *   disappearAnimation = listOf(MarkerAnimationEffect.fadeOut),\n *   onClick = { println(\"Marker clicked!\") }\n * )\n * ```\n *\n * @param point The geographic location of the Marker\n * @param color The outer color of the [Marker]\n * @param innerColor The inner color of the [Marker]\n * @param stroke The color of optional strokes. Pass null to remove the strokes.\n * @param text A text to be displayed with the [Marker]\n * @param appearAnimation Effects to play when marker appears\n * @param disappearAnimation Effects to play when marker disappears\n * @param onClick Optional callback to be invoked when the marker is clicked\n */\n@Composable\n@MapboxMapComposable\n@MapboxExperimental\npublic fun Marker(\n  point: Point,\n  color: Color = Color(0xffcfdaf7),\n  innerColor: Color = Color(0xffffffff),\n  stroke: Color? = Color(0xff3a59fa),\n  text: String? = null,\n  appearAnimation: List<MarkerAnimationEffect> = emptyList(),\n  disappearAnimation: List<MarkerAnimationEffect> = emptyList(),\n  onClick: (() -> Unit)? = null\n) {\n  val animationConfigs = remember(appearAnimation, disappearAnimation) {\n    buildMap {\n      if (appearAnimation.isNotEmpty()) {\n        put(\n          MarkerAnimationTrigger.Appear,\n          MarkerAnimationConfig(\n            appearAnimation.map { it.value }\n          )\n        )\n      }\n      if (disappearAnimation.isNotEmpty()) {\n        put(\n          MarkerAnimationTrigger.Disappear,\n          MarkerAnimationConfig(\n            disappearAnimation.map { it.value }\n          )\n        )\n      }\n    }\n  }\n\n  val animationState = remember(animationConfigs) {\n    if (animationConfigs.isEmpty()) {\n      null\n    } else {\n      MarkerAnimationState(\n        appearConfig = animationConfigs[MarkerAnimationTrigger.Appear],\n        disappearConfig = animationConfigs[MarkerAnimationTrigger.Disappear]\n      )\n    }\n  }\n\n  val density = LocalDensity.current\n  val offsetAdjustment = remember(density) {\n    with(density) { 50.dp.toPx() }\n  }\n\n  val stableOptions = remember(point, offsetAdjustment) {\n    viewAnnotationOptions {\n      geometry(point)\n      annotationAnchor {\n        anchor(ViewAnnotationAnchor.TOP)\n        offsetY(120.0 + offsetAdjustment)\n        allowOverlap(true)\n      }\n    }\n  }\n\n  ViewAnnotation(\n    options = stableOptions\n  ) {\n    // Set disappear animation config as a view tag so ViewAnnotationNode.onRemoved() can read it\n    val view = LocalView.current\n    val disappearConfig = animationState?.disappearConfig\n\n    // Cache the ComposeView reference to avoid walking the parent tree on every composition\n    val composeView = remember(view) {\n      var targetView: android.view.View? = view\n      while (targetView != null && targetView !is ComposeView) {\n        targetView = targetView.parent as? android.view.View\n      }\n      targetView\n    }\n\n    // Use SideEffect to set the tag after each composition\n    // This ensures the tag is always up-to-date when the marker is removed\n    SideEffect {\n      composeView?.setTag(R.id.markerDisappearAnimation, disappearConfig)\n    }\n\n    Box(\n      modifier = Modifier\n        .size(200.dp)\n        .graphicsLayer(clip = false),\n      contentAlignment = Alignment.Center\n    ) {\n      MarkerContent(\n        modifier = Modifier,\n        color = color,\n        innerColor = innerColor,\n        stroke = stroke,\n        text = text,\n        animationState = animationState,\n        onClick = onClick\n      )\n    }\n  }\n}\n\n@Composable\nprivate fun MarkerImage(\n  color: Color,\n  innerColor: Color,\n  stroke: Color?\n) {\n  Box(\n    modifier = Modifier.height(40.dp),\n    contentAlignment = Alignment.TopCenter\n  ) {\n    Image(\n      painter = painterResource(id = R.drawable.default_marker_outer),\n      contentDescription = \"Shadow\",\n      modifier = Modifier\n        .offset(y = 2.dp)\n        .alpha(0.17f)\n        .blur(1.dp),\n      colorFilter = ColorFilter.tint(Color.Black)\n    )\n    Image(\n      painter = painterResource(R.drawable.default_marker_outer),\n      contentDescription = \"Marker outer\",\n      colorFilter = ColorFilter.tint(color)\n    )\n    Image(\n      painter = painterResource(R.drawable.default_marker_inner),\n      contentDescription = \"Marker inner\",\n      colorFilter = ColorFilter.tint(innerColor)\n    )\n    if (stroke != null) {\n      Image(\n        painter = painterResource(R.drawable.default_marker_outer_stroke),\n        contentDescription = \"Marker outer stroke\",\n        colorFilter = ColorFilter.tint(stroke)\n      )\n      Image(\n        painter = painterResource(R.drawable.default_marker_inner_stroke),\n        contentDescription = \"Marker inner stroke\",\n        colorFilter = ColorFilter.tint(stroke)\n      )\n    }\n  }\n}\n\n@Composable\nprivate fun MarkerText(\n  text: String,\n  fontColor: Color = Color.Black,\n  fontStrokeColor: Color = Color.White,\n  fontSize: TextUnit = 15.sp,\n  strokeWidth: Dp = 3.dp,\n  maxLines: Int = 3,\n  maxWidth: Dp = 120.dp\n) {\n  val density = LocalDensity.current\n  val fontSizePx = with(density) { fontSize.toPx() }\n  val maxWidthPx = with(density) { maxWidth.toPx().toInt() }\n\n  val textPaint = remember(fontSize, fontColor) {\n    TextPaint().apply {\n      isAntiAlias = true\n      style = Style.FILL\n      textSize = fontSizePx\n      color = fontColor.toArgb()\n      typeface = Fonts.mediumFont\n    }\n  }\n\n  val strokePaint = remember(fontSize, strokeWidth, fontStrokeColor) {\n    TextPaint().apply {\n      isAntiAlias = true\n      style = Style.STROKE\n      textSize = fontSizePx\n      color = fontStrokeColor.toArgb()\n      typeface = Fonts.mediumFont\n      strokeMiter = 4f\n      strokeJoin = Join.ROUND\n      this.strokeWidth = with(density) { strokeWidth.toPx() }\n    }\n  }\n\n  // Pre-calculate layout once to get actual dimensions\n  // We'll draw with both paints using the same layout structure\n  val textLayout = remember(text, textPaint, maxWidthPx, maxLines) {\n    createTextLayout(text, textPaint, maxWidthPx, maxLines)\n  }\n\n  // Calculate actual dimensions from layout\n  val actualWidth = with(density) { textLayout.width.toDp() }\n  val actualHeight = with(density) { textLayout.height.toDp() }\n\n  Canvas(\n    Modifier\n      .width(actualWidth)\n      .height(actualHeight)\n  ) {\n    drawIntoCanvas { canvas ->\n      canvas.nativeCanvas.apply {\n        // Draw stroke first (using same layout with different paint)\n        // We iterate through lines and draw each with the stroke paint\n        for (i in 0 until textLayout.lineCount) {\n          val lineStart = textLayout.getLineStart(i)\n          val lineEnd = textLayout.getLineEnd(i)\n          val lineText = text.substring(lineStart, lineEnd)\n          val x = textLayout.getLineLeft(i)\n          val y = textLayout.getLineBaseline(i).toFloat()\n          drawText(lineText, x, y, strokePaint)\n        }\n        // Draw text on top with the original layout\n        textLayout.draw(this)\n      }\n    }\n  }\n}\n\n/**\n * Helper function to create a StaticLayout with proper truncation.\n * Extracted to avoid recreation on every composition.\n */\nprivate fun createTextLayout(\n  text: String,\n  paint: TextPaint,\n  width: Int,\n  maxLines: Int\n): StaticLayout {\n  val alignment = Layout.Alignment.ALIGN_CENTER\n\n  fun makeLayoutSdk21() = StaticLayout(\n    text, paint, width, alignment, 1f, 0f, false\n  ).let {\n    if (it.lineCount <= maxLines) return@let it\n    val endIndex = it.getLineEnd(maxLines - 1)\n    val truncated = text.take(endIndex).trimEnd() + \"…\"\n    StaticLayout(\n      truncated, paint, width, alignment, 1f, 0f, false\n    )\n  }\n\n  return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n    StaticLayout.Builder\n      .obtain(text, 0, text.length, paint, width)\n      .setAlignment(alignment)\n      .setEllipsize(TextUtils.TruncateAt.END)\n      .setMaxLines(maxLines)\n      .build()\n  } else {\n    makeLayoutSdk21()\n  }\n}\n\nprivate object Fonts {\n  val mediumFont: Typeface by lazy {\n    Typeface.create(\"sans-serif-medium\", Typeface.NORMAL)\n  }\n}\n\n@Composable\nprivate fun MarkerContent(\n  modifier: Modifier,\n  color: Color,\n  innerColor: Color,\n  stroke: Color?,\n  text: String?,\n  animationState: MarkerAnimationState?,\n  onClick: (() -> Unit)?\n) {\n  CompositionLocalProvider(LocalIndication provides NoIndication) {\n    Box(\n      modifier = Modifier\n        .size(width = 120.dp, height = 100.dp)\n        .graphicsLayer(clip = false),\n      contentAlignment = Alignment.TopCenter\n    ) {\n      val animScale = animationState?.animatedScale()?.value ?: 1f\n      val animAlpha = animationState?.animatedAlpha()?.value ?: 1f\n      val animRotation = animationState?.animatedRotation()?.value ?: 0f\n\n      Column(\n        modifier = modifier\n          .wrapContentSize()\n          .graphicsLayer {\n            clip = false\n          }\n          .clickable(\n            enabled = onClick != null,\n            indication = null,\n            interactionSource = remember { androidx.compose.foundation.interaction.MutableInteractionSource() }\n          ) {\n            onClick?.invoke()\n          },\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Top\n      ) {\n        // Animated pin\n        Box(\n          modifier = Modifier.graphicsLayer {\n            scaleX = animScale\n            scaleY = animScale\n            rotationZ = animRotation\n            alpha = animAlpha\n            transformOrigin = TransformOrigin(0.5f, 1f)\n            clip = false\n          }\n        ) {\n          MarkerImage(color, innerColor, stroke)\n\n          if (animationState != null) {\n            LaunchedEffect(animationState) {\n              val hasWiggle = animationState.animateAppear()\n              if (hasWiggle) {\n                animationState.animateWiggle()\n              }\n            }\n          }\n        }\n\n        text?.let {\n          MarkerText(text)\n        }\n      }\n    }\n  }\n}\n\n/**\n * Empty indication that disables visual feedback (ripple effects) for markers.\n */\nprivate object NoIndication : Indication {\n  @Composable\n  override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {\n    return object : IndicationInstance {\n      override fun androidx.compose.ui.graphics.drawscope.ContentDrawScope.drawIndication() {\n        drawContent()\n      }\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/MarkerAnimation.kt",
    "content": "@file:OptIn(MapboxExperimental::class)\n\npackage com.mapbox.maps.extension.compose.annotation\n\nimport androidx.compose.animation.core.FastOutSlowInEasing\nimport androidx.compose.animation.core.Spring\nimport androidx.compose.animation.core.spring\nimport androidx.compose.animation.core.tween\nimport com.mapbox.maps.MapboxExperimental\nimport kotlinx.coroutines.delay\n\n/**\n * Defines an animation effect that can be applied to a [Marker].\n *\n * Use the companion object factory methods to create predefined effects:\n * - [wiggle]: Pendulum rotation effect (20° → -20° → 8° → -8° → 0°)\n * - [scale]: Scale animation (default: from 0 to 1)\n * - [fade]: Fade animation (default: from 0 to 1)\n *\n * Effects can be customized with parameters:\n * - [scale(from, to)]: Custom scale range\n * - [fade(from, to)]: Custom fade range\n *\n * Multiple effects can be combined by passing them as a list to [Marker] animation parameters.\n *\n * Example:\n * ```\n * Marker(\n *   point = point,\n *   appearAnimation = listOf(MarkerAnimationEffect.wiggle, MarkerAnimationEffect.scale),\n *   disappearAnimation = listOf(MarkerAnimationEffect.fade)\n * )\n * ```\n */\n@MapboxExperimental\npublic sealed class MarkerAnimationEffect {\n  internal abstract val value: Effect\n\n  internal sealed class Effect {\n    internal object Wiggle : Effect()\n    internal data class Scale(val from: Float, val to: Float) : Effect()\n    internal data class Fade(val from: Float, val to: Float) : Effect()\n  }\n\n  private class WiggleEffect : MarkerAnimationEffect() {\n    override val value: Effect = Effect.Wiggle\n  }\n\n  private class ScaleEffect(from: Float, to: Float) : MarkerAnimationEffect() {\n    override val value: Effect = Effect.Scale(from, to)\n  }\n\n  private class FadeEffect(from: Float, to: Float) : MarkerAnimationEffect() {\n    override val value: Effect = Effect.Fade(from, to)\n  }\n\n  /**\n   * Factory methods for creating marker animation effects.\n   */\n  public companion object {\n    /**\n     * Pendulum rotation (20° → -20° → 8° → -8° → 0°).\n     */\n    public val wiggle: MarkerAnimationEffect = WiggleEffect()\n\n    /**\n     * Scale animation (default: 0 to 1).\n     */\n    public val scale: MarkerAnimationEffect = ScaleEffect(0f, 1f)\n\n    /**\n     * Fade in animation (0 to 1 opacity).\n     */\n    public val fadeIn: MarkerAnimationEffect = FadeEffect(0f, 1f)\n\n    /**\n     * Fade out animation (1 to 0 opacity).\n     */\n    public val fadeOut: MarkerAnimationEffect = FadeEffect(1f, 0f)\n\n    /**\n     * Scale animation with custom range.\n     */\n    public fun scale(from: Float, to: Float): MarkerAnimationEffect = ScaleEffect(from, to)\n\n    /**\n     * Fade animation with custom range.\n     */\n    public fun fade(from: Float, to: Float): MarkerAnimationEffect = FadeEffect(from, to)\n  }\n}\n\n/**\n * Defines when a marker animation should be triggered.\n */\n@MapboxExperimental\npublic sealed class MarkerAnimationTrigger {\n  /**\n   * Trigger for when the marker first appears on the map.\n   */\n  public object Appear : MarkerAnimationTrigger()\n\n  /**\n   * Trigger for when the marker is removed from the map.\n   */\n  public object Disappear : MarkerAnimationTrigger()\n}\n\ninternal data class MarkerAnimationConfig(\n  val effects: List<MarkerAnimationEffect.Effect>\n) {\n  internal companion object {\n    // Bouncy spring feels natural for scale and rotation transformations\n    val animationSpec = spring<Float>(\n      dampingRatio = 0.6f,\n      stiffness = Spring.StiffnessLow\n    )\n\n    // Smooth easing for opacity changes\n    val fadeAnimationSpec = tween<Float>(\n      durationMillis = 800,\n      easing = FastOutSlowInEasing\n    )\n\n    const val DURATION_MS = 1500\n  }\n}\n\n/**\n * Wiggle animation sequence with structured keyframes.\n */\ninternal class WiggleAnimationSequence private constructor(\n  val keyframes: List<KeyframeStep>,\n  val initialAngle: Float\n) {\n  companion object {\n    /**\n     * Standard wiggle sequence: 20° → -20° → 8° → -8° → 0°\n     * Duration indicates how long to wait before executing this keyframe.\n     */\n    fun standard(): WiggleAnimationSequence = WiggleAnimationSequence(\n      keyframes = listOf(\n        KeyframeStep(angle = -20f, durationMs = 0), // Start immediately\n        KeyframeStep(angle = 8f, durationMs = 350), // After 350ms\n        KeyframeStep(angle = -8f, durationMs = 300), // After 300ms\n        KeyframeStep(angle = 0f, durationMs = 250) // After 250ms\n      ),\n      initialAngle = 20f\n    )\n  }\n\n  internal data class KeyframeStep(\n    val angle: Float,\n    val durationMs: Int // Time to wait before this keyframe\n  )\n\n  suspend fun animate(onUpdate: (Float) -> Unit) {\n    for (step in keyframes) {\n      if (step.durationMs > 0) {\n        delay(step.durationMs.toLong())\n      }\n      onUpdate(step.angle)\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/MarkerAnimationState.kt",
    "content": "@file:OptIn(MapboxExperimental::class)\n\npackage com.mapbox.maps.extension.compose.annotation\n\nimport androidx.compose.animation.core.animateFloatAsState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Internal state management for marker animations.\n */\n@Stable\ninternal class MarkerAnimationState(\n  internal val appearConfig: MarkerAnimationConfig?,\n  internal val disappearConfig: MarkerAnimationConfig?\n) {\n  private val initialState = calculateInitialState(appearConfig)\n\n  var scale by mutableStateOf(initialState.scale)\n    private set\n\n  var alpha by mutableStateOf(initialState.alpha)\n    private set\n\n  var rotationZ by mutableStateOf(initialState.rotationZ)\n    private set\n\n  /**\n   * Calculates initial animation state from appear config.\n   */\n  private fun calculateInitialState(config: MarkerAnimationConfig?): InitialState {\n    if (config == null) return InitialState()\n\n    var scale = 1f\n    var alpha = 1f\n    var rotationZ = 0f\n\n    config.effects.forEach { effect ->\n      when (effect) {\n        is MarkerAnimationEffect.Effect.Scale -> scale = effect.from\n        is MarkerAnimationEffect.Effect.Fade -> alpha = effect.from\n        is MarkerAnimationEffect.Effect.Wiggle -> rotationZ = 20f\n      }\n    }\n\n    return InitialState(scale, alpha, rotationZ)\n  }\n\n  /**\n   * Holds initial animation values.\n   */\n  private data class InitialState(\n    val scale: Float = 1f,\n    val alpha: Float = 1f,\n    val rotationZ: Float = 0f\n  )\n\n  @Composable\n  fun animatedScale(): State<Float> = animateFloatAsState(\n    targetValue = scale,\n    animationSpec = MarkerAnimationConfig.animationSpec,\n    label = \"markerScale\"\n  )\n\n  @Composable\n  fun animatedAlpha(): State<Float> = animateFloatAsState(\n    targetValue = alpha,\n    animationSpec = MarkerAnimationConfig.fadeAnimationSpec,\n    label = \"markerAlpha\"\n  )\n\n  @Composable\n  fun animatedRotation(): State<Float> = animateFloatAsState(\n    targetValue = rotationZ,\n    animationSpec = MarkerAnimationConfig.animationSpec,\n    label = \"markerRotation\"\n  )\n\n  fun animateAppear(): Boolean {\n    var hasWiggle = false\n    appearConfig?.let { config ->\n      hasWiggle = config.effects.any { it is MarkerAnimationEffect.Effect.Wiggle }\n      animateToFinalValues(config.effects)\n    }\n    return hasWiggle\n  }\n\n  /**\n   * Sets the initial \"from\" values for effects.\n   */\n  private fun setInitialValues(effects: List<MarkerAnimationEffect.Effect>) {\n    effects.forEach { effect ->\n      when (effect) {\n        is MarkerAnimationEffect.Effect.Scale -> scale = effect.from\n        is MarkerAnimationEffect.Effect.Fade -> alpha = effect.from\n        is MarkerAnimationEffect.Effect.Wiggle -> {} // Handled separately\n      }\n    }\n  }\n\n  /**\n   * Animates to the final \"to\" values for effects.\n   */\n  private fun animateToFinalValues(effects: List<MarkerAnimationEffect.Effect>) {\n    effects.forEach { effect ->\n      when (effect) {\n        is MarkerAnimationEffect.Effect.Scale -> scale = effect.to\n        is MarkerAnimationEffect.Effect.Fade -> alpha = effect.to\n        is MarkerAnimationEffect.Effect.Wiggle -> {} // Handled separately\n      }\n    }\n  }\n\n  /**\n   * Wiggle sequence: 20° → -20° → 8° → -8° → 0°\n   */\n  suspend fun animateWiggle() {\n    val sequence = WiggleAnimationSequence.standard()\n    // Set initial angle before starting sequence\n    rotationZ = sequence.initialAngle\n    sequence.animate { newAngle ->\n      rotationZ = newAngle\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/ViewAnnotation.kt",
    "content": "package com.mapbox.maps.extension.compose.annotation\n\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.wrapContentSize\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.rememberCompositionContext\nimport androidx.compose.runtime.rememberUpdatedState\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.graphicsLayer\nimport androidx.compose.ui.layout.onGloballyPositioned\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.ViewCompositionStrategy\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.ViewAnnotationAnchorConfig\nimport com.mapbox.maps.ViewAnnotationOptions\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.R\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.viewannotation.OnViewAnnotationUpdatedListener\nimport com.mapbox.maps.viewannotation.ViewAnnotationManager\n\ninternal class ViewAnnotationNode(\n  val viewAnnotationManager: ViewAnnotationManager,\n  val view: View,\n  var updatedListener: OnViewAnnotationUpdatedListener?\n) : MapNode() {\n  // The internal listener used to forward the specific view related events to update listener\n  private val internalViewAnnotationUpdatedListener = object : OnViewAnnotationUpdatedListener {\n    override fun onViewAnnotationAnchorCoordinateUpdated(\n      view: View,\n      anchorCoordinate: Point\n    ) {\n      if (view == this@ViewAnnotationNode.view) {\n        updatedListener?.onViewAnnotationAnchorCoordinateUpdated(view, anchorCoordinate)\n      }\n    }\n\n    override fun onViewAnnotationAnchorUpdated(view: View, anchor: ViewAnnotationAnchorConfig) {\n      if (view == this@ViewAnnotationNode.view) {\n        updatedListener?.onViewAnnotationAnchorUpdated(view, anchor)\n      }\n    }\n\n    override fun onViewAnnotationPositionUpdated(\n      view: View,\n      leftTopCoordinate: ScreenCoordinate,\n      width: Double,\n      height: Double\n    ) {\n      if (view == this@ViewAnnotationNode.view) {\n        updatedListener?.onViewAnnotationPositionUpdated(view, leftTopCoordinate, width, height)\n      }\n    }\n\n    override fun onViewAnnotationVisibilityUpdated(view: View, visible: Boolean) {\n      if (view == this@ViewAnnotationNode.view) {\n        updatedListener?.onViewAnnotationVisibilityUpdated(view, visible)\n      }\n    }\n  }\n\n  // Keep track of whether internal listener is registered\n  private var isObservingUpdate = false\n\n  override fun onAttached(parent: MapNode) {\n    updateAndSubscribe(updatedListener)\n  }\n\n  internal fun updateAndSubscribe(listener: OnViewAnnotationUpdatedListener?) {\n    updatedListener = listener\n    // if listener is valid and we have not started the internal observer, we add internal update listener to forward events\n    if (listener != null && !isObservingUpdate) {\n      viewAnnotationManager.addOnViewAnnotationUpdatedListener(internalViewAnnotationUpdatedListener)\n      isObservingUpdate = true\n    }\n    // if listener is null, we don't need to forward events, and we should remove the internal update listener\n    if (listener == null && isObservingUpdate) {\n      viewAnnotationManager.removeOnViewAnnotationUpdatedListener(\n        internalViewAnnotationUpdatedListener\n      )\n      isObservingUpdate = false\n    }\n  }\n\n  override fun onRemoved(parent: MapNode) {\n    (view.getTag(R.id.markerDisappearAnimation) as? MarkerAnimationConfig)?.let { config ->\n      animateDisappear(view, config) {\n        cleanUp()\n      }\n    } ?: cleanUp()\n  }\n\n  override fun onClear() {\n    cleanUp()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun animateDisappear(\n    view: View,\n    config: MarkerAnimationConfig,\n    onComplete: () -> Unit\n  ) {\n    val animator = view.animate()\n\n    // Apply each effect using configured values\n    config.effects.forEach { effect ->\n      when (effect) {\n        is MarkerAnimationEffect.Effect.Scale -> {\n          animator.scaleX(effect.to).scaleY(effect.to)\n        }\n        is MarkerAnimationEffect.Effect.Fade -> {\n          animator.alpha(effect.to)\n        }\n        is MarkerAnimationEffect.Effect.Wiggle -> {\n          // Wiggle treated as scale for disappear animation\n          // Scale to nearly 0 (0.01f instead of 0f to avoid rendering issues)\n          animator.scaleX(0.01f).scaleY(0.01f)\n        }\n      }\n    }\n\n    animator\n      .setDuration(MarkerAnimationConfig.DURATION_MS.toLong())\n      .withEndAction(onComplete)\n      .start()\n  }\n\n  private fun cleanUp() {\n    viewAnnotationManager.apply {\n      if (isObservingUpdate) {\n        removeOnViewAnnotationUpdatedListener(internalViewAnnotationUpdatedListener)\n      }\n      removeViewAnnotation(view = view)\n    }\n    updatedListener = null\n  }\n}\n\n/**\n * Composable function to add a [ViewAnnotation] to the Map.\n *\n * @param options Various options needed for displaying view annotation.\n * @param modifier Modifier that will be applied to the [ComposeView] where the view annotation is created.\n * @param onUpdatedListener A listener to be invoked when the [ViewAnnotation] is updated.\n * @param content The content to draw in the [ViewAnnotation]\n */\n@Composable\n@MapboxMapComposable\npublic fun ViewAnnotation(\n  options: ViewAnnotationOptions,\n  modifier: Modifier = Modifier,\n  onUpdatedListener: OnViewAnnotationUpdatedListener? = null,\n  content: @Composable () -> Unit,\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n  val currentOptions = rememberUpdatedState(options)\n  val currentComposeContext = rememberCompositionContext()\n\n  ComposeNode<ViewAnnotationNode, MapApplier>(\n    factory = {\n      val viewAnnotationManager =\n        mapApplier?.mapView?.viewAnnotationManager ?: error(\"Error adding view annotation\")\n\n      val composeView = ComposeView(mapApplier.mapView.context).apply {\n        this.layoutParams = ViewGroup.LayoutParams(\n          FrameLayout.LayoutParams.WRAP_CONTENT,\n          FrameLayout.LayoutParams.WRAP_CONTENT\n        )\n        // Disable clipping to allow animations to scale beyond bounds\n        clipChildren = false\n        clipToPadding = false\n      }\n\n      composeView.apply {\n        setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)\n        // Set the parent composition context for the ComposeView.\n        // So that it preserves CompositionLocals and propagate invalidations.\n        setParentCompositionContext(currentComposeContext)\n        setContent {\n          Box(\n              Modifier\n                  .then(modifier)\n                  // Allow the content to measure at its desired size without minimum or maximum constraints\n                  .wrapContentSize(unbounded = true)\n                  .graphicsLayer(clip = false)\n                  .onGloballyPositioned { coordinates ->\n                      viewAnnotationManager.updateViewAnnotation(\n                          this,\n                          with(currentOptions.value) {\n                              toBuilder()\n                                  .height(height ?: coordinates.size.height.toDouble())\n                                  .width(width ?: coordinates.size.width.toDouble())\n                                  .build()\n                          }\n                      )\n                    // Update layout params immediately and request layout\n                    layoutParams.apply {\n                      width = currentOptions.value.width?.toInt() ?: coordinates.size.width\n                      height = currentOptions.value.height?.toInt() ?: coordinates.size.height\n                    }\n                    requestLayout()\n                  }\n          ) {\n            content()\n          }\n        }\n      }\n\n      // need set a tag to avoid crashing, more details in [ViewAnnotationManagerImpl.measureView]\n      composeView.setTag(R.id.composeView, \"\")\n      viewAnnotationManager.addViewAnnotation(composeView, options)\n\n      ViewAnnotationNode(\n        viewAnnotationManager,\n        composeView,\n        onUpdatedListener\n      )\n    },\n    update = {\n      update(options) {\n        viewAnnotationManager.updateViewAnnotation(view, options)\n      }\n      update(content) {\n        throw IllegalStateException(\n          \"\"\"\n          Mutating content during composition is not allowed.\n          \"\"\".trimIndent()\n        )\n      }\n      update(onUpdatedListener) { onUpdatedListener ->\n        updateAndSubscribe(onUpdatedListener)\n      }\n    }\n  )\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotation.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.CircleAnnotationNode\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createCircleAnnotationManager\n\n/**\n * Composable function to add a [CircleAnnotation] to the Map. For convenience, if there's\n * no need to hoist the [circleAnnotationState], use `CircleAnnotation(point, onClick, init)` with trailing lambda instead.\n *\n * @param point The Point of the circleAnnotation, which represents the location of the circleAnnotation on the map.\n * @param onClick Callback to be invoked when the [CircleAnnotation] is clicked. The clicked [CircleAnnotation] will be passed as parameter.\n * @param circleAnnotationState The state holder for [CircleAnnotation] properties.\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"CircleAnnotation(point, circleAnnotationState)\"),\n  level = DeprecationLevel.WARNING\n)\npublic fun CircleAnnotation(\n  point: Point,\n  onClick: (CircleAnnotation) -> Boolean = { false },\n  circleAnnotationState: CircleAnnotationState = remember { CircleAnnotationState() },\n) {\n  CircleAnnotation(\n    point = point,\n    circleAnnotationState = circleAnnotationState.also {\n      it.interactionsState.onClicked(onClick = onClick)\n  }\n )\n}\n\n/**\n * Composable function to add a [CircleAnnotation] to the Map. For convenience, if there's\n * no need to hoist the [circleAnnotationState], use `CircleAnnotation(point, init)` with trailing lambda instead.\n *\n * @param point The Point of the circleAnnotation, which represents the location of the circleAnnotation on the map.\n * @param circleAnnotationState The state holder for [CircleAnnotation] properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun CircleAnnotation(\n  point: Point,\n  circleAnnotationState: CircleAnnotationState = remember { CircleAnnotationState() },\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of CircleAnnotation inside unsupported composable function\")\n\n  var annotationNode by remember {\n    mutableStateOf<CircleAnnotationNode?>(null)\n  }\n\n  var annotationManager by remember {\n    mutableStateOf<CircleAnnotationManager?>(null)\n  }\n\n  val coroutineScope = rememberCoroutineScope()\n\n  ComposeNode<CircleAnnotationNode, MapApplier>(\n    factory = {\n      val factoryAnnotationManager = mapApplier.mapView.annotations.createCircleAnnotationManager().also { annotationManager = it }\n      val annotationOptions: CircleAnnotationOptions = CircleAnnotationOptions()\n        .withPoint(point)\n        .withDraggable(circleAnnotationState.interactionsState.isDraggable)\n      val annotation = factoryAnnotationManager.create(annotationOptions)\n      CircleAnnotationNode(mapApplier.mapView.mapboxMap, factoryAnnotationManager, annotation, coroutineScope).also { annotationNode = it }\n    },\n    update = {\n      update(point) {\n        this.annotation.point = it\n        this.annotationManager.update(annotation)\n      }\n    }\n  ) {\n    key(circleAnnotationState) {\n      annotationNode?.let {\n        circleAnnotationState.UpdateProperties(it)\n      }\n    }\n  }\n  key(circleAnnotationState.interactionsState, annotationManager, annotationNode) {\n    if (annotationManager != null && annotationNode != null) {\n      annotationNode?.annotation?.isDraggable = circleAnnotationState.interactionsState.isDraggable\n      annotationManager?.let {\n        circleAnnotationState.interactionsState.BindTo(it)\n      }\n    }\n  }\n}\n\n/**\n * Composable function to add a [CircleAnnotation] to the Map.\n *\n * @param point The Point of the circleAnnotation, which represents the location of the circleAnnotation on the map.\n * @param onClick Callback to be invoked when the [CircleAnnotation] is clicked. The clicked [CircleAnnotation] will be passed as parameter.\n * @param init the lambda that will be applied to the remembered [CircleAnnotationState].\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"CircleAnnotation(point, init)\"),\n  level = DeprecationLevel.WARNING\n)\npublic inline fun CircleAnnotation(\n  point: Point,\n  noinline onClick: (CircleAnnotation) -> Boolean = { false },\n  crossinline init: CircleAnnotationState.() -> Unit,\n) {\n  CircleAnnotation(\n    point = point,\n    onClick = onClick,\n    circleAnnotationState = remember {\n      CircleAnnotationState()\n    }.apply(init),\n  )\n}\n\n/**\n * Composable function to add a [CircleAnnotation] to the Map.\n *\n * @param point The Point of the circleAnnotation, which represents the location of the circleAnnotation on the map.\n * @param init the lambda that will be applied to the remembered [CircleAnnotationState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun CircleAnnotation(\n  point: Point,\n  crossinline init: CircleAnnotationState.() -> Unit,\n) {\n  CircleAnnotation(\n    point = point,\n    circleAnnotationState = remember {\n      CircleAnnotationState()\n    }.apply(init),\n  )\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroup.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.CircleAnnotationManagerNode\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createCircleAnnotationManager\n\n/**\n * Composable function to add a [CircleAnnotationGroup] to the Map. For convenience, if there's\n * no need to hoist the [circleAnnotationGroupState], use `CircleAnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda instead.\n *\n * The [CircleAnnotationGroup] is more performant than adding multiple [CircleAnnotation] individually,\n * because the [CircleAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [CircleAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [CircleAnnotationGroup].\n * @param onClick Callback to be invoked when one of the [CircleAnnotation] in the cluster is clicked. The clicked [CircleAnnotation] will be passed as parameter.\n * @param circleAnnotationGroupState The state holder for [CircleAnnotation]Group properties.\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"CircleAnnotationGroup(annotations, annotationConfig, circleAnnotationGroupState)\"),\n  level = DeprecationLevel.WARNING\n)\npublic fun CircleAnnotationGroup(\n  annotations: List<CircleAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  onClick: (CircleAnnotation) -> Boolean = { false },\n  circleAnnotationGroupState: CircleAnnotationGroupState = remember { CircleAnnotationGroupState() }\n) {\n  CircleAnnotationGroup(\n    annotations,\n    annotationConfig,\n     circleAnnotationGroupState.also {\n      it.interactionsState.onClicked(onClick = onClick)\n    }\n  )\n}\n\n/**\n * Composable function to add a [CircleAnnotationGroup] to the Map. For convenience, if there's\n * no need to hoist the [circleAnnotationGroupState], use `CircleAnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda instead.\n *\n * The [CircleAnnotationGroup] is more performant than adding multiple [CircleAnnotation] individually,\n * because the [CircleAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [CircleAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [CircleAnnotationGroup].\n * @param circleAnnotationGroupState The state holder for [CircleAnnotation]Group properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun CircleAnnotationGroup(\n  annotations: List<CircleAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  circleAnnotationGroupState: CircleAnnotationGroupState = remember { CircleAnnotationGroupState() }\n) {\n\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of CircleAnnotationCluster inside unsupported composable function\")\n\n  var annotationManager by remember {\n    mutableStateOf<CircleAnnotationManager?>(null)\n  }\n\n  var annotationManagerNode by remember {\n    mutableStateOf<CircleAnnotationManagerNode?>(null)\n  }\n\n  if (circleAnnotationGroupState.interactionsState.isDraggable) {\n    annotations.forEach { it.withDraggable(true) }\n  }\n\n  val coroutineScope = rememberCoroutineScope()\n\n  ComposeNode<CircleAnnotationManagerNode, MapApplier>(\n    factory = {\n      CircleAnnotationManagerNode(\n        mapApplier.mapView.mapboxMap,\n        mapApplier.mapView.annotations.createCircleAnnotationManager(annotationConfig).also { annotationManager = it },\n        coroutineScope,\n      ).also { annotationManagerNode = it }\n    },\n    update = {\n      set(annotations) {\n        annotationClusterItems = it\n      }\n    }\n  ) {\n    key(circleAnnotationGroupState) {\n      annotationManager?.let {\n        circleAnnotationGroupState.UpdateProperties(it)\n      }\n    }\n  }\n  key(circleAnnotationGroupState.interactionsState, annotationManager, annotationManagerNode) {\n    if (annotationManager != null && annotationManagerNode != null) {\n      annotationManager?.let {\n        circleAnnotationGroupState.interactionsState.BindTo(it)\n      }\n      annotationManagerNode?.let {\n        it.currentAnnotations.forEach { annotation ->\n          annotation.isDraggable = circleAnnotationGroupState.interactionsState.isDraggable\n        }\n      }\n    }\n  }\n}\n\n/**\n * Composable function to add a [CircleAnnotationGroup] to the Map.\n *\n * The [CircleAnnotationGroup] is more performant than adding multiple [CircleAnnotation] individually,\n * because the [CircleAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [CircleAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [CircleAnnotationGroup].\n * @param onClick Callback to be invoked when one of the [CircleAnnotation] in the cluster is clicked. The clicked [CircleAnnotation] will be passed as parameter.\n * @param init the lambda that will be applied to the remembered [CircleAnnotationGroupState].\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"CircleAnnotationGroup(annotations, annotationConfig, init)\"),\n  level = DeprecationLevel.WARNING\n)\npublic inline fun CircleAnnotationGroup(\n  annotations: List<CircleAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  noinline onClick: (CircleAnnotation) -> Boolean = { false },\n  crossinline init: CircleAnnotationGroupState.() -> Unit\n) {\n  CircleAnnotationGroup(\n    annotations = annotations,\n    annotationConfig = annotationConfig,\n    onClick = onClick,\n    circleAnnotationGroupState = remember { CircleAnnotationGroupState() }.apply(init)\n  )\n}\n\n/**\n * Composable function to add a [CircleAnnotationGroup] to the Map.\n *\n * The [CircleAnnotationGroup] is more performant than adding multiple [CircleAnnotation] individually,\n * because the [CircleAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [CircleAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [CircleAnnotationGroup].\n * @param init the lambda that will be applied to the remembered [CircleAnnotationGroupState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun CircleAnnotationGroup(\n  annotations: List<CircleAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  crossinline init: CircleAnnotationGroupState.() -> Unit\n) {\n  CircleAnnotationGroup(\n    annotations = annotations,\n    annotationConfig = annotationConfig,\n    circleAnnotationGroupState = remember { CircleAnnotationGroupState() }.apply(init)\n  )\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupInteractionsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.ClusterFeature\nimport com.mapbox.maps.plugin.annotation.OnClusterClickListener\nimport com.mapbox.maps.plugin.annotation.OnClusterLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationLongClickListener\n\n/**\n * The state holder for Interactions of [CircleAnnotationGroup].\n */\n@Stable\npublic class CircleAnnotationGroupInteractionsState {\n\n  private val onClickedListener: OnCircleAnnotationClickListener = OnCircleAnnotationClickListener {\n    onClicked?.invoke(it) ?: false\n  }\n\n  private val onLongClickedListener: OnCircleAnnotationLongClickListener =\n    OnCircleAnnotationLongClickListener {\n      onLongClicked?.invoke(it) ?: false\n    }\n\n  private val onClusterClickedListener: OnClusterClickListener = OnClusterClickListener {\n    onClusterClicked?.invoke(it) ?: false\n  }\n\n  private val onClusterLongClickedListener: OnClusterLongClickListener = OnClusterLongClickListener {\n    onClusterLongClicked?.invoke(it) ?: false\n  }\n\n  private val onDragListener: OnCircleAnnotationDragListener =\n      object : OnCircleAnnotationDragListener {\n        override fun onAnnotationDragStarted(annotation: Annotation<*>) {\n          (annotation as? CircleAnnotation)?.let {\n            onDragStarted?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDrag(annotation: Annotation<*>) {\n          (annotation as? CircleAnnotation)?.let {\n            onDragged?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDragFinished(annotation: Annotation<*>) {\n          (annotation as? CircleAnnotation)?.let {\n            onDragFinished?.invoke(it)\n          }\n        }\n      }\n\n  private var onClicked: ((CircleAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onLongClicked: ((CircleAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onDragStarted: ((CircleAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragged: ((CircleAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragFinished: ((CircleAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onClusterClicked: ((ClusterFeature) -> Boolean)? by mutableStateOf(null)\n  private var onClusterLongClicked: ((ClusterFeature) -> Boolean)? by mutableStateOf(null)\n\n  /**\n   * Set whether CircleAnnotation holding this CircleAnnotationGroupInteractionsState should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when CircleAnnotation is also part of the cluster, then once CircleAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate CircleAnnotation.\n   */\n  public var isDraggable: Boolean by mutableStateOf(false)\n\n  /**\n   * Set onClick Callback to be invoked when the [CircleAnnotation] is clicked. The clicked [CircleAnnotation] will be passed as parameter.\n   * Returns reference to [CircleAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onClicked(onClick: (CircleAnnotation) -> Boolean): CircleAnnotationGroupInteractionsState =\n    apply {\n      onClicked = onClick\n    }\n\n  /**\n   * Set onLongClick Callback to be invoked when one of the [CircleAnnotation] is long clicked. The long clicked [CircleAnnotation] will be passed as parameter.\n   * Returns reference to [CircleAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onLongClicked(onLongClick: (CircleAnnotation) -> Boolean): CircleAnnotationGroupInteractionsState =\n    apply {\n      onLongClicked = onLongClick\n    }\n\n  /**\n   * Set onClusterClick Callback to be invoked when one of the clusters is clicked. The clicked cluster represented by a [Feature] wrapped with [ClusterFeature] with additional properties.\n   * Returns reference to [CircleAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onClusterClicked(onClusterClick: (ClusterFeature) -> Boolean): CircleAnnotationGroupInteractionsState =\n    apply {\n      onClusterClicked = onClusterClick\n    }\n\n  /**\n   * Set onClusterLongClick Callback to be invoked when one of the clusters is long clicked. The clicked cluster represented by a [Feature] wrapped with [ClusterFeature] with additional properties.\n   * Returns reference to [CircleAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onClusterLongClicked(onClusterLongClick: (ClusterFeature) -> Boolean): CircleAnnotationGroupInteractionsState =\n    apply {\n      onClusterLongClicked = onClusterLongClick\n    }\n\n  /**\n   *  Set onDragStart Callback to be invoked when one of the [CircleAnnotation] dragging has started. The dragged [CircleAnnotation] will be passed as parameter.\n   */\n  public fun onDragStarted(onDragStart: (CircleAnnotation) -> Unit): CircleAnnotationGroupInteractionsState =\n    apply {\n      onDragStarted = onDragStart\n    }\n\n  /**\n   *  Set onDrag Callback to be invoked when one of the [CircleAnnotation] dragging is in progress. The dragged [CircleAnnotation] will be passed as parameter.\n   */\n  public fun onDragged(onDrag: (CircleAnnotation) -> Unit): CircleAnnotationGroupInteractionsState =\n    apply {\n      onDragged = onDrag\n    }\n\n  /**\n   *  Set onDragFinish Callback to be invoked when one of the [CircleAnnotation] dragging has finished. The dragged [CircleAnnotation] will be passed as parameter.\n   */\n  public fun onDragFinished(onDragFinish: (CircleAnnotation) -> Unit): CircleAnnotationGroupInteractionsState =\n    apply {\n      onDragFinished = onDragFinish\n    }\n\n  @Composable\n  internal fun BindTo(annotationManager: CircleAnnotationManager) {\n    DisposableEffect(key1 = onClicked) {\n      onClicked?.let {\n        annotationManager.addClickListener(onClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClickListener(onClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onLongClicked) {\n      onLongClicked?.let {\n        annotationManager.addLongClickListener(onLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeLongClickListener(onLongClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onDragStarted, onDragged, onDragFinished) {\n      if (onDragStarted != null || onDragged != null || onDragFinished != null) {\n        annotationManager.addDragListener(onDragListener)\n      }\n      onDispose {\n        annotationManager.removeDragListener(onDragListener)\n      }\n    }\n    DisposableEffect(key1 = onClusterClicked) {\n      onClusterClicked.let {\n        annotationManager.addClusterClickListener(onClusterClickedListener)\n      }\n      onDispose {\n          annotationManager.removeClusterClickListener(onClusterClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onClusterLongClicked) {\n      onClusterLongClicked.let {\n        annotationManager.addClusterLongClickListener(onClusterLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClusterLongClickListener(onClusterLongClickedListener)\n      }\n    }\n  }\n}\n\n/**\n * Create and remember a [CircleAnnotationGroupInteractionsState] with init block.\n *\n * @param init the initialization block to be applied to the [CircleAnnotationGroupInteractionsState] after created and remembered.\n *\n * @return a [CircleAnnotationGroupInteractionsState]\n */\n@Composable\npublic inline fun rememberCircleAnnotationGroupInteractionsState(crossinline init: CircleAnnotationGroupInteractionsState.() -> Unit = {}): CircleAnnotationGroupInteractionsState {\n  return remember {\n    CircleAnnotationGroupInteractionsState()\n  }.apply(init)\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationGroupState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference\nimport com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment\nimport com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale\nimport com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager\n\n/**\n * The state holder for [CircleAnnotationGroup] properties.\n */\n@Stable\npublic class CircleAnnotationGroupState private constructor(\n  initialCircleElevationReference: CircleElevationReference?,\n  initialCircleSortKey: Double?,\n  initialCircleBlur: Double?,\n  initialCircleColor: Color?,\n  initialCircleEmissiveStrength: Double?,\n  initialCircleOpacity: Double?,\n  initialCirclePitchAlignment: CirclePitchAlignment?,\n  initialCirclePitchScale: CirclePitchScale?,\n  initialCircleRadius: Double?,\n  initialCircleStrokeColor: Color?,\n  initialCircleStrokeOpacity: Double?,\n  initialCircleStrokeWidth: Double?,\n  initialCircleTranslate: List<Double>?,\n  initialCircleTranslateAnchor: CircleTranslateAnchor?,\n  initialMaxZoom: Double?,\n  initialMinZoom: Double?,\n  initialCircleColorUseTheme: String?,\n  initialCircleStrokeColorUseTheme: String?,\n  initialCircleAnnotationGroupInteractionsState: CircleAnnotationGroupInteractionsState,\n) {\n  public constructor() : this(\n    initialCircleElevationReference = null,\n    initialCircleSortKey = null,\n    initialCircleBlur = null,\n    initialCircleColor = null,\n    initialCircleEmissiveStrength = null,\n    initialCircleOpacity = null,\n    initialCirclePitchAlignment = null,\n    initialCirclePitchScale = null,\n    initialCircleRadius = null,\n    initialCircleStrokeColor = null,\n    initialCircleStrokeOpacity = null,\n    initialCircleStrokeWidth = null,\n    initialCircleTranslate = null,\n    initialCircleTranslateAnchor = null,\n    initialMaxZoom = null,\n    initialMinZoom = null,\n    initialCircleColorUseTheme = null,\n    initialCircleStrokeColorUseTheme = null,\n    initialCircleAnnotationGroupInteractionsState = CircleAnnotationGroupInteractionsState(),\n  )\n\n  /**\n   * Holds all interactions with [PointAnnotationGroup]\n   */\n  public var interactionsState: CircleAnnotationGroupInteractionsState by mutableStateOf(initialCircleAnnotationGroupInteractionsState)\n  /**\n   * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  @MapboxExperimental\n  public var circleElevationReference: CircleElevationReference? by mutableStateOf(initialCircleElevationReference)\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  public var circleSortKey: Double? by mutableStateOf(initialCircleSortKey)\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   */\n  public var circleBlur: Double? by mutableStateOf(initialCircleBlur)\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   */\n  public var circleColor: Color? by mutableStateOf(initialCircleColor)\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   */\n  public var circleEmissiveStrength: Double? by mutableStateOf(initialCircleEmissiveStrength)\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var circleOpacity: Double? by mutableStateOf(initialCircleOpacity)\n  /**\n   * Orientation of circle when map is pitched. Default value: \"viewport\".\n   */\n  public var circlePitchAlignment: CirclePitchAlignment? by mutableStateOf(initialCirclePitchAlignment)\n  /**\n   * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n   */\n  public var circlePitchScale: CirclePitchScale? by mutableStateOf(initialCirclePitchScale)\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   */\n  public var circleRadius: Double? by mutableStateOf(initialCircleRadius)\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   */\n  public var circleStrokeColor: Color? by mutableStateOf(initialCircleStrokeColor)\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   */\n  public var circleStrokeOpacity: Double? by mutableStateOf(initialCircleStrokeOpacity)\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   */\n  public var circleStrokeWidth: Double? by mutableStateOf(initialCircleStrokeWidth)\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   */\n  public var circleTranslate: List<Double>? by mutableStateOf(initialCircleTranslate)\n  /**\n   * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n   */\n  public var circleTranslateAnchor: CircleTranslateAnchor? by mutableStateOf(initialCircleTranslateAnchor)\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: Double? by mutableStateOf(initialMaxZoom)\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: Double? by mutableStateOf(initialMinZoom)\n  /**\n   * This property defines whether the `circleColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var circleColorUseTheme: String? by mutableStateOf(initialCircleColorUseTheme)\n  /**\n   * This property defines whether the `circleStrokeColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var circleStrokeColorUseTheme: String? by mutableStateOf(initialCircleStrokeColorUseTheme)\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateCircleElevationReference(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleElevationReference = circleElevationReference\n  }\n  @Composable\n  private fun UpdateCircleSortKey(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleSortKey = circleSortKey\n  }\n  @Composable\n  private fun UpdateCircleBlur(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleBlur = circleBlur\n  }\n  @Composable\n  private fun UpdateCircleColor(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleColorString = circleColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateCircleEmissiveStrength(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleEmissiveStrength = circleEmissiveStrength\n  }\n  @Composable\n  private fun UpdateCircleOpacity(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleOpacity = circleOpacity\n  }\n  @Composable\n  private fun UpdateCirclePitchAlignment(annotationManager: CircleAnnotationManager) {\n    annotationManager.circlePitchAlignment = circlePitchAlignment\n  }\n  @Composable\n  private fun UpdateCirclePitchScale(annotationManager: CircleAnnotationManager) {\n    annotationManager.circlePitchScale = circlePitchScale\n  }\n  @Composable\n  private fun UpdateCircleRadius(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleRadius = circleRadius\n  }\n  @Composable\n  private fun UpdateCircleStrokeColor(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleStrokeColorString = circleStrokeColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateCircleStrokeOpacity(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleStrokeOpacity = circleStrokeOpacity\n  }\n  @Composable\n  private fun UpdateCircleStrokeWidth(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleStrokeWidth = circleStrokeWidth\n  }\n  @Composable\n  private fun UpdateCircleTranslate(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleTranslate = circleTranslate\n  }\n  @Composable\n  private fun UpdateCircleTranslateAnchor(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleTranslateAnchor = circleTranslateAnchor\n  }\n  @Composable\n  private fun UpdateMaxZoom(annotationManager: CircleAnnotationManager) {\n    annotationManager.maxZoom = maxZoom\n  }\n  @Composable\n  private fun UpdateMinZoom(annotationManager: CircleAnnotationManager) {\n    annotationManager.minZoom = minZoom\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateCircleColorUseTheme(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleColorUseTheme = circleColorUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateCircleStrokeColorUseTheme(annotationManager: CircleAnnotationManager) {\n    annotationManager.circleStrokeColorUseTheme = circleStrokeColorUseTheme\n  }\n\n  @Composable\n  internal fun UpdateProperties(annotationManager: CircleAnnotationManager) {\n    UpdateCircleElevationReference(annotationManager)\n    UpdateCircleSortKey(annotationManager)\n    UpdateCircleBlur(annotationManager)\n    UpdateCircleColor(annotationManager)\n    UpdateCircleEmissiveStrength(annotationManager)\n    UpdateCircleOpacity(annotationManager)\n    UpdateCirclePitchAlignment(annotationManager)\n    UpdateCirclePitchScale(annotationManager)\n    UpdateCircleRadius(annotationManager)\n    UpdateCircleStrokeColor(annotationManager)\n    UpdateCircleStrokeOpacity(annotationManager)\n    UpdateCircleStrokeWidth(annotationManager)\n    UpdateCircleTranslate(annotationManager)\n    UpdateCircleTranslateAnchor(annotationManager)\n    UpdateMaxZoom(annotationManager)\n    UpdateMinZoom(annotationManager)\n    UpdateCircleColorUseTheme(annotationManager)\n    UpdateCircleStrokeColorUseTheme(annotationManager)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationInteractionsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationLongClickListener\n\n/**\n * The state holder for Interactions of [CircleAnnotation].\n */\n@Stable\npublic class CircleAnnotationInteractionsState {\n\n  private val onClickedListener: OnCircleAnnotationClickListener = OnCircleAnnotationClickListener {\n    onClicked?.invoke(it) ?: false\n  }\n\n  private val onLongClickedListener: OnCircleAnnotationLongClickListener =\n    OnCircleAnnotationLongClickListener {\n      onLongClicked?.invoke(it) ?: false\n    }\n\n  private val onDragListener: OnCircleAnnotationDragListener =\n      object : OnCircleAnnotationDragListener {\n        override fun onAnnotationDragStarted(annotation: Annotation<*>) {\n          (annotation as? CircleAnnotation)?.let {\n            onDragStarted?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDrag(annotation: Annotation<*>) {\n          (annotation as? CircleAnnotation)?.let {\n            onDragged?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDragFinished(annotation: Annotation<*>) {\n          (annotation as? CircleAnnotation)?.let {\n            onDragFinished?.invoke(it)\n          }\n        }\n      }\n\n  private var onClicked: ((CircleAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onLongClicked: ((CircleAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onDragStarted: ((CircleAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragged: ((CircleAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragFinished: ((CircleAnnotation) -> Unit)? by mutableStateOf(null)\n\n  /**\n   * Set whether CircleAnnotation holding this CircleAnnotationInteractionsState should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when CircleAnnotation is also part of the cluster, then once CircleAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate CircleAnnotation.\n   */\n  public var isDraggable: Boolean by mutableStateOf(false)\n\n  /**\n   * Set onClick Callback to be invoked when the [CircleAnnotation] is clicked. The clicked [CircleAnnotation] will be passed as parameter.\n   * Returns reference to [CircleAnnotationInteractionsState] for making chained calls.\n   */\n  public fun onClicked(onClick: (CircleAnnotation) -> Boolean): CircleAnnotationInteractionsState =\n    apply {\n      onClicked = onClick\n    }\n\n  /**\n   * Set onLongClick Callback to be invoked when one of the [CircleAnnotation] is long clicked. The long clicked [CircleAnnotation] will be passed as parameter.\n   * Returns reference to [CircleAnnotationInteractionsState] for making chained calls.\n   */\n  public fun onLongClicked(onLongClick: (CircleAnnotation) -> Boolean): CircleAnnotationInteractionsState =\n    apply {\n      onLongClicked = onLongClick\n    }\n\n  /**\n   *  Set onDragStart Callback to be invoked when one of the [CircleAnnotation] dragging has started. The dragged [CircleAnnotation] will be passed as parameter.\n   */\n  public fun onDragStarted(onDragStart: (CircleAnnotation) -> Unit): CircleAnnotationInteractionsState =\n    apply {\n      onDragStarted = onDragStart\n    }\n\n  /**\n   *  Set onDrag Callback to be invoked when one of the [CircleAnnotation] dragging is in progress. The dragged [CircleAnnotation] will be passed as parameter.\n   */\n  public fun onDragged(onDrag: (CircleAnnotation) -> Unit): CircleAnnotationInteractionsState =\n    apply {\n      onDragged = onDrag\n    }\n\n  /**\n   *  Set onDragFinish Callback to be invoked when one of the [CircleAnnotation] dragging has finished. The dragged [CircleAnnotation] will be passed as parameter.\n   */\n  public fun onDragFinished(onDragFinish: (CircleAnnotation) -> Unit): CircleAnnotationInteractionsState =\n    apply {\n      onDragFinished = onDragFinish\n    }\n\n  @Composable\n  internal fun BindTo(annotationManager: CircleAnnotationManager) {\n    DisposableEffect(key1 = onClicked) {\n      onClicked?.let {\n        annotationManager.addClickListener(onClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClickListener(onClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onLongClicked) {\n      onLongClicked?.let {\n        annotationManager.addLongClickListener(onLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeLongClickListener(onLongClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onDragStarted, onDragged, onDragFinished) {\n      if (onDragStarted != null || onDragged != null || onDragFinished != null) {\n        annotationManager.addDragListener(onDragListener)\n      }\n      onDispose {\n        annotationManager.removeDragListener(onDragListener)\n      }\n    }\n  }\n}\n\n/**\n * Create and remember a [CircleAnnotationInteractionsState] with init block.\n *\n * @param init the initialization block to be applied to the [CircleAnnotationInteractionsState] after created and remembered.\n *\n * @return a [CircleAnnotationInteractionsState]\n */\n@Composable\npublic inline fun rememberCircleAnnotationInteractionsState(crossinline init: CircleAnnotationInteractionsState.() -> Unit = {}): CircleAnnotationInteractionsState {\n  return remember {\n    CircleAnnotationInteractionsState()\n  }.apply(init)\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationOptionsExt.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\n\n/**\n * Set circle-color to initialise the circleAnnotation with.\n *\n * The fill color of the circle. Default value: \"#000000\".\n *\n * @param circleColor the circle-color value\n * @return this\n */\npublic fun CircleAnnotationOptions.withCircleColor(circleColor: Color): CircleAnnotationOptions = apply {\n  withCircleColor(circleColor.toArgb())\n}\n/**\n * Set circle-stroke-color to initialise the circleAnnotation with.\n *\n * The stroke color of the circle. Default value: \"#000000\".\n *\n * @param circleStrokeColor the circle-stroke-color value\n * @return this\n */\npublic fun CircleAnnotationOptions.withCircleStrokeColor(circleStrokeColor: Color): CircleAnnotationOptions = apply {\n  withCircleStrokeColor(circleStrokeColor.toArgb())\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/CircleAnnotationState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.CircleAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\n\n/**\n * The state holder for [CircleAnnotation] properties.\n */\n@Stable\npublic class CircleAnnotationState private constructor(\n  initialCircleBlur: Double?,\n  initialCircleColor: Color?,\n  initialCircleOpacity: Double?,\n  initialCircleRadius: Double?,\n  initialCircleStrokeColor: Color?,\n  initialCircleStrokeOpacity: Double?,\n  initialCircleStrokeWidth: Double?,\n  initialCircleColorUseTheme: String?,\n  initialCircleStrokeColorUseTheme: String?,\n  initialCircleAnnotationInteractionsState: CircleAnnotationInteractionsState,\n) {\n\n  public constructor() : this(\n    initialCircleBlur = null,\n    initialCircleColor = null,\n    initialCircleOpacity = null,\n    initialCircleRadius = null,\n    initialCircleStrokeColor = null,\n    initialCircleStrokeOpacity = null,\n    initialCircleStrokeWidth = null,\n    initialCircleColorUseTheme = null,\n    initialCircleStrokeColorUseTheme = null,\n    initialCircleAnnotationInteractionsState = CircleAnnotationInteractionsState(),\n)\n\n  /**\n  * All interactions with [PointAnnotation]\n  */\n  public var interactionsState: CircleAnnotationInteractionsState by mutableStateOf(initialCircleAnnotationInteractionsState)\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   */\n  public var circleBlur: Double? by mutableStateOf(initialCircleBlur)\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   */\n  public var circleColor: Color? by mutableStateOf(initialCircleColor)\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var circleOpacity: Double? by mutableStateOf(initialCircleOpacity)\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   */\n  public var circleRadius: Double? by mutableStateOf(initialCircleRadius)\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   */\n  public var circleStrokeColor: Color? by mutableStateOf(initialCircleStrokeColor)\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   */\n  public var circleStrokeOpacity: Double? by mutableStateOf(initialCircleStrokeOpacity)\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   */\n  public var circleStrokeWidth: Double? by mutableStateOf(initialCircleStrokeWidth)\n  /**\n   * This property defines whether the `circleColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var circleColorUseTheme: String? by mutableStateOf(initialCircleColorUseTheme)\n  /**\n   * This property defines whether the `circleStrokeColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var circleStrokeColorUseTheme: String? by mutableStateOf(initialCircleStrokeColorUseTheme)\n\n  @Composable\n  private fun UpdateCircleBlur(\n    annotationNode: CircleAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.circleBlur = circleBlur\n      }\n    )\n  }\n  @Composable\n  private fun UpdateCircleColor(\n    annotationNode: CircleAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.circleColorInt = circleColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateCircleOpacity(\n    annotationNode: CircleAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.circleOpacity = circleOpacity\n      }\n    )\n  }\n  @Composable\n  private fun UpdateCircleRadius(\n    annotationNode: CircleAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.circleRadius = circleRadius\n      }\n    )\n  }\n  @Composable\n  private fun UpdateCircleStrokeColor(\n    annotationNode: CircleAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.circleStrokeColorInt = circleStrokeColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateCircleStrokeOpacity(\n    annotationNode: CircleAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.circleStrokeOpacity = circleStrokeOpacity\n      }\n    )\n  }\n  @Composable\n  private fun UpdateCircleStrokeWidth(\n    annotationNode: CircleAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.circleStrokeWidth = circleStrokeWidth\n      }\n    )\n  }\n  @Composable\n  private fun UpdateCircleColorUseTheme(\n    annotationNode: CircleAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.circleColorUseTheme = circleColorUseTheme\n      }\n    )\n  }\n  @Composable\n  private fun UpdateCircleStrokeColorUseTheme(\n    annotationNode: CircleAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.circleStrokeColorUseTheme = circleStrokeColorUseTheme\n      }\n    )\n  }\n\n  @Composable\n  internal fun UpdateProperties(\n    annotationNode: CircleAnnotationNode,\n  ) {\n    UpdateCircleBlur(annotationNode)\n    UpdateCircleColor(annotationNode)\n    UpdateCircleOpacity(annotationNode)\n    UpdateCircleRadius(annotationNode)\n    UpdateCircleStrokeColor(annotationNode)\n    UpdateCircleStrokeOpacity(annotationNode)\n    UpdateCircleStrokeWidth(annotationNode)\n    UpdateCircleColorUseTheme(annotationNode)\n    UpdateCircleStrokeColorUseTheme(annotationNode)\n  }\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PointAnnotation.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.PointAnnotationNode\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\n\n/**\n * Composable function to add a [PointAnnotation] to the Map. For convenience, if there's\n * no need to hoist the [pointAnnotationState], use `PointAnnotation(point, onClick, init)` with trailing lambda instead.\n *\n * @param point The Point of the pointAnnotation, which represents the location of the pointAnnotation on the map.\n * @param onClick Callback to be invoked when the [PointAnnotation] is clicked. The clicked [PointAnnotation] will be passed as parameter.\n * @param pointAnnotationState The state holder for [PointAnnotation] properties.\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PointAnnotation(point, pointAnnotationState)\"),\n  level = DeprecationLevel.WARNING\n)\npublic fun PointAnnotation(\n  point: Point,\n  onClick: (PointAnnotation) -> Boolean = { false },\n  pointAnnotationState: PointAnnotationState = remember { PointAnnotationState() },\n) {\n  PointAnnotation(\n    point = point,\n    pointAnnotationState = pointAnnotationState.also {\n      it.interactionsState.onClicked(onClick = onClick)\n  }\n )\n}\n\n/**\n * Composable function to add a [PointAnnotation] to the Map. For convenience, if there's\n * no need to hoist the [pointAnnotationState], use `PointAnnotation(point, init)` with trailing lambda instead.\n *\n * @param point The Point of the pointAnnotation, which represents the location of the pointAnnotation on the map.\n * @param pointAnnotationState The state holder for [PointAnnotation] properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun PointAnnotation(\n  point: Point,\n  pointAnnotationState: PointAnnotationState = remember { PointAnnotationState() },\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of PointAnnotation inside unsupported composable function\")\n\n  var annotationNode by remember {\n    mutableStateOf<PointAnnotationNode?>(null)\n  }\n\n  var annotationManager by remember {\n    mutableStateOf<PointAnnotationManager?>(null)\n  }\n\n  val coroutineScope = rememberCoroutineScope()\n\n  ComposeNode<PointAnnotationNode, MapApplier>(\n    factory = {\n      val factoryAnnotationManager = mapApplier.mapView.annotations.createPointAnnotationManager().also { annotationManager = it }\n      val annotationOptions: PointAnnotationOptions = PointAnnotationOptions()\n        .withPoint(point)\n        .withDraggable(pointAnnotationState.interactionsState.isDraggable)\n      val annotation = factoryAnnotationManager.create(annotationOptions)\n      PointAnnotationNode(mapApplier.mapView.mapboxMap, factoryAnnotationManager, annotation, coroutineScope).also { annotationNode = it }\n    },\n    update = {\n      update(point) {\n        this.annotation.point = it\n        this.annotationManager.update(annotation)\n      }\n    }\n  ) {\n    key(pointAnnotationState) {\n      annotationNode?.let {\n        pointAnnotationState.UpdateProperties(it)\n      }\n    }\n  }\n  key(pointAnnotationState.interactionsState, annotationManager, annotationNode) {\n    if (annotationManager != null && annotationNode != null) {\n      annotationNode?.annotation?.isDraggable = pointAnnotationState.interactionsState.isDraggable\n      annotationManager?.let {\n        pointAnnotationState.interactionsState.BindTo(it)\n      }\n    }\n  }\n}\n\n/**\n * Composable function to add a [PointAnnotation] to the Map.\n *\n * @param point The Point of the pointAnnotation, which represents the location of the pointAnnotation on the map.\n * @param onClick Callback to be invoked when the [PointAnnotation] is clicked. The clicked [PointAnnotation] will be passed as parameter.\n * @param init the lambda that will be applied to the remembered [PointAnnotationState].\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PointAnnotation(point, init)\"),\n  level = DeprecationLevel.WARNING\n)\npublic inline fun PointAnnotation(\n  point: Point,\n  noinline onClick: (PointAnnotation) -> Boolean = { false },\n  crossinline init: PointAnnotationState.() -> Unit,\n) {\n  PointAnnotation(\n    point = point,\n    onClick = onClick,\n    pointAnnotationState = remember {\n      PointAnnotationState()\n    }.apply(init),\n  )\n}\n\n/**\n * Composable function to add a [PointAnnotation] to the Map.\n *\n * @param point The Point of the pointAnnotation, which represents the location of the pointAnnotation on the map.\n * @param init the lambda that will be applied to the remembered [PointAnnotationState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun PointAnnotation(\n  point: Point,\n  crossinline init: PointAnnotationState.() -> Unit,\n) {\n  PointAnnotation(\n    point = point,\n    pointAnnotationState = remember {\n      PointAnnotationState()\n    }.apply(init),\n  )\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroup.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.PointAnnotationManagerNode\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager\n\n/**\n * Composable function to add a [PointAnnotationGroup] to the Map. For convenience, if there's\n * no need to hoist the [pointAnnotationGroupState], use `PointAnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda instead.\n *\n * The [PointAnnotationGroup] is more performant than adding multiple [PointAnnotation] individually,\n * because the [PointAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PointAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PointAnnotationGroup].\n * @param onClick Callback to be invoked when one of the [PointAnnotation] in the cluster is clicked. The clicked [PointAnnotation] will be passed as parameter.\n * @param pointAnnotationGroupState The state holder for [PointAnnotation]Group properties.\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PointAnnotationGroup(annotations, annotationConfig, pointAnnotationGroupState)\"),\n  level = DeprecationLevel.WARNING\n)\npublic fun PointAnnotationGroup(\n  annotations: List<PointAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  onClick: (PointAnnotation) -> Boolean = { false },\n  pointAnnotationGroupState: PointAnnotationGroupState = remember { PointAnnotationGroupState() }\n) {\n  PointAnnotationGroup(\n    annotations,\n    annotationConfig,\n     pointAnnotationGroupState.also {\n      it.interactionsState.onClicked(onClick = onClick)\n    }\n  )\n}\n\n/**\n * Composable function to add a [PointAnnotationGroup] to the Map. For convenience, if there's\n * no need to hoist the [pointAnnotationGroupState], use `PointAnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda instead.\n *\n * The [PointAnnotationGroup] is more performant than adding multiple [PointAnnotation] individually,\n * because the [PointAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PointAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PointAnnotationGroup].\n * @param pointAnnotationGroupState The state holder for [PointAnnotation]Group properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun PointAnnotationGroup(\n  annotations: List<PointAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  pointAnnotationGroupState: PointAnnotationGroupState = remember { PointAnnotationGroupState() }\n) {\n\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of PointAnnotationCluster inside unsupported composable function\")\n\n  var annotationManager by remember {\n    mutableStateOf<PointAnnotationManager?>(null)\n  }\n\n  var annotationManagerNode by remember {\n    mutableStateOf<PointAnnotationManagerNode?>(null)\n  }\n\n  if (pointAnnotationGroupState.interactionsState.isDraggable) {\n    annotations.forEach { it.withDraggable(true) }\n  }\n\n  val coroutineScope = rememberCoroutineScope()\n\n  ComposeNode<PointAnnotationManagerNode, MapApplier>(\n    factory = {\n      PointAnnotationManagerNode(\n        mapApplier.mapView.mapboxMap,\n        mapApplier.mapView.annotations.createPointAnnotationManager(annotationConfig).also { annotationManager = it },\n        coroutineScope,\n      ).also { annotationManagerNode = it }\n    },\n    update = {\n      set(annotations) {\n        annotationClusterItems = it\n      }\n    }\n  ) {\n    key(pointAnnotationGroupState) {\n      annotationManager?.let {\n        pointAnnotationGroupState.UpdateProperties(it)\n      }\n    }\n  }\n  key(pointAnnotationGroupState.interactionsState, annotationManager, annotationManagerNode) {\n    if (annotationManager != null && annotationManagerNode != null) {\n      annotationManager?.let {\n        pointAnnotationGroupState.interactionsState.BindTo(it)\n      }\n      annotationManagerNode?.let {\n        it.currentAnnotations.forEach { annotation ->\n          annotation.isDraggable = pointAnnotationGroupState.interactionsState.isDraggable\n        }\n      }\n    }\n  }\n}\n\n/**\n * Composable function to add a [PointAnnotationGroup] to the Map.\n *\n * The [PointAnnotationGroup] is more performant than adding multiple [PointAnnotation] individually,\n * because the [PointAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PointAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PointAnnotationGroup].\n * @param onClick Callback to be invoked when one of the [PointAnnotation] in the cluster is clicked. The clicked [PointAnnotation] will be passed as parameter.\n * @param init the lambda that will be applied to the remembered [PointAnnotationGroupState].\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PointAnnotationGroup(annotations, annotationConfig, init)\"),\n  level = DeprecationLevel.WARNING\n)\npublic inline fun PointAnnotationGroup(\n  annotations: List<PointAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  noinline onClick: (PointAnnotation) -> Boolean = { false },\n  crossinline init: PointAnnotationGroupState.() -> Unit\n) {\n  PointAnnotationGroup(\n    annotations = annotations,\n    annotationConfig = annotationConfig,\n    onClick = onClick,\n    pointAnnotationGroupState = remember { PointAnnotationGroupState() }.apply(init)\n  )\n}\n\n/**\n * Composable function to add a [PointAnnotationGroup] to the Map.\n *\n * The [PointAnnotationGroup] is more performant than adding multiple [PointAnnotation] individually,\n * because the [PointAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PointAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PointAnnotationGroup].\n * @param init the lambda that will be applied to the remembered [PointAnnotationGroupState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun PointAnnotationGroup(\n  annotations: List<PointAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  crossinline init: PointAnnotationGroupState.() -> Unit\n) {\n  PointAnnotationGroup(\n    annotations = annotations,\n    annotationConfig = annotationConfig,\n    pointAnnotationGroupState = remember { PointAnnotationGroupState() }.apply(init)\n  )\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupInteractionsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.ClusterFeature\nimport com.mapbox.maps.plugin.annotation.OnClusterClickListener\nimport com.mapbox.maps.plugin.annotation.OnClusterLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\n\n/**\n * The state holder for Interactions of [PointAnnotationGroup].\n */\n@Stable\npublic class PointAnnotationGroupInteractionsState {\n\n  private val onClickedListener: OnPointAnnotationClickListener = OnPointAnnotationClickListener {\n    onClicked?.invoke(it) ?: false\n  }\n\n  private val onLongClickedListener: OnPointAnnotationLongClickListener =\n    OnPointAnnotationLongClickListener {\n      onLongClicked?.invoke(it) ?: false\n    }\n\n  private val onClusterClickedListener: OnClusterClickListener = OnClusterClickListener {\n    onClusterClicked?.invoke(it) ?: false\n  }\n\n  private val onClusterLongClickedListener: OnClusterLongClickListener = OnClusterLongClickListener {\n    onClusterLongClicked?.invoke(it) ?: false\n  }\n\n  private val onDragListener: OnPointAnnotationDragListener =\n      object : OnPointAnnotationDragListener {\n        override fun onAnnotationDragStarted(annotation: Annotation<*>) {\n          (annotation as? PointAnnotation)?.let {\n            onDragStarted?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDrag(annotation: Annotation<*>) {\n          (annotation as? PointAnnotation)?.let {\n            onDragged?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDragFinished(annotation: Annotation<*>) {\n          (annotation as? PointAnnotation)?.let {\n            onDragFinished?.invoke(it)\n          }\n        }\n      }\n\n  private var onClicked: ((PointAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onLongClicked: ((PointAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onDragStarted: ((PointAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragged: ((PointAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragFinished: ((PointAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onClusterClicked: ((ClusterFeature) -> Boolean)? by mutableStateOf(null)\n  private var onClusterLongClicked: ((ClusterFeature) -> Boolean)? by mutableStateOf(null)\n\n  /**\n   * Set whether PointAnnotation holding this PointAnnotationGroupInteractionsState should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when PointAnnotation is also part of the cluster, then once PointAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate PointAnnotation.\n   */\n  public var isDraggable: Boolean by mutableStateOf(false)\n\n  /**\n   * Set onClick Callback to be invoked when the [PointAnnotation] is clicked. The clicked [PointAnnotation] will be passed as parameter.\n   * Returns reference to [PointAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onClicked(onClick: (PointAnnotation) -> Boolean): PointAnnotationGroupInteractionsState =\n    apply {\n      onClicked = onClick\n    }\n\n  /**\n   * Set onLongClick Callback to be invoked when one of the [PointAnnotation] is long clicked. The long clicked [PointAnnotation] will be passed as parameter.\n   * Returns reference to [PointAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onLongClicked(onLongClick: (PointAnnotation) -> Boolean): PointAnnotationGroupInteractionsState =\n    apply {\n      onLongClicked = onLongClick\n    }\n\n  /**\n   * Set onClusterClick Callback to be invoked when one of the clusters is clicked. The clicked cluster represented by a [Feature] wrapped with [ClusterFeature] with additional properties.\n   * Returns reference to [PointAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onClusterClicked(onClusterClick: (ClusterFeature) -> Boolean): PointAnnotationGroupInteractionsState =\n    apply {\n      onClusterClicked = onClusterClick\n    }\n\n  /**\n   * Set onClusterLongClick Callback to be invoked when one of the clusters is long clicked. The clicked cluster represented by a [Feature] wrapped with [ClusterFeature] with additional properties.\n   * Returns reference to [PointAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onClusterLongClicked(onClusterLongClick: (ClusterFeature) -> Boolean): PointAnnotationGroupInteractionsState =\n    apply {\n      onClusterLongClicked = onClusterLongClick\n    }\n\n  /**\n   *  Set onDragStart Callback to be invoked when one of the [PointAnnotation] dragging has started. The dragged [PointAnnotation] will be passed as parameter.\n   */\n  public fun onDragStarted(onDragStart: (PointAnnotation) -> Unit): PointAnnotationGroupInteractionsState =\n    apply {\n      onDragStarted = onDragStart\n    }\n\n  /**\n   *  Set onDrag Callback to be invoked when one of the [PointAnnotation] dragging is in progress. The dragged [PointAnnotation] will be passed as parameter.\n   */\n  public fun onDragged(onDrag: (PointAnnotation) -> Unit): PointAnnotationGroupInteractionsState =\n    apply {\n      onDragged = onDrag\n    }\n\n  /**\n   *  Set onDragFinish Callback to be invoked when one of the [PointAnnotation] dragging has finished. The dragged [PointAnnotation] will be passed as parameter.\n   */\n  public fun onDragFinished(onDragFinish: (PointAnnotation) -> Unit): PointAnnotationGroupInteractionsState =\n    apply {\n      onDragFinished = onDragFinish\n    }\n\n  @Composable\n  internal fun BindTo(annotationManager: PointAnnotationManager) {\n    DisposableEffect(key1 = onClicked) {\n      onClicked?.let {\n        annotationManager.addClickListener(onClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClickListener(onClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onLongClicked) {\n      onLongClicked?.let {\n        annotationManager.addLongClickListener(onLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeLongClickListener(onLongClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onDragStarted, onDragged, onDragFinished) {\n      if (onDragStarted != null || onDragged != null || onDragFinished != null) {\n        annotationManager.addDragListener(onDragListener)\n      }\n      onDispose {\n        annotationManager.removeDragListener(onDragListener)\n      }\n    }\n    DisposableEffect(key1 = onClusterClicked) {\n      onClusterClicked.let {\n        annotationManager.addClusterClickListener(onClusterClickedListener)\n      }\n      onDispose {\n          annotationManager.removeClusterClickListener(onClusterClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onClusterLongClicked) {\n      onClusterLongClicked.let {\n        annotationManager.addClusterLongClickListener(onClusterLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClusterLongClickListener(onClusterLongClickedListener)\n      }\n    }\n  }\n}\n\n/**\n * Create and remember a [PointAnnotationGroupInteractionsState] with init block.\n *\n * @param init the initialization block to be applied to the [PointAnnotationGroupInteractionsState] after created and remembered.\n *\n * @return a [PointAnnotationGroupInteractionsState]\n */\n@Composable\npublic inline fun rememberPointAnnotationGroupInteractionsState(crossinline init: PointAnnotationGroupInteractionsState.() -> Unit = {}): PointAnnotationGroupInteractionsState {\n  return remember {\n    PointAnnotationGroupInteractionsState()\n  }.apply(init)\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationGroupState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.annotation.IconImage\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode\nimport com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference\nimport com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement\nimport com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextJustify\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextTransform\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\n\n/**\n * The state holder for [PointAnnotationGroup] properties.\n */\n@Stable\npublic class PointAnnotationGroupState private constructor(\n  initialIconAllowOverlap: Boolean?,\n  initialIconAnchor: IconAnchor?,\n  initialIconIgnorePlacement: Boolean?,\n  initialIconImage: IconImage?,\n  initialIconKeepUpright: Boolean?,\n  initialIconOffset: List<Double>?,\n  initialIconOptional: Boolean?,\n  initialIconPadding: Double?,\n  initialIconPitchAlignment: IconPitchAlignment?,\n  initialIconRotate: Double?,\n  initialIconRotationAlignment: IconRotationAlignment?,\n  initialIconSize: Double?,\n  initialIconSizeScaleRange: List<Double>?,\n  initialIconTextFit: IconTextFit?,\n  initialIconTextFitPadding: List<Double>?,\n  initialSymbolAvoidEdges: Boolean?,\n  initialSymbolElevationReference: SymbolElevationReference?,\n  initialSymbolPlacement: SymbolPlacement?,\n  initialSymbolSortKey: Double?,\n  initialSymbolSpacing: Double?,\n  initialSymbolZElevate: Boolean?,\n  initialSymbolZOrder: SymbolZOrder?,\n  initialTextAllowOverlap: Boolean?,\n  initialTextAnchor: TextAnchor?,\n  initialTextField: String?,\n  initialTextFont: List<String>?,\n  initialTextIgnorePlacement: Boolean?,\n  initialTextJustify: TextJustify?,\n  initialTextKeepUpright: Boolean?,\n  initialTextLetterSpacing: Double?,\n  initialTextLineHeight: Double?,\n  initialTextMaxAngle: Double?,\n  initialTextMaxWidth: Double?,\n  initialTextOffset: List<Double>?,\n  initialTextOptional: Boolean?,\n  initialTextPadding: Double?,\n  initialTextPitchAlignment: TextPitchAlignment?,\n  initialTextRadialOffset: Double?,\n  initialTextRotate: Double?,\n  initialTextRotationAlignment: TextRotationAlignment?,\n  initialTextSize: Double?,\n  initialTextSizeScaleRange: List<Double>?,\n  initialTextTransform: TextTransform?,\n  initialTextVariableAnchor: List<String>?,\n  initialTextWritingMode: List<String>?,\n  initialIconColor: Color?,\n  initialIconColorBrightnessMax: Double?,\n  initialIconColorBrightnessMin: Double?,\n  initialIconColorContrast: Double?,\n  initialIconColorSaturation: Double?,\n  initialIconEmissiveStrength: Double?,\n  initialIconHaloBlur: Double?,\n  initialIconHaloColor: Color?,\n  initialIconHaloWidth: Double?,\n  initialIconImageCrossFade: Double?,\n  initialIconOcclusionOpacity: Double?,\n  initialIconOpacity: Double?,\n  initialIconTranslate: List<Double>?,\n  initialIconTranslateAnchor: IconTranslateAnchor?,\n  initialOcclusionOpacityMode: OcclusionOpacityMode?,\n  initialSymbolZOffset: Double?,\n  initialTextColor: Color?,\n  initialTextEmissiveStrength: Double?,\n  initialTextHaloBlur: Double?,\n  initialTextHaloColor: Color?,\n  initialTextHaloWidth: Double?,\n  initialTextOcclusionOpacity: Double?,\n  initialTextOpacity: Double?,\n  initialTextTranslate: List<Double>?,\n  initialTextTranslateAnchor: TextTranslateAnchor?,\n  initialMaxZoom: Double?,\n  initialMinZoom: Double?,\n  initialIconColorUseTheme: String?,\n  initialIconHaloColorUseTheme: String?,\n  initialTextColorUseTheme: String?,\n  initialTextHaloColorUseTheme: String?,\n  initialPointAnnotationGroupInteractionsState: PointAnnotationGroupInteractionsState,\n) {\n  public constructor() : this(\n    initialIconAllowOverlap = null,\n    initialIconAnchor = null,\n    initialIconIgnorePlacement = null,\n    initialIconImage = null,\n    initialIconKeepUpright = null,\n    initialIconOffset = null,\n    initialIconOptional = null,\n    initialIconPadding = null,\n    initialIconPitchAlignment = null,\n    initialIconRotate = null,\n    initialIconRotationAlignment = null,\n    initialIconSize = null,\n    initialIconSizeScaleRange = null,\n    initialIconTextFit = null,\n    initialIconTextFitPadding = null,\n    initialSymbolAvoidEdges = null,\n    initialSymbolElevationReference = null,\n    initialSymbolPlacement = null,\n    initialSymbolSortKey = null,\n    initialSymbolSpacing = null,\n    initialSymbolZElevate = null,\n    initialSymbolZOrder = null,\n    initialTextAllowOverlap = null,\n    initialTextAnchor = null,\n    initialTextField = null,\n    initialTextFont = null,\n    initialTextIgnorePlacement = null,\n    initialTextJustify = null,\n    initialTextKeepUpright = null,\n    initialTextLetterSpacing = null,\n    initialTextLineHeight = null,\n    initialTextMaxAngle = null,\n    initialTextMaxWidth = null,\n    initialTextOffset = null,\n    initialTextOptional = null,\n    initialTextPadding = null,\n    initialTextPitchAlignment = null,\n    initialTextRadialOffset = null,\n    initialTextRotate = null,\n    initialTextRotationAlignment = null,\n    initialTextSize = null,\n    initialTextSizeScaleRange = null,\n    initialTextTransform = null,\n    initialTextVariableAnchor = null,\n    initialTextWritingMode = null,\n    initialIconColor = null,\n    initialIconColorBrightnessMax = null,\n    initialIconColorBrightnessMin = null,\n    initialIconColorContrast = null,\n    initialIconColorSaturation = null,\n    initialIconEmissiveStrength = null,\n    initialIconHaloBlur = null,\n    initialIconHaloColor = null,\n    initialIconHaloWidth = null,\n    initialIconImageCrossFade = null,\n    initialIconOcclusionOpacity = null,\n    initialIconOpacity = null,\n    initialIconTranslate = null,\n    initialIconTranslateAnchor = null,\n    initialOcclusionOpacityMode = null,\n    initialSymbolZOffset = null,\n    initialTextColor = null,\n    initialTextEmissiveStrength = null,\n    initialTextHaloBlur = null,\n    initialTextHaloColor = null,\n    initialTextHaloWidth = null,\n    initialTextOcclusionOpacity = null,\n    initialTextOpacity = null,\n    initialTextTranslate = null,\n    initialTextTranslateAnchor = null,\n    initialMaxZoom = null,\n    initialMinZoom = null,\n    initialIconColorUseTheme = null,\n    initialIconHaloColorUseTheme = null,\n    initialTextColorUseTheme = null,\n    initialTextHaloColorUseTheme = null,\n    initialPointAnnotationGroupInteractionsState = PointAnnotationGroupInteractionsState(),\n  )\n\n  /**\n   * Holds all interactions with [PointAnnotationGroup]\n   */\n  public var interactionsState: PointAnnotationGroupInteractionsState by mutableStateOf(initialPointAnnotationGroupInteractionsState)\n  /**\n   * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n   */\n  public var iconAllowOverlap: Boolean? by mutableStateOf(initialIconAllowOverlap)\n  /**\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   */\n  public var iconAnchor: IconAnchor? by mutableStateOf(initialIconAnchor)\n  /**\n   * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n   */\n  public var iconIgnorePlacement: Boolean? by mutableStateOf(initialIconIgnorePlacement)\n  /**\n   * Name of image in sprite to use for drawing an image background.\n   */\n  public var iconImage: IconImage? by mutableStateOf(initialIconImage)\n  /**\n   * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n   */\n  public var iconKeepUpright: Boolean? by mutableStateOf(initialIconKeepUpright)\n  /**\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   */\n  public var iconOffset: List<Double>? by mutableStateOf(initialIconOffset)\n  /**\n   * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n   */\n  public var iconOptional: Boolean? by mutableStateOf(initialIconOptional)\n  /**\n   * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n   */\n  public var iconPadding: Double? by mutableStateOf(initialIconPadding)\n  /**\n   * Orientation of icon when map is pitched. Default value: \"auto\".\n   */\n  public var iconPitchAlignment: IconPitchAlignment? by mutableStateOf(initialIconPitchAlignment)\n  /**\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   */\n  public var iconRotate: Double? by mutableStateOf(initialIconRotate)\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n   */\n  public var iconRotationAlignment: IconRotationAlignment? by mutableStateOf(initialIconRotationAlignment)\n  /**\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   */\n  public var iconSize: Double? by mutableStateOf(initialIconSize)\n  /**\n   * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   */\n  @MapboxExperimental\n  public var iconSizeScaleRange: List<Double>? by mutableStateOf(initialIconSizeScaleRange)\n  /**\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   */\n  public var iconTextFit: IconTextFit? by mutableStateOf(initialIconTextFit)\n  /**\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   */\n  public var iconTextFitPadding: List<Double>? by mutableStateOf(initialIconTextFitPadding)\n  /**\n   * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n   */\n  public var symbolAvoidEdges: Boolean? by mutableStateOf(initialSymbolAvoidEdges)\n  /**\n   * Selects the base of symbol-elevation. Default value: \"ground\".\n   */\n  @MapboxExperimental\n  public var symbolElevationReference: SymbolElevationReference? by mutableStateOf(initialSymbolElevationReference)\n  /**\n   * Label placement relative to its geometry. Default value: \"point\".\n   */\n  public var symbolPlacement: SymbolPlacement? by mutableStateOf(initialSymbolPlacement)\n  /**\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   */\n  public var symbolSortKey: Double? by mutableStateOf(initialSymbolSortKey)\n  /**\n   * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n   */\n  public var symbolSpacing: Double? by mutableStateOf(initialSymbolSpacing)\n  /**\n   * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n   */\n  public var symbolZElevate: Boolean? by mutableStateOf(initialSymbolZElevate)\n  /**\n   * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n   */\n  public var symbolZOrder: SymbolZOrder? by mutableStateOf(initialSymbolZOrder)\n  /**\n   * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n   */\n  public var textAllowOverlap: Boolean? by mutableStateOf(initialTextAllowOverlap)\n  /**\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   */\n  public var textAnchor: TextAnchor? by mutableStateOf(initialTextAnchor)\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   */\n  public var textField: String? by mutableStateOf(initialTextField)\n  /**\n   * Font stack to use for displaying text.\n   */\n  public var textFont: List<String>? by mutableStateOf(initialTextFont)\n  /**\n   * If true, other symbols can be visible even if they collide with the text. Default value: false.\n   */\n  public var textIgnorePlacement: Boolean? by mutableStateOf(initialTextIgnorePlacement)\n  /**\n   * Text justification options. Default value: \"center\".\n   */\n  public var textJustify: TextJustify? by mutableStateOf(initialTextJustify)\n  /**\n   * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n   */\n  public var textKeepUpright: Boolean? by mutableStateOf(initialTextKeepUpright)\n  /**\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   */\n  public var textLetterSpacing: Double? by mutableStateOf(initialTextLetterSpacing)\n  /**\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   */\n  public var textLineHeight: Double? by mutableStateOf(initialTextLineHeight)\n  /**\n   * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n   */\n  public var textMaxAngle: Double? by mutableStateOf(initialTextMaxAngle)\n  /**\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   */\n  public var textMaxWidth: Double? by mutableStateOf(initialTextMaxWidth)\n  /**\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   */\n  public var textOffset: List<Double>? by mutableStateOf(initialTextOffset)\n  /**\n   * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n   */\n  public var textOptional: Boolean? by mutableStateOf(initialTextOptional)\n  /**\n   * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n   */\n  public var textPadding: Double? by mutableStateOf(initialTextPadding)\n  /**\n   * Orientation of text when map is pitched. Default value: \"auto\".\n   */\n  public var textPitchAlignment: TextPitchAlignment? by mutableStateOf(initialTextPitchAlignment)\n  /**\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   */\n  public var textRadialOffset: Double? by mutableStateOf(initialTextRadialOffset)\n  /**\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   */\n  public var textRotate: Double? by mutableStateOf(initialTextRotate)\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n   */\n  public var textRotationAlignment: TextRotationAlignment? by mutableStateOf(initialTextRotationAlignment)\n  /**\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   */\n  public var textSize: Double? by mutableStateOf(initialTextSize)\n  /**\n   * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   */\n  @MapboxExperimental\n  public var textSizeScaleRange: List<Double>? by mutableStateOf(initialTextSizeScaleRange)\n  /**\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   */\n  public var textTransform: TextTransform? by mutableStateOf(initialTextTransform)\n  /**\n   * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n   */\n  public var textVariableAnchor: List<String>? by mutableStateOf(initialTextVariableAnchor)\n  /**\n   * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n   */\n  public var textWritingMode: List<String>? by mutableStateOf(initialTextWritingMode)\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  public var iconColor: Color? by mutableStateOf(initialIconColor)\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   */\n  public var iconColorBrightnessMax: Double? by mutableStateOf(initialIconColorBrightnessMax)\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   */\n  public var iconColorBrightnessMin: Double? by mutableStateOf(initialIconColorBrightnessMin)\n  /**\n   * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n   */\n  public var iconColorContrast: Double? by mutableStateOf(initialIconColorContrast)\n  /**\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   */\n  public var iconColorSaturation: Double? by mutableStateOf(initialIconColorSaturation)\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   */\n  public var iconEmissiveStrength: Double? by mutableStateOf(initialIconEmissiveStrength)\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   */\n  public var iconHaloBlur: Double? by mutableStateOf(initialIconHaloBlur)\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  public var iconHaloColor: Color? by mutableStateOf(initialIconHaloColor)\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   */\n  public var iconHaloWidth: Double? by mutableStateOf(initialIconHaloWidth)\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  public var iconImageCrossFade: Double? by mutableStateOf(initialIconImageCrossFade)\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  public var iconOcclusionOpacity: Double? by mutableStateOf(initialIconOcclusionOpacity)\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var iconOpacity: Double? by mutableStateOf(initialIconOpacity)\n  /**\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   */\n  public var iconTranslate: List<Double>? by mutableStateOf(initialIconTranslate)\n  /**\n   * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n   */\n  public var iconTranslateAnchor: IconTranslateAnchor? by mutableStateOf(initialIconTranslateAnchor)\n  /**\n   * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n   */\n  public var occlusionOpacityMode: OcclusionOpacityMode? by mutableStateOf(initialOcclusionOpacityMode)\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var symbolZOffset: Double? by mutableStateOf(initialSymbolZOffset)\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  public var textColor: Color? by mutableStateOf(initialTextColor)\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   */\n  public var textEmissiveStrength: Double? by mutableStateOf(initialTextEmissiveStrength)\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   */\n  public var textHaloBlur: Double? by mutableStateOf(initialTextHaloBlur)\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  public var textHaloColor: Color? by mutableStateOf(initialTextHaloColor)\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   */\n  public var textHaloWidth: Double? by mutableStateOf(initialTextHaloWidth)\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  public var textOcclusionOpacity: Double? by mutableStateOf(initialTextOcclusionOpacity)\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var textOpacity: Double? by mutableStateOf(initialTextOpacity)\n  /**\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   */\n  public var textTranslate: List<Double>? by mutableStateOf(initialTextTranslate)\n  /**\n   * Controls the frame of reference for `text-translate`. Default value: \"map\".\n   */\n  public var textTranslateAnchor: TextTranslateAnchor? by mutableStateOf(initialTextTranslateAnchor)\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: Double? by mutableStateOf(initialMaxZoom)\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: Double? by mutableStateOf(initialMinZoom)\n  /**\n   * This property defines whether the `iconColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var iconColorUseTheme: String? by mutableStateOf(initialIconColorUseTheme)\n  /**\n   * This property defines whether the `iconHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var iconHaloColorUseTheme: String? by mutableStateOf(initialIconHaloColorUseTheme)\n  /**\n   * This property defines whether the `textColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var textColorUseTheme: String? by mutableStateOf(initialTextColorUseTheme)\n  /**\n   * This property defines whether the `textHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var textHaloColorUseTheme: String? by mutableStateOf(initialTextHaloColorUseTheme)\n\n  @Composable\n  private fun UpdateIconAllowOverlap(annotationManager: PointAnnotationManager) {\n    annotationManager.iconAllowOverlap = iconAllowOverlap\n  }\n  @Composable\n  private fun UpdateIconAnchor(annotationManager: PointAnnotationManager) {\n    annotationManager.iconAnchor = iconAnchor\n  }\n  @Composable\n  private fun UpdateIconIgnorePlacement(annotationManager: PointAnnotationManager) {\n    annotationManager.iconIgnorePlacement = iconIgnorePlacement\n  }\n  @Composable\n  private fun UpdateIconImage(annotationManager: PointAnnotationManager) {\n    iconImage?.let { iconImage ->\n    iconImage.bitmap?.let {\n      annotationManager.iconImageBitmap = it\n    }\n    iconImage.imageId?.let {\n      annotationManager.iconImage = it\n    }\n  }\n  }\n  @Composable\n  private fun UpdateIconKeepUpright(annotationManager: PointAnnotationManager) {\n    annotationManager.iconKeepUpright = iconKeepUpright\n  }\n  @Composable\n  private fun UpdateIconOffset(annotationManager: PointAnnotationManager) {\n    annotationManager.iconOffset = iconOffset\n  }\n  @Composable\n  private fun UpdateIconOptional(annotationManager: PointAnnotationManager) {\n    annotationManager.iconOptional = iconOptional\n  }\n  @Composable\n  private fun UpdateIconPadding(annotationManager: PointAnnotationManager) {\n    annotationManager.iconPadding = iconPadding\n  }\n  @Composable\n  private fun UpdateIconPitchAlignment(annotationManager: PointAnnotationManager) {\n    annotationManager.iconPitchAlignment = iconPitchAlignment\n  }\n  @Composable\n  private fun UpdateIconRotate(annotationManager: PointAnnotationManager) {\n    annotationManager.iconRotate = iconRotate\n  }\n  @Composable\n  private fun UpdateIconRotationAlignment(annotationManager: PointAnnotationManager) {\n    annotationManager.iconRotationAlignment = iconRotationAlignment\n  }\n  @Composable\n  private fun UpdateIconSize(annotationManager: PointAnnotationManager) {\n    annotationManager.iconSize = iconSize\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateIconSizeScaleRange(annotationManager: PointAnnotationManager) {\n    annotationManager.iconSizeScaleRange = iconSizeScaleRange\n  }\n  @Composable\n  private fun UpdateIconTextFit(annotationManager: PointAnnotationManager) {\n    annotationManager.iconTextFit = iconTextFit\n  }\n  @Composable\n  private fun UpdateIconTextFitPadding(annotationManager: PointAnnotationManager) {\n    annotationManager.iconTextFitPadding = iconTextFitPadding\n  }\n  @Composable\n  private fun UpdateSymbolAvoidEdges(annotationManager: PointAnnotationManager) {\n    annotationManager.symbolAvoidEdges = symbolAvoidEdges\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateSymbolElevationReference(annotationManager: PointAnnotationManager) {\n    annotationManager.symbolElevationReference = symbolElevationReference\n  }\n  @Composable\n  private fun UpdateSymbolPlacement(annotationManager: PointAnnotationManager) {\n    annotationManager.symbolPlacement = symbolPlacement\n  }\n  @Composable\n  private fun UpdateSymbolSortKey(annotationManager: PointAnnotationManager) {\n    annotationManager.symbolSortKey = symbolSortKey\n  }\n  @Composable\n  private fun UpdateSymbolSpacing(annotationManager: PointAnnotationManager) {\n    annotationManager.symbolSpacing = symbolSpacing\n  }\n  @Composable\n  private fun UpdateSymbolZElevate(annotationManager: PointAnnotationManager) {\n    annotationManager.symbolZElevate = symbolZElevate\n  }\n  @Composable\n  private fun UpdateSymbolZOrder(annotationManager: PointAnnotationManager) {\n    annotationManager.symbolZOrder = symbolZOrder\n  }\n  @Composable\n  private fun UpdateTextAllowOverlap(annotationManager: PointAnnotationManager) {\n    annotationManager.textAllowOverlap = textAllowOverlap\n  }\n  @Composable\n  private fun UpdateTextAnchor(annotationManager: PointAnnotationManager) {\n    annotationManager.textAnchor = textAnchor\n  }\n  @Composable\n  private fun UpdateTextField(annotationManager: PointAnnotationManager) {\n    annotationManager.textField = textField\n  }\n  @Composable\n  private fun UpdateTextFont(annotationManager: PointAnnotationManager) {\n    annotationManager.textFont = textFont\n  }\n  @Composable\n  private fun UpdateTextIgnorePlacement(annotationManager: PointAnnotationManager) {\n    annotationManager.textIgnorePlacement = textIgnorePlacement\n  }\n  @Composable\n  private fun UpdateTextJustify(annotationManager: PointAnnotationManager) {\n    annotationManager.textJustify = textJustify\n  }\n  @Composable\n  private fun UpdateTextKeepUpright(annotationManager: PointAnnotationManager) {\n    annotationManager.textKeepUpright = textKeepUpright\n  }\n  @Composable\n  private fun UpdateTextLetterSpacing(annotationManager: PointAnnotationManager) {\n    annotationManager.textLetterSpacing = textLetterSpacing\n  }\n  @Composable\n  private fun UpdateTextLineHeight(annotationManager: PointAnnotationManager) {\n    annotationManager.textLineHeight = textLineHeight\n  }\n  @Composable\n  private fun UpdateTextMaxAngle(annotationManager: PointAnnotationManager) {\n    annotationManager.textMaxAngle = textMaxAngle\n  }\n  @Composable\n  private fun UpdateTextMaxWidth(annotationManager: PointAnnotationManager) {\n    annotationManager.textMaxWidth = textMaxWidth\n  }\n  @Composable\n  private fun UpdateTextOffset(annotationManager: PointAnnotationManager) {\n    annotationManager.textOffset = textOffset\n  }\n  @Composable\n  private fun UpdateTextOptional(annotationManager: PointAnnotationManager) {\n    annotationManager.textOptional = textOptional\n  }\n  @Composable\n  private fun UpdateTextPadding(annotationManager: PointAnnotationManager) {\n    annotationManager.textPadding = textPadding\n  }\n  @Composable\n  private fun UpdateTextPitchAlignment(annotationManager: PointAnnotationManager) {\n    annotationManager.textPitchAlignment = textPitchAlignment\n  }\n  @Composable\n  private fun UpdateTextRadialOffset(annotationManager: PointAnnotationManager) {\n    annotationManager.textRadialOffset = textRadialOffset\n  }\n  @Composable\n  private fun UpdateTextRotate(annotationManager: PointAnnotationManager) {\n    annotationManager.textRotate = textRotate\n  }\n  @Composable\n  private fun UpdateTextRotationAlignment(annotationManager: PointAnnotationManager) {\n    annotationManager.textRotationAlignment = textRotationAlignment\n  }\n  @Composable\n  private fun UpdateTextSize(annotationManager: PointAnnotationManager) {\n    annotationManager.textSize = textSize\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateTextSizeScaleRange(annotationManager: PointAnnotationManager) {\n    annotationManager.textSizeScaleRange = textSizeScaleRange\n  }\n  @Composable\n  private fun UpdateTextTransform(annotationManager: PointAnnotationManager) {\n    annotationManager.textTransform = textTransform\n  }\n  @Composable\n  private fun UpdateTextVariableAnchor(annotationManager: PointAnnotationManager) {\n    annotationManager.textVariableAnchor = textVariableAnchor\n  }\n  @Composable\n  private fun UpdateTextWritingMode(annotationManager: PointAnnotationManager) {\n    annotationManager.textWritingMode = textWritingMode\n  }\n  @Composable\n  private fun UpdateIconColor(annotationManager: PointAnnotationManager) {\n    annotationManager.iconColorString = iconColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateIconColorBrightnessMax(annotationManager: PointAnnotationManager) {\n    annotationManager.iconColorBrightnessMax = iconColorBrightnessMax\n  }\n  @Composable\n  private fun UpdateIconColorBrightnessMin(annotationManager: PointAnnotationManager) {\n    annotationManager.iconColorBrightnessMin = iconColorBrightnessMin\n  }\n  @Composable\n  private fun UpdateIconColorContrast(annotationManager: PointAnnotationManager) {\n    annotationManager.iconColorContrast = iconColorContrast\n  }\n  @Composable\n  private fun UpdateIconColorSaturation(annotationManager: PointAnnotationManager) {\n    annotationManager.iconColorSaturation = iconColorSaturation\n  }\n  @Composable\n  private fun UpdateIconEmissiveStrength(annotationManager: PointAnnotationManager) {\n    annotationManager.iconEmissiveStrength = iconEmissiveStrength\n  }\n  @Composable\n  private fun UpdateIconHaloBlur(annotationManager: PointAnnotationManager) {\n    annotationManager.iconHaloBlur = iconHaloBlur\n  }\n  @Composable\n  private fun UpdateIconHaloColor(annotationManager: PointAnnotationManager) {\n    annotationManager.iconHaloColorString = iconHaloColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateIconHaloWidth(annotationManager: PointAnnotationManager) {\n    annotationManager.iconHaloWidth = iconHaloWidth\n  }\n  @Composable\n  private fun UpdateIconImageCrossFade(annotationManager: PointAnnotationManager) {\n    annotationManager.iconImageCrossFade = iconImageCrossFade\n  }\n  @Composable\n  private fun UpdateIconOcclusionOpacity(annotationManager: PointAnnotationManager) {\n    annotationManager.iconOcclusionOpacity = iconOcclusionOpacity\n  }\n  @Composable\n  private fun UpdateIconOpacity(annotationManager: PointAnnotationManager) {\n    annotationManager.iconOpacity = iconOpacity\n  }\n  @Composable\n  private fun UpdateIconTranslate(annotationManager: PointAnnotationManager) {\n    annotationManager.iconTranslate = iconTranslate\n  }\n  @Composable\n  private fun UpdateIconTranslateAnchor(annotationManager: PointAnnotationManager) {\n    annotationManager.iconTranslateAnchor = iconTranslateAnchor\n  }\n  @Composable\n  private fun UpdateOcclusionOpacityMode(annotationManager: PointAnnotationManager) {\n    annotationManager.occlusionOpacityMode = occlusionOpacityMode\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateSymbolZOffset(annotationManager: PointAnnotationManager) {\n    annotationManager.symbolZOffset = symbolZOffset\n  }\n  @Composable\n  private fun UpdateTextColor(annotationManager: PointAnnotationManager) {\n    annotationManager.textColorString = textColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateTextEmissiveStrength(annotationManager: PointAnnotationManager) {\n    annotationManager.textEmissiveStrength = textEmissiveStrength\n  }\n  @Composable\n  private fun UpdateTextHaloBlur(annotationManager: PointAnnotationManager) {\n    annotationManager.textHaloBlur = textHaloBlur\n  }\n  @Composable\n  private fun UpdateTextHaloColor(annotationManager: PointAnnotationManager) {\n    annotationManager.textHaloColorString = textHaloColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateTextHaloWidth(annotationManager: PointAnnotationManager) {\n    annotationManager.textHaloWidth = textHaloWidth\n  }\n  @Composable\n  private fun UpdateTextOcclusionOpacity(annotationManager: PointAnnotationManager) {\n    annotationManager.textOcclusionOpacity = textOcclusionOpacity\n  }\n  @Composable\n  private fun UpdateTextOpacity(annotationManager: PointAnnotationManager) {\n    annotationManager.textOpacity = textOpacity\n  }\n  @Composable\n  private fun UpdateTextTranslate(annotationManager: PointAnnotationManager) {\n    annotationManager.textTranslate = textTranslate\n  }\n  @Composable\n  private fun UpdateTextTranslateAnchor(annotationManager: PointAnnotationManager) {\n    annotationManager.textTranslateAnchor = textTranslateAnchor\n  }\n  @Composable\n  private fun UpdateMaxZoom(annotationManager: PointAnnotationManager) {\n    annotationManager.maxZoom = maxZoom\n  }\n  @Composable\n  private fun UpdateMinZoom(annotationManager: PointAnnotationManager) {\n    annotationManager.minZoom = minZoom\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateIconColorUseTheme(annotationManager: PointAnnotationManager) {\n    annotationManager.iconColorUseTheme = iconColorUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateIconHaloColorUseTheme(annotationManager: PointAnnotationManager) {\n    annotationManager.iconHaloColorUseTheme = iconHaloColorUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateTextColorUseTheme(annotationManager: PointAnnotationManager) {\n    annotationManager.textColorUseTheme = textColorUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateTextHaloColorUseTheme(annotationManager: PointAnnotationManager) {\n    annotationManager.textHaloColorUseTheme = textHaloColorUseTheme\n  }\n\n  @Composable\n  internal fun UpdateProperties(annotationManager: PointAnnotationManager) {\n    UpdateIconAllowOverlap(annotationManager)\n    UpdateIconAnchor(annotationManager)\n    UpdateIconIgnorePlacement(annotationManager)\n    UpdateIconImage(annotationManager)\n    UpdateIconKeepUpright(annotationManager)\n    UpdateIconOffset(annotationManager)\n    UpdateIconOptional(annotationManager)\n    UpdateIconPadding(annotationManager)\n    UpdateIconPitchAlignment(annotationManager)\n    UpdateIconRotate(annotationManager)\n    UpdateIconRotationAlignment(annotationManager)\n    UpdateIconSize(annotationManager)\n    UpdateIconSizeScaleRange(annotationManager)\n    UpdateIconTextFit(annotationManager)\n    UpdateIconTextFitPadding(annotationManager)\n    UpdateSymbolAvoidEdges(annotationManager)\n    UpdateSymbolElevationReference(annotationManager)\n    UpdateSymbolPlacement(annotationManager)\n    UpdateSymbolSortKey(annotationManager)\n    UpdateSymbolSpacing(annotationManager)\n    UpdateSymbolZElevate(annotationManager)\n    UpdateSymbolZOrder(annotationManager)\n    UpdateTextAllowOverlap(annotationManager)\n    UpdateTextAnchor(annotationManager)\n    UpdateTextField(annotationManager)\n    UpdateTextFont(annotationManager)\n    UpdateTextIgnorePlacement(annotationManager)\n    UpdateTextJustify(annotationManager)\n    UpdateTextKeepUpright(annotationManager)\n    UpdateTextLetterSpacing(annotationManager)\n    UpdateTextLineHeight(annotationManager)\n    UpdateTextMaxAngle(annotationManager)\n    UpdateTextMaxWidth(annotationManager)\n    UpdateTextOffset(annotationManager)\n    UpdateTextOptional(annotationManager)\n    UpdateTextPadding(annotationManager)\n    UpdateTextPitchAlignment(annotationManager)\n    UpdateTextRadialOffset(annotationManager)\n    UpdateTextRotate(annotationManager)\n    UpdateTextRotationAlignment(annotationManager)\n    UpdateTextSize(annotationManager)\n    UpdateTextSizeScaleRange(annotationManager)\n    UpdateTextTransform(annotationManager)\n    UpdateTextVariableAnchor(annotationManager)\n    UpdateTextWritingMode(annotationManager)\n    UpdateIconColor(annotationManager)\n    UpdateIconColorBrightnessMax(annotationManager)\n    UpdateIconColorBrightnessMin(annotationManager)\n    UpdateIconColorContrast(annotationManager)\n    UpdateIconColorSaturation(annotationManager)\n    UpdateIconEmissiveStrength(annotationManager)\n    UpdateIconHaloBlur(annotationManager)\n    UpdateIconHaloColor(annotationManager)\n    UpdateIconHaloWidth(annotationManager)\n    UpdateIconImageCrossFade(annotationManager)\n    UpdateIconOcclusionOpacity(annotationManager)\n    UpdateIconOpacity(annotationManager)\n    UpdateIconTranslate(annotationManager)\n    UpdateIconTranslateAnchor(annotationManager)\n    UpdateOcclusionOpacityMode(annotationManager)\n    UpdateSymbolZOffset(annotationManager)\n    UpdateTextColor(annotationManager)\n    UpdateTextEmissiveStrength(annotationManager)\n    UpdateTextHaloBlur(annotationManager)\n    UpdateTextHaloColor(annotationManager)\n    UpdateTextHaloWidth(annotationManager)\n    UpdateTextOcclusionOpacity(annotationManager)\n    UpdateTextOpacity(annotationManager)\n    UpdateTextTranslate(annotationManager)\n    UpdateTextTranslateAnchor(annotationManager)\n    UpdateMaxZoom(annotationManager)\n    UpdateMinZoom(annotationManager)\n    UpdateIconColorUseTheme(annotationManager)\n    UpdateIconHaloColorUseTheme(annotationManager)\n    UpdateTextColorUseTheme(annotationManager)\n    UpdateTextHaloColorUseTheme(annotationManager)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationInteractionsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\n\n/**\n * The state holder for Interactions of [PointAnnotation].\n */\n@Stable\npublic class PointAnnotationInteractionsState {\n\n  private val onClickedListener: OnPointAnnotationClickListener = OnPointAnnotationClickListener {\n    onClicked?.invoke(it) ?: false\n  }\n\n  private val onLongClickedListener: OnPointAnnotationLongClickListener =\n    OnPointAnnotationLongClickListener {\n      onLongClicked?.invoke(it) ?: false\n    }\n\n  private val onDragListener: OnPointAnnotationDragListener =\n      object : OnPointAnnotationDragListener {\n        override fun onAnnotationDragStarted(annotation: Annotation<*>) {\n          (annotation as? PointAnnotation)?.let {\n            onDragStarted?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDrag(annotation: Annotation<*>) {\n          (annotation as? PointAnnotation)?.let {\n            onDragged?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDragFinished(annotation: Annotation<*>) {\n          (annotation as? PointAnnotation)?.let {\n            onDragFinished?.invoke(it)\n          }\n        }\n      }\n\n  private var onClicked: ((PointAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onLongClicked: ((PointAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onDragStarted: ((PointAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragged: ((PointAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragFinished: ((PointAnnotation) -> Unit)? by mutableStateOf(null)\n\n  /**\n   * Set whether PointAnnotation holding this PointAnnotationInteractionsState should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when PointAnnotation is also part of the cluster, then once PointAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate PointAnnotation.\n   */\n  public var isDraggable: Boolean by mutableStateOf(false)\n\n  /**\n   * Set onClick Callback to be invoked when the [PointAnnotation] is clicked. The clicked [PointAnnotation] will be passed as parameter.\n   * Returns reference to [PointAnnotationInteractionsState] for making chained calls.\n   */\n  public fun onClicked(onClick: (PointAnnotation) -> Boolean): PointAnnotationInteractionsState =\n    apply {\n      onClicked = onClick\n    }\n\n  /**\n   * Set onLongClick Callback to be invoked when one of the [PointAnnotation] is long clicked. The long clicked [PointAnnotation] will be passed as parameter.\n   * Returns reference to [PointAnnotationInteractionsState] for making chained calls.\n   */\n  public fun onLongClicked(onLongClick: (PointAnnotation) -> Boolean): PointAnnotationInteractionsState =\n    apply {\n      onLongClicked = onLongClick\n    }\n\n  /**\n   *  Set onDragStart Callback to be invoked when one of the [PointAnnotation] dragging has started. The dragged [PointAnnotation] will be passed as parameter.\n   */\n  public fun onDragStarted(onDragStart: (PointAnnotation) -> Unit): PointAnnotationInteractionsState =\n    apply {\n      onDragStarted = onDragStart\n    }\n\n  /**\n   *  Set onDrag Callback to be invoked when one of the [PointAnnotation] dragging is in progress. The dragged [PointAnnotation] will be passed as parameter.\n   */\n  public fun onDragged(onDrag: (PointAnnotation) -> Unit): PointAnnotationInteractionsState =\n    apply {\n      onDragged = onDrag\n    }\n\n  /**\n   *  Set onDragFinish Callback to be invoked when one of the [PointAnnotation] dragging has finished. The dragged [PointAnnotation] will be passed as parameter.\n   */\n  public fun onDragFinished(onDragFinish: (PointAnnotation) -> Unit): PointAnnotationInteractionsState =\n    apply {\n      onDragFinished = onDragFinish\n    }\n\n  @Composable\n  internal fun BindTo(annotationManager: PointAnnotationManager) {\n    DisposableEffect(key1 = onClicked) {\n      onClicked?.let {\n        annotationManager.addClickListener(onClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClickListener(onClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onLongClicked) {\n      onLongClicked?.let {\n        annotationManager.addLongClickListener(onLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeLongClickListener(onLongClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onDragStarted, onDragged, onDragFinished) {\n      if (onDragStarted != null || onDragged != null || onDragFinished != null) {\n        annotationManager.addDragListener(onDragListener)\n      }\n      onDispose {\n        annotationManager.removeDragListener(onDragListener)\n      }\n    }\n  }\n}\n\n/**\n * Create and remember a [PointAnnotationInteractionsState] with init block.\n *\n * @param init the initialization block to be applied to the [PointAnnotationInteractionsState] after created and remembered.\n *\n * @return a [PointAnnotationInteractionsState]\n */\n@Composable\npublic inline fun rememberPointAnnotationInteractionsState(crossinline init: PointAnnotationInteractionsState.() -> Unit = {}): PointAnnotationInteractionsState {\n  return remember {\n    PointAnnotationInteractionsState()\n  }.apply(init)\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationOptionsExt.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\n\n/**\n * Set icon-color to initialise the pointAnnotation with.\n *\n * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n *\n * @param iconColor the icon-color value\n * @return this\n */\npublic fun PointAnnotationOptions.withIconColor(iconColor: Color): PointAnnotationOptions = apply {\n  withIconColor(iconColor.toArgb())\n}\n/**\n * Set icon-halo-color to initialise the pointAnnotation with.\n *\n * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n *\n * @param iconHaloColor the icon-halo-color value\n * @return this\n */\npublic fun PointAnnotationOptions.withIconHaloColor(iconHaloColor: Color): PointAnnotationOptions = apply {\n  withIconHaloColor(iconHaloColor.toArgb())\n}\n/**\n * Set text-color to initialise the pointAnnotation with.\n *\n * The color with which the text will be drawn. Default value: \"#000000\".\n *\n * @param textColor the text-color value\n * @return this\n */\npublic fun PointAnnotationOptions.withTextColor(textColor: Color): PointAnnotationOptions = apply {\n  withTextColor(textColor.toArgb())\n}\n/**\n * Set text-halo-color to initialise the pointAnnotation with.\n *\n * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n *\n * @param textHaloColor the text-halo-color value\n * @return this\n */\npublic fun PointAnnotationOptions.withTextHaloColor(textHaloColor: Color): PointAnnotationOptions = apply {\n  withTextHaloColor(textHaloColor.toArgb())\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PointAnnotationState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.annotation.IconImage\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.PointAnnotationNode\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextJustify\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextTransform\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\n\n/**\n * The state holder for [PointAnnotation] properties.\n */\n@Stable\npublic class PointAnnotationState private constructor(\n  initialIconAnchor: IconAnchor?,\n  initialIconImage: IconImage?,\n  initialIconOffset: List<Double>?,\n  initialIconRotate: Double?,\n  initialIconSize: Double?,\n  initialIconTextFit: IconTextFit?,\n  initialIconTextFitPadding: List<Double>?,\n  initialTextAnchor: TextAnchor?,\n  initialTextField: String?,\n  initialTextJustify: TextJustify?,\n  initialTextLetterSpacing: Double?,\n  initialTextLineHeight: Double?,\n  initialTextMaxWidth: Double?,\n  initialTextOffset: List<Double>?,\n  initialTextRadialOffset: Double?,\n  initialTextRotate: Double?,\n  initialTextSize: Double?,\n  initialTextTransform: TextTransform?,\n  initialIconColor: Color?,\n  initialIconEmissiveStrength: Double?,\n  initialIconHaloBlur: Double?,\n  initialIconHaloColor: Color?,\n  initialIconHaloWidth: Double?,\n  initialIconOcclusionOpacity: Double?,\n  initialIconOpacity: Double?,\n  initialSymbolZOffset: Double?,\n  initialTextColor: Color?,\n  initialTextEmissiveStrength: Double?,\n  initialTextHaloBlur: Double?,\n  initialTextHaloColor: Color?,\n  initialTextHaloWidth: Double?,\n  initialTextOcclusionOpacity: Double?,\n  initialTextOpacity: Double?,\n  initialIconColorUseTheme: String?,\n  initialIconHaloColorUseTheme: String?,\n  initialTextColorUseTheme: String?,\n  initialTextHaloColorUseTheme: String?,\n  initialIconImageCrossFade: Double?,\n  initialPointAnnotationInteractionsState: PointAnnotationInteractionsState,\n) {\n\n  public constructor() : this(\n    initialIconAnchor = null,\n    initialIconImage = null,\n    initialIconOffset = null,\n    initialIconRotate = null,\n    initialIconSize = null,\n    initialIconTextFit = null,\n    initialIconTextFitPadding = null,\n    initialTextAnchor = null,\n    initialTextField = null,\n    initialTextJustify = null,\n    initialTextLetterSpacing = null,\n    initialTextLineHeight = null,\n    initialTextMaxWidth = null,\n    initialTextOffset = null,\n    initialTextRadialOffset = null,\n    initialTextRotate = null,\n    initialTextSize = null,\n    initialTextTransform = null,\n    initialIconColor = null,\n    initialIconEmissiveStrength = null,\n    initialIconHaloBlur = null,\n    initialIconHaloColor = null,\n    initialIconHaloWidth = null,\n    initialIconOcclusionOpacity = null,\n    initialIconOpacity = null,\n    initialSymbolZOffset = null,\n    initialTextColor = null,\n    initialTextEmissiveStrength = null,\n    initialTextHaloBlur = null,\n    initialTextHaloColor = null,\n    initialTextHaloWidth = null,\n    initialTextOcclusionOpacity = null,\n    initialTextOpacity = null,\n    initialIconColorUseTheme = null,\n    initialIconHaloColorUseTheme = null,\n    initialTextColorUseTheme = null,\n    initialTextHaloColorUseTheme = null,\n  initialIconImageCrossFade = null,\n    initialPointAnnotationInteractionsState = PointAnnotationInteractionsState(),\n)\n\n  /**\n  * All interactions with [PointAnnotation]\n  */\n  public var interactionsState: PointAnnotationInteractionsState by mutableStateOf(initialPointAnnotationInteractionsState)\n  /**\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   */\n  public var iconAnchor: IconAnchor? by mutableStateOf(initialIconAnchor)\n  /**\n   * Name of image in sprite to use for drawing an image background.\n   */\n  public var iconImage: IconImage? by mutableStateOf(initialIconImage)\n  /**\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   */\n  public var iconOffset: List<Double>? by mutableStateOf(initialIconOffset)\n  /**\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   */\n  public var iconRotate: Double? by mutableStateOf(initialIconRotate)\n  /**\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   */\n  public var iconSize: Double? by mutableStateOf(initialIconSize)\n  /**\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   */\n  public var iconTextFit: IconTextFit? by mutableStateOf(initialIconTextFit)\n  /**\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   */\n  public var iconTextFitPadding: List<Double>? by mutableStateOf(initialIconTextFitPadding)\n  /**\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   */\n  public var textAnchor: TextAnchor? by mutableStateOf(initialTextAnchor)\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   */\n  public var textField: String? by mutableStateOf(initialTextField)\n  /**\n   * Text justification options. Default value: \"center\".\n   */\n  public var textJustify: TextJustify? by mutableStateOf(initialTextJustify)\n  /**\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   */\n  public var textLetterSpacing: Double? by mutableStateOf(initialTextLetterSpacing)\n  /**\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   */\n  public var textLineHeight: Double? by mutableStateOf(initialTextLineHeight)\n  /**\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   */\n  public var textMaxWidth: Double? by mutableStateOf(initialTextMaxWidth)\n  /**\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   */\n  public var textOffset: List<Double>? by mutableStateOf(initialTextOffset)\n  /**\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   */\n  public var textRadialOffset: Double? by mutableStateOf(initialTextRadialOffset)\n  /**\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   */\n  public var textRotate: Double? by mutableStateOf(initialTextRotate)\n  /**\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   */\n  public var textSize: Double? by mutableStateOf(initialTextSize)\n  /**\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   */\n  public var textTransform: TextTransform? by mutableStateOf(initialTextTransform)\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  public var iconColor: Color? by mutableStateOf(initialIconColor)\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   */\n  public var iconEmissiveStrength: Double? by mutableStateOf(initialIconEmissiveStrength)\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   */\n  public var iconHaloBlur: Double? by mutableStateOf(initialIconHaloBlur)\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  public var iconHaloColor: Color? by mutableStateOf(initialIconHaloColor)\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   */\n  public var iconHaloWidth: Double? by mutableStateOf(initialIconHaloWidth)\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  public var iconOcclusionOpacity: Double? by mutableStateOf(initialIconOcclusionOpacity)\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var iconOpacity: Double? by mutableStateOf(initialIconOpacity)\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var symbolZOffset: Double? by mutableStateOf(initialSymbolZOffset)\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  public var textColor: Color? by mutableStateOf(initialTextColor)\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   */\n  public var textEmissiveStrength: Double? by mutableStateOf(initialTextEmissiveStrength)\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   */\n  public var textHaloBlur: Double? by mutableStateOf(initialTextHaloBlur)\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  public var textHaloColor: Color? by mutableStateOf(initialTextHaloColor)\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   */\n  public var textHaloWidth: Double? by mutableStateOf(initialTextHaloWidth)\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  public var textOcclusionOpacity: Double? by mutableStateOf(initialTextOcclusionOpacity)\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var textOpacity: Double? by mutableStateOf(initialTextOpacity)\n  /**\n   * This property defines whether the `iconColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var iconColorUseTheme: String? by mutableStateOf(initialIconColorUseTheme)\n  /**\n   * This property defines whether the `iconHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var iconHaloColorUseTheme: String? by mutableStateOf(initialIconHaloColorUseTheme)\n  /**\n   * This property defines whether the `textColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var textColorUseTheme: String? by mutableStateOf(initialTextColorUseTheme)\n  /**\n   * This property defines whether the `textHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var textHaloColorUseTheme: String? by mutableStateOf(initialTextHaloColorUseTheme)\n\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. Default value: 0. Value range: [0, 1]\n   */\n  public var iconImageCrossFade: Double? by mutableStateOf(initialIconImageCrossFade)\n\n  @Composable\n  private fun UpdateIconAnchor(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconAnchor = iconAnchor\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconImage(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        iconImage?.let { iconImage ->\n          iconImage.bitmap?.let {\n            annotation.iconImageBitmap = it\n          }\n          iconImage.imageId?.let {\n            annotation.iconImage = it\n          }\n        }\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconOffset(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconOffset = iconOffset\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconRotate(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconRotate = iconRotate\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconSize(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconSize = iconSize\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconTextFit(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconTextFit = iconTextFit\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconTextFitPadding(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconTextFitPadding = iconTextFitPadding\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextAnchor(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textAnchor = textAnchor\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextField(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textField = textField\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextJustify(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textJustify = textJustify\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextLetterSpacing(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textLetterSpacing = textLetterSpacing\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextLineHeight(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textLineHeight = textLineHeight\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextMaxWidth(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textMaxWidth = textMaxWidth\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextOffset(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textOffset = textOffset\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextRadialOffset(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textRadialOffset = textRadialOffset\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextRotate(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textRotate = textRotate\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextSize(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textSize = textSize\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextTransform(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textTransform = textTransform\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconColor(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconColorInt = iconColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconEmissiveStrength(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconEmissiveStrength = iconEmissiveStrength\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconHaloBlur(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconHaloBlur = iconHaloBlur\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconHaloColor(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconHaloColorInt = iconHaloColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconHaloWidth(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconHaloWidth = iconHaloWidth\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconOcclusionOpacity(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconOcclusionOpacity = iconOcclusionOpacity\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconOpacity(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconOpacity = iconOpacity\n      }\n    )\n  }\n  @Composable\n  private fun UpdateSymbolZOffset(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.symbolZOffset = symbolZOffset\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextColor(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textColorInt = textColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextEmissiveStrength(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textEmissiveStrength = textEmissiveStrength\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextHaloBlur(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textHaloBlur = textHaloBlur\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextHaloColor(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textHaloColorInt = textHaloColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextHaloWidth(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textHaloWidth = textHaloWidth\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextOcclusionOpacity(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textOcclusionOpacity = textOcclusionOpacity\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextOpacity(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textOpacity = textOpacity\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconColorUseTheme(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconColorUseTheme = iconColorUseTheme\n      }\n    )\n  }\n  @Composable\n  private fun UpdateIconHaloColorUseTheme(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.iconHaloColorUseTheme = iconHaloColorUseTheme\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextColorUseTheme(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textColorUseTheme = textColorUseTheme\n      }\n    )\n  }\n  @Composable\n  private fun UpdateTextHaloColorUseTheme(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.textHaloColorUseTheme = textHaloColorUseTheme\n      }\n    )\n  }\n\n @Composable\n  private fun UpdateIconImageCrossFade(\n    annotationNode: PointAnnotationNode\n  ) {\n    annotationNode.annotationManager.iconImageCrossFade = iconImageCrossFade\n  }\n\n  @Composable\n  internal fun UpdateProperties(\n    annotationNode: PointAnnotationNode,\n  ) {\n    UpdateIconAnchor(annotationNode)\n    UpdateIconImage(annotationNode)\n    UpdateIconOffset(annotationNode)\n    UpdateIconRotate(annotationNode)\n    UpdateIconSize(annotationNode)\n    UpdateIconTextFit(annotationNode)\n    UpdateIconTextFitPadding(annotationNode)\n    UpdateTextAnchor(annotationNode)\n    UpdateTextField(annotationNode)\n    UpdateTextJustify(annotationNode)\n    UpdateTextLetterSpacing(annotationNode)\n    UpdateTextLineHeight(annotationNode)\n    UpdateTextMaxWidth(annotationNode)\n    UpdateTextOffset(annotationNode)\n    UpdateTextRadialOffset(annotationNode)\n    UpdateTextRotate(annotationNode)\n    UpdateTextSize(annotationNode)\n    UpdateTextTransform(annotationNode)\n    UpdateIconColor(annotationNode)\n    UpdateIconEmissiveStrength(annotationNode)\n    UpdateIconHaloBlur(annotationNode)\n    UpdateIconHaloColor(annotationNode)\n    UpdateIconHaloWidth(annotationNode)\n    UpdateIconOcclusionOpacity(annotationNode)\n    UpdateIconOpacity(annotationNode)\n    UpdateSymbolZOffset(annotationNode)\n    UpdateTextColor(annotationNode)\n    UpdateTextEmissiveStrength(annotationNode)\n    UpdateTextHaloBlur(annotationNode)\n    UpdateTextHaloColor(annotationNode)\n    UpdateTextHaloWidth(annotationNode)\n    UpdateTextOcclusionOpacity(annotationNode)\n    UpdateTextOpacity(annotationNode)\n    UpdateIconColorUseTheme(annotationNode)\n    UpdateIconHaloColorUseTheme(annotationNode)\n    UpdateTextColorUseTheme(annotationNode)\n    UpdateTextHaloColorUseTheme(annotationNode)\n    UpdateIconImageCrossFade(annotationNode)\n  }\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotation.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.PolygonAnnotationNode\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPolygonAnnotationManager\n\n/**\n * Composable function to add a [PolygonAnnotation] to the Map. For convenience, if there's\n * no need to hoist the [polygonAnnotationState], use `PolygonAnnotation(points, onClick, init)` with trailing lambda instead.\n *\n * @param points A list of lists of Point for the fill, which represents the locations of the fill on the map.\n * @param onClick Callback to be invoked when the [PolygonAnnotation] is clicked. The clicked [PolygonAnnotation] will be passed as parameter.\n * @param polygonAnnotationState The state holder for [PolygonAnnotation] properties.\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PolygonAnnotation(point, polygonAnnotationState)\"),\n  level = DeprecationLevel.WARNING\n)\npublic fun PolygonAnnotation(\n  points: List<List<Point>>,\n  onClick: (PolygonAnnotation) -> Boolean = { false },\n  polygonAnnotationState: PolygonAnnotationState = remember { PolygonAnnotationState() },\n) {\n  PolygonAnnotation(\n    points = points,\n    polygonAnnotationState = polygonAnnotationState.also {\n      it.interactionsState.onClicked(onClick = onClick)\n  }\n )\n}\n\n/**\n * Composable function to add a [PolygonAnnotation] to the Map. For convenience, if there's\n * no need to hoist the [polygonAnnotationState], use `PolygonAnnotation(points, init)` with trailing lambda instead.\n *\n * @param points A list of lists of Point for the fill, which represents the locations of the fill on the map.\n * @param polygonAnnotationState The state holder for [PolygonAnnotation] properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun PolygonAnnotation(\n  points: List<List<Point>>,\n  polygonAnnotationState: PolygonAnnotationState = remember { PolygonAnnotationState() },\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of PolygonAnnotation inside unsupported composable function\")\n\n  var annotationNode by remember {\n    mutableStateOf<PolygonAnnotationNode?>(null)\n  }\n\n  var annotationManager by remember {\n    mutableStateOf<PolygonAnnotationManager?>(null)\n  }\n\n  val coroutineScope = rememberCoroutineScope()\n\n  ComposeNode<PolygonAnnotationNode, MapApplier>(\n    factory = {\n      val factoryAnnotationManager = mapApplier.mapView.annotations.createPolygonAnnotationManager().also { annotationManager = it }\n      val annotationOptions: PolygonAnnotationOptions = PolygonAnnotationOptions()\n        .withPoints(points)\n        .withDraggable(polygonAnnotationState.interactionsState.isDraggable)\n      val annotation = factoryAnnotationManager.create(annotationOptions)\n      PolygonAnnotationNode(mapApplier.mapView.mapboxMap, factoryAnnotationManager, annotation, coroutineScope).also { annotationNode = it }\n    },\n    update = {\n      update(points) {\n        this.annotation.points = it\n        this.annotationManager.update(annotation)\n      }\n    }\n  ) {\n    key(polygonAnnotationState) {\n      annotationNode?.let {\n        polygonAnnotationState.UpdateProperties(it)\n      }\n    }\n  }\n  key(polygonAnnotationState.interactionsState, annotationManager, annotationNode) {\n    if (annotationManager != null && annotationNode != null) {\n      annotationNode?.annotation?.isDraggable = polygonAnnotationState.interactionsState.isDraggable\n      annotationManager?.let {\n        polygonAnnotationState.interactionsState.BindTo(it)\n      }\n    }\n  }\n}\n\n/**\n * Composable function to add a [PolygonAnnotation] to the Map.\n *\n * @param points A list of lists of Point for the fill, which represents the locations of the fill on the map.\n * @param onClick Callback to be invoked when the [PolygonAnnotation] is clicked. The clicked [PolygonAnnotation] will be passed as parameter.\n * @param init the lambda that will be applied to the remembered [PolygonAnnotationState].\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PolygonAnnotation(point, init)\"),\n  level = DeprecationLevel.WARNING\n)\npublic inline fun PolygonAnnotation(\n  points: List<List<Point>>,\n  noinline onClick: (PolygonAnnotation) -> Boolean = { false },\n  crossinline init: PolygonAnnotationState.() -> Unit,\n) {\n  PolygonAnnotation(\n    points = points,\n    onClick = onClick,\n    polygonAnnotationState = remember {\n      PolygonAnnotationState()\n    }.apply(init),\n  )\n}\n\n/**\n * Composable function to add a [PolygonAnnotation] to the Map.\n *\n * @param points A list of lists of Point for the fill, which represents the locations of the fill on the map.\n * @param init the lambda that will be applied to the remembered [PolygonAnnotationState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun PolygonAnnotation(\n  points: List<List<Point>>,\n  crossinline init: PolygonAnnotationState.() -> Unit,\n) {\n  PolygonAnnotation(\n    points = points,\n    polygonAnnotationState = remember {\n      PolygonAnnotationState()\n    }.apply(init),\n  )\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroup.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.PolygonAnnotationManagerNode\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPolygonAnnotationManager\n\n/**\n * Composable function to add a [PolygonAnnotationGroup] to the Map. For convenience, if there's\n * no need to hoist the [polygonAnnotationGroupState], use `PolygonAnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda instead.\n *\n * The [PolygonAnnotationGroup] is more performant than adding multiple [PolygonAnnotation] individually,\n * because the [PolygonAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PolygonAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PolygonAnnotationGroup].\n * @param onClick Callback to be invoked when one of the [PolygonAnnotation] in the cluster is clicked. The clicked [PolygonAnnotation] will be passed as parameter.\n * @param polygonAnnotationGroupState The state holder for [PolygonAnnotation]Group properties.\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PolygonAnnotationGroup(annotations, annotationConfig, polygonAnnotationGroupState)\"),\n  level = DeprecationLevel.WARNING\n)\npublic fun PolygonAnnotationGroup(\n  annotations: List<PolygonAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  onClick: (PolygonAnnotation) -> Boolean = { false },\n  polygonAnnotationGroupState: PolygonAnnotationGroupState = remember { PolygonAnnotationGroupState() }\n) {\n  PolygonAnnotationGroup(\n    annotations,\n    annotationConfig,\n     polygonAnnotationGroupState.also {\n      it.interactionsState.onClicked(onClick = onClick)\n    }\n  )\n}\n\n/**\n * Composable function to add a [PolygonAnnotationGroup] to the Map. For convenience, if there's\n * no need to hoist the [polygonAnnotationGroupState], use `PolygonAnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda instead.\n *\n * The [PolygonAnnotationGroup] is more performant than adding multiple [PolygonAnnotation] individually,\n * because the [PolygonAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PolygonAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PolygonAnnotationGroup].\n * @param polygonAnnotationGroupState The state holder for [PolygonAnnotation]Group properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun PolygonAnnotationGroup(\n  annotations: List<PolygonAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  polygonAnnotationGroupState: PolygonAnnotationGroupState = remember { PolygonAnnotationGroupState() }\n) {\n\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of PolygonAnnotationCluster inside unsupported composable function\")\n\n  var annotationManager by remember {\n    mutableStateOf<PolygonAnnotationManager?>(null)\n  }\n\n  var annotationManagerNode by remember {\n    mutableStateOf<PolygonAnnotationManagerNode?>(null)\n  }\n\n  if (polygonAnnotationGroupState.interactionsState.isDraggable) {\n    annotations.forEach { it.withDraggable(true) }\n  }\n\n  val coroutineScope = rememberCoroutineScope()\n\n  ComposeNode<PolygonAnnotationManagerNode, MapApplier>(\n    factory = {\n      PolygonAnnotationManagerNode(\n        mapApplier.mapView.mapboxMap,\n        mapApplier.mapView.annotations.createPolygonAnnotationManager(annotationConfig).also { annotationManager = it },\n        coroutineScope,\n      ).also { annotationManagerNode = it }\n    },\n    update = {\n      set(annotations) {\n        annotationClusterItems = it\n      }\n    }\n  ) {\n    key(polygonAnnotationGroupState) {\n      annotationManager?.let {\n        polygonAnnotationGroupState.UpdateProperties(it)\n      }\n    }\n  }\n  key(polygonAnnotationGroupState.interactionsState, annotationManager, annotationManagerNode) {\n    if (annotationManager != null && annotationManagerNode != null) {\n      annotationManager?.let {\n        polygonAnnotationGroupState.interactionsState.BindTo(it)\n      }\n      annotationManagerNode?.let {\n        it.currentAnnotations.forEach { annotation ->\n          annotation.isDraggable = polygonAnnotationGroupState.interactionsState.isDraggable\n        }\n      }\n    }\n  }\n}\n\n/**\n * Composable function to add a [PolygonAnnotationGroup] to the Map.\n *\n * The [PolygonAnnotationGroup] is more performant than adding multiple [PolygonAnnotation] individually,\n * because the [PolygonAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PolygonAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PolygonAnnotationGroup].\n * @param onClick Callback to be invoked when one of the [PolygonAnnotation] in the cluster is clicked. The clicked [PolygonAnnotation] will be passed as parameter.\n * @param init the lambda that will be applied to the remembered [PolygonAnnotationGroupState].\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PolygonAnnotationGroup(annotations, annotationConfig, init)\"),\n  level = DeprecationLevel.WARNING\n)\npublic inline fun PolygonAnnotationGroup(\n  annotations: List<PolygonAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  noinline onClick: (PolygonAnnotation) -> Boolean = { false },\n  crossinline init: PolygonAnnotationGroupState.() -> Unit\n) {\n  PolygonAnnotationGroup(\n    annotations = annotations,\n    annotationConfig = annotationConfig,\n    onClick = onClick,\n    polygonAnnotationGroupState = remember { PolygonAnnotationGroupState() }.apply(init)\n  )\n}\n\n/**\n * Composable function to add a [PolygonAnnotationGroup] to the Map.\n *\n * The [PolygonAnnotationGroup] is more performant than adding multiple [PolygonAnnotation] individually,\n * because the [PolygonAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PolygonAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PolygonAnnotationGroup].\n * @param init the lambda that will be applied to the remembered [PolygonAnnotationGroupState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun PolygonAnnotationGroup(\n  annotations: List<PolygonAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  crossinline init: PolygonAnnotationGroupState.() -> Unit\n) {\n  PolygonAnnotationGroup(\n    annotations = annotations,\n    annotationConfig = annotationConfig,\n    polygonAnnotationGroupState = remember { PolygonAnnotationGroupState() }.apply(init)\n  )\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupInteractionsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\n\n/**\n * The state holder for Interactions of [PolygonAnnotationGroup].\n */\n@Stable\npublic class PolygonAnnotationGroupInteractionsState {\n\n  private val onClickedListener: OnPolygonAnnotationClickListener = OnPolygonAnnotationClickListener {\n    onClicked?.invoke(it) ?: false\n  }\n\n  private val onLongClickedListener: OnPolygonAnnotationLongClickListener =\n    OnPolygonAnnotationLongClickListener {\n      onLongClicked?.invoke(it) ?: false\n    }\n\n  private val onDragListener: OnPolygonAnnotationDragListener =\n      object : OnPolygonAnnotationDragListener {\n        override fun onAnnotationDragStarted(annotation: Annotation<*>) {\n          (annotation as? PolygonAnnotation)?.let {\n            onDragStarted?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDrag(annotation: Annotation<*>) {\n          (annotation as? PolygonAnnotation)?.let {\n            onDragged?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDragFinished(annotation: Annotation<*>) {\n          (annotation as? PolygonAnnotation)?.let {\n            onDragFinished?.invoke(it)\n          }\n        }\n      }\n\n  private var onClicked: ((PolygonAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onLongClicked: ((PolygonAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onDragStarted: ((PolygonAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragged: ((PolygonAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragFinished: ((PolygonAnnotation) -> Unit)? by mutableStateOf(null)\n\n  /**\n   * Set whether PolygonAnnotation holding this PolygonAnnotationGroupInteractionsState should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when PolygonAnnotation is also part of the cluster, then once PolygonAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate PolygonAnnotation.\n   */\n  public var isDraggable: Boolean by mutableStateOf(false)\n\n  /**\n   * Set onClick Callback to be invoked when the [PolygonAnnotation] is clicked. The clicked [PolygonAnnotation] will be passed as parameter.\n   * Returns reference to [PolygonAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onClicked(onClick: (PolygonAnnotation) -> Boolean): PolygonAnnotationGroupInteractionsState =\n    apply {\n      onClicked = onClick\n    }\n\n  /**\n   * Set onLongClick Callback to be invoked when one of the [PolygonAnnotation] is long clicked. The long clicked [PolygonAnnotation] will be passed as parameter.\n   * Returns reference to [PolygonAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onLongClicked(onLongClick: (PolygonAnnotation) -> Boolean): PolygonAnnotationGroupInteractionsState =\n    apply {\n      onLongClicked = onLongClick\n    }\n\n  /**\n   *  Set onDragStart Callback to be invoked when one of the [PolygonAnnotation] dragging has started. The dragged [PolygonAnnotation] will be passed as parameter.\n   */\n  public fun onDragStarted(onDragStart: (PolygonAnnotation) -> Unit): PolygonAnnotationGroupInteractionsState =\n    apply {\n      onDragStarted = onDragStart\n    }\n\n  /**\n   *  Set onDrag Callback to be invoked when one of the [PolygonAnnotation] dragging is in progress. The dragged [PolygonAnnotation] will be passed as parameter.\n   */\n  public fun onDragged(onDrag: (PolygonAnnotation) -> Unit): PolygonAnnotationGroupInteractionsState =\n    apply {\n      onDragged = onDrag\n    }\n\n  /**\n   *  Set onDragFinish Callback to be invoked when one of the [PolygonAnnotation] dragging has finished. The dragged [PolygonAnnotation] will be passed as parameter.\n   */\n  public fun onDragFinished(onDragFinish: (PolygonAnnotation) -> Unit): PolygonAnnotationGroupInteractionsState =\n    apply {\n      onDragFinished = onDragFinish\n    }\n\n  @Composable\n  internal fun BindTo(annotationManager: PolygonAnnotationManager) {\n    DisposableEffect(key1 = onClicked) {\n      onClicked?.let {\n        annotationManager.addClickListener(onClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClickListener(onClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onLongClicked) {\n      onLongClicked?.let {\n        annotationManager.addLongClickListener(onLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeLongClickListener(onLongClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onDragStarted, onDragged, onDragFinished) {\n      if (onDragStarted != null || onDragged != null || onDragFinished != null) {\n        annotationManager.addDragListener(onDragListener)\n      }\n      onDispose {\n        annotationManager.removeDragListener(onDragListener)\n      }\n    }\n  }\n}\n\n/**\n * Create and remember a [PolygonAnnotationGroupInteractionsState] with init block.\n *\n * @param init the initialization block to be applied to the [PolygonAnnotationGroupInteractionsState] after created and remembered.\n *\n * @return a [PolygonAnnotationGroupInteractionsState]\n */\n@Composable\npublic inline fun rememberPolygonAnnotationGroupInteractionsState(crossinline init: PolygonAnnotationGroupInteractionsState.() -> Unit = {}): PolygonAnnotationGroupInteractionsState {\n  return remember {\n    PolygonAnnotationGroupInteractionsState()\n  }.apply(init)\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationGroupState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference\nimport com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\n\n/**\n * The state holder for [PolygonAnnotationGroup] properties.\n */\n@Stable\npublic class PolygonAnnotationGroupState private constructor(\n  initialFillConstructBridgeGuardRail: Boolean?,\n  initialFillElevationReference: FillElevationReference?,\n  initialFillSortKey: Double?,\n  initialFillAntialias: Boolean?,\n  initialFillBridgeGuardRailColor: Color?,\n  initialFillColor: Color?,\n  initialFillEmissiveStrength: Double?,\n  initialFillOpacity: Double?,\n  initialFillOutlineColor: Color?,\n  initialFillPattern: String?,\n  initialFillPatternCrossFade: Double?,\n  initialFillTranslate: List<Double>?,\n  initialFillTranslateAnchor: FillTranslateAnchor?,\n  initialFillTunnelStructureColor: Color?,\n  initialFillZOffset: Double?,\n  initialMaxZoom: Double?,\n  initialMinZoom: Double?,\n  initialFillBridgeGuardRailColorUseTheme: String?,\n  initialFillColorUseTheme: String?,\n  initialFillOutlineColorUseTheme: String?,\n  initialFillTunnelStructureColorUseTheme: String?,\n  initialPolygonAnnotationGroupInteractionsState: PolygonAnnotationGroupInteractionsState,\n) {\n  public constructor() : this(\n    initialFillConstructBridgeGuardRail = null,\n    initialFillElevationReference = null,\n    initialFillSortKey = null,\n    initialFillAntialias = null,\n    initialFillBridgeGuardRailColor = null,\n    initialFillColor = null,\n    initialFillEmissiveStrength = null,\n    initialFillOpacity = null,\n    initialFillOutlineColor = null,\n    initialFillPattern = null,\n    initialFillPatternCrossFade = null,\n    initialFillTranslate = null,\n    initialFillTranslateAnchor = null,\n    initialFillTunnelStructureColor = null,\n    initialFillZOffset = null,\n    initialMaxZoom = null,\n    initialMinZoom = null,\n    initialFillBridgeGuardRailColorUseTheme = null,\n    initialFillColorUseTheme = null,\n    initialFillOutlineColorUseTheme = null,\n    initialFillTunnelStructureColorUseTheme = null,\n    initialPolygonAnnotationGroupInteractionsState = PolygonAnnotationGroupInteractionsState(),\n  )\n\n  /**\n   * Holds all interactions with [PointAnnotationGroup]\n   */\n  public var interactionsState: PolygonAnnotationGroupInteractionsState by mutableStateOf(initialPolygonAnnotationGroupInteractionsState)\n  /**\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   */\n  @MapboxExperimental\n  public var fillConstructBridgeGuardRail: Boolean? by mutableStateOf(initialFillConstructBridgeGuardRail)\n  /**\n   * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  @MapboxExperimental\n  public var fillElevationReference: FillElevationReference? by mutableStateOf(initialFillElevationReference)\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  public var fillSortKey: Double? by mutableStateOf(initialFillSortKey)\n  /**\n   * Whether or not the fill should be antialiased. Default value: true.\n   */\n  public var fillAntialias: Boolean? by mutableStateOf(initialFillAntialias)\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  public var fillBridgeGuardRailColor: Color? by mutableStateOf(initialFillBridgeGuardRailColor)\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  public var fillColor: Color? by mutableStateOf(initialFillColor)\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   */\n  public var fillEmissiveStrength: Double? by mutableStateOf(initialFillEmissiveStrength)\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   */\n  public var fillOpacity: Double? by mutableStateOf(initialFillOpacity)\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  public var fillOutlineColor: Color? by mutableStateOf(initialFillOutlineColor)\n  /**\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  public var fillPattern: String? by mutableStateOf(initialFillPattern)\n  /**\n   * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  public var fillPatternCrossFade: Double? by mutableStateOf(initialFillPatternCrossFade)\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   */\n  public var fillTranslate: List<Double>? by mutableStateOf(initialFillTranslate)\n  /**\n   * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n   */\n  public var fillTranslateAnchor: FillTranslateAnchor? by mutableStateOf(initialFillTranslateAnchor)\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  public var fillTunnelStructureColor: Color? by mutableStateOf(initialFillTunnelStructureColor)\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var fillZOffset: Double? by mutableStateOf(initialFillZOffset)\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: Double? by mutableStateOf(initialMaxZoom)\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: Double? by mutableStateOf(initialMinZoom)\n  /**\n   * This property defines whether the `fillBridgeGuardRailColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var fillBridgeGuardRailColorUseTheme: String? by mutableStateOf(initialFillBridgeGuardRailColorUseTheme)\n  /**\n   * This property defines whether the `fillColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var fillColorUseTheme: String? by mutableStateOf(initialFillColorUseTheme)\n  /**\n   * This property defines whether the `fillOutlineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var fillOutlineColorUseTheme: String? by mutableStateOf(initialFillOutlineColorUseTheme)\n  /**\n   * This property defines whether the `fillTunnelStructureColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var fillTunnelStructureColorUseTheme: String? by mutableStateOf(initialFillTunnelStructureColorUseTheme)\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateFillConstructBridgeGuardRail(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillConstructBridgeGuardRail = fillConstructBridgeGuardRail\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateFillElevationReference(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillElevationReference = fillElevationReference\n  }\n  @Composable\n  private fun UpdateFillSortKey(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillSortKey = fillSortKey\n  }\n  @Composable\n  private fun UpdateFillAntialias(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillAntialias = fillAntialias\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateFillBridgeGuardRailColor(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillBridgeGuardRailColorString = fillBridgeGuardRailColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateFillColor(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillColorString = fillColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateFillEmissiveStrength(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillEmissiveStrength = fillEmissiveStrength\n  }\n  @Composable\n  private fun UpdateFillOpacity(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillOpacity = fillOpacity\n  }\n  @Composable\n  private fun UpdateFillOutlineColor(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillOutlineColorString = fillOutlineColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateFillPattern(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillPattern = fillPattern\n  }\n  @Composable\n  private fun UpdateFillPatternCrossFade(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillPatternCrossFade = fillPatternCrossFade\n  }\n  @Composable\n  private fun UpdateFillTranslate(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillTranslate = fillTranslate\n  }\n  @Composable\n  private fun UpdateFillTranslateAnchor(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillTranslateAnchor = fillTranslateAnchor\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateFillTunnelStructureColor(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillTunnelStructureColorString = fillTunnelStructureColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateFillZOffset(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillZOffset = fillZOffset\n  }\n  @Composable\n  private fun UpdateMaxZoom(annotationManager: PolygonAnnotationManager) {\n    annotationManager.maxZoom = maxZoom\n  }\n  @Composable\n  private fun UpdateMinZoom(annotationManager: PolygonAnnotationManager) {\n    annotationManager.minZoom = minZoom\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateFillBridgeGuardRailColorUseTheme(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillBridgeGuardRailColorUseTheme = fillBridgeGuardRailColorUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateFillColorUseTheme(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillColorUseTheme = fillColorUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateFillOutlineColorUseTheme(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillOutlineColorUseTheme = fillOutlineColorUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateFillTunnelStructureColorUseTheme(annotationManager: PolygonAnnotationManager) {\n    annotationManager.fillTunnelStructureColorUseTheme = fillTunnelStructureColorUseTheme\n  }\n\n  @Composable\n  internal fun UpdateProperties(annotationManager: PolygonAnnotationManager) {\n    UpdateFillConstructBridgeGuardRail(annotationManager)\n    UpdateFillElevationReference(annotationManager)\n    UpdateFillSortKey(annotationManager)\n    UpdateFillAntialias(annotationManager)\n    UpdateFillBridgeGuardRailColor(annotationManager)\n    UpdateFillColor(annotationManager)\n    UpdateFillEmissiveStrength(annotationManager)\n    UpdateFillOpacity(annotationManager)\n    UpdateFillOutlineColor(annotationManager)\n    UpdateFillPattern(annotationManager)\n    UpdateFillPatternCrossFade(annotationManager)\n    UpdateFillTranslate(annotationManager)\n    UpdateFillTranslateAnchor(annotationManager)\n    UpdateFillTunnelStructureColor(annotationManager)\n    UpdateFillZOffset(annotationManager)\n    UpdateMaxZoom(annotationManager)\n    UpdateMinZoom(annotationManager)\n    UpdateFillBridgeGuardRailColorUseTheme(annotationManager)\n    UpdateFillColorUseTheme(annotationManager)\n    UpdateFillOutlineColorUseTheme(annotationManager)\n    UpdateFillTunnelStructureColorUseTheme(annotationManager)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationInteractionsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\n\n/**\n * The state holder for Interactions of [PolygonAnnotation].\n */\n@Stable\npublic class PolygonAnnotationInteractionsState {\n\n  private val onClickedListener: OnPolygonAnnotationClickListener = OnPolygonAnnotationClickListener {\n    onClicked?.invoke(it) ?: false\n  }\n\n  private val onLongClickedListener: OnPolygonAnnotationLongClickListener =\n    OnPolygonAnnotationLongClickListener {\n      onLongClicked?.invoke(it) ?: false\n    }\n\n  private val onDragListener: OnPolygonAnnotationDragListener =\n      object : OnPolygonAnnotationDragListener {\n        override fun onAnnotationDragStarted(annotation: Annotation<*>) {\n          (annotation as? PolygonAnnotation)?.let {\n            onDragStarted?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDrag(annotation: Annotation<*>) {\n          (annotation as? PolygonAnnotation)?.let {\n            onDragged?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDragFinished(annotation: Annotation<*>) {\n          (annotation as? PolygonAnnotation)?.let {\n            onDragFinished?.invoke(it)\n          }\n        }\n      }\n\n  private var onClicked: ((PolygonAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onLongClicked: ((PolygonAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onDragStarted: ((PolygonAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragged: ((PolygonAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragFinished: ((PolygonAnnotation) -> Unit)? by mutableStateOf(null)\n\n  /**\n   * Set whether PolygonAnnotation holding this PolygonAnnotationInteractionsState should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when PolygonAnnotation is also part of the cluster, then once PolygonAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate PolygonAnnotation.\n   */\n  public var isDraggable: Boolean by mutableStateOf(false)\n\n  /**\n   * Set onClick Callback to be invoked when the [PolygonAnnotation] is clicked. The clicked [PolygonAnnotation] will be passed as parameter.\n   * Returns reference to [PolygonAnnotationInteractionsState] for making chained calls.\n   */\n  public fun onClicked(onClick: (PolygonAnnotation) -> Boolean): PolygonAnnotationInteractionsState =\n    apply {\n      onClicked = onClick\n    }\n\n  /**\n   * Set onLongClick Callback to be invoked when one of the [PolygonAnnotation] is long clicked. The long clicked [PolygonAnnotation] will be passed as parameter.\n   * Returns reference to [PolygonAnnotationInteractionsState] for making chained calls.\n   */\n  public fun onLongClicked(onLongClick: (PolygonAnnotation) -> Boolean): PolygonAnnotationInteractionsState =\n    apply {\n      onLongClicked = onLongClick\n    }\n\n  /**\n   *  Set onDragStart Callback to be invoked when one of the [PolygonAnnotation] dragging has started. The dragged [PolygonAnnotation] will be passed as parameter.\n   */\n  public fun onDragStarted(onDragStart: (PolygonAnnotation) -> Unit): PolygonAnnotationInteractionsState =\n    apply {\n      onDragStarted = onDragStart\n    }\n\n  /**\n   *  Set onDrag Callback to be invoked when one of the [PolygonAnnotation] dragging is in progress. The dragged [PolygonAnnotation] will be passed as parameter.\n   */\n  public fun onDragged(onDrag: (PolygonAnnotation) -> Unit): PolygonAnnotationInteractionsState =\n    apply {\n      onDragged = onDrag\n    }\n\n  /**\n   *  Set onDragFinish Callback to be invoked when one of the [PolygonAnnotation] dragging has finished. The dragged [PolygonAnnotation] will be passed as parameter.\n   */\n  public fun onDragFinished(onDragFinish: (PolygonAnnotation) -> Unit): PolygonAnnotationInteractionsState =\n    apply {\n      onDragFinished = onDragFinish\n    }\n\n  @Composable\n  internal fun BindTo(annotationManager: PolygonAnnotationManager) {\n    DisposableEffect(key1 = onClicked) {\n      onClicked?.let {\n        annotationManager.addClickListener(onClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClickListener(onClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onLongClicked) {\n      onLongClicked?.let {\n        annotationManager.addLongClickListener(onLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeLongClickListener(onLongClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onDragStarted, onDragged, onDragFinished) {\n      if (onDragStarted != null || onDragged != null || onDragFinished != null) {\n        annotationManager.addDragListener(onDragListener)\n      }\n      onDispose {\n        annotationManager.removeDragListener(onDragListener)\n      }\n    }\n  }\n}\n\n/**\n * Create and remember a [PolygonAnnotationInteractionsState] with init block.\n *\n * @param init the initialization block to be applied to the [PolygonAnnotationInteractionsState] after created and remembered.\n *\n * @return a [PolygonAnnotationInteractionsState]\n */\n@Composable\npublic inline fun rememberPolygonAnnotationInteractionsState(crossinline init: PolygonAnnotationInteractionsState.() -> Unit = {}): PolygonAnnotationInteractionsState {\n  return remember {\n    PolygonAnnotationInteractionsState()\n  }.apply(init)\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationOptionsExt.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions\n\n/**\n * Set fill-bridge-guard-rail-color to initialise the polygonAnnotation with.\n *\n * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n *\n * @param fillBridgeGuardRailColor the fill-bridge-guard-rail-color value\n * @return this\n */\n@MapboxExperimental\npublic fun PolygonAnnotationOptions.withFillBridgeGuardRailColor(fillBridgeGuardRailColor: Color): PolygonAnnotationOptions = apply {\n  withFillBridgeGuardRailColor(fillBridgeGuardRailColor.toArgb())\n}\n/**\n * Set fill-color to initialise the polygonAnnotation with.\n *\n * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n *\n * @param fillColor the fill-color value\n * @return this\n */\npublic fun PolygonAnnotationOptions.withFillColor(fillColor: Color): PolygonAnnotationOptions = apply {\n  withFillColor(fillColor.toArgb())\n}\n/**\n * Set fill-outline-color to initialise the polygonAnnotation with.\n *\n * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n *\n * @param fillOutlineColor the fill-outline-color value\n * @return this\n */\npublic fun PolygonAnnotationOptions.withFillOutlineColor(fillOutlineColor: Color): PolygonAnnotationOptions = apply {\n  withFillOutlineColor(fillOutlineColor.toArgb())\n}\n/**\n * Set fill-tunnel-structure-color to initialise the polygonAnnotation with.\n *\n * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n *\n * @param fillTunnelStructureColor the fill-tunnel-structure-color value\n * @return this\n */\n@MapboxExperimental\npublic fun PolygonAnnotationOptions.withFillTunnelStructureColor(fillTunnelStructureColor: Color): PolygonAnnotationOptions = apply {\n  withFillTunnelStructureColor(fillTunnelStructureColor.toArgb())\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolygonAnnotationState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.PolygonAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation\n\n/**\n * The state holder for [PolygonAnnotation] properties.\n */\n@Stable\npublic class PolygonAnnotationState private constructor(\n  initialFillConstructBridgeGuardRail: Boolean?,\n  initialFillBridgeGuardRailColor: Color?,\n  initialFillColor: Color?,\n  initialFillOpacity: Double?,\n  initialFillOutlineColor: Color?,\n  initialFillPattern: String?,\n  initialFillTunnelStructureColor: Color?,\n  initialFillZOffset: Double?,\n  initialFillBridgeGuardRailColorUseTheme: String?,\n  initialFillColorUseTheme: String?,\n  initialFillOutlineColorUseTheme: String?,\n  initialFillTunnelStructureColorUseTheme: String?,\n  initialPolygonAnnotationInteractionsState: PolygonAnnotationInteractionsState,\n) {\n\n  public constructor() : this(\n    initialFillConstructBridgeGuardRail = null,\n    initialFillBridgeGuardRailColor = null,\n    initialFillColor = null,\n    initialFillOpacity = null,\n    initialFillOutlineColor = null,\n    initialFillPattern = null,\n    initialFillTunnelStructureColor = null,\n    initialFillZOffset = null,\n    initialFillBridgeGuardRailColorUseTheme = null,\n    initialFillColorUseTheme = null,\n    initialFillOutlineColorUseTheme = null,\n    initialFillTunnelStructureColorUseTheme = null,\n    initialPolygonAnnotationInteractionsState = PolygonAnnotationInteractionsState(),\n)\n\n  /**\n  * All interactions with [PointAnnotation]\n  */\n  public var interactionsState: PolygonAnnotationInteractionsState by mutableStateOf(initialPolygonAnnotationInteractionsState)\n  /**\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   */\n  @MapboxExperimental\n  public var fillConstructBridgeGuardRail: Boolean? by mutableStateOf(initialFillConstructBridgeGuardRail)\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  public var fillBridgeGuardRailColor: Color? by mutableStateOf(initialFillBridgeGuardRailColor)\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  public var fillColor: Color? by mutableStateOf(initialFillColor)\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   */\n  public var fillOpacity: Double? by mutableStateOf(initialFillOpacity)\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  public var fillOutlineColor: Color? by mutableStateOf(initialFillOutlineColor)\n  /**\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  public var fillPattern: String? by mutableStateOf(initialFillPattern)\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  public var fillTunnelStructureColor: Color? by mutableStateOf(initialFillTunnelStructureColor)\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var fillZOffset: Double? by mutableStateOf(initialFillZOffset)\n  /**\n   * This property defines whether the `fillBridgeGuardRailColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var fillBridgeGuardRailColorUseTheme: String? by mutableStateOf(initialFillBridgeGuardRailColorUseTheme)\n  /**\n   * This property defines whether the `fillColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var fillColorUseTheme: String? by mutableStateOf(initialFillColorUseTheme)\n  /**\n   * This property defines whether the `fillOutlineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var fillOutlineColorUseTheme: String? by mutableStateOf(initialFillOutlineColorUseTheme)\n  /**\n   * This property defines whether the `fillTunnelStructureColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var fillTunnelStructureColorUseTheme: String? by mutableStateOf(initialFillTunnelStructureColorUseTheme)\n\n  @Composable\n  private fun UpdateFillConstructBridgeGuardRail(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillConstructBridgeGuardRail = fillConstructBridgeGuardRail\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillBridgeGuardRailColor(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillBridgeGuardRailColorInt = fillBridgeGuardRailColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillColor(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillColorInt = fillColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillOpacity(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillOpacity = fillOpacity\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillOutlineColor(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillOutlineColorInt = fillOutlineColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillPattern(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillPattern = fillPattern\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillTunnelStructureColor(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillTunnelStructureColorInt = fillTunnelStructureColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillZOffset(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillZOffset = fillZOffset\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillBridgeGuardRailColorUseTheme(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillBridgeGuardRailColorUseTheme = fillBridgeGuardRailColorUseTheme\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillColorUseTheme(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillColorUseTheme = fillColorUseTheme\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillOutlineColorUseTheme(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillOutlineColorUseTheme = fillOutlineColorUseTheme\n      }\n    )\n  }\n  @Composable\n  private fun UpdateFillTunnelStructureColorUseTheme(\n    annotationNode: PolygonAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.fillTunnelStructureColorUseTheme = fillTunnelStructureColorUseTheme\n      }\n    )\n  }\n\n  @Composable\n  internal fun UpdateProperties(\n    annotationNode: PolygonAnnotationNode,\n  ) {\n    UpdateFillConstructBridgeGuardRail(annotationNode)\n    UpdateFillBridgeGuardRailColor(annotationNode)\n    UpdateFillColor(annotationNode)\n    UpdateFillOpacity(annotationNode)\n    UpdateFillOutlineColor(annotationNode)\n    UpdateFillPattern(annotationNode)\n    UpdateFillTunnelStructureColor(annotationNode)\n    UpdateFillZOffset(annotationNode)\n    UpdateFillBridgeGuardRailColorUseTheme(annotationNode)\n    UpdateFillColorUseTheme(annotationNode)\n    UpdateFillOutlineColorUseTheme(annotationNode)\n    UpdateFillTunnelStructureColorUseTheme(annotationNode)\n  }\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotation.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.PolylineAnnotationNode\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPolylineAnnotationManager\n\n/**\n * Composable function to add a [PolylineAnnotation] to the Map. For convenience, if there's\n * no need to hoist the [polylineAnnotationState], use `PolylineAnnotation(points, onClick, init)` with trailing lambda instead.\n *\n * @param points A list of Point for the line, which represents the locations of the line on the map.\n * @param onClick Callback to be invoked when the [PolylineAnnotation] is clicked. The clicked [PolylineAnnotation] will be passed as parameter.\n * @param polylineAnnotationState The state holder for [PolylineAnnotation] properties.\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PolylineAnnotation(point, polylineAnnotationState)\"),\n  level = DeprecationLevel.WARNING\n)\npublic fun PolylineAnnotation(\n  points: List<Point>,\n  onClick: (PolylineAnnotation) -> Boolean = { false },\n  polylineAnnotationState: PolylineAnnotationState = remember { PolylineAnnotationState() },\n) {\n  PolylineAnnotation(\n    points = points,\n    polylineAnnotationState = polylineAnnotationState.also {\n      it.interactionsState.onClicked(onClick = onClick)\n  }\n )\n}\n\n/**\n * Composable function to add a [PolylineAnnotation] to the Map. For convenience, if there's\n * no need to hoist the [polylineAnnotationState], use `PolylineAnnotation(points, init)` with trailing lambda instead.\n *\n * @param points A list of Point for the line, which represents the locations of the line on the map.\n * @param polylineAnnotationState The state holder for [PolylineAnnotation] properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun PolylineAnnotation(\n  points: List<Point>,\n  polylineAnnotationState: PolylineAnnotationState = remember { PolylineAnnotationState() },\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of PolylineAnnotation inside unsupported composable function\")\n\n  var annotationNode by remember {\n    mutableStateOf<PolylineAnnotationNode?>(null)\n  }\n\n  var annotationManager by remember {\n    mutableStateOf<PolylineAnnotationManager?>(null)\n  }\n\n  val coroutineScope = rememberCoroutineScope()\n\n  ComposeNode<PolylineAnnotationNode, MapApplier>(\n    factory = {\n      val factoryAnnotationManager = mapApplier.mapView.annotations.createPolylineAnnotationManager().also { annotationManager = it }\n      val annotationOptions: PolylineAnnotationOptions = PolylineAnnotationOptions()\n        .withPoints(points)\n        .withDraggable(polylineAnnotationState.interactionsState.isDraggable)\n      val annotation = factoryAnnotationManager.create(annotationOptions)\n      PolylineAnnotationNode(mapApplier.mapView.mapboxMap, factoryAnnotationManager, annotation, coroutineScope).also { annotationNode = it }\n    },\n    update = {\n      update(points) {\n        this.annotation.points = it\n        this.annotationManager.update(annotation)\n      }\n    }\n  ) {\n    key(polylineAnnotationState) {\n      annotationNode?.let {\n        polylineAnnotationState.UpdateProperties(it)\n      }\n    }\n  }\n  key(polylineAnnotationState.interactionsState, annotationManager, annotationNode) {\n    if (annotationManager != null && annotationNode != null) {\n      annotationNode?.annotation?.isDraggable = polylineAnnotationState.interactionsState.isDraggable\n      annotationManager?.let {\n        polylineAnnotationState.interactionsState.BindTo(it)\n      }\n    }\n  }\n}\n\n/**\n * Composable function to add a [PolylineAnnotation] to the Map.\n *\n * @param points A list of Point for the line, which represents the locations of the line on the map.\n * @param onClick Callback to be invoked when the [PolylineAnnotation] is clicked. The clicked [PolylineAnnotation] will be passed as parameter.\n * @param init the lambda that will be applied to the remembered [PolylineAnnotationState].\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PolylineAnnotation(point, init)\"),\n  level = DeprecationLevel.WARNING\n)\npublic inline fun PolylineAnnotation(\n  points: List<Point>,\n  noinline onClick: (PolylineAnnotation) -> Boolean = { false },\n  crossinline init: PolylineAnnotationState.() -> Unit,\n) {\n  PolylineAnnotation(\n    points = points,\n    onClick = onClick,\n    polylineAnnotationState = remember {\n      PolylineAnnotationState()\n    }.apply(init),\n  )\n}\n\n/**\n * Composable function to add a [PolylineAnnotation] to the Map.\n *\n * @param points A list of Point for the line, which represents the locations of the line on the map.\n * @param init the lambda that will be applied to the remembered [PolylineAnnotationState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun PolylineAnnotation(\n  points: List<Point>,\n  crossinline init: PolylineAnnotationState.() -> Unit,\n) {\n  PolylineAnnotation(\n    points = points,\n    polylineAnnotationState = remember {\n      PolylineAnnotationState()\n    }.apply(init),\n  )\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroup.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.PolylineAnnotationManagerNode\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.annotations\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions\nimport com.mapbox.maps.plugin.annotation.generated.createPolylineAnnotationManager\n\n/**\n * Composable function to add a [PolylineAnnotationGroup] to the Map. For convenience, if there's\n * no need to hoist the [polylineAnnotationGroupState], use `PolylineAnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda instead.\n *\n * The [PolylineAnnotationGroup] is more performant than adding multiple [PolylineAnnotation] individually,\n * because the [PolylineAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PolylineAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PolylineAnnotationGroup].\n * @param onClick Callback to be invoked when one of the [PolylineAnnotation] in the cluster is clicked. The clicked [PolylineAnnotation] will be passed as parameter.\n * @param polylineAnnotationGroupState The state holder for [PolylineAnnotation]Group properties.\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PolylineAnnotationGroup(annotations, annotationConfig, polylineAnnotationGroupState)\"),\n  level = DeprecationLevel.WARNING\n)\npublic fun PolylineAnnotationGroup(\n  annotations: List<PolylineAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  onClick: (PolylineAnnotation) -> Boolean = { false },\n  polylineAnnotationGroupState: PolylineAnnotationGroupState = remember { PolylineAnnotationGroupState() }\n) {\n  PolylineAnnotationGroup(\n    annotations,\n    annotationConfig,\n     polylineAnnotationGroupState.also {\n      it.interactionsState.onClicked(onClick = onClick)\n    }\n  )\n}\n\n/**\n * Composable function to add a [PolylineAnnotationGroup] to the Map. For convenience, if there's\n * no need to hoist the [polylineAnnotationGroupState], use `PolylineAnnotationGroup(annotations, annotationConfig, onClick, init)` with trailing lambda instead.\n *\n * The [PolylineAnnotationGroup] is more performant than adding multiple [PolylineAnnotation] individually,\n * because the [PolylineAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PolylineAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PolylineAnnotationGroup].\n * @param polylineAnnotationGroupState The state holder for [PolylineAnnotation]Group properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun PolylineAnnotationGroup(\n  annotations: List<PolylineAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  polylineAnnotationGroupState: PolylineAnnotationGroupState = remember { PolylineAnnotationGroupState() }\n) {\n\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of PolylineAnnotationCluster inside unsupported composable function\")\n\n  var annotationManager by remember {\n    mutableStateOf<PolylineAnnotationManager?>(null)\n  }\n\n  var annotationManagerNode by remember {\n    mutableStateOf<PolylineAnnotationManagerNode?>(null)\n  }\n\n  if (polylineAnnotationGroupState.interactionsState.isDraggable) {\n    annotations.forEach { it.withDraggable(true) }\n  }\n\n  val coroutineScope = rememberCoroutineScope()\n\n  ComposeNode<PolylineAnnotationManagerNode, MapApplier>(\n    factory = {\n      PolylineAnnotationManagerNode(\n        mapApplier.mapView.mapboxMap,\n        mapApplier.mapView.annotations.createPolylineAnnotationManager(annotationConfig).also { annotationManager = it },\n        coroutineScope,\n      ).also { annotationManagerNode = it }\n    },\n    update = {\n      set(annotations) {\n        annotationClusterItems = it\n      }\n    }\n  ) {\n    key(polylineAnnotationGroupState) {\n      annotationManager?.let {\n        polylineAnnotationGroupState.UpdateProperties(it)\n      }\n    }\n  }\n  key(polylineAnnotationGroupState.interactionsState, annotationManager, annotationManagerNode) {\n    if (annotationManager != null && annotationManagerNode != null) {\n      annotationManager?.let {\n        polylineAnnotationGroupState.interactionsState.BindTo(it)\n      }\n      annotationManagerNode?.let {\n        it.currentAnnotations.forEach { annotation ->\n          annotation.isDraggable = polylineAnnotationGroupState.interactionsState.isDraggable\n        }\n      }\n    }\n  }\n}\n\n/**\n * Composable function to add a [PolylineAnnotationGroup] to the Map.\n *\n * The [PolylineAnnotationGroup] is more performant than adding multiple [PolylineAnnotation] individually,\n * because the [PolylineAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PolylineAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PolylineAnnotationGroup].\n * @param onClick Callback to be invoked when one of the [PolylineAnnotation] in the cluster is clicked. The clicked [PolylineAnnotation] will be passed as parameter.\n * @param init the lambda that will be applied to the remembered [PolylineAnnotationGroupState].\n */\n@Composable\n@MapboxMapComposable\n@Deprecated(\n  message = \"This method is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"PolylineAnnotationGroup(annotations, annotationConfig, init)\"),\n  level = DeprecationLevel.WARNING\n)\npublic inline fun PolylineAnnotationGroup(\n  annotations: List<PolylineAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  noinline onClick: (PolylineAnnotation) -> Boolean = { false },\n  crossinline init: PolylineAnnotationGroupState.() -> Unit\n) {\n  PolylineAnnotationGroup(\n    annotations = annotations,\n    annotationConfig = annotationConfig,\n    onClick = onClick,\n    polylineAnnotationGroupState = remember { PolylineAnnotationGroupState() }.apply(init)\n  )\n}\n\n/**\n * Composable function to add a [PolylineAnnotationGroup] to the Map.\n *\n * The [PolylineAnnotationGroup] is more performant than adding multiple [PolylineAnnotation] individually,\n * because the [PolylineAnnotationGroup] is added to the map as a single layer.\n *\n * [PointAnnotationGroup] and [CircleAnnotationGroup] can also be clustered based on the configuration, see [AnnotationConfig.annotationSourceOptions] and [ClusterOptions] for more details.\n * @param annotations List of [PolylineAnnotationOptions] to be added to the group.\n * @param annotationConfig Configuration for [PolylineAnnotationGroup].\n * @param init the lambda that will be applied to the remembered [PolylineAnnotationGroupState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun PolylineAnnotationGroup(\n  annotations: List<PolylineAnnotationOptions>,\n  annotationConfig: AnnotationConfig? = null,\n  crossinline init: PolylineAnnotationGroupState.() -> Unit\n) {\n  PolylineAnnotationGroup(\n    annotations = annotations,\n    annotationConfig = annotationConfig,\n    polylineAnnotationGroupState = remember { PolylineAnnotationGroupState() }.apply(init)\n  )\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupInteractionsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager\n\n/**\n * The state holder for Interactions of [PolylineAnnotationGroup].\n */\n@Stable\npublic class PolylineAnnotationGroupInteractionsState {\n\n  private val onClickedListener: OnPolylineAnnotationClickListener = OnPolylineAnnotationClickListener {\n    onClicked?.invoke(it) ?: false\n  }\n\n  private val onLongClickedListener: OnPolylineAnnotationLongClickListener =\n    OnPolylineAnnotationLongClickListener {\n      onLongClicked?.invoke(it) ?: false\n    }\n\n  private val onDragListener: OnPolylineAnnotationDragListener =\n      object : OnPolylineAnnotationDragListener {\n        override fun onAnnotationDragStarted(annotation: Annotation<*>) {\n          (annotation as? PolylineAnnotation)?.let {\n            onDragStarted?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDrag(annotation: Annotation<*>) {\n          (annotation as? PolylineAnnotation)?.let {\n            onDragged?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDragFinished(annotation: Annotation<*>) {\n          (annotation as? PolylineAnnotation)?.let {\n            onDragFinished?.invoke(it)\n          }\n        }\n      }\n\n  private var onClicked: ((PolylineAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onLongClicked: ((PolylineAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onDragStarted: ((PolylineAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragged: ((PolylineAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragFinished: ((PolylineAnnotation) -> Unit)? by mutableStateOf(null)\n\n  /**\n   * Set whether PolylineAnnotation holding this PolylineAnnotationGroupInteractionsState should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when PolylineAnnotation is also part of the cluster, then once PolylineAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate PolylineAnnotation.\n   */\n  public var isDraggable: Boolean by mutableStateOf(false)\n\n  /**\n   * Set onClick Callback to be invoked when the [PolylineAnnotation] is clicked. The clicked [PolylineAnnotation] will be passed as parameter.\n   * Returns reference to [PolylineAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onClicked(onClick: (PolylineAnnotation) -> Boolean): PolylineAnnotationGroupInteractionsState =\n    apply {\n      onClicked = onClick\n    }\n\n  /**\n   * Set onLongClick Callback to be invoked when one of the [PolylineAnnotation] is long clicked. The long clicked [PolylineAnnotation] will be passed as parameter.\n   * Returns reference to [PolylineAnnotationGroupInteractionsState] for making chained calls.\n   */\n  public fun onLongClicked(onLongClick: (PolylineAnnotation) -> Boolean): PolylineAnnotationGroupInteractionsState =\n    apply {\n      onLongClicked = onLongClick\n    }\n\n  /**\n   *  Set onDragStart Callback to be invoked when one of the [PolylineAnnotation] dragging has started. The dragged [PolylineAnnotation] will be passed as parameter.\n   */\n  public fun onDragStarted(onDragStart: (PolylineAnnotation) -> Unit): PolylineAnnotationGroupInteractionsState =\n    apply {\n      onDragStarted = onDragStart\n    }\n\n  /**\n   *  Set onDrag Callback to be invoked when one of the [PolylineAnnotation] dragging is in progress. The dragged [PolylineAnnotation] will be passed as parameter.\n   */\n  public fun onDragged(onDrag: (PolylineAnnotation) -> Unit): PolylineAnnotationGroupInteractionsState =\n    apply {\n      onDragged = onDrag\n    }\n\n  /**\n   *  Set onDragFinish Callback to be invoked when one of the [PolylineAnnotation] dragging has finished. The dragged [PolylineAnnotation] will be passed as parameter.\n   */\n  public fun onDragFinished(onDragFinish: (PolylineAnnotation) -> Unit): PolylineAnnotationGroupInteractionsState =\n    apply {\n      onDragFinished = onDragFinish\n    }\n\n  @Composable\n  internal fun BindTo(annotationManager: PolylineAnnotationManager) {\n    DisposableEffect(key1 = onClicked) {\n      onClicked?.let {\n        annotationManager.addClickListener(onClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClickListener(onClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onLongClicked) {\n      onLongClicked?.let {\n        annotationManager.addLongClickListener(onLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeLongClickListener(onLongClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onDragStarted, onDragged, onDragFinished) {\n      if (onDragStarted != null || onDragged != null || onDragFinished != null) {\n        annotationManager.addDragListener(onDragListener)\n      }\n      onDispose {\n        annotationManager.removeDragListener(onDragListener)\n      }\n    }\n  }\n}\n\n/**\n * Create and remember a [PolylineAnnotationGroupInteractionsState] with init block.\n *\n * @param init the initialization block to be applied to the [PolylineAnnotationGroupInteractionsState] after created and remembered.\n *\n * @return a [PolylineAnnotationGroupInteractionsState]\n */\n@Composable\npublic inline fun rememberPolylineAnnotationGroupInteractionsState(crossinline init: PolylineAnnotationGroupInteractionsState.() -> Unit = {}): PolylineAnnotationGroupInteractionsState {\n  return remember {\n    PolylineAnnotationGroupInteractionsState()\n  }.apply(init)\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationGroupState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineCap\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager\n\n/**\n * The state holder for [PolylineAnnotationGroup] properties.\n */\n@Stable\npublic class PolylineAnnotationGroupState private constructor(\n  initialLineCap: LineCap?,\n  initialLineCrossSlope: Double?,\n  initialLineElevationGroundScale: Double?,\n  initialLineElevationReference: LineElevationReference?,\n  initialLineJoin: LineJoin?,\n  initialLineMiterLimit: Double?,\n  initialLineRoundLimit: Double?,\n  initialLineSortKey: Double?,\n  initialLineWidthUnit: LineWidthUnit?,\n  initialLineZOffset: Double?,\n  initialLineBlur: Double?,\n  initialLineBorderColor: Color?,\n  initialLineBorderWidth: Double?,\n  initialLineColor: Color?,\n  initialLineCutoutFadeWidth: Double?,\n  initialLineCutoutOpacity: Double?,\n  initialLineDasharray: List<Double>?,\n  initialLineDepthOcclusionFactor: Double?,\n  initialLineEmissiveStrength: Double?,\n  initialLineGapWidth: Double?,\n  initialLineOcclusionOpacity: Double?,\n  initialLineOffset: Double?,\n  initialLineOpacity: Double?,\n  initialLinePattern: String?,\n  initialLinePatternCrossFade: Double?,\n  initialLineTranslate: List<Double>?,\n  initialLineTranslateAnchor: LineTranslateAnchor?,\n  initialLineTrimColor: Color?,\n  initialLineTrimFadeRange: List<Double>?,\n  initialLineTrimOffset: List<Double>?,\n  initialLineWidth: Double?,\n  initialMaxZoom: Double?,\n  initialMinZoom: Double?,\n  initialLineBorderColorUseTheme: String?,\n  initialLineColorUseTheme: String?,\n  initialLineGradientUseTheme: String?,\n  initialLineTrimColorUseTheme: String?,\n  initialPolylineAnnotationGroupInteractionsState: PolylineAnnotationGroupInteractionsState,\n) {\n  public constructor() : this(\n    initialLineCap = null,\n    initialLineCrossSlope = null,\n    initialLineElevationGroundScale = null,\n    initialLineElevationReference = null,\n    initialLineJoin = null,\n    initialLineMiterLimit = null,\n    initialLineRoundLimit = null,\n    initialLineSortKey = null,\n    initialLineWidthUnit = null,\n    initialLineZOffset = null,\n    initialLineBlur = null,\n    initialLineBorderColor = null,\n    initialLineBorderWidth = null,\n    initialLineColor = null,\n    initialLineCutoutFadeWidth = null,\n    initialLineCutoutOpacity = null,\n    initialLineDasharray = null,\n    initialLineDepthOcclusionFactor = null,\n    initialLineEmissiveStrength = null,\n    initialLineGapWidth = null,\n    initialLineOcclusionOpacity = null,\n    initialLineOffset = null,\n    initialLineOpacity = null,\n    initialLinePattern = null,\n    initialLinePatternCrossFade = null,\n    initialLineTranslate = null,\n    initialLineTranslateAnchor = null,\n    initialLineTrimColor = null,\n    initialLineTrimFadeRange = null,\n    initialLineTrimOffset = null,\n    initialLineWidth = null,\n    initialMaxZoom = null,\n    initialMinZoom = null,\n    initialLineBorderColorUseTheme = null,\n    initialLineColorUseTheme = null,\n    initialLineGradientUseTheme = null,\n    initialLineTrimColorUseTheme = null,\n    initialPolylineAnnotationGroupInteractionsState = PolylineAnnotationGroupInteractionsState(),\n  )\n\n  /**\n   * Holds all interactions with [PointAnnotationGroup]\n   */\n  public var interactionsState: PolylineAnnotationGroupInteractionsState by mutableStateOf(initialPolylineAnnotationGroupInteractionsState)\n  /**\n   * The display of line endings. Default value: \"butt\".\n   */\n  public var lineCap: LineCap? by mutableStateOf(initialLineCap)\n  /**\n   * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n   */\n  @MapboxExperimental\n  public var lineCrossSlope: Double? by mutableStateOf(initialLineCrossSlope)\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   */\n  public var lineElevationGroundScale: Double? by mutableStateOf(initialLineElevationGroundScale)\n  /**\n   * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  public var lineElevationReference: LineElevationReference? by mutableStateOf(initialLineElevationReference)\n  /**\n   * The display of lines when joining. Default value: \"miter\".\n   */\n  public var lineJoin: LineJoin? by mutableStateOf(initialLineJoin)\n  /**\n   * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n   */\n  public var lineMiterLimit: Double? by mutableStateOf(initialLineMiterLimit)\n  /**\n   * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n   */\n  public var lineRoundLimit: Double? by mutableStateOf(initialLineRoundLimit)\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  public var lineSortKey: Double? by mutableStateOf(initialLineSortKey)\n  /**\n   * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n   */\n  @MapboxExperimental\n  public var lineWidthUnit: LineWidthUnit? by mutableStateOf(initialLineWidthUnit)\n  /**\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   */\n  public var lineZOffset: Double? by mutableStateOf(initialLineZOffset)\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   */\n  public var lineBlur: Double? by mutableStateOf(initialLineBlur)\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  public var lineBorderColor: Color? by mutableStateOf(initialLineBorderColor)\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   */\n  public var lineBorderWidth: Double? by mutableStateOf(initialLineBorderWidth)\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  public var lineColor: Color? by mutableStateOf(initialLineColor)\n  /**\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var lineCutoutFadeWidth: Double? by mutableStateOf(initialLineCutoutFadeWidth)\n  /**\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var lineCutoutOpacity: Double? by mutableStateOf(initialLineCutoutOpacity)\n  /**\n   * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n   */\n  public var lineDasharray: List<Double>? by mutableStateOf(initialLineDasharray)\n  /**\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   */\n  public var lineDepthOcclusionFactor: Double? by mutableStateOf(initialLineDepthOcclusionFactor)\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   */\n  public var lineEmissiveStrength: Double? by mutableStateOf(initialLineEmissiveStrength)\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   */\n  public var lineGapWidth: Double? by mutableStateOf(initialLineGapWidth)\n  /**\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   */\n  public var lineOcclusionOpacity: Double? by mutableStateOf(initialLineOcclusionOpacity)\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   */\n  public var lineOffset: Double? by mutableStateOf(initialLineOffset)\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var lineOpacity: Double? by mutableStateOf(initialLineOpacity)\n  /**\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  public var linePattern: String? by mutableStateOf(initialLinePattern)\n  /**\n   * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  public var linePatternCrossFade: Double? by mutableStateOf(initialLinePatternCrossFade)\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   */\n  public var lineTranslate: List<Double>? by mutableStateOf(initialLineTranslate)\n  /**\n   * Controls the frame of reference for `line-translate`. Default value: \"map\".\n   */\n  public var lineTranslateAnchor: LineTranslateAnchor? by mutableStateOf(initialLineTranslateAnchor)\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   */\n  @MapboxExperimental\n  public var lineTrimColor: Color? by mutableStateOf(initialLineTrimColor)\n  /**\n   * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   */\n  @MapboxExperimental\n  public var lineTrimFadeRange: List<Double>? by mutableStateOf(initialLineTrimFadeRange)\n  /**\n   * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   */\n  public var lineTrimOffset: List<Double>? by mutableStateOf(initialLineTrimOffset)\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   */\n  public var lineWidth: Double? by mutableStateOf(initialLineWidth)\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: Double? by mutableStateOf(initialMaxZoom)\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: Double? by mutableStateOf(initialMinZoom)\n  /**\n   * This property defines whether the `lineBorderColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var lineBorderColorUseTheme: String? by mutableStateOf(initialLineBorderColorUseTheme)\n  /**\n   * This property defines whether the `lineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var lineColorUseTheme: String? by mutableStateOf(initialLineColorUseTheme)\n  /**\n   * This property defines whether the `lineGradient` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var lineGradientUseTheme: String? by mutableStateOf(initialLineGradientUseTheme)\n  /**\n   * This property defines whether the `lineTrimColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var lineTrimColorUseTheme: String? by mutableStateOf(initialLineTrimColorUseTheme)\n\n  @Composable\n  private fun UpdateLineCap(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineCap = lineCap\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineCrossSlope(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineCrossSlope = lineCrossSlope\n  }\n  @Composable\n  private fun UpdateLineElevationGroundScale(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineElevationGroundScale = lineElevationGroundScale\n  }\n  @Composable\n  private fun UpdateLineElevationReference(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineElevationReference = lineElevationReference\n  }\n  @Composable\n  private fun UpdateLineJoin(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineJoin = lineJoin\n  }\n  @Composable\n  private fun UpdateLineMiterLimit(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineMiterLimit = lineMiterLimit\n  }\n  @Composable\n  private fun UpdateLineRoundLimit(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineRoundLimit = lineRoundLimit\n  }\n  @Composable\n  private fun UpdateLineSortKey(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineSortKey = lineSortKey\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineWidthUnit(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineWidthUnit = lineWidthUnit\n  }\n  @Composable\n  private fun UpdateLineZOffset(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineZOffset = lineZOffset\n  }\n  @Composable\n  private fun UpdateLineBlur(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineBlur = lineBlur\n  }\n  @Composable\n  private fun UpdateLineBorderColor(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineBorderColorString = lineBorderColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  private fun UpdateLineBorderWidth(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineBorderWidth = lineBorderWidth\n  }\n  @Composable\n  private fun UpdateLineColor(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineColorString = lineColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineCutoutFadeWidth(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineCutoutFadeWidth = lineCutoutFadeWidth\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineCutoutOpacity(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineCutoutOpacity = lineCutoutOpacity\n  }\n  @Composable\n  private fun UpdateLineDasharray(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineDasharray = lineDasharray\n  }\n  @Composable\n  private fun UpdateLineDepthOcclusionFactor(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineDepthOcclusionFactor = lineDepthOcclusionFactor\n  }\n  @Composable\n  private fun UpdateLineEmissiveStrength(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineEmissiveStrength = lineEmissiveStrength\n  }\n  @Composable\n  private fun UpdateLineGapWidth(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineGapWidth = lineGapWidth\n  }\n  @Composable\n  private fun UpdateLineOcclusionOpacity(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineOcclusionOpacity = lineOcclusionOpacity\n  }\n  @Composable\n  private fun UpdateLineOffset(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineOffset = lineOffset\n  }\n  @Composable\n  private fun UpdateLineOpacity(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineOpacity = lineOpacity\n  }\n  @Composable\n  private fun UpdateLinePattern(annotationManager: PolylineAnnotationManager) {\n    annotationManager.linePattern = linePattern\n  }\n  @Composable\n  private fun UpdateLinePatternCrossFade(annotationManager: PolylineAnnotationManager) {\n    annotationManager.linePatternCrossFade = linePatternCrossFade\n  }\n  @Composable\n  private fun UpdateLineTranslate(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineTranslate = lineTranslate\n  }\n  @Composable\n  private fun UpdateLineTranslateAnchor(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineTranslateAnchor = lineTranslateAnchor\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineTrimColor(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineTrimColorString = lineTrimColor?.toArgb()?.let { ColorUtils.colorToRgbaString(it) }\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineTrimFadeRange(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineTrimFadeRange = lineTrimFadeRange\n  }\n  @Composable\n  private fun UpdateLineTrimOffset(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineTrimOffset = lineTrimOffset\n  }\n  @Composable\n  private fun UpdateLineWidth(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineWidth = lineWidth\n  }\n  @Composable\n  private fun UpdateMaxZoom(annotationManager: PolylineAnnotationManager) {\n    annotationManager.maxZoom = maxZoom\n  }\n  @Composable\n  private fun UpdateMinZoom(annotationManager: PolylineAnnotationManager) {\n    annotationManager.minZoom = minZoom\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineBorderColorUseTheme(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineBorderColorUseTheme = lineBorderColorUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineColorUseTheme(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineColorUseTheme = lineColorUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineGradientUseTheme(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineGradientUseTheme = lineGradientUseTheme\n  }\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  private fun UpdateLineTrimColorUseTheme(annotationManager: PolylineAnnotationManager) {\n    annotationManager.lineTrimColorUseTheme = lineTrimColorUseTheme\n  }\n\n  @Composable\n  internal fun UpdateProperties(annotationManager: PolylineAnnotationManager) {\n    UpdateLineCap(annotationManager)\n    UpdateLineCrossSlope(annotationManager)\n    UpdateLineElevationGroundScale(annotationManager)\n    UpdateLineElevationReference(annotationManager)\n    UpdateLineJoin(annotationManager)\n    UpdateLineMiterLimit(annotationManager)\n    UpdateLineRoundLimit(annotationManager)\n    UpdateLineSortKey(annotationManager)\n    UpdateLineWidthUnit(annotationManager)\n    UpdateLineZOffset(annotationManager)\n    UpdateLineBlur(annotationManager)\n    UpdateLineBorderColor(annotationManager)\n    UpdateLineBorderWidth(annotationManager)\n    UpdateLineColor(annotationManager)\n    UpdateLineCutoutFadeWidth(annotationManager)\n    UpdateLineCutoutOpacity(annotationManager)\n    UpdateLineDasharray(annotationManager)\n    UpdateLineDepthOcclusionFactor(annotationManager)\n    UpdateLineEmissiveStrength(annotationManager)\n    UpdateLineGapWidth(annotationManager)\n    UpdateLineOcclusionOpacity(annotationManager)\n    UpdateLineOffset(annotationManager)\n    UpdateLineOpacity(annotationManager)\n    UpdateLinePattern(annotationManager)\n    UpdateLinePatternCrossFade(annotationManager)\n    UpdateLineTranslate(annotationManager)\n    UpdateLineTranslateAnchor(annotationManager)\n    UpdateLineTrimColor(annotationManager)\n    UpdateLineTrimFadeRange(annotationManager)\n    UpdateLineTrimOffset(annotationManager)\n    UpdateLineWidth(annotationManager)\n    UpdateMaxZoom(annotationManager)\n    UpdateMinZoom(annotationManager)\n    UpdateLineBorderColorUseTheme(annotationManager)\n    UpdateLineColorUseTheme(annotationManager)\n    UpdateLineGradientUseTheme(annotationManager)\n    UpdateLineTrimColorUseTheme(annotationManager)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationInteractionsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationClickListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationDragListener\nimport com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager\n\n/**\n * The state holder for Interactions of [PolylineAnnotation].\n */\n@Stable\npublic class PolylineAnnotationInteractionsState {\n\n  private val onClickedListener: OnPolylineAnnotationClickListener = OnPolylineAnnotationClickListener {\n    onClicked?.invoke(it) ?: false\n  }\n\n  private val onLongClickedListener: OnPolylineAnnotationLongClickListener =\n    OnPolylineAnnotationLongClickListener {\n      onLongClicked?.invoke(it) ?: false\n    }\n\n  private val onDragListener: OnPolylineAnnotationDragListener =\n      object : OnPolylineAnnotationDragListener {\n        override fun onAnnotationDragStarted(annotation: Annotation<*>) {\n          (annotation as? PolylineAnnotation)?.let {\n            onDragStarted?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDrag(annotation: Annotation<*>) {\n          (annotation as? PolylineAnnotation)?.let {\n            onDragged?.invoke(it)\n          }\n        }\n\n        override fun onAnnotationDragFinished(annotation: Annotation<*>) {\n          (annotation as? PolylineAnnotation)?.let {\n            onDragFinished?.invoke(it)\n          }\n        }\n      }\n\n  private var onClicked: ((PolylineAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onLongClicked: ((PolylineAnnotation) -> Boolean)? by mutableStateOf(null)\n  private var onDragStarted: ((PolylineAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragged: ((PolylineAnnotation) -> Unit)? by mutableStateOf(null)\n  private var onDragFinished: ((PolylineAnnotation) -> Unit)? by mutableStateOf(null)\n\n  /**\n   * Set whether PolylineAnnotation holding this PolylineAnnotationInteractionsState should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when PolylineAnnotation is also part of the cluster, then once PolylineAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate PolylineAnnotation.\n   */\n  public var isDraggable: Boolean by mutableStateOf(false)\n\n  /**\n   * Set onClick Callback to be invoked when the [PolylineAnnotation] is clicked. The clicked [PolylineAnnotation] will be passed as parameter.\n   * Returns reference to [PolylineAnnotationInteractionsState] for making chained calls.\n   */\n  public fun onClicked(onClick: (PolylineAnnotation) -> Boolean): PolylineAnnotationInteractionsState =\n    apply {\n      onClicked = onClick\n    }\n\n  /**\n   * Set onLongClick Callback to be invoked when one of the [PolylineAnnotation] is long clicked. The long clicked [PolylineAnnotation] will be passed as parameter.\n   * Returns reference to [PolylineAnnotationInteractionsState] for making chained calls.\n   */\n  public fun onLongClicked(onLongClick: (PolylineAnnotation) -> Boolean): PolylineAnnotationInteractionsState =\n    apply {\n      onLongClicked = onLongClick\n    }\n\n  /**\n   *  Set onDragStart Callback to be invoked when one of the [PolylineAnnotation] dragging has started. The dragged [PolylineAnnotation] will be passed as parameter.\n   */\n  public fun onDragStarted(onDragStart: (PolylineAnnotation) -> Unit): PolylineAnnotationInteractionsState =\n    apply {\n      onDragStarted = onDragStart\n    }\n\n  /**\n   *  Set onDrag Callback to be invoked when one of the [PolylineAnnotation] dragging is in progress. The dragged [PolylineAnnotation] will be passed as parameter.\n   */\n  public fun onDragged(onDrag: (PolylineAnnotation) -> Unit): PolylineAnnotationInteractionsState =\n    apply {\n      onDragged = onDrag\n    }\n\n  /**\n   *  Set onDragFinish Callback to be invoked when one of the [PolylineAnnotation] dragging has finished. The dragged [PolylineAnnotation] will be passed as parameter.\n   */\n  public fun onDragFinished(onDragFinish: (PolylineAnnotation) -> Unit): PolylineAnnotationInteractionsState =\n    apply {\n      onDragFinished = onDragFinish\n    }\n\n  @Composable\n  internal fun BindTo(annotationManager: PolylineAnnotationManager) {\n    DisposableEffect(key1 = onClicked) {\n      onClicked?.let {\n        annotationManager.addClickListener(onClickedListener)\n      }\n      onDispose {\n        annotationManager.removeClickListener(onClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onLongClicked) {\n      onLongClicked?.let {\n        annotationManager.addLongClickListener(onLongClickedListener)\n      }\n      onDispose {\n        annotationManager.removeLongClickListener(onLongClickedListener)\n      }\n    }\n    DisposableEffect(key1 = onDragStarted, onDragged, onDragFinished) {\n      if (onDragStarted != null || onDragged != null || onDragFinished != null) {\n        annotationManager.addDragListener(onDragListener)\n      }\n      onDispose {\n        annotationManager.removeDragListener(onDragListener)\n      }\n    }\n  }\n}\n\n/**\n * Create and remember a [PolylineAnnotationInteractionsState] with init block.\n *\n * @param init the initialization block to be applied to the [PolylineAnnotationInteractionsState] after created and remembered.\n *\n * @return a [PolylineAnnotationInteractionsState]\n */\n@Composable\npublic inline fun rememberPolylineAnnotationInteractionsState(crossinline init: PolylineAnnotationInteractionsState.() -> Unit = {}): PolylineAnnotationInteractionsState {\n  return remember {\n    PolylineAnnotationInteractionsState()\n  }.apply(init)\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationOptionsExt.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions\n\n/**\n * Set line-border-color to initialise the polylineAnnotation with.\n *\n * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n *\n * @param lineBorderColor the line-border-color value\n * @return this\n */\npublic fun PolylineAnnotationOptions.withLineBorderColor(lineBorderColor: Color): PolylineAnnotationOptions = apply {\n  withLineBorderColor(lineBorderColor.toArgb())\n}\n/**\n * Set line-color to initialise the polylineAnnotation with.\n *\n * The color with which the line will be drawn. Default value: \"#000000\".\n *\n * @param lineColor the line-color value\n * @return this\n */\npublic fun PolylineAnnotationOptions.withLineColor(lineColor: Color): PolylineAnnotationOptions = apply {\n  withLineColor(lineColor.toArgb())\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/generated/PolylineAnnotationState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.annotation.internal.generated.PolylineAnnotationNode\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation\n\n/**\n * The state holder for [PolylineAnnotation] properties.\n */\n@Stable\npublic class PolylineAnnotationState private constructor(\n  initialLineElevationGroundScale: Double?,\n  initialLineJoin: LineJoin?,\n  initialLineZOffset: Double?,\n  initialLineBlur: Double?,\n  initialLineBorderColor: Color?,\n  initialLineBorderWidth: Double?,\n  initialLineColor: Color?,\n  initialLineEmissiveStrength: Double?,\n  initialLineGapWidth: Double?,\n  initialLineOffset: Double?,\n  initialLineOpacity: Double?,\n  initialLinePattern: String?,\n  initialLineWidth: Double?,\n  initialLineBorderColorUseTheme: String?,\n  initialLineColorUseTheme: String?,\n  initialPolylineAnnotationInteractionsState: PolylineAnnotationInteractionsState,\n) {\n\n  public constructor() : this(\n    initialLineElevationGroundScale = null,\n    initialLineJoin = null,\n    initialLineZOffset = null,\n    initialLineBlur = null,\n    initialLineBorderColor = null,\n    initialLineBorderWidth = null,\n    initialLineColor = null,\n    initialLineEmissiveStrength = null,\n    initialLineGapWidth = null,\n    initialLineOffset = null,\n    initialLineOpacity = null,\n    initialLinePattern = null,\n    initialLineWidth = null,\n    initialLineBorderColorUseTheme = null,\n    initialLineColorUseTheme = null,\n    initialPolylineAnnotationInteractionsState = PolylineAnnotationInteractionsState(),\n)\n\n  /**\n  * All interactions with [PointAnnotation]\n  */\n  public var interactionsState: PolylineAnnotationInteractionsState by mutableStateOf(initialPolylineAnnotationInteractionsState)\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   */\n  public var lineElevationGroundScale: Double? by mutableStateOf(initialLineElevationGroundScale)\n  /**\n   * The display of lines when joining. Default value: \"miter\".\n   */\n  public var lineJoin: LineJoin? by mutableStateOf(initialLineJoin)\n  /**\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   */\n  public var lineZOffset: Double? by mutableStateOf(initialLineZOffset)\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   */\n  public var lineBlur: Double? by mutableStateOf(initialLineBlur)\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  public var lineBorderColor: Color? by mutableStateOf(initialLineBorderColor)\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   */\n  public var lineBorderWidth: Double? by mutableStateOf(initialLineBorderWidth)\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  public var lineColor: Color? by mutableStateOf(initialLineColor)\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   */\n  public var lineEmissiveStrength: Double? by mutableStateOf(initialLineEmissiveStrength)\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   */\n  public var lineGapWidth: Double? by mutableStateOf(initialLineGapWidth)\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   */\n  public var lineOffset: Double? by mutableStateOf(initialLineOffset)\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var lineOpacity: Double? by mutableStateOf(initialLineOpacity)\n  /**\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  public var linePattern: String? by mutableStateOf(initialLinePattern)\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   */\n  public var lineWidth: Double? by mutableStateOf(initialLineWidth)\n  /**\n   * This property defines whether the `lineBorderColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var lineBorderColorUseTheme: String? by mutableStateOf(initialLineBorderColorUseTheme)\n  /**\n   * This property defines whether the `lineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  public var lineColorUseTheme: String? by mutableStateOf(initialLineColorUseTheme)\n\n  @Composable\n  private fun UpdateLineElevationGroundScale(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineElevationGroundScale = lineElevationGroundScale\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineJoin(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineJoin = lineJoin\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineZOffset(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineZOffset = lineZOffset\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineBlur(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineBlur = lineBlur\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineBorderColor(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineBorderColorInt = lineBorderColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineBorderWidth(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineBorderWidth = lineBorderWidth\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineColor(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineColorInt = lineColor?.toArgb()\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineEmissiveStrength(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineEmissiveStrength = lineEmissiveStrength\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineGapWidth(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineGapWidth = lineGapWidth\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineOffset(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineOffset = lineOffset\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineOpacity(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineOpacity = lineOpacity\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLinePattern(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.linePattern = linePattern\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineWidth(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineWidth = lineWidth\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineBorderColorUseTheme(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineBorderColorUseTheme = lineBorderColorUseTheme\n      }\n    )\n  }\n  @Composable\n  private fun UpdateLineColorUseTheme(\n    annotationNode: PolylineAnnotationNode\n  ) {\n    annotationNode.annotationManager.update(\n      annotationNode.annotation.also { annotation ->\n        annotation.lineColorUseTheme = lineColorUseTheme\n      }\n    )\n  }\n\n  @Composable\n  internal fun UpdateProperties(\n    annotationNode: PolylineAnnotationNode,\n  ) {\n    UpdateLineElevationGroundScale(annotationNode)\n    UpdateLineJoin(annotationNode)\n    UpdateLineZOffset(annotationNode)\n    UpdateLineBlur(annotationNode)\n    UpdateLineBorderColor(annotationNode)\n    UpdateLineBorderWidth(annotationNode)\n    UpdateLineColor(annotationNode)\n    UpdateLineEmissiveStrength(annotationNode)\n    UpdateLineGapWidth(annotationNode)\n    UpdateLineOffset(annotationNode)\n    UpdateLineOpacity(annotationNode)\n    UpdateLinePattern(annotationNode)\n    UpdateLineWidth(annotationNode)\n    UpdateLineBorderColorUseTheme(annotationNode)\n    UpdateLineColorUseTheme(annotationNode)\n  }\n}\n\n// End of generated file"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/internal/BaseAnnotationNode.kt",
    "content": "package com.mapbox.maps.extension.compose.annotation.internal\n\nimport androidx.annotation.CallSuper\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.internal.LayerPositionAwareNode\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.extension.compose.internal.StyleLifecycleAwareNode\nimport com.mapbox.maps.extension.compose.style.internal.StyleSlotNode\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport kotlinx.coroutines.CoroutineScope\n\ninternal abstract class BaseAnnotationNode(\n  mapboxStyleManager: MapboxStyleManager,\n  coroutineScope: CoroutineScope,\n) : LayerPositionAwareNode, StyleLifecycleAwareNode(mapboxStyleManager, coroutineScope) {\n\n  override var isAttached: Boolean = false\n\n  @CallSuper\n  override fun onAttached(parent: MapNode) {\n    logD(TAG, \"[$this] onAttached() called with: parent = $parent\")\n    super.onAttached(parent)\n    dispatchWhenReady { mapboxStyleManager ->\n      // For annotations nodes within a slot we need to set the slot property on all the layers\n      if (parent is StyleSlotNode) {\n        getLayerIds().forEach { layerId ->\n          mapboxStyleManager.setStyleLayerProperty(layerId, \"slot\", Value(parent.slotName)).onError {\n            logW(TAG, \"Failed to set slot property for layer $layerId: $it\")\n          }\n        }\n      }\n      mapboxStyleManager.repositionCurrentNode(parent)\n      isAttached = true\n    }\n  }\n\n  @CallSuper\n  override fun onMoved(parent: MapNode) {\n    dispatchWhenReady {\n      it.repositionCurrentNode(parent)\n    }\n  }\n\n  override fun onClear() {\n    cleanUp()\n  }\n\n  override fun onRemoved(parent: MapNode) {\n    cleanUp()\n  }\n\n  protected abstract fun cleanUp()\n\n  private companion object {\n    private const val TAG = \"BaseAnnotationNode\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/internal/generated/CircleAnnotationManagerNode.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.internal.generated\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.annotation.internal.BaseAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions\nimport kotlinx.coroutines.CoroutineScope\n\ninternal class CircleAnnotationManagerNode(\n  mapboxStyleManager: MapboxStyleManager,\n  val annotationManager: CircleAnnotationManager,\n  coroutineScope: CoroutineScope,\n) : BaseAnnotationNode(mapboxStyleManager, coroutineScope) {\n\n  internal var currentAnnotations: MutableList<CircleAnnotation> = mutableListOf()\n  var annotationClusterItems: List<CircleAnnotationOptions> = emptyList()\n    set(value) {\n      if (currentAnnotations.isNotEmpty()) {\n        annotationManager.delete(currentAnnotations)\n        currentAnnotations.clear()\n      }\n      currentAnnotations.addAll(annotationManager.create(value))\n      field = value\n    }\n\n  override fun cleanUp() {\n    currentAnnotations.clear()\n    annotationManager.deleteAll()\n    annotationManager.onDestroy()\n  }\n\n  override fun getLayerIds(): List<String> {\n    return annotationManager.associatedLayers\n  }\n\n  override fun toString(): String {\n    return \"CircleAnnotationManagerNode(#${hashCode()})\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/internal/generated/CircleAnnotationNode.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.internal.generated\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.annotation.internal.BaseAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager\nimport kotlinx.coroutines.CoroutineScope\n\ninternal class CircleAnnotationNode(\n  mapboxStyleManager: MapboxStyleManager,\n  val annotationManager: CircleAnnotationManager,\n  val annotation: CircleAnnotation,\n  coroutineScope: CoroutineScope,\n) : BaseAnnotationNode(mapboxStyleManager, coroutineScope) {\n\n  override fun cleanUp() {\n    annotationManager.delete(annotation)\n    annotationManager.onDestroy()\n  }\n\n  override fun getLayerIds(): List<String> {\n    return annotationManager.associatedLayers\n  }\n\n  override fun toString(): String {\n    return \"CircleAnnotationNode(#${hashCode()})\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/internal/generated/PointAnnotationManagerNode.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.internal.generated\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.annotation.internal.BaseAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport kotlinx.coroutines.CoroutineScope\n\ninternal class PointAnnotationManagerNode(\n  mapboxStyleManager: MapboxStyleManager,\n  val annotationManager: PointAnnotationManager,\n  coroutineScope: CoroutineScope,\n) : BaseAnnotationNode(mapboxStyleManager, coroutineScope) {\n\n  internal var currentAnnotations: MutableList<PointAnnotation> = mutableListOf()\n  var annotationClusterItems: List<PointAnnotationOptions> = emptyList()\n    set(value) {\n      if (currentAnnotations.isNotEmpty()) {\n        annotationManager.delete(currentAnnotations)\n        currentAnnotations.clear()\n      }\n      currentAnnotations.addAll(annotationManager.create(value))\n      field = value\n    }\n\n  override fun cleanUp() {\n    currentAnnotations.clear()\n    annotationManager.deleteAll()\n    annotationManager.onDestroy()\n  }\n\n  override fun getLayerIds(): List<String> {\n    return annotationManager.associatedLayers\n  }\n\n  override fun toString(): String {\n    return \"PointAnnotationManagerNode(#${hashCode()})\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/internal/generated/PointAnnotationNode.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.internal.generated\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.annotation.internal.BaseAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport kotlinx.coroutines.CoroutineScope\n\ninternal class PointAnnotationNode(\n  mapboxStyleManager: MapboxStyleManager,\n  val annotationManager: PointAnnotationManager,\n  val annotation: PointAnnotation,\n  coroutineScope: CoroutineScope,\n) : BaseAnnotationNode(mapboxStyleManager, coroutineScope) {\n\n  override fun cleanUp() {\n    annotationManager.delete(annotation)\n    annotationManager.onDestroy()\n  }\n\n  override fun getLayerIds(): List<String> {\n    return annotationManager.associatedLayers\n  }\n\n  override fun toString(): String {\n    return \"PointAnnotationNode(#${hashCode()})\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/internal/generated/PolygonAnnotationManagerNode.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.internal.generated\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.annotation.internal.BaseAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions\nimport kotlinx.coroutines.CoroutineScope\n\ninternal class PolygonAnnotationManagerNode(\n  mapboxStyleManager: MapboxStyleManager,\n  val annotationManager: PolygonAnnotationManager,\n  coroutineScope: CoroutineScope,\n) : BaseAnnotationNode(mapboxStyleManager, coroutineScope) {\n\n  internal var currentAnnotations: MutableList<PolygonAnnotation> = mutableListOf()\n  var annotationClusterItems: List<PolygonAnnotationOptions> = emptyList()\n    set(value) {\n      if (currentAnnotations.isNotEmpty()) {\n        annotationManager.delete(currentAnnotations)\n        currentAnnotations.clear()\n      }\n      currentAnnotations.addAll(annotationManager.create(value))\n      field = value\n    }\n\n  override fun cleanUp() {\n    currentAnnotations.clear()\n    annotationManager.deleteAll()\n    annotationManager.onDestroy()\n  }\n\n  override fun getLayerIds(): List<String> {\n    return annotationManager.associatedLayers\n  }\n\n  override fun toString(): String {\n    return \"PolygonAnnotationManagerNode(#${hashCode()})\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/internal/generated/PolygonAnnotationNode.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.internal.generated\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.annotation.internal.BaseAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\nimport kotlinx.coroutines.CoroutineScope\n\ninternal class PolygonAnnotationNode(\n  mapboxStyleManager: MapboxStyleManager,\n  val annotationManager: PolygonAnnotationManager,\n  val annotation: PolygonAnnotation,\n  coroutineScope: CoroutineScope,\n) : BaseAnnotationNode(mapboxStyleManager, coroutineScope) {\n\n  override fun cleanUp() {\n    annotationManager.delete(annotation)\n    annotationManager.onDestroy()\n  }\n\n  override fun getLayerIds(): List<String> {\n    return annotationManager.associatedLayers\n  }\n\n  override fun toString(): String {\n    return \"PolygonAnnotationNode(#${hashCode()})\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/internal/generated/PolylineAnnotationManagerNode.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.internal.generated\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.annotation.internal.BaseAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions\nimport kotlinx.coroutines.CoroutineScope\n\ninternal class PolylineAnnotationManagerNode(\n  mapboxStyleManager: MapboxStyleManager,\n  val annotationManager: PolylineAnnotationManager,\n  coroutineScope: CoroutineScope,\n) : BaseAnnotationNode(mapboxStyleManager, coroutineScope) {\n\n  internal var currentAnnotations: MutableList<PolylineAnnotation> = mutableListOf()\n  var annotationClusterItems: List<PolylineAnnotationOptions> = emptyList()\n    set(value) {\n      if (currentAnnotations.isNotEmpty()) {\n        annotationManager.delete(currentAnnotations)\n        currentAnnotations.clear()\n      }\n      currentAnnotations.addAll(annotationManager.create(value))\n      field = value\n    }\n\n  override fun cleanUp() {\n    currentAnnotations.clear()\n    annotationManager.deleteAll()\n    annotationManager.onDestroy()\n  }\n\n  override fun getLayerIds(): List<String> {\n    return annotationManager.associatedLayers\n  }\n\n  override fun toString(): String {\n    return \"PolylineAnnotationManagerNode(#${hashCode()})\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/annotation/internal/generated/PolylineAnnotationNode.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.annotation.internal.generated\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.annotation.internal.BaseAnnotationNode\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager\nimport kotlinx.coroutines.CoroutineScope\n\ninternal class PolylineAnnotationNode(\n  mapboxStyleManager: MapboxStyleManager,\n  val annotationManager: PolylineAnnotationManager,\n  val annotation: PolylineAnnotation,\n  coroutineScope: CoroutineScope,\n) : BaseAnnotationNode(mapboxStyleManager, coroutineScope) {\n\n  override fun cleanUp() {\n    annotationManager.delete(annotation)\n    annotationManager.onDestroy()\n  }\n\n  override fun getLayerIds(): List<String> {\n    return annotationManager.associatedLayers\n  }\n\n  override fun toString(): String {\n    return \"PolylineAnnotationNode(#${hashCode()})\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/internal/ComposeTelemetryEvents.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport com.mapbox.maps.module.TelemetryEvent\n\ninternal object ComposeTelemetryEvents {\n  val map = TelemetryEvent.create(\"compose/map\")\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/internal/LayerPositionAwareNode.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.style.internal.StyleLayerPositionNode\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\n\n/**\n * Internal interface for layers and annotations to handle layer position in the node tree.\n */\ninternal interface LayerPositionAwareNode {\n  var isAttached: Boolean\n  /**\n   * Get the layer id of the node.\n   */\n  fun getLayerIds(): List<String>\n\n  /**\n   * Reposition all the layers within the current node according to [getRelativePositionInfo].\n   */\n  fun MapboxStyleManager.repositionCurrentNode(parent: MapNode) {\n    repositionLayersForCurrentNode(getRelativePositionInfo(parent))\n  }\n\n  /**\n   * Reposition all the layers associated with the current Node to the given [layerPosition].\n   */\n  private fun MapboxStyleManager.repositionLayersForCurrentNode(layerPosition: LayerPosition?) {\n    logD(\n      TAG,\n      \"[${this@LayerPositionAwareNode}] repositionLayersForCurrentNode() called with: layerPosition = $layerPosition\"\n    )\n    val associatedLayers = getLayerIds()\n    if (associatedLayers.isEmpty()) {\n      logW(\n        TAG,\n        \"Cannot reposition layer for $this, associatedLayers is empty.\"\n      )\n    }\n    // Move the last layer according to the given layer position\n    moveStyleLayer(associatedLayers.last(), layerPosition).onError { error ->\n      logW(\n        TAG,\n        \"Failed to move layer $associatedLayers.last() to $layerPosition: $error\"\n      )\n      val layers = styleManager.styleLayers.joinToString(separator = \"\\t \") { it.id }\n      logI(TAG, \"Available layers in style: $layers\")\n    }\n\n    if (associatedLayers.size > 1) {\n      // move the rest of layers below the last layer in the associated layer stack\n      for (index in associatedLayers.size - 2 downTo 0) {\n        moveStyleLayer(\n          associatedLayers[index],\n          LayerPosition(\n            /* above = */ null,\n            /* below = */ associatedLayers[index + 1],\n            /* at = */ null\n          )\n        )\n      }\n    }\n  }\n\n  /**\n   * Compose inserts node in the order of the position in the block.\n   * For example, given the following compose block:\n   * ```\n   * aboveLayer(\"buildings\") {\n   *  layerPositionAwareNode_1\n   *  layerPositionAwareNode_2\n   *  layerPositionAwareNode_3\n   * }\n   * ```\n   * Compose will insert the nodes in the following order:\n   *   layerPositionAwareNode_1, layerPositionAwareNode_2, layerPositionAwareNode_3.\n   *\n   * This method is used to find the previous [LayerPositionAwareNode] in the children's list of the\n   * parent node, so that this node can be inserted above it.\n   * It is important to find the previous node because the layers are added in the order of the\n   * children list. Otherwise, we might end up with layer not found errors (e.g. in *AnnotationNodes).\n   *\n   * Meaning that the relative position of the layers should be:\n   * ```\n   * layerPositionAwareNode_1 above \"buildings\"\n   * layerPositionAwareNode_2 above layerPositionAwareNode_1\n   * layerPositionAwareNode_3 above layerPositionAwareNode_2\n   * ```\n   *\n   * @param parent the parent node of the node to be positioned.\n   */\n  fun getRelativePositionInfo(parent: MapNode): LayerPosition? =\n    parent.children.filterIsInstance<LayerPositionAwareNode>().let { children ->\n      val me = this@LayerPositionAwareNode\n      // The compose nodes are inserted to the map engine in the order of the children list.\n      // Meaning that the node that is before this one will have its layer added when we add this one.\n      val indexOfMe = children.indexOf(me)\n      val anchorLayerNode = children.elementAtOrNull(indexOfMe - 1)\n      return if (anchorLayerNode == null) {\n        when (parent) {\n          // If the parent node is a Style one then we should use its layer position as the anchor.\n          is StyleLayerPositionNode -> parent.layerPosition\n\n          // For other parent nodes we use the next node if it's attached or null (which just relies on the order of calls).\n          else -> children.elementAtOrNull(indexOfMe + 1)?.let {\n            if (it.isAttached) {\n              LayerPosition(\n                /* above = */ null,\n                /* below = */ it.getLayerIds().first(),\n                /* at = */ null\n              )\n            } else {\n              null\n            }\n          }\n        }\n      } else {\n        // If the anchor layer is not null then we should insert this node above the\n        // top-most (last) layer in the anchor.\n        val anchorLayerId = anchorLayerNode.getLayerIds().last()\n        // Because the previous layer is already added we should insert this node above the previous one.\n        LayerPosition(\n          /* above = */ anchorLayerId,\n          /* below = */ null,\n          /* at = */ null\n        )\n      }\n    }\n\n  private companion object {\n    private const val TAG = \"LayerPositionAwareNode\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/internal/MapApplier.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport androidx.compose.runtime.AbstractApplier\nimport com.mapbox.common.LogConfiguration\nimport com.mapbox.common.LoggingLevel\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.logD\n\n/**\n * Defines the contract of a MapNode, the MapNode will be notified when it's added/moved/removed from\n * the node tree.\n */\ninternal abstract class MapNode {\n  val children = mutableListOf<MapNode>()\n\n  /**\n   * Invoked when this [MapNode] is attached to the node tree.\n   */\n  open fun onAttached(parent: MapNode) {}\n\n  /**\n   * Invoked when this [MapNode] is moved inside the node tree.\n   */\n  open fun onMoved(parent: MapNode) {}\n\n  /**\n   * Invoked when this [MapNode] is removed from the node tree.\n   */\n  open fun onRemoved(parent: MapNode) {}\n\n  /**\n   * Invoked when the node tree is cleared.\n   */\n  open fun onClear() {}\n}\n\n/**\n * Root level [MapNode] for MapboxMap composable function.\n */\ninternal class RootMapNode : MapNode() {\n  override fun toString(): String {\n    return \"RootMapNode(#${hashCode()})\"\n  }\n}\n\n/**\n * MapApplier is responsible for applying the tree-based operations on MapboxMap, that get emitted\n * during a composition.\n */\ninternal class MapApplier(\n  /**\n   * The raw map controller to be used within current Compose.\n   */\n  val mapView: MapView\n) : AbstractApplier<MapNode>(RootMapNode()) {\n\n  override fun onClear() {\n    logD(TAG, \"onClear: current=$current\")\n    root.children.forEach { it.onClear() }\n    root.children.clear()\n    printNodesTree(\"MapNodeCleared\")\n  }\n\n  override fun insertBottomUp(index: Int, instance: MapNode) {\n    logD(TAG, \"insertBottomUp: $index, $instance\")\n    current.children.add(index, instance)\n    instance.onAttached(parent = current)\n    // If the inserted node is a LayerPositionAwareNode, we need to notify the next\n    // LayerPositionAwareNode one so it can re-position itself\n    if (instance is LayerPositionAwareNode) {\n      notifyMoveNextLayerPositionAwareNode(index + 1)\n    }\n    printNodesTree(\"MapNodeInserted\")\n  }\n\n  override fun insertTopDown(index: Int, instance: MapNode) {\n    // An applier should insert the node into the tree either in insertTopDown or insertBottomUp, not both.\n    // The insertTopDown method is called before the children of instance have been created and inserted\n    // into it. insertBottomUp is called after all children have been created and inserted.\n\n    // insertBottomUp is preferred here because MapNode trees are faster to build bottom-up(MapboxMapNode\n    // will be notified about child node changes), and the notifications are linear to the number of\n    // nodes inserted.\n  }\n\n  /**\n   * Indicates that [count] children of [current] should be moved from index [from] to index [to].\n   *\n   * The [to] index is relative to the position before the change, so, for example, to move an\n   * element at position 1 to after the element at position 2, [from] should be `1` and [to]\n   * should be `3`. If the elements were A B C D E, calling `move(1, 3, 1)` would result in the\n   * elements being reordered to A C B D E.\n   */\n  override fun move(from: Int, to: Int, count: Int) {\n    logD(TAG, \"move: $from, $to, $count\")\n    current.children.move(from, to, count)\n\n    // Let's move the children nodes in the tree\n    current.children.forEach { child ->\n      child.onMoved(current)\n    }\n    printNodesTree(\"MapNodeMoved\")\n  }\n\n  override fun remove(index: Int, count: Int) {\n    logD(TAG, \"remove: $index, $count\")\n    var layerPositionAwareNodeRemoved = false\n    repeat(count) { offset ->\n      val child = current.children[index + offset]\n      child.onRemoved(parent = current)\n      layerPositionAwareNodeRemoved = layerPositionAwareNodeRemoved or (child is LayerPositionAwareNode)\n    }\n    current.children.remove(index, count)\n    // If any of the removed nodes are a LayerPositionAwareNode, we need to notify the next\n    // LayerPositionAwareNode one so it can re-position itself\n    if (layerPositionAwareNodeRemoved) {\n      notifyMoveNextLayerPositionAwareNode(index)\n    }\n    printNodesTree(\"MapNodeRemoved\")\n  }\n\n  private fun notifyMoveNextLayerPositionAwareNode(index: Int) {\n    for (i in index until current.children.size) {\n      if (current.children[i] is LayerPositionAwareNode) {\n        current.children[i].onMoved(parent = current)\n        break\n      }\n    }\n  }\n\n  private fun printNodesTree(tag: String = TAG) {\n    // We don't know how many nodes are in the tree, so we only walk the tree when the logging\n    // level is DEBUG.\n    LogConfiguration.getLoggingLevel(tag)?.let {\n      if (it.ordinal <= LoggingLevel.DEBUG.ordinal) {\n        walkChildren(tag = tag, node = root)\n      }\n    }\n  }\n\n  private fun walkChildren(tag: String = TAG, prefix: String = \"\\t\", node: MapNode) {\n    logD(tag, \"$prefix - $node\")\n    node.children.forEach {\n      walkChildren(tag = tag, prefix = \"$prefix\\t\", node = it)\n    }\n  }\n\n  private companion object {\n    private const val TAG = \"MapApplier\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/internal/MapEventCancelableHolder.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.CameraChangedCallback\nimport com.mapbox.maps.CameraChangedCoalescedCallback\nimport com.mapbox.maps.MapIdleCallback\nimport com.mapbox.maps.MapLoadedCallback\nimport com.mapbox.maps.MapLoadingErrorCallback\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.RenderFrameFinishedCallback\nimport com.mapbox.maps.RenderFrameStartedCallback\nimport com.mapbox.maps.ResourceRequestCallback\nimport com.mapbox.maps.SourceAddedCallback\nimport com.mapbox.maps.SourceDataLoadedCallback\nimport com.mapbox.maps.SourceRemovedCallback\nimport com.mapbox.maps.StyleDataLoadedCallback\nimport com.mapbox.maps.StyleImageMissingCallback\nimport com.mapbox.maps.StyleImageRemoveUnusedCallback\nimport com.mapbox.maps.StyleLoadedCallback\n\ninternal class MapEventCancelableHolder constructor(private val mapboxMap: MapboxMap) {\n\n  private var mapLoadedCancelable: Cancelable? = null\n  private var mapIdleCancelable: Cancelable? = null\n  private var mapLoadingErrorCancelable: Cancelable? = null\n  private var styleLoadedCancelable: Cancelable? = null\n  private var styleDataLoadedCancelable: Cancelable? = null\n  private var sourceDataLoadedCancelable: Cancelable? = null\n  private var sourceAddedCancelable: Cancelable? = null\n  private var sourceRemovedCancelable: Cancelable? = null\n  private var styleImageMissingCancelable: Cancelable? = null\n  private var styleImageRemoveUnusedCancelable: Cancelable? = null\n  private var cameraChangedCancelable: Cancelable? = null\n  private var cameraChangedCoalescedCancelable: Cancelable? = null\n  private var renderFrameStartedCancelable: Cancelable? = null\n  private var renderFrameFinishedCancelable: Cancelable? = null\n  private var resourceRequestCancelable: Cancelable? = null\n\n  fun cancelAndSubscribeToMapLoaded(callback: MapLoadedCallback?) {\n    mapLoadedCancelable?.cancel()\n    mapLoadedCancelable = callback?.let(mapboxMap::subscribeMapLoaded)\n  }\n\n  fun cancelAndSubscribeToMapIdle(callback: MapIdleCallback?) {\n    mapIdleCancelable?.cancel()\n    mapIdleCancelable = callback?.let(mapboxMap::subscribeMapIdle)\n  }\n\n  fun cancelAndSubscribeToMapLoadingError(callback: MapLoadingErrorCallback?) {\n    mapLoadingErrorCancelable?.cancel()\n    mapLoadingErrorCancelable = callback?.let(mapboxMap::subscribeMapLoadingError)\n  }\n\n  fun cancelAndSubscribeToStyleLoaded(callback: StyleLoadedCallback?) {\n    styleLoadedCancelable?.cancel()\n    styleLoadedCancelable = callback?.let(mapboxMap::subscribeStyleLoaded)\n  }\n\n  fun cancelAndSubscribeToStyleDataLoaded(callback: StyleDataLoadedCallback?) {\n    styleDataLoadedCancelable?.cancel()\n    styleDataLoadedCancelable = callback?.let(mapboxMap::subscribeStyleDataLoaded)\n  }\n\n  fun cancelAndSubscribeToSourceDataLoaded(callback: SourceDataLoadedCallback?) {\n    sourceDataLoadedCancelable?.cancel()\n    sourceDataLoadedCancelable = callback?.let(mapboxMap::subscribeSourceDataLoaded)\n  }\n\n  fun cancelAndSubscribeToSourceAdded(callback: SourceAddedCallback?) {\n    sourceAddedCancelable?.cancel()\n    sourceAddedCancelable = callback?.let(mapboxMap::subscribeSourceAdded)\n  }\n\n  fun cancelAndSubscribeToSourceRemoved(callback: SourceRemovedCallback?) {\n    sourceRemovedCancelable?.cancel()\n    sourceRemovedCancelable = callback?.let(mapboxMap::subscribeSourceRemoved)\n  }\n\n  fun cancelAndSubscribeToStyleImageMissing(callback: StyleImageMissingCallback?) {\n    styleImageMissingCancelable?.cancel()\n    styleImageMissingCancelable = callback?.let(mapboxMap::subscribeStyleImageMissing)\n  }\n\n  fun cancelAndSubscribeToStyleImageRemoveUnused(callback: StyleImageRemoveUnusedCallback?) {\n    styleImageRemoveUnusedCancelable?.cancel()\n    styleImageRemoveUnusedCancelable = callback?.let(mapboxMap::subscribeStyleImageRemoveUnused)\n  }\n\n  fun cancelAndSubscribeToCameraChanged(callback: CameraChangedCallback?) {\n    cameraChangedCancelable?.cancel()\n    cameraChangedCancelable = callback?.let(mapboxMap::subscribeCameraChanged)\n  }\n\n  @MapboxExperimental\n  fun cancelAndSubscribeToCameraChangedCoalesced(callback: CameraChangedCoalescedCallback?) {\n    cameraChangedCoalescedCancelable?.cancel()\n    cameraChangedCoalescedCancelable = callback?.let(mapboxMap::subscribeCameraChangedCoalesced)\n  }\n\n  fun cancelAndSubscribeToRenderFrameStarted(callback: RenderFrameStartedCallback?) {\n    renderFrameStartedCancelable?.cancel()\n    renderFrameStartedCancelable = callback?.let(mapboxMap::subscribeRenderFrameStarted)\n  }\n\n  fun cancelAndSubscribeToRenderFrameFinished(callback: RenderFrameFinishedCallback?) {\n    renderFrameFinishedCancelable?.cancel()\n    renderFrameFinishedCancelable = callback?.let(mapboxMap::subscribeRenderFrameFinished)\n  }\n\n  fun cancelAndSubscribeToResourceRequest(callback: ResourceRequestCallback?) {\n    resourceRequestCancelable?.cancel()\n    resourceRequestCancelable = callback?.let(mapboxMap::subscribeResourceRequest)\n  }\n\n  fun cancelAll() {\n    mapLoadedCancelable?.cancel()\n    mapIdleCancelable?.cancel()\n    mapLoadingErrorCancelable?.cancel()\n    styleLoadedCancelable?.cancel()\n    styleDataLoadedCancelable?.cancel()\n    sourceDataLoadedCancelable?.cancel()\n    sourceAddedCancelable?.cancel()\n    sourceRemovedCancelable?.cancel()\n    styleImageMissingCancelable?.cancel()\n    styleImageRemoveUnusedCancelable?.cancel()\n    cameraChangedCancelable?.cancel()\n    renderFrameStartedCancelable?.cancel()\n    renderFrameFinishedCancelable?.cancel()\n    resourceRequestCancelable?.cancel()\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/internal/MapPreviewPlaceholder.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport androidx.compose.foundation.Canvas\nimport androidx.compose.foundation.background\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.drawscope.Stroke\nimport androidx.compose.ui.unit.dp\n\n/**\n * A place holder to show the Map in Android Studio Preview.\n */\n@Composable\n@JvmSynthetic\ninternal fun MapPreviewPlaceHolder(\n  modifier: Modifier,\n  placeholderColor: Color = Color(0xFFD2D2D9),\n  strokeWidthInDp: Int = 5,\n  strokeColor: Color = Color.Blue\n) {\n  Canvas(modifier = modifier.background(placeholderColor)) {\n    val canvasWidth = size.width\n    val canvasHeight = size.height\n    drawRect(\n      color = strokeColor,\n      size = size,\n      style = Stroke(width = strokeWidthInDp.dp.toPx())\n    )\n    drawLine(\n      start = Offset(x = canvasWidth, y = 0f),\n      end = Offset(x = 0f, y = canvasHeight),\n      strokeWidth = strokeWidthInDp.dp.toPx(),\n      color = strokeColor\n    )\n    drawLine(\n      start = Offset(x = 0f, y = 0f),\n      end = Offset(x = canvasWidth, y = canvasHeight),\n      strokeWidth = strokeWidthInDp.dp.toPx(),\n      color = strokeColor\n    )\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/internal/MapViewLifecycle.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport android.annotation.SuppressLint\nimport android.content.ComponentCallbacks2\nimport android.content.res.Configuration\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.platform.LocalLifecycleOwner\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleEventObserver\nimport com.mapbox.maps.MapView\n\n/**\n * Handle the lifecycle of [MapView] in compose.\n *\n * Note: Some logic in [MapViewLifecycle] overlaps with the [LifecyclePlugin] of the main SDK,\n * the main difference is that it also clean up the [MapView] during the [DisposableEffect].onDispose,\n * which typically happens the the [MapView] is enabled/disabled by a flag during recomposition.\n *\n * When [LifecyclePlugin] is also in use, the `onStart`/`onStop`/`onDestroy` might be called twice\n * in some use cases, but as we guard the duplicated `onStart`/`onStop`/`onDestroy` calls through\n * internal lifecycle states in [MapController], duplicated calls will be bypassed, there shouldn't\n * be an issue.\n */\n@Composable\n@JvmSynthetic\n@SuppressLint(\"Lifecycle\")\ninternal fun MapViewLifecycle(mapView: MapView) {\n  val context = LocalContext.current\n  val lifecycle = LocalLifecycleOwner.current.lifecycle\n  DisposableEffect(context, lifecycle, mapView) {\n    val lifecycleEventObserver = mapView.lifecycleEventObserver()\n    val callbacks = mapView.componentCallbacks2()\n\n    lifecycle.addObserver(lifecycleEventObserver)\n    context.registerComponentCallbacks(callbacks)\n\n    onDispose {\n      lifecycle.removeObserver(lifecycleEventObserver)\n      context.unregisterComponentCallbacks(callbacks)\n    }\n  }\n  DisposableEffect(mapView) {\n    onDispose {\n      mapView.onStop()\n      mapView.onDestroy()\n      mapView.removeAllViews()\n    }\n  }\n}\n\n@SuppressLint(\"Lifecycle\")\nprivate fun MapView.lifecycleEventObserver(): LifecycleEventObserver =\n  LifecycleEventObserver { _, event ->\n    when (event) {\n      Lifecycle.Event.ON_CREATE, Lifecycle.Event.ON_PAUSE, Lifecycle.Event.ON_DESTROY -> {\n        // no-ops, onDestroy handled in DisposeEffect.onDispose\n      }\n      Lifecycle.Event.ON_START -> this.onStart()\n      Lifecycle.Event.ON_STOP -> this.onStop()\n      Lifecycle.Event.ON_RESUME -> this.onResume()\n\n      else -> throw IllegalStateException()\n    }\n  }\n\nprivate fun MapView.componentCallbacks2(): ComponentCallbacks2 =\n  object : ComponentCallbacks2 {\n    override fun onConfigurationChanged(config: Configuration) {\n      // no-ops\n    }\n\n    @SuppressLint(\"Lifecycle\")\n    override fun onLowMemory() {\n      this@componentCallbacks2.onLowMemory()\n    }\n\n    @SuppressLint(\"Lifecycle\")\n    override fun onTrimMemory(level: Int) {\n      when (level) {\n        ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL, ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW -> {\n          this@componentCallbacks2.onLowMemory()\n        }\n        ComponentCallbacks2.TRIM_MEMORY_BACKGROUND, ComponentCallbacks2.TRIM_MEMORY_COMPLETE, ComponentCallbacks2.TRIM_MEMORY_MODERATE, ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE, ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN -> Unit\n      }\n    }\n  }"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/internal/MapboxMapNode.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.OnMapLongClickListener\nimport com.mapbox.maps.plugin.gestures.gestures\n\n/**\n * MapboxMapNode to observe/update the input arguments of MapboxMap.\n */\nprivate class MapboxMapNode(\n  val controller: MapView,\n  initialClickListener: OnMapClickListener?,\n  initialLongClickListener: OnMapLongClickListener?,\n) : MapNode() {\n  var clickListener: OnMapClickListener? = initialClickListener\n    set(value) {\n      controller.gestures.apply {\n        field?.let {\n          removeOnMapClickListener(it)\n        }\n        value?.let {\n          addOnMapClickListener(it)\n        }\n      }\n      field = value\n    }\n  var longClickListener: OnMapLongClickListener? = initialLongClickListener\n    set(value) {\n      controller.gestures.apply {\n        field?.let {\n          removeOnMapLongClickListener(it)\n        }\n        value?.let {\n          addOnMapLongClickListener(it)\n        }\n      }\n      field = value\n    }\n\n  override fun onAttached(parent: MapNode) {\n    controller.gestures.apply {\n      clickListener?.let {\n        addOnMapClickListener(it)\n      }\n      longClickListener?.let {\n        addOnMapLongClickListener(it)\n      }\n    }\n  }\n\n  override fun onRemoved(parent: MapNode) {\n    cleanUp()\n  }\n\n  override fun onClear() {\n    cleanUp()\n  }\n\n  private fun cleanUp() {\n    controller.gestures.apply {\n      clickListener?.let {\n        removeOnMapClickListener(it)\n      }\n      longClickListener?.let {\n        removeOnMapLongClickListener(it)\n      }\n    }\n  }\n\n  override fun toString(): String {\n    return \"MapboxMapNode()\"\n  }\n}\n\n@JvmSynthetic\n@Composable\ninternal fun MapboxMapComposeNode(\n  onMapClickListener: OnMapClickListener?,\n  onMapLongClickListener: OnMapLongClickListener?,\n) {\n  val mapApplier = currentComposer.applier as MapApplier\n  ComposeNode<MapboxMapNode, MapApplier>(\n    factory = {\n      MapboxMapNode(\n        mapApplier.mapView,\n        onMapClickListener,\n        onMapLongClickListener,\n      )\n    },\n    update = {\n      // input arguments updater\n      update(onMapClickListener) { listener ->\n        this.clickListener = listener\n      }\n      update(onMapLongClickListener) { listener ->\n        this.longClickListener = listener\n      }\n    }\n  )\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/internal/SettingsUtils.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettings\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettingsInterface\n\n/**\n * Apply [GesturesSettings] to the [GesturesSettingsInterface] in a single call.\n */\ninternal fun GesturesSettingsInterface.applySettings(gesturesSettings: GesturesSettings) {\n  this.updateSettings {\n    rotateEnabled = gesturesSettings.rotateEnabled\n    pinchToZoomEnabled = gesturesSettings.pinchToZoomEnabled\n    scrollEnabled = gesturesSettings.scrollEnabled\n    simultaneousRotateAndPinchToZoomEnabled =\n      gesturesSettings.simultaneousRotateAndPinchToZoomEnabled\n    pitchEnabled = gesturesSettings.pitchEnabled\n    scrollMode = gesturesSettings.scrollMode\n    doubleTapToZoomInEnabled = gesturesSettings.doubleTapToZoomInEnabled\n    doubleTouchToZoomOutEnabled = gesturesSettings.doubleTouchToZoomOutEnabled\n    quickZoomEnabled = gesturesSettings.quickZoomEnabled\n    focalPoint = gesturesSettings.focalPoint\n    pinchToZoomDecelerationEnabled = gesturesSettings.pinchToZoomDecelerationEnabled\n    rotateDecelerationEnabled = gesturesSettings.rotateDecelerationEnabled\n    scrollDecelerationEnabled = gesturesSettings.scrollDecelerationEnabled\n    increaseRotateThresholdWhenPinchingToZoom =\n      gesturesSettings.increaseRotateThresholdWhenPinchingToZoom\n    increasePinchToZoomThresholdWhenRotating =\n      gesturesSettings.increasePinchToZoomThresholdWhenRotating\n    zoomAnimationAmount = gesturesSettings.zoomAnimationAmount\n    pinchScrollEnabled = gesturesSettings.pinchScrollEnabled\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/internal/StyleLifecycleAwareNode.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport androidx.annotation.CallSuper\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.style.internal.StyleAwareNode\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.launch\n\n/**\n * Nodes inheriting from this class can use [dispatchWhenReady] to apply actions that require style\n * to be ready before applying the action.\n */\ninternal abstract class StyleLifecycleAwareNode(\n    private val mapStyleManager: MapboxStyleManager,\n    private val coroutineScope: CoroutineScope\n) : MapNode() {\n  private val styleManagerFlow: MutableStateFlow<MapboxStyleManager?> = MutableStateFlow(null)\n\n  @CallSuper\n  override fun onAttached(parent: MapNode) {\n    super.onAttached(parent)\n    updateStyleManagerState(parent)\n  }\n\n  private fun updateStyleManagerState(parent: MapNode) {\n    when (parent) {\n      is StyleAwareNode -> coroutineScope.launch {\n        parent.mapStyleNode.styleDataLoaded.firstOrNull()?.let {\n          styleManagerFlow.value = mapStyleManager\n        }\n      }\n\n      else -> styleManagerFlow.value = mapStyleManager\n    }\n  }\n\n  protected fun dispatchWhenReady(action: (MapboxStyleManager) -> Unit) {\n    val mapboxStyleManager = styleManagerFlow.value\n    // If we have the style manager, we can apply the action immediately\n    if (mapboxStyleManager != null) {\n      action(mapboxStyleManager)\n    } else {\n      // Otherwise, we need to wait for the style manager to be available\n      coroutineScope.launch {\n        styleManagerFlow.filterNotNull().first().apply(action)\n      }\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/ornaments/attribution/MapAttributionScope.kt",
    "content": "package com.mapbox.maps.extension.compose.ornaments.attribution\n\nimport android.content.ActivityNotFoundException\nimport android.content.Intent\nimport android.net.Uri\nimport android.widget.Toast\nimport androidx.annotation.StringRes\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.BoxScope\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.wrapContentHeight\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.foundation.text.ClickableText\nimport androidx.compose.material.AlertDialog\nimport androidx.compose.material.Text\nimport androidx.compose.material.TextButton\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.res.colorResource\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.AnnotatedString\nimport androidx.compose.ui.text.SpanStyle\nimport androidx.compose.ui.text.buildAnnotatedString\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.withStyle\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.compose.ui.window.DialogProperties\nimport com.mapbox.annotation.MapboxDelicateApi\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.common.Cancelable\nimport com.mapbox.common.geofencing.GeofencingError\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.SourceDataLoadedType\nimport com.mapbox.maps.StyleAttributionsChangedCallback\nimport com.mapbox.maps.extension.compose.MapboxMapScopeMarker\nimport com.mapbox.maps.extension.compose.R\nimport com.mapbox.maps.extension.compose.ornaments.attribution.internal.AttributionComposePlugin\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.attribution.Attribution\nimport com.mapbox.maps.plugin.attribution.AttributionParserConfig\nimport com.mapbox.maps.plugin.attribution.isMapboxFeedback\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport java.util.Objects\nimport kotlin.coroutines.resume\n\n/**\n * A [MapAttributionScope] provides a scope for adding [Attribution] ornament.\n */\n@Suppress(\"NAMED_ARGUMENTS_NOT_ALLOWED\")\n@MapboxMapScopeMarker\n@Immutable\npublic class MapAttributionScope internal constructor(\n  private val mapView: MapView,\n  private val boxScope: BoxScope\n) {\n  /**\n   * Add a [Attribution] ornament to the map.\n   *\n   * Please note that it's **required** to show Mapbox Attribution button in your map. See [Mapbox ToS](https://www.mapbox.com/legal/tos)\n   *\n   * By default, the [Attribution] will be placed to the [Alignment.BottomStart] of the map with padding of 92dp, 4dp, 4dp, 4dp.\n   *\n   * @param modifier Modifier to be applied to the [Attribution].\n   * @param contentPadding The default padding applied to the [Attribution], paddings from [modifier] will be applied on top of this default padding.\n   * @param alignment The alignment of the [Attribution] within the Map.\n   * @param iconColor The color tint applied to the attribution icon. Defaults to Mapbox blue (#1E8CAB).\n   * @param attributionDialog Defines AlertDialog when the attribution is clicked.\n   * @param telemetryDialog Defines TelemetryDialog when the Mapbox telemetry is clicked.\n   */\n  @Composable\n  public fun Attribution(\n    modifier: Modifier = Modifier,\n    contentPadding: PaddingValues = PaddingValues(92.dp, 4.dp, 4.dp, 4.dp),\n    alignment: Alignment = Alignment.BottomStart,\n    iconColor: Color = Color(0xFF1E8CAB),\n    attributionDialog: @Composable (\n      attributions: List<Attribution>,\n      onDismissRequest: () -> Unit,\n      onAttributionClick: (Attribution) -> Unit\n    ) -> Unit = { attributions, onDismissRequest, onAttributionClick ->\n      AttributionDialog(\n        attributions = attributions,\n        onDismissRequest = onDismissRequest,\n        onAttributionClick = onAttributionClick\n      )\n    },\n    telemetryDialog: @Composable (\n      onDismissRequest: () -> Unit,\n      onMoreInfo: () -> Unit,\n      onDisagree: () -> Unit,\n      onAgree: () -> Unit\n    ) -> Unit = { onDismissRequest, onMoreInfo, onDisagree, onAgree ->\n      TelemetryDialog(\n        onDismissRequest = onDismissRequest,\n        onMoreInfo = onMoreInfo,\n        onDisagree = onDisagree,\n        onAgree = onAgree\n      )\n    }\n  ) {\n    Attribution(\n      modifier = modifier,\n      contentPadding = contentPadding,\n      alignment = alignment,\n      iconColor = iconColor,\n      attributionDialog = attributionDialog,\n      telemetryDialog = telemetryDialog,\n      geofencingConsentDialog = { onDismissRequest, onDisagree, onAgree, currentUserConsent ->\n        GeofencingConsentDialog(\n          onDismissRequest = onDismissRequest,\n          onDisagree = onDisagree,\n          onAgree = onAgree,\n          currentUserConsent = currentUserConsent\n        )\n      }\n    )\n  }\n\n  /**\n   * Add a [Attribution] ornament to the map.\n   *\n   * Please note that it's **required** to show Mapbox Attribution button in your map. See [Mapbox ToS](https://www.mapbox.com/legal/tos)\n   *\n   * By default, the [Attribution] will be placed to the [Alignment.BottomStart] of the map with padding of 92dp, 4dp, 4dp, 4dp.\n   *\n   * @param modifier Modifier to be applied to the [Attribution].\n   * @param contentPadding The default padding applied to the [Attribution], paddings from [modifier] will be applied on top of this default padding.\n   * @param alignment The alignment of the [Attribution] within the Map.\n   * @param iconColor The color tint applied to the attribution icon. Defaults to Mapbox blue (#1E8CAB).\n   * @param attributionDialog Defines AlertDialog when the attribution is clicked.\n   * @param telemetryDialog Defines TelemetryDialog when the Mapbox telemetry is clicked.\n   * @param geofencingConsentDialog Defines GeofencingConsentDialog when the Mapbox Geofencing is clicked.\n   */\n  @OptIn(MapboxExperimental::class, MapboxDelicateApi::class)\n  @Composable\n  public fun Attribution(\n    modifier: Modifier = Modifier,\n    contentPadding: PaddingValues = PaddingValues(92.dp, 4.dp, 4.dp, 4.dp),\n    alignment: Alignment = Alignment.BottomStart,\n    iconColor: Color = Color(0xFF1E8CAB),\n    attributionDialog: @Composable (\n      attributions: List<Attribution>,\n      onDismissRequest: () -> Unit,\n      onAttributionClick: (Attribution) -> Unit\n    ) -> Unit = { attributions, onDismissRequest, onAttributionClick ->\n      AttributionDialog(\n        attributions = attributions,\n        onDismissRequest = onDismissRequest,\n        onAttributionClick = onAttributionClick\n      )\n    },\n    telemetryDialog: @Composable (\n      onDismissRequest: () -> Unit,\n      onMoreInfo: () -> Unit,\n      onDisagree: () -> Unit,\n      onAgree: () -> Unit\n    ) -> Unit = { onDismissRequest, onMoreInfo, onDisagree, onAgree ->\n      TelemetryDialog(\n        onDismissRequest = onDismissRequest,\n        onMoreInfo = onMoreInfo,\n        onDisagree = onDisagree,\n        onAgree = onAgree\n      )\n    },\n    geofencingConsentDialog: @Composable (\n      onDismissRequest: () -> Unit,\n      onDisagree: () -> Unit,\n      onAgree: () -> Unit,\n      currentUserConsent: Boolean\n    ) -> Unit = { onDismissRequest, onDisagree, onAgree, currentUserConsent ->\n      GeofencingConsentDialog(\n        onDismissRequest = onDismissRequest,\n        onDisagree = onDisagree,\n        onAgree = onAgree,\n        currentUserConsent = currentUserConsent,\n      )\n    }\n  ) {\n    val attributionState: AttributionState = remember {\n      AttributionState()\n    }\n    val coroutineScope = rememberCoroutineScope()\n    var showAttributionDialog by remember {\n      mutableStateOf(false)\n    }\n\n    var showTelemetryDialog by remember {\n      mutableStateOf(false)\n    }\n    var showGeofencingConsentDialog by remember {\n      mutableStateOf(false)\n    }\n\n    var userSelectedTelemetryEnableState: Boolean? by remember {\n      mutableStateOf(null)\n    }\n\n    var userSelectedGeofencingUserConsentState: Boolean? by remember {\n      mutableStateOf(null)\n    }\n\n    var userConsentState: UserConsentState? by remember {\n      mutableStateOf(null)\n    }\n\n    // Whenever telemetryEnableState or geofencingUserConsentState is updated by the user,\n    // pass it through to attributionState.\n    LaunchedEffect(\n      userSelectedTelemetryEnableState,\n      userSelectedGeofencingUserConsentState,\n    ) {\n      attributionState.userConsentState?.let { state ->\n        val builder = state.toBuilder()\n        userSelectedTelemetryEnableState?.let { builder.setTelemetryEnableState(it) }\n        userSelectedGeofencingUserConsentState?.let { builder.setGeofencingUserConsentState(it) }\n        userConsentState = builder.build()\n      }\n    }\n\n    // Show Telemetry Dialog\n    if (showTelemetryDialog) {\n      telemetryDialog(\n        onDismissRequest = {\n          showTelemetryDialog = false\n        },\n        onMoreInfo = {\n          showWebPage(mapView.context.getString(R.string.mapbox_telemetryLink))\n          showTelemetryDialog = false\n        },\n        onDisagree = {\n          userSelectedTelemetryEnableState = false\n          showTelemetryDialog = false\n        },\n        onAgree = {\n          userSelectedTelemetryEnableState = true\n          showTelemetryDialog = false\n        }\n      )\n    }\n\n    // Show Geofencing consent Dialog\n    if (showGeofencingConsentDialog) {\n      geofencingConsentDialog(\n        onDismissRequest = {\n          showGeofencingConsentDialog = false\n        },\n        onDisagree = {\n          userSelectedGeofencingUserConsentState = false\n          showGeofencingConsentDialog = false\n        },\n        onAgree = {\n          userSelectedGeofencingUserConsentState = true\n          showGeofencingConsentDialog = false\n        },\n        attributionState.userConsentState?.geofencingUserConsentState ?: true\n      )\n    }\n\n    // Show Attribution Dialog\n    if (showAttributionDialog) {\n      attributionDialog(\n        attributions = attributionState.attributions,\n        onDismissRequest = {\n          showAttributionDialog = false\n        },\n        onAttributionClick = { attribution ->\n          showAttributionDialog = false\n          when (attribution.url) {\n            Attribution.ABOUT_TELEMETRY_URL -> showTelemetryDialog = true\n            Attribution.GEOFENCING_URL_MARKER -> showGeofencingConsentDialog = true\n            else -> {\n              if (attribution.url.isNotEmpty()) {\n                if (attribution.isMapboxFeedback()) {\n                  coroutineScope.launch {\n                    val url = attributionState.buildMapboxFeedbackUrl()\n                    showWebPage(url)\n                  }\n                } else {\n                  showWebPage(attribution.url)\n                }\n              } else {\n                logE(TAG, \"Attribution url for ${attribution.title} is empty\")\n              }\n            }\n          }\n        }\n      )\n    }\n\n    // Show Attribution image button.\n    Image(\n      modifier = with(boxScope) {\n        Modifier\n            .padding(contentPadding)\n            .then(modifier)\n            .align(alignment)\n            .clickable {\n                showAttributionDialog = true\n            }\n      },\n      painter = painterResource(id = R.drawable.mapbox_attribution_default),\n      contentDescription = \"Mapbox Attribution\",\n      colorFilter = ColorFilter.tint(color = iconColor)\n    )\n\n    AttributionControl(\n      userConsentState = userConsentState,\n      attributionState = attributionState\n    )\n  }\n\n  /**\n   * Adds a headless [AttributionControl] to the map for programmatic attribution management.\n   *\n   * This control provides no visual UI itself, instead exposing [UserConsentState] and [AttributionState] data\n   * to enable custom attribution interfaces elsewhere in your application. Use this when\n   * implementing custom attribution UI while maintaining ToS compliance.\n   *\n   * ## Legal Requirements\n   * **Mapbox attribution is mandatory** per [Mapbox Terms of Service](https://www.mapbox.com/legal/tos).\n   * This control helps you create custom UI while meeting these requirements.\n   *\n   * ## Telemetry and Privacy\n   * Your users should be in charge of their own location data and when it is shared. By default,\n   * whenever your application causes the user's location to be gathered, it sends de-identified\n   * location and usage data to Mapbox. If you're developing a native app with one of the Mapbox\n   * mobile SDKs, our terms of service require that you provide a telemetry opt-out option within\n   * your app for all end users. The default attribution control includes an opt out button. If you\n   * hide the attribution control, you must provide an alternative opt out method your users can use.\n   * You are responsible for allowing your users to opt out of Mapbox Telemetry.\n   *\n   * See [guide](https://docs.mapbox.com/help/dive-deeper/mobile-apps/#telemetry) for more info.\n   *\n   * ## Usage Example\n   * ```kotlin\n   * val attributionState = remember { AttributionState() }\n   * var userConsent: UserConsentState? by remember { mutableStateOf(null) }\n   *\n   * MapboxMap(\n   *   attribution = {\n   *     // Headless attribution control for custom UI\n   *     AttributionControl(\n   *       userConsentState = userConsent,\n   *       attributionState = attributionState\n   *     )\n   *   }\n   * )\n   *\n   * // Use attributionState.attributions and attributionState.userConsentState\n   * // in your custom UI components\n   * ```\n   *\n   * ## Usage Notes\n   * - Attribution data may not be immediately available during map initialization, and it might be updated whenever style source is loaded.\n   *\n   * @param userConsentState User consent configuration for telemetry and geofencing.\n   * When `null`, existing consent state remains unchanged. Use to programmatically\n   * update user preferences from your custom UI.\n   *\n   * @param attributionState Current attribution data containing available attributions\n   * and user consent information for building custom UI.\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  @Composable\n  public fun AttributionControl(\n    userConsentState: UserConsentState?,\n    attributionState: AttributionState\n  ) {\n    val pluginId = remember {\n      getNextId()\n    }\n\n    var attributionComposePlugin: AttributionComposePlugin? by remember {\n      mutableStateOf(null)\n    }\n\n    DisposableEffect(Unit) {\n      // Initialise AttributionComposePlugin when entering composition\n      mapView.createPlugin(\n        Plugin.Custom(\n          id = pluginId,\n          instance = AttributionComposePlugin()\n        )\n      )\n      attributionComposePlugin = mapView.getPlugin(pluginId)\n      onDispose {\n        // Remove AttributionComposePlugin when leaving composition\n        mapView.removePlugin(pluginId)\n        attributionComposePlugin = null\n      }\n    }\n\n    attributionState.BindToMap(mapView, attributionComposePlugin)\n\n    // Whenever telemetryEnableState is updated by user, pass it through to mapAttributionDelegate.\n    LaunchedEffect(userConsentState?.telemetryEnableState, attributionComposePlugin) {\n      userConsentState?.telemetryEnableState?.let { telemetryEnableState ->\n        attributionComposePlugin?.let {\n          it.mapAttributionDelegate.telemetry().userTelemetryRequestState = telemetryEnableState\n          // Update UserConsentState in attributionState\n          attributionState._userConsentState.value = UserConsentState.Builder()\n            .setTelemetryEnableState(it.mapAttributionDelegate.telemetry().userTelemetryRequestState)\n            .setGeofencingUserConsentState(\n              it.mapAttributionDelegate.geofencingConsent().getUserConsent()\n            )\n            .build()\n          logD(TAG, \"User set telemetry state: $telemetryEnableState\")\n        }\n      }\n    }\n\n    // Whenever geofencingUserConsentState is updated by the user, pass it through to mapAttributionDelegate.\n    LaunchedEffect(userConsentState?.geofencingUserConsentState, attributionComposePlugin) {\n      userConsentState?.geofencingUserConsentState?.let { geofencingUserConsentState ->\n        attributionComposePlugin?.let { plugin ->\n          val error: GeofencingError? = suspendCancellableCoroutine { continuation ->\n            plugin.mapAttributionDelegate.geofencingConsent()\n              .setUserConsent(geofencingUserConsentState) {\n                continuation.resume(it.error)\n                // Update UserConsentState in attributionState\n                attributionState._userConsentState.value = UserConsentState.Builder()\n                  .setTelemetryEnableState(plugin.mapAttributionDelegate.telemetry().userTelemetryRequestState)\n                  .setGeofencingUserConsentState(\n                    plugin.mapAttributionDelegate.geofencingConsent().getUserConsent()\n                  )\n                  .build()\n                logD(\n                  TAG,\n                  \"User set geofencingUserConsentState: $geofencingUserConsentState, error: ${it.error}\"\n                )\n              }\n          }\n          error?.let {\n            logW(\"GeofencingConsent\", \"Unable to set user consent: ${it.type}\")\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Represents user consent preferences for data collection and location services.\n   *\n   * This data class enables programmatic management of user consent states for telemetry\n   * and geofencing features, allowing you to implement custom consent UI flows outside\n   * of the default attribution interface.\n   *\n   * ## Telemetry and Privacy\n   * Your users should be in charge of their own location data and when it is shared. By default,\n   * whenever your application causes the user's location to be gathered, it sends de-identified\n   * location and usage data to Mapbox. If you're developing a native app with one of the Mapbox\n   * mobile SDKs, our terms of service require that you provide a telemetry opt-out option within\n   * your app for all end users. The default attribution control includes an opt out button. If you\n   * hide the attribution control, you must provide an alternative opt out method your users can use.\n   * You are responsible for allowing your users to opt out of Mapbox Telemetry.\n   *\n   * See [guide](https://docs.mapbox.com/help/dive-deeper/mobile-apps/#telemetry) for more info.\n   */\n  @Stable\n  @MapboxExperimental\n  public class UserConsentState private constructor(\n    /**\n     * Telemetry opt-in state.\n     */\n    public val telemetryEnableState: Boolean,\n    /**\n     * Geofencing opt-in state.\n     */\n    public val geofencingUserConsentState: Boolean,\n  ) {\n    /**\n     * Calculate the hash code for this object.\n     */\n    override fun hashCode(): Int {\n      return Objects.hash(telemetryEnableState, geofencingUserConsentState)\n    }\n\n    /**\n     * Determine if this object is equal to the specified [other] object.\n     */\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (javaClass != other?.javaClass) return false\n\n      other as UserConsentState\n\n      if (telemetryEnableState != other.telemetryEnableState) return false\n      if (geofencingUserConsentState != other.geofencingUserConsentState) return false\n\n      return true\n    }\n\n    /**\n     * Return a string representation of this object.\n     */\n    override fun toString(): String {\n      return \"UserConsentState(telemetryEnableState=$telemetryEnableState,geofencingUserConsentState=$geofencingUserConsentState)\"\n    }\n\n    /**\n     * Builder for [UserConsentState].\n     */\n    @MapboxExperimental\n    public class Builder {\n      /**\n       * Telemetry opt-in state.\n       */\n      @set:JvmSynthetic\n      public var telemetryEnableState: Boolean = true\n\n      /**\n       * Geofencing opt-in state.\n       */\n      @set:JvmSynthetic\n      public var geofencingUserConsentState: Boolean = true\n\n      /**\n       * Set the telemetry opt-in state.\n       */\n      public fun setTelemetryEnableState(telemetryEnableState: Boolean): Builder = apply {\n        this.telemetryEnableState = telemetryEnableState\n      }\n\n      /**\n       * Set the geofencing opt-in state.\n       */\n      public fun setGeofencingUserConsentState(geofencingUserConsentState: Boolean): Builder =\n        apply {\n          this.geofencingUserConsentState = geofencingUserConsentState\n        }\n\n      /**\n       * Build an [UserConsentState].\n       */\n      public fun build(): UserConsentState {\n        return UserConsentState(\n          telemetryEnableState = telemetryEnableState,\n          geofencingUserConsentState = geofencingUserConsentState,\n        )\n      }\n    }\n\n    /**\n     * Build an [UserConsentState] with the current state.\n     */\n    public fun toBuilder(): Builder {\n      return Builder()\n        .setTelemetryEnableState(telemetryEnableState)\n        .setGeofencingUserConsentState(geofencingUserConsentState)\n    }\n  }\n\n  /**\n   * Complete attribution state containing both attribution data and user consent preferences.\n   *\n   * This data class combines attribution information (such as data sources and copyright notices)\n   * with user consent settings, enabling comprehensive attribution management for custom UI\n   * implementations that need to display both attribution and handle user consent.\n   *\n   * ## State Management\n   * - Contains current attribution list from active map style and data sources\n   * - Includes telemetry and geofencing consent states\n   * - Use with [AttributionControl] for programmatic state management\n   *\n   * ## Telemetry and Privacy\n   * Your users should be in charge of their own location data and when it is shared. By default,\n   * whenever your application causes the user's location to be gathered, it sends de-identified\n   * location and usage data to Mapbox. If you're developing a native app with one of the Mapbox\n   * mobile SDKs, our terms of service require that you provide a telemetry opt-out option within\n   * your app for all end users. The default attribution control includes an opt out button. If you\n   * hide the attribution control, you must provide an alternative opt out method your users can use.\n   * You are responsible for allowing your users to opt out of Mapbox Telemetry.\n   *\n   * See [guide](https://docs.mapbox.com/help/dive-deeper/mobile-apps/#telemetry) for more info.\n   */\n  @Stable\n  @MapboxExperimental\n  public class AttributionState {\n    private val attributionPluginFlow =\n      MutableStateFlow<Pair<MapView, AttributionComposePlugin>?>(null)\n\n    /**\n     * List of attributions to be shown in the [AttributionDialog].\n     */\n    private val _attributions: MutableState<List<Attribution>> = mutableStateOf(emptyList())\n\n    /**\n     * User consent state.\n     */\n    internal val _userConsentState: MutableState<UserConsentState?> = mutableStateOf(null)\n\n    /**\n     * List of attributions to be shown in the [AttributionDialog].\n     */\n    public val attributions: List<Attribution> by _attributions\n\n    /**\n     * User consent state.\n     */\n    public val userConsentState: UserConsentState? by _userConsentState\n\n    /**\n     * Build the Mapbox feedback url with the current map states.\n     */\n    public suspend fun buildMapboxFeedbackUrl(): String {\n      attributionPluginFlow.filterNotNull().first().apply {\n        return second.mapAttributionDelegate.buildMapBoxFeedbackUrl(first.context)\n      }\n    }\n\n    @Composable\n    private fun UpdateAttributionState(mapView: MapView, plugin: AttributionComposePlugin?) {\n      // Update user consent state for the first time\n      LaunchedEffect(plugin) {\n        if (plugin != null) {\n          _userConsentState.value = UserConsentState.Builder()\n            .setTelemetryEnableState(plugin.mapAttributionDelegate.telemetry().userTelemetryRequestState)\n            .setGeofencingUserConsentState(\n              plugin.mapAttributionDelegate.geofencingConsent().getUserConsent()\n            )\n            .build()\n          logD(\n            TAG,\n            \"AttributionComposePlugin(${plugin.hashCode()}) Load initial user consent state: $userConsentState \"\n          )\n        }\n      }\n\n      // Refresh the attributions when style changes, as for Standard style, the source events are hidden\n      DisposableEffect(plugin) {\n        var styleAttributionChangedCancelable: Cancelable? = null\n        if (plugin != null) {\n          // Refresh the attribution initially to show the Mapbox telemetry, feedback attributions etc, even without source attributions\n          updateAttributionState(mapView, plugin)\n          // Update attributions when style attribution is changed\n          // Used internal styleManager API to utlise this new StyleAttributionsChanged event.\n          styleAttributionChangedCancelable = mapView.mapboxMap.styleManager.subscribe(\n            StyleAttributionsChangedCallback {\n              logD(\n                TAG,\n                \"AttributionComposePlugin(${plugin.hashCode()}) StyleAttributionsChanged, refresh attributions\"\n              )\n              updateAttributionState(mapView, plugin)\n            }\n          )\n        }\n        onDispose {\n          styleAttributionChangedCancelable?.cancel()\n          styleAttributionChangedCancelable = null\n        }\n      }\n\n      // Refresh the attributions when source is added or removed in the runtime\n      DisposableEffect(plugin) {\n        var sourceAddedCancellable: Cancelable? = null\n        var sourceRemovedCancellable: Cancelable? = null\n        val sourceDataLoadedCancellable = hashMapOf<String, Cancelable>()\n        if (plugin != null) {\n          mapView.mapboxMap.apply {\n            // Update attributions when new source is added in the runtime\n            sourceAddedCancellable = subscribeSourceAdded { sourceAdded ->\n              sourceDataLoadedCancellable[sourceAdded.sourceId] =\n                subscribeSourceDataLoaded {\n                  // refresh the attribution only when the source metadata is loaded, otherwise the new attribution is not yet parsed\n                  if (it.type == SourceDataLoadedType.METADATA && it.sourceId == sourceAdded.sourceId) {\n                    logD(\n                      TAG,\n                      \"AttributionComposePlugin(${plugin.hashCode()}) source metadata loaded, refresh attributions\"\n                    )\n                    updateAttributionState(mapView, plugin)\n                    sourceDataLoadedCancellable.remove(sourceAdded.sourceId)?.cancel()\n                  }\n                }\n            }\n            // Update attribution when the source is removed\n            sourceRemovedCancellable = subscribeSourceRemoved {\n              updateAttributionState(mapView, plugin)\n            }\n          }\n        }\n        onDispose {\n          sourceAddedCancellable?.cancel()\n          sourceAddedCancellable = null\n          sourceRemovedCancellable?.cancel()\n          sourceRemovedCancellable = null\n          sourceDataLoadedCancellable.values.forEach { it.cancel() }\n          sourceDataLoadedCancellable.clear()\n        }\n      }\n    }\n\n    private fun updateAttributionState(mapView: MapView, plugin: AttributionComposePlugin) {\n      _attributions.value = plugin.mapAttributionDelegate.parseAttributions(\n        mapView.context,\n        AttributionParserConfig()\n      ).toMutableList().apply {\n        find { it.isMapboxFeedback() }?.let {\n          remove(it)\n          add(it.copy(url = plugin.mapAttributionDelegate.buildMapBoxFeedbackUrl(mapView.context)))\n        }\n      }\n        .toList()\n    }\n\n    @Composable\n    internal fun BindToMap(mapView: MapView, plugin: AttributionComposePlugin?) {\n      LaunchedEffect(plugin) {\n        if (plugin != null) {\n          attributionPluginFlow.value = mapView to plugin\n        }\n      }\n      UpdateAttributionState(mapView, plugin)\n    }\n  }\n\n  /**\n   * Build an [AttributionDialog] to be added to the [Attribution] ornament.\n   *\n   * @param attributions The list of [Attribution]s to be shown in the [AttributionDialog].\n   * @param onDismissRequest The callback to be invoked when the attribution is dismissed.\n   * @param onAttributionClick The callback to be invoked when a attribution is clicked.\n   */\n  @OptIn(ExperimentalComposeUiApi::class)\n  @Composable\n  public fun AttributionDialog(\n    attributions: List<Attribution>,\n    onDismissRequest: () -> Unit,\n    onAttributionClick: (attribution: Attribution) -> Unit,\n  ) {\n    AlertDialog(\n      onDismissRequest = onDismissRequest,\n      modifier = Modifier.padding(start = 10.dp, end = 10.dp),\n      confirmButton = { },\n      title = {\n        Text(\n          text = stringResource(id = R.string.mapbox_attributionsDialogTitle),\n          fontSize = 20.sp,\n          fontWeight = FontWeight.Bold\n        )\n      },\n      text = {\n        LazyColumn {\n          items(\n            attributions\n          ) { attribution ->\n            ClickableText(\n              text = attribution.toAnnotatedString(),\n              modifier = Modifier\n                  .padding(horizontal = 24.dp, vertical = 4.dp)\n                  .fillParentMaxWidth()\n                  .wrapContentHeight(),\n              onClick = {\n                onAttributionClick(attribution)\n              }\n            )\n          }\n        }\n      },\n      properties = DialogProperties(\n        // should be fully fixed in Compose 1.5, now using workaround from\n        // https://issuetracker.google.com/issues/221643630\n        usePlatformDefaultWidth = false\n      )\n    )\n  }\n\n  /**\n   * Build a [TelemetryDialog] to be added to the [AttributionDialog] when telemetry settings is clicked.\n   *\n   * @param onDismissRequest The callback to be invoked when the attribution is dismissed.\n   * @param onMoreInfo The callback to be invoked when more information is needed.\n   * @param onDisagree The callback to be invoked when user disagrees with the telemetry collection.\n   * @param onAgree The callback to be invoked when user agrees with the telemetry collection.\n   */\n  @Composable\n  public fun TelemetryDialog(\n    onDismissRequest: () -> Unit,\n    onMoreInfo: () -> Unit,\n    onDisagree: () -> Unit,\n    onAgree: () -> Unit\n  ) {\n    UserConsentDialog(\n      onDismissRequest = onDismissRequest,\n      onMoreInfo = onMoreInfo,\n      onDisagree = onDisagree,\n      onAgree = onAgree,\n      neutralStringId = R.string.mapbox_attributionTelemetryNeutral,\n      disagreeStringId = R.string.mapbox_attributionTelemetryNegative,\n      agreeStringId = R.string.mapbox_attributionTelemetryPositive,\n      titleId = R.string.mapbox_attributionTelemetryTitle,\n      bodyId = R.string.mapbox_attributionTelemetryMessage\n    )\n  }\n\n  /**\n   * Build a [GeofencingConsentDialog] to be added to the [AttributionDialog] when geofencing settings is clicked.\n   *\n   * @param onDismissRequest The callback to be invoked when the dialog is dismissed.\n   * @param onDisagree The callback to be invoked when user revokes consent for geofencing.\n   * @param onAgree The callback to be invoked when user grants consent for geofencing.\n   * @param currentUserConsent The current state of the user consent.\n   */\n  @Composable\n  public fun GeofencingConsentDialog(\n    onDismissRequest: () -> Unit,\n    onDisagree: () -> Unit,\n    onAgree: () -> Unit,\n    currentUserConsent: Boolean\n  ) {\n    val disagreeStringId =\n      if (currentUserConsent) R.string.mapbox_attributionGeofencingConsentedNegative else R.string.mapbox_attributionGeofencingRevokedNegative\n    val agreeStringId =\n      if (currentUserConsent) R.string.mapbox_attributionGeofencingConsentedPositive else R.string.mapbox_attributionGeofencingRevokedPositive\n    UserConsentDialog(\n      onDismissRequest = onDismissRequest,\n      onDisagree = onDisagree,\n      onAgree = onAgree,\n      disagreeStringId = disagreeStringId,\n      agreeStringId = agreeStringId,\n      titleId = R.string.mapbox_attributionGeofencingTitle,\n      bodyId = R.string.mapbox_attributionGeofencingMessage\n    )\n  }\n\n  @Composable\n  private fun UserConsentDialog(\n    onDismissRequest: () -> Unit,\n    onMoreInfo: (() -> Unit)? = null,\n    onDisagree: () -> Unit,\n    onAgree: () -> Unit,\n    @StringRes\n    neutralStringId: Int? = null,\n    @StringRes\n    disagreeStringId: Int,\n    @StringRes\n    agreeStringId: Int,\n    @StringRes\n    titleId: Int,\n    @StringRes\n    bodyId: Int,\n  ) {\n    val dialogButton = @Composable { onClick: () -> Unit, textResId: Int ->\n      TextButton(onClick) {\n        Text(stringResource(id = textResId).uppercase())\n      }\n    }\n    AlertDialog(\n      onDismissRequest = onDismissRequest,\n      buttons = {\n        Column(\n          modifier = Modifier\n              // The alert dialog `title` and `text` are padded 24.dp by default.\n            // To align the button text, we use 16.dp here because TextButton adds 8.dp padding around the text\n            .padding(horizontal = 16.dp)\n              .fillMaxWidth(),\n        ) {\n          if (onMoreInfo != null && neutralStringId != null) {\n            dialogButton(onMoreInfo, neutralStringId)\n          }\n\n          dialogButton(onDisagree, disagreeStringId)\n          dialogButton(onAgree, agreeStringId)\n        }\n      },\n      title = { Text(text = stringResource(id = titleId), fontWeight = FontWeight.Bold) },\n      text = { Text(text = stringResource(id = bodyId)) }\n    )\n  }\n\n  @Composable\n  private fun Attribution.toAnnotatedString(): AnnotatedString =\n    buildAnnotatedString {\n      withStyle(\n        style = SpanStyle(\n          fontSize = 13.sp,\n          color = colorResource(id = if (url.isEmpty()) R.color.mapbox_gray else R.color.mapbox_blue)\n        )\n      ) {\n        append(this@toAnnotatedString.title.uppercase())\n      }\n    }\n\n  private fun showWebPage(url: String) {\n    try {\n      val intent = Intent(Intent.ACTION_VIEW)\n      intent.data = Uri.parse(url)\n      mapView.context.startActivity(intent)\n    } catch (_: ActivityNotFoundException) {\n      Toast.makeText(\n        mapView.context,\n        R.string.mapbox_attributionErrorNoBrowser,\n        Toast.LENGTH_LONG\n      ).show()\n    } catch (t: Throwable) {\n      Toast.makeText(\n        mapView.context,\n        t.localizedMessage,\n        Toast.LENGTH_LONG\n      ).show()\n    }\n  }\n\n  private companion object {\n    private const val TAG = \"MapboxAttributionScope\"\n    private const val PLUGIN_ID = \"MAPBOX_ATTRIBUTION_COMPOSE_PLUGIN\"\n    private var INSTANCE_COUNT = 0\n    fun getNextId(): String {\n      return \"$PLUGIN_ID-${INSTANCE_COUNT++}\"\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/ornaments/attribution/internal/AttributionComposePlugin.kt",
    "content": "package com.mapbox.maps.extension.compose.ornaments.attribution.internal\n\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\n\n/**\n * Internal implementation of a [AttributionComposePlugin], which simply holds the reference to the\n * [MapAttributionDelegate].\n */\ninternal class AttributionComposePlugin : MapPlugin {\n  internal lateinit var mapAttributionDelegate: MapAttributionDelegate\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    mapAttributionDelegate = delegateProvider.mapAttributionDelegate\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/ornaments/compass/MapCompassScope.kt",
    "content": "package com.mapbox.maps.extension.compose.ornaments.compass\n\nimport androidx.compose.animation.AnimatedVisibility\nimport androidx.compose.animation.core.tween\nimport androidx.compose.animation.fadeIn\nimport androidx.compose.animation.fadeOut\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.gestures.awaitFirstDown\nimport androidx.compose.foundation.gestures.forEachGesture\nimport androidx.compose.foundation.gestures.waitForUpOrCancellation\nimport androidx.compose.foundation.layout.BoxScope\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.rotate\nimport androidx.compose.ui.input.pointer.PointerInputScope\nimport androidx.compose.ui.input.pointer.pointerInput\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.coroutine.cameraChangedCoalescedEvents\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.compose.MapboxMapScopeMarker\nimport com.mapbox.maps.extension.compose.R\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOwnerRegistry\nimport com.mapbox.maps.plugin.animation.camera\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.map\nimport kotlin.math.abs\n\n/**\n * A [MapCompassScope] provides a scope for adding [Compass] ornament.\n */\n@MapboxMapScopeMarker\n@Immutable\npublic class MapCompassScope internal constructor(\n  private val mapView: MapView,\n  private val boxScope: BoxScope\n) {\n\n  /**\n   * Add a [Compass] ornament to the map, the direction of the compass will follow the map camera's bearing,\n   * when the compass is clicked, the map camera's bearing will be reset to face north.\n   *\n   * By default, the [Compass] will be placed to the [Alignment.TopEnd] of the map with padding of 4dp.\n   *\n   * @param modifier Modifier to be applied to the [Compass].\n   * @param contentPadding The default padding applied to the [Compass], paddings from [modifier] will be applied on top of this default padding.\n   * @param alignment The alignment of the [Compass] within the Map.\n   * @param fadeWhenFacingNorth Whether the compass fades out to invisible when facing north direction.\n   * @param resetToNorthUponClick Whether the map camera bearing should be reset to 0 when the compass is clicked.\n   * @param content The composable to draw the compass.\n   */\n  @OptIn(MapboxExperimental::class)\n  @Composable\n  public fun Compass(\n    modifier: Modifier = Modifier,\n    contentPadding: PaddingValues = PaddingValues(4.dp),\n    alignment: Alignment = Alignment.TopEnd,\n    fadeWhenFacingNorth: Boolean = true,\n    resetToNorthUponClick: Boolean = true,\n    content: @Composable () -> Unit = {\n      Image(\n        painter = painterResource(id = R.drawable.mapbox_compass_icon),\n        contentDescription = \"Mapbox Compass\"\n      )\n    }\n  ) {\n    var compassBearing by remember {\n      mutableStateOf(0f)\n    }\n    var compassVisibility by remember {\n      mutableStateOf(false)\n    }\n    LaunchedEffect(Unit) {\n      compassBearing = -mapView.mapboxMap.cameraState.bearing.toFloat()\n      mapView.mapboxMap.cameraChangedCoalescedEvents\n        .map { it.cameraState.bearing.toFloat() }\n        .distinctUntilChanged { old, new ->\n          abs(old - new) < 0.1\n        }\n        .collect { cameraBearing ->\n          compassBearing = -cameraBearing\n          compassVisibility = !(fadeWhenFacingNorth && isFacingNorth(compassBearing))\n        }\n    }\n\n    AnimatedVisibility(\n      visible = compassVisibility,\n      enter = fadeIn(animationSpec = tween(durationMillis = 500)),\n      exit = fadeOut(animationSpec = tween(durationMillis = 500, delayMillis = 500)),\n      modifier = with(boxScope) {\n        Modifier\n          .padding(contentPadding)\n          .then(modifier)\n          .align(alignment)\n          .rotate(compassBearing)\n          .pointerInput(Unit) {\n            detectTapWithoutConsume {\n              if (resetToNorthUponClick) {\n                resetToFacingNorth()\n              }\n            }\n          }\n      }\n    ) {\n      content()\n    }\n  }\n\n  private fun resetToFacingNorth() {\n    // Reset bearing to 0 and set the animation owner to GESTURES so that it can interrupt current viewport.\n    mapView.camera.easeTo(\n      cameraOptions { bearing(0.0) },\n      MapAnimationOptions.mapAnimationOptions {\n        owner(\n          MapAnimationOwnerRegistry.GESTURES\n        )\n      }\n    )\n  }\n\n  private fun isFacingNorth(rotation: Float): Boolean {\n    // increase range of facing north to more than only 0.0\n    return with(abs(rotation)) {\n      this >= 359.0 || this <= 1.0\n    }\n  }\n\n  private suspend fun PointerInputScope.detectTapWithoutConsume(onTap: () -> Unit) =\n    coroutineScope {\n      forEachGesture {\n        awaitPointerEventScope {\n          awaitFirstDown()\n          val up = waitForUpOrCancellation()\n          // invoke onTap only if tap-up was not canceled\n          if (up != null) {\n            onTap.invoke()\n          }\n        }\n      }\n    }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/ornaments/logo/MapLogoScope.kt",
    "content": "package com.mapbox.maps.extension.compose.ornaments.logo\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.BoxScope\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.unit.dp\nimport com.mapbox.maps.extension.compose.MapboxMapScopeMarker\nimport com.mapbox.maps.extension.compose.R\n\n/**\n * A [MapLogoScope] provides a scope for adding [Logo] ornament.\n */\n@MapboxMapScopeMarker\n@Immutable\npublic class MapLogoScope internal constructor(\n  private val boxScope: BoxScope\n) {\n\n  /**\n   * Add a Mapbox [Logo] ornament to the map.\n   *\n   * Please note that it's **required** to show Mapbox Logo in your map. See [Mapbox ToS](https://www.mapbox.com/legal/tos)\n   *\n   * By default, the [Logo] will be placed to the [Alignment.BottomStart] of the map with padding of 4dp.\n   *\n   * @param modifier Modifier to be applied to the [Logo].\n   * @param contentPadding The default padding applied to the [Logo], paddings from [modifier] will be applied on top of this default padding.\n   * @param alignment The alignment of the [Logo] within the Map.\n   */\n  @Composable\n  public fun Logo(\n    modifier: Modifier = Modifier,\n    contentPadding: PaddingValues = PaddingValues(4.dp),\n    alignment: Alignment = Alignment.BottomStart\n  ) {\n    Image(\n      modifier = with(boxScope) {\n        Modifier\n          .padding(contentPadding)\n          .then(modifier)\n          .align(alignment)\n      },\n      painter = painterResource(id = R.drawable.mapbox_logo_icon),\n      contentDescription = \"Mapbox Logo\"\n    )\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/ornaments/scalebar/MapScaleBarScope.kt",
    "content": "package com.mapbox.maps.extension.compose.ornaments.scalebar\n\nimport androidx.compose.foundation.layout.BoxScope\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport androidx.compose.ui.platform.LocalDensity\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.TextUnit\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.compose.ui.viewinterop.AndroidView\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.extension.compose.MapboxMapScopeMarker\nimport com.mapbox.maps.extension.compose.ornaments.scalebar.internal.ScaleBarComposePlugin\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.scalebar.ScaleBarImpl\nimport kotlin.time.Duration\nimport kotlin.time.Duration.Companion.milliseconds\nimport kotlin.time.DurationUnit\n\n/**\n * A [MapScaleBarScope] provides a scope for adding [ScaleBar] ornament.\n */\n@MapboxMapScopeMarker\n@Immutable\npublic class MapScaleBarScope internal constructor(\n  private val mapView: MapView,\n  private val boxScope: BoxScope\n) {\n  /**\n   * Add a [ScaleBar] ornament to the map, the scale bar will update accordingly when the map's zoom\n   * level or latitude changes.\n   *\n   * By default, the [ScaleBar] will be placed to the [Alignment.TopStart] of the map with padding of 4dp.\n   *\n   * @param modifier Modifier to be applied to the [ScaleBar].\n   * @param contentPadding The default padding applied to the [ScaleBar], paddings from [modifier] will be applied on top of this default padding.\n   * @param alignment The alignment of the [ScaleBar] within the Map.\n   * @param textColor Defines text color of the scale bar.\n   * @param primaryColor Defines primary color of the scale bar.\n   * @param secondaryColor Defines secondary color of the scale bar.\n   * @param borderWidth Defines width of the border for the scale bar.\n   * @param height Defines height of the scale bar.\n   * @param textBarMargin Defines margin of the text bar of the scale bar.\n   * @param textBorderWidth Defines text border width of the scale bar.\n   * @param textSize Defines text size of the scale bar.\n   * @param isMetricUnit Whether the scale bar is using metric unit. True if the scale bar is using metric system, false if the scale bar is using imperial units.\n   * @param refreshInterval Configures minimum refresh interval, in millisecond, default is 15 milliseconds.\n   * @param showTextBorder Configures whether to show the text border or not, default is true.\n   * @param ratio Configures ratio of scale bar max width compared with MapView width, default is 0.5.\n   * @param useContinuousRendering If set to True scale bar will be triggering onDraw depending on\n   *     [refreshInterval] even if actual data did not change. If set to False scale bar\n   *     will redraw only on demand. Defaults to False and should not be changed explicitly in most cases.\n   *     Could be set to True to produce correct GPU frame metrics when running gfxinfo command.\n   */\n  @Composable\n  public fun ScaleBar(\n    modifier: Modifier = Modifier,\n    contentPadding: PaddingValues = PaddingValues(4.dp),\n    alignment: Alignment = Alignment.TopStart,\n    textColor: Color = Color.Black,\n    primaryColor: Color = Color.Black,\n    secondaryColor: Color = Color.White,\n    borderWidth: Dp = 2.dp,\n    height: Dp = 2.dp,\n    textBarMargin: Dp = 8.dp,\n    textBorderWidth: Dp = 2.dp,\n    textSize: TextUnit = 8.sp,\n    isMetricUnit: Boolean = true,\n    refreshInterval: Duration = 15.milliseconds,\n    showTextBorder: Boolean = true,\n    ratio: Float = 0.5f,\n    useContinuousRendering: Boolean = false,\n  ) {\n    val pluginId = remember {\n      ScaleBarComposePlugin.getNextId()\n    }\n    val density = LocalDensity.current\n    AndroidView(\n      modifier = with(boxScope) {\n        Modifier\n          .padding(contentPadding)\n          .then(modifier)\n          .align(alignment)\n      },\n      factory = { context ->\n        ScaleBarImpl(context).also { scaleBar ->\n          mapView.createPlugin(\n            Plugin.Custom(\n              pluginId,\n              ScaleBarComposePlugin(scaleBar)\n            )\n          )\n        }\n      }\n    ) {\n      with(density) {\n        it.settings = it.settings.toBuilder()\n          .setTextColor(textColor.toArgb())\n          .setPrimaryColor(primaryColor.toArgb())\n          .setSecondaryColor(secondaryColor.toArgb())\n          .setBorderWidth(borderWidth.toPx())\n          .setHeight(height.toPx())\n          .setTextBarMargin(textBarMargin.toPx())\n          .setTextBorderWidth(textBorderWidth.toPx())\n          .setTextSize(textSize.toPx())\n          .setIsMetricUnits(isMetricUnit)\n          .setRefreshInterval(refreshInterval.toLong(DurationUnit.MILLISECONDS))\n          .setShowTextBorder(showTextBorder)\n          .setRatio(ratio)\n          .setUseContinuousRendering(useContinuousRendering)\n          .build()\n      }\n    }\n    DisposableEffect(Unit) {\n      onDispose {\n        mapView.removePlugin(pluginId)\n      }\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/ornaments/scalebar/internal/ScaleBarComposePlugin.kt",
    "content": "package com.mapbox.maps.extension.compose.ornaments.scalebar.internal\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.CameraChangedCoalescedCallback\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.Projection.getMetersPerPixelAtLatitude\nimport com.mapbox.maps.plugin.ContextBinder\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.MapSizePlugin\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapListenerDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.plugin.scalebar.ScaleBarImpl\n\n/**\n * Concrete implementation of [ScaleBarComposePlugin] that's added to the map during composition.\n */\ninternal class ScaleBarComposePlugin(\n  private val scaleBar: ScaleBarImpl\n) : MapSizePlugin, MapPlugin, ContextBinder {\n  private lateinit var mapListenerDelegate: MapListenerDelegate\n  private lateinit var mapTransformDelegate: MapTransformDelegate\n  private lateinit var mapCameraManagerDelegate: MapCameraManagerDelegate\n  private val cameraChangedCoalescedListener = CameraChangedCoalescedCallback {\n    invalidateScaleBar(it.cameraState)\n  }\n  private var cancelable: Cancelable? = null\n\n  init {\n    scaleBar.enable = true\n  }\n  /**\n   * Invoked when MapView's width and height have changed.\n   * @param width the width of mapView\n   * @param height the height of mapView\n   */\n  override fun onSizeChanged(width: Int, height: Int) {\n    scaleBar.mapViewWidth = width.toFloat()\n    invalidateScaleBar()\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   */\n  override fun cleanup() {\n    cancelable?.cancel()\n  }\n\n  /**\n   * Called when the plugin is first added to the map.\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun initialize() {\n    cancelable = mapListenerDelegate.subscribeCameraChangedCoalesced(cameraChangedCoalescedListener)\n    invalidateScaleBar()\n  }\n\n  /**\n   * Invalid scale bar\n   */\n  private fun invalidateScaleBar(cameraState: CameraState = mapCameraManagerDelegate.cameraState) {\n    val metersPerPixelAtLatitude = getMetersPerPixelAtLatitude(\n      cameraState.center.latitude(),\n      cameraState.zoom\n    )\n    val pixelRatio = scaleBar.pixelRatio\n    scaleBar.distancePerPixel = (metersPerPixelAtLatitude / pixelRatio).toFloat()\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    mapCameraManagerDelegate = delegateProvider.mapCameraManagerDelegate\n    mapListenerDelegate = delegateProvider.mapListenerDelegate\n    mapTransformDelegate = delegateProvider.mapTransformDelegate\n  }\n\n  override fun bind(context: Context, attrs: AttributeSet?, pixelRatio: Float) {\n    scaleBar.pixelRatio = pixelRatio\n    invalidateScaleBar()\n  }\n\n  internal companion object {\n    private const val PLUGIN_ID = \"MAPBOX_SCALE_BAR_COMPOSE_PLUGIN\"\n    private var INSTANCE_COUNT = 0\n    internal fun getNextId(): String {\n      return \"$PLUGIN_ID-${INSTANCE_COUNT++}\"\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/IdGenerator.kt",
    "content": "package com.mapbox.maps.extension.compose.style\n\nimport java.util.UUID\n\n/**\n * Utility to generate a random ID.\n */\npublic object IdGenerator {\n  private const val SOURCE_ID_PREFIX = \"COMPOSE_SOURCE_ID_\"\n  private const val LAYER_ID_PREFIX = \"COMPOSE_LAYER_ID_\"\n  private const val LIGHT_ID_PREFIX = \"COMPOSE_LIGHT_ID_\"\n\n  private fun generateRandomId(prefix: String): String =\n    prefix + \"_\" + UUID.randomUUID().toString()\n\n  /**\n   * Generate a random source id based on UUID.\n   */\n  public fun generateRandomSourceId(sourceType: String): String {\n    return generateRandomId(SOURCE_ID_PREFIX + sourceType)\n  }\n\n  /**\n   * Generate a random layer id based on UUID.\n   */\n  public fun generateRandomLayerId(layerType: String): String {\n    return generateRandomId(LAYER_ID_PREFIX + layerType)\n  }\n\n  /**\n   * Generate a random light id based on UUID.\n   */\n  public fun generateRandomLightId(lightType: String): String {\n    return generateRandomId(LIGHT_ID_PREFIX + lightType)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/MapboxStyleComposable.kt",
    "content": "package com.mapbox.maps.extension.compose.style\n\nimport androidx.compose.runtime.ComposableTargetMarker\n\n/**\n * Marks a composable function as being expected to be used inside another composable function that is\n * also marked or inferred to be marked as a [MapboxStyleComposable].\n *\n * This will produce build warnings when [MapboxStyleComposable] composable functions are used outside\n * of a [MapboxStyleComposable] content lambda, and vice versa.\n */\n@Retention(AnnotationRetention.BINARY)\n@ComposableTargetMarker(description = \"Mapbox Style Composable\")\n@Target(\n  AnnotationTarget.FILE,\n  AnnotationTarget.FUNCTION,\n  AnnotationTarget.PROPERTY_GETTER,\n  AnnotationTarget.TYPE,\n  AnnotationTarget.TYPE_PARAMETER,\n)\npublic annotation class MapboxStyleComposable"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/PropertyTypes.kt",
    "content": "package com.mapbox.maps.extension.compose.style\n\nimport android.util.Range\nimport androidx.annotation.RestrictTo\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.ui.graphics.Color\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.compose.style.internal.ComposeTypeUtils\nimport com.mapbox.maps.extension.compose.style.layers.ImageValue\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.utils.ColorUtils\n\ninternal interface HoldsValue {\n  val value: Value\n\n  fun isNotInitial(): Boolean\n}\n\n@Composable\ninternal fun ActionWhenNotInitial(\n  action: (name: String, value: Value) -> Unit,\n  state: MutableState<out HoldsValue>,\n  name: String\n) {\n  with(state.value) {\n    if (isNotInitial()) {\n      action(name, value)\n    }\n  }\n}\n\n@Composable\ninternal fun AddImageWhenNotInitial(\n  layerNode: LayerNode,\n  state: MutableState<ImageValue>,\n  name: String\n) {\n  with(state.value) {\n    if (notInitial) {\n      styleImage?.let {\n        layerNode.addImage(it)\n      }\n      layerNode.setProperty(name, value)\n    }\n  }\n}\n\n/**\n * Defines the color used by the Maps render engine.\n * It can be either [Color] or an [Expression].\n *\n * @param value a value representing the color. See [Color](https://docs.mapbox.com/style-spec/reference/types/#color).\n */\n@Immutable\npublic data class ColorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the Color with [Color].\n   */\n  public constructor(value: Color) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the Color with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The [Color] represented by [value] or `null` if the stored [value] represents null is not a color.\n   */\n  public val colorOrNull: Color?\n    get() {\n      return if (value.contents is String) {\n        ColorUtils.rgbaToColor(value.contents as String)?.let { colorInt -> Color(colorInt) }\n      } else if (value is Expression) {\n        ColorUtils.rgbaExpressionToColorInt(value)?.let { colorInt -> Color(colorInt) }\n      } else {\n        null\n      }\n    }\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * [ColorValue]'s companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ColorValue = ColorValue(Value.valueOf(\"ColorValue.INITIAL\"))\n\n    /**\n     * Default value for [ColorValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: ColorValue = ColorValue(Value.nullValue())\n  }\n}\n\n/**\n * Defines a Number primitive that can accommodate a [Double].\n *\n * @param value a value representing a number. See [Number](https://docs.mapbox.com/style-spec/reference/types/#number)\n */\n@Immutable\npublic data class DoubleValue(public override val value: Value) : HoldsValue {\n  /**\n   * Create a [DoubleValue] that contains finite double [value].\n   *\n   * @param value the [Double] to store\n   */\n  public constructor(value: Double) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the primitive with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The [Double] represented by [value] or `null` if the stored [Value] is not a [Double].\n   */\n  public val doubleOrNull: Double?\n    get() = (value.contents as? Number)?.toDouble()\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * [DoubleValue]'s companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: DoubleValue = DoubleValue(Value(\"DoubleValue.INITIAL\"))\n\n    /**\n     * Default value for [DoubleValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: DoubleValue = DoubleValue(Value.nullValue())\n  }\n}\n\n/**\n * Defines a primitive that can accommodate a range of two [Double]. Usually defined by a lower and upper limit.\n *\n * @param value a value representing an array of two numbers. See [Number](https://docs.mapbox.com/style-spec/reference/types/#number)\n */\npublic data class DoubleRangeValue(public override val value: Value) : HoldsValue {\n\n  /**\n   * Create a [DoubleRangeValue] that contains a list of [Double] that represent a range.\n   *\n   * @param lower the lower limit [Double] to store\n   * @param upper the upper limit [Double] to store\n   */\n  public constructor(lower: Double, upper: Double) : this(\n    ComposeTypeUtils.wrapToValue(listOf(lower, upper))\n  )\n\n  /**\n   * Construct the primitive with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(range: Range<Double>) : this(range.lower, range.upper)\n\n  /**\n   * Construct the primitive with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The [Range] represented by [value] or `null` if the stored [Value] is not a [Range].\n   */\n  public val rangeOrNull: Range<Double>?\n    get() {\n      if (value.contents is ArrayList<*>) {\n        val contents = value.contents as ArrayList<*>\n        // Handle value constructed with `Expression.array(...)`\n        val idx = if (contents.firstOrNull() == \"array\") 1 else 0\n        if (contents.size == idx + 2) {\n          val lower = (contents[idx] as? Value)?.contents as? Double\n          val upper = (contents[idx + 1] as? Value)?.contents as? Double\n          if (upper != null && lower != null) {\n            try {\n              return Range(lower, upper)\n            } catch (_: IllegalArgumentException) {\n            }\n          }\n        }\n        return null\n      } else {\n        return null\n      }\n    }\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * [DoubleRangeValue]'s companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: DoubleRangeValue = DoubleRangeValue(Value.valueOf(\"DoubleRangeValue.INITIAL\"))\n\n    /**\n     * Default value for [DoubleRangeValue], setting [DEFAULT] will result in setting the property\n     * value defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: DoubleRangeValue = DoubleRangeValue(Value.nullValue())\n  }\n}\n\n/**\n * Defines a Number primitive that can accommodate a [Long].\n *\n * @param value a value representing a number. See [Number](https://docs.mapbox.com/style-spec/reference/types/#number)\n */\n@Immutable\npublic data class LongValue(public override val value: Value) : HoldsValue {\n  /**\n   * Create a [LongValue] that contains long [value].\n   *\n   * @param value the [Long] to store\n   */\n  public constructor(value: Long) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the primitive with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The [Long] represented by [value] or `null` if the stored [Value] is not a [Long].\n   */\n  public val longOrNull: Long?\n    get() = (value.contents as? Number)?.toLong()\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * [LongValue]'s companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: LongValue = LongValue(Value(\"LongValue.INITIAL\"))\n\n    /**\n     * Default value for [LongValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: LongValue = LongValue(Value.nullValue())\n  }\n}\n\n/**\n * Defines a Boolean primitive that can accommodate a [Boolean]. See [Boolean](https://docs.mapbox.com/style-spec/reference/types/#boolean).\n *\n * @param value a value representing a boolean.\n */\n@Immutable\npublic data class BooleanValue(public override val value: Value) : HoldsValue {\n  /**\n   * Create a [BooleanValue] that contains boolean [value].\n   *\n   * @param value the [Boolean] to store\n   */\n  public constructor(value: Boolean) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the primitive with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The [Boolean] represented by [value] or `null` if the stored [Value] is not a [Boolean].\n   */\n  public val booleanOrNull: Boolean?\n    get() = value.contents as? Boolean\n\n  /**\n   * True if this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * [BooleanValue]'s companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: BooleanValue = BooleanValue(Value(\"BooleanValue.INITIAL\"))\n\n    /**\n     * Default value for [BooleanValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: BooleanValue = BooleanValue(Value.nullValue())\n  }\n}\n\n/**\n * Defines a String primitive that can accommodate a [String]. See [String](https://docs.mapbox.com/style-spec/reference/types/#string).\n *\n * @param value a value representing a string.\n */\n@Immutable\npublic data class StringValue(public override val value: Value) : HoldsValue {\n  /**\n   * Create a [StringValue] that contains string [value].\n   *\n   * @param value the [StringValue] to store\n   */\n  public constructor(value: String) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the primitive with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The [String] represented by [value] or `null` if the stored [Value] is not a [String].\n   */\n  public val stringOrNull: String?\n    get() = value.contents as? String\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * [StringValue]'s companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: StringValue = StringValue(Value(\"StringValue.INITIAL\"))\n\n    /**\n     * Default value for [StringValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: StringValue = StringValue(Value.nullValue())\n  }\n}\n\n/**\n * Defines a list of String primitive that can accommodate a list of [String].\n *\n * @param value a value representing a string.\n */\n@Immutable\npublic data class StringListValue(public override val value: Value) : HoldsValue {\n  /**\n   * Create a [StringListValue] that contains string [value].\n   *\n   * @param value the [StringListValue] to store\n   */\n  public constructor(vararg value: String) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Create a [StringListValue] that contains string [value].\n   *\n   * @param value the [StringListValue] to store\n   */\n  public constructor(value: List<String>) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the primitive with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The list of [String] represented by [value] or `null` if the stored [Value] is not a list of [String].\n   */\n  public val stringListOrNull: List<String>?\n    get() {\n      if (value.contents is ArrayList<*>) {\n        val contents = value.contents as ArrayList<*>\n        // Handle value constructed with `Expression.array(...)`\n        val idx = if (contents.firstOrNull() == \"array\") 1 else 0\n        if (contents.size > idx) {\n          val mutableList = mutableListOf<String>()\n          contents.subList(idx, contents.size).forEach { content ->\n            ((content as? Value)?.contents as? String)?.let {\n              mutableList.add(it)\n            } ?: return null\n          }\n          return mutableList.toList()\n        }\n        return null\n      } else {\n        return null\n      }\n    }\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * [StringValue]'s companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: StringListValue = StringListValue(Value(\"StringListValue.INITIAL\"))\n\n    /**\n     * Default value for [StringListValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: StringListValue = StringListValue(Value.nullValue())\n  }\n}\n\n/**\n * Defines a primitive that can accommodate a list of [Double].\n *\n * @param value a value representing an array of numbers. See [Number](https://docs.mapbox.com/style-spec/reference/types/#number)\n */\npublic data class DoubleListValue(public override val value: Value) : HoldsValue {\n  /**\n   * Create a [DoubleListValue] from a list of [Double].\n   *\n   * @param value the list of [Double] to store\n   */\n  public constructor(vararg value: Double) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Create a [DoubleListValue] from a list of [Double].\n   *\n   * @param value the list of [Double] to store\n   */\n  public constructor(value: List<Double>) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the Color with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The list of [Double] represented by [value] or `null` if the stored [Value] is not a list of [Double].\n   */\n  public val doubleListOrNull: List<Double>?\n    get() {\n      if (value.contents is ArrayList<*>) {\n        val contents = value.contents as ArrayList<*>\n        // Handle value constructed with `Expression.array(...)`\n        val idx = if (contents.firstOrNull() == \"array\") 1 else 0\n        if (contents.size > idx) {\n          val mutableList = mutableListOf<Double>()\n          contents.subList(idx, contents.size).forEach { content ->\n            ((content as? Value)?.contents as? Double)?.let {\n              mutableList.add(it)\n            } ?: return null\n          }\n          return mutableList.toList()\n        }\n        return null\n      } else {\n        return null\n      }\n    }\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * [DoubleListValue]'s companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: DoubleListValue = DoubleListValue(Value.valueOf(\"DoubleListValue.INITIAL\"))\n\n    /**\n     * Default value for [DoubleListValue], setting [DEFAULT] will result in setting the property\n     * value defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: DoubleListValue = DoubleListValue(Value.nullValue())\n  }\n}\n\n/**\n * Defines the timing for the interpolation between a transitionable style layer property's previous value and new value.\n *\n * @param value the transition wrapped in [Value] to be used with native renderer.\n */\npublic data class Transition internal constructor(public override val value: Value) : HoldsValue {\n\n  /**\n   * Construct the [Transition] with duration and delay.\n   */\n  public constructor(durationMillis: Long = 0L, delayMillis: Long = 0L) : this(\n    Value(\n      hashMapOf(\n        \"delay\" to Value(delayMillis),\n        \"duration\" to Value(durationMillis)\n      )\n    )\n  )\n\n  /**\n   * Get the delay of the [Transition] in milliseconds.\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  public val delayMillis: Long\n    get() = (value.contents as HashMap<String, Value>)[\"delay\"]!!.contents as Long\n\n  /**\n   * Get the duration of the [Transition] in milliseconds.\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  public val durationMillis: Long\n    get() = (value.contents as HashMap<String, Value>)[\"duration\"]!!.contents as Long\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: Transition = Transition(Value.valueOf(\"Transition.INITIAL\"))\n\n    /**\n     * Default value for [Transition], setting default will result in restoring the default transition defined in the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: Transition = Transition(Value.nullValue())\n  }\n}\n\n/**\n * Defines a primitive that can accommodate a list of [com.mapbox.geojson.Point]s.\n *\n * @param value a value representing an array of coordinates. See [Array](https://docs.mapbox.com/style-spec/reference/types/#array)\n */\npublic data class PointListValue(public override val value: Value) : HoldsValue {\n\n  /**\n   * Create a [PointListValue] that contains a list of [Point]s.\n   *\n   * @param point the [Point] to store\n   */\n  public constructor(vararg point: Point) : this(\n    point.map { listOf(it.longitude(), it.latitude()) }\n  )\n\n  /**\n   * Create a [PointListValue] that contains a list of longitude, latitude pairs .\n   *\n   * @param point the longitude, latitude pair to store\n   */\n  public constructor(vararg point: Pair<Double, Double>) : this(point.map { listOf(it.first, it.second) })\n\n  /**\n   * Create a [PointListValue] that contains a list of pairs of longitude, latitude as list.\n   *\n   * @param points the list of points to store\n   */\n  public constructor(points: List<List<Double>>) : this(ComposeTypeUtils.wrapToValue(points))\n\n  /**\n   * Construct the primitive with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The list of [Point] represented by [value] or `null` if the stored [Value] is not a a list of [Point].\n   */\n  public val pointsOrNull: List<Point>?\n    get() {\n      @Suppress(\"UNCHECKED_CAST\")\n      return (value.contents as? List<Value>)?.map { innerList ->\n        val innerListContents = innerList.contents\n        if (innerListContents is List<*> && innerListContents.size == 2) {\n          val longitudeValue = (innerListContents[0] as? Value)?.contents\n          val latitudeValue = (innerListContents[1] as? Value)?.contents\n          if (longitudeValue is Double && latitudeValue is Double) {\n            Point.fromLngLat(longitudeValue, latitudeValue)\n          } else {\n            return null\n          }\n        } else {\n          return null\n        }\n      }\n    }\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * [PointListValue]'s companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom Point to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: PointListValue = PointListValue(Value.valueOf(\"PointListValue.INITIAL\"))\n\n    /**\n     * Default value for [PointListValue], setting [DEFAULT] will result in setting the property\n     * value defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: PointListValue = PointListValue(Value.nullValue())\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/Style.kt",
    "content": "package com.mapbox.maps.extension.compose.style\n\nimport android.annotation.SuppressLint\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState\nimport com.mapbox.maps.extension.compose.style.imports.MapboxStyleImportComposable\nimport com.mapbox.maps.extension.compose.style.imports.StyleImportsScope\nimport com.mapbox.maps.extension.compose.style.internal.MapStyleNode\nimport com.mapbox.maps.extension.compose.style.internal.StyleConfig\nimport com.mapbox.maps.extension.compose.style.internal.StyleLayerPosition\nimport com.mapbox.maps.extension.compose.style.internal.StyleSlot\nimport com.mapbox.maps.extension.compose.style.lights.LightsState\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\nimport com.mapbox.maps.extension.style.utils.transition\n\n/**\n * A simple composable function to set the style to the map without slots or import configs.\n *\n * @param style The Style JSON or Style Uri to be set to the map.\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param projection The projection to be set to the map. Defaults to [Projection.DEFAULT] meaning that projection value is taken from the [style] definition.\n * @param atmosphereState The atmosphere to be set to the map. By default, no changes to the current atmosphere.\n * @param terrainState The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from [style] definition.\n * @param lightsState The lights to be set to the map. By default, no changes to the current lights defined in style.\n * @param styleTransition Transition options applied when loading the style.\n */\n@Composable\n@Deprecated(\"Use overloaded MapStyle composable function with StyleState\")\n@MapboxStyleComposable\n@SuppressLint(\"ComposableLambdaParameterNaming\", \"ComposableLambdaParameterPosition\")\npublic fun MapStyle(\n  style: String,\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  projection: Projection = Projection.INITIAL,\n  atmosphereState: AtmosphereState = remember { AtmosphereState() },\n  terrainState: TerrainState = TerrainState.INITIAL,\n  lightsState: LightsState = LightsState.INITIAL,\n  styleTransition: TransitionOptions = remember { transition { } },\n) {\n  MapStyle(\n    style = style,\n    styleImportsContent = styleImportsContent,\n    styleState = rememberStyleState {\n      this.projection = projection\n      this.atmosphereState = atmosphereState\n      this.terrainState = terrainState\n      this.lightsState = lightsState\n      this.styleTransition = styleTransition\n    }\n  )\n}\n\n/**\n * A simple composable function to set the style to the map without slots or import configs.\n *\n * @param style The Style JSON or Style Uri to be set to the map.\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param styleState The state holder for the Style.\n */\n@Composable\n@MapboxStyleComposable\n@SuppressLint(\"ComposableLambdaParameterNaming\", \"ComposableLambdaParameterPosition\")\npublic fun MapStyle(\n  style: String,\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  styleState: StyleState = rememberStyleState()\n) {\n  GenericStyle(\n    style = style,\n    styleImportsContent = styleImportsContent,\n    styleState = styleState\n  )\n}\n\n/**\n * Class that holds [MapboxMapComposable] content per each slot.\n */\n@Stable\npublic data class SlotsContent internal constructor(\n  internal val entries: MutableMap<String, @Composable @MapboxMapComposable () -> Unit> = mutableMapOf()\n) {\n  /**\n   * Assign a new [MapboxMapComposable] [content] to the given slot [name].\n   *\n   * @param name The name of the slot.\n   * @param content a [MapboxMapComposable] to be applied to the slot.\n   *\n   * @throws IllegalArgumentException if [name] slot already has [content].\n   */\n  public fun slot(name: String, content: @Composable @MapboxMapComposable () -> Unit) {\n    if (entries.containsKey(name)) {\n      throw IllegalArgumentException(\"Slot [$name] already has content.\")\n    }\n    entries[name] = content\n  }\n}\n\n/**\n * Type-safe builder for slot based [MapboxMapComposable] content.\n */\npublic fun slotsContent(init: SlotsContent.() -> Unit): SlotsContent = SlotsContent().apply(init)\n\n/**\n * Class that holds [MapboxMapComposable] content per each [LayerPosition].\n */\n@Stable\npublic data class LayerPositionedContent internal constructor(\n  internal val entries: MutableMap<LayerPosition, @Composable @MapboxMapComposable () -> Unit> = mutableMapOf()\n) {\n  /**\n   * Assign a new [MapboxMapComposable] [content] to the given [layerPosition].\n   *\n   * @param layerPosition The layer position the content will be inserted to.\n   * @param content a [MapboxMapComposable] to be applied at the [layerPosition].\n   *\n   * @throws IllegalArgumentException if [layerPosition] already has [content].\n   */\n  public fun layerPosition(\n    layerPosition: LayerPosition,\n    content: @Composable @MapboxMapComposable () -> Unit\n  ) {\n    if (entries.containsKey(layerPosition)) {\n      throw IllegalArgumentException(\"LayerPosition [$layerPosition] already has content.\")\n    }\n    entries[layerPosition] = content\n  }\n\n  /**\n   * Assign a new [MapboxMapComposable] [content] above [layerId].\n   *\n   * @param [layerId] The layer id the content will be inserted above.\n   * @param content a [MapboxMapComposable] to be applied above the [layerId].\n   *\n   * @throws IllegalArgumentException if [layerPosition] already has [content].\n   */\n  public fun aboveLayer(layerId: String, content: @Composable @MapboxMapComposable () -> Unit) {\n    layerPosition(LayerPosition(layerId, null, null), content)\n  }\n\n  /**\n   * Assign a new [MapboxMapComposable] [content] below [layerId].\n   *\n   * @param [layerId] The layer id the content will be inserted below.\n   * @param content a [MapboxMapComposable] to be applied below the [layerId].\n   *\n   * @throws IllegalArgumentException if [layerPosition] already has [content].\n   */\n  public fun belowLayer(layerId: String, content: @Composable @MapboxMapComposable () -> Unit) {\n    layerPosition(LayerPosition(null, layerId, null), content)\n  }\n\n  /**\n   * Assign a new [MapboxMapComposable] [content] at [index].\n   *\n   * @param [index] The index that the content will be inserted to in the layers stack.\n   * @param content a [MapboxMapComposable] to be applied to the index position.\n   *\n   * @throws IllegalArgumentException if [layerPosition] already has [content].\n   */\n  public fun atIndex(index: Int, content: @Composable @MapboxMapComposable () -> Unit) {\n    layerPosition(LayerPosition(null, null, index), content)\n  }\n}\n\n/**\n * Type-safe builder for layer position based [MapboxMapComposable] content.\n */\npublic fun layerPositionedContent(init: LayerPositionedContent.() -> Unit): LayerPositionedContent =\n  LayerPositionedContent().apply(init)\n\n/**\n * Class that holds [ImportConfigs] per each Import ID.\n */\n@Stable\npublic data class StyleImportsConfig internal constructor(\n  internal val entries: MutableMap<String, ImportConfigs> = mutableMapOf()\n) {\n  /**\n   * Assign a new [ImportConfigs] to the given [importId].\n   *\n   * @param importId The import ID to configure.\n   * @param configs The configs to be applied to the import id.\n   *\n   * @throws IllegalArgumentException if [importId] already has [configs].\n   */\n  public fun importConfig(importId: String, configs: ImportConfigs.() -> Unit) {\n    if (entries.containsKey(importId)) {\n      throw IllegalArgumentException(\"Configs for Import ID [$importId] already set.\")\n    }\n    entries[importId] = ImportConfigs().apply(configs)\n  }\n}\n\n/**\n * Type-safe builder for [StyleImportsConfig].\n */\npublic fun styleImportsConfig(init: StyleImportsConfig.() -> Unit): StyleImportsConfig =\n  StyleImportsConfig().apply(init)\n\n/**\n * Class that holds the configs for one import ID.\n */\n@Stable\npublic data class ImportConfigs internal constructor(\n  internal val configs: HashMap<String, Value> = hashMapOf()\n) {\n  /**\n   * Assign a new [Value] to the given config name.\n   *\n   * @param name The configuration name.\n   * @param value The value for the configuration.\n   *\n   * @throws IllegalArgumentException if [name] already has [value].\n   */\n  public fun config(name: String, value: Value) {\n    if (configs.containsKey(name)) {\n      throw IllegalArgumentException(\"Config name [$name] already set\")\n    }\n    configs[name] = value\n  }\n}\n\n/**\n * Type-safe builder for [ImportConfigs].\n */\npublic fun importConfigs(init: ImportConfigs.() -> Unit): ImportConfigs =\n  ImportConfigs().apply(init)\n\n/**\n * Generic Style that you can insert [MapboxMapComposable] functions in any slot you defined as a\n * plain string, or set any map import configs given as plain string and [Value] pairs.\n *\n * Please note it's your own responsibility to make sure the slots you provided exists in the style,\n * and the import configs are valid within the style, otherwise it will result in unexpected behaviour.\n *\n * Always prefer strongly typed [MapboxStyleComposable] over the [GenericStyle].\n *\n * @param style The Style JSON or Style Uri to be set to the map.\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param slotsContent The slots and their [MapboxMapComposable] that would be inserted to the corresponding slots in the style. You can use [slotsContent] to create it.\n * @param layerPositionedContent The [MapboxMapComposable] content to be placed at specific layer position in the style. You can use [layerPositionedContent] to create it.\n * @param styleImportsConfig The style import configurations for all the style imports in the style. You can use [styleImportsConfig] to create it.\n * @param projection The projection to be set to the map. Defaults to [Projection.DEFAULT] meaning that projection value is taken from the [style] definition.\n * @param atmosphereState The atmosphere to be set to the map. By default, no changes to the current atmosphere.\n * @param terrainState The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from [style] definition.\n * @param lightsState The lights to be set to the map. By default, no changes to the current lights defined in style.\n * @param styleTransition Transition options applied when loading the style.\n */\n@Composable\n@MapboxStyleComposable\n@SuppressLint(\"ComposableLambdaParameterNaming\", \"ComposableLambdaParameterPosition\")\n@Deprecated(\"Use overloaded GenericStyle function with StyleState\")\npublic fun GenericStyle(\n  style: String,\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  slotsContent: SlotsContent = remember { SlotsContent() },\n  layerPositionedContent: LayerPositionedContent = remember { LayerPositionedContent() },\n  styleImportsConfig: StyleImportsConfig = remember { StyleImportsConfig() },\n  projection: Projection = Projection.INITIAL,\n  atmosphereState: AtmosphereState = remember { AtmosphereState() },\n  terrainState: TerrainState = TerrainState.INITIAL,\n  lightsState: LightsState = LightsState.INITIAL,\n  styleTransition: TransitionOptions = remember { transition { } },\n) {\n  GenericStyle(\n    style = style,\n    styleImportsContent = styleImportsContent,\n    slotsContent = slotsContent,\n    layerPositionedContent = layerPositionedContent,\n    styleState = rememberStyleState {\n      this.styleImportsConfig = styleImportsConfig\n      this.projection = projection\n      this.atmosphereState = atmosphereState\n      this.terrainState = terrainState\n      this.lightsState = lightsState\n      this.styleTransition = styleTransition\n    }\n  )\n}\n\n/**\n * Generic Style that you can insert [MapboxMapComposable] functions in any slot you defined as a\n * plain string, or set any map import configs given as plain string and [Value] pairs.\n *\n * Please note it's your own responsibility to make sure the slots you provided exists in the style,\n * and the import configs are valid within the style, otherwise it will result in unexpected behaviour.\n *\n * Always prefer strongly typed [MapboxStyleComposable] over the [GenericStyle].\n *\n * @param style The Style JSON or Style Uri to be set to the map.\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param slotsContent The slots and their [MapboxMapComposable] that would be inserted to the corresponding slots in the style. You can use [slotsContent] to create it.\n * @param layerPositionedContent The [MapboxMapComposable] content to be placed at specific layer position in the style. You can use [layerPositionedContent] to create it.\n * @param styleState The state holder for the Style.\n */\n@OptIn(MapboxExperimental::class)\n@Composable\n@MapboxStyleComposable\n@SuppressLint(\"ComposableLambdaParameterNaming\", \"ComposableLambdaParameterPosition\")\npublic fun GenericStyle(\n  style: String,\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  slotsContent: SlotsContent = remember { SlotsContent() },\n  layerPositionedContent: LayerPositionedContent = remember { LayerPositionedContent() },\n  styleState: StyleState = rememberStyleState()\n) {\n  // When style is changed, we want to trigger the recompose of the whole style node\n  key(style) {\n    val mapApplier = currentComposer.applier as? MapApplier\n      ?: throw IllegalStateException(\"Illegal use of Style composable outside of MapboxMapComposable\")\n\n    // Insert a MapStyleNode to the MapApplier node tree\n    ComposeNode<MapStyleNode, MapApplier>(\n      factory = {\n        MapStyleNode(\n          style = style,\n          mapboxMap = mapApplier.mapView.mapboxMap,\n          projection = styleState.projection,\n          atmosphereState = styleState.atmosphereState,\n          rainState = styleState.rainState,\n          snowState = styleState.snowState,\n          terrainState = styleState.terrainState\n        )\n      },\n      update = {\n        update(styleState.projection) {\n          updateProjection(styleState.projection)\n        }\n        update(styleState.atmosphereState) {\n          updateAtmosphere(styleState.atmosphereState)\n        }\n        update(styleState.rainState) {\n          updateRain(styleState.rainState)\n        }\n        update(styleState.snowState) {\n          updateSnow(styleState.snowState)\n        }\n        update(styleState.terrainState) {\n          updateTerrain(styleState.terrainState)\n        }\n        set(styleState.styleTransition) {\n          updateStyleTransition(it)\n        }\n        set(styleState.styleColorTheme) {\n          updateStyleColorTheme(it.colorTheme, it.isStyleDefault)\n        }\n      }\n    ) {\n      styleState.atmosphereState.UpdateProperties()\n      styleState.rainState.UpdateProperties()\n      styleState.snowState.UpdateProperties()\n      styleState.terrainState.UpdateProperties()\n      styleState.lightsState.BindToMap(mapboxMap = mapApplier.mapView.mapboxMap)\n      val styleImportsScope = remember {\n        StyleImportsScope()\n      }\n      styleImportsContent?.let {\n        styleImportsScope.it()\n      }\n      slotsContent.entries.forEach {\n        key(it.key) {\n          StyleSlot(name = it.key, content = it.value)\n        }\n      }\n      layerPositionedContent.entries.forEach {\n        key(it.key) {\n          StyleLayerPosition(layerPosition = it.key, content = it.value)\n        }\n      }\n      styleState.styleImportsConfig.entries.forEach { import ->\n        import.value.configs.forEach { config ->\n          key(import.key, config.key) {\n            StyleConfig(importId = import.key, name = config.key, property = config.value)\n          }\n        }\n      }\n      key(styleState.styleInteractionsState) {\n        styleState.styleInteractionsState.BindTo(mapboxMap = mapApplier.mapView.mapboxMap)\n      }\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/StyleColorTheme.kt",
    "content": "package com.mapbox.maps.extension.compose.style\n\nimport androidx.annotation.DrawableRes\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.graphics.ImageBitmap\nimport androidx.compose.ui.graphics.asAndroidBitmap\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.res.painterResource\nimport com.mapbox.maps.ColorTheme\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.color.colorTheme\nimport com.mapbox.maps.toMapboxImage\n\n/**\n * Create and remember [ColorTheme]\n * @param base64 Base64 encoded representation of an LUT image. The height of the image cannot be more than 32 pixels.\n *\n * @return [ColorTheme]\n */\n@Composable\n@MapboxExperimental\npublic fun rememberColorTheme(base64: String): ColorTheme {\n  return remember(base64) {\n    colorTheme(base64 = base64)\n  }\n}\n\n/**\n * Create and remember [ColorTheme]\n * @param image [Image] data of an LUT image\n *\n * @return [ColorTheme]\n */\n@Composable\n@MapboxExperimental\npublic fun rememberColorTheme(image: Image): ColorTheme {\n  return remember(image) {\n    colorTheme(image = image)\n  }\n}\n\n/**\n * Create and remember [ColorTheme]\n * @param imageBitmap The image data of the bitmap as [ImageBitmap]\n *\n * @return [ColorTheme]\n */\n@OptIn(MapboxDelicateApi::class)\n@Composable\n@MapboxExperimental\npublic fun rememberColorTheme(imageBitmap: ImageBitmap): ColorTheme {\n  return rememberColorTheme(image = imageBitmap.asAndroidBitmap().toMapboxImage())\n}\n\n/**\n * Create and remember [ColorTheme]\n * @param painter the [Painter] to provide the image\n *\n * @return [ColorTheme]\n */\n@Composable\n@MapboxExperimental\npublic fun rememberColorTheme(painter: Painter): ColorTheme {\n  return rememberColorTheme(imageBitmap = painter.drawToBitmap())\n}\n\n/**\n * Create and remember [ColorTheme]\n * @param resourceId the resource id to be loaded to the image\n *\n * @return [ColorTheme]\n */\n@Composable\n@MapboxExperimental\npublic fun rememberColorTheme(@DrawableRes resourceId: Int): ColorTheme {\n  return rememberColorTheme(painter = painterResource(resourceId))\n}\n\n/**\n * Create and remember [StyleColorTheme]\n * @param colorTheme [ColorTheme] instance to apply to the [StyleState].\n *\n * @return [StyleColorTheme]\n */\n@Composable\n@MapboxExperimental\npublic fun rememberStyleColorTheme(colorTheme: ColorTheme): StyleColorTheme {\n  return remember(colorTheme) {\n    StyleColorTheme(colorTheme)\n  }\n}\n\n/**\n * Color theme used when loading the style.\n *\n * @param colorTheme which will be loaded when loading the style.\n */\n@Immutable\n@MapboxExperimental\npublic data class StyleColorTheme internal constructor(\n  val colorTheme: ColorTheme,\n  internal val isStyleDefault: Boolean\n) {\n\n  /**\n   * @param colorTheme which will be loaded when loading the style.\n   */\n  public constructor(colorTheme: ColorTheme) : this(colorTheme, false)\n\n  /**\n   * Public companion object\n   */\n  public companion object {\n    /**\n     * Using STYLE_DEFAULT will use the theme defined in style spec.\n     */\n    @JvmField\n    public val STYLE_DEFAULT: StyleColorTheme = StyleColorTheme(colorTheme(), true)\n\n    /**\n     * Using NONE deletes the applied theme\n     */\n    @JvmField\n    public val NONE: StyleColorTheme = StyleColorTheme(colorTheme(), false)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/StyleImage.kt",
    "content": "package com.mapbox.maps.extension.compose.style\n\nimport androidx.annotation.DrawableRes\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.graphics.Canvas\nimport androidx.compose.ui.graphics.ImageBitmap\nimport androidx.compose.ui.graphics.asAndroidBitmap\nimport androidx.compose.ui.graphics.drawscope.CanvasDrawScope\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.unit.Density\nimport androidx.compose.ui.unit.LayoutDirection\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.ImageContent\nimport com.mapbox.maps.ImageStretches\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.toMapboxImage\n\n/**\n * Style image to used with runtime styling.\n *\n * @param imageId the id of the image\n * @param image pixel data of the image\n * @param scale scale factor for the image\n * @param sdf option to treat whether image is SDF(signed distance field) or not\n * @param stretchX An array of two-element arrays, consisting of two numbers that represent the from position and the to position of areas that can be stretched horizontally.\n * @param stretchY An array of two-element arrays, consisting of two numbers that represent the from position and the to position of areas that can be stretched vertically.\n * @param content An array of four numbers, with the first two specifying the left, top corner, and the last two specifying the right, bottom corner. If present, and if the icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n */\n@Immutable\npublic data class StyleImage(\n  val imageId: String,\n  val image: Image,\n  val scale: Float? = null,\n  val sdf: Boolean = false,\n  val stretchX: List<ImageStretches> = listOf(),\n  val stretchY: List<ImageStretches> = listOf(),\n  val content: ImageContent? = null,\n)\n\n/**\n * Create and remember a [StyleImage] with [ImageBitmap].\n *\n * @param imageId the id of the image\n * @param imageBitmap The image data of the bitmap as [ImageBitmap]\n * @param scale scale factor for the image\n * @param sdf option to treat whether image is SDF(signed distance field) or not\n * @param stretchX An array of two-element arrays, consisting of two numbers that represent the from position and the to position of areas that can be stretched horizontally.\n * @param stretchY An array of two-element arrays, consisting of two numbers that represent the from position and the to position of areas that can be stretched vertically.\n * @param content An array of four numbers, with the first two specifying the left, top corner, and the last two specifying the right, bottom corner. If present, and if the icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n *\n * @return a [StyleImage]\n */\n@OptIn(MapboxDelicateApi::class)\n@Composable\npublic fun rememberStyleImage(\n  imageId: String,\n  imageBitmap: ImageBitmap,\n  scale: Float? = null,\n  sdf: Boolean = false,\n  stretchX: List<ImageStretches> = listOf(),\n  stretchY: List<ImageStretches> = listOf(),\n  content: ImageContent? = null,\n): StyleImage {\n  return remember(imageId, imageBitmap, scale, sdf, stretchX, stretchY, content) {\n    StyleImage(\n      imageId = imageId,\n      image = imageBitmap.asAndroidBitmap().toMapboxImage(),\n      scale = scale,\n      sdf = sdf,\n      stretchX = stretchX,\n      stretchY = stretchY,\n      content = content\n    )\n  }\n}\n\n/**\n * Create and remember a [StyleImage] with [painter] and [key].\n *\n * @param key An optional key to be used as a key for the remembered value.\n * @param imageId the id of the image\n * @param painter the [Painter] to provide the image\n * @param scale scale factor for the image\n * @param sdf option to treat whether image is SDF(signed distance field) or not\n * @param stretchX An array of two-element arrays, consisting of two numbers that represent the from position and the to position of areas that can be stretched horizontally.\n * @param stretchY An array of two-element arrays, consisting of two numbers that represent the from position and the to position of areas that can be stretched vertically.\n * @param content An array of four numbers, with the first two specifying the left, top corner, and the last two specifying the right, bottom corner. If present, and if the icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n *\n * @return a [StyleImage]\n */\n@OptIn(MapboxDelicateApi::class)\n@Composable\npublic fun rememberStyleImage(\n  key: Any?,\n  imageId: String,\n  painter: Painter,\n  scale: Float? = null,\n  sdf: Boolean = false,\n  stretchX: List<ImageStretches> = listOf(),\n  stretchY: List<ImageStretches> = listOf(),\n  content: ImageContent? = null,\n): StyleImage {\n  return remember(key, imageId, painter, scale, sdf, stretchX, stretchY, content) {\n    StyleImage(\n      imageId = imageId,\n      image = painter.drawToBitmap().asAndroidBitmap().toMapboxImage(),\n      scale = scale,\n      sdf = sdf,\n      stretchX = stretchX,\n      stretchY = stretchY,\n      content = content\n    )\n  }\n}\n\n/**\n * Create and remember a [StyleImage] with [resourceId].\n *\n * @param imageId the id of the image\n * @param resourceId the resource id to be loaded to the image\n * @param scale scale factor for the image\n * @param sdf option to treat whether image is SDF(signed distance field) or not\n * @param stretchX An array of two-element arrays, consisting of two numbers that represent the from position and the to position of areas that can be stretched horizontally.\n * @param stretchY An array of two-element arrays, consisting of two numbers that represent the from position and the to position of areas that can be stretched vertically.\n * @param content An array of four numbers, with the first two specifying the left, top corner, and the last two specifying the right, bottom corner. If present, and if the icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n *\n * @return a [StyleImage]\n */\n@Composable\npublic fun rememberStyleImage(\n  imageId: String,\n  @DrawableRes resourceId: Int,\n  scale: Float? = null,\n  sdf: Boolean = false,\n  stretchX: List<ImageStretches> = listOf(),\n  stretchY: List<ImageStretches> = listOf(),\n  content: ImageContent? = null,\n): StyleImage {\n  return rememberStyleImage(\n    key = resourceId,\n    imageId = imageId,\n    painter = painterResource(resourceId),\n    scale = scale,\n    sdf = sdf,\n    stretchX = stretchX,\n    stretchY = stretchY,\n    content = content\n  )\n}\n\ninternal fun Painter.drawToBitmap(): ImageBitmap {\n  val drawScope = CanvasDrawScope()\n  val bitmap = ImageBitmap(intrinsicSize.width.toInt(), intrinsicSize.height.toInt())\n  val canvas = Canvas(bitmap)\n  drawScope.draw(\n    density = Density(1f),\n    layoutDirection = LayoutDirection.Ltr,\n    canvas = canvas,\n    size = intrinsicSize\n  ) {\n    draw(intrinsicSize)\n  }\n  return bitmap\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/StyleState.kt",
    "content": "package com.mapbox.maps.extension.compose.style\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState\nimport com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState\nimport com.mapbox.maps.extension.compose.style.lights.LightsState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.RainState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\nimport com.mapbox.maps.extension.style.utils.transition\n\n/**\n * Create and remember a [StyleState] with init block.\n *\n * @param init the initialization block to be applied to the [StyleState] after created and remembered.\n *\n * @return [StyleState]\n */\n@Composable\npublic inline fun rememberStyleState(crossinline init: StyleState.() -> Unit = {}): StyleState {\n  return remember {\n    StyleState()\n  }.apply(init)\n}\n\n/**\n * The state holder for the Style.\n */\n@OptIn(MapboxExperimental::class)\n@Stable\npublic class StyleState internal constructor(\n  initialStyleImportsConfig: StyleImportsConfig,\n  initialStyleInteractionsState: StyleInteractionsState,\n  initialProjection: Projection,\n  initialAtmosphereState: AtmosphereState,\n  initialRainState: RainState,\n  initialSnowState: SnowState,\n  initialTerrainState: TerrainState = TerrainState.INITIAL,\n  initialLightsState: LightsState = LightsState.INITIAL,\n  initialStyleTransition: TransitionOptions,\n  initialColorTheme: StyleColorTheme,\n) {\n  /**\n   * Construct a default [StyleState].\n   */\n  public constructor() : this(\n    initialStyleImportsConfig = StyleImportsConfig(),\n    initialStyleInteractionsState = StyleInteractionsState(),\n    initialProjection = Projection.INITIAL,\n    initialAtmosphereState = AtmosphereState(),\n    initialRainState = RainState(),\n    initialSnowState = SnowState(),\n    initialTerrainState = TerrainState.INITIAL,\n    initialLightsState = LightsState.INITIAL,\n    initialStyleTransition = transition { },\n    initialColorTheme = StyleColorTheme.STYLE_DEFAULT\n  )\n\n  /**\n   * The style import configurations for all the style imports in the style. You can use [styleImportsConfig] to create it.\n   */\n  public var styleImportsConfig: StyleImportsConfig by mutableStateOf(initialStyleImportsConfig)\n\n  /**\n   * The [StyleInteractionsState] manages the map interactions defined for the style.\n   */\n  public var styleInteractionsState: StyleInteractionsState by mutableStateOf(\n    initialStyleInteractionsState\n  )\n\n  /**\n   * The projection to be set to the map. Defaults to [Projection.INITIAL] meaning that projection value is taken from the [style] definition.\n   */\n  public var projection: Projection by mutableStateOf(initialProjection)\n\n  /**\n   * The atmosphere to be set to the map. By default, no changes to the current atmosphere.\n   */\n  public var atmosphereState: AtmosphereState by mutableStateOf(initialAtmosphereState)\n\n  /**\n   * The snow effect to be set to the map. By default, no changes to the current snow.\n   */\n  @MapboxExperimental\n  public var snowState: SnowState by mutableStateOf(initialSnowState)\n\n  /**\n   * The rain effect to be set to the map. By default, no changes to the current rain.\n   */\n  @MapboxExperimental\n  public var rainState: RainState by mutableStateOf(initialRainState)\n\n  /**\n   * The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from [style] definition.\n   */\n  public var terrainState: TerrainState by mutableStateOf(initialTerrainState)\n\n  /**\n   * The lights to be set to the map. By default, no changes to the current lights defined in style.\n   */\n  public var lightsState: LightsState by mutableStateOf(initialLightsState)\n\n  /**\n   * Transition options applied when loading the style.\n   */\n  public var styleTransition: TransitionOptions by mutableStateOf(initialStyleTransition)\n\n  /**\n   * The color theme to be set to the map. Defaults to initial color theme meaning no custom theme is added, default value is taken from [style] definition.\n   */\n  @MapboxExperimental\n  public var styleColorTheme: StyleColorTheme by mutableStateOf(initialColorTheme)\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/atmosphere/AtmosphereStateApplier.kt",
    "content": "package com.mapbox.maps.extension.compose.style.atmosphere\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.launch\nimport java.util.Objects\n\n/**\n * A [MutableStateFlow] to keep the latest value for a Atmosphere Property\n */\nprivate typealias PropertyValueFlow = MutableStateFlow<Value>\n\ninternal class AtmosphereStateApplier internal constructor(\n  initialProperties: Map<String, Value>,\n  private val coroutineScope: CoroutineScope = CoroutineScope(\n    Dispatchers.Main.immediate + SupervisorJob() + CoroutineName(\n      \"AtmosphereStateScope\"\n    )\n  ),\n) {\n  private var propertiesUpdateJobs: MutableList<Job> = mutableListOf()\n  private var atmosphereSet = false\n\n  /**\n   *  A shared flow to keep track of each property own flow ([PropertyValueFlow]).\n   *  Every time a new [Pair] is emitted in this flow we will start collecting its flow\n   *  ([PropertyValueFlow]), see [startCollectingPropertyFlows].\n   */\n  private val propertiesFlowsToCollect =\n    MutableSharedFlow<Pair<String, PropertyValueFlow>>(replay = Channel.UNLIMITED)\n\n  init {\n    initialProperties.forEach {\n      setProperty(it.key, it.value)\n    }\n  }\n\n  internal fun attachTo(mapboxMap: MapboxMap) {\n    val replayCache = propertiesFlowsToCollect.replayCache\n    if (replayCache.isNotEmpty()) {\n      logD(TAG, \"Adding atmosphere: $this\")\n      mapboxMap.setStyleAtmosphere(\n        properties = Value(\n          hashMapOf<String, Value>().also { map ->\n            // Get the most recent list of properties and their values\n            map.putAll(replayCache.associate { it.first to it.second.value })\n            logD(TAG, \"Setting all properties in one go: $map\")\n          }\n        ),\n      ).onError {\n        logE(TAG, \"Failed to add atmosphere: $it\")\n      }.onValue {\n        logD(TAG, \"Added atmosphere: $this\")\n        atmosphereSet = true\n      }\n    }\n    startCollectingPropertyFlows(mapboxMap)\n  }\n\n  private fun startCollectingPropertyFlows(mapboxMap: MapboxMap) {\n    val collectNewPropertiesJob = coroutineScope.launch {\n      propertiesFlowsToCollect.collect { (name: String, valueFlow: PropertyValueFlow) ->\n        val updatePropertyJob = coroutineScope.launch {\n          valueFlow.collect { value ->\n            logD(TAG, \"settingProperty: name=$name, value=$value ...\")\n            mapboxMap.setStyleAtmosphereProperty(name, value)\n              .onError { error ->\n                // handle the use case of changing atmosphere e.g. for Standard style\n                // and explicitly adding it so that applying property could take effect\n                if (!atmosphereSet) {\n                  mapboxMap.setStyleAtmosphere(Value.valueOf(hashMapOf())).onValue {\n                    atmosphereSet = true\n                    mapboxMap.setStyleAtmosphereProperty(name, value).onError {\n                      logW(TAG, \"Failed to set atmosphere property $name as $value: $error\")\n                    }.onValue {\n                      logD(TAG, \"settingProperty: name=$name, value=$value executed\")\n                    }\n                  }.onError {\n                    logW(TAG, \"Failed to set atmosphere with no properties, error = $it\")\n                    logI(TAG, \"settingProperty: name=$name, value=$value ignored\")\n                  }\n                } else {\n                  logW(TAG, \"Failed to set atmosphere property $name as $value: $error\")\n                }\n              }.onValue {\n                logD(TAG, \"settingProperty: name=$name, value=$value executed\")\n              }\n          }\n        }\n        propertiesUpdateJobs.add(updatePropertyJob)\n      }\n    }\n    propertiesUpdateJobs.add(collectNewPropertiesJob)\n  }\n\n  internal fun detach() {\n    // Stop any collect job that changes the source properties\n    propertiesUpdateJobs.forEach(Job::cancel)\n    propertiesUpdateJobs.clear()\n  }\n\n  internal fun setProperty(name: String, value: Value) {\n    logD(TAG, \"setProperty() called with: name = $name, value = $value\")\n    val setOfFlows = propertiesFlowsToCollect.replayCache\n    val currentFlow: Pair<String, MutableStateFlow<Value>>? = setOfFlows.firstOrNull {\n      it.first == name\n    }\n    if (currentFlow != null) {\n      currentFlow.second.value = value\n    } else {\n      logD(TAG, \"setProperty: emitting new property to listen to: $name\")\n      // Add the new property to the set of property flows we want to collect\n      propertiesFlowsToCollect.tryEmit(name to MutableStateFlow(value))\n    }\n  }\n\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as AtmosphereStateApplier\n\n    val thisProperties = propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    val otherProperties = other.propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    if (thisProperties != otherProperties) return false\n\n    return atmosphereSet == other.atmosphereSet\n  }\n\n  override fun hashCode(): Int {\n    val thisProperties = propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    return Objects.hash(atmosphereSet, thisProperties)\n  }\n\n  private companion object {\n    private const val TAG = \"AtmosphereStateApplier\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/atmosphere/generated/AtmosphereState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.atmosphere.generated\n\nimport android.os.Parcelable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleRangeValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.atmosphere.AtmosphereStateApplier\nimport com.mapbox.maps.extension.compose.style.internal.ValueParceler\nimport kotlinx.parcelize.Parcelize\nimport kotlinx.parcelize.TypeParceler\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [AtmosphereState] using [AtmosphereState.Saver].\n * [init] will be called when the [AtmosphereState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param init A function initialise this [AtmosphereState].\n */\n@Composable\npublic inline fun rememberAtmosphereState(\n  key: String? = null,\n  crossinline init: AtmosphereState.() -> Unit = {}\n): AtmosphereState = rememberSaveable(key = key, saver = AtmosphereState.Saver) {\n  AtmosphereState().apply(init)\n}\n\n/**\n * A global effect that fades layers and markers based on their distance to the camera. The fog can be used to approximate the effect of atmosphere on distant objects and enhance the depth perception of the map when used with terrain or 3D features. Note: fog is renamed to atmosphere in the Android and iOS SDKs and planned to be changed in GL-JS v.3.0.0.\n *\n * @see [The online documentation](https://docs.mapbox.com/mapbox-gl-js/style-spec/fog/)\n */\n@Stable\npublic class AtmosphereState private constructor(\n  internal val applier: AtmosphereStateApplier,\n  color: ColorValue,\n  colorTransition: Transition,\n  colorUseTheme: StringValue,\n  highColor: ColorValue,\n  highColorTransition: Transition,\n  highColorUseTheme: StringValue,\n  horizonBlend: DoubleValue,\n  horizonBlendTransition: Transition,\n  range: DoubleRangeValue,\n  rangeTransition: Transition,\n  spaceColor: ColorValue,\n  spaceColorTransition: Transition,\n  spaceColorUseTheme: StringValue,\n  starIntensity: DoubleValue,\n  starIntensityTransition: Transition,\n  verticalRange: DoubleRangeValue,\n  verticalRangeTransition: Transition,\n) {\n\n  public constructor() : this(\n    AtmosphereStateApplier(emptyMap()),\n    ColorValue.INITIAL,\n    Transition.INITIAL,\n    StringValue.INITIAL,\n    ColorValue.INITIAL,\n    Transition.INITIAL,\n    StringValue.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleRangeValue.INITIAL,\n    Transition.INITIAL,\n    ColorValue.INITIAL,\n    Transition.INITIAL,\n    StringValue.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleRangeValue.INITIAL,\n    Transition.INITIAL,\n  )\n\n  private val colorState: MutableState<ColorValue> = mutableStateOf(color)\n\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above\n   * the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as\n   * anything less than 100% opacity results in more tiles loaded and drawn.\n   * Default value: \"#ffffff\".\n   */\n  public var color: ColorValue by colorState\n\n  private val colorTransitionState: MutableState<Transition> = mutableStateOf(colorTransition)\n\n  /**\n   * Defines the transition of [color].\n   * Default value: \"#ffffff\".\n   */\n  public var colorTransition: Transition by colorTransitionState\n\n  private val colorUseThemeState: MutableState<StringValue> = mutableStateOf(colorUseTheme)\n\n  /**\n   * Overrides applying of color theme for [color] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var colorUseTheme: StringValue by colorUseThemeState\n\n  private val highColorState: MutableState<ColorValue> = mutableStateOf(highColor)\n\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than\n   * the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set\n   * to `0` to remove the high atmosphere color contribution.\n   * Default value: \"#245cdf\".\n   */\n  public var highColor: ColorValue by highColorState\n\n  private val highColorTransitionState: MutableState<Transition> = mutableStateOf(highColorTransition)\n\n  /**\n   * Defines the transition of [highColor].\n   * Default value: \"#245cdf\".\n   */\n  public var highColorTransition: Transition by highColorTransitionState\n\n  private val highColorUseThemeState: MutableState<StringValue> = mutableStateOf(highColorUseTheme)\n\n  /**\n   * Overrides applying of color theme for [highColor] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var highColorUseTheme: StringValue by highColorUseThemeState\n\n  private val horizonBlendState: MutableState<DoubleValue> = mutableStateOf(horizonBlend)\n\n  /**\n   * Horizon blend applies a smooth fade from the color of the atmosphere to the color of\n   * space. A value of zero leaves a sharp transition from atmosphere to space. Increasing the value\n   * blends the color of atmosphere into increasingly high angles of the sky.\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n   */\n  public var horizonBlend: DoubleValue by horizonBlendState\n\n  private val horizonBlendTransitionState: MutableState<Transition> = mutableStateOf(horizonBlendTransition)\n\n  /**\n   * Defines the transition of [horizonBlend].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n   */\n  public var horizonBlendTransition: Transition by horizonBlendTransitionState\n\n  private val rangeState: MutableState<DoubleRangeValue> = mutableStateOf(range)\n\n  /**\n   * The start and end distance range in which fog fades from fully transparent to fully opaque.\n   * The distance to the point at the center of the map is defined as zero, so\n   * that negative range values are closer to the camera, and positive values are farther away.\n   * Default value: [0.5,10]. Value range: [-20, 20]\n   */\n  public var range: DoubleRangeValue by rangeState\n\n  private val rangeTransitionState: MutableState<Transition> = mutableStateOf(rangeTransition)\n\n  /**\n   * Defines the transition of [range].\n   * Default value: [0.5,10]. Value range: [-20, 20]\n   */\n  public var rangeTransition: Transition by rangeTransitionState\n\n  private val spaceColorState: MutableState<ColorValue> = mutableStateOf(spaceColor)\n\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution.\n   * The opacity can be set to `0` to have a transparent background.\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   */\n  public var spaceColor: ColorValue by spaceColorState\n\n  private val spaceColorTransitionState: MutableState<Transition> = mutableStateOf(spaceColorTransition)\n\n  /**\n   * Defines the transition of [spaceColor].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   */\n  public var spaceColorTransition: Transition by spaceColorTransitionState\n\n  private val spaceColorUseThemeState: MutableState<StringValue> = mutableStateOf(spaceColorUseTheme)\n\n  /**\n   * Overrides applying of color theme for [spaceColor] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var spaceColorUseTheme: StringValue by spaceColorUseThemeState\n\n  private val starIntensityState: MutableState<DoubleValue> = mutableStateOf(starIntensity)\n\n  /**\n   * A value controlling the star intensity where `0` will show no stars and `1` will show\n   * stars at their maximum intensity.\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n   */\n  public var starIntensity: DoubleValue by starIntensityState\n\n  private val starIntensityTransitionState: MutableState<Transition> = mutableStateOf(starIntensityTransition)\n\n  /**\n   * Defines the transition of [starIntensity].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n   */\n  public var starIntensityTransition: Transition by starIntensityTransitionState\n\n  private val verticalRangeState: MutableState<DoubleRangeValue> = mutableStateOf(verticalRange)\n\n  /**\n   * An array of two number values, specifying the vertical range, measured in meters, over which the\n   * fog should gradually fade out. When both parameters are set to zero, the fog will be\n   * rendered without any vertical constraints.\n   * Default value: [0,0]. Minimum value: 0.\n   */\n  public var verticalRange: DoubleRangeValue by verticalRangeState\n\n  private val verticalRangeTransitionState: MutableState<Transition> = mutableStateOf(verticalRangeTransition)\n\n  /**\n   * Defines the transition of [verticalRange].\n   * Default value: [0,0]. Minimum value: 0.\n   */\n  public var verticalRangeTransition: Transition by verticalRangeTransitionState\n\n  @Composable\n  internal fun UpdateProperties() {\n    val action = applier::setProperty\n    ActionWhenNotInitial(action, colorState, \"color\")\n    ActionWhenNotInitial(action, colorTransitionState, \"color-transition\")\n    ActionWhenNotInitial(action, colorUseThemeState, \"color-use-theme\")\n    ActionWhenNotInitial(action, highColorState, \"high-color\")\n    ActionWhenNotInitial(action, highColorTransitionState, \"high-color-transition\")\n    ActionWhenNotInitial(action, highColorUseThemeState, \"high-color-use-theme\")\n    ActionWhenNotInitial(action, horizonBlendState, \"horizon-blend\")\n    ActionWhenNotInitial(action, horizonBlendTransitionState, \"horizon-blend-transition\")\n    ActionWhenNotInitial(action, rangeState, \"range\")\n    ActionWhenNotInitial(action, rangeTransitionState, \"range-transition\")\n    ActionWhenNotInitial(action, spaceColorState, \"space-color\")\n    ActionWhenNotInitial(action, spaceColorTransitionState, \"space-color-transition\")\n    ActionWhenNotInitial(action, spaceColorUseThemeState, \"space-color-use-theme\")\n    ActionWhenNotInitial(action, starIntensityState, \"star-intensity\")\n    ActionWhenNotInitial(action, starIntensityTransitionState, \"star-intensity-transition\")\n    ActionWhenNotInitial(action, verticalRangeState, \"vertical-range\")\n    ActionWhenNotInitial(action, verticalRangeTransitionState, \"vertical-range-transition\")\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"color\" to color.value).takeIf { color.isNotInitial() },\n      (\"color-transition\" to colorTransition.value).takeIf { colorTransition.isNotInitial() },\n      (\"color-use-theme\" to colorUseTheme.value).takeIf { colorUseTheme.isNotInitial() },\n      (\"high-color\" to highColor.value).takeIf { highColor.isNotInitial() },\n      (\"high-color-transition\" to highColorTransition.value).takeIf { highColorTransition.isNotInitial() },\n      (\"high-color-use-theme\" to highColorUseTheme.value).takeIf { highColorUseTheme.isNotInitial() },\n      (\"horizon-blend\" to horizonBlend.value).takeIf { horizonBlend.isNotInitial() },\n      (\"horizon-blend-transition\" to horizonBlendTransition.value).takeIf { horizonBlendTransition.isNotInitial() },\n      (\"range\" to range.value).takeIf { range.isNotInitial() },\n      (\"range-transition\" to rangeTransition.value).takeIf { rangeTransition.isNotInitial() },\n      (\"space-color\" to spaceColor.value).takeIf { spaceColor.isNotInitial() },\n      (\"space-color-transition\" to spaceColorTransition.value).takeIf { spaceColorTransition.isNotInitial() },\n      (\"space-color-use-theme\" to spaceColorUseTheme.value).takeIf { spaceColorUseTheme.isNotInitial() },\n      (\"star-intensity\" to starIntensity.value).takeIf { starIntensity.isNotInitial() },\n      (\"star-intensity-transition\" to starIntensityTransition.value).takeIf { starIntensityTransition.isNotInitial() },\n      (\"vertical-range\" to verticalRange.value).takeIf { verticalRange.isNotInitial() },\n      (\"vertical-range-transition\" to verticalRangeTransition.value).takeIf { verticalRangeTransition.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as AtmosphereState\n\n    if (applier != other.applier) return false\n    if (color != other.color) return false\n    if (colorTransition != other.colorTransition) return false\n    if (colorUseTheme != other.colorUseTheme) return false\n    if (highColor != other.highColor) return false\n    if (highColorTransition != other.highColorTransition) return false\n    if (highColorUseTheme != other.highColorUseTheme) return false\n    if (horizonBlend != other.horizonBlend) return false\n    if (horizonBlendTransition != other.horizonBlendTransition) return false\n    if (range != other.range) return false\n    if (rangeTransition != other.rangeTransition) return false\n    if (spaceColor != other.spaceColor) return false\n    if (spaceColorTransition != other.spaceColorTransition) return false\n    if (spaceColorUseTheme != other.spaceColorUseTheme) return false\n    if (starIntensity != other.starIntensity) return false\n    if (starIntensityTransition != other.starIntensityTransition) return false\n    if (verticalRange != other.verticalRange) return false\n    if (verticalRangeTransition != other.verticalRangeTransition) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun hashCode(): Int = Objects.hash(\n    applier,\n    color,\n    colorTransition,\n    colorUseTheme,\n    highColor,\n    highColorTransition,\n    highColorUseTheme,\n    horizonBlend,\n    horizonBlendTransition,\n    range,\n    rangeTransition,\n    spaceColor,\n    spaceColorTransition,\n    spaceColorUseTheme,\n    starIntensity,\n    starIntensityTransition,\n    verticalRange,\n    verticalRangeTransition,\n  )\n\n  /**\n   * Returns a string representation of the object.\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun toString(): String =\n    \"AtmosphereState(color=$color, colorTransition=$colorTransition, colorUseTheme=$colorUseTheme, highColor=$highColor, highColorTransition=$highColorTransition, highColorUseTheme=$highColorUseTheme, horizonBlend=$horizonBlend, horizonBlendTransition=$horizonBlendTransition, range=$range, rangeTransition=$rangeTransition, spaceColor=$spaceColor, spaceColorTransition=$spaceColorTransition, spaceColorUseTheme=$spaceColorUseTheme, starIntensity=$starIntensity, starIntensityTransition=$starIntensityTransition, verticalRange=$verticalRange, verticalRangeTransition=$verticalRangeTransition)\"\n\n  /**\n   * Atmosphere Holder class to be used within [Saver].\n   */\n  @Parcelize\n  @TypeParceler<Value, ValueParceler>\n  public data class Holder internal constructor(\n    /**\n     * Saved properties.\n     * Note that we use a generic [Map] to be able to evolve this class without breaking changes.\n     */\n    val savedProperties: Map<String, Value>,\n  ) : Parcelable\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [AtmosphereState]\n     */\n    public val Saver: Saver<AtmosphereState, Holder> = Saver(\n      save = { Holder(it.getProperties()) },\n      restore = { holder ->\n        AtmosphereState(\n          AtmosphereStateApplier(holder.savedProperties),\n          color = holder.savedProperties[\"color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          colorTransition = holder.savedProperties[\"color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          colorUseTheme = holder.savedProperties[\"color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          highColor = holder.savedProperties[\"high-color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          highColorTransition = holder.savedProperties[\"high-color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          highColorUseTheme = holder.savedProperties[\"high-color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          horizonBlend = holder.savedProperties[\"horizon-blend\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          horizonBlendTransition = holder.savedProperties[\"horizon-blend-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          range = holder.savedProperties[\"range\"]?.let { DoubleRangeValue(it) } ?: DoubleRangeValue.INITIAL,\n          rangeTransition = holder.savedProperties[\"range-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          spaceColor = holder.savedProperties[\"space-color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          spaceColorTransition = holder.savedProperties[\"space-color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          spaceColorUseTheme = holder.savedProperties[\"space-color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          starIntensity = holder.savedProperties[\"star-intensity\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          starIntensityTransition = holder.savedProperties[\"star-intensity-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          verticalRange = holder.savedProperties[\"vertical-range\"]?.let { DoubleRangeValue(it) } ?: DoubleRangeValue.INITIAL,\n          verticalRangeTransition = holder.savedProperties[\"vertical-range-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/imports/MapboxStyleImportComposable.kt",
    "content": "package com.mapbox.maps.extension.compose.style.imports\n\nimport androidx.compose.runtime.ComposableTargetMarker\n\n/**\n * Marks a composable function as being expected to be used inside another composable function that is\n * also marked or inferred to be marked as a [MapboxStyleImportComposable].\n *\n * This will produce build warnings when [MapboxStyleImportComposable] composable functions are used outside\n * of a [MapboxStyleImportComposable] content lambda, and vice versa.\n */\n@Retention(AnnotationRetention.BINARY)\n@ComposableTargetMarker(description = \"Mapbox Style Import Composable\")\n@Target(\n  AnnotationTarget.FILE,\n  AnnotationTarget.FUNCTION,\n  AnnotationTarget.PROPERTY_GETTER,\n  AnnotationTarget.TYPE,\n  AnnotationTarget.TYPE_PARAMETER,\n)\npublic annotation class MapboxStyleImportComposable"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/imports/StyleImportInteractionsState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.imports\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.remember\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.InteractionContext\nimport com.mapbox.maps.LongClickInteraction\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.style.interactions.BasicStyleInteractions\nimport com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * Convenient method to create a [StyleImportInteractionsState] and remember it with the init block.\n *\n * @param init the initialization block applied to the [StyleImportInteractionsState] after it is created and remembered.\n *\n * @return [StyleImportInteractionsState]\n */\n@Composable\npublic inline fun rememberStyleImportInteractionsState(crossinline init: StyleImportInteractionsState.() -> Unit = {}): StyleImportInteractionsState {\n  return remember {\n    StyleImportInteractionsState()\n  }.apply(init)\n}\n\n/**\n * [StyleImportInteractionsState] manages the map interactions defined for the style import.\n */\n@Stable\npublic class StyleImportInteractionsState : BasicStyleInteractions() {\n\n  @Composable\n  internal fun BindTo(mapboxMap: MapboxMap, importId: String) {\n    BindToMap(map = mapboxMap, importId)\n  }\n\n  /**\n   * Add the [ClickInteraction] for given featureset defined with [id] and optional [importId].\n   *\n   * When several [ClickInteraction]s are registered for the same [id] and [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param id mandatory featureset id.\n   * @param importId optional style import id, if not set, the ID will be taken from [StyleImport.importId].\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when featureset is clicked.\n   */\n  public fun onFeaturesetClicked(\n    id: String,\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StyleImportInteractionsState = apply {\n    clickInteractionFeatureset(\n      featuresetId = id,\n      importId = importId,\n      filter = filter,\n      radius = radius,\n      onClick = onClick\n    )\n  }\n\n  /**\n   * Add the [LongClickInteraction] for given featureset defined with [id] and optional [importId].\n   *\n   * When several [LongClickInteraction]s are registered for the same [id] and [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param id mandatory featureset id.\n   * @param importId optional style import id,  if not set, the ID will be taken from [StyleImport.importId].\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when featureset is clicked.\n   */\n  public fun onFeaturesetLongClicked(\n    id: String,\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onLongClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StyleImportInteractionsState = apply {\n    longClickInteractionFeatureset(\n      featuresetId = id,\n      importId = importId,\n      filter = filter,\n      radius = radius,\n      onLongClick = onLongClick\n    )\n  }\n\n  /**\n   * Add the [ClickInteraction] for the map surface itself.\n   *\n   * When several map [ClickInteraction]s are registered - the callbacks will be triggered from last to first.\n   *\n   * @param onClick callback triggered when map surface is clicked.\n   */\n  public fun onMapClicked(\n    onClick: FeaturesetFeatureScope.(InteractionContext) -> Boolean\n  ): StyleImportInteractionsState = apply {\n    clickInteractionMap(onClick)\n  }\n\n  /**\n   * Add the [LongClickInteraction] for the map surface itself.\n   *\n   * When several map [LongClickInteraction]s are registered - the callbacks will be triggered from last to first.\n   *\n   * @param onLongClick callback triggered when map surface is clicked.\n   */\n  public fun onMapLongClicked(\n    onLongClick: FeaturesetFeatureScope.(InteractionContext) -> Boolean\n  ): StyleImportInteractionsState = apply {\n    longClickInteractionMap(onLongClick)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/imports/StyleImportState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.imports\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ImportConfigs\nimport com.mapbox.maps.extension.compose.style.StyleColorTheme\n\n/**\n * Create and remember a [StyleImportState] with init block.\n *\n * @param init the initialization block to be applied to the [StyleImportState] after created and remembered.\n *\n * @return [StyleImportState]\n */\n@Composable\npublic inline fun rememberStyleImportState(crossinline init: StyleImportState.() -> Unit = {}): StyleImportState {\n  return remember {\n    StyleImportState()\n  }.apply(init)\n}\n\n/**\n * The state holder for the [StyleImport].\n */\n@OptIn(MapboxExperimental::class)\n@Stable\npublic class StyleImportState internal constructor(\n  initialImportConfigs: ImportConfigs?,\n  initialStyleImportInteractionsState: StyleImportInteractionsState,\n  initialColorTheme: StyleColorTheme\n) {\n  /**\n   * Construct a default [StyleImportState].\n   */\n  public constructor() : this(\n    initialImportConfigs = null,\n    initialStyleImportInteractionsState = StyleImportInteractionsState(),\n    initialColorTheme = StyleColorTheme.STYLE_DEFAULT\n  )\n\n  /**\n   * The optional [ImportConfigs] for the imported style.\n   */\n  public var importConfigs: ImportConfigs? by mutableStateOf(initialImportConfigs)\n\n  /**\n   * The [StyleImportInteractionsState] defined for the imported style.\n   */\n  public var interactionsState: StyleImportInteractionsState by mutableStateOf(initialStyleImportInteractionsState)\n\n  /**\n   * The color theme to be set to the style import. Defaults to initial color theme meaning no custom theme is added, default value is taken from [style] definition.\n   */\n  @MapboxExperimental\n  public var styleColorTheme: StyleColorTheme by mutableStateOf(initialColorTheme)\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/imports/StyleImportsScope.kt",
    "content": "package com.mapbox.maps.extension.compose.style.imports\n\nimport android.webkit.URLUtil\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.ImportPosition\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapScopeMarker\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.extension.compose.style.ImportConfigs\nimport com.mapbox.maps.extension.compose.style.StyleColorTheme\nimport com.mapbox.maps.extension.compose.style.internal.MapStyleNode\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.launch\n\n@OptIn(MapboxExperimental::class)\ninternal class StyleImportNode(\n  private var importId: String,\n  private var style: String,\n  private var config: ImportConfigs?,\n  private var styleColorTheme: StyleColorTheme,\n  private val coroutineScope: CoroutineScope\n) : MapNode() {\n  private lateinit var mapStyleNode: MapStyleNode\n  override fun onAttached(parent: MapNode) {\n    logD(TAG, \"onAttached\")\n    mapStyleNode = parent as MapStyleNode\n    addStyleImport()\n  }\n\n  private fun addStyleImport() {\n    val mapboxMap = mapStyleNode.mapboxMap\n    coroutineScope.launch {\n      // We only care about the first style data loaded events, as adding style import will also trigger\n      // style data loaded events, so we will receive duplicated calls if we use collect here.\n      mapStyleNode.styleDataLoaded.firstOrNull().let {\n        if (style.isValidUri()) {\n          mapboxMap.addStyleImportFromURI(\n            importId = importId,\n            uri = style,\n            config = config?.configs,\n            importPosition = getRelativePositionInfo()\n          )\n        } else {\n          mapStyleNode.mapboxMap.addStyleImportFromJSON(\n            importId = importId,\n            json = style,\n            config = config?.configs,\n            importPosition = getRelativePositionInfo()\n          )\n        }.onError { error ->\n          logW(TAG, \"addStyleImport error: $error\")\n        }.onValue {\n          logD(TAG, \"added StyleImport($importId, $style, $config, null)\")\n        }\n        if (!styleColorTheme.isStyleDefault) {\n          mapboxMap.setImportColorTheme(importId, styleColorTheme.colorTheme)\n        }\n      }\n    }\n  }\n\n  private fun removeStyleImport() {\n    mapStyleNode.mapboxMap.removeStyleImport(importId)\n  }\n\n  internal fun updateImportId(importId: String) {\n    removeStyleImport()\n    this.importId = importId\n    addStyleImport()\n  }\n\n  internal fun updateStyle(style: String) {\n    removeStyleImport()\n    this.style = style\n    addStyleImport()\n  }\n\n  private fun getRelativePositionInfo(): ImportPosition {\n    return ImportPosition(\n      /* above = */ null,\n      /* below = */ with(mapStyleNode.children.filterIsInstance<StyleImportNode>()) {\n        elementAtOrNull(indexOf(this@StyleImportNode) + 1)?.importId\n      },\n      /* at = */ null\n    )\n  }\n\n  internal fun updateConfigs(configs: ImportConfigs?) {\n    mapStyleNode.mapboxMap.setStyleImportConfigProperties(importId, configs?.configs ?: hashMapOf())\n  }\n\n  internal fun updateColorTheme(styleColorTheme: StyleColorTheme) {\n    mapStyleNode.mapboxMap.setImportColorTheme(importId, styleColorTheme.colorTheme)\n  }\n\n  override fun onRemoved(parent: MapNode) {\n    cleanUp()\n  }\n\n  override fun onClear() {\n    cleanUp()\n  }\n\n  private fun cleanUp() {\n    removeStyleImport()\n    this.children.forEach { it.onClear() }\n  }\n\n  override fun toString(): String {\n    return \"StyleImportNode(importId=$importId)\"\n  }\n\n  private fun String.isValidUri(): Boolean {\n    val isMapboxStyleUri = startsWith(\"mapbox://\", ignoreCase = true)\n    val isMapboxAssetUri = startsWith(\"asset://\", ignoreCase = true)\n    val isMapboxFileUri = startsWith(\"file://\", ignoreCase = true)\n    return isMapboxStyleUri || isMapboxAssetUri || isMapboxFileUri || URLUtil.isValidUrl(this)\n  }\n\n  private companion object {\n    private const val TAG = \"StyleImportNode\"\n  }\n}\n\n/**\n * A [StyleImportsScope] provides a scope for adding [StyleImport].\n */\n@MapboxMapScopeMarker\n@Immutable\npublic class StyleImportsScope internal constructor() {\n  /**\n   * Add a Style Import to the current style.\n   *\n   * @param importId the id of the style import.\n   * @param style the style uri or style json of the style import.\n   * @param configs the optional [ImportConfigs] for the imported style.\n   */\n  @Composable\n  @MapboxStyleImportComposable\n  @Deprecated(\"Use overloaded StyleImport composable function with StyleImportState instead\")\n  public fun StyleImport(\n    importId: String,\n    style: String,\n    configs: ImportConfigs? = null,\n  ) {\n    StyleImport(\n      importId = importId,\n      style = style,\n      styleImportState = rememberStyleImportState {\n        importConfigs = configs\n      }\n    )\n  }\n\n  /**\n   * Add a Style Import to the current style.\n   *\n   * @param importId the id of the style import.\n   * @param style the style uri or style json of the style import.\n   * @param styleImportState The state holder for the [StyleImport].\n   */\n  @OptIn(MapboxExperimental::class)\n  @Composable\n  @MapboxStyleImportComposable\n  public fun StyleImport(\n    importId: String,\n    style: String,\n    styleImportState: StyleImportState = rememberStyleImportState()\n  ) {\n    val applier = currentComposer.applier as? MapApplier\n      ?: throw IllegalStateException(\"Illegal use of StyleImport composable outside of MapboxMapComposable\")\n    key(styleImportState.interactionsState) {\n      styleImportState.interactionsState.BindTo(\n        mapboxMap = applier.mapView.mapboxMap,\n        importId = importId\n      )\n    }\n    val coroutineScope = rememberCoroutineScope()\n    // Insert a MapNode to the MapApplier node tree\n    ComposeNode<StyleImportNode, MapApplier>(\n      factory = {\n        StyleImportNode(\n          importId,\n          style,\n          styleImportState.importConfigs,\n          styleImportState.styleColorTheme,\n          coroutineScope\n        )\n      },\n      update = {\n        update(importId) {\n          updateImportId(it)\n        }\n        update(style) {\n          updateStyle(it)\n        }\n        update(styleImportState.importConfigs) {\n          updateConfigs(styleImportState.importConfigs)\n        }\n        update(styleImportState.styleColorTheme) {\n          updateColorTheme(it)\n        }\n      }\n    )\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/interactions/BasicStyleInteractions.kt",
    "content": "package com.mapbox.maps.extension.compose.style.interactions\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.mutableStateListOf\nimport androidx.compose.runtime.remember\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.InteractionContext\nimport com.mapbox.maps.LongClickInteraction\nimport com.mapbox.maps.MapInteraction\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope\nimport com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScopeImpl\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * Base class for Interactions, it handles the interaction entries that would be added to the map upon bind.\n *\n * Note this is a generic implementation with no public API exposed.\n */\npublic abstract class BasicStyleInteractions {\n  // map interaction builder entries that will be built and added to the map when the state is bind to the map.\n  // this property is used directly by generated Standard interactions and then lambda represents (importId? -> MapInteraction)\n  protected val entries: MutableList<(String?) -> MapInteraction> = mutableListOf()\n\n  // the featureset feature scope is created on bind to the map, and it provides extension functions to FeaturesetFeature\n  // so that user can update feature state directly on the FeaturesetFeature in this scope.\n  protected var featuresetFeatureScope: FeaturesetFeatureScope? = null\n\n  // Update interactions with the import id from the context\n  @Composable\n  protected fun UpdateInteractions(map: MapboxMap, importId: String?) {\n    val cancelables = remember {\n      mutableStateListOf<Cancelable>()\n    }\n    DisposableEffect(key1 = entries) {\n      entries.forEach {\n        cancelables.add(map.addInteraction(it.invoke(importId)))\n      }\n      onDispose {\n        cancelables.forEach { it.cancel() }\n        cancelables.clear()\n      }\n    }\n  }\n\n  // Bind the interactions to the map, initialising the featureset features scope, and add cached interactions to the map.\n  @Composable\n  protected fun BindToMap(map: MapboxMap, importId: String? = null) {\n    UpdateInteractions(map = map, importId)\n    DisposableEffect(Unit) {\n      featuresetFeatureScope = FeaturesetFeatureScopeImpl(map)\n      onDispose {\n        featuresetFeatureScope = null\n      }\n    }\n  }\n\n  /**\n   * Create and add the [ClickInteraction] for given featureset defined with [featuresetId] and optional [importId].\n   *\n   * When several [ClickInteraction]s are registered for the same [featuresetId] and [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param featuresetId mandatory featureset id.\n   * @param importId optional style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when featureset is clicked.\n   */\n  protected fun clickInteractionFeatureset(\n    featuresetId: String,\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double?,\n    onClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ) {\n    entries.add { import ->\n      ClickInteraction.featureset(\n        id = featuresetId,\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onClick = { feature, context ->\n          featuresetFeatureScope?.onClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Create and add the [ClickInteraction] for given [layerId].\n   *\n   * When several [ClickInteraction]s are registered for the same [layerId] - the callbacks will be triggered from last to first.\n   *\n   * @param layerId mandatory layer id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when layer is clicked.\n   */\n  protected fun clickInteractionLayer(\n    layerId: String,\n    filter: Expression? = null,\n    radius: Double?,\n    onClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ) {\n    entries.add {\n      ClickInteraction.layer(\n        id = layerId,\n        filter = filter,\n        radius = radius,\n        onClick = { feature, context ->\n          featuresetFeatureScope?.onClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Create and add the [ClickInteraction] for the map surface itself.\n   *\n   * When several map [ClickInteraction]s are registered - the callbacks will be triggered from last to first.\n   *\n   * @param onClick callback triggered when map surface is clicked.\n   */\n  protected fun clickInteractionMap(onClick: FeaturesetFeatureScope.(InteractionContext) -> Boolean) {\n    entries.add {\n      ClickInteraction { context ->\n        featuresetFeatureScope?.onClick(context) ?: false\n      }\n    }\n  }\n\n  /**\n   * Create and add the [LongClickInteraction] for the map surface itself.\n   *\n   * When several map [LongClickInteraction]s are registered - the callbacks will be triggered from last to first.\n   *\n   * @param onLongClick callback triggered when map surface is clicked.\n   */\n  protected fun longClickInteractionMap(onLongClick: FeaturesetFeatureScope.(InteractionContext) -> Boolean) {\n    entries.add {\n      LongClickInteraction { context ->\n        featuresetFeatureScope?.onLongClick(context) ?: false\n      }\n    }\n  }\n\n  /**\n   * Create and add the [LongClickInteraction] for given featureset defined with [featuresetId] and optional [importId].\n   *\n   * When several [LongClickInteraction]s are registered for the same [featuresetId] and [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param featuresetId mandatory featureset id.\n   * @param importId optional style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when featureset is clicked.\n   */\n  protected fun longClickInteractionFeatureset(\n    featuresetId: String,\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double?,\n    onLongClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ) {\n    entries.add { import ->\n      LongClickInteraction.featureset(\n        id = featuresetId,\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onLongClick = { feature, context ->\n          featuresetFeatureScope?.onLongClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Create and add the [LongClickInteraction] for given [layerId].\n   *\n   * When several [LongClickInteraction]s are registered for the same [layerId] - the callbacks will be triggered from last to first.\n   *\n   * @param layerId mandatory layer id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when layer is clicked.\n   */\n  protected fun longClickInteractionLayer(\n    layerId: String,\n    filter: Expression? = null,\n    radius: Double?,\n    onLongClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ) {\n    entries.add {\n      LongClickInteraction.layer(\n        id = layerId,\n        filter = filter,\n        radius = radius,\n        onLongClick = { feature, context ->\n          featuresetFeatureScope?.onLongClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/interactions/StyleInteractionsState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.interactions\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.remember\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.InteractionContext\nimport com.mapbox.maps.LongClickInteraction\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * Convenient method to create a [StyleInteractionsState] and remember it with the init block.\n *\n * @param init the initialization block applied to the [StyleInteractionsState] after it is created and remembered.\n *\n * @return [StyleInteractionsState]\n */\n@Composable\npublic inline fun rememberStyleInteractionStates(crossinline init: StyleInteractionsState.() -> Unit = {}): StyleInteractionsState {\n  return remember {\n    StyleInteractionsState()\n  }.apply(init)\n}\n\n/**\n * [StyleInteractionsState] manages the map interactions defined for the style.\n */\n@Stable\npublic class StyleInteractionsState : BasicStyleInteractions() {\n\n  @Composable\n  internal fun BindTo(mapboxMap: MapboxMap) {\n    BindToMap(map = mapboxMap)\n  }\n\n  /**\n   * Add the [ClickInteraction] for given featureset defined with [id] and optional [importId].\n   *\n   * When several [ClickInteraction]s are registered for the same [id] and [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param id mandatory featureset id.\n   * @param importId optional style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when featureset is clicked.\n   */\n  public fun onFeaturesetClicked(\n    id: String,\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StyleInteractionsState = apply {\n    clickInteractionFeatureset(\n      featuresetId = id,\n      importId = importId,\n      filter = filter,\n      radius = radius,\n      onClick = onClick\n    )\n  }\n\n  /**\n   * Add the [ClickInteraction] for given [id].\n   *\n   * When several [ClickInteraction]s are registered for the same [id] - the callbacks will be triggered from last to first.\n   *\n   * @param id mandatory layer id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when layer is clicked.\n   */\n  public fun onLayerClicked(\n    id: String,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StyleInteractionsState = apply {\n    clickInteractionLayer(layerId = id, filter = filter, radius = radius, onClick = onClick)\n  }\n\n  /**\n   * Add the [LongClickInteraction] for given featureset defined with [id] and optional [importId].\n   *\n   * When several [LongClickInteraction]s are registered for the same [id] and [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param id mandatory featureset id.\n   * @param importId optional style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when featureset is clicked.\n   */\n  public fun onFeaturesetLongClicked(\n    id: String,\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onLongClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StyleInteractionsState = apply {\n    longClickInteractionFeatureset(\n      featuresetId = id,\n      importId = importId,\n      filter = filter,\n      radius = radius,\n      onLongClick = onLongClick\n    )\n  }\n\n  /**\n   * Add the [LongClickInteraction] for given [id].\n   *\n   * When several [LongClickInteraction]s are registered for the same [id] - the callbacks will be triggered from last to first.\n   *\n   * @param id mandatory layer id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when layer is clicked.\n   */\n  public fun onLayerLongClicked(\n    id: String,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onLongClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StyleInteractionsState = apply {\n    longClickInteractionLayer(layerId = id, filter = filter, radius = radius, onLongClick = onLongClick)\n  }\n\n  /**\n   * Add the [ClickInteraction] for the map surface itself.\n   *\n   * When several map [ClickInteraction]s are registered - the callbacks will be triggered from last to first.\n   *\n   * @param onClick callback triggered when map surface is clicked.\n   */\n  public fun onMapClicked(\n    onClick: FeaturesetFeatureScope.(InteractionContext) -> Boolean\n  ): StyleInteractionsState = apply {\n    clickInteractionMap(onClick)\n  }\n\n  /**\n   * Add the [LongClickInteraction] for the map surface itself.\n   *\n   * When several map [LongClickInteraction]s are registered - the callbacks will be triggered from last to first.\n   *\n   * @param onLongClick callback triggered when map surface is clicked.\n   */\n  public fun onMapLongClicked(\n    onLongClick: FeaturesetFeatureScope.(InteractionContext) -> Boolean\n  ): StyleInteractionsState = apply {\n    longClickInteractionMap(onLongClick)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/interactions/generated/FeaturesetFeatureScope.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.interactions.generated\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.FeatureStateOperationCallback\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.QueryFeatureStateCallback\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeatureStateKey\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardBuildingsState\nimport com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState\nimport com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState\nimport com.mapbox.maps.interactions.standard.generated.StandardPoiFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardPoiState\n\n/**\n * The featureset feature scope provides extension functions to [FeaturesetFeature]\n * so that user can update feature state directly on the [FeaturesetFeature] within this scope.\n *\n * Note that this is a sealed interface, it's not expected to be implemented outside of this library.\n */\npublic sealed interface FeaturesetFeatureScope {\n\n  /**\n   * Extension function allowing to set the [StandardPoiState] for [StandardPoiFeature]\n   * in the most convenient way.\n   *\n   * Note: this is an asynchronous function, but this function does not provide the callback for easier use.\n   * Refer to [setFeatureState] if the callback is required.\n   */\n  public fun StandardPoiFeature.setStandardPoiState(\n    init: StandardPoiState.Builder.() -> Unit,\n  ) {\n    setFeatureState(StandardPoiState(init)) { }\n  }\n\n  /**\n   * Extension function allowing to set the [StandardPlaceLabelsState] for [StandardPlaceLabelsFeature]\n   * in the most convenient way.\n   *\n   * Note: this is an asynchronous function, but this function does not provide the callback for easier use.\n   * Refer to [setFeatureState] if the callback is required.\n   */\n  public fun StandardPlaceLabelsFeature.setStandardPlaceLabelsState(\n    init: StandardPlaceLabelsState.Builder.() -> Unit,\n  ) {\n    setFeatureState(StandardPlaceLabelsState(init)) { }\n  }\n\n  /**\n   * Extension function allowing to set the [StandardBuildingsState] for [StandardBuildingsFeature]\n   * in the most convenient way.\n   *\n   * Note: this is an asynchronous function, but this function does not provide the callback for easier use.\n   * Refer to [setFeatureState] if the callback is required.\n   */\n  public fun StandardBuildingsFeature.setStandardBuildingsState(\n    init: StandardBuildingsState.Builder.() -> Unit,\n  ) {\n    setFeatureState(StandardBuildingsState(init)) { }\n  }\n\n  /**\n   * Extension function allowing to set the [StandardLandmarkIconsState] for [StandardLandmarkIconsFeature]\n   * in the most convenient way.\n   *\n   * Note: this is an asynchronous function, but this function does not provide the callback for easier use.\n   * Refer to [setFeatureState] if the callback is required.\n   */\n  public fun StandardLandmarkIconsFeature.setStandardLandmarkIconsState(\n    init: StandardLandmarkIconsState.Builder.() -> Unit,\n  ) {\n    setFeatureState(StandardLandmarkIconsState(init)) { }\n  }\n\n  /**\n   * Sets the state map for the [FeaturesetFeature].\n   *\n   * @param state describes the new state of the map for given [FeaturesetFeature].\n   * @param callback The optional [QueryFeatureStateCallback] called when the query completes.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending query.\n   */\n  public fun <FS : FeatureState> FeaturesetFeature<FS>.setFeatureState(\n    state: FS,\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback {}\n  ): Cancelable\n\n  /**\n   * Removes entries from a feature state based on the [FeaturesetFeature].\n   *\n   * Removes a specified property or all property from a feature's state object, depending on the value of\n   * [stateKey].\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using `getFeatureState`.\n   *\n   * @param stateKey The typed key of the property to remove. If `null`, all feature's state object properties are removed.\n   * @param callback The [FeatureStateOperationCallback] called when the operation completes or ends.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending operation.\n   */\n  public fun <FS, FSK> FeaturesetFeature<FS>.removeFeatureState(\n    stateKey: FSK? = null,\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { }\n  ): Cancelable where FS : FeatureState, FSK : FeatureStateKey<FS>\n\n  /**\n   * Reset all the feature states within a style source.\n   *\n   * Remove all feature state entries from the specified style source or source layer.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using `getFeatureState`.\n   *\n   * @param callback The [FeatureStateOperationCallback] called when the operation completes or ends.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending operation.\n   */\n  public fun <FS : FeatureState> FeaturesetFeature<FS>.resetFeatureStates(\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { }\n  ): Cancelable\n}\n\ninternal class FeaturesetFeatureScopeImpl internal constructor(private val mapboxMap: MapboxMap) :\n  FeaturesetFeatureScope {\n\n  override fun <FS : FeatureState> FeaturesetFeature<FS>.setFeatureState(\n    state: FS,\n    callback: FeatureStateOperationCallback\n  ): Cancelable {\n    return mapboxMap.setFeatureState(\n      featuresetFeature = this,\n      state = state,\n      callback = callback\n    )\n  }\n\n  override fun <FS, FSK> FeaturesetFeature<FS>.removeFeatureState(\n    stateKey: FSK?,\n    callback: FeatureStateOperationCallback\n  ): Cancelable where FS : FeatureState, FSK : FeatureStateKey<FS> {\n    return mapboxMap.removeFeatureState(\n      featuresetFeature = this,\n      stateKey = stateKey,\n      callback = callback\n    )\n  }\n\n  override fun <FS : FeatureState> FeaturesetFeature<FS>.resetFeatureStates(callback: FeatureStateOperationCallback): Cancelable {\n    return mapboxMap.resetFeatureStates(descriptor = descriptor, callback = callback)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/internal/ComposeTypeUtils.kt",
    "content": "package com.mapbox.maps.extension.compose.style.internal\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.toArgb\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.TileCacheBudgetInTiles\nimport com.mapbox.maps.extension.compose.style.layers.generated.ClipLayerTypes\nimport com.mapbox.maps.extension.compose.style.layers.generated.TextVariableAnchor\nimport com.mapbox.maps.extension.compose.style.layers.generated.TextWritingMode\nimport com.mapbox.maps.extension.style.types.PromoteId\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.TypeUtils\n\ninternal object ComposeTypeUtils {\n  @OptIn(MapboxExperimental::class)\n  fun wrapToValue(value: Any): Value {\n    return when (value) {\n      is Color -> Value(ColorUtils.colorToRgbaString(value.toArgb()))\n      is TileCacheBudgetInMegabytes -> Value(\n        hashMapOf(\n          \"megabytes\" to Value(\n            value.size\n          )\n        )\n      )\n      is TileCacheBudgetInTiles -> Value(\n        hashMapOf(\n          \"tiles\" to Value(\n            value.size\n          )\n        )\n      )\n      is PromoteId -> with(value) {\n        val promoteIdValue = Value.fromJson(propertyName).getValueOrElse { Value.valueOf(propertyName) }\n        sourceId?.let {\n          Value(hashMapOf(sourceId to promoteIdValue))\n        }\n        promoteIdValue\n      }\n      is TextWritingMode -> {\n        value.value\n      }\n      is TextVariableAnchor -> {\n        value.value\n      }\n      is ClipLayerTypes -> {\n        value.value\n      }\n      is List<*> -> {\n        val valueArray = value.map { it?.let { wrapToValue(it) } }\n        Value(valueArray)\n      }\n      else -> TypeUtils.wrapToValue(value)\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/internal/MapStyleNode.kt",
    "content": "package com.mapbox.maps.extension.compose.style.internal\n\nimport android.util.Log\nimport com.mapbox.maps.ColorTheme\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.StyleDataLoaded\nimport com.mapbox.maps.StyleDataLoadedType\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.coroutine.styleDataLoadedEvents\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.RainState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.launch\n\n@OptIn(MapboxExperimental::class)\ninternal class MapStyleNode(\n  val style: String,\n  val mapboxMap: MapboxMap,\n  private val projection: Projection,\n  var atmosphereState: AtmosphereState,\n  var rainState: RainState,\n  var snowState: SnowState,\n  var terrainState: TerrainState\n) : MapNode() {\n\n  val coroutineScope =\n    CoroutineScope(Dispatchers.Main.immediate + SupervisorJob() + CoroutineName(\"MapStyleNodeScope\"))\n\n  private val styleDataLoadedFlow = mapboxMap.styleDataLoadedEvents\n\n  internal val styleSourcesLoaded: SharedFlow<StyleDataLoaded> = styleDataLoadedFlow\n    .filter { it.type == StyleDataLoadedType.SOURCES }\n    .onEach { logD(TAG, \"$this - styleSourcesLoaded: $it\") }\n    .shareIn(\n      scope = coroutineScope,\n      started = SharingStarted.Eagerly,\n      replay = 1\n    )\n  internal val styleDataLoaded = styleDataLoadedFlow\n    .filter { it.type == StyleDataLoadedType.STYLE }\n    .onEach { logD(TAG, \"$this - styleDataLoaded: $it\") }\n    .shareIn(\n      scope = coroutineScope,\n      started = SharingStarted.Eagerly,\n      replay = 1\n    )\n  internal val styleSpritesLoaded = styleDataLoadedFlow\n    .filter { it.type == StyleDataLoadedType.SPRITE }\n    .onEach { logD(TAG, \"$this - styleSpritesLoaded: $it\") }\n    .shareIn(\n      scope = coroutineScope,\n      started = SharingStarted.Eagerly,\n      replay = 1\n    )\n\n  override fun onAttached(parent: MapNode) {\n    logD(TAG, \"onAttached: parent=$parent\")\n    updateStyle(style)\n    updateProjection(projection)\n    updateAtmosphere(atmosphereState)\n    updateRain(rainState)\n    updateSnow(snowState)\n    updateTerrain(terrainState)\n  }\n\n  override fun onRemoved(parent: MapNode) {\n    logD(TAG, \"onRemoved: parent=$parent\")\n    coroutineScope.cancel()\n    // remove the current style with loading an empty style json, if this is the only style\n    // node in the node tree.\n    val styleInstances = parent.children.filterIsInstance<MapStyleNode>()\n    if (styleInstances.size == 1) {\n      updateStyle(\"{}\")\n    } else {\n      logW(TAG, \"Multiple style node detected in the tree:\")\n      styleInstances.forEach {\n        logW(TAG, \"\\t${it.style}\")\n      }\n    }\n\n    children.forEach { it.onRemoved(this) }\n  }\n\n  override fun onClear() {\n    super.onClear()\n    atmosphereState.applier.detach()\n    rainState.applier.detach()\n    snowState.applier.detach()\n    terrainState.applier.detach()\n    children.forEach { it.onClear() }\n  }\n\n  private fun updateStyle(style: String) {\n    logD(TAG, \"loadStyle $style started\")\n    mapboxMap.loadStyle(style) {\n      logD(TAG, \"loadStyle $style finished\")\n\n      // TODO: create an AtmosphereState with the gl-native default prefilled then read the\n      //       properties from the style (gl-native could be optimized to only return only the\n      //       mutated ones from their default values, for now we need to read them individually) and\n      //       merge them as the `styleAtmosphereState`.\n    }\n  }\n\n  internal fun updateProjection(projection: Projection) {\n    if (projection.notInitial) {\n      coroutineScope.launch {\n        styleDataLoaded.collect {\n          mapboxMap.setStyleProjection(projection.value)\n            .onValue {\n              Log.d(TAG, \"$projection projection applied\")\n            }.onError {\n              Log.e(TAG, \"Error $it when applying $projection projection\")\n            }\n        }\n      }\n    }\n  }\n\n  internal fun updateAtmosphere(atmosphereState: AtmosphereState) {\n    // we have to detach (in a sense of cancelling property collector jobs) the previous state\n    // before attaching the new state; otherwise the jobs will be duplicated\n    this.atmosphereState.applier.detach()\n    // TODO: merge the atmosphere state from the `styleAtmosphereState` (it was captured above in\n    //       updateStyle) and the new one and then set all the properties. So we avoid possible\n    //       flickering if we would reset the AtmosphereState and then apply the new one\n    this.atmosphereState = atmosphereState\n    coroutineScope.launch {\n      styleDataLoaded.collect {\n        atmosphereState.applier.attachTo(mapboxMap)\n      }\n    }\n  }\n\n  internal fun updateRain(rainState: RainState) {\n    // we have to detach (in a sense of cancelling property collector jobs) the previous state\n    // before attaching the new state; otherwise the jobs will be duplicated\n    this.rainState.applier.detach()\n    this.rainState = rainState\n    coroutineScope.launch {\n      styleDataLoaded.collect {\n        rainState.applier.attachTo(mapboxMap)\n      }\n    }\n  }\n\n  internal fun updateSnow(snowState: SnowState) {\n    // we have to detach (in a sense of cancelling property collector jobs) the previous state\n    // before attaching the new state; otherwise the jobs will be duplicated\n    this.snowState.applier.detach()\n    this.snowState = snowState\n    coroutineScope.launch {\n      styleDataLoaded.collect {\n        snowState.applier.attachTo(mapboxMap)\n      }\n    }\n  }\n\n  internal fun updateTerrain(terrainState: TerrainState) {\n    val previousTerrainState = this.terrainState\n    this.terrainState = terrainState\n    // we have to detach (in a sense of cancelling property collector jobs) the previous state\n    // before attaching the new state; otherwise the jobs will be duplicated\n    previousTerrainState.applier.detach()\n    coroutineScope.launch {\n      styleDataLoaded.collect {\n        // we have to treat terrain as some sort of persistent layer and attach / detach map accordingly\n        previousTerrainState.applier.rasterDemSourceState?.let {\n          it.detachFromLayer(\"mapbox-terrain-${it.sourceId}\", mapboxMap)\n        }\n        terrainState.applier.rasterDemSourceState?.let {\n          it.attachToLayer(\"mapbox-terrain-${it.sourceId}\", mapboxMap)\n        }\n        terrainState.applier.attachTo(mapboxMap)\n      }\n    }\n  }\n\n  internal fun updateStyleTransition(transition: TransitionOptions) {\n    coroutineScope.launch {\n      styleDataLoaded.collect {\n        mapboxMap.setStyleTransition(transition)\n      }\n    }\n  }\n\n  internal fun updateStyleColorTheme(colorTheme: ColorTheme?, isStyleDefault: Boolean) {\n    coroutineScope.launch {\n      styleDataLoaded.collect {\n        if (isStyleDefault) {\n          mapboxMap.setInitialStyleColorTheme()\n        } else {\n          mapboxMap.setStyleColorTheme(colorTheme)\n        }\n      }\n    }\n  }\n\n  override fun toString(): String {\n    return \"MapStyleNode(style=$style)\"\n  }\n\n  private companion object {\n    private const val TAG = \"MapStyleNode\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/internal/ParcelerUtils.kt",
    "content": "package com.mapbox.maps.extension.compose.style.internal\n\nimport android.os.Parcel\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.GeoJSONSourceData\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport kotlinx.parcelize.Parceler\n\ninternal object ValueParceler : Parceler<Value> {\n  override fun create(parcel: Parcel): Value {\n    return Value.fromJson(parcel.readString()!!).value!!\n  }\n\n  override fun Value.write(parcel: Parcel, flags: Int) {\n    parcel.writeString(this.toJson())\n  }\n}\n\ninternal object GeoJSONDataParceler : Parceler<GeoJSONData> {\n  override fun create(parcel: Parcel): GeoJSONData {\n    val typeInfo = GeoJSONSourceData.Type.valueOf(parcel.readString()!!)\n    return when (typeInfo) {\n      GeoJSONSourceData.Type.FEATURE -> GeoJSONData(Feature.fromJson(parcel.readString()!!))\n      GeoJSONSourceData.Type.GEOMETRY -> GeoJSONData(\n        Feature.fromJson(parcel.readString()!!).geometry()!!\n      )\n\n      GeoJSONSourceData.Type.LIST -> {\n        val size = parcel.readInt()\n        val list = mutableListOf<Feature>()\n        repeat(size) {\n          list.add(Feature.fromJson(parcel.readString()!!))\n        }\n        GeoJSONData(list)\n      }\n\n      GeoJSONSourceData.Type.STRING -> GeoJSONData(parcel.readString()!!)\n      else -> throw IllegalStateException(\"Cannot create GeoJSONData from parcel $parcel\")\n    }\n  }\n\n  override fun GeoJSONData.write(parcel: Parcel, flags: Int) {\n    val typeInfo = data.typeInfo.name\n    parcel.writeString(typeInfo)\n    when (data.typeInfo) {\n      GeoJSONSourceData.Type.FEATURE -> {\n        parcel.writeString(data.feature.toJson())\n      }\n\n      GeoJSONSourceData.Type.GEOMETRY -> {\n        // wrap into a feature to be able to use fromJson constructor.\n        parcel.writeString(Feature.fromGeometry(data.geometry).toJson())\n      }\n\n      GeoJSONSourceData.Type.LIST -> {\n        parcel.writeInt(data.list.size)\n        data.list.forEach { parcel.writeString(it.toJson()) }\n      }\n\n      GeoJSONSourceData.Type.STRING -> {\n        parcel.writeString(data.string)\n      }\n\n      else -> {\n        Unit\n      }\n    }\n  }\n}\n\ninternal object PairParceler : Parceler<Pair<Boolean, Value>> {\n  override fun create(parcel: Parcel): Pair<Boolean, Value> {\n    val isBuilderProperty = parcel.readInt() == 1\n    val value = Value.fromJson(parcel.readString()!!).value!!\n    return Pair(isBuilderProperty, value)\n  }\n\n  override fun Pair<Boolean, Value>.write(parcel: Parcel, flags: Int) {\n    parcel.writeInt(if (first) 1 else 0)\n    parcel.writeString(second.toJson())\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/internal/StyleAwareNode.kt",
    "content": "package com.mapbox.maps.extension.compose.style.internal\n\nimport com.mapbox.maps.extension.compose.internal.MapNode\n\ninternal abstract class StyleAwareNode : MapNode() {\n  abstract val mapStyleNode: MapStyleNode\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/internal/StyleConfig.kt",
    "content": "package com.mapbox.maps.extension.compose.style.internal\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.extension.compose.style.MapboxStyleComposable\nimport com.mapbox.maps.logD\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.launch\n\ninternal class StyleConfigNode(\n  private val importId: String,\n  private val configName: String,\n  private val mapboxMap: MapboxMap,\n  private val coroutineScope: CoroutineScope,\n) : MapNode() {\n\n  private val styleManagerFlow: MutableStateFlow<MapboxStyleManager?> = MutableStateFlow(null)\n\n  override fun onAttached(parent: MapNode) {\n    val mapStyleNode = parent as MapStyleNode\n    coroutineScope.launch {\n      mapStyleNode.styleDataLoaded.collect {\n        styleManagerFlow.value = mapboxMap\n      }\n    }\n  }\n\n  private fun dispatchWhenStyleDataLoaded(action: (MapboxStyleManager) -> Unit) {\n    coroutineScope.launch {\n      styleManagerFlow.filterNotNull().first().apply(action)\n    }\n  }\n\n  fun setProperty(value: Value) {\n    dispatchWhenStyleDataLoaded {\n      logD(TAG, \"Setting style import config property $value for $this\")\n      mapboxMap.setStyleImportConfigProperty(importId = importId, config = configName, value)\n    }\n  }\n\n  override fun toString(): String {\n    return \"StyleConfigNode(importId=$importId, configName=$configName)\"\n  }\n\n  companion object {\n    private const val TAG = \"StyleConfigNode\"\n  }\n}\n\n/**\n * This is a internal composable function because we only want to expose it through Style with hashmap.\n * As it's bound with the configs available in the style JSON, and we also don't want multiple Config/Import declaration\n * with the same name, as it will mess up with our layer ordering.\n */\n@Composable\n@MapboxStyleComposable\ninternal fun StyleConfig(\n  importId: String,\n  name: String,\n  property: Value,\n) {\n  val applier = currentComposer.applier as? MapApplier\n  val coroutineScope = rememberCoroutineScope()\n  applier?.let { mapApplier ->\n    // Insert a MapNode to the MapApplier node tree\n    ComposeNode<StyleConfigNode, MapApplier>(\n      factory = {\n        StyleConfigNode(importId, name, mapApplier.mapView.mapboxMap, coroutineScope)\n      },\n      update = {\n        set(property) {\n          setProperty(property)\n        }\n      }\n    )\n  }\n    ?: throw IllegalStateException(\"Illegal use of StyleConfig composable outside of MapboxMapComposable\")\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/internal/StyleLayerPosition.kt",
    "content": "package com.mapbox.maps.extension.compose.style.internal\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.extension.compose.style.MapboxStyleComposable\n\ninternal class StyleLayerPositionNode(\n  internal val layerPosition: LayerPosition,\n) : StyleAwareNode() {\n  override lateinit var mapStyleNode: MapStyleNode\n\n  override fun onAttached(parent: MapNode) {\n    mapStyleNode = parent as MapStyleNode\n  }\n\n  override fun onRemoved(parent: MapNode) {\n    cleanUp()\n  }\n\n  override fun onClear() {\n    cleanUp()\n  }\n\n  private fun cleanUp() {\n    this.children.forEach { it.onClear() }\n  }\n\n  override fun toString(): String {\n    return \"StyleLayerPositionNode(layerPosition=$layerPosition)\"\n  }\n}\n\n/**\n * This is a internal composable function because we only want to expose it through Style with hashmap.\n * As it's bound with the style layers available in the style JSON, and we also don't want multiple layerPosition declaration\n * with the same position, as it will mess up with our layer ordering.\n */\n@Composable\n@MapboxStyleComposable\ninternal fun StyleLayerPosition(\n  layerPosition: LayerPosition,\n  content: (@Composable @MapboxMapComposable () -> Unit)? = null\n) {\n  val applier = currentComposer.applier as? MapApplier\n  applier?.let {\n    ComposeNode<StyleLayerPositionNode, MapApplier>(\n      factory = {\n        StyleLayerPositionNode(layerPosition)\n      },\n      update = { }\n    ) {\n      content?.invoke()\n    }\n  }\n    ?: throw IllegalStateException(\"Illegal use of StyleLayerPosition composable outside of MapboxMapComposable\")\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/internal/StyleSlot.kt",
    "content": "package com.mapbox.maps.extension.compose.style.internal\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.extension.compose.style.MapboxStyleComposable\n\ninternal class StyleSlotNode(\n  internal val slotName: String,\n) : StyleAwareNode() {\n  override lateinit var mapStyleNode: MapStyleNode\n  override fun onAttached(parent: MapNode) {\n    mapStyleNode = parent as MapStyleNode\n  }\n\n  override fun onRemoved(parent: MapNode) {\n    cleanUp()\n  }\n\n  override fun onClear() {\n    cleanUp()\n  }\n\n  private fun cleanUp() {\n    this.children.forEach { it.onClear() }\n  }\n\n  override fun toString(): String {\n    return \"StyleSlotNode(slotName=$slotName)\"\n  }\n}\n\n/**\n * This is a internal composable function because we only want to expose it through Style with hashmap.\n * As it's bound with the slots available in the style JSON, and we also don't want multiple Slot declaration\n * with the same name, as it will mess up with our layer ordering.\n */\n@Composable\n@MapboxStyleComposable\ninternal fun StyleSlot(\n  name: String,\n  content: (@Composable @MapboxMapComposable () -> Unit)? = null\n) {\n  val applier = currentComposer.applier as? MapApplier\n  applier?.let {\n    // Insert a MapNode to the MapApplier node tree\n    ComposeNode<StyleSlotNode, MapApplier>(\n      factory = {\n        StyleSlotNode(name)\n      },\n      update = {}\n    ) {\n      content?.invoke()\n    }\n  }\n    ?: throw IllegalStateException(\"Illegal use of StyleSlot composable outside of MapboxMapComposable\")\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/LayerInteractionsState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.layers\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.mutableStateListOf\nimport androidx.compose.runtime.remember\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.InteractionContext\nimport com.mapbox.maps.LongClickInteraction\nimport com.mapbox.maps.MapInteraction\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.style.interactions.BasicStyleInteractions\nimport com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * Convenient method to create a [LayerInteractionsState] and remember it with the init block.\n *\n * @param init the initialization block applied to the [LayerInteractionsState] after it is created and remembered.\n *\n * @return [LayerInteractionsState]\n */\n@MapboxExperimental\n@Composable\npublic inline fun rememberLayerInteractionsState(crossinline init: LayerInteractionsState.() -> Unit = {}): LayerInteractionsState {\n  return remember {\n    LayerInteractionsState()\n  }.apply(init)\n}\n\n/**\n * [LayerInteractionsState] manages the map interactions defined for the layer.\n */\n@Stable\n@MapboxExperimental\npublic class LayerInteractionsState : BasicStyleInteractions() {\n\n  private val styleLayerEntries: MutableList<(String) -> MapInteraction> = mutableListOf()\n\n  @Composable\n  private fun UpdateLayerInteractions(map: MapboxMap, layerId: String) {\n    val cancelables = remember {\n      mutableStateListOf<Cancelable>()\n    }\n    DisposableEffect(key1 = styleLayerEntries) {\n      styleLayerEntries.forEach {\n        cancelables.add(map.addInteraction(it.invoke(layerId)))\n      }\n      onDispose {\n        cancelables.forEach { it.cancel() }\n        cancelables.clear()\n      }\n    }\n  }\n\n  @Composable\n  internal fun BindTo(mapboxMap: MapboxMap, layerId: String) {\n    BindToMap(map = mapboxMap)\n    UpdateLayerInteractions(map = mapboxMap, layerId = layerId)\n  }\n\n  /**\n   * Add the [ClickInteraction] for this layer.\n   *\n   * When several [ClickInteraction]s are registered for the same layer - the callbacks will be triggered from last to first.\n   *\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when layer is clicked.\n   */\n  @MapboxExperimental\n  public fun onClicked(\n    filter: Expression? = null,\n    radius: Double? = null,\n    onClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): LayerInteractionsState = apply {\n    styleLayerEntries.add { layerId ->\n      ClickInteraction.layer(\n        id = layerId,\n        filter = filter,\n        radius = radius,\n        onClick = { feature, context ->\n          featuresetFeatureScope?.onClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Create the [LongClickInteraction] for this layer.\n   *\n   * When several [LongClickInteraction]s are registered for the same layer - the callbacks will be triggered from last to first.\n   *\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when layer is clicked.\n   */\n  @MapboxExperimental\n  public fun onLongClicked(\n    filter: Expression? = null,\n    radius: Double? = null,\n    onLongClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): LayerInteractionsState = apply {\n    styleLayerEntries.add { layerId ->\n      LongClickInteraction.layer(\n        id = layerId,\n        filter = filter,\n        radius = radius,\n        onLongClick = { feature, context ->\n          featuresetFeatureScope?.onLongClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/PropertyTypes.kt",
    "content": "package com.mapbox.maps.extension.compose.style.layers\n\nimport androidx.annotation.RestrictTo\nimport androidx.compose.runtime.Immutable\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.HoldsValue\nimport com.mapbox.maps.extension.compose.style.StyleImage\nimport com.mapbox.maps.extension.compose.style.internal.ComposeTypeUtils\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\n\n/**\n * Defines the the filter type for Mapbox style.\n *\n * @param value the filter expression wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class Filter internal constructor(public override val value: Value) : HoldsValue {\n\n  /**\n   * Construct the [Filter] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: Filter = Filter(Value.valueOf(\"Filter.INITIAL\"))\n\n    /**\n     * Default value for [Filter], setting default will result in restoring the default filter defined in the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: Filter = Filter(Value.nullValue())\n  }\n}\n\n/**\n * Defines the the Formatted type for Mapbox style. See [Formatted](https://docs.mapbox.com/style-spec/reference/types/#formatted).\n *\n * @param value the Formatted expression wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class FormattedValue internal constructor(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [FormattedValue] with [String].\n   */\n  public constructor(value: String) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the [FormattedValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * The [String] represented by [value] or `null` if the stored [Value] is not a [String].\n   */\n  public val stringOrNull: String?\n    get() = value.contents as? String\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: FormattedValue = FormattedValue(Value.valueOf(\"FormattedValue.INITIAL\"))\n\n    /**\n     * Default value for [FormattedValue], setting default will result in restoring the default formatted defined by rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: FormattedValue = FormattedValue(Value.nullValue())\n  }\n}\n\n/**\n * Name of image in sprite to use as the top of the location indicator.\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n * @param styleImage the optional style image that will be added to the style if available.\n */\n@Immutable\npublic data class ImageValue internal constructor(public val value: Value, public val styleImage: StyleImage? = null) {\n  /**\n   * Construct the [ImageValue] with [StyleImage].\n   */\n  public constructor(styleImage: StyleImage) : this(Value(styleImage.imageId), styleImage)\n\n  /**\n   * Construct the [ImageValue] with image id as [String].\n   */\n  public constructor(imageId: String) : this(ComposeTypeUtils.wrapToValue(imageId))\n\n  /**\n   * Construct the TopImage with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The [String] represented by [value] or `null` if the stored [Value] is not a [String].\n   */\n  public val imageIdOrNull: String?\n    get() = value.contents as? String\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  internal val notInitial: Boolean\n    get() = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [default], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ImageValue = ImageValue(Value.valueOf(\"ImageValue.INITIAL\"))\n\n    /**\n     * Default value for [ImageValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: ImageValue = ImageValue(Value.nullValue())\n  }\n}\n\n/**\n * Model to render.\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n * @param modelInfo The optional 3D model information, including the model id and model uri as a pair of [String]. It will be added to the style if available.\n */\n@Immutable\n@MapboxExperimental\npublic data class ModelIdValue internal constructor(public val value: Value, public val modelInfo: Pair<String, String>? = null) {\n  /**\n   * Construct the [ModelIdValue] with [String].\n   */\n  public constructor(value: String) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the [ModelIdValue] with [modelId] and [uri].\n   *\n   * @param modelId the ID of the model\n   * @param uri the uri of the model\n   */\n  public constructor(modelId: String, uri: String) : this(Value(modelId), modelId to uri)\n\n  /**\n   * Construct the [ModelIdValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * The [String] represented by [value] or `null` if the stored [Value] is not a [String].\n   */\n  public val modelIdOrNull: String?\n    get() = value.contents as? String\n\n  /**\n   * The optional uri of the model if it's defined.\n   */\n  public val uriOrNull: String?\n    get() = modelInfo?.second\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  internal val notInitial: Boolean\n    get() = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ModelIdValue = ModelIdValue(Value.valueOf(\"ModelId.INITIAL\"))\n\n    /**\n     * Default value for [ModelIdValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: ModelIdValue = ModelIdValue(Value.nullValue())\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/BackgroundLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The background color or pattern of the map.\n *\n * This composable function inserts a [BackgroundLayer] to the map. For convenience, if there's\n * no need to hoist the [backgroundLayerState], use `BackgroundLayer(layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#background)\n *\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param backgroundLayerState the state holder for [BackgroundLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun BackgroundLayer(\n  layerId: String = remember {\n    generateRandomLayerId(\"background\")\n  },\n  backgroundLayerState: BackgroundLayerState = remember { BackgroundLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of BackgroundLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"background\",\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(backgroundLayerState) {\n      backgroundLayerState.UpdateProperties(layerNode)\n    }\n  }\n}\n\n/**\n * The background color or pattern of the map.\n *\n * This composable function inserts a [BackgroundLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#background)\n *\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [BackgroundLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun BackgroundLayer(\n  layerId: String = remember {\n    generateRandomLayerId(\"background\")\n  },\n  crossinline init: BackgroundLayerState.() -> Unit\n) {\n  BackgroundLayer(layerId = layerId, backgroundLayerState = remember { BackgroundLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/BackgroundLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.AddImageWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.ImageValue\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [BackgroundLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#background)\n */\n@Stable\npublic class BackgroundLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialBackgroundColor: ColorValue,\n  initialBackgroundColorUseTheme: StringValue,\n  initialBackgroundColorTransition: Transition,\n  initialBackgroundEmissiveStrength: DoubleValue,\n  initialBackgroundEmissiveStrengthTransition: Transition,\n  initialBackgroundOpacity: DoubleValue,\n  initialBackgroundOpacityTransition: Transition,\n  initialBackgroundPattern: ImageValue,\n  initialBackgroundPitchAlignment: BackgroundPitchAlignmentValue,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n) {\n  /**\n   * Construct an default [BackgroundLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialBackgroundColor = ColorValue.INITIAL,\n    initialBackgroundColorUseTheme = StringValue.INITIAL,\n    initialBackgroundColorTransition = Transition.INITIAL,\n    initialBackgroundEmissiveStrength = DoubleValue.INITIAL,\n    initialBackgroundEmissiveStrengthTransition = Transition.INITIAL,\n    initialBackgroundOpacity = DoubleValue.INITIAL,\n    initialBackgroundOpacityTransition = Transition.INITIAL,\n    initialBackgroundPattern = ImageValue.INITIAL,\n    initialBackgroundPitchAlignment = BackgroundPitchAlignmentValue.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n  )\n\n  private val backgroundColorState: MutableState<ColorValue> = mutableStateOf(initialBackgroundColor)\n  /**\n   *  The color with which the background will be drawn. Default value: \"#000000\".\n   */\n  public var backgroundColor: ColorValue by backgroundColorState\n\n  @MapboxExperimental\n  private val backgroundColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialBackgroundColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [backgroundColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var backgroundColorUseTheme: StringValue by backgroundColorUseThemeState\n\n  private val backgroundColorTransitionState: MutableState<Transition> = mutableStateOf(initialBackgroundColorTransition)\n  /**\n   *  Defines the transition of [backgroundColor].\n   */\n  public var backgroundColorTransition: Transition by backgroundColorTransitionState\n\n  private val backgroundEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialBackgroundEmissiveStrength)\n  /**\n   *  Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n   */\n  public var backgroundEmissiveStrength: DoubleValue by backgroundEmissiveStrengthState\n\n  private val backgroundEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialBackgroundEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [backgroundEmissiveStrength].\n   */\n  public var backgroundEmissiveStrengthTransition: Transition by backgroundEmissiveStrengthTransitionState\n\n  private val backgroundOpacityState: MutableState<DoubleValue> = mutableStateOf(initialBackgroundOpacity)\n  /**\n   *  The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var backgroundOpacity: DoubleValue by backgroundOpacityState\n\n  private val backgroundOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialBackgroundOpacityTransition)\n  /**\n   *  Defines the transition of [backgroundOpacity].\n   */\n  public var backgroundOpacityTransition: Transition by backgroundOpacityTransitionState\n\n  private val backgroundPatternState: MutableState<ImageValue> = mutableStateOf(initialBackgroundPattern)\n  /**\n   *  Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  public var backgroundPattern: ImageValue by backgroundPatternState\n\n  @MapboxExperimental\n  private val backgroundPitchAlignmentState: MutableState<BackgroundPitchAlignmentValue> = mutableStateOf(initialBackgroundPitchAlignment)\n  /**\n   *  Orientation of background layer. Default value: \"map\".\n   */\n  @MapboxExperimental\n  public var backgroundPitchAlignment: BackgroundPitchAlignmentValue by backgroundPitchAlignmentState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, backgroundColorState, \"background-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, backgroundColorUseThemeState, \"background-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, backgroundColorTransitionState, \"background-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, backgroundEmissiveStrengthState, \"background-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, backgroundEmissiveStrengthTransitionState, \"background-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, backgroundOpacityState, \"background-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, backgroundOpacityTransitionState, \"background-opacity-transition\")\n    AddImageWhenNotInitial(layerNode, backgroundPatternState, \"background-pattern\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, backgroundPitchAlignmentState, \"background-pitch-alignment\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/CircleLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * A filled circle.\n *\n * This composable function inserts a [CircleLayer] to the map. For convenience, if there's\n * no need to hoist the [circleLayerState], use `CircleLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#circle)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param circleLayerState the state holder for [CircleLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun CircleLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"circle\")\n  },\n  circleLayerState: CircleLayerState = remember { CircleLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of CircleLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"circle\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(circleLayerState) {\n      circleLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(circleLayerState.interactionsState) {\n    circleLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * A filled circle.\n *\n * This composable function inserts a [CircleLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#circle)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [CircleLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun CircleLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"circle\")\n  },\n  crossinline init: CircleLayerState.() -> Unit\n) {\n  CircleLayer(sourceState = sourceState, layerId = layerId, circleLayerState = remember { CircleLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/CircleLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [CircleLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#circle)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class CircleLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialCircleElevationReference: CircleElevationReferenceValue,\n  initialCircleSortKey: DoubleValue,\n  initialCircleBlur: DoubleValue,\n  initialCircleBlurTransition: Transition,\n  initialCircleColor: ColorValue,\n  initialCircleColorUseTheme: StringValue,\n  initialCircleColorTransition: Transition,\n  initialCircleEmissiveStrength: DoubleValue,\n  initialCircleEmissiveStrengthTransition: Transition,\n  initialCircleOpacity: DoubleValue,\n  initialCircleOpacityTransition: Transition,\n  initialCirclePitchAlignment: CirclePitchAlignmentValue,\n  initialCirclePitchScale: CirclePitchScaleValue,\n  initialCircleRadius: DoubleValue,\n  initialCircleRadiusTransition: Transition,\n  initialCircleStrokeColor: ColorValue,\n  initialCircleStrokeColorUseTheme: StringValue,\n  initialCircleStrokeColorTransition: Transition,\n  initialCircleStrokeOpacity: DoubleValue,\n  initialCircleStrokeOpacityTransition: Transition,\n  initialCircleStrokeWidth: DoubleValue,\n  initialCircleStrokeWidthTransition: Transition,\n  initialCircleTranslate: DoubleListValue,\n  initialCircleTranslateTransition: Transition,\n  initialCircleTranslateAnchor: CircleTranslateAnchorValue,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [CircleLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialCircleElevationReference = CircleElevationReferenceValue.INITIAL,\n    initialCircleSortKey = DoubleValue.INITIAL,\n    initialCircleBlur = DoubleValue.INITIAL,\n    initialCircleBlurTransition = Transition.INITIAL,\n    initialCircleColor = ColorValue.INITIAL,\n    initialCircleColorUseTheme = StringValue.INITIAL,\n    initialCircleColorTransition = Transition.INITIAL,\n    initialCircleEmissiveStrength = DoubleValue.INITIAL,\n    initialCircleEmissiveStrengthTransition = Transition.INITIAL,\n    initialCircleOpacity = DoubleValue.INITIAL,\n    initialCircleOpacityTransition = Transition.INITIAL,\n    initialCirclePitchAlignment = CirclePitchAlignmentValue.INITIAL,\n    initialCirclePitchScale = CirclePitchScaleValue.INITIAL,\n    initialCircleRadius = DoubleValue.INITIAL,\n    initialCircleRadiusTransition = Transition.INITIAL,\n    initialCircleStrokeColor = ColorValue.INITIAL,\n    initialCircleStrokeColorUseTheme = StringValue.INITIAL,\n    initialCircleStrokeColorTransition = Transition.INITIAL,\n    initialCircleStrokeOpacity = DoubleValue.INITIAL,\n    initialCircleStrokeOpacityTransition = Transition.INITIAL,\n    initialCircleStrokeWidth = DoubleValue.INITIAL,\n    initialCircleStrokeWidthTransition = Transition.INITIAL,\n    initialCircleTranslate = DoubleListValue.INITIAL,\n    initialCircleTranslateTransition = Transition.INITIAL,\n    initialCircleTranslateAnchor = CircleTranslateAnchorValue.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  @MapboxExperimental\n  private val circleElevationReferenceState: MutableState<CircleElevationReferenceValue> = mutableStateOf(initialCircleElevationReference)\n  /**\n   *  Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  @MapboxExperimental\n  public var circleElevationReference: CircleElevationReferenceValue by circleElevationReferenceState\n\n  private val circleSortKeyState: MutableState<DoubleValue> = mutableStateOf(initialCircleSortKey)\n  /**\n   *  Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  public var circleSortKey: DoubleValue by circleSortKeyState\n\n  private val circleBlurState: MutableState<DoubleValue> = mutableStateOf(initialCircleBlur)\n  /**\n   *  Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   */\n  public var circleBlur: DoubleValue by circleBlurState\n\n  private val circleBlurTransitionState: MutableState<Transition> = mutableStateOf(initialCircleBlurTransition)\n  /**\n   *  Defines the transition of [circleBlur].\n   */\n  public var circleBlurTransition: Transition by circleBlurTransitionState\n\n  private val circleColorState: MutableState<ColorValue> = mutableStateOf(initialCircleColor)\n  /**\n   *  The fill color of the circle. Default value: \"#000000\".\n   */\n  public var circleColor: ColorValue by circleColorState\n\n  @MapboxExperimental\n  private val circleColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialCircleColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [circleColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var circleColorUseTheme: StringValue by circleColorUseThemeState\n\n  private val circleColorTransitionState: MutableState<Transition> = mutableStateOf(initialCircleColorTransition)\n  /**\n   *  Defines the transition of [circleColor].\n   */\n  public var circleColorTransition: Transition by circleColorTransitionState\n\n  private val circleEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialCircleEmissiveStrength)\n  /**\n   *  Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   */\n  public var circleEmissiveStrength: DoubleValue by circleEmissiveStrengthState\n\n  private val circleEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialCircleEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [circleEmissiveStrength].\n   */\n  public var circleEmissiveStrengthTransition: Transition by circleEmissiveStrengthTransitionState\n\n  private val circleOpacityState: MutableState<DoubleValue> = mutableStateOf(initialCircleOpacity)\n  /**\n   *  The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var circleOpacity: DoubleValue by circleOpacityState\n\n  private val circleOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialCircleOpacityTransition)\n  /**\n   *  Defines the transition of [circleOpacity].\n   */\n  public var circleOpacityTransition: Transition by circleOpacityTransitionState\n\n  private val circlePitchAlignmentState: MutableState<CirclePitchAlignmentValue> = mutableStateOf(initialCirclePitchAlignment)\n  /**\n   *  Orientation of circle when map is pitched. Default value: \"viewport\".\n   */\n  public var circlePitchAlignment: CirclePitchAlignmentValue by circlePitchAlignmentState\n\n  private val circlePitchScaleState: MutableState<CirclePitchScaleValue> = mutableStateOf(initialCirclePitchScale)\n  /**\n   *  Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n   */\n  public var circlePitchScale: CirclePitchScaleValue by circlePitchScaleState\n\n  private val circleRadiusState: MutableState<DoubleValue> = mutableStateOf(initialCircleRadius)\n  /**\n   *  Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   */\n  public var circleRadius: DoubleValue by circleRadiusState\n\n  private val circleRadiusTransitionState: MutableState<Transition> = mutableStateOf(initialCircleRadiusTransition)\n  /**\n   *  Defines the transition of [circleRadius].\n   */\n  public var circleRadiusTransition: Transition by circleRadiusTransitionState\n\n  private val circleStrokeColorState: MutableState<ColorValue> = mutableStateOf(initialCircleStrokeColor)\n  /**\n   *  The stroke color of the circle. Default value: \"#000000\".\n   */\n  public var circleStrokeColor: ColorValue by circleStrokeColorState\n\n  @MapboxExperimental\n  private val circleStrokeColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialCircleStrokeColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [circleStrokeColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var circleStrokeColorUseTheme: StringValue by circleStrokeColorUseThemeState\n\n  private val circleStrokeColorTransitionState: MutableState<Transition> = mutableStateOf(initialCircleStrokeColorTransition)\n  /**\n   *  Defines the transition of [circleStrokeColor].\n   */\n  public var circleStrokeColorTransition: Transition by circleStrokeColorTransitionState\n\n  private val circleStrokeOpacityState: MutableState<DoubleValue> = mutableStateOf(initialCircleStrokeOpacity)\n  /**\n   *  The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   */\n  public var circleStrokeOpacity: DoubleValue by circleStrokeOpacityState\n\n  private val circleStrokeOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialCircleStrokeOpacityTransition)\n  /**\n   *  Defines the transition of [circleStrokeOpacity].\n   */\n  public var circleStrokeOpacityTransition: Transition by circleStrokeOpacityTransitionState\n\n  private val circleStrokeWidthState: MutableState<DoubleValue> = mutableStateOf(initialCircleStrokeWidth)\n  /**\n   *  The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   */\n  public var circleStrokeWidth: DoubleValue by circleStrokeWidthState\n\n  private val circleStrokeWidthTransitionState: MutableState<Transition> = mutableStateOf(initialCircleStrokeWidthTransition)\n  /**\n   *  Defines the transition of [circleStrokeWidth].\n   */\n  public var circleStrokeWidthTransition: Transition by circleStrokeWidthTransitionState\n\n  private val circleTranslateState: MutableState<DoubleListValue> = mutableStateOf(initialCircleTranslate)\n  /**\n   *  The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   */\n  public var circleTranslate: DoubleListValue by circleTranslateState\n\n  private val circleTranslateTransitionState: MutableState<Transition> = mutableStateOf(initialCircleTranslateTransition)\n  /**\n   *  Defines the transition of [circleTranslate].\n   */\n  public var circleTranslateTransition: Transition by circleTranslateTransitionState\n\n  private val circleTranslateAnchorState: MutableState<CircleTranslateAnchorValue> = mutableStateOf(initialCircleTranslateAnchor)\n  /**\n   *  Controls the frame of reference for `circle-translate`. Default value: \"map\".\n   */\n  public var circleTranslateAnchor: CircleTranslateAnchorValue by circleTranslateAnchorState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleElevationReferenceState, \"circle-elevation-reference\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleSortKeyState, \"circle-sort-key\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleBlurState, \"circle-blur\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleBlurTransitionState, \"circle-blur-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleColorState, \"circle-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleColorUseThemeState, \"circle-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleColorTransitionState, \"circle-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleEmissiveStrengthState, \"circle-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleEmissiveStrengthTransitionState, \"circle-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleOpacityState, \"circle-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleOpacityTransitionState, \"circle-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circlePitchAlignmentState, \"circle-pitch-alignment\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circlePitchScaleState, \"circle-pitch-scale\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleRadiusState, \"circle-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleRadiusTransitionState, \"circle-radius-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleStrokeColorState, \"circle-stroke-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleStrokeColorUseThemeState, \"circle-stroke-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleStrokeColorTransitionState, \"circle-stroke-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleStrokeOpacityState, \"circle-stroke-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleStrokeOpacityTransitionState, \"circle-stroke-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleStrokeWidthState, \"circle-stroke-width\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleStrokeWidthTransitionState, \"circle-stroke-width-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleTranslateState, \"circle-translate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleTranslateTransitionState, \"circle-translate-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, circleTranslateAnchorState, \"circle-translate-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/ClipLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * Layer that removes 3D content from map.\n *\n * This composable function inserts a [ClipLayer] to the map. For convenience, if there's\n * no need to hoist the [clipLayerState], use `ClipLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#clip)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param clipLayerState the state holder for [ClipLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun ClipLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"clip\")\n  },\n  clipLayerState: ClipLayerState = remember { ClipLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of ClipLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"clip\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(clipLayerState) {\n      clipLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(clipLayerState.interactionsState) {\n    clipLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * Layer that removes 3D content from map.\n *\n * This composable function inserts a [ClipLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#clip)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [ClipLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun ClipLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"clip\")\n  },\n  crossinline init: ClipLayerState.() -> Unit\n) {\n  ClipLayer(sourceState = sourceState, layerId = layerId, clipLayerState = remember { ClipLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/ClipLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringListValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [ClipLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#clip)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class ClipLayerState\nprivate constructor(\n  initialClipLayerScope: StringListValue,\n  initialClipLayerTypes: ClipLayerTypesListValue,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [ClipLayerState].\n   */\n  public constructor() : this(\n    initialClipLayerScope = StringListValue.INITIAL,\n    initialClipLayerTypes = ClipLayerTypesListValue.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  private val clipLayerScopeState: MutableState<StringListValue> = mutableStateOf(initialClipLayerScope)\n  /**\n   *  Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n   */\n  public var clipLayerScope: StringListValue by clipLayerScopeState\n\n  private val clipLayerTypesState: MutableState<ClipLayerTypesListValue> = mutableStateOf(initialClipLayerTypes)\n  /**\n   *  Layer types that will also be removed if fallen below this clip layer. Default value: [].\n   */\n  public var clipLayerTypes: ClipLayerTypesListValue by clipLayerTypesState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, clipLayerScopeState, \"clip-layer-scope\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, clipLayerTypesState, \"clip-layer-types\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * An extruded (3D) polygon.\n *\n * This composable function inserts a [FillExtrusionLayer] to the map. For convenience, if there's\n * no need to hoist the [fillExtrusionLayerState], use `FillExtrusionLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#fill-extrusion)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param fillExtrusionLayerState the state holder for [FillExtrusionLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun FillExtrusionLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"fill-extrusion\")\n  },\n  fillExtrusionLayerState: FillExtrusionLayerState = remember { FillExtrusionLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of FillExtrusionLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"fill-extrusion\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(fillExtrusionLayerState) {\n      fillExtrusionLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(fillExtrusionLayerState.interactionsState) {\n    fillExtrusionLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * An extruded (3D) polygon.\n *\n * This composable function inserts a [FillExtrusionLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#fill-extrusion)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [FillExtrusionLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun FillExtrusionLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"fill-extrusion\")\n  },\n  crossinline init: FillExtrusionLayerState.() -> Unit\n) {\n  FillExtrusionLayer(sourceState = sourceState, layerId = layerId, fillExtrusionLayerState = remember { FillExtrusionLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/FillExtrusionLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.AddImageWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.ImageValue\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [FillExtrusionLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#fill-extrusion)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class FillExtrusionLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialFillExtrusionEdgeRadius: DoubleValue,\n  initialFillExtrusionAmbientOcclusionGroundAttenuation: DoubleValue,\n  initialFillExtrusionAmbientOcclusionGroundAttenuationTransition: Transition,\n  initialFillExtrusionAmbientOcclusionGroundRadius: DoubleValue,\n  initialFillExtrusionAmbientOcclusionGroundRadiusTransition: Transition,\n  initialFillExtrusionAmbientOcclusionIntensity: DoubleValue,\n  initialFillExtrusionAmbientOcclusionIntensityTransition: Transition,\n  initialFillExtrusionAmbientOcclusionRadius: DoubleValue,\n  initialFillExtrusionAmbientOcclusionRadiusTransition: Transition,\n  initialFillExtrusionAmbientOcclusionWallRadius: DoubleValue,\n  initialFillExtrusionAmbientOcclusionWallRadiusTransition: Transition,\n  initialFillExtrusionBase: DoubleValue,\n  initialFillExtrusionBaseTransition: Transition,\n  initialFillExtrusionBaseAlignment: FillExtrusionBaseAlignmentValue,\n  initialFillExtrusionCastShadows: BooleanValue,\n  initialFillExtrusionColor: ColorValue,\n  initialFillExtrusionColorUseTheme: StringValue,\n  initialFillExtrusionColorTransition: Transition,\n  initialFillExtrusionCutoffFadeRange: DoubleValue,\n  initialFillExtrusionEmissiveStrength: DoubleValue,\n  initialFillExtrusionEmissiveStrengthTransition: Transition,\n  initialFillExtrusionFloodLightColor: ColorValue,\n  initialFillExtrusionFloodLightColorUseTheme: StringValue,\n  initialFillExtrusionFloodLightColorTransition: Transition,\n  initialFillExtrusionFloodLightGroundAttenuation: DoubleValue,\n  initialFillExtrusionFloodLightGroundAttenuationTransition: Transition,\n  initialFillExtrusionFloodLightGroundRadius: DoubleValue,\n  initialFillExtrusionFloodLightGroundRadiusTransition: Transition,\n  initialFillExtrusionFloodLightIntensity: DoubleValue,\n  initialFillExtrusionFloodLightIntensityTransition: Transition,\n  initialFillExtrusionFloodLightWallRadius: DoubleValue,\n  initialFillExtrusionFloodLightWallRadiusTransition: Transition,\n  initialFillExtrusionHeight: DoubleValue,\n  initialFillExtrusionHeightTransition: Transition,\n  initialFillExtrusionHeightAlignment: FillExtrusionHeightAlignmentValue,\n  initialFillExtrusionLineWidth: DoubleValue,\n  initialFillExtrusionLineWidthTransition: Transition,\n  initialFillExtrusionOpacity: DoubleValue,\n  initialFillExtrusionOpacityTransition: Transition,\n  initialFillExtrusionPattern: ImageValue,\n  initialFillExtrusionPatternCrossFade: DoubleValue,\n  initialFillExtrusionRoundedRoof: BooleanValue,\n  initialFillExtrusionTranslate: DoubleListValue,\n  initialFillExtrusionTranslateTransition: Transition,\n  initialFillExtrusionTranslateAnchor: FillExtrusionTranslateAnchorValue,\n  initialFillExtrusionVerticalGradient: BooleanValue,\n  initialFillExtrusionVerticalScale: DoubleValue,\n  initialFillExtrusionVerticalScaleTransition: Transition,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [FillExtrusionLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialFillExtrusionEdgeRadius = DoubleValue.INITIAL,\n    initialFillExtrusionAmbientOcclusionGroundAttenuation = DoubleValue.INITIAL,\n    initialFillExtrusionAmbientOcclusionGroundAttenuationTransition = Transition.INITIAL,\n    initialFillExtrusionAmbientOcclusionGroundRadius = DoubleValue.INITIAL,\n    initialFillExtrusionAmbientOcclusionGroundRadiusTransition = Transition.INITIAL,\n    initialFillExtrusionAmbientOcclusionIntensity = DoubleValue.INITIAL,\n    initialFillExtrusionAmbientOcclusionIntensityTransition = Transition.INITIAL,\n    initialFillExtrusionAmbientOcclusionRadius = DoubleValue.INITIAL,\n    initialFillExtrusionAmbientOcclusionRadiusTransition = Transition.INITIAL,\n    initialFillExtrusionAmbientOcclusionWallRadius = DoubleValue.INITIAL,\n    initialFillExtrusionAmbientOcclusionWallRadiusTransition = Transition.INITIAL,\n    initialFillExtrusionBase = DoubleValue.INITIAL,\n    initialFillExtrusionBaseTransition = Transition.INITIAL,\n    initialFillExtrusionBaseAlignment = FillExtrusionBaseAlignmentValue.INITIAL,\n    initialFillExtrusionCastShadows = BooleanValue.INITIAL,\n    initialFillExtrusionColor = ColorValue.INITIAL,\n    initialFillExtrusionColorUseTheme = StringValue.INITIAL,\n    initialFillExtrusionColorTransition = Transition.INITIAL,\n    initialFillExtrusionCutoffFadeRange = DoubleValue.INITIAL,\n    initialFillExtrusionEmissiveStrength = DoubleValue.INITIAL,\n    initialFillExtrusionEmissiveStrengthTransition = Transition.INITIAL,\n    initialFillExtrusionFloodLightColor = ColorValue.INITIAL,\n    initialFillExtrusionFloodLightColorUseTheme = StringValue.INITIAL,\n    initialFillExtrusionFloodLightColorTransition = Transition.INITIAL,\n    initialFillExtrusionFloodLightGroundAttenuation = DoubleValue.INITIAL,\n    initialFillExtrusionFloodLightGroundAttenuationTransition = Transition.INITIAL,\n    initialFillExtrusionFloodLightGroundRadius = DoubleValue.INITIAL,\n    initialFillExtrusionFloodLightGroundRadiusTransition = Transition.INITIAL,\n    initialFillExtrusionFloodLightIntensity = DoubleValue.INITIAL,\n    initialFillExtrusionFloodLightIntensityTransition = Transition.INITIAL,\n    initialFillExtrusionFloodLightWallRadius = DoubleValue.INITIAL,\n    initialFillExtrusionFloodLightWallRadiusTransition = Transition.INITIAL,\n    initialFillExtrusionHeight = DoubleValue.INITIAL,\n    initialFillExtrusionHeightTransition = Transition.INITIAL,\n    initialFillExtrusionHeightAlignment = FillExtrusionHeightAlignmentValue.INITIAL,\n    initialFillExtrusionLineWidth = DoubleValue.INITIAL,\n    initialFillExtrusionLineWidthTransition = Transition.INITIAL,\n    initialFillExtrusionOpacity = DoubleValue.INITIAL,\n    initialFillExtrusionOpacityTransition = Transition.INITIAL,\n    initialFillExtrusionPattern = ImageValue.INITIAL,\n    initialFillExtrusionPatternCrossFade = DoubleValue.INITIAL,\n    initialFillExtrusionRoundedRoof = BooleanValue.INITIAL,\n    initialFillExtrusionTranslate = DoubleListValue.INITIAL,\n    initialFillExtrusionTranslateTransition = Transition.INITIAL,\n    initialFillExtrusionTranslateAnchor = FillExtrusionTranslateAnchorValue.INITIAL,\n    initialFillExtrusionVerticalGradient = BooleanValue.INITIAL,\n    initialFillExtrusionVerticalScale = DoubleValue.INITIAL,\n    initialFillExtrusionVerticalScaleTransition = Transition.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  @MapboxExperimental\n  private val fillExtrusionEdgeRadiusState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionEdgeRadius)\n  /**\n   *  Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var fillExtrusionEdgeRadius: DoubleValue by fillExtrusionEdgeRadiusState\n\n  @MapboxExperimental\n  private val fillExtrusionAmbientOcclusionGroundAttenuationState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionAmbientOcclusionGroundAttenuation)\n  /**\n   *  Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var fillExtrusionAmbientOcclusionGroundAttenuation: DoubleValue by fillExtrusionAmbientOcclusionGroundAttenuationState\n\n  @MapboxExperimental\n  private val fillExtrusionAmbientOcclusionGroundAttenuationTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionAmbientOcclusionGroundAttenuationTransition)\n  /**\n   *  Defines the transition of [fillExtrusionAmbientOcclusionGroundAttenuation].\n   */\n  @MapboxExperimental\n  public var fillExtrusionAmbientOcclusionGroundAttenuationTransition: Transition by fillExtrusionAmbientOcclusionGroundAttenuationTransitionState\n\n  @MapboxExperimental\n  private val fillExtrusionAmbientOcclusionGroundRadiusState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionAmbientOcclusionGroundRadius)\n  /**\n   *  The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var fillExtrusionAmbientOcclusionGroundRadius: DoubleValue by fillExtrusionAmbientOcclusionGroundRadiusState\n\n  @MapboxExperimental\n  private val fillExtrusionAmbientOcclusionGroundRadiusTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionAmbientOcclusionGroundRadiusTransition)\n  /**\n   *  Defines the transition of [fillExtrusionAmbientOcclusionGroundRadius].\n   */\n  @MapboxExperimental\n  public var fillExtrusionAmbientOcclusionGroundRadiusTransition: Transition by fillExtrusionAmbientOcclusionGroundRadiusTransitionState\n\n  private val fillExtrusionAmbientOcclusionIntensityState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionAmbientOcclusionIntensity)\n  /**\n   *  Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n   */\n  public var fillExtrusionAmbientOcclusionIntensity: DoubleValue by fillExtrusionAmbientOcclusionIntensityState\n\n  private val fillExtrusionAmbientOcclusionIntensityTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionAmbientOcclusionIntensityTransition)\n  /**\n   *  Defines the transition of [fillExtrusionAmbientOcclusionIntensity].\n   */\n  public var fillExtrusionAmbientOcclusionIntensityTransition: Transition by fillExtrusionAmbientOcclusionIntensityTransitionState\n\n  private val fillExtrusionAmbientOcclusionRadiusState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionAmbientOcclusionRadius)\n  /**\n   *  Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n   */\n  public var fillExtrusionAmbientOcclusionRadius: DoubleValue by fillExtrusionAmbientOcclusionRadiusState\n\n  private val fillExtrusionAmbientOcclusionRadiusTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionAmbientOcclusionRadiusTransition)\n  /**\n   *  Defines the transition of [fillExtrusionAmbientOcclusionRadius].\n   */\n  public var fillExtrusionAmbientOcclusionRadiusTransition: Transition by fillExtrusionAmbientOcclusionRadiusTransitionState\n\n  @MapboxExperimental\n  private val fillExtrusionAmbientOcclusionWallRadiusState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionAmbientOcclusionWallRadius)\n  /**\n   *  Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var fillExtrusionAmbientOcclusionWallRadius: DoubleValue by fillExtrusionAmbientOcclusionWallRadiusState\n\n  @MapboxExperimental\n  private val fillExtrusionAmbientOcclusionWallRadiusTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionAmbientOcclusionWallRadiusTransition)\n  /**\n   *  Defines the transition of [fillExtrusionAmbientOcclusionWallRadius].\n   */\n  @MapboxExperimental\n  public var fillExtrusionAmbientOcclusionWallRadiusTransition: Transition by fillExtrusionAmbientOcclusionWallRadiusTransitionState\n\n  private val fillExtrusionBaseState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionBase)\n  /**\n   *  The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n   */\n  public var fillExtrusionBase: DoubleValue by fillExtrusionBaseState\n\n  private val fillExtrusionBaseTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionBaseTransition)\n  /**\n   *  Defines the transition of [fillExtrusionBase].\n   */\n  public var fillExtrusionBaseTransition: Transition by fillExtrusionBaseTransitionState\n\n  @MapboxExperimental\n  private val fillExtrusionBaseAlignmentState: MutableState<FillExtrusionBaseAlignmentValue> = mutableStateOf(initialFillExtrusionBaseAlignment)\n  /**\n   *  Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n   */\n  @MapboxExperimental\n  public var fillExtrusionBaseAlignment: FillExtrusionBaseAlignmentValue by fillExtrusionBaseAlignmentState\n\n  private val fillExtrusionCastShadowsState: MutableState<BooleanValue> = mutableStateOf(initialFillExtrusionCastShadows)\n  /**\n   *  Enable/Disable shadow casting for this layer Default value: true.\n   */\n  public var fillExtrusionCastShadows: BooleanValue by fillExtrusionCastShadowsState\n\n  private val fillExtrusionColorState: MutableState<ColorValue> = mutableStateOf(initialFillExtrusionColor)\n  /**\n   *  The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   */\n  public var fillExtrusionColor: ColorValue by fillExtrusionColorState\n\n  @MapboxExperimental\n  private val fillExtrusionColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialFillExtrusionColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [fillExtrusionColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var fillExtrusionColorUseTheme: StringValue by fillExtrusionColorUseThemeState\n\n  private val fillExtrusionColorTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionColorTransition)\n  /**\n   *  Defines the transition of [fillExtrusionColor].\n   */\n  public var fillExtrusionColorTransition: Transition by fillExtrusionColorTransitionState\n\n  private val fillExtrusionCutoffFadeRangeState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionCutoffFadeRange)\n  /**\n   *  This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   */\n  public var fillExtrusionCutoffFadeRange: DoubleValue by fillExtrusionCutoffFadeRangeState\n\n  private val fillExtrusionEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionEmissiveStrength)\n  /**\n   *  Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n   */\n  public var fillExtrusionEmissiveStrength: DoubleValue by fillExtrusionEmissiveStrengthState\n\n  private val fillExtrusionEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [fillExtrusionEmissiveStrength].\n   */\n  public var fillExtrusionEmissiveStrengthTransition: Transition by fillExtrusionEmissiveStrengthTransitionState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightColorState: MutableState<ColorValue> = mutableStateOf(initialFillExtrusionFloodLightColor)\n  /**\n   *  The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightColor: ColorValue by fillExtrusionFloodLightColorState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialFillExtrusionFloodLightColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [fillExtrusionFloodLightColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightColorUseTheme: StringValue by fillExtrusionFloodLightColorUseThemeState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightColorTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionFloodLightColorTransition)\n  /**\n   *  Defines the transition of [fillExtrusionFloodLightColor].\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightColorTransition: Transition by fillExtrusionFloodLightColorTransitionState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightGroundAttenuationState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionFloodLightGroundAttenuation)\n  /**\n   *  Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightGroundAttenuation: DoubleValue by fillExtrusionFloodLightGroundAttenuationState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightGroundAttenuationTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionFloodLightGroundAttenuationTransition)\n  /**\n   *  Defines the transition of [fillExtrusionFloodLightGroundAttenuation].\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightGroundAttenuationTransition: Transition by fillExtrusionFloodLightGroundAttenuationTransitionState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightGroundRadiusState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionFloodLightGroundRadius)\n  /**\n   *  The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightGroundRadius: DoubleValue by fillExtrusionFloodLightGroundRadiusState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightGroundRadiusTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionFloodLightGroundRadiusTransition)\n  /**\n   *  Defines the transition of [fillExtrusionFloodLightGroundRadius].\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightGroundRadiusTransition: Transition by fillExtrusionFloodLightGroundRadiusTransitionState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightIntensityState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionFloodLightIntensity)\n  /**\n   *  The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightIntensity: DoubleValue by fillExtrusionFloodLightIntensityState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightIntensityTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionFloodLightIntensityTransition)\n  /**\n   *  Defines the transition of [fillExtrusionFloodLightIntensity].\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightIntensityTransition: Transition by fillExtrusionFloodLightIntensityTransitionState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightWallRadiusState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionFloodLightWallRadius)\n  /**\n   *  The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightWallRadius: DoubleValue by fillExtrusionFloodLightWallRadiusState\n\n  @MapboxExperimental\n  private val fillExtrusionFloodLightWallRadiusTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionFloodLightWallRadiusTransition)\n  /**\n   *  Defines the transition of [fillExtrusionFloodLightWallRadius].\n   */\n  @MapboxExperimental\n  public var fillExtrusionFloodLightWallRadiusTransition: Transition by fillExtrusionFloodLightWallRadiusTransitionState\n\n  private val fillExtrusionHeightState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionHeight)\n  /**\n   *  The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n   */\n  public var fillExtrusionHeight: DoubleValue by fillExtrusionHeightState\n\n  private val fillExtrusionHeightTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionHeightTransition)\n  /**\n   *  Defines the transition of [fillExtrusionHeight].\n   */\n  public var fillExtrusionHeightTransition: Transition by fillExtrusionHeightTransitionState\n\n  @MapboxExperimental\n  private val fillExtrusionHeightAlignmentState: MutableState<FillExtrusionHeightAlignmentValue> = mutableStateOf(initialFillExtrusionHeightAlignment)\n  /**\n   *  Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n   */\n  @MapboxExperimental\n  public var fillExtrusionHeightAlignment: FillExtrusionHeightAlignmentValue by fillExtrusionHeightAlignmentState\n\n  @MapboxExperimental\n  private val fillExtrusionLineWidthState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionLineWidth)\n  /**\n   *  If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n   */\n  @MapboxExperimental\n  public var fillExtrusionLineWidth: DoubleValue by fillExtrusionLineWidthState\n\n  @MapboxExperimental\n  private val fillExtrusionLineWidthTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionLineWidthTransition)\n  /**\n   *  Defines the transition of [fillExtrusionLineWidth].\n   */\n  @MapboxExperimental\n  public var fillExtrusionLineWidthTransition: Transition by fillExtrusionLineWidthTransitionState\n\n  private val fillExtrusionOpacityState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionOpacity)\n  /**\n   *  The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n   */\n  public var fillExtrusionOpacity: DoubleValue by fillExtrusionOpacityState\n\n  private val fillExtrusionOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionOpacityTransition)\n  /**\n   *  Defines the transition of [fillExtrusionOpacity].\n   */\n  public var fillExtrusionOpacityTransition: Transition by fillExtrusionOpacityTransitionState\n\n  private val fillExtrusionPatternState: MutableState<ImageValue> = mutableStateOf(initialFillExtrusionPattern)\n  /**\n   *  Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  public var fillExtrusionPattern: ImageValue by fillExtrusionPatternState\n\n  private val fillExtrusionPatternCrossFadeState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionPatternCrossFade)\n  /**\n   *  Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  public var fillExtrusionPatternCrossFade: DoubleValue by fillExtrusionPatternCrossFadeState\n\n  @MapboxExperimental\n  private val fillExtrusionRoundedRoofState: MutableState<BooleanValue> = mutableStateOf(initialFillExtrusionRoundedRoof)\n  /**\n   *  Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n   */\n  @MapboxExperimental\n  public var fillExtrusionRoundedRoof: BooleanValue by fillExtrusionRoundedRoofState\n\n  private val fillExtrusionTranslateState: MutableState<DoubleListValue> = mutableStateOf(initialFillExtrusionTranslate)\n  /**\n   *  The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n   */\n  public var fillExtrusionTranslate: DoubleListValue by fillExtrusionTranslateState\n\n  private val fillExtrusionTranslateTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionTranslateTransition)\n  /**\n   *  Defines the transition of [fillExtrusionTranslate].\n   */\n  public var fillExtrusionTranslateTransition: Transition by fillExtrusionTranslateTransitionState\n\n  private val fillExtrusionTranslateAnchorState: MutableState<FillExtrusionTranslateAnchorValue> = mutableStateOf(initialFillExtrusionTranslateAnchor)\n  /**\n   *  Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n   */\n  public var fillExtrusionTranslateAnchor: FillExtrusionTranslateAnchorValue by fillExtrusionTranslateAnchorState\n\n  private val fillExtrusionVerticalGradientState: MutableState<BooleanValue> = mutableStateOf(initialFillExtrusionVerticalGradient)\n  /**\n   *  Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n   */\n  public var fillExtrusionVerticalGradient: BooleanValue by fillExtrusionVerticalGradientState\n\n  @MapboxExperimental\n  private val fillExtrusionVerticalScaleState: MutableState<DoubleValue> = mutableStateOf(initialFillExtrusionVerticalScale)\n  /**\n   *  A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var fillExtrusionVerticalScale: DoubleValue by fillExtrusionVerticalScaleState\n\n  @MapboxExperimental\n  private val fillExtrusionVerticalScaleTransitionState: MutableState<Transition> = mutableStateOf(initialFillExtrusionVerticalScaleTransition)\n  /**\n   *  Defines the transition of [fillExtrusionVerticalScale].\n   */\n  @MapboxExperimental\n  public var fillExtrusionVerticalScaleTransition: Transition by fillExtrusionVerticalScaleTransitionState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionEdgeRadiusState, \"fill-extrusion-edge-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionGroundAttenuationState, \"fill-extrusion-ambient-occlusion-ground-attenuation\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionGroundAttenuationTransitionState, \"fill-extrusion-ambient-occlusion-ground-attenuation-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionGroundRadiusState, \"fill-extrusion-ambient-occlusion-ground-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionGroundRadiusTransitionState, \"fill-extrusion-ambient-occlusion-ground-radius-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionIntensityState, \"fill-extrusion-ambient-occlusion-intensity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionIntensityTransitionState, \"fill-extrusion-ambient-occlusion-intensity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionRadiusState, \"fill-extrusion-ambient-occlusion-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionRadiusTransitionState, \"fill-extrusion-ambient-occlusion-radius-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionWallRadiusState, \"fill-extrusion-ambient-occlusion-wall-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionAmbientOcclusionWallRadiusTransitionState, \"fill-extrusion-ambient-occlusion-wall-radius-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionBaseState, \"fill-extrusion-base\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionBaseTransitionState, \"fill-extrusion-base-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionBaseAlignmentState, \"fill-extrusion-base-alignment\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionCastShadowsState, \"fill-extrusion-cast-shadows\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionColorState, \"fill-extrusion-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionColorUseThemeState, \"fill-extrusion-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionColorTransitionState, \"fill-extrusion-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionCutoffFadeRangeState, \"fill-extrusion-cutoff-fade-range\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionEmissiveStrengthState, \"fill-extrusion-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionEmissiveStrengthTransitionState, \"fill-extrusion-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightColorState, \"fill-extrusion-flood-light-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightColorUseThemeState, \"fill-extrusion-flood-light-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightColorTransitionState, \"fill-extrusion-flood-light-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightGroundAttenuationState, \"fill-extrusion-flood-light-ground-attenuation\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightGroundAttenuationTransitionState, \"fill-extrusion-flood-light-ground-attenuation-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightGroundRadiusState, \"fill-extrusion-flood-light-ground-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightGroundRadiusTransitionState, \"fill-extrusion-flood-light-ground-radius-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightIntensityState, \"fill-extrusion-flood-light-intensity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightIntensityTransitionState, \"fill-extrusion-flood-light-intensity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightWallRadiusState, \"fill-extrusion-flood-light-wall-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionFloodLightWallRadiusTransitionState, \"fill-extrusion-flood-light-wall-radius-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionHeightState, \"fill-extrusion-height\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionHeightTransitionState, \"fill-extrusion-height-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionHeightAlignmentState, \"fill-extrusion-height-alignment\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionLineWidthState, \"fill-extrusion-line-width\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionLineWidthTransitionState, \"fill-extrusion-line-width-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionOpacityState, \"fill-extrusion-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionOpacityTransitionState, \"fill-extrusion-opacity-transition\")\n    AddImageWhenNotInitial(layerNode, fillExtrusionPatternState, \"fill-extrusion-pattern\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionPatternCrossFadeState, \"fill-extrusion-pattern-cross-fade\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionRoundedRoofState, \"fill-extrusion-rounded-roof\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionTranslateState, \"fill-extrusion-translate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionTranslateTransitionState, \"fill-extrusion-translate-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionTranslateAnchorState, \"fill-extrusion-translate-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionVerticalGradientState, \"fill-extrusion-vertical-gradient\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionVerticalScaleState, \"fill-extrusion-vertical-scale\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillExtrusionVerticalScaleTransitionState, \"fill-extrusion-vertical-scale-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/FillLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * A filled polygon with an optional stroked border.\n *\n * This composable function inserts a [FillLayer] to the map. For convenience, if there's\n * no need to hoist the [fillLayerState], use `FillLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#fill)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param fillLayerState the state holder for [FillLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun FillLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"fill\")\n  },\n  fillLayerState: FillLayerState = remember { FillLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of FillLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"fill\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(fillLayerState) {\n      fillLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(fillLayerState.interactionsState) {\n    fillLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * A filled polygon with an optional stroked border.\n *\n * This composable function inserts a [FillLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#fill)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [FillLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun FillLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"fill\")\n  },\n  crossinline init: FillLayerState.() -> Unit\n) {\n  FillLayer(sourceState = sourceState, layerId = layerId, fillLayerState = remember { FillLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/FillLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.AddImageWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.ImageValue\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [FillLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#fill)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class FillLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialFillConstructBridgeGuardRail: BooleanValue,\n  initialFillElevationReference: FillElevationReferenceValue,\n  initialFillSortKey: DoubleValue,\n  initialFillAntialias: BooleanValue,\n  initialFillBridgeGuardRailColor: ColorValue,\n  initialFillBridgeGuardRailColorUseTheme: StringValue,\n  initialFillBridgeGuardRailColorTransition: Transition,\n  initialFillColor: ColorValue,\n  initialFillColorUseTheme: StringValue,\n  initialFillColorTransition: Transition,\n  initialFillEmissiveStrength: DoubleValue,\n  initialFillEmissiveStrengthTransition: Transition,\n  initialFillOpacity: DoubleValue,\n  initialFillOpacityTransition: Transition,\n  initialFillOutlineColor: ColorValue,\n  initialFillOutlineColorUseTheme: StringValue,\n  initialFillOutlineColorTransition: Transition,\n  initialFillPattern: ImageValue,\n  initialFillPatternCrossFade: DoubleValue,\n  initialFillTranslate: DoubleListValue,\n  initialFillTranslateTransition: Transition,\n  initialFillTranslateAnchor: FillTranslateAnchorValue,\n  initialFillTunnelStructureColor: ColorValue,\n  initialFillTunnelStructureColorUseTheme: StringValue,\n  initialFillTunnelStructureColorTransition: Transition,\n  initialFillZOffset: DoubleValue,\n  initialFillZOffsetTransition: Transition,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [FillLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialFillConstructBridgeGuardRail = BooleanValue.INITIAL,\n    initialFillElevationReference = FillElevationReferenceValue.INITIAL,\n    initialFillSortKey = DoubleValue.INITIAL,\n    initialFillAntialias = BooleanValue.INITIAL,\n    initialFillBridgeGuardRailColor = ColorValue.INITIAL,\n    initialFillBridgeGuardRailColorUseTheme = StringValue.INITIAL,\n    initialFillBridgeGuardRailColorTransition = Transition.INITIAL,\n    initialFillColor = ColorValue.INITIAL,\n    initialFillColorUseTheme = StringValue.INITIAL,\n    initialFillColorTransition = Transition.INITIAL,\n    initialFillEmissiveStrength = DoubleValue.INITIAL,\n    initialFillEmissiveStrengthTransition = Transition.INITIAL,\n    initialFillOpacity = DoubleValue.INITIAL,\n    initialFillOpacityTransition = Transition.INITIAL,\n    initialFillOutlineColor = ColorValue.INITIAL,\n    initialFillOutlineColorUseTheme = StringValue.INITIAL,\n    initialFillOutlineColorTransition = Transition.INITIAL,\n    initialFillPattern = ImageValue.INITIAL,\n    initialFillPatternCrossFade = DoubleValue.INITIAL,\n    initialFillTranslate = DoubleListValue.INITIAL,\n    initialFillTranslateTransition = Transition.INITIAL,\n    initialFillTranslateAnchor = FillTranslateAnchorValue.INITIAL,\n    initialFillTunnelStructureColor = ColorValue.INITIAL,\n    initialFillTunnelStructureColorUseTheme = StringValue.INITIAL,\n    initialFillTunnelStructureColorTransition = Transition.INITIAL,\n    initialFillZOffset = DoubleValue.INITIAL,\n    initialFillZOffsetTransition = Transition.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  @MapboxExperimental\n  private val fillConstructBridgeGuardRailState: MutableState<BooleanValue> = mutableStateOf(initialFillConstructBridgeGuardRail)\n  /**\n   *  Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   */\n  @MapboxExperimental\n  public var fillConstructBridgeGuardRail: BooleanValue by fillConstructBridgeGuardRailState\n\n  @MapboxExperimental\n  private val fillElevationReferenceState: MutableState<FillElevationReferenceValue> = mutableStateOf(initialFillElevationReference)\n  /**\n   *  Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  @MapboxExperimental\n  public var fillElevationReference: FillElevationReferenceValue by fillElevationReferenceState\n\n  private val fillSortKeyState: MutableState<DoubleValue> = mutableStateOf(initialFillSortKey)\n  /**\n   *  Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  public var fillSortKey: DoubleValue by fillSortKeyState\n\n  private val fillAntialiasState: MutableState<BooleanValue> = mutableStateOf(initialFillAntialias)\n  /**\n   *  Whether or not the fill should be antialiased. Default value: true.\n   */\n  public var fillAntialias: BooleanValue by fillAntialiasState\n\n  @MapboxExperimental\n  private val fillBridgeGuardRailColorState: MutableState<ColorValue> = mutableStateOf(initialFillBridgeGuardRailColor)\n  /**\n   *  The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  public var fillBridgeGuardRailColor: ColorValue by fillBridgeGuardRailColorState\n\n  @MapboxExperimental\n  private val fillBridgeGuardRailColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialFillBridgeGuardRailColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [fillBridgeGuardRailColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var fillBridgeGuardRailColorUseTheme: StringValue by fillBridgeGuardRailColorUseThemeState\n\n  @MapboxExperimental\n  private val fillBridgeGuardRailColorTransitionState: MutableState<Transition> = mutableStateOf(initialFillBridgeGuardRailColorTransition)\n  /**\n   *  Defines the transition of [fillBridgeGuardRailColor].\n   */\n  @MapboxExperimental\n  public var fillBridgeGuardRailColorTransition: Transition by fillBridgeGuardRailColorTransitionState\n\n  private val fillColorState: MutableState<ColorValue> = mutableStateOf(initialFillColor)\n  /**\n   *  The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  public var fillColor: ColorValue by fillColorState\n\n  @MapboxExperimental\n  private val fillColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialFillColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [fillColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var fillColorUseTheme: StringValue by fillColorUseThemeState\n\n  private val fillColorTransitionState: MutableState<Transition> = mutableStateOf(initialFillColorTransition)\n  /**\n   *  Defines the transition of [fillColor].\n   */\n  public var fillColorTransition: Transition by fillColorTransitionState\n\n  private val fillEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialFillEmissiveStrength)\n  /**\n   *  Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   */\n  public var fillEmissiveStrength: DoubleValue by fillEmissiveStrengthState\n\n  private val fillEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialFillEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [fillEmissiveStrength].\n   */\n  public var fillEmissiveStrengthTransition: Transition by fillEmissiveStrengthTransitionState\n\n  private val fillOpacityState: MutableState<DoubleValue> = mutableStateOf(initialFillOpacity)\n  /**\n   *  The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   */\n  public var fillOpacity: DoubleValue by fillOpacityState\n\n  private val fillOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialFillOpacityTransition)\n  /**\n   *  Defines the transition of [fillOpacity].\n   */\n  public var fillOpacityTransition: Transition by fillOpacityTransitionState\n\n  private val fillOutlineColorState: MutableState<ColorValue> = mutableStateOf(initialFillOutlineColor)\n  /**\n   *  The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  public var fillOutlineColor: ColorValue by fillOutlineColorState\n\n  @MapboxExperimental\n  private val fillOutlineColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialFillOutlineColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [fillOutlineColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var fillOutlineColorUseTheme: StringValue by fillOutlineColorUseThemeState\n\n  private val fillOutlineColorTransitionState: MutableState<Transition> = mutableStateOf(initialFillOutlineColorTransition)\n  /**\n   *  Defines the transition of [fillOutlineColor].\n   */\n  public var fillOutlineColorTransition: Transition by fillOutlineColorTransitionState\n\n  private val fillPatternState: MutableState<ImageValue> = mutableStateOf(initialFillPattern)\n  /**\n   *  Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  public var fillPattern: ImageValue by fillPatternState\n\n  private val fillPatternCrossFadeState: MutableState<DoubleValue> = mutableStateOf(initialFillPatternCrossFade)\n  /**\n   *  Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  public var fillPatternCrossFade: DoubleValue by fillPatternCrossFadeState\n\n  private val fillTranslateState: MutableState<DoubleListValue> = mutableStateOf(initialFillTranslate)\n  /**\n   *  The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   */\n  public var fillTranslate: DoubleListValue by fillTranslateState\n\n  private val fillTranslateTransitionState: MutableState<Transition> = mutableStateOf(initialFillTranslateTransition)\n  /**\n   *  Defines the transition of [fillTranslate].\n   */\n  public var fillTranslateTransition: Transition by fillTranslateTransitionState\n\n  private val fillTranslateAnchorState: MutableState<FillTranslateAnchorValue> = mutableStateOf(initialFillTranslateAnchor)\n  /**\n   *  Controls the frame of reference for `fill-translate`. Default value: \"map\".\n   */\n  public var fillTranslateAnchor: FillTranslateAnchorValue by fillTranslateAnchorState\n\n  @MapboxExperimental\n  private val fillTunnelStructureColorState: MutableState<ColorValue> = mutableStateOf(initialFillTunnelStructureColor)\n  /**\n   *  The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  public var fillTunnelStructureColor: ColorValue by fillTunnelStructureColorState\n\n  @MapboxExperimental\n  private val fillTunnelStructureColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialFillTunnelStructureColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [fillTunnelStructureColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var fillTunnelStructureColorUseTheme: StringValue by fillTunnelStructureColorUseThemeState\n\n  @MapboxExperimental\n  private val fillTunnelStructureColorTransitionState: MutableState<Transition> = mutableStateOf(initialFillTunnelStructureColorTransition)\n  /**\n   *  Defines the transition of [fillTunnelStructureColor].\n   */\n  @MapboxExperimental\n  public var fillTunnelStructureColorTransition: Transition by fillTunnelStructureColorTransitionState\n\n  @MapboxExperimental\n  private val fillZOffsetState: MutableState<DoubleValue> = mutableStateOf(initialFillZOffset)\n  /**\n   *  Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var fillZOffset: DoubleValue by fillZOffsetState\n\n  @MapboxExperimental\n  private val fillZOffsetTransitionState: MutableState<Transition> = mutableStateOf(initialFillZOffsetTransition)\n  /**\n   *  Defines the transition of [fillZOffset].\n   */\n  @MapboxExperimental\n  public var fillZOffsetTransition: Transition by fillZOffsetTransitionState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillConstructBridgeGuardRailState, \"fill-construct-bridge-guard-rail\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillElevationReferenceState, \"fill-elevation-reference\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillSortKeyState, \"fill-sort-key\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillAntialiasState, \"fill-antialias\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillBridgeGuardRailColorState, \"fill-bridge-guard-rail-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillBridgeGuardRailColorUseThemeState, \"fill-bridge-guard-rail-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillBridgeGuardRailColorTransitionState, \"fill-bridge-guard-rail-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillColorState, \"fill-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillColorUseThemeState, \"fill-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillColorTransitionState, \"fill-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillEmissiveStrengthState, \"fill-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillEmissiveStrengthTransitionState, \"fill-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillOpacityState, \"fill-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillOpacityTransitionState, \"fill-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillOutlineColorState, \"fill-outline-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillOutlineColorUseThemeState, \"fill-outline-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillOutlineColorTransitionState, \"fill-outline-color-transition\")\n    AddImageWhenNotInitial(layerNode, fillPatternState, \"fill-pattern\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillPatternCrossFadeState, \"fill-pattern-cross-fade\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillTranslateState, \"fill-translate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillTranslateTransitionState, \"fill-translate-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillTranslateAnchorState, \"fill-translate-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillTunnelStructureColorState, \"fill-tunnel-structure-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillTunnelStructureColorUseThemeState, \"fill-tunnel-structure-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillTunnelStructureColorTransitionState, \"fill-tunnel-structure-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillZOffsetState, \"fill-z-offset\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, fillZOffsetTransitionState, \"fill-z-offset-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/HeatmapLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * A heatmap.\n *\n * This composable function inserts a [HeatmapLayer] to the map. For convenience, if there's\n * no need to hoist the [heatmapLayerState], use `HeatmapLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#heatmap)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param heatmapLayerState the state holder for [HeatmapLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun HeatmapLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"heatmap\")\n  },\n  heatmapLayerState: HeatmapLayerState = remember { HeatmapLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of HeatmapLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"heatmap\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(heatmapLayerState) {\n      heatmapLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(heatmapLayerState.interactionsState) {\n    heatmapLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * A heatmap.\n *\n * This composable function inserts a [HeatmapLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#heatmap)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [HeatmapLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun HeatmapLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"heatmap\")\n  },\n  crossinline init: HeatmapLayerState.() -> Unit\n) {\n  HeatmapLayer(sourceState = sourceState, layerId = layerId, heatmapLayerState = remember { HeatmapLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/HeatmapLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [HeatmapLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#heatmap)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class HeatmapLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialHeatmapColor: ColorValue,\n  initialHeatmapColorUseTheme: StringValue,\n  initialHeatmapIntensity: DoubleValue,\n  initialHeatmapIntensityTransition: Transition,\n  initialHeatmapOpacity: DoubleValue,\n  initialHeatmapOpacityTransition: Transition,\n  initialHeatmapRadius: DoubleValue,\n  initialHeatmapRadiusTransition: Transition,\n  initialHeatmapWeight: DoubleValue,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [HeatmapLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialHeatmapColor = ColorValue.INITIAL,\n    initialHeatmapColorUseTheme = StringValue.INITIAL,\n    initialHeatmapIntensity = DoubleValue.INITIAL,\n    initialHeatmapIntensityTransition = Transition.INITIAL,\n    initialHeatmapOpacity = DoubleValue.INITIAL,\n    initialHeatmapOpacityTransition = Transition.INITIAL,\n    initialHeatmapRadius = DoubleValue.INITIAL,\n    initialHeatmapRadiusTransition = Transition.INITIAL,\n    initialHeatmapWeight = DoubleValue.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  private val heatmapColorState: MutableState<ColorValue> = mutableStateOf(initialHeatmapColor)\n  /**\n   *  Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `[\"heatmap-density\"]` as input. Default value: [\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",0.1,\"royalblue\",0.3,\"cyan\",0.5,\"lime\",0.7,\"yellow\",1,\"red\"].\n   */\n  public var heatmapColor: ColorValue by heatmapColorState\n\n  @MapboxExperimental\n  private val heatmapColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialHeatmapColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [heatmapColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var heatmapColorUseTheme: StringValue by heatmapColorUseThemeState\n\n  private val heatmapIntensityState: MutableState<DoubleValue> = mutableStateOf(initialHeatmapIntensity)\n  /**\n   *  Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n   */\n  public var heatmapIntensity: DoubleValue by heatmapIntensityState\n\n  private val heatmapIntensityTransitionState: MutableState<Transition> = mutableStateOf(initialHeatmapIntensityTransition)\n  /**\n   *  Defines the transition of [heatmapIntensity].\n   */\n  public var heatmapIntensityTransition: Transition by heatmapIntensityTransitionState\n\n  private val heatmapOpacityState: MutableState<DoubleValue> = mutableStateOf(initialHeatmapOpacity)\n  /**\n   *  The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var heatmapOpacity: DoubleValue by heatmapOpacityState\n\n  private val heatmapOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialHeatmapOpacityTransition)\n  /**\n   *  Defines the transition of [heatmapOpacity].\n   */\n  public var heatmapOpacityTransition: Transition by heatmapOpacityTransitionState\n\n  private val heatmapRadiusState: MutableState<DoubleValue> = mutableStateOf(initialHeatmapRadius)\n  /**\n   *  Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n   */\n  public var heatmapRadius: DoubleValue by heatmapRadiusState\n\n  private val heatmapRadiusTransitionState: MutableState<Transition> = mutableStateOf(initialHeatmapRadiusTransition)\n  /**\n   *  Defines the transition of [heatmapRadius].\n   */\n  public var heatmapRadiusTransition: Transition by heatmapRadiusTransitionState\n\n  private val heatmapWeightState: MutableState<DoubleValue> = mutableStateOf(initialHeatmapWeight)\n  /**\n   *  A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n   */\n  public var heatmapWeight: DoubleValue by heatmapWeightState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, heatmapColorState, \"heatmap-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, heatmapColorUseThemeState, \"heatmap-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, heatmapIntensityState, \"heatmap-intensity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, heatmapIntensityTransitionState, \"heatmap-intensity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, heatmapOpacityState, \"heatmap-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, heatmapOpacityTransitionState, \"heatmap-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, heatmapRadiusState, \"heatmap-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, heatmapRadiusTransitionState, \"heatmap-radius-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, heatmapWeightState, \"heatmap-weight\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/HillshadeLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * Client-side hillshading visualization based on DEM data. Currently, the implementation only supports Mapbox Terrain RGB and Mapzen Terrarium tiles.\n *\n * This composable function inserts a [HillshadeLayer] to the map. For convenience, if there's\n * no need to hoist the [hillshadeLayerState], use `HillshadeLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#hillshade)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param hillshadeLayerState the state holder for [HillshadeLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun HillshadeLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"hillshade\")\n  },\n  hillshadeLayerState: HillshadeLayerState = remember { HillshadeLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of HillshadeLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"hillshade\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(hillshadeLayerState) {\n      hillshadeLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(hillshadeLayerState.interactionsState) {\n    hillshadeLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * Client-side hillshading visualization based on DEM data. Currently, the implementation only supports Mapbox Terrain RGB and Mapzen Terrarium tiles.\n *\n * This composable function inserts a [HillshadeLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#hillshade)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [HillshadeLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun HillshadeLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"hillshade\")\n  },\n  crossinline init: HillshadeLayerState.() -> Unit\n) {\n  HillshadeLayer(sourceState = sourceState, layerId = layerId, hillshadeLayerState = remember { HillshadeLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/HillshadeLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [HillshadeLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#hillshade)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class HillshadeLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialHillshadeAccentColor: ColorValue,\n  initialHillshadeAccentColorUseTheme: StringValue,\n  initialHillshadeAccentColorTransition: Transition,\n  initialHillshadeEmissiveStrength: DoubleValue,\n  initialHillshadeEmissiveStrengthTransition: Transition,\n  initialHillshadeExaggeration: DoubleValue,\n  initialHillshadeExaggerationTransition: Transition,\n  initialHillshadeHighlightColor: ColorValue,\n  initialHillshadeHighlightColorUseTheme: StringValue,\n  initialHillshadeHighlightColorTransition: Transition,\n  initialHillshadeIlluminationAnchor: HillshadeIlluminationAnchorValue,\n  initialHillshadeIlluminationDirection: DoubleValue,\n  initialHillshadeShadowColor: ColorValue,\n  initialHillshadeShadowColorUseTheme: StringValue,\n  initialHillshadeShadowColorTransition: Transition,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [HillshadeLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialHillshadeAccentColor = ColorValue.INITIAL,\n    initialHillshadeAccentColorUseTheme = StringValue.INITIAL,\n    initialHillshadeAccentColorTransition = Transition.INITIAL,\n    initialHillshadeEmissiveStrength = DoubleValue.INITIAL,\n    initialHillshadeEmissiveStrengthTransition = Transition.INITIAL,\n    initialHillshadeExaggeration = DoubleValue.INITIAL,\n    initialHillshadeExaggerationTransition = Transition.INITIAL,\n    initialHillshadeHighlightColor = ColorValue.INITIAL,\n    initialHillshadeHighlightColorUseTheme = StringValue.INITIAL,\n    initialHillshadeHighlightColorTransition = Transition.INITIAL,\n    initialHillshadeIlluminationAnchor = HillshadeIlluminationAnchorValue.INITIAL,\n    initialHillshadeIlluminationDirection = DoubleValue.INITIAL,\n    initialHillshadeShadowColor = ColorValue.INITIAL,\n    initialHillshadeShadowColorUseTheme = StringValue.INITIAL,\n    initialHillshadeShadowColorTransition = Transition.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  private val hillshadeAccentColorState: MutableState<ColorValue> = mutableStateOf(initialHillshadeAccentColor)\n  /**\n   *  The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   */\n  public var hillshadeAccentColor: ColorValue by hillshadeAccentColorState\n\n  @MapboxExperimental\n  private val hillshadeAccentColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialHillshadeAccentColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [hillshadeAccentColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var hillshadeAccentColorUseTheme: StringValue by hillshadeAccentColorUseThemeState\n\n  private val hillshadeAccentColorTransitionState: MutableState<Transition> = mutableStateOf(initialHillshadeAccentColorTransition)\n  /**\n   *  Defines the transition of [hillshadeAccentColor].\n   */\n  public var hillshadeAccentColorTransition: Transition by hillshadeAccentColorTransitionState\n\n  private val hillshadeEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialHillshadeEmissiveStrength)\n  /**\n   *  Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n   */\n  public var hillshadeEmissiveStrength: DoubleValue by hillshadeEmissiveStrengthState\n\n  private val hillshadeEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialHillshadeEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [hillshadeEmissiveStrength].\n   */\n  public var hillshadeEmissiveStrengthTransition: Transition by hillshadeEmissiveStrengthTransitionState\n\n  private val hillshadeExaggerationState: MutableState<DoubleValue> = mutableStateOf(initialHillshadeExaggeration)\n  /**\n   *  Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n   */\n  public var hillshadeExaggeration: DoubleValue by hillshadeExaggerationState\n\n  private val hillshadeExaggerationTransitionState: MutableState<Transition> = mutableStateOf(initialHillshadeExaggerationTransition)\n  /**\n   *  Defines the transition of [hillshadeExaggeration].\n   */\n  public var hillshadeExaggerationTransition: Transition by hillshadeExaggerationTransitionState\n\n  private val hillshadeHighlightColorState: MutableState<ColorValue> = mutableStateOf(initialHillshadeHighlightColor)\n  /**\n   *  The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   */\n  public var hillshadeHighlightColor: ColorValue by hillshadeHighlightColorState\n\n  @MapboxExperimental\n  private val hillshadeHighlightColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialHillshadeHighlightColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [hillshadeHighlightColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var hillshadeHighlightColorUseTheme: StringValue by hillshadeHighlightColorUseThemeState\n\n  private val hillshadeHighlightColorTransitionState: MutableState<Transition> = mutableStateOf(initialHillshadeHighlightColorTransition)\n  /**\n   *  Defines the transition of [hillshadeHighlightColor].\n   */\n  public var hillshadeHighlightColorTransition: Transition by hillshadeHighlightColorTransitionState\n\n  private val hillshadeIlluminationAnchorState: MutableState<HillshadeIlluminationAnchorValue> = mutableStateOf(initialHillshadeIlluminationAnchor)\n  /**\n   *  Direction of light source when map is rotated. Default value: \"viewport\".\n   */\n  public var hillshadeIlluminationAnchor: HillshadeIlluminationAnchorValue by hillshadeIlluminationAnchorState\n\n  private val hillshadeIlluminationDirectionState: MutableState<DoubleValue> = mutableStateOf(initialHillshadeIlluminationDirection)\n  /**\n   *  The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n   */\n  public var hillshadeIlluminationDirection: DoubleValue by hillshadeIlluminationDirectionState\n\n  private val hillshadeShadowColorState: MutableState<ColorValue> = mutableStateOf(initialHillshadeShadowColor)\n  /**\n   *  The shading color of areas that face away from the light source. Default value: \"#000000\".\n   */\n  public var hillshadeShadowColor: ColorValue by hillshadeShadowColorState\n\n  @MapboxExperimental\n  private val hillshadeShadowColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialHillshadeShadowColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [hillshadeShadowColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var hillshadeShadowColorUseTheme: StringValue by hillshadeShadowColorUseThemeState\n\n  private val hillshadeShadowColorTransitionState: MutableState<Transition> = mutableStateOf(initialHillshadeShadowColorTransition)\n  /**\n   *  Defines the transition of [hillshadeShadowColor].\n   */\n  public var hillshadeShadowColorTransition: Transition by hillshadeShadowColorTransitionState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeAccentColorState, \"hillshade-accent-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeAccentColorUseThemeState, \"hillshade-accent-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeAccentColorTransitionState, \"hillshade-accent-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeEmissiveStrengthState, \"hillshade-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeEmissiveStrengthTransitionState, \"hillshade-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeExaggerationState, \"hillshade-exaggeration\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeExaggerationTransitionState, \"hillshade-exaggeration-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeHighlightColorState, \"hillshade-highlight-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeHighlightColorUseThemeState, \"hillshade-highlight-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeHighlightColorTransitionState, \"hillshade-highlight-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeIlluminationAnchorState, \"hillshade-illumination-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeIlluminationDirectionState, \"hillshade-illumination-direction\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeShadowColorState, \"hillshade-shadow-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeShadowColorUseThemeState, \"hillshade-shadow-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, hillshadeShadowColorTransitionState, \"hillshade-shadow-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/LayerProperties.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.annotation.RestrictTo\nimport androidx.compose.runtime.Immutable\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.HoldsValue\nimport com.mapbox.maps.extension.compose.style.internal.ComposeTypeUtils\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\n/**\n * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\n@MapboxExperimental\npublic data class FillElevationReferenceValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [FillElevationReferenceValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: FillElevationReferenceValue = FillElevationReferenceValue(Value.valueOf(\"FillElevationReferenceValue.INITIAL\"))\n\n    /**\n     * Default value for [FillElevationReferenceValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: FillElevationReferenceValue = FillElevationReferenceValue(Value.nullValue())\n\n    /**\n     * Elevated rendering is disabled.\n     */\n    @JvmField\n    public val NONE: FillElevationReferenceValue = FillElevationReferenceValue(Value(\"none\"))\n\n    /**\n     * Elevate geometry relative to HD roads. Use this mode to describe base polygons of the road networks.\n     */\n    @JvmField\n    public val HD_ROAD_BASE: FillElevationReferenceValue = FillElevationReferenceValue(Value(\"hd-road-base\"))\n\n    /**\n     * Elevated rendering is enabled. Use this mode to describe additive and stackable features such as 'hatched areas' that should exist only on top of road polygons.\n     */\n    @JvmField\n    public val HD_ROAD_MARKUP: FillElevationReferenceValue = FillElevationReferenceValue(Value(\"hd-road-markup\"))\n  }\n}\n\n/**\n * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class FillTranslateAnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [FillTranslateAnchorValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: FillTranslateAnchorValue = FillTranslateAnchorValue(Value.valueOf(\"FillTranslateAnchorValue.INITIAL\"))\n\n    /**\n     * Default value for [FillTranslateAnchorValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: FillTranslateAnchorValue = FillTranslateAnchorValue(Value.nullValue())\n\n    /**\n     * The fill is translated relative to the map.\n     */\n    @JvmField\n    public val MAP: FillTranslateAnchorValue = FillTranslateAnchorValue(Value(\"map\"))\n\n    /**\n     * The fill is translated relative to the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: FillTranslateAnchorValue = FillTranslateAnchorValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * Whether this layer is displayed. Default value: \"visible\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class VisibilityValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [VisibilityValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: VisibilityValue = VisibilityValue(Value.valueOf(\"VisibilityValue.INITIAL\"))\n\n    /**\n     * Default value for [VisibilityValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: VisibilityValue = VisibilityValue(Value.nullValue())\n\n    /**\n     * The layer is shown.\n     */\n    @JvmField\n    public val VISIBLE: VisibilityValue = VisibilityValue(Value(\"visible\"))\n\n    /**\n     * The layer is not shown.\n     */\n    @JvmField\n    public val NONE: VisibilityValue = VisibilityValue(Value(\"none\"))\n  }\n}\n\n/**\n * The display of line endings. Default value: \"butt\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class LineCapValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [LineCapValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: LineCapValue = LineCapValue(Value.valueOf(\"LineCapValue.INITIAL\"))\n\n    /**\n     * Default value for [LineCapValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: LineCapValue = LineCapValue(Value.nullValue())\n\n    /**\n     * A cap with a squared-off end which is drawn to the exact endpoint of the line.\n     */\n    @JvmField\n    public val BUTT: LineCapValue = LineCapValue(Value(\"butt\"))\n\n    /**\n     * A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\n     */\n    @JvmField\n    public val ROUND: LineCapValue = LineCapValue(Value(\"round\"))\n\n    /**\n     * A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\n     */\n    @JvmField\n    public val SQUARE: LineCapValue = LineCapValue(Value(\"square\"))\n  }\n}\n\n/**\n * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class LineElevationReferenceValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [LineElevationReferenceValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: LineElevationReferenceValue = LineElevationReferenceValue(Value.valueOf(\"LineElevationReferenceValue.INITIAL\"))\n\n    /**\n     * Default value for [LineElevationReferenceValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: LineElevationReferenceValue = LineElevationReferenceValue(Value.nullValue())\n\n    /**\n     * Elevated rendering is disabled.\n     */\n    @JvmField\n    public val NONE: LineElevationReferenceValue = LineElevationReferenceValue(Value(\"none\"))\n\n    /**\n     * Elevated rendering is enabled. Use this mode to elevate lines relative to the sea level.\n     */\n    @JvmField\n    public val SEA: LineElevationReferenceValue = LineElevationReferenceValue(Value(\"sea\"))\n\n    /**\n     * Elevated rendering is enabled. Use this mode to elevate lines relative to the ground's height below them.\n     */\n    @JvmField\n    public val GROUND: LineElevationReferenceValue = LineElevationReferenceValue(Value(\"ground\"))\n\n    /**\n     * Elevated rendering is enabled. Use this mode to describe additive and stackable features that should exist only on top of road polygons.\n     */\n    @JvmField\n    public val HD_ROAD_MARKUP: LineElevationReferenceValue = LineElevationReferenceValue(Value(\"hd-road-markup\"))\n  }\n}\n\n/**\n * The display of lines when joining. Default value: \"miter\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class LineJoinValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [LineJoinValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: LineJoinValue = LineJoinValue(Value.valueOf(\"LineJoinValue.INITIAL\"))\n\n    /**\n     * Default value for [LineJoinValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: LineJoinValue = LineJoinValue(Value.nullValue())\n\n    /**\n     * A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\n     */\n    @JvmField\n    public val BEVEL: LineJoinValue = LineJoinValue(Value(\"bevel\"))\n\n    /**\n     * A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\n     */\n    @JvmField\n    public val ROUND: LineJoinValue = LineJoinValue(Value(\"round\"))\n\n    /**\n     * A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\n     */\n    @JvmField\n    public val MITER: LineJoinValue = LineJoinValue(Value(\"miter\"))\n\n    /**\n     * Line segments are not joined together, each one creates a separate line. Useful in combination with line-pattern. Line-cap property is not respected. Can't be used with data-driven styling.\n     */\n    @JvmField\n    public val NONE: LineJoinValue = LineJoinValue(Value(\"none\"))\n  }\n}\n\n/**\n * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\n@MapboxExperimental\npublic data class LineWidthUnitValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [LineWidthUnitValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: LineWidthUnitValue = LineWidthUnitValue(Value.valueOf(\"LineWidthUnitValue.INITIAL\"))\n\n    /**\n     * Default value for [LineWidthUnitValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: LineWidthUnitValue = LineWidthUnitValue(Value.nullValue())\n\n    /**\n     * Width is rendered in pixels.\n     */\n    @JvmField\n    public val PIXELS: LineWidthUnitValue = LineWidthUnitValue(Value(\"pixels\"))\n\n    /**\n     * Width is rendered in meters.\n     */\n    @JvmField\n    public val METERS: LineWidthUnitValue = LineWidthUnitValue(Value(\"meters\"))\n  }\n}\n\n/**\n * Controls the frame of reference for `line-translate`. Default value: \"map\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class LineTranslateAnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [LineTranslateAnchorValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: LineTranslateAnchorValue = LineTranslateAnchorValue(Value.valueOf(\"LineTranslateAnchorValue.INITIAL\"))\n\n    /**\n     * Default value for [LineTranslateAnchorValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: LineTranslateAnchorValue = LineTranslateAnchorValue(Value.nullValue())\n\n    /**\n     * The line is translated relative to the map.\n     */\n    @JvmField\n    public val MAP: LineTranslateAnchorValue = LineTranslateAnchorValue(Value(\"map\"))\n\n    /**\n     * The line is translated relative to the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: LineTranslateAnchorValue = LineTranslateAnchorValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * Part of the icon placed closest to the anchor. Default value: \"center\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class IconAnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [IconAnchorValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: IconAnchorValue = IconAnchorValue(Value.valueOf(\"IconAnchorValue.INITIAL\"))\n\n    /**\n     * Default value for [IconAnchorValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: IconAnchorValue = IconAnchorValue(Value.nullValue())\n\n    /**\n     * The center of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    public val CENTER: IconAnchorValue = IconAnchorValue(Value(\"center\"))\n\n    /**\n     * The left side of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    public val LEFT: IconAnchorValue = IconAnchorValue(Value(\"left\"))\n\n    /**\n     * The right side of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    public val RIGHT: IconAnchorValue = IconAnchorValue(Value(\"right\"))\n\n    /**\n     * The top of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    public val TOP: IconAnchorValue = IconAnchorValue(Value(\"top\"))\n\n    /**\n     * The bottom of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    public val BOTTOM: IconAnchorValue = IconAnchorValue(Value(\"bottom\"))\n\n    /**\n     * The top left corner of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    public val TOP_LEFT: IconAnchorValue = IconAnchorValue(Value(\"top-left\"))\n\n    /**\n     * The top right corner of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    public val TOP_RIGHT: IconAnchorValue = IconAnchorValue(Value(\"top-right\"))\n\n    /**\n     * The bottom left corner of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    public val BOTTOM_LEFT: IconAnchorValue = IconAnchorValue(Value(\"bottom-left\"))\n\n    /**\n     * The bottom right corner of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    public val BOTTOM_RIGHT: IconAnchorValue = IconAnchorValue(Value(\"bottom-right\"))\n  }\n}\n\n/**\n * Orientation of icon when map is pitched. Default value: \"auto\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class IconPitchAlignmentValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [IconPitchAlignmentValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: IconPitchAlignmentValue = IconPitchAlignmentValue(Value.valueOf(\"IconPitchAlignmentValue.INITIAL\"))\n\n    /**\n     * Default value for [IconPitchAlignmentValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: IconPitchAlignmentValue = IconPitchAlignmentValue(Value.nullValue())\n\n    /**\n     * The icon is aligned to the plane of the map.\n     */\n    @JvmField\n    public val MAP: IconPitchAlignmentValue = IconPitchAlignmentValue(Value(\"map\"))\n\n    /**\n     * The icon is aligned to the plane of the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: IconPitchAlignmentValue = IconPitchAlignmentValue(Value(\"viewport\"))\n\n    /**\n     * Automatically matches the value of `icon-rotation-alignment`.\n     */\n    @JvmField\n    public val AUTO: IconPitchAlignmentValue = IconPitchAlignmentValue(Value(\"auto\"))\n  }\n}\n\n/**\n * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class IconRotationAlignmentValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [IconRotationAlignmentValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: IconRotationAlignmentValue = IconRotationAlignmentValue(Value.valueOf(\"IconRotationAlignmentValue.INITIAL\"))\n\n    /**\n     * Default value for [IconRotationAlignmentValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: IconRotationAlignmentValue = IconRotationAlignmentValue(Value.nullValue())\n\n    /**\n     * When [SymbolPlacement] is set to [SymbolPlacement.POINT], aligns icons east-west. When [SymbolPlacement] is set to [SymbolPlacement.LINE] or [SymbolPlacement.LINE_CENTER] aligns icon x-axes with the line.\n     */\n    @JvmField\n    public val MAP: IconRotationAlignmentValue = IconRotationAlignmentValue(Value(\"map\"))\n\n    /**\n     * Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\n     */\n    @JvmField\n    public val VIEWPORT: IconRotationAlignmentValue = IconRotationAlignmentValue(Value(\"viewport\"))\n\n    /**\n     * When [SymbolPlacement] is set to [SymbolPlacement.POINT], this is equivalent to [IconRotationAlignment.VIEWPORT]. When [SymbolPlacement] is set to [SymbolPlacement.LINE] or [SymbolPlacement.LINE_CENTER] this is equivalent to [IconRotationAlignment.MAP].\n     */\n    @JvmField\n    public val AUTO: IconRotationAlignmentValue = IconRotationAlignmentValue(Value(\"auto\"))\n  }\n}\n\n/**\n * Scales the icon to fit around the associated text. Default value: \"none\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class IconTextFitValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [IconTextFitValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: IconTextFitValue = IconTextFitValue(Value.valueOf(\"IconTextFitValue.INITIAL\"))\n\n    /**\n     * Default value for [IconTextFitValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: IconTextFitValue = IconTextFitValue(Value.nullValue())\n\n    /**\n     * The icon is displayed at its intrinsic aspect ratio.\n     */\n    @JvmField\n    public val NONE: IconTextFitValue = IconTextFitValue(Value(\"none\"))\n\n    /**\n     * The icon is scaled in the x-dimension to fit the width of the text.\n     */\n    @JvmField\n    public val WIDTH: IconTextFitValue = IconTextFitValue(Value(\"width\"))\n\n    /**\n     * The icon is scaled in the y-dimension to fit the height of the text.\n     */\n    @JvmField\n    public val HEIGHT: IconTextFitValue = IconTextFitValue(Value(\"height\"))\n\n    /**\n     * The icon is scaled in both x- and y-dimensions.\n     */\n    @JvmField\n    public val BOTH: IconTextFitValue = IconTextFitValue(Value(\"both\"))\n  }\n}\n\n/**\n * Selects the base of symbol-elevation. Default value: \"ground\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\n@MapboxExperimental\npublic data class SymbolElevationReferenceValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [SymbolElevationReferenceValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: SymbolElevationReferenceValue = SymbolElevationReferenceValue(Value.valueOf(\"SymbolElevationReferenceValue.INITIAL\"))\n\n    /**\n     * Default value for [SymbolElevationReferenceValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: SymbolElevationReferenceValue = SymbolElevationReferenceValue(Value.nullValue())\n\n    /**\n     * Elevate symbols relative to the sea level.\n     */\n    @JvmField\n    public val SEA: SymbolElevationReferenceValue = SymbolElevationReferenceValue(Value(\"sea\"))\n\n    /**\n     * Elevate symbols relative to the ground's height below them.\n     */\n    @JvmField\n    public val GROUND: SymbolElevationReferenceValue = SymbolElevationReferenceValue(Value(\"ground\"))\n\n    /**\n     * Use this mode to enable elevated behavior for features that are rendered on top of 3D road polygons. The feature is currently being developed.\n     */\n    @JvmField\n    public val HD_ROAD_MARKUP: SymbolElevationReferenceValue = SymbolElevationReferenceValue(Value(\"hd-road-markup\"))\n  }\n}\n\n/**\n * Label placement relative to its geometry. Default value: \"point\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class SymbolPlacementValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [SymbolPlacementValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: SymbolPlacementValue = SymbolPlacementValue(Value.valueOf(\"SymbolPlacementValue.INITIAL\"))\n\n    /**\n     * Default value for [SymbolPlacementValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: SymbolPlacementValue = SymbolPlacementValue(Value.nullValue())\n\n    /**\n     * The label is placed at the point where the geometry is located.\n     */\n    @JvmField\n    public val POINT: SymbolPlacementValue = SymbolPlacementValue(Value(\"point\"))\n\n    /**\n     * The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries.\n     */\n    @JvmField\n    public val LINE: SymbolPlacementValue = SymbolPlacementValue(Value(\"line\"))\n\n    /**\n     * The label is placed at the center of the line of the geometry. Can only be used on `LineString` and `Polygon` geometries. Note that a single feature in a vector tile may contain multiple line geometries.\n     */\n    @JvmField\n    public val LINE_CENTER: SymbolPlacementValue = SymbolPlacementValue(Value(\"line-center\"))\n  }\n}\n\n/**\n * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class SymbolZOrderValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [SymbolZOrderValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: SymbolZOrderValue = SymbolZOrderValue(Value.valueOf(\"SymbolZOrderValue.INITIAL\"))\n\n    /**\n     * Default value for [SymbolZOrderValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: SymbolZOrderValue = SymbolZOrderValue(Value.nullValue())\n\n    /**\n     * Sorts symbols by `symbol-sort-key` if set. Otherwise, sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`.\n     */\n    @JvmField\n    public val AUTO: SymbolZOrderValue = SymbolZOrderValue(Value(\"auto\"))\n\n    /**\n     * Sorts symbols by their y-position relative to the viewport if any of the following is set to `true`: `icon-allow-overlap`, `text-allow-overlap`, `icon-ignore-placement`, `text-ignore-placement`.\n     */\n    @JvmField\n    public val VIEWPORT_Y: SymbolZOrderValue = SymbolZOrderValue(Value(\"viewport-y\"))\n\n    /**\n     * Sorts symbols by `symbol-sort-key` if set. Otherwise, no sorting is applied; symbols are rendered in the same order as the source data.\n     */\n    @JvmField\n    public val SOURCE: SymbolZOrderValue = SymbolZOrderValue(Value(\"source\"))\n  }\n}\n\n/**\n * Part of the text placed closest to the anchor. Default value: \"center\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextAnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [TextAnchorValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: TextAnchorValue = TextAnchorValue(Value.valueOf(\"TextAnchorValue.INITIAL\"))\n\n    /**\n     * Default value for [TextAnchorValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: TextAnchorValue = TextAnchorValue(Value.nullValue())\n\n    /**\n     * The center of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val CENTER: TextAnchorValue = TextAnchorValue(Value(\"center\"))\n\n    /**\n     * The left side of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val LEFT: TextAnchorValue = TextAnchorValue(Value(\"left\"))\n\n    /**\n     * The right side of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val RIGHT: TextAnchorValue = TextAnchorValue(Value(\"right\"))\n\n    /**\n     * The top of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val TOP: TextAnchorValue = TextAnchorValue(Value(\"top\"))\n\n    /**\n     * The bottom of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val BOTTOM: TextAnchorValue = TextAnchorValue(Value(\"bottom\"))\n\n    /**\n     * The top left corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val TOP_LEFT: TextAnchorValue = TextAnchorValue(Value(\"top-left\"))\n\n    /**\n     * The top right corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val TOP_RIGHT: TextAnchorValue = TextAnchorValue(Value(\"top-right\"))\n\n    /**\n     * The bottom left corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val BOTTOM_LEFT: TextAnchorValue = TextAnchorValue(Value(\"bottom-left\"))\n\n    /**\n     * The bottom right corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val BOTTOM_RIGHT: TextAnchorValue = TextAnchorValue(Value(\"bottom-right\"))\n  }\n}\n\n/**\n * Text justification options. Default value: \"center\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextJustifyValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [TextJustifyValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: TextJustifyValue = TextJustifyValue(Value.valueOf(\"TextJustifyValue.INITIAL\"))\n\n    /**\n     * Default value for [TextJustifyValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: TextJustifyValue = TextJustifyValue(Value.nullValue())\n\n    /**\n     * The text is aligned towards the anchor position.\n     */\n    @JvmField\n    public val AUTO: TextJustifyValue = TextJustifyValue(Value(\"auto\"))\n\n    /**\n     * The text is aligned to the left.\n     */\n    @JvmField\n    public val LEFT: TextJustifyValue = TextJustifyValue(Value(\"left\"))\n\n    /**\n     * The text is centered.\n     */\n    @JvmField\n    public val CENTER: TextJustifyValue = TextJustifyValue(Value(\"center\"))\n\n    /**\n     * The text is aligned to the right.\n     */\n    @JvmField\n    public val RIGHT: TextJustifyValue = TextJustifyValue(Value(\"right\"))\n  }\n}\n\n/**\n * Orientation of text when map is pitched. Default value: \"auto\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextPitchAlignmentValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [TextPitchAlignmentValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: TextPitchAlignmentValue = TextPitchAlignmentValue(Value.valueOf(\"TextPitchAlignmentValue.INITIAL\"))\n\n    /**\n     * Default value for [TextPitchAlignmentValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: TextPitchAlignmentValue = TextPitchAlignmentValue(Value.nullValue())\n\n    /**\n     * The text is aligned to the plane of the map.\n     */\n    @JvmField\n    public val MAP: TextPitchAlignmentValue = TextPitchAlignmentValue(Value(\"map\"))\n\n    /**\n     * The text is aligned to the plane of the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: TextPitchAlignmentValue = TextPitchAlignmentValue(Value(\"viewport\"))\n\n    /**\n     * Automatically matches the value of `text-rotation-alignment`.\n     */\n    @JvmField\n    public val AUTO: TextPitchAlignmentValue = TextPitchAlignmentValue(Value(\"auto\"))\n  }\n}\n\n/**\n * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextRotationAlignmentValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [TextRotationAlignmentValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: TextRotationAlignmentValue = TextRotationAlignmentValue(Value.valueOf(\"TextRotationAlignmentValue.INITIAL\"))\n\n    /**\n     * Default value for [TextRotationAlignmentValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: TextRotationAlignmentValue = TextRotationAlignmentValue(Value.nullValue())\n\n    /**\n     * When [SymbolPlacement] is set to [SymbolPlacement.POINT], aligns text east-west. When [SymbolPlacement] is set to [SymbolPlacement.LINE] or [SymbolPlacement.LINE_CENTER] aligns text x-axes with the line.\n     */\n    @JvmField\n    public val MAP: TextRotationAlignmentValue = TextRotationAlignmentValue(Value(\"map\"))\n\n    /**\n     * Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\n     */\n    @JvmField\n    public val VIEWPORT: TextRotationAlignmentValue = TextRotationAlignmentValue(Value(\"viewport\"))\n\n    /**\n     * When [SymbolPlacement] is set to [SymbolPlacement.POINT], this is equivalent to [TextRotationAlignment.VIEWPORT]. When [SymbolPlacement] is set to [SymbolPlacement.LINE] or [SymbolPlacement.LINE_CENTER] this is equivalent to [TextRotationAlignment.MAP].\n     */\n    @JvmField\n    public val AUTO: TextRotationAlignmentValue = TextRotationAlignmentValue(Value(\"auto\"))\n  }\n}\n\n/**\n * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextTransformValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [TextTransformValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: TextTransformValue = TextTransformValue(Value.valueOf(\"TextTransformValue.INITIAL\"))\n\n    /**\n     * Default value for [TextTransformValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: TextTransformValue = TextTransformValue(Value.nullValue())\n\n    /**\n     * The text is not altered.\n     */\n    @JvmField\n    public val NONE: TextTransformValue = TextTransformValue(Value(\"none\"))\n\n    /**\n     * Forces all letters to be displayed in uppercase.\n     */\n    @JvmField\n    public val UPPERCASE: TextTransformValue = TextTransformValue(Value(\"uppercase\"))\n\n    /**\n     * Forces all letters to be displayed in lowercase.\n     */\n    @JvmField\n    public val LOWERCASE: TextTransformValue = TextTransformValue(Value(\"lowercase\"))\n  }\n}\n\n/**\n * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextVariableAnchorListValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [TextVariableAnchorListValue] with [TextVariableAnchor].\n   */\n  public constructor(value: List<TextVariableAnchor>) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the [TextVariableAnchorListValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: TextVariableAnchorListValue = TextVariableAnchorListValue(Value.valueOf(\"TextVariableAnchorListValue.INITIAL\"))\n\n    /**\n     * Default value for [TextVariableAnchorListValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: TextVariableAnchorListValue = TextVariableAnchorListValue(Value.nullValue())\n  }\n}\n\n/**\n *  To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextVariableAnchor internal constructor(public val value: Value) {\n  /**\n   * Public companion object.\n   */\n  public companion object {\n\n    /**\n     * The center of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val CENTER: TextVariableAnchor = TextVariableAnchor(Value(\"center\"))\n\n    /**\n     * The left side of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val LEFT: TextVariableAnchor = TextVariableAnchor(Value(\"left\"))\n\n    /**\n     * The right side of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val RIGHT: TextVariableAnchor = TextVariableAnchor(Value(\"right\"))\n\n    /**\n     * The top of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val TOP: TextVariableAnchor = TextVariableAnchor(Value(\"top\"))\n\n    /**\n     * The bottom of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val BOTTOM: TextVariableAnchor = TextVariableAnchor(Value(\"bottom\"))\n\n    /**\n     * The top left corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val TOP_LEFT: TextVariableAnchor = TextVariableAnchor(Value(\"top-left\"))\n\n    /**\n     * The top right corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val TOP_RIGHT: TextVariableAnchor = TextVariableAnchor(Value(\"top-right\"))\n\n    /**\n     * The bottom left corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val BOTTOM_LEFT: TextVariableAnchor = TextVariableAnchor(Value(\"bottom-left\"))\n\n    /**\n     * The bottom right corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    public val BOTTOM_RIGHT: TextVariableAnchor = TextVariableAnchor(Value(\"bottom-right\"))\n  }\n}\n/**\n * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextWritingModeListValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [TextWritingModeListValue] with [TextWritingMode].\n   */\n  public constructor(value: List<TextWritingMode>) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the [TextWritingModeListValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: TextWritingModeListValue = TextWritingModeListValue(Value.valueOf(\"TextWritingModeListValue.INITIAL\"))\n\n    /**\n     * Default value for [TextWritingModeListValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: TextWritingModeListValue = TextWritingModeListValue(Value.nullValue())\n  }\n}\n\n/**\n *  The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextWritingMode internal constructor(public val value: Value) {\n  /**\n   * Public companion object.\n   */\n  public companion object {\n\n    /**\n     * If a text's language supports horizontal writing mode, symbols would be laid out horizontally.\n     */\n    @JvmField\n    public val HORIZONTAL: TextWritingMode = TextWritingMode(Value(\"horizontal\"))\n\n    /**\n     * If a text's language supports vertical writing mode, symbols would be laid out vertically.\n     */\n    @JvmField\n    public val VERTICAL: TextWritingMode = TextWritingMode(Value(\"vertical\"))\n  }\n}\n/**\n * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class IconTranslateAnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [IconTranslateAnchorValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: IconTranslateAnchorValue = IconTranslateAnchorValue(Value.valueOf(\"IconTranslateAnchorValue.INITIAL\"))\n\n    /**\n     * Default value for [IconTranslateAnchorValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: IconTranslateAnchorValue = IconTranslateAnchorValue(Value.nullValue())\n\n    /**\n     * Icons are translated relative to the map.\n     */\n    @JvmField\n    public val MAP: IconTranslateAnchorValue = IconTranslateAnchorValue(Value(\"map\"))\n\n    /**\n     * Icons are translated relative to the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: IconTranslateAnchorValue = IconTranslateAnchorValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class OcclusionOpacityModeValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [OcclusionOpacityModeValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: OcclusionOpacityModeValue = OcclusionOpacityModeValue(Value.valueOf(\"OcclusionOpacityModeValue.INITIAL\"))\n\n    /**\n     * Default value for [OcclusionOpacityModeValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: OcclusionOpacityModeValue = OcclusionOpacityModeValue(Value.nullValue())\n\n    /**\n     * Whole symbol is treated as occluded if it's anchor point is occluded\n     */\n    @JvmField\n    public val ANCHOR: OcclusionOpacityModeValue = OcclusionOpacityModeValue(Value(\"anchor\"))\n\n    /**\n     * Occlusion is applied on a per-pixel basis\n     */\n    @JvmField\n    public val PIXEL: OcclusionOpacityModeValue = OcclusionOpacityModeValue(Value(\"pixel\"))\n  }\n}\n\n/**\n * Controls the frame of reference for `text-translate`. Default value: \"map\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TextTranslateAnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [TextTranslateAnchorValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: TextTranslateAnchorValue = TextTranslateAnchorValue(Value.valueOf(\"TextTranslateAnchorValue.INITIAL\"))\n\n    /**\n     * Default value for [TextTranslateAnchorValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: TextTranslateAnchorValue = TextTranslateAnchorValue(Value.nullValue())\n\n    /**\n     * The text is translated relative to the map.\n     */\n    @JvmField\n    public val MAP: TextTranslateAnchorValue = TextTranslateAnchorValue(Value(\"map\"))\n\n    /**\n     * The text is translated relative to the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: TextTranslateAnchorValue = TextTranslateAnchorValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\n@MapboxExperimental\npublic data class CircleElevationReferenceValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [CircleElevationReferenceValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: CircleElevationReferenceValue = CircleElevationReferenceValue(Value.valueOf(\"CircleElevationReferenceValue.INITIAL\"))\n\n    /**\n     * Default value for [CircleElevationReferenceValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: CircleElevationReferenceValue = CircleElevationReferenceValue(Value.nullValue())\n\n    /**\n     * Elevated rendering is disabled.\n     */\n    @JvmField\n    public val NONE: CircleElevationReferenceValue = CircleElevationReferenceValue(Value(\"none\"))\n\n    /**\n     * Elevated rendering is enabled. Use this mode to describe additive and stackable features that should exist only on top of road polygons.\n     */\n    @JvmField\n    public val HD_ROAD_MARKUP: CircleElevationReferenceValue = CircleElevationReferenceValue(Value(\"hd-road-markup\"))\n  }\n}\n\n/**\n * Orientation of circle when map is pitched. Default value: \"viewport\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class CirclePitchAlignmentValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [CirclePitchAlignmentValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: CirclePitchAlignmentValue = CirclePitchAlignmentValue(Value.valueOf(\"CirclePitchAlignmentValue.INITIAL\"))\n\n    /**\n     * Default value for [CirclePitchAlignmentValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: CirclePitchAlignmentValue = CirclePitchAlignmentValue(Value.nullValue())\n\n    /**\n     * The circle is aligned to the plane of the map.\n     */\n    @JvmField\n    public val MAP: CirclePitchAlignmentValue = CirclePitchAlignmentValue(Value(\"map\"))\n\n    /**\n     * The circle is aligned to the plane of the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: CirclePitchAlignmentValue = CirclePitchAlignmentValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class CirclePitchScaleValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [CirclePitchScaleValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: CirclePitchScaleValue = CirclePitchScaleValue(Value.valueOf(\"CirclePitchScaleValue.INITIAL\"))\n\n    /**\n     * Default value for [CirclePitchScaleValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: CirclePitchScaleValue = CirclePitchScaleValue(Value.nullValue())\n\n    /**\n     * Circles are scaled according to their apparent distance to the camera.\n     */\n    @JvmField\n    public val MAP: CirclePitchScaleValue = CirclePitchScaleValue(Value(\"map\"))\n\n    /**\n     * Circles are not scaled.\n     */\n    @JvmField\n    public val VIEWPORT: CirclePitchScaleValue = CirclePitchScaleValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class CircleTranslateAnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [CircleTranslateAnchorValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: CircleTranslateAnchorValue = CircleTranslateAnchorValue(Value.valueOf(\"CircleTranslateAnchorValue.INITIAL\"))\n\n    /**\n     * Default value for [CircleTranslateAnchorValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: CircleTranslateAnchorValue = CircleTranslateAnchorValue(Value.nullValue())\n\n    /**\n     * The circle is translated relative to the map.\n     */\n    @JvmField\n    public val MAP: CircleTranslateAnchorValue = CircleTranslateAnchorValue(Value(\"map\"))\n\n    /**\n     * The circle is translated relative to the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: CircleTranslateAnchorValue = CircleTranslateAnchorValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\n@MapboxExperimental\npublic data class FillExtrusionBaseAlignmentValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [FillExtrusionBaseAlignmentValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: FillExtrusionBaseAlignmentValue = FillExtrusionBaseAlignmentValue(Value.valueOf(\"FillExtrusionBaseAlignmentValue.INITIAL\"))\n\n    /**\n     * Default value for [FillExtrusionBaseAlignmentValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: FillExtrusionBaseAlignmentValue = FillExtrusionBaseAlignmentValue(Value.nullValue())\n\n    /**\n     * The fill extrusion base follows terrain slope.\n     */\n    @JvmField\n    public val TERRAIN: FillExtrusionBaseAlignmentValue = FillExtrusionBaseAlignmentValue(Value(\"terrain\"))\n\n    /**\n     * The fill extrusion base is flat over terrain.\n     */\n    @JvmField\n    public val FLAT: FillExtrusionBaseAlignmentValue = FillExtrusionBaseAlignmentValue(Value(\"flat\"))\n  }\n}\n\n/**\n * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\n@MapboxExperimental\npublic data class FillExtrusionHeightAlignmentValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [FillExtrusionHeightAlignmentValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: FillExtrusionHeightAlignmentValue = FillExtrusionHeightAlignmentValue(Value.valueOf(\"FillExtrusionHeightAlignmentValue.INITIAL\"))\n\n    /**\n     * Default value for [FillExtrusionHeightAlignmentValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: FillExtrusionHeightAlignmentValue = FillExtrusionHeightAlignmentValue(Value.nullValue())\n\n    /**\n     * The fill extrusion height follows terrain slope.\n     */\n    @JvmField\n    public val TERRAIN: FillExtrusionHeightAlignmentValue = FillExtrusionHeightAlignmentValue(Value(\"terrain\"))\n\n    /**\n     * The fill extrusion height is flat over terrain.\n     */\n    @JvmField\n    public val FLAT: FillExtrusionHeightAlignmentValue = FillExtrusionHeightAlignmentValue(Value(\"flat\"))\n  }\n}\n\n/**\n * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class FillExtrusionTranslateAnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [FillExtrusionTranslateAnchorValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: FillExtrusionTranslateAnchorValue = FillExtrusionTranslateAnchorValue(Value.valueOf(\"FillExtrusionTranslateAnchorValue.INITIAL\"))\n\n    /**\n     * Default value for [FillExtrusionTranslateAnchorValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: FillExtrusionTranslateAnchorValue = FillExtrusionTranslateAnchorValue(Value.nullValue())\n\n    /**\n     * The fill extrusion is translated relative to the map.\n     */\n    @JvmField\n    public val MAP: FillExtrusionTranslateAnchorValue = FillExtrusionTranslateAnchorValue(Value(\"map\"))\n\n    /**\n     * The fill extrusion is translated relative to the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: FillExtrusionTranslateAnchorValue = FillExtrusionTranslateAnchorValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class RasterResamplingValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [RasterResamplingValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: RasterResamplingValue = RasterResamplingValue(Value.valueOf(\"RasterResamplingValue.INITIAL\"))\n\n    /**\n     * Default value for [RasterResamplingValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: RasterResamplingValue = RasterResamplingValue(Value.nullValue())\n\n    /**\n     * (Bi)linear filtering interpolates pixel values using the weighted average of the four closest original source pixels creating a smooth but blurry look when overscaled\n     */\n    @JvmField\n    public val LINEAR: RasterResamplingValue = RasterResamplingValue(Value(\"linear\"))\n\n    /**\n     * Nearest neighbor filtering interpolates pixel values using the nearest original source pixel creating a sharp but pixelated look when overscaled\n     */\n    @JvmField\n    public val NEAREST: RasterResamplingValue = RasterResamplingValue(Value(\"nearest\"))\n  }\n}\n\n/**\n * Direction of light source when map is rotated. Default value: \"viewport\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class HillshadeIlluminationAnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [HillshadeIlluminationAnchorValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: HillshadeIlluminationAnchorValue = HillshadeIlluminationAnchorValue(Value.valueOf(\"HillshadeIlluminationAnchorValue.INITIAL\"))\n\n    /**\n     * Default value for [HillshadeIlluminationAnchorValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: HillshadeIlluminationAnchorValue = HillshadeIlluminationAnchorValue(Value.nullValue())\n\n    /**\n     * The hillshade illumination is relative to the north direction.\n     */\n    @JvmField\n    public val MAP: HillshadeIlluminationAnchorValue = HillshadeIlluminationAnchorValue(Value(\"map\"))\n\n    /**\n     * The hillshade illumination is relative to the top of the viewport.\n     */\n    @JvmField\n    public val VIEWPORT: HillshadeIlluminationAnchorValue = HillshadeIlluminationAnchorValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class ModelElevationReferenceValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [ModelElevationReferenceValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ModelElevationReferenceValue = ModelElevationReferenceValue(Value.valueOf(\"ModelElevationReferenceValue.INITIAL\"))\n\n    /**\n     * Default value for [ModelElevationReferenceValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: ModelElevationReferenceValue = ModelElevationReferenceValue(Value.nullValue())\n\n    /**\n     * Elevated rendering is enabled. Use this mode to elevate models relative to the sea level.\n     */\n    @JvmField\n    public val SEA: ModelElevationReferenceValue = ModelElevationReferenceValue(Value(\"sea\"))\n\n    /**\n     * Elevated rendering is enabled. Use this mode to elevate models relative to the ground's height below them.\n     */\n    @JvmField\n    public val GROUND: ModelElevationReferenceValue = ModelElevationReferenceValue(Value(\"ground\"))\n\n    /**\n     * Elevated rendering is enabled. Use this mode to describe additive and stackable features that should exist only on top of road polygons.\n     */\n    @JvmField\n    public val HD_ROAD_MARKUP: ModelElevationReferenceValue = ModelElevationReferenceValue(Value(\"hd-road-markup\"))\n  }\n}\n\n/**\n * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class ModelScaleModeValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [ModelScaleModeValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ModelScaleModeValue = ModelScaleModeValue(Value.valueOf(\"ModelScaleModeValue.INITIAL\"))\n\n    /**\n     * Default value for [ModelScaleModeValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: ModelScaleModeValue = ModelScaleModeValue(Value.nullValue())\n\n    /**\n     * Model is scaled so that it's always the same size relative to other map features. The property model-scale specifies how many meters each unit in the model file should cover.\n     */\n    @JvmField\n    public val MAP: ModelScaleModeValue = ModelScaleModeValue(Value(\"map\"))\n\n    /**\n     * Model is scaled so that it's always the same size on the screen. The property model-scale specifies how many pixels each unit in model file should cover.\n     */\n    @JvmField\n    public val VIEWPORT: ModelScaleModeValue = ModelScaleModeValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class ModelTypeValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [ModelTypeValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ModelTypeValue = ModelTypeValue(Value.valueOf(\"ModelTypeValue.INITIAL\"))\n\n    /**\n     * Default value for [ModelTypeValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: ModelTypeValue = ModelTypeValue(Value.nullValue())\n\n    /**\n     * Integrated to 3D scene, using depth testing, along with terrain, fill-extrusions and custom layer.\n     */\n    @JvmField\n    public val COMMON_3D: ModelTypeValue = ModelTypeValue(Value(\"common-3d\"))\n\n    /**\n     * Displayed over other 3D content, occluded by terrain.\n     */\n    @JvmField\n    public val LOCATION_INDICATOR: ModelTypeValue = ModelTypeValue(Value(\"location-indicator\"))\n  }\n}\n\n/**\n * Orientation of background layer. Default value: \"map\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\n@MapboxExperimental\npublic data class BackgroundPitchAlignmentValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [BackgroundPitchAlignmentValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: BackgroundPitchAlignmentValue = BackgroundPitchAlignmentValue(Value.valueOf(\"BackgroundPitchAlignmentValue.INITIAL\"))\n\n    /**\n     * Default value for [BackgroundPitchAlignmentValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: BackgroundPitchAlignmentValue = BackgroundPitchAlignmentValue(Value.nullValue())\n\n    /**\n     * The background is aligned to the plane of the map.\n     */\n    @JvmField\n    public val MAP: BackgroundPitchAlignmentValue = BackgroundPitchAlignmentValue(Value(\"map\"))\n\n    /**\n     * The background is aligned to the plane of the viewport, covering the whole screen. Note: This mode disables the automatic reordering of the layer when terrain or globe projection is used.\n     */\n    @JvmField\n    public val VIEWPORT: BackgroundPitchAlignmentValue = BackgroundPitchAlignmentValue(Value(\"viewport\"))\n  }\n}\n\n/**\n * The type of the sky Default value: \"atmosphere\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class SkyTypeValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [SkyTypeValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: SkyTypeValue = SkyTypeValue(Value.valueOf(\"SkyTypeValue.INITIAL\"))\n\n    /**\n     * Default value for [SkyTypeValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: SkyTypeValue = SkyTypeValue(Value.nullValue())\n\n    /**\n     * Renders the sky with a gradient that can be configured with `sky-gradient-radius` and `sky-gradient`.\n     */\n    @JvmField\n    public val GRADIENT: SkyTypeValue = SkyTypeValue(Value(\"gradient\"))\n\n    /**\n     * Renders the sky with a simulated atmospheric scattering algorithm, the sun direction can be attached to the light position or explicitly set through `sky-atmosphere-sun`.\n     */\n    @JvmField\n    public val ATMOSPHERE: SkyTypeValue = SkyTypeValue(Value(\"atmosphere\"))\n  }\n}\n\n/**\n * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class ClipLayerTypesListValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [ClipLayerTypesListValue] with [ClipLayerTypes].\n   */\n  public constructor(value: List<ClipLayerTypes>) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the [ClipLayerTypesListValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ClipLayerTypesListValue = ClipLayerTypesListValue(Value.valueOf(\"ClipLayerTypesListValue.INITIAL\"))\n\n    /**\n     * Default value for [ClipLayerTypesListValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: ClipLayerTypesListValue = ClipLayerTypesListValue(Value.nullValue())\n  }\n}\n\n/**\n *  Layer types that will also be removed if fallen below this clip layer. Default value: [].\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class ClipLayerTypes internal constructor(public val value: Value) {\n  /**\n   * Public companion object.\n   */\n  public companion object {\n\n    /**\n     * If present the clip layer would remove all 3d model layers below it. Currently only instanced models (e.g. trees) are removed.\n     */\n    @JvmField\n    public val MODEL: ClipLayerTypes = ClipLayerTypes(Value(\"model\"))\n\n    /**\n     * If present the clip layer would remove all symbol layers below it.\n     */\n    @JvmField\n    public val SYMBOL: ClipLayerTypes = ClipLayerTypes(Value(\"symbol\"))\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/LineLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * A stroked line.\n *\n * This composable function inserts a [LineLayer] to the map. For convenience, if there's\n * no need to hoist the [lineLayerState], use `LineLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#line)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param lineLayerState the state holder for [LineLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun LineLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"line\")\n  },\n  lineLayerState: LineLayerState = remember { LineLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of LineLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"line\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(lineLayerState) {\n      lineLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(lineLayerState.interactionsState) {\n    lineLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * A stroked line.\n *\n * This composable function inserts a [LineLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#line)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [LineLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun LineLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"line\")\n  },\n  crossinline init: LineLayerState.() -> Unit\n) {\n  LineLayer(sourceState = sourceState, layerId = layerId, lineLayerState = remember { LineLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/LineLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.AddImageWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleRangeValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.ImageValue\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [LineLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#line)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class LineLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialLineCap: LineCapValue,\n  initialLineCrossSlope: DoubleValue,\n  initialLineElevationGroundScale: DoubleValue,\n  initialLineElevationGroundScaleTransition: Transition,\n  initialLineElevationReference: LineElevationReferenceValue,\n  initialLineJoin: LineJoinValue,\n  initialLineMiterLimit: DoubleValue,\n  initialLineRoundLimit: DoubleValue,\n  initialLineSortKey: DoubleValue,\n  initialLineWidthUnit: LineWidthUnitValue,\n  initialLineZOffset: DoubleValue,\n  initialLineBlur: DoubleValue,\n  initialLineBlurTransition: Transition,\n  initialLineBorderColor: ColorValue,\n  initialLineBorderColorUseTheme: StringValue,\n  initialLineBorderColorTransition: Transition,\n  initialLineBorderWidth: DoubleValue,\n  initialLineBorderWidthTransition: Transition,\n  initialLineColor: ColorValue,\n  initialLineColorUseTheme: StringValue,\n  initialLineColorTransition: Transition,\n  initialLineCutoutFadeWidth: DoubleValue,\n  initialLineCutoutFadeWidthTransition: Transition,\n  initialLineCutoutOpacity: DoubleValue,\n  initialLineCutoutOpacityTransition: Transition,\n  initialLineDasharray: DoubleListValue,\n  initialLineDepthOcclusionFactor: DoubleValue,\n  initialLineDepthOcclusionFactorTransition: Transition,\n  initialLineEmissiveStrength: DoubleValue,\n  initialLineEmissiveStrengthTransition: Transition,\n  initialLineGapWidth: DoubleValue,\n  initialLineGapWidthTransition: Transition,\n  initialLineGradient: ColorValue,\n  initialLineGradientUseTheme: StringValue,\n  initialLineOcclusionOpacity: DoubleValue,\n  initialLineOcclusionOpacityTransition: Transition,\n  initialLineOffset: DoubleValue,\n  initialLineOffsetTransition: Transition,\n  initialLineOpacity: DoubleValue,\n  initialLineOpacityTransition: Transition,\n  initialLinePattern: ImageValue,\n  initialLinePatternCrossFade: DoubleValue,\n  initialLineTranslate: DoubleListValue,\n  initialLineTranslateTransition: Transition,\n  initialLineTranslateAnchor: LineTranslateAnchorValue,\n  initialLineTrimColor: ColorValue,\n  initialLineTrimColorUseTheme: StringValue,\n  initialLineTrimColorTransition: Transition,\n  initialLineTrimFadeRange: DoubleRangeValue,\n  initialLineTrimOffset: DoubleListValue,\n  initialLineWidth: DoubleValue,\n  initialLineWidthTransition: Transition,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [LineLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialLineCap = LineCapValue.INITIAL,\n    initialLineCrossSlope = DoubleValue.INITIAL,\n    initialLineElevationGroundScale = DoubleValue.INITIAL,\n    initialLineElevationGroundScaleTransition = Transition.INITIAL,\n    initialLineElevationReference = LineElevationReferenceValue.INITIAL,\n    initialLineJoin = LineJoinValue.INITIAL,\n    initialLineMiterLimit = DoubleValue.INITIAL,\n    initialLineRoundLimit = DoubleValue.INITIAL,\n    initialLineSortKey = DoubleValue.INITIAL,\n    initialLineWidthUnit = LineWidthUnitValue.INITIAL,\n    initialLineZOffset = DoubleValue.INITIAL,\n    initialLineBlur = DoubleValue.INITIAL,\n    initialLineBlurTransition = Transition.INITIAL,\n    initialLineBorderColor = ColorValue.INITIAL,\n    initialLineBorderColorUseTheme = StringValue.INITIAL,\n    initialLineBorderColorTransition = Transition.INITIAL,\n    initialLineBorderWidth = DoubleValue.INITIAL,\n    initialLineBorderWidthTransition = Transition.INITIAL,\n    initialLineColor = ColorValue.INITIAL,\n    initialLineColorUseTheme = StringValue.INITIAL,\n    initialLineColorTransition = Transition.INITIAL,\n    initialLineCutoutFadeWidth = DoubleValue.INITIAL,\n    initialLineCutoutFadeWidthTransition = Transition.INITIAL,\n    initialLineCutoutOpacity = DoubleValue.INITIAL,\n    initialLineCutoutOpacityTransition = Transition.INITIAL,\n    initialLineDasharray = DoubleListValue.INITIAL,\n    initialLineDepthOcclusionFactor = DoubleValue.INITIAL,\n    initialLineDepthOcclusionFactorTransition = Transition.INITIAL,\n    initialLineEmissiveStrength = DoubleValue.INITIAL,\n    initialLineEmissiveStrengthTransition = Transition.INITIAL,\n    initialLineGapWidth = DoubleValue.INITIAL,\n    initialLineGapWidthTransition = Transition.INITIAL,\n    initialLineGradient = ColorValue.INITIAL,\n    initialLineGradientUseTheme = StringValue.INITIAL,\n    initialLineOcclusionOpacity = DoubleValue.INITIAL,\n    initialLineOcclusionOpacityTransition = Transition.INITIAL,\n    initialLineOffset = DoubleValue.INITIAL,\n    initialLineOffsetTransition = Transition.INITIAL,\n    initialLineOpacity = DoubleValue.INITIAL,\n    initialLineOpacityTransition = Transition.INITIAL,\n    initialLinePattern = ImageValue.INITIAL,\n    initialLinePatternCrossFade = DoubleValue.INITIAL,\n    initialLineTranslate = DoubleListValue.INITIAL,\n    initialLineTranslateTransition = Transition.INITIAL,\n    initialLineTranslateAnchor = LineTranslateAnchorValue.INITIAL,\n    initialLineTrimColor = ColorValue.INITIAL,\n    initialLineTrimColorUseTheme = StringValue.INITIAL,\n    initialLineTrimColorTransition = Transition.INITIAL,\n    initialLineTrimFadeRange = DoubleRangeValue.INITIAL,\n    initialLineTrimOffset = DoubleListValue.INITIAL,\n    initialLineWidth = DoubleValue.INITIAL,\n    initialLineWidthTransition = Transition.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  private val lineCapState: MutableState<LineCapValue> = mutableStateOf(initialLineCap)\n  /**\n   *  The display of line endings. Default value: \"butt\".\n   */\n  public var lineCap: LineCapValue by lineCapState\n\n  @MapboxExperimental\n  private val lineCrossSlopeState: MutableState<DoubleValue> = mutableStateOf(initialLineCrossSlope)\n  /**\n   *  Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n   */\n  @MapboxExperimental\n  public var lineCrossSlope: DoubleValue by lineCrossSlopeState\n\n  private val lineElevationGroundScaleState: MutableState<DoubleValue> = mutableStateOf(initialLineElevationGroundScale)\n  /**\n   *  Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   */\n  public var lineElevationGroundScale: DoubleValue by lineElevationGroundScaleState\n\n  private val lineElevationGroundScaleTransitionState: MutableState<Transition> = mutableStateOf(initialLineElevationGroundScaleTransition)\n  /**\n   *  Defines the transition of [lineElevationGroundScale].\n   */\n  public var lineElevationGroundScaleTransition: Transition by lineElevationGroundScaleTransitionState\n\n  private val lineElevationReferenceState: MutableState<LineElevationReferenceValue> = mutableStateOf(initialLineElevationReference)\n  /**\n   *  Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  public var lineElevationReference: LineElevationReferenceValue by lineElevationReferenceState\n\n  private val lineJoinState: MutableState<LineJoinValue> = mutableStateOf(initialLineJoin)\n  /**\n   *  The display of lines when joining. Default value: \"miter\".\n   */\n  public var lineJoin: LineJoinValue by lineJoinState\n\n  private val lineMiterLimitState: MutableState<DoubleValue> = mutableStateOf(initialLineMiterLimit)\n  /**\n   *  Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n   */\n  public var lineMiterLimit: DoubleValue by lineMiterLimitState\n\n  private val lineRoundLimitState: MutableState<DoubleValue> = mutableStateOf(initialLineRoundLimit)\n  /**\n   *  Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n   */\n  public var lineRoundLimit: DoubleValue by lineRoundLimitState\n\n  private val lineSortKeyState: MutableState<DoubleValue> = mutableStateOf(initialLineSortKey)\n  /**\n   *  Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  public var lineSortKey: DoubleValue by lineSortKeyState\n\n  @MapboxExperimental\n  private val lineWidthUnitState: MutableState<LineWidthUnitValue> = mutableStateOf(initialLineWidthUnit)\n  /**\n   *  Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n   */\n  @MapboxExperimental\n  public var lineWidthUnit: LineWidthUnitValue by lineWidthUnitState\n\n  private val lineZOffsetState: MutableState<DoubleValue> = mutableStateOf(initialLineZOffset)\n  /**\n   *  Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   */\n  public var lineZOffset: DoubleValue by lineZOffsetState\n\n  private val lineBlurState: MutableState<DoubleValue> = mutableStateOf(initialLineBlur)\n  /**\n   *  Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   */\n  public var lineBlur: DoubleValue by lineBlurState\n\n  private val lineBlurTransitionState: MutableState<Transition> = mutableStateOf(initialLineBlurTransition)\n  /**\n   *  Defines the transition of [lineBlur].\n   */\n  public var lineBlurTransition: Transition by lineBlurTransitionState\n\n  private val lineBorderColorState: MutableState<ColorValue> = mutableStateOf(initialLineBorderColor)\n  /**\n   *  The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  public var lineBorderColor: ColorValue by lineBorderColorState\n\n  @MapboxExperimental\n  private val lineBorderColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialLineBorderColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [lineBorderColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var lineBorderColorUseTheme: StringValue by lineBorderColorUseThemeState\n\n  private val lineBorderColorTransitionState: MutableState<Transition> = mutableStateOf(initialLineBorderColorTransition)\n  /**\n   *  Defines the transition of [lineBorderColor].\n   */\n  public var lineBorderColorTransition: Transition by lineBorderColorTransitionState\n\n  private val lineBorderWidthState: MutableState<DoubleValue> = mutableStateOf(initialLineBorderWidth)\n  /**\n   *  The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   */\n  public var lineBorderWidth: DoubleValue by lineBorderWidthState\n\n  private val lineBorderWidthTransitionState: MutableState<Transition> = mutableStateOf(initialLineBorderWidthTransition)\n  /**\n   *  Defines the transition of [lineBorderWidth].\n   */\n  public var lineBorderWidthTransition: Transition by lineBorderWidthTransitionState\n\n  private val lineColorState: MutableState<ColorValue> = mutableStateOf(initialLineColor)\n  /**\n   *  The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  public var lineColor: ColorValue by lineColorState\n\n  @MapboxExperimental\n  private val lineColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialLineColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [lineColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var lineColorUseTheme: StringValue by lineColorUseThemeState\n\n  private val lineColorTransitionState: MutableState<Transition> = mutableStateOf(initialLineColorTransition)\n  /**\n   *  Defines the transition of [lineColor].\n   */\n  public var lineColorTransition: Transition by lineColorTransitionState\n\n  @MapboxExperimental\n  private val lineCutoutFadeWidthState: MutableState<DoubleValue> = mutableStateOf(initialLineCutoutFadeWidth)\n  /**\n   *  The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var lineCutoutFadeWidth: DoubleValue by lineCutoutFadeWidthState\n\n  @MapboxExperimental\n  private val lineCutoutFadeWidthTransitionState: MutableState<Transition> = mutableStateOf(initialLineCutoutFadeWidthTransition)\n  /**\n   *  Defines the transition of [lineCutoutFadeWidth].\n   */\n  @MapboxExperimental\n  public var lineCutoutFadeWidthTransition: Transition by lineCutoutFadeWidthTransitionState\n\n  @MapboxExperimental\n  private val lineCutoutOpacityState: MutableState<DoubleValue> = mutableStateOf(initialLineCutoutOpacity)\n  /**\n   *  The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var lineCutoutOpacity: DoubleValue by lineCutoutOpacityState\n\n  @MapboxExperimental\n  private val lineCutoutOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialLineCutoutOpacityTransition)\n  /**\n   *  Defines the transition of [lineCutoutOpacity].\n   */\n  @MapboxExperimental\n  public var lineCutoutOpacityTransition: Transition by lineCutoutOpacityTransitionState\n\n  private val lineDasharrayState: MutableState<DoubleListValue> = mutableStateOf(initialLineDasharray)\n  /**\n   *  Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n   */\n  public var lineDasharray: DoubleListValue by lineDasharrayState\n\n  private val lineDepthOcclusionFactorState: MutableState<DoubleValue> = mutableStateOf(initialLineDepthOcclusionFactor)\n  /**\n   *  This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   */\n  public var lineDepthOcclusionFactor: DoubleValue by lineDepthOcclusionFactorState\n\n  private val lineDepthOcclusionFactorTransitionState: MutableState<Transition> = mutableStateOf(initialLineDepthOcclusionFactorTransition)\n  /**\n   *  Defines the transition of [lineDepthOcclusionFactor].\n   */\n  public var lineDepthOcclusionFactorTransition: Transition by lineDepthOcclusionFactorTransitionState\n\n  private val lineEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialLineEmissiveStrength)\n  /**\n   *  Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   */\n  public var lineEmissiveStrength: DoubleValue by lineEmissiveStrengthState\n\n  private val lineEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialLineEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [lineEmissiveStrength].\n   */\n  public var lineEmissiveStrengthTransition: Transition by lineEmissiveStrengthTransitionState\n\n  private val lineGapWidthState: MutableState<DoubleValue> = mutableStateOf(initialLineGapWidth)\n  /**\n   *  Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   */\n  public var lineGapWidth: DoubleValue by lineGapWidthState\n\n  private val lineGapWidthTransitionState: MutableState<Transition> = mutableStateOf(initialLineGapWidthTransition)\n  /**\n   *  Defines the transition of [lineGapWidth].\n   */\n  public var lineGapWidthTransition: Transition by lineGapWidthTransitionState\n\n  private val lineGradientState: MutableState<ColorValue> = mutableStateOf(initialLineGradient)\n  /**\n   *  A gradient used to color a line feature at various distances along its length. Defined using a `step` or `interpolate` expression which outputs a color for each corresponding `line-progress` input value. `line-progress` is a percentage of the line feature's total length as measured on the webmercator projected coordinate plane (a `number` between `0` and `1`). Can only be used with GeoJSON sources that specify `\"lineMetrics\": true`.\n   */\n  public var lineGradient: ColorValue by lineGradientState\n\n  @MapboxExperimental\n  private val lineGradientUseThemeState: MutableState<StringValue> = mutableStateOf(initialLineGradientUseTheme)\n  /**\n   *  Overrides applying of color theme for [lineGradient] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var lineGradientUseTheme: StringValue by lineGradientUseThemeState\n\n  private val lineOcclusionOpacityState: MutableState<DoubleValue> = mutableStateOf(initialLineOcclusionOpacity)\n  /**\n   *  Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   */\n  public var lineOcclusionOpacity: DoubleValue by lineOcclusionOpacityState\n\n  private val lineOcclusionOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialLineOcclusionOpacityTransition)\n  /**\n   *  Defines the transition of [lineOcclusionOpacity].\n   */\n  public var lineOcclusionOpacityTransition: Transition by lineOcclusionOpacityTransitionState\n\n  private val lineOffsetState: MutableState<DoubleValue> = mutableStateOf(initialLineOffset)\n  /**\n   *  The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   */\n  public var lineOffset: DoubleValue by lineOffsetState\n\n  private val lineOffsetTransitionState: MutableState<Transition> = mutableStateOf(initialLineOffsetTransition)\n  /**\n   *  Defines the transition of [lineOffset].\n   */\n  public var lineOffsetTransition: Transition by lineOffsetTransitionState\n\n  private val lineOpacityState: MutableState<DoubleValue> = mutableStateOf(initialLineOpacity)\n  /**\n   *  The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var lineOpacity: DoubleValue by lineOpacityState\n\n  private val lineOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialLineOpacityTransition)\n  /**\n   *  Defines the transition of [lineOpacity].\n   */\n  public var lineOpacityTransition: Transition by lineOpacityTransitionState\n\n  private val linePatternState: MutableState<ImageValue> = mutableStateOf(initialLinePattern)\n  /**\n   *  Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  public var linePattern: ImageValue by linePatternState\n\n  private val linePatternCrossFadeState: MutableState<DoubleValue> = mutableStateOf(initialLinePatternCrossFade)\n  /**\n   *  Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  public var linePatternCrossFade: DoubleValue by linePatternCrossFadeState\n\n  private val lineTranslateState: MutableState<DoubleListValue> = mutableStateOf(initialLineTranslate)\n  /**\n   *  The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   */\n  public var lineTranslate: DoubleListValue by lineTranslateState\n\n  private val lineTranslateTransitionState: MutableState<Transition> = mutableStateOf(initialLineTranslateTransition)\n  /**\n   *  Defines the transition of [lineTranslate].\n   */\n  public var lineTranslateTransition: Transition by lineTranslateTransitionState\n\n  private val lineTranslateAnchorState: MutableState<LineTranslateAnchorValue> = mutableStateOf(initialLineTranslateAnchor)\n  /**\n   *  Controls the frame of reference for `line-translate`. Default value: \"map\".\n   */\n  public var lineTranslateAnchor: LineTranslateAnchorValue by lineTranslateAnchorState\n\n  @MapboxExperimental\n  private val lineTrimColorState: MutableState<ColorValue> = mutableStateOf(initialLineTrimColor)\n  /**\n   *  The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   */\n  @MapboxExperimental\n  public var lineTrimColor: ColorValue by lineTrimColorState\n\n  @MapboxExperimental\n  private val lineTrimColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialLineTrimColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [lineTrimColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var lineTrimColorUseTheme: StringValue by lineTrimColorUseThemeState\n\n  @MapboxExperimental\n  private val lineTrimColorTransitionState: MutableState<Transition> = mutableStateOf(initialLineTrimColorTransition)\n  /**\n   *  Defines the transition of [lineTrimColor].\n   */\n  @MapboxExperimental\n  public var lineTrimColorTransition: Transition by lineTrimColorTransitionState\n\n  @MapboxExperimental\n  private val lineTrimFadeRangeState: MutableState<DoubleRangeValue> = mutableStateOf(initialLineTrimFadeRange)\n  /**\n   *  The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   */\n  @MapboxExperimental\n  public var lineTrimFadeRange: DoubleRangeValue by lineTrimFadeRangeState\n\n  private val lineTrimOffsetState: MutableState<DoubleListValue> = mutableStateOf(initialLineTrimOffset)\n  /**\n   *  The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   */\n  public var lineTrimOffset: DoubleListValue by lineTrimOffsetState\n\n  private val lineWidthState: MutableState<DoubleValue> = mutableStateOf(initialLineWidth)\n  /**\n   *  Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   */\n  public var lineWidth: DoubleValue by lineWidthState\n\n  private val lineWidthTransitionState: MutableState<Transition> = mutableStateOf(initialLineWidthTransition)\n  /**\n   *  Defines the transition of [lineWidth].\n   */\n  public var lineWidthTransition: Transition by lineWidthTransitionState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineCapState, \"line-cap\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineCrossSlopeState, \"line-cross-slope\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineElevationGroundScaleState, \"line-elevation-ground-scale\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineElevationGroundScaleTransitionState, \"line-elevation-ground-scale-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineElevationReferenceState, \"line-elevation-reference\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineJoinState, \"line-join\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineMiterLimitState, \"line-miter-limit\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineRoundLimitState, \"line-round-limit\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineSortKeyState, \"line-sort-key\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineWidthUnitState, \"line-width-unit\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineZOffsetState, \"line-z-offset\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineBlurState, \"line-blur\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineBlurTransitionState, \"line-blur-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineBorderColorState, \"line-border-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineBorderColorUseThemeState, \"line-border-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineBorderColorTransitionState, \"line-border-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineBorderWidthState, \"line-border-width\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineBorderWidthTransitionState, \"line-border-width-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineColorState, \"line-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineColorUseThemeState, \"line-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineColorTransitionState, \"line-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineCutoutFadeWidthState, \"line-cutout-fade-width\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineCutoutFadeWidthTransitionState, \"line-cutout-fade-width-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineCutoutOpacityState, \"line-cutout-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineCutoutOpacityTransitionState, \"line-cutout-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineDasharrayState, \"line-dasharray\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineDepthOcclusionFactorState, \"line-depth-occlusion-factor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineDepthOcclusionFactorTransitionState, \"line-depth-occlusion-factor-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineEmissiveStrengthState, \"line-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineEmissiveStrengthTransitionState, \"line-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineGapWidthState, \"line-gap-width\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineGapWidthTransitionState, \"line-gap-width-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineGradientState, \"line-gradient\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineGradientUseThemeState, \"line-gradient-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineOcclusionOpacityState, \"line-occlusion-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineOcclusionOpacityTransitionState, \"line-occlusion-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineOffsetState, \"line-offset\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineOffsetTransitionState, \"line-offset-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineOpacityState, \"line-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineOpacityTransitionState, \"line-opacity-transition\")\n    AddImageWhenNotInitial(layerNode, linePatternState, \"line-pattern\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, linePatternCrossFadeState, \"line-pattern-cross-fade\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineTranslateState, \"line-translate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineTranslateTransitionState, \"line-translate-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineTranslateAnchorState, \"line-translate-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineTrimColorState, \"line-trim-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineTrimColorUseThemeState, \"line-trim-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineTrimColorTransitionState, \"line-trim-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineTrimFadeRangeState, \"line-trim-fade-range\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineTrimOffsetState, \"line-trim-offset\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineWidthState, \"line-width\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, lineWidthTransitionState, \"line-width-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/LocationIndicatorLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * Location Indicator layer.\n *\n * This composable function inserts a [LocationIndicatorLayer] to the map. For convenience, if there's\n * no need to hoist the [locationIndicatorLayerState], use `LocationIndicatorLayer(layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#location-indicator)\n *\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param locationIndicatorLayerState the state holder for [LocationIndicatorLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun LocationIndicatorLayer(\n  layerId: String = remember {\n    generateRandomLayerId(\"location-indicator\")\n  },\n  locationIndicatorLayerState: LocationIndicatorLayerState = remember { LocationIndicatorLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of LocationIndicatorLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"location-indicator\",\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(locationIndicatorLayerState) {\n      locationIndicatorLayerState.UpdateProperties(layerNode)\n    }\n  }\n}\n\n/**\n * Location Indicator layer.\n *\n * This composable function inserts a [LocationIndicatorLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#location-indicator)\n *\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [LocationIndicatorLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun LocationIndicatorLayer(\n  layerId: String = remember {\n    generateRandomLayerId(\"location-indicator\")\n  },\n  crossinline init: LocationIndicatorLayerState.() -> Unit\n) {\n  LocationIndicatorLayer(layerId = layerId, locationIndicatorLayerState = remember { LocationIndicatorLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/LocationIndicatorLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.AddImageWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleRangeValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.ImageValue\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [LocationIndicatorLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#location-indicator)\n */\n@Stable\npublic class LocationIndicatorLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialAccuracyRadius: DoubleValue,\n  initialAccuracyRadiusTransition: Transition,\n  initialAccuracyRadiusBorderColor: ColorValue,\n  initialAccuracyRadiusBorderColorUseTheme: StringValue,\n  initialAccuracyRadiusBorderColorTransition: Transition,\n  initialAccuracyRadiusColor: ColorValue,\n  initialAccuracyRadiusColorUseTheme: StringValue,\n  initialAccuracyRadiusColorTransition: Transition,\n  initialBearing: DoubleValue,\n  initialBearingTransition: Transition,\n  initialBearingImage: ImageValue,\n  initialBearingImageSize: DoubleValue,\n  initialBearingImageSizeTransition: Transition,\n  initialEmphasisCircleColor: ColorValue,\n  initialEmphasisCircleColorUseTheme: StringValue,\n  initialEmphasisCircleColorTransition: Transition,\n  initialEmphasisCircleGlowRange: DoubleRangeValue,\n  initialEmphasisCircleGlowRangeTransition: Transition,\n  initialEmphasisCircleRadius: DoubleValue,\n  initialEmphasisCircleRadiusTransition: Transition,\n  initialImagePitchDisplacement: DoubleValue,\n  initialLocation: DoubleListValue,\n  initialLocationTransition: Transition,\n  initialLocationIndicatorOpacity: DoubleValue,\n  initialLocationIndicatorOpacityTransition: Transition,\n  initialPerspectiveCompensation: DoubleValue,\n  initialShadowImage: ImageValue,\n  initialShadowImageSize: DoubleValue,\n  initialShadowImageSizeTransition: Transition,\n  initialTopImage: ImageValue,\n  initialTopImageSize: DoubleValue,\n  initialTopImageSizeTransition: Transition,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n) {\n  /**\n   * Construct an default [LocationIndicatorLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialAccuracyRadius = DoubleValue.INITIAL,\n    initialAccuracyRadiusTransition = Transition.INITIAL,\n    initialAccuracyRadiusBorderColor = ColorValue.INITIAL,\n    initialAccuracyRadiusBorderColorUseTheme = StringValue.INITIAL,\n    initialAccuracyRadiusBorderColorTransition = Transition.INITIAL,\n    initialAccuracyRadiusColor = ColorValue.INITIAL,\n    initialAccuracyRadiusColorUseTheme = StringValue.INITIAL,\n    initialAccuracyRadiusColorTransition = Transition.INITIAL,\n    initialBearing = DoubleValue.INITIAL,\n    initialBearingTransition = Transition.INITIAL,\n    initialBearingImage = ImageValue.INITIAL,\n    initialBearingImageSize = DoubleValue.INITIAL,\n    initialBearingImageSizeTransition = Transition.INITIAL,\n    initialEmphasisCircleColor = ColorValue.INITIAL,\n    initialEmphasisCircleColorUseTheme = StringValue.INITIAL,\n    initialEmphasisCircleColorTransition = Transition.INITIAL,\n    initialEmphasisCircleGlowRange = DoubleRangeValue.INITIAL,\n    initialEmphasisCircleGlowRangeTransition = Transition.INITIAL,\n    initialEmphasisCircleRadius = DoubleValue.INITIAL,\n    initialEmphasisCircleRadiusTransition = Transition.INITIAL,\n    initialImagePitchDisplacement = DoubleValue.INITIAL,\n    initialLocation = DoubleListValue.INITIAL,\n    initialLocationTransition = Transition.INITIAL,\n    initialLocationIndicatorOpacity = DoubleValue.INITIAL,\n    initialLocationIndicatorOpacityTransition = Transition.INITIAL,\n    initialPerspectiveCompensation = DoubleValue.INITIAL,\n    initialShadowImage = ImageValue.INITIAL,\n    initialShadowImageSize = DoubleValue.INITIAL,\n    initialShadowImageSizeTransition = Transition.INITIAL,\n    initialTopImage = ImageValue.INITIAL,\n    initialTopImageSize = DoubleValue.INITIAL,\n    initialTopImageSizeTransition = Transition.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n  )\n\n  private val accuracyRadiusState: MutableState<DoubleValue> = mutableStateOf(initialAccuracyRadius)\n  /**\n   *  The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n   */\n  public var accuracyRadius: DoubleValue by accuracyRadiusState\n\n  private val accuracyRadiusTransitionState: MutableState<Transition> = mutableStateOf(initialAccuracyRadiusTransition)\n  /**\n   *  Defines the transition of [accuracyRadius].\n   */\n  public var accuracyRadiusTransition: Transition by accuracyRadiusTransitionState\n\n  private val accuracyRadiusBorderColorState: MutableState<ColorValue> = mutableStateOf(initialAccuracyRadiusBorderColor)\n  /**\n   *  The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   */\n  public var accuracyRadiusBorderColor: ColorValue by accuracyRadiusBorderColorState\n\n  @MapboxExperimental\n  private val accuracyRadiusBorderColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialAccuracyRadiusBorderColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [accuracyRadiusBorderColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var accuracyRadiusBorderColorUseTheme: StringValue by accuracyRadiusBorderColorUseThemeState\n\n  private val accuracyRadiusBorderColorTransitionState: MutableState<Transition> = mutableStateOf(initialAccuracyRadiusBorderColorTransition)\n  /**\n   *  Defines the transition of [accuracyRadiusBorderColor].\n   */\n  public var accuracyRadiusBorderColorTransition: Transition by accuracyRadiusBorderColorTransitionState\n\n  private val accuracyRadiusColorState: MutableState<ColorValue> = mutableStateOf(initialAccuracyRadiusColor)\n  /**\n   *  The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   */\n  public var accuracyRadiusColor: ColorValue by accuracyRadiusColorState\n\n  @MapboxExperimental\n  private val accuracyRadiusColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialAccuracyRadiusColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [accuracyRadiusColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var accuracyRadiusColorUseTheme: StringValue by accuracyRadiusColorUseThemeState\n\n  private val accuracyRadiusColorTransitionState: MutableState<Transition> = mutableStateOf(initialAccuracyRadiusColorTransition)\n  /**\n   *  Defines the transition of [accuracyRadiusColor].\n   */\n  public var accuracyRadiusColorTransition: Transition by accuracyRadiusColorTransitionState\n\n  private val bearingState: MutableState<DoubleValue> = mutableStateOf(initialBearing)\n  /**\n   *  The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n   */\n  public var bearing: DoubleValue by bearingState\n\n  private val bearingTransitionState: MutableState<Transition> = mutableStateOf(initialBearingTransition)\n  /**\n   *  Defines the transition of [bearing].\n   */\n  public var bearingTransition: Transition by bearingTransitionState\n\n  private val bearingImageState: MutableState<ImageValue> = mutableStateOf(initialBearingImage)\n  /**\n   *  Name of image in sprite to use as the middle of the location indicator.\n   */\n  public var bearingImage: ImageValue by bearingImageState\n\n  private val bearingImageSizeState: MutableState<DoubleValue> = mutableStateOf(initialBearingImageSize)\n  /**\n   *  The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n   */\n  public var bearingImageSize: DoubleValue by bearingImageSizeState\n\n  private val bearingImageSizeTransitionState: MutableState<Transition> = mutableStateOf(initialBearingImageSizeTransition)\n  /**\n   *  Defines the transition of [bearingImageSize].\n   */\n  public var bearingImageSizeTransition: Transition by bearingImageSizeTransitionState\n\n  private val emphasisCircleColorState: MutableState<ColorValue> = mutableStateOf(initialEmphasisCircleColor)\n  /**\n   *  The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   */\n  public var emphasisCircleColor: ColorValue by emphasisCircleColorState\n\n  @MapboxExperimental\n  private val emphasisCircleColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialEmphasisCircleColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [emphasisCircleColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var emphasisCircleColorUseTheme: StringValue by emphasisCircleColorUseThemeState\n\n  private val emphasisCircleColorTransitionState: MutableState<Transition> = mutableStateOf(initialEmphasisCircleColorTransition)\n  /**\n   *  Defines the transition of [emphasisCircleColor].\n   */\n  public var emphasisCircleColorTransition: Transition by emphasisCircleColorTransitionState\n\n  private val emphasisCircleGlowRangeState: MutableState<DoubleRangeValue> = mutableStateOf(initialEmphasisCircleGlowRange)\n  /**\n   *  Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n   */\n  public var emphasisCircleGlowRange: DoubleRangeValue by emphasisCircleGlowRangeState\n\n  private val emphasisCircleGlowRangeTransitionState: MutableState<Transition> = mutableStateOf(initialEmphasisCircleGlowRangeTransition)\n  /**\n   *  Defines the transition of [emphasisCircleGlowRange].\n   */\n  public var emphasisCircleGlowRangeTransition: Transition by emphasisCircleGlowRangeTransitionState\n\n  private val emphasisCircleRadiusState: MutableState<DoubleValue> = mutableStateOf(initialEmphasisCircleRadius)\n  /**\n   *  The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n   */\n  public var emphasisCircleRadius: DoubleValue by emphasisCircleRadiusState\n\n  private val emphasisCircleRadiusTransitionState: MutableState<Transition> = mutableStateOf(initialEmphasisCircleRadiusTransition)\n  /**\n   *  Defines the transition of [emphasisCircleRadius].\n   */\n  public var emphasisCircleRadiusTransition: Transition by emphasisCircleRadiusTransitionState\n\n  private val imagePitchDisplacementState: MutableState<DoubleValue> = mutableStateOf(initialImagePitchDisplacement)\n  /**\n   *  The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n   */\n  public var imagePitchDisplacement: DoubleValue by imagePitchDisplacementState\n\n  private val locationState: MutableState<DoubleListValue> = mutableStateOf(initialLocation)\n  /**\n   *  An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n   */\n  public var location: DoubleListValue by locationState\n\n  private val locationTransitionState: MutableState<Transition> = mutableStateOf(initialLocationTransition)\n  /**\n   *  Defines the transition of [location].\n   */\n  public var locationTransition: Transition by locationTransitionState\n\n  private val locationIndicatorOpacityState: MutableState<DoubleValue> = mutableStateOf(initialLocationIndicatorOpacity)\n  /**\n   *  The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n   */\n  public var locationIndicatorOpacity: DoubleValue by locationIndicatorOpacityState\n\n  private val locationIndicatorOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialLocationIndicatorOpacityTransition)\n  /**\n   *  Defines the transition of [locationIndicatorOpacity].\n   */\n  public var locationIndicatorOpacityTransition: Transition by locationIndicatorOpacityTransitionState\n\n  private val perspectiveCompensationState: MutableState<DoubleValue> = mutableStateOf(initialPerspectiveCompensation)\n  /**\n   *  The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n   */\n  public var perspectiveCompensation: DoubleValue by perspectiveCompensationState\n\n  private val shadowImageState: MutableState<ImageValue> = mutableStateOf(initialShadowImage)\n  /**\n   *  Name of image in sprite to use as the background of the location indicator.\n   */\n  public var shadowImage: ImageValue by shadowImageState\n\n  private val shadowImageSizeState: MutableState<DoubleValue> = mutableStateOf(initialShadowImageSize)\n  /**\n   *  The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n   */\n  public var shadowImageSize: DoubleValue by shadowImageSizeState\n\n  private val shadowImageSizeTransitionState: MutableState<Transition> = mutableStateOf(initialShadowImageSizeTransition)\n  /**\n   *  Defines the transition of [shadowImageSize].\n   */\n  public var shadowImageSizeTransition: Transition by shadowImageSizeTransitionState\n\n  private val topImageState: MutableState<ImageValue> = mutableStateOf(initialTopImage)\n  /**\n   *  Name of image in sprite to use as the top of the location indicator.\n   */\n  public var topImage: ImageValue by topImageState\n\n  private val topImageSizeState: MutableState<DoubleValue> = mutableStateOf(initialTopImageSize)\n  /**\n   *  The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n   */\n  public var topImageSize: DoubleValue by topImageSizeState\n\n  private val topImageSizeTransitionState: MutableState<Transition> = mutableStateOf(initialTopImageSizeTransition)\n  /**\n   *  Defines the transition of [topImageSize].\n   */\n  public var topImageSizeTransition: Transition by topImageSizeTransitionState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, accuracyRadiusState, \"accuracy-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, accuracyRadiusTransitionState, \"accuracy-radius-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, accuracyRadiusBorderColorState, \"accuracy-radius-border-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, accuracyRadiusBorderColorUseThemeState, \"accuracy-radius-border-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, accuracyRadiusBorderColorTransitionState, \"accuracy-radius-border-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, accuracyRadiusColorState, \"accuracy-radius-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, accuracyRadiusColorUseThemeState, \"accuracy-radius-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, accuracyRadiusColorTransitionState, \"accuracy-radius-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, bearingState, \"bearing\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, bearingTransitionState, \"bearing-transition\")\n    AddImageWhenNotInitial(layerNode, bearingImageState, \"bearing-image\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, bearingImageSizeState, \"bearing-image-size\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, bearingImageSizeTransitionState, \"bearing-image-size-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, emphasisCircleColorState, \"emphasis-circle-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, emphasisCircleColorUseThemeState, \"emphasis-circle-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, emphasisCircleColorTransitionState, \"emphasis-circle-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, emphasisCircleGlowRangeState, \"emphasis-circle-glow-range\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, emphasisCircleGlowRangeTransitionState, \"emphasis-circle-glow-range-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, emphasisCircleRadiusState, \"emphasis-circle-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, emphasisCircleRadiusTransitionState, \"emphasis-circle-radius-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, imagePitchDisplacementState, \"image-pitch-displacement\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, locationState, \"location\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, locationTransitionState, \"location-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, locationIndicatorOpacityState, \"location-indicator-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, locationIndicatorOpacityTransitionState, \"location-indicator-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, perspectiveCompensationState, \"perspective-compensation\")\n    AddImageWhenNotInitial(layerNode, shadowImageState, \"shadow-image\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, shadowImageSizeState, \"shadow-image-size\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, shadowImageSizeTransitionState, \"shadow-image-size-transition\")\n    AddImageWhenNotInitial(layerNode, topImageState, \"top-image\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, topImageSizeState, \"top-image-size\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, topImageSizeTransitionState, \"top-image-size-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/ModelLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * A 3D model\n *\n * This composable function inserts a [ModelLayer] to the map. For convenience, if there's\n * no need to hoist the [modelLayerState], use `ModelLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#model)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param modelLayerState the state holder for [ModelLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun ModelLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"model\")\n  },\n  modelLayerState: ModelLayerState = remember { ModelLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of ModelLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"model\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(modelLayerState) {\n      modelLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(modelLayerState.interactionsState) {\n    modelLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * A 3D model\n *\n * This composable function inserts a [ModelLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#model)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [ModelLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun ModelLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"model\")\n  },\n  crossinline init: ModelLayerState.() -> Unit\n) {\n  ModelLayer(sourceState = sourceState, layerId = layerId, modelLayerState = remember { ModelLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/ModelLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.ModelIdValue\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [ModelLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#model)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class ModelLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialModelAllowDensityReduction: BooleanValue,\n  initialModelId: ModelIdValue,\n  initialModelAmbientOcclusionIntensity: DoubleValue,\n  initialModelAmbientOcclusionIntensityTransition: Transition,\n  initialModelCastShadows: BooleanValue,\n  initialModelColor: ColorValue,\n  initialModelColorUseTheme: StringValue,\n  initialModelColorTransition: Transition,\n  initialModelColorMixIntensity: DoubleValue,\n  initialModelColorMixIntensityTransition: Transition,\n  initialModelCutoffFadeRange: DoubleValue,\n  initialModelElevationReference: ModelElevationReferenceValue,\n  initialModelEmissiveStrength: DoubleValue,\n  initialModelEmissiveStrengthTransition: Transition,\n  initialModelHeightBasedEmissiveStrengthMultiplier: DoubleListValue,\n  initialModelHeightBasedEmissiveStrengthMultiplierTransition: Transition,\n  initialModelOpacity: DoubleValue,\n  initialModelOpacityTransition: Transition,\n  initialModelReceiveShadows: BooleanValue,\n  initialModelRotation: DoubleListValue,\n  initialModelRotationTransition: Transition,\n  initialModelRoughness: DoubleValue,\n  initialModelRoughnessTransition: Transition,\n  initialModelScale: DoubleListValue,\n  initialModelScaleTransition: Transition,\n  initialModelScaleMode: ModelScaleModeValue,\n  initialModelTranslation: DoubleListValue,\n  initialModelTranslationTransition: Transition,\n  initialModelType: ModelTypeValue,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [ModelLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialModelAllowDensityReduction = BooleanValue.INITIAL,\n    initialModelId = ModelIdValue.INITIAL,\n    initialModelAmbientOcclusionIntensity = DoubleValue.INITIAL,\n    initialModelAmbientOcclusionIntensityTransition = Transition.INITIAL,\n    initialModelCastShadows = BooleanValue.INITIAL,\n    initialModelColor = ColorValue.INITIAL,\n    initialModelColorUseTheme = StringValue.INITIAL,\n    initialModelColorTransition = Transition.INITIAL,\n    initialModelColorMixIntensity = DoubleValue.INITIAL,\n    initialModelColorMixIntensityTransition = Transition.INITIAL,\n    initialModelCutoffFadeRange = DoubleValue.INITIAL,\n    initialModelElevationReference = ModelElevationReferenceValue.INITIAL,\n    initialModelEmissiveStrength = DoubleValue.INITIAL,\n    initialModelEmissiveStrengthTransition = Transition.INITIAL,\n    initialModelHeightBasedEmissiveStrengthMultiplier = DoubleListValue.INITIAL,\n    initialModelHeightBasedEmissiveStrengthMultiplierTransition = Transition.INITIAL,\n    initialModelOpacity = DoubleValue.INITIAL,\n    initialModelOpacityTransition = Transition.INITIAL,\n    initialModelReceiveShadows = BooleanValue.INITIAL,\n    initialModelRotation = DoubleListValue.INITIAL,\n    initialModelRotationTransition = Transition.INITIAL,\n    initialModelRoughness = DoubleValue.INITIAL,\n    initialModelRoughnessTransition = Transition.INITIAL,\n    initialModelScale = DoubleListValue.INITIAL,\n    initialModelScaleTransition = Transition.INITIAL,\n    initialModelScaleMode = ModelScaleModeValue.INITIAL,\n    initialModelTranslation = DoubleListValue.INITIAL,\n    initialModelTranslationTransition = Transition.INITIAL,\n    initialModelType = ModelTypeValue.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  @MapboxExperimental\n  private val modelAllowDensityReductionState: MutableState<BooleanValue> = mutableStateOf(initialModelAllowDensityReduction)\n  /**\n   *  If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n   */\n  @MapboxExperimental\n  public var modelAllowDensityReduction: BooleanValue by modelAllowDensityReductionState\n\n  private val modelIdState: MutableState<ModelIdValue> = mutableStateOf(initialModelId)\n  /**\n   *  Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n   */\n  public var modelId: ModelIdValue by modelIdState\n\n  private val modelAmbientOcclusionIntensityState: MutableState<DoubleValue> = mutableStateOf(initialModelAmbientOcclusionIntensity)\n  /**\n   *  Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n   */\n  public var modelAmbientOcclusionIntensity: DoubleValue by modelAmbientOcclusionIntensityState\n\n  private val modelAmbientOcclusionIntensityTransitionState: MutableState<Transition> = mutableStateOf(initialModelAmbientOcclusionIntensityTransition)\n  /**\n   *  Defines the transition of [modelAmbientOcclusionIntensity].\n   */\n  public var modelAmbientOcclusionIntensityTransition: Transition by modelAmbientOcclusionIntensityTransitionState\n\n  private val modelCastShadowsState: MutableState<BooleanValue> = mutableStateOf(initialModelCastShadows)\n  /**\n   *  Enable/Disable shadow casting for this layer Default value: true.\n   */\n  public var modelCastShadows: BooleanValue by modelCastShadowsState\n\n  private val modelColorState: MutableState<ColorValue> = mutableStateOf(initialModelColor)\n  /**\n   *  The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   */\n  public var modelColor: ColorValue by modelColorState\n\n  @MapboxExperimental\n  private val modelColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialModelColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [modelColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var modelColorUseTheme: StringValue by modelColorUseThemeState\n\n  private val modelColorTransitionState: MutableState<Transition> = mutableStateOf(initialModelColorTransition)\n  /**\n   *  Defines the transition of [modelColor].\n   */\n  public var modelColorTransition: Transition by modelColorTransitionState\n\n  private val modelColorMixIntensityState: MutableState<DoubleValue> = mutableStateOf(initialModelColorMixIntensity)\n  /**\n   *  Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   */\n  public var modelColorMixIntensity: DoubleValue by modelColorMixIntensityState\n\n  private val modelColorMixIntensityTransitionState: MutableState<Transition> = mutableStateOf(initialModelColorMixIntensityTransition)\n  /**\n   *  Defines the transition of [modelColorMixIntensity].\n   */\n  public var modelColorMixIntensityTransition: Transition by modelColorMixIntensityTransitionState\n\n  private val modelCutoffFadeRangeState: MutableState<DoubleValue> = mutableStateOf(initialModelCutoffFadeRange)\n  /**\n   *  This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   */\n  public var modelCutoffFadeRange: DoubleValue by modelCutoffFadeRangeState\n\n  private val modelElevationReferenceState: MutableState<ModelElevationReferenceValue> = mutableStateOf(initialModelElevationReference)\n  /**\n   *  Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n   */\n  public var modelElevationReference: ModelElevationReferenceValue by modelElevationReferenceState\n\n  private val modelEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialModelEmissiveStrength)\n  /**\n   *  Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n   */\n  public var modelEmissiveStrength: DoubleValue by modelEmissiveStrengthState\n\n  private val modelEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialModelEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [modelEmissiveStrength].\n   */\n  public var modelEmissiveStrengthTransition: Transition by modelEmissiveStrengthTransitionState\n\n  private val modelHeightBasedEmissiveStrengthMultiplierState: MutableState<DoubleListValue> = mutableStateOf(initialModelHeightBasedEmissiveStrengthMultiplier)\n  /**\n   *  Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n   */\n  public var modelHeightBasedEmissiveStrengthMultiplier: DoubleListValue by modelHeightBasedEmissiveStrengthMultiplierState\n\n  private val modelHeightBasedEmissiveStrengthMultiplierTransitionState: MutableState<Transition> = mutableStateOf(initialModelHeightBasedEmissiveStrengthMultiplierTransition)\n  /**\n   *  Defines the transition of [modelHeightBasedEmissiveStrengthMultiplier].\n   */\n  public var modelHeightBasedEmissiveStrengthMultiplierTransition: Transition by modelHeightBasedEmissiveStrengthMultiplierTransitionState\n\n  private val modelOpacityState: MutableState<DoubleValue> = mutableStateOf(initialModelOpacity)\n  /**\n   *  The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n   */\n  public var modelOpacity: DoubleValue by modelOpacityState\n\n  private val modelOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialModelOpacityTransition)\n  /**\n   *  Defines the transition of [modelOpacity].\n   */\n  public var modelOpacityTransition: Transition by modelOpacityTransitionState\n\n  private val modelReceiveShadowsState: MutableState<BooleanValue> = mutableStateOf(initialModelReceiveShadows)\n  /**\n   *  Enable/Disable shadow receiving for this layer Default value: true.\n   */\n  public var modelReceiveShadows: BooleanValue by modelReceiveShadowsState\n\n  private val modelRotationState: MutableState<DoubleListValue> = mutableStateOf(initialModelRotation)\n  /**\n   *  The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n   */\n  public var modelRotation: DoubleListValue by modelRotationState\n\n  private val modelRotationTransitionState: MutableState<Transition> = mutableStateOf(initialModelRotationTransition)\n  /**\n   *  Defines the transition of [modelRotation].\n   */\n  public var modelRotationTransition: Transition by modelRotationTransitionState\n\n  private val modelRoughnessState: MutableState<DoubleValue> = mutableStateOf(initialModelRoughness)\n  /**\n   *  Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n   */\n  public var modelRoughness: DoubleValue by modelRoughnessState\n\n  private val modelRoughnessTransitionState: MutableState<Transition> = mutableStateOf(initialModelRoughnessTransition)\n  /**\n   *  Defines the transition of [modelRoughness].\n   */\n  public var modelRoughnessTransition: Transition by modelRoughnessTransitionState\n\n  private val modelScaleState: MutableState<DoubleListValue> = mutableStateOf(initialModelScale)\n  /**\n   *  The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n   */\n  public var modelScale: DoubleListValue by modelScaleState\n\n  private val modelScaleTransitionState: MutableState<Transition> = mutableStateOf(initialModelScaleTransition)\n  /**\n   *  Defines the transition of [modelScale].\n   */\n  public var modelScaleTransition: Transition by modelScaleTransitionState\n\n  private val modelScaleModeState: MutableState<ModelScaleModeValue> = mutableStateOf(initialModelScaleMode)\n  /**\n   *  Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n   */\n  public var modelScaleMode: ModelScaleModeValue by modelScaleModeState\n\n  private val modelTranslationState: MutableState<DoubleListValue> = mutableStateOf(initialModelTranslation)\n  /**\n   *  The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n   */\n  public var modelTranslation: DoubleListValue by modelTranslationState\n\n  private val modelTranslationTransitionState: MutableState<Transition> = mutableStateOf(initialModelTranslationTransition)\n  /**\n   *  Defines the transition of [modelTranslation].\n   */\n  public var modelTranslationTransition: Transition by modelTranslationTransitionState\n\n  private val modelTypeState: MutableState<ModelTypeValue> = mutableStateOf(initialModelType)\n  /**\n   *  Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n   */\n  public var modelType: ModelTypeValue by modelTypeState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  private fun UpdateModelId(layerNode: LayerNode) {\n    if (modelId.notInitial) {\n      modelId.modelInfo?.let {\n        layerNode.addModel(it)\n      }\n      layerNode.setProperty(\"model-id\", modelId.value)\n    }\n  }\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelAllowDensityReductionState, \"model-allow-density-reduction\")\n    UpdateModelId(layerNode)\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelAmbientOcclusionIntensityState, \"model-ambient-occlusion-intensity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelAmbientOcclusionIntensityTransitionState, \"model-ambient-occlusion-intensity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelCastShadowsState, \"model-cast-shadows\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelColorState, \"model-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelColorUseThemeState, \"model-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelColorTransitionState, \"model-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelColorMixIntensityState, \"model-color-mix-intensity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelColorMixIntensityTransitionState, \"model-color-mix-intensity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelCutoffFadeRangeState, \"model-cutoff-fade-range\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelElevationReferenceState, \"model-elevation-reference\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelEmissiveStrengthState, \"model-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelEmissiveStrengthTransitionState, \"model-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelHeightBasedEmissiveStrengthMultiplierState, \"model-height-based-emissive-strength-multiplier\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelHeightBasedEmissiveStrengthMultiplierTransitionState, \"model-height-based-emissive-strength-multiplier-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelOpacityState, \"model-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelOpacityTransitionState, \"model-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelReceiveShadowsState, \"model-receive-shadows\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelRotationState, \"model-rotation\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelRotationTransitionState, \"model-rotation-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelRoughnessState, \"model-roughness\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelRoughnessTransitionState, \"model-roughness-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelScaleState, \"model-scale\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelScaleTransitionState, \"model-scale-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelScaleModeState, \"model-scale-mode\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelTranslationState, \"model-translation\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelTranslationTransitionState, \"model-translation-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, modelTypeState, \"model-type\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/RasterLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * Raster map textures such as satellite imagery.\n *\n * This composable function inserts a [RasterLayer] to the map. For convenience, if there's\n * no need to hoist the [rasterLayerState], use `RasterLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#raster)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param rasterLayerState the state holder for [RasterLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun RasterLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"raster\")\n  },\n  rasterLayerState: RasterLayerState = remember { RasterLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of RasterLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"raster\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(rasterLayerState) {\n      rasterLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(rasterLayerState.interactionsState) {\n    rasterLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * Raster map textures such as satellite imagery.\n *\n * This composable function inserts a [RasterLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#raster)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [RasterLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun RasterLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"raster\")\n  },\n  crossinline init: RasterLayerState.() -> Unit\n) {\n  RasterLayer(sourceState = sourceState, layerId = layerId, rasterLayerState = remember { RasterLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/RasterLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleRangeValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [RasterLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#raster)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class RasterLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialRasterArrayBand: StringValue,\n  initialRasterBrightnessMax: DoubleValue,\n  initialRasterBrightnessMaxTransition: Transition,\n  initialRasterBrightnessMin: DoubleValue,\n  initialRasterBrightnessMinTransition: Transition,\n  initialRasterColor: ColorValue,\n  initialRasterColorUseTheme: StringValue,\n  initialRasterColorMix: DoubleListValue,\n  initialRasterColorMixTransition: Transition,\n  initialRasterColorRange: DoubleRangeValue,\n  initialRasterColorRangeTransition: Transition,\n  initialRasterContrast: DoubleValue,\n  initialRasterContrastTransition: Transition,\n  initialRasterElevation: DoubleValue,\n  initialRasterElevationTransition: Transition,\n  initialRasterEmissiveStrength: DoubleValue,\n  initialRasterEmissiveStrengthTransition: Transition,\n  initialRasterFadeDuration: DoubleValue,\n  initialRasterHueRotate: DoubleValue,\n  initialRasterHueRotateTransition: Transition,\n  initialRasterOpacity: DoubleValue,\n  initialRasterOpacityTransition: Transition,\n  initialRasterResampling: RasterResamplingValue,\n  initialRasterSaturation: DoubleValue,\n  initialRasterSaturationTransition: Transition,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [RasterLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialRasterArrayBand = StringValue.INITIAL,\n    initialRasterBrightnessMax = DoubleValue.INITIAL,\n    initialRasterBrightnessMaxTransition = Transition.INITIAL,\n    initialRasterBrightnessMin = DoubleValue.INITIAL,\n    initialRasterBrightnessMinTransition = Transition.INITIAL,\n    initialRasterColor = ColorValue.INITIAL,\n    initialRasterColorUseTheme = StringValue.INITIAL,\n    initialRasterColorMix = DoubleListValue.INITIAL,\n    initialRasterColorMixTransition = Transition.INITIAL,\n    initialRasterColorRange = DoubleRangeValue.INITIAL,\n    initialRasterColorRangeTransition = Transition.INITIAL,\n    initialRasterContrast = DoubleValue.INITIAL,\n    initialRasterContrastTransition = Transition.INITIAL,\n    initialRasterElevation = DoubleValue.INITIAL,\n    initialRasterElevationTransition = Transition.INITIAL,\n    initialRasterEmissiveStrength = DoubleValue.INITIAL,\n    initialRasterEmissiveStrengthTransition = Transition.INITIAL,\n    initialRasterFadeDuration = DoubleValue.INITIAL,\n    initialRasterHueRotate = DoubleValue.INITIAL,\n    initialRasterHueRotateTransition = Transition.INITIAL,\n    initialRasterOpacity = DoubleValue.INITIAL,\n    initialRasterOpacityTransition = Transition.INITIAL,\n    initialRasterResampling = RasterResamplingValue.INITIAL,\n    initialRasterSaturation = DoubleValue.INITIAL,\n    initialRasterSaturationTransition = Transition.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  @MapboxExperimental\n  private val rasterArrayBandState: MutableState<StringValue> = mutableStateOf(initialRasterArrayBand)\n  /**\n   *  Displayed band of raster array source layer. Defaults to the first band if not set.\n   */\n  @MapboxExperimental\n  public var rasterArrayBand: StringValue by rasterArrayBandState\n\n  private val rasterBrightnessMaxState: MutableState<DoubleValue> = mutableStateOf(initialRasterBrightnessMax)\n  /**\n   *  Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   */\n  public var rasterBrightnessMax: DoubleValue by rasterBrightnessMaxState\n\n  private val rasterBrightnessMaxTransitionState: MutableState<Transition> = mutableStateOf(initialRasterBrightnessMaxTransition)\n  /**\n   *  Defines the transition of [rasterBrightnessMax].\n   */\n  public var rasterBrightnessMaxTransition: Transition by rasterBrightnessMaxTransitionState\n\n  private val rasterBrightnessMinState: MutableState<DoubleValue> = mutableStateOf(initialRasterBrightnessMin)\n  /**\n   *  Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   */\n  public var rasterBrightnessMin: DoubleValue by rasterBrightnessMinState\n\n  private val rasterBrightnessMinTransitionState: MutableState<Transition> = mutableStateOf(initialRasterBrightnessMinTransition)\n  /**\n   *  Defines the transition of [rasterBrightnessMin].\n   */\n  public var rasterBrightnessMinTransition: Transition by rasterBrightnessMinTransitionState\n\n  private val rasterColorState: MutableState<ColorValue> = mutableStateOf(initialRasterColor)\n  /**\n   *  Defines a color map by which to colorize a raster layer, parameterized by the `[\"raster-value\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-color-range`.\n   */\n  public var rasterColor: ColorValue by rasterColorState\n\n  @MapboxExperimental\n  private val rasterColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialRasterColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [rasterColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var rasterColorUseTheme: StringValue by rasterColorUseThemeState\n\n  private val rasterColorMixState: MutableState<DoubleListValue> = mutableStateOf(initialRasterColorMix)\n  /**\n   *  When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n   */\n  public var rasterColorMix: DoubleListValue by rasterColorMixState\n\n  private val rasterColorMixTransitionState: MutableState<Transition> = mutableStateOf(initialRasterColorMixTransition)\n  /**\n   *  Defines the transition of [rasterColorMix].\n   */\n  public var rasterColorMixTransition: Transition by rasterColorMixTransitionState\n\n  private val rasterColorRangeState: MutableState<DoubleRangeValue> = mutableStateOf(initialRasterColorRange)\n  /**\n   *  When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n   */\n  public var rasterColorRange: DoubleRangeValue by rasterColorRangeState\n\n  private val rasterColorRangeTransitionState: MutableState<Transition> = mutableStateOf(initialRasterColorRangeTransition)\n  /**\n   *  Defines the transition of [rasterColorRange].\n   */\n  public var rasterColorRangeTransition: Transition by rasterColorRangeTransitionState\n\n  private val rasterContrastState: MutableState<DoubleValue> = mutableStateOf(initialRasterContrast)\n  /**\n   *  Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n   */\n  public var rasterContrast: DoubleValue by rasterContrastState\n\n  private val rasterContrastTransitionState: MutableState<Transition> = mutableStateOf(initialRasterContrastTransition)\n  /**\n   *  Defines the transition of [rasterContrast].\n   */\n  public var rasterContrastTransition: Transition by rasterContrastTransitionState\n\n  @MapboxExperimental\n  private val rasterElevationState: MutableState<DoubleValue> = mutableStateOf(initialRasterElevation)\n  /**\n   *  Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var rasterElevation: DoubleValue by rasterElevationState\n\n  @MapboxExperimental\n  private val rasterElevationTransitionState: MutableState<Transition> = mutableStateOf(initialRasterElevationTransition)\n  /**\n   *  Defines the transition of [rasterElevation].\n   */\n  @MapboxExperimental\n  public var rasterElevationTransition: Transition by rasterElevationTransitionState\n\n  private val rasterEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialRasterEmissiveStrength)\n  /**\n   *  Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n   */\n  public var rasterEmissiveStrength: DoubleValue by rasterEmissiveStrengthState\n\n  private val rasterEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialRasterEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [rasterEmissiveStrength].\n   */\n  public var rasterEmissiveStrengthTransition: Transition by rasterEmissiveStrengthTransitionState\n\n  private val rasterFadeDurationState: MutableState<DoubleValue> = mutableStateOf(initialRasterFadeDuration)\n  /**\n   *  Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n   */\n  public var rasterFadeDuration: DoubleValue by rasterFadeDurationState\n\n  private val rasterHueRotateState: MutableState<DoubleValue> = mutableStateOf(initialRasterHueRotate)\n  /**\n   *  Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n   */\n  public var rasterHueRotate: DoubleValue by rasterHueRotateState\n\n  private val rasterHueRotateTransitionState: MutableState<Transition> = mutableStateOf(initialRasterHueRotateTransition)\n  /**\n   *  Defines the transition of [rasterHueRotate].\n   */\n  public var rasterHueRotateTransition: Transition by rasterHueRotateTransitionState\n\n  private val rasterOpacityState: MutableState<DoubleValue> = mutableStateOf(initialRasterOpacity)\n  /**\n   *  The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var rasterOpacity: DoubleValue by rasterOpacityState\n\n  private val rasterOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialRasterOpacityTransition)\n  /**\n   *  Defines the transition of [rasterOpacity].\n   */\n  public var rasterOpacityTransition: Transition by rasterOpacityTransitionState\n\n  private val rasterResamplingState: MutableState<RasterResamplingValue> = mutableStateOf(initialRasterResampling)\n  /**\n   *  The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n   */\n  public var rasterResampling: RasterResamplingValue by rasterResamplingState\n\n  private val rasterSaturationState: MutableState<DoubleValue> = mutableStateOf(initialRasterSaturation)\n  /**\n   *  Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n   */\n  public var rasterSaturation: DoubleValue by rasterSaturationState\n\n  private val rasterSaturationTransitionState: MutableState<Transition> = mutableStateOf(initialRasterSaturationTransition)\n  /**\n   *  Defines the transition of [rasterSaturation].\n   */\n  public var rasterSaturationTransition: Transition by rasterSaturationTransitionState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterArrayBandState, \"raster-array-band\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterBrightnessMaxState, \"raster-brightness-max\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterBrightnessMaxTransitionState, \"raster-brightness-max-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterBrightnessMinState, \"raster-brightness-min\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterBrightnessMinTransitionState, \"raster-brightness-min-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterColorState, \"raster-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterColorUseThemeState, \"raster-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterColorMixState, \"raster-color-mix\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterColorMixTransitionState, \"raster-color-mix-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterColorRangeState, \"raster-color-range\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterColorRangeTransitionState, \"raster-color-range-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterContrastState, \"raster-contrast\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterContrastTransitionState, \"raster-contrast-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterElevationState, \"raster-elevation\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterElevationTransitionState, \"raster-elevation-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterEmissiveStrengthState, \"raster-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterEmissiveStrengthTransitionState, \"raster-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterFadeDurationState, \"raster-fade-duration\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterHueRotateState, \"raster-hue-rotate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterHueRotateTransitionState, \"raster-hue-rotate-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterOpacityState, \"raster-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterOpacityTransitionState, \"raster-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterResamplingState, \"raster-resampling\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterSaturationState, \"raster-saturation\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterSaturationTransitionState, \"raster-saturation-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/RasterParticleLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * Particle animation driven by textures such as wind maps.\n *\n * This composable function inserts a [RasterParticleLayer] to the map. For convenience, if there's\n * no need to hoist the [rasterParticleLayerState], use `RasterParticleLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#raster-particle)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param rasterParticleLayerState the state holder for [RasterParticleLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@MapboxExperimental\npublic fun RasterParticleLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"raster-particle\")\n  },\n  rasterParticleLayerState: RasterParticleLayerState = remember { RasterParticleLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of RasterParticleLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"raster-particle\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(rasterParticleLayerState) {\n      rasterParticleLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(rasterParticleLayerState.interactionsState) {\n    rasterParticleLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * Particle animation driven by textures such as wind maps.\n *\n * This composable function inserts a [RasterParticleLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#raster-particle)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [RasterParticleLayerState].\n */\n@Composable\n@MapboxMapComposable\n@MapboxExperimental\npublic inline fun RasterParticleLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"raster-particle\")\n  },\n  crossinline init: RasterParticleLayerState.() -> Unit\n) {\n  RasterParticleLayer(sourceState = sourceState, layerId = layerId, rasterParticleLayerState = remember { RasterParticleLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/RasterParticleLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [RasterParticleLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#raster-particle)\n */\n@Stable\n@MapboxExperimental\npublic class RasterParticleLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialRasterParticleArrayBand: StringValue,\n  initialRasterParticleColor: ColorValue,\n  initialRasterParticleColorUseTheme: StringValue,\n  initialRasterParticleCount: LongValue,\n  initialRasterParticleFadeOpacityFactor: DoubleValue,\n  initialRasterParticleFadeOpacityFactorTransition: Transition,\n  initialRasterParticleMaxSpeed: DoubleValue,\n  initialRasterParticleResetRateFactor: DoubleValue,\n  initialRasterParticleSpeedFactor: DoubleValue,\n  initialRasterParticleSpeedFactorTransition: Transition,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [RasterParticleLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialRasterParticleArrayBand = StringValue.INITIAL,\n    initialRasterParticleColor = ColorValue.INITIAL,\n    initialRasterParticleColorUseTheme = StringValue.INITIAL,\n    initialRasterParticleCount = LongValue.INITIAL,\n    initialRasterParticleFadeOpacityFactor = DoubleValue.INITIAL,\n    initialRasterParticleFadeOpacityFactorTransition = Transition.INITIAL,\n    initialRasterParticleMaxSpeed = DoubleValue.INITIAL,\n    initialRasterParticleResetRateFactor = DoubleValue.INITIAL,\n    initialRasterParticleSpeedFactor = DoubleValue.INITIAL,\n    initialRasterParticleSpeedFactorTransition = Transition.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  @MapboxExperimental\n  private val rasterParticleArrayBandState: MutableState<StringValue> = mutableStateOf(initialRasterParticleArrayBand)\n  /**\n   *  Displayed band of raster array source layer\n   */\n  @MapboxExperimental\n  public var rasterParticleArrayBand: StringValue by rasterParticleArrayBandState\n\n  @MapboxExperimental\n  private val rasterParticleColorState: MutableState<ColorValue> = mutableStateOf(initialRasterParticleColor)\n  /**\n   *  Defines a color map by which to colorize a raster particle layer, parameterized by the `[\"raster-particle-speed\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-particle-max-speed`.\n   */\n  @MapboxExperimental\n  public var rasterParticleColor: ColorValue by rasterParticleColorState\n\n  @MapboxExperimental\n  private val rasterParticleColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialRasterParticleColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [rasterParticleColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var rasterParticleColorUseTheme: StringValue by rasterParticleColorUseThemeState\n\n  @MapboxExperimental\n  private val rasterParticleCountState: MutableState<LongValue> = mutableStateOf(initialRasterParticleCount)\n  /**\n   *  Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n   */\n  @MapboxExperimental\n  public var rasterParticleCount: LongValue by rasterParticleCountState\n\n  @MapboxExperimental\n  private val rasterParticleFadeOpacityFactorState: MutableState<DoubleValue> = mutableStateOf(initialRasterParticleFadeOpacityFactor)\n  /**\n   *  Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var rasterParticleFadeOpacityFactor: DoubleValue by rasterParticleFadeOpacityFactorState\n\n  @MapboxExperimental\n  private val rasterParticleFadeOpacityFactorTransitionState: MutableState<Transition> = mutableStateOf(initialRasterParticleFadeOpacityFactorTransition)\n  /**\n   *  Defines the transition of [rasterParticleFadeOpacityFactor].\n   */\n  @MapboxExperimental\n  public var rasterParticleFadeOpacityFactorTransition: Transition by rasterParticleFadeOpacityFactorTransitionState\n\n  @MapboxExperimental\n  private val rasterParticleMaxSpeedState: MutableState<DoubleValue> = mutableStateOf(initialRasterParticleMaxSpeed)\n  /**\n   *  Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n   */\n  @MapboxExperimental\n  public var rasterParticleMaxSpeed: DoubleValue by rasterParticleMaxSpeedState\n\n  @MapboxExperimental\n  private val rasterParticleResetRateFactorState: MutableState<DoubleValue> = mutableStateOf(initialRasterParticleResetRateFactor)\n  /**\n   *  Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var rasterParticleResetRateFactor: DoubleValue by rasterParticleResetRateFactorState\n\n  @MapboxExperimental\n  private val rasterParticleSpeedFactorState: MutableState<DoubleValue> = mutableStateOf(initialRasterParticleSpeedFactor)\n  /**\n   *  Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var rasterParticleSpeedFactor: DoubleValue by rasterParticleSpeedFactorState\n\n  @MapboxExperimental\n  private val rasterParticleSpeedFactorTransitionState: MutableState<Transition> = mutableStateOf(initialRasterParticleSpeedFactorTransition)\n  /**\n   *  Defines the transition of [rasterParticleSpeedFactor].\n   */\n  @MapboxExperimental\n  public var rasterParticleSpeedFactorTransition: Transition by rasterParticleSpeedFactorTransitionState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleArrayBandState, \"raster-particle-array-band\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleColorState, \"raster-particle-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleColorUseThemeState, \"raster-particle-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleCountState, \"raster-particle-count\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleFadeOpacityFactorState, \"raster-particle-fade-opacity-factor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleFadeOpacityFactorTransitionState, \"raster-particle-fade-opacity-factor-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleMaxSpeedState, \"raster-particle-max-speed\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleResetRateFactorState, \"raster-particle-reset-rate-factor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleSpeedFactorState, \"raster-particle-speed-factor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, rasterParticleSpeedFactorTransitionState, \"raster-particle-speed-factor-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/SkyLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * A spherical dome around the map that is always rendered behind all other layers.\n *\n * This composable function inserts a [SkyLayer] to the map. For convenience, if there's\n * no need to hoist the [skyLayerState], use `SkyLayer(layerId, init)` with trailing lambda instead.\n *\n * **Warning**: As of v10.6.0, [Atmosphere] is the preferred method for atmospheric styling.\n * Sky layer is not supported by the globe projection, and will be phased out in future major release.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#sky)\n *\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param skyLayerState the state holder for [SkyLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\npublic fun SkyLayer(\n  layerId: String = remember {\n    generateRandomLayerId(\"sky\")\n  },\n  skyLayerState: SkyLayerState = remember { SkyLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of SkyLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"sky\",\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(skyLayerState) {\n      skyLayerState.UpdateProperties(layerNode)\n    }\n  }\n}\n\n/**\n * A spherical dome around the map that is always rendered behind all other layers.\n *\n * This composable function inserts a [SkyLayer] to the map.\n *\n * **Warning**: As of v10.6.0, [Atmosphere] is the preferred method for atmospheric styling.\n * Sky layer is not supported by the globe projection, and will be phased out in future major release.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#sky)\n *\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [SkyLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun SkyLayer(\n  layerId: String = remember {\n    generateRandomLayerId(\"sky\")\n  },\n  crossinline init: SkyLayerState.() -> Unit\n) {\n  SkyLayer(layerId = layerId, skyLayerState = remember { SkyLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/SkyLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [SkyLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#sky)\n */\n@Stable\npublic class SkyLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialSkyAtmosphereColor: ColorValue,\n  initialSkyAtmosphereColorUseTheme: StringValue,\n  initialSkyAtmosphereHaloColor: ColorValue,\n  initialSkyAtmosphereHaloColorUseTheme: StringValue,\n  initialSkyAtmosphereSun: DoubleListValue,\n  initialSkyAtmosphereSunIntensity: DoubleValue,\n  initialSkyGradient: ColorValue,\n  initialSkyGradientUseTheme: StringValue,\n  initialSkyGradientCenter: DoubleListValue,\n  initialSkyGradientRadius: DoubleValue,\n  initialSkyOpacity: DoubleValue,\n  initialSkyOpacityTransition: Transition,\n  initialSkyType: SkyTypeValue,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n) {\n  /**\n   * Construct an default [SkyLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialSkyAtmosphereColor = ColorValue.INITIAL,\n    initialSkyAtmosphereColorUseTheme = StringValue.INITIAL,\n    initialSkyAtmosphereHaloColor = ColorValue.INITIAL,\n    initialSkyAtmosphereHaloColorUseTheme = StringValue.INITIAL,\n    initialSkyAtmosphereSun = DoubleListValue.INITIAL,\n    initialSkyAtmosphereSunIntensity = DoubleValue.INITIAL,\n    initialSkyGradient = ColorValue.INITIAL,\n    initialSkyGradientUseTheme = StringValue.INITIAL,\n    initialSkyGradientCenter = DoubleListValue.INITIAL,\n    initialSkyGradientRadius = DoubleValue.INITIAL,\n    initialSkyOpacity = DoubleValue.INITIAL,\n    initialSkyOpacityTransition = Transition.INITIAL,\n    initialSkyType = SkyTypeValue.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n  )\n\n  private val skyAtmosphereColorState: MutableState<ColorValue> = mutableStateOf(initialSkyAtmosphereColor)\n  /**\n   *  A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   */\n  public var skyAtmosphereColor: ColorValue by skyAtmosphereColorState\n\n  @MapboxExperimental\n  private val skyAtmosphereColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialSkyAtmosphereColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [skyAtmosphereColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var skyAtmosphereColorUseTheme: StringValue by skyAtmosphereColorUseThemeState\n\n  private val skyAtmosphereHaloColorState: MutableState<ColorValue> = mutableStateOf(initialSkyAtmosphereHaloColor)\n  /**\n   *  A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   */\n  public var skyAtmosphereHaloColor: ColorValue by skyAtmosphereHaloColorState\n\n  @MapboxExperimental\n  private val skyAtmosphereHaloColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialSkyAtmosphereHaloColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [skyAtmosphereHaloColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var skyAtmosphereHaloColorUseTheme: StringValue by skyAtmosphereHaloColorUseThemeState\n\n  private val skyAtmosphereSunState: MutableState<DoubleListValue> = mutableStateOf(initialSkyAtmosphereSun)\n  /**\n   *  Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n   */\n  public var skyAtmosphereSun: DoubleListValue by skyAtmosphereSunState\n\n  private val skyAtmosphereSunIntensityState: MutableState<DoubleValue> = mutableStateOf(initialSkyAtmosphereSunIntensity)\n  /**\n   *  Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n   */\n  public var skyAtmosphereSunIntensity: DoubleValue by skyAtmosphereSunIntensityState\n\n  private val skyGradientState: MutableState<ColorValue> = mutableStateOf(initialSkyGradient)\n  /**\n   *  Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`. Default value: [\"interpolate\",[\"linear\"],[\"sky-radial-progress\"],0.8,\"#87ceeb\",1,\"white\"].\n   */\n  public var skyGradient: ColorValue by skyGradientState\n\n  @MapboxExperimental\n  private val skyGradientUseThemeState: MutableState<StringValue> = mutableStateOf(initialSkyGradientUseTheme)\n  /**\n   *  Overrides applying of color theme for [skyGradient] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var skyGradientUseTheme: StringValue by skyGradientUseThemeState\n\n  private val skyGradientCenterState: MutableState<DoubleListValue> = mutableStateOf(initialSkyGradientCenter)\n  /**\n   *  Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n   */\n  public var skyGradientCenter: DoubleListValue by skyGradientCenterState\n\n  private val skyGradientRadiusState: MutableState<DoubleValue> = mutableStateOf(initialSkyGradientRadius)\n  /**\n   *  The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n   */\n  public var skyGradientRadius: DoubleValue by skyGradientRadiusState\n\n  private val skyOpacityState: MutableState<DoubleValue> = mutableStateOf(initialSkyOpacity)\n  /**\n   *  The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n   */\n  public var skyOpacity: DoubleValue by skyOpacityState\n\n  private val skyOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialSkyOpacityTransition)\n  /**\n   *  Defines the transition of [skyOpacity].\n   */\n  public var skyOpacityTransition: Transition by skyOpacityTransitionState\n\n  private val skyTypeState: MutableState<SkyTypeValue> = mutableStateOf(initialSkyType)\n  /**\n   *  The type of the sky Default value: \"atmosphere\".\n   */\n  public var skyType: SkyTypeValue by skyTypeState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyAtmosphereColorState, \"sky-atmosphere-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyAtmosphereColorUseThemeState, \"sky-atmosphere-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyAtmosphereHaloColorState, \"sky-atmosphere-halo-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyAtmosphereHaloColorUseThemeState, \"sky-atmosphere-halo-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyAtmosphereSunState, \"sky-atmosphere-sun\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyAtmosphereSunIntensityState, \"sky-atmosphere-sun-intensity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyGradientState, \"sky-gradient\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyGradientUseThemeState, \"sky-gradient-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyGradientCenterState, \"sky-gradient-center\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyGradientRadiusState, \"sky-gradient-radius\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyOpacityState, \"sky-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyOpacityTransitionState, \"sky-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, skyTypeState, \"sky-type\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/SymbolLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ComposeNode\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLayerId\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\n\n/**\n * An icon or a text label.\n *\n * This composable function inserts a [SymbolLayer] to the map. For convenience, if there's\n * no need to hoist the [symbolLayerState], use `SymbolLayer(sourceState, layerId, init)` with trailing lambda instead.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#symbol)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param symbolLayerState the state holder for [SymbolLayer]'s properties.\n */\n@Composable\n@MapboxMapComposable\n@OptIn(MapboxExperimental::class)\npublic fun SymbolLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"symbol\")\n  },\n  symbolLayerState: SymbolLayerState = remember { SymbolLayerState() }\n) {\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of SymbolLayer inside unsupported composable function\")\n\n  val coroutineScope = rememberCoroutineScope()\n\n  val layerNode = remember {\n    LayerNode(\n      map = mapApplier.mapView.mapboxMap,\n      layerType = \"symbol\",\n      sourceState = sourceState,\n      layerId = layerId,\n      coroutineScope = coroutineScope\n    )\n  }\n\n  ComposeNode<LayerNode, MapApplier>(\n    factory = { layerNode },\n    update = {\n      update(sourceState) {\n        updateSource(sourceState)\n      }\n      update(layerId) {\n        updateLayerId(layerId)\n      }\n    }\n  ) {\n    key(symbolLayerState) {\n      symbolLayerState.UpdateProperties(layerNode)\n    }\n  }\n  sourceState.UpdateProperties()\n  key(symbolLayerState.interactionsState) {\n    symbolLayerState.interactionsState.BindTo(\n      mapboxMap = mapApplier.mapView.mapboxMap,\n      layerId = layerId\n    )\n  }\n}\n\n/**\n * An icon or a text label.\n *\n * This composable function inserts a [SymbolLayer] to the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#symbol)\n *\n * @param sourceState the source that drives this layer.\n * @param layerId the ID of the layer, by default, a random id will be generated with UUID.\n * @param init the lambda that will be applied to the remembered [SymbolLayerState].\n */\n@Composable\n@MapboxMapComposable\npublic inline fun SymbolLayer(\n  sourceState: SourceState,\n  layerId: String = remember {\n    generateRandomLayerId(\"symbol\")\n  },\n  crossinline init: SymbolLayerState.() -> Unit\n) {\n  SymbolLayer(sourceState = sourceState, layerId = layerId, symbolLayerState = remember { SymbolLayerState() }.apply(init))\n}\n\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/generated/SymbolLayerState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.layers.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.AddImageWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleRangeValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringListValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.layers.Filter\nimport com.mapbox.maps.extension.compose.style.layers.FormattedValue\nimport com.mapbox.maps.extension.compose.style.layers.ImageValue\nimport com.mapbox.maps.extension.compose.style.layers.LayerInteractionsState\nimport com.mapbox.maps.extension.compose.style.layers.internal.LayerNode\n\n/**\n * The state holder for [SymbolLayer]'s layer properties.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers#symbol)\n */\n@Stable\n@OptIn(MapboxExperimental::class)\npublic class SymbolLayerState\n@OptIn(MapboxExperimental::class)\nprivate constructor(\n  initialIconAllowOverlap: BooleanValue,\n  initialIconAnchor: IconAnchorValue,\n  initialIconIgnorePlacement: BooleanValue,\n  initialIconImage: ImageValue,\n  initialIconKeepUpright: BooleanValue,\n  initialIconOffset: DoubleListValue,\n  initialIconOptional: BooleanValue,\n  initialIconPadding: DoubleValue,\n  initialIconPitchAlignment: IconPitchAlignmentValue,\n  initialIconRotate: DoubleValue,\n  initialIconRotationAlignment: IconRotationAlignmentValue,\n  initialIconSize: DoubleValue,\n  initialIconSizeScaleRange: DoubleRangeValue,\n  initialIconTextFit: IconTextFitValue,\n  initialIconTextFitPadding: DoubleListValue,\n  initialSymbolAvoidEdges: BooleanValue,\n  initialSymbolElevationReference: SymbolElevationReferenceValue,\n  initialSymbolPlacement: SymbolPlacementValue,\n  initialSymbolSortKey: DoubleValue,\n  initialSymbolSpacing: DoubleValue,\n  initialSymbolZElevate: BooleanValue,\n  initialSymbolZOrder: SymbolZOrderValue,\n  initialTextAllowOverlap: BooleanValue,\n  initialTextAnchor: TextAnchorValue,\n  initialTextField: FormattedValue,\n  initialTextFont: StringListValue,\n  initialTextIgnorePlacement: BooleanValue,\n  initialTextJustify: TextJustifyValue,\n  initialTextKeepUpright: BooleanValue,\n  initialTextLetterSpacing: DoubleValue,\n  initialTextLineHeight: DoubleValue,\n  initialTextMaxAngle: DoubleValue,\n  initialTextMaxWidth: DoubleValue,\n  initialTextOffset: DoubleListValue,\n  initialTextOptional: BooleanValue,\n  initialTextPadding: DoubleValue,\n  initialTextPitchAlignment: TextPitchAlignmentValue,\n  initialTextRadialOffset: DoubleValue,\n  initialTextRotate: DoubleValue,\n  initialTextRotationAlignment: TextRotationAlignmentValue,\n  initialTextSize: DoubleValue,\n  initialTextSizeScaleRange: DoubleRangeValue,\n  initialTextTransform: TextTransformValue,\n  initialTextVariableAnchor: TextVariableAnchorListValue,\n  initialTextWritingMode: TextWritingModeListValue,\n  initialIconColor: ColorValue,\n  initialIconColorUseTheme: StringValue,\n  initialIconColorTransition: Transition,\n  initialIconColorBrightnessMax: DoubleValue,\n  initialIconColorBrightnessMin: DoubleValue,\n  initialIconColorContrast: DoubleValue,\n  initialIconColorSaturation: DoubleValue,\n  initialIconColorSaturationTransition: Transition,\n  initialIconEmissiveStrength: DoubleValue,\n  initialIconEmissiveStrengthTransition: Transition,\n  initialIconHaloBlur: DoubleValue,\n  initialIconHaloBlurTransition: Transition,\n  initialIconHaloColor: ColorValue,\n  initialIconHaloColorUseTheme: StringValue,\n  initialIconHaloColorTransition: Transition,\n  initialIconHaloWidth: DoubleValue,\n  initialIconHaloWidthTransition: Transition,\n  initialIconImageCrossFade: DoubleValue,\n  initialIconImageCrossFadeTransition: Transition,\n  initialIconOcclusionOpacity: DoubleValue,\n  initialIconOcclusionOpacityTransition: Transition,\n  initialIconOpacity: DoubleValue,\n  initialIconOpacityTransition: Transition,\n  initialIconTranslate: DoubleListValue,\n  initialIconTranslateTransition: Transition,\n  initialIconTranslateAnchor: IconTranslateAnchorValue,\n  initialOcclusionOpacityMode: OcclusionOpacityModeValue,\n  initialSymbolZOffset: DoubleValue,\n  initialSymbolZOffsetTransition: Transition,\n  initialTextColor: ColorValue,\n  initialTextColorUseTheme: StringValue,\n  initialTextColorTransition: Transition,\n  initialTextEmissiveStrength: DoubleValue,\n  initialTextEmissiveStrengthTransition: Transition,\n  initialTextHaloBlur: DoubleValue,\n  initialTextHaloBlurTransition: Transition,\n  initialTextHaloColor: ColorValue,\n  initialTextHaloColorUseTheme: StringValue,\n  initialTextHaloColorTransition: Transition,\n  initialTextHaloWidth: DoubleValue,\n  initialTextHaloWidthTransition: Transition,\n  initialTextOcclusionOpacity: DoubleValue,\n  initialTextOcclusionOpacityTransition: Transition,\n  initialTextOpacity: DoubleValue,\n  initialTextOpacityTransition: Transition,\n  initialTextTranslate: DoubleListValue,\n  initialTextTranslateTransition: Transition,\n  initialTextTranslateAnchor: TextTranslateAnchorValue,\n  initialVisibility: VisibilityValue,\n  initialMinZoom: LongValue,\n  initialMaxZoom: LongValue,\n  initialSourceLayer: StringValue,\n  initialFilter: Filter,\n  initialInteractionsState: LayerInteractionsState,\n) {\n  /**\n   * Construct an default [SymbolLayerState].\n   */\n  @OptIn(MapboxExperimental::class)\n  public constructor() : this(\n    initialIconAllowOverlap = BooleanValue.INITIAL,\n    initialIconAnchor = IconAnchorValue.INITIAL,\n    initialIconIgnorePlacement = BooleanValue.INITIAL,\n    initialIconImage = ImageValue.INITIAL,\n    initialIconKeepUpright = BooleanValue.INITIAL,\n    initialIconOffset = DoubleListValue.INITIAL,\n    initialIconOptional = BooleanValue.INITIAL,\n    initialIconPadding = DoubleValue.INITIAL,\n    initialIconPitchAlignment = IconPitchAlignmentValue.INITIAL,\n    initialIconRotate = DoubleValue.INITIAL,\n    initialIconRotationAlignment = IconRotationAlignmentValue.INITIAL,\n    initialIconSize = DoubleValue.INITIAL,\n    initialIconSizeScaleRange = DoubleRangeValue.INITIAL,\n    initialIconTextFit = IconTextFitValue.INITIAL,\n    initialIconTextFitPadding = DoubleListValue.INITIAL,\n    initialSymbolAvoidEdges = BooleanValue.INITIAL,\n    initialSymbolElevationReference = SymbolElevationReferenceValue.INITIAL,\n    initialSymbolPlacement = SymbolPlacementValue.INITIAL,\n    initialSymbolSortKey = DoubleValue.INITIAL,\n    initialSymbolSpacing = DoubleValue.INITIAL,\n    initialSymbolZElevate = BooleanValue.INITIAL,\n    initialSymbolZOrder = SymbolZOrderValue.INITIAL,\n    initialTextAllowOverlap = BooleanValue.INITIAL,\n    initialTextAnchor = TextAnchorValue.INITIAL,\n    initialTextField = FormattedValue.INITIAL,\n    initialTextFont = StringListValue.INITIAL,\n    initialTextIgnorePlacement = BooleanValue.INITIAL,\n    initialTextJustify = TextJustifyValue.INITIAL,\n    initialTextKeepUpright = BooleanValue.INITIAL,\n    initialTextLetterSpacing = DoubleValue.INITIAL,\n    initialTextLineHeight = DoubleValue.INITIAL,\n    initialTextMaxAngle = DoubleValue.INITIAL,\n    initialTextMaxWidth = DoubleValue.INITIAL,\n    initialTextOffset = DoubleListValue.INITIAL,\n    initialTextOptional = BooleanValue.INITIAL,\n    initialTextPadding = DoubleValue.INITIAL,\n    initialTextPitchAlignment = TextPitchAlignmentValue.INITIAL,\n    initialTextRadialOffset = DoubleValue.INITIAL,\n    initialTextRotate = DoubleValue.INITIAL,\n    initialTextRotationAlignment = TextRotationAlignmentValue.INITIAL,\n    initialTextSize = DoubleValue.INITIAL,\n    initialTextSizeScaleRange = DoubleRangeValue.INITIAL,\n    initialTextTransform = TextTransformValue.INITIAL,\n    initialTextVariableAnchor = TextVariableAnchorListValue.INITIAL,\n    initialTextWritingMode = TextWritingModeListValue.INITIAL,\n    initialIconColor = ColorValue.INITIAL,\n    initialIconColorUseTheme = StringValue.INITIAL,\n    initialIconColorTransition = Transition.INITIAL,\n    initialIconColorBrightnessMax = DoubleValue.INITIAL,\n    initialIconColorBrightnessMin = DoubleValue.INITIAL,\n    initialIconColorContrast = DoubleValue.INITIAL,\n    initialIconColorSaturation = DoubleValue.INITIAL,\n    initialIconColorSaturationTransition = Transition.INITIAL,\n    initialIconEmissiveStrength = DoubleValue.INITIAL,\n    initialIconEmissiveStrengthTransition = Transition.INITIAL,\n    initialIconHaloBlur = DoubleValue.INITIAL,\n    initialIconHaloBlurTransition = Transition.INITIAL,\n    initialIconHaloColor = ColorValue.INITIAL,\n    initialIconHaloColorUseTheme = StringValue.INITIAL,\n    initialIconHaloColorTransition = Transition.INITIAL,\n    initialIconHaloWidth = DoubleValue.INITIAL,\n    initialIconHaloWidthTransition = Transition.INITIAL,\n    initialIconImageCrossFade = DoubleValue.INITIAL,\n    initialIconImageCrossFadeTransition = Transition.INITIAL,\n    initialIconOcclusionOpacity = DoubleValue.INITIAL,\n    initialIconOcclusionOpacityTransition = Transition.INITIAL,\n    initialIconOpacity = DoubleValue.INITIAL,\n    initialIconOpacityTransition = Transition.INITIAL,\n    initialIconTranslate = DoubleListValue.INITIAL,\n    initialIconTranslateTransition = Transition.INITIAL,\n    initialIconTranslateAnchor = IconTranslateAnchorValue.INITIAL,\n    initialOcclusionOpacityMode = OcclusionOpacityModeValue.INITIAL,\n    initialSymbolZOffset = DoubleValue.INITIAL,\n    initialSymbolZOffsetTransition = Transition.INITIAL,\n    initialTextColor = ColorValue.INITIAL,\n    initialTextColorUseTheme = StringValue.INITIAL,\n    initialTextColorTransition = Transition.INITIAL,\n    initialTextEmissiveStrength = DoubleValue.INITIAL,\n    initialTextEmissiveStrengthTransition = Transition.INITIAL,\n    initialTextHaloBlur = DoubleValue.INITIAL,\n    initialTextHaloBlurTransition = Transition.INITIAL,\n    initialTextHaloColor = ColorValue.INITIAL,\n    initialTextHaloColorUseTheme = StringValue.INITIAL,\n    initialTextHaloColorTransition = Transition.INITIAL,\n    initialTextHaloWidth = DoubleValue.INITIAL,\n    initialTextHaloWidthTransition = Transition.INITIAL,\n    initialTextOcclusionOpacity = DoubleValue.INITIAL,\n    initialTextOcclusionOpacityTransition = Transition.INITIAL,\n    initialTextOpacity = DoubleValue.INITIAL,\n    initialTextOpacityTransition = Transition.INITIAL,\n    initialTextTranslate = DoubleListValue.INITIAL,\n    initialTextTranslateTransition = Transition.INITIAL,\n    initialTextTranslateAnchor = TextTranslateAnchorValue.INITIAL,\n    initialVisibility = VisibilityValue.INITIAL,\n    initialMinZoom = LongValue.INITIAL,\n    initialMaxZoom = LongValue.INITIAL,\n    initialSourceLayer = StringValue.INITIAL,\n    initialFilter = Filter.INITIAL,\n    initialInteractionsState = LayerInteractionsState(),\n  )\n\n  /**\n   * The interactions associated with this layer.\n   */\n  @MapboxExperimental\n  public var interactionsState: LayerInteractionsState by mutableStateOf(initialInteractionsState)\n\n  private val iconAllowOverlapState: MutableState<BooleanValue> = mutableStateOf(initialIconAllowOverlap)\n  /**\n   *  If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n   */\n  public var iconAllowOverlap: BooleanValue by iconAllowOverlapState\n\n  private val iconAnchorState: MutableState<IconAnchorValue> = mutableStateOf(initialIconAnchor)\n  /**\n   *  Part of the icon placed closest to the anchor. Default value: \"center\".\n   */\n  public var iconAnchor: IconAnchorValue by iconAnchorState\n\n  private val iconIgnorePlacementState: MutableState<BooleanValue> = mutableStateOf(initialIconIgnorePlacement)\n  /**\n   *  If true, other symbols can be visible even if they collide with the icon. Default value: false.\n   */\n  public var iconIgnorePlacement: BooleanValue by iconIgnorePlacementState\n\n  private val iconImageState: MutableState<ImageValue> = mutableStateOf(initialIconImage)\n  /**\n   *  Name of image in sprite to use for drawing an image background.\n   */\n  public var iconImage: ImageValue by iconImageState\n\n  private val iconKeepUprightState: MutableState<BooleanValue> = mutableStateOf(initialIconKeepUpright)\n  /**\n   *  If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n   */\n  public var iconKeepUpright: BooleanValue by iconKeepUprightState\n\n  private val iconOffsetState: MutableState<DoubleListValue> = mutableStateOf(initialIconOffset)\n  /**\n   *  Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   */\n  public var iconOffset: DoubleListValue by iconOffsetState\n\n  private val iconOptionalState: MutableState<BooleanValue> = mutableStateOf(initialIconOptional)\n  /**\n   *  If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n   */\n  public var iconOptional: BooleanValue by iconOptionalState\n\n  private val iconPaddingState: MutableState<DoubleValue> = mutableStateOf(initialIconPadding)\n  /**\n   *  Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n   */\n  public var iconPadding: DoubleValue by iconPaddingState\n\n  private val iconPitchAlignmentState: MutableState<IconPitchAlignmentValue> = mutableStateOf(initialIconPitchAlignment)\n  /**\n   *  Orientation of icon when map is pitched. Default value: \"auto\".\n   */\n  public var iconPitchAlignment: IconPitchAlignmentValue by iconPitchAlignmentState\n\n  private val iconRotateState: MutableState<DoubleValue> = mutableStateOf(initialIconRotate)\n  /**\n   *  Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   */\n  public var iconRotate: DoubleValue by iconRotateState\n\n  private val iconRotationAlignmentState: MutableState<IconRotationAlignmentValue> = mutableStateOf(initialIconRotationAlignment)\n  /**\n   *  In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n   */\n  public var iconRotationAlignment: IconRotationAlignmentValue by iconRotationAlignmentState\n\n  private val iconSizeState: MutableState<DoubleValue> = mutableStateOf(initialIconSize)\n  /**\n   *  Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   */\n  public var iconSize: DoubleValue by iconSizeState\n\n  @MapboxExperimental\n  private val iconSizeScaleRangeState: MutableState<DoubleRangeValue> = mutableStateOf(initialIconSizeScaleRange)\n  /**\n   *  Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   */\n  @MapboxExperimental\n  public var iconSizeScaleRange: DoubleRangeValue by iconSizeScaleRangeState\n\n  private val iconTextFitState: MutableState<IconTextFitValue> = mutableStateOf(initialIconTextFit)\n  /**\n   *  Scales the icon to fit around the associated text. Default value: \"none\".\n   */\n  public var iconTextFit: IconTextFitValue by iconTextFitState\n\n  private val iconTextFitPaddingState: MutableState<DoubleListValue> = mutableStateOf(initialIconTextFitPadding)\n  /**\n   *  Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   */\n  public var iconTextFitPadding: DoubleListValue by iconTextFitPaddingState\n\n  private val symbolAvoidEdgesState: MutableState<BooleanValue> = mutableStateOf(initialSymbolAvoidEdges)\n  /**\n   *  If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n   */\n  public var symbolAvoidEdges: BooleanValue by symbolAvoidEdgesState\n\n  @MapboxExperimental\n  private val symbolElevationReferenceState: MutableState<SymbolElevationReferenceValue> = mutableStateOf(initialSymbolElevationReference)\n  /**\n   *  Selects the base of symbol-elevation. Default value: \"ground\".\n   */\n  @MapboxExperimental\n  public var symbolElevationReference: SymbolElevationReferenceValue by symbolElevationReferenceState\n\n  private val symbolPlacementState: MutableState<SymbolPlacementValue> = mutableStateOf(initialSymbolPlacement)\n  /**\n   *  Label placement relative to its geometry. Default value: \"point\".\n   */\n  public var symbolPlacement: SymbolPlacementValue by symbolPlacementState\n\n  private val symbolSortKeyState: MutableState<DoubleValue> = mutableStateOf(initialSymbolSortKey)\n  /**\n   *  Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   */\n  public var symbolSortKey: DoubleValue by symbolSortKeyState\n\n  private val symbolSpacingState: MutableState<DoubleValue> = mutableStateOf(initialSymbolSpacing)\n  /**\n   *  Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n   */\n  public var symbolSpacing: DoubleValue by symbolSpacingState\n\n  private val symbolZElevateState: MutableState<BooleanValue> = mutableStateOf(initialSymbolZElevate)\n  /**\n   *  Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n   */\n  public var symbolZElevate: BooleanValue by symbolZElevateState\n\n  private val symbolZOrderState: MutableState<SymbolZOrderValue> = mutableStateOf(initialSymbolZOrder)\n  /**\n   *  Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n   */\n  public var symbolZOrder: SymbolZOrderValue by symbolZOrderState\n\n  private val textAllowOverlapState: MutableState<BooleanValue> = mutableStateOf(initialTextAllowOverlap)\n  /**\n   *  If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n   */\n  public var textAllowOverlap: BooleanValue by textAllowOverlapState\n\n  private val textAnchorState: MutableState<TextAnchorValue> = mutableStateOf(initialTextAnchor)\n  /**\n   *  Part of the text placed closest to the anchor. Default value: \"center\".\n   */\n  public var textAnchor: TextAnchorValue by textAnchorState\n\n  private val textFieldState: MutableState<FormattedValue> = mutableStateOf(initialTextField)\n  /**\n   *  Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   */\n  public var textField: FormattedValue by textFieldState\n\n  private val textFontState: MutableState<StringListValue> = mutableStateOf(initialTextFont)\n  /**\n   *  Font stack to use for displaying text.\n   */\n  public var textFont: StringListValue by textFontState\n\n  private val textIgnorePlacementState: MutableState<BooleanValue> = mutableStateOf(initialTextIgnorePlacement)\n  /**\n   *  If true, other symbols can be visible even if they collide with the text. Default value: false.\n   */\n  public var textIgnorePlacement: BooleanValue by textIgnorePlacementState\n\n  private val textJustifyState: MutableState<TextJustifyValue> = mutableStateOf(initialTextJustify)\n  /**\n   *  Text justification options. Default value: \"center\".\n   */\n  public var textJustify: TextJustifyValue by textJustifyState\n\n  private val textKeepUprightState: MutableState<BooleanValue> = mutableStateOf(initialTextKeepUpright)\n  /**\n   *  If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n   */\n  public var textKeepUpright: BooleanValue by textKeepUprightState\n\n  private val textLetterSpacingState: MutableState<DoubleValue> = mutableStateOf(initialTextLetterSpacing)\n  /**\n   *  Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   */\n  public var textLetterSpacing: DoubleValue by textLetterSpacingState\n\n  private val textLineHeightState: MutableState<DoubleValue> = mutableStateOf(initialTextLineHeight)\n  /**\n   *  Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   */\n  public var textLineHeight: DoubleValue by textLineHeightState\n\n  private val textMaxAngleState: MutableState<DoubleValue> = mutableStateOf(initialTextMaxAngle)\n  /**\n   *  Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n   */\n  public var textMaxAngle: DoubleValue by textMaxAngleState\n\n  private val textMaxWidthState: MutableState<DoubleValue> = mutableStateOf(initialTextMaxWidth)\n  /**\n   *  The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   */\n  public var textMaxWidth: DoubleValue by textMaxWidthState\n\n  private val textOffsetState: MutableState<DoubleListValue> = mutableStateOf(initialTextOffset)\n  /**\n   *  Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   */\n  public var textOffset: DoubleListValue by textOffsetState\n\n  private val textOptionalState: MutableState<BooleanValue> = mutableStateOf(initialTextOptional)\n  /**\n   *  If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n   */\n  public var textOptional: BooleanValue by textOptionalState\n\n  private val textPaddingState: MutableState<DoubleValue> = mutableStateOf(initialTextPadding)\n  /**\n   *  Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n   */\n  public var textPadding: DoubleValue by textPaddingState\n\n  private val textPitchAlignmentState: MutableState<TextPitchAlignmentValue> = mutableStateOf(initialTextPitchAlignment)\n  /**\n   *  Orientation of text when map is pitched. Default value: \"auto\".\n   */\n  public var textPitchAlignment: TextPitchAlignmentValue by textPitchAlignmentState\n\n  private val textRadialOffsetState: MutableState<DoubleValue> = mutableStateOf(initialTextRadialOffset)\n  /**\n   *  Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   */\n  public var textRadialOffset: DoubleValue by textRadialOffsetState\n\n  private val textRotateState: MutableState<DoubleValue> = mutableStateOf(initialTextRotate)\n  /**\n   *  Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   */\n  public var textRotate: DoubleValue by textRotateState\n\n  private val textRotationAlignmentState: MutableState<TextRotationAlignmentValue> = mutableStateOf(initialTextRotationAlignment)\n  /**\n   *  In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n   */\n  public var textRotationAlignment: TextRotationAlignmentValue by textRotationAlignmentState\n\n  private val textSizeState: MutableState<DoubleValue> = mutableStateOf(initialTextSize)\n  /**\n   *  Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   */\n  public var textSize: DoubleValue by textSizeState\n\n  @MapboxExperimental\n  private val textSizeScaleRangeState: MutableState<DoubleRangeValue> = mutableStateOf(initialTextSizeScaleRange)\n  /**\n   *  Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   */\n  @MapboxExperimental\n  public var textSizeScaleRange: DoubleRangeValue by textSizeScaleRangeState\n\n  private val textTransformState: MutableState<TextTransformValue> = mutableStateOf(initialTextTransform)\n  /**\n   *  Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   */\n  public var textTransform: TextTransformValue by textTransformState\n\n  private val textVariableAnchorState: MutableState<TextVariableAnchorListValue> = mutableStateOf(initialTextVariableAnchor)\n  /**\n   *  To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n   */\n  public var textVariableAnchor: TextVariableAnchorListValue by textVariableAnchorState\n\n  private val textWritingModeState: MutableState<TextWritingModeListValue> = mutableStateOf(initialTextWritingMode)\n  /**\n   *  The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n   */\n  public var textWritingMode: TextWritingModeListValue by textWritingModeState\n\n  private val iconColorState: MutableState<ColorValue> = mutableStateOf(initialIconColor)\n  /**\n   *  The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  public var iconColor: ColorValue by iconColorState\n\n  @MapboxExperimental\n  private val iconColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialIconColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [iconColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var iconColorUseTheme: StringValue by iconColorUseThemeState\n\n  private val iconColorTransitionState: MutableState<Transition> = mutableStateOf(initialIconColorTransition)\n  /**\n   *  Defines the transition of [iconColor].\n   */\n  public var iconColorTransition: Transition by iconColorTransitionState\n\n  private val iconColorBrightnessMaxState: MutableState<DoubleValue> = mutableStateOf(initialIconColorBrightnessMax)\n  /**\n   *  Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   */\n  public var iconColorBrightnessMax: DoubleValue by iconColorBrightnessMaxState\n\n  private val iconColorBrightnessMinState: MutableState<DoubleValue> = mutableStateOf(initialIconColorBrightnessMin)\n  /**\n   *  Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   */\n  public var iconColorBrightnessMin: DoubleValue by iconColorBrightnessMinState\n\n  private val iconColorContrastState: MutableState<DoubleValue> = mutableStateOf(initialIconColorContrast)\n  /**\n   *  Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n   */\n  public var iconColorContrast: DoubleValue by iconColorContrastState\n\n  private val iconColorSaturationState: MutableState<DoubleValue> = mutableStateOf(initialIconColorSaturation)\n  /**\n   *  Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   */\n  public var iconColorSaturation: DoubleValue by iconColorSaturationState\n\n  private val iconColorSaturationTransitionState: MutableState<Transition> = mutableStateOf(initialIconColorSaturationTransition)\n  /**\n   *  Defines the transition of [iconColorSaturation].\n   */\n  public var iconColorSaturationTransition: Transition by iconColorSaturationTransitionState\n\n  private val iconEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialIconEmissiveStrength)\n  /**\n   *  Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   */\n  public var iconEmissiveStrength: DoubleValue by iconEmissiveStrengthState\n\n  private val iconEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialIconEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [iconEmissiveStrength].\n   */\n  public var iconEmissiveStrengthTransition: Transition by iconEmissiveStrengthTransitionState\n\n  private val iconHaloBlurState: MutableState<DoubleValue> = mutableStateOf(initialIconHaloBlur)\n  /**\n   *  Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   */\n  public var iconHaloBlur: DoubleValue by iconHaloBlurState\n\n  private val iconHaloBlurTransitionState: MutableState<Transition> = mutableStateOf(initialIconHaloBlurTransition)\n  /**\n   *  Defines the transition of [iconHaloBlur].\n   */\n  public var iconHaloBlurTransition: Transition by iconHaloBlurTransitionState\n\n  private val iconHaloColorState: MutableState<ColorValue> = mutableStateOf(initialIconHaloColor)\n  /**\n   *  The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  public var iconHaloColor: ColorValue by iconHaloColorState\n\n  @MapboxExperimental\n  private val iconHaloColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialIconHaloColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [iconHaloColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var iconHaloColorUseTheme: StringValue by iconHaloColorUseThemeState\n\n  private val iconHaloColorTransitionState: MutableState<Transition> = mutableStateOf(initialIconHaloColorTransition)\n  /**\n   *  Defines the transition of [iconHaloColor].\n   */\n  public var iconHaloColorTransition: Transition by iconHaloColorTransitionState\n\n  private val iconHaloWidthState: MutableState<DoubleValue> = mutableStateOf(initialIconHaloWidth)\n  /**\n   *  Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   */\n  public var iconHaloWidth: DoubleValue by iconHaloWidthState\n\n  private val iconHaloWidthTransitionState: MutableState<Transition> = mutableStateOf(initialIconHaloWidthTransition)\n  /**\n   *  Defines the transition of [iconHaloWidth].\n   */\n  public var iconHaloWidthTransition: Transition by iconHaloWidthTransitionState\n\n  private val iconImageCrossFadeState: MutableState<DoubleValue> = mutableStateOf(initialIconImageCrossFade)\n  /**\n   *  Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  public var iconImageCrossFade: DoubleValue by iconImageCrossFadeState\n\n  private val iconImageCrossFadeTransitionState: MutableState<Transition> = mutableStateOf(initialIconImageCrossFadeTransition)\n  /**\n   *  Defines the transition of [iconImageCrossFade].\n   */\n  public var iconImageCrossFadeTransition: Transition by iconImageCrossFadeTransitionState\n\n  private val iconOcclusionOpacityState: MutableState<DoubleValue> = mutableStateOf(initialIconOcclusionOpacity)\n  /**\n   *  The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  public var iconOcclusionOpacity: DoubleValue by iconOcclusionOpacityState\n\n  private val iconOcclusionOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialIconOcclusionOpacityTransition)\n  /**\n   *  Defines the transition of [iconOcclusionOpacity].\n   */\n  public var iconOcclusionOpacityTransition: Transition by iconOcclusionOpacityTransitionState\n\n  private val iconOpacityState: MutableState<DoubleValue> = mutableStateOf(initialIconOpacity)\n  /**\n   *  The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var iconOpacity: DoubleValue by iconOpacityState\n\n  private val iconOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialIconOpacityTransition)\n  /**\n   *  Defines the transition of [iconOpacity].\n   */\n  public var iconOpacityTransition: Transition by iconOpacityTransitionState\n\n  private val iconTranslateState: MutableState<DoubleListValue> = mutableStateOf(initialIconTranslate)\n  /**\n   *  Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   */\n  public var iconTranslate: DoubleListValue by iconTranslateState\n\n  private val iconTranslateTransitionState: MutableState<Transition> = mutableStateOf(initialIconTranslateTransition)\n  /**\n   *  Defines the transition of [iconTranslate].\n   */\n  public var iconTranslateTransition: Transition by iconTranslateTransitionState\n\n  private val iconTranslateAnchorState: MutableState<IconTranslateAnchorValue> = mutableStateOf(initialIconTranslateAnchor)\n  /**\n   *  Controls the frame of reference for `icon-translate`. Default value: \"map\".\n   */\n  public var iconTranslateAnchor: IconTranslateAnchorValue by iconTranslateAnchorState\n\n  private val occlusionOpacityModeState: MutableState<OcclusionOpacityModeValue> = mutableStateOf(initialOcclusionOpacityMode)\n  /**\n   *  Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n   */\n  public var occlusionOpacityMode: OcclusionOpacityModeValue by occlusionOpacityModeState\n\n  @MapboxExperimental\n  private val symbolZOffsetState: MutableState<DoubleValue> = mutableStateOf(initialSymbolZOffset)\n  /**\n   *  Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  public var symbolZOffset: DoubleValue by symbolZOffsetState\n\n  @MapboxExperimental\n  private val symbolZOffsetTransitionState: MutableState<Transition> = mutableStateOf(initialSymbolZOffsetTransition)\n  /**\n   *  Defines the transition of [symbolZOffset].\n   */\n  @MapboxExperimental\n  public var symbolZOffsetTransition: Transition by symbolZOffsetTransitionState\n\n  private val textColorState: MutableState<ColorValue> = mutableStateOf(initialTextColor)\n  /**\n   *  The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  public var textColor: ColorValue by textColorState\n\n  @MapboxExperimental\n  private val textColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialTextColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [textColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var textColorUseTheme: StringValue by textColorUseThemeState\n\n  private val textColorTransitionState: MutableState<Transition> = mutableStateOf(initialTextColorTransition)\n  /**\n   *  Defines the transition of [textColor].\n   */\n  public var textColorTransition: Transition by textColorTransitionState\n\n  private val textEmissiveStrengthState: MutableState<DoubleValue> = mutableStateOf(initialTextEmissiveStrength)\n  /**\n   *  Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   */\n  public var textEmissiveStrength: DoubleValue by textEmissiveStrengthState\n\n  private val textEmissiveStrengthTransitionState: MutableState<Transition> = mutableStateOf(initialTextEmissiveStrengthTransition)\n  /**\n   *  Defines the transition of [textEmissiveStrength].\n   */\n  public var textEmissiveStrengthTransition: Transition by textEmissiveStrengthTransitionState\n\n  private val textHaloBlurState: MutableState<DoubleValue> = mutableStateOf(initialTextHaloBlur)\n  /**\n   *  The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   */\n  public var textHaloBlur: DoubleValue by textHaloBlurState\n\n  private val textHaloBlurTransitionState: MutableState<Transition> = mutableStateOf(initialTextHaloBlurTransition)\n  /**\n   *  Defines the transition of [textHaloBlur].\n   */\n  public var textHaloBlurTransition: Transition by textHaloBlurTransitionState\n\n  private val textHaloColorState: MutableState<ColorValue> = mutableStateOf(initialTextHaloColor)\n  /**\n   *  The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  public var textHaloColor: ColorValue by textHaloColorState\n\n  @MapboxExperimental\n  private val textHaloColorUseThemeState: MutableState<StringValue> = mutableStateOf(initialTextHaloColorUseTheme)\n  /**\n   *  Overrides applying of color theme for [textHaloColor] if \"none\" is set. To follow default theme \"default\" should be set. Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var textHaloColorUseTheme: StringValue by textHaloColorUseThemeState\n\n  private val textHaloColorTransitionState: MutableState<Transition> = mutableStateOf(initialTextHaloColorTransition)\n  /**\n   *  Defines the transition of [textHaloColor].\n   */\n  public var textHaloColorTransition: Transition by textHaloColorTransitionState\n\n  private val textHaloWidthState: MutableState<DoubleValue> = mutableStateOf(initialTextHaloWidth)\n  /**\n   *  Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   */\n  public var textHaloWidth: DoubleValue by textHaloWidthState\n\n  private val textHaloWidthTransitionState: MutableState<Transition> = mutableStateOf(initialTextHaloWidthTransition)\n  /**\n   *  Defines the transition of [textHaloWidth].\n   */\n  public var textHaloWidthTransition: Transition by textHaloWidthTransitionState\n\n  private val textOcclusionOpacityState: MutableState<DoubleValue> = mutableStateOf(initialTextOcclusionOpacity)\n  /**\n   *  The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  public var textOcclusionOpacity: DoubleValue by textOcclusionOpacityState\n\n  private val textOcclusionOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialTextOcclusionOpacityTransition)\n  /**\n   *  Defines the transition of [textOcclusionOpacity].\n   */\n  public var textOcclusionOpacityTransition: Transition by textOcclusionOpacityTransitionState\n\n  private val textOpacityState: MutableState<DoubleValue> = mutableStateOf(initialTextOpacity)\n  /**\n   *  The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  public var textOpacity: DoubleValue by textOpacityState\n\n  private val textOpacityTransitionState: MutableState<Transition> = mutableStateOf(initialTextOpacityTransition)\n  /**\n   *  Defines the transition of [textOpacity].\n   */\n  public var textOpacityTransition: Transition by textOpacityTransitionState\n\n  private val textTranslateState: MutableState<DoubleListValue> = mutableStateOf(initialTextTranslate)\n  /**\n   *  Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   */\n  public var textTranslate: DoubleListValue by textTranslateState\n\n  private val textTranslateTransitionState: MutableState<Transition> = mutableStateOf(initialTextTranslateTransition)\n  /**\n   *  Defines the transition of [textTranslate].\n   */\n  public var textTranslateTransition: Transition by textTranslateTransitionState\n\n  private val textTranslateAnchorState: MutableState<TextTranslateAnchorValue> = mutableStateOf(initialTextTranslateAnchor)\n  /**\n   *  Controls the frame of reference for `text-translate`. Default value: \"map\".\n   */\n  public var textTranslateAnchor: TextTranslateAnchorValue by textTranslateAnchorState\n\n  private val visibilityState: MutableState<VisibilityValue> = mutableStateOf(initialVisibility)\n  /**\n   *  Whether this layer is displayed. Default value: \"visible\".\n   */\n  public var visibility: VisibilityValue by visibilityState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(initialMinZoom)\n  /**\n   *  The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(initialMaxZoom)\n  /**\n   *  The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val sourceLayerState: MutableState<StringValue> = mutableStateOf(initialSourceLayer)\n  /**\n   *  Layer to use from a vector tile source. Required for vector tile sources; prohibited for all other source types, including GeoJSON sources.\n   */\n  public var sourceLayer: StringValue by sourceLayerState\n\n  private val filterState: MutableState<Filter> = mutableStateOf(initialFilter)\n  /**\n   *  An expression specifying conditions on source features. Only features that match the filter are displayed. Zoom expressions in filters are only evaluated at integer zoom levels. The `[\"feature-state\", ...]` expression is not supported in filter expressions. The `[\"pitch\"]` and `[\"distance-from-center\"]` expressions are supported only for filter expressions on the symbol layer.\n   */\n  public var filter: Filter by filterState\n\n  @Composable\n  @OptIn(MapboxExperimental::class)\n  internal fun UpdateProperties(layerNode: LayerNode) {\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconAllowOverlapState, \"icon-allow-overlap\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconAnchorState, \"icon-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconIgnorePlacementState, \"icon-ignore-placement\")\n    AddImageWhenNotInitial(layerNode, iconImageState, \"icon-image\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconKeepUprightState, \"icon-keep-upright\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconOffsetState, \"icon-offset\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconOptionalState, \"icon-optional\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconPaddingState, \"icon-padding\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconPitchAlignmentState, \"icon-pitch-alignment\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconRotateState, \"icon-rotate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconRotationAlignmentState, \"icon-rotation-alignment\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconSizeState, \"icon-size\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconSizeScaleRangeState, \"icon-size-scale-range\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconTextFitState, \"icon-text-fit\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconTextFitPaddingState, \"icon-text-fit-padding\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, symbolAvoidEdgesState, \"symbol-avoid-edges\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, symbolElevationReferenceState, \"symbol-elevation-reference\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, symbolPlacementState, \"symbol-placement\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, symbolSortKeyState, \"symbol-sort-key\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, symbolSpacingState, \"symbol-spacing\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, symbolZElevateState, \"symbol-z-elevate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, symbolZOrderState, \"symbol-z-order\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textAllowOverlapState, \"text-allow-overlap\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textAnchorState, \"text-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textFieldState, \"text-field\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textFontState, \"text-font\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textIgnorePlacementState, \"text-ignore-placement\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textJustifyState, \"text-justify\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textKeepUprightState, \"text-keep-upright\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textLetterSpacingState, \"text-letter-spacing\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textLineHeightState, \"text-line-height\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textMaxAngleState, \"text-max-angle\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textMaxWidthState, \"text-max-width\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textOffsetState, \"text-offset\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textOptionalState, \"text-optional\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textPaddingState, \"text-padding\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textPitchAlignmentState, \"text-pitch-alignment\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textRadialOffsetState, \"text-radial-offset\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textRotateState, \"text-rotate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textRotationAlignmentState, \"text-rotation-alignment\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textSizeState, \"text-size\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textSizeScaleRangeState, \"text-size-scale-range\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textTransformState, \"text-transform\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textVariableAnchorState, \"text-variable-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textWritingModeState, \"text-writing-mode\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconColorState, \"icon-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconColorUseThemeState, \"icon-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconColorTransitionState, \"icon-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconColorBrightnessMaxState, \"icon-color-brightness-max\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconColorBrightnessMinState, \"icon-color-brightness-min\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconColorContrastState, \"icon-color-contrast\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconColorSaturationState, \"icon-color-saturation\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconColorSaturationTransitionState, \"icon-color-saturation-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconEmissiveStrengthState, \"icon-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconEmissiveStrengthTransitionState, \"icon-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconHaloBlurState, \"icon-halo-blur\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconHaloBlurTransitionState, \"icon-halo-blur-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconHaloColorState, \"icon-halo-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconHaloColorUseThemeState, \"icon-halo-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconHaloColorTransitionState, \"icon-halo-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconHaloWidthState, \"icon-halo-width\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconHaloWidthTransitionState, \"icon-halo-width-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconImageCrossFadeState, \"icon-image-cross-fade\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconImageCrossFadeTransitionState, \"icon-image-cross-fade-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconOcclusionOpacityState, \"icon-occlusion-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconOcclusionOpacityTransitionState, \"icon-occlusion-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconOpacityState, \"icon-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconOpacityTransitionState, \"icon-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconTranslateState, \"icon-translate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconTranslateTransitionState, \"icon-translate-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, iconTranslateAnchorState, \"icon-translate-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, occlusionOpacityModeState, \"occlusion-opacity-mode\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, symbolZOffsetState, \"symbol-z-offset\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, symbolZOffsetTransitionState, \"symbol-z-offset-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textColorState, \"text-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textColorUseThemeState, \"text-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textColorTransitionState, \"text-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textEmissiveStrengthState, \"text-emissive-strength\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textEmissiveStrengthTransitionState, \"text-emissive-strength-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textHaloBlurState, \"text-halo-blur\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textHaloBlurTransitionState, \"text-halo-blur-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textHaloColorState, \"text-halo-color\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textHaloColorUseThemeState, \"text-halo-color-use-theme\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textHaloColorTransitionState, \"text-halo-color-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textHaloWidthState, \"text-halo-width\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textHaloWidthTransitionState, \"text-halo-width-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textOcclusionOpacityState, \"text-occlusion-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textOcclusionOpacityTransitionState, \"text-occlusion-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textOpacityState, \"text-opacity\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textOpacityTransitionState, \"text-opacity-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textTranslateState, \"text-translate\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textTranslateTransitionState, \"text-translate-transition\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, textTranslateAnchorState, \"text-translate-anchor\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, visibilityState, \"visibility\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, sourceLayerState, \"source-layer\")\n    ActionWhenNotInitial(layerNode.setPropertyAction, filterState, \"filter\")\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/layers/internal/LayerNode.kt",
    "content": "package com.mapbox.maps.extension.compose.style.layers.internal\n\nimport androidx.compose.runtime.Stable\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.internal.LayerPositionAwareNode\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.extension.compose.internal.StyleLifecycleAwareNode\nimport com.mapbox.maps.extension.compose.style.StyleImage\nimport com.mapbox.maps.extension.compose.style.internal.StyleLayerPositionNode\nimport com.mapbox.maps.extension.compose.style.internal.StyleSlotNode\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport kotlinx.coroutines.CoroutineScope\n\n@Stable\ninternal class LayerNode(\n  private val map: MapboxMap,\n  private val layerType: String,\n  private var layerId: String,\n  private var sourceState: SourceState? = null,\n  coroutineScope: CoroutineScope,\n) : LayerPositionAwareNode, StyleLifecycleAwareNode(map, coroutineScope) {\n  private val parameters = hashMapOf(\n    \"id\" to Value(layerId),\n    \"type\" to Value(layerType)\n  ).apply {\n    sourceState?.sourceId?.let {\n      this[\"source\"] = Value(it)\n    }\n  }\n\n  private val addedImages = mutableListOf<String>()\n  private val addedModels = mutableListOf<String>()\n\n  private lateinit var parentNode: MapNode\n\n  override var isAttached: Boolean = false\n\n  override fun onAttached(parent: MapNode) {\n    logD(TAG, \"onAttached: parent=$parent\")\n    super.onAttached(parent)\n    if (parent is StyleSlotNode) {\n      parameters[\"slot\"] = Value(parent.slotName)\n    }\n    parentNode = parent\n    addLayer()\n  }\n\n  override fun onMoved(parent: MapNode) {\n    logD(TAG, \"onMoved\")\n    dispatchWhenReady {\n      it.repositionCurrentNode(parent)\n    }\n  }\n\n  private fun attachSource() {\n    sourceState?.attachToLayer(layerId, map)\n  }\n\n  private fun detachSource() {\n    logD(TAG, \"detaching Source: $this\")\n    sourceState?.detachFromLayer(layerId, map)\n  }\n\n  override fun onRemoved(parent: MapNode) {\n    logD(TAG, \"onRemoved: parent=$parent\")\n    cleanUp()\n    super.onRemoved(parent)\n  }\n\n  override fun onClear() {\n    cleanUp()\n    super.onClear()\n  }\n\n  private fun cleanUp() {\n    removeLayer()\n    detachSource()\n    cleanUpResources()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun cleanUpResources() {\n    addedImages.forEach {\n      map.removeStyleImage(it)\n    }\n    addedImages.clear()\n    addedModels.forEach {\n      map.removeStyleModel(it)\n    }\n    addedModels.clear()\n  }\n\n  private fun addLayer() {\n    logD(TAG, \"Adding layer: $parameters, within parent: $parentNode\")\n    // layer added within the style or slot node, add as non-persistent layer\n    if (parentNode is StyleSlotNode || parentNode is StyleLayerPositionNode) {\n      dispatchWhenReady {\n        val layerPosition = getRelativePositionInfo(parentNode)\n        logD(TAG, \"Adding layer: $parameters, with layer position: $layerPosition\")\n        it.addStyleLayer(\n          parameters = Value(parameters),\n          position = layerPosition\n        ).onError { error ->\n          logW(TAG, \"Failed to add layer: $error\")\n        }.onValue {\n          logD(TAG, \"Added layer: $parameters\")\n          attachSource()\n        }\n        isAttached = true\n      }\n    } else {\n      // layer added outside of the style node, add as persistent layer\n      logD(TAG, \"Adding persistent layer: $parameters\")\n      val layerPosition = getRelativePositionInfo(parentNode)\n      logD(TAG, \"Adding layer: $parameters, with layer position: $layerPosition\")\n      map.addPersistentStyleLayer(\n        properties = Value(parameters),\n        layerPosition = layerPosition\n      ).onError {\n        logW(TAG, \"Failed to add persistent layer: $it\")\n      }.onValue {\n        logD(TAG, \"Added persistent layer: $parameters\")\n        attachSource()\n      }\n      isAttached = true\n    }\n  }\n\n  private fun removeLayer() {\n    logD(TAG, \"Removing layer: $this\")\n    map.removeStyleLayer(layerId).error?.let {\n      logW(\n        TAG,\n        \"Failed to remove $layerType layer $layerId: $it\"\n      )\n    }\n  }\n\n  internal fun updateLayerId(layerId: String) {\n    detachSource()\n    removeLayer()\n    this.layerId = layerId\n    parameters[\"id\"] = Value(layerId)\n    addLayer()\n    attachSource()\n  }\n\n  internal fun updateSource(sourceState: SourceState) {\n    detachSource()\n    removeLayer()\n    this.sourceState = sourceState\n    parameters[\"source\"] = Value(sourceState.sourceId)\n    addLayer()\n    attachSource()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  internal fun addModel(modelInfo: Pair<String, String>) {\n    dispatchWhenReady {\n      it.addStyleModel(modelInfo.first, modelInfo.second)\n        .onError { error ->\n          logW(TAG, \"Failed to add style model $modelInfo: $error\")\n        }.onValue {\n          addedModels.add(modelInfo.first)\n        }\n    }\n  }\n\n  internal fun addImage(styleImage: StyleImage) {\n    dispatchWhenReady {\n      it.addStyleImage(\n        imageId = styleImage.imageId,\n        scale = styleImage.scale ?: it.pixelRatio,\n        image = styleImage.image,\n        sdf = styleImage.sdf,\n        stretchX = styleImage.stretchX,\n        stretchY = styleImage.stretchY,\n        content = styleImage.content\n      ).onError { error ->\n        logW(TAG, \"Failed to add style image $styleImage: $error\")\n      }.onValue {\n        addedImages.add(styleImage.imageId)\n      }\n    }\n  }\n\n  internal fun setProperty(name: String, value: Value) {\n    logD(TAG, \"[$layerType] settingProperty: property=$name, value=$value ...\")\n    if (!isAttached) {\n      logD(TAG, \"setProperty() called before the layer is attached to the map.\")\n      parameters[name] = value\n      return\n    }\n    dispatchWhenReady {\n      parameters[name] = value\n      it.setStyleLayerProperty(layerId, name, value).error?.let { error ->\n        logW(\n          TAG,\n          \"Failed to set $name property as $value on $layerType layer $layerId: $error\"\n        )\n      }\n      logD(TAG, \"[$layerType] setProperty: property=$name, value=$value executed\")\n    }\n  }\n\n  internal val setPropertyAction = ::setProperty\n\n  override fun getLayerIds(): List<String> {\n    return listOf(layerId)\n  }\n\n  override fun toString(): String {\n    return \"LayerNode(layerType=$layerType, parameters=$parameters)\"\n  }\n\n  private companion object {\n    private const val TAG = \"LayerNode\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/lights/LightsState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.lights\n\nimport androidx.compose.runtime.Composable\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState\nimport com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState\nimport com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState\nimport com.mapbox.maps.extension.compose.style.lights.internal.MapboxLight\n\n/**\n * Defines the lights of the style.\n */\npublic class LightsState private constructor(private val mapboxLight: MapboxLight) {\n  /**\n   * Set dynamic light to the style.\n   *\n   * Dynamic light includes one [DirectionalLightState] and one [AmbientLightState].\n   *\n   * Setting light will remove previous defined lights.\n   *\n   * @param [directionalLightState] The directional light to be added\n   * @param [ambientLightState] The ambient light to be added\n   */\n  public constructor(\n    directionalLightState: DirectionalLightState,\n    ambientLightState: AmbientLightState\n  ) : this(MapboxLight.DynamicLight(listOf(directionalLightState), ambientLightState))\n\n  /**\n   * Set the legacy [FlatLightState] to the style.\n   *\n   * Setting light will remove previous defined lights.\n   *\n   * @param flatLightState The legacy flat light to be set.\n   */\n  public constructor(\n    flatLightState: FlatLightState\n  ) : this(MapboxLight.FlatLight(flatLightState))\n\n  @Composable\n  internal fun BindToMap(mapboxMap: MapboxMap) {\n    mapboxLight.BindToMap(mapboxMap)\n  }\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Setting this LightsState does nothing to the map.\n     */\n    @JvmField\n    internal val INITIAL: LightsState = LightsState(MapboxLight.NoOp)\n\n    /**\n     * Setting this [LightsState] restores the default light.\n     */\n    @JvmField\n    public val DEFAULT: LightsState = LightsState(MapboxLight.Default)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/lights/generated/AmbientLightState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.lights.generated\n\nimport android.os.Parcelable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.HoldsValue\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLightId\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.internal.ValueParceler\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport kotlinx.parcelize.Parcelize\nimport kotlinx.parcelize.TypeParceler\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [AmbientLightState] using [Saver].\n * [init] will be called when the [AmbientLightState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param init A function initialise this [AmbientLightState].\n */\n@Composable\npublic inline fun rememberAmbientLightState(\n  id: String = remember {\n    generateRandomLightId(\"ambient\")\n  },\n  key: String? = null,\n  crossinline init: AmbientLightState.() -> Unit = {}\n): AmbientLightState = rememberSaveable(key = key, saver = AmbientLightState.Saver) {\n  AmbientLightState(id).apply(init)\n}\n\n/**\n * An indirect light affecting all objects in the map adding a constant amount of light on them. It has no explicit direction and cannot cast shadows.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/light)\n */\n@Stable\npublic class AmbientLightState internal constructor(\n  /**\n   * The id of the [AmbientLightState].\n   */\n  public val id: String,\n  initialColor: ColorValue = ColorValue.INITIAL,\n  initialColorTransition: Transition = Transition.INITIAL,\n  initialColorUseTheme: StringValue = StringValue.INITIAL,\n  initialIntensity: DoubleValue = DoubleValue.INITIAL,\n  initialIntensityTransition: Transition = Transition.INITIAL,\n) {\n  public constructor(id: String = generateRandomLightId(\"ambient\")) : this(\n    id = id,\n    initialColor = ColorValue.INITIAL,\n    initialColorTransition = Transition.INITIAL,\n    initialColorUseTheme = StringValue.INITIAL,\n    initialIntensity = DoubleValue.INITIAL,\n    initialIntensityTransition = Transition.INITIAL,\n  )\n\n  private val colorState: MutableState<ColorValue> = mutableStateOf(initialColor)\n  private val colorTransitionState: MutableState<Transition> = mutableStateOf(initialColorTransition)\n  private val colorUseThemeState: MutableState<StringValue> = mutableStateOf(initialColorUseTheme)\n  private val intensityState: MutableState<DoubleValue> = mutableStateOf(initialIntensity)\n  private val intensityTransitionState: MutableState<Transition> = mutableStateOf(initialIntensityTransition)\n\n  /**\n   * Color of the ambient light.\n   * Default value: \"#ffffff\".\n   */\n  public var color: ColorValue by colorState\n\n  /**\n   * Defines the transition of [color].\n   * Default value: \"#ffffff\".\n   */\n  public var colorTransition: Transition by colorTransitionState\n\n  /**\n   * Overrides applying of color theme for [color] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var colorUseTheme: StringValue by colorUseThemeState\n\n  /**\n   * A multiplier for the color of the ambient light.\n   * Default value: 0.5. Value range: [0, 1]\n   */\n  public var intensity: DoubleValue by intensityState\n\n  /**\n   * Defines the transition of [intensity].\n   * Default value: 0.5. Value range: [0, 1]\n   */\n  public var intensityTransition: Transition by intensityTransitionState\n\n  @Composable\n  private fun MapboxStyleManager.UpdateLightProperty(\n    state: MutableState<out HoldsValue>,\n    name: String\n  ) {\n    val value = state.value\n    if (value.isNotInitial()) {\n      logD(TAG, \"update Ambient light property: $id, $name, $value\")\n      setStyleLightProperty(id, name, value.value)\n        .onError {\n          logW(TAG, \"update Ambient light property error: $it\")\n        }\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  internal fun getProperties(): HashMap<String, Value> {\n    return hashMapOf(\n      \"id\" to Value(id),\n      \"type\" to Value(\"ambient\"),\n      \"properties\" to Value(\n        hashMapOf<String, Value>().apply {\n          if (color.isNotInitial()) {\n            this[\"color\"] = color.value\n          }\n          if (colorTransition.isNotInitial()) {\n            this[\"color-transition\"] = colorTransition.value\n          }\n          if (colorUseTheme.isNotInitial()) {\n            this[\"color-use-theme\"] = colorUseTheme.value\n          }\n          if (intensity.isNotInitial()) {\n            this[\"intensity\"] = intensity.value\n          }\n          if (intensityTransition.isNotInitial()) {\n            this[\"intensity-transition\"] = intensityTransition.value\n          }\n        }\n      )\n    )\n  }\n\n  @Composable\n  internal fun UpdateProperties(mapboxMap: MapboxMap) {\n    mapboxMap.UpdateLightProperty(colorState, \"color\")\n    mapboxMap.UpdateLightProperty(colorTransitionState, \"color-transition\")\n    mapboxMap.UpdateLightProperty(colorUseThemeState, \"color-use-theme\")\n    mapboxMap.UpdateLightProperty(intensityState, \"intensity\")\n    mapboxMap.UpdateLightProperty(intensityTransitionState, \"intensity-transition\")\n  }\n\n  /**\n   * Overwrite the hashcode for [AmbientLightState].\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun hashCode(): Int {\n    return Objects.hash(\n      color,\n      colorTransition,\n      colorUseTheme,\n      intensity,\n      intensityTransition,\n    )\n  }\n\n  /**\n   * Overwrite the equals for [AmbientLightState].\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as AmbientLightState\n    if (id != other.id) return false\n    if (color != other.color) return false\n    if (colorTransition != other.colorTransition) return false\n    if (colorUseTheme != other.colorUseTheme) return false\n    if (intensity != other.intensity) return false\n    if (intensityTransition != other.intensityTransition) return false\n    return true\n  }\n\n  /**\n   * Overwrite the toString for [AmbientLightState].\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun toString(): String {\n    return \"AmbientLightState(color=$color, colorTransition=$colorTransition, colorUseTheme=$colorUseTheme, intensity=$intensity, intensityTransition=$intensityTransition)\"\n  }\n\n  /**\n   * [AmbientLightState] Holder class to be used within [Saver].\n   *\n   * @param savedProperties properties to be saved.\n   */\n  @Parcelize\n  @TypeParceler<Value, ValueParceler>\n  public data class Holder(\n    val savedProperties: Map<String, Value>,\n  ) : Parcelable\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    private const val TAG = \"AmbientLightState\"\n\n    /**\n     * The default saver implementation for [AmbientLightState].\n     */\n    public val Saver: Saver<AmbientLightState, Holder> = Saver(\n      save = { ambientLightState ->\n        Holder(ambientLightState.getProperties()).also {\n          logD(TAG, \"save: $it\")\n        }\n      },\n      restore = { holder ->\n        logD(TAG, \"restore: $holder\")\n        val id: String = holder.savedProperties[\"id\"]!!.contents as String\n        @Suppress(\"UNCHECKED_CAST\")\n        val properties: Map<String, Value> = holder.savedProperties[\"properties\"]!!.contents as HashMap<String, Value>\n        AmbientLightState(\n          id = id,\n          initialColor = properties[\"color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          initialColorTransition = properties[\"color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          initialColorUseTheme = properties[\"color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          initialIntensity = properties[\"intensity\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          initialIntensityTransition = properties[\"intensity-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/lights/generated/DirectionalLightState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.lights.generated\n\nimport android.os.Parcelable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.HoldsValue\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLightId\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.internal.ValueParceler\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport kotlinx.parcelize.Parcelize\nimport kotlinx.parcelize.TypeParceler\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [DirectionalLightState] using [Saver].\n * [init] will be called when the [DirectionalLightState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param init A function initialise this [DirectionalLightState].\n */\n@Composable\npublic inline fun rememberDirectionalLightState(\n  id: String = remember {\n    generateRandomLightId(\"directional\")\n  },\n  key: String? = null,\n  crossinline init: DirectionalLightState.() -> Unit = {}\n): DirectionalLightState = rememberSaveable(key = key, saver = DirectionalLightState.Saver) {\n  DirectionalLightState(id).apply(init)\n}\n\n/**\n * A light that has a direction and is located at infinite distance, so its rays are parallel. It simulates the sun light and can cast shadows.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/light)\n */\n@Stable\npublic class DirectionalLightState internal constructor(\n  /**\n   * The id of the [DirectionalLightState].\n   */\n  public val id: String,\n  initialCastShadows: BooleanValue = BooleanValue.INITIAL,\n  initialColor: ColorValue = ColorValue.INITIAL,\n  initialColorTransition: Transition = Transition.INITIAL,\n  initialColorUseTheme: StringValue = StringValue.INITIAL,\n  initialDirection: DoubleListValue = DoubleListValue.INITIAL,\n  initialDirectionTransition: Transition = Transition.INITIAL,\n  initialIntensity: DoubleValue = DoubleValue.INITIAL,\n  initialIntensityTransition: Transition = Transition.INITIAL,\n  initialShadowDrawBeforeLayer: StringValue = StringValue.INITIAL,\n  initialShadowIntensity: DoubleValue = DoubleValue.INITIAL,\n  initialShadowIntensityTransition: Transition = Transition.INITIAL,\n) {\n  public constructor(id: String = generateRandomLightId(\"directional\")) : this(\n    id = id,\n    initialCastShadows = BooleanValue.INITIAL,\n    initialColor = ColorValue.INITIAL,\n    initialColorTransition = Transition.INITIAL,\n    initialColorUseTheme = StringValue.INITIAL,\n    initialDirection = DoubleListValue.INITIAL,\n    initialDirectionTransition = Transition.INITIAL,\n    initialIntensity = DoubleValue.INITIAL,\n    initialIntensityTransition = Transition.INITIAL,\n    initialShadowDrawBeforeLayer = StringValue.INITIAL,\n    initialShadowIntensity = DoubleValue.INITIAL,\n    initialShadowIntensityTransition = Transition.INITIAL,\n  )\n\n  private val castShadowsState: MutableState<BooleanValue> = mutableStateOf(initialCastShadows)\n  private val colorState: MutableState<ColorValue> = mutableStateOf(initialColor)\n  private val colorTransitionState: MutableState<Transition> = mutableStateOf(initialColorTransition)\n  private val colorUseThemeState: MutableState<StringValue> = mutableStateOf(initialColorUseTheme)\n  private val directionState: MutableState<DoubleListValue> = mutableStateOf(initialDirection)\n  private val directionTransitionState: MutableState<Transition> = mutableStateOf(initialDirectionTransition)\n  private val intensityState: MutableState<DoubleValue> = mutableStateOf(initialIntensity)\n  private val intensityTransitionState: MutableState<Transition> = mutableStateOf(initialIntensityTransition)\n  private val shadowDrawBeforeLayerState: MutableState<StringValue> = mutableStateOf(initialShadowDrawBeforeLayer)\n  private val shadowIntensityState: MutableState<DoubleValue> = mutableStateOf(initialShadowIntensity)\n  private val shadowIntensityTransitionState: MutableState<Transition> = mutableStateOf(initialShadowIntensityTransition)\n\n  /**\n   * Enable/Disable shadow casting for this light\n   * Default value: false.\n   */\n  public var castShadows: BooleanValue by castShadowsState\n\n  /**\n   * Color of the directional light.\n   * Default value: \"#ffffff\".\n   */\n  public var color: ColorValue by colorState\n\n  /**\n   * Defines the transition of [color].\n   * Default value: \"#ffffff\".\n   */\n  public var colorTransition: Transition by colorTransitionState\n\n  /**\n   * Overrides applying of color theme for [color] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var colorUseTheme: StringValue by colorUseThemeState\n\n  /**\n   * Direction of the light source specified as [a azimuthal angle, p polar angle] where a indicates\n   * the azimuthal angle of the light relative to north (in degrees and proceeding clockwise), and p\n   * indicates polar angle of the light (from 0 degree, directly above, to 180 degree, directly below).\n   * Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n   */\n  public var direction: DoubleListValue by directionState\n\n  /**\n   * Defines the transition of [direction].\n   * Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n   */\n  public var directionTransition: Transition by directionTransitionState\n\n  /**\n   * A multiplier for the color of the directional light.\n   * Default value: 0.5. Value range: [0, 1]\n   */\n  public var intensity: DoubleValue by intensityState\n\n  /**\n   * Defines the transition of [intensity].\n   * Default value: 0.5. Value range: [0, 1]\n   */\n  public var intensityTransition: Transition by intensityTransitionState\n\n  /**\n   * Specify a layer before which shadows are drawn on the ground. If not specified, shadows are\n   * drawn after the last 3D layer. This property does not affect shadows on terrain.\n   */\n  @MapboxExperimental\n  public var shadowDrawBeforeLayer: StringValue by shadowDrawBeforeLayerState\n\n  /**\n   * Determines the shadow strength, affecting the shadow receiver surfaces final color. Values near 0.0 reduce the\n   * shadow contribution to the final color. Values near to 1.0 make occluded surfaces receive almost no\n   * directional light. Designed to be used mostly for transitioning between values 0 and 1.\n   * Default value: 1. Value range: [0, 1]\n   */\n  public var shadowIntensity: DoubleValue by shadowIntensityState\n\n  /**\n   * Defines the transition of [shadowIntensity].\n   * Default value: 1. Value range: [0, 1]\n   */\n  public var shadowIntensityTransition: Transition by shadowIntensityTransitionState\n\n  @Composable\n  private fun MapboxStyleManager.UpdateLightProperty(\n    state: MutableState<out HoldsValue>,\n    name: String\n  ) {\n    val value = state.value\n    if (value.isNotInitial()) {\n      logD(TAG, \"update Directional light property: $id, $name, $value\")\n      setStyleLightProperty(id, name, value.value)\n        .onError {\n          logW(TAG, \"update Directional light property error: $it\")\n        }\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  internal fun getProperties(): HashMap<String, Value> {\n    return hashMapOf(\n      \"id\" to Value(id),\n      \"type\" to Value(\"directional\"),\n      \"properties\" to Value(\n        hashMapOf<String, Value>().apply {\n          if (castShadows.isNotInitial()) {\n            this[\"cast-shadows\"] = castShadows.value\n          }\n          if (color.isNotInitial()) {\n            this[\"color\"] = color.value\n          }\n          if (colorTransition.isNotInitial()) {\n            this[\"color-transition\"] = colorTransition.value\n          }\n          if (colorUseTheme.isNotInitial()) {\n            this[\"color-use-theme\"] = colorUseTheme.value\n          }\n          if (direction.isNotInitial()) {\n            this[\"direction\"] = direction.value\n          }\n          if (directionTransition.isNotInitial()) {\n            this[\"direction-transition\"] = directionTransition.value\n          }\n          if (intensity.isNotInitial()) {\n            this[\"intensity\"] = intensity.value\n          }\n          if (intensityTransition.isNotInitial()) {\n            this[\"intensity-transition\"] = intensityTransition.value\n          }\n          if (shadowDrawBeforeLayer.isNotInitial()) {\n            this[\"shadow-draw-before-layer\"] = shadowDrawBeforeLayer.value\n          }\n          if (shadowIntensity.isNotInitial()) {\n            this[\"shadow-intensity\"] = shadowIntensity.value\n          }\n          if (shadowIntensityTransition.isNotInitial()) {\n            this[\"shadow-intensity-transition\"] = shadowIntensityTransition.value\n          }\n        }\n      )\n    )\n  }\n\n  @Composable\n  internal fun UpdateProperties(mapboxMap: MapboxMap) {\n    mapboxMap.UpdateLightProperty(castShadowsState, \"cast-shadows\")\n    mapboxMap.UpdateLightProperty(colorState, \"color\")\n    mapboxMap.UpdateLightProperty(colorTransitionState, \"color-transition\")\n    mapboxMap.UpdateLightProperty(colorUseThemeState, \"color-use-theme\")\n    mapboxMap.UpdateLightProperty(directionState, \"direction\")\n    mapboxMap.UpdateLightProperty(directionTransitionState, \"direction-transition\")\n    mapboxMap.UpdateLightProperty(intensityState, \"intensity\")\n    mapboxMap.UpdateLightProperty(intensityTransitionState, \"intensity-transition\")\n    mapboxMap.UpdateLightProperty(shadowDrawBeforeLayerState, \"shadow-draw-before-layer\")\n    mapboxMap.UpdateLightProperty(shadowIntensityState, \"shadow-intensity\")\n    mapboxMap.UpdateLightProperty(shadowIntensityTransitionState, \"shadow-intensity-transition\")\n  }\n\n  /**\n   * Overwrite the hashcode for [DirectionalLightState].\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun hashCode(): Int {\n    return Objects.hash(\n      castShadows,\n      color,\n      colorTransition,\n      colorUseTheme,\n      direction,\n      directionTransition,\n      intensity,\n      intensityTransition,\n      shadowDrawBeforeLayer,\n      shadowIntensity,\n      shadowIntensityTransition,\n    )\n  }\n\n  /**\n   * Overwrite the equals for [DirectionalLightState].\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as DirectionalLightState\n    if (id != other.id) return false\n    if (castShadows != other.castShadows) return false\n    if (color != other.color) return false\n    if (colorTransition != other.colorTransition) return false\n    if (colorUseTheme != other.colorUseTheme) return false\n    if (direction != other.direction) return false\n    if (directionTransition != other.directionTransition) return false\n    if (intensity != other.intensity) return false\n    if (intensityTransition != other.intensityTransition) return false\n    if (shadowDrawBeforeLayer != other.shadowDrawBeforeLayer) return false\n    if (shadowIntensity != other.shadowIntensity) return false\n    if (shadowIntensityTransition != other.shadowIntensityTransition) return false\n    return true\n  }\n\n  /**\n   * Overwrite the toString for [DirectionalLightState].\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun toString(): String {\n    return \"DirectionalLightState(castShadows=$castShadows, color=$color, colorTransition=$colorTransition, colorUseTheme=$colorUseTheme, direction=$direction, directionTransition=$directionTransition, intensity=$intensity, intensityTransition=$intensityTransition, shadowDrawBeforeLayer=$shadowDrawBeforeLayer, shadowIntensity=$shadowIntensity, shadowIntensityTransition=$shadowIntensityTransition)\"\n  }\n\n  /**\n   * [DirectionalLightState] Holder class to be used within [Saver].\n   *\n   * @param savedProperties properties to be saved.\n   */\n  @Parcelize\n  @TypeParceler<Value, ValueParceler>\n  public data class Holder(\n    val savedProperties: Map<String, Value>,\n  ) : Parcelable\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    private const val TAG = \"DirectionalLightState\"\n\n    /**\n     * The default saver implementation for [DirectionalLightState].\n     */\n    public val Saver: Saver<DirectionalLightState, Holder> = Saver(\n      save = { directionalLightState ->\n        Holder(directionalLightState.getProperties()).also {\n          logD(TAG, \"save: $it\")\n        }\n      },\n      restore = { holder ->\n        logD(TAG, \"restore: $holder\")\n        val id: String = holder.savedProperties[\"id\"]!!.contents as String\n        @Suppress(\"UNCHECKED_CAST\")\n        val properties: Map<String, Value> = holder.savedProperties[\"properties\"]!!.contents as HashMap<String, Value>\n        DirectionalLightState(\n          id = id,\n          initialCastShadows = properties[\"cast-shadows\"]?.let { BooleanValue(it) } ?: BooleanValue.INITIAL,\n          initialColor = properties[\"color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          initialColorTransition = properties[\"color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          initialColorUseTheme = properties[\"color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          initialDirection = properties[\"direction\"]?.let { DoubleListValue(it) } ?: DoubleListValue.INITIAL,\n          initialDirectionTransition = properties[\"direction-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          initialIntensity = properties[\"intensity\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          initialIntensityTransition = properties[\"intensity-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          initialShadowDrawBeforeLayer = properties[\"shadow-draw-before-layer\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          initialShadowIntensity = properties[\"shadow-intensity\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          initialShadowIntensityTransition = properties[\"shadow-intensity-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/lights/generated/FlatLightState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.lights.generated\n\nimport android.os.Parcelable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.HoldsValue\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomLightId\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.internal.ValueParceler\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logW\nimport kotlinx.parcelize.Parcelize\nimport kotlinx.parcelize.TypeParceler\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [FlatLightState] using [Saver].\n * [init] will be called when the [FlatLightState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param init A function initialise this [FlatLightState].\n */\n@Composable\npublic inline fun rememberFlatLightState(\n  id: String = remember {\n    generateRandomLightId(\"flat\")\n  },\n  key: String? = null,\n  crossinline init: FlatLightState.() -> Unit = {}\n): FlatLightState = rememberSaveable(key = key, saver = FlatLightState.Saver) {\n  FlatLightState(id).apply(init)\n}\n\n/**\n * A global directional light source which is only applied on 3D and hillshade layers. Using this type disables other light sources.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/light)\n */\n@Stable\npublic class FlatLightState internal constructor(\n  /**\n   * The id of the [FlatLightState].\n   */\n  public val id: String,\n  initialAnchor: AnchorValue = AnchorValue.INITIAL,\n  initialColor: ColorValue = ColorValue.INITIAL,\n  initialColorTransition: Transition = Transition.INITIAL,\n  initialColorUseTheme: StringValue = StringValue.INITIAL,\n  initialIntensity: DoubleValue = DoubleValue.INITIAL,\n  initialIntensityTransition: Transition = Transition.INITIAL,\n  initialPosition: DoubleListValue = DoubleListValue.INITIAL,\n  initialPositionTransition: Transition = Transition.INITIAL,\n) {\n  public constructor(id: String = generateRandomLightId(\"flat\")) : this(\n    id = id,\n    initialAnchor = AnchorValue.INITIAL,\n    initialColor = ColorValue.INITIAL,\n    initialColorTransition = Transition.INITIAL,\n    initialColorUseTheme = StringValue.INITIAL,\n    initialIntensity = DoubleValue.INITIAL,\n    initialIntensityTransition = Transition.INITIAL,\n    initialPosition = DoubleListValue.INITIAL,\n    initialPositionTransition = Transition.INITIAL,\n  )\n\n  private val anchorState: MutableState<AnchorValue> = mutableStateOf(initialAnchor)\n  private val colorState: MutableState<ColorValue> = mutableStateOf(initialColor)\n  private val colorTransitionState: MutableState<Transition> = mutableStateOf(initialColorTransition)\n  private val colorUseThemeState: MutableState<StringValue> = mutableStateOf(initialColorUseTheme)\n  private val intensityState: MutableState<DoubleValue> = mutableStateOf(initialIntensity)\n  private val intensityTransitionState: MutableState<Transition> = mutableStateOf(initialIntensityTransition)\n  private val positionState: MutableState<DoubleListValue> = mutableStateOf(initialPosition)\n  private val positionTransitionState: MutableState<Transition> = mutableStateOf(initialPositionTransition)\n\n  /**\n   * Whether extruded geometries are lit relative to the map or viewport.\n   * Default value: \"viewport\".\n   */\n  public var anchor: AnchorValue by anchorState\n\n  /**\n   * Color tint for lighting extruded geometries.\n   * Default value: \"#ffffff\".\n   */\n  public var color: ColorValue by colorState\n\n  /**\n   * Defines the transition of [color].\n   * Default value: \"#ffffff\".\n   */\n  public var colorTransition: Transition by colorTransitionState\n\n  /**\n   * Overrides applying of color theme for [color] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var colorUseTheme: StringValue by colorUseThemeState\n\n  /**\n   * Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more\n   * extreme contrast.\n   * Default value: 0.5. Value range: [0, 1]\n   */\n  public var intensity: DoubleValue by intensityState\n\n  /**\n   * Defines the transition of [intensity].\n   * Default value: 0.5. Value range: [0, 1]\n   */\n  public var intensityTransition: Transition by intensityTransitionState\n\n  /**\n   * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal\n   * angle, p polar angle] where r indicates the distance from the center of the base of\n   * an object to its light, a indicates the position of the light relative to 0 degree (0 degree\n   * when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when\n   * `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates\n   * the height of the light (from 0 degree, directly above, to 180 degree, directly below).\n   * Default value: [1.15,210,30].\n   */\n  public var position: DoubleListValue by positionState\n\n  /**\n   * Defines the transition of [position].\n   * Default value: [1.15,210,30].\n   */\n  public var positionTransition: Transition by positionTransitionState\n\n  @Composable\n  private fun MapboxStyleManager.UpdateLightProperty(\n    state: MutableState<out HoldsValue>,\n    name: String\n  ) {\n    val value = state.value\n    if (value.isNotInitial()) {\n      logD(TAG, \"update Flat light property: $id, $name, $value\")\n      setStyleLightProperty(id, name, value.value)\n        .onError {\n          logW(TAG, \"update Flat light property error: $it\")\n        }\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  internal fun getProperties(): HashMap<String, Value> {\n    return hashMapOf(\n      \"id\" to Value(id),\n      \"type\" to Value(\"flat\"),\n      \"properties\" to Value(\n        hashMapOf<String, Value>().apply {\n          if (anchor.isNotInitial()) {\n            this[\"anchor\"] = anchor.value\n          }\n          if (color.isNotInitial()) {\n            this[\"color\"] = color.value\n          }\n          if (colorTransition.isNotInitial()) {\n            this[\"color-transition\"] = colorTransition.value\n          }\n          if (colorUseTheme.isNotInitial()) {\n            this[\"color-use-theme\"] = colorUseTheme.value\n          }\n          if (intensity.isNotInitial()) {\n            this[\"intensity\"] = intensity.value\n          }\n          if (intensityTransition.isNotInitial()) {\n            this[\"intensity-transition\"] = intensityTransition.value\n          }\n          if (position.isNotInitial()) {\n            this[\"position\"] = position.value\n          }\n          if (positionTransition.isNotInitial()) {\n            this[\"position-transition\"] = positionTransition.value\n          }\n        }\n      )\n    )\n  }\n\n  @Composable\n  internal fun UpdateProperties(mapboxMap: MapboxMap) {\n    mapboxMap.UpdateLightProperty(anchorState, \"anchor\")\n    mapboxMap.UpdateLightProperty(colorState, \"color\")\n    mapboxMap.UpdateLightProperty(colorTransitionState, \"color-transition\")\n    mapboxMap.UpdateLightProperty(colorUseThemeState, \"color-use-theme\")\n    mapboxMap.UpdateLightProperty(intensityState, \"intensity\")\n    mapboxMap.UpdateLightProperty(intensityTransitionState, \"intensity-transition\")\n    mapboxMap.UpdateLightProperty(positionState, \"position\")\n    mapboxMap.UpdateLightProperty(positionTransitionState, \"position-transition\")\n  }\n\n  /**\n   * Overwrite the hashcode for [FlatLightState].\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun hashCode(): Int {\n    return Objects.hash(\n      anchor,\n      color,\n      colorTransition,\n      colorUseTheme,\n      intensity,\n      intensityTransition,\n      position,\n      positionTransition,\n    )\n  }\n\n  /**\n   * Overwrite the equals for [FlatLightState].\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as FlatLightState\n    if (id != other.id) return false\n    if (anchor != other.anchor) return false\n    if (color != other.color) return false\n    if (colorTransition != other.colorTransition) return false\n    if (colorUseTheme != other.colorUseTheme) return false\n    if (intensity != other.intensity) return false\n    if (intensityTransition != other.intensityTransition) return false\n    if (position != other.position) return false\n    if (positionTransition != other.positionTransition) return false\n    return true\n  }\n\n  /**\n   * Overwrite the toString for [FlatLightState].\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun toString(): String {\n    return \"FlatLightState(anchor=$anchor, color=$color, colorTransition=$colorTransition, colorUseTheme=$colorUseTheme, intensity=$intensity, intensityTransition=$intensityTransition, position=$position, positionTransition=$positionTransition)\"\n  }\n\n  /**\n   * [FlatLightState] Holder class to be used within [Saver].\n   *\n   * @param savedProperties properties to be saved.\n   */\n  @Parcelize\n  @TypeParceler<Value, ValueParceler>\n  public data class Holder(\n    val savedProperties: Map<String, Value>,\n  ) : Parcelable\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    private const val TAG = \"FlatLightState\"\n\n    /**\n     * The default saver implementation for [FlatLightState].\n     */\n    public val Saver: Saver<FlatLightState, Holder> = Saver(\n      save = { flatLightState ->\n        Holder(flatLightState.getProperties()).also {\n          logD(TAG, \"save: $it\")\n        }\n      },\n      restore = { holder ->\n        logD(TAG, \"restore: $holder\")\n        val id: String = holder.savedProperties[\"id\"]!!.contents as String\n        @Suppress(\"UNCHECKED_CAST\")\n        val properties: Map<String, Value> = holder.savedProperties[\"properties\"]!!.contents as HashMap<String, Value>\n        FlatLightState(\n          id = id,\n          initialAnchor = properties[\"anchor\"]?.let { AnchorValue(it) } ?: AnchorValue.INITIAL,\n          initialColor = properties[\"color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          initialColorTransition = properties[\"color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          initialColorUseTheme = properties[\"color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          initialIntensity = properties[\"intensity\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          initialIntensityTransition = properties[\"intensity-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          initialPosition = properties[\"position\"]?.let { DoubleListValue(it) } ?: DoubleListValue.INITIAL,\n          initialPositionTransition = properties[\"position-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/lights/generated/LightsProperties.kt",
    "content": "// ktlint-disable filename\n// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.lights.generated\n\nimport androidx.annotation.RestrictTo\nimport androidx.compose.runtime.Immutable\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.compose.style.HoldsValue\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\n\n/**\n *  Whether extruded geometries are lit relative to the map or viewport. Default value: \"viewport\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class AnchorValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the Anchor with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Default value for [AnchorValue], setting default will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: AnchorValue = AnchorValue(Value.nullValue())\n\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: AnchorValue = AnchorValue(Value.nullValue())\n\n    /**\n     * The position of the light source is aligned to the rotation of the map.\n     */\n    @JvmField\n    public val MAP: AnchorValue = AnchorValue(Value(\"map\"))\n\n    /**\n     * The position of the light source is aligned to the rotation of the viewport. If terrain is enabled, performance regressions may occur in certain scenarios, particularly on lower-end hardware. Ensure that you test your target scenarios on the appropriate hardware to verify performance.\n     */\n    @JvmField\n    public val VIEWPORT: AnchorValue = AnchorValue(Value(\"viewport\"))\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/lights/internal/MapboxLight.kt",
    "content": "package com.mapbox.maps.extension.compose.style.lights.internal\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.style.lights.generated.AmbientLightState\nimport com.mapbox.maps.extension.compose.style.lights.generated.DirectionalLightState\nimport com.mapbox.maps.extension.compose.style.lights.generated.FlatLightState\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\n\ninternal sealed class MapboxLight {\n  internal class DynamicLight(\n    private val directionalLightState: List<DirectionalLightState>,\n    private val ambientLightState: AmbientLightState\n  ) : MapboxLight() {\n    @Composable\n    override fun BindToMap(mapboxMap: MapboxMap) {\n      LaunchedEffect(mapboxMap) {\n        val lights =\n          directionalLightState.map { Value(it.getProperties()) } + Value(ambientLightState.getProperties())\n        mapboxMap.setStyleLights(Value(lights))\n          .onError {\n            logE(TAG, \"setStyleLights error: $it\")\n          }\n          .onValue {\n            logD(TAG, \"setStyleLights: $lights\")\n          }\n      }\n      directionalLightState.forEach {\n        it.UpdateProperties(mapboxMap = mapboxMap)\n      }\n      ambientLightState.UpdateProperties(mapboxMap = mapboxMap)\n    }\n  }\n\n  internal class FlatLight(private val flatLightState: FlatLightState) : MapboxLight() {\n    @Composable\n    override fun BindToMap(mapboxMap: MapboxMap) {\n      LaunchedEffect(mapboxMap) {\n        val lights = listOf(Value(flatLightState.getProperties()))\n        mapboxMap.setStyleLights(Value(lights))\n          .onError {\n            logE(TAG, \"setStyleLights error: $it\")\n          }\n          .onValue {\n            logD(TAG, \"setStyleLights: $lights\")\n          }\n      }\n      flatLightState.UpdateProperties(mapboxMap = mapboxMap)\n    }\n  }\n\n  object Default : MapboxLight() {\n    @Composable\n    override fun BindToMap(mapboxMap: MapboxMap) {\n      LaunchedEffect(mapboxMap) {\n        mapboxMap.setStyleLights(Value.nullValue())\n          .onError {\n            logE(TAG, \"setStyleLights error: $it\")\n          }\n          .onValue {\n            logD(TAG, \"setStyleLights: null\")\n          }\n      }\n    }\n  }\n\n  object NoOp : MapboxLight() {\n    @Composable\n    override fun BindToMap(mapboxMap: MapboxMap) {\n      // no-op\n    }\n  }\n\n  @Composable\n  internal abstract fun BindToMap(mapboxMap: MapboxMap)\n\n  private companion object {\n    private const val TAG = \"MapboxLight\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/precipitations/RainStateApplier.kt",
    "content": "package com.mapbox.maps.extension.compose.style.precipitations\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.style.precipitations.generated.removeRain\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.launch\nimport java.util.Objects\n\n/**\n * A [MutableStateFlow] to keep the latest value for the Property\n */\ninternal typealias PropertyValueFlow = MutableStateFlow<Value>\n\n@MapboxExperimental\ninternal class RainStateApplier internal constructor(\n  initialProperties: Map<String, Value>,\n  private val coroutineScope: CoroutineScope = CoroutineScope(\n    Dispatchers.Main.immediate + SupervisorJob() + CoroutineName(\n      \"RainStateScope\"\n    )\n  ),\n  internal val enabled: Boolean\n) {\n  private var propertiesUpdateJobs: MutableList<Job> = mutableListOf()\n  private var rainSet = false\n\n  /**\n   *  A shared flow to keep track of each property own flow ([PropertyValueFlow]).\n   *  Every time a new [Pair] is emitted in this flow we will start collecting its flow\n   *  ([PropertyValueFlow]), see [startCollectingPropertyFlows].\n   */\n  private val propertiesFlowsToCollect =\n    MutableSharedFlow<Pair<String, PropertyValueFlow>>(replay = Channel.UNLIMITED)\n\n  init {\n    initialProperties.forEach {\n      setProperty(it.key, it.value)\n    }\n  }\n\n  internal fun attachTo(mapboxMap: MapboxMap) {\n    if (!enabled) {\n      mapboxMap.removeRain()\n      return\n    }\n    val replayCache = propertiesFlowsToCollect.replayCache\n    if (replayCache.isNotEmpty()) {\n      logD(TAG, \"Adding rain: $this\")\n      mapboxMap.setStyleRain(\n        properties = Value(\n          hashMapOf<String, Value>().also { map ->\n            // Get the most recent list of properties and their values\n            map.putAll(replayCache.associate { it.first to it.second.value })\n            logD(TAG, \"Setting all properties in one go: $map\")\n          }\n        ),\n      ).onError {\n        logE(TAG, \"Failed to add rain: $it\")\n      }.onValue {\n        logD(TAG, \"Added rain: $this\")\n        rainSet = true\n      }\n    }\n    startCollectingPropertyFlows(mapboxMap)\n  }\n\n  private fun startCollectingPropertyFlows(mapboxMap: MapboxMap) {\n    val collectNewPropertiesJob = coroutineScope.launch {\n      propertiesFlowsToCollect.collect { (name: String, valueFlow: PropertyValueFlow) ->\n        val updatePropertyJob = coroutineScope.launch {\n          valueFlow.collect { value ->\n            logD(TAG, \"settingProperty: name=$name, value=$value ...\")\n            mapboxMap.setStyleRainProperty(name, value)\n              .onError { error ->\n                // handle the use case of changing rain e.g. for Standard style\n                // and explicitly adding it so that applying property could take effect\n                if (!rainSet) {\n                  mapboxMap.setStyleRain(Value.valueOf(hashMapOf())).onValue {\n                    rainSet = true\n                    mapboxMap.setStyleRainProperty(name, value).onError {\n                      logW(TAG, \"Failed to set rain property $name as $value: $error\")\n                    }.onValue {\n                      logD(TAG, \"settingProperty: name=$name, value=$value executed\")\n                    }\n                  }.onError {\n                    logW(TAG, \"Failed to set rain with no properties, error = $it\")\n                    logI(TAG, \"settingProperty: name=$name, value=$value ignored\")\n                  }\n                } else {\n                  logW(TAG, \"Failed to set rain property $name as $value: $error\")\n                }\n              }.onValue {\n                logD(TAG, \"settingProperty: name=$name, value=$value executed\")\n              }\n          }\n        }\n        propertiesUpdateJobs.add(updatePropertyJob)\n      }\n    }\n    propertiesUpdateJobs.add(collectNewPropertiesJob)\n  }\n\n  internal fun detach() {\n    // Stop any collect job that changes the source properties\n    propertiesUpdateJobs.forEach(Job::cancel)\n    propertiesUpdateJobs.clear()\n  }\n\n  internal fun setProperty(name: String, value: Value) {\n    logD(TAG, \"setProperty() called with: name = $name, value = $value\")\n    val setOfFlows = propertiesFlowsToCollect.replayCache\n    val currentFlow: Pair<String, MutableStateFlow<Value>>? = setOfFlows.firstOrNull {\n      it.first == name\n    }\n    if (currentFlow != null) {\n      currentFlow.second.value = value\n    } else {\n      logD(TAG, \"setProperty: emitting new property to listen to: $name\")\n      // Add the new property to the set of property flows we want to collect\n      propertiesFlowsToCollect.tryEmit(name to MutableStateFlow(value))\n    }\n  }\n\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as RainStateApplier\n\n    val thisProperties =\n      propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    val otherProperties =\n      other.propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    if (thisProperties != otherProperties) return false\n\n    return rainSet == other.rainSet\n  }\n\n  override fun hashCode(): Int {\n    val thisProperties =\n      propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    return Objects.hash(rainSet, thisProperties)\n  }\n\n  private companion object {\n    private const val TAG = \"RainStateApplier\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/precipitations/SnowStateApplier.kt",
    "content": "package com.mapbox.maps.extension.compose.style.precipitations\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.style.precipitations.generated.removeSnow\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.launch\nimport java.util.Objects\n\n@MapboxExperimental\ninternal class SnowStateApplier internal constructor(\n  initialProperties: Map<String, Value>,\n  private val coroutineScope: CoroutineScope = CoroutineScope(\n    Dispatchers.Main.immediate + SupervisorJob() + CoroutineName(\n      \"SnowStateScope\"\n    )\n  ),\n  internal val enabled: Boolean\n) {\n  private var propertiesUpdateJobs: MutableList<Job> = mutableListOf()\n  private var snowSet = false\n\n  /**\n   *  A shared flow to keep track of each property own flow ([PropertyValueFlow]).\n   *  Every time a new [Pair] is emitted in this flow we will start collecting its flow\n   *  ([PropertyValueFlow]), see [startCollectingPropertyFlows].\n   */\n  private val propertiesFlowsToCollect =\n    MutableSharedFlow<Pair<String, PropertyValueFlow>>(replay = Channel.UNLIMITED)\n\n  init {\n    initialProperties.forEach {\n      setProperty(it.key, it.value)\n    }\n  }\n\n  internal fun attachTo(mapboxMap: MapboxMap) {\n    if (!enabled) {\n      mapboxMap.removeSnow()\n      return\n    }\n\n    val replayCache = propertiesFlowsToCollect.replayCache\n    if (replayCache.isNotEmpty()) {\n      logD(TAG, \"Adding snow: $this\")\n      mapboxMap.setStyleSnow(\n        properties = Value(\n          hashMapOf<String, Value>().also { map ->\n            // Get the most recent list of properties and their values\n            map.putAll(replayCache.associate { it.first to it.second.value })\n            logD(TAG, \"Setting all properties in one go: $map\")\n          }\n        ),\n      ).onError {\n        logE(TAG, \"Failed to add snow: $it\")\n      }.onValue {\n        logD(TAG, \"Added snow: $this\")\n        snowSet = true\n      }\n    }\n    startCollectingPropertyFlows(mapboxMap)\n  }\n\n  private fun startCollectingPropertyFlows(mapboxMap: MapboxMap) {\n    val collectNewPropertiesJob = coroutineScope.launch {\n      propertiesFlowsToCollect.collect { (name: String, valueFlow: PropertyValueFlow) ->\n        val updatePropertyJob = coroutineScope.launch {\n          valueFlow.collect { value ->\n            logD(TAG, \"settingProperty: name=$name, value=$value ...\")\n            mapboxMap.setStyleSnowProperty(name, value)\n              .onError { error ->\n                // handle the use case of changing snow e.g. for Standard style\n                // and explicitly adding it so that applying property could take effect\n                if (!snowSet) {\n                  mapboxMap.setStyleSnow(Value.valueOf(hashMapOf())).onValue {\n                    snowSet = true\n                    mapboxMap.setStyleSnowProperty(name, value).onError {\n                      logW(TAG, \"Failed to set snow property $name as $value: $error\")\n                    }.onValue {\n                      logD(TAG, \"settingProperty: name=$name, value=$value executed\")\n                    }\n                  }.onError {\n                    logW(TAG, \"Failed to set snow with no properties, error = $it\")\n                    logW(TAG, \"settingProperty: name=$name, value=$value ignored\")\n                  }\n                } else {\n                  logW(TAG, \"Failed to set snow property $name as $value: $error\")\n                }\n              }.onValue {\n                logD(TAG, \"settingProperty: name=$name, value=$value executed\")\n              }\n          }\n        }\n        propertiesUpdateJobs.add(updatePropertyJob)\n      }\n    }\n    propertiesUpdateJobs.add(collectNewPropertiesJob)\n  }\n\n  internal fun detach() {\n    // Stop any collect job that changes the source properties\n    propertiesUpdateJobs.forEach(Job::cancel)\n    propertiesUpdateJobs.clear()\n  }\n\n  internal fun setProperty(name: String, value: Value) {\n    logD(TAG, \"setProperty() called with: name = $name, value = $value\")\n    val setOfFlows = propertiesFlowsToCollect.replayCache\n    val currentFlow: Pair<String, MutableStateFlow<Value>>? = setOfFlows.firstOrNull {\n      it.first == name\n    }\n    if (currentFlow != null) {\n      currentFlow.second.value = value\n    } else {\n      logD(TAG, \"setProperty: emitting new property to listen to: $name\")\n      // Add the new property to the set of property flows we want to collect\n      propertiesFlowsToCollect.tryEmit(name to MutableStateFlow(value))\n    }\n  }\n\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as SnowStateApplier\n\n    val thisProperties =\n      propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    val otherProperties =\n      other.propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    if (thisProperties != otherProperties) return false\n\n    return snowSet == other.snowSet\n  }\n\n  override fun hashCode(): Int {\n    val thisProperties =\n      propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    return Objects.hash(snowSet, thisProperties)\n  }\n\n  private companion object {\n    private const val TAG = \"SnowStateApplier\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/precipitations/generated/RainState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.precipitations.generated\n\nimport android.os.Parcelable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.internal.ValueParceler\nimport com.mapbox.maps.extension.compose.style.precipitations.RainStateApplier\nimport kotlinx.parcelize.Parcelize\nimport kotlinx.parcelize.TypeParceler\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [RainState] using [RainState.Saver].\n * [init] will be called when the [RainState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param init A function initialise this [RainState].\n */\n@Composable\n@MapboxExperimental\npublic inline fun rememberRainState(\n  key: String? = null,\n  crossinline init: RainState.() -> Unit = {}\n): RainState = rememberSaveable(key = key, saver = RainState.Saver) {\n  RainState().apply(init)\n}\n\n/**\n * The Rain effects applied to the style.\n */\n@Stable\n@MapboxExperimental\npublic class RainState private constructor(\n  internal val applier: RainStateApplier,\n  centerThinning: DoubleValue,\n  centerThinningTransition: Transition,\n  color: ColorValue,\n  colorTransition: Transition,\n  colorUseTheme: StringValue,\n  density: DoubleValue,\n  densityTransition: Transition,\n  direction: DoubleListValue,\n  directionTransition: Transition,\n  distortionStrength: DoubleValue,\n  distortionStrengthTransition: Transition,\n  dropletSize: DoubleListValue,\n  dropletSizeTransition: Transition,\n  intensity: DoubleValue,\n  intensityTransition: Transition,\n  opacity: DoubleValue,\n  opacityTransition: Transition,\n  vignette: DoubleValue,\n  vignetteColor: ColorValue,\n  vignetteColorTransition: Transition,\n  vignetteColorUseTheme: StringValue,\n  vignetteTransition: Transition,\n) {\n  public constructor() : this(enabled = true)\n\n  private constructor(enabled: Boolean) : this(\n    RainStateApplier(emptyMap(), enabled = enabled),\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    ColorValue.INITIAL,\n    Transition.INITIAL,\n    StringValue.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleListValue.INITIAL,\n    Transition.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleListValue.INITIAL,\n    Transition.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleValue.INITIAL,\n    ColorValue.INITIAL,\n    Transition.INITIAL,\n    StringValue.INITIAL,\n    Transition.INITIAL,\n  )\n\n  private val centerThinningState: MutableState<DoubleValue> = mutableStateOf(centerThinning)\n\n  /**\n   * Thinning factor of rain particles from center. 0 - no thinning. 1 - maximal central area\n   * thinning.\n   * Default value: 0.57. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var centerThinning: DoubleValue by centerThinningState\n\n  private val centerThinningTransitionState: MutableState<Transition> = mutableStateOf(centerThinningTransition)\n\n  /**\n   * Defines the transition of [centerThinning].\n   * Default value: 0.57. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var centerThinningTransition: Transition by centerThinningTransitionState\n\n  private val colorState: MutableState<ColorValue> = mutableStateOf(color)\n\n  /**\n   * Individual rain particle dorplets color.\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   */\n  @MapboxExperimental\n  public var color: ColorValue by colorState\n\n  private val colorTransitionState: MutableState<Transition> = mutableStateOf(colorTransition)\n\n  /**\n   * Defines the transition of [color].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   */\n  @MapboxExperimental\n  public var colorTransition: Transition by colorTransitionState\n\n  private val colorUseThemeState: MutableState<StringValue> = mutableStateOf(colorUseTheme)\n\n  /**\n   * Overrides applying of color theme for [color] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var colorUseTheme: StringValue by colorUseThemeState\n\n  private val densityState: MutableState<DoubleValue> = mutableStateOf(density)\n\n  /**\n   * Rain particles density. Controls the overall screen density of the rain.\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var density: DoubleValue by densityState\n\n  private val densityTransitionState: MutableState<Transition> = mutableStateOf(densityTransition)\n\n  /**\n   * Defines the transition of [density].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var densityTransition: Transition by densityTransitionState\n\n  private val directionState: MutableState<DoubleListValue> = mutableStateOf(direction)\n\n  /**\n   * Main rain particles direction. Azimuth and polar angles.\n   * Default value: [0,80]. Value range: [0, 360]\n   */\n  @MapboxExperimental\n  public var direction: DoubleListValue by directionState\n\n  private val directionTransitionState: MutableState<Transition> = mutableStateOf(directionTransition)\n\n  /**\n   * Defines the transition of [direction].\n   * Default value: [0,80]. Value range: [0, 360]\n   */\n  @MapboxExperimental\n  public var directionTransition: Transition by directionTransitionState\n\n  private val distortionStrengthState: MutableState<DoubleValue> = mutableStateOf(distortionStrength)\n\n  /**\n   * Rain particles screen-space distortion strength.\n   * Default value: 0.7. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var distortionStrength: DoubleValue by distortionStrengthState\n\n  private val distortionStrengthTransitionState: MutableState<Transition> = mutableStateOf(distortionStrengthTransition)\n\n  /**\n   * Defines the transition of [distortionStrength].\n   * Default value: 0.7. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var distortionStrengthTransition: Transition by distortionStrengthTransitionState\n\n  private val dropletSizeState: MutableState<DoubleListValue> = mutableStateOf(dropletSize)\n\n  /**\n   * Rain droplet size. x - normal to direction, y - along direction\n   * Default value: [2.6,18.2]. Value range: [0, 50]\n   */\n  @MapboxExperimental\n  public var dropletSize: DoubleListValue by dropletSizeState\n\n  private val dropletSizeTransitionState: MutableState<Transition> = mutableStateOf(dropletSizeTransition)\n\n  /**\n   * Defines the transition of [dropletSize].\n   * Default value: [2.6,18.2]. Value range: [0, 50]\n   */\n  @MapboxExperimental\n  public var dropletSizeTransition: Transition by dropletSizeTransitionState\n\n  private val intensityState: MutableState<DoubleValue> = mutableStateOf(intensity)\n\n  /**\n   * Rain particles movement factor. Controls the overall rain particles speed\n   * Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var intensity: DoubleValue by intensityState\n\n  private val intensityTransitionState: MutableState<Transition> = mutableStateOf(intensityTransition)\n\n  /**\n   * Defines the transition of [intensity].\n   * Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var intensityTransition: Transition by intensityTransitionState\n\n  private val opacityState: MutableState<DoubleValue> = mutableStateOf(opacity)\n\n  /**\n   * Rain particles opacity.\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var opacity: DoubleValue by opacityState\n\n  private val opacityTransitionState: MutableState<Transition> = mutableStateOf(opacityTransition)\n\n  /**\n   * Defines the transition of [opacity].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var opacityTransition: Transition by opacityTransitionState\n\n  private val vignetteState: MutableState<DoubleValue> = mutableStateOf(vignette)\n\n  /**\n   * Screen-space vignette rain tinting effect intensity.\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var vignette: DoubleValue by vignetteState\n\n  private val vignetteColorState: MutableState<ColorValue> = mutableStateOf(vignetteColor)\n\n  /**\n   * Rain vignette screen-space corners tint color.\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   */\n  @MapboxExperimental\n  public var vignetteColor: ColorValue by vignetteColorState\n\n  private val vignetteColorTransitionState: MutableState<Transition> = mutableStateOf(vignetteColorTransition)\n\n  /**\n   * Defines the transition of [vignetteColor].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   */\n  @MapboxExperimental\n  public var vignetteColorTransition: Transition by vignetteColorTransitionState\n\n  private val vignetteColorUseThemeState: MutableState<StringValue> = mutableStateOf(vignetteColorUseTheme)\n\n  /**\n   * Overrides applying of color theme for [vignetteColor] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var vignetteColorUseTheme: StringValue by vignetteColorUseThemeState\n\n  private val vignetteTransitionState: MutableState<Transition> = mutableStateOf(vignetteTransition)\n\n  /**\n   * Defines the transition of [vignette].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var vignetteTransition: Transition by vignetteTransitionState\n\n  @Composable\n  internal fun UpdateProperties() {\n    val action = applier::setProperty\n    ActionWhenNotInitial(action, centerThinningState, \"center-thinning\")\n    ActionWhenNotInitial(action, centerThinningTransitionState, \"center-thinning-transition\")\n    ActionWhenNotInitial(action, colorState, \"color\")\n    ActionWhenNotInitial(action, colorTransitionState, \"color-transition\")\n    ActionWhenNotInitial(action, colorUseThemeState, \"color-use-theme\")\n    ActionWhenNotInitial(action, densityState, \"density\")\n    ActionWhenNotInitial(action, densityTransitionState, \"density-transition\")\n    ActionWhenNotInitial(action, directionState, \"direction\")\n    ActionWhenNotInitial(action, directionTransitionState, \"direction-transition\")\n    ActionWhenNotInitial(action, distortionStrengthState, \"distortion-strength\")\n    ActionWhenNotInitial(action, distortionStrengthTransitionState, \"distortion-strength-transition\")\n    ActionWhenNotInitial(action, dropletSizeState, \"droplet-size\")\n    ActionWhenNotInitial(action, dropletSizeTransitionState, \"droplet-size-transition\")\n    ActionWhenNotInitial(action, intensityState, \"intensity\")\n    ActionWhenNotInitial(action, intensityTransitionState, \"intensity-transition\")\n    ActionWhenNotInitial(action, opacityState, \"opacity\")\n    ActionWhenNotInitial(action, opacityTransitionState, \"opacity-transition\")\n    ActionWhenNotInitial(action, vignetteState, \"vignette\")\n    ActionWhenNotInitial(action, vignetteColorState, \"vignette-color\")\n    ActionWhenNotInitial(action, vignetteColorTransitionState, \"vignette-color-transition\")\n    ActionWhenNotInitial(action, vignetteColorUseThemeState, \"vignette-color-use-theme\")\n    ActionWhenNotInitial(action, vignetteTransitionState, \"vignette-transition\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"center-thinning\" to centerThinning.value).takeIf { centerThinning.isNotInitial() },\n      (\"center-thinning-transition\" to centerThinningTransition.value).takeIf { centerThinningTransition.isNotInitial() },\n      (\"color\" to color.value).takeIf { color.isNotInitial() },\n      (\"color-transition\" to colorTransition.value).takeIf { colorTransition.isNotInitial() },\n      (\"color-use-theme\" to colorUseTheme.value).takeIf { colorUseTheme.isNotInitial() },\n      (\"density\" to density.value).takeIf { density.isNotInitial() },\n      (\"density-transition\" to densityTransition.value).takeIf { densityTransition.isNotInitial() },\n      (\"direction\" to direction.value).takeIf { direction.isNotInitial() },\n      (\"direction-transition\" to directionTransition.value).takeIf { directionTransition.isNotInitial() },\n      (\"distortion-strength\" to distortionStrength.value).takeIf { distortionStrength.isNotInitial() },\n      (\"distortion-strength-transition\" to distortionStrengthTransition.value).takeIf { distortionStrengthTransition.isNotInitial() },\n      (\"droplet-size\" to dropletSize.value).takeIf { dropletSize.isNotInitial() },\n      (\"droplet-size-transition\" to dropletSizeTransition.value).takeIf { dropletSizeTransition.isNotInitial() },\n      (\"intensity\" to intensity.value).takeIf { intensity.isNotInitial() },\n      (\"intensity-transition\" to intensityTransition.value).takeIf { intensityTransition.isNotInitial() },\n      (\"opacity\" to opacity.value).takeIf { opacity.isNotInitial() },\n      (\"opacity-transition\" to opacityTransition.value).takeIf { opacityTransition.isNotInitial() },\n      (\"vignette\" to vignette.value).takeIf { vignette.isNotInitial() },\n      (\"vignette-color\" to vignetteColor.value).takeIf { vignetteColor.isNotInitial() },\n      (\"vignette-color-transition\" to vignetteColorTransition.value).takeIf { vignetteColorTransition.isNotInitial() },\n      (\"vignette-color-use-theme\" to vignetteColorUseTheme.value).takeIf { vignetteColorUseTheme.isNotInitial() },\n      (\"vignette-transition\" to vignetteTransition.value).takeIf { vignetteTransition.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as RainState\n\n    if (applier != other.applier) return false\n    if (centerThinning != other.centerThinning) return false\n    if (centerThinningTransition != other.centerThinningTransition) return false\n    if (color != other.color) return false\n    if (colorTransition != other.colorTransition) return false\n    if (colorUseTheme != other.colorUseTheme) return false\n    if (density != other.density) return false\n    if (densityTransition != other.densityTransition) return false\n    if (direction != other.direction) return false\n    if (directionTransition != other.directionTransition) return false\n    if (distortionStrength != other.distortionStrength) return false\n    if (distortionStrengthTransition != other.distortionStrengthTransition) return false\n    if (dropletSize != other.dropletSize) return false\n    if (dropletSizeTransition != other.dropletSizeTransition) return false\n    if (intensity != other.intensity) return false\n    if (intensityTransition != other.intensityTransition) return false\n    if (opacity != other.opacity) return false\n    if (opacityTransition != other.opacityTransition) return false\n    if (vignette != other.vignette) return false\n    if (vignetteColor != other.vignetteColor) return false\n    if (vignetteColorTransition != other.vignetteColorTransition) return false\n    if (vignetteColorUseTheme != other.vignetteColorUseTheme) return false\n    if (vignetteTransition != other.vignetteTransition) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int = Objects.hash(\n    applier,\n    centerThinning,\n    centerThinningTransition,\n    color,\n    colorTransition,\n    colorUseTheme,\n    density,\n    densityTransition,\n    direction,\n    directionTransition,\n    distortionStrength,\n    distortionStrengthTransition,\n    dropletSize,\n    dropletSizeTransition,\n    intensity,\n    intensityTransition,\n    opacity,\n    opacityTransition,\n    vignette,\n    vignetteColor,\n    vignetteColorTransition,\n    vignetteColorUseTheme,\n    vignetteTransition,\n  )\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String =\n    \"RainState(centerThinning=$centerThinning, centerThinningTransition=$centerThinningTransition, color=$color, colorTransition=$colorTransition, colorUseTheme=$colorUseTheme, density=$density, densityTransition=$densityTransition, direction=$direction, directionTransition=$directionTransition, distortionStrength=$distortionStrength, distortionStrengthTransition=$distortionStrengthTransition, dropletSize=$dropletSize, dropletSizeTransition=$dropletSizeTransition, intensity=$intensity, intensityTransition=$intensityTransition, opacity=$opacity, opacityTransition=$opacityTransition, vignette=$vignette, vignetteColor=$vignetteColor, vignetteColorTransition=$vignetteColorTransition, vignetteColorUseTheme=$vignetteColorUseTheme, vignetteTransition=$vignetteTransition)\"\n\n  /**\n   * Rain Holder class to be used within [Saver].\n   */\n  @Parcelize\n  @TypeParceler<Value, ValueParceler>\n  public data class Holder internal constructor(\n    /**\n     * Saved properties.\n     * Note that we use a generic [Map] to be able to evolve this class without breaking changes.\n     */\n    val savedProperties: Map<String, Value>,\n    /**\n     * Indicating if the RainState is enabled.\n     */\n    val enabled: Boolean\n  ) : Parcelable\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [RainState]\n     */\n    public val Saver: Saver<RainState, Holder> = Saver(\n      save = { Holder(it.getProperties(), it.applier.enabled) },\n      restore = { holder ->\n        RainState(\n          RainStateApplier(holder.savedProperties, enabled = holder.enabled),\n          centerThinning = holder.savedProperties[\"center-thinning\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          centerThinningTransition = holder.savedProperties[\"center-thinning-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          color = holder.savedProperties[\"color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          colorTransition = holder.savedProperties[\"color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          colorUseTheme = holder.savedProperties[\"color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          density = holder.savedProperties[\"density\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          densityTransition = holder.savedProperties[\"density-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          direction = holder.savedProperties[\"direction\"]?.let { DoubleListValue(it) } ?: DoubleListValue.INITIAL,\n          directionTransition = holder.savedProperties[\"direction-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          distortionStrength = holder.savedProperties[\"distortion-strength\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          distortionStrengthTransition = holder.savedProperties[\"distortion-strength-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          dropletSize = holder.savedProperties[\"droplet-size\"]?.let { DoubleListValue(it) } ?: DoubleListValue.INITIAL,\n          dropletSizeTransition = holder.savedProperties[\"droplet-size-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          intensity = holder.savedProperties[\"intensity\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          intensityTransition = holder.savedProperties[\"intensity-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          opacity = holder.savedProperties[\"opacity\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          opacityTransition = holder.savedProperties[\"opacity-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          vignette = holder.savedProperties[\"vignette\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          vignetteColor = holder.savedProperties[\"vignette-color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          vignetteColorTransition = holder.savedProperties[\"vignette-color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          vignetteColorUseTheme = holder.savedProperties[\"vignette-color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          vignetteTransition = holder.savedProperties[\"vignette-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n        )\n      }\n    )\n\n    /**\n     * Disabled value for [RainState], setting disabled will result in removing rain effect.\n     */\n    @JvmField\n    public val DISABLED: RainState = RainState(enabled = false)\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/precipitations/generated/SnowState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.precipitations.generated\n\nimport android.os.Parcelable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.internal.ValueParceler\nimport com.mapbox.maps.extension.compose.style.precipitations.SnowStateApplier\nimport kotlinx.parcelize.Parcelize\nimport kotlinx.parcelize.TypeParceler\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [SnowState] using [SnowState.Saver].\n * [init] will be called when the [SnowState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param init A function initialise this [SnowState].\n */\n@Composable\n@MapboxExperimental\npublic inline fun rememberSnowState(\n  key: String? = null,\n  crossinline init: SnowState.() -> Unit = {}\n): SnowState = rememberSaveable(key = key, saver = SnowState.Saver) {\n  SnowState().apply(init)\n}\n\n/**\n * The Snow effects applied to the style.\n */\n@Stable\n@MapboxExperimental\npublic class SnowState private constructor(\n  internal val applier: SnowStateApplier,\n  centerThinning: DoubleValue,\n  centerThinningTransition: Transition,\n  color: ColorValue,\n  colorTransition: Transition,\n  colorUseTheme: StringValue,\n  density: DoubleValue,\n  densityTransition: Transition,\n  direction: DoubleListValue,\n  directionTransition: Transition,\n  flakeSize: DoubleValue,\n  flakeSizeTransition: Transition,\n  intensity: DoubleValue,\n  intensityTransition: Transition,\n  opacity: DoubleValue,\n  opacityTransition: Transition,\n  vignette: DoubleValue,\n  vignetteColor: ColorValue,\n  vignetteColorTransition: Transition,\n  vignetteColorUseTheme: StringValue,\n  vignetteTransition: Transition,\n) {\n  public constructor() : this(enabled = true)\n\n  private constructor(enabled: Boolean) : this(\n    SnowStateApplier(emptyMap(), enabled = enabled),\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    ColorValue.INITIAL,\n    Transition.INITIAL,\n    StringValue.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleListValue.INITIAL,\n    Transition.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n    DoubleValue.INITIAL,\n    ColorValue.INITIAL,\n    Transition.INITIAL,\n    StringValue.INITIAL,\n    Transition.INITIAL,\n  )\n\n  private val centerThinningState: MutableState<DoubleValue> = mutableStateOf(centerThinning)\n\n  /**\n   * Thinning factor of snow particles from center. 0 - no thinning. 1 - maximal central area\n   * thinning.\n   * Default value: 0.4. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var centerThinning: DoubleValue by centerThinningState\n\n  private val centerThinningTransitionState: MutableState<Transition> = mutableStateOf(centerThinningTransition)\n\n  /**\n   * Defines the transition of [centerThinning].\n   * Default value: 0.4. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var centerThinningTransition: Transition by centerThinningTransitionState\n\n  private val colorState: MutableState<ColorValue> = mutableStateOf(color)\n\n  /**\n   * Snow particles color.\n   * Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  public var color: ColorValue by colorState\n\n  private val colorTransitionState: MutableState<Transition> = mutableStateOf(colorTransition)\n\n  /**\n   * Defines the transition of [color].\n   * Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  public var colorTransition: Transition by colorTransitionState\n\n  private val colorUseThemeState: MutableState<StringValue> = mutableStateOf(colorUseTheme)\n\n  /**\n   * Overrides applying of color theme for [color] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var colorUseTheme: StringValue by colorUseThemeState\n\n  private val densityState: MutableState<DoubleValue> = mutableStateOf(density)\n\n  /**\n   * Snow particles density. Controls the overall particles number.\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var density: DoubleValue by densityState\n\n  private val densityTransitionState: MutableState<Transition> = mutableStateOf(densityTransition)\n\n  /**\n   * Defines the transition of [density].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var densityTransition: Transition by densityTransitionState\n\n  private val directionState: MutableState<DoubleListValue> = mutableStateOf(direction)\n\n  /**\n   * Main snow particles direction. Azimuth and polar angles\n   * Default value: [0,50]. Value range: [0, 360]\n   */\n  @MapboxExperimental\n  public var direction: DoubleListValue by directionState\n\n  private val directionTransitionState: MutableState<Transition> = mutableStateOf(directionTransition)\n\n  /**\n   * Defines the transition of [direction].\n   * Default value: [0,50]. Value range: [0, 360]\n   */\n  @MapboxExperimental\n  public var directionTransition: Transition by directionTransitionState\n\n  private val flakeSizeState: MutableState<DoubleValue> = mutableStateOf(flakeSize)\n\n  /**\n   * Snow flake particle size. Correlates with individual particle screen size\n   * Default value: 0.71. Value range: [0, 5]\n   */\n  @MapboxExperimental\n  public var flakeSize: DoubleValue by flakeSizeState\n\n  private val flakeSizeTransitionState: MutableState<Transition> = mutableStateOf(flakeSizeTransition)\n\n  /**\n   * Defines the transition of [flakeSize].\n   * Default value: 0.71. Value range: [0, 5]\n   */\n  @MapboxExperimental\n  public var flakeSizeTransition: Transition by flakeSizeTransitionState\n\n  private val intensityState: MutableState<DoubleValue> = mutableStateOf(intensity)\n\n  /**\n   * Snow particles movement factor. Controls the overall particles movement speed.\n   * Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var intensity: DoubleValue by intensityState\n\n  private val intensityTransitionState: MutableState<Transition> = mutableStateOf(intensityTransition)\n\n  /**\n   * Defines the transition of [intensity].\n   * Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var intensityTransition: Transition by intensityTransitionState\n\n  private val opacityState: MutableState<DoubleValue> = mutableStateOf(opacity)\n\n  /**\n   * Snow particles opacity.\n   * Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var opacity: DoubleValue by opacityState\n\n  private val opacityTransitionState: MutableState<Transition> = mutableStateOf(opacityTransition)\n\n  /**\n   * Defines the transition of [opacity].\n   * Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var opacityTransition: Transition by opacityTransitionState\n\n  private val vignetteState: MutableState<DoubleValue> = mutableStateOf(vignette)\n\n  /**\n   * Snow vignette screen-space effect. Adds snow tint to screen corners\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var vignette: DoubleValue by vignetteState\n\n  private val vignetteColorState: MutableState<ColorValue> = mutableStateOf(vignetteColor)\n\n  /**\n   * Snow vignette screen-space corners tint color.\n   * Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  public var vignetteColor: ColorValue by vignetteColorState\n\n  private val vignetteColorTransitionState: MutableState<Transition> = mutableStateOf(vignetteColorTransition)\n\n  /**\n   * Defines the transition of [vignetteColor].\n   * Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  public var vignetteColorTransition: Transition by vignetteColorTransitionState\n\n  private val vignetteColorUseThemeState: MutableState<StringValue> = mutableStateOf(vignetteColorUseTheme)\n\n  /**\n   * Overrides applying of color theme for [vignetteColor] if \"none\" is set. To follow default theme \"default\"\n   * should be set.\n   * Default value: \"default\".\n   */\n  @MapboxExperimental\n  public var vignetteColorUseTheme: StringValue by vignetteColorUseThemeState\n\n  private val vignetteTransitionState: MutableState<Transition> = mutableStateOf(vignetteTransition)\n\n  /**\n   * Defines the transition of [vignette].\n   * Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  public var vignetteTransition: Transition by vignetteTransitionState\n\n  @Composable\n  internal fun UpdateProperties() {\n    val action = applier::setProperty\n    ActionWhenNotInitial(action, centerThinningState, \"center-thinning\")\n    ActionWhenNotInitial(action, centerThinningTransitionState, \"center-thinning-transition\")\n    ActionWhenNotInitial(action, colorState, \"color\")\n    ActionWhenNotInitial(action, colorTransitionState, \"color-transition\")\n    ActionWhenNotInitial(action, colorUseThemeState, \"color-use-theme\")\n    ActionWhenNotInitial(action, densityState, \"density\")\n    ActionWhenNotInitial(action, densityTransitionState, \"density-transition\")\n    ActionWhenNotInitial(action, directionState, \"direction\")\n    ActionWhenNotInitial(action, directionTransitionState, \"direction-transition\")\n    ActionWhenNotInitial(action, flakeSizeState, \"flake-size\")\n    ActionWhenNotInitial(action, flakeSizeTransitionState, \"flake-size-transition\")\n    ActionWhenNotInitial(action, intensityState, \"intensity\")\n    ActionWhenNotInitial(action, intensityTransitionState, \"intensity-transition\")\n    ActionWhenNotInitial(action, opacityState, \"opacity\")\n    ActionWhenNotInitial(action, opacityTransitionState, \"opacity-transition\")\n    ActionWhenNotInitial(action, vignetteState, \"vignette\")\n    ActionWhenNotInitial(action, vignetteColorState, \"vignette-color\")\n    ActionWhenNotInitial(action, vignetteColorTransitionState, \"vignette-color-transition\")\n    ActionWhenNotInitial(action, vignetteColorUseThemeState, \"vignette-color-use-theme\")\n    ActionWhenNotInitial(action, vignetteTransitionState, \"vignette-transition\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"center-thinning\" to centerThinning.value).takeIf { centerThinning.isNotInitial() },\n      (\"center-thinning-transition\" to centerThinningTransition.value).takeIf { centerThinningTransition.isNotInitial() },\n      (\"color\" to color.value).takeIf { color.isNotInitial() },\n      (\"color-transition\" to colorTransition.value).takeIf { colorTransition.isNotInitial() },\n      (\"color-use-theme\" to colorUseTheme.value).takeIf { colorUseTheme.isNotInitial() },\n      (\"density\" to density.value).takeIf { density.isNotInitial() },\n      (\"density-transition\" to densityTransition.value).takeIf { densityTransition.isNotInitial() },\n      (\"direction\" to direction.value).takeIf { direction.isNotInitial() },\n      (\"direction-transition\" to directionTransition.value).takeIf { directionTransition.isNotInitial() },\n      (\"flake-size\" to flakeSize.value).takeIf { flakeSize.isNotInitial() },\n      (\"flake-size-transition\" to flakeSizeTransition.value).takeIf { flakeSizeTransition.isNotInitial() },\n      (\"intensity\" to intensity.value).takeIf { intensity.isNotInitial() },\n      (\"intensity-transition\" to intensityTransition.value).takeIf { intensityTransition.isNotInitial() },\n      (\"opacity\" to opacity.value).takeIf { opacity.isNotInitial() },\n      (\"opacity-transition\" to opacityTransition.value).takeIf { opacityTransition.isNotInitial() },\n      (\"vignette\" to vignette.value).takeIf { vignette.isNotInitial() },\n      (\"vignette-color\" to vignetteColor.value).takeIf { vignetteColor.isNotInitial() },\n      (\"vignette-color-transition\" to vignetteColorTransition.value).takeIf { vignetteColorTransition.isNotInitial() },\n      (\"vignette-color-use-theme\" to vignetteColorUseTheme.value).takeIf { vignetteColorUseTheme.isNotInitial() },\n      (\"vignette-transition\" to vignetteTransition.value).takeIf { vignetteTransition.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as SnowState\n\n    if (applier != other.applier) return false\n    if (centerThinning != other.centerThinning) return false\n    if (centerThinningTransition != other.centerThinningTransition) return false\n    if (color != other.color) return false\n    if (colorTransition != other.colorTransition) return false\n    if (colorUseTheme != other.colorUseTheme) return false\n    if (density != other.density) return false\n    if (densityTransition != other.densityTransition) return false\n    if (direction != other.direction) return false\n    if (directionTransition != other.directionTransition) return false\n    if (flakeSize != other.flakeSize) return false\n    if (flakeSizeTransition != other.flakeSizeTransition) return false\n    if (intensity != other.intensity) return false\n    if (intensityTransition != other.intensityTransition) return false\n    if (opacity != other.opacity) return false\n    if (opacityTransition != other.opacityTransition) return false\n    if (vignette != other.vignette) return false\n    if (vignetteColor != other.vignetteColor) return false\n    if (vignetteColorTransition != other.vignetteColorTransition) return false\n    if (vignetteColorUseTheme != other.vignetteColorUseTheme) return false\n    if (vignetteTransition != other.vignetteTransition) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int = Objects.hash(\n    applier,\n    centerThinning,\n    centerThinningTransition,\n    color,\n    colorTransition,\n    colorUseTheme,\n    density,\n    densityTransition,\n    direction,\n    directionTransition,\n    flakeSize,\n    flakeSizeTransition,\n    intensity,\n    intensityTransition,\n    opacity,\n    opacityTransition,\n    vignette,\n    vignetteColor,\n    vignetteColorTransition,\n    vignetteColorUseTheme,\n    vignetteTransition,\n  )\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String =\n    \"SnowState(centerThinning=$centerThinning, centerThinningTransition=$centerThinningTransition, color=$color, colorTransition=$colorTransition, colorUseTheme=$colorUseTheme, density=$density, densityTransition=$densityTransition, direction=$direction, directionTransition=$directionTransition, flakeSize=$flakeSize, flakeSizeTransition=$flakeSizeTransition, intensity=$intensity, intensityTransition=$intensityTransition, opacity=$opacity, opacityTransition=$opacityTransition, vignette=$vignette, vignetteColor=$vignetteColor, vignetteColorTransition=$vignetteColorTransition, vignetteColorUseTheme=$vignetteColorUseTheme, vignetteTransition=$vignetteTransition)\"\n\n  /**\n   * Snow Holder class to be used within [Saver].\n   */\n  @Parcelize\n  @TypeParceler<Value, ValueParceler>\n  public data class Holder internal constructor(\n    /**\n     * Saved properties.\n     * Note that we use a generic [Map] to be able to evolve this class without breaking changes.\n     */\n    val savedProperties: Map<String, Value>,\n    /**\n     * Indicating if the SnowState is enabled.\n     */\n    val enabled: Boolean\n  ) : Parcelable\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [SnowState]\n     */\n    public val Saver: Saver<SnowState, Holder> = Saver(\n      save = { Holder(it.getProperties(), it.applier.enabled) },\n      restore = { holder ->\n        SnowState(\n          SnowStateApplier(holder.savedProperties, enabled = holder.enabled),\n          centerThinning = holder.savedProperties[\"center-thinning\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          centerThinningTransition = holder.savedProperties[\"center-thinning-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          color = holder.savedProperties[\"color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          colorTransition = holder.savedProperties[\"color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          colorUseTheme = holder.savedProperties[\"color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          density = holder.savedProperties[\"density\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          densityTransition = holder.savedProperties[\"density-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          direction = holder.savedProperties[\"direction\"]?.let { DoubleListValue(it) } ?: DoubleListValue.INITIAL,\n          directionTransition = holder.savedProperties[\"direction-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          flakeSize = holder.savedProperties[\"flake-size\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          flakeSizeTransition = holder.savedProperties[\"flake-size-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          intensity = holder.savedProperties[\"intensity\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          intensityTransition = holder.savedProperties[\"intensity-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          opacity = holder.savedProperties[\"opacity\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          opacityTransition = holder.savedProperties[\"opacity-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          vignette = holder.savedProperties[\"vignette\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          vignetteColor = holder.savedProperties[\"vignette-color\"]?.let { ColorValue(it) } ?: ColorValue.INITIAL,\n          vignetteColorTransition = holder.savedProperties[\"vignette-color-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n          vignetteColorUseTheme = holder.savedProperties[\"vignette-color-use-theme\"]?.let { StringValue(it) } ?: StringValue.INITIAL,\n          vignetteTransition = holder.savedProperties[\"vignette-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n        )\n      }\n    )\n\n    /**\n     * Disabled value for [SnowState], setting disabled will result in removing snow effect.\n     */\n    @JvmField\n    public val DISABLED: SnowState = SnowState(enabled = false)\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/projection/generated/Projection.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.projection.generated\n\nimport androidx.compose.runtime.Immutable\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\n\n/**\n * The projection to be used for rendering the map.\n *\n * @param value the [Projection] wrapped in [Value].\n */\n@Immutable\npublic data class Projection internal constructor(\n  public val value: Value\n) {\n\n  private constructor(name: ProjectionName) : this(\n    Value.valueOf(hashMapOf(\"name\" to Value(name.value))),\n  )\n\n  /**\n   * The projection name of the [Projection] or null if the resulted name is not a [String].\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  val projectionNameOrNull: String?\n    get() = (value.contents as? HashMap<String, Value>)?.get(\"name\")?.contents as? String\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  internal val notInitial: Boolean\n    get() = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: Projection = Projection(Value.valueOf(\"Projection.INITIAL\"))\n\n    /**\n     * Default value for [Projection], setting default will result in restoring the property value defined in the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: Projection = Projection(Value.nullValue())\n\n    /**\n     * The Mercator projection is the default projection.\n     */\n    @JvmField\n    public val MERCATOR: Projection = Projection(ProjectionName.MERCATOR)\n\n    /**\n     * A globe projection.\n     */\n    @JvmField\n    public val GLOBE: Projection = Projection(ProjectionName.GLOBE)\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/PropertyTypes.kt",
    "content": "package com.mapbox.maps.extension.compose.style.sources\n\nimport androidx.annotation.RestrictTo\nimport androidx.compose.runtime.Immutable\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.GeoJSONSourceData\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.TileCacheBudgetInTiles\nimport com.mapbox.maps.extension.compose.style.HoldsValue\nimport com.mapbox.maps.extension.compose.style.internal.ComposeTypeUtils\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.sources.generated.ModelSourceModel\nimport com.mapbox.maps.extension.style.sources.generated.RasterArraySource\nimport java.util.Objects\n\n/**\n * Defines properties of 3D models in collection. Each entry maps a model ID to its [ModelSourceModel] configuration,\n * which includes the model URI, position, orientation, and optional material and node overrides.\n * Used with [com.mapbox.maps.extension.compose.style.sources.generated.ModelSourceState].\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class ModelSourceModelsValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [ModelSourceModelsValue] with [HashMap<String, ModelSourceModel>].\n   * The map keys are model IDs used to reference models in feature state or layer properties.\n   */\n  public constructor(value: HashMap<String, ModelSourceModel>) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ModelSourceModelsValue = ModelSourceModelsValue(hashMapOf(\"ModelValue.INITIAL\" to ModelSourceModel.Builder(\"ModelValue.INITIAL\").build()))\n\n    /**\n     * Default value for [ModelSourceModelsValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    internal val DEFAULT: ModelSourceModelsValue = ModelSourceModelsValue(Value.nullValue())\n  }\n}\n\n/**\n * An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from clustered points. Has the form `{\"property_name\": [operator, map_expression]}`. `operator` is any expression function that accepts at least 2 operands (e.g. `\"+\"` or `\"max\"`) — it accumulates the property value from clusters/points the cluster contains; `map_expression` produces the value of a single point.\nExample: `{\"sum\": [\"+\", [\"get\", \"scalerank\"]]}`.\nFor more advanced use cases, in place of `operator`, you can use a custom reduce expression that references a special `[\"accumulated\"]` value, e.g.:\n`{\"sum\": [[\"+\", [\"accumulated\"], [\"get\", \"sum\"]], [\"get\", \"scalerank\"]]}`\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class ClusterProperties(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the ClusterProperties with [HashMap<String, Any>].\n   */\n  public constructor(value: HashMap<String, Any>) : this(ComposeTypeUtils.wrapToValue(value))\n  /**\n   * Construct the ClusterProperties with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ClusterProperties = ClusterProperties(Value(\"ClusterProperties.INITIAL\"))\n\n    /**\n     * Default value for [ClusterProperties], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: ClusterProperties = ClusterProperties(Value.nullValue())\n  }\n}\n\n/**\n * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the tile cache goes over the defined limit, the least recently used tile will be evicted from the in-memory cache. Note that the current implementation does not take into account resources allocated by the visible tiles.\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class TileCacheBudget(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the TileCacheBudget with [TileCacheBudgetInMegabytes].\n   */\n  public constructor(value: TileCacheBudgetInMegabytes) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the TileCacheBudget with [TileCacheBudgetInTiles].\n   */\n  public constructor(value: TileCacheBudgetInTiles) : this(ComposeTypeUtils.wrapToValue(value))\n\n  /**\n   * Construct the TileCacheBudget with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: TileCacheBudget = TileCacheBudget(Value(\"TileCacheBudget.INITIAL\"))\n\n    /**\n     * Default value for [TileCacheBudget], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: TileCacheBudget = TileCacheBudget(Value.nullValue())\n  }\n}\n\n/**\n * Contains the description of the raster data layers and the bands contained within the tiles.\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class RasterLayers(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the RasterLayers with [List<RasterDataLayer>].\n   */\n  public constructor(value: List<RasterArraySource.RasterDataLayer>) : this(\n      ComposeTypeUtils.wrapToValue(\n          value\n      )\n  )\n  /**\n   * Construct the RasterLayers with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: RasterLayers = RasterLayers(Value(\"RasterLayers.INITIAL\"))\n\n    /**\n     * Default value for [RasterLayers], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: RasterLayers = RasterLayers(Value.nullValue())\n  }\n}\n\n/**\n * A property to use as a feature id (for feature state). Either a property name, or an object of\n * the form `{<sourceLayer>: <propertyName>}`:\n * - If specified as a string for a vector tile source\n *   ([com.mapbox.maps.extension.compose.style.sources.generated.VectorSourceState]), the same property is used\n *   across all its source layers.\n * - If specified as an object only specified source layers will have id overridden, others will\n *   fallback to original feature id.\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class PromoteIdValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the [PromoteIdValue] with [propertyName] and optional [sourceId].\n   * - If only [propertyName] is specified then the same property is used across all its source\n   *   layers.\n   * - If both [propertyName] and [sourceId] are given, only specified source layer will have id\n   *   overridden, others will fallback to original feature id.\n   */\n  public constructor(propertyName: String, sourceId: String? = null) : this(\n    ComposeTypeUtils.wrapToValue(\n      com.mapbox.maps.extension.style.types.PromoteId(propertyName, sourceId)\n    )\n  )\n  /**\n   * Construct the PromoteId with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  @JvmOverloads\n  public constructor(expression: Expression, sourceId: String? = null) : this(\n    ComposeTypeUtils.wrapToValue(\n      com.mapbox.maps.extension.style.types.PromoteId(expression, sourceId)\n    )\n  )\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: PromoteIdValue = PromoteIdValue(Value(\"PromoteIdValue.INITIAL\"))\n\n    /**\n     * Default value for [PromoteIdValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: PromoteIdValue = PromoteIdValue(Value.nullValue())\n  }\n}\n\n/**\n * The [GeoJSONData] that drives the [com.mapbox.maps.extension.compose.style.sources.generated.GeoJsonSourceState].\n *\n * @param data the [GeoJSONSourceData] to be used with native renderer.\n */\n@Immutable\npublic data class GeoJSONData(internal val data: GeoJSONSourceData) {\n  /**\n   * Construct the [GeoJSONData] with [String].\n   */\n  public constructor(value: String) : this(GeoJSONSourceData.valueOf(value))\n\n  /**\n   * Construct the [GeoJSONData] with [Feature].\n   */\n  public constructor(value: Feature) : this(GeoJSONSourceData.valueOf(value))\n\n  /**\n   * Construct the [GeoJSONData] with a list of [Feature].\n   */\n  public constructor(value: List<Feature>) : this(GeoJSONSourceData.valueOf(value))\n\n  /**\n   * Construct the [GeoJSONData] with [Geometry].\n   */\n  public constructor(value: Geometry) : this(GeoJSONSourceData.valueOf(value))\n\n  private val dataContents: Any?\n    get() = when (data.typeInfo) {\n      GeoJSONSourceData.Type.FEATURE -> data.feature\n      GeoJSONSourceData.Type.GEOMETRY -> data.geometry\n      GeoJSONSourceData.Type.LIST -> data.list\n      GeoJSONSourceData.Type.STRING -> data.string\n      else -> null\n    }\n\n  /**\n   * Override hashCode method.\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(data.typeInfo, dataContents)\n  }\n\n  /**\n   * Override equals method.\n   */\n  override fun equals(other: Any?): Boolean {\n    return other is GeoJSONData && data.typeInfo == other.data.typeInfo && dataContents == other.dataContents\n  }\n\n  /**\n   * Override toString method.\n   */\n  override fun toString(): String {\n    return when (data.typeInfo) {\n      GeoJSONSourceData.Type.GEOMETRY -> data.geometry.toJson()\n      GeoJSONSourceData.Type.FEATURE -> data.feature.toJson()\n      GeoJSONSourceData.Type.LIST -> data.list.toString()\n      GeoJSONSourceData.Type.STRING -> data.string\n      else -> \"unknown\"\n    }\n  }\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Default value for [GeoJSONData].\n     */\n    @JvmField\n    public val DEFAULT: GeoJSONData = GeoJSONData(\"\")\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/SourceState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.sources\n\nimport android.os.Parcelable\nimport androidx.compose.runtime.Composable\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.style.internal.GeoJSONDataParceler\nimport com.mapbox.maps.extension.compose.style.internal.PairParceler\nimport com.mapbox.maps.extension.compose.style.internal.ValueParceler\nimport com.mapbox.maps.extension.compose.style.sources.generated.GeoJsonSourceState\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.channels.consumeEach\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.launch\nimport kotlinx.parcelize.Parcelize\nimport kotlinx.parcelize.TypeParceler\nimport kotlin.reflect.KFunction2\n\n/**\n * A [MutableStateFlow] to keep the latest value for a Source Property\n */\nprivate typealias PropertyValueFlow = MutableStateFlow<Value>\n\n/**\n * A convenient class to hold various details about the source properties to update.\n */\nprivate data class PropertyDetails(\n  val name: String,\n  val isBuilderProperty: Boolean,\n  val valueFlow: PropertyValueFlow\n)\n\n/**\n * The base class for SourceStates, which handles the attach/detach from the layer,\n * and updating Source properties.\n *\n * @param sourceId The id of the source state.\n * @param sourceType The type of the source in plain text.\n * @param initialProperties The initial mutable properties of the source.\n * @param initialGeoJsonData The initial [GeoJSONData] of the source to be used for [GeoJsonSourceState].\n */\npublic abstract class SourceState internal constructor(\n  public val sourceId: String,\n  private val sourceType: String,\n  initialProperties: Map<String, Pair<Boolean, Value>>,\n  initialGeoJsonData: GeoJSONData = GeoJSONData.DEFAULT\n) {\n  private var mapboxMap: MapboxMap? = null\n  private var associatedLayers: MutableSet<String> = mutableSetOf()\n\n  /**\n   * A [CoroutineScope] that is valid for as long as this source is attached to a map.\n   * See [attachTo].\n   */\n  private var mapboxMapScope: CoroutineScope? = null\n\n  private val isGeoJsonSource = sourceType == GEO_JSON_SOURCE_TYPE\n\n  /**\n   * A [Channel] used to signal that new [GeoJSONData] needs to be processed.\n   * We use channel instead of [MutableStateFlow] because when the source is added to the map we will\n   * force setting the geojson data. It wouldn't be possible with [MutableStateFlow] because its\n   * value would not change, therefore it wouldn't trigger its collection.\n   */\n  private var geoJSONDataChannel: Channel<GeoJSONData> = Channel(Channel.CONFLATED)\n\n  /**\n   * Property to keep the latest [GeoJSONData] for this source.\n   * On set, the new value will be send to [geoJSONDataChannel] for async processing.\n   */\n  protected var geoJSONData: GeoJSONData = initialGeoJsonData\n    set(value) {\n      // We only care about different values\n      if (field != value) {\n        field = value\n        geoJSONDataChannel.trySend(value)\n      }\n    }\n\n  /**\n   *  A shared flow to keep track of each property and builder property flow ([PropertyValueFlow]).\n   *  Every time a new [PropertyDetails] is emitted, we will start\n   *  collecting its [PropertyValueFlow] flow. See [launchCollectPropertyFlows].\n   */\n  private val propertiesFlowsToCollect =\n    MutableSharedFlow<PropertyDetails>(replay = Channel.UNLIMITED)\n\n  /**\n   * If true it means that the source linked with this [SourceState] was already present in the\n   * style or added by some other external mechanism.\n   * Therefore, we should not add it again [attachToLayer] neither remove it in [detachFromLayer].\n   */\n  private var sourceAddedExternally = false\n\n  init {\n    initialProperties.forEach { (name, pair) ->\n      val isBuilderProperty = pair.first\n      val value = pair.second\n      if (isBuilderProperty) {\n        setBuilderProperty(name, value)\n      } else {\n        setProperty(name, value)\n      }\n    }\n  }\n\n  internal fun attachToLayer(layerId: String, mapboxMap: MapboxMap) {\n    logD(TAG, \"$sourceType - $sourceId attachToLayer: layerId=$layerId\")\n    this.mapboxMap?.let {\n      if (it !== mapboxMap) {\n        logW(TAG, \"The source state should not be used across multiple map instances!\")\n      }\n    }\n    this.mapboxMap = mapboxMap\n    // Check if it's the first layer linked to this source and if so attach the source to the map\n    if (associatedLayers.add(layerId) && associatedLayers.size == 1) {\n      attachTo(mapboxMap)\n    }\n  }\n\n  internal fun detachFromLayer(layerId: String, mapboxMap: MapboxMap) {\n    logD(TAG, \"$sourceType $sourceId detachFromLayer: layerId=$layerId\")\n    associatedLayers.remove(layerId)\n    if (associatedLayers.isEmpty() && !sourceAddedExternally) {\n      detachFrom(mapboxMap)\n      this.mapboxMap = null\n    }\n  }\n\n  /**\n   * Try to attach this source for the first time to the given [mapboxMap] and start reacting to the\n   * source properties changes.\n   */\n  private fun attachTo(mapboxMap: MapboxMap) {\n    logD(TAG, \"attachTo() called for $sourceId\")\n    val sourceAdded = if (mapboxMap.styleSourceExists(sourceId)) {\n      /*\n      If the sourceId is already present then it means that either:\n      - the source was already part of the original style\n      - the source was added outside of compose (e.g. MapEffect)\n      - there was a previous SourceState with the same id already added\n       */\n      logW(TAG, \"Source [$sourceId] already exists. This might lead to conflicting states.\")\n      sourceAddedExternally = true\n      true\n    } else {\n      addSource(mapboxMap, emptyMap())\n    }\n\n    // Only if we succeeded to add the source (or was already there)\n    // we start reacting to the various property changes\n    if (sourceAdded) {\n      val coroutineScope =\n        CoroutineScope(Dispatchers.Main.immediate + SupervisorJob() + CoroutineName(\"SourceStateMapboxMapScope_$sourceId\"))\n      mapboxMapScope = coroutineScope\n\n      // Start various coroutines within the new mapboxMapScope coroutine scope\n      if (isGeoJsonSource) {\n        coroutineScope.launchCollectGeoJsonData(mapboxMap)\n      }\n      coroutineScope.launchCollectPropertyFlows(mapboxMap)\n    }\n  }\n\n  /**\n   * Adds this source to the given [mapboxMap] with the most recent values for its properties and\n   * GeoJSONData.\n   *\n   * This method will called from two different places:\n   * 1. The first time the source is added to the map\n   * 2. Whenever a build property changes\n   *\n   * @param cachedProperties a map containing properties that were retrieved from gl-native directly\n   * and need to be merged with the ones in this [SourceState].\n   *\n   * @return false if the source was already added or if it failed to be added.\n   */\n  private fun addSource(mapboxMap: MapboxMap, cachedProperties: Map<String, Value>): Boolean {\n    logD(TAG, \"Adding source: $sourceType - $sourceId\")\n    if (mapboxMap.styleSourceExists(sourceId)) {\n      logW(TAG, \"Source already exists: $sourceId\")\n      throw IllegalStateException(\"Source $sourceId already exists in map $mapboxMap\")\n    }\n    // Merge the cachedProperties from gl-native with the ones we are aware of:\n    val properties: HashMap<String, Value> = HashMap()\n    properties[\"type\"] = Value(sourceType)\n    if (isGeoJsonSource && !cachedProperties.containsKey(\"data\")) {\n      // Initially set the \"data\" to `null` if cachedProperties does not have it.\n      // Below (in `onValue`) we might send the current geoJSONData through the\n      // [geoJSONDataChannel] to make it async.\n      properties[\"data\"] = Value.nullValue()\n    }\n    properties.putAll(cachedProperties)\n    // Get the most recent list of properties (builder or not) and their values\n    properties.putAll(propertiesFlowsToCollect.replayCache.associate { it.name to it.valueFlow.value })\n\n    logD(TAG, \"Setting all properties in one go: $properties\")\n    return mapboxMap.addStyleSource(sourceId, Value.valueOf(properties)).fold(\n      {\n        logE(TAG, \"Failed to add source: $it\")\n        false\n      },\n      {\n        logD(TAG, \"Added source: $sourceType - $sourceId\")\n        if (isGeoJsonSource && geoJSONData != GeoJSONData.DEFAULT) {\n          // Set the GeoJSON data after the source is added\n          // Note that if the source was a pre-existing one outside of compose we will override it\n          geoJSONDataChannel.trySend(geoJSONData)\n        }\n        true\n      }\n    )\n  }\n\n  /**\n   * Launch a coroutine in [Dispatchers.IO] to listen for new [GeoJSONData] to set.\n   */\n  private fun CoroutineScope.launchCollectGeoJsonData(mapboxMap: MapboxMap) =\n    launch(Dispatchers.IO) {\n      geoJSONDataChannel.consumeEach { data ->\n        logD(TAG, \"setGeoJsonSourceData: $data\")\n\n        mapboxMap.setStyleGeoJSONSourceData(\n          sourceId = sourceId,\n          dataId = \"\",\n          data = data.data\n        ).onError {\n          logE(TAG, \"setStyleGeoJSONSourceData failed: $it\")\n        }\n      }\n    }\n\n  /**\n   * Launch a coroutine that will listen for new [PropertyValueFlow] to collect.\n   */\n  private fun CoroutineScope.launchCollectPropertyFlows(mapboxMap: MapboxMap) =\n    launch {\n      // Every time a property changes its value for the first time there will be a new propertyFlow\n      // We start collecting those here\n      propertiesFlowsToCollect.collect { details: PropertyDetails ->\n        launchCollectProperty(details, mapboxMap)\n      }\n    }\n\n  /**\n   * Launch a coroutine to collect property changes for the [PropertyValueFlow] in [details].\n   * We use separate coroutine so we can benefit from backpressure. That is, we only process\n   * the most recent Value per each property.\n   */\n  private fun CoroutineScope.launchCollectProperty(details: PropertyDetails, mapboxMap: MapboxMap) =\n    launch {\n      logD(TAG, \"startCollectingPropertyFlows: start collecting $details\")\n      // Builder property are updated differently than normal ones\n      if (details.isBuilderProperty) {\n        details.valueFlow.collectBuilderProperty(details.name, mapboxMap)\n      } else {\n        details.valueFlow.collectProperty(details.name, mapboxMap)\n      }\n    }\n\n  private suspend fun PropertyValueFlow.collectBuilderProperty(name: String, mapboxMap: MapboxMap) {\n    collect { value ->\n      logD(TAG, \"collectBuilderProperty: name=$name, value=$value ...\")\n      // Before removing the source we request its values from gl-native if it is a Source that was\n      // added outside of compose.\n      val cachedProperties: Map<String, Value> = if (sourceAddedExternally) {\n        mapboxMap.getStyleSourceProperties(sourceId).fold(\n          { error ->\n            logW(TAG, \"Unable to cache $sourceId properties: $error\")\n            emptyMap()\n          },\n          { values ->\n            @Suppress(\"UNCHECKED_CAST\")\n            values.contents as Map<String, Value>\n          }\n        )\n      } else {\n        emptyMap()\n      }\n      removeSource(mapboxMap)\n      // Add source is responsible to collect the new builder property value and set it\n      addSource(mapboxMap, cachedProperties)\n    }\n  }\n\n  private suspend fun PropertyValueFlow.collectProperty(name: String, mapboxMap: MapboxMap) {\n    collect { value ->\n      logD(TAG, \"settingProperty: name=$name, value=$value ...\")\n      mapboxMap.setStyleSourceProperty(sourceId, name, value)\n        .onError { error ->\n          logW(TAG, \"Failed to set source property $name as $value on $sourceId: $error\")\n        }.onValue {\n          logD(TAG, \"settingProperty: name=$name, value=$value executed\")\n        }\n    }\n  }\n\n  /**\n   * Detach this source from the given [mapboxMap].\n   */\n  private fun detachFrom(mapboxMap: MapboxMap) {\n    removeSource(mapboxMap)\n    // Stop any collect job that changes the source properties\n    mapboxMapScope?.cancel()\n\n    if (isGeoJsonSource) {\n      // Canceling above scope also closes the channel.\n      // Create it again to be collected later on attach.\n      geoJSONDataChannel = Channel(capacity = Channel.CONFLATED)\n    }\n  }\n\n  private fun removeSource(mapboxMap: MapboxMap) {\n    logD(TAG, \"Removing $sourceType source: $sourceId\")\n    mapboxMap.removeStyleSourceUnchecked(sourceId).onError {\n      logW(TAG, \"Failed to remove $sourceType Source $sourceId: $it\")\n    }\n  }\n\n  internal fun setProperty(name: String, value: Value) {\n    setProperty(name, value, false)\n  }\n\n  internal fun setBuilderProperty(name: String, value: Value) {\n    setProperty(name, value, true)\n  }\n\n  private fun setProperty(\n    name: String,\n    value: Value,\n    isBuilderProperty: Boolean\n  ) {\n    logD(\n      TAG,\n      \"setProperty() called with: name = $name, value = $value, isBuilderProperty = $isBuilderProperty\"\n    )\n    val setOfFlows = propertiesFlowsToCollect.replayCache\n    val currentFlow: PropertyDetails? = setOfFlows.firstOrNull {\n      it.name == name\n    }\n    if (currentFlow != null) {\n      currentFlow.valueFlow.value = value\n    } else {\n      logD(TAG, \"setProperty: emitting new property to listen to: $name\")\n      // Add the new property to the set of property flows we want to collect\n      val details = PropertyDetails(name, isBuilderProperty, MutableStateFlow(value))\n      propertiesFlowsToCollect.tryEmit(details)\n    }\n  }\n\n  /**\n   * @return the most up-to-date value for the [name] property.\n   */\n  protected fun getProperty(name: String): Value? =\n    propertiesFlowsToCollect.replayCache.firstOrNull {\n      it.name == name\n    }?.valueFlow?.value\n\n  /**\n   * The data class that holds the source state to restore from a Savable.\n   *\n   * @param sourcedId The id of the source state.\n   * @param savedProperties The initial mutable properties of the source.\n   * @param geoJSONData The initial [GeoJSONData] of the source(used only in [GeoJsonSourceState]).\n   */\n  @Parcelize\n  @TypeParceler<GeoJSONData, GeoJSONDataParceler>\n  @TypeParceler<Value, ValueParceler>\n  @TypeParceler<Pair<Boolean, Value>, PairParceler>\n  public data class Holder(\n    val sourcedId: String,\n    val savedProperties: Map<String, Pair<Boolean, Value>>,\n    val geoJSONData: GeoJSONData\n  ) : Parcelable\n\n  /**\n   * Save the current [SourceState] to the [Holder] class.\n   */\n  internal fun save(): Holder = Holder(\n    sourceId,\n    propertiesFlowsToCollect.replayCache.associate { it.name to (it.isBuilderProperty to it.valueFlow.value) },\n    geoJSONData\n  )\n\n  /**\n   * Overrides the toString method to print more meaningful information.\n   */\n  override fun toString(): String {\n    return \"SourceState(sourceType=$sourceType, sourceId=$sourceId)\"\n  }\n\n  @Composable\n  internal abstract fun UpdateProperties()\n\n  protected val setBuilderPropertyAction: KFunction2<String, Value, Unit> = ::setBuilderProperty\n  protected val setPropertyAction: KFunction2<String, Value, Unit> = ::setProperty\n\n  private companion object {\n    private const val TAG = \"SourceState\"\n    private const val GEO_JSON_SOURCE_TYPE = \"geojson\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/generated/GeoJsonSourceState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.sources.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomSourceId\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.sources.ClusterProperties\nimport com.mapbox.maps.extension.compose.style.sources.GeoJSONData\nimport com.mapbox.maps.extension.compose.style.sources.PromoteIdValue\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\nimport com.mapbox.maps.extension.compose.style.sources.TileCacheBudget\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [GeoJsonSourceState] using [GeoJsonSourceState.Saver].\n * [init] will be called when the [GeoJsonSourceState] is first created to configure its\n * initial state.\n *\n * This API should be used with caution as saving large inlined GeoJsonData has performance impact, consider using [remember] or other way to retain the data.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param sourceId The optional sourceId for the source state, by default, a random source ID will be used.\n * @param init A function initialise this [GeoJsonSourceState].\n */\n@Composable\n@MapboxDelicateApi\npublic inline fun rememberGeoJsonSourceState(\n  key: String? = null,\n  sourceId: String = remember {\n    generateRandomSourceId(\"geojson\")\n  },\n  crossinline init: GeoJsonSourceState.() -> Unit = {}\n): GeoJsonSourceState = rememberSaveable(key = key, saver = GeoJsonSourceState.Saver) {\n  GeoJsonSourceState(sourceId).apply(init)\n}\n\n/**\n * A GeoJSON data source.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources#geojson)\n *\n * @param sourceId The id of the source state, by default a random generated ID will be used.\n * @param initialProperties The initial mutable properties of the source.\n * @param initialData The initial [GeoJSONData] of the source.\n */\n@Stable\npublic class GeoJsonSourceState private constructor(\n  sourceId: String,\n  sourceType: String,\n  initialProperties: Map<String, Pair<Boolean, Value>>,\n  initialData: GeoJSONData = GeoJSONData.DEFAULT,\n  maxZoom: LongValue,\n  minZoom: LongValue,\n  attribution: StringValue,\n  buffer: LongValue,\n  tolerance: DoubleValue,\n  cluster: BooleanValue,\n  clusterRadius: LongValue,\n  clusterMaxZoom: LongValue,\n  clusterMinPoints: LongValue,\n  clusterProperties: ClusterProperties,\n  lineMetrics: BooleanValue,\n  generateId: BooleanValue,\n  promoteId: PromoteIdValue,\n  autoMaxZoom: BooleanValue,\n  prefetchZoomDelta: LongValue,\n  tileCacheBudget: TileCacheBudget,\n) : SourceState(\n  sourceId = sourceId,\n  sourceType = sourceType,\n  initialProperties = initialProperties,\n  initialGeoJsonData = initialData,\n) {\n  public constructor(\n    sourceId: String = generateRandomSourceId(\"geojson\"),\n  ) : this(\n    sourceId = sourceId,\n    sourceType = \"geojson\",\n    initialProperties = emptyMap(),\n    maxZoom = LongValue.INITIAL,\n    minZoom = LongValue.INITIAL,\n    attribution = StringValue.INITIAL,\n    buffer = LongValue.INITIAL,\n    tolerance = DoubleValue.INITIAL,\n    cluster = BooleanValue.INITIAL,\n    clusterRadius = LongValue.INITIAL,\n    clusterMaxZoom = LongValue.INITIAL,\n    clusterMinPoints = LongValue.INITIAL,\n    clusterProperties = ClusterProperties.INITIAL,\n    lineMetrics = BooleanValue.INITIAL,\n    generateId = BooleanValue.INITIAL,\n    promoteId = PromoteIdValue.INITIAL,\n    autoMaxZoom = BooleanValue.INITIAL,\n    prefetchZoomDelta = LongValue.INITIAL,\n    tileCacheBudget = TileCacheBudget.INITIAL,\n  )\n\n  /**\n   * Sets GeoJson `data` property as [GeoJSONData].\n   *\n   * The data will be scheduled and applied on a worker thread and no validation happens synchronously.\n   * If [data] is invalid - `MapLoadingError` with `type = metadata` will be invoked.\n   */\n  public var data: GeoJSONData\n    get() = geoJSONData\n    set(value) {\n      geoJSONData = value\n    }\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(maxZoom)\n\n  /**\n   * Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom\n   * levels).\n   * Default value: 18.\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(minZoom)\n\n  /**\n   * Minimum zoom level at which to create vector tiles\n   * Default value: 0.\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val attributionState: MutableState<StringValue> = mutableStateOf(attribution)\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  public var attribution: StringValue by attributionState\n\n  private val bufferState: MutableState<LongValue> = mutableStateOf(buffer)\n\n  /**\n   * Size of the tile buffer on each side. A value of 0 produces no buffer. A\n   * value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer\n   * rendering artifacts near tile edges and slower performance.\n   * Default value: 128. Value range: [0, 512]\n   */\n  public var buffer: LongValue by bufferState\n\n  private val toleranceState: MutableState<DoubleValue> = mutableStateOf(tolerance)\n\n  /**\n   * Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\n   * Default value: 0.375.\n   */\n  public var tolerance: DoubleValue by toleranceState\n\n  private val clusterState: MutableState<BooleanValue> = mutableStateOf(cluster)\n\n  /**\n   * If the data is a collection of point features, setting this to true clusters the points\n   * by radius into groups. Cluster groups become new `Point` features in the source with additional properties:\n   *  - `cluster` Is `true` if the point is a cluster\n   *  - `cluster_id` A unqiue id for the cluster to be used in conjunction with the\n   * [cluster inspection methods](https://www.mapbox.com/mapbox-gl-js/api/#geojsonsource#getclusterexpansionzoom)\n   *  - `point_count` Number of original points grouped into this cluster\n   *  - `point_count_abbreviated` An abbreviated point count\n   * Default value: false.\n   */\n  public var cluster: BooleanValue by clusterState\n\n  private val clusterRadiusState: MutableState<LongValue> = mutableStateOf(clusterRadius)\n\n  /**\n   * Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal\n   * to the width of a tile.\n   * Default value: 50. Minimum value: 0.\n   */\n  public var clusterRadius: LongValue by clusterRadiusState\n\n  private val clusterMaxZoomState: MutableState<LongValue> = mutableStateOf(clusterMaxZoom)\n\n  /**\n   * Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less\n   * than maxzoom (so that last zoom features are not clustered). Clusters are re-evaluated at integer zoom\n   * levels so setting clusterMaxZoom to 14 means the clusters will be displayed until z15.\n   */\n  public var clusterMaxZoom: LongValue by clusterMaxZoomState\n\n  private val clusterMinPointsState: MutableState<LongValue> = mutableStateOf(clusterMinPoints)\n\n  /**\n   * Minimum number of points necessary to form a cluster if clustering is enabled. Defaults to `2`.\n   */\n  public var clusterMinPoints: LongValue by clusterMinPointsState\n\n  private val clusterPropertiesState: MutableState<ClusterProperties> = mutableStateOf(clusterProperties)\n\n  /**\n   * An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from\n   * clustered points. Has the form `{\"property_name\": [operator, map_expression]}`. `operator` is any expression function that accepts at\n   * least 2 operands (e.g. `\"+\"` or `\"max\"`) — it accumulates the property value from clusters/points the\n   * cluster contains; `map_expression` produces the value of a single point.\n   *\n   * Example: `{\"sum\": [\"+\", [\"get\", \"scalerank\"]]}`.\n   *\n   * For more advanced use cases, in place of `operator`, you can use a custom reduce expression\n   * that references a special `[\"accumulated\"]` value, e.g.:\n   * `{\"sum\": [[\"+\", [\"accumulated\"], [\"get\", \"sum\"]], [\"get\", \"scalerank\"]]}`\n   */\n  public var clusterProperties: ClusterProperties by clusterPropertiesState\n\n  private val lineMetricsState: MutableState<BooleanValue> = mutableStateOf(lineMetrics)\n\n  /**\n   * Whether to calculate line distance metrics. This is required for line layers that specify `line-gradient` values.\n   * Default value: false.\n   */\n  public var lineMetrics: BooleanValue by lineMetricsState\n\n  private val generateIdState: MutableState<BooleanValue> = mutableStateOf(generateId)\n\n  /**\n   * Whether to generate ids for the GeoJSON features. When enabled, the `feature.id` property will be auto\n   * assigned based on its index in the `features` array, over-writing any previous values.\n   * Default value: false.\n   */\n  public var generateId: BooleanValue by generateIdState\n\n  private val promoteIdState: MutableState<PromoteIdValue> = mutableStateOf(promoteId)\n\n  /**\n   * A property to use as a feature id. An expression can be used to dynamically check\n   * multiple properties.\n   */\n  public var promoteId: PromoteIdValue by promoteIdState\n\n  private val autoMaxZoomState: MutableState<BooleanValue> = mutableStateOf(autoMaxZoom)\n\n  /**\n   * When set to true, the maxZoom property is ignored and is instead calculated automatically based on\n   * the largest bounding box from the geojson features. This resolves rendering artifacts for features that use\n   * wide blur (e.g. fill extrusion ground flood light or circle layer) and would bring performance improvement\n   * on lower zoom levels, especially for geoJSON sources that update data frequently. However, it can lead\n   * to flickering and precision loss on zoom levels above 19. This option is not supported in\n   * combination with clustering.\n   * Default value: false.\n   */\n  @MapboxExperimental\n  public var autoMaxZoom: BooleanValue by autoMaxZoomState\n\n  private val prefetchZoomDeltaState: MutableState<LongValue> = mutableStateOf(prefetchZoomDelta)\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  public var prefetchZoomDelta: LongValue by prefetchZoomDeltaState\n\n  private val tileCacheBudgetState: MutableState<TileCacheBudget> = mutableStateOf(tileCacheBudget)\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  public var tileCacheBudget: TileCacheBudget by tileCacheBudgetState\n\n  @Composable\n  override fun UpdateProperties() {\n    ActionWhenNotInitial(setBuilderPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, attributionState, \"attribution\")\n    ActionWhenNotInitial(setBuilderPropertyAction, bufferState, \"buffer\")\n    ActionWhenNotInitial(setBuilderPropertyAction, toleranceState, \"tolerance\")\n    ActionWhenNotInitial(setBuilderPropertyAction, clusterState, \"cluster\")\n    ActionWhenNotInitial(setBuilderPropertyAction, clusterRadiusState, \"clusterRadius\")\n    ActionWhenNotInitial(setBuilderPropertyAction, clusterMaxZoomState, \"clusterMaxZoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, clusterMinPointsState, \"clusterMinPoints\")\n    ActionWhenNotInitial(setBuilderPropertyAction, clusterPropertiesState, \"clusterProperties\")\n    ActionWhenNotInitial(setBuilderPropertyAction, lineMetricsState, \"lineMetrics\")\n    ActionWhenNotInitial(setBuilderPropertyAction, generateIdState, \"generateId\")\n    ActionWhenNotInitial(setBuilderPropertyAction, promoteIdState, \"promoteId\")\n    ActionWhenNotInitial(setBuilderPropertyAction, autoMaxZoomState, \"autoMaxZoom\")\n    ActionWhenNotInitial(setPropertyAction, prefetchZoomDeltaState, \"prefetch-zoom-delta\")\n    ActionWhenNotInitial(setPropertyAction, tileCacheBudgetState, \"tile-cache-budget\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"maxzoom\" to maxZoom.value).takeIf { maxZoom.isNotInitial() },\n      (\"minzoom\" to minZoom.value).takeIf { minZoom.isNotInitial() },\n      (\"attribution\" to attribution.value).takeIf { attribution.isNotInitial() },\n      (\"buffer\" to buffer.value).takeIf { buffer.isNotInitial() },\n      (\"tolerance\" to tolerance.value).takeIf { tolerance.isNotInitial() },\n      (\"cluster\" to cluster.value).takeIf { cluster.isNotInitial() },\n      (\"clusterRadius\" to clusterRadius.value).takeIf { clusterRadius.isNotInitial() },\n      (\"clusterMaxZoom\" to clusterMaxZoom.value).takeIf { clusterMaxZoom.isNotInitial() },\n      (\"clusterMinPoints\" to clusterMinPoints.value).takeIf { clusterMinPoints.isNotInitial() },\n      (\"clusterProperties\" to clusterProperties.value).takeIf { clusterProperties.isNotInitial() },\n      (\"lineMetrics\" to lineMetrics.value).takeIf { lineMetrics.isNotInitial() },\n      (\"generateId\" to generateId.value).takeIf { generateId.isNotInitial() },\n      (\"promoteId\" to promoteId.value).takeIf { promoteId.isNotInitial() },\n      (\"autoMaxZoom\" to autoMaxZoom.value).takeIf { autoMaxZoom.isNotInitial() },\n      (\"prefetch-zoom-delta\" to prefetchZoomDelta.value).takeIf { prefetchZoomDelta.isNotInitial() },\n      (\"tile-cache-budget\" to tileCacheBudget.value).takeIf { tileCacheBudget.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as GeoJsonSourceState\n\n    if (sourceId != other.sourceId) return false\n    if (data != other.data) return false\n    if (maxZoom != other.maxZoom) return false\n    if (minZoom != other.minZoom) return false\n    if (attribution != other.attribution) return false\n    if (buffer != other.buffer) return false\n    if (tolerance != other.tolerance) return false\n    if (cluster != other.cluster) return false\n    if (clusterRadius != other.clusterRadius) return false\n    if (clusterMaxZoom != other.clusterMaxZoom) return false\n    if (clusterMinPoints != other.clusterMinPoints) return false\n    if (clusterProperties != other.clusterProperties) return false\n    if (lineMetrics != other.lineMetrics) return false\n    if (generateId != other.generateId) return false\n    if (promoteId != other.promoteId) return false\n    if (autoMaxZoom != other.autoMaxZoom) return false\n    if (prefetchZoomDelta != other.prefetchZoomDelta) return false\n    if (tileCacheBudget != other.tileCacheBudget) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(\n      sourceId,\n      data,\n      maxZoom,\n      minZoom,\n      attribution,\n      buffer,\n      tolerance,\n      cluster,\n      clusterRadius,\n      clusterMaxZoom,\n      clusterMinPoints,\n      clusterProperties,\n      lineMetrics,\n      generateId,\n      promoteId,\n      autoMaxZoom,\n      prefetchZoomDelta,\n      tileCacheBudget,\n    )\n  }\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String =\n    \"GeoJsonSourceState(sourceId=$sourceId, maxZoom=$maxZoom, minZoom=$minZoom, attribution=$attribution, buffer=$buffer, tolerance=$tolerance, cluster=$cluster, clusterRadius=$clusterRadius, clusterMaxZoom=$clusterMaxZoom, clusterMinPoints=$clusterMinPoints, clusterProperties=$clusterProperties, lineMetrics=$lineMetrics, generateId=$generateId, promoteId=$promoteId, autoMaxZoom=$autoMaxZoom, prefetchZoomDelta=$prefetchZoomDelta, tileCacheBudget=$tileCacheBudget)\"\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [GeoJsonSourceState]\n     */\n    public val Saver: Saver<GeoJsonSourceState, Holder> = Saver(\n      save = { it.save() },\n      restore = { holder ->\n        GeoJsonSourceState(\n          sourceId = holder.sourcedId,\n          sourceType = \"geojson\",\n          initialProperties = holder.savedProperties,\n          initialData = holder.geoJSONData,\n          maxZoom = holder.savedProperties[\"maxzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          minZoom = holder.savedProperties[\"minzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          attribution = holder.savedProperties[\"attribution\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          buffer = holder.savedProperties[\"buffer\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tolerance = holder.savedProperties[\"tolerance\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n          cluster = holder.savedProperties[\"cluster\"]?.let { BooleanValue(it.second) } ?: BooleanValue.INITIAL,\n          clusterRadius = holder.savedProperties[\"clusterRadius\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          clusterMaxZoom = holder.savedProperties[\"clusterMaxZoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          clusterMinPoints = holder.savedProperties[\"clusterMinPoints\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          clusterProperties = holder.savedProperties[\"clusterProperties\"]?.let { ClusterProperties(it.second) } ?: ClusterProperties.INITIAL,\n          lineMetrics = holder.savedProperties[\"lineMetrics\"]?.let { BooleanValue(it.second) } ?: BooleanValue.INITIAL,\n          generateId = holder.savedProperties[\"generateId\"]?.let { BooleanValue(it.second) } ?: BooleanValue.INITIAL,\n          promoteId = holder.savedProperties[\"promoteId\"]?.let { PromoteIdValue(it.second) } ?: PromoteIdValue.INITIAL,\n          autoMaxZoom = holder.savedProperties[\"autoMaxZoom\"]?.let { BooleanValue(it.second) } ?: BooleanValue.INITIAL,\n          prefetchZoomDelta = holder.savedProperties[\"prefetch-zoom-delta\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileCacheBudget = holder.savedProperties[\"tile-cache-budget\"]?.let { TileCacheBudget(it.second) } ?: TileCacheBudget.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/generated/ImageSourceState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.sources.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomSourceId\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.PointListValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [ImageSourceState] using [ImageSourceState.Saver].\n * [init] will be called when the [ImageSourceState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param sourceId The optional sourceId for the source state, by default, a random source ID will be used.\n * @param init A function initialise this [ImageSourceState].\n */\n@Composable\npublic inline fun rememberImageSourceState(\n  key: String? = null,\n  sourceId: String = remember {\n    generateRandomSourceId(\"image\")\n  },\n  crossinline init: ImageSourceState.() -> Unit = {}\n): ImageSourceState = rememberSaveable(key = key, saver = ImageSourceState.Saver) {\n  ImageSourceState(sourceId).apply(init)\n}\n\n/**\n * An image data source.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources#image)\n *\n * @param sourceId The id of the source state, by default a random generated ID will be used.\n * @param initialProperties The initial mutable properties of the source.\n */\n@Stable\npublic class ImageSourceState private constructor(\n  sourceId: String,\n  sourceType: String,\n  initialProperties: Map<String, Pair<Boolean, Value>>,\n  url: StringValue,\n  coordinates: PointListValue,\n  prefetchZoomDelta: LongValue,\n) : SourceState(\n  sourceId = sourceId,\n  sourceType = sourceType,\n  initialProperties = initialProperties,\n) {\n  public constructor(\n    sourceId: String = generateRandomSourceId(\"image\"),\n  ) : this(\n    sourceId = sourceId,\n    sourceType = \"image\",\n    initialProperties = emptyMap(),\n    url = StringValue.INITIAL,\n    coordinates = PointListValue.INITIAL,\n    prefetchZoomDelta = LongValue.INITIAL,\n  )\n\n  private val urlState: MutableState<StringValue> = mutableStateOf(url)\n\n  /**\n   * URL that points to an image. If the URL is not specified, the image is expected\n   * to be loaded directly during runtime.\n   */\n  public var url: StringValue by urlState\n\n  private val coordinatesState: MutableState<PointListValue> = mutableStateOf(coordinates)\n\n  /**\n   * Corners of image specified in longitude, latitude pairs. Note: When using globe projection, the image will\n   * be centered at the North or South Pole in the respective hemisphere if the average latitude\n   * value exceeds 85 degrees or falls below -85 degrees.\n   */\n  public var coordinates: PointListValue by coordinatesState\n\n  private val prefetchZoomDeltaState: MutableState<LongValue> = mutableStateOf(prefetchZoomDelta)\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  public var prefetchZoomDelta: LongValue by prefetchZoomDeltaState\n\n  @Composable\n  override fun UpdateProperties() {\n    ActionWhenNotInitial(setBuilderPropertyAction, urlState, \"url\")\n    ActionWhenNotInitial(setBuilderPropertyAction, coordinatesState, \"coordinates\")\n    ActionWhenNotInitial(setPropertyAction, prefetchZoomDeltaState, \"prefetch-zoom-delta\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"url\" to url.value).takeIf { url.isNotInitial() },\n      (\"coordinates\" to coordinates.value).takeIf { coordinates.isNotInitial() },\n      (\"prefetch-zoom-delta\" to prefetchZoomDelta.value).takeIf { prefetchZoomDelta.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as ImageSourceState\n\n    if (sourceId != other.sourceId) return false\n    if (url != other.url) return false\n    if (coordinates != other.coordinates) return false\n    if (prefetchZoomDelta != other.prefetchZoomDelta) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(\n      sourceId,\n      url,\n      coordinates,\n      prefetchZoomDelta,\n    )\n  }\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String =\n    \"ImageSourceState(sourceId=$sourceId, url=$url, coordinates=$coordinates, prefetchZoomDelta=$prefetchZoomDelta)\"\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [ImageSourceState]\n     */\n    public val Saver: Saver<ImageSourceState, Holder> = Saver(\n      save = { it.save() },\n      restore = { holder ->\n        ImageSourceState(\n          sourceId = holder.sourcedId,\n          sourceType = \"image\",\n          initialProperties = holder.savedProperties,\n          url = holder.savedProperties[\"url\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          coordinates = holder.savedProperties[\"coordinates\"]?.let { PointListValue(it.second) } ?: PointListValue.INITIAL,\n          prefetchZoomDelta = holder.savedProperties[\"prefetch-zoom-delta\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/generated/ModelSourceState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.sources.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomSourceId\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringListValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.sources.ModelSourceModelsValue\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [ModelSourceState] using [ModelSourceState.Saver].\n * [init] will be called when the [ModelSourceState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param sourceId The optional sourceId for the source state, by default, a random source ID will be used.\n * @param init A function initialise this [ModelSourceState].\n */\n@Composable\npublic inline fun rememberModelSourceState(\n  key: String? = null,\n  sourceId: String = remember {\n    generateRandomSourceId(\"model\")\n  },\n  crossinline init: ModelSourceState.() -> Unit = {}\n): ModelSourceState = rememberSaveable(key = key, saver = ModelSourceState.Saver) {\n  ModelSourceState(sourceId).apply(init)\n}\n\n/**\n * A collection of 3D models\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources#model)\n *\n * @param sourceId The id of the source state, by default a random generated ID will be used.\n * @param initialProperties The initial mutable properties of the source.\n */\n@Stable\npublic class ModelSourceState private constructor(\n  sourceId: String,\n  sourceType: String,\n  initialProperties: Map<String, Pair<Boolean, Value>>,\n  url: StringValue,\n  maxZoom: LongValue,\n  minZoom: LongValue,\n  tiles: StringListValue,\n  models: ModelSourceModelsValue,\n) : SourceState(\n  sourceId = sourceId,\n  sourceType = sourceType,\n  initialProperties = initialProperties,\n) {\n  public constructor(\n    sourceId: String = generateRandomSourceId(\"model\"),\n  ) : this(\n    sourceId = sourceId,\n    sourceType = \"model\",\n    initialProperties = emptyMap(),\n    url = StringValue.INITIAL,\n    maxZoom = LongValue.INITIAL,\n    minZoom = LongValue.INITIAL,\n    tiles = StringListValue.INITIAL,\n    models = ModelSourceModelsValue.INITIAL,\n  )\n\n  private val urlState: MutableState<StringValue> = mutableStateOf(url)\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  public var url: StringValue by urlState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(maxZoom)\n\n  /**\n   * Maximum zoom level at which to create batched model tiles. Data from tiles at the maxzoom\n   * are used when displaying the map at higher zoom levels.\n   * Default value: 18.\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(minZoom)\n\n  /**\n   * Minimum zoom level for which batched-model tiles are available\n   * Default value: 0.\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val tilesState: MutableState<StringListValue> = mutableStateOf(tiles)\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Requires `batched-model`\n   * source type.\n   */\n  public var tiles: StringListValue by tilesState\n\n  private val modelsState: MutableState<ModelSourceModelsValue> = mutableStateOf(models)\n\n  /**\n   * Defines properties of 3D models in collection. Requires `model` source type.\n   */\n  public var models: ModelSourceModelsValue by modelsState\n\n  @Composable\n  override fun UpdateProperties() {\n    ActionWhenNotInitial(setBuilderPropertyAction, urlState, \"url\")\n    ActionWhenNotInitial(setBuilderPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, tilesState, \"tiles\")\n    ActionWhenNotInitial(setBuilderPropertyAction, modelsState, \"models\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"url\" to url.value).takeIf { url.isNotInitial() },\n      (\"maxzoom\" to maxZoom.value).takeIf { maxZoom.isNotInitial() },\n      (\"minzoom\" to minZoom.value).takeIf { minZoom.isNotInitial() },\n      (\"tiles\" to tiles.value).takeIf { tiles.isNotInitial() },\n      (\"models\" to models.value).takeIf { models.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as ModelSourceState\n\n    if (sourceId != other.sourceId) return false\n    if (url != other.url) return false\n    if (maxZoom != other.maxZoom) return false\n    if (minZoom != other.minZoom) return false\n    if (tiles != other.tiles) return false\n    if (models != other.models) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(\n      sourceId,\n      url,\n      maxZoom,\n      minZoom,\n      tiles,\n      models,\n    )\n  }\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String =\n    \"ModelSourceState(sourceId=$sourceId, url=$url, maxZoom=$maxZoom, minZoom=$minZoom, tiles=$tiles, models=$models)\"\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [ModelSourceState]\n     */\n    public val Saver: Saver<ModelSourceState, Holder> = Saver(\n      save = { it.save() },\n      restore = { holder ->\n        ModelSourceState(\n          sourceId = holder.sourcedId,\n          sourceType = \"model\",\n          initialProperties = holder.savedProperties,\n          url = holder.savedProperties[\"url\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          maxZoom = holder.savedProperties[\"maxzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          minZoom = holder.savedProperties[\"minzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tiles = holder.savedProperties[\"tiles\"]?.let { StringListValue(it.second) } ?: StringListValue.INITIAL,\n          models = holder.savedProperties[\"models\"]?.let { ModelSourceModelsValue(it.second) } ?: ModelSourceModelsValue.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/generated/RasterArraySourceState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.sources.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomSourceId\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringListValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.sources.RasterLayers\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\nimport com.mapbox.maps.extension.compose.style.sources.TileCacheBudget\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [RasterArraySourceState] using [RasterArraySourceState.Saver].\n * [init] will be called when the [RasterArraySourceState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param sourceId The optional sourceId for the source state, by default, a random source ID will be used.\n * @param init A function initialise this [RasterArraySourceState].\n */\n@Composable\n@MapboxExperimental\npublic inline fun rememberRasterArraySourceState(\n  key: String? = null,\n  sourceId: String = remember {\n    generateRandomSourceId(\"raster-array\")\n  },\n  crossinline init: RasterArraySourceState.() -> Unit = {}\n): RasterArraySourceState = rememberSaveable(key = key, saver = RasterArraySourceState.Saver) {\n  RasterArraySourceState(sourceId).apply(init)\n}\n\n/**\n * A raster array source\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources#raster_array)\n *\n * @param sourceId The id of the source state, by default a random generated ID will be used.\n * @param initialProperties The initial mutable properties of the source.\n */\n@Stable\n@MapboxExperimental\npublic class RasterArraySourceState private constructor(\n  sourceId: String,\n  sourceType: String,\n  initialProperties: Map<String, Pair<Boolean, Value>>,\n  url: StringValue,\n  tiles: StringListValue,\n  bounds: DoubleListValue,\n  minZoom: LongValue,\n  maxZoom: LongValue,\n  tileSize: LongValue,\n  attribution: StringValue,\n  rasterLayers: RasterLayers,\n  volatile: BooleanValue,\n  tileCacheBudget: TileCacheBudget,\n) : SourceState(\n  sourceId = sourceId,\n  sourceType = sourceType,\n  initialProperties = initialProperties,\n) {\n  public constructor(\n    sourceId: String = generateRandomSourceId(\"raster-array\"),\n  ) : this(\n    sourceId = sourceId,\n    sourceType = \"raster-array\",\n    initialProperties = emptyMap(),\n    url = StringValue.INITIAL,\n    tiles = StringListValue.INITIAL,\n    bounds = DoubleListValue.INITIAL,\n    minZoom = LongValue.INITIAL,\n    maxZoom = LongValue.INITIAL,\n    tileSize = LongValue.INITIAL,\n    attribution = StringValue.INITIAL,\n    rasterLayers = RasterLayers.INITIAL,\n    volatile = BooleanValue.INITIAL,\n    tileCacheBudget = TileCacheBudget.INITIAL,\n  )\n\n  private val urlState: MutableState<StringValue> = mutableStateOf(url)\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  public var url: StringValue by urlState\n\n  private val tilesState: MutableState<StringListValue> = mutableStateOf(tiles)\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  public var tiles: StringListValue by tilesState\n\n  private val boundsState: MutableState<DoubleListValue> = mutableStateOf(bounds)\n\n  /**\n   * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n   * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n   * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n   * Default value: [-180,-85.051129,180,85.051129].\n   */\n  public var bounds: DoubleListValue by boundsState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(minZoom)\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(maxZoom)\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val tileSizeState: MutableState<LongValue> = mutableStateOf(tileSize)\n\n  /**\n   * The minimum visual size to display tiles for this layer. Only configurable for raster layers.\n   * Default value: 512. The unit of tileSize is in pixels.\n   */\n  public var tileSize: LongValue by tileSizeState\n\n  private val attributionState: MutableState<StringValue> = mutableStateOf(attribution)\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  public var attribution: StringValue by attributionState\n\n  private val rasterLayersState: MutableState<RasterLayers> = mutableStateOf(rasterLayers)\n\n  /**\n   * Contains the description of the raster data layers and the bands contained within the tiles.\n   */\n  public var rasterLayers: RasterLayers by rasterLayersState\n\n  private val volatileState: MutableState<BooleanValue> = mutableStateOf(volatile)\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  public var volatile: BooleanValue by volatileState\n\n  private val tileCacheBudgetState: MutableState<TileCacheBudget> = mutableStateOf(tileCacheBudget)\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  public var tileCacheBudget: TileCacheBudget by tileCacheBudgetState\n\n  @Composable\n  override fun UpdateProperties() {\n    ActionWhenNotInitial(setBuilderPropertyAction, urlState, \"url\")\n    ActionWhenNotInitial(setBuilderPropertyAction, tilesState, \"tiles\")\n    ActionWhenNotInitial(setBuilderPropertyAction, boundsState, \"bounds\")\n    ActionWhenNotInitial(setBuilderPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, tileSizeState, \"tileSize\")\n    ActionWhenNotInitial(setBuilderPropertyAction, attributionState, \"attribution\")\n    ActionWhenNotInitial(setBuilderPropertyAction, rasterLayersState, \"rasterLayers\")\n    ActionWhenNotInitial(setBuilderPropertyAction, volatileState, \"volatile\")\n    ActionWhenNotInitial(setPropertyAction, tileCacheBudgetState, \"tile-cache-budget\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"url\" to url.value).takeIf { url.isNotInitial() },\n      (\"tiles\" to tiles.value).takeIf { tiles.isNotInitial() },\n      (\"bounds\" to bounds.value).takeIf { bounds.isNotInitial() },\n      (\"minzoom\" to minZoom.value).takeIf { minZoom.isNotInitial() },\n      (\"maxzoom\" to maxZoom.value).takeIf { maxZoom.isNotInitial() },\n      (\"tileSize\" to tileSize.value).takeIf { tileSize.isNotInitial() },\n      (\"attribution\" to attribution.value).takeIf { attribution.isNotInitial() },\n      (\"rasterLayers\" to rasterLayers.value).takeIf { rasterLayers.isNotInitial() },\n      (\"volatile\" to volatile.value).takeIf { volatile.isNotInitial() },\n      (\"tile-cache-budget\" to tileCacheBudget.value).takeIf { tileCacheBudget.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as RasterArraySourceState\n\n    if (sourceId != other.sourceId) return false\n    if (url != other.url) return false\n    if (tiles != other.tiles) return false\n    if (bounds != other.bounds) return false\n    if (minZoom != other.minZoom) return false\n    if (maxZoom != other.maxZoom) return false\n    if (tileSize != other.tileSize) return false\n    if (attribution != other.attribution) return false\n    if (rasterLayers != other.rasterLayers) return false\n    if (volatile != other.volatile) return false\n    if (tileCacheBudget != other.tileCacheBudget) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(\n      sourceId,\n      url,\n      tiles,\n      bounds,\n      minZoom,\n      maxZoom,\n      tileSize,\n      attribution,\n      rasterLayers,\n      volatile,\n      tileCacheBudget,\n    )\n  }\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String =\n    \"RasterArraySourceState(sourceId=$sourceId, url=$url, tiles=$tiles, bounds=$bounds, minZoom=$minZoom, maxZoom=$maxZoom, tileSize=$tileSize, attribution=$attribution, rasterLayers=$rasterLayers, volatile=$volatile, tileCacheBudget=$tileCacheBudget)\"\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [RasterArraySourceState]\n     */\n    public val Saver: Saver<RasterArraySourceState, Holder> = Saver(\n      save = { it.save() },\n      restore = { holder ->\n        RasterArraySourceState(\n          sourceId = holder.sourcedId,\n          sourceType = \"raster-array\",\n          initialProperties = holder.savedProperties,\n          url = holder.savedProperties[\"url\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          tiles = holder.savedProperties[\"tiles\"]?.let { StringListValue(it.second) } ?: StringListValue.INITIAL,\n          bounds = holder.savedProperties[\"bounds\"]?.let { DoubleListValue(it.second) } ?: DoubleListValue.INITIAL,\n          minZoom = holder.savedProperties[\"minzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          maxZoom = holder.savedProperties[\"maxzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileSize = holder.savedProperties[\"tileSize\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          attribution = holder.savedProperties[\"attribution\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          rasterLayers = holder.savedProperties[\"rasterLayers\"]?.let { RasterLayers(it.second) } ?: RasterLayers.INITIAL,\n          volatile = holder.savedProperties[\"volatile\"]?.let { BooleanValue(it.second) } ?: BooleanValue.INITIAL,\n          tileCacheBudget = holder.savedProperties[\"tile-cache-budget\"]?.let { TileCacheBudget(it.second) } ?: TileCacheBudget.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/generated/RasterDemSourceState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.sources.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomSourceId\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringListValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\nimport com.mapbox.maps.extension.compose.style.sources.TileCacheBudget\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [RasterDemSourceState] using [RasterDemSourceState.Saver].\n * [init] will be called when the [RasterDemSourceState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param sourceId The optional sourceId for the source state, by default, a random source ID will be used.\n * @param init A function initialise this [RasterDemSourceState].\n */\n@Composable\npublic inline fun rememberRasterDemSourceState(\n  key: String? = null,\n  sourceId: String = remember {\n    generateRandomSourceId(\"raster-dem\")\n  },\n  crossinline init: RasterDemSourceState.() -> Unit = {}\n): RasterDemSourceState = rememberSaveable(key = key, saver = RasterDemSourceState.Saver) {\n  RasterDemSourceState(sourceId).apply(init)\n}\n\n/**\n * A RGB-encoded raster DEM source\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources#raster_dem)\n *\n * @param sourceId The id of the source state, by default a random generated ID will be used.\n * @param initialProperties The initial mutable properties of the source.\n */\n@Stable\npublic class RasterDemSourceState private constructor(\n  sourceId: String,\n  sourceType: String,\n  initialProperties: Map<String, Pair<Boolean, Value>>,\n  url: StringValue,\n  tiles: StringListValue,\n  bounds: DoubleListValue,\n  minZoom: LongValue,\n  maxZoom: LongValue,\n  tileSize: LongValue,\n  attribution: StringValue,\n  encoding: EncodingValue,\n  volatile: BooleanValue,\n  prefetchZoomDelta: LongValue,\n  tileCacheBudget: TileCacheBudget,\n  minimumTileUpdateInterval: DoubleValue,\n  maxOverscaleFactorForParentTiles: LongValue,\n  tileRequestsDelay: DoubleValue,\n  tileNetworkRequestsDelay: DoubleValue,\n) : SourceState(\n  sourceId = sourceId,\n  sourceType = sourceType,\n  initialProperties = initialProperties,\n) {\n  public constructor(\n    sourceId: String = generateRandomSourceId(\"raster-dem\"),\n  ) : this(\n    sourceId = sourceId,\n    sourceType = \"raster-dem\",\n    initialProperties = emptyMap(),\n    url = StringValue.INITIAL,\n    tiles = StringListValue.INITIAL,\n    bounds = DoubleListValue.INITIAL,\n    minZoom = LongValue.INITIAL,\n    maxZoom = LongValue.INITIAL,\n    tileSize = LongValue.INITIAL,\n    attribution = StringValue.INITIAL,\n    encoding = EncodingValue.INITIAL,\n    volatile = BooleanValue.INITIAL,\n    prefetchZoomDelta = LongValue.INITIAL,\n    tileCacheBudget = TileCacheBudget.INITIAL,\n    minimumTileUpdateInterval = DoubleValue.INITIAL,\n    maxOverscaleFactorForParentTiles = LongValue.INITIAL,\n    tileRequestsDelay = DoubleValue.INITIAL,\n    tileNetworkRequestsDelay = DoubleValue.INITIAL,\n  )\n\n  private val urlState: MutableState<StringValue> = mutableStateOf(url)\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  public var url: StringValue by urlState\n\n  private val tilesState: MutableState<StringListValue> = mutableStateOf(tiles)\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  public var tiles: StringListValue by tilesState\n\n  private val boundsState: MutableState<DoubleListValue> = mutableStateOf(bounds)\n\n  /**\n   * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n   * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n   * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n   * Default value: [-180,-85.051129,180,85.051129].\n   */\n  public var bounds: DoubleListValue by boundsState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(minZoom)\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(maxZoom)\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val tileSizeState: MutableState<LongValue> = mutableStateOf(tileSize)\n\n  /**\n   * The minimum visual size to display tiles for this layer. Only configurable for raster layers.\n   * Default value: 512. The unit of tileSize is in pixels.\n   */\n  public var tileSize: LongValue by tileSizeState\n\n  private val attributionState: MutableState<StringValue> = mutableStateOf(attribution)\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  public var attribution: StringValue by attributionState\n\n  private val encodingState: MutableState<EncodingValue> = mutableStateOf(encoding)\n\n  /**\n   * The encoding used by this source. Mapbox Terrain RGB is used by default\n   * Default value: \"mapbox\".\n   */\n  public var encoding: EncodingValue by encodingState\n\n  private val volatileState: MutableState<BooleanValue> = mutableStateOf(volatile)\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  public var volatile: BooleanValue by volatileState\n\n  private val prefetchZoomDeltaState: MutableState<LongValue> = mutableStateOf(prefetchZoomDelta)\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  public var prefetchZoomDelta: LongValue by prefetchZoomDeltaState\n\n  private val tileCacheBudgetState: MutableState<TileCacheBudget> = mutableStateOf(tileCacheBudget)\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  public var tileCacheBudget: TileCacheBudget by tileCacheBudgetState\n\n  private val minimumTileUpdateIntervalState: MutableState<DoubleValue> = mutableStateOf(minimumTileUpdateInterval)\n\n  /**\n   * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n   * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n   * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n   * Default value: 0.\n   */\n  public var minimumTileUpdateInterval: DoubleValue by minimumTileUpdateIntervalState\n\n  private val maxOverscaleFactorForParentTilesState: MutableState<LongValue> = mutableStateOf(maxOverscaleFactorForParentTiles)\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  public var maxOverscaleFactorForParentTiles: LongValue by maxOverscaleFactorForParentTilesState\n\n  private val tileRequestsDelayState: MutableState<DoubleValue> = mutableStateOf(tileRequestsDelay)\n\n  /**\n   * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n   * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n   * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n   * Default value: 0.\n   */\n  public var tileRequestsDelay: DoubleValue by tileRequestsDelayState\n\n  private val tileNetworkRequestsDelayState: MutableState<DoubleValue> = mutableStateOf(tileNetworkRequestsDelay)\n\n  /**\n   * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n   * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n   * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n   * superseded with tile-requests-delay property value, if both are provided.\n   * Default value: 0.\n   */\n  public var tileNetworkRequestsDelay: DoubleValue by tileNetworkRequestsDelayState\n\n  @Composable\n  override fun UpdateProperties() {\n    ActionWhenNotInitial(setBuilderPropertyAction, urlState, \"url\")\n    ActionWhenNotInitial(setBuilderPropertyAction, tilesState, \"tiles\")\n    ActionWhenNotInitial(setBuilderPropertyAction, boundsState, \"bounds\")\n    ActionWhenNotInitial(setBuilderPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, tileSizeState, \"tileSize\")\n    ActionWhenNotInitial(setBuilderPropertyAction, attributionState, \"attribution\")\n    ActionWhenNotInitial(setBuilderPropertyAction, encodingState, \"encoding\")\n    ActionWhenNotInitial(setBuilderPropertyAction, volatileState, \"volatile\")\n    ActionWhenNotInitial(setPropertyAction, prefetchZoomDeltaState, \"prefetch-zoom-delta\")\n    ActionWhenNotInitial(setPropertyAction, tileCacheBudgetState, \"tile-cache-budget\")\n    ActionWhenNotInitial(setPropertyAction, minimumTileUpdateIntervalState, \"minimum-tile-update-interval\")\n    ActionWhenNotInitial(setPropertyAction, maxOverscaleFactorForParentTilesState, \"max-overscale-factor-for-parent-tiles\")\n    ActionWhenNotInitial(setPropertyAction, tileRequestsDelayState, \"tile-requests-delay\")\n    ActionWhenNotInitial(setPropertyAction, tileNetworkRequestsDelayState, \"tile-network-requests-delay\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"url\" to url.value).takeIf { url.isNotInitial() },\n      (\"tiles\" to tiles.value).takeIf { tiles.isNotInitial() },\n      (\"bounds\" to bounds.value).takeIf { bounds.isNotInitial() },\n      (\"minzoom\" to minZoom.value).takeIf { minZoom.isNotInitial() },\n      (\"maxzoom\" to maxZoom.value).takeIf { maxZoom.isNotInitial() },\n      (\"tileSize\" to tileSize.value).takeIf { tileSize.isNotInitial() },\n      (\"attribution\" to attribution.value).takeIf { attribution.isNotInitial() },\n      (\"encoding\" to encoding.value).takeIf { encoding.isNotInitial() },\n      (\"volatile\" to volatile.value).takeIf { volatile.isNotInitial() },\n      (\"prefetch-zoom-delta\" to prefetchZoomDelta.value).takeIf { prefetchZoomDelta.isNotInitial() },\n      (\"tile-cache-budget\" to tileCacheBudget.value).takeIf { tileCacheBudget.isNotInitial() },\n      (\"minimum-tile-update-interval\" to minimumTileUpdateInterval.value).takeIf { minimumTileUpdateInterval.isNotInitial() },\n      (\"max-overscale-factor-for-parent-tiles\" to maxOverscaleFactorForParentTiles.value).takeIf { maxOverscaleFactorForParentTiles.isNotInitial() },\n      (\"tile-requests-delay\" to tileRequestsDelay.value).takeIf { tileRequestsDelay.isNotInitial() },\n      (\"tile-network-requests-delay\" to tileNetworkRequestsDelay.value).takeIf { tileNetworkRequestsDelay.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as RasterDemSourceState\n\n    if (sourceId != other.sourceId) return false\n    if (url != other.url) return false\n    if (tiles != other.tiles) return false\n    if (bounds != other.bounds) return false\n    if (minZoom != other.minZoom) return false\n    if (maxZoom != other.maxZoom) return false\n    if (tileSize != other.tileSize) return false\n    if (attribution != other.attribution) return false\n    if (encoding != other.encoding) return false\n    if (volatile != other.volatile) return false\n    if (prefetchZoomDelta != other.prefetchZoomDelta) return false\n    if (tileCacheBudget != other.tileCacheBudget) return false\n    if (minimumTileUpdateInterval != other.minimumTileUpdateInterval) return false\n    if (maxOverscaleFactorForParentTiles != other.maxOverscaleFactorForParentTiles) return false\n    if (tileRequestsDelay != other.tileRequestsDelay) return false\n    if (tileNetworkRequestsDelay != other.tileNetworkRequestsDelay) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(\n      sourceId,\n      url,\n      tiles,\n      bounds,\n      minZoom,\n      maxZoom,\n      tileSize,\n      attribution,\n      encoding,\n      volatile,\n      prefetchZoomDelta,\n      tileCacheBudget,\n      minimumTileUpdateInterval,\n      maxOverscaleFactorForParentTiles,\n      tileRequestsDelay,\n      tileNetworkRequestsDelay,\n    )\n  }\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String =\n    \"RasterDemSourceState(sourceId=$sourceId, url=$url, tiles=$tiles, bounds=$bounds, minZoom=$minZoom, maxZoom=$maxZoom, tileSize=$tileSize, attribution=$attribution, encoding=$encoding, volatile=$volatile, prefetchZoomDelta=$prefetchZoomDelta, tileCacheBudget=$tileCacheBudget, minimumTileUpdateInterval=$minimumTileUpdateInterval, maxOverscaleFactorForParentTiles=$maxOverscaleFactorForParentTiles, tileRequestsDelay=$tileRequestsDelay, tileNetworkRequestsDelay=$tileNetworkRequestsDelay)\"\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [RasterDemSourceState]\n     */\n    public val Saver: Saver<RasterDemSourceState, Holder> = Saver(\n      save = { it.save() },\n      restore = { holder ->\n        RasterDemSourceState(\n          sourceId = holder.sourcedId,\n          sourceType = \"raster-dem\",\n          initialProperties = holder.savedProperties,\n          url = holder.savedProperties[\"url\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          tiles = holder.savedProperties[\"tiles\"]?.let { StringListValue(it.second) } ?: StringListValue.INITIAL,\n          bounds = holder.savedProperties[\"bounds\"]?.let { DoubleListValue(it.second) } ?: DoubleListValue.INITIAL,\n          minZoom = holder.savedProperties[\"minzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          maxZoom = holder.savedProperties[\"maxzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileSize = holder.savedProperties[\"tileSize\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          attribution = holder.savedProperties[\"attribution\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          encoding = holder.savedProperties[\"encoding\"]?.let { EncodingValue(it.second) } ?: EncodingValue.INITIAL,\n          volatile = holder.savedProperties[\"volatile\"]?.let { BooleanValue(it.second) } ?: BooleanValue.INITIAL,\n          prefetchZoomDelta = holder.savedProperties[\"prefetch-zoom-delta\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileCacheBudget = holder.savedProperties[\"tile-cache-budget\"]?.let { TileCacheBudget(it.second) } ?: TileCacheBudget.INITIAL,\n          minimumTileUpdateInterval = holder.savedProperties[\"minimum-tile-update-interval\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n          maxOverscaleFactorForParentTiles = holder.savedProperties[\"max-overscale-factor-for-parent-tiles\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileRequestsDelay = holder.savedProperties[\"tile-requests-delay\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n          tileNetworkRequestsDelay = holder.savedProperties[\"tile-network-requests-delay\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/generated/RasterSourceState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.sources.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomSourceId\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringListValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\nimport com.mapbox.maps.extension.compose.style.sources.TileCacheBudget\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [RasterSourceState] using [RasterSourceState.Saver].\n * [init] will be called when the [RasterSourceState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param sourceId The optional sourceId for the source state, by default, a random source ID will be used.\n * @param init A function initialise this [RasterSourceState].\n */\n@Composable\npublic inline fun rememberRasterSourceState(\n  key: String? = null,\n  sourceId: String = remember {\n    generateRandomSourceId(\"raster\")\n  },\n  crossinline init: RasterSourceState.() -> Unit = {}\n): RasterSourceState = rememberSaveable(key = key, saver = RasterSourceState.Saver) {\n  RasterSourceState(sourceId).apply(init)\n}\n\n/**\n * A raster tile source.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources#raster)\n *\n * @param sourceId The id of the source state, by default a random generated ID will be used.\n * @param initialProperties The initial mutable properties of the source.\n */\n@Stable\npublic class RasterSourceState private constructor(\n  sourceId: String,\n  sourceType: String,\n  initialProperties: Map<String, Pair<Boolean, Value>>,\n  url: StringValue,\n  tiles: StringListValue,\n  bounds: DoubleListValue,\n  minZoom: LongValue,\n  maxZoom: LongValue,\n  tileSize: LongValue,\n  scheme: SchemeValue,\n  attribution: StringValue,\n  volatile: BooleanValue,\n  prefetchZoomDelta: LongValue,\n  tileCacheBudget: TileCacheBudget,\n  minimumTileUpdateInterval: DoubleValue,\n  maxOverscaleFactorForParentTiles: LongValue,\n  tileRequestsDelay: DoubleValue,\n  tileNetworkRequestsDelay: DoubleValue,\n) : SourceState(\n  sourceId = sourceId,\n  sourceType = sourceType,\n  initialProperties = initialProperties,\n) {\n  public constructor(\n    sourceId: String = generateRandomSourceId(\"raster\"),\n  ) : this(\n    sourceId = sourceId,\n    sourceType = \"raster\",\n    initialProperties = emptyMap(),\n    url = StringValue.INITIAL,\n    tiles = StringListValue.INITIAL,\n    bounds = DoubleListValue.INITIAL,\n    minZoom = LongValue.INITIAL,\n    maxZoom = LongValue.INITIAL,\n    tileSize = LongValue.INITIAL,\n    scheme = SchemeValue.INITIAL,\n    attribution = StringValue.INITIAL,\n    volatile = BooleanValue.INITIAL,\n    prefetchZoomDelta = LongValue.INITIAL,\n    tileCacheBudget = TileCacheBudget.INITIAL,\n    minimumTileUpdateInterval = DoubleValue.INITIAL,\n    maxOverscaleFactorForParentTiles = LongValue.INITIAL,\n    tileRequestsDelay = DoubleValue.INITIAL,\n    tileNetworkRequestsDelay = DoubleValue.INITIAL,\n  )\n\n  private val urlState: MutableState<StringValue> = mutableStateOf(url)\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  public var url: StringValue by urlState\n\n  private val tilesState: MutableState<StringListValue> = mutableStateOf(tiles)\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  public var tiles: StringListValue by tilesState\n\n  private val boundsState: MutableState<DoubleListValue> = mutableStateOf(bounds)\n\n  /**\n   * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n   * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n   * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n   * Default value: [-180,-85.051129,180,85.051129].\n   */\n  public var bounds: DoubleListValue by boundsState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(minZoom)\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(maxZoom)\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val tileSizeState: MutableState<LongValue> = mutableStateOf(tileSize)\n\n  /**\n   * The minimum visual size to display tiles for this layer. Only configurable for raster layers.\n   * Default value: 512. The unit of tileSize is in pixels.\n   */\n  public var tileSize: LongValue by tileSizeState\n\n  private val schemeState: MutableState<SchemeValue> = mutableStateOf(scheme)\n\n  /**\n   * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\n   * Default value: \"xyz\".\n   */\n  public var scheme: SchemeValue by schemeState\n\n  private val attributionState: MutableState<StringValue> = mutableStateOf(attribution)\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  public var attribution: StringValue by attributionState\n\n  private val volatileState: MutableState<BooleanValue> = mutableStateOf(volatile)\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  public var volatile: BooleanValue by volatileState\n\n  private val prefetchZoomDeltaState: MutableState<LongValue> = mutableStateOf(prefetchZoomDelta)\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  public var prefetchZoomDelta: LongValue by prefetchZoomDeltaState\n\n  private val tileCacheBudgetState: MutableState<TileCacheBudget> = mutableStateOf(tileCacheBudget)\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  public var tileCacheBudget: TileCacheBudget by tileCacheBudgetState\n\n  private val minimumTileUpdateIntervalState: MutableState<DoubleValue> = mutableStateOf(minimumTileUpdateInterval)\n\n  /**\n   * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n   * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n   * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n   * Default value: 0.\n   */\n  public var minimumTileUpdateInterval: DoubleValue by minimumTileUpdateIntervalState\n\n  private val maxOverscaleFactorForParentTilesState: MutableState<LongValue> = mutableStateOf(maxOverscaleFactorForParentTiles)\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  public var maxOverscaleFactorForParentTiles: LongValue by maxOverscaleFactorForParentTilesState\n\n  private val tileRequestsDelayState: MutableState<DoubleValue> = mutableStateOf(tileRequestsDelay)\n\n  /**\n   * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n   * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n   * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n   * Default value: 0.\n   */\n  public var tileRequestsDelay: DoubleValue by tileRequestsDelayState\n\n  private val tileNetworkRequestsDelayState: MutableState<DoubleValue> = mutableStateOf(tileNetworkRequestsDelay)\n\n  /**\n   * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n   * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n   * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n   * superseded with tile-requests-delay property value, if both are provided.\n   * Default value: 0.\n   */\n  public var tileNetworkRequestsDelay: DoubleValue by tileNetworkRequestsDelayState\n\n  @Composable\n  override fun UpdateProperties() {\n    ActionWhenNotInitial(setBuilderPropertyAction, urlState, \"url\")\n    ActionWhenNotInitial(setBuilderPropertyAction, tilesState, \"tiles\")\n    ActionWhenNotInitial(setBuilderPropertyAction, boundsState, \"bounds\")\n    ActionWhenNotInitial(setBuilderPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, tileSizeState, \"tileSize\")\n    ActionWhenNotInitial(setBuilderPropertyAction, schemeState, \"scheme\")\n    ActionWhenNotInitial(setBuilderPropertyAction, attributionState, \"attribution\")\n    ActionWhenNotInitial(setBuilderPropertyAction, volatileState, \"volatile\")\n    ActionWhenNotInitial(setPropertyAction, prefetchZoomDeltaState, \"prefetch-zoom-delta\")\n    ActionWhenNotInitial(setPropertyAction, tileCacheBudgetState, \"tile-cache-budget\")\n    ActionWhenNotInitial(setPropertyAction, minimumTileUpdateIntervalState, \"minimum-tile-update-interval\")\n    ActionWhenNotInitial(setPropertyAction, maxOverscaleFactorForParentTilesState, \"max-overscale-factor-for-parent-tiles\")\n    ActionWhenNotInitial(setPropertyAction, tileRequestsDelayState, \"tile-requests-delay\")\n    ActionWhenNotInitial(setPropertyAction, tileNetworkRequestsDelayState, \"tile-network-requests-delay\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"url\" to url.value).takeIf { url.isNotInitial() },\n      (\"tiles\" to tiles.value).takeIf { tiles.isNotInitial() },\n      (\"bounds\" to bounds.value).takeIf { bounds.isNotInitial() },\n      (\"minzoom\" to minZoom.value).takeIf { minZoom.isNotInitial() },\n      (\"maxzoom\" to maxZoom.value).takeIf { maxZoom.isNotInitial() },\n      (\"tileSize\" to tileSize.value).takeIf { tileSize.isNotInitial() },\n      (\"scheme\" to scheme.value).takeIf { scheme.isNotInitial() },\n      (\"attribution\" to attribution.value).takeIf { attribution.isNotInitial() },\n      (\"volatile\" to volatile.value).takeIf { volatile.isNotInitial() },\n      (\"prefetch-zoom-delta\" to prefetchZoomDelta.value).takeIf { prefetchZoomDelta.isNotInitial() },\n      (\"tile-cache-budget\" to tileCacheBudget.value).takeIf { tileCacheBudget.isNotInitial() },\n      (\"minimum-tile-update-interval\" to minimumTileUpdateInterval.value).takeIf { minimumTileUpdateInterval.isNotInitial() },\n      (\"max-overscale-factor-for-parent-tiles\" to maxOverscaleFactorForParentTiles.value).takeIf { maxOverscaleFactorForParentTiles.isNotInitial() },\n      (\"tile-requests-delay\" to tileRequestsDelay.value).takeIf { tileRequestsDelay.isNotInitial() },\n      (\"tile-network-requests-delay\" to tileNetworkRequestsDelay.value).takeIf { tileNetworkRequestsDelay.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as RasterSourceState\n\n    if (sourceId != other.sourceId) return false\n    if (url != other.url) return false\n    if (tiles != other.tiles) return false\n    if (bounds != other.bounds) return false\n    if (minZoom != other.minZoom) return false\n    if (maxZoom != other.maxZoom) return false\n    if (tileSize != other.tileSize) return false\n    if (scheme != other.scheme) return false\n    if (attribution != other.attribution) return false\n    if (volatile != other.volatile) return false\n    if (prefetchZoomDelta != other.prefetchZoomDelta) return false\n    if (tileCacheBudget != other.tileCacheBudget) return false\n    if (minimumTileUpdateInterval != other.minimumTileUpdateInterval) return false\n    if (maxOverscaleFactorForParentTiles != other.maxOverscaleFactorForParentTiles) return false\n    if (tileRequestsDelay != other.tileRequestsDelay) return false\n    if (tileNetworkRequestsDelay != other.tileNetworkRequestsDelay) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(\n      sourceId,\n      url,\n      tiles,\n      bounds,\n      minZoom,\n      maxZoom,\n      tileSize,\n      scheme,\n      attribution,\n      volatile,\n      prefetchZoomDelta,\n      tileCacheBudget,\n      minimumTileUpdateInterval,\n      maxOverscaleFactorForParentTiles,\n      tileRequestsDelay,\n      tileNetworkRequestsDelay,\n    )\n  }\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String =\n    \"RasterSourceState(sourceId=$sourceId, url=$url, tiles=$tiles, bounds=$bounds, minZoom=$minZoom, maxZoom=$maxZoom, tileSize=$tileSize, scheme=$scheme, attribution=$attribution, volatile=$volatile, prefetchZoomDelta=$prefetchZoomDelta, tileCacheBudget=$tileCacheBudget, minimumTileUpdateInterval=$minimumTileUpdateInterval, maxOverscaleFactorForParentTiles=$maxOverscaleFactorForParentTiles, tileRequestsDelay=$tileRequestsDelay, tileNetworkRequestsDelay=$tileNetworkRequestsDelay)\"\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [RasterSourceState]\n     */\n    public val Saver: Saver<RasterSourceState, Holder> = Saver(\n      save = { it.save() },\n      restore = { holder ->\n        RasterSourceState(\n          sourceId = holder.sourcedId,\n          sourceType = \"raster\",\n          initialProperties = holder.savedProperties,\n          url = holder.savedProperties[\"url\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          tiles = holder.savedProperties[\"tiles\"]?.let { StringListValue(it.second) } ?: StringListValue.INITIAL,\n          bounds = holder.savedProperties[\"bounds\"]?.let { DoubleListValue(it.second) } ?: DoubleListValue.INITIAL,\n          minZoom = holder.savedProperties[\"minzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          maxZoom = holder.savedProperties[\"maxzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileSize = holder.savedProperties[\"tileSize\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          scheme = holder.savedProperties[\"scheme\"]?.let { SchemeValue(it.second) } ?: SchemeValue.INITIAL,\n          attribution = holder.savedProperties[\"attribution\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          volatile = holder.savedProperties[\"volatile\"]?.let { BooleanValue(it.second) } ?: BooleanValue.INITIAL,\n          prefetchZoomDelta = holder.savedProperties[\"prefetch-zoom-delta\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileCacheBudget = holder.savedProperties[\"tile-cache-budget\"]?.let { TileCacheBudget(it.second) } ?: TileCacheBudget.INITIAL,\n          minimumTileUpdateInterval = holder.savedProperties[\"minimum-tile-update-interval\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n          maxOverscaleFactorForParentTiles = holder.savedProperties[\"max-overscale-factor-for-parent-tiles\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileRequestsDelay = holder.savedProperties[\"tile-requests-delay\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n          tileNetworkRequestsDelay = holder.savedProperties[\"tile-network-requests-delay\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/generated/SourceProperties.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.sources.generated\n\nimport androidx.annotation.RestrictTo\nimport androidx.compose.runtime.Immutable\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.compose.style.HoldsValue\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\n\n/**\n * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed. Default value: \"xyz\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class SchemeValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the SchemeValue with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: SchemeValue = SchemeValue(Value(\"Scheme.INITIAL\"))\n\n    /**\n     * Default value for [SchemeValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: SchemeValue = SchemeValue(Value.nullValue())\n\n    /**\n     * Slippy map tilenames scheme.\n     */\n    @JvmField\n    public val XYZ: SchemeValue = SchemeValue(Value(\"xyz\"))\n\n    /**\n     * OSGeo spec scheme.\n     */\n    @JvmField\n    public val TMS: SchemeValue = SchemeValue(Value(\"tms\"))\n  }\n}\n\n/**\n * The encoding used by this source. Mapbox Terrain RGB is used by default Default value: \"mapbox\".\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class EncodingValue(public override val value: Value) : HoldsValue {\n  /**\n   * Construct the EncodingValue with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n  override fun isNotInitial(): Boolean = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: EncodingValue = EncodingValue(Value(\"Encoding.INITIAL\"))\n\n    /**\n     * Default value for [EncodingValue], setting [DEFAULT] will result in setting the property value\n     * defined by the rendering engine.\n     */\n    @JvmField\n    public val DEFAULT: EncodingValue = EncodingValue(Value.nullValue())\n\n    /**\n     * Terrarium format PNG tiles. See https://aws.amazon.com/es/public-datasets/terrain/ for more info.\n     */\n    @JvmField\n    public val TERRARIUM: EncodingValue = EncodingValue(Value(\"terrarium\"))\n\n    /**\n     * Mapbox Terrain RGB tiles. See https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb for more info.\n     */\n    @JvmField\n    public val MAPBOX: EncodingValue = EncodingValue(Value(\"mapbox\"))\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/sources/generated/VectorSourceState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.sources.generated\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.DoubleListValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.IdGenerator.generateRandomSourceId\nimport com.mapbox.maps.extension.compose.style.LongValue\nimport com.mapbox.maps.extension.compose.style.StringListValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.sources.PromoteIdValue\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\nimport com.mapbox.maps.extension.compose.style.sources.TileCacheBudget\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [VectorSourceState] using [VectorSourceState.Saver].\n * [init] will be called when the [VectorSourceState] is first created to configure its\n * initial state.\n *\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param sourceId The optional sourceId for the source state, by default, a random source ID will be used.\n * @param init A function initialise this [VectorSourceState].\n */\n@Composable\npublic inline fun rememberVectorSourceState(\n  key: String? = null,\n  sourceId: String = remember {\n    generateRandomSourceId(\"vector\")\n  },\n  crossinline init: VectorSourceState.() -> Unit = {}\n): VectorSourceState = rememberSaveable(key = key, saver = VectorSourceState.Saver) {\n  VectorSourceState(sourceId).apply(init)\n}\n\n/**\n * A vector tile source.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources#vector)\n *\n * @param sourceId The id of the source state, by default a random generated ID will be used.\n * @param initialProperties The initial mutable properties of the source.\n */\n@Stable\npublic class VectorSourceState private constructor(\n  sourceId: String,\n  sourceType: String,\n  initialProperties: Map<String, Pair<Boolean, Value>>,\n  url: StringValue,\n  tiles: StringListValue,\n  bounds: DoubleListValue,\n  scheme: SchemeValue,\n  minZoom: LongValue,\n  maxZoom: LongValue,\n  attribution: StringValue,\n  promoteId: PromoteIdValue,\n  volatile: BooleanValue,\n  prefetchZoomDelta: LongValue,\n  tileCacheBudget: TileCacheBudget,\n  minimumTileUpdateInterval: DoubleValue,\n  maxOverscaleFactorForParentTiles: LongValue,\n  tileRequestsDelay: DoubleValue,\n  tileNetworkRequestsDelay: DoubleValue,\n) : SourceState(\n  sourceId = sourceId,\n  sourceType = sourceType,\n  initialProperties = initialProperties,\n) {\n  public constructor(\n    sourceId: String = generateRandomSourceId(\"vector\"),\n  ) : this(\n    sourceId = sourceId,\n    sourceType = \"vector\",\n    initialProperties = emptyMap(),\n    url = StringValue.INITIAL,\n    tiles = StringListValue.INITIAL,\n    bounds = DoubleListValue.INITIAL,\n    scheme = SchemeValue.INITIAL,\n    minZoom = LongValue.INITIAL,\n    maxZoom = LongValue.INITIAL,\n    attribution = StringValue.INITIAL,\n    promoteId = PromoteIdValue.INITIAL,\n    volatile = BooleanValue.INITIAL,\n    prefetchZoomDelta = LongValue.INITIAL,\n    tileCacheBudget = TileCacheBudget.INITIAL,\n    minimumTileUpdateInterval = DoubleValue.INITIAL,\n    maxOverscaleFactorForParentTiles = LongValue.INITIAL,\n    tileRequestsDelay = DoubleValue.INITIAL,\n    tileNetworkRequestsDelay = DoubleValue.INITIAL,\n  )\n\n  private val urlState: MutableState<StringValue> = mutableStateOf(url)\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  public var url: StringValue by urlState\n\n  private val tilesState: MutableState<StringListValue> = mutableStateOf(tiles)\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  public var tiles: StringListValue by tilesState\n\n  private val boundsState: MutableState<DoubleListValue> = mutableStateOf(bounds)\n\n  /**\n   * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n   * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n   * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n   * Default value: [-180,-85.051129,180,85.051129].\n   */\n  public var bounds: DoubleListValue by boundsState\n\n  private val schemeState: MutableState<SchemeValue> = mutableStateOf(scheme)\n\n  /**\n   * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\n   * Default value: \"xyz\".\n   */\n  public var scheme: SchemeValue by schemeState\n\n  private val minZoomState: MutableState<LongValue> = mutableStateOf(minZoom)\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  public var minZoom: LongValue by minZoomState\n\n  private val maxZoomState: MutableState<LongValue> = mutableStateOf(maxZoom)\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  public var maxZoom: LongValue by maxZoomState\n\n  private val attributionState: MutableState<StringValue> = mutableStateOf(attribution)\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  public var attribution: StringValue by attributionState\n\n  private val promoteIdState: MutableState<PromoteIdValue> = mutableStateOf(promoteId)\n\n  /**\n   * A property to use as a feature id (for feature state). It can be a property\n   * name, or an expression to evaluate as the ID, or an object of the form `{<sourceLayer>:\n   * <propertyName/expression>}`. The expression can only be feature dependent if it is used. If specified as a\n   * string for a vector tile source, the same property is used across all its source layers.\n   * If specified as an object only specified source layers will have id overriden, others will fallback\n   * to original feature id\n   */\n  public var promoteId: PromoteIdValue by promoteIdState\n\n  private val volatileState: MutableState<BooleanValue> = mutableStateOf(volatile)\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  public var volatile: BooleanValue by volatileState\n\n  private val prefetchZoomDeltaState: MutableState<LongValue> = mutableStateOf(prefetchZoomDelta)\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  public var prefetchZoomDelta: LongValue by prefetchZoomDeltaState\n\n  private val tileCacheBudgetState: MutableState<TileCacheBudget> = mutableStateOf(tileCacheBudget)\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  public var tileCacheBudget: TileCacheBudget by tileCacheBudgetState\n\n  private val minimumTileUpdateIntervalState: MutableState<DoubleValue> = mutableStateOf(minimumTileUpdateInterval)\n\n  /**\n   * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n   * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n   * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n   * Default value: 0.\n   */\n  public var minimumTileUpdateInterval: DoubleValue by minimumTileUpdateIntervalState\n\n  private val maxOverscaleFactorForParentTilesState: MutableState<LongValue> = mutableStateOf(maxOverscaleFactorForParentTiles)\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  public var maxOverscaleFactorForParentTiles: LongValue by maxOverscaleFactorForParentTilesState\n\n  private val tileRequestsDelayState: MutableState<DoubleValue> = mutableStateOf(tileRequestsDelay)\n\n  /**\n   * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n   * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n   * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n   * Default value: 0.\n   */\n  public var tileRequestsDelay: DoubleValue by tileRequestsDelayState\n\n  private val tileNetworkRequestsDelayState: MutableState<DoubleValue> = mutableStateOf(tileNetworkRequestsDelay)\n\n  /**\n   * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n   * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n   * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n   * superseded with tile-requests-delay property value, if both are provided.\n   * Default value: 0.\n   */\n  public var tileNetworkRequestsDelay: DoubleValue by tileNetworkRequestsDelayState\n\n  @Composable\n  override fun UpdateProperties() {\n    ActionWhenNotInitial(setBuilderPropertyAction, urlState, \"url\")\n    ActionWhenNotInitial(setBuilderPropertyAction, tilesState, \"tiles\")\n    ActionWhenNotInitial(setBuilderPropertyAction, boundsState, \"bounds\")\n    ActionWhenNotInitial(setBuilderPropertyAction, schemeState, \"scheme\")\n    ActionWhenNotInitial(setBuilderPropertyAction, minZoomState, \"minzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, maxZoomState, \"maxzoom\")\n    ActionWhenNotInitial(setBuilderPropertyAction, attributionState, \"attribution\")\n    ActionWhenNotInitial(setBuilderPropertyAction, promoteIdState, \"promoteId\")\n    ActionWhenNotInitial(setBuilderPropertyAction, volatileState, \"volatile\")\n    ActionWhenNotInitial(setPropertyAction, prefetchZoomDeltaState, \"prefetch-zoom-delta\")\n    ActionWhenNotInitial(setPropertyAction, tileCacheBudgetState, \"tile-cache-budget\")\n    ActionWhenNotInitial(setPropertyAction, minimumTileUpdateIntervalState, \"minimum-tile-update-interval\")\n    ActionWhenNotInitial(setPropertyAction, maxOverscaleFactorForParentTilesState, \"max-overscale-factor-for-parent-tiles\")\n    ActionWhenNotInitial(setPropertyAction, tileRequestsDelayState, \"tile-requests-delay\")\n    ActionWhenNotInitial(setPropertyAction, tileNetworkRequestsDelayState, \"tile-network-requests-delay\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"url\" to url.value).takeIf { url.isNotInitial() },\n      (\"tiles\" to tiles.value).takeIf { tiles.isNotInitial() },\n      (\"bounds\" to bounds.value).takeIf { bounds.isNotInitial() },\n      (\"scheme\" to scheme.value).takeIf { scheme.isNotInitial() },\n      (\"minzoom\" to minZoom.value).takeIf { minZoom.isNotInitial() },\n      (\"maxzoom\" to maxZoom.value).takeIf { maxZoom.isNotInitial() },\n      (\"attribution\" to attribution.value).takeIf { attribution.isNotInitial() },\n      (\"promoteId\" to promoteId.value).takeIf { promoteId.isNotInitial() },\n      (\"volatile\" to volatile.value).takeIf { volatile.isNotInitial() },\n      (\"prefetch-zoom-delta\" to prefetchZoomDelta.value).takeIf { prefetchZoomDelta.isNotInitial() },\n      (\"tile-cache-budget\" to tileCacheBudget.value).takeIf { tileCacheBudget.isNotInitial() },\n      (\"minimum-tile-update-interval\" to minimumTileUpdateInterval.value).takeIf { minimumTileUpdateInterval.isNotInitial() },\n      (\"max-overscale-factor-for-parent-tiles\" to maxOverscaleFactorForParentTiles.value).takeIf { maxOverscaleFactorForParentTiles.isNotInitial() },\n      (\"tile-requests-delay\" to tileRequestsDelay.value).takeIf { tileRequestsDelay.isNotInitial() },\n      (\"tile-network-requests-delay\" to tileNetworkRequestsDelay.value).takeIf { tileNetworkRequestsDelay.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as VectorSourceState\n\n    if (sourceId != other.sourceId) return false\n    if (url != other.url) return false\n    if (tiles != other.tiles) return false\n    if (bounds != other.bounds) return false\n    if (scheme != other.scheme) return false\n    if (minZoom != other.minZoom) return false\n    if (maxZoom != other.maxZoom) return false\n    if (attribution != other.attribution) return false\n    if (promoteId != other.promoteId) return false\n    if (volatile != other.volatile) return false\n    if (prefetchZoomDelta != other.prefetchZoomDelta) return false\n    if (tileCacheBudget != other.tileCacheBudget) return false\n    if (minimumTileUpdateInterval != other.minimumTileUpdateInterval) return false\n    if (maxOverscaleFactorForParentTiles != other.maxOverscaleFactorForParentTiles) return false\n    if (tileRequestsDelay != other.tileRequestsDelay) return false\n    if (tileNetworkRequestsDelay != other.tileNetworkRequestsDelay) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(\n      sourceId,\n      url,\n      tiles,\n      bounds,\n      scheme,\n      minZoom,\n      maxZoom,\n      attribution,\n      promoteId,\n      volatile,\n      prefetchZoomDelta,\n      tileCacheBudget,\n      minimumTileUpdateInterval,\n      maxOverscaleFactorForParentTiles,\n      tileRequestsDelay,\n      tileNetworkRequestsDelay,\n    )\n  }\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String =\n    \"VectorSourceState(sourceId=$sourceId, url=$url, tiles=$tiles, bounds=$bounds, scheme=$scheme, minZoom=$minZoom, maxZoom=$maxZoom, attribution=$attribution, promoteId=$promoteId, volatile=$volatile, prefetchZoomDelta=$prefetchZoomDelta, tileCacheBudget=$tileCacheBudget, minimumTileUpdateInterval=$minimumTileUpdateInterval, maxOverscaleFactorForParentTiles=$maxOverscaleFactorForParentTiles, tileRequestsDelay=$tileRequestsDelay, tileNetworkRequestsDelay=$tileNetworkRequestsDelay)\"\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [VectorSourceState]\n     */\n    public val Saver: Saver<VectorSourceState, Holder> = Saver(\n      save = { it.save() },\n      restore = { holder ->\n        VectorSourceState(\n          sourceId = holder.sourcedId,\n          sourceType = \"vector\",\n          initialProperties = holder.savedProperties,\n          url = holder.savedProperties[\"url\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          tiles = holder.savedProperties[\"tiles\"]?.let { StringListValue(it.second) } ?: StringListValue.INITIAL,\n          bounds = holder.savedProperties[\"bounds\"]?.let { DoubleListValue(it.second) } ?: DoubleListValue.INITIAL,\n          scheme = holder.savedProperties[\"scheme\"]?.let { SchemeValue(it.second) } ?: SchemeValue.INITIAL,\n          minZoom = holder.savedProperties[\"minzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          maxZoom = holder.savedProperties[\"maxzoom\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          attribution = holder.savedProperties[\"attribution\"]?.let { StringValue(it.second) } ?: StringValue.INITIAL,\n          promoteId = holder.savedProperties[\"promoteId\"]?.let { PromoteIdValue(it.second) } ?: PromoteIdValue.INITIAL,\n          volatile = holder.savedProperties[\"volatile\"]?.let { BooleanValue(it.second) } ?: BooleanValue.INITIAL,\n          prefetchZoomDelta = holder.savedProperties[\"prefetch-zoom-delta\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileCacheBudget = holder.savedProperties[\"tile-cache-budget\"]?.let { TileCacheBudget(it.second) } ?: TileCacheBudget.INITIAL,\n          minimumTileUpdateInterval = holder.savedProperties[\"minimum-tile-update-interval\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n          maxOverscaleFactorForParentTiles = holder.savedProperties[\"max-overscale-factor-for-parent-tiles\"]?.let { LongValue(it.second) } ?: LongValue.INITIAL,\n          tileRequestsDelay = holder.savedProperties[\"tile-requests-delay\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n          tileNetworkRequestsDelay = holder.savedProperties[\"tile-network-requests-delay\"]?.let { DoubleValue(it.second) } ?: DoubleValue.INITIAL,\n        )\n      }\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/standard/BaseStandardStyleConfigurationState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.standard\n\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.StringValue\nimport com.mapbox.maps.extension.compose.style.standard.LightPresetValue.Companion.equals\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\n\n/**\n * Define the lightPreset style import config for [MapboxStandardStyle].\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class LightPresetValue(public val value: Value) {\n  /**\n   * Construct the [LightPresetValue] with [String].\n   */\n  public constructor(value: String) : this(Value(value))\n\n  /**\n   * Construct the [LightPresetValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * Get the name of the [LightPresetValue] as [String], or null if it's not a constant(e.g. an expression).\n   */\n  public val presetNameOrNull: String?\n    get() = value.contents as? String\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  internal val notInitial: Boolean\n    get() = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: LightPresetValue =\n      LightPresetValue(Value.valueOf(\"LightPresetValue.INITIAL\"))\n\n    /**\n     * Default value for [LightPresetValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: LightPresetValue = LightPresetValue(Value.nullValue())\n\n    /**\n     * The light preset for \"day\".\n     */\n    @JvmField\n    public val DAY: LightPresetValue = LightPresetValue(\"day\")\n\n    /**\n     * The light preset for \"night\".\n     */\n    @JvmField\n    public val NIGHT: LightPresetValue = LightPresetValue(\"night\")\n\n    /**\n     * The light preset for \"dusk\".\n     */\n    @JvmField\n    public val DUSK: LightPresetValue = LightPresetValue(\"dusk\")\n\n    /**\n     * The light preset for \"dawn\".\n     */\n    @JvmField\n    public val DAWN: LightPresetValue = LightPresetValue(\"dawn\")\n  }\n}\n\n/**\n * Define the color mode for Point of Interest labels style import config for [MapboxStandardStyle].\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class ColorModePointOfInterestLabelsValue(public val value: Value) {\n  /**\n   * Construct the [ColorModePointOfInterestLabelsValue] with [String].\n   */\n  public constructor(value: String) : this(Value(value))\n\n  /**\n   * Construct the [ColorModePointOfInterestLabelsValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * Get the name of the [ColorModePointOfInterestLabelsValue] as [String], or null if it's not a constant(e.g. an expression).\n   */\n  public val presetNameOrNull: String?\n    get() = value.contents as? String\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  internal val notInitial: Boolean\n    get() = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ColorModePointOfInterestLabelsValue =\n      ColorModePointOfInterestLabelsValue(Value.valueOf(\"ColorModePointOfInterestLabelsValue.INITIAL\"))\n\n    /**\n     * Default value for [ColorModePointOfInterestLabelsValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: ColorModePointOfInterestLabelsValue = ColorModePointOfInterestLabelsValue(Value.nullValue())\n\n    /**\n     * Use the default POI label colors.\n     */\n    @JvmField\n    public val DEFAULT_COLOR: ColorModePointOfInterestLabelsValue = ColorModePointOfInterestLabelsValue(\"default\")\n\n    /**\n     * Set a single custom color for POI labels.\n     */\n    @JvmField\n    public val SINGLE: ColorModePointOfInterestLabelsValue = ColorModePointOfInterestLabelsValue(\"single\")\n  }\n}\n\n/**\n * Define the background shape for Point of Interest labels style import config for [MapboxStandardStyle].\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class BackgroundPointOfInterestLabelsValue(public val value: Value) {\n  /**\n   * Construct the [BackgroundPointOfInterestLabelsValue] with [String].\n   */\n  public constructor(value: String) : this(Value(value))\n\n  /**\n   * Construct the [BackgroundPointOfInterestLabelsValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * Get the name of the [BackgroundPointOfInterestLabelsValue] as [String], or null if it's not a constant(e.g. an expression).\n   */\n  public val presetNameOrNull: String?\n    get() = value.contents as? String\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  internal val notInitial: Boolean\n    get() = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: BackgroundPointOfInterestLabelsValue =\n      BackgroundPointOfInterestLabelsValue(Value.valueOf(\"BackgroundPointOfInterestLabelsValue.INITIAL\"))\n\n    /**\n     * Default value for [BackgroundPointOfInterestLabelsValue], setting default will result in restoring the property value defined in the style.\n     */\n    @JvmField\n    public val DEFAULT: BackgroundPointOfInterestLabelsValue = BackgroundPointOfInterestLabelsValue(Value.nullValue())\n\n    /**\n     * Circle background shape for POI labels.\n     */\n    @JvmField\n    public val CIRCLE: BackgroundPointOfInterestLabelsValue = BackgroundPointOfInterestLabelsValue(\"circle\")\n\n    /**\n     * No background shape for POI labels.\n     */\n    @JvmField\n    public val NONE: BackgroundPointOfInterestLabelsValue = BackgroundPointOfInterestLabelsValue(\"none\")\n  }\n}\n\n/**\n * The state holder for the base [MapboxStandardStyle]'s & [MapboxStandardSatelliteStyle]'s configurations.\n */\n@Stable\npublic abstract class BaseStyleConfigurationState protected constructor(\n  initialShowPlaceLabels: BooleanValue = BooleanValue.INITIAL,\n  initialShowRoadLabels: BooleanValue = BooleanValue.INITIAL,\n  initialShowPointOfInterestLabels: BooleanValue = BooleanValue.INITIAL,\n  initialShowTransitLabels: BooleanValue = BooleanValue.INITIAL,\n  initialLightPreset: LightPresetValue = LightPresetValue.INITIAL,\n  initialFont: StringValue = StringValue.INITIAL,\n) {\n\n  /**\n   * Whether or not to show the place labels, default to true.\n   */\n  public var showPlaceLabels: BooleanValue by mutableStateOf(initialShowPlaceLabels)\n\n  /**\n   * Whether or not to show the road labels, default to true.\n   */\n  public var showRoadLabels: BooleanValue by mutableStateOf(initialShowRoadLabels)\n\n  /**\n   * Whether or not to show the point of interest labels, default to true.\n   */\n  public var showPointOfInterestLabels: BooleanValue by mutableStateOf(\n    initialShowPointOfInterestLabels\n  )\n\n  /**\n   * Whether or not to show the transit labels, default to true.\n   */\n  public var showTransitLabels: BooleanValue by mutableStateOf(initialShowTransitLabels)\n\n  /**\n   * The [LightPresetValue] settings of the Mapbox Standard Style, available lightPresets including \"day\", \"night\", \"dawn\", \"dusk\", defaults to \"day\".\n   */\n  public var lightPreset: LightPresetValue by mutableStateOf(initialLightPreset)\n\n  /**\n   * The font to be used with the standard style.\n   */\n  public var font: StringValue by mutableStateOf(initialFont)\n\n  internal companion object {\n    internal const val CONFIG_SHOW_PLACE_LABELS = \"showPlaceLabels\"\n    internal const val CONFIG_SHOW_ROAD_LABELS = \"showRoadLabels\"\n    internal const val CONFIG_SHOW_POINT_OF_INTEREST_LABELS = \"showPointOfInterestLabels\"\n    internal const val CONFIG_SHOW_TRANSIT_LABELS = \"showTransitLabels\"\n    internal const val CONFIG_LIGHT_PRESET = \"lightPreset\"\n    internal const val CONFIG_FONT = \"font\"\n  }\n}\n\n/**\n * Define the theme style import config for [MapboxStandardStyle].\n *\n * @param value the property wrapped in [Value] to be used with native renderer.\n */\n@Immutable\npublic data class ThemeValue(public val value: Value) {\n  /**\n   * Construct the [ThemeValue] with [String].\n   */\n  public constructor(value: String) : this(Value(value))\n\n  /**\n   * Construct the [ThemeValue] with [Mapbox Expression](https://docs.mapbox.com/style-spec/reference/expressions/).\n   */\n  public constructor(expression: Expression) : this(expression as Value)\n\n  /**\n   * Get the name of the [ThemeValue] as [String], or null if it's not a constant(e.g. an expression).\n   */\n  public val presetNameOrNull: String?\n    get() = value.contents as? String\n\n  /**\n   * True if the this value is not [INITIAL]\n   */\n  internal val notInitial: Boolean\n    get() = this !== INITIAL\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * Use this constant to signal that no property should be set to the Maps engine.\n     * This is needed because sending nullValue resets the value of the property to the default one\n     * defined by the Maps engine, which results in overriding the value from the loaded style.\n     * Moreover, we set a custom String to differentiate it from [DEFAULT], otherwise things\n     * like [kotlinx.coroutines.flow.Flow] or [androidx.compose.runtime.MutableState] won't be able\n     * to differentiate them because they use [equals].\n     */\n    @JvmField\n    internal val INITIAL: ThemeValue =\n      ThemeValue(Value.valueOf(\"ThemeValue.INITIAL\"))\n\n    /**\n     * The theme for \"default\".\n     */\n    @JvmField\n    public val DEFAULT: ThemeValue = ThemeValue(\"default\")\n\n    /**\n     * The theme for \"faded\".\n     */\n    @JvmField\n    public val FADED: ThemeValue = ThemeValue(\"faded\")\n\n    /**\n     * The theme for \"monochrome\".\n     */\n    @JvmField\n    public val MONOCHROME: ThemeValue = ThemeValue(\"monochrome\")\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/standard/BaseStandardStyleState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.standard\n\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState\nimport com.mapbox.maps.extension.compose.style.lights.LightsState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.RainState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\n\n/**\n * The base state holder for the Standard Style.\n */\n@OptIn(MapboxExperimental::class)\n@Stable\npublic open class BaseStandardStyleState protected constructor(\n  initialProjection: Projection,\n  initialAtmosphereState: AtmosphereState,\n  initialRainState: RainState,\n  initialSnowState: SnowState,\n  initialTerrainState: TerrainState = TerrainState.INITIAL,\n  initialLightsState: LightsState = LightsState.INITIAL,\n  initialStyleTransition: TransitionOptions,\n) {\n  /**\n   * The projection to be set to the map. Defaults to [Projection.INITIAL] meaning that projection value is taken from the Standard style definition.\n   */\n  public var projection: Projection by mutableStateOf(initialProjection)\n\n  /**\n   * The atmosphere to be set to the map. By default, no changes to the current atmosphere.\n   */\n  public var atmosphereState: AtmosphereState by mutableStateOf(initialAtmosphereState)\n\n  /**\n   * The snow effect to be set to the map. By default, no changes to the current snow.\n   */\n  @MapboxExperimental\n  public var snowState: SnowState by mutableStateOf(initialSnowState)\n\n  /**\n   * The rain effect to be set to the map. By default, no changes to the current rain.\n   */\n  @MapboxExperimental\n  public var rainState: RainState by mutableStateOf(initialRainState)\n\n  /**\n   * The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from Standard style definition.\n   */\n  public var terrainState: TerrainState by mutableStateOf(initialTerrainState)\n\n  /**\n   * The lights to be set to the map. By default, no changes to the current lights defined in style.\n   */\n  public var lightsState: LightsState by mutableStateOf(initialLightsState)\n\n  /**\n   * Transition options applied when loading the style.\n   */\n  public var styleTransition: TransitionOptions by mutableStateOf(initialStyleTransition)\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/standard/MapboxStandardSatelliteStyle.kt",
    "content": "// This file is generated and will be overwritten automatically.\n\npackage com.mapbox.maps.extension.compose.style.standard\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.style.GenericStyle\nimport com.mapbox.maps.extension.compose.style.MapboxStyleComposable\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState\nimport com.mapbox.maps.extension.compose.style.imports.MapboxStyleImportComposable\nimport com.mapbox.maps.extension.compose.style.imports.StyleImportsScope\nimport com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState\nimport com.mapbox.maps.extension.compose.style.lights.LightsState\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport com.mapbox.maps.extension.compose.style.rememberStyleState\nimport com.mapbox.maps.extension.compose.style.slotsContent\nimport com.mapbox.maps.extension.compose.style.styleImportsConfig\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\nimport com.mapbox.maps.extension.style.utils.transition\n\n/**\n * The convenient composable function to set a Mapbox Standard Satellite style to the map, with available slots\n * and config options.\n *\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param topSlot The content to be set to the top slot of the Mapbox Standard Satellite style.\n * @param middleSlot The content to be set to the middle slot of the Mapbox Standard Satellite style.\n * @param bottomSlot The content to be set to the bottom slot of the Mapbox Standard Satellite style.\n * @param projection The projection to be set to the map. Defaults to [Projection.DEFAULT] meaning that projection value is taken from the Standard style definition.\n * @param atmosphereState The atmosphere to be set to the map By default, no changes to the current atmosphere.\n * @param terrainState The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from Standard style definition.\n * @param lightsState The lights to be set to the map. By default, no changes to the current lights defined in style.\n * @param styleTransition Transition options applied when loading the style.\n * @param standardSatelliteStyleConfigurationState The configurations for [MapboxStandardSatelliteStyle].\n */\n@Composable\n@MapboxStyleComposable\n@Deprecated(message = \"Use MapboxStandardSatelliteStyle with StyleInteractionsState instead\", replaceWith = ReplaceWith(\"MapboxStandardSatelliteStyle(styleImportsContent, topSlot, middleSlot, bottomSlot, projection, atmosphereState, terrainState, lightsState, styleTransition, styleInteractionsState, standardSatelliteStyleConfigurationState)\"))\npublic fun MapboxStandardSatelliteStyle(\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  topSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  middleSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  bottomSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  projection: Projection = Projection.INITIAL,\n  atmosphereState: AtmosphereState = remember { AtmosphereState() },\n  terrainState: TerrainState = TerrainState.INITIAL,\n  lightsState: LightsState = LightsState.INITIAL,\n  styleTransition: TransitionOptions = remember { transition { } },\n  standardSatelliteStyleConfigurationState: StandardSatelliteStyleConfigurationState = remember {\n    StandardSatelliteStyleConfigurationState()\n  }\n) {\n  GenericStyle(\n    style = Style.STANDARD_SATELLITE,\n    styleImportsContent = styleImportsContent,\n    slotsContent = slotsContent {\n      topSlot?.let { slot(\"top\", it) }\n      middleSlot?.let { slot(\"middle\", it) }\n      bottomSlot?.let { slot(\"bottom\", it) }\n    },\n    styleState = rememberStyleState {\n      styleImportsConfig = styleImportsConfig {\n        importConfig(importId = \"basemap\") {\n          with(standardSatelliteStyleConfigurationState) {\n            if (showPlaceLabels.isNotInitial()) {\n              config(BaseStyleConfigurationState.CONFIG_SHOW_PLACE_LABELS, showPlaceLabels.value)\n            }\n            if (showRoadLabels.isNotInitial()) {\n              config(BaseStyleConfigurationState.CONFIG_SHOW_ROAD_LABELS, showRoadLabels.value)\n            }\n            if (showPointOfInterestLabels.isNotInitial()) {\n              config(\n                BaseStyleConfigurationState.CONFIG_SHOW_POINT_OF_INTEREST_LABELS,\n                showPointOfInterestLabels.value\n              )\n            }\n            if (showTransitLabels.isNotInitial()) {\n              config(\n                BaseStyleConfigurationState.CONFIG_SHOW_TRANSIT_LABELS,\n                showTransitLabels.value\n              )\n            }\n            if (lightPreset.notInitial) {\n              config(BaseStyleConfigurationState.CONFIG_LIGHT_PRESET, lightPreset.value)\n            }\n            if (font.isNotInitial()) {\n              config(BaseStyleConfigurationState.CONFIG_FONT, font.value)\n            }\n            if (showRoadsAndTransit.isNotInitial()) {\n              config(\n                StandardSatelliteStyleConfigurationState.CONFIG_SHOW_ROADS_AND_TRANSIT,\n                showRoadsAndTransit.value\n              )\n            }\n            if (showPedestrianRoads.isNotInitial()) {\n              config(\n                StandardSatelliteStyleConfigurationState.CONFIG_SHOW_PEDESTRIAN_ROADS,\n                showPedestrianRoads.value\n              )\n            }\n          }\n        }\n      }\n      this.projection = projection\n      this.atmosphereState = atmosphereState\n      this.terrainState = terrainState\n      this.lightsState = lightsState\n      this.styleTransition = styleTransition\n    },\n  )\n}\n\n/**\n * The convenient composable function to set a Mapbox Standard Satellite style to the map, with available slots\n * and config options.\n *\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param topSlot The content to be set to the top slot of the Mapbox Standard Satellite style.\n * @param middleSlot The content to be set to the middle slot of the Mapbox Standard Satellite style.\n * @param bottomSlot The content to be set to the bottom slot of the Mapbox Standard Satellite style.\n * @param projection The projection to be set to the map. Defaults to [Projection.DEFAULT] meaning that projection value is taken from the Standard style definition.\n * @param atmosphereState The atmosphere to be set to the map By default, no changes to the current atmosphere.\n * @param terrainState The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from Standard style definition.\n * @param lightsState The lights to be set to the map. By default, no changes to the current lights defined in style.\n * @param styleTransition Transition options applied when loading the style.\n * @param init The lambda that will be applied to the remembered [StandardSatelliteStyleConfigurationState].\n */\n@Composable\n@MapboxStyleComposable\n@Deprecated(message = \"Use MapboxStandardSatelliteStyle with StyleInteractionsState instead\", replaceWith = ReplaceWith(\"MapboxStandardSatelliteStyle(styleImportsContent, topSlot, middleSlot, bottomSlot, projection, atmosphereState, terrainState, lightsState, styleTransition, styleInteractionsState, standardSatelliteStyleConfigurationState)\"))\npublic fun MapboxStandardSatelliteStyle(\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  topSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  middleSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  bottomSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  projection: Projection = Projection.INITIAL,\n  atmosphereState: AtmosphereState = remember { AtmosphereState() },\n  terrainState: TerrainState = TerrainState.INITIAL,\n  lightsState: LightsState = LightsState.INITIAL,\n  styleTransition: TransitionOptions = remember { transition { } },\n  init: StandardSatelliteStyleConfigurationState.() -> Unit\n) {\n  MapboxStandardSatelliteStyle(\n    styleImportsContent = styleImportsContent,\n    topSlot = topSlot,\n    middleSlot = middleSlot,\n    bottomSlot = bottomSlot,\n    projection = projection,\n    atmosphereState = atmosphereState,\n    terrainState = terrainState,\n    lightsState = lightsState,\n    styleTransition = styleTransition,\n    standardSatelliteStyleConfigurationState = remember {\n      StandardSatelliteStyleConfigurationState()\n    }.apply(init)\n  )\n}\n\n/**\n * The convenient composable function to set a Mapbox Standard Satellite style to the map, with available slots\n * and config options.\n *\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param topSlot The content to be set to the top slot of the Mapbox Standard Satellite style.\n * @param middleSlot The content to be set to the middle slot of the Mapbox Standard Satellite style.\n * @param bottomSlot The content to be set to the bottom slot of the Mapbox Standard Satellite style.\n * @param projection The projection to be set to the map. Defaults to [Projection.DEFAULT] meaning that projection value is taken from the Standard style definition.\n * @param atmosphereState The atmosphere to be set to the map By default, no changes to the current atmosphere.\n * @param terrainState The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from Standard style definition.\n * @param lightsState The lights to be set to the map. By default, no changes to the current lights defined in style.\n * @param styleTransition Transition options applied when loading the style.\n * @param styleInteractionsState The [StyleInteractionsState] manages the map interactions defined for the style.\n * @param standardSatelliteStyleConfigurationState The configurations for [MapboxStandardSatelliteStyle].\n */\n@Composable\n@MapboxStyleComposable\npublic fun MapboxStandardSatelliteStyle(\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  topSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  middleSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  bottomSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  projection: Projection = Projection.INITIAL,\n  atmosphereState: AtmosphereState = remember { AtmosphereState() },\n  terrainState: TerrainState = TerrainState.INITIAL,\n  lightsState: LightsState = LightsState.INITIAL,\n  styleTransition: TransitionOptions = remember { transition { } },\n  styleInteractionsState: StyleInteractionsState? = null,\n  standardSatelliteStyleConfigurationState: StandardSatelliteStyleConfigurationState = remember {\n    StandardSatelliteStyleConfigurationState()\n  }\n) {\n  GenericStyle(\n    style = Style.STANDARD_SATELLITE,\n    styleImportsContent = styleImportsContent,\n    slotsContent = slotsContent {\n      topSlot?.let { slot(\"top\", it) }\n      middleSlot?.let { slot(\"middle\", it) }\n      bottomSlot?.let { slot(\"bottom\", it) }\n    },\n    styleState = rememberStyleState {\n      styleImportsConfig = styleImportsConfig {\n        importConfig(importId = \"basemap\") {\n          with(standardSatelliteStyleConfigurationState) {\n            if (showPlaceLabels.isNotInitial()) {\n              config(BaseStyleConfigurationState.CONFIG_SHOW_PLACE_LABELS, showPlaceLabels.value)\n            }\n            if (showRoadLabels.isNotInitial()) {\n              config(BaseStyleConfigurationState.CONFIG_SHOW_ROAD_LABELS, showRoadLabels.value)\n            }\n            if (showPointOfInterestLabels.isNotInitial()) {\n              config(\n                BaseStyleConfigurationState.CONFIG_SHOW_POINT_OF_INTEREST_LABELS,\n                showPointOfInterestLabels.value\n              )\n            }\n            if (showTransitLabels.isNotInitial()) {\n              config(\n                BaseStyleConfigurationState.CONFIG_SHOW_TRANSIT_LABELS,\n                showTransitLabels.value\n              )\n            }\n            if (lightPreset.notInitial) {\n              config(BaseStyleConfigurationState.CONFIG_LIGHT_PRESET, lightPreset.value)\n            }\n            if (font.isNotInitial()) {\n              config(BaseStyleConfigurationState.CONFIG_FONT, font.value)\n            }\n            if (showRoadsAndTransit.isNotInitial()) {\n              config(\n                StandardSatelliteStyleConfigurationState.CONFIG_SHOW_ROADS_AND_TRANSIT,\n                showRoadsAndTransit.value\n              )\n            }\n            if (showPedestrianRoads.isNotInitial()) {\n              config(\n                StandardSatelliteStyleConfigurationState.CONFIG_SHOW_PEDESTRIAN_ROADS,\n                showPedestrianRoads.value\n              )\n            }\n          }\n        }\n      }\n      this.projection = projection\n      this.atmosphereState = atmosphereState\n      this.terrainState = terrainState\n      this.lightsState = lightsState\n      this.styleTransition = styleTransition\n      if (styleInteractionsState != null) {\n        this.styleInteractionsState = styleInteractionsState\n      }\n    },\n  )\n}\n\n/**\n * The convenient composable function to set a Mapbox Standard Satellite style to the map, with available slots\n * and config options.\n *\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param topSlot The content to be set to the top slot of the Mapbox Standard Satellite style.\n * @param middleSlot The content to be set to the middle slot of the Mapbox Standard Satellite style.\n * @param bottomSlot The content to be set to the bottom slot of the Mapbox Standard Satellite style.\n * @param projection The projection to be set to the map. Defaults to [Projection.DEFAULT] meaning that projection value is taken from the Standard style definition.\n * @param atmosphereState The atmosphere to be set to the map By default, no changes to the current atmosphere.\n * @param terrainState The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from Standard style definition.\n * @param lightsState The lights to be set to the map. By default, no changes to the current lights defined in style.\n * @param styleTransition Transition options applied when loading the style.\n * @param styleInteractionsState The [StyleInteractionsState] manages the map interactions defined for the style.\n * @param init The lambda that will be applied to the remembered [StandardSatelliteStyleConfigurationState].\n */\n@Composable\n@MapboxStyleComposable\npublic fun MapboxStandardSatelliteStyle(\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  topSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  middleSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  bottomSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  projection: Projection = Projection.INITIAL,\n  atmosphereState: AtmosphereState = remember { AtmosphereState() },\n  terrainState: TerrainState = TerrainState.INITIAL,\n  lightsState: LightsState = LightsState.INITIAL,\n  styleTransition: TransitionOptions = remember { transition { } },\n  styleInteractionsState: StyleInteractionsState? = null,\n  init: StandardSatelliteStyleConfigurationState.() -> Unit\n) {\n  MapboxStandardSatelliteStyle(\n    styleImportsContent = styleImportsContent,\n    topSlot = topSlot,\n    middleSlot = middleSlot,\n    bottomSlot = bottomSlot,\n    projection = projection,\n    atmosphereState = atmosphereState,\n    terrainState = terrainState,\n    lightsState = lightsState,\n    styleTransition = styleTransition,\n    styleInteractionsState = styleInteractionsState,\n    standardSatelliteStyleConfigurationState = remember {\n      StandardSatelliteStyleConfigurationState()\n    }.apply(init)\n  )\n}\n\n/**\n * The convenient composable function to set a Mapbox Standard Satellite style. to the map, with available slots\n * and comprehensive config options.\n *\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param topSlot The content to be set to the top slot of the Mapbox Standard Satellite style..\n * @param middleSlot The content to be set to the middle slot of the Mapbox Standard Satellite style..\n * @param bottomSlot The content to be set to the bottom slot of the Mapbox Standard Satellite style..\n * @param standardSatelliteStyleState The state holder for the Mapbox Standard Satellite Style.\n */\n@Composable\n@MapboxStyleComposable\npublic fun MapboxStandardSatelliteStyle(\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  topSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  middleSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  bottomSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  standardSatelliteStyleState: StandardSatelliteStyleState = rememberStandardSatelliteStyleState(),\n) {\n  GenericStyle(\n    style = Style.STANDARD_SATELLITE,\n    styleImportsContent = styleImportsContent,\n    slotsContent = slotsContent {\n      topSlot?.let { slot(\"top\", it) }\n      middleSlot?.let { slot(\"middle\", it) }\n      bottomSlot?.let { slot(\"bottom\", it) }\n    },\n    styleState = rememberStyleState {\n      styleImportsConfig = styleImportsConfig {\n        importConfig(importId = \"basemap\") {\n          with(standardSatelliteStyleState.configurationsState) {\n            if (lightPreset.notInitial) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_LIGHT_PRESET, lightPreset.value)\n            }\n            if (font.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_FONT, font.value)\n            }\n            if (showPointOfInterestLabels.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_SHOW_POINT_OF_INTEREST_LABELS, showPointOfInterestLabels.value)\n            }\n            if (showTransitLabels.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_SHOW_TRANSIT_LABELS, showTransitLabels.value)\n            }\n            if (showPlaceLabels.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_SHOW_PLACE_LABELS, showPlaceLabels.value)\n            }\n            if (showRoadLabels.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_SHOW_ROAD_LABELS, showRoadLabels.value)\n            }\n            if (showRoadsAndTransit.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_SHOW_ROADS_AND_TRANSIT, showRoadsAndTransit.value)\n            }\n            if (showPedestrianRoads.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_SHOW_PEDESTRIAN_ROADS, showPedestrianRoads.value)\n            }\n            if (backgroundPointOfInterestLabels.notInitial) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_BACKGROUND_POINT_OF_INTEREST_LABELS, backgroundPointOfInterestLabels.value)\n            }\n            if (colorAdminBoundaries.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_ADMIN_BOUNDARIES, colorAdminBoundaries.value)\n            }\n            if (colorModePointOfInterestLabels.notInitial) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_MODE_POINT_OF_INTEREST_LABELS, colorModePointOfInterestLabels.value)\n            }\n            if (colorMotorways.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_MOTORWAYS, colorMotorways.value)\n            }\n            if (colorPlaceLabelHighlight.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_PLACE_LABEL_HIGHLIGHT, colorPlaceLabelHighlight.value)\n            }\n            if (colorPlaceLabels.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_PLACE_LABELS, colorPlaceLabels.value)\n            }\n            if (colorPlaceLabelSelect.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_PLACE_LABEL_SELECT, colorPlaceLabelSelect.value)\n            }\n            if (colorPointOfInterestLabels.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_POINT_OF_INTEREST_LABELS, colorPointOfInterestLabels.value)\n            }\n            if (colorRoadLabels.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_ROAD_LABELS, colorRoadLabels.value)\n            }\n            if (colorRoads.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_ROADS, colorRoads.value)\n            }\n            if (colorTrunks.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_COLOR_TRUNKS, colorTrunks.value)\n            }\n            if (densityPointOfInterestLabels.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_DENSITY_POINT_OF_INTEREST_LABELS, densityPointOfInterestLabels.value)\n            }\n            if (fuelingStationModePointOfInterestLabels.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_FUELING_STATION_MODE_POINT_OF_INTEREST_LABELS, fuelingStationModePointOfInterestLabels.value)\n            }\n            if (roadsBrightness.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_ROADS_BRIGHTNESS, roadsBrightness.value)\n            }\n            if (showAdminBoundaries.isNotInitial()) {\n              config(StandardSatelliteStyleConfigurationState.CONFIG_SHOW_ADMIN_BOUNDARIES, showAdminBoundaries.value)\n            }\n          }\n        }\n      }\n      this.projection = standardSatelliteStyleState.projection\n      this.atmosphereState = standardSatelliteStyleState.atmosphereState\n      this.terrainState = standardSatelliteStyleState.terrainState\n      this.lightsState = standardSatelliteStyleState.lightsState\n      this.styleTransition = standardSatelliteStyleState.styleTransition\n      if (standardSatelliteStyleState.interactionsState != null) {\n        this.styleInteractionsState = standardSatelliteStyleState.interactionsState!!\n      }\n    }\n  )\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/standard/MapboxStandardStyle.kt",
    "content": "// This file is generated and will be overwritten automatically.\n\npackage com.mapbox.maps.extension.compose.style.standard\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.currentComposer\nimport androidx.compose.runtime.key\nimport androidx.compose.runtime.remember\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.extension.compose.MapboxMapComposable\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.style.GenericStyle\nimport com.mapbox.maps.extension.compose.style.MapboxStyleComposable\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState\nimport com.mapbox.maps.extension.compose.style.imports.MapboxStyleImportComposable\nimport com.mapbox.maps.extension.compose.style.imports.StyleImportsScope\nimport com.mapbox.maps.extension.compose.style.lights.LightsState\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport com.mapbox.maps.extension.compose.style.rememberStyleState\nimport com.mapbox.maps.extension.compose.style.slotsContent\nimport com.mapbox.maps.extension.compose.style.styleImportsConfig\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\nimport com.mapbox.maps.extension.style.utils.transition\n\n/**\n * The convenient composable function to set a Mapbox Standard style to the map, with available slots\n * and config options.\n *\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param topSlot The content to be set to the top slot of the Mapbox Standard style.\n * @param middleSlot The content to be set to the middle slot of the Mapbox Standard style.\n * @param bottomSlot The content to be set to the bottom slot of the Mapbox Standard style.\n * @param projection The projection to be set to the map. Defaults to [Projection.DEFAULT] meaning that projection value is taken from the Standard style definition.\n * @param atmosphereState The atmosphere to be set to the map By default, no changes to the current atmosphere.\n * @param terrainState The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from Standard style definition.\n * @param lightsState The lights to be set to the map. By default, no changes to the current lights defined in style.\n * @param styleTransition Transition options applied when loading the style.\n * @param standardStyleConfigurationState The configurations for [MapboxStandardStyle].\n */\n@Composable\n@MapboxStyleComposable\n@Deprecated(message = \"Use MapboxStandardStyle with StandardStyleState instead.\", replaceWith = ReplaceWith(\"MapboxStandardStyle(styleImportsContent, topSlot, middleSlot, bottomSlot, standardStyleState)\"))\npublic fun MapboxStandardStyle(\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  topSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  middleSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  bottomSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  projection: Projection = Projection.INITIAL,\n  atmosphereState: AtmosphereState = remember { AtmosphereState() },\n  terrainState: TerrainState = TerrainState.INITIAL,\n  lightsState: LightsState = LightsState.INITIAL,\n  styleTransition: TransitionOptions = remember { transition { } },\n  standardStyleConfigurationState: StandardStyleConfigurationState = remember {\n    StandardStyleConfigurationState()\n  }\n) {\n  GenericStyle(\n    style = Style.STANDARD,\n    styleImportsContent = styleImportsContent,\n    slotsContent = slotsContent {\n      topSlot?.let { slot(\"top\", it) }\n      middleSlot?.let { slot(\"middle\", it) }\n      bottomSlot?.let { slot(\"bottom\", it) }\n    },\n    styleState = rememberStyleState {\n      styleImportsConfig = styleImportsConfig {\n        importConfig(importId = \"basemap\") {\n          with(standardStyleConfigurationState) {\n            if (showLandmarkIcons.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_LANDMARK_ICONS, showLandmarkIcons.value)\n            }\n            if (showPlaceLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_PLACE_LABELS, showPlaceLabels.value)\n            }\n            if (showRoadLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_ROAD_LABELS, showRoadLabels.value)\n            }\n            if (showPointOfInterestLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_POINT_OF_INTEREST_LABELS, showPointOfInterestLabels.value)\n            }\n            if (showTransitLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_TRANSIT_LABELS, showTransitLabels.value)\n            }\n            if (lightPreset.notInitial) {\n              config(StandardStyleConfigurationState.CONFIG_LIGHT_PRESET, lightPreset.value)\n            }\n            if (font.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_FONT, font.value)\n            }\n            if (show3dObjects.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW3D_OBJECTS, show3dObjects.value)\n            }\n            if (theme.notInitial) {\n              config(StandardStyleConfigurationState.CONFIG_THEME, theme.value)\n            }\n          }\n        }\n      }\n      this.projection = projection\n      this.atmosphereState = atmosphereState\n      this.terrainState = terrainState\n      this.lightsState = lightsState\n      this.styleTransition = styleTransition\n    },\n  )\n}\n\n/**\n * The convenient composable function to set a Mapbox Standard style to the map, with available slots\n * and config options.\n *\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param topSlot The content to be set to the top slot of the Mapbox Standard style.\n * @param middleSlot The content to be set to the middle slot of the Mapbox Standard style.\n * @param bottomSlot The content to be set to the bottom slot of the Mapbox Standard style.\n * @param projection The projection to be set to the map. Defaults to [Projection.DEFAULT] meaning that projection value is taken from the Standard style definition.\n * @param atmosphereState The atmosphere to be set to the map By default, no changes to the current atmosphere.\n * @param terrainState The terrain to be set to the map. Defaults to initial state meaning no custom terrain is added, default value is taken from Standard style definition.\n * @param lightsState The lights to be set to the map. By default, no changes to the current lights defined in style.\n * @param styleTransition Transition options applied when loading the style.\n * @param init The lambda that will be applied to the remembered [StandardStyleConfigurationState].\n */\n@Composable\n@MapboxStyleComposable\n@Deprecated(message = \"Use MapboxStandardStyle with StandardStyleState instead\", replaceWith = ReplaceWith(\"MapboxStandardStyle(styleImportsContent, topSlot, middleSlot, bottomSlot, standardStyleState)\"))\npublic fun MapboxStandardStyle(\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  topSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  middleSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  bottomSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  projection: Projection = Projection.INITIAL,\n  atmosphereState: AtmosphereState = remember { AtmosphereState() },\n  terrainState: TerrainState = TerrainState.INITIAL,\n  lightsState: LightsState = LightsState.INITIAL,\n  styleTransition: TransitionOptions = remember { transition { } },\n  init: StandardStyleConfigurationState.() -> Unit\n) {\n  MapboxStandardStyle(\n    styleImportsContent = styleImportsContent,\n    topSlot = topSlot,\n    middleSlot = middleSlot,\n    bottomSlot = bottomSlot,\n    projection = projection,\n    atmosphereState = atmosphereState,\n    terrainState = terrainState,\n    lightsState = lightsState,\n    styleTransition = styleTransition,\n    standardStyleConfigurationState = remember {\n      StandardStyleConfigurationState()\n    }.apply(init)\n  )\n}\n\n/**\n * The convenient composable function to set a [Mapbox Standard](https://docs.mapbox.com/map-styles/standard/guides/) is a general-purpose style with 3D visualization. to the map, with available slots\n * and comprehensive config options.\n *\n * @param styleImportsContent The style imports to be added to the current style, note layers and annotations shouldn't be added to this block.\n * @param topSlot The content to be set to the top slot of the [Mapbox Standard](https://docs.mapbox.com/map-styles/standard/guides/) is a general-purpose style with 3D visualization..\n * @param middleSlot The content to be set to the middle slot of the [Mapbox Standard](https://docs.mapbox.com/map-styles/standard/guides/) is a general-purpose style with 3D visualization..\n * @param bottomSlot The content to be set to the bottom slot of the [Mapbox Standard](https://docs.mapbox.com/map-styles/standard/guides/) is a general-purpose style with 3D visualization..\n * @param standardStyleState The state holder for the Mapbox Standard Style.\n */\n@Composable\n@MapboxStyleComposable\npublic fun MapboxStandardStyle(\n  styleImportsContent: (@Composable @MapboxStyleImportComposable StyleImportsScope.() -> Unit)? = null,\n  topSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  middleSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  bottomSlot: (@Composable @MapboxMapComposable () -> Unit)? = null,\n  standardStyleState: StandardStyleState = rememberStandardStyleState(),\n) {\n  GenericStyle(\n    style = Style.STANDARD,\n    styleImportsContent = styleImportsContent,\n    slotsContent = slotsContent {\n      topSlot?.let { slot(\"top\", it) }\n      middleSlot?.let { slot(\"middle\", it) }\n      bottomSlot?.let { slot(\"bottom\", it) }\n    },\n    styleState = rememberStyleState {\n      styleImportsConfig = styleImportsConfig {\n        importConfig(importId = \"basemap\") {\n          with(standardStyleState.configurationsState) {\n            if (theme.notInitial) {\n              config(StandardStyleConfigurationState.CONFIG_THEME, theme.value)\n            }\n            if (lightPreset.notInitial) {\n              config(StandardStyleConfigurationState.CONFIG_LIGHT_PRESET, lightPreset.value)\n            }\n            if (font.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_FONT, font.value)\n            }\n            if (showPointOfInterestLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_POINT_OF_INTEREST_LABELS, showPointOfInterestLabels.value)\n            }\n            if (showTransitLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_TRANSIT_LABELS, showTransitLabels.value)\n            }\n            if (showPlaceLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_PLACE_LABELS, showPlaceLabels.value)\n            }\n            if (showRoadLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_ROAD_LABELS, showRoadLabels.value)\n            }\n            if (showPedestrianRoads.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_PEDESTRIAN_ROADS, showPedestrianRoads.value)\n            }\n            if (show3dObjects.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW3D_OBJECTS, show3dObjects.value)\n            }\n            if (backgroundPointOfInterestLabels.notInitial) {\n              config(StandardStyleConfigurationState.CONFIG_BACKGROUND_POINT_OF_INTEREST_LABELS, backgroundPointOfInterestLabels.value)\n            }\n            if (colorAdminBoundaries.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_ADMIN_BOUNDARIES, colorAdminBoundaries.value)\n            }\n            if (colorBuildingHighlight.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_BUILDING_HIGHLIGHT, colorBuildingHighlight.value)\n            }\n            if (colorBuildings.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_BUILDINGS, colorBuildings.value)\n            }\n            if (colorBuildingSelect.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_BUILDING_SELECT, colorBuildingSelect.value)\n            }\n            if (colorCommercial.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_COMMERCIAL, colorCommercial.value)\n            }\n            if (colorEducation.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_EDUCATION, colorEducation.value)\n            }\n            if (colorGreenspace.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_GREENSPACE, colorGreenspace.value)\n            }\n            if (colorIndustrial.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_INDUSTRIAL, colorIndustrial.value)\n            }\n            if (colorLand.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_LAND, colorLand.value)\n            }\n            if (colorMedical.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_MEDICAL, colorMedical.value)\n            }\n            if (colorModePointOfInterestLabels.notInitial) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_MODE_POINT_OF_INTEREST_LABELS, colorModePointOfInterestLabels.value)\n            }\n            if (colorMotorways.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_MOTORWAYS, colorMotorways.value)\n            }\n            if (colorPlaceLabelHighlight.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_PLACE_LABEL_HIGHLIGHT, colorPlaceLabelHighlight.value)\n            }\n            if (colorPlaceLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_PLACE_LABELS, colorPlaceLabels.value)\n            }\n            if (colorPlaceLabelSelect.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_PLACE_LABEL_SELECT, colorPlaceLabelSelect.value)\n            }\n            if (colorPointOfInterestLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_POINT_OF_INTEREST_LABELS, colorPointOfInterestLabels.value)\n            }\n            if (colorRoadLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_ROAD_LABELS, colorRoadLabels.value)\n            }\n            if (colorRoads.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_ROADS, colorRoads.value)\n            }\n            if (colorTrunks.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_TRUNKS, colorTrunks.value)\n            }\n            if (colorWater.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_COLOR_WATER, colorWater.value)\n            }\n            if (densityPointOfInterestLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_DENSITY_POINT_OF_INTEREST_LABELS, densityPointOfInterestLabels.value)\n            }\n            if (fuelingStationModePointOfInterestLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_FUELING_STATION_MODE_POINT_OF_INTEREST_LABELS, fuelingStationModePointOfInterestLabels.value)\n            }\n            if (roadsBrightness.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_ROADS_BRIGHTNESS, roadsBrightness.value)\n            }\n            if (show3dBuildings.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW3D_BUILDINGS, show3dBuildings.value)\n            }\n            if (show3dFacades.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW3D_FACADES, show3dFacades.value)\n            }\n            if (show3dLandmarks.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW3D_LANDMARKS, show3dLandmarks.value)\n            }\n            if (show3dTrees.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW3D_TREES, show3dTrees.value)\n            }\n            if (showAdminBoundaries.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_ADMIN_BOUNDARIES, showAdminBoundaries.value)\n            }\n            if (showLandmarkIconLabels.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_LANDMARK_ICON_LABELS, showLandmarkIconLabels.value)\n            }\n            if (showLandmarkIcons.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_SHOW_LANDMARK_ICONS, showLandmarkIcons.value)\n            }\n            if (themeData.isNotInitial()) {\n              config(StandardStyleConfigurationState.CONFIG_THEME_DATA, themeData.value)\n            }\n          }\n        }\n      }\n      this.projection = standardStyleState.projection\n      this.atmosphereState = standardStyleState.atmosphereState\n      this.terrainState = standardStyleState.terrainState\n      this.lightsState = standardStyleState.lightsState\n      this.styleTransition = standardStyleState.styleTransition\n    }\n  )\n  val mapApplier = currentComposer.applier as? MapApplier\n    ?: throw IllegalStateException(\"Illegal use of Style composable outside of MapboxMapComposable\")\n  key(standardStyleState.interactionsState) {\n    standardStyleState.interactionsState.BindTo(mapboxMap = mapApplier.mapView.mapboxMap)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleConfigurationState.kt",
    "content": "// This file is generated and will be overwritten automatically.\n\npackage com.mapbox.maps.extension.compose.style.standard\n\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.StringValue\n\n/**\n * The state holder for the StandardSatelliteState's configurations.\n */\n@Stable\npublic class StandardSatelliteStyleConfigurationState private constructor(\n  initialShowRoadsAndTransit: BooleanValue,\n  initialShowPedestrianRoads: BooleanValue,\n  initialBackgroundPointOfInterestLabels: BackgroundPointOfInterestLabelsValue,\n  initialColorAdminBoundaries: ColorValue,\n  initialColorModePointOfInterestLabels: ColorModePointOfInterestLabelsValue,\n  initialColorMotorways: ColorValue,\n  initialColorPlaceLabelHighlight: ColorValue,\n  initialColorPlaceLabels: ColorValue,\n  initialColorPlaceLabelSelect: ColorValue,\n  initialColorPointOfInterestLabels: ColorValue,\n  initialColorRoadLabels: ColorValue,\n  initialColorRoads: ColorValue,\n  initialColorTrunks: ColorValue,\n  initialDensityPointOfInterestLabels: DoubleValue,\n  initialFuelingStationModePointOfInterestLabels: StringValue,\n  initialRoadsBrightness: DoubleValue,\n  initialShowAdminBoundaries: BooleanValue\n) : BaseStyleConfigurationState() {\n\n  /**\n   * Public constructor for StandardSatelliteStyleConfigurationState.\n   */\n  public constructor() : this(\n    initialShowRoadsAndTransit = BooleanValue.INITIAL,\n    initialShowPedestrianRoads = BooleanValue.INITIAL,\n    initialBackgroundPointOfInterestLabels = BackgroundPointOfInterestLabelsValue.INITIAL,\n    initialColorAdminBoundaries = ColorValue.INITIAL,\n    initialColorModePointOfInterestLabels = ColorModePointOfInterestLabelsValue.INITIAL,\n    initialColorMotorways = ColorValue.INITIAL,\n    initialColorPlaceLabelHighlight = ColorValue.INITIAL,\n    initialColorPlaceLabels = ColorValue.INITIAL,\n    initialColorPlaceLabelSelect = ColorValue.INITIAL,\n    initialColorPointOfInterestLabels = ColorValue.INITIAL,\n    initialColorRoadLabels = ColorValue.INITIAL,\n    initialColorRoads = ColorValue.INITIAL,\n    initialColorTrunks = ColorValue.INITIAL,\n    initialDensityPointOfInterestLabels = DoubleValue.INITIAL,\n    initialFuelingStationModePointOfInterestLabels = StringValue.INITIAL,\n    initialRoadsBrightness = DoubleValue.INITIAL,\n    initialShowAdminBoundaries = BooleanValue.INITIAL\n  )\n\n  /**\n   * Show or hide roads and transit networks.\n   */\n  public var showRoadsAndTransit: BooleanValue by mutableStateOf(initialShowRoadsAndTransit)\n\n  /**\n   * Show or hide pedestrian roads, paths, and trails.\n   */\n  public var showPedestrianRoads: BooleanValue by mutableStateOf(initialShowPedestrianRoads)\n\n  /**\n   * Set background shape for POI labels.\n   */\n  public var backgroundPointOfInterestLabels: BackgroundPointOfInterestLabelsValue by mutableStateOf(initialBackgroundPointOfInterestLabels)\n\n  /**\n   * Set a custom color for administrative boundaries.\n   */\n  public var colorAdminBoundaries: ColorValue by mutableStateOf(initialColorAdminBoundaries)\n\n  /**\n   * Use the default categorical colors or set a single custom color for POI labels.\n   */\n  public var colorModePointOfInterestLabels: ColorModePointOfInterestLabelsValue by mutableStateOf(initialColorModePointOfInterestLabels)\n\n  /**\n   * Set a custom color for motorway roads.\n   */\n  public var colorMotorways: ColorValue by mutableStateOf(initialColorMotorways)\n\n  /**\n   * Place label color used when setting highlight state.\n   */\n  public var colorPlaceLabelHighlight: ColorValue by mutableStateOf(initialColorPlaceLabelHighlight)\n\n  /**\n   * Set a custom color for place labels.\n   */\n  public var colorPlaceLabels: ColorValue by mutableStateOf(initialColorPlaceLabels)\n\n  /**\n   * Place label color used when setting select state.\n   */\n  public var colorPlaceLabelSelect: ColorValue by mutableStateOf(initialColorPlaceLabelSelect)\n\n  /**\n   * Set a custom color for POI labels.\n   */\n  public var colorPointOfInterestLabels: ColorValue by mutableStateOf(initialColorPointOfInterestLabels)\n\n  /**\n   * Set a custom color for road labels.\n   */\n  public var colorRoadLabels: ColorValue by mutableStateOf(initialColorRoadLabels)\n\n  /**\n   * Set a custom color for roads.\n   */\n  public var colorRoads: ColorValue by mutableStateOf(initialColorRoads)\n\n  /**\n   * Set a custom color for trunk roads.\n   */\n  public var colorTrunks: ColorValue by mutableStateOf(initialColorTrunks)\n\n  /**\n   * Set the density of POI labels.\n   */\n  public var densityPointOfInterestLabels: DoubleValue by mutableStateOf(initialDensityPointOfInterestLabels)\n\n  /**\n   * Control the visibility of fuel and electric charging station POI labels. Default displays both types.\n   */\n  public var fuelingStationModePointOfInterestLabels: StringValue by mutableStateOf(initialFuelingStationModePointOfInterestLabels)\n\n  /**\n   * Control how bright road network appear in dark styles.\n   */\n  public var roadsBrightness: DoubleValue by mutableStateOf(initialRoadsBrightness)\n\n  /**\n   * Show or hide administrative boundaries.\n   */\n  public var showAdminBoundaries: BooleanValue by mutableStateOf(initialShowAdminBoundaries)\n\n  internal companion object {\n    internal const val CONFIG_LIGHT_PRESET = \"lightPreset\"\n    internal const val CONFIG_FONT = \"font\"\n    internal const val CONFIG_SHOW_POINT_OF_INTEREST_LABELS = \"showPointOfInterestLabels\"\n    internal const val CONFIG_SHOW_TRANSIT_LABELS = \"showTransitLabels\"\n    internal const val CONFIG_SHOW_PLACE_LABELS = \"showPlaceLabels\"\n    internal const val CONFIG_SHOW_ROAD_LABELS = \"showRoadLabels\"\n    internal const val CONFIG_SHOW_ROADS_AND_TRANSIT = \"showRoadsAndTransit\"\n    internal const val CONFIG_SHOW_PEDESTRIAN_ROADS = \"showPedestrianRoads\"\n    internal const val CONFIG_BACKGROUND_POINT_OF_INTEREST_LABELS = \"backgroundPointOfInterestLabels\"\n    internal const val CONFIG_COLOR_ADMIN_BOUNDARIES = \"colorAdminBoundaries\"\n    internal const val CONFIG_COLOR_MODE_POINT_OF_INTEREST_LABELS = \"colorModePointOfInterestLabels\"\n    internal const val CONFIG_COLOR_MOTORWAYS = \"colorMotorways\"\n    internal const val CONFIG_COLOR_PLACE_LABEL_HIGHLIGHT = \"colorPlaceLabelHighlight\"\n    internal const val CONFIG_COLOR_PLACE_LABELS = \"colorPlaceLabels\"\n    internal const val CONFIG_COLOR_PLACE_LABEL_SELECT = \"colorPlaceLabelSelect\"\n    internal const val CONFIG_COLOR_POINT_OF_INTEREST_LABELS = \"colorPointOfInterestLabels\"\n    internal const val CONFIG_COLOR_ROAD_LABELS = \"colorRoadLabels\"\n    internal const val CONFIG_COLOR_ROADS = \"colorRoads\"\n    internal const val CONFIG_COLOR_TRUNKS = \"colorTrunks\"\n    internal const val CONFIG_DENSITY_POINT_OF_INTEREST_LABELS = \"densityPointOfInterestLabels\"\n    internal const val CONFIG_FUELING_STATION_MODE_POINT_OF_INTEREST_LABELS = \"fuelingStationModePointOfInterestLabels\"\n    internal const val CONFIG_ROADS_BRIGHTNESS = \"roadsBrightness\"\n    internal const val CONFIG_SHOW_ADMIN_BOUNDARIES = \"showAdminBoundaries\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/standard/StandardSatelliteStyleState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.standard\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState\nimport com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState\nimport com.mapbox.maps.extension.compose.style.lights.LightsState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.RainState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\nimport com.mapbox.maps.extension.style.utils.transition\n\n/**\n * Create and remember a [StandardSatelliteStyleState] with init block.\n *\n * @param init the initialization block to be applied to the [StandardSatelliteStyleState] after created and remembered.\n *\n * @return [StandardSatelliteStyleState]\n */\n@Composable\npublic inline fun rememberStandardSatelliteStyleState(crossinline init: StandardSatelliteStyleState.() -> Unit = {}): StandardSatelliteStyleState {\n  return remember {\n    StandardSatelliteStyleState()\n  }.apply(init)\n}\n\n/**\n * Experimental state holder for the Mapbox Standard Satellite Style.\n */\n@OptIn(MapboxExperimental::class)\n@Stable\npublic class StandardSatelliteStyleState internal constructor(\n  initialProjection: Projection,\n  initialAtmosphereState: AtmosphereState,\n  initialRainState: RainState,\n  initialSnowState: SnowState,\n  initialTerrainState: TerrainState = TerrainState.INITIAL,\n  initialLightsState: LightsState = LightsState.INITIAL,\n  initialStyleTransition: TransitionOptions,\n  initialStyleInteractionsState: StyleInteractionsState?,\n  initialConfigurationState: StandardSatelliteStyleConfigurationState,\n) : BaseStandardStyleState(\n  initialProjection = initialProjection,\n  initialAtmosphereState = initialAtmosphereState,\n  initialRainState = initialRainState,\n  initialSnowState = initialSnowState,\n  initialTerrainState = initialTerrainState,\n  initialLightsState = initialLightsState,\n  initialStyleTransition = initialStyleTransition,\n) {\n  /**\n   * Construct a default [StandardSatelliteStyleState].\n   */\n  public constructor() : this(\n    initialProjection = Projection.INITIAL,\n    initialAtmosphereState = AtmosphereState(),\n    initialRainState = RainState(),\n    initialSnowState = SnowState(),\n    initialTerrainState = TerrainState.INITIAL,\n    initialLightsState = LightsState.INITIAL,\n    initialStyleTransition = transition { },\n    initialStyleInteractionsState = null,\n    initialConfigurationState = StandardSatelliteStyleConfigurationState()\n  )\n\n  /**\n   * The [StyleInteractionsState] manages the map interactions defined for the style.\n   */\n  public var interactionsState: StyleInteractionsState? by mutableStateOf(initialStyleInteractionsState)\n\n  /**\n   * Configuration state options to be applied to Mapbox Standard Satellite Style.\n   */\n  public var configurationsState: StandardSatelliteStyleConfigurationState by mutableStateOf(initialConfigurationState)\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/standard/StandardStyleConfigurationState.kt",
    "content": "// This file is generated and will be overwritten automatically.\n\npackage com.mapbox.maps.extension.compose.style.standard\n\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.extension.compose.style.BooleanValue\nimport com.mapbox.maps.extension.compose.style.ColorValue\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.StringValue\n\n/**\n * The state holder for the StandardState's configurations.\n */\n@Stable\npublic class StandardStyleConfigurationState private constructor(\n  initialTheme: ThemeValue,\n  initialShowPedestrianRoads: BooleanValue,\n  initialShow3dObjects: BooleanValue,\n  initialBackgroundPointOfInterestLabels: BackgroundPointOfInterestLabelsValue,\n  initialColorAdminBoundaries: ColorValue,\n  initialColorBuildingHighlight: ColorValue,\n  initialColorBuildings: ColorValue,\n  initialColorBuildingSelect: ColorValue,\n  initialColorCommercial: ColorValue,\n  initialColorEducation: ColorValue,\n  initialColorGreenspace: ColorValue,\n  initialColorIndustrial: ColorValue,\n  initialColorLand: ColorValue,\n  initialColorMedical: ColorValue,\n  initialColorModePointOfInterestLabels: ColorModePointOfInterestLabelsValue,\n  initialColorMotorways: ColorValue,\n  initialColorPlaceLabelHighlight: ColorValue,\n  initialColorPlaceLabels: ColorValue,\n  initialColorPlaceLabelSelect: ColorValue,\n  initialColorPointOfInterestLabels: ColorValue,\n  initialColorRoadLabels: ColorValue,\n  initialColorRoads: ColorValue,\n  initialColorTrunks: ColorValue,\n  initialColorWater: ColorValue,\n  initialDensityPointOfInterestLabels: DoubleValue,\n  initialFuelingStationModePointOfInterestLabels: StringValue,\n  initialRoadsBrightness: DoubleValue,\n  initialShow3dBuildings: BooleanValue,\n  initialShow3dFacades: BooleanValue,\n  initialShow3dLandmarks: BooleanValue,\n  initialShow3dTrees: BooleanValue,\n  initialShowAdminBoundaries: BooleanValue,\n  initialShowLandmarkIconLabels: BooleanValue,\n  initialShowLandmarkIcons: BooleanValue,\n  initialThemeData: StringValue\n) : BaseStyleConfigurationState() {\n\n  /**\n   * Public constructor for StandardStyleConfigurationState.\n   */\n  public constructor() : this(\n    initialTheme = ThemeValue.INITIAL,\n    initialShowPedestrianRoads = BooleanValue.INITIAL,\n    initialShow3dObjects = BooleanValue.INITIAL,\n    initialBackgroundPointOfInterestLabels = BackgroundPointOfInterestLabelsValue.INITIAL,\n    initialColorAdminBoundaries = ColorValue.INITIAL,\n    initialColorBuildingHighlight = ColorValue.INITIAL,\n    initialColorBuildings = ColorValue.INITIAL,\n    initialColorBuildingSelect = ColorValue.INITIAL,\n    initialColorCommercial = ColorValue.INITIAL,\n    initialColorEducation = ColorValue.INITIAL,\n    initialColorGreenspace = ColorValue.INITIAL,\n    initialColorIndustrial = ColorValue.INITIAL,\n    initialColorLand = ColorValue.INITIAL,\n    initialColorMedical = ColorValue.INITIAL,\n    initialColorModePointOfInterestLabels = ColorModePointOfInterestLabelsValue.INITIAL,\n    initialColorMotorways = ColorValue.INITIAL,\n    initialColorPlaceLabelHighlight = ColorValue.INITIAL,\n    initialColorPlaceLabels = ColorValue.INITIAL,\n    initialColorPlaceLabelSelect = ColorValue.INITIAL,\n    initialColorPointOfInterestLabels = ColorValue.INITIAL,\n    initialColorRoadLabels = ColorValue.INITIAL,\n    initialColorRoads = ColorValue.INITIAL,\n    initialColorTrunks = ColorValue.INITIAL,\n    initialColorWater = ColorValue.INITIAL,\n    initialDensityPointOfInterestLabels = DoubleValue.INITIAL,\n    initialFuelingStationModePointOfInterestLabels = StringValue.INITIAL,\n    initialRoadsBrightness = DoubleValue.INITIAL,\n    initialShow3dBuildings = BooleanValue.INITIAL,\n    initialShow3dFacades = BooleanValue.INITIAL,\n    initialShow3dLandmarks = BooleanValue.INITIAL,\n    initialShow3dTrees = BooleanValue.INITIAL,\n    initialShowAdminBoundaries = BooleanValue.INITIAL,\n    initialShowLandmarkIconLabels = BooleanValue.INITIAL,\n    initialShowLandmarkIcons = BooleanValue.INITIAL,\n    initialThemeData = StringValue.INITIAL\n  )\n\n  /**\n   * Switch between predefined themes or set a custom theme.\n   */\n  public var theme: ThemeValue by mutableStateOf(initialTheme)\n\n  /**\n   * Show or hide pedestrian roads, paths, and trails.\n   */\n  public var showPedestrianRoads: BooleanValue by mutableStateOf(initialShowPedestrianRoads)\n\n  /**\n   * Show or hide all 3D objects, including buildings, landmarks, and trees.\n   */\n  public var show3dObjects: BooleanValue by mutableStateOf(initialShow3dObjects)\n\n  /**\n   * Set background shape for POI labels.\n   */\n  public var backgroundPointOfInterestLabels: BackgroundPointOfInterestLabelsValue by mutableStateOf(initialBackgroundPointOfInterestLabels)\n\n  /**\n   * Set a custom color for administrative boundaries.\n   */\n  public var colorAdminBoundaries: ColorValue by mutableStateOf(initialColorAdminBoundaries)\n\n  /**\n   * Set a custom color for building fill extrusion when setting highlight state.\n   */\n  public var colorBuildingHighlight: ColorValue by mutableStateOf(initialColorBuildingHighlight)\n\n  /**\n   * Set a custom color for 3D &amp; 2D buildings.\n   */\n  public var colorBuildings: ColorValue by mutableStateOf(initialColorBuildings)\n\n  /**\n   * Set a custom color for building fill extrusion when setting select state.\n   */\n  public var colorBuildingSelect: ColorValue by mutableStateOf(initialColorBuildingSelect)\n\n  /**\n   * Set a custom color for commercial areas.\n   */\n  public var colorCommercial: ColorValue by mutableStateOf(initialColorCommercial)\n\n  /**\n   * Set a custom color for education areas.\n   */\n  public var colorEducation: ColorValue by mutableStateOf(initialColorEducation)\n\n  /**\n   * Set a custom color for greenspaces such as forests, parks, and woods.\n   */\n  public var colorGreenspace: ColorValue by mutableStateOf(initialColorGreenspace)\n\n  /**\n   * Set a custom color for industrial areas and airports.\n   */\n  public var colorIndustrial: ColorValue by mutableStateOf(initialColorIndustrial)\n\n  /**\n   * Set a custom color for land.\n   */\n  public var colorLand: ColorValue by mutableStateOf(initialColorLand)\n\n  /**\n   * Set a custom color for medical areas.\n   */\n  public var colorMedical: ColorValue by mutableStateOf(initialColorMedical)\n\n  /**\n   * Use the default categorical colors or set a single custom color for POI labels.\n   */\n  public var colorModePointOfInterestLabels: ColorModePointOfInterestLabelsValue by mutableStateOf(initialColorModePointOfInterestLabels)\n\n  /**\n   * Set a custom color for motorway roads.\n   */\n  public var colorMotorways: ColorValue by mutableStateOf(initialColorMotorways)\n\n  /**\n   * Set a custom color for place labels when setting highlight state.\n   */\n  public var colorPlaceLabelHighlight: ColorValue by mutableStateOf(initialColorPlaceLabelHighlight)\n\n  /**\n   * Set a custom color for place labels.\n   */\n  public var colorPlaceLabels: ColorValue by mutableStateOf(initialColorPlaceLabels)\n\n  /**\n   * Set a custom color for place labels when setting select state.\n   */\n  public var colorPlaceLabelSelect: ColorValue by mutableStateOf(initialColorPlaceLabelSelect)\n\n  /**\n   * Set a custom color for POI labels.\n   */\n  public var colorPointOfInterestLabels: ColorValue by mutableStateOf(initialColorPointOfInterestLabels)\n\n  /**\n   * Set a custom color for road labels.\n   */\n  public var colorRoadLabels: ColorValue by mutableStateOf(initialColorRoadLabels)\n\n  /**\n   * Set a custom color for other roads.\n   */\n  public var colorRoads: ColorValue by mutableStateOf(initialColorRoads)\n\n  /**\n   * Set a custom color for trunk roads.\n   */\n  public var colorTrunks: ColorValue by mutableStateOf(initialColorTrunks)\n\n  /**\n   * Set a custom color for water.\n   */\n  public var colorWater: ColorValue by mutableStateOf(initialColorWater)\n\n  /**\n   * Set the density of POI labels.\n   */\n  public var densityPointOfInterestLabels: DoubleValue by mutableStateOf(initialDensityPointOfInterestLabels)\n\n  /**\n   * Control the visibility of fuel and electric charging station POI labels. Default displays both types.\n   */\n  public var fuelingStationModePointOfInterestLabels: StringValue by mutableStateOf(initialFuelingStationModePointOfInterestLabels)\n\n  /**\n   * Control how bright roads appear in dark styles.\n   */\n  public var roadsBrightness: DoubleValue by mutableStateOf(initialRoadsBrightness)\n\n  /**\n   * Show or hide 3D buildings.\n   */\n  public var show3dBuildings: BooleanValue by mutableStateOf(initialShow3dBuildings)\n\n  /**\n   * Show or hide 3D building facades.\n   */\n  public var show3dFacades: BooleanValue by mutableStateOf(initialShow3dFacades)\n\n  /**\n   * Show or hide 3D landmark buildings.\n   */\n  public var show3dLandmarks: BooleanValue by mutableStateOf(initialShow3dLandmarks)\n\n  /**\n   * Show or hide 3D trees.\n   */\n  public var show3dTrees: BooleanValue by mutableStateOf(initialShow3dTrees)\n\n  /**\n   * Show or hide administrative boundaries.\n   */\n  public var showAdminBoundaries: BooleanValue by mutableStateOf(initialShowAdminBoundaries)\n\n  /**\n   * Show or hide Landmark icon labels.\n   */\n  public var showLandmarkIconLabels: BooleanValue by mutableStateOf(initialShowLandmarkIconLabels)\n\n  /**\n   * Show or hide Landmark icons.\n   */\n  public var showLandmarkIcons: BooleanValue by mutableStateOf(initialShowLandmarkIcons)\n\n  /**\n   * Set a custom theme based on a look-up table (LUT).\n   */\n  public var themeData: StringValue by mutableStateOf(initialThemeData)\n\n  internal companion object {\n    internal const val CONFIG_THEME = \"theme\"\n    internal const val CONFIG_LIGHT_PRESET = \"lightPreset\"\n    internal const val CONFIG_FONT = \"font\"\n    internal const val CONFIG_SHOW_POINT_OF_INTEREST_LABELS = \"showPointOfInterestLabels\"\n    internal const val CONFIG_SHOW_TRANSIT_LABELS = \"showTransitLabels\"\n    internal const val CONFIG_SHOW_PLACE_LABELS = \"showPlaceLabels\"\n    internal const val CONFIG_SHOW_ROAD_LABELS = \"showRoadLabels\"\n    internal const val CONFIG_SHOW_PEDESTRIAN_ROADS = \"showPedestrianRoads\"\n    internal const val CONFIG_SHOW3D_OBJECTS = \"show3dObjects\"\n    internal const val CONFIG_BACKGROUND_POINT_OF_INTEREST_LABELS = \"backgroundPointOfInterestLabels\"\n    internal const val CONFIG_COLOR_ADMIN_BOUNDARIES = \"colorAdminBoundaries\"\n    internal const val CONFIG_COLOR_BUILDING_HIGHLIGHT = \"colorBuildingHighlight\"\n    internal const val CONFIG_COLOR_BUILDINGS = \"colorBuildings\"\n    internal const val CONFIG_COLOR_BUILDING_SELECT = \"colorBuildingSelect\"\n    internal const val CONFIG_COLOR_COMMERCIAL = \"colorCommercial\"\n    internal const val CONFIG_COLOR_EDUCATION = \"colorEducation\"\n    internal const val CONFIG_COLOR_GREENSPACE = \"colorGreenspace\"\n    internal const val CONFIG_COLOR_INDUSTRIAL = \"colorIndustrial\"\n    internal const val CONFIG_COLOR_LAND = \"colorLand\"\n    internal const val CONFIG_COLOR_MEDICAL = \"colorMedical\"\n    internal const val CONFIG_COLOR_MODE_POINT_OF_INTEREST_LABELS = \"colorModePointOfInterestLabels\"\n    internal const val CONFIG_COLOR_MOTORWAYS = \"colorMotorways\"\n    internal const val CONFIG_COLOR_PLACE_LABEL_HIGHLIGHT = \"colorPlaceLabelHighlight\"\n    internal const val CONFIG_COLOR_PLACE_LABELS = \"colorPlaceLabels\"\n    internal const val CONFIG_COLOR_PLACE_LABEL_SELECT = \"colorPlaceLabelSelect\"\n    internal const val CONFIG_COLOR_POINT_OF_INTEREST_LABELS = \"colorPointOfInterestLabels\"\n    internal const val CONFIG_COLOR_ROAD_LABELS = \"colorRoadLabels\"\n    internal const val CONFIG_COLOR_ROADS = \"colorRoads\"\n    internal const val CONFIG_COLOR_TRUNKS = \"colorTrunks\"\n    internal const val CONFIG_COLOR_WATER = \"colorWater\"\n    internal const val CONFIG_DENSITY_POINT_OF_INTEREST_LABELS = \"densityPointOfInterestLabels\"\n    internal const val CONFIG_FUELING_STATION_MODE_POINT_OF_INTEREST_LABELS = \"fuelingStationModePointOfInterestLabels\"\n    internal const val CONFIG_ROADS_BRIGHTNESS = \"roadsBrightness\"\n    internal const val CONFIG_SHOW3D_BUILDINGS = \"show3dBuildings\"\n    internal const val CONFIG_SHOW3D_FACADES = \"show3dFacades\"\n    internal const val CONFIG_SHOW3D_LANDMARKS = \"show3dLandmarks\"\n    internal const val CONFIG_SHOW3D_TREES = \"show3dTrees\"\n    internal const val CONFIG_SHOW_ADMIN_BOUNDARIES = \"showAdminBoundaries\"\n    internal const val CONFIG_SHOW_LANDMARK_ICON_LABELS = \"showLandmarkIconLabels\"\n    internal const val CONFIG_SHOW_LANDMARK_ICONS = \"showLandmarkIcons\"\n    internal const val CONFIG_THEME_DATA = \"theme-data\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/standard/StandardStyleState.kt",
    "content": "package com.mapbox.maps.extension.compose.style.standard\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.extension.compose.style.atmosphere.generated.AtmosphereState\nimport com.mapbox.maps.extension.compose.style.interactions.StyleInteractionsState\nimport com.mapbox.maps.extension.compose.style.lights.LightsState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.RainState\nimport com.mapbox.maps.extension.compose.style.precipitations.generated.SnowState\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport com.mapbox.maps.extension.compose.style.standard.generated.StandardStyleInteractionsState\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\nimport com.mapbox.maps.extension.style.utils.transition\n\n/**\n * Create and remember a [StandardStyleState] with init block.\n *\n * @param init the initialization block to be applied to the [StandardStyleState] after created and remembered.\n *\n * @return [StandardStyleState]\n */\n@Composable\npublic inline fun rememberStandardStyleState(crossinline init: StandardStyleState.() -> Unit = {}): StandardStyleState {\n  return remember {\n    StandardStyleState()\n  }.apply(init)\n}\n\n/**\n * Experimental state holder for the Mapbox Standard Style.\n */\n@OptIn(MapboxExperimental::class)\n@Stable\npublic class StandardStyleState internal constructor(\n  initialStyleInteractionsState: StandardStyleInteractionsState,\n  initialProjection: Projection,\n  initialAtmosphereState: AtmosphereState,\n  initialRainState: RainState,\n  initialSnowState: SnowState,\n  initialTerrainState: TerrainState = TerrainState.INITIAL,\n  initialLightsState: LightsState = LightsState.INITIAL,\n  initialStyleTransition: TransitionOptions,\n  initialConfigurationState: StandardStyleConfigurationState,\n) : BaseStandardStyleState(\n  initialProjection = initialProjection,\n  initialAtmosphereState = initialAtmosphereState,\n  initialRainState = initialRainState,\n  initialSnowState = initialSnowState,\n  initialTerrainState = initialTerrainState,\n  initialLightsState = initialLightsState,\n  initialStyleTransition = initialStyleTransition,\n) {\n  /**\n   * Construct a default [StandardStyleState].\n   */\n  public constructor() : this(\n    initialStyleInteractionsState = StandardStyleInteractionsState(),\n    initialProjection = Projection.INITIAL,\n    initialAtmosphereState = AtmosphereState(),\n    initialRainState = RainState(),\n    initialSnowState = SnowState(),\n    initialTerrainState = TerrainState.INITIAL,\n    initialLightsState = LightsState.INITIAL,\n    initialStyleTransition = transition { },\n    initialConfigurationState = StandardStyleConfigurationState()\n  )\n\n  /**\n   * The [StyleInteractionsState] manages the map interactions defined for the style.\n   */\n  public var interactionsState: StandardStyleInteractionsState by mutableStateOf(\n    initialStyleInteractionsState\n  )\n\n  /**\n   * Configuration state options to be applied to Mapbox Standard Style.\n   */\n  public var configurationsState: StandardStyleConfigurationState by mutableStateOf(initialConfigurationState)\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/standard/generated/StandardStyleInteractionsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.standard.generated\n\nimport androidx.compose.runtime.Composable\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.InteractionContext\nimport com.mapbox.maps.LongClickInteraction\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.style.interactions.BasicStyleInteractions\nimport com.mapbox.maps.extension.compose.style.interactions.generated.FeaturesetFeatureScope\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature\nimport com.mapbox.maps.interactions.standard.generated.StandardPoiFeature\nimport com.mapbox.maps.interactions.standard.generated.standardBuildings\nimport com.mapbox.maps.interactions.standard.generated.standardLandmarkIcons\nimport com.mapbox.maps.interactions.standard.generated.standardPlaceLabels\nimport com.mapbox.maps.interactions.standard.generated.standardPoi\n\n/**\n * [StandardStyleInteractionsState] manages the map interactions defined for Mapbox Standard Style.\n */\npublic class StandardStyleInteractionsState : BasicStyleInteractions() {\n\n  @Composable\n  internal fun BindTo(mapboxMap: MapboxMap) {\n    BindToMap(map = mapboxMap)\n  }\n\n  /**\n   * Add the [ClickInteraction] for featureset 'poi' from Mapbox Standard Style or Mapbox Standard Satellite Style.\n   *\n   * When several [ClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param importId optional Standard style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when the Standard featureset is clicked.\n   */\n  public fun onPoiClicked(\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onClick: FeaturesetFeatureScope.(StandardPoiFeature, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    entries.add { import ->\n      ClickInteraction.standardPoi(\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onClick = { feature, context ->\n          featuresetFeatureScope?.onClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Add the [LongClickInteraction] for featureset 'poi' from Mapbox Standard Style or Mapbox Standard Satellite Style.\n   *\n   * When several [LongClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param importId optional Standard style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when the Standard featureset is long clicked.\n   */\n  public fun onPoiLongClicked(\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onLongClick: FeaturesetFeatureScope.(StandardPoiFeature, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    entries.add { import ->\n      LongClickInteraction.standardPoi(\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onLongClick = { feature, context ->\n          featuresetFeatureScope?.onLongClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Add the [ClickInteraction] for featureset 'place-labels' from Mapbox Standard Style or Mapbox Standard Satellite Style.\n   *\n   * When several [ClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param importId optional Standard style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when the Standard featureset is clicked.\n   */\n  public fun onPlaceLabelsClicked(\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onClick: FeaturesetFeatureScope.(StandardPlaceLabelsFeature, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    entries.add { import ->\n      ClickInteraction.standardPlaceLabels(\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onClick = { feature, context ->\n          featuresetFeatureScope?.onClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Add the [LongClickInteraction] for featureset 'place-labels' from Mapbox Standard Style or Mapbox Standard Satellite Style.\n   *\n   * When several [LongClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param importId optional Standard style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when the Standard featureset is long clicked.\n   */\n  public fun onPlaceLabelsLongClicked(\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onLongClick: FeaturesetFeatureScope.(StandardPlaceLabelsFeature, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    entries.add { import ->\n      LongClickInteraction.standardPlaceLabels(\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onLongClick = { feature, context ->\n          featuresetFeatureScope?.onLongClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Add the [ClickInteraction] for featureset 'buildings' from Mapbox Standard Style or Mapbox Standard Satellite Style.\n   *\n   * When several [ClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param importId optional Standard style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when the Standard featureset is clicked.\n   */\n  public fun onBuildingsClicked(\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onClick: FeaturesetFeatureScope.(StandardBuildingsFeature, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    entries.add { import ->\n      ClickInteraction.standardBuildings(\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onClick = { feature, context ->\n          featuresetFeatureScope?.onClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Add the [LongClickInteraction] for featureset 'buildings' from Mapbox Standard Style or Mapbox Standard Satellite Style.\n   *\n   * When several [LongClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param importId optional Standard style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when the Standard featureset is long clicked.\n   */\n  public fun onBuildingsLongClicked(\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onLongClick: FeaturesetFeatureScope.(StandardBuildingsFeature, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    entries.add { import ->\n      LongClickInteraction.standardBuildings(\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onLongClick = { feature, context ->\n          featuresetFeatureScope?.onLongClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Add the [ClickInteraction] for featureset 'landmark-icons' from Mapbox Standard Style or Mapbox Standard Satellite Style.\n   *\n   * When several [ClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param importId optional Standard style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onClick callback triggered when the Standard featureset is clicked.\n   */\n  public fun onLandmarkIconsClicked(\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onClick: FeaturesetFeatureScope.(StandardLandmarkIconsFeature, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    entries.add { import ->\n      ClickInteraction.standardLandmarkIcons(\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onClick = { feature, context ->\n          featuresetFeatureScope?.onClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n   * Add the [LongClickInteraction] for featureset 'landmark-icons' from Mapbox Standard Style or Mapbox Standard Satellite Style.\n   *\n   * When several [LongClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n   *\n   * @param importId optional Standard style import id.\n   * @param filter optional filter. Defaults to NULL.\n   * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n   * @param onLongClick callback triggered when the Standard featureset is long clicked.\n   */\n  public fun onLandmarkIconsLongClicked(\n    importId: String? = null,\n    filter: Expression? = null,\n    radius: Double? = null,\n    onLongClick: FeaturesetFeatureScope.(StandardLandmarkIconsFeature, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    entries.add { import ->\n      LongClickInteraction.standardLandmarkIcons(\n        importId = importId ?: import,\n        filter = filter,\n        radius = radius,\n        onLongClick = { feature, context ->\n          featuresetFeatureScope?.onLongClick(feature, context) ?: false\n        }\n      )\n    }\n  }\n\n  /**\n  * Add the [ClickInteraction] for given featureset defined with [id] and optional [importId].\n  *\n  * When several [ClickInteraction]s are registered for the same [id] and [importId] - the callbacks will be triggered from last to first.\n  *\n  * @param id mandatory featureset id.\n  * @param importId optional style import id.\n  * @param filter optional filter. Defaults to NULL.\n  * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n  * @param onClick callback triggered when featureset is clicked.\n  */\n  public fun onFeaturesetClicked(\n  id: String,\n  importId: String? = null,\n  filter: Expression? = null,\n  radius: Double? = null,\n  onClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    clickInteractionFeatureset(\n      featuresetId = id,\n      importId = importId,\n      filter = filter,\n      radius = radius,\n      onClick = onClick\n    )\n  }\n\n  /**\n  * Add the [ClickInteraction] for given [id].\n  *\n  * When several [ClickInteraction]s are registered for the same [id] - the callbacks will be triggered from last to first.\n  *\n  * @param id mandatory layer id.\n  * @param filter optional filter. Defaults to NULL.\n  * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n  * @param onClick callback triggered when layer is clicked.\n  */\n  public fun onLayerClicked(\n  id: String,\n  filter: Expression? = null,\n  radius: Double? = null,\n  onClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    clickInteractionLayer(layerId = id, filter = filter, radius = radius, onClick = onClick)\n  }\n\n  /**\n  * Add the [LongClickInteraction] for given featureset defined with [id] and optional [importId].\n  *\n  * When several [LongClickInteraction]s are registered for the same [id] and [importId] - the callbacks will be triggered from last to first.\n  *\n  * @param id mandatory featureset id.\n  * @param importId optional style import id.\n  * @param filter optional filter. Defaults to NULL.\n  * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n  * @param onLongClick callback triggered when featureset is clicked.\n  */\n  public fun onFeaturesetLongClicked(\n  id: String,\n  importId: String? = null,\n  filter: Expression? = null,\n  radius: Double? = null,\n  onLongClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    longClickInteractionFeatureset(\n      featuresetId = id,\n      importId = importId,\n      filter = filter,\n      radius = radius,\n      onLongClick = onLongClick\n    )\n  }\n\n  /**\n  * Add the [LongClickInteraction] for given [id].\n  *\n  * When several [LongClickInteraction]s are registered for the same [id] - the callbacks will be triggered from last to first.\n  *\n  * @param id mandatory layer id.\n  * @param filter optional filter. Defaults to NULL.\n  * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n  * @param onLongClick callback triggered when layer is clicked.\n  */\n  public fun onLayerLongClicked(\n  id: String,\n  filter: Expression? = null,\n  radius: Double? = null,\n  onLongClick: FeaturesetFeatureScope.(FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    longClickInteractionLayer(layerId = id, filter = filter, radius = radius, onLongClick = onLongClick)\n  }\n\n  /**\n  * Add the [ClickInteraction] for the map surface itself.\n  *\n  * When several map [ClickInteraction]s are registered - the callbacks will be triggered from last to first.\n  *\n  * @param onClick callback triggered when map surface is clicked.\n  */\n  public fun onMapClicked(\n  onClick: FeaturesetFeatureScope.(InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    clickInteractionMap(onClick)\n  }\n\n  /**\n  * Add the [LongClickInteraction] for the map surface itself.\n  *\n  * When several map [LongClickInteraction]s are registered - the callbacks will be triggered from last to first.\n  *\n  * @param onLongClick callback triggered when map surface is clicked.\n  */\n  public fun onMapLongClicked(\n  onLongClick: FeaturesetFeatureScope.(InteractionContext) -> Boolean\n  ): StandardStyleInteractionsState = apply {\n    longClickInteractionMap(onLongClick)\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/terrain/TerrainStateApplier.kt",
    "content": "package com.mapbox.maps.extension.compose.style.terrain\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.extension.compose.style.sources.generated.RasterDemSourceState\nimport com.mapbox.maps.extension.compose.style.terrain.generated.TerrainState\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.launch\nimport java.util.Objects\n\n/**\n * A [MutableStateFlow] to keep the latest value for a Terrain Property\n */\nprivate typealias PropertyValueFlow = MutableStateFlow<Value>\n\n/**\n * Propagates the terrain state properties to [MapboxMap].\n *\n * There are two special cases:\n * 1. if [initial] is true then this class will behave as no-op. That is, it won't change anything related to Terrain from current [MapboxMap] state.\n * 2. if [initial] is false but [rasterDemSourceState] is `null` then terrain will be removed (the default (`Value.nullValue()`) in gl-native engine).\n */\ninternal class TerrainStateApplier internal constructor(\n  internal val rasterDemSourceState: RasterDemSourceState?,\n  initialProperties: Map<String, Value>,\n  internal val initial: Boolean,\n  private val coroutineScope: CoroutineScope = CoroutineScope(\n    Dispatchers.Main.immediate + SupervisorJob() + CoroutineName(\n      \"TerrainStateScope\"\n    )\n  ),\n) {\n  private var propertiesUpdateJobs: MutableList<Job> = mutableListOf()\n\n  /**\n   *  A shared flow to keep track of each property own flow ([PropertyValueFlow]).\n   *  Every time a new [Pair] is emitted in this flow we will start collecting its flow\n   *  ([PropertyValueFlow]), see [startCollectingPropertyFlows].\n   */\n  private val propertiesFlowsToCollect =\n    MutableSharedFlow<Pair<String, PropertyValueFlow>>(replay = Channel.UNLIMITED)\n\n  init {\n    initialProperties.forEach {\n      setProperty(it.key, it.value)\n    }\n  }\n\n  internal fun attachTo(mapboxMap: MapboxMap) {\n    if (initial) {\n      return\n    }\n    mapboxMap.setStyleTerrain(\n      properties = if (rasterDemSourceState != null) {\n        Value(\n          hashMapOf<String, Value>().also { map ->\n            map[\"source\"] = Value(rasterDemSourceState.sourceId)\n            // Get the most recent list of properties and their values\n            map.putAll(propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value })\n            logD(TAG, \"Setting all properties in one go: $map\")\n          }\n        ).also {\n          logD(TAG, \"Adding terrain: $this\")\n        }\n      } else {\n        Value.nullValue().also {\n          logD(TAG, \"Removing terrain: $this\")\n        }\n      },\n    ).onError {\n      logE(TAG, \"Failed to add terrain: $it\")\n    }.onValue {\n      if (rasterDemSourceState != null) {\n        logD(TAG, \"Added terrain: $this\")\n      }\n    }\n    startCollectingPropertyFlows(mapboxMap)\n  }\n\n  private fun startCollectingPropertyFlows(mapboxMap: MapboxMap) {\n    val collectNewPropertiesJob = coroutineScope.launch {\n      propertiesFlowsToCollect.collect { (name: String, valueFlow: MutableStateFlow<Value>) ->\n        val updatePropertyJob = coroutineScope.launch {\n          valueFlow.collect { value ->\n            logD(TAG, \"settingProperty: name=$name, value=$value ...\")\n            mapboxMap.setStyleTerrainProperty(name, value).onValue {\n              logD(TAG, \"settingProperty: name=$name, value=$value executed\")\n            }.onError { error ->\n              logW(TAG, \"Failed to set terrain property $name as $value: $error\")\n            }\n          }\n        }\n        propertiesUpdateJobs.add(updatePropertyJob)\n      }\n    }\n    propertiesUpdateJobs.add(collectNewPropertiesJob)\n  }\n\n  internal fun detach() {\n    // Stop any collect job that changes the source properties\n    propertiesUpdateJobs.forEach(Job::cancel)\n    propertiesUpdateJobs.clear()\n  }\n\n  internal fun setProperty(name: String, value: Value) {\n    logD(TAG, \"setProperty() called with: name = $name, value = $value\")\n    val setOfFlows = propertiesFlowsToCollect.replayCache\n    val currentFlow: Pair<String, MutableStateFlow<Value>>? = setOfFlows.firstOrNull {\n      it.first == name\n    }\n    if (currentFlow != null) {\n      currentFlow.second.value = value\n    } else {\n      logD(TAG, \"setProperty: emitting new property to listen to: $name\")\n      // Add the new property to the set of property flows we want to collect\n      propertiesFlowsToCollect.tryEmit(name to MutableStateFlow(value))\n    }\n  }\n\n  internal fun save(properties: Map<String, Value>): TerrainState.Holder = TerrainState.Holder(\n    rasterDemSourceState?.save(),\n    properties,\n    initial\n  )\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as TerrainStateApplier\n\n    if (rasterDemSourceState != other.rasterDemSourceState) return false\n    if (initial != other.initial) return false\n\n    val thisProperties = propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    val otherProperties = other.propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    if (thisProperties != otherProperties) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int {\n    val thisProperties = propertiesFlowsToCollect.replayCache.associate { it.first to it.second.value }\n    return Objects.hash(rasterDemSourceState, initial, thisProperties)\n  }\n\n  /**\n   * Returns a string representation of the object.\n   */\n  override fun toString(): String {\n    return \"TerrainStateApplier(rasterDemSourceState=$rasterDemSourceState, initial=$initial)\"\n  }\n\n  private companion object {\n    private const val TAG = \"TerrainStateApplier\"\n  }\n}"
  },
  {
    "path": "extension-compose/src/main/java/com/mapbox/maps/extension/compose/style/terrain/generated/TerrainState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.compose.style.terrain.generated\n\nimport android.os.Parcelable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.compose.runtime.setValue\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.compose.style.ActionWhenNotInitial\nimport com.mapbox.maps.extension.compose.style.DoubleValue\nimport com.mapbox.maps.extension.compose.style.Transition\nimport com.mapbox.maps.extension.compose.style.internal.ValueParceler\nimport com.mapbox.maps.extension.compose.style.sources.SourceState\nimport com.mapbox.maps.extension.compose.style.sources.generated.RasterDemSourceState\nimport com.mapbox.maps.extension.compose.style.terrain.TerrainStateApplier\nimport kotlinx.parcelize.Parcelize\nimport kotlinx.parcelize.TypeParceler\nimport java.util.Objects\n\n/**\n * Create and [rememberSaveable] a [TerrainState] using [TerrainState.Saver].\n * [init] will be called when the [TerrainState] is first created to configure its\n * initial state.\n *\n * @param rasterDemSourceState Mandatory [RasterDemSourceState] to which terrain will be added.\n * @param key An optional key to be used as a key for the saved value. If not provided we use the\n * automatically generated by the Compose runtime which is unique for the every exact code location\n * in the composition tree.\n * @param init A function initialise this [TerrainState].\n */\n@Composable\npublic inline fun rememberTerrainState(\n  rasterDemSourceState: RasterDemSourceState,\n  key: String? = null,\n  crossinline init: TerrainState.() -> Unit = {}\n): TerrainState = rememberSaveable(key = key, saver = TerrainState.Saver) {\n  TerrainState(rasterDemSourceState).apply(init)\n}\n\n/**\n * A global modifier that elevates layers and markers based on a DEM data source.\n *\n * @see [The online documentation](https://docs.mapbox.com/mapbox-gl-js/style-spec/terrain/)\n */\n@Stable\npublic class TerrainState private constructor(\n  internal val applier: TerrainStateApplier,\n  exaggeration: DoubleValue,\n  exaggerationTransition: Transition,\n) {\n\n  public constructor(\n    /**\n     * The [RasterDemSourceState] that drives the terrain.\n     */\n    rasterDemSourceState: RasterDemSourceState,\n  ) : this(\n    TerrainStateApplier(\n      rasterDemSourceState = rasterDemSourceState,\n      initialProperties = emptyMap(),\n      initial = false\n    ),\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n  )\n\n  /**\n   * Constructor used by [INITIAL] and [DISABLED].\n   */\n  private constructor(initial: Boolean) : this(\n    TerrainStateApplier(\n      rasterDemSourceState = null,\n      initialProperties = emptyMap(),\n      initial = initial\n    ),\n    DoubleValue.INITIAL,\n    Transition.INITIAL,\n  )\n\n  private val exaggerationState: MutableState<DoubleValue> = mutableStateOf(exaggeration)\n\n  /**\n   * Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value.\n   * Default value: 1. Value range: [0, 1000]\n   */\n  public var exaggeration: DoubleValue by exaggerationState\n\n  private val exaggerationTransitionState: MutableState<Transition> = mutableStateOf(exaggerationTransition)\n\n  /**\n   * Defines the transition of [exaggeration].\n   * Default value: 1. Value range: [0, 1000]\n   */\n  public var exaggerationTransition: Transition by exaggerationTransitionState\n\n  @Composable\n  internal fun UpdateProperties() {\n    applier.rasterDemSourceState?.UpdateProperties()\n    val action = applier::setProperty\n    ActionWhenNotInitial(action, exaggerationState, \"exaggeration\")\n    ActionWhenNotInitial(action, exaggerationTransitionState, \"exaggeration-transition\")\n  }\n\n  private fun getProperties(): Map<String, Value> =\n    listOfNotNull(\n      (\"exaggeration\" to exaggeration.value).takeIf { exaggeration.isNotInitial() },\n      (\"exaggeration-transition\" to exaggerationTransition.value).takeIf { exaggerationTransition.isNotInitial() },\n    ).toMap()\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as TerrainState\n\n    if (applier != other.applier) return false\n    if (exaggeration != other.exaggeration) return false\n    if (exaggerationTransition != other.exaggerationTransition) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int = Objects.hash(\n    applier,\n    exaggeration,\n    exaggerationTransition,\n  )\n\n  /**\n   * @return a string representation of the object.\n   */\n  override fun toString(): String {\n    return \"TerrainState(applier=$applier, exaggeration=$exaggeration, exaggerationTransition=$exaggerationTransition)\"\n  }\n\n  /**\n   * Terrain Holder class to be used within [Saver].\n   */\n  @Parcelize\n  @TypeParceler<Value, ValueParceler>\n  public data class Holder internal constructor(\n    /**\n     * Saved holder for [RasterDemSourceState].\n     */\n    val rasterDemSourceStateHolder: SourceState.Holder?,\n    /**\n     * Saved properties.\n     */\n    val savedProperties: Map<String, Value>,\n    /**\n     * If it is initial value meaning that no runtime terrain was set.\n     */\n    val initial: Boolean,\n  ) : Parcelable\n\n  /**\n   * Public companion object.\n   */\n  public companion object {\n    /**\n     * The default saver implementation for [TerrainState]\n     */\n    public val Saver: Saver<TerrainState, Holder> = Saver(\n      save = { it.applier.save(it.getProperties()) },\n      restore = { holder ->\n        TerrainState(\n          TerrainStateApplier(\n            holder.rasterDemSourceStateHolder?.let {\n              RasterDemSourceState.Saver.restore(it)\n            },\n            holder.savedProperties,\n            holder.initial\n          ),\n          exaggeration = holder.savedProperties[\"exaggeration\"]?.let { DoubleValue(it) } ?: DoubleValue.INITIAL,\n          exaggerationTransition = holder.savedProperties[\"exaggeration-transition\"]?.let { Transition(it) } ?: Transition.INITIAL,\n        )\n      }\n    )\n\n    /**\n     * Initial value for [TerrainState], meaning that no changes will be applied to the current style.\n     */\n    @JvmField\n    internal val INITIAL: TerrainState = TerrainState(initial = true)\n\n    /**\n     * Disabled value for [TerrainState], setting disabled will result in removing terrain.\n     */\n    @JvmField\n    public val DISABLED: TerrainState = TerrainState(initial = false)\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-compose/src/main/res/drawable/default_marker.xml",
    "content": "<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/default_marker_outer\" />\n    <item android:drawable=\"@drawable/default_marker_inner\" />\n    <item android:drawable=\"@drawable/default_marker_outer_stroke\" />\n    <item android:drawable=\"@drawable/default_marker_inner_stroke\" />\n</layer-list>"
  },
  {
    "path": "extension-compose/src/main/res/drawable/default_marker_inner.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"32dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"32\"\n    android:viewportHeight=\"40\">\n  <path\n      android:pathData=\"M16,22C19.314,22 22,19.314 22,16C22,12.686 19.314,10 16,10C12.686,10 10,12.686 10,16C10,19.314 12.686,22 16,22Z\"\n      android:fillColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "extension-compose/src/main/res/drawable/default_marker_inner_stroke.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"32dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"32\"\n    android:viewportHeight=\"40\">\n  <path\n      android:pathData=\"M16,22C19.314,22 22,19.314 22,16C22,12.686 19.314,10 16,10C12.686,10 10,12.686 10,16C10,19.314 12.686,22 16,22Z\"\n      android:strokeWidth=\"2\"\n      android:fillColor=\"#00000000\"\n      android:strokeColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "extension-compose/src/main/res/drawable/default_marker_outer.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"32dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"32\"\n    android:viewportHeight=\"40\">\n  <path\n      android:pathData=\"M16,2C8.268,2 2,8.243 2,15.945C2,28.348 14,36.994 15,37.569C16,38.144 16,38.144 17,37.569C18,36.994 30,27.462 30,15.945C30,8.243 23.732,2 16,2Z\"\n      android:fillColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "extension-compose/src/main/res/drawable/default_marker_outer_stroke.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"32dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"32\"\n    android:viewportHeight=\"40\">\n  <path\n      android:pathData=\"M16,2C8.268,2 2,8.243 2,15.945C2,28.348 14,36.994 15,37.569C16,38.144 16,38.144 17,37.569C18,36.994 30,27.462 30,15.945C30,8.243 23.732,2 16,2Z\"\n      android:strokeWidth=\"2\"\n      android:fillColor=\"#00000000\"\n      android:strokeColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "extension-compose/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Tag ID for storing marker disappear animation configuration -->\n    <item name=\"markerDisappearAnimation\" type=\"id\" />\n</resources>\n"
  },
  {
    "path": "extension-compose/src/test/java/com/mapbox/maps/extension/compose/MapApplierTest.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport com.mapbox.common.LogConfiguration\nimport com.mapbox.common.LoggingLevel\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.extension.compose.internal.MapApplier\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.extension.compose.style.internal.MapStyleNode\nimport com.mapbox.maps.extension.compose.style.internal.StyleLayerPositionNode\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.slot\nimport io.mockk.spyk\nimport io.mockk.unmockkAll\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\nimport org.robolectric.annotation.Implements\n\n@Implements(LogConfiguration::class)\npublic object ShadowLogConfiguration {\n  @JvmStatic\n  public fun getLoggingLevel(): LoggingLevel = LoggingLevel.DEBUG\n\n  @JvmStatic\n  public fun getLoggingLevel(@Suppress(\"UNUSED_PARAMETER\") category: String): LoggingLevel =\n    LoggingLevel.DEBUG\n}\n\n@Config(shadows = [ShadowLogConfiguration::class])\n@RunWith(RobolectricTestRunner::class)\npublic class MapApplierTest {\n  private val mapView = mockk<MapView>()\n  private lateinit var mapApplier: MapApplier\n\n  @Before\n  public fun setup() {\n    mapApplier = MapApplier(mapView)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    val messageSlot = slot<String>()\n    every { logD(any(), capture(messageSlot)) } answers {\n      println(\"logD: ${messageSlot.captured}\")\n    }\n    every { logW(any(), capture(messageSlot)) } answers {\n      println(\"logW: ${messageSlot.captured}\")\n    }\n    every { logE(any(), capture(messageSlot)) } answers {\n      println(\"logE: ${messageSlot.captured}\")\n    }\n  }\n\n  @After\n  public fun cleanUp() {\n    unmockkAll()\n  }\n\n  @Test\n  public fun testMapApplierInsertBottomUp() {\n    val mapNode0 = spyk(object : MapNode() {})\n    val mapNode1 = spyk(object : MapNode() {})\n\n    mapApplier.insertBottomUp(0, mapNode0)\n    mapApplier.insertBottomUp(1, mapNode1)\n\n    verify { mapNode0.onAttached(mapApplier.root) }\n    verify { mapNode1.onAttached(mapApplier.root) }\n  }\n\n  @Test\n  public fun testMapApplierRemove() {\n    val mapNode0 = spyk(object : MapNode() {})\n    val mapNode1 = spyk(object : MapNode() {})\n\n    mapApplier.insertBottomUp(0, mapNode0)\n    mapApplier.insertBottomUp(1, mapNode1)\n\n    mapApplier.remove(1, 1)\n    verify { mapNode1.onRemoved(mapApplier.root) }\n    verify(exactly = 0) { mapNode0.onRemoved(any()) }\n  }\n\n  @Test\n  public fun testMapApplierClear() {\n    val mapNode0 = spyk(object : MapNode() {})\n    val mapNode1 = spyk(object : MapNode() {})\n\n    mapApplier.insertBottomUp(0, mapNode0)\n    mapApplier.insertBottomUp(1, mapNode1)\n\n    mapApplier.clear()\n    verify { mapNode1.onClear() }\n    verify { mapNode1.onClear() }\n  }\n\n  @Test\n  public fun testMapApplierMoveToHigher() {\n    val mapNode0 = spyk(object : MapNode() {}, name = \"node0\")\n    val mapNode1 = spyk(object : MapNode() {}, name = \"node1\")\n    val mapNode2 = spyk(object : MapNode() {}, name = \"node2\")\n    val mapNode3 = spyk(object : MapNode() {}, name = \"node3\")\n    val mapNode4 = spyk(object : MapNode() {}, name = \"node4\")\n    val mapNode5 = spyk(object : MapNode() {}, name = \"node5\")\n\n    mapApplier.insertBottomUp(0, mapNode0)\n    mapApplier.insertBottomUp(1, mapNode1)\n    mapApplier.insertBottomUp(2, mapNode2)\n    mapApplier.insertBottomUp(3, mapNode3)\n    mapApplier.insertBottomUp(4, mapNode4)\n    mapApplier.insertBottomUp(5, mapNode5)\n\n    mapApplier.move(0, 4, 3)\n    // move: 0, 4, 3\n    // before: [null(node0#5), null(node1#6), null(node2#7), null(node3#8), null(node4#9), null(node5#10)]\n    // after: [null(node3#8), null(node0#5), null(node1#6), null(node2#7), null(node4#9), null(node5#10)]\n    verify { mapNode0.onMoved(mapApplier.root) }\n    verify { mapNode1.onMoved(mapApplier.root) }\n    verify { mapNode2.onMoved(mapApplier.root) }\n  }\n\n  @Test\n  public fun testMapApplierMoveToLower() {\n    val mapNode0 = spyk(object : MapNode() {}, name = \"node0\")\n    val mapNode1 = spyk(object : MapNode() {}, name = \"node1\")\n    val mapNode2 = spyk(object : MapNode() {}, name = \"node2\")\n    val mapNode3 = spyk(object : MapNode() {}, name = \"node3\")\n    val mapNode4 = spyk(object : MapNode() {}, name = \"node4\")\n    val mapNode5 = spyk(object : MapNode() {}, name = \"node5\")\n\n    mapApplier.insertBottomUp(0, mapNode0)\n    mapApplier.insertBottomUp(1, mapNode1)\n    mapApplier.insertBottomUp(2, mapNode2)\n    mapApplier.insertBottomUp(3, mapNode3)\n    mapApplier.insertBottomUp(4, mapNode4)\n    mapApplier.insertBottomUp(5, mapNode5)\n\n    mapApplier.move(4, 0, 2)\n    // move: 4, 0, 2\n    // before: [null(node0#5), null(node1#6), null(node2#7), null(node3#8), null(node4#9), null(node5#10)]\n    // after: [null(node4#9), null(node5#10), null(node0#5), null(node1#6), null(node2#7), null(node3#8)]\n    verify { mapNode4.onMoved(mapApplier.root) }\n    verify { mapNode5.onMoved(mapApplier.root) }\n  }\n\n  @Test\n  public fun testMapApplierMoveCorner() {\n    val mapNode0 = spyk(object : MapNode() {}, name = \"node0\")\n    val mapNode1 = spyk(object : MapNode() {}, name = \"node1\")\n    val mapNode2 = spyk(object : MapNode() {}, name = \"node2\")\n    val mapNode3 = spyk(object : MapNode() {}, name = \"node3\")\n    val mapNode4 = spyk(object : MapNode() {}, name = \"node4\")\n    val mapNode5 = spyk(object : MapNode() {}, name = \"node5\")\n\n    mapApplier.insertBottomUp(0, mapNode0)\n    mapApplier.insertBottomUp(1, mapNode1)\n    mapApplier.insertBottomUp(2, mapNode2)\n    mapApplier.insertBottomUp(3, mapNode3)\n    mapApplier.insertBottomUp(4, mapNode4)\n    mapApplier.insertBottomUp(5, mapNode5)\n\n    mapApplier.move(0, 5, 2)\n    verify { mapNode0.onMoved(mapApplier.root) }\n    verify { mapNode1.onMoved(mapApplier.root) }\n  }\n\n  @Test\n  public fun testMapApplierMoveCorner2() {\n    val mapNode0 = spyk(object : MapNode() {}, name = \"node0\")\n    val mapNode1 = spyk(object : MapNode() {}, name = \"node1\")\n    val mapNode2 = spyk(object : MapNode() {}, name = \"node2\")\n    val mapNode3 = spyk(object : MapNode() {}, name = \"node3\")\n    val mapNode4 = spyk(object : MapNode() {}, name = \"node4\")\n    val mapNode5 = spyk(object : MapNode() {}, name = \"node5\")\n\n    mapApplier.insertBottomUp(0, mapNode0)\n    mapApplier.insertBottomUp(1, mapNode1)\n    mapApplier.insertBottomUp(2, mapNode2)\n    mapApplier.insertBottomUp(3, mapNode3)\n    mapApplier.insertBottomUp(4, mapNode4)\n    mapApplier.insertBottomUp(5, mapNode5)\n\n    mapApplier.move(0, 6, 2)\n    verify { mapNode0.onMoved(mapApplier.root) }\n    verify { mapNode1.onMoved(mapApplier.root) }\n  }\n\n  @Test\n  public fun testMapApplierMoveCorner3() {\n    val mapNode0 = spyk(object : MapNode() {}, name = \"node0\")\n    val mapNode1 = spyk(object : MapNode() {}, name = \"node1\")\n    val mapNode2 = spyk(object : MapNode() {}, name = \"node2\")\n    val mapNode3 = spyk(object : MapNode() {}, name = \"node3\")\n    val mapNode4 = spyk(object : MapNode() {}, name = \"node4\")\n    val mapNode5 = spyk(object : MapNode() {}, name = \"node5\")\n\n    mapApplier.insertBottomUp(0, mapNode0)\n    mapApplier.insertBottomUp(1, mapNode1)\n    mapApplier.insertBottomUp(2, mapNode2)\n    mapApplier.insertBottomUp(3, mapNode3)\n    mapApplier.insertBottomUp(4, mapNode4)\n    mapApplier.insertBottomUp(5, mapNode5)\n\n    mapApplier.move(5, 0, 1)\n    verify { mapNode5.onMoved(mapApplier.root) }\n  }\n\n  @Test\n  public fun testMapApplierMoveAll() {\n    val mapNode0 = spyk(object : MapNode() {}, name = \"node0\")\n    val mapNode1 = spyk(object : MapNode() {}, name = \"node1\")\n    val mapNode2 = spyk(object : MapNode() {}, name = \"node2\")\n    val mapNode3 = spyk(object : MapNode() {}, name = \"node3\")\n    val mapNode4 = spyk(object : MapNode() {}, name = \"node4\")\n    val mapNode5 = spyk(object : MapNode() {}, name = \"node5\")\n\n    mapApplier.insertBottomUp(0, mapNode0)\n    mapApplier.insertBottomUp(1, mapNode1)\n    mapApplier.insertBottomUp(2, mapNode2)\n    mapApplier.insertBottomUp(3, mapNode3)\n    mapApplier.insertBottomUp(4, mapNode4)\n    mapApplier.insertBottomUp(5, mapNode5)\n\n    mapApplier.move(0, 6, 6)\n    verify { mapNode0.onMoved(mapApplier.root) }\n    verify { mapNode1.onMoved(mapApplier.root) }\n    verify { mapNode2.onMoved(mapApplier.root) }\n    verify { mapNode3.onMoved(mapApplier.root) }\n    verify { mapNode4.onMoved(mapApplier.root) }\n    verify { mapNode5.onMoved(mapApplier.root) }\n  }\n\n  /**\n   * Validates the relative position when layers are moved. Starting with:\n   * ```\n   * aboveLayer(\"style_layer\") {\n   *   layer(\"layer_01\")\n   *   layer(\"layer_02\")\n   *   layer(\"layer_03\")\n   * }\n   * ```\n   */\n  @Test\n  public fun moveWithinAboveLayerBlock() {\n    val mapApplier = MapApplier(mapView)\n    val mapStyleNodeChildren = mutableListOf<MapNode>()\n    val mapStyleNode: MapStyleNode = mockk(relaxed = true) {\n      every { children } returns mapStyleNodeChildren\n    }\n    mapApplier.insertBottomUp(0, mapStyleNode)\n    mapApplier.down(mapStyleNode)\n    Assert.assertEquals(mapStyleNode, mapApplier.root.children[0])\n    Assert.assertEquals(mapStyleNode, mapApplier.current)\n\n    // Insert the `aboveLayer(\"style_layer\")` node\n    val parent = StyleLayerPositionNode(LayerPosition(\"style_layer\", null, null))\n    mapApplier.insertBottomUp(0, parent)\n    mapApplier.down(parent)\n    Assert.assertEquals(parent, mapApplier.root.children[0].children[0])\n    Assert.assertEquals(parent, mapApplier.current)\n\n    val layer1 = SimpleLayerPositionAwareNode(\"layer_01\")\n    val layer2 = SimpleLayerPositionAwareNode(\"layer_02\")\n    val layer3 = SimpleLayerPositionAwareNode(\"layer_03\")\n\n    mapApplier.insertBottomUp(0, layer1)\n    // current render layers top to bottom:\n    // \"layer_01\"\n    // \"style_layer\"\n    layer1.validateInserted(above = \"style_layer\")\n\n    mapApplier.insertBottomUp(1, layer2)\n    // current render layers top to bottom:\n    // \"layer_02\"\n    // \"layer_01\"\n    // \"style_layer\"\n    layer2.validateInserted(above = \"layer_01\")\n\n    mapApplier.insertBottomUp(2, layer3)\n    // current render layers top to bottom:\n    // \"layer_03\"\n    // \"layer_02\"\n    // \"layer_01\"\n    // \"style_layer\"\n    layer3.validateInserted(above = \"layer_02\")\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_02\", \"layer_03\"))\n\n    // move layer_02 to the first position in the composition tree\n    mapApplier.move(1, 0, 1)\n    // current render layers top to bottom:\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"layer_02\"\n    // \"style_layer\"\n    parent.assertLayerIds(listOf(\"layer_02\", \"layer_01\", \"layer_03\"))\n    // Make sure layer_02 is moved and rendered above style_layer\n    layer2.validateMoved(above = \"style_layer\")\n    // Make sure layer_01 is moved and rendered above layer_02\n    layer1.validateMoved(above = \"layer_02\")\n    // Make sure layer_03 is moved and rendered above layer_01\n    layer3.validateMoved(above = \"layer_01\")\n\n    // move layer_01 and layer_03 to the first position in the composition tree\n    mapApplier.move(1, 0, 2)\n    // current render layers:\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"style_layer\"\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_03\", \"layer_02\"))\n    // Make sure layer_01 is moved and rendered above style_layer\n    layer1.validateMoved(above = \"style_layer\")\n    // Make sure layer_03 is moved and rendered above layer_01\n    layer3.validateMoved(above = \"layer_01\")\n    // Make sure layer_02 is moved and rendered above layer_03\n    layer2.validateMoved(above = \"layer_03\")\n\n    // Insert layer_04\n    val layer4 = SimpleLayerPositionAwareNode(\"layer_04\")\n    mapApplier.insertBottomUp(3, layer4)\n    // current render layers:\n    // \"layer_04\"\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"style_layer\"\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_03\", \"layer_02\", \"layer_04\"))\n    // Make sure layer_01 and layer_03 are moved and rendered above layer_04\n    mapApplier.move(0, 4, 2)\n    parent.assertLayerIds(listOf(\"layer_02\", \"layer_04\", \"layer_01\", \"layer_03\"))\n    // current render layers:\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"layer_04\"\n    // \"layer_02\"\n    // \"style_layer\"\n    layer3.validateMoved(above = \"layer_01\")\n    layer1.validateMoved(above = \"layer_04\")\n    layer4.validateMoved(above = \"layer_02\")\n    layer2.validateMoved(above = \"style_layer\")\n  }\n\n  /**\n   * Validates the relative position when layers are moved. Starting with:\n   * ```\n   * belowLayer(\"style_layer\") {\n   *   layer(\"layer_01\")\n   *   layer(\"layer_02\")\n   *   layer(\"layer_03\")\n   * }\n   * ```\n   */\n  @Test\n  public fun moveWithinBelowLayerBlock() {\n    val mapApplier = MapApplier(mapView)\n    val mapStyleNodeChildren = mutableListOf<MapNode>()\n    val mapStyleNode: MapStyleNode = mockk(relaxed = true) {\n      every { children } returns mapStyleNodeChildren\n    }\n    mapApplier.insertBottomUp(0, mapStyleNode)\n    mapApplier.down(mapStyleNode)\n    Assert.assertEquals(mapStyleNode, mapApplier.root.children[0])\n    Assert.assertEquals(mapStyleNode, mapApplier.current)\n\n    // Insert the `belowLayer(\"style_layer\")` node\n    val parent = StyleLayerPositionNode(LayerPosition(null, \"style_layer\", null))\n    mapApplier.insertBottomUp(0, parent)\n    mapApplier.down(parent)\n    Assert.assertEquals(parent, mapApplier.root.children[0].children[0])\n    Assert.assertEquals(parent, mapApplier.current)\n\n    val layer1 = SimpleLayerPositionAwareNode(\"layer_01\")\n    val layer2 = SimpleLayerPositionAwareNode(\"layer_02\")\n    val layer3 = SimpleLayerPositionAwareNode(\"layer_03\")\n\n    mapApplier.insertBottomUp(0, layer1)\n    // current render layers top to bottom:\n    // \"style_layer\"\n    // \"layer_01\"\n    layer1.validateInserted(below = \"style_layer\")\n\n    mapApplier.insertBottomUp(1, layer2)\n    // current render layers top to bottom:\n    // \"style_layer\"\n    // \"layer_02\"\n    // \"layer_01\"\n    layer2.validateInserted(above = \"layer_01\")\n\n    mapApplier.insertBottomUp(2, layer3)\n    // current render layers top to bottom:\n    // \"style_layer\"\n    // \"layer_03\"\n    // \"layer_02\"\n    // \"layer_01\"\n    layer3.validateInserted(above = \"layer_02\")\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_02\", \"layer_03\"))\n\n    // move layer_02 to the first position in the composition tree\n    mapApplier.move(1, 0, 1)\n    // current render layers top to bottom:\n    // \"style_layer\"\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"layer_02\"\n    parent.assertLayerIds(listOf(\"layer_02\", \"layer_01\", \"layer_03\"))\n    // Make sure layer_02 is moved and rendered below style_layer\n    layer2.validateMoved(below = \"style_layer\")\n    // Make sure layer_01 is moved and rendered above layer_02\n    layer1.validateMoved(above = \"layer_02\")\n    // Make sure layer_03 is moved and rendered above layer_01\n    layer3.validateMoved(above = \"layer_01\")\n\n    // move layer_01 and layer_03 to the first position in the composition tree\n    mapApplier.move(1, 0, 2)\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_03\", \"layer_02\"))\n    // Make sure layer_01 is moved and rendered below style_layer\n    layer1.validateMoved(below = \"style_layer\")\n    // Make sure layer_03 is moved and rendered above layer_01\n    layer3.validateMoved(above = \"layer_01\")\n    // Make sure layer_02 is moved and rendered above layer_03\n    layer2.validateMoved(above = \"layer_03\")\n\n    // Insert layer_04\n    val layer4 = SimpleLayerPositionAwareNode(\"layer_04\")\n    mapApplier.insertBottomUp(3, layer4)\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_04\"\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_03\", \"layer_02\", \"layer_04\"))\n    // Make sure layer_01 and layer_03 are moved and rendered above layer_04\n    mapApplier.move(0, 4, 2)\n    parent.assertLayerIds(listOf(\"layer_02\", \"layer_04\", \"layer_01\", \"layer_03\"))\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"layer_04\"\n    // \"layer_02\"\n    layer2.validateMoved(below = \"style_layer\")\n    layer4.validateMoved(above = \"layer_02\")\n    layer1.validateMoved(above = \"layer_04\")\n    layer3.validateMoved(above = \"layer_01\")\n  }\n}"
  },
  {
    "path": "extension-compose/src/test/java/com/mapbox/maps/extension/compose/MapNodeExt.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport com.mapbox.maps.extension.compose.internal.LayerPositionAwareNode\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport org.junit.Assert\n\ninternal fun MapNode.assertLayerIds(expected: List<String>) {\n  Assert.assertEquals(\n    expected,\n    children.map { (it as LayerPositionAwareNode).getLayerIds()[0] }\n  )\n}"
  },
  {
    "path": "extension-compose/src/test/java/com/mapbox/maps/extension/compose/SimpleLayerPositionAwareNode.kt",
    "content": "package com.mapbox.maps.extension.compose\n\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.compose.internal.LayerPositionAwareNode\nimport com.mapbox.maps.extension.compose.internal.MapNode\nimport com.mapbox.maps.extension.compose.style.internal.StyleLayerPositionNode\nimport io.mockk.CapturingSlot\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.slot\nimport org.junit.Assert\n\ninternal data class SimpleLayerPositionAwareNode(\n  val id: String,\n  private var attachedLayerPosition: LayerPosition? = null,\n  private val movedLayerIdSlot: CapturingSlot<String> = slot<String>(),\n) : LayerPositionAwareNode, MapNode() {\n  private val movedLayerPosition: CapturingSlot<LayerPosition> = slot<LayerPosition>()\n\n  private val mapboxStyleManager = mockk<MapboxStyleManager> {\n    every {\n      moveStyleLayer(\n        capture(movedLayerIdSlot),\n        capture(movedLayerPosition)\n      )\n    } answers {\n      attachedLayerPosition = movedLayerPosition.captured\n      ExpectedFactory.createNone()\n    }\n  }\n\n  private val layerIds = listOf(id)\n  override var isAttached: Boolean = false\n\n  override fun getLayerIds(): List<String> = layerIds\n\n  override fun onMoved(parent: MapNode) {\n    println(\"($this).onMoved\")\n    mapboxStyleManager.repositionCurrentNode(parent)\n  }\n\n  override fun onAttached(parent: MapNode) {\n    val parentPositionNode = parent as StyleLayerPositionNode\n    attachedLayerPosition = getRelativePositionInfo(parentPositionNode)\n    isAttached = true\n  }\n\n  internal fun validateMoved(\n    above: String? = null,\n    below: String? = null\n  ) {\n    Assert.assertEquals(id, movedLayerIdSlot.captured.also { movedLayerIdSlot.clear() })\n    validateInserted(above, below)\n  }\n\n  internal fun validateInserted(above: String? = null, below: String? = null) {\n    Assert.assertEquals(above, attachedLayerPosition!!.above)\n    Assert.assertEquals(below, attachedLayerPosition!!.below)\n  }\n}"
  },
  {
    "path": "extension-compose/src/test/java/com/mapbox/maps/extension/compose/annotation/MarkerAnimationTest.kt",
    "content": "package com.mapbox.maps.extension.compose.annotation\n\nimport com.mapbox.maps.MapboxExperimental\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\n\n/**\n * Tests for Marker animation API.\n */\n@OptIn(MapboxExperimental::class)\ninternal class MarkerAnimationTest {\n\n  // MARK: - Animation Effects\n\n  @Test\n  fun testMarkerWithWiggleAppearAnimation() {\n    val appearAnimation = listOf(MarkerAnimationEffect.wiggle)\n\n    assertNotNull(appearAnimation)\n    assertEquals(1, appearAnimation.size)\n    assertTrue(appearAnimation[0].value is MarkerAnimationEffect.Effect.Wiggle)\n  }\n\n  @Test\n  fun testMarkerWithScaleAppearAnimation() {\n    val appearAnimation = listOf(MarkerAnimationEffect.scale)\n\n    assertNotNull(appearAnimation)\n    assertEquals(1, appearAnimation.size)\n    val scaleEffect = appearAnimation[0].value as MarkerAnimationEffect.Effect.Scale\n    assertEquals(0f, scaleEffect.from, 0.001f) // Default from\n    assertEquals(1f, scaleEffect.to, 0.001f) // Default to\n  }\n\n  @Test\n  fun testMarkerWithFadeAppearAnimation() {\n    val appearAnimation = listOf(MarkerAnimationEffect.fadeIn)\n\n    assertNotNull(appearAnimation)\n    assertEquals(1, appearAnimation.size)\n    val fadeEffect = appearAnimation[0].value as MarkerAnimationEffect.Effect.Fade\n    assertEquals(0f, fadeEffect.from, 0.001f)\n    assertEquals(1f, fadeEffect.to, 0.001f)\n  }\n\n  @Test\n  fun testMarkerWithDisappearAnimation() {\n    val disappearAnimation = listOf(MarkerAnimationEffect.fadeOut)\n\n    assertNotNull(disappearAnimation)\n    assertEquals(1, disappearAnimation.size)\n    assertTrue(disappearAnimation[0].value is MarkerAnimationEffect.Effect.Fade)\n  }\n\n  // MARK: - Multiple Effects\n\n  @Test\n  fun testMarkerWithCombinedWiggleAndScale() {\n    val appearAnimation = listOf(\n      MarkerAnimationEffect.wiggle,\n      MarkerAnimationEffect.scale\n    )\n\n    assertEquals(2, appearAnimation.size)\n    assertTrue(appearAnimation[0].value is MarkerAnimationEffect.Effect.Wiggle)\n    assertTrue(appearAnimation[1].value is MarkerAnimationEffect.Effect.Scale)\n  }\n\n  @Test\n  fun testMarkerWithCombinedScaleAndFade() {\n    val appearAnimation = listOf(\n      MarkerAnimationEffect.scale(from = 0.5f, to = 1.0f),\n      MarkerAnimationEffect.fade(from = 0.2f, to = 1.0f)\n    )\n\n    assertEquals(2, appearAnimation.size)\n\n    val scaleEffect = appearAnimation[0].value as MarkerAnimationEffect.Effect.Scale\n    assertEquals(0.5f, scaleEffect.from, 0.001f)\n    assertEquals(1.0f, scaleEffect.to, 0.001f)\n\n    val fadeEffect = appearAnimation[1].value as MarkerAnimationEffect.Effect.Fade\n    assertEquals(0.2f, fadeEffect.from, 0.001f)\n    assertEquals(1.0f, fadeEffect.to, 0.001f)\n  }\n\n  @Test\n  fun testMarkerWithAllThreeEffects() {\n    val appearAnimation = listOf(\n      MarkerAnimationEffect.wiggle,\n      MarkerAnimationEffect.scale,\n      MarkerAnimationEffect.fadeIn\n    )\n\n    assertEquals(3, appearAnimation.size)\n    assertTrue(appearAnimation[0].value is MarkerAnimationEffect.Effect.Wiggle)\n    assertTrue(appearAnimation[1].value is MarkerAnimationEffect.Effect.Scale)\n    assertTrue(appearAnimation[2].value is MarkerAnimationEffect.Effect.Fade)\n  }\n\n  // MARK: - Multiple Triggers\n\n  @Test\n  fun testMarkerWithBothTriggers() {\n    val appearAnimation = listOf(MarkerAnimationEffect.scale)\n    val disappearAnimation = listOf(MarkerAnimationEffect.fadeOut)\n\n    // Both triggers can coexist on the same marker\n    assertNotNull(appearAnimation)\n    assertNotNull(disappearAnimation)\n    assertEquals(1, appearAnimation.size)\n    assertEquals(1, disappearAnimation.size)\n  }\n\n  @Test\n  fun testMarkerWithComplexMultiTriggerSetup() {\n    // Different animations for different triggers\n    val appearAnimation = listOf(\n      MarkerAnimationEffect.wiggle,\n      MarkerAnimationEffect.scale\n    )\n    val disappearAnimation = listOf(\n      MarkerAnimationEffect.wiggle,\n      MarkerAnimationEffect.scale(from = 1f, to = 0f)\n    )\n\n    assertEquals(2, appearAnimation.size)\n    assertEquals(2, disappearAnimation.size)\n\n    // Verify disappear scale goes to 0\n    val disappearScale = disappearAnimation[1].value as MarkerAnimationEffect.Effect.Scale\n    assertEquals(1f, disappearScale.from, 0.001f)\n    assertEquals(0f, disappearScale.to, 0.001f)\n  }\n\n  // MARK: - Custom Parameters\n\n  @Test\n  fun testScaleWithCustomParameters() {\n    val effect = MarkerAnimationEffect.scale(from = 0.5f, to = 1.5f)\n    val scaleEffect = effect.value as MarkerAnimationEffect.Effect.Scale\n\n    assertEquals(0.5f, scaleEffect.from, 0.001f)\n    assertEquals(1.5f, scaleEffect.to, 0.001f)\n  }\n\n  @Test\n  fun testFadeWithCustomParameters() {\n    val effect = MarkerAnimationEffect.fade(from = 0.2f, to = 0.8f)\n    val fadeEffect = effect.value as MarkerAnimationEffect.Effect.Fade\n\n    assertEquals(0.2f, fadeEffect.from, 0.001f)\n    assertEquals(0.8f, fadeEffect.to, 0.001f)\n  }\n\n  @Test\n  fun testScaleWithInvertedRange() {\n    // Zoom out effect: scale from larger to smaller\n    val effect = MarkerAnimationEffect.scale(from = 1.5f, to = 0.5f)\n    val scaleEffect = effect.value as MarkerAnimationEffect.Effect.Scale\n\n    assertEquals(1.5f, scaleEffect.from, 0.001f)\n    assertEquals(0.5f, scaleEffect.to, 0.001f)\n  }\n\n  @Test\n  fun testScaleToZero() {\n    // Disappear by scaling to zero\n    val effect = MarkerAnimationEffect.scale(from = 1f, to = 0f)\n    val scaleEffect = effect.value as MarkerAnimationEffect.Effect.Scale\n\n    assertEquals(1f, scaleEffect.from, 0.001f)\n    assertEquals(0f, scaleEffect.to, 0.001f)\n  }\n\n  @Test\n  fun testFadeWithFullOpacityRange() {\n    // Fade from transparent to opaque\n    val effect = MarkerAnimationEffect.fade(from = 0f, to = 1f)\n    val fadeEffect = effect.value as MarkerAnimationEffect.Effect.Fade\n\n    assertEquals(0f, fadeEffect.from, 0.001f)\n    assertEquals(1f, fadeEffect.to, 0.001f)\n  }\n\n  // MARK: - Edge Cases\n\n  @Test\n  fun testMarkerWithEmptyAnimations() {\n    // Developers can opt out of animations with empty lists\n    val noAnimation = emptyList<MarkerAnimationEffect>()\n\n    assertEquals(0, noAnimation.size)\n  }\n\n  @Test\n  fun testMarkerWithOnlyOneAnimationSet() {\n    // It's valid to only set appear animation without disappear\n    val appearAnimation = listOf(MarkerAnimationEffect.wiggle)\n    val disappearAnimation = emptyList<MarkerAnimationEffect>()\n\n    assertEquals(1, appearAnimation.size)\n    assertEquals(0, disappearAnimation.size)\n  }\n\n  @Test\n  fun testScaleWithSameFromAndTo() {\n    // Edge case: no-op scale\n    val effect = MarkerAnimationEffect.scale(from = 1f, to = 1f)\n    val scaleEffect = effect.value as MarkerAnimationEffect.Effect.Scale\n\n    assertEquals(1f, scaleEffect.from, 0.001f)\n    assertEquals(1f, scaleEffect.to, 0.001f)\n  }\n\n  // MARK: - Implementation Details\n\n  @Test\n  fun testWiggleSequenceStructure() {\n    val sequence = WiggleAnimationSequence.standard()\n    val keyframes = sequence.keyframes\n\n    // Verify the sequence: 20° → -20° → 8° → -8° → 0°\n    assertEquals(4, keyframes.size)\n    assertEquals(20f, sequence.initialAngle, 0.001f)\n\n    assertEquals(-20f, keyframes[0].angle, 0.001f)\n    assertEquals(8f, keyframes[1].angle, 0.001f)\n    assertEquals(-8f, keyframes[2].angle, 0.001f)\n    assertEquals(0f, keyframes[3].angle, 0.001f)\n  }\n\n  @Test\n  fun testWiggleSequenceTiming() {\n    val sequence = WiggleAnimationSequence.standard()\n    val keyframes = sequence.keyframes\n\n    // Verify individual durations (time to wait before each keyframe)\n    assertEquals(0, keyframes[0].durationMs) // Start immediately\n    assertEquals(350, keyframes[1].durationMs) // Wait 350ms\n    assertEquals(300, keyframes[2].durationMs) // Wait 300ms\n    assertEquals(250, keyframes[3].durationMs) // Wait 250ms\n\n    // Verify cumulative timing adds up correctly\n    // After keyframe 0 (wait 0ms): total = 0ms\n    // After keyframe 1 (wait 350ms): total = 350ms\n    // After keyframe 2 (wait 300ms): total = 650ms\n    // After keyframe 3 (wait 250ms): total = 900ms\n    val totalDuration = keyframes.sumOf { it.durationMs }\n    assertEquals(900, totalDuration)\n  }\n\n  @Test\n  fun testWiggleSequenceEndsAtZero() {\n    val sequence = WiggleAnimationSequence.standard()\n    val finalAngle = sequence.keyframes.last().angle\n\n    assertEquals(0f, finalAngle, 0.001f)\n  }\n\n  @Test\n  fun testConfigurationTransformation() {\n    val effects = listOf(\n      MarkerAnimationEffect.wiggle.value,\n      MarkerAnimationEffect.scale.value\n    )\n    val config = MarkerAnimationConfig(effects)\n\n    assertEquals(2, config.effects.size)\n  }\n}"
  },
  {
    "path": "extension-compose/src/test/java/com/mapbox/maps/extension/compose/internal/LayerPositionAwareNodeTest.kt",
    "content": "package com.mapbox.maps.extension.compose.internal\n\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.extension.compose.SimpleLayerPositionAwareNode\nimport com.mapbox.maps.extension.compose.assertLayerIds\nimport com.mapbox.maps.extension.compose.style.internal.StyleLayerPositionNode\nimport org.junit.Assert\nimport org.junit.Test\n\npublic class LayerPositionAwareNodeTest {\n  /**\n   * Validates the relative position in a compose block like:\n   * ```\n   * aboveLayer(\"style_layer\") {\n   *   layer(\"layer_01\")\n   *   layer(\"layer_02\")\n   *   layer(\"layer_03\")\n   *   layer(\"layer_04\")\n   * }\n   * ```\n   * The order from top most visible layer to bottom most visible layer should be:\n   * ```\n   * \"layer_04\"\n   * \"layer_03\"\n   * \"layer_02\"\n   * \"layer_01\"\n   * \"style_layer\"\n   * ```\n   */\n  @Test\n  public fun `relative position above layer`() {\n    // First create parent node that is created when calling `aboveLayer(\"style_layer\")` composable\n    val parent = StyleLayerPositionNode(LayerPosition(\"style_layer\", null, null))\n    // Then create the children nodes that are created when calling `layer(\"layer_XX\")` composable functions\n    val layer1 = SimpleLayerPositionAwareNode(\"layer_01\")\n    val layer2 = SimpleLayerPositionAwareNode(\"layer_02\")\n    val layer3 = SimpleLayerPositionAwareNode(\"layer_03\")\n    val layer4 = SimpleLayerPositionAwareNode(\"layer_04\")\n\n    // MapApplier adds the children in order: 1,2,3 and 4. So we do the same and validate the positions:\n    parent.addAndValidatePosition(node = layer1, above = \"style_layer\")\n    parent.addAndValidatePosition(node = layer2, above = \"layer_01\")\n    parent.addAndValidatePosition(node = layer3, above = \"layer_02\")\n    parent.addAndValidatePosition(node = layer4, above = \"layer_03\")\n  }\n\n  /**\n   * Validates the relative position in a compose block like:\n   * ```\n   * belowLayer(\"style_layer\") {\n   *   layer(\"layer_01\")\n   *   layer(\"layer_02\")\n   *   layer(\"layer_03\")\n   *   layer(\"layer_04\")\n   * }\n   * ```\n   * The order from top most visible layer to bottom most visible layer should be:\n   * ```\n   * \"style_layer\"\n   * \"layer_04\"\n   * \"layer_03\"\n   * \"layer_02\"\n   * \"layer_01\"\n   * ```\n   */\n  @Test\n  public fun `relative position below layer`() {\n    // First create parent node that is created when calling `belowLayer(\"style_layer\")` composable\n    val parent = StyleLayerPositionNode(LayerPosition(null, \"style_layer\", null))\n    // Then create the children nodes that are created when calling `layer(\"layer_XX\")` composable functions\n    val layer1 = SimpleLayerPositionAwareNode(\"layer_01\")\n    val layer2 = SimpleLayerPositionAwareNode(\"layer_02\")\n    val layer3 = SimpleLayerPositionAwareNode(\"layer_03\")\n    val layer4 = SimpleLayerPositionAwareNode(\"layer_04\")\n\n    // MapApplier adds the children in order: 1,2,3 and 4. So we do the same and validate the positions:\n    parent.addAndValidatePosition(node = layer1, below = \"style_layer\")\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_01\"\n\n    parent.addAndValidatePosition(node = layer2, above = \"layer_01\")\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_02\"\n    // \"layer_01\"\n\n    parent.addAndValidatePosition(node = layer3, above = \"layer_02\")\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_03\"\n    // \"layer_02\"\n    // \"layer_01\"\n\n    parent.addAndValidatePosition(node = layer4, above = \"layer_03\")\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_04\"\n    // \"layer_03\"\n    // \"layer_02\"\n    // \"layer_01\"\n  }\n\n  /**\n   * Validates the relative position when new layers are placed in the middle and extremes in a compose block like:\n   * ```\n   * aboveLayer(\"style_layer\") {\n   *   layer(\"layer_01\")\n   *   layer(\"layer_02\")\n   * }\n   * ```\n   * Then adds `layer_03` in between `layer_01` and `layer_02`. Then`layer_04` at the end and `layer_05` at the beginning.\n   */\n  @Test\n  public fun `relative position above layer updates`() {\n    // First create parent node that is created when calling `aboveLayer(\"style_layer\")` composable\n    val parent = StyleLayerPositionNode(LayerPosition(\"style_layer\", null, null))\n    // Then create the children nodes that are created when calling `layer(\"layer_XX\")` composable functions\n    val layer1 = SimpleLayerPositionAwareNode(\"layer_01\")\n    val layer2 = SimpleLayerPositionAwareNode(\"layer_02\")\n    val layer3 = SimpleLayerPositionAwareNode(\"layer_03\")\n    val layer4 = SimpleLayerPositionAwareNode(\"layer_04\")\n    val layer5 = SimpleLayerPositionAwareNode(\"layer_05\")\n\n    // MapApplier adds the children in order: 1,2,3 and 4. So we do the same and validate the positions:\n    parent.addAndValidatePosition(layer1, 0, \"style_layer\")\n    parent.addAndValidatePosition(layer2, 1, \"layer_01\")\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_02\"))\n    // current render layers:\n    // \"layer_02\"\n    // \"layer_01\"\n    // \"style_layer\"\n\n    // Insert layer_03 between layer_01 and layer_02\n    parent.addAndValidatePosition(layer3, parent.children.size / 2, \"layer_01\")\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_03\", \"layer_02\"))\n    // current render layers:\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"style_layer\"\n\n    // Insert layer_04 at the end\n    parent.addAndValidatePosition(layer4, parent.children.size, \"layer_02\")\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_03\", \"layer_02\", \"layer_04\"))\n    // current render layers:\n    // \"layer_04\"\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"style_layer\"\n\n    // Insert layer_05 at the beginning\n    parent.addAndValidatePosition(layer5, 0, \"style_layer\")\n    parent.assertLayerIds(listOf(\"layer_05\", \"layer_01\", \"layer_03\", \"layer_02\", \"layer_04\"))\n    // current render layers:\n    // \"layer_04\"\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"layer_05\"\n    // \"style_layer\"\n  }\n\n  /**\n   * Validates the relative position when new layers are placed in the middle and extremes in a compose block like:\n   * ```\n   * belowLayer(\"style_layer\") {\n   *   layer(\"layer_01\")\n   *   layer(\"layer_02\")\n   * }\n   * ```\n   * The adds `layer_03` in between `layer_01` and `layer_02`. Then`layer_04` at the end and `layer_05` at the beginning.\n   */\n  @Test\n  public fun `relative position below layer updates`() {\n    // First create parent node that is created when calling `aboveLayer(\"style_layer\")` composable\n    val parent = StyleLayerPositionNode(LayerPosition(null, \"style_layer\", null))\n    // Then create the children nodes that are created when calling `layer(\"layer_XX\")` composable functions\n    val layer1 = SimpleLayerPositionAwareNode(\"layer_01\")\n    val layer2 = SimpleLayerPositionAwareNode(\"layer_02\")\n    val layer3 = SimpleLayerPositionAwareNode(\"layer_03\")\n    val layer4 = SimpleLayerPositionAwareNode(\"layer_04\")\n    val layer5 = SimpleLayerPositionAwareNode(\"layer_05\")\n\n    // MapApplier adds the children in order: 1,2,3 and 4. So we do the same and validate the positions:\n    parent.addAndValidatePosition(layer1, 0, below = \"style_layer\")\n    parent.addAndValidatePosition(layer2, 1, above = \"layer_01\")\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_02\"))\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_02\"\n    // \"layer_01\"\n\n    // Insert layer_03 between layer_01 and layer_02\n    parent.addAndValidatePosition(layer3, parent.children.size / 2, above = \"layer_01\")\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_03\", \"layer_02\"))\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n\n    // Insert layer_04 at the end\n    parent.addAndValidatePosition(layer4, parent.children.size, above = \"layer_02\")\n    parent.assertLayerIds(listOf(\"layer_01\", \"layer_03\", \"layer_02\", \"layer_04\"))\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_04\"\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n\n    // Insert layer_05 at the beginning\n    parent.addAndValidatePosition(layer5, 0, below = \"style_layer\")\n    parent.assertLayerIds(listOf(\"layer_05\", \"layer_01\", \"layer_03\", \"layer_02\", \"layer_04\"))\n    // current render layers:\n    // \"style_layer\"\n    // \"layer_04\"\n    // \"layer_02\"\n    // \"layer_03\"\n    // \"layer_01\"\n    // \"layer_05\"\n  }\n}\n\ninternal fun StyleLayerPositionNode.addAndValidatePosition(\n  node: SimpleLayerPositionAwareNode,\n  idx: Int? = null,\n  above: String? = null,\n  below: String? = null\n) {\n  if (idx != null) {\n    children.add(idx, node)\n  } else {\n    children.add(node)\n  }\n  val relativePosition = node.getRelativePositionInfo(this)!!\n  Assert.assertEquals(above, relativePosition.above)\n  Assert.assertEquals(below, relativePosition.below)\n}"
  },
  {
    "path": "extension-compose/src/test/java/com/mapbox/maps/extension/compose/style/PropertiesTests.kt",
    "content": "package com.mapbox.maps.extension.compose.style\n\nimport android.util.Range\nimport androidx.compose.ui.graphics.Color\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertNull\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\n@Suppress(\"OPT_IN_USAGE\")\npublic class PropertiesTests {\n  @Test\n  public fun `compose color to ColorValue and back`() {\n    repeat(255) { value ->\n      val composeColor = Color(value, value, value, value)\n      val colorValue = ColorValue(composeColor)\n      val colorOrNull = colorValue.colorOrNull\n      assertNotNull(colorOrNull)\n      assertEquals(\n        \"$colorValue ($value, $value, $value, $value) is not the same than $composeColor\",\n        composeColor,\n        colorOrNull\n      )\n    }\n  }\n\n  @Test\n  public fun `Raw RGBA Value to Color`() {\n    repeat(255) { value ->\n      val colorValue = ColorValue(Value.valueOf(\"rgba($value, $value, $value, ${value / 255F})\"))\n      assertEquals(\"rgba($value, $value, $value, ${value / 255F})\", colorValue.value.contents)\n      val colorOrNull = colorValue.colorOrNull\n      assertNotNull(colorOrNull)\n      assertEquals(Color(value, value, value, value), colorOrNull)\n    }\n  }\n\n  @Test\n  public fun `Raw RGB Value to Color`() {\n    repeat(255) { value ->\n      val colorValue = ColorValue(Value.valueOf(\"rgb($value, $value, $value)\"))\n      assertEquals(\"rgb($value, $value, $value)\", colorValue.value.contents)\n      val colorOrNull = colorValue.colorOrNull\n      assertNotNull(colorOrNull)\n      assertEquals(Color(value, value, value, 0xFF), colorOrNull)\n    }\n  }\n\n  @Test\n  public fun `RGB expression Value to Color`() {\n    repeat(255) { value ->\n      val valueDouble = value.toDouble()\n      val colorValue = ColorValue(Expression.rgb(valueDouble, valueDouble, valueDouble))\n      val colorOrNull = colorValue.colorOrNull\n      assertNotNull(colorOrNull)\n      assertEquals(Color(value, value, value, 0xFF), colorOrNull)\n    }\n  }\n\n  @Test\n  public fun `Custom expression ColorValue to Color is null`() {\n    val colorValue = ColorValue(Expression.literal(\"Custom value\"))\n    assertNull(colorValue.colorOrNull)\n  }\n\n  @Test\n  public fun `ColorValue default is different than INITIAL`() {\n    assertNotEquals(ColorValue.DEFAULT, ColorValue.INITIAL)\n  }\n\n  @Test\n  public fun `DoubleValue to double`() {\n    val doubleValue = DoubleValue(1.0)\n    assertEquals(1.0, doubleValue.doubleOrNull)\n    val doubleMaxValue = DoubleValue(Double.MAX_VALUE)\n    assertEquals(Double.MAX_VALUE, doubleMaxValue.doubleOrNull)\n    val doubleMinValue = DoubleValue(Double.MIN_VALUE)\n    assertEquals(Double.MIN_VALUE, doubleMinValue.doubleOrNull)\n  }\n\n  @Test\n  public fun `DoubleValue expression to double`() {\n    val doubleValue = DoubleValue(Expression.literal(1.0))\n    assertEquals(1.0, doubleValue.doubleOrNull)\n    val doubleLongExpressionValue = DoubleValue(Expression.literal(1L))\n    assertEquals(1.0, doubleLongExpressionValue.doubleOrNull)\n  }\n\n  @Test\n  public fun `Custom expression DoubleValue to Double is null`() {\n    val doubleValue = DoubleValue(Expression.literal(\"Custom value\"))\n    assertNull(doubleValue.doubleOrNull)\n  }\n\n  @Test\n  public fun `DoubleValue default is different than INITIAL`() {\n    assertNotEquals(DoubleValue.DEFAULT, DoubleValue.INITIAL)\n  }\n\n  @Test\n  public fun `LongValue to long`() {\n    val longValue = LongValue(1L)\n    assertEquals(1L, longValue.longOrNull)\n    val maxLongValue = LongValue(Long.MAX_VALUE)\n    assertEquals(Long.MAX_VALUE, maxLongValue.longOrNull)\n    val minLongValue = LongValue(Long.MIN_VALUE)\n    assertEquals(Long.MIN_VALUE, minLongValue.longOrNull)\n  }\n\n  @Test\n  public fun `LongValue expression to long`() {\n    val longExpressionValue = LongValue(Expression.literal(1L))\n    assertEquals(1L, longExpressionValue.longOrNull)\n    val longDoubleExpressionValue = LongValue(Expression.literal(1.0))\n    assertEquals(1L, longDoubleExpressionValue.longOrNull)\n  }\n\n  @Test\n  public fun `Custom expression LongValue to Long is null`() {\n    val longValue = LongValue(Expression.literal(\"Custom value\"))\n    assertNull(longValue.longOrNull)\n  }\n\n  @Test\n  public fun `LongValue default is different than INITIAL`() {\n    assertNotEquals(LongValue.DEFAULT, LongValue.INITIAL)\n  }\n\n  @Test\n  public fun `BooleanValue to boolean`() {\n    val trueBooleanValue = BooleanValue(true)\n    assertEquals(true, trueBooleanValue.booleanOrNull)\n    val falseBooleanValue = BooleanValue(false)\n    assertEquals(false, falseBooleanValue.booleanOrNull)\n  }\n\n  @Test\n  public fun `BooleanValue expression to boolean`() {\n    val trueBooleanExpressionValue = BooleanValue(Expression.literal(true))\n    assertEquals(true, trueBooleanExpressionValue.booleanOrNull)\n    val falseBooleanExpressionValue = BooleanValue(Expression.literal(false))\n    assertEquals(false, falseBooleanExpressionValue.booleanOrNull)\n  }\n\n  @Test\n  public fun `Custom expression BooleanValue to Boolean is null`() {\n    val booleanValue = BooleanValue(Expression.literal(\"Custom value\"))\n    assertNull(booleanValue.booleanOrNull)\n  }\n\n  @Test\n  public fun `BooleanValue default is different than INITIAL`() {\n    assertNotEquals(BooleanValue.DEFAULT, BooleanValue.INITIAL)\n  }\n\n  @Test\n  public fun `StringValue to string`() {\n    val stringValue = StringValue(\"String value\")\n    assertEquals(\"String value\", stringValue.stringOrNull)\n    val emptyStringValue = StringValue(\"\")\n    assertEquals(\"\", emptyStringValue.stringOrNull)\n  }\n\n  @Test\n  public fun `StringValue expression to string`() {\n    val stringExpressionValue = StringValue(Expression.literal(\"String value\"))\n    assertEquals(\"String value\", stringExpressionValue.stringOrNull)\n    val stringDoubleExpressionValue = StringValue(Expression.literal(\"\"))\n    assertEquals(\"\", stringDoubleExpressionValue.stringOrNull)\n  }\n\n  @Test\n  public fun `Non string expression StringValue to String is null`() {\n    val stringValue = StringValue(Expression.literal(1L))\n    assertNull(stringValue.stringOrNull)\n  }\n\n  @Test\n  public fun `StringValue default is different than INITIAL`() {\n    assertNotEquals(StringValue.DEFAULT, StringValue.INITIAL)\n  }\n\n  @Test\n  public fun `DoubleRangeValue to Range`() {\n    val doubleRangeValue = DoubleRangeValue(1.0, 2.0)\n    assertEquals(Range(1.0, 2.0), doubleRangeValue.rangeOrNull)\n  }\n\n  @Test\n  public fun `DoubleRangeValue with mixed upper and lower to Range null`() {\n    val doubleRangeValue = DoubleRangeValue(2.0, 1.0)\n    assertNull(doubleRangeValue.rangeOrNull)\n  }\n\n  @Test\n  public fun `Custom expression DoubleRangeValue to Range is null`() {\n    val doubleRangeValue = DoubleRangeValue(Expression.literal(\"Custom value\"))\n    assertNull(doubleRangeValue.rangeOrNull)\n  }\n\n  @Test\n  public fun `DoubleRangeValue expression to Range`() {\n    val doubleRangeValue =\n      DoubleRangeValue(Expression.array(Expression.literal(1.0), Expression.literal(2.0)))\n    assertEquals(Range(1.0, 2.0), doubleRangeValue.rangeOrNull)\n  }\n\n  @Test\n  public fun `DoubleRangeValue expression with more than 2 returns null`() {\n    val doubleRangeValue = DoubleRangeValue(\n      Expression.array(\n        Expression.literal(1.0),\n        Expression.literal(2.0),\n        Expression.literal(3.0)\n      )\n    )\n    assertNull(doubleRangeValue.rangeOrNull)\n  }\n\n  @Test\n  public fun `DoubleRangeValue array expression empty returns null`() {\n    assertNull(DoubleRangeValue(Expression.array()).rangeOrNull)\n  }\n\n  @Test\n  public fun `DoubleRangeValue default is different than INITIAL`() {\n    assertNotEquals(DoubleRangeValue.DEFAULT, DoubleRangeValue.INITIAL)\n  }\n\n  @Test\n  public fun `DoubleListValue with vararg to DoubleList getter`() {\n    val doubleListValue = DoubleListValue(1.0, 2.0, 3.0)\n    assertEquals(3, doubleListValue.doubleListOrNull!!.size)\n    assertEquals(1.0, doubleListValue.doubleListOrNull!![0], EPS)\n    assertEquals(2.0, doubleListValue.doubleListOrNull!![1], EPS)\n    assertEquals(3.0, doubleListValue.doubleListOrNull!![2], EPS)\n  }\n\n  @Test\n  public fun `DoubleListValue with list to DoubleList getter`() {\n    val doubleListValue = DoubleListValue(listOf(1.0, 2.0, 3.0))\n    assertEquals(3, doubleListValue.doubleListOrNull!!.size)\n    assertEquals(1.0, doubleListValue.doubleListOrNull!![0], EPS)\n    assertEquals(2.0, doubleListValue.doubleListOrNull!![1], EPS)\n    assertEquals(3.0, doubleListValue.doubleListOrNull!![2], EPS)\n  }\n\n  @Test\n  public fun `DoubleListValue with Expression to DoubleList getter`() {\n    val doubleListValue = DoubleListValue(\n      Expression.array {\n        literal(1.0)\n        literal(2.0)\n        literal(3.0)\n      }\n    )\n    assertEquals(3, doubleListValue.doubleListOrNull!!.size)\n    assertEquals(1.0, doubleListValue.doubleListOrNull!![0], EPS)\n    assertEquals(2.0, doubleListValue.doubleListOrNull!![1], EPS)\n    assertEquals(3.0, doubleListValue.doubleListOrNull!![2], EPS)\n  }\n\n  @Test\n  public fun `StringListValue with vararg to StringList getter`() {\n    val stringListValue = StringListValue(\"a\", \"b\", \"c\")\n    assertEquals(3, stringListValue.stringListOrNull!!.size)\n    assertEquals(\"a\", stringListValue.stringListOrNull!![0])\n    assertEquals(\"b\", stringListValue.stringListOrNull!![1])\n    assertEquals(\"c\", stringListValue.stringListOrNull!![2])\n  }\n\n  @Test\n  public fun `StringListValue with list to StringList getter`() {\n    val stringListValue = StringListValue(listOf(\"a\", \"b\", \"c\"))\n    assertEquals(3, stringListValue.stringListOrNull!!.size)\n    assertEquals(\"a\", stringListValue.stringListOrNull!![0])\n    assertEquals(\"b\", stringListValue.stringListOrNull!![1])\n    assertEquals(\"c\", stringListValue.stringListOrNull!![2])\n  }\n\n  @Test\n  public fun `StringListValue with Expression to StringList getter`() {\n    val stringListValue = StringListValue(\n      Expression.array {\n        literal(\"a\")\n        literal(\"b\")\n        literal(\"c\")\n      }\n    )\n    assertEquals(3, stringListValue.stringListOrNull!!.size)\n    assertEquals(\"a\", stringListValue.stringListOrNull!![0])\n    assertEquals(\"b\", stringListValue.stringListOrNull!![1])\n    assertEquals(\"c\", stringListValue.stringListOrNull!![2])\n  }\n\n  @Test\n  public fun `StringListValue with non list values returns null stringListOrNull`() {\n    val nullValueStringListValue = StringListValue(Value.nullValue())\n    assertNull(nullValueStringListValue.stringListOrNull)\n    val emptyArrayExpressionStringListValue = StringListValue(Expression.array { })\n    assertNull(emptyArrayExpressionStringListValue.stringListOrNull)\n    val stringLiteralExpressionStringListValue = StringListValue(Expression.Companion.literal(\"A string\"))\n    assertNull(stringLiteralExpressionStringListValue.stringListOrNull)\n    val doubleArrayExpressionStringListValue = StringListValue(Expression.array { literal(1.0) })\n    assertNull(doubleArrayExpressionStringListValue.stringListOrNull)\n    val stringDoubleArrayExpressionStringListValue = StringListValue(\n      Expression.array {\n      literal(\"A string\")\n      literal(1.0)\n    }\n    )\n    assertNull(stringDoubleArrayExpressionStringListValue.stringListOrNull)\n  }\n\n  @Test\n  public fun `Transition duration and delay getter`() {\n    val transition = Transition(100, 1000)\n    assertEquals(100, transition.durationMillis)\n    assertEquals(1000, transition.delayMillis)\n  }\n\n  private companion object {\n    private const val EPS = 0.0000001\n  }\n\n  @Test\n  public fun `PointListValue with vararg`() {\n    val pointListValue = PointListValue(Point.fromLngLat(1.0, 2.0))\n    assertEquals(1, pointListValue.pointsOrNull?.size)\n    assertEquals(Point.fromLngLat(1.0, 2.0), pointListValue.pointsOrNull?.get(0))\n\n    val multiplePointListValue = PointListValue(\n      Point.fromLngLat(1.0, 2.0),\n      Point.fromLngLat(3.0, 4.0),\n    )\n    assertEquals(2, multiplePointListValue.pointsOrNull?.size)\n    assertEquals(Point.fromLngLat(1.0, 2.0), multiplePointListValue.pointsOrNull?.get(0))\n    assertEquals(Point.fromLngLat(3.0, 4.0), multiplePointListValue.pointsOrNull?.get(1))\n\n    val pairOfPointListValue = PointListValue(\n      1.0 to 2.0,\n      3.0 to 4.0\n    )\n    assertEquals(2, pairOfPointListValue.pointsOrNull?.size)\n    assertEquals(Point.fromLngLat(1.0, 2.0), pairOfPointListValue.pointsOrNull?.get(0))\n    assertEquals(Point.fromLngLat(3.0, 4.0), pairOfPointListValue.pointsOrNull?.get(1))\n\n    val listDoubleOfPointListValue = PointListValue(\n      listOf(\n        listOf(1.0, 2.0),\n        listOf(3.0, 4.0)\n      )\n    )\n    assertEquals(2, listDoubleOfPointListValue.pointsOrNull?.size)\n    assertEquals(Point.fromLngLat(1.0, 2.0), listDoubleOfPointListValue.pointsOrNull?.get(0))\n    assertEquals(Point.fromLngLat(3.0, 4.0), listDoubleOfPointListValue.pointsOrNull?.get(1))\n  }\n\n  @Test\n  public fun `PointListValue with Expressions`() {\n    val emptyArrayExpression = PointListValue(Expression.array())\n    assertNull(emptyArrayExpression.pointsOrNull)\n    val nullValueExpression = PointListValue(Value.nullValue())\n    assertNull(nullValueExpression.pointsOrNull)\n  }\n\n  @Test\n  public fun `PointListValue default is different than INITIAL`() {\n    assertNotEquals(PointListValue.DEFAULT, PointListValue.INITIAL)\n  }\n}"
  },
  {
    "path": "extension-compose/src/test/java/com/mapbox/maps/extension/compose/style/layers/PropertiesTests.kt",
    "content": "package com.mapbox.maps.extension.compose.style.layers\n\nimport com.mapbox.maps.extension.compose.style.StyleImage\nimport io.mockk.mockk\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\npublic class PropertiesTests {\n  @Test\n  public fun `FormattedValue string getter`() {\n    val formattedValue = FormattedValue(\"test\")\n    assertEquals(\"test\", formattedValue.stringOrNull)\n  }\n\n  @Test\n  public fun `ImageValue imageId getter`() {\n    val imageValue = ImageValue(\"test-id\")\n    assertEquals(\"test-id\", imageValue.imageIdOrNull)\n  }\n\n  @Test\n  public fun `ImageValue with styleImage imageId getter`() {\n    val imageValue = ImageValue(\n      StyleImage(imageId = \"test-id\", image = mockk())\n    )\n    assertEquals(\"test-id\", imageValue.imageIdOrNull)\n  }\n  @Test\n  public fun `ModelIdValue modelId getter`() {\n    val modelIdValue = ModelIdValue(\"test-id\")\n    assertEquals(\"test-id\", modelIdValue.modelIdOrNull)\n  }\n\n  @Test\n  public fun `ModelIdValue with uri modelId getter`() {\n    val modelIdValue = ModelIdValue(\n      modelId = \"test-id\",\n      uri = \"testuri\"\n    )\n    assertEquals(\"test-id\", modelIdValue.modelIdOrNull)\n    assertEquals(\"testuri\", modelIdValue.uriOrNull)\n  }\n}"
  },
  {
    "path": "extension-compose/src/test/java/com/mapbox/maps/extension/compose/style/projection/ProjectionTests.kt",
    "content": "package com.mapbox.maps.extension.compose.style.projection\n\nimport com.mapbox.maps.extension.compose.style.projection.generated.Projection\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\npublic class ProjectionTests {\n  @Test\n  public fun `Projection name getter`() {\n    assertEquals(\"globe\", Projection.GLOBE.projectionNameOrNull)\n    assertEquals(\"mercator\", Projection.MERCATOR.projectionNameOrNull)\n    assertNull(Projection.DEFAULT.projectionNameOrNull)\n  }\n}"
  },
  {
    "path": "extension-localization/.gitignore",
    "content": "/build"
  },
  {
    "path": "extension-localization/README.md",
    "content": "## Mapbox Maps Localization Extension for Android\n\n### Overview\n\nThe Mapbox Localization Extension for Android is a public library for localizing labels for a MapView.\nThis extension library can localize supported languages in [mapbox-streets-v8](https://docs.mapbox.com/vector-tiles/reference/mapbox-streets-v8/#common-fields) and [mapbox-streets-v7](https://docs.mapbox.com/vector-tiles/reference/mapbox-streets-v7/#name-fields)\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/api-reference/).\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Localization Extension for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Extension System. To add the Localization Extension to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.extension:maps-localization:11.22.0-rc.1'\n}\n```\n\n### Example\n\nCustomizing Mapbox Localization Extension for Android could be done in two ways: by either providing your own version of the Localization Extension or by using the existing Localization Extension API. The former is documented in [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md), the latter can be achieved with:\n\n```kotlin\nmapboxMap.loadStyleUri(styleUri) {\n    it.localizeLabels(selectedLocale)\n}\n```\n\nMore concrete examples of the Localization Extension can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this extension.\n"
  },
  {
    "path": "extension-localization/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.extension.localization {\n\n  public final class LocalizationKt {\n  }\n\n  public final class StyleInterfaceExtensionKt {\n    method public static void localizeLabels(com.mapbox.maps.MapboxStyleManager, java.util.Locale locale, java.util.List<java.lang.String>? layerIds = null);\n    method public static void localizeLabels(com.mapbox.maps.MapboxStyleManager, java.util.Locale locale);\n  }\n\n  public final class SupportedLanguagesKt {\n  }\n\n}\n\n"
  },
  {
    "path": "extension-localization/api/extension-localization.api",
    "content": "public final class com/mapbox/maps/extension/localization/StyleInterfaceExtensionKt {\n\tpublic static final fun localizeLabels (Lcom/mapbox/maps/MapboxStyleManager;Ljava/util/Locale;)V\n\tpublic static final fun localizeLabels (Lcom/mapbox/maps/MapboxStyleManager;Ljava/util/Locale;Ljava/util/List;)V\n\tpublic static synthetic fun localizeLabels$default (Lcom/mapbox/maps/MapboxStyleManager;Ljava/util/Locale;Ljava/util/List;ILjava/lang/Object;)V\n}\n\n"
  },
  {
    "path": "extension-localization/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.extension.localization\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.extension\"\n    artifactId = \"maps-localization\"\n    artifactTitle = \"The map localization module for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-localization\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(project(\":extension-style\"))\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "extension-localization/src/main/java/com/mapbox/maps/extension/localization/Localization.kt",
    "content": "package com.mapbox.maps.extension.localization\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.get\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport java.util.*\n\n/**\n * Apply languages to style by locale. It will replace the `[\"get\",\"name_en\"]` expression with a new expression `[\"get\",\"name_xx\"]`,\n * where name_xx is the supported local name related with locale.\n * For example if locale is [Locale.GERMAN], the original expression\n * `[\"format\",[\"coalesce\",[\"get\",\"name_en\"],[\"get\",\"name\"]],{}]` will be replaced by\n * `[\"format\",[\"coalesce\",[\"get\",\"name_de\"],[\"get\",\"name\"]],{}]`\n */\ninternal fun setMapLanguage(locale: Locale, style: MapboxStyleManager, layerIds: List<String>?) {\n  val convertedLocale = \"name_${locale.language}\"\n  if (!isSupportedLanguage(convertedLocale)) {\n    logW(TAG, \"Locale: $locale is not supported.\")\n    return\n  }\n\n  layerIds?.forEach { id ->\n    localizeTextFieldExpression(\n      style = style,\n      layerId = id,\n      locale = locale,\n      convertedLocale = convertedLocale,\n      filterSymbolLayers = true,\n    )\n  } ?: style.styleLayers.forEach { layer ->\n    if (layer.type == SYMBOL) {\n      localizeTextFieldExpression(\n        style = style,\n        layerId = layer.id,\n        locale = locale,\n        convertedLocale = convertedLocale,\n        filterSymbolLayers = false,\n      )\n    }\n  }\n}\n\nprivate fun localizeTextFieldExpression(\n  style: MapboxStyleManager,\n  layerId: String,\n  locale: Locale,\n  convertedLocale: String,\n  filterSymbolLayers: Boolean,\n) {\n  if (filterSymbolLayers) {\n    val type = style.getStyleLayerProperty(layerId, TYPE).value.contents as? String\n    if (type != SYMBOL) {\n      return\n    }\n  }\n  val textFieldProperty = style.getStyleLayerProperty(layerId, TEXT_FIELD)\n  if (textFieldProperty.kind != StylePropertyValueKind.EXPRESSION) {\n    return\n  }\n  val textField = textFieldProperty.value.toJson()\n  val adaptedLocale = adaptLocaleToV8orV7IfNeeded(\n    style,\n    style.getStyleLayerProperty(layerId, SOURCE).value.contents as? String ?: \"\",\n    locale\n  ) ?: convertedLocale\n  val getExpression = get(adaptedLocale).toJson()\n  val localizedTextFieldExpressionAsJson = textField.replace(\n    EXPRESSION_REGEX,\n    getExpression\n  ).replace(EXPRESSION_ABBR_REGEX, getExpression)\n  if (BuildConfig.DEBUG) {\n    logI(TAG, \"Localize layer with expression: $localizedTextFieldExpressionAsJson\")\n  }\n  val expected = Value.fromJson(localizedTextFieldExpressionAsJson)\n  expected.value?.let { value ->\n    style.setStyleLayerProperty(\n      layerId,\n      TEXT_FIELD,\n      value\n    )\n  } ?: run {\n    logW(TAG, \"An error ${expected.error} occurred when converting $localizedTextFieldExpressionAsJson to a Value!\")\n  }\n}\n\nprivate fun adaptLocaleToV8orV7IfNeeded(style: MapboxStyleManager, sourceId: String, locale: Locale): String? {\n  if ((style.getStyleSourceProperty(sourceId, TYPE).value.contents as? String) == VECTOR) {\n    (style.getStyleSourceProperty(sourceId, URL).value.contents as? String)?.let { url ->\n      return if (url.contains(STREET_V8)) {\n        getLanguageNameV8(locale)\n      } else if (url.contains(STREET_V7)) {\n        getLanguageNameV7(locale)\n      } else {\n        null\n      }\n    }\n  }\n  return null\n}\n\nprivate const val TAG = \"LocalizationPluginImpl\"\nprivate const val TYPE = \"type\"\nprivate const val SOURCE = \"source\"\nprivate const val SYMBOL = \"symbol\"\nprivate const val URL = \"url\"\nprivate const val VECTOR = \"vector\"\nprivate const val TEXT_FIELD = \"text-field\"\nprivate const val STREET_V7 = \"mapbox.mapbox-streets-v7\"\nprivate const val STREET_V8 = \"mapbox.mapbox-streets-v8\"\nprivate val EXPRESSION_REGEX = Regex(\"\\\\[\\\"get\\\",\\\\s*\\\"(name_.{2,7})\\\"\\\\]\")\nprivate val EXPRESSION_ABBR_REGEX = Regex(\"\\\\[\\\"get\\\",\\\\s*\\\"abbr\\\"\\\\]\")"
  },
  {
    "path": "extension-localization/src/main/java/com/mapbox/maps/extension/localization/StyleInterfaceExtension.kt",
    "content": "package com.mapbox.maps.extension.localization\n\nimport com.mapbox.maps.MapboxStyleManager\nimport java.util.*\n\n/**\n * Extension function to localize style labels\n *\n * @param locale the locale that applied for localization\n * @param layerIds the id of layers that will localize on, default is null which means will localize all the feasible layers.\n *\n * @throws [RuntimeException] if current style is STANDARD which does not support localizing labels client-side runtime localization.\n */\n@JvmOverloads\nfun MapboxStyleManager.localizeLabels(locale: Locale, layerIds: List<String>? = null) {\n  if (styleURI == \"mapbox://styles/mapbox/standard\") {\n    throw RuntimeException(\n      \"Mapbox Standard style does not support client-side runtime localization.\" +\n        \" Consider using Mapbox internationalization capability instead: https://www.mapbox.com/blog/maps-internationalization-34-languages\"\n    )\n  }\n  setMapLanguage(locale, this, layerIds)\n}"
  },
  {
    "path": "extension-localization/src/main/java/com/mapbox/maps/extension/localization/SupportedLanguages.kt",
    "content": "package com.mapbox.maps.extension.localization\n\nimport com.mapbox.maps.logW\nimport java.util.*\n\n/**\n * The name (or names) used locally for the place.\n */\ninternal const val NAME = \"name\"\n\n/**\n * English (if available)\n */\ninternal const val NAME_EN = \"name_en\"\n\n/**\n * French (if available)\n */\ninternal const val NAME_FR = \"name_fr\"\n\n/**\n * Arabic (if available)\n */\ninternal const val NAME_AR = \"name_ar\"\n\n/**\n * Spanish (if available)\n */\ninternal const val NAME_ES = \"name_es\"\n\n/**\n * German (if available)\n */\ninternal const val NAME_DE = \"name_de\"\n\n/**\n * Portuguese (if available)\n */\ninternal const val NAME_PT = \"name_pt\"\n\n/**\n * Russian (if available)\n */\ninternal const val NAME_RU = \"name_ru\"\n\n/**\n * Chinese (if available)\n */\ninternal const val NAME_ZH = \"name_zh\"\n\n/**\n * Traditional Chinese (if available)\n */\ninternal const val NAME_ZH_HANT = \"name_zh-Hant\"\n\n/**\n * Simplified Chinese (if available)\n */\ninternal const val NAME_ZH_HANS = \"name_zh-Hans\"\n\n/**\n * Japanese (if available)\n */\ninternal const val NAME_JA = \"name_ja\"\n\n/**\n * Korean (if available)\n */\ninternal const val NAME_KO = \"name_ko\"\n\n/**\n * Vietnamese (if available)\n */\ninternal const val NAME_VI = \"name_vi\"\n\n/**\n * Italy (if available)\n */\ninternal const val NAME_IT = \"name_it\"\n\n/**\n * https://docs.mapbox.com/vector-tiles/reference/mapbox-streets-v7/#name-fields\n */\nprivate val supportedV7 =\n  arrayOf(\n    NAME,\n    NAME_AR,\n    NAME_EN,\n    NAME_ES,\n    NAME_FR,\n    NAME_DE,\n    NAME_PT,\n    NAME_RU,\n    NAME_JA,\n    NAME_KO,\n    NAME_ZH,\n    NAME_ZH_HANS\n  )\n\n/**\n * https://docs.mapbox.com/vector-tiles/reference/mapbox-streets-v8/#common-fields\n */\nprivate val supportedV8 =\n  arrayOf(\n    NAME,\n    NAME_AR,\n    NAME_EN,\n    NAME_ES,\n    NAME_FR,\n    NAME_DE,\n    NAME_IT,\n    NAME_PT,\n    NAME_RU,\n    NAME_JA,\n    NAME_KO,\n    NAME_ZH_HANS,\n    NAME_ZH_HANT,\n    NAME_VI\n  )\n\nprivate const val TAG = \"Localization\"\n\n/**\n * Get the language name for v7, fallback to [NAME] if not supported.\n */\ninternal fun getLanguageNameV7(locale: Locale): String {\n  if (locale.language.startsWith(\"zh\")) {\n    return if (locale == Locale.SIMPLIFIED_CHINESE || locale.script == \"Hans\") NAME_ZH_HANS\n    else NAME_ZH\n  }\n  return \"name_${locale.language}\".apply {\n    if (!supportedV7.contains(this)) {\n      logW(TAG, \"Language ${locale.displayLanguage} is not supported in the current style\")\n    }\n  }\n}\n\n/**\n * Get the language name for v8, fallback to [NAME] if not supported.\n */\ninternal fun getLanguageNameV8(locale: Locale): String {\n  if (locale.language.startsWith(\"zh\")) {\n    return if (locale == Locale.TAIWAN || locale.script == \"Hant\") NAME_ZH_HANT\n    else NAME_ZH_HANS\n  }\n  return \"name_${locale.language}\".apply {\n    if (!supportedV8.contains(this)) {\n      logW(TAG, \"Language ${locale.displayLanguage} is not supported in the current style\")\n    }\n  }\n}\n\ninternal fun isSupportedLanguage(locale: String): Boolean {\n  return supportedV7.contains(locale) || supportedV8.contains(locale)\n}"
  },
  {
    "path": "extension-localization/src/test/java/com/mapbox/maps/extension/localization/SupportedLanguagesTest.kt",
    "content": "package com.mapbox.maps.extension.localization\n\nimport junit.framework.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\nimport java.util.*\n\nprivate val commonLanguageList = listOf(\n  arrayOf(NAME_EN, Locale.UK),\n  arrayOf(NAME_AR, Locale(\"ar\")),\n  arrayOf(NAME_ES, Locale(\"es\", \"ES\")),\n  arrayOf(NAME_FR, Locale.FRANCE),\n  arrayOf(NAME_DE, Locale.GERMAN),\n  arrayOf(NAME_PT, Locale(\"pt\", \"PT\")),\n  arrayOf(NAME_PT, Locale(\"pt\", \"BR\")),\n  arrayOf(NAME_RU, Locale(\"ru\", \"RU\")),\n  arrayOf(NAME_JA, Locale.JAPANESE),\n  arrayOf(NAME_KO, Locale.KOREA),\n  arrayOf(NAME_ZH_HANS, Locale.SIMPLIFIED_CHINESE),\n  arrayOf(\n    NAME_ZH_HANS,\n    Locale.Builder().setLanguage(\"zh\").setRegion(\"CN\").setScript(\"Hans\").build()\n  ),\n)\n\n@RunWith(Parameterized::class)\nclass LanguageNameV7Test(\n  private val expected: String,\n  private val inputLocale: Locale,\n) {\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters(name = \"Language for locale {1} should be {0}\")\n    fun data() = commonLanguageList + listOf(\n      arrayOf(NAME_ZH, Locale.TAIWAN),\n      arrayOf(\n        NAME_ZH,\n        Locale.Builder().setLanguage(\"zh\").setRegion(\"HK\").setScript(\"Hant\").build()\n      ),\n    )\n  }\n\n  @Test\n  fun checkLanguageName() {\n    val actual = getLanguageNameV7(inputLocale)\n    assertEquals(expected, actual)\n  }\n}\n\n@RunWith(Parameterized::class)\nclass LanguageNameV8Test(\n  private val expected: String,\n  private val inputLocale: Locale,\n) {\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters(name = \"Language for locale {1} should be {0}\")\n    fun data() = commonLanguageList + listOf(\n      arrayOf(NAME_IT, Locale.ITALIAN),\n      arrayOf(NAME_ZH_HANT, Locale.TAIWAN),\n      arrayOf(\n        NAME_ZH_HANT,\n        Locale.Builder().setLanguage(\"zh\").setRegion(\"HK\").setScript(\"Hant\").build()\n      ),\n    )\n  }\n\n  @Test\n  fun checkLanguageName() {\n    val actual = getLanguageNameV8(inputLocale)\n    assertEquals(expected, actual)\n  }\n}"
  },
  {
    "path": "extension-style/.gitignore",
    "content": "/build"
  },
  {
    "path": "extension-style/README.md",
    "content": "## Mapbox Maps Style Extension for Android\n\n### Overview\n\nThe Mapbox Maps Style Extension for Android is an public library that provides easy-to-use and type-safe Kotlin DSL(Domain Specific Language) for constructing and manipulating the map style according to the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/).\n\nThe Style Extension consists of multiple extension functions and is built on top on the Mapbox Core APIs.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/styling-map/).\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Style Extension for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Extension System. To add the style extension to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.extension:maps-style:11.22.0-rc.1'\n}\n```\n\n### Example\n\nThe Mapbox Style Extension provides some easy-to-use Koltin DSL for constructing layers, sources, light and expressions. A basic use of constructing a style with one layer and one source can be found as follows:\n\n```kotlin\nmapView.mapboxMap.loadStyle(\n    style(styleUri = Style.MAPBOX_STREETS) {\n        +geojsonSource(id = \"earthquakes\") {\n            url(GEOJSON_URL)\n            cluster(false)\n         }\n        +circleLayer(layerId = \"earthquakeCircle\", sourceId = \"earthquakes\") {\n            circleRadius(get { literal(\"mag\") })\n            circleColor(Color.RED)\n            circleOpacity(0.3)\n            circleStrokeColor(Color.WHITE)\n         }\n    },\n    new Style.OnStyleLoaded() {\n      @Override\n      public void onStyleLoaded(@NotNull Style style) {\n        // Map is set up and the style has loaded. Now you can add data or make other map adjustments.\n      }\n    },\n    new MapboxMap.OnMapLoadErrorListener() {\n      @Override\n      public void onMapLoadError(@NotNull MapLoadError mapLoadError, @NotNull String s) {\n        // Error occurred when loading the map, try to handle it gracefully here\n      }\n    });\n```\n\nMore concrete examples of the style extension can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this extension.\n"
  },
  {
    "path": "extension-style/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.extension.style {\n\n  public final class StyleExtensionImpl implements com.mapbox.maps.extension.style.StyleContract.StyleExtension {\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere? getAtmosphere();\n    method public com.mapbox.maps.ColorTheme? getColorTheme();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleLightExtension? getDynamicLight();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleLightExtension? getFlatLight();\n    method public java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleImageExtension> getImages();\n    method public java.util.List<kotlin.Pair<com.mapbox.maps.extension.style.layers.Layer,com.mapbox.maps.LayerPosition>> getLayers();\n    method public java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleModelExtension> getModels();\n    method public com.mapbox.maps.extension.style.projection.generated.Projection? getProjection();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleRainExtension? getRain();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleSnowExtension? getSnow();\n    method public java.util.List<com.mapbox.maps.extension.style.sources.Source> getSources();\n    method public String getStyle();\n    method public com.mapbox.maps.extension.style.terrain.generated.Terrain? getTerrain();\n    method public com.mapbox.maps.TransitionOptions? getTransition();\n    property public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere? atmosphere;\n    property public com.mapbox.maps.ColorTheme? colorTheme;\n    property public com.mapbox.maps.extension.style.StyleContract.StyleLightExtension? dynamicLight;\n    property public com.mapbox.maps.extension.style.StyleContract.StyleLightExtension? flatLight;\n    property public java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleImageExtension> images;\n    property public java.util.List<kotlin.Pair<com.mapbox.maps.extension.style.layers.Layer,com.mapbox.maps.LayerPosition>> layers;\n    property public java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleModelExtension> models;\n    property public com.mapbox.maps.extension.style.projection.generated.Projection? projection;\n    property public com.mapbox.maps.extension.style.StyleContract.StyleRainExtension? rain;\n    property public com.mapbox.maps.extension.style.StyleContract.StyleSnowExtension? snow;\n    property public java.util.List<com.mapbox.maps.extension.style.sources.Source> sources;\n    property public String style;\n    property public com.mapbox.maps.extension.style.terrain.generated.Terrain? terrain;\n    property public com.mapbox.maps.TransitionOptions? transition;\n  }\n\n  public static final class StyleExtensionImpl.Builder {\n    ctor public StyleExtensionImpl.Builder(String style);\n    method public operator void addImage(com.mapbox.maps.extension.style.image.ImageExtensionImpl);\n    method public operator void addImage9Patch(com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl);\n    method public operator void addLayer(com.mapbox.maps.extension.style.layers.Layer);\n    method public operator void addLayerAtPosition(kotlin.Pair<? extends com.mapbox.maps.extension.style.layers.Layer,com.mapbox.maps.LayerPosition>);\n    method @com.mapbox.maps.MapboxExperimental public operator void addModel(com.mapbox.maps.extension.style.model.ModelExtensionImpl);\n    method public operator void addSource(com.mapbox.maps.extension.style.sources.Source);\n    method public com.mapbox.maps.extension.style.StyleContract.StyleExtension build();\n    method public String getStyle();\n    method public kotlin.Pair<com.mapbox.maps.extension.style.layers.Layer,com.mapbox.maps.LayerPosition> layerAtPosition(com.mapbox.maps.extension.style.layers.Layer layer, String? above = null, String? below = null, Integer? at = null);\n    method public kotlin.Pair<com.mapbox.maps.extension.style.layers.Layer,com.mapbox.maps.LayerPosition> layerAtPosition(com.mapbox.maps.extension.style.layers.Layer layer, String? above = null, String? below = null);\n    method public kotlin.Pair<com.mapbox.maps.extension.style.layers.Layer,com.mapbox.maps.LayerPosition> layerAtPosition(com.mapbox.maps.extension.style.layers.Layer layer, String? above = null);\n    method public kotlin.Pair<com.mapbox.maps.extension.style.layers.Layer,com.mapbox.maps.LayerPosition> layerAtPosition(com.mapbox.maps.extension.style.layers.Layer layer);\n    method public operator void setAtmosphere(com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere);\n    method @com.mapbox.maps.MapboxExperimental public operator void setColorTheme(com.mapbox.maps.ColorTheme);\n    method public operator void setLight(com.mapbox.maps.extension.style.light.generated.FlatLight);\n    method public operator void setLight(com.mapbox.maps.extension.style.light.DynamicLight);\n    method public operator void setProjection(com.mapbox.maps.extension.style.projection.generated.Projection);\n    method public operator void setRain(com.mapbox.maps.extension.style.precipitations.generated.Rain);\n    method public operator void setSnow(com.mapbox.maps.extension.style.precipitations.generated.Snow);\n    method public operator void setTerrain(com.mapbox.maps.extension.style.terrain.generated.Terrain);\n    method public operator void setTransition(com.mapbox.maps.TransitionOptions);\n    property public final String style;\n  }\n\n  public final class StyleExtensionImplKt {\n    method public static com.mapbox.maps.extension.style.StyleContract.StyleExtension style(String style = \"\", kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.StyleExtensionImpl.Builder,kotlin.Unit> block);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.atmosphere.generated {\n\n  @UiThread public final class Atmosphere implements com.mapbox.maps.extension.style.atmosphere.generated.AtmosphereDslReceiver com.mapbox.maps.extension.style.StyleContract.StyleAtmosphereExtension {\n    ctor public Atmosphere();\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere color(@ColorInt int color);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere color(String color);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method public String? getColor();\n    method @ColorInt public Integer? getColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getColorTransition();\n    method public String? getColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorUseThemeAsExpression();\n    method public String? getHighColor();\n    method @ColorInt public Integer? getHighColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHighColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHighColorTransition();\n    method public String? getHighColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHighColorUseThemeAsExpression();\n    method public Double? getHorizonBlend();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHorizonBlendAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHorizonBlendTransition();\n    method public java.util.List<java.lang.Double>? getRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRangeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRangeTransition();\n    method public String? getSpaceColor();\n    method @ColorInt public Integer? getSpaceColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSpaceColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getSpaceColorTransition();\n    method public String? getSpaceColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSpaceColorUseThemeAsExpression();\n    method public Double? getStarIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getStarIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getStarIntensityTransition();\n    method public java.util.List<java.lang.Double>? getVerticalRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVerticalRangeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getVerticalRangeTransition();\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColor(@ColorInt int highColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColor(String highColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColor(com.mapbox.maps.extension.style.expressions.generated.Expression highColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColorUseTheme(String highColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression highColorUseTheme);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere horizonBlend(double horizonBlend);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere horizonBlend(com.mapbox.maps.extension.style.expressions.generated.Expression horizonBlend);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere horizonBlendTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere horizonBlendTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere range(java.util.List<java.lang.Double> range);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere range(com.mapbox.maps.extension.style.expressions.generated.Expression range);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere rangeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere rangeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColor(@ColorInt int spaceColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColor(String spaceColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColor(com.mapbox.maps.extension.style.expressions.generated.Expression spaceColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColorUseTheme(String spaceColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression spaceColorUseTheme);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere starIntensity(double starIntensity);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere starIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression starIntensity);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere starIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere starIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere verticalRange(java.util.List<java.lang.Double> verticalRange);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere verticalRange(com.mapbox.maps.extension.style.expressions.generated.Expression verticalRange);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere verticalRangeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere verticalRangeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    property public final String? color;\n    property @ColorInt public final Integer? colorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? colorTransition;\n    property public final String? colorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorUseThemeAsExpression;\n    property public final String? highColor;\n    property @ColorInt public final Integer? highColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? highColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? highColorTransition;\n    property public final String? highColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? highColorUseThemeAsExpression;\n    property public final Double? horizonBlend;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? horizonBlendAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? horizonBlendTransition;\n    property public final java.util.List<java.lang.Double>? range;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rangeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rangeTransition;\n    property public final String? spaceColor;\n    property @ColorInt public final Integer? spaceColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? spaceColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? spaceColorTransition;\n    property public final String? spaceColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? spaceColorUseThemeAsExpression;\n    property public final Double? starIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? starIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? starIntensityTransition;\n    property public final java.util.List<java.lang.Double>? verticalRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? verticalRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? verticalRangeTransition;\n  }\n\n  @com.mapbox.maps.extension.style.types.AtmosphereDsl public interface AtmosphereDslReceiver {\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere color(@ColorInt int color);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere color(String color = \"#ffffff\");\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColor(@ColorInt int highColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColor(String highColor = \"#245cdf\");\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColor(com.mapbox.maps.extension.style.expressions.generated.Expression highColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColorUseTheme(String highColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere highColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression highColorUseTheme);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere horizonBlend(double horizonBlend);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere horizonBlend(com.mapbox.maps.extension.style.expressions.generated.Expression horizonBlend = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"zoom\" + \"\\\"\" + \"],4,0.2,7,0.1]\".trimIndent()));\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere horizonBlendTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere horizonBlendTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere range(java.util.List<java.lang.Double> range = listOf(0.5, 10.0));\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere range(com.mapbox.maps.extension.style.expressions.generated.Expression range);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere rangeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere rangeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColor(@ColorInt int spaceColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColor(String spaceColor);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColor(com.mapbox.maps.extension.style.expressions.generated.Expression spaceColor = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"zoom\" + \"\\\"\" + \"],4,\" + \"\\\"\" + \"#010b19\" + \"\\\"\" + \",7,\" + \"\\\"\" + \"#367ab9\" + \"\\\"\" + \"]\".trimIndent()));\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColorUseTheme(String spaceColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere spaceColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression spaceColorUseTheme);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere starIntensity(double starIntensity);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere starIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression starIntensity = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"zoom\" + \"\\\"\" + \"],5,0.35,6,0]\".trimIndent()));\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere starIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere starIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere verticalRange(java.util.List<java.lang.Double> verticalRange = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere verticalRange(com.mapbox.maps.extension.style.expressions.generated.Expression verticalRange);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere verticalRangeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere verticalRangeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n  }\n\n  public final class AtmosphereKt {\n    method public static com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere atmosphere(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.atmosphere.generated.AtmosphereDslReceiver,kotlin.Unit> block);\n  }\n\n  public final class AtmosphereUtils {\n    method public static com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere getAtmosphere(com.mapbox.maps.MapboxStyleManager);\n    method public static void removeAtmosphere(com.mapbox.maps.MapboxStyleManager);\n    method public static void setAtmosphere(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleAtmosphereExtension atmosphere);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.color {\n\n  public final class ColorThemeExtKt {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.ColorTheme colorTheme();\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.ColorTheme colorTheme(String base64);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.ColorTheme colorTheme(com.mapbox.maps.Image image);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.ColorTheme colorTheme(android.graphics.Bitmap bitmap);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.expressions.dsl.generated {\n\n  public final class ExpressionDslKt {\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression abs(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression abs(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression accumulated();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression acos(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression acos(double value);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.expressions.generated.Expression activeAnchor();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression all(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression any(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression array(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression asin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression asin(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression at(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression at(double index, com.mapbox.maps.extension.style.expressions.generated.Expression array);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression atInterpolated(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression atan(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression atan(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression boolean(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ceil(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ceil(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression coalesce(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression collator(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression color(@ColorInt int intColor);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression concat(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression concat(java.lang.String... values);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression config(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression cos(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression cos(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression distance(com.mapbox.geojson.GeoJson geojson);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression distanceFromCenter();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression division(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression division(double first, double second);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression downcase(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression downcase(String value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression e();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression eq(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression featureState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression floor(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression floor(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression format(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.FormatBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression geometryType();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression get(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression get(String key);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression get(String key, com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression gt(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression gte(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression has(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression has(String string, com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression has(String string);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression heatmapDensity();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression hsl(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression hsla(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression id();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression image(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ImageBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(String needle, com.mapbox.maps.extension.style.expressions.generated.Expression haystack);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(double needle, com.mapbox.maps.extension.style.expressions.generated.Expression haystack);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression indexOf(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression interpolate(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression isSupportedScript(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression isSupportedScript(String script);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression length(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression length(String string);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression letExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression lineProgress();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(long value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(boolean value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(String value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(java.util.List<?> value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(java.util.HashMap<java.lang.String,java.lang.Object> value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ln(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ln(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ln2();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression log10(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression log10(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression log2(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression log2(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression lt(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression lte(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression match(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression max(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression max(double... values);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression measureLight(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression min(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression min(double... values);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression mod(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression mod(double first, double second);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression neq(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression not(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression not(boolean bool);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression number(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression numberFormat(com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression objectExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression pi();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression pitch();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression pow(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression pow(double first, double second);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression product(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression product(double... double);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression properties();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression random(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleSpeed();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rasterValue();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression resolvedLocale(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rgb(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rgb(double red, double green, double blue);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rgba(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rgba(double red, double green, double blue, double alpha);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression round(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression round(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sin(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression skyRadialProgress();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression slice(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression split(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sqrt(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sqrt(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression step(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression string(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression subtract(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression subtract(double first, double second);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression subtract(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sum(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sum(double... double);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression switchCase(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression tan(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression tan(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toBoolean(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toColor(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toHsla(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toNumber(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toRgba(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toString(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression typeofExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression upcase(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression upcase(String value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression varExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression varExpression(String value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression within(com.mapbox.geojson.Geometry geometry);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression worldview(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression zoom();\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.expressions.generated {\n\n  public final class Expression extends com.mapbox.bindgen.Value {\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression abs(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression abs(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression accumulated();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression acos(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression acos(double value);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.expressions.generated.Expression activeAnchor();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression all(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression any(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression array(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression asin(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression asin(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression at(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression at(double index, com.mapbox.maps.extension.style.expressions.generated.Expression array);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression atInterpolated(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression atan(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression atan(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression boolean(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ceil(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ceil(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression coalesce(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression collator(boolean caseSensitive = false, boolean diacriticSensitive = false, java.util.Locale locale);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression collator(boolean caseSensitive = false, boolean diacriticSensitive = false, String locale);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression collator(com.mapbox.maps.extension.style.expressions.generated.Expression caseSensitive, com.mapbox.maps.extension.style.expressions.generated.Expression diacriticSensitive, com.mapbox.maps.extension.style.expressions.generated.Expression locale);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression color(@ColorInt int intColor);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression concat(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression concat(java.lang.String... values);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression config(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression cos(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression cos(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression cubicBezier(com.mapbox.maps.extension.style.expressions.generated.Expression x1, com.mapbox.maps.extension.style.expressions.generated.Expression x2, com.mapbox.maps.extension.style.expressions.generated.Expression x3, com.mapbox.maps.extension.style.expressions.generated.Expression x4);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression cubicBezier(double x1, double x2, double x3, double x4);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression cubicBezierInterpolator(com.mapbox.maps.extension.style.expressions.generated.Expression x1, com.mapbox.maps.extension.style.expressions.generated.Expression y1, com.mapbox.maps.extension.style.expressions.generated.Expression x2, com.mapbox.maps.extension.style.expressions.generated.Expression y2, com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression cubicBezierInterpolator(double x1, double y1, double x2, double y2, com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression distance(com.mapbox.geojson.GeoJson geojson);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression distanceFromCenter();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression division(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression division(double first, double second);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression downcase(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression downcase(String value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression e();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression eq(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression exponential(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression exponential(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression exponentialInterpolator(com.mapbox.maps.extension.style.expressions.generated.Expression base, com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression exponentialInterpolator(double base, com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression featureState(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression floor(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression floor(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression format(com.mapbox.maps.extension.style.expressions.types.FormatSection... formatSections);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression fromRaw(String expression);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression geometryType();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression get(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression get(String key);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression get(String key, com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public inline <reified T> T! getLiteral();\n    method public Object? getLiteralValue();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression gt(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression gte(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression has(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression has(String string, com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression has(String string);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression heatmapDensity();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression hsl(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression hsla(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression id();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression image(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.expressions.generated.Expression image(com.mapbox.maps.extension.style.expressions.generated.Expression image, java.util.Map<java.lang.String,com.mapbox.maps.extension.style.expressions.generated.Expression> options);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.expressions.generated.Expression image(com.mapbox.maps.extension.style.expressions.generated.Expression image, java.util.Map<java.lang.String,com.mapbox.maps.extension.style.expressions.generated.Expression> options, com.mapbox.maps.extension.style.expressions.generated.Expression image2, java.util.Map<java.lang.String,com.mapbox.maps.extension.style.expressions.generated.Expression> options2);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(String needle, com.mapbox.maps.extension.style.expressions.generated.Expression haystack);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(double needle, com.mapbox.maps.extension.style.expressions.generated.Expression haystack);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression indexOf(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression interpolate(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public boolean isLiteral();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression isSupportedScript(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression isSupportedScript(String script);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression length(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression length(String string);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression letExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression lineProgress();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression linear();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression linearInterpolator(com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(long value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(boolean value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression literal(String value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ln(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ln(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression ln2();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression log10(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression log10(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression log2(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression log2(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression lt(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression lte(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression match(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression match(com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>![] stops, com.mapbox.maps.extension.style.expressions.generated.Expression fallback);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression max(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression max(double... values);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression measureLight(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression min(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression min(double... values);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression mod(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression mod(double first, double second);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression neq(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression not(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression not(boolean bool);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression number(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression numberFormat(com.mapbox.maps.extension.style.expressions.generated.Expression number, com.mapbox.maps.extension.style.expressions.generated.Expression? locale = null, com.mapbox.maps.extension.style.expressions.generated.Expression? currency = null, com.mapbox.maps.extension.style.expressions.generated.Expression? minFractionDigits = null, com.mapbox.maps.extension.style.expressions.generated.Expression? maxFractionDigits = null);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression numberFormat(double value, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression objectExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression pi();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression pitch();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression pow(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression pow(double first, double second);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression product(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression product(double... double);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression properties();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression random(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleSpeed();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rasterValue();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression resolvedLocale(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rgb(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rgb(double red, double green, double blue);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rgba(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression rgba(double red, double green, double blue, double alpha);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression round(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression round(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sin(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sin(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression skyRadialProgress();\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression slice(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression split(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sqrt(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sqrt(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression step(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression step(com.mapbox.maps.extension.style.expressions.generated.Expression input, com.mapbox.maps.extension.style.expressions.generated.Expression output, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression string(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression subtract(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression subtract(double first, double second);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression subtract(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sum(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression sum(double... double);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression switchCase(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression switchCase(kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>![] stops, com.mapbox.maps.extension.style.expressions.generated.Expression fallback);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression tan(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression tan(double value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toBoolean(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toColor(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toHsla(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toNumber(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toRgba(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression toString(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression typeofExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression upcase(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression upcase(String value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression varExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression varExpression(String value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression within(com.mapbox.geojson.Geometry geometry);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.expressions.generated.Expression worldview(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression zoom();\n    property public final Object? literalValue;\n    field public static final com.mapbox.maps.extension.style.expressions.generated.Expression.Companion Companion;\n  }\n\n  public abstract static class Expression.Builder {\n    ctor public Expression.Builder(String operator);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression build();\n  }\n\n  @com.mapbox.maps.extension.style.types.ExpressionDsl public static final class Expression.CollatorBuilder extends com.mapbox.maps.extension.style.expressions.generated.Expression.Builder {\n    ctor public Expression.CollatorBuilder();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder caseSensitive(com.mapbox.maps.extension.style.expressions.generated.Expression caseSensitive);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder caseSensitive(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder caseSensitive(boolean caseSensitive = false);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder diacriticSensitive(com.mapbox.maps.extension.style.expressions.generated.Expression diacriticSensitive);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder diacriticSensitive(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder diacriticSensitive(boolean diacriticSensitive = false);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder locale(com.mapbox.maps.extension.style.expressions.generated.Expression locale);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder locale(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder locale(String locale);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder locale(java.util.Locale locale);\n  }\n\n  public static final class Expression.Companion {\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression abs(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression abs(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression abs(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression accumulated();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression acos(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression acos(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression acos(double value);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.expressions.generated.Expression activeAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression all(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression all(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression any(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression any(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression array(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression array(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression asin(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression asin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression asin(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression at(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression at(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression at(double index, com.mapbox.maps.extension.style.expressions.generated.Expression array);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression atInterpolated(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression atInterpolated(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression atan(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression atan(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression atan(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression boolean(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression boolean(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression ceil(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression ceil(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression ceil(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression coalesce(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression coalesce(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression collator(boolean caseSensitive = false, boolean diacriticSensitive = false, java.util.Locale locale);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression collator(boolean caseSensitive = false, boolean diacriticSensitive = false, String locale);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression collator(com.mapbox.maps.extension.style.expressions.generated.Expression caseSensitive, com.mapbox.maps.extension.style.expressions.generated.Expression diacriticSensitive, com.mapbox.maps.extension.style.expressions.generated.Expression locale);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression collator(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression color(@ColorInt int intColor);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression concat(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression concat(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression concat(java.lang.String... values);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression config(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression config(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression cos(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression cos(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression cos(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression cubicBezier(com.mapbox.maps.extension.style.expressions.generated.Expression x1, com.mapbox.maps.extension.style.expressions.generated.Expression x2, com.mapbox.maps.extension.style.expressions.generated.Expression x3, com.mapbox.maps.extension.style.expressions.generated.Expression x4);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression cubicBezier(double x1, double x2, double x3, double x4);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression cubicBezier(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression cubicBezierInterpolator(com.mapbox.maps.extension.style.expressions.generated.Expression x1, com.mapbox.maps.extension.style.expressions.generated.Expression y1, com.mapbox.maps.extension.style.expressions.generated.Expression x2, com.mapbox.maps.extension.style.expressions.generated.Expression y2, com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression cubicBezierInterpolator(double x1, double y1, double x2, double y2, com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression distance(com.mapbox.geojson.GeoJson geojson);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression distanceFromCenter();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression division(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression division(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression division(double first, double second);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression downcase(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression downcase(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression downcase(String value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression e();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression eq(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression eq(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression exponential(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression exponential(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression exponential(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression exponentialInterpolator(com.mapbox.maps.extension.style.expressions.generated.Expression base, com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression exponentialInterpolator(double base, com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression featureState(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression featureState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression floor(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression floor(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression floor(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression format(com.mapbox.maps.extension.style.expressions.types.FormatSection... formatSections);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression format(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.FormatBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression fromRaw(String expression);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression geometryType();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression get(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression get(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression get(String key);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression get(String key, com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression gt(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression gt(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression gte(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression gte(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression has(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression has(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression has(String string, com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression has(String string);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression heatmapDensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression hsl(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression hsl(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression hsla(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression hsla(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression id();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression image(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.expressions.generated.Expression image(com.mapbox.maps.extension.style.expressions.generated.Expression image, java.util.Map<java.lang.String,com.mapbox.maps.extension.style.expressions.generated.Expression> options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.expressions.generated.Expression image(com.mapbox.maps.extension.style.expressions.generated.Expression image, java.util.Map<java.lang.String,com.mapbox.maps.extension.style.expressions.generated.Expression> options, com.mapbox.maps.extension.style.expressions.generated.Expression image2, java.util.Map<java.lang.String,com.mapbox.maps.extension.style.expressions.generated.Expression> options2);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression image(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ImageBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(String needle, com.mapbox.maps.extension.style.expressions.generated.Expression haystack);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression inExpression(double needle, com.mapbox.maps.extension.style.expressions.generated.Expression haystack);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression indexOf(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression indexOf(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression interpolate(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression interpolate(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression isSupportedScript(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression isSupportedScript(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression isSupportedScript(String script);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression length(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression length(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression length(String string);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression letExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression letExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression lineProgress();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression linear();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression linearInterpolator(com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression literal(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression literal(long value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression literal(boolean value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression literal(String value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression ln(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression ln(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression ln(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression ln2();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression log10(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression log10(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression log10(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression log2(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression log2(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression log2(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression lt(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression lt(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression lte(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression lte(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression match(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression match(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression match(com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>![] stops, com.mapbox.maps.extension.style.expressions.generated.Expression fallback);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression max(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression max(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression max(double... values);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression measureLight(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression measureLight(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression min(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression min(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression min(double... values);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression mod(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression mod(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression mod(double first, double second);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression neq(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression neq(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression not(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression not(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression not(boolean bool);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression number(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression number(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression numberFormat(com.mapbox.maps.extension.style.expressions.generated.Expression number, com.mapbox.maps.extension.style.expressions.generated.Expression? locale = null, com.mapbox.maps.extension.style.expressions.generated.Expression? currency = null, com.mapbox.maps.extension.style.expressions.generated.Expression? minFractionDigits = null, com.mapbox.maps.extension.style.expressions.generated.Expression? maxFractionDigits = null);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression numberFormat(com.mapbox.maps.extension.style.expressions.generated.Expression number, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression numberFormat(double value, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression objectExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression objectExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression pi();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression pitch();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression pow(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression pow(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression pow(double first, double second);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression product(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression product(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression product(double... double);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression properties();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression random(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression random(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleSpeed();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression rasterValue();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression resolvedLocale(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression resolvedLocale(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression rgb(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression rgb(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression rgb(double red, double green, double blue);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression rgba(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression rgba(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression rgba(double red, double green, double blue, double alpha);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression round(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression round(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression round(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression sin(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression sin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression sin(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression skyRadialProgress();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression slice(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression slice(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression split(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression split(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression sqrt(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression sqrt(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression sqrt(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression step(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression step(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression step(com.mapbox.maps.extension.style.expressions.generated.Expression input, com.mapbox.maps.extension.style.expressions.generated.Expression output, kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>... stops);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression string(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression string(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression subtract(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression subtract(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression subtract(double first, double second);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression subtract(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression sum(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression sum(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression sum(double... double);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression switchCase(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression switchCase(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression switchCase(kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression>![] stops, com.mapbox.maps.extension.style.expressions.generated.Expression fallback);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression tan(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression tan(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression tan(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toBoolean(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toBoolean(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toColor(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toColor(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toHsla(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toHsla(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toNumber(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toNumber(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toRgba(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toRgba(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toString(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression toString(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression typeofExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression typeofExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression upcase(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression upcase(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression upcase(String value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression varExpression(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression varExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression varExpression(String value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression within(com.mapbox.geojson.Geometry geometry);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.expressions.generated.Expression worldview(com.mapbox.maps.extension.style.expressions.generated.Expression... expressions);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression worldview(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression zoom();\n  }\n\n  @com.mapbox.maps.extension.style.types.ExpressionDsl public static class Expression.ExpressionBuilder extends com.mapbox.maps.extension.style.expressions.generated.Expression.Builder {\n    ctor public Expression.ExpressionBuilder(String operator);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder abs(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder abs(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder accumulated();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder acos(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder acos(double value);\n    method @com.mapbox.maps.MapboxExperimental public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder activeAnchor();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder addArgument(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder all(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder any(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder array(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder asin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder asin(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder at(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder at(double index, com.mapbox.maps.extension.style.expressions.generated.Expression array);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder atInterpolated(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder atan(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder atan(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder boolean(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder ceil(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder ceil(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder coalesce(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder collator(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder color(@ColorInt int intColor);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder concat(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder concat(java.lang.String... values);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder config(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder cos(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder cos(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder distance(com.mapbox.geojson.GeoJson geojson);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder distanceFromCenter();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder division(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder division(double first, double second);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder downcase(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder downcase(String value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder e();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder eq(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder featureState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder floor(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder floor(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder format(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.FormatBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder geometryType();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder get(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder get(String key);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder get(String key, com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder gt(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder gte(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder has(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder has(String string, com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder has(String string);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder heatmapDensity();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder hsl(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder hsla(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder id();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder image(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ImageBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder inExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder inExpression(String needle, com.mapbox.maps.extension.style.expressions.generated.Expression haystack);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder inExpression(double needle, com.mapbox.maps.extension.style.expressions.generated.Expression haystack);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder indexOf(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder interpolate(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder isSupportedScript(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder isSupportedScript(String script);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder length(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder length(String string);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder letExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder lineProgress();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder literal(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder literal(long value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder literal(boolean value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder literal(String value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder literal(java.util.HashMap<java.lang.String,java.lang.Object> value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder literal(java.util.List<?> value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder ln(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder ln(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder ln2();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder log10(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder log10(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder log2(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder log2(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder lt(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder lte(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder match(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder max(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder max(double... values);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder measureLight(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder min(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder min(double... values);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder mod(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder mod(double first, double second);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder neq(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder not(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder not(boolean bool);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder number(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder numberFormat(com.mapbox.maps.extension.style.expressions.generated.Expression input, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder numberFormat(double value, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder objectExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder pi();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder pitch();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder pow(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder pow(double first, double second);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder product(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder product(double... double);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder properties();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder random(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder rasterParticleSpeed();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder rasterValue();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder resolvedLocale(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder rgb(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder rgb(double red, double green, double blue);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder rgba(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder rgba(double red, double green, double blue, double alpha);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder round(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder round(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder sin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder sin(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder skyRadialProgress();\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder slice(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder split(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder sqrt(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder sqrt(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder step(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder stop(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder stop(double input, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder stop(com.mapbox.maps.extension.style.expressions.generated.Expression input, com.mapbox.maps.extension.style.expressions.generated.Expression output);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder stop(double input, double output);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder stop(kotlin.Pair<com.mapbox.maps.extension.style.expressions.generated.Expression,com.mapbox.maps.extension.style.expressions.generated.Expression> pair);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder string(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder subtract(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder subtract(double first, double second);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder subtract(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder sum(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder sum(double... double);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder switchCase(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder tan(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder tan(double value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder toBoolean(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder toColor(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder toHsla(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder toNumber(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder toRgba(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder toString(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder typeofExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder upcase(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder upcase(String value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder varExpression(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder varExpression(String value);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder within(com.mapbox.geojson.Geometry geometry);\n    method @com.mapbox.maps.MapboxExperimental public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder worldview(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public final com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder zoom();\n  }\n\n  @com.mapbox.maps.extension.style.types.ExpressionDsl public static final class Expression.FormatBuilder extends com.mapbox.maps.extension.style.expressions.generated.Expression.Builder {\n    ctor public Expression.FormatBuilder();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatBuilder formatSection(com.mapbox.maps.extension.style.expressions.generated.Expression content);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatBuilder formatSection(com.mapbox.maps.extension.style.expressions.generated.Expression content, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatBuilder formatSection(String text);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatBuilder formatSection(String text, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder,kotlin.Unit> block);\n  }\n\n  @com.mapbox.maps.extension.style.types.ExpressionDsl public static final class Expression.FormatSectionBuilder {\n    ctor public Expression.FormatSectionBuilder(com.mapbox.maps.extension.style.expressions.generated.Expression content);\n    method public java.util.List<com.mapbox.maps.extension.style.expressions.generated.Expression> build();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder fontScale(double fontScale);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder fontScale(com.mapbox.maps.extension.style.expressions.generated.Expression fontScale);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder fontScale(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder textColor(@ColorInt int textColor);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder textColor(String textColor);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder textColor(com.mapbox.maps.extension.style.expressions.generated.Expression textColor);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder textColor(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder textFont(java.util.List<java.lang.String> textFont);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder textFont(com.mapbox.maps.extension.style.expressions.generated.Expression textFont);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder textFont(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n  }\n\n  @com.mapbox.maps.extension.style.types.ExpressionDsl public static final class Expression.ImageBuilder extends com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder {\n    ctor public Expression.ImageBuilder();\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.expressions.generated.Expression.ImageBuilder imageOptions(kotlin.Pair<java.lang.String,com.mapbox.maps.extension.style.expressions.generated.Expression>... pairs);\n  }\n\n  @com.mapbox.maps.extension.style.types.ExpressionDsl public static final class Expression.InterpolatorBuilder extends com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder {\n    ctor public Expression.InterpolatorBuilder(String operator);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder cubicBezier(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder cubicBezier(com.mapbox.maps.extension.style.expressions.generated.Expression x1, com.mapbox.maps.extension.style.expressions.generated.Expression x2, com.mapbox.maps.extension.style.expressions.generated.Expression x3, com.mapbox.maps.extension.style.expressions.generated.Expression x4);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder cubicBezier(double x1, double x2, double x3, double x4);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder exponential(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder exponential(double value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder exponential(com.mapbox.maps.extension.style.expressions.generated.Expression value);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder linear();\n  }\n\n  @com.mapbox.maps.extension.style.types.ExpressionDsl public static final class Expression.NumberFormatBuilder extends com.mapbox.maps.extension.style.expressions.generated.Expression.Builder {\n    ctor public Expression.NumberFormatBuilder(com.mapbox.maps.extension.style.expressions.generated.Expression input);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder currency(String currency);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder currency(com.mapbox.maps.extension.style.expressions.generated.Expression currency);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder currency(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder locale(String locale);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder locale(com.mapbox.maps.extension.style.expressions.generated.Expression locale);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder locale(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder maxFractionDigits(int maxFractionDigits);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder maxFractionDigits(com.mapbox.maps.extension.style.expressions.generated.Expression maxFractionDigits);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder maxFractionDigits(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder minFractionDigits(int minFractionDigits);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder minFractionDigits(com.mapbox.maps.extension.style.expressions.generated.Expression minFractionDigits);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder minFractionDigits(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder,kotlin.Unit> block);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.expressions.types {\n\n  public final class FormatSection {\n    ctor public FormatSection(com.mapbox.maps.extension.style.expressions.generated.Expression content, com.mapbox.maps.extension.style.expressions.generated.Expression? fontScale = null, com.mapbox.maps.extension.style.expressions.generated.Expression? textFont = null, com.mapbox.maps.extension.style.expressions.generated.Expression? textColor = null);\n    ctor public FormatSection(com.mapbox.maps.extension.style.expressions.generated.Expression content, com.mapbox.maps.extension.style.expressions.generated.Expression? fontScale = null, com.mapbox.maps.extension.style.expressions.generated.Expression? textFont = null);\n    ctor public FormatSection(com.mapbox.maps.extension.style.expressions.generated.Expression content, com.mapbox.maps.extension.style.expressions.generated.Expression? fontScale = null);\n    ctor public FormatSection(com.mapbox.maps.extension.style.expressions.generated.Expression content);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression component1();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? component2();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? component3();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? component4();\n    method public com.mapbox.maps.extension.style.expressions.types.FormatSection copy(com.mapbox.maps.extension.style.expressions.generated.Expression content, com.mapbox.maps.extension.style.expressions.generated.Expression? fontScale, com.mapbox.maps.extension.style.expressions.generated.Expression? textFont, com.mapbox.maps.extension.style.expressions.generated.Expression? textColor);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression getContent();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFontScale();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextColor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextFont();\n    method public void setFontScale(com.mapbox.maps.extension.style.expressions.generated.Expression?);\n    method public void setTextColor(com.mapbox.maps.extension.style.expressions.generated.Expression?);\n    method public void setTextFont(com.mapbox.maps.extension.style.expressions.generated.Expression?);\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression content;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fontScale;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textColor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textFont;\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.image {\n\n  public final class ImageExtensionImpl implements com.mapbox.maps.extension.style.StyleContract.StyleImageExtension {\n    ctor public ImageExtensionImpl(com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder builder);\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  public static final class ImageExtensionImpl.Builder {\n    ctor @Deprecated public ImageExtensionImpl.Builder(String imageId);\n    ctor public ImageExtensionImpl.Builder(String imageId, com.mapbox.maps.Image image);\n    ctor public ImageExtensionImpl.Builder(String imageId, android.graphics.Bitmap bitmap);\n    method @Deprecated public com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder bitmap(android.graphics.Bitmap bitmap);\n    method public com.mapbox.maps.extension.style.image.ImageExtensionImpl build();\n    method public com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder content(com.mapbox.maps.ImageContent content);\n    method public String getImageId();\n    method @Deprecated public com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder image(com.mapbox.maps.Image image);\n    method public com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder scale(float scale);\n    method public com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder sdf(boolean sdf = false);\n    method public com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder stretchX(java.util.List<com.mapbox.maps.ImageStretches> stretchX = listOf());\n    method public com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder stretchY(java.util.List<com.mapbox.maps.ImageStretches> stretchY = listOf());\n    property public final String imageId;\n  }\n\n  public final class ImageNinePatchExtensionImpl implements com.mapbox.maps.extension.style.StyleContract.StyleImageExtension {\n    ctor public ImageNinePatchExtensionImpl(com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl.Builder builder);\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  public static final class ImageNinePatchExtensionImpl.Builder {\n    ctor public ImageNinePatchExtensionImpl.Builder(String imageId, android.graphics.Bitmap bitmap);\n    method public com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl build();\n    method public android.graphics.Bitmap getBitmap();\n    method public String getImageId();\n    method public com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl.Builder scale(float scale);\n    method public com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl.Builder sdf(boolean sdf = false);\n    property public final android.graphics.Bitmap bitmap;\n    property public final String imageId;\n  }\n\n  public final class ImageUtils {\n    method public static void addImage(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleImageExtension image);\n    method public static void addImage9Patch(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleImageExtension image);\n    method @Deprecated public static com.mapbox.maps.extension.style.image.ImageExtensionImpl image(String imageId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.image.ImageExtensionImpl image(String imageId, com.mapbox.maps.Image image, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder,kotlin.Unit> block = {});\n    method public static com.mapbox.maps.extension.style.image.ImageExtensionImpl image(String imageId, android.graphics.Bitmap bitmap, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.image.ImageExtensionImpl.Builder,kotlin.Unit> block = {});\n    method public static com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl image9Patch(String imageId, android.graphics.Bitmap bitmap, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl.Builder,kotlin.Unit>? block = null);\n    method public static com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl image9Patch(String imageId, android.graphics.Bitmap bitmap);\n  }\n\n  public final class NinePatchImage {\n    ctor public NinePatchImage(com.mapbox.maps.Image internalImage, java.util.List<com.mapbox.maps.ImageStretches> stretchX, java.util.List<com.mapbox.maps.ImageStretches> stretchY, com.mapbox.maps.ImageContent imageContent);\n    method public com.mapbox.maps.Image component1();\n    method public java.util.List<com.mapbox.maps.ImageStretches> component2();\n    method public java.util.List<com.mapbox.maps.ImageStretches> component3();\n    method public com.mapbox.maps.ImageContent component4();\n    method public com.mapbox.maps.extension.style.image.NinePatchImage copy(com.mapbox.maps.Image internalImage, java.util.List<com.mapbox.maps.ImageStretches> stretchX, java.util.List<com.mapbox.maps.ImageStretches> stretchY, com.mapbox.maps.ImageContent imageContent);\n    method public com.mapbox.maps.ImageContent getImageContent();\n    method public com.mapbox.maps.Image getInternalImage();\n    method public java.util.List<com.mapbox.maps.ImageStretches> getStretchX();\n    method public java.util.List<com.mapbox.maps.ImageStretches> getStretchY();\n    property public final com.mapbox.maps.ImageContent imageContent;\n    property public final com.mapbox.maps.Image internalImage;\n    property public final java.util.List<com.mapbox.maps.ImageStretches> stretchX;\n    property public final java.util.List<com.mapbox.maps.ImageStretches> stretchY;\n  }\n\n  public final class NinePatchUtils {\n    method public static com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addImage9Patch(com.mapbox.maps.MapboxStyleManager, String imageId, android.graphics.Bitmap bitmap, float scale = com.mapbox.maps.MapboxStyleManager.pixelRatio, boolean sdf = false);\n    method public static com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addImage9Patch(com.mapbox.maps.MapboxStyleManager, String imageId, android.graphics.Bitmap bitmap, float scale = com.mapbox.maps.MapboxStyleManager.pixelRatio);\n    method public static com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addImage9Patch(com.mapbox.maps.MapboxStyleManager, String imageId, android.graphics.Bitmap bitmap);\n    method public static com.mapbox.maps.extension.style.image.NinePatchImage parse9PatchBitmap(android.graphics.Bitmap);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.layers {\n\n  @UiThread public final class CustomLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.CustomLayerDsl {\n    ctor public CustomLayer(String layerId, com.mapbox.maps.CustomLayerHost host);\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.CustomLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.CustomLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.CustomLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.CustomLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.CustomLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.CustomLayer.Companion Companion;\n  }\n\n  public static final class CustomLayer.Companion {\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface CustomLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.CustomLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.CustomLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.CustomLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.CustomLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.CustomLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class CustomLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.CustomLayer customLayer(String layerId, com.mapbox.maps.CustomLayerHost host, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.CustomLayerDsl,kotlin.Unit>? block = null);\n    method public static com.mapbox.maps.extension.style.layers.CustomLayer customLayer(String layerId, com.mapbox.maps.CustomLayerHost host);\n  }\n\n  public abstract class Layer implements com.mapbox.maps.extension.style.StyleContract.StyleLayerExtension {\n    ctor public Layer();\n    method protected com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addLayer(com.mapbox.maps.MapboxStyleManager delegate, com.mapbox.bindgen.Value propertiesValue, com.mapbox.maps.LayerPosition? position);\n    method protected com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addPersistentLayer(com.mapbox.maps.MapboxStyleManager delegate, com.mapbox.maps.LayerPosition? position);\n    method public final void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate, com.mapbox.maps.LayerPosition? position);\n    method protected final com.mapbox.bindgen.Value getCachedLayerProperties();\n    method public abstract String getLayerId();\n    method public abstract Double? getMaxZoom();\n    method public abstract Double? getMinZoom();\n    method public abstract String? getSlot();\n    method public abstract com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public abstract com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public abstract com.mapbox.maps.extension.style.layers.Layer maxZoom(double maxZoom);\n    method public abstract com.mapbox.maps.extension.style.layers.Layer minZoom(double minZoom);\n    method public abstract com.mapbox.maps.extension.style.layers.Layer slot(String slot);\n    method public abstract com.mapbox.maps.extension.style.layers.Layer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public abstract com.mapbox.maps.extension.style.layers.Layer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public abstract String layerId;\n    property public abstract Double? maxZoom;\n    property public abstract Double? minZoom;\n    property public abstract String? slot;\n    property public abstract com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public abstract com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.Layer.Companion Companion;\n  }\n\n  public static final class Layer.Companion {\n  }\n\n  public final class LayerUtils {\n    method public static void addLayer(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleLayerExtension layer);\n    method public static void addLayerAbove(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleLayerExtension layer, String? above);\n    method public static void addLayerAt(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleLayerExtension layer, Integer? index);\n    method public static void addLayerBelow(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleLayerExtension layer, String? below);\n    method public static void addPersistentLayer(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.layers.Layer layer, com.mapbox.maps.LayerPosition? position = null);\n    method public static void addPersistentLayer(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.layers.Layer layer);\n    method public static com.mapbox.maps.extension.style.layers.Layer? getLayer(com.mapbox.maps.MapboxStyleManager, String layerId);\n    method public static inline <reified T extends com.mapbox.maps.extension.style.layers.Layer> T! getLayerAs(com.mapbox.maps.MapboxStyleManager, String layerId);\n    method public static Boolean? isPersistent(com.mapbox.maps.extension.style.layers.Layer);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.layers.generated {\n\n  @UiThread public final class BackgroundLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.BackgroundLayerDsl {\n    ctor public BackgroundLayer(String layerId);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColor(String backgroundColor);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColor(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundColor);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColor(@ColorInt int backgroundColor);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColorUseTheme(String backgroundColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundEmissiveStrength(double backgroundEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundOpacity(double backgroundOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundPattern(String backgroundPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundPattern(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundPattern);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment backgroundPitchAlignment);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundPitchAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundPitchAlignment);\n    method public String? getBackgroundColor();\n    method @ColorInt public Integer? getBackgroundColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getBackgroundColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getBackgroundColorTransition();\n    method public String? getBackgroundColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getBackgroundColorUseThemeAsExpression();\n    method public Double? getBackgroundEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getBackgroundEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getBackgroundEmissiveStrengthTransition();\n    method public Double? getBackgroundOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getBackgroundOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getBackgroundOpacityTransition();\n    method public String? getBackgroundPattern();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getBackgroundPatternAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment? getBackgroundPitchAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getBackgroundPitchAlignmentAsExpression();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final String? backgroundColor;\n    property @ColorInt public final Integer? backgroundColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? backgroundColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? backgroundColorTransition;\n    property public final String? backgroundColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? backgroundColorUseThemeAsExpression;\n    property public final Double? backgroundEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? backgroundEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? backgroundEmissiveStrengthTransition;\n    property public final Double? backgroundOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? backgroundOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? backgroundOpacityTransition;\n    property public final String? backgroundPattern;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? backgroundPatternAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment? backgroundPitchAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? backgroundPitchAlignmentAsExpression;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.BackgroundLayer.Companion Companion;\n  }\n\n  public static final class BackgroundLayer.Companion {\n    method public String? getDefaultBackgroundColor();\n    method @ColorInt public Integer? getDefaultBackgroundColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultBackgroundColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultBackgroundColorTransition();\n    method public String? getDefaultBackgroundColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultBackgroundColorUseThemeAsExpression();\n    method public Double? getDefaultBackgroundEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultBackgroundEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultBackgroundEmissiveStrengthTransition();\n    method public Double? getDefaultBackgroundOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultBackgroundOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultBackgroundOpacityTransition();\n    method public String? getDefaultBackgroundPattern();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultBackgroundPatternAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment? getDefaultBackgroundPitchAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultBackgroundPitchAlignmentAsExpression();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final String? defaultBackgroundColor;\n    property @ColorInt public final Integer? defaultBackgroundColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultBackgroundColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultBackgroundColorTransition;\n    property public final String? defaultBackgroundColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultBackgroundColorUseThemeAsExpression;\n    property public final Double? defaultBackgroundEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultBackgroundEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultBackgroundEmissiveStrengthTransition;\n    property public final Double? defaultBackgroundOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultBackgroundOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultBackgroundOpacityTransition;\n    property public final String? defaultBackgroundPattern;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultBackgroundPatternAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment? defaultBackgroundPitchAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultBackgroundPitchAlignmentAsExpression;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface BackgroundLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColor(String backgroundColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColor(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundColor);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColor(@ColorInt int backgroundColor);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColorUseTheme(String backgroundColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundEmissiveStrength(double backgroundEmissiveStrength = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundOpacity(double backgroundOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundPattern(String backgroundPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundPattern(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundPattern);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment backgroundPitchAlignment = com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment.MAP);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundPitchAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression backgroundPitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.BackgroundLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class BackgroundLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.BackgroundLayer backgroundLayer(String layerId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.BackgroundLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class CircleLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.CircleLayerDsl {\n    ctor public CircleLayer(String layerId, String sourceId);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleBlur(double circleBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleBlur(com.mapbox.maps.extension.style.expressions.generated.Expression circleBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleBlurTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleBlurTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColor(String circleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColor(com.mapbox.maps.extension.style.expressions.generated.Expression circleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColor(@ColorInt int circleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColorUseTheme(String circleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression circleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference circleElevationReference);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression circleElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleEmissiveStrength(double circleEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression circleEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleOpacity(double circleOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression circleOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circlePitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment circlePitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circlePitchAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression circlePitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circlePitchScale(com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale circlePitchScale);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circlePitchScale(com.mapbox.maps.extension.style.expressions.generated.Expression circlePitchScale);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleRadius(double circleRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleRadius(com.mapbox.maps.extension.style.expressions.generated.Expression circleRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleSortKey(double circleSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleSortKey(com.mapbox.maps.extension.style.expressions.generated.Expression circleSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColor(String circleStrokeColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColor(com.mapbox.maps.extension.style.expressions.generated.Expression circleStrokeColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColor(@ColorInt int circleStrokeColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColorUseTheme(String circleStrokeColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression circleStrokeColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeOpacity(double circleStrokeOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression circleStrokeOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeWidth(double circleStrokeWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeWidth(com.mapbox.maps.extension.style.expressions.generated.Expression circleStrokeWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslate(java.util.List<java.lang.Double> circleTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression circleTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor circleTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression circleTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public Double? getCircleBlur();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleBlurAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCircleBlurTransition();\n    method public String? getCircleColor();\n    method @ColorInt public Integer? getCircleColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCircleColorTransition();\n    method public String? getCircleColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleColorUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference? getCircleElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleElevationReferenceAsExpression();\n    method public Double? getCircleEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCircleEmissiveStrengthTransition();\n    method public Double? getCircleOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCircleOpacityTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment? getCirclePitchAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCirclePitchAlignmentAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale? getCirclePitchScale();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCirclePitchScaleAsExpression();\n    method public Double? getCircleRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCircleRadiusTransition();\n    method public Double? getCircleSortKey();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleSortKeyAsExpression();\n    method public String? getCircleStrokeColor();\n    method @ColorInt public Integer? getCircleStrokeColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleStrokeColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCircleStrokeColorTransition();\n    method public String? getCircleStrokeColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleStrokeColorUseThemeAsExpression();\n    method public Double? getCircleStrokeOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleStrokeOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCircleStrokeOpacityTransition();\n    method public Double? getCircleStrokeWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleStrokeWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCircleStrokeWidthTransition();\n    method public java.util.List<java.lang.Double>? getCircleTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor? getCircleTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCircleTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCircleTranslateTransition();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final Double? circleBlur;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleBlurAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? circleBlurTransition;\n    property public final String? circleColor;\n    property @ColorInt public final Integer? circleColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? circleColorTransition;\n    property public final String? circleColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleColorUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference? circleElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleElevationReferenceAsExpression;\n    property public final Double? circleEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? circleEmissiveStrengthTransition;\n    property public final Double? circleOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? circleOpacityTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment? circlePitchAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circlePitchAlignmentAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale? circlePitchScale;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circlePitchScaleAsExpression;\n    property public final Double? circleRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? circleRadiusTransition;\n    property public final Double? circleSortKey;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleSortKeyAsExpression;\n    property public final String? circleStrokeColor;\n    property @ColorInt public final Integer? circleStrokeColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleStrokeColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? circleStrokeColorTransition;\n    property public final String? circleStrokeColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleStrokeColorUseThemeAsExpression;\n    property public final Double? circleStrokeOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleStrokeOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? circleStrokeOpacityTransition;\n    property public final Double? circleStrokeWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleStrokeWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? circleStrokeWidthTransition;\n    property public final java.util.List<java.lang.Double>? circleTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor? circleTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? circleTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? circleTranslateTransition;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.CircleLayer.Companion Companion;\n  }\n\n  public static final class CircleLayer.Companion {\n    method public Double? getDefaultCircleBlur();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleBlurAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultCircleBlurTransition();\n    method public String? getDefaultCircleColor();\n    method @ColorInt public Integer? getDefaultCircleColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultCircleColorTransition();\n    method public String? getDefaultCircleColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleColorUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference? getDefaultCircleElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleElevationReferenceAsExpression();\n    method public Double? getDefaultCircleEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultCircleEmissiveStrengthTransition();\n    method public Double? getDefaultCircleOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultCircleOpacityTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment? getDefaultCirclePitchAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCirclePitchAlignmentAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale? getDefaultCirclePitchScale();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCirclePitchScaleAsExpression();\n    method public Double? getDefaultCircleRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultCircleRadiusTransition();\n    method public Double? getDefaultCircleSortKey();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleSortKeyAsExpression();\n    method public String? getDefaultCircleStrokeColor();\n    method @ColorInt public Integer? getDefaultCircleStrokeColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleStrokeColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultCircleStrokeColorTransition();\n    method public String? getDefaultCircleStrokeColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleStrokeColorUseThemeAsExpression();\n    method public Double? getDefaultCircleStrokeOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleStrokeOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultCircleStrokeOpacityTransition();\n    method public Double? getDefaultCircleStrokeWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleStrokeWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultCircleStrokeWidthTransition();\n    method public java.util.List<java.lang.Double>? getDefaultCircleTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor? getDefaultCircleTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultCircleTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultCircleTranslateTransition();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Double? defaultCircleBlur;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleBlurAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultCircleBlurTransition;\n    property public final String? defaultCircleColor;\n    property @ColorInt public final Integer? defaultCircleColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultCircleColorTransition;\n    property public final String? defaultCircleColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleColorUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference? defaultCircleElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleElevationReferenceAsExpression;\n    property public final Double? defaultCircleEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultCircleEmissiveStrengthTransition;\n    property public final Double? defaultCircleOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultCircleOpacityTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment? defaultCirclePitchAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCirclePitchAlignmentAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale? defaultCirclePitchScale;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCirclePitchScaleAsExpression;\n    property public final Double? defaultCircleRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultCircleRadiusTransition;\n    property public final Double? defaultCircleSortKey;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleSortKeyAsExpression;\n    property public final String? defaultCircleStrokeColor;\n    property @ColorInt public final Integer? defaultCircleStrokeColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleStrokeColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultCircleStrokeColorTransition;\n    property public final String? defaultCircleStrokeColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleStrokeColorUseThemeAsExpression;\n    property public final Double? defaultCircleStrokeOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleStrokeOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultCircleStrokeOpacityTransition;\n    property public final Double? defaultCircleStrokeWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleStrokeWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultCircleStrokeWidthTransition;\n    property public final java.util.List<java.lang.Double>? defaultCircleTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor? defaultCircleTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultCircleTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultCircleTranslateTransition;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface CircleLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleBlur(double circleBlur = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleBlur(com.mapbox.maps.extension.style.expressions.generated.Expression circleBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleBlurTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleBlurTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColor(String circleColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColor(com.mapbox.maps.extension.style.expressions.generated.Expression circleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColor(@ColorInt int circleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColorUseTheme(String circleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression circleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference circleElevationReference = com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference.NONE);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression circleElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleEmissiveStrength(double circleEmissiveStrength = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression circleEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleOpacity(double circleOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression circleOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circlePitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment circlePitchAlignment = com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment.VIEWPORT);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circlePitchAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression circlePitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circlePitchScale(com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale circlePitchScale = com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale.MAP);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circlePitchScale(com.mapbox.maps.extension.style.expressions.generated.Expression circlePitchScale);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleRadius(double circleRadius = 5.0);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleRadius(com.mapbox.maps.extension.style.expressions.generated.Expression circleRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleSortKey(double circleSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleSortKey(com.mapbox.maps.extension.style.expressions.generated.Expression circleSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColor(String circleStrokeColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColor(com.mapbox.maps.extension.style.expressions.generated.Expression circleStrokeColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColor(@ColorInt int circleStrokeColor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColorUseTheme(String circleStrokeColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression circleStrokeColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeOpacity(double circleStrokeOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression circleStrokeOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeWidth(double circleStrokeWidth = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeWidth(com.mapbox.maps.extension.style.expressions.generated.Expression circleStrokeWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleStrokeWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslate(java.util.List<java.lang.Double> circleTranslate = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression circleTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor circleTranslateAnchor = com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor.MAP);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression circleTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer circleTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.CircleLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class CircleLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.CircleLayer circleLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.CircleLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class ClipLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.ClipLayerDsl {\n    ctor public ClipLayer(String layerId, String sourceId);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer clipLayerScope(java.util.List<java.lang.String> clipLayerScope);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer clipLayerScope(com.mapbox.maps.extension.style.expressions.generated.Expression clipLayerScope);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer clipLayerTypes(java.util.List<java.lang.String> clipLayerTypes);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer clipLayerTypes(com.mapbox.maps.extension.style.expressions.generated.Expression clipLayerTypes);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public java.util.List<java.lang.String>? getClipLayerScope();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getClipLayerScopeAsExpression();\n    method public java.util.List<java.lang.String>? getClipLayerTypes();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getClipLayerTypesAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final java.util.List<java.lang.String>? clipLayerScope;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? clipLayerScopeAsExpression;\n    property public final java.util.List<java.lang.String>? clipLayerTypes;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? clipLayerTypesAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.ClipLayer.Companion Companion;\n  }\n\n  public static final class ClipLayer.Companion {\n    method public java.util.List<java.lang.String>? getDefaultClipLayerScope();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultClipLayerScopeAsExpression();\n    method public java.util.List<java.lang.String>? getDefaultClipLayerTypes();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultClipLayerTypesAsExpression();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final java.util.List<java.lang.String>? defaultClipLayerScope;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultClipLayerScopeAsExpression;\n    property public final java.util.List<java.lang.String>? defaultClipLayerTypes;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultClipLayerTypesAsExpression;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface ClipLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer clipLayerScope(java.util.List<java.lang.String> clipLayerScope = listOf(\"\"));\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer clipLayerScope(com.mapbox.maps.extension.style.expressions.generated.Expression clipLayerScope);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer clipLayerTypes(java.util.List<java.lang.String> clipLayerTypes = listOf());\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer clipLayerTypes(com.mapbox.maps.extension.style.expressions.generated.Expression clipLayerTypes);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.ClipLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class ClipLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.ClipLayer clipLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.ClipLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class FillExtrusionLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayerDsl {\n    ctor public FillExtrusionLayer(String layerId, String sourceId);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundAttenuation(double fillExtrusionAmbientOcclusionGroundAttenuation);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundAttenuation(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionGroundAttenuation);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundAttenuationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundAttenuationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundRadius(double fillExtrusionAmbientOcclusionGroundRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionGroundRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionIntensity(double fillExtrusionAmbientOcclusionIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionRadius(double fillExtrusionAmbientOcclusionRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionWallRadius(double fillExtrusionAmbientOcclusionWallRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionWallRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionWallRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionWallRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionWallRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBase(double fillExtrusionBase);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBase(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionBase);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBaseAlignment(com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment fillExtrusionBaseAlignment);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBaseAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionBaseAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBaseTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBaseTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionCastShadows(boolean fillExtrusionCastShadows);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionCastShadows(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionCastShadows);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColor(String fillExtrusionColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColor(@ColorInt int fillExtrusionColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColorUseTheme(String fillExtrusionColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionCutoffFadeRange(double fillExtrusionCutoffFadeRange);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionCutoffFadeRange(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionCutoffFadeRange);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEdgeRadius(double fillExtrusionEdgeRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEdgeRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionEdgeRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEmissiveStrength(double fillExtrusionEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColor(String fillExtrusionFloodLightColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColor(@ColorInt int fillExtrusionFloodLightColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColorUseTheme(String fillExtrusionFloodLightColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundAttenuation(double fillExtrusionFloodLightGroundAttenuation);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundAttenuation(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightGroundAttenuation);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundAttenuationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundAttenuationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundRadius(double fillExtrusionFloodLightGroundRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightGroundRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightIntensity(double fillExtrusionFloodLightIntensity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightIntensity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightWallRadius(double fillExtrusionFloodLightWallRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightWallRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightWallRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightWallRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightWallRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeight(double fillExtrusionHeight);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeight(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionHeight);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeightAlignment(com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment fillExtrusionHeightAlignment);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeightAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionHeightAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeightTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeightTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionLineWidth(double fillExtrusionLineWidth);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionLineWidth(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionLineWidth);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionLineWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionLineWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionOpacity(double fillExtrusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionPattern(String fillExtrusionPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionPattern(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionPatternCrossFade(double fillExtrusionPatternCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionPatternCrossFade(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionPatternCrossFade);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionRoundedRoof(boolean fillExtrusionRoundedRoof);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionRoundedRoof(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionRoundedRoof);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslate(java.util.List<java.lang.Double> fillExtrusionTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor fillExtrusionTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalGradient(boolean fillExtrusionVerticalGradient);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalGradient(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionVerticalGradient);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalScale(double fillExtrusionVerticalScale);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalScale(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionVerticalScale);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalScaleTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalScaleTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public Double? getFillExtrusionAmbientOcclusionGroundAttenuation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionAmbientOcclusionGroundAttenuationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionAmbientOcclusionGroundAttenuationTransition();\n    method public Double? getFillExtrusionAmbientOcclusionGroundRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionAmbientOcclusionGroundRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionAmbientOcclusionGroundRadiusTransition();\n    method public Double? getFillExtrusionAmbientOcclusionIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionAmbientOcclusionIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionAmbientOcclusionIntensityTransition();\n    method public Double? getFillExtrusionAmbientOcclusionRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionAmbientOcclusionRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionAmbientOcclusionRadiusTransition();\n    method public Double? getFillExtrusionAmbientOcclusionWallRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionAmbientOcclusionWallRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionAmbientOcclusionWallRadiusTransition();\n    method public Double? getFillExtrusionBase();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment? getFillExtrusionBaseAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionBaseAlignmentAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionBaseAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionBaseTransition();\n    method public Boolean? getFillExtrusionCastShadows();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionCastShadowsAsExpression();\n    method public String? getFillExtrusionColor();\n    method @ColorInt public Integer? getFillExtrusionColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionColorTransition();\n    method public String? getFillExtrusionColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionColorUseThemeAsExpression();\n    method public Double? getFillExtrusionCutoffFadeRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionCutoffFadeRangeAsExpression();\n    method public Double? getFillExtrusionEdgeRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionEdgeRadiusAsExpression();\n    method public Double? getFillExtrusionEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionEmissiveStrengthTransition();\n    method public String? getFillExtrusionFloodLightColor();\n    method @ColorInt public Integer? getFillExtrusionFloodLightColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionFloodLightColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionFloodLightColorTransition();\n    method public String? getFillExtrusionFloodLightColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionFloodLightColorUseThemeAsExpression();\n    method public Double? getFillExtrusionFloodLightGroundAttenuation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionFloodLightGroundAttenuationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionFloodLightGroundAttenuationTransition();\n    method public Double? getFillExtrusionFloodLightGroundRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionFloodLightGroundRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionFloodLightGroundRadiusTransition();\n    method public Double? getFillExtrusionFloodLightIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionFloodLightIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionFloodLightIntensityTransition();\n    method public Double? getFillExtrusionFloodLightWallRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionFloodLightWallRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionFloodLightWallRadiusTransition();\n    method public Double? getFillExtrusionHeight();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment? getFillExtrusionHeightAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionHeightAlignmentAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionHeightAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionHeightTransition();\n    method public Double? getFillExtrusionLineWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionLineWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionLineWidthTransition();\n    method public Double? getFillExtrusionOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionOpacityTransition();\n    method public String? getFillExtrusionPattern();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionPatternAsExpression();\n    method public Double? getFillExtrusionPatternCrossFade();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionPatternCrossFadeAsExpression();\n    method public Boolean? getFillExtrusionRoundedRoof();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionRoundedRoofAsExpression();\n    method public java.util.List<java.lang.Double>? getFillExtrusionTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor? getFillExtrusionTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionTranslateTransition();\n    method public Boolean? getFillExtrusionVerticalGradient();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionVerticalGradientAsExpression();\n    method public Double? getFillExtrusionVerticalScale();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillExtrusionVerticalScaleAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillExtrusionVerticalScaleTransition();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final Double? fillExtrusionAmbientOcclusionGroundAttenuation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionAmbientOcclusionGroundAttenuationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionAmbientOcclusionGroundAttenuationTransition;\n    property public final Double? fillExtrusionAmbientOcclusionGroundRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionAmbientOcclusionGroundRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionAmbientOcclusionGroundRadiusTransition;\n    property public final Double? fillExtrusionAmbientOcclusionIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionAmbientOcclusionIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionAmbientOcclusionIntensityTransition;\n    property public final Double? fillExtrusionAmbientOcclusionRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionAmbientOcclusionRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionAmbientOcclusionRadiusTransition;\n    property public final Double? fillExtrusionAmbientOcclusionWallRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionAmbientOcclusionWallRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionAmbientOcclusionWallRadiusTransition;\n    property public final Double? fillExtrusionBase;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment? fillExtrusionBaseAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionBaseAlignmentAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionBaseAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionBaseTransition;\n    property public final Boolean? fillExtrusionCastShadows;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionCastShadowsAsExpression;\n    property public final String? fillExtrusionColor;\n    property @ColorInt public final Integer? fillExtrusionColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionColorTransition;\n    property public final String? fillExtrusionColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionColorUseThemeAsExpression;\n    property public final Double? fillExtrusionCutoffFadeRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionCutoffFadeRangeAsExpression;\n    property public final Double? fillExtrusionEdgeRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionEdgeRadiusAsExpression;\n    property public final Double? fillExtrusionEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionEmissiveStrengthTransition;\n    property public final String? fillExtrusionFloodLightColor;\n    property @ColorInt public final Integer? fillExtrusionFloodLightColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionFloodLightColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionFloodLightColorTransition;\n    property public final String? fillExtrusionFloodLightColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionFloodLightColorUseThemeAsExpression;\n    property public final Double? fillExtrusionFloodLightGroundAttenuation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionFloodLightGroundAttenuationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionFloodLightGroundAttenuationTransition;\n    property public final Double? fillExtrusionFloodLightGroundRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionFloodLightGroundRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionFloodLightGroundRadiusTransition;\n    property public final Double? fillExtrusionFloodLightIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionFloodLightIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionFloodLightIntensityTransition;\n    property public final Double? fillExtrusionFloodLightWallRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionFloodLightWallRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionFloodLightWallRadiusTransition;\n    property public final Double? fillExtrusionHeight;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment? fillExtrusionHeightAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionHeightAlignmentAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionHeightAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionHeightTransition;\n    property public final Double? fillExtrusionLineWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionLineWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionLineWidthTransition;\n    property public final Double? fillExtrusionOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionOpacityTransition;\n    property public final String? fillExtrusionPattern;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionPatternAsExpression;\n    property public final Double? fillExtrusionPatternCrossFade;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionPatternCrossFadeAsExpression;\n    property public final Boolean? fillExtrusionRoundedRoof;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionRoundedRoofAsExpression;\n    property public final java.util.List<java.lang.Double>? fillExtrusionTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor? fillExtrusionTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionTranslateTransition;\n    property public final Boolean? fillExtrusionVerticalGradient;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionVerticalGradientAsExpression;\n    property public final Double? fillExtrusionVerticalScale;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillExtrusionVerticalScaleAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillExtrusionVerticalScaleTransition;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer.Companion Companion;\n  }\n\n  public static final class FillExtrusionLayer.Companion {\n    method public Double? getDefaultFillExtrusionAmbientOcclusionGroundAttenuation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionAmbientOcclusionGroundAttenuationTransition();\n    method public Double? getDefaultFillExtrusionAmbientOcclusionGroundRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionAmbientOcclusionGroundRadiusTransition();\n    method public Double? getDefaultFillExtrusionAmbientOcclusionIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionAmbientOcclusionIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionAmbientOcclusionIntensityTransition();\n    method public Double? getDefaultFillExtrusionAmbientOcclusionRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionAmbientOcclusionRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionAmbientOcclusionRadiusTransition();\n    method public Double? getDefaultFillExtrusionAmbientOcclusionWallRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionAmbientOcclusionWallRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionAmbientOcclusionWallRadiusTransition();\n    method public Double? getDefaultFillExtrusionBase();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment? getDefaultFillExtrusionBaseAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionBaseAlignmentAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionBaseAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionBaseTransition();\n    method public Boolean? getDefaultFillExtrusionCastShadows();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionCastShadowsAsExpression();\n    method public String? getDefaultFillExtrusionColor();\n    method @ColorInt public Integer? getDefaultFillExtrusionColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionColorTransition();\n    method public String? getDefaultFillExtrusionColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionColorUseThemeAsExpression();\n    method public Double? getDefaultFillExtrusionCutoffFadeRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionCutoffFadeRangeAsExpression();\n    method public Double? getDefaultFillExtrusionEdgeRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionEdgeRadiusAsExpression();\n    method public Double? getDefaultFillExtrusionEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionEmissiveStrengthTransition();\n    method public String? getDefaultFillExtrusionFloodLightColor();\n    method @ColorInt public Integer? getDefaultFillExtrusionFloodLightColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionFloodLightColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionFloodLightColorTransition();\n    method public String? getDefaultFillExtrusionFloodLightColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionFloodLightColorUseThemeAsExpression();\n    method public Double? getDefaultFillExtrusionFloodLightGroundAttenuation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionFloodLightGroundAttenuationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionFloodLightGroundAttenuationTransition();\n    method public Double? getDefaultFillExtrusionFloodLightGroundRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionFloodLightGroundRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionFloodLightGroundRadiusTransition();\n    method public Double? getDefaultFillExtrusionFloodLightIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionFloodLightIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionFloodLightIntensityTransition();\n    method public Double? getDefaultFillExtrusionFloodLightWallRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionFloodLightWallRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionFloodLightWallRadiusTransition();\n    method public Double? getDefaultFillExtrusionHeight();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment? getDefaultFillExtrusionHeightAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionHeightAlignmentAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionHeightAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionHeightTransition();\n    method public Double? getDefaultFillExtrusionLineWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionLineWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionLineWidthTransition();\n    method public Double? getDefaultFillExtrusionOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionOpacityTransition();\n    method public String? getDefaultFillExtrusionPattern();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionPatternAsExpression();\n    method public Double? getDefaultFillExtrusionPatternCrossFade();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionPatternCrossFadeAsExpression();\n    method public Boolean? getDefaultFillExtrusionRoundedRoof();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionRoundedRoofAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultFillExtrusionTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor? getDefaultFillExtrusionTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionTranslateTransition();\n    method public Boolean? getDefaultFillExtrusionVerticalGradient();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionVerticalGradientAsExpression();\n    method public Double? getDefaultFillExtrusionVerticalScale();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillExtrusionVerticalScaleAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillExtrusionVerticalScaleTransition();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Double? defaultFillExtrusionAmbientOcclusionGroundAttenuation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionAmbientOcclusionGroundAttenuationTransition;\n    property public final Double? defaultFillExtrusionAmbientOcclusionGroundRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionAmbientOcclusionGroundRadiusTransition;\n    property public final Double? defaultFillExtrusionAmbientOcclusionIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionAmbientOcclusionIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionAmbientOcclusionIntensityTransition;\n    property public final Double? defaultFillExtrusionAmbientOcclusionRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionAmbientOcclusionRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionAmbientOcclusionRadiusTransition;\n    property public final Double? defaultFillExtrusionAmbientOcclusionWallRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionAmbientOcclusionWallRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionAmbientOcclusionWallRadiusTransition;\n    property public final Double? defaultFillExtrusionBase;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment? defaultFillExtrusionBaseAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionBaseAlignmentAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionBaseAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionBaseTransition;\n    property public final Boolean? defaultFillExtrusionCastShadows;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionCastShadowsAsExpression;\n    property public final String? defaultFillExtrusionColor;\n    property @ColorInt public final Integer? defaultFillExtrusionColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionColorTransition;\n    property public final String? defaultFillExtrusionColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionColorUseThemeAsExpression;\n    property public final Double? defaultFillExtrusionCutoffFadeRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionCutoffFadeRangeAsExpression;\n    property public final Double? defaultFillExtrusionEdgeRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionEdgeRadiusAsExpression;\n    property public final Double? defaultFillExtrusionEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionEmissiveStrengthTransition;\n    property public final String? defaultFillExtrusionFloodLightColor;\n    property @ColorInt public final Integer? defaultFillExtrusionFloodLightColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionFloodLightColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionFloodLightColorTransition;\n    property public final String? defaultFillExtrusionFloodLightColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionFloodLightColorUseThemeAsExpression;\n    property public final Double? defaultFillExtrusionFloodLightGroundAttenuation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionFloodLightGroundAttenuationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionFloodLightGroundAttenuationTransition;\n    property public final Double? defaultFillExtrusionFloodLightGroundRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionFloodLightGroundRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionFloodLightGroundRadiusTransition;\n    property public final Double? defaultFillExtrusionFloodLightIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionFloodLightIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionFloodLightIntensityTransition;\n    property public final Double? defaultFillExtrusionFloodLightWallRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionFloodLightWallRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionFloodLightWallRadiusTransition;\n    property public final Double? defaultFillExtrusionHeight;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment? defaultFillExtrusionHeightAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionHeightAlignmentAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionHeightAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionHeightTransition;\n    property public final Double? defaultFillExtrusionLineWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionLineWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionLineWidthTransition;\n    property public final Double? defaultFillExtrusionOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionOpacityTransition;\n    property public final String? defaultFillExtrusionPattern;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionPatternAsExpression;\n    property public final Double? defaultFillExtrusionPatternCrossFade;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionPatternCrossFadeAsExpression;\n    property public final Boolean? defaultFillExtrusionRoundedRoof;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionRoundedRoofAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultFillExtrusionTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor? defaultFillExtrusionTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionTranslateTransition;\n    property public final Boolean? defaultFillExtrusionVerticalGradient;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionVerticalGradientAsExpression;\n    property public final Double? defaultFillExtrusionVerticalScale;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillExtrusionVerticalScaleAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillExtrusionVerticalScaleTransition;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface FillExtrusionLayerDsl {\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundAttenuation(double fillExtrusionAmbientOcclusionGroundAttenuation = 0.69);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundAttenuation(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionGroundAttenuation);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundAttenuationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundAttenuationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundRadius(double fillExtrusionAmbientOcclusionGroundRadius = 3.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionGroundRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionGroundRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionIntensity(double fillExtrusionAmbientOcclusionIntensity = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionRadius(double fillExtrusionAmbientOcclusionRadius = 3.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionWallRadius(double fillExtrusionAmbientOcclusionWallRadius = 3.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionWallRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionAmbientOcclusionWallRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionWallRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionAmbientOcclusionWallRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBase(double fillExtrusionBase = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBase(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionBase);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBaseAlignment(com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment fillExtrusionBaseAlignment = com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment.TERRAIN);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBaseAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionBaseAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBaseTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionBaseTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionCastShadows(boolean fillExtrusionCastShadows = true);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionCastShadows(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionCastShadows);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColor(String fillExtrusionColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColor(@ColorInt int fillExtrusionColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColorUseTheme(String fillExtrusionColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionCutoffFadeRange(double fillExtrusionCutoffFadeRange = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionCutoffFadeRange(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionCutoffFadeRange);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEdgeRadius(double fillExtrusionEdgeRadius = 0.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEdgeRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionEdgeRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEmissiveStrength(double fillExtrusionEmissiveStrength = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColor(String fillExtrusionFloodLightColor = \"#ffffff\");\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColor(@ColorInt int fillExtrusionFloodLightColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColorUseTheme(String fillExtrusionFloodLightColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundAttenuation(double fillExtrusionFloodLightGroundAttenuation = 0.69);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundAttenuation(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightGroundAttenuation);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundAttenuationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundAttenuationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundRadius(double fillExtrusionFloodLightGroundRadius = 0.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightGroundRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightGroundRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightIntensity(double fillExtrusionFloodLightIntensity = 0.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightIntensity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightWallRadius(double fillExtrusionFloodLightWallRadius = 0.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightWallRadius(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionFloodLightWallRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightWallRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionFloodLightWallRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeight(double fillExtrusionHeight = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeight(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionHeight);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeightAlignment(com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment fillExtrusionHeightAlignment = com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment.FLAT);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeightAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionHeightAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeightTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionHeightTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionLineWidth(double fillExtrusionLineWidth = 0.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionLineWidth(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionLineWidth);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionLineWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionLineWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionOpacity(double fillExtrusionOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionPattern(String fillExtrusionPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionPattern(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionPatternCrossFade(double fillExtrusionPatternCrossFade = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionPatternCrossFade(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionPatternCrossFade);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionRoundedRoof(boolean fillExtrusionRoundedRoof = true);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionRoundedRoof(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionRoundedRoof);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslate(java.util.List<java.lang.Double> fillExtrusionTranslate = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor fillExtrusionTranslateAnchor = com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor.MAP);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalGradient(boolean fillExtrusionVerticalGradient = true);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalGradient(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionVerticalGradient);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalScale(double fillExtrusionVerticalScale = 1.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalScale(com.mapbox.maps.extension.style.expressions.generated.Expression fillExtrusionVerticalScale);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalScaleTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionVerticalScaleTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class FillExtrusionLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayer fillExtrusionLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.FillExtrusionLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class FillLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.FillLayerDsl {\n    ctor public FillLayer(String layerId, String sourceId);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillAntialias(boolean fillAntialias);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillAntialias(com.mapbox.maps.extension.style.expressions.generated.Expression fillAntialias);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColor(String fillBridgeGuardRailColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillBridgeGuardRailColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColor(@ColorInt int fillBridgeGuardRailColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColorUseTheme(String fillBridgeGuardRailColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillBridgeGuardRailColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColor(String fillColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColor(@ColorInt int fillColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColorUseTheme(String fillColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillConstructBridgeGuardRail(boolean fillConstructBridgeGuardRail);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillConstructBridgeGuardRail(com.mapbox.maps.extension.style.expressions.generated.Expression fillConstructBridgeGuardRail);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference fillElevationReference);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression fillElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillEmissiveStrength(double fillEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression fillEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOpacity(double fillOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression fillOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColor(String fillOutlineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillOutlineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColor(@ColorInt int fillOutlineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColorUseTheme(String fillOutlineColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillOutlineColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillPattern(String fillPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillPattern(com.mapbox.maps.extension.style.expressions.generated.Expression fillPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillPatternCrossFade(double fillPatternCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillPatternCrossFade(com.mapbox.maps.extension.style.expressions.generated.Expression fillPatternCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillSortKey(double fillSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillSortKey(com.mapbox.maps.extension.style.expressions.generated.Expression fillSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslate(java.util.List<java.lang.Double> fillTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression fillTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor fillTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression fillTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColor(String fillTunnelStructureColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillTunnelStructureColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColor(@ColorInt int fillTunnelStructureColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColorUseTheme(String fillTunnelStructureColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillTunnelStructureColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillZOffset(double fillZOffset);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillZOffset(com.mapbox.maps.extension.style.expressions.generated.Expression fillZOffset);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillZOffsetTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillZOffsetTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public Boolean? getFillAntialias();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillAntialiasAsExpression();\n    method public String? getFillBridgeGuardRailColor();\n    method @ColorInt public Integer? getFillBridgeGuardRailColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillBridgeGuardRailColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillBridgeGuardRailColorTransition();\n    method public String? getFillBridgeGuardRailColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillBridgeGuardRailColorUseThemeAsExpression();\n    method public String? getFillColor();\n    method @ColorInt public Integer? getFillColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillColorTransition();\n    method public String? getFillColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillColorUseThemeAsExpression();\n    method public Boolean? getFillConstructBridgeGuardRail();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillConstructBridgeGuardRailAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference? getFillElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillElevationReferenceAsExpression();\n    method public Double? getFillEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillEmissiveStrengthTransition();\n    method public Double? getFillOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillOpacityTransition();\n    method public String? getFillOutlineColor();\n    method @ColorInt public Integer? getFillOutlineColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillOutlineColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillOutlineColorTransition();\n    method public String? getFillOutlineColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillOutlineColorUseThemeAsExpression();\n    method public String? getFillPattern();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillPatternAsExpression();\n    method public Double? getFillPatternCrossFade();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillPatternCrossFadeAsExpression();\n    method public Double? getFillSortKey();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillSortKeyAsExpression();\n    method public java.util.List<java.lang.Double>? getFillTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor? getFillTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillTranslateTransition();\n    method public String? getFillTunnelStructureColor();\n    method @ColorInt public Integer? getFillTunnelStructureColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillTunnelStructureColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillTunnelStructureColorTransition();\n    method public String? getFillTunnelStructureColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillTunnelStructureColorUseThemeAsExpression();\n    method public Double? getFillZOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFillZOffsetAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFillZOffsetTransition();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final Boolean? fillAntialias;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillAntialiasAsExpression;\n    property public final String? fillBridgeGuardRailColor;\n    property @ColorInt public final Integer? fillBridgeGuardRailColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillBridgeGuardRailColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillBridgeGuardRailColorTransition;\n    property public final String? fillBridgeGuardRailColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillBridgeGuardRailColorUseThemeAsExpression;\n    property public final String? fillColor;\n    property @ColorInt public final Integer? fillColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillColorTransition;\n    property public final String? fillColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillColorUseThemeAsExpression;\n    property public final Boolean? fillConstructBridgeGuardRail;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillConstructBridgeGuardRailAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference? fillElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillElevationReferenceAsExpression;\n    property public final Double? fillEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillEmissiveStrengthTransition;\n    property public final Double? fillOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillOpacityTransition;\n    property public final String? fillOutlineColor;\n    property @ColorInt public final Integer? fillOutlineColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillOutlineColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillOutlineColorTransition;\n    property public final String? fillOutlineColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillOutlineColorUseThemeAsExpression;\n    property public final String? fillPattern;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillPatternAsExpression;\n    property public final Double? fillPatternCrossFade;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillPatternCrossFadeAsExpression;\n    property public final Double? fillSortKey;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillSortKeyAsExpression;\n    property public final java.util.List<java.lang.Double>? fillTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor? fillTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillTranslateTransition;\n    property public final String? fillTunnelStructureColor;\n    property @ColorInt public final Integer? fillTunnelStructureColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillTunnelStructureColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillTunnelStructureColorTransition;\n    property public final String? fillTunnelStructureColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillTunnelStructureColorUseThemeAsExpression;\n    property public final Double? fillZOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? fillZOffsetAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? fillZOffsetTransition;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.FillLayer.Companion Companion;\n  }\n\n  public static final class FillLayer.Companion {\n    method public Boolean? getDefaultFillAntialias();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillAntialiasAsExpression();\n    method public String? getDefaultFillBridgeGuardRailColor();\n    method @ColorInt public Integer? getDefaultFillBridgeGuardRailColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillBridgeGuardRailColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillBridgeGuardRailColorTransition();\n    method public String? getDefaultFillBridgeGuardRailColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillBridgeGuardRailColorUseThemeAsExpression();\n    method public String? getDefaultFillColor();\n    method @ColorInt public Integer? getDefaultFillColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillColorTransition();\n    method public String? getDefaultFillColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillColorUseThemeAsExpression();\n    method public Boolean? getDefaultFillConstructBridgeGuardRail();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillConstructBridgeGuardRailAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference? getDefaultFillElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillElevationReferenceAsExpression();\n    method public Double? getDefaultFillEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillEmissiveStrengthTransition();\n    method public Double? getDefaultFillOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillOpacityTransition();\n    method public String? getDefaultFillOutlineColor();\n    method @ColorInt public Integer? getDefaultFillOutlineColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillOutlineColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillOutlineColorTransition();\n    method public String? getDefaultFillOutlineColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillOutlineColorUseThemeAsExpression();\n    method public String? getDefaultFillPattern();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillPatternAsExpression();\n    method public Double? getDefaultFillPatternCrossFade();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillPatternCrossFadeAsExpression();\n    method public Double? getDefaultFillSortKey();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillSortKeyAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultFillTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor? getDefaultFillTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillTranslateTransition();\n    method public String? getDefaultFillTunnelStructureColor();\n    method @ColorInt public Integer? getDefaultFillTunnelStructureColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillTunnelStructureColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillTunnelStructureColorTransition();\n    method public String? getDefaultFillTunnelStructureColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillTunnelStructureColorUseThemeAsExpression();\n    method public Double? getDefaultFillZOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultFillZOffsetAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultFillZOffsetTransition();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Boolean? defaultFillAntialias;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillAntialiasAsExpression;\n    property public final String? defaultFillBridgeGuardRailColor;\n    property @ColorInt public final Integer? defaultFillBridgeGuardRailColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillBridgeGuardRailColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillBridgeGuardRailColorTransition;\n    property public final String? defaultFillBridgeGuardRailColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillBridgeGuardRailColorUseThemeAsExpression;\n    property public final String? defaultFillColor;\n    property @ColorInt public final Integer? defaultFillColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillColorTransition;\n    property public final String? defaultFillColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillColorUseThemeAsExpression;\n    property public final Boolean? defaultFillConstructBridgeGuardRail;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillConstructBridgeGuardRailAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference? defaultFillElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillElevationReferenceAsExpression;\n    property public final Double? defaultFillEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillEmissiveStrengthTransition;\n    property public final Double? defaultFillOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillOpacityTransition;\n    property public final String? defaultFillOutlineColor;\n    property @ColorInt public final Integer? defaultFillOutlineColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillOutlineColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillOutlineColorTransition;\n    property public final String? defaultFillOutlineColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillOutlineColorUseThemeAsExpression;\n    property public final String? defaultFillPattern;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillPatternAsExpression;\n    property public final Double? defaultFillPatternCrossFade;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillPatternCrossFadeAsExpression;\n    property public final Double? defaultFillSortKey;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillSortKeyAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultFillTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor? defaultFillTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillTranslateTransition;\n    property public final String? defaultFillTunnelStructureColor;\n    property @ColorInt public final Integer? defaultFillTunnelStructureColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillTunnelStructureColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillTunnelStructureColorTransition;\n    property public final String? defaultFillTunnelStructureColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillTunnelStructureColorUseThemeAsExpression;\n    property public final Double? defaultFillZOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultFillZOffsetAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultFillZOffsetTransition;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface FillLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillAntialias(boolean fillAntialias = true);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillAntialias(com.mapbox.maps.extension.style.expressions.generated.Expression fillAntialias);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColor(String fillBridgeGuardRailColor = \"rgba(241, 236, 225, 255)\");\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillBridgeGuardRailColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColor(@ColorInt int fillBridgeGuardRailColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColorUseTheme(String fillBridgeGuardRailColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillBridgeGuardRailColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillBridgeGuardRailColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColor(String fillColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColor(@ColorInt int fillColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColorUseTheme(String fillColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillConstructBridgeGuardRail(boolean fillConstructBridgeGuardRail = true);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillConstructBridgeGuardRail(com.mapbox.maps.extension.style.expressions.generated.Expression fillConstructBridgeGuardRail);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference fillElevationReference = com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference.NONE);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression fillElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillEmissiveStrength(double fillEmissiveStrength = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression fillEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOpacity(double fillOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression fillOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColor(String fillOutlineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillOutlineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColor(@ColorInt int fillOutlineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColorUseTheme(String fillOutlineColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillOutlineColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillOutlineColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillPattern(String fillPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillPattern(com.mapbox.maps.extension.style.expressions.generated.Expression fillPattern);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillPatternCrossFade(double fillPatternCrossFade = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillPatternCrossFade(com.mapbox.maps.extension.style.expressions.generated.Expression fillPatternCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillSortKey(double fillSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillSortKey(com.mapbox.maps.extension.style.expressions.generated.Expression fillSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslate(java.util.List<java.lang.Double> fillTranslate = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression fillTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor fillTranslateAnchor = com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor.MAP);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression fillTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColor(String fillTunnelStructureColor = \"rgba(241, 236, 225, 255)\");\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColor(com.mapbox.maps.extension.style.expressions.generated.Expression fillTunnelStructureColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColor(@ColorInt int fillTunnelStructureColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColorUseTheme(String fillTunnelStructureColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillTunnelStructureColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression fillTunnelStructureColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillZOffset(double fillZOffset = 0.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillZOffset(com.mapbox.maps.extension.style.expressions.generated.Expression fillZOffset);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillZOffsetTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.FillLayer fillZOffsetTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.FillLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class FillLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.FillLayer fillLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.FillLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class HeatmapLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.HeatmapLayerDsl {\n    ctor public HeatmapLayer(String layerId, String sourceId);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHeatmapColor();\n    method public String? getHeatmapColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHeatmapColorUseThemeAsExpression();\n    method public Double? getHeatmapIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHeatmapIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHeatmapIntensityTransition();\n    method public Double? getHeatmapOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHeatmapOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHeatmapOpacityTransition();\n    method public Double? getHeatmapRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHeatmapRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHeatmapRadiusTransition();\n    method public Double? getHeatmapWeight();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHeatmapWeightAsExpression();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapColor(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapColorUseTheme(String heatmapColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapIntensity(double heatmapIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapOpacity(double heatmapOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapRadius(double heatmapRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapRadius(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapWeight(double heatmapWeight);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapWeight(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapWeight);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? heatmapColor;\n    property public final String? heatmapColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? heatmapColorUseThemeAsExpression;\n    property public final Double? heatmapIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? heatmapIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? heatmapIntensityTransition;\n    property public final Double? heatmapOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? heatmapOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? heatmapOpacityTransition;\n    property public final Double? heatmapRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? heatmapRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? heatmapRadiusTransition;\n    property public final Double? heatmapWeight;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? heatmapWeightAsExpression;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.HeatmapLayer.Companion Companion;\n  }\n\n  public static final class HeatmapLayer.Companion {\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHeatmapColor();\n    method public String? getDefaultHeatmapColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHeatmapColorUseThemeAsExpression();\n    method public Double? getDefaultHeatmapIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHeatmapIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultHeatmapIntensityTransition();\n    method public Double? getDefaultHeatmapOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHeatmapOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultHeatmapOpacityTransition();\n    method public Double? getDefaultHeatmapRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHeatmapRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultHeatmapRadiusTransition();\n    method public Double? getDefaultHeatmapWeight();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHeatmapWeightAsExpression();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHeatmapColor;\n    property public final String? defaultHeatmapColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHeatmapColorUseThemeAsExpression;\n    property public final Double? defaultHeatmapIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHeatmapIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultHeatmapIntensityTransition;\n    property public final Double? defaultHeatmapOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHeatmapOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultHeatmapOpacityTransition;\n    property public final Double? defaultHeatmapRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHeatmapRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultHeatmapRadiusTransition;\n    property public final Double? defaultHeatmapWeight;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHeatmapWeightAsExpression;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface HeatmapLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapColor(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapColorUseTheme(String heatmapColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapIntensity(double heatmapIntensity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapOpacity(double heatmapOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapRadius(double heatmapRadius = 30.0);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapRadius(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapWeight(double heatmapWeight = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapWeight(com.mapbox.maps.extension.style.expressions.generated.Expression heatmapWeight);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.HeatmapLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class HeatmapLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.HeatmapLayer heatmapLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.HeatmapLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class HillshadeLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.HillshadeLayerDsl {\n    ctor public HillshadeLayer(String layerId, String sourceId);\n    method public String? getHillshadeAccentColor();\n    method @ColorInt public Integer? getHillshadeAccentColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeAccentColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHillshadeAccentColorTransition();\n    method public String? getHillshadeAccentColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeAccentColorUseThemeAsExpression();\n    method public Double? getHillshadeEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHillshadeEmissiveStrengthTransition();\n    method public Double? getHillshadeExaggeration();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeExaggerationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHillshadeExaggerationTransition();\n    method public String? getHillshadeHighlightColor();\n    method @ColorInt public Integer? getHillshadeHighlightColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeHighlightColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHillshadeHighlightColorTransition();\n    method public String? getHillshadeHighlightColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeHighlightColorUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor? getHillshadeIlluminationAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeIlluminationAnchorAsExpression();\n    method public Double? getHillshadeIlluminationDirection();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeIlluminationDirectionAsExpression();\n    method public String? getHillshadeShadowColor();\n    method @ColorInt public Integer? getHillshadeShadowColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeShadowColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getHillshadeShadowColorTransition();\n    method public String? getHillshadeShadowColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getHillshadeShadowColorUseThemeAsExpression();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColor(String hillshadeAccentColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColor(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeAccentColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColor(@ColorInt int hillshadeAccentColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColorUseTheme(String hillshadeAccentColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeAccentColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeEmissiveStrength(double hillshadeEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeExaggeration(double hillshadeExaggeration);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeExaggeration(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeExaggeration);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeExaggerationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeExaggerationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColor(String hillshadeHighlightColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColor(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeHighlightColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColor(@ColorInt int hillshadeHighlightColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColorUseTheme(String hillshadeHighlightColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeHighlightColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeIlluminationAnchor(com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor hillshadeIlluminationAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeIlluminationAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeIlluminationAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeIlluminationDirection(double hillshadeIlluminationDirection);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeIlluminationDirection(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeIlluminationDirection);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColor(String hillshadeShadowColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColor(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeShadowColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColor(@ColorInt int hillshadeShadowColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColorUseTheme(String hillshadeShadowColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeShadowColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final String? hillshadeAccentColor;\n    property @ColorInt public final Integer? hillshadeAccentColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeAccentColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? hillshadeAccentColorTransition;\n    property public final String? hillshadeAccentColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeAccentColorUseThemeAsExpression;\n    property public final Double? hillshadeEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? hillshadeEmissiveStrengthTransition;\n    property public final Double? hillshadeExaggeration;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeExaggerationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? hillshadeExaggerationTransition;\n    property public final String? hillshadeHighlightColor;\n    property @ColorInt public final Integer? hillshadeHighlightColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeHighlightColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? hillshadeHighlightColorTransition;\n    property public final String? hillshadeHighlightColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeHighlightColorUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor? hillshadeIlluminationAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeIlluminationAnchorAsExpression;\n    property public final Double? hillshadeIlluminationDirection;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeIlluminationDirectionAsExpression;\n    property public final String? hillshadeShadowColor;\n    property @ColorInt public final Integer? hillshadeShadowColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeShadowColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? hillshadeShadowColorTransition;\n    property public final String? hillshadeShadowColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? hillshadeShadowColorUseThemeAsExpression;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.HillshadeLayer.Companion Companion;\n  }\n\n  public static final class HillshadeLayer.Companion {\n    method public String? getDefaultHillshadeAccentColor();\n    method @ColorInt public Integer? getDefaultHillshadeAccentColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeAccentColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultHillshadeAccentColorTransition();\n    method public String? getDefaultHillshadeAccentColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeAccentColorUseThemeAsExpression();\n    method public Double? getDefaultHillshadeEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultHillshadeEmissiveStrengthTransition();\n    method public Double? getDefaultHillshadeExaggeration();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeExaggerationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultHillshadeExaggerationTransition();\n    method public String? getDefaultHillshadeHighlightColor();\n    method @ColorInt public Integer? getDefaultHillshadeHighlightColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeHighlightColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultHillshadeHighlightColorTransition();\n    method public String? getDefaultHillshadeHighlightColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeHighlightColorUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor? getDefaultHillshadeIlluminationAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeIlluminationAnchorAsExpression();\n    method public Double? getDefaultHillshadeIlluminationDirection();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeIlluminationDirectionAsExpression();\n    method public String? getDefaultHillshadeShadowColor();\n    method @ColorInt public Integer? getDefaultHillshadeShadowColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeShadowColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultHillshadeShadowColorTransition();\n    method public String? getDefaultHillshadeShadowColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultHillshadeShadowColorUseThemeAsExpression();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final String? defaultHillshadeAccentColor;\n    property @ColorInt public final Integer? defaultHillshadeAccentColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeAccentColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultHillshadeAccentColorTransition;\n    property public final String? defaultHillshadeAccentColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeAccentColorUseThemeAsExpression;\n    property public final Double? defaultHillshadeEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultHillshadeEmissiveStrengthTransition;\n    property public final Double? defaultHillshadeExaggeration;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeExaggerationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultHillshadeExaggerationTransition;\n    property public final String? defaultHillshadeHighlightColor;\n    property @ColorInt public final Integer? defaultHillshadeHighlightColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeHighlightColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultHillshadeHighlightColorTransition;\n    property public final String? defaultHillshadeHighlightColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeHighlightColorUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor? defaultHillshadeIlluminationAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeIlluminationAnchorAsExpression;\n    property public final Double? defaultHillshadeIlluminationDirection;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeIlluminationDirectionAsExpression;\n    property public final String? defaultHillshadeShadowColor;\n    property @ColorInt public final Integer? defaultHillshadeShadowColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeShadowColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultHillshadeShadowColorTransition;\n    property public final String? defaultHillshadeShadowColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultHillshadeShadowColorUseThemeAsExpression;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface HillshadeLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColor(String hillshadeAccentColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColor(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeAccentColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColor(@ColorInt int hillshadeAccentColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColorUseTheme(String hillshadeAccentColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeAccentColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeAccentColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeEmissiveStrength(double hillshadeEmissiveStrength = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeExaggeration(double hillshadeExaggeration = 0.5);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeExaggeration(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeExaggeration);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeExaggerationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeExaggerationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColor(String hillshadeHighlightColor = \"#FFFFFF\");\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColor(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeHighlightColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColor(@ColorInt int hillshadeHighlightColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColorUseTheme(String hillshadeHighlightColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeHighlightColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeHighlightColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeIlluminationAnchor(com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor hillshadeIlluminationAnchor = com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor.VIEWPORT);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeIlluminationAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeIlluminationAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeIlluminationDirection(double hillshadeIlluminationDirection = 335.0);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeIlluminationDirection(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeIlluminationDirection);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColor(String hillshadeShadowColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColor(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeShadowColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColor(@ColorInt int hillshadeShadowColor);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColorUseTheme(String hillshadeShadowColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeShadowColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression hillshadeShadowColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.HillshadeLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class HillshadeLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.HillshadeLayer hillshadeLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.HillshadeLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class LineLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.LineLayerDsl {\n    ctor public LineLayer(String layerId, String sourceId);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public String getLayerId();\n    method public Double? getLineBlur();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineBlurAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineBlurTransition();\n    method public String? getLineBorderColor();\n    method @ColorInt public Integer? getLineBorderColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineBorderColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineBorderColorTransition();\n    method public String? getLineBorderColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineBorderColorUseThemeAsExpression();\n    method public Double? getLineBorderWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineBorderWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineBorderWidthTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineCap? getLineCap();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineCapAsExpression();\n    method public String? getLineColor();\n    method @ColorInt public Integer? getLineColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineColorTransition();\n    method public String? getLineColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineColorUseThemeAsExpression();\n    method public Double? getLineCrossSlope();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineCrossSlopeAsExpression();\n    method public Double? getLineCutoutFadeWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineCutoutFadeWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineCutoutFadeWidthTransition();\n    method public Double? getLineCutoutOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineCutoutOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineCutoutOpacityTransition();\n    method public java.util.List<java.lang.Double>? getLineDasharray();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineDasharrayAsExpression();\n    method public Double? getLineDepthOcclusionFactor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineDepthOcclusionFactorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineDepthOcclusionFactorTransition();\n    method public Double? getLineElevationGroundScale();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineElevationGroundScaleAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineElevationGroundScaleTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference? getLineElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineElevationReferenceAsExpression();\n    method public Double? getLineEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineEmissiveStrengthTransition();\n    method public Double? getLineGapWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineGapWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineGapWidthTransition();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineGradient();\n    method public String? getLineGradientUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineGradientUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? getLineJoin();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineJoinAsExpression();\n    method public Double? getLineMiterLimit();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineMiterLimitAsExpression();\n    method public Double? getLineOcclusionOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineOcclusionOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineOcclusionOpacityTransition();\n    method public Double? getLineOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineOffsetAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineOffsetTransition();\n    method public Double? getLineOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineOpacityTransition();\n    method public String? getLinePattern();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLinePatternAsExpression();\n    method public Double? getLinePatternCrossFade();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLinePatternCrossFadeAsExpression();\n    method public Double? getLineRoundLimit();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineRoundLimitAsExpression();\n    method public Double? getLineSortKey();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineSortKeyAsExpression();\n    method public java.util.List<java.lang.Double>? getLineTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor? getLineTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineTranslateTransition();\n    method public String? getLineTrimColor();\n    method @ColorInt public Integer? getLineTrimColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineTrimColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineTrimColorTransition();\n    method public String? getLineTrimColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineTrimColorUseThemeAsExpression();\n    method public java.util.List<java.lang.Double>? getLineTrimFadeRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineTrimFadeRangeAsExpression();\n    method public java.util.List<java.lang.Double>? getLineTrimOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineTrimOffsetAsExpression();\n    method public Double? getLineWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLineWidthTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit? getLineWidthUnit();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineWidthUnitAsExpression();\n    method public Double? getLineZOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLineZOffsetAsExpression();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBlur(double lineBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBlur(com.mapbox.maps.extension.style.expressions.generated.Expression lineBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBlurTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBlurTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColor(String lineBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColor(com.mapbox.maps.extension.style.expressions.generated.Expression lineBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColor(@ColorInt int lineBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColorUseTheme(String lineBorderColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression lineBorderColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderWidth(double lineBorderWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderWidth(com.mapbox.maps.extension.style.expressions.generated.Expression lineBorderWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCap(com.mapbox.maps.extension.style.layers.properties.generated.LineCap lineCap);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCap(com.mapbox.maps.extension.style.expressions.generated.Expression lineCap);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColor(String lineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColor(com.mapbox.maps.extension.style.expressions.generated.Expression lineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColor(@ColorInt int lineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColorUseTheme(String lineColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression lineColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCrossSlope(double lineCrossSlope);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCrossSlope(com.mapbox.maps.extension.style.expressions.generated.Expression lineCrossSlope);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutFadeWidth(double lineCutoutFadeWidth);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutFadeWidth(com.mapbox.maps.extension.style.expressions.generated.Expression lineCutoutFadeWidth);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutFadeWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutFadeWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutOpacity(double lineCutoutOpacity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression lineCutoutOpacity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDasharray(java.util.List<java.lang.Double> lineDasharray);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDasharray(com.mapbox.maps.extension.style.expressions.generated.Expression lineDasharray);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDepthOcclusionFactor(double lineDepthOcclusionFactor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDepthOcclusionFactor(com.mapbox.maps.extension.style.expressions.generated.Expression lineDepthOcclusionFactor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDepthOcclusionFactorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDepthOcclusionFactorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationGroundScale(double lineElevationGroundScale);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationGroundScale(com.mapbox.maps.extension.style.expressions.generated.Expression lineElevationGroundScale);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationGroundScaleTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationGroundScaleTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference lineElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression lineElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineEmissiveStrength(double lineEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression lineEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGapWidth(double lineGapWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGapWidth(com.mapbox.maps.extension.style.expressions.generated.Expression lineGapWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGapWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGapWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGradient(com.mapbox.maps.extension.style.expressions.generated.Expression lineGradient);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGradientUseTheme(String lineGradientUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGradientUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression lineGradientUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineJoin(com.mapbox.maps.extension.style.layers.properties.generated.LineJoin lineJoin);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineJoin(com.mapbox.maps.extension.style.expressions.generated.Expression lineJoin);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineMiterLimit(double lineMiterLimit);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineMiterLimit(com.mapbox.maps.extension.style.expressions.generated.Expression lineMiterLimit);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOcclusionOpacity(double lineOcclusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOcclusionOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression lineOcclusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOcclusionOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOcclusionOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOffset(double lineOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOffset(com.mapbox.maps.extension.style.expressions.generated.Expression lineOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOffsetTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOffsetTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOpacity(double lineOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression lineOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer linePattern(String linePattern);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer linePattern(com.mapbox.maps.extension.style.expressions.generated.Expression linePattern);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer linePatternCrossFade(double linePatternCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer linePatternCrossFade(com.mapbox.maps.extension.style.expressions.generated.Expression linePatternCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineRoundLimit(double lineRoundLimit);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineRoundLimit(com.mapbox.maps.extension.style.expressions.generated.Expression lineRoundLimit);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineSortKey(double lineSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineSortKey(com.mapbox.maps.extension.style.expressions.generated.Expression lineSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslate(java.util.List<java.lang.Double> lineTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression lineTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor lineTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression lineTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColor(String lineTrimColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColor(com.mapbox.maps.extension.style.expressions.generated.Expression lineTrimColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColor(@ColorInt int lineTrimColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColorUseTheme(String lineTrimColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression lineTrimColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimFadeRange(java.util.List<java.lang.Double> lineTrimFadeRange);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimFadeRange(com.mapbox.maps.extension.style.expressions.generated.Expression lineTrimFadeRange);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimOffset(java.util.List<java.lang.Double> lineTrimOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimOffset(com.mapbox.maps.extension.style.expressions.generated.Expression lineTrimOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidth(double lineWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidth(com.mapbox.maps.extension.style.expressions.generated.Expression lineWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidthUnit(com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit lineWidthUnit);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidthUnit(com.mapbox.maps.extension.style.expressions.generated.Expression lineWidthUnit);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineZOffset(double lineZOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineZOffset(com.mapbox.maps.extension.style.expressions.generated.Expression lineZOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public String layerId;\n    property public final Double? lineBlur;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineBlurAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineBlurTransition;\n    property public final String? lineBorderColor;\n    property @ColorInt public final Integer? lineBorderColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineBorderColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineBorderColorTransition;\n    property public final String? lineBorderColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineBorderColorUseThemeAsExpression;\n    property public final Double? lineBorderWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineBorderWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineBorderWidthTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineCap? lineCap;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineCapAsExpression;\n    property public final String? lineColor;\n    property @ColorInt public final Integer? lineColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineColorTransition;\n    property public final String? lineColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineColorUseThemeAsExpression;\n    property public final Double? lineCrossSlope;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineCrossSlopeAsExpression;\n    property public final Double? lineCutoutFadeWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineCutoutFadeWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineCutoutFadeWidthTransition;\n    property public final Double? lineCutoutOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineCutoutOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineCutoutOpacityTransition;\n    property public final java.util.List<java.lang.Double>? lineDasharray;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineDasharrayAsExpression;\n    property public final Double? lineDepthOcclusionFactor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineDepthOcclusionFactorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineDepthOcclusionFactorTransition;\n    property public final Double? lineElevationGroundScale;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineElevationGroundScaleAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineElevationGroundScaleTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference? lineElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineElevationReferenceAsExpression;\n    property public final Double? lineEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineEmissiveStrengthTransition;\n    property public final Double? lineGapWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineGapWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineGapWidthTransition;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineGradient;\n    property public final String? lineGradientUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineGradientUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? lineJoin;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineJoinAsExpression;\n    property public final Double? lineMiterLimit;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineMiterLimitAsExpression;\n    property public final Double? lineOcclusionOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineOcclusionOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineOcclusionOpacityTransition;\n    property public final Double? lineOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineOffsetAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineOffsetTransition;\n    property public final Double? lineOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineOpacityTransition;\n    property public final String? linePattern;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? linePatternAsExpression;\n    property public final Double? linePatternCrossFade;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? linePatternCrossFadeAsExpression;\n    property public final Double? lineRoundLimit;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineRoundLimitAsExpression;\n    property public final Double? lineSortKey;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineSortKeyAsExpression;\n    property public final java.util.List<java.lang.Double>? lineTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor? lineTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineTranslateTransition;\n    property public final String? lineTrimColor;\n    property @ColorInt public final Integer? lineTrimColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineTrimColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineTrimColorTransition;\n    property public final String? lineTrimColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineTrimColorUseThemeAsExpression;\n    property public final java.util.List<java.lang.Double>? lineTrimFadeRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineTrimFadeRangeAsExpression;\n    property public final java.util.List<java.lang.Double>? lineTrimOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineTrimOffsetAsExpression;\n    property public final Double? lineWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? lineWidthTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit? lineWidthUnit;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineWidthUnitAsExpression;\n    property public final Double? lineZOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? lineZOffsetAsExpression;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.LineLayer.Companion Companion;\n  }\n\n  public static final class LineLayer.Companion {\n    method public Double? getDefaultLineBlur();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineBlurAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineBlurTransition();\n    method public String? getDefaultLineBorderColor();\n    method @ColorInt public Integer? getDefaultLineBorderColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineBorderColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineBorderColorTransition();\n    method public String? getDefaultLineBorderColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineBorderColorUseThemeAsExpression();\n    method public Double? getDefaultLineBorderWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineBorderWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineBorderWidthTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineCap? getDefaultLineCap();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineCapAsExpression();\n    method public String? getDefaultLineColor();\n    method @ColorInt public Integer? getDefaultLineColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineColorTransition();\n    method public String? getDefaultLineColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineColorUseThemeAsExpression();\n    method public Double? getDefaultLineCrossSlope();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineCrossSlopeAsExpression();\n    method public Double? getDefaultLineCutoutFadeWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineCutoutFadeWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineCutoutFadeWidthTransition();\n    method public Double? getDefaultLineCutoutOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineCutoutOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineCutoutOpacityTransition();\n    method public java.util.List<java.lang.Double>? getDefaultLineDasharray();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineDasharrayAsExpression();\n    method public Double? getDefaultLineDepthOcclusionFactor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineDepthOcclusionFactorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineDepthOcclusionFactorTransition();\n    method public Double? getDefaultLineElevationGroundScale();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineElevationGroundScaleAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineElevationGroundScaleTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference? getDefaultLineElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineElevationReferenceAsExpression();\n    method public Double? getDefaultLineEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineEmissiveStrengthTransition();\n    method public Double? getDefaultLineGapWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineGapWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineGapWidthTransition();\n    method public String? getDefaultLineGradientUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineGradientUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? getDefaultLineJoin();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineJoinAsExpression();\n    method public Double? getDefaultLineMiterLimit();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineMiterLimitAsExpression();\n    method public Double? getDefaultLineOcclusionOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineOcclusionOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineOcclusionOpacityTransition();\n    method public Double? getDefaultLineOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineOffsetAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineOffsetTransition();\n    method public Double? getDefaultLineOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineOpacityTransition();\n    method public String? getDefaultLinePattern();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLinePatternAsExpression();\n    method public Double? getDefaultLinePatternCrossFade();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLinePatternCrossFadeAsExpression();\n    method public Double? getDefaultLineRoundLimit();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineRoundLimitAsExpression();\n    method public Double? getDefaultLineSortKey();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineSortKeyAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultLineTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor? getDefaultLineTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineTranslateTransition();\n    method public String? getDefaultLineTrimColor();\n    method @ColorInt public Integer? getDefaultLineTrimColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineTrimColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineTrimColorTransition();\n    method public String? getDefaultLineTrimColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineTrimColorUseThemeAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultLineTrimFadeRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineTrimFadeRangeAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultLineTrimOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineTrimOffsetAsExpression();\n    method public Double? getDefaultLineWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLineWidthTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit? getDefaultLineWidthUnit();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineWidthUnitAsExpression();\n    method public Double? getDefaultLineZOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLineZOffsetAsExpression();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Double? defaultLineBlur;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineBlurAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineBlurTransition;\n    property public final String? defaultLineBorderColor;\n    property @ColorInt public final Integer? defaultLineBorderColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineBorderColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineBorderColorTransition;\n    property public final String? defaultLineBorderColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineBorderColorUseThemeAsExpression;\n    property public final Double? defaultLineBorderWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineBorderWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineBorderWidthTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineCap? defaultLineCap;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineCapAsExpression;\n    property public final String? defaultLineColor;\n    property @ColorInt public final Integer? defaultLineColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineColorTransition;\n    property public final String? defaultLineColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineColorUseThemeAsExpression;\n    property public final Double? defaultLineCrossSlope;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineCrossSlopeAsExpression;\n    property public final Double? defaultLineCutoutFadeWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineCutoutFadeWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineCutoutFadeWidthTransition;\n    property public final Double? defaultLineCutoutOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineCutoutOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineCutoutOpacityTransition;\n    property public final java.util.List<java.lang.Double>? defaultLineDasharray;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineDasharrayAsExpression;\n    property public final Double? defaultLineDepthOcclusionFactor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineDepthOcclusionFactorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineDepthOcclusionFactorTransition;\n    property public final Double? defaultLineElevationGroundScale;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineElevationGroundScaleAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineElevationGroundScaleTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference? defaultLineElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineElevationReferenceAsExpression;\n    property public final Double? defaultLineEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineEmissiveStrengthTransition;\n    property public final Double? defaultLineGapWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineGapWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineGapWidthTransition;\n    property public final String? defaultLineGradientUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineGradientUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? defaultLineJoin;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineJoinAsExpression;\n    property public final Double? defaultLineMiterLimit;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineMiterLimitAsExpression;\n    property public final Double? defaultLineOcclusionOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineOcclusionOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineOcclusionOpacityTransition;\n    property public final Double? defaultLineOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineOffsetAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineOffsetTransition;\n    property public final Double? defaultLineOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineOpacityTransition;\n    property public final String? defaultLinePattern;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLinePatternAsExpression;\n    property public final Double? defaultLinePatternCrossFade;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLinePatternCrossFadeAsExpression;\n    property public final Double? defaultLineRoundLimit;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineRoundLimitAsExpression;\n    property public final Double? defaultLineSortKey;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineSortKeyAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultLineTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor? defaultLineTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineTranslateTransition;\n    property public final String? defaultLineTrimColor;\n    property @ColorInt public final Integer? defaultLineTrimColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineTrimColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineTrimColorTransition;\n    property public final String? defaultLineTrimColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineTrimColorUseThemeAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultLineTrimFadeRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineTrimFadeRangeAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultLineTrimOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineTrimOffsetAsExpression;\n    property public final Double? defaultLineWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLineWidthTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit? defaultLineWidthUnit;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineWidthUnitAsExpression;\n    property public final Double? defaultLineZOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLineZOffsetAsExpression;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface LineLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBlur(double lineBlur = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBlur(com.mapbox.maps.extension.style.expressions.generated.Expression lineBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBlurTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBlurTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColor(String lineBorderColor = \"rgba(0, 0, 0, 0)\");\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColor(com.mapbox.maps.extension.style.expressions.generated.Expression lineBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColor(@ColorInt int lineBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColorUseTheme(String lineBorderColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression lineBorderColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderWidth(double lineBorderWidth = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderWidth(com.mapbox.maps.extension.style.expressions.generated.Expression lineBorderWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineBorderWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCap(com.mapbox.maps.extension.style.layers.properties.generated.LineCap lineCap = com.mapbox.maps.extension.style.layers.properties.generated.LineCap.BUTT);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCap(com.mapbox.maps.extension.style.expressions.generated.Expression lineCap);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColor(String lineColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColor(com.mapbox.maps.extension.style.expressions.generated.Expression lineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColor(@ColorInt int lineColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColorUseTheme(String lineColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression lineColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCrossSlope(double lineCrossSlope);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCrossSlope(com.mapbox.maps.extension.style.expressions.generated.Expression lineCrossSlope);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutFadeWidth(double lineCutoutFadeWidth = 0.4);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutFadeWidth(com.mapbox.maps.extension.style.expressions.generated.Expression lineCutoutFadeWidth);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutFadeWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutFadeWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutOpacity(double lineCutoutOpacity = 1.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression lineCutoutOpacity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineCutoutOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDasharray(java.util.List<java.lang.Double> lineDasharray);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDasharray(com.mapbox.maps.extension.style.expressions.generated.Expression lineDasharray);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDepthOcclusionFactor(double lineDepthOcclusionFactor = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDepthOcclusionFactor(com.mapbox.maps.extension.style.expressions.generated.Expression lineDepthOcclusionFactor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDepthOcclusionFactorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineDepthOcclusionFactorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationGroundScale(double lineElevationGroundScale = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationGroundScale(com.mapbox.maps.extension.style.expressions.generated.Expression lineElevationGroundScale);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationGroundScaleTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationGroundScaleTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference lineElevationReference = com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference.NONE);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression lineElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineEmissiveStrength(double lineEmissiveStrength = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression lineEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGapWidth(double lineGapWidth = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGapWidth(com.mapbox.maps.extension.style.expressions.generated.Expression lineGapWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGapWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGapWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGradient(com.mapbox.maps.extension.style.expressions.generated.Expression lineGradient);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGradientUseTheme(String lineGradientUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineGradientUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression lineGradientUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineJoin(com.mapbox.maps.extension.style.layers.properties.generated.LineJoin lineJoin = com.mapbox.maps.extension.style.layers.properties.generated.LineJoin.MITER);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineJoin(com.mapbox.maps.extension.style.expressions.generated.Expression lineJoin);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineMiterLimit(double lineMiterLimit = 2.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineMiterLimit(com.mapbox.maps.extension.style.expressions.generated.Expression lineMiterLimit);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOcclusionOpacity(double lineOcclusionOpacity = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOcclusionOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression lineOcclusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOcclusionOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOcclusionOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOffset(double lineOffset = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOffset(com.mapbox.maps.extension.style.expressions.generated.Expression lineOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOffsetTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOffsetTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOpacity(double lineOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression lineOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer linePattern(String linePattern);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer linePattern(com.mapbox.maps.extension.style.expressions.generated.Expression linePattern);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer linePatternCrossFade(double linePatternCrossFade = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer linePatternCrossFade(com.mapbox.maps.extension.style.expressions.generated.Expression linePatternCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineRoundLimit(double lineRoundLimit = 1.05);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineRoundLimit(com.mapbox.maps.extension.style.expressions.generated.Expression lineRoundLimit);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineSortKey(double lineSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineSortKey(com.mapbox.maps.extension.style.expressions.generated.Expression lineSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslate(java.util.List<java.lang.Double> lineTranslate = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression lineTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor lineTranslateAnchor = com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor.MAP);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression lineTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColor(String lineTrimColor = \"transparent\");\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColor(com.mapbox.maps.extension.style.expressions.generated.Expression lineTrimColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColor(@ColorInt int lineTrimColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColorUseTheme(String lineTrimColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression lineTrimColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimFadeRange(java.util.List<java.lang.Double> lineTrimFadeRange = listOf(0.0, 0.0));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimFadeRange(com.mapbox.maps.extension.style.expressions.generated.Expression lineTrimFadeRange);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimOffset(java.util.List<java.lang.Double> lineTrimOffset = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineTrimOffset(com.mapbox.maps.extension.style.expressions.generated.Expression lineTrimOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidth(double lineWidth = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidth(com.mapbox.maps.extension.style.expressions.generated.Expression lineWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidthUnit(com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit lineWidthUnit = com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit.PIXELS);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LineLayer lineWidthUnit(com.mapbox.maps.extension.style.expressions.generated.Expression lineWidthUnit);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineZOffset(double lineZOffset = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer lineZOffset(com.mapbox.maps.extension.style.expressions.generated.Expression lineZOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.LineLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class LineLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.LineLayer lineLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.LineLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class LocationIndicatorLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayerDsl {\n    ctor public LocationIndicatorLayer(String layerId);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadius(double accuracyRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadius(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColor(String accuracyRadiusBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColor(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadiusBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColor(@ColorInt int accuracyRadiusBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColorUseTheme(String accuracyRadiusBorderColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadiusBorderColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColor(String accuracyRadiusColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColor(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadiusColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColor(@ColorInt int accuracyRadiusColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColorUseTheme(String accuracyRadiusColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadiusColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearing(double bearing);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearing(com.mapbox.maps.extension.style.expressions.generated.Expression bearing);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImage(String bearingImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImage(com.mapbox.maps.extension.style.expressions.generated.Expression bearingImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImageSize(double bearingImageSize);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImageSize(com.mapbox.maps.extension.style.expressions.generated.Expression bearingImageSize);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImageSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImageSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColor(String emphasisCircleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColor(com.mapbox.maps.extension.style.expressions.generated.Expression emphasisCircleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColor(@ColorInt int emphasisCircleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColorUseTheme(String emphasisCircleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression emphasisCircleColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleGlowRange(java.util.List<java.lang.Double> emphasisCircleGlowRange);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleGlowRange(com.mapbox.maps.extension.style.expressions.generated.Expression emphasisCircleGlowRange);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleGlowRangeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleGlowRangeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleRadius(double emphasisCircleRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleRadius(com.mapbox.maps.extension.style.expressions.generated.Expression emphasisCircleRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public Double? getAccuracyRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getAccuracyRadiusAsExpression();\n    method public String? getAccuracyRadiusBorderColor();\n    method @ColorInt public Integer? getAccuracyRadiusBorderColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getAccuracyRadiusBorderColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getAccuracyRadiusBorderColorTransition();\n    method public String? getAccuracyRadiusBorderColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getAccuracyRadiusBorderColorUseThemeAsExpression();\n    method public String? getAccuracyRadiusColor();\n    method @ColorInt public Integer? getAccuracyRadiusColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getAccuracyRadiusColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getAccuracyRadiusColorTransition();\n    method public String? getAccuracyRadiusColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getAccuracyRadiusColorUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getAccuracyRadiusTransition();\n    method public Double? getBearing();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getBearingAsExpression();\n    method public String? getBearingImage();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getBearingImageAsExpression();\n    method public Double? getBearingImageSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getBearingImageSizeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getBearingImageSizeTransition();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getBearingTransition();\n    method public String? getEmphasisCircleColor();\n    method @ColorInt public Integer? getEmphasisCircleColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getEmphasisCircleColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getEmphasisCircleColorTransition();\n    method public String? getEmphasisCircleColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getEmphasisCircleColorUseThemeAsExpression();\n    method public java.util.List<java.lang.Double>? getEmphasisCircleGlowRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getEmphasisCircleGlowRangeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getEmphasisCircleGlowRangeTransition();\n    method public Double? getEmphasisCircleRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getEmphasisCircleRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getEmphasisCircleRadiusTransition();\n    method public Double? getImagePitchDisplacement();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getImagePitchDisplacementAsExpression();\n    method public String getLayerId();\n    method public java.util.List<java.lang.Double>? getLocation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLocationAsExpression();\n    method public Double? getLocationIndicatorOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLocationIndicatorOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLocationIndicatorOpacityTransition();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getLocationTransition();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public Double? getPerspectiveCompensation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getPerspectiveCompensationAsExpression();\n    method public String? getShadowImage();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getShadowImageAsExpression();\n    method public Double? getShadowImageSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getShadowImageSizeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getShadowImageSizeTransition();\n    method public String? getSlot();\n    method public String? getTopImage();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTopImageAsExpression();\n    method public Double? getTopImageSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTopImageSizeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getTopImageSizeTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer imagePitchDisplacement(double imagePitchDisplacement);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer imagePitchDisplacement(com.mapbox.maps.extension.style.expressions.generated.Expression imagePitchDisplacement);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer location(java.util.List<java.lang.Double> location);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer location(com.mapbox.maps.extension.style.expressions.generated.Expression location);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationIndicatorOpacity(double locationIndicatorOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationIndicatorOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression locationIndicatorOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationIndicatorOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationIndicatorOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer perspectiveCompensation(double perspectiveCompensation);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer perspectiveCompensation(com.mapbox.maps.extension.style.expressions.generated.Expression perspectiveCompensation);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImage(String shadowImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImage(com.mapbox.maps.extension.style.expressions.generated.Expression shadowImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImageSize(double shadowImageSize);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImageSize(com.mapbox.maps.extension.style.expressions.generated.Expression shadowImageSize);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImageSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImageSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImage(String topImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImage(com.mapbox.maps.extension.style.expressions.generated.Expression topImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImageSize(double topImageSize);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImageSize(com.mapbox.maps.extension.style.expressions.generated.Expression topImageSize);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImageSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImageSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final Double? accuracyRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? accuracyRadiusAsExpression;\n    property public final String? accuracyRadiusBorderColor;\n    property @ColorInt public final Integer? accuracyRadiusBorderColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? accuracyRadiusBorderColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? accuracyRadiusBorderColorTransition;\n    property public final String? accuracyRadiusBorderColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? accuracyRadiusBorderColorUseThemeAsExpression;\n    property public final String? accuracyRadiusColor;\n    property @ColorInt public final Integer? accuracyRadiusColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? accuracyRadiusColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? accuracyRadiusColorTransition;\n    property public final String? accuracyRadiusColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? accuracyRadiusColorUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? accuracyRadiusTransition;\n    property public final Double? bearing;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? bearingAsExpression;\n    property public final String? bearingImage;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? bearingImageAsExpression;\n    property public final Double? bearingImageSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? bearingImageSizeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? bearingImageSizeTransition;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? bearingTransition;\n    property public final String? emphasisCircleColor;\n    property @ColorInt public final Integer? emphasisCircleColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? emphasisCircleColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? emphasisCircleColorTransition;\n    property public final String? emphasisCircleColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? emphasisCircleColorUseThemeAsExpression;\n    property public final java.util.List<java.lang.Double>? emphasisCircleGlowRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? emphasisCircleGlowRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? emphasisCircleGlowRangeTransition;\n    property public final Double? emphasisCircleRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? emphasisCircleRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? emphasisCircleRadiusTransition;\n    property public final Double? imagePitchDisplacement;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? imagePitchDisplacementAsExpression;\n    property public String layerId;\n    property public final java.util.List<java.lang.Double>? location;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? locationAsExpression;\n    property public final Double? locationIndicatorOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? locationIndicatorOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? locationIndicatorOpacityTransition;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? locationTransition;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public final Double? perspectiveCompensation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? perspectiveCompensationAsExpression;\n    property public final String? shadowImage;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? shadowImageAsExpression;\n    property public final Double? shadowImageSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? shadowImageSizeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? shadowImageSizeTransition;\n    property public String? slot;\n    property public final String? topImage;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? topImageAsExpression;\n    property public final Double? topImageSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? topImageSizeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? topImageSizeTransition;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer.Companion Companion;\n  }\n\n  public static final class LocationIndicatorLayer.Companion {\n    method public Double? getDefaultAccuracyRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultAccuracyRadiusAsExpression();\n    method public String? getDefaultAccuracyRadiusBorderColor();\n    method @ColorInt public Integer? getDefaultAccuracyRadiusBorderColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultAccuracyRadiusBorderColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultAccuracyRadiusBorderColorTransition();\n    method public String? getDefaultAccuracyRadiusBorderColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultAccuracyRadiusBorderColorUseThemeAsExpression();\n    method public String? getDefaultAccuracyRadiusColor();\n    method @ColorInt public Integer? getDefaultAccuracyRadiusColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultAccuracyRadiusColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultAccuracyRadiusColorTransition();\n    method public String? getDefaultAccuracyRadiusColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultAccuracyRadiusColorUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultAccuracyRadiusTransition();\n    method public Double? getDefaultBearing();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultBearingAsExpression();\n    method public String? getDefaultBearingImage();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultBearingImageAsExpression();\n    method public Double? getDefaultBearingImageSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultBearingImageSizeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultBearingImageSizeTransition();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultBearingTransition();\n    method public String? getDefaultEmphasisCircleColor();\n    method @ColorInt public Integer? getDefaultEmphasisCircleColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultEmphasisCircleColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultEmphasisCircleColorTransition();\n    method public String? getDefaultEmphasisCircleColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultEmphasisCircleColorUseThemeAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultEmphasisCircleGlowRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultEmphasisCircleGlowRangeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultEmphasisCircleGlowRangeTransition();\n    method public Double? getDefaultEmphasisCircleRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultEmphasisCircleRadiusAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultEmphasisCircleRadiusTransition();\n    method public Double? getDefaultImagePitchDisplacement();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultImagePitchDisplacementAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultLocation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLocationAsExpression();\n    method public Double? getDefaultLocationIndicatorOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultLocationIndicatorOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLocationIndicatorOpacityTransition();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultLocationTransition();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public Double? getDefaultPerspectiveCompensation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultPerspectiveCompensationAsExpression();\n    method public String? getDefaultShadowImage();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultShadowImageAsExpression();\n    method public Double? getDefaultShadowImageSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultShadowImageSizeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultShadowImageSizeTransition();\n    method public String? getDefaultTopImage();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTopImageAsExpression();\n    method public Double? getDefaultTopImageSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTopImageSizeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultTopImageSizeTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Double? defaultAccuracyRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultAccuracyRadiusAsExpression;\n    property public final String? defaultAccuracyRadiusBorderColor;\n    property @ColorInt public final Integer? defaultAccuracyRadiusBorderColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultAccuracyRadiusBorderColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultAccuracyRadiusBorderColorTransition;\n    property public final String? defaultAccuracyRadiusBorderColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultAccuracyRadiusBorderColorUseThemeAsExpression;\n    property public final String? defaultAccuracyRadiusColor;\n    property @ColorInt public final Integer? defaultAccuracyRadiusColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultAccuracyRadiusColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultAccuracyRadiusColorTransition;\n    property public final String? defaultAccuracyRadiusColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultAccuracyRadiusColorUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultAccuracyRadiusTransition;\n    property public final Double? defaultBearing;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultBearingAsExpression;\n    property public final String? defaultBearingImage;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultBearingImageAsExpression;\n    property public final Double? defaultBearingImageSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultBearingImageSizeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultBearingImageSizeTransition;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultBearingTransition;\n    property public final String? defaultEmphasisCircleColor;\n    property @ColorInt public final Integer? defaultEmphasisCircleColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultEmphasisCircleColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultEmphasisCircleColorTransition;\n    property public final String? defaultEmphasisCircleColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultEmphasisCircleColorUseThemeAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultEmphasisCircleGlowRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultEmphasisCircleGlowRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultEmphasisCircleGlowRangeTransition;\n    property public final Double? defaultEmphasisCircleRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultEmphasisCircleRadiusAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultEmphasisCircleRadiusTransition;\n    property public final Double? defaultImagePitchDisplacement;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultImagePitchDisplacementAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultLocation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLocationAsExpression;\n    property public final Double? defaultLocationIndicatorOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultLocationIndicatorOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLocationIndicatorOpacityTransition;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultLocationTransition;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final Double? defaultPerspectiveCompensation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultPerspectiveCompensationAsExpression;\n    property public final String? defaultShadowImage;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultShadowImageAsExpression;\n    property public final Double? defaultShadowImageSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultShadowImageSizeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultShadowImageSizeTransition;\n    property public final String? defaultTopImage;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTopImageAsExpression;\n    property public final Double? defaultTopImageSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTopImageSizeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultTopImageSizeTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface LocationIndicatorLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadius(double accuracyRadius = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadius(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColor(String accuracyRadiusBorderColor = \"#ffffff\");\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColor(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadiusBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColor(@ColorInt int accuracyRadiusBorderColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColorUseTheme(String accuracyRadiusBorderColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusBorderColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadiusBorderColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColor(String accuracyRadiusColor = \"#ffffff\");\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColor(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadiusColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColor(@ColorInt int accuracyRadiusColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColorUseTheme(String accuracyRadiusColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression accuracyRadiusColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer accuracyRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearing(double bearing = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearing(com.mapbox.maps.extension.style.expressions.generated.Expression bearing);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImage(String bearingImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImage(com.mapbox.maps.extension.style.expressions.generated.Expression bearingImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImageSize(double bearingImageSize = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImageSize(com.mapbox.maps.extension.style.expressions.generated.Expression bearingImageSize);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImageSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingImageSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer bearingTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColor(String emphasisCircleColor = \"#ffffff\");\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColor(com.mapbox.maps.extension.style.expressions.generated.Expression emphasisCircleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColor(@ColorInt int emphasisCircleColor);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColorUseTheme(String emphasisCircleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression emphasisCircleColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleGlowRange(java.util.List<java.lang.Double> emphasisCircleGlowRange = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleGlowRange(com.mapbox.maps.extension.style.expressions.generated.Expression emphasisCircleGlowRange);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleGlowRangeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleGlowRangeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleRadius(double emphasisCircleRadius = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleRadius(com.mapbox.maps.extension.style.expressions.generated.Expression emphasisCircleRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleRadiusTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer emphasisCircleRadiusTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer imagePitchDisplacement(double imagePitchDisplacement = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer imagePitchDisplacement(com.mapbox.maps.extension.style.expressions.generated.Expression imagePitchDisplacement);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer location(java.util.List<java.lang.Double> location = listOf(0.0, 0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer location(com.mapbox.maps.extension.style.expressions.generated.Expression location);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationIndicatorOpacity(double locationIndicatorOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationIndicatorOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression locationIndicatorOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationIndicatorOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationIndicatorOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer perspectiveCompensation(double perspectiveCompensation = 0.85);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer perspectiveCompensation(com.mapbox.maps.extension.style.expressions.generated.Expression perspectiveCompensation);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImage(String shadowImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImage(com.mapbox.maps.extension.style.expressions.generated.Expression shadowImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImageSize(double shadowImageSize = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImageSize(com.mapbox.maps.extension.style.expressions.generated.Expression shadowImageSize);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImageSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer shadowImageSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImage(String topImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImage(com.mapbox.maps.extension.style.expressions.generated.Expression topImage);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImageSize(double topImageSize = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImageSize(com.mapbox.maps.extension.style.expressions.generated.Expression topImageSize);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImageSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer topImageSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class LocationIndicatorLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayer locationIndicatorLayer(String layerId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.LocationIndicatorLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class ModelLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.ModelLayerDsl {\n    ctor public ModelLayer(String layerId, String sourceId);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public Boolean? getModelAllowDensityReduction();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelAllowDensityReductionAsExpression();\n    method public Double? getModelAmbientOcclusionIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelAmbientOcclusionIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelAmbientOcclusionIntensityTransition();\n    method public Boolean? getModelCastShadows();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelCastShadowsAsExpression();\n    method public String? getModelColor();\n    method @ColorInt public Integer? getModelColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelColorAsExpression();\n    method public Double? getModelColorMixIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelColorMixIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelColorMixIntensityTransition();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelColorTransition();\n    method public String? getModelColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelColorUseThemeAsExpression();\n    method public Double? getModelCutoffFadeRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelCutoffFadeRangeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference? getModelElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelElevationReferenceAsExpression();\n    method public Double? getModelEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelEmissiveStrengthTransition();\n    method public java.util.List<java.lang.Double>? getModelHeightBasedEmissiveStrengthMultiplier();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelHeightBasedEmissiveStrengthMultiplierAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelHeightBasedEmissiveStrengthMultiplierTransition();\n    method public String? getModelId();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelIdAsExpression();\n    method public Double? getModelOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelOpacityTransition();\n    method public Boolean? getModelReceiveShadows();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelReceiveShadowsAsExpression();\n    method public java.util.List<java.lang.Double>? getModelRotation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelRotationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelRotationTransition();\n    method public Double? getModelRoughness();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelRoughnessAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelRoughnessTransition();\n    method public java.util.List<java.lang.Double>? getModelScale();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelScaleAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode? getModelScaleMode();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelScaleModeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelScaleTransition();\n    method public java.util.List<java.lang.Double>? getModelTranslation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelTranslationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getModelTranslationTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ModelType? getModelType();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getModelTypeAsExpression();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer minZoom(double minZoom);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAllowDensityReduction(boolean modelAllowDensityReduction);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAllowDensityReduction(com.mapbox.maps.extension.style.expressions.generated.Expression modelAllowDensityReduction);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAmbientOcclusionIntensity(double modelAmbientOcclusionIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAmbientOcclusionIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression modelAmbientOcclusionIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAmbientOcclusionIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAmbientOcclusionIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelCastShadows(boolean modelCastShadows);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelCastShadows(com.mapbox.maps.extension.style.expressions.generated.Expression modelCastShadows);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColor(String modelColor);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColor(com.mapbox.maps.extension.style.expressions.generated.Expression modelColor);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColor(@ColorInt int modelColor);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorMixIntensity(double modelColorMixIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorMixIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression modelColorMixIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorMixIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorMixIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorUseTheme(String modelColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression modelColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelCutoffFadeRange(double modelCutoffFadeRange);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelCutoffFadeRange(com.mapbox.maps.extension.style.expressions.generated.Expression modelCutoffFadeRange);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference modelElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression modelElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelEmissiveStrength(double modelEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression modelEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelHeightBasedEmissiveStrengthMultiplier(java.util.List<java.lang.Double> modelHeightBasedEmissiveStrengthMultiplier);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelHeightBasedEmissiveStrengthMultiplier(com.mapbox.maps.extension.style.expressions.generated.Expression modelHeightBasedEmissiveStrengthMultiplier);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelHeightBasedEmissiveStrengthMultiplierTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelHeightBasedEmissiveStrengthMultiplierTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelId(String modelId);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelId(com.mapbox.maps.extension.style.expressions.generated.Expression modelId);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelOpacity(double modelOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression modelOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelReceiveShadows(boolean modelReceiveShadows);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelReceiveShadows(com.mapbox.maps.extension.style.expressions.generated.Expression modelReceiveShadows);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRotation(java.util.List<java.lang.Double> modelRotation);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRotation(com.mapbox.maps.extension.style.expressions.generated.Expression modelRotation);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRotationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRotationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRoughness(double modelRoughness);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRoughness(com.mapbox.maps.extension.style.expressions.generated.Expression modelRoughness);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRoughnessTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRoughnessTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScale(java.util.List<java.lang.Double> modelScale);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScale(com.mapbox.maps.extension.style.expressions.generated.Expression modelScale);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScaleMode(com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode modelScaleMode);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScaleMode(com.mapbox.maps.extension.style.expressions.generated.Expression modelScaleMode);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScaleTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScaleTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelTranslation(java.util.List<java.lang.Double> modelTranslation);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelTranslation(com.mapbox.maps.extension.style.expressions.generated.Expression modelTranslation);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelTranslationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelTranslationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelType(com.mapbox.maps.extension.style.layers.properties.generated.ModelType modelType);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelType(com.mapbox.maps.extension.style.expressions.generated.Expression modelType);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public final Boolean? modelAllowDensityReduction;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelAllowDensityReductionAsExpression;\n    property public final Double? modelAmbientOcclusionIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelAmbientOcclusionIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelAmbientOcclusionIntensityTransition;\n    property public final Boolean? modelCastShadows;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelCastShadowsAsExpression;\n    property public final String? modelColor;\n    property @ColorInt public final Integer? modelColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelColorAsExpression;\n    property public final Double? modelColorMixIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelColorMixIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelColorMixIntensityTransition;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelColorTransition;\n    property public final String? modelColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelColorUseThemeAsExpression;\n    property public final Double? modelCutoffFadeRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelCutoffFadeRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference? modelElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelElevationReferenceAsExpression;\n    property public final Double? modelEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelEmissiveStrengthTransition;\n    property public final java.util.List<java.lang.Double>? modelHeightBasedEmissiveStrengthMultiplier;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelHeightBasedEmissiveStrengthMultiplierAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelHeightBasedEmissiveStrengthMultiplierTransition;\n    property public final String? modelId;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelIdAsExpression;\n    property public final Double? modelOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelOpacityTransition;\n    property public final Boolean? modelReceiveShadows;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelReceiveShadowsAsExpression;\n    property public final java.util.List<java.lang.Double>? modelRotation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelRotationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelRotationTransition;\n    property public final Double? modelRoughness;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelRoughnessAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelRoughnessTransition;\n    property public final java.util.List<java.lang.Double>? modelScale;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelScaleAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode? modelScaleMode;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelScaleModeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelScaleTransition;\n    property public final java.util.List<java.lang.Double>? modelTranslation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelTranslationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? modelTranslationTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.ModelType? modelType;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? modelTypeAsExpression;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.ModelLayer.Companion Companion;\n  }\n\n  public static final class ModelLayer.Companion {\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public Boolean? getDefaultModelAllowDensityReduction();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelAllowDensityReductionAsExpression();\n    method public Double? getDefaultModelAmbientOcclusionIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelAmbientOcclusionIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelAmbientOcclusionIntensityTransition();\n    method public Boolean? getDefaultModelCastShadows();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelCastShadowsAsExpression();\n    method public String? getDefaultModelColor();\n    method @ColorInt public Integer? getDefaultModelColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelColorAsExpression();\n    method public Double? getDefaultModelColorMixIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelColorMixIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelColorMixIntensityTransition();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelColorTransition();\n    method public String? getDefaultModelColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelColorUseThemeAsExpression();\n    method public Double? getDefaultModelCutoffFadeRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelCutoffFadeRangeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference? getDefaultModelElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelElevationReferenceAsExpression();\n    method public Double? getDefaultModelEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelEmissiveStrengthTransition();\n    method public java.util.List<java.lang.Double>? getDefaultModelHeightBasedEmissiveStrengthMultiplier();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelHeightBasedEmissiveStrengthMultiplierAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelHeightBasedEmissiveStrengthMultiplierTransition();\n    method public String? getDefaultModelId();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelIdAsExpression();\n    method public Double? getDefaultModelOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelOpacityTransition();\n    method public Boolean? getDefaultModelReceiveShadows();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelReceiveShadowsAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultModelRotation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelRotationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelRotationTransition();\n    method public Double? getDefaultModelRoughness();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelRoughnessAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelRoughnessTransition();\n    method public java.util.List<java.lang.Double>? getDefaultModelScale();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelScaleAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode? getDefaultModelScaleMode();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelScaleModeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelScaleTransition();\n    method public java.util.List<java.lang.Double>? getDefaultModelTranslation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelTranslationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultModelTranslationTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ModelType? getDefaultModelType();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultModelTypeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final Boolean? defaultModelAllowDensityReduction;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelAllowDensityReductionAsExpression;\n    property public final Double? defaultModelAmbientOcclusionIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelAmbientOcclusionIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelAmbientOcclusionIntensityTransition;\n    property public final Boolean? defaultModelCastShadows;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelCastShadowsAsExpression;\n    property public final String? defaultModelColor;\n    property @ColorInt public final Integer? defaultModelColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelColorAsExpression;\n    property public final Double? defaultModelColorMixIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelColorMixIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelColorMixIntensityTransition;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelColorTransition;\n    property public final String? defaultModelColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelColorUseThemeAsExpression;\n    property public final Double? defaultModelCutoffFadeRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelCutoffFadeRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference? defaultModelElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelElevationReferenceAsExpression;\n    property public final Double? defaultModelEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelEmissiveStrengthTransition;\n    property public final java.util.List<java.lang.Double>? defaultModelHeightBasedEmissiveStrengthMultiplier;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelHeightBasedEmissiveStrengthMultiplierAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelHeightBasedEmissiveStrengthMultiplierTransition;\n    property public final String? defaultModelId;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelIdAsExpression;\n    property public final Double? defaultModelOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelOpacityTransition;\n    property public final Boolean? defaultModelReceiveShadows;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelReceiveShadowsAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultModelRotation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelRotationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelRotationTransition;\n    property public final Double? defaultModelRoughness;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelRoughnessAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelRoughnessTransition;\n    property public final java.util.List<java.lang.Double>? defaultModelScale;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelScaleAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode? defaultModelScaleMode;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelScaleModeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelScaleTransition;\n    property public final java.util.List<java.lang.Double>? defaultModelTranslation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelTranslationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultModelTranslationTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.ModelType? defaultModelType;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultModelTypeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface ModelLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer minZoom(double minZoom);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAllowDensityReduction(boolean modelAllowDensityReduction = true);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAllowDensityReduction(com.mapbox.maps.extension.style.expressions.generated.Expression modelAllowDensityReduction);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAmbientOcclusionIntensity(double modelAmbientOcclusionIntensity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAmbientOcclusionIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression modelAmbientOcclusionIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAmbientOcclusionIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelAmbientOcclusionIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelCastShadows(boolean modelCastShadows = true);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelCastShadows(com.mapbox.maps.extension.style.expressions.generated.Expression modelCastShadows);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColor(String modelColor = \"#ffffff\");\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColor(com.mapbox.maps.extension.style.expressions.generated.Expression modelColor);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColor(@ColorInt int modelColor);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorMixIntensity(double modelColorMixIntensity = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorMixIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression modelColorMixIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorMixIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorMixIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorUseTheme(String modelColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression modelColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelCutoffFadeRange(double modelCutoffFadeRange = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelCutoffFadeRange(com.mapbox.maps.extension.style.expressions.generated.Expression modelCutoffFadeRange);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference modelElevationReference = com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference.GROUND);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression modelElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelEmissiveStrength(double modelEmissiveStrength = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression modelEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelHeightBasedEmissiveStrengthMultiplier(java.util.List<java.lang.Double> modelHeightBasedEmissiveStrengthMultiplier = listOf(1.0, 1.0, 1.0, 1.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelHeightBasedEmissiveStrengthMultiplier(com.mapbox.maps.extension.style.expressions.generated.Expression modelHeightBasedEmissiveStrengthMultiplier);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelHeightBasedEmissiveStrengthMultiplierTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelHeightBasedEmissiveStrengthMultiplierTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelId(String modelId = \"\");\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelId(com.mapbox.maps.extension.style.expressions.generated.Expression modelId);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelOpacity(double modelOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression modelOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelReceiveShadows(boolean modelReceiveShadows = true);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelReceiveShadows(com.mapbox.maps.extension.style.expressions.generated.Expression modelReceiveShadows);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRotation(java.util.List<java.lang.Double> modelRotation = listOf(0.0, 0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRotation(com.mapbox.maps.extension.style.expressions.generated.Expression modelRotation);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRotationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRotationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRoughness(double modelRoughness = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRoughness(com.mapbox.maps.extension.style.expressions.generated.Expression modelRoughness);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRoughnessTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelRoughnessTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScale(java.util.List<java.lang.Double> modelScale = listOf(1.0, 1.0, 1.0));\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScale(com.mapbox.maps.extension.style.expressions.generated.Expression modelScale);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScaleMode(com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode modelScaleMode = com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode.MAP);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScaleMode(com.mapbox.maps.extension.style.expressions.generated.Expression modelScaleMode);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScaleTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelScaleTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelTranslation(java.util.List<java.lang.Double> modelTranslation = listOf(0.0, 0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelTranslation(com.mapbox.maps.extension.style.expressions.generated.Expression modelTranslation);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelTranslationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelTranslationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelType(com.mapbox.maps.extension.style.layers.properties.generated.ModelType modelType = com.mapbox.maps.extension.style.layers.properties.generated.ModelType.COMMON_3D);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer modelType(com.mapbox.maps.extension.style.expressions.generated.Expression modelType);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.ModelLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class ModelLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.ModelLayer modelLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.ModelLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class RasterLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.RasterLayerDsl {\n    ctor public RasterLayer(String layerId, String sourceId);\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getRasterArrayBand();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterArrayBandAsExpression();\n    method public Double? getRasterBrightnessMax();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterBrightnessMaxAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterBrightnessMaxTransition();\n    method public Double? getRasterBrightnessMin();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterBrightnessMinAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterBrightnessMinTransition();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterColor();\n    method public java.util.List<java.lang.Double>? getRasterColorMix();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterColorMixAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterColorMixTransition();\n    method public java.util.List<java.lang.Double>? getRasterColorRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterColorRangeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterColorRangeTransition();\n    method public String? getRasterColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterColorUseThemeAsExpression();\n    method public Double? getRasterContrast();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterContrastAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterContrastTransition();\n    method public Double? getRasterElevation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterElevationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterElevationTransition();\n    method public Double? getRasterEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterEmissiveStrengthTransition();\n    method public Double? getRasterFadeDuration();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterFadeDurationAsExpression();\n    method public Double? getRasterHueRotate();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterHueRotateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterHueRotateTransition();\n    method public Double? getRasterOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterOpacityTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling? getRasterResampling();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterResamplingAsExpression();\n    method public Double? getRasterSaturation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterSaturationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterSaturationTransition();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer minZoom(double minZoom);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterArrayBand(String rasterArrayBand);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterArrayBand(com.mapbox.maps.extension.style.expressions.generated.Expression rasterArrayBand);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMax(double rasterBrightnessMax);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMax(com.mapbox.maps.extension.style.expressions.generated.Expression rasterBrightnessMax);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMaxTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMaxTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMin(double rasterBrightnessMin);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMin(com.mapbox.maps.extension.style.expressions.generated.Expression rasterBrightnessMin);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMinTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMinTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterColor);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorMix(java.util.List<java.lang.Double> rasterColorMix);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorMix(com.mapbox.maps.extension.style.expressions.generated.Expression rasterColorMix);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorMixTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorMixTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorRange(java.util.List<java.lang.Double> rasterColorRange);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorRange(com.mapbox.maps.extension.style.expressions.generated.Expression rasterColorRange);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorRangeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorRangeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorUseTheme(String rasterColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression rasterColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterContrast(double rasterContrast);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterContrast(com.mapbox.maps.extension.style.expressions.generated.Expression rasterContrast);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterContrastTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterContrastTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterElevation(double rasterElevation);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterElevation(com.mapbox.maps.extension.style.expressions.generated.Expression rasterElevation);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterElevationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterElevationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterEmissiveStrength(double rasterEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression rasterEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterFadeDuration(double rasterFadeDuration);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterFadeDuration(com.mapbox.maps.extension.style.expressions.generated.Expression rasterFadeDuration);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterHueRotate(double rasterHueRotate);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterHueRotate(com.mapbox.maps.extension.style.expressions.generated.Expression rasterHueRotate);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterHueRotateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterHueRotateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterOpacity(double rasterOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression rasterOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterResampling(com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling rasterResampling);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterResampling(com.mapbox.maps.extension.style.expressions.generated.Expression rasterResampling);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterSaturation(double rasterSaturation);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterSaturation(com.mapbox.maps.extension.style.expressions.generated.Expression rasterSaturation);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterSaturationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterSaturationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public final String? rasterArrayBand;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterArrayBandAsExpression;\n    property public final Double? rasterBrightnessMax;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterBrightnessMaxAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterBrightnessMaxTransition;\n    property public final Double? rasterBrightnessMin;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterBrightnessMinAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterBrightnessMinTransition;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterColor;\n    property public final java.util.List<java.lang.Double>? rasterColorMix;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterColorMixAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterColorMixTransition;\n    property public final java.util.List<java.lang.Double>? rasterColorRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterColorRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterColorRangeTransition;\n    property public final String? rasterColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterColorUseThemeAsExpression;\n    property public final Double? rasterContrast;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterContrastAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterContrastTransition;\n    property public final Double? rasterElevation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterElevationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterElevationTransition;\n    property public final Double? rasterEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterEmissiveStrengthTransition;\n    property public final Double? rasterFadeDuration;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterFadeDurationAsExpression;\n    property public final Double? rasterHueRotate;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterHueRotateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterHueRotateTransition;\n    property public final Double? rasterOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterOpacityTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling? rasterResampling;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterResamplingAsExpression;\n    property public final Double? rasterSaturation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterSaturationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterSaturationTransition;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.RasterLayer.Companion Companion;\n  }\n\n  public static final class RasterLayer.Companion {\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public String? getDefaultRasterArrayBand();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterArrayBandAsExpression();\n    method public Double? getDefaultRasterBrightnessMax();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterBrightnessMaxAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterBrightnessMaxTransition();\n    method public Double? getDefaultRasterBrightnessMin();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterBrightnessMinAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterBrightnessMinTransition();\n    method public java.util.List<java.lang.Double>? getDefaultRasterColorMix();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterColorMixAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterColorMixTransition();\n    method public java.util.List<java.lang.Double>? getDefaultRasterColorRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterColorRangeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterColorRangeTransition();\n    method public String? getDefaultRasterColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterColorUseThemeAsExpression();\n    method public Double? getDefaultRasterContrast();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterContrastAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterContrastTransition();\n    method public Double? getDefaultRasterElevation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterElevationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterElevationTransition();\n    method public Double? getDefaultRasterEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterEmissiveStrengthTransition();\n    method public Double? getDefaultRasterFadeDuration();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterFadeDurationAsExpression();\n    method public Double? getDefaultRasterHueRotate();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterHueRotateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterHueRotateTransition();\n    method public Double? getDefaultRasterOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterOpacityTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling? getDefaultRasterResampling();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterResamplingAsExpression();\n    method public Double? getDefaultRasterSaturation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterSaturationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterSaturationTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final String? defaultRasterArrayBand;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterArrayBandAsExpression;\n    property public final Double? defaultRasterBrightnessMax;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterBrightnessMaxAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterBrightnessMaxTransition;\n    property public final Double? defaultRasterBrightnessMin;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterBrightnessMinAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterBrightnessMinTransition;\n    property public final java.util.List<java.lang.Double>? defaultRasterColorMix;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterColorMixAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterColorMixTransition;\n    property public final java.util.List<java.lang.Double>? defaultRasterColorRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterColorRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterColorRangeTransition;\n    property public final String? defaultRasterColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterColorUseThemeAsExpression;\n    property public final Double? defaultRasterContrast;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterContrastAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterContrastTransition;\n    property public final Double? defaultRasterElevation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterElevationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterElevationTransition;\n    property public final Double? defaultRasterEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterEmissiveStrengthTransition;\n    property public final Double? defaultRasterFadeDuration;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterFadeDurationAsExpression;\n    property public final Double? defaultRasterHueRotate;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterHueRotateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterHueRotateTransition;\n    property public final Double? defaultRasterOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterOpacityTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling? defaultRasterResampling;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterResamplingAsExpression;\n    property public final Double? defaultRasterSaturation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterSaturationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterSaturationTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface RasterLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer minZoom(double minZoom);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterArrayBand(String rasterArrayBand);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterArrayBand(com.mapbox.maps.extension.style.expressions.generated.Expression rasterArrayBand);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMax(double rasterBrightnessMax = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMax(com.mapbox.maps.extension.style.expressions.generated.Expression rasterBrightnessMax);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMaxTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMaxTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMin(double rasterBrightnessMin = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMin(com.mapbox.maps.extension.style.expressions.generated.Expression rasterBrightnessMin);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMinTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterBrightnessMinTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterColor);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorMix(java.util.List<java.lang.Double> rasterColorMix = listOf(0.2126, 0.7152, 0.0722, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorMix(com.mapbox.maps.extension.style.expressions.generated.Expression rasterColorMix);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorMixTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorMixTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorRange(java.util.List<java.lang.Double> rasterColorRange);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorRange(com.mapbox.maps.extension.style.expressions.generated.Expression rasterColorRange);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorRangeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorRangeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorUseTheme(String rasterColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression rasterColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterContrast(double rasterContrast = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterContrast(com.mapbox.maps.extension.style.expressions.generated.Expression rasterContrast);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterContrastTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterContrastTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterElevation(double rasterElevation = 0.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterElevation(com.mapbox.maps.extension.style.expressions.generated.Expression rasterElevation);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterElevationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterElevationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterEmissiveStrength(double rasterEmissiveStrength = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression rasterEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterFadeDuration(double rasterFadeDuration = 300.0);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterFadeDuration(com.mapbox.maps.extension.style.expressions.generated.Expression rasterFadeDuration);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterHueRotate(double rasterHueRotate = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterHueRotate(com.mapbox.maps.extension.style.expressions.generated.Expression rasterHueRotate);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterHueRotateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterHueRotateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterOpacity(double rasterOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression rasterOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterResampling(com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling rasterResampling = com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling.LINEAR);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterResampling(com.mapbox.maps.extension.style.expressions.generated.Expression rasterResampling);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterSaturation(double rasterSaturation = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterSaturation(com.mapbox.maps.extension.style.expressions.generated.Expression rasterSaturation);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterSaturationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterSaturationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class RasterLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.RasterLayer rasterLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.RasterLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread @com.mapbox.maps.MapboxExperimental public final class RasterParticleLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.RasterParticleLayerDsl {\n    ctor public RasterParticleLayer(String layerId, String sourceId);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getRasterParticleArrayBand();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterParticleArrayBandAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterParticleColor();\n    method public String? getRasterParticleColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterParticleColorUseThemeAsExpression();\n    method public Long? getRasterParticleCount();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterParticleCountAsExpression();\n    method public Double? getRasterParticleFadeOpacityFactor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterParticleFadeOpacityFactorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterParticleFadeOpacityFactorTransition();\n    method public Double? getRasterParticleMaxSpeed();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterParticleMaxSpeedAsExpression();\n    method public Double? getRasterParticleResetRateFactor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterParticleResetRateFactorAsExpression();\n    method public Double? getRasterParticleSpeedFactor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getRasterParticleSpeedFactorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getRasterParticleSpeedFactorTransition();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer minZoom(double minZoom);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleArrayBand(String rasterParticleArrayBand);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleArrayBand(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleArrayBand);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleColor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleColorUseTheme(String rasterParticleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleCount(long rasterParticleCount);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleCount(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleCount);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleFadeOpacityFactor(double rasterParticleFadeOpacityFactor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleFadeOpacityFactor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleFadeOpacityFactor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleFadeOpacityFactorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleFadeOpacityFactorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleMaxSpeed(double rasterParticleMaxSpeed);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleMaxSpeed(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleMaxSpeed);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleResetRateFactor(double rasterParticleResetRateFactor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleResetRateFactor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleResetRateFactor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleSpeedFactor(double rasterParticleSpeedFactor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleSpeedFactor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleSpeedFactor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleSpeedFactorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleSpeedFactorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public final String? rasterParticleArrayBand;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterParticleArrayBandAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterParticleColor;\n    property public final String? rasterParticleColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterParticleColorUseThemeAsExpression;\n    property public final Long? rasterParticleCount;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterParticleCountAsExpression;\n    property public final Double? rasterParticleFadeOpacityFactor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterParticleFadeOpacityFactorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterParticleFadeOpacityFactorTransition;\n    property public final Double? rasterParticleMaxSpeed;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterParticleMaxSpeedAsExpression;\n    property public final Double? rasterParticleResetRateFactor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterParticleResetRateFactorAsExpression;\n    property public final Double? rasterParticleSpeedFactor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? rasterParticleSpeedFactorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? rasterParticleSpeedFactorTransition;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer.Companion Companion;\n  }\n\n  public static final class RasterParticleLayer.Companion {\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public String? getDefaultRasterParticleArrayBand();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterParticleArrayBandAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterParticleColor();\n    method public String? getDefaultRasterParticleColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterParticleColorUseThemeAsExpression();\n    method public Long? getDefaultRasterParticleCount();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterParticleCountAsExpression();\n    method public Double? getDefaultRasterParticleFadeOpacityFactor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterParticleFadeOpacityFactorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterParticleFadeOpacityFactorTransition();\n    method public Double? getDefaultRasterParticleMaxSpeed();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterParticleMaxSpeedAsExpression();\n    method public Double? getDefaultRasterParticleResetRateFactor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterParticleResetRateFactorAsExpression();\n    method public Double? getDefaultRasterParticleSpeedFactor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultRasterParticleSpeedFactorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultRasterParticleSpeedFactorTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final String? defaultRasterParticleArrayBand;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterParticleArrayBandAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterParticleColor;\n    property public final String? defaultRasterParticleColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterParticleColorUseThemeAsExpression;\n    property public final Long? defaultRasterParticleCount;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterParticleCountAsExpression;\n    property public final Double? defaultRasterParticleFadeOpacityFactor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterParticleFadeOpacityFactorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterParticleFadeOpacityFactorTransition;\n    property public final Double? defaultRasterParticleMaxSpeed;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterParticleMaxSpeedAsExpression;\n    property public final Double? defaultRasterParticleResetRateFactor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterParticleResetRateFactorAsExpression;\n    property public final Double? defaultRasterParticleSpeedFactor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultRasterParticleSpeedFactorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultRasterParticleSpeedFactorTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.MapboxExperimental @com.mapbox.maps.extension.style.types.LayersDsl public interface RasterParticleLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer minZoom(double minZoom);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleArrayBand(String rasterParticleArrayBand);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleArrayBand(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleArrayBand);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleColor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleColorUseTheme(String rasterParticleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleCount(long rasterParticleCount = 512L);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleCount(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleCount);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleFadeOpacityFactor(double rasterParticleFadeOpacityFactor = 0.98);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleFadeOpacityFactor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleFadeOpacityFactor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleFadeOpacityFactorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleFadeOpacityFactorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleMaxSpeed(double rasterParticleMaxSpeed = 1.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleMaxSpeed(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleMaxSpeed);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleResetRateFactor(double rasterParticleResetRateFactor = 0.8);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleResetRateFactor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleResetRateFactor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleSpeedFactor(double rasterParticleSpeedFactor = 0.2);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleSpeedFactor(com.mapbox.maps.extension.style.expressions.generated.Expression rasterParticleSpeedFactor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleSpeedFactorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleSpeedFactorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class RasterParticleLayerKt {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.layers.generated.RasterParticleLayer rasterParticleLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.RasterParticleLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class SkyLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.SkyLayerDsl {\n    ctor public SkyLayer(String layerId);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSkyAtmosphereColor();\n    method @ColorInt public Integer? getSkyAtmosphereColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyAtmosphereColorAsExpression();\n    method public String? getSkyAtmosphereColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyAtmosphereColorUseThemeAsExpression();\n    method public String? getSkyAtmosphereHaloColor();\n    method @ColorInt public Integer? getSkyAtmosphereHaloColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyAtmosphereHaloColorAsExpression();\n    method public String? getSkyAtmosphereHaloColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyAtmosphereHaloColorUseThemeAsExpression();\n    method public java.util.List<java.lang.Double>? getSkyAtmosphereSun();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyAtmosphereSunAsExpression();\n    method public Double? getSkyAtmosphereSunIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyAtmosphereSunIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyGradient();\n    method public java.util.List<java.lang.Double>? getSkyGradientCenter();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyGradientCenterAsExpression();\n    method public Double? getSkyGradientRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyGradientRadiusAsExpression();\n    method public String? getSkyGradientUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyGradientUseThemeAsExpression();\n    method public Double? getSkyOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getSkyOpacityTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SkyType? getSkyType();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSkyTypeAsExpression();\n    method public String? getSlot();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColor(String skyAtmosphereColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColor(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColor(@ColorInt int skyAtmosphereColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColorUseTheme(String skyAtmosphereColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColor(String skyAtmosphereHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColor(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColor(@ColorInt int skyAtmosphereHaloColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColorUseTheme(String skyAtmosphereHaloColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereHaloColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereSun(java.util.List<java.lang.Double> skyAtmosphereSun);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereSun(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereSun);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereSunIntensity(double skyAtmosphereSunIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereSunIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereSunIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradient(com.mapbox.maps.extension.style.expressions.generated.Expression skyGradient);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientCenter(java.util.List<java.lang.Double> skyGradientCenter);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientCenter(com.mapbox.maps.extension.style.expressions.generated.Expression skyGradientCenter);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientRadius(double skyGradientRadius);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientRadius(com.mapbox.maps.extension.style.expressions.generated.Expression skyGradientRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientUseTheme(String skyGradientUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression skyGradientUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyOpacity(double skyOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression skyOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyType(com.mapbox.maps.extension.style.layers.properties.generated.SkyType skyType);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyType(com.mapbox.maps.extension.style.expressions.generated.Expression skyType);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public final String? skyAtmosphereColor;\n    property @ColorInt public final Integer? skyAtmosphereColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyAtmosphereColorAsExpression;\n    property public final String? skyAtmosphereColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyAtmosphereColorUseThemeAsExpression;\n    property public final String? skyAtmosphereHaloColor;\n    property @ColorInt public final Integer? skyAtmosphereHaloColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyAtmosphereHaloColorAsExpression;\n    property public final String? skyAtmosphereHaloColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyAtmosphereHaloColorUseThemeAsExpression;\n    property public final java.util.List<java.lang.Double>? skyAtmosphereSun;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyAtmosphereSunAsExpression;\n    property public final Double? skyAtmosphereSunIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyAtmosphereSunIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyGradient;\n    property public final java.util.List<java.lang.Double>? skyGradientCenter;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyGradientCenterAsExpression;\n    property public final Double? skyGradientRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyGradientRadiusAsExpression;\n    property public final String? skyGradientUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyGradientUseThemeAsExpression;\n    property public final Double? skyOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? skyOpacityTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SkyType? skyType;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? skyTypeAsExpression;\n    property public String? slot;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.SkyLayer.Companion Companion;\n  }\n\n  public static final class SkyLayer.Companion {\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public String? getDefaultSkyAtmosphereColor();\n    method @ColorInt public Integer? getDefaultSkyAtmosphereColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyAtmosphereColorAsExpression();\n    method public String? getDefaultSkyAtmosphereColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyAtmosphereColorUseThemeAsExpression();\n    method public String? getDefaultSkyAtmosphereHaloColor();\n    method @ColorInt public Integer? getDefaultSkyAtmosphereHaloColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyAtmosphereHaloColorAsExpression();\n    method public String? getDefaultSkyAtmosphereHaloColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyAtmosphereHaloColorUseThemeAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultSkyAtmosphereSun();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyAtmosphereSunAsExpression();\n    method public Double? getDefaultSkyAtmosphereSunIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyAtmosphereSunIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyGradient();\n    method public java.util.List<java.lang.Double>? getDefaultSkyGradientCenter();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyGradientCenterAsExpression();\n    method public Double? getDefaultSkyGradientRadius();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyGradientRadiusAsExpression();\n    method public String? getDefaultSkyGradientUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyGradientUseThemeAsExpression();\n    method public Double? getDefaultSkyOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultSkyOpacityTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SkyType? getDefaultSkyType();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSkyTypeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final String? defaultSkyAtmosphereColor;\n    property @ColorInt public final Integer? defaultSkyAtmosphereColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyAtmosphereColorAsExpression;\n    property public final String? defaultSkyAtmosphereColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyAtmosphereColorUseThemeAsExpression;\n    property public final String? defaultSkyAtmosphereHaloColor;\n    property @ColorInt public final Integer? defaultSkyAtmosphereHaloColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyAtmosphereHaloColorAsExpression;\n    property public final String? defaultSkyAtmosphereHaloColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyAtmosphereHaloColorUseThemeAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultSkyAtmosphereSun;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyAtmosphereSunAsExpression;\n    property public final Double? defaultSkyAtmosphereSunIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyAtmosphereSunIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyGradient;\n    property public final java.util.List<java.lang.Double>? defaultSkyGradientCenter;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyGradientCenterAsExpression;\n    property public final Double? defaultSkyGradientRadius;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyGradientRadiusAsExpression;\n    property public final String? defaultSkyGradientUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyGradientUseThemeAsExpression;\n    property public final Double? defaultSkyOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultSkyOpacityTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SkyType? defaultSkyType;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSkyTypeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface SkyLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColor(String skyAtmosphereColor = \"white\");\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColor(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColor(@ColorInt int skyAtmosphereColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColorUseTheme(String skyAtmosphereColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColor(String skyAtmosphereHaloColor = \"white\");\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColor(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColor(@ColorInt int skyAtmosphereHaloColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColorUseTheme(String skyAtmosphereHaloColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereHaloColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereHaloColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereSun(java.util.List<java.lang.Double> skyAtmosphereSun);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereSun(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereSun);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereSunIntensity(double skyAtmosphereSunIntensity = 10.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyAtmosphereSunIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression skyAtmosphereSunIntensity);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradient(com.mapbox.maps.extension.style.expressions.generated.Expression skyGradient);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientCenter(java.util.List<java.lang.Double> skyGradientCenter = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientCenter(com.mapbox.maps.extension.style.expressions.generated.Expression skyGradientCenter);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientRadius(double skyGradientRadius = 90.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientRadius(com.mapbox.maps.extension.style.expressions.generated.Expression skyGradientRadius);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientUseTheme(String skyGradientUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyGradientUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression skyGradientUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyOpacity(double skyOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression skyOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyType(com.mapbox.maps.extension.style.layers.properties.generated.SkyType skyType = com.mapbox.maps.extension.style.layers.properties.generated.SkyType.ATMOSPHERE);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer skyType(com.mapbox.maps.extension.style.expressions.generated.Expression skyType);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.SkyLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class SkyLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.SkyLayer skyLayer(String layerId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.SkyLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class SlotLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.SlotLayerDsl {\n    ctor public SlotLayer(String layerId);\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.SlotLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SlotLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SlotLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.SlotLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.SlotLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public String? slot;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface SlotLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.SlotLayer slot(String slot);\n  }\n\n  public final class SlotLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.SlotLayer slotLayer(String layerId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.SlotLayerDsl,kotlin.Unit> block);\n  }\n\n  @UiThread public final class SymbolLayer extends com.mapbox.maps.extension.style.layers.Layer implements com.mapbox.maps.extension.style.layers.generated.SymbolLayerDsl {\n    ctor public SymbolLayer(String layerId, String sourceId);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFilter();\n    method public Boolean? getIconAllowOverlap();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconAllowOverlapAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? getIconAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconAnchorAsExpression();\n    method public String? getIconColor();\n    method @ColorInt public Integer? getIconColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconColorAsExpression();\n    method public Double? getIconColorBrightnessMax();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconColorBrightnessMaxAsExpression();\n    method public Double? getIconColorBrightnessMin();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconColorBrightnessMinAsExpression();\n    method public Double? getIconColorContrast();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconColorContrastAsExpression();\n    method public Double? getIconColorSaturation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconColorSaturationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconColorSaturationTransition();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconColorTransition();\n    method public String? getIconColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconColorUseThemeAsExpression();\n    method public Double? getIconEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconEmissiveStrengthTransition();\n    method public Double? getIconHaloBlur();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconHaloBlurAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconHaloBlurTransition();\n    method public String? getIconHaloColor();\n    method @ColorInt public Integer? getIconHaloColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconHaloColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconHaloColorTransition();\n    method public String? getIconHaloColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconHaloColorUseThemeAsExpression();\n    method public Double? getIconHaloWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconHaloWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconHaloWidthTransition();\n    method public Boolean? getIconIgnorePlacement();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconIgnorePlacementAsExpression();\n    method public String? getIconImage();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconImageAsExpression();\n    method public Double? getIconImageCrossFade();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconImageCrossFadeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconImageCrossFadeTransition();\n    method public Boolean? getIconKeepUpright();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconKeepUprightAsExpression();\n    method public Double? getIconOcclusionOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconOcclusionOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconOcclusionOpacityTransition();\n    method public java.util.List<java.lang.Double>? getIconOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconOffsetAsExpression();\n    method public Double? getIconOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconOpacityTransition();\n    method public Boolean? getIconOptional();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconOptionalAsExpression();\n    method public Double? getIconPadding();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconPaddingAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment? getIconPitchAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconPitchAlignmentAsExpression();\n    method public Double? getIconRotate();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconRotateAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment? getIconRotationAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconRotationAlignmentAsExpression();\n    method public Double? getIconSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconSizeAsExpression();\n    method public java.util.List<java.lang.Double>? getIconSizeScaleRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconSizeScaleRangeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? getIconTextFit();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconTextFitAsExpression();\n    method public java.util.List<java.lang.Double>? getIconTextFitPadding();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconTextFitPaddingAsExpression();\n    method public java.util.List<java.lang.Double>? getIconTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor? getIconTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIconTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIconTranslateTransition();\n    method public String getLayerId();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode? getOcclusionOpacityMode();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getOcclusionOpacityModeAsExpression();\n    method public String? getSlot();\n    method public String getSourceId();\n    method public String? getSourceLayer();\n    method public Boolean? getSymbolAvoidEdges();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSymbolAvoidEdgesAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference? getSymbolElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSymbolElevationReferenceAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement? getSymbolPlacement();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSymbolPlacementAsExpression();\n    method public Double? getSymbolSortKey();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSymbolSortKeyAsExpression();\n    method public Double? getSymbolSpacing();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSymbolSpacingAsExpression();\n    method public Boolean? getSymbolZElevate();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSymbolZElevateAsExpression();\n    method public Double? getSymbolZOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSymbolZOffsetAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getSymbolZOffsetTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder? getSymbolZOrder();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getSymbolZOrderAsExpression();\n    method public Boolean? getTextAllowOverlap();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextAllowOverlapAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? getTextAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextAnchorAsExpression();\n    method public String? getTextColor();\n    method @ColorInt public Integer? getTextColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getTextColorTransition();\n    method public String? getTextColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextColorUseThemeAsExpression();\n    method public Double? getTextEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getTextEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.style.types.Formatted? getTextField();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextFieldAsExpression();\n    method public String? getTextFieldAsString();\n    method public java.util.List<java.lang.String>? getTextFont();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextFontAsExpression();\n    method public Double? getTextHaloBlur();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextHaloBlurAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getTextHaloBlurTransition();\n    method public String? getTextHaloColor();\n    method @ColorInt public Integer? getTextHaloColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextHaloColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getTextHaloColorTransition();\n    method public String? getTextHaloColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextHaloColorUseThemeAsExpression();\n    method public Double? getTextHaloWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextHaloWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getTextHaloWidthTransition();\n    method public Boolean? getTextIgnorePlacement();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextIgnorePlacementAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? getTextJustify();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextJustifyAsExpression();\n    method public Boolean? getTextKeepUpright();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextKeepUprightAsExpression();\n    method public Double? getTextLetterSpacing();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextLetterSpacingAsExpression();\n    method public Double? getTextLineHeight();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextLineHeightAsExpression();\n    method public Double? getTextMaxAngle();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextMaxAngleAsExpression();\n    method public Double? getTextMaxWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextMaxWidthAsExpression();\n    method public Double? getTextOcclusionOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextOcclusionOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getTextOcclusionOpacityTransition();\n    method public java.util.List<java.lang.Double>? getTextOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextOffsetAsExpression();\n    method public Double? getTextOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getTextOpacityTransition();\n    method public Boolean? getTextOptional();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextOptionalAsExpression();\n    method public Double? getTextPadding();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextPaddingAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment? getTextPitchAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextPitchAlignmentAsExpression();\n    method public Double? getTextRadialOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextRadialOffsetAsExpression();\n    method public Double? getTextRotate();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextRotateAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment? getTextRotationAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextRotationAlignmentAsExpression();\n    method public Double? getTextSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextSizeAsExpression();\n    method public java.util.List<java.lang.Double>? getTextSizeScaleRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextSizeScaleRangeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? getTextTransform();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextTransformAsExpression();\n    method public java.util.List<java.lang.Double>? getTextTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor? getTextTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getTextTranslateTransition();\n    method public java.util.List<java.lang.String>? getTextVariableAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextVariableAnchorAsExpression();\n    method public java.util.List<java.lang.String>? getTextWritingMode();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getTextWritingModeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getVisibility();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVisibilityAsExpression();\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconAllowOverlap(boolean iconAllowOverlap);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconAllowOverlap(com.mapbox.maps.extension.style.expressions.generated.Expression iconAllowOverlap);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor iconAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression iconAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColor(String iconColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColor(com.mapbox.maps.extension.style.expressions.generated.Expression iconColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColor(@ColorInt int iconColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorBrightnessMax(double iconColorBrightnessMax);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorBrightnessMax(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorBrightnessMax);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorBrightnessMin(double iconColorBrightnessMin);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorBrightnessMin(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorBrightnessMin);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorContrast(double iconColorContrast);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorContrast(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorContrast);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorSaturation(double iconColorSaturation);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorSaturation(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorSaturation);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorSaturationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorSaturationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorUseTheme(String iconColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconEmissiveStrength(double iconEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression iconEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloBlur(double iconHaloBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloBlur(com.mapbox.maps.extension.style.expressions.generated.Expression iconHaloBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloBlurTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloBlurTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColor(String iconHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColor(com.mapbox.maps.extension.style.expressions.generated.Expression iconHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColor(@ColorInt int iconHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColorUseTheme(String iconHaloColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression iconHaloColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloWidth(double iconHaloWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloWidth(com.mapbox.maps.extension.style.expressions.generated.Expression iconHaloWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconIgnorePlacement(boolean iconIgnorePlacement);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconIgnorePlacement(com.mapbox.maps.extension.style.expressions.generated.Expression iconIgnorePlacement);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImage(String iconImage);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImage(com.mapbox.maps.extension.style.expressions.generated.Expression iconImage);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImageCrossFade(double iconImageCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImageCrossFade(com.mapbox.maps.extension.style.expressions.generated.Expression iconImageCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImageCrossFadeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImageCrossFadeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconKeepUpright(boolean iconKeepUpright);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconKeepUpright(com.mapbox.maps.extension.style.expressions.generated.Expression iconKeepUpright);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOcclusionOpacity(double iconOcclusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOcclusionOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression iconOcclusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOcclusionOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOcclusionOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOffset(java.util.List<java.lang.Double> iconOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOffset(com.mapbox.maps.extension.style.expressions.generated.Expression iconOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOpacity(double iconOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression iconOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOptional(boolean iconOptional);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOptional(com.mapbox.maps.extension.style.expressions.generated.Expression iconOptional);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconPadding(double iconPadding);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconPadding(com.mapbox.maps.extension.style.expressions.generated.Expression iconPadding);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment iconPitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconPitchAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression iconPitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconRotate(double iconRotate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconRotate(com.mapbox.maps.extension.style.expressions.generated.Expression iconRotate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconRotationAlignment(com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment iconRotationAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconRotationAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression iconRotationAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconSize(double iconSize);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconSize(com.mapbox.maps.extension.style.expressions.generated.Expression iconSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconSizeScaleRange(java.util.List<java.lang.Double> iconSizeScaleRange);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconSizeScaleRange(com.mapbox.maps.extension.style.expressions.generated.Expression iconSizeScaleRange);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTextFit(com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit iconTextFit);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTextFit(com.mapbox.maps.extension.style.expressions.generated.Expression iconTextFit);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTextFitPadding(java.util.List<java.lang.Double> iconTextFitPadding);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTextFitPadding(com.mapbox.maps.extension.style.expressions.generated.Expression iconTextFitPadding);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslate(java.util.List<java.lang.Double> iconTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression iconTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor iconTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression iconTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer occlusionOpacityMode(com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode occlusionOpacityMode);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer occlusionOpacityMode(com.mapbox.maps.extension.style.expressions.generated.Expression occlusionOpacityMode);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolAvoidEdges(boolean symbolAvoidEdges);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolAvoidEdges(com.mapbox.maps.extension.style.expressions.generated.Expression symbolAvoidEdges);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference symbolElevationReference);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression symbolElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolPlacement(com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement symbolPlacement);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolPlacement(com.mapbox.maps.extension.style.expressions.generated.Expression symbolPlacement);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolSortKey(double symbolSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolSortKey(com.mapbox.maps.extension.style.expressions.generated.Expression symbolSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolSpacing(double symbolSpacing);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolSpacing(com.mapbox.maps.extension.style.expressions.generated.Expression symbolSpacing);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZElevate(boolean symbolZElevate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZElevate(com.mapbox.maps.extension.style.expressions.generated.Expression symbolZElevate);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOffset(double symbolZOffset);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOffset(com.mapbox.maps.extension.style.expressions.generated.Expression symbolZOffset);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOffsetTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOffsetTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOrder(com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder symbolZOrder);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOrder(com.mapbox.maps.extension.style.expressions.generated.Expression symbolZOrder);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textAllowOverlap(boolean textAllowOverlap);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textAllowOverlap(com.mapbox.maps.extension.style.expressions.generated.Expression textAllowOverlap);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor textAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression textAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColor(String textColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColor(com.mapbox.maps.extension.style.expressions.generated.Expression textColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColor(@ColorInt int textColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColorUseTheme(String textColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression textColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textEmissiveStrength(double textEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression textEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textField(com.mapbox.maps.extension.style.types.Formatted textField);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textField(com.mapbox.maps.extension.style.expressions.generated.Expression textField);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textField(String textField);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textField(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.Formatted,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textFont(java.util.List<java.lang.String> textFont);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textFont(com.mapbox.maps.extension.style.expressions.generated.Expression textFont);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloBlur(double textHaloBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloBlur(com.mapbox.maps.extension.style.expressions.generated.Expression textHaloBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloBlurTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloBlurTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColor(String textHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColor(com.mapbox.maps.extension.style.expressions.generated.Expression textHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColor(@ColorInt int textHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColorUseTheme(String textHaloColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression textHaloColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloWidth(double textHaloWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloWidth(com.mapbox.maps.extension.style.expressions.generated.Expression textHaloWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textIgnorePlacement(boolean textIgnorePlacement);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textIgnorePlacement(com.mapbox.maps.extension.style.expressions.generated.Expression textIgnorePlacement);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textJustify(com.mapbox.maps.extension.style.layers.properties.generated.TextJustify textJustify);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textJustify(com.mapbox.maps.extension.style.expressions.generated.Expression textJustify);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textKeepUpright(boolean textKeepUpright);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textKeepUpright(com.mapbox.maps.extension.style.expressions.generated.Expression textKeepUpright);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textLetterSpacing(double textLetterSpacing);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textLetterSpacing(com.mapbox.maps.extension.style.expressions.generated.Expression textLetterSpacing);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textLineHeight(double textLineHeight);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textLineHeight(com.mapbox.maps.extension.style.expressions.generated.Expression textLineHeight);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textMaxAngle(double textMaxAngle);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textMaxAngle(com.mapbox.maps.extension.style.expressions.generated.Expression textMaxAngle);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textMaxWidth(double textMaxWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textMaxWidth(com.mapbox.maps.extension.style.expressions.generated.Expression textMaxWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOcclusionOpacity(double textOcclusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOcclusionOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression textOcclusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOcclusionOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOcclusionOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOffset(java.util.List<java.lang.Double> textOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOffset(com.mapbox.maps.extension.style.expressions.generated.Expression textOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOpacity(double textOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression textOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOptional(boolean textOptional);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOptional(com.mapbox.maps.extension.style.expressions.generated.Expression textOptional);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textPadding(double textPadding);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textPadding(com.mapbox.maps.extension.style.expressions.generated.Expression textPadding);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment textPitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textPitchAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression textPitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRadialOffset(double textRadialOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRadialOffset(com.mapbox.maps.extension.style.expressions.generated.Expression textRadialOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRotate(double textRotate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRotate(com.mapbox.maps.extension.style.expressions.generated.Expression textRotate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRotationAlignment(com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment textRotationAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRotationAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression textRotationAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textSize(double textSize);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textSize(com.mapbox.maps.extension.style.expressions.generated.Expression textSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textSizeScaleRange(java.util.List<java.lang.Double> textSizeScaleRange);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textSizeScaleRange(com.mapbox.maps.extension.style.expressions.generated.Expression textSizeScaleRange);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTransform(com.mapbox.maps.extension.style.layers.properties.generated.TextTransform textTransform);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTransform(com.mapbox.maps.extension.style.expressions.generated.Expression textTransform);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslate(java.util.List<java.lang.Double> textTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression textTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor textTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression textTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textVariableAnchor(java.util.List<java.lang.String> textVariableAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textVariableAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression textVariableAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textWritingMode(java.util.List<java.lang.String> textWritingMode);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textWritingMode(com.mapbox.maps.extension.style.expressions.generated.Expression textWritingMode);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? filter;\n    property public final Boolean? iconAllowOverlap;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconAllowOverlapAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? iconAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconAnchorAsExpression;\n    property public final String? iconColor;\n    property @ColorInt public final Integer? iconColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconColorAsExpression;\n    property public final Double? iconColorBrightnessMax;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconColorBrightnessMaxAsExpression;\n    property public final Double? iconColorBrightnessMin;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconColorBrightnessMinAsExpression;\n    property public final Double? iconColorContrast;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconColorContrastAsExpression;\n    property public final Double? iconColorSaturation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconColorSaturationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconColorSaturationTransition;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconColorTransition;\n    property public final String? iconColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconColorUseThemeAsExpression;\n    property public final Double? iconEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconEmissiveStrengthTransition;\n    property public final Double? iconHaloBlur;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconHaloBlurAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconHaloBlurTransition;\n    property public final String? iconHaloColor;\n    property @ColorInt public final Integer? iconHaloColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconHaloColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconHaloColorTransition;\n    property public final String? iconHaloColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconHaloColorUseThemeAsExpression;\n    property public final Double? iconHaloWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconHaloWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconHaloWidthTransition;\n    property public final Boolean? iconIgnorePlacement;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconIgnorePlacementAsExpression;\n    property public final String? iconImage;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconImageAsExpression;\n    property public final Double? iconImageCrossFade;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconImageCrossFadeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconImageCrossFadeTransition;\n    property public final Boolean? iconKeepUpright;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconKeepUprightAsExpression;\n    property public final Double? iconOcclusionOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconOcclusionOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconOcclusionOpacityTransition;\n    property public final java.util.List<java.lang.Double>? iconOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconOffsetAsExpression;\n    property public final Double? iconOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconOpacityTransition;\n    property public final Boolean? iconOptional;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconOptionalAsExpression;\n    property public final Double? iconPadding;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconPaddingAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment? iconPitchAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconPitchAlignmentAsExpression;\n    property public final Double? iconRotate;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconRotateAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment? iconRotationAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconRotationAlignmentAsExpression;\n    property public final Double? iconSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconSizeAsExpression;\n    property public final java.util.List<java.lang.Double>? iconSizeScaleRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconSizeScaleRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? iconTextFit;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconTextFitAsExpression;\n    property public final java.util.List<java.lang.Double>? iconTextFitPadding;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconTextFitPaddingAsExpression;\n    property public final java.util.List<java.lang.Double>? iconTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor? iconTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? iconTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? iconTranslateTransition;\n    property public String layerId;\n    property public Double? maxZoom;\n    property public Double? minZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode? occlusionOpacityMode;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? occlusionOpacityModeAsExpression;\n    property public String? slot;\n    property public final String sourceId;\n    property public final String? sourceLayer;\n    property public final Boolean? symbolAvoidEdges;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? symbolAvoidEdgesAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference? symbolElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? symbolElevationReferenceAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement? symbolPlacement;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? symbolPlacementAsExpression;\n    property public final Double? symbolSortKey;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? symbolSortKeyAsExpression;\n    property public final Double? symbolSpacing;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? symbolSpacingAsExpression;\n    property public final Boolean? symbolZElevate;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? symbolZElevateAsExpression;\n    property public final Double? symbolZOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? symbolZOffsetAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? symbolZOffsetTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder? symbolZOrder;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? symbolZOrderAsExpression;\n    property public final Boolean? textAllowOverlap;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textAllowOverlapAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? textAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textAnchorAsExpression;\n    property public final String? textColor;\n    property @ColorInt public final Integer? textColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? textColorTransition;\n    property public final String? textColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textColorUseThemeAsExpression;\n    property public final Double? textEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? textEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.style.types.Formatted? textField;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textFieldAsExpression;\n    property public final String? textFieldAsString;\n    property public final java.util.List<java.lang.String>? textFont;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textFontAsExpression;\n    property public final Double? textHaloBlur;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textHaloBlurAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? textHaloBlurTransition;\n    property public final String? textHaloColor;\n    property @ColorInt public final Integer? textHaloColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textHaloColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? textHaloColorTransition;\n    property public final String? textHaloColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textHaloColorUseThemeAsExpression;\n    property public final Double? textHaloWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textHaloWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? textHaloWidthTransition;\n    property public final Boolean? textIgnorePlacement;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textIgnorePlacementAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? textJustify;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textJustifyAsExpression;\n    property public final Boolean? textKeepUpright;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textKeepUprightAsExpression;\n    property public final Double? textLetterSpacing;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textLetterSpacingAsExpression;\n    property public final Double? textLineHeight;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textLineHeightAsExpression;\n    property public final Double? textMaxAngle;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textMaxAngleAsExpression;\n    property public final Double? textMaxWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textMaxWidthAsExpression;\n    property public final Double? textOcclusionOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textOcclusionOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? textOcclusionOpacityTransition;\n    property public final java.util.List<java.lang.Double>? textOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textOffsetAsExpression;\n    property public final Double? textOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? textOpacityTransition;\n    property public final Boolean? textOptional;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textOptionalAsExpression;\n    property public final Double? textPadding;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textPaddingAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment? textPitchAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textPitchAlignmentAsExpression;\n    property public final Double? textRadialOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textRadialOffsetAsExpression;\n    property public final Double? textRotate;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textRotateAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment? textRotationAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textRotationAlignmentAsExpression;\n    property public final Double? textSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textSizeAsExpression;\n    property public final java.util.List<java.lang.Double>? textSizeScaleRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textSizeScaleRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? textTransform;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textTransformAsExpression;\n    property public final java.util.List<java.lang.Double>? textTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor? textTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? textTranslateTransition;\n    property public final java.util.List<java.lang.String>? textVariableAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textVariableAnchorAsExpression;\n    property public final java.util.List<java.lang.String>? textWritingMode;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? textWritingModeAsExpression;\n    property public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? visibility;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? visibilityAsExpression;\n    field public static final com.mapbox.maps.extension.style.layers.generated.SymbolLayer.Companion Companion;\n  }\n\n  public static final class SymbolLayer.Companion {\n    method public Boolean? getDefaultIconAllowOverlap();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconAllowOverlapAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? getDefaultIconAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconAnchorAsExpression();\n    method public String? getDefaultIconColor();\n    method @ColorInt public Integer? getDefaultIconColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconColorAsExpression();\n    method public Double? getDefaultIconColorBrightnessMax();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconColorBrightnessMaxAsExpression();\n    method public Double? getDefaultIconColorBrightnessMin();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconColorBrightnessMinAsExpression();\n    method public Double? getDefaultIconColorContrast();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconColorContrastAsExpression();\n    method public Double? getDefaultIconColorSaturation();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconColorSaturationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconColorSaturationTransition();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconColorTransition();\n    method public String? getDefaultIconColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconColorUseThemeAsExpression();\n    method public Double? getDefaultIconEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconEmissiveStrengthTransition();\n    method public Double? getDefaultIconHaloBlur();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconHaloBlurAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconHaloBlurTransition();\n    method public String? getDefaultIconHaloColor();\n    method @ColorInt public Integer? getDefaultIconHaloColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconHaloColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconHaloColorTransition();\n    method public String? getDefaultIconHaloColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconHaloColorUseThemeAsExpression();\n    method public Double? getDefaultIconHaloWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconHaloWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconHaloWidthTransition();\n    method public Boolean? getDefaultIconIgnorePlacement();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconIgnorePlacementAsExpression();\n    method public String? getDefaultIconImage();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconImageAsExpression();\n    method public Double? getDefaultIconImageCrossFade();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconImageCrossFadeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconImageCrossFadeTransition();\n    method public Boolean? getDefaultIconKeepUpright();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconKeepUprightAsExpression();\n    method public Double? getDefaultIconOcclusionOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconOcclusionOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconOcclusionOpacityTransition();\n    method public java.util.List<java.lang.Double>? getDefaultIconOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconOffsetAsExpression();\n    method public Double? getDefaultIconOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconOpacityTransition();\n    method public Boolean? getDefaultIconOptional();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconOptionalAsExpression();\n    method public Double? getDefaultIconPadding();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconPaddingAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment? getDefaultIconPitchAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconPitchAlignmentAsExpression();\n    method public Double? getDefaultIconRotate();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconRotateAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment? getDefaultIconRotationAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconRotationAlignmentAsExpression();\n    method public Double? getDefaultIconSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconSizeAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultIconSizeScaleRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconSizeScaleRangeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? getDefaultIconTextFit();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconTextFitAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultIconTextFitPadding();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconTextFitPaddingAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultIconTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor? getDefaultIconTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultIconTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultIconTranslateTransition();\n    method public Double? getDefaultMaxZoom();\n    method public Double? getDefaultMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode? getDefaultOcclusionOpacityMode();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultOcclusionOpacityModeAsExpression();\n    method public Boolean? getDefaultSymbolAvoidEdges();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSymbolAvoidEdgesAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference? getDefaultSymbolElevationReference();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSymbolElevationReferenceAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement? getDefaultSymbolPlacement();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSymbolPlacementAsExpression();\n    method public Double? getDefaultSymbolSortKey();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSymbolSortKeyAsExpression();\n    method public Double? getDefaultSymbolSpacing();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSymbolSpacingAsExpression();\n    method public Boolean? getDefaultSymbolZElevate();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSymbolZElevateAsExpression();\n    method public Double? getDefaultSymbolZOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSymbolZOffsetAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultSymbolZOffsetTransition();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder? getDefaultSymbolZOrder();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultSymbolZOrderAsExpression();\n    method public Boolean? getDefaultTextAllowOverlap();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextAllowOverlapAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? getDefaultTextAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextAnchorAsExpression();\n    method public String? getDefaultTextColor();\n    method @ColorInt public Integer? getDefaultTextColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultTextColorTransition();\n    method public String? getDefaultTextColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextColorUseThemeAsExpression();\n    method public Double? getDefaultTextEmissiveStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextEmissiveStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultTextEmissiveStrengthTransition();\n    method public com.mapbox.maps.extension.style.types.Formatted? getDefaultTextField();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextFieldAsExpression();\n    method public String? getDefaultTextFieldAsString();\n    method public java.util.List<java.lang.String>? getDefaultTextFont();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextFontAsExpression();\n    method public Double? getDefaultTextHaloBlur();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextHaloBlurAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultTextHaloBlurTransition();\n    method public String? getDefaultTextHaloColor();\n    method @ColorInt public Integer? getDefaultTextHaloColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextHaloColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultTextHaloColorTransition();\n    method public String? getDefaultTextHaloColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextHaloColorUseThemeAsExpression();\n    method public Double? getDefaultTextHaloWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextHaloWidthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultTextHaloWidthTransition();\n    method public Boolean? getDefaultTextIgnorePlacement();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextIgnorePlacementAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? getDefaultTextJustify();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextJustifyAsExpression();\n    method public Boolean? getDefaultTextKeepUpright();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextKeepUprightAsExpression();\n    method public Double? getDefaultTextLetterSpacing();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextLetterSpacingAsExpression();\n    method public Double? getDefaultTextLineHeight();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextLineHeightAsExpression();\n    method public Double? getDefaultTextMaxAngle();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextMaxAngleAsExpression();\n    method public Double? getDefaultTextMaxWidth();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextMaxWidthAsExpression();\n    method public Double? getDefaultTextOcclusionOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextOcclusionOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultTextOcclusionOpacityTransition();\n    method public java.util.List<java.lang.Double>? getDefaultTextOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextOffsetAsExpression();\n    method public Double? getDefaultTextOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultTextOpacityTransition();\n    method public Boolean? getDefaultTextOptional();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextOptionalAsExpression();\n    method public Double? getDefaultTextPadding();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextPaddingAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment? getDefaultTextPitchAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextPitchAlignmentAsExpression();\n    method public Double? getDefaultTextRadialOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextRadialOffsetAsExpression();\n    method public Double? getDefaultTextRotate();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextRotateAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment? getDefaultTextRotationAlignment();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextRotationAlignmentAsExpression();\n    method public Double? getDefaultTextSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextSizeAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultTextSizeScaleRange();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextSizeScaleRangeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? getDefaultTextTransform();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextTransformAsExpression();\n    method public java.util.List<java.lang.Double>? getDefaultTextTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor? getDefaultTextTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextTranslateAnchorAsExpression();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextTranslateAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDefaultTextTranslateTransition();\n    method public java.util.List<java.lang.String>? getDefaultTextVariableAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextVariableAnchorAsExpression();\n    method public java.util.List<java.lang.String>? getDefaultTextWritingMode();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDefaultTextWritingModeAsExpression();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility? getDefaultVisibility();\n    property public final Boolean? defaultIconAllowOverlap;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconAllowOverlapAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? defaultIconAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconAnchorAsExpression;\n    property public final String? defaultIconColor;\n    property @ColorInt public final Integer? defaultIconColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconColorAsExpression;\n    property public final Double? defaultIconColorBrightnessMax;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconColorBrightnessMaxAsExpression;\n    property public final Double? defaultIconColorBrightnessMin;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconColorBrightnessMinAsExpression;\n    property public final Double? defaultIconColorContrast;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconColorContrastAsExpression;\n    property public final Double? defaultIconColorSaturation;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconColorSaturationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconColorSaturationTransition;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconColorTransition;\n    property public final String? defaultIconColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconColorUseThemeAsExpression;\n    property public final Double? defaultIconEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconEmissiveStrengthTransition;\n    property public final Double? defaultIconHaloBlur;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconHaloBlurAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconHaloBlurTransition;\n    property public final String? defaultIconHaloColor;\n    property @ColorInt public final Integer? defaultIconHaloColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconHaloColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconHaloColorTransition;\n    property public final String? defaultIconHaloColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconHaloColorUseThemeAsExpression;\n    property public final Double? defaultIconHaloWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconHaloWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconHaloWidthTransition;\n    property public final Boolean? defaultIconIgnorePlacement;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconIgnorePlacementAsExpression;\n    property public final String? defaultIconImage;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconImageAsExpression;\n    property public final Double? defaultIconImageCrossFade;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconImageCrossFadeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconImageCrossFadeTransition;\n    property public final Boolean? defaultIconKeepUpright;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconKeepUprightAsExpression;\n    property public final Double? defaultIconOcclusionOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconOcclusionOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconOcclusionOpacityTransition;\n    property public final java.util.List<java.lang.Double>? defaultIconOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconOffsetAsExpression;\n    property public final Double? defaultIconOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconOpacityTransition;\n    property public final Boolean? defaultIconOptional;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconOptionalAsExpression;\n    property public final Double? defaultIconPadding;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconPaddingAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment? defaultIconPitchAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconPitchAlignmentAsExpression;\n    property public final Double? defaultIconRotate;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconRotateAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment? defaultIconRotationAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconRotationAlignmentAsExpression;\n    property public final Double? defaultIconSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconSizeAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultIconSizeScaleRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconSizeScaleRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? defaultIconTextFit;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconTextFitAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultIconTextFitPadding;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconTextFitPaddingAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultIconTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor? defaultIconTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultIconTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultIconTranslateTransition;\n    property public final Double? defaultMaxZoom;\n    property public final Double? defaultMinZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode? defaultOcclusionOpacityMode;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultOcclusionOpacityModeAsExpression;\n    property public final Boolean? defaultSymbolAvoidEdges;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSymbolAvoidEdgesAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference? defaultSymbolElevationReference;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSymbolElevationReferenceAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement? defaultSymbolPlacement;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSymbolPlacementAsExpression;\n    property public final Double? defaultSymbolSortKey;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSymbolSortKeyAsExpression;\n    property public final Double? defaultSymbolSpacing;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSymbolSpacingAsExpression;\n    property public final Boolean? defaultSymbolZElevate;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSymbolZElevateAsExpression;\n    property public final Double? defaultSymbolZOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSymbolZOffsetAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultSymbolZOffsetTransition;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder? defaultSymbolZOrder;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultSymbolZOrderAsExpression;\n    property public final Boolean? defaultTextAllowOverlap;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextAllowOverlapAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? defaultTextAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextAnchorAsExpression;\n    property public final String? defaultTextColor;\n    property @ColorInt public final Integer? defaultTextColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultTextColorTransition;\n    property public final String? defaultTextColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextColorUseThemeAsExpression;\n    property public final Double? defaultTextEmissiveStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextEmissiveStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultTextEmissiveStrengthTransition;\n    property public final com.mapbox.maps.extension.style.types.Formatted? defaultTextField;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextFieldAsExpression;\n    property public final String? defaultTextFieldAsString;\n    property public final java.util.List<java.lang.String>? defaultTextFont;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextFontAsExpression;\n    property public final Double? defaultTextHaloBlur;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextHaloBlurAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultTextHaloBlurTransition;\n    property public final String? defaultTextHaloColor;\n    property @ColorInt public final Integer? defaultTextHaloColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextHaloColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultTextHaloColorTransition;\n    property public final String? defaultTextHaloColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextHaloColorUseThemeAsExpression;\n    property public final Double? defaultTextHaloWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextHaloWidthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultTextHaloWidthTransition;\n    property public final Boolean? defaultTextIgnorePlacement;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextIgnorePlacementAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? defaultTextJustify;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextJustifyAsExpression;\n    property public final Boolean? defaultTextKeepUpright;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextKeepUprightAsExpression;\n    property public final Double? defaultTextLetterSpacing;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextLetterSpacingAsExpression;\n    property public final Double? defaultTextLineHeight;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextLineHeightAsExpression;\n    property public final Double? defaultTextMaxAngle;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextMaxAngleAsExpression;\n    property public final Double? defaultTextMaxWidth;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextMaxWidthAsExpression;\n    property public final Double? defaultTextOcclusionOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextOcclusionOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultTextOcclusionOpacityTransition;\n    property public final java.util.List<java.lang.Double>? defaultTextOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextOffsetAsExpression;\n    property public final Double? defaultTextOpacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextOpacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultTextOpacityTransition;\n    property public final Boolean? defaultTextOptional;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextOptionalAsExpression;\n    property public final Double? defaultTextPadding;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextPaddingAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment? defaultTextPitchAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextPitchAlignmentAsExpression;\n    property public final Double? defaultTextRadialOffset;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextRadialOffsetAsExpression;\n    property public final Double? defaultTextRotate;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextRotateAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment? defaultTextRotationAlignment;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextRotationAlignmentAsExpression;\n    property public final Double? defaultTextSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextSizeAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultTextSizeScaleRange;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextSizeScaleRangeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? defaultTextTransform;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextTransformAsExpression;\n    property public final java.util.List<java.lang.Double>? defaultTextTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor? defaultTextTranslateAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextTranslateAnchorAsExpression;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextTranslateAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? defaultTextTranslateTransition;\n    property public final java.util.List<java.lang.String>? defaultTextVariableAnchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextVariableAnchorAsExpression;\n    property public final java.util.List<java.lang.String>? defaultTextWritingMode;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? defaultTextWritingModeAsExpression;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Visibility? defaultVisibility;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public interface SymbolLayerDsl {\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer filter(com.mapbox.maps.extension.style.expressions.generated.Expression filter);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconAllowOverlap(boolean iconAllowOverlap = false);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconAllowOverlap(com.mapbox.maps.extension.style.expressions.generated.Expression iconAllowOverlap);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor iconAnchor = com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor.CENTER);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression iconAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColor(String iconColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColor(com.mapbox.maps.extension.style.expressions.generated.Expression iconColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColor(@ColorInt int iconColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorBrightnessMax(double iconColorBrightnessMax = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorBrightnessMax(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorBrightnessMax);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorBrightnessMin(double iconColorBrightnessMin = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorBrightnessMin(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorBrightnessMin);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorContrast(double iconColorContrast = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorContrast(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorContrast);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorSaturation(double iconColorSaturation = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorSaturation(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorSaturation);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorSaturationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorSaturationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorUseTheme(String iconColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression iconColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconEmissiveStrength(double iconEmissiveStrength = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression iconEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloBlur(double iconHaloBlur = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloBlur(com.mapbox.maps.extension.style.expressions.generated.Expression iconHaloBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloBlurTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloBlurTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColor(String iconHaloColor = \"rgba(0, 0, 0, 0)\");\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColor(com.mapbox.maps.extension.style.expressions.generated.Expression iconHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColor(@ColorInt int iconHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColorUseTheme(String iconHaloColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression iconHaloColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloWidth(double iconHaloWidth = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloWidth(com.mapbox.maps.extension.style.expressions.generated.Expression iconHaloWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconHaloWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconIgnorePlacement(boolean iconIgnorePlacement = false);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconIgnorePlacement(com.mapbox.maps.extension.style.expressions.generated.Expression iconIgnorePlacement);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImage(String iconImage);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImage(com.mapbox.maps.extension.style.expressions.generated.Expression iconImage);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImageCrossFade(double iconImageCrossFade = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImageCrossFade(com.mapbox.maps.extension.style.expressions.generated.Expression iconImageCrossFade);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImageCrossFadeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconImageCrossFadeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconKeepUpright(boolean iconKeepUpright = false);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconKeepUpright(com.mapbox.maps.extension.style.expressions.generated.Expression iconKeepUpright);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOcclusionOpacity(double iconOcclusionOpacity = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOcclusionOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression iconOcclusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOcclusionOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOcclusionOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOffset(java.util.List<java.lang.Double> iconOffset = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOffset(com.mapbox.maps.extension.style.expressions.generated.Expression iconOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOpacity(double iconOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression iconOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOptional(boolean iconOptional = false);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconOptional(com.mapbox.maps.extension.style.expressions.generated.Expression iconOptional);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconPadding(double iconPadding = 2.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconPadding(com.mapbox.maps.extension.style.expressions.generated.Expression iconPadding);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment iconPitchAlignment = com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment.AUTO);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconPitchAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression iconPitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconRotate(double iconRotate = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconRotate(com.mapbox.maps.extension.style.expressions.generated.Expression iconRotate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconRotationAlignment(com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment iconRotationAlignment = com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment.AUTO);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconRotationAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression iconRotationAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconSize(double iconSize = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconSize(com.mapbox.maps.extension.style.expressions.generated.Expression iconSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconSizeScaleRange(java.util.List<java.lang.Double> iconSizeScaleRange = listOf(0.8, 2.0));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconSizeScaleRange(com.mapbox.maps.extension.style.expressions.generated.Expression iconSizeScaleRange);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTextFit(com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit iconTextFit = com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit.NONE);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTextFit(com.mapbox.maps.extension.style.expressions.generated.Expression iconTextFit);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTextFitPadding(java.util.List<java.lang.Double> iconTextFitPadding = listOf(0.0, 0.0, 0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTextFitPadding(com.mapbox.maps.extension.style.expressions.generated.Expression iconTextFitPadding);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslate(java.util.List<java.lang.Double> iconTranslate = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression iconTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor iconTranslateAnchor = com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor.MAP);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression iconTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer iconTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer maxZoom(double maxZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer minZoom(double minZoom);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer occlusionOpacityMode(com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode occlusionOpacityMode = com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode.ANCHOR);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer occlusionOpacityMode(com.mapbox.maps.extension.style.expressions.generated.Expression occlusionOpacityMode);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer slot(String slot);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer sourceLayer(String sourceLayer);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolAvoidEdges(boolean symbolAvoidEdges = false);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolAvoidEdges(com.mapbox.maps.extension.style.expressions.generated.Expression symbolAvoidEdges);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference symbolElevationReference = com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference.GROUND);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolElevationReference(com.mapbox.maps.extension.style.expressions.generated.Expression symbolElevationReference);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolPlacement(com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement symbolPlacement = com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement.POINT);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolPlacement(com.mapbox.maps.extension.style.expressions.generated.Expression symbolPlacement);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolSortKey(double symbolSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolSortKey(com.mapbox.maps.extension.style.expressions.generated.Expression symbolSortKey);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolSpacing(double symbolSpacing = 250.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolSpacing(com.mapbox.maps.extension.style.expressions.generated.Expression symbolSpacing);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZElevate(boolean symbolZElevate = false);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZElevate(com.mapbox.maps.extension.style.expressions.generated.Expression symbolZElevate);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOffset(double symbolZOffset = 0.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOffset(com.mapbox.maps.extension.style.expressions.generated.Expression symbolZOffset);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOffsetTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOffsetTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOrder(com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder symbolZOrder = com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder.AUTO);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolZOrder(com.mapbox.maps.extension.style.expressions.generated.Expression symbolZOrder);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textAllowOverlap(boolean textAllowOverlap = false);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textAllowOverlap(com.mapbox.maps.extension.style.expressions.generated.Expression textAllowOverlap);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor textAnchor = com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor.CENTER);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression textAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColor(String textColor = \"#000000\");\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColor(com.mapbox.maps.extension.style.expressions.generated.Expression textColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColor(@ColorInt int textColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColorUseTheme(String textColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression textColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textEmissiveStrength(double textEmissiveStrength = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textEmissiveStrength(com.mapbox.maps.extension.style.expressions.generated.Expression textEmissiveStrength);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textEmissiveStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textEmissiveStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textField(com.mapbox.maps.extension.style.types.Formatted textField);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textField(com.mapbox.maps.extension.style.expressions.generated.Expression textField);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textField(String textField);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textField(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.Formatted,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textFont(java.util.List<java.lang.String> textFont = listOf(\"Open Sans Regular\", \"Arial Unicode MS Regular\"));\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textFont(com.mapbox.maps.extension.style.expressions.generated.Expression textFont);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloBlur(double textHaloBlur = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloBlur(com.mapbox.maps.extension.style.expressions.generated.Expression textHaloBlur);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloBlurTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloBlurTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColor(String textHaloColor = \"rgba(0, 0, 0, 0)\");\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColor(com.mapbox.maps.extension.style.expressions.generated.Expression textHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColor(@ColorInt int textHaloColor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColorUseTheme(String textHaloColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression textHaloColorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloWidth(double textHaloWidth = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloWidth(com.mapbox.maps.extension.style.expressions.generated.Expression textHaloWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloWidthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textHaloWidthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textIgnorePlacement(boolean textIgnorePlacement = false);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textIgnorePlacement(com.mapbox.maps.extension.style.expressions.generated.Expression textIgnorePlacement);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textJustify(com.mapbox.maps.extension.style.layers.properties.generated.TextJustify textJustify = com.mapbox.maps.extension.style.layers.properties.generated.TextJustify.CENTER);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textJustify(com.mapbox.maps.extension.style.expressions.generated.Expression textJustify);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textKeepUpright(boolean textKeepUpright = true);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textKeepUpright(com.mapbox.maps.extension.style.expressions.generated.Expression textKeepUpright);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textLetterSpacing(double textLetterSpacing = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textLetterSpacing(com.mapbox.maps.extension.style.expressions.generated.Expression textLetterSpacing);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textLineHeight(double textLineHeight = 1.2);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textLineHeight(com.mapbox.maps.extension.style.expressions.generated.Expression textLineHeight);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textMaxAngle(double textMaxAngle = 45.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textMaxAngle(com.mapbox.maps.extension.style.expressions.generated.Expression textMaxAngle);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textMaxWidth(double textMaxWidth = 10.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textMaxWidth(com.mapbox.maps.extension.style.expressions.generated.Expression textMaxWidth);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOcclusionOpacity(double textOcclusionOpacity = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOcclusionOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression textOcclusionOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOcclusionOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOcclusionOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOffset(java.util.List<java.lang.Double> textOffset = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOffset(com.mapbox.maps.extension.style.expressions.generated.Expression textOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOpacity(double textOpacity = 1.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOpacity(com.mapbox.maps.extension.style.expressions.generated.Expression textOpacity);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOpacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOpacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOptional(boolean textOptional = false);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textOptional(com.mapbox.maps.extension.style.expressions.generated.Expression textOptional);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textPadding(double textPadding = 2.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textPadding(com.mapbox.maps.extension.style.expressions.generated.Expression textPadding);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment textPitchAlignment = com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment.AUTO);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textPitchAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression textPitchAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRadialOffset(double textRadialOffset = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRadialOffset(com.mapbox.maps.extension.style.expressions.generated.Expression textRadialOffset);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRotate(double textRotate = 0.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRotate(com.mapbox.maps.extension.style.expressions.generated.Expression textRotate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRotationAlignment(com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment textRotationAlignment = com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment.AUTO);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textRotationAlignment(com.mapbox.maps.extension.style.expressions.generated.Expression textRotationAlignment);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textSize(double textSize = 16.0);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textSize(com.mapbox.maps.extension.style.expressions.generated.Expression textSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textSizeScaleRange(java.util.List<java.lang.Double> textSizeScaleRange = listOf(0.8, 2.0));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textSizeScaleRange(com.mapbox.maps.extension.style.expressions.generated.Expression textSizeScaleRange);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTransform(com.mapbox.maps.extension.style.layers.properties.generated.TextTransform textTransform = com.mapbox.maps.extension.style.layers.properties.generated.TextTransform.NONE);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTransform(com.mapbox.maps.extension.style.expressions.generated.Expression textTransform);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslate(java.util.List<java.lang.Double> textTranslate = listOf(0.0, 0.0));\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslate(com.mapbox.maps.extension.style.expressions.generated.Expression textTranslate);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor textTranslateAnchor = com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor.MAP);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslateAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression textTranslateAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslateTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textTranslateTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textVariableAnchor(java.util.List<java.lang.String> textVariableAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textVariableAnchor(com.mapbox.maps.extension.style.expressions.generated.Expression textVariableAnchor);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textWritingMode(java.util.List<java.lang.String> textWritingMode);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer textWritingMode(com.mapbox.maps.extension.style.expressions.generated.Expression textWritingMode);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer visibility(com.mapbox.maps.extension.style.layers.properties.generated.Visibility visibility);\n    method public com.mapbox.maps.extension.style.layers.generated.SymbolLayer visibility(com.mapbox.maps.extension.style.expressions.generated.Expression visibility);\n  }\n\n  public final class SymbolLayerKt {\n    method public static com.mapbox.maps.extension.style.layers.generated.SymbolLayer symbolLayer(String layerId, String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.layers.generated.SymbolLayerDsl,kotlin.Unit> block);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.layers.properties {\n\n  public class PropertyValue<T> {\n    method @ColorInt public final Integer? getColorInt();\n    method public final String getPropertyName();\n    method public final T! getPropertyValue();\n    method public final com.mapbox.bindgen.Value getValue();\n    method public final T? getValue();\n    method public final boolean isExpression();\n    method public final boolean isTransition();\n    method public final boolean isValue();\n    property @ColorInt public final Integer? colorInt;\n    property public final boolean isExpression;\n    property public final boolean isTransition;\n    property public final boolean isValue;\n    property public final String propertyName;\n    property public final T! propertyValue;\n    property public final com.mapbox.bindgen.Value value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.PropertyValue.Companion Companion;\n  }\n\n  public static final class PropertyValue.Companion {\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.layers.properties.generated {\n\n  public final class Anchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.Anchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.Anchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.Anchor MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.Anchor VIEWPORT;\n  }\n\n  public static final class Anchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Anchor valueOf(String value);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class BackgroundPitchAlignment {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment VIEWPORT;\n  }\n\n  public static final class BackgroundPitchAlignment.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.BackgroundPitchAlignment valueOf(String value);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class CircleElevationReference {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference NONE;\n  }\n\n  public static final class CircleElevationReference.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference valueOf(String value);\n  }\n\n  public final class CirclePitchAlignment {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment VIEWPORT;\n  }\n\n  public static final class CirclePitchAlignment.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment valueOf(String value);\n  }\n\n  public final class CirclePitchScale {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale VIEWPORT;\n  }\n\n  public static final class CirclePitchScale.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale valueOf(String value);\n  }\n\n  public final class CircleTranslateAnchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor VIEWPORT;\n  }\n\n  public static final class CircleTranslateAnchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor valueOf(String value);\n  }\n\n  public final class ClipLayerTypes {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.ClipLayerTypes valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ClipLayerTypes.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ClipLayerTypes MODEL;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ClipLayerTypes SYMBOL;\n  }\n\n  public static final class ClipLayerTypes.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ClipLayerTypes valueOf(String value);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class FillElevationReference {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference HD_ROAD_BASE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference NONE;\n  }\n\n  public static final class FillElevationReference.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference valueOf(String value);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class FillExtrusionBaseAlignment {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment FLAT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment TERRAIN;\n  }\n\n  public static final class FillExtrusionBaseAlignment.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionBaseAlignment valueOf(String value);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class FillExtrusionHeightAlignment {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment FLAT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment TERRAIN;\n  }\n\n  public static final class FillExtrusionHeightAlignment.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionHeightAlignment valueOf(String value);\n  }\n\n  public final class FillExtrusionTranslateAnchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor VIEWPORT;\n  }\n\n  public static final class FillExtrusionTranslateAnchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillExtrusionTranslateAnchor valueOf(String value);\n  }\n\n  public final class FillTranslateAnchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor VIEWPORT;\n  }\n\n  public static final class FillTranslateAnchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor valueOf(String value);\n  }\n\n  public final class HillshadeIlluminationAnchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor VIEWPORT;\n  }\n\n  public static final class HillshadeIlluminationAnchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.HillshadeIlluminationAnchor valueOf(String value);\n  }\n\n  public final class IconAnchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor BOTTOM;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor BOTTOM_LEFT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor BOTTOM_RIGHT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor CENTER;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor LEFT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor RIGHT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor TOP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor TOP_LEFT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor TOP_RIGHT;\n  }\n\n  public static final class IconAnchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor valueOf(String value);\n  }\n\n  public final class IconPitchAlignment {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment AUTO;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment VIEWPORT;\n  }\n\n  public static final class IconPitchAlignment.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment valueOf(String value);\n  }\n\n  public final class IconRotationAlignment {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment AUTO;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment VIEWPORT;\n  }\n\n  public static final class IconRotationAlignment.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment valueOf(String value);\n  }\n\n  public final class IconTextFit {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit BOTH;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit HEIGHT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit NONE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit WIDTH;\n  }\n\n  public static final class IconTextFit.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit valueOf(String value);\n  }\n\n  public final class IconTranslateAnchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor VIEWPORT;\n  }\n\n  public static final class IconTranslateAnchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor valueOf(String value);\n  }\n\n  public final class LineCap {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.LineCap valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineCap BUTT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineCap.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineCap ROUND;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineCap SQUARE;\n  }\n\n  public static final class LineCap.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineCap valueOf(String value);\n  }\n\n  public final class LineElevationReference {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference GROUND;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference NONE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference SEA;\n  }\n\n  public static final class LineElevationReference.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference valueOf(String value);\n  }\n\n  public final class LineJoin {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.LineJoin valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin BEVEL;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin MITER;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin NONE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin ROUND;\n  }\n\n  public static final class LineJoin.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineJoin valueOf(String value);\n  }\n\n  public final class LineTranslateAnchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor VIEWPORT;\n  }\n\n  public static final class LineTranslateAnchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor valueOf(String value);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class LineWidthUnit {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit METERS;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit PIXELS;\n  }\n\n  public static final class LineWidthUnit.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit valueOf(String value);\n  }\n\n  public final class ModelElevationReference {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference GROUND;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference SEA;\n  }\n\n  public static final class ModelElevationReference.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ModelElevationReference valueOf(String value);\n  }\n\n  public final class ModelScaleMode {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode VIEWPORT;\n  }\n\n  public static final class ModelScaleMode.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ModelScaleMode valueOf(String value);\n  }\n\n  public final class ModelType {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.ModelType valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelType COMMON_3D;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelType.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ModelType LOCATION_INDICATOR;\n  }\n\n  public static final class ModelType.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ModelType valueOf(String value);\n  }\n\n  public final class OcclusionOpacityMode {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode ANCHOR;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode PIXEL;\n  }\n\n  public static final class OcclusionOpacityMode.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode valueOf(String value);\n  }\n\n  public final class ProjectionName {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName GLOBE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName MERCATOR;\n  }\n\n  public static final class ProjectionName.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName valueOf(String value);\n  }\n\n  public final class RasterResampling {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling LINEAR;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling NEAREST;\n  }\n\n  public static final class RasterResampling.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.RasterResampling valueOf(String value);\n  }\n\n  public final class SkyType {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.SkyType valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SkyType ATMOSPHERE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SkyType.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SkyType GRADIENT;\n  }\n\n  public static final class SkyType.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SkyType valueOf(String value);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class SymbolElevationReference {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference GROUND;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference HD_ROAD_MARKUP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference SEA;\n  }\n\n  public static final class SymbolElevationReference.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference valueOf(String value);\n  }\n\n  public final class SymbolPlacement {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement LINE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement LINE_CENTER;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement POINT;\n  }\n\n  public static final class SymbolPlacement.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement valueOf(String value);\n  }\n\n  public final class SymbolZOrder {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder AUTO;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder SOURCE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder VIEWPORT_Y;\n  }\n\n  public static final class SymbolZOrder.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder valueOf(String value);\n  }\n\n  public final class TextAnchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor BOTTOM;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor BOTTOM_LEFT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor BOTTOM_RIGHT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor CENTER;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor LEFT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor RIGHT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor TOP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor TOP_LEFT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor TOP_RIGHT;\n  }\n\n  public static final class TextAnchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor valueOf(String value);\n  }\n\n  public final class TextJustify {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.TextJustify valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify AUTO;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify CENTER;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify LEFT;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify RIGHT;\n  }\n\n  public static final class TextJustify.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextJustify valueOf(String value);\n  }\n\n  public final class TextPitchAlignment {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment AUTO;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment VIEWPORT;\n  }\n\n  public static final class TextPitchAlignment.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment valueOf(String value);\n  }\n\n  public final class TextRotationAlignment {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment AUTO;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment VIEWPORT;\n  }\n\n  public static final class TextRotationAlignment.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment valueOf(String value);\n  }\n\n  public final class TextTransform {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.TextTransform valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform LOWERCASE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform NONE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform UPPERCASE;\n  }\n\n  public static final class TextTransform.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTransform valueOf(String value);\n  }\n\n  public final class TextTranslateAnchor {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor MAP;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor VIEWPORT;\n  }\n\n  public static final class TextTranslateAnchor.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor valueOf(String value);\n  }\n\n  public final class TextWritingMode {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.TextWritingMode valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextWritingMode.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextWritingMode HORIZONTAL;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.TextWritingMode VERTICAL;\n  }\n\n  public static final class TextWritingMode.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextWritingMode valueOf(String value);\n  }\n\n  public final class Visibility {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.layers.properties.generated.Visibility valueOf(String value);\n    property public String value;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.Visibility.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.Visibility NONE;\n    field public static final com.mapbox.maps.extension.style.layers.properties.generated.Visibility VISIBLE;\n  }\n\n  public static final class Visibility.Companion {\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Visibility valueOf(String value);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.light {\n\n  public final class DynamicLight implements com.mapbox.maps.extension.style.StyleContract.StyleLightExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  public abstract class Light {\n    method public abstract String getLightId();\n    property public abstract String lightId;\n    field public static final com.mapbox.maps.extension.style.light.Light.Companion Companion;\n  }\n\n  public static final class Light.Companion {\n  }\n\n  @com.mapbox.maps.extension.style.types.LightDsl public final class LightPosition {\n    ctor public LightPosition(double radialCoordinate, double azimuthalAngle, double polarAngle);\n    method public com.mapbox.maps.extension.style.light.LightPosition copy(double radialCoordinate, double azimuthalAngle, double polarAngle);\n    method public double[] toDoubleArray();\n    method public java.util.List<java.lang.Double> toList();\n    method public com.mapbox.bindgen.Value toValue();\n    field public static final com.mapbox.maps.extension.style.light.LightPosition.Companion Companion;\n  }\n\n  public static final class LightPosition.Companion {\n    method public com.mapbox.maps.extension.style.light.LightPosition fromArray(double[] positionArray);\n    method public com.mapbox.maps.extension.style.light.LightPosition fromList(java.util.List<java.lang.Double> positionList);\n  }\n\n  public final class LightUtils {\n    method public static com.mapbox.maps.extension.style.light.DynamicLight dynamicLight(com.mapbox.maps.extension.style.light.generated.AmbientLight ambientLight, com.mapbox.maps.extension.style.light.generated.DirectionalLight directionalLight);\n    method public static com.mapbox.maps.extension.style.light.Light? getLight(com.mapbox.maps.MapboxStyleManager, String lightId);\n    method public static void setLight(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.light.generated.AmbientLight ambientLight, com.mapbox.maps.extension.style.light.generated.DirectionalLight directionalLight);\n    method public static void setLight(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.light.generated.FlatLight flatLight);\n    method public static void setLights(com.mapbox.maps.MapboxStyleManager, java.util.List<? extends com.mapbox.maps.extension.style.light.Light> lights);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.light.generated {\n\n  @UiThread public final class AmbientLight extends com.mapbox.maps.extension.style.light.Light implements com.mapbox.maps.extension.style.light.generated.AmbientLightDslReceiver {\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight color(@ColorInt int color);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight color(String color);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.AmbientLight colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.AmbientLight colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method public String? getColor();\n    method @ColorInt public Integer? getColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getColorTransition();\n    method public String? getColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorUseThemeAsExpression();\n    method public Double? getIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIntensityTransition();\n    method public String getLightId();\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight intensity(double intensity);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    property public final String? color;\n    property @ColorInt public final Integer? colorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? colorTransition;\n    property public final String? colorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorUseThemeAsExpression;\n    property public final Double? intensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? intensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? intensityTransition;\n    property public String lightId;\n  }\n\n  @com.mapbox.maps.extension.style.types.LightDsl public interface AmbientLightDslReceiver {\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight color(@ColorInt int color);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight color(String color = \"#ffffff\");\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.AmbientLight colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.AmbientLight colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight intensity(double intensity = 0.5);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.AmbientLight intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n  }\n\n  public final class AmbientLightKt {\n    method public static com.mapbox.maps.extension.style.light.generated.AmbientLight ambientLight(String id = \"ambient\", kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.light.generated.AmbientLightDslReceiver,kotlin.Unit> block);\n  }\n\n  @UiThread public final class DirectionalLight extends com.mapbox.maps.extension.style.light.Light implements com.mapbox.maps.extension.style.light.generated.DirectionalLightDslReceiver {\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight castShadows(boolean castShadows);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight castShadows(com.mapbox.maps.extension.style.expressions.generated.Expression castShadows);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight color(@ColorInt int color);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight color(String color);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.DirectionalLight colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.DirectionalLight colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight direction(java.util.List<java.lang.Double> direction);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight direction(com.mapbox.maps.extension.style.expressions.generated.Expression direction);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight directionTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight directionTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public Boolean? getCastShadows();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCastShadowsAsExpression();\n    method public String? getColor();\n    method @ColorInt public Integer? getColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getColorTransition();\n    method public String? getColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorUseThemeAsExpression();\n    method public java.util.List<java.lang.Double>? getDirection();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDirectionAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDirectionTransition();\n    method public Double? getIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIntensityTransition();\n    method public String getLightId();\n    method public String? getShadowDrawBeforeLayer();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getShadowDrawBeforeLayerAsExpression();\n    method public Double? getShadowIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getShadowIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getShadowIntensityTransition();\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight intensity(double intensity);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowDrawBeforeLayer(String shadowDrawBeforeLayer);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowDrawBeforeLayer(com.mapbox.maps.extension.style.expressions.generated.Expression shadowDrawBeforeLayer);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowIntensity(double shadowIntensity);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression shadowIntensity);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    property public final Boolean? castShadows;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? castShadowsAsExpression;\n    property public final String? color;\n    property @ColorInt public final Integer? colorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? colorTransition;\n    property public final String? colorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorUseThemeAsExpression;\n    property public final java.util.List<java.lang.Double>? direction;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? directionAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? directionTransition;\n    property public final Double? intensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? intensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? intensityTransition;\n    property public String lightId;\n    property public final String? shadowDrawBeforeLayer;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? shadowDrawBeforeLayerAsExpression;\n    property public final Double? shadowIntensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? shadowIntensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? shadowIntensityTransition;\n  }\n\n  @com.mapbox.maps.extension.style.types.LightDsl public interface DirectionalLightDslReceiver {\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight castShadows(boolean castShadows = false);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight castShadows(com.mapbox.maps.extension.style.expressions.generated.Expression castShadows);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight color(@ColorInt int color);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight color(String color = \"#ffffff\");\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.DirectionalLight colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.DirectionalLight colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight direction(java.util.List<java.lang.Double> direction = listOf(210.0, 30.0));\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight direction(com.mapbox.maps.extension.style.expressions.generated.Expression direction);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight directionTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight directionTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight intensity(double intensity = 0.5);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowDrawBeforeLayer(String shadowDrawBeforeLayer);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowDrawBeforeLayer(com.mapbox.maps.extension.style.expressions.generated.Expression shadowDrawBeforeLayer);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowIntensity(double shadowIntensity = 1.0);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowIntensity(com.mapbox.maps.extension.style.expressions.generated.Expression shadowIntensity);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowIntensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.DirectionalLight shadowIntensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n  }\n\n  public final class DirectionalLightKt {\n    method public static com.mapbox.maps.extension.style.light.generated.DirectionalLight directionalLight(String id = \"directional\", kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.light.generated.DirectionalLightDslReceiver,kotlin.Unit> block);\n  }\n\n  @UiThread public final class FlatLight extends com.mapbox.maps.extension.style.light.Light implements com.mapbox.maps.extension.style.light.generated.FlatLightDslReceiver com.mapbox.maps.extension.style.StyleContract.StyleLightExtension {\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight anchor(com.mapbox.maps.extension.style.layers.properties.generated.Anchor anchor);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight anchor(com.mapbox.maps.extension.style.expressions.generated.Expression anchor);\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight color(@ColorInt int color);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight color(String color);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.FlatLight colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.FlatLight colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method public com.mapbox.maps.extension.style.layers.properties.generated.Anchor? getAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getAnchorAsExpression();\n    method public String? getColor();\n    method @ColorInt public Integer? getColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getColorTransition();\n    method public String? getColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorUseThemeAsExpression();\n    method public Double? getIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIntensityTransition();\n    method public String getLightId();\n    method public com.mapbox.maps.extension.style.light.LightPosition? getPosition();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getPositionAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getPositionTransition();\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight intensity(double intensity);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight position(double radialCoordinate, double azimuthalAngle, double polarAngle);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight position(com.mapbox.maps.extension.style.light.LightPosition position);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight position(com.mapbox.maps.extension.style.expressions.generated.Expression position);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight positionTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight positionTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.Anchor? anchor;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? anchorAsExpression;\n    property public final String? color;\n    property @ColorInt public final Integer? colorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? colorTransition;\n    property public final String? colorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorUseThemeAsExpression;\n    property public final Double? intensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? intensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? intensityTransition;\n    property public String lightId;\n    property public final com.mapbox.maps.extension.style.light.LightPosition? position;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? positionAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? positionTransition;\n  }\n\n  @com.mapbox.maps.extension.style.types.LightDsl public interface FlatLightDslReceiver {\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight anchor(com.mapbox.maps.extension.style.layers.properties.generated.Anchor anchor = com.mapbox.maps.extension.style.layers.properties.generated.Anchor.VIEWPORT);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight anchor(com.mapbox.maps.extension.style.expressions.generated.Expression anchor);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight color(@ColorInt int color);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight color(String color = \"#ffffff\");\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.FlatLight colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.light.generated.FlatLight colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight intensity(double intensity = 0.5);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight position(double radialCoordinate, double azimuthalAngle, double polarAngle);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight position(com.mapbox.maps.extension.style.light.LightPosition position = com.mapbox.maps.extension.style.light.LightPosition(1.15, 210.0, 30.0));\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight position(com.mapbox.maps.extension.style.expressions.generated.Expression position);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight positionTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.light.generated.FlatLight positionTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n  }\n\n  public final class FlatLightKt {\n    method public static com.mapbox.maps.extension.style.light.generated.FlatLight flatLight(String id = \"flat\", kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.light.generated.FlatLightDslReceiver,kotlin.Unit> block);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.model {\n\n  @com.mapbox.maps.MapboxExperimental public final class ModelExtensionImpl implements com.mapbox.maps.extension.style.StyleContract.StyleModelExtension {\n    ctor public ModelExtensionImpl(com.mapbox.maps.extension.style.model.ModelExtensionImpl.Builder builder);\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public static final class ModelExtensionImpl.Builder {\n    ctor public ModelExtensionImpl.Builder(String modelId);\n    method public com.mapbox.maps.extension.style.model.ModelExtensionImpl build();\n    method public String getModelId();\n    method public com.mapbox.maps.extension.style.model.ModelExtensionImpl.Builder uri(String uri);\n    property public final String modelId;\n  }\n\n  public final class ModelUtils {\n    method @com.mapbox.maps.MapboxExperimental public static void addModel(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleModelExtension model);\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.model.ModelExtensionImpl model(String modelId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.model.ModelExtensionImpl.Builder,kotlin.Unit> block);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.precipitations.generated {\n\n  @UiThread @com.mapbox.maps.MapboxExperimental public final class Rain implements com.mapbox.maps.extension.style.precipitations.generated.RainDslReceiver com.mapbox.maps.extension.style.StyleContract.StyleRainExtension {\n    ctor public Rain();\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain centerThinning(double centerThinning);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain centerThinning(com.mapbox.maps.extension.style.expressions.generated.Expression centerThinning);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain centerThinningTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain centerThinningTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain color(@ColorInt int color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain color(String color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain density(double density);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain density(com.mapbox.maps.extension.style.expressions.generated.Expression density);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain densityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain densityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain direction(java.util.List<java.lang.Double> direction);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain direction(com.mapbox.maps.extension.style.expressions.generated.Expression direction);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain directionTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain directionTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain distortionStrength(double distortionStrength);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain distortionStrength(com.mapbox.maps.extension.style.expressions.generated.Expression distortionStrength);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain distortionStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain distortionStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain dropletSize(java.util.List<java.lang.Double> dropletSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain dropletSize(com.mapbox.maps.extension.style.expressions.generated.Expression dropletSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain dropletSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain dropletSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public Double? getCenterThinning();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCenterThinningAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCenterThinningTransition();\n    method public String? getColor();\n    method @ColorInt public Integer? getColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getColorTransition();\n    method public String? getColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorUseThemeAsExpression();\n    method public Double? getDensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDensityTransition();\n    method public java.util.List<java.lang.Double>? getDirection();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDirectionAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDirectionTransition();\n    method public Double? getDistortionStrength();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDistortionStrengthAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDistortionStrengthTransition();\n    method public java.util.List<java.lang.Double>? getDropletSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDropletSizeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDropletSizeTransition();\n    method public Double? getIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIntensityTransition();\n    method public Double? getOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getOpacityTransition();\n    method public Double? getVignette();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVignetteAsExpression();\n    method public String? getVignetteColor();\n    method @ColorInt public Integer? getVignetteColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVignetteColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getVignetteColorTransition();\n    method public String? getVignetteColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVignetteColorUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getVignetteTransition();\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain intensity(double intensity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain opacity(double opacity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain opacity(com.mapbox.maps.extension.style.expressions.generated.Expression opacity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain opacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain opacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignette(double vignette);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignette(com.mapbox.maps.extension.style.expressions.generated.Expression vignette);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColor(@ColorInt int vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColor(String vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColor(com.mapbox.maps.extension.style.expressions.generated.Expression vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColorUseTheme(String vignetteColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression vignetteColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    property public final Double? centerThinning;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? centerThinningAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? centerThinningTransition;\n    property public final String? color;\n    property @ColorInt public final Integer? colorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? colorTransition;\n    property public final String? colorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorUseThemeAsExpression;\n    property public final Double? density;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? densityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? densityTransition;\n    property public final java.util.List<java.lang.Double>? direction;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? directionAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? directionTransition;\n    property public final Double? distortionStrength;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? distortionStrengthAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? distortionStrengthTransition;\n    property public final java.util.List<java.lang.Double>? dropletSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? dropletSizeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? dropletSizeTransition;\n    property public final Double? intensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? intensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? intensityTransition;\n    property public final Double? opacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? opacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? opacityTransition;\n    property public final Double? vignette;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? vignetteAsExpression;\n    property public final String? vignetteColor;\n    property @ColorInt public final Integer? vignetteColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? vignetteColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? vignetteColorTransition;\n    property public final String? vignetteColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? vignetteColorUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? vignetteTransition;\n  }\n\n  @com.mapbox.maps.MapboxExperimental @com.mapbox.maps.extension.style.types.RainDsl public interface RainDslReceiver {\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain centerThinning(double centerThinning = 0.57);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain centerThinning(com.mapbox.maps.extension.style.expressions.generated.Expression centerThinning);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain centerThinningTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain centerThinningTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain color(@ColorInt int color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain color(String color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain color(com.mapbox.maps.extension.style.expressions.generated.Expression color = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"measure-light\" + \"\\\"\" + \",\" + \"\\\"\" + \"brightness\" + \"\\\"\" + \"],0,\" + \"\\\"\" + \"#03113d\" + \"\\\"\" + \",0.3,\" + \"\\\"\" + \"#a8adbc\" + \"\\\"\" + \"]\".trimIndent()));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain density(double density);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain density(com.mapbox.maps.extension.style.expressions.generated.Expression density = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"zoom\" + \"\\\"\" + \"],11,0,13,0.5]\".trimIndent()));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain densityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain densityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain direction(java.util.List<java.lang.Double> direction = listOf(0.0, 80.0));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain direction(com.mapbox.maps.extension.style.expressions.generated.Expression direction);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain directionTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain directionTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain distortionStrength(double distortionStrength = 0.7);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain distortionStrength(com.mapbox.maps.extension.style.expressions.generated.Expression distortionStrength);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain distortionStrengthTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain distortionStrengthTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain dropletSize(java.util.List<java.lang.Double> dropletSize = listOf(2.6, 18.2));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain dropletSize(com.mapbox.maps.extension.style.expressions.generated.Expression dropletSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain dropletSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain dropletSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain intensity(double intensity = 1.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain opacity(double opacity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain opacity(com.mapbox.maps.extension.style.expressions.generated.Expression opacity = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"measure-light\" + \"\\\"\" + \",\" + \"\\\"\" + \"brightness\" + \"\\\"\" + \"],0,0.88,1,0.7]\".trimIndent()));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain opacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain opacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignette(double vignette);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignette(com.mapbox.maps.extension.style.expressions.generated.Expression vignette = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"zoom\" + \"\\\"\" + \"],11,0,13,1]\".trimIndent()));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColor(@ColorInt int vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColor(String vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColor(com.mapbox.maps.extension.style.expressions.generated.Expression vignetteColor = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"measure-light\" + \"\\\"\" + \",\" + \"\\\"\" + \"brightness\" + \"\\\"\" + \"],0,\" + \"\\\"\" + \"#001736\" + \"\\\"\" + \",0.3,\" + \"\\\"\" + \"#464646\" + \"\\\"\" + \"]\".trimIndent()));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColorUseTheme(String vignetteColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression vignetteColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Rain vignetteTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n  }\n\n  public final class RainKt {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.precipitations.generated.Rain rain(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.precipitations.generated.RainDslReceiver,kotlin.Unit> block);\n  }\n\n  public final class RainUtils {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.precipitations.generated.Rain getRain(com.mapbox.maps.MapboxStyleManager);\n    method @com.mapbox.maps.MapboxExperimental public static void removeRain(com.mapbox.maps.MapboxStyleManager);\n    method @com.mapbox.maps.MapboxExperimental public static void setRain(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleRainExtension rain);\n  }\n\n  @UiThread @com.mapbox.maps.MapboxExperimental public final class Snow implements com.mapbox.maps.extension.style.precipitations.generated.SnowDslReceiver com.mapbox.maps.extension.style.StyleContract.StyleSnowExtension {\n    ctor public Snow();\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow centerThinning(double centerThinning);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow centerThinning(com.mapbox.maps.extension.style.expressions.generated.Expression centerThinning);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow centerThinningTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow centerThinningTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow color(@ColorInt int color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow color(String color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow density(double density);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow density(com.mapbox.maps.extension.style.expressions.generated.Expression density);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow densityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow densityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow direction(java.util.List<java.lang.Double> direction);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow direction(com.mapbox.maps.extension.style.expressions.generated.Expression direction);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow directionTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow directionTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow flakeSize(double flakeSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow flakeSize(com.mapbox.maps.extension.style.expressions.generated.Expression flakeSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow flakeSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow flakeSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public Double? getCenterThinning();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getCenterThinningAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getCenterThinningTransition();\n    method public String? getColor();\n    method @ColorInt public Integer? getColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getColorTransition();\n    method public String? getColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getColorUseThemeAsExpression();\n    method public Double? getDensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDensityTransition();\n    method public java.util.List<java.lang.Double>? getDirection();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getDirectionAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getDirectionTransition();\n    method public Double? getFlakeSize();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getFlakeSizeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getFlakeSizeTransition();\n    method public Double? getIntensity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getIntensityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getIntensityTransition();\n    method public Double? getOpacity();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getOpacityAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getOpacityTransition();\n    method public Double? getVignette();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVignetteAsExpression();\n    method public String? getVignetteColor();\n    method @ColorInt public Integer? getVignetteColorAsColorInt();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVignetteColorAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getVignetteColorTransition();\n    method public String? getVignetteColorUseTheme();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getVignetteColorUseThemeAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getVignetteTransition();\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow intensity(double intensity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow opacity(double opacity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow opacity(com.mapbox.maps.extension.style.expressions.generated.Expression opacity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow opacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow opacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignette(double vignette);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignette(com.mapbox.maps.extension.style.expressions.generated.Expression vignette);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColor(@ColorInt int vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColor(String vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColor(com.mapbox.maps.extension.style.expressions.generated.Expression vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColorUseTheme(String vignetteColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression vignetteColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    property public final Double? centerThinning;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? centerThinningAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? centerThinningTransition;\n    property public final String? color;\n    property @ColorInt public final Integer? colorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? colorTransition;\n    property public final String? colorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? colorUseThemeAsExpression;\n    property public final Double? density;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? densityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? densityTransition;\n    property public final java.util.List<java.lang.Double>? direction;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? directionAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? directionTransition;\n    property public final Double? flakeSize;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? flakeSizeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? flakeSizeTransition;\n    property public final Double? intensity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? intensityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? intensityTransition;\n    property public final Double? opacity;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? opacityAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? opacityTransition;\n    property public final Double? vignette;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? vignetteAsExpression;\n    property public final String? vignetteColor;\n    property @ColorInt public final Integer? vignetteColorAsColorInt;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? vignetteColorAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? vignetteColorTransition;\n    property public final String? vignetteColorUseTheme;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? vignetteColorUseThemeAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? vignetteTransition;\n  }\n\n  @com.mapbox.maps.MapboxExperimental @com.mapbox.maps.extension.style.types.SnowDsl public interface SnowDslReceiver {\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow centerThinning(double centerThinning = 0.4);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow centerThinning(com.mapbox.maps.extension.style.expressions.generated.Expression centerThinning);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow centerThinningTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow centerThinningTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow color(@ColorInt int color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow color(String color = \"#ffffff\");\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow color(com.mapbox.maps.extension.style.expressions.generated.Expression color);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow colorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow colorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow colorUseTheme(String colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow colorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression colorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow density(double density);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow density(com.mapbox.maps.extension.style.expressions.generated.Expression density = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"zoom\" + \"\\\"\" + \"],11,0,13,0.85]\".trimIndent()));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow densityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow densityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow direction(java.util.List<java.lang.Double> direction = listOf(0.0, 50.0));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow direction(com.mapbox.maps.extension.style.expressions.generated.Expression direction);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow directionTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow directionTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow flakeSize(double flakeSize = 0.71);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow flakeSize(com.mapbox.maps.extension.style.expressions.generated.Expression flakeSize);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow flakeSizeTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow flakeSizeTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow intensity(double intensity = 1.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow intensity(com.mapbox.maps.extension.style.expressions.generated.Expression intensity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow intensityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow intensityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow opacity(double opacity = 1.0);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow opacity(com.mapbox.maps.extension.style.expressions.generated.Expression opacity);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow opacityTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow opacityTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignette(double vignette);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignette(com.mapbox.maps.extension.style.expressions.generated.Expression vignette = Expression.fromRaw(\"[\" + \"\\\"\" + \"interpolate\" + \"\\\"\" + \",[\" + \"\\\"\" + \"linear\" + \"\\\"\" + \"],[\" + \"\\\"\" + \"zoom\" + \"\\\"\" + \"],11,0,13,0.3]\".trimIndent()));\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColor(@ColorInt int vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColor(String vignetteColor = \"#ffffff\");\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColor(com.mapbox.maps.extension.style.expressions.generated.Expression vignetteColor);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColorTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColorTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColorUseTheme(String vignetteColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteColorUseTheme(com.mapbox.maps.extension.style.expressions.generated.Expression vignetteColorUseTheme);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.precipitations.generated.Snow vignetteTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n  }\n\n  public final class SnowKt {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.precipitations.generated.Snow snow(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.precipitations.generated.SnowDslReceiver,kotlin.Unit> block);\n  }\n\n  public final class SnowUtils {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.precipitations.generated.Snow getSnow(com.mapbox.maps.MapboxStyleManager);\n    method @com.mapbox.maps.MapboxExperimental public static void removeSnow(com.mapbox.maps.MapboxStyleManager);\n    method @com.mapbox.maps.MapboxExperimental public static void setSnow(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleSnowExtension snow);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.projection.generated {\n\n  @UiThread public final class Projection implements com.mapbox.maps.extension.style.StyleContract.StyleProjectionExtension {\n    ctor public Projection(com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName name);\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n    method public com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName getName();\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName name;\n  }\n\n  public final class ProjectionKt {\n    method public static com.mapbox.maps.extension.style.projection.generated.Projection projection(com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName name);\n  }\n\n  public final class StyleProjectionUtils {\n    method public static com.mapbox.maps.extension.style.projection.generated.Projection? getProjection(com.mapbox.maps.MapboxStyleManager);\n    method public static void setProjection(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.projection.generated.Projection projection);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.sources {\n\n  public final class CustomGeometrySource extends com.mapbox.maps.extension.style.sources.Source {\n    ctor public CustomGeometrySource(String id, com.mapbox.maps.CustomGeometrySourceOptions options);\n    method public Long? getMaxOverscaleFactorForParentTiles();\n    method public com.mapbox.maps.TileCacheBudget? getTileCacheBudget();\n    method @Deprecated public void invalidRegion(com.mapbox.maps.CoordinateBounds coordinateBounds);\n    method @Deprecated public void invalidTile(com.mapbox.maps.CanonicalTileID tileID);\n    method public void invalidateRegion(com.mapbox.maps.CoordinateBounds coordinateBounds);\n    method public void invalidateTile(com.mapbox.maps.CanonicalTileID tileID);\n    method public void setMaxOverscaleFactorForParentTiles(long value);\n    method public void setTileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public void setTileData(com.mapbox.maps.CanonicalTileID tileID, java.util.List<com.mapbox.geojson.Feature> featureCollection);\n    property public final Long? maxOverscaleFactorForParentTiles;\n    property public final com.mapbox.maps.TileCacheBudget? tileCacheBudget;\n  }\n\n  public final class CustomGeometrySourceKt {\n    method public static com.mapbox.maps.extension.style.sources.CustomGeometrySource customGeometrySource(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.CustomGeometrySourceOptions.Builder,kotlin.Unit> block);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class CustomRasterSource extends com.mapbox.maps.extension.style.sources.Source {\n    ctor public CustomRasterSource(String id, com.mapbox.maps.CustomRasterSourceOptions options);\n    method public Long? getMaxOverscaleFactorForParentTiles();\n    method public void setMaxOverscaleFactorForParentTiles(long value);\n    method public void setTileData(java.util.List<com.mapbox.maps.CustomRasterSourceTileData> tileData);\n    property public final Long? maxOverscaleFactorForParentTiles;\n  }\n\n  public final class CustomRasterSourceKt {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.sources.CustomRasterSource customRasterSource(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.CustomRasterSourceOptions.Builder,kotlin.Unit> block);\n  }\n\n  public final class GeoJsonSourceUtils {\n    method public static void addGeoJSONSourceFeatures(com.mapbox.maps.extension.style.sources.generated.GeoJsonSource, java.util.List<com.mapbox.geojson.Feature> features, String dataId = \"\");\n    method public static void addGeoJSONSourceFeatures(com.mapbox.maps.extension.style.sources.generated.GeoJsonSource, java.util.List<com.mapbox.geojson.Feature> features);\n    method public static void removeGeoJSONSourceFeatures(com.mapbox.maps.extension.style.sources.generated.GeoJsonSource, java.util.List<java.lang.String> featureIds, String dataId = \"\");\n    method public static void removeGeoJSONSourceFeatures(com.mapbox.maps.extension.style.sources.generated.GeoJsonSource, java.util.List<java.lang.String> featureIds);\n    method public static void updateGeoJSONSourceFeatures(com.mapbox.maps.extension.style.sources.generated.GeoJsonSource, java.util.List<com.mapbox.geojson.Feature> features, String dataId = \"\");\n    method public static void updateGeoJSONSourceFeatures(com.mapbox.maps.extension.style.sources.generated.GeoJsonSource, java.util.List<com.mapbox.geojson.Feature> features);\n  }\n\n  public final class ImageSourceExtKt {\n    method public static void updateImage(com.mapbox.maps.extension.style.sources.generated.ImageSource, android.graphics.Bitmap bitmap);\n    method public static void updateImage(com.mapbox.maps.extension.style.sources.generated.ImageSource, com.mapbox.maps.Image image);\n  }\n\n  public abstract class Source implements com.mapbox.maps.extension.style.StyleContract.StyleSourceExtension {\n    ctor public Source(String sourceId);\n    method protected com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addSource(com.mapbox.maps.MapboxStyleManager style);\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n    method public final String getSourceId();\n    property public final String sourceId;\n    field public static final com.mapbox.maps.extension.style.sources.Source.Companion Companion;\n  }\n\n  public static final class Source.Companion {\n  }\n\n  public final class SourceUtils {\n    method public static void addSource(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleSourceExtension source);\n    method public static com.mapbox.maps.extension.style.sources.Source? getSource(com.mapbox.maps.MapboxStyleManager, String sourceId);\n    method public static inline <reified T extends com.mapbox.maps.extension.style.sources.Source> T! getSourceAs(com.mapbox.maps.MapboxStyleManager, String sourceId);\n  }\n\n  public final class TileSet extends java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value> {\n  }\n\n  public static class TileSet.Builder {\n    ctor public TileSet.Builder(String tilejson, java.util.List<java.lang.String> tiles);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder attribution(String value);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder bounds(java.util.List<java.lang.Double> value = listOf(-180.0, -90.0, 180.0, 90.0));\n    method public final com.mapbox.maps.extension.style.sources.TileSet build();\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder center(java.util.List<java.lang.Double> value);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder data(java.util.List<java.lang.String> value);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder description(String value);\n    method public final String getTilejson();\n    method public final java.util.List<java.lang.String> getTiles();\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder grids(java.util.List<java.lang.String> value);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder legend(String value);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder maxZoom(int value = 30);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder minZoom(int value = 0);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder name(String value);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder scheme(com.mapbox.maps.extension.style.sources.generated.Scheme value);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder template(String value);\n    method public final com.mapbox.maps.extension.style.sources.TileSet.Builder version(String value = \"1.0.0\");\n    property public final String tilejson;\n    property public final java.util.List<java.lang.String> tiles;\n  }\n\n  public static final class TileSet.RasterDemBuilder extends com.mapbox.maps.extension.style.sources.TileSet.Builder {\n    ctor public TileSet.RasterDemBuilder(String tilejson, java.util.List<java.lang.String> tiles);\n    method public com.mapbox.maps.extension.style.sources.TileSet.RasterDemBuilder encoding(com.mapbox.maps.extension.style.sources.generated.Encoding value);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.sources.generated {\n\n  public final class Encoding {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.sources.generated.Encoding valueOf(String value);\n    property public final String value;\n    field public static final com.mapbox.maps.extension.style.sources.generated.Encoding.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.sources.generated.Encoding MAPBOX;\n    field public static final com.mapbox.maps.extension.style.sources.generated.Encoding TERRARIUM;\n  }\n\n  public static final class Encoding.Companion {\n    method public com.mapbox.maps.extension.style.sources.generated.Encoding valueOf(String value);\n  }\n\n  public final class GeoJsonSource extends com.mapbox.maps.extension.style.sources.Source {\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource data(String value, String dataId = \"\");\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource data(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource feature(com.mapbox.geojson.Feature value, String dataId = \"\");\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource feature(com.mapbox.geojson.Feature value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource featureCollection(com.mapbox.geojson.FeatureCollection value, String dataId = \"\");\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource featureCollection(com.mapbox.geojson.FeatureCollection value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource geometry(com.mapbox.geojson.Geometry value, String dataId = \"\");\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource geometry(com.mapbox.geojson.Geometry value);\n    method public String? getAttribution();\n    method public Boolean? getAutoMaxZoom();\n    method public Long? getBuffer();\n    method public Boolean? getCluster();\n    method public Long? getClusterMaxZoom();\n    method public Long? getClusterMinPoints();\n    method public java.util.HashMap<java.lang.String,java.lang.Object>? getClusterProperties();\n    method public Long? getClusterRadius();\n    method public String? getData();\n    method public Boolean? getGenerateId();\n    method public Boolean? getLineMetrics();\n    method public Long? getMaxzoom();\n    method public Long? getMinzoom();\n    method public Long? getPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.style.types.PromoteId? getPromoteId();\n    method public com.mapbox.maps.TileCacheBudget? getTileCacheBudget();\n    method public Double? getTolerance();\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method @Deprecated public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource url(String value, String dataId = \"\");\n    method @Deprecated public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource url(String value);\n    property public final String? attribution;\n    property public final Boolean? autoMaxZoom;\n    property public final Long? buffer;\n    property public final Boolean? cluster;\n    property public final Long? clusterMaxZoom;\n    property public final Long? clusterMinPoints;\n    property public final java.util.HashMap<java.lang.String,java.lang.Object>? clusterProperties;\n    property public final Long? clusterRadius;\n    property public final String? data;\n    property public final Boolean? generateId;\n    property public final Boolean? lineMetrics;\n    property public final Long? maxzoom;\n    property public final Long? minzoom;\n    property public final Long? prefetchZoomDelta;\n    property public final com.mapbox.maps.extension.style.types.PromoteId? promoteId;\n    property public final com.mapbox.maps.TileCacheBudget? tileCacheBudget;\n    property public final Double? tolerance;\n    field public static final com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Companion Companion;\n  }\n\n  @com.mapbox.maps.extension.style.types.SourceDsl public static final class GeoJsonSource.Builder {\n    ctor public GeoJsonSource.Builder(String sourceId);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder attribution(String value);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder autoMaxZoom(boolean value = false);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder buffer(long value = 128L);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource build();\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder cluster(boolean value = false);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder clusterMaxZoom(long value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder clusterMinPoints(long value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder clusterProperties(java.util.HashMap<java.lang.String,java.lang.Object> value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder clusterProperty(String propertyName, com.mapbox.maps.extension.style.expressions.generated.Expression operatorExpr, com.mapbox.maps.extension.style.expressions.generated.Expression mapExpr);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder clusterProperty(String propertyName, com.mapbox.maps.extension.style.expressions.generated.Expression mapExpr);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder clusterRadius(long value = 50L);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder data(String value, String dataId = \"\");\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder data(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder feature(com.mapbox.geojson.Feature value, String dataId = \"\");\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder feature(com.mapbox.geojson.Feature value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder featureCollection(com.mapbox.geojson.FeatureCollection value, String dataId = \"\");\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder featureCollection(com.mapbox.geojson.FeatureCollection value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder generateId(boolean value = false);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder geometry(com.mapbox.geojson.Geometry value, String dataId = \"\");\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder geometry(com.mapbox.geojson.Geometry value);\n    method public String getSourceId();\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder lineMetrics(boolean value = false);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder maxzoom(long value = 18L);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder promoteId(com.mapbox.maps.extension.style.types.PromoteId value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder tolerance(double value = 0.375);\n    method @Deprecated public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder url(String value, String dataId = \"\");\n    method @Deprecated public com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder url(String value);\n    property public final String sourceId;\n  }\n\n  public static final class GeoJsonSource.Companion {\n    method public Long? getDefaultBuffer();\n    method public Boolean? getDefaultCluster();\n    method public Long? getDefaultClusterMaxZoom();\n    method public Long? getDefaultClusterMinPoints();\n    method public Long? getDefaultClusterRadius();\n    method public Boolean? getDefaultGenerateId();\n    method public Boolean? getDefaultLineMetrics();\n    method public Long? getDefaultMaxzoom();\n    method public Long? getDefaultMinzoom();\n    method public Long? getDefaultPrefetchZoomDelta();\n    method public Double? getDefaultTolerance();\n    property public final Long? defaultBuffer;\n    property public final Boolean? defaultCluster;\n    property public final Long? defaultClusterMaxZoom;\n    property public final Long? defaultClusterMinPoints;\n    property public final Long? defaultClusterRadius;\n    property public final Boolean? defaultGenerateId;\n    property public final Boolean? defaultLineMetrics;\n    property public final Long? defaultMaxzoom;\n    property public final Long? defaultMinzoom;\n    property public final Long? defaultPrefetchZoomDelta;\n    property public final Double? defaultTolerance;\n  }\n\n  public final class GeoJsonSourceKt {\n    method public static com.mapbox.maps.extension.style.sources.generated.GeoJsonSource geoJsonSource(String id);\n    method public static com.mapbox.maps.extension.style.sources.generated.GeoJsonSource geoJsonSource(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.GeoJsonSource.Builder,kotlin.Unit> block);\n  }\n\n  public final class ImageSource extends com.mapbox.maps.extension.style.sources.Source {\n    ctor public ImageSource(com.mapbox.maps.extension.style.sources.generated.ImageSource.Builder builder);\n    method public com.mapbox.maps.extension.style.sources.generated.ImageSource coordinates(java.util.List<? extends java.util.List<java.lang.Double>> value);\n    method public java.util.List<java.util.List<java.lang.Double>>? getCoordinates();\n    method public Long? getPrefetchZoomDelta();\n    method public String? getUrl();\n    method public com.mapbox.maps.extension.style.sources.generated.ImageSource prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.ImageSource url(String value);\n    property public final java.util.List<java.util.List<java.lang.Double>>? coordinates;\n    property public final Long? prefetchZoomDelta;\n    property public final String? url;\n    field public static final com.mapbox.maps.extension.style.sources.generated.ImageSource.Companion Companion;\n  }\n\n  @com.mapbox.maps.extension.style.types.SourceDsl public static final class ImageSource.Builder {\n    ctor public ImageSource.Builder(String sourceId);\n    method public com.mapbox.maps.extension.style.sources.generated.ImageSource build();\n    method public com.mapbox.maps.extension.style.sources.generated.ImageSource.Builder coordinates(java.util.List<? extends java.util.List<java.lang.Double>> value);\n    method public String getSourceId();\n    method public com.mapbox.maps.extension.style.sources.generated.ImageSource.Builder prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.ImageSource.Builder url(String value);\n    property public final String sourceId;\n  }\n\n  public static final class ImageSource.Companion {\n    method public Long? getDefaultPrefetchZoomDelta();\n    property public final Long? defaultPrefetchZoomDelta;\n  }\n\n  public final class ImageSourceKt {\n    method public static com.mapbox.maps.extension.style.sources.generated.ImageSource imageSource(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.ImageSource.Builder,kotlin.Unit> block);\n  }\n\n  @UiThread public final class ModelMaterialOverride extends java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value> {\n  }\n\n  public static final class ModelMaterialOverride.Builder {\n    ctor public ModelMaterialOverride.Builder(String name);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride build();\n    method public String getName();\n    method public com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride.Builder modelColor(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride.Builder modelColor(@ColorInt int modelColor);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride.Builder modelColorMixIntensity(double value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride.Builder modelEmissiveStrength(double value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride.Builder modelOpacity(double value);\n    property public final String name;\n  }\n\n  @UiThread public final class ModelNodeOverride extends java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value> {\n  }\n\n  public static final class ModelNodeOverride.Builder {\n    ctor public ModelNodeOverride.Builder(String name);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelNodeOverride build();\n    method public String getName();\n    method public com.mapbox.maps.extension.style.sources.generated.ModelNodeOverride.Builder orientation(java.util.List<java.lang.Double> value);\n    property public final String name;\n  }\n\n  public final class ModelSource extends com.mapbox.maps.extension.style.sources.Source {\n    ctor public ModelSource(com.mapbox.maps.extension.style.sources.generated.ModelSource.Builder builder);\n    method public Long? getMaxzoom();\n    method public Long? getMinzoom();\n    method public java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelSourceModel>? getModels();\n    method public java.util.List<java.lang.String>? getTiles();\n    method public String? getUrl();\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource maxzoom(long value = 18L);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource models(java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelSourceModel> value);\n    method public void removeAllModels();\n    method public void removeModel(com.mapbox.maps.extension.style.sources.generated.ModelSourceModel model);\n    method public void removeModel(String id);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource url(String value);\n    property public final Long? maxzoom;\n    property public final Long? minzoom;\n    property public final java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelSourceModel>? models;\n    property public final java.util.List<java.lang.String>? tiles;\n    property public final String? url;\n    field public static final com.mapbox.maps.extension.style.sources.generated.ModelSource.Companion Companion;\n  }\n\n  @com.mapbox.maps.extension.style.types.SourceDsl public static final class ModelSource.Builder {\n    ctor public ModelSource.Builder(String sourceId);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource.Builder batched(boolean batched);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource build();\n    method public String getSourceId();\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource.Builder maxzoom(long value = 18L);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource.Builder minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource.Builder models(java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelSourceModel> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource.Builder tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSource.Builder url(String value);\n    property public final String sourceId;\n  }\n\n  public static final class ModelSource.Companion {\n    method public Long? getDefaultMaxzoom();\n    method public Long? getDefaultMinzoom();\n    property public final Long? defaultMaxzoom;\n    property public final Long? defaultMinzoom;\n  }\n\n  public final class ModelSourceKt {\n    method public static com.mapbox.maps.extension.style.sources.generated.ModelSource modelSource(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.ModelSource.Builder,kotlin.Unit> block);\n  }\n\n  @UiThread public final class ModelSourceModel {\n    ctor public ModelSourceModel(com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder builder);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel featureProperties(java.util.HashMap<java.lang.String,java.lang.Object> value);\n    method public java.util.HashMap<java.lang.String,java.lang.Object>? getFeatureProperties();\n    method public String getId();\n    method public java.util.List<java.lang.String>? getMaterialOverrideNames();\n    method public java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride>? getMaterialOverrides();\n    method public java.util.List<java.lang.String>? getNodeOverrideNames();\n    method public java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelNodeOverride>? getNodeOverrides();\n    method public java.util.List<java.lang.Double>? getOrientation();\n    method public java.util.List<java.lang.Double>? getPosition();\n    method public String? getUri();\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel materialOverrideNames(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel materialOverrides(java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel nodeOverrideNames(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel nodeOverrides(java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelNodeOverride> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel orientation(java.util.List<java.lang.Double> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel position(java.util.List<java.lang.Double> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel uri(String value);\n    property public final java.util.HashMap<java.lang.String,java.lang.Object>? featureProperties;\n    property public final String id;\n    property public final java.util.List<java.lang.String>? materialOverrideNames;\n    property public final java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride>? materialOverrides;\n    property public final java.util.List<java.lang.String>? nodeOverrideNames;\n    property public final java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelNodeOverride>? nodeOverrides;\n    property public final java.util.List<java.lang.Double>? orientation;\n    property public final java.util.List<java.lang.Double>? position;\n    property public final String? uri;\n  }\n\n  public static final class ModelSourceModel.Builder {\n    ctor public ModelSourceModel.Builder(String id);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel build();\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder featureProperties(java.util.HashMap<java.lang.String,java.lang.Object> value);\n    method public String getId();\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder materialOverrideNames(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder materialOverrides(java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder nodeOverrideNames(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder nodeOverrides(java.util.List<com.mapbox.maps.extension.style.sources.generated.ModelNodeOverride> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder orientation(java.util.List<java.lang.Double> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder position(java.util.List<java.lang.Double> value);\n    method public com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder uri(String value);\n    property public final String id;\n  }\n\n  public final class ModelSourceModelKt {\n    method public static com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride modelMaterialOverride(String name, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.ModelMaterialOverride.Builder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.sources.generated.ModelNodeOverride modelNodeOverride(String name, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.ModelNodeOverride.Builder,kotlin.Unit> block);\n    method public static com.mapbox.maps.extension.style.sources.generated.ModelSourceModel modelSourceModel(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.ModelSourceModel.Builder,kotlin.Unit> block);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class RasterArraySource extends com.mapbox.maps.extension.style.sources.Source {\n    ctor public RasterArraySource(com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder builder);\n    method public String? getAttribution();\n    method public java.util.List<java.lang.Double>? getBounds();\n    method public Long? getMaxzoom();\n    method public Long? getMinzoom();\n    method public java.util.List<com.mapbox.maps.extension.style.sources.generated.RasterArraySource.RasterDataLayer>? getRasterLayers();\n    method public com.mapbox.maps.TileCacheBudget? getTileCacheBudget();\n    method public Long? getTileSize();\n    method public java.util.List<java.lang.String>? getTiles();\n    method public String? getUrl();\n    method public Boolean? getVolatile();\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource maxzoom(long value = 22L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource url(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource volatile(boolean value = false);\n    property public final String? attribution;\n    property public final java.util.List<java.lang.Double>? bounds;\n    property public final Long? maxzoom;\n    property public final Long? minzoom;\n    property public final java.util.List<com.mapbox.maps.extension.style.sources.generated.RasterArraySource.RasterDataLayer>? rasterLayers;\n    property public final com.mapbox.maps.TileCacheBudget? tileCacheBudget;\n    property public final Long? tileSize;\n    property public final java.util.List<java.lang.String>? tiles;\n    property public final String? url;\n    property public final Boolean? volatile;\n    field public static final com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Companion Companion;\n  }\n\n  @com.mapbox.maps.extension.style.types.SourceDsl public static final class RasterArraySource.Builder {\n    ctor public RasterArraySource.Builder(String sourceId);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder attribution(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder bounds(java.util.List<java.lang.Double> value = listOf(-180.0, -85.051129, 180.0, 85.051129));\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource build();\n    method public String getSourceId();\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder maxzoom(long value = 22L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder tileSet(com.mapbox.maps.extension.style.sources.TileSet tileSet);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder tileSet(String tilejson, java.util.List<java.lang.String> tiles, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.TileSet.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder tileSize(long value = 512L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder url(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder volatile(boolean value = false);\n    property public final String sourceId;\n  }\n\n  public static final class RasterArraySource.Companion {\n    method public Long? getDefaultMaxzoom();\n    method public Long? getDefaultMinzoom();\n    method public Boolean? getDefaultVolatile();\n    property public final Long? defaultMaxzoom;\n    property public final Long? defaultMinzoom;\n    property public final Boolean? defaultVolatile;\n  }\n\n  public static final class RasterArraySource.RasterDataLayer {\n    method public java.util.List<java.lang.String> getBands();\n    method public String getLayerId();\n    property public final java.util.List<java.lang.String> bands;\n    property public final String layerId;\n  }\n\n  public final class RasterArraySourceKt {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.extension.style.sources.generated.RasterArraySource rasterArraySource(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.RasterArraySource.Builder,kotlin.Unit> block);\n  }\n\n  public final class RasterDemSource extends com.mapbox.maps.extension.style.sources.Source {\n    ctor public RasterDemSource(com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder builder);\n    method public String? getAttribution();\n    method public java.util.List<java.lang.Double>? getBounds();\n    method public com.mapbox.maps.extension.style.sources.generated.Encoding? getEncoding();\n    method public Long? getMaxOverscaleFactorForParentTiles();\n    method public Long? getMaxzoom();\n    method public Double? getMinimumTileUpdateInterval();\n    method public Long? getMinzoom();\n    method public Long? getPrefetchZoomDelta();\n    method public com.mapbox.maps.TileCacheBudget? getTileCacheBudget();\n    method public Double? getTileNetworkRequestsDelay();\n    method public Double? getTileRequestsDelay();\n    method public Long? getTileSize();\n    method public java.util.List<java.lang.String>? getTiles();\n    method public String? getUrl();\n    method public Boolean? getVolatile();\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource maxOverscaleFactorForParentTiles(long value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource maxzoom(long value = 22L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource minimumTileUpdateInterval(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource tileNetworkRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource tileRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource url(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource volatile(boolean value = false);\n    property public final String? attribution;\n    property public final java.util.List<java.lang.Double>? bounds;\n    property public final com.mapbox.maps.extension.style.sources.generated.Encoding? encoding;\n    property public final Long? maxOverscaleFactorForParentTiles;\n    property public final Long? maxzoom;\n    property public final Double? minimumTileUpdateInterval;\n    property public final Long? minzoom;\n    property public final Long? prefetchZoomDelta;\n    property public final com.mapbox.maps.TileCacheBudget? tileCacheBudget;\n    property public final Double? tileNetworkRequestsDelay;\n    property public final Double? tileRequestsDelay;\n    property public final Long? tileSize;\n    property public final java.util.List<java.lang.String>? tiles;\n    property public final String? url;\n    property public final Boolean? volatile;\n    field public static final com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Companion Companion;\n  }\n\n  @com.mapbox.maps.extension.style.types.SourceDsl public static final class RasterDemSource.Builder {\n    ctor public RasterDemSource.Builder(String sourceId);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder attribution(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder bounds(java.util.List<java.lang.Double> value = listOf(-180.0, -85.051129, 180.0, 85.051129));\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource build();\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder encoding(com.mapbox.maps.extension.style.sources.generated.Encoding value = com.mapbox.maps.extension.style.sources.generated.Encoding.MAPBOX);\n    method public String getSourceId();\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder maxOverscaleFactorForParentTiles(long value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder maxzoom(long value = 22L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder minimumTileUpdateInterval(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder tileNetworkRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder tileRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder tileSet(com.mapbox.maps.extension.style.sources.TileSet tileSet);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder tileSet(String tilejson, java.util.List<java.lang.String> tiles, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.TileSet.RasterDemBuilder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder tileSize(long value = 512L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder url(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder volatile(boolean value = false);\n    property public final String sourceId;\n  }\n\n  public static final class RasterDemSource.Companion {\n    method public com.mapbox.maps.extension.style.sources.generated.Encoding? getDefaultEncoding();\n    method public Long? getDefaultMaxzoom();\n    method public Double? getDefaultMinimumTileUpdateInterval();\n    method public Long? getDefaultMinzoom();\n    method public Long? getDefaultPrefetchZoomDelta();\n    method public Double? getDefaultTileNetworkRequestsDelay();\n    method public Double? getDefaultTileRequestsDelay();\n    method public Boolean? getDefaultVolatile();\n    property public final com.mapbox.maps.extension.style.sources.generated.Encoding? defaultEncoding;\n    property public final Long? defaultMaxzoom;\n    property public final Double? defaultMinimumTileUpdateInterval;\n    property public final Long? defaultMinzoom;\n    property public final Long? defaultPrefetchZoomDelta;\n    property public final Double? defaultTileNetworkRequestsDelay;\n    property public final Double? defaultTileRequestsDelay;\n    property public final Boolean? defaultVolatile;\n  }\n\n  public final class RasterDemSourceKt {\n    method public static com.mapbox.maps.extension.style.sources.generated.RasterDemSource rasterDemSource(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.RasterDemSource.Builder,kotlin.Unit> block);\n  }\n\n  public final class RasterSource extends com.mapbox.maps.extension.style.sources.Source {\n    ctor public RasterSource(com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder builder);\n    method public String? getAttribution();\n    method public java.util.List<java.lang.Double>? getBounds();\n    method public Long? getMaxOverscaleFactorForParentTiles();\n    method public Long? getMaxzoom();\n    method public Double? getMinimumTileUpdateInterval();\n    method public Long? getMinzoom();\n    method public Long? getPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.style.sources.generated.Scheme? getScheme();\n    method public com.mapbox.maps.TileCacheBudget? getTileCacheBudget();\n    method public Double? getTileNetworkRequestsDelay();\n    method public Double? getTileRequestsDelay();\n    method public Long? getTileSize();\n    method public java.util.List<java.lang.String>? getTiles();\n    method public String? getUrl();\n    method public Boolean? getVolatile();\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource maxOverscaleFactorForParentTiles(long value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource maxzoom(long value = 22L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource minimumTileUpdateInterval(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource tileNetworkRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource tileRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource url(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource volatile(boolean value = false);\n    property public final String? attribution;\n    property public final java.util.List<java.lang.Double>? bounds;\n    property public final Long? maxOverscaleFactorForParentTiles;\n    property public final Long? maxzoom;\n    property public final Double? minimumTileUpdateInterval;\n    property public final Long? minzoom;\n    property public final Long? prefetchZoomDelta;\n    property public final com.mapbox.maps.extension.style.sources.generated.Scheme? scheme;\n    property public final com.mapbox.maps.TileCacheBudget? tileCacheBudget;\n    property public final Double? tileNetworkRequestsDelay;\n    property public final Double? tileRequestsDelay;\n    property public final Long? tileSize;\n    property public final java.util.List<java.lang.String>? tiles;\n    property public final String? url;\n    property public final Boolean? volatile;\n    field public static final com.mapbox.maps.extension.style.sources.generated.RasterSource.Companion Companion;\n  }\n\n  @com.mapbox.maps.extension.style.types.SourceDsl public static final class RasterSource.Builder {\n    ctor public RasterSource.Builder(String sourceId);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder attribution(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder bounds(java.util.List<java.lang.Double> value = listOf(-180.0, -85.051129, 180.0, 85.051129));\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource build();\n    method public String getSourceId();\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder maxOverscaleFactorForParentTiles(long value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder maxzoom(long value = 22L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder minimumTileUpdateInterval(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder scheme(com.mapbox.maps.extension.style.sources.generated.Scheme value = com.mapbox.maps.extension.style.sources.generated.Scheme.XYZ);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder tileNetworkRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder tileRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder tileSet(com.mapbox.maps.extension.style.sources.TileSet tileSet);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder tileSet(String tilejson, java.util.List<java.lang.String> tiles, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.TileSet.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder tileSize(long value = 512L);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder url(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder volatile(boolean value = false);\n    property public final String sourceId;\n  }\n\n  public static final class RasterSource.Companion {\n    method public Long? getDefaultMaxzoom();\n    method public Double? getDefaultMinimumTileUpdateInterval();\n    method public Long? getDefaultMinzoom();\n    method public Long? getDefaultPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.style.sources.generated.Scheme? getDefaultScheme();\n    method public Double? getDefaultTileNetworkRequestsDelay();\n    method public Double? getDefaultTileRequestsDelay();\n    method public Boolean? getDefaultVolatile();\n    property public final Long? defaultMaxzoom;\n    property public final Double? defaultMinimumTileUpdateInterval;\n    property public final Long? defaultMinzoom;\n    property public final Long? defaultPrefetchZoomDelta;\n    property public final com.mapbox.maps.extension.style.sources.generated.Scheme? defaultScheme;\n    property public final Double? defaultTileNetworkRequestsDelay;\n    property public final Double? defaultTileRequestsDelay;\n    property public final Boolean? defaultVolatile;\n  }\n\n  public final class RasterSourceKt {\n    method public static com.mapbox.maps.extension.style.sources.generated.RasterSource rasterSource(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.RasterSource.Builder,kotlin.Unit> block);\n  }\n\n  public final class Scheme {\n    method public String getValue();\n    method public static com.mapbox.maps.extension.style.sources.generated.Scheme valueOf(String value);\n    property public final String value;\n    field public static final com.mapbox.maps.extension.style.sources.generated.Scheme.Companion Companion;\n    field public static final com.mapbox.maps.extension.style.sources.generated.Scheme TMS;\n    field public static final com.mapbox.maps.extension.style.sources.generated.Scheme XYZ;\n  }\n\n  public static final class Scheme.Companion {\n    method public com.mapbox.maps.extension.style.sources.generated.Scheme valueOf(String value);\n  }\n\n  public final class VectorSource extends com.mapbox.maps.extension.style.sources.Source {\n    ctor public VectorSource(com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder builder);\n    method public String? getAttribution();\n    method public java.util.List<java.lang.Double>? getBounds();\n    method public Long? getMaxOverscaleFactorForParentTiles();\n    method public Long? getMaxzoom();\n    method public Double? getMinimumTileUpdateInterval();\n    method public Long? getMinzoom();\n    method public Long? getPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.style.types.PromoteId? getPromoteId();\n    method public com.mapbox.maps.extension.style.sources.generated.Scheme? getScheme();\n    method public com.mapbox.maps.TileCacheBudget? getTileCacheBudget();\n    method public Double? getTileNetworkRequestsDelay();\n    method public Double? getTileRequestsDelay();\n    method public java.util.List<java.lang.String>? getTiles();\n    method public String? getUrl();\n    method public Boolean? getVolatile();\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource maxOverscaleFactorForParentTiles(long value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource maxzoom(long value = 22L);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource minimumTileUpdateInterval(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource tileNetworkRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource tileRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource url(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource volatile(boolean value = false);\n    property public final String? attribution;\n    property public final java.util.List<java.lang.Double>? bounds;\n    property public final Long? maxOverscaleFactorForParentTiles;\n    property public final Long? maxzoom;\n    property public final Double? minimumTileUpdateInterval;\n    property public final Long? minzoom;\n    property public final Long? prefetchZoomDelta;\n    property public final com.mapbox.maps.extension.style.types.PromoteId? promoteId;\n    property public final com.mapbox.maps.extension.style.sources.generated.Scheme? scheme;\n    property public final com.mapbox.maps.TileCacheBudget? tileCacheBudget;\n    property public final Double? tileNetworkRequestsDelay;\n    property public final Double? tileRequestsDelay;\n    property public final java.util.List<java.lang.String>? tiles;\n    property public final String? url;\n    property public final Boolean? volatile;\n    field public static final com.mapbox.maps.extension.style.sources.generated.VectorSource.Companion Companion;\n  }\n\n  @com.mapbox.maps.extension.style.types.SourceDsl public static final class VectorSource.Builder {\n    ctor public VectorSource.Builder(String sourceId);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder attribution(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder bounds(java.util.List<java.lang.Double> value = listOf(-180.0, -85.051129, 180.0, 85.051129));\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource build();\n    method public String getSourceId();\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder maxOverscaleFactorForParentTiles(long value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder maxzoom(long value = 22L);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder minimumTileUpdateInterval(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder minzoom(long value = 0L);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder prefetchZoomDelta(long value = 4L);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder promoteId(com.mapbox.maps.extension.style.types.PromoteId value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder scheme(com.mapbox.maps.extension.style.sources.generated.Scheme value = com.mapbox.maps.extension.style.sources.generated.Scheme.XYZ);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder tileCacheBudget(com.mapbox.maps.TileCacheBudget value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder tileNetworkRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder tileRequestsDelay(double value = 0.0);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder tileSet(com.mapbox.maps.extension.style.sources.TileSet tileSet);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder tileSet(String tilejson, java.util.List<java.lang.String> tiles, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.TileSet.Builder,kotlin.Unit> block);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder tiles(java.util.List<java.lang.String> value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder url(String value);\n    method public com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder volatile(boolean value = false);\n    property public final String sourceId;\n  }\n\n  public static final class VectorSource.Companion {\n    method public Long? getDefaultMaxzoom();\n    method public Double? getDefaultMinimumTileUpdateInterval();\n    method public Long? getDefaultMinzoom();\n    method public Long? getDefaultPrefetchZoomDelta();\n    method public com.mapbox.maps.extension.style.sources.generated.Scheme? getDefaultScheme();\n    method public Double? getDefaultTileNetworkRequestsDelay();\n    method public Double? getDefaultTileRequestsDelay();\n    method public Boolean? getDefaultVolatile();\n    property public final Long? defaultMaxzoom;\n    property public final Double? defaultMinimumTileUpdateInterval;\n    property public final Long? defaultMinzoom;\n    property public final Long? defaultPrefetchZoomDelta;\n    property public final com.mapbox.maps.extension.style.sources.generated.Scheme? defaultScheme;\n    property public final Double? defaultTileNetworkRequestsDelay;\n    property public final Double? defaultTileRequestsDelay;\n    property public final Boolean? defaultVolatile;\n  }\n\n  public final class VectorSourceKt {\n    method public static com.mapbox.maps.extension.style.sources.generated.VectorSource vectorSource(String id, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.sources.generated.VectorSource.Builder,kotlin.Unit> block);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.terrain.generated {\n\n  @UiThread public final class Terrain implements com.mapbox.maps.extension.style.StyleContract.StyleTerrainExtension com.mapbox.maps.extension.style.terrain.generated.TerrainDslReceiver {\n    ctor public Terrain(String sourceId);\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n    method public com.mapbox.maps.extension.style.terrain.generated.Terrain exaggeration(double exaggeration);\n    method public com.mapbox.maps.extension.style.terrain.generated.Terrain exaggeration(com.mapbox.maps.extension.style.expressions.generated.Expression exaggeration);\n    method public com.mapbox.maps.extension.style.terrain.generated.Terrain exaggerationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.terrain.generated.Terrain exaggerationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n    method public Double? getExaggeration();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getExaggerationAsExpression();\n    method public com.mapbox.maps.extension.style.types.StyleTransition? getExaggerationTransition();\n    property public final Double? exaggeration;\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? exaggerationAsExpression;\n    property public final com.mapbox.maps.extension.style.types.StyleTransition? exaggerationTransition;\n    field public static final com.mapbox.maps.extension.style.terrain.generated.Terrain.Companion Companion;\n  }\n\n  public static final class Terrain.Companion {\n  }\n\n  @com.mapbox.maps.extension.style.types.TerrainDsl public interface TerrainDslReceiver {\n    method public com.mapbox.maps.extension.style.terrain.generated.Terrain exaggeration(double exaggeration = 1.0);\n    method public com.mapbox.maps.extension.style.terrain.generated.Terrain exaggeration(com.mapbox.maps.extension.style.expressions.generated.Expression exaggeration);\n    method public com.mapbox.maps.extension.style.terrain.generated.Terrain exaggerationTransition(com.mapbox.maps.extension.style.types.StyleTransition options);\n    method public com.mapbox.maps.extension.style.terrain.generated.Terrain exaggerationTransition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n  }\n\n  public final class TerrainKt {\n    method public static com.mapbox.maps.extension.style.terrain.generated.Terrain terrain(String sourceId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.terrain.generated.TerrainDslReceiver,kotlin.Unit>? block = null);\n    method public static com.mapbox.maps.extension.style.terrain.generated.Terrain terrain(String sourceId);\n  }\n\n  public final class TerrainUtils {\n    method public static com.mapbox.maps.extension.style.terrain.generated.Terrain getTerrain(com.mapbox.maps.MapboxStyleManager, String sourceId);\n    method public static void removeTerrain(com.mapbox.maps.MapboxStyleManager);\n    method public static void setTerrain(com.mapbox.maps.MapboxStyleManager, com.mapbox.maps.extension.style.StyleContract.StyleTerrainExtension terrain);\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.types {\n\n  @kotlin.DslMarker public @interface AtmosphereDsl {\n  }\n\n  @kotlin.DslMarker public @interface ExpressionDsl {\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public final class Formatted extends java.util.ArrayList<com.mapbox.maps.extension.style.types.FormattedSection> {\n    ctor public Formatted();\n    method public void formattedSection(String text, kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.FormattedSection,kotlin.Unit> block);\n    method public void formattedSection(com.mapbox.maps.extension.style.types.FormattedSection section);\n    method public String getTextAsString();\n    method public com.mapbox.bindgen.Value toValue();\n    field public static final com.mapbox.maps.extension.style.types.Formatted.Companion Companion;\n  }\n\n  public static final class Formatted.Companion {\n    method public com.mapbox.maps.extension.style.types.Formatted fromExpression(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public com.mapbox.maps.extension.style.types.Formatted fromProperty(java.util.ArrayList<?> list);\n  }\n\n  public final class FormattedKt {\n    method public static com.mapbox.maps.extension.style.types.Formatted formatted(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.Formatted,kotlin.Unit> block);\n  }\n\n  @Keep @com.mapbox.maps.extension.style.types.LayersDsl public final class FormattedSection {\n    ctor public FormattedSection(String text, Double? fontScale = null, java.util.List<java.lang.String>? fontStack = null, String? textColor = null);\n    ctor public FormattedSection(String text, Double? fontScale = null, java.util.List<java.lang.String>? fontStack = null);\n    ctor public FormattedSection(String text, Double? fontScale = null);\n    ctor public FormattedSection(String text);\n    method public String component1();\n    method public Double? component2();\n    method public java.util.List<java.lang.String>? component3();\n    method public String? component4();\n    method public com.mapbox.maps.extension.style.types.FormattedSection copy(String text, Double? fontScale, java.util.List<java.lang.String>? fontStack, String? textColor);\n    method public Double? getFontScale();\n    method public java.util.List<java.lang.String>? getFontStack();\n    method public String getText();\n    method public String? getTextColor();\n    method @ColorInt public int getTextColorAsInt();\n    method public void setFontScale(Double?);\n    method public void setFontStack(java.util.List<java.lang.String>?);\n    method public void setTextColor(String?);\n    method public void setTextColorAsInt(@ColorInt int);\n    property public final Double? fontScale;\n    property public final java.util.List<java.lang.String>? fontStack;\n    property public final String text;\n    property public final String? textColor;\n    property @ColorInt public final int textColorAsInt;\n  }\n\n  @kotlin.DslMarker public @interface LayersDsl {\n  }\n\n  @kotlin.DslMarker public @interface LightDsl {\n  }\n\n  @Keep public final class PromoteId {\n    ctor public PromoteId(String propertyName, String? sourceId = null);\n    ctor public PromoteId(String propertyName);\n    ctor public PromoteId(com.mapbox.maps.extension.style.expressions.generated.Expression expression, String? sourceId = null);\n    ctor public PromoteId(com.mapbox.maps.extension.style.expressions.generated.Expression expression);\n    method public String component1();\n    method public String? component2();\n    method public com.mapbox.maps.extension.style.types.PromoteId copy(String propertyName, String? sourceId);\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getExpression();\n    method public String getPropertyName();\n    method public String? getSourceId();\n    property public final com.mapbox.maps.extension.style.expressions.generated.Expression? expression;\n    property public final String propertyName;\n    property public final String? sourceId;\n    field public static final com.mapbox.maps.extension.style.types.PromoteId.Companion Companion;\n  }\n\n  public static final class PromoteId.Companion {\n  }\n\n  @com.mapbox.maps.MapboxExperimental @kotlin.DslMarker public @interface RainDsl {\n  }\n\n  @com.mapbox.maps.MapboxExperimental @kotlin.DslMarker public @interface SnowDsl {\n  }\n\n  @kotlin.DslMarker public @interface SourceDsl {\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public final class StyleTransition {\n    method public Long? getDelay();\n    method public Long? getDuration();\n    method public com.mapbox.bindgen.Value toValue();\n    property public final Long? delay;\n    property public final Long? duration;\n  }\n\n  @com.mapbox.maps.extension.style.types.LayersDsl public static final class StyleTransition.Builder {\n    ctor public StyleTransition.Builder();\n    method public com.mapbox.maps.extension.style.types.StyleTransition build();\n    method public com.mapbox.maps.extension.style.types.StyleTransition.Builder delay(long delay);\n    method public com.mapbox.maps.extension.style.types.StyleTransition.Builder duration(long duration);\n    method public Long? getDelay();\n    method public Long? getDuration();\n    property public final Long? delay;\n    property public final Long? duration;\n  }\n\n  public final class StyleTransitionKt {\n    method public static com.mapbox.maps.extension.style.types.StyleTransition transitionOptions(kotlin.jvm.functions.Function1<? super com.mapbox.maps.extension.style.types.StyleTransition.Builder,kotlin.Unit> block);\n  }\n\n  @kotlin.DslMarker public @interface TerrainDsl {\n  }\n\n}\n\npackage com.mapbox.maps.extension.style.utils {\n\n  public final class ColorUtils {\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression colorIntToRgbaExpression(@ColorInt int color);\n    method public float[] colorToGlRgbaArray(@ColorInt int color);\n    method public float[] colorToRgbaArray(@ColorInt int color);\n    method public String colorToRgbaString(@ColorInt int color);\n    method @ColorInt public Integer? rgbaExpressionToColorInt(com.mapbox.maps.extension.style.expressions.generated.Expression value);\n    method public String? rgbaExpressionToColorString(com.mapbox.maps.extension.style.expressions.generated.Expression value);\n    method @ColorInt public Integer? rgbaToColor(String value);\n    field public static final com.mapbox.maps.extension.style.utils.ColorUtils INSTANCE;\n  }\n\n  public final class ExpectedUtilsKt {\n  }\n\n  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TypeUtils {\n    method public com.mapbox.bindgen.Value wrapToValue(Object value);\n    field public static final com.mapbox.maps.extension.style.utils.TypeUtils INSTANCE;\n  }\n\n  public final class TypeUtilsKt {\n    method public static inline <reified T> T! silentUnwrap(com.mapbox.maps.StylePropertyValue);\n    method public static com.mapbox.bindgen.Value toValue(com.mapbox.geojson.Feature);\n    method public static com.mapbox.bindgen.Value toValue(com.mapbox.geojson.FeatureCollection);\n    method public static com.mapbox.bindgen.Value toValue(com.mapbox.geojson.Geometry);\n    method public static inline com.mapbox.maps.TransitionOptions transition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.TransitionOptions.Builder,kotlin.Unit> block);\n    method public static <T> T! unwrap(com.mapbox.maps.StylePropertyValue, Class<T> clazz);\n    method public static inline <reified T> T! unwrap(com.mapbox.maps.StylePropertyValue);\n    method public static Object unwrapToAny(com.mapbox.bindgen.Value);\n    method public static com.mapbox.maps.extension.style.expressions.generated.Expression unwrapToExpression(com.mapbox.bindgen.Value);\n    method public static com.mapbox.maps.extension.style.types.StyleTransition unwrapToStyleTransition(com.mapbox.bindgen.Value);\n    method public static <T> T! unwrapToTyped(com.mapbox.bindgen.Value, Class<T> clazz);\n    method public static inline <reified T> T! unwrapToTyped(com.mapbox.bindgen.Value);\n  }\n\n}\n\n"
  },
  {
    "path": "extension-style/api/extension-style.api",
    "content": "public final class com/mapbox/maps/extension/style/StyleExtensionImpl : com/mapbox/maps/extension/style/StyleContract$StyleExtension {\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/StyleExtensionImpl$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun getAtmosphere ()Lcom/mapbox/maps/extension/style/StyleContract$StyleAtmosphereExtension;\n\tpublic fun getAtmosphere ()Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun getColorTheme ()Lcom/mapbox/maps/ColorTheme;\n\tpublic fun getDynamicLight ()Lcom/mapbox/maps/extension/style/StyleContract$StyleLightExtension;\n\tpublic fun getFlatLight ()Lcom/mapbox/maps/extension/style/StyleContract$StyleLightExtension;\n\tpublic fun getImages ()Ljava/util/List;\n\tpublic fun getLayers ()Ljava/util/List;\n\tpublic fun getModels ()Ljava/util/List;\n\tpublic synthetic fun getProjection ()Lcom/mapbox/maps/extension/style/StyleContract$StyleProjectionExtension;\n\tpublic fun getProjection ()Lcom/mapbox/maps/extension/style/projection/generated/Projection;\n\tpublic fun getRain ()Lcom/mapbox/maps/extension/style/StyleContract$StyleRainExtension;\n\tpublic fun getSnow ()Lcom/mapbox/maps/extension/style/StyleContract$StyleSnowExtension;\n\tpublic fun getSources ()Ljava/util/List;\n\tpublic fun getStyle ()Ljava/lang/String;\n\tpublic synthetic fun getTerrain ()Lcom/mapbox/maps/extension/style/StyleContract$StyleTerrainExtension;\n\tpublic fun getTerrain ()Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic fun getTransition ()Lcom/mapbox/maps/TransitionOptions;\n}\n\npublic final class com/mapbox/maps/extension/style/StyleExtensionImpl$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun addImage (Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl;)V\n\tpublic final fun addImage9Patch (Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl;)V\n\tpublic final fun addLayer (Lcom/mapbox/maps/extension/style/layers/Layer;)V\n\tpublic final fun addLayerAtPosition (Lkotlin/Pair;)V\n\tpublic final fun addModel (Lcom/mapbox/maps/extension/style/model/ModelExtensionImpl;)V\n\tpublic final fun addSource (Lcom/mapbox/maps/extension/style/sources/Source;)V\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;\n\tpublic final fun getStyle ()Ljava/lang/String;\n\tpublic final fun layerAtPosition (Lcom/mapbox/maps/extension/style/layers/Layer;)Lkotlin/Pair;\n\tpublic final fun layerAtPosition (Lcom/mapbox/maps/extension/style/layers/Layer;Ljava/lang/String;)Lkotlin/Pair;\n\tpublic final fun layerAtPosition (Lcom/mapbox/maps/extension/style/layers/Layer;Ljava/lang/String;Ljava/lang/String;)Lkotlin/Pair;\n\tpublic final fun layerAtPosition (Lcom/mapbox/maps/extension/style/layers/Layer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)Lkotlin/Pair;\n\tpublic static synthetic fun layerAtPosition$default (Lcom/mapbox/maps/extension/style/StyleExtensionImpl$Builder;Lcom/mapbox/maps/extension/style/layers/Layer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;ILjava/lang/Object;)Lkotlin/Pair;\n\tpublic final fun setAtmosphere (Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;)V\n\tpublic final fun setColorTheme (Lcom/mapbox/maps/ColorTheme;)V\n\tpublic final fun setLight (Lcom/mapbox/maps/extension/style/light/DynamicLight;)V\n\tpublic final fun setLight (Lcom/mapbox/maps/extension/style/light/generated/FlatLight;)V\n\tpublic final fun setProjection (Lcom/mapbox/maps/extension/style/projection/generated/Projection;)V\n\tpublic final fun setRain (Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;)V\n\tpublic final fun setSnow (Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;)V\n\tpublic final fun setTerrain (Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;)V\n\tpublic final fun setTransition (Lcom/mapbox/maps/TransitionOptions;)V\n}\n\npublic final class com/mapbox/maps/extension/style/StyleExtensionImplKt {\n\tpublic static final fun style (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;\n\tpublic static synthetic fun style$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;\n}\n\npublic final class com/mapbox/maps/extension/style/atmosphere/generated/Atmosphere : com/mapbox/maps/extension/style/StyleContract$StyleAtmosphereExtension, com/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver {\n\tpublic fun <init> ()V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic fun color (I)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHighColor ()Ljava/lang/String;\n\tpublic final fun getHighColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getHighColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHighColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getHighColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getHighColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHorizonBlend ()Ljava/lang/Double;\n\tpublic final fun getHorizonBlendAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHorizonBlendTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRange ()Ljava/util/List;\n\tpublic final fun getRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRangeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getSpaceColor ()Ljava/lang/String;\n\tpublic final fun getSpaceColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getSpaceColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSpaceColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getSpaceColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getSpaceColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getStarIntensity ()Ljava/lang/Double;\n\tpublic final fun getStarIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getStarIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getVerticalRange ()Ljava/util/List;\n\tpublic final fun getVerticalRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getVerticalRangeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun highColor (I)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun highColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun highColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun highColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun highColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun highColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun highColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun horizonBlend (D)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun horizonBlend (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun horizonBlendTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun horizonBlendTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun range (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun range (Ljava/util/List;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun rangeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun rangeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun spaceColor (I)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun spaceColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun spaceColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun spaceColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun spaceColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun spaceColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun spaceColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun starIntensity (D)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun starIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun starIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun starIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun verticalRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun verticalRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun verticalRangeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic fun verticalRangeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver {\n\tpublic abstract fun color (I)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun highColor (I)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun highColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun highColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun highColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun highColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun highColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun highColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun horizonBlend (D)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun horizonBlend (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun horizonBlendTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun horizonBlendTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun range (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun range (Ljava/util/List;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun rangeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun rangeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun spaceColor (I)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun spaceColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun spaceColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun spaceColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun spaceColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun spaceColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun spaceColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun starIntensity (D)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun starIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun starIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun starIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun verticalRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun verticalRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun verticalRangeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic abstract fun verticalRangeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n}\n\npublic final class com/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver$DefaultImpls {\n\tpublic static synthetic fun color$default (Lcom/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic static synthetic fun highColor$default (Lcom/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic static synthetic fun horizonBlend$default (Lcom/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic static synthetic fun range$default (Lcom/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic static synthetic fun spaceColor$default (Lcom/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic static synthetic fun starIntensity$default (Lcom/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic static synthetic fun verticalRange$default (Lcom/mapbox/maps/extension/style/atmosphere/generated/AtmosphereDslReceiver;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n}\n\npublic final class com/mapbox/maps/extension/style/atmosphere/generated/AtmosphereKt {\n\tpublic static final fun atmosphere (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n}\n\npublic final class com/mapbox/maps/extension/style/atmosphere/generated/AtmosphereUtils {\n\tpublic static final fun getAtmosphere (Lcom/mapbox/maps/MapboxStyleManager;)Lcom/mapbox/maps/extension/style/atmosphere/generated/Atmosphere;\n\tpublic static final fun removeAtmosphere (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic static final fun setAtmosphere (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleAtmosphereExtension;)V\n}\n\npublic final class com/mapbox/maps/extension/style/color/ColorThemeExtKt {\n\tpublic static final fun colorTheme ()Lcom/mapbox/maps/ColorTheme;\n\tpublic static final fun colorTheme (Landroid/graphics/Bitmap;)Lcom/mapbox/maps/ColorTheme;\n\tpublic static final fun colorTheme (Lcom/mapbox/maps/Image;)Lcom/mapbox/maps/ColorTheme;\n\tpublic static final fun colorTheme (Ljava/lang/String;)Lcom/mapbox/maps/ColorTheme;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/dsl/generated/ExpressionDslKt {\n\tpublic static final fun abs (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun abs (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun accumulated ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun acos (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun acos (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun activeAnchor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun all (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun any (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun array (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun asin (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun asin (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun at (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun at (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun atInterpolated (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun atan (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun atan (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun boolean (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ceil (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ceil (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun coalesce (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun collator (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun color (I)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun concat (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun concat ([Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun config (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun cos (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun cos (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun distance (Lcom/mapbox/geojson/GeoJson;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun distanceFromCenter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun division (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun division (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun downcase (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun downcase (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun e ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun eq (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun featureState (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun floor (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun floor (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun format (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun geometryType ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun get (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun get (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun get (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun gt (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun gte (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun has (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun has (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun has (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun heatmapDensity ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun hsl (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun hsla (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun id ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun image (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun inExpression (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun inExpression (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun inExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun indexOf (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun interpolate (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun isSupportedScript (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun isSupportedScript (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun length (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun length (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun letExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun lineProgress ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (J)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (Ljava/util/HashMap;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (Ljava/util/List;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ln (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ln (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ln2 ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun log10 (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun log10 (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun log2 (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun log2 (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun lt (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun lte (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun match (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun max (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun max ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun measureLight (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun min (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun min ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun mod (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun mod (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun neq (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun not (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun not (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun number (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun numberFormat (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun objectExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun pi ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun pitch ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun pow (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun pow (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun product (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun product ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun properties ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun random (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rasterParticleSpeed ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rasterValue ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun resolvedLocale (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rgb (DDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rgb (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rgba (DDDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rgba (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun round (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun round (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sin (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sin (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun skyRadialProgress ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun slice (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun split (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sqrt (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sqrt (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun step (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun string (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun subtract (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun subtract (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun subtract (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sum (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sum ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun switchCase (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun tan (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun tan (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toBoolean (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toColor (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toHsla (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toNumber (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toRgba (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toString (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun typeofExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun upcase (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun upcase (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun varExpression (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun varExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun within (Lcom/mapbox/geojson/Geometry;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun worldview (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun zoom ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/generated/Expression : com/mapbox/bindgen/Value {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/expressions/generated/Expression$Companion;\n\tpublic synthetic fun <init> (DLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (JLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (ZLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic static final fun abs (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun abs ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun accumulated ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun acos (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun acos ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun activeAnchor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun all ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun any ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun array ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun asin (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun asin ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun at (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun at ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun atInterpolated ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun atan (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun atan ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun boolean ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ceil (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ceil ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun coalesce ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun collator (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun collator (ZZLjava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun collator (ZZLjava/util/Locale;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun color (I)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun concat ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun concat ([Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun config ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun cos (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun cos ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun cubicBezier (DDDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun cubicBezier (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun cubicBezierInterpolator (DDDDLcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun cubicBezierInterpolator (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun distance (Lcom/mapbox/geojson/GeoJson;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun distanceFromCenter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun division (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun division ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun downcase (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun downcase ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun e ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun eq ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun exponential (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun exponential (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun exponentialInterpolator (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun exponentialInterpolator (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun featureState ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun floor (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun floor ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun format ([Lcom/mapbox/maps/extension/style/expressions/types/FormatSection;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun fromRaw (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun geometryType ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun get (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun get (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun get ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLiteralValue ()Ljava/lang/Object;\n\tpublic static final fun gt ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun gte ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun has (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun has (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun has ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun heatmapDensity ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun hsl ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun hsla ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun id ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun image (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/util/Map;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun image (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/util/Map;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/util/Map;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun image ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun inExpression (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun inExpression (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun inExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun indexOf ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun interpolate ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun isLiteral ()Z\n\tpublic static final fun isSupportedScript (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun isSupportedScript ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun length (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun length ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun letExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun lineProgress ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun linear ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun linearInterpolator (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (J)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal$extension_style_release (Ljava/util/HashMap;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun literal$extension_style_release (Ljava/util/List;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ln (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ln ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun ln2 ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun log10 (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun log10 ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun log2 (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun log2 ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun lt ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun lte ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun match (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun match ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun max ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun max ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun measureLight ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun min ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun min ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun mod (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun mod ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun neq ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun not (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun not ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun number ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun numberFormat (DLkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun numberFormat (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun objectExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun pi ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun pitch ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun pow (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun pow ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun product ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun product ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun properties ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun random ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rasterParticleSpeed ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rasterValue ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun resolvedLocale ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rgb (DDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rgb ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rgba (DDDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun rgba ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun round (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun round ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sin (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sin ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun skyRadialProgress ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun slice ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun split ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sqrt (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sqrt ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun step (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun step ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun string ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun subtract (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun subtract (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun subtract ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sum ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun sum ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun switchCase ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun switchCase ([Lkotlin/Pair;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun tan (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun tan ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toBoolean ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toColor ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toHsla ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toNumber ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toRgba ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun toString ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun typeofExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun upcase (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun upcase ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun varExpression (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun varExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun within (Lcom/mapbox/geojson/Geometry;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun worldview ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun zoom ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n}\n\npublic abstract class com/mapbox/maps/extension/style/expressions/generated/Expression$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun build ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder : com/mapbox/maps/extension/style/expressions/generated/Expression$Builder {\n\tpublic fun <init> ()V\n\tpublic fun build ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun caseSensitive (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic final fun caseSensitive (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic final fun caseSensitive (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic static synthetic fun caseSensitive$default (Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic final fun diacriticSensitive (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic final fun diacriticSensitive (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic final fun diacriticSensitive (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic static synthetic fun diacriticSensitive$default (Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic final fun locale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic final fun locale (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic final fun locale (Ljava/util/Locale;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n\tpublic final fun locale (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$CollatorBuilder;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/generated/Expression$Companion {\n\tpublic final fun abs (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun abs (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun abs ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun accumulated ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun acos (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun acos (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun acos ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun activeAnchor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun all (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun all ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun any (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun any ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun array (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun array ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun asin (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun asin (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun asin ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun at (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun at (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun at ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun atInterpolated (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun atInterpolated ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun atan (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun atan (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun atan ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun boolean (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun boolean ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun ceil (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun ceil (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun ceil ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun coalesce (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun coalesce ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun collator (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun collator (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun collator (ZZLjava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun collator (ZZLjava/util/Locale;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static synthetic fun collator$default (Lcom/mapbox/maps/extension/style/expressions/generated/Expression$Companion;ZZLjava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static synthetic fun collator$default (Lcom/mapbox/maps/extension/style/expressions/generated/Expression$Companion;ZZLjava/util/Locale;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun color (I)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun concat (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun concat ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun concat ([Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun config (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun config ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun cos (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun cos (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun cos ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun cubicBezier (DDDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun cubicBezier (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun cubicBezier (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun cubicBezierInterpolator (DDDDLcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun cubicBezierInterpolator (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun distance (Lcom/mapbox/geojson/GeoJson;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun distanceFromCenter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun division (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun division (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun division ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun downcase (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun downcase (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun downcase ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun e ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun eq (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun eq ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun exponential (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun exponential (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun exponential (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun exponentialInterpolator (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun exponentialInterpolator (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun featureState (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun featureState ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun floor (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun floor (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun floor ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun format (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun format ([Lcom/mapbox/maps/extension/style/expressions/types/FormatSection;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun fromRaw (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun geometryType ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun get (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun get (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun get (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun get ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun gt (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun gt ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun gte (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun gte ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun has (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun has (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun has (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun has ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun heatmapDensity ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun hsl (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun hsl ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun hsla (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun hsla ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun id ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun image (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/util/Map;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun image (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/util/Map;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/util/Map;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun image (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun image ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun inExpression (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun inExpression (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun inExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun inExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun indexOf (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun indexOf ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun interpolate (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun interpolate ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun isSupportedScript (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun isSupportedScript (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun isSupportedScript ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun length (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun length (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun length ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun letExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun letExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun lineProgress ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun linear ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun linearInterpolator (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun literal (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun literal (J)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun literal (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun literal (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun ln (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun ln (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun ln ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun ln2 ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun log10 (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun log10 (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun log10 ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun log2 (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun log2 (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun log2 ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun lt (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun lt ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun lte (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun lte ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun match (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun match (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun match ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun max (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun max ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun max ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun measureLight (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun measureLight ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun min (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun min ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun min ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun mod (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun mod (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun mod ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun neq (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun neq ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun not (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun not (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun not ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun number (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun number ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun numberFormat (DLkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun numberFormat (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun numberFormat (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static synthetic fun numberFormat$default (Lcom/mapbox/maps/extension/style/expressions/generated/Expression$Companion;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun objectExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun objectExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun pi ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun pitch ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun pow (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun pow (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun pow ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun product (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun product ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun product ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun properties ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun random (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun random ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun rasterParticleSpeed ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun rasterValue ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun resolvedLocale (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun resolvedLocale ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun rgb (DDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun rgb (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun rgb ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun rgba (DDDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun rgba (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun rgba ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun round (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun round (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun round ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun sin (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun sin (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun sin ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun skyRadialProgress ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun slice (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun slice ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun split (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun split ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun sqrt (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun sqrt (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun sqrt ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun step (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;[Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun step (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun step ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun string (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun string ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun subtract (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun subtract (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun subtract (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun subtract ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun sum (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun sum ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun sum ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun switchCase (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun switchCase ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun switchCase ([Lkotlin/Pair;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun tan (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun tan (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun tan ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toBoolean (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toBoolean ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toColor (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toColor ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toHsla (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toHsla ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toNumber (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toNumber ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toRgba (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toRgba ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toString (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun toString ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun typeofExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun typeofExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun upcase (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun upcase (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun upcase ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun varExpression (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun varExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun varExpression ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun within (Lcom/mapbox/geojson/Geometry;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun worldview (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun worldview ([Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun zoom ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n}\n\npublic class com/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder : com/mapbox/maps/extension/style/expressions/generated/Expression$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun abs (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun abs (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun accumulated ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun acos (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun acos (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun activeAnchor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun addArgument (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun all (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun any (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun array (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun asin (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun asin (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun at (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun at (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun atInterpolated (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun atan (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun atan (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun boolean (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun ceil (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun ceil (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun coalesce (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun collator (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun color (I)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun concat (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun concat ([Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun config (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun cos (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun cos (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun distance (Lcom/mapbox/geojson/GeoJson;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun distanceFromCenter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun division (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun division (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun downcase (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun downcase (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun e ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun eq (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun featureState (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun floor (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun floor (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun format (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun geometryType ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun get (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun get (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun get (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun gt (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun gte (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun has (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun has (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun has (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun heatmapDensity ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun hsl (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun hsla (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun id ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun image (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun inExpression (DLcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun inExpression (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun inExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun indexOf (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun interpolate (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun isSupportedScript (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun isSupportedScript (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun length (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun length (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun letExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun lineProgress ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun literal (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun literal (J)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun literal (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun literal (Ljava/util/HashMap;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun literal (Ljava/util/List;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun literal (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun ln (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun ln (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun ln2 ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun log10 (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun log10 (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun log2 (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun log2 (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun lt (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun lte (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun match (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun max (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun max ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun measureLight (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun min (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun min ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun mod (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun mod (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun neq (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun not (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun not (Z)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun number (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun numberFormat (DLkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun numberFormat (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun objectExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun pi ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun pitch ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun pow (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun pow (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun product (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun product ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun properties ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun random (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun rasterParticleSpeed ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun rasterValue ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun resolvedLocale (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun rgb (DDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun rgb (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun rgba (DDDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun rgba (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun round (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun round (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun sin (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun sin (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun skyRadialProgress ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun slice (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun split (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun sqrt (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun sqrt (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun step (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun stop (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun stop (DLkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun stop (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun stop (Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun stop (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun string (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun subtract (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun subtract (DD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun subtract (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun sum (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun sum ([D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun switchCase (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun tan (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun tan (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun toBoolean (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun toColor (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun toHsla (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun toNumber (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun toRgba (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun toString (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun typeofExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun upcase (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun upcase (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun varExpression (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun varExpression (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun within (Lcom/mapbox/geojson/Geometry;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun worldview (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n\tpublic final fun zoom ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/generated/Expression$FormatBuilder : com/mapbox/maps/extension/style/expressions/generated/Expression$Builder {\n\tpublic fun <init> ()V\n\tpublic fun build ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun formatSection (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatBuilder;\n\tpublic final fun formatSection (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatBuilder;\n\tpublic final fun formatSection (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatBuilder;\n\tpublic final fun formatSection (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatBuilder;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder {\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun build ()Ljava/util/List;\n\tpublic final fun fontScale (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n\tpublic final fun fontScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n\tpublic final fun fontScale (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n\tpublic final fun textColor (I)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n\tpublic final fun textColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n\tpublic final fun textColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n\tpublic final fun textColor (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n\tpublic final fun textFont (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n\tpublic final fun textFont (Ljava/util/List;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n\tpublic final fun textFont (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$FormatSectionBuilder;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/generated/Expression$ImageBuilder : com/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder {\n\tpublic fun <init> ()V\n\tpublic final fun imageOptions ([Lkotlin/Pair;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$ImageBuilder;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/generated/Expression$InterpolatorBuilder : com/mapbox/maps/extension/style/expressions/generated/Expression$ExpressionBuilder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun cubicBezier (DDDD)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$InterpolatorBuilder;\n\tpublic final fun cubicBezier (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$InterpolatorBuilder;\n\tpublic final fun cubicBezier (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$InterpolatorBuilder;\n\tpublic final fun exponential (D)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$InterpolatorBuilder;\n\tpublic final fun exponential (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$InterpolatorBuilder;\n\tpublic final fun exponential (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$InterpolatorBuilder;\n\tpublic final fun linear ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression$InterpolatorBuilder;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder : com/mapbox/maps/extension/style/expressions/generated/Expression$Builder {\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun build ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun currency (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun currency (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun currency (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun locale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun locale (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun locale (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun maxFractionDigits (I)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun maxFractionDigits (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun maxFractionDigits (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun minFractionDigits (I)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun minFractionDigits (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n\tpublic final fun minFractionDigits (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression$NumberFormatBuilder;\n}\n\npublic final class com/mapbox/maps/extension/style/expressions/types/FormatSection {\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun component2 ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun component3 ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun component4 ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun copy (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/expressions/types/FormatSection;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/style/expressions/types/FormatSection;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/expressions/types/FormatSection;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getContent ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFontScale ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextColor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextFont ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun hashCode ()I\n\tpublic final fun setFontScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun setTextColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun setTextFont (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/style/image/ImageExtensionImpl : com/mapbox/maps/extension/style/StyleContract$StyleImageExtension {\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;)V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic final class com/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Landroid/graphics/Bitmap;)V\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/Image;)V\n\tpublic final fun bitmap (Landroid/graphics/Bitmap;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl;\n\tpublic final fun content (Lcom/mapbox/maps/ImageContent;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n\tpublic final fun getImageId ()Ljava/lang/String;\n\tpublic final fun image (Lcom/mapbox/maps/Image;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n\tpublic final fun scale (F)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n\tpublic final fun sdf (Z)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n\tpublic static synthetic fun sdf$default (Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n\tpublic final fun stretchX (Ljava/util/List;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n\tpublic static synthetic fun stretchX$default (Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n\tpublic final fun stretchY (Ljava/util/List;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n\tpublic static synthetic fun stretchY$default (Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl : com/mapbox/maps/extension/style/StyleContract$StyleImageExtension {\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl$Builder;)V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic final class com/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl$Builder {\n\tpublic fun <init> (Ljava/lang/String;Landroid/graphics/Bitmap;)V\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl;\n\tpublic final fun getBitmap ()Landroid/graphics/Bitmap;\n\tpublic final fun getImageId ()Ljava/lang/String;\n\tpublic final fun scale (F)Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl$Builder;\n\tpublic final fun sdf (Z)Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl$Builder;\n\tpublic static synthetic fun sdf$default (Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/image/ImageUtils {\n\tpublic static final fun addImage (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleImageExtension;)V\n\tpublic static final fun addImage9Patch (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleImageExtension;)V\n\tpublic static final fun image (Ljava/lang/String;Landroid/graphics/Bitmap;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl;\n\tpublic static final fun image (Ljava/lang/String;Lcom/mapbox/maps/Image;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl;\n\tpublic static final fun image (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl;\n\tpublic static synthetic fun image$default (Ljava/lang/String;Landroid/graphics/Bitmap;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl;\n\tpublic static synthetic fun image$default (Ljava/lang/String;Lcom/mapbox/maps/Image;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/image/ImageExtensionImpl;\n\tpublic static final fun image9Patch (Ljava/lang/String;Landroid/graphics/Bitmap;)Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl;\n\tpublic static final fun image9Patch (Ljava/lang/String;Landroid/graphics/Bitmap;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl;\n\tpublic static synthetic fun image9Patch$default (Ljava/lang/String;Landroid/graphics/Bitmap;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl;\n}\n\npublic final class com/mapbox/maps/extension/style/image/NinePatchImage {\n\tpublic fun <init> (Lcom/mapbox/maps/Image;Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;)V\n\tpublic final fun component1 ()Lcom/mapbox/maps/Image;\n\tpublic final fun component2 ()Ljava/util/List;\n\tpublic final fun component3 ()Ljava/util/List;\n\tpublic final fun component4 ()Lcom/mapbox/maps/ImageContent;\n\tpublic final fun copy (Lcom/mapbox/maps/Image;Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;)Lcom/mapbox/maps/extension/style/image/NinePatchImage;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/style/image/NinePatchImage;Lcom/mapbox/maps/Image;Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/image/NinePatchImage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getImageContent ()Lcom/mapbox/maps/ImageContent;\n\tpublic final fun getInternalImage ()Lcom/mapbox/maps/Image;\n\tpublic final fun getStretchX ()Ljava/util/List;\n\tpublic final fun getStretchY ()Ljava/util/List;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/style/image/NinePatchUtils {\n\tpublic static final fun addImage9Patch (Lcom/mapbox/maps/MapboxStyleManager;Ljava/lang/String;Landroid/graphics/Bitmap;)Lcom/mapbox/bindgen/Expected;\n\tpublic static final fun addImage9Patch (Lcom/mapbox/maps/MapboxStyleManager;Ljava/lang/String;Landroid/graphics/Bitmap;F)Lcom/mapbox/bindgen/Expected;\n\tpublic static final fun addImage9Patch (Lcom/mapbox/maps/MapboxStyleManager;Ljava/lang/String;Landroid/graphics/Bitmap;FZ)Lcom/mapbox/bindgen/Expected;\n\tpublic static synthetic fun addImage9Patch$default (Lcom/mapbox/maps/MapboxStyleManager;Ljava/lang/String;Landroid/graphics/Bitmap;FZILjava/lang/Object;)Lcom/mapbox/bindgen/Expected;\n\tpublic static final fun parse9PatchBitmap (Landroid/graphics/Bitmap;)Lcom/mapbox/maps/extension/style/image/NinePatchImage;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/CustomLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/CustomLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/CustomLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/CustomLayerHost;)V\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/CustomLayer$Companion {\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/CustomLayerDsl {\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/CustomLayerKt {\n\tpublic static final fun customLayer (Ljava/lang/String;Lcom/mapbox/maps/CustomLayerHost;)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic static final fun customLayer (Ljava/lang/String;Lcom/mapbox/maps/CustomLayerHost;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n\tpublic static synthetic fun customLayer$default (Ljava/lang/String;Lcom/mapbox/maps/CustomLayerHost;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/CustomLayer;\n}\n\npublic abstract class com/mapbox/maps/extension/style/layers/Layer : com/mapbox/maps/extension/style/StyleContract$StyleLayerExtension {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/Layer$Companion;\n\tpublic fun <init> ()V\n\tprotected fun addLayer (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tprotected fun addPersistentLayer (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic final fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/LayerPosition;)V\n\tprotected final fun getCachedLayerProperties ()Lcom/mapbox/bindgen/Value;\n\tpublic abstract fun getLayerId ()Ljava/lang/String;\n\tpublic abstract fun getMaxZoom ()Ljava/lang/Double;\n\tpublic abstract fun getMinZoom ()Ljava/lang/Double;\n\tpublic abstract fun getSlot ()Ljava/lang/String;\n\tpublic abstract fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic abstract fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/Layer$Companion {\n}\n\npublic final class com/mapbox/maps/extension/style/layers/LayerUtils {\n\tpublic static final field TAG Ljava/lang/String;\n\tpublic static final fun addLayer (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleLayerExtension;)V\n\tpublic static final fun addLayerAbove (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleLayerExtension;Ljava/lang/String;)V\n\tpublic static final fun addLayerAt (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleLayerExtension;Ljava/lang/Integer;)V\n\tpublic static final fun addLayerBelow (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleLayerExtension;Ljava/lang/String;)V\n\tpublic static final fun addPersistentLayer (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/layers/Layer;)V\n\tpublic static final fun addPersistentLayer (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/layers/Layer;Lcom/mapbox/maps/LayerPosition;)V\n\tpublic static synthetic fun addPersistentLayer$default (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/layers/Layer;Lcom/mapbox/maps/LayerPosition;ILjava/lang/Object;)V\n\tpublic static final fun getLayer (Lcom/mapbox/maps/MapboxStyleManager;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic static final fun isPersistent (Lcom/mapbox/maps/extension/style/layers/Layer;)Ljava/lang/Boolean;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/BackgroundLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/BackgroundLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun backgroundColor (I)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundPattern (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundPattern (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundPitchAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic fun backgroundPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic final fun getBackgroundColor ()Ljava/lang/String;\n\tpublic final fun getBackgroundColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getBackgroundColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getBackgroundColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getBackgroundColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getBackgroundColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getBackgroundEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getBackgroundEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getBackgroundEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getBackgroundOpacity ()Ljava/lang/Double;\n\tpublic final fun getBackgroundOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getBackgroundOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getBackgroundPattern ()Ljava/lang/String;\n\tpublic final fun getBackgroundPatternAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getBackgroundPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment;\n\tpublic final fun getBackgroundPitchAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/BackgroundLayer$Companion {\n\tpublic final fun getDefaultBackgroundColor ()Ljava/lang/String;\n\tpublic final fun getDefaultBackgroundColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultBackgroundColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultBackgroundColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultBackgroundColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultBackgroundColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultBackgroundEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultBackgroundEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultBackgroundEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultBackgroundOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultBackgroundOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultBackgroundOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultBackgroundPattern ()Ljava/lang/String;\n\tpublic final fun getDefaultBackgroundPatternAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultBackgroundPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment;\n\tpublic final fun getDefaultBackgroundPitchAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/BackgroundLayerDsl {\n\tpublic abstract fun backgroundColor (I)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundPattern (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundPattern (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundPitchAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun backgroundPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/BackgroundLayerDsl$DefaultImpls {\n\tpublic static synthetic fun backgroundColor$default (Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic static synthetic fun backgroundEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic static synthetic fun backgroundOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n\tpublic static synthetic fun backgroundPitchAlignment$default (Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/BackgroundLayerKt {\n\tpublic static final fun backgroundLayer (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/BackgroundLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/CircleLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/CircleLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun circleBlur (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleBlur (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleBlurTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleBlurTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleColor (I)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circlePitchAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circlePitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circlePitchScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circlePitchScale (Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleSortKey (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleSortKey (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeColor (I)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleStrokeWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun circleTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic final fun getCircleBlur ()Ljava/lang/Double;\n\tpublic final fun getCircleBlurAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleBlurTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getCircleColor ()Ljava/lang/String;\n\tpublic final fun getCircleColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getCircleColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getCircleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;\n\tpublic final fun getCircleElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getCircleEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getCircleOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getCirclePitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;\n\tpublic final fun getCirclePitchAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCirclePitchScale ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;\n\tpublic final fun getCirclePitchScaleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleRadius ()Ljava/lang/Double;\n\tpublic final fun getCircleRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getCircleSortKey ()Ljava/lang/Double;\n\tpublic final fun getCircleSortKeyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleStrokeColor ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getCircleStrokeColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleStrokeColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getCircleStrokeColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleStrokeOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleStrokeOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getCircleStrokeWidth ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleStrokeWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getCircleTranslate ()Ljava/util/List;\n\tpublic final fun getCircleTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;\n\tpublic final fun getCircleTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCircleTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/CircleLayer$Companion {\n\tpublic final fun getDefaultCircleBlur ()Ljava/lang/Double;\n\tpublic final fun getDefaultCircleBlurAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleBlurTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultCircleColor ()Ljava/lang/String;\n\tpublic final fun getDefaultCircleColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultCircleColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultCircleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultCircleColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;\n\tpublic final fun getDefaultCircleElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultCircleEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultCircleOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultCircleOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultCirclePitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;\n\tpublic final fun getDefaultCirclePitchAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCirclePitchScale ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;\n\tpublic final fun getDefaultCirclePitchScaleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultCircleRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultCircleSortKey ()Ljava/lang/Double;\n\tpublic final fun getDefaultCircleSortKeyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleStrokeColor ()Ljava/lang/String;\n\tpublic final fun getDefaultCircleStrokeColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultCircleStrokeColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleStrokeColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultCircleStrokeColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultCircleStrokeColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleStrokeOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultCircleStrokeOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleStrokeOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultCircleStrokeWidth ()Ljava/lang/Double;\n\tpublic final fun getDefaultCircleStrokeWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleStrokeWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultCircleTranslate ()Ljava/util/List;\n\tpublic final fun getDefaultCircleTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;\n\tpublic final fun getDefaultCircleTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultCircleTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/CircleLayerDsl {\n\tpublic abstract fun circleBlur (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleBlur (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleBlurTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleBlurTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleColor (I)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circlePitchAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circlePitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circlePitchScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circlePitchScale (Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleSortKey (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleSortKey (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeColor (I)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleStrokeWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun circleTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/CircleLayerDsl$DefaultImpls {\n\tpublic static synthetic fun circleBlur$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleColor$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleElevationReference$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circlePitchAlignment$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circlePitchScale$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleStrokeColor$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleStrokeOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleStrokeWidth$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleTranslate$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n\tpublic static synthetic fun circleTranslateAnchor$default (Lcom/mapbox/maps/extension/style/layers/generated/CircleLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/CircleLayerKt {\n\tpublic static final fun circleLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/CircleLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/ClipLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/ClipLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun clipLayerScope (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic fun clipLayerScope (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic fun clipLayerTypes (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic fun clipLayerTypes (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic final fun getClipLayerScope ()Ljava/util/List;\n\tpublic final fun getClipLayerScopeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getClipLayerTypes ()Ljava/util/List;\n\tpublic final fun getClipLayerTypesAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/ClipLayer$Companion {\n\tpublic final fun getDefaultClipLayerScope ()Ljava/util/List;\n\tpublic final fun getDefaultClipLayerScopeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultClipLayerTypes ()Ljava/util/List;\n\tpublic final fun getDefaultClipLayerTypesAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/ClipLayerDsl {\n\tpublic abstract fun clipLayerScope (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun clipLayerScope (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun clipLayerTypes (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun clipLayerTypes (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/ClipLayerDsl$DefaultImpls {\n\tpublic static synthetic fun clipLayerScope$default (Lcom/mapbox/maps/extension/style/layers/generated/ClipLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n\tpublic static synthetic fun clipLayerTypes$default (Lcom/mapbox/maps/extension/style/layers/generated/ClipLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/ClipLayerKt {\n\tpublic static final fun clipLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ClipLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun fillExtrusionAmbientOcclusionGroundAttenuation (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionGroundAttenuation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionGroundAttenuationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionGroundAttenuationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionGroundRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionGroundRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionGroundRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionGroundRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionWallRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionWallRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionWallRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionAmbientOcclusionWallRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionBase (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionBase (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionBaseAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionBaseAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionBaseTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionBaseTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionCastShadows (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionCastShadows (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionCutoffFadeRange (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionCutoffFadeRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionEdgeRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionEdgeRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightGroundAttenuation (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightGroundAttenuation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightGroundAttenuationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightGroundAttenuationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightGroundRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightGroundRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightGroundRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightGroundRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightWallRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightWallRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightWallRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionFloodLightWallRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionHeight (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionHeight (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionHeightAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionHeightAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionHeightTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionHeightTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionLineWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionLineWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionLineWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionLineWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionPattern (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionPattern (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionPatternCrossFade (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionPatternCrossFade (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionRoundedRoof (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionRoundedRoof (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionVerticalGradient (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionVerticalGradient (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionVerticalScale (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionVerticalScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionVerticalScaleTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun fillExtrusionVerticalScaleTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundAttenuation ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundAttenuationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundAttenuationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundRadius ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionAmbientOcclusionGroundRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionAmbientOcclusionIntensity ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionAmbientOcclusionIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionAmbientOcclusionIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionAmbientOcclusionRadius ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionAmbientOcclusionRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionAmbientOcclusionRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionAmbientOcclusionWallRadius ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionAmbientOcclusionWallRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionAmbientOcclusionWallRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionBase ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionBaseAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment;\n\tpublic final fun getFillExtrusionBaseAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionBaseAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionBaseTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionCastShadows ()Ljava/lang/Boolean;\n\tpublic final fun getFillExtrusionCastShadowsAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionColor ()Ljava/lang/String;\n\tpublic final fun getFillExtrusionColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillExtrusionColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillExtrusionColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionCutoffFadeRange ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionCutoffFadeRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionEdgeRadius ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionEdgeRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionFloodLightColor ()Ljava/lang/String;\n\tpublic final fun getFillExtrusionFloodLightColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillExtrusionFloodLightColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionFloodLightColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionFloodLightColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillExtrusionFloodLightColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionFloodLightGroundAttenuation ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionFloodLightGroundAttenuationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionFloodLightGroundAttenuationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionFloodLightGroundRadius ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionFloodLightGroundRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionFloodLightGroundRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionFloodLightIntensity ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionFloodLightIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionFloodLightIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionFloodLightWallRadius ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionFloodLightWallRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionFloodLightWallRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionHeight ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionHeightAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment;\n\tpublic final fun getFillExtrusionHeightAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionHeightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionHeightTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionLineWidth ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionLineWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionLineWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionPattern ()Ljava/lang/String;\n\tpublic final fun getFillExtrusionPatternAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionPatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionPatternCrossFadeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionRoundedRoof ()Ljava/lang/Boolean;\n\tpublic final fun getFillExtrusionRoundedRoofAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionTranslate ()Ljava/util/List;\n\tpublic final fun getFillExtrusionTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor;\n\tpublic final fun getFillExtrusionTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillExtrusionVerticalGradient ()Ljava/lang/Boolean;\n\tpublic final fun getFillExtrusionVerticalGradientAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionVerticalScale ()Ljava/lang/Double;\n\tpublic final fun getFillExtrusionVerticalScaleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillExtrusionVerticalScaleTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer$Companion {\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionGroundAttenuation ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionGroundAttenuationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionGroundRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionGroundRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionIntensity ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionWallRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionWallRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionAmbientOcclusionWallRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionBase ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionBaseAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment;\n\tpublic final fun getDefaultFillExtrusionBaseAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionBaseAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionBaseTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionCastShadows ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultFillExtrusionCastShadowsAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionColor ()Ljava/lang/String;\n\tpublic final fun getDefaultFillExtrusionColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultFillExtrusionColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultFillExtrusionColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionCutoffFadeRange ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionCutoffFadeRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionEdgeRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionEdgeRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionFloodLightColor ()Ljava/lang/String;\n\tpublic final fun getDefaultFillExtrusionFloodLightColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultFillExtrusionFloodLightColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionFloodLightColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionFloodLightColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultFillExtrusionFloodLightColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionFloodLightGroundAttenuation ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionFloodLightGroundAttenuationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionFloodLightGroundAttenuationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionFloodLightGroundRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionFloodLightGroundRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionFloodLightGroundRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionFloodLightIntensity ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionFloodLightIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionFloodLightIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionFloodLightWallRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionFloodLightWallRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionFloodLightWallRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionHeight ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionHeightAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment;\n\tpublic final fun getDefaultFillExtrusionHeightAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionHeightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionHeightTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionLineWidth ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionLineWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionLineWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionPattern ()Ljava/lang/String;\n\tpublic final fun getDefaultFillExtrusionPatternAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionPatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionPatternCrossFadeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionRoundedRoof ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultFillExtrusionRoundedRoofAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionTranslate ()Ljava/util/List;\n\tpublic final fun getDefaultFillExtrusionTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor;\n\tpublic final fun getDefaultFillExtrusionTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillExtrusionVerticalGradient ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultFillExtrusionVerticalGradientAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionVerticalScale ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillExtrusionVerticalScaleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillExtrusionVerticalScaleTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl {\n\tpublic abstract fun fillExtrusionAmbientOcclusionGroundAttenuation (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionGroundAttenuation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionGroundAttenuationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionGroundAttenuationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionGroundRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionGroundRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionGroundRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionGroundRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionWallRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionWallRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionWallRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionAmbientOcclusionWallRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionBase (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionBase (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionBaseAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionBaseAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionBaseTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionBaseTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionCastShadows (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionCastShadows (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionCutoffFadeRange (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionCutoffFadeRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionEdgeRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionEdgeRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightGroundAttenuation (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightGroundAttenuation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightGroundAttenuationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightGroundAttenuationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightGroundRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightGroundRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightGroundRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightGroundRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightWallRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightWallRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightWallRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionFloodLightWallRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionHeight (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionHeight (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionHeightAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionHeightAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionHeightTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionHeightTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionLineWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionLineWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionLineWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionLineWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionPattern (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionPattern (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionPatternCrossFade (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionPatternCrossFade (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionRoundedRoof (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionRoundedRoof (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionVerticalGradient (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionVerticalGradient (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionVerticalScale (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionVerticalScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionVerticalScaleTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun fillExtrusionVerticalScaleTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl$DefaultImpls {\n\tpublic static synthetic fun fillExtrusionAmbientOcclusionGroundAttenuation$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionAmbientOcclusionGroundRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionAmbientOcclusionIntensity$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionAmbientOcclusionRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionAmbientOcclusionWallRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionBase$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionBaseAlignment$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionCastShadows$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionColor$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionCutoffFadeRange$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionEdgeRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionFloodLightColor$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionFloodLightGroundAttenuation$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionFloodLightGroundRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionFloodLightIntensity$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionFloodLightWallRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionHeight$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionHeightAlignment$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionLineWidth$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionPatternCrossFade$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionRoundedRoof$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionTranslate$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionTranslateAnchor$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionVerticalGradient$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n\tpublic static synthetic fun fillExtrusionVerticalScale$default (Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerKt {\n\tpublic static final fun fillExtrusionLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/FillLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/FillLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/FillLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun fillAntialias (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillAntialias (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillBridgeGuardRailColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillBridgeGuardRailColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillBridgeGuardRailColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillBridgeGuardRailColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillBridgeGuardRailColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillBridgeGuardRailColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillBridgeGuardRailColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillConstructBridgeGuardRail (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillConstructBridgeGuardRail (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOutlineColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOutlineColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOutlineColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOutlineColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOutlineColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOutlineColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillOutlineColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillPattern (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillPattern (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillPatternCrossFade (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillPatternCrossFade (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillSortKey (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillSortKey (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTunnelStructureColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTunnelStructureColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTunnelStructureColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTunnelStructureColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTunnelStructureColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTunnelStructureColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillTunnelStructureColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillZOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillZOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillZOffsetTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun fillZOffsetTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic final fun getFillAntialias ()Ljava/lang/Boolean;\n\tpublic final fun getFillAntialiasAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillBridgeGuardRailColor ()Ljava/lang/String;\n\tpublic final fun getFillBridgeGuardRailColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillBridgeGuardRailColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillBridgeGuardRailColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillBridgeGuardRailColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillBridgeGuardRailColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillColor ()Ljava/lang/String;\n\tpublic final fun getFillColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillConstructBridgeGuardRail ()Ljava/lang/Boolean;\n\tpublic final fun getFillConstructBridgeGuardRailAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;\n\tpublic final fun getFillElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getFillEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillOpacity ()Ljava/lang/Double;\n\tpublic final fun getFillOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillOutlineColor ()Ljava/lang/String;\n\tpublic final fun getFillOutlineColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillOutlineColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillOutlineColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillOutlineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillOutlineColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillPattern ()Ljava/lang/String;\n\tpublic final fun getFillPatternAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillPatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getFillPatternCrossFadeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillSortKey ()Ljava/lang/Double;\n\tpublic final fun getFillSortKeyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillTranslate ()Ljava/util/List;\n\tpublic final fun getFillTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;\n\tpublic final fun getFillTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillTunnelStructureColor ()Ljava/lang/String;\n\tpublic final fun getFillTunnelStructureColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillTunnelStructureColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillTunnelStructureColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFillTunnelStructureColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillTunnelStructureColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillZOffset ()Ljava/lang/Double;\n\tpublic final fun getFillZOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFillZOffsetTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/FillLayer$Companion {\n\tpublic final fun getDefaultFillAntialias ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultFillAntialiasAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillBridgeGuardRailColor ()Ljava/lang/String;\n\tpublic final fun getDefaultFillBridgeGuardRailColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultFillBridgeGuardRailColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillBridgeGuardRailColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillBridgeGuardRailColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultFillBridgeGuardRailColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillColor ()Ljava/lang/String;\n\tpublic final fun getDefaultFillColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultFillColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultFillColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillConstructBridgeGuardRail ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultFillConstructBridgeGuardRailAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;\n\tpublic final fun getDefaultFillElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillOutlineColor ()Ljava/lang/String;\n\tpublic final fun getDefaultFillOutlineColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultFillOutlineColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillOutlineColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillOutlineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultFillOutlineColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillPattern ()Ljava/lang/String;\n\tpublic final fun getDefaultFillPatternAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillPatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillPatternCrossFadeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillSortKey ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillSortKeyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillTranslate ()Ljava/util/List;\n\tpublic final fun getDefaultFillTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;\n\tpublic final fun getDefaultFillTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillTunnelStructureColor ()Ljava/lang/String;\n\tpublic final fun getDefaultFillTunnelStructureColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultFillTunnelStructureColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillTunnelStructureColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultFillTunnelStructureColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultFillTunnelStructureColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillZOffset ()Ljava/lang/Double;\n\tpublic final fun getDefaultFillZOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultFillZOffsetTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/FillLayerDsl {\n\tpublic abstract fun fillAntialias (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillAntialias (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillBridgeGuardRailColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillBridgeGuardRailColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillBridgeGuardRailColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillBridgeGuardRailColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillBridgeGuardRailColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillBridgeGuardRailColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillBridgeGuardRailColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillConstructBridgeGuardRail (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillConstructBridgeGuardRail (Z)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOutlineColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOutlineColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOutlineColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOutlineColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOutlineColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOutlineColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillOutlineColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillPattern (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillPattern (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillPatternCrossFade (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillPatternCrossFade (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillSortKey (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillSortKey (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTunnelStructureColor (I)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTunnelStructureColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTunnelStructureColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTunnelStructureColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTunnelStructureColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTunnelStructureColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillTunnelStructureColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillZOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillZOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillZOffsetTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun fillZOffsetTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/FillLayerDsl$DefaultImpls {\n\tpublic static synthetic fun fillAntialias$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillBridgeGuardRailColor$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillColor$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillConstructBridgeGuardRail$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillElevationReference$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillPatternCrossFade$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillTranslate$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillTranslateAnchor$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillTunnelStructureColor$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n\tpublic static synthetic fun fillZOffset$default (Lcom/mapbox/maps/extension/style/layers/generated/FillLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/FillLayerKt {\n\tpublic static final fun fillLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/FillLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/HeatmapLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/HeatmapLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHeatmapColor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHeatmapColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getHeatmapColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHeatmapIntensity ()Ljava/lang/Double;\n\tpublic final fun getHeatmapIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHeatmapIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getHeatmapOpacity ()Ljava/lang/Double;\n\tpublic final fun getHeatmapOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHeatmapOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getHeatmapRadius ()Ljava/lang/Double;\n\tpublic final fun getHeatmapRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHeatmapRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getHeatmapWeight ()Ljava/lang/Double;\n\tpublic final fun getHeatmapWeightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun heatmapColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapWeight (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun heatmapWeight (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/HeatmapLayer$Companion {\n\tpublic final fun getDefaultHeatmapColor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHeatmapColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultHeatmapColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHeatmapIntensity ()Ljava/lang/Double;\n\tpublic final fun getDefaultHeatmapIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHeatmapIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultHeatmapOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultHeatmapOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHeatmapOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultHeatmapRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultHeatmapRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHeatmapRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultHeatmapWeight ()Ljava/lang/Double;\n\tpublic final fun getDefaultHeatmapWeightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/HeatmapLayerDsl {\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapWeight (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun heatmapWeight (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/HeatmapLayerDsl$DefaultImpls {\n\tpublic static synthetic fun heatmapIntensity$default (Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic static synthetic fun heatmapOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic static synthetic fun heatmapRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n\tpublic static synthetic fun heatmapWeight$default (Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/HeatmapLayerKt {\n\tpublic static final fun heatmapLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HeatmapLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/HillshadeLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic final fun getHillshadeAccentColor ()Ljava/lang/String;\n\tpublic final fun getHillshadeAccentColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getHillshadeAccentColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHillshadeAccentColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getHillshadeAccentColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getHillshadeAccentColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHillshadeEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getHillshadeEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHillshadeEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getHillshadeExaggeration ()Ljava/lang/Double;\n\tpublic final fun getHillshadeExaggerationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHillshadeExaggerationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getHillshadeHighlightColor ()Ljava/lang/String;\n\tpublic final fun getHillshadeHighlightColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getHillshadeHighlightColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHillshadeHighlightColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getHillshadeHighlightColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getHillshadeHighlightColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHillshadeIlluminationAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor;\n\tpublic final fun getHillshadeIlluminationAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHillshadeIlluminationDirection ()Ljava/lang/Double;\n\tpublic final fun getHillshadeIlluminationDirectionAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHillshadeShadowColor ()Ljava/lang/String;\n\tpublic final fun getHillshadeShadowColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getHillshadeShadowColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getHillshadeShadowColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getHillshadeShadowColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getHillshadeShadowColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun hillshadeAccentColor (I)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeAccentColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeAccentColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeAccentColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeAccentColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeAccentColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeAccentColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeExaggeration (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeExaggeration (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeExaggerationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeExaggerationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeHighlightColor (I)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeHighlightColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeHighlightColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeHighlightColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeHighlightColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeHighlightColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeHighlightColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeIlluminationAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeIlluminationAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeIlluminationDirection (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeIlluminationDirection (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeShadowColor (I)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeShadowColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeShadowColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeShadowColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeShadowColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeShadowColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun hillshadeShadowColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/HillshadeLayer$Companion {\n\tpublic final fun getDefaultHillshadeAccentColor ()Ljava/lang/String;\n\tpublic final fun getDefaultHillshadeAccentColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultHillshadeAccentColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHillshadeAccentColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultHillshadeAccentColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultHillshadeAccentColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHillshadeEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultHillshadeEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHillshadeEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultHillshadeExaggeration ()Ljava/lang/Double;\n\tpublic final fun getDefaultHillshadeExaggerationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHillshadeExaggerationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultHillshadeHighlightColor ()Ljava/lang/String;\n\tpublic final fun getDefaultHillshadeHighlightColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultHillshadeHighlightColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHillshadeHighlightColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultHillshadeHighlightColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultHillshadeHighlightColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHillshadeIlluminationAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor;\n\tpublic final fun getDefaultHillshadeIlluminationAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHillshadeIlluminationDirection ()Ljava/lang/Double;\n\tpublic final fun getDefaultHillshadeIlluminationDirectionAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHillshadeShadowColor ()Ljava/lang/String;\n\tpublic final fun getDefaultHillshadeShadowColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultHillshadeShadowColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultHillshadeShadowColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultHillshadeShadowColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultHillshadeShadowColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl {\n\tpublic abstract fun hillshadeAccentColor (I)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeAccentColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeAccentColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeAccentColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeAccentColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeAccentColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeAccentColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeExaggeration (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeExaggeration (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeExaggerationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeExaggerationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeHighlightColor (I)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeHighlightColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeHighlightColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeHighlightColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeHighlightColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeHighlightColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeHighlightColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeIlluminationAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeIlluminationAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeIlluminationDirection (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeIlluminationDirection (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeShadowColor (I)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeShadowColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeShadowColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeShadowColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeShadowColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeShadowColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun hillshadeShadowColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl$DefaultImpls {\n\tpublic static synthetic fun hillshadeAccentColor$default (Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic static synthetic fun hillshadeEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic static synthetic fun hillshadeExaggeration$default (Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic static synthetic fun hillshadeHighlightColor$default (Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic static synthetic fun hillshadeIlluminationAnchor$default (Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic static synthetic fun hillshadeIlluminationDirection$default (Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n\tpublic static synthetic fun hillshadeShadowColor$default (Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/HillshadeLayerKt {\n\tpublic static final fun hillshadeLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/HillshadeLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/LineLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/LineLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/LineLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic final fun getLineBlur ()Ljava/lang/Double;\n\tpublic final fun getLineBlurAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineBlurTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineBorderColor ()Ljava/lang/String;\n\tpublic final fun getLineBorderColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getLineBorderColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineBorderColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineBorderColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineBorderColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineBorderWidth ()Ljava/lang/Double;\n\tpublic final fun getLineBorderWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineBorderWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineCap ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;\n\tpublic final fun getLineCapAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineColor ()Ljava/lang/String;\n\tpublic final fun getLineColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getLineColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineCrossSlope ()Ljava/lang/Double;\n\tpublic final fun getLineCrossSlopeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineCutoutFadeWidth ()Ljava/lang/Double;\n\tpublic final fun getLineCutoutFadeWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineCutoutFadeWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineCutoutOpacity ()Ljava/lang/Double;\n\tpublic final fun getLineCutoutOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineCutoutOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineDasharray ()Ljava/util/List;\n\tpublic final fun getLineDasharrayAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineDepthOcclusionFactor ()Ljava/lang/Double;\n\tpublic final fun getLineDepthOcclusionFactorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineDepthOcclusionFactorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineElevationGroundScale ()Ljava/lang/Double;\n\tpublic final fun getLineElevationGroundScaleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineElevationGroundScaleTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n\tpublic final fun getLineElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getLineEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineGapWidth ()Ljava/lang/Double;\n\tpublic final fun getLineGapWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineGapWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineGradient ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineGradientUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineGradientUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineJoin ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic final fun getLineJoinAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineMiterLimit ()Ljava/lang/Double;\n\tpublic final fun getLineMiterLimitAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getLineOcclusionOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineOcclusionOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineOffset ()Ljava/lang/Double;\n\tpublic final fun getLineOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineOffsetTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineOpacity ()Ljava/lang/Double;\n\tpublic final fun getLineOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLinePattern ()Ljava/lang/String;\n\tpublic final fun getLinePatternAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLinePatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getLinePatternCrossFadeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineRoundLimit ()Ljava/lang/Double;\n\tpublic final fun getLineRoundLimitAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineSortKey ()Ljava/lang/Double;\n\tpublic final fun getLineSortKeyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineTranslate ()Ljava/util/List;\n\tpublic final fun getLineTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;\n\tpublic final fun getLineTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineTrimColor ()Ljava/lang/String;\n\tpublic final fun getLineTrimColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getLineTrimColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineTrimColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineTrimColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineTrimColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineTrimFadeRange ()Ljava/util/List;\n\tpublic final fun getLineTrimFadeRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineTrimOffset ()Ljava/util/List;\n\tpublic final fun getLineTrimOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineWidth ()Ljava/lang/Double;\n\tpublic final fun getLineWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLineWidthUnit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;\n\tpublic final fun getLineWidthUnitAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineZOffset ()Ljava/lang/Double;\n\tpublic final fun getLineZOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun lineBlur (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBlur (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBlurTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBlurTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineBorderWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCap (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCap (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCrossSlope (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCrossSlope (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCutoutFadeWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCutoutFadeWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCutoutFadeWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCutoutFadeWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCutoutOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCutoutOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCutoutOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineCutoutOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineDasharray (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineDasharray (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineDepthOcclusionFactor (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineDepthOcclusionFactor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineDepthOcclusionFactorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineDepthOcclusionFactorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineElevationGroundScale (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineElevationGroundScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineElevationGroundScaleTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineElevationGroundScaleTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineGapWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineGapWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineGapWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineGapWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineGradient (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineGradientUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineGradientUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineJoin (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineJoin (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineMiterLimit (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineMiterLimit (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOcclusionOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOcclusionOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOcclusionOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOcclusionOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOffsetTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOffsetTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun linePattern (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun linePattern (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun linePatternCrossFade (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun linePatternCrossFade (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineRoundLimit (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineRoundLimit (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineSortKey (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineSortKey (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimFadeRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimFadeRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineTrimOffset (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineWidthUnit (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineWidthUnit (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineZOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun lineZOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/LineLayer$Companion {\n\tpublic final fun getDefaultLineBlur ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineBlurAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineBlurTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineBorderColor ()Ljava/lang/String;\n\tpublic final fun getDefaultLineBorderColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultLineBorderColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineBorderColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineBorderColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultLineBorderColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineBorderWidth ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineBorderWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineBorderWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineCap ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;\n\tpublic final fun getDefaultLineCapAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineColor ()Ljava/lang/String;\n\tpublic final fun getDefaultLineColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultLineColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultLineColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineCrossSlope ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineCrossSlopeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineCutoutFadeWidth ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineCutoutFadeWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineCutoutFadeWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineCutoutOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineCutoutOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineCutoutOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineDasharray ()Ljava/util/List;\n\tpublic final fun getDefaultLineDasharrayAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineDepthOcclusionFactor ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineDepthOcclusionFactorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineDepthOcclusionFactorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineElevationGroundScale ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineElevationGroundScaleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineElevationGroundScaleTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n\tpublic final fun getDefaultLineElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineGapWidth ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineGapWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineGapWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineGradientUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultLineGradientUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineJoin ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic final fun getDefaultLineJoinAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineMiterLimit ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineMiterLimitAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineOcclusionOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineOcclusionOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineOffset ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineOffsetTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLinePattern ()Ljava/lang/String;\n\tpublic final fun getDefaultLinePatternAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLinePatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getDefaultLinePatternCrossFadeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineRoundLimit ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineRoundLimitAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineSortKey ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineSortKeyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineTranslate ()Ljava/util/List;\n\tpublic final fun getDefaultLineTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;\n\tpublic final fun getDefaultLineTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineTrimColor ()Ljava/lang/String;\n\tpublic final fun getDefaultLineTrimColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultLineTrimColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineTrimColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineTrimColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultLineTrimColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineTrimFadeRange ()Ljava/util/List;\n\tpublic final fun getDefaultLineTrimFadeRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineTrimOffset ()Ljava/util/List;\n\tpublic final fun getDefaultLineTrimOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineWidth ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLineWidthUnit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;\n\tpublic final fun getDefaultLineWidthUnitAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLineZOffset ()Ljava/lang/Double;\n\tpublic final fun getDefaultLineZOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/LineLayerDsl {\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBlur (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBlur (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBlurTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBlurTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineBorderWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCap (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCap (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCrossSlope (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCrossSlope (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCutoutFadeWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCutoutFadeWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCutoutFadeWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCutoutFadeWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCutoutOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCutoutOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCutoutOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineCutoutOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineDasharray (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineDasharray (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineDepthOcclusionFactor (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineDepthOcclusionFactor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineDepthOcclusionFactorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineDepthOcclusionFactorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineElevationGroundScale (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineElevationGroundScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineElevationGroundScaleTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineElevationGroundScaleTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineGapWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineGapWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineGapWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineGapWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineGradient (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineGradientUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineGradientUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineJoin (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineJoin (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineMiterLimit (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineMiterLimit (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOcclusionOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOcclusionOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOcclusionOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOcclusionOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOffsetTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOffsetTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun linePattern (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun linePattern (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun linePatternCrossFade (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun linePatternCrossFade (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineRoundLimit (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineRoundLimit (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineSortKey (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineSortKey (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimFadeRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimFadeRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineTrimOffset (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineWidthUnit (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineWidthUnit (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineZOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun lineZOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/LineLayerDsl$DefaultImpls {\n\tpublic static synthetic fun lineBlur$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineBorderColor$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineBorderWidth$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineCap$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineColor$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineCutoutFadeWidth$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineCutoutOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineDepthOcclusionFactor$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineElevationGroundScale$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineElevationReference$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineGapWidth$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineJoin$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineMiterLimit$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineOcclusionOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineOffset$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun linePatternCrossFade$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineRoundLimit$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineTranslate$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineTranslateAnchor$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineTrimColor$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineTrimFadeRange$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineTrimOffset$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineWidth$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineWidthUnit$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n\tpublic static synthetic fun lineZOffset$default (Lcom/mapbox/maps/extension/style/layers/generated/LineLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/LineLayerKt {\n\tpublic static final fun lineLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LineLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun accuracyRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusBorderColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusBorderColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusBorderColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusBorderColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusBorderColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusBorderColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusBorderColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun accuracyRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearing (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearing (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearingImage (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearingImage (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearingImageSize (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearingImageSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearingImageSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearingImageSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearingTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun bearingTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleGlowRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleGlowRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleGlowRangeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleGlowRangeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun emphasisCircleRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic final fun getAccuracyRadius ()Ljava/lang/Double;\n\tpublic final fun getAccuracyRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getAccuracyRadiusBorderColor ()Ljava/lang/String;\n\tpublic final fun getAccuracyRadiusBorderColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getAccuracyRadiusBorderColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getAccuracyRadiusBorderColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getAccuracyRadiusBorderColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getAccuracyRadiusBorderColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getAccuracyRadiusColor ()Ljava/lang/String;\n\tpublic final fun getAccuracyRadiusColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getAccuracyRadiusColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getAccuracyRadiusColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getAccuracyRadiusColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getAccuracyRadiusColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getAccuracyRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getBearing ()Ljava/lang/Double;\n\tpublic final fun getBearingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getBearingImage ()Ljava/lang/String;\n\tpublic final fun getBearingImageAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getBearingImageSize ()Ljava/lang/Double;\n\tpublic final fun getBearingImageSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getBearingImageSizeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getBearingTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getEmphasisCircleColor ()Ljava/lang/String;\n\tpublic final fun getEmphasisCircleColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getEmphasisCircleColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getEmphasisCircleColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getEmphasisCircleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getEmphasisCircleColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getEmphasisCircleGlowRange ()Ljava/util/List;\n\tpublic final fun getEmphasisCircleGlowRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getEmphasisCircleGlowRangeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getEmphasisCircleRadius ()Ljava/lang/Double;\n\tpublic final fun getEmphasisCircleRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getEmphasisCircleRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getImagePitchDisplacement ()Ljava/lang/Double;\n\tpublic final fun getImagePitchDisplacementAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic final fun getLocation ()Ljava/util/List;\n\tpublic final fun getLocationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLocationIndicatorOpacity ()Ljava/lang/Double;\n\tpublic final fun getLocationIndicatorOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLocationIndicatorOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getLocationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getPerspectiveCompensation ()Ljava/lang/Double;\n\tpublic final fun getPerspectiveCompensationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getShadowImage ()Ljava/lang/String;\n\tpublic final fun getShadowImageAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getShadowImageSize ()Ljava/lang/Double;\n\tpublic final fun getShadowImageSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getShadowImageSizeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getTopImage ()Ljava/lang/String;\n\tpublic final fun getTopImageAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTopImageSize ()Ljava/lang/Double;\n\tpublic final fun getTopImageSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTopImageSizeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun imagePitchDisplacement (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun imagePitchDisplacement (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun location (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun location (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun locationIndicatorOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun locationIndicatorOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun locationIndicatorOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun locationIndicatorOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun locationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun locationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun perspectiveCompensation (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun perspectiveCompensation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun shadowImage (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun shadowImage (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun shadowImageSize (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun shadowImageSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun shadowImageSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun shadowImageSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun topImage (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun topImage (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun topImageSize (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun topImageSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun topImageSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic fun topImageSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer$Companion {\n\tpublic final fun getDefaultAccuracyRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultAccuracyRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultAccuracyRadiusBorderColor ()Ljava/lang/String;\n\tpublic final fun getDefaultAccuracyRadiusBorderColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultAccuracyRadiusBorderColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultAccuracyRadiusBorderColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultAccuracyRadiusBorderColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultAccuracyRadiusBorderColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultAccuracyRadiusColor ()Ljava/lang/String;\n\tpublic final fun getDefaultAccuracyRadiusColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultAccuracyRadiusColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultAccuracyRadiusColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultAccuracyRadiusColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultAccuracyRadiusColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultAccuracyRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultBearing ()Ljava/lang/Double;\n\tpublic final fun getDefaultBearingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultBearingImage ()Ljava/lang/String;\n\tpublic final fun getDefaultBearingImageAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultBearingImageSize ()Ljava/lang/Double;\n\tpublic final fun getDefaultBearingImageSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultBearingImageSizeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultBearingTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultEmphasisCircleColor ()Ljava/lang/String;\n\tpublic final fun getDefaultEmphasisCircleColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultEmphasisCircleColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultEmphasisCircleColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultEmphasisCircleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultEmphasisCircleColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultEmphasisCircleGlowRange ()Ljava/util/List;\n\tpublic final fun getDefaultEmphasisCircleGlowRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultEmphasisCircleGlowRangeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultEmphasisCircleRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultEmphasisCircleRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultEmphasisCircleRadiusTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultImagePitchDisplacement ()Ljava/lang/Double;\n\tpublic final fun getDefaultImagePitchDisplacementAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLocation ()Ljava/util/List;\n\tpublic final fun getDefaultLocationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLocationIndicatorOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultLocationIndicatorOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultLocationIndicatorOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultLocationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultPerspectiveCompensation ()Ljava/lang/Double;\n\tpublic final fun getDefaultPerspectiveCompensationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultShadowImage ()Ljava/lang/String;\n\tpublic final fun getDefaultShadowImageAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultShadowImageSize ()Ljava/lang/Double;\n\tpublic final fun getDefaultShadowImageSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultShadowImageSizeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultTopImage ()Ljava/lang/String;\n\tpublic final fun getDefaultTopImageAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTopImageSize ()Ljava/lang/Double;\n\tpublic final fun getDefaultTopImageSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTopImageSizeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl {\n\tpublic abstract fun accuracyRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusBorderColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusBorderColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusBorderColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusBorderColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusBorderColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusBorderColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusBorderColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun accuracyRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearing (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearing (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearingImage (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearingImage (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearingImageSize (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearingImageSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearingImageSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearingImageSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearingTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun bearingTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleColor (I)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleGlowRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleGlowRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleGlowRangeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleGlowRangeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleRadiusTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun emphasisCircleRadiusTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun imagePitchDisplacement (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun imagePitchDisplacement (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun location (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun location (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun locationIndicatorOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun locationIndicatorOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun locationIndicatorOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun locationIndicatorOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun locationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun locationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun perspectiveCompensation (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun perspectiveCompensation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun shadowImage (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun shadowImage (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun shadowImageSize (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun shadowImageSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun shadowImageSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun shadowImageSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun topImage (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun topImage (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun topImageSize (D)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun topImageSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun topImageSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun topImageSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl$DefaultImpls {\n\tpublic static synthetic fun accuracyRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun accuracyRadiusBorderColor$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun accuracyRadiusColor$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun bearing$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun bearingImageSize$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun emphasisCircleColor$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun emphasisCircleGlowRange$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun emphasisCircleRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun imagePitchDisplacement$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun location$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun locationIndicatorOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun perspectiveCompensation$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun shadowImageSize$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n\tpublic static synthetic fun topImageSize$default (Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerKt {\n\tpublic static final fun locationIndicatorLayer (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/ModelLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/ModelLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getModelAllowDensityReduction ()Ljava/lang/Boolean;\n\tpublic final fun getModelAllowDensityReductionAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelAmbientOcclusionIntensity ()Ljava/lang/Double;\n\tpublic final fun getModelAmbientOcclusionIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelAmbientOcclusionIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelCastShadows ()Ljava/lang/Boolean;\n\tpublic final fun getModelCastShadowsAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelColor ()Ljava/lang/String;\n\tpublic final fun getModelColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getModelColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelColorMixIntensity ()Ljava/lang/Double;\n\tpublic final fun getModelColorMixIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelColorMixIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getModelColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelCutoffFadeRange ()Ljava/lang/Double;\n\tpublic final fun getModelCutoffFadeRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;\n\tpublic final fun getModelElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getModelEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelHeightBasedEmissiveStrengthMultiplier ()Ljava/util/List;\n\tpublic final fun getModelHeightBasedEmissiveStrengthMultiplierAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelHeightBasedEmissiveStrengthMultiplierTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelId ()Ljava/lang/String;\n\tpublic final fun getModelIdAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelOpacity ()Ljava/lang/Double;\n\tpublic final fun getModelOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelReceiveShadows ()Ljava/lang/Boolean;\n\tpublic final fun getModelReceiveShadowsAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelRotation ()Ljava/util/List;\n\tpublic final fun getModelRotationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelRotationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelRoughness ()Ljava/lang/Double;\n\tpublic final fun getModelRoughnessAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelRoughnessTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelScale ()Ljava/util/List;\n\tpublic final fun getModelScaleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelScaleMode ()Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode;\n\tpublic final fun getModelScaleModeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelScaleTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelTranslation ()Ljava/util/List;\n\tpublic final fun getModelTranslationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getModelTranslationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getModelType ()Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType;\n\tpublic final fun getModelTypeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelAllowDensityReduction (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelAllowDensityReduction (Z)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelAmbientOcclusionIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelAmbientOcclusionIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelAmbientOcclusionIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelAmbientOcclusionIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelCastShadows (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelCastShadows (Z)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColor (I)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColorMixIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColorMixIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColorMixIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColorMixIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelCutoffFadeRange (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelCutoffFadeRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelHeightBasedEmissiveStrengthMultiplier (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelHeightBasedEmissiveStrengthMultiplier (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelHeightBasedEmissiveStrengthMultiplierTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelHeightBasedEmissiveStrengthMultiplierTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelId (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelId (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelReceiveShadows (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelReceiveShadows (Z)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelRotation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelRotation (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelRotationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelRotationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelRoughness (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelRoughness (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelRoughnessTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelRoughnessTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelScale (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelScaleMode (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelScaleMode (Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelScaleTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelScaleTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelTranslation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelTranslation (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelTranslationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelTranslationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelType (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun modelType (Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/ModelLayer$Companion {\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultModelAllowDensityReduction ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultModelAllowDensityReductionAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelAmbientOcclusionIntensity ()Ljava/lang/Double;\n\tpublic final fun getDefaultModelAmbientOcclusionIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelAmbientOcclusionIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelCastShadows ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultModelCastShadowsAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelColor ()Ljava/lang/String;\n\tpublic final fun getDefaultModelColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultModelColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelColorMixIntensity ()Ljava/lang/Double;\n\tpublic final fun getDefaultModelColorMixIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelColorMixIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultModelColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelCutoffFadeRange ()Ljava/lang/Double;\n\tpublic final fun getDefaultModelCutoffFadeRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;\n\tpublic final fun getDefaultModelElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultModelEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelHeightBasedEmissiveStrengthMultiplier ()Ljava/util/List;\n\tpublic final fun getDefaultModelHeightBasedEmissiveStrengthMultiplierAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelHeightBasedEmissiveStrengthMultiplierTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelId ()Ljava/lang/String;\n\tpublic final fun getDefaultModelIdAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultModelOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelReceiveShadows ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultModelReceiveShadowsAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelRotation ()Ljava/util/List;\n\tpublic final fun getDefaultModelRotationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelRotationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelRoughness ()Ljava/lang/Double;\n\tpublic final fun getDefaultModelRoughnessAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelRoughnessTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelScale ()Ljava/util/List;\n\tpublic final fun getDefaultModelScaleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelScaleMode ()Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode;\n\tpublic final fun getDefaultModelScaleModeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelScaleTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelTranslation ()Ljava/util/List;\n\tpublic final fun getDefaultModelTranslationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultModelTranslationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultModelType ()Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType;\n\tpublic final fun getDefaultModelTypeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/ModelLayerDsl {\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelAllowDensityReduction (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelAllowDensityReduction (Z)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelAmbientOcclusionIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelAmbientOcclusionIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelAmbientOcclusionIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelAmbientOcclusionIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelCastShadows (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelCastShadows (Z)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColor (I)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColorMixIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColorMixIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColorMixIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColorMixIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelCutoffFadeRange (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelCutoffFadeRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelHeightBasedEmissiveStrengthMultiplier (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelHeightBasedEmissiveStrengthMultiplier (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelHeightBasedEmissiveStrengthMultiplierTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelHeightBasedEmissiveStrengthMultiplierTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelId (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelId (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelReceiveShadows (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelReceiveShadows (Z)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelRotation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelRotation (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelRotationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelRotationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelRoughness (D)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelRoughness (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelRoughnessTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelRoughnessTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelScale (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelScale (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelScaleMode (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelScaleMode (Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelScaleTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelScaleTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelTranslation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelTranslation (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelTranslationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelTranslationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelType (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun modelType (Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/ModelLayerDsl$DefaultImpls {\n\tpublic static synthetic fun modelAllowDensityReduction$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelAmbientOcclusionIntensity$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelCastShadows$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelColor$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelColorMixIntensity$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelCutoffFadeRange$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelElevationReference$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelHeightBasedEmissiveStrengthMultiplier$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelId$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelReceiveShadows$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelRotation$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelRoughness$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelScale$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelScaleMode$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelTranslation$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n\tpublic static synthetic fun modelType$default (Lcom/mapbox/maps/extension/style/layers/generated/ModelLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/ModelLayerKt {\n\tpublic static final fun modelLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/ModelLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/RasterLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/RasterLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getRasterArrayBand ()Ljava/lang/String;\n\tpublic final fun getRasterArrayBandAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterBrightnessMax ()Ljava/lang/Double;\n\tpublic final fun getRasterBrightnessMaxAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterBrightnessMaxTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterBrightnessMin ()Ljava/lang/Double;\n\tpublic final fun getRasterBrightnessMinAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterBrightnessMinTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterColor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterColorMix ()Ljava/util/List;\n\tpublic final fun getRasterColorMixAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterColorMixTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterColorRange ()Ljava/util/List;\n\tpublic final fun getRasterColorRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterColorRangeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getRasterColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterContrast ()Ljava/lang/Double;\n\tpublic final fun getRasterContrastAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterContrastTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterElevation ()Ljava/lang/Double;\n\tpublic final fun getRasterElevationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterElevationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getRasterEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterFadeDuration ()Ljava/lang/Double;\n\tpublic final fun getRasterFadeDurationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterHueRotate ()Ljava/lang/Double;\n\tpublic final fun getRasterHueRotateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterHueRotateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterOpacity ()Ljava/lang/Double;\n\tpublic final fun getRasterOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterResampling ()Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling;\n\tpublic final fun getRasterResamplingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterSaturation ()Ljava/lang/Double;\n\tpublic final fun getRasterSaturationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterSaturationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterArrayBand (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterArrayBand (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterBrightnessMax (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterBrightnessMax (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterBrightnessMaxTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterBrightnessMaxTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterBrightnessMin (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterBrightnessMin (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterBrightnessMinTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterBrightnessMinTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorMix (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorMix (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorMixTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorMixTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorRangeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorRangeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterContrast (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterContrast (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterContrastTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterContrastTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterElevation (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterElevation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterElevationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterElevationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterFadeDuration (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterFadeDuration (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterHueRotate (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterHueRotate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterHueRotateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterHueRotateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterResampling (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterResampling (Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterSaturation (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterSaturation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterSaturationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun rasterSaturationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/RasterLayer$Companion {\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterArrayBand ()Ljava/lang/String;\n\tpublic final fun getDefaultRasterArrayBandAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterBrightnessMax ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterBrightnessMaxAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterBrightnessMaxTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterBrightnessMin ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterBrightnessMinAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterBrightnessMinTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterColorMix ()Ljava/util/List;\n\tpublic final fun getDefaultRasterColorMixAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterColorMixTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterColorRange ()Ljava/util/List;\n\tpublic final fun getDefaultRasterColorRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterColorRangeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultRasterColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterContrast ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterContrastAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterContrastTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterElevation ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterElevationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterElevationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterFadeDuration ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterFadeDurationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterHueRotate ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterHueRotateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterHueRotateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterResampling ()Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling;\n\tpublic final fun getDefaultRasterResamplingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterSaturation ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterSaturationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterSaturationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/RasterLayerDsl {\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterArrayBand (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterArrayBand (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterBrightnessMax (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterBrightnessMax (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterBrightnessMaxTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterBrightnessMaxTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterBrightnessMin (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterBrightnessMin (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterBrightnessMinTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterBrightnessMinTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorMix (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorMix (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorMixTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorMixTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorRangeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorRangeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterContrast (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterContrast (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterContrastTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterContrastTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterElevation (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterElevation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterElevationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterElevationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterFadeDuration (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterFadeDuration (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterHueRotate (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterHueRotate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterHueRotateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterHueRotateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterResampling (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterResampling (Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterSaturation (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterSaturation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterSaturationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun rasterSaturationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/RasterLayerDsl$DefaultImpls {\n\tpublic static synthetic fun rasterBrightnessMax$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterBrightnessMin$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterColorMix$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterContrast$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterElevation$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterFadeDuration$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterHueRotate$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterResampling$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n\tpublic static synthetic fun rasterSaturation$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/RasterLayerKt {\n\tpublic static final fun rasterLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/RasterParticleLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/RasterParticleLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getRasterParticleArrayBand ()Ljava/lang/String;\n\tpublic final fun getRasterParticleArrayBandAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterParticleColor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterParticleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getRasterParticleColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterParticleCount ()Ljava/lang/Long;\n\tpublic final fun getRasterParticleCountAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterParticleFadeOpacityFactor ()Ljava/lang/Double;\n\tpublic final fun getRasterParticleFadeOpacityFactorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterParticleFadeOpacityFactorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getRasterParticleMaxSpeed ()Ljava/lang/Double;\n\tpublic final fun getRasterParticleMaxSpeedAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterParticleResetRateFactor ()Ljava/lang/Double;\n\tpublic final fun getRasterParticleResetRateFactorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterParticleSpeedFactor ()Ljava/lang/Double;\n\tpublic final fun getRasterParticleSpeedFactorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getRasterParticleSpeedFactorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleArrayBand (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleArrayBand (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleCount (J)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleCount (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleFadeOpacityFactor (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleFadeOpacityFactor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleFadeOpacityFactorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleFadeOpacityFactorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleMaxSpeed (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleMaxSpeed (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleResetRateFactor (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleResetRateFactor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleSpeedFactor (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleSpeedFactor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleSpeedFactorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun rasterParticleSpeedFactorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/RasterParticleLayer$Companion {\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterParticleArrayBand ()Ljava/lang/String;\n\tpublic final fun getDefaultRasterParticleArrayBandAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterParticleColor ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterParticleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultRasterParticleColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterParticleCount ()Ljava/lang/Long;\n\tpublic final fun getDefaultRasterParticleCountAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterParticleFadeOpacityFactor ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterParticleFadeOpacityFactorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterParticleFadeOpacityFactorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultRasterParticleMaxSpeed ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterParticleMaxSpeedAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterParticleResetRateFactor ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterParticleResetRateFactorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterParticleSpeedFactor ()Ljava/lang/Double;\n\tpublic final fun getDefaultRasterParticleSpeedFactorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultRasterParticleSpeedFactorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/RasterParticleLayerDsl {\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleArrayBand (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleArrayBand (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleCount (J)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleCount (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleFadeOpacityFactor (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleFadeOpacityFactor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleFadeOpacityFactorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleFadeOpacityFactorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleMaxSpeed (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleMaxSpeed (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleResetRateFactor (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleResetRateFactor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleSpeedFactor (D)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleSpeedFactor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleSpeedFactorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun rasterParticleSpeedFactorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/RasterParticleLayerDsl$DefaultImpls {\n\tpublic static synthetic fun rasterParticleCount$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayerDsl;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic static synthetic fun rasterParticleFadeOpacityFactor$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic static synthetic fun rasterParticleMaxSpeed$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic static synthetic fun rasterParticleResetRateFactor$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n\tpublic static synthetic fun rasterParticleSpeedFactor$default (Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/RasterParticleLayerKt {\n\tpublic static final fun rasterParticleLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/RasterParticleLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SkyLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/SkyLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getSkyAtmosphereColor ()Ljava/lang/String;\n\tpublic final fun getSkyAtmosphereColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getSkyAtmosphereColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyAtmosphereColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getSkyAtmosphereColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyAtmosphereHaloColor ()Ljava/lang/String;\n\tpublic final fun getSkyAtmosphereHaloColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getSkyAtmosphereHaloColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyAtmosphereHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getSkyAtmosphereHaloColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyAtmosphereSun ()Ljava/util/List;\n\tpublic final fun getSkyAtmosphereSunAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyAtmosphereSunIntensity ()Ljava/lang/Double;\n\tpublic final fun getSkyAtmosphereSunIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyGradient ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyGradientCenter ()Ljava/util/List;\n\tpublic final fun getSkyGradientCenterAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyGradientRadius ()Ljava/lang/Double;\n\tpublic final fun getSkyGradientRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyGradientUseTheme ()Ljava/lang/String;\n\tpublic final fun getSkyGradientUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyOpacity ()Ljava/lang/Double;\n\tpublic final fun getSkyOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSkyOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getSkyType ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType;\n\tpublic final fun getSkyTypeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereHaloColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereHaloColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereHaloColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereHaloColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereHaloColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereSun (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereSun (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereSunIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyAtmosphereSunIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyGradient (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyGradientCenter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyGradientCenter (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyGradientRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyGradientRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyGradientUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyGradientUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyType (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic fun skyType (Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SkyLayer$Companion {\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultSkyAtmosphereColor ()Ljava/lang/String;\n\tpublic final fun getDefaultSkyAtmosphereColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultSkyAtmosphereColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyAtmosphereColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultSkyAtmosphereColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyAtmosphereHaloColor ()Ljava/lang/String;\n\tpublic final fun getDefaultSkyAtmosphereHaloColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultSkyAtmosphereHaloColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyAtmosphereHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultSkyAtmosphereHaloColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyAtmosphereSun ()Ljava/util/List;\n\tpublic final fun getDefaultSkyAtmosphereSunAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyAtmosphereSunIntensity ()Ljava/lang/Double;\n\tpublic final fun getDefaultSkyAtmosphereSunIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyGradient ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyGradientCenter ()Ljava/util/List;\n\tpublic final fun getDefaultSkyGradientCenterAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyGradientRadius ()Ljava/lang/Double;\n\tpublic final fun getDefaultSkyGradientRadiusAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyGradientUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultSkyGradientUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultSkyOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSkyOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultSkyType ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType;\n\tpublic final fun getDefaultSkyTypeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/SkyLayerDsl {\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereHaloColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereHaloColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereHaloColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereHaloColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereHaloColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereSun (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereSun (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereSunIntensity (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyAtmosphereSunIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyGradient (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyGradientCenter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyGradientCenter (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyGradientRadius (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyGradientRadius (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyGradientUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyGradientUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyType (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun skyType (Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SkyLayerDsl$DefaultImpls {\n\tpublic static synthetic fun skyAtmosphereColor$default (Lcom/mapbox/maps/extension/style/layers/generated/SkyLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic static synthetic fun skyAtmosphereHaloColor$default (Lcom/mapbox/maps/extension/style/layers/generated/SkyLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic static synthetic fun skyAtmosphereSunIntensity$default (Lcom/mapbox/maps/extension/style/layers/generated/SkyLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic static synthetic fun skyGradientCenter$default (Lcom/mapbox/maps/extension/style/layers/generated/SkyLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic static synthetic fun skyGradientRadius$default (Lcom/mapbox/maps/extension/style/layers/generated/SkyLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic static synthetic fun skyOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/SkyLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n\tpublic static synthetic fun skyType$default (Lcom/mapbox/maps/extension/style/layers/generated/SkyLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SkyLayerKt {\n\tpublic static final fun skyLayer (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SkyLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SlotLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/SlotLayerDsl {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SlotLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SlotLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SlotLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SlotLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/SlotLayer;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/SlotLayerDsl {\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SlotLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SlotLayerKt {\n\tpublic static final fun slotLayer (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SlotLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SymbolLayer : com/mapbox/maps/extension/style/layers/Layer, com/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic final fun getFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconAllowOverlap ()Ljava/lang/Boolean;\n\tpublic final fun getIconAllowOverlapAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic final fun getIconAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconColor ()Ljava/lang/String;\n\tpublic final fun getIconColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getIconColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconColorBrightnessMax ()Ljava/lang/Double;\n\tpublic final fun getIconColorBrightnessMaxAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconColorBrightnessMin ()Ljava/lang/Double;\n\tpublic final fun getIconColorBrightnessMinAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconColorContrast ()Ljava/lang/Double;\n\tpublic final fun getIconColorContrastAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconColorSaturation ()Ljava/lang/Double;\n\tpublic final fun getIconColorSaturationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconColorSaturationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIconColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIconColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getIconEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIconHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getIconHaloBlurAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconHaloBlurTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIconHaloColor ()Ljava/lang/String;\n\tpublic final fun getIconHaloColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getIconHaloColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconHaloColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIconHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconHaloColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getIconHaloWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconHaloWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIconIgnorePlacement ()Ljava/lang/Boolean;\n\tpublic final fun getIconIgnorePlacementAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconImage ()Ljava/lang/String;\n\tpublic final fun getIconImageAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconImageCrossFade ()Ljava/lang/Double;\n\tpublic final fun getIconImageCrossFadeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconImageCrossFadeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIconKeepUpright ()Ljava/lang/Boolean;\n\tpublic final fun getIconKeepUprightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconOcclusionOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconOcclusionOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIconOffset ()Ljava/util/List;\n\tpublic final fun getIconOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIconOptional ()Ljava/lang/Boolean;\n\tpublic final fun getIconOptionalAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconPadding ()Ljava/lang/Double;\n\tpublic final fun getIconPaddingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;\n\tpublic final fun getIconPitchAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconRotate ()Ljava/lang/Double;\n\tpublic final fun getIconRotateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconRotationAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;\n\tpublic final fun getIconRotationAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconSize ()Ljava/lang/Double;\n\tpublic final fun getIconSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconSizeScaleRange ()Ljava/util/List;\n\tpublic final fun getIconSizeScaleRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconTextFit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic final fun getIconTextFitAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconTextFitPadding ()Ljava/util/List;\n\tpublic final fun getIconTextFitPaddingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconTranslate ()Ljava/util/List;\n\tpublic final fun getIconTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;\n\tpublic final fun getIconTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIconTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun getLayerId ()Ljava/lang/String;\n\tpublic fun getMaxZoom ()Ljava/lang/Double;\n\tpublic fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getOcclusionOpacityMode ()Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;\n\tpublic final fun getOcclusionOpacityModeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getSourceLayer ()Ljava/lang/String;\n\tpublic final fun getSymbolAvoidEdges ()Ljava/lang/Boolean;\n\tpublic final fun getSymbolAvoidEdgesAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSymbolElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;\n\tpublic final fun getSymbolElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSymbolPlacement ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;\n\tpublic final fun getSymbolPlacementAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSymbolSortKey ()Ljava/lang/Double;\n\tpublic final fun getSymbolSortKeyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSymbolSpacing ()Ljava/lang/Double;\n\tpublic final fun getSymbolSpacingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSymbolZElevate ()Ljava/lang/Boolean;\n\tpublic final fun getSymbolZElevateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSymbolZOffset ()Ljava/lang/Double;\n\tpublic final fun getSymbolZOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getSymbolZOffsetTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getSymbolZOrder ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;\n\tpublic final fun getSymbolZOrderAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextAllowOverlap ()Ljava/lang/Boolean;\n\tpublic final fun getTextAllowOverlapAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic final fun getTextAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextColor ()Ljava/lang/String;\n\tpublic final fun getTextColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getTextColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getTextColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getTextEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getTextField ()Lcom/mapbox/maps/extension/style/types/Formatted;\n\tpublic final fun getTextFieldAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextFieldAsString ()Ljava/lang/String;\n\tpublic final fun getTextFont ()Ljava/util/List;\n\tpublic final fun getTextFontAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getTextHaloBlurAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextHaloBlurTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getTextHaloColor ()Ljava/lang/String;\n\tpublic final fun getTextHaloColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getTextHaloColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextHaloColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getTextHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextHaloColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getTextHaloWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextHaloWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getTextIgnorePlacement ()Ljava/lang/Boolean;\n\tpublic final fun getTextIgnorePlacementAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextJustify ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic final fun getTextJustifyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextKeepUpright ()Ljava/lang/Boolean;\n\tpublic final fun getTextKeepUprightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextLetterSpacing ()Ljava/lang/Double;\n\tpublic final fun getTextLetterSpacingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextLineHeight ()Ljava/lang/Double;\n\tpublic final fun getTextLineHeightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextMaxAngle ()Ljava/lang/Double;\n\tpublic final fun getTextMaxAngleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextMaxWidth ()Ljava/lang/Double;\n\tpublic final fun getTextMaxWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextOcclusionOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextOcclusionOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getTextOffset ()Ljava/util/List;\n\tpublic final fun getTextOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getTextOptional ()Ljava/lang/Boolean;\n\tpublic final fun getTextOptionalAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextPadding ()Ljava/lang/Double;\n\tpublic final fun getTextPaddingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;\n\tpublic final fun getTextPitchAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextRadialOffset ()Ljava/lang/Double;\n\tpublic final fun getTextRadialOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextRotate ()Ljava/lang/Double;\n\tpublic final fun getTextRotateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextRotationAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;\n\tpublic final fun getTextRotationAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextSize ()Ljava/lang/Double;\n\tpublic final fun getTextSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextSizeScaleRange ()Ljava/util/List;\n\tpublic final fun getTextSizeScaleRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextTransform ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic final fun getTextTransformAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextTranslate ()Ljava/util/List;\n\tpublic final fun getTextTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;\n\tpublic final fun getTextTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getTextVariableAnchor ()Ljava/util/List;\n\tpublic final fun getTextVariableAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getTextWritingMode ()Ljava/util/List;\n\tpublic final fun getTextWritingModeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun getVisibilityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun iconAllowOverlap (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconAllowOverlap (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorBrightnessMax (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorBrightnessMax (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorBrightnessMin (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorBrightnessMin (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorContrast (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorContrast (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorSaturation (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorSaturation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorSaturationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorSaturationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloBlur (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloBlur (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloBlurTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloBlurTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconHaloWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconIgnorePlacement (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconIgnorePlacement (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconImage (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconImage (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconImageCrossFade (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconImageCrossFade (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconImageCrossFadeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconImageCrossFadeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconKeepUpright (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconKeepUpright (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOcclusionOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOcclusionOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOcclusionOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOcclusionOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOffset (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOptional (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconOptional (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconPadding (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconPadding (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconPitchAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconRotate (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconRotate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconRotationAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconRotationAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconSize (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconSizeScaleRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconSizeScaleRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTextFit (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTextFit (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTextFitPadding (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTextFitPadding (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun iconTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic synthetic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic synthetic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun occlusionOpacityMode (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun occlusionOpacityMode (Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic synthetic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolAvoidEdges (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolAvoidEdges (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolPlacement (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolPlacement (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolSortKey (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolSortKey (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolSpacing (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolSpacing (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolZElevate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolZElevate (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolZOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolZOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolZOffsetTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolZOffsetTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolZOrder (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun symbolZOrder (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textAllowOverlap (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textAllowOverlap (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textField (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textField (Lcom/mapbox/maps/extension/style/types/Formatted;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textField (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textField (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textFont (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textFont (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloBlur (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloBlur (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloBlurTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloBlurTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textHaloWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textIgnorePlacement (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textIgnorePlacement (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textJustify (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textJustify (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textKeepUpright (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textKeepUpright (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textLetterSpacing (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textLetterSpacing (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textLineHeight (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textLineHeight (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textMaxAngle (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textMaxAngle (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textMaxWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textMaxWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOcclusionOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOcclusionOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOcclusionOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOcclusionOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOffset (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOptional (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textOptional (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textPadding (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textPadding (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textPitchAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textRadialOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textRadialOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textRotate (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textRotate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textRotationAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textRotationAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textSize (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textSizeScaleRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textSizeScaleRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textTransform (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textTransform (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textVariableAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textVariableAnchor (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textWritingMode (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic fun textWritingMode (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic synthetic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/Layer;\n\tpublic fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SymbolLayer$Companion {\n\tpublic final fun getDefaultIconAllowOverlap ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultIconAllowOverlapAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic final fun getDefaultIconAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconColor ()Ljava/lang/String;\n\tpublic final fun getDefaultIconColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultIconColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconColorBrightnessMax ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconColorBrightnessMaxAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconColorBrightnessMin ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconColorBrightnessMinAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconColorContrast ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconColorContrastAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconColorSaturation ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconColorSaturationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconColorSaturationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultIconColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultIconColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultIconColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultIconHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconHaloBlurAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconHaloBlurTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultIconHaloColor ()Ljava/lang/String;\n\tpublic final fun getDefaultIconHaloColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultIconHaloColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconHaloColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultIconHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultIconHaloColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconHaloWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconHaloWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultIconIgnorePlacement ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultIconIgnorePlacementAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconImage ()Ljava/lang/String;\n\tpublic final fun getDefaultIconImageAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconImageCrossFade ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconImageCrossFadeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconImageCrossFadeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultIconKeepUpright ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultIconKeepUprightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconOcclusionOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconOcclusionOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultIconOffset ()Ljava/util/List;\n\tpublic final fun getDefaultIconOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultIconOptional ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultIconOptionalAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconPadding ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconPaddingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;\n\tpublic final fun getDefaultIconPitchAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconRotate ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconRotateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconRotationAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;\n\tpublic final fun getDefaultIconRotationAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconSize ()Ljava/lang/Double;\n\tpublic final fun getDefaultIconSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconSizeScaleRange ()Ljava/util/List;\n\tpublic final fun getDefaultIconSizeScaleRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconTextFit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic final fun getDefaultIconTextFitAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconTextFitPadding ()Ljava/util/List;\n\tpublic final fun getDefaultIconTextFitPaddingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconTranslate ()Ljava/util/List;\n\tpublic final fun getDefaultIconTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;\n\tpublic final fun getDefaultIconTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultIconTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinZoom ()Ljava/lang/Double;\n\tpublic final fun getDefaultOcclusionOpacityMode ()Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;\n\tpublic final fun getDefaultOcclusionOpacityModeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSymbolAvoidEdges ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultSymbolAvoidEdgesAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSymbolElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;\n\tpublic final fun getDefaultSymbolElevationReferenceAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSymbolPlacement ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;\n\tpublic final fun getDefaultSymbolPlacementAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSymbolSortKey ()Ljava/lang/Double;\n\tpublic final fun getDefaultSymbolSortKeyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSymbolSpacing ()Ljava/lang/Double;\n\tpublic final fun getDefaultSymbolSpacingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSymbolZElevate ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultSymbolZElevateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSymbolZOffset ()Ljava/lang/Double;\n\tpublic final fun getDefaultSymbolZOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultSymbolZOffsetTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultSymbolZOrder ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;\n\tpublic final fun getDefaultSymbolZOrderAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextAllowOverlap ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultTextAllowOverlapAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic final fun getDefaultTextAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextColor ()Ljava/lang/String;\n\tpublic final fun getDefaultTextColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultTextColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultTextColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultTextColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextEmissiveStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextEmissiveStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultTextField ()Lcom/mapbox/maps/extension/style/types/Formatted;\n\tpublic final fun getDefaultTextFieldAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextFieldAsString ()Ljava/lang/String;\n\tpublic final fun getDefaultTextFont ()Ljava/util/List;\n\tpublic final fun getDefaultTextFontAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextHaloBlurAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextHaloBlurTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultTextHaloColor ()Ljava/lang/String;\n\tpublic final fun getDefaultTextHaloColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getDefaultTextHaloColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextHaloColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultTextHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getDefaultTextHaloColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextHaloWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextHaloWidthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultTextIgnorePlacement ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultTextIgnorePlacementAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextJustify ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic final fun getDefaultTextJustifyAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextKeepUpright ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultTextKeepUprightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextLetterSpacing ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextLetterSpacingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextLineHeight ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextLineHeightAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextMaxAngle ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextMaxAngleAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextMaxWidth ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextMaxWidthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextOcclusionOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextOcclusionOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultTextOffset ()Ljava/util/List;\n\tpublic final fun getDefaultTextOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextOpacity ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultTextOptional ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultTextOptionalAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextPadding ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextPaddingAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;\n\tpublic final fun getDefaultTextPitchAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextRadialOffset ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextRadialOffsetAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextRotate ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextRotateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextRotationAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;\n\tpublic final fun getDefaultTextRotationAlignmentAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextSize ()Ljava/lang/Double;\n\tpublic final fun getDefaultTextSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextSizeScaleRange ()Ljava/util/List;\n\tpublic final fun getDefaultTextSizeScaleRangeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextTransform ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic final fun getDefaultTextTransformAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextTranslate ()Ljava/util/List;\n\tpublic final fun getDefaultTextTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;\n\tpublic final fun getDefaultTextTranslateAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextTranslateAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextTranslateTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDefaultTextVariableAnchor ()Ljava/util/List;\n\tpublic final fun getDefaultTextVariableAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultTextWritingMode ()Ljava/util/List;\n\tpublic final fun getDefaultTextWritingModeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDefaultVisibility ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl {\n\tpublic abstract fun filter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconAllowOverlap (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconAllowOverlap (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorBrightnessMax (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorBrightnessMax (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorBrightnessMin (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorBrightnessMin (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorContrast (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorContrast (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorSaturation (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorSaturation (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorSaturationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorSaturationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloBlur (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloBlur (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloBlurTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloBlurTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconHaloWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconIgnorePlacement (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconIgnorePlacement (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconImage (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconImage (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconImageCrossFade (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconImageCrossFade (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconImageCrossFadeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconImageCrossFadeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconKeepUpright (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconKeepUpright (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOcclusionOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOcclusionOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOcclusionOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOcclusionOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOffset (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOptional (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconOptional (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconPadding (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconPadding (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconPitchAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconRotate (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconRotate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconRotationAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconRotationAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconSize (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconSizeScaleRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconSizeScaleRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTextFit (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTextFit (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTextFitPadding (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTextFitPadding (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun iconTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun maxZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun minZoom (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun occlusionOpacityMode (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun occlusionOpacityMode (Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun slot (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun sourceLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolAvoidEdges (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolAvoidEdges (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolElevationReference (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolPlacement (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolPlacement (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolSortKey (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolSortKey (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolSpacing (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolSpacing (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolZElevate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolZElevate (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolZOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolZOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolZOffsetTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolZOffsetTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolZOrder (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun symbolZOrder (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textAllowOverlap (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textAllowOverlap (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textEmissiveStrength (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textEmissiveStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textEmissiveStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textEmissiveStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textField (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textField (Lcom/mapbox/maps/extension/style/types/Formatted;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textField (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textField (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textFont (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textFont (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloBlur (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloBlur (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloBlurTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloBlurTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloColor (I)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloWidthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textHaloWidthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textIgnorePlacement (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textIgnorePlacement (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textJustify (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textJustify (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textKeepUpright (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textKeepUpright (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textLetterSpacing (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textLetterSpacing (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textLineHeight (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textLineHeight (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textMaxAngle (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textMaxAngle (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textMaxWidth (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textMaxWidth (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOcclusionOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOcclusionOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOcclusionOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOcclusionOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOffset (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOpacity (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOpacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOpacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOpacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOptional (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textOptional (Z)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textPadding (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textPadding (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textPitchAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textRadialOffset (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textRadialOffset (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textRotate (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textRotate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textRotationAlignment (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textRotationAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textSize (D)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textSizeScaleRange (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textSizeScaleRange (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textTransform (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textTransform (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textTranslate (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textTranslate (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textTranslateAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textTranslateTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textTranslateTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textVariableAnchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textVariableAnchor (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textWritingMode (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun textWritingMode (Ljava/util/List;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic abstract fun visibility (Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl$DefaultImpls {\n\tpublic static synthetic fun iconAllowOverlap$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconAnchor$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconColor$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconColorBrightnessMax$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconColorBrightnessMin$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconColorContrast$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconColorSaturation$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconHaloBlur$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconHaloColor$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconHaloWidth$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconIgnorePlacement$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconImageCrossFade$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconKeepUpright$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconOcclusionOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconOffset$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconOptional$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconPadding$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconPitchAlignment$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconRotate$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconRotationAlignment$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconSize$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconSizeScaleRange$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconTextFit$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconTextFitPadding$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconTranslate$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun iconTranslateAnchor$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun occlusionOpacityMode$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun symbolAvoidEdges$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun symbolElevationReference$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun symbolPlacement$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun symbolSpacing$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun symbolZElevate$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun symbolZOffset$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun symbolZOrder$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textAllowOverlap$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textAnchor$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textColor$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textEmissiveStrength$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textFont$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textHaloBlur$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textHaloColor$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textHaloWidth$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textIgnorePlacement$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textJustify$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textKeepUpright$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textLetterSpacing$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textLineHeight$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textMaxAngle$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textMaxWidth$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textOcclusionOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textOffset$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textOpacity$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textOptional$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textPadding$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textPitchAlignment$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textRadialOffset$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textRotate$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textRotationAlignment$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textSize$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textSizeScaleRange$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textTransform$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textTranslate$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n\tpublic static synthetic fun textTranslateAnchor$default (Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayerDsl;Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/generated/SymbolLayerKt {\n\tpublic static final fun symbolLayer (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/layers/generated/SymbolLayer;\n}\n\npublic class com/mapbox/maps/extension/style/layers/properties/PropertyValue {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/PropertyValue$Companion;\n\tpublic final fun getColorInt ()Ljava/lang/Integer;\n\tpublic final fun getPropertyName ()Ljava/lang/String;\n\tpublic final fun getPropertyValue ()Ljava/lang/Object;\n\tpublic final fun getValue ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun getValue ()Ljava/lang/Object;\n\tpublic final fun isExpression ()Z\n\tpublic final fun isTransition ()Z\n\tpublic final fun isValue ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/PropertyValue$Companion {\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/Anchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/Anchor$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/Anchor;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/Anchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/Anchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/Anchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/Anchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/BackgroundPitchAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference$Companion;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ClipLayerTypes : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/ClipLayerTypes$Companion;\n\tpublic static final field MODEL Lcom/mapbox/maps/extension/style/layers/properties/generated/ClipLayerTypes;\n\tpublic static final field SYMBOL Lcom/mapbox/maps/extension/style/layers/properties/generated/ClipLayerTypes;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ClipLayerTypes;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ClipLayerTypes$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ClipLayerTypes;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference$Companion;\n\tpublic static final field HD_ROAD_BASE Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment$Companion;\n\tpublic static final field FLAT Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment;\n\tpublic static final field TERRAIN Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionBaseAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment$Companion;\n\tpublic static final field FLAT Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment;\n\tpublic static final field TERRAIN Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionHeightAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillExtrusionTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/HillshadeIlluminationAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconAnchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field BOTTOM Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic static final field BOTTOM_LEFT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic static final field BOTTOM_RIGHT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic static final field CENTER Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor$Companion;\n\tpublic static final field LEFT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic static final field RIGHT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic static final field TOP Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic static final field TOP_LEFT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic static final field TOP_RIGHT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconAnchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconTextFit : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field BOTH Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit$Companion;\n\tpublic static final field HEIGHT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic static final field WIDTH Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconTextFit$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineCap : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field BUTT Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap$Companion;\n\tpublic static final field ROUND Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;\n\tpublic static final field SQUARE Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineCap$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference$Companion;\n\tpublic static final field GROUND Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n\tpublic static final field SEA Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineJoin : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field BEVEL Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin$Companion;\n\tpublic static final field MITER Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic static final field ROUND Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineJoin$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit$Companion;\n\tpublic static final field METERS Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;\n\tpublic static final field PIXELS Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference$Companion;\n\tpublic static final field GROUND Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;\n\tpublic static final field SEA Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelScaleMode;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ModelType : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field COMMON_3D Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType$Companion;\n\tpublic static final field LOCATION_INDICATOR Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ModelType$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ModelType;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field ANCHOR Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode$Companion;\n\tpublic static final field PIXEL Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ProjectionName : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/ProjectionName$Companion;\n\tpublic static final field GLOBE Lcom/mapbox/maps/extension/style/layers/properties/generated/ProjectionName;\n\tpublic static final field MERCATOR Lcom/mapbox/maps/extension/style/layers/properties/generated/ProjectionName;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ProjectionName;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/ProjectionName$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/ProjectionName;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/RasterResampling : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling$Companion;\n\tpublic static final field LINEAR Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling;\n\tpublic static final field NEAREST Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/RasterResampling$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/RasterResampling;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/SkyType : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field ATMOSPHERE Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType$Companion;\n\tpublic static final field GRADIENT Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/SkyType$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/SkyType;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference$Companion;\n\tpublic static final field GROUND Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;\n\tpublic static final field HD_ROAD_MARKUP Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;\n\tpublic static final field SEA Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement$Companion;\n\tpublic static final field LINE Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;\n\tpublic static final field LINE_CENTER Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;\n\tpublic static final field POINT Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder$Companion;\n\tpublic static final field SOURCE Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;\n\tpublic static final field VIEWPORT_Y Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextAnchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field BOTTOM Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic static final field BOTTOM_LEFT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic static final field BOTTOM_RIGHT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic static final field CENTER Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor$Companion;\n\tpublic static final field LEFT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic static final field RIGHT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic static final field TOP Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic static final field TOP_LEFT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic static final field TOP_RIGHT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextAnchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextJustify : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic static final field CENTER Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify$Companion;\n\tpublic static final field LEFT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic static final field RIGHT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextJustify$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field AUTO Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextTransform : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform$Companion;\n\tpublic static final field LOWERCASE Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic static final field UPPERCASE Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextTransform$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor$Companion;\n\tpublic static final field MAP Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextWritingMode : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/TextWritingMode$Companion;\n\tpublic static final field HORIZONTAL Lcom/mapbox/maps/extension/style/layers/properties/generated/TextWritingMode;\n\tpublic static final field VERTICAL Lcom/mapbox/maps/extension/style/layers/properties/generated/TextWritingMode;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextWritingMode;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/TextWritingMode$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/TextWritingMode;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/Visibility : com/mapbox/maps/extension/style/layers/properties/generated/LayerProperty {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility$Companion;\n\tpublic static final field NONE Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic static final field VISIBLE Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic final class com/mapbox/maps/extension/style/layers/properties/generated/Visibility$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/layers/properties/generated/Visibility;\n}\n\npublic final class com/mapbox/maps/extension/style/light/DynamicLight : com/mapbox/maps/extension/style/StyleContract$StyleLightExtension {\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract class com/mapbox/maps/extension/style/light/Light {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/light/Light$Companion;\n\tpublic abstract fun getLightId ()Ljava/lang/String;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/style/light/Light$Companion {\n}\n\npublic final class com/mapbox/maps/extension/style/light/LightPosition {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/light/LightPosition$Companion;\n\tpublic fun <init> (DDD)V\n\tpublic final fun copy (DDD)Lcom/mapbox/maps/extension/style/light/LightPosition;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/style/light/LightPosition;DDDILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/LightPosition;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic final fun toDoubleArray ()[D\n\tpublic final fun toList ()Ljava/util/List;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic final fun toValue ()Lcom/mapbox/bindgen/Value;\n}\n\npublic final class com/mapbox/maps/extension/style/light/LightPosition$Companion {\n\tpublic final fun fromArray ([D)Lcom/mapbox/maps/extension/style/light/LightPosition;\n\tpublic final fun fromList (Ljava/util/List;)Lcom/mapbox/maps/extension/style/light/LightPosition;\n}\n\npublic final class com/mapbox/maps/extension/style/light/LightUtils {\n\tpublic static final field TAG Ljava/lang/String;\n\tpublic static final fun dynamicLight (Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;)Lcom/mapbox/maps/extension/style/light/DynamicLight;\n\tpublic static final fun getLight (Lcom/mapbox/maps/MapboxStyleManager;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/Light;\n\tpublic static final fun setLight (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;)V\n\tpublic static final fun setLight (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/light/generated/FlatLight;)V\n\tpublic static final fun setLights (Lcom/mapbox/maps/MapboxStyleManager;Ljava/util/List;)V\n}\n\npublic final class com/mapbox/maps/extension/style/light/generated/AmbientLight : com/mapbox/maps/extension/style/light/Light, com/mapbox/maps/extension/style/light/generated/AmbientLightDslReceiver {\n\tpublic fun color (I)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIntensity ()Ljava/lang/Double;\n\tpublic final fun getIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun getLightId ()Ljava/lang/String;\n\tpublic fun intensity (D)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/light/generated/AmbientLightDslReceiver {\n\tpublic abstract fun color (I)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun intensity (D)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic abstract fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n}\n\npublic final class com/mapbox/maps/extension/style/light/generated/AmbientLightDslReceiver$DefaultImpls {\n\tpublic static synthetic fun color$default (Lcom/mapbox/maps/extension/style/light/generated/AmbientLightDslReceiver;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic static synthetic fun intensity$default (Lcom/mapbox/maps/extension/style/light/generated/AmbientLightDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n}\n\npublic final class com/mapbox/maps/extension/style/light/generated/AmbientLightKt {\n\tpublic static final fun ambientLight (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n\tpublic static synthetic fun ambientLight$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/AmbientLight;\n}\n\npublic final class com/mapbox/maps/extension/style/light/generated/DirectionalLight : com/mapbox/maps/extension/style/light/Light, com/mapbox/maps/extension/style/light/generated/DirectionalLightDslReceiver {\n\tpublic fun castShadows (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun castShadows (Z)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun color (I)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun direction (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun direction (Ljava/util/List;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun directionTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun directionTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic final fun getCastShadows ()Ljava/lang/Boolean;\n\tpublic final fun getCastShadowsAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDirection ()Ljava/util/List;\n\tpublic final fun getDirectionAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDirectionTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIntensity ()Ljava/lang/Double;\n\tpublic final fun getIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun getLightId ()Ljava/lang/String;\n\tpublic final fun getShadowDrawBeforeLayer ()Ljava/lang/String;\n\tpublic final fun getShadowDrawBeforeLayerAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getShadowIntensity ()Ljava/lang/Double;\n\tpublic final fun getShadowIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getShadowIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun intensity (D)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun shadowDrawBeforeLayer (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun shadowDrawBeforeLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun shadowIntensity (D)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun shadowIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun shadowIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic fun shadowIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/light/generated/DirectionalLightDslReceiver {\n\tpublic abstract fun castShadows (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun castShadows (Z)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun color (I)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun direction (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun direction (Ljava/util/List;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun directionTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun directionTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun intensity (D)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun shadowDrawBeforeLayer (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun shadowDrawBeforeLayer (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun shadowIntensity (D)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun shadowIntensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun shadowIntensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic abstract fun shadowIntensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n}\n\npublic final class com/mapbox/maps/extension/style/light/generated/DirectionalLightDslReceiver$DefaultImpls {\n\tpublic static synthetic fun castShadows$default (Lcom/mapbox/maps/extension/style/light/generated/DirectionalLightDslReceiver;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic static synthetic fun color$default (Lcom/mapbox/maps/extension/style/light/generated/DirectionalLightDslReceiver;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic static synthetic fun direction$default (Lcom/mapbox/maps/extension/style/light/generated/DirectionalLightDslReceiver;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic static synthetic fun intensity$default (Lcom/mapbox/maps/extension/style/light/generated/DirectionalLightDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic static synthetic fun shadowIntensity$default (Lcom/mapbox/maps/extension/style/light/generated/DirectionalLightDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n}\n\npublic final class com/mapbox/maps/extension/style/light/generated/DirectionalLightKt {\n\tpublic static final fun directionalLight (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n\tpublic static synthetic fun directionalLight$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/DirectionalLight;\n}\n\npublic final class com/mapbox/maps/extension/style/light/generated/FlatLight : com/mapbox/maps/extension/style/light/Light, com/mapbox/maps/extension/style/StyleContract$StyleLightExtension, com/mapbox/maps/extension/style/light/generated/FlatLightDslReceiver {\n\tpublic fun anchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun anchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/Anchor;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic fun color (I)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic final fun getAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/Anchor;\n\tpublic final fun getAnchorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIntensity ()Ljava/lang/Double;\n\tpublic final fun getIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun getLightId ()Ljava/lang/String;\n\tpublic final fun getPosition ()Lcom/mapbox/maps/extension/style/light/LightPosition;\n\tpublic final fun getPositionAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getPositionTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun intensity (D)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun position (DDD)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun position (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun position (Lcom/mapbox/maps/extension/style/light/LightPosition;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun positionTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic fun positionTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/light/generated/FlatLightDslReceiver {\n\tpublic abstract fun anchor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun anchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/Anchor;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun color (I)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun intensity (D)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun position (DDD)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun position (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun position (Lcom/mapbox/maps/extension/style/light/LightPosition;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun positionTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic abstract fun positionTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n}\n\npublic final class com/mapbox/maps/extension/style/light/generated/FlatLightDslReceiver$DefaultImpls {\n\tpublic static synthetic fun anchor$default (Lcom/mapbox/maps/extension/style/light/generated/FlatLightDslReceiver;Lcom/mapbox/maps/extension/style/layers/properties/generated/Anchor;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic static synthetic fun color$default (Lcom/mapbox/maps/extension/style/light/generated/FlatLightDslReceiver;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic static synthetic fun intensity$default (Lcom/mapbox/maps/extension/style/light/generated/FlatLightDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic static synthetic fun position$default (Lcom/mapbox/maps/extension/style/light/generated/FlatLightDslReceiver;Lcom/mapbox/maps/extension/style/light/LightPosition;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n}\n\npublic final class com/mapbox/maps/extension/style/light/generated/FlatLightKt {\n\tpublic static final fun flatLight (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n\tpublic static synthetic fun flatLight$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/light/generated/FlatLight;\n}\n\npublic final class com/mapbox/maps/extension/style/model/ModelExtensionImpl : com/mapbox/maps/extension/style/StyleContract$StyleModelExtension {\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/model/ModelExtensionImpl$Builder;)V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic final class com/mapbox/maps/extension/style/model/ModelExtensionImpl$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/model/ModelExtensionImpl;\n\tpublic final fun getModelId ()Ljava/lang/String;\n\tpublic final fun uri (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/model/ModelExtensionImpl$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/model/ModelUtils {\n\tpublic static final fun addModel (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleModelExtension;)V\n\tpublic static final fun model (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/model/ModelExtensionImpl;\n}\n\npublic final class com/mapbox/maps/extension/style/precipitations/generated/Rain : com/mapbox/maps/extension/style/StyleContract$StyleRainExtension, com/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver {\n\tpublic fun <init> ()V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic fun centerThinning (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun centerThinning (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun centerThinningTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun centerThinningTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun color (I)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun density (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun density (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun densityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun densityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun direction (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun direction (Ljava/util/List;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun directionTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun directionTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun distortionStrength (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun distortionStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun distortionStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun distortionStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun dropletSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun dropletSize (Ljava/util/List;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun dropletSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun dropletSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic final fun getCenterThinning ()Ljava/lang/Double;\n\tpublic final fun getCenterThinningAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCenterThinningTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDensity ()Ljava/lang/Double;\n\tpublic final fun getDensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDirection ()Ljava/util/List;\n\tpublic final fun getDirectionAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDirectionTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDistortionStrength ()Ljava/lang/Double;\n\tpublic final fun getDistortionStrengthAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDistortionStrengthTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDropletSize ()Ljava/util/List;\n\tpublic final fun getDropletSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDropletSizeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIntensity ()Ljava/lang/Double;\n\tpublic final fun getIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getOpacity ()Ljava/lang/Double;\n\tpublic final fun getOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getVignette ()Ljava/lang/Double;\n\tpublic final fun getVignetteAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getVignetteColor ()Ljava/lang/String;\n\tpublic final fun getVignetteColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getVignetteColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getVignetteColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getVignetteColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getVignetteColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getVignetteTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun intensity (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun opacity (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun opacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun opacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun opacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignette (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignette (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignetteColor (I)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignetteColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignetteColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignetteColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignetteColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignetteColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignetteColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignetteTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic fun vignetteTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver {\n\tpublic abstract fun centerThinning (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun centerThinning (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun centerThinningTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun centerThinningTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun color (I)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun density (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun density (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun densityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun densityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun direction (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun direction (Ljava/util/List;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun directionTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun directionTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun distortionStrength (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun distortionStrength (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun distortionStrengthTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun distortionStrengthTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun dropletSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun dropletSize (Ljava/util/List;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun dropletSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun dropletSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun intensity (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun opacity (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun opacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun opacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun opacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignette (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignette (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignetteColor (I)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignetteColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignetteColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignetteColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignetteColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignetteColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignetteColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignetteTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic abstract fun vignetteTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n}\n\npublic final class com/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver$DefaultImpls {\n\tpublic static synthetic fun centerThinning$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static synthetic fun color$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static synthetic fun density$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static synthetic fun direction$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static synthetic fun distortionStrength$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static synthetic fun dropletSize$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static synthetic fun intensity$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static synthetic fun opacity$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static synthetic fun vignette$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static synthetic fun vignetteColor$default (Lcom/mapbox/maps/extension/style/precipitations/generated/RainDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n}\n\npublic final class com/mapbox/maps/extension/style/precipitations/generated/RainKt {\n\tpublic static final fun rain (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n}\n\npublic final class com/mapbox/maps/extension/style/precipitations/generated/RainUtils {\n\tpublic static final fun getRain (Lcom/mapbox/maps/MapboxStyleManager;)Lcom/mapbox/maps/extension/style/precipitations/generated/Rain;\n\tpublic static final fun removeRain (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic static final fun setRain (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleRainExtension;)V\n}\n\npublic final class com/mapbox/maps/extension/style/precipitations/generated/Snow : com/mapbox/maps/extension/style/StyleContract$StyleSnowExtension, com/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver {\n\tpublic fun <init> ()V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic fun centerThinning (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun centerThinning (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun centerThinningTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun centerThinningTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun color (I)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun density (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun density (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun densityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun densityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun direction (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun direction (Ljava/util/List;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun directionTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun directionTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun flakeSize (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun flakeSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun flakeSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun flakeSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic final fun getCenterThinning ()Ljava/lang/Double;\n\tpublic final fun getCenterThinningAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getCenterThinningTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDensity ()Ljava/lang/Double;\n\tpublic final fun getDensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getDirection ()Ljava/util/List;\n\tpublic final fun getDirectionAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getDirectionTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getFlakeSize ()Ljava/lang/Double;\n\tpublic final fun getFlakeSizeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getFlakeSizeTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getIntensity ()Ljava/lang/Double;\n\tpublic final fun getIntensityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getIntensityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getOpacity ()Ljava/lang/Double;\n\tpublic final fun getOpacityAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getOpacityTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getVignette ()Ljava/lang/Double;\n\tpublic final fun getVignetteAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getVignetteColor ()Ljava/lang/String;\n\tpublic final fun getVignetteColorAsColorInt ()Ljava/lang/Integer;\n\tpublic final fun getVignetteColorAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getVignetteColorTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun getVignetteColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getVignetteColorUseThemeAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getVignetteTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic fun intensity (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun opacity (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun opacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun opacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun opacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignette (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignette (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignetteColor (I)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignetteColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignetteColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignetteColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignetteColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignetteColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignetteColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignetteTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic fun vignetteTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver {\n\tpublic abstract fun centerThinning (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun centerThinning (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun centerThinningTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun centerThinningTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun color (I)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun color (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun color (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun colorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun colorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun colorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun colorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun density (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun density (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun densityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun densityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun direction (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun direction (Ljava/util/List;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun directionTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun directionTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun flakeSize (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun flakeSize (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun flakeSizeTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun flakeSizeTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun intensity (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun intensity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun intensityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun intensityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun opacity (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun opacity (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun opacityTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun opacityTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignette (D)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignette (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignetteColor (I)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignetteColor (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignetteColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignetteColorTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignetteColorTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignetteColorUseTheme (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignetteColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignetteTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic abstract fun vignetteTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n}\n\npublic final class com/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver$DefaultImpls {\n\tpublic static synthetic fun centerThinning$default (Lcom/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic static synthetic fun color$default (Lcom/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic static synthetic fun density$default (Lcom/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic static synthetic fun direction$default (Lcom/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic static synthetic fun flakeSize$default (Lcom/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic static synthetic fun intensity$default (Lcom/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic static synthetic fun opacity$default (Lcom/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic static synthetic fun vignette$default (Lcom/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic static synthetic fun vignetteColor$default (Lcom/mapbox/maps/extension/style/precipitations/generated/SnowDslReceiver;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n}\n\npublic final class com/mapbox/maps/extension/style/precipitations/generated/SnowKt {\n\tpublic static final fun snow (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n}\n\npublic final class com/mapbox/maps/extension/style/precipitations/generated/SnowUtils {\n\tpublic static final fun getSnow (Lcom/mapbox/maps/MapboxStyleManager;)Lcom/mapbox/maps/extension/style/precipitations/generated/Snow;\n\tpublic static final fun removeSnow (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic static final fun setSnow (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleSnowExtension;)V\n}\n\npublic final class com/mapbox/maps/extension/style/projection/generated/Projection : com/mapbox/maps/extension/style/StyleContract$StyleProjectionExtension {\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/layers/properties/generated/ProjectionName;)V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic final fun getName ()Lcom/mapbox/maps/extension/style/layers/properties/generated/ProjectionName;\n}\n\npublic final class com/mapbox/maps/extension/style/projection/generated/ProjectionKt {\n\tpublic static final fun projection (Lcom/mapbox/maps/extension/style/layers/properties/generated/ProjectionName;)Lcom/mapbox/maps/extension/style/projection/generated/Projection;\n}\n\npublic final class com/mapbox/maps/extension/style/projection/generated/StyleProjectionUtils {\n\tpublic static final fun getProjection (Lcom/mapbox/maps/MapboxStyleManager;)Lcom/mapbox/maps/extension/style/projection/generated/Projection;\n\tpublic static final fun setProjection (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/projection/generated/Projection;)V\n}\n\npublic final class com/mapbox/maps/extension/style/sources/CustomGeometrySource : com/mapbox/maps/extension/style/sources/Source {\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/CustomGeometrySourceOptions;)V\n\tpublic final fun getMaxOverscaleFactorForParentTiles ()Ljava/lang/Long;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/TileCacheBudget;\n\tpublic final fun invalidRegion (Lcom/mapbox/maps/CoordinateBounds;)V\n\tpublic final fun invalidTile (Lcom/mapbox/maps/CanonicalTileID;)V\n\tpublic final fun invalidateRegion (Lcom/mapbox/maps/CoordinateBounds;)V\n\tpublic final fun invalidateTile (Lcom/mapbox/maps/CanonicalTileID;)V\n\tpublic final fun setMaxOverscaleFactorForParentTiles (J)V\n\tpublic final fun setTileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)V\n\tpublic final fun setTileData (Lcom/mapbox/maps/CanonicalTileID;Ljava/util/List;)V\n}\n\npublic final class com/mapbox/maps/extension/style/sources/CustomGeometrySourceKt {\n\tpublic static final fun customGeometrySource (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/CustomGeometrySource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/CustomRasterSource : com/mapbox/maps/extension/style/sources/Source {\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/CustomRasterSourceOptions;)V\n\tpublic final fun getMaxOverscaleFactorForParentTiles ()Ljava/lang/Long;\n\tpublic final fun setMaxOverscaleFactorForParentTiles (J)V\n\tpublic final fun setTileData (Ljava/util/List;)V\n}\n\npublic final class com/mapbox/maps/extension/style/sources/CustomRasterSourceKt {\n\tpublic static final fun customRasterSource (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/CustomRasterSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/GeoJsonSourceUtils {\n\tpublic static final fun addGeoJSONSourceFeatures (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/util/List;)V\n\tpublic static final fun addGeoJSONSourceFeatures (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/util/List;Ljava/lang/String;)V\n\tpublic static synthetic fun addGeoJSONSourceFeatures$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)V\n\tpublic static final fun removeGeoJSONSourceFeatures (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/util/List;)V\n\tpublic static final fun removeGeoJSONSourceFeatures (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/util/List;Ljava/lang/String;)V\n\tpublic static synthetic fun removeGeoJSONSourceFeatures$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)V\n\tpublic static final fun updateGeoJSONSourceFeatures (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/util/List;)V\n\tpublic static final fun updateGeoJSONSourceFeatures (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/util/List;Ljava/lang/String;)V\n\tpublic static synthetic fun updateGeoJSONSourceFeatures$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)V\n}\n\npublic final class com/mapbox/maps/extension/style/sources/ImageSourceExtKt {\n\tpublic static final fun updateImage (Lcom/mapbox/maps/extension/style/sources/generated/ImageSource;Landroid/graphics/Bitmap;)V\n\tpublic static final fun updateImage (Lcom/mapbox/maps/extension/style/sources/generated/ImageSource;Lcom/mapbox/maps/Image;)V\n}\n\npublic abstract class com/mapbox/maps/extension/style/sources/Source : com/mapbox/maps/extension/style/StyleContract$StyleSourceExtension {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/Source$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tprotected fun addSource (Lcom/mapbox/maps/MapboxStyleManager;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/Source$Companion {\n}\n\npublic final class com/mapbox/maps/extension/style/sources/SourceUtils {\n\tpublic static final fun addSource (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleSourceExtension;)V\n\tpublic static final fun getSource (Lcom/mapbox/maps/MapboxStyleManager;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/Source;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/TileSet : java/util/HashMap {\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun containsKey (Ljava/lang/Object;)Z\n\tpublic fun containsKey (Ljava/lang/String;)Z\n\tpublic fun containsValue (Lcom/mapbox/bindgen/Value;)Z\n\tpublic final fun containsValue (Ljava/lang/Object;)Z\n\tpublic final fun entrySet ()Ljava/util/Set;\n\tpublic final fun get (Ljava/lang/Object;)Lcom/mapbox/bindgen/Value;\n\tpublic final synthetic fun get (Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun get (Ljava/lang/String;)Lcom/mapbox/bindgen/Value;\n\tpublic fun getEntries ()Ljava/util/Set;\n\tpublic fun getKeys ()Ljava/util/Set;\n\tpublic final fun getOrDefault (Ljava/lang/Object;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Value;\n\tpublic final synthetic fun getOrDefault (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun getOrDefault (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Value;\n\tpublic fun getSize ()I\n\tpublic fun getValues ()Ljava/util/Collection;\n\tpublic final fun keySet ()Ljava/util/Set;\n\tpublic final fun remove (Ljava/lang/Object;)Lcom/mapbox/bindgen/Value;\n\tpublic final synthetic fun remove (Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun remove (Ljava/lang/Object;Ljava/lang/Object;)Z\n\tpublic fun remove (Ljava/lang/String;)Lcom/mapbox/bindgen/Value;\n\tpublic fun remove (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Z\n\tpublic final fun size ()I\n\tpublic final fun values ()Ljava/util/Collection;\n}\n\npublic class com/mapbox/maps/extension/style/sources/TileSet$Builder {\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;)V\n\tpublic final fun attribution (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun bounds (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic static synthetic fun bounds$default (Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/TileSet;\n\tpublic final fun center (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun data (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun description (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun getTilejson ()Ljava/lang/String;\n\tpublic final fun getTiles ()Ljava/util/List;\n\tpublic final fun grids (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun legend (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun maxZoom (I)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic static synthetic fun maxZoom$default (Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;IILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun minZoom (I)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic static synthetic fun minZoom$default (Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;IILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun name (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun scheme (Lcom/mapbox/maps/extension/style/sources/generated/Scheme;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun template (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic final fun version (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n\tpublic static synthetic fun version$default (Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/TileSet$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/TileSet$RasterDemBuilder : com/mapbox/maps/extension/style/sources/TileSet$Builder {\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;)V\n\tpublic final fun encoding (Lcom/mapbox/maps/extension/style/sources/generated/Encoding;)Lcom/mapbox/maps/extension/style/sources/TileSet$RasterDemBuilder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/Encoding {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/generated/Encoding$Companion;\n\tpublic static final field MAPBOX Lcom/mapbox/maps/extension/style/sources/generated/Encoding;\n\tpublic static final field TERRARIUM Lcom/mapbox/maps/extension/style/sources/generated/Encoding;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/Encoding;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/Encoding$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/Encoding;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/GeoJsonSource : com/mapbox/maps/extension/style/sources/Source {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Companion;\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic final fun data (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun data (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic static synthetic fun data$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun feature (Lcom/mapbox/geojson/Feature;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun feature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic static synthetic fun feature$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Lcom/mapbox/geojson/Feature;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun featureCollection (Lcom/mapbox/geojson/FeatureCollection;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun featureCollection (Lcom/mapbox/geojson/FeatureCollection;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic static synthetic fun featureCollection$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Lcom/mapbox/geojson/FeatureCollection;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun geometry (Lcom/mapbox/geojson/Geometry;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun geometry (Lcom/mapbox/geojson/Geometry;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic static synthetic fun geometry$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Lcom/mapbox/geojson/Geometry;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun getAttribution ()Ljava/lang/String;\n\tpublic final fun getAutoMaxZoom ()Ljava/lang/Boolean;\n\tpublic final fun getBuffer ()Ljava/lang/Long;\n\tpublic final fun getCluster ()Ljava/lang/Boolean;\n\tpublic final fun getClusterMaxZoom ()Ljava/lang/Long;\n\tpublic final fun getClusterMinPoints ()Ljava/lang/Long;\n\tpublic final fun getClusterProperties ()Ljava/util/HashMap;\n\tpublic final fun getClusterRadius ()Ljava/lang/Long;\n\tpublic final fun getData ()Ljava/lang/String;\n\tpublic final fun getGenerateId ()Ljava/lang/Boolean;\n\tpublic final fun getLineMetrics ()Ljava/lang/Boolean;\n\tpublic final fun getMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getMinzoom ()Ljava/lang/Long;\n\tpublic final fun getPrefetchZoomDelta ()Ljava/lang/Long;\n\tpublic final fun getPromoteId ()Lcom/mapbox/maps/extension/style/types/PromoteId;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/TileCacheBudget;\n\tpublic final fun getTolerance ()Ljava/lang/Double;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun url (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic static synthetic fun url$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun attribution (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun autoMaxZoom (Z)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun autoMaxZoom$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun buffer (J)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun buffer$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic final fun cluster (Z)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun cluster$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun clusterMaxZoom (J)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun clusterMinPoints (J)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun clusterProperties (Ljava/util/HashMap;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun clusterProperty (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun clusterProperty (Ljava/lang/String;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun clusterRadius (J)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun clusterRadius$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun data (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun data (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun data$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun feature (Lcom/mapbox/geojson/Feature;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun feature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun feature$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;Lcom/mapbox/geojson/Feature;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun featureCollection (Lcom/mapbox/geojson/FeatureCollection;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun featureCollection (Lcom/mapbox/geojson/FeatureCollection;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun featureCollection$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;Lcom/mapbox/geojson/FeatureCollection;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun generateId (Z)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun generateId$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun geometry (Lcom/mapbox/geojson/Geometry;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun geometry (Lcom/mapbox/geojson/Geometry;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun geometry$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;Lcom/mapbox/geojson/Geometry;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun lineMetrics (Z)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun lineMetrics$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun promoteId (Lcom/mapbox/maps/extension/style/types/PromoteId;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun tolerance (D)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun tolerance$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic final fun url (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n\tpublic static synthetic fun url$default (Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/GeoJsonSource$Companion {\n\tpublic final fun getDefaultBuffer ()Ljava/lang/Long;\n\tpublic final fun getDefaultCluster ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultClusterMaxZoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultClusterMinPoints ()Ljava/lang/Long;\n\tpublic final fun getDefaultClusterRadius ()Ljava/lang/Long;\n\tpublic final fun getDefaultGenerateId ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultLineMetrics ()Ljava/lang/Boolean;\n\tpublic final fun getDefaultMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultMinzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultPrefetchZoomDelta ()Ljava/lang/Long;\n\tpublic final fun getDefaultTolerance ()Ljava/lang/Double;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/GeoJsonSourceKt {\n\tpublic static final fun geoJsonSource (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n\tpublic static final fun geoJsonSource (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/GeoJsonSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ImageSource : com/mapbox/maps/extension/style/sources/Source {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/generated/ImageSource$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/ImageSource$Builder;)V\n\tpublic final fun coordinates (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ImageSource;\n\tpublic final fun getCoordinates ()Ljava/util/List;\n\tpublic final fun getPrefetchZoomDelta ()Ljava/lang/Long;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/ImageSource;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/ImageSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/ImageSource;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/ImageSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ImageSource$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/ImageSource;\n\tpublic final fun coordinates (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ImageSource$Builder;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/ImageSource$Builder;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/ImageSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/ImageSource$Builder;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/ImageSource$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ImageSource$Companion {\n\tpublic final fun getDefaultPrefetchZoomDelta ()Ljava/lang/Long;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ImageSourceKt {\n\tpublic static final fun imageSource (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/ImageSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride : java/util/HashMap {\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun containsKey (Ljava/lang/Object;)Z\n\tpublic fun containsKey (Ljava/lang/String;)Z\n\tpublic fun containsValue (Lcom/mapbox/bindgen/Value;)Z\n\tpublic final fun containsValue (Ljava/lang/Object;)Z\n\tpublic final fun entrySet ()Ljava/util/Set;\n\tpublic final fun get (Ljava/lang/Object;)Lcom/mapbox/bindgen/Value;\n\tpublic final synthetic fun get (Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun get (Ljava/lang/String;)Lcom/mapbox/bindgen/Value;\n\tpublic fun getEntries ()Ljava/util/Set;\n\tpublic fun getKeys ()Ljava/util/Set;\n\tpublic final fun getOrDefault (Ljava/lang/Object;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Value;\n\tpublic final synthetic fun getOrDefault (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun getOrDefault (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Value;\n\tpublic fun getSize ()I\n\tpublic fun getValues ()Ljava/util/Collection;\n\tpublic final fun keySet ()Ljava/util/Set;\n\tpublic final fun remove (Ljava/lang/Object;)Lcom/mapbox/bindgen/Value;\n\tpublic final synthetic fun remove (Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun remove (Ljava/lang/Object;Ljava/lang/Object;)Z\n\tpublic fun remove (Ljava/lang/String;)Lcom/mapbox/bindgen/Value;\n\tpublic fun remove (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Z\n\tpublic final fun size ()I\n\tpublic final fun values ()Ljava/util/Collection;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun modelColor (I)Lcom/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride$Builder;\n\tpublic final fun modelColor (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride$Builder;\n\tpublic final fun modelColorMixIntensity (D)Lcom/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride$Builder;\n\tpublic final fun modelEmissiveStrength (D)Lcom/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride$Builder;\n\tpublic final fun modelOpacity (D)Lcom/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelNodeOverride : java/util/HashMap {\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/ModelNodeOverride$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun containsKey (Ljava/lang/Object;)Z\n\tpublic fun containsKey (Ljava/lang/String;)Z\n\tpublic fun containsValue (Lcom/mapbox/bindgen/Value;)Z\n\tpublic final fun containsValue (Ljava/lang/Object;)Z\n\tpublic final fun entrySet ()Ljava/util/Set;\n\tpublic final fun get (Ljava/lang/Object;)Lcom/mapbox/bindgen/Value;\n\tpublic final synthetic fun get (Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun get (Ljava/lang/String;)Lcom/mapbox/bindgen/Value;\n\tpublic fun getEntries ()Ljava/util/Set;\n\tpublic fun getKeys ()Ljava/util/Set;\n\tpublic final fun getOrDefault (Ljava/lang/Object;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Value;\n\tpublic final synthetic fun getOrDefault (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun getOrDefault (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Value;\n\tpublic fun getSize ()I\n\tpublic fun getValues ()Ljava/util/Collection;\n\tpublic final fun keySet ()Ljava/util/Set;\n\tpublic final fun remove (Ljava/lang/Object;)Lcom/mapbox/bindgen/Value;\n\tpublic final synthetic fun remove (Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun remove (Ljava/lang/Object;Ljava/lang/Object;)Z\n\tpublic fun remove (Ljava/lang/String;)Lcom/mapbox/bindgen/Value;\n\tpublic fun remove (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Z\n\tpublic final fun size ()I\n\tpublic final fun values ()Ljava/util/Collection;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelNodeOverride$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/ModelNodeOverride;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun orientation (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelNodeOverride$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelSource : com/mapbox/maps/extension/style/sources/Source {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;)V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic final fun getMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getMinzoom ()Ljava/lang/Long;\n\tpublic final fun getModels ()Ljava/util/List;\n\tpublic final fun getTiles ()Ljava/util/List;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;\n\tpublic final fun models (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;\n\tpublic final fun removeAllModels ()V\n\tpublic final fun removeModel (Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;)V\n\tpublic final fun removeModel (Ljava/lang/String;)V\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelSource$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun batched (Z)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;\n\tpublic final fun models (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelSource$Companion {\n\tpublic final fun getDefaultMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultMinzoom ()Ljava/lang/Long;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelSourceKt {\n\tpublic static final fun modelSource (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelSourceModel {\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder;)V\n\tpublic final fun featureProperties (Ljava/util/HashMap;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n\tpublic final fun getFeatureProperties ()Ljava/util/HashMap;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getMaterialOverrideNames ()Ljava/util/List;\n\tpublic final fun getMaterialOverrides ()Ljava/util/List;\n\tpublic final fun getNodeOverrideNames ()Ljava/util/List;\n\tpublic final fun getNodeOverrides ()Ljava/util/List;\n\tpublic final fun getOrientation ()Ljava/util/List;\n\tpublic final fun getPosition ()Ljava/util/List;\n\tpublic final fun getUri ()Ljava/lang/String;\n\tpublic final fun materialOverrideNames (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n\tpublic final fun materialOverrides (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n\tpublic final fun nodeOverrideNames (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n\tpublic final fun nodeOverrides (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n\tpublic final fun orientation (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n\tpublic final fun position (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n\tpublic final fun uri (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n\tpublic final fun featureProperties (Ljava/util/HashMap;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun materialOverrideNames (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder;\n\tpublic final fun materialOverrides (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder;\n\tpublic final fun nodeOverrideNames (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder;\n\tpublic final fun nodeOverrides (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder;\n\tpublic final fun orientation (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder;\n\tpublic final fun position (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder;\n\tpublic final fun uri (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/ModelSourceModelKt {\n\tpublic static final fun modelMaterialOverride (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/ModelMaterialOverride;\n\tpublic static final fun modelNodeOverride (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/ModelNodeOverride;\n\tpublic static final fun modelSourceModel (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/ModelSourceModel;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterArraySource : com/mapbox/maps/extension/style/sources/Source {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;)V\n\tpublic final fun getAttribution ()Ljava/lang/String;\n\tpublic final fun getBounds ()Ljava/util/List;\n\tpublic final fun getMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getMinzoom ()Ljava/lang/Long;\n\tpublic final fun getRasterLayers ()Ljava/util/List;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/TileCacheBudget;\n\tpublic final fun getTileSize ()Ljava/lang/Long;\n\tpublic final fun getTiles ()Ljava/util/List;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic final fun getVolatile ()Ljava/lang/Boolean;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n\tpublic final fun volatile (Z)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n\tpublic static synthetic fun volatile$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun attribution (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun bounds (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic static synthetic fun bounds$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun tileSet (Lcom/mapbox/maps/extension/style/sources/TileSet;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun tileSet (Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun tileSize (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic static synthetic fun tileSize$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic final fun volatile (Z)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n\tpublic static synthetic fun volatile$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterArraySource$Companion {\n\tpublic final fun getDefaultMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultMinzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultVolatile ()Ljava/lang/Boolean;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterArraySource$RasterDataLayer {\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBands ()Ljava/util/List;\n\tpublic final fun getLayerId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterArraySourceKt {\n\tpublic static final fun rasterArraySource (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/RasterArraySource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterDemSource : com/mapbox/maps/extension/style/sources/Source {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;)V\n\tpublic final fun getAttribution ()Ljava/lang/String;\n\tpublic final fun getBounds ()Ljava/util/List;\n\tpublic final fun getEncoding ()Lcom/mapbox/maps/extension/style/sources/generated/Encoding;\n\tpublic final fun getMaxOverscaleFactorForParentTiles ()Ljava/lang/Long;\n\tpublic final fun getMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getMinimumTileUpdateInterval ()Ljava/lang/Double;\n\tpublic final fun getMinzoom ()Ljava/lang/Long;\n\tpublic final fun getPrefetchZoomDelta ()Ljava/lang/Long;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/TileCacheBudget;\n\tpublic final fun getTileNetworkRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getTileRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getTileSize ()Ljava/lang/Long;\n\tpublic final fun getTiles ()Ljava/util/List;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic final fun getVolatile ()Ljava/lang/Boolean;\n\tpublic final fun maxOverscaleFactorForParentTiles (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun minimumTileUpdateInterval (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic static synthetic fun minimumTileUpdateInterval$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun tileNetworkRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic static synthetic fun tileNetworkRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun tileRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic static synthetic fun tileRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun volatile (Z)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic static synthetic fun volatile$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun attribution (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun bounds (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun bounds$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n\tpublic final fun encoding (Lcom/mapbox/maps/extension/style/sources/generated/Encoding;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun encoding$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;Lcom/mapbox/maps/extension/style/sources/generated/Encoding;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun maxOverscaleFactorForParentTiles (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun minimumTileUpdateInterval (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun minimumTileUpdateInterval$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun tileNetworkRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun tileNetworkRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun tileRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun tileRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun tileSet (Lcom/mapbox/maps/extension/style/sources/TileSet;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun tileSet (Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun tileSize (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun tileSize$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic final fun volatile (Z)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n\tpublic static synthetic fun volatile$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterDemSource$Companion {\n\tpublic final fun getDefaultEncoding ()Lcom/mapbox/maps/extension/style/sources/generated/Encoding;\n\tpublic final fun getDefaultMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultMinimumTileUpdateInterval ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultPrefetchZoomDelta ()Ljava/lang/Long;\n\tpublic final fun getDefaultTileNetworkRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getDefaultTileRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getDefaultVolatile ()Ljava/lang/Boolean;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterDemSourceKt {\n\tpublic static final fun rasterDemSource (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/RasterDemSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterSource : com/mapbox/maps/extension/style/sources/Source {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;)V\n\tpublic final fun getAttribution ()Ljava/lang/String;\n\tpublic final fun getBounds ()Ljava/util/List;\n\tpublic final fun getMaxOverscaleFactorForParentTiles ()Ljava/lang/Long;\n\tpublic final fun getMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getMinimumTileUpdateInterval ()Ljava/lang/Double;\n\tpublic final fun getMinzoom ()Ljava/lang/Long;\n\tpublic final fun getPrefetchZoomDelta ()Ljava/lang/Long;\n\tpublic final fun getScheme ()Lcom/mapbox/maps/extension/style/sources/generated/Scheme;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/TileCacheBudget;\n\tpublic final fun getTileNetworkRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getTileRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getTileSize ()Ljava/lang/Long;\n\tpublic final fun getTiles ()Ljava/util/List;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic final fun getVolatile ()Ljava/lang/Boolean;\n\tpublic final fun maxOverscaleFactorForParentTiles (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun minimumTileUpdateInterval (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic static synthetic fun minimumTileUpdateInterval$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun tileNetworkRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic static synthetic fun tileNetworkRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun tileRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic static synthetic fun tileRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun volatile (Z)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic static synthetic fun volatile$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterSource$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun attribution (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun bounds (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun bounds$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun maxOverscaleFactorForParentTiles (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun minimumTileUpdateInterval (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun minimumTileUpdateInterval$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun scheme (Lcom/mapbox/maps/extension/style/sources/generated/Scheme;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun scheme$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;Lcom/mapbox/maps/extension/style/sources/generated/Scheme;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun tileNetworkRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun tileNetworkRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun tileRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun tileRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun tileSet (Lcom/mapbox/maps/extension/style/sources/TileSet;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun tileSet (Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun tileSize (J)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun tileSize$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic final fun volatile (Z)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n\tpublic static synthetic fun volatile$default (Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterSource$Companion {\n\tpublic final fun getDefaultMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultMinimumTileUpdateInterval ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultPrefetchZoomDelta ()Ljava/lang/Long;\n\tpublic final fun getDefaultScheme ()Lcom/mapbox/maps/extension/style/sources/generated/Scheme;\n\tpublic final fun getDefaultTileNetworkRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getDefaultTileRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getDefaultVolatile ()Ljava/lang/Boolean;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/RasterSourceKt {\n\tpublic static final fun rasterSource (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/RasterSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/Scheme {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/generated/Scheme$Companion;\n\tpublic static final field TMS Lcom/mapbox/maps/extension/style/sources/generated/Scheme;\n\tpublic static final field XYZ Lcom/mapbox/maps/extension/style/sources/generated/Scheme;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/Scheme;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/Scheme$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/Scheme;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/VectorSource : com/mapbox/maps/extension/style/sources/Source {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;)V\n\tpublic final fun getAttribution ()Ljava/lang/String;\n\tpublic final fun getBounds ()Ljava/util/List;\n\tpublic final fun getMaxOverscaleFactorForParentTiles ()Ljava/lang/Long;\n\tpublic final fun getMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getMinimumTileUpdateInterval ()Ljava/lang/Double;\n\tpublic final fun getMinzoom ()Ljava/lang/Long;\n\tpublic final fun getPrefetchZoomDelta ()Ljava/lang/Long;\n\tpublic final fun getPromoteId ()Lcom/mapbox/maps/extension/style/types/PromoteId;\n\tpublic final fun getScheme ()Lcom/mapbox/maps/extension/style/sources/generated/Scheme;\n\tpublic final fun getTileCacheBudget ()Lcom/mapbox/maps/TileCacheBudget;\n\tpublic final fun getTileNetworkRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getTileRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getTiles ()Ljava/util/List;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic final fun getVolatile ()Ljava/lang/Boolean;\n\tpublic final fun maxOverscaleFactorForParentTiles (J)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun minimumTileUpdateInterval (D)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic static synthetic fun minimumTileUpdateInterval$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun tileNetworkRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic static synthetic fun tileNetworkRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun tileRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic static synthetic fun tileRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun volatile (Z)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic static synthetic fun volatile$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/VectorSource$Builder {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun attribution (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun bounds (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic static synthetic fun bounds$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;Ljava/util/List;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun maxOverscaleFactorForParentTiles (J)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun maxzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic static synthetic fun maxzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun minimumTileUpdateInterval (D)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic static synthetic fun minimumTileUpdateInterval$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun minzoom (J)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic static synthetic fun minzoom$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun prefetchZoomDelta (J)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic static synthetic fun prefetchZoomDelta$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;JILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun promoteId (Lcom/mapbox/maps/extension/style/types/PromoteId;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun scheme (Lcom/mapbox/maps/extension/style/sources/generated/Scheme;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic static synthetic fun scheme$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;Lcom/mapbox/maps/extension/style/sources/generated/Scheme;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun tileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun tileNetworkRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic static synthetic fun tileNetworkRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun tileRequestsDelay (D)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic static synthetic fun tileRequestsDelay$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun tileSet (Lcom/mapbox/maps/extension/style/sources/TileSet;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun tileSet (Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun tiles (Ljava/util/List;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun url (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic final fun volatile (Z)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n\tpublic static synthetic fun volatile$default (Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource$Builder;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/VectorSource$Companion {\n\tpublic final fun getDefaultMaxzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultMinimumTileUpdateInterval ()Ljava/lang/Double;\n\tpublic final fun getDefaultMinzoom ()Ljava/lang/Long;\n\tpublic final fun getDefaultPrefetchZoomDelta ()Ljava/lang/Long;\n\tpublic final fun getDefaultScheme ()Lcom/mapbox/maps/extension/style/sources/generated/Scheme;\n\tpublic final fun getDefaultTileNetworkRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getDefaultTileRequestsDelay ()Ljava/lang/Double;\n\tpublic final fun getDefaultVolatile ()Ljava/lang/Boolean;\n}\n\npublic final class com/mapbox/maps/extension/style/sources/generated/VectorSourceKt {\n\tpublic static final fun vectorSource (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/sources/generated/VectorSource;\n}\n\npublic final class com/mapbox/maps/extension/style/terrain/generated/Terrain : com/mapbox/maps/extension/style/StyleContract$StyleTerrainExtension, com/mapbox/maps/extension/style/terrain/generated/TerrainDslReceiver {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/terrain/generated/Terrain$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic fun exaggeration (D)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic fun exaggeration (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic fun exaggerationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic fun exaggerationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic final fun getExaggeration ()Ljava/lang/Double;\n\tpublic final fun getExaggerationAsExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getExaggerationTransition ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n}\n\npublic final class com/mapbox/maps/extension/style/terrain/generated/Terrain$Companion {\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/terrain/generated/TerrainDslReceiver {\n\tpublic abstract fun exaggeration (D)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic abstract fun exaggeration (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic abstract fun exaggerationTransition (Lcom/mapbox/maps/extension/style/types/StyleTransition;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic abstract fun exaggerationTransition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n}\n\npublic final class com/mapbox/maps/extension/style/terrain/generated/TerrainDslReceiver$DefaultImpls {\n\tpublic static synthetic fun exaggeration$default (Lcom/mapbox/maps/extension/style/terrain/generated/TerrainDslReceiver;DILjava/lang/Object;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n}\n\npublic final class com/mapbox/maps/extension/style/terrain/generated/TerrainKt {\n\tpublic static final fun terrain (Ljava/lang/String;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic static final fun terrain (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic static synthetic fun terrain$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n}\n\npublic final class com/mapbox/maps/extension/style/terrain/generated/TerrainUtils {\n\tpublic static final fun getTerrain (Lcom/mapbox/maps/MapboxStyleManager;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/terrain/generated/Terrain;\n\tpublic static final fun removeTerrain (Lcom/mapbox/maps/MapboxStyleManager;)V\n\tpublic static final fun setTerrain (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/extension/style/StyleContract$StyleTerrainExtension;)V\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/style/types/AtmosphereDsl : java/lang/annotation/Annotation {\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/style/types/ExpressionDsl : java/lang/annotation/Annotation {\n}\n\npublic final class com/mapbox/maps/extension/style/types/Formatted : java/util/ArrayList {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/types/Formatted$Companion;\n\tpublic fun <init> ()V\n\tpublic fun contains (Lcom/mapbox/maps/extension/style/types/FormattedSection;)Z\n\tpublic final fun contains (Ljava/lang/Object;)Z\n\tpublic final fun formattedSection (Lcom/mapbox/maps/extension/style/types/FormattedSection;)V\n\tpublic final fun formattedSection (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V\n\tpublic fun getSize ()I\n\tpublic final fun getTextAsString ()Ljava/lang/String;\n\tpublic fun indexOf (Lcom/mapbox/maps/extension/style/types/FormattedSection;)I\n\tpublic final fun indexOf (Ljava/lang/Object;)I\n\tpublic fun lastIndexOf (Lcom/mapbox/maps/extension/style/types/FormattedSection;)I\n\tpublic final fun lastIndexOf (Ljava/lang/Object;)I\n\tpublic final fun remove (I)Lcom/mapbox/maps/extension/style/types/FormattedSection;\n\tpublic fun remove (Lcom/mapbox/maps/extension/style/types/FormattedSection;)Z\n\tpublic final fun remove (Ljava/lang/Object;)Z\n\tpublic fun removeAt (I)Lcom/mapbox/maps/extension/style/types/FormattedSection;\n\tpublic final fun size ()I\n\tpublic final fun toValue ()Lcom/mapbox/bindgen/Value;\n}\n\npublic final class com/mapbox/maps/extension/style/types/Formatted$Companion {\n\tpublic final fun fromExpression (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Lcom/mapbox/maps/extension/style/types/Formatted;\n\tpublic final fun fromProperty (Ljava/util/ArrayList;)Lcom/mapbox/maps/extension/style/types/Formatted;\n}\n\npublic final class com/mapbox/maps/extension/style/types/FormattedKt {\n\tpublic static final fun formatted (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/types/Formatted;\n}\n\npublic final class com/mapbox/maps/extension/style/types/FormattedSection {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Double;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Double;Ljava/util/List;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Double;Ljava/util/List;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/Double;Ljava/util/List;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/Double;\n\tpublic final fun component3 ()Ljava/util/List;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/Double;Ljava/util/List;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/types/FormattedSection;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/style/types/FormattedSection;Ljava/lang/String;Ljava/lang/Double;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/types/FormattedSection;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getFontScale ()Ljava/lang/Double;\n\tpublic final fun getFontStack ()Ljava/util/List;\n\tpublic final fun getText ()Ljava/lang/String;\n\tpublic final fun getTextColor ()Ljava/lang/String;\n\tpublic final fun getTextColorAsInt ()I\n\tpublic fun hashCode ()I\n\tpublic final fun setFontScale (Ljava/lang/Double;)V\n\tpublic final fun setFontStack (Ljava/util/List;)V\n\tpublic final fun setTextColor (Ljava/lang/String;)V\n\tpublic final fun setTextColorAsInt (I)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/style/types/LayersDsl : java/lang/annotation/Annotation {\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/style/types/LightDsl : java/lang/annotation/Annotation {\n}\n\npublic final class com/mapbox/maps/extension/style/types/PromoteId {\n\tpublic static final field Companion Lcom/mapbox/maps/extension/style/types/PromoteId$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/extension/style/types/PromoteId;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/style/types/PromoteId;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/style/types/PromoteId;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getExpression ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getPropertyName ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/style/types/PromoteId$Companion {\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/style/types/RainDsl : java/lang/annotation/Annotation {\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/style/types/SnowDsl : java/lang/annotation/Annotation {\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/style/types/SourceDsl : java/lang/annotation/Annotation {\n}\n\npublic final class com/mapbox/maps/extension/style/types/StyleTransition {\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/extension/style/types/StyleTransition$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDelay ()Ljava/lang/Long;\n\tpublic final fun getDuration ()Ljava/lang/Long;\n\tpublic fun hashCode ()I\n\tpublic final fun toValue ()Lcom/mapbox/bindgen/Value;\n}\n\npublic final class com/mapbox/maps/extension/style/types/StyleTransition$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic final fun delay (J)Lcom/mapbox/maps/extension/style/types/StyleTransition$Builder;\n\tpublic final fun duration (J)Lcom/mapbox/maps/extension/style/types/StyleTransition$Builder;\n\tpublic final fun getDelay ()Ljava/lang/Long;\n\tpublic final fun getDuration ()Ljava/lang/Long;\n}\n\npublic final class com/mapbox/maps/extension/style/types/StyleTransitionKt {\n\tpublic static final fun transitionOptions (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/extension/style/types/StyleTransition;\n}\n\npublic abstract interface annotation class com/mapbox/maps/extension/style/types/TerrainDsl : java/lang/annotation/Annotation {\n}\n\npublic final class com/mapbox/maps/extension/style/utils/ColorUtils {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/extension/style/utils/ColorUtils;\n\tpublic final fun colorIntToRgbaExpression (I)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun colorToGlRgbaArray (I)[F\n\tpublic final fun colorToRgbaArray (I)[F\n\tpublic final fun colorToRgbaString (I)Ljava/lang/String;\n\tpublic final fun rgbaExpressionToColorInt (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Ljava/lang/Integer;\n\tpublic final fun rgbaExpressionToColorString (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)Ljava/lang/String;\n\tpublic final fun rgbaToColor (Ljava/lang/String;)Ljava/lang/Integer;\n}\n\npublic final class com/mapbox/maps/extension/style/utils/TypeUtils {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/extension/style/utils/TypeUtils;\n\tpublic final fun wrapToValue (Ljava/lang/Object;)Lcom/mapbox/bindgen/Value;\n}\n\npublic final class com/mapbox/maps/extension/style/utils/TypeUtilsKt {\n\tpublic static final fun toValue (Lcom/mapbox/geojson/Feature;)Lcom/mapbox/bindgen/Value;\n\tpublic static final fun toValue (Lcom/mapbox/geojson/FeatureCollection;)Lcom/mapbox/bindgen/Value;\n\tpublic static final fun toValue (Lcom/mapbox/geojson/Geometry;)Lcom/mapbox/bindgen/Value;\n\tpublic static final fun transition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/TransitionOptions;\n\tpublic static final fun unwrap (Lcom/mapbox/maps/StylePropertyValue;Ljava/lang/Class;)Ljava/lang/Object;\n\tpublic static final fun unwrapToAny (Lcom/mapbox/bindgen/Value;)Ljava/lang/Object;\n\tpublic static final fun unwrapToExpression (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic static final fun unwrapToStyleTransition (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/extension/style/types/StyleTransition;\n\tpublic static final fun unwrapToTyped (Lcom/mapbox/bindgen/Value;Ljava/lang/Class;)Ljava/lang/Object;\n}\n\n"
  },
  {
    "path": "extension-style/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n  namespace = \"com.mapbox.maps.extension.style\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.extension\"\n    artifactId = \"maps-style\"\n    artifactTitle = \"The style extension for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-style\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.mapbox.geoJSON)\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n  lintPublish(project(\":extension-style-lint-rules\"))\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/StyleExtensionImpl.kt",
    "content": "package com.mapbox.maps.extension.style\n\nimport android.opengl.GLES20\nimport com.mapbox.maps.ColorTheme\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.extension.style.StyleExtensionImpl.Builder\nimport com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere\nimport com.mapbox.maps.extension.style.image.ImageExtensionImpl\nimport com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.light.DynamicLight\nimport com.mapbox.maps.extension.style.light.generated.AmbientLight\nimport com.mapbox.maps.extension.style.light.generated.DirectionalLight\nimport com.mapbox.maps.extension.style.light.generated.FlatLight\nimport com.mapbox.maps.extension.style.model.ModelExtensionImpl\nimport com.mapbox.maps.extension.style.precipitations.generated.Rain\nimport com.mapbox.maps.extension.style.precipitations.generated.Snow\nimport com.mapbox.maps.extension.style.projection.generated.Projection\nimport com.mapbox.maps.extension.style.sources.Source\nimport com.mapbox.maps.extension.style.terrain.generated.Terrain\nimport com.mapbox.maps.extension.style.utils.StyleTelemetryEvents\n\n/**\n * The concrete implementation of style extension.\n */\nclass StyleExtensionImpl private constructor(\n  builder: Builder\n) : StyleContract.StyleExtension {\n\n  /**\n   * Style represented as JSON or URI.\n   */\n  override val style: String = builder.style\n\n  /**\n   * The sources of the style.\n   */\n  override val sources: List<Source> = builder.sources.toList()\n\n  /**\n   * The images of the style.\n   */\n  override val images: List<StyleContract.StyleImageExtension> = builder.images.toList()\n\n  /**\n   * The models of the style.\n   */\n  @OptIn(MapboxExperimental::class)\n  override val models: List<StyleContract.StyleModelExtension> = builder.models.toList()\n\n  /**\n   * The layers of the style.\n   */\n  override val layers: List<Pair<Layer, LayerPosition>> = builder.layers.toList()\n\n  /**\n   * The flat light of the style.\n   */\n  override val flatLight: StyleContract.StyleLightExtension? = builder.flatLight\n\n  /**\n   * The dynamic light which is built with [AmbientLight] and [DirectionalLight].\n   */\n  override val dynamicLight: StyleContract.StyleLightExtension? = builder.dynamicLight\n\n  /**\n   * The terrain of the style.\n   */\n  override val terrain: Terrain? = builder.terrain\n\n  /**\n   * The map projection of the style.\n   */\n  override val projection: Projection? = builder.projection\n\n  /**\n   * The atmosphere of the style.\n   */\n  override val atmosphere: Atmosphere? = builder.atmosphere\n\n  /**\n   * Transition options applied when loading the style.\n   */\n  override val transition: TransitionOptions? = builder.transition\n\n  /**\n   * The rain effect of the style.\n   */\n  @MapboxExperimental\n  override val rain: StyleContract.StyleRainExtension? = builder.rain\n\n  /**\n   * The snow effect of the style.\n   */\n  @MapboxExperimental\n  override val snow: StyleContract.StyleSnowExtension? = builder.snow\n\n  /**\n   * Color theme of the style.\n   */\n  @MapboxExperimental\n  override val colorTheme: ColorTheme? = builder.colorTheme\n\n  /**\n   * The builder for style extension.\n   */\n  class Builder(\n    /**\n     * Style represented as JSON or URI.\n     */\n    val style: String\n  ) {\n\n    internal val layers = mutableListOf<Pair<Layer, LayerPosition>>()\n    internal val sources = mutableListOf<Source>()\n    internal val images = mutableListOf<StyleContract.StyleImageExtension>()\n    @OptIn(MapboxExperimental::class)\n    internal val models = mutableListOf<StyleContract.StyleModelExtension>()\n    internal var flatLight: StyleContract.StyleLightExtension? = null\n    internal var dynamicLight: StyleContract.StyleLightExtension? = null\n    internal var terrain: Terrain? = null\n    internal var atmosphere: Atmosphere? = null\n    internal var projection: Projection? = null\n    internal var transition: TransitionOptions? = null\n    @OptIn(MapboxExperimental::class)\n    internal var snow: Snow? = null\n    @OptIn(MapboxExperimental::class)\n    internal var rain: Rain? = null\n    internal var colorTheme: ColorTheme? = null\n\n    /**\n     * Extension function for [Layer] to overload Unary operations.\n     *\n     * Apply +[Layer] will add the layer to the [StyleExtensionImpl].\n     */\n    @JvmName(\"addLayer\")\n    operator fun Layer.unaryPlus() {\n      layers.add(Pair(this, LayerPosition(null, null, null)))\n    }\n\n    /**\n     * Extension function for [Pair]<[Layer], [LayerPosition]> to overload Unary operations.\n     *\n     * Apply +[Pair]<[Layer], [LayerPosition]> will add the layer to the [StyleExtensionImpl] at given [LayerPosition].\n     */\n    @JvmName(\"addLayerAtPosition\")\n    operator fun Pair<Layer, LayerPosition>.unaryPlus() {\n      layers.add(this)\n    }\n\n    /**\n     * Extension function for [Source] to overload Unary operations.\n     *\n     * Apply +[Source] will add the source to the [StyleExtensionImpl].\n     */\n    @JvmName(\"addSource\")\n    operator fun Source.unaryPlus() {\n      sources.add(this)\n    }\n\n    /**\n     * Extension function for [FlatLight] to overload Unary operations.\n     *\n     * Apply +[FlatLight] will add the light to the [StyleExtensionImpl].\n     */\n    @JvmName(\"setLight\")\n    operator fun FlatLight.unaryPlus() {\n      flatLight = this\n    }\n\n    /**\n     * Extension function for [DynamicLight] to overload Unary operations.\n     *\n     * Apply +[DynamicLight] will add the light to the [StyleExtensionImpl].\n     */\n    @JvmName(\"setLight\")\n    operator fun DynamicLight.unaryPlus() {\n      dynamicLight = this\n    }\n\n    /**\n     * Extension function for [Terrain] to overload Unary operations.\n     *\n     * Apply +[Terrain] will add the terrain to the [StyleExtensionImpl].\n     */\n    @JvmName(\"setTerrain\")\n    operator fun Terrain.unaryPlus() {\n      terrain = this\n    }\n\n    /**\n     * Extension function for [Atmosphere] to overload Unary operations.\n     *\n     * Apply +[Atmosphere] will add the atmosphere to the [StyleExtensionImpl].\n     */\n    @JvmName(\"setAtmosphere\")\n    operator fun Atmosphere.unaryPlus() {\n      atmosphere = this\n    }\n\n    /**\n     * Extension function for [Projection] to overload Unary operations.\n     *\n     * Using [ProjectionName.GLOBE] requires OpenGL [GLES20.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS] be more than zero.\n     * If [GLES20.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS] is zero (which may happen for low-end devices and old Android versions) -\n     * [ProjectionName.GLOBE] will fallback to [ProjectionName.MERCATOR] with the log warning.\n     *\n     * Apply +[Projection] will add specific map projection to the [StyleExtensionImpl].\n     */\n    @JvmName(\"setProjection\")\n    operator fun Projection.unaryPlus() {\n      projection = this\n    }\n\n    /**\n     * Extension function to add [TransitionOptions] to be applied when loading the style.\n     */\n    @JvmName(\"setTransition\")\n    operator fun TransitionOptions.unaryPlus() {\n      transition = this\n    }\n\n    /**\n     * Extension function for [Snow] to overload Unary operations.\n     *\n     * Apply +[Snow] will add specific snow effect to the [StyleExtensionImpl].\n     */\n    @OptIn(MapboxExperimental::class)\n    @JvmName(\"setSnow\")\n    operator fun Snow.unaryPlus() {\n      snow = this\n    }\n\n    /**\n     * Extension function for [Rain] to overload Unary operations.\n     *\n     * Apply +[Rain] will add specific snow effect to the [StyleExtensionImpl].\n     */\n    @OptIn(MapboxExperimental::class)\n    @JvmName(\"setRain\")\n    operator fun Rain.unaryPlus() {\n      rain = this\n    }\n\n    /**\n     * Extension function for [ColorTheme] to overload Unary operations.\n     *\n     * Apply +[ColorTheme] will apply specific theme to the [StyleExtensionImpl].\n     */\n    @MapboxExperimental\n    @JvmName(\"setColorTheme\")\n    operator fun ColorTheme.unaryPlus() {\n      colorTheme = this\n    }\n\n    /**\n     * Extension function for [ImageExtensionImpl] to overload Unary operations.\n     *\n     * Apply +[ImageExtensionImpl] will add the source to the [StyleExtensionImpl].\n     */\n    @JvmName(\"addImage\")\n    operator fun ImageExtensionImpl.unaryPlus() {\n      images.add(this)\n    }\n\n    /**\n     * Extension function for [ModelExtensionImpl] to overload Unary operations.\n     *\n     * Apply +[ModelExtensionImpl] will add the source to the [StyleExtensionImpl].\n     */\n    @MapboxExperimental\n    @JvmName(\"addModel\")\n    operator fun ModelExtensionImpl.unaryPlus() {\n      models.add(this)\n    }\n\n    /**\n     * Extension function for [ImageNinePatchExtensionImpl] to overload Unary operations.\n     *\n     * Apply +[ImageNinePatchExtensionImpl] will add the source to the [StyleExtensionImpl].\n     */\n    @JvmName(\"addImage9Patch\")\n    operator fun ImageNinePatchExtensionImpl.unaryPlus() {\n      images.add(this)\n    }\n\n    /**\n     * Convenient function to combine [Layer] and [LayerPosition] into [Pair]<[Layer], [LayerPosition]>.\n     *\n     * @param layer the layer to add\n     * @param above the layer id to be added above to\n     * @param below the layer id to be added below to\n     * @param at the index to be added at\n     *\n     * @return [Pair]<[Layer], [LayerPosition]>\n     */\n    @JvmOverloads\n    fun layerAtPosition(\n      layer: Layer,\n      above: String? = null,\n      below: String? = null,\n      at: Int? = null\n    ): Pair<Layer, LayerPosition> {\n      return Pair(layer, LayerPosition(above, below, at))\n    }\n\n    /**\n     * Build an [StyleContract.StyleExtension] instance from this builder.\n     *\n     * @return an [StyleContract.StyleExtension] instance.\n     */\n    fun build(): StyleContract.StyleExtension {\n      StyleTelemetryEvents.dsl.increment()\n      return StyleExtensionImpl(this)\n    }\n  }\n}\n\n/**\n * DSL function to construct a style extension from URI or JSON.\n */\nfun style(style: String = \"\", block: Builder.() -> Unit): StyleContract.StyleExtension =\n  Builder(style).apply(block).build()"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/atmosphere/generated/Atmosphere.kt",
    "content": "// This file is generated.\npackage com.mapbox.maps.extension.style.atmosphere.generated\n\nimport android.util.Log\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.types.AtmosphereDsl\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.unwrap\n\n/**\n * A global effect that fades layers and markers based on their distance to the camera. The fog can be used to approximate the effect of atmosphere on distant objects and enhance the depth perception of the map when used with terrain or 3D features. Note: fog is renamed to atmosphere in the Android and iOS SDKs and planned to be changed in GL-JS v.3.0.0.\n *\n * @see [The online documentation](https://docs.mapbox.com/mapbox-gl-js/style-spec/fog/)\n */\n@UiThread\nclass Atmosphere : AtmosphereDslReceiver, StyleContract.StyleAtmosphereExtension {\n  internal var delegate: MapboxStyleManager? = null\n  private val properties = HashMap<String, PropertyValue<*>>()\n\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n   */\n  val colorAsColorInt: Int?\n    /**\n     * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n     *\n     * @return color as int\n     */\n    @ColorInt\n    get() {\n      colorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  override fun color(@ColorInt color: Int): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"color\", colorIntToRgbaExpression(color))\n    setProperty(propertyValue)\n  }\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n   */\n  val color: String?\n    /**\n     * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n     *\n     * @return color as String\n     */\n    get() {\n      colorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  override fun color(color: String): Atmosphere = apply {\n    setProperty(PropertyValue(\"color\", color))\n  }\n\n  /**\n   * Color property transition options.\n   */\n  val colorTransition: StyleTransition?\n    /**\n     * Get the Color property transition options.\n     *\n     * @return transition options for color\n     */\n    get() {\n      return getTransitionProperty(\"color-transition\")\n    }\n\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  override fun colorTransition(options: StyleTransition): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [colorTransition].\n   */\n  override fun colorTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere = apply {\n    colorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"color\".\n   */\n  val colorAsExpression: Expression?\n    /**\n     * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n     *\n     * Get the color property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  override fun color(color: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"color\", color)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [color].\n   */\n  @MapboxExperimental\n  val colorUseTheme: String?\n    /**\n     * Get the ColorUseTheme property\n     *\n     * @return current ColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"color-use-theme\")\n    }\n\n  /**\n   * Set the ColorUseTheme as String\n   *\n   * @param colorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: String): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"color-use-theme\", colorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [color].\n   */\n  @MapboxExperimental\n  val colorUseThemeAsExpression: Expression?\n    /**\n     * Get the ColorUseTheme property\n     *\n     * @return current ColorUseTheme property as Expression.\n     */\n    get() {\n      getPropertyValue<Expression>(\"color-use-theme\")?.let {\n        return it\n      }\n      colorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n\n  /**\n   * Set the ColorUseTheme as Expression\n   *\n   * @param colorUseThemeExpression theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"color-use-theme\", colorUseTheme)\n    setProperty(propertyValue)\n  }\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n   */\n  val highColorAsColorInt: Int?\n    /**\n     * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n     *\n     * @return highColor as int\n     */\n    @ColorInt\n    get() {\n      highColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n   *\n   * @param highColor as int\n   */\n  override fun highColor(@ColorInt highColor: Int): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"high-color\", colorIntToRgbaExpression(highColor))\n    setProperty(propertyValue)\n  }\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n   */\n  val highColor: String?\n    /**\n     * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n     *\n     * @return high-color as String\n     */\n    get() {\n      highColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n   *\n   * @param highColor as String\n   */\n  override fun highColor(highColor: String): Atmosphere = apply {\n    setProperty(PropertyValue(\"high-color\", highColor))\n  }\n\n  /**\n   * HighColor property transition options.\n   */\n  val highColorTransition: StyleTransition?\n    /**\n     * Get the HighColor property transition options.\n     *\n     * @return transition options for high-color\n     */\n    get() {\n      return getTransitionProperty(\"high-color-transition\")\n    }\n\n  /**\n   * Set the HighColor property transition options.\n   *\n   * @param options transition options for high-color\n   */\n  override fun highColorTransition(options: StyleTransition): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"high-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [highColorTransition].\n   */\n  override fun highColorTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere = apply {\n    highColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n   *\n   * This is an Expression representation of \"high-color\".\n   */\n  val highColorAsExpression: Expression?\n    /**\n     * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n     *\n     * Get the highColor property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"high-color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n   *\n   * @param highColor value of highColor as Expression\n   */\n  override fun highColor(highColor: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"high-color\", highColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [highColor].\n   */\n  @MapboxExperimental\n  val highColorUseTheme: String?\n    /**\n     * Get the HighColorUseTheme property\n     *\n     * @return current HighColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"high-color-use-theme\")\n    }\n\n  /**\n   * Set the HighColorUseTheme as String\n   *\n   * @param highColorUseTheme theme value for highColor. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun highColorUseTheme(highColorUseTheme: String): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"high-color-use-theme\", highColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [highColor].\n   */\n  @MapboxExperimental\n  val highColorUseThemeAsExpression: Expression?\n    /**\n     * Get the HighColorUseTheme property\n     *\n     * @return current HighColorUseTheme property as Expression.\n     */\n    get() {\n      getPropertyValue<Expression>(\"high-color-use-theme\")?.let {\n        return it\n      }\n      highColorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n\n  /**\n   * Set the HighColorUseTheme as Expression\n   *\n   * @param highColorUseThemeExpression theme value for highColor. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun highColorUseTheme(highColorUseTheme: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"high-color-use-theme\", highColorUseTheme)\n    setProperty(propertyValue)\n  }\n  /**\n   * Horizon blend applies a smooth fade from the color of the atmosphere to the color of space. A value of zero leaves a sharp transition from atmosphere to space. Increasing the value blends the color of atmosphere into increasingly high angles of the sky. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n   */\n  val horizonBlend: Double?\n    /**\n     * Horizon blend applies a smooth fade from the color of the atmosphere to the color of space. A value of zero leaves a sharp transition from atmosphere to space. Increasing the value blends the color of atmosphere into increasingly high angles of the sky. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n     *\n     * @return horizon-blend as Double\n     */\n    get() {\n      return getPropertyValue(\"horizon-blend\")\n    }\n\n  /**\n   * Horizon blend applies a smooth fade from the color of the atmosphere to the color of space. A value of zero leaves a sharp transition from atmosphere to space. Increasing the value blends the color of atmosphere into increasingly high angles of the sky. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n   *\n   * @param horizonBlend as Double\n   */\n  override fun horizonBlend(horizonBlend: Double): Atmosphere = apply {\n    setProperty(PropertyValue(\"horizon-blend\", horizonBlend))\n  }\n\n  /**\n   * HorizonBlend property transition options.\n   */\n  val horizonBlendTransition: StyleTransition?\n    /**\n     * Get the HorizonBlend property transition options.\n     *\n     * @return transition options for horizon-blend\n     */\n    get() {\n      return getTransitionProperty(\"horizon-blend-transition\")\n    }\n\n  /**\n   * Set the HorizonBlend property transition options.\n   *\n   * @param options transition options for horizon-blend\n   */\n  override fun horizonBlendTransition(options: StyleTransition): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"horizon-blend-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [horizonBlendTransition].\n   */\n  override fun horizonBlendTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere = apply {\n    horizonBlendTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Horizon blend applies a smooth fade from the color of the atmosphere to the color of space. A value of zero leaves a sharp transition from atmosphere to space. Increasing the value blends the color of atmosphere into increasingly high angles of the sky. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n   *\n   * This is an Expression representation of \"horizon-blend\".\n   */\n  val horizonBlendAsExpression: Expression?\n    /**\n     * Horizon blend applies a smooth fade from the color of the atmosphere to the color of space. A value of zero leaves a sharp transition from atmosphere to space. Increasing the value blends the color of atmosphere into increasingly high angles of the sky. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n     *\n     * Get the horizonBlend property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"horizon-blend\")?.let {\n        return it\n      }\n      horizonBlend?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Horizon blend applies a smooth fade from the color of the atmosphere to the color of space. A value of zero leaves a sharp transition from atmosphere to space. Increasing the value blends the color of atmosphere into increasingly high angles of the sky. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n   *\n   * @param horizonBlend value of horizonBlend as Expression\n   */\n  override fun horizonBlend(horizonBlend: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"horizon-blend\", horizonBlend)\n    setProperty(propertyValue)\n  }\n  /**\n   * The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away. Default value: [0.5,10]. Value range: [-20, 20]\n   */\n  val range: List<Double>?\n    /**\n     * The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away. Default value: [0.5,10]. Value range: [-20, 20]\n     *\n     * @return range as List<Double>\n     */\n    get() {\n      return getPropertyValue(\"range\")\n    }\n\n  /**\n   * The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away. Default value: [0.5,10]. Value range: [-20, 20]\n   *\n   * @param range as List<Double>\n   */\n  override fun range(range: List<Double>): Atmosphere = apply {\n    setProperty(PropertyValue(\"range\", range))\n  }\n\n  /**\n   * Range property transition options.\n   */\n  val rangeTransition: StyleTransition?\n    /**\n     * Get the Range property transition options.\n     *\n     * @return transition options for range\n     */\n    get() {\n      return getTransitionProperty(\"range-transition\")\n    }\n\n  /**\n   * Set the Range property transition options.\n   *\n   * @param options transition options for range\n   */\n  override fun rangeTransition(options: StyleTransition): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"range-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rangeTransition].\n   */\n  override fun rangeTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere = apply {\n    rangeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away. Default value: [0.5,10]. Value range: [-20, 20]\n   *\n   * This is an Expression representation of \"range\".\n   */\n  val rangeAsExpression: Expression?\n    /**\n     * The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away. Default value: [0.5,10]. Value range: [-20, 20]\n     *\n     * Get the range property as an Expression\n     *\n     * @return List<Double>\n     */\n    get() {\n      getPropertyValue<Expression>(\"range\")?.let {\n        return it\n      }\n      range?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away. Default value: [0.5,10]. Value range: [-20, 20]\n   *\n   * @param range value of range as Expression\n   */\n  override fun range(range: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"range\", range)\n    setProperty(propertyValue)\n  }\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   */\n  val spaceColorAsColorInt: Int?\n    /**\n     * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n     *\n     * @return spaceColor as int\n     */\n    @ColorInt\n    get() {\n      spaceColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   *\n   * @param spaceColor as int\n   */\n  override fun spaceColor(@ColorInt spaceColor: Int): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"space-color\", colorIntToRgbaExpression(spaceColor))\n    setProperty(propertyValue)\n  }\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   */\n  val spaceColor: String?\n    /**\n     * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n     *\n     * @return space-color as String\n     */\n    get() {\n      spaceColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   *\n   * @param spaceColor as String\n   */\n  override fun spaceColor(spaceColor: String): Atmosphere = apply {\n    setProperty(PropertyValue(\"space-color\", spaceColor))\n  }\n\n  /**\n   * SpaceColor property transition options.\n   */\n  val spaceColorTransition: StyleTransition?\n    /**\n     * Get the SpaceColor property transition options.\n     *\n     * @return transition options for space-color\n     */\n    get() {\n      return getTransitionProperty(\"space-color-transition\")\n    }\n\n  /**\n   * Set the SpaceColor property transition options.\n   *\n   * @param options transition options for space-color\n   */\n  override fun spaceColorTransition(options: StyleTransition): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"space-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [spaceColorTransition].\n   */\n  override fun spaceColorTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere = apply {\n    spaceColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   *\n   * This is an Expression representation of \"space-color\".\n   */\n  val spaceColorAsExpression: Expression?\n    /**\n     * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n     *\n     * Get the spaceColor property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"space-color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   *\n   * @param spaceColor value of spaceColor as Expression\n   */\n  override fun spaceColor(spaceColor: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"space-color\", spaceColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [spaceColor].\n   */\n  @MapboxExperimental\n  val spaceColorUseTheme: String?\n    /**\n     * Get the SpaceColorUseTheme property\n     *\n     * @return current SpaceColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"space-color-use-theme\")\n    }\n\n  /**\n   * Set the SpaceColorUseTheme as String\n   *\n   * @param spaceColorUseTheme theme value for spaceColor. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun spaceColorUseTheme(spaceColorUseTheme: String): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"space-color-use-theme\", spaceColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [spaceColor].\n   */\n  @MapboxExperimental\n  val spaceColorUseThemeAsExpression: Expression?\n    /**\n     * Get the SpaceColorUseTheme property\n     *\n     * @return current SpaceColorUseTheme property as Expression.\n     */\n    get() {\n      getPropertyValue<Expression>(\"space-color-use-theme\")?.let {\n        return it\n      }\n      spaceColorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n\n  /**\n   * Set the SpaceColorUseTheme as Expression\n   *\n   * @param spaceColorUseThemeExpression theme value for spaceColor. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun spaceColorUseTheme(spaceColorUseTheme: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"space-color-use-theme\", spaceColorUseTheme)\n    setProperty(propertyValue)\n  }\n  /**\n   * A value controlling the star intensity where `0` will show no stars and `1` will show stars at their maximum intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n   */\n  val starIntensity: Double?\n    /**\n     * A value controlling the star intensity where `0` will show no stars and `1` will show stars at their maximum intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n     *\n     * @return star-intensity as Double\n     */\n    get() {\n      return getPropertyValue(\"star-intensity\")\n    }\n\n  /**\n   * A value controlling the star intensity where `0` will show no stars and `1` will show stars at their maximum intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n   *\n   * @param starIntensity as Double\n   */\n  override fun starIntensity(starIntensity: Double): Atmosphere = apply {\n    setProperty(PropertyValue(\"star-intensity\", starIntensity))\n  }\n\n  /**\n   * StarIntensity property transition options.\n   */\n  val starIntensityTransition: StyleTransition?\n    /**\n     * Get the StarIntensity property transition options.\n     *\n     * @return transition options for star-intensity\n     */\n    get() {\n      return getTransitionProperty(\"star-intensity-transition\")\n    }\n\n  /**\n   * Set the StarIntensity property transition options.\n   *\n   * @param options transition options for star-intensity\n   */\n  override fun starIntensityTransition(options: StyleTransition): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"star-intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [starIntensityTransition].\n   */\n  override fun starIntensityTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere = apply {\n    starIntensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * A value controlling the star intensity where `0` will show no stars and `1` will show stars at their maximum intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n   *\n   * This is an Expression representation of \"star-intensity\".\n   */\n  val starIntensityAsExpression: Expression?\n    /**\n     * A value controlling the star intensity where `0` will show no stars and `1` will show stars at their maximum intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n     *\n     * Get the starIntensity property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"star-intensity\")?.let {\n        return it\n      }\n      starIntensity?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * A value controlling the star intensity where `0` will show no stars and `1` will show stars at their maximum intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n   *\n   * @param starIntensity value of starIntensity as Expression\n   */\n  override fun starIntensity(starIntensity: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"star-intensity\", starIntensity)\n    setProperty(propertyValue)\n  }\n  /**\n   * An array of two number values, specifying the vertical range, measured in meters, over which the fog should gradually fade out. When both parameters are set to zero, the fog will be rendered without any vertical constraints. Default value: [0,0]. Minimum value: 0.\n   */\n  val verticalRange: List<Double>?\n    /**\n     * An array of two number values, specifying the vertical range, measured in meters, over which the fog should gradually fade out. When both parameters are set to zero, the fog will be rendered without any vertical constraints. Default value: [0,0]. Minimum value: 0.\n     *\n     * @return vertical-range as List<Double>\n     */\n    get() {\n      return getPropertyValue(\"vertical-range\")\n    }\n\n  /**\n   * An array of two number values, specifying the vertical range, measured in meters, over which the fog should gradually fade out. When both parameters are set to zero, the fog will be rendered without any vertical constraints. Default value: [0,0]. Minimum value: 0.\n   *\n   * @param verticalRange as List<Double>\n   */\n  override fun verticalRange(verticalRange: List<Double>): Atmosphere = apply {\n    setProperty(PropertyValue(\"vertical-range\", verticalRange))\n  }\n\n  /**\n   * VerticalRange property transition options.\n   */\n  val verticalRangeTransition: StyleTransition?\n    /**\n     * Get the VerticalRange property transition options.\n     *\n     * @return transition options for vertical-range\n     */\n    get() {\n      return getTransitionProperty(\"vertical-range-transition\")\n    }\n\n  /**\n   * Set the VerticalRange property transition options.\n   *\n   * @param options transition options for vertical-range\n   */\n  override fun verticalRangeTransition(options: StyleTransition): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"vertical-range-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [verticalRangeTransition].\n   */\n  override fun verticalRangeTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere = apply {\n    verticalRangeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * An array of two number values, specifying the vertical range, measured in meters, over which the fog should gradually fade out. When both parameters are set to zero, the fog will be rendered without any vertical constraints. Default value: [0,0]. Minimum value: 0.\n   *\n   * This is an Expression representation of \"vertical-range\".\n   */\n  val verticalRangeAsExpression: Expression?\n    /**\n     * An array of two number values, specifying the vertical range, measured in meters, over which the fog should gradually fade out. When both parameters are set to zero, the fog will be rendered without any vertical constraints. Default value: [0,0]. Minimum value: 0.\n     *\n     * Get the verticalRange property as an Expression\n     *\n     * @return List<Double>\n     */\n    get() {\n      getPropertyValue<Expression>(\"vertical-range\")?.let {\n        return it\n      }\n      verticalRange?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * An array of two number values, specifying the vertical range, measured in meters, over which the fog should gradually fade out. When both parameters are set to zero, the fog will be rendered without any vertical constraints. Default value: [0,0]. Minimum value: 0.\n   *\n   * @param verticalRange value of verticalRange as Expression\n   */\n  override fun verticalRange(verticalRange: Expression): Atmosphere = apply {\n    val propertyValue = PropertyValue(\"vertical-range\", verticalRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Bind atmosphere to the map controller.\n   *\n   * @param delegate The map controller\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    this.delegate = delegate\n    val atmosphereParams = HashMap<String, Value>()\n\n    properties.forEach {\n      atmosphereParams[it.key] = it.value.value\n    }\n    val expected = delegate.setStyleAtmosphere(Value(atmosphereParams))\n    expected.error?.let {\n      throw MapboxStyleException(\"Set atmosphere failed: $it\")\n    }\n  }\n\n  private fun setProperty(property: PropertyValue<*>) {\n    properties[property.propertyName] = property\n    updateProperty(property)\n  }\n\n  private fun updateProperty(propertyValue: PropertyValue<*>) {\n    val expected = delegate?.setStyleAtmosphereProperty(\n      propertyValue.propertyName,\n      propertyValue.value\n    )\n    expected?.error?.let {\n      throw MapboxStyleException(\"Set atmosphere property failed: $it\")\n    }\n  }\n\n  private inline fun <reified T> getPropertyValue(propertyName: String): T? {\n      return getPropertyValue(propertyName, T::class.java)\n  }\n\n  private fun <T> getPropertyValue(propertyName: String, clazz: Class<T>): T? {\n    delegate?.let {\n      return try {\n        it.getStyleAtmosphereProperty(propertyName).unwrap(clazz)\n      } catch (e: RuntimeException) {\n        Log.e(TAG, \"Get atmosphere property failed: ${e.message}\")\n        Log.e(TAG, it.getStyleAtmosphereProperty(propertyName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $propertyName failed: atmosphere is not added to style yet.\")\n  }\n\n  private fun getTransitionProperty(transitionName: String): StyleTransition? {\n    delegate?.let {\n      return try {\n        @Suppress(\"UNCHECKED_CAST\")\n        val styleLayerProperty =\n          it.getStyleAtmosphereProperty(transitionName).value.contents as HashMap<String, Value>\n        val duration = styleLayerProperty[\"duration\"]?.contents as Long\n        val delay = styleLayerProperty[\"delay\"]?.contents as Long\n        StyleTransition.Builder().delay(delay).duration(duration).build()\n      } catch (e: RuntimeException) {\n        Log.e(TAG, \"Get atmosphere property failed: ${e.message}\")\n        Log.e(TAG, it.getStyleAtmosphereProperty(transitionName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $transitionName failed: atmosphere is not added to style yet.\")\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  private companion object {\n    private const val TAG = \"Mbgl-Atmosphere\"\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@AtmosphereDsl\ninterface AtmosphereDslReceiver {\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  fun color(@ColorInt color: Int): Atmosphere\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  fun color(color: String = \"#ffffff\"): Atmosphere\n\n  /**\n   * The color of the atmosphere region immediately below the horizon and within the `range` and above the horizon and within `horizon-blend`. Using opacity is recommended only for smoothly transitioning fog on/off as anything less than 100% opacity results in more tiles loaded and drawn. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  fun color(color: Expression): Atmosphere\n\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  fun colorTransition(options: StyleTransition): Atmosphere\n\n  /**\n   * DSL for [colorTransition].\n   */\n  fun colorTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere\n  /**\n   * Set the colorUseTheme as String for [color].\n   *\n   * @param colorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: String): Atmosphere\n\n  /**\n   * Set the colorUseTheme as Expression for [color].\n   *\n   * @param colorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: Expression): Atmosphere\n\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n   *\n   * @param highColor as int\n   */\n  fun highColor(@ColorInt highColor: Int): Atmosphere\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n   *\n   * @param highColor as String\n   */\n  fun highColor(highColor: String = \"#245cdf\"): Atmosphere\n\n  /**\n   * The color of the atmosphere region above the horizon, `high-color` extends further above the horizon than the `color` property and its spread can be controlled with `horizon-blend`. The opacity can be set to `0` to remove the high atmosphere color contribution. Default value: \"#245cdf\".\n   *\n   * @param highColor value of highColor as Expression\n   */\n  fun highColor(highColor: Expression): Atmosphere\n\n  /**\n   * Set the HighColor property transition options.\n   *\n   * @param options transition options for high-color\n   */\n  fun highColorTransition(options: StyleTransition): Atmosphere\n\n  /**\n   * DSL for [highColorTransition].\n   */\n  fun highColorTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere\n  /**\n   * Set the highColorUseTheme as String for [highColor].\n   *\n   * @param highColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun highColorUseTheme(highColorUseTheme: String): Atmosphere\n\n  /**\n   * Set the highColorUseTheme as Expression for [highColor].\n   *\n   * @param highColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun highColorUseTheme(highColorUseTheme: Expression): Atmosphere\n\n  /**\n   * Horizon blend applies a smooth fade from the color of the atmosphere to the color of space. A value of zero leaves a sharp transition from atmosphere to space. Increasing the value blends the color of atmosphere into increasingly high angles of the sky. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n   *\n   * @param horizonBlend as Double\n   */\n  fun horizonBlend(horizonBlend: Double): Atmosphere\n\n  /**\n   * Horizon blend applies a smooth fade from the color of the atmosphere to the color of space. A value of zero leaves a sharp transition from atmosphere to space. Increasing the value blends the color of atmosphere into increasingly high angles of the sky. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\". Value range: [0, 1]\n   *\n   * @param horizonBlend value of horizonBlend as Expression\n   */\n  fun horizonBlend(horizonBlend: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"zoom\"],4,0.2,7,0.1]\"\"\".trimIndent())): Atmosphere\n\n  /**\n   * Set the HorizonBlend property transition options.\n   *\n   * @param options transition options for horizon-blend\n   */\n  fun horizonBlendTransition(options: StyleTransition): Atmosphere\n\n  /**\n   * DSL for [horizonBlendTransition].\n   */\n  fun horizonBlendTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere\n  /**\n   * The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away. Default value: [0.5,10]. Value range: [-20, 20]\n   *\n   * @param range as List<Double>\n   */\n  fun range(range: List<Double> = listOf(0.5, 10.0)): Atmosphere\n\n  /**\n   * The start and end distance range in which fog fades from fully transparent to fully opaque. The distance to the point at the center of the map is defined as zero, so that negative range values are closer to the camera, and positive values are farther away. Default value: [0.5,10]. Value range: [-20, 20]\n   *\n   * @param range value of range as Expression\n   */\n  fun range(range: Expression): Atmosphere\n\n  /**\n   * Set the Range property transition options.\n   *\n   * @param options transition options for range\n   */\n  fun rangeTransition(options: StyleTransition): Atmosphere\n\n  /**\n   * DSL for [rangeTransition].\n   */\n  fun rangeTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   *\n   * @param spaceColor as int\n   */\n  fun spaceColor(@ColorInt spaceColor: Int): Atmosphere\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   *\n   * @param spaceColor as String\n   */\n  fun spaceColor(spaceColor: String): Atmosphere\n\n  /**\n   * The color of the region above the horizon and after the end of the `horizon-blend` contribution. The opacity can be set to `0` to have a transparent background. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\".\n   *\n   * @param spaceColor value of spaceColor as Expression\n   */\n  fun spaceColor(spaceColor: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"zoom\"],4,\"#010b19\",7,\"#367ab9\"]\"\"\".trimIndent())): Atmosphere\n\n  /**\n   * Set the SpaceColor property transition options.\n   *\n   * @param options transition options for space-color\n   */\n  fun spaceColorTransition(options: StyleTransition): Atmosphere\n\n  /**\n   * DSL for [spaceColorTransition].\n   */\n  fun spaceColorTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere\n  /**\n   * Set the spaceColorUseTheme as String for [spaceColor].\n   *\n   * @param spaceColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun spaceColorUseTheme(spaceColorUseTheme: String): Atmosphere\n\n  /**\n   * Set the spaceColorUseTheme as Expression for [spaceColor].\n   *\n   * @param spaceColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun spaceColorUseTheme(spaceColorUseTheme: Expression): Atmosphere\n\n  /**\n   * A value controlling the star intensity where `0` will show no stars and `1` will show stars at their maximum intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n   *\n   * @param starIntensity as Double\n   */\n  fun starIntensity(starIntensity: Double): Atmosphere\n\n  /**\n   * A value controlling the star intensity where `0` will show no stars and `1` will show stars at their maximum intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\". Value range: [0, 1]\n   *\n   * @param starIntensity value of starIntensity as Expression\n   */\n  fun starIntensity(starIntensity: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"zoom\"],5,0.35,6,0]\"\"\".trimIndent())): Atmosphere\n\n  /**\n   * Set the StarIntensity property transition options.\n   *\n   * @param options transition options for star-intensity\n   */\n  fun starIntensityTransition(options: StyleTransition): Atmosphere\n\n  /**\n   * DSL for [starIntensityTransition].\n   */\n  fun starIntensityTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere\n  /**\n   * An array of two number values, specifying the vertical range, measured in meters, over which the fog should gradually fade out. When both parameters are set to zero, the fog will be rendered without any vertical constraints. Default value: [0,0]. Minimum value: 0.\n   *\n   * @param verticalRange as List<Double>\n   */\n  fun verticalRange(verticalRange: List<Double> = listOf(0.0, 0.0)): Atmosphere\n\n  /**\n   * An array of two number values, specifying the vertical range, measured in meters, over which the fog should gradually fade out. When both parameters are set to zero, the fog will be rendered without any vertical constraints. Default value: [0,0]. Minimum value: 0.\n   *\n   * @param verticalRange value of verticalRange as Expression\n   */\n  fun verticalRange(verticalRange: Expression): Atmosphere\n\n  /**\n   * Set the VerticalRange property transition options.\n   *\n   * @param options transition options for vertical-range\n   */\n  fun verticalRangeTransition(options: StyleTransition): Atmosphere\n\n  /**\n   * DSL for [verticalRangeTransition].\n   */\n  fun verticalRangeTransition(block: StyleTransition.Builder.() -> Unit): Atmosphere\n}\n\n/**\n * DSL function for creating [Atmosphere] instance.\n */\nfun atmosphere(block: AtmosphereDslReceiver.() -> Unit): Atmosphere {\n  return Atmosphere().apply(block)\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/atmosphere/generated/AtmosphereExt.kt",
    "content": "// This file is generated.\n@file:JvmName(\"AtmosphereUtils\")\n\npackage com.mapbox.maps.extension.style.atmosphere.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\n\n/**\n * Extension function to get the atmosphere provided by the Style Extension.\n *\n * @return Atmosphere\n */\nfun MapboxStyleManager.getAtmosphere(): Atmosphere {\n  return Atmosphere().also { it.delegate = this }\n}\n\n/**\n * Extension function to set the Atmosphere provided by the Style Extension to the Style.\n *\n * @param atmosphere The atmosphere to be set\n */\nfun MapboxStyleManager.setAtmosphere(atmosphere: StyleContract.StyleAtmosphereExtension) {\n  atmosphere.bindTo(this)\n}\n\n/**\n * Removes atmosphere from style if it was set.\n */\nfun MapboxStyleManager.removeAtmosphere() {\n  setStyleAtmosphere(Value.nullValue())\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/color/ColorThemeExt.kt",
    "content": "package com.mapbox.maps.extension.style.color\n\nimport android.graphics.Bitmap\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.ColorTheme\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.toMapboxImage\n\n/**\n * DSL function for creating empty [ColorTheme] instance. It can be used when removing an applied theme from the style.\n **/\n@MapboxExperimental\nfun colorTheme(): ColorTheme = ColorTheme.valueOf(\n  StylePropertyValue(\n    Value.nullValue(), StylePropertyValueKind.UNDEFINED\n  )\n)\n\n/**\n * DSL function for creating [ColorTheme] instance.\n *\n * @param base64 Base64 representation of an LUT image.\n *  LUT image can be created by following [this](https://docs.mapbox.com/help/tutorials/create-a-custom-color-theme/) guide.\n *  To convert your LUT image to a Base64 string, you can use an online tool or a script.\n *  For example, you can use the following command in a terminal:\n *  ```sh\n *  base64 -i path/to/your/lut-image.png -o output.txt\n *  ```\n */\n@MapboxExperimental\nfun colorTheme(base64: String): ColorTheme = ColorTheme.valueOf(\n  StylePropertyValue(\n    Value.valueOf(base64), StylePropertyValueKind.CONSTANT\n  )\n)\n\n/**\n * DSL function for creating [ColorTheme] instance.\n * To create custom LUT, you can follow [this](https://docs.mapbox.com/help/tutorials/create-a-custom-color-theme/) guide.\n * @param image [Image] data of an LUT image.\n */\n@MapboxExperimental\nfun colorTheme(image: Image): ColorTheme = ColorTheme.valueOf(image)\n\n/**\n * DSL function for creating [ColorTheme] instance.\n * To create custom LUT, you can follow [this](https://docs.mapbox.com/help/tutorials/create-a-custom-color-theme/) guide.\n * @param bitmap bitmap representation of an LUT image.\n */\n@OptIn(MapboxDelicateApi::class)\n@MapboxExperimental\nfun colorTheme(bitmap: Bitmap): ColorTheme = ColorTheme.valueOf(bitmap.toMapboxImage())"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/expressions/dsl/generated/ExpressionDsl.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.expressions.dsl.generated\n\nimport androidx.annotation.ColorInt\nimport com.mapbox.geojson.GeoJson\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport java.util.HashMap\n\n// DSL functions for [Expression].\n\n/**\n * For two inputs, returns the result of subtracting the second input from the first. For a single input, returns the result of subtracting it from 0.\n */\nfun subtract(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.subtract(block)\n\n/**\n * Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.\n */\nfun not(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.not(block)\n\n/**\n * Returns `true` if the input values are not equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n */\nfun neq(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.neq(block)\n\n/**\n * Returns the product of the inputs.\n */\nfun product(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.product(block)\n\n/**\n * Returns the result of floating point division of the first input by the second.\n */\nfun division(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.division(block)\n\n/**\n * Returns the remainder after integer division of the first input by the second.\n */\nfun mod(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.mod(block)\n\n/**\n * Returns the result of raising the first input to the power specified by the second.\n */\nfun pow(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.pow(block)\n\n/**\n * Returns the sum of the inputs.\n */\nfun sum(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.sum(block)\n\n/**\n * Returns `true` if the first input is strictly less than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n */\nfun lt(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.lt(block)\n\n/**\n * Returns `true` if the first input is less than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n */\nfun lte(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.lte(block)\n\n/**\n * Returns `true` if the input values are equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n */\nfun eq(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.eq(block)\n\n/**\n * Returns `true` if the first input is strictly greater than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n */\nfun gt(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.gt(block)\n\n/**\n * Returns `true` if the first input is greater than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n */\nfun gte(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.gte(block)\n\n/**\n * Returns the absolute value of the input.\n */\nfun abs(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.abs(block)\n\n/**\n * Returns the value of a cluster property accumulated so far. Can only be used in the `clusterProperties` option of a clustered GeoJSON source.\n */\nfun accumulated(): Expression = Expression.accumulated()\n\n/**\n * Returns the arccosine of the input, in radians between −π/2 and π/2.\n */\nfun acos(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.acos(block)\n\n/**\n * Returns a string which matches one of the values specified in the text-anchor layout property, depending on the best-fit anchor for the symbol during rendering. Using this expression the content of the layer can be dynamically configured for the specific anchor type.\n */\n@MapboxExperimental\nfun activeAnchor(): Expression = Expression.activeAnchor()\n\n/**\n * Returns `true` if all the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `false`, the result is `false` and no further input expressions are evaluated.\n */\nfun all(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.all(block)\n\n/**\n * Returns `true` if any of the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `true`, the result is `true` and no further input expressions are evaluated.\n */\nfun any(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.any(block)\n\n/**\n * Asserts that the input is an array (optionally with a specific item type and length). If, when the input expression is evaluated, it is not of the asserted type, then this assertion will cause the whole expression to be aborted.\n */\nfun array(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.array(block)\n\n/**\n * Returns the arcsine of the input, in radians between −π/2 and π/2.\n */\nfun asin(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.asin(block)\n\n/**\n * Retrieves an item from an array.\n */\nfun at(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.at(block)\n\n/**\n * Retrieves an item from an array. If the array contains numeric values and the provided index is non-integer, the expression returns an interpolated value between adjacent items.\n */\nfun atInterpolated(block: Expression.InterpolatorBuilder.() -> Unit): Expression = Expression.atInterpolated(block)\n\n/**\n * Returns the arctangent of the input, in radians between −π/2 and π/2.\n */\nfun atan(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.atan(block)\n\n/**\n * Asserts that the input value is a boolean. If multiple values are provided, each one is evaluated in order until a boolean is obtained. If none of the inputs are booleans, the expression is an error.\n */\nfun boolean(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.boolean(block)\n\n/**\n * Selects the first output whose corresponding test condition evaluates to true, or the fallback value otherwise.\n */\nfun switchCase(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.switchCase(block)\n\n/**\n * Returns the smallest integer that is greater than or equal to the input.\n */\nfun ceil(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.ceil(block)\n\n/**\n * Evaluates each expression in turn until the first valid value is obtained. Invalid values are `null` and [`'image'`](#types-image) expressions that are unavailable in the style. If all values are invalid, `coalesce` returns the first value listed.\n */\nfun coalesce(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.coalesce(block)\n\n/**\n * Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none is provided, the default locale is used. If the requested locale is not available, the `collator` will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.\n */\nfun collator(block: Expression.CollatorBuilder.() -> Unit): Expression = Expression.collator(block)\n\n/**\n * Returns a `string` consisting of the concatenation of the inputs. Each input is converted to a string as if by `to-string`.\n */\nfun concat(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.concat(block)\n\n/**\n * Retrieves the configuration value for the given option. Returns null if the requested option is missing.\n */\nfun config(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.config(block)\n\n/**\n * Returns the cosine of the input, interpreted as radians.\n */\nfun cos(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.cos(block)\n/**\n * Returns the shortest distance in meters between the evaluated feature and the input geometry. The input value can be a valid GeoJSON of type `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Distance values returned may vary in precision due to loss in precision from encoding geometries, particularly below zoom level 13.\n */\nfun distance(geojson: GeoJson): Expression = Expression.distance(geojson)\n\n/**\n * Returns the distance of a `symbol` instance from the center of the map. The distance is measured in pixels divided by the height of the map container. It measures 0 at the center, decreases towards the camera and increase away from the camera. For example, if the height of the map is 1000px, a value of -1 means 1000px away from the center towards the camera, and a value of 1 means a distance of 1000px away from the camera from the center. `[\"distance-from-center\"]` may only be used in the `filter` expression for a `symbol` layer.\n */\nfun distanceFromCenter(): Expression = Expression.distanceFromCenter()\n\n/**\n * Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.\n */\nfun downcase(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.downcase(block)\n\n/**\n * Returns the mathematical constant e.\n */\nfun e(): Expression = Expression.e()\n\n/**\n * Retrieves a property value from the current feature's state. Returns `null` if the requested property is not present on the feature's state. A feature's state is not part of the GeoJSON or vector tile data, and must be set programmatically on each feature. Features are identified by their `id` attribute, which must be an integer or a string that can be cast to an integer. Note that [\"feature-state\"] can only be used with paint properties that support data-driven styling.\n */\nfun featureState(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.featureState(block)\n\n/**\n * Returns the largest integer that is less than or equal to the input.\n */\nfun floor(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.floor(block)\n\n/**\n * Returns a `formatted` string for displaying mixed-format text in the `text-field` property. The input may contain a string literal or expression, including an [`'image'`](#types-image) expression. Strings may be followed by a style override object that supports the following properties:\n- `\"text-font\"`: Overrides the font stack specified by the root layout property.\n- `\"text-color\"`: Overrides the color specified by the root paint property.\n- `\"font-scale\"`: Applies a scaling factor on `text-size` as specified by the root layout property.\n */\nfun format(block: Expression.FormatBuilder.() -> Unit): Expression = Expression.format(block)\n\n/**\n * Returns the feature's geometry type: `Point`, `LineString` or `Polygon`. `Multi*` feature types return the singular forms.\n */\nfun geometryType(): Expression = Expression.geometryType()\n\n/**\n * Retrieves a property value from the current feature's properties, or from another object if a second argument is provided. Returns `null` if the requested property is missing.\n */\nfun get(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.get(block)\n\n/**\n * Tests for the presence of an property value in the current feature's properties, or from another object if a second argument is provided.\n */\nfun has(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.has(block)\n\n/**\n * Returns the kernel density estimation of a pixel in a heatmap layer, which is a relative measure of how many data points are crowded around a particular pixel. Can only be used in the `heatmap-color` property.\n */\nfun heatmapDensity(): Expression = Expression.heatmapDensity()\n\n/**\n * Creates a color value from hue (range 0-360), saturation and lightness components (range 0-100), and an alpha component of 1. If any component is out of range, the expression is an error.\n */\nfun hsl(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.hsl(block)\n\n/**\n * Creates a color value from hue (range 0-360), saturation and lightness components (range 0-100), and an alpha component (range 0-1). If any component is out of range, the expression is an error.\n */\nfun hsla(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.hsla(block)\n\n/**\n * Returns the feature's id, if it has one.\n */\nfun id(): Expression = Expression.id()\n\n/**\n * Returns a [`ResolvedImage`](/style-spec/reference/types/#resolvedimage) for use in [`icon-image`](/style-spec/reference/layers/#layout-symbol-icon-image), `*-pattern` entries, and as a section in the [`'format'`](#types-format) expression.\n\nA [`'coalesce'`](#coalesce) expression containing `image` expressions will evaluate to the first listed image that is currently in the style. This validation process is synchronous and requires the image to have been added to the style before requesting it in the `'image'` argument.\n\nEvery image name can be followed by an optional [`ImageOptions`](/style-spec/reference/types/#imageoptions) object, which will be used for vector images only.\n\nTo implement crossfading between two images within a symbol layer using the [`icon-image-cross-fade`](/style-spec/reference/layers/#paint-symbol-icon-image-cross-fade) attribute, include a second image as the second argument in the `'image'` expression.\n */\nfun image(block: Expression.ImageBuilder.() -> Unit): Expression = Expression.image(block)\n\n/**\n * Determines whether an item exists in an array or a substring exists in a string. In the specific case when the second and third arguments are string literals, you must wrap at least one of them in a [`literal`](#types-literal) expression to hint correct interpretation to the [type system](#type-system).\n */\nfun inExpression(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.inExpression(block)\n\n/**\n * Returns the first position at which an item can be found in an array or a substring can be found in a string, or `-1` if the input cannot be found. Accepts an optional index from where to begin the search.\n */\nfun indexOf(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.indexOf(block)\n\n/**\n * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly ascending order. The output type must be `number`, `array<number>`, or `color`.\n\nInterpolation types:\n- `[\"linear\"]`: Interpolates linearly between the pair of stops just less than and just greater than the input.\n- `[\"exponential\", base]`: Interpolates exponentially between the stops just less than and just greater than the input. `base` controls the rate at which the output increases: higher values make the output increase more towards the high end of the range. With values close to 1 the output increases linearly.\n- `[\"cubic-bezier\", x1, y1, x2, y2]`: Interpolates using the cubic bezier curve defined by the given control points.\n */\nfun interpolate(block: Expression.InterpolatorBuilder.() -> Unit): Expression = Expression.interpolate(block)\n\n/**\n * Returns `true` if the input string is expected to render legibly. Returns `false` if the input string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use in Mapbox GL JS).\n */\nfun isSupportedScript(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.isSupportedScript(block)\n\n/**\n * Returns the length of an array or string.\n */\nfun length(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.length(block)\n\n/**\n * Binds expressions to named variables, which can then be referenced in the result expression using [\"var\", \"variable_name\"].\n */\nfun letExpression(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.letExpression(block)\n\n/**\n * Returns the progress along a gradient line. Can only be used in the `line-gradient` and `line-z-offset` properties.\n */\nfun lineProgress(): Expression = Expression.lineProgress()\n\n/**\n * Provides a literal array or object value.\n */\nfun literal(value: Double): Expression = Expression.literal(value)\n\n/**\n * Provides a literal array or object value.\n */\nfun literal(value: Long): Expression = Expression.literal(value)\n\n/**\n * Provides a literal array or object value.\n */\nfun literal(value: Boolean): Expression = Expression.literal(value)\n\n/**\n * Provides a literal array or object value.\n */\nfun literal(value: String): Expression = Expression.literal(value)\n\n/**\n * Provides a literal array or object value.\n */\nfun literal(value: List<Any>): Expression = Expression.literal(value)\n\n/**\n * Provides a literal array or object value.\n */\nfun literal(value: HashMap<String, Any>): Expression = Expression.literal(value)\n\n/**\n * Returns the natural logarithm of the input.\n */\nfun ln(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.ln(block)\n\n/**\n * Returns mathematical constant ln(2).\n */\nfun ln2(): Expression = Expression.ln2()\n\n/**\n * Returns the base-ten logarithm of the input.\n */\nfun log10(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.log10(block)\n\n/**\n * Returns the base-two logarithm of the input.\n */\nfun log2(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.log2(block)\n\n/**\n * Selects the output for which the label value matches the input value, or the fallback value if no match is found. The input can be any expression (for example, `[\"get\", \"building_type\"]`). Each label must be unique, and must be either:\n - a single literal value; or\n - an array of literal values, the values of which must be all strings or all numbers (for example `[100, 101]` or `[\"c\", \"b\"]`).\n\nThe input matches if any of the values in the array matches using strict equality, similar to the `\"in\"` operator.\nIf the input type does not match the type of the labels, the result will be the fallback value.\n */\nfun match(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.match(block)\n\n/**\n * Returns the maximum value of the inputs.\n */\nfun max(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.max(block)\n\n/**\n * Returns a requested property of the light configuration based on the supplied options. Currently the only supported option is `brightness` which returns the global brightness value of the lights on a scale of 0 to 1, where 0 means total darkness and 1 means full brightness. This expression works only with 3D light, i.e. when `lights` root property is defined.\n */\nfun measureLight(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.measureLight(block)\n\n/**\n * Returns the minimum value of the inputs.\n */\nfun min(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.min(block)\n\n/**\n * Asserts that the input value is a number. If multiple values are provided, each one is evaluated in order until a number is obtained. If none of the inputs are numbers, the expression is an error.\n */\nfun number(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.number(block)\n\n/**\n * Converts the input number into a string representation using the providing formatting rules. If set, the `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `unit` argument specifies a [simple ECMAScript unit](https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier) to use for unit-style formatting. If set, the `min-fraction-digits` and `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.\n */\nfun numberFormat(input: Expression, block: Expression.NumberFormatBuilder.() -> Unit): Expression = Expression.numberFormat(input, block)\n\n/**\n * Asserts that the input value is an object. If multiple values are provided, each one is evaluated in order until an object is obtained. If none of the inputs are objects, the expression is an error.\n */\nfun objectExpression(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.objectExpression(block)\n\n/**\n * Returns the mathematical constant pi.\n */\nfun pi(): Expression = Expression.pi()\n\n/**\n * Returns the current pitch in degrees. `[\"pitch\"]` may only be used in the `filter` expression for a `symbol` layer.\n */\nfun pitch(): Expression = Expression.pitch()\n\n/**\n * Returns the feature properties object. Note that in some cases, it may be more efficient to use `[\"get\", \"property_name\"]` directly.\n */\nfun properties(): Expression = Expression.properties()\n\n/**\n * Returns a random value in the specified range (first two input numbers) based on a supplied seed (third input). The seed can be an expression or a constant number or string value.\n */\nfun random(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.random(block)\n\n/**\n * Returns the length of the particle velocity vector. Can only be used in the `raster-particle-color` property.\n */\nfun rasterParticleSpeed(): Expression = Expression.rasterParticleSpeed()\n\n/**\n * Returns the raster value of a pixel computed via `raster-color-mix`. Can only be used in the `raster-color` property.\n */\nfun rasterValue(): Expression = Expression.rasterValue()\n\n/**\n * Returns the IETF language tag of the locale being used by the provided `collator`. This can be used to determine the default system locale, or to determine if a requested locale was successfully loaded.\n */\nfun resolvedLocale(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.resolvedLocale(block)\n\n/**\n * Creates a color value from red, green, and blue components, which must range between 0 and 255, and an alpha component of 1. If any component is out of range, the expression is an error.\n */\nfun rgb(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.rgb(block)\n\n/**\n * Creates a color value from red, green, blue components, which must range between 0 and 255, and an alpha component which must range between 0 and 1. If any component is out of range, the expression is an error.\n */\nfun rgba(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.rgba(block)\n\n/**\n * Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example, `[\"round\", -1.5]` evaluates to -2.\n */\nfun round(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.round(block)\n\n/**\n * Returns the sine of the input, interpreted as radians.\n */\nfun sin(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.sin(block)\n\n/**\n * Returns the distance of a point on the sky from the sun position. Returns 0 at sun position and 1 when the distance reaches `sky-gradient-radius`. Can only be used in the `sky-gradient` property.\n */\nfun skyRadialProgress(): Expression = Expression.skyRadialProgress()\n\n/**\n * Returns an item from an array or a substring from a string from a specified start index, or between a start index and an end index if set. The return value is inclusive of the start index but not of the end index.\n */\nfun slice(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.slice(block)\n\n/**\n * Returns an array of substrings from a string, split by a delimiter parameter.\n */\nfun split(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.split(block)\n\n/**\n * Returns the square root of the input.\n */\nfun sqrt(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.sqrt(block)\n\n/**\n * Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of input and output values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly ascending order. Returns the output value of the stop just less than the input, or the first output if the input is less than the first stop.\n */\nfun step(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.step(block)\n\n/**\n * Asserts that the input value is a string. If multiple values are provided, each one is evaluated in order until a string is obtained. If none of the inputs are strings, the expression is an error.\n */\nfun string(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.string(block)\n\n/**\n * Returns the tangent of the input, interpreted as radians.\n */\nfun tan(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.tan(block)\n\n/**\n * Converts the input value to a boolean. The result is `false` when then input is an empty string, 0, `false`, `null`, or `NaN`; otherwise it is `true`.\n */\nfun toBoolean(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.toBoolean(block)\n\n/**\n * Converts the input value to a color. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.\n */\nfun toColor(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.toColor(block)\n\n/**\n * Returns a four-element array containing the input color's Hue, Saturation, Luminance and alpha components, in that order.\n */\nfun toHsla(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.toHsla(block)\n\n/**\n * Converts the input value to a number, if possible. If the input is `null` or `false`, the result is 0. If the input is `true`, the result is 1. If the input is a string, it is converted to a number as specified by the [\"ToNumber Applied to the String Type\" algorithm](https://tc39.github.io/ecma262/#sec-tonumber-applied-to-the-string-type) of the ECMAScript Language Specification. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.\n */\nfun toNumber(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.toNumber(block)\n\n/**\n * Returns a four-element array containing the input color's red, green, blue, and alpha components, in that order.\n */\nfun toRgba(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.toRgba(block)\n\n/**\n * Converts the input value to a string. If the input is `null`, the result is `\"\"`. If the input is a [`boolean`](#types-boolean), the result is `\"true\"` or `\"false\"`. If the input is a number, it is converted to a string as specified by the [\"NumberToString\" algorithm](https://tc39.github.io/ecma262/#sec-tostring-applied-to-the-number-type) of the ECMAScript Language Specification. If the input is a [`color`](#color), it is converted to a string of the form `\"rgba(r,g,b,a)\"`, where `r`, `g`, and `b` are numerals ranging from 0 to 255, and `a` ranges from 0 to 1. If the input is an [`'image'`](#types-image) expression, `'to-string'` returns the image name. Otherwise, the input is converted to a string in the format specified by the [`JSON.stringify`](https://tc39.github.io/ecma262/#sec-json.stringify) function of the ECMAScript Language Specification.\n */\nfun toString(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.toString(block)\n\n/**\n * Returns a string describing the type of the given value.\n */\nfun typeofExpression(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.typeofExpression(block)\n\n/**\n * Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.\n */\nfun upcase(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.upcase(block)\n\n/**\n * References variable bound using \"let\".\n */\nfun varExpression(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.varExpression(block)\n/**\n * Returns `true` if the evaluated feature is fully contained inside a boundary of the input geometry, `false` otherwise. The input value can be a valid GeoJSON of type `Polygon`, `MultiPolygon`, `Feature`, or `FeatureCollection`. Supported features for evaluation:\n- `Point`: Returns `false` if a point is on the boundary or falls outside the boundary.\n- `LineString`: Returns `false` if any part of a line falls outside the boundary, the line intersects the boundary, or a line's endpoint is on the boundary.\n */\nfun within(geometry: Geometry): Expression = Expression.within(geometry)\n\n/**\n * Returns the current worldview being used.\n */\nfun worldview(block: Expression.ExpressionBuilder.() -> Unit): Expression = Expression.worldview(block)\n\n/**\n * Returns the current zoom level. Note that in style layout and paint properties, [\"zoom\"] may only appear as the input to a top-level \"step\" or \"interpolate\" expression.\n */\nfun zoom(): Expression = Expression.zoom()\n\n/**\n * Construct a RGB color expression from numbers.\n */\nfun rgb(red: Double, green: Double, blue: Double): Expression = Expression.rgb(red, green, blue)\n\n/**\n * Construct a RGBA color expression from numbers.\n */\nfun rgba(red: Double, green: Double, blue: Double, alpha: Double): Expression = Expression.rgba(red, green, blue, alpha)\n\n/**\n * Convert a color int to the rgba expression.\n */\nfun color(@ColorInt intColor: Int): Expression = Expression.color(intColor)\n\n/**\n * Retrieves a property value from the current feature's properties.\n * Expression evaluates to null if the requested property is missing.\n */\nfun get(key: String): Expression = Expression.get(key)\n\n/**\n * Retrieves a property value from the current feature's properties, or from another object if a second\n * argument is provided. Expression evaluates to null if the requested property is missing.\n */\nfun get(key: String, expression: Expression): Expression = Expression.get(key, expression)\n\n/**\n * Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.\n */\nfun not(bool: Boolean): Expression = Expression.not(bool)\n\n/**\n * Retrieves an item from an array.\n */\nfun at(index: Double, array: Expression): Expression = Expression.at(index, array)\n\n/**\n * Determines whether an item exists in an array or a substring exists in a string.\n */\nfun inExpression(needle: String, haystack: Expression): Expression = Expression.inExpression(needle, haystack)\n\n/**\n * Determines whether an item exists in an array or a substring exists in a string.\n */\nfun inExpression(needle: Double, haystack: Expression): Expression = Expression.inExpression(needle, haystack)\n\n/**\n * Tests for the presence of an property value in the current feature's properties, or from another\n * object if a second argument is provided.\n */\nfun has(string: String, expression: Expression): Expression = Expression.has(string, expression)\n\n/**\n * Tests for the presence of an property value in the current feature's properties\n */\nfun has(string: String): Expression = Expression.has(string)\n\n/**\n * Gets the length of an string.\n */\nfun length(string: String): Expression = Expression.length(string)\n\n/**\n * Returns the sum of the inputs.\n */\nfun sum(vararg double: Double): Expression = Expression.sum(*double)\n\n/**\n * Returns the product of the inputs.\n */\nfun product(vararg double: Double): Expression = Expression.product(*double)\n\n/**\n * Returns the result of subtracting the second input from the first.\n */\nfun subtract(first: Double, second: Double): Expression = Expression.subtract(first, second)\n\n/**\n * Returns the result of subtracting it from 0.\n */\nfun subtract(value: Double): Expression = Expression.subtract(value)\n\n/**\n * Returns the result of floating point division of the first input by the second.\n */\nfun division(first: Double, second: Double): Expression = Expression.division(first, second)\n\n/**\n * Returns the remainder after integer division of the first input by the second.\n */\nfun mod(first: Double, second: Double): Expression = Expression.mod(first, second)\n\n/**\n * Returns the result of raising the first input to the power specified by the second.\n */\nfun pow(first: Double, second: Double): Expression = Expression.pow(first, second)\n\n/**\n * Returns the square root of the input.\n */\nfun sqrt(value: Double): Expression = Expression.sqrt(value)\n\n/**\n * Returns the base-ten logarithm of the input.\n */\nfun log10(value: Double): Expression = Expression.log10(value)\n\n/**\n * Returns the natural logarithm of the input.\n */\nfun ln(value: Double): Expression = Expression.ln(value)\n\n/**\n * Returns the base-two logarithm of the input.\n */\nfun log2(value: Double): Expression = Expression.log2(value)\n\n/**\n * Returns the sine of the input.\n */\nfun sin(value: Double): Expression = Expression.sin(value)\n\n/**\n * Returns the cosine of the input.\n */\nfun cos(value: Double): Expression = Expression.cos(value)\n\n/**\n * Returns the tangent of the input.\n */\nfun tan(value: Double): Expression = Expression.tan(value)\n\n/**\n * Returns the arcsine of the input.\n */\nfun asin(value: Double): Expression = Expression.asin(value)\n\n/**\n * Returns the arccosine of the input.\n */\nfun acos(value: Double): Expression = Expression.acos(value)\n\n/**\n * Returns the arctangent of the input.\n */\nfun atan(value: Double): Expression = Expression.atan(value)\n\n/**\n * Returns the minimum value of the inputs.\n */\nfun min(vararg values: Double): Expression = Expression.min(*values)\n\n/**\n * Returns the maximum value of the inputs.\n */\nfun max(vararg values: Double): Expression = Expression.max(*values)\n\n/**\n * Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example,\n * `[\"round\", -1.5]` evaluates to -2.\n */\nfun round(value: Double): Expression = Expression.round(value)\n\n/**\n * Returns the absolute value of the input.\n */\nfun abs(value: Double): Expression = Expression.abs(value)\n\n/**\n * Returns the smallest integer that is greater than or equal to the input.\n */\nfun ceil(value: Double): Expression = Expression.ceil(value)\n\n/**\n * Returns the largest integer that is less than or equal to the input.\n */\nfun floor(value: Double): Expression = Expression.floor(value)\n\n/**\n * Returns `true` if the input string is expected to render legibly. Returns `false` if the input\n * string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that\n * require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use\n * in Mapbox GL JS).\n */\nfun isSupportedScript(script: String): Expression = Expression.isSupportedScript(script)\n\n/**\n * Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the\n * locale-insensitive case mappings in the Unicode Character Database.\n */\nfun upcase(value: String): Expression = Expression.upcase(value)\n\n/**\n * Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the\n * locale-insensitive case mappings in the Unicode Character Database.\n */\nfun downcase(value: String): Expression = Expression.downcase(value)\n\n/**\n * Returns a `string` consisting of the concatenation of the inputs. Each input is converted to a\n * string as if by `to-string`.\n */\nfun concat(vararg values: String): Expression = Expression.concat(*values)\n\n/**\n * References variable bound using \"let\".\n */\nfun varExpression(value: String): Expression = Expression.varExpression(value)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/expressions/generated/Expression.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.expressions.generated\n\nimport androidx.annotation.ColorInt\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.GeoJson\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.extension.style.expressions.types.FormatSection\nimport com.mapbox.maps.extension.style.types.ExpressionDsl\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.take\nimport com.mapbox.maps.extension.style.utils.unwrapFromLiteralArray\nimport com.mapbox.maps.extension.style.utils.unwrapToExpression\nimport java.util.Locale\nimport kotlin.collections.ArrayList\nimport kotlin.collections.HashMap\n\n/**\n * An expression defines a formula for computing the value of any layout property, paint property,\n * or filter within a map style. Expressions allow you to style data with multiple feature\n * properties at once, apply conditional logic, and manipulate data with mathematical, logical, and\n * string operators. This allows for sophisticated runtime styling.\n */\nclass Expression : Value {\n  private constructor(builder: Builder) : super(builder.contents()) {\n    if (\"literal\" == builder.operator) {\n      this.literalValue = builder.arguments.last().literalValue\n    }\n  }\n\n  private constructor(value: Double) : super(value) {\n    this.literalValue = value\n  }\n\n  private constructor(value: Long) : super(value) {\n    this.literalValue = value\n  }\n\n  private constructor(value: Boolean) : super(value) {\n    this.literalValue = value\n  }\n\n  private constructor(value: String) : super(value) {\n    this.literalValue = value\n  }\n\n  private constructor(value: DoubleArray) : super(value.map(::Value)) {\n    this.literalValue = value\n  }\n\n  private constructor(value: LongArray) : super(value.map(::Value)) {\n    this.literalValue = value\n  }\n\n  private constructor(value: BooleanArray) : super(value.map(::Value)) {\n    this.literalValue = value\n  }\n\n  private constructor(value: Array<String>) : super(value.map(::Value)) {\n    this.literalValue = value\n  }\n\n  internal constructor(value: Array<DoubleArray>) : super(\n    value.map { doubleArray ->\n      Value(\n        doubleArray.map(::Value)\n      )\n    }\n  ) {\n    this.literalValue = value\n  }\n\n  internal constructor(value: List<Any>) : super(value.map { TypeUtils.wrapToValue(it) }) {\n    this.literalValue = value\n  }\n\n  internal constructor(value: HashMap<String, Value>) : super(value) {\n    this.literalValue = value\n  }\n\n  /**\n   * Return Expression as literal Value.\n   *\n   * Return null if the expression is not literal.\n   */\n  var literalValue: Any? = null\n    private set\n\n  /**\n   * Check if the expression is literal.\n   *\n   * @return boolean\n   */\n  fun isLiteral(): Boolean {\n    return null != literalValue\n  }\n\n  /**\n   * Get the literal value of the expression as given type.\n   *\n   * Return null if expression is not literal or can not be casted to given type.\n   */\n  inline fun <reified T> getLiteral(): T? {\n    if (literalValue is T) {\n      return literalValue as T\n    }\n    return null\n  }\n\n  /**\n   * Abstract base builder.\n   *\n   * @param operator compulsory operator field for the builder\n   */\n  abstract class Builder(internal val operator: String) {\n    internal val arguments = ArrayList<Expression>()\n\n    internal fun contents(): List<Value> {\n      val valueList = ArrayList<Value>()\n      valueList.add(Value(operator))\n      valueList.addAll(arguments)\n      return valueList\n    }\n\n    /**\n     * Build the Expression with the settings.\n     *\n     * @return Expression\n     */\n    open fun build(): Expression {\n      if (this.operator == \"match\") {\n        val newBuilder = ExpressionBuilder(\"match\")\n        val lastIndex = this.arguments.size - 1\n        this.arguments.forEachIndexed { index, argument ->\n          newBuilder.addArgument(\n            // https://github.com/mapbox/mapbox-maps-android/issues/965\n            // the match expression is an exception and it takes raw list instead of a list wrapped into\n            // literal expression when literal array is used as the label, the last member of the arguments\n            // will be the default output should shouldn't be unwrapped.\n            if (index % 2 == 1 && index != lastIndex) {\n              argument.unwrapFromLiteralArray()\n            } else {\n              argument\n            }\n          )\n        }\n        return Expression(newBuilder)\n      }\n      return Expression(this)\n    }\n  }\n\n  /**\n   * Builder for Expression.\n   *\n   * @param operator compulsory operator field for the builder\n   */\n  @ExpressionDsl\n  open class ExpressionBuilder(operator: String) : Builder(operator) {\n\n    /**\n     * Add an Expression to the builder.\n     *\n     * @param expression\n     */\n    fun addArgument(expression: Expression): ExpressionBuilder = apply { this.arguments.add(expression) }\n\n    /**\n     * For two inputs, returns the result of subtracting the second input from the first. For a\n     * single input, returns the result of subtracting it from 0.\n     */\n    fun subtract(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.subtract(block))\n    }\n\n    /**\n     * Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.\n     */\n    fun not(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.not(block))\n    }\n\n    /**\n     * Returns `true` if the input values are not equal, `false` otherwise. The comparison is strictly typed:\n     * values of different runtime types are always considered unequal. Cases where the types are known to\n     * be different at parse time are considered invalid and will produce a parse error. Accepts an\n     * optional `collator` argument to control locale-dependent string comparisons.\n     */\n    fun neq(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.neq(block))\n    }\n\n    /**\n     * Returns the product of the inputs.\n     */\n    fun product(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.product(block))\n    }\n\n    /**\n     * Returns the result of floating point division of the first input by the second.\n     */\n    fun division(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.division(block))\n    }\n\n    /**\n     * Returns the remainder after integer division of the first input by the second.\n     */\n    fun mod(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.mod(block))\n    }\n\n    /**\n     * Returns the result of raising the first input to the power specified by the second.\n     */\n    fun pow(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.pow(block))\n    }\n\n    /**\n     * Returns the sum of the inputs.\n     */\n    fun sum(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.sum(block))\n    }\n\n    /**\n     * Returns `true` if the first input is strictly less than the second, `false` otherwise. The arguments\n     * are required to be either both strings or both numbers; if during evaluation they are not,\n     * expression evaluation produces an error. Cases where this constraint is known not to hold at parse\n     * time are considered in valid and will produce a parse error. Accepts an optional `collator` argument\n     * to control locale-dependent string comparisons.\n     */\n    fun lt(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.lt(block))\n    }\n\n    /**\n     * Returns `true` if the first input is less than or equal to the second, `false` otherwise.\n     * The arguments are required to be either both strings or both numbers; if during evaluation they\n     * are not, expression evaluation produces an error. Cases where this constraint is known not to hold\n     * at parse time are considered in valid and will produce a parse error. Accepts an optional\n     * `collator` argument to control locale-dependent string comparisons.\n     */\n    fun lte(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.lte(block))\n    }\n\n    /**\n     * Returns `true` if the input values are equal, `false` otherwise. The comparison is strictly typed: values\n     * of different runtime types are always considered unequal. Cases where the types are known to be\n     * different at parse time are considered invalid and will produce a parse error. Accepts an optional\n     * `collator` argument to control locale-dependent string comparisons.\n     */\n    fun eq(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.eq(block))\n    }\n\n    /**\n     * Returns `true` if the first input is strictly greater than the second, `false` otherwise. The arguments\n     * are required to be either both strings or both numbers; if during evaluation they are not,\n     * expression evaluation produces an error. Cases where this constraint is known not to hold at parse\n     * time are considered in valid and will produce a parse error. Accepts an optional `collator` argument\n     * to control locale-dependent string comparisons.\n     */\n    fun gt(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.gt(block))\n    }\n\n    /**\n     * Returns `true` if the first input is greater than or equal to the second, `false` otherwise.\n     * The arguments are required to be either both strings or both numbers; if during evaluation they\n     * are not, expression evaluation produces an error. Cases where this constraint is known not to hold\n     * at parse time are considered in valid and will produce a parse error. Accepts an optional\n     * `collator` argument to control locale-dependent string comparisons.\n     */\n    fun gte(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.gte(block))\n    }\n\n    /**\n     * Returns the absolute value of the input.\n     */\n    fun abs(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.abs(block))\n    }\n\n    /**\n     * Returns the value of a cluster property accumulated so far. Can only be used in the\n     * `clusterProperties` option of a clustered GeoJSON source.\n     */\n    fun accumulated(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.accumulated())\n    }\n\n    /**\n     * Returns the arccosine of the input, in radians between −π/2 and π/2.\n     */\n    fun acos(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.acos(block))\n    }\n\n    /**\n     * Returns a string which matches one of the values specified in the text-anchor layout property, depending\n     * on the best-fit anchor for the symbol during rendering. Using this expression the content of the\n     * layer can be dynamically configured for the specific anchor type.\n     */\n    @MapboxExperimental\n    fun activeAnchor(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.activeAnchor())\n    }\n\n    /**\n     * Returns `true` if all the inputs are `true`, `false` otherwise. The inputs are evaluated in order,\n     * and evaluation is short-circuiting: once an input expression evaluates to `false`, the result is `false` and\n     * no further input expressions are evaluated.\n     */\n    fun all(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.all(block))\n    }\n\n    /**\n     * Returns `true` if any of the inputs are `true`, `false` otherwise. The inputs are evaluated in\n     * order, and evaluation is short-circuiting: once an input expression evaluates to `true`, the result is `true`\n     * and no further input expressions are evaluated.\n     */\n    fun any(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.any(block))\n    }\n\n    /**\n     * Asserts that the input is an array (optionally with a specific item type and length). If,\n     * when the input expression is evaluated, it is not of the asserted type, then this assertion\n     * will cause the whole expression to be aborted.\n     */\n    fun array(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.array(block))\n    }\n\n    /**\n     * Returns the arcsine of the input, in radians between −π/2 and π/2.\n     */\n    fun asin(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.asin(block))\n    }\n\n    /**\n     * Retrieves an item from an array.\n     */\n    fun at(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.at(block))\n    }\n\n    /**\n     * Retrieves an item from an array. If the array contains numeric values and the provided index\n     * is non-integer, the expression returns an interpolated value between adjacent items.\n     */\n    fun atInterpolated(block: InterpolatorBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.atInterpolated(block))\n    }\n\n    /**\n     * Returns the arctangent of the input, in radians between −π/2 and π/2.\n     */\n    fun atan(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.atan(block))\n    }\n\n    /**\n     * Asserts that the input value is a boolean. If multiple values are provided, each one is\n     * evaluated in order until a boolean is obtained. If none of the inputs are booleans, the\n     * expression is an error.\n     */\n    fun boolean(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.boolean(block))\n    }\n\n    /**\n     * Selects the first output whose corresponding test condition evaluates to true, or the fallback value otherwise.\n     */\n    fun switchCase(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.switchCase(block))\n    }\n\n    /**\n     * Returns the smallest integer that is greater than or equal to the input.\n     */\n    fun ceil(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.ceil(block))\n    }\n\n    /**\n     * Evaluates each expression in turn until the first valid value is obtained. Invalid values are `null`\n     * and [`'image'`](#types-image) expressions that are unavailable in the style. If all values are invalid, `coalesce` returns\n     * the first value listed.\n     */\n    fun coalesce(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.coalesce(block))\n    }\n\n    /**\n     * Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to\n     * `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none\n     * is provided, the default locale is used. If the requested locale is not available, the `collator`\n     * will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.\n     */\n    fun collator(block: CollatorBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(\n        CollatorBuilder().apply(block).build()\n      )\n    }\n\n    /**\n     * Returns a `string` consisting of the concatenation of the inputs. Each input is converted to a\n     * string as if by `to-string`.\n     */\n    fun concat(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.concat(block))\n    }\n\n    /**\n     * Retrieves the configuration value for the given option. Returns null if the requested option is missing.\n     */\n    fun config(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.config(block))\n    }\n\n    /**\n     * Returns the cosine of the input, interpreted as radians.\n     */\n    fun cos(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.cos(block))\n    }\n\n    /**\n     * Returns the shortest distance in meters between the evaluated feature and the input geometry. The input\n     * value can be a valid GeoJSON of type `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`, `Feature`, or\n     * `FeatureCollection`. Distance values returned may vary in precision due to loss in precision from encoding geometries,\n     * particularly below zoom level 13.\n     */\n    fun distance(geojson: GeoJson): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.distance(geojson))\n    }\n\n    /**\n     * Returns the distance of a `symbol` instance from the center of the map. The distance is\n     * measured in pixels divided by the height of the map container. It measures 0 at the\n     * center, decreases towards the camera and increase away from the camera. For example, if the height\n     * of the map is 1000px, a value of -1 means 1000px away from the center towards\n     * the camera, and a value of 1 means a distance of 1000px away from the camera\n     * from the center. `[\"distance-from-center\"]` may only be used in the `filter` expression for a `symbol` layer.\n     */\n    fun distanceFromCenter(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.distanceFromCenter())\n    }\n\n    /**\n     * Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the\n     * locale-insensitive case mappings in the Unicode Character Database.\n     */\n    fun downcase(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.downcase(block))\n    }\n\n    /**\n     * Returns the mathematical constant e.\n     */\n    fun e(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.e())\n    }\n\n    /**\n     * Retrieves a property value from the current feature's state. Returns `null` if the requested property is\n     * not present on the feature's state. A feature's state is not part of the GeoJSON or\n     * vector tile data, and must be set programmatically on each feature. Features are identified by their\n     * `id` attribute, which must be an integer or a string that can be cast to an\n     * integer. Note that [\"feature-state\"] can only be used with paint properties that support data-driven styling.\n     */\n    fun featureState(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.featureState(block))\n    }\n\n    /**\n     * Returns the largest integer that is less than or equal to the input.\n     */\n    fun floor(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.floor(block))\n    }\n\n    /**\n     * Returns a `formatted` string for displaying mixed-format text in the `text-field` property. The input may contain\n     * a string literal or expression, including an [`'image'`](#types-image) expression. Strings may be followed by a style\n     * override object that supports the following properties:\n     * - `\"text-font\"`: Overrides the font stack specified by the root layout property.\n     * - `\"text-color\"`: Overrides the color specified by the root paint property.\n     * - `\"font-scale\"`: Applies a scaling factor on `text-size` as specified by the root layout property.\n     */\n    fun format(block: FormatBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.format(block))\n    }\n\n    /**\n     * Returns the feature's geometry type: `Point`, `LineString` or `Polygon`. `Multi-` feature types return the singular forms.\n     */\n    fun geometryType(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.geometryType())\n    }\n\n    /**\n     * Retrieves a property value from the current feature's properties, or from another object if a second\n     * argument is provided. Returns `null` if the requested property is missing.\n     */\n    fun get(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.get(block))\n    }\n\n    /**\n     * Tests for the presence of an property value in the current feature's properties, or from another\n     * object if a second argument is provided.\n     */\n    fun has(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.has(block))\n    }\n\n    /**\n     * Returns the kernel density estimation of a pixel in a heatmap layer, which is a relative\n     * measure of how many data points are crowded around a particular pixel. Can only be used\n     * in the `heatmap-color` property.\n     */\n    fun heatmapDensity(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.heatmapDensity())\n    }\n\n    /**\n     * Creates a color value from hue (range 0-360), saturation and lightness components (range 0-100), and an\n     * alpha component of 1. If any component is out of range, the expression is an error.\n     */\n    fun hsl(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.hsl(block))\n    }\n\n    /**\n     * Creates a color value from hue (range 0-360), saturation and lightness components (range 0-100), and an\n     * alpha component (range 0-1). If any component is out of range, the expression is an error.\n     */\n    fun hsla(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.hsla(block))\n    }\n\n    /**\n     * Returns the feature's id, if it has one.\n     */\n    fun id(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.id())\n    }\n\n    /**\n     * Returns a [`ResolvedImage`](/style-spec/reference/types/#resolvedimage) for use in [`icon-image`](/style-spec/reference/layers/#layout-symbol-icon-image), `--pattern` entries, and as a section in the [`'format'`](#types-format)\n     * expression.\n     *\n     * A [`'coalesce'`](#coalesce) expression containing `image` expressions will evaluate to the first listed image that is currently\n     * in the style. This validation process is synchronous and requires the image to have been added\n     * to the style before requesting it in the `'image'` argument.\n     *\n     * Every image name can be followed by an optional [`ImageOptions`](/style-spec/reference/types/#imageoptions) object, which will be used for\n     * vector images only.\n     *\n     * To implement crossfading between two images within a symbol layer using the [`icon-image-cross-fade`](/style-spec/reference/layers/#paint-symbol-icon-image-cross-fade) attribute, include a\n     * second image as the second argument in the `'image'` expression.\n     */\n    fun image(block: ImageBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.image(block))\n    }\n\n    /**\n     * Determines whether an item exists in an array or a substring exists in a string. In\n     * the specific case when the second and third arguments are string literals, you must wrap at\n     * least one of them in a [`literal`](#types-literal) expression to hint correct interpretation to the [type system](#type-system).\n     */\n    fun inExpression(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.inExpression(block))\n    }\n\n    /**\n     * Returns the first position at which an item can be found in an array or a\n     * substring can be found in a string, or `-1` if the input cannot be found. Accepts\n     * an optional index from where to begin the search.\n     */\n    fun indexOf(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.indexOf(block))\n    }\n\n    /**\n     * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). The `input`\n     * may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly\n     * ascending order. The output type must be `number`, `array<number>`, or `color`.\n     *\n     * Interpolation types:\n     * - `[\"linear\"]`: Interpolates linearly between the pair of stops just less than and just greater than\n     * the input.\n     * - `[\"exponential\", base]`: Interpolates exponentially between the stops just less than and just greater than the\n     * input. `base` controls the rate at which the output increases: higher values make the output increase\n     * more towards the high end of the range. With values close to 1 the output increases\n     * linearly.\n     * - `[\"cubic-bezier\", x1, y1, x2, y2]`: Interpolates using the cubic bezier curve defined by the given\n     * control points.\n     */\n    fun interpolate(block: InterpolatorBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.interpolate(block))\n    }\n\n    /**\n     * Returns `true` if the input string is expected to render legibly. Returns `false` if the input\n     * string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that\n     * require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use\n     * in Mapbox GL JS).\n     */\n    fun isSupportedScript(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.isSupportedScript(block))\n    }\n\n    /**\n     * Returns the length of an array or string.\n     */\n    fun length(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.length(block))\n    }\n\n    /**\n     * Binds expressions to named variables, which can then be referenced in the result expression using [\"var\",\n     * \"variable_name\"].\n     */\n    fun letExpression(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.letExpression(block))\n    }\n\n    /**\n     * Returns the progress along a gradient line. Can only be used in the `line-gradient` and `line-z-offset`\n     * properties.\n     */\n    fun lineProgress(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.lineProgress())\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    fun literal(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression(value))\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    fun literal(value: Long): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression(value))\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    fun literal(value: Boolean): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression(value))\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    fun literal(value: String): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression(value))\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    fun literal(value: HashMap<String, Any>): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Companion.literal(value))\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    fun literal(value: List<Any>): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Companion.literal(value))\n    }\n\n    /**\n     * Returns the natural logarithm of the input.\n     */\n    fun ln(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.ln(block))\n    }\n\n    /**\n     * Returns mathematical constant ln(2).\n     */\n    fun ln2(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.ln2())\n    }\n\n    /**\n     * Returns the base-ten logarithm of the input.\n     */\n    fun log10(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.log10(block))\n    }\n\n    /**\n     * Returns the base-two logarithm of the input.\n     */\n    fun log2(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.log2(block))\n    }\n\n    /**\n     * Selects the output for which the label value matches the input value, or the fallback value\n     * if no match is found. The input can be any expression (for example, `[\"get\", \"building_type\"]`). Each\n     * label must be unique, and must be either:\n     *  - a single literal value; or\n     *  - an array of literal values, the values of which must be all strings or\n     * all numbers (for example `[100, 101]` or `[\"c\", \"b\"]`).\n     *\n     * The input matches if any of the values in the array matches using strict equality, similar\n     * to the `\"in\"` operator.\n     * If the input type does not match the type of the labels, the result will be\n     * the fallback value.\n     */\n    fun match(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.match(block))\n    }\n\n    /**\n     * Returns the maximum value of the inputs.\n     */\n    fun max(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.max(block))\n    }\n\n    /**\n     * Returns a requested property of the light configuration based on the supplied options. Currently the only\n     * supported option is `brightness` which returns the global brightness value of the lights on a scale\n     * of 0 to 1, where 0 means total darkness and 1 means full brightness. This expression\n     * works only with 3D light, i.e. when `lights` root property is defined.\n     */\n    fun measureLight(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.measureLight(block))\n    }\n\n    /**\n     * Returns the minimum value of the inputs.\n     */\n    fun min(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.min(block))\n    }\n\n    /**\n     * Asserts that the input value is a number. If multiple values are provided, each one is\n     * evaluated in order until a number is obtained. If none of the inputs are numbers, the\n     * expression is an error.\n     */\n    fun number(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.number(block))\n    }\n\n    /**\n     * Converts the input number into a string representation using the providing formatting rules. If set, the\n     * `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the\n     * `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `unit`\n     * argument specifies a [simple ECMAScript unit](https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier) to use for unit-style formatting. If set, the `min-fraction-digits` and\n     * `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.\n     */\n    fun numberFormat(input: Expression, block: NumberFormatBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.numberFormat(input, block))\n    }\n\n    /**\n     * Asserts that the input value is an object. If multiple values are provided, each one is\n     * evaluated in order until an object is obtained. If none of the inputs are objects, the\n     * expression is an error.\n     */\n    fun objectExpression(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.objectExpression(block))\n    }\n\n    /**\n     * Returns the mathematical constant pi.\n     */\n    fun pi(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.pi())\n    }\n\n    /**\n     * Returns the current pitch in degrees. `[\"pitch\"]` may only be used in the `filter` expression for\n     * a `symbol` layer.\n     */\n    fun pitch(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.pitch())\n    }\n\n    /**\n     * Returns the feature properties object. Note that in some cases, it may be more efficient to\n     * use `[\"get\", \"property_name\"]` directly.\n     */\n    fun properties(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.properties())\n    }\n\n    /**\n     * Returns a random value in the specified range (first two input numbers) based on a supplied\n     * seed (third input). The seed can be an expression or a constant number or string value.\n     */\n    fun random(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.random(block))\n    }\n\n    /**\n     * Returns the length of the particle velocity vector. Can only be used in the `raster-particle-color` property.\n     */\n    fun rasterParticleSpeed(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.rasterParticleSpeed())\n    }\n\n    /**\n     * Returns the raster value of a pixel computed via `raster-color-mix`. Can only be used in the\n     * `raster-color` property.\n     */\n    fun rasterValue(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.rasterValue())\n    }\n\n    /**\n     * Returns the IETF language tag of the locale being used by the provided `collator`. This can\n     * be used to determine the default system locale, or to determine if a requested locale was\n     * successfully loaded.\n     */\n    fun resolvedLocale(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.resolvedLocale(block))\n    }\n\n    /**\n     * Creates a color value from red, green, and blue components, which must range between 0 and\n     * 255, and an alpha component of 1. If any component is out of range, the expression\n     * is an error.\n     */\n    fun rgb(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.rgb(block))\n    }\n\n    /**\n     * Creates a color value from red, green, blue components, which must range between 0 and 255,\n     * and an alpha component which must range between 0 and 1. If any component is out\n     * of range, the expression is an error.\n     */\n    fun rgba(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.rgba(block))\n    }\n\n    /**\n     * Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example,\n     * `[\"round\", -1.5]` evaluates to -2.\n     */\n    fun round(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.round(block))\n    }\n\n    /**\n     * Returns the sine of the input, interpreted as radians.\n     */\n    fun sin(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.sin(block))\n    }\n\n    /**\n     * Returns the distance of a point on the sky from the sun position. Returns 0 at\n     * sun position and 1 when the distance reaches `sky-gradient-radius`. Can only be used in the `sky-gradient`\n     * property.\n     */\n    fun skyRadialProgress(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.skyRadialProgress())\n    }\n\n    /**\n     * Returns an item from an array or a substring from a string from a specified start\n     * index, or between a start index and an end index if set. The return value is\n     * inclusive of the start index but not of the end index.\n     */\n    fun slice(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.slice(block))\n    }\n\n    /**\n     * Returns an array of substrings from a string, split by a delimiter parameter.\n     */\n    fun split(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.split(block))\n    }\n\n    /**\n     * Returns the square root of the input.\n     */\n    fun sqrt(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.sqrt(block))\n    }\n\n    /**\n     * Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of input and output\n     * values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be\n     * numeric literals in strictly ascending order. Returns the output value of the stop just less than\n     * the input, or the first output if the input is less than the first stop.\n     */\n    fun step(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.step(block))\n    }\n\n    /**\n     * Asserts that the input value is a string. If multiple values are provided, each one is\n     * evaluated in order until a string is obtained. If none of the inputs are strings, the\n     * expression is an error.\n     */\n    fun string(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.string(block))\n    }\n\n    /**\n     * Returns the tangent of the input, interpreted as radians.\n     */\n    fun tan(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.tan(block))\n    }\n\n    /**\n     * Converts the input value to a boolean. The result is `false` when then input is an\n     * empty string, 0, `false`, `null`, or `NaN`; otherwise it is `true`.\n     */\n    fun toBoolean(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.toBoolean(block))\n    }\n\n    /**\n     * Converts the input value to a color. If multiple values are provided, each one is evaluated\n     * in order until the first successful conversion is obtained. If none of the inputs can be\n     * converted, the expression is an error.\n     */\n    fun toColor(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.toColor(block))\n    }\n\n    /**\n     * Returns a four-element array containing the input color's Hue, Saturation, Luminance and alpha components, in that\n     * order.\n     */\n    fun toHsla(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.toHsla(block))\n    }\n\n    /**\n     * Converts the input value to a number, if possible. If the input is `null` or `false`,\n     * the result is 0. If the input is `true`, the result is 1. If the input\n     * is a string, it is converted to a number as specified by the [\"ToNumber Applied to\n     * the String Type\" algorithm](https://tc39.github.io/ecma262/#sec-tonumber-applied-to-the-string-type) of the ECMAScript Language Specification. If multiple values are provided, each one\n     * is evaluated in order until the first successful conversion is obtained. If none of the inputs\n     * can be converted, the expression is an error.\n     */\n    fun toNumber(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.toNumber(block))\n    }\n\n    /**\n     * Returns a four-element array containing the input color's red, green, blue, and alpha components, in that\n     * order.\n     */\n    fun toRgba(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.toRgba(block))\n    }\n\n    /**\n     * Converts the input value to a string. If the input is `null`, the result is `\"\"`.\n     * If the input is a [`boolean`](#types-boolean), the result is `\"true\"` or `\"false\"`. If the input is\n     * a number, it is converted to a string as specified by the [\"NumberToString\" algorithm](https://tc39.github.io/ecma262/#sec-tostring-applied-to-the-number-type) of the\n     * ECMAScript Language Specification. If the input is a [`color`](#color), it is converted to a string of\n     * the form `\"rgba(r,g,b,a)\"`, where `r`, `g`, and `b` are numerals ranging from 0 to 255, and\n     * `a` ranges from 0 to 1. If the input is an [`'image'`](#types-image) expression, `'to-string'` returns the\n     * image name. Otherwise, the input is converted to a string in the format specified by the\n     * [`JSON.stringify`](https://tc39.github.io/ecma262/#sec-json.stringify) function of the ECMAScript Language Specification.\n     */\n    fun toString(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.toString(block))\n    }\n\n    /**\n     * Returns a string describing the type of the given value.\n     */\n    fun typeofExpression(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.typeofExpression(block))\n    }\n\n    /**\n     * Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the\n     * locale-insensitive case mappings in the Unicode Character Database.\n     */\n    fun upcase(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.upcase(block))\n    }\n\n    /**\n     * References variable bound using \"let\".\n     */\n    fun varExpression(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.varExpression(block))\n    }\n\n    /**\n     * Returns `true` if the evaluated feature is fully contained inside a boundary of the input geometry,\n     * `false` otherwise. The input value can be a valid GeoJSON of type `Polygon`, `MultiPolygon`, `Feature`, or\n     * `FeatureCollection`. Supported features for evaluation:\n     * - `Point`: Returns `false` if a point is on the boundary or falls outside the boundary.\n     * - `LineString`: Returns `false` if any part of a line falls outside the boundary, the line\n     * intersects the boundary, or a line's endpoint is on the boundary.\n     */\n\n    fun within(geometry: Geometry): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.within(geometry))\n    }\n\n    /**\n     * Returns the current worldview being used.\n     */\n    @MapboxExperimental\n    fun worldview(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.worldview(block))\n    }\n\n    /**\n     * Returns the current zoom level. Note that in style layout and paint properties, [\"zoom\"] may only\n     * appear as the input to a top-level \"step\" or \"interpolate\" expression.\n     */\n    fun zoom(): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.zoom())\n    }\n\n    /**\n     * Add a RGB color expression from numbers to the current expression builder.\n     */\n    fun rgb(red: Double, green: Double, blue: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.rgb(red, green, blue))\n    }\n\n    /**\n     * Add a RGBA color expression from numbers to the current expression builder.\n     */\n    fun rgba(red: Double, green: Double, blue: Double, alpha: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.rgba(red, green, blue, alpha))\n    }\n\n    /**\n     * Add a color expression to the current expression builder.\n     */\n    fun color(@ColorInt intColor: Int): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.color(intColor))\n    }\n\n    /**\n     * Add a pair of input and output values.\n     * The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`).\n     * Stop inputs must be numeric literals in strictly ascending order.\n     * Returns the output value of the stop just less than the input,\n     * or the first output if the input is less than the first stop.\n     *\n     * It is to be used as part of parameters in the step expression.\n     */\n    fun stop(block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.apply(block)\n    }\n\n    /**\n     * Add a pair of input and output values.\n     * The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`).\n     * Stop inputs must be numeric literals in strictly ascending order.\n     * Returns the output value of the stop just less than the input,\n     * or the first output if the input is less than the first stop.\n     * It is to be used as part of parameters in the step expression.\n     *\n     * @param input as a double\n     * @param output as Expression DSL block\n     */\n    fun stop(input: Double, block: ExpressionBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.addArgument(Companion.literal(input)).apply(block)\n    }\n\n    /**\n     * Add a pair of input and output values.\n     * The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`).\n     * Stop inputs must be numeric literals in strictly ascending order.\n     * Returns the output value of the stop just less than the input,\n     * or the first output if the input is less than the first stop.\n     *\n     * @param input as an Expression\n     * @param output as an Expression\n     */\n    fun stop(input: Expression, output: Expression): ExpressionBuilder = apply {\n      this@ExpressionBuilder.addArgument(input).addArgument(output)\n    }\n\n    /**\n     * Add a pair of input and output values.\n     * The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`).\n     * Stop inputs must be numeric literals in strictly ascending order.\n     * Returns the output value of the stop just less than the input,\n     * or the first output if the input is less than the first stop.\n     *\n     * @param input as a double\n     * @param output as a double\n     */\n    fun stop(input: Double, output: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.addArgument(Companion.literal(input)).addArgument(Companion.literal(output))\n    }\n\n    /**\n     * Add a pair of input and output values.\n     * The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`).\n     * Stop inputs must be numeric literals in strictly ascending order.\n     * Returns the output value of the stop just less than the input,\n     * or the first output if the input is less than the first stop.\n     *\n     * @param pair an input and output argument pair\n     */\n    fun stop(pair: Pair<Expression, Expression>): ExpressionBuilder = apply {\n      this@ExpressionBuilder.addArgument(pair.first).addArgument(pair.second)\n    }\n\n    /**\n     * Retrieves a property value from the current feature's properties.\n     * Expression evaluates to null if the requested property is missing.\n     */\n    fun get(key: String): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.get(key))\n    }\n\n    /**\n     * Retrieves a property value from the current feature's properties, or from another object if a second\n     * argument is provided. Expression evaluates to null if the requested property is missing.\n     */\n    fun get(key: String, expression: Expression): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.get(key, expression))\n    }\n\n    /**\n     * Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.\n     */\n    fun not(bool: Boolean): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.not(bool))\n    }\n\n    /**\n     * Retrieves an item from an array.\n     */\n    fun at(index: Double, array: Expression): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.at(index, array))\n    }\n\n    /**\n     * Determines whether an item exists in an array or a substring exists in a string.\n     */\n    fun inExpression(needle: String, haystack: Expression): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.inExpression(needle, haystack))\n    }\n\n    /**\n     * Determines whether an item exists in an array or a substring exists in a string.\n     */\n    fun inExpression(needle: Double, haystack: Expression): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.inExpression(needle, haystack))\n    }\n\n    /**\n     * Tests for the presence of an property value in the current feature's properties, or from another\n     * object if a second argument is provided.\n     */\n    fun has(string: String, expression: Expression): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.has(string, expression))\n    }\n\n    /**\n     * Tests for the presence of an property value in the current feature's properties\n     */\n    fun has(string: String): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.has(string))\n    }\n\n    /**\n     * Gets the length of an string.\n     */\n    fun length(string: String): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.length(string))\n    }\n\n    /**\n     * Returns the sum of the inputs.\n     */\n    fun sum(vararg double: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.sum(*double))\n    }\n\n    /**\n     * Returns the product of the inputs.\n     */\n    fun product(vararg double: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.product(*double))\n    }\n\n    /**\n     * Returns the result of subtracting the second input from the first.\n     */\n    fun subtract(first: Double, second: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.subtract(first, second))\n    }\n\n    /**\n     * Returns the result of subtracting it from 0.\n     */\n    fun subtract(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.subtract(value))\n    }\n\n    /**\n     * Returns the result of floating point division of the first input by the second.\n     */\n    fun division(first: Double, second: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.division(first, second))\n    }\n\n    /**\n     * Returns the remainder after integer division of the first input by the second.\n     */\n    fun mod(first: Double, second: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.mod(first, second))\n    }\n\n    /**\n     * Returns the result of raising the first input to the power specified by the second.\n     */\n    fun pow(first: Double, second: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.pow(first, second))\n    }\n\n    /**\n     * Returns the square root of the input.\n     */\n    fun sqrt(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.sqrt(value))\n    }\n\n    /**\n     * Returns the base-ten logarithm of the input.\n     */\n    fun log10(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.log10(value))\n    }\n\n    /**\n     * Returns the natural logarithm of the input.\n     */\n    fun ln(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.ln(value))\n    }\n\n    /**\n     * Returns the base-two logarithm of the input.\n     */\n    fun log2(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.log2(value))\n    }\n\n    /**\n     * Returns the sine of the input.\n     */\n    fun sin(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.sin(value))\n    }\n\n    /**\n     * Returns the cosine of the input.\n     */\n    fun cos(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.cos(value))\n    }\n\n    /**\n     * Returns the tangent of the input.\n     */\n    fun tan(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.tan(value))\n    }\n\n    /**\n     * Returns the arcsine of the input.\n     */\n    fun asin(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.asin(value))\n    }\n\n    /**\n     * Returns the arccosine of the input.\n     */\n    fun acos(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.acos(value))\n    }\n\n    /**\n     * Returns the arctangent of the input.\n     */\n    fun atan(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.atan(value))\n    }\n\n    /**\n     * Returns the minimum value of the inputs.\n     */\n    fun min(vararg values: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.min(*values))\n    }\n\n    /**\n     * Returns the maximum value of the inputs.\n     */\n    fun max(vararg values: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.max(*values))\n    }\n\n    /**\n     * Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example,\n     * `[\"round\", -1.5]` evaluates to -2.\n     */\n    fun round(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.round(value))\n    }\n\n    /**\n     * Returns the absolute value of the input.\n     */\n    fun abs(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.abs(value))\n    }\n\n    /**\n     * Returns the smallest integer that is greater than or equal to the input.\n     */\n    fun ceil(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.ceil(value))\n    }\n\n    /**\n     * Returns the largest integer that is less than or equal to the input.\n     */\n    fun floor(value: Double): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.floor(value))\n    }\n\n    /**\n     * Returns `true` if the input string is expected to render legibly. Returns `false` if the input\n     * string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that\n     * require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use\n     * in Mapbox GL JS).\n     */\n    fun isSupportedScript(script: String): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.isSupportedScript(script))\n    }\n\n    /**\n     * Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the\n     * locale-insensitive case mappings in the Unicode Character Database.\n     */\n    fun upcase(value: String): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.upcase(value))\n    }\n\n    /**\n     * Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the\n     * locale-insensitive case mappings in the Unicode Character Database.\n     */\n    fun downcase(value: String): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.downcase(value))\n    }\n\n    /**\n     * Returns a `string` consisting of the concatenation of the inputs.\n     */\n    fun concat(vararg values: String): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.concat(*values))\n    }\n\n    /**\n     * Converts the input number into a string representation using the providing formatting rules. If set, the\n     * `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the\n     * `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `min-fraction-digits`\n     * and `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.\n     */\n    fun numberFormat(value: Double, block: NumberFormatBuilder.() -> Unit): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.numberFormat(value, block))\n    }\n\n    /**\n     * References variable bound using \"let\".\n     */\n    fun varExpression(value: String): ExpressionBuilder = apply {\n      this@ExpressionBuilder.arguments.add(Expression.varExpression(value))\n    }\n  }\n\n  /**\n   * Builder for Interpolate Expression.\n   *\n   * @param operator compulsory operator field for the builder\n   */\n  @ExpressionDsl\n  class InterpolatorBuilder(operator: String) : ExpressionBuilder(operator) {\n    /**\n     * Interpolates linearly between the pair of stops just less than and just greater than the input.\n     */\n    fun linear(): InterpolatorBuilder = apply {\n      this.arguments.add(Expression.linear())\n    }\n\n    /**\n     * Interpolates exponentially between the stops just less than and just greater than the input.\n     * `base` controls the rate at which the output increases:\n     * higher values make the output increase more towards the high end of the range.\n     * With values close to 1 the output increases linearly.\n     */\n    fun exponential(block: ExpressionBuilder.() -> Unit): InterpolatorBuilder = apply {\n      this.arguments.add(Expression.exponential(block))\n    }\n\n    /**\n     * Interpolates exponentially between the stops just less than and just greater than the input.\n     * `base` controls the rate at which the output increases:\n     * higher values make the output increase more towards the high end of the range.\n     * With values close to 1 the output increases linearly.\n     */\n    fun exponential(value: Double): InterpolatorBuilder = apply {\n      this.arguments.add(Expression.exponential(value))\n    }\n\n    /**\n     * Interpolates exponentially between the stops just less than and just greater than the input.\n     * `base` controls the rate at which the output increases:\n     * higher values make the output increase more towards the high end of the range.\n     * With values close to 1 the output increases linearly.\n     */\n    fun exponential(value: Expression): InterpolatorBuilder = apply {\n      this.arguments.add(Expression.exponential(value))\n    }\n\n    /**\n     * Interpolates using the cubic bezier curve defined by the given control points.\n     */\n    fun cubicBezier(block: ExpressionBuilder.() -> Unit): InterpolatorBuilder = apply {\n      this.arguments.add(Expression.cubicBezier(block))\n    }\n\n    /**\n     * Interpolates using the cubic bezier curve defined by the given control points.\n     */\n    fun cubicBezier(x1: Expression, x2: Expression, x3: Expression, x4: Expression): InterpolatorBuilder = apply {\n      this.arguments.add(Companion.cubicBezier(x1, x2, x3, x4))\n    }\n\n    /**\n     * Interpolates using the cubic bezier curve defined by the given control points.\n     */\n    fun cubicBezier(x1: Double, x2: Double, x3: Double, x4: Double): InterpolatorBuilder = apply {\n      this.arguments.add(Companion.cubicBezier(x1, x2, x3, x4))\n    }\n  }\n\n  /**\n   * Builder for Number Format expression.\n   *\n   * @param input the input as a number\n   */\n  @ExpressionDsl\n  class NumberFormatBuilder(private val input: Expression) : Builder(\"number-format\") {\n\n    private val options = HashMap<String, Value>()\n\n    /**\n     * Number formatting option for specifying the locale to use, as a BCP 47 language tag.\n     * @param locale the locale to use while performing number formatting\n     * @return number format builder\n     */\n    fun locale(locale: String): NumberFormatBuilder = apply {\n      this.options[\"locale\"] = literal(locale)\n    }\n\n    /**\n     * Number formatting option for specifying the locale to use, as a BCP 47 language tag.\n     * @param locale the locale to use while performing number formatting\n     * @return number format builder\n     */\n    fun locale(locale: Expression): NumberFormatBuilder = apply {\n      this.options[\"locale\"] = locale\n    }\n\n    /**\n     * Number formatting option for specifying the locale to use, as a BCP 47 language tag.\n     *\n     * @return number format builder\n     */\n    fun locale(block: ExpressionBuilder.() -> Unit): NumberFormatBuilder = apply {\n      this.options[\"locale\"] = string(block)\n    }\n\n    /**\n     * Number formatting option for specifying the currency to use, an ISO 4217 code.\n     *\n     * @param currency the currency to use while performing number formatting\n     * @return number format option\n     */\n    fun currency(currency: String): NumberFormatBuilder = apply {\n      this.options[\"currency\"] = literal(currency)\n    }\n\n    /**\n     * Number formatting option for specifying the currency to use, an ISO 4217 code.\n     *\n     * @param currency the currency to use while performing number formatting\n     * @return number format option\n     */\n    fun currency(currency: Expression): NumberFormatBuilder = apply {\n      this.options[\"currency\"] = currency\n    }\n\n    /**\n     * Number formatting option for specifying the currency to use, an ISO 4217 code.\n     *\n     * @return number format option\n     */\n    fun currency(block: ExpressionBuilder.() -> Unit): NumberFormatBuilder = apply {\n      this.options[\"currency\"] = string(block)\n    }\n\n    /**\n     * Number formatting options for specifying the minimum fraction digits to include.\n     *\n     * @param minFractionDigits the amount of minimum fraction digits to include\n     * @return number format option\n     */\n    fun minFractionDigits(minFractionDigits: Int): NumberFormatBuilder = apply {\n      this.options[\"min-fraction-digits\"] = literal(minFractionDigits.toLong())\n    }\n\n    /**\n     * Number formatting options for specifying the minimum fraction digits to include.\n     *\n     * @param minFractionDigits the amount of minimum fraction digits to include\n     * @return number format option\n     */\n    fun minFractionDigits(minFractionDigits: Expression): NumberFormatBuilder = apply {\n      this.options[\"min-fraction-digits\"] = minFractionDigits\n    }\n\n    /**\n     * Number formatting options for specifying the minimum fraction digits to include.\n     *\n     * @return number format option\n     */\n    fun minFractionDigits(block: ExpressionBuilder.() -> Unit): NumberFormatBuilder = apply {\n      this.options[\"min-fraction-digits\"] = number(block)\n    }\n\n    /**\n     * Number formatting options for specifying the minimum fraction digits to include.\n     *\n     * @param maxFractionDigits the amount of minimum fraction digits to include\n     * @return number format option\n     */\n    fun maxFractionDigits(maxFractionDigits: Int): NumberFormatBuilder = apply {\n      this.options[\"max-fraction-digits\"] = literal(maxFractionDigits.toLong())\n    }\n\n    /**\n     * Number formatting options for specifying the minimum fraction digits to include.\n     *\n     * @param maxFractionDigits the amount of minimum fraction digits to include\n     * @return number format option\n     */\n    fun maxFractionDigits(maxFractionDigits: Expression): NumberFormatBuilder = apply {\n      this.options[\"max-fraction-digits\"] = maxFractionDigits\n    }\n\n    /**\n     * Number formatting options for specifying the minimum fraction digits to include.\n     *\n     * @return number format option\n     */\n    fun maxFractionDigits(block: ExpressionBuilder.() -> Unit): NumberFormatBuilder = apply {\n      this.options[\"max-fraction-digits\"] = number(block)\n    }\n\n    /**\n     * Build the number-format expression.\n     */\n    override fun build(): Expression {\n      this.arguments.add(input)\n      this.arguments.add(Expression(options))\n      return super.build()\n    }\n  }\n\n  /**\n   * Builder for a Formatted Section.\n   *\n   * @param content the content of the FormattedSection as a text string literal or an image as Expression\n   */\n  @ExpressionDsl\n  class FormatSectionBuilder(private val content: Expression) {\n\n    private val options = HashMap<String, Value>()\n\n    /**\n     * If set, the font-scale argument specifies a scaling factor relative to the text-size\n     * specified in the root layout properties.\n     *\n     * \"font-scale\" is required to be of a resulting type number.\n     *\n     * @param fontScale\n     */\n    fun fontScale(fontScale: Double): FormatSectionBuilder = apply {\n      this.options[\"font-scale\"] = literal(fontScale)\n    }\n\n    /**\n     * If set, the font-scale argument specifies a scaling factor relative to the text-size\n     * specified in the root layout properties.\n     *\n     * \"font-scale\" is required to be of a resulting type number.\n     *\n     * @param fontScale\n     */\n    fun fontScale(fontScale: Expression): FormatSectionBuilder = apply {\n      this.options[\"font-scale\"] = fontScale\n    }\n\n    /**\n     * If set, the font-scale argument specifies a scaling factor relative to the text-size\n     * specified in the root layout properties.\n     *\n     * \"font-scale\" is required to be of a resulting type number.\n     */\n    fun fontScale(block: ExpressionBuilder.() -> Unit): FormatSectionBuilder = apply {\n      this.options[\"font-scale\"] = number(block)\n    }\n\n    /**\n     * If set, the text-font argument overrides the font specified by the root layout properties.\n     *\n     * \"text-font\" is required to be a literal array.\n     *\n     * The requested font stack has to be a part of the used style.\n     * For more information see [The online documentation](https://docs.mapbox.com/help/glossary/font-stack/).\n     *\n     * @param textFont\n     */\n    fun textFont(textFont: List<String>): FormatSectionBuilder = apply {\n      this.options[\"text-font\"] = literal(textFont)\n    }\n\n    /**\n     * If set, the text-font argument overrides the font specified by the root layout properties.\n     *\n     * \"text-font\" is required to be a literal array.\n     *\n     * The requested font stack has to be a part of the used style.\n     * For more information see [The online documentation](https://docs.mapbox.com/help/glossary/font-stack/).\n     *\n     * @param textFont\n     */\n    fun textFont(textFont: Expression): FormatSectionBuilder = apply {\n      this.options[\"text-font\"] = textFont\n    }\n\n    /**\n     * If set, the text-font argument overrides the font specified by the root layout properties.\n     *\n     * \"text-font\" is required to be a literal array.\n     *\n     * The requested font stack has to be a part of the used style.\n     * For more information see [The online documentation](https://docs.mapbox.com/help/glossary/font-stack/).\n     */\n    fun textFont(block: ExpressionBuilder.() -> Unit): FormatSectionBuilder = apply {\n      this.options[\"text-font\"] =\n        ExpressionBuilder(\"array\").addArgument(literal(\"string\")).apply(block).build()\n    }\n\n    /**\n     * If set, the text-color argument overrides the color specified by the root paint properties.\n     *\n     * @param textColor\n     */\n    fun textColor(@ColorInt textColor: Int): FormatSectionBuilder = apply {\n      this.options[\"text-color\"] = color(textColor)\n    }\n\n    /**\n     * If set, the text-color argument overrides the color specified by the root paint properties.\n     *\n     * @param textColor\n     */\n    fun textColor(textColor: String): FormatSectionBuilder = apply {\n      this.options[\"text-color\"] = literal(textColor)\n    }\n\n    /**\n     * If set, the text-color argument overrides the color specified by the root paint properties.\n     *\n     * @param textColor\n     */\n    fun textColor(textColor: Expression): FormatSectionBuilder = apply {\n      this.options[\"text-color\"] = textColor\n    }\n\n    /**\n     * If set, the text-color argument overrides the color specified by the root paint properties.\n     */\n    fun textColor(block: ExpressionBuilder.() -> Unit): FormatSectionBuilder = apply {\n      this.options[\"text-color\"] = toColor(block)\n    }\n\n    /**\n     * Build a list of expressions as one format section.\n     */\n    fun build(): List<Expression> {\n      return listOf(content, Expression(options))\n    }\n  }\n\n  /**\n   * Builder for Formatted TextField.\n   */\n  @ExpressionDsl\n  class FormatBuilder : Builder(\"format\") {\n    private val sections = ArrayList<Expression>()\n\n    /**\n     * A component of the Formatted expression.\n     *\n     * @param content displayed string or image as an Expression\n     */\n    fun formatSection(content: Expression): FormatBuilder = apply {\n      sections.addAll(FormatSectionBuilder(content).build())\n    }\n\n    /**\n     * A component of the Formatted expression.\n     *\n     * @param content displayed string or image as an Expression\n     */\n    fun formatSection(content: Expression, block: FormatSectionBuilder.() -> Unit): FormatBuilder = apply {\n      sections.addAll(FormatSectionBuilder(content).apply(block).build())\n    }\n\n    /**\n     * A component of the Formatted expression.\n     *\n     * @param text displayed string\n     */\n    fun formatSection(text: String): FormatBuilder = apply {\n      sections.addAll(FormatSectionBuilder(literal(text)).build())\n    }\n\n    /**\n     * A component of the Formatted expression.\n     *\n     * @param text displayed string\n     */\n    fun formatSection(text: String, block: FormatSectionBuilder.() -> Unit): FormatBuilder = apply {\n      sections.addAll(FormatSectionBuilder(literal(text)).apply(block).build())\n    }\n\n    /**\n     * Build the Format expression.\n     */\n    override fun build(): Expression {\n      this.arguments.addAll(sections)\n      return super.build()\n    }\n  }\n\n  /**\n   * Builder for Collator expression.\n   */\n  @ExpressionDsl\n  class CollatorBuilder : Builder(\"collator\") {\n    private val options = HashMap<String, Value>()\n\n    /**\n     * Set the case-sensitive option, default to false.\n     */\n    fun caseSensitive(caseSensitive: Expression): CollatorBuilder = apply {\n      options[\"case-sensitive\"] = caseSensitive\n    }\n\n    /**\n     * Set the case-sensitive option, default to false.\n     */\n    fun caseSensitive(block: ExpressionBuilder.() -> Unit): CollatorBuilder = apply {\n      options[\"case-sensitive\"] = boolean(block)\n    }\n\n    /**\n     * Set the case-sensitive option, default to false.\n     */\n    fun caseSensitive(caseSensitive: Boolean = false): CollatorBuilder = apply {\n      options[\"case-sensitive\"] = literal(caseSensitive)\n    }\n\n    /**\n     * Set the diacritic-sensitive option, default to false.\n     */\n    fun diacriticSensitive(diacriticSensitive: Expression): CollatorBuilder = apply {\n      options[\"diacritic-sensitive\"] = diacriticSensitive\n    }\n\n    /**\n     * Set the  diacritic-sensitive option, default to false.\n     */\n    fun diacriticSensitive(block: ExpressionBuilder.() -> Unit): CollatorBuilder = apply {\n      options[\"diacritic-sensitive\"] = boolean(block)\n    }\n\n    /**\n     * Set the diacritic-sensitive option, default to false.\n     */\n    fun diacriticSensitive(diacriticSensitive: Boolean = false): CollatorBuilder = apply {\n      options[\"diacritic-sensitive\"] = literal(diacriticSensitive)\n    }\n\n    /**\n     * Set the locale option.\n     */\n    fun locale(locale: Expression): CollatorBuilder = apply {\n      options[\"locale\"] = locale\n    }\n\n    /**\n     * Set the locale option.\n     */\n    fun locale(block: ExpressionBuilder.() -> Unit): CollatorBuilder = apply {\n      options[\"locale\"] = string(block)\n    }\n\n    /**\n     * Set the locale option.\n     */\n    fun locale(locale: String): CollatorBuilder = apply {\n      options[\"locale\"] = literal(locale)\n    }\n\n    /**\n     * Set the locale option.\n     */\n    fun locale(locale: Locale): CollatorBuilder = apply {\n      val localeStringBuilder = StringBuilder()\n\n      localeStringBuilder.append(locale.language)\n\n      val country = locale.country\n      if (country.isNotEmpty()) {\n        localeStringBuilder.append(\"-\")\n        localeStringBuilder.append(country)\n      }\n\n      options[\"locale\"] = literal(localeStringBuilder.toString())\n    }\n\n    /**\n     * Build the Collator expression.\n     */\n    override fun build(): Expression {\n      this.arguments.add(Expression(options))\n      return super.build()\n    }\n  }\n\n  /**\n   * Builder for Image expression options\n   */\n  @ExpressionDsl\n  class ImageBuilder : ExpressionBuilder(\"image\") {\n\n    /**\n     * Parameters to apply to the image.\n     * Currently, only applies to vector images and only color parameters are supported.\n     *\n     * @param pairs options for the image\n     */\n    @MapboxExperimental\n    fun imageOptions(vararg pairs: Pair<String, Expression>): ImageBuilder = apply {\n      arguments.add(Expression(hashMapOf(\"params\" to valueOf(hashMapOf(*pairs)))))\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /**\n     * Construct Expression from a raw string.\n     */\n    @JvmStatic\n    fun fromRaw(expression: String): Expression =\n      fromJson(expression).take().unwrapToExpression()\n\n    /**\n     * For two inputs, returns the result of subtracting the second input from the first. For a\n     * single input, returns the result of subtracting it from 0.\n     */\n    @JvmStatic\n    fun subtract(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"-\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"-\".\n     */\n    fun subtract(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"-\").apply(block).build()\n\n    /**\n     * Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.\n     */\n    @JvmStatic\n    fun not(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"!\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"!\".\n     */\n    fun not(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"!\").apply(block).build()\n\n    /**\n     * Returns `true` if the input values are not equal, `false` otherwise. The comparison is strictly typed:\n     * values of different runtime types are always considered unequal. Cases where the types are known to\n     * be different at parse time are considered invalid and will produce a parse error. Accepts an\n     * optional `collator` argument to control locale-dependent string comparisons.\n     */\n    @JvmStatic\n    fun neq(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"!=\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"!=\".\n     */\n    fun neq(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"!=\").apply(block).build()\n\n    /**\n     * Returns the product of the inputs.\n     */\n    @JvmStatic\n    fun product(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"*\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"*\".\n     */\n    fun product(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"*\").apply(block).build()\n\n    /**\n     * Returns the result of floating point division of the first input by the second.\n     */\n    @JvmStatic\n    fun division(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"/\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"/\".\n     */\n    fun division(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"/\").apply(block).build()\n\n    /**\n     * Returns the remainder after integer division of the first input by the second.\n     */\n    @JvmStatic\n    fun mod(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"%\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"%\".\n     */\n    fun mod(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"%\").apply(block).build()\n\n    /**\n     * Returns the result of raising the first input to the power specified by the second.\n     */\n    @JvmStatic\n    fun pow(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"^\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"^\".\n     */\n    fun pow(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"^\").apply(block).build()\n\n    /**\n     * Returns the sum of the inputs.\n     */\n    @JvmStatic\n    fun sum(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"+\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"+\".\n     */\n    fun sum(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"+\").apply(block).build()\n\n    /**\n     * Returns `true` if the first input is strictly less than the second, `false` otherwise. The arguments\n     * are required to be either both strings or both numbers; if during evaluation they are not,\n     * expression evaluation produces an error. Cases where this constraint is known not to hold at parse\n     * time are considered in valid and will produce a parse error. Accepts an optional `collator` argument\n     * to control locale-dependent string comparisons.\n     */\n    @JvmStatic\n    fun lt(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"<\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"<\".\n     */\n    fun lt(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"<\").apply(block).build()\n\n    /**\n     * Returns `true` if the first input is less than or equal to the second, `false` otherwise.\n     * The arguments are required to be either both strings or both numbers; if during evaluation they\n     * are not, expression evaluation produces an error. Cases where this constraint is known not to hold\n     * at parse time are considered in valid and will produce a parse error. Accepts an optional\n     * `collator` argument to control locale-dependent string comparisons.\n     */\n    @JvmStatic\n    fun lte(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"<=\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"<=\".\n     */\n    fun lte(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"<=\").apply(block).build()\n\n    /**\n     * Returns `true` if the input values are equal, `false` otherwise. The comparison is strictly typed: values\n     * of different runtime types are always considered unequal. Cases where the types are known to be\n     * different at parse time are considered invalid and will produce a parse error. Accepts an optional\n     * `collator` argument to control locale-dependent string comparisons.\n     */\n    @JvmStatic\n    fun eq(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"==\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"==\".\n     */\n    fun eq(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"==\").apply(block).build()\n\n    /**\n     * Returns `true` if the first input is strictly greater than the second, `false` otherwise. The arguments\n     * are required to be either both strings or both numbers; if during evaluation they are not,\n     * expression evaluation produces an error. Cases where this constraint is known not to hold at parse\n     * time are considered in valid and will produce a parse error. Accepts an optional `collator` argument\n     * to control locale-dependent string comparisons.\n     */\n    @JvmStatic\n    fun gt(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\">\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \">\".\n     */\n    fun gt(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\">\").apply(block).build()\n\n    /**\n     * Returns `true` if the first input is greater than or equal to the second, `false` otherwise.\n     * The arguments are required to be either both strings or both numbers; if during evaluation they\n     * are not, expression evaluation produces an error. Cases where this constraint is known not to hold\n     * at parse time are considered in valid and will produce a parse error. Accepts an optional\n     * `collator` argument to control locale-dependent string comparisons.\n     */\n    @JvmStatic\n    fun gte(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\">=\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \">=\".\n     */\n    fun gte(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\">=\").apply(block).build()\n\n    /**\n     * Returns the absolute value of the input.\n     */\n    @JvmStatic\n    fun abs(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"abs\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"abs\".\n     */\n    fun abs(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"abs\").apply(block).build()\n\n    /**\n     * Returns the value of a cluster property accumulated so far. Can only be used in the\n     * `clusterProperties` option of a clustered GeoJSON source.\n     */\n    @JvmStatic\n    fun accumulated(): Expression = ExpressionBuilder(\"accumulated\").build()\n\n    /**\n     * Returns the arccosine of the input, in radians between −π/2 and π/2.\n     */\n    @JvmStatic\n    fun acos(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"acos\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"acos\".\n     */\n    fun acos(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"acos\").apply(block).build()\n\n    /**\n     * Returns a string which matches one of the values specified in the text-anchor layout property, depending\n     * on the best-fit anchor for the symbol during rendering. Using this expression the content of the\n     * layer can be dynamically configured for the specific anchor type.\n     */\n    @JvmStatic\n    @MapboxExperimental\n    fun activeAnchor(): Expression = ExpressionBuilder(\"active-anchor\").build()\n\n    /**\n     * Returns `true` if all the inputs are `true`, `false` otherwise. The inputs are evaluated in order,\n     * and evaluation is short-circuiting: once an input expression evaluates to `false`, the result is `false` and\n     * no further input expressions are evaluated.\n     */\n    @JvmStatic\n    fun all(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"all\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"all\".\n     */\n    fun all(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"all\").apply(block).build()\n\n    /**\n     * Returns `true` if any of the inputs are `true`, `false` otherwise. The inputs are evaluated in\n     * order, and evaluation is short-circuiting: once an input expression evaluates to `true`, the result is `true`\n     * and no further input expressions are evaluated.\n     */\n    @JvmStatic\n    fun any(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"any\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"any\".\n     */\n    fun any(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"any\").apply(block).build()\n\n    /**\n     * Asserts that the input is an array (optionally with a specific item type and length). If,\n     * when the input expression is evaluated, it is not of the asserted type, then this assertion\n     * will cause the whole expression to be aborted.\n     */\n    @JvmStatic\n    fun array(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"array\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"array\".\n     */\n    fun array(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"array\").apply(block).build()\n\n    /**\n     * Returns the arcsine of the input, in radians between −π/2 and π/2.\n     */\n    @JvmStatic\n    fun asin(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"asin\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"asin\".\n     */\n    fun asin(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"asin\").apply(block).build()\n\n    /**\n     * Retrieves an item from an array.\n     */\n    @JvmStatic\n    fun at(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"at\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"at\".\n     */\n    fun at(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"at\").apply(block).build()\n\n    /**\n     * Retrieves an item from an array. If the array contains numeric values and the provided index\n     * is non-integer, the expression returns an interpolated value between adjacent items.\n     */\n    @JvmStatic\n    fun atInterpolated(vararg expressions: Expression): Expression {\n      val builder = InterpolatorBuilder(\"at-interpolated\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"at-interpolated\".\n     */\n    fun atInterpolated(block: InterpolatorBuilder.() -> Unit): Expression =\n      InterpolatorBuilder(\"at-interpolated\").apply(block).build()\n\n    /**\n     * Returns the arctangent of the input, in radians between −π/2 and π/2.\n     */\n    @JvmStatic\n    fun atan(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"atan\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"atan\".\n     */\n    fun atan(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"atan\").apply(block).build()\n\n    /**\n     * Asserts that the input value is a boolean. If multiple values are provided, each one is\n     * evaluated in order until a boolean is obtained. If none of the inputs are booleans, the\n     * expression is an error.\n     */\n    @JvmStatic\n    fun boolean(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"boolean\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"boolean\".\n     */\n    fun boolean(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"boolean\").apply(block).build()\n\n    /**\n     * Selects the first output whose corresponding test condition evaluates to true, or the fallback value otherwise.\n     */\n    @JvmStatic\n    fun switchCase(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"case\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"case\".\n     */\n    fun switchCase(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"case\").apply(block).build()\n\n    /**\n     * Returns the smallest integer that is greater than or equal to the input.\n     */\n    @JvmStatic\n    fun ceil(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"ceil\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"ceil\".\n     */\n    fun ceil(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"ceil\").apply(block).build()\n\n    /**\n     * Evaluates each expression in turn until the first valid value is obtained. Invalid values are `null`\n     * and [`'image'`](#types-image) expressions that are unavailable in the style. If all values are invalid, `coalesce` returns\n     * the first value listed.\n     */\n    @JvmStatic\n    fun coalesce(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"coalesce\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"coalesce\".\n     */\n    fun coalesce(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"coalesce\").apply(block).build()\n\n    /**\n     * Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to\n     * `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none\n     * is provided, the default locale is used. If the requested locale is not available, the `collator`\n     * will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.\n     */\n    @JvmStatic\n    fun collator(\n      caseSensitive: Boolean = false,\n      diacriticSensitive: Boolean = false,\n      locale: Locale\n    ): Expression {\n      return CollatorBuilder().caseSensitive(caseSensitive).diacriticSensitive(diacriticSensitive)\n        .locale(locale).build()\n    }\n\n    /**\n     * Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to\n     * `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none\n     * is provided, the default locale is used. If the requested locale is not available, the `collator`\n     * will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.\n     */\n    @JvmStatic\n    fun collator(\n      caseSensitive: Boolean = false,\n      diacriticSensitive: Boolean = false,\n      locale: String\n    ): Expression {\n      return CollatorBuilder().caseSensitive(caseSensitive).diacriticSensitive(diacriticSensitive)\n        .locale(locale).build()\n    }\n\n    /**\n     * Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to\n     * `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none\n     * is provided, the default locale is used. If the requested locale is not available, the `collator`\n     * will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.\n     */\n    @JvmStatic\n    fun collator(\n      caseSensitive: Expression,\n      diacriticSensitive: Expression,\n      locale: Expression\n    ): Expression {\n      return CollatorBuilder().caseSensitive(caseSensitive).diacriticSensitive(diacriticSensitive)\n        .locale(locale).build()\n    }\n\n    /**\n     * Dsl function for \"collator\".\n     */\n    fun collator(block: CollatorBuilder.() -> Unit): Expression {\n      return CollatorBuilder().apply(block).build()\n    }\n\n    /**\n     * Returns a `string` consisting of the concatenation of the inputs. Each input is converted to a\n     * string as if by `to-string`.\n     */\n    @JvmStatic\n    fun concat(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"concat\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"concat\".\n     */\n    fun concat(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"concat\").apply(block).build()\n\n    /**\n     * Retrieves the configuration value for the given option. Returns null if the requested option is missing.\n     */\n    @JvmStatic\n    fun config(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"config\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"config\".\n     */\n    fun config(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"config\").apply(block).build()\n\n    /**\n     * Returns the cosine of the input, interpreted as radians.\n     */\n    @JvmStatic\n    fun cos(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"cos\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"cos\".\n     */\n    fun cos(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"cos\").apply(block).build()\n\n    /**\n     * Returns the shortest distance in meters between the evaluated feature and the input geometry. The input\n     * value can be a valid GeoJSON of type `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`, `Feature`, or\n     * `FeatureCollection`. Distance values returned may vary in precision due to loss in precision from encoding geometries,\n     * particularly below zoom level 13.\n     */\n    @JvmStatic\n    fun distance(geojson: GeoJson): Expression {\n      val builder = ExpressionBuilder(\"distance\")\n      val expected = fromJson(geojson.toJson())\n      expected.value?.let {\n        @Suppress(\"UNCHECKED_CAST\")\n        builder.addArgument(Expression(it.contents as HashMap<String, Value>))\n        return builder.build()\n      }\n      throw MapboxStyleException(expected.error)\n    }\n\n    /**\n     * Returns the distance of a `symbol` instance from the center of the map. The distance is\n     * measured in pixels divided by the height of the map container. It measures 0 at the\n     * center, decreases towards the camera and increase away from the camera. For example, if the height\n     * of the map is 1000px, a value of -1 means 1000px away from the center towards\n     * the camera, and a value of 1 means a distance of 1000px away from the camera\n     * from the center. `[\"distance-from-center\"]` may only be used in the `filter` expression for a `symbol` layer.\n     */\n    @JvmStatic\n    fun distanceFromCenter(): Expression = ExpressionBuilder(\"distance-from-center\").build()\n\n    /**\n     * Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the\n     * locale-insensitive case mappings in the Unicode Character Database.\n     */\n    @JvmStatic\n    fun downcase(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"downcase\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"downcase\".\n     */\n    fun downcase(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"downcase\").apply(block).build()\n\n    /**\n     * Returns the mathematical constant e.\n     */\n    @JvmStatic\n    fun e(): Expression = ExpressionBuilder(\"e\").build()\n\n    /**\n     * Retrieves a property value from the current feature's state. Returns `null` if the requested property is\n     * not present on the feature's state. A feature's state is not part of the GeoJSON or\n     * vector tile data, and must be set programmatically on each feature. Features are identified by their\n     * `id` attribute, which must be an integer or a string that can be cast to an\n     * integer. Note that [\"feature-state\"] can only be used with paint properties that support data-driven styling.\n     */\n    @JvmStatic\n    fun featureState(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"feature-state\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"feature-state\".\n     */\n    fun featureState(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"feature-state\").apply(block).build()\n\n    /**\n     * Returns the largest integer that is less than or equal to the input.\n     */\n    @JvmStatic\n    fun floor(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"floor\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"floor\".\n     */\n    fun floor(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"floor\").apply(block).build()\n\n    /**\n     * Returns a `formatted` string for displaying mixed-format text in the `text-field` property. The input may contain\n     * a string literal or expression, including an [`'image'`](#types-image) expression. Strings may be followed by a style\n     * override object that supports the following properties:\n     * - `\"text-font\"`: Overrides the font stack specified by the root layout property.\n     * - `\"text-color\"`: Overrides the color specified by the root paint property.\n     * - `\"font-scale\"`: Applies a scaling factor on `text-size` as specified by the root layout property.\n     */\n    @JvmStatic\n    fun format(vararg formatSections: FormatSection): Expression {\n      val builder = FormatBuilder()\n      formatSections.forEach { section ->\n        val sectionBuilder = FormatSectionBuilder(section.content)\n        section.fontScale?.let { sectionBuilder.fontScale(it) }\n        section.textFont?.let { sectionBuilder.textFont(it) }\n        section.textColor?.let { sectionBuilder.textColor(it) }\n        builder.arguments.addAll(sectionBuilder.build())\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"format\".\n     */\n    fun format(block: FormatBuilder.() -> Unit): Expression =\n      FormatBuilder().apply(block).build()\n\n    /**\n     * Returns the feature's geometry type: `Point`, `LineString` or `Polygon`. `Multi-` feature types return the singular forms.\n     */\n    @JvmStatic\n    fun geometryType(): Expression = ExpressionBuilder(\"geometry-type\").build()\n\n    /**\n     * Retrieves a property value from the current feature's properties, or from another object if a second\n     * argument is provided. Returns `null` if the requested property is missing.\n     */\n    @JvmStatic\n    fun get(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"get\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"get\".\n     */\n    fun get(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"get\").apply(block).build()\n\n    /**\n     * Tests for the presence of an property value in the current feature's properties, or from another\n     * object if a second argument is provided.\n     */\n    @JvmStatic\n    fun has(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"has\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"has\".\n     */\n    fun has(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"has\").apply(block).build()\n\n    /**\n     * Returns the kernel density estimation of a pixel in a heatmap layer, which is a relative\n     * measure of how many data points are crowded around a particular pixel. Can only be used\n     * in the `heatmap-color` property.\n     */\n    @JvmStatic\n    fun heatmapDensity(): Expression = ExpressionBuilder(\"heatmap-density\").build()\n\n    /**\n     * Creates a color value from hue (range 0-360), saturation and lightness components (range 0-100), and an\n     * alpha component of 1. If any component is out of range, the expression is an error.\n     */\n    @JvmStatic\n    fun hsl(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"hsl\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"hsl\".\n     */\n    fun hsl(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"hsl\").apply(block).build()\n\n    /**\n     * Creates a color value from hue (range 0-360), saturation and lightness components (range 0-100), and an\n     * alpha component (range 0-1). If any component is out of range, the expression is an error.\n     */\n    @JvmStatic\n    fun hsla(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"hsla\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"hsla\".\n     */\n    fun hsla(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"hsla\").apply(block).build()\n\n    /**\n     * Returns the feature's id, if it has one.\n     */\n    @JvmStatic\n    fun id(): Expression = ExpressionBuilder(\"id\").build()\n\n    /**\n     * Returns a [`ResolvedImage`](/style-spec/reference/types/#resolvedimage) for use in [`icon-image`](/style-spec/reference/layers/#layout-symbol-icon-image), `--pattern` entries, and as a section in the [`'format'`](#types-format)\n     * expression.\n     *\n     * A [`'coalesce'`](#coalesce) expression containing `image` expressions will evaluate to the first listed image that is currently\n     * in the style. This validation process is synchronous and requires the image to have been added\n     * to the style before requesting it in the `'image'` argument.\n     *\n     * Every image name can be followed by an optional [`ImageOptions`](/style-spec/reference/types/#imageoptions) object, which will be used for\n     * vector images only.\n     *\n     * To implement crossfading between two images within a symbol layer using the [`icon-image-cross-fade`](/style-spec/reference/layers/#paint-symbol-icon-image-cross-fade) attribute, include a\n     * second image as the second argument in the `'image'` expression.\n     */\n    @JvmStatic\n    fun image(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"image\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * Returns a [`ResolvedImage`](/style-spec/reference/types/#resolvedimage) for use in [`icon-image`](/style-spec/reference/layers/#layout-symbol-icon-image), `--pattern` entries, and as a section in the [`'format'`](#types-format)\n     * expression.\n     *\n     * A [`'coalesce'`](#coalesce) expression containing `image` expressions will evaluate to the first listed image that is currently\n     * in the style. This validation process is synchronous and requires the image to have been added\n     * to the style before requesting it in the `'image'` argument.\n     *\n     * Every image name can be followed by an optional [`ImageOptions`](/style-spec/reference/types/#imageoptions) object, which will be used for\n     * vector images only.\n     *\n     * To implement crossfading between two images within a symbol layer using the [`icon-image-cross-fade`](/style-spec/reference/layers/#paint-symbol-icon-image-cross-fade) attribute, include a\n     * second image as the second argument in the `'image'` expression.\n     */\n    @MapboxExperimental\n    @JvmStatic\n    fun image(\n      image: Expression,\n      options: Map<String, Expression>\n    ): Expression {\n      val builder = ImageBuilder()\n      builder.addArgument(image)\n      builder.imageOptions(*options.map { it.key to it.value }.toTypedArray())\n      return builder.build()\n    }\n\n    /**\n     * Returns a [`ResolvedImage`](/style-spec/reference/types/#resolvedimage) for use in [`icon-image`](/style-spec/reference/layers/#layout-symbol-icon-image), `--pattern` entries, and as a section in the [`'format'`](#types-format)\n     * expression.\n     *\n     * A [`'coalesce'`](#coalesce) expression containing `image` expressions will evaluate to the first listed image that is currently\n     * in the style. This validation process is synchronous and requires the image to have been added\n     * to the style before requesting it in the `'image'` argument.\n     *\n     * Every image name can be followed by an optional [`ImageOptions`](/style-spec/reference/types/#imageoptions) object, which will be used for\n     * vector images only.\n     *\n     * To implement crossfading between two images within a symbol layer using the [`icon-image-cross-fade`](/style-spec/reference/layers/#paint-symbol-icon-image-cross-fade) attribute, include a\n     * second image as the second argument in the `'image'` expression.\n     */\n    @MapboxExperimental\n    @JvmStatic\n    fun image(\n      image: Expression,\n      options: Map<String, Expression>,\n      image2: Expression,\n      options2: Map<String, Expression>\n    ): Expression {\n      val builder = ImageBuilder()\n        builder.addArgument(image)\n        builder.imageOptions(*options.map { it.key to it.value }.toTypedArray())\n        builder.addArgument(image2)\n        builder.imageOptions(*options2.map { it.key to it.value }.toTypedArray())\n        return builder.build()\n    }\n\n    /**\n     * DSL function for \"image\".\n     */\n    fun image(block: ImageBuilder.() -> Unit): Expression =\n      ImageBuilder().apply(block).build()\n\n    /**\n     * Determines whether an item exists in an array or a substring exists in a string. In\n     * the specific case when the second and third arguments are string literals, you must wrap at\n     * least one of them in a [`literal`](#types-literal) expression to hint correct interpretation to the [type system](#type-system).\n     */\n    @JvmStatic\n    fun inExpression(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"in\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"in\".\n     */\n    fun inExpression(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"in\").apply(block).build()\n\n    /**\n     * Returns the first position at which an item can be found in an array or a\n     * substring can be found in a string, or `-1` if the input cannot be found. Accepts\n     * an optional index from where to begin the search.\n     */\n    @JvmStatic\n    fun indexOf(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"index-of\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"index-of\".\n     */\n    fun indexOf(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"index-of\").apply(block).build()\n\n    /**\n     * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). The `input`\n     * may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly\n     * ascending order. The output type must be `number`, `array<number>`, or `color`.\n     *\n     * Interpolation types:\n     * - `[\"linear\"]`: Interpolates linearly between the pair of stops just less than and just greater than\n     * the input.\n     * - `[\"exponential\", base]`: Interpolates exponentially between the stops just less than and just greater than the\n     * input. `base` controls the rate at which the output increases: higher values make the output increase\n     * more towards the high end of the range. With values close to 1 the output increases\n     * linearly.\n     * - `[\"cubic-bezier\", x1, y1, x2, y2]`: Interpolates using the cubic bezier curve defined by the given\n     * control points.\n     */\n    @JvmStatic\n    fun interpolate(vararg expressions: Expression): Expression {\n      val builder = InterpolatorBuilder(\"interpolate\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"interpolate\".\n     */\n    fun interpolate(block: InterpolatorBuilder.() -> Unit): Expression =\n      InterpolatorBuilder(\"interpolate\").apply(block).build()\n\n    /**\n     * Returns `true` if the input string is expected to render legibly. Returns `false` if the input\n     * string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that\n     * require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use\n     * in Mapbox GL JS).\n     */\n    @JvmStatic\n    fun isSupportedScript(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"is-supported-script\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"is-supported-script\".\n     */\n    fun isSupportedScript(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"is-supported-script\").apply(block).build()\n\n    /**\n     * Returns the length of an array or string.\n     */\n    @JvmStatic\n    fun length(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"length\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"length\".\n     */\n    fun length(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"length\").apply(block).build()\n\n    /**\n     * Binds expressions to named variables, which can then be referenced in the result expression using [\"var\",\n     * \"variable_name\"].\n     */\n    @JvmStatic\n    fun letExpression(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"let\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"let\".\n     */\n    fun letExpression(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"let\").apply(block).build()\n\n    /**\n     * Returns the progress along a gradient line. Can only be used in the `line-gradient` and `line-z-offset`\n     * properties.\n     */\n    @JvmStatic\n    fun lineProgress(): Expression = ExpressionBuilder(\"line-progress\").build()\n\n    /**\n     * Provides a literal array or object value.\n     */\n    @JvmStatic\n    fun literal(value: Double): Expression {\n      return Expression(value)\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    @JvmStatic\n    fun literal(value: Long): Expression {\n      return Expression(value)\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    @JvmStatic\n    fun literal(value: Boolean): Expression {\n      return Expression(value)\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    @JvmStatic\n    fun literal(value: String): Expression {\n      return Expression(value)\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    @JvmStatic\n    internal fun literal(value: List<Any>): Expression {\n      return ExpressionBuilder(\"literal\").addArgument(Expression(value)).build()\n    }\n\n    /**\n     * Provides a literal array or object value.\n     */\n    @JvmStatic\n    internal fun literal(value: HashMap<String, Any>): Expression {\n      val map = HashMap<String, Value>()\n      for ((k, v) in value) {\n        map[k] = TypeUtils.wrapToValue(v)\n      }\n      return ExpressionBuilder(\"literal\").addArgument(Expression(map)).build()\n    }\n\n    /**\n     * Returns the natural logarithm of the input.\n     */\n    @JvmStatic\n    fun ln(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"ln\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"ln\".\n     */\n    fun ln(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"ln\").apply(block).build()\n\n    /**\n     * Returns mathematical constant ln(2).\n     */\n    @JvmStatic\n    fun ln2(): Expression = ExpressionBuilder(\"ln2\").build()\n\n    /**\n     * Returns the base-ten logarithm of the input.\n     */\n    @JvmStatic\n    fun log10(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"log10\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"log10\".\n     */\n    fun log10(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"log10\").apply(block).build()\n\n    /**\n     * Returns the base-two logarithm of the input.\n     */\n    @JvmStatic\n    fun log2(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"log2\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"log2\".\n     */\n    fun log2(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"log2\").apply(block).build()\n\n    /**\n     * Selects the output for which the label value matches the input value, or the fallback value\n     * if no match is found. The input can be any expression (for example, `[\"get\", \"building_type\"]`). Each\n     * label must be unique, and must be either:\n     *  - a single literal value; or\n     *  - an array of literal values, the values of which must be all strings or\n     * all numbers (for example `[100, 101]` or `[\"c\", \"b\"]`).\n     *\n     * The input matches if any of the values in the array matches using strict equality, similar\n     * to the `\"in\"` operator.\n     * If the input type does not match the type of the labels, the result will be\n     * the fallback value.\n     */\n    @JvmStatic\n    fun match(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"match\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"match\".\n     */\n    fun match(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"match\").apply(block).build()\n\n    /**\n     * Returns the maximum value of the inputs.\n     */\n    @JvmStatic\n    fun max(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"max\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"max\".\n     */\n    fun max(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"max\").apply(block).build()\n\n    /**\n     * Returns a requested property of the light configuration based on the supplied options. Currently the only\n     * supported option is `brightness` which returns the global brightness value of the lights on a scale\n     * of 0 to 1, where 0 means total darkness and 1 means full brightness. This expression\n     * works only with 3D light, i.e. when `lights` root property is defined.\n     */\n    @JvmStatic\n    fun measureLight(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"measure-light\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"measure-light\".\n     */\n    fun measureLight(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"measure-light\").apply(block).build()\n\n    /**\n     * Returns the minimum value of the inputs.\n     */\n    @JvmStatic\n    fun min(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"min\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"min\".\n     */\n    fun min(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"min\").apply(block).build()\n\n    /**\n     * Asserts that the input value is a number. If multiple values are provided, each one is\n     * evaluated in order until a number is obtained. If none of the inputs are numbers, the\n     * expression is an error.\n     */\n    @JvmStatic\n    fun number(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"number\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"number\".\n     */\n    fun number(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"number\").apply(block).build()\n\n    /**\n     * Converts the input number into a string representation using the providing formatting rules. If set, the\n     * `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the\n     * `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `unit`\n     * argument specifies a [simple ECMAScript unit](https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier) to use for unit-style formatting. If set, the `min-fraction-digits` and\n     * `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.\n     */\n    @JvmStatic\n    fun numberFormat(\n      number: Expression,\n      locale: Expression? = null,\n      currency: Expression? = null,\n      minFractionDigits: Expression? = null,\n      maxFractionDigits: Expression? = null\n    ): Expression {\n      val builder = NumberFormatBuilder(number)\n      locale?.let { builder.locale(it) }\n      currency?.let { builder.currency(it) }\n      minFractionDigits?.let { builder.minFractionDigits(it) }\n      maxFractionDigits?.let { builder.maxFractionDigits(it) }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"number-format\".\n     */\n    fun numberFormat(number: Expression, block: NumberFormatBuilder.() -> Unit): Expression =\n      NumberFormatBuilder(number).apply(block).build()\n\n    /**\n     * Asserts that the input value is an object. If multiple values are provided, each one is\n     * evaluated in order until an object is obtained. If none of the inputs are objects, the\n     * expression is an error.\n     */\n    @JvmStatic\n    fun objectExpression(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"object\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"object\".\n     */\n    fun objectExpression(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"object\").apply(block).build()\n\n    /**\n     * Returns the mathematical constant pi.\n     */\n    @JvmStatic\n    fun pi(): Expression = ExpressionBuilder(\"pi\").build()\n\n    /**\n     * Returns the current pitch in degrees. `[\"pitch\"]` may only be used in the `filter` expression for\n     * a `symbol` layer.\n     */\n    @JvmStatic\n    fun pitch(): Expression = ExpressionBuilder(\"pitch\").build()\n\n    /**\n     * Returns the feature properties object. Note that in some cases, it may be more efficient to\n     * use `[\"get\", \"property_name\"]` directly.\n     */\n    @JvmStatic\n    fun properties(): Expression = ExpressionBuilder(\"properties\").build()\n\n    /**\n     * Returns a random value in the specified range (first two input numbers) based on a supplied\n     * seed (third input). The seed can be an expression or a constant number or string value.\n     */\n    @JvmStatic\n    fun random(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"random\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"random\".\n     */\n    fun random(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"random\").apply(block).build()\n\n    /**\n     * Returns the length of the particle velocity vector. Can only be used in the `raster-particle-color` property.\n     */\n    @JvmStatic\n    fun rasterParticleSpeed(): Expression = ExpressionBuilder(\"raster-particle-speed\").build()\n\n    /**\n     * Returns the raster value of a pixel computed via `raster-color-mix`. Can only be used in the\n     * `raster-color` property.\n     */\n    @JvmStatic\n    fun rasterValue(): Expression = ExpressionBuilder(\"raster-value\").build()\n\n    /**\n     * Returns the IETF language tag of the locale being used by the provided `collator`. This can\n     * be used to determine the default system locale, or to determine if a requested locale was\n     * successfully loaded.\n     */\n    @JvmStatic\n    fun resolvedLocale(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"resolved-locale\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"resolved-locale\".\n     */\n    fun resolvedLocale(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"resolved-locale\").apply(block).build()\n\n    /**\n     * Creates a color value from red, green, and blue components, which must range between 0 and\n     * 255, and an alpha component of 1. If any component is out of range, the expression\n     * is an error.\n     */\n    @JvmStatic\n    fun rgb(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"rgb\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"rgb\".\n     */\n    fun rgb(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"rgb\").apply(block).build()\n\n    /**\n     * Creates a color value from red, green, blue components, which must range between 0 and 255,\n     * and an alpha component which must range between 0 and 1. If any component is out\n     * of range, the expression is an error.\n     */\n    @JvmStatic\n    fun rgba(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"rgba\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"rgba\".\n     */\n    fun rgba(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"rgba\").apply(block).build()\n\n    /**\n     * Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example,\n     * `[\"round\", -1.5]` evaluates to -2.\n     */\n    @JvmStatic\n    fun round(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"round\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"round\".\n     */\n    fun round(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"round\").apply(block).build()\n\n    /**\n     * Returns the sine of the input, interpreted as radians.\n     */\n    @JvmStatic\n    fun sin(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"sin\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"sin\".\n     */\n    fun sin(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"sin\").apply(block).build()\n\n    /**\n     * Returns the distance of a point on the sky from the sun position. Returns 0 at\n     * sun position and 1 when the distance reaches `sky-gradient-radius`. Can only be used in the `sky-gradient`\n     * property.\n     */\n    @JvmStatic\n    fun skyRadialProgress(): Expression = ExpressionBuilder(\"sky-radial-progress\").build()\n\n    /**\n     * Returns an item from an array or a substring from a string from a specified start\n     * index, or between a start index and an end index if set. The return value is\n     * inclusive of the start index but not of the end index.\n     */\n    @JvmStatic\n    fun slice(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"slice\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"slice\".\n     */\n    fun slice(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"slice\").apply(block).build()\n\n    /**\n     * Returns an array of substrings from a string, split by a delimiter parameter.\n     */\n    @JvmStatic\n    fun split(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"split\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"split\".\n     */\n    fun split(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"split\").apply(block).build()\n\n    /**\n     * Returns the square root of the input.\n     */\n    @JvmStatic\n    fun sqrt(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"sqrt\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"sqrt\".\n     */\n    fun sqrt(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"sqrt\").apply(block).build()\n\n    /**\n     * Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of input and output\n     * values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be\n     * numeric literals in strictly ascending order. Returns the output value of the stop just less than\n     * the input, or the first output if the input is less than the first stop.\n     */\n    @JvmStatic\n    fun step(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"step\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"step\".\n     */\n    fun step(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"step\").apply(block).build()\n\n    /**\n     * Asserts that the input value is a string. If multiple values are provided, each one is\n     * evaluated in order until a string is obtained. If none of the inputs are strings, the\n     * expression is an error.\n     */\n    @JvmStatic\n    fun string(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"string\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"string\".\n     */\n    fun string(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"string\").apply(block).build()\n\n    /**\n     * Returns the tangent of the input, interpreted as radians.\n     */\n    @JvmStatic\n    fun tan(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"tan\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"tan\".\n     */\n    fun tan(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"tan\").apply(block).build()\n\n    /**\n     * Converts the input value to a boolean. The result is `false` when then input is an\n     * empty string, 0, `false`, `null`, or `NaN`; otherwise it is `true`.\n     */\n    @JvmStatic\n    fun toBoolean(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"to-boolean\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"to-boolean\".\n     */\n    fun toBoolean(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"to-boolean\").apply(block).build()\n\n    /**\n     * Converts the input value to a color. If multiple values are provided, each one is evaluated\n     * in order until the first successful conversion is obtained. If none of the inputs can be\n     * converted, the expression is an error.\n     */\n    @JvmStatic\n    fun toColor(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"to-color\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"to-color\".\n     */\n    fun toColor(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"to-color\").apply(block).build()\n\n    /**\n     * Returns a four-element array containing the input color's Hue, Saturation, Luminance and alpha components, in that\n     * order.\n     */\n    @JvmStatic\n    fun toHsla(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"to-hsla\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"to-hsla\".\n     */\n    fun toHsla(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"to-hsla\").apply(block).build()\n\n    /**\n     * Converts the input value to a number, if possible. If the input is `null` or `false`,\n     * the result is 0. If the input is `true`, the result is 1. If the input\n     * is a string, it is converted to a number as specified by the [\"ToNumber Applied to\n     * the String Type\" algorithm](https://tc39.github.io/ecma262/#sec-tonumber-applied-to-the-string-type) of the ECMAScript Language Specification. If multiple values are provided, each one\n     * is evaluated in order until the first successful conversion is obtained. If none of the inputs\n     * can be converted, the expression is an error.\n     */\n    @JvmStatic\n    fun toNumber(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"to-number\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"to-number\".\n     */\n    fun toNumber(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"to-number\").apply(block).build()\n\n    /**\n     * Returns a four-element array containing the input color's red, green, blue, and alpha components, in that\n     * order.\n     */\n    @JvmStatic\n    fun toRgba(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"to-rgba\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"to-rgba\".\n     */\n    fun toRgba(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"to-rgba\").apply(block).build()\n\n    /**\n     * Converts the input value to a string. If the input is `null`, the result is `\"\"`.\n     * If the input is a [`boolean`](#types-boolean), the result is `\"true\"` or `\"false\"`. If the input is\n     * a number, it is converted to a string as specified by the [\"NumberToString\" algorithm](https://tc39.github.io/ecma262/#sec-tostring-applied-to-the-number-type) of the\n     * ECMAScript Language Specification. If the input is a [`color`](#color), it is converted to a string of\n     * the form `\"rgba(r,g,b,a)\"`, where `r`, `g`, and `b` are numerals ranging from 0 to 255, and\n     * `a` ranges from 0 to 1. If the input is an [`'image'`](#types-image) expression, `'to-string'` returns the\n     * image name. Otherwise, the input is converted to a string in the format specified by the\n     * [`JSON.stringify`](https://tc39.github.io/ecma262/#sec-json.stringify) function of the ECMAScript Language Specification.\n     */\n    @JvmStatic\n    fun toString(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"to-string\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"to-string\".\n     */\n    fun toString(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"to-string\").apply(block).build()\n\n    /**\n     * Returns a string describing the type of the given value.\n     */\n    @JvmStatic\n    fun typeofExpression(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"typeof\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"typeof\".\n     */\n    fun typeofExpression(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"typeof\").apply(block).build()\n\n    /**\n     * Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the\n     * locale-insensitive case mappings in the Unicode Character Database.\n     */\n    @JvmStatic\n    fun upcase(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"upcase\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"upcase\".\n     */\n    fun upcase(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"upcase\").apply(block).build()\n\n    /**\n     * References variable bound using \"let\".\n     */\n    @JvmStatic\n    fun varExpression(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"var\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"var\".\n     */\n    fun varExpression(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"var\").apply(block).build()\n\n    /**\n     * Returns `true` if the evaluated feature is fully contained inside a boundary of the input geometry,\n     * `false` otherwise. The input value can be a valid GeoJSON of type `Polygon`, `MultiPolygon`, `Feature`, or\n     * `FeatureCollection`. Supported features for evaluation:\n     * - `Point`: Returns `false` if a point is on the boundary or falls outside the boundary.\n     * - `LineString`: Returns `false` if any part of a line falls outside the boundary, the line\n     * intersects the boundary, or a line's endpoint is on the boundary.\n     */\n    @JvmStatic\n    fun within(geometry: Geometry): Expression {\n      val builder = ExpressionBuilder(\"within\")\n      val expected = fromJson(geometry.toJson())\n      expected.value?.let {\n        @Suppress(\"UNCHECKED_CAST\")\n        builder.addArgument(Expression(it.contents as HashMap<String, Value>))\n        return builder.build()\n      }\n      throw MapboxStyleException(expected.error)\n    }\n\n    /**\n     * Returns the current worldview being used.\n     */\n    @JvmStatic\n    @MapboxExperimental\n    fun worldview(vararg expressions: Expression): Expression {\n      val builder = ExpressionBuilder(\"worldview\")\n      expressions.forEach {\n        builder.addArgument(it)\n      }\n      return builder.build()\n    }\n\n    /**\n     * DSL function for \"worldview\".\n     */\n    fun worldview(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"worldview\").apply(block).build()\n\n    /**\n     * Returns the current zoom level. Note that in style layout and paint properties, [\"zoom\"] may only\n     * appear as the input to a top-level \"step\" or \"interpolate\" expression.\n     */\n    @JvmStatic\n    fun zoom(): Expression = ExpressionBuilder(\"zoom\").build()\n\n    /**\n     * Construct a RGB color expression from numbers.\n     */\n    @JvmStatic\n    fun rgb(red: Double, green: Double, blue: Double): Expression {\n      return ExpressionBuilder(\"rgb\")\n        .addArgument(literal(red))\n        .addArgument(literal(green))\n        .addArgument(literal(blue))\n        .build()\n    }\n\n    /**\n     * Construct a RGBA color expression from numbers.\n     */\n    @JvmStatic\n    fun rgba(red: Double, green: Double, blue: Double, alpha: Double): Expression {\n      return ExpressionBuilder(\"rgba\")\n        .addArgument(literal(red))\n        .addArgument(literal(green))\n        .addArgument(literal(blue))\n        .addArgument(literal(alpha))\n        .build()\n    }\n\n    /**\n     * Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of input and output\n     * values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be\n     * numeric literals in strictly ascending order. Returns the output value of the stop just less than\n     * the input, or the first output if the input is less than the first stop.\n     */\n    @JvmStatic\n    fun step(input: Expression, output: Expression, vararg stops: Pair<Expression, Expression>): Expression {\n      val builder = ExpressionBuilder(\"step\")\n        .addArgument(input)\n        .addArgument(output)\n      stops.forEach {\n        builder.addArgument(it.first)\n        builder.addArgument(it.second)\n      }\n      return builder.build()\n    }\n\n    /**\n     * Selects the first output whose corresponding test condition evaluates to true, or the fallback value otherwise.\n     */\n    @JvmStatic\n    fun switchCase(vararg stops: Pair<Expression, Expression>, fallback: Expression): Expression {\n      val builder = ExpressionBuilder(\"case\")\n      stops.forEach {\n        builder.addArgument(it.first)\n        builder.addArgument(it.second)\n      }\n      builder.addArgument(fallback)\n      return builder.build()\n    }\n\n    /**\n     * Selects the output for which the label value matches the input value, or the fallback value\n     * if no match is found. The input can be any expression (for example, `[\"get\", \"building_type\"]`). Each\n     * label must be unique, and must be either:\n     * - a single literal value; or\n     * - an array of literal values, the values of which must be all strings or\n     * all numbers (for example `[100, 101]` or `[\"c\", \"b\"]`).\n     *\n     * The input matches if any of the values in the array matches using strict equality, similar\n     * to the `\"in\"` operator.\n     * If the input type does not match the type of the labels, the result will be\n     * the fallback value.\n     */\n    @JvmStatic\n    fun match(input: Expression, vararg stops: Pair<Expression, Expression>, fallback: Expression): Expression {\n      val builder = ExpressionBuilder(\"match\")\n      builder.addArgument(input)\n      stops.forEach {\n        builder.addArgument(it.first)\n        builder.addArgument(it.second)\n      }\n      builder.addArgument(fallback)\n      return builder.build()\n    }\n\n    /**\n     * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). The `input`\n     * may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly\n     * ascending order. The output type must be `number`, `array<number>`, or `color`.\n     *\n     * [linearInterpolator] interpolates linearly between the pair of stops just less than and just greater than\n     * the input.\n     */\n    @JvmStatic\n    fun linearInterpolator(\n      input: Expression,\n      vararg stops: Pair<Expression, Expression>\n    ): Expression {\n      val builder = InterpolatorBuilder(\"interpolate\").apply { linear() }\n      builder.addArgument(input)\n      stops.forEach {\n        builder.addArgument(it.first)\n        builder.addArgument(it.second)\n      }\n      return builder.build()\n    }\n\n    /**\n     * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). The `input`\n     * may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly\n     * ascending order. The output type must be `number`, `array<number>`, or `color`.\n     *\n     * [exponentialInterpolator] interpolates exponentially between the stops just less than and just greater than the\n     * input. `base` controls the rate at which the output increases: higher values make the output increase\n     * more towards the high end of the range. With values close to 1 the output increases\n     * linearly.\n     */\n    @JvmStatic\n    fun exponentialInterpolator(\n      base: Expression,\n      input: Expression,\n      vararg stops: Pair<Expression, Expression>\n    ): Expression {\n      val builder = InterpolatorBuilder(\"interpolate\").apply { exponential(base) }\n      builder.addArgument(input)\n      stops.forEach {\n        builder.addArgument(it.first)\n        builder.addArgument(it.second)\n      }\n      return builder.build()\n    }\n\n    /**\n     * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). The `input`\n     * may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly\n     * ascending order. The output type must be `number`, `array<number>`, or `color`.\n     *\n     * [exponentialInterpolator] interpolates exponentially between the stops just less than and just greater than the\n     * input. `base` controls the rate at which the output increases: higher values make the output increase\n     * more towards the high end of the range. With values close to 1 the output increases\n     * linearly.\n     */\n    @JvmStatic\n    fun exponentialInterpolator(\n      base: Double,\n      input: Expression,\n      vararg stops: Pair<Expression, Expression>\n    ): Expression {\n      val builder = InterpolatorBuilder(\"interpolate\").apply { exponential(base) }\n      builder.addArgument(input)\n      stops.forEach {\n        builder.addArgument(it.first)\n        builder.addArgument(it.second)\n      }\n      return builder.build()\n    }\n\n    /**\n     * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). The `input`\n     * may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly\n     * ascending order. The output type must be `number`, `array<number>`, or `color`.\n     *\n     * [cubicBezierInterpolator] interpolates using the cubic bezier curve defined by the given control points.\n     */\n    @JvmStatic\n    fun cubicBezierInterpolator(\n      x1: Expression,\n      y1: Expression,\n      x2: Expression,\n      y2: Expression,\n      input: Expression,\n      vararg stops: Pair<Expression, Expression>\n    ): Expression {\n      val builder = InterpolatorBuilder(\"interpolate\").apply { cubicBezier(x1, y1, x2, y2) }\n      builder.addArgument(input)\n      stops.forEach {\n        builder.addArgument(it.first)\n        builder.addArgument(it.second)\n      }\n      return builder.build()\n    }\n\n    /**\n     * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). The `input`\n     * may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly\n     * ascending order. The output type must be `number`, `array<number>`, or `color`.\n     *\n     * [cubicBezierInterpolator] interpolates using the cubic bezier curve defined by the given control points.\n     */\n    @JvmStatic\n    fun cubicBezierInterpolator(\n      x1: Double,\n      y1: Double,\n      x2: Double,\n      y2: Double,\n      input: Expression,\n      vararg stops: Pair<Expression, Expression>\n    ): Expression {\n      val builder = InterpolatorBuilder(\"interpolate\").apply { cubicBezier(x1, y1, x2, y2) }\n      builder.addArgument(input)\n      stops.forEach {\n        builder.addArgument(it.first)\n        builder.addArgument(it.second)\n      }\n      return builder.build()\n    }\n\n    /**\n     * Interpolates linearly between the pair of stops just less than and just greater than the input.\n     */\n    @JvmStatic\n    fun linear(): Expression = ExpressionBuilder(\"linear\").build()\n\n    /**\n     * Interpolates exponentially between the stops just less than and just greater than the input.\n     * `base` controls the rate at which the output increases:\n     * higher values make the output increase more towards the high end of the range.\n     * With values close to 1 the output increases linearly.\n     */\n    @JvmStatic\n    fun exponential(expression: Expression): Expression =\n      ExpressionBuilder(\"exponential\").addArgument(expression).build()\n\n    /**\n     * Interpolates exponentially between the stops just less than and just greater than the input.\n     * `base` controls the rate at which the output increases:\n     * higher values make the output increase more towards the high end of the range.\n     * With values close to 1 the output increases linearly.\n     */\n    @JvmStatic\n    fun exponential(value: Double): Expression =\n      ExpressionBuilder(\"exponential\").addArgument(literal(value)).build()\n\n    /**\n     * Interpolates exponentially between the stops just less than and just greater than the input.\n     * `base` controls the rate at which the output increases:\n     * higher values make the output increase more towards the high end of the range.\n     * With values close to 1 the output increases linearly.\n     */\n    fun exponential(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"exponential\").apply(block).build()\n\n    /**\n     * Interpolates using the cubic bezier curve defined by the given control points.\n     */\n    @JvmStatic\n    fun cubicBezier(x1: Expression, x2: Expression, x3: Expression, x4: Expression): Expression =\n      ExpressionBuilder(\"cubic-bezier\").addArgument(x1).addArgument(x2)\n        .addArgument(x3).addArgument(x4).build()\n\n    /**\n     * Interpolates using the cubic bezier curve defined by the given control points.\n     */\n    @JvmStatic\n    fun cubicBezier(x1: Double, x2: Double, x3: Double, x4: Double): Expression =\n      ExpressionBuilder(\"cubic-bezier\").addArgument(literal(x1)).addArgument(literal(x2))\n        .addArgument(literal(x3)).addArgument(literal(x4)).build()\n\n    /**\n     * Interpolates using the cubic bezier curve defined by the given control points.\n     */\n    fun cubicBezier(block: ExpressionBuilder.() -> Unit): Expression =\n      ExpressionBuilder(\"cubic-bezier\").apply(block).build()\n\n    /**\n     * Convert a color int to the rgba expression.\n     */\n    @JvmStatic\n    fun color(@ColorInt intColor: Int): Expression {\n      val array: FloatArray = ColorUtils.colorToRgbaArray(intColor)\n      return rgba(\n        literal(array[0].toDouble()),\n        literal(array[1].toDouble()),\n        literal(array[2].toDouble()),\n        literal(array[3].toDouble())\n      )\n    }\n\n    /**\n     * Retrieves a property value from the current feature's properties.\n     * Expression evaluates to null if the requested property is missing.\n     */\n    @JvmStatic\n    fun get(key: String): Expression {\n      return get(literal(key))\n    }\n\n    /**\n     * Retrieves a property value from the current feature's properties, or from another object if a second\n     * argument is provided. Expression evaluates to null if the requested property is missing.\n     */\n    @JvmStatic\n    fun get(key: String, expression: Expression): Expression {\n      return get(literal(key), expression)\n    }\n\n    /**\n     * Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.\n     */\n    @JvmStatic\n    fun not(bool: Boolean): Expression {\n      return not(literal(bool))\n    }\n\n    /**\n     * Retrieves an item from an array.\n     */\n    @JvmStatic\n    fun at(index: Double, array: Expression): Expression {\n      return at(literal(index), array)\n    }\n\n    /**\n     * Determines whether an item exists in an array or a substring exists in a string.\n     */\n    @JvmStatic\n    fun inExpression(needle: String, haystack: Expression): Expression {\n      return inExpression(literal(needle), haystack)\n    }\n\n    /**\n     * Determines whether an item exists in an array or a substring exists in a string.\n     */\n    @JvmStatic\n    fun inExpression(needle: Double, haystack: Expression): Expression {\n      return inExpression(literal(needle), haystack)\n    }\n\n    /**\n     * Tests for the presence of an property value in the current feature's properties, or from another\n     * object if a second argument is provided.\n     */\n    @JvmStatic\n    fun has(string: String, expression: Expression): Expression {\n      return has(literal(string), expression)\n    }\n\n    /**\n     * Tests for the presence of an property value in the current feature's properties\n     */\n    @JvmStatic\n    fun has(string: String): Expression {\n      return has(literal(string))\n    }\n\n    /**\n     * Gets the length of an string.\n     */\n    @JvmStatic\n    fun length(string: String): Expression {\n      return length(literal(string))\n    }\n\n    /**\n     * Returns the sum of the inputs.\n     */\n    @JvmStatic\n    fun sum(vararg double: Double): Expression {\n      val expressionBuilder = ExpressionBuilder(\"+\")\n      for (value in double) {\n        expressionBuilder.addArgument(literal(value))\n      }\n      return expressionBuilder.build()\n    }\n\n    /**\n     * Returns the product of the inputs.\n     */\n    @JvmStatic\n    fun product(vararg double: Double): Expression {\n      val expressionBuilder = ExpressionBuilder(\"*\")\n      for (value in double) {\n        expressionBuilder.addArgument(literal(value))\n      }\n      return expressionBuilder.build()\n    }\n\n    /**\n     * Returns the result of subtracting the second input from the first.\n     */\n    @JvmStatic\n    fun subtract(first: Double, second: Double): Expression {\n      return subtract(literal(first), literal(second))\n    }\n\n    /**\n     * Returns the result of subtracting it from 0.\n     */\n    @JvmStatic\n    fun subtract(value: Double): Expression {\n      return subtract(literal(value))\n    }\n\n    /**\n     * Returns the result of floating point division of the first input by the second.\n     */\n    @JvmStatic\n    fun division(first: Double, second: Double): Expression {\n      return division(literal(first), literal(second))\n    }\n\n    /**\n     * Returns the remainder after integer division of the first input by the second.\n     */\n    @JvmStatic\n    fun mod(first: Double, second: Double): Expression {\n      return mod(literal(first), literal(second))\n    }\n\n    /**\n     * Returns the result of raising the first input to the power specified by the second.\n     */\n    @JvmStatic\n    fun pow(first: Double, second: Double): Expression {\n      return pow(literal(first), literal(second))\n    }\n\n    /**\n     * Returns the square root of the input.\n     */\n    @JvmStatic\n    fun sqrt(value: Double): Expression {\n      return sqrt(literal(value))\n    }\n\n    /**\n     * Returns the base-ten logarithm of the input.\n     */\n    @JvmStatic\n    fun log10(value: Double): Expression {\n      return log10(literal(value))\n    }\n\n    /**\n     * Returns the natural logarithm of the input.\n     */\n    @JvmStatic\n    fun ln(value: Double): Expression {\n      return ln(literal(value))\n    }\n\n    /**\n     * Returns the base-two logarithm of the input.\n     */\n    @JvmStatic\n    fun log2(value: Double): Expression {\n      return log2(literal(value))\n    }\n\n    /**\n     * Returns the sine of the input.\n     */\n    @JvmStatic\n    fun sin(value: Double): Expression {\n      return sin(literal(value))\n    }\n\n    /**\n     * Returns the cosine of the input.\n     */\n    @JvmStatic\n    fun cos(value: Double): Expression {\n      return cos(literal(value))\n    }\n\n    /**\n     * Returns the tangent of the input.\n     */\n    @JvmStatic\n    fun tan(value: Double): Expression {\n      return tan(literal(value))\n    }\n\n    /**\n     * Returns the arcsine of the input.\n     */\n    @JvmStatic\n    fun asin(value: Double): Expression {\n      return asin(literal(value))\n    }\n\n    /**\n     * Returns the arccosine of the input.\n     */\n    @JvmStatic\n    fun acos(value: Double): Expression {\n      return acos(literal(value))\n    }\n\n    /**\n     * Returns the arctangent of the input.\n     */\n    @JvmStatic\n    fun atan(value: Double): Expression {\n      return atan(literal(value))\n    }\n\n    /**\n     * Returns the minimum value of the inputs.\n     */\n    @JvmStatic\n    fun min(vararg values: Double): Expression {\n      val expressionBuilder = ExpressionBuilder(\"min\")\n      for (value in values) {\n        expressionBuilder.addArgument(literal(value))\n      }\n      return expressionBuilder.build()\n    }\n\n    /**\n     * Returns the maximum value of the inputs.\n     */\n    @JvmStatic\n    fun max(vararg values: Double): Expression {\n      val expressionBuilder = ExpressionBuilder(\"max\")\n      for (value in values) {\n        expressionBuilder.addArgument(literal(value))\n      }\n      return expressionBuilder.build()\n    }\n\n    /**\n     * Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example,\n     * `[\"round\", -1.5]` evaluates to -2.\n     */\n    @JvmStatic\n    fun round(value: Double): Expression {\n      return round(literal(value))\n    }\n\n    /**\n     * Returns the absolute value of the input.\n     */\n    @JvmStatic\n    fun abs(value: Double): Expression {\n      return abs(literal(value))\n    }\n\n    /**\n     * Returns the smallest integer that is greater than or equal to the input.\n     */\n    @JvmStatic\n    fun ceil(value: Double): Expression {\n      return ceil(literal(value))\n    }\n\n    /**\n     * Returns the largest integer that is less than or equal to the input.\n     */\n    @JvmStatic\n    fun floor(value: Double): Expression {\n      return floor(literal(value))\n    }\n\n    /**\n     * Returns `true` if the input string is expected to render legibly. Returns `false` if the input\n     * string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that\n     * require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use\n     * in Mapbox GL JS).\n     */\n    @JvmStatic\n    fun isSupportedScript(script: String): Expression {\n      return isSupportedScript(literal(script))\n    }\n\n    /**\n     * Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the\n     * locale-insensitive case mappings in the Unicode Character Database.\n     */\n    @JvmStatic\n    fun upcase(value: String): Expression {\n      return upcase(literal(value))\n    }\n\n    /**\n     * Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the\n     * locale-insensitive case mappings in the Unicode Character Database.\n     */\n    @JvmStatic\n    fun downcase(value: String): Expression {\n      return downcase(literal(value))\n    }\n\n    /**\n     * Returns a `string` consisting of the concatenation of the inputs.\n     */\n    @JvmStatic\n    fun concat(vararg values: String): Expression {\n      val expressionBuilder = ExpressionBuilder(\"concat\")\n      for (value in values) {\n        expressionBuilder.addArgument(literal(value))\n      }\n      return expressionBuilder.build()\n    }\n\n    /**\n     * Converts the input number into a string representation using the providing formatting rules. If set, the\n     * `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the\n     * `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `min-fraction-digits`\n     * and `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.\n     */\n    @JvmStatic\n    fun numberFormat(value: Double, block: NumberFormatBuilder.() -> Unit): Expression {\n      return numberFormat(literal(value), block)\n    }\n\n    /**\n     * References variable bound using \"let\".\n     */\n    @JvmStatic\n    fun varExpression(value: String): Expression {\n      return varExpression(literal(value))\n    }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/expressions/types/FormatSection.kt",
    "content": "package com.mapbox.maps.extension.style.expressions.types\n\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\n\n/**\n * Holds format entries used in a format expression.\n */\ndata class FormatSection @JvmOverloads constructor(\n\n  /**\n   * The visible text or image as an expression for this format section.\n   */\n  val content: Expression,\n\n  /**\n   * If set, the font-scale argument specifies a scaling factor relative to the text-size\n   * specified in the root layout properties.\n   *\n   * \"font-scale\" is required to be of a resulting type number.\n   */\n  var fontScale: Expression? = null,\n\n  /**\n   * If set, the text-font argument overrides the font specified by the root layout properties.\n   *\n   * \"text-font\" is required to be a literal array.\n   *\n   * The requested font stack has to be a part of the used style.\n   * For more information see [The online documentation](https://www.mapbox.com/help/define-font-stack/).\n   */\n  var textFont: Expression? = null,\n\n  /**\n   * If set, the text-color argument overrides the color specified by the root paint properties.\n   */\n  var textColor: Expression? = null\n)"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/image/ImageExt.kt",
    "content": "@file:JvmName(\"ImageUtils\")\n\npackage com.mapbox.maps.extension.style.image\n\nimport android.graphics.Bitmap\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\n\n/**\n * DSL function for [ImageExtensionImpl].\n *\n * @param imageId the id the the image extension\n * @param block the configuration block\n */\n@Deprecated(\n  message = \"Constructing image without image or bitmap is deprecated. \" +\n    \"Please use `fun image(imageId: String, image: Image, block: ImageExtensionImpl.Builder.() -> Unit): ImageExtensionImpl` \" +\n    \"or `fun image(imageId: String, bitmap: Bitmap, block: ImageExtensionImpl.Builder.() -> Unit): ImageExtensionImpl` instead.\",\n  replaceWith = ReplaceWith(\"image(imageId, image, block)\")\n)\nfun image(imageId: String, block: ImageExtensionImpl.Builder.() -> Unit): ImageExtensionImpl =\n  @Suppress(\"DEPRECATION\")\n  ImageExtensionImpl.Builder(imageId).apply(block).build()\n\n/**\n * DSL function for [ImageExtensionImpl].\n *\n * @param imageId the id the the image extension\n * @param image the pixel data of the image.\n * @param block the configuration block\n */\nfun image(\n  imageId: String,\n  image: Image,\n  block: ImageExtensionImpl.Builder.() -> Unit = {}\n): ImageExtensionImpl =\n  ImageExtensionImpl.Builder(imageId, image).apply(block).build()\n\n/**\n * DSL function for [ImageExtensionImpl].\n *\n * @param imageId the id for the image extension\n * @param bitmap the bitmap data of the image.\n * @param block the configuration block\n */\nfun image(\n  imageId: String,\n  bitmap: Bitmap,\n  block: ImageExtensionImpl.Builder.() -> Unit = {}\n): ImageExtensionImpl =\n  ImageExtensionImpl.Builder(imageId, bitmap).apply(block).build()\n\n/**\n * Extension function to add an image provided by the Style Extension to the Style.\n *\n * @param image The image to be added\n */\nfun MapboxStyleManager.addImage(image: StyleContract.StyleImageExtension) {\n  image.bindTo(this)\n}\n\n/**\n * DSL function for [ImageNinePatchExtensionImpl].\n *\n * @param imageId id\n * @param bitmap [Bitmap] that must be be in 9-patch format or [RuntimeException] will be thrown.\n * @param block optional block for additional parameters\n */\n@JvmOverloads\nfun image9Patch(\n  imageId: String,\n  bitmap: Bitmap,\n  block: (ImageNinePatchExtensionImpl.Builder.() -> Unit)? = null\n): ImageNinePatchExtensionImpl =\n  block?.let {\n    ImageNinePatchExtensionImpl.Builder(imageId, bitmap).apply(it).build()\n  } ?: ImageNinePatchExtensionImpl.Builder(imageId, bitmap).build()\n\n/**\n * Extension function to add 9-patch image provided by the Style Extension to the Style.\n *\n * @param image The image to be added\n */\nfun MapboxStyleManager.addImage9Patch(image: StyleContract.StyleImageExtension) {\n  image.bindTo(this)\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/image/ImageExtensionImpl.kt",
    "content": "package com.mapbox.maps.extension.style.image\n\nimport android.graphics.Bitmap\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.utils.check\n\n/**\n * Concrete implementation of ImagePlugin, the plugin is used to add an image to be used in the style.\n *\n * This API can also be used for updating an image. If the image id was already added, it gets replaced by the new image.\n *\n * The image can be used in `icon-image`, `fill-pattern`, and `line-pattern`.\n *\n * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image](https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image)\n * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern)\n * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern)\n */\nclass ImageExtensionImpl(private val builder: Builder) : StyleContract.StyleImageExtension {\n  /**\n   * Add the image to the style.\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    delegate.addStyleImage(\n      builder.imageId,\n      builder.scale ?: delegate.pixelRatio,\n      builder.internalImage,\n      builder.sdf,\n      builder.stretchX,\n      builder.stretchY,\n      builder.content\n    ).check()\n  }\n\n  /**\n   * Builder for the [ImageExtensionImpl].\n   */\n  class Builder {\n    /**\n     * The Id of the image.\n     */\n    val imageId: String\n\n    /**\n     * Pixel data of the image.\n     */\n    internal lateinit var internalImage: Image\n\n    /**\n     * Constructor for the [ImageExtensionImpl.Builder].\n     *\n     * @param imageId the Id of the image extension.\n     */\n    @Deprecated(\n      \"Constructing `ImageExtensionImpl.Builder` without image or bitmap is deprecated, as the image or bitmap is a required field. \" +\n        \"Please switch to `Builder(imageId: String, image: Image)` or `Builder(imageId: String, bitmap: Bitmap)` instead.\",\n      replaceWith = ReplaceWith(\"ImageExtensionImpl.Builder(imageId, image)\")\n    )\n    constructor(imageId: String) {\n      this.imageId = imageId\n    }\n\n    /**\n     * Constructor for the [ImageExtensionImpl.Builder].\n     *\n     * @param imageId the id the the image extension\n     * @param image the pixel data of the image.\n     */\n    constructor(imageId: String, image: Image) {\n      this.imageId = imageId\n      this.internalImage = image\n    }\n\n    /**\n     * Constructor for the [ImageExtensionImpl.Builder].\n     *\n     * @param imageId the id the the image extension\n     * @param bitmap the bitmap data of the image.\n     */\n    @OptIn(MapboxDelicateApi::class)\n    constructor(imageId: String, bitmap: Bitmap) {\n      this.imageId = imageId\n      this.internalImage = bitmap.toMapboxImage()\n    }\n\n    /**\n     * Scale factor for the image.\n     */\n    internal var scale: Float? = null\n\n    /**\n     * Option to treat whether image is SDF(signed distance field) or not.\n     */\n    internal var sdf: Boolean = false\n\n    /**\n     * An array of two-element arrays, consisting of two numbers that represent\n     * the from position and the to position of areas that can be stretched horizontally.\n     */\n    internal var stretchX = listOf<ImageStretches>()\n\n    /**\n     * An array of two-element arrays, consisting of two numbers that represent\n     * the from position and the to position of areas that can be stretched vertically.\n     */\n    internal var stretchY = listOf<ImageStretches>()\n\n    /**\n     * An array of four numbers, with the first two specifying the left, top\n     * corner, and the last two specifying the right, bottom corner. If present, and if the\n     * icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n     */\n    internal var content: ImageContent? = null\n\n    /**\n     * Pixel data of the image.\n     */\n    @Suppress(\"DeprecatedCallableAddReplaceWith\")\n    @Deprecated(\"Configuring image through `image` function is deprecated, pass image to the `Builder(imageId: String, image: Image)` constructor instead.\")\n    fun image(image: Image): Builder = apply {\n      this.internalImage = image\n    }\n\n    /**\n     * Set bitmap data of the image.\n     */\n    @OptIn(MapboxDelicateApi::class)\n    @Suppress(\"DeprecatedCallableAddReplaceWith\")\n    @Deprecated(\"Configuring image through `bitmap` function is deprecated, pass image to the `Builder(imageId: String, bitmap: Bitmap)` constructor instead.\")\n    fun bitmap(bitmap: Bitmap): Builder = apply {\n      this.internalImage = bitmap.toMapboxImage()\n    }\n\n    /**\n     * Scale factor for the image.\n     */\n    fun scale(scale: Float): Builder = apply {\n      this.scale = scale\n    }\n\n    /**\n     * Option to treat whether image is SDF(signed distance field) or not.\n     */\n    fun sdf(sdf: Boolean = false): Builder = apply {\n      this.sdf = sdf\n    }\n\n    /**\n     * An array of two-element arrays, consisting of two numbers that represent\n     * the from position and the to position of areas that can be stretched horizontally.\n     */\n    fun stretchX(stretchX: List<ImageStretches> = listOf()): Builder = apply {\n      this.stretchX = stretchX\n    }\n\n    /**\n     * An array of two-element arrays, consisting of two numbers that represent\n     * the from position and the to position of areas that can be stretched vertically.\n     */\n    fun stretchY(stretchY: List<ImageStretches> = listOf()): Builder = apply {\n      this.stretchY = stretchY\n    }\n\n    /**\n     * An array of four numbers, with the first two specifying the left, top\n     * corner, and the last two specifying the right, bottom corner. If present, and if the\n     * icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n     */\n    fun content(content: ImageContent): Builder = apply {\n      this.content = content\n    }\n\n    /**\n     * Build the ImagePluginImpl.\n     *\n     * @return ImagePluginImpl\n     */\n    fun build(): ImageExtensionImpl {\n      if (!this::internalImage.isInitialized) {\n        throw IllegalStateException(\"An image plugin requires an image input.\")\n      }\n      return ImageExtensionImpl(this)\n    }\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/image/ImageNinePatchExtensionImpl.kt",
    "content": "package com.mapbox.maps.extension.style.image\n\nimport android.graphics.Bitmap\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.ImageContent\nimport com.mapbox.maps.ImageStretches\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.utils.check\n\n/**\n * Concrete implementation of ImagePlugin (see [ImageExtensionImpl])\n * but taking 9-patch [Bitmap] in order to calculate stretchX, stretchY and paddings automatically.\n */\nclass ImageNinePatchExtensionImpl(private val builder: Builder) : StyleContract.StyleImageExtension {\n  /**\n   * Add the image to the style.\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    delegate.addStyleImage(\n      builder.imageId,\n      builder.scale ?: delegate.pixelRatio,\n      builder.internalImage,\n      builder.sdf,\n      builder.stretchX,\n      builder.stretchY,\n      builder.content\n    ).check()\n  }\n\n  /**\n   * Builder for the [ImageNinePatchExtensionImpl].\n   */\n  class Builder(\n    /**\n     * ID of the image.\n     */\n    val imageId: String,\n    /**\n     * Actual 9-patch bitmap.\n     */\n    val bitmap: Bitmap\n  ) {\n\n    /**\n     * Pixel data of the image.\n     */\n    internal var internalImage: Image\n\n    /**\n     * Scale factor for the image.\n     */\n    internal var scale: Float? = null\n\n    /**\n     * Option to treat whether image is SDF(signed distance field) or not.\n     */\n    internal var sdf: Boolean = false\n\n    /**\n     * An array of two-element arrays, consisting of two numbers that represent\n     * the from position and the to position of areas that can be stretched horizontally.\n     */\n    internal var stretchX = listOf<ImageStretches>()\n\n    /**\n     * An array of two-element arrays, consisting of two numbers that represent\n     * the from position and the to position of areas that can be stretched vertically.\n     */\n    internal var stretchY = listOf<ImageStretches>()\n\n    /**\n     * An array of four numbers, with the first two specifying the left, top\n     * corner, and the last two specifying the right, bottom corner. If present, and if the\n     * icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n     */\n    internal var content: ImageContent? = null\n\n    init {\n      if (bitmap.config != Bitmap.Config.ARGB_8888) {\n        throw IllegalArgumentException(\"Only ARGB_8888 bitmap config is supported!\")\n      }\n      bitmap.parse9PatchBitmap().also {\n        internalImage = it.internalImage\n        content = it.imageContent\n        stretchX = it.stretchX\n        stretchY = it.stretchY\n      }\n    }\n\n    /**\n     * Scale factor for the image.\n     */\n    fun scale(scale: Float): Builder = apply {\n      this.scale = scale\n    }\n\n    /**\n     * Option to treat whether image is SDF(signed distance field) or not.\n     */\n    fun sdf(sdf: Boolean = false): Builder = apply {\n      this.sdf = sdf\n    }\n\n    /**\n     * Build the ImageNinePatchExtensionImpl.\n     *\n     * @return ImageNinePatchExtensionImpl\n     */\n    fun build(): ImageNinePatchExtensionImpl {\n      return ImageNinePatchExtensionImpl(this)\n    }\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/image/NinePatchImage.kt",
    "content": "package com.mapbox.maps.extension.style.image\n\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.ImageContent\nimport com.mapbox.maps.ImageStretches\n\n/**\n * Data class describing 9-patch bitmap.\n */\ndata class NinePatchImage(\n  /**\n   * Bitmap itself.\n   */\n  val internalImage: Image,\n  /**\n   * An array of two-element arrays, consisting of two numbers that represent\n   * the from position and the to position of areas that can be stretched horizontally.\n   */\n  val stretchX: List<ImageStretches>,\n  /**\n   * An array of two-element arrays, consisting of two numbers that represent\n   * the from position and the to position of areas that can be stretched vertically.\n   */\n  val stretchY: List<ImageStretches>,\n  /**\n   * An array of four numbers, with the first two specifying the left, top\n   * corner, and the last two specifying the right, bottom corner. If present, and if the\n   * icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n   */\n  val imageContent: ImageContent\n)"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/image/NinePatchUtils.kt",
    "content": "@file:JvmName(\"NinePatchUtils\")\npackage com.mapbox.maps.extension.style.image\n\nimport android.graphics.Bitmap\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.maps.ImageContent\nimport com.mapbox.maps.ImageStretches\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.toMapboxImage\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\n\n/**\n * Adds an 9-patch image to be used in the style.\n * X-stretches, Y-stretches and padding will be calculated from [Bitmap.getNinePatchChunk].\n *\n * Important: This method will allocate native memory outside the JVM heap on every call.\n *\n * @param imageId ID of the image.\n * @param bitmap Bitmap data of the image.\n *\n * @return A string describing an error if the operation was not successful, empty otherwise.\n */\n@OptIn(MapboxDelicateApi::class)\n@JvmOverloads\nfun MapboxStyleManager.addImage9Patch(\n  imageId: String,\n  bitmap: Bitmap,\n  scale: Float = pixelRatio,\n  sdf: Boolean = false\n): Expected<String, None> {\n  val ninePatchImage = decodeNinePatchChunk(bitmap)\n  return addStyleImage(\n    imageId,\n    scale,\n    ninePatchImage.internalImage,\n    sdf,\n    ninePatchImage.stretchX,\n    ninePatchImage.stretchY,\n    ninePatchImage.imageContent\n  )\n}\n\n/**\n * Utility function returning [NinePatchImage] from a given [Bitmap].\n *\n * [Bitmap] has to be in 9-patch format (.9.png) or [RuntimeException] will be thrown.\n *\n * Important: This method will allocate native memory outside the JVM heap on every call.\n */\n@OptIn(MapboxDelicateApi::class)\nfun Bitmap.parse9PatchBitmap() = decodeNinePatchChunk(this)\n\n@MapboxDelicateApi\nprivate fun decodeNinePatchChunk(bitmap: Bitmap): NinePatchImage {\n  val ninePatchChunk = bitmap.ninePatchChunk\n    ?: throw IllegalArgumentException(\"Given bitmap must be a 9-patch drawable (.9.png)!\")\n  val buffer = ByteBuffer.wrap(ninePatchChunk).order(ByteOrder.nativeOrder())\n  // skip first byte\n  buffer.get()\n  // second byte - number of x coordinates\n  val xCoordinatesNumber = buffer.get()\n  // third byte - number of y coordinates\n  val yCoordinatesNumber = buffer.get()\n  // skip fourth byte\n  buffer.get()\n\n  // start reading by 4 byte chunks as int\n  // skip 2 integers (8 bytes)\n  buffer.int\n  buffer.int\n\n  // next integers contain padding values\n  val leftPadding = buffer.int\n  val rightPadding = buffer.int\n  val topPadding = buffer.int\n  val bottomPadding = buffer.int\n\n  // skip next integer\n  buffer.int\n\n  // next integers contain X and Y stretches\n  val xCoordinates = mutableListOf<Int>()\n  for (i in 0 until xCoordinatesNumber) {\n    xCoordinates.add(buffer.int)\n  }\n  val yCoordinates = mutableListOf<Int>()\n  for (i in 0 until yCoordinatesNumber) {\n    yCoordinates.add(buffer.int)\n  }\n\n  return NinePatchImage(\n    internalImage = bitmap.toMapboxImage(),\n    stretchX = xCoordinates\n      .map { it.toFloat() }\n      .zipWithNext(::ImageStretches),\n    stretchY = yCoordinates\n      .map { it.toFloat() }\n      .zipWithNext(::ImageStretches),\n    imageContent = ImageContent(\n      leftPadding.toFloat(),\n      topPadding.toFloat(),\n      (bitmap.width - rightPadding).toFloat(),\n      (bitmap.height - bottomPadding).toFloat()\n    )\n  )\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/CustomLayer.kt",
    "content": "package com.mapbox.maps.extension.style.layers\n\nimport androidx.annotation.UiThread\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.CustomLayerHost\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.types.LayersDsl\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.Locale\n\n/**\n * Layer with custom rendering implementation.\n *\n * With the power of [CustomLayerHost] you can implement your own Open GL ES rendering behaviour\n * and manipulate layer as a usual one.\n *\n * @param layerId mandatory custom layer id.\n * @param host an instance of user-defined OpenGL ES renderer.\n *  Note: there is no API to get instance of [CustomLayerHost] from [CustomLayer] after setting it here so\n *  this instance should be cached on user's end if needed.\n */\n@UiThread\nclass CustomLayer constructor(\n  override val layerId: String,\n  private val host: CustomLayerHost,\n) : Layer(), CustomLayerDsl {\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"custom\"\n  }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [CustomLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [CustomLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [CustomLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): CustomLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[CustomLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): CustomLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [CustomLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [CustomLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): CustomLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [CustomLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [CustomLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): CustomLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot\n   */\n  override fun slot(slot: String): CustomLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  override fun addPersistentLayer(\n    delegate: MapboxStyleManager,\n    position: LayerPosition?\n  ): Expected<String, None> {\n    val customLayer = delegate.addPersistentStyleCustomLayer(layerId, host, position)\n    delegate.setStyleLayerProperties(layerId, getCachedLayerProperties())\n    return customLayer\n  }\n\n  override fun addLayer(\n    delegate: MapboxStyleManager,\n    propertiesValue: Value,\n    position: LayerPosition?\n  ): Expected<String, None> {\n    val customLayer = delegate.addStyleCustomLayer(layerId, host, position)\n    delegate.setStyleLayerProperties(layerId, propertiesValue)\n    return customLayer\n  }\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"custom\", \"visibility\")\n          .silentUnwrap<String>()?.let {\n            return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n          }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"custom\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"custom\", \"maxzoom\").silentUnwrap()\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Kotlin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface CustomLayerDsl {\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot\n   */\n  fun slot(slot: String): CustomLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): CustomLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): CustomLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): CustomLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): CustomLayer\n}\n\n/**\n * DSL function for creating a [CustomLayer].\n */\n@JvmOverloads\nfun customLayer(\n  layerId: String,\n  host: CustomLayerHost,\n  block: (CustomLayerDsl.() -> Unit)? = null\n): CustomLayer {\n  return if (block != null) {\n    CustomLayer(layerId, host).apply(block)\n  } else {\n    CustomLayer(layerId, host)\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/Layer.kt",
    "content": "package com.mapbox.maps.extension.style.layers\n\nimport android.util.Log\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.generated.BackgroundLayer\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.utils.unwrap\nimport com.mapbox.maps.extension.style.utils.unwrapToExpressionOrLiteralExpression\n\n/**\n * Base class for the different Layer types\n */\nabstract class Layer : StyleContract.StyleLayerExtension {\n  /**\n   * The ID of the Layer.\n   */\n  abstract val layerId: String\n\n  /**\n   * Source ID of the Layer, could be null for [BackgroundLayer]\n   */\n  internal var internalSourceId: String? = null\n\n  internal var delegate: MapboxStyleManager? = null\n\n  internal var appliedLayerPropertiesValue: Value? = null\n\n  /**\n   * Properties of this layer.\n   */\n  private val layerProperties by lazy {\n    HashMap<String, PropertyValue<*>>().also { map ->\n      map[\"id\"] = PropertyValue(\"id\", layerId)\n      map[\"type\"] = PropertyValue(\"type\", getType())\n      internalSourceId?.let {\n        map[\"source\"] = PropertyValue(\"source\", it)\n      }\n    }\n  }\n\n  /**\n   * Get the type of current layer as a String.\n   */\n  @SuppressWarnings(\"HiddenAbstractMethod\")\n  internal abstract fun getType(): String\n\n  /**\n   * Get the Visibility property.\n   *\n   * @return property wrapper value around VISIBILITY\n   */\n  abstract val visibility: Visibility?\n\n  /**\n   * Get the Visibility property as Expression.\n   *\n   * @return property wrapper value around VISIBILITY\n   */\n  abstract val visibilityAsExpression: Expression?\n\n  /**\n   * Set the Visibility property.\n   *\n   * @param visibility value of Visibility\n   */\n  abstract fun visibility(visibility: Visibility): Layer\n\n  /**\n   * Set the Visibility property as expression.\n   *\n   * @param visibility value of Visibility as expression\n   */\n  abstract fun visibility(visibility: Expression): Layer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  abstract val minZoom: Double?\n\n  /**\n   * Set the minzoom property\n   *\n   * @param minZoom value of minzoom\n   */\n  abstract fun minZoom(minZoom: Double): Layer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  abstract val maxZoom: Double?\n\n  /**\n   * Set the maxzoom property\n   *\n   * @param maxZoom value of maxzoom\n   */\n  abstract fun maxZoom(maxZoom: Double): Layer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  abstract fun slot(slot: String): Layer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  abstract val slot: String?\n\n  protected open fun addPersistentLayer(\n    delegate: MapboxStyleManager,\n    position: LayerPosition?\n  ): Expected<String, None> {\n    return delegate.addPersistentStyleLayer(getCachedLayerProperties(), position)\n  }\n\n  protected open fun addLayer(\n    delegate: MapboxStyleManager,\n    propertiesValue: Value,\n    position: LayerPosition?\n  ): Expected<String, None> {\n    return delegate.addStyleLayer(propertiesValue, position)\n  }\n\n  /**\n   * Bind the layer to the Style.\n   *\n   * @param delegate The style controller\n   */\n  fun bindTo(delegate: MapboxStyleManager) {\n    bindTo(delegate, null)\n  }\n\n  /**\n   * Bind the layer to the map controller.\n   *\n   * @param delegate The style controller\n   * @param position the position that the current layer is added to\n   */\n  override fun bindTo(delegate: MapboxStyleManager, position: LayerPosition?) {\n    this.delegate = delegate\n\n    val propertiesValue = appliedLayerPropertiesValue ?: getCachedLayerProperties()\n    val expected = addLayer(delegate, propertiesValue, position)\n    expected.error?.let {\n      throw MapboxStyleException(\"Add layer failed: $it\")\n    }\n\n    if (appliedLayerPropertiesValue != null) {\n      layerProperties.values.filter { it.propertyName != \"id\" && it.propertyName != \"type\" && it.propertyName != \"source\" }\n        .forEach {\n          delegate.setStyleLayerProperty(layerId, it.propertyName, it.value)\n        }\n    }\n  }\n\n  /**\n   * Bind the layer to the map controller persistently.\n   *\n   * Whenever a new style is being parsed and currently used style has persistent layers,\n   * an engine will try to do following:\n   *   - keep the persistent layer at its relative position\n   *   - keep the source used by a persistent layer\n   *   - keep images added through `addStyleImage` method\n   *\n   * In cases when a new style has the same layer, source or image resource, style's resources would be\n   * used instead and `MapLoadingError` event will be emitted.\n   *\n   * @param style The style\n   * @param position the position that the current layer is added to\n   */\n  internal fun bindPersistentlyTo(style: MapboxStyleManager, position: LayerPosition? = null) {\n    this.delegate = style\n    val expected = addPersistentLayer(style, position)\n    expected.error?.let {\n      throw MapboxStyleException(\"Add persistent layer failed: $it\")\n    }\n  }\n\n  // Layer Properties\n  protected fun getCachedLayerProperties(): Value {\n    val properties = HashMap<String, Value>()\n    layerProperties.values.forEach {\n      properties[it.propertyName] = it.value\n    }\n    return Value(properties)\n  }\n\n  internal fun setProperty(property: PropertyValue<*>) {\n    layerProperties[property.propertyName] = property\n    updateProperty(property)\n  }\n\n  private fun updateProperty(property: PropertyValue<*>) {\n    delegate?.let { styleDelegate ->\n      val expected = styleDelegate.setStyleLayerProperty(\n        layerId,\n        property.propertyName,\n        property.value\n      )\n      expected.error?.let {\n        throw MapboxStyleException(\"Set layer property \\\"${property.propertyName}\\\" failed:\\n$it\\n${property.value}\")\n      }\n    }\n  }\n\n  internal inline fun <reified T> getPropertyValue(propertyName: String): T? {\n    return getPropertyValueWithType(propertyName, T::class.java)\n  }\n\n  private fun <T> getPropertyValueWithType(propertyName: String, clazz: Class<T>): T? {\n    delegate?.let {\n      return try {\n        it.getStyleLayerProperty(layerId, propertyName).unwrap(clazz)\n      } catch (e: RuntimeException) {\n        // logging an error is misleading as it is valid to set a property\n        // with a concrete value (e.g. Double) and then read it as an expression\n        if (clazz != Expression::class.java) {\n          Log.e(\n            TAG,\n            \"Get layer property=$propertyName for layerId=$layerId failed: ${e.message}. \" +\n              \"Value obtained: ${it.getStyleLayerProperty(layerId, propertyName)}\"\n          )\n        }\n        null\n      }\n    }\n    throw MapboxStyleException(\"Couldn't get $propertyName: layer is not added to style yet.\")\n  }\n\n  internal fun getPropertyValueAsExpressionOrLiteralExpression(propertyName: String): Expression? {\n    delegate?.let {\n      return try {\n        it.getStyleLayerProperty(layerId, propertyName).unwrapToExpressionOrLiteralExpression()\n      } catch (e: RuntimeException) {\n        Log.e(\n          TAG,\n          \"Get layer property=$propertyName for layerId=$layerId failed: ${e.message}. \" +\n            \"Value obtained: ${it.getStyleLayerProperty(layerId, propertyName)}\"\n        )\n        null\n      }\n    }\n    throw MapboxStyleException(\"Couldn't get $propertyName: layer is not added to style yet.\")\n  }\n\n  /**\n   * Returns a human readable string that includes the cached properties of the layer.\n   *\n   * @return String\n   */\n  override fun toString(): String {\n    return \"[${layerProperties.values.joinToString { propertyValue -> \"${propertyValue.propertyName} = ${propertyValue.value}\" }}}]\"\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val TAG = \"Mbgl-Layer\"\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/LayerExt.kt",
    "content": "@file:JvmName(\"LayerUtils\")\n\npackage com.mapbox.maps.extension.style.layers\n\nimport com.mapbox.maps.CustomLayerHost\nimport com.mapbox.maps.CustomLayerRenderParameters\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport com.mapbox.maps.extension.style.utils.unwrap\nimport com.mapbox.maps.logW\n\n/**\n * Extension function to get a Layer provided by the Style Extension by layer id.\n *\n * @param layerId the layer id\n * @return StyleLayerPlugin\n */\n@OptIn(MapboxExperimental::class)\nfun MapboxStyleManager.getLayer(layerId: String): Layer? {\n  val source by lazy { getStyleLayerProperty(layerId, \"source\").unwrap<String>() }\n  return when (val type = getStyleLayerProperty(layerId, \"type\").silentUnwrap<String>()) {\n    \"background\" -> BackgroundLayer(layerId)\n    \"location-indicator\" -> LocationIndicatorLayer(layerId)\n    \"sky\" -> SkyLayer(layerId)\n    \"circle\" -> CircleLayer(layerId, source)\n    \"fill-extrusion\" -> FillExtrusionLayer(layerId, source)\n    \"fill\" -> FillLayer(layerId, source)\n    \"heatmap\" -> HeatmapLayer(layerId, source)\n    \"hillshade\" -> HillshadeLayer(layerId, source)\n    \"line\" -> LineLayer(layerId, source)\n    \"raster\" -> RasterLayer(layerId, source)\n    \"symbol\" -> SymbolLayer(layerId, source)\n    \"model\" -> ModelLayer(layerId, source)\n    \"custom\" -> CustomLayer(\n      layerId,\n      // passing the dummy CustomLayerHost value here as an actual one is already applied in core\n      object : CustomLayerHost {\n        override fun initialize() {\n        }\n\n        override fun render(parameters: CustomLayerRenderParameters) {\n        }\n\n        override fun contextLost() {\n        }\n\n        override fun deinitialize() {\n        }\n      }\n    )\n    \"slot\" -> SlotLayer(layerId)\n    \"raster-particle\" -> RasterParticleLayer(layerId, source)\n    \"clip\" -> ClipLayer(layerId, source)\n    else -> {\n      logW(TAG, \"Layer type: $type unknown.\")\n      null\n    }\n  }?.also { result ->\n    result.delegate = this\n    result.appliedLayerPropertiesValue = getStyleLayerProperties(layerId).value\n  }\n}\n\n/**\n * Tries to cast the Layer to T.\n *\n * @param layerId the layer id\n * @return T if layer is T, otherwise null\n */\n@SuppressWarnings(\"ChangedType\")\ninline fun <reified T : Layer> MapboxStyleManager.getLayerAs(layerId: String): T? {\n  val layer = getLayer(layerId) as? T\n  if (layer == null) {\n    logW(TAG, \"Given layerId = $layerId is not requested type in Layer\")\n    return null\n  }\n  return layer\n}\n\n/**\n * Extension function to add a Layer provided by the Style Extension to the Style.\n *\n * @param layer The layer to be added\n * @param below the layer id that the current layer is added below\n */\nfun MapboxStyleManager.addLayerBelow(layer: StyleContract.StyleLayerExtension, below: String?) {\n  layer.bindTo(this, LayerPosition(null, below, null))\n}\n\n/**\n * Extension function to add a Layer provided by the Style Extension to the Style.\n *\n * @param layer The layer to be added\n * @param above the layer id that the current layer is added above\n */\nfun MapboxStyleManager.addLayerAbove(layer: StyleContract.StyleLayerExtension, above: String?) {\n  layer.bindTo(this, LayerPosition(above, null, null))\n}\n\n/**\n * Extension function to add a Layer provided by the Style Extension to the Style.\n *\n * @param layer The layer to be added\n * @param index the index that the current layer is added on\n */\nfun MapboxStyleManager.addLayerAt(layer: StyleContract.StyleLayerExtension, index: Int?) {\n  layer.bindTo(this, LayerPosition(null, null, index))\n}\n\n/**\n * Extension function to add a Layer provided by the Style Extension to the Style.\n *\n * @param layer The layer to be added\n */\nfun MapboxStyleManager.addLayer(layer: StyleContract.StyleLayerExtension) {\n  layer.bindTo(this)\n}\n\n/**\n * Add layer to the style persistently.\n *\n * Whenever a new style is being parsed and currently used style has persistent layers,\n * an engine will try to do following:\n *   - keep the persistent layer at its relative position\n *   - keep the source used by a persistent layer\n *   - keep images added through `addStyleImage` method\n *\n * In cases when a new style has the same layer, source or image resource, style's resources would be\n * used instead and `MapLoadingError` event will be emitted.\n *\n * @param layer The layer to be added to the style\n * @param position the position that the current layer is added to\n */\n@JvmOverloads\nfun MapboxStyleManager.addPersistentLayer(layer: Layer, position: LayerPosition? = null) {\n  layer.bindPersistentlyTo(this, position)\n}\n\n/**\n * Get the persistent property as Boolean.\n *\n * If true, the layer will be persisted across style changes.\n */\nfun Layer.isPersistent(): Boolean? {\n  return delegate?.isStyleLayerPersistent(layerId)?.value\n}\n\n@PublishedApi\ninternal const val TAG = \"Mbgl-LayerUtils\""
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/BackgroundLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * The background color or pattern of the map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#background)\n *\n * @param layerId the ID of the layer\n */\n@UiThread\nclass BackgroundLayer(override val layerId: String) : BackgroundLayerDsl, Layer() {\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): BackgroundLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [BackgroundLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [BackgroundLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [BackgroundLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[BackgroundLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [BackgroundLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [BackgroundLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): BackgroundLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [BackgroundLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [BackgroundLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): BackgroundLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   */\n  val backgroundColor: String?\n    /**\n     * The color with which the background will be drawn. Default value: \"#000000\".\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      backgroundColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundColor] to set the default property.\n   *\n   * @param backgroundColor value of backgroundColor\n   */\n  override fun backgroundColor(backgroundColor: String): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-color\", backgroundColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"background-color\".\n   *\n   */\n  val backgroundColorAsExpression: Expression?\n    /**\n     * The color with which the background will be drawn. Default value: \"#000000\".\n     *\n     * Get the BackgroundColor property as an Expression\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"background-color\")\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundColorAsExpression] to set the default property.\n   *\n   * @param backgroundColor value of backgroundColor as Expression\n   */\n  override fun backgroundColor(backgroundColor: Expression): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-color\", backgroundColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   */\n  val backgroundColorAsColorInt: Int?\n    /**\n     * The color with which the background will be drawn. Default value: \"#000000\".\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      backgroundColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundColorAsColorInt] to set the default property.\n   *\n   * @param backgroundColor value of backgroundColor\n   */\n  override fun backgroundColor(@ColorInt backgroundColor: Int): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-color\", colorIntToRgbaExpression(backgroundColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for BackgroundColor.\n   */\n  val backgroundColorTransition: StyleTransition?\n    /**\n     * Get the BackgroundColor property transition options\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"background-color-transition\")\n    }\n\n  /**\n   * Set the BackgroundColor property transition options\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun backgroundColorTransition(options: StyleTransition): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [backgroundColorTransition].\n   */\n  override fun backgroundColorTransition(block: StyleTransition.Builder.() -> Unit): BackgroundLayer = apply {\n    backgroundColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [backgroundColor].\n   */\n  @MapboxExperimental\n  val backgroundColorUseTheme: String?\n    /**\n     * Get the BackgroundColorUseTheme property\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundColorUseTheme] to get the default property.\n     *\n     * @return current BackgroundColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"background-color-use-theme\")\n    }\n\n  /**\n   * Set the BackgroundColorUseTheme as String\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundColorUseTheme] to get the default property.\n   *\n   * @param backgroundColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun backgroundColorUseTheme(backgroundColorUseTheme: String): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-color-use-theme\", backgroundColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [backgroundColor].\n   */\n  @MapboxExperimental\n  val backgroundColorUseThemeAsExpression: Expression?\n    /**\n     * Get the BackgroundColorUseTheme property\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundColorUseTheme] to get the default property.\n     *\n     * @return current BackgroundColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"background-color-use-theme\")\n\n  /**\n   * Set the BackgroundColorUseTheme as Expression\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundColorUseTheme] to get the default property.\n   *\n   * @param backgroundColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun backgroundColorUseTheme(backgroundColorUseTheme: Expression): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-color-use-theme\", backgroundColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n   */\n  val backgroundEmissiveStrength: Double?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"background-emissive-strength\")\n    }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundEmissiveStrength] to set the default property.\n   *\n   * @param backgroundEmissiveStrength value of backgroundEmissiveStrength\n   */\n  override fun backgroundEmissiveStrength(backgroundEmissiveStrength: Double): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-emissive-strength\", backgroundEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n   *\n   * This is an Expression representation of \"background-emissive-strength\".\n   *\n   */\n  val backgroundEmissiveStrengthAsExpression: Expression?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n     *\n     * Get the BackgroundEmissiveStrength property as an Expression\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"background-emissive-strength\")\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param backgroundEmissiveStrength value of backgroundEmissiveStrength as Expression\n   */\n  override fun backgroundEmissiveStrength(backgroundEmissiveStrength: Expression): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-emissive-strength\", backgroundEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for BackgroundEmissiveStrength.\n   */\n  val backgroundEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the BackgroundEmissiveStrength property transition options\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"background-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the BackgroundEmissiveStrength property transition options\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun backgroundEmissiveStrengthTransition(options: StyleTransition): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [backgroundEmissiveStrengthTransition].\n   */\n  override fun backgroundEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): BackgroundLayer = apply {\n    backgroundEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  val backgroundOpacity: Double?\n    /**\n     * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"background-opacity\")\n    }\n\n  /**\n   * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundOpacity] to set the default property.\n   *\n   * @param backgroundOpacity value of backgroundOpacity\n   */\n  override fun backgroundOpacity(backgroundOpacity: Double): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-opacity\", backgroundOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"background-opacity\".\n   *\n   */\n  val backgroundOpacityAsExpression: Expression?\n    /**\n     * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Get the BackgroundOpacity property as an Expression\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"background-opacity\")\n\n  /**\n   * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundOpacityAsExpression] to set the default property.\n   *\n   * @param backgroundOpacity value of backgroundOpacity as Expression\n   */\n  override fun backgroundOpacity(backgroundOpacity: Expression): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-opacity\", backgroundOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for BackgroundOpacity.\n   */\n  val backgroundOpacityTransition: StyleTransition?\n    /**\n     * Get the BackgroundOpacity property transition options\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"background-opacity-transition\")\n    }\n\n  /**\n   * Set the BackgroundOpacity property transition options\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun backgroundOpacityTransition(options: StyleTransition): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [backgroundOpacityTransition].\n   */\n  override fun backgroundOpacityTransition(block: StyleTransition.Builder.() -> Unit): BackgroundLayer = apply {\n    backgroundOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  val backgroundPattern: String?\n    /**\n     * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundPattern] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"background-pattern\")\n    }\n\n  /**\n   * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundPattern] to set the default property.\n   *\n   * @param backgroundPattern value of backgroundPattern\n   */\n  override fun backgroundPattern(backgroundPattern: String): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-pattern\", backgroundPattern)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * This is an Expression representation of \"background-pattern\".\n   *\n   */\n  val backgroundPatternAsExpression: Expression?\n    /**\n     * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * Get the BackgroundPattern property as an Expression\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundPatternAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"background-pattern\")\n\n  /**\n   * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundPatternAsExpression] to set the default property.\n   *\n   * @param backgroundPattern value of backgroundPattern as Expression\n   */\n  override fun backgroundPattern(backgroundPattern: Expression): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-pattern\", backgroundPattern)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Orientation of background layer. Default value: \"map\".\n   */\n  @MapboxExperimental\n  val backgroundPitchAlignment: BackgroundPitchAlignment?\n    /**\n     * Orientation of background layer. Default value: \"map\".\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundPitchAlignment] to get the default property.\n     *\n     * @return BackgroundPitchAlignment\n     */\n    get() {\n      getPropertyValue<String?>(\"background-pitch-alignment\")?.let {\n        return BackgroundPitchAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Orientation of background layer. Default value: \"map\".\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundPitchAlignment] to set the default property.\n   *\n   * @param backgroundPitchAlignment value of backgroundPitchAlignment\n   */\n  @MapboxExperimental\n  override fun backgroundPitchAlignment(backgroundPitchAlignment: BackgroundPitchAlignment): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-pitch-alignment\", backgroundPitchAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Orientation of background layer. Default value: \"map\".\n   *\n   * This is an Expression representation of \"background-pitch-alignment\".\n   *\n   */\n  @MapboxExperimental\n  val backgroundPitchAlignmentAsExpression: Expression?\n    /**\n     * Orientation of background layer. Default value: \"map\".\n     *\n     * Get the BackgroundPitchAlignment property as an Expression\n     *\n     * Use static method [BackgroundLayer.defaultBackgroundPitchAlignmentAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"background-pitch-alignment\")\n        ?: backgroundPitchAlignment?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Orientation of background layer. Default value: \"map\".\n   *\n   * Use static method [BackgroundLayer.defaultBackgroundPitchAlignmentAsExpression] to set the default property.\n   *\n   * @param backgroundPitchAlignment value of backgroundPitchAlignment as Expression\n   */\n  @MapboxExperimental\n  override fun backgroundPitchAlignment(backgroundPitchAlignment: Expression): BackgroundLayer = apply {\n    val propertyValue = PropertyValue(\"background-pitch-alignment\", backgroundPitchAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"background\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * The color with which the background will be drawn. Default value: \"#000000\".\n     */\n    val defaultBackgroundColor: String?\n      /**\n       * The color with which the background will be drawn. Default value: \"#000000\".\n       *\n       * Get the default value of BackgroundColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultBackgroundColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color with which the background will be drawn. Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"background-color\".\n     *\n     */\n    val defaultBackgroundColorAsExpression: Expression?\n      /**\n       * Get default value of the BackgroundColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color with which the background will be drawn. Default value: \"#000000\".\n     */\n    val defaultBackgroundColorAsColorInt: Int?\n      /**\n       * The color with which the background will be drawn. Default value: \"#000000\".\n       *\n       * Get the default value of BackgroundColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultBackgroundColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for BackgroundColor.\n     */\n    val defaultBackgroundColorTransition: StyleTransition?\n      /**\n       * Get the BackgroundColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [backgroundColor].\n     */\n    @MapboxExperimental\n    val defaultBackgroundColorUseTheme: String?\n      /**\n       * Get default value of the BackgroundColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [backgroundColor].\n     */\n    @MapboxExperimental\n    val defaultBackgroundColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the BackgroundColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"background\", \"background-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultBackgroundColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n     */\n    val defaultBackgroundEmissiveStrength: Double?\n      /**\n       * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n       *\n       * Get the default value of BackgroundEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n     *\n     * This is an Expression representation of \"background-emissive-strength\".\n     *\n     */\n    val defaultBackgroundEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the BackgroundEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultBackgroundEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for BackgroundEmissiveStrength.\n     */\n    val defaultBackgroundEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the BackgroundEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n     */\n    val defaultBackgroundOpacity: Double?\n      /**\n       * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of BackgroundOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"background-opacity\".\n     *\n     */\n    val defaultBackgroundOpacityAsExpression: Expression?\n      /**\n       * Get default value of the BackgroundOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultBackgroundOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for BackgroundOpacity.\n     */\n    val defaultBackgroundOpacityTransition: StyleTransition?\n      /**\n       * Get the BackgroundOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-opacity-transition\").silentUnwrap()\n\n    /**\n     * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     */\n    val defaultBackgroundPattern: String?\n      /**\n       * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n       *\n       * Get the default value of BackgroundPattern property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pattern\").silentUnwrap()\n      }\n\n    /**\n     * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * This is an Expression representation of \"background-pattern\".\n     *\n     */\n    val defaultBackgroundPatternAsExpression: Expression?\n      /**\n       * Get default value of the BackgroundPattern property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pattern\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultBackgroundPattern?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Orientation of background layer. Default value: \"map\".\n     */\n    @MapboxExperimental\n    val defaultBackgroundPitchAlignment: BackgroundPitchAlignment?\n      /**\n       * Orientation of background layer. Default value: \"map\".\n       *\n       * Get the default value of BackgroundPitchAlignment property\n       *\n       * @return BackgroundPitchAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pitch-alignment\").silentUnwrap<String>()?.let {\n          return BackgroundPitchAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Orientation of background layer. Default value: \"map\".\n     *\n     * This is an Expression representation of \"background-pitch-alignment\".\n     *\n     */\n    @MapboxExperimental\n    val defaultBackgroundPitchAlignmentAsExpression: Expression?\n      /**\n       * Get default value of the BackgroundPitchAlignment property as an Expression\n       *\n       * @return BackgroundPitchAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pitch-alignment\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultBackgroundPitchAlignment?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface BackgroundLayerDsl {\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): BackgroundLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): BackgroundLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): BackgroundLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): BackgroundLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): BackgroundLayer\n\n  // Property getters and setters\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   *\n   * @param backgroundColor value of backgroundColor\n   */\n  fun backgroundColor(backgroundColor: String = \"#000000\"): BackgroundLayer\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   *\n   * @param backgroundColor value of backgroundColor as Expression\n   */\n  fun backgroundColor(backgroundColor: Expression): BackgroundLayer\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   *\n   * @param backgroundColor value of backgroundColor\n   */\n  fun backgroundColor(@ColorInt backgroundColor: Int): BackgroundLayer\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   *\n   * Set the BackgroundColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun backgroundColorTransition(options: StyleTransition): BackgroundLayer\n\n  /**\n   * The color with which the background will be drawn. Default value: \"#000000\".\n   *\n   * DSL for [backgroundColorTransition].\n   */\n  fun backgroundColorTransition(block: StyleTransition.Builder.() -> Unit): BackgroundLayer\n\n  /**\n   * Set the backgroundColorUseTheme as String for [backgroundColor].\n   *\n   * @param backgroundColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun backgroundColorUseTheme(backgroundColorUseTheme: String): BackgroundLayer\n\n  /**\n   * Set the backgroundColorUseTheme as Expression for [backgroundColor].\n   *\n   * @param backgroundColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun backgroundColorUseTheme(backgroundColorUseTheme: Expression): BackgroundLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n   *\n   * @param backgroundEmissiveStrength value of backgroundEmissiveStrength\n   */\n  fun backgroundEmissiveStrength(backgroundEmissiveStrength: Double = 0.0): BackgroundLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n   *\n   * @param backgroundEmissiveStrength value of backgroundEmissiveStrength as Expression\n   */\n  fun backgroundEmissiveStrength(backgroundEmissiveStrength: Expression): BackgroundLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n   *\n   * Set the BackgroundEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun backgroundEmissiveStrengthTransition(options: StyleTransition): BackgroundLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of backgroundEmissiveStrength is in intensity.\n   *\n   * DSL for [backgroundEmissiveStrengthTransition].\n   */\n  fun backgroundEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): BackgroundLayer\n\n  /**\n   * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param backgroundOpacity value of backgroundOpacity\n   */\n  fun backgroundOpacity(backgroundOpacity: Double = 1.0): BackgroundLayer\n\n  /**\n   * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param backgroundOpacity value of backgroundOpacity as Expression\n   */\n  fun backgroundOpacity(backgroundOpacity: Expression): BackgroundLayer\n\n  /**\n   * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Set the BackgroundOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun backgroundOpacityTransition(options: StyleTransition): BackgroundLayer\n\n  /**\n   * The opacity at which the background will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [backgroundOpacityTransition].\n   */\n  fun backgroundOpacityTransition(block: StyleTransition.Builder.() -> Unit): BackgroundLayer\n\n  /**\n   * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param backgroundPattern value of backgroundPattern\n   */\n  fun backgroundPattern(backgroundPattern: String): BackgroundLayer\n\n  /**\n   * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param backgroundPattern value of backgroundPattern as Expression\n   */\n  fun backgroundPattern(backgroundPattern: Expression): BackgroundLayer\n\n  /**\n   * Orientation of background layer. Default value: \"map\".\n   *\n   * @param backgroundPitchAlignment value of backgroundPitchAlignment\n   */\n  @MapboxExperimental\n  fun backgroundPitchAlignment(backgroundPitchAlignment: BackgroundPitchAlignment = BackgroundPitchAlignment.MAP): BackgroundLayer\n\n  /**\n   * Orientation of background layer. Default value: \"map\".\n   *\n   * @param backgroundPitchAlignment value of backgroundPitchAlignment as Expression\n   */\n  @MapboxExperimental\n  fun backgroundPitchAlignment(backgroundPitchAlignment: Expression): BackgroundLayer\n}\n\n/**\n * DSL function for creating a [BackgroundLayer].\n */\nfun backgroundLayer(layerId: String, block: BackgroundLayerDsl.() -> Unit): BackgroundLayer = BackgroundLayer(layerId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/CircleLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A filled circle.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#circle)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass CircleLayer(override val layerId: String, val sourceId: String) : CircleLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): CircleLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): CircleLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [CircleLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [CircleLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [CircleLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[CircleLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [CircleLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [CircleLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): CircleLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [CircleLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [CircleLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): CircleLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  @MapboxExperimental\n  val circleElevationReference: CircleElevationReference?\n    /**\n     * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     *\n     * Use static method [CircleLayer.defaultCircleElevationReference] to get the default property.\n     *\n     * @return CircleElevationReference\n     */\n    get() {\n      getPropertyValue<String?>(\"circle-elevation-reference\")?.let {\n        return CircleElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * Use static method [CircleLayer.defaultCircleElevationReference] to set the default property.\n   *\n   * @param circleElevationReference value of circleElevationReference\n   */\n  @MapboxExperimental\n  override fun circleElevationReference(circleElevationReference: CircleElevationReference): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-elevation-reference\", circleElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * This is an Expression representation of \"circle-elevation-reference\".\n   *\n   */\n  @MapboxExperimental\n  val circleElevationReferenceAsExpression: Expression?\n    /**\n     * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     *\n     * Get the CircleElevationReference property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleElevationReferenceAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"circle-elevation-reference\")\n        ?: circleElevationReference?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * Use static method [CircleLayer.defaultCircleElevationReferenceAsExpression] to set the default property.\n   *\n   * @param circleElevationReference value of circleElevationReference as Expression\n   */\n  @MapboxExperimental\n  override fun circleElevationReference(circleElevationReference: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-elevation-reference\", circleElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  val circleSortKey: Double?\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     *\n     * Use static method [CircleLayer.defaultCircleSortKey] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"circle-sort-key\")\n    }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * Use static method [CircleLayer.defaultCircleSortKey] to set the default property.\n   *\n   * @param circleSortKey value of circleSortKey\n   */\n  override fun circleSortKey(circleSortKey: Double): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-sort-key\", circleSortKey)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * This is an Expression representation of \"circle-sort-key\".\n   *\n   */\n  val circleSortKeyAsExpression: Expression?\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     *\n     * Get the CircleSortKey property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleSortKeyAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"circle-sort-key\")\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * Use static method [CircleLayer.defaultCircleSortKeyAsExpression] to set the default property.\n   *\n   * @param circleSortKey value of circleSortKey as Expression\n   */\n  override fun circleSortKey(circleSortKey: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-sort-key\", circleSortKey)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   */\n  val circleBlur: Double?\n    /**\n     * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n     *\n     * Use static method [CircleLayer.defaultCircleBlur] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"circle-blur\")\n    }\n\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   *\n   * Use static method [CircleLayer.defaultCircleBlur] to set the default property.\n   *\n   * @param circleBlur value of circleBlur\n   */\n  override fun circleBlur(circleBlur: Double): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-blur\", circleBlur)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   *\n   * This is an Expression representation of \"circle-blur\".\n   *\n   */\n  val circleBlurAsExpression: Expression?\n    /**\n     * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n     *\n     * Get the CircleBlur property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleBlurAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"circle-blur\")\n\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   *\n   * Use static method [CircleLayer.defaultCircleBlurAsExpression] to set the default property.\n   *\n   * @param circleBlur value of circleBlur as Expression\n   */\n  override fun circleBlur(circleBlur: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-blur\", circleBlur)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for CircleBlur.\n   */\n  val circleBlurTransition: StyleTransition?\n    /**\n     * Get the CircleBlur property transition options\n     *\n     * Use static method [CircleLayer.defaultCircleBlurTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"circle-blur-transition\")\n    }\n\n  /**\n   * Set the CircleBlur property transition options\n   *\n   * Use static method [CircleLayer.defaultCircleBlurTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun circleBlurTransition(options: StyleTransition): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-blur-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [circleBlurTransition].\n   */\n  override fun circleBlurTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer = apply {\n    circleBlurTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   */\n  val circleColor: String?\n    /**\n     * The fill color of the circle. Default value: \"#000000\".\n     *\n     * Use static method [CircleLayer.defaultCircleColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      circleColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * Use static method [CircleLayer.defaultCircleColor] to set the default property.\n   *\n   * @param circleColor value of circleColor\n   */\n  override fun circleColor(circleColor: String): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-color\", circleColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"circle-color\".\n   *\n   */\n  val circleColorAsExpression: Expression?\n    /**\n     * The fill color of the circle. Default value: \"#000000\".\n     *\n     * Get the CircleColor property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"circle-color\")\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * Use static method [CircleLayer.defaultCircleColorAsExpression] to set the default property.\n   *\n   * @param circleColor value of circleColor as Expression\n   */\n  override fun circleColor(circleColor: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-color\", circleColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   */\n  val circleColorAsColorInt: Int?\n    /**\n     * The fill color of the circle. Default value: \"#000000\".\n     *\n     * Use static method [CircleLayer.defaultCircleColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      circleColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * Use static method [CircleLayer.defaultCircleColorAsColorInt] to set the default property.\n   *\n   * @param circleColor value of circleColor\n   */\n  override fun circleColor(@ColorInt circleColor: Int): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-color\", colorIntToRgbaExpression(circleColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for CircleColor.\n   */\n  val circleColorTransition: StyleTransition?\n    /**\n     * Get the CircleColor property transition options\n     *\n     * Use static method [CircleLayer.defaultCircleColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"circle-color-transition\")\n    }\n\n  /**\n   * Set the CircleColor property transition options\n   *\n   * Use static method [CircleLayer.defaultCircleColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun circleColorTransition(options: StyleTransition): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [circleColorTransition].\n   */\n  override fun circleColorTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer = apply {\n    circleColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [circleColor].\n   */\n  @MapboxExperimental\n  val circleColorUseTheme: String?\n    /**\n     * Get the CircleColorUseTheme property\n     *\n     * Use static method [CircleLayer.defaultCircleColorUseTheme] to get the default property.\n     *\n     * @return current CircleColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"circle-color-use-theme\")\n    }\n\n  /**\n   * Set the CircleColorUseTheme as String\n   *\n   * Use static method [CircleLayer.defaultCircleColorUseTheme] to get the default property.\n   *\n   * @param circleColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun circleColorUseTheme(circleColorUseTheme: String): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-color-use-theme\", circleColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [circleColor].\n   */\n  @MapboxExperimental\n  val circleColorUseThemeAsExpression: Expression?\n    /**\n     * Get the CircleColorUseTheme property\n     *\n     * Use static method [CircleLayer.defaultCircleColorUseTheme] to get the default property.\n     *\n     * @return current CircleColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"circle-color-use-theme\")\n\n  /**\n   * Set the CircleColorUseTheme as Expression\n   *\n   * Use static method [CircleLayer.defaultCircleColorUseTheme] to get the default property.\n   *\n   * @param circleColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun circleColorUseTheme(circleColorUseTheme: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-color-use-theme\", circleColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   */\n  val circleEmissiveStrength: Double?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n     *\n     * Use static method [CircleLayer.defaultCircleEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"circle-emissive-strength\")\n    }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   *\n   * Use static method [CircleLayer.defaultCircleEmissiveStrength] to set the default property.\n   *\n   * @param circleEmissiveStrength value of circleEmissiveStrength\n   */\n  override fun circleEmissiveStrength(circleEmissiveStrength: Double): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-emissive-strength\", circleEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   *\n   * This is an Expression representation of \"circle-emissive-strength\".\n   *\n   */\n  val circleEmissiveStrengthAsExpression: Expression?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n     *\n     * Get the CircleEmissiveStrength property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"circle-emissive-strength\")\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   *\n   * Use static method [CircleLayer.defaultCircleEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param circleEmissiveStrength value of circleEmissiveStrength as Expression\n   */\n  override fun circleEmissiveStrength(circleEmissiveStrength: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-emissive-strength\", circleEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for CircleEmissiveStrength.\n   */\n  val circleEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the CircleEmissiveStrength property transition options\n     *\n     * Use static method [CircleLayer.defaultCircleEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"circle-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the CircleEmissiveStrength property transition options\n   *\n   * Use static method [CircleLayer.defaultCircleEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun circleEmissiveStrengthTransition(options: StyleTransition): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [circleEmissiveStrengthTransition].\n   */\n  override fun circleEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer = apply {\n    circleEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  val circleOpacity: Double?\n    /**\n     * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [CircleLayer.defaultCircleOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"circle-opacity\")\n    }\n\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [CircleLayer.defaultCircleOpacity] to set the default property.\n   *\n   * @param circleOpacity value of circleOpacity\n   */\n  override fun circleOpacity(circleOpacity: Double): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-opacity\", circleOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"circle-opacity\".\n   *\n   */\n  val circleOpacityAsExpression: Expression?\n    /**\n     * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Get the CircleOpacity property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"circle-opacity\")\n\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [CircleLayer.defaultCircleOpacityAsExpression] to set the default property.\n   *\n   * @param circleOpacity value of circleOpacity as Expression\n   */\n  override fun circleOpacity(circleOpacity: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-opacity\", circleOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for CircleOpacity.\n   */\n  val circleOpacityTransition: StyleTransition?\n    /**\n     * Get the CircleOpacity property transition options\n     *\n     * Use static method [CircleLayer.defaultCircleOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"circle-opacity-transition\")\n    }\n\n  /**\n   * Set the CircleOpacity property transition options\n   *\n   * Use static method [CircleLayer.defaultCircleOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun circleOpacityTransition(options: StyleTransition): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [circleOpacityTransition].\n   */\n  override fun circleOpacityTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer = apply {\n    circleOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Orientation of circle when map is pitched. Default value: \"viewport\".\n   */\n  val circlePitchAlignment: CirclePitchAlignment?\n    /**\n     * Orientation of circle when map is pitched. Default value: \"viewport\".\n     *\n     * Use static method [CircleLayer.defaultCirclePitchAlignment] to get the default property.\n     *\n     * @return CirclePitchAlignment\n     */\n    get() {\n      getPropertyValue<String?>(\"circle-pitch-alignment\")?.let {\n        return CirclePitchAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Orientation of circle when map is pitched. Default value: \"viewport\".\n   *\n   * Use static method [CircleLayer.defaultCirclePitchAlignment] to set the default property.\n   *\n   * @param circlePitchAlignment value of circlePitchAlignment\n   */\n  override fun circlePitchAlignment(circlePitchAlignment: CirclePitchAlignment): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-pitch-alignment\", circlePitchAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Orientation of circle when map is pitched. Default value: \"viewport\".\n   *\n   * This is an Expression representation of \"circle-pitch-alignment\".\n   *\n   */\n  val circlePitchAlignmentAsExpression: Expression?\n    /**\n     * Orientation of circle when map is pitched. Default value: \"viewport\".\n     *\n     * Get the CirclePitchAlignment property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCirclePitchAlignmentAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"circle-pitch-alignment\")\n        ?: circlePitchAlignment?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Orientation of circle when map is pitched. Default value: \"viewport\".\n   *\n   * Use static method [CircleLayer.defaultCirclePitchAlignmentAsExpression] to set the default property.\n   *\n   * @param circlePitchAlignment value of circlePitchAlignment as Expression\n   */\n  override fun circlePitchAlignment(circlePitchAlignment: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-pitch-alignment\", circlePitchAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n   */\n  val circlePitchScale: CirclePitchScale?\n    /**\n     * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n     *\n     * Use static method [CircleLayer.defaultCirclePitchScale] to get the default property.\n     *\n     * @return CirclePitchScale\n     */\n    get() {\n      getPropertyValue<String?>(\"circle-pitch-scale\")?.let {\n        return CirclePitchScale.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n   *\n   * Use static method [CircleLayer.defaultCirclePitchScale] to set the default property.\n   *\n   * @param circlePitchScale value of circlePitchScale\n   */\n  override fun circlePitchScale(circlePitchScale: CirclePitchScale): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-pitch-scale\", circlePitchScale)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n   *\n   * This is an Expression representation of \"circle-pitch-scale\".\n   *\n   */\n  val circlePitchScaleAsExpression: Expression?\n    /**\n     * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n     *\n     * Get the CirclePitchScale property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCirclePitchScaleAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"circle-pitch-scale\")\n        ?: circlePitchScale?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n   *\n   * Use static method [CircleLayer.defaultCirclePitchScaleAsExpression] to set the default property.\n   *\n   * @param circlePitchScale value of circlePitchScale as Expression\n   */\n  override fun circlePitchScale(circlePitchScale: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-pitch-scale\", circlePitchScale)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   */\n  val circleRadius: Double?\n    /**\n     * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n     *\n     * Use static method [CircleLayer.defaultCircleRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"circle-radius\")\n    }\n\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   *\n   * Use static method [CircleLayer.defaultCircleRadius] to set the default property.\n   *\n   * @param circleRadius value of circleRadius\n   */\n  override fun circleRadius(circleRadius: Double): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-radius\", circleRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   *\n   * This is an Expression representation of \"circle-radius\".\n   *\n   */\n  val circleRadiusAsExpression: Expression?\n    /**\n     * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n     *\n     * Get the CircleRadius property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"circle-radius\")\n\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   *\n   * Use static method [CircleLayer.defaultCircleRadiusAsExpression] to set the default property.\n   *\n   * @param circleRadius value of circleRadius as Expression\n   */\n  override fun circleRadius(circleRadius: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-radius\", circleRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for CircleRadius.\n   */\n  val circleRadiusTransition: StyleTransition?\n    /**\n     * Get the CircleRadius property transition options\n     *\n     * Use static method [CircleLayer.defaultCircleRadiusTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"circle-radius-transition\")\n    }\n\n  /**\n   * Set the CircleRadius property transition options\n   *\n   * Use static method [CircleLayer.defaultCircleRadiusTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun circleRadiusTransition(options: StyleTransition): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-radius-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [circleRadiusTransition].\n   */\n  override fun circleRadiusTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer = apply {\n    circleRadiusTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   */\n  val circleStrokeColor: String?\n    /**\n     * The stroke color of the circle. Default value: \"#000000\".\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      circleStrokeColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeColor] to set the default property.\n   *\n   * @param circleStrokeColor value of circleStrokeColor\n   */\n  override fun circleStrokeColor(circleStrokeColor: String): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-color\", circleStrokeColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"circle-stroke-color\".\n   *\n   */\n  val circleStrokeColorAsExpression: Expression?\n    /**\n     * The stroke color of the circle. Default value: \"#000000\".\n     *\n     * Get the CircleStrokeColor property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"circle-stroke-color\")\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeColorAsExpression] to set the default property.\n   *\n   * @param circleStrokeColor value of circleStrokeColor as Expression\n   */\n  override fun circleStrokeColor(circleStrokeColor: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-color\", circleStrokeColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   */\n  val circleStrokeColorAsColorInt: Int?\n    /**\n     * The stroke color of the circle. Default value: \"#000000\".\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      circleStrokeColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeColorAsColorInt] to set the default property.\n   *\n   * @param circleStrokeColor value of circleStrokeColor\n   */\n  override fun circleStrokeColor(@ColorInt circleStrokeColor: Int): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-color\", colorIntToRgbaExpression(circleStrokeColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for CircleStrokeColor.\n   */\n  val circleStrokeColorTransition: StyleTransition?\n    /**\n     * Get the CircleStrokeColor property transition options\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"circle-stroke-color-transition\")\n    }\n\n  /**\n   * Set the CircleStrokeColor property transition options\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun circleStrokeColorTransition(options: StyleTransition): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [circleStrokeColorTransition].\n   */\n  override fun circleStrokeColorTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer = apply {\n    circleStrokeColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [circleStrokeColor].\n   */\n  @MapboxExperimental\n  val circleStrokeColorUseTheme: String?\n    /**\n     * Get the CircleStrokeColorUseTheme property\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeColorUseTheme] to get the default property.\n     *\n     * @return current CircleStrokeColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"circle-stroke-color-use-theme\")\n    }\n\n  /**\n   * Set the CircleStrokeColorUseTheme as String\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeColorUseTheme] to get the default property.\n   *\n   * @param circleStrokeColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun circleStrokeColorUseTheme(circleStrokeColorUseTheme: String): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-color-use-theme\", circleStrokeColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [circleStrokeColor].\n   */\n  @MapboxExperimental\n  val circleStrokeColorUseThemeAsExpression: Expression?\n    /**\n     * Get the CircleStrokeColorUseTheme property\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeColorUseTheme] to get the default property.\n     *\n     * @return current CircleStrokeColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"circle-stroke-color-use-theme\")\n\n  /**\n   * Set the CircleStrokeColorUseTheme as Expression\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeColorUseTheme] to get the default property.\n   *\n   * @param circleStrokeColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun circleStrokeColorUseTheme(circleStrokeColorUseTheme: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-color-use-theme\", circleStrokeColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   */\n  val circleStrokeOpacity: Double?\n    /**\n     * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"circle-stroke-opacity\")\n    }\n\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeOpacity] to set the default property.\n   *\n   * @param circleStrokeOpacity value of circleStrokeOpacity\n   */\n  override fun circleStrokeOpacity(circleStrokeOpacity: Double): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-opacity\", circleStrokeOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"circle-stroke-opacity\".\n   *\n   */\n  val circleStrokeOpacityAsExpression: Expression?\n    /**\n     * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n     *\n     * Get the CircleStrokeOpacity property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"circle-stroke-opacity\")\n\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeOpacityAsExpression] to set the default property.\n   *\n   * @param circleStrokeOpacity value of circleStrokeOpacity as Expression\n   */\n  override fun circleStrokeOpacity(circleStrokeOpacity: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-opacity\", circleStrokeOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for CircleStrokeOpacity.\n   */\n  val circleStrokeOpacityTransition: StyleTransition?\n    /**\n     * Get the CircleStrokeOpacity property transition options\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"circle-stroke-opacity-transition\")\n    }\n\n  /**\n   * Set the CircleStrokeOpacity property transition options\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun circleStrokeOpacityTransition(options: StyleTransition): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [circleStrokeOpacityTransition].\n   */\n  override fun circleStrokeOpacityTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer = apply {\n    circleStrokeOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   */\n  val circleStrokeWidth: Double?\n    /**\n     * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeWidth] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"circle-stroke-width\")\n    }\n\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeWidth] to set the default property.\n   *\n   * @param circleStrokeWidth value of circleStrokeWidth\n   */\n  override fun circleStrokeWidth(circleStrokeWidth: Double): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-width\", circleStrokeWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   *\n   * This is an Expression representation of \"circle-stroke-width\".\n   *\n   */\n  val circleStrokeWidthAsExpression: Expression?\n    /**\n     * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n     *\n     * Get the CircleStrokeWidth property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeWidthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"circle-stroke-width\")\n\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeWidthAsExpression] to set the default property.\n   *\n   * @param circleStrokeWidth value of circleStrokeWidth as Expression\n   */\n  override fun circleStrokeWidth(circleStrokeWidth: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-width\", circleStrokeWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for CircleStrokeWidth.\n   */\n  val circleStrokeWidthTransition: StyleTransition?\n    /**\n     * Get the CircleStrokeWidth property transition options\n     *\n     * Use static method [CircleLayer.defaultCircleStrokeWidthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"circle-stroke-width-transition\")\n    }\n\n  /**\n   * Set the CircleStrokeWidth property transition options\n   *\n   * Use static method [CircleLayer.defaultCircleStrokeWidthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun circleStrokeWidthTransition(options: StyleTransition): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-stroke-width-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [circleStrokeWidthTransition].\n   */\n  override fun circleStrokeWidthTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer = apply {\n    circleStrokeWidthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   */\n  val circleTranslate: List<Double>?\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n     *\n     * Use static method [CircleLayer.defaultCircleTranslate] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"circle-translate\")\n    }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   *\n   * Use static method [CircleLayer.defaultCircleTranslate] to set the default property.\n   *\n   * @param circleTranslate value of circleTranslate\n   */\n  override fun circleTranslate(circleTranslate: List<Double>): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-translate\", circleTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   *\n   * This is an Expression representation of \"circle-translate\".\n   *\n   */\n  val circleTranslateAsExpression: Expression?\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n     *\n     * Get the CircleTranslate property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleTranslateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"circle-translate\")\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   *\n   * Use static method [CircleLayer.defaultCircleTranslateAsExpression] to set the default property.\n   *\n   * @param circleTranslate value of circleTranslate as Expression\n   */\n  override fun circleTranslate(circleTranslate: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-translate\", circleTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for CircleTranslate.\n   */\n  val circleTranslateTransition: StyleTransition?\n    /**\n     * Get the CircleTranslate property transition options\n     *\n     * Use static method [CircleLayer.defaultCircleTranslateTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"circle-translate-transition\")\n    }\n\n  /**\n   * Set the CircleTranslate property transition options\n   *\n   * Use static method [CircleLayer.defaultCircleTranslateTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun circleTranslateTransition(options: StyleTransition): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-translate-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [circleTranslateTransition].\n   */\n  override fun circleTranslateTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer = apply {\n    circleTranslateTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n   */\n  val circleTranslateAnchor: CircleTranslateAnchor?\n    /**\n     * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n     *\n     * Use static method [CircleLayer.defaultCircleTranslateAnchor] to get the default property.\n     *\n     * @return CircleTranslateAnchor\n     */\n    get() {\n      getPropertyValue<String?>(\"circle-translate-anchor\")?.let {\n        return CircleTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n   *\n   * Use static method [CircleLayer.defaultCircleTranslateAnchor] to set the default property.\n   *\n   * @param circleTranslateAnchor value of circleTranslateAnchor\n   */\n  override fun circleTranslateAnchor(circleTranslateAnchor: CircleTranslateAnchor): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-translate-anchor\", circleTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n   *\n   * This is an Expression representation of \"circle-translate-anchor\".\n   *\n   */\n  val circleTranslateAnchorAsExpression: Expression?\n    /**\n     * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n     *\n     * Get the CircleTranslateAnchor property as an Expression\n     *\n     * Use static method [CircleLayer.defaultCircleTranslateAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"circle-translate-anchor\")\n        ?: circleTranslateAnchor?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n   *\n   * Use static method [CircleLayer.defaultCircleTranslateAnchorAsExpression] to set the default property.\n   *\n   * @param circleTranslateAnchor value of circleTranslateAnchor as Expression\n   */\n  override fun circleTranslateAnchor(circleTranslateAnchor: Expression): CircleLayer = apply {\n    val propertyValue = PropertyValue(\"circle-translate-anchor\", circleTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"circle\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     */\n    @MapboxExperimental\n    val defaultCircleElevationReference: CircleElevationReference?\n      /**\n       * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n       *\n       * Get the default value of CircleElevationReference property\n       *\n       * @return CircleElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-elevation-reference\").silentUnwrap<String>()?.let {\n          return CircleElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     *\n     * This is an Expression representation of \"circle-elevation-reference\".\n     *\n     */\n    @MapboxExperimental\n    val defaultCircleElevationReferenceAsExpression: Expression?\n      /**\n       * Get default value of the CircleElevationReference property as an Expression\n       *\n       * @return CircleElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-elevation-reference\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleElevationReference?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     */\n    val defaultCircleSortKey: Double?\n      /**\n       * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n       *\n       * Get the default value of CircleSortKey property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-sort-key\").silentUnwrap()\n      }\n\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     *\n     * This is an Expression representation of \"circle-sort-key\".\n     *\n     */\n    val defaultCircleSortKeyAsExpression: Expression?\n      /**\n       * Get default value of the CircleSortKey property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-sort-key\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleSortKey?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n     */\n    val defaultCircleBlur: Double?\n      /**\n       * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n       *\n       * Get the default value of CircleBlur property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-blur\").silentUnwrap()\n      }\n\n    /**\n     * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n     *\n     * This is an Expression representation of \"circle-blur\".\n     *\n     */\n    val defaultCircleBlurAsExpression: Expression?\n      /**\n       * Get default value of the CircleBlur property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-blur\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleBlur?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for CircleBlur.\n     */\n    val defaultCircleBlurTransition: StyleTransition?\n      /**\n       * Get the CircleBlur property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-blur-transition\").silentUnwrap()\n\n    /**\n     * The fill color of the circle. Default value: \"#000000\".\n     */\n    val defaultCircleColor: String?\n      /**\n       * The fill color of the circle. Default value: \"#000000\".\n       *\n       * Get the default value of CircleColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultCircleColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The fill color of the circle. Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"circle-color\".\n     *\n     */\n    val defaultCircleColorAsExpression: Expression?\n      /**\n       * Get default value of the CircleColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The fill color of the circle. Default value: \"#000000\".\n     */\n    val defaultCircleColorAsColorInt: Int?\n      /**\n       * The fill color of the circle. Default value: \"#000000\".\n       *\n       * Get the default value of CircleColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultCircleColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for CircleColor.\n     */\n    val defaultCircleColorTransition: StyleTransition?\n      /**\n       * Get the CircleColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [circleColor].\n     */\n    @MapboxExperimental\n    val defaultCircleColorUseTheme: String?\n      /**\n       * Get default value of the CircleColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [circleColor].\n     */\n    @MapboxExperimental\n    val defaultCircleColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the CircleColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultCircleColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n     */\n    val defaultCircleEmissiveStrength: Double?\n      /**\n       * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n       *\n       * Get the default value of CircleEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n     *\n     * This is an Expression representation of \"circle-emissive-strength\".\n     *\n     */\n    val defaultCircleEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the CircleEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for CircleEmissiveStrength.\n     */\n    val defaultCircleEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the CircleEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n     */\n    val defaultCircleOpacity: Double?\n      /**\n       * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of CircleOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"circle-opacity\".\n     *\n     */\n    val defaultCircleOpacityAsExpression: Expression?\n      /**\n       * Get default value of the CircleOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for CircleOpacity.\n     */\n    val defaultCircleOpacityTransition: StyleTransition?\n      /**\n       * Get the CircleOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-opacity-transition\").silentUnwrap()\n\n    /**\n     * Orientation of circle when map is pitched. Default value: \"viewport\".\n     */\n    val defaultCirclePitchAlignment: CirclePitchAlignment?\n      /**\n       * Orientation of circle when map is pitched. Default value: \"viewport\".\n       *\n       * Get the default value of CirclePitchAlignment property\n       *\n       * @return CirclePitchAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-alignment\").silentUnwrap<String>()?.let {\n          return CirclePitchAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Orientation of circle when map is pitched. Default value: \"viewport\".\n     *\n     * This is an Expression representation of \"circle-pitch-alignment\".\n     *\n     */\n    val defaultCirclePitchAlignmentAsExpression: Expression?\n      /**\n       * Get default value of the CirclePitchAlignment property as an Expression\n       *\n       * @return CirclePitchAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-alignment\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCirclePitchAlignment?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n     */\n    val defaultCirclePitchScale: CirclePitchScale?\n      /**\n       * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n       *\n       * Get the default value of CirclePitchScale property\n       *\n       * @return CirclePitchScale\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-scale\").silentUnwrap<String>()?.let {\n          return CirclePitchScale.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n     *\n     * This is an Expression representation of \"circle-pitch-scale\".\n     *\n     */\n    val defaultCirclePitchScaleAsExpression: Expression?\n      /**\n       * Get default value of the CirclePitchScale property as an Expression\n       *\n       * @return CirclePitchScale\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-scale\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCirclePitchScale?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n     */\n    val defaultCircleRadius: Double?\n      /**\n       * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n       *\n       * Get the default value of CircleRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-radius\").silentUnwrap()\n      }\n\n    /**\n     * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n     *\n     * This is an Expression representation of \"circle-radius\".\n     *\n     */\n    val defaultCircleRadiusAsExpression: Expression?\n      /**\n       * Get default value of the CircleRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for CircleRadius.\n     */\n    val defaultCircleRadiusTransition: StyleTransition?\n      /**\n       * Get the CircleRadius property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-radius-transition\").silentUnwrap()\n\n    /**\n     * The stroke color of the circle. Default value: \"#000000\".\n     */\n    val defaultCircleStrokeColor: String?\n      /**\n       * The stroke color of the circle. Default value: \"#000000\".\n       *\n       * Get the default value of CircleStrokeColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultCircleStrokeColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The stroke color of the circle. Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"circle-stroke-color\".\n     *\n     */\n    val defaultCircleStrokeColorAsExpression: Expression?\n      /**\n       * Get default value of the CircleStrokeColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The stroke color of the circle. Default value: \"#000000\".\n     */\n    val defaultCircleStrokeColorAsColorInt: Int?\n      /**\n       * The stroke color of the circle. Default value: \"#000000\".\n       *\n       * Get the default value of CircleStrokeColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultCircleStrokeColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for CircleStrokeColor.\n     */\n    val defaultCircleStrokeColorTransition: StyleTransition?\n      /**\n       * Get the CircleStrokeColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [circleStrokeColor].\n     */\n    @MapboxExperimental\n    val defaultCircleStrokeColorUseTheme: String?\n      /**\n       * Get default value of the CircleStrokeColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [circleStrokeColor].\n     */\n    @MapboxExperimental\n    val defaultCircleStrokeColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the CircleStrokeColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultCircleStrokeColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n     */\n    val defaultCircleStrokeOpacity: Double?\n      /**\n       * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of CircleStrokeOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"circle-stroke-opacity\".\n     *\n     */\n    val defaultCircleStrokeOpacityAsExpression: Expression?\n      /**\n       * Get default value of the CircleStrokeOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleStrokeOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for CircleStrokeOpacity.\n     */\n    val defaultCircleStrokeOpacityTransition: StyleTransition?\n      /**\n       * Get the CircleStrokeOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-opacity-transition\").silentUnwrap()\n\n    /**\n     * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n     */\n    val defaultCircleStrokeWidth: Double?\n      /**\n       * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n       *\n       * Get the default value of CircleStrokeWidth property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-width\").silentUnwrap()\n      }\n\n    /**\n     * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n     *\n     * This is an Expression representation of \"circle-stroke-width\".\n     *\n     */\n    val defaultCircleStrokeWidthAsExpression: Expression?\n      /**\n       * Get default value of the CircleStrokeWidth property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-width\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleStrokeWidth?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for CircleStrokeWidth.\n     */\n    val defaultCircleStrokeWidthTransition: StyleTransition?\n      /**\n       * Get the CircleStrokeWidth property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-width-transition\").silentUnwrap()\n\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n     */\n    val defaultCircleTranslate: List<Double>?\n      /**\n       * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n       *\n       * Get the default value of CircleTranslate property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate\").silentUnwrap()\n      }\n\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n     *\n     * This is an Expression representation of \"circle-translate\".\n     *\n     */\n    val defaultCircleTranslateAsExpression: Expression?\n      /**\n       * Get default value of the CircleTranslate property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleTranslate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for CircleTranslate.\n     */\n    val defaultCircleTranslateTransition: StyleTransition?\n      /**\n       * Get the CircleTranslate property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate-transition\").silentUnwrap()\n\n    /**\n     * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n     */\n    val defaultCircleTranslateAnchor: CircleTranslateAnchor?\n      /**\n       * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n       *\n       * Get the default value of CircleTranslateAnchor property\n       *\n       * @return CircleTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate-anchor\").silentUnwrap<String>()?.let {\n          return CircleTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n     *\n     * This is an Expression representation of \"circle-translate-anchor\".\n     *\n     */\n    val defaultCircleTranslateAnchorAsExpression: Expression?\n      /**\n       * Get default value of the CircleTranslateAnchor property as an Expression\n       *\n       * @return CircleTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultCircleTranslateAnchor?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface CircleLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): CircleLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): CircleLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): CircleLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): CircleLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): CircleLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): CircleLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): CircleLayer\n\n  // Property getters and setters\n\n  /**\n   * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * @param circleElevationReference value of circleElevationReference\n   */\n  @MapboxExperimental\n  fun circleElevationReference(circleElevationReference: CircleElevationReference = CircleElevationReference.NONE): CircleLayer\n\n  /**\n   * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * @param circleElevationReference value of circleElevationReference as Expression\n   */\n  @MapboxExperimental\n  fun circleElevationReference(circleElevationReference: Expression): CircleLayer\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * @param circleSortKey value of circleSortKey\n   */\n  fun circleSortKey(circleSortKey: Double): CircleLayer\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * @param circleSortKey value of circleSortKey as Expression\n   */\n  fun circleSortKey(circleSortKey: Expression): CircleLayer\n\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   *\n   * @param circleBlur value of circleBlur\n   */\n  fun circleBlur(circleBlur: Double = 0.0): CircleLayer\n\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   *\n   * @param circleBlur value of circleBlur as Expression\n   */\n  fun circleBlur(circleBlur: Expression): CircleLayer\n\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   *\n   * Set the CircleBlur property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun circleBlurTransition(options: StyleTransition): CircleLayer\n\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   *\n   * DSL for [circleBlurTransition].\n   */\n  fun circleBlurTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * @param circleColor value of circleColor\n   */\n  fun circleColor(circleColor: String = \"#000000\"): CircleLayer\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * @param circleColor value of circleColor as Expression\n   */\n  fun circleColor(circleColor: Expression): CircleLayer\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * @param circleColor value of circleColor\n   */\n  fun circleColor(@ColorInt circleColor: Int): CircleLayer\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * Set the CircleColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun circleColorTransition(options: StyleTransition): CircleLayer\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * DSL for [circleColorTransition].\n   */\n  fun circleColorTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer\n\n  /**\n   * Set the circleColorUseTheme as String for [circleColor].\n   *\n   * @param circleColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun circleColorUseTheme(circleColorUseTheme: String): CircleLayer\n\n  /**\n   * Set the circleColorUseTheme as Expression for [circleColor].\n   *\n   * @param circleColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun circleColorUseTheme(circleColorUseTheme: Expression): CircleLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   *\n   * @param circleEmissiveStrength value of circleEmissiveStrength\n   */\n  fun circleEmissiveStrength(circleEmissiveStrength: Double = 0.0): CircleLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   *\n   * @param circleEmissiveStrength value of circleEmissiveStrength as Expression\n   */\n  fun circleEmissiveStrength(circleEmissiveStrength: Expression): CircleLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   *\n   * Set the CircleEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun circleEmissiveStrengthTransition(options: StyleTransition): CircleLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   *\n   * DSL for [circleEmissiveStrengthTransition].\n   */\n  fun circleEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer\n\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param circleOpacity value of circleOpacity\n   */\n  fun circleOpacity(circleOpacity: Double = 1.0): CircleLayer\n\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param circleOpacity value of circleOpacity as Expression\n   */\n  fun circleOpacity(circleOpacity: Expression): CircleLayer\n\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Set the CircleOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun circleOpacityTransition(options: StyleTransition): CircleLayer\n\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [circleOpacityTransition].\n   */\n  fun circleOpacityTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer\n\n  /**\n   * Orientation of circle when map is pitched. Default value: \"viewport\".\n   *\n   * @param circlePitchAlignment value of circlePitchAlignment\n   */\n  fun circlePitchAlignment(circlePitchAlignment: CirclePitchAlignment = CirclePitchAlignment.VIEWPORT): CircleLayer\n\n  /**\n   * Orientation of circle when map is pitched. Default value: \"viewport\".\n   *\n   * @param circlePitchAlignment value of circlePitchAlignment as Expression\n   */\n  fun circlePitchAlignment(circlePitchAlignment: Expression): CircleLayer\n\n  /**\n   * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n   *\n   * @param circlePitchScale value of circlePitchScale\n   */\n  fun circlePitchScale(circlePitchScale: CirclePitchScale = CirclePitchScale.MAP): CircleLayer\n\n  /**\n   * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n   *\n   * @param circlePitchScale value of circlePitchScale as Expression\n   */\n  fun circlePitchScale(circlePitchScale: Expression): CircleLayer\n\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   *\n   * @param circleRadius value of circleRadius\n   */\n  fun circleRadius(circleRadius: Double = 5.0): CircleLayer\n\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   *\n   * @param circleRadius value of circleRadius as Expression\n   */\n  fun circleRadius(circleRadius: Expression): CircleLayer\n\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   *\n   * Set the CircleRadius property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun circleRadiusTransition(options: StyleTransition): CircleLayer\n\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   *\n   * DSL for [circleRadiusTransition].\n   */\n  fun circleRadiusTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * @param circleStrokeColor value of circleStrokeColor\n   */\n  fun circleStrokeColor(circleStrokeColor: String = \"#000000\"): CircleLayer\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * @param circleStrokeColor value of circleStrokeColor as Expression\n   */\n  fun circleStrokeColor(circleStrokeColor: Expression): CircleLayer\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * @param circleStrokeColor value of circleStrokeColor\n   */\n  fun circleStrokeColor(@ColorInt circleStrokeColor: Int): CircleLayer\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * Set the CircleStrokeColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun circleStrokeColorTransition(options: StyleTransition): CircleLayer\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * DSL for [circleStrokeColorTransition].\n   */\n  fun circleStrokeColorTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer\n\n  /**\n   * Set the circleStrokeColorUseTheme as String for [circleStrokeColor].\n   *\n   * @param circleStrokeColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun circleStrokeColorUseTheme(circleStrokeColorUseTheme: String): CircleLayer\n\n  /**\n   * Set the circleStrokeColorUseTheme as Expression for [circleStrokeColor].\n   *\n   * @param circleStrokeColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun circleStrokeColorUseTheme(circleStrokeColorUseTheme: Expression): CircleLayer\n\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   *\n   * @param circleStrokeOpacity value of circleStrokeOpacity\n   */\n  fun circleStrokeOpacity(circleStrokeOpacity: Double = 1.0): CircleLayer\n\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   *\n   * @param circleStrokeOpacity value of circleStrokeOpacity as Expression\n   */\n  fun circleStrokeOpacity(circleStrokeOpacity: Expression): CircleLayer\n\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   *\n   * Set the CircleStrokeOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun circleStrokeOpacityTransition(options: StyleTransition): CircleLayer\n\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [circleStrokeOpacityTransition].\n   */\n  fun circleStrokeOpacityTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer\n\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   *\n   * @param circleStrokeWidth value of circleStrokeWidth\n   */\n  fun circleStrokeWidth(circleStrokeWidth: Double = 0.0): CircleLayer\n\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   *\n   * @param circleStrokeWidth value of circleStrokeWidth as Expression\n   */\n  fun circleStrokeWidth(circleStrokeWidth: Expression): CircleLayer\n\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   *\n   * Set the CircleStrokeWidth property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun circleStrokeWidthTransition(options: StyleTransition): CircleLayer\n\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   *\n   * DSL for [circleStrokeWidthTransition].\n   */\n  fun circleStrokeWidthTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   *\n   * @param circleTranslate value of circleTranslate\n   */\n  fun circleTranslate(circleTranslate: List<Double> = listOf(0.0, 0.0)): CircleLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   *\n   * @param circleTranslate value of circleTranslate as Expression\n   */\n  fun circleTranslate(circleTranslate: Expression): CircleLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   *\n   * Set the CircleTranslate property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun circleTranslateTransition(options: StyleTransition): CircleLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   *\n   * DSL for [circleTranslateTransition].\n   */\n  fun circleTranslateTransition(block: StyleTransition.Builder.() -> Unit): CircleLayer\n\n  /**\n   * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n   *\n   * @param circleTranslateAnchor value of circleTranslateAnchor\n   */\n  fun circleTranslateAnchor(circleTranslateAnchor: CircleTranslateAnchor = CircleTranslateAnchor.MAP): CircleLayer\n\n  /**\n   * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n   *\n   * @param circleTranslateAnchor value of circleTranslateAnchor as Expression\n   */\n  fun circleTranslateAnchor(circleTranslateAnchor: Expression): CircleLayer\n}\n\n/**\n * DSL function for creating a [CircleLayer].\n */\nfun circleLayer(layerId: String, sourceId: String, block: CircleLayerDsl.() -> Unit): CircleLayer = CircleLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/ClipLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * Layer that removes 3D content from map.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#clip)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass ClipLayer(override val layerId: String, val sourceId: String) : ClipLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): ClipLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): ClipLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): ClipLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [ClipLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [ClipLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [ClipLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): ClipLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[ClipLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): ClipLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [ClipLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [ClipLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): ClipLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [ClipLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [ClipLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): ClipLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n   */\n  val clipLayerScope: List<String>?\n    /**\n     * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n     *\n     * Use static method [ClipLayer.defaultClipLayerScope] to get the default property.\n     *\n     * @return List<String>\n     */\n    get() {\n      return getPropertyValue(\"clip-layer-scope\")\n    }\n\n  /**\n   * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n   *\n   * Use static method [ClipLayer.defaultClipLayerScope] to set the default property.\n   *\n   * @param clipLayerScope value of clipLayerScope\n   */\n  override fun clipLayerScope(clipLayerScope: List<String>): ClipLayer = apply {\n    val propertyValue = PropertyValue(\"clip-layer-scope\", clipLayerScope)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n   *\n   * This is an Expression representation of \"clip-layer-scope\".\n   *\n   */\n  val clipLayerScopeAsExpression: Expression?\n    /**\n     * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n     *\n     * Get the ClipLayerScope property as an Expression\n     *\n     * Use static method [ClipLayer.defaultClipLayerScopeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"clip-layer-scope\")\n\n  /**\n   * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n   *\n   * Use static method [ClipLayer.defaultClipLayerScopeAsExpression] to set the default property.\n   *\n   * @param clipLayerScope value of clipLayerScope as Expression\n   */\n  override fun clipLayerScope(clipLayerScope: Expression): ClipLayer = apply {\n    val propertyValue = PropertyValue(\"clip-layer-scope\", clipLayerScope)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n   */\n  val clipLayerTypes: List<String>?\n    /**\n     * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n     *\n     * Use static method [ClipLayer.defaultClipLayerTypes] to get the default property.\n     *\n     * @return List<String>\n     */\n    get() {\n      return getPropertyValue(\"clip-layer-types\")\n    }\n\n  /**\n   * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n   *\n   * Use static method [ClipLayer.defaultClipLayerTypes] to set the default property.\n   *\n   * @param clipLayerTypes value of clipLayerTypes\n   */\n  override fun clipLayerTypes(clipLayerTypes: List<String>): ClipLayer = apply {\n    val propertyValue = PropertyValue(\"clip-layer-types\", clipLayerTypes)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n   *\n   * This is an Expression representation of \"clip-layer-types\".\n   *\n   */\n  val clipLayerTypesAsExpression: Expression?\n    /**\n     * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n     *\n     * Get the ClipLayerTypes property as an Expression\n     *\n     * Use static method [ClipLayer.defaultClipLayerTypesAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"clip-layer-types\")\n\n  /**\n   * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n   *\n   * Use static method [ClipLayer.defaultClipLayerTypesAsExpression] to set the default property.\n   *\n   * @param clipLayerTypes value of clipLayerTypes as Expression\n   */\n  override fun clipLayerTypes(clipLayerTypes: Expression): ClipLayer = apply {\n    val propertyValue = PropertyValue(\"clip-layer-types\", clipLayerTypes)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"clip\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n     */\n    val defaultClipLayerScope: List<String>?\n      /**\n       * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n       *\n       * Get the default value of ClipLayerScope property\n       *\n       * @return List<String>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-scope\").silentUnwrap()\n      }\n\n    /**\n     * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n     *\n     * This is an Expression representation of \"clip-layer-scope\".\n     *\n     */\n    val defaultClipLayerScopeAsExpression: Expression?\n      /**\n       * Get default value of the ClipLayerScope property as an Expression\n       *\n       * @return List<String>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-scope\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultClipLayerScope?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n     */\n    val defaultClipLayerTypes: List<String>?\n      /**\n       * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n       *\n       * Get the default value of ClipLayerTypes property\n       *\n       * @return List<String>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-types\").silentUnwrap()\n      }\n\n    /**\n     * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n     *\n     * This is an Expression representation of \"clip-layer-types\".\n     *\n     */\n    val defaultClipLayerTypesAsExpression: Expression?\n      /**\n       * Get default value of the ClipLayerTypes property as an Expression\n       *\n       * @return List<String>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-types\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultClipLayerTypes?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface ClipLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): ClipLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): ClipLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): ClipLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): ClipLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): ClipLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): ClipLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): ClipLayer\n\n  // Property getters and setters\n\n  /**\n   * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n   *\n   * @param clipLayerScope value of clipLayerScope\n   */\n  fun clipLayerScope(clipLayerScope: List<String> = listOf(\"\")): ClipLayer\n\n  /**\n   * Removes content from layers with the specified scope. By default all layers are affected. For example specifying `basemap` will only remove content from the Mapbox Standard style layers which have the same scope Default value: [].\n   *\n   * @param clipLayerScope value of clipLayerScope as Expression\n   */\n  fun clipLayerScope(clipLayerScope: Expression): ClipLayer\n\n  /**\n   * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n   *\n   * @param clipLayerTypes value of clipLayerTypes\n   */\n  fun clipLayerTypes(clipLayerTypes: List<String> = listOf()): ClipLayer\n\n  /**\n   * Layer types that will also be removed if fallen below this clip layer. Default value: [].\n   *\n   * @param clipLayerTypes value of clipLayerTypes as Expression\n   */\n  fun clipLayerTypes(clipLayerTypes: Expression): ClipLayer\n}\n\n/**\n * DSL function for creating a [ClipLayer].\n */\nfun clipLayer(layerId: String, sourceId: String, block: ClipLayerDsl.() -> Unit): ClipLayer = ClipLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/FillExtrusionLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * An extruded (3D) polygon.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#fill-extrusion)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass FillExtrusionLayer(override val layerId: String, val sourceId: String) : FillExtrusionLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): FillExtrusionLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): FillExtrusionLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [FillExtrusionLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [FillExtrusionLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [FillExtrusionLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[FillExtrusionLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [FillExtrusionLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [FillExtrusionLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): FillExtrusionLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [FillExtrusionLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [FillExtrusionLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): FillExtrusionLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val fillExtrusionEdgeRadius: Double?\n    /**\n     * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionEdgeRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-edge-radius\")\n    }\n\n  /**\n   * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionEdgeRadius] to set the default property.\n   *\n   * @param fillExtrusionEdgeRadius value of fillExtrusionEdgeRadius\n   */\n  @MapboxExperimental\n  override fun fillExtrusionEdgeRadius(fillExtrusionEdgeRadius: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-edge-radius\", fillExtrusionEdgeRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-extrusion-edge-radius\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionEdgeRadiusAsExpression: Expression?\n    /**\n     * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n     *\n     * Get the FillExtrusionEdgeRadius property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionEdgeRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-edge-radius\")\n\n  /**\n   * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionEdgeRadiusAsExpression] to set the default property.\n   *\n   * @param fillExtrusionEdgeRadius value of fillExtrusionEdgeRadius as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionEdgeRadius(fillExtrusionEdgeRadius: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-edge-radius\", fillExtrusionEdgeRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val fillExtrusionAmbientOcclusionGroundAttenuation: Double?\n    /**\n     * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuation] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-ground-attenuation\")\n    }\n\n  /**\n   * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuation] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionGroundAttenuation value of fillExtrusionAmbientOcclusionGroundAttenuation\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionGroundAttenuation(fillExtrusionAmbientOcclusionGroundAttenuation: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-ground-attenuation\", fillExtrusionAmbientOcclusionGroundAttenuation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-extrusion-ambient-occlusion-ground-attenuation\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionAmbientOcclusionGroundAttenuationAsExpression: Expression?\n    /**\n     * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n     *\n     * Get the FillExtrusionAmbientOcclusionGroundAttenuation property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-ambient-occlusion-ground-attenuation\")\n\n  /**\n   * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionGroundAttenuation value of fillExtrusionAmbientOcclusionGroundAttenuation as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionGroundAttenuation(fillExtrusionAmbientOcclusionGroundAttenuation: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-ground-attenuation\", fillExtrusionAmbientOcclusionGroundAttenuation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionAmbientOcclusionGroundAttenuation.\n   */\n  @MapboxExperimental\n  val fillExtrusionAmbientOcclusionGroundAttenuationTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionAmbientOcclusionGroundAttenuation property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuationTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-ground-attenuation-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionAmbientOcclusionGroundAttenuation property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuationTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionGroundAttenuationTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-ground-attenuation-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionAmbientOcclusionGroundAttenuationTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionGroundAttenuationTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionAmbientOcclusionGroundAttenuationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n   */\n  @MapboxExperimental\n  val fillExtrusionAmbientOcclusionGroundRadius: Double?\n    /**\n     * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-ground-radius\")\n    }\n\n  /**\n   * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadius] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionGroundRadius value of fillExtrusionAmbientOcclusionGroundRadius\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionGroundRadius(fillExtrusionAmbientOcclusionGroundRadius: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-ground-radius\", fillExtrusionAmbientOcclusionGroundRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n   *\n   * This is an Expression representation of \"fill-extrusion-ambient-occlusion-ground-radius\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionAmbientOcclusionGroundRadiusAsExpression: Expression?\n    /**\n     * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n     *\n     * Get the FillExtrusionAmbientOcclusionGroundRadius property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-ambient-occlusion-ground-radius\")\n\n  /**\n   * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionGroundRadius value of fillExtrusionAmbientOcclusionGroundRadius as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionGroundRadius(fillExtrusionAmbientOcclusionGroundRadius: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-ground-radius\", fillExtrusionAmbientOcclusionGroundRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionAmbientOcclusionGroundRadius.\n   */\n  @MapboxExperimental\n  val fillExtrusionAmbientOcclusionGroundRadiusTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionAmbientOcclusionGroundRadius property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadiusTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-ground-radius-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionAmbientOcclusionGroundRadius property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadiusTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionGroundRadiusTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-ground-radius-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionAmbientOcclusionGroundRadiusTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionGroundRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionAmbientOcclusionGroundRadiusTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n   */\n  val fillExtrusionAmbientOcclusionIntensity: Double?\n    /**\n     * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-intensity\")\n    }\n\n  /**\n   * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensity] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionIntensity value of fillExtrusionAmbientOcclusionIntensity\n   */\n  override fun fillExtrusionAmbientOcclusionIntensity(fillExtrusionAmbientOcclusionIntensity: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-intensity\", fillExtrusionAmbientOcclusionIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-extrusion-ambient-occlusion-intensity\".\n   *\n   */\n  val fillExtrusionAmbientOcclusionIntensityAsExpression: Expression?\n    /**\n     * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n     *\n     * Get the FillExtrusionAmbientOcclusionIntensity property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-ambient-occlusion-intensity\")\n\n  /**\n   * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensityAsExpression] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionIntensity value of fillExtrusionAmbientOcclusionIntensity as Expression\n   */\n  override fun fillExtrusionAmbientOcclusionIntensity(fillExtrusionAmbientOcclusionIntensity: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-intensity\", fillExtrusionAmbientOcclusionIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionAmbientOcclusionIntensity.\n   */\n  val fillExtrusionAmbientOcclusionIntensityTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionAmbientOcclusionIntensity property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-intensity-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionAmbientOcclusionIntensity property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun fillExtrusionAmbientOcclusionIntensityTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionAmbientOcclusionIntensityTransition].\n   */\n  override fun fillExtrusionAmbientOcclusionIntensityTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionAmbientOcclusionIntensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n   */\n  val fillExtrusionAmbientOcclusionRadius: Double?\n    /**\n     * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-radius\")\n    }\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadius] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionRadius value of fillExtrusionAmbientOcclusionRadius\n   */\n  override fun fillExtrusionAmbientOcclusionRadius(fillExtrusionAmbientOcclusionRadius: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-radius\", fillExtrusionAmbientOcclusionRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n   *\n   * This is an Expression representation of \"fill-extrusion-ambient-occlusion-radius\".\n   *\n   */\n  val fillExtrusionAmbientOcclusionRadiusAsExpression: Expression?\n    /**\n     * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n     *\n     * Get the FillExtrusionAmbientOcclusionRadius property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-ambient-occlusion-radius\")\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadiusAsExpression] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionRadius value of fillExtrusionAmbientOcclusionRadius as Expression\n   */\n  override fun fillExtrusionAmbientOcclusionRadius(fillExtrusionAmbientOcclusionRadius: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-radius\", fillExtrusionAmbientOcclusionRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionAmbientOcclusionRadius.\n   */\n  val fillExtrusionAmbientOcclusionRadiusTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionAmbientOcclusionRadius property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadiusTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-radius-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionAmbientOcclusionRadius property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadiusTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun fillExtrusionAmbientOcclusionRadiusTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-radius-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionAmbientOcclusionRadiusTransition].\n   */\n  override fun fillExtrusionAmbientOcclusionRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionAmbientOcclusionRadiusTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n   */\n  @MapboxExperimental\n  val fillExtrusionAmbientOcclusionWallRadius: Double?\n    /**\n     * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-wall-radius\")\n    }\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadius] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionWallRadius value of fillExtrusionAmbientOcclusionWallRadius\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionWallRadius(fillExtrusionAmbientOcclusionWallRadius: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-wall-radius\", fillExtrusionAmbientOcclusionWallRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n   *\n   * This is an Expression representation of \"fill-extrusion-ambient-occlusion-wall-radius\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionAmbientOcclusionWallRadiusAsExpression: Expression?\n    /**\n     * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n     *\n     * Get the FillExtrusionAmbientOcclusionWallRadius property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-ambient-occlusion-wall-radius\")\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadiusAsExpression] to set the default property.\n   *\n   * @param fillExtrusionAmbientOcclusionWallRadius value of fillExtrusionAmbientOcclusionWallRadius as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionWallRadius(fillExtrusionAmbientOcclusionWallRadius: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-wall-radius\", fillExtrusionAmbientOcclusionWallRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionAmbientOcclusionWallRadius.\n   */\n  @MapboxExperimental\n  val fillExtrusionAmbientOcclusionWallRadiusTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionAmbientOcclusionWallRadius property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadiusTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-ambient-occlusion-wall-radius-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionAmbientOcclusionWallRadius property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadiusTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionWallRadiusTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-ambient-occlusion-wall-radius-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionAmbientOcclusionWallRadiusTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionAmbientOcclusionWallRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionAmbientOcclusionWallRadiusTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n   */\n  val fillExtrusionBase: Double?\n    /**\n     * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionBase] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-base\")\n    }\n\n  /**\n   * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionBase] to set the default property.\n   *\n   * @param fillExtrusionBase value of fillExtrusionBase\n   */\n  override fun fillExtrusionBase(fillExtrusionBase: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-base\", fillExtrusionBase)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n   *\n   * This is an Expression representation of \"fill-extrusion-base\".\n   *\n   */\n  val fillExtrusionBaseAsExpression: Expression?\n    /**\n     * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n     *\n     * Get the FillExtrusionBase property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionBaseAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-base\")\n\n  /**\n   * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionBaseAsExpression] to set the default property.\n   *\n   * @param fillExtrusionBase value of fillExtrusionBase as Expression\n   */\n  override fun fillExtrusionBase(fillExtrusionBase: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-base\", fillExtrusionBase)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionBase.\n   */\n  val fillExtrusionBaseTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionBase property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionBaseTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-base-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionBase property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionBaseTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun fillExtrusionBaseTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-base-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionBaseTransition].\n   */\n  override fun fillExtrusionBaseTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionBaseTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n   */\n  @MapboxExperimental\n  val fillExtrusionBaseAlignment: FillExtrusionBaseAlignment?\n    /**\n     * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionBaseAlignment] to get the default property.\n     *\n     * @return FillExtrusionBaseAlignment\n     */\n    get() {\n      getPropertyValue<String?>(\"fill-extrusion-base-alignment\")?.let {\n        return FillExtrusionBaseAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionBaseAlignment] to set the default property.\n   *\n   * @param fillExtrusionBaseAlignment value of fillExtrusionBaseAlignment\n   */\n  @MapboxExperimental\n  override fun fillExtrusionBaseAlignment(fillExtrusionBaseAlignment: FillExtrusionBaseAlignment): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-base-alignment\", fillExtrusionBaseAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n   *\n   * This is an Expression representation of \"fill-extrusion-base-alignment\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionBaseAlignmentAsExpression: Expression?\n    /**\n     * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n     *\n     * Get the FillExtrusionBaseAlignment property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionBaseAlignmentAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-extrusion-base-alignment\")\n        ?: fillExtrusionBaseAlignment?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionBaseAlignmentAsExpression] to set the default property.\n   *\n   * @param fillExtrusionBaseAlignment value of fillExtrusionBaseAlignment as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionBaseAlignment(fillExtrusionBaseAlignment: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-base-alignment\", fillExtrusionBaseAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   */\n  val fillExtrusionCastShadows: Boolean?\n    /**\n     * Enable/Disable shadow casting for this layer Default value: true.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionCastShadows] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-cast-shadows\")\n    }\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionCastShadows] to set the default property.\n   *\n   * @param fillExtrusionCastShadows value of fillExtrusionCastShadows\n   */\n  override fun fillExtrusionCastShadows(fillExtrusionCastShadows: Boolean): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-cast-shadows\", fillExtrusionCastShadows)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * This is an Expression representation of \"fill-extrusion-cast-shadows\".\n   *\n   */\n  val fillExtrusionCastShadowsAsExpression: Expression?\n    /**\n     * Enable/Disable shadow casting for this layer Default value: true.\n     *\n     * Get the FillExtrusionCastShadows property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionCastShadowsAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-cast-shadows\")\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionCastShadowsAsExpression] to set the default property.\n   *\n   * @param fillExtrusionCastShadows value of fillExtrusionCastShadows as Expression\n   */\n  override fun fillExtrusionCastShadows(fillExtrusionCastShadows: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-cast-shadows\", fillExtrusionCastShadows)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   */\n  val fillExtrusionColor: String?\n    /**\n     * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      fillExtrusionColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionColor] to set the default property.\n   *\n   * @param fillExtrusionColor value of fillExtrusionColor\n   */\n  override fun fillExtrusionColor(fillExtrusionColor: String): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-color\", fillExtrusionColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"fill-extrusion-color\".\n   *\n   */\n  val fillExtrusionColorAsExpression: Expression?\n    /**\n     * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n     *\n     * Get the FillExtrusionColor property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-extrusion-color\")\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionColorAsExpression] to set the default property.\n   *\n   * @param fillExtrusionColor value of fillExtrusionColor as Expression\n   */\n  override fun fillExtrusionColor(fillExtrusionColor: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-color\", fillExtrusionColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   */\n  val fillExtrusionColorAsColorInt: Int?\n    /**\n     * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      fillExtrusionColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionColorAsColorInt] to set the default property.\n   *\n   * @param fillExtrusionColor value of fillExtrusionColor\n   */\n  override fun fillExtrusionColor(@ColorInt fillExtrusionColor: Int): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-color\", colorIntToRgbaExpression(fillExtrusionColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionColor.\n   */\n  val fillExtrusionColorTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionColor property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-color-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionColor property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun fillExtrusionColorTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionColorTransition].\n   */\n  override fun fillExtrusionColorTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [fillExtrusionColor].\n   */\n  @MapboxExperimental\n  val fillExtrusionColorUseTheme: String?\n    /**\n     * Get the FillExtrusionColorUseTheme property\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionColorUseTheme] to get the default property.\n     *\n     * @return current FillExtrusionColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-color-use-theme\")\n    }\n\n  /**\n   * Set the FillExtrusionColorUseTheme as String\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionColorUseTheme] to get the default property.\n   *\n   * @param fillExtrusionColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillExtrusionColorUseTheme(fillExtrusionColorUseTheme: String): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-color-use-theme\", fillExtrusionColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [fillExtrusionColor].\n   */\n  @MapboxExperimental\n  val fillExtrusionColorUseThemeAsExpression: Expression?\n    /**\n     * Get the FillExtrusionColorUseTheme property\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionColorUseTheme] to get the default property.\n     *\n     * @return current FillExtrusionColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-color-use-theme\")\n\n  /**\n   * Set the FillExtrusionColorUseTheme as Expression\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionColorUseTheme] to get the default property.\n   *\n   * @param fillExtrusionColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillExtrusionColorUseTheme(fillExtrusionColorUseTheme: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-color-use-theme\", fillExtrusionColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   */\n  val fillExtrusionCutoffFadeRange: Double?\n    /**\n     * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionCutoffFadeRange] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-cutoff-fade-range\")\n    }\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionCutoffFadeRange] to set the default property.\n   *\n   * @param fillExtrusionCutoffFadeRange value of fillExtrusionCutoffFadeRange\n   */\n  override fun fillExtrusionCutoffFadeRange(fillExtrusionCutoffFadeRange: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-cutoff-fade-range\", fillExtrusionCutoffFadeRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-extrusion-cutoff-fade-range\".\n   *\n   */\n  val fillExtrusionCutoffFadeRangeAsExpression: Expression?\n    /**\n     * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n     *\n     * Get the FillExtrusionCutoffFadeRange property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionCutoffFadeRangeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-cutoff-fade-range\")\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionCutoffFadeRangeAsExpression] to set the default property.\n   *\n   * @param fillExtrusionCutoffFadeRange value of fillExtrusionCutoffFadeRange as Expression\n   */\n  override fun fillExtrusionCutoffFadeRange(fillExtrusionCutoffFadeRange: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-cutoff-fade-range\", fillExtrusionCutoffFadeRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n   */\n  val fillExtrusionEmissiveStrength: Double?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-emissive-strength\")\n    }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionEmissiveStrength] to set the default property.\n   *\n   * @param fillExtrusionEmissiveStrength value of fillExtrusionEmissiveStrength\n   */\n  override fun fillExtrusionEmissiveStrength(fillExtrusionEmissiveStrength: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-emissive-strength\", fillExtrusionEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n   *\n   * This is an Expression representation of \"fill-extrusion-emissive-strength\".\n   *\n   */\n  val fillExtrusionEmissiveStrengthAsExpression: Expression?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n     *\n     * Get the FillExtrusionEmissiveStrength property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-emissive-strength\")\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param fillExtrusionEmissiveStrength value of fillExtrusionEmissiveStrength as Expression\n   */\n  override fun fillExtrusionEmissiveStrength(fillExtrusionEmissiveStrength: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-emissive-strength\", fillExtrusionEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionEmissiveStrength.\n   */\n  val fillExtrusionEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionEmissiveStrength property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionEmissiveStrength property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun fillExtrusionEmissiveStrengthTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionEmissiveStrengthTransition].\n   */\n  override fun fillExtrusionEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightColor: String?\n    /**\n     * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      fillExtrusionFloodLightColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColor] to set the default property.\n   *\n   * @param fillExtrusionFloodLightColor value of fillExtrusionFloodLightColor\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightColor(fillExtrusionFloodLightColor: String): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-color\", fillExtrusionFloodLightColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"fill-extrusion-flood-light-color\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightColorAsExpression: Expression?\n    /**\n     * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n     *\n     * Get the FillExtrusionFloodLightColor property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-extrusion-flood-light-color\")\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsExpression] to set the default property.\n   *\n   * @param fillExtrusionFloodLightColor value of fillExtrusionFloodLightColor as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightColor(fillExtrusionFloodLightColor: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-color\", fillExtrusionFloodLightColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightColorAsColorInt: Int?\n    /**\n     * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      fillExtrusionFloodLightColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsColorInt] to set the default property.\n   *\n   * @param fillExtrusionFloodLightColor value of fillExtrusionFloodLightColor\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightColor(@ColorInt fillExtrusionFloodLightColor: Int): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-color\", colorIntToRgbaExpression(fillExtrusionFloodLightColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionFloodLightColor.\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightColorTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionFloodLightColor property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-color-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionFloodLightColor property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightColorTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionFloodLightColorTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightColorTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionFloodLightColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [fillExtrusionFloodLightColor].\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightColorUseTheme: String?\n    /**\n     * Get the FillExtrusionFloodLightColorUseTheme property\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorUseTheme] to get the default property.\n     *\n     * @return current FillExtrusionFloodLightColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-color-use-theme\")\n    }\n\n  /**\n   * Set the FillExtrusionFloodLightColorUseTheme as String\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorUseTheme] to get the default property.\n   *\n   * @param fillExtrusionFloodLightColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightColorUseTheme(fillExtrusionFloodLightColorUseTheme: String): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-color-use-theme\", fillExtrusionFloodLightColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [fillExtrusionFloodLightColor].\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightColorUseThemeAsExpression: Expression?\n    /**\n     * Get the FillExtrusionFloodLightColorUseTheme property\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorUseTheme] to get the default property.\n     *\n     * @return current FillExtrusionFloodLightColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-flood-light-color-use-theme\")\n\n  /**\n   * Set the FillExtrusionFloodLightColorUseTheme as Expression\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightColorUseTheme] to get the default property.\n   *\n   * @param fillExtrusionFloodLightColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightColorUseTheme(fillExtrusionFloodLightColorUseTheme: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-color-use-theme\", fillExtrusionFloodLightColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightGroundAttenuation: Double?\n    /**\n     * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuation] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-ground-attenuation\")\n    }\n\n  /**\n   * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuation] to set the default property.\n   *\n   * @param fillExtrusionFloodLightGroundAttenuation value of fillExtrusionFloodLightGroundAttenuation\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightGroundAttenuation(fillExtrusionFloodLightGroundAttenuation: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-ground-attenuation\", fillExtrusionFloodLightGroundAttenuation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-extrusion-flood-light-ground-attenuation\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightGroundAttenuationAsExpression: Expression?\n    /**\n     * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n     *\n     * Get the FillExtrusionFloodLightGroundAttenuation property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-flood-light-ground-attenuation\")\n\n  /**\n   * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuationAsExpression] to set the default property.\n   *\n   * @param fillExtrusionFloodLightGroundAttenuation value of fillExtrusionFloodLightGroundAttenuation as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightGroundAttenuation(fillExtrusionFloodLightGroundAttenuation: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-ground-attenuation\", fillExtrusionFloodLightGroundAttenuation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionFloodLightGroundAttenuation.\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightGroundAttenuationTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionFloodLightGroundAttenuation property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuationTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-ground-attenuation-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionFloodLightGroundAttenuation property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuationTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightGroundAttenuationTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-ground-attenuation-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionFloodLightGroundAttenuationTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightGroundAttenuationTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionFloodLightGroundAttenuationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightGroundRadius: Double?\n    /**\n     * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-ground-radius\")\n    }\n\n  /**\n   * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadius] to set the default property.\n   *\n   * @param fillExtrusionFloodLightGroundRadius value of fillExtrusionFloodLightGroundRadius\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightGroundRadius(fillExtrusionFloodLightGroundRadius: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-ground-radius\", fillExtrusionFloodLightGroundRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n   *\n   * This is an Expression representation of \"fill-extrusion-flood-light-ground-radius\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightGroundRadiusAsExpression: Expression?\n    /**\n     * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n     *\n     * Get the FillExtrusionFloodLightGroundRadius property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-flood-light-ground-radius\")\n\n  /**\n   * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadiusAsExpression] to set the default property.\n   *\n   * @param fillExtrusionFloodLightGroundRadius value of fillExtrusionFloodLightGroundRadius as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightGroundRadius(fillExtrusionFloodLightGroundRadius: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-ground-radius\", fillExtrusionFloodLightGroundRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionFloodLightGroundRadius.\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightGroundRadiusTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionFloodLightGroundRadius property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadiusTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-ground-radius-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionFloodLightGroundRadius property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadiusTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightGroundRadiusTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-ground-radius-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionFloodLightGroundRadiusTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightGroundRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionFloodLightGroundRadiusTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightIntensity: Double?\n    /**\n     * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightIntensity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-intensity\")\n    }\n\n  /**\n   * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightIntensity] to set the default property.\n   *\n   * @param fillExtrusionFloodLightIntensity value of fillExtrusionFloodLightIntensity\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightIntensity(fillExtrusionFloodLightIntensity: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-intensity\", fillExtrusionFloodLightIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-extrusion-flood-light-intensity\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightIntensityAsExpression: Expression?\n    /**\n     * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n     *\n     * Get the FillExtrusionFloodLightIntensity property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightIntensityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-flood-light-intensity\")\n\n  /**\n   * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightIntensityAsExpression] to set the default property.\n   *\n   * @param fillExtrusionFloodLightIntensity value of fillExtrusionFloodLightIntensity as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightIntensity(fillExtrusionFloodLightIntensity: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-intensity\", fillExtrusionFloodLightIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionFloodLightIntensity.\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightIntensityTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionFloodLightIntensity property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightIntensityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-intensity-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionFloodLightIntensity property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightIntensityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightIntensityTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionFloodLightIntensityTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightIntensityTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionFloodLightIntensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightWallRadius: Double?\n    /**\n     * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-wall-radius\")\n    }\n\n  /**\n   * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadius] to set the default property.\n   *\n   * @param fillExtrusionFloodLightWallRadius value of fillExtrusionFloodLightWallRadius\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightWallRadius(fillExtrusionFloodLightWallRadius: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-wall-radius\", fillExtrusionFloodLightWallRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n   *\n   * This is an Expression representation of \"fill-extrusion-flood-light-wall-radius\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightWallRadiusAsExpression: Expression?\n    /**\n     * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n     *\n     * Get the FillExtrusionFloodLightWallRadius property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-flood-light-wall-radius\")\n\n  /**\n   * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadiusAsExpression] to set the default property.\n   *\n   * @param fillExtrusionFloodLightWallRadius value of fillExtrusionFloodLightWallRadius as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightWallRadius(fillExtrusionFloodLightWallRadius: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-wall-radius\", fillExtrusionFloodLightWallRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionFloodLightWallRadius.\n   */\n  @MapboxExperimental\n  val fillExtrusionFloodLightWallRadiusTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionFloodLightWallRadius property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadiusTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-flood-light-wall-radius-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionFloodLightWallRadius property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadiusTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightWallRadiusTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-flood-light-wall-radius-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionFloodLightWallRadiusTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionFloodLightWallRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionFloodLightWallRadiusTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n   */\n  val fillExtrusionHeight: Double?\n    /**\n     * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionHeight] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-height\")\n    }\n\n  /**\n   * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionHeight] to set the default property.\n   *\n   * @param fillExtrusionHeight value of fillExtrusionHeight\n   */\n  override fun fillExtrusionHeight(fillExtrusionHeight: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-height\", fillExtrusionHeight)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n   *\n   * This is an Expression representation of \"fill-extrusion-height\".\n   *\n   */\n  val fillExtrusionHeightAsExpression: Expression?\n    /**\n     * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n     *\n     * Get the FillExtrusionHeight property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionHeightAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-height\")\n\n  /**\n   * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionHeightAsExpression] to set the default property.\n   *\n   * @param fillExtrusionHeight value of fillExtrusionHeight as Expression\n   */\n  override fun fillExtrusionHeight(fillExtrusionHeight: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-height\", fillExtrusionHeight)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionHeight.\n   */\n  val fillExtrusionHeightTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionHeight property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionHeightTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-height-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionHeight property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionHeightTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun fillExtrusionHeightTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-height-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionHeightTransition].\n   */\n  override fun fillExtrusionHeightTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionHeightTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n   */\n  @MapboxExperimental\n  val fillExtrusionHeightAlignment: FillExtrusionHeightAlignment?\n    /**\n     * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionHeightAlignment] to get the default property.\n     *\n     * @return FillExtrusionHeightAlignment\n     */\n    get() {\n      getPropertyValue<String?>(\"fill-extrusion-height-alignment\")?.let {\n        return FillExtrusionHeightAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionHeightAlignment] to set the default property.\n   *\n   * @param fillExtrusionHeightAlignment value of fillExtrusionHeightAlignment\n   */\n  @MapboxExperimental\n  override fun fillExtrusionHeightAlignment(fillExtrusionHeightAlignment: FillExtrusionHeightAlignment): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-height-alignment\", fillExtrusionHeightAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n   *\n   * This is an Expression representation of \"fill-extrusion-height-alignment\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionHeightAlignmentAsExpression: Expression?\n    /**\n     * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n     *\n     * Get the FillExtrusionHeightAlignment property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionHeightAlignmentAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-extrusion-height-alignment\")\n        ?: fillExtrusionHeightAlignment?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionHeightAlignmentAsExpression] to set the default property.\n   *\n   * @param fillExtrusionHeightAlignment value of fillExtrusionHeightAlignment as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionHeightAlignment(fillExtrusionHeightAlignment: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-height-alignment\", fillExtrusionHeightAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n   */\n  @MapboxExperimental\n  val fillExtrusionLineWidth: Double?\n    /**\n     * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionLineWidth] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-line-width\")\n    }\n\n  /**\n   * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionLineWidth] to set the default property.\n   *\n   * @param fillExtrusionLineWidth value of fillExtrusionLineWidth\n   */\n  @MapboxExperimental\n  override fun fillExtrusionLineWidth(fillExtrusionLineWidth: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-line-width\", fillExtrusionLineWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n   *\n   * This is an Expression representation of \"fill-extrusion-line-width\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionLineWidthAsExpression: Expression?\n    /**\n     * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n     *\n     * Get the FillExtrusionLineWidth property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionLineWidthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-line-width\")\n\n  /**\n   * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionLineWidthAsExpression] to set the default property.\n   *\n   * @param fillExtrusionLineWidth value of fillExtrusionLineWidth as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionLineWidth(fillExtrusionLineWidth: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-line-width\", fillExtrusionLineWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionLineWidth.\n   */\n  @MapboxExperimental\n  val fillExtrusionLineWidthTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionLineWidth property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionLineWidthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-line-width-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionLineWidth property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionLineWidthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillExtrusionLineWidthTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-line-width-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionLineWidthTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionLineWidthTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionLineWidthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n   */\n  val fillExtrusionOpacity: Double?\n    /**\n     * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-opacity\")\n    }\n\n  /**\n   * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionOpacity] to set the default property.\n   *\n   * @param fillExtrusionOpacity value of fillExtrusionOpacity\n   */\n  override fun fillExtrusionOpacity(fillExtrusionOpacity: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-opacity\", fillExtrusionOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-extrusion-opacity\".\n   *\n   */\n  val fillExtrusionOpacityAsExpression: Expression?\n    /**\n     * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n     *\n     * Get the FillExtrusionOpacity property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-opacity\")\n\n  /**\n   * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionOpacityAsExpression] to set the default property.\n   *\n   * @param fillExtrusionOpacity value of fillExtrusionOpacity as Expression\n   */\n  override fun fillExtrusionOpacity(fillExtrusionOpacity: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-opacity\", fillExtrusionOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionOpacity.\n   */\n  val fillExtrusionOpacityTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionOpacity property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-opacity-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionOpacity property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun fillExtrusionOpacityTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionOpacityTransition].\n   */\n  override fun fillExtrusionOpacityTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  val fillExtrusionPattern: String?\n    /**\n     * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionPattern] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-pattern\")\n    }\n\n  /**\n   * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionPattern] to set the default property.\n   *\n   * @param fillExtrusionPattern value of fillExtrusionPattern\n   */\n  override fun fillExtrusionPattern(fillExtrusionPattern: String): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-pattern\", fillExtrusionPattern)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * This is an Expression representation of \"fill-extrusion-pattern\".\n   *\n   */\n  val fillExtrusionPatternAsExpression: Expression?\n    /**\n     * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * Get the FillExtrusionPattern property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionPatternAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-pattern\")\n\n  /**\n   * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionPatternAsExpression] to set the default property.\n   *\n   * @param fillExtrusionPattern value of fillExtrusionPattern as Expression\n   */\n  override fun fillExtrusionPattern(fillExtrusionPattern: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-pattern\", fillExtrusionPattern)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  val fillExtrusionPatternCrossFade: Double?\n    /**\n     * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionPatternCrossFade] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-pattern-cross-fade\")\n    }\n\n  /**\n   * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionPatternCrossFade] to set the default property.\n   *\n   * @param fillExtrusionPatternCrossFade value of fillExtrusionPatternCrossFade\n   */\n  override fun fillExtrusionPatternCrossFade(fillExtrusionPatternCrossFade: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-pattern-cross-fade\", fillExtrusionPatternCrossFade)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-extrusion-pattern-cross-fade\".\n   *\n   */\n  val fillExtrusionPatternCrossFadeAsExpression: Expression?\n    /**\n     * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * Get the FillExtrusionPatternCrossFade property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionPatternCrossFadeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-pattern-cross-fade\")\n\n  /**\n   * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionPatternCrossFadeAsExpression] to set the default property.\n   *\n   * @param fillExtrusionPatternCrossFade value of fillExtrusionPatternCrossFade as Expression\n   */\n  override fun fillExtrusionPatternCrossFade(fillExtrusionPatternCrossFade: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-pattern-cross-fade\", fillExtrusionPatternCrossFade)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n   */\n  @MapboxExperimental\n  val fillExtrusionRoundedRoof: Boolean?\n    /**\n     * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionRoundedRoof] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-rounded-roof\")\n    }\n\n  /**\n   * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionRoundedRoof] to set the default property.\n   *\n   * @param fillExtrusionRoundedRoof value of fillExtrusionRoundedRoof\n   */\n  @MapboxExperimental\n  override fun fillExtrusionRoundedRoof(fillExtrusionRoundedRoof: Boolean): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-rounded-roof\", fillExtrusionRoundedRoof)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n   *\n   * This is an Expression representation of \"fill-extrusion-rounded-roof\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionRoundedRoofAsExpression: Expression?\n    /**\n     * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n     *\n     * Get the FillExtrusionRoundedRoof property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionRoundedRoofAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-rounded-roof\")\n\n  /**\n   * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionRoundedRoofAsExpression] to set the default property.\n   *\n   * @param fillExtrusionRoundedRoof value of fillExtrusionRoundedRoof as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionRoundedRoof(fillExtrusionRoundedRoof: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-rounded-roof\", fillExtrusionRoundedRoof)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n   */\n  val fillExtrusionTranslate: List<Double>?\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslate] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-translate\")\n    }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslate] to set the default property.\n   *\n   * @param fillExtrusionTranslate value of fillExtrusionTranslate\n   */\n  override fun fillExtrusionTranslate(fillExtrusionTranslate: List<Double>): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-translate\", fillExtrusionTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n   *\n   * This is an Expression representation of \"fill-extrusion-translate\".\n   *\n   */\n  val fillExtrusionTranslateAsExpression: Expression?\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n     *\n     * Get the FillExtrusionTranslate property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-translate\")\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslateAsExpression] to set the default property.\n   *\n   * @param fillExtrusionTranslate value of fillExtrusionTranslate as Expression\n   */\n  override fun fillExtrusionTranslate(fillExtrusionTranslate: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-translate\", fillExtrusionTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionTranslate.\n   */\n  val fillExtrusionTranslateTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionTranslate property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslateTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-translate-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionTranslate property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslateTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun fillExtrusionTranslateTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-translate-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionTranslateTransition].\n   */\n  override fun fillExtrusionTranslateTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionTranslateTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n   */\n  val fillExtrusionTranslateAnchor: FillExtrusionTranslateAnchor?\n    /**\n     * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslateAnchor] to get the default property.\n     *\n     * @return FillExtrusionTranslateAnchor\n     */\n    get() {\n      getPropertyValue<String?>(\"fill-extrusion-translate-anchor\")?.let {\n        return FillExtrusionTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslateAnchor] to set the default property.\n   *\n   * @param fillExtrusionTranslateAnchor value of fillExtrusionTranslateAnchor\n   */\n  override fun fillExtrusionTranslateAnchor(fillExtrusionTranslateAnchor: FillExtrusionTranslateAnchor): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-translate-anchor\", fillExtrusionTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n   *\n   * This is an Expression representation of \"fill-extrusion-translate-anchor\".\n   *\n   */\n  val fillExtrusionTranslateAnchorAsExpression: Expression?\n    /**\n     * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n     *\n     * Get the FillExtrusionTranslateAnchor property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslateAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-extrusion-translate-anchor\")\n        ?: fillExtrusionTranslateAnchor?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionTranslateAnchorAsExpression] to set the default property.\n   *\n   * @param fillExtrusionTranslateAnchor value of fillExtrusionTranslateAnchor as Expression\n   */\n  override fun fillExtrusionTranslateAnchor(fillExtrusionTranslateAnchor: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-translate-anchor\", fillExtrusionTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n   */\n  val fillExtrusionVerticalGradient: Boolean?\n    /**\n     * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalGradient] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-vertical-gradient\")\n    }\n\n  /**\n   * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalGradient] to set the default property.\n   *\n   * @param fillExtrusionVerticalGradient value of fillExtrusionVerticalGradient\n   */\n  override fun fillExtrusionVerticalGradient(fillExtrusionVerticalGradient: Boolean): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-vertical-gradient\", fillExtrusionVerticalGradient)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n   *\n   * This is an Expression representation of \"fill-extrusion-vertical-gradient\".\n   *\n   */\n  val fillExtrusionVerticalGradientAsExpression: Expression?\n    /**\n     * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n     *\n     * Get the FillExtrusionVerticalGradient property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalGradientAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-vertical-gradient\")\n\n  /**\n   * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalGradientAsExpression] to set the default property.\n   *\n   * @param fillExtrusionVerticalGradient value of fillExtrusionVerticalGradient as Expression\n   */\n  override fun fillExtrusionVerticalGradient(fillExtrusionVerticalGradient: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-vertical-gradient\", fillExtrusionVerticalGradient)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n   */\n  @MapboxExperimental\n  val fillExtrusionVerticalScale: Double?\n    /**\n     * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalScale] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-vertical-scale\")\n    }\n\n  /**\n   * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalScale] to set the default property.\n   *\n   * @param fillExtrusionVerticalScale value of fillExtrusionVerticalScale\n   */\n  @MapboxExperimental\n  override fun fillExtrusionVerticalScale(fillExtrusionVerticalScale: Double): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-vertical-scale\", fillExtrusionVerticalScale)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n   *\n   * This is an Expression representation of \"fill-extrusion-vertical-scale\".\n   *\n   */\n  @MapboxExperimental\n  val fillExtrusionVerticalScaleAsExpression: Expression?\n    /**\n     * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n     *\n     * Get the FillExtrusionVerticalScale property as an Expression\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalScaleAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-extrusion-vertical-scale\")\n\n  /**\n   * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalScaleAsExpression] to set the default property.\n   *\n   * @param fillExtrusionVerticalScale value of fillExtrusionVerticalScale as Expression\n   */\n  @MapboxExperimental\n  override fun fillExtrusionVerticalScale(fillExtrusionVerticalScale: Expression): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-vertical-scale\", fillExtrusionVerticalScale)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillExtrusionVerticalScale.\n   */\n  @MapboxExperimental\n  val fillExtrusionVerticalScaleTransition: StyleTransition?\n    /**\n     * Get the FillExtrusionVerticalScale property transition options\n     *\n     * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalScaleTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-extrusion-vertical-scale-transition\")\n    }\n\n  /**\n   * Set the FillExtrusionVerticalScale property transition options\n   *\n   * Use static method [FillExtrusionLayer.defaultFillExtrusionVerticalScaleTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillExtrusionVerticalScaleTransition(options: StyleTransition): FillExtrusionLayer = apply {\n    val propertyValue = PropertyValue(\"fill-extrusion-vertical-scale-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillExtrusionVerticalScaleTransition].\n   */\n  @MapboxExperimental\n  override fun fillExtrusionVerticalScaleTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer = apply {\n    fillExtrusionVerticalScaleTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"fill-extrusion\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionEdgeRadius: Double?\n      /**\n       * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of FillExtrusionEdgeRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-edge-radius\").silentUnwrap()\n      }\n\n    /**\n     * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-extrusion-edge-radius\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionEdgeRadiusAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionEdgeRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-edge-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionEdgeRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionAmbientOcclusionGroundAttenuation: Double?\n      /**\n       * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n       *\n       * Get the default value of FillExtrusionAmbientOcclusionGroundAttenuation property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-attenuation\").silentUnwrap()\n      }\n\n    /**\n     * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-extrusion-ambient-occlusion-ground-attenuation\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionAmbientOcclusionGroundAttenuation property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-attenuation\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionAmbientOcclusionGroundAttenuation?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionAmbientOcclusionGroundAttenuation.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionAmbientOcclusionGroundAttenuationTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionAmbientOcclusionGroundAttenuation property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-attenuation-transition\").silentUnwrap()\n\n    /**\n     * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionAmbientOcclusionGroundRadius: Double?\n      /**\n       * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n       *\n       * Get the default value of FillExtrusionAmbientOcclusionGroundRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-radius\").silentUnwrap()\n      }\n\n    /**\n     * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n     *\n     * This is an Expression representation of \"fill-extrusion-ambient-occlusion-ground-radius\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionAmbientOcclusionGroundRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionAmbientOcclusionGroundRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionAmbientOcclusionGroundRadius.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionAmbientOcclusionGroundRadiusTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionAmbientOcclusionGroundRadius property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-radius-transition\").silentUnwrap()\n\n    /**\n     * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n     */\n    val defaultFillExtrusionAmbientOcclusionIntensity: Double?\n      /**\n       * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of FillExtrusionAmbientOcclusionIntensity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-intensity\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-extrusion-ambient-occlusion-intensity\".\n     *\n     */\n    val defaultFillExtrusionAmbientOcclusionIntensityAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionAmbientOcclusionIntensity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-intensity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionAmbientOcclusionIntensity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionAmbientOcclusionIntensity.\n     */\n    val defaultFillExtrusionAmbientOcclusionIntensityTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionAmbientOcclusionIntensity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-intensity-transition\").silentUnwrap()\n\n    /**\n     * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n     */\n    val defaultFillExtrusionAmbientOcclusionRadius: Double?\n      /**\n       * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n       *\n       * Get the default value of FillExtrusionAmbientOcclusionRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-radius\").silentUnwrap()\n      }\n\n    /**\n     * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n     *\n     * This is an Expression representation of \"fill-extrusion-ambient-occlusion-radius\".\n     *\n     */\n    val defaultFillExtrusionAmbientOcclusionRadiusAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionAmbientOcclusionRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionAmbientOcclusionRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionAmbientOcclusionRadius.\n     */\n    val defaultFillExtrusionAmbientOcclusionRadiusTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionAmbientOcclusionRadius property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-radius-transition\").silentUnwrap()\n\n    /**\n     * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionAmbientOcclusionWallRadius: Double?\n      /**\n       * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n       *\n       * Get the default value of FillExtrusionAmbientOcclusionWallRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-wall-radius\").silentUnwrap()\n      }\n\n    /**\n     * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n     *\n     * This is an Expression representation of \"fill-extrusion-ambient-occlusion-wall-radius\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionAmbientOcclusionWallRadiusAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionAmbientOcclusionWallRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-wall-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionAmbientOcclusionWallRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionAmbientOcclusionWallRadius.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionAmbientOcclusionWallRadiusTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionAmbientOcclusionWallRadius property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-wall-radius-transition\").silentUnwrap()\n\n    /**\n     * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n     */\n    val defaultFillExtrusionBase: Double?\n      /**\n       * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n       *\n       * Get the default value of FillExtrusionBase property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base\").silentUnwrap()\n      }\n\n    /**\n     * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n     *\n     * This is an Expression representation of \"fill-extrusion-base\".\n     *\n     */\n    val defaultFillExtrusionBaseAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionBase property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionBase?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionBase.\n     */\n    val defaultFillExtrusionBaseTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionBase property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base-transition\").silentUnwrap()\n\n    /**\n     * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionBaseAlignment: FillExtrusionBaseAlignment?\n      /**\n       * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n       *\n       * Get the default value of FillExtrusionBaseAlignment property\n       *\n       * @return FillExtrusionBaseAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base-alignment\").silentUnwrap<String>()?.let {\n          return FillExtrusionBaseAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n     *\n     * This is an Expression representation of \"fill-extrusion-base-alignment\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionBaseAlignmentAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionBaseAlignment property as an Expression\n       *\n       * @return FillExtrusionBaseAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base-alignment\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionBaseAlignment?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Enable/Disable shadow casting for this layer Default value: true.\n     */\n    val defaultFillExtrusionCastShadows: Boolean?\n      /**\n       * Enable/Disable shadow casting for this layer Default value: true.\n       *\n       * Get the default value of FillExtrusionCastShadows property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cast-shadows\").silentUnwrap()\n      }\n\n    /**\n     * Enable/Disable shadow casting for this layer Default value: true.\n     *\n     * This is an Expression representation of \"fill-extrusion-cast-shadows\".\n     *\n     */\n    val defaultFillExtrusionCastShadowsAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionCastShadows property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cast-shadows\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionCastShadows?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n     */\n    val defaultFillExtrusionColor: String?\n      /**\n       * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n       *\n       * Get the default value of FillExtrusionColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultFillExtrusionColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"fill-extrusion-color\".\n     *\n     */\n    val defaultFillExtrusionColorAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n     */\n    val defaultFillExtrusionColorAsColorInt: Int?\n      /**\n       * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n       *\n       * Get the default value of FillExtrusionColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultFillExtrusionColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionColor.\n     */\n    val defaultFillExtrusionColorTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillExtrusionColor].\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionColorUseTheme: String?\n      /**\n       * Get default value of the FillExtrusionColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillExtrusionColor].\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultFillExtrusionColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n     */\n    val defaultFillExtrusionCutoffFadeRange: Double?\n      /**\n       * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of FillExtrusionCutoffFadeRange property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cutoff-fade-range\").silentUnwrap()\n      }\n\n    /**\n     * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-extrusion-cutoff-fade-range\".\n     *\n     */\n    val defaultFillExtrusionCutoffFadeRangeAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionCutoffFadeRange property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cutoff-fade-range\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionCutoffFadeRange?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n     */\n    val defaultFillExtrusionEmissiveStrength: Double?\n      /**\n       * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n       *\n       * Get the default value of FillExtrusionEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n     *\n     * This is an Expression representation of \"fill-extrusion-emissive-strength\".\n     *\n     */\n    val defaultFillExtrusionEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionEmissiveStrength.\n     */\n    val defaultFillExtrusionEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightColor: String?\n      /**\n       * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n       *\n       * Get the default value of FillExtrusionFloodLightColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultFillExtrusionFloodLightColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n     *\n     * This is an Expression representation of \"fill-extrusion-flood-light-color\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightColorAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionFloodLightColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightColorAsColorInt: Int?\n      /**\n       * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n       *\n       * Get the default value of FillExtrusionFloodLightColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultFillExtrusionFloodLightColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionFloodLightColor.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightColorTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionFloodLightColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillExtrusionFloodLightColor].\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightColorUseTheme: String?\n      /**\n       * Get default value of the FillExtrusionFloodLightColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillExtrusionFloodLightColor].\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionFloodLightColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultFillExtrusionFloodLightColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightGroundAttenuation: Double?\n      /**\n       * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n       *\n       * Get the default value of FillExtrusionFloodLightGroundAttenuation property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-attenuation\").silentUnwrap()\n      }\n\n    /**\n     * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-extrusion-flood-light-ground-attenuation\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightGroundAttenuationAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionFloodLightGroundAttenuation property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-attenuation\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionFloodLightGroundAttenuation?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionFloodLightGroundAttenuation.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightGroundAttenuationTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionFloodLightGroundAttenuation property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-attenuation-transition\").silentUnwrap()\n\n    /**\n     * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightGroundRadius: Double?\n      /**\n       * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n       *\n       * Get the default value of FillExtrusionFloodLightGroundRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-radius\").silentUnwrap()\n      }\n\n    /**\n     * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n     *\n     * This is an Expression representation of \"fill-extrusion-flood-light-ground-radius\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightGroundRadiusAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionFloodLightGroundRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionFloodLightGroundRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionFloodLightGroundRadius.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightGroundRadiusTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionFloodLightGroundRadius property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-radius-transition\").silentUnwrap()\n\n    /**\n     * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightIntensity: Double?\n      /**\n       * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of FillExtrusionFloodLightIntensity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-intensity\").silentUnwrap()\n      }\n\n    /**\n     * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-extrusion-flood-light-intensity\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightIntensityAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionFloodLightIntensity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-intensity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionFloodLightIntensity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionFloodLightIntensity.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightIntensityTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionFloodLightIntensity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-intensity-transition\").silentUnwrap()\n\n    /**\n     * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightWallRadius: Double?\n      /**\n       * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n       *\n       * Get the default value of FillExtrusionFloodLightWallRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-wall-radius\").silentUnwrap()\n      }\n\n    /**\n     * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n     *\n     * This is an Expression representation of \"fill-extrusion-flood-light-wall-radius\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightWallRadiusAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionFloodLightWallRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-wall-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionFloodLightWallRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionFloodLightWallRadius.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionFloodLightWallRadiusTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionFloodLightWallRadius property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-wall-radius-transition\").silentUnwrap()\n\n    /**\n     * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n     */\n    val defaultFillExtrusionHeight: Double?\n      /**\n       * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n       *\n       * Get the default value of FillExtrusionHeight property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height\").silentUnwrap()\n      }\n\n    /**\n     * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n     *\n     * This is an Expression representation of \"fill-extrusion-height\".\n     *\n     */\n    val defaultFillExtrusionHeightAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionHeight property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionHeight?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionHeight.\n     */\n    val defaultFillExtrusionHeightTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionHeight property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height-transition\").silentUnwrap()\n\n    /**\n     * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionHeightAlignment: FillExtrusionHeightAlignment?\n      /**\n       * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n       *\n       * Get the default value of FillExtrusionHeightAlignment property\n       *\n       * @return FillExtrusionHeightAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height-alignment\").silentUnwrap<String>()?.let {\n          return FillExtrusionHeightAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n     *\n     * This is an Expression representation of \"fill-extrusion-height-alignment\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionHeightAlignmentAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionHeightAlignment property as an Expression\n       *\n       * @return FillExtrusionHeightAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height-alignment\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionHeightAlignment?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionLineWidth: Double?\n      /**\n       * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n       *\n       * Get the default value of FillExtrusionLineWidth property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-line-width\").silentUnwrap()\n      }\n\n    /**\n     * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n     *\n     * This is an Expression representation of \"fill-extrusion-line-width\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionLineWidthAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionLineWidth property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-line-width\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionLineWidth?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionLineWidth.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionLineWidthTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionLineWidth property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-line-width-transition\").silentUnwrap()\n\n    /**\n     * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n     */\n    val defaultFillExtrusionOpacity: Double?\n      /**\n       * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of FillExtrusionOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-extrusion-opacity\".\n     *\n     */\n    val defaultFillExtrusionOpacityAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionOpacity.\n     */\n    val defaultFillExtrusionOpacityTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-opacity-transition\").silentUnwrap()\n\n    /**\n     * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     */\n    val defaultFillExtrusionPattern: String?\n      /**\n       * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n       *\n       * Get the default value of FillExtrusionPattern property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern\").silentUnwrap()\n      }\n\n    /**\n     * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * This is an Expression representation of \"fill-extrusion-pattern\".\n     *\n     */\n    val defaultFillExtrusionPatternAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionPattern property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionPattern?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     */\n    val defaultFillExtrusionPatternCrossFade: Double?\n      /**\n       * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of FillExtrusionPatternCrossFade property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern-cross-fade\").silentUnwrap()\n      }\n\n    /**\n     * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-extrusion-pattern-cross-fade\".\n     *\n     */\n    val defaultFillExtrusionPatternCrossFadeAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionPatternCrossFade property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern-cross-fade\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionPatternCrossFade?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionRoundedRoof: Boolean?\n      /**\n       * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n       *\n       * Get the default value of FillExtrusionRoundedRoof property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-rounded-roof\").silentUnwrap()\n      }\n\n    /**\n     * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n     *\n     * This is an Expression representation of \"fill-extrusion-rounded-roof\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionRoundedRoofAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionRoundedRoof property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-rounded-roof\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionRoundedRoof?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n     */\n    val defaultFillExtrusionTranslate: List<Double>?\n      /**\n       * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n       *\n       * Get the default value of FillExtrusionTranslate property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate\").silentUnwrap()\n      }\n\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n     *\n     * This is an Expression representation of \"fill-extrusion-translate\".\n     *\n     */\n    val defaultFillExtrusionTranslateAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionTranslate property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionTranslate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionTranslate.\n     */\n    val defaultFillExtrusionTranslateTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionTranslate property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate-transition\").silentUnwrap()\n\n    /**\n     * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n     */\n    val defaultFillExtrusionTranslateAnchor: FillExtrusionTranslateAnchor?\n      /**\n       * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n       *\n       * Get the default value of FillExtrusionTranslateAnchor property\n       *\n       * @return FillExtrusionTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate-anchor\").silentUnwrap<String>()?.let {\n          return FillExtrusionTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n     *\n     * This is an Expression representation of \"fill-extrusion-translate-anchor\".\n     *\n     */\n    val defaultFillExtrusionTranslateAnchorAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionTranslateAnchor property as an Expression\n       *\n       * @return FillExtrusionTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionTranslateAnchor?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n     */\n    val defaultFillExtrusionVerticalGradient: Boolean?\n      /**\n       * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n       *\n       * Get the default value of FillExtrusionVerticalGradient property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-gradient\").silentUnwrap()\n      }\n\n    /**\n     * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n     *\n     * This is an Expression representation of \"fill-extrusion-vertical-gradient\".\n     *\n     */\n    val defaultFillExtrusionVerticalGradientAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionVerticalGradient property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-gradient\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionVerticalGradient?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionVerticalScale: Double?\n      /**\n       * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n       *\n       * Get the default value of FillExtrusionVerticalScale property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-scale\").silentUnwrap()\n      }\n\n    /**\n     * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n     *\n     * This is an Expression representation of \"fill-extrusion-vertical-scale\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionVerticalScaleAsExpression: Expression?\n      /**\n       * Get default value of the FillExtrusionVerticalScale property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-scale\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillExtrusionVerticalScale?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillExtrusionVerticalScale.\n     */\n    @MapboxExperimental\n    val defaultFillExtrusionVerticalScaleTransition: StyleTransition?\n      /**\n       * Get the FillExtrusionVerticalScale property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-scale-transition\").silentUnwrap()\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface FillExtrusionLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): FillExtrusionLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): FillExtrusionLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): FillExtrusionLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): FillExtrusionLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): FillExtrusionLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): FillExtrusionLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): FillExtrusionLayer\n\n  // Property getters and setters\n\n  /**\n   * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionEdgeRadius value of fillExtrusionEdgeRadius\n   */\n  @MapboxExperimental\n  fun fillExtrusionEdgeRadius(fillExtrusionEdgeRadius: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * Radius of a fill extrusion edge in meters. If not zero, rounds extrusion edges for a smoother appearance. Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionEdgeRadius value of fillExtrusionEdgeRadius as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionEdgeRadius(fillExtrusionEdgeRadius: Expression): FillExtrusionLayer\n\n  /**\n   * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * @param fillExtrusionAmbientOcclusionGroundAttenuation value of fillExtrusionAmbientOcclusionGroundAttenuation\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionGroundAttenuation(fillExtrusionAmbientOcclusionGroundAttenuation: Double = 0.69): FillExtrusionLayer\n\n  /**\n   * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * @param fillExtrusionAmbientOcclusionGroundAttenuation value of fillExtrusionAmbientOcclusionGroundAttenuation as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionGroundAttenuation(fillExtrusionAmbientOcclusionGroundAttenuation: Expression): FillExtrusionLayer\n\n  /**\n   * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * Set the FillExtrusionAmbientOcclusionGroundAttenuation property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionGroundAttenuationTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * Provides a control to futher fine-tune the look of the ambient occlusion on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * DSL for [fillExtrusionAmbientOcclusionGroundAttenuationTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionGroundAttenuationTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n   *\n   * @param fillExtrusionAmbientOcclusionGroundRadius value of fillExtrusionAmbientOcclusionGroundRadius\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionGroundRadius(fillExtrusionAmbientOcclusionGroundRadius: Double = 3.0): FillExtrusionLayer\n\n  /**\n   * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n   *\n   * @param fillExtrusionAmbientOcclusionGroundRadius value of fillExtrusionAmbientOcclusionGroundRadius as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionGroundRadius(fillExtrusionAmbientOcclusionGroundRadius: Expression): FillExtrusionLayer\n\n  /**\n   * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n   *\n   * Set the FillExtrusionAmbientOcclusionGroundRadius property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionGroundRadiusTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The extent of the ambient occlusion effect on the ground beneath the extruded buildings in meters. Default value: 3. Minimum value: 0.\n   *\n   * DSL for [fillExtrusionAmbientOcclusionGroundRadiusTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionGroundRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionAmbientOcclusionIntensity value of fillExtrusionAmbientOcclusionIntensity\n   */\n  fun fillExtrusionAmbientOcclusionIntensity(fillExtrusionAmbientOcclusionIntensity: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionAmbientOcclusionIntensity value of fillExtrusionAmbientOcclusionIntensity as Expression\n   */\n  fun fillExtrusionAmbientOcclusionIntensity(fillExtrusionAmbientOcclusionIntensity: Expression): FillExtrusionLayer\n\n  /**\n   * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n   *\n   * Set the FillExtrusionAmbientOcclusionIntensity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun fillExtrusionAmbientOcclusionIntensityTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * Controls the intensity of shading near ground and concave angles between walls. Default value 0.0 disables ambient occlusion and values around 0.3 provide the most plausible results for buildings. Default value: 0. Value range: [0, 1]\n   *\n   * DSL for [fillExtrusionAmbientOcclusionIntensityTransition].\n   */\n  fun fillExtrusionAmbientOcclusionIntensityTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n   *\n   * @param fillExtrusionAmbientOcclusionRadius value of fillExtrusionAmbientOcclusionRadius\n   */\n  fun fillExtrusionAmbientOcclusionRadius(fillExtrusionAmbientOcclusionRadius: Double = 3.0): FillExtrusionLayer\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n   *\n   * @param fillExtrusionAmbientOcclusionRadius value of fillExtrusionAmbientOcclusionRadius as Expression\n   */\n  fun fillExtrusionAmbientOcclusionRadius(fillExtrusionAmbientOcclusionRadius: Expression): FillExtrusionLayer\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n   *\n   * Set the FillExtrusionAmbientOcclusionRadius property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun fillExtrusionAmbientOcclusionRadiusTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. This property works only with legacy light. When 3D lights are enabled `fill-extrusion-ambient-occlusion-wall-radius` and `fill-extrusion-ambient-occlusion-ground-radius` are used instead. Default value: 3. Minimum value: 0.\n   *\n   * DSL for [fillExtrusionAmbientOcclusionRadiusTransition].\n   */\n  fun fillExtrusionAmbientOcclusionRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n   *\n   * @param fillExtrusionAmbientOcclusionWallRadius value of fillExtrusionAmbientOcclusionWallRadius\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionWallRadius(fillExtrusionAmbientOcclusionWallRadius: Double = 3.0): FillExtrusionLayer\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n   *\n   * @param fillExtrusionAmbientOcclusionWallRadius value of fillExtrusionAmbientOcclusionWallRadius as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionWallRadius(fillExtrusionAmbientOcclusionWallRadius: Expression): FillExtrusionLayer\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n   *\n   * Set the FillExtrusionAmbientOcclusionWallRadius property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionWallRadiusTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * Shades area near ground and concave angles between walls where the radius defines only vertical impact. Default value 3.0 corresponds to height of one floor and brings the most plausible results for buildings. Default value: 3. Minimum value: 0.\n   *\n   * DSL for [fillExtrusionAmbientOcclusionWallRadiusTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionAmbientOcclusionWallRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n   *\n   * @param fillExtrusionBase value of fillExtrusionBase\n   */\n  fun fillExtrusionBase(fillExtrusionBase: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n   *\n   * @param fillExtrusionBase value of fillExtrusionBase as Expression\n   */\n  fun fillExtrusionBase(fillExtrusionBase: Expression): FillExtrusionLayer\n\n  /**\n   * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n   *\n   * Set the FillExtrusionBase property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun fillExtrusionBaseTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`. Default value: 0. Minimum value: 0. The unit of fillExtrusionBase is in meters.\n   *\n   * DSL for [fillExtrusionBaseTransition].\n   */\n  fun fillExtrusionBaseTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n   *\n   * @param fillExtrusionBaseAlignment value of fillExtrusionBaseAlignment\n   */\n  @MapboxExperimental\n  fun fillExtrusionBaseAlignment(fillExtrusionBaseAlignment: FillExtrusionBaseAlignment = FillExtrusionBaseAlignment.TERRAIN): FillExtrusionLayer\n\n  /**\n   * Controls the behavior of fill extrusion base over terrain Default value: \"terrain\".\n   *\n   * @param fillExtrusionBaseAlignment value of fillExtrusionBaseAlignment as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionBaseAlignment(fillExtrusionBaseAlignment: Expression): FillExtrusionLayer\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * @param fillExtrusionCastShadows value of fillExtrusionCastShadows\n   */\n  fun fillExtrusionCastShadows(fillExtrusionCastShadows: Boolean = true): FillExtrusionLayer\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * @param fillExtrusionCastShadows value of fillExtrusionCastShadows as Expression\n   */\n  fun fillExtrusionCastShadows(fillExtrusionCastShadows: Expression): FillExtrusionLayer\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   *\n   * @param fillExtrusionColor value of fillExtrusionColor\n   */\n  fun fillExtrusionColor(fillExtrusionColor: String = \"#000000\"): FillExtrusionLayer\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   *\n   * @param fillExtrusionColor value of fillExtrusionColor as Expression\n   */\n  fun fillExtrusionColor(fillExtrusionColor: Expression): FillExtrusionLayer\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   *\n   * @param fillExtrusionColor value of fillExtrusionColor\n   */\n  fun fillExtrusionColor(@ColorInt fillExtrusionColor: Int): FillExtrusionLayer\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   *\n   * Set the FillExtrusionColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun fillExtrusionColorTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity. Default value: \"#000000\".\n   *\n   * DSL for [fillExtrusionColorTransition].\n   */\n  fun fillExtrusionColorTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * Set the fillExtrusionColorUseTheme as String for [fillExtrusionColor].\n   *\n   * @param fillExtrusionColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillExtrusionColorUseTheme(fillExtrusionColorUseTheme: String): FillExtrusionLayer\n\n  /**\n   * Set the fillExtrusionColorUseTheme as Expression for [fillExtrusionColor].\n   *\n   * @param fillExtrusionColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillExtrusionColorUseTheme(fillExtrusionColorUseTheme: Expression): FillExtrusionLayer\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionCutoffFadeRange value of fillExtrusionCutoffFadeRange\n   */\n  fun fillExtrusionCutoffFadeRange(fillExtrusionCutoffFadeRange: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. Fade out is implemented by scaling down and removing buildings in the fade range in a staggered fashion. Opacity is not changed. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionCutoffFadeRange value of fillExtrusionCutoffFadeRange as Expression\n   */\n  fun fillExtrusionCutoffFadeRange(fillExtrusionCutoffFadeRange: Expression): FillExtrusionLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n   *\n   * @param fillExtrusionEmissiveStrength value of fillExtrusionEmissiveStrength\n   */\n  fun fillExtrusionEmissiveStrength(fillExtrusionEmissiveStrength: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n   *\n   * @param fillExtrusionEmissiveStrength value of fillExtrusionEmissiveStrength as Expression\n   */\n  fun fillExtrusionEmissiveStrength(fillExtrusionEmissiveStrength: Expression): FillExtrusionLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n   *\n   * Set the FillExtrusionEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun fillExtrusionEmissiveStrengthTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillExtrusionEmissiveStrength is in intensity.\n   *\n   * DSL for [fillExtrusionEmissiveStrengthTransition].\n   */\n  fun fillExtrusionEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   *\n   * @param fillExtrusionFloodLightColor value of fillExtrusionFloodLightColor\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightColor(fillExtrusionFloodLightColor: String = \"#ffffff\"): FillExtrusionLayer\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   *\n   * @param fillExtrusionFloodLightColor value of fillExtrusionFloodLightColor as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightColor(fillExtrusionFloodLightColor: Expression): FillExtrusionLayer\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   *\n   * @param fillExtrusionFloodLightColor value of fillExtrusionFloodLightColor\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightColor(@ColorInt fillExtrusionFloodLightColor: Int): FillExtrusionLayer\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   *\n   * Set the FillExtrusionFloodLightColor property transition options\n   *\n   * @param options transition options for String\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightColorTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The color of the flood light effect on the walls of the extruded buildings. Default value: \"#ffffff\".\n   *\n   * DSL for [fillExtrusionFloodLightColorTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightColorTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * Set the fillExtrusionFloodLightColorUseTheme as String for [fillExtrusionFloodLightColor].\n   *\n   * @param fillExtrusionFloodLightColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightColorUseTheme(fillExtrusionFloodLightColorUseTheme: String): FillExtrusionLayer\n\n  /**\n   * Set the fillExtrusionFloodLightColorUseTheme as Expression for [fillExtrusionFloodLightColor].\n   *\n   * @param fillExtrusionFloodLightColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightColorUseTheme(fillExtrusionFloodLightColorUseTheme: Expression): FillExtrusionLayer\n\n  /**\n   * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * @param fillExtrusionFloodLightGroundAttenuation value of fillExtrusionFloodLightGroundAttenuation\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightGroundAttenuation(fillExtrusionFloodLightGroundAttenuation: Double = 0.69): FillExtrusionLayer\n\n  /**\n   * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * @param fillExtrusionFloodLightGroundAttenuation value of fillExtrusionFloodLightGroundAttenuation as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightGroundAttenuation(fillExtrusionFloodLightGroundAttenuation: Expression): FillExtrusionLayer\n\n  /**\n   * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * Set the FillExtrusionFloodLightGroundAttenuation property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightGroundAttenuationTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * Provides a control to futher fine-tune the look of the flood light on the ground beneath the extruded buildings. Lower values give the effect a more solid look while higher values make it smoother. Default value: 0.69. Value range: [0, 1]\n   *\n   * DSL for [fillExtrusionFloodLightGroundAttenuationTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightGroundAttenuationTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n   *\n   * @param fillExtrusionFloodLightGroundRadius value of fillExtrusionFloodLightGroundRadius\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightGroundRadius(fillExtrusionFloodLightGroundRadius: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n   *\n   * @param fillExtrusionFloodLightGroundRadius value of fillExtrusionFloodLightGroundRadius as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightGroundRadius(fillExtrusionFloodLightGroundRadius: Expression): FillExtrusionLayer\n\n  /**\n   * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n   *\n   * Set the FillExtrusionFloodLightGroundRadius property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightGroundRadiusTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The extent of the flood light effect on the ground beneath the extruded buildings in meters. Note: this experimental property is evaluated once per tile, during tile initialization. Changing the property value could trigger tile reload. The `feature-state` styling is deprecated and will get removed soon. Default value: 0. The unit of fillExtrusionFloodLightGroundRadius is in meters.\n   *\n   * DSL for [fillExtrusionFloodLightGroundRadiusTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightGroundRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionFloodLightIntensity value of fillExtrusionFloodLightIntensity\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightIntensity(fillExtrusionFloodLightIntensity: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionFloodLightIntensity value of fillExtrusionFloodLightIntensity as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightIntensity(fillExtrusionFloodLightIntensity: Expression): FillExtrusionLayer\n\n  /**\n   * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n   *\n   * Set the FillExtrusionFloodLightIntensity property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightIntensityTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The intensity of the flood light color. Default value: 0. Value range: [0, 1]\n   *\n   * DSL for [fillExtrusionFloodLightIntensityTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightIntensityTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n   *\n   * @param fillExtrusionFloodLightWallRadius value of fillExtrusionFloodLightWallRadius\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightWallRadius(fillExtrusionFloodLightWallRadius: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n   *\n   * @param fillExtrusionFloodLightWallRadius value of fillExtrusionFloodLightWallRadius as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightWallRadius(fillExtrusionFloodLightWallRadius: Expression): FillExtrusionLayer\n\n  /**\n   * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n   *\n   * Set the FillExtrusionFloodLightWallRadius property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightWallRadiusTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The extent of the flood light effect on the walls of the extruded buildings in meters. Default value: 0. Minimum value: 0. The unit of fillExtrusionFloodLightWallRadius is in meters.\n   *\n   * DSL for [fillExtrusionFloodLightWallRadiusTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionFloodLightWallRadiusTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n   *\n   * @param fillExtrusionHeight value of fillExtrusionHeight\n   */\n  fun fillExtrusionHeight(fillExtrusionHeight: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n   *\n   * @param fillExtrusionHeight value of fillExtrusionHeight as Expression\n   */\n  fun fillExtrusionHeight(fillExtrusionHeight: Expression): FillExtrusionLayer\n\n  /**\n   * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n   *\n   * Set the FillExtrusionHeight property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun fillExtrusionHeightTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The height with which to extrude this layer. Default value: 0. Minimum value: 0. The unit of fillExtrusionHeight is in meters.\n   *\n   * DSL for [fillExtrusionHeightTransition].\n   */\n  fun fillExtrusionHeightTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n   *\n   * @param fillExtrusionHeightAlignment value of fillExtrusionHeightAlignment\n   */\n  @MapboxExperimental\n  fun fillExtrusionHeightAlignment(fillExtrusionHeightAlignment: FillExtrusionHeightAlignment = FillExtrusionHeightAlignment.FLAT): FillExtrusionLayer\n\n  /**\n   * Controls the behavior of fill extrusion height over terrain Default value: \"flat\".\n   *\n   * @param fillExtrusionHeightAlignment value of fillExtrusionHeightAlignment as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionHeightAlignment(fillExtrusionHeightAlignment: Expression): FillExtrusionLayer\n\n  /**\n   * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n   *\n   * @param fillExtrusionLineWidth value of fillExtrusionLineWidth\n   */\n  @MapboxExperimental\n  fun fillExtrusionLineWidth(fillExtrusionLineWidth: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n   *\n   * @param fillExtrusionLineWidth value of fillExtrusionLineWidth as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionLineWidth(fillExtrusionLineWidth: Expression): FillExtrusionLayer\n\n  /**\n   * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n   *\n   * Set the FillExtrusionLineWidth property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillExtrusionLineWidthTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * If a non-zero value is provided, it sets the fill-extrusion layer into wall rendering mode. The value is used to render the feature with the given width over the outlines of the geometry. Note: This property is experimental and some other fill-extrusion properties might not be supported with non-zero line width. Default value: 0. Minimum value: 0. The unit of fillExtrusionLineWidth is in meters.\n   *\n   * DSL for [fillExtrusionLineWidthTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionLineWidthTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n   *\n   * @param fillExtrusionOpacity value of fillExtrusionOpacity\n   */\n  fun fillExtrusionOpacity(fillExtrusionOpacity: Double = 1.0): FillExtrusionLayer\n\n  /**\n   * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n   *\n   * @param fillExtrusionOpacity value of fillExtrusionOpacity as Expression\n   */\n  fun fillExtrusionOpacity(fillExtrusionOpacity: Expression): FillExtrusionLayer\n\n  /**\n   * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n   *\n   * Set the FillExtrusionOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun fillExtrusionOpacityTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [fillExtrusionOpacityTransition].\n   */\n  fun fillExtrusionOpacityTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param fillExtrusionPattern value of fillExtrusionPattern\n   */\n  fun fillExtrusionPattern(fillExtrusionPattern: String): FillExtrusionLayer\n\n  /**\n   * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param fillExtrusionPattern value of fillExtrusionPattern as Expression\n   */\n  fun fillExtrusionPattern(fillExtrusionPattern: Expression): FillExtrusionLayer\n\n  /**\n   * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionPatternCrossFade value of fillExtrusionPatternCrossFade\n   */\n  fun fillExtrusionPatternCrossFade(fillExtrusionPatternCrossFade: Double = 0.0): FillExtrusionLayer\n\n  /**\n   * Controls the transition progress between the image variants of fill-extrusion-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * @param fillExtrusionPatternCrossFade value of fillExtrusionPatternCrossFade as Expression\n   */\n  fun fillExtrusionPatternCrossFade(fillExtrusionPatternCrossFade: Expression): FillExtrusionLayer\n\n  /**\n   * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n   *\n   * @param fillExtrusionRoundedRoof value of fillExtrusionRoundedRoof\n   */\n  @MapboxExperimental\n  fun fillExtrusionRoundedRoof(fillExtrusionRoundedRoof: Boolean = true): FillExtrusionLayer\n\n  /**\n   * Indicates whether top edges should be rounded when fill-extrusion-edge-radius has a value greater than 0. If false, rounded edges are only applied to the sides. Default is true. Default value: true.\n   *\n   * @param fillExtrusionRoundedRoof value of fillExtrusionRoundedRoof as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionRoundedRoof(fillExtrusionRoundedRoof: Expression): FillExtrusionLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n   *\n   * @param fillExtrusionTranslate value of fillExtrusionTranslate\n   */\n  fun fillExtrusionTranslate(fillExtrusionTranslate: List<Double> = listOf(0.0, 0.0)): FillExtrusionLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n   *\n   * @param fillExtrusionTranslate value of fillExtrusionTranslate as Expression\n   */\n  fun fillExtrusionTranslate(fillExtrusionTranslate: Expression): FillExtrusionLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n   *\n   * Set the FillExtrusionTranslate property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun fillExtrusionTranslateTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. Default value: [0,0]. The unit of fillExtrusionTranslate is in pixels.\n   *\n   * DSL for [fillExtrusionTranslateTransition].\n   */\n  fun fillExtrusionTranslateTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n\n  /**\n   * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n   *\n   * @param fillExtrusionTranslateAnchor value of fillExtrusionTranslateAnchor\n   */\n  fun fillExtrusionTranslateAnchor(fillExtrusionTranslateAnchor: FillExtrusionTranslateAnchor = FillExtrusionTranslateAnchor.MAP): FillExtrusionLayer\n\n  /**\n   * Controls the frame of reference for `fill-extrusion-translate`. Default value: \"map\".\n   *\n   * @param fillExtrusionTranslateAnchor value of fillExtrusionTranslateAnchor as Expression\n   */\n  fun fillExtrusionTranslateAnchor(fillExtrusionTranslateAnchor: Expression): FillExtrusionLayer\n\n  /**\n   * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n   *\n   * @param fillExtrusionVerticalGradient value of fillExtrusionVerticalGradient\n   */\n  fun fillExtrusionVerticalGradient(fillExtrusionVerticalGradient: Boolean = true): FillExtrusionLayer\n\n  /**\n   * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. Default value: true.\n   *\n   * @param fillExtrusionVerticalGradient value of fillExtrusionVerticalGradient as Expression\n   */\n  fun fillExtrusionVerticalGradient(fillExtrusionVerticalGradient: Expression): FillExtrusionLayer\n\n  /**\n   * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n   *\n   * @param fillExtrusionVerticalScale value of fillExtrusionVerticalScale\n   */\n  @MapboxExperimental\n  fun fillExtrusionVerticalScale(fillExtrusionVerticalScale: Double = 1.0): FillExtrusionLayer\n\n  /**\n   * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n   *\n   * @param fillExtrusionVerticalScale value of fillExtrusionVerticalScale as Expression\n   */\n  @MapboxExperimental\n  fun fillExtrusionVerticalScale(fillExtrusionVerticalScale: Expression): FillExtrusionLayer\n\n  /**\n   * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n   *\n   * Set the FillExtrusionVerticalScale property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillExtrusionVerticalScaleTransition(options: StyleTransition): FillExtrusionLayer\n\n  /**\n   * A global multiplier that can be used to scale base, height, AO, and flood light of the fill extrusions. Default value: 1. Minimum value: 0.\n   *\n   * DSL for [fillExtrusionVerticalScaleTransition].\n   */\n  @MapboxExperimental\n  fun fillExtrusionVerticalScaleTransition(block: StyleTransition.Builder.() -> Unit): FillExtrusionLayer\n}\n\n/**\n * DSL function for creating a [FillExtrusionLayer].\n */\nfun fillExtrusionLayer(layerId: String, sourceId: String, block: FillExtrusionLayerDsl.() -> Unit): FillExtrusionLayer = FillExtrusionLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/FillLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A filled polygon with an optional stroked border.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#fill)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass FillLayer(override val layerId: String, val sourceId: String) : FillLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): FillLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): FillLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [FillLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [FillLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [FillLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): FillLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[FillLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [FillLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [FillLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): FillLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [FillLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [FillLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): FillLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   */\n  @MapboxExperimental\n  val fillConstructBridgeGuardRail: Boolean?\n    /**\n     * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n     *\n     * Use static method [FillLayer.defaultFillConstructBridgeGuardRail] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"fill-construct-bridge-guard-rail\")\n    }\n\n  /**\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   *\n   * Use static method [FillLayer.defaultFillConstructBridgeGuardRail] to set the default property.\n   *\n   * @param fillConstructBridgeGuardRail value of fillConstructBridgeGuardRail\n   */\n  @MapboxExperimental\n  override fun fillConstructBridgeGuardRail(fillConstructBridgeGuardRail: Boolean): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-construct-bridge-guard-rail\", fillConstructBridgeGuardRail)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   *\n   * This is an Expression representation of \"fill-construct-bridge-guard-rail\".\n   *\n   */\n  @MapboxExperimental\n  val fillConstructBridgeGuardRailAsExpression: Expression?\n    /**\n     * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n     *\n     * Get the FillConstructBridgeGuardRail property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillConstructBridgeGuardRailAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-construct-bridge-guard-rail\")\n\n  /**\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   *\n   * Use static method [FillLayer.defaultFillConstructBridgeGuardRailAsExpression] to set the default property.\n   *\n   * @param fillConstructBridgeGuardRail value of fillConstructBridgeGuardRail as Expression\n   */\n  @MapboxExperimental\n  override fun fillConstructBridgeGuardRail(fillConstructBridgeGuardRail: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-construct-bridge-guard-rail\", fillConstructBridgeGuardRail)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  @MapboxExperimental\n  val fillElevationReference: FillElevationReference?\n    /**\n     * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     *\n     * Use static method [FillLayer.defaultFillElevationReference] to get the default property.\n     *\n     * @return FillElevationReference\n     */\n    get() {\n      getPropertyValue<String?>(\"fill-elevation-reference\")?.let {\n        return FillElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * Use static method [FillLayer.defaultFillElevationReference] to set the default property.\n   *\n   * @param fillElevationReference value of fillElevationReference\n   */\n  @MapboxExperimental\n  override fun fillElevationReference(fillElevationReference: FillElevationReference): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-elevation-reference\", fillElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * This is an Expression representation of \"fill-elevation-reference\".\n   *\n   */\n  @MapboxExperimental\n  val fillElevationReferenceAsExpression: Expression?\n    /**\n     * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     *\n     * Get the FillElevationReference property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillElevationReferenceAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-elevation-reference\")\n        ?: fillElevationReference?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * Use static method [FillLayer.defaultFillElevationReferenceAsExpression] to set the default property.\n   *\n   * @param fillElevationReference value of fillElevationReference as Expression\n   */\n  @MapboxExperimental\n  override fun fillElevationReference(fillElevationReference: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-elevation-reference\", fillElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  val fillSortKey: Double?\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     *\n     * Use static method [FillLayer.defaultFillSortKey] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-sort-key\")\n    }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * Use static method [FillLayer.defaultFillSortKey] to set the default property.\n   *\n   * @param fillSortKey value of fillSortKey\n   */\n  override fun fillSortKey(fillSortKey: Double): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-sort-key\", fillSortKey)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * This is an Expression representation of \"fill-sort-key\".\n   *\n   */\n  val fillSortKeyAsExpression: Expression?\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     *\n     * Get the FillSortKey property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillSortKeyAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-sort-key\")\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * Use static method [FillLayer.defaultFillSortKeyAsExpression] to set the default property.\n   *\n   * @param fillSortKey value of fillSortKey as Expression\n   */\n  override fun fillSortKey(fillSortKey: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-sort-key\", fillSortKey)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether or not the fill should be antialiased. Default value: true.\n   */\n  val fillAntialias: Boolean?\n    /**\n     * Whether or not the fill should be antialiased. Default value: true.\n     *\n     * Use static method [FillLayer.defaultFillAntialias] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"fill-antialias\")\n    }\n\n  /**\n   * Whether or not the fill should be antialiased. Default value: true.\n   *\n   * Use static method [FillLayer.defaultFillAntialias] to set the default property.\n   *\n   * @param fillAntialias value of fillAntialias\n   */\n  override fun fillAntialias(fillAntialias: Boolean): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-antialias\", fillAntialias)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether or not the fill should be antialiased. Default value: true.\n   *\n   * This is an Expression representation of \"fill-antialias\".\n   *\n   */\n  val fillAntialiasAsExpression: Expression?\n    /**\n     * Whether or not the fill should be antialiased. Default value: true.\n     *\n     * Get the FillAntialias property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillAntialiasAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-antialias\")\n\n  /**\n   * Whether or not the fill should be antialiased. Default value: true.\n   *\n   * Use static method [FillLayer.defaultFillAntialiasAsExpression] to set the default property.\n   *\n   * @param fillAntialias value of fillAntialias as Expression\n   */\n  override fun fillAntialias(fillAntialias: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-antialias\", fillAntialias)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  val fillBridgeGuardRailColor: String?\n    /**\n     * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n     *\n     * Use static method [FillLayer.defaultFillBridgeGuardRailColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      fillBridgeGuardRailColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * Use static method [FillLayer.defaultFillBridgeGuardRailColor] to set the default property.\n   *\n   * @param fillBridgeGuardRailColor value of fillBridgeGuardRailColor\n   */\n  @MapboxExperimental\n  override fun fillBridgeGuardRailColor(fillBridgeGuardRailColor: String): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-bridge-guard-rail-color\", fillBridgeGuardRailColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * This is an Expression representation of \"fill-bridge-guard-rail-color\".\n   *\n   */\n  @MapboxExperimental\n  val fillBridgeGuardRailColorAsExpression: Expression?\n    /**\n     * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n     *\n     * Get the FillBridgeGuardRailColor property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillBridgeGuardRailColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-bridge-guard-rail-color\")\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * Use static method [FillLayer.defaultFillBridgeGuardRailColorAsExpression] to set the default property.\n   *\n   * @param fillBridgeGuardRailColor value of fillBridgeGuardRailColor as Expression\n   */\n  @MapboxExperimental\n  override fun fillBridgeGuardRailColor(fillBridgeGuardRailColor: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-bridge-guard-rail-color\", fillBridgeGuardRailColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  val fillBridgeGuardRailColorAsColorInt: Int?\n    /**\n     * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n     *\n     * Use static method [FillLayer.defaultFillBridgeGuardRailColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      fillBridgeGuardRailColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * Use static method [FillLayer.defaultFillBridgeGuardRailColorAsColorInt] to set the default property.\n   *\n   * @param fillBridgeGuardRailColor value of fillBridgeGuardRailColor\n   */\n  @MapboxExperimental\n  override fun fillBridgeGuardRailColor(@ColorInt fillBridgeGuardRailColor: Int): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-bridge-guard-rail-color\", colorIntToRgbaExpression(fillBridgeGuardRailColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillBridgeGuardRailColor.\n   */\n  @MapboxExperimental\n  val fillBridgeGuardRailColorTransition: StyleTransition?\n    /**\n     * Get the FillBridgeGuardRailColor property transition options\n     *\n     * Use static method [FillLayer.defaultFillBridgeGuardRailColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"fill-bridge-guard-rail-color-transition\")\n    }\n\n  /**\n   * Set the FillBridgeGuardRailColor property transition options\n   *\n   * Use static method [FillLayer.defaultFillBridgeGuardRailColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  @MapboxExperimental\n  override fun fillBridgeGuardRailColorTransition(options: StyleTransition): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-bridge-guard-rail-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillBridgeGuardRailColorTransition].\n   */\n  @MapboxExperimental\n  override fun fillBridgeGuardRailColorTransition(block: StyleTransition.Builder.() -> Unit): FillLayer = apply {\n    fillBridgeGuardRailColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [fillBridgeGuardRailColor].\n   */\n  @MapboxExperimental\n  val fillBridgeGuardRailColorUseTheme: String?\n    /**\n     * Get the FillBridgeGuardRailColorUseTheme property\n     *\n     * Use static method [FillLayer.defaultFillBridgeGuardRailColorUseTheme] to get the default property.\n     *\n     * @return current FillBridgeGuardRailColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"fill-bridge-guard-rail-color-use-theme\")\n    }\n\n  /**\n   * Set the FillBridgeGuardRailColorUseTheme as String\n   *\n   * Use static method [FillLayer.defaultFillBridgeGuardRailColorUseTheme] to get the default property.\n   *\n   * @param fillBridgeGuardRailColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillBridgeGuardRailColorUseTheme(fillBridgeGuardRailColorUseTheme: String): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-bridge-guard-rail-color-use-theme\", fillBridgeGuardRailColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [fillBridgeGuardRailColor].\n   */\n  @MapboxExperimental\n  val fillBridgeGuardRailColorUseThemeAsExpression: Expression?\n    /**\n     * Get the FillBridgeGuardRailColorUseTheme property\n     *\n     * Use static method [FillLayer.defaultFillBridgeGuardRailColorUseTheme] to get the default property.\n     *\n     * @return current FillBridgeGuardRailColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"fill-bridge-guard-rail-color-use-theme\")\n\n  /**\n   * Set the FillBridgeGuardRailColorUseTheme as Expression\n   *\n   * Use static method [FillLayer.defaultFillBridgeGuardRailColorUseTheme] to get the default property.\n   *\n   * @param fillBridgeGuardRailColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillBridgeGuardRailColorUseTheme(fillBridgeGuardRailColorUseTheme: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-bridge-guard-rail-color-use-theme\", fillBridgeGuardRailColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  val fillColor: String?\n    /**\n     * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n     *\n     * Use static method [FillLayer.defaultFillColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      fillColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * Use static method [FillLayer.defaultFillColor] to set the default property.\n   *\n   * @param fillColor value of fillColor\n   */\n  override fun fillColor(fillColor: String): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-color\", fillColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"fill-color\".\n   *\n   */\n  val fillColorAsExpression: Expression?\n    /**\n     * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n     *\n     * Get the FillColor property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-color\")\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * Use static method [FillLayer.defaultFillColorAsExpression] to set the default property.\n   *\n   * @param fillColor value of fillColor as Expression\n   */\n  override fun fillColor(fillColor: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-color\", fillColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  val fillColorAsColorInt: Int?\n    /**\n     * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n     *\n     * Use static method [FillLayer.defaultFillColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      fillColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * Use static method [FillLayer.defaultFillColorAsColorInt] to set the default property.\n   *\n   * @param fillColor value of fillColor\n   */\n  override fun fillColor(@ColorInt fillColor: Int): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-color\", colorIntToRgbaExpression(fillColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillColor.\n   */\n  val fillColorTransition: StyleTransition?\n    /**\n     * Get the FillColor property transition options\n     *\n     * Use static method [FillLayer.defaultFillColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"fill-color-transition\")\n    }\n\n  /**\n   * Set the FillColor property transition options\n   *\n   * Use static method [FillLayer.defaultFillColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun fillColorTransition(options: StyleTransition): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillColorTransition].\n   */\n  override fun fillColorTransition(block: StyleTransition.Builder.() -> Unit): FillLayer = apply {\n    fillColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [fillColor].\n   */\n  @MapboxExperimental\n  val fillColorUseTheme: String?\n    /**\n     * Get the FillColorUseTheme property\n     *\n     * Use static method [FillLayer.defaultFillColorUseTheme] to get the default property.\n     *\n     * @return current FillColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"fill-color-use-theme\")\n    }\n\n  /**\n   * Set the FillColorUseTheme as String\n   *\n   * Use static method [FillLayer.defaultFillColorUseTheme] to get the default property.\n   *\n   * @param fillColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillColorUseTheme(fillColorUseTheme: String): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-color-use-theme\", fillColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [fillColor].\n   */\n  @MapboxExperimental\n  val fillColorUseThemeAsExpression: Expression?\n    /**\n     * Get the FillColorUseTheme property\n     *\n     * Use static method [FillLayer.defaultFillColorUseTheme] to get the default property.\n     *\n     * @return current FillColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"fill-color-use-theme\")\n\n  /**\n   * Set the FillColorUseTheme as Expression\n   *\n   * Use static method [FillLayer.defaultFillColorUseTheme] to get the default property.\n   *\n   * @param fillColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillColorUseTheme(fillColorUseTheme: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-color-use-theme\", fillColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   */\n  val fillEmissiveStrength: Double?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n     *\n     * Use static method [FillLayer.defaultFillEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-emissive-strength\")\n    }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   *\n   * Use static method [FillLayer.defaultFillEmissiveStrength] to set the default property.\n   *\n   * @param fillEmissiveStrength value of fillEmissiveStrength\n   */\n  override fun fillEmissiveStrength(fillEmissiveStrength: Double): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-emissive-strength\", fillEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   *\n   * This is an Expression representation of \"fill-emissive-strength\".\n   *\n   */\n  val fillEmissiveStrengthAsExpression: Expression?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n     *\n     * Get the FillEmissiveStrength property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-emissive-strength\")\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   *\n   * Use static method [FillLayer.defaultFillEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param fillEmissiveStrength value of fillEmissiveStrength as Expression\n   */\n  override fun fillEmissiveStrength(fillEmissiveStrength: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-emissive-strength\", fillEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillEmissiveStrength.\n   */\n  val fillEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the FillEmissiveStrength property transition options\n     *\n     * Use static method [FillLayer.defaultFillEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the FillEmissiveStrength property transition options\n   *\n   * Use static method [FillLayer.defaultFillEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun fillEmissiveStrengthTransition(options: StyleTransition): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillEmissiveStrengthTransition].\n   */\n  override fun fillEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): FillLayer = apply {\n    fillEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   */\n  val fillOpacity: Double?\n    /**\n     * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [FillLayer.defaultFillOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-opacity\")\n    }\n\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [FillLayer.defaultFillOpacity] to set the default property.\n   *\n   * @param fillOpacity value of fillOpacity\n   */\n  override fun fillOpacity(fillOpacity: Double): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-opacity\", fillOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-opacity\".\n   *\n   */\n  val fillOpacityAsExpression: Expression?\n    /**\n     * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n     *\n     * Get the FillOpacity property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-opacity\")\n\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [FillLayer.defaultFillOpacityAsExpression] to set the default property.\n   *\n   * @param fillOpacity value of fillOpacity as Expression\n   */\n  override fun fillOpacity(fillOpacity: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-opacity\", fillOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillOpacity.\n   */\n  val fillOpacityTransition: StyleTransition?\n    /**\n     * Get the FillOpacity property transition options\n     *\n     * Use static method [FillLayer.defaultFillOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-opacity-transition\")\n    }\n\n  /**\n   * Set the FillOpacity property transition options\n   *\n   * Use static method [FillLayer.defaultFillOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun fillOpacityTransition(options: StyleTransition): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillOpacityTransition].\n   */\n  override fun fillOpacityTransition(block: StyleTransition.Builder.() -> Unit): FillLayer = apply {\n    fillOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  val fillOutlineColor: String?\n    /**\n     * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n     *\n     * Use static method [FillLayer.defaultFillOutlineColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      fillOutlineColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * Use static method [FillLayer.defaultFillOutlineColor] to set the default property.\n   *\n   * @param fillOutlineColor value of fillOutlineColor\n   */\n  override fun fillOutlineColor(fillOutlineColor: String): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-outline-color\", fillOutlineColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * This is an Expression representation of \"fill-outline-color\".\n   *\n   */\n  val fillOutlineColorAsExpression: Expression?\n    /**\n     * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n     *\n     * Get the FillOutlineColor property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillOutlineColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-outline-color\")\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * Use static method [FillLayer.defaultFillOutlineColorAsExpression] to set the default property.\n   *\n   * @param fillOutlineColor value of fillOutlineColor as Expression\n   */\n  override fun fillOutlineColor(fillOutlineColor: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-outline-color\", fillOutlineColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  val fillOutlineColorAsColorInt: Int?\n    /**\n     * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n     *\n     * Use static method [FillLayer.defaultFillOutlineColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      fillOutlineColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * Use static method [FillLayer.defaultFillOutlineColorAsColorInt] to set the default property.\n   *\n   * @param fillOutlineColor value of fillOutlineColor\n   */\n  override fun fillOutlineColor(@ColorInt fillOutlineColor: Int): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-outline-color\", colorIntToRgbaExpression(fillOutlineColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillOutlineColor.\n   */\n  val fillOutlineColorTransition: StyleTransition?\n    /**\n     * Get the FillOutlineColor property transition options\n     *\n     * Use static method [FillLayer.defaultFillOutlineColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"fill-outline-color-transition\")\n    }\n\n  /**\n   * Set the FillOutlineColor property transition options\n   *\n   * Use static method [FillLayer.defaultFillOutlineColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun fillOutlineColorTransition(options: StyleTransition): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-outline-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillOutlineColorTransition].\n   */\n  override fun fillOutlineColorTransition(block: StyleTransition.Builder.() -> Unit): FillLayer = apply {\n    fillOutlineColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [fillOutlineColor].\n   */\n  @MapboxExperimental\n  val fillOutlineColorUseTheme: String?\n    /**\n     * Get the FillOutlineColorUseTheme property\n     *\n     * Use static method [FillLayer.defaultFillOutlineColorUseTheme] to get the default property.\n     *\n     * @return current FillOutlineColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"fill-outline-color-use-theme\")\n    }\n\n  /**\n   * Set the FillOutlineColorUseTheme as String\n   *\n   * Use static method [FillLayer.defaultFillOutlineColorUseTheme] to get the default property.\n   *\n   * @param fillOutlineColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillOutlineColorUseTheme(fillOutlineColorUseTheme: String): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-outline-color-use-theme\", fillOutlineColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [fillOutlineColor].\n   */\n  @MapboxExperimental\n  val fillOutlineColorUseThemeAsExpression: Expression?\n    /**\n     * Get the FillOutlineColorUseTheme property\n     *\n     * Use static method [FillLayer.defaultFillOutlineColorUseTheme] to get the default property.\n     *\n     * @return current FillOutlineColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"fill-outline-color-use-theme\")\n\n  /**\n   * Set the FillOutlineColorUseTheme as Expression\n   *\n   * Use static method [FillLayer.defaultFillOutlineColorUseTheme] to get the default property.\n   *\n   * @param fillOutlineColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillOutlineColorUseTheme(fillOutlineColorUseTheme: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-outline-color-use-theme\", fillOutlineColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  val fillPattern: String?\n    /**\n     * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * Use static method [FillLayer.defaultFillPattern] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"fill-pattern\")\n    }\n\n  /**\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * Use static method [FillLayer.defaultFillPattern] to set the default property.\n   *\n   * @param fillPattern value of fillPattern\n   */\n  override fun fillPattern(fillPattern: String): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-pattern\", fillPattern)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * This is an Expression representation of \"fill-pattern\".\n   *\n   */\n  val fillPatternAsExpression: Expression?\n    /**\n     * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * Get the FillPattern property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillPatternAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-pattern\")\n\n  /**\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * Use static method [FillLayer.defaultFillPatternAsExpression] to set the default property.\n   *\n   * @param fillPattern value of fillPattern as Expression\n   */\n  override fun fillPattern(fillPattern: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-pattern\", fillPattern)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  val fillPatternCrossFade: Double?\n    /**\n     * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [FillLayer.defaultFillPatternCrossFade] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-pattern-cross-fade\")\n    }\n\n  /**\n   * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillLayer.defaultFillPatternCrossFade] to set the default property.\n   *\n   * @param fillPatternCrossFade value of fillPatternCrossFade\n   */\n  override fun fillPatternCrossFade(fillPatternCrossFade: Double): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-pattern-cross-fade\", fillPatternCrossFade)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"fill-pattern-cross-fade\".\n   *\n   */\n  val fillPatternCrossFadeAsExpression: Expression?\n    /**\n     * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * Get the FillPatternCrossFade property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillPatternCrossFadeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-pattern-cross-fade\")\n\n  /**\n   * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [FillLayer.defaultFillPatternCrossFadeAsExpression] to set the default property.\n   *\n   * @param fillPatternCrossFade value of fillPatternCrossFade as Expression\n   */\n  override fun fillPatternCrossFade(fillPatternCrossFade: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-pattern-cross-fade\", fillPatternCrossFade)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   */\n  val fillTranslate: List<Double>?\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n     *\n     * Use static method [FillLayer.defaultFillTranslate] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"fill-translate\")\n    }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   *\n   * Use static method [FillLayer.defaultFillTranslate] to set the default property.\n   *\n   * @param fillTranslate value of fillTranslate\n   */\n  override fun fillTranslate(fillTranslate: List<Double>): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-translate\", fillTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   *\n   * This is an Expression representation of \"fill-translate\".\n   *\n   */\n  val fillTranslateAsExpression: Expression?\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n     *\n     * Get the FillTranslate property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillTranslateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-translate\")\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   *\n   * Use static method [FillLayer.defaultFillTranslateAsExpression] to set the default property.\n   *\n   * @param fillTranslate value of fillTranslate as Expression\n   */\n  override fun fillTranslate(fillTranslate: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-translate\", fillTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillTranslate.\n   */\n  val fillTranslateTransition: StyleTransition?\n    /**\n     * Get the FillTranslate property transition options\n     *\n     * Use static method [FillLayer.defaultFillTranslateTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"fill-translate-transition\")\n    }\n\n  /**\n   * Set the FillTranslate property transition options\n   *\n   * Use static method [FillLayer.defaultFillTranslateTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun fillTranslateTransition(options: StyleTransition): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-translate-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillTranslateTransition].\n   */\n  override fun fillTranslateTransition(block: StyleTransition.Builder.() -> Unit): FillLayer = apply {\n    fillTranslateTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n   */\n  val fillTranslateAnchor: FillTranslateAnchor?\n    /**\n     * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n     *\n     * Use static method [FillLayer.defaultFillTranslateAnchor] to get the default property.\n     *\n     * @return FillTranslateAnchor\n     */\n    get() {\n      getPropertyValue<String?>(\"fill-translate-anchor\")?.let {\n        return FillTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n   *\n   * Use static method [FillLayer.defaultFillTranslateAnchor] to set the default property.\n   *\n   * @param fillTranslateAnchor value of fillTranslateAnchor\n   */\n  override fun fillTranslateAnchor(fillTranslateAnchor: FillTranslateAnchor): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-translate-anchor\", fillTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n   *\n   * This is an Expression representation of \"fill-translate-anchor\".\n   *\n   */\n  val fillTranslateAnchorAsExpression: Expression?\n    /**\n     * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n     *\n     * Get the FillTranslateAnchor property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillTranslateAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-translate-anchor\")\n        ?: fillTranslateAnchor?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n   *\n   * Use static method [FillLayer.defaultFillTranslateAnchorAsExpression] to set the default property.\n   *\n   * @param fillTranslateAnchor value of fillTranslateAnchor as Expression\n   */\n  override fun fillTranslateAnchor(fillTranslateAnchor: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-translate-anchor\", fillTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  val fillTunnelStructureColor: String?\n    /**\n     * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n     *\n     * Use static method [FillLayer.defaultFillTunnelStructureColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      fillTunnelStructureColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * Use static method [FillLayer.defaultFillTunnelStructureColor] to set the default property.\n   *\n   * @param fillTunnelStructureColor value of fillTunnelStructureColor\n   */\n  @MapboxExperimental\n  override fun fillTunnelStructureColor(fillTunnelStructureColor: String): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-tunnel-structure-color\", fillTunnelStructureColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * This is an Expression representation of \"fill-tunnel-structure-color\".\n   *\n   */\n  @MapboxExperimental\n  val fillTunnelStructureColorAsExpression: Expression?\n    /**\n     * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n     *\n     * Get the FillTunnelStructureColor property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillTunnelStructureColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"fill-tunnel-structure-color\")\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * Use static method [FillLayer.defaultFillTunnelStructureColorAsExpression] to set the default property.\n   *\n   * @param fillTunnelStructureColor value of fillTunnelStructureColor as Expression\n   */\n  @MapboxExperimental\n  override fun fillTunnelStructureColor(fillTunnelStructureColor: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-tunnel-structure-color\", fillTunnelStructureColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  val fillTunnelStructureColorAsColorInt: Int?\n    /**\n     * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n     *\n     * Use static method [FillLayer.defaultFillTunnelStructureColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      fillTunnelStructureColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * Use static method [FillLayer.defaultFillTunnelStructureColorAsColorInt] to set the default property.\n   *\n   * @param fillTunnelStructureColor value of fillTunnelStructureColor\n   */\n  @MapboxExperimental\n  override fun fillTunnelStructureColor(@ColorInt fillTunnelStructureColor: Int): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-tunnel-structure-color\", colorIntToRgbaExpression(fillTunnelStructureColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillTunnelStructureColor.\n   */\n  @MapboxExperimental\n  val fillTunnelStructureColorTransition: StyleTransition?\n    /**\n     * Get the FillTunnelStructureColor property transition options\n     *\n     * Use static method [FillLayer.defaultFillTunnelStructureColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"fill-tunnel-structure-color-transition\")\n    }\n\n  /**\n   * Set the FillTunnelStructureColor property transition options\n   *\n   * Use static method [FillLayer.defaultFillTunnelStructureColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  @MapboxExperimental\n  override fun fillTunnelStructureColorTransition(options: StyleTransition): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-tunnel-structure-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillTunnelStructureColorTransition].\n   */\n  @MapboxExperimental\n  override fun fillTunnelStructureColorTransition(block: StyleTransition.Builder.() -> Unit): FillLayer = apply {\n    fillTunnelStructureColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [fillTunnelStructureColor].\n   */\n  @MapboxExperimental\n  val fillTunnelStructureColorUseTheme: String?\n    /**\n     * Get the FillTunnelStructureColorUseTheme property\n     *\n     * Use static method [FillLayer.defaultFillTunnelStructureColorUseTheme] to get the default property.\n     *\n     * @return current FillTunnelStructureColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"fill-tunnel-structure-color-use-theme\")\n    }\n\n  /**\n   * Set the FillTunnelStructureColorUseTheme as String\n   *\n   * Use static method [FillLayer.defaultFillTunnelStructureColorUseTheme] to get the default property.\n   *\n   * @param fillTunnelStructureColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillTunnelStructureColorUseTheme(fillTunnelStructureColorUseTheme: String): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-tunnel-structure-color-use-theme\", fillTunnelStructureColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [fillTunnelStructureColor].\n   */\n  @MapboxExperimental\n  val fillTunnelStructureColorUseThemeAsExpression: Expression?\n    /**\n     * Get the FillTunnelStructureColorUseTheme property\n     *\n     * Use static method [FillLayer.defaultFillTunnelStructureColorUseTheme] to get the default property.\n     *\n     * @return current FillTunnelStructureColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"fill-tunnel-structure-color-use-theme\")\n\n  /**\n   * Set the FillTunnelStructureColorUseTheme as Expression\n   *\n   * Use static method [FillLayer.defaultFillTunnelStructureColorUseTheme] to get the default property.\n   *\n   * @param fillTunnelStructureColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun fillTunnelStructureColorUseTheme(fillTunnelStructureColorUseTheme: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-tunnel-structure-color-use-theme\", fillTunnelStructureColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  val fillZOffset: Double?\n    /**\n     * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n     *\n     * Use static method [FillLayer.defaultFillZOffset] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"fill-z-offset\")\n    }\n\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   *\n   * Use static method [FillLayer.defaultFillZOffset] to set the default property.\n   *\n   * @param fillZOffset value of fillZOffset\n   */\n  @MapboxExperimental\n  override fun fillZOffset(fillZOffset: Double): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-z-offset\", fillZOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   *\n   * This is an Expression representation of \"fill-z-offset\".\n   *\n   */\n  @MapboxExperimental\n  val fillZOffsetAsExpression: Expression?\n    /**\n     * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n     *\n     * Get the FillZOffset property as an Expression\n     *\n     * Use static method [FillLayer.defaultFillZOffsetAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"fill-z-offset\")\n\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   *\n   * Use static method [FillLayer.defaultFillZOffsetAsExpression] to set the default property.\n   *\n   * @param fillZOffset value of fillZOffset as Expression\n   */\n  @MapboxExperimental\n  override fun fillZOffset(fillZOffset: Expression): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-z-offset\", fillZOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for FillZOffset.\n   */\n  @MapboxExperimental\n  val fillZOffsetTransition: StyleTransition?\n    /**\n     * Get the FillZOffset property transition options\n     *\n     * Use static method [FillLayer.defaultFillZOffsetTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"fill-z-offset-transition\")\n    }\n\n  /**\n   * Set the FillZOffset property transition options\n   *\n   * Use static method [FillLayer.defaultFillZOffsetTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun fillZOffsetTransition(options: StyleTransition): FillLayer = apply {\n    val propertyValue = PropertyValue(\"fill-z-offset-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [fillZOffsetTransition].\n   */\n  @MapboxExperimental\n  override fun fillZOffsetTransition(block: StyleTransition.Builder.() -> Unit): FillLayer = apply {\n    fillZOffsetTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"fill\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n     */\n    @MapboxExperimental\n    val defaultFillConstructBridgeGuardRail: Boolean?\n      /**\n       * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n       *\n       * Get the default value of FillConstructBridgeGuardRail property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-construct-bridge-guard-rail\").silentUnwrap()\n      }\n\n    /**\n     * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n     *\n     * This is an Expression representation of \"fill-construct-bridge-guard-rail\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillConstructBridgeGuardRailAsExpression: Expression?\n      /**\n       * Get default value of the FillConstructBridgeGuardRail property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-construct-bridge-guard-rail\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillConstructBridgeGuardRail?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     */\n    @MapboxExperimental\n    val defaultFillElevationReference: FillElevationReference?\n      /**\n       * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n       *\n       * Get the default value of FillElevationReference property\n       *\n       * @return FillElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-elevation-reference\").silentUnwrap<String>()?.let {\n          return FillElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     *\n     * This is an Expression representation of \"fill-elevation-reference\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillElevationReferenceAsExpression: Expression?\n      /**\n       * Get default value of the FillElevationReference property as an Expression\n       *\n       * @return FillElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-elevation-reference\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillElevationReference?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     */\n    val defaultFillSortKey: Double?\n      /**\n       * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n       *\n       * Get the default value of FillSortKey property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-sort-key\").silentUnwrap()\n      }\n\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     *\n     * This is an Expression representation of \"fill-sort-key\".\n     *\n     */\n    val defaultFillSortKeyAsExpression: Expression?\n      /**\n       * Get default value of the FillSortKey property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-sort-key\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillSortKey?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Whether or not the fill should be antialiased. Default value: true.\n     */\n    val defaultFillAntialias: Boolean?\n      /**\n       * Whether or not the fill should be antialiased. Default value: true.\n       *\n       * Get the default value of FillAntialias property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-antialias\").silentUnwrap()\n      }\n\n    /**\n     * Whether or not the fill should be antialiased. Default value: true.\n     *\n     * This is an Expression representation of \"fill-antialias\".\n     *\n     */\n    val defaultFillAntialiasAsExpression: Expression?\n      /**\n       * Get default value of the FillAntialias property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-antialias\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillAntialias?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n     */\n    @MapboxExperimental\n    val defaultFillBridgeGuardRailColor: String?\n      /**\n       * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n       *\n       * Get the default value of FillBridgeGuardRailColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultFillBridgeGuardRailColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n     *\n     * This is an Expression representation of \"fill-bridge-guard-rail-color\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillBridgeGuardRailColorAsExpression: Expression?\n      /**\n       * Get default value of the FillBridgeGuardRailColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n     */\n    @MapboxExperimental\n    val defaultFillBridgeGuardRailColorAsColorInt: Int?\n      /**\n       * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n       *\n       * Get the default value of FillBridgeGuardRailColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultFillBridgeGuardRailColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillBridgeGuardRailColor.\n     */\n    @MapboxExperimental\n    val defaultFillBridgeGuardRailColorTransition: StyleTransition?\n      /**\n       * Get the FillBridgeGuardRailColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillBridgeGuardRailColor].\n     */\n    @MapboxExperimental\n    val defaultFillBridgeGuardRailColorUseTheme: String?\n      /**\n       * Get default value of the FillBridgeGuardRailColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillBridgeGuardRailColor].\n     */\n    @MapboxExperimental\n    val defaultFillBridgeGuardRailColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the FillBridgeGuardRailColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultFillBridgeGuardRailColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n     */\n    val defaultFillColor: String?\n      /**\n       * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n       *\n       * Get the default value of FillColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultFillColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"fill-color\".\n     *\n     */\n    val defaultFillColorAsExpression: Expression?\n      /**\n       * Get default value of the FillColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n     */\n    val defaultFillColorAsColorInt: Int?\n      /**\n       * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n       *\n       * Get the default value of FillColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultFillColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillColor.\n     */\n    val defaultFillColorTransition: StyleTransition?\n      /**\n       * Get the FillColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillColor].\n     */\n    @MapboxExperimental\n    val defaultFillColorUseTheme: String?\n      /**\n       * Get default value of the FillColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillColor].\n     */\n    @MapboxExperimental\n    val defaultFillColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the FillColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultFillColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n     */\n    val defaultFillEmissiveStrength: Double?\n      /**\n       * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n       *\n       * Get the default value of FillEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n     *\n     * This is an Expression representation of \"fill-emissive-strength\".\n     *\n     */\n    val defaultFillEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the FillEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillEmissiveStrength.\n     */\n    val defaultFillEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the FillEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n     */\n    val defaultFillOpacity: Double?\n      /**\n       * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of FillOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-opacity\".\n     *\n     */\n    val defaultFillOpacityAsExpression: Expression?\n      /**\n       * Get default value of the FillOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillOpacity.\n     */\n    val defaultFillOpacityTransition: StyleTransition?\n      /**\n       * Get the FillOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-opacity-transition\").silentUnwrap()\n\n    /**\n     * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n     */\n    val defaultFillOutlineColor: String?\n      /**\n       * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n       *\n       * Get the default value of FillOutlineColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultFillOutlineColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n     *\n     * This is an Expression representation of \"fill-outline-color\".\n     *\n     */\n    val defaultFillOutlineColorAsExpression: Expression?\n      /**\n       * Get default value of the FillOutlineColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n     */\n    val defaultFillOutlineColorAsColorInt: Int?\n      /**\n       * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n       *\n       * Get the default value of FillOutlineColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultFillOutlineColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillOutlineColor.\n     */\n    val defaultFillOutlineColorTransition: StyleTransition?\n      /**\n       * Get the FillOutlineColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillOutlineColor].\n     */\n    @MapboxExperimental\n    val defaultFillOutlineColorUseTheme: String?\n      /**\n       * Get default value of the FillOutlineColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillOutlineColor].\n     */\n    @MapboxExperimental\n    val defaultFillOutlineColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the FillOutlineColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultFillOutlineColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     */\n    val defaultFillPattern: String?\n      /**\n       * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n       *\n       * Get the default value of FillPattern property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern\").silentUnwrap()\n      }\n\n    /**\n     * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * This is an Expression representation of \"fill-pattern\".\n     *\n     */\n    val defaultFillPatternAsExpression: Expression?\n      /**\n       * Get default value of the FillPattern property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillPattern?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     */\n    val defaultFillPatternCrossFade: Double?\n      /**\n       * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of FillPatternCrossFade property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern-cross-fade\").silentUnwrap()\n      }\n\n    /**\n     * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"fill-pattern-cross-fade\".\n     *\n     */\n    val defaultFillPatternCrossFadeAsExpression: Expression?\n      /**\n       * Get default value of the FillPatternCrossFade property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern-cross-fade\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillPatternCrossFade?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n     */\n    val defaultFillTranslate: List<Double>?\n      /**\n       * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n       *\n       * Get the default value of FillTranslate property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate\").silentUnwrap()\n      }\n\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n     *\n     * This is an Expression representation of \"fill-translate\".\n     *\n     */\n    val defaultFillTranslateAsExpression: Expression?\n      /**\n       * Get default value of the FillTranslate property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillTranslate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillTranslate.\n     */\n    val defaultFillTranslateTransition: StyleTransition?\n      /**\n       * Get the FillTranslate property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate-transition\").silentUnwrap()\n\n    /**\n     * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n     */\n    val defaultFillTranslateAnchor: FillTranslateAnchor?\n      /**\n       * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n       *\n       * Get the default value of FillTranslateAnchor property\n       *\n       * @return FillTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate-anchor\").silentUnwrap<String>()?.let {\n          return FillTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n     *\n     * This is an Expression representation of \"fill-translate-anchor\".\n     *\n     */\n    val defaultFillTranslateAnchorAsExpression: Expression?\n      /**\n       * Get default value of the FillTranslateAnchor property as an Expression\n       *\n       * @return FillTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillTranslateAnchor?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n     */\n    @MapboxExperimental\n    val defaultFillTunnelStructureColor: String?\n      /**\n       * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n       *\n       * Get the default value of FillTunnelStructureColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultFillTunnelStructureColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n     *\n     * This is an Expression representation of \"fill-tunnel-structure-color\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillTunnelStructureColorAsExpression: Expression?\n      /**\n       * Get default value of the FillTunnelStructureColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n     */\n    @MapboxExperimental\n    val defaultFillTunnelStructureColorAsColorInt: Int?\n      /**\n       * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n       *\n       * Get the default value of FillTunnelStructureColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultFillTunnelStructureColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillTunnelStructureColor.\n     */\n    @MapboxExperimental\n    val defaultFillTunnelStructureColorTransition: StyleTransition?\n      /**\n       * Get the FillTunnelStructureColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillTunnelStructureColor].\n     */\n    @MapboxExperimental\n    val defaultFillTunnelStructureColorUseTheme: String?\n      /**\n       * Get default value of the FillTunnelStructureColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [fillTunnelStructureColor].\n     */\n    @MapboxExperimental\n    val defaultFillTunnelStructureColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the FillTunnelStructureColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultFillTunnelStructureColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n     */\n    @MapboxExperimental\n    val defaultFillZOffset: Double?\n      /**\n       * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n       *\n       * Get the default value of FillZOffset property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-z-offset\").silentUnwrap()\n      }\n\n    /**\n     * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n     *\n     * This is an Expression representation of \"fill-z-offset\".\n     *\n     */\n    @MapboxExperimental\n    val defaultFillZOffsetAsExpression: Expression?\n      /**\n       * Get default value of the FillZOffset property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-z-offset\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultFillZOffset?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for FillZOffset.\n     */\n    @MapboxExperimental\n    val defaultFillZOffsetTransition: StyleTransition?\n      /**\n       * Get the FillZOffset property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-z-offset-transition\").silentUnwrap()\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface FillLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): FillLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): FillLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): FillLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): FillLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): FillLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): FillLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): FillLayer\n\n  // Property getters and setters\n\n  /**\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   *\n   * @param fillConstructBridgeGuardRail value of fillConstructBridgeGuardRail\n   */\n  @MapboxExperimental\n  fun fillConstructBridgeGuardRail(fillConstructBridgeGuardRail: Boolean = true): FillLayer\n\n  /**\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   *\n   * @param fillConstructBridgeGuardRail value of fillConstructBridgeGuardRail as Expression\n   */\n  @MapboxExperimental\n  fun fillConstructBridgeGuardRail(fillConstructBridgeGuardRail: Expression): FillLayer\n\n  /**\n   * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * @param fillElevationReference value of fillElevationReference\n   */\n  @MapboxExperimental\n  fun fillElevationReference(fillElevationReference: FillElevationReference = FillElevationReference.NONE): FillLayer\n\n  /**\n   * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * @param fillElevationReference value of fillElevationReference as Expression\n   */\n  @MapboxExperimental\n  fun fillElevationReference(fillElevationReference: Expression): FillLayer\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * @param fillSortKey value of fillSortKey\n   */\n  fun fillSortKey(fillSortKey: Double): FillLayer\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * @param fillSortKey value of fillSortKey as Expression\n   */\n  fun fillSortKey(fillSortKey: Expression): FillLayer\n\n  /**\n   * Whether or not the fill should be antialiased. Default value: true.\n   *\n   * @param fillAntialias value of fillAntialias\n   */\n  fun fillAntialias(fillAntialias: Boolean = true): FillLayer\n\n  /**\n   * Whether or not the fill should be antialiased. Default value: true.\n   *\n   * @param fillAntialias value of fillAntialias as Expression\n   */\n  fun fillAntialias(fillAntialias: Expression): FillLayer\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillBridgeGuardRailColor value of fillBridgeGuardRailColor\n   */\n  @MapboxExperimental\n  fun fillBridgeGuardRailColor(fillBridgeGuardRailColor: String = \"rgba(241, 236, 225, 255)\"): FillLayer\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillBridgeGuardRailColor value of fillBridgeGuardRailColor as Expression\n   */\n  @MapboxExperimental\n  fun fillBridgeGuardRailColor(fillBridgeGuardRailColor: Expression): FillLayer\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillBridgeGuardRailColor value of fillBridgeGuardRailColor\n   */\n  @MapboxExperimental\n  fun fillBridgeGuardRailColor(@ColorInt fillBridgeGuardRailColor: Int): FillLayer\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * Set the FillBridgeGuardRailColor property transition options\n   *\n   * @param options transition options for String\n   */\n  @MapboxExperimental\n  fun fillBridgeGuardRailColorTransition(options: StyleTransition): FillLayer\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * DSL for [fillBridgeGuardRailColorTransition].\n   */\n  @MapboxExperimental\n  fun fillBridgeGuardRailColorTransition(block: StyleTransition.Builder.() -> Unit): FillLayer\n\n  /**\n   * Set the fillBridgeGuardRailColorUseTheme as String for [fillBridgeGuardRailColor].\n   *\n   * @param fillBridgeGuardRailColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillBridgeGuardRailColorUseTheme(fillBridgeGuardRailColorUseTheme: String): FillLayer\n\n  /**\n   * Set the fillBridgeGuardRailColorUseTheme as Expression for [fillBridgeGuardRailColor].\n   *\n   * @param fillBridgeGuardRailColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillBridgeGuardRailColorUseTheme(fillBridgeGuardRailColorUseTheme: Expression): FillLayer\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * @param fillColor value of fillColor\n   */\n  fun fillColor(fillColor: String = \"#000000\"): FillLayer\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * @param fillColor value of fillColor as Expression\n   */\n  fun fillColor(fillColor: Expression): FillLayer\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * @param fillColor value of fillColor\n   */\n  fun fillColor(@ColorInt fillColor: Int): FillLayer\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * Set the FillColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun fillColorTransition(options: StyleTransition): FillLayer\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * DSL for [fillColorTransition].\n   */\n  fun fillColorTransition(block: StyleTransition.Builder.() -> Unit): FillLayer\n\n  /**\n   * Set the fillColorUseTheme as String for [fillColor].\n   *\n   * @param fillColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillColorUseTheme(fillColorUseTheme: String): FillLayer\n\n  /**\n   * Set the fillColorUseTheme as Expression for [fillColor].\n   *\n   * @param fillColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillColorUseTheme(fillColorUseTheme: Expression): FillLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   *\n   * @param fillEmissiveStrength value of fillEmissiveStrength\n   */\n  fun fillEmissiveStrength(fillEmissiveStrength: Double = 0.0): FillLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   *\n   * @param fillEmissiveStrength value of fillEmissiveStrength as Expression\n   */\n  fun fillEmissiveStrength(fillEmissiveStrength: Expression): FillLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   *\n   * Set the FillEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun fillEmissiveStrengthTransition(options: StyleTransition): FillLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   *\n   * DSL for [fillEmissiveStrengthTransition].\n   */\n  fun fillEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): FillLayer\n\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   *\n   * @param fillOpacity value of fillOpacity\n   */\n  fun fillOpacity(fillOpacity: Double = 1.0): FillLayer\n\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   *\n   * @param fillOpacity value of fillOpacity as Expression\n   */\n  fun fillOpacity(fillOpacity: Expression): FillLayer\n\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   *\n   * Set the FillOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun fillOpacityTransition(options: StyleTransition): FillLayer\n\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [fillOpacityTransition].\n   */\n  fun fillOpacityTransition(block: StyleTransition.Builder.() -> Unit): FillLayer\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * @param fillOutlineColor value of fillOutlineColor\n   */\n  fun fillOutlineColor(fillOutlineColor: String): FillLayer\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * @param fillOutlineColor value of fillOutlineColor as Expression\n   */\n  fun fillOutlineColor(fillOutlineColor: Expression): FillLayer\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * @param fillOutlineColor value of fillOutlineColor\n   */\n  fun fillOutlineColor(@ColorInt fillOutlineColor: Int): FillLayer\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * Set the FillOutlineColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun fillOutlineColorTransition(options: StyleTransition): FillLayer\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * DSL for [fillOutlineColorTransition].\n   */\n  fun fillOutlineColorTransition(block: StyleTransition.Builder.() -> Unit): FillLayer\n\n  /**\n   * Set the fillOutlineColorUseTheme as String for [fillOutlineColor].\n   *\n   * @param fillOutlineColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillOutlineColorUseTheme(fillOutlineColorUseTheme: String): FillLayer\n\n  /**\n   * Set the fillOutlineColorUseTheme as Expression for [fillOutlineColor].\n   *\n   * @param fillOutlineColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillOutlineColorUseTheme(fillOutlineColorUseTheme: Expression): FillLayer\n\n  /**\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param fillPattern value of fillPattern\n   */\n  fun fillPattern(fillPattern: String): FillLayer\n\n  /**\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param fillPattern value of fillPattern as Expression\n   */\n  fun fillPattern(fillPattern: Expression): FillLayer\n\n  /**\n   * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * @param fillPatternCrossFade value of fillPatternCrossFade\n   */\n  fun fillPatternCrossFade(fillPatternCrossFade: Double = 0.0): FillLayer\n\n  /**\n   * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * @param fillPatternCrossFade value of fillPatternCrossFade as Expression\n   */\n  fun fillPatternCrossFade(fillPatternCrossFade: Expression): FillLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   *\n   * @param fillTranslate value of fillTranslate\n   */\n  fun fillTranslate(fillTranslate: List<Double> = listOf(0.0, 0.0)): FillLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   *\n   * @param fillTranslate value of fillTranslate as Expression\n   */\n  fun fillTranslate(fillTranslate: Expression): FillLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   *\n   * Set the FillTranslate property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun fillTranslateTransition(options: StyleTransition): FillLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   *\n   * DSL for [fillTranslateTransition].\n   */\n  fun fillTranslateTransition(block: StyleTransition.Builder.() -> Unit): FillLayer\n\n  /**\n   * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n   *\n   * @param fillTranslateAnchor value of fillTranslateAnchor\n   */\n  fun fillTranslateAnchor(fillTranslateAnchor: FillTranslateAnchor = FillTranslateAnchor.MAP): FillLayer\n\n  /**\n   * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n   *\n   * @param fillTranslateAnchor value of fillTranslateAnchor as Expression\n   */\n  fun fillTranslateAnchor(fillTranslateAnchor: Expression): FillLayer\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillTunnelStructureColor value of fillTunnelStructureColor\n   */\n  @MapboxExperimental\n  fun fillTunnelStructureColor(fillTunnelStructureColor: String = \"rgba(241, 236, 225, 255)\"): FillLayer\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillTunnelStructureColor value of fillTunnelStructureColor as Expression\n   */\n  @MapboxExperimental\n  fun fillTunnelStructureColor(fillTunnelStructureColor: Expression): FillLayer\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillTunnelStructureColor value of fillTunnelStructureColor\n   */\n  @MapboxExperimental\n  fun fillTunnelStructureColor(@ColorInt fillTunnelStructureColor: Int): FillLayer\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * Set the FillTunnelStructureColor property transition options\n   *\n   * @param options transition options for String\n   */\n  @MapboxExperimental\n  fun fillTunnelStructureColorTransition(options: StyleTransition): FillLayer\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * DSL for [fillTunnelStructureColorTransition].\n   */\n  @MapboxExperimental\n  fun fillTunnelStructureColorTransition(block: StyleTransition.Builder.() -> Unit): FillLayer\n\n  /**\n   * Set the fillTunnelStructureColorUseTheme as String for [fillTunnelStructureColor].\n   *\n   * @param fillTunnelStructureColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillTunnelStructureColorUseTheme(fillTunnelStructureColorUseTheme: String): FillLayer\n\n  /**\n   * Set the fillTunnelStructureColorUseTheme as Expression for [fillTunnelStructureColor].\n   *\n   * @param fillTunnelStructureColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun fillTunnelStructureColorUseTheme(fillTunnelStructureColorUseTheme: Expression): FillLayer\n\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   *\n   * @param fillZOffset value of fillZOffset\n   */\n  @MapboxExperimental\n  fun fillZOffset(fillZOffset: Double = 0.0): FillLayer\n\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   *\n   * @param fillZOffset value of fillZOffset as Expression\n   */\n  @MapboxExperimental\n  fun fillZOffset(fillZOffset: Expression): FillLayer\n\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   *\n   * Set the FillZOffset property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun fillZOffsetTransition(options: StyleTransition): FillLayer\n\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   *\n   * DSL for [fillZOffsetTransition].\n   */\n  @MapboxExperimental\n  fun fillZOffsetTransition(block: StyleTransition.Builder.() -> Unit): FillLayer\n}\n\n/**\n * DSL function for creating a [FillLayer].\n */\nfun fillLayer(layerId: String, sourceId: String, block: FillLayerDsl.() -> Unit): FillLayer = FillLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/HeatmapLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A heatmap.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#heatmap)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass HeatmapLayer(override val layerId: String, val sourceId: String) : HeatmapLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): HeatmapLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): HeatmapLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [HeatmapLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [HeatmapLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [HeatmapLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[HeatmapLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [HeatmapLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [HeatmapLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): HeatmapLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [HeatmapLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [HeatmapLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): HeatmapLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `[\"heatmap-density\"]` as input. Default value: [\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",0.1,\"royalblue\",0.3,\"cyan\",0.5,\"lime\",0.7,\"yellow\",1,\"red\"].\n   */\n  val heatmapColor: Expression?\n    /**\n     * Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `[\"heatmap-density\"]` as input. Default value: [\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",0.1,\"royalblue\",0.3,\"cyan\",0.5,\"lime\",0.7,\"yellow\",1,\"red\"].\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapColor] to get the default property.\n     *\n     * @return Expression\n     */\n    get() {\n      return getPropertyValue(\"heatmap-color\")\n    }\n\n  /**\n   * Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `[\"heatmap-density\"]` as input. Default value: [\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",0.1,\"royalblue\",0.3,\"cyan\",0.5,\"lime\",0.7,\"yellow\",1,\"red\"].\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapColor] to set the default property.\n   *\n   * @param heatmapColor value of heatmapColor\n   */\n  override fun heatmapColor(heatmapColor: Expression): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-color\", heatmapColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [heatmapColor].\n   */\n  @MapboxExperimental\n  val heatmapColorUseTheme: String?\n    /**\n     * Get the HeatmapColorUseTheme property\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapColorUseTheme] to get the default property.\n     *\n     * @return current HeatmapColorUseTheme property as Expression\n     */\n    get() {\n      return getPropertyValue(\"heatmap-color-use-theme\")\n    }\n\n  /**\n   * Set the HeatmapColorUseTheme as String\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapColorUseTheme] to get the default property.\n   *\n   * @param heatmapColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun heatmapColorUseTheme(heatmapColorUseTheme: String): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-color-use-theme\", heatmapColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [heatmapColor].\n   */\n  @MapboxExperimental\n  val heatmapColorUseThemeAsExpression: Expression?\n    /**\n     * Get the HeatmapColorUseTheme property\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapColorUseTheme] to get the default property.\n     *\n     * @return current HeatmapColorUseTheme property as Expression\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"heatmap-color-use-theme\")\n\n  /**\n   * Set the HeatmapColorUseTheme as Expression\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapColorUseTheme] to get the default property.\n   *\n   * @param heatmapColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun heatmapColorUseTheme(heatmapColorUseTheme: Expression): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-color-use-theme\", heatmapColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n   */\n  val heatmapIntensity: Double?\n    /**\n     * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapIntensity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"heatmap-intensity\")\n    }\n\n  /**\n   * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapIntensity] to set the default property.\n   *\n   * @param heatmapIntensity value of heatmapIntensity\n   */\n  override fun heatmapIntensity(heatmapIntensity: Double): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-intensity\", heatmapIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n   *\n   * This is an Expression representation of \"heatmap-intensity\".\n   *\n   */\n  val heatmapIntensityAsExpression: Expression?\n    /**\n     * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n     *\n     * Get the HeatmapIntensity property as an Expression\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapIntensityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"heatmap-intensity\")\n\n  /**\n   * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapIntensityAsExpression] to set the default property.\n   *\n   * @param heatmapIntensity value of heatmapIntensity as Expression\n   */\n  override fun heatmapIntensity(heatmapIntensity: Expression): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-intensity\", heatmapIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for HeatmapIntensity.\n   */\n  val heatmapIntensityTransition: StyleTransition?\n    /**\n     * Get the HeatmapIntensity property transition options\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapIntensityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"heatmap-intensity-transition\")\n    }\n\n  /**\n   * Set the HeatmapIntensity property transition options\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapIntensityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun heatmapIntensityTransition(options: StyleTransition): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [heatmapIntensityTransition].\n   */\n  override fun heatmapIntensityTransition(block: StyleTransition.Builder.() -> Unit): HeatmapLayer = apply {\n    heatmapIntensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  val heatmapOpacity: Double?\n    /**\n     * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"heatmap-opacity\")\n    }\n\n  /**\n   * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapOpacity] to set the default property.\n   *\n   * @param heatmapOpacity value of heatmapOpacity\n   */\n  override fun heatmapOpacity(heatmapOpacity: Double): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-opacity\", heatmapOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"heatmap-opacity\".\n   *\n   */\n  val heatmapOpacityAsExpression: Expression?\n    /**\n     * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Get the HeatmapOpacity property as an Expression\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"heatmap-opacity\")\n\n  /**\n   * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapOpacityAsExpression] to set the default property.\n   *\n   * @param heatmapOpacity value of heatmapOpacity as Expression\n   */\n  override fun heatmapOpacity(heatmapOpacity: Expression): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-opacity\", heatmapOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for HeatmapOpacity.\n   */\n  val heatmapOpacityTransition: StyleTransition?\n    /**\n     * Get the HeatmapOpacity property transition options\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"heatmap-opacity-transition\")\n    }\n\n  /**\n   * Set the HeatmapOpacity property transition options\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun heatmapOpacityTransition(options: StyleTransition): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [heatmapOpacityTransition].\n   */\n  override fun heatmapOpacityTransition(block: StyleTransition.Builder.() -> Unit): HeatmapLayer = apply {\n    heatmapOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n   */\n  val heatmapRadius: Double?\n    /**\n     * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"heatmap-radius\")\n    }\n\n  /**\n   * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapRadius] to set the default property.\n   *\n   * @param heatmapRadius value of heatmapRadius\n   */\n  override fun heatmapRadius(heatmapRadius: Double): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-radius\", heatmapRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n   *\n   * This is an Expression representation of \"heatmap-radius\".\n   *\n   */\n  val heatmapRadiusAsExpression: Expression?\n    /**\n     * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n     *\n     * Get the HeatmapRadius property as an Expression\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"heatmap-radius\")\n\n  /**\n   * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapRadiusAsExpression] to set the default property.\n   *\n   * @param heatmapRadius value of heatmapRadius as Expression\n   */\n  override fun heatmapRadius(heatmapRadius: Expression): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-radius\", heatmapRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for HeatmapRadius.\n   */\n  val heatmapRadiusTransition: StyleTransition?\n    /**\n     * Get the HeatmapRadius property transition options\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapRadiusTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"heatmap-radius-transition\")\n    }\n\n  /**\n   * Set the HeatmapRadius property transition options\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapRadiusTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun heatmapRadiusTransition(options: StyleTransition): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-radius-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [heatmapRadiusTransition].\n   */\n  override fun heatmapRadiusTransition(block: StyleTransition.Builder.() -> Unit): HeatmapLayer = apply {\n    heatmapRadiusTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n   */\n  val heatmapWeight: Double?\n    /**\n     * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapWeight] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"heatmap-weight\")\n    }\n\n  /**\n   * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapWeight] to set the default property.\n   *\n   * @param heatmapWeight value of heatmapWeight\n   */\n  override fun heatmapWeight(heatmapWeight: Double): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-weight\", heatmapWeight)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n   *\n   * This is an Expression representation of \"heatmap-weight\".\n   *\n   */\n  val heatmapWeightAsExpression: Expression?\n    /**\n     * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n     *\n     * Get the HeatmapWeight property as an Expression\n     *\n     * Use static method [HeatmapLayer.defaultHeatmapWeightAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"heatmap-weight\")\n\n  /**\n   * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n   *\n   * Use static method [HeatmapLayer.defaultHeatmapWeightAsExpression] to set the default property.\n   *\n   * @param heatmapWeight value of heatmapWeight as Expression\n   */\n  override fun heatmapWeight(heatmapWeight: Expression): HeatmapLayer = apply {\n    val propertyValue = PropertyValue(\"heatmap-weight\", heatmapWeight)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"heatmap\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `[\"heatmap-density\"]` as input. Default value: [\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",0.1,\"royalblue\",0.3,\"cyan\",0.5,\"lime\",0.7,\"yellow\",1,\"red\"].\n     */\n    val defaultHeatmapColor: Expression?\n      /**\n       * Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `[\"heatmap-density\"]` as input. Default value: [\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",0.1,\"royalblue\",0.3,\"cyan\",0.5,\"lime\",0.7,\"yellow\",1,\"red\"].\n       *\n       * Get the default value of HeatmapColor property\n       *\n       * @return Expression\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-color\").silentUnwrap()\n      }\n\n    /**\n     * Default color theme for [heatmapColor].\n     */\n    @MapboxExperimental\n    val defaultHeatmapColorUseTheme: String?\n      /**\n       * Get default value of the HeatmapColor property as String\n       *\n       * @return Expression\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [heatmapColor].\n     */\n    @MapboxExperimental\n    val defaultHeatmapColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the HeatmapColor property as Expression\n       *\n       * @return Expression\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultHeatmapColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n     */\n    val defaultHeatmapIntensity: Double?\n      /**\n       * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n       *\n       * Get the default value of HeatmapIntensity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-intensity\").silentUnwrap()\n      }\n\n    /**\n     * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n     *\n     * This is an Expression representation of \"heatmap-intensity\".\n     *\n     */\n    val defaultHeatmapIntensityAsExpression: Expression?\n      /**\n       * Get default value of the HeatmapIntensity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-intensity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultHeatmapIntensity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for HeatmapIntensity.\n     */\n    val defaultHeatmapIntensityTransition: StyleTransition?\n      /**\n       * Get the HeatmapIntensity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-intensity-transition\").silentUnwrap()\n\n    /**\n     * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n     */\n    val defaultHeatmapOpacity: Double?\n      /**\n       * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of HeatmapOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"heatmap-opacity\".\n     *\n     */\n    val defaultHeatmapOpacityAsExpression: Expression?\n      /**\n       * Get default value of the HeatmapOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultHeatmapOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for HeatmapOpacity.\n     */\n    val defaultHeatmapOpacityTransition: StyleTransition?\n      /**\n       * Get the HeatmapOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-opacity-transition\").silentUnwrap()\n\n    /**\n     * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n     */\n    val defaultHeatmapRadius: Double?\n      /**\n       * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n       *\n       * Get the default value of HeatmapRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-radius\").silentUnwrap()\n      }\n\n    /**\n     * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n     *\n     * This is an Expression representation of \"heatmap-radius\".\n     *\n     */\n    val defaultHeatmapRadiusAsExpression: Expression?\n      /**\n       * Get default value of the HeatmapRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultHeatmapRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for HeatmapRadius.\n     */\n    val defaultHeatmapRadiusTransition: StyleTransition?\n      /**\n       * Get the HeatmapRadius property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-radius-transition\").silentUnwrap()\n\n    /**\n     * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n     */\n    val defaultHeatmapWeight: Double?\n      /**\n       * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n       *\n       * Get the default value of HeatmapWeight property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-weight\").silentUnwrap()\n      }\n\n    /**\n     * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n     *\n     * This is an Expression representation of \"heatmap-weight\".\n     *\n     */\n    val defaultHeatmapWeightAsExpression: Expression?\n      /**\n       * Get default value of the HeatmapWeight property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-weight\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultHeatmapWeight?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface HeatmapLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): HeatmapLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): HeatmapLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): HeatmapLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): HeatmapLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): HeatmapLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): HeatmapLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): HeatmapLayer\n\n  // Property getters and setters\n\n  /**\n   * Defines the color of each pixel based on its density value in a heatmap. Should be an expression that uses `[\"heatmap-density\"]` as input. Default value: [\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",0.1,\"royalblue\",0.3,\"cyan\",0.5,\"lime\",0.7,\"yellow\",1,\"red\"].\n   *\n   * @param heatmapColor value of heatmapColor\n   */\n  fun heatmapColor(heatmapColor: Expression): HeatmapLayer\n\n  /**\n   * Set the heatmapColorUseTheme as String for [heatmapColor].\n   *\n   * @param heatmapColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun heatmapColorUseTheme(heatmapColorUseTheme: String): HeatmapLayer\n\n  /**\n   * Set the heatmapColorUseTheme as Expression for [heatmapColor].\n   *\n   * @param heatmapColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun heatmapColorUseTheme(heatmapColorUseTheme: Expression): HeatmapLayer\n\n  /**\n   * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n   *\n   * @param heatmapIntensity value of heatmapIntensity\n   */\n  fun heatmapIntensity(heatmapIntensity: Double = 1.0): HeatmapLayer\n\n  /**\n   * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n   *\n   * @param heatmapIntensity value of heatmapIntensity as Expression\n   */\n  fun heatmapIntensity(heatmapIntensity: Expression): HeatmapLayer\n\n  /**\n   * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n   *\n   * Set the HeatmapIntensity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun heatmapIntensityTransition(options: StyleTransition): HeatmapLayer\n\n  /**\n   * Similar to `heatmap-weight` but controls the intensity of the heatmap globally. Primarily used for adjusting the heatmap based on zoom level. Default value: 1. Minimum value: 0.\n   *\n   * DSL for [heatmapIntensityTransition].\n   */\n  fun heatmapIntensityTransition(block: StyleTransition.Builder.() -> Unit): HeatmapLayer\n\n  /**\n   * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param heatmapOpacity value of heatmapOpacity\n   */\n  fun heatmapOpacity(heatmapOpacity: Double = 1.0): HeatmapLayer\n\n  /**\n   * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param heatmapOpacity value of heatmapOpacity as Expression\n   */\n  fun heatmapOpacity(heatmapOpacity: Expression): HeatmapLayer\n\n  /**\n   * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Set the HeatmapOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun heatmapOpacityTransition(options: StyleTransition): HeatmapLayer\n\n  /**\n   * The global opacity at which the heatmap layer will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [heatmapOpacityTransition].\n   */\n  fun heatmapOpacityTransition(block: StyleTransition.Builder.() -> Unit): HeatmapLayer\n\n  /**\n   * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n   *\n   * @param heatmapRadius value of heatmapRadius\n   */\n  fun heatmapRadius(heatmapRadius: Double = 30.0): HeatmapLayer\n\n  /**\n   * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n   *\n   * @param heatmapRadius value of heatmapRadius as Expression\n   */\n  fun heatmapRadius(heatmapRadius: Expression): HeatmapLayer\n\n  /**\n   * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n   *\n   * Set the HeatmapRadius property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun heatmapRadiusTransition(options: StyleTransition): HeatmapLayer\n\n  /**\n   * Radius of influence of one heatmap point in pixels. Increasing the value makes the heatmap smoother, but less detailed. `queryRenderedFeatures` on heatmap layers will return points within this radius. Default value: 30. Minimum value: 1. The unit of heatmapRadius is in pixels.\n   *\n   * DSL for [heatmapRadiusTransition].\n   */\n  fun heatmapRadiusTransition(block: StyleTransition.Builder.() -> Unit): HeatmapLayer\n\n  /**\n   * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n   *\n   * @param heatmapWeight value of heatmapWeight\n   */\n  fun heatmapWeight(heatmapWeight: Double = 1.0): HeatmapLayer\n\n  /**\n   * A measure of how much an individual point contributes to the heatmap. A value of 10 would be equivalent to having 10 points of weight 1 in the same spot. Especially useful when combined with clustering. Default value: 1. Minimum value: 0.\n   *\n   * @param heatmapWeight value of heatmapWeight as Expression\n   */\n  fun heatmapWeight(heatmapWeight: Expression): HeatmapLayer\n}\n\n/**\n * DSL function for creating a [HeatmapLayer].\n */\nfun heatmapLayer(layerId: String, sourceId: String, block: HeatmapLayerDsl.() -> Unit): HeatmapLayer = HeatmapLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/HillshadeLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * Client-side hillshading visualization based on DEM data. Currently, the implementation only supports Mapbox Terrain RGB and Mapzen Terrarium tiles.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#hillshade)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass HillshadeLayer(override val layerId: String, val sourceId: String) : HillshadeLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): HillshadeLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): HillshadeLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [HillshadeLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [HillshadeLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [HillshadeLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[HillshadeLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [HillshadeLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [HillshadeLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): HillshadeLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [HillshadeLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [HillshadeLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): HillshadeLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   */\n  val hillshadeAccentColor: String?\n    /**\n     * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeAccentColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      hillshadeAccentColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeAccentColor] to set the default property.\n   *\n   * @param hillshadeAccentColor value of hillshadeAccentColor\n   */\n  override fun hillshadeAccentColor(hillshadeAccentColor: String): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-accent-color\", hillshadeAccentColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"hillshade-accent-color\".\n   *\n   */\n  val hillshadeAccentColorAsExpression: Expression?\n    /**\n     * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n     *\n     * Get the HillshadeAccentColor property as an Expression\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeAccentColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"hillshade-accent-color\")\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeAccentColorAsExpression] to set the default property.\n   *\n   * @param hillshadeAccentColor value of hillshadeAccentColor as Expression\n   */\n  override fun hillshadeAccentColor(hillshadeAccentColor: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-accent-color\", hillshadeAccentColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   */\n  val hillshadeAccentColorAsColorInt: Int?\n    /**\n     * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeAccentColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      hillshadeAccentColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeAccentColorAsColorInt] to set the default property.\n   *\n   * @param hillshadeAccentColor value of hillshadeAccentColor\n   */\n  override fun hillshadeAccentColor(@ColorInt hillshadeAccentColor: Int): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-accent-color\", colorIntToRgbaExpression(hillshadeAccentColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for HillshadeAccentColor.\n   */\n  val hillshadeAccentColorTransition: StyleTransition?\n    /**\n     * Get the HillshadeAccentColor property transition options\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeAccentColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"hillshade-accent-color-transition\")\n    }\n\n  /**\n   * Set the HillshadeAccentColor property transition options\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeAccentColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun hillshadeAccentColorTransition(options: StyleTransition): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-accent-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [hillshadeAccentColorTransition].\n   */\n  override fun hillshadeAccentColorTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer = apply {\n    hillshadeAccentColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [hillshadeAccentColor].\n   */\n  @MapboxExperimental\n  val hillshadeAccentColorUseTheme: String?\n    /**\n     * Get the HillshadeAccentColorUseTheme property\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeAccentColorUseTheme] to get the default property.\n     *\n     * @return current HillshadeAccentColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"hillshade-accent-color-use-theme\")\n    }\n\n  /**\n   * Set the HillshadeAccentColorUseTheme as String\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeAccentColorUseTheme] to get the default property.\n   *\n   * @param hillshadeAccentColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun hillshadeAccentColorUseTheme(hillshadeAccentColorUseTheme: String): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-accent-color-use-theme\", hillshadeAccentColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [hillshadeAccentColor].\n   */\n  @MapboxExperimental\n  val hillshadeAccentColorUseThemeAsExpression: Expression?\n    /**\n     * Get the HillshadeAccentColorUseTheme property\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeAccentColorUseTheme] to get the default property.\n     *\n     * @return current HillshadeAccentColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"hillshade-accent-color-use-theme\")\n\n  /**\n   * Set the HillshadeAccentColorUseTheme as Expression\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeAccentColorUseTheme] to get the default property.\n   *\n   * @param hillshadeAccentColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun hillshadeAccentColorUseTheme(hillshadeAccentColorUseTheme: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-accent-color-use-theme\", hillshadeAccentColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n   */\n  val hillshadeEmissiveStrength: Double?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"hillshade-emissive-strength\")\n    }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeEmissiveStrength] to set the default property.\n   *\n   * @param hillshadeEmissiveStrength value of hillshadeEmissiveStrength\n   */\n  override fun hillshadeEmissiveStrength(hillshadeEmissiveStrength: Double): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-emissive-strength\", hillshadeEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n   *\n   * This is an Expression representation of \"hillshade-emissive-strength\".\n   *\n   */\n  val hillshadeEmissiveStrengthAsExpression: Expression?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n     *\n     * Get the HillshadeEmissiveStrength property as an Expression\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"hillshade-emissive-strength\")\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param hillshadeEmissiveStrength value of hillshadeEmissiveStrength as Expression\n   */\n  override fun hillshadeEmissiveStrength(hillshadeEmissiveStrength: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-emissive-strength\", hillshadeEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for HillshadeEmissiveStrength.\n   */\n  val hillshadeEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the HillshadeEmissiveStrength property transition options\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"hillshade-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the HillshadeEmissiveStrength property transition options\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun hillshadeEmissiveStrengthTransition(options: StyleTransition): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [hillshadeEmissiveStrengthTransition].\n   */\n  override fun hillshadeEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer = apply {\n    hillshadeEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n   */\n  val hillshadeExaggeration: Double?\n    /**\n     * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeExaggeration] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"hillshade-exaggeration\")\n    }\n\n  /**\n   * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeExaggeration] to set the default property.\n   *\n   * @param hillshadeExaggeration value of hillshadeExaggeration\n   */\n  override fun hillshadeExaggeration(hillshadeExaggeration: Double): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-exaggeration\", hillshadeExaggeration)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"hillshade-exaggeration\".\n   *\n   */\n  val hillshadeExaggerationAsExpression: Expression?\n    /**\n     * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n     *\n     * Get the HillshadeExaggeration property as an Expression\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeExaggerationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"hillshade-exaggeration\")\n\n  /**\n   * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeExaggerationAsExpression] to set the default property.\n   *\n   * @param hillshadeExaggeration value of hillshadeExaggeration as Expression\n   */\n  override fun hillshadeExaggeration(hillshadeExaggeration: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-exaggeration\", hillshadeExaggeration)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for HillshadeExaggeration.\n   */\n  val hillshadeExaggerationTransition: StyleTransition?\n    /**\n     * Get the HillshadeExaggeration property transition options\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeExaggerationTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"hillshade-exaggeration-transition\")\n    }\n\n  /**\n   * Set the HillshadeExaggeration property transition options\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeExaggerationTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun hillshadeExaggerationTransition(options: StyleTransition): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-exaggeration-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [hillshadeExaggerationTransition].\n   */\n  override fun hillshadeExaggerationTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer = apply {\n    hillshadeExaggerationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   */\n  val hillshadeHighlightColor: String?\n    /**\n     * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeHighlightColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      hillshadeHighlightColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeHighlightColor] to set the default property.\n   *\n   * @param hillshadeHighlightColor value of hillshadeHighlightColor\n   */\n  override fun hillshadeHighlightColor(hillshadeHighlightColor: String): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-highlight-color\", hillshadeHighlightColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   *\n   * This is an Expression representation of \"hillshade-highlight-color\".\n   *\n   */\n  val hillshadeHighlightColorAsExpression: Expression?\n    /**\n     * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n     *\n     * Get the HillshadeHighlightColor property as an Expression\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeHighlightColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"hillshade-highlight-color\")\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeHighlightColorAsExpression] to set the default property.\n   *\n   * @param hillshadeHighlightColor value of hillshadeHighlightColor as Expression\n   */\n  override fun hillshadeHighlightColor(hillshadeHighlightColor: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-highlight-color\", hillshadeHighlightColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   */\n  val hillshadeHighlightColorAsColorInt: Int?\n    /**\n     * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeHighlightColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      hillshadeHighlightColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeHighlightColorAsColorInt] to set the default property.\n   *\n   * @param hillshadeHighlightColor value of hillshadeHighlightColor\n   */\n  override fun hillshadeHighlightColor(@ColorInt hillshadeHighlightColor: Int): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-highlight-color\", colorIntToRgbaExpression(hillshadeHighlightColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for HillshadeHighlightColor.\n   */\n  val hillshadeHighlightColorTransition: StyleTransition?\n    /**\n     * Get the HillshadeHighlightColor property transition options\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeHighlightColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"hillshade-highlight-color-transition\")\n    }\n\n  /**\n   * Set the HillshadeHighlightColor property transition options\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeHighlightColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun hillshadeHighlightColorTransition(options: StyleTransition): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-highlight-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [hillshadeHighlightColorTransition].\n   */\n  override fun hillshadeHighlightColorTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer = apply {\n    hillshadeHighlightColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [hillshadeHighlightColor].\n   */\n  @MapboxExperimental\n  val hillshadeHighlightColorUseTheme: String?\n    /**\n     * Get the HillshadeHighlightColorUseTheme property\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeHighlightColorUseTheme] to get the default property.\n     *\n     * @return current HillshadeHighlightColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"hillshade-highlight-color-use-theme\")\n    }\n\n  /**\n   * Set the HillshadeHighlightColorUseTheme as String\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeHighlightColorUseTheme] to get the default property.\n   *\n   * @param hillshadeHighlightColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun hillshadeHighlightColorUseTheme(hillshadeHighlightColorUseTheme: String): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-highlight-color-use-theme\", hillshadeHighlightColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [hillshadeHighlightColor].\n   */\n  @MapboxExperimental\n  val hillshadeHighlightColorUseThemeAsExpression: Expression?\n    /**\n     * Get the HillshadeHighlightColorUseTheme property\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeHighlightColorUseTheme] to get the default property.\n     *\n     * @return current HillshadeHighlightColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"hillshade-highlight-color-use-theme\")\n\n  /**\n   * Set the HillshadeHighlightColorUseTheme as Expression\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeHighlightColorUseTheme] to get the default property.\n   *\n   * @param hillshadeHighlightColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun hillshadeHighlightColorUseTheme(hillshadeHighlightColorUseTheme: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-highlight-color-use-theme\", hillshadeHighlightColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Direction of light source when map is rotated. Default value: \"viewport\".\n   */\n  val hillshadeIlluminationAnchor: HillshadeIlluminationAnchor?\n    /**\n     * Direction of light source when map is rotated. Default value: \"viewport\".\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeIlluminationAnchor] to get the default property.\n     *\n     * @return HillshadeIlluminationAnchor\n     */\n    get() {\n      getPropertyValue<String?>(\"hillshade-illumination-anchor\")?.let {\n        return HillshadeIlluminationAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Direction of light source when map is rotated. Default value: \"viewport\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeIlluminationAnchor] to set the default property.\n   *\n   * @param hillshadeIlluminationAnchor value of hillshadeIlluminationAnchor\n   */\n  override fun hillshadeIlluminationAnchor(hillshadeIlluminationAnchor: HillshadeIlluminationAnchor): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-illumination-anchor\", hillshadeIlluminationAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Direction of light source when map is rotated. Default value: \"viewport\".\n   *\n   * This is an Expression representation of \"hillshade-illumination-anchor\".\n   *\n   */\n  val hillshadeIlluminationAnchorAsExpression: Expression?\n    /**\n     * Direction of light source when map is rotated. Default value: \"viewport\".\n     *\n     * Get the HillshadeIlluminationAnchor property as an Expression\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeIlluminationAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"hillshade-illumination-anchor\")\n        ?: hillshadeIlluminationAnchor?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Direction of light source when map is rotated. Default value: \"viewport\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeIlluminationAnchorAsExpression] to set the default property.\n   *\n   * @param hillshadeIlluminationAnchor value of hillshadeIlluminationAnchor as Expression\n   */\n  override fun hillshadeIlluminationAnchor(hillshadeIlluminationAnchor: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-illumination-anchor\", hillshadeIlluminationAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n   */\n  val hillshadeIlluminationDirection: Double?\n    /**\n     * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeIlluminationDirection] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"hillshade-illumination-direction\")\n    }\n\n  /**\n   * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeIlluminationDirection] to set the default property.\n   *\n   * @param hillshadeIlluminationDirection value of hillshadeIlluminationDirection\n   */\n  override fun hillshadeIlluminationDirection(hillshadeIlluminationDirection: Double): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-illumination-direction\", hillshadeIlluminationDirection)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n   *\n   * This is an Expression representation of \"hillshade-illumination-direction\".\n   *\n   */\n  val hillshadeIlluminationDirectionAsExpression: Expression?\n    /**\n     * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n     *\n     * Get the HillshadeIlluminationDirection property as an Expression\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeIlluminationDirectionAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"hillshade-illumination-direction\")\n\n  /**\n   * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeIlluminationDirectionAsExpression] to set the default property.\n   *\n   * @param hillshadeIlluminationDirection value of hillshadeIlluminationDirection as Expression\n   */\n  override fun hillshadeIlluminationDirection(hillshadeIlluminationDirection: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-illumination-direction\", hillshadeIlluminationDirection)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   */\n  val hillshadeShadowColor: String?\n    /**\n     * The shading color of areas that face away from the light source. Default value: \"#000000\".\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeShadowColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      hillshadeShadowColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeShadowColor] to set the default property.\n   *\n   * @param hillshadeShadowColor value of hillshadeShadowColor\n   */\n  override fun hillshadeShadowColor(hillshadeShadowColor: String): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-shadow-color\", hillshadeShadowColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"hillshade-shadow-color\".\n   *\n   */\n  val hillshadeShadowColorAsExpression: Expression?\n    /**\n     * The shading color of areas that face away from the light source. Default value: \"#000000\".\n     *\n     * Get the HillshadeShadowColor property as an Expression\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeShadowColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"hillshade-shadow-color\")\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeShadowColorAsExpression] to set the default property.\n   *\n   * @param hillshadeShadowColor value of hillshadeShadowColor as Expression\n   */\n  override fun hillshadeShadowColor(hillshadeShadowColor: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-shadow-color\", hillshadeShadowColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   */\n  val hillshadeShadowColorAsColorInt: Int?\n    /**\n     * The shading color of areas that face away from the light source. Default value: \"#000000\".\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeShadowColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      hillshadeShadowColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeShadowColorAsColorInt] to set the default property.\n   *\n   * @param hillshadeShadowColor value of hillshadeShadowColor\n   */\n  override fun hillshadeShadowColor(@ColorInt hillshadeShadowColor: Int): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-shadow-color\", colorIntToRgbaExpression(hillshadeShadowColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for HillshadeShadowColor.\n   */\n  val hillshadeShadowColorTransition: StyleTransition?\n    /**\n     * Get the HillshadeShadowColor property transition options\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeShadowColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"hillshade-shadow-color-transition\")\n    }\n\n  /**\n   * Set the HillshadeShadowColor property transition options\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeShadowColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun hillshadeShadowColorTransition(options: StyleTransition): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-shadow-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [hillshadeShadowColorTransition].\n   */\n  override fun hillshadeShadowColorTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer = apply {\n    hillshadeShadowColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [hillshadeShadowColor].\n   */\n  @MapboxExperimental\n  val hillshadeShadowColorUseTheme: String?\n    /**\n     * Get the HillshadeShadowColorUseTheme property\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeShadowColorUseTheme] to get the default property.\n     *\n     * @return current HillshadeShadowColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"hillshade-shadow-color-use-theme\")\n    }\n\n  /**\n   * Set the HillshadeShadowColorUseTheme as String\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeShadowColorUseTheme] to get the default property.\n   *\n   * @param hillshadeShadowColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun hillshadeShadowColorUseTheme(hillshadeShadowColorUseTheme: String): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-shadow-color-use-theme\", hillshadeShadowColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [hillshadeShadowColor].\n   */\n  @MapboxExperimental\n  val hillshadeShadowColorUseThemeAsExpression: Expression?\n    /**\n     * Get the HillshadeShadowColorUseTheme property\n     *\n     * Use static method [HillshadeLayer.defaultHillshadeShadowColorUseTheme] to get the default property.\n     *\n     * @return current HillshadeShadowColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"hillshade-shadow-color-use-theme\")\n\n  /**\n   * Set the HillshadeShadowColorUseTheme as Expression\n   *\n   * Use static method [HillshadeLayer.defaultHillshadeShadowColorUseTheme] to get the default property.\n   *\n   * @param hillshadeShadowColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun hillshadeShadowColorUseTheme(hillshadeShadowColorUseTheme: Expression): HillshadeLayer = apply {\n    val propertyValue = PropertyValue(\"hillshade-shadow-color-use-theme\", hillshadeShadowColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"hillshade\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n     */\n    val defaultHillshadeAccentColor: String?\n      /**\n       * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n       *\n       * Get the default value of HillshadeAccentColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultHillshadeAccentColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"hillshade-accent-color\".\n     *\n     */\n    val defaultHillshadeAccentColorAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeAccentColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n     */\n    val defaultHillshadeAccentColorAsColorInt: Int?\n      /**\n       * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n       *\n       * Get the default value of HillshadeAccentColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultHillshadeAccentColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for HillshadeAccentColor.\n     */\n    val defaultHillshadeAccentColorTransition: StyleTransition?\n      /**\n       * Get the HillshadeAccentColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [hillshadeAccentColor].\n     */\n    @MapboxExperimental\n    val defaultHillshadeAccentColorUseTheme: String?\n      /**\n       * Get default value of the HillshadeAccentColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [hillshadeAccentColor].\n     */\n    @MapboxExperimental\n    val defaultHillshadeAccentColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeAccentColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultHillshadeAccentColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n     */\n    val defaultHillshadeEmissiveStrength: Double?\n      /**\n       * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n       *\n       * Get the default value of HillshadeEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n     *\n     * This is an Expression representation of \"hillshade-emissive-strength\".\n     *\n     */\n    val defaultHillshadeEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultHillshadeEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for HillshadeEmissiveStrength.\n     */\n    val defaultHillshadeEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the HillshadeEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n     */\n    val defaultHillshadeExaggeration: Double?\n      /**\n       * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n       *\n       * Get the default value of HillshadeExaggeration property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-exaggeration\").silentUnwrap()\n      }\n\n    /**\n     * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"hillshade-exaggeration\".\n     *\n     */\n    val defaultHillshadeExaggerationAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeExaggeration property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-exaggeration\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultHillshadeExaggeration?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for HillshadeExaggeration.\n     */\n    val defaultHillshadeExaggerationTransition: StyleTransition?\n      /**\n       * Get the HillshadeExaggeration property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-exaggeration-transition\").silentUnwrap()\n\n    /**\n     * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n     */\n    val defaultHillshadeHighlightColor: String?\n      /**\n       * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n       *\n       * Get the default value of HillshadeHighlightColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultHillshadeHighlightColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n     *\n     * This is an Expression representation of \"hillshade-highlight-color\".\n     *\n     */\n    val defaultHillshadeHighlightColorAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeHighlightColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n     */\n    val defaultHillshadeHighlightColorAsColorInt: Int?\n      /**\n       * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n       *\n       * Get the default value of HillshadeHighlightColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultHillshadeHighlightColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for HillshadeHighlightColor.\n     */\n    val defaultHillshadeHighlightColorTransition: StyleTransition?\n      /**\n       * Get the HillshadeHighlightColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [hillshadeHighlightColor].\n     */\n    @MapboxExperimental\n    val defaultHillshadeHighlightColorUseTheme: String?\n      /**\n       * Get default value of the HillshadeHighlightColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [hillshadeHighlightColor].\n     */\n    @MapboxExperimental\n    val defaultHillshadeHighlightColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeHighlightColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultHillshadeHighlightColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Direction of light source when map is rotated. Default value: \"viewport\".\n     */\n    val defaultHillshadeIlluminationAnchor: HillshadeIlluminationAnchor?\n      /**\n       * Direction of light source when map is rotated. Default value: \"viewport\".\n       *\n       * Get the default value of HillshadeIlluminationAnchor property\n       *\n       * @return HillshadeIlluminationAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-anchor\").silentUnwrap<String>()?.let {\n          return HillshadeIlluminationAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Direction of light source when map is rotated. Default value: \"viewport\".\n     *\n     * This is an Expression representation of \"hillshade-illumination-anchor\".\n     *\n     */\n    val defaultHillshadeIlluminationAnchorAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeIlluminationAnchor property as an Expression\n       *\n       * @return HillshadeIlluminationAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultHillshadeIlluminationAnchor?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n     */\n    val defaultHillshadeIlluminationDirection: Double?\n      /**\n       * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n       *\n       * Get the default value of HillshadeIlluminationDirection property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-direction\").silentUnwrap()\n      }\n\n    /**\n     * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n     *\n     * This is an Expression representation of \"hillshade-illumination-direction\".\n     *\n     */\n    val defaultHillshadeIlluminationDirectionAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeIlluminationDirection property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-direction\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultHillshadeIlluminationDirection?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The shading color of areas that face away from the light source. Default value: \"#000000\".\n     */\n    val defaultHillshadeShadowColor: String?\n      /**\n       * The shading color of areas that face away from the light source. Default value: \"#000000\".\n       *\n       * Get the default value of HillshadeShadowColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultHillshadeShadowColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The shading color of areas that face away from the light source. Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"hillshade-shadow-color\".\n     *\n     */\n    val defaultHillshadeShadowColorAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeShadowColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The shading color of areas that face away from the light source. Default value: \"#000000\".\n     */\n    val defaultHillshadeShadowColorAsColorInt: Int?\n      /**\n       * The shading color of areas that face away from the light source. Default value: \"#000000\".\n       *\n       * Get the default value of HillshadeShadowColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultHillshadeShadowColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for HillshadeShadowColor.\n     */\n    val defaultHillshadeShadowColorTransition: StyleTransition?\n      /**\n       * Get the HillshadeShadowColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [hillshadeShadowColor].\n     */\n    @MapboxExperimental\n    val defaultHillshadeShadowColorUseTheme: String?\n      /**\n       * Get default value of the HillshadeShadowColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [hillshadeShadowColor].\n     */\n    @MapboxExperimental\n    val defaultHillshadeShadowColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the HillshadeShadowColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultHillshadeShadowColorUseTheme?.let { Expression.literal(it) }\n      }\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface HillshadeLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): HillshadeLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): HillshadeLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): HillshadeLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): HillshadeLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): HillshadeLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): HillshadeLayer\n\n  // Property getters and setters\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   *\n   * @param hillshadeAccentColor value of hillshadeAccentColor\n   */\n  fun hillshadeAccentColor(hillshadeAccentColor: String = \"#000000\"): HillshadeLayer\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   *\n   * @param hillshadeAccentColor value of hillshadeAccentColor as Expression\n   */\n  fun hillshadeAccentColor(hillshadeAccentColor: Expression): HillshadeLayer\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   *\n   * @param hillshadeAccentColor value of hillshadeAccentColor\n   */\n  fun hillshadeAccentColor(@ColorInt hillshadeAccentColor: Int): HillshadeLayer\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   *\n   * Set the HillshadeAccentColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun hillshadeAccentColorTransition(options: StyleTransition): HillshadeLayer\n\n  /**\n   * The shading color used to accentuate rugged terrain like sharp cliffs and gorges. Default value: \"#000000\".\n   *\n   * DSL for [hillshadeAccentColorTransition].\n   */\n  fun hillshadeAccentColorTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer\n\n  /**\n   * Set the hillshadeAccentColorUseTheme as String for [hillshadeAccentColor].\n   *\n   * @param hillshadeAccentColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun hillshadeAccentColorUseTheme(hillshadeAccentColorUseTheme: String): HillshadeLayer\n\n  /**\n   * Set the hillshadeAccentColorUseTheme as Expression for [hillshadeAccentColor].\n   *\n   * @param hillshadeAccentColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun hillshadeAccentColorUseTheme(hillshadeAccentColorUseTheme: Expression): HillshadeLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n   *\n   * @param hillshadeEmissiveStrength value of hillshadeEmissiveStrength\n   */\n  fun hillshadeEmissiveStrength(hillshadeEmissiveStrength: Double = 0.0): HillshadeLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n   *\n   * @param hillshadeEmissiveStrength value of hillshadeEmissiveStrength as Expression\n   */\n  fun hillshadeEmissiveStrength(hillshadeEmissiveStrength: Expression): HillshadeLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n   *\n   * Set the HillshadeEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun hillshadeEmissiveStrengthTransition(options: StyleTransition): HillshadeLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of hillshadeEmissiveStrength is in intensity.\n   *\n   * DSL for [hillshadeEmissiveStrengthTransition].\n   */\n  fun hillshadeEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer\n\n  /**\n   * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n   *\n   * @param hillshadeExaggeration value of hillshadeExaggeration\n   */\n  fun hillshadeExaggeration(hillshadeExaggeration: Double = 0.5): HillshadeLayer\n\n  /**\n   * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n   *\n   * @param hillshadeExaggeration value of hillshadeExaggeration as Expression\n   */\n  fun hillshadeExaggeration(hillshadeExaggeration: Expression): HillshadeLayer\n\n  /**\n   * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n   *\n   * Set the HillshadeExaggeration property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun hillshadeExaggerationTransition(options: StyleTransition): HillshadeLayer\n\n  /**\n   * Intensity of the hillshade Default value: 0.5. Value range: [0, 1]\n   *\n   * DSL for [hillshadeExaggerationTransition].\n   */\n  fun hillshadeExaggerationTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   *\n   * @param hillshadeHighlightColor value of hillshadeHighlightColor\n   */\n  fun hillshadeHighlightColor(hillshadeHighlightColor: String = \"#FFFFFF\"): HillshadeLayer\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   *\n   * @param hillshadeHighlightColor value of hillshadeHighlightColor as Expression\n   */\n  fun hillshadeHighlightColor(hillshadeHighlightColor: Expression): HillshadeLayer\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   *\n   * @param hillshadeHighlightColor value of hillshadeHighlightColor\n   */\n  fun hillshadeHighlightColor(@ColorInt hillshadeHighlightColor: Int): HillshadeLayer\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   *\n   * Set the HillshadeHighlightColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun hillshadeHighlightColorTransition(options: StyleTransition): HillshadeLayer\n\n  /**\n   * The shading color of areas that faces towards the light source. Default value: \"#FFFFFF\".\n   *\n   * DSL for [hillshadeHighlightColorTransition].\n   */\n  fun hillshadeHighlightColorTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer\n\n  /**\n   * Set the hillshadeHighlightColorUseTheme as String for [hillshadeHighlightColor].\n   *\n   * @param hillshadeHighlightColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun hillshadeHighlightColorUseTheme(hillshadeHighlightColorUseTheme: String): HillshadeLayer\n\n  /**\n   * Set the hillshadeHighlightColorUseTheme as Expression for [hillshadeHighlightColor].\n   *\n   * @param hillshadeHighlightColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun hillshadeHighlightColorUseTheme(hillshadeHighlightColorUseTheme: Expression): HillshadeLayer\n\n  /**\n   * Direction of light source when map is rotated. Default value: \"viewport\".\n   *\n   * @param hillshadeIlluminationAnchor value of hillshadeIlluminationAnchor\n   */\n  fun hillshadeIlluminationAnchor(hillshadeIlluminationAnchor: HillshadeIlluminationAnchor = HillshadeIlluminationAnchor.VIEWPORT): HillshadeLayer\n\n  /**\n   * Direction of light source when map is rotated. Default value: \"viewport\".\n   *\n   * @param hillshadeIlluminationAnchor value of hillshadeIlluminationAnchor as Expression\n   */\n  fun hillshadeIlluminationAnchor(hillshadeIlluminationAnchor: Expression): HillshadeLayer\n\n  /**\n   * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n   *\n   * @param hillshadeIlluminationDirection value of hillshadeIlluminationDirection\n   */\n  fun hillshadeIlluminationDirection(hillshadeIlluminationDirection: Double = 335.0): HillshadeLayer\n\n  /**\n   * The direction of the light source used to generate the hillshading with 0 as the top of the viewport if `hillshade-illumination-anchor` is set to `viewport` and due north if `hillshade-illumination-anchor` is set to `map` and no 3d lights enabled. If `hillshade-illumination-anchor` is set to `map` and 3d lights enabled, the direction from 3d lights is used instead. Default value: 335. Value range: [0, 359]\n   *\n   * @param hillshadeIlluminationDirection value of hillshadeIlluminationDirection as Expression\n   */\n  fun hillshadeIlluminationDirection(hillshadeIlluminationDirection: Expression): HillshadeLayer\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   *\n   * @param hillshadeShadowColor value of hillshadeShadowColor\n   */\n  fun hillshadeShadowColor(hillshadeShadowColor: String = \"#000000\"): HillshadeLayer\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   *\n   * @param hillshadeShadowColor value of hillshadeShadowColor as Expression\n   */\n  fun hillshadeShadowColor(hillshadeShadowColor: Expression): HillshadeLayer\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   *\n   * @param hillshadeShadowColor value of hillshadeShadowColor\n   */\n  fun hillshadeShadowColor(@ColorInt hillshadeShadowColor: Int): HillshadeLayer\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   *\n   * Set the HillshadeShadowColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun hillshadeShadowColorTransition(options: StyleTransition): HillshadeLayer\n\n  /**\n   * The shading color of areas that face away from the light source. Default value: \"#000000\".\n   *\n   * DSL for [hillshadeShadowColorTransition].\n   */\n  fun hillshadeShadowColorTransition(block: StyleTransition.Builder.() -> Unit): HillshadeLayer\n\n  /**\n   * Set the hillshadeShadowColorUseTheme as String for [hillshadeShadowColor].\n   *\n   * @param hillshadeShadowColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun hillshadeShadowColorUseTheme(hillshadeShadowColorUseTheme: String): HillshadeLayer\n\n  /**\n   * Set the hillshadeShadowColorUseTheme as Expression for [hillshadeShadowColor].\n   *\n   * @param hillshadeShadowColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun hillshadeShadowColorUseTheme(hillshadeShadowColorUseTheme: Expression): HillshadeLayer\n}\n\n/**\n * DSL function for creating a [HillshadeLayer].\n */\nfun hillshadeLayer(layerId: String, sourceId: String, block: HillshadeLayerDsl.() -> Unit): HillshadeLayer = HillshadeLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/LineLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A stroked line.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#line)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass LineLayer(override val layerId: String, val sourceId: String) : LineLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): LineLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): LineLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [LineLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [LineLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [LineLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): LineLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[LineLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [LineLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [LineLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): LineLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [LineLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [LineLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): LineLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * The display of line endings. Default value: \"butt\".\n   */\n  val lineCap: LineCap?\n    /**\n     * The display of line endings. Default value: \"butt\".\n     *\n     * Use static method [LineLayer.defaultLineCap] to get the default property.\n     *\n     * @return LineCap\n     */\n    get() {\n      getPropertyValue<String?>(\"line-cap\")?.let {\n        return LineCap.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * The display of line endings. Default value: \"butt\".\n   *\n   * Use static method [LineLayer.defaultLineCap] to set the default property.\n   *\n   * @param lineCap value of lineCap\n   */\n  override fun lineCap(lineCap: LineCap): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cap\", lineCap)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The display of line endings. Default value: \"butt\".\n   *\n   * This is an Expression representation of \"line-cap\".\n   *\n   */\n  val lineCapAsExpression: Expression?\n    /**\n     * The display of line endings. Default value: \"butt\".\n     *\n     * Get the LineCap property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineCapAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"line-cap\")\n        ?: lineCap?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * The display of line endings. Default value: \"butt\".\n   *\n   * Use static method [LineLayer.defaultLineCapAsExpression] to set the default property.\n   *\n   * @param lineCap value of lineCap as Expression\n   */\n  override fun lineCap(lineCap: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cap\", lineCap)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n   */\n  @MapboxExperimental\n  val lineCrossSlope: Double?\n    /**\n     * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n     *\n     * Use static method [LineLayer.defaultLineCrossSlope] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-cross-slope\")\n    }\n\n  /**\n   * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n   *\n   * Use static method [LineLayer.defaultLineCrossSlope] to set the default property.\n   *\n   * @param lineCrossSlope value of lineCrossSlope\n   */\n  @MapboxExperimental\n  override fun lineCrossSlope(lineCrossSlope: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cross-slope\", lineCrossSlope)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n   *\n   * This is an Expression representation of \"line-cross-slope\".\n   *\n   */\n  @MapboxExperimental\n  val lineCrossSlopeAsExpression: Expression?\n    /**\n     * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n     *\n     * Get the LineCrossSlope property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineCrossSlopeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-cross-slope\")\n\n  /**\n   * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n   *\n   * Use static method [LineLayer.defaultLineCrossSlopeAsExpression] to set the default property.\n   *\n   * @param lineCrossSlope value of lineCrossSlope as Expression\n   */\n  @MapboxExperimental\n  override fun lineCrossSlope(lineCrossSlope: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cross-slope\", lineCrossSlope)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   */\n  val lineElevationGroundScale: Double?\n    /**\n     * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [LineLayer.defaultLineElevationGroundScale] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-elevation-ground-scale\")\n    }\n\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineElevationGroundScale] to set the default property.\n   *\n   * @param lineElevationGroundScale value of lineElevationGroundScale\n   */\n  override fun lineElevationGroundScale(lineElevationGroundScale: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-elevation-ground-scale\", lineElevationGroundScale)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"line-elevation-ground-scale\".\n   *\n   */\n  val lineElevationGroundScaleAsExpression: Expression?\n    /**\n     * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n     *\n     * Get the LineElevationGroundScale property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineElevationGroundScaleAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-elevation-ground-scale\")\n\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineElevationGroundScaleAsExpression] to set the default property.\n   *\n   * @param lineElevationGroundScale value of lineElevationGroundScale as Expression\n   */\n  override fun lineElevationGroundScale(lineElevationGroundScale: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-elevation-ground-scale\", lineElevationGroundScale)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineElevationGroundScale.\n   */\n  val lineElevationGroundScaleTransition: StyleTransition?\n    /**\n     * Get the LineElevationGroundScale property transition options\n     *\n     * Use static method [LineLayer.defaultLineElevationGroundScaleTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-elevation-ground-scale-transition\")\n    }\n\n  /**\n   * Set the LineElevationGroundScale property transition options\n   *\n   * Use static method [LineLayer.defaultLineElevationGroundScaleTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineElevationGroundScaleTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-elevation-ground-scale-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineElevationGroundScaleTransition].\n   */\n  override fun lineElevationGroundScaleTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineElevationGroundScaleTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  val lineElevationReference: LineElevationReference?\n    /**\n     * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     *\n     * Use static method [LineLayer.defaultLineElevationReference] to get the default property.\n     *\n     * @return LineElevationReference\n     */\n    get() {\n      getPropertyValue<String?>(\"line-elevation-reference\")?.let {\n        return LineElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * Use static method [LineLayer.defaultLineElevationReference] to set the default property.\n   *\n   * @param lineElevationReference value of lineElevationReference\n   */\n  override fun lineElevationReference(lineElevationReference: LineElevationReference): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-elevation-reference\", lineElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * This is an Expression representation of \"line-elevation-reference\".\n   *\n   */\n  val lineElevationReferenceAsExpression: Expression?\n    /**\n     * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     *\n     * Get the LineElevationReference property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineElevationReferenceAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"line-elevation-reference\")\n        ?: lineElevationReference?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * Use static method [LineLayer.defaultLineElevationReferenceAsExpression] to set the default property.\n   *\n   * @param lineElevationReference value of lineElevationReference as Expression\n   */\n  override fun lineElevationReference(lineElevationReference: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-elevation-reference\", lineElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The display of lines when joining. Default value: \"miter\".\n   */\n  val lineJoin: LineJoin?\n    /**\n     * The display of lines when joining. Default value: \"miter\".\n     *\n     * Use static method [LineLayer.defaultLineJoin] to get the default property.\n     *\n     * @return LineJoin\n     */\n    get() {\n      getPropertyValue<String?>(\"line-join\")?.let {\n        return LineJoin.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * The display of lines when joining. Default value: \"miter\".\n   *\n   * Use static method [LineLayer.defaultLineJoin] to set the default property.\n   *\n   * @param lineJoin value of lineJoin\n   */\n  override fun lineJoin(lineJoin: LineJoin): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-join\", lineJoin)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The display of lines when joining. Default value: \"miter\".\n   *\n   * This is an Expression representation of \"line-join\".\n   *\n   */\n  val lineJoinAsExpression: Expression?\n    /**\n     * The display of lines when joining. Default value: \"miter\".\n     *\n     * Get the LineJoin property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineJoinAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"line-join\")\n        ?: lineJoin?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * The display of lines when joining. Default value: \"miter\".\n   *\n   * Use static method [LineLayer.defaultLineJoinAsExpression] to set the default property.\n   *\n   * @param lineJoin value of lineJoin as Expression\n   */\n  override fun lineJoin(lineJoin: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-join\", lineJoin)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n   */\n  val lineMiterLimit: Double?\n    /**\n     * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n     *\n     * Use static method [LineLayer.defaultLineMiterLimit] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-miter-limit\")\n    }\n\n  /**\n   * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n   *\n   * Use static method [LineLayer.defaultLineMiterLimit] to set the default property.\n   *\n   * @param lineMiterLimit value of lineMiterLimit\n   */\n  override fun lineMiterLimit(lineMiterLimit: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-miter-limit\", lineMiterLimit)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n   *\n   * This is an Expression representation of \"line-miter-limit\".\n   *\n   */\n  val lineMiterLimitAsExpression: Expression?\n    /**\n     * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n     *\n     * Get the LineMiterLimit property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineMiterLimitAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-miter-limit\")\n\n  /**\n   * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n   *\n   * Use static method [LineLayer.defaultLineMiterLimitAsExpression] to set the default property.\n   *\n   * @param lineMiterLimit value of lineMiterLimit as Expression\n   */\n  override fun lineMiterLimit(lineMiterLimit: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-miter-limit\", lineMiterLimit)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n   */\n  val lineRoundLimit: Double?\n    /**\n     * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n     *\n     * Use static method [LineLayer.defaultLineRoundLimit] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-round-limit\")\n    }\n\n  /**\n   * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n   *\n   * Use static method [LineLayer.defaultLineRoundLimit] to set the default property.\n   *\n   * @param lineRoundLimit value of lineRoundLimit\n   */\n  override fun lineRoundLimit(lineRoundLimit: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-round-limit\", lineRoundLimit)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n   *\n   * This is an Expression representation of \"line-round-limit\".\n   *\n   */\n  val lineRoundLimitAsExpression: Expression?\n    /**\n     * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n     *\n     * Get the LineRoundLimit property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineRoundLimitAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-round-limit\")\n\n  /**\n   * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n   *\n   * Use static method [LineLayer.defaultLineRoundLimitAsExpression] to set the default property.\n   *\n   * @param lineRoundLimit value of lineRoundLimit as Expression\n   */\n  override fun lineRoundLimit(lineRoundLimit: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-round-limit\", lineRoundLimit)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  val lineSortKey: Double?\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     *\n     * Use static method [LineLayer.defaultLineSortKey] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-sort-key\")\n    }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * Use static method [LineLayer.defaultLineSortKey] to set the default property.\n   *\n   * @param lineSortKey value of lineSortKey\n   */\n  override fun lineSortKey(lineSortKey: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-sort-key\", lineSortKey)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * This is an Expression representation of \"line-sort-key\".\n   *\n   */\n  val lineSortKeyAsExpression: Expression?\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     *\n     * Get the LineSortKey property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineSortKeyAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-sort-key\")\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * Use static method [LineLayer.defaultLineSortKeyAsExpression] to set the default property.\n   *\n   * @param lineSortKey value of lineSortKey as Expression\n   */\n  override fun lineSortKey(lineSortKey: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-sort-key\", lineSortKey)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n   */\n  @MapboxExperimental\n  val lineWidthUnit: LineWidthUnit?\n    /**\n     * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n     *\n     * Use static method [LineLayer.defaultLineWidthUnit] to get the default property.\n     *\n     * @return LineWidthUnit\n     */\n    get() {\n      getPropertyValue<String?>(\"line-width-unit\")?.let {\n        return LineWidthUnit.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n   *\n   * Use static method [LineLayer.defaultLineWidthUnit] to set the default property.\n   *\n   * @param lineWidthUnit value of lineWidthUnit\n   */\n  @MapboxExperimental\n  override fun lineWidthUnit(lineWidthUnit: LineWidthUnit): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-width-unit\", lineWidthUnit)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n   *\n   * This is an Expression representation of \"line-width-unit\".\n   *\n   */\n  @MapboxExperimental\n  val lineWidthUnitAsExpression: Expression?\n    /**\n     * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n     *\n     * Get the LineWidthUnit property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineWidthUnitAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"line-width-unit\")\n        ?: lineWidthUnit?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n   *\n   * Use static method [LineLayer.defaultLineWidthUnitAsExpression] to set the default property.\n   *\n   * @param lineWidthUnit value of lineWidthUnit as Expression\n   */\n  @MapboxExperimental\n  override fun lineWidthUnit(lineWidthUnit: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-width-unit\", lineWidthUnit)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   */\n  val lineZOffset: Double?\n    /**\n     * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n     *\n     * Use static method [LineLayer.defaultLineZOffset] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-z-offset\")\n    }\n\n  /**\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   *\n   * Use static method [LineLayer.defaultLineZOffset] to set the default property.\n   *\n   * @param lineZOffset value of lineZOffset\n   */\n  override fun lineZOffset(lineZOffset: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-z-offset\", lineZOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   *\n   * This is an Expression representation of \"line-z-offset\".\n   *\n   */\n  val lineZOffsetAsExpression: Expression?\n    /**\n     * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n     *\n     * Get the LineZOffset property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineZOffsetAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-z-offset\")\n\n  /**\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   *\n   * Use static method [LineLayer.defaultLineZOffsetAsExpression] to set the default property.\n   *\n   * @param lineZOffset value of lineZOffset as Expression\n   */\n  override fun lineZOffset(lineZOffset: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-z-offset\", lineZOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   */\n  val lineBlur: Double?\n    /**\n     * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n     *\n     * Use static method [LineLayer.defaultLineBlur] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-blur\")\n    }\n\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineBlur] to set the default property.\n   *\n   * @param lineBlur value of lineBlur\n   */\n  override fun lineBlur(lineBlur: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-blur\", lineBlur)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   *\n   * This is an Expression representation of \"line-blur\".\n   *\n   */\n  val lineBlurAsExpression: Expression?\n    /**\n     * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n     *\n     * Get the LineBlur property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineBlurAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-blur\")\n\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineBlurAsExpression] to set the default property.\n   *\n   * @param lineBlur value of lineBlur as Expression\n   */\n  override fun lineBlur(lineBlur: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-blur\", lineBlur)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineBlur.\n   */\n  val lineBlurTransition: StyleTransition?\n    /**\n     * Get the LineBlur property transition options\n     *\n     * Use static method [LineLayer.defaultLineBlurTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-blur-transition\")\n    }\n\n  /**\n   * Set the LineBlur property transition options\n   *\n   * Use static method [LineLayer.defaultLineBlurTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineBlurTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-blur-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineBlurTransition].\n   */\n  override fun lineBlurTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineBlurTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  val lineBorderColor: String?\n    /**\n     * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * Use static method [LineLayer.defaultLineBorderColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      lineBorderColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Use static method [LineLayer.defaultLineBorderColor] to set the default property.\n   *\n   * @param lineBorderColor value of lineBorderColor\n   */\n  override fun lineBorderColor(lineBorderColor: String): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-border-color\", lineBorderColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * This is an Expression representation of \"line-border-color\".\n   *\n   */\n  val lineBorderColorAsExpression: Expression?\n    /**\n     * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * Get the LineBorderColor property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineBorderColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"line-border-color\")\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Use static method [LineLayer.defaultLineBorderColorAsExpression] to set the default property.\n   *\n   * @param lineBorderColor value of lineBorderColor as Expression\n   */\n  override fun lineBorderColor(lineBorderColor: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-border-color\", lineBorderColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  val lineBorderColorAsColorInt: Int?\n    /**\n     * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * Use static method [LineLayer.defaultLineBorderColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      lineBorderColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Use static method [LineLayer.defaultLineBorderColorAsColorInt] to set the default property.\n   *\n   * @param lineBorderColor value of lineBorderColor\n   */\n  override fun lineBorderColor(@ColorInt lineBorderColor: Int): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-border-color\", colorIntToRgbaExpression(lineBorderColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineBorderColor.\n   */\n  val lineBorderColorTransition: StyleTransition?\n    /**\n     * Get the LineBorderColor property transition options\n     *\n     * Use static method [LineLayer.defaultLineBorderColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"line-border-color-transition\")\n    }\n\n  /**\n   * Set the LineBorderColor property transition options\n   *\n   * Use static method [LineLayer.defaultLineBorderColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun lineBorderColorTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-border-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineBorderColorTransition].\n   */\n  override fun lineBorderColorTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineBorderColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [lineBorderColor].\n   */\n  @MapboxExperimental\n  val lineBorderColorUseTheme: String?\n    /**\n     * Get the LineBorderColorUseTheme property\n     *\n     * Use static method [LineLayer.defaultLineBorderColorUseTheme] to get the default property.\n     *\n     * @return current LineBorderColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"line-border-color-use-theme\")\n    }\n\n  /**\n   * Set the LineBorderColorUseTheme as String\n   *\n   * Use static method [LineLayer.defaultLineBorderColorUseTheme] to get the default property.\n   *\n   * @param lineBorderColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun lineBorderColorUseTheme(lineBorderColorUseTheme: String): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-border-color-use-theme\", lineBorderColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [lineBorderColor].\n   */\n  @MapboxExperimental\n  val lineBorderColorUseThemeAsExpression: Expression?\n    /**\n     * Get the LineBorderColorUseTheme property\n     *\n     * Use static method [LineLayer.defaultLineBorderColorUseTheme] to get the default property.\n     *\n     * @return current LineBorderColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"line-border-color-use-theme\")\n\n  /**\n   * Set the LineBorderColorUseTheme as Expression\n   *\n   * Use static method [LineLayer.defaultLineBorderColorUseTheme] to get the default property.\n   *\n   * @param lineBorderColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun lineBorderColorUseTheme(lineBorderColorUseTheme: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-border-color-use-theme\", lineBorderColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   */\n  val lineBorderWidth: Double?\n    /**\n     * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n     *\n     * Use static method [LineLayer.defaultLineBorderWidth] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-border-width\")\n    }\n\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   *\n   * Use static method [LineLayer.defaultLineBorderWidth] to set the default property.\n   *\n   * @param lineBorderWidth value of lineBorderWidth\n   */\n  override fun lineBorderWidth(lineBorderWidth: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-border-width\", lineBorderWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   *\n   * This is an Expression representation of \"line-border-width\".\n   *\n   */\n  val lineBorderWidthAsExpression: Expression?\n    /**\n     * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n     *\n     * Get the LineBorderWidth property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineBorderWidthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-border-width\")\n\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   *\n   * Use static method [LineLayer.defaultLineBorderWidthAsExpression] to set the default property.\n   *\n   * @param lineBorderWidth value of lineBorderWidth as Expression\n   */\n  override fun lineBorderWidth(lineBorderWidth: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-border-width\", lineBorderWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineBorderWidth.\n   */\n  val lineBorderWidthTransition: StyleTransition?\n    /**\n     * Get the LineBorderWidth property transition options\n     *\n     * Use static method [LineLayer.defaultLineBorderWidthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-border-width-transition\")\n    }\n\n  /**\n   * Set the LineBorderWidth property transition options\n   *\n   * Use static method [LineLayer.defaultLineBorderWidthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineBorderWidthTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-border-width-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineBorderWidthTransition].\n   */\n  override fun lineBorderWidthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineBorderWidthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  val lineColor: String?\n    /**\n     * The color with which the line will be drawn. Default value: \"#000000\".\n     *\n     * Use static method [LineLayer.defaultLineColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      lineColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * Use static method [LineLayer.defaultLineColor] to set the default property.\n   *\n   * @param lineColor value of lineColor\n   */\n  override fun lineColor(lineColor: String): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-color\", lineColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"line-color\".\n   *\n   */\n  val lineColorAsExpression: Expression?\n    /**\n     * The color with which the line will be drawn. Default value: \"#000000\".\n     *\n     * Get the LineColor property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"line-color\")\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * Use static method [LineLayer.defaultLineColorAsExpression] to set the default property.\n   *\n   * @param lineColor value of lineColor as Expression\n   */\n  override fun lineColor(lineColor: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-color\", lineColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  val lineColorAsColorInt: Int?\n    /**\n     * The color with which the line will be drawn. Default value: \"#000000\".\n     *\n     * Use static method [LineLayer.defaultLineColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      lineColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * Use static method [LineLayer.defaultLineColorAsColorInt] to set the default property.\n   *\n   * @param lineColor value of lineColor\n   */\n  override fun lineColor(@ColorInt lineColor: Int): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-color\", colorIntToRgbaExpression(lineColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineColor.\n   */\n  val lineColorTransition: StyleTransition?\n    /**\n     * Get the LineColor property transition options\n     *\n     * Use static method [LineLayer.defaultLineColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"line-color-transition\")\n    }\n\n  /**\n   * Set the LineColor property transition options\n   *\n   * Use static method [LineLayer.defaultLineColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun lineColorTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineColorTransition].\n   */\n  override fun lineColorTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [lineColor].\n   */\n  @MapboxExperimental\n  val lineColorUseTheme: String?\n    /**\n     * Get the LineColorUseTheme property\n     *\n     * Use static method [LineLayer.defaultLineColorUseTheme] to get the default property.\n     *\n     * @return current LineColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"line-color-use-theme\")\n    }\n\n  /**\n   * Set the LineColorUseTheme as String\n   *\n   * Use static method [LineLayer.defaultLineColorUseTheme] to get the default property.\n   *\n   * @param lineColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun lineColorUseTheme(lineColorUseTheme: String): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-color-use-theme\", lineColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [lineColor].\n   */\n  @MapboxExperimental\n  val lineColorUseThemeAsExpression: Expression?\n    /**\n     * Get the LineColorUseTheme property\n     *\n     * Use static method [LineLayer.defaultLineColorUseTheme] to get the default property.\n     *\n     * @return current LineColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"line-color-use-theme\")\n\n  /**\n   * Set the LineColorUseTheme as Expression\n   *\n   * Use static method [LineLayer.defaultLineColorUseTheme] to get the default property.\n   *\n   * @param lineColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun lineColorUseTheme(lineColorUseTheme: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-color-use-theme\", lineColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val lineCutoutFadeWidth: Double?\n    /**\n     * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n     *\n     * Use static method [LineLayer.defaultLineCutoutFadeWidth] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-cutout-fade-width\")\n    }\n\n  /**\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineCutoutFadeWidth] to set the default property.\n   *\n   * @param lineCutoutFadeWidth value of lineCutoutFadeWidth\n   */\n  @MapboxExperimental\n  override fun lineCutoutFadeWidth(lineCutoutFadeWidth: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cutout-fade-width\", lineCutoutFadeWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"line-cutout-fade-width\".\n   *\n   */\n  @MapboxExperimental\n  val lineCutoutFadeWidthAsExpression: Expression?\n    /**\n     * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n     *\n     * Get the LineCutoutFadeWidth property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineCutoutFadeWidthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-cutout-fade-width\")\n\n  /**\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineCutoutFadeWidthAsExpression] to set the default property.\n   *\n   * @param lineCutoutFadeWidth value of lineCutoutFadeWidth as Expression\n   */\n  @MapboxExperimental\n  override fun lineCutoutFadeWidth(lineCutoutFadeWidth: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cutout-fade-width\", lineCutoutFadeWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineCutoutFadeWidth.\n   */\n  @MapboxExperimental\n  val lineCutoutFadeWidthTransition: StyleTransition?\n    /**\n     * Get the LineCutoutFadeWidth property transition options\n     *\n     * Use static method [LineLayer.defaultLineCutoutFadeWidthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-cutout-fade-width-transition\")\n    }\n\n  /**\n   * Set the LineCutoutFadeWidth property transition options\n   *\n   * Use static method [LineLayer.defaultLineCutoutFadeWidthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun lineCutoutFadeWidthTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cutout-fade-width-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineCutoutFadeWidthTransition].\n   */\n  @MapboxExperimental\n  override fun lineCutoutFadeWidthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineCutoutFadeWidthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val lineCutoutOpacity: Double?\n    /**\n     * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [LineLayer.defaultLineCutoutOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-cutout-opacity\")\n    }\n\n  /**\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineCutoutOpacity] to set the default property.\n   *\n   * @param lineCutoutOpacity value of lineCutoutOpacity\n   */\n  @MapboxExperimental\n  override fun lineCutoutOpacity(lineCutoutOpacity: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cutout-opacity\", lineCutoutOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"line-cutout-opacity\".\n   *\n   */\n  @MapboxExperimental\n  val lineCutoutOpacityAsExpression: Expression?\n    /**\n     * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n     *\n     * Get the LineCutoutOpacity property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineCutoutOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-cutout-opacity\")\n\n  /**\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineCutoutOpacityAsExpression] to set the default property.\n   *\n   * @param lineCutoutOpacity value of lineCutoutOpacity as Expression\n   */\n  @MapboxExperimental\n  override fun lineCutoutOpacity(lineCutoutOpacity: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cutout-opacity\", lineCutoutOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineCutoutOpacity.\n   */\n  @MapboxExperimental\n  val lineCutoutOpacityTransition: StyleTransition?\n    /**\n     * Get the LineCutoutOpacity property transition options\n     *\n     * Use static method [LineLayer.defaultLineCutoutOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-cutout-opacity-transition\")\n    }\n\n  /**\n   * Set the LineCutoutOpacity property transition options\n   *\n   * Use static method [LineLayer.defaultLineCutoutOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun lineCutoutOpacityTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-cutout-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineCutoutOpacityTransition].\n   */\n  @MapboxExperimental\n  override fun lineCutoutOpacityTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineCutoutOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n   */\n  val lineDasharray: List<Double>?\n    /**\n     * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n     *\n     * Use static method [LineLayer.defaultLineDasharray] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"line-dasharray\")\n    }\n\n  /**\n   * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n   *\n   * Use static method [LineLayer.defaultLineDasharray] to set the default property.\n   *\n   * @param lineDasharray value of lineDasharray\n   */\n  override fun lineDasharray(lineDasharray: List<Double>): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-dasharray\", lineDasharray)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n   *\n   * This is an Expression representation of \"line-dasharray\".\n   *\n   */\n  val lineDasharrayAsExpression: Expression?\n    /**\n     * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n     *\n     * Get the LineDasharray property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineDasharrayAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-dasharray\")\n\n  /**\n   * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n   *\n   * Use static method [LineLayer.defaultLineDasharrayAsExpression] to set the default property.\n   *\n   * @param lineDasharray value of lineDasharray as Expression\n   */\n  override fun lineDasharray(lineDasharray: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-dasharray\", lineDasharray)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   */\n  val lineDepthOcclusionFactor: Double?\n    /**\n     * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [LineLayer.defaultLineDepthOcclusionFactor] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-depth-occlusion-factor\")\n    }\n\n  /**\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineDepthOcclusionFactor] to set the default property.\n   *\n   * @param lineDepthOcclusionFactor value of lineDepthOcclusionFactor\n   */\n  override fun lineDepthOcclusionFactor(lineDepthOcclusionFactor: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-depth-occlusion-factor\", lineDepthOcclusionFactor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"line-depth-occlusion-factor\".\n   *\n   */\n  val lineDepthOcclusionFactorAsExpression: Expression?\n    /**\n     * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n     *\n     * Get the LineDepthOcclusionFactor property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineDepthOcclusionFactorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-depth-occlusion-factor\")\n\n  /**\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineDepthOcclusionFactorAsExpression] to set the default property.\n   *\n   * @param lineDepthOcclusionFactor value of lineDepthOcclusionFactor as Expression\n   */\n  override fun lineDepthOcclusionFactor(lineDepthOcclusionFactor: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-depth-occlusion-factor\", lineDepthOcclusionFactor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineDepthOcclusionFactor.\n   */\n  val lineDepthOcclusionFactorTransition: StyleTransition?\n    /**\n     * Get the LineDepthOcclusionFactor property transition options\n     *\n     * Use static method [LineLayer.defaultLineDepthOcclusionFactorTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-depth-occlusion-factor-transition\")\n    }\n\n  /**\n   * Set the LineDepthOcclusionFactor property transition options\n   *\n   * Use static method [LineLayer.defaultLineDepthOcclusionFactorTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineDepthOcclusionFactorTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-depth-occlusion-factor-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineDepthOcclusionFactorTransition].\n   */\n  override fun lineDepthOcclusionFactorTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineDepthOcclusionFactorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   */\n  val lineEmissiveStrength: Double?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n     *\n     * Use static method [LineLayer.defaultLineEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-emissive-strength\")\n    }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   *\n   * Use static method [LineLayer.defaultLineEmissiveStrength] to set the default property.\n   *\n   * @param lineEmissiveStrength value of lineEmissiveStrength\n   */\n  override fun lineEmissiveStrength(lineEmissiveStrength: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-emissive-strength\", lineEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   *\n   * This is an Expression representation of \"line-emissive-strength\".\n   *\n   */\n  val lineEmissiveStrengthAsExpression: Expression?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n     *\n     * Get the LineEmissiveStrength property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-emissive-strength\")\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   *\n   * Use static method [LineLayer.defaultLineEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param lineEmissiveStrength value of lineEmissiveStrength as Expression\n   */\n  override fun lineEmissiveStrength(lineEmissiveStrength: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-emissive-strength\", lineEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineEmissiveStrength.\n   */\n  val lineEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the LineEmissiveStrength property transition options\n     *\n     * Use static method [LineLayer.defaultLineEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the LineEmissiveStrength property transition options\n   *\n   * Use static method [LineLayer.defaultLineEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineEmissiveStrengthTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineEmissiveStrengthTransition].\n   */\n  override fun lineEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   */\n  val lineGapWidth: Double?\n    /**\n     * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n     *\n     * Use static method [LineLayer.defaultLineGapWidth] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-gap-width\")\n    }\n\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineGapWidth] to set the default property.\n   *\n   * @param lineGapWidth value of lineGapWidth\n   */\n  override fun lineGapWidth(lineGapWidth: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-gap-width\", lineGapWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   *\n   * This is an Expression representation of \"line-gap-width\".\n   *\n   */\n  val lineGapWidthAsExpression: Expression?\n    /**\n     * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n     *\n     * Get the LineGapWidth property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineGapWidthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-gap-width\")\n\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineGapWidthAsExpression] to set the default property.\n   *\n   * @param lineGapWidth value of lineGapWidth as Expression\n   */\n  override fun lineGapWidth(lineGapWidth: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-gap-width\", lineGapWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineGapWidth.\n   */\n  val lineGapWidthTransition: StyleTransition?\n    /**\n     * Get the LineGapWidth property transition options\n     *\n     * Use static method [LineLayer.defaultLineGapWidthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-gap-width-transition\")\n    }\n\n  /**\n   * Set the LineGapWidth property transition options\n   *\n   * Use static method [LineLayer.defaultLineGapWidthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineGapWidthTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-gap-width-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineGapWidthTransition].\n   */\n  override fun lineGapWidthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineGapWidthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * A gradient used to color a line feature at various distances along its length. Defined using a `step` or `interpolate` expression which outputs a color for each corresponding `line-progress` input value. `line-progress` is a percentage of the line feature's total length as measured on the webmercator projected coordinate plane (a `number` between `0` and `1`). Can only be used with GeoJSON sources that specify `\"lineMetrics\": true`.\n   */\n  val lineGradient: Expression?\n    /**\n     * A gradient used to color a line feature at various distances along its length. Defined using a `step` or `interpolate` expression which outputs a color for each corresponding `line-progress` input value. `line-progress` is a percentage of the line feature's total length as measured on the webmercator projected coordinate plane (a `number` between `0` and `1`). Can only be used with GeoJSON sources that specify `\"lineMetrics\": true`.\n     *\n     * Use static method [LineLayer.defaultLineGradient] to get the default property.\n     *\n     * @return Expression\n     */\n    get() {\n      return getPropertyValue(\"line-gradient\")\n    }\n\n  /**\n   * A gradient used to color a line feature at various distances along its length. Defined using a `step` or `interpolate` expression which outputs a color for each corresponding `line-progress` input value. `line-progress` is a percentage of the line feature's total length as measured on the webmercator projected coordinate plane (a `number` between `0` and `1`). Can only be used with GeoJSON sources that specify `\"lineMetrics\": true`.\n   *\n   * Use static method [LineLayer.defaultLineGradient] to set the default property.\n   *\n   * @param lineGradient value of lineGradient\n   */\n  override fun lineGradient(lineGradient: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-gradient\", lineGradient)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [lineGradient].\n   */\n  @MapboxExperimental\n  val lineGradientUseTheme: String?\n    /**\n     * Get the LineGradientUseTheme property\n     *\n     * Use static method [LineLayer.defaultLineGradientUseTheme] to get the default property.\n     *\n     * @return current LineGradientUseTheme property as Expression\n     */\n    get() {\n      return getPropertyValue(\"line-gradient-use-theme\")\n    }\n\n  /**\n   * Set the LineGradientUseTheme as String\n   *\n   * Use static method [LineLayer.defaultLineGradientUseTheme] to get the default property.\n   *\n   * @param lineGradientUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun lineGradientUseTheme(lineGradientUseTheme: String): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-gradient-use-theme\", lineGradientUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [lineGradient].\n   */\n  @MapboxExperimental\n  val lineGradientUseThemeAsExpression: Expression?\n    /**\n     * Get the LineGradientUseTheme property\n     *\n     * Use static method [LineLayer.defaultLineGradientUseTheme] to get the default property.\n     *\n     * @return current LineGradientUseTheme property as Expression\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"line-gradient-use-theme\")\n\n  /**\n   * Set the LineGradientUseTheme as Expression\n   *\n   * Use static method [LineLayer.defaultLineGradientUseTheme] to get the default property.\n   *\n   * @param lineGradientUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun lineGradientUseTheme(lineGradientUseTheme: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-gradient-use-theme\", lineGradientUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   */\n  val lineOcclusionOpacity: Double?\n    /**\n     * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [LineLayer.defaultLineOcclusionOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-occlusion-opacity\")\n    }\n\n  /**\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineOcclusionOpacity] to set the default property.\n   *\n   * @param lineOcclusionOpacity value of lineOcclusionOpacity\n   */\n  override fun lineOcclusionOpacity(lineOcclusionOpacity: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-occlusion-opacity\", lineOcclusionOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"line-occlusion-opacity\".\n   *\n   */\n  val lineOcclusionOpacityAsExpression: Expression?\n    /**\n     * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n     *\n     * Get the LineOcclusionOpacity property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineOcclusionOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-occlusion-opacity\")\n\n  /**\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineOcclusionOpacityAsExpression] to set the default property.\n   *\n   * @param lineOcclusionOpacity value of lineOcclusionOpacity as Expression\n   */\n  override fun lineOcclusionOpacity(lineOcclusionOpacity: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-occlusion-opacity\", lineOcclusionOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineOcclusionOpacity.\n   */\n  val lineOcclusionOpacityTransition: StyleTransition?\n    /**\n     * Get the LineOcclusionOpacity property transition options\n     *\n     * Use static method [LineLayer.defaultLineOcclusionOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-occlusion-opacity-transition\")\n    }\n\n  /**\n   * Set the LineOcclusionOpacity property transition options\n   *\n   * Use static method [LineLayer.defaultLineOcclusionOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineOcclusionOpacityTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-occlusion-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineOcclusionOpacityTransition].\n   */\n  override fun lineOcclusionOpacityTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineOcclusionOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   */\n  val lineOffset: Double?\n    /**\n     * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n     *\n     * Use static method [LineLayer.defaultLineOffset] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-offset\")\n    }\n\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineOffset] to set the default property.\n   *\n   * @param lineOffset value of lineOffset\n   */\n  override fun lineOffset(lineOffset: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-offset\", lineOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   *\n   * This is an Expression representation of \"line-offset\".\n   *\n   */\n  val lineOffsetAsExpression: Expression?\n    /**\n     * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n     *\n     * Get the LineOffset property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineOffsetAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-offset\")\n\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineOffsetAsExpression] to set the default property.\n   *\n   * @param lineOffset value of lineOffset as Expression\n   */\n  override fun lineOffset(lineOffset: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-offset\", lineOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineOffset.\n   */\n  val lineOffsetTransition: StyleTransition?\n    /**\n     * Get the LineOffset property transition options\n     *\n     * Use static method [LineLayer.defaultLineOffsetTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-offset-transition\")\n    }\n\n  /**\n   * Set the LineOffset property transition options\n   *\n   * Use static method [LineLayer.defaultLineOffsetTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineOffsetTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-offset-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineOffsetTransition].\n   */\n  override fun lineOffsetTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineOffsetTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  val lineOpacity: Double?\n    /**\n     * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [LineLayer.defaultLineOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-opacity\")\n    }\n\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineOpacity] to set the default property.\n   *\n   * @param lineOpacity value of lineOpacity\n   */\n  override fun lineOpacity(lineOpacity: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-opacity\", lineOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"line-opacity\".\n   *\n   */\n  val lineOpacityAsExpression: Expression?\n    /**\n     * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Get the LineOpacity property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-opacity\")\n\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLineOpacityAsExpression] to set the default property.\n   *\n   * @param lineOpacity value of lineOpacity as Expression\n   */\n  override fun lineOpacity(lineOpacity: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-opacity\", lineOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineOpacity.\n   */\n  val lineOpacityTransition: StyleTransition?\n    /**\n     * Get the LineOpacity property transition options\n     *\n     * Use static method [LineLayer.defaultLineOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-opacity-transition\")\n    }\n\n  /**\n   * Set the LineOpacity property transition options\n   *\n   * Use static method [LineLayer.defaultLineOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineOpacityTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineOpacityTransition].\n   */\n  override fun lineOpacityTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  val linePattern: String?\n    /**\n     * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * Use static method [LineLayer.defaultLinePattern] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"line-pattern\")\n    }\n\n  /**\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * Use static method [LineLayer.defaultLinePattern] to set the default property.\n   *\n   * @param linePattern value of linePattern\n   */\n  override fun linePattern(linePattern: String): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-pattern\", linePattern)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * This is an Expression representation of \"line-pattern\".\n   *\n   */\n  val linePatternAsExpression: Expression?\n    /**\n     * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * Get the LinePattern property as an Expression\n     *\n     * Use static method [LineLayer.defaultLinePatternAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-pattern\")\n\n  /**\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * Use static method [LineLayer.defaultLinePatternAsExpression] to set the default property.\n   *\n   * @param linePattern value of linePattern as Expression\n   */\n  override fun linePattern(linePattern: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-pattern\", linePattern)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  val linePatternCrossFade: Double?\n    /**\n     * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [LineLayer.defaultLinePatternCrossFade] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-pattern-cross-fade\")\n    }\n\n  /**\n   * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLinePatternCrossFade] to set the default property.\n   *\n   * @param linePatternCrossFade value of linePatternCrossFade\n   */\n  override fun linePatternCrossFade(linePatternCrossFade: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-pattern-cross-fade\", linePatternCrossFade)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"line-pattern-cross-fade\".\n   *\n   */\n  val linePatternCrossFadeAsExpression: Expression?\n    /**\n     * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * Get the LinePatternCrossFade property as an Expression\n     *\n     * Use static method [LineLayer.defaultLinePatternCrossFadeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-pattern-cross-fade\")\n\n  /**\n   * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [LineLayer.defaultLinePatternCrossFadeAsExpression] to set the default property.\n   *\n   * @param linePatternCrossFade value of linePatternCrossFade as Expression\n   */\n  override fun linePatternCrossFade(linePatternCrossFade: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-pattern-cross-fade\", linePatternCrossFade)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   */\n  val lineTranslate: List<Double>?\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n     *\n     * Use static method [LineLayer.defaultLineTranslate] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"line-translate\")\n    }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineTranslate] to set the default property.\n   *\n   * @param lineTranslate value of lineTranslate\n   */\n  override fun lineTranslate(lineTranslate: List<Double>): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-translate\", lineTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   *\n   * This is an Expression representation of \"line-translate\".\n   *\n   */\n  val lineTranslateAsExpression: Expression?\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n     *\n     * Get the LineTranslate property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineTranslateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-translate\")\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineTranslateAsExpression] to set the default property.\n   *\n   * @param lineTranslate value of lineTranslate as Expression\n   */\n  override fun lineTranslate(lineTranslate: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-translate\", lineTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineTranslate.\n   */\n  val lineTranslateTransition: StyleTransition?\n    /**\n     * Get the LineTranslate property transition options\n     *\n     * Use static method [LineLayer.defaultLineTranslateTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"line-translate-transition\")\n    }\n\n  /**\n   * Set the LineTranslate property transition options\n   *\n   * Use static method [LineLayer.defaultLineTranslateTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun lineTranslateTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-translate-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineTranslateTransition].\n   */\n  override fun lineTranslateTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineTranslateTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the frame of reference for `line-translate`. Default value: \"map\".\n   */\n  val lineTranslateAnchor: LineTranslateAnchor?\n    /**\n     * Controls the frame of reference for `line-translate`. Default value: \"map\".\n     *\n     * Use static method [LineLayer.defaultLineTranslateAnchor] to get the default property.\n     *\n     * @return LineTranslateAnchor\n     */\n    get() {\n      getPropertyValue<String?>(\"line-translate-anchor\")?.let {\n        return LineTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Controls the frame of reference for `line-translate`. Default value: \"map\".\n   *\n   * Use static method [LineLayer.defaultLineTranslateAnchor] to set the default property.\n   *\n   * @param lineTranslateAnchor value of lineTranslateAnchor\n   */\n  override fun lineTranslateAnchor(lineTranslateAnchor: LineTranslateAnchor): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-translate-anchor\", lineTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the frame of reference for `line-translate`. Default value: \"map\".\n   *\n   * This is an Expression representation of \"line-translate-anchor\".\n   *\n   */\n  val lineTranslateAnchorAsExpression: Expression?\n    /**\n     * Controls the frame of reference for `line-translate`. Default value: \"map\".\n     *\n     * Get the LineTranslateAnchor property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineTranslateAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"line-translate-anchor\")\n        ?: lineTranslateAnchor?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Controls the frame of reference for `line-translate`. Default value: \"map\".\n   *\n   * Use static method [LineLayer.defaultLineTranslateAnchorAsExpression] to set the default property.\n   *\n   * @param lineTranslateAnchor value of lineTranslateAnchor as Expression\n   */\n  override fun lineTranslateAnchor(lineTranslateAnchor: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-translate-anchor\", lineTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   */\n  @MapboxExperimental\n  val lineTrimColor: String?\n    /**\n     * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n     *\n     * Use static method [LineLayer.defaultLineTrimColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      lineTrimColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   *\n   * Use static method [LineLayer.defaultLineTrimColor] to set the default property.\n   *\n   * @param lineTrimColor value of lineTrimColor\n   */\n  @MapboxExperimental\n  override fun lineTrimColor(lineTrimColor: String): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-color\", lineTrimColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   *\n   * This is an Expression representation of \"line-trim-color\".\n   *\n   */\n  @MapboxExperimental\n  val lineTrimColorAsExpression: Expression?\n    /**\n     * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n     *\n     * Get the LineTrimColor property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineTrimColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"line-trim-color\")\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   *\n   * Use static method [LineLayer.defaultLineTrimColorAsExpression] to set the default property.\n   *\n   * @param lineTrimColor value of lineTrimColor as Expression\n   */\n  @MapboxExperimental\n  override fun lineTrimColor(lineTrimColor: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-color\", lineTrimColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   */\n  @MapboxExperimental\n  val lineTrimColorAsColorInt: Int?\n    /**\n     * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n     *\n     * Use static method [LineLayer.defaultLineTrimColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      lineTrimColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   *\n   * Use static method [LineLayer.defaultLineTrimColorAsColorInt] to set the default property.\n   *\n   * @param lineTrimColor value of lineTrimColor\n   */\n  @MapboxExperimental\n  override fun lineTrimColor(@ColorInt lineTrimColor: Int): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-color\", colorIntToRgbaExpression(lineTrimColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineTrimColor.\n   */\n  @MapboxExperimental\n  val lineTrimColorTransition: StyleTransition?\n    /**\n     * Get the LineTrimColor property transition options\n     *\n     * Use static method [LineLayer.defaultLineTrimColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"line-trim-color-transition\")\n    }\n\n  /**\n   * Set the LineTrimColor property transition options\n   *\n   * Use static method [LineLayer.defaultLineTrimColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  @MapboxExperimental\n  override fun lineTrimColorTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineTrimColorTransition].\n   */\n  @MapboxExperimental\n  override fun lineTrimColorTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineTrimColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [lineTrimColor].\n   */\n  @MapboxExperimental\n  val lineTrimColorUseTheme: String?\n    /**\n     * Get the LineTrimColorUseTheme property\n     *\n     * Use static method [LineLayer.defaultLineTrimColorUseTheme] to get the default property.\n     *\n     * @return current LineTrimColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"line-trim-color-use-theme\")\n    }\n\n  /**\n   * Set the LineTrimColorUseTheme as String\n   *\n   * Use static method [LineLayer.defaultLineTrimColorUseTheme] to get the default property.\n   *\n   * @param lineTrimColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun lineTrimColorUseTheme(lineTrimColorUseTheme: String): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-color-use-theme\", lineTrimColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [lineTrimColor].\n   */\n  @MapboxExperimental\n  val lineTrimColorUseThemeAsExpression: Expression?\n    /**\n     * Get the LineTrimColorUseTheme property\n     *\n     * Use static method [LineLayer.defaultLineTrimColorUseTheme] to get the default property.\n     *\n     * @return current LineTrimColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"line-trim-color-use-theme\")\n\n  /**\n   * Set the LineTrimColorUseTheme as Expression\n   *\n   * Use static method [LineLayer.defaultLineTrimColorUseTheme] to get the default property.\n   *\n   * @param lineTrimColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun lineTrimColorUseTheme(lineTrimColorUseTheme: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-color-use-theme\", lineTrimColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   */\n  @MapboxExperimental\n  val lineTrimFadeRange: List<Double>?\n    /**\n     * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n     *\n     * Use static method [LineLayer.defaultLineTrimFadeRange] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"line-trim-fade-range\")\n    }\n\n  /**\n   * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * Use static method [LineLayer.defaultLineTrimFadeRange] to set the default property.\n   *\n   * @param lineTrimFadeRange value of lineTrimFadeRange\n   */\n  @MapboxExperimental\n  override fun lineTrimFadeRange(lineTrimFadeRange: List<Double>): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-fade-range\", lineTrimFadeRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * This is an Expression representation of \"line-trim-fade-range\".\n   *\n   */\n  @MapboxExperimental\n  val lineTrimFadeRangeAsExpression: Expression?\n    /**\n     * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n     *\n     * Get the LineTrimFadeRange property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineTrimFadeRangeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-trim-fade-range\")\n\n  /**\n   * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * Use static method [LineLayer.defaultLineTrimFadeRangeAsExpression] to set the default property.\n   *\n   * @param lineTrimFadeRange value of lineTrimFadeRange as Expression\n   */\n  @MapboxExperimental\n  override fun lineTrimFadeRange(lineTrimFadeRange: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-fade-range\", lineTrimFadeRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   */\n  val lineTrimOffset: List<Double>?\n    /**\n     * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n     *\n     * Use static method [LineLayer.defaultLineTrimOffset] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"line-trim-offset\")\n    }\n\n  /**\n   * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * Use static method [LineLayer.defaultLineTrimOffset] to set the default property.\n   *\n   * @param lineTrimOffset value of lineTrimOffset\n   */\n  override fun lineTrimOffset(lineTrimOffset: List<Double>): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-offset\", lineTrimOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * This is an Expression representation of \"line-trim-offset\".\n   *\n   */\n  val lineTrimOffsetAsExpression: Expression?\n    /**\n     * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n     *\n     * Get the LineTrimOffset property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineTrimOffsetAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-trim-offset\")\n\n  /**\n   * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * Use static method [LineLayer.defaultLineTrimOffsetAsExpression] to set the default property.\n   *\n   * @param lineTrimOffset value of lineTrimOffset as Expression\n   */\n  override fun lineTrimOffset(lineTrimOffset: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-trim-offset\", lineTrimOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   */\n  val lineWidth: Double?\n    /**\n     * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n     *\n     * Use static method [LineLayer.defaultLineWidth] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"line-width\")\n    }\n\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineWidth] to set the default property.\n   *\n   * @param lineWidth value of lineWidth\n   */\n  override fun lineWidth(lineWidth: Double): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-width\", lineWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   *\n   * This is an Expression representation of \"line-width\".\n   *\n   */\n  val lineWidthAsExpression: Expression?\n    /**\n     * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n     *\n     * Get the LineWidth property as an Expression\n     *\n     * Use static method [LineLayer.defaultLineWidthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"line-width\")\n\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   *\n   * Use static method [LineLayer.defaultLineWidthAsExpression] to set the default property.\n   *\n   * @param lineWidth value of lineWidth as Expression\n   */\n  override fun lineWidth(lineWidth: Expression): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-width\", lineWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LineWidth.\n   */\n  val lineWidthTransition: StyleTransition?\n    /**\n     * Get the LineWidth property transition options\n     *\n     * Use static method [LineLayer.defaultLineWidthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"line-width-transition\")\n    }\n\n  /**\n   * Set the LineWidth property transition options\n   *\n   * Use static method [LineLayer.defaultLineWidthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun lineWidthTransition(options: StyleTransition): LineLayer = apply {\n    val propertyValue = PropertyValue(\"line-width-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [lineWidthTransition].\n   */\n  override fun lineWidthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer = apply {\n    lineWidthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"line\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * The display of line endings. Default value: \"butt\".\n     */\n    val defaultLineCap: LineCap?\n      /**\n       * The display of line endings. Default value: \"butt\".\n       *\n       * Get the default value of LineCap property\n       *\n       * @return LineCap\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cap\").silentUnwrap<String>()?.let {\n          return LineCap.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The display of line endings. Default value: \"butt\".\n     *\n     * This is an Expression representation of \"line-cap\".\n     *\n     */\n    val defaultLineCapAsExpression: Expression?\n      /**\n       * Get default value of the LineCap property as an Expression\n       *\n       * @return LineCap\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cap\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineCap?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n     */\n    @MapboxExperimental\n    val defaultLineCrossSlope: Double?\n      /**\n       * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n       *\n       * Get the default value of LineCrossSlope property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cross-slope\").silentUnwrap()\n      }\n\n    /**\n     * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n     *\n     * This is an Expression representation of \"line-cross-slope\".\n     *\n     */\n    @MapboxExperimental\n    val defaultLineCrossSlopeAsExpression: Expression?\n      /**\n       * Get default value of the LineCrossSlope property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cross-slope\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineCrossSlope?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n     */\n    val defaultLineElevationGroundScale: Double?\n      /**\n       * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of LineElevationGroundScale property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-ground-scale\").silentUnwrap()\n      }\n\n    /**\n     * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"line-elevation-ground-scale\".\n     *\n     */\n    val defaultLineElevationGroundScaleAsExpression: Expression?\n      /**\n       * Get default value of the LineElevationGroundScale property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-ground-scale\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineElevationGroundScale?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineElevationGroundScale.\n     */\n    val defaultLineElevationGroundScaleTransition: StyleTransition?\n      /**\n       * Get the LineElevationGroundScale property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-ground-scale-transition\").silentUnwrap()\n\n    /**\n     * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     */\n    val defaultLineElevationReference: LineElevationReference?\n      /**\n       * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n       *\n       * Get the default value of LineElevationReference property\n       *\n       * @return LineElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-reference\").silentUnwrap<String>()?.let {\n          return LineElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n     *\n     * This is an Expression representation of \"line-elevation-reference\".\n     *\n     */\n    val defaultLineElevationReferenceAsExpression: Expression?\n      /**\n       * Get default value of the LineElevationReference property as an Expression\n       *\n       * @return LineElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-reference\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineElevationReference?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * The display of lines when joining. Default value: \"miter\".\n     */\n    val defaultLineJoin: LineJoin?\n      /**\n       * The display of lines when joining. Default value: \"miter\".\n       *\n       * Get the default value of LineJoin property\n       *\n       * @return LineJoin\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-join\").silentUnwrap<String>()?.let {\n          return LineJoin.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The display of lines when joining. Default value: \"miter\".\n     *\n     * This is an Expression representation of \"line-join\".\n     *\n     */\n    val defaultLineJoinAsExpression: Expression?\n      /**\n       * Get default value of the LineJoin property as an Expression\n       *\n       * @return LineJoin\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-join\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineJoin?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n     */\n    val defaultLineMiterLimit: Double?\n      /**\n       * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n       *\n       * Get the default value of LineMiterLimit property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-miter-limit\").silentUnwrap()\n      }\n\n    /**\n     * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n     *\n     * This is an Expression representation of \"line-miter-limit\".\n     *\n     */\n    val defaultLineMiterLimitAsExpression: Expression?\n      /**\n       * Get default value of the LineMiterLimit property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-miter-limit\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineMiterLimit?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n     */\n    val defaultLineRoundLimit: Double?\n      /**\n       * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n       *\n       * Get the default value of LineRoundLimit property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-round-limit\").silentUnwrap()\n      }\n\n    /**\n     * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n     *\n     * This is an Expression representation of \"line-round-limit\".\n     *\n     */\n    val defaultLineRoundLimitAsExpression: Expression?\n      /**\n       * Get default value of the LineRoundLimit property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-round-limit\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineRoundLimit?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     */\n    val defaultLineSortKey: Double?\n      /**\n       * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n       *\n       * Get the default value of LineSortKey property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-sort-key\").silentUnwrap()\n      }\n\n    /**\n     * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n     *\n     * This is an Expression representation of \"line-sort-key\".\n     *\n     */\n    val defaultLineSortKeyAsExpression: Expression?\n      /**\n       * Get default value of the LineSortKey property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-sort-key\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineSortKey?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n     */\n    @MapboxExperimental\n    val defaultLineWidthUnit: LineWidthUnit?\n      /**\n       * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n       *\n       * Get the default value of LineWidthUnit property\n       *\n       * @return LineWidthUnit\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width-unit\").silentUnwrap<String>()?.let {\n          return LineWidthUnit.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n     *\n     * This is an Expression representation of \"line-width-unit\".\n     *\n     */\n    @MapboxExperimental\n    val defaultLineWidthUnitAsExpression: Expression?\n      /**\n       * Get default value of the LineWidthUnit property as an Expression\n       *\n       * @return LineWidthUnit\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width-unit\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineWidthUnit?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n     */\n    val defaultLineZOffset: Double?\n      /**\n       * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n       *\n       * Get the default value of LineZOffset property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-z-offset\").silentUnwrap()\n      }\n\n    /**\n     * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n     *\n     * This is an Expression representation of \"line-z-offset\".\n     *\n     */\n    val defaultLineZOffsetAsExpression: Expression?\n      /**\n       * Get default value of the LineZOffset property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-z-offset\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineZOffset?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n     */\n    val defaultLineBlur: Double?\n      /**\n       * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n       *\n       * Get the default value of LineBlur property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-blur\").silentUnwrap()\n      }\n\n    /**\n     * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n     *\n     * This is an Expression representation of \"line-blur\".\n     *\n     */\n    val defaultLineBlurAsExpression: Expression?\n      /**\n       * Get default value of the LineBlur property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-blur\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineBlur?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineBlur.\n     */\n    val defaultLineBlurTransition: StyleTransition?\n      /**\n       * Get the LineBlur property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-blur-transition\").silentUnwrap()\n\n    /**\n     * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n     */\n    val defaultLineBorderColor: String?\n      /**\n       * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n       *\n       * Get the default value of LineBorderColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultLineBorderColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * This is an Expression representation of \"line-border-color\".\n     *\n     */\n    val defaultLineBorderColorAsExpression: Expression?\n      /**\n       * Get default value of the LineBorderColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n     */\n    val defaultLineBorderColorAsColorInt: Int?\n      /**\n       * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n       *\n       * Get the default value of LineBorderColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultLineBorderColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineBorderColor.\n     */\n    val defaultLineBorderColorTransition: StyleTransition?\n      /**\n       * Get the LineBorderColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [lineBorderColor].\n     */\n    @MapboxExperimental\n    val defaultLineBorderColorUseTheme: String?\n      /**\n       * Get default value of the LineBorderColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [lineBorderColor].\n     */\n    @MapboxExperimental\n    val defaultLineBorderColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the LineBorderColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultLineBorderColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n     */\n    val defaultLineBorderWidth: Double?\n      /**\n       * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n       *\n       * Get the default value of LineBorderWidth property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-width\").silentUnwrap()\n      }\n\n    /**\n     * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n     *\n     * This is an Expression representation of \"line-border-width\".\n     *\n     */\n    val defaultLineBorderWidthAsExpression: Expression?\n      /**\n       * Get default value of the LineBorderWidth property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-width\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineBorderWidth?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineBorderWidth.\n     */\n    val defaultLineBorderWidthTransition: StyleTransition?\n      /**\n       * Get the LineBorderWidth property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-width-transition\").silentUnwrap()\n\n    /**\n     * The color with which the line will be drawn. Default value: \"#000000\".\n     */\n    val defaultLineColor: String?\n      /**\n       * The color with which the line will be drawn. Default value: \"#000000\".\n       *\n       * Get the default value of LineColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultLineColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color with which the line will be drawn. Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"line-color\".\n     *\n     */\n    val defaultLineColorAsExpression: Expression?\n      /**\n       * Get default value of the LineColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color with which the line will be drawn. Default value: \"#000000\".\n     */\n    val defaultLineColorAsColorInt: Int?\n      /**\n       * The color with which the line will be drawn. Default value: \"#000000\".\n       *\n       * Get the default value of LineColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultLineColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineColor.\n     */\n    val defaultLineColorTransition: StyleTransition?\n      /**\n       * Get the LineColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [lineColor].\n     */\n    @MapboxExperimental\n    val defaultLineColorUseTheme: String?\n      /**\n       * Get default value of the LineColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [lineColor].\n     */\n    @MapboxExperimental\n    val defaultLineColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the LineColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"line\", \"line-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultLineColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n     */\n    @MapboxExperimental\n    val defaultLineCutoutFadeWidth: Double?\n      /**\n       * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n       *\n       * Get the default value of LineCutoutFadeWidth property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-fade-width\").silentUnwrap()\n      }\n\n    /**\n     * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"line-cutout-fade-width\".\n     *\n     */\n    @MapboxExperimental\n    val defaultLineCutoutFadeWidthAsExpression: Expression?\n      /**\n       * Get default value of the LineCutoutFadeWidth property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-fade-width\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineCutoutFadeWidth?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineCutoutFadeWidth.\n     */\n    @MapboxExperimental\n    val defaultLineCutoutFadeWidthTransition: StyleTransition?\n      /**\n       * Get the LineCutoutFadeWidth property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-fade-width-transition\").silentUnwrap()\n\n    /**\n     * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n     */\n    @MapboxExperimental\n    val defaultLineCutoutOpacity: Double?\n      /**\n       * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of LineCutoutOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"line-cutout-opacity\".\n     *\n     */\n    @MapboxExperimental\n    val defaultLineCutoutOpacityAsExpression: Expression?\n      /**\n       * Get default value of the LineCutoutOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineCutoutOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineCutoutOpacity.\n     */\n    @MapboxExperimental\n    val defaultLineCutoutOpacityTransition: StyleTransition?\n      /**\n       * Get the LineCutoutOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-opacity-transition\").silentUnwrap()\n\n    /**\n     * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n     */\n    val defaultLineDasharray: List<Double>?\n      /**\n       * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n       *\n       * Get the default value of LineDasharray property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-dasharray\").silentUnwrap()\n      }\n\n    /**\n     * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n     *\n     * This is an Expression representation of \"line-dasharray\".\n     *\n     */\n    val defaultLineDasharrayAsExpression: Expression?\n      /**\n       * Get default value of the LineDasharray property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-dasharray\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineDasharray?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n     */\n    val defaultLineDepthOcclusionFactor: Double?\n      /**\n       * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of LineDepthOcclusionFactor property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-depth-occlusion-factor\").silentUnwrap()\n      }\n\n    /**\n     * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"line-depth-occlusion-factor\".\n     *\n     */\n    val defaultLineDepthOcclusionFactorAsExpression: Expression?\n      /**\n       * Get default value of the LineDepthOcclusionFactor property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-depth-occlusion-factor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineDepthOcclusionFactor?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineDepthOcclusionFactor.\n     */\n    val defaultLineDepthOcclusionFactorTransition: StyleTransition?\n      /**\n       * Get the LineDepthOcclusionFactor property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-depth-occlusion-factor-transition\").silentUnwrap()\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n     */\n    val defaultLineEmissiveStrength: Double?\n      /**\n       * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n       *\n       * Get the default value of LineEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n     *\n     * This is an Expression representation of \"line-emissive-strength\".\n     *\n     */\n    val defaultLineEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the LineEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineEmissiveStrength.\n     */\n    val defaultLineEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the LineEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n     */\n    val defaultLineGapWidth: Double?\n      /**\n       * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n       *\n       * Get the default value of LineGapWidth property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gap-width\").silentUnwrap()\n      }\n\n    /**\n     * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n     *\n     * This is an Expression representation of \"line-gap-width\".\n     *\n     */\n    val defaultLineGapWidthAsExpression: Expression?\n      /**\n       * Get default value of the LineGapWidth property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gap-width\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineGapWidth?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineGapWidth.\n     */\n    val defaultLineGapWidthTransition: StyleTransition?\n      /**\n       * Get the LineGapWidth property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gap-width-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [lineGradient].\n     */\n    @MapboxExperimental\n    val defaultLineGradientUseTheme: String?\n      /**\n       * Get default value of the LineGradient property as String\n       *\n       * @return Expression\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gradient-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [lineGradient].\n     */\n    @MapboxExperimental\n    val defaultLineGradientUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the LineGradient property as Expression\n       *\n       * @return Expression\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"line\", \"line-gradient-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultLineGradientUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n     */\n    val defaultLineOcclusionOpacity: Double?\n      /**\n       * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of LineOcclusionOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-occlusion-opacity\").silentUnwrap()\n      }\n\n    /**\n     * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"line-occlusion-opacity\".\n     *\n     */\n    val defaultLineOcclusionOpacityAsExpression: Expression?\n      /**\n       * Get default value of the LineOcclusionOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-occlusion-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineOcclusionOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineOcclusionOpacity.\n     */\n    val defaultLineOcclusionOpacityTransition: StyleTransition?\n      /**\n       * Get the LineOcclusionOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-occlusion-opacity-transition\").silentUnwrap()\n\n    /**\n     * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n     */\n    val defaultLineOffset: Double?\n      /**\n       * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n       *\n       * Get the default value of LineOffset property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-offset\").silentUnwrap()\n      }\n\n    /**\n     * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n     *\n     * This is an Expression representation of \"line-offset\".\n     *\n     */\n    val defaultLineOffsetAsExpression: Expression?\n      /**\n       * Get default value of the LineOffset property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-offset\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineOffset?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineOffset.\n     */\n    val defaultLineOffsetTransition: StyleTransition?\n      /**\n       * Get the LineOffset property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-offset-transition\").silentUnwrap()\n\n    /**\n     * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n     */\n    val defaultLineOpacity: Double?\n      /**\n       * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of LineOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"line-opacity\".\n     *\n     */\n    val defaultLineOpacityAsExpression: Expression?\n      /**\n       * Get default value of the LineOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineOpacity.\n     */\n    val defaultLineOpacityTransition: StyleTransition?\n      /**\n       * Get the LineOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-opacity-transition\").silentUnwrap()\n\n    /**\n     * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     */\n    val defaultLinePattern: String?\n      /**\n       * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n       *\n       * Get the default value of LinePattern property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern\").silentUnwrap()\n      }\n\n    /**\n     * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n     *\n     * This is an Expression representation of \"line-pattern\".\n     *\n     */\n    val defaultLinePatternAsExpression: Expression?\n      /**\n       * Get default value of the LinePattern property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLinePattern?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     */\n    val defaultLinePatternCrossFade: Double?\n      /**\n       * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of LinePatternCrossFade property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern-cross-fade\").silentUnwrap()\n      }\n\n    /**\n     * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"line-pattern-cross-fade\".\n     *\n     */\n    val defaultLinePatternCrossFadeAsExpression: Expression?\n      /**\n       * Get default value of the LinePatternCrossFade property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern-cross-fade\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLinePatternCrossFade?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n     */\n    val defaultLineTranslate: List<Double>?\n      /**\n       * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n       *\n       * Get the default value of LineTranslate property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate\").silentUnwrap()\n      }\n\n    /**\n     * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n     *\n     * This is an Expression representation of \"line-translate\".\n     *\n     */\n    val defaultLineTranslateAsExpression: Expression?\n      /**\n       * Get default value of the LineTranslate property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineTranslate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineTranslate.\n     */\n    val defaultLineTranslateTransition: StyleTransition?\n      /**\n       * Get the LineTranslate property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate-transition\").silentUnwrap()\n\n    /**\n     * Controls the frame of reference for `line-translate`. Default value: \"map\".\n     */\n    val defaultLineTranslateAnchor: LineTranslateAnchor?\n      /**\n       * Controls the frame of reference for `line-translate`. Default value: \"map\".\n       *\n       * Get the default value of LineTranslateAnchor property\n       *\n       * @return LineTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate-anchor\").silentUnwrap<String>()?.let {\n          return LineTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Controls the frame of reference for `line-translate`. Default value: \"map\".\n     *\n     * This is an Expression representation of \"line-translate-anchor\".\n     *\n     */\n    val defaultLineTranslateAnchorAsExpression: Expression?\n      /**\n       * Get default value of the LineTranslateAnchor property as an Expression\n       *\n       * @return LineTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineTranslateAnchor?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n     */\n    @MapboxExperimental\n    val defaultLineTrimColor: String?\n      /**\n       * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n       *\n       * Get the default value of LineTrimColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultLineTrimColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n     *\n     * This is an Expression representation of \"line-trim-color\".\n     *\n     */\n    @MapboxExperimental\n    val defaultLineTrimColorAsExpression: Expression?\n      /**\n       * Get default value of the LineTrimColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n     */\n    @MapboxExperimental\n    val defaultLineTrimColorAsColorInt: Int?\n      /**\n       * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n       *\n       * Get the default value of LineTrimColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultLineTrimColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineTrimColor.\n     */\n    @MapboxExperimental\n    val defaultLineTrimColorTransition: StyleTransition?\n      /**\n       * Get the LineTrimColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [lineTrimColor].\n     */\n    @MapboxExperimental\n    val defaultLineTrimColorUseTheme: String?\n      /**\n       * Get default value of the LineTrimColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [lineTrimColor].\n     */\n    @MapboxExperimental\n    val defaultLineTrimColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the LineTrimColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultLineTrimColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n     */\n    @MapboxExperimental\n    val defaultLineTrimFadeRange: List<Double>?\n      /**\n       * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n       *\n       * Get the default value of LineTrimFadeRange property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-fade-range\").silentUnwrap()\n      }\n\n    /**\n     * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n     *\n     * This is an Expression representation of \"line-trim-fade-range\".\n     *\n     */\n    @MapboxExperimental\n    val defaultLineTrimFadeRangeAsExpression: Expression?\n      /**\n       * Get default value of the LineTrimFadeRange property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-fade-range\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineTrimFadeRange?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n     */\n    val defaultLineTrimOffset: List<Double>?\n      /**\n       * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n       *\n       * Get the default value of LineTrimOffset property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-offset\").silentUnwrap()\n      }\n\n    /**\n     * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n     *\n     * This is an Expression representation of \"line-trim-offset\".\n     *\n     */\n    val defaultLineTrimOffsetAsExpression: Expression?\n      /**\n       * Get default value of the LineTrimOffset property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-offset\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineTrimOffset?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n     */\n    val defaultLineWidth: Double?\n      /**\n       * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n       *\n       * Get the default value of LineWidth property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width\").silentUnwrap()\n      }\n\n    /**\n     * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n     *\n     * This is an Expression representation of \"line-width\".\n     *\n     */\n    val defaultLineWidthAsExpression: Expression?\n      /**\n       * Get default value of the LineWidth property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLineWidth?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LineWidth.\n     */\n    val defaultLineWidthTransition: StyleTransition?\n      /**\n       * Get the LineWidth property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width-transition\").silentUnwrap()\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface LineLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): LineLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): LineLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): LineLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): LineLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): LineLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): LineLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): LineLayer\n\n  // Property getters and setters\n\n  /**\n   * The display of line endings. Default value: \"butt\".\n   *\n   * @param lineCap value of lineCap\n   */\n  fun lineCap(lineCap: LineCap = LineCap.BUTT): LineLayer\n\n  /**\n   * The display of line endings. Default value: \"butt\".\n   *\n   * @param lineCap value of lineCap as Expression\n   */\n  fun lineCap(lineCap: Expression): LineLayer\n\n  /**\n   * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n   *\n   * @param lineCrossSlope value of lineCrossSlope\n   */\n  @MapboxExperimental\n  fun lineCrossSlope(lineCrossSlope: Double): LineLayer\n\n  /**\n   * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n   *\n   * @param lineCrossSlope value of lineCrossSlope as Expression\n   */\n  @MapboxExperimental\n  fun lineCrossSlope(lineCrossSlope: Expression): LineLayer\n\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   *\n   * @param lineElevationGroundScale value of lineElevationGroundScale\n   */\n  fun lineElevationGroundScale(lineElevationGroundScale: Double = 0.0): LineLayer\n\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   *\n   * @param lineElevationGroundScale value of lineElevationGroundScale as Expression\n   */\n  fun lineElevationGroundScale(lineElevationGroundScale: Expression): LineLayer\n\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   *\n   * Set the LineElevationGroundScale property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineElevationGroundScaleTransition(options: StyleTransition): LineLayer\n\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   *\n   * DSL for [lineElevationGroundScaleTransition].\n   */\n  fun lineElevationGroundScaleTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * @param lineElevationReference value of lineElevationReference\n   */\n  fun lineElevationReference(lineElevationReference: LineElevationReference = LineElevationReference.NONE): LineLayer\n\n  /**\n   * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   *\n   * @param lineElevationReference value of lineElevationReference as Expression\n   */\n  fun lineElevationReference(lineElevationReference: Expression): LineLayer\n\n  /**\n   * The display of lines when joining. Default value: \"miter\".\n   *\n   * @param lineJoin value of lineJoin\n   */\n  fun lineJoin(lineJoin: LineJoin = LineJoin.MITER): LineLayer\n\n  /**\n   * The display of lines when joining. Default value: \"miter\".\n   *\n   * @param lineJoin value of lineJoin as Expression\n   */\n  fun lineJoin(lineJoin: Expression): LineLayer\n\n  /**\n   * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n   *\n   * @param lineMiterLimit value of lineMiterLimit\n   */\n  fun lineMiterLimit(lineMiterLimit: Double = 2.0): LineLayer\n\n  /**\n   * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n   *\n   * @param lineMiterLimit value of lineMiterLimit as Expression\n   */\n  fun lineMiterLimit(lineMiterLimit: Expression): LineLayer\n\n  /**\n   * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n   *\n   * @param lineRoundLimit value of lineRoundLimit\n   */\n  fun lineRoundLimit(lineRoundLimit: Double = 1.05): LineLayer\n\n  /**\n   * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n   *\n   * @param lineRoundLimit value of lineRoundLimit as Expression\n   */\n  fun lineRoundLimit(lineRoundLimit: Expression): LineLayer\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * @param lineSortKey value of lineSortKey\n   */\n  fun lineSortKey(lineSortKey: Double): LineLayer\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * @param lineSortKey value of lineSortKey as Expression\n   */\n  fun lineSortKey(lineSortKey: Expression): LineLayer\n\n  /**\n   * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n   *\n   * @param lineWidthUnit value of lineWidthUnit\n   */\n  @MapboxExperimental\n  fun lineWidthUnit(lineWidthUnit: LineWidthUnit = LineWidthUnit.PIXELS): LineLayer\n\n  /**\n   * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n   *\n   * @param lineWidthUnit value of lineWidthUnit as Expression\n   */\n  @MapboxExperimental\n  fun lineWidthUnit(lineWidthUnit: Expression): LineLayer\n\n  /**\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   *\n   * @param lineZOffset value of lineZOffset\n   */\n  fun lineZOffset(lineZOffset: Double = 0.0): LineLayer\n\n  /**\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   *\n   * @param lineZOffset value of lineZOffset as Expression\n   */\n  fun lineZOffset(lineZOffset: Expression): LineLayer\n\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   *\n   * @param lineBlur value of lineBlur\n   */\n  fun lineBlur(lineBlur: Double = 0.0): LineLayer\n\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   *\n   * @param lineBlur value of lineBlur as Expression\n   */\n  fun lineBlur(lineBlur: Expression): LineLayer\n\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   *\n   * Set the LineBlur property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineBlurTransition(options: StyleTransition): LineLayer\n\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   *\n   * DSL for [lineBlurTransition].\n   */\n  fun lineBlurTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param lineBorderColor value of lineBorderColor\n   */\n  fun lineBorderColor(lineBorderColor: String = \"rgba(0, 0, 0, 0)\"): LineLayer\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param lineBorderColor value of lineBorderColor as Expression\n   */\n  fun lineBorderColor(lineBorderColor: Expression): LineLayer\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param lineBorderColor value of lineBorderColor\n   */\n  fun lineBorderColor(@ColorInt lineBorderColor: Int): LineLayer\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Set the LineBorderColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun lineBorderColorTransition(options: StyleTransition): LineLayer\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * DSL for [lineBorderColorTransition].\n   */\n  fun lineBorderColorTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * Set the lineBorderColorUseTheme as String for [lineBorderColor].\n   *\n   * @param lineBorderColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun lineBorderColorUseTheme(lineBorderColorUseTheme: String): LineLayer\n\n  /**\n   * Set the lineBorderColorUseTheme as Expression for [lineBorderColor].\n   *\n   * @param lineBorderColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun lineBorderColorUseTheme(lineBorderColorUseTheme: Expression): LineLayer\n\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   *\n   * @param lineBorderWidth value of lineBorderWidth\n   */\n  fun lineBorderWidth(lineBorderWidth: Double = 0.0): LineLayer\n\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   *\n   * @param lineBorderWidth value of lineBorderWidth as Expression\n   */\n  fun lineBorderWidth(lineBorderWidth: Expression): LineLayer\n\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   *\n   * Set the LineBorderWidth property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineBorderWidthTransition(options: StyleTransition): LineLayer\n\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   *\n   * DSL for [lineBorderWidthTransition].\n   */\n  fun lineBorderWidthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * @param lineColor value of lineColor\n   */\n  fun lineColor(lineColor: String = \"#000000\"): LineLayer\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * @param lineColor value of lineColor as Expression\n   */\n  fun lineColor(lineColor: Expression): LineLayer\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * @param lineColor value of lineColor\n   */\n  fun lineColor(@ColorInt lineColor: Int): LineLayer\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * Set the LineColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun lineColorTransition(options: StyleTransition): LineLayer\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * DSL for [lineColorTransition].\n   */\n  fun lineColorTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * Set the lineColorUseTheme as String for [lineColor].\n   *\n   * @param lineColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun lineColorUseTheme(lineColorUseTheme: String): LineLayer\n\n  /**\n   * Set the lineColorUseTheme as Expression for [lineColor].\n   *\n   * @param lineColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun lineColorUseTheme(lineColorUseTheme: Expression): LineLayer\n\n  /**\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   *\n   * @param lineCutoutFadeWidth value of lineCutoutFadeWidth\n   */\n  @MapboxExperimental\n  fun lineCutoutFadeWidth(lineCutoutFadeWidth: Double = 0.4): LineLayer\n\n  /**\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   *\n   * @param lineCutoutFadeWidth value of lineCutoutFadeWidth as Expression\n   */\n  @MapboxExperimental\n  fun lineCutoutFadeWidth(lineCutoutFadeWidth: Expression): LineLayer\n\n  /**\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   *\n   * Set the LineCutoutFadeWidth property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun lineCutoutFadeWidthTransition(options: StyleTransition): LineLayer\n\n  /**\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   *\n   * DSL for [lineCutoutFadeWidthTransition].\n   */\n  @MapboxExperimental\n  fun lineCutoutFadeWidthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   *\n   * @param lineCutoutOpacity value of lineCutoutOpacity\n   */\n  @MapboxExperimental\n  fun lineCutoutOpacity(lineCutoutOpacity: Double = 1.0): LineLayer\n\n  /**\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   *\n   * @param lineCutoutOpacity value of lineCutoutOpacity as Expression\n   */\n  @MapboxExperimental\n  fun lineCutoutOpacity(lineCutoutOpacity: Expression): LineLayer\n\n  /**\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   *\n   * Set the LineCutoutOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun lineCutoutOpacityTransition(options: StyleTransition): LineLayer\n\n  /**\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [lineCutoutOpacityTransition].\n   */\n  @MapboxExperimental\n  fun lineCutoutOpacityTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n   *\n   * @param lineDasharray value of lineDasharray\n   */\n  fun lineDasharray(lineDasharray: List<Double>): LineLayer\n\n  /**\n   * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n   *\n   * @param lineDasharray value of lineDasharray as Expression\n   */\n  fun lineDasharray(lineDasharray: Expression): LineLayer\n\n  /**\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   *\n   * @param lineDepthOcclusionFactor value of lineDepthOcclusionFactor\n   */\n  fun lineDepthOcclusionFactor(lineDepthOcclusionFactor: Double = 1.0): LineLayer\n\n  /**\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   *\n   * @param lineDepthOcclusionFactor value of lineDepthOcclusionFactor as Expression\n   */\n  fun lineDepthOcclusionFactor(lineDepthOcclusionFactor: Expression): LineLayer\n\n  /**\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   *\n   * Set the LineDepthOcclusionFactor property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineDepthOcclusionFactorTransition(options: StyleTransition): LineLayer\n\n  /**\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [lineDepthOcclusionFactorTransition].\n   */\n  fun lineDepthOcclusionFactorTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   *\n   * @param lineEmissiveStrength value of lineEmissiveStrength\n   */\n  fun lineEmissiveStrength(lineEmissiveStrength: Double = 0.0): LineLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   *\n   * @param lineEmissiveStrength value of lineEmissiveStrength as Expression\n   */\n  fun lineEmissiveStrength(lineEmissiveStrength: Expression): LineLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   *\n   * Set the LineEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineEmissiveStrengthTransition(options: StyleTransition): LineLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   *\n   * DSL for [lineEmissiveStrengthTransition].\n   */\n  fun lineEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   *\n   * @param lineGapWidth value of lineGapWidth\n   */\n  fun lineGapWidth(lineGapWidth: Double = 0.0): LineLayer\n\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   *\n   * @param lineGapWidth value of lineGapWidth as Expression\n   */\n  fun lineGapWidth(lineGapWidth: Expression): LineLayer\n\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   *\n   * Set the LineGapWidth property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineGapWidthTransition(options: StyleTransition): LineLayer\n\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   *\n   * DSL for [lineGapWidthTransition].\n   */\n  fun lineGapWidthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * A gradient used to color a line feature at various distances along its length. Defined using a `step` or `interpolate` expression which outputs a color for each corresponding `line-progress` input value. `line-progress` is a percentage of the line feature's total length as measured on the webmercator projected coordinate plane (a `number` between `0` and `1`). Can only be used with GeoJSON sources that specify `\"lineMetrics\": true`.\n   *\n   * @param lineGradient value of lineGradient\n   */\n  fun lineGradient(lineGradient: Expression): LineLayer\n\n  /**\n   * Set the lineGradientUseTheme as String for [lineGradient].\n   *\n   * @param lineGradientUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun lineGradientUseTheme(lineGradientUseTheme: String): LineLayer\n\n  /**\n   * Set the lineGradientUseTheme as Expression for [lineGradient].\n   *\n   * @param lineGradientUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun lineGradientUseTheme(lineGradientUseTheme: Expression): LineLayer\n\n  /**\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   *\n   * @param lineOcclusionOpacity value of lineOcclusionOpacity\n   */\n  fun lineOcclusionOpacity(lineOcclusionOpacity: Double = 0.0): LineLayer\n\n  /**\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   *\n   * @param lineOcclusionOpacity value of lineOcclusionOpacity as Expression\n   */\n  fun lineOcclusionOpacity(lineOcclusionOpacity: Expression): LineLayer\n\n  /**\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   *\n   * Set the LineOcclusionOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineOcclusionOpacityTransition(options: StyleTransition): LineLayer\n\n  /**\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   *\n   * DSL for [lineOcclusionOpacityTransition].\n   */\n  fun lineOcclusionOpacityTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   *\n   * @param lineOffset value of lineOffset\n   */\n  fun lineOffset(lineOffset: Double = 0.0): LineLayer\n\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   *\n   * @param lineOffset value of lineOffset as Expression\n   */\n  fun lineOffset(lineOffset: Expression): LineLayer\n\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   *\n   * Set the LineOffset property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineOffsetTransition(options: StyleTransition): LineLayer\n\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   *\n   * DSL for [lineOffsetTransition].\n   */\n  fun lineOffsetTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param lineOpacity value of lineOpacity\n   */\n  fun lineOpacity(lineOpacity: Double = 1.0): LineLayer\n\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param lineOpacity value of lineOpacity as Expression\n   */\n  fun lineOpacity(lineOpacity: Expression): LineLayer\n\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Set the LineOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineOpacityTransition(options: StyleTransition): LineLayer\n\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [lineOpacityTransition].\n   */\n  fun lineOpacityTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param linePattern value of linePattern\n   */\n  fun linePattern(linePattern: String): LineLayer\n\n  /**\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param linePattern value of linePattern as Expression\n   */\n  fun linePattern(linePattern: Expression): LineLayer\n\n  /**\n   * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * @param linePatternCrossFade value of linePatternCrossFade\n   */\n  fun linePatternCrossFade(linePatternCrossFade: Double = 0.0): LineLayer\n\n  /**\n   * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * @param linePatternCrossFade value of linePatternCrossFade as Expression\n   */\n  fun linePatternCrossFade(linePatternCrossFade: Expression): LineLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   *\n   * @param lineTranslate value of lineTranslate\n   */\n  fun lineTranslate(lineTranslate: List<Double> = listOf(0.0, 0.0)): LineLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   *\n   * @param lineTranslate value of lineTranslate as Expression\n   */\n  fun lineTranslate(lineTranslate: Expression): LineLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   *\n   * Set the LineTranslate property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun lineTranslateTransition(options: StyleTransition): LineLayer\n\n  /**\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   *\n   * DSL for [lineTranslateTransition].\n   */\n  fun lineTranslateTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * Controls the frame of reference for `line-translate`. Default value: \"map\".\n   *\n   * @param lineTranslateAnchor value of lineTranslateAnchor\n   */\n  fun lineTranslateAnchor(lineTranslateAnchor: LineTranslateAnchor = LineTranslateAnchor.MAP): LineLayer\n\n  /**\n   * Controls the frame of reference for `line-translate`. Default value: \"map\".\n   *\n   * @param lineTranslateAnchor value of lineTranslateAnchor as Expression\n   */\n  fun lineTranslateAnchor(lineTranslateAnchor: Expression): LineLayer\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   *\n   * @param lineTrimColor value of lineTrimColor\n   */\n  @MapboxExperimental\n  fun lineTrimColor(lineTrimColor: String = \"transparent\"): LineLayer\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   *\n   * @param lineTrimColor value of lineTrimColor as Expression\n   */\n  @MapboxExperimental\n  fun lineTrimColor(lineTrimColor: Expression): LineLayer\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   *\n   * @param lineTrimColor value of lineTrimColor\n   */\n  @MapboxExperimental\n  fun lineTrimColor(@ColorInt lineTrimColor: Int): LineLayer\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   *\n   * Set the LineTrimColor property transition options\n   *\n   * @param options transition options for String\n   */\n  @MapboxExperimental\n  fun lineTrimColorTransition(options: StyleTransition): LineLayer\n\n  /**\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   *\n   * DSL for [lineTrimColorTransition].\n   */\n  @MapboxExperimental\n  fun lineTrimColorTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n\n  /**\n   * Set the lineTrimColorUseTheme as String for [lineTrimColor].\n   *\n   * @param lineTrimColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun lineTrimColorUseTheme(lineTrimColorUseTheme: String): LineLayer\n\n  /**\n   * Set the lineTrimColorUseTheme as Expression for [lineTrimColor].\n   *\n   * @param lineTrimColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun lineTrimColorUseTheme(lineTrimColorUseTheme: Expression): LineLayer\n\n  /**\n   * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * @param lineTrimFadeRange value of lineTrimFadeRange\n   */\n  @MapboxExperimental\n  fun lineTrimFadeRange(lineTrimFadeRange: List<Double> = listOf(0.0, 0.0)): LineLayer\n\n  /**\n   * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * @param lineTrimFadeRange value of lineTrimFadeRange as Expression\n   */\n  @MapboxExperimental\n  fun lineTrimFadeRange(lineTrimFadeRange: Expression): LineLayer\n\n  /**\n   * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * @param lineTrimOffset value of lineTrimOffset\n   */\n  fun lineTrimOffset(lineTrimOffset: List<Double> = listOf(0.0, 0.0)): LineLayer\n\n  /**\n   * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   *\n   * @param lineTrimOffset value of lineTrimOffset as Expression\n   */\n  fun lineTrimOffset(lineTrimOffset: Expression): LineLayer\n\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   *\n   * @param lineWidth value of lineWidth\n   */\n  fun lineWidth(lineWidth: Double = 1.0): LineLayer\n\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   *\n   * @param lineWidth value of lineWidth as Expression\n   */\n  fun lineWidth(lineWidth: Expression): LineLayer\n\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   *\n   * Set the LineWidth property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun lineWidthTransition(options: StyleTransition): LineLayer\n\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   *\n   * DSL for [lineWidthTransition].\n   */\n  fun lineWidthTransition(block: StyleTransition.Builder.() -> Unit): LineLayer\n}\n\n/**\n * DSL function for creating a [LineLayer].\n */\nfun lineLayer(layerId: String, sourceId: String, block: LineLayerDsl.() -> Unit): LineLayer = LineLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * Location Indicator layer.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#location-indicator)\n *\n * @param layerId the ID of the layer\n */\n@UiThread\nclass LocationIndicatorLayer(override val layerId: String) : LocationIndicatorLayerDsl, Layer() {\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): LocationIndicatorLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [LocationIndicatorLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [LocationIndicatorLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [LocationIndicatorLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[LocationIndicatorLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [LocationIndicatorLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [LocationIndicatorLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): LocationIndicatorLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [LocationIndicatorLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [LocationIndicatorLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): LocationIndicatorLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n   */\n  val accuracyRadius: Double?\n    /**\n     * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"accuracy-radius\")\n    }\n\n  /**\n   * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadius] to set the default property.\n   *\n   * @param accuracyRadius value of accuracyRadius\n   */\n  override fun accuracyRadius(accuracyRadius: Double): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius\", accuracyRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n   *\n   * This is an Expression representation of \"accuracy-radius\".\n   *\n   */\n  val accuracyRadiusAsExpression: Expression?\n    /**\n     * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n     *\n     * Get the AccuracyRadius property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"accuracy-radius\")\n\n  /**\n   * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusAsExpression] to set the default property.\n   *\n   * @param accuracyRadius value of accuracyRadius as Expression\n   */\n  override fun accuracyRadius(accuracyRadius: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius\", accuracyRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for AccuracyRadius.\n   */\n  val accuracyRadiusTransition: StyleTransition?\n    /**\n     * Get the AccuracyRadius property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"accuracy-radius-transition\")\n    }\n\n  /**\n   * Set the AccuracyRadius property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun accuracyRadiusTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [accuracyRadiusTransition].\n   */\n  override fun accuracyRadiusTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    accuracyRadiusTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   */\n  val accuracyRadiusBorderColor: String?\n    /**\n     * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      accuracyRadiusBorderColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColor] to set the default property.\n   *\n   * @param accuracyRadiusBorderColor value of accuracyRadiusBorderColor\n   */\n  override fun accuracyRadiusBorderColor(accuracyRadiusBorderColor: String): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-border-color\", accuracyRadiusBorderColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"accuracy-radius-border-color\".\n   *\n   */\n  val accuracyRadiusBorderColorAsExpression: Expression?\n    /**\n     * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * Get the AccuracyRadiusBorderColor property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"accuracy-radius-border-color\")\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsExpression] to set the default property.\n   *\n   * @param accuracyRadiusBorderColor value of accuracyRadiusBorderColor as Expression\n   */\n  override fun accuracyRadiusBorderColor(accuracyRadiusBorderColor: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-border-color\", accuracyRadiusBorderColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   */\n  val accuracyRadiusBorderColorAsColorInt: Int?\n    /**\n     * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      accuracyRadiusBorderColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsColorInt] to set the default property.\n   *\n   * @param accuracyRadiusBorderColor value of accuracyRadiusBorderColor\n   */\n  override fun accuracyRadiusBorderColor(@ColorInt accuracyRadiusBorderColor: Int): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-border-color\", colorIntToRgbaExpression(accuracyRadiusBorderColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for AccuracyRadiusBorderColor.\n   */\n  val accuracyRadiusBorderColorTransition: StyleTransition?\n    /**\n     * Get the AccuracyRadiusBorderColor property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"accuracy-radius-border-color-transition\")\n    }\n\n  /**\n   * Set the AccuracyRadiusBorderColor property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun accuracyRadiusBorderColorTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-border-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [accuracyRadiusBorderColorTransition].\n   */\n  override fun accuracyRadiusBorderColorTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    accuracyRadiusBorderColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [accuracyRadiusBorderColor].\n   */\n  @MapboxExperimental\n  val accuracyRadiusBorderColorUseTheme: String?\n    /**\n     * Get the AccuracyRadiusBorderColorUseTheme property\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorUseTheme] to get the default property.\n     *\n     * @return current AccuracyRadiusBorderColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"accuracy-radius-border-color-use-theme\")\n    }\n\n  /**\n   * Set the AccuracyRadiusBorderColorUseTheme as String\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorUseTheme] to get the default property.\n   *\n   * @param accuracyRadiusBorderColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun accuracyRadiusBorderColorUseTheme(accuracyRadiusBorderColorUseTheme: String): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-border-color-use-theme\", accuracyRadiusBorderColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [accuracyRadiusBorderColor].\n   */\n  @MapboxExperimental\n  val accuracyRadiusBorderColorUseThemeAsExpression: Expression?\n    /**\n     * Get the AccuracyRadiusBorderColorUseTheme property\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorUseTheme] to get the default property.\n     *\n     * @return current AccuracyRadiusBorderColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"accuracy-radius-border-color-use-theme\")\n\n  /**\n   * Set the AccuracyRadiusBorderColorUseTheme as Expression\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusBorderColorUseTheme] to get the default property.\n   *\n   * @param accuracyRadiusBorderColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun accuracyRadiusBorderColorUseTheme(accuracyRadiusBorderColorUseTheme: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-border-color-use-theme\", accuracyRadiusBorderColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   */\n  val accuracyRadiusColor: String?\n    /**\n     * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      accuracyRadiusColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColor] to set the default property.\n   *\n   * @param accuracyRadiusColor value of accuracyRadiusColor\n   */\n  override fun accuracyRadiusColor(accuracyRadiusColor: String): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-color\", accuracyRadiusColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"accuracy-radius-color\".\n   *\n   */\n  val accuracyRadiusColorAsExpression: Expression?\n    /**\n     * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * Get the AccuracyRadiusColor property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"accuracy-radius-color\")\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorAsExpression] to set the default property.\n   *\n   * @param accuracyRadiusColor value of accuracyRadiusColor as Expression\n   */\n  override fun accuracyRadiusColor(accuracyRadiusColor: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-color\", accuracyRadiusColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   */\n  val accuracyRadiusColorAsColorInt: Int?\n    /**\n     * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      accuracyRadiusColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorAsColorInt] to set the default property.\n   *\n   * @param accuracyRadiusColor value of accuracyRadiusColor\n   */\n  override fun accuracyRadiusColor(@ColorInt accuracyRadiusColor: Int): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-color\", colorIntToRgbaExpression(accuracyRadiusColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for AccuracyRadiusColor.\n   */\n  val accuracyRadiusColorTransition: StyleTransition?\n    /**\n     * Get the AccuracyRadiusColor property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"accuracy-radius-color-transition\")\n    }\n\n  /**\n   * Set the AccuracyRadiusColor property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun accuracyRadiusColorTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [accuracyRadiusColorTransition].\n   */\n  override fun accuracyRadiusColorTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    accuracyRadiusColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [accuracyRadiusColor].\n   */\n  @MapboxExperimental\n  val accuracyRadiusColorUseTheme: String?\n    /**\n     * Get the AccuracyRadiusColorUseTheme property\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorUseTheme] to get the default property.\n     *\n     * @return current AccuracyRadiusColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"accuracy-radius-color-use-theme\")\n    }\n\n  /**\n   * Set the AccuracyRadiusColorUseTheme as String\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorUseTheme] to get the default property.\n   *\n   * @param accuracyRadiusColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun accuracyRadiusColorUseTheme(accuracyRadiusColorUseTheme: String): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-color-use-theme\", accuracyRadiusColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [accuracyRadiusColor].\n   */\n  @MapboxExperimental\n  val accuracyRadiusColorUseThemeAsExpression: Expression?\n    /**\n     * Get the AccuracyRadiusColorUseTheme property\n     *\n     * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorUseTheme] to get the default property.\n     *\n     * @return current AccuracyRadiusColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"accuracy-radius-color-use-theme\")\n\n  /**\n   * Set the AccuracyRadiusColorUseTheme as Expression\n   *\n   * Use static method [LocationIndicatorLayer.defaultAccuracyRadiusColorUseTheme] to get the default property.\n   *\n   * @param accuracyRadiusColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun accuracyRadiusColorUseTheme(accuracyRadiusColorUseTheme: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"accuracy-radius-color-use-theme\", accuracyRadiusColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n   */\n  val bearing: Double?\n    /**\n     * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n     *\n     * Use static method [LocationIndicatorLayer.defaultBearing] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"bearing\")\n    }\n\n  /**\n   * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n   *\n   * Use static method [LocationIndicatorLayer.defaultBearing] to set the default property.\n   *\n   * @param bearing value of bearing\n   */\n  override fun bearing(bearing: Double): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"bearing\", bearing)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n   *\n   * This is an Expression representation of \"bearing\".\n   *\n   */\n  val bearingAsExpression: Expression?\n    /**\n     * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n     *\n     * Get the Bearing property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultBearingAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"bearing\")\n\n  /**\n   * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n   *\n   * Use static method [LocationIndicatorLayer.defaultBearingAsExpression] to set the default property.\n   *\n   * @param bearing value of bearing as Expression\n   */\n  override fun bearing(bearing: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"bearing\", bearing)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for Bearing.\n   */\n  val bearingTransition: StyleTransition?\n    /**\n     * Get the Bearing property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultBearingTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"bearing-transition\")\n    }\n\n  /**\n   * Set the Bearing property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultBearingTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun bearingTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"bearing-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [bearingTransition].\n   */\n  override fun bearingTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    bearingTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Name of image in sprite to use as the middle of the location indicator.\n   */\n  val bearingImage: String?\n    /**\n     * Name of image in sprite to use as the middle of the location indicator.\n     *\n     * Use static method [LocationIndicatorLayer.defaultBearingImage] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"bearing-image\")\n    }\n\n  /**\n   * Name of image in sprite to use as the middle of the location indicator.\n   *\n   * Use static method [LocationIndicatorLayer.defaultBearingImage] to set the default property.\n   *\n   * @param bearingImage value of bearingImage\n   */\n  override fun bearingImage(bearingImage: String): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"bearing-image\", bearingImage)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use as the middle of the location indicator.\n   *\n   * This is an Expression representation of \"bearing-image\".\n   *\n   */\n  val bearingImageAsExpression: Expression?\n    /**\n     * Name of image in sprite to use as the middle of the location indicator.\n     *\n     * Get the BearingImage property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultBearingImageAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"bearing-image\")\n\n  /**\n   * Name of image in sprite to use as the middle of the location indicator.\n   *\n   * Use static method [LocationIndicatorLayer.defaultBearingImageAsExpression] to set the default property.\n   *\n   * @param bearingImage value of bearingImage as Expression\n   */\n  override fun bearingImage(bearingImage: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"bearing-image\", bearingImage)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n   */\n  val bearingImageSize: Double?\n    /**\n     * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n     *\n     * Use static method [LocationIndicatorLayer.defaultBearingImageSize] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"bearing-image-size\")\n    }\n\n  /**\n   * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n   *\n   * Use static method [LocationIndicatorLayer.defaultBearingImageSize] to set the default property.\n   *\n   * @param bearingImageSize value of bearingImageSize\n   */\n  override fun bearingImageSize(bearingImageSize: Double): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"bearing-image-size\", bearingImageSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n   *\n   * This is an Expression representation of \"bearing-image-size\".\n   *\n   */\n  val bearingImageSizeAsExpression: Expression?\n    /**\n     * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n     *\n     * Get the BearingImageSize property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultBearingImageSizeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"bearing-image-size\")\n\n  /**\n   * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n   *\n   * Use static method [LocationIndicatorLayer.defaultBearingImageSizeAsExpression] to set the default property.\n   *\n   * @param bearingImageSize value of bearingImageSize as Expression\n   */\n  override fun bearingImageSize(bearingImageSize: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"bearing-image-size\", bearingImageSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for BearingImageSize.\n   */\n  val bearingImageSizeTransition: StyleTransition?\n    /**\n     * Get the BearingImageSize property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultBearingImageSizeTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"bearing-image-size-transition\")\n    }\n\n  /**\n   * Set the BearingImageSize property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultBearingImageSizeTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun bearingImageSizeTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"bearing-image-size-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [bearingImageSizeTransition].\n   */\n  override fun bearingImageSizeTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    bearingImageSizeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   */\n  val emphasisCircleColor: String?\n    /**\n     * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      emphasisCircleColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColor] to set the default property.\n   *\n   * @param emphasisCircleColor value of emphasisCircleColor\n   */\n  override fun emphasisCircleColor(emphasisCircleColor: String): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-color\", emphasisCircleColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"emphasis-circle-color\".\n   *\n   */\n  val emphasisCircleColorAsExpression: Expression?\n    /**\n     * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * Get the EmphasisCircleColor property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"emphasis-circle-color\")\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorAsExpression] to set the default property.\n   *\n   * @param emphasisCircleColor value of emphasisCircleColor as Expression\n   */\n  override fun emphasisCircleColor(emphasisCircleColor: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-color\", emphasisCircleColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   */\n  val emphasisCircleColorAsColorInt: Int?\n    /**\n     * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      emphasisCircleColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorAsColorInt] to set the default property.\n   *\n   * @param emphasisCircleColor value of emphasisCircleColor\n   */\n  override fun emphasisCircleColor(@ColorInt emphasisCircleColor: Int): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-color\", colorIntToRgbaExpression(emphasisCircleColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for EmphasisCircleColor.\n   */\n  val emphasisCircleColorTransition: StyleTransition?\n    /**\n     * Get the EmphasisCircleColor property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"emphasis-circle-color-transition\")\n    }\n\n  /**\n   * Set the EmphasisCircleColor property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun emphasisCircleColorTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [emphasisCircleColorTransition].\n   */\n  override fun emphasisCircleColorTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    emphasisCircleColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [emphasisCircleColor].\n   */\n  @MapboxExperimental\n  val emphasisCircleColorUseTheme: String?\n    /**\n     * Get the EmphasisCircleColorUseTheme property\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorUseTheme] to get the default property.\n     *\n     * @return current EmphasisCircleColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"emphasis-circle-color-use-theme\")\n    }\n\n  /**\n   * Set the EmphasisCircleColorUseTheme as String\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorUseTheme] to get the default property.\n   *\n   * @param emphasisCircleColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun emphasisCircleColorUseTheme(emphasisCircleColorUseTheme: String): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-color-use-theme\", emphasisCircleColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [emphasisCircleColor].\n   */\n  @MapboxExperimental\n  val emphasisCircleColorUseThemeAsExpression: Expression?\n    /**\n     * Get the EmphasisCircleColorUseTheme property\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorUseTheme] to get the default property.\n     *\n     * @return current EmphasisCircleColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"emphasis-circle-color-use-theme\")\n\n  /**\n   * Set the EmphasisCircleColorUseTheme as Expression\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleColorUseTheme] to get the default property.\n   *\n   * @param emphasisCircleColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun emphasisCircleColorUseTheme(emphasisCircleColorUseTheme: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-color-use-theme\", emphasisCircleColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n   */\n  val emphasisCircleGlowRange: List<Double>?\n    /**\n     * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleGlowRange] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"emphasis-circle-glow-range\")\n    }\n\n  /**\n   * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleGlowRange] to set the default property.\n   *\n   * @param emphasisCircleGlowRange value of emphasisCircleGlowRange\n   */\n  override fun emphasisCircleGlowRange(emphasisCircleGlowRange: List<Double>): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-glow-range\", emphasisCircleGlowRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n   *\n   * This is an Expression representation of \"emphasis-circle-glow-range\".\n   *\n   */\n  val emphasisCircleGlowRangeAsExpression: Expression?\n    /**\n     * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n     *\n     * Get the EmphasisCircleGlowRange property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleGlowRangeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"emphasis-circle-glow-range\")\n\n  /**\n   * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleGlowRangeAsExpression] to set the default property.\n   *\n   * @param emphasisCircleGlowRange value of emphasisCircleGlowRange as Expression\n   */\n  override fun emphasisCircleGlowRange(emphasisCircleGlowRange: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-glow-range\", emphasisCircleGlowRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for EmphasisCircleGlowRange.\n   */\n  val emphasisCircleGlowRangeTransition: StyleTransition?\n    /**\n     * Get the EmphasisCircleGlowRange property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleGlowRangeTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"emphasis-circle-glow-range-transition\")\n    }\n\n  /**\n   * Set the EmphasisCircleGlowRange property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleGlowRangeTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun emphasisCircleGlowRangeTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-glow-range-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [emphasisCircleGlowRangeTransition].\n   */\n  override fun emphasisCircleGlowRangeTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    emphasisCircleGlowRangeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n   */\n  val emphasisCircleRadius: Double?\n    /**\n     * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"emphasis-circle-radius\")\n    }\n\n  /**\n   * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleRadius] to set the default property.\n   *\n   * @param emphasisCircleRadius value of emphasisCircleRadius\n   */\n  override fun emphasisCircleRadius(emphasisCircleRadius: Double): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-radius\", emphasisCircleRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n   *\n   * This is an Expression representation of \"emphasis-circle-radius\".\n   *\n   */\n  val emphasisCircleRadiusAsExpression: Expression?\n    /**\n     * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n     *\n     * Get the EmphasisCircleRadius property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"emphasis-circle-radius\")\n\n  /**\n   * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleRadiusAsExpression] to set the default property.\n   *\n   * @param emphasisCircleRadius value of emphasisCircleRadius as Expression\n   */\n  override fun emphasisCircleRadius(emphasisCircleRadius: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-radius\", emphasisCircleRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for EmphasisCircleRadius.\n   */\n  val emphasisCircleRadiusTransition: StyleTransition?\n    /**\n     * Get the EmphasisCircleRadius property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultEmphasisCircleRadiusTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"emphasis-circle-radius-transition\")\n    }\n\n  /**\n   * Set the EmphasisCircleRadius property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultEmphasisCircleRadiusTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun emphasisCircleRadiusTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"emphasis-circle-radius-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [emphasisCircleRadiusTransition].\n   */\n  override fun emphasisCircleRadiusTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    emphasisCircleRadiusTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n   */\n  val imagePitchDisplacement: Double?\n    /**\n     * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n     *\n     * Use static method [LocationIndicatorLayer.defaultImagePitchDisplacement] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"image-pitch-displacement\")\n    }\n\n  /**\n   * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n   *\n   * Use static method [LocationIndicatorLayer.defaultImagePitchDisplacement] to set the default property.\n   *\n   * @param imagePitchDisplacement value of imagePitchDisplacement\n   */\n  override fun imagePitchDisplacement(imagePitchDisplacement: Double): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"image-pitch-displacement\", imagePitchDisplacement)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n   *\n   * This is an Expression representation of \"image-pitch-displacement\".\n   *\n   */\n  val imagePitchDisplacementAsExpression: Expression?\n    /**\n     * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n     *\n     * Get the ImagePitchDisplacement property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultImagePitchDisplacementAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"image-pitch-displacement\")\n\n  /**\n   * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n   *\n   * Use static method [LocationIndicatorLayer.defaultImagePitchDisplacementAsExpression] to set the default property.\n   *\n   * @param imagePitchDisplacement value of imagePitchDisplacement as Expression\n   */\n  override fun imagePitchDisplacement(imagePitchDisplacement: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"image-pitch-displacement\", imagePitchDisplacement)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n   */\n  val location: List<Double>?\n    /**\n     * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n     *\n     * Use static method [LocationIndicatorLayer.defaultLocation] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"location\")\n    }\n\n  /**\n   * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n   *\n   * Use static method [LocationIndicatorLayer.defaultLocation] to set the default property.\n   *\n   * @param location value of location\n   */\n  override fun location(location: List<Double>): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"location\", location)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n   *\n   * This is an Expression representation of \"location\".\n   *\n   */\n  val locationAsExpression: Expression?\n    /**\n     * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n     *\n     * Get the Location property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultLocationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"location\")\n\n  /**\n   * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n   *\n   * Use static method [LocationIndicatorLayer.defaultLocationAsExpression] to set the default property.\n   *\n   * @param location value of location as Expression\n   */\n  override fun location(location: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"location\", location)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for Location.\n   */\n  val locationTransition: StyleTransition?\n    /**\n     * Get the Location property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultLocationTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"location-transition\")\n    }\n\n  /**\n   * Set the Location property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultLocationTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun locationTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"location-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [locationTransition].\n   */\n  override fun locationTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    locationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n   */\n  val locationIndicatorOpacity: Double?\n    /**\n     * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [LocationIndicatorLayer.defaultLocationIndicatorOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"location-indicator-opacity\")\n    }\n\n  /**\n   * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [LocationIndicatorLayer.defaultLocationIndicatorOpacity] to set the default property.\n   *\n   * @param locationIndicatorOpacity value of locationIndicatorOpacity\n   */\n  override fun locationIndicatorOpacity(locationIndicatorOpacity: Double): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"location-indicator-opacity\", locationIndicatorOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"location-indicator-opacity\".\n   *\n   */\n  val locationIndicatorOpacityAsExpression: Expression?\n    /**\n     * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n     *\n     * Get the LocationIndicatorOpacity property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultLocationIndicatorOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"location-indicator-opacity\")\n\n  /**\n   * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [LocationIndicatorLayer.defaultLocationIndicatorOpacityAsExpression] to set the default property.\n   *\n   * @param locationIndicatorOpacity value of locationIndicatorOpacity as Expression\n   */\n  override fun locationIndicatorOpacity(locationIndicatorOpacity: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"location-indicator-opacity\", locationIndicatorOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for LocationIndicatorOpacity.\n   */\n  val locationIndicatorOpacityTransition: StyleTransition?\n    /**\n     * Get the LocationIndicatorOpacity property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultLocationIndicatorOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"location-indicator-opacity-transition\")\n    }\n\n  /**\n   * Set the LocationIndicatorOpacity property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultLocationIndicatorOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun locationIndicatorOpacityTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"location-indicator-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [locationIndicatorOpacityTransition].\n   */\n  override fun locationIndicatorOpacityTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    locationIndicatorOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n   */\n  val perspectiveCompensation: Double?\n    /**\n     * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n     *\n     * Use static method [LocationIndicatorLayer.defaultPerspectiveCompensation] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"perspective-compensation\")\n    }\n\n  /**\n   * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultPerspectiveCompensation] to set the default property.\n   *\n   * @param perspectiveCompensation value of perspectiveCompensation\n   */\n  override fun perspectiveCompensation(perspectiveCompensation: Double): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"perspective-compensation\", perspectiveCompensation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n   *\n   * This is an Expression representation of \"perspective-compensation\".\n   *\n   */\n  val perspectiveCompensationAsExpression: Expression?\n    /**\n     * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n     *\n     * Get the PerspectiveCompensation property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultPerspectiveCompensationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"perspective-compensation\")\n\n  /**\n   * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n   *\n   * Use static method [LocationIndicatorLayer.defaultPerspectiveCompensationAsExpression] to set the default property.\n   *\n   * @param perspectiveCompensation value of perspectiveCompensation as Expression\n   */\n  override fun perspectiveCompensation(perspectiveCompensation: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"perspective-compensation\", perspectiveCompensation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use as the background of the location indicator.\n   */\n  val shadowImage: String?\n    /**\n     * Name of image in sprite to use as the background of the location indicator.\n     *\n     * Use static method [LocationIndicatorLayer.defaultShadowImage] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"shadow-image\")\n    }\n\n  /**\n   * Name of image in sprite to use as the background of the location indicator.\n   *\n   * Use static method [LocationIndicatorLayer.defaultShadowImage] to set the default property.\n   *\n   * @param shadowImage value of shadowImage\n   */\n  override fun shadowImage(shadowImage: String): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"shadow-image\", shadowImage)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use as the background of the location indicator.\n   *\n   * This is an Expression representation of \"shadow-image\".\n   *\n   */\n  val shadowImageAsExpression: Expression?\n    /**\n     * Name of image in sprite to use as the background of the location indicator.\n     *\n     * Get the ShadowImage property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultShadowImageAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"shadow-image\")\n\n  /**\n   * Name of image in sprite to use as the background of the location indicator.\n   *\n   * Use static method [LocationIndicatorLayer.defaultShadowImageAsExpression] to set the default property.\n   *\n   * @param shadowImage value of shadowImage as Expression\n   */\n  override fun shadowImage(shadowImage: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"shadow-image\", shadowImage)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n   */\n  val shadowImageSize: Double?\n    /**\n     * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n     *\n     * Use static method [LocationIndicatorLayer.defaultShadowImageSize] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"shadow-image-size\")\n    }\n\n  /**\n   * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n   *\n   * Use static method [LocationIndicatorLayer.defaultShadowImageSize] to set the default property.\n   *\n   * @param shadowImageSize value of shadowImageSize\n   */\n  override fun shadowImageSize(shadowImageSize: Double): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"shadow-image-size\", shadowImageSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n   *\n   * This is an Expression representation of \"shadow-image-size\".\n   *\n   */\n  val shadowImageSizeAsExpression: Expression?\n    /**\n     * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n     *\n     * Get the ShadowImageSize property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultShadowImageSizeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"shadow-image-size\")\n\n  /**\n   * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n   *\n   * Use static method [LocationIndicatorLayer.defaultShadowImageSizeAsExpression] to set the default property.\n   *\n   * @param shadowImageSize value of shadowImageSize as Expression\n   */\n  override fun shadowImageSize(shadowImageSize: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"shadow-image-size\", shadowImageSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ShadowImageSize.\n   */\n  val shadowImageSizeTransition: StyleTransition?\n    /**\n     * Get the ShadowImageSize property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultShadowImageSizeTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"shadow-image-size-transition\")\n    }\n\n  /**\n   * Set the ShadowImageSize property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultShadowImageSizeTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun shadowImageSizeTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"shadow-image-size-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [shadowImageSizeTransition].\n   */\n  override fun shadowImageSizeTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    shadowImageSizeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Name of image in sprite to use as the top of the location indicator.\n   */\n  val topImage: String?\n    /**\n     * Name of image in sprite to use as the top of the location indicator.\n     *\n     * Use static method [LocationIndicatorLayer.defaultTopImage] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"top-image\")\n    }\n\n  /**\n   * Name of image in sprite to use as the top of the location indicator.\n   *\n   * Use static method [LocationIndicatorLayer.defaultTopImage] to set the default property.\n   *\n   * @param topImage value of topImage\n   */\n  override fun topImage(topImage: String): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"top-image\", topImage)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use as the top of the location indicator.\n   *\n   * This is an Expression representation of \"top-image\".\n   *\n   */\n  val topImageAsExpression: Expression?\n    /**\n     * Name of image in sprite to use as the top of the location indicator.\n     *\n     * Get the TopImage property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultTopImageAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"top-image\")\n\n  /**\n   * Name of image in sprite to use as the top of the location indicator.\n   *\n   * Use static method [LocationIndicatorLayer.defaultTopImageAsExpression] to set the default property.\n   *\n   * @param topImage value of topImage as Expression\n   */\n  override fun topImage(topImage: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"top-image\", topImage)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n   */\n  val topImageSize: Double?\n    /**\n     * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n     *\n     * Use static method [LocationIndicatorLayer.defaultTopImageSize] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"top-image-size\")\n    }\n\n  /**\n   * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n   *\n   * Use static method [LocationIndicatorLayer.defaultTopImageSize] to set the default property.\n   *\n   * @param topImageSize value of topImageSize\n   */\n  override fun topImageSize(topImageSize: Double): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"top-image-size\", topImageSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n   *\n   * This is an Expression representation of \"top-image-size\".\n   *\n   */\n  val topImageSizeAsExpression: Expression?\n    /**\n     * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n     *\n     * Get the TopImageSize property as an Expression\n     *\n     * Use static method [LocationIndicatorLayer.defaultTopImageSizeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"top-image-size\")\n\n  /**\n   * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n   *\n   * Use static method [LocationIndicatorLayer.defaultTopImageSizeAsExpression] to set the default property.\n   *\n   * @param topImageSize value of topImageSize as Expression\n   */\n  override fun topImageSize(topImageSize: Expression): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"top-image-size\", topImageSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for TopImageSize.\n   */\n  val topImageSizeTransition: StyleTransition?\n    /**\n     * Get the TopImageSize property transition options\n     *\n     * Use static method [LocationIndicatorLayer.defaultTopImageSizeTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"top-image-size-transition\")\n    }\n\n  /**\n   * Set the TopImageSize property transition options\n   *\n   * Use static method [LocationIndicatorLayer.defaultTopImageSizeTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun topImageSizeTransition(options: StyleTransition): LocationIndicatorLayer = apply {\n    val propertyValue = PropertyValue(\"top-image-size-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [topImageSizeTransition].\n   */\n  override fun topImageSizeTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer = apply {\n    topImageSizeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"location-indicator\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n     */\n    val defaultAccuracyRadius: Double?\n      /**\n       * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n       *\n       * Get the default value of AccuracyRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius\").silentUnwrap()\n      }\n\n    /**\n     * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n     *\n     * This is an Expression representation of \"accuracy-radius\".\n     *\n     */\n    val defaultAccuracyRadiusAsExpression: Expression?\n      /**\n       * Get default value of the AccuracyRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultAccuracyRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for AccuracyRadius.\n     */\n    val defaultAccuracyRadiusTransition: StyleTransition?\n      /**\n       * Get the AccuracyRadius property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-transition\").silentUnwrap()\n\n    /**\n     * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     */\n    val defaultAccuracyRadiusBorderColor: String?\n      /**\n       * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n       *\n       * Get the default value of AccuracyRadiusBorderColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultAccuracyRadiusBorderColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * This is an Expression representation of \"accuracy-radius-border-color\".\n     *\n     */\n    val defaultAccuracyRadiusBorderColorAsExpression: Expression?\n      /**\n       * Get default value of the AccuracyRadiusBorderColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     */\n    val defaultAccuracyRadiusBorderColorAsColorInt: Int?\n      /**\n       * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n       *\n       * Get the default value of AccuracyRadiusBorderColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultAccuracyRadiusBorderColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for AccuracyRadiusBorderColor.\n     */\n    val defaultAccuracyRadiusBorderColorTransition: StyleTransition?\n      /**\n       * Get the AccuracyRadiusBorderColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [accuracyRadiusBorderColor].\n     */\n    @MapboxExperimental\n    val defaultAccuracyRadiusBorderColorUseTheme: String?\n      /**\n       * Get default value of the AccuracyRadiusBorderColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [accuracyRadiusBorderColor].\n     */\n    @MapboxExperimental\n    val defaultAccuracyRadiusBorderColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the AccuracyRadiusBorderColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultAccuracyRadiusBorderColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     */\n    val defaultAccuracyRadiusColor: String?\n      /**\n       * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n       *\n       * Get the default value of AccuracyRadiusColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultAccuracyRadiusColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * This is an Expression representation of \"accuracy-radius-color\".\n     *\n     */\n    val defaultAccuracyRadiusColorAsExpression: Expression?\n      /**\n       * Get default value of the AccuracyRadiusColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     */\n    val defaultAccuracyRadiusColorAsColorInt: Int?\n      /**\n       * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n       *\n       * Get the default value of AccuracyRadiusColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultAccuracyRadiusColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for AccuracyRadiusColor.\n     */\n    val defaultAccuracyRadiusColorTransition: StyleTransition?\n      /**\n       * Get the AccuracyRadiusColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [accuracyRadiusColor].\n     */\n    @MapboxExperimental\n    val defaultAccuracyRadiusColorUseTheme: String?\n      /**\n       * Get default value of the AccuracyRadiusColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [accuracyRadiusColor].\n     */\n    @MapboxExperimental\n    val defaultAccuracyRadiusColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the AccuracyRadiusColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultAccuracyRadiusColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n     */\n    val defaultBearing: Double?\n      /**\n       * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n       *\n       * Get the default value of Bearing property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing\").silentUnwrap()\n      }\n\n    /**\n     * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n     *\n     * This is an Expression representation of \"bearing\".\n     *\n     */\n    val defaultBearingAsExpression: Expression?\n      /**\n       * Get default value of the Bearing property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultBearing?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for Bearing.\n     */\n    val defaultBearingTransition: StyleTransition?\n      /**\n       * Get the Bearing property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-transition\").silentUnwrap()\n\n    /**\n     * Name of image in sprite to use as the middle of the location indicator.\n     */\n    val defaultBearingImage: String?\n      /**\n       * Name of image in sprite to use as the middle of the location indicator.\n       *\n       * Get the default value of BearingImage property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image\").silentUnwrap()\n      }\n\n    /**\n     * Name of image in sprite to use as the middle of the location indicator.\n     *\n     * This is an Expression representation of \"bearing-image\".\n     *\n     */\n    val defaultBearingImageAsExpression: Expression?\n      /**\n       * Get default value of the BearingImage property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultBearingImage?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n     */\n    val defaultBearingImageSize: Double?\n      /**\n       * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n       *\n       * Get the default value of BearingImageSize property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image-size\").silentUnwrap()\n      }\n\n    /**\n     * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n     *\n     * This is an Expression representation of \"bearing-image-size\".\n     *\n     */\n    val defaultBearingImageSizeAsExpression: Expression?\n      /**\n       * Get default value of the BearingImageSize property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image-size\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultBearingImageSize?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for BearingImageSize.\n     */\n    val defaultBearingImageSizeTransition: StyleTransition?\n      /**\n       * Get the BearingImageSize property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image-size-transition\").silentUnwrap()\n\n    /**\n     * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     */\n    val defaultEmphasisCircleColor: String?\n      /**\n       * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n       *\n       * Get the default value of EmphasisCircleColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultEmphasisCircleColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     *\n     * This is an Expression representation of \"emphasis-circle-color\".\n     *\n     */\n    val defaultEmphasisCircleColorAsExpression: Expression?\n      /**\n       * Get default value of the EmphasisCircleColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n     */\n    val defaultEmphasisCircleColorAsColorInt: Int?\n      /**\n       * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n       *\n       * Get the default value of EmphasisCircleColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultEmphasisCircleColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for EmphasisCircleColor.\n     */\n    val defaultEmphasisCircleColorTransition: StyleTransition?\n      /**\n       * Get the EmphasisCircleColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [emphasisCircleColor].\n     */\n    @MapboxExperimental\n    val defaultEmphasisCircleColorUseTheme: String?\n      /**\n       * Get default value of the EmphasisCircleColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [emphasisCircleColor].\n     */\n    @MapboxExperimental\n    val defaultEmphasisCircleColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the EmphasisCircleColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultEmphasisCircleColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n     */\n    val defaultEmphasisCircleGlowRange: List<Double>?\n      /**\n       * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n       *\n       * Get the default value of EmphasisCircleGlowRange property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-glow-range\").silentUnwrap()\n      }\n\n    /**\n     * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n     *\n     * This is an Expression representation of \"emphasis-circle-glow-range\".\n     *\n     */\n    val defaultEmphasisCircleGlowRangeAsExpression: Expression?\n      /**\n       * Get default value of the EmphasisCircleGlowRange property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-glow-range\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultEmphasisCircleGlowRange?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for EmphasisCircleGlowRange.\n     */\n    val defaultEmphasisCircleGlowRangeTransition: StyleTransition?\n      /**\n       * Get the EmphasisCircleGlowRange property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-glow-range-transition\").silentUnwrap()\n\n    /**\n     * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n     */\n    val defaultEmphasisCircleRadius: Double?\n      /**\n       * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n       *\n       * Get the default value of EmphasisCircleRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-radius\").silentUnwrap()\n      }\n\n    /**\n     * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n     *\n     * This is an Expression representation of \"emphasis-circle-radius\".\n     *\n     */\n    val defaultEmphasisCircleRadiusAsExpression: Expression?\n      /**\n       * Get default value of the EmphasisCircleRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultEmphasisCircleRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for EmphasisCircleRadius.\n     */\n    val defaultEmphasisCircleRadiusTransition: StyleTransition?\n      /**\n       * Get the EmphasisCircleRadius property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-radius-transition\").silentUnwrap()\n\n    /**\n     * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n     */\n    val defaultImagePitchDisplacement: Double?\n      /**\n       * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n       *\n       * Get the default value of ImagePitchDisplacement property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"image-pitch-displacement\").silentUnwrap()\n      }\n\n    /**\n     * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n     *\n     * This is an Expression representation of \"image-pitch-displacement\".\n     *\n     */\n    val defaultImagePitchDisplacementAsExpression: Expression?\n      /**\n       * Get default value of the ImagePitchDisplacement property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"image-pitch-displacement\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultImagePitchDisplacement?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n     */\n    val defaultLocation: List<Double>?\n      /**\n       * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n       *\n       * Get the default value of Location property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location\").silentUnwrap()\n      }\n\n    /**\n     * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n     *\n     * This is an Expression representation of \"location\".\n     *\n     */\n    val defaultLocationAsExpression: Expression?\n      /**\n       * Get default value of the Location property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLocation?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for Location.\n     */\n    val defaultLocationTransition: StyleTransition?\n      /**\n       * Get the Location property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location-transition\").silentUnwrap()\n\n    /**\n     * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n     */\n    val defaultLocationIndicatorOpacity: Double?\n      /**\n       * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of LocationIndicatorOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location-indicator-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"location-indicator-opacity\".\n     *\n     */\n    val defaultLocationIndicatorOpacityAsExpression: Expression?\n      /**\n       * Get default value of the LocationIndicatorOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location-indicator-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultLocationIndicatorOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for LocationIndicatorOpacity.\n     */\n    val defaultLocationIndicatorOpacityTransition: StyleTransition?\n      /**\n       * Get the LocationIndicatorOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location-indicator-opacity-transition\").silentUnwrap()\n\n    /**\n     * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n     */\n    val defaultPerspectiveCompensation: Double?\n      /**\n       * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n       *\n       * Get the default value of PerspectiveCompensation property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"perspective-compensation\").silentUnwrap()\n      }\n\n    /**\n     * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n     *\n     * This is an Expression representation of \"perspective-compensation\".\n     *\n     */\n    val defaultPerspectiveCompensationAsExpression: Expression?\n      /**\n       * Get default value of the PerspectiveCompensation property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"perspective-compensation\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultPerspectiveCompensation?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Name of image in sprite to use as the background of the location indicator.\n     */\n    val defaultShadowImage: String?\n      /**\n       * Name of image in sprite to use as the background of the location indicator.\n       *\n       * Get the default value of ShadowImage property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image\").silentUnwrap()\n      }\n\n    /**\n     * Name of image in sprite to use as the background of the location indicator.\n     *\n     * This is an Expression representation of \"shadow-image\".\n     *\n     */\n    val defaultShadowImageAsExpression: Expression?\n      /**\n       * Get default value of the ShadowImage property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultShadowImage?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n     */\n    val defaultShadowImageSize: Double?\n      /**\n       * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n       *\n       * Get the default value of ShadowImageSize property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image-size\").silentUnwrap()\n      }\n\n    /**\n     * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n     *\n     * This is an Expression representation of \"shadow-image-size\".\n     *\n     */\n    val defaultShadowImageSizeAsExpression: Expression?\n      /**\n       * Get default value of the ShadowImageSize property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image-size\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultShadowImageSize?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ShadowImageSize.\n     */\n    val defaultShadowImageSizeTransition: StyleTransition?\n      /**\n       * Get the ShadowImageSize property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image-size-transition\").silentUnwrap()\n\n    /**\n     * Name of image in sprite to use as the top of the location indicator.\n     */\n    val defaultTopImage: String?\n      /**\n       * Name of image in sprite to use as the top of the location indicator.\n       *\n       * Get the default value of TopImage property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image\").silentUnwrap()\n      }\n\n    /**\n     * Name of image in sprite to use as the top of the location indicator.\n     *\n     * This is an Expression representation of \"top-image\".\n     *\n     */\n    val defaultTopImageAsExpression: Expression?\n      /**\n       * Get default value of the TopImage property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTopImage?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n     */\n    val defaultTopImageSize: Double?\n      /**\n       * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n       *\n       * Get the default value of TopImageSize property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image-size\").silentUnwrap()\n      }\n\n    /**\n     * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n     *\n     * This is an Expression representation of \"top-image-size\".\n     *\n     */\n    val defaultTopImageSizeAsExpression: Expression?\n      /**\n       * Get default value of the TopImageSize property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image-size\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTopImageSize?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for TopImageSize.\n     */\n    val defaultTopImageSizeTransition: StyleTransition?\n      /**\n       * Get the TopImageSize property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image-size-transition\").silentUnwrap()\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface LocationIndicatorLayerDsl {\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): LocationIndicatorLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): LocationIndicatorLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): LocationIndicatorLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): LocationIndicatorLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): LocationIndicatorLayer\n\n  // Property getters and setters\n\n  /**\n   * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n   *\n   * @param accuracyRadius value of accuracyRadius\n   */\n  fun accuracyRadius(accuracyRadius: Double = 0.0): LocationIndicatorLayer\n\n  /**\n   * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n   *\n   * @param accuracyRadius value of accuracyRadius as Expression\n   */\n  fun accuracyRadius(accuracyRadius: Expression): LocationIndicatorLayer\n\n  /**\n   * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n   *\n   * Set the AccuracyRadius property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun accuracyRadiusTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The accuracy, in meters, of the position source used to retrieve the position of the location indicator. Default value: 0. The unit of accuracyRadius is in meters.\n   *\n   * DSL for [accuracyRadiusTransition].\n   */\n  fun accuracyRadiusTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * @param accuracyRadiusBorderColor value of accuracyRadiusBorderColor\n   */\n  fun accuracyRadiusBorderColor(accuracyRadiusBorderColor: String = \"#ffffff\"): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * @param accuracyRadiusBorderColor value of accuracyRadiusBorderColor as Expression\n   */\n  fun accuracyRadiusBorderColor(accuracyRadiusBorderColor: Expression): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * @param accuracyRadiusBorderColor value of accuracyRadiusBorderColor\n   */\n  fun accuracyRadiusBorderColor(@ColorInt accuracyRadiusBorderColor: Int): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Set the AccuracyRadiusBorderColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun accuracyRadiusBorderColorTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * DSL for [accuracyRadiusBorderColorTransition].\n   */\n  fun accuracyRadiusBorderColorTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * Set the accuracyRadiusBorderColorUseTheme as String for [accuracyRadiusBorderColor].\n   *\n   * @param accuracyRadiusBorderColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun accuracyRadiusBorderColorUseTheme(accuracyRadiusBorderColorUseTheme: String): LocationIndicatorLayer\n\n  /**\n   * Set the accuracyRadiusBorderColorUseTheme as Expression for [accuracyRadiusBorderColor].\n   *\n   * @param accuracyRadiusBorderColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun accuracyRadiusBorderColorUseTheme(accuracyRadiusBorderColorUseTheme: Expression): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * @param accuracyRadiusColor value of accuracyRadiusColor\n   */\n  fun accuracyRadiusColor(accuracyRadiusColor: String = \"#ffffff\"): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * @param accuracyRadiusColor value of accuracyRadiusColor as Expression\n   */\n  fun accuracyRadiusColor(accuracyRadiusColor: Expression): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * @param accuracyRadiusColor value of accuracyRadiusColor\n   */\n  fun accuracyRadiusColor(@ColorInt accuracyRadiusColor: Int): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Set the AccuracyRadiusColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun accuracyRadiusColorTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The color for drawing the accuracy radius, as a circle. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * DSL for [accuracyRadiusColorTransition].\n   */\n  fun accuracyRadiusColorTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * Set the accuracyRadiusColorUseTheme as String for [accuracyRadiusColor].\n   *\n   * @param accuracyRadiusColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun accuracyRadiusColorUseTheme(accuracyRadiusColorUseTheme: String): LocationIndicatorLayer\n\n  /**\n   * Set the accuracyRadiusColorUseTheme as Expression for [accuracyRadiusColor].\n   *\n   * @param accuracyRadiusColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun accuracyRadiusColorUseTheme(accuracyRadiusColorUseTheme: Expression): LocationIndicatorLayer\n\n  /**\n   * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n   *\n   * @param bearing value of bearing\n   */\n  fun bearing(bearing: Double = 0.0): LocationIndicatorLayer\n\n  /**\n   * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n   *\n   * @param bearing value of bearing as Expression\n   */\n  fun bearing(bearing: Expression): LocationIndicatorLayer\n\n  /**\n   * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n   *\n   * Set the Bearing property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun bearingTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The bearing of the location indicator. Values under 0.01 degree variation are ignored. Default value: 0. The unit of bearing is in degrees.\n   *\n   * DSL for [bearingTransition].\n   */\n  fun bearingTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * Name of image in sprite to use as the middle of the location indicator.\n   *\n   * @param bearingImage value of bearingImage\n   */\n  fun bearingImage(bearingImage: String): LocationIndicatorLayer\n\n  /**\n   * Name of image in sprite to use as the middle of the location indicator.\n   *\n   * @param bearingImage value of bearingImage as Expression\n   */\n  fun bearingImage(bearingImage: Expression): LocationIndicatorLayer\n\n  /**\n   * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n   *\n   * @param bearingImageSize value of bearingImageSize\n   */\n  fun bearingImageSize(bearingImageSize: Double = 1.0): LocationIndicatorLayer\n\n  /**\n   * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n   *\n   * @param bearingImageSize value of bearingImageSize as Expression\n   */\n  fun bearingImageSize(bearingImageSize: Expression): LocationIndicatorLayer\n\n  /**\n   * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n   *\n   * Set the BearingImageSize property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun bearingImageSizeTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The size of the bearing image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of bearingImageSize is in factor of the original icon size.\n   *\n   * DSL for [bearingImageSizeTransition].\n   */\n  fun bearingImageSizeTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * @param emphasisCircleColor value of emphasisCircleColor\n   */\n  fun emphasisCircleColor(emphasisCircleColor: String = \"#ffffff\"): LocationIndicatorLayer\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * @param emphasisCircleColor value of emphasisCircleColor as Expression\n   */\n  fun emphasisCircleColor(emphasisCircleColor: Expression): LocationIndicatorLayer\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * @param emphasisCircleColor value of emphasisCircleColor\n   */\n  fun emphasisCircleColor(@ColorInt emphasisCircleColor: Int): LocationIndicatorLayer\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * Set the EmphasisCircleColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun emphasisCircleColorTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The color of the circle emphasizing the indicator. To adjust transparency, set the alpha component of the color accordingly. Default value: \"#ffffff\".\n   *\n   * DSL for [emphasisCircleColorTransition].\n   */\n  fun emphasisCircleColorTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * Set the emphasisCircleColorUseTheme as String for [emphasisCircleColor].\n   *\n   * @param emphasisCircleColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun emphasisCircleColorUseTheme(emphasisCircleColorUseTheme: String): LocationIndicatorLayer\n\n  /**\n   * Set the emphasisCircleColorUseTheme as Expression for [emphasisCircleColor].\n   *\n   * @param emphasisCircleColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun emphasisCircleColorUseTheme(emphasisCircleColorUseTheme: Expression): LocationIndicatorLayer\n\n  /**\n   * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n   *\n   * @param emphasisCircleGlowRange value of emphasisCircleGlowRange\n   */\n  fun emphasisCircleGlowRange(emphasisCircleGlowRange: List<Double> = listOf(0.0, 0.0)): LocationIndicatorLayer\n\n  /**\n   * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n   *\n   * @param emphasisCircleGlowRange value of emphasisCircleGlowRange as Expression\n   */\n  fun emphasisCircleGlowRange(emphasisCircleGlowRange: Expression): LocationIndicatorLayer\n\n  /**\n   * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n   *\n   * Set the EmphasisCircleGlowRange property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun emphasisCircleGlowRangeTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * Specifies a glow effect range of the emphasis circle, in pixels. If [0,0] values are provided, it renders the circle as a solid color. The first value specifies the start of the glow effect where it is equal to the circle's color, the second is the end, where it's fully transparent. Between the two values the effect is linearly faded out. Default value: [0,0].\n   *\n   * DSL for [emphasisCircleGlowRangeTransition].\n   */\n  fun emphasisCircleGlowRangeTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n   *\n   * @param emphasisCircleRadius value of emphasisCircleRadius\n   */\n  fun emphasisCircleRadius(emphasisCircleRadius: Double = 0.0): LocationIndicatorLayer\n\n  /**\n   * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n   *\n   * @param emphasisCircleRadius value of emphasisCircleRadius as Expression\n   */\n  fun emphasisCircleRadius(emphasisCircleRadius: Expression): LocationIndicatorLayer\n\n  /**\n   * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n   *\n   * Set the EmphasisCircleRadius property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun emphasisCircleRadiusTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The radius, in pixel, of the circle emphasizing the indicator, drawn between the accuracy radius and the indicator shadow. Default value: 0. The unit of emphasisCircleRadius is in pixels.\n   *\n   * DSL for [emphasisCircleRadiusTransition].\n   */\n  fun emphasisCircleRadiusTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n   *\n   * @param imagePitchDisplacement value of imagePitchDisplacement\n   */\n  fun imagePitchDisplacement(imagePitchDisplacement: Double = 0.0): LocationIndicatorLayer\n\n  /**\n   * The displacement off the center of the top image and the shadow image when the pitch of the map is greater than 0. This helps producing a three-dimensional appearence. Default value: \"0\". The unit of imagePitchDisplacement is in pixels.\n   *\n   * @param imagePitchDisplacement value of imagePitchDisplacement as Expression\n   */\n  fun imagePitchDisplacement(imagePitchDisplacement: Expression): LocationIndicatorLayer\n\n  /**\n   * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n   *\n   * @param location value of location\n   */\n  fun location(location: List<Double> = listOf(0.0, 0.0, 0.0)): LocationIndicatorLayer\n\n  /**\n   * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n   *\n   * @param location value of location as Expression\n   */\n  fun location(location: Expression): LocationIndicatorLayer\n\n  /**\n   * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n   *\n   * Set the Location property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun locationTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * An array of [latitude, longitude, altitude] position of the location indicator. Values under 0.000001 variation are ignored. Default value: [0,0,0].\n   *\n   * DSL for [locationTransition].\n   */\n  fun locationTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n   *\n   * @param locationIndicatorOpacity value of locationIndicatorOpacity\n   */\n  fun locationIndicatorOpacity(locationIndicatorOpacity: Double = 1.0): LocationIndicatorLayer\n\n  /**\n   * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n   *\n   * @param locationIndicatorOpacity value of locationIndicatorOpacity as Expression\n   */\n  fun locationIndicatorOpacity(locationIndicatorOpacity: Expression): LocationIndicatorLayer\n\n  /**\n   * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n   *\n   * Set the LocationIndicatorOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun locationIndicatorOpacityTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The opacity of the entire location indicator layer. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [locationIndicatorOpacityTransition].\n   */\n  fun locationIndicatorOpacityTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n   *\n   * @param perspectiveCompensation value of perspectiveCompensation\n   */\n  fun perspectiveCompensation(perspectiveCompensation: Double = 0.85): LocationIndicatorLayer\n\n  /**\n   * The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection. Default value: \"0.85\".\n   *\n   * @param perspectiveCompensation value of perspectiveCompensation as Expression\n   */\n  fun perspectiveCompensation(perspectiveCompensation: Expression): LocationIndicatorLayer\n\n  /**\n   * Name of image in sprite to use as the background of the location indicator.\n   *\n   * @param shadowImage value of shadowImage\n   */\n  fun shadowImage(shadowImage: String): LocationIndicatorLayer\n\n  /**\n   * Name of image in sprite to use as the background of the location indicator.\n   *\n   * @param shadowImage value of shadowImage as Expression\n   */\n  fun shadowImage(shadowImage: Expression): LocationIndicatorLayer\n\n  /**\n   * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n   *\n   * @param shadowImageSize value of shadowImageSize\n   */\n  fun shadowImageSize(shadowImageSize: Double = 1.0): LocationIndicatorLayer\n\n  /**\n   * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n   *\n   * @param shadowImageSize value of shadowImageSize as Expression\n   */\n  fun shadowImageSize(shadowImageSize: Expression): LocationIndicatorLayer\n\n  /**\n   * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n   *\n   * Set the ShadowImageSize property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun shadowImageSizeTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The size of the shadow image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of shadowImageSize is in factor of the original icon size.\n   *\n   * DSL for [shadowImageSizeTransition].\n   */\n  fun shadowImageSizeTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n\n  /**\n   * Name of image in sprite to use as the top of the location indicator.\n   *\n   * @param topImage value of topImage\n   */\n  fun topImage(topImage: String): LocationIndicatorLayer\n\n  /**\n   * Name of image in sprite to use as the top of the location indicator.\n   *\n   * @param topImage value of topImage as Expression\n   */\n  fun topImage(topImage: Expression): LocationIndicatorLayer\n\n  /**\n   * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n   *\n   * @param topImageSize value of topImageSize\n   */\n  fun topImageSize(topImageSize: Double = 1.0): LocationIndicatorLayer\n\n  /**\n   * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n   *\n   * @param topImageSize value of topImageSize as Expression\n   */\n  fun topImageSize(topImageSize: Expression): LocationIndicatorLayer\n\n  /**\n   * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n   *\n   * Set the TopImageSize property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun topImageSizeTransition(options: StyleTransition): LocationIndicatorLayer\n\n  /**\n   * The size of the top image, as a scale factor applied to the size of the specified image. Default value: 1. The unit of topImageSize is in factor of the original icon size.\n   *\n   * DSL for [topImageSizeTransition].\n   */\n  fun topImageSizeTransition(block: StyleTransition.Builder.() -> Unit): LocationIndicatorLayer\n}\n\n/**\n * DSL function for creating a [LocationIndicatorLayer].\n */\nfun locationIndicatorLayer(layerId: String, block: LocationIndicatorLayerDsl.() -> Unit): LocationIndicatorLayer = LocationIndicatorLayer(layerId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/ModelLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A 3D model\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#model)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass ModelLayer(override val layerId: String, val sourceId: String) : ModelLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): ModelLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): ModelLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [ModelLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [ModelLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [ModelLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[ModelLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [ModelLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [ModelLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): ModelLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [ModelLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [ModelLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): ModelLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n   */\n  @MapboxExperimental\n  val modelAllowDensityReduction: Boolean?\n    /**\n     * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n     *\n     * Use static method [ModelLayer.defaultModelAllowDensityReduction] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"model-allow-density-reduction\")\n    }\n\n  /**\n   * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n   *\n   * Use static method [ModelLayer.defaultModelAllowDensityReduction] to set the default property.\n   *\n   * @param modelAllowDensityReduction value of modelAllowDensityReduction\n   */\n  @MapboxExperimental\n  override fun modelAllowDensityReduction(modelAllowDensityReduction: Boolean): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-allow-density-reduction\", modelAllowDensityReduction)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n   *\n   * This is an Expression representation of \"model-allow-density-reduction\".\n   *\n   */\n  @MapboxExperimental\n  val modelAllowDensityReductionAsExpression: Expression?\n    /**\n     * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n     *\n     * Get the ModelAllowDensityReduction property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelAllowDensityReductionAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-allow-density-reduction\")\n\n  /**\n   * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n   *\n   * Use static method [ModelLayer.defaultModelAllowDensityReductionAsExpression] to set the default property.\n   *\n   * @param modelAllowDensityReduction value of modelAllowDensityReduction as Expression\n   */\n  @MapboxExperimental\n  override fun modelAllowDensityReduction(modelAllowDensityReduction: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-allow-density-reduction\", modelAllowDensityReduction)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n   */\n  val modelId: String?\n    /**\n     * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n     *\n     * Use static method [ModelLayer.defaultModelId] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"model-id\")\n    }\n\n  /**\n   * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n   *\n   * Use static method [ModelLayer.defaultModelId] to set the default property.\n   *\n   * @param modelId value of modelId\n   */\n  override fun modelId(modelId: String): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-id\", modelId)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n   *\n   * This is an Expression representation of \"model-id\".\n   *\n   */\n  val modelIdAsExpression: Expression?\n    /**\n     * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n     *\n     * Get the ModelId property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelIdAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-id\")\n\n  /**\n   * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n   *\n   * Use static method [ModelLayer.defaultModelIdAsExpression] to set the default property.\n   *\n   * @param modelId value of modelId as Expression\n   */\n  override fun modelId(modelId: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-id\", modelId)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n   */\n  val modelAmbientOcclusionIntensity: Double?\n    /**\n     * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [ModelLayer.defaultModelAmbientOcclusionIntensity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"model-ambient-occlusion-intensity\")\n    }\n\n  /**\n   * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelAmbientOcclusionIntensity] to set the default property.\n   *\n   * @param modelAmbientOcclusionIntensity value of modelAmbientOcclusionIntensity\n   */\n  override fun modelAmbientOcclusionIntensity(modelAmbientOcclusionIntensity: Double): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-ambient-occlusion-intensity\", modelAmbientOcclusionIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"model-ambient-occlusion-intensity\".\n   *\n   */\n  val modelAmbientOcclusionIntensityAsExpression: Expression?\n    /**\n     * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n     *\n     * Get the ModelAmbientOcclusionIntensity property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelAmbientOcclusionIntensityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-ambient-occlusion-intensity\")\n\n  /**\n   * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelAmbientOcclusionIntensityAsExpression] to set the default property.\n   *\n   * @param modelAmbientOcclusionIntensity value of modelAmbientOcclusionIntensity as Expression\n   */\n  override fun modelAmbientOcclusionIntensity(modelAmbientOcclusionIntensity: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-ambient-occlusion-intensity\", modelAmbientOcclusionIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelAmbientOcclusionIntensity.\n   */\n  val modelAmbientOcclusionIntensityTransition: StyleTransition?\n    /**\n     * Get the ModelAmbientOcclusionIntensity property transition options\n     *\n     * Use static method [ModelLayer.defaultModelAmbientOcclusionIntensityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"model-ambient-occlusion-intensity-transition\")\n    }\n\n  /**\n   * Set the ModelAmbientOcclusionIntensity property transition options\n   *\n   * Use static method [ModelLayer.defaultModelAmbientOcclusionIntensityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun modelAmbientOcclusionIntensityTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-ambient-occlusion-intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelAmbientOcclusionIntensityTransition].\n   */\n  override fun modelAmbientOcclusionIntensityTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelAmbientOcclusionIntensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   */\n  val modelCastShadows: Boolean?\n    /**\n     * Enable/Disable shadow casting for this layer Default value: true.\n     *\n     * Use static method [ModelLayer.defaultModelCastShadows] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"model-cast-shadows\")\n    }\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * Use static method [ModelLayer.defaultModelCastShadows] to set the default property.\n   *\n   * @param modelCastShadows value of modelCastShadows\n   */\n  override fun modelCastShadows(modelCastShadows: Boolean): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-cast-shadows\", modelCastShadows)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * This is an Expression representation of \"model-cast-shadows\".\n   *\n   */\n  val modelCastShadowsAsExpression: Expression?\n    /**\n     * Enable/Disable shadow casting for this layer Default value: true.\n     *\n     * Get the ModelCastShadows property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelCastShadowsAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-cast-shadows\")\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * Use static method [ModelLayer.defaultModelCastShadowsAsExpression] to set the default property.\n   *\n   * @param modelCastShadows value of modelCastShadows as Expression\n   */\n  override fun modelCastShadows(modelCastShadows: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-cast-shadows\", modelCastShadows)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   */\n  val modelColor: String?\n    /**\n     * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n     *\n     * Use static method [ModelLayer.defaultModelColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      modelColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   *\n   * Use static method [ModelLayer.defaultModelColor] to set the default property.\n   *\n   * @param modelColor value of modelColor\n   */\n  override fun modelColor(modelColor: String): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-color\", modelColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"model-color\".\n   *\n   */\n  val modelColorAsExpression: Expression?\n    /**\n     * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n     *\n     * Get the ModelColor property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"model-color\")\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   *\n   * Use static method [ModelLayer.defaultModelColorAsExpression] to set the default property.\n   *\n   * @param modelColor value of modelColor as Expression\n   */\n  override fun modelColor(modelColor: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-color\", modelColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   */\n  val modelColorAsColorInt: Int?\n    /**\n     * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n     *\n     * Use static method [ModelLayer.defaultModelColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      modelColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   *\n   * Use static method [ModelLayer.defaultModelColorAsColorInt] to set the default property.\n   *\n   * @param modelColor value of modelColor\n   */\n  override fun modelColor(@ColorInt modelColor: Int): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-color\", colorIntToRgbaExpression(modelColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelColor.\n   */\n  val modelColorTransition: StyleTransition?\n    /**\n     * Get the ModelColor property transition options\n     *\n     * Use static method [ModelLayer.defaultModelColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"model-color-transition\")\n    }\n\n  /**\n   * Set the ModelColor property transition options\n   *\n   * Use static method [ModelLayer.defaultModelColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun modelColorTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelColorTransition].\n   */\n  override fun modelColorTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [modelColor].\n   */\n  @MapboxExperimental\n  val modelColorUseTheme: String?\n    /**\n     * Get the ModelColorUseTheme property\n     *\n     * Use static method [ModelLayer.defaultModelColorUseTheme] to get the default property.\n     *\n     * @return current ModelColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"model-color-use-theme\")\n    }\n\n  /**\n   * Set the ModelColorUseTheme as String\n   *\n   * Use static method [ModelLayer.defaultModelColorUseTheme] to get the default property.\n   *\n   * @param modelColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun modelColorUseTheme(modelColorUseTheme: String): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-color-use-theme\", modelColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [modelColor].\n   */\n  @MapboxExperimental\n  val modelColorUseThemeAsExpression: Expression?\n    /**\n     * Get the ModelColorUseTheme property\n     *\n     * Use static method [ModelLayer.defaultModelColorUseTheme] to get the default property.\n     *\n     * @return current ModelColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"model-color-use-theme\")\n\n  /**\n   * Set the ModelColorUseTheme as Expression\n   *\n   * Use static method [ModelLayer.defaultModelColorUseTheme] to get the default property.\n   *\n   * @param modelColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun modelColorUseTheme(modelColorUseTheme: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-color-use-theme\", modelColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   */\n  val modelColorMixIntensity: Double?\n    /**\n     * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [ModelLayer.defaultModelColorMixIntensity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"model-color-mix-intensity\")\n    }\n\n  /**\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelColorMixIntensity] to set the default property.\n   *\n   * @param modelColorMixIntensity value of modelColorMixIntensity\n   */\n  override fun modelColorMixIntensity(modelColorMixIntensity: Double): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-color-mix-intensity\", modelColorMixIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"model-color-mix-intensity\".\n   *\n   */\n  val modelColorMixIntensityAsExpression: Expression?\n    /**\n     * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n     *\n     * Get the ModelColorMixIntensity property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelColorMixIntensityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-color-mix-intensity\")\n\n  /**\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelColorMixIntensityAsExpression] to set the default property.\n   *\n   * @param modelColorMixIntensity value of modelColorMixIntensity as Expression\n   */\n  override fun modelColorMixIntensity(modelColorMixIntensity: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-color-mix-intensity\", modelColorMixIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelColorMixIntensity.\n   */\n  val modelColorMixIntensityTransition: StyleTransition?\n    /**\n     * Get the ModelColorMixIntensity property transition options\n     *\n     * Use static method [ModelLayer.defaultModelColorMixIntensityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"model-color-mix-intensity-transition\")\n    }\n\n  /**\n   * Set the ModelColorMixIntensity property transition options\n   *\n   * Use static method [ModelLayer.defaultModelColorMixIntensityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun modelColorMixIntensityTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-color-mix-intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelColorMixIntensityTransition].\n   */\n  override fun modelColorMixIntensityTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelColorMixIntensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   */\n  val modelCutoffFadeRange: Double?\n    /**\n     * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [ModelLayer.defaultModelCutoffFadeRange] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"model-cutoff-fade-range\")\n    }\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelCutoffFadeRange] to set the default property.\n   *\n   * @param modelCutoffFadeRange value of modelCutoffFadeRange\n   */\n  override fun modelCutoffFadeRange(modelCutoffFadeRange: Double): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-cutoff-fade-range\", modelCutoffFadeRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"model-cutoff-fade-range\".\n   *\n   */\n  val modelCutoffFadeRangeAsExpression: Expression?\n    /**\n     * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n     *\n     * Get the ModelCutoffFadeRange property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelCutoffFadeRangeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-cutoff-fade-range\")\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelCutoffFadeRangeAsExpression] to set the default property.\n   *\n   * @param modelCutoffFadeRange value of modelCutoffFadeRange as Expression\n   */\n  override fun modelCutoffFadeRange(modelCutoffFadeRange: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-cutoff-fade-range\", modelCutoffFadeRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n   */\n  val modelElevationReference: ModelElevationReference?\n    /**\n     * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n     *\n     * Use static method [ModelLayer.defaultModelElevationReference] to get the default property.\n     *\n     * @return ModelElevationReference\n     */\n    get() {\n      getPropertyValue<String?>(\"model-elevation-reference\")?.let {\n        return ModelElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n   *\n   * Use static method [ModelLayer.defaultModelElevationReference] to set the default property.\n   *\n   * @param modelElevationReference value of modelElevationReference\n   */\n  override fun modelElevationReference(modelElevationReference: ModelElevationReference): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-elevation-reference\", modelElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n   *\n   * This is an Expression representation of \"model-elevation-reference\".\n   *\n   */\n  val modelElevationReferenceAsExpression: Expression?\n    /**\n     * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n     *\n     * Get the ModelElevationReference property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelElevationReferenceAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"model-elevation-reference\")\n        ?: modelElevationReference?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n   *\n   * Use static method [ModelLayer.defaultModelElevationReferenceAsExpression] to set the default property.\n   *\n   * @param modelElevationReference value of modelElevationReference as Expression\n   */\n  override fun modelElevationReference(modelElevationReference: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-elevation-reference\", modelElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n   */\n  val modelEmissiveStrength: Double?\n    /**\n     * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n     *\n     * Use static method [ModelLayer.defaultModelEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"model-emissive-strength\")\n    }\n\n  /**\n   * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n   *\n   * Use static method [ModelLayer.defaultModelEmissiveStrength] to set the default property.\n   *\n   * @param modelEmissiveStrength value of modelEmissiveStrength\n   */\n  override fun modelEmissiveStrength(modelEmissiveStrength: Double): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-emissive-strength\", modelEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n   *\n   * This is an Expression representation of \"model-emissive-strength\".\n   *\n   */\n  val modelEmissiveStrengthAsExpression: Expression?\n    /**\n     * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n     *\n     * Get the ModelEmissiveStrength property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-emissive-strength\")\n\n  /**\n   * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n   *\n   * Use static method [ModelLayer.defaultModelEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param modelEmissiveStrength value of modelEmissiveStrength as Expression\n   */\n  override fun modelEmissiveStrength(modelEmissiveStrength: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-emissive-strength\", modelEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelEmissiveStrength.\n   */\n  val modelEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the ModelEmissiveStrength property transition options\n     *\n     * Use static method [ModelLayer.defaultModelEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"model-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the ModelEmissiveStrength property transition options\n   *\n   * Use static method [ModelLayer.defaultModelEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun modelEmissiveStrengthTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelEmissiveStrengthTransition].\n   */\n  override fun modelEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n   */\n  val modelHeightBasedEmissiveStrengthMultiplier: List<Double>?\n    /**\n     * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n     *\n     * Use static method [ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplier] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"model-height-based-emissive-strength-multiplier\")\n    }\n\n  /**\n   * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n   *\n   * Use static method [ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplier] to set the default property.\n   *\n   * @param modelHeightBasedEmissiveStrengthMultiplier value of modelHeightBasedEmissiveStrengthMultiplier\n   */\n  override fun modelHeightBasedEmissiveStrengthMultiplier(modelHeightBasedEmissiveStrengthMultiplier: List<Double>): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-height-based-emissive-strength-multiplier\", modelHeightBasedEmissiveStrengthMultiplier)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n   *\n   * This is an Expression representation of \"model-height-based-emissive-strength-multiplier\".\n   *\n   */\n  val modelHeightBasedEmissiveStrengthMultiplierAsExpression: Expression?\n    /**\n     * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n     *\n     * Get the ModelHeightBasedEmissiveStrengthMultiplier property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplierAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-height-based-emissive-strength-multiplier\")\n\n  /**\n   * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n   *\n   * Use static method [ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplierAsExpression] to set the default property.\n   *\n   * @param modelHeightBasedEmissiveStrengthMultiplier value of modelHeightBasedEmissiveStrengthMultiplier as Expression\n   */\n  override fun modelHeightBasedEmissiveStrengthMultiplier(modelHeightBasedEmissiveStrengthMultiplier: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-height-based-emissive-strength-multiplier\", modelHeightBasedEmissiveStrengthMultiplier)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelHeightBasedEmissiveStrengthMultiplier.\n   */\n  val modelHeightBasedEmissiveStrengthMultiplierTransition: StyleTransition?\n    /**\n     * Get the ModelHeightBasedEmissiveStrengthMultiplier property transition options\n     *\n     * Use static method [ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplierTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"model-height-based-emissive-strength-multiplier-transition\")\n    }\n\n  /**\n   * Set the ModelHeightBasedEmissiveStrengthMultiplier property transition options\n   *\n   * Use static method [ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplierTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun modelHeightBasedEmissiveStrengthMultiplierTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-height-based-emissive-strength-multiplier-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelHeightBasedEmissiveStrengthMultiplierTransition].\n   */\n  override fun modelHeightBasedEmissiveStrengthMultiplierTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelHeightBasedEmissiveStrengthMultiplierTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n   */\n  val modelOpacity: Double?\n    /**\n     * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [ModelLayer.defaultModelOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"model-opacity\")\n    }\n\n  /**\n   * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelOpacity] to set the default property.\n   *\n   * @param modelOpacity value of modelOpacity\n   */\n  override fun modelOpacity(modelOpacity: Double): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-opacity\", modelOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"model-opacity\".\n   *\n   */\n  val modelOpacityAsExpression: Expression?\n    /**\n     * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n     *\n     * Get the ModelOpacity property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-opacity\")\n\n  /**\n   * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelOpacityAsExpression] to set the default property.\n   *\n   * @param modelOpacity value of modelOpacity as Expression\n   */\n  override fun modelOpacity(modelOpacity: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-opacity\", modelOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelOpacity.\n   */\n  val modelOpacityTransition: StyleTransition?\n    /**\n     * Get the ModelOpacity property transition options\n     *\n     * Use static method [ModelLayer.defaultModelOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"model-opacity-transition\")\n    }\n\n  /**\n   * Set the ModelOpacity property transition options\n   *\n   * Use static method [ModelLayer.defaultModelOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun modelOpacityTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelOpacityTransition].\n   */\n  override fun modelOpacityTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Enable/Disable shadow receiving for this layer Default value: true.\n   */\n  val modelReceiveShadows: Boolean?\n    /**\n     * Enable/Disable shadow receiving for this layer Default value: true.\n     *\n     * Use static method [ModelLayer.defaultModelReceiveShadows] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"model-receive-shadows\")\n    }\n\n  /**\n   * Enable/Disable shadow receiving for this layer Default value: true.\n   *\n   * Use static method [ModelLayer.defaultModelReceiveShadows] to set the default property.\n   *\n   * @param modelReceiveShadows value of modelReceiveShadows\n   */\n  override fun modelReceiveShadows(modelReceiveShadows: Boolean): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-receive-shadows\", modelReceiveShadows)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Enable/Disable shadow receiving for this layer Default value: true.\n   *\n   * This is an Expression representation of \"model-receive-shadows\".\n   *\n   */\n  val modelReceiveShadowsAsExpression: Expression?\n    /**\n     * Enable/Disable shadow receiving for this layer Default value: true.\n     *\n     * Get the ModelReceiveShadows property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelReceiveShadowsAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-receive-shadows\")\n\n  /**\n   * Enable/Disable shadow receiving for this layer Default value: true.\n   *\n   * Use static method [ModelLayer.defaultModelReceiveShadowsAsExpression] to set the default property.\n   *\n   * @param modelReceiveShadows value of modelReceiveShadows as Expression\n   */\n  override fun modelReceiveShadows(modelReceiveShadows: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-receive-shadows\", modelReceiveShadows)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n   */\n  val modelRotation: List<Double>?\n    /**\n     * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n     *\n     * Use static method [ModelLayer.defaultModelRotation] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"model-rotation\")\n    }\n\n  /**\n   * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n   *\n   * Use static method [ModelLayer.defaultModelRotation] to set the default property.\n   *\n   * @param modelRotation value of modelRotation\n   */\n  override fun modelRotation(modelRotation: List<Double>): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-rotation\", modelRotation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n   *\n   * This is an Expression representation of \"model-rotation\".\n   *\n   */\n  val modelRotationAsExpression: Expression?\n    /**\n     * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n     *\n     * Get the ModelRotation property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelRotationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-rotation\")\n\n  /**\n   * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n   *\n   * Use static method [ModelLayer.defaultModelRotationAsExpression] to set the default property.\n   *\n   * @param modelRotation value of modelRotation as Expression\n   */\n  override fun modelRotation(modelRotation: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-rotation\", modelRotation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelRotation.\n   */\n  val modelRotationTransition: StyleTransition?\n    /**\n     * Get the ModelRotation property transition options\n     *\n     * Use static method [ModelLayer.defaultModelRotationTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"model-rotation-transition\")\n    }\n\n  /**\n   * Set the ModelRotation property transition options\n   *\n   * Use static method [ModelLayer.defaultModelRotationTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun modelRotationTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-rotation-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelRotationTransition].\n   */\n  override fun modelRotationTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelRotationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n   */\n  val modelRoughness: Double?\n    /**\n     * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [ModelLayer.defaultModelRoughness] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"model-roughness\")\n    }\n\n  /**\n   * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelRoughness] to set the default property.\n   *\n   * @param modelRoughness value of modelRoughness\n   */\n  override fun modelRoughness(modelRoughness: Double): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-roughness\", modelRoughness)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"model-roughness\".\n   *\n   */\n  val modelRoughnessAsExpression: Expression?\n    /**\n     * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n     *\n     * Get the ModelRoughness property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelRoughnessAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-roughness\")\n\n  /**\n   * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [ModelLayer.defaultModelRoughnessAsExpression] to set the default property.\n   *\n   * @param modelRoughness value of modelRoughness as Expression\n   */\n  override fun modelRoughness(modelRoughness: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-roughness\", modelRoughness)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelRoughness.\n   */\n  val modelRoughnessTransition: StyleTransition?\n    /**\n     * Get the ModelRoughness property transition options\n     *\n     * Use static method [ModelLayer.defaultModelRoughnessTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"model-roughness-transition\")\n    }\n\n  /**\n   * Set the ModelRoughness property transition options\n   *\n   * Use static method [ModelLayer.defaultModelRoughnessTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun modelRoughnessTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-roughness-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelRoughnessTransition].\n   */\n  override fun modelRoughnessTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelRoughnessTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n   */\n  val modelScale: List<Double>?\n    /**\n     * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n     *\n     * Use static method [ModelLayer.defaultModelScale] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"model-scale\")\n    }\n\n  /**\n   * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n   *\n   * Use static method [ModelLayer.defaultModelScale] to set the default property.\n   *\n   * @param modelScale value of modelScale\n   */\n  override fun modelScale(modelScale: List<Double>): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-scale\", modelScale)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n   *\n   * This is an Expression representation of \"model-scale\".\n   *\n   */\n  val modelScaleAsExpression: Expression?\n    /**\n     * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n     *\n     * Get the ModelScale property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelScaleAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-scale\")\n\n  /**\n   * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n   *\n   * Use static method [ModelLayer.defaultModelScaleAsExpression] to set the default property.\n   *\n   * @param modelScale value of modelScale as Expression\n   */\n  override fun modelScale(modelScale: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-scale\", modelScale)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelScale.\n   */\n  val modelScaleTransition: StyleTransition?\n    /**\n     * Get the ModelScale property transition options\n     *\n     * Use static method [ModelLayer.defaultModelScaleTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"model-scale-transition\")\n    }\n\n  /**\n   * Set the ModelScale property transition options\n   *\n   * Use static method [ModelLayer.defaultModelScaleTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun modelScaleTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-scale-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelScaleTransition].\n   */\n  override fun modelScaleTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelScaleTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n   */\n  val modelScaleMode: ModelScaleMode?\n    /**\n     * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n     *\n     * Use static method [ModelLayer.defaultModelScaleMode] to get the default property.\n     *\n     * @return ModelScaleMode\n     */\n    get() {\n      getPropertyValue<String?>(\"model-scale-mode\")?.let {\n        return ModelScaleMode.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n   *\n   * Use static method [ModelLayer.defaultModelScaleMode] to set the default property.\n   *\n   * @param modelScaleMode value of modelScaleMode\n   */\n  override fun modelScaleMode(modelScaleMode: ModelScaleMode): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-scale-mode\", modelScaleMode)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n   *\n   * This is an Expression representation of \"model-scale-mode\".\n   *\n   */\n  val modelScaleModeAsExpression: Expression?\n    /**\n     * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n     *\n     * Get the ModelScaleMode property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelScaleModeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"model-scale-mode\")\n        ?: modelScaleMode?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n   *\n   * Use static method [ModelLayer.defaultModelScaleModeAsExpression] to set the default property.\n   *\n   * @param modelScaleMode value of modelScaleMode as Expression\n   */\n  override fun modelScaleMode(modelScaleMode: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-scale-mode\", modelScaleMode)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n   */\n  val modelTranslation: List<Double>?\n    /**\n     * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n     *\n     * Use static method [ModelLayer.defaultModelTranslation] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"model-translation\")\n    }\n\n  /**\n   * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n   *\n   * Use static method [ModelLayer.defaultModelTranslation] to set the default property.\n   *\n   * @param modelTranslation value of modelTranslation\n   */\n  override fun modelTranslation(modelTranslation: List<Double>): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-translation\", modelTranslation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n   *\n   * This is an Expression representation of \"model-translation\".\n   *\n   */\n  val modelTranslationAsExpression: Expression?\n    /**\n     * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n     *\n     * Get the ModelTranslation property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelTranslationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"model-translation\")\n\n  /**\n   * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n   *\n   * Use static method [ModelLayer.defaultModelTranslationAsExpression] to set the default property.\n   *\n   * @param modelTranslation value of modelTranslation as Expression\n   */\n  override fun modelTranslation(modelTranslation: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-translation\", modelTranslation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for ModelTranslation.\n   */\n  val modelTranslationTransition: StyleTransition?\n    /**\n     * Get the ModelTranslation property transition options\n     *\n     * Use static method [ModelLayer.defaultModelTranslationTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"model-translation-transition\")\n    }\n\n  /**\n   * Set the ModelTranslation property transition options\n   *\n   * Use static method [ModelLayer.defaultModelTranslationTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun modelTranslationTransition(options: StyleTransition): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-translation-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [modelTranslationTransition].\n   */\n  override fun modelTranslationTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer = apply {\n    modelTranslationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n   */\n  val modelType: ModelType?\n    /**\n     * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n     *\n     * Use static method [ModelLayer.defaultModelType] to get the default property.\n     *\n     * @return ModelType\n     */\n    get() {\n      getPropertyValue<String?>(\"model-type\")?.let {\n        return ModelType.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n   *\n   * Use static method [ModelLayer.defaultModelType] to set the default property.\n   *\n   * @param modelType value of modelType\n   */\n  override fun modelType(modelType: ModelType): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-type\", modelType)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n   *\n   * This is an Expression representation of \"model-type\".\n   *\n   */\n  val modelTypeAsExpression: Expression?\n    /**\n     * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n     *\n     * Get the ModelType property as an Expression\n     *\n     * Use static method [ModelLayer.defaultModelTypeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"model-type\")\n        ?: modelType?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n   *\n   * Use static method [ModelLayer.defaultModelTypeAsExpression] to set the default property.\n   *\n   * @param modelType value of modelType as Expression\n   */\n  override fun modelType(modelType: Expression): ModelLayer = apply {\n    val propertyValue = PropertyValue(\"model-type\", modelType)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"model\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n     */\n    @MapboxExperimental\n    val defaultModelAllowDensityReduction: Boolean?\n      /**\n       * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n       *\n       * Get the default value of ModelAllowDensityReduction property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-allow-density-reduction\").silentUnwrap()\n      }\n\n    /**\n     * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n     *\n     * This is an Expression representation of \"model-allow-density-reduction\".\n     *\n     */\n    @MapboxExperimental\n    val defaultModelAllowDensityReductionAsExpression: Expression?\n      /**\n       * Get default value of the ModelAllowDensityReduction property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-allow-density-reduction\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelAllowDensityReduction?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n     */\n    val defaultModelId: String?\n      /**\n       * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n       *\n       * Get the default value of ModelId property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-id\").silentUnwrap()\n      }\n\n    /**\n     * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n     *\n     * This is an Expression representation of \"model-id\".\n     *\n     */\n    val defaultModelIdAsExpression: Expression?\n      /**\n       * Get default value of the ModelId property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-id\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelId?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n     */\n    val defaultModelAmbientOcclusionIntensity: Double?\n      /**\n       * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of ModelAmbientOcclusionIntensity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-ambient-occlusion-intensity\").silentUnwrap()\n      }\n\n    /**\n     * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"model-ambient-occlusion-intensity\".\n     *\n     */\n    val defaultModelAmbientOcclusionIntensityAsExpression: Expression?\n      /**\n       * Get default value of the ModelAmbientOcclusionIntensity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-ambient-occlusion-intensity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelAmbientOcclusionIntensity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelAmbientOcclusionIntensity.\n     */\n    val defaultModelAmbientOcclusionIntensityTransition: StyleTransition?\n      /**\n       * Get the ModelAmbientOcclusionIntensity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-ambient-occlusion-intensity-transition\").silentUnwrap()\n\n    /**\n     * Enable/Disable shadow casting for this layer Default value: true.\n     */\n    val defaultModelCastShadows: Boolean?\n      /**\n       * Enable/Disable shadow casting for this layer Default value: true.\n       *\n       * Get the default value of ModelCastShadows property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cast-shadows\").silentUnwrap()\n      }\n\n    /**\n     * Enable/Disable shadow casting for this layer Default value: true.\n     *\n     * This is an Expression representation of \"model-cast-shadows\".\n     *\n     */\n    val defaultModelCastShadowsAsExpression: Expression?\n      /**\n       * Get default value of the ModelCastShadows property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cast-shadows\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelCastShadows?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n     */\n    val defaultModelColor: String?\n      /**\n       * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n       *\n       * Get the default value of ModelColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultModelColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n     *\n     * This is an Expression representation of \"model-color\".\n     *\n     */\n    val defaultModelColorAsExpression: Expression?\n      /**\n       * Get default value of the ModelColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n     */\n    val defaultModelColorAsColorInt: Int?\n      /**\n       * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n       *\n       * Get the default value of ModelColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultModelColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelColor.\n     */\n    val defaultModelColorTransition: StyleTransition?\n      /**\n       * Get the ModelColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [modelColor].\n     */\n    @MapboxExperimental\n    val defaultModelColorUseTheme: String?\n      /**\n       * Get default value of the ModelColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [modelColor].\n     */\n    @MapboxExperimental\n    val defaultModelColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the ModelColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"model\", \"model-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultModelColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n     */\n    val defaultModelColorMixIntensity: Double?\n      /**\n       * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of ModelColorMixIntensity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-mix-intensity\").silentUnwrap()\n      }\n\n    /**\n     * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"model-color-mix-intensity\".\n     *\n     */\n    val defaultModelColorMixIntensityAsExpression: Expression?\n      /**\n       * Get default value of the ModelColorMixIntensity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-mix-intensity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelColorMixIntensity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelColorMixIntensity.\n     */\n    val defaultModelColorMixIntensityTransition: StyleTransition?\n      /**\n       * Get the ModelColorMixIntensity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-mix-intensity-transition\").silentUnwrap()\n\n    /**\n     * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n     */\n    val defaultModelCutoffFadeRange: Double?\n      /**\n       * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of ModelCutoffFadeRange property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cutoff-fade-range\").silentUnwrap()\n      }\n\n    /**\n     * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"model-cutoff-fade-range\".\n     *\n     */\n    val defaultModelCutoffFadeRangeAsExpression: Expression?\n      /**\n       * Get default value of the ModelCutoffFadeRange property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cutoff-fade-range\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelCutoffFadeRange?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n     */\n    val defaultModelElevationReference: ModelElevationReference?\n      /**\n       * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n       *\n       * Get the default value of ModelElevationReference property\n       *\n       * @return ModelElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-elevation-reference\").silentUnwrap<String>()?.let {\n          return ModelElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n     *\n     * This is an Expression representation of \"model-elevation-reference\".\n     *\n     */\n    val defaultModelElevationReferenceAsExpression: Expression?\n      /**\n       * Get default value of the ModelElevationReference property as an Expression\n       *\n       * @return ModelElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-elevation-reference\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelElevationReference?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n     */\n    val defaultModelEmissiveStrength: Double?\n      /**\n       * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n       *\n       * Get the default value of ModelEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n     *\n     * This is an Expression representation of \"model-emissive-strength\".\n     *\n     */\n    val defaultModelEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the ModelEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelEmissiveStrength.\n     */\n    val defaultModelEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the ModelEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n     */\n    val defaultModelHeightBasedEmissiveStrengthMultiplier: List<Double>?\n      /**\n       * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n       *\n       * Get the default value of ModelHeightBasedEmissiveStrengthMultiplier property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-height-based-emissive-strength-multiplier\").silentUnwrap()\n      }\n\n    /**\n     * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n     *\n     * This is an Expression representation of \"model-height-based-emissive-strength-multiplier\".\n     *\n     */\n    val defaultModelHeightBasedEmissiveStrengthMultiplierAsExpression: Expression?\n      /**\n       * Get default value of the ModelHeightBasedEmissiveStrengthMultiplier property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-height-based-emissive-strength-multiplier\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelHeightBasedEmissiveStrengthMultiplier?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelHeightBasedEmissiveStrengthMultiplier.\n     */\n    val defaultModelHeightBasedEmissiveStrengthMultiplierTransition: StyleTransition?\n      /**\n       * Get the ModelHeightBasedEmissiveStrengthMultiplier property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-height-based-emissive-strength-multiplier-transition\").silentUnwrap()\n\n    /**\n     * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n     */\n    val defaultModelOpacity: Double?\n      /**\n       * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of ModelOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"model-opacity\".\n     *\n     */\n    val defaultModelOpacityAsExpression: Expression?\n      /**\n       * Get default value of the ModelOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelOpacity.\n     */\n    val defaultModelOpacityTransition: StyleTransition?\n      /**\n       * Get the ModelOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-opacity-transition\").silentUnwrap()\n\n    /**\n     * Enable/Disable shadow receiving for this layer Default value: true.\n     */\n    val defaultModelReceiveShadows: Boolean?\n      /**\n       * Enable/Disable shadow receiving for this layer Default value: true.\n       *\n       * Get the default value of ModelReceiveShadows property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-receive-shadows\").silentUnwrap()\n      }\n\n    /**\n     * Enable/Disable shadow receiving for this layer Default value: true.\n     *\n     * This is an Expression representation of \"model-receive-shadows\".\n     *\n     */\n    val defaultModelReceiveShadowsAsExpression: Expression?\n      /**\n       * Get default value of the ModelReceiveShadows property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-receive-shadows\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelReceiveShadows?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n     */\n    val defaultModelRotation: List<Double>?\n      /**\n       * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n       *\n       * Get the default value of ModelRotation property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-rotation\").silentUnwrap()\n      }\n\n    /**\n     * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n     *\n     * This is an Expression representation of \"model-rotation\".\n     *\n     */\n    val defaultModelRotationAsExpression: Expression?\n      /**\n       * Get default value of the ModelRotation property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-rotation\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelRotation?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelRotation.\n     */\n    val defaultModelRotationTransition: StyleTransition?\n      /**\n       * Get the ModelRotation property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-rotation-transition\").silentUnwrap()\n\n    /**\n     * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n     */\n    val defaultModelRoughness: Double?\n      /**\n       * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of ModelRoughness property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-roughness\").silentUnwrap()\n      }\n\n    /**\n     * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"model-roughness\".\n     *\n     */\n    val defaultModelRoughnessAsExpression: Expression?\n      /**\n       * Get default value of the ModelRoughness property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-roughness\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelRoughness?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelRoughness.\n     */\n    val defaultModelRoughnessTransition: StyleTransition?\n      /**\n       * Get the ModelRoughness property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-roughness-transition\").silentUnwrap()\n\n    /**\n     * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n     */\n    val defaultModelScale: List<Double>?\n      /**\n       * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n       *\n       * Get the default value of ModelScale property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale\").silentUnwrap()\n      }\n\n    /**\n     * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n     *\n     * This is an Expression representation of \"model-scale\".\n     *\n     */\n    val defaultModelScaleAsExpression: Expression?\n      /**\n       * Get default value of the ModelScale property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelScale?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelScale.\n     */\n    val defaultModelScaleTransition: StyleTransition?\n      /**\n       * Get the ModelScale property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale-transition\").silentUnwrap()\n\n    /**\n     * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n     */\n    val defaultModelScaleMode: ModelScaleMode?\n      /**\n       * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n       *\n       * Get the default value of ModelScaleMode property\n       *\n       * @return ModelScaleMode\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale-mode\").silentUnwrap<String>()?.let {\n          return ModelScaleMode.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n     *\n     * This is an Expression representation of \"model-scale-mode\".\n     *\n     */\n    val defaultModelScaleModeAsExpression: Expression?\n      /**\n       * Get default value of the ModelScaleMode property as an Expression\n       *\n       * @return ModelScaleMode\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale-mode\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelScaleMode?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n     */\n    val defaultModelTranslation: List<Double>?\n      /**\n       * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n       *\n       * Get the default value of ModelTranslation property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-translation\").silentUnwrap()\n      }\n\n    /**\n     * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n     *\n     * This is an Expression representation of \"model-translation\".\n     *\n     */\n    val defaultModelTranslationAsExpression: Expression?\n      /**\n       * Get default value of the ModelTranslation property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-translation\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelTranslation?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for ModelTranslation.\n     */\n    val defaultModelTranslationTransition: StyleTransition?\n      /**\n       * Get the ModelTranslation property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-translation-transition\").silentUnwrap()\n\n    /**\n     * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n     */\n    val defaultModelType: ModelType?\n      /**\n       * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n       *\n       * Get the default value of ModelType property\n       *\n       * @return ModelType\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-type\").silentUnwrap<String>()?.let {\n          return ModelType.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n     *\n     * This is an Expression representation of \"model-type\".\n     *\n     */\n    val defaultModelTypeAsExpression: Expression?\n      /**\n       * Get default value of the ModelType property as an Expression\n       *\n       * @return ModelType\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-type\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultModelType?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface ModelLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): ModelLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): ModelLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): ModelLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): ModelLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): ModelLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): ModelLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): ModelLayer\n\n  // Property getters and setters\n\n  /**\n   * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n   *\n   * @param modelAllowDensityReduction value of modelAllowDensityReduction\n   */\n  @MapboxExperimental\n  fun modelAllowDensityReduction(modelAllowDensityReduction: Boolean = true): ModelLayer\n\n  /**\n   * If true, the models will be reduced in density based on the zoom level. This is useful for large datasets that may be slow to render. Default value: true.\n   *\n   * @param modelAllowDensityReduction value of modelAllowDensityReduction as Expression\n   */\n  @MapboxExperimental\n  fun modelAllowDensityReduction(modelAllowDensityReduction: Expression): ModelLayer\n\n  /**\n   * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n   *\n   * @param modelId value of modelId\n   */\n  fun modelId(modelId: String = \"\"): ModelLayer\n\n  /**\n   * Model to render. It can be either a string referencing an element to the models root property or an internal or external URL Default value: \"\".\n   *\n   * @param modelId value of modelId as Expression\n   */\n  fun modelId(modelId: Expression): ModelLayer\n\n  /**\n   * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n   *\n   * @param modelAmbientOcclusionIntensity value of modelAmbientOcclusionIntensity\n   */\n  fun modelAmbientOcclusionIntensity(modelAmbientOcclusionIntensity: Double = 1.0): ModelLayer\n\n  /**\n   * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n   *\n   * @param modelAmbientOcclusionIntensity value of modelAmbientOcclusionIntensity as Expression\n   */\n  fun modelAmbientOcclusionIntensity(modelAmbientOcclusionIntensity: Expression): ModelLayer\n\n  /**\n   * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n   *\n   * Set the ModelAmbientOcclusionIntensity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun modelAmbientOcclusionIntensityTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * Intensity of the ambient occlusion if present in the 3D model. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [modelAmbientOcclusionIntensityTransition].\n   */\n  fun modelAmbientOcclusionIntensityTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * @param modelCastShadows value of modelCastShadows\n   */\n  fun modelCastShadows(modelCastShadows: Boolean = true): ModelLayer\n\n  /**\n   * Enable/Disable shadow casting for this layer Default value: true.\n   *\n   * @param modelCastShadows value of modelCastShadows as Expression\n   */\n  fun modelCastShadows(modelCastShadows: Expression): ModelLayer\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   *\n   * @param modelColor value of modelColor\n   */\n  fun modelColor(modelColor: String = \"#ffffff\"): ModelLayer\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   *\n   * @param modelColor value of modelColor as Expression\n   */\n  fun modelColor(modelColor: Expression): ModelLayer\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   *\n   * @param modelColor value of modelColor\n   */\n  fun modelColor(@ColorInt modelColor: Int): ModelLayer\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   *\n   * Set the ModelColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun modelColorTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   *\n   * DSL for [modelColorTransition].\n   */\n  fun modelColorTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * Set the modelColorUseTheme as String for [modelColor].\n   *\n   * @param modelColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun modelColorUseTheme(modelColorUseTheme: String): ModelLayer\n\n  /**\n   * Set the modelColorUseTheme as Expression for [modelColor].\n   *\n   * @param modelColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun modelColorUseTheme(modelColorUseTheme: Expression): ModelLayer\n\n  /**\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   *\n   * @param modelColorMixIntensity value of modelColorMixIntensity\n   */\n  fun modelColorMixIntensity(modelColorMixIntensity: Double = 0.0): ModelLayer\n\n  /**\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   *\n   * @param modelColorMixIntensity value of modelColorMixIntensity as Expression\n   */\n  fun modelColorMixIntensity(modelColorMixIntensity: Expression): ModelLayer\n\n  /**\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   *\n   * Set the ModelColorMixIntensity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun modelColorMixIntensityTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   *\n   * DSL for [modelColorMixIntensityTransition].\n   */\n  fun modelColorMixIntensityTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * @param modelCutoffFadeRange value of modelCutoffFadeRange\n   */\n  fun modelCutoffFadeRange(modelCutoffFadeRange: Double = 0.0): ModelLayer\n\n  /**\n   * This parameter defines the range for the fade-out effect before an automatic content cutoff on pitched map views. The automatic cutoff range is calculated according to the minimum required zoom level of the source and layer. The fade range is expressed in relation to the height of the map view. A value of 1.0 indicates that the content is faded to the same extent as the map's height in pixels, while a value close to zero represents a sharp cutoff. When the value is set to 0.0, the cutoff is completely disabled. Note: The property has no effect on the map if terrain is enabled. Default value: 0. Value range: [0, 1]\n   *\n   * @param modelCutoffFadeRange value of modelCutoffFadeRange as Expression\n   */\n  fun modelCutoffFadeRange(modelCutoffFadeRange: Expression): ModelLayer\n\n  /**\n   * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n   *\n   * @param modelElevationReference value of modelElevationReference\n   */\n  fun modelElevationReference(modelElevationReference: ModelElevationReference = ModelElevationReference.GROUND): ModelLayer\n\n  /**\n   * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time. Default value: \"ground\".\n   *\n   * @param modelElevationReference value of modelElevationReference as Expression\n   */\n  fun modelElevationReference(modelElevationReference: Expression): ModelLayer\n\n  /**\n   * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n   *\n   * @param modelEmissiveStrength value of modelEmissiveStrength\n   */\n  fun modelEmissiveStrength(modelEmissiveStrength: Double = 0.0): ModelLayer\n\n  /**\n   * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n   *\n   * @param modelEmissiveStrength value of modelEmissiveStrength as Expression\n   */\n  fun modelEmissiveStrength(modelEmissiveStrength: Expression): ModelLayer\n\n  /**\n   * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n   *\n   * Set the ModelEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun modelEmissiveStrengthTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 5]\n   *\n   * DSL for [modelEmissiveStrengthTransition].\n   */\n  fun modelEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n   *\n   * @param modelHeightBasedEmissiveStrengthMultiplier value of modelHeightBasedEmissiveStrengthMultiplier\n   */\n  fun modelHeightBasedEmissiveStrengthMultiplier(modelHeightBasedEmissiveStrengthMultiplier: List<Double> = listOf(1.0, 1.0, 1.0, 1.0, 0.0)): ModelLayer\n\n  /**\n   * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n   *\n   * @param modelHeightBasedEmissiveStrengthMultiplier value of modelHeightBasedEmissiveStrengthMultiplier as Expression\n   */\n  fun modelHeightBasedEmissiveStrengthMultiplier(modelHeightBasedEmissiveStrengthMultiplier: Expression): ModelLayer\n\n  /**\n   * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n   *\n   * Set the ModelHeightBasedEmissiveStrengthMultiplier property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun modelHeightBasedEmissiveStrengthMultiplierTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * Emissive strength multiplier along model height (gradient begin, gradient end, value at begin, value at end, gradient curve power (logarithmic scale, curve power = pow(10, val)). Default value: [1,1,1,1,0].\n   *\n   * DSL for [modelHeightBasedEmissiveStrengthMultiplierTransition].\n   */\n  fun modelHeightBasedEmissiveStrengthMultiplierTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n   *\n   * @param modelOpacity value of modelOpacity\n   */\n  fun modelOpacity(modelOpacity: Double = 1.0): ModelLayer\n\n  /**\n   * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n   *\n   * @param modelOpacity value of modelOpacity as Expression\n   */\n  fun modelOpacity(modelOpacity: Expression): ModelLayer\n\n  /**\n   * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n   *\n   * Set the ModelOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun modelOpacityTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * The opacity of the model layer. Except for zoom, expressions that are data-driven are not supported if using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [modelOpacityTransition].\n   */\n  fun modelOpacityTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * Enable/Disable shadow receiving for this layer Default value: true.\n   *\n   * @param modelReceiveShadows value of modelReceiveShadows\n   */\n  fun modelReceiveShadows(modelReceiveShadows: Boolean = true): ModelLayer\n\n  /**\n   * Enable/Disable shadow receiving for this layer Default value: true.\n   *\n   * @param modelReceiveShadows value of modelReceiveShadows as Expression\n   */\n  fun modelReceiveShadows(modelReceiveShadows: Expression): ModelLayer\n\n  /**\n   * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n   *\n   * @param modelRotation value of modelRotation\n   */\n  fun modelRotation(modelRotation: List<Double> = listOf(0.0, 0.0, 0.0)): ModelLayer\n\n  /**\n   * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n   *\n   * @param modelRotation value of modelRotation as Expression\n   */\n  fun modelRotation(modelRotation: Expression): ModelLayer\n\n  /**\n   * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n   *\n   * Set the ModelRotation property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun modelRotationTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * The rotation of the model in euler angles [lon, lat, z]. Default value: [0,0,0]. The unit of modelRotation is in degrees.\n   *\n   * DSL for [modelRotationTransition].\n   */\n  fun modelRotationTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n   *\n   * @param modelRoughness value of modelRoughness\n   */\n  fun modelRoughness(modelRoughness: Double = 1.0): ModelLayer\n\n  /**\n   * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n   *\n   * @param modelRoughness value of modelRoughness as Expression\n   */\n  fun modelRoughness(modelRoughness: Expression): ModelLayer\n\n  /**\n   * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n   *\n   * Set the ModelRoughness property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun modelRoughnessTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * Material roughness. Material is fully smooth for value 0, and fully rough for value 1. Affects only layers using batched-model source. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [modelRoughnessTransition].\n   */\n  fun modelRoughnessTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n   *\n   * @param modelScale value of modelScale\n   */\n  fun modelScale(modelScale: List<Double> = listOf(1.0, 1.0, 1.0)): ModelLayer\n\n  /**\n   * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n   *\n   * @param modelScale value of modelScale as Expression\n   */\n  fun modelScale(modelScale: Expression): ModelLayer\n\n  /**\n   * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n   *\n   * Set the ModelScale property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun modelScaleTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * The scale of the model. Expressions that are zoom-dependent are not supported if using GeoJSON or vector tile as the model layer source. Default value: [1,1,1].\n   *\n   * DSL for [modelScaleTransition].\n   */\n  fun modelScaleTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n   *\n   * @param modelScaleMode value of modelScaleMode\n   */\n  fun modelScaleMode(modelScaleMode: ModelScaleMode = ModelScaleMode.MAP): ModelLayer\n\n  /**\n   * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n   *\n   * @param modelScaleMode value of modelScaleMode as Expression\n   */\n  fun modelScaleMode(modelScaleMode: Expression): ModelLayer\n\n  /**\n   * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n   *\n   * @param modelTranslation value of modelTranslation\n   */\n  fun modelTranslation(modelTranslation: List<Double> = listOf(0.0, 0.0, 0.0)): ModelLayer\n\n  /**\n   * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n   *\n   * @param modelTranslation value of modelTranslation as Expression\n   */\n  fun modelTranslation(modelTranslation: Expression): ModelLayer\n\n  /**\n   * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n   *\n   * Set the ModelTranslation property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun modelTranslationTransition(options: StyleTransition): ModelLayer\n\n  /**\n   * The translation of the model in meters in form of [longitudal, latitudal, altitude] offsets. Default value: [0,0,0].\n   *\n   * DSL for [modelTranslationTransition].\n   */\n  fun modelTranslationTransition(block: StyleTransition.Builder.() -> Unit): ModelLayer\n\n  /**\n   * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n   *\n   * @param modelType value of modelType\n   */\n  fun modelType(modelType: ModelType = ModelType.COMMON_3D): ModelLayer\n\n  /**\n   * Defines rendering behavior of model in respect to other 3D scene objects. Default value: \"common-3d\".\n   *\n   * @param modelType value of modelType as Expression\n   */\n  fun modelType(modelType: Expression): ModelLayer\n}\n\n/**\n * DSL function for creating a [ModelLayer].\n */\nfun modelLayer(layerId: String, sourceId: String, block: ModelLayerDsl.() -> Unit): ModelLayer = ModelLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/RasterLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * Raster map textures such as satellite imagery.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#raster)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass RasterLayer(override val layerId: String, val sourceId: String) : RasterLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): RasterLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): RasterLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [RasterLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [RasterLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [RasterLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[RasterLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [RasterLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [RasterLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): RasterLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [RasterLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [RasterLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): RasterLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * Displayed band of raster array source layer. Defaults to the first band if not set.\n   */\n  @MapboxExperimental\n  val rasterArrayBand: String?\n    /**\n     * Displayed band of raster array source layer. Defaults to the first band if not set.\n     *\n     * Use static method [RasterLayer.defaultRasterArrayBand] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"raster-array-band\")\n    }\n\n  /**\n   * Displayed band of raster array source layer. Defaults to the first band if not set.\n   *\n   * Use static method [RasterLayer.defaultRasterArrayBand] to set the default property.\n   *\n   * @param rasterArrayBand value of rasterArrayBand\n   */\n  @MapboxExperimental\n  override fun rasterArrayBand(rasterArrayBand: String): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-array-band\", rasterArrayBand)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Displayed band of raster array source layer. Defaults to the first band if not set.\n   *\n   * This is an Expression representation of \"raster-array-band\".\n   *\n   */\n  @MapboxExperimental\n  val rasterArrayBandAsExpression: Expression?\n    /**\n     * Displayed band of raster array source layer. Defaults to the first band if not set.\n     *\n     * Get the RasterArrayBand property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterArrayBandAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-array-band\")\n\n  /**\n   * Displayed band of raster array source layer. Defaults to the first band if not set.\n   *\n   * Use static method [RasterLayer.defaultRasterArrayBandAsExpression] to set the default property.\n   *\n   * @param rasterArrayBand value of rasterArrayBand as Expression\n   */\n  @MapboxExperimental\n  override fun rasterArrayBand(rasterArrayBand: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-array-band\", rasterArrayBand)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   */\n  val rasterBrightnessMax: Double?\n    /**\n     * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [RasterLayer.defaultRasterBrightnessMax] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-brightness-max\")\n    }\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterBrightnessMax] to set the default property.\n   *\n   * @param rasterBrightnessMax value of rasterBrightnessMax\n   */\n  override fun rasterBrightnessMax(rasterBrightnessMax: Double): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-brightness-max\", rasterBrightnessMax)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"raster-brightness-max\".\n   *\n   */\n  val rasterBrightnessMaxAsExpression: Expression?\n    /**\n     * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n     *\n     * Get the RasterBrightnessMax property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterBrightnessMaxAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-brightness-max\")\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterBrightnessMaxAsExpression] to set the default property.\n   *\n   * @param rasterBrightnessMax value of rasterBrightnessMax as Expression\n   */\n  override fun rasterBrightnessMax(rasterBrightnessMax: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-brightness-max\", rasterBrightnessMax)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterBrightnessMax.\n   */\n  val rasterBrightnessMaxTransition: StyleTransition?\n    /**\n     * Get the RasterBrightnessMax property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterBrightnessMaxTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-brightness-max-transition\")\n    }\n\n  /**\n   * Set the RasterBrightnessMax property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterBrightnessMaxTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun rasterBrightnessMaxTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-brightness-max-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterBrightnessMaxTransition].\n   */\n  override fun rasterBrightnessMaxTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterBrightnessMaxTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   */\n  val rasterBrightnessMin: Double?\n    /**\n     * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [RasterLayer.defaultRasterBrightnessMin] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-brightness-min\")\n    }\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterBrightnessMin] to set the default property.\n   *\n   * @param rasterBrightnessMin value of rasterBrightnessMin\n   */\n  override fun rasterBrightnessMin(rasterBrightnessMin: Double): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-brightness-min\", rasterBrightnessMin)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"raster-brightness-min\".\n   *\n   */\n  val rasterBrightnessMinAsExpression: Expression?\n    /**\n     * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n     *\n     * Get the RasterBrightnessMin property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterBrightnessMinAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-brightness-min\")\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterBrightnessMinAsExpression] to set the default property.\n   *\n   * @param rasterBrightnessMin value of rasterBrightnessMin as Expression\n   */\n  override fun rasterBrightnessMin(rasterBrightnessMin: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-brightness-min\", rasterBrightnessMin)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterBrightnessMin.\n   */\n  val rasterBrightnessMinTransition: StyleTransition?\n    /**\n     * Get the RasterBrightnessMin property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterBrightnessMinTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-brightness-min-transition\")\n    }\n\n  /**\n   * Set the RasterBrightnessMin property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterBrightnessMinTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun rasterBrightnessMinTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-brightness-min-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterBrightnessMinTransition].\n   */\n  override fun rasterBrightnessMinTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterBrightnessMinTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Defines a color map by which to colorize a raster layer, parameterized by the `[\"raster-value\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-color-range`.\n   */\n  val rasterColor: Expression?\n    /**\n     * Defines a color map by which to colorize a raster layer, parameterized by the `[\"raster-value\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-color-range`.\n     *\n     * Use static method [RasterLayer.defaultRasterColor] to get the default property.\n     *\n     * @return Expression\n     */\n    get() {\n      return getPropertyValue(\"raster-color\")\n    }\n\n  /**\n   * Defines a color map by which to colorize a raster layer, parameterized by the `[\"raster-value\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-color-range`.\n   *\n   * Use static method [RasterLayer.defaultRasterColor] to set the default property.\n   *\n   * @param rasterColor value of rasterColor\n   */\n  override fun rasterColor(rasterColor: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-color\", rasterColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [rasterColor].\n   */\n  @MapboxExperimental\n  val rasterColorUseTheme: String?\n    /**\n     * Get the RasterColorUseTheme property\n     *\n     * Use static method [RasterLayer.defaultRasterColorUseTheme] to get the default property.\n     *\n     * @return current RasterColorUseTheme property as Expression\n     */\n    get() {\n      return getPropertyValue(\"raster-color-use-theme\")\n    }\n\n  /**\n   * Set the RasterColorUseTheme as String\n   *\n   * Use static method [RasterLayer.defaultRasterColorUseTheme] to get the default property.\n   *\n   * @param rasterColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun rasterColorUseTheme(rasterColorUseTheme: String): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-color-use-theme\", rasterColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [rasterColor].\n   */\n  @MapboxExperimental\n  val rasterColorUseThemeAsExpression: Expression?\n    /**\n     * Get the RasterColorUseTheme property\n     *\n     * Use static method [RasterLayer.defaultRasterColorUseTheme] to get the default property.\n     *\n     * @return current RasterColorUseTheme property as Expression\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"raster-color-use-theme\")\n\n  /**\n   * Set the RasterColorUseTheme as Expression\n   *\n   * Use static method [RasterLayer.defaultRasterColorUseTheme] to get the default property.\n   *\n   * @param rasterColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun rasterColorUseTheme(rasterColorUseTheme: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-color-use-theme\", rasterColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n   */\n  val rasterColorMix: List<Double>?\n    /**\n     * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n     *\n     * Use static method [RasterLayer.defaultRasterColorMix] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"raster-color-mix\")\n    }\n\n  /**\n   * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n   *\n   * Use static method [RasterLayer.defaultRasterColorMix] to set the default property.\n   *\n   * @param rasterColorMix value of rasterColorMix\n   */\n  override fun rasterColorMix(rasterColorMix: List<Double>): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-color-mix\", rasterColorMix)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n   *\n   * This is an Expression representation of \"raster-color-mix\".\n   *\n   */\n  val rasterColorMixAsExpression: Expression?\n    /**\n     * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n     *\n     * Get the RasterColorMix property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterColorMixAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-color-mix\")\n\n  /**\n   * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n   *\n   * Use static method [RasterLayer.defaultRasterColorMixAsExpression] to set the default property.\n   *\n   * @param rasterColorMix value of rasterColorMix as Expression\n   */\n  override fun rasterColorMix(rasterColorMix: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-color-mix\", rasterColorMix)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterColorMix.\n   */\n  val rasterColorMixTransition: StyleTransition?\n    /**\n     * Get the RasterColorMix property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterColorMixTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"raster-color-mix-transition\")\n    }\n\n  /**\n   * Set the RasterColorMix property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterColorMixTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun rasterColorMixTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-color-mix-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterColorMixTransition].\n   */\n  override fun rasterColorMixTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterColorMixTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n   */\n  val rasterColorRange: List<Double>?\n    /**\n     * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n     *\n     * Use static method [RasterLayer.defaultRasterColorRange] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"raster-color-range\")\n    }\n\n  /**\n   * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n   *\n   * Use static method [RasterLayer.defaultRasterColorRange] to set the default property.\n   *\n   * @param rasterColorRange value of rasterColorRange\n   */\n  override fun rasterColorRange(rasterColorRange: List<Double>): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-color-range\", rasterColorRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n   *\n   * This is an Expression representation of \"raster-color-range\".\n   *\n   */\n  val rasterColorRangeAsExpression: Expression?\n    /**\n     * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n     *\n     * Get the RasterColorRange property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterColorRangeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-color-range\")\n\n  /**\n   * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n   *\n   * Use static method [RasterLayer.defaultRasterColorRangeAsExpression] to set the default property.\n   *\n   * @param rasterColorRange value of rasterColorRange as Expression\n   */\n  override fun rasterColorRange(rasterColorRange: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-color-range\", rasterColorRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterColorRange.\n   */\n  val rasterColorRangeTransition: StyleTransition?\n    /**\n     * Get the RasterColorRange property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterColorRangeTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"raster-color-range-transition\")\n    }\n\n  /**\n   * Set the RasterColorRange property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterColorRangeTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun rasterColorRangeTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-color-range-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterColorRangeTransition].\n   */\n  override fun rasterColorRangeTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterColorRangeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n   */\n  val rasterContrast: Double?\n    /**\n     * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n     *\n     * Use static method [RasterLayer.defaultRasterContrast] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-contrast\")\n    }\n\n  /**\n   * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterContrast] to set the default property.\n   *\n   * @param rasterContrast value of rasterContrast\n   */\n  override fun rasterContrast(rasterContrast: Double): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-contrast\", rasterContrast)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * This is an Expression representation of \"raster-contrast\".\n   *\n   */\n  val rasterContrastAsExpression: Expression?\n    /**\n     * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n     *\n     * Get the RasterContrast property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterContrastAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-contrast\")\n\n  /**\n   * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterContrastAsExpression] to set the default property.\n   *\n   * @param rasterContrast value of rasterContrast as Expression\n   */\n  override fun rasterContrast(rasterContrast: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-contrast\", rasterContrast)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterContrast.\n   */\n  val rasterContrastTransition: StyleTransition?\n    /**\n     * Get the RasterContrast property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterContrastTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-contrast-transition\")\n    }\n\n  /**\n   * Set the RasterContrast property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterContrastTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun rasterContrastTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-contrast-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterContrastTransition].\n   */\n  override fun rasterContrastTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterContrastTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  val rasterElevation: Double?\n    /**\n     * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n     *\n     * Use static method [RasterLayer.defaultRasterElevation] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-elevation\")\n    }\n\n  /**\n   * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n   *\n   * Use static method [RasterLayer.defaultRasterElevation] to set the default property.\n   *\n   * @param rasterElevation value of rasterElevation\n   */\n  @MapboxExperimental\n  override fun rasterElevation(rasterElevation: Double): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-elevation\", rasterElevation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n   *\n   * This is an Expression representation of \"raster-elevation\".\n   *\n   */\n  @MapboxExperimental\n  val rasterElevationAsExpression: Expression?\n    /**\n     * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n     *\n     * Get the RasterElevation property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterElevationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-elevation\")\n\n  /**\n   * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n   *\n   * Use static method [RasterLayer.defaultRasterElevationAsExpression] to set the default property.\n   *\n   * @param rasterElevation value of rasterElevation as Expression\n   */\n  @MapboxExperimental\n  override fun rasterElevation(rasterElevation: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-elevation\", rasterElevation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterElevation.\n   */\n  @MapboxExperimental\n  val rasterElevationTransition: StyleTransition?\n    /**\n     * Get the RasterElevation property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterElevationTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-elevation-transition\")\n    }\n\n  /**\n   * Set the RasterElevation property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterElevationTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun rasterElevationTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-elevation-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterElevationTransition].\n   */\n  @MapboxExperimental\n  override fun rasterElevationTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterElevationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n   */\n  val rasterEmissiveStrength: Double?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n     *\n     * Use static method [RasterLayer.defaultRasterEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-emissive-strength\")\n    }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n   *\n   * Use static method [RasterLayer.defaultRasterEmissiveStrength] to set the default property.\n   *\n   * @param rasterEmissiveStrength value of rasterEmissiveStrength\n   */\n  override fun rasterEmissiveStrength(rasterEmissiveStrength: Double): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-emissive-strength\", rasterEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n   *\n   * This is an Expression representation of \"raster-emissive-strength\".\n   *\n   */\n  val rasterEmissiveStrengthAsExpression: Expression?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n     *\n     * Get the RasterEmissiveStrength property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-emissive-strength\")\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n   *\n   * Use static method [RasterLayer.defaultRasterEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param rasterEmissiveStrength value of rasterEmissiveStrength as Expression\n   */\n  override fun rasterEmissiveStrength(rasterEmissiveStrength: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-emissive-strength\", rasterEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterEmissiveStrength.\n   */\n  val rasterEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the RasterEmissiveStrength property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the RasterEmissiveStrength property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun rasterEmissiveStrengthTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterEmissiveStrengthTransition].\n   */\n  override fun rasterEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n   */\n  val rasterFadeDuration: Double?\n    /**\n     * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n     *\n     * Use static method [RasterLayer.defaultRasterFadeDuration] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-fade-duration\")\n    }\n\n  /**\n   * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n   *\n   * Use static method [RasterLayer.defaultRasterFadeDuration] to set the default property.\n   *\n   * @param rasterFadeDuration value of rasterFadeDuration\n   */\n  override fun rasterFadeDuration(rasterFadeDuration: Double): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-fade-duration\", rasterFadeDuration)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n   *\n   * This is an Expression representation of \"raster-fade-duration\".\n   *\n   */\n  val rasterFadeDurationAsExpression: Expression?\n    /**\n     * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n     *\n     * Get the RasterFadeDuration property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterFadeDurationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-fade-duration\")\n\n  /**\n   * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n   *\n   * Use static method [RasterLayer.defaultRasterFadeDurationAsExpression] to set the default property.\n   *\n   * @param rasterFadeDuration value of rasterFadeDuration as Expression\n   */\n  override fun rasterFadeDuration(rasterFadeDuration: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-fade-duration\", rasterFadeDuration)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n   */\n  val rasterHueRotate: Double?\n    /**\n     * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n     *\n     * Use static method [RasterLayer.defaultRasterHueRotate] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-hue-rotate\")\n    }\n\n  /**\n   * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n   *\n   * Use static method [RasterLayer.defaultRasterHueRotate] to set the default property.\n   *\n   * @param rasterHueRotate value of rasterHueRotate\n   */\n  override fun rasterHueRotate(rasterHueRotate: Double): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-hue-rotate\", rasterHueRotate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n   *\n   * This is an Expression representation of \"raster-hue-rotate\".\n   *\n   */\n  val rasterHueRotateAsExpression: Expression?\n    /**\n     * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n     *\n     * Get the RasterHueRotate property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterHueRotateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-hue-rotate\")\n\n  /**\n   * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n   *\n   * Use static method [RasterLayer.defaultRasterHueRotateAsExpression] to set the default property.\n   *\n   * @param rasterHueRotate value of rasterHueRotate as Expression\n   */\n  override fun rasterHueRotate(rasterHueRotate: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-hue-rotate\", rasterHueRotate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterHueRotate.\n   */\n  val rasterHueRotateTransition: StyleTransition?\n    /**\n     * Get the RasterHueRotate property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterHueRotateTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-hue-rotate-transition\")\n    }\n\n  /**\n   * Set the RasterHueRotate property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterHueRotateTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun rasterHueRotateTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-hue-rotate-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterHueRotateTransition].\n   */\n  override fun rasterHueRotateTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterHueRotateTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  val rasterOpacity: Double?\n    /**\n     * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [RasterLayer.defaultRasterOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-opacity\")\n    }\n\n  /**\n   * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterOpacity] to set the default property.\n   *\n   * @param rasterOpacity value of rasterOpacity\n   */\n  override fun rasterOpacity(rasterOpacity: Double): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-opacity\", rasterOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"raster-opacity\".\n   *\n   */\n  val rasterOpacityAsExpression: Expression?\n    /**\n     * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Get the RasterOpacity property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-opacity\")\n\n  /**\n   * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterOpacityAsExpression] to set the default property.\n   *\n   * @param rasterOpacity value of rasterOpacity as Expression\n   */\n  override fun rasterOpacity(rasterOpacity: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-opacity\", rasterOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterOpacity.\n   */\n  val rasterOpacityTransition: StyleTransition?\n    /**\n     * Get the RasterOpacity property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-opacity-transition\")\n    }\n\n  /**\n   * Set the RasterOpacity property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun rasterOpacityTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterOpacityTransition].\n   */\n  override fun rasterOpacityTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n   */\n  val rasterResampling: RasterResampling?\n    /**\n     * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n     *\n     * Use static method [RasterLayer.defaultRasterResampling] to get the default property.\n     *\n     * @return RasterResampling\n     */\n    get() {\n      getPropertyValue<String?>(\"raster-resampling\")?.let {\n        return RasterResampling.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n   *\n   * Use static method [RasterLayer.defaultRasterResampling] to set the default property.\n   *\n   * @param rasterResampling value of rasterResampling\n   */\n  override fun rasterResampling(rasterResampling: RasterResampling): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-resampling\", rasterResampling)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n   *\n   * This is an Expression representation of \"raster-resampling\".\n   *\n   */\n  val rasterResamplingAsExpression: Expression?\n    /**\n     * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n     *\n     * Get the RasterResampling property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterResamplingAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"raster-resampling\")\n        ?: rasterResampling?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n   *\n   * Use static method [RasterLayer.defaultRasterResamplingAsExpression] to set the default property.\n   *\n   * @param rasterResampling value of rasterResampling as Expression\n   */\n  override fun rasterResampling(rasterResampling: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-resampling\", rasterResampling)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n   */\n  val rasterSaturation: Double?\n    /**\n     * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n     *\n     * Use static method [RasterLayer.defaultRasterSaturation] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-saturation\")\n    }\n\n  /**\n   * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterSaturation] to set the default property.\n   *\n   * @param rasterSaturation value of rasterSaturation\n   */\n  override fun rasterSaturation(rasterSaturation: Double): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-saturation\", rasterSaturation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * This is an Expression representation of \"raster-saturation\".\n   *\n   */\n  val rasterSaturationAsExpression: Expression?\n    /**\n     * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n     *\n     * Get the RasterSaturation property as an Expression\n     *\n     * Use static method [RasterLayer.defaultRasterSaturationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-saturation\")\n\n  /**\n   * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * Use static method [RasterLayer.defaultRasterSaturationAsExpression] to set the default property.\n   *\n   * @param rasterSaturation value of rasterSaturation as Expression\n   */\n  override fun rasterSaturation(rasterSaturation: Expression): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-saturation\", rasterSaturation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterSaturation.\n   */\n  val rasterSaturationTransition: StyleTransition?\n    /**\n     * Get the RasterSaturation property transition options\n     *\n     * Use static method [RasterLayer.defaultRasterSaturationTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-saturation-transition\")\n    }\n\n  /**\n   * Set the RasterSaturation property transition options\n   *\n   * Use static method [RasterLayer.defaultRasterSaturationTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun rasterSaturationTransition(options: StyleTransition): RasterLayer = apply {\n    val propertyValue = PropertyValue(\"raster-saturation-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterSaturationTransition].\n   */\n  override fun rasterSaturationTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer = apply {\n    rasterSaturationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"raster\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Displayed band of raster array source layer. Defaults to the first band if not set.\n     */\n    @MapboxExperimental\n    val defaultRasterArrayBand: String?\n      /**\n       * Displayed band of raster array source layer. Defaults to the first band if not set.\n       *\n       * Get the default value of RasterArrayBand property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-array-band\").silentUnwrap()\n      }\n\n    /**\n     * Displayed band of raster array source layer. Defaults to the first band if not set.\n     *\n     * This is an Expression representation of \"raster-array-band\".\n     *\n     */\n    @MapboxExperimental\n    val defaultRasterArrayBandAsExpression: Expression?\n      /**\n       * Get default value of the RasterArrayBand property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-array-band\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterArrayBand?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n     */\n    val defaultRasterBrightnessMax: Double?\n      /**\n       * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of RasterBrightnessMax property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-max\").silentUnwrap()\n      }\n\n    /**\n     * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"raster-brightness-max\".\n     *\n     */\n    val defaultRasterBrightnessMaxAsExpression: Expression?\n      /**\n       * Get default value of the RasterBrightnessMax property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-max\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterBrightnessMax?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterBrightnessMax.\n     */\n    val defaultRasterBrightnessMaxTransition: StyleTransition?\n      /**\n       * Get the RasterBrightnessMax property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-max-transition\").silentUnwrap()\n\n    /**\n     * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n     */\n    val defaultRasterBrightnessMin: Double?\n      /**\n       * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of RasterBrightnessMin property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-min\").silentUnwrap()\n      }\n\n    /**\n     * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"raster-brightness-min\".\n     *\n     */\n    val defaultRasterBrightnessMinAsExpression: Expression?\n      /**\n       * Get default value of the RasterBrightnessMin property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-min\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterBrightnessMin?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterBrightnessMin.\n     */\n    val defaultRasterBrightnessMinTransition: StyleTransition?\n      /**\n       * Get the RasterBrightnessMin property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-min-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [rasterColor].\n     */\n    @MapboxExperimental\n    val defaultRasterColorUseTheme: String?\n      /**\n       * Get default value of the RasterColor property as String\n       *\n       * @return Expression\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [rasterColor].\n     */\n    @MapboxExperimental\n    val defaultRasterColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the RasterColor property as Expression\n       *\n       * @return Expression\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultRasterColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n     */\n    val defaultRasterColorMix: List<Double>?\n      /**\n       * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n       *\n       * Get the default value of RasterColorMix property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-mix\").silentUnwrap()\n      }\n\n    /**\n     * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n     *\n     * This is an Expression representation of \"raster-color-mix\".\n     *\n     */\n    val defaultRasterColorMixAsExpression: Expression?\n      /**\n       * Get default value of the RasterColorMix property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-mix\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterColorMix?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterColorMix.\n     */\n    val defaultRasterColorMixTransition: StyleTransition?\n      /**\n       * Get the RasterColorMix property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-mix-transition\").silentUnwrap()\n\n    /**\n     * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n     */\n    val defaultRasterColorRange: List<Double>?\n      /**\n       * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n       *\n       * Get the default value of RasterColorRange property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-range\").silentUnwrap()\n      }\n\n    /**\n     * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n     *\n     * This is an Expression representation of \"raster-color-range\".\n     *\n     */\n    val defaultRasterColorRangeAsExpression: Expression?\n      /**\n       * Get default value of the RasterColorRange property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-range\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterColorRange?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterColorRange.\n     */\n    val defaultRasterColorRangeTransition: StyleTransition?\n      /**\n       * Get the RasterColorRange property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-range-transition\").silentUnwrap()\n\n    /**\n     * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n     */\n    val defaultRasterContrast: Double?\n      /**\n       * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n       *\n       * Get the default value of RasterContrast property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-contrast\").silentUnwrap()\n      }\n\n    /**\n     * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n     *\n     * This is an Expression representation of \"raster-contrast\".\n     *\n     */\n    val defaultRasterContrastAsExpression: Expression?\n      /**\n       * Get default value of the RasterContrast property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-contrast\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterContrast?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterContrast.\n     */\n    val defaultRasterContrastTransition: StyleTransition?\n      /**\n       * Get the RasterContrast property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-contrast-transition\").silentUnwrap()\n\n    /**\n     * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n     */\n    @MapboxExperimental\n    val defaultRasterElevation: Double?\n      /**\n       * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n       *\n       * Get the default value of RasterElevation property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-elevation\").silentUnwrap()\n      }\n\n    /**\n     * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n     *\n     * This is an Expression representation of \"raster-elevation\".\n     *\n     */\n    @MapboxExperimental\n    val defaultRasterElevationAsExpression: Expression?\n      /**\n       * Get default value of the RasterElevation property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-elevation\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterElevation?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterElevation.\n     */\n    @MapboxExperimental\n    val defaultRasterElevationTransition: StyleTransition?\n      /**\n       * Get the RasterElevation property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-elevation-transition\").silentUnwrap()\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n     */\n    val defaultRasterEmissiveStrength: Double?\n      /**\n       * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n       *\n       * Get the default value of RasterEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n     *\n     * This is an Expression representation of \"raster-emissive-strength\".\n     *\n     */\n    val defaultRasterEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the RasterEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterEmissiveStrength.\n     */\n    val defaultRasterEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the RasterEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n     */\n    val defaultRasterFadeDuration: Double?\n      /**\n       * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n       *\n       * Get the default value of RasterFadeDuration property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-fade-duration\").silentUnwrap()\n      }\n\n    /**\n     * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n     *\n     * This is an Expression representation of \"raster-fade-duration\".\n     *\n     */\n    val defaultRasterFadeDurationAsExpression: Expression?\n      /**\n       * Get default value of the RasterFadeDuration property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-fade-duration\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterFadeDuration?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n     */\n    val defaultRasterHueRotate: Double?\n      /**\n       * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n       *\n       * Get the default value of RasterHueRotate property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-hue-rotate\").silentUnwrap()\n      }\n\n    /**\n     * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n     *\n     * This is an Expression representation of \"raster-hue-rotate\".\n     *\n     */\n    val defaultRasterHueRotateAsExpression: Expression?\n      /**\n       * Get default value of the RasterHueRotate property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-hue-rotate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterHueRotate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterHueRotate.\n     */\n    val defaultRasterHueRotateTransition: StyleTransition?\n      /**\n       * Get the RasterHueRotate property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-hue-rotate-transition\").silentUnwrap()\n\n    /**\n     * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n     */\n    val defaultRasterOpacity: Double?\n      /**\n       * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of RasterOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"raster-opacity\".\n     *\n     */\n    val defaultRasterOpacityAsExpression: Expression?\n      /**\n       * Get default value of the RasterOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterOpacity.\n     */\n    val defaultRasterOpacityTransition: StyleTransition?\n      /**\n       * Get the RasterOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-opacity-transition\").silentUnwrap()\n\n    /**\n     * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n     */\n    val defaultRasterResampling: RasterResampling?\n      /**\n       * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n       *\n       * Get the default value of RasterResampling property\n       *\n       * @return RasterResampling\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-resampling\").silentUnwrap<String>()?.let {\n          return RasterResampling.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n     *\n     * This is an Expression representation of \"raster-resampling\".\n     *\n     */\n    val defaultRasterResamplingAsExpression: Expression?\n      /**\n       * Get default value of the RasterResampling property as an Expression\n       *\n       * @return RasterResampling\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-resampling\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterResampling?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n     */\n    val defaultRasterSaturation: Double?\n      /**\n       * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n       *\n       * Get the default value of RasterSaturation property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-saturation\").silentUnwrap()\n      }\n\n    /**\n     * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n     *\n     * This is an Expression representation of \"raster-saturation\".\n     *\n     */\n    val defaultRasterSaturationAsExpression: Expression?\n      /**\n       * Get default value of the RasterSaturation property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-saturation\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterSaturation?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterSaturation.\n     */\n    val defaultRasterSaturationTransition: StyleTransition?\n      /**\n       * Get the RasterSaturation property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-saturation-transition\").silentUnwrap()\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface RasterLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): RasterLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): RasterLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): RasterLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): RasterLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): RasterLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): RasterLayer\n\n  // Property getters and setters\n\n  /**\n   * Displayed band of raster array source layer. Defaults to the first band if not set.\n   *\n   * @param rasterArrayBand value of rasterArrayBand\n   */\n  @MapboxExperimental\n  fun rasterArrayBand(rasterArrayBand: String): RasterLayer\n\n  /**\n   * Displayed band of raster array source layer. Defaults to the first band if not set.\n   *\n   * @param rasterArrayBand value of rasterArrayBand as Expression\n   */\n  @MapboxExperimental\n  fun rasterArrayBand(rasterArrayBand: Expression): RasterLayer\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * @param rasterBrightnessMax value of rasterBrightnessMax\n   */\n  fun rasterBrightnessMax(rasterBrightnessMax: Double = 1.0): RasterLayer\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * @param rasterBrightnessMax value of rasterBrightnessMax as Expression\n   */\n  fun rasterBrightnessMax(rasterBrightnessMax: Expression): RasterLayer\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * Set the RasterBrightnessMax property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun rasterBrightnessMaxTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [rasterBrightnessMaxTransition].\n   */\n  fun rasterBrightnessMaxTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * @param rasterBrightnessMin value of rasterBrightnessMin\n   */\n  fun rasterBrightnessMin(rasterBrightnessMin: Double = 0.0): RasterLayer\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * @param rasterBrightnessMin value of rasterBrightnessMin as Expression\n   */\n  fun rasterBrightnessMin(rasterBrightnessMin: Expression): RasterLayer\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * Set the RasterBrightnessMin property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun rasterBrightnessMinTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * Increase or reduce the brightness of the image. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * DSL for [rasterBrightnessMinTransition].\n   */\n  fun rasterBrightnessMinTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n\n  /**\n   * Defines a color map by which to colorize a raster layer, parameterized by the `[\"raster-value\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-color-range`.\n   *\n   * @param rasterColor value of rasterColor\n   */\n  fun rasterColor(rasterColor: Expression): RasterLayer\n\n  /**\n   * Set the rasterColorUseTheme as String for [rasterColor].\n   *\n   * @param rasterColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun rasterColorUseTheme(rasterColorUseTheme: String): RasterLayer\n\n  /**\n   * Set the rasterColorUseTheme as Expression for [rasterColor].\n   *\n   * @param rasterColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun rasterColorUseTheme(rasterColorUseTheme: Expression): RasterLayer\n\n  /**\n   * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n   *\n   * @param rasterColorMix value of rasterColorMix\n   */\n  fun rasterColorMix(rasterColorMix: List<Double> = listOf(0.2126, 0.7152, 0.0722, 0.0)): RasterLayer\n\n  /**\n   * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n   *\n   * @param rasterColorMix value of rasterColorMix as Expression\n   */\n  fun rasterColorMix(rasterColorMix: Expression): RasterLayer\n\n  /**\n   * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n   *\n   * Set the RasterColorMix property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun rasterColorMixTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * When `raster-color` is active, specifies the combination of source RGB channels used to compute the raster value. Computed using the equation `mix.r - src.r + mix.g - src.g + mix.b - src.b + mix.a`. The first three components specify the mix of source red, green, and blue channels, respectively. The fourth component serves as a constant offset and is -not- multipled by source alpha. Source alpha is instead carried through and applied as opacity to the colorized result. Default value corresponds to RGB luminosity. Default value: [0.2126,0.7152,0.0722,0].\n   *\n   * DSL for [rasterColorMixTransition].\n   */\n  fun rasterColorMixTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n\n  /**\n   * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n   *\n   * @param rasterColorRange value of rasterColorRange\n   */\n  fun rasterColorRange(rasterColorRange: List<Double>): RasterLayer\n\n  /**\n   * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n   *\n   * @param rasterColorRange value of rasterColorRange as Expression\n   */\n  fun rasterColorRange(rasterColorRange: Expression): RasterLayer\n\n  /**\n   * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n   *\n   * Set the RasterColorRange property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun rasterColorRangeTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * When `raster-color` is active, specifies the range over which `raster-color` is tabulated. Units correspond to the computed raster value via `raster-color-mix`. For `rasterarray` sources, if `raster-color-range` is unspecified, the source's stated data range is used.\n   *\n   * DSL for [rasterColorRangeTransition].\n   */\n  fun rasterColorRangeTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n\n  /**\n   * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * @param rasterContrast value of rasterContrast\n   */\n  fun rasterContrast(rasterContrast: Double = 0.0): RasterLayer\n\n  /**\n   * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * @param rasterContrast value of rasterContrast as Expression\n   */\n  fun rasterContrast(rasterContrast: Expression): RasterLayer\n\n  /**\n   * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * Set the RasterContrast property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun rasterContrastTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * Increase or reduce the contrast of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * DSL for [rasterContrastTransition].\n   */\n  fun rasterContrastTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n\n  /**\n   * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n   *\n   * @param rasterElevation value of rasterElevation\n   */\n  @MapboxExperimental\n  fun rasterElevation(rasterElevation: Double = 0.0): RasterLayer\n\n  /**\n   * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n   *\n   * @param rasterElevation value of rasterElevation as Expression\n   */\n  @MapboxExperimental\n  fun rasterElevation(rasterElevation: Expression): RasterLayer\n\n  /**\n   * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n   *\n   * Set the RasterElevation property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun rasterElevationTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * Defines an uniform elevation from the base specified in raster-elevation-reference, in meters. Default value: 0. Minimum value: 0.\n   *\n   * DSL for [rasterElevationTransition].\n   */\n  @MapboxExperimental\n  fun rasterElevationTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n   *\n   * @param rasterEmissiveStrength value of rasterEmissiveStrength\n   */\n  fun rasterEmissiveStrength(rasterEmissiveStrength: Double = 0.0): RasterLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n   *\n   * @param rasterEmissiveStrength value of rasterEmissiveStrength as Expression\n   */\n  fun rasterEmissiveStrength(rasterEmissiveStrength: Expression): RasterLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n   *\n   * Set the RasterEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun rasterEmissiveStrengthTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of rasterEmissiveStrength is in intensity.\n   *\n   * DSL for [rasterEmissiveStrengthTransition].\n   */\n  fun rasterEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n\n  /**\n   * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n   *\n   * @param rasterFadeDuration value of rasterFadeDuration\n   */\n  fun rasterFadeDuration(rasterFadeDuration: Double = 300.0): RasterLayer\n\n  /**\n   * Fade duration when a new tile is added. Default value: 300. Minimum value: 0. The unit of rasterFadeDuration is in milliseconds.\n   *\n   * @param rasterFadeDuration value of rasterFadeDuration as Expression\n   */\n  fun rasterFadeDuration(rasterFadeDuration: Expression): RasterLayer\n\n  /**\n   * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n   *\n   * @param rasterHueRotate value of rasterHueRotate\n   */\n  fun rasterHueRotate(rasterHueRotate: Double = 0.0): RasterLayer\n\n  /**\n   * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n   *\n   * @param rasterHueRotate value of rasterHueRotate as Expression\n   */\n  fun rasterHueRotate(rasterHueRotate: Expression): RasterLayer\n\n  /**\n   * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n   *\n   * Set the RasterHueRotate property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun rasterHueRotateTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * Rotates hues around the color wheel. Default value: 0. The unit of rasterHueRotate is in degrees.\n   *\n   * DSL for [rasterHueRotateTransition].\n   */\n  fun rasterHueRotateTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n\n  /**\n   * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param rasterOpacity value of rasterOpacity\n   */\n  fun rasterOpacity(rasterOpacity: Double = 1.0): RasterLayer\n\n  /**\n   * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param rasterOpacity value of rasterOpacity as Expression\n   */\n  fun rasterOpacity(rasterOpacity: Expression): RasterLayer\n\n  /**\n   * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Set the RasterOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun rasterOpacityTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * The opacity at which the image will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [rasterOpacityTransition].\n   */\n  fun rasterOpacityTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n\n  /**\n   * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n   *\n   * @param rasterResampling value of rasterResampling\n   */\n  fun rasterResampling(rasterResampling: RasterResampling = RasterResampling.LINEAR): RasterLayer\n\n  /**\n   * The resampling/interpolation method to use for overscaling, also known as texture magnification filter Default value: \"linear\".\n   *\n   * @param rasterResampling value of rasterResampling as Expression\n   */\n  fun rasterResampling(rasterResampling: Expression): RasterLayer\n\n  /**\n   * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * @param rasterSaturation value of rasterSaturation\n   */\n  fun rasterSaturation(rasterSaturation: Double = 0.0): RasterLayer\n\n  /**\n   * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * @param rasterSaturation value of rasterSaturation as Expression\n   */\n  fun rasterSaturation(rasterSaturation: Expression): RasterLayer\n\n  /**\n   * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * Set the RasterSaturation property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun rasterSaturationTransition(options: StyleTransition): RasterLayer\n\n  /**\n   * Increase or reduce the saturation of the image. Default value: 0. Value range: [-1, 1]\n   *\n   * DSL for [rasterSaturationTransition].\n   */\n  fun rasterSaturationTransition(block: StyleTransition.Builder.() -> Unit): RasterLayer\n}\n\n/**\n * DSL function for creating a [RasterLayer].\n */\nfun rasterLayer(layerId: String, sourceId: String, block: RasterLayerDsl.() -> Unit): RasterLayer = RasterLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/RasterParticleLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * Particle animation driven by textures such as wind maps.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#raster-particle)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\n@MapboxExperimental\nclass RasterParticleLayer(override val layerId: String, val sourceId: String) : RasterParticleLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): RasterParticleLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): RasterParticleLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [RasterParticleLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [RasterParticleLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [RasterParticleLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[RasterParticleLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [RasterParticleLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [RasterParticleLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): RasterParticleLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [RasterParticleLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [RasterParticleLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): RasterParticleLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * Displayed band of raster array source layer\n   */\n  @MapboxExperimental\n  val rasterParticleArrayBand: String?\n    /**\n     * Displayed band of raster array source layer\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleArrayBand] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"raster-particle-array-band\")\n    }\n\n  /**\n   * Displayed band of raster array source layer\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleArrayBand] to set the default property.\n   *\n   * @param rasterParticleArrayBand value of rasterParticleArrayBand\n   */\n  @MapboxExperimental\n  override fun rasterParticleArrayBand(rasterParticleArrayBand: String): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-array-band\", rasterParticleArrayBand)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Displayed band of raster array source layer\n   *\n   * This is an Expression representation of \"raster-particle-array-band\".\n   *\n   */\n  @MapboxExperimental\n  val rasterParticleArrayBandAsExpression: Expression?\n    /**\n     * Displayed band of raster array source layer\n     *\n     * Get the RasterParticleArrayBand property as an Expression\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleArrayBandAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-particle-array-band\")\n\n  /**\n   * Displayed band of raster array source layer\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleArrayBandAsExpression] to set the default property.\n   *\n   * @param rasterParticleArrayBand value of rasterParticleArrayBand as Expression\n   */\n  @MapboxExperimental\n  override fun rasterParticleArrayBand(rasterParticleArrayBand: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-array-band\", rasterParticleArrayBand)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines a color map by which to colorize a raster particle layer, parameterized by the `[\"raster-particle-speed\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-particle-max-speed`.\n   */\n  @MapboxExperimental\n  val rasterParticleColor: Expression?\n    /**\n     * Defines a color map by which to colorize a raster particle layer, parameterized by the `[\"raster-particle-speed\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-particle-max-speed`.\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleColor] to get the default property.\n     *\n     * @return Expression\n     */\n    get() {\n      return getPropertyValue(\"raster-particle-color\")\n    }\n\n  /**\n   * Defines a color map by which to colorize a raster particle layer, parameterized by the `[\"raster-particle-speed\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-particle-max-speed`.\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleColor] to set the default property.\n   *\n   * @param rasterParticleColor value of rasterParticleColor\n   */\n  @MapboxExperimental\n  override fun rasterParticleColor(rasterParticleColor: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-color\", rasterParticleColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [rasterParticleColor].\n   */\n  @MapboxExperimental\n  val rasterParticleColorUseTheme: String?\n    /**\n     * Get the RasterParticleColorUseTheme property\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleColorUseTheme] to get the default property.\n     *\n     * @return current RasterParticleColorUseTheme property as Expression\n     */\n    get() {\n      return getPropertyValue(\"raster-particle-color-use-theme\")\n    }\n\n  /**\n   * Set the RasterParticleColorUseTheme as String\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleColorUseTheme] to get the default property.\n   *\n   * @param rasterParticleColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun rasterParticleColorUseTheme(rasterParticleColorUseTheme: String): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-color-use-theme\", rasterParticleColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [rasterParticleColor].\n   */\n  @MapboxExperimental\n  val rasterParticleColorUseThemeAsExpression: Expression?\n    /**\n     * Get the RasterParticleColorUseTheme property\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleColorUseTheme] to get the default property.\n     *\n     * @return current RasterParticleColorUseTheme property as Expression\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"raster-particle-color-use-theme\")\n\n  /**\n   * Set the RasterParticleColorUseTheme as Expression\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleColorUseTheme] to get the default property.\n   *\n   * @param rasterParticleColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun rasterParticleColorUseTheme(rasterParticleColorUseTheme: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-color-use-theme\", rasterParticleColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n   */\n  @MapboxExperimental\n  val rasterParticleCount: Long?\n    /**\n     * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleCount] to get the default property.\n     *\n     * @return Long\n     */\n    get() {\n      return getPropertyValue<Number?>(\"raster-particle-count\")?.toLong()\n    }\n\n  /**\n   * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleCount] to set the default property.\n   *\n   * @param rasterParticleCount value of rasterParticleCount\n   */\n  @MapboxExperimental\n  override fun rasterParticleCount(rasterParticleCount: Long): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-count\", rasterParticleCount)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n   *\n   * This is an Expression representation of \"raster-particle-count\".\n   *\n   */\n  @MapboxExperimental\n  val rasterParticleCountAsExpression: Expression?\n    /**\n     * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n     *\n     * Get the RasterParticleCount property as an Expression\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleCountAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-particle-count\")\n        ?.let { expression ->\n          // Try to convert the expression to Long if it contains a Number, otherwise return the expression\n          (expression.literalValue as? Number)?.toLong()?.let { Expression.literal(it) }\n            ?: expression\n        }\n\n  /**\n   * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleCountAsExpression] to set the default property.\n   *\n   * @param rasterParticleCount value of rasterParticleCount as Expression\n   */\n  @MapboxExperimental\n  override fun rasterParticleCount(rasterParticleCount: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-count\", rasterParticleCount)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val rasterParticleFadeOpacityFactor: Double?\n    /**\n     * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleFadeOpacityFactor] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-particle-fade-opacity-factor\")\n    }\n\n  /**\n   * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleFadeOpacityFactor] to set the default property.\n   *\n   * @param rasterParticleFadeOpacityFactor value of rasterParticleFadeOpacityFactor\n   */\n  @MapboxExperimental\n  override fun rasterParticleFadeOpacityFactor(rasterParticleFadeOpacityFactor: Double): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-fade-opacity-factor\", rasterParticleFadeOpacityFactor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"raster-particle-fade-opacity-factor\".\n   *\n   */\n  @MapboxExperimental\n  val rasterParticleFadeOpacityFactorAsExpression: Expression?\n    /**\n     * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n     *\n     * Get the RasterParticleFadeOpacityFactor property as an Expression\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleFadeOpacityFactorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-particle-fade-opacity-factor\")\n\n  /**\n   * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleFadeOpacityFactorAsExpression] to set the default property.\n   *\n   * @param rasterParticleFadeOpacityFactor value of rasterParticleFadeOpacityFactor as Expression\n   */\n  @MapboxExperimental\n  override fun rasterParticleFadeOpacityFactor(rasterParticleFadeOpacityFactor: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-fade-opacity-factor\", rasterParticleFadeOpacityFactor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterParticleFadeOpacityFactor.\n   */\n  @MapboxExperimental\n  val rasterParticleFadeOpacityFactorTransition: StyleTransition?\n    /**\n     * Get the RasterParticleFadeOpacityFactor property transition options\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleFadeOpacityFactorTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-particle-fade-opacity-factor-transition\")\n    }\n\n  /**\n   * Set the RasterParticleFadeOpacityFactor property transition options\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleFadeOpacityFactorTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun rasterParticleFadeOpacityFactorTransition(options: StyleTransition): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-fade-opacity-factor-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterParticleFadeOpacityFactorTransition].\n   */\n  @MapboxExperimental\n  override fun rasterParticleFadeOpacityFactorTransition(block: StyleTransition.Builder.() -> Unit): RasterParticleLayer = apply {\n    rasterParticleFadeOpacityFactorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n   */\n  @MapboxExperimental\n  val rasterParticleMaxSpeed: Double?\n    /**\n     * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleMaxSpeed] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-particle-max-speed\")\n    }\n\n  /**\n   * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleMaxSpeed] to set the default property.\n   *\n   * @param rasterParticleMaxSpeed value of rasterParticleMaxSpeed\n   */\n  @MapboxExperimental\n  override fun rasterParticleMaxSpeed(rasterParticleMaxSpeed: Double): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-max-speed\", rasterParticleMaxSpeed)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n   *\n   * This is an Expression representation of \"raster-particle-max-speed\".\n   *\n   */\n  @MapboxExperimental\n  val rasterParticleMaxSpeedAsExpression: Expression?\n    /**\n     * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n     *\n     * Get the RasterParticleMaxSpeed property as an Expression\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleMaxSpeedAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-particle-max-speed\")\n\n  /**\n   * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleMaxSpeedAsExpression] to set the default property.\n   *\n   * @param rasterParticleMaxSpeed value of rasterParticleMaxSpeed as Expression\n   */\n  @MapboxExperimental\n  override fun rasterParticleMaxSpeed(rasterParticleMaxSpeed: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-max-speed\", rasterParticleMaxSpeed)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val rasterParticleResetRateFactor: Double?\n    /**\n     * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleResetRateFactor] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-particle-reset-rate-factor\")\n    }\n\n  /**\n   * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleResetRateFactor] to set the default property.\n   *\n   * @param rasterParticleResetRateFactor value of rasterParticleResetRateFactor\n   */\n  @MapboxExperimental\n  override fun rasterParticleResetRateFactor(rasterParticleResetRateFactor: Double): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-reset-rate-factor\", rasterParticleResetRateFactor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"raster-particle-reset-rate-factor\".\n   *\n   */\n  @MapboxExperimental\n  val rasterParticleResetRateFactorAsExpression: Expression?\n    /**\n     * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n     *\n     * Get the RasterParticleResetRateFactor property as an Expression\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleResetRateFactorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-particle-reset-rate-factor\")\n\n  /**\n   * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleResetRateFactorAsExpression] to set the default property.\n   *\n   * @param rasterParticleResetRateFactor value of rasterParticleResetRateFactor as Expression\n   */\n  @MapboxExperimental\n  override fun rasterParticleResetRateFactor(rasterParticleResetRateFactor: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-reset-rate-factor\", rasterParticleResetRateFactor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val rasterParticleSpeedFactor: Double?\n    /**\n     * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleSpeedFactor] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"raster-particle-speed-factor\")\n    }\n\n  /**\n   * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleSpeedFactor] to set the default property.\n   *\n   * @param rasterParticleSpeedFactor value of rasterParticleSpeedFactor\n   */\n  @MapboxExperimental\n  override fun rasterParticleSpeedFactor(rasterParticleSpeedFactor: Double): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-speed-factor\", rasterParticleSpeedFactor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"raster-particle-speed-factor\".\n   *\n   */\n  @MapboxExperimental\n  val rasterParticleSpeedFactorAsExpression: Expression?\n    /**\n     * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n     *\n     * Get the RasterParticleSpeedFactor property as an Expression\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleSpeedFactorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"raster-particle-speed-factor\")\n\n  /**\n   * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleSpeedFactorAsExpression] to set the default property.\n   *\n   * @param rasterParticleSpeedFactor value of rasterParticleSpeedFactor as Expression\n   */\n  @MapboxExperimental\n  override fun rasterParticleSpeedFactor(rasterParticleSpeedFactor: Expression): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-speed-factor\", rasterParticleSpeedFactor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for RasterParticleSpeedFactor.\n   */\n  @MapboxExperimental\n  val rasterParticleSpeedFactorTransition: StyleTransition?\n    /**\n     * Get the RasterParticleSpeedFactor property transition options\n     *\n     * Use static method [RasterParticleLayer.defaultRasterParticleSpeedFactorTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"raster-particle-speed-factor-transition\")\n    }\n\n  /**\n   * Set the RasterParticleSpeedFactor property transition options\n   *\n   * Use static method [RasterParticleLayer.defaultRasterParticleSpeedFactorTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun rasterParticleSpeedFactorTransition(options: StyleTransition): RasterParticleLayer = apply {\n    val propertyValue = PropertyValue(\"raster-particle-speed-factor-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [rasterParticleSpeedFactorTransition].\n   */\n  @MapboxExperimental\n  override fun rasterParticleSpeedFactorTransition(block: StyleTransition.Builder.() -> Unit): RasterParticleLayer = apply {\n    rasterParticleSpeedFactorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"raster-particle\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Displayed band of raster array source layer\n     */\n    @MapboxExperimental\n    val defaultRasterParticleArrayBand: String?\n      /**\n       * Displayed band of raster array source layer\n       *\n       * Get the default value of RasterParticleArrayBand property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-array-band\").silentUnwrap()\n      }\n\n    /**\n     * Displayed band of raster array source layer\n     *\n     * This is an Expression representation of \"raster-particle-array-band\".\n     *\n     */\n    @MapboxExperimental\n    val defaultRasterParticleArrayBandAsExpression: Expression?\n      /**\n       * Get default value of the RasterParticleArrayBand property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-array-band\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterParticleArrayBand?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Defines a color map by which to colorize a raster particle layer, parameterized by the `[\"raster-particle-speed\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-particle-max-speed`.\n     */\n    @MapboxExperimental\n    val defaultRasterParticleColor: Expression?\n      /**\n       * Defines a color map by which to colorize a raster particle layer, parameterized by the `[\"raster-particle-speed\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-particle-max-speed`.\n       *\n       * Get the default value of RasterParticleColor property\n       *\n       * @return Expression\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-color\").silentUnwrap()\n      }\n\n    /**\n     * Default color theme for [rasterParticleColor].\n     */\n    @MapboxExperimental\n    val defaultRasterParticleColorUseTheme: String?\n      /**\n       * Get default value of the RasterParticleColor property as String\n       *\n       * @return Expression\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [rasterParticleColor].\n     */\n    @MapboxExperimental\n    val defaultRasterParticleColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the RasterParticleColor property as Expression\n       *\n       * @return Expression\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultRasterParticleColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n     */\n    @MapboxExperimental\n    val defaultRasterParticleCount: Long?\n      /**\n       * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n       *\n       * Get the default value of RasterParticleCount property\n       *\n       * @return Long\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-count\").silentUnwrap<Number?>()?.toLong()\n      }\n\n    /**\n     * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n     *\n     * This is an Expression representation of \"raster-particle-count\".\n     *\n     */\n    @MapboxExperimental\n    val defaultRasterParticleCountAsExpression: Expression?\n      /**\n       * Get default value of the RasterParticleCount property as an Expression\n       *\n       * @return Long\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-count\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterParticleCount?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n     */\n    @MapboxExperimental\n    val defaultRasterParticleFadeOpacityFactor: Double?\n      /**\n       * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n       *\n       * Get the default value of RasterParticleFadeOpacityFactor property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-fade-opacity-factor\").silentUnwrap()\n      }\n\n    /**\n     * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"raster-particle-fade-opacity-factor\".\n     *\n     */\n    @MapboxExperimental\n    val defaultRasterParticleFadeOpacityFactorAsExpression: Expression?\n      /**\n       * Get default value of the RasterParticleFadeOpacityFactor property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-fade-opacity-factor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterParticleFadeOpacityFactor?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterParticleFadeOpacityFactor.\n     */\n    @MapboxExperimental\n    val defaultRasterParticleFadeOpacityFactorTransition: StyleTransition?\n      /**\n       * Get the RasterParticleFadeOpacityFactor property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-fade-opacity-factor-transition\").silentUnwrap()\n\n    /**\n     * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n     */\n    @MapboxExperimental\n    val defaultRasterParticleMaxSpeed: Double?\n      /**\n       * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n       *\n       * Get the default value of RasterParticleMaxSpeed property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-max-speed\").silentUnwrap()\n      }\n\n    /**\n     * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n     *\n     * This is an Expression representation of \"raster-particle-max-speed\".\n     *\n     */\n    @MapboxExperimental\n    val defaultRasterParticleMaxSpeedAsExpression: Expression?\n      /**\n       * Get default value of the RasterParticleMaxSpeed property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-max-speed\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterParticleMaxSpeed?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n     */\n    @MapboxExperimental\n    val defaultRasterParticleResetRateFactor: Double?\n      /**\n       * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n       *\n       * Get the default value of RasterParticleResetRateFactor property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-reset-rate-factor\").silentUnwrap()\n      }\n\n    /**\n     * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"raster-particle-reset-rate-factor\".\n     *\n     */\n    @MapboxExperimental\n    val defaultRasterParticleResetRateFactorAsExpression: Expression?\n      /**\n       * Get default value of the RasterParticleResetRateFactor property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-reset-rate-factor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterParticleResetRateFactor?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n     */\n    @MapboxExperimental\n    val defaultRasterParticleSpeedFactor: Double?\n      /**\n       * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n       *\n       * Get the default value of RasterParticleSpeedFactor property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-speed-factor\").silentUnwrap()\n      }\n\n    /**\n     * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"raster-particle-speed-factor\".\n     *\n     */\n    @MapboxExperimental\n    val defaultRasterParticleSpeedFactorAsExpression: Expression?\n      /**\n       * Get default value of the RasterParticleSpeedFactor property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-speed-factor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultRasterParticleSpeedFactor?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for RasterParticleSpeedFactor.\n     */\n    @MapboxExperimental\n    val defaultRasterParticleSpeedFactorTransition: StyleTransition?\n      /**\n       * Get the RasterParticleSpeedFactor property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-speed-factor-transition\").silentUnwrap()\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@MapboxExperimental\n@LayersDsl\ninterface RasterParticleLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): RasterParticleLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): RasterParticleLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): RasterParticleLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): RasterParticleLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): RasterParticleLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): RasterParticleLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): RasterParticleLayer\n\n  // Property getters and setters\n\n  /**\n   * Displayed band of raster array source layer\n   *\n   * @param rasterParticleArrayBand value of rasterParticleArrayBand\n   */\n  @MapboxExperimental\n  fun rasterParticleArrayBand(rasterParticleArrayBand: String): RasterParticleLayer\n\n  /**\n   * Displayed band of raster array source layer\n   *\n   * @param rasterParticleArrayBand value of rasterParticleArrayBand as Expression\n   */\n  @MapboxExperimental\n  fun rasterParticleArrayBand(rasterParticleArrayBand: Expression): RasterParticleLayer\n\n  /**\n   * Defines a color map by which to colorize a raster particle layer, parameterized by the `[\"raster-particle-speed\"]` expression and evaluated at 256 uniformly spaced steps over the range specified by `raster-particle-max-speed`.\n   *\n   * @param rasterParticleColor value of rasterParticleColor\n   */\n  @MapboxExperimental\n  fun rasterParticleColor(rasterParticleColor: Expression): RasterParticleLayer\n\n  /**\n   * Set the rasterParticleColorUseTheme as String for [rasterParticleColor].\n   *\n   * @param rasterParticleColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun rasterParticleColorUseTheme(rasterParticleColorUseTheme: String): RasterParticleLayer\n\n  /**\n   * Set the rasterParticleColorUseTheme as Expression for [rasterParticleColor].\n   *\n   * @param rasterParticleColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun rasterParticleColorUseTheme(rasterParticleColorUseTheme: Expression): RasterParticleLayer\n\n  /**\n   * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n   *\n   * @param rasterParticleCount value of rasterParticleCount\n   */\n  @MapboxExperimental\n  fun rasterParticleCount(rasterParticleCount: Long = 512L): RasterParticleLayer\n\n  /**\n   * Defines the amount of particles per tile. Default value: 512. Minimum value: 1.\n   *\n   * @param rasterParticleCount value of rasterParticleCount as Expression\n   */\n  @MapboxExperimental\n  fun rasterParticleCount(rasterParticleCount: Expression): RasterParticleLayer\n\n  /**\n   * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n   *\n   * @param rasterParticleFadeOpacityFactor value of rasterParticleFadeOpacityFactor\n   */\n  @MapboxExperimental\n  fun rasterParticleFadeOpacityFactor(rasterParticleFadeOpacityFactor: Double = 0.98): RasterParticleLayer\n\n  /**\n   * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n   *\n   * @param rasterParticleFadeOpacityFactor value of rasterParticleFadeOpacityFactor as Expression\n   */\n  @MapboxExperimental\n  fun rasterParticleFadeOpacityFactor(rasterParticleFadeOpacityFactor: Expression): RasterParticleLayer\n\n  /**\n   * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n   *\n   * Set the RasterParticleFadeOpacityFactor property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun rasterParticleFadeOpacityFactorTransition(options: StyleTransition): RasterParticleLayer\n\n  /**\n   * Defines defines the opacity coefficient applied to the faded particles in each frame. In practice, this property controls the length of the particle tail. Default value: 0.98. Value range: [0, 1]\n   *\n   * DSL for [rasterParticleFadeOpacityFactorTransition].\n   */\n  @MapboxExperimental\n  fun rasterParticleFadeOpacityFactorTransition(block: StyleTransition.Builder.() -> Unit): RasterParticleLayer\n\n  /**\n   * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n   *\n   * @param rasterParticleMaxSpeed value of rasterParticleMaxSpeed\n   */\n  @MapboxExperimental\n  fun rasterParticleMaxSpeed(rasterParticleMaxSpeed: Double = 1.0): RasterParticleLayer\n\n  /**\n   * Defines the maximum speed for particles. Velocities with magnitudes equal to or exceeding this value are clamped to the max value. Default value: 1. Minimum value: 1.\n   *\n   * @param rasterParticleMaxSpeed value of rasterParticleMaxSpeed as Expression\n   */\n  @MapboxExperimental\n  fun rasterParticleMaxSpeed(rasterParticleMaxSpeed: Expression): RasterParticleLayer\n\n  /**\n   * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n   *\n   * @param rasterParticleResetRateFactor value of rasterParticleResetRateFactor\n   */\n  @MapboxExperimental\n  fun rasterParticleResetRateFactor(rasterParticleResetRateFactor: Double = 0.8): RasterParticleLayer\n\n  /**\n   * Defines a coefficient for a time period at which particles will restart at a random position, to avoid degeneration (empty areas without particles). Default value: 0.8. Value range: [0, 1]\n   *\n   * @param rasterParticleResetRateFactor value of rasterParticleResetRateFactor as Expression\n   */\n  @MapboxExperimental\n  fun rasterParticleResetRateFactor(rasterParticleResetRateFactor: Expression): RasterParticleLayer\n\n  /**\n   * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n   *\n   * @param rasterParticleSpeedFactor value of rasterParticleSpeedFactor\n   */\n  @MapboxExperimental\n  fun rasterParticleSpeedFactor(rasterParticleSpeedFactor: Double = 0.2): RasterParticleLayer\n\n  /**\n   * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n   *\n   * @param rasterParticleSpeedFactor value of rasterParticleSpeedFactor as Expression\n   */\n  @MapboxExperimental\n  fun rasterParticleSpeedFactor(rasterParticleSpeedFactor: Expression): RasterParticleLayer\n\n  /**\n   * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n   *\n   * Set the RasterParticleSpeedFactor property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun rasterParticleSpeedFactorTransition(options: StyleTransition): RasterParticleLayer\n\n  /**\n   * Defines a coefficient for the speed of particles’ motion. Default value: 0.2. Value range: [0, 1]\n   *\n   * DSL for [rasterParticleSpeedFactorTransition].\n   */\n  @MapboxExperimental\n  fun rasterParticleSpeedFactorTransition(block: StyleTransition.Builder.() -> Unit): RasterParticleLayer\n}\n\n/**\n * DSL function for creating a [RasterParticleLayer].\n */\n@MapboxExperimental\nfun rasterParticleLayer(layerId: String, sourceId: String, block: RasterParticleLayerDsl.() -> Unit): RasterParticleLayer = RasterParticleLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/SkyLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A spherical dome around the map that is always rendered behind all other layers.\n *\n * **Warning**: As of v10.6.0, [Atmosphere] is the preferred method for atmospheric styling.\n * Sky layer is not supported by the globe projection, and will be phased out in future major release.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#sky)\n *\n * @param layerId the ID of the layer\n */\n@UiThread\nclass SkyLayer(override val layerId: String) : SkyLayerDsl, Layer() {\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): SkyLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [SkyLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [SkyLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [SkyLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[SkyLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [SkyLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [SkyLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): SkyLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [SkyLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [SkyLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): SkyLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   */\n  val skyAtmosphereColor: String?\n    /**\n     * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      skyAtmosphereColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereColor] to set the default property.\n   *\n   * @param skyAtmosphereColor value of skyAtmosphereColor\n   */\n  override fun skyAtmosphereColor(skyAtmosphereColor: String): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-color\", skyAtmosphereColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   *\n   * This is an Expression representation of \"sky-atmosphere-color\".\n   *\n   */\n  val skyAtmosphereColorAsExpression: Expression?\n    /**\n     * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n     *\n     * Get the SkyAtmosphereColor property as an Expression\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"sky-atmosphere-color\")\n\n  /**\n   * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereColorAsExpression] to set the default property.\n   *\n   * @param skyAtmosphereColor value of skyAtmosphereColor as Expression\n   */\n  override fun skyAtmosphereColor(skyAtmosphereColor: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-color\", skyAtmosphereColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   */\n  val skyAtmosphereColorAsColorInt: Int?\n    /**\n     * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      skyAtmosphereColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereColorAsColorInt] to set the default property.\n   *\n   * @param skyAtmosphereColor value of skyAtmosphereColor\n   */\n  override fun skyAtmosphereColor(@ColorInt skyAtmosphereColor: Int): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-color\", colorIntToRgbaExpression(skyAtmosphereColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [skyAtmosphereColor].\n   */\n  @MapboxExperimental\n  val skyAtmosphereColorUseTheme: String?\n    /**\n     * Get the SkyAtmosphereColorUseTheme property\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereColorUseTheme] to get the default property.\n     *\n     * @return current SkyAtmosphereColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"sky-atmosphere-color-use-theme\")\n    }\n\n  /**\n   * Set the SkyAtmosphereColorUseTheme as String\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereColorUseTheme] to get the default property.\n   *\n   * @param skyAtmosphereColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun skyAtmosphereColorUseTheme(skyAtmosphereColorUseTheme: String): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-color-use-theme\", skyAtmosphereColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [skyAtmosphereColor].\n   */\n  @MapboxExperimental\n  val skyAtmosphereColorUseThemeAsExpression: Expression?\n    /**\n     * Get the SkyAtmosphereColorUseTheme property\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereColorUseTheme] to get the default property.\n     *\n     * @return current SkyAtmosphereColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"sky-atmosphere-color-use-theme\")\n\n  /**\n   * Set the SkyAtmosphereColorUseTheme as Expression\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereColorUseTheme] to get the default property.\n   *\n   * @param skyAtmosphereColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun skyAtmosphereColorUseTheme(skyAtmosphereColorUseTheme: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-color-use-theme\", skyAtmosphereColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   */\n  val skyAtmosphereHaloColor: String?\n    /**\n     * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereHaloColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      skyAtmosphereHaloColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereHaloColor] to set the default property.\n   *\n   * @param skyAtmosphereHaloColor value of skyAtmosphereHaloColor\n   */\n  override fun skyAtmosphereHaloColor(skyAtmosphereHaloColor: String): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-halo-color\", skyAtmosphereHaloColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   *\n   * This is an Expression representation of \"sky-atmosphere-halo-color\".\n   *\n   */\n  val skyAtmosphereHaloColorAsExpression: Expression?\n    /**\n     * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n     *\n     * Get the SkyAtmosphereHaloColor property as an Expression\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereHaloColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"sky-atmosphere-halo-color\")\n\n  /**\n   * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereHaloColorAsExpression] to set the default property.\n   *\n   * @param skyAtmosphereHaloColor value of skyAtmosphereHaloColor as Expression\n   */\n  override fun skyAtmosphereHaloColor(skyAtmosphereHaloColor: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-halo-color\", skyAtmosphereHaloColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   */\n  val skyAtmosphereHaloColorAsColorInt: Int?\n    /**\n     * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereHaloColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      skyAtmosphereHaloColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereHaloColorAsColorInt] to set the default property.\n   *\n   * @param skyAtmosphereHaloColor value of skyAtmosphereHaloColor\n   */\n  override fun skyAtmosphereHaloColor(@ColorInt skyAtmosphereHaloColor: Int): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-halo-color\", colorIntToRgbaExpression(skyAtmosphereHaloColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [skyAtmosphereHaloColor].\n   */\n  @MapboxExperimental\n  val skyAtmosphereHaloColorUseTheme: String?\n    /**\n     * Get the SkyAtmosphereHaloColorUseTheme property\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereHaloColorUseTheme] to get the default property.\n     *\n     * @return current SkyAtmosphereHaloColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"sky-atmosphere-halo-color-use-theme\")\n    }\n\n  /**\n   * Set the SkyAtmosphereHaloColorUseTheme as String\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereHaloColorUseTheme] to get the default property.\n   *\n   * @param skyAtmosphereHaloColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun skyAtmosphereHaloColorUseTheme(skyAtmosphereHaloColorUseTheme: String): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-halo-color-use-theme\", skyAtmosphereHaloColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [skyAtmosphereHaloColor].\n   */\n  @MapboxExperimental\n  val skyAtmosphereHaloColorUseThemeAsExpression: Expression?\n    /**\n     * Get the SkyAtmosphereHaloColorUseTheme property\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereHaloColorUseTheme] to get the default property.\n     *\n     * @return current SkyAtmosphereHaloColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"sky-atmosphere-halo-color-use-theme\")\n\n  /**\n   * Set the SkyAtmosphereHaloColorUseTheme as Expression\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereHaloColorUseTheme] to get the default property.\n   *\n   * @param skyAtmosphereHaloColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun skyAtmosphereHaloColorUseTheme(skyAtmosphereHaloColorUseTheme: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-halo-color-use-theme\", skyAtmosphereHaloColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n   */\n  val skyAtmosphereSun: List<Double>?\n    /**\n     * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereSun] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"sky-atmosphere-sun\")\n    }\n\n  /**\n   * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereSun] to set the default property.\n   *\n   * @param skyAtmosphereSun value of skyAtmosphereSun\n   */\n  override fun skyAtmosphereSun(skyAtmosphereSun: List<Double>): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-sun\", skyAtmosphereSun)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n   *\n   * This is an Expression representation of \"sky-atmosphere-sun\".\n   *\n   */\n  val skyAtmosphereSunAsExpression: Expression?\n    /**\n     * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n     *\n     * Get the SkyAtmosphereSun property as an Expression\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereSunAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"sky-atmosphere-sun\")\n\n  /**\n   * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereSunAsExpression] to set the default property.\n   *\n   * @param skyAtmosphereSun value of skyAtmosphereSun as Expression\n   */\n  override fun skyAtmosphereSun(skyAtmosphereSun: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-sun\", skyAtmosphereSun)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n   */\n  val skyAtmosphereSunIntensity: Double?\n    /**\n     * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereSunIntensity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"sky-atmosphere-sun-intensity\")\n    }\n\n  /**\n   * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereSunIntensity] to set the default property.\n   *\n   * @param skyAtmosphereSunIntensity value of skyAtmosphereSunIntensity\n   */\n  override fun skyAtmosphereSunIntensity(skyAtmosphereSunIntensity: Double): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-sun-intensity\", skyAtmosphereSunIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n   *\n   * This is an Expression representation of \"sky-atmosphere-sun-intensity\".\n   *\n   */\n  val skyAtmosphereSunIntensityAsExpression: Expression?\n    /**\n     * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n     *\n     * Get the SkyAtmosphereSunIntensity property as an Expression\n     *\n     * Use static method [SkyLayer.defaultSkyAtmosphereSunIntensityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"sky-atmosphere-sun-intensity\")\n\n  /**\n   * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n   *\n   * Use static method [SkyLayer.defaultSkyAtmosphereSunIntensityAsExpression] to set the default property.\n   *\n   * @param skyAtmosphereSunIntensity value of skyAtmosphereSunIntensity as Expression\n   */\n  override fun skyAtmosphereSunIntensity(skyAtmosphereSunIntensity: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-atmosphere-sun-intensity\", skyAtmosphereSunIntensity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`. Default value: [\"interpolate\",[\"linear\"],[\"sky-radial-progress\"],0.8,\"#87ceeb\",1,\"white\"].\n   */\n  val skyGradient: Expression?\n    /**\n     * Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`. Default value: [\"interpolate\",[\"linear\"],[\"sky-radial-progress\"],0.8,\"#87ceeb\",1,\"white\"].\n     *\n     * Use static method [SkyLayer.defaultSkyGradient] to get the default property.\n     *\n     * @return Expression\n     */\n    get() {\n      return getPropertyValue(\"sky-gradient\")\n    }\n\n  /**\n   * Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`. Default value: [\"interpolate\",[\"linear\"],[\"sky-radial-progress\"],0.8,\"#87ceeb\",1,\"white\"].\n   *\n   * Use static method [SkyLayer.defaultSkyGradient] to set the default property.\n   *\n   * @param skyGradient value of skyGradient\n   */\n  override fun skyGradient(skyGradient: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-gradient\", skyGradient)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [skyGradient].\n   */\n  @MapboxExperimental\n  val skyGradientUseTheme: String?\n    /**\n     * Get the SkyGradientUseTheme property\n     *\n     * Use static method [SkyLayer.defaultSkyGradientUseTheme] to get the default property.\n     *\n     * @return current SkyGradientUseTheme property as Expression\n     */\n    get() {\n      return getPropertyValue(\"sky-gradient-use-theme\")\n    }\n\n  /**\n   * Set the SkyGradientUseTheme as String\n   *\n   * Use static method [SkyLayer.defaultSkyGradientUseTheme] to get the default property.\n   *\n   * @param skyGradientUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun skyGradientUseTheme(skyGradientUseTheme: String): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-gradient-use-theme\", skyGradientUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [skyGradient].\n   */\n  @MapboxExperimental\n  val skyGradientUseThemeAsExpression: Expression?\n    /**\n     * Get the SkyGradientUseTheme property\n     *\n     * Use static method [SkyLayer.defaultSkyGradientUseTheme] to get the default property.\n     *\n     * @return current SkyGradientUseTheme property as Expression\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"sky-gradient-use-theme\")\n\n  /**\n   * Set the SkyGradientUseTheme as Expression\n   *\n   * Use static method [SkyLayer.defaultSkyGradientUseTheme] to get the default property.\n   *\n   * @param skyGradientUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun skyGradientUseTheme(skyGradientUseTheme: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-gradient-use-theme\", skyGradientUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n   */\n  val skyGradientCenter: List<Double>?\n    /**\n     * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n     *\n     * Use static method [SkyLayer.defaultSkyGradientCenter] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"sky-gradient-center\")\n    }\n\n  /**\n   * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n   *\n   * Use static method [SkyLayer.defaultSkyGradientCenter] to set the default property.\n   *\n   * @param skyGradientCenter value of skyGradientCenter\n   */\n  override fun skyGradientCenter(skyGradientCenter: List<Double>): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-gradient-center\", skyGradientCenter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n   *\n   * This is an Expression representation of \"sky-gradient-center\".\n   *\n   */\n  val skyGradientCenterAsExpression: Expression?\n    /**\n     * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n     *\n     * Get the SkyGradientCenter property as an Expression\n     *\n     * Use static method [SkyLayer.defaultSkyGradientCenterAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"sky-gradient-center\")\n\n  /**\n   * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n   *\n   * Use static method [SkyLayer.defaultSkyGradientCenterAsExpression] to set the default property.\n   *\n   * @param skyGradientCenter value of skyGradientCenter as Expression\n   */\n  override fun skyGradientCenter(skyGradientCenter: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-gradient-center\", skyGradientCenter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n   */\n  val skyGradientRadius: Double?\n    /**\n     * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n     *\n     * Use static method [SkyLayer.defaultSkyGradientRadius] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"sky-gradient-radius\")\n    }\n\n  /**\n   * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n   *\n   * Use static method [SkyLayer.defaultSkyGradientRadius] to set the default property.\n   *\n   * @param skyGradientRadius value of skyGradientRadius\n   */\n  override fun skyGradientRadius(skyGradientRadius: Double): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-gradient-radius\", skyGradientRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n   *\n   * This is an Expression representation of \"sky-gradient-radius\".\n   *\n   */\n  val skyGradientRadiusAsExpression: Expression?\n    /**\n     * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n     *\n     * Get the SkyGradientRadius property as an Expression\n     *\n     * Use static method [SkyLayer.defaultSkyGradientRadiusAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"sky-gradient-radius\")\n\n  /**\n   * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n   *\n   * Use static method [SkyLayer.defaultSkyGradientRadiusAsExpression] to set the default property.\n   *\n   * @param skyGradientRadius value of skyGradientRadius as Expression\n   */\n  override fun skyGradientRadius(skyGradientRadius: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-gradient-radius\", skyGradientRadius)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n   */\n  val skyOpacity: Double?\n    /**\n     * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [SkyLayer.defaultSkyOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"sky-opacity\")\n    }\n\n  /**\n   * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [SkyLayer.defaultSkyOpacity] to set the default property.\n   *\n   * @param skyOpacity value of skyOpacity\n   */\n  override fun skyOpacity(skyOpacity: Double): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-opacity\", skyOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"sky-opacity\".\n   *\n   */\n  val skyOpacityAsExpression: Expression?\n    /**\n     * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n     *\n     * Get the SkyOpacity property as an Expression\n     *\n     * Use static method [SkyLayer.defaultSkyOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"sky-opacity\")\n\n  /**\n   * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [SkyLayer.defaultSkyOpacityAsExpression] to set the default property.\n   *\n   * @param skyOpacity value of skyOpacity as Expression\n   */\n  override fun skyOpacity(skyOpacity: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-opacity\", skyOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for SkyOpacity.\n   */\n  val skyOpacityTransition: StyleTransition?\n    /**\n     * Get the SkyOpacity property transition options\n     *\n     * Use static method [SkyLayer.defaultSkyOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"sky-opacity-transition\")\n    }\n\n  /**\n   * Set the SkyOpacity property transition options\n   *\n   * Use static method [SkyLayer.defaultSkyOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun skyOpacityTransition(options: StyleTransition): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [skyOpacityTransition].\n   */\n  override fun skyOpacityTransition(block: StyleTransition.Builder.() -> Unit): SkyLayer = apply {\n    skyOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The type of the sky Default value: \"atmosphere\".\n   */\n  val skyType: SkyType?\n    /**\n     * The type of the sky Default value: \"atmosphere\".\n     *\n     * Use static method [SkyLayer.defaultSkyType] to get the default property.\n     *\n     * @return SkyType\n     */\n    get() {\n      getPropertyValue<String?>(\"sky-type\")?.let {\n        return SkyType.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * The type of the sky Default value: \"atmosphere\".\n   *\n   * Use static method [SkyLayer.defaultSkyType] to set the default property.\n   *\n   * @param skyType value of skyType\n   */\n  override fun skyType(skyType: SkyType): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-type\", skyType)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The type of the sky Default value: \"atmosphere\".\n   *\n   * This is an Expression representation of \"sky-type\".\n   *\n   */\n  val skyTypeAsExpression: Expression?\n    /**\n     * The type of the sky Default value: \"atmosphere\".\n     *\n     * Get the SkyType property as an Expression\n     *\n     * Use static method [SkyLayer.defaultSkyTypeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"sky-type\")\n        ?: skyType?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * The type of the sky Default value: \"atmosphere\".\n   *\n   * Use static method [SkyLayer.defaultSkyTypeAsExpression] to set the default property.\n   *\n   * @param skyType value of skyType as Expression\n   */\n  override fun skyType(skyType: Expression): SkyLayer = apply {\n    val propertyValue = PropertyValue(\"sky-type\", skyType)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"sky\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n     */\n    val defaultSkyAtmosphereColor: String?\n      /**\n       * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n       *\n       * Get the default value of SkyAtmosphereColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultSkyAtmosphereColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n     *\n     * This is an Expression representation of \"sky-atmosphere-color\".\n     *\n     */\n    val defaultSkyAtmosphereColorAsExpression: Expression?\n      /**\n       * Get default value of the SkyAtmosphereColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n     */\n    val defaultSkyAtmosphereColorAsColorInt: Int?\n      /**\n       * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n       *\n       * Get the default value of SkyAtmosphereColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultSkyAtmosphereColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Default color theme for [skyAtmosphereColor].\n     */\n    @MapboxExperimental\n    val defaultSkyAtmosphereColorUseTheme: String?\n      /**\n       * Get default value of the SkyAtmosphereColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [skyAtmosphereColor].\n     */\n    @MapboxExperimental\n    val defaultSkyAtmosphereColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the SkyAtmosphereColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultSkyAtmosphereColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n     */\n    val defaultSkyAtmosphereHaloColor: String?\n      /**\n       * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n       *\n       * Get the default value of SkyAtmosphereHaloColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultSkyAtmosphereHaloColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n     *\n     * This is an Expression representation of \"sky-atmosphere-halo-color\".\n     *\n     */\n    val defaultSkyAtmosphereHaloColorAsExpression: Expression?\n      /**\n       * Get default value of the SkyAtmosphereHaloColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-halo-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n     */\n    val defaultSkyAtmosphereHaloColorAsColorInt: Int?\n      /**\n       * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n       *\n       * Get the default value of SkyAtmosphereHaloColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultSkyAtmosphereHaloColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Default color theme for [skyAtmosphereHaloColor].\n     */\n    @MapboxExperimental\n    val defaultSkyAtmosphereHaloColorUseTheme: String?\n      /**\n       * Get default value of the SkyAtmosphereHaloColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-halo-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [skyAtmosphereHaloColor].\n     */\n    @MapboxExperimental\n    val defaultSkyAtmosphereHaloColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the SkyAtmosphereHaloColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-halo-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultSkyAtmosphereHaloColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n     */\n    val defaultSkyAtmosphereSun: List<Double>?\n      /**\n       * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n       *\n       * Get the default value of SkyAtmosphereSun property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun\").silentUnwrap()\n      }\n\n    /**\n     * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n     *\n     * This is an Expression representation of \"sky-atmosphere-sun\".\n     *\n     */\n    val defaultSkyAtmosphereSunAsExpression: Expression?\n      /**\n       * Get default value of the SkyAtmosphereSun property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSkyAtmosphereSun?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n     */\n    val defaultSkyAtmosphereSunIntensity: Double?\n      /**\n       * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n       *\n       * Get the default value of SkyAtmosphereSunIntensity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun-intensity\").silentUnwrap()\n      }\n\n    /**\n     * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n     *\n     * This is an Expression representation of \"sky-atmosphere-sun-intensity\".\n     *\n     */\n    val defaultSkyAtmosphereSunIntensityAsExpression: Expression?\n      /**\n       * Get default value of the SkyAtmosphereSunIntensity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun-intensity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSkyAtmosphereSunIntensity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`. Default value: [\"interpolate\",[\"linear\"],[\"sky-radial-progress\"],0.8,\"#87ceeb\",1,\"white\"].\n     */\n    val defaultSkyGradient: Expression?\n      /**\n       * Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`. Default value: [\"interpolate\",[\"linear\"],[\"sky-radial-progress\"],0.8,\"#87ceeb\",1,\"white\"].\n       *\n       * Get the default value of SkyGradient property\n       *\n       * @return Expression\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient\").silentUnwrap()\n      }\n\n    /**\n     * Default color theme for [skyGradient].\n     */\n    @MapboxExperimental\n    val defaultSkyGradientUseTheme: String?\n      /**\n       * Get default value of the SkyGradient property as String\n       *\n       * @return Expression\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [skyGradient].\n     */\n    @MapboxExperimental\n    val defaultSkyGradientUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the SkyGradient property as Expression\n       *\n       * @return Expression\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultSkyGradientUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n     */\n    val defaultSkyGradientCenter: List<Double>?\n      /**\n       * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n       *\n       * Get the default value of SkyGradientCenter property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-center\").silentUnwrap()\n      }\n\n    /**\n     * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n     *\n     * This is an Expression representation of \"sky-gradient-center\".\n     *\n     */\n    val defaultSkyGradientCenterAsExpression: Expression?\n      /**\n       * Get default value of the SkyGradientCenter property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-center\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSkyGradientCenter?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n     */\n    val defaultSkyGradientRadius: Double?\n      /**\n       * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n       *\n       * Get the default value of SkyGradientRadius property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-radius\").silentUnwrap()\n      }\n\n    /**\n     * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n     *\n     * This is an Expression representation of \"sky-gradient-radius\".\n     *\n     */\n    val defaultSkyGradientRadiusAsExpression: Expression?\n      /**\n       * Get default value of the SkyGradientRadius property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-radius\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSkyGradientRadius?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n     */\n    val defaultSkyOpacity: Double?\n      /**\n       * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of SkyOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"sky-opacity\".\n     *\n     */\n    val defaultSkyOpacityAsExpression: Expression?\n      /**\n       * Get default value of the SkyOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSkyOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for SkyOpacity.\n     */\n    val defaultSkyOpacityTransition: StyleTransition?\n      /**\n       * Get the SkyOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-opacity-transition\").silentUnwrap()\n\n    /**\n     * The type of the sky Default value: \"atmosphere\".\n     */\n    val defaultSkyType: SkyType?\n      /**\n       * The type of the sky Default value: \"atmosphere\".\n       *\n       * Get the default value of SkyType property\n       *\n       * @return SkyType\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-type\").silentUnwrap<String>()?.let {\n          return SkyType.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The type of the sky Default value: \"atmosphere\".\n     *\n     * This is an Expression representation of \"sky-type\".\n     *\n     */\n    val defaultSkyTypeAsExpression: Expression?\n      /**\n       * Get default value of the SkyType property as an Expression\n       *\n       * @return SkyType\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-type\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSkyType?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface SkyLayerDsl {\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): SkyLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): SkyLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): SkyLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): SkyLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): SkyLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): SkyLayer\n\n  // Property getters and setters\n\n  /**\n   * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   *\n   * @param skyAtmosphereColor value of skyAtmosphereColor\n   */\n  fun skyAtmosphereColor(skyAtmosphereColor: String = \"white\"): SkyLayer\n\n  /**\n   * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   *\n   * @param skyAtmosphereColor value of skyAtmosphereColor as Expression\n   */\n  fun skyAtmosphereColor(skyAtmosphereColor: Expression): SkyLayer\n\n  /**\n   * A color used to tweak the main atmospheric scattering coefficients. Using white applies the default coefficients giving the natural blue color to the atmosphere. This color affects how heavily the corresponding wavelength is represented during scattering. The alpha channel describes the density of the atmosphere, with 1 maximum density and 0 no density. Default value: \"white\".\n   *\n   * @param skyAtmosphereColor value of skyAtmosphereColor\n   */\n  fun skyAtmosphereColor(@ColorInt skyAtmosphereColor: Int): SkyLayer\n\n  /**\n   * Set the skyAtmosphereColorUseTheme as String for [skyAtmosphereColor].\n   *\n   * @param skyAtmosphereColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun skyAtmosphereColorUseTheme(skyAtmosphereColorUseTheme: String): SkyLayer\n\n  /**\n   * Set the skyAtmosphereColorUseTheme as Expression for [skyAtmosphereColor].\n   *\n   * @param skyAtmosphereColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun skyAtmosphereColorUseTheme(skyAtmosphereColorUseTheme: Expression): SkyLayer\n\n  /**\n   * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   *\n   * @param skyAtmosphereHaloColor value of skyAtmosphereHaloColor\n   */\n  fun skyAtmosphereHaloColor(skyAtmosphereHaloColor: String = \"white\"): SkyLayer\n\n  /**\n   * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   *\n   * @param skyAtmosphereHaloColor value of skyAtmosphereHaloColor as Expression\n   */\n  fun skyAtmosphereHaloColor(skyAtmosphereHaloColor: Expression): SkyLayer\n\n  /**\n   * A color applied to the atmosphere sun halo. The alpha channel describes how strongly the sun halo is represented in an atmosphere sky layer. Default value: \"white\".\n   *\n   * @param skyAtmosphereHaloColor value of skyAtmosphereHaloColor\n   */\n  fun skyAtmosphereHaloColor(@ColorInt skyAtmosphereHaloColor: Int): SkyLayer\n\n  /**\n   * Set the skyAtmosphereHaloColorUseTheme as String for [skyAtmosphereHaloColor].\n   *\n   * @param skyAtmosphereHaloColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun skyAtmosphereHaloColorUseTheme(skyAtmosphereHaloColorUseTheme: String): SkyLayer\n\n  /**\n   * Set the skyAtmosphereHaloColorUseTheme as Expression for [skyAtmosphereHaloColor].\n   *\n   * @param skyAtmosphereHaloColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun skyAtmosphereHaloColorUseTheme(skyAtmosphereHaloColorUseTheme: Expression): SkyLayer\n\n  /**\n   * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n   *\n   * @param skyAtmosphereSun value of skyAtmosphereSun\n   */\n  fun skyAtmosphereSun(skyAtmosphereSun: List<Double>): SkyLayer\n\n  /**\n   * Position of the sun center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the sun relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the sun, where 0 degree is directly above, at zenith, and 90 degree at the horizon. When this property is ommitted, the sun center is directly inherited from the light position. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyAtmosphereSun is in degrees.\n   *\n   * @param skyAtmosphereSun value of skyAtmosphereSun as Expression\n   */\n  fun skyAtmosphereSun(skyAtmosphereSun: Expression): SkyLayer\n\n  /**\n   * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n   *\n   * @param skyAtmosphereSunIntensity value of skyAtmosphereSunIntensity\n   */\n  fun skyAtmosphereSunIntensity(skyAtmosphereSunIntensity: Double = 10.0): SkyLayer\n\n  /**\n   * Intensity of the sun as a light source in the atmosphere (on a scale from 0 to a 100). Setting higher values will brighten up the sky. Default value: 10. Value range: [0, 100]\n   *\n   * @param skyAtmosphereSunIntensity value of skyAtmosphereSunIntensity as Expression\n   */\n  fun skyAtmosphereSunIntensity(skyAtmosphereSunIntensity: Expression): SkyLayer\n\n  /**\n   * Defines a radial color gradient with which to color the sky. The color values can be interpolated with an expression using `sky-radial-progress`. The range [0, 1] for the interpolant covers a radial distance (in degrees) of [0, `sky-gradient-radius`] centered at the position specified by `sky-gradient-center`. Default value: [\"interpolate\",[\"linear\"],[\"sky-radial-progress\"],0.8,\"#87ceeb\",1,\"white\"].\n   *\n   * @param skyGradient value of skyGradient\n   */\n  fun skyGradient(skyGradient: Expression): SkyLayer\n\n  /**\n   * Set the skyGradientUseTheme as String for [skyGradient].\n   *\n   * @param skyGradientUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun skyGradientUseTheme(skyGradientUseTheme: String): SkyLayer\n\n  /**\n   * Set the skyGradientUseTheme as Expression for [skyGradient].\n   *\n   * @param skyGradientUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun skyGradientUseTheme(skyGradientUseTheme: Expression): SkyLayer\n\n  /**\n   * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n   *\n   * @param skyGradientCenter value of skyGradientCenter\n   */\n  fun skyGradientCenter(skyGradientCenter: List<Double> = listOf(0.0, 0.0)): SkyLayer\n\n  /**\n   * Position of the gradient center [a azimuthal angle, p polar angle]. The azimuthal angle indicates the position of the gradient center relative to 0 degree north, where degrees proceed clockwise. The polar angle indicates the height of the gradient center, where 0 degree is directly above, at zenith, and 90 degree at the horizon. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [360,180]. The unit of skyGradientCenter is in degrees.\n   *\n   * @param skyGradientCenter value of skyGradientCenter as Expression\n   */\n  fun skyGradientCenter(skyGradientCenter: Expression): SkyLayer\n\n  /**\n   * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n   *\n   * @param skyGradientRadius value of skyGradientRadius\n   */\n  fun skyGradientRadius(skyGradientRadius: Double = 90.0): SkyLayer\n\n  /**\n   * The angular distance (measured in degrees) from `sky-gradient-center` up to which the gradient extends. A value of 180 causes the gradient to wrap around to the opposite direction from `sky-gradient-center`. Default value: 90. Value range: [0, 180]\n   *\n   * @param skyGradientRadius value of skyGradientRadius as Expression\n   */\n  fun skyGradientRadius(skyGradientRadius: Expression): SkyLayer\n\n  /**\n   * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n   *\n   * @param skyOpacity value of skyOpacity\n   */\n  fun skyOpacity(skyOpacity: Double = 1.0): SkyLayer\n\n  /**\n   * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n   *\n   * @param skyOpacity value of skyOpacity as Expression\n   */\n  fun skyOpacity(skyOpacity: Expression): SkyLayer\n\n  /**\n   * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n   *\n   * Set the SkyOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun skyOpacityTransition(options: StyleTransition): SkyLayer\n\n  /**\n   * The opacity of the entire sky layer. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [skyOpacityTransition].\n   */\n  fun skyOpacityTransition(block: StyleTransition.Builder.() -> Unit): SkyLayer\n\n  /**\n   * The type of the sky Default value: \"atmosphere\".\n   *\n   * @param skyType value of skyType\n   */\n  fun skyType(skyType: SkyType = SkyType.ATMOSPHERE): SkyLayer\n\n  /**\n   * The type of the sky Default value: \"atmosphere\".\n   *\n   * @param skyType value of skyType as Expression\n   */\n  fun skyType(skyType: Expression): SkyLayer\n}\n\n/**\n * DSL function for creating a [SkyLayer].\n */\nfun skyLayer(layerId: String, block: SkyLayerDsl.() -> Unit): SkyLayer = SkyLayer(layerId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/SlotLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\n\n/**\n * Marks the position of a slot.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#slot)\n *\n * @param layerId the ID of the layer\n */\n@UiThread\nclass SlotLayer(override val layerId: String) : SlotLayerDsl, Layer() {\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): SlotLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * No-op.\n   */\n  override val visibility: Visibility? = null\n\n  /**\n   * No-op.\n   */\n  override val visibilityAsExpression: Expression? = null\n\n  /**\n   * No-op.\n   *\n   * @param visibility no-op.\n   */\n  override fun visibility(visibility: Visibility): SlotLayer = this\n\n  /**\n   * No-op.\n   *\n   * @param visibility no-op.\n   */\n  override fun visibility(visibility: Expression): SlotLayer = this\n\n  /**\n   * No-op, returns NULL.\n   */\n  override val minZoom: Double? = null\n\n  /**\n   * No-op.\n   *\n   * @param minZoom no-op.\n   */\n  override fun minZoom(minZoom: Double): SlotLayer = this\n\n  /**\n   * No-op, returns NULL.\n   */\n  override val maxZoom: Double? = null\n\n  /**\n   * No-op.\n   *\n   * @param maxZoom no-op.\n   */\n  override fun maxZoom(maxZoom: Double): SlotLayer = this\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"slot\"\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface SlotLayerDsl {\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): SlotLayer\n}\n\n/**\n * DSL function for creating a [SlotLayer].\n */\nfun slotLayer(layerId: String, block: SlotLayerDsl.() -> Unit): SlotLayer = SlotLayer(layerId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/generated/SymbolLayer.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.properties.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * An icon or a text label.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/layers/#symbol)\n *\n * @param layerId the ID of the layer\n * @param sourceId the ID of the source\n */\n@UiThread\nclass SymbolLayer(override val layerId: String, val sourceId: String) : SymbolLayerDsl, Layer() {\n  init {\n    internalSourceId = sourceId\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  override fun sourceLayer(sourceLayer: String): SymbolLayer = apply {\n    val param = PropertyValue(\"source-layer\", sourceLayer)\n    setProperty(param)\n  }\n\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   */\n  val sourceLayer: String?\n    /**\n     * Get the sourceLayer property\n     *\n     * @return sourceLayer\n     */\n    get() {\n      return getPropertyValue(\"source-layer\")\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  override fun slot(slot: String): SymbolLayer = apply {\n    val param = PropertyValue(\"slot\", slot)\n    setProperty(param)\n  }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   */\n  override val slot: String?\n    /**\n     * Get the slot property\n     *\n     * @return slot\n     */\n    get() = getPropertyValue(\"slot\")\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  override fun filter(filter: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"filter\", filter)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   */\n  val filter: Expression?\n    /**\n     * Get the filter property\n     *\n     * @return filter\n     */\n    get() = getPropertyValue(\"filter\")\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibility: Visibility?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [SymbolLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY\n     */\n    get() {\n      val property: String? = getPropertyValue(\"visibility\")\n      property?.let {\n        return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Whether this layer is displayed.\n   */\n  override val visibilityAsExpression: Expression?\n    /**\n     * Whether this layer is displayed.\n     *\n     * Use static method [SymbolLayer.defaultVisibility] to get the default property value.\n     *\n     * @return VISIBILITY as expression\n     */\n    get() = getPropertyValue(\"visibility\")\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [SymbolLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Visibility): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * Use static method [[SymbolLayer.defaultVisibility] to get the default property value.\n   *\n   * @param visibility value of Visibility\n   */\n  override fun visibility(visibility: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"visibility\", visibility)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val minZoom: Double?\n    /**\n     * Get the minzoom property\n     *\n     * Use static method [SymbolLayer.defaultMinZoom] to get the default property value.\n     *\n     * @return minzoom\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [SymbolLayer.defaultMinZoom] to get the default property value.\n   *\n   * @param minZoom value of minzoom\n   */\n  override fun minZoom(minZoom: Double): SymbolLayer = apply {\n    val param = PropertyValue(\"minzoom\", minZoom)\n    setProperty(param)\n  }\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   */\n  override val maxZoom: Double?\n    /**\n     * Get the maxzoom property\n     *\n     * Use static method [SymbolLayer.defaultMaxZoom] to get the default property value.\n     *\n     * @return maxzoom\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * Use static method [SymbolLayer.defaultMaxZoom] to get the default property value.\n   *\n   * @param maxZoom value of maxzoom\n   */\n  override fun maxZoom(maxZoom: Double): SymbolLayer = apply {\n    val param = PropertyValue(\"maxzoom\", maxZoom)\n    setProperty(param)\n  }\n\n  // Property getters and setters\n\n  /**\n   * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n   */\n  val iconAllowOverlap: Boolean?\n    /**\n     * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n     *\n     * Use static method [SymbolLayer.defaultIconAllowOverlap] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"icon-allow-overlap\")\n    }\n\n  /**\n   * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultIconAllowOverlap] to set the default property.\n   *\n   * @param iconAllowOverlap value of iconAllowOverlap\n   */\n  override fun iconAllowOverlap(iconAllowOverlap: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-allow-overlap\", iconAllowOverlap)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * This is an Expression representation of \"icon-allow-overlap\".\n   *\n   */\n  val iconAllowOverlapAsExpression: Expression?\n    /**\n     * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n     *\n     * Get the IconAllowOverlap property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconAllowOverlapAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-allow-overlap\")\n\n  /**\n   * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultIconAllowOverlapAsExpression] to set the default property.\n   *\n   * @param iconAllowOverlap value of iconAllowOverlap as Expression\n   */\n  override fun iconAllowOverlap(iconAllowOverlap: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-allow-overlap\", iconAllowOverlap)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   */\n  val iconAnchor: IconAnchor?\n    /**\n     * Part of the icon placed closest to the anchor. Default value: \"center\".\n     *\n     * Use static method [SymbolLayer.defaultIconAnchor] to get the default property.\n     *\n     * @return IconAnchor\n     */\n    get() {\n      getPropertyValue<String?>(\"icon-anchor\")?.let {\n        return IconAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   *\n   * Use static method [SymbolLayer.defaultIconAnchor] to set the default property.\n   *\n   * @param iconAnchor value of iconAnchor\n   */\n  override fun iconAnchor(iconAnchor: IconAnchor): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-anchor\", iconAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   *\n   * This is an Expression representation of \"icon-anchor\".\n   *\n   */\n  val iconAnchorAsExpression: Expression?\n    /**\n     * Part of the icon placed closest to the anchor. Default value: \"center\".\n     *\n     * Get the IconAnchor property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"icon-anchor\")\n        ?: iconAnchor?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   *\n   * Use static method [SymbolLayer.defaultIconAnchorAsExpression] to set the default property.\n   *\n   * @param iconAnchor value of iconAnchor as Expression\n   */\n  override fun iconAnchor(iconAnchor: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-anchor\", iconAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n   */\n  val iconIgnorePlacement: Boolean?\n    /**\n     * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n     *\n     * Use static method [SymbolLayer.defaultIconIgnorePlacement] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"icon-ignore-placement\")\n    }\n\n  /**\n   * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultIconIgnorePlacement] to set the default property.\n   *\n   * @param iconIgnorePlacement value of iconIgnorePlacement\n   */\n  override fun iconIgnorePlacement(iconIgnorePlacement: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-ignore-placement\", iconIgnorePlacement)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n   *\n   * This is an Expression representation of \"icon-ignore-placement\".\n   *\n   */\n  val iconIgnorePlacementAsExpression: Expression?\n    /**\n     * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n     *\n     * Get the IconIgnorePlacement property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconIgnorePlacementAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-ignore-placement\")\n\n  /**\n   * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultIconIgnorePlacementAsExpression] to set the default property.\n   *\n   * @param iconIgnorePlacement value of iconIgnorePlacement as Expression\n   */\n  override fun iconIgnorePlacement(iconIgnorePlacement: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-ignore-placement\", iconIgnorePlacement)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use for drawing an image background.\n   */\n  val iconImage: String?\n    /**\n     * Name of image in sprite to use for drawing an image background.\n     *\n     * Use static method [SymbolLayer.defaultIconImage] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      return getPropertyValue(\"icon-image\")\n    }\n\n  /**\n   * Name of image in sprite to use for drawing an image background.\n   *\n   * Use static method [SymbolLayer.defaultIconImage] to set the default property.\n   *\n   * @param iconImage value of iconImage\n   */\n  override fun iconImage(iconImage: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-image\", iconImage)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Name of image in sprite to use for drawing an image background.\n   *\n   * This is an Expression representation of \"icon-image\".\n   *\n   */\n  val iconImageAsExpression: Expression?\n    /**\n     * Name of image in sprite to use for drawing an image background.\n     *\n     * Get the IconImage property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconImageAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-image\")\n\n  /**\n   * Name of image in sprite to use for drawing an image background.\n   *\n   * Use static method [SymbolLayer.defaultIconImageAsExpression] to set the default property.\n   *\n   * @param iconImage value of iconImage as Expression\n   */\n  override fun iconImage(iconImage: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-image\", iconImage)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n   */\n  val iconKeepUpright: Boolean?\n    /**\n     * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n     *\n     * Use static method [SymbolLayer.defaultIconKeepUpright] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"icon-keep-upright\")\n    }\n\n  /**\n   * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultIconKeepUpright] to set the default property.\n   *\n   * @param iconKeepUpright value of iconKeepUpright\n   */\n  override fun iconKeepUpright(iconKeepUpright: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-keep-upright\", iconKeepUpright)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n   *\n   * This is an Expression representation of \"icon-keep-upright\".\n   *\n   */\n  val iconKeepUprightAsExpression: Expression?\n    /**\n     * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n     *\n     * Get the IconKeepUpright property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconKeepUprightAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-keep-upright\")\n\n  /**\n   * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultIconKeepUprightAsExpression] to set the default property.\n   *\n   * @param iconKeepUpright value of iconKeepUpright as Expression\n   */\n  override fun iconKeepUpright(iconKeepUpright: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-keep-upright\", iconKeepUpright)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   */\n  val iconOffset: List<Double>?\n    /**\n     * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n     *\n     * Use static method [SymbolLayer.defaultIconOffset] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"icon-offset\")\n    }\n\n  /**\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   *\n   * Use static method [SymbolLayer.defaultIconOffset] to set the default property.\n   *\n   * @param iconOffset value of iconOffset\n   */\n  override fun iconOffset(iconOffset: List<Double>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-offset\", iconOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   *\n   * This is an Expression representation of \"icon-offset\".\n   *\n   */\n  val iconOffsetAsExpression: Expression?\n    /**\n     * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n     *\n     * Get the IconOffset property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconOffsetAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-offset\")\n\n  /**\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   *\n   * Use static method [SymbolLayer.defaultIconOffsetAsExpression] to set the default property.\n   *\n   * @param iconOffset value of iconOffset as Expression\n   */\n  override fun iconOffset(iconOffset: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-offset\", iconOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n   */\n  val iconOptional: Boolean?\n    /**\n     * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n     *\n     * Use static method [SymbolLayer.defaultIconOptional] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"icon-optional\")\n    }\n\n  /**\n   * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultIconOptional] to set the default property.\n   *\n   * @param iconOptional value of iconOptional\n   */\n  override fun iconOptional(iconOptional: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-optional\", iconOptional)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n   *\n   * This is an Expression representation of \"icon-optional\".\n   *\n   */\n  val iconOptionalAsExpression: Expression?\n    /**\n     * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n     *\n     * Get the IconOptional property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconOptionalAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-optional\")\n\n  /**\n   * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultIconOptionalAsExpression] to set the default property.\n   *\n   * @param iconOptional value of iconOptional as Expression\n   */\n  override fun iconOptional(iconOptional: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-optional\", iconOptional)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n   */\n  val iconPadding: Double?\n    /**\n     * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultIconPadding] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-padding\")\n    }\n\n  /**\n   * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconPadding] to set the default property.\n   *\n   * @param iconPadding value of iconPadding\n   */\n  override fun iconPadding(iconPadding: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-padding\", iconPadding)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n   *\n   * This is an Expression representation of \"icon-padding\".\n   *\n   */\n  val iconPaddingAsExpression: Expression?\n    /**\n     * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n     *\n     * Get the IconPadding property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconPaddingAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-padding\")\n\n  /**\n   * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconPaddingAsExpression] to set the default property.\n   *\n   * @param iconPadding value of iconPadding as Expression\n   */\n  override fun iconPadding(iconPadding: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-padding\", iconPadding)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Orientation of icon when map is pitched. Default value: \"auto\".\n   */\n  val iconPitchAlignment: IconPitchAlignment?\n    /**\n     * Orientation of icon when map is pitched. Default value: \"auto\".\n     *\n     * Use static method [SymbolLayer.defaultIconPitchAlignment] to get the default property.\n     *\n     * @return IconPitchAlignment\n     */\n    get() {\n      getPropertyValue<String?>(\"icon-pitch-alignment\")?.let {\n        return IconPitchAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Orientation of icon when map is pitched. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultIconPitchAlignment] to set the default property.\n   *\n   * @param iconPitchAlignment value of iconPitchAlignment\n   */\n  override fun iconPitchAlignment(iconPitchAlignment: IconPitchAlignment): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-pitch-alignment\", iconPitchAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Orientation of icon when map is pitched. Default value: \"auto\".\n   *\n   * This is an Expression representation of \"icon-pitch-alignment\".\n   *\n   */\n  val iconPitchAlignmentAsExpression: Expression?\n    /**\n     * Orientation of icon when map is pitched. Default value: \"auto\".\n     *\n     * Get the IconPitchAlignment property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconPitchAlignmentAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"icon-pitch-alignment\")\n        ?: iconPitchAlignment?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Orientation of icon when map is pitched. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultIconPitchAlignmentAsExpression] to set the default property.\n   *\n   * @param iconPitchAlignment value of iconPitchAlignment as Expression\n   */\n  override fun iconPitchAlignment(iconPitchAlignment: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-pitch-alignment\", iconPitchAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   */\n  val iconRotate: Double?\n    /**\n     * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n     *\n     * Use static method [SymbolLayer.defaultIconRotate] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-rotate\")\n    }\n\n  /**\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   *\n   * Use static method [SymbolLayer.defaultIconRotate] to set the default property.\n   *\n   * @param iconRotate value of iconRotate\n   */\n  override fun iconRotate(iconRotate: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-rotate\", iconRotate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   *\n   * This is an Expression representation of \"icon-rotate\".\n   *\n   */\n  val iconRotateAsExpression: Expression?\n    /**\n     * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n     *\n     * Get the IconRotate property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconRotateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-rotate\")\n\n  /**\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   *\n   * Use static method [SymbolLayer.defaultIconRotateAsExpression] to set the default property.\n   *\n   * @param iconRotate value of iconRotate as Expression\n   */\n  override fun iconRotate(iconRotate: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-rotate\", iconRotate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n   */\n  val iconRotationAlignment: IconRotationAlignment?\n    /**\n     * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n     *\n     * Use static method [SymbolLayer.defaultIconRotationAlignment] to get the default property.\n     *\n     * @return IconRotationAlignment\n     */\n    get() {\n      getPropertyValue<String?>(\"icon-rotation-alignment\")?.let {\n        return IconRotationAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultIconRotationAlignment] to set the default property.\n   *\n   * @param iconRotationAlignment value of iconRotationAlignment\n   */\n  override fun iconRotationAlignment(iconRotationAlignment: IconRotationAlignment): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-rotation-alignment\", iconRotationAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n   *\n   * This is an Expression representation of \"icon-rotation-alignment\".\n   *\n   */\n  val iconRotationAlignmentAsExpression: Expression?\n    /**\n     * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n     *\n     * Get the IconRotationAlignment property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconRotationAlignmentAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"icon-rotation-alignment\")\n        ?: iconRotationAlignment?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultIconRotationAlignmentAsExpression] to set the default property.\n   *\n   * @param iconRotationAlignment value of iconRotationAlignment as Expression\n   */\n  override fun iconRotationAlignment(iconRotationAlignment: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-rotation-alignment\", iconRotationAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   */\n  val iconSize: Double?\n    /**\n     * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n     *\n     * Use static method [SymbolLayer.defaultIconSize] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-size\")\n    }\n\n  /**\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   *\n   * Use static method [SymbolLayer.defaultIconSize] to set the default property.\n   *\n   * @param iconSize value of iconSize\n   */\n  override fun iconSize(iconSize: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-size\", iconSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   *\n   * This is an Expression representation of \"icon-size\".\n   *\n   */\n  val iconSizeAsExpression: Expression?\n    /**\n     * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n     *\n     * Get the IconSize property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconSizeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-size\")\n\n  /**\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   *\n   * Use static method [SymbolLayer.defaultIconSizeAsExpression] to set the default property.\n   *\n   * @param iconSize value of iconSize as Expression\n   */\n  override fun iconSize(iconSize: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-size\", iconSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   */\n  @MapboxExperimental\n  val iconSizeScaleRange: List<Double>?\n    /**\n     * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n     *\n     * Use static method [SymbolLayer.defaultIconSizeScaleRange] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"icon-size-scale-range\")\n    }\n\n  /**\n   * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * Use static method [SymbolLayer.defaultIconSizeScaleRange] to set the default property.\n   *\n   * @param iconSizeScaleRange value of iconSizeScaleRange\n   */\n  @MapboxExperimental\n  override fun iconSizeScaleRange(iconSizeScaleRange: List<Double>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-size-scale-range\", iconSizeScaleRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * This is an Expression representation of \"icon-size-scale-range\".\n   *\n   */\n  @MapboxExperimental\n  val iconSizeScaleRangeAsExpression: Expression?\n    /**\n     * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n     *\n     * Get the IconSizeScaleRange property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconSizeScaleRangeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-size-scale-range\")\n\n  /**\n   * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * Use static method [SymbolLayer.defaultIconSizeScaleRangeAsExpression] to set the default property.\n   *\n   * @param iconSizeScaleRange value of iconSizeScaleRange as Expression\n   */\n  @MapboxExperimental\n  override fun iconSizeScaleRange(iconSizeScaleRange: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-size-scale-range\", iconSizeScaleRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   */\n  val iconTextFit: IconTextFit?\n    /**\n     * Scales the icon to fit around the associated text. Default value: \"none\".\n     *\n     * Use static method [SymbolLayer.defaultIconTextFit] to get the default property.\n     *\n     * @return IconTextFit\n     */\n    get() {\n      getPropertyValue<String?>(\"icon-text-fit\")?.let {\n        return IconTextFit.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   *\n   * Use static method [SymbolLayer.defaultIconTextFit] to set the default property.\n   *\n   * @param iconTextFit value of iconTextFit\n   */\n  override fun iconTextFit(iconTextFit: IconTextFit): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-text-fit\", iconTextFit)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   *\n   * This is an Expression representation of \"icon-text-fit\".\n   *\n   */\n  val iconTextFitAsExpression: Expression?\n    /**\n     * Scales the icon to fit around the associated text. Default value: \"none\".\n     *\n     * Get the IconTextFit property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconTextFitAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"icon-text-fit\")\n        ?: iconTextFit?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   *\n   * Use static method [SymbolLayer.defaultIconTextFitAsExpression] to set the default property.\n   *\n   * @param iconTextFit value of iconTextFit as Expression\n   */\n  override fun iconTextFit(iconTextFit: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-text-fit\", iconTextFit)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   */\n  val iconTextFitPadding: List<Double>?\n    /**\n     * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultIconTextFitPadding] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"icon-text-fit-padding\")\n    }\n\n  /**\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconTextFitPadding] to set the default property.\n   *\n   * @param iconTextFitPadding value of iconTextFitPadding\n   */\n  override fun iconTextFitPadding(iconTextFitPadding: List<Double>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-text-fit-padding\", iconTextFitPadding)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   *\n   * This is an Expression representation of \"icon-text-fit-padding\".\n   *\n   */\n  val iconTextFitPaddingAsExpression: Expression?\n    /**\n     * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n     *\n     * Get the IconTextFitPadding property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconTextFitPaddingAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-text-fit-padding\")\n\n  /**\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconTextFitPaddingAsExpression] to set the default property.\n   *\n   * @param iconTextFitPadding value of iconTextFitPadding as Expression\n   */\n  override fun iconTextFitPadding(iconTextFitPadding: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-text-fit-padding\", iconTextFitPadding)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n   */\n  val symbolAvoidEdges: Boolean?\n    /**\n     * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n     *\n     * Use static method [SymbolLayer.defaultSymbolAvoidEdges] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"symbol-avoid-edges\")\n    }\n\n  /**\n   * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultSymbolAvoidEdges] to set the default property.\n   *\n   * @param symbolAvoidEdges value of symbolAvoidEdges\n   */\n  override fun symbolAvoidEdges(symbolAvoidEdges: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-avoid-edges\", symbolAvoidEdges)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n   *\n   * This is an Expression representation of \"symbol-avoid-edges\".\n   *\n   */\n  val symbolAvoidEdgesAsExpression: Expression?\n    /**\n     * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n     *\n     * Get the SymbolAvoidEdges property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultSymbolAvoidEdgesAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"symbol-avoid-edges\")\n\n  /**\n   * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultSymbolAvoidEdgesAsExpression] to set the default property.\n   *\n   * @param symbolAvoidEdges value of symbolAvoidEdges as Expression\n   */\n  override fun symbolAvoidEdges(symbolAvoidEdges: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-avoid-edges\", symbolAvoidEdges)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the base of symbol-elevation. Default value: \"ground\".\n   */\n  @MapboxExperimental\n  val symbolElevationReference: SymbolElevationReference?\n    /**\n     * Selects the base of symbol-elevation. Default value: \"ground\".\n     *\n     * Use static method [SymbolLayer.defaultSymbolElevationReference] to get the default property.\n     *\n     * @return SymbolElevationReference\n     */\n    get() {\n      getPropertyValue<String?>(\"symbol-elevation-reference\")?.let {\n        return SymbolElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Selects the base of symbol-elevation. Default value: \"ground\".\n   *\n   * Use static method [SymbolLayer.defaultSymbolElevationReference] to set the default property.\n   *\n   * @param symbolElevationReference value of symbolElevationReference\n   */\n  @MapboxExperimental\n  override fun symbolElevationReference(symbolElevationReference: SymbolElevationReference): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-elevation-reference\", symbolElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Selects the base of symbol-elevation. Default value: \"ground\".\n   *\n   * This is an Expression representation of \"symbol-elevation-reference\".\n   *\n   */\n  @MapboxExperimental\n  val symbolElevationReferenceAsExpression: Expression?\n    /**\n     * Selects the base of symbol-elevation. Default value: \"ground\".\n     *\n     * Get the SymbolElevationReference property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultSymbolElevationReferenceAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"symbol-elevation-reference\")\n        ?: symbolElevationReference?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Selects the base of symbol-elevation. Default value: \"ground\".\n   *\n   * Use static method [SymbolLayer.defaultSymbolElevationReferenceAsExpression] to set the default property.\n   *\n   * @param symbolElevationReference value of symbolElevationReference as Expression\n   */\n  @MapboxExperimental\n  override fun symbolElevationReference(symbolElevationReference: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-elevation-reference\", symbolElevationReference)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Label placement relative to its geometry. Default value: \"point\".\n   */\n  val symbolPlacement: SymbolPlacement?\n    /**\n     * Label placement relative to its geometry. Default value: \"point\".\n     *\n     * Use static method [SymbolLayer.defaultSymbolPlacement] to get the default property.\n     *\n     * @return SymbolPlacement\n     */\n    get() {\n      getPropertyValue<String?>(\"symbol-placement\")?.let {\n        return SymbolPlacement.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Label placement relative to its geometry. Default value: \"point\".\n   *\n   * Use static method [SymbolLayer.defaultSymbolPlacement] to set the default property.\n   *\n   * @param symbolPlacement value of symbolPlacement\n   */\n  override fun symbolPlacement(symbolPlacement: SymbolPlacement): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-placement\", symbolPlacement)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Label placement relative to its geometry. Default value: \"point\".\n   *\n   * This is an Expression representation of \"symbol-placement\".\n   *\n   */\n  val symbolPlacementAsExpression: Expression?\n    /**\n     * Label placement relative to its geometry. Default value: \"point\".\n     *\n     * Get the SymbolPlacement property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultSymbolPlacementAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"symbol-placement\")\n        ?: symbolPlacement?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Label placement relative to its geometry. Default value: \"point\".\n   *\n   * Use static method [SymbolLayer.defaultSymbolPlacementAsExpression] to set the default property.\n   *\n   * @param symbolPlacement value of symbolPlacement as Expression\n   */\n  override fun symbolPlacement(symbolPlacement: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-placement\", symbolPlacement)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   */\n  val symbolSortKey: Double?\n    /**\n     * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n     *\n     * Use static method [SymbolLayer.defaultSymbolSortKey] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"symbol-sort-key\")\n    }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   *\n   * Use static method [SymbolLayer.defaultSymbolSortKey] to set the default property.\n   *\n   * @param symbolSortKey value of symbolSortKey\n   */\n  override fun symbolSortKey(symbolSortKey: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-sort-key\", symbolSortKey)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   *\n   * This is an Expression representation of \"symbol-sort-key\".\n   *\n   */\n  val symbolSortKeyAsExpression: Expression?\n    /**\n     * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n     *\n     * Get the SymbolSortKey property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultSymbolSortKeyAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"symbol-sort-key\")\n\n  /**\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   *\n   * Use static method [SymbolLayer.defaultSymbolSortKeyAsExpression] to set the default property.\n   *\n   * @param symbolSortKey value of symbolSortKey as Expression\n   */\n  override fun symbolSortKey(symbolSortKey: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-sort-key\", symbolSortKey)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n   */\n  val symbolSpacing: Double?\n    /**\n     * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultSymbolSpacing] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"symbol-spacing\")\n    }\n\n  /**\n   * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultSymbolSpacing] to set the default property.\n   *\n   * @param symbolSpacing value of symbolSpacing\n   */\n  override fun symbolSpacing(symbolSpacing: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-spacing\", symbolSpacing)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n   *\n   * This is an Expression representation of \"symbol-spacing\".\n   *\n   */\n  val symbolSpacingAsExpression: Expression?\n    /**\n     * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n     *\n     * Get the SymbolSpacing property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultSymbolSpacingAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"symbol-spacing\")\n\n  /**\n   * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultSymbolSpacingAsExpression] to set the default property.\n   *\n   * @param symbolSpacing value of symbolSpacing as Expression\n   */\n  override fun symbolSpacing(symbolSpacing: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-spacing\", symbolSpacing)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n   */\n  val symbolZElevate: Boolean?\n    /**\n     * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n     *\n     * Use static method [SymbolLayer.defaultSymbolZElevate] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"symbol-z-elevate\")\n    }\n\n  /**\n   * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultSymbolZElevate] to set the default property.\n   *\n   * @param symbolZElevate value of symbolZElevate\n   */\n  override fun symbolZElevate(symbolZElevate: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-z-elevate\", symbolZElevate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n   *\n   * This is an Expression representation of \"symbol-z-elevate\".\n   *\n   */\n  val symbolZElevateAsExpression: Expression?\n    /**\n     * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n     *\n     * Get the SymbolZElevate property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultSymbolZElevateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"symbol-z-elevate\")\n\n  /**\n   * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultSymbolZElevateAsExpression] to set the default property.\n   *\n   * @param symbolZElevate value of symbolZElevate as Expression\n   */\n  override fun symbolZElevate(symbolZElevate: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-z-elevate\", symbolZElevate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n   */\n  val symbolZOrder: SymbolZOrder?\n    /**\n     * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n     *\n     * Use static method [SymbolLayer.defaultSymbolZOrder] to get the default property.\n     *\n     * @return SymbolZOrder\n     */\n    get() {\n      getPropertyValue<String?>(\"symbol-z-order\")?.let {\n        return SymbolZOrder.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultSymbolZOrder] to set the default property.\n   *\n   * @param symbolZOrder value of symbolZOrder\n   */\n  override fun symbolZOrder(symbolZOrder: SymbolZOrder): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-z-order\", symbolZOrder)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n   *\n   * This is an Expression representation of \"symbol-z-order\".\n   *\n   */\n  val symbolZOrderAsExpression: Expression?\n    /**\n     * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n     *\n     * Get the SymbolZOrder property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultSymbolZOrderAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"symbol-z-order\")\n        ?: symbolZOrder?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultSymbolZOrderAsExpression] to set the default property.\n   *\n   * @param symbolZOrder value of symbolZOrder as Expression\n   */\n  override fun symbolZOrder(symbolZOrder: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-z-order\", symbolZOrder)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n   */\n  val textAllowOverlap: Boolean?\n    /**\n     * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n     *\n     * Use static method [SymbolLayer.defaultTextAllowOverlap] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"text-allow-overlap\")\n    }\n\n  /**\n   * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultTextAllowOverlap] to set the default property.\n   *\n   * @param textAllowOverlap value of textAllowOverlap\n   */\n  override fun textAllowOverlap(textAllowOverlap: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-allow-overlap\", textAllowOverlap)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * This is an Expression representation of \"text-allow-overlap\".\n   *\n   */\n  val textAllowOverlapAsExpression: Expression?\n    /**\n     * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n     *\n     * Get the TextAllowOverlap property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextAllowOverlapAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-allow-overlap\")\n\n  /**\n   * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultTextAllowOverlapAsExpression] to set the default property.\n   *\n   * @param textAllowOverlap value of textAllowOverlap as Expression\n   */\n  override fun textAllowOverlap(textAllowOverlap: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-allow-overlap\", textAllowOverlap)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   */\n  val textAnchor: TextAnchor?\n    /**\n     * Part of the text placed closest to the anchor. Default value: \"center\".\n     *\n     * Use static method [SymbolLayer.defaultTextAnchor] to get the default property.\n     *\n     * @return TextAnchor\n     */\n    get() {\n      getPropertyValue<String?>(\"text-anchor\")?.let {\n        return TextAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   *\n   * Use static method [SymbolLayer.defaultTextAnchor] to set the default property.\n   *\n   * @param textAnchor value of textAnchor\n   */\n  override fun textAnchor(textAnchor: TextAnchor): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-anchor\", textAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   *\n   * This is an Expression representation of \"text-anchor\".\n   *\n   */\n  val textAnchorAsExpression: Expression?\n    /**\n     * Part of the text placed closest to the anchor. Default value: \"center\".\n     *\n     * Get the TextAnchor property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"text-anchor\")\n        ?: textAnchor?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   *\n   * Use static method [SymbolLayer.defaultTextAnchorAsExpression] to set the default property.\n   *\n   * @param textAnchor value of textAnchor as Expression\n   */\n  override fun textAnchor(textAnchor: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-anchor\", textAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   */\n  val textField: Formatted?\n    /**\n     * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n     *\n     * Use static method [SymbolLayer.defaultTextField] to get the default property.\n     *\n     * @return Formatted\n     */\n    get() {\n      textFieldAsExpression?.let {\n        return Formatted.fromExpression(it)\n      }\n      return null\n    }\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   *\n   * Use static method [SymbolLayer.defaultTextField] to set the default property.\n   *\n   * @param textField value of textField\n   */\n  override fun textField(textField: Formatted): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-field\", textField)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   *\n   * This is an Expression representation of \"text-field\".\n   *\n   */\n  val textFieldAsExpression: Expression?\n    /**\n     * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n     *\n     * Get the TextField property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextFieldAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"text-field\")\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   *\n   * Use static method [SymbolLayer.defaultTextFieldAsExpression] to set the default property.\n   *\n   * @param textField value of textField as Expression\n   */\n  override fun textField(textField: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-field\", textField)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   */\n  val textFieldAsString: String?\n    /**\n     * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n     *\n     * Use static method [SymbolLayer.defaultTextFieldAsString] to get the default property.\n     *\n     * @return value of textField\n     */\n    get() {\n      textField?.let {\n        return it.getTextAsString()\n      }\n      return null\n    }\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   *\n   * Set the TextField property as String.\n   *\n   * Use static method [SymbolLayer.defaultTextFieldAsString] to set the default property.\n   *\n   * @param textField value of textField as String\n   */\n  override fun textField(textField: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-field\", textField)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for construct [Formatted] textField.\n   */\n  override fun textField(block: Formatted.() -> Unit): SymbolLayer = apply {\n    textField(Formatted().apply(block))\n  }\n\n  /**\n   * Font stack to use for displaying text.\n   */\n  val textFont: List<String>?\n    /**\n     * Font stack to use for displaying text.\n     *\n     * Use static method [SymbolLayer.defaultTextFont] to get the default property.\n     *\n     * @return List<String>\n     */\n    get() {\n      return getPropertyValue(\"text-font\")\n    }\n\n  /**\n   * Font stack to use for displaying text.\n   *\n   * Use static method [SymbolLayer.defaultTextFont] to set the default property.\n   *\n   * @param textFont value of textFont\n   */\n  override fun textFont(textFont: List<String>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-font\", textFont)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Font stack to use for displaying text.\n   *\n   * This is an Expression representation of \"text-font\".\n   *\n   */\n  val textFontAsExpression: Expression?\n    /**\n     * Font stack to use for displaying text.\n     *\n     * Get the TextFont property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextFontAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-font\")\n\n  /**\n   * Font stack to use for displaying text.\n   *\n   * Use static method [SymbolLayer.defaultTextFontAsExpression] to set the default property.\n   *\n   * @param textFont value of textFont as Expression\n   */\n  override fun textFont(textFont: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-font\", textFont)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, other symbols can be visible even if they collide with the text. Default value: false.\n   */\n  val textIgnorePlacement: Boolean?\n    /**\n     * If true, other symbols can be visible even if they collide with the text. Default value: false.\n     *\n     * Use static method [SymbolLayer.defaultTextIgnorePlacement] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"text-ignore-placement\")\n    }\n\n  /**\n   * If true, other symbols can be visible even if they collide with the text. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultTextIgnorePlacement] to set the default property.\n   *\n   * @param textIgnorePlacement value of textIgnorePlacement\n   */\n  override fun textIgnorePlacement(textIgnorePlacement: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-ignore-placement\", textIgnorePlacement)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, other symbols can be visible even if they collide with the text. Default value: false.\n   *\n   * This is an Expression representation of \"text-ignore-placement\".\n   *\n   */\n  val textIgnorePlacementAsExpression: Expression?\n    /**\n     * If true, other symbols can be visible even if they collide with the text. Default value: false.\n     *\n     * Get the TextIgnorePlacement property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextIgnorePlacementAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-ignore-placement\")\n\n  /**\n   * If true, other symbols can be visible even if they collide with the text. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultTextIgnorePlacementAsExpression] to set the default property.\n   *\n   * @param textIgnorePlacement value of textIgnorePlacement as Expression\n   */\n  override fun textIgnorePlacement(textIgnorePlacement: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-ignore-placement\", textIgnorePlacement)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Text justification options. Default value: \"center\".\n   */\n  val textJustify: TextJustify?\n    /**\n     * Text justification options. Default value: \"center\".\n     *\n     * Use static method [SymbolLayer.defaultTextJustify] to get the default property.\n     *\n     * @return TextJustify\n     */\n    get() {\n      getPropertyValue<String?>(\"text-justify\")?.let {\n        return TextJustify.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Text justification options. Default value: \"center\".\n   *\n   * Use static method [SymbolLayer.defaultTextJustify] to set the default property.\n   *\n   * @param textJustify value of textJustify\n   */\n  override fun textJustify(textJustify: TextJustify): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-justify\", textJustify)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Text justification options. Default value: \"center\".\n   *\n   * This is an Expression representation of \"text-justify\".\n   *\n   */\n  val textJustifyAsExpression: Expression?\n    /**\n     * Text justification options. Default value: \"center\".\n     *\n     * Get the TextJustify property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextJustifyAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"text-justify\")\n        ?: textJustify?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Text justification options. Default value: \"center\".\n   *\n   * Use static method [SymbolLayer.defaultTextJustifyAsExpression] to set the default property.\n   *\n   * @param textJustify value of textJustify as Expression\n   */\n  override fun textJustify(textJustify: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-justify\", textJustify)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n   */\n  val textKeepUpright: Boolean?\n    /**\n     * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n     *\n     * Use static method [SymbolLayer.defaultTextKeepUpright] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"text-keep-upright\")\n    }\n\n  /**\n   * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n   *\n   * Use static method [SymbolLayer.defaultTextKeepUpright] to set the default property.\n   *\n   * @param textKeepUpright value of textKeepUpright\n   */\n  override fun textKeepUpright(textKeepUpright: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-keep-upright\", textKeepUpright)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n   *\n   * This is an Expression representation of \"text-keep-upright\".\n   *\n   */\n  val textKeepUprightAsExpression: Expression?\n    /**\n     * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n     *\n     * Get the TextKeepUpright property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextKeepUprightAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-keep-upright\")\n\n  /**\n   * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n   *\n   * Use static method [SymbolLayer.defaultTextKeepUprightAsExpression] to set the default property.\n   *\n   * @param textKeepUpright value of textKeepUpright as Expression\n   */\n  override fun textKeepUpright(textKeepUpright: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-keep-upright\", textKeepUpright)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   */\n  val textLetterSpacing: Double?\n    /**\n     * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n     *\n     * Use static method [SymbolLayer.defaultTextLetterSpacing] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-letter-spacing\")\n    }\n\n  /**\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextLetterSpacing] to set the default property.\n   *\n   * @param textLetterSpacing value of textLetterSpacing\n   */\n  override fun textLetterSpacing(textLetterSpacing: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-letter-spacing\", textLetterSpacing)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   *\n   * This is an Expression representation of \"text-letter-spacing\".\n   *\n   */\n  val textLetterSpacingAsExpression: Expression?\n    /**\n     * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n     *\n     * Get the TextLetterSpacing property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextLetterSpacingAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-letter-spacing\")\n\n  /**\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextLetterSpacingAsExpression] to set the default property.\n   *\n   * @param textLetterSpacing value of textLetterSpacing as Expression\n   */\n  override fun textLetterSpacing(textLetterSpacing: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-letter-spacing\", textLetterSpacing)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   */\n  val textLineHeight: Double?\n    /**\n     * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n     *\n     * Use static method [SymbolLayer.defaultTextLineHeight] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-line-height\")\n    }\n\n  /**\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextLineHeight] to set the default property.\n   *\n   * @param textLineHeight value of textLineHeight\n   */\n  override fun textLineHeight(textLineHeight: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-line-height\", textLineHeight)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   *\n   * This is an Expression representation of \"text-line-height\".\n   *\n   */\n  val textLineHeightAsExpression: Expression?\n    /**\n     * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n     *\n     * Get the TextLineHeight property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextLineHeightAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-line-height\")\n\n  /**\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextLineHeightAsExpression] to set the default property.\n   *\n   * @param textLineHeight value of textLineHeight as Expression\n   */\n  override fun textLineHeight(textLineHeight: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-line-height\", textLineHeight)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n   */\n  val textMaxAngle: Double?\n    /**\n     * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n     *\n     * Use static method [SymbolLayer.defaultTextMaxAngle] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-max-angle\")\n    }\n\n  /**\n   * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n   *\n   * Use static method [SymbolLayer.defaultTextMaxAngle] to set the default property.\n   *\n   * @param textMaxAngle value of textMaxAngle\n   */\n  override fun textMaxAngle(textMaxAngle: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-max-angle\", textMaxAngle)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n   *\n   * This is an Expression representation of \"text-max-angle\".\n   *\n   */\n  val textMaxAngleAsExpression: Expression?\n    /**\n     * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n     *\n     * Get the TextMaxAngle property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextMaxAngleAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-max-angle\")\n\n  /**\n   * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n   *\n   * Use static method [SymbolLayer.defaultTextMaxAngleAsExpression] to set the default property.\n   *\n   * @param textMaxAngle value of textMaxAngle as Expression\n   */\n  override fun textMaxAngle(textMaxAngle: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-max-angle\", textMaxAngle)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   */\n  val textMaxWidth: Double?\n    /**\n     * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n     *\n     * Use static method [SymbolLayer.defaultTextMaxWidth] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-max-width\")\n    }\n\n  /**\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextMaxWidth] to set the default property.\n   *\n   * @param textMaxWidth value of textMaxWidth\n   */\n  override fun textMaxWidth(textMaxWidth: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-max-width\", textMaxWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   *\n   * This is an Expression representation of \"text-max-width\".\n   *\n   */\n  val textMaxWidthAsExpression: Expression?\n    /**\n     * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n     *\n     * Get the TextMaxWidth property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextMaxWidthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-max-width\")\n\n  /**\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextMaxWidthAsExpression] to set the default property.\n   *\n   * @param textMaxWidth value of textMaxWidth as Expression\n   */\n  override fun textMaxWidth(textMaxWidth: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-max-width\", textMaxWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   */\n  val textOffset: List<Double>?\n    /**\n     * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n     *\n     * Use static method [SymbolLayer.defaultTextOffset] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"text-offset\")\n    }\n\n  /**\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextOffset] to set the default property.\n   *\n   * @param textOffset value of textOffset\n   */\n  override fun textOffset(textOffset: List<Double>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-offset\", textOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   *\n   * This is an Expression representation of \"text-offset\".\n   *\n   */\n  val textOffsetAsExpression: Expression?\n    /**\n     * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n     *\n     * Get the TextOffset property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextOffsetAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-offset\")\n\n  /**\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextOffsetAsExpression] to set the default property.\n   *\n   * @param textOffset value of textOffset as Expression\n   */\n  override fun textOffset(textOffset: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-offset\", textOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n   */\n  val textOptional: Boolean?\n    /**\n     * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n     *\n     * Use static method [SymbolLayer.defaultTextOptional] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() {\n      return getPropertyValue(\"text-optional\")\n    }\n\n  /**\n   * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultTextOptional] to set the default property.\n   *\n   * @param textOptional value of textOptional\n   */\n  override fun textOptional(textOptional: Boolean): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-optional\", textOptional)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n   *\n   * This is an Expression representation of \"text-optional\".\n   *\n   */\n  val textOptionalAsExpression: Expression?\n    /**\n     * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n     *\n     * Get the TextOptional property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextOptionalAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-optional\")\n\n  /**\n   * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n   *\n   * Use static method [SymbolLayer.defaultTextOptionalAsExpression] to set the default property.\n   *\n   * @param textOptional value of textOptional as Expression\n   */\n  override fun textOptional(textOptional: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-optional\", textOptional)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n   */\n  val textPadding: Double?\n    /**\n     * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultTextPadding] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-padding\")\n    }\n\n  /**\n   * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextPadding] to set the default property.\n   *\n   * @param textPadding value of textPadding\n   */\n  override fun textPadding(textPadding: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-padding\", textPadding)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n   *\n   * This is an Expression representation of \"text-padding\".\n   *\n   */\n  val textPaddingAsExpression: Expression?\n    /**\n     * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n     *\n     * Get the TextPadding property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextPaddingAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-padding\")\n\n  /**\n   * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextPaddingAsExpression] to set the default property.\n   *\n   * @param textPadding value of textPadding as Expression\n   */\n  override fun textPadding(textPadding: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-padding\", textPadding)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Orientation of text when map is pitched. Default value: \"auto\".\n   */\n  val textPitchAlignment: TextPitchAlignment?\n    /**\n     * Orientation of text when map is pitched. Default value: \"auto\".\n     *\n     * Use static method [SymbolLayer.defaultTextPitchAlignment] to get the default property.\n     *\n     * @return TextPitchAlignment\n     */\n    get() {\n      getPropertyValue<String?>(\"text-pitch-alignment\")?.let {\n        return TextPitchAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Orientation of text when map is pitched. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultTextPitchAlignment] to set the default property.\n   *\n   * @param textPitchAlignment value of textPitchAlignment\n   */\n  override fun textPitchAlignment(textPitchAlignment: TextPitchAlignment): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-pitch-alignment\", textPitchAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Orientation of text when map is pitched. Default value: \"auto\".\n   *\n   * This is an Expression representation of \"text-pitch-alignment\".\n   *\n   */\n  val textPitchAlignmentAsExpression: Expression?\n    /**\n     * Orientation of text when map is pitched. Default value: \"auto\".\n     *\n     * Get the TextPitchAlignment property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextPitchAlignmentAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"text-pitch-alignment\")\n        ?: textPitchAlignment?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Orientation of text when map is pitched. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultTextPitchAlignmentAsExpression] to set the default property.\n   *\n   * @param textPitchAlignment value of textPitchAlignment as Expression\n   */\n  override fun textPitchAlignment(textPitchAlignment: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-pitch-alignment\", textPitchAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   */\n  val textRadialOffset: Double?\n    /**\n     * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n     *\n     * Use static method [SymbolLayer.defaultTextRadialOffset] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-radial-offset\")\n    }\n\n  /**\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextRadialOffset] to set the default property.\n   *\n   * @param textRadialOffset value of textRadialOffset\n   */\n  override fun textRadialOffset(textRadialOffset: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-radial-offset\", textRadialOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   *\n   * This is an Expression representation of \"text-radial-offset\".\n   *\n   */\n  val textRadialOffsetAsExpression: Expression?\n    /**\n     * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n     *\n     * Get the TextRadialOffset property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextRadialOffsetAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-radial-offset\")\n\n  /**\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   *\n   * Use static method [SymbolLayer.defaultTextRadialOffsetAsExpression] to set the default property.\n   *\n   * @param textRadialOffset value of textRadialOffset as Expression\n   */\n  override fun textRadialOffset(textRadialOffset: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-radial-offset\", textRadialOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   */\n  val textRotate: Double?\n    /**\n     * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n     *\n     * Use static method [SymbolLayer.defaultTextRotate] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-rotate\")\n    }\n\n  /**\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   *\n   * Use static method [SymbolLayer.defaultTextRotate] to set the default property.\n   *\n   * @param textRotate value of textRotate\n   */\n  override fun textRotate(textRotate: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-rotate\", textRotate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   *\n   * This is an Expression representation of \"text-rotate\".\n   *\n   */\n  val textRotateAsExpression: Expression?\n    /**\n     * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n     *\n     * Get the TextRotate property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextRotateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-rotate\")\n\n  /**\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   *\n   * Use static method [SymbolLayer.defaultTextRotateAsExpression] to set the default property.\n   *\n   * @param textRotate value of textRotate as Expression\n   */\n  override fun textRotate(textRotate: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-rotate\", textRotate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n   */\n  val textRotationAlignment: TextRotationAlignment?\n    /**\n     * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n     *\n     * Use static method [SymbolLayer.defaultTextRotationAlignment] to get the default property.\n     *\n     * @return TextRotationAlignment\n     */\n    get() {\n      getPropertyValue<String?>(\"text-rotation-alignment\")?.let {\n        return TextRotationAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultTextRotationAlignment] to set the default property.\n   *\n   * @param textRotationAlignment value of textRotationAlignment\n   */\n  override fun textRotationAlignment(textRotationAlignment: TextRotationAlignment): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-rotation-alignment\", textRotationAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n   *\n   * This is an Expression representation of \"text-rotation-alignment\".\n   *\n   */\n  val textRotationAlignmentAsExpression: Expression?\n    /**\n     * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n     *\n     * Get the TextRotationAlignment property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextRotationAlignmentAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"text-rotation-alignment\")\n        ?: textRotationAlignment?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n   *\n   * Use static method [SymbolLayer.defaultTextRotationAlignmentAsExpression] to set the default property.\n   *\n   * @param textRotationAlignment value of textRotationAlignment as Expression\n   */\n  override fun textRotationAlignment(textRotationAlignment: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-rotation-alignment\", textRotationAlignment)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   */\n  val textSize: Double?\n    /**\n     * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultTextSize] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-size\")\n    }\n\n  /**\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextSize] to set the default property.\n   *\n   * @param textSize value of textSize\n   */\n  override fun textSize(textSize: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-size\", textSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   *\n   * This is an Expression representation of \"text-size\".\n   *\n   */\n  val textSizeAsExpression: Expression?\n    /**\n     * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n     *\n     * Get the TextSize property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextSizeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-size\")\n\n  /**\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextSizeAsExpression] to set the default property.\n   *\n   * @param textSize value of textSize as Expression\n   */\n  override fun textSize(textSize: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-size\", textSize)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   */\n  @MapboxExperimental\n  val textSizeScaleRange: List<Double>?\n    /**\n     * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n     *\n     * Use static method [SymbolLayer.defaultTextSizeScaleRange] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"text-size-scale-range\")\n    }\n\n  /**\n   * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * Use static method [SymbolLayer.defaultTextSizeScaleRange] to set the default property.\n   *\n   * @param textSizeScaleRange value of textSizeScaleRange\n   */\n  @MapboxExperimental\n  override fun textSizeScaleRange(textSizeScaleRange: List<Double>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-size-scale-range\", textSizeScaleRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * This is an Expression representation of \"text-size-scale-range\".\n   *\n   */\n  @MapboxExperimental\n  val textSizeScaleRangeAsExpression: Expression?\n    /**\n     * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n     *\n     * Get the TextSizeScaleRange property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextSizeScaleRangeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-size-scale-range\")\n\n  /**\n   * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * Use static method [SymbolLayer.defaultTextSizeScaleRangeAsExpression] to set the default property.\n   *\n   * @param textSizeScaleRange value of textSizeScaleRange as Expression\n   */\n  @MapboxExperimental\n  override fun textSizeScaleRange(textSizeScaleRange: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-size-scale-range\", textSizeScaleRange)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   */\n  val textTransform: TextTransform?\n    /**\n     * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n     *\n     * Use static method [SymbolLayer.defaultTextTransform] to get the default property.\n     *\n     * @return TextTransform\n     */\n    get() {\n      getPropertyValue<String?>(\"text-transform\")?.let {\n        return TextTransform.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   *\n   * Use static method [SymbolLayer.defaultTextTransform] to set the default property.\n   *\n   * @param textTransform value of textTransform\n   */\n  override fun textTransform(textTransform: TextTransform): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-transform\", textTransform)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   *\n   * This is an Expression representation of \"text-transform\".\n   *\n   */\n  val textTransformAsExpression: Expression?\n    /**\n     * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n     *\n     * Get the TextTransform property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextTransformAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"text-transform\")\n        ?: textTransform?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   *\n   * Use static method [SymbolLayer.defaultTextTransformAsExpression] to set the default property.\n   *\n   * @param textTransform value of textTransform as Expression\n   */\n  override fun textTransform(textTransform: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-transform\", textTransform)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n   */\n  val textVariableAnchor: List<String>?\n    /**\n     * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n     *\n     * Use static method [SymbolLayer.defaultTextVariableAnchor] to get the default property.\n     *\n     * @return List<String>\n     */\n    get() {\n      return getPropertyValue(\"text-variable-anchor\")\n    }\n\n  /**\n   * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n   *\n   * Use static method [SymbolLayer.defaultTextVariableAnchor] to set the default property.\n   *\n   * @param textVariableAnchor value of textVariableAnchor\n   */\n  override fun textVariableAnchor(textVariableAnchor: List<String>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-variable-anchor\", textVariableAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n   *\n   * This is an Expression representation of \"text-variable-anchor\".\n   *\n   */\n  val textVariableAnchorAsExpression: Expression?\n    /**\n     * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n     *\n     * Get the TextVariableAnchor property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextVariableAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-variable-anchor\")\n\n  /**\n   * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n   *\n   * Use static method [SymbolLayer.defaultTextVariableAnchorAsExpression] to set the default property.\n   *\n   * @param textVariableAnchor value of textVariableAnchor as Expression\n   */\n  override fun textVariableAnchor(textVariableAnchor: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-variable-anchor\", textVariableAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n   */\n  val textWritingMode: List<String>?\n    /**\n     * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n     *\n     * Use static method [SymbolLayer.defaultTextWritingMode] to get the default property.\n     *\n     * @return List<String>\n     */\n    get() {\n      return getPropertyValue(\"text-writing-mode\")\n    }\n\n  /**\n   * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n   *\n   * Use static method [SymbolLayer.defaultTextWritingMode] to set the default property.\n   *\n   * @param textWritingMode value of textWritingMode\n   */\n  override fun textWritingMode(textWritingMode: List<String>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-writing-mode\", textWritingMode)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n   *\n   * This is an Expression representation of \"text-writing-mode\".\n   *\n   */\n  val textWritingModeAsExpression: Expression?\n    /**\n     * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n     *\n     * Get the TextWritingMode property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextWritingModeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-writing-mode\")\n\n  /**\n   * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n   *\n   * Use static method [SymbolLayer.defaultTextWritingModeAsExpression] to set the default property.\n   *\n   * @param textWritingMode value of textWritingMode as Expression\n   */\n  override fun textWritingMode(textWritingMode: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-writing-mode\", textWritingMode)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  val iconColor: String?\n    /**\n     * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n     *\n     * Use static method [SymbolLayer.defaultIconColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      iconColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * Use static method [SymbolLayer.defaultIconColor] to set the default property.\n   *\n   * @param iconColor value of iconColor\n   */\n  override fun iconColor(iconColor: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color\", iconColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"icon-color\".\n   *\n   */\n  val iconColorAsExpression: Expression?\n    /**\n     * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n     *\n     * Get the IconColor property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"icon-color\")\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * Use static method [SymbolLayer.defaultIconColorAsExpression] to set the default property.\n   *\n   * @param iconColor value of iconColor as Expression\n   */\n  override fun iconColor(iconColor: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color\", iconColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  val iconColorAsColorInt: Int?\n    /**\n     * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n     *\n     * Use static method [SymbolLayer.defaultIconColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      iconColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * Use static method [SymbolLayer.defaultIconColorAsColorInt] to set the default property.\n   *\n   * @param iconColor value of iconColor\n   */\n  override fun iconColor(@ColorInt iconColor: Int): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color\", colorIntToRgbaExpression(iconColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconColor.\n   */\n  val iconColorTransition: StyleTransition?\n    /**\n     * Get the IconColor property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"icon-color-transition\")\n    }\n\n  /**\n   * Set the IconColor property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun iconColorTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconColorTransition].\n   */\n  override fun iconColorTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [iconColor].\n   */\n  @MapboxExperimental\n  val iconColorUseTheme: String?\n    /**\n     * Get the IconColorUseTheme property\n     *\n     * Use static method [SymbolLayer.defaultIconColorUseTheme] to get the default property.\n     *\n     * @return current IconColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"icon-color-use-theme\")\n    }\n\n  /**\n   * Set the IconColorUseTheme as String\n   *\n   * Use static method [SymbolLayer.defaultIconColorUseTheme] to get the default property.\n   *\n   * @param iconColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun iconColorUseTheme(iconColorUseTheme: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-use-theme\", iconColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [iconColor].\n   */\n  @MapboxExperimental\n  val iconColorUseThemeAsExpression: Expression?\n    /**\n     * Get the IconColorUseTheme property\n     *\n     * Use static method [SymbolLayer.defaultIconColorUseTheme] to get the default property.\n     *\n     * @return current IconColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"icon-color-use-theme\")\n\n  /**\n   * Set the IconColorUseTheme as Expression\n   *\n   * Use static method [SymbolLayer.defaultIconColorUseTheme] to get the default property.\n   *\n   * @param iconColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun iconColorUseTheme(iconColorUseTheme: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-use-theme\", iconColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   */\n  val iconColorBrightnessMax: Double?\n    /**\n     * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [SymbolLayer.defaultIconColorBrightnessMax] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-color-brightness-max\")\n    }\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconColorBrightnessMax] to set the default property.\n   *\n   * @param iconColorBrightnessMax value of iconColorBrightnessMax\n   */\n  override fun iconColorBrightnessMax(iconColorBrightnessMax: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-brightness-max\", iconColorBrightnessMax)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"icon-color-brightness-max\".\n   *\n   */\n  val iconColorBrightnessMaxAsExpression: Expression?\n    /**\n     * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n     *\n     * Get the IconColorBrightnessMax property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconColorBrightnessMaxAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-color-brightness-max\")\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconColorBrightnessMaxAsExpression] to set the default property.\n   *\n   * @param iconColorBrightnessMax value of iconColorBrightnessMax as Expression\n   */\n  override fun iconColorBrightnessMax(iconColorBrightnessMax: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-brightness-max\", iconColorBrightnessMax)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   */\n  val iconColorBrightnessMin: Double?\n    /**\n     * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [SymbolLayer.defaultIconColorBrightnessMin] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-color-brightness-min\")\n    }\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconColorBrightnessMin] to set the default property.\n   *\n   * @param iconColorBrightnessMin value of iconColorBrightnessMin\n   */\n  override fun iconColorBrightnessMin(iconColorBrightnessMin: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-brightness-min\", iconColorBrightnessMin)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"icon-color-brightness-min\".\n   *\n   */\n  val iconColorBrightnessMinAsExpression: Expression?\n    /**\n     * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n     *\n     * Get the IconColorBrightnessMin property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconColorBrightnessMinAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-color-brightness-min\")\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconColorBrightnessMinAsExpression] to set the default property.\n   *\n   * @param iconColorBrightnessMin value of iconColorBrightnessMin as Expression\n   */\n  override fun iconColorBrightnessMin(iconColorBrightnessMin: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-brightness-min\", iconColorBrightnessMin)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n   */\n  val iconColorContrast: Double?\n    /**\n     * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n     *\n     * Use static method [SymbolLayer.defaultIconColorContrast] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-color-contrast\")\n    }\n\n  /**\n   * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconColorContrast] to set the default property.\n   *\n   * @param iconColorContrast value of iconColorContrast\n   */\n  override fun iconColorContrast(iconColorContrast: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-contrast\", iconColorContrast)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * This is an Expression representation of \"icon-color-contrast\".\n   *\n   */\n  val iconColorContrastAsExpression: Expression?\n    /**\n     * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n     *\n     * Get the IconColorContrast property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconColorContrastAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-color-contrast\")\n\n  /**\n   * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconColorContrastAsExpression] to set the default property.\n   *\n   * @param iconColorContrast value of iconColorContrast as Expression\n   */\n  override fun iconColorContrast(iconColorContrast: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-contrast\", iconColorContrast)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   */\n  val iconColorSaturation: Double?\n    /**\n     * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n     *\n     * Use static method [SymbolLayer.defaultIconColorSaturation] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-color-saturation\")\n    }\n\n  /**\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconColorSaturation] to set the default property.\n   *\n   * @param iconColorSaturation value of iconColorSaturation\n   */\n  override fun iconColorSaturation(iconColorSaturation: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-saturation\", iconColorSaturation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * This is an Expression representation of \"icon-color-saturation\".\n   *\n   */\n  val iconColorSaturationAsExpression: Expression?\n    /**\n     * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n     *\n     * Get the IconColorSaturation property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconColorSaturationAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-color-saturation\")\n\n  /**\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconColorSaturationAsExpression] to set the default property.\n   *\n   * @param iconColorSaturation value of iconColorSaturation as Expression\n   */\n  override fun iconColorSaturation(iconColorSaturation: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-saturation\", iconColorSaturation)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconColorSaturation.\n   */\n  val iconColorSaturationTransition: StyleTransition?\n    /**\n     * Get the IconColorSaturation property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconColorSaturationTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"icon-color-saturation-transition\")\n    }\n\n  /**\n   * Set the IconColorSaturation property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconColorSaturationTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun iconColorSaturationTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-color-saturation-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconColorSaturationTransition].\n   */\n  override fun iconColorSaturationTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconColorSaturationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   */\n  val iconEmissiveStrength: Double?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n     *\n     * Use static method [SymbolLayer.defaultIconEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-emissive-strength\")\n    }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   *\n   * Use static method [SymbolLayer.defaultIconEmissiveStrength] to set the default property.\n   *\n   * @param iconEmissiveStrength value of iconEmissiveStrength\n   */\n  override fun iconEmissiveStrength(iconEmissiveStrength: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-emissive-strength\", iconEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   *\n   * This is an Expression representation of \"icon-emissive-strength\".\n   *\n   */\n  val iconEmissiveStrengthAsExpression: Expression?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n     *\n     * Get the IconEmissiveStrength property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-emissive-strength\")\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   *\n   * Use static method [SymbolLayer.defaultIconEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param iconEmissiveStrength value of iconEmissiveStrength as Expression\n   */\n  override fun iconEmissiveStrength(iconEmissiveStrength: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-emissive-strength\", iconEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconEmissiveStrength.\n   */\n  val iconEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the IconEmissiveStrength property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"icon-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the IconEmissiveStrength property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun iconEmissiveStrengthTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconEmissiveStrengthTransition].\n   */\n  override fun iconEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   */\n  val iconHaloBlur: Double?\n    /**\n     * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultIconHaloBlur] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-halo-blur\")\n    }\n\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconHaloBlur] to set the default property.\n   *\n   * @param iconHaloBlur value of iconHaloBlur\n   */\n  override fun iconHaloBlur(iconHaloBlur: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-blur\", iconHaloBlur)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   *\n   * This is an Expression representation of \"icon-halo-blur\".\n   *\n   */\n  val iconHaloBlurAsExpression: Expression?\n    /**\n     * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n     *\n     * Get the IconHaloBlur property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconHaloBlurAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-halo-blur\")\n\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconHaloBlurAsExpression] to set the default property.\n   *\n   * @param iconHaloBlur value of iconHaloBlur as Expression\n   */\n  override fun iconHaloBlur(iconHaloBlur: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-blur\", iconHaloBlur)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconHaloBlur.\n   */\n  val iconHaloBlurTransition: StyleTransition?\n    /**\n     * Get the IconHaloBlur property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconHaloBlurTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"icon-halo-blur-transition\")\n    }\n\n  /**\n   * Set the IconHaloBlur property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconHaloBlurTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun iconHaloBlurTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-blur-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconHaloBlurTransition].\n   */\n  override fun iconHaloBlurTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconHaloBlurTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  val iconHaloColor: String?\n    /**\n     * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * Use static method [SymbolLayer.defaultIconHaloColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      iconHaloColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Use static method [SymbolLayer.defaultIconHaloColor] to set the default property.\n   *\n   * @param iconHaloColor value of iconHaloColor\n   */\n  override fun iconHaloColor(iconHaloColor: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-color\", iconHaloColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * This is an Expression representation of \"icon-halo-color\".\n   *\n   */\n  val iconHaloColorAsExpression: Expression?\n    /**\n     * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * Get the IconHaloColor property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconHaloColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"icon-halo-color\")\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Use static method [SymbolLayer.defaultIconHaloColorAsExpression] to set the default property.\n   *\n   * @param iconHaloColor value of iconHaloColor as Expression\n   */\n  override fun iconHaloColor(iconHaloColor: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-color\", iconHaloColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  val iconHaloColorAsColorInt: Int?\n    /**\n     * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * Use static method [SymbolLayer.defaultIconHaloColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      iconHaloColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Use static method [SymbolLayer.defaultIconHaloColorAsColorInt] to set the default property.\n   *\n   * @param iconHaloColor value of iconHaloColor\n   */\n  override fun iconHaloColor(@ColorInt iconHaloColor: Int): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-color\", colorIntToRgbaExpression(iconHaloColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconHaloColor.\n   */\n  val iconHaloColorTransition: StyleTransition?\n    /**\n     * Get the IconHaloColor property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconHaloColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"icon-halo-color-transition\")\n    }\n\n  /**\n   * Set the IconHaloColor property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconHaloColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun iconHaloColorTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconHaloColorTransition].\n   */\n  override fun iconHaloColorTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconHaloColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [iconHaloColor].\n   */\n  @MapboxExperimental\n  val iconHaloColorUseTheme: String?\n    /**\n     * Get the IconHaloColorUseTheme property\n     *\n     * Use static method [SymbolLayer.defaultIconHaloColorUseTheme] to get the default property.\n     *\n     * @return current IconHaloColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"icon-halo-color-use-theme\")\n    }\n\n  /**\n   * Set the IconHaloColorUseTheme as String\n   *\n   * Use static method [SymbolLayer.defaultIconHaloColorUseTheme] to get the default property.\n   *\n   * @param iconHaloColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun iconHaloColorUseTheme(iconHaloColorUseTheme: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-color-use-theme\", iconHaloColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [iconHaloColor].\n   */\n  @MapboxExperimental\n  val iconHaloColorUseThemeAsExpression: Expression?\n    /**\n     * Get the IconHaloColorUseTheme property\n     *\n     * Use static method [SymbolLayer.defaultIconHaloColorUseTheme] to get the default property.\n     *\n     * @return current IconHaloColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"icon-halo-color-use-theme\")\n\n  /**\n   * Set the IconHaloColorUseTheme as Expression\n   *\n   * Use static method [SymbolLayer.defaultIconHaloColorUseTheme] to get the default property.\n   *\n   * @param iconHaloColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun iconHaloColorUseTheme(iconHaloColorUseTheme: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-color-use-theme\", iconHaloColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   */\n  val iconHaloWidth: Double?\n    /**\n     * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultIconHaloWidth] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-halo-width\")\n    }\n\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconHaloWidth] to set the default property.\n   *\n   * @param iconHaloWidth value of iconHaloWidth\n   */\n  override fun iconHaloWidth(iconHaloWidth: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-width\", iconHaloWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   *\n   * This is an Expression representation of \"icon-halo-width\".\n   *\n   */\n  val iconHaloWidthAsExpression: Expression?\n    /**\n     * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n     *\n     * Get the IconHaloWidth property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconHaloWidthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-halo-width\")\n\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconHaloWidthAsExpression] to set the default property.\n   *\n   * @param iconHaloWidth value of iconHaloWidth as Expression\n   */\n  override fun iconHaloWidth(iconHaloWidth: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-width\", iconHaloWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconHaloWidth.\n   */\n  val iconHaloWidthTransition: StyleTransition?\n    /**\n     * Get the IconHaloWidth property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconHaloWidthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"icon-halo-width-transition\")\n    }\n\n  /**\n   * Set the IconHaloWidth property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconHaloWidthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun iconHaloWidthTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-halo-width-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconHaloWidthTransition].\n   */\n  override fun iconHaloWidthTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconHaloWidthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  val iconImageCrossFade: Double?\n    /**\n     * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [SymbolLayer.defaultIconImageCrossFade] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-image-cross-fade\")\n    }\n\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconImageCrossFade] to set the default property.\n   *\n   * @param iconImageCrossFade value of iconImageCrossFade\n   */\n  override fun iconImageCrossFade(iconImageCrossFade: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-image-cross-fade\", iconImageCrossFade)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"icon-image-cross-fade\".\n   *\n   */\n  val iconImageCrossFadeAsExpression: Expression?\n    /**\n     * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * Get the IconImageCrossFade property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconImageCrossFadeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-image-cross-fade\")\n\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconImageCrossFadeAsExpression] to set the default property.\n   *\n   * @param iconImageCrossFade value of iconImageCrossFade as Expression\n   */\n  override fun iconImageCrossFade(iconImageCrossFade: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-image-cross-fade\", iconImageCrossFade)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconImageCrossFade.\n   */\n  val iconImageCrossFadeTransition: StyleTransition?\n    /**\n     * Get the IconImageCrossFade property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconImageCrossFadeTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"icon-image-cross-fade-transition\")\n    }\n\n  /**\n   * Set the IconImageCrossFade property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconImageCrossFadeTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun iconImageCrossFadeTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-image-cross-fade-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconImageCrossFadeTransition].\n   */\n  override fun iconImageCrossFadeTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconImageCrossFadeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  val iconOcclusionOpacity: Double?\n    /**\n     * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [SymbolLayer.defaultIconOcclusionOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-occlusion-opacity\")\n    }\n\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconOcclusionOpacity] to set the default property.\n   *\n   * @param iconOcclusionOpacity value of iconOcclusionOpacity\n   */\n  override fun iconOcclusionOpacity(iconOcclusionOpacity: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-occlusion-opacity\", iconOcclusionOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"icon-occlusion-opacity\".\n   *\n   */\n  val iconOcclusionOpacityAsExpression: Expression?\n    /**\n     * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n     *\n     * Get the IconOcclusionOpacity property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconOcclusionOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-occlusion-opacity\")\n\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconOcclusionOpacityAsExpression] to set the default property.\n   *\n   * @param iconOcclusionOpacity value of iconOcclusionOpacity as Expression\n   */\n  override fun iconOcclusionOpacity(iconOcclusionOpacity: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-occlusion-opacity\", iconOcclusionOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconOcclusionOpacity.\n   */\n  val iconOcclusionOpacityTransition: StyleTransition?\n    /**\n     * Get the IconOcclusionOpacity property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconOcclusionOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"icon-occlusion-opacity-transition\")\n    }\n\n  /**\n   * Set the IconOcclusionOpacity property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconOcclusionOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun iconOcclusionOpacityTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-occlusion-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconOcclusionOpacityTransition].\n   */\n  override fun iconOcclusionOpacityTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconOcclusionOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  val iconOpacity: Double?\n    /**\n     * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [SymbolLayer.defaultIconOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"icon-opacity\")\n    }\n\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconOpacity] to set the default property.\n   *\n   * @param iconOpacity value of iconOpacity\n   */\n  override fun iconOpacity(iconOpacity: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-opacity\", iconOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"icon-opacity\".\n   *\n   */\n  val iconOpacityAsExpression: Expression?\n    /**\n     * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Get the IconOpacity property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-opacity\")\n\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultIconOpacityAsExpression] to set the default property.\n   *\n   * @param iconOpacity value of iconOpacity as Expression\n   */\n  override fun iconOpacity(iconOpacity: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-opacity\", iconOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconOpacity.\n   */\n  val iconOpacityTransition: StyleTransition?\n    /**\n     * Get the IconOpacity property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"icon-opacity-transition\")\n    }\n\n  /**\n   * Set the IconOpacity property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun iconOpacityTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconOpacityTransition].\n   */\n  override fun iconOpacityTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   */\n  val iconTranslate: List<Double>?\n    /**\n     * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultIconTranslate] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"icon-translate\")\n    }\n\n  /**\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconTranslate] to set the default property.\n   *\n   * @param iconTranslate value of iconTranslate\n   */\n  override fun iconTranslate(iconTranslate: List<Double>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-translate\", iconTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   *\n   * This is an Expression representation of \"icon-translate\".\n   *\n   */\n  val iconTranslateAsExpression: Expression?\n    /**\n     * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n     *\n     * Get the IconTranslate property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconTranslateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"icon-translate\")\n\n  /**\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultIconTranslateAsExpression] to set the default property.\n   *\n   * @param iconTranslate value of iconTranslate as Expression\n   */\n  override fun iconTranslate(iconTranslate: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-translate\", iconTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for IconTranslate.\n   */\n  val iconTranslateTransition: StyleTransition?\n    /**\n     * Get the IconTranslate property transition options\n     *\n     * Use static method [SymbolLayer.defaultIconTranslateTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"icon-translate-transition\")\n    }\n\n  /**\n   * Set the IconTranslate property transition options\n   *\n   * Use static method [SymbolLayer.defaultIconTranslateTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun iconTranslateTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-translate-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [iconTranslateTransition].\n   */\n  override fun iconTranslateTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    iconTranslateTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n   */\n  val iconTranslateAnchor: IconTranslateAnchor?\n    /**\n     * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n     *\n     * Use static method [SymbolLayer.defaultIconTranslateAnchor] to get the default property.\n     *\n     * @return IconTranslateAnchor\n     */\n    get() {\n      getPropertyValue<String?>(\"icon-translate-anchor\")?.let {\n        return IconTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n   *\n   * Use static method [SymbolLayer.defaultIconTranslateAnchor] to set the default property.\n   *\n   * @param iconTranslateAnchor value of iconTranslateAnchor\n   */\n  override fun iconTranslateAnchor(iconTranslateAnchor: IconTranslateAnchor): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-translate-anchor\", iconTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n   *\n   * This is an Expression representation of \"icon-translate-anchor\".\n   *\n   */\n  val iconTranslateAnchorAsExpression: Expression?\n    /**\n     * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n     *\n     * Get the IconTranslateAnchor property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultIconTranslateAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"icon-translate-anchor\")\n        ?: iconTranslateAnchor?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n   *\n   * Use static method [SymbolLayer.defaultIconTranslateAnchorAsExpression] to set the default property.\n   *\n   * @param iconTranslateAnchor value of iconTranslateAnchor as Expression\n   */\n  override fun iconTranslateAnchor(iconTranslateAnchor: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"icon-translate-anchor\", iconTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n   */\n  val occlusionOpacityMode: OcclusionOpacityMode?\n    /**\n     * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n     *\n     * Use static method [SymbolLayer.defaultOcclusionOpacityMode] to get the default property.\n     *\n     * @return OcclusionOpacityMode\n     */\n    get() {\n      getPropertyValue<String?>(\"occlusion-opacity-mode\")?.let {\n        return OcclusionOpacityMode.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n   *\n   * Use static method [SymbolLayer.defaultOcclusionOpacityMode] to set the default property.\n   *\n   * @param occlusionOpacityMode value of occlusionOpacityMode\n   */\n  override fun occlusionOpacityMode(occlusionOpacityMode: OcclusionOpacityMode): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"occlusion-opacity-mode\", occlusionOpacityMode)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n   *\n   * This is an Expression representation of \"occlusion-opacity-mode\".\n   *\n   */\n  val occlusionOpacityModeAsExpression: Expression?\n    /**\n     * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n     *\n     * Get the OcclusionOpacityMode property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultOcclusionOpacityModeAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"occlusion-opacity-mode\")\n        ?: occlusionOpacityMode?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n   *\n   * Use static method [SymbolLayer.defaultOcclusionOpacityModeAsExpression] to set the default property.\n   *\n   * @param occlusionOpacityMode value of occlusionOpacityMode as Expression\n   */\n  override fun occlusionOpacityMode(occlusionOpacityMode: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"occlusion-opacity-mode\", occlusionOpacityMode)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  val symbolZOffset: Double?\n    /**\n     * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n     *\n     * Use static method [SymbolLayer.defaultSymbolZOffset] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"symbol-z-offset\")\n    }\n\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   *\n   * Use static method [SymbolLayer.defaultSymbolZOffset] to set the default property.\n   *\n   * @param symbolZOffset value of symbolZOffset\n   */\n  @MapboxExperimental\n  override fun symbolZOffset(symbolZOffset: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-z-offset\", symbolZOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   *\n   * This is an Expression representation of \"symbol-z-offset\".\n   *\n   */\n  @MapboxExperimental\n  val symbolZOffsetAsExpression: Expression?\n    /**\n     * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n     *\n     * Get the SymbolZOffset property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultSymbolZOffsetAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"symbol-z-offset\")\n\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   *\n   * Use static method [SymbolLayer.defaultSymbolZOffsetAsExpression] to set the default property.\n   *\n   * @param symbolZOffset value of symbolZOffset as Expression\n   */\n  @MapboxExperimental\n  override fun symbolZOffset(symbolZOffset: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-z-offset\", symbolZOffset)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for SymbolZOffset.\n   */\n  @MapboxExperimental\n  val symbolZOffsetTransition: StyleTransition?\n    /**\n     * Get the SymbolZOffset property transition options\n     *\n     * Use static method [SymbolLayer.defaultSymbolZOffsetTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"symbol-z-offset-transition\")\n    }\n\n  /**\n   * Set the SymbolZOffset property transition options\n   *\n   * Use static method [SymbolLayer.defaultSymbolZOffsetTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  override fun symbolZOffsetTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"symbol-z-offset-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [symbolZOffsetTransition].\n   */\n  @MapboxExperimental\n  override fun symbolZOffsetTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    symbolZOffsetTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  val textColor: String?\n    /**\n     * The color with which the text will be drawn. Default value: \"#000000\".\n     *\n     * Use static method [SymbolLayer.defaultTextColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      textColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * Use static method [SymbolLayer.defaultTextColor] to set the default property.\n   *\n   * @param textColor value of textColor\n   */\n  override fun textColor(textColor: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-color\", textColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * This is an Expression representation of \"text-color\".\n   *\n   */\n  val textColorAsExpression: Expression?\n    /**\n     * The color with which the text will be drawn. Default value: \"#000000\".\n     *\n     * Get the TextColor property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"text-color\")\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * Use static method [SymbolLayer.defaultTextColorAsExpression] to set the default property.\n   *\n   * @param textColor value of textColor as Expression\n   */\n  override fun textColor(textColor: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-color\", textColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  val textColorAsColorInt: Int?\n    /**\n     * The color with which the text will be drawn. Default value: \"#000000\".\n     *\n     * Use static method [SymbolLayer.defaultTextColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      textColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * Use static method [SymbolLayer.defaultTextColorAsColorInt] to set the default property.\n   *\n   * @param textColor value of textColor\n   */\n  override fun textColor(@ColorInt textColor: Int): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-color\", colorIntToRgbaExpression(textColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for TextColor.\n   */\n  val textColorTransition: StyleTransition?\n    /**\n     * Get the TextColor property transition options\n     *\n     * Use static method [SymbolLayer.defaultTextColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"text-color-transition\")\n    }\n\n  /**\n   * Set the TextColor property transition options\n   *\n   * Use static method [SymbolLayer.defaultTextColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun textColorTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [textColorTransition].\n   */\n  override fun textColorTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    textColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [textColor].\n   */\n  @MapboxExperimental\n  val textColorUseTheme: String?\n    /**\n     * Get the TextColorUseTheme property\n     *\n     * Use static method [SymbolLayer.defaultTextColorUseTheme] to get the default property.\n     *\n     * @return current TextColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"text-color-use-theme\")\n    }\n\n  /**\n   * Set the TextColorUseTheme as String\n   *\n   * Use static method [SymbolLayer.defaultTextColorUseTheme] to get the default property.\n   *\n   * @param textColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun textColorUseTheme(textColorUseTheme: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-color-use-theme\", textColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [textColor].\n   */\n  @MapboxExperimental\n  val textColorUseThemeAsExpression: Expression?\n    /**\n     * Get the TextColorUseTheme property\n     *\n     * Use static method [SymbolLayer.defaultTextColorUseTheme] to get the default property.\n     *\n     * @return current TextColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"text-color-use-theme\")\n\n  /**\n   * Set the TextColorUseTheme as Expression\n   *\n   * Use static method [SymbolLayer.defaultTextColorUseTheme] to get the default property.\n   *\n   * @param textColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun textColorUseTheme(textColorUseTheme: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-color-use-theme\", textColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   */\n  val textEmissiveStrength: Double?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n     *\n     * Use static method [SymbolLayer.defaultTextEmissiveStrength] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-emissive-strength\")\n    }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   *\n   * Use static method [SymbolLayer.defaultTextEmissiveStrength] to set the default property.\n   *\n   * @param textEmissiveStrength value of textEmissiveStrength\n   */\n  override fun textEmissiveStrength(textEmissiveStrength: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-emissive-strength\", textEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   *\n   * This is an Expression representation of \"text-emissive-strength\".\n   *\n   */\n  val textEmissiveStrengthAsExpression: Expression?\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n     *\n     * Get the TextEmissiveStrength property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextEmissiveStrengthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-emissive-strength\")\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   *\n   * Use static method [SymbolLayer.defaultTextEmissiveStrengthAsExpression] to set the default property.\n   *\n   * @param textEmissiveStrength value of textEmissiveStrength as Expression\n   */\n  override fun textEmissiveStrength(textEmissiveStrength: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-emissive-strength\", textEmissiveStrength)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for TextEmissiveStrength.\n   */\n  val textEmissiveStrengthTransition: StyleTransition?\n    /**\n     * Get the TextEmissiveStrength property transition options\n     *\n     * Use static method [SymbolLayer.defaultTextEmissiveStrengthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"text-emissive-strength-transition\")\n    }\n\n  /**\n   * Set the TextEmissiveStrength property transition options\n   *\n   * Use static method [SymbolLayer.defaultTextEmissiveStrengthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun textEmissiveStrengthTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-emissive-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [textEmissiveStrengthTransition].\n   */\n  override fun textEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    textEmissiveStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   */\n  val textHaloBlur: Double?\n    /**\n     * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultTextHaloBlur] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-halo-blur\")\n    }\n\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextHaloBlur] to set the default property.\n   *\n   * @param textHaloBlur value of textHaloBlur\n   */\n  override fun textHaloBlur(textHaloBlur: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-blur\", textHaloBlur)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   *\n   * This is an Expression representation of \"text-halo-blur\".\n   *\n   */\n  val textHaloBlurAsExpression: Expression?\n    /**\n     * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n     *\n     * Get the TextHaloBlur property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextHaloBlurAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-halo-blur\")\n\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextHaloBlurAsExpression] to set the default property.\n   *\n   * @param textHaloBlur value of textHaloBlur as Expression\n   */\n  override fun textHaloBlur(textHaloBlur: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-blur\", textHaloBlur)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for TextHaloBlur.\n   */\n  val textHaloBlurTransition: StyleTransition?\n    /**\n     * Get the TextHaloBlur property transition options\n     *\n     * Use static method [SymbolLayer.defaultTextHaloBlurTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"text-halo-blur-transition\")\n    }\n\n  /**\n   * Set the TextHaloBlur property transition options\n   *\n   * Use static method [SymbolLayer.defaultTextHaloBlurTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun textHaloBlurTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-blur-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [textHaloBlurTransition].\n   */\n  override fun textHaloBlurTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    textHaloBlurTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  val textHaloColor: String?\n    /**\n     * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * Use static method [SymbolLayer.defaultTextHaloColor] to get the default property.\n     *\n     * @return String\n     */\n    get() {\n      textHaloColorAsExpression?.let {\n        return rgbaExpressionToColorString(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Use static method [SymbolLayer.defaultTextHaloColor] to set the default property.\n   *\n   * @param textHaloColor value of textHaloColor\n   */\n  override fun textHaloColor(textHaloColor: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-color\", textHaloColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * This is an Expression representation of \"text-halo-color\".\n   *\n   */\n  val textHaloColorAsExpression: Expression?\n    /**\n     * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * Get the TextHaloColor property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextHaloColorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"text-halo-color\")\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Use static method [SymbolLayer.defaultTextHaloColorAsExpression] to set the default property.\n   *\n   * @param textHaloColor value of textHaloColor as Expression\n   */\n  override fun textHaloColor(textHaloColor: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-color\", textHaloColor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  val textHaloColorAsColorInt: Int?\n    /**\n     * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * Use static method [SymbolLayer.defaultTextHaloColorAsColorInt] to get the default property.\n     *\n     * @return int representation of a rgba string color\n     */\n    @ColorInt\n    get() {\n      textHaloColorAsExpression?.let {\n        return rgbaExpressionToColorInt(it)\n      }\n      return null\n    }\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Use static method [SymbolLayer.defaultTextHaloColorAsColorInt] to set the default property.\n   *\n   * @param textHaloColor value of textHaloColor\n   */\n  override fun textHaloColor(@ColorInt textHaloColor: Int): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-color\", colorIntToRgbaExpression(textHaloColor))\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for TextHaloColor.\n   */\n  val textHaloColorTransition: StyleTransition?\n    /**\n     * Get the TextHaloColor property transition options\n     *\n     * Use static method [SymbolLayer.defaultTextHaloColorTransition] to get the default property.\n     *\n     * @return transition options for String\n     */\n    get() {\n      return getPropertyValue(\"text-halo-color-transition\")\n    }\n\n  /**\n   * Set the TextHaloColor property transition options\n   *\n   * Use static method [SymbolLayer.defaultTextHaloColorTransition] to set the default property.\n   *\n   * @param options transition options for String\n   */\n  override fun textHaloColorTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [textHaloColorTransition].\n   */\n  override fun textHaloColorTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    textHaloColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Сolor theme override for [textHaloColor].\n   */\n  @MapboxExperimental\n  val textHaloColorUseTheme: String?\n    /**\n     * Get the TextHaloColorUseTheme property\n     *\n     * Use static method [SymbolLayer.defaultTextHaloColorUseTheme] to get the default property.\n     *\n     * @return current TextHaloColorUseTheme property as String\n     */\n    get() {\n      return getPropertyValue(\"text-halo-color-use-theme\")\n    }\n\n  /**\n   * Set the TextHaloColorUseTheme as String\n   *\n   * Use static method [SymbolLayer.defaultTextHaloColorUseTheme] to get the default property.\n   *\n   * @param textHaloColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun textHaloColorUseTheme(textHaloColorUseTheme: String): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-color-use-theme\", textHaloColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Сolor theme override for [textHaloColor].\n   */\n  @MapboxExperimental\n  val textHaloColorUseThemeAsExpression: Expression?\n    /**\n     * Get the TextHaloColorUseTheme property\n     *\n     * Use static method [SymbolLayer.defaultTextHaloColorUseTheme] to get the default property.\n     *\n     * @return current TextHaloColorUseTheme property as String\n     */\n    get() = getPropertyValueAsExpressionOrLiteralExpression(\"text-halo-color-use-theme\")\n\n  /**\n   * Set the TextHaloColorUseTheme as Expression\n   *\n   * Use static method [SymbolLayer.defaultTextHaloColorUseTheme] to get the default property.\n   *\n   * @param textHaloColorUseTheme theme value for color. Overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  override fun textHaloColorUseTheme(textHaloColorUseTheme: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-color-use-theme\", textHaloColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   */\n  val textHaloWidth: Double?\n    /**\n     * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultTextHaloWidth] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-halo-width\")\n    }\n\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextHaloWidth] to set the default property.\n   *\n   * @param textHaloWidth value of textHaloWidth\n   */\n  override fun textHaloWidth(textHaloWidth: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-width\", textHaloWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   *\n   * This is an Expression representation of \"text-halo-width\".\n   *\n   */\n  val textHaloWidthAsExpression: Expression?\n    /**\n     * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n     *\n     * Get the TextHaloWidth property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextHaloWidthAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-halo-width\")\n\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextHaloWidthAsExpression] to set the default property.\n   *\n   * @param textHaloWidth value of textHaloWidth as Expression\n   */\n  override fun textHaloWidth(textHaloWidth: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-width\", textHaloWidth)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for TextHaloWidth.\n   */\n  val textHaloWidthTransition: StyleTransition?\n    /**\n     * Get the TextHaloWidth property transition options\n     *\n     * Use static method [SymbolLayer.defaultTextHaloWidthTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"text-halo-width-transition\")\n    }\n\n  /**\n   * Set the TextHaloWidth property transition options\n   *\n   * Use static method [SymbolLayer.defaultTextHaloWidthTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun textHaloWidthTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-halo-width-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [textHaloWidthTransition].\n   */\n  override fun textHaloWidthTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    textHaloWidthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  val textOcclusionOpacity: Double?\n    /**\n     * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n     *\n     * Use static method [SymbolLayer.defaultTextOcclusionOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-occlusion-opacity\")\n    }\n\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultTextOcclusionOpacity] to set the default property.\n   *\n   * @param textOcclusionOpacity value of textOcclusionOpacity\n   */\n  override fun textOcclusionOpacity(textOcclusionOpacity: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-occlusion-opacity\", textOcclusionOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"text-occlusion-opacity\".\n   *\n   */\n  val textOcclusionOpacityAsExpression: Expression?\n    /**\n     * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n     *\n     * Get the TextOcclusionOpacity property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextOcclusionOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-occlusion-opacity\")\n\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultTextOcclusionOpacityAsExpression] to set the default property.\n   *\n   * @param textOcclusionOpacity value of textOcclusionOpacity as Expression\n   */\n  override fun textOcclusionOpacity(textOcclusionOpacity: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-occlusion-opacity\", textOcclusionOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for TextOcclusionOpacity.\n   */\n  val textOcclusionOpacityTransition: StyleTransition?\n    /**\n     * Get the TextOcclusionOpacity property transition options\n     *\n     * Use static method [SymbolLayer.defaultTextOcclusionOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"text-occlusion-opacity-transition\")\n    }\n\n  /**\n   * Set the TextOcclusionOpacity property transition options\n   *\n   * Use static method [SymbolLayer.defaultTextOcclusionOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun textOcclusionOpacityTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-occlusion-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [textOcclusionOpacityTransition].\n   */\n  override fun textOcclusionOpacityTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    textOcclusionOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  val textOpacity: Double?\n    /**\n     * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Use static method [SymbolLayer.defaultTextOpacity] to get the default property.\n     *\n     * @return Double\n     */\n    get() {\n      return getPropertyValue(\"text-opacity\")\n    }\n\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultTextOpacity] to set the default property.\n   *\n   * @param textOpacity value of textOpacity\n   */\n  override fun textOpacity(textOpacity: Double): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-opacity\", textOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"text-opacity\".\n   *\n   */\n  val textOpacityAsExpression: Expression?\n    /**\n     * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * Get the TextOpacity property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextOpacityAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-opacity\")\n\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Use static method [SymbolLayer.defaultTextOpacityAsExpression] to set the default property.\n   *\n   * @param textOpacity value of textOpacity as Expression\n   */\n  override fun textOpacity(textOpacity: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-opacity\", textOpacity)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for TextOpacity.\n   */\n  val textOpacityTransition: StyleTransition?\n    /**\n     * Get the TextOpacity property transition options\n     *\n     * Use static method [SymbolLayer.defaultTextOpacityTransition] to get the default property.\n     *\n     * @return transition options for Double\n     */\n    get() {\n      return getPropertyValue(\"text-opacity-transition\")\n    }\n\n  /**\n   * Set the TextOpacity property transition options\n   *\n   * Use static method [SymbolLayer.defaultTextOpacityTransition] to set the default property.\n   *\n   * @param options transition options for Double\n   */\n  override fun textOpacityTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [textOpacityTransition].\n   */\n  override fun textOpacityTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    textOpacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   */\n  val textTranslate: List<Double>?\n    /**\n     * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n     *\n     * Use static method [SymbolLayer.defaultTextTranslate] to get the default property.\n     *\n     * @return List<Double>\n     */\n    get() {\n      return getPropertyValue(\"text-translate\")\n    }\n\n  /**\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextTranslate] to set the default property.\n   *\n   * @param textTranslate value of textTranslate\n   */\n  override fun textTranslate(textTranslate: List<Double>): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-translate\", textTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   *\n   * This is an Expression representation of \"text-translate\".\n   *\n   */\n  val textTranslateAsExpression: Expression?\n    /**\n     * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n     *\n     * Get the TextTranslate property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextTranslateAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValueAsExpressionOrLiteralExpression(\"text-translate\")\n\n  /**\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   *\n   * Use static method [SymbolLayer.defaultTextTranslateAsExpression] to set the default property.\n   *\n   * @param textTranslate value of textTranslate as Expression\n   */\n  override fun textTranslate(textTranslate: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-translate\", textTranslate)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Transition options for TextTranslate.\n   */\n  val textTranslateTransition: StyleTransition?\n    /**\n     * Get the TextTranslate property transition options\n     *\n     * Use static method [SymbolLayer.defaultTextTranslateTransition] to get the default property.\n     *\n     * @return transition options for List<Double>\n     */\n    get() {\n      return getPropertyValue(\"text-translate-transition\")\n    }\n\n  /**\n   * Set the TextTranslate property transition options\n   *\n   * Use static method [SymbolLayer.defaultTextTranslateTransition] to set the default property.\n   *\n   * @param options transition options for List<Double>\n   */\n  override fun textTranslateTransition(options: StyleTransition): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-translate-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [textTranslateTransition].\n   */\n  override fun textTranslateTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer = apply {\n    textTranslateTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Controls the frame of reference for `text-translate`. Default value: \"map\".\n   */\n  val textTranslateAnchor: TextTranslateAnchor?\n    /**\n     * Controls the frame of reference for `text-translate`. Default value: \"map\".\n     *\n     * Use static method [SymbolLayer.defaultTextTranslateAnchor] to get the default property.\n     *\n     * @return TextTranslateAnchor\n     */\n    get() {\n      getPropertyValue<String?>(\"text-translate-anchor\")?.let {\n        return TextTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Controls the frame of reference for `text-translate`. Default value: \"map\".\n   *\n   * Use static method [SymbolLayer.defaultTextTranslateAnchor] to set the default property.\n   *\n   * @param textTranslateAnchor value of textTranslateAnchor\n   */\n  override fun textTranslateAnchor(textTranslateAnchor: TextTranslateAnchor): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-translate-anchor\", textTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Controls the frame of reference for `text-translate`. Default value: \"map\".\n   *\n   * This is an Expression representation of \"text-translate-anchor\".\n   *\n   */\n  val textTranslateAnchorAsExpression: Expression?\n    /**\n     * Controls the frame of reference for `text-translate`. Default value: \"map\".\n     *\n     * Get the TextTranslateAnchor property as an Expression\n     *\n     * Use static method [SymbolLayer.defaultTextTranslateAnchorAsExpression] to get the default property.\n     */\n    get() =\n      getPropertyValue(\"text-translate-anchor\")\n        ?: textTranslateAnchor?.let {\n          Expression.literal(it.value)\n        }\n\n  /**\n   * Controls the frame of reference for `text-translate`. Default value: \"map\".\n   *\n   * Use static method [SymbolLayer.defaultTextTranslateAnchorAsExpression] to set the default property.\n   *\n   * @param textTranslateAnchor value of textTranslateAnchor as Expression\n   */\n  override fun textTranslateAnchor(textTranslateAnchor: Expression): SymbolLayer = apply {\n    val propertyValue = PropertyValue(\"text-translate-anchor\", textTranslateAnchor)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this layer\n   *\n   * @return Type of the layer as [String]\n   */\n  override fun getType(): String {\n    return \"symbol\"\n  }\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    // Default values for layer properties\n    /**\n     * Visibility of the layer.\n     */\n    val defaultVisibility: Visibility?\n      /**\n       * Get the default Visibility property\n       *\n       * @return VISIBILITY\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"visibility\").silentUnwrap<String>()?.let {\n          return Visibility.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMinZoom: Double?\n      /**\n       * Get the minzoom property\n       *\n       * @return minzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"minzoom\").silentUnwrap()\n\n    /**\n     * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     *\n     * Range:\n     *       minimum: 0\n     *       maximum: 24\n     */\n    val defaultMaxZoom: Double?\n      /**\n       * Get the maxzoom property\n       *\n       * @return maxzoom\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n     */\n    val defaultIconAllowOverlap: Boolean?\n      /**\n       * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n       *\n       * Get the default value of IconAllowOverlap property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-allow-overlap\").silentUnwrap()\n      }\n\n    /**\n     * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n     *\n     * This is an Expression representation of \"icon-allow-overlap\".\n     *\n     */\n    val defaultIconAllowOverlapAsExpression: Expression?\n      /**\n       * Get default value of the IconAllowOverlap property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-allow-overlap\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconAllowOverlap?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Part of the icon placed closest to the anchor. Default value: \"center\".\n     */\n    val defaultIconAnchor: IconAnchor?\n      /**\n       * Part of the icon placed closest to the anchor. Default value: \"center\".\n       *\n       * Get the default value of IconAnchor property\n       *\n       * @return IconAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-anchor\").silentUnwrap<String>()?.let {\n          return IconAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Part of the icon placed closest to the anchor. Default value: \"center\".\n     *\n     * This is an Expression representation of \"icon-anchor\".\n     *\n     */\n    val defaultIconAnchorAsExpression: Expression?\n      /**\n       * Get default value of the IconAnchor property as an Expression\n       *\n       * @return IconAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconAnchor?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n     */\n    val defaultIconIgnorePlacement: Boolean?\n      /**\n       * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n       *\n       * Get the default value of IconIgnorePlacement property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-ignore-placement\").silentUnwrap()\n      }\n\n    /**\n     * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n     *\n     * This is an Expression representation of \"icon-ignore-placement\".\n     *\n     */\n    val defaultIconIgnorePlacementAsExpression: Expression?\n      /**\n       * Get default value of the IconIgnorePlacement property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-ignore-placement\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconIgnorePlacement?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Name of image in sprite to use for drawing an image background.\n     */\n    val defaultIconImage: String?\n      /**\n       * Name of image in sprite to use for drawing an image background.\n       *\n       * Get the default value of IconImage property\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image\").silentUnwrap()\n      }\n\n    /**\n     * Name of image in sprite to use for drawing an image background.\n     *\n     * This is an Expression representation of \"icon-image\".\n     *\n     */\n    val defaultIconImageAsExpression: Expression?\n      /**\n       * Get default value of the IconImage property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconImage?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n     */\n    val defaultIconKeepUpright: Boolean?\n      /**\n       * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n       *\n       * Get the default value of IconKeepUpright property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-keep-upright\").silentUnwrap()\n      }\n\n    /**\n     * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n     *\n     * This is an Expression representation of \"icon-keep-upright\".\n     *\n     */\n    val defaultIconKeepUprightAsExpression: Expression?\n      /**\n       * Get default value of the IconKeepUpright property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-keep-upright\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconKeepUpright?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n     */\n    val defaultIconOffset: List<Double>?\n      /**\n       * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n       *\n       * Get the default value of IconOffset property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-offset\").silentUnwrap()\n      }\n\n    /**\n     * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n     *\n     * This is an Expression representation of \"icon-offset\".\n     *\n     */\n    val defaultIconOffsetAsExpression: Expression?\n      /**\n       * Get default value of the IconOffset property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-offset\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconOffset?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n     */\n    val defaultIconOptional: Boolean?\n      /**\n       * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n       *\n       * Get the default value of IconOptional property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-optional\").silentUnwrap()\n      }\n\n    /**\n     * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n     *\n     * This is an Expression representation of \"icon-optional\".\n     *\n     */\n    val defaultIconOptionalAsExpression: Expression?\n      /**\n       * Get default value of the IconOptional property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-optional\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconOptional?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n     */\n    val defaultIconPadding: Double?\n      /**\n       * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n       *\n       * Get the default value of IconPadding property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-padding\").silentUnwrap()\n      }\n\n    /**\n     * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n     *\n     * This is an Expression representation of \"icon-padding\".\n     *\n     */\n    val defaultIconPaddingAsExpression: Expression?\n      /**\n       * Get default value of the IconPadding property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-padding\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconPadding?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Orientation of icon when map is pitched. Default value: \"auto\".\n     */\n    val defaultIconPitchAlignment: IconPitchAlignment?\n      /**\n       * Orientation of icon when map is pitched. Default value: \"auto\".\n       *\n       * Get the default value of IconPitchAlignment property\n       *\n       * @return IconPitchAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-pitch-alignment\").silentUnwrap<String>()?.let {\n          return IconPitchAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Orientation of icon when map is pitched. Default value: \"auto\".\n     *\n     * This is an Expression representation of \"icon-pitch-alignment\".\n     *\n     */\n    val defaultIconPitchAlignmentAsExpression: Expression?\n      /**\n       * Get default value of the IconPitchAlignment property as an Expression\n       *\n       * @return IconPitchAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-pitch-alignment\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconPitchAlignment?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n     */\n    val defaultIconRotate: Double?\n      /**\n       * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n       *\n       * Get the default value of IconRotate property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotate\").silentUnwrap()\n      }\n\n    /**\n     * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n     *\n     * This is an Expression representation of \"icon-rotate\".\n     *\n     */\n    val defaultIconRotateAsExpression: Expression?\n      /**\n       * Get default value of the IconRotate property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconRotate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n     */\n    val defaultIconRotationAlignment: IconRotationAlignment?\n      /**\n       * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n       *\n       * Get the default value of IconRotationAlignment property\n       *\n       * @return IconRotationAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotation-alignment\").silentUnwrap<String>()?.let {\n          return IconRotationAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n     *\n     * This is an Expression representation of \"icon-rotation-alignment\".\n     *\n     */\n    val defaultIconRotationAlignmentAsExpression: Expression?\n      /**\n       * Get default value of the IconRotationAlignment property as an Expression\n       *\n       * @return IconRotationAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotation-alignment\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconRotationAlignment?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n     */\n    val defaultIconSize: Double?\n      /**\n       * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n       *\n       * Get the default value of IconSize property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size\").silentUnwrap()\n      }\n\n    /**\n     * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n     *\n     * This is an Expression representation of \"icon-size\".\n     *\n     */\n    val defaultIconSizeAsExpression: Expression?\n      /**\n       * Get default value of the IconSize property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconSize?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n     */\n    @MapboxExperimental\n    val defaultIconSizeScaleRange: List<Double>?\n      /**\n       * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n       *\n       * Get the default value of IconSizeScaleRange property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size-scale-range\").silentUnwrap()\n      }\n\n    /**\n     * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n     *\n     * This is an Expression representation of \"icon-size-scale-range\".\n     *\n     */\n    @MapboxExperimental\n    val defaultIconSizeScaleRangeAsExpression: Expression?\n      /**\n       * Get default value of the IconSizeScaleRange property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size-scale-range\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconSizeScaleRange?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Scales the icon to fit around the associated text. Default value: \"none\".\n     */\n    val defaultIconTextFit: IconTextFit?\n      /**\n       * Scales the icon to fit around the associated text. Default value: \"none\".\n       *\n       * Get the default value of IconTextFit property\n       *\n       * @return IconTextFit\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit\").silentUnwrap<String>()?.let {\n          return IconTextFit.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Scales the icon to fit around the associated text. Default value: \"none\".\n     *\n     * This is an Expression representation of \"icon-text-fit\".\n     *\n     */\n    val defaultIconTextFitAsExpression: Expression?\n      /**\n       * Get default value of the IconTextFit property as an Expression\n       *\n       * @return IconTextFit\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconTextFit?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n     */\n    val defaultIconTextFitPadding: List<Double>?\n      /**\n       * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n       *\n       * Get the default value of IconTextFitPadding property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit-padding\").silentUnwrap()\n      }\n\n    /**\n     * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n     *\n     * This is an Expression representation of \"icon-text-fit-padding\".\n     *\n     */\n    val defaultIconTextFitPaddingAsExpression: Expression?\n      /**\n       * Get default value of the IconTextFitPadding property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit-padding\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconTextFitPadding?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n     */\n    val defaultSymbolAvoidEdges: Boolean?\n      /**\n       * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n       *\n       * Get the default value of SymbolAvoidEdges property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-avoid-edges\").silentUnwrap()\n      }\n\n    /**\n     * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n     *\n     * This is an Expression representation of \"symbol-avoid-edges\".\n     *\n     */\n    val defaultSymbolAvoidEdgesAsExpression: Expression?\n      /**\n       * Get default value of the SymbolAvoidEdges property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-avoid-edges\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSymbolAvoidEdges?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Selects the base of symbol-elevation. Default value: \"ground\".\n     */\n    @MapboxExperimental\n    val defaultSymbolElevationReference: SymbolElevationReference?\n      /**\n       * Selects the base of symbol-elevation. Default value: \"ground\".\n       *\n       * Get the default value of SymbolElevationReference property\n       *\n       * @return SymbolElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-elevation-reference\").silentUnwrap<String>()?.let {\n          return SymbolElevationReference.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Selects the base of symbol-elevation. Default value: \"ground\".\n     *\n     * This is an Expression representation of \"symbol-elevation-reference\".\n     *\n     */\n    @MapboxExperimental\n    val defaultSymbolElevationReferenceAsExpression: Expression?\n      /**\n       * Get default value of the SymbolElevationReference property as an Expression\n       *\n       * @return SymbolElevationReference\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-elevation-reference\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSymbolElevationReference?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Label placement relative to its geometry. Default value: \"point\".\n     */\n    val defaultSymbolPlacement: SymbolPlacement?\n      /**\n       * Label placement relative to its geometry. Default value: \"point\".\n       *\n       * Get the default value of SymbolPlacement property\n       *\n       * @return SymbolPlacement\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-placement\").silentUnwrap<String>()?.let {\n          return SymbolPlacement.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Label placement relative to its geometry. Default value: \"point\".\n     *\n     * This is an Expression representation of \"symbol-placement\".\n     *\n     */\n    val defaultSymbolPlacementAsExpression: Expression?\n      /**\n       * Get default value of the SymbolPlacement property as an Expression\n       *\n       * @return SymbolPlacement\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-placement\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSymbolPlacement?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n     */\n    val defaultSymbolSortKey: Double?\n      /**\n       * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n       *\n       * Get the default value of SymbolSortKey property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-sort-key\").silentUnwrap()\n      }\n\n    /**\n     * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n     *\n     * This is an Expression representation of \"symbol-sort-key\".\n     *\n     */\n    val defaultSymbolSortKeyAsExpression: Expression?\n      /**\n       * Get default value of the SymbolSortKey property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-sort-key\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSymbolSortKey?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n     */\n    val defaultSymbolSpacing: Double?\n      /**\n       * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n       *\n       * Get the default value of SymbolSpacing property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-spacing\").silentUnwrap()\n      }\n\n    /**\n     * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n     *\n     * This is an Expression representation of \"symbol-spacing\".\n     *\n     */\n    val defaultSymbolSpacingAsExpression: Expression?\n      /**\n       * Get default value of the SymbolSpacing property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-spacing\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSymbolSpacing?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n     */\n    val defaultSymbolZElevate: Boolean?\n      /**\n       * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n       *\n       * Get the default value of SymbolZElevate property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-elevate\").silentUnwrap()\n      }\n\n    /**\n     * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n     *\n     * This is an Expression representation of \"symbol-z-elevate\".\n     *\n     */\n    val defaultSymbolZElevateAsExpression: Expression?\n      /**\n       * Get default value of the SymbolZElevate property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-elevate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSymbolZElevate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n     */\n    val defaultSymbolZOrder: SymbolZOrder?\n      /**\n       * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n       *\n       * Get the default value of SymbolZOrder property\n       *\n       * @return SymbolZOrder\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-order\").silentUnwrap<String>()?.let {\n          return SymbolZOrder.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n     *\n     * This is an Expression representation of \"symbol-z-order\".\n     *\n     */\n    val defaultSymbolZOrderAsExpression: Expression?\n      /**\n       * Get default value of the SymbolZOrder property as an Expression\n       *\n       * @return SymbolZOrder\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-order\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSymbolZOrder?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n     */\n    val defaultTextAllowOverlap: Boolean?\n      /**\n       * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n       *\n       * Get the default value of TextAllowOverlap property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-allow-overlap\").silentUnwrap()\n      }\n\n    /**\n     * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n     *\n     * This is an Expression representation of \"text-allow-overlap\".\n     *\n     */\n    val defaultTextAllowOverlapAsExpression: Expression?\n      /**\n       * Get default value of the TextAllowOverlap property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-allow-overlap\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextAllowOverlap?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Part of the text placed closest to the anchor. Default value: \"center\".\n     */\n    val defaultTextAnchor: TextAnchor?\n      /**\n       * Part of the text placed closest to the anchor. Default value: \"center\".\n       *\n       * Get the default value of TextAnchor property\n       *\n       * @return TextAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-anchor\").silentUnwrap<String>()?.let {\n          return TextAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Part of the text placed closest to the anchor. Default value: \"center\".\n     *\n     * This is an Expression representation of \"text-anchor\".\n     *\n     */\n    val defaultTextAnchorAsExpression: Expression?\n      /**\n       * Get default value of the TextAnchor property as an Expression\n       *\n       * @return TextAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextAnchor?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n     */\n    val defaultTextField: Formatted?\n      /**\n       * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n       *\n       * Get the default value of TextField property\n       *\n       * @return Formatted\n       */\n      get() {\n        defaultTextFieldAsExpression?.let {\n          return Formatted.fromExpression(it)\n        }\n        return null\n      }\n\n    /**\n     * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n     *\n     * This is an Expression representation of \"text-field\".\n     *\n     */\n    val defaultTextFieldAsExpression: Expression?\n      /**\n       * Get default value of the TextField property as an Expression\n       *\n       * @return Formatted\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-field\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n     */\n    val defaultTextFieldAsString: String?\n      /**\n       * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n       *\n       * Get the TextField property\n       *\n       * @return value of textField\n       */\n      get() {\n        defaultTextField?.let {\n          return it.getTextAsString()\n        }\n        return null\n      }\n\n    /**\n     * Font stack to use for displaying text.\n     */\n    val defaultTextFont: List<String>?\n      /**\n       * Font stack to use for displaying text.\n       *\n       * Get the default value of TextFont property\n       *\n       * @return List<String>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-font\").silentUnwrap()\n      }\n\n    /**\n     * Font stack to use for displaying text.\n     *\n     * This is an Expression representation of \"text-font\".\n     *\n     */\n    val defaultTextFontAsExpression: Expression?\n      /**\n       * Get default value of the TextFont property as an Expression\n       *\n       * @return List<String>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-font\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextFont?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * If true, other symbols can be visible even if they collide with the text. Default value: false.\n     */\n    val defaultTextIgnorePlacement: Boolean?\n      /**\n       * If true, other symbols can be visible even if they collide with the text. Default value: false.\n       *\n       * Get the default value of TextIgnorePlacement property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-ignore-placement\").silentUnwrap()\n      }\n\n    /**\n     * If true, other symbols can be visible even if they collide with the text. Default value: false.\n     *\n     * This is an Expression representation of \"text-ignore-placement\".\n     *\n     */\n    val defaultTextIgnorePlacementAsExpression: Expression?\n      /**\n       * Get default value of the TextIgnorePlacement property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-ignore-placement\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextIgnorePlacement?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Text justification options. Default value: \"center\".\n     */\n    val defaultTextJustify: TextJustify?\n      /**\n       * Text justification options. Default value: \"center\".\n       *\n       * Get the default value of TextJustify property\n       *\n       * @return TextJustify\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-justify\").silentUnwrap<String>()?.let {\n          return TextJustify.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Text justification options. Default value: \"center\".\n     *\n     * This is an Expression representation of \"text-justify\".\n     *\n     */\n    val defaultTextJustifyAsExpression: Expression?\n      /**\n       * Get default value of the TextJustify property as an Expression\n       *\n       * @return TextJustify\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-justify\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextJustify?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n     */\n    val defaultTextKeepUpright: Boolean?\n      /**\n       * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n       *\n       * Get the default value of TextKeepUpright property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-keep-upright\").silentUnwrap()\n      }\n\n    /**\n     * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n     *\n     * This is an Expression representation of \"text-keep-upright\".\n     *\n     */\n    val defaultTextKeepUprightAsExpression: Expression?\n      /**\n       * Get default value of the TextKeepUpright property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-keep-upright\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextKeepUpright?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n     */\n    val defaultTextLetterSpacing: Double?\n      /**\n       * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n       *\n       * Get the default value of TextLetterSpacing property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-letter-spacing\").silentUnwrap()\n      }\n\n    /**\n     * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n     *\n     * This is an Expression representation of \"text-letter-spacing\".\n     *\n     */\n    val defaultTextLetterSpacingAsExpression: Expression?\n      /**\n       * Get default value of the TextLetterSpacing property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-letter-spacing\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextLetterSpacing?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n     */\n    val defaultTextLineHeight: Double?\n      /**\n       * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n       *\n       * Get the default value of TextLineHeight property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-line-height\").silentUnwrap()\n      }\n\n    /**\n     * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n     *\n     * This is an Expression representation of \"text-line-height\".\n     *\n     */\n    val defaultTextLineHeightAsExpression: Expression?\n      /**\n       * Get default value of the TextLineHeight property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-line-height\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextLineHeight?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n     */\n    val defaultTextMaxAngle: Double?\n      /**\n       * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n       *\n       * Get the default value of TextMaxAngle property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-angle\").silentUnwrap()\n      }\n\n    /**\n     * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n     *\n     * This is an Expression representation of \"text-max-angle\".\n     *\n     */\n    val defaultTextMaxAngleAsExpression: Expression?\n      /**\n       * Get default value of the TextMaxAngle property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-angle\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextMaxAngle?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n     */\n    val defaultTextMaxWidth: Double?\n      /**\n       * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n       *\n       * Get the default value of TextMaxWidth property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-width\").silentUnwrap()\n      }\n\n    /**\n     * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n     *\n     * This is an Expression representation of \"text-max-width\".\n     *\n     */\n    val defaultTextMaxWidthAsExpression: Expression?\n      /**\n       * Get default value of the TextMaxWidth property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-width\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextMaxWidth?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n     */\n    val defaultTextOffset: List<Double>?\n      /**\n       * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n       *\n       * Get the default value of TextOffset property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-offset\").silentUnwrap()\n      }\n\n    /**\n     * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n     *\n     * This is an Expression representation of \"text-offset\".\n     *\n     */\n    val defaultTextOffsetAsExpression: Expression?\n      /**\n       * Get default value of the TextOffset property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-offset\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextOffset?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n     */\n    val defaultTextOptional: Boolean?\n      /**\n       * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n       *\n       * Get the default value of TextOptional property\n       *\n       * @return Boolean\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-optional\").silentUnwrap()\n      }\n\n    /**\n     * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n     *\n     * This is an Expression representation of \"text-optional\".\n     *\n     */\n    val defaultTextOptionalAsExpression: Expression?\n      /**\n       * Get default value of the TextOptional property as an Expression\n       *\n       * @return Boolean\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-optional\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextOptional?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n     */\n    val defaultTextPadding: Double?\n      /**\n       * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n       *\n       * Get the default value of TextPadding property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-padding\").silentUnwrap()\n      }\n\n    /**\n     * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n     *\n     * This is an Expression representation of \"text-padding\".\n     *\n     */\n    val defaultTextPaddingAsExpression: Expression?\n      /**\n       * Get default value of the TextPadding property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-padding\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextPadding?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Orientation of text when map is pitched. Default value: \"auto\".\n     */\n    val defaultTextPitchAlignment: TextPitchAlignment?\n      /**\n       * Orientation of text when map is pitched. Default value: \"auto\".\n       *\n       * Get the default value of TextPitchAlignment property\n       *\n       * @return TextPitchAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-pitch-alignment\").silentUnwrap<String>()?.let {\n          return TextPitchAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Orientation of text when map is pitched. Default value: \"auto\".\n     *\n     * This is an Expression representation of \"text-pitch-alignment\".\n     *\n     */\n    val defaultTextPitchAlignmentAsExpression: Expression?\n      /**\n       * Get default value of the TextPitchAlignment property as an Expression\n       *\n       * @return TextPitchAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-pitch-alignment\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextPitchAlignment?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n     */\n    val defaultTextRadialOffset: Double?\n      /**\n       * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n       *\n       * Get the default value of TextRadialOffset property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-radial-offset\").silentUnwrap()\n      }\n\n    /**\n     * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n     *\n     * This is an Expression representation of \"text-radial-offset\".\n     *\n     */\n    val defaultTextRadialOffsetAsExpression: Expression?\n      /**\n       * Get default value of the TextRadialOffset property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-radial-offset\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextRadialOffset?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n     */\n    val defaultTextRotate: Double?\n      /**\n       * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n       *\n       * Get the default value of TextRotate property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotate\").silentUnwrap()\n      }\n\n    /**\n     * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n     *\n     * This is an Expression representation of \"text-rotate\".\n     *\n     */\n    val defaultTextRotateAsExpression: Expression?\n      /**\n       * Get default value of the TextRotate property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextRotate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n     */\n    val defaultTextRotationAlignment: TextRotationAlignment?\n      /**\n       * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n       *\n       * Get the default value of TextRotationAlignment property\n       *\n       * @return TextRotationAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotation-alignment\").silentUnwrap<String>()?.let {\n          return TextRotationAlignment.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n     *\n     * This is an Expression representation of \"text-rotation-alignment\".\n     *\n     */\n    val defaultTextRotationAlignmentAsExpression: Expression?\n      /**\n       * Get default value of the TextRotationAlignment property as an Expression\n       *\n       * @return TextRotationAlignment\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotation-alignment\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextRotationAlignment?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n     */\n    val defaultTextSize: Double?\n      /**\n       * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n       *\n       * Get the default value of TextSize property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size\").silentUnwrap()\n      }\n\n    /**\n     * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n     *\n     * This is an Expression representation of \"text-size\".\n     *\n     */\n    val defaultTextSizeAsExpression: Expression?\n      /**\n       * Get default value of the TextSize property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextSize?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n     */\n    @MapboxExperimental\n    val defaultTextSizeScaleRange: List<Double>?\n      /**\n       * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n       *\n       * Get the default value of TextSizeScaleRange property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size-scale-range\").silentUnwrap()\n      }\n\n    /**\n     * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n     *\n     * This is an Expression representation of \"text-size-scale-range\".\n     *\n     */\n    @MapboxExperimental\n    val defaultTextSizeScaleRangeAsExpression: Expression?\n      /**\n       * Get default value of the TextSizeScaleRange property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size-scale-range\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextSizeScaleRange?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n     */\n    val defaultTextTransform: TextTransform?\n      /**\n       * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n       *\n       * Get the default value of TextTransform property\n       *\n       * @return TextTransform\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-transform\").silentUnwrap<String>()?.let {\n          return TextTransform.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n     *\n     * This is an Expression representation of \"text-transform\".\n     *\n     */\n    val defaultTextTransformAsExpression: Expression?\n      /**\n       * Get default value of the TextTransform property as an Expression\n       *\n       * @return TextTransform\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-transform\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextTransform?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n     */\n    val defaultTextVariableAnchor: List<String>?\n      /**\n       * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n       *\n       * Get the default value of TextVariableAnchor property\n       *\n       * @return List<String>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-variable-anchor\").silentUnwrap()\n      }\n\n    /**\n     * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n     *\n     * This is an Expression representation of \"text-variable-anchor\".\n     *\n     */\n    val defaultTextVariableAnchorAsExpression: Expression?\n      /**\n       * Get default value of the TextVariableAnchor property as an Expression\n       *\n       * @return List<String>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-variable-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextVariableAnchor?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n     */\n    val defaultTextWritingMode: List<String>?\n      /**\n       * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n       *\n       * Get the default value of TextWritingMode property\n       *\n       * @return List<String>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-writing-mode\").silentUnwrap()\n      }\n\n    /**\n     * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n     *\n     * This is an Expression representation of \"text-writing-mode\".\n     *\n     */\n    val defaultTextWritingModeAsExpression: Expression?\n      /**\n       * Get default value of the TextWritingMode property as an Expression\n       *\n       * @return List<String>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-writing-mode\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextWritingMode?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n     */\n    val defaultIconColor: String?\n      /**\n       * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n       *\n       * Get the default value of IconColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultIconColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"icon-color\".\n     *\n     */\n    val defaultIconColorAsExpression: Expression?\n      /**\n       * Get default value of the IconColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n     */\n    val defaultIconColorAsColorInt: Int?\n      /**\n       * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n       *\n       * Get the default value of IconColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultIconColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconColor.\n     */\n    val defaultIconColorTransition: StyleTransition?\n      /**\n       * Get the IconColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [iconColor].\n     */\n    @MapboxExperimental\n    val defaultIconColorUseTheme: String?\n      /**\n       * Get default value of the IconColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [iconColor].\n     */\n    @MapboxExperimental\n    val defaultIconColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the IconColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultIconColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n     */\n    val defaultIconColorBrightnessMax: Double?\n      /**\n       * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of IconColorBrightnessMax property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-max\").silentUnwrap()\n      }\n\n    /**\n     * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"icon-color-brightness-max\".\n     *\n     */\n    val defaultIconColorBrightnessMaxAsExpression: Expression?\n      /**\n       * Get default value of the IconColorBrightnessMax property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-max\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconColorBrightnessMax?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n     */\n    val defaultIconColorBrightnessMin: Double?\n      /**\n       * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of IconColorBrightnessMin property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-min\").silentUnwrap()\n      }\n\n    /**\n     * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"icon-color-brightness-min\".\n     *\n     */\n    val defaultIconColorBrightnessMinAsExpression: Expression?\n      /**\n       * Get default value of the IconColorBrightnessMin property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-min\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconColorBrightnessMin?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n     */\n    val defaultIconColorContrast: Double?\n      /**\n       * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n       *\n       * Get the default value of IconColorContrast property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-contrast\").silentUnwrap()\n      }\n\n    /**\n     * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n     *\n     * This is an Expression representation of \"icon-color-contrast\".\n     *\n     */\n    val defaultIconColorContrastAsExpression: Expression?\n      /**\n       * Get default value of the IconColorContrast property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-contrast\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconColorContrast?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n     */\n    val defaultIconColorSaturation: Double?\n      /**\n       * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n       *\n       * Get the default value of IconColorSaturation property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-saturation\").silentUnwrap()\n      }\n\n    /**\n     * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n     *\n     * This is an Expression representation of \"icon-color-saturation\".\n     *\n     */\n    val defaultIconColorSaturationAsExpression: Expression?\n      /**\n       * Get default value of the IconColorSaturation property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-saturation\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconColorSaturation?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconColorSaturation.\n     */\n    val defaultIconColorSaturationTransition: StyleTransition?\n      /**\n       * Get the IconColorSaturation property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-saturation-transition\").silentUnwrap()\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n     */\n    val defaultIconEmissiveStrength: Double?\n      /**\n       * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n       *\n       * Get the default value of IconEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n     *\n     * This is an Expression representation of \"icon-emissive-strength\".\n     *\n     */\n    val defaultIconEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the IconEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconEmissiveStrength.\n     */\n    val defaultIconEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the IconEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n     */\n    val defaultIconHaloBlur: Double?\n      /**\n       * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n       *\n       * Get the default value of IconHaloBlur property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-blur\").silentUnwrap()\n      }\n\n    /**\n     * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n     *\n     * This is an Expression representation of \"icon-halo-blur\".\n     *\n     */\n    val defaultIconHaloBlurAsExpression: Expression?\n      /**\n       * Get default value of the IconHaloBlur property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-blur\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconHaloBlur?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconHaloBlur.\n     */\n    val defaultIconHaloBlurTransition: StyleTransition?\n      /**\n       * Get the IconHaloBlur property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-blur-transition\").silentUnwrap()\n\n    /**\n     * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n     */\n    val defaultIconHaloColor: String?\n      /**\n       * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n       *\n       * Get the default value of IconHaloColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultIconHaloColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * This is an Expression representation of \"icon-halo-color\".\n     *\n     */\n    val defaultIconHaloColorAsExpression: Expression?\n      /**\n       * Get default value of the IconHaloColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n     */\n    val defaultIconHaloColorAsColorInt: Int?\n      /**\n       * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n       *\n       * Get the default value of IconHaloColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultIconHaloColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconHaloColor.\n     */\n    val defaultIconHaloColorTransition: StyleTransition?\n      /**\n       * Get the IconHaloColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [iconHaloColor].\n     */\n    @MapboxExperimental\n    val defaultIconHaloColorUseTheme: String?\n      /**\n       * Get default value of the IconHaloColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [iconHaloColor].\n     */\n    @MapboxExperimental\n    val defaultIconHaloColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the IconHaloColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultIconHaloColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n     */\n    val defaultIconHaloWidth: Double?\n      /**\n       * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n       *\n       * Get the default value of IconHaloWidth property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-width\").silentUnwrap()\n      }\n\n    /**\n     * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n     *\n     * This is an Expression representation of \"icon-halo-width\".\n     *\n     */\n    val defaultIconHaloWidthAsExpression: Expression?\n      /**\n       * Get default value of the IconHaloWidth property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-width\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconHaloWidth?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconHaloWidth.\n     */\n    val defaultIconHaloWidthTransition: StyleTransition?\n      /**\n       * Get the IconHaloWidth property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-width-transition\").silentUnwrap()\n\n    /**\n     * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     */\n    val defaultIconImageCrossFade: Double?\n      /**\n       * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of IconImageCrossFade property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image-cross-fade\").silentUnwrap()\n      }\n\n    /**\n     * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"icon-image-cross-fade\".\n     *\n     */\n    val defaultIconImageCrossFadeAsExpression: Expression?\n      /**\n       * Get default value of the IconImageCrossFade property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image-cross-fade\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconImageCrossFade?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconImageCrossFade.\n     */\n    val defaultIconImageCrossFadeTransition: StyleTransition?\n      /**\n       * Get the IconImageCrossFade property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image-cross-fade-transition\").silentUnwrap()\n\n    /**\n     * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n     */\n    val defaultIconOcclusionOpacity: Double?\n      /**\n       * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of IconOcclusionOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-occlusion-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"icon-occlusion-opacity\".\n     *\n     */\n    val defaultIconOcclusionOpacityAsExpression: Expression?\n      /**\n       * Get default value of the IconOcclusionOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-occlusion-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconOcclusionOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconOcclusionOpacity.\n     */\n    val defaultIconOcclusionOpacityTransition: StyleTransition?\n      /**\n       * Get the IconOcclusionOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-occlusion-opacity-transition\").silentUnwrap()\n\n    /**\n     * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n     */\n    val defaultIconOpacity: Double?\n      /**\n       * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of IconOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"icon-opacity\".\n     *\n     */\n    val defaultIconOpacityAsExpression: Expression?\n      /**\n       * Get default value of the IconOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconOpacity.\n     */\n    val defaultIconOpacityTransition: StyleTransition?\n      /**\n       * Get the IconOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-opacity-transition\").silentUnwrap()\n\n    /**\n     * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n     */\n    val defaultIconTranslate: List<Double>?\n      /**\n       * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n       *\n       * Get the default value of IconTranslate property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate\").silentUnwrap()\n      }\n\n    /**\n     * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n     *\n     * This is an Expression representation of \"icon-translate\".\n     *\n     */\n    val defaultIconTranslateAsExpression: Expression?\n      /**\n       * Get default value of the IconTranslate property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconTranslate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for IconTranslate.\n     */\n    val defaultIconTranslateTransition: StyleTransition?\n      /**\n       * Get the IconTranslate property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate-transition\").silentUnwrap()\n\n    /**\n     * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n     */\n    val defaultIconTranslateAnchor: IconTranslateAnchor?\n      /**\n       * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n       *\n       * Get the default value of IconTranslateAnchor property\n       *\n       * @return IconTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate-anchor\").silentUnwrap<String>()?.let {\n          return IconTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n     *\n     * This is an Expression representation of \"icon-translate-anchor\".\n     *\n     */\n    val defaultIconTranslateAnchorAsExpression: Expression?\n      /**\n       * Get default value of the IconTranslateAnchor property as an Expression\n       *\n       * @return IconTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultIconTranslateAnchor?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n     */\n    val defaultOcclusionOpacityMode: OcclusionOpacityMode?\n      /**\n       * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n       *\n       * Get the default value of OcclusionOpacityMode property\n       *\n       * @return OcclusionOpacityMode\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"occlusion-opacity-mode\").silentUnwrap<String>()?.let {\n          return OcclusionOpacityMode.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n     *\n     * This is an Expression representation of \"occlusion-opacity-mode\".\n     *\n     */\n    val defaultOcclusionOpacityModeAsExpression: Expression?\n      /**\n       * Get default value of the OcclusionOpacityMode property as an Expression\n       *\n       * @return OcclusionOpacityMode\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"occlusion-opacity-mode\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultOcclusionOpacityMode?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n\n    /**\n     * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n     */\n    @MapboxExperimental\n    val defaultSymbolZOffset: Double?\n      /**\n       * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n       *\n       * Get the default value of SymbolZOffset property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-offset\").silentUnwrap()\n      }\n\n    /**\n     * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n     *\n     * This is an Expression representation of \"symbol-z-offset\".\n     *\n     */\n    @MapboxExperimental\n    val defaultSymbolZOffsetAsExpression: Expression?\n      /**\n       * Get default value of the SymbolZOffset property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-offset\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultSymbolZOffset?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for SymbolZOffset.\n     */\n    @MapboxExperimental\n    val defaultSymbolZOffsetTransition: StyleTransition?\n      /**\n       * Get the SymbolZOffset property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-offset-transition\").silentUnwrap()\n\n    /**\n     * The color with which the text will be drawn. Default value: \"#000000\".\n     */\n    val defaultTextColor: String?\n      /**\n       * The color with which the text will be drawn. Default value: \"#000000\".\n       *\n       * Get the default value of TextColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultTextColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color with which the text will be drawn. Default value: \"#000000\".\n     *\n     * This is an Expression representation of \"text-color\".\n     *\n     */\n    val defaultTextColorAsExpression: Expression?\n      /**\n       * Get default value of the TextColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color with which the text will be drawn. Default value: \"#000000\".\n     */\n    val defaultTextColorAsColorInt: Int?\n      /**\n       * The color with which the text will be drawn. Default value: \"#000000\".\n       *\n       * Get the default value of TextColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultTextColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for TextColor.\n     */\n    val defaultTextColorTransition: StyleTransition?\n      /**\n       * Get the TextColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [textColor].\n     */\n    @MapboxExperimental\n    val defaultTextColorUseTheme: String?\n      /**\n       * Get default value of the TextColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [textColor].\n     */\n    @MapboxExperimental\n    val defaultTextColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the TextColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultTextColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n     */\n    val defaultTextEmissiveStrength: Double?\n      /**\n       * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n       *\n       * Get the default value of TextEmissiveStrength property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-emissive-strength\").silentUnwrap()\n      }\n\n    /**\n     * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n     *\n     * This is an Expression representation of \"text-emissive-strength\".\n     *\n     */\n    val defaultTextEmissiveStrengthAsExpression: Expression?\n      /**\n       * Get default value of the TextEmissiveStrength property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-emissive-strength\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextEmissiveStrength?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for TextEmissiveStrength.\n     */\n    val defaultTextEmissiveStrengthTransition: StyleTransition?\n      /**\n       * Get the TextEmissiveStrength property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-emissive-strength-transition\").silentUnwrap()\n\n    /**\n     * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n     */\n    val defaultTextHaloBlur: Double?\n      /**\n       * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n       *\n       * Get the default value of TextHaloBlur property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-blur\").silentUnwrap()\n      }\n\n    /**\n     * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n     *\n     * This is an Expression representation of \"text-halo-blur\".\n     *\n     */\n    val defaultTextHaloBlurAsExpression: Expression?\n      /**\n       * Get default value of the TextHaloBlur property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-blur\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextHaloBlur?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for TextHaloBlur.\n     */\n    val defaultTextHaloBlurTransition: StyleTransition?\n      /**\n       * Get the TextHaloBlur property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-blur-transition\").silentUnwrap()\n\n    /**\n     * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n     */\n    val defaultTextHaloColor: String?\n      /**\n       * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n       *\n       * Get the default value of TextHaloColor property\n       *\n       * @return String\n       */\n      get() {\n        defaultTextHaloColorAsExpression?.let {\n          return rgbaExpressionToColorString(it)\n        }\n        return null\n      }\n\n    /**\n     * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n     *\n     * This is an Expression representation of \"text-halo-color\".\n     *\n     */\n    val defaultTextHaloColorAsExpression: Expression?\n      /**\n       * Get default value of the TextHaloColor property as an Expression\n       *\n       * @return String\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        return null\n      }\n\n    /**\n     * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n     */\n    val defaultTextHaloColorAsColorInt: Int?\n      /**\n       * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n       *\n       * Get the default value of TextHaloColor property as color int.\n       *\n       * @return int representation of a rgba string color\n       */\n      @ColorInt\n      get() {\n        defaultTextHaloColorAsExpression?.let {\n          return rgbaExpressionToColorInt(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for TextHaloColor.\n     */\n    val defaultTextHaloColorTransition: StyleTransition?\n      /**\n       * Get the TextHaloColor property transition options\n       *\n       * @return transition options for String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color-transition\").silentUnwrap()\n\n    /**\n     * Default color theme for [textHaloColor].\n     */\n    @MapboxExperimental\n    val defaultTextHaloColorUseTheme: String?\n      /**\n       * Get default value of the TextHaloColor property as String\n       *\n       * @return String\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color-use-theme\").silentUnwrap()\n\n    /**\n     * Default color theme for [textHaloColor].\n     */\n    @MapboxExperimental\n    val defaultTextHaloColorUseThemeAsExpression: Expression?\n      /**\n       * Get default value of the TextHaloColor property as Expression\n       *\n       * @return String\n       */\n      get() {\n        return StyleManager\n          .getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color-use-theme\")\n          .silentUnwrap<Expression>() ?: defaultTextHaloColorUseTheme?.let { Expression.literal(it) }\n      }\n\n    /**\n     * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n     */\n    val defaultTextHaloWidth: Double?\n      /**\n       * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n       *\n       * Get the default value of TextHaloWidth property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-width\").silentUnwrap()\n      }\n\n    /**\n     * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n     *\n     * This is an Expression representation of \"text-halo-width\".\n     *\n     */\n    val defaultTextHaloWidthAsExpression: Expression?\n      /**\n       * Get default value of the TextHaloWidth property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-width\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextHaloWidth?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for TextHaloWidth.\n     */\n    val defaultTextHaloWidthTransition: StyleTransition?\n      /**\n       * Get the TextHaloWidth property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-width-transition\").silentUnwrap()\n\n    /**\n     * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n     */\n    val defaultTextOcclusionOpacity: Double?\n      /**\n       * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n       *\n       * Get the default value of TextOcclusionOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-occlusion-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"text-occlusion-opacity\".\n     *\n     */\n    val defaultTextOcclusionOpacityAsExpression: Expression?\n      /**\n       * Get default value of the TextOcclusionOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-occlusion-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextOcclusionOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for TextOcclusionOpacity.\n     */\n    val defaultTextOcclusionOpacityTransition: StyleTransition?\n      /**\n       * Get the TextOcclusionOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-occlusion-opacity-transition\").silentUnwrap()\n\n    /**\n     * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n     */\n    val defaultTextOpacity: Double?\n      /**\n       * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n       *\n       * Get the default value of TextOpacity property\n       *\n       * @return Double\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-opacity\").silentUnwrap()\n      }\n\n    /**\n     * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n     *\n     * This is an Expression representation of \"text-opacity\".\n     *\n     */\n    val defaultTextOpacityAsExpression: Expression?\n      /**\n       * Get default value of the TextOpacity property as an Expression\n       *\n       * @return Double\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-opacity\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextOpacity?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for TextOpacity.\n     */\n    val defaultTextOpacityTransition: StyleTransition?\n      /**\n       * Get the TextOpacity property transition options\n       *\n       * @return transition options for Double\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-opacity-transition\").silentUnwrap()\n\n    /**\n     * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n     */\n    val defaultTextTranslate: List<Double>?\n      /**\n       * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n       *\n       * Get the default value of TextTranslate property\n       *\n       * @return List<Double>\n       */\n      get() {\n        return StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate\").silentUnwrap()\n      }\n\n    /**\n     * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n     *\n     * This is an Expression representation of \"text-translate\".\n     *\n     */\n    val defaultTextTranslateAsExpression: Expression?\n      /**\n       * Get default value of the TextTranslate property as an Expression\n       *\n       * @return List<Double>\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextTranslate?.let {\n          return Expression.literal(it)\n        }\n        return null\n      }\n\n    /**\n     * Transition options for TextTranslate.\n     */\n    val defaultTextTranslateTransition: StyleTransition?\n      /**\n       * Get the TextTranslate property transition options\n       *\n       * @return transition options for List<Double>\n       */\n      get() = StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate-transition\").silentUnwrap()\n\n    /**\n     * Controls the frame of reference for `text-translate`. Default value: \"map\".\n     */\n    val defaultTextTranslateAnchor: TextTranslateAnchor?\n      /**\n       * Controls the frame of reference for `text-translate`. Default value: \"map\".\n       *\n       * Get the default value of TextTranslateAnchor property\n       *\n       * @return TextTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate-anchor\").silentUnwrap<String>()?.let {\n          return TextTranslateAnchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Controls the frame of reference for `text-translate`. Default value: \"map\".\n     *\n     * This is an Expression representation of \"text-translate-anchor\".\n     *\n     */\n    val defaultTextTranslateAnchorAsExpression: Expression?\n      /**\n       * Get default value of the TextTranslateAnchor property as an Expression\n       *\n       * @return TextTranslateAnchor\n       */\n      get() {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate-anchor\").silentUnwrap<Expression>()?.let {\n          return it\n        }\n        defaultTextTranslateAnchor?.let {\n          return Expression.literal(it.value)\n        }\n        return null\n      }\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LayersDsl\ninterface SymbolLayerDsl {\n  /**\n   * A source layer is an individual layer of data within a vector source.\n   * A vector source can have multiple source layers.\n   *\n   * @param sourceLayer value of sourceLayer\n   */\n  fun sourceLayer(sourceLayer: String): SymbolLayer\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists,\n   * it will be placed at that position in the layer order.\n   *\n   * @param slot value of slot. Setting it to empty string removes the slot.\n   */\n  fun slot(slot: String): SymbolLayer\n\n  /**\n   * A filter is a property at the layer level that determines which features should be rendered in a style layer.\n   *\n   * Filters are written as expressions, which give you fine-grained control over which features to include: the\n   * style layer only displays the features that match the filter condition that you define.\n   *\n   * Note: Zoom expressions in filters are only evaluated at integer zoom levels. The `feature-state` expression\n   * is not supported in filter expressions.\n   *\n   * @param filter the expression filter to set\n   */\n  fun filter(filter: Expression): SymbolLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility\n   */\n  fun visibility(visibility: Visibility): SymbolLayer\n\n  /**\n   * Whether this layer is displayed.\n   *\n   * @param visibility value of Visibility as Expression\n   */\n  fun visibility(visibility: Expression): SymbolLayer\n\n  /**\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param minZoom value of minzoom\n   */\n  fun minZoom(minZoom: Double): SymbolLayer\n\n  /**\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n   *\n   * Range:\n   *       minimum: 0\n   *       maximum: 24\n   *\n   * @param maxZoom value of maxzoom\n   */\n  fun maxZoom(maxZoom: Double): SymbolLayer\n\n  // Property getters and setters\n\n  /**\n   * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * @param iconAllowOverlap value of iconAllowOverlap\n   */\n  fun iconAllowOverlap(iconAllowOverlap: Boolean = false): SymbolLayer\n\n  /**\n   * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * @param iconAllowOverlap value of iconAllowOverlap as Expression\n   */\n  fun iconAllowOverlap(iconAllowOverlap: Expression): SymbolLayer\n\n  /**\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   *\n   * @param iconAnchor value of iconAnchor\n   */\n  fun iconAnchor(iconAnchor: IconAnchor = IconAnchor.CENTER): SymbolLayer\n\n  /**\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   *\n   * @param iconAnchor value of iconAnchor as Expression\n   */\n  fun iconAnchor(iconAnchor: Expression): SymbolLayer\n\n  /**\n   * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n   *\n   * @param iconIgnorePlacement value of iconIgnorePlacement\n   */\n  fun iconIgnorePlacement(iconIgnorePlacement: Boolean = false): SymbolLayer\n\n  /**\n   * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n   *\n   * @param iconIgnorePlacement value of iconIgnorePlacement as Expression\n   */\n  fun iconIgnorePlacement(iconIgnorePlacement: Expression): SymbolLayer\n\n  /**\n   * Name of image in sprite to use for drawing an image background.\n   *\n   * @param iconImage value of iconImage\n   */\n  fun iconImage(iconImage: String): SymbolLayer\n\n  /**\n   * Name of image in sprite to use for drawing an image background.\n   *\n   * @param iconImage value of iconImage as Expression\n   */\n  fun iconImage(iconImage: Expression): SymbolLayer\n\n  /**\n   * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n   *\n   * @param iconKeepUpright value of iconKeepUpright\n   */\n  fun iconKeepUpright(iconKeepUpright: Boolean = false): SymbolLayer\n\n  /**\n   * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n   *\n   * @param iconKeepUpright value of iconKeepUpright as Expression\n   */\n  fun iconKeepUpright(iconKeepUpright: Expression): SymbolLayer\n\n  /**\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   *\n   * @param iconOffset value of iconOffset\n   */\n  fun iconOffset(iconOffset: List<Double> = listOf(0.0, 0.0)): SymbolLayer\n\n  /**\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   *\n   * @param iconOffset value of iconOffset as Expression\n   */\n  fun iconOffset(iconOffset: Expression): SymbolLayer\n\n  /**\n   * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n   *\n   * @param iconOptional value of iconOptional\n   */\n  fun iconOptional(iconOptional: Boolean = false): SymbolLayer\n\n  /**\n   * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n   *\n   * @param iconOptional value of iconOptional as Expression\n   */\n  fun iconOptional(iconOptional: Expression): SymbolLayer\n\n  /**\n   * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n   *\n   * @param iconPadding value of iconPadding\n   */\n  fun iconPadding(iconPadding: Double = 2.0): SymbolLayer\n\n  /**\n   * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n   *\n   * @param iconPadding value of iconPadding as Expression\n   */\n  fun iconPadding(iconPadding: Expression): SymbolLayer\n\n  /**\n   * Orientation of icon when map is pitched. Default value: \"auto\".\n   *\n   * @param iconPitchAlignment value of iconPitchAlignment\n   */\n  fun iconPitchAlignment(iconPitchAlignment: IconPitchAlignment = IconPitchAlignment.AUTO): SymbolLayer\n\n  /**\n   * Orientation of icon when map is pitched. Default value: \"auto\".\n   *\n   * @param iconPitchAlignment value of iconPitchAlignment as Expression\n   */\n  fun iconPitchAlignment(iconPitchAlignment: Expression): SymbolLayer\n\n  /**\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   *\n   * @param iconRotate value of iconRotate\n   */\n  fun iconRotate(iconRotate: Double = 0.0): SymbolLayer\n\n  /**\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   *\n   * @param iconRotate value of iconRotate as Expression\n   */\n  fun iconRotate(iconRotate: Expression): SymbolLayer\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n   *\n   * @param iconRotationAlignment value of iconRotationAlignment\n   */\n  fun iconRotationAlignment(iconRotationAlignment: IconRotationAlignment = IconRotationAlignment.AUTO): SymbolLayer\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n   *\n   * @param iconRotationAlignment value of iconRotationAlignment as Expression\n   */\n  fun iconRotationAlignment(iconRotationAlignment: Expression): SymbolLayer\n\n  /**\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   *\n   * @param iconSize value of iconSize\n   */\n  fun iconSize(iconSize: Double = 1.0): SymbolLayer\n\n  /**\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   *\n   * @param iconSize value of iconSize as Expression\n   */\n  fun iconSize(iconSize: Expression): SymbolLayer\n\n  /**\n   * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * @param iconSizeScaleRange value of iconSizeScaleRange\n   */\n  @MapboxExperimental\n  fun iconSizeScaleRange(iconSizeScaleRange: List<Double> = listOf(0.8, 2.0)): SymbolLayer\n\n  /**\n   * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * @param iconSizeScaleRange value of iconSizeScaleRange as Expression\n   */\n  @MapboxExperimental\n  fun iconSizeScaleRange(iconSizeScaleRange: Expression): SymbolLayer\n\n  /**\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   *\n   * @param iconTextFit value of iconTextFit\n   */\n  fun iconTextFit(iconTextFit: IconTextFit = IconTextFit.NONE): SymbolLayer\n\n  /**\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   *\n   * @param iconTextFit value of iconTextFit as Expression\n   */\n  fun iconTextFit(iconTextFit: Expression): SymbolLayer\n\n  /**\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   *\n   * @param iconTextFitPadding value of iconTextFitPadding\n   */\n  fun iconTextFitPadding(iconTextFitPadding: List<Double> = listOf(0.0, 0.0, 0.0, 0.0)): SymbolLayer\n\n  /**\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   *\n   * @param iconTextFitPadding value of iconTextFitPadding as Expression\n   */\n  fun iconTextFitPadding(iconTextFitPadding: Expression): SymbolLayer\n\n  /**\n   * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n   *\n   * @param symbolAvoidEdges value of symbolAvoidEdges\n   */\n  fun symbolAvoidEdges(symbolAvoidEdges: Boolean = false): SymbolLayer\n\n  /**\n   * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n   *\n   * @param symbolAvoidEdges value of symbolAvoidEdges as Expression\n   */\n  fun symbolAvoidEdges(symbolAvoidEdges: Expression): SymbolLayer\n\n  /**\n   * Selects the base of symbol-elevation. Default value: \"ground\".\n   *\n   * @param symbolElevationReference value of symbolElevationReference\n   */\n  @MapboxExperimental\n  fun symbolElevationReference(symbolElevationReference: SymbolElevationReference = SymbolElevationReference.GROUND): SymbolLayer\n\n  /**\n   * Selects the base of symbol-elevation. Default value: \"ground\".\n   *\n   * @param symbolElevationReference value of symbolElevationReference as Expression\n   */\n  @MapboxExperimental\n  fun symbolElevationReference(symbolElevationReference: Expression): SymbolLayer\n\n  /**\n   * Label placement relative to its geometry. Default value: \"point\".\n   *\n   * @param symbolPlacement value of symbolPlacement\n   */\n  fun symbolPlacement(symbolPlacement: SymbolPlacement = SymbolPlacement.POINT): SymbolLayer\n\n  /**\n   * Label placement relative to its geometry. Default value: \"point\".\n   *\n   * @param symbolPlacement value of symbolPlacement as Expression\n   */\n  fun symbolPlacement(symbolPlacement: Expression): SymbolLayer\n\n  /**\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   *\n   * @param symbolSortKey value of symbolSortKey\n   */\n  fun symbolSortKey(symbolSortKey: Double): SymbolLayer\n\n  /**\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   *\n   * @param symbolSortKey value of symbolSortKey as Expression\n   */\n  fun symbolSortKey(symbolSortKey: Expression): SymbolLayer\n\n  /**\n   * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n   *\n   * @param symbolSpacing value of symbolSpacing\n   */\n  fun symbolSpacing(symbolSpacing: Double = 250.0): SymbolLayer\n\n  /**\n   * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n   *\n   * @param symbolSpacing value of symbolSpacing as Expression\n   */\n  fun symbolSpacing(symbolSpacing: Expression): SymbolLayer\n\n  /**\n   * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n   *\n   * @param symbolZElevate value of symbolZElevate\n   */\n  fun symbolZElevate(symbolZElevate: Boolean = false): SymbolLayer\n\n  /**\n   * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n   *\n   * @param symbolZElevate value of symbolZElevate as Expression\n   */\n  fun symbolZElevate(symbolZElevate: Expression): SymbolLayer\n\n  /**\n   * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n   *\n   * @param symbolZOrder value of symbolZOrder\n   */\n  fun symbolZOrder(symbolZOrder: SymbolZOrder = SymbolZOrder.AUTO): SymbolLayer\n\n  /**\n   * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n   *\n   * @param symbolZOrder value of symbolZOrder as Expression\n   */\n  fun symbolZOrder(symbolZOrder: Expression): SymbolLayer\n\n  /**\n   * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * @param textAllowOverlap value of textAllowOverlap\n   */\n  fun textAllowOverlap(textAllowOverlap: Boolean = false): SymbolLayer\n\n  /**\n   * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n   *\n   * @param textAllowOverlap value of textAllowOverlap as Expression\n   */\n  fun textAllowOverlap(textAllowOverlap: Expression): SymbolLayer\n\n  /**\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   *\n   * @param textAnchor value of textAnchor\n   */\n  fun textAnchor(textAnchor: TextAnchor = TextAnchor.CENTER): SymbolLayer\n\n  /**\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   *\n   * @param textAnchor value of textAnchor as Expression\n   */\n  fun textAnchor(textAnchor: Expression): SymbolLayer\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   *\n   * @param textField value of textField\n   */\n  fun textField(textField: Formatted): SymbolLayer\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   *\n   * @param textField value of textField as Expression\n   */\n  fun textField(textField: Expression): SymbolLayer\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   *\n   * Set the TextField property as String.\n   *\n   * @param textField value of textField as String\n   */\n  fun textField(textField: String): SymbolLayer\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   *\n   * DSL for construct [Formatted] textField.\n   */\n  fun textField(block: Formatted.() -> Unit): SymbolLayer\n\n  /**\n   * Font stack to use for displaying text.\n   *\n   * @param textFont value of textFont\n   */\n  fun textFont(textFont: List<String> = listOf(\"Open Sans Regular\", \"Arial Unicode MS Regular\")): SymbolLayer\n\n  /**\n   * Font stack to use for displaying text.\n   *\n   * @param textFont value of textFont as Expression\n   */\n  fun textFont(textFont: Expression): SymbolLayer\n\n  /**\n   * If true, other symbols can be visible even if they collide with the text. Default value: false.\n   *\n   * @param textIgnorePlacement value of textIgnorePlacement\n   */\n  fun textIgnorePlacement(textIgnorePlacement: Boolean = false): SymbolLayer\n\n  /**\n   * If true, other symbols can be visible even if they collide with the text. Default value: false.\n   *\n   * @param textIgnorePlacement value of textIgnorePlacement as Expression\n   */\n  fun textIgnorePlacement(textIgnorePlacement: Expression): SymbolLayer\n\n  /**\n   * Text justification options. Default value: \"center\".\n   *\n   * @param textJustify value of textJustify\n   */\n  fun textJustify(textJustify: TextJustify = TextJustify.CENTER): SymbolLayer\n\n  /**\n   * Text justification options. Default value: \"center\".\n   *\n   * @param textJustify value of textJustify as Expression\n   */\n  fun textJustify(textJustify: Expression): SymbolLayer\n\n  /**\n   * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n   *\n   * @param textKeepUpright value of textKeepUpright\n   */\n  fun textKeepUpright(textKeepUpright: Boolean = true): SymbolLayer\n\n  /**\n   * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n   *\n   * @param textKeepUpright value of textKeepUpright as Expression\n   */\n  fun textKeepUpright(textKeepUpright: Expression): SymbolLayer\n\n  /**\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   *\n   * @param textLetterSpacing value of textLetterSpacing\n   */\n  fun textLetterSpacing(textLetterSpacing: Double = 0.0): SymbolLayer\n\n  /**\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   *\n   * @param textLetterSpacing value of textLetterSpacing as Expression\n   */\n  fun textLetterSpacing(textLetterSpacing: Expression): SymbolLayer\n\n  /**\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   *\n   * @param textLineHeight value of textLineHeight\n   */\n  fun textLineHeight(textLineHeight: Double = 1.2): SymbolLayer\n\n  /**\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   *\n   * @param textLineHeight value of textLineHeight as Expression\n   */\n  fun textLineHeight(textLineHeight: Expression): SymbolLayer\n\n  /**\n   * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n   *\n   * @param textMaxAngle value of textMaxAngle\n   */\n  fun textMaxAngle(textMaxAngle: Double = 45.0): SymbolLayer\n\n  /**\n   * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n   *\n   * @param textMaxAngle value of textMaxAngle as Expression\n   */\n  fun textMaxAngle(textMaxAngle: Expression): SymbolLayer\n\n  /**\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   *\n   * @param textMaxWidth value of textMaxWidth\n   */\n  fun textMaxWidth(textMaxWidth: Double = 10.0): SymbolLayer\n\n  /**\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   *\n   * @param textMaxWidth value of textMaxWidth as Expression\n   */\n  fun textMaxWidth(textMaxWidth: Expression): SymbolLayer\n\n  /**\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   *\n   * @param textOffset value of textOffset\n   */\n  fun textOffset(textOffset: List<Double> = listOf(0.0, 0.0)): SymbolLayer\n\n  /**\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   *\n   * @param textOffset value of textOffset as Expression\n   */\n  fun textOffset(textOffset: Expression): SymbolLayer\n\n  /**\n   * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n   *\n   * @param textOptional value of textOptional\n   */\n  fun textOptional(textOptional: Boolean = false): SymbolLayer\n\n  /**\n   * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n   *\n   * @param textOptional value of textOptional as Expression\n   */\n  fun textOptional(textOptional: Expression): SymbolLayer\n\n  /**\n   * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n   *\n   * @param textPadding value of textPadding\n   */\n  fun textPadding(textPadding: Double = 2.0): SymbolLayer\n\n  /**\n   * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n   *\n   * @param textPadding value of textPadding as Expression\n   */\n  fun textPadding(textPadding: Expression): SymbolLayer\n\n  /**\n   * Orientation of text when map is pitched. Default value: \"auto\".\n   *\n   * @param textPitchAlignment value of textPitchAlignment\n   */\n  fun textPitchAlignment(textPitchAlignment: TextPitchAlignment = TextPitchAlignment.AUTO): SymbolLayer\n\n  /**\n   * Orientation of text when map is pitched. Default value: \"auto\".\n   *\n   * @param textPitchAlignment value of textPitchAlignment as Expression\n   */\n  fun textPitchAlignment(textPitchAlignment: Expression): SymbolLayer\n\n  /**\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   *\n   * @param textRadialOffset value of textRadialOffset\n   */\n  fun textRadialOffset(textRadialOffset: Double = 0.0): SymbolLayer\n\n  /**\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   *\n   * @param textRadialOffset value of textRadialOffset as Expression\n   */\n  fun textRadialOffset(textRadialOffset: Expression): SymbolLayer\n\n  /**\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   *\n   * @param textRotate value of textRotate\n   */\n  fun textRotate(textRotate: Double = 0.0): SymbolLayer\n\n  /**\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   *\n   * @param textRotate value of textRotate as Expression\n   */\n  fun textRotate(textRotate: Expression): SymbolLayer\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n   *\n   * @param textRotationAlignment value of textRotationAlignment\n   */\n  fun textRotationAlignment(textRotationAlignment: TextRotationAlignment = TextRotationAlignment.AUTO): SymbolLayer\n\n  /**\n   * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n   *\n   * @param textRotationAlignment value of textRotationAlignment as Expression\n   */\n  fun textRotationAlignment(textRotationAlignment: Expression): SymbolLayer\n\n  /**\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   *\n   * @param textSize value of textSize\n   */\n  fun textSize(textSize: Double = 16.0): SymbolLayer\n\n  /**\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   *\n   * @param textSize value of textSize as Expression\n   */\n  fun textSize(textSize: Expression): SymbolLayer\n\n  /**\n   * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * @param textSizeScaleRange value of textSizeScaleRange\n   */\n  @MapboxExperimental\n  fun textSizeScaleRange(textSizeScaleRange: List<Double> = listOf(0.8, 2.0)): SymbolLayer\n\n  /**\n   * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   *\n   * @param textSizeScaleRange value of textSizeScaleRange as Expression\n   */\n  @MapboxExperimental\n  fun textSizeScaleRange(textSizeScaleRange: Expression): SymbolLayer\n\n  /**\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   *\n   * @param textTransform value of textTransform\n   */\n  fun textTransform(textTransform: TextTransform = TextTransform.NONE): SymbolLayer\n\n  /**\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   *\n   * @param textTransform value of textTransform as Expression\n   */\n  fun textTransform(textTransform: Expression): SymbolLayer\n\n  /**\n   * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n   *\n   * @param textVariableAnchor value of textVariableAnchor\n   */\n  fun textVariableAnchor(textVariableAnchor: List<String>): SymbolLayer\n\n  /**\n   * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n   *\n   * @param textVariableAnchor value of textVariableAnchor as Expression\n   */\n  fun textVariableAnchor(textVariableAnchor: Expression): SymbolLayer\n\n  /**\n   * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n   *\n   * @param textWritingMode value of textWritingMode\n   */\n  fun textWritingMode(textWritingMode: List<String>): SymbolLayer\n\n  /**\n   * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n   *\n   * @param textWritingMode value of textWritingMode as Expression\n   */\n  fun textWritingMode(textWritingMode: Expression): SymbolLayer\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * @param iconColor value of iconColor\n   */\n  fun iconColor(iconColor: String = \"#000000\"): SymbolLayer\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * @param iconColor value of iconColor as Expression\n   */\n  fun iconColor(iconColor: Expression): SymbolLayer\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * @param iconColor value of iconColor\n   */\n  fun iconColor(@ColorInt iconColor: Int): SymbolLayer\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * Set the IconColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun iconColorTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * DSL for [iconColorTransition].\n   */\n  fun iconColorTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Set the iconColorUseTheme as String for [iconColor].\n   *\n   * @param iconColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun iconColorUseTheme(iconColorUseTheme: String): SymbolLayer\n\n  /**\n   * Set the iconColorUseTheme as Expression for [iconColor].\n   *\n   * @param iconColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun iconColorUseTheme(iconColorUseTheme: Expression): SymbolLayer\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * @param iconColorBrightnessMax value of iconColorBrightnessMax\n   */\n  fun iconColorBrightnessMax(iconColorBrightnessMax: Double = 1.0): SymbolLayer\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   *\n   * @param iconColorBrightnessMax value of iconColorBrightnessMax as Expression\n   */\n  fun iconColorBrightnessMax(iconColorBrightnessMax: Expression): SymbolLayer\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * @param iconColorBrightnessMin value of iconColorBrightnessMin\n   */\n  fun iconColorBrightnessMin(iconColorBrightnessMin: Double = 0.0): SymbolLayer\n\n  /**\n   * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   *\n   * @param iconColorBrightnessMin value of iconColorBrightnessMin as Expression\n   */\n  fun iconColorBrightnessMin(iconColorBrightnessMin: Expression): SymbolLayer\n\n  /**\n   * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * @param iconColorContrast value of iconColorContrast\n   */\n  fun iconColorContrast(iconColorContrast: Double = 0.0): SymbolLayer\n\n  /**\n   * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * @param iconColorContrast value of iconColorContrast as Expression\n   */\n  fun iconColorContrast(iconColorContrast: Expression): SymbolLayer\n\n  /**\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * @param iconColorSaturation value of iconColorSaturation\n   */\n  fun iconColorSaturation(iconColorSaturation: Double = 0.0): SymbolLayer\n\n  /**\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * @param iconColorSaturation value of iconColorSaturation as Expression\n   */\n  fun iconColorSaturation(iconColorSaturation: Expression): SymbolLayer\n\n  /**\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * Set the IconColorSaturation property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun iconColorSaturationTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   *\n   * DSL for [iconColorSaturationTransition].\n   */\n  fun iconColorSaturationTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   *\n   * @param iconEmissiveStrength value of iconEmissiveStrength\n   */\n  fun iconEmissiveStrength(iconEmissiveStrength: Double = 1.0): SymbolLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   *\n   * @param iconEmissiveStrength value of iconEmissiveStrength as Expression\n   */\n  fun iconEmissiveStrength(iconEmissiveStrength: Expression): SymbolLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   *\n   * Set the IconEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun iconEmissiveStrengthTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   *\n   * DSL for [iconEmissiveStrengthTransition].\n   */\n  fun iconEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   *\n   * @param iconHaloBlur value of iconHaloBlur\n   */\n  fun iconHaloBlur(iconHaloBlur: Double = 0.0): SymbolLayer\n\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   *\n   * @param iconHaloBlur value of iconHaloBlur as Expression\n   */\n  fun iconHaloBlur(iconHaloBlur: Expression): SymbolLayer\n\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   *\n   * Set the IconHaloBlur property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun iconHaloBlurTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   *\n   * DSL for [iconHaloBlurTransition].\n   */\n  fun iconHaloBlurTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param iconHaloColor value of iconHaloColor\n   */\n  fun iconHaloColor(iconHaloColor: String = \"rgba(0, 0, 0, 0)\"): SymbolLayer\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param iconHaloColor value of iconHaloColor as Expression\n   */\n  fun iconHaloColor(iconHaloColor: Expression): SymbolLayer\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param iconHaloColor value of iconHaloColor\n   */\n  fun iconHaloColor(@ColorInt iconHaloColor: Int): SymbolLayer\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Set the IconHaloColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun iconHaloColorTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * DSL for [iconHaloColorTransition].\n   */\n  fun iconHaloColorTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Set the iconHaloColorUseTheme as String for [iconHaloColor].\n   *\n   * @param iconHaloColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun iconHaloColorUseTheme(iconHaloColorUseTheme: String): SymbolLayer\n\n  /**\n   * Set the iconHaloColorUseTheme as Expression for [iconHaloColor].\n   *\n   * @param iconHaloColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun iconHaloColorUseTheme(iconHaloColorUseTheme: Expression): SymbolLayer\n\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   *\n   * @param iconHaloWidth value of iconHaloWidth\n   */\n  fun iconHaloWidth(iconHaloWidth: Double = 0.0): SymbolLayer\n\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   *\n   * @param iconHaloWidth value of iconHaloWidth as Expression\n   */\n  fun iconHaloWidth(iconHaloWidth: Expression): SymbolLayer\n\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   *\n   * Set the IconHaloWidth property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun iconHaloWidthTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   *\n   * DSL for [iconHaloWidthTransition].\n   */\n  fun iconHaloWidthTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * @param iconImageCrossFade value of iconImageCrossFade\n   */\n  fun iconImageCrossFade(iconImageCrossFade: Double = 0.0): SymbolLayer\n\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * @param iconImageCrossFade value of iconImageCrossFade as Expression\n   */\n  fun iconImageCrossFade(iconImageCrossFade: Expression): SymbolLayer\n\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * Set the IconImageCrossFade property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun iconImageCrossFadeTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   *\n   * DSL for [iconImageCrossFadeTransition].\n   */\n  fun iconImageCrossFadeTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * @param iconOcclusionOpacity value of iconOcclusionOpacity\n   */\n  fun iconOcclusionOpacity(iconOcclusionOpacity: Double = 0.0): SymbolLayer\n\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * @param iconOcclusionOpacity value of iconOcclusionOpacity as Expression\n   */\n  fun iconOcclusionOpacity(iconOcclusionOpacity: Expression): SymbolLayer\n\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * Set the IconOcclusionOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun iconOcclusionOpacityTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * DSL for [iconOcclusionOpacityTransition].\n   */\n  fun iconOcclusionOpacityTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param iconOpacity value of iconOpacity\n   */\n  fun iconOpacity(iconOpacity: Double = 1.0): SymbolLayer\n\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param iconOpacity value of iconOpacity as Expression\n   */\n  fun iconOpacity(iconOpacity: Expression): SymbolLayer\n\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Set the IconOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun iconOpacityTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [iconOpacityTransition].\n   */\n  fun iconOpacityTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   *\n   * @param iconTranslate value of iconTranslate\n   */\n  fun iconTranslate(iconTranslate: List<Double> = listOf(0.0, 0.0)): SymbolLayer\n\n  /**\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   *\n   * @param iconTranslate value of iconTranslate as Expression\n   */\n  fun iconTranslate(iconTranslate: Expression): SymbolLayer\n\n  /**\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   *\n   * Set the IconTranslate property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun iconTranslateTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   *\n   * DSL for [iconTranslateTransition].\n   */\n  fun iconTranslateTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n   *\n   * @param iconTranslateAnchor value of iconTranslateAnchor\n   */\n  fun iconTranslateAnchor(iconTranslateAnchor: IconTranslateAnchor = IconTranslateAnchor.MAP): SymbolLayer\n\n  /**\n   * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n   *\n   * @param iconTranslateAnchor value of iconTranslateAnchor as Expression\n   */\n  fun iconTranslateAnchor(iconTranslateAnchor: Expression): SymbolLayer\n\n  /**\n   * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n   *\n   * @param occlusionOpacityMode value of occlusionOpacityMode\n   */\n  fun occlusionOpacityMode(occlusionOpacityMode: OcclusionOpacityMode = OcclusionOpacityMode.ANCHOR): SymbolLayer\n\n  /**\n   * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n   *\n   * @param occlusionOpacityMode value of occlusionOpacityMode as Expression\n   */\n  fun occlusionOpacityMode(occlusionOpacityMode: Expression): SymbolLayer\n\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   *\n   * @param symbolZOffset value of symbolZOffset\n   */\n  @MapboxExperimental\n  fun symbolZOffset(symbolZOffset: Double = 0.0): SymbolLayer\n\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   *\n   * @param symbolZOffset value of symbolZOffset as Expression\n   */\n  @MapboxExperimental\n  fun symbolZOffset(symbolZOffset: Expression): SymbolLayer\n\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   *\n   * Set the SymbolZOffset property transition options\n   *\n   * @param options transition options for Double\n   */\n  @MapboxExperimental\n  fun symbolZOffsetTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   *\n   * DSL for [symbolZOffsetTransition].\n   */\n  @MapboxExperimental\n  fun symbolZOffsetTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * @param textColor value of textColor\n   */\n  fun textColor(textColor: String = \"#000000\"): SymbolLayer\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * @param textColor value of textColor as Expression\n   */\n  fun textColor(textColor: Expression): SymbolLayer\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * @param textColor value of textColor\n   */\n  fun textColor(@ColorInt textColor: Int): SymbolLayer\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * Set the TextColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun textColorTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * DSL for [textColorTransition].\n   */\n  fun textColorTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Set the textColorUseTheme as String for [textColor].\n   *\n   * @param textColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun textColorUseTheme(textColorUseTheme: String): SymbolLayer\n\n  /**\n   * Set the textColorUseTheme as Expression for [textColor].\n   *\n   * @param textColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun textColorUseTheme(textColorUseTheme: Expression): SymbolLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   *\n   * @param textEmissiveStrength value of textEmissiveStrength\n   */\n  fun textEmissiveStrength(textEmissiveStrength: Double = 1.0): SymbolLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   *\n   * @param textEmissiveStrength value of textEmissiveStrength as Expression\n   */\n  fun textEmissiveStrength(textEmissiveStrength: Expression): SymbolLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   *\n   * Set the TextEmissiveStrength property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun textEmissiveStrengthTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   *\n   * DSL for [textEmissiveStrengthTransition].\n   */\n  fun textEmissiveStrengthTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   *\n   * @param textHaloBlur value of textHaloBlur\n   */\n  fun textHaloBlur(textHaloBlur: Double = 0.0): SymbolLayer\n\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   *\n   * @param textHaloBlur value of textHaloBlur as Expression\n   */\n  fun textHaloBlur(textHaloBlur: Expression): SymbolLayer\n\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   *\n   * Set the TextHaloBlur property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun textHaloBlurTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   *\n   * DSL for [textHaloBlurTransition].\n   */\n  fun textHaloBlurTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param textHaloColor value of textHaloColor\n   */\n  fun textHaloColor(textHaloColor: String = \"rgba(0, 0, 0, 0)\"): SymbolLayer\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param textHaloColor value of textHaloColor as Expression\n   */\n  fun textHaloColor(textHaloColor: Expression): SymbolLayer\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param textHaloColor value of textHaloColor\n   */\n  fun textHaloColor(@ColorInt textHaloColor: Int): SymbolLayer\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * Set the TextHaloColor property transition options\n   *\n   * @param options transition options for String\n   */\n  fun textHaloColorTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * DSL for [textHaloColorTransition].\n   */\n  fun textHaloColorTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Set the textHaloColorUseTheme as String for [textHaloColor].\n   *\n   * @param textHaloColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun textHaloColorUseTheme(textHaloColorUseTheme: String): SymbolLayer\n\n  /**\n   * Set the textHaloColorUseTheme as Expression for [textHaloColor].\n   *\n   * @param textHaloColorUseTheme overrides applying of color theme if \"none\" string value is set. To follow default theme \"default\" sting value should be set.\n   */\n  @MapboxExperimental\n  fun textHaloColorUseTheme(textHaloColorUseTheme: Expression): SymbolLayer\n\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   *\n   * @param textHaloWidth value of textHaloWidth\n   */\n  fun textHaloWidth(textHaloWidth: Double = 0.0): SymbolLayer\n\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   *\n   * @param textHaloWidth value of textHaloWidth as Expression\n   */\n  fun textHaloWidth(textHaloWidth: Expression): SymbolLayer\n\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   *\n   * Set the TextHaloWidth property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun textHaloWidthTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   *\n   * DSL for [textHaloWidthTransition].\n   */\n  fun textHaloWidthTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * @param textOcclusionOpacity value of textOcclusionOpacity\n   */\n  fun textOcclusionOpacity(textOcclusionOpacity: Double = 0.0): SymbolLayer\n\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * @param textOcclusionOpacity value of textOcclusionOpacity as Expression\n   */\n  fun textOcclusionOpacity(textOcclusionOpacity: Expression): SymbolLayer\n\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * Set the TextOcclusionOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun textOcclusionOpacityTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * DSL for [textOcclusionOpacityTransition].\n   */\n  fun textOcclusionOpacityTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param textOpacity value of textOpacity\n   */\n  fun textOpacity(textOpacity: Double = 1.0): SymbolLayer\n\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param textOpacity value of textOpacity as Expression\n   */\n  fun textOpacity(textOpacity: Expression): SymbolLayer\n\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * Set the TextOpacity property transition options\n   *\n   * @param options transition options for Double\n   */\n  fun textOpacityTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * DSL for [textOpacityTransition].\n   */\n  fun textOpacityTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   *\n   * @param textTranslate value of textTranslate\n   */\n  fun textTranslate(textTranslate: List<Double> = listOf(0.0, 0.0)): SymbolLayer\n\n  /**\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   *\n   * @param textTranslate value of textTranslate as Expression\n   */\n  fun textTranslate(textTranslate: Expression): SymbolLayer\n\n  /**\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   *\n   * Set the TextTranslate property transition options\n   *\n   * @param options transition options for List<Double>\n   */\n  fun textTranslateTransition(options: StyleTransition): SymbolLayer\n\n  /**\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   *\n   * DSL for [textTranslateTransition].\n   */\n  fun textTranslateTransition(block: StyleTransition.Builder.() -> Unit): SymbolLayer\n\n  /**\n   * Controls the frame of reference for `text-translate`. Default value: \"map\".\n   *\n   * @param textTranslateAnchor value of textTranslateAnchor\n   */\n  fun textTranslateAnchor(textTranslateAnchor: TextTranslateAnchor = TextTranslateAnchor.MAP): SymbolLayer\n\n  /**\n   * Controls the frame of reference for `text-translate`. Default value: \"map\".\n   *\n   * @param textTranslateAnchor value of textTranslateAnchor as Expression\n   */\n  fun textTranslateAnchor(textTranslateAnchor: Expression): SymbolLayer\n}\n\n/**\n * DSL function for creating a [SymbolLayer].\n */\nfun symbolLayer(layerId: String, sourceId: String, block: SymbolLayerDsl.() -> Unit): SymbolLayer = SymbolLayer(layerId, sourceId).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/properties/PropertyValue.kt",
    "content": "package com.mapbox.maps.extension.style.layers.properties\n\nimport android.util.Log\nimport androidx.annotation.ColorInt\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.TypeUtils\n\n/**\n * Properties for Style\n *\n * @param propertyName the property name\n * @param propertyValue the property value\n */\nopen class PropertyValue<T> internal constructor(val propertyName: String, val propertyValue: T) {\n\n  /**\n   * The [Value] representation of the property.\n   */\n  val value: Value = try {\n    TypeUtils.wrapToValue(propertyValue as Any)\n  } catch (e: IllegalArgumentException) {\n    throw IllegalArgumentException(\"Incorrect property value for $propertyName: ${e.message}\", e.cause)\n  }\n\n  /**\n   * Returns if this is a expression.\n   *\n   * @return true if this is a expression, false if not\n   */\n  val isExpression: Boolean\n    get() = propertyValue is Expression\n\n  /**\n   * Returns if this is a transition.\n   *\n   * @return true if this is a transition, false if not\n   */\n  val isTransition: Boolean\n    get() = propertyValue is StyleTransition\n\n  /**\n   * Returns if this is a constant value.\n   *\n   * @return true if this is a constant value, false if not\n   */\n  val isValue: Boolean\n    get() = !isExpression && !isTransition\n\n  /**\n   * Get the value of the property.\n   *\n   * @return the property value\n   */\n  fun getValue(): T? {\n    return if (isValue) { // noinspection unchecked\n      propertyValue\n    } else {\n      null\n    }\n  }\n\n  /**\n   * Get the color int value of the property if the value is a color.\n   *\n   * @return the color int value of the property, null if not a color value\n   */\n  @get:ColorInt\n  val colorInt: Int?\n    get() {\n      if (!isValue || propertyValue !is String) {\n        Log.e(\n          TAG,\n          String.format(\n            \"%s is not a String value and can not be converted to a color it\",\n            propertyName\n          )\n        )\n        return null\n      }\n      return try {\n        ColorUtils.rgbaToColor(propertyValue as String)\n      } catch (ex: Exception) {\n        Log.e(\n          TAG,\n          java.lang.String.format(\n            \"%s could not be converted to a Color int: %s\",\n            propertyName,\n            ex.message\n          )\n        )\n        null\n      }\n    }\n\n  /**\n   * Get the string representation of a property value.\n   *\n   * @return the string representation\n   */\n  override fun toString(): String {\n    return String.format(\"%s: %s\", propertyName, propertyValue)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val TAG = \"Mbgl-PropertyValue\"\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/layers/properties/generated/Property.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.properties.generated\n\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Paint/Layout properties for Layer\n */\ninternal interface LayerProperty {\n  val value: String\n}\n// VISIBILITY: Whether this layer is displayed.\n/**\n * The visibility of a layer.\n *\n * @param value String value of this property\n */\nclass Visibility private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is Visibility &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"Visibility(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The layer is shown.\n     */\n    @JvmField\n    val VISIBLE = Visibility(\"visible\")\n\n    /**\n     * The layer is hidden.\n     */\n    @JvmField\n    val NONE = Visibility(\"none\")\n\n    /**\n     * Utility function to get [Visibility] instance from given [value]\n     */\n    @JvmStatic\n    fun valueOf(value: String): Visibility {\n      return when (value) {\n        \"VISIBLE\" -> VISIBLE\n        \"NONE\" -> NONE\n        else -> throw RuntimeException(\"Visibility.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n\n// FILL_ELEVATION_REFERENCE: Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset.\n/**\n * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset.\n *\n * @param value String value of this property\n */\n@MapboxExperimental\nclass FillElevationReference private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is FillElevationReference &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"FillElevationReference(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Elevated rendering is disabled.\n     */\n    @JvmField\n    val NONE = FillElevationReference(\"none\")\n    /**\n     * Elevate geometry relative to HD roads. Use this mode to describe base polygons of the road networks.\n     */\n    @JvmField\n    val HD_ROAD_BASE = FillElevationReference(\"hd-road-base\")\n    /**\n     * Elevated rendering is enabled. Use this mode to describe additive and stackable features such as 'hatched areas' that should exist only on top of road polygons.\n     */\n    @JvmField\n    val HD_ROAD_MARKUP = FillElevationReference(\"hd-road-markup\")\n\n    /**\n     * Utility function to get [FillElevationReference] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): FillElevationReference {\n      return when (value) {\n        \"NONE\" -> NONE\n        \"HD_ROAD_BASE\" -> HD_ROAD_BASE\n        \"HD_ROAD_MARKUP\" -> HD_ROAD_MARKUP\n        else -> throw RuntimeException(\"FillElevationReference.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// LINE_CAP: The display of line endings.\n/**\n * The display of line endings.\n *\n * @param value String value of this property\n */\nclass LineCap private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is LineCap &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"LineCap(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * A cap with a squared-off end which is drawn to the exact endpoint of the line.\n     */\n    @JvmField\n    val BUTT = LineCap(\"butt\")\n    /**\n     * A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\n     */\n    @JvmField\n    val ROUND = LineCap(\"round\")\n    /**\n     * A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\n     */\n    @JvmField\n    val SQUARE = LineCap(\"square\")\n\n    /**\n     * Utility function to get [LineCap] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): LineCap {\n      return when (value) {\n        \"BUTT\" -> BUTT\n        \"ROUND\" -> ROUND\n        \"SQUARE\" -> SQUARE\n        else -> throw RuntimeException(\"LineCap.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// LINE_ELEVATION_REFERENCE: Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset.\n/**\n * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset.\n *\n * @param value String value of this property\n */\nclass LineElevationReference private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is LineElevationReference &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"LineElevationReference(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Elevated rendering is disabled.\n     */\n    @JvmField\n    val NONE = LineElevationReference(\"none\")\n    /**\n     * Elevated rendering is enabled. Use this mode to elevate lines relative to the sea level.\n     */\n    @JvmField\n    val SEA = LineElevationReference(\"sea\")\n    /**\n     * Elevated rendering is enabled. Use this mode to elevate lines relative to the ground's height below them.\n     */\n    @JvmField\n    val GROUND = LineElevationReference(\"ground\")\n    /**\n     * Elevated rendering is enabled. Use this mode to describe additive and stackable features that should exist only on top of road polygons.\n     */\n    @JvmField\n    val HD_ROAD_MARKUP = LineElevationReference(\"hd-road-markup\")\n\n    /**\n     * Utility function to get [LineElevationReference] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): LineElevationReference {\n      return when (value) {\n        \"NONE\" -> NONE\n        \"SEA\" -> SEA\n        \"GROUND\" -> GROUND\n        \"HD_ROAD_MARKUP\" -> HD_ROAD_MARKUP\n        else -> throw RuntimeException(\"LineElevationReference.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// LINE_JOIN: The display of lines when joining.\n/**\n * The display of lines when joining.\n *\n * @param value String value of this property\n */\nclass LineJoin private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is LineJoin &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"LineJoin(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\n     */\n    @JvmField\n    val BEVEL = LineJoin(\"bevel\")\n    /**\n     * A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\n     */\n    @JvmField\n    val ROUND = LineJoin(\"round\")\n    /**\n     * A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\n     */\n    @JvmField\n    val MITER = LineJoin(\"miter\")\n    /**\n     * Line segments are not joined together, each one creates a separate line. Useful in combination with line-pattern. Line-cap property is not respected. Can't be used with data-driven styling.\n     */\n    @JvmField\n    val NONE = LineJoin(\"none\")\n\n    /**\n     * Utility function to get [LineJoin] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): LineJoin {\n      return when (value) {\n        \"BEVEL\" -> BEVEL\n        \"ROUND\" -> ROUND\n        \"MITER\" -> MITER\n        \"NONE\" -> NONE\n        else -> throw RuntimeException(\"LineJoin.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// LINE_WIDTH_UNIT: Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release.\n/**\n * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release.\n *\n * @param value String value of this property\n */\n@MapboxExperimental\nclass LineWidthUnit private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is LineWidthUnit &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"LineWidthUnit(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Width is rendered in pixels.\n     */\n    @JvmField\n    val PIXELS = LineWidthUnit(\"pixels\")\n    /**\n     * Width is rendered in meters.\n     */\n    @JvmField\n    val METERS = LineWidthUnit(\"meters\")\n\n    /**\n     * Utility function to get [LineWidthUnit] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): LineWidthUnit {\n      return when (value) {\n        \"PIXELS\" -> PIXELS\n        \"METERS\" -> METERS\n        else -> throw RuntimeException(\"LineWidthUnit.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// ICON_ANCHOR: Part of the icon placed closest to the anchor.\n/**\n * Part of the icon placed closest to the anchor.\n *\n * @param value String value of this property\n */\nclass IconAnchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is IconAnchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"IconAnchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The center of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    val CENTER = IconAnchor(\"center\")\n    /**\n     * The left side of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    val LEFT = IconAnchor(\"left\")\n    /**\n     * The right side of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    val RIGHT = IconAnchor(\"right\")\n    /**\n     * The top of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    val TOP = IconAnchor(\"top\")\n    /**\n     * The bottom of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    val BOTTOM = IconAnchor(\"bottom\")\n    /**\n     * The top left corner of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    val TOP_LEFT = IconAnchor(\"top-left\")\n    /**\n     * The top right corner of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    val TOP_RIGHT = IconAnchor(\"top-right\")\n    /**\n     * The bottom left corner of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    val BOTTOM_LEFT = IconAnchor(\"bottom-left\")\n    /**\n     * The bottom right corner of the icon is placed closest to the anchor.\n     */\n    @JvmField\n    val BOTTOM_RIGHT = IconAnchor(\"bottom-right\")\n\n    /**\n     * Utility function to get [IconAnchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): IconAnchor {\n      return when (value) {\n        \"CENTER\" -> CENTER\n        \"LEFT\" -> LEFT\n        \"RIGHT\" -> RIGHT\n        \"TOP\" -> TOP\n        \"BOTTOM\" -> BOTTOM\n        \"TOP_LEFT\" -> TOP_LEFT\n        \"TOP_RIGHT\" -> TOP_RIGHT\n        \"BOTTOM_LEFT\" -> BOTTOM_LEFT\n        \"BOTTOM_RIGHT\" -> BOTTOM_RIGHT\n        else -> throw RuntimeException(\"IconAnchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// ICON_PITCH_ALIGNMENT: Orientation of icon when map is pitched.\n/**\n * Orientation of icon when map is pitched.\n *\n * @param value String value of this property\n */\nclass IconPitchAlignment private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is IconPitchAlignment &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"IconPitchAlignment(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The icon is aligned to the plane of the map.\n     */\n    @JvmField\n    val MAP = IconPitchAlignment(\"map\")\n    /**\n     * The icon is aligned to the plane of the viewport.\n     */\n    @JvmField\n    val VIEWPORT = IconPitchAlignment(\"viewport\")\n    /**\n     * Automatically matches the value of [IconRotationAlignment].\n     */\n    @JvmField\n    val AUTO = IconPitchAlignment(\"auto\")\n\n    /**\n     * Utility function to get [IconPitchAlignment] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): IconPitchAlignment {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        \"AUTO\" -> AUTO\n        else -> throw RuntimeException(\"IconPitchAlignment.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// ICON_ROTATION_ALIGNMENT: In combination with `symbol-placement`, determines the rotation behavior of icons.\n/**\n * In combination with `symbol-placement`, determines the rotation behavior of icons.\n *\n * @param value String value of this property\n */\nclass IconRotationAlignment private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is IconRotationAlignment &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"IconRotationAlignment(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * When [SymbolPlacement] is set to [SymbolPlacement.POINT], aligns icons east-west. When [SymbolPlacement] is set to [SymbolPlacement.LINE] or [SymbolPlacement.LINE_CENTER] aligns icon x-axes with the line.\n     */\n    @JvmField\n    val MAP = IconRotationAlignment(\"map\")\n    /**\n     * Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of [SymbolPlacement].\n     */\n    @JvmField\n    val VIEWPORT = IconRotationAlignment(\"viewport\")\n    /**\n     * When [SymbolPlacement] is set to [SymbolPlacement.POINT], this is equivalent to [IconRotationAlignment.VIEWPORT]. When [SymbolPlacement] is set to [SymbolPlacement.LINE] or [SymbolPlacement.LINE_CENTER] this is equivalent to [IconRotationAlignment.MAP].\n     */\n    @JvmField\n    val AUTO = IconRotationAlignment(\"auto\")\n\n    /**\n     * Utility function to get [IconRotationAlignment] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): IconRotationAlignment {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        \"AUTO\" -> AUTO\n        else -> throw RuntimeException(\"IconRotationAlignment.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// ICON_TEXT_FIT: Scales the icon to fit around the associated text.\n/**\n * Scales the icon to fit around the associated text.\n *\n * @param value String value of this property\n */\nclass IconTextFit private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is IconTextFit &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"IconTextFit(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The icon is displayed at its intrinsic aspect ratio.\n     */\n    @JvmField\n    val NONE = IconTextFit(\"none\")\n    /**\n     * The icon is scaled in the x-dimension to fit the width of the text.\n     */\n    @JvmField\n    val WIDTH = IconTextFit(\"width\")\n    /**\n     * The icon is scaled in the y-dimension to fit the height of the text.\n     */\n    @JvmField\n    val HEIGHT = IconTextFit(\"height\")\n    /**\n     * The icon is scaled in both x- and y-dimensions.\n     */\n    @JvmField\n    val BOTH = IconTextFit(\"both\")\n\n    /**\n     * Utility function to get [IconTextFit] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): IconTextFit {\n      return when (value) {\n        \"NONE\" -> NONE\n        \"WIDTH\" -> WIDTH\n        \"HEIGHT\" -> HEIGHT\n        \"BOTH\" -> BOTH\n        else -> throw RuntimeException(\"IconTextFit.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// SYMBOL_ELEVATION_REFERENCE: Selects the base of symbol-elevation.\n/**\n * Selects the base of symbol-elevation.\n *\n * @param value String value of this property\n */\n@MapboxExperimental\nclass SymbolElevationReference private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is SymbolElevationReference &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"SymbolElevationReference(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Elevate symbols relative to the sea level.\n     */\n    @JvmField\n    val SEA = SymbolElevationReference(\"sea\")\n    /**\n     * Elevate symbols relative to the ground's height below them.\n     */\n    @JvmField\n    val GROUND = SymbolElevationReference(\"ground\")\n    /**\n     * Use this mode to enable elevated behavior for features that are rendered on top of 3D road polygons. The feature is currently being developed.\n     */\n    @JvmField\n    val HD_ROAD_MARKUP = SymbolElevationReference(\"hd-road-markup\")\n\n    /**\n     * Utility function to get [SymbolElevationReference] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): SymbolElevationReference {\n      return when (value) {\n        \"SEA\" -> SEA\n        \"GROUND\" -> GROUND\n        \"HD_ROAD_MARKUP\" -> HD_ROAD_MARKUP\n        else -> throw RuntimeException(\"SymbolElevationReference.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// SYMBOL_PLACEMENT: Label placement relative to its geometry.\n/**\n * Label placement relative to its geometry.\n *\n * @param value String value of this property\n */\nclass SymbolPlacement private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is SymbolPlacement &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"SymbolPlacement(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The label is placed at the point where the geometry is located.\n     */\n    @JvmField\n    val POINT = SymbolPlacement(\"point\")\n    /**\n     * The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries.\n     */\n    @JvmField\n    val LINE = SymbolPlacement(\"line\")\n    /**\n     * The label is placed at the center of the line of the geometry. Can only be used on `LineString` and `Polygon` geometries. Note that a single feature in a vector tile may contain multiple line geometries.\n     */\n    @JvmField\n    val LINE_CENTER = SymbolPlacement(\"line-center\")\n\n    /**\n     * Utility function to get [SymbolPlacement] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): SymbolPlacement {\n      return when (value) {\n        \"POINT\" -> POINT\n        \"LINE\" -> LINE\n        \"LINE_CENTER\" -> LINE_CENTER\n        else -> throw RuntimeException(\"SymbolPlacement.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// SYMBOL_Z_ORDER: Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`.\n/**\n * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`.\n *\n * @param value String value of this property\n */\nclass SymbolZOrder private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is SymbolZOrder &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"SymbolZOrder(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Sorts symbols by `symbol-sort-key` if set. Otherwise, sorts symbols by their y-position relative to the viewport if `icon-allow-overlap` or `text-allow-overlap` is set to `true` or `icon-ignore-placement` or `text-ignore-placement` is `false`.\n     */\n    @JvmField\n    val AUTO = SymbolZOrder(\"auto\")\n    /**\n     * Sorts symbols by their y-position relative to the viewport if any of the following is set to `true`: `icon-allow-overlap`, `text-allow-overlap`, `icon-ignore-placement`, `text-ignore-placement`.\n     */\n    @JvmField\n    val VIEWPORT_Y = SymbolZOrder(\"viewport-y\")\n    /**\n     * Sorts symbols by `symbol-sort-key` if set. Otherwise, no sorting is applied; symbols are rendered in the same order as the source data.\n     */\n    @JvmField\n    val SOURCE = SymbolZOrder(\"source\")\n\n    /**\n     * Utility function to get [SymbolZOrder] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): SymbolZOrder {\n      return when (value) {\n        \"AUTO\" -> AUTO\n        \"VIEWPORT_Y\" -> VIEWPORT_Y\n        \"SOURCE\" -> SOURCE\n        else -> throw RuntimeException(\"SymbolZOrder.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// TEXT_ANCHOR: Part of the text placed closest to the anchor.\n/**\n * Part of the text placed closest to the anchor.\n *\n * @param value String value of this property\n */\nclass TextAnchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is TextAnchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"TextAnchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The center of the text is placed closest to the anchor.\n     */\n    @JvmField\n    val CENTER = TextAnchor(\"center\")\n    /**\n     * The left side of the text is placed closest to the anchor.\n     */\n    @JvmField\n    val LEFT = TextAnchor(\"left\")\n    /**\n     * The right side of the text is placed closest to the anchor.\n     */\n    @JvmField\n    val RIGHT = TextAnchor(\"right\")\n    /**\n     * The top of the text is placed closest to the anchor.\n     */\n    @JvmField\n    val TOP = TextAnchor(\"top\")\n    /**\n     * The bottom of the text is placed closest to the anchor.\n     */\n    @JvmField\n    val BOTTOM = TextAnchor(\"bottom\")\n    /**\n     * The top left corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    val TOP_LEFT = TextAnchor(\"top-left\")\n    /**\n     * The top right corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    val TOP_RIGHT = TextAnchor(\"top-right\")\n    /**\n     * The bottom left corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    val BOTTOM_LEFT = TextAnchor(\"bottom-left\")\n    /**\n     * The bottom right corner of the text is placed closest to the anchor.\n     */\n    @JvmField\n    val BOTTOM_RIGHT = TextAnchor(\"bottom-right\")\n\n    /**\n     * Utility function to get [TextAnchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): TextAnchor {\n      return when (value) {\n        \"CENTER\" -> CENTER\n        \"LEFT\" -> LEFT\n        \"RIGHT\" -> RIGHT\n        \"TOP\" -> TOP\n        \"BOTTOM\" -> BOTTOM\n        \"TOP_LEFT\" -> TOP_LEFT\n        \"TOP_RIGHT\" -> TOP_RIGHT\n        \"BOTTOM_LEFT\" -> BOTTOM_LEFT\n        \"BOTTOM_RIGHT\" -> BOTTOM_RIGHT\n        else -> throw RuntimeException(\"TextAnchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// TEXT_JUSTIFY: Text justification options.\n/**\n * Text justification options.\n *\n * @param value String value of this property\n */\nclass TextJustify private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is TextJustify &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"TextJustify(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The text is aligned towards the anchor position.\n     */\n    @JvmField\n    val AUTO = TextJustify(\"auto\")\n    /**\n     * The text is aligned to the left.\n     */\n    @JvmField\n    val LEFT = TextJustify(\"left\")\n    /**\n     * The text is centered.\n     */\n    @JvmField\n    val CENTER = TextJustify(\"center\")\n    /**\n     * The text is aligned to the right.\n     */\n    @JvmField\n    val RIGHT = TextJustify(\"right\")\n\n    /**\n     * Utility function to get [TextJustify] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): TextJustify {\n      return when (value) {\n        \"AUTO\" -> AUTO\n        \"LEFT\" -> LEFT\n        \"CENTER\" -> CENTER\n        \"RIGHT\" -> RIGHT\n        else -> throw RuntimeException(\"TextJustify.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// TEXT_PITCH_ALIGNMENT: Orientation of text when map is pitched.\n/**\n * Orientation of text when map is pitched.\n *\n * @param value String value of this property\n */\nclass TextPitchAlignment private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is TextPitchAlignment &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"TextPitchAlignment(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The text is aligned to the plane of the map.\n     */\n    @JvmField\n    val MAP = TextPitchAlignment(\"map\")\n    /**\n     * The text is aligned to the plane of the viewport.\n     */\n    @JvmField\n    val VIEWPORT = TextPitchAlignment(\"viewport\")\n    /**\n     * Automatically matches the value of [TextRotationAlignment].\n     */\n    @JvmField\n    val AUTO = TextPitchAlignment(\"auto\")\n\n    /**\n     * Utility function to get [TextPitchAlignment] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): TextPitchAlignment {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        \"AUTO\" -> AUTO\n        else -> throw RuntimeException(\"TextPitchAlignment.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// TEXT_ROTATION_ALIGNMENT: In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.\n/**\n * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.\n *\n * @param value String value of this property\n */\nclass TextRotationAlignment private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is TextRotationAlignment &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"TextRotationAlignment(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * When [SymbolPlacement] is set to [SymbolPlacement.POINT], aligns text east-west. When [SymbolPlacement] is set to [SymbolPlacement.LINE] or [SymbolPlacement.LINE_CENTER] aligns text x-axes with the line.\n     */\n    @JvmField\n    val MAP = TextRotationAlignment(\"map\")\n    /**\n     * Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of [SymbolPlacement].\n     */\n    @JvmField\n    val VIEWPORT = TextRotationAlignment(\"viewport\")\n    /**\n     * When [SymbolPlacement] is set to [SymbolPlacement.POINT], this is equivalent to [TextRotationAlignment.VIEWPORT]. When [SymbolPlacement] is set to [SymbolPlacement.LINE] or [SymbolPlacement.LINE_CENTER] this is equivalent to [TextRotationAlignment.MAP].\n     */\n    @JvmField\n    val AUTO = TextRotationAlignment(\"auto\")\n\n    /**\n     * Utility function to get [TextRotationAlignment] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): TextRotationAlignment {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        \"AUTO\" -> AUTO\n        else -> throw RuntimeException(\"TextRotationAlignment.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// TEXT_TRANSFORM: Specifies how to capitalize text, similar to the CSS `text-transform` property.\n/**\n * Specifies how to capitalize text, similar to the CSS `text-transform` property.\n *\n * @param value String value of this property\n */\nclass TextTransform private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is TextTransform &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"TextTransform(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The text is not altered.\n     */\n    @JvmField\n    val NONE = TextTransform(\"none\")\n    /**\n     * Forces all letters to be displayed in uppercase.\n     */\n    @JvmField\n    val UPPERCASE = TextTransform(\"uppercase\")\n    /**\n     * Forces all letters to be displayed in lowercase.\n     */\n    @JvmField\n    val LOWERCASE = TextTransform(\"lowercase\")\n\n    /**\n     * Utility function to get [TextTransform] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): TextTransform {\n      return when (value) {\n        \"NONE\" -> NONE\n        \"UPPERCASE\" -> UPPERCASE\n        \"LOWERCASE\" -> LOWERCASE\n        else -> throw RuntimeException(\"TextTransform.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// CIRCLE_ELEVATION_REFERENCE: Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset.\n/**\n * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset.\n *\n * @param value String value of this property\n */\n@MapboxExperimental\nclass CircleElevationReference private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is CircleElevationReference &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"CircleElevationReference(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Elevated rendering is disabled.\n     */\n    @JvmField\n    val NONE = CircleElevationReference(\"none\")\n    /**\n     * Elevated rendering is enabled. Use this mode to describe additive and stackable features that should exist only on top of road polygons.\n     */\n    @JvmField\n    val HD_ROAD_MARKUP = CircleElevationReference(\"hd-road-markup\")\n\n    /**\n     * Utility function to get [CircleElevationReference] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): CircleElevationReference {\n      return when (value) {\n        \"NONE\" -> NONE\n        \"HD_ROAD_MARKUP\" -> HD_ROAD_MARKUP\n        else -> throw RuntimeException(\"CircleElevationReference.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// FILL_TRANSLATE_ANCHOR: Controls the frame of reference for `fill-translate`.\n/**\n * Controls the frame of reference for `fill-translate`.\n *\n * @param value String value of this property\n */\nclass FillTranslateAnchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is FillTranslateAnchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"FillTranslateAnchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The fill is translated relative to the map.\n     */\n    @JvmField\n    val MAP = FillTranslateAnchor(\"map\")\n    /**\n     * The fill is translated relative to the viewport.\n     */\n    @JvmField\n    val VIEWPORT = FillTranslateAnchor(\"viewport\")\n\n    /**\n     * Utility function to get [FillTranslateAnchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): FillTranslateAnchor {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"FillTranslateAnchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// LINE_TRANSLATE_ANCHOR: Controls the frame of reference for `line-translate`.\n/**\n * Controls the frame of reference for `line-translate`.\n *\n * @param value String value of this property\n */\nclass LineTranslateAnchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is LineTranslateAnchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"LineTranslateAnchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The line is translated relative to the map.\n     */\n    @JvmField\n    val MAP = LineTranslateAnchor(\"map\")\n    /**\n     * The line is translated relative to the viewport.\n     */\n    @JvmField\n    val VIEWPORT = LineTranslateAnchor(\"viewport\")\n\n    /**\n     * Utility function to get [LineTranslateAnchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): LineTranslateAnchor {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"LineTranslateAnchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// ICON_TRANSLATE_ANCHOR: Controls the frame of reference for `icon-translate`.\n/**\n * Controls the frame of reference for `icon-translate`.\n *\n * @param value String value of this property\n */\nclass IconTranslateAnchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is IconTranslateAnchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"IconTranslateAnchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Icons are translated relative to the map.\n     */\n    @JvmField\n    val MAP = IconTranslateAnchor(\"map\")\n    /**\n     * Icons are translated relative to the viewport.\n     */\n    @JvmField\n    val VIEWPORT = IconTranslateAnchor(\"viewport\")\n\n    /**\n     * Utility function to get [IconTranslateAnchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): IconTranslateAnchor {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"IconTranslateAnchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// OCCLUSION_OPACITY_MODE: Specify how opacity in case of being occluded should be applied\n/**\n * Specify how opacity in case of being occluded should be applied\n *\n * @param value String value of this property\n */\nclass OcclusionOpacityMode private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is OcclusionOpacityMode &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"OcclusionOpacityMode(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Whole symbol is treated as occluded if it's anchor point is occluded\n     */\n    @JvmField\n    val ANCHOR = OcclusionOpacityMode(\"anchor\")\n    /**\n     * Occlusion is applied on a per-pixel basis\n     */\n    @JvmField\n    val PIXEL = OcclusionOpacityMode(\"pixel\")\n\n    /**\n     * Utility function to get [OcclusionOpacityMode] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): OcclusionOpacityMode {\n      return when (value) {\n        \"ANCHOR\" -> ANCHOR\n        \"PIXEL\" -> PIXEL\n        else -> throw RuntimeException(\"OcclusionOpacityMode.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// TEXT_TRANSLATE_ANCHOR: Controls the frame of reference for `text-translate`.\n/**\n * Controls the frame of reference for `text-translate`.\n *\n * @param value String value of this property\n */\nclass TextTranslateAnchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is TextTranslateAnchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"TextTranslateAnchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The text is translated relative to the map.\n     */\n    @JvmField\n    val MAP = TextTranslateAnchor(\"map\")\n    /**\n     * The text is translated relative to the viewport.\n     */\n    @JvmField\n    val VIEWPORT = TextTranslateAnchor(\"viewport\")\n\n    /**\n     * Utility function to get [TextTranslateAnchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): TextTranslateAnchor {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"TextTranslateAnchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// CIRCLE_PITCH_ALIGNMENT: Orientation of circle when map is pitched.\n/**\n * Orientation of circle when map is pitched.\n *\n * @param value String value of this property\n */\nclass CirclePitchAlignment private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is CirclePitchAlignment &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"CirclePitchAlignment(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The circle is aligned to the plane of the map.\n     */\n    @JvmField\n    val MAP = CirclePitchAlignment(\"map\")\n    /**\n     * The circle is aligned to the plane of the viewport.\n     */\n    @JvmField\n    val VIEWPORT = CirclePitchAlignment(\"viewport\")\n\n    /**\n     * Utility function to get [CirclePitchAlignment] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): CirclePitchAlignment {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"CirclePitchAlignment.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// CIRCLE_PITCH_SCALE: Controls the scaling behavior of the circle when the map is pitched.\n/**\n * Controls the scaling behavior of the circle when the map is pitched.\n *\n * @param value String value of this property\n */\nclass CirclePitchScale private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is CirclePitchScale &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"CirclePitchScale(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Circles are scaled according to their apparent distance to the camera.\n     */\n    @JvmField\n    val MAP = CirclePitchScale(\"map\")\n    /**\n     * Circles are not scaled.\n     */\n    @JvmField\n    val VIEWPORT = CirclePitchScale(\"viewport\")\n\n    /**\n     * Utility function to get [CirclePitchScale] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): CirclePitchScale {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"CirclePitchScale.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// CIRCLE_TRANSLATE_ANCHOR: Controls the frame of reference for `circle-translate`.\n/**\n * Controls the frame of reference for `circle-translate`.\n *\n * @param value String value of this property\n */\nclass CircleTranslateAnchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is CircleTranslateAnchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"CircleTranslateAnchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The circle is translated relative to the map.\n     */\n    @JvmField\n    val MAP = CircleTranslateAnchor(\"map\")\n    /**\n     * The circle is translated relative to the viewport.\n     */\n    @JvmField\n    val VIEWPORT = CircleTranslateAnchor(\"viewport\")\n\n    /**\n     * Utility function to get [CircleTranslateAnchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): CircleTranslateAnchor {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"CircleTranslateAnchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// FILL_EXTRUSION_BASE_ALIGNMENT: Controls the behavior of fill extrusion base over terrain\n/**\n * Controls the behavior of fill extrusion base over terrain\n *\n * @param value String value of this property\n */\n@MapboxExperimental\nclass FillExtrusionBaseAlignment private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is FillExtrusionBaseAlignment &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"FillExtrusionBaseAlignment(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The fill extrusion base follows terrain slope.\n     */\n    @JvmField\n    val TERRAIN = FillExtrusionBaseAlignment(\"terrain\")\n    /**\n     * The fill extrusion base is flat over terrain.\n     */\n    @JvmField\n    val FLAT = FillExtrusionBaseAlignment(\"flat\")\n\n    /**\n     * Utility function to get [FillExtrusionBaseAlignment] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): FillExtrusionBaseAlignment {\n      return when (value) {\n        \"TERRAIN\" -> TERRAIN\n        \"FLAT\" -> FLAT\n        else -> throw RuntimeException(\"FillExtrusionBaseAlignment.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// FILL_EXTRUSION_HEIGHT_ALIGNMENT: Controls the behavior of fill extrusion height over terrain\n/**\n * Controls the behavior of fill extrusion height over terrain\n *\n * @param value String value of this property\n */\n@MapboxExperimental\nclass FillExtrusionHeightAlignment private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is FillExtrusionHeightAlignment &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"FillExtrusionHeightAlignment(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The fill extrusion height follows terrain slope.\n     */\n    @JvmField\n    val TERRAIN = FillExtrusionHeightAlignment(\"terrain\")\n    /**\n     * The fill extrusion height is flat over terrain.\n     */\n    @JvmField\n    val FLAT = FillExtrusionHeightAlignment(\"flat\")\n\n    /**\n     * Utility function to get [FillExtrusionHeightAlignment] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): FillExtrusionHeightAlignment {\n      return when (value) {\n        \"TERRAIN\" -> TERRAIN\n        \"FLAT\" -> FLAT\n        else -> throw RuntimeException(\"FillExtrusionHeightAlignment.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// FILL_EXTRUSION_TRANSLATE_ANCHOR: Controls the frame of reference for `fill-extrusion-translate`.\n/**\n * Controls the frame of reference for `fill-extrusion-translate`.\n *\n * @param value String value of this property\n */\nclass FillExtrusionTranslateAnchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is FillExtrusionTranslateAnchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"FillExtrusionTranslateAnchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The fill extrusion is translated relative to the map.\n     */\n    @JvmField\n    val MAP = FillExtrusionTranslateAnchor(\"map\")\n    /**\n     * The fill extrusion is translated relative to the viewport.\n     */\n    @JvmField\n    val VIEWPORT = FillExtrusionTranslateAnchor(\"viewport\")\n\n    /**\n     * Utility function to get [FillExtrusionTranslateAnchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): FillExtrusionTranslateAnchor {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"FillExtrusionTranslateAnchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// RASTER_RESAMPLING: The resampling/interpolation method to use for overscaling, also known as texture magnification filter\n/**\n * The resampling/interpolation method to use for overscaling, also known as texture magnification filter\n *\n * @param value String value of this property\n */\nclass RasterResampling private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is RasterResampling &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"RasterResampling(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * (Bi)linear filtering interpolates pixel values using the weighted average of the four closest original source pixels creating a smooth but blurry look when overscaled\n     */\n    @JvmField\n    val LINEAR = RasterResampling(\"linear\")\n    /**\n     * Nearest neighbor filtering interpolates pixel values using the nearest original source pixel creating a sharp but pixelated look when overscaled\n     */\n    @JvmField\n    val NEAREST = RasterResampling(\"nearest\")\n\n    /**\n     * Utility function to get [RasterResampling] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): RasterResampling {\n      return when (value) {\n        \"LINEAR\" -> LINEAR\n        \"NEAREST\" -> NEAREST\n        else -> throw RuntimeException(\"RasterResampling.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// HILLSHADE_ILLUMINATION_ANCHOR: Direction of light source when map is rotated.\n/**\n * Direction of light source when map is rotated.\n *\n * @param value String value of this property\n */\nclass HillshadeIlluminationAnchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is HillshadeIlluminationAnchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"HillshadeIlluminationAnchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The hillshade illumination is relative to the north direction.\n     */\n    @JvmField\n    val MAP = HillshadeIlluminationAnchor(\"map\")\n    /**\n     * The hillshade illumination is relative to the top of the viewport.\n     */\n    @JvmField\n    val VIEWPORT = HillshadeIlluminationAnchor(\"viewport\")\n\n    /**\n     * Utility function to get [HillshadeIlluminationAnchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): HillshadeIlluminationAnchor {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"HillshadeIlluminationAnchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// MODEL_ELEVATION_REFERENCE: Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time.\n/**\n * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. When using vector tiled source as the model layer source and hd-road-markup elevation reference, this property acts as layout property and elevation is evaluated only in tile loading time.\n *\n * @param value String value of this property\n */\nclass ModelElevationReference private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is ModelElevationReference &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"ModelElevationReference(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Elevated rendering is enabled. Use this mode to elevate models relative to the sea level.\n     */\n    @JvmField\n    val SEA = ModelElevationReference(\"sea\")\n    /**\n     * Elevated rendering is enabled. Use this mode to elevate models relative to the ground's height below them.\n     */\n    @JvmField\n    val GROUND = ModelElevationReference(\"ground\")\n    /**\n     * Elevated rendering is enabled. Use this mode to describe additive and stackable features that should exist only on top of road polygons.\n     */\n    @JvmField\n    val HD_ROAD_MARKUP = ModelElevationReference(\"hd-road-markup\")\n\n    /**\n     * Utility function to get [ModelElevationReference] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): ModelElevationReference {\n      return when (value) {\n        \"SEA\" -> SEA\n        \"GROUND\" -> GROUND\n        \"HD_ROAD_MARKUP\" -> HD_ROAD_MARKUP\n        else -> throw RuntimeException(\"ModelElevationReference.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// MODEL_SCALE_MODE: Defines scaling mode. Only applies to location-indicator type layers.\n/**\n * Defines scaling mode. Only applies to location-indicator type layers.\n *\n * @param value String value of this property\n */\nclass ModelScaleMode private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is ModelScaleMode &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"ModelScaleMode(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Model is scaled so that it's always the same size relative to other map features. The property model-scale specifies how many meters each unit in the model file should cover.\n     */\n    @JvmField\n    val MAP = ModelScaleMode(\"map\")\n    /**\n     * Model is scaled so that it's always the same size on the screen. The property model-scale specifies how many pixels each unit in model file should cover.\n     */\n    @JvmField\n    val VIEWPORT = ModelScaleMode(\"viewport\")\n\n    /**\n     * Utility function to get [ModelScaleMode] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): ModelScaleMode {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"ModelScaleMode.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// MODEL_TYPE: Defines rendering behavior of model in respect to other 3D scene objects.\n/**\n * Defines rendering behavior of model in respect to other 3D scene objects.\n *\n * @param value String value of this property\n */\nclass ModelType private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is ModelType &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"ModelType(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Integrated to 3D scene, using depth testing, along with terrain, fill-extrusions and custom layer.\n     */\n    @JvmField\n    val COMMON_3D = ModelType(\"common-3d\")\n    /**\n     * Displayed over other 3D content, occluded by terrain.\n     */\n    @JvmField\n    val LOCATION_INDICATOR = ModelType(\"location-indicator\")\n\n    /**\n     * Utility function to get [ModelType] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): ModelType {\n      return when (value) {\n        \"COMMON_3D\" -> COMMON_3D\n        \"LOCATION_INDICATOR\" -> LOCATION_INDICATOR\n        else -> throw RuntimeException(\"ModelType.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// BACKGROUND_PITCH_ALIGNMENT: Orientation of background layer.\n/**\n * Orientation of background layer.\n *\n * @param value String value of this property\n */\n@MapboxExperimental\nclass BackgroundPitchAlignment private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is BackgroundPitchAlignment &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"BackgroundPitchAlignment(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The background is aligned to the plane of the map.\n     */\n    @JvmField\n    val MAP = BackgroundPitchAlignment(\"map\")\n    /**\n     * The background is aligned to the plane of the viewport, covering the whole screen. Note: This mode disables the automatic reordering of the layer when terrain or globe projection is used.\n     */\n    @JvmField\n    val VIEWPORT = BackgroundPitchAlignment(\"viewport\")\n\n    /**\n     * Utility function to get [BackgroundPitchAlignment] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): BackgroundPitchAlignment {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"BackgroundPitchAlignment.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// SKY_TYPE: The type of the sky\n/**\n * The type of the sky\n *\n * @param value String value of this property\n */\nclass SkyType private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is SkyType &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"SkyType(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Renders the sky with a gradient that can be configured with `sky-gradient-radius` and `sky-gradient`.\n     */\n    @JvmField\n    val GRADIENT = SkyType(\"gradient\")\n    /**\n     * Renders the sky with a simulated atmospheric scattering algorithm, the sun direction can be attached to the light position or explicitly set through `sky-atmosphere-sun`.\n     */\n    @JvmField\n    val ATMOSPHERE = SkyType(\"atmosphere\")\n\n    /**\n     * Utility function to get [SkyType] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): SkyType {\n      return when (value) {\n        \"GRADIENT\" -> GRADIENT\n        \"ATMOSPHERE\" -> ATMOSPHERE\n        else -> throw RuntimeException(\"SkyType.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// ANCHOR: Whether extruded geometries are lit relative to the map or viewport.\n/**\n * Whether extruded geometries are lit relative to the map or viewport.\n *\n * @param value String value of this property\n */\nclass Anchor private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is Anchor &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"Anchor(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The position of the light source is aligned to the rotation of the map.\n     */\n    @JvmField\n    val MAP = Anchor(\"map\")\n    /**\n     * The position of the light source is aligned to the rotation of the viewport. If terrain is enabled, performance regressions may occur in certain scenarios, particularly on lower-end hardware. Ensure that you test your target scenarios on the appropriate hardware to verify performance.\n     */\n    @JvmField\n    val VIEWPORT = Anchor(\"viewport\")\n\n    /**\n     * Utility function to get [Anchor] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): Anchor {\n      return when (value) {\n        \"MAP\" -> MAP\n        \"VIEWPORT\" -> VIEWPORT\n        else -> throw RuntimeException(\"Anchor.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// NAME: The name of the projection to be used for rendering the map.\n/**\n * The name of the projection to be used for rendering the map.\n *\n * @param value String value of this property\n */\nclass ProjectionName private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is ProjectionName &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"ProjectionName(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * The Mercator projection is the default projection.\n     */\n    @JvmField\n    val MERCATOR = ProjectionName(\"mercator\")\n    /**\n     * A globe projection.\n     */\n    @JvmField\n    val GLOBE = ProjectionName(\"globe\")\n\n    /**\n     * Utility function to get [ProjectionName] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): ProjectionName {\n      return when (value) {\n        \"MERCATOR\" -> MERCATOR\n        \"GLOBE\" -> GLOBE\n        else -> throw RuntimeException(\"ProjectionName.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// TEXT_WRITING_MODE: The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n/**\n * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n *\n * @param value String value of this property\n */\nclass TextWritingMode private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is TextWritingMode &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"TextWritingMode(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * If a text's language supports horizontal writing mode, symbols would be laid out horizontally.\n     */\n    @JvmField\n    val HORIZONTAL = TextWritingMode(\"horizontal\")\n    /**\n     * If a text's language supports vertical writing mode, symbols would be laid out vertically.\n     */\n    @JvmField\n    val VERTICAL = TextWritingMode(\"vertical\")\n\n    /**\n     * Utility function to get [TextWritingMode] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): TextWritingMode {\n      return when (value) {\n        \"HORIZONTAL\" -> HORIZONTAL\n        \"VERTICAL\" -> VERTICAL\n        else -> throw RuntimeException(\"TextWritingMode.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n// CLIP_LAYER_TYPES: Layer types that will also be removed if fallen below this clip layer.\n/**\n * Layer types that will also be removed if fallen below this clip layer.\n *\n * @param value String value of this property\n */\nclass ClipLayerTypes private constructor(override val value: String) : LayerProperty {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is ClipLayerTypes &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"ClipLayerTypes(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * If present the clip layer would remove all 3d model layers below it. Currently only instanced models (e.g. trees) are removed.\n     */\n    @JvmField\n    val MODEL = ClipLayerTypes(\"model\")\n    /**\n     * If present the clip layer would remove all symbol layers below it.\n     */\n    @JvmField\n    val SYMBOL = ClipLayerTypes(\"symbol\")\n\n    /**\n     * Utility function to get [ClipLayerTypes] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): ClipLayerTypes {\n      return when (value) {\n        \"MODEL\" -> MODEL\n        \"SYMBOL\" -> SYMBOL\n        else -> throw RuntimeException(\"ClipLayerTypes.valueOf does not support [$value]\")\n      }\n    }\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/light/DynamicLight.kt",
    "content": "package com.mapbox.maps.extension.style.light\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.light.generated.AmbientLight\nimport com.mapbox.maps.extension.style.light.generated.DirectionalLight\n\n/**\n * Class representing dynamic light which is built with [AmbientLight] and [DirectionalLight].\n */\nclass DynamicLight internal constructor(\n  private val ambientLight: AmbientLight,\n  private val directionalLight: DirectionalLight,\n) : StyleContract.StyleLightExtension {\n\n  /**\n   * Bind the light to the Style.\n   *\n   * @param delegate The style delegate\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    delegate.setLight(ambientLight, directionalLight)\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/light/Light.kt",
    "content": "package com.mapbox.maps.extension.style.light\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.toValue\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.utils.unwrap\nimport com.mapbox.maps.logW\n\n/**\n * Base class for all light implementations.\n * Check the [online documentation](https://docs.mapbox.com/style-spec/reference/light/).\n */\nabstract class Light internal constructor() {\n  /**\n   * The ID of the Light.\n   */\n  abstract val lightId: String\n\n  /**\n   * Get the type of current light as a String.\n   */\n  @SuppressWarnings(\"HiddenAbstractMethod\")\n  internal abstract fun getType(): String\n\n  internal var delegate: MapboxStyleManager? = null\n\n  /**\n   * Properties of the light.\n   */\n  internal val lightProperties by lazy { HashMap<String, PropertyValue<*>>() }\n\n  /**\n   * Base properties of Light.\n   */\n  internal val internalLightProperties by lazy {\n    HashMap<String, Value>().also { map ->\n      map[\"id\"] = lightId.toValue()\n      map[\"type\"] = getType().toValue()\n    }\n  }\n\n  private fun updateProperty(propertyValue: PropertyValue<*>) {\n    val expected = delegate?.setStyleLightProperty(\n      lightId,\n      propertyValue.propertyName,\n      propertyValue.value\n    )\n    expected?.error?.let {\n      throw MapboxStyleException(\"Set light property failed: $it\")\n    }\n  }\n\n  internal inline fun <reified T> getPropertyValue(propertyName: String): T? {\n    return getPropertyValueWithType(propertyName, T::class.java)\n  }\n\n  private fun <T> getPropertyValueWithType(propertyName: String, clazz: Class<T>): T? {\n    delegate?.let {\n      return try {\n        it.getStyleLightProperty(lightId, propertyName).unwrap(clazz)\n      } catch (e: RuntimeException) {\n        logW(TAG, \"Get light property $propertyName failed: ${e.message}\")\n        logW(TAG, it.getStyleLightProperty(lightId, propertyName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $propertyName failed: light is not added to style yet.\")\n  }\n\n  internal fun setProperty(property: PropertyValue<*>) {\n    lightProperties[property.propertyName] = property\n    updateProperty(property)\n  }\n\n  internal fun getTransitionProperty(transitionName: String): StyleTransition? {\n    delegate?.let {\n      return try {\n        @Suppress(\"UNCHECKED_CAST\")\n        val styleLightProperty =\n          it.getStyleLightProperty(lightId, transitionName).value.contents as HashMap<String, Value>\n        val duration = styleLightProperty[\"duration\"]?.contents as Long\n        val delay = styleLightProperty[\"delay\"]?.contents as Long\n        StyleTransition.Builder().delay(delay).duration(duration).build()\n      } catch (e: RuntimeException) {\n        logW(TAG, \"Get light property failed: ${e.message}\")\n        logW(TAG, it.getStyleLightProperty(lightId, transitionName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $transitionName failed: light is not added to style yet.\")\n  }\n\n  /**\n   * Get a string representation of the Light.\n   *\n   * @return the string representation\n   */\n  override fun toString(): String {\n    return \"[${internalLightProperties.map { \"${it.key} = ${it.value}\" }.joinToString(\", \")}, ${lightProperties.values.joinToString { propertyValue -> \"${propertyValue.propertyName} = ${propertyValue.value}\" }}}]\"\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val TAG = \"Mbgl-Light\"\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/light/LightExt.kt",
    "content": "@file:JvmName(\"LightUtils\")\n\npackage com.mapbox.maps.extension.style.light\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.toValue\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.light.generated.AmbientLight\nimport com.mapbox.maps.extension.style.light.generated.DirectionalLight\nimport com.mapbox.maps.extension.style.light.generated.FlatLight\nimport com.mapbox.maps.logW\nimport kotlin.collections.HashMap\n\n/**\n * Extension function to add dynamic light to the [Style].\n * dynamic light is built from [AmbientLight] and [DirectionalLight].\n *\n * @param [ambientLight] The ambient light to be added\n * @param [directionalLight] The directional light to be added\n */\nfun MapboxStyleManager.setLight(ambientLight: AmbientLight, directionalLight: DirectionalLight) {\n  val ambientLightParam = HashMap<String, Value>().apply {\n    this[LIGHT_PROPERTIES] = convertPropertyMapToValue(ambientLight.lightProperties)\n    this.putAll(ambientLight.internalLightProperties)\n  }\n  val directionalLightParam = HashMap<String, Value>().apply {\n    this[LIGHT_PROPERTIES] = convertPropertyMapToValue(directionalLight.lightProperties)\n    this.putAll(directionalLight.internalLightProperties)\n  }\n  ambientLight.delegate = this\n  directionalLight.delegate = this\n  val valueList = ArrayList<Value>()\n  valueList.add(Value(ambientLightParam))\n  valueList.add(Value(directionalLightParam))\n  val expected = this.setStyleLights(Value(valueList))\n  expected.error?.let {\n    throw MapboxStyleException(\"Set dynamic light failed with error: $it\")\n  }\n}\n\n/**\n * Extension function to add the [FlatLight] to the [Style].\n *\n * @param [flatLight] The flat light to be added\n */\nfun MapboxStyleManager.setLight(flatLight: FlatLight) {\n  val flatLightParam = HashMap<String, Value>().apply {\n    this[LIGHT_PROPERTIES] = convertPropertyMapToValue(flatLight.lightProperties)\n    this.putAll(flatLight.internalLightProperties)\n  }\n  flatLight.delegate = this\n  val valueList = ArrayList<Value>()\n  valueList.add(Value(flatLightParam))\n  val expected = this.setStyleLights(Value(valueList))\n  expected.error?.let {\n    throw MapboxStyleException(\"Set flat light failed with error: $it\")\n  }\n}\n\n/**\n * Extension function to add list of lights.\n *\n * Note: not all variations of lights is supported.\n *\n * @param lights list of [Light]\n */\nfun MapboxStyleManager.setLights(lights: List<Light>) {\n  val valueList = ArrayList<Value>()\n  for (light in lights) {\n    val lightParams = HashMap<String, Value>().apply {\n      this[LIGHT_PROPERTIES] = convertPropertyMapToValue(light.lightProperties)\n      this.putAll(light.internalLightProperties)\n    }.toValue()\n    light.delegate = this\n    valueList.add(lightParams)\n  }\n  val expected = this.setStyleLights(Value(valueList))\n  expected.error?.let {\n    throw MapboxStyleException(\"setStyleLights failed with error: $it\")\n  }\n}\n\nprivate fun convertPropertyMapToValue(property: HashMap<String, PropertyValue<*>>): Value {\n  val propertyMap = HashMap<String, Value>()\n  property.forEach {\n    propertyMap[it.key] = it.value.value\n  }\n  return propertyMap.toValue()\n}\n\n/**\n * Extension function to get 3D Light that has been applied to the style.\n *\n * @param lightId Id of dynamic light.\n */\nfun MapboxStyleManager.getLight(lightId: String): Light? {\n  return when (val type = getStyleLights().firstOrNull { it.id == lightId }?.type) {\n    \"ambient\" -> AmbientLight(lightId)\n    \"directional\" -> DirectionalLight(lightId)\n    \"flat\" -> FlatLight(lightId)\n    else -> {\n      logW(TAG, \"Light type: $type unknown.\")\n      null\n    }\n  }?.also { result ->\n    result.delegate = this\n  }\n}\n\n/**\n * DSL function for creating [DynamicLight] instance.\n *\n * @param ambientLight the [AmbientLight] to set.\n * @param directionalLight the [DirectionalLight] to set.\n */\nfun dynamicLight(\n  ambientLight: AmbientLight,\n  directionalLight: DirectionalLight\n): DynamicLight = DynamicLight(\n  ambientLight,\n  directionalLight\n)\n\n@PublishedApi\ninternal const val TAG = \"Mbgl-LightUtils\"\ninternal const val LIGHT_PROPERTIES = \"properties\""
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/light/LightPosition.kt",
    "content": "package com.mapbox.maps.extension.style.light\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.style.types.LightDsl\nimport com.mapbox.maps.extension.style.utils.TypeUtils\n\n/**\n * Position of the light source relative to lit (extruded) geometries.\n *\n *\n * The position is constructed out of a radial coordinate, an azimuthal angle and a polar angle.\n * where the radial coordinate indicates the distance from the center of the base of an object to its light, the\n * azimuthal angle indicates the position of the light relative to 0 degree (0 degree when\n * [com.mapbox.mapboxsdk.style.layers.Property.ANCHOR] is set to viewport corresponds to the top of the\n * viewport, or 0 degree when [com.mapbox.mapboxsdk.style.layers.Property.ANCHOR] is set to map corresponds to due\n * north, and degrees proceed clockwise), and polar indicates the height of the light\n * (from 0 degree, directly above, to 180 degree, directly below).\n *\n * @param radialCoordinate the distance from the center of the base of an object to its light\n * @param azimuthalAngle the position of the light relative to 0 degree\n * @param polarAngle the height of the light\n */\n@LightDsl\ndata class LightPosition(\n  private val radialCoordinate: Double,\n  private val azimuthalAngle: Double,\n  private val polarAngle: Double\n) {\n  /**\n   * Convert this position to a [Value].\n   */\n  fun toValue(): Value {\n    return TypeUtils.wrapToValue(doubleArrayOf(radialCoordinate, azimuthalAngle, polarAngle))\n  }\n\n  /**\n   * Convert this position to a [DoubleArray].\n   */\n  fun toDoubleArray(): DoubleArray {\n    return doubleArrayOf(radialCoordinate, azimuthalAngle, polarAngle)\n  }\n\n  /**\n   * Convert this position to a [DoubleArray].\n   */\n  fun toList(): List<Double> {\n    return listOf(radialCoordinate, azimuthalAngle, polarAngle)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /**\n     * Construct a [LightPosition] object from [DoubleArray].\n     */\n    fun fromArray(\n      positionArray: DoubleArray\n    ): LightPosition {\n      return LightPosition(\n        positionArray[0],\n        positionArray[1],\n        positionArray[2]\n      )\n    }\n\n    /**\n     * Construct a [LightPosition] object from [List].\n     */\n    fun fromList(\n      positionList: List<Double>\n    ): LightPosition {\n      return LightPosition(\n        positionList[0],\n        positionList[1],\n        positionList[2]\n      )\n    }\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/light/generated/AmbientLight.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.light.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.light.Light\nimport com.mapbox.maps.extension.style.types.LightDsl\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\n\n/**\n * An indirect light affecting all objects in the map adding a constant amount of light on them. It has no explicit direction and cannot cast shadows.\n *\n * Check the [online documentation](https://docs.mapbox.com/style-spec/reference/light/).\n */\n@UiThread\nclass AmbientLight internal constructor(override val lightId: String) : AmbientLightDslReceiver, Light() {\n\n  /**\n   * Color of the ambient light. Default value: \"#ffffff\".\n   */\n  val colorAsColorInt: Int?\n    /**\n     * Color of the ambient light. Default value: \"#ffffff\".\n     *\n     * @return color as int\n     */\n    @ColorInt\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorInt(it)\n    }\n  /**\n   * Color of the ambient light. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  override fun color(@ColorInt color: Int): AmbientLight = apply {\n    val propertyValue = PropertyValue(\"color\", colorIntToRgbaExpression(color))\n    setProperty(propertyValue)\n  }\n  /**\n   * Color of the ambient light. Default value: \"#ffffff\".\n   */\n  val color: String?\n    /**\n     * Color of the ambient light. Default value: \"#ffffff\".\n     *\n     * @return color as String\n     */\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorString(it)\n    }\n  /**\n   * Color of the ambient light. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  override fun color(color: String): AmbientLight = apply {\n    setProperty(PropertyValue(\"color\", color))\n  }\n\n  /**\n   * Color of the ambient light. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"color\".\n   */\n  val colorAsExpression: Expression?\n    /**\n     * Color of the ambient light. Default value: \"#ffffff\".\n     *\n     * Get the Color property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * Color of the ambient light. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  override fun color(color: Expression): AmbientLight = apply {\n    val propertyValue = PropertyValue(\"color\", color)\n    setProperty(propertyValue)\n  }\n  /**\n   * Color property transition options.\n   */\n  val colorTransition: StyleTransition?\n    /**\n     * Get the Color property transition options.\n     *\n     * @return transition options for color\n     */\n    get() = getTransitionProperty(\"color-transition\")\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  override fun colorTransition(options: StyleTransition): AmbientLight = apply {\n    val propertyValue = PropertyValue(\"color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [colorTransition].\n   */\n  override fun colorTransition(block: StyleTransition.Builder.() -> Unit): AmbientLight = apply {\n    colorTransition(StyleTransition.Builder().apply(block).build())\n  }\n  /**\n   * A multiplier for the color of the ambient light. Default value: 0.5. Value range: [0, 1]\n   */\n  val intensity: Double?\n    /**\n     * A multiplier for the color of the ambient light. Default value: 0.5. Value range: [0, 1]\n     *\n     * @return intensity as Double\n     */\n    get() = getPropertyValue(\"intensity\")\n  /**\n   * A multiplier for the color of the ambient light. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  override fun intensity(intensity: Double): AmbientLight = apply {\n    setProperty(PropertyValue(\"intensity\", intensity))\n  }\n\n  /**\n   * A multiplier for the color of the ambient light. Default value: 0.5. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"intensity\".\n   */\n  val intensityAsExpression: Expression?\n    /**\n     * A multiplier for the color of the ambient light. Default value: 0.5. Value range: [0, 1]\n     *\n     * Get the Intensity property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"intensity\")?.let {\n        return it\n      }\n      intensity?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * A multiplier for the color of the ambient light. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  override fun intensity(intensity: Expression): AmbientLight = apply {\n    val propertyValue = PropertyValue(\"intensity\", intensity)\n    setProperty(propertyValue)\n  }\n  /**\n   * Intensity property transition options.\n   */\n  val intensityTransition: StyleTransition?\n    /**\n     * Get the Intensity property transition options.\n     *\n     * @return transition options for intensity\n     */\n    get() = getTransitionProperty(\"intensity-transition\")\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  override fun intensityTransition(options: StyleTransition): AmbientLight = apply {\n    val propertyValue = PropertyValue(\"intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [intensityTransition].\n   */\n  override fun intensityTransition(block: StyleTransition.Builder.() -> Unit): AmbientLight = apply {\n    intensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  val colorUseTheme: String?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * @return colorUseTheme as String\n     */\n    get() = getPropertyValue(\"color-use-theme\")\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: String): AmbientLight = apply {\n    setProperty(PropertyValue(\"color-use-theme\", colorUseTheme))\n  }\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * This is an Expression representation of \"color-use-theme\".\n   */\n  @MapboxExperimental\n  val colorUseThemeAsExpression: Expression?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * Get the ColorUseTheme property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color-use-theme\")?.let {\n        return it\n      }\n      colorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: Expression): AmbientLight = apply {\n    val propertyValue = PropertyValue(\"color-use-theme\", colorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this light\n   *\n   * @return Type of the light as [String]\n   */\n  override fun getType(): String {\n    return \"ambient\"\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LightDsl\ninterface AmbientLightDslReceiver {\n\n  /**\n   * Color of the ambient light. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  fun color(@ColorInt color: Int): AmbientLight\n  /**\n   * Color of the ambient light. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  fun color(color: String = \"#ffffff\"): AmbientLight\n\n  /**\n   * Color of the ambient light. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  fun color(color: Expression): AmbientLight\n\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  fun colorTransition(options: StyleTransition): AmbientLight\n\n  /**\n   * DSL for [colorTransition].\n   */\n  fun colorTransition(block: StyleTransition.Builder.() -> Unit): AmbientLight\n  /**\n   * A multiplier for the color of the ambient light. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  fun intensity(intensity: Double = 0.5): AmbientLight\n\n  /**\n   * A multiplier for the color of the ambient light. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  fun intensity(intensity: Expression): AmbientLight\n\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  fun intensityTransition(options: StyleTransition): AmbientLight\n\n  /**\n   * DSL for [intensityTransition].\n   */\n  fun intensityTransition(block: StyleTransition.Builder.() -> Unit): AmbientLight\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: String): AmbientLight\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: Expression): AmbientLight\n}\n\n/**\n * DSL function for creating [ambientLight] instance.\n */\nfun ambientLight(id: String = \"ambient\", block: AmbientLightDslReceiver.() -> Unit): AmbientLight = AmbientLight(id).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/light/generated/DirectionalLight.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.light.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.light.Light\nimport com.mapbox.maps.extension.style.types.LightDsl\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\n\n/**\n * A light that has a direction and is located at infinite distance, so its rays are parallel. It simulates the sun light and can cast shadows.\n *\n * Check the [online documentation](https://docs.mapbox.com/style-spec/reference/light/).\n */\n@UiThread\nclass DirectionalLight internal constructor(override val lightId: String) : DirectionalLightDslReceiver, Light() {\n\n  /**\n   * Enable/Disable shadow casting for this light Default value: false.\n   */\n  val castShadows: Boolean?\n    /**\n     * Enable/Disable shadow casting for this light Default value: false.\n     *\n     * @return castShadows as Boolean\n     */\n    get() = getPropertyValue(\"cast-shadows\")\n  /**\n   * Enable/Disable shadow casting for this light Default value: false.\n   *\n   * @param castShadows as Boolean\n   */\n  override fun castShadows(castShadows: Boolean): DirectionalLight = apply {\n    setProperty(PropertyValue(\"cast-shadows\", castShadows))\n  }\n\n  /**\n   * Enable/Disable shadow casting for this light Default value: false.\n   *\n   * This is an Expression representation of \"cast-shadows\".\n   */\n  val castShadowsAsExpression: Expression?\n    /**\n     * Enable/Disable shadow casting for this light Default value: false.\n     *\n     * Get the CastShadows property as an Expression\n     *\n     * @return Boolean\n     */\n    get() {\n      getPropertyValue<Expression>(\"cast-shadows\")?.let {\n        return it\n      }\n      castShadows?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Enable/Disable shadow casting for this light Default value: false.\n   *\n   * @param castShadows value of castShadows as Expression\n   */\n  override fun castShadows(castShadows: Expression): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"cast-shadows\", castShadows)\n    setProperty(propertyValue)\n  }\n  /**\n   * Color of the directional light. Default value: \"#ffffff\".\n   */\n  val colorAsColorInt: Int?\n    /**\n     * Color of the directional light. Default value: \"#ffffff\".\n     *\n     * @return color as int\n     */\n    @ColorInt\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorInt(it)\n    }\n  /**\n   * Color of the directional light. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  override fun color(@ColorInt color: Int): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"color\", colorIntToRgbaExpression(color))\n    setProperty(propertyValue)\n  }\n  /**\n   * Color of the directional light. Default value: \"#ffffff\".\n   */\n  val color: String?\n    /**\n     * Color of the directional light. Default value: \"#ffffff\".\n     *\n     * @return color as String\n     */\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorString(it)\n    }\n  /**\n   * Color of the directional light. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  override fun color(color: String): DirectionalLight = apply {\n    setProperty(PropertyValue(\"color\", color))\n  }\n\n  /**\n   * Color of the directional light. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"color\".\n   */\n  val colorAsExpression: Expression?\n    /**\n     * Color of the directional light. Default value: \"#ffffff\".\n     *\n     * Get the Color property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * Color of the directional light. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  override fun color(color: Expression): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"color\", color)\n    setProperty(propertyValue)\n  }\n  /**\n   * Color property transition options.\n   */\n  val colorTransition: StyleTransition?\n    /**\n     * Get the Color property transition options.\n     *\n     * @return transition options for color\n     */\n    get() = getTransitionProperty(\"color-transition\")\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  override fun colorTransition(options: StyleTransition): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [colorTransition].\n   */\n  override fun colorTransition(block: StyleTransition.Builder.() -> Unit): DirectionalLight = apply {\n    colorTransition(StyleTransition.Builder().apply(block).build())\n  }\n  /**\n   * Direction of the light source specified as [a azimuthal angle, p polar angle] where a indicates the azimuthal angle of the light relative to north (in degrees and proceeding clockwise), and p indicates polar angle of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n   */\n  val direction: List<Double>?\n    /**\n     * Direction of the light source specified as [a azimuthal angle, p polar angle] where a indicates the azimuthal angle of the light relative to north (in degrees and proceeding clockwise), and p indicates polar angle of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n     *\n     * @return direction as List<Double>\n     */\n    get() = getPropertyValue(\"direction\")\n  /**\n   * Direction of the light source specified as [a azimuthal angle, p polar angle] where a indicates the azimuthal angle of the light relative to north (in degrees and proceeding clockwise), and p indicates polar angle of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n   *\n   * @param direction as List<Double>\n   */\n  override fun direction(direction: List<Double>): DirectionalLight = apply {\n    setProperty(PropertyValue(\"direction\", direction))\n  }\n\n  /**\n   * Direction of the light source specified as [a azimuthal angle, p polar angle] where a indicates the azimuthal angle of the light relative to north (in degrees and proceeding clockwise), and p indicates polar angle of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n   *\n   * This is an Expression representation of \"direction\".\n   */\n  val directionAsExpression: Expression?\n    /**\n     * Direction of the light source specified as [a azimuthal angle, p polar angle] where a indicates the azimuthal angle of the light relative to north (in degrees and proceeding clockwise), and p indicates polar angle of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n     *\n     * Get the Direction property as an Expression\n     *\n     * @return List<Double>\n     */\n    get() {\n      getPropertyValue<Expression>(\"direction\")?.let {\n        return it\n      }\n      direction?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Direction of the light source specified as [a azimuthal angle, p polar angle] where a indicates the azimuthal angle of the light relative to north (in degrees and proceeding clockwise), and p indicates polar angle of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n   *\n   * @param direction value of direction as Expression\n   */\n  override fun direction(direction: Expression): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"direction\", direction)\n    setProperty(propertyValue)\n  }\n  /**\n   * Direction property transition options.\n   */\n  val directionTransition: StyleTransition?\n    /**\n     * Get the Direction property transition options.\n     *\n     * @return transition options for direction\n     */\n    get() = getTransitionProperty(\"direction-transition\")\n  /**\n   * Set the Direction property transition options.\n   *\n   * @param options transition options for direction\n   */\n  override fun directionTransition(options: StyleTransition): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"direction-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [directionTransition].\n   */\n  override fun directionTransition(block: StyleTransition.Builder.() -> Unit): DirectionalLight = apply {\n    directionTransition(StyleTransition.Builder().apply(block).build())\n  }\n  /**\n   * A multiplier for the color of the directional light. Default value: 0.5. Value range: [0, 1]\n   */\n  val intensity: Double?\n    /**\n     * A multiplier for the color of the directional light. Default value: 0.5. Value range: [0, 1]\n     *\n     * @return intensity as Double\n     */\n    get() = getPropertyValue(\"intensity\")\n  /**\n   * A multiplier for the color of the directional light. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  override fun intensity(intensity: Double): DirectionalLight = apply {\n    setProperty(PropertyValue(\"intensity\", intensity))\n  }\n\n  /**\n   * A multiplier for the color of the directional light. Default value: 0.5. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"intensity\".\n   */\n  val intensityAsExpression: Expression?\n    /**\n     * A multiplier for the color of the directional light. Default value: 0.5. Value range: [0, 1]\n     *\n     * Get the Intensity property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"intensity\")?.let {\n        return it\n      }\n      intensity?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * A multiplier for the color of the directional light. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  override fun intensity(intensity: Expression): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"intensity\", intensity)\n    setProperty(propertyValue)\n  }\n  /**\n   * Intensity property transition options.\n   */\n  val intensityTransition: StyleTransition?\n    /**\n     * Get the Intensity property transition options.\n     *\n     * @return transition options for intensity\n     */\n    get() = getTransitionProperty(\"intensity-transition\")\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  override fun intensityTransition(options: StyleTransition): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [intensityTransition].\n   */\n  override fun intensityTransition(block: StyleTransition.Builder.() -> Unit): DirectionalLight = apply {\n    intensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n  /**\n   * Specify a layer before which shadows are drawn on the ground. If not specified, shadows are drawn after the last 3D layer. This property does not affect shadows on terrain.\n   */\n  @MapboxExperimental\n  val shadowDrawBeforeLayer: String?\n    /**\n     * Specify a layer before which shadows are drawn on the ground. If not specified, shadows are drawn after the last 3D layer. This property does not affect shadows on terrain.\n     *\n     * @return shadowDrawBeforeLayer as String\n     */\n    get() = getPropertyValue(\"shadow-draw-before-layer\")\n  /**\n   * Specify a layer before which shadows are drawn on the ground. If not specified, shadows are drawn after the last 3D layer. This property does not affect shadows on terrain.\n   *\n   * @param shadowDrawBeforeLayer as String\n   */\n  @MapboxExperimental\n  override fun shadowDrawBeforeLayer(shadowDrawBeforeLayer: String): DirectionalLight = apply {\n    setProperty(PropertyValue(\"shadow-draw-before-layer\", shadowDrawBeforeLayer))\n  }\n\n  /**\n   * Specify a layer before which shadows are drawn on the ground. If not specified, shadows are drawn after the last 3D layer. This property does not affect shadows on terrain.\n   *\n   * This is an Expression representation of \"shadow-draw-before-layer\".\n   */\n  @MapboxExperimental\n  val shadowDrawBeforeLayerAsExpression: Expression?\n    /**\n     * Specify a layer before which shadows are drawn on the ground. If not specified, shadows are drawn after the last 3D layer. This property does not affect shadows on terrain.\n     *\n     * Get the ShadowDrawBeforeLayer property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"shadow-draw-before-layer\")?.let {\n        return it\n      }\n      shadowDrawBeforeLayer?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Specify a layer before which shadows are drawn on the ground. If not specified, shadows are drawn after the last 3D layer. This property does not affect shadows on terrain.\n   *\n   * @param shadowDrawBeforeLayer value of shadowDrawBeforeLayer as Expression\n   */\n  @MapboxExperimental\n  override fun shadowDrawBeforeLayer(shadowDrawBeforeLayer: Expression): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"shadow-draw-before-layer\", shadowDrawBeforeLayer)\n    setProperty(propertyValue)\n  }\n  /**\n   * Determines the shadow strength, affecting the shadow receiver surfaces final color. Values near 0.0 reduce the shadow contribution to the final color. Values near to 1.0 make occluded surfaces receive almost no directional light. Designed to be used mostly for transitioning between values 0 and 1. Default value: 1. Value range: [0, 1]\n   */\n  val shadowIntensity: Double?\n    /**\n     * Determines the shadow strength, affecting the shadow receiver surfaces final color. Values near 0.0 reduce the shadow contribution to the final color. Values near to 1.0 make occluded surfaces receive almost no directional light. Designed to be used mostly for transitioning between values 0 and 1. Default value: 1. Value range: [0, 1]\n     *\n     * @return shadowIntensity as Double\n     */\n    get() = getPropertyValue(\"shadow-intensity\")\n  /**\n   * Determines the shadow strength, affecting the shadow receiver surfaces final color. Values near 0.0 reduce the shadow contribution to the final color. Values near to 1.0 make occluded surfaces receive almost no directional light. Designed to be used mostly for transitioning between values 0 and 1. Default value: 1. Value range: [0, 1]\n   *\n   * @param shadowIntensity as Double\n   */\n  override fun shadowIntensity(shadowIntensity: Double): DirectionalLight = apply {\n    setProperty(PropertyValue(\"shadow-intensity\", shadowIntensity))\n  }\n\n  /**\n   * Determines the shadow strength, affecting the shadow receiver surfaces final color. Values near 0.0 reduce the shadow contribution to the final color. Values near to 1.0 make occluded surfaces receive almost no directional light. Designed to be used mostly for transitioning between values 0 and 1. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"shadow-intensity\".\n   */\n  val shadowIntensityAsExpression: Expression?\n    /**\n     * Determines the shadow strength, affecting the shadow receiver surfaces final color. Values near 0.0 reduce the shadow contribution to the final color. Values near to 1.0 make occluded surfaces receive almost no directional light. Designed to be used mostly for transitioning between values 0 and 1. Default value: 1. Value range: [0, 1]\n     *\n     * Get the ShadowIntensity property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"shadow-intensity\")?.let {\n        return it\n      }\n      shadowIntensity?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Determines the shadow strength, affecting the shadow receiver surfaces final color. Values near 0.0 reduce the shadow contribution to the final color. Values near to 1.0 make occluded surfaces receive almost no directional light. Designed to be used mostly for transitioning between values 0 and 1. Default value: 1. Value range: [0, 1]\n   *\n   * @param shadowIntensity value of shadowIntensity as Expression\n   */\n  override fun shadowIntensity(shadowIntensity: Expression): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"shadow-intensity\", shadowIntensity)\n    setProperty(propertyValue)\n  }\n  /**\n   * ShadowIntensity property transition options.\n   */\n  val shadowIntensityTransition: StyleTransition?\n    /**\n     * Get the ShadowIntensity property transition options.\n     *\n     * @return transition options for shadow-intensity\n     */\n    get() = getTransitionProperty(\"shadow-intensity-transition\")\n  /**\n   * Set the ShadowIntensity property transition options.\n   *\n   * @param options transition options for shadow-intensity\n   */\n  override fun shadowIntensityTransition(options: StyleTransition): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"shadow-intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [shadowIntensityTransition].\n   */\n  override fun shadowIntensityTransition(block: StyleTransition.Builder.() -> Unit): DirectionalLight = apply {\n    shadowIntensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  val colorUseTheme: String?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * @return colorUseTheme as String\n     */\n    get() = getPropertyValue(\"color-use-theme\")\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: String): DirectionalLight = apply {\n    setProperty(PropertyValue(\"color-use-theme\", colorUseTheme))\n  }\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * This is an Expression representation of \"color-use-theme\".\n   */\n  @MapboxExperimental\n  val colorUseThemeAsExpression: Expression?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * Get the ColorUseTheme property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color-use-theme\")?.let {\n        return it\n      }\n      colorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: Expression): DirectionalLight = apply {\n    val propertyValue = PropertyValue(\"color-use-theme\", colorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this light\n   *\n   * @return Type of the light as [String]\n   */\n  override fun getType(): String {\n    return \"directional\"\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LightDsl\ninterface DirectionalLightDslReceiver {\n  /**\n   * Enable/Disable shadow casting for this light Default value: false.\n   *\n   * @param castShadows as Boolean\n   */\n  fun castShadows(castShadows: Boolean = false): DirectionalLight\n\n  /**\n   * Enable/Disable shadow casting for this light Default value: false.\n   *\n   * @param castShadows value of castShadows as Expression\n   */\n  fun castShadows(castShadows: Expression): DirectionalLight\n\n  /**\n   * Color of the directional light. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  fun color(@ColorInt color: Int): DirectionalLight\n  /**\n   * Color of the directional light. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  fun color(color: String = \"#ffffff\"): DirectionalLight\n\n  /**\n   * Color of the directional light. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  fun color(color: Expression): DirectionalLight\n\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  fun colorTransition(options: StyleTransition): DirectionalLight\n\n  /**\n   * DSL for [colorTransition].\n   */\n  fun colorTransition(block: StyleTransition.Builder.() -> Unit): DirectionalLight\n  /**\n   * Direction of the light source specified as [a azimuthal angle, p polar angle] where a indicates the azimuthal angle of the light relative to north (in degrees and proceeding clockwise), and p indicates polar angle of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n   *\n   * @param direction as List<Double>\n   */\n  fun direction(direction: List<Double> = listOf(210.0, 30.0)): DirectionalLight\n\n  /**\n   * Direction of the light source specified as [a azimuthal angle, p polar angle] where a indicates the azimuthal angle of the light relative to north (in degrees and proceeding clockwise), and p indicates polar angle of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [210,30]. Minimum value: [0,0]. Maximum value: [360,90].\n   *\n   * @param direction value of direction as Expression\n   */\n  fun direction(direction: Expression): DirectionalLight\n\n  /**\n   * Set the Direction property transition options.\n   *\n   * @param options transition options for direction\n   */\n  fun directionTransition(options: StyleTransition): DirectionalLight\n\n  /**\n   * DSL for [directionTransition].\n   */\n  fun directionTransition(block: StyleTransition.Builder.() -> Unit): DirectionalLight\n  /**\n   * A multiplier for the color of the directional light. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  fun intensity(intensity: Double = 0.5): DirectionalLight\n\n  /**\n   * A multiplier for the color of the directional light. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  fun intensity(intensity: Expression): DirectionalLight\n\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  fun intensityTransition(options: StyleTransition): DirectionalLight\n\n  /**\n   * DSL for [intensityTransition].\n   */\n  fun intensityTransition(block: StyleTransition.Builder.() -> Unit): DirectionalLight\n  /**\n   * Specify a layer before which shadows are drawn on the ground. If not specified, shadows are drawn after the last 3D layer. This property does not affect shadows on terrain.\n   *\n   * @param shadowDrawBeforeLayer as String\n   */\n  @MapboxExperimental\n  fun shadowDrawBeforeLayer(shadowDrawBeforeLayer: String): DirectionalLight\n\n  /**\n   * Specify a layer before which shadows are drawn on the ground. If not specified, shadows are drawn after the last 3D layer. This property does not affect shadows on terrain.\n   *\n   * @param shadowDrawBeforeLayer value of shadowDrawBeforeLayer as Expression\n   */\n  @MapboxExperimental\n  fun shadowDrawBeforeLayer(shadowDrawBeforeLayer: Expression): DirectionalLight\n  /**\n   * Determines the shadow strength, affecting the shadow receiver surfaces final color. Values near 0.0 reduce the shadow contribution to the final color. Values near to 1.0 make occluded surfaces receive almost no directional light. Designed to be used mostly for transitioning between values 0 and 1. Default value: 1. Value range: [0, 1]\n   *\n   * @param shadowIntensity as Double\n   */\n  fun shadowIntensity(shadowIntensity: Double = 1.0): DirectionalLight\n\n  /**\n   * Determines the shadow strength, affecting the shadow receiver surfaces final color. Values near 0.0 reduce the shadow contribution to the final color. Values near to 1.0 make occluded surfaces receive almost no directional light. Designed to be used mostly for transitioning between values 0 and 1. Default value: 1. Value range: [0, 1]\n   *\n   * @param shadowIntensity value of shadowIntensity as Expression\n   */\n  fun shadowIntensity(shadowIntensity: Expression): DirectionalLight\n\n  /**\n   * Set the ShadowIntensity property transition options.\n   *\n   * @param options transition options for shadow-intensity\n   */\n  fun shadowIntensityTransition(options: StyleTransition): DirectionalLight\n\n  /**\n   * DSL for [shadowIntensityTransition].\n   */\n  fun shadowIntensityTransition(block: StyleTransition.Builder.() -> Unit): DirectionalLight\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: String): DirectionalLight\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: Expression): DirectionalLight\n}\n\n/**\n * DSL function for creating [directionalLight] instance.\n */\nfun directionalLight(id: String = \"directional\", block: DirectionalLightDslReceiver.() -> Unit): DirectionalLight = DirectionalLight(id).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/light/generated/FlatLight.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.light.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.layers.properties.generated.Anchor\nimport com.mapbox.maps.extension.style.light.Light\nimport com.mapbox.maps.extension.style.light.LightPosition\nimport com.mapbox.maps.extension.style.light.setLight\nimport com.mapbox.maps.extension.style.types.LightDsl\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport java.util.Locale\n\n/**\n * A global directional light source which is only applied on 3D and hillshade layers. Using this type disables other light sources.\n *\n * Check the [online documentation](https://docs.mapbox.com/style-spec/reference/light/).\n */\n@UiThread\nclass FlatLight internal constructor(override val lightId: String) : FlatLightDslReceiver, StyleContract.StyleLightExtension, Light() {\n\n  /**\n   * Whether extruded geometries are lit relative to the map or viewport. Default value: \"viewport\".\n   */\n  val anchor: Anchor?\n    /**\n     * Whether extruded geometries are lit relative to the map or viewport. Default value: \"viewport\".\n     *\n     * @return anchor as Anchor\n     */\n    get() = getPropertyValue<String>(\"anchor\")?.let {\n      Anchor.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n    }\n  /**\n   * Whether extruded geometries are lit relative to the map or viewport. Default value: \"viewport\".\n   *\n   * @param anchor as Anchor\n   */\n  override fun anchor(anchor: Anchor): FlatLight = apply {\n    setProperty(PropertyValue(\"anchor\", anchor))\n  }\n\n  /**\n   * Whether extruded geometries are lit relative to the map or viewport. Default value: \"viewport\".\n   *\n   * This is an Expression representation of \"anchor\".\n   */\n  val anchorAsExpression: Expression?\n    /**\n     * Whether extruded geometries are lit relative to the map or viewport. Default value: \"viewport\".\n     *\n     * Get the Anchor property as an Expression\n     *\n     * @return Anchor\n     */\n    get() {\n      getPropertyValue<Expression>(\"anchor\")?.let {\n        return it\n      }\n      anchor?.let {\n        return Expression.literal(it.value)\n      }\n      return null\n    }\n  /**\n   * Whether extruded geometries are lit relative to the map or viewport. Default value: \"viewport\".\n   *\n   * @param anchor value of anchor as Expression\n   */\n  override fun anchor(anchor: Expression): FlatLight = apply {\n    val propertyValue = PropertyValue(\"anchor\", anchor)\n    setProperty(propertyValue)\n  }\n  /**\n   * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n   */\n  val colorAsColorInt: Int?\n    /**\n     * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n     *\n     * @return color as int\n     */\n    @ColorInt\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorInt(it)\n    }\n  /**\n   * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  override fun color(@ColorInt color: Int): FlatLight = apply {\n    val propertyValue = PropertyValue(\"color\", colorIntToRgbaExpression(color))\n    setProperty(propertyValue)\n  }\n  /**\n   * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n   */\n  val color: String?\n    /**\n     * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n     *\n     * @return color as String\n     */\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorString(it)\n    }\n  /**\n   * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  override fun color(color: String): FlatLight = apply {\n    setProperty(PropertyValue(\"color\", color))\n  }\n\n  /**\n   * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"color\".\n   */\n  val colorAsExpression: Expression?\n    /**\n     * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n     *\n     * Get the Color property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  override fun color(color: Expression): FlatLight = apply {\n    val propertyValue = PropertyValue(\"color\", color)\n    setProperty(propertyValue)\n  }\n  /**\n   * Color property transition options.\n   */\n  val colorTransition: StyleTransition?\n    /**\n     * Get the Color property transition options.\n     *\n     * @return transition options for color\n     */\n    get() = getTransitionProperty(\"color-transition\")\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  override fun colorTransition(options: StyleTransition): FlatLight = apply {\n    val propertyValue = PropertyValue(\"color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [colorTransition].\n   */\n  override fun colorTransition(block: StyleTransition.Builder.() -> Unit): FlatLight = apply {\n    colorTransition(StyleTransition.Builder().apply(block).build())\n  }\n  /**\n   * Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast. Default value: 0.5. Value range: [0, 1]\n   */\n  val intensity: Double?\n    /**\n     * Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast. Default value: 0.5. Value range: [0, 1]\n     *\n     * @return intensity as Double\n     */\n    get() = getPropertyValue(\"intensity\")\n  /**\n   * Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  override fun intensity(intensity: Double): FlatLight = apply {\n    setProperty(PropertyValue(\"intensity\", intensity))\n  }\n\n  /**\n   * Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast. Default value: 0.5. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"intensity\".\n   */\n  val intensityAsExpression: Expression?\n    /**\n     * Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast. Default value: 0.5. Value range: [0, 1]\n     *\n     * Get the Intensity property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"intensity\")?.let {\n        return it\n      }\n      intensity?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  override fun intensity(intensity: Expression): FlatLight = apply {\n    val propertyValue = PropertyValue(\"intensity\", intensity)\n    setProperty(propertyValue)\n  }\n  /**\n   * Intensity property transition options.\n   */\n  val intensityTransition: StyleTransition?\n    /**\n     * Get the Intensity property transition options.\n     *\n     * @return transition options for intensity\n     */\n    get() = getTransitionProperty(\"intensity-transition\")\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  override fun intensityTransition(options: StyleTransition): FlatLight = apply {\n    val propertyValue = PropertyValue(\"intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [intensityTransition].\n   */\n  override fun intensityTransition(block: StyleTransition.Builder.() -> Unit): FlatLight = apply {\n    intensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n  /**\n   * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n   */\n  val position: LightPosition?\n    /**\n     * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n     *\n     * @return position as LightPosition\n     */\n    get() = getPropertyValue<List<Double>>(\"position\")?.let {\n      LightPosition.fromList(it)\n    }\n\n  /**\n   * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n   *\n   * DSL for setting [LightPosition].\n   */\n  override fun position(radialCoordinate: Double, azimuthalAngle: Double, polarAngle: Double): FlatLight = apply {\n    position(LightPosition(radialCoordinate, azimuthalAngle, polarAngle))\n  }\n  /**\n   * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n   *\n   * @param position as LightPosition\n   */\n  override fun position(position: LightPosition): FlatLight = apply {\n    setProperty(PropertyValue(\"position\", position))\n  }\n\n  /**\n   * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n   *\n   * This is an Expression representation of \"position\".\n   */\n  val positionAsExpression: Expression?\n    /**\n     * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n     *\n     * Get the Position property as an Expression\n     *\n     * @return LightPosition\n     */\n    get() {\n      getPropertyValue<Expression>(\"position\")?.let {\n        return it\n      }\n      position?.let {\n        return Expression.literal(it.toList())\n      }\n      return null\n    }\n  /**\n   * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n   *\n   * @param position value of position as Expression\n   */\n  override fun position(position: Expression): FlatLight = apply {\n    val propertyValue = PropertyValue(\"position\", position)\n    setProperty(propertyValue)\n  }\n  /**\n   * Position property transition options.\n   */\n  val positionTransition: StyleTransition?\n    /**\n     * Get the Position property transition options.\n     *\n     * @return transition options for position\n     */\n    get() = getTransitionProperty(\"position-transition\")\n  /**\n   * Set the Position property transition options.\n   *\n   * @param options transition options for position\n   */\n  override fun positionTransition(options: StyleTransition): FlatLight = apply {\n    val propertyValue = PropertyValue(\"position-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [positionTransition].\n   */\n  override fun positionTransition(block: StyleTransition.Builder.() -> Unit): FlatLight = apply {\n    positionTransition(StyleTransition.Builder().apply(block).build())\n  }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  val colorUseTheme: String?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * @return colorUseTheme as String\n     */\n    get() = getPropertyValue(\"color-use-theme\")\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: String): FlatLight = apply {\n    setProperty(PropertyValue(\"color-use-theme\", colorUseTheme))\n  }\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * This is an Expression representation of \"color-use-theme\".\n   */\n  @MapboxExperimental\n  val colorUseThemeAsExpression: Expression?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * Get the ColorUseTheme property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color-use-theme\")?.let {\n        return it\n      }\n      colorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: Expression): FlatLight = apply {\n    val propertyValue = PropertyValue(\"color-use-theme\", colorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Get the type of this light\n   *\n   * @return Type of the light as [String]\n   */\n  override fun getType(): String {\n    return \"flat\"\n  }\n\n  /**\n   * Bind the light to the Style.\n   *\n   * @param delegate The style delegate\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    delegate.setLight(this)\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@LightDsl\ninterface FlatLightDslReceiver {\n  /**\n   * Whether extruded geometries are lit relative to the map or viewport. Default value: \"viewport\".\n   *\n   * @param anchor as Anchor\n   */\n  fun anchor(anchor: Anchor = Anchor.VIEWPORT): FlatLight\n\n  /**\n   * Whether extruded geometries are lit relative to the map or viewport. Default value: \"viewport\".\n   *\n   * @param anchor value of anchor as Expression\n   */\n  fun anchor(anchor: Expression): FlatLight\n\n  /**\n   * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  fun color(@ColorInt color: Int): FlatLight\n  /**\n   * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  fun color(color: String = \"#ffffff\"): FlatLight\n\n  /**\n   * Color tint for lighting extruded geometries. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  fun color(color: Expression): FlatLight\n\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  fun colorTransition(options: StyleTransition): FlatLight\n\n  /**\n   * DSL for [colorTransition].\n   */\n  fun colorTransition(block: StyleTransition.Builder.() -> Unit): FlatLight\n  /**\n   * Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  fun intensity(intensity: Double = 0.5): FlatLight\n\n  /**\n   * Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast. Default value: 0.5. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  fun intensity(intensity: Expression): FlatLight\n\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  fun intensityTransition(options: StyleTransition): FlatLight\n\n  /**\n   * DSL for [intensityTransition].\n   */\n  fun intensityTransition(block: StyleTransition.Builder.() -> Unit): FlatLight\n\n  /**\n   * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n   *\n   * DSL for setting [LightPosition].\n   */\n  fun position(radialCoordinate: Double, azimuthalAngle: Double, polarAngle: Double): FlatLight\n  /**\n   * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n   *\n   * @param position as LightPosition\n   */\n  fun position(position: LightPosition = LightPosition(1.15, 210.0, 30.0)): FlatLight\n\n  /**\n   * Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0 degree (0 degree when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0 degree when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0 degree, directly above, to 180 degree, directly below). Default value: [1.15,210,30].\n   *\n   * @param position value of position as Expression\n   */\n  fun position(position: Expression): FlatLight\n\n  /**\n   * Set the Position property transition options.\n   *\n   * @param options transition options for position\n   */\n  fun positionTransition(options: StyleTransition): FlatLight\n\n  /**\n   * DSL for [positionTransition].\n   */\n  fun positionTransition(block: StyleTransition.Builder.() -> Unit): FlatLight\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: String): FlatLight\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: Expression): FlatLight\n}\n\n/**\n * DSL function for creating [flatLight] instance.\n */\nfun flatLight(id: String = \"flat\", block: FlatLightDslReceiver.() -> Unit): FlatLight = FlatLight(id).apply(block)\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/model/ModelExt.kt",
    "content": "@file:JvmName(\"ModelUtils\")\npackage com.mapbox.maps.extension.style.model\n\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\n\n/**\n * DSL function for [ModelExtensionImpl].\n */\n@MapboxExperimental\nfun model(modelId: String, block: ModelExtensionImpl.Builder.() -> Unit): ModelExtensionImpl =\n  ModelExtensionImpl.Builder(modelId).apply(block).build()\n\n/**\n * Extension function to add a model provided by the Style Extension to the Style.\n *\n * @param model The model to be added\n */\n@MapboxExperimental\nfun MapboxStyleManager.addModel(model: StyleContract.StyleModelExtension) {\n  model.bindTo(this)\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/model/ModelExtensionImpl.kt",
    "content": "package com.mapbox.maps.extension.style.model\n\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.utils.check\n\n/**\n * Concrete implementation of ModelPlugin, the plugin is used to add a 3D model to be used in the style.\n *\n * This API can also be used for updating a model. If the model id was already added, it gets replaced by the new model.\n */\n@MapboxExperimental\nclass ModelExtensionImpl(private val builder: Builder) : StyleContract.StyleModelExtension {\n  /**\n   * Add the model to the style.\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    delegate.addStyleModel(\n      builder.modelId,\n      builder.uri\n    ).check()\n  }\n\n  /**\n   * Builder for the [ModelExtensionImpl].\n   */\n  @MapboxExperimental\n  class Builder(\n    /**\n     * ID of the model.\n     */\n    val modelId: String\n  ) {\n    /**\n     * Uri for the model.\n     */\n    internal var uri: String = \"\"\n\n    /**\n     * Uri for the model.\n     */\n    fun uri(uri: String): Builder = apply {\n      this.uri = uri\n    }\n\n    /**\n     * Build the ModelExtensionImpl.\n     *\n     * @return ModelExtensionImpl\n     */\n    fun build(): ModelExtensionImpl {\n      if (this.uri.isEmpty()) {\n        throw IllegalStateException(\"3D Model extension requires model uri input.\")\n      }\n      return ModelExtensionImpl(this)\n    }\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/precipitations/generated/Rain.kt",
    "content": "// This file is generated.\npackage com.mapbox.maps.extension.style.precipitations.generated\n\nimport android.util.Log\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.types.RainDsl\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.unwrap\n\n/**\n * The experimental Rain API to render rain effect on the map.\n */\n@UiThread\n@MapboxExperimental\nclass Rain : RainDslReceiver, StyleContract.StyleRainExtension {\n  internal var delegate: MapboxStyleManager? = null\n  private val properties = HashMap<String, PropertyValue<*>>()\n\n  /**\n   * Thinning factor of rain particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.57. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val centerThinning: Double?\n    /**\n     * Thinning factor of rain particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.57. Value range: [0, 1]\n     *\n     * @return center-thinning as Double\n     */\n    get() = getPropertyValue(\"center-thinning\")\n\n  /**\n   * Thinning factor of rain particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.57. Value range: [0, 1]\n   *\n   * @param centerThinning as Double\n   */\n  @MapboxExperimental\n  override fun centerThinning(centerThinning: Double): Rain = apply {\n    setProperty(PropertyValue(\"center-thinning\", centerThinning))\n  }\n\n  /**\n   * CenterThinning property transition options.\n   */\n  @MapboxExperimental\n  val centerThinningTransition: StyleTransition?\n    /**\n     * Get the CenterThinning property transition options.\n     *\n     * @return transition options for center-thinning\n     */\n    get() = getTransitionProperty(\"center-thinning-transition\")\n\n  /**\n   * Set the CenterThinning property transition options.\n   *\n   * @param options transition options for center-thinning\n   */\n  @MapboxExperimental\n  override fun centerThinningTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"center-thinning-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [centerThinningTransition].\n   */\n  @MapboxExperimental\n  override fun centerThinningTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    centerThinningTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Thinning factor of rain particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.57. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"center-thinning\".\n   */\n  @MapboxExperimental\n  val centerThinningAsExpression: Expression?\n    /**\n     * Thinning factor of rain particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.57. Value range: [0, 1]\n     *\n     * Get the centerThinning property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"center-thinning\")?.let {\n        return it\n      }\n      centerThinning?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Thinning factor of rain particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.57. Value range: [0, 1]\n   *\n   * @param centerThinning value of centerThinning as Expression\n   */\n  @MapboxExperimental\n  override fun centerThinning(centerThinning: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"center-thinning\", centerThinning)\n    setProperty(propertyValue)\n  }\n  /**\n   * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   */\n  @MapboxExperimental\n  val colorAsColorInt: Int?\n    /**\n     * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n     *\n     * @return color as int\n     */\n    @ColorInt\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorInt(it)\n    }\n  /**\n   * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   *\n   * @param color as int\n   */\n  @MapboxExperimental\n  override fun color(@ColorInt color: Int): Rain = apply {\n    val propertyValue = PropertyValue(\"color\", colorIntToRgbaExpression(color))\n    setProperty(propertyValue)\n  }\n  /**\n   * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   */\n  @MapboxExperimental\n  val color: String?\n    /**\n     * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n     *\n     * @return color as String\n     */\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorString(it)\n    }\n\n  /**\n   * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   *\n   * @param color as String\n   */\n  @MapboxExperimental\n  override fun color(color: String): Rain = apply {\n    setProperty(PropertyValue(\"color\", color))\n  }\n\n  /**\n   * Color property transition options.\n   */\n  @MapboxExperimental\n  val colorTransition: StyleTransition?\n    /**\n     * Get the Color property transition options.\n     *\n     * @return transition options for color\n     */\n    get() = getTransitionProperty(\"color-transition\")\n\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  @MapboxExperimental\n  override fun colorTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [colorTransition].\n   */\n  @MapboxExperimental\n  override fun colorTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    colorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   *\n   * This is an Expression representation of \"color\".\n   */\n  @MapboxExperimental\n  val colorAsExpression: Expression?\n    /**\n     * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n     *\n     * Get the color property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   *\n   * @param color value of color as Expression\n   */\n  @MapboxExperimental\n  override fun color(color: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"color\", color)\n    setProperty(propertyValue)\n  }\n  /**\n   * Rain particles density. Controls the overall screen density of the rain. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val density: Double?\n    /**\n     * Rain particles density. Controls the overall screen density of the rain. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n     *\n     * @return density as Double\n     */\n    get() = getPropertyValue(\"density\")\n\n  /**\n   * Rain particles density. Controls the overall screen density of the rain. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n   *\n   * @param density as Double\n   */\n  @MapboxExperimental\n  override fun density(density: Double): Rain = apply {\n    setProperty(PropertyValue(\"density\", density))\n  }\n\n  /**\n   * Density property transition options.\n   */\n  @MapboxExperimental\n  val densityTransition: StyleTransition?\n    /**\n     * Get the Density property transition options.\n     *\n     * @return transition options for density\n     */\n    get() = getTransitionProperty(\"density-transition\")\n\n  /**\n   * Set the Density property transition options.\n   *\n   * @param options transition options for density\n   */\n  @MapboxExperimental\n  override fun densityTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"density-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [densityTransition].\n   */\n  @MapboxExperimental\n  override fun densityTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    densityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Rain particles density. Controls the overall screen density of the rain. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n   *\n   * This is an Expression representation of \"density\".\n   */\n  @MapboxExperimental\n  val densityAsExpression: Expression?\n    /**\n     * Rain particles density. Controls the overall screen density of the rain. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n     *\n     * Get the density property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"density\")?.let {\n        return it\n      }\n      density?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Rain particles density. Controls the overall screen density of the rain. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n   *\n   * @param density value of density as Expression\n   */\n  @MapboxExperimental\n  override fun density(density: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"density\", density)\n    setProperty(propertyValue)\n  }\n  /**\n   * Main rain particles direction. Azimuth and polar angles. Default value: [0,80]. Value range: [0, 360]\n   */\n  @MapboxExperimental\n  val direction: List<Double>?\n    /**\n     * Main rain particles direction. Azimuth and polar angles. Default value: [0,80]. Value range: [0, 360]\n     *\n     * @return direction as List<Double>\n     */\n    get() = getPropertyValue(\"direction\")\n\n  /**\n   * Main rain particles direction. Azimuth and polar angles. Default value: [0,80]. Value range: [0, 360]\n   *\n   * @param direction as List<Double>\n   */\n  @MapboxExperimental\n  override fun direction(direction: List<Double>): Rain = apply {\n    setProperty(PropertyValue(\"direction\", direction))\n  }\n\n  /**\n   * Direction property transition options.\n   */\n  @MapboxExperimental\n  val directionTransition: StyleTransition?\n    /**\n     * Get the Direction property transition options.\n     *\n     * @return transition options for direction\n     */\n    get() = getTransitionProperty(\"direction-transition\")\n\n  /**\n   * Set the Direction property transition options.\n   *\n   * @param options transition options for direction\n   */\n  @MapboxExperimental\n  override fun directionTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"direction-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [directionTransition].\n   */\n  @MapboxExperimental\n  override fun directionTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    directionTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Main rain particles direction. Azimuth and polar angles. Default value: [0,80]. Value range: [0, 360]\n   *\n   * This is an Expression representation of \"direction\".\n   */\n  @MapboxExperimental\n  val directionAsExpression: Expression?\n    /**\n     * Main rain particles direction. Azimuth and polar angles. Default value: [0,80]. Value range: [0, 360]\n     *\n     * Get the direction property as an Expression\n     *\n     * @return List<Double>\n     */\n    get() {\n      getPropertyValue<Expression>(\"direction\")?.let {\n        return it\n      }\n      direction?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Main rain particles direction. Azimuth and polar angles. Default value: [0,80]. Value range: [0, 360]\n   *\n   * @param direction value of direction as Expression\n   */\n  @MapboxExperimental\n  override fun direction(direction: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"direction\", direction)\n    setProperty(propertyValue)\n  }\n  /**\n   * Rain particles screen-space distortion strength. Default value: 0.7. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val distortionStrength: Double?\n    /**\n     * Rain particles screen-space distortion strength. Default value: 0.7. Value range: [0, 1]\n     *\n     * @return distortion-strength as Double\n     */\n    get() = getPropertyValue(\"distortion-strength\")\n\n  /**\n   * Rain particles screen-space distortion strength. Default value: 0.7. Value range: [0, 1]\n   *\n   * @param distortionStrength as Double\n   */\n  @MapboxExperimental\n  override fun distortionStrength(distortionStrength: Double): Rain = apply {\n    setProperty(PropertyValue(\"distortion-strength\", distortionStrength))\n  }\n\n  /**\n   * DistortionStrength property transition options.\n   */\n  @MapboxExperimental\n  val distortionStrengthTransition: StyleTransition?\n    /**\n     * Get the DistortionStrength property transition options.\n     *\n     * @return transition options for distortion-strength\n     */\n    get() = getTransitionProperty(\"distortion-strength-transition\")\n\n  /**\n   * Set the DistortionStrength property transition options.\n   *\n   * @param options transition options for distortion-strength\n   */\n  @MapboxExperimental\n  override fun distortionStrengthTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"distortion-strength-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [distortionStrengthTransition].\n   */\n  @MapboxExperimental\n  override fun distortionStrengthTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    distortionStrengthTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Rain particles screen-space distortion strength. Default value: 0.7. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"distortion-strength\".\n   */\n  @MapboxExperimental\n  val distortionStrengthAsExpression: Expression?\n    /**\n     * Rain particles screen-space distortion strength. Default value: 0.7. Value range: [0, 1]\n     *\n     * Get the distortionStrength property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"distortion-strength\")?.let {\n        return it\n      }\n      distortionStrength?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Rain particles screen-space distortion strength. Default value: 0.7. Value range: [0, 1]\n   *\n   * @param distortionStrength value of distortionStrength as Expression\n   */\n  @MapboxExperimental\n  override fun distortionStrength(distortionStrength: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"distortion-strength\", distortionStrength)\n    setProperty(propertyValue)\n  }\n  /**\n   * Rain droplet size. x - normal to direction, y - along direction Default value: [2.6,18.2]. Value range: [0, 50]\n   */\n  @MapboxExperimental\n  val dropletSize: List<Double>?\n    /**\n     * Rain droplet size. x - normal to direction, y - along direction Default value: [2.6,18.2]. Value range: [0, 50]\n     *\n     * @return droplet-size as List<Double>\n     */\n    get() = getPropertyValue(\"droplet-size\")\n\n  /**\n   * Rain droplet size. x - normal to direction, y - along direction Default value: [2.6,18.2]. Value range: [0, 50]\n   *\n   * @param dropletSize as List<Double>\n   */\n  @MapboxExperimental\n  override fun dropletSize(dropletSize: List<Double>): Rain = apply {\n    setProperty(PropertyValue(\"droplet-size\", dropletSize))\n  }\n\n  /**\n   * DropletSize property transition options.\n   */\n  @MapboxExperimental\n  val dropletSizeTransition: StyleTransition?\n    /**\n     * Get the DropletSize property transition options.\n     *\n     * @return transition options for droplet-size\n     */\n    get() = getTransitionProperty(\"droplet-size-transition\")\n\n  /**\n   * Set the DropletSize property transition options.\n   *\n   * @param options transition options for droplet-size\n   */\n  @MapboxExperimental\n  override fun dropletSizeTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"droplet-size-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [dropletSizeTransition].\n   */\n  @MapboxExperimental\n  override fun dropletSizeTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    dropletSizeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Rain droplet size. x - normal to direction, y - along direction Default value: [2.6,18.2]. Value range: [0, 50]\n   *\n   * This is an Expression representation of \"droplet-size\".\n   */\n  @MapboxExperimental\n  val dropletSizeAsExpression: Expression?\n    /**\n     * Rain droplet size. x - normal to direction, y - along direction Default value: [2.6,18.2]. Value range: [0, 50]\n     *\n     * Get the dropletSize property as an Expression\n     *\n     * @return List<Double>\n     */\n    get() {\n      getPropertyValue<Expression>(\"droplet-size\")?.let {\n        return it\n      }\n      dropletSize?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Rain droplet size. x - normal to direction, y - along direction Default value: [2.6,18.2]. Value range: [0, 50]\n   *\n   * @param dropletSize value of dropletSize as Expression\n   */\n  @MapboxExperimental\n  override fun dropletSize(dropletSize: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"droplet-size\", dropletSize)\n    setProperty(propertyValue)\n  }\n  /**\n   * Rain particles movement factor. Controls the overall rain particles speed Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val intensity: Double?\n    /**\n     * Rain particles movement factor. Controls the overall rain particles speed Default value: 1. Value range: [0, 1]\n     *\n     * @return intensity as Double\n     */\n    get() = getPropertyValue(\"intensity\")\n\n  /**\n   * Rain particles movement factor. Controls the overall rain particles speed Default value: 1. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  @MapboxExperimental\n  override fun intensity(intensity: Double): Rain = apply {\n    setProperty(PropertyValue(\"intensity\", intensity))\n  }\n\n  /**\n   * Intensity property transition options.\n   */\n  @MapboxExperimental\n  val intensityTransition: StyleTransition?\n    /**\n     * Get the Intensity property transition options.\n     *\n     * @return transition options for intensity\n     */\n    get() = getTransitionProperty(\"intensity-transition\")\n\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  @MapboxExperimental\n  override fun intensityTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [intensityTransition].\n   */\n  @MapboxExperimental\n  override fun intensityTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    intensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Rain particles movement factor. Controls the overall rain particles speed Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"intensity\".\n   */\n  @MapboxExperimental\n  val intensityAsExpression: Expression?\n    /**\n     * Rain particles movement factor. Controls the overall rain particles speed Default value: 1. Value range: [0, 1]\n     *\n     * Get the intensity property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"intensity\")?.let {\n        return it\n      }\n      intensity?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Rain particles movement factor. Controls the overall rain particles speed Default value: 1. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  @MapboxExperimental\n  override fun intensity(intensity: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"intensity\", intensity)\n    setProperty(propertyValue)\n  }\n  /**\n   * Rain particles opacity. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val opacity: Double?\n    /**\n     * Rain particles opacity. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n     *\n     * @return opacity as Double\n     */\n    get() = getPropertyValue(\"opacity\")\n\n  /**\n   * Rain particles opacity. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n   *\n   * @param opacity as Double\n   */\n  @MapboxExperimental\n  override fun opacity(opacity: Double): Rain = apply {\n    setProperty(PropertyValue(\"opacity\", opacity))\n  }\n\n  /**\n   * Opacity property transition options.\n   */\n  @MapboxExperimental\n  val opacityTransition: StyleTransition?\n    /**\n     * Get the Opacity property transition options.\n     *\n     * @return transition options for opacity\n     */\n    get() = getTransitionProperty(\"opacity-transition\")\n\n  /**\n   * Set the Opacity property transition options.\n   *\n   * @param options transition options for opacity\n   */\n  @MapboxExperimental\n  override fun opacityTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [opacityTransition].\n   */\n  @MapboxExperimental\n  override fun opacityTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    opacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Rain particles opacity. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n   *\n   * This is an Expression representation of \"opacity\".\n   */\n  @MapboxExperimental\n  val opacityAsExpression: Expression?\n    /**\n     * Rain particles opacity. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n     *\n     * Get the opacity property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"opacity\")?.let {\n        return it\n      }\n      opacity?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Rain particles opacity. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n   *\n   * @param opacity value of opacity as Expression\n   */\n  @MapboxExperimental\n  override fun opacity(opacity: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"opacity\", opacity)\n    setProperty(propertyValue)\n  }\n  /**\n   * Screen-space vignette rain tinting effect intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val vignette: Double?\n    /**\n     * Screen-space vignette rain tinting effect intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n     *\n     * @return vignette as Double\n     */\n    get() = getPropertyValue(\"vignette\")\n\n  /**\n   * Screen-space vignette rain tinting effect intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n   *\n   * @param vignette as Double\n   */\n  @MapboxExperimental\n  override fun vignette(vignette: Double): Rain = apply {\n    setProperty(PropertyValue(\"vignette\", vignette))\n  }\n\n  /**\n   * Vignette property transition options.\n   */\n  @MapboxExperimental\n  val vignetteTransition: StyleTransition?\n    /**\n     * Get the Vignette property transition options.\n     *\n     * @return transition options for vignette\n     */\n    get() = getTransitionProperty(\"vignette-transition\")\n\n  /**\n   * Set the Vignette property transition options.\n   *\n   * @param options transition options for vignette\n   */\n  @MapboxExperimental\n  override fun vignetteTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"vignette-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [vignetteTransition].\n   */\n  @MapboxExperimental\n  override fun vignetteTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    vignetteTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Screen-space vignette rain tinting effect intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n   *\n   * This is an Expression representation of \"vignette\".\n   */\n  @MapboxExperimental\n  val vignetteAsExpression: Expression?\n    /**\n     * Screen-space vignette rain tinting effect intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n     *\n     * Get the vignette property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"vignette\")?.let {\n        return it\n      }\n      vignette?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Screen-space vignette rain tinting effect intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n   *\n   * @param vignette value of vignette as Expression\n   */\n  @MapboxExperimental\n  override fun vignette(vignette: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"vignette\", vignette)\n    setProperty(propertyValue)\n  }\n  /**\n   * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   */\n  @MapboxExperimental\n  val vignetteColorAsColorInt: Int?\n    /**\n     * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n     *\n     * @return vignetteColor as int\n     */\n    @ColorInt\n    get() = vignetteColorAsExpression?.let {\n      rgbaExpressionToColorInt(it)\n    }\n  /**\n   * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   *\n   * @param vignetteColor as int\n   */\n  @MapboxExperimental\n  override fun vignetteColor(@ColorInt vignetteColor: Int): Rain = apply {\n    val propertyValue = PropertyValue(\"vignette-color\", colorIntToRgbaExpression(vignetteColor))\n    setProperty(propertyValue)\n  }\n  /**\n   * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   */\n  @MapboxExperimental\n  val vignetteColor: String?\n    /**\n     * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n     *\n     * @return vignette-color as String\n     */\n    get() = vignetteColorAsExpression?.let {\n      rgbaExpressionToColorString(it)\n    }\n\n  /**\n   * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   *\n   * @param vignetteColor as String\n   */\n  @MapboxExperimental\n  override fun vignetteColor(vignetteColor: String): Rain = apply {\n    setProperty(PropertyValue(\"vignette-color\", vignetteColor))\n  }\n\n  /**\n   * VignetteColor property transition options.\n   */\n  @MapboxExperimental\n  val vignetteColorTransition: StyleTransition?\n    /**\n     * Get the VignetteColor property transition options.\n     *\n     * @return transition options for vignette-color\n     */\n    get() = getTransitionProperty(\"vignette-color-transition\")\n\n  /**\n   * Set the VignetteColor property transition options.\n   *\n   * @param options transition options for vignette-color\n   */\n  @MapboxExperimental\n  override fun vignetteColorTransition(options: StyleTransition): Rain = apply {\n    val propertyValue = PropertyValue(\"vignette-color-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [vignetteColorTransition].\n   */\n  @MapboxExperimental\n  override fun vignetteColorTransition(block: StyleTransition.Builder.() -> Unit): Rain = apply {\n    vignetteColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   *\n   * This is an Expression representation of \"vignette-color\".\n   */\n  @MapboxExperimental\n  val vignetteColorAsExpression: Expression?\n    /**\n     * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n     *\n     * Get the vignetteColor property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"vignette-color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   *\n   * @param vignetteColor value of vignetteColor as Expression\n   */\n  @MapboxExperimental\n  override fun vignetteColor(vignetteColor: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"vignette-color\", vignetteColor)\n    setProperty(propertyValue)\n  }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  val colorUseTheme: String?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * @return color-use-theme as String\n     */\n    get() = getPropertyValue(\"color-use-theme\")\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: String): Rain = apply {\n    setProperty(PropertyValue(\"color-use-theme\", colorUseTheme))\n  }\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * This is an Expression representation of \"color-use-theme\".\n   */\n  @MapboxExperimental\n  val colorUseThemeAsExpression: Expression?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * Get the colorUseTheme property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color-use-theme\")?.let {\n        return it\n      }\n      colorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"color-use-theme\", colorUseTheme)\n    setProperty(propertyValue)\n  }\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  val vignetteColorUseTheme: String?\n    /**\n     * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * @return vignette-color-use-theme as String\n     */\n    get() = getPropertyValue(\"vignette-color-use-theme\")\n\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param vignetteColorUseTheme as String\n   */\n  @MapboxExperimental\n  override fun vignetteColorUseTheme(vignetteColorUseTheme: String): Rain = apply {\n    setProperty(PropertyValue(\"vignette-color-use-theme\", vignetteColorUseTheme))\n  }\n\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * This is an Expression representation of \"vignette-color-use-theme\".\n   */\n  @MapboxExperimental\n  val vignetteColorUseThemeAsExpression: Expression?\n    /**\n     * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * Get the vignetteColorUseTheme property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"vignette-color-use-theme\")?.let {\n        return it\n      }\n      vignetteColorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param vignetteColorUseTheme value of vignetteColorUseTheme as Expression\n   */\n  @MapboxExperimental\n  override fun vignetteColorUseTheme(vignetteColorUseTheme: Expression): Rain = apply {\n    val propertyValue = PropertyValue(\"vignette-color-use-theme\", vignetteColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Bind rain to the map controller.\n   *\n   * @param delegate The map controller\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    this.delegate = delegate\n    val rainParams = HashMap<String, Value>()\n\n    properties.forEach {\n      rainParams[it.key] = it.value.value\n    }\n    val expected = delegate.setStyleRain(Value(rainParams))\n    expected.error?.let {\n      throw MapboxStyleException(\"Set rain failed: $it\")\n    }\n  }\n\n  private fun setProperty(property: PropertyValue<*>) {\n    properties[property.propertyName] = property\n    updateProperty(property)\n  }\n\n  private fun updateProperty(propertyValue: PropertyValue<*>) {\n    val expected = delegate?.setStyleRainProperty(\n      propertyValue.propertyName,\n      propertyValue.value\n    )\n    expected?.error?.let {\n      throw MapboxStyleException(\"Set rain property failed: $it\")\n    }\n  }\n\n  private inline fun <reified T> getPropertyValue(propertyName: String): T? {\n    return getPropertyValueWithType(propertyName, T::class.java)\n  }\n\n  private fun <T> getPropertyValueWithType(propertyName: String, clazz: Class<T>): T? {\n    delegate?.let {\n      return try {\n        it.getStyleRainProperty(propertyName).unwrap(clazz)\n      } catch (e: RuntimeException) {\n        Log.e(TAG, \"Get rain property failed: ${e.message}\")\n        Log.e(TAG, it.getStyleRainProperty(propertyName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $propertyName failed: rain is not added to style yet.\")\n  }\n\n  private fun getTransitionProperty(transitionName: String): StyleTransition? {\n    delegate?.let {\n      return try {\n        @Suppress(\"UNCHECKED_CAST\")\n        val styleLayerProperty =\n          it.getStyleRainProperty(transitionName).value.contents as HashMap<String, Value>\n        val duration = styleLayerProperty[\"duration\"]?.contents as Long\n        val delay = styleLayerProperty[\"delay\"]?.contents as Long\n        StyleTransition.Builder().delay(delay).duration(duration).build()\n      } catch (e: RuntimeException) {\n        Log.e(TAG, \"Get rain property failed: ${e.message}\")\n        Log.e(TAG, it.getStyleRainProperty(transitionName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $transitionName failed: rain is not added to style yet.\")\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  private companion object {\n    private const val TAG = \"Mbgl-Rain\"\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@RainDsl\n@MapboxExperimental\ninterface RainDslReceiver {\n\n  /**\n   * Thinning factor of rain particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.57. Value range: [0, 1]\n   *\n   * @param centerThinning as Double\n   */\n  @MapboxExperimental\n  fun centerThinning(centerThinning: Double = 0.57): Rain\n\n  /**\n   * Thinning factor of rain particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.57. Value range: [0, 1]\n   *\n   * @param centerThinning value of centerThinning as Expression\n   */\n  @MapboxExperimental\n  fun centerThinning(centerThinning: Expression): Rain\n  /**\n   * Set the CenterThinning property transition options.\n   *\n   * @param options transition options for center-thinning\n   */\n  @MapboxExperimental\n  fun centerThinningTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [centerThinningTransition].\n   */\n  @MapboxExperimental\n  fun centerThinningTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   *\n   * @param color as int\n   */\n  @MapboxExperimental\n  fun color(@ColorInt color: Int): Rain\n  /**\n   * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   *\n   * @param color as String\n   */\n  @MapboxExperimental\n  fun color(color: String): Rain\n\n  /**\n   * Individual rain particle dorplets color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\".\n   *\n   * @param color value of color as Expression\n   */\n  @MapboxExperimental\n  fun color(color: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#03113d\",0.3,\"#a8adbc\"]\"\"\".trimIndent())): Rain\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  @MapboxExperimental\n  fun colorTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [colorTransition].\n   */\n  @MapboxExperimental\n  fun colorTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * Rain particles density. Controls the overall screen density of the rain. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n   *\n   * @param density as Double\n   */\n  @MapboxExperimental\n  fun density(density: Double): Rain\n\n  /**\n   * Rain particles density. Controls the overall screen density of the rain. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\". Value range: [0, 1]\n   *\n   * @param density value of density as Expression\n   */\n  @MapboxExperimental\n  fun density(density: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.5]\"\"\".trimIndent())): Rain\n  /**\n   * Set the Density property transition options.\n   *\n   * @param options transition options for density\n   */\n  @MapboxExperimental\n  fun densityTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [densityTransition].\n   */\n  @MapboxExperimental\n  fun densityTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * Main rain particles direction. Azimuth and polar angles. Default value: [0,80]. Value range: [0, 360]\n   *\n   * @param direction as List<Double>\n   */\n  @MapboxExperimental\n  fun direction(direction: List<Double> = listOf(0.0, 80.0)): Rain\n\n  /**\n   * Main rain particles direction. Azimuth and polar angles. Default value: [0,80]. Value range: [0, 360]\n   *\n   * @param direction value of direction as Expression\n   */\n  @MapboxExperimental\n  fun direction(direction: Expression): Rain\n  /**\n   * Set the Direction property transition options.\n   *\n   * @param options transition options for direction\n   */\n  @MapboxExperimental\n  fun directionTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [directionTransition].\n   */\n  @MapboxExperimental\n  fun directionTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * Rain particles screen-space distortion strength. Default value: 0.7. Value range: [0, 1]\n   *\n   * @param distortionStrength as Double\n   */\n  @MapboxExperimental\n  fun distortionStrength(distortionStrength: Double = 0.7): Rain\n\n  /**\n   * Rain particles screen-space distortion strength. Default value: 0.7. Value range: [0, 1]\n   *\n   * @param distortionStrength value of distortionStrength as Expression\n   */\n  @MapboxExperimental\n  fun distortionStrength(distortionStrength: Expression): Rain\n  /**\n   * Set the DistortionStrength property transition options.\n   *\n   * @param options transition options for distortion-strength\n   */\n  @MapboxExperimental\n  fun distortionStrengthTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [distortionStrengthTransition].\n   */\n  @MapboxExperimental\n  fun distortionStrengthTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * Rain droplet size. x - normal to direction, y - along direction Default value: [2.6,18.2]. Value range: [0, 50]\n   *\n   * @param dropletSize as List<Double>\n   */\n  @MapboxExperimental\n  fun dropletSize(dropletSize: List<Double> = listOf(2.6, 18.2)): Rain\n\n  /**\n   * Rain droplet size. x - normal to direction, y - along direction Default value: [2.6,18.2]. Value range: [0, 50]\n   *\n   * @param dropletSize value of dropletSize as Expression\n   */\n  @MapboxExperimental\n  fun dropletSize(dropletSize: Expression): Rain\n  /**\n   * Set the DropletSize property transition options.\n   *\n   * @param options transition options for droplet-size\n   */\n  @MapboxExperimental\n  fun dropletSizeTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [dropletSizeTransition].\n   */\n  @MapboxExperimental\n  fun dropletSizeTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * Rain particles movement factor. Controls the overall rain particles speed Default value: 1. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  @MapboxExperimental\n  fun intensity(intensity: Double = 1.0): Rain\n\n  /**\n   * Rain particles movement factor. Controls the overall rain particles speed Default value: 1. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  @MapboxExperimental\n  fun intensity(intensity: Expression): Rain\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  @MapboxExperimental\n  fun intensityTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [intensityTransition].\n   */\n  @MapboxExperimental\n  fun intensityTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * Rain particles opacity. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n   *\n   * @param opacity as Double\n   */\n  @MapboxExperimental\n  fun opacity(opacity: Double): Rain\n\n  /**\n   * Rain particles opacity. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\". Value range: [0, 1]\n   *\n   * @param opacity value of opacity as Expression\n   */\n  @MapboxExperimental\n  fun opacity(opacity: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,0.88,1,0.7]\"\"\".trimIndent())): Rain\n  /**\n   * Set the Opacity property transition options.\n   *\n   * @param options transition options for opacity\n   */\n  @MapboxExperimental\n  fun opacityTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [opacityTransition].\n   */\n  @MapboxExperimental\n  fun opacityTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * Screen-space vignette rain tinting effect intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n   *\n   * @param vignette as Double\n   */\n  @MapboxExperimental\n  fun vignette(vignette: Double): Rain\n\n  /**\n   * Screen-space vignette rain tinting effect intensity. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\". Value range: [0, 1]\n   *\n   * @param vignette value of vignette as Expression\n   */\n  @MapboxExperimental\n  fun vignette(vignette: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,1]\"\"\".trimIndent())): Rain\n  /**\n   * Set the Vignette property transition options.\n   *\n   * @param options transition options for vignette\n   */\n  @MapboxExperimental\n  fun vignetteTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [vignetteTransition].\n   */\n  @MapboxExperimental\n  fun vignetteTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   *\n   * @param vignetteColor as int\n   */\n  @MapboxExperimental\n  fun vignetteColor(@ColorInt vignetteColor: Int): Rain\n  /**\n   * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   *\n   * @param vignetteColor as String\n   */\n  @MapboxExperimental\n  fun vignetteColor(vignetteColor: String): Rain\n\n  /**\n   * Rain vignette screen-space corners tint color. Default value: \"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\".\n   *\n   * @param vignetteColor value of vignetteColor as Expression\n   */\n  @MapboxExperimental\n  fun vignetteColor(vignetteColor: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"measure-light\",\"brightness\"],0,\"#001736\",0.3,\"#464646\"]\"\"\".trimIndent())): Rain\n  /**\n   * Set the VignetteColor property transition options.\n   *\n   * @param options transition options for vignette-color\n   */\n  @MapboxExperimental\n  fun vignetteColorTransition(options: StyleTransition): Rain\n\n  /**\n   * DSL for [vignetteColorTransition].\n   */\n  @MapboxExperimental\n  fun vignetteColorTransition(block: StyleTransition.Builder.() -> Unit): Rain\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: String): Rain\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: Expression): Rain\n\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param vignetteColorUseTheme as String\n   */\n  @MapboxExperimental\n  fun vignetteColorUseTheme(vignetteColorUseTheme: String): Rain\n\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param vignetteColorUseTheme value of vignetteColorUseTheme as Expression\n   */\n  @MapboxExperimental\n  fun vignetteColorUseTheme(vignetteColorUseTheme: Expression): Rain\n}\n\n/**\n * DSL function for creating [Rain] instance.\n */\n@MapboxExperimental\nfun rain(block: RainDslReceiver.() -> Unit): Rain {\n  return Rain().apply(block)\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/precipitations/generated/RainExt.kt",
    "content": "// This file is generated.\n@file:JvmName(\"RainUtils\")\n\npackage com.mapbox.maps.extension.style.precipitations.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\n\n/**\n * Extension function to get the Rain provided by the Style Extension.\n *\n * @return Rain\n */\n@MapboxExperimental\nfun MapboxStyleManager.getRain(): Rain {\n  return Rain().also { it.delegate = this }\n}\n\n/**\n * Extension function to set the Rain provided by the Style Extension to the Style.\n *\n * @param rain The rain to be set\n */\n@MapboxExperimental\nfun MapboxStyleManager.setRain(rain: StyleContract.StyleRainExtension) {\n  rain.bindTo(this)\n}\n\n/**\n * Removes rain from style if it was set.\n */\n@MapboxExperimental\nfun MapboxStyleManager.removeRain() {\n  setStyleRain(Value.nullValue())\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/precipitations/generated/Snow.kt",
    "content": "// This file is generated.\npackage com.mapbox.maps.extension.style.precipitations.generated\n\nimport android.util.Log\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.types.SnowDsl\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorInt\nimport com.mapbox.maps.extension.style.utils.ColorUtils.rgbaExpressionToColorString\nimport com.mapbox.maps.extension.style.utils.unwrap\n\n/**\n * The experimental Snow API to render snow effect on the map.\n */\n@UiThread\n@MapboxExperimental\nclass Snow : SnowDslReceiver, StyleContract.StyleSnowExtension {\n  internal var delegate: MapboxStyleManager? = null\n  private val properties = HashMap<String, PropertyValue<*>>()\n\n  /**\n   * Thinning factor of snow particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.4. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val centerThinning: Double?\n    /**\n     * Thinning factor of snow particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.4. Value range: [0, 1]\n     *\n     * @return center-thinning as Double\n     */\n    get() = getPropertyValue(\"center-thinning\")\n\n  /**\n   * Thinning factor of snow particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.4. Value range: [0, 1]\n   *\n   * @param centerThinning as Double\n   */\n  @MapboxExperimental\n  override fun centerThinning(centerThinning: Double): Snow = apply {\n    setProperty(PropertyValue(\"center-thinning\", centerThinning))\n  }\n\n  /**\n   * CenterThinning property transition options.\n   */\n  @MapboxExperimental\n  val centerThinningTransition: StyleTransition?\n    /**\n     * Get the CenterThinning property transition options.\n     *\n     * @return transition options for center-thinning\n     */\n    get() = getTransitionProperty(\"center-thinning-transition\")\n\n  /**\n   * Set the CenterThinning property transition options.\n   *\n   * @param options transition options for center-thinning\n   */\n  @MapboxExperimental\n  override fun centerThinningTransition(options: StyleTransition): Snow = apply {\n    val propertyValue = PropertyValue(\"center-thinning-transition\", options)\n    setProperty(propertyValue)\n  }\n  /**\n   * DSL for [centerThinningTransition].\n   */\n  @MapboxExperimental\n  override fun centerThinningTransition(block: StyleTransition.Builder.() -> Unit): Snow = apply {\n    centerThinningTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Thinning factor of snow particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.4. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"center-thinning\".\n   */\n  @MapboxExperimental\n  val centerThinningAsExpression: Expression?\n    /**\n     * Thinning factor of snow particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.4. Value range: [0, 1]\n     *\n     * Get the centerThinning property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"center-thinning\")?.let {\n        return it\n      }\n      centerThinning?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Thinning factor of snow particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.4. Value range: [0, 1]\n   *\n   * @param centerThinning value of centerThinning as Expression\n   */\n  @MapboxExperimental\n  override fun centerThinning(centerThinning: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"center-thinning\", centerThinning)\n    setProperty(propertyValue)\n  }\n  /**\n   * Snow particles color. Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  val colorAsColorInt: Int?\n    /**\n     * Snow particles color. Default value: \"#ffffff\".\n     *\n     * @return color as int\n     */\n    @ColorInt\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorInt(it)\n    }\n  /**\n   * Snow particles color. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  @MapboxExperimental\n  override fun color(@ColorInt color: Int): Snow = apply {\n    val propertyValue = PropertyValue(\"color\", colorIntToRgbaExpression(color))\n    setProperty(propertyValue)\n  }\n  /**\n   * Snow particles color. Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  val color: String?\n    /**\n     * Snow particles color. Default value: \"#ffffff\".\n     *\n     * @return color as String\n     */\n    get() = colorAsExpression?.let {\n      rgbaExpressionToColorString(it)\n    }\n\n  /**\n   * Snow particles color. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  @MapboxExperimental\n  override fun color(color: String): Snow = apply {\n    setProperty(PropertyValue(\"color\", color))\n  }\n\n  /**\n   * Color property transition options.\n   */\n  @MapboxExperimental\n  val colorTransition: StyleTransition?\n    /**\n     * Get the Color property transition options.\n     *\n     * @return transition options for color\n     */\n    get() = getTransitionProperty(\"color-transition\")\n\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  @MapboxExperimental\n  override fun colorTransition(options: StyleTransition): Snow = apply {\n    val propertyValue = PropertyValue(\"color-transition\", options)\n    setProperty(propertyValue)\n  }\n  /**\n   * DSL for [colorTransition].\n   */\n  @MapboxExperimental\n  override fun colorTransition(block: StyleTransition.Builder.() -> Unit): Snow = apply {\n    colorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Snow particles color. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"color\".\n   */\n  @MapboxExperimental\n  val colorAsExpression: Expression?\n    /**\n     * Snow particles color. Default value: \"#ffffff\".\n     *\n     * Get the color property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * Snow particles color. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  @MapboxExperimental\n  override fun color(color: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"color\", color)\n    setProperty(propertyValue)\n  }\n  /**\n   * Snow particles density. Controls the overall particles number. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val density: Double?\n    /**\n     * Snow particles density. Controls the overall particles number. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n     *\n     * @return density as Double\n     */\n    get() = getPropertyValue(\"density\")\n\n  /**\n   * Snow particles density. Controls the overall particles number. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n   *\n   * @param density as Double\n   */\n  @MapboxExperimental\n  override fun density(density: Double): Snow = apply {\n    setProperty(PropertyValue(\"density\", density))\n  }\n\n  /**\n   * Density property transition options.\n   */\n  @MapboxExperimental\n  val densityTransition: StyleTransition?\n    /**\n     * Get the Density property transition options.\n     *\n     * @return transition options for density\n     */\n    get() = getTransitionProperty(\"density-transition\")\n\n  /**\n   * Set the Density property transition options.\n   *\n   * @param options transition options for density\n   */\n  @MapboxExperimental\n  override fun densityTransition(options: StyleTransition): Snow = apply {\n    val propertyValue = PropertyValue(\"density-transition\", options)\n    setProperty(propertyValue)\n  }\n  /**\n   * DSL for [densityTransition].\n   */\n  @MapboxExperimental\n  override fun densityTransition(block: StyleTransition.Builder.() -> Unit): Snow = apply {\n    densityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Snow particles density. Controls the overall particles number. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n   *\n   * This is an Expression representation of \"density\".\n   */\n  @MapboxExperimental\n  val densityAsExpression: Expression?\n    /**\n     * Snow particles density. Controls the overall particles number. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n     *\n     * Get the density property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"density\")?.let {\n        return it\n      }\n      density?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Snow particles density. Controls the overall particles number. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n   *\n   * @param density value of density as Expression\n   */\n  @MapboxExperimental\n  override fun density(density: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"density\", density)\n    setProperty(propertyValue)\n  }\n  /**\n   * Main snow particles direction. Azimuth and polar angles Default value: [0,50]. Value range: [0, 360]\n   */\n  @MapboxExperimental\n  val direction: List<Double>?\n    /**\n     * Main snow particles direction. Azimuth and polar angles Default value: [0,50]. Value range: [0, 360]\n     *\n     * @return direction as List<Double>\n     */\n    get() = getPropertyValue(\"direction\")\n\n  /**\n   * Main snow particles direction. Azimuth and polar angles Default value: [0,50]. Value range: [0, 360]\n   *\n   * @param direction as List<Double>\n   */\n  @MapboxExperimental\n  override fun direction(direction: List<Double>): Snow = apply {\n    setProperty(PropertyValue(\"direction\", direction))\n  }\n\n  /**\n   * Direction property transition options.\n   */\n  @MapboxExperimental\n  val directionTransition: StyleTransition?\n    /**\n     * Get the Direction property transition options.\n     *\n     * @return transition options for direction\n     */\n    get() = getTransitionProperty(\"direction-transition\")\n\n  /**\n   * Set the Direction property transition options.\n   *\n   * @param options transition options for direction\n   */\n  @MapboxExperimental\n  override fun directionTransition(options: StyleTransition): Snow = apply {\n    val propertyValue = PropertyValue(\"direction-transition\", options)\n    setProperty(propertyValue)\n  }\n  /**\n   * DSL for [directionTransition].\n   */\n  @MapboxExperimental\n  override fun directionTransition(block: StyleTransition.Builder.() -> Unit): Snow = apply {\n    directionTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Main snow particles direction. Azimuth and polar angles Default value: [0,50]. Value range: [0, 360]\n   *\n   * This is an Expression representation of \"direction\".\n   */\n  @MapboxExperimental\n  val directionAsExpression: Expression?\n    /**\n     * Main snow particles direction. Azimuth and polar angles Default value: [0,50]. Value range: [0, 360]\n     *\n     * Get the direction property as an Expression\n     *\n     * @return List<Double>\n     */\n    get() {\n      getPropertyValue<Expression>(\"direction\")?.let {\n        return it\n      }\n      direction?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Main snow particles direction. Azimuth and polar angles Default value: [0,50]. Value range: [0, 360]\n   *\n   * @param direction value of direction as Expression\n   */\n  @MapboxExperimental\n  override fun direction(direction: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"direction\", direction)\n    setProperty(propertyValue)\n  }\n  /**\n   * Snow flake particle size. Correlates with individual particle screen size Default value: 0.71. Value range: [0, 5]\n   */\n  @MapboxExperimental\n  val flakeSize: Double?\n    /**\n     * Snow flake particle size. Correlates with individual particle screen size Default value: 0.71. Value range: [0, 5]\n     *\n     * @return flake-size as Double\n     */\n    get() = getPropertyValue(\"flake-size\")\n\n  /**\n   * Snow flake particle size. Correlates with individual particle screen size Default value: 0.71. Value range: [0, 5]\n   *\n   * @param flakeSize as Double\n   */\n  @MapboxExperimental\n  override fun flakeSize(flakeSize: Double): Snow = apply {\n    setProperty(PropertyValue(\"flake-size\", flakeSize))\n  }\n\n  /**\n   * FlakeSize property transition options.\n   */\n  @MapboxExperimental\n  val flakeSizeTransition: StyleTransition?\n    /**\n     * Get the FlakeSize property transition options.\n     *\n     * @return transition options for flake-size\n     */\n    get() = getTransitionProperty(\"flake-size-transition\")\n\n  /**\n   * Set the FlakeSize property transition options.\n   *\n   * @param options transition options for flake-size\n   */\n  @MapboxExperimental\n  override fun flakeSizeTransition(options: StyleTransition): Snow = apply {\n    val propertyValue = PropertyValue(\"flake-size-transition\", options)\n    setProperty(propertyValue)\n  }\n  /**\n   * DSL for [flakeSizeTransition].\n   */\n  @MapboxExperimental\n  override fun flakeSizeTransition(block: StyleTransition.Builder.() -> Unit): Snow = apply {\n    flakeSizeTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Snow flake particle size. Correlates with individual particle screen size Default value: 0.71. Value range: [0, 5]\n   *\n   * This is an Expression representation of \"flake-size\".\n   */\n  @MapboxExperimental\n  val flakeSizeAsExpression: Expression?\n    /**\n     * Snow flake particle size. Correlates with individual particle screen size Default value: 0.71. Value range: [0, 5]\n     *\n     * Get the flakeSize property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"flake-size\")?.let {\n        return it\n      }\n      flakeSize?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Snow flake particle size. Correlates with individual particle screen size Default value: 0.71. Value range: [0, 5]\n   *\n   * @param flakeSize value of flakeSize as Expression\n   */\n  @MapboxExperimental\n  override fun flakeSize(flakeSize: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"flake-size\", flakeSize)\n    setProperty(propertyValue)\n  }\n  /**\n   * Snow particles movement factor. Controls the overall particles movement speed. Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val intensity: Double?\n    /**\n     * Snow particles movement factor. Controls the overall particles movement speed. Default value: 1. Value range: [0, 1]\n     *\n     * @return intensity as Double\n     */\n    get() = getPropertyValue(\"intensity\")\n\n  /**\n   * Snow particles movement factor. Controls the overall particles movement speed. Default value: 1. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  @MapboxExperimental\n  override fun intensity(intensity: Double): Snow = apply {\n    setProperty(PropertyValue(\"intensity\", intensity))\n  }\n\n  /**\n   * Intensity property transition options.\n   */\n  @MapboxExperimental\n  val intensityTransition: StyleTransition?\n    /**\n     * Get the Intensity property transition options.\n     *\n     * @return transition options for intensity\n     */\n    get() = getTransitionProperty(\"intensity-transition\")\n\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  @MapboxExperimental\n  override fun intensityTransition(options: StyleTransition): Snow = apply {\n    val propertyValue = PropertyValue(\"intensity-transition\", options)\n    setProperty(propertyValue)\n  }\n  /**\n   * DSL for [intensityTransition].\n   */\n  @MapboxExperimental\n  override fun intensityTransition(block: StyleTransition.Builder.() -> Unit): Snow = apply {\n    intensityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Snow particles movement factor. Controls the overall particles movement speed. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"intensity\".\n   */\n  @MapboxExperimental\n  val intensityAsExpression: Expression?\n    /**\n     * Snow particles movement factor. Controls the overall particles movement speed. Default value: 1. Value range: [0, 1]\n     *\n     * Get the intensity property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"intensity\")?.let {\n        return it\n      }\n      intensity?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Snow particles movement factor. Controls the overall particles movement speed. Default value: 1. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  @MapboxExperimental\n  override fun intensity(intensity: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"intensity\", intensity)\n    setProperty(propertyValue)\n  }\n  /**\n   * Snow particles opacity. Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val opacity: Double?\n    /**\n     * Snow particles opacity. Default value: 1. Value range: [0, 1]\n     *\n     * @return opacity as Double\n     */\n    get() = getPropertyValue(\"opacity\")\n\n  /**\n   * Snow particles opacity. Default value: 1. Value range: [0, 1]\n   *\n   * @param opacity as Double\n   */\n  @MapboxExperimental\n  override fun opacity(opacity: Double): Snow = apply {\n    setProperty(PropertyValue(\"opacity\", opacity))\n  }\n\n  /**\n   * Opacity property transition options.\n   */\n  @MapboxExperimental\n  val opacityTransition: StyleTransition?\n    /**\n     * Get the Opacity property transition options.\n     *\n     * @return transition options for opacity\n     */\n    get() = getTransitionProperty(\"opacity-transition\")\n\n  /**\n   * Set the Opacity property transition options.\n   *\n   * @param options transition options for opacity\n   */\n  @MapboxExperimental\n  override fun opacityTransition(options: StyleTransition): Snow = apply {\n    val propertyValue = PropertyValue(\"opacity-transition\", options)\n    setProperty(propertyValue)\n  }\n  /**\n   * DSL for [opacityTransition].\n   */\n  @MapboxExperimental\n  override fun opacityTransition(block: StyleTransition.Builder.() -> Unit): Snow = apply {\n    opacityTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Snow particles opacity. Default value: 1. Value range: [0, 1]\n   *\n   * This is an Expression representation of \"opacity\".\n   */\n  @MapboxExperimental\n  val opacityAsExpression: Expression?\n    /**\n     * Snow particles opacity. Default value: 1. Value range: [0, 1]\n     *\n     * Get the opacity property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"opacity\")?.let {\n        return it\n      }\n      opacity?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Snow particles opacity. Default value: 1. Value range: [0, 1]\n   *\n   * @param opacity value of opacity as Expression\n   */\n  @MapboxExperimental\n  override fun opacity(opacity: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"opacity\", opacity)\n    setProperty(propertyValue)\n  }\n  /**\n   * Snow vignette screen-space effect. Adds snow tint to screen corners Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n   */\n  @MapboxExperimental\n  val vignette: Double?\n    /**\n     * Snow vignette screen-space effect. Adds snow tint to screen corners Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n     *\n     * @return vignette as Double\n     */\n    get() = getPropertyValue(\"vignette\")\n\n  /**\n   * Snow vignette screen-space effect. Adds snow tint to screen corners Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n   *\n   * @param vignette as Double\n   */\n  @MapboxExperimental\n  override fun vignette(vignette: Double): Snow = apply {\n    setProperty(PropertyValue(\"vignette\", vignette))\n  }\n\n  /**\n   * Vignette property transition options.\n   */\n  @MapboxExperimental\n  val vignetteTransition: StyleTransition?\n    /**\n     * Get the Vignette property transition options.\n     *\n     * @return transition options for vignette\n     */\n    get() = getTransitionProperty(\"vignette-transition\")\n\n  /**\n   * Set the Vignette property transition options.\n   *\n   * @param options transition options for vignette\n   */\n  @MapboxExperimental\n  override fun vignetteTransition(options: StyleTransition): Snow = apply {\n    val propertyValue = PropertyValue(\"vignette-transition\", options)\n    setProperty(propertyValue)\n  }\n  /**\n   * DSL for [vignetteTransition].\n   */\n  @MapboxExperimental\n  override fun vignetteTransition(block: StyleTransition.Builder.() -> Unit): Snow = apply {\n    vignetteTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Snow vignette screen-space effect. Adds snow tint to screen corners Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n   *\n   * This is an Expression representation of \"vignette\".\n   */\n  @MapboxExperimental\n  val vignetteAsExpression: Expression?\n    /**\n     * Snow vignette screen-space effect. Adds snow tint to screen corners Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n     *\n     * Get the vignette property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"vignette\")?.let {\n        return it\n      }\n      vignette?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Snow vignette screen-space effect. Adds snow tint to screen corners Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n   *\n   * @param vignette value of vignette as Expression\n   */\n  @MapboxExperimental\n  override fun vignette(vignette: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"vignette\", vignette)\n    setProperty(propertyValue)\n  }\n  /**\n   * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  val vignetteColorAsColorInt: Int?\n    /**\n     * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n     *\n     * @return vignetteColor as int\n     */\n    @ColorInt\n    get() = vignetteColorAsExpression?.let {\n      rgbaExpressionToColorInt(it)\n    }\n  /**\n   * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n   *\n   * @param vignetteColor as int\n   */\n  @MapboxExperimental\n  override fun vignetteColor(@ColorInt vignetteColor: Int): Snow = apply {\n    val propertyValue = PropertyValue(\"vignette-color\", colorIntToRgbaExpression(vignetteColor))\n    setProperty(propertyValue)\n  }\n  /**\n   * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n   */\n  @MapboxExperimental\n  val vignetteColor: String?\n    /**\n     * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n     *\n     * @return vignette-color as String\n     */\n    get() = vignetteColorAsExpression?.let {\n      rgbaExpressionToColorString(it)\n    }\n\n  /**\n   * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n   *\n   * @param vignetteColor as String\n   */\n  @MapboxExperimental\n  override fun vignetteColor(vignetteColor: String): Snow = apply {\n    setProperty(PropertyValue(\"vignette-color\", vignetteColor))\n  }\n\n  /**\n   * VignetteColor property transition options.\n   */\n  @MapboxExperimental\n  val vignetteColorTransition: StyleTransition?\n    /**\n     * Get the VignetteColor property transition options.\n     *\n     * @return transition options for vignette-color\n     */\n    get() = getTransitionProperty(\"vignette-color-transition\")\n\n  /**\n   * Set the VignetteColor property transition options.\n   *\n   * @param options transition options for vignette-color\n   */\n  @MapboxExperimental\n  override fun vignetteColorTransition(options: StyleTransition): Snow = apply {\n    val propertyValue = PropertyValue(\"vignette-color-transition\", options)\n    setProperty(propertyValue)\n  }\n  /**\n   * DSL for [vignetteColorTransition].\n   */\n  @MapboxExperimental\n  override fun vignetteColorTransition(block: StyleTransition.Builder.() -> Unit): Snow = apply {\n    vignetteColorTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n   *\n   * This is an Expression representation of \"vignette-color\".\n   */\n  @MapboxExperimental\n  val vignetteColorAsExpression: Expression?\n    /**\n     * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n     *\n     * Get the vignetteColor property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"vignette-color\")?.let {\n        return it\n      }\n      return null\n    }\n  /**\n   * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n   *\n   * @param vignetteColor value of vignetteColor as Expression\n   */\n  @MapboxExperimental\n  override fun vignetteColor(vignetteColor: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"vignette-color\", vignetteColor)\n    setProperty(propertyValue)\n  }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  val colorUseTheme: String?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * @return color-use-theme as String\n     */\n    get() = getPropertyValue(\"color-use-theme\")\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: String): Snow = apply {\n    setProperty(PropertyValue(\"color-use-theme\", colorUseTheme))\n  }\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * This is an Expression representation of \"color-use-theme\".\n   */\n  @MapboxExperimental\n  val colorUseThemeAsExpression: Expression?\n    /**\n     * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * Get the colorUseTheme property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"color-use-theme\")?.let {\n        return it\n      }\n      colorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  override fun colorUseTheme(colorUseTheme: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"color-use-theme\", colorUseTheme)\n    setProperty(propertyValue)\n  }\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  val vignetteColorUseTheme: String?\n    /**\n     * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * @return vignette-color-use-theme as String\n     */\n    get() = getPropertyValue(\"vignette-color-use-theme\")\n\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param vignetteColorUseTheme as String\n   */\n  @MapboxExperimental\n  override fun vignetteColorUseTheme(vignetteColorUseTheme: String): Snow = apply {\n    setProperty(PropertyValue(\"vignette-color-use-theme\", vignetteColorUseTheme))\n  }\n\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * This is an Expression representation of \"vignette-color-use-theme\".\n   */\n  @MapboxExperimental\n  val vignetteColorUseThemeAsExpression: Expression?\n    /**\n     * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n     *\n     * Get the vignetteColorUseTheme property as an Expression\n     *\n     * @return String\n     */\n    get() {\n      getPropertyValue<Expression>(\"vignette-color-use-theme\")?.let {\n        return it\n      }\n      vignetteColorUseTheme?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param vignetteColorUseTheme value of vignetteColorUseTheme as Expression\n   */\n  @MapboxExperimental\n  override fun vignetteColorUseTheme(vignetteColorUseTheme: Expression): Snow = apply {\n    val propertyValue = PropertyValue(\"vignette-color-use-theme\", vignetteColorUseTheme)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Bind snow to the map controller.\n   *\n   * @param delegate The map controller\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    this.delegate = delegate\n    val snowParams = HashMap<String, Value>()\n\n    properties.forEach {\n      snowParams[it.key] = it.value.value\n    }\n    val expected = delegate.setStyleSnow(Value(snowParams))\n    expected.error?.let {\n      throw MapboxStyleException(\"Set snow failed: $it\")\n    }\n  }\n\n  private fun setProperty(property: PropertyValue<*>) {\n    properties[property.propertyName] = property\n    updateProperty(property)\n  }\n\n  private fun updateProperty(propertyValue: PropertyValue<*>) {\n    val expected = delegate?.setStyleSnowProperty(\n      propertyValue.propertyName,\n      propertyValue.value\n    )\n    expected?.error?.let {\n      throw MapboxStyleException(\"Set snow property failed: $it\")\n    }\n  }\n\n  private inline fun <reified T> getPropertyValue(propertyName: String): T? {\n    return getPropertyValueWithType(propertyName, T::class.java)\n  }\n\n  private fun <T> getPropertyValueWithType(propertyName: String, clazz: Class<T>): T? {\n    delegate?.let {\n      return try {\n        it.getStyleSnowProperty(propertyName).unwrap(clazz)\n      } catch (e: RuntimeException) {\n        Log.e(TAG, \"Get snow property failed: ${e.message}\")\n        Log.e(TAG, it.getStyleSnowProperty(propertyName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $propertyName failed: snow is not added to style yet.\")\n  }\n\n  private fun getTransitionProperty(transitionName: String): StyleTransition? {\n    delegate?.let {\n      return try {\n        @Suppress(\"UNCHECKED_CAST\")\n        val styleLayerProperty =\n          it.getStyleSnowProperty(transitionName).value.contents as HashMap<String, Value>\n        val duration = styleLayerProperty[\"duration\"]?.contents as Long\n        val delay = styleLayerProperty[\"delay\"]?.contents as Long\n        StyleTransition.Builder().delay(delay).duration(duration).build()\n      } catch (e: RuntimeException) {\n        Log.e(TAG, \"Get snow property failed: ${e.message}\")\n        Log.e(TAG, it.getStyleSnowProperty(transitionName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $transitionName failed: snow is not added to style yet.\")\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  private companion object {\n    private const val TAG = \"Mbgl-Snow\"\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@SnowDsl\n@MapboxExperimental\ninterface SnowDslReceiver {\n  /**\n   * Thinning factor of snow particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.4. Value range: [0, 1]\n   *\n   * @param centerThinning as Double\n   */\n  @MapboxExperimental\n  fun centerThinning(centerThinning: Double = 0.4): Snow\n\n  /**\n   * Thinning factor of snow particles from center. 0 - no thinning. 1 - maximal central area thinning. Default value: 0.4. Value range: [0, 1]\n   *\n   * @param centerThinning value of centerThinning as Expression\n   */\n  @MapboxExperimental\n  fun centerThinning(centerThinning: Expression): Snow\n  /**\n   * Set the CenterThinning property transition options.\n   *\n   * @param options transition options for center-thinning\n   */\n  @MapboxExperimental\n  fun centerThinningTransition(options: StyleTransition): Snow\n\n  /**\n   * DSL for [centerThinningTransition].\n   */\n  @MapboxExperimental\n  fun centerThinningTransition(block: StyleTransition.Builder.() -> Unit): Snow\n  /**\n   * Snow particles color. Default value: \"#ffffff\".\n   *\n   * @param color as int\n   */\n  @MapboxExperimental\n  fun color(@ColorInt color: Int): Snow\n  /**\n   * Snow particles color. Default value: \"#ffffff\".\n   *\n   * @param color as String\n   */\n  @MapboxExperimental\n  fun color(color: String = \"#ffffff\"): Snow\n\n  /**\n   * Snow particles color. Default value: \"#ffffff\".\n   *\n   * @param color value of color as Expression\n   */\n  @MapboxExperimental\n  fun color(color: Expression): Snow\n  /**\n   * Set the Color property transition options.\n   *\n   * @param options transition options for color\n   */\n  @MapboxExperimental\n  fun colorTransition(options: StyleTransition): Snow\n\n  /**\n   * DSL for [colorTransition].\n   */\n  @MapboxExperimental\n  fun colorTransition(block: StyleTransition.Builder.() -> Unit): Snow\n  /**\n   * Snow particles density. Controls the overall particles number. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n   *\n   * @param density as Double\n   */\n  @MapboxExperimental\n  fun density(density: Double): Snow\n\n  /**\n   * Snow particles density. Controls the overall particles number. Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\". Value range: [0, 1]\n   *\n   * @param density value of density as Expression\n   */\n  @MapboxExperimental\n  fun density(density: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.85]\"\"\".trimIndent())): Snow\n  /**\n   * Set the Density property transition options.\n   *\n   * @param options transition options for density\n   */\n  @MapboxExperimental\n  fun densityTransition(options: StyleTransition): Snow\n\n  /**\n   * DSL for [densityTransition].\n   */\n  @MapboxExperimental\n  fun densityTransition(block: StyleTransition.Builder.() -> Unit): Snow\n  /**\n   * Main snow particles direction. Azimuth and polar angles Default value: [0,50]. Value range: [0, 360]\n   *\n   * @param direction as List<Double>\n   */\n  @MapboxExperimental\n  fun direction(direction: List<Double> = listOf(0.0, 50.0)): Snow\n\n  /**\n   * Main snow particles direction. Azimuth and polar angles Default value: [0,50]. Value range: [0, 360]\n   *\n   * @param direction value of direction as Expression\n   */\n  @MapboxExperimental\n  fun direction(direction: Expression): Snow\n  /**\n   * Set the Direction property transition options.\n   *\n   * @param options transition options for direction\n   */\n  @MapboxExperimental\n  fun directionTransition(options: StyleTransition): Snow\n\n  /**\n   * DSL for [directionTransition].\n   */\n  @MapboxExperimental\n  fun directionTransition(block: StyleTransition.Builder.() -> Unit): Snow\n  /**\n   * Snow flake particle size. Correlates with individual particle screen size Default value: 0.71. Value range: [0, 5]\n   *\n   * @param flakeSize as Double\n   */\n  @MapboxExperimental\n  fun flakeSize(flakeSize: Double = 0.71): Snow\n\n  /**\n   * Snow flake particle size. Correlates with individual particle screen size Default value: 0.71. Value range: [0, 5]\n   *\n   * @param flakeSize value of flakeSize as Expression\n   */\n  @MapboxExperimental\n  fun flakeSize(flakeSize: Expression): Snow\n  /**\n   * Set the FlakeSize property transition options.\n   *\n   * @param options transition options for flake-size\n   */\n  @MapboxExperimental\n  fun flakeSizeTransition(options: StyleTransition): Snow\n\n  /**\n   * DSL for [flakeSizeTransition].\n   */\n  @MapboxExperimental\n  fun flakeSizeTransition(block: StyleTransition.Builder.() -> Unit): Snow\n  /**\n   * Snow particles movement factor. Controls the overall particles movement speed. Default value: 1. Value range: [0, 1]\n   *\n   * @param intensity as Double\n   */\n  @MapboxExperimental\n  fun intensity(intensity: Double = 1.0): Snow\n\n  /**\n   * Snow particles movement factor. Controls the overall particles movement speed. Default value: 1. Value range: [0, 1]\n   *\n   * @param intensity value of intensity as Expression\n   */\n  @MapboxExperimental\n  fun intensity(intensity: Expression): Snow\n  /**\n   * Set the Intensity property transition options.\n   *\n   * @param options transition options for intensity\n   */\n  @MapboxExperimental\n  fun intensityTransition(options: StyleTransition): Snow\n\n  /**\n   * DSL for [intensityTransition].\n   */\n  @MapboxExperimental\n  fun intensityTransition(block: StyleTransition.Builder.() -> Unit): Snow\n  /**\n   * Snow particles opacity. Default value: 1. Value range: [0, 1]\n   *\n   * @param opacity as Double\n   */\n  @MapboxExperimental\n  fun opacity(opacity: Double = 1.0): Snow\n\n  /**\n   * Snow particles opacity. Default value: 1. Value range: [0, 1]\n   *\n   * @param opacity value of opacity as Expression\n   */\n  @MapboxExperimental\n  fun opacity(opacity: Expression): Snow\n  /**\n   * Set the Opacity property transition options.\n   *\n   * @param options transition options for opacity\n   */\n  @MapboxExperimental\n  fun opacityTransition(options: StyleTransition): Snow\n\n  /**\n   * DSL for [opacityTransition].\n   */\n  @MapboxExperimental\n  fun opacityTransition(block: StyleTransition.Builder.() -> Unit): Snow\n  /**\n   * Snow vignette screen-space effect. Adds snow tint to screen corners Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n   *\n   * @param vignette as Double\n   */\n  @MapboxExperimental\n  fun vignette(vignette: Double): Snow\n\n  /**\n   * Snow vignette screen-space effect. Adds snow tint to screen corners Default value: \"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\". Value range: [0, 1]\n   *\n   * @param vignette value of vignette as Expression\n   */\n  @MapboxExperimental\n  fun vignette(vignette: Expression = Expression.fromRaw(\"\"\"[\"interpolate\",[\"linear\"],[\"zoom\"],11,0,13,0.3]\"\"\".trimIndent())): Snow\n  /**\n   * Set the Vignette property transition options.\n   *\n   * @param options transition options for vignette\n   */\n  @MapboxExperimental\n  fun vignetteTransition(options: StyleTransition): Snow\n\n  /**\n   * DSL for [vignetteTransition].\n   */\n  @MapboxExperimental\n  fun vignetteTransition(block: StyleTransition.Builder.() -> Unit): Snow\n  /**\n   * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n   *\n   * @param vignetteColor as int\n   */\n  @MapboxExperimental\n  fun vignetteColor(@ColorInt vignetteColor: Int): Snow\n  /**\n   * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n   *\n   * @param vignetteColor as String\n   */\n  @MapboxExperimental\n  fun vignetteColor(vignetteColor: String = \"#ffffff\"): Snow\n\n  /**\n   * Snow vignette screen-space corners tint color. Default value: \"#ffffff\".\n   *\n   * @param vignetteColor value of vignetteColor as Expression\n   */\n  @MapboxExperimental\n  fun vignetteColor(vignetteColor: Expression): Snow\n  /**\n   * Set the VignetteColor property transition options.\n   *\n   * @param options transition options for vignette-color\n   */\n  @MapboxExperimental\n  fun vignetteColorTransition(options: StyleTransition): Snow\n\n  /**\n   * DSL for [vignetteColorTransition].\n   */\n  @MapboxExperimental\n  fun vignetteColorTransition(block: StyleTransition.Builder.() -> Unit): Snow\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme as String\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: String): Snow\n\n  /**\n   * This property defines whether the `color` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param colorUseTheme value of colorUseTheme as Expression\n   */\n  @MapboxExperimental\n  fun colorUseTheme(colorUseTheme: Expression): Snow\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param vignetteColorUseTheme as String\n   */\n  @MapboxExperimental\n  fun vignetteColorUseTheme(vignetteColorUseTheme: String): Snow\n\n  /**\n   * This property defines whether the `vignetteColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param vignetteColorUseTheme value of vignetteColorUseTheme as Expression\n   */\n  @MapboxExperimental\n  fun vignetteColorUseTheme(vignetteColorUseTheme: Expression): Snow\n}\n\n/**\n * DSL function for creating [Snow] instance.\n */\n@MapboxExperimental\nfun snow(block: SnowDslReceiver.() -> Unit): Snow {\n  return Snow().apply(block)\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/precipitations/generated/SnowExt.kt",
    "content": "// This file is generated.\n@file:JvmName(\"SnowUtils\")\n\npackage com.mapbox.maps.extension.style.precipitations.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\n\n/**\n * Extension function to get the Snow provided by the Style Extension.\n *\n * @return Snow\n */\n@MapboxExperimental\nfun MapboxStyleManager.getSnow(): Snow {\n  return Snow().also { it.delegate = this }\n}\n\n/**\n * Extension function to set the Snow provided by the Style Extension to the Style.\n *\n * @param snow The snow to be set\n */\n@MapboxExperimental\nfun MapboxStyleManager.setSnow(snow: StyleContract.StyleSnowExtension) {\n  snow.bindTo(this)\n}\n\n/**\n * Removes snow from style if it was set.\n */\n@MapboxExperimental\nfun MapboxStyleManager.removeSnow() {\n  setStyleSnow(Value.nullValue())\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/projection/generated/Projection.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.projection.generated\n\nimport android.opengl.GLES20\nimport androidx.annotation.UiThread\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\n\n/**\n * A style's projection property sets which projection a map is rendered in.\n * Mercator and Globe projections are supported.\n *\n * Globe projection is a custom map projection mode for rendering the map wrapped around a full 3D globe.\n * Conceptually it is the undistorted and unskewed “ground truth” view of the map\n * that preserves true proportions between different areas of the map.\n *\n * Some layers are not supported when map is in globe projection:\n *  - custom\n *  - location indicator\n *\n * Using [ProjectionName.GLOBE] requires OpenGL [GLES20.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS] be more than zero.\n * If [GLES20.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS] is zero (which may happen for low-end devices and old Android versions) -\n * [ProjectionName.GLOBE] will fallback to [ProjectionName.MERCATOR] with the log warning.\n *\n * @see [The online documentation](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/)\n *\n * @param name from [ProjectionName] enum\n */\n@UiThread\nclass Projection(val name: ProjectionName) : StyleContract.StyleProjectionExtension {\n  internal var delegate: MapboxStyleManager? = null\n  private val properties = HashMap<String, PropertyValue<*>>()\n\n  init {\n    setProperty(PropertyValue(\"name\", name))\n  }\n\n  /**\n   * Bind projection to the map controller.\n   *\n   * @param delegate The map controller\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    this.delegate = delegate\n    val projectionParams = HashMap<String, Value>()\n    properties.forEach {\n      projectionParams[it.key] = it.value.value\n    }\n    val expected = delegate.setStyleProjection(Value(projectionParams))\n    expected.error?.let {\n      throw MapboxStyleException(\"Set projection failed: $it\")\n    }\n  }\n\n  private fun setProperty(property: PropertyValue<*>) {\n    properties[property.propertyName] = property\n    updateProperty(property)\n  }\n\n  private fun updateProperty(propertyValue: PropertyValue<*>) {\n    val expected = delegate?.setStyleProjectionProperty(\n      propertyValue.propertyName,\n      propertyValue.value\n    )\n    expected?.error?.let {\n      throw MapboxStyleException(\"Set projection property failed: $it\")\n    }\n  }\n}\n\n/**\n * DSL function for creating [Projection] instance.\n */\nfun projection(name: ProjectionName): Projection {\n  return Projection(name)\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/projection/generated/ProjectionExt.kt",
    "content": "// This file is generated.\n@file:JvmName(\"StyleProjectionUtils\")\n\npackage com.mapbox.maps.extension.style.projection.generated\n\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.extension.style.utils.unwrapToAny\n\n/**\n * Extension function to get the projection provided by the Style Extension.\n *\n * @return projection [Projection] that is currently applied to the map or NULL if projection is undefined.\n */\nfun MapboxStyleManager.getProjection(): Projection? {\n  getStyleProjectionProperty(\"name\").apply {\n    return if (kind == StylePropertyValueKind.UNDEFINED) {\n      null\n    } else {\n      val projectionAsString = value.unwrapToAny() as String\n      Projection(ProjectionName.valueOf(projectionAsString.uppercase())).apply {\n        delegate = this@getProjection\n      }\n    }\n  }\n}\n\n/**\n * Extension function to set the Projection provided by the Style Extension to the Style.\n *\n * @param projection The projection [Projection] to be set.\n */\nfun MapboxStyleManager.setProjection(projection: Projection) {\n  projection.bindTo(this)\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/CustomGeometrySource.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.check\n\n/**\n * Custom Geometry Source, allows using FeatureCollections.\n *\n * CustomGeometrySource uses a coalescing model for frequent data updates targeting the same tile id,\n * which means, that the in-progress request as well as the last scheduled request are guaranteed to finish.\n * Any requests scheduled meanwhile can be canceled.\n */\nclass CustomGeometrySource(\n  /**\n   * Style source identifier.\n   */\n  id: String,\n  /**\n   * Settings for the custom geometry.\n   */\n  private val options: CustomGeometrySourceOptions,\n) : Source(id) {\n  /**\n   * Get the type of the current source as a String.\n   */\n  override fun getType(): String {\n    return \"custom-geometry\"\n  }\n\n  override fun addSource(style: MapboxStyleManager): Expected<String, None> {\n    return style.addStyleCustomGeometrySource(sourceId, options)\n  }\n\n  /**\n   * Set tile data of a custom geometry.\n   *\n   * @param tileID Identifier of the tile\n   * @param featureCollection An array with the features to add.\n   */\n  fun setTileData(tileID: CanonicalTileID, featureCollection: MutableList<Feature>) {\n    delegate?.setStyleCustomGeometrySourceTileData(sourceId, tileID, featureCollection).check()\n  }\n\n  /**\n   * Invalidate region for provided custom geometry source.\n   *\n   * @param coordinateBounds Coordinate bounds.\n   */\n  @Deprecated(\n    message = \"This method is deprecated because of confusing naming.\",\n    replaceWith = ReplaceWith(\"invalidateRegion(coordinateBounds)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun invalidRegion(coordinateBounds: CoordinateBounds) {\n    invalidateRegion(coordinateBounds)\n  }\n\n  /**\n   * Invalidate region for provided custom geometry source.\n   *\n   * @param coordinateBounds Coordinate bounds.\n   */\n  fun invalidateRegion(coordinateBounds: CoordinateBounds) {\n    delegate?.invalidateStyleCustomGeometrySourceRegion(sourceId, coordinateBounds).check()\n  }\n\n  /**\n   * Invalidate tile for provided custom geometry source.\n   *\n   * @param tileID Identifier of the tile\n   */\n  @Deprecated(\n    message = \"This method is deprecated because of confusing naming.\",\n    replaceWith = ReplaceWith(\"invalidateTile(tileID)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun invalidTile(tileID: CanonicalTileID) {\n    invalidateTile(tileID)\n  }\n\n  /**\n   * Invalidate tile for provided custom geometry source.\n   *\n   * @param tileID Identifier of the tile\n   */\n  fun invalidateTile(tileID: CanonicalTileID) {\n    delegate?.invalidateStyleCustomGeometrySourceTile(sourceId, tileID).check()\n  }\n\n  /**\n   * The property allows to define source specific resource budget, either in tile units or in megabytes.\n   * Whenever tile cache goes over the defined limit, least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  fun setTileCacheBudget(value: TileCacheBudget) {\n    setVolatileProperty(PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * The property allows to define source specific resource budget, either in tile units or in megabytes.\n   * Whenever tile cache goes over the defined limit, least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  val tileCacheBudget: TileCacheBudget?\n    /**\n     * Get the TileCacheBudget property\n     *\n     * @return TileCacheBudget\n     */\n    get() = getPropertyValue(\"tile-cache-budget\")\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  fun setMaxOverscaleFactorForParentTiles(value: Long) {\n    setVolatileProperty(PropertyValue(\"max-overscale-factor-for-parent-tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  val maxOverscaleFactorForParentTiles: Long?\n    /**\n     * Get the MaxOverscaleFactorForParentTiles property\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"max-overscale-factor-for-parent-tiles\")\n}\n\n/**\n * DSL function for [CustomGeometrySource].\n */\nfun customGeometrySource(\n  id: String,\n  block: CustomGeometrySourceOptions.Builder.() -> Unit\n): CustomGeometrySource =\n  CustomGeometrySource(id, CustomGeometrySourceOptions.Builder().apply(block).build())"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/CustomRasterSource.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.maps.CustomRasterSourceOptions\nimport com.mapbox.maps.CustomRasterSourceTileData\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.check\n\n/**\n * Describes the Custom Raster Source to be used in the style.\n *\n * Note: the provided data is not cached, and the implementation will call [com.mapbox.maps.CustomRasterSourceTileStatusChangedCallback] each time the tile reappears.\n */\n@MapboxExperimental\nclass CustomRasterSource(\n  /**\n   * Style source identifier.\n   */\n  id: String,\n  /**\n   * Settings for the custom raster source.\n   */\n  private val options: CustomRasterSourceOptions,\n) : Source(id) {\n\n  /**\n   * Get the type of the current source as a String.\n   */\n  override fun getType(): String {\n    return \"custom-raster\"\n  }\n\n  override fun addSource(style: MapboxStyleManager): Expected<String, None> {\n    return style.addStyleCustomRasterSource(sourceId, options)\n  }\n\n  /**\n   * Set tile data for raster tiles.\n   *\n   * The provided data is not cached, and the implementation will call [com.mapbox.maps.CustomRasterSourceTileStatusChangedCallback] each time the tile reappears.\n   *\n   * @param tileData List with new tile data.\n   */\n  fun setTileData(tileData: List<CustomRasterSourceTileData>) {\n    delegate?.setStyleCustomRasterSourceTileData(sourceId, tileData).check()\n  }\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  fun setMaxOverscaleFactorForParentTiles(value: Long) {\n    setVolatileProperty(PropertyValue(\"max-overscale-factor-for-parent-tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  val maxOverscaleFactorForParentTiles: Long?\n    /**\n     * Get the MaxOverscaleFactorForParentTiles property\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"max-overscale-factor-for-parent-tiles\")\n}\n\n/**\n * DSL function for [CustomRasterSource].\n */\n@MapboxExperimental\nfun customRasterSource(\n  id: String,\n  block: CustomRasterSourceOptions.Builder.() -> Unit\n): CustomRasterSource =\n  CustomRasterSource(id, CustomRasterSourceOptions.Builder().apply(block).build())"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/GeoJsonSourceExt.kt",
    "content": "@file:JvmName(\"GeoJsonSourceUtils\")\n\npackage com.mapbox.maps.extension.style.sources\n\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.logW\n\n/**\n * Add additional features to a GeoJSON style source.\n * The data will be scheduled and applied on a worker thread.\n *\n * To check the result of the operation, use events API, which will propagate a `map-loaded` event upon success\n * or a `map-loading-error` event upon failure.\n *\n * Partially updating a GeoJSON source is not compatible with using shared cache and generated IDs.\n * It is important to ensure that every feature in the GeoJSON style source, as well as the newly added\n * feature, has a unique ID (or a unique promote ID if in use). Failure to provide unique IDs will result\n * in a `map-loading-error`.\n *\n * The method allows the user to provide a data ID, which will be returned as the dataId parameter in the\n * `source-data-loaded` event. However, it's important to note that multiple partial updates can be queued\n * for the same GeoJSON source when ongoing source parsing is taking place. In these cases, the partial\n * updates will be applied to the source in batches. Only the data ID provided in the most recent call within\n * each batch will be included in the `source-data-loaded` event. If no data ID is provided in the most recent\n * call, the data ID in the `source-data-loaded`event will be null.\n *\n * Note: This method is not thread-safe. The List<Feature> will be processed on a worker thread,\n * please make sure the underlying features are immutable.\n *\n * Note: calling [GeoJsonSource.geometry], [GeoJsonSource.feature], [GeoJsonSource.featureCollection], [GeoJsonSource.data], [GeoJsonSource.url]\n * will clear any pending GeoJSON source data operations if they were scheduled before.\n *\n * @param dataId An arbitrary string used to track the given GeoJSON data, empty string means null ID.\n * @param features An array of GeoJSON features to be added to the source.\n *\n */\n@JvmOverloads\nfun GeoJsonSource.addGeoJSONSourceFeatures(\n  features: List<Feature>,\n  dataId: String = \"\",\n) {\n  delegate?.let { style ->\n    workerHandler.post {\n      style.addGeoJSONSourceFeatures(\n        this.sourceId,\n        dataId,\n        features\n      )\n    }\n  } ?: logW(TAG, \"GeoJsonSource.addGeoJSONSourceFeatures is ignored. Style is not loaded yet.\")\n}\n\n/**\n * Update existing features in a GeoJSON style source.\n * The data will be scheduled and applied on a worker thread.\n *\n * To check the result of the operation, use events API, which will propagate a `map-loaded` event upon success\n * or a `map-loading-error` event upon failure.\n *\n * Partially updating a GeoJSON source is not compatible with using shared cache and generated IDs.\n * It is important to ensure that every feature in the GeoJSON style source, as well as the newly added\n * feature, has a unique ID (or a unique promote ID if in use). Failure to provide unique IDs will result\n * in a `map-loading-error`.\n *\n * The method allows the user to provide a data ID, which will be returned as the dataId parameter in the\n * `source-data-loaded` event. However, it's important to note that multiple partial updates can be queued\n * for the same GeoJSON source when ongoing source parsing is taking place. In these cases, the partial\n * updates will be applied to the source in batches. Only the data ID provided in the most recent call within\n * each batch will be included in the `source-data-loaded` event. If no data ID is provided in the most recent\n * call, the data ID in the `source-data-loaded`event will be null.\n *\n * Note: This method is not thread-safe. The List<Feature> will be processed on a worker thread,\n * please make sure the underlying features are immutable.\n *\n * Note: calling [GeoJsonSource.geometry], [GeoJsonSource.feature], [GeoJsonSource.featureCollection], [GeoJsonSource.data], [GeoJsonSource.url]\n * will clear any pending GeoJSON source data operations if they were scheduled before.\n *\n * @param dataId An arbitrary string used to track the given GeoJSON data, empty string means null ID.\n * @param features the GeoJSON features to be updated in the source.\n *\n */\n@JvmOverloads\nfun GeoJsonSource.updateGeoJSONSourceFeatures(\n  features: List<Feature>,\n  dataId: String = \"\",\n) {\n  delegate?.let { style ->\n    workerHandler.post {\n      style.updateGeoJSONSourceFeatures(\n        this.sourceId,\n        dataId,\n        features\n      )\n    }\n  } ?: logW(TAG, \"GeoJsonSource.updateGeoJSONSourceFeatures is ignored. Style is not loaded yet.\")\n}\n\n/**\n * Remove features from a GeoJSON style source.\n * The data will be scheduled and applied on a worker thread.\n *\n * To check the result of the operation, use events API, which will propagate a `map-loaded` event upon success\n * or a `map-loading-error` event upon failure.\n *\n * Partially updating a GeoJSON source is not compatible with using shared cache and generated IDs.\n * It is important to ensure that every feature in the GeoJSON style source, as well as the newly added\n * feature, has a unique ID (or a unique promote ID if in use). Failure to provide unique IDs will result\n * in a `map-loading-error`.\n *\n * The method allows the user to provide a data ID, which will be returned as the dataId parameter in the\n * `source-data-loaded` event. However, it's important to note that multiple partial updates can be queued\n * for the same GeoJSON source when ongoing source parsing is taking place. In these cases, the partial\n * updates will be applied to the source in batches. Only the data ID provided in the most recent call within\n * each batch will be included in the `source-data-loaded` event. If no data ID is provided in the most recent\n * call, the data ID in the `source-data-loaded`event will be null.\n *\n * Note: This method is not thread-safe. The List<String> will be processed on a worker thread,\n * please make sure the underlying features are immutable.\n *\n * Note: calling [GeoJsonSource.geometry], [GeoJsonSource.feature], [GeoJsonSource.featureCollection], [GeoJsonSource.data], [GeoJsonSource.url]\n * will clear any pending GeoJSON source data operations if they were scheduled before.\n *\n * @param dataId An arbitrary string used to track the given GeoJSON data, empty string means null ID.\n * @param featureIds the Ids of the features that need to be removed from the source.\n *\n */\n@JvmOverloads\nfun GeoJsonSource.removeGeoJSONSourceFeatures(\n  featureIds: List<String>,\n  dataId: String = \"\",\n) {\n  delegate?.let { style ->\n    workerHandler.post {\n      style.removeGeoJSONSourceFeatures(\n        this.sourceId,\n        dataId,\n        featureIds\n      )\n    }\n  } ?: logW(TAG, \"GeoJsonSource.removeGeoJSONSourceFeatures is ignored. Style is not loaded yet.\")\n}\n\nprivate const val TAG = \"GeoJsonSourceUtils\""
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/ImageSourceExt.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport android.graphics.Bitmap\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.extension.style.sources.generated.ImageSource\nimport com.mapbox.maps.extension.style.utils.check\nimport com.mapbox.maps.toMapboxImage\n\n/**\n * Updates the image of an image style source with [Bitmap] provided.\n *\n * See [https://docs.mapbox.com/mapbox-gl-js/style-spec/#sources-image](https://docs.mapbox.com/mapbox-gl-js/style-spec/#sources-image)\n *\n * Important: This method will allocate native memory outside the JVM heap every time it is called.\n * Even if the same [bitmap] is passed.\n *\n * @param bitmap [Bitmap] to update given image style source.\n */\n@OptIn(MapboxDelicateApi::class)\nfun ImageSource.updateImage(bitmap: Bitmap) {\n  this.delegate?.updateStyleImageSourceImage(this.sourceId, bitmap.toMapboxImage()).check()\n}\n\n/**\n * Updates the image of an image style source with [Image] provided.\n *\n * See [https://docs.mapbox.com/mapbox-gl-js/style-spec/#sources-image](https://docs.mapbox.com/mapbox-gl-js/style-spec/#sources-image)\n *\n * @param image [Image] to update given image style source.\n */\nfun ImageSource.updateImage(image: Image) {\n  this.delegate?.updateStyleImageSourceImage(this.sourceId, image).check()\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/Source.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport android.util.Log\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.sources.generated.RasterArraySource\nimport com.mapbox.maps.extension.style.sources.generated.unwrapToModelSourceModels\nimport com.mapbox.maps.extension.style.utils.unwrap\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\n\n/**\n * Base class for sources.\n *\n * Specification of a data source.\n * For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided.\n * For image and video sources, a URL must be provided.\n * For GeoJSON sources, a URL or inline GeoJSON must be provided.\n */\n@OptIn(MapboxExperimental::class)\nabstract class Source(\n  /**\n   * The ID of the Source.\n   */\n  val sourceId: String\n) : StyleContract.StyleSourceExtension {\n  /**\n   * Get the type of the current source as a String.\n   */\n  @SuppressWarnings(\"HiddenAbstractMethod\")\n  internal abstract fun getType(): String\n\n  /**\n   * Properties of this source.\n   */\n  internal val sourceProperties by lazy {\n    HashMap<String, PropertyValue<*>>().also { map ->\n      map[\"type\"] = PropertyValue(\"type\", getType())\n    }\n  }\n\n  /**\n   * Volatile properties of this source. These properties can only be set after the source is added to the style.\n   */\n  internal val volatileSourceProperties by lazy {\n    HashMap<String, PropertyValue<*>>()\n  }\n\n  internal var delegate: MapboxStyleManager? = null\n\n  protected open fun addSource(style: MapboxStyleManager): Expected<String, None> {\n    return style.addStyleSource(sourceId, getCachedSourceProperties())\n  }\n\n  /**\n   * Add the source to the Style.\n   *\n   * @param delegate The style delegate\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    this.delegate = delegate\n    val expected = addSource(delegate)\n    expected.error?.let {\n      Log.e(TAG, getCachedSourceProperties().toString())\n      throw MapboxStyleException(\"Add source failed: $it\")\n    }\n\n    // Set volatile properties.\n    volatileSourceProperties.forEach {\n      updateProperty(it.value)\n    }\n  }\n\n  // Source Properties\n\n  private fun getCachedSourceProperties(): Value {\n    val properties = HashMap<String, Value>()\n\n    // For now only volatile property could be set during construction, all other properties\n    // can be set only after source is created.\n    sourceProperties.values.forEach {\n      properties[it.propertyName] = it.value\n    }\n    return Value(properties)\n  }\n\n  internal fun setProperty(property: PropertyValue<*>, throwRuntimeException: Boolean = true) {\n    sourceProperties[property.propertyName] = property\n    updateProperty(property, throwRuntimeException)\n  }\n\n  internal fun setVolatileProperty(property: PropertyValue<*>) {\n    volatileSourceProperties[property.propertyName] = property\n    updateProperty(property)\n  }\n\n  private fun updateProperty(property: PropertyValue<*>, throwRuntimeException: Boolean = true) {\n    delegate?.let { styleDelegate ->\n      try {\n        val expected = styleDelegate.setStyleSourceProperty(\n          sourceId,\n          property.propertyName,\n          property.value\n        )\n        expected.error?.let { error ->\n          \"Set source property \\\"${property.propertyName}\\\" failed:\\nError: $error\\nValue set: ${property.value}\".let {\n            if (throwRuntimeException) {\n              throw MapboxStyleException(it)\n            } else {\n              logE(TAG, it)\n            }\n          }\n        }\n      } catch (e: IllegalStateException) {\n        if (throwRuntimeException) {\n          throw e\n        } else {\n          logE(TAG, e.message ?: \"\")\n        }\n      }\n    }\n  }\n\n  internal inline fun <reified T> getPropertyValue(propertyName: String): T? {\n    delegate?.let { styleManager ->\n      return try {\n        val stylePropertyValue = styleManager.getStyleSourceProperty(sourceId, propertyName)\n        if (propertyName == \"rasterLayers\" && stylePropertyValue.kind == StylePropertyValueKind.CONSTANT) {\n          return (stylePropertyValue.value.contents as HashMap<String, Value>).entries.map { entry ->\n            RasterArraySource.RasterDataLayer(\n              layerId = entry.key,\n              bands = (entry.value.contents as List<Value>).map { it.contents as String }\n            )\n          } as T\n        }\n        if (propertyName == \"tile-cache-budget\" && stylePropertyValue.kind == StylePropertyValueKind.CONSTANT) {\n          return stylePropertyValue.value.unwrapToTileCacheBudget() as T\n        }\n        if (propertyName == \"models\") {\n          return stylePropertyValue.value.unwrapToModelSourceModels() as T\n        }\n        stylePropertyValue.unwrap()\n      } catch (e: RuntimeException) {\n        logW(TAG, \"Get source property $propertyName failed: ${e.message}\")\n        val propertyValue = styleManager.getStyleSourceProperty(sourceId, propertyName)\n        logW(TAG, \"Value returned: ${propertyValue.value.toJson()}\")\n        null\n      }\n    }\n    throw MapboxStyleException(\"Couldn't get $propertyName: source is not added to style yet.\")\n  }\n\n  /**\n   * Returns a human readable string that includes the cached properties of the source.\n   *\n   * @return String\n   */\n  override fun toString(): String {\n    return \"[sourceId = $sourceId, ${sourceProperties.values.joinToString { propertyValue -> \"${propertyValue.propertyName} = ${propertyValue.value}\" }}}]\"\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val TAG = \"Mbgl-Source\"\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/SourceExt.kt",
    "content": "@file:JvmName(\"SourceUtils\")\n\npackage com.mapbox.maps.extension.style.sources\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.CustomGeometrySourceOptions\nimport com.mapbox.maps.CustomRasterSourceOptions\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.TileCacheBudgetInTiles\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport com.mapbox.maps.logW\n\n/**\n * Extension function to get a Source provided by the Style Extension by source id.\n *\n * @param sourceId the source id\n * @return StyleSourcePlugin\n */\n@OptIn(MapboxExperimental::class)\nfun MapboxStyleManager.getSource(sourceId: String): Source? {\n  return this.getStyleSourceProperty(sourceId, \"type\").silentUnwrap<String>()?.let { type ->\n    when (type) {\n      \"vector\" -> VectorSource.Builder(sourceId).build().also { it.delegate = this }\n      \"geojson\" -> GeoJsonSource.Builder(sourceId).build().also { it.delegate = this }\n      \"image\" -> ImageSource.Builder(sourceId).build().also { it.delegate = this }\n      \"raster-dem\" -> RasterDemSource.Builder(sourceId).build().also { it.delegate = this }\n      \"raster\" -> RasterSource.Builder(sourceId).build().also { it.delegate = this }\n      \"raster-array\" -> RasterArraySource.Builder(sourceId).build().also { it.delegate = this }\n      // we pass empty CustomGeometrySourceOptions as it will not be applied anyway; it is already stored in core\n      \"custom-geometry\" -> CustomGeometrySource(\n        sourceId,\n        CustomGeometrySourceOptions.Builder().build()\n      )\n        .also { it.delegate = this }\n      // we pass empty CustomRasterSourceOptions as it will not be applied anyway; it is already stored in core\n      \"custom-raster\" -> CustomRasterSource(sourceId, CustomRasterSourceOptions.Builder().build())\n        .also { it.delegate = this }\n      \"model\" -> ModelSource.Builder(sourceId).build().also { it.delegate = this }\n\n      else -> {\n        logW(\"StyleSourcePlugin\", \"Source type: $type unknown.\")\n        null\n      }\n    }\n  }\n}\n\n/**\n * Tries to cast the Source to T.\n *\n * @param sourceId the layer id\n * @return T if Source is T and null otherwise\n */\n@SuppressWarnings(\"ChangedType\")\ninline fun <reified T : Source> MapboxStyleManager.getSourceAs(sourceId: String): T? {\n  val source = getSource(sourceId)\n  if (source !is T) {\n    logW(\n      \"StyleSourcePlugin\",\n      \"Given sourceId = $sourceId is not requested type in getSourceAs.\"\n    )\n    return null\n  }\n  return source\n}\n\n/**\n * Extension function to add a Source provided by the Style Extension to the Style.\n *\n * @param source The source to be added\n */\nfun MapboxStyleManager.addSource(source: StyleContract.StyleSourceExtension) {\n  source.bindTo(this)\n}\n\n/**\n * Convert [TileCacheBudget] to a [Value] class to be passed to sources.\n */\n@JvmSynthetic\ninternal fun TileCacheBudget.toValue(): Value {\n  val hashMap = HashMap<String, Value>()\n  when (typeInfo) {\n    TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES -> {\n      hashMap[\"megabytes\"] = Value(tileCacheBudgetInMegabytes.size)\n    }\n\n    TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_TILES -> {\n      hashMap[\"tiles\"] = Value(tileCacheBudgetInTiles.size)\n    }\n    else -> throw MapboxStyleException(\"Failed to parse TileCacheBudget: $this\")\n  }\n  return Value(hashMap)\n}\n\n/**\n * Parse [Value] to a [TileCacheBudget].\n */\n@JvmSynthetic\ninternal fun Value.unwrapToTileCacheBudget(): TileCacheBudget {\n  (contents as? HashMap<String, Value>)?.let {\n    if (it.size != 1) {\n      throw MapboxStyleException(\"Map memory budget setting must contain 'tiles' or 'megabytes' property, but was $this\")\n    }\n    val entry = it.entries.first()\n    if (entry.key == \"tiles\") {\n      return TileCacheBudget(TileCacheBudgetInTiles(entry.value.contents as Long))\n    } else if (entry.key == \"megabytes\") {\n      return TileCacheBudget(TileCacheBudgetInMegabytes(entry.value.contents as Long))\n    }\n  }\n  throw MapboxStyleException(\"Can not parse $this to TileCacheBudget.\")\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/TileSet.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.style.sources.generated.Encoding\nimport com.mapbox.maps.extension.style.sources.generated.Scheme\nimport java.util.HashMap\n\n/**\n * Tile set, allows using TileJson specification as source.\n * Note that `encoding` is only relevant to `raster-dem` sources, and is not supported in the TileJson spec.\n *\n * @see [The tileset specification](https://github.com/mapbox/tilejson-spec/tree/master/2.1.0)\n */\nclass TileSet private constructor(builder: Builder) : HashMap<String, Value>(builder.parameters) {\n  /**\n   * Builder for TileSet.\n   */\n  open class Builder(\n    /**\n     * @param tilejson A semver.org style version number. Describes the version of the TileJSON spec that is implemented\n     *                 by this JSON object.\n     */\n    val tilejson: String,\n    /**\n     * @param tiles An array of tile endpoints. {z}, {x} and {y}, if present, are replaced with the corresponding\n     *                 integers.\n     *                 If multiple endpoints are specified, clients may use any combination of endpoints. All endpoints\n     *                 MUST return the same\n     *                 content for the same URL. The array MUST contain at least one endpoint.\n     *                 Example: \"http:localhost:8888/admin/1.0.0/world-light,broadband/{z}/{x}/{y}.png\"\n     */\n    val tiles: List<String>\n  ) {\n    internal val parameters: HashMap<String, Value> = HashMap()\n\n    init {\n      parameters[\"tilejson\"] = Value(tilejson)\n      parameters[\"tiles\"] = Value(tiles.map(::Value))\n    }\n\n    /**\n     * A name describing the tileset. The name can\n     * contain any legal character. Implementations SHOULD NOT interpret the\n     * name as HTML.\n     * \"name\": \"compositing\",\n     *\n     * @param value the name to be set\n     */\n    fun name(value: String): Builder = apply {\n      parameters[\"name\"] = Value(value)\n    }\n\n    /**\n     * A text description of the tileset. The\n     * description can contain any legal character.\n     * Implementations SHOULD NOT\n     * interpret the description as HTML.\n     * \"description\": \"A simple, light grey world.\"\n     *\n     * @param value the description to set\n     */\n    fun description(value: String): Builder = apply {\n      parameters[\"description\"] = Value(value)\n    }\n\n    /**\n     *  Default: \"1.0.0\". A semver.org style version number. When\n     *  changes across tiles are introduced, the minor version MUST change.\n     *  This may lead to cut off labels. Therefore, implementors can decide to\n     *  clean their cache when the minor version changes. Changes to the patch\n     *  level MUST only have changes to tiles that are contained within one tile.\n     *  When tiles change significantly, the major version MUST be increased.\n     *  Implementations MUST NOT use tiles with different major versions.\n     *\n     *  @param value the version to set\n     */\n    fun version(value: String = \"1.0.0\"): Builder = apply {\n      parameters[\"version\"] = Value(value)\n    }\n\n    /**\n     * Default: null. Contains an attribution to be displayed\n     * when the map is shown to a user. Implementations MAY decide to treat this\n     * as HTML or literal text. For security reasons, make absolutely sure that\n     * this field can't be abused as a vector for XSS or beacon tracking.\n     * \"attribution\": \"[OSM contributors](http:openstreetmap.org)\",\n     *\n     * @param value the attribution to set\n     */\n    fun attribution(value: String): Builder = apply {\n      parameters[\"attribution\"] = Value(value)\n    }\n\n    /**\n     * Contains a mustache template to be used to\n     * format data from grids for interaction.\n     * See https:github.com/mapbox/utfgrid-spec/tree/master/1.2\n     * for the interactivity specification.\n     * \"template\": \"{{#__teaser__}}{{NAME}}{{/__teaser__}}\"\n     *\n     * @param value the template to set\n     */\n    fun template(value: String): Builder = apply {\n      parameters[\"template\"] = Value(value)\n    }\n\n    /**\n     * Contains a legend to be displayed with the map.\n     * Implementations MAY decide to treat this as HTML or literal text.\n     * For security reasons, make absolutely sure that this field can't be\n     * abused as a vector for XSS or beacon tracking.\n     * \"legend\": \"Dangerous zones are red, safe zones are green\"\n     *\n     * @param value the legend to set\n     */\n    fun legend(value: String): Builder = apply {\n      parameters[\"legend\"] = Value(value)\n    }\n\n    /**\n     * Default: \"xyz\". Either \"xyz\" or \"tms\". Influences the y\n     * direction of the tile coordinates.\n     * The global-mercator (aka Spherical Mercator) profile is assumed.\n     * \"scheme\": \"xyz\"\n     *\n     * @param value the scheme to set\n     */\n    fun scheme(value: Scheme): Builder = apply {\n      parameters[\"scheme\"] = Value(value.value)\n    }\n\n    /**\n     * An array of interactivity endpoints. {z}, {x}\n     * and {y}, if present, are replaced with the corresponding integers. If multiple\n     * endpoints are specified, clients may use any combination of endpoints.\n     * All endpoints MUST return the same content for the same URL.\n     * If the array doesn't contain any entries, interactivity is not supported\n     * for this tileset.     See https:github.com/mapbox/utfgrid-spec/tree/master/1.2\n     * for the interactivity specification.\n     *\n     *\n     * Example: \"http:localhost:8888/admin/1.0.0/broadband/{z}/{x}/{y}.grid.json\"\n     *\n     * @param value the grids to set\n     */\n    fun grids(value: List<String>): Builder = apply {\n      parameters[\"grids\"] = Value(value.map(::Value))\n    }\n\n    /**\n     * An array of data files in GeoJSON format.\n     * {z}, {x} and {y}, if present,\n     * are replaced with the corresponding integers. If multiple\n     * endpoints are specified, clients may use any combination of endpoints.\n     * All endpoints MUST return the same content for the same URL.\n     * If the array doesn't contain any entries, then no data is present in\n     * the map.\n     *\n     *\n     * \"http:localhost:8888/admin/data.geojson\"\n     *\n     * @param value the data array to set\n     */\n    fun data(value: List<String>): Builder = apply {\n      parameters[\"data\"] = Value(value.map(::Value))\n    }\n\n    /**\n     * Default to 0. &gt;= 0, &lt; 22. An integer specifying the minimum zoom level.\n     *\n     * @param value the minZoom level to set\n     */\n    fun minZoom(value: Int = 0): Builder = apply {\n      parameters[\"minzoom\"] = Value(value.toLong())\n    }\n\n    /**\n     * Default to 30. &gt;= 0, &lt;= 22. An integer specifying the maximum zoom level.\n     *\n     * @param value the maxZoom level to set\n     */\n    fun maxZoom(value: Int = 30): Builder = apply {\n      parameters[\"maxzoom\"] = Value(value.toLong())\n    }\n\n    /**\n     * Default: [-180, -90, 180, 90]. The maximum extent of available map tiles. Bounds MUST define an area\n     * covered by all zoom levels. The bounds are represented in WGS:84\n     * latitude and longitude values, in the order left, bottom, right, top.\n     * Values may be integers or floating point numbers.\n     *\n     * @param value the Double list to set\n     */\n    fun bounds(value: List<Double> = listOf(-180.0, -90.0, 180.0, 90.0)): Builder = apply {\n      parameters[\"bounds\"] = Value(value.map(::Value))\n    }\n\n    /**\n     * The first value is the longitude, the second is latitude (both in\n     * WGS:84 values), the third value is the zoom level as an integer.\n     * Longitude and latitude MUST be within the specified bounds.\n     * The zoom level MUST be between minzoom and maxzoom.\n     * Implementations can use this value to set the default location. If the\n     * value is null, implementations may use their own algorithm for\n     * determining a default location.\n     *\n     * @param value the Double array to set\n     */\n    fun center(value: List<Double>): Builder = apply {\n      parameters[\"center\"] = Value(value.map(::Value))\n    }\n\n    /**\n     * Build the TileSet.\n     *\n     * @return the constructed TileSet\n     */\n    fun build(): TileSet = TileSet(this)\n  }\n  /**\n   * Builder of TileSet for RasterDemSource.\n   */\n  class RasterDemBuilder(\n    /**\n     * @param tilejson A semver.org style version number. Describes the version of the TileJSON spec that is implemented\n     *                 by this JSON object.\n     */\n    tilejson: String,\n    /**\n     * @param tiles An array of tile endpoints. {z}, {x} and {y}, if present, are replaced with the corresponding\n     *                 integers.\n     *                 If multiple endpoints are specified, clients may use any combination of endpoints. All endpoints\n     *                 MUST return the same\n     *                 content for the same URL. The array MUST contain at least one endpoint.\n     *                 Example: \"http:localhost:8888/admin/1.0.0/world-light,broadband/{z}/{x}/{y}.png\"\n     */\n    tiles: List<String>\n  ) : Builder(tilejson, tiles) {\n    /**\n     * Default: \"mapbox\". The encoding formula for a raster-dem tileset.\n     * Supported values are \"mapbox\" and \"terrarium\".\n     *\n     * @param value the String to set\n     */\n    fun encoding(value: Encoding): RasterDemBuilder = apply {\n      parameters[\"encoding\"] = Value(value.value)\n    }\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/generated/GeoJsonSource.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport android.os.Handler\nimport android.os.HandlerThread\nimport android.os.Looper\nimport android.os.Process.THREAD_PRIORITY_DEFAULT\nimport android.os.Trace\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.MapboxTracing\nimport com.mapbox.common.MapboxTracing.MAPBOX_TRACE_ID\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.GeoJson\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.*\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.sources.Source\nimport com.mapbox.maps.extension.style.types.PromoteId\nimport com.mapbox.maps.extension.style.types.SourceDsl\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport org.json.JSONObject\nimport java.util.*\n\n/**\n * A GeoJSON data source.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources/#geojson)\n *\n */\nclass GeoJsonSource private constructor(builder: Builder) : Source(builder.sourceId) {\n\n  private var currentGeoJson: GeoJson?\n  private var currentData: String?\n  private var currentDataId: String\n\n  init {\n    sourceProperties.putAll(builder.properties)\n    volatileSourceProperties.putAll(builder.volatileProperties)\n    currentGeoJson = builder.geoJson\n    currentData = builder.data\n    currentDataId = builder.dataId\n  }\n\n  internal val workerHandler by lazy {\n    Handler(workerThread.looper)\n  }\n\n  private val mainHandler by lazy {\n    Handler(Looper.getMainLooper())\n  }\n\n  private fun setDataAsync(data: GeoJSONSourceData, dataId: String) {\n    delegate?.let { style ->\n      workerHandler.removeCallbacksAndMessages(null)\n      workerHandler.post {\n        var nativeExpected: Expected<String, None>? = null\n        var nativeException: Throwable? = null\n        val tracingEnabled = MapboxTracing.platformTracingEnabled\n        if (tracingEnabled) {\n          Trace.beginSection(\"$MAPBOX_TRACE_ID: GeoJSONSource#setSourceData\")\n        }\n        try {\n          nativeExpected = style.setStyleGeoJSONSourceData(sourceId, dataId, data)\n        } catch (e: Throwable) {\n          nativeException = e\n        } finally {\n          if (tracingEnabled) {\n            Trace.endSection()\n          }\n        }\n        if (nativeExpected?.isError == true || nativeException != null) {\n          val errorJsonString = JSONObject().apply {\n            put(\"dataId\", dataId)\n            put(\"message\", \"setStyleGeoJSONSourceData error: ${nativeExpected?.error ?: nativeException?.message}\")\n          }.toString()\n          val errorTime = Date()\n          logW(TAG, \"set GeoJSON data error: $errorJsonString\")\n          mainHandler.post {\n            style.mapLoadingErrorDelegate.sendMapLoadingError(\n              MapLoadingError(\n                MapLoadingErrorType.SOURCE,\n                errorJsonString,\n                sourceId,\n                null,\n                errorTime\n              )\n            )\n          }\n        }\n      }\n    }\n  }\n\n  private fun setGeoJson(geoJson: GeoJson, dataId: String) {\n    setDataAsync(toGeoJsonData(geoJson), dataId)\n    currentGeoJson = geoJson\n    currentDataId = dataId\n    currentData = null\n  }\n\n  private fun setData(data: String, dataId: String) {\n    setDataAsync(GeoJSONSourceData.valueOf(data), dataId)\n    currentData = data\n    currentDataId = dataId\n    currentGeoJson = null\n  }\n\n  /**\n   * Add the GeoJsonSource to the Style.\n   *\n   * @param delegate The style delegate\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    super.bindTo(delegate)\n    currentGeoJson?.let {\n      setGeoJson(it, currentDataId)\n    }\n    currentData?.let {\n      setData(it, currentDataId)\n    }\n  }\n\n  /**\n   * Get the type of the current source as a String.\n   */\n  override fun getType(): String {\n    return \"geojson\"\n  }\n\n  /**\n   * Sets GeoJson `data` property as a [String].\n   * [value] could be an URL to a GeoJSON file, or an inline GeoJSON.\n   *\n   * The data will be scheduled and applied on a worker thread and no validation happens synchronously.\n   * If [value] is invalid - `MapLoadingError` with `type = source` will be invoked.\n   *\n   * @param value an URL to a GeoJSON file, or an inline GeoJSON.\n   * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n   */\n  @JvmOverloads\n  fun data(value: String, dataId: String = \"\"): GeoJsonSource = apply {\n    setData(value, dataId)\n  }\n\n  /**\n   * A URL to a GeoJSON file, or inline GeoJSON.\n   *\n   * Note: Getter for plain Geojson string data is not supported due to performance consideration.\n   */\n  val data: String?\n    /**\n     * Get the Data property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"data\")\n\n  /**\n   * @param value an URL to a GeoJSON file, or an inline GeoJSON.\n   * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n   */\n  @JvmOverloads\n  @Deprecated(\n    message = \"Method url() is deprecated in favor of data() method as they do the same thing\",\n    replaceWith = ReplaceWith(\"data(value, dataId)\")\n  )\n  fun url(value: String, dataId: String = \"\"): GeoJsonSource = apply {\n    data(value, dataId)\n  }\n\n  /**\n   * Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom\n   * levels).\n   * Default value: 18.\n   */\n  val maxzoom: Long?\n    /**\n     * Get the Maxzoom property\n     *\n     * Use static method [GeoJsonSource.defaultMaxzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * Minimum zoom level at which to create vector tiles\n   * Default value: 0.\n   */\n  val minzoom: Long?\n    /**\n     * Get the Minzoom property\n     *\n     * Use static method [GeoJsonSource.defaultMinzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  val attribution: String?\n    /**\n     * Get the Attribution property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"attribution\")\n\n  /**\n   * Size of the tile buffer on each side. A value of 0 produces no buffer. A\n   * value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer\n   * rendering artifacts near tile edges and slower performance.\n   * Default value: 128. Value range: [0, 512]\n   */\n  val buffer: Long?\n    /**\n     * Get the Buffer property\n     *\n     * Use static method [GeoJsonSource.defaultBuffer] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"buffer\")\n\n  /**\n   * Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\n   * Default value: 0.375.\n   */\n  val tolerance: Double?\n    /**\n     * Get the Tolerance property\n     *\n     * Use static method [GeoJsonSource.defaultTolerance] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"tolerance\")\n\n  /**\n   * If the data is a collection of point features, setting this to true clusters the points\n   * by radius into groups. Cluster groups become new `Point` features in the source with additional properties:\n   *  - `cluster` Is `true` if the point is a cluster\n   *  - `cluster_id` A unqiue id for the cluster to be used in conjunction with the\n   * [cluster inspection methods](https://www.mapbox.com/mapbox-gl-js/api/#geojsonsource#getclusterexpansionzoom)\n   *  - `point_count` Number of original points grouped into this cluster\n   *  - `point_count_abbreviated` An abbreviated point count\n   * Default value: false.\n   */\n  val cluster: Boolean?\n    /**\n     * Get the Cluster property\n     *\n     * Use static method [GeoJsonSource.defaultCluster] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() = getPropertyValue(\"cluster\")\n\n  /**\n   * Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal\n   * to the width of a tile.\n   * Default value: 50. Minimum value: 0.\n   */\n  val clusterRadius: Long?\n    /**\n     * Get the ClusterRadius property\n     *\n     * Use static method [GeoJsonSource.defaultClusterRadius] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"clusterRadius\")\n\n  /**\n   * Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less\n   * than maxzoom (so that last zoom features are not clustered). Clusters are re-evaluated at integer zoom\n   * levels so setting clusterMaxZoom to 14 means the clusters will be displayed until z15.\n   */\n  val clusterMaxZoom: Long?\n    /**\n     * Get the ClusterMaxZoom property\n     *\n     * Use static method [GeoJsonSource.defaultClusterMaxZoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"clusterMaxZoom\")\n\n  /**\n   * Minimum number of points necessary to form a cluster if clustering is enabled. Defaults to `2`.\n   */\n  val clusterMinPoints: Long?\n    /**\n     * Get the ClusterMinPoints property\n     *\n     * Use static method [GeoJsonSource.defaultClusterMinPoints] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"clusterMinPoints\")\n\n  /**\n   * An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from\n   * clustered points. Has the form `{\"property_name\": [operator, map_expression]}`. `operator` is any expression function that accepts at\n   * least 2 operands (e.g. `\"+\"` or `\"max\"`) — it accumulates the property value from clusters/points the\n   * cluster contains; `map_expression` produces the value of a single point.\n   *\n   * Example: `{\"sum\": [\"+\", [\"get\", \"scalerank\"]]}`.\n   *\n   * For more advanced use cases, in place of `operator`, you can use a custom reduce expression\n   * that references a special `[\"accumulated\"]` value, e.g.:\n   * `{\"sum\": [[\"+\", [\"accumulated\"], [\"get\", \"sum\"]], [\"get\", \"scalerank\"]]}`\n   */\n  val clusterProperties: HashMap<String, Any>?\n    /**\n     * Get the ClusterProperties property\n     *\n     * @return HashMap<String, Any>\n     */\n    get() = getPropertyValue(\"clusterProperties\")\n\n  /**\n   * Whether to calculate line distance metrics. This is required for line layers that specify `line-gradient` values.\n   * Default value: false.\n   */\n  val lineMetrics: Boolean?\n    /**\n     * Get the LineMetrics property\n     *\n     * Use static method [GeoJsonSource.defaultLineMetrics] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() = getPropertyValue(\"lineMetrics\")\n\n  /**\n   * Whether to generate ids for the GeoJSON features. When enabled, the `feature.id` property will be auto\n   * assigned based on its index in the `features` array, over-writing any previous values.\n   * Default value: false.\n   */\n  val generateId: Boolean?\n    /**\n     * Get the GenerateId property\n     *\n     * Use static method [GeoJsonSource.defaultGenerateId] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() = getPropertyValue(\"generateId\")\n\n  /**\n   * A property to use as a feature id. An expression can be used to dynamically check\n   * multiple properties.\n   */\n  val promoteId: PromoteId?\n    /**\n     * Get the PromoteId property\n     *\n     * @return PromoteId\n     */\n    get() {\n      val propertyValue = getPropertyValue<Any>(\"promoteId\")\n      propertyValue?.let {\n        return PromoteId.fromProperty(it)\n      }\n      return null\n    }\n\n  /**\n   * When set to true, the maxZoom property is ignored and is instead calculated automatically based on\n   * the largest bounding box from the geojson features. This resolves rendering artifacts for features that use\n   * wide blur (e.g. fill extrusion ground flood light or circle layer) and would bring performance improvement\n   * on lower zoom levels, especially for geoJSON sources that update data frequently. However, it can lead\n   * to flickering and precision loss on zoom levels above 19. This option is not supported in\n   * combination with clustering.\n   * Default value: false.\n   */\n  @MapboxExperimental\n  val autoMaxZoom: Boolean?\n    /**\n     * Get the AutoMaxZoom property\n     *\n     * @return Boolean\n     */\n    get() = getPropertyValue(\"autoMaxZoom\")\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  fun prefetchZoomDelta(value: Long = 4L): GeoJsonSource = apply {\n    setVolatileProperty(PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  val prefetchZoomDelta: Long?\n    /**\n     * Get the PrefetchZoomDelta property\n     *\n     * Use static method [GeoJsonSource.defaultPrefetchZoomDelta] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"prefetch-zoom-delta\")\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  fun tileCacheBudget(value: TileCacheBudget): GeoJsonSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  val tileCacheBudget: TileCacheBudget?\n    /**\n     * Get the TileCacheBudget property\n     *\n     * @return TileCacheBudget\n     */\n    get() = getPropertyValue(\"tile-cache-budget\")\n\n  /**\n   * Add a Feature to the GeojsonSource.\n   * The data will be scheduled and applied on a worker thread.\n   *\n   * In order to capture events when actual data is drawn on the map please refer to [Observer] API\n   * and listen to `SourceDataLoaded` (optionally pass `data-id` to filter the events)\n   * or `MapLoadingError` with `type = source` if data parsing error has occurred.\n   *\n   * Note: This method is not thread-safe. The Feature is parsed on a worker thread, please make sure\n   * the Feature is immutable as well as all collections that are used to build it.\n   *\n   * @param value the feature\n   * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n   */\n  @JvmOverloads\n  fun feature(value: Feature, dataId: String = \"\"): GeoJsonSource = applyGeoJsonData(value, dataId)\n\n  /**\n   * Add a Feature Collection to the GeojsonSource.\n   * The data will be scheduled and applied on a worker thread.\n   *\n   * In order to capture events when actual data is drawn on the map please refer to [Observer] API\n   * and listen to `SourceDataLoaded` (optionally pass `data-id` to filter the events)\n   * or `MapLoadingError` with `type = source` if data parsing error has occurred.\n   *\n   * Note: This method is not thread-safe. The FeatureCollection is parsed on a worker thread, please make sure\n   * the FeatureCollection is immutable as well as all collections that are used to build it.\n   *\n   * @param value the feature collection\n   * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n   */\n  @JvmOverloads\n  fun featureCollection(value: FeatureCollection, dataId: String = \"\"): GeoJsonSource = applyGeoJsonData(value, dataId)\n\n  /**\n   * Add a Geometry to the GeojsonSource.\n   * The data will be scheduled and applied on a worker thread.\n   *\n   * In order to capture events when actual data is drawn on the map please refer to [Observer] API\n   * and listen to `SourceDataLoaded` (optionally pass `data-id` to filter the events)\n   * or `MapLoadingError` with `type = source` if data parsing error has occurred.\n   *\n   * Note: This method is not thread-safe. The Geometry is parsed on a worker thread, please make sure\n   * the Geometry is immutable as well as all collections that are used to build it.\n   *\n   * @param value the geometry\n   * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n   */\n  @JvmOverloads\n  fun geometry(value: Geometry, dataId: String = \"\"): GeoJsonSource = applyGeoJsonData(value, dataId)\n\n  private fun applyGeoJsonData(\n    data: GeoJson,\n    dataId: String,\n  ): GeoJsonSource = apply {\n    setGeoJson(data, dataId)\n  }\n\n  /**\n   * Builder for GeoJsonSource.\n   *\n   * @param sourceId the ID of the source\n   */\n  @SourceDsl\n  class Builder(val sourceId: String) {\n    internal val properties = HashMap<String, PropertyValue<*>>()\n    // Properties that only settable after the source is added to the style.\n    internal val volatileProperties = HashMap<String, PropertyValue<*>>()\n\n    internal var geoJson: GeoJson? = null\n    internal var data: String? = null\n    internal var dataId: String = \"\"\n\n    /**\n     * Sets GeoJson `data` property as a [String].\n     * [value] could be an URL to a GeoJSON file, or an inline GeoJSON.\n     *\n     * The data will be scheduled and applied on a worker thread and no validation happens synchronously.\n     * If [value] is invalid - `MapLoadingError` with `type = source` will be invoked.\n     *\n     * @param value an URL to a GeoJSON file, or an inline GeoJSON.\n     * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n     */\n    @JvmOverloads\n    fun data(value: String, dataId: String = \"\"): Builder = apply {\n      geoJson = null\n      data = value\n      this.dataId = dataId\n    }\n\n    /**\n     * @param value an URL to a GeoJSON file, or an inline GeoJSON.\n     * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n     */\n    @JvmOverloads\n    @Deprecated(\n      message = \"Method url() is deprecated in favor of data() method as they do the same thing\",\n      replaceWith = ReplaceWith(\"data(value, dataId)\")\n    )\n    fun url(value: String, dataId: String = \"\"): Builder = apply {\n      data(value, dataId)\n    }\n\n    /**\n     * Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom\n     * levels).\n     * Default value: 18.\n     */\n    fun maxzoom(value: Long = 18L): Builder = apply {\n      val propertyValue = PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum zoom level at which to create vector tiles\n     * Default value: 0.\n     */\n    fun minzoom(value: Long = 0L): Builder = apply {\n      val propertyValue = PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Contains an attribution to be displayed when the map is shown to a user.\n     */\n    fun attribution(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"attribution\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Size of the tile buffer on each side. A value of 0 produces no buffer. A\n     * value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer\n     * rendering artifacts near tile edges and slower performance.\n     * Default value: 128. Value range: [0, 512]\n     */\n    fun buffer(value: Long = 128L): Builder = apply {\n      val propertyValue = PropertyValue(\"buffer\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\n     * Default value: 0.375.\n     */\n    fun tolerance(value: Double = 0.375): Builder = apply {\n      val propertyValue = PropertyValue(\"tolerance\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * If the data is a collection of point features, setting this to true clusters the points\n     * by radius into groups. Cluster groups become new `Point` features in the source with additional properties:\n     *  - `cluster` Is `true` if the point is a cluster\n     *  - `cluster_id` A unqiue id for the cluster to be used in conjunction with the\n     * [cluster inspection methods](https://www.mapbox.com/mapbox-gl-js/api/#geojsonsource#getclusterexpansionzoom)\n     *  - `point_count` Number of original points grouped into this cluster\n     *  - `point_count_abbreviated` An abbreviated point count\n     * Default value: false.\n     */\n    fun cluster(value: Boolean = false): Builder = apply {\n      val propertyValue = PropertyValue(\"cluster\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal\n     * to the width of a tile.\n     * Default value: 50. Minimum value: 0.\n     */\n    fun clusterRadius(value: Long = 50L): Builder = apply {\n      val propertyValue = PropertyValue(\"clusterRadius\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less\n     * than maxzoom (so that last zoom features are not clustered). Clusters are re-evaluated at integer zoom\n     * levels so setting clusterMaxZoom to 14 means the clusters will be displayed until z15.\n     */\n    fun clusterMaxZoom(value: Long): Builder = apply {\n      val propertyValue = PropertyValue(\"clusterMaxZoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum number of points necessary to form a cluster if clustering is enabled. Defaults to `2`.\n     */\n    fun clusterMinPoints(value: Long): Builder = apply {\n      val propertyValue = PropertyValue(\"clusterMinPoints\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from\n     * clustered points. Has the form `{\"property_name\": [operator, map_expression]}`. `operator` is any expression function that accepts at\n     * least 2 operands (e.g. `\"+\"` or `\"max\"`) — it accumulates the property value from clusters/points the\n     * cluster contains; `map_expression` produces the value of a single point.\n     *\n     * Example: `{\"sum\": [\"+\", [\"get\", \"scalerank\"]]}`.\n     *\n     * For more advanced use cases, in place of `operator`, you can use a custom reduce expression\n     * that references a special `[\"accumulated\"]` value, e.g.:\n     * `{\"sum\": [[\"+\", [\"accumulated\"], [\"get\", \"sum\"]], [\"get\", \"scalerank\"]]}`\n     */\n    fun clusterProperties(value: HashMap<String, Any>): Builder = apply {\n      val propertyValue = PropertyValue(\"clusterProperties\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from\n     * clustered points. Has the form `{\"property_name\": [operator, map_expression]}`. `operator` is any expression function that accepts at\n     * least 2 operands (e.g. `\"+\"` or `\"max\"`) — it accumulates the property value from clusters/points the\n     * cluster contains; `map_expression` produces the value of a single point.\n     *\n     * Example: `{\"sum\": [\"+\", [\"get\", \"scalerank\"]]}`.\n     *\n     * For more advanced use cases, in place of `operator`, you can use a custom reduce expression\n     * that references a special `[\"accumulated\"]` value, e.g.:\n     * `{\"sum\": [[\"+\", [\"accumulated\"], [\"get\", \"sum\"]], [\"get\", \"scalerank\"]]}`\n     *\n     * @param propertyName name of the property\n     * @param operatorExpr operatorExpr is any expression function that accepts at least 2 operands (e.g. \"+\" or\n     * \"max\").\n     * It accumulates the property value from clusters/points the cluster contains. It can either be a literal\n     * with single operator, or be a valid expression\n     * @param mapExpr map expression produces the value of a single point, it shall be a valid\n     * expression\n     *\n     */\n    fun clusterProperty(propertyName: String, operatorExpr: Expression, mapExpr: Expression): Builder =\n      apply {\n        @Suppress(\"UNCHECKED_CAST\")\n        val options: HashMap<String, Value> =\n          properties[\"clusterProperties\"]?.value?.contents as? HashMap<String, Value>\n            ?: HashMap()\n        options[propertyName] = Value(listOf(operatorExpr, mapExpr))\n        val propertyValue = PropertyValue(\"clusterProperties\", TypeUtils.wrapToValue(options))\n        properties[propertyValue.propertyName] = propertyValue\n      }\n\n    /**\n     * An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from\n     * clustered points. Has the form `{\"property_name\": [operator, map_expression]}`. `operator` is any expression function that accepts at\n     * least 2 operands (e.g. `\"+\"` or `\"max\"`) — it accumulates the property value from clusters/points the\n     * cluster contains; `map_expression` produces the value of a single point.\n     *\n     * Example: `{\"sum\": [\"+\", [\"get\", \"scalerank\"]]}`.\n     *\n     * For more advanced use cases, in place of `operator`, you can use a custom reduce expression\n     * that references a special `[\"accumulated\"]` value, e.g.:\n     * `{\"sum\": [[\"+\", [\"accumulated\"], [\"get\", \"sum\"]], [\"get\", \"scalerank\"]]}`\n     *\n     * @param propertyName name of the property\n     * @param mapExpr map expression produces the value of a single point, it shall be a valid\n     * expression\n     *\n     */\n    fun clusterProperty(propertyName: String, mapExpr: Expression): Builder =\n      apply {\n        @Suppress(\"UNCHECKED_CAST\")\n        val options: HashMap<String, Value> =\n          properties[\"clusterProperties\"]?.value?.contents as? HashMap<String, Value>\n            ?: HashMap()\n        options[propertyName] = mapExpr\n        val propertyValue = PropertyValue(\"clusterProperties\", TypeUtils.wrapToValue(options))\n        properties[propertyValue.propertyName] = propertyValue\n      }\n\n    /**\n     * Whether to calculate line distance metrics. This is required for line layers that specify `line-gradient` values.\n     * Default value: false.\n     */\n    fun lineMetrics(value: Boolean = false): Builder = apply {\n      val propertyValue = PropertyValue(\"lineMetrics\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Whether to generate ids for the GeoJSON features. When enabled, the `feature.id` property will be auto\n     * assigned based on its index in the `features` array, over-writing any previous values.\n     * Default value: false.\n     */\n    fun generateId(value: Boolean = false): Builder = apply {\n      val propertyValue = PropertyValue(\"generateId\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * A property to use as a feature id. An expression can be used to dynamically check\n     * multiple properties.\n     */\n    fun promoteId(value: PromoteId): Builder = apply {\n      val propertyValue = PropertyValue(\"promoteId\", value.toValue())\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * When set to true, the maxZoom property is ignored and is instead calculated automatically based on\n     * the largest bounding box from the geojson features. This resolves rendering artifacts for features that use\n     * wide blur (e.g. fill extrusion ground flood light or circle layer) and would bring performance improvement\n     * on lower zoom levels, especially for geoJSON sources that update data frequently. However, it can lead\n     * to flickering and precision loss on zoom levels above 19. This option is not supported in\n     * combination with clustering.\n     * Default value: false.\n     */\n    @MapboxExperimental\n    fun autoMaxZoom(value: Boolean = false): Builder = apply {\n      val propertyValue = PropertyValue(\"autoMaxZoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    fun prefetchZoomDelta(value: Long = 4L): Builder = apply {\n      val propertyValue = PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n     * tile cache goes over the defined limit, the least recently used tile will be evicted from\n     * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n     * the visible tiles.\n     */\n    fun tileCacheBudget(value: TileCacheBudget): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Add a Feature to the GeojsonSource.\n     *\n     * @param value the feature\n     * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n     */\n    @JvmOverloads\n    fun feature(value: Feature, dataId: String = \"\"): Builder = apply {\n      geoJson(value, dataId)\n    }\n\n    /**\n     * Add a FeatureCollection to the GeojsonSource.\n     *\n     * @param value the feature collection\n     * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n     */\n    @JvmOverloads\n    fun featureCollection(value: FeatureCollection, dataId: String = \"\"): Builder = apply {\n      geoJson(value, dataId)\n    }\n\n    /**\n     * Add a Geometry to the GeojsonSource.\n     *\n     * @param value the geometry\n     * @param dataId optional metadata to filter the SOURCE_DATA_LOADED events later. Empty string is treated as no data id.\n     */\n    @JvmOverloads\n    fun geometry(value: Geometry, dataId: String = \"\"): Builder = apply {\n      geoJson(value, dataId)\n    }\n\n    private fun geoJson(geoJson: GeoJson, dataId: String) {\n      this.geoJson = geoJson\n      this.dataId = dataId\n      data = null\n    }\n\n    /**\n     * Build the GeoJsonSource.\n     *\n     * @return the GeoJsonSource\n     */\n    @Suppress(\"DEPRECATION_ERROR\")\n    fun build(): GeoJsonSource {\n      // set default data to allow empty data source.\n      val propertyValue = PropertyValue(\"data\", TypeUtils.wrapToValue(\"\"))\n      properties[propertyValue.propertyName] = propertyValue\n      return GeoJsonSource(this)\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val TAG = \"GeoJsonSource\"\n\n    /** A worker thread to parse large geojson data. */\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    internal val workerThread = HandlerThread(\"GEOJSON_PARSER\", THREAD_PRIORITY_DEFAULT).apply {\n      start()\n    }\n\n    internal fun toGeoJsonData(geoJson: GeoJson): GeoJSONSourceData {\n      return when (geoJson) {\n        is Feature -> GeoJSONSourceData.valueOf(geoJson)\n        is Geometry -> GeoJSONSourceData.valueOf(geoJson)\n        is FeatureCollection -> GeoJSONSourceData.valueOf(geoJson.features()!!)\n        else -> throw RuntimeException(\"Incorrect GeoJson data format\")\n      }\n    }\n\n    /**\n     * Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom\n     * levels).\n     * Default value: 18.\n     */\n    val defaultMaxzoom: Long?\n      /**\n       * Get the Maxzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Minimum zoom level at which to create vector tiles\n     * Default value: 0.\n     */\n    val defaultMinzoom: Long?\n      /**\n       * Get the Minzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"minzoom\").silentUnwrap()\n\n    /**\n     * Size of the tile buffer on each side. A value of 0 produces no buffer. A\n     * value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer\n     * rendering artifacts near tile edges and slower performance.\n     * Default value: 128. Value range: [0, 512]\n     */\n    val defaultBuffer: Long?\n      /**\n       * Get the Buffer property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"buffer\").silentUnwrap()\n\n    /**\n     * Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\n     * Default value: 0.375.\n     */\n    val defaultTolerance: Double?\n      /**\n       * Get the Tolerance property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"tolerance\").silentUnwrap()\n\n    /**\n     * If the data is a collection of point features, setting this to true clusters the points\n     * by radius into groups. Cluster groups become new `Point` features in the source with additional properties:\n     *  - `cluster` Is `true` if the point is a cluster\n     *  - `cluster_id` A unqiue id for the cluster to be used in conjunction with the\n     * [cluster inspection methods](https://www.mapbox.com/mapbox-gl-js/api/#geojsonsource#getclusterexpansionzoom)\n     *  - `point_count` Number of original points grouped into this cluster\n     *  - `point_count_abbreviated` An abbreviated point count\n     * Default value: false.\n     */\n    val defaultCluster: Boolean?\n      /**\n       * Get the Cluster property\n       *\n       * @return Boolean\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"cluster\").silentUnwrap()\n\n    /**\n     * Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal\n     * to the width of a tile.\n     * Default value: 50. Minimum value: 0.\n     */\n    val defaultClusterRadius: Long?\n      /**\n       * Get the ClusterRadius property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"clusterRadius\").silentUnwrap()\n\n    /**\n     * Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less\n     * than maxzoom (so that last zoom features are not clustered). Clusters are re-evaluated at integer zoom\n     * levels so setting clusterMaxZoom to 14 means the clusters will be displayed until z15.\n     */\n    val defaultClusterMaxZoom: Long?\n      /**\n       * Get the ClusterMaxZoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"clusterMaxZoom\").silentUnwrap()\n\n    /**\n     * Minimum number of points necessary to form a cluster if clustering is enabled. Defaults to `2`.\n     */\n    val defaultClusterMinPoints: Long?\n      /**\n       * Get the ClusterMinPoints property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"clusterMinPoints\").silentUnwrap()\n\n    /**\n     * Whether to calculate line distance metrics. This is required for line layers that specify `line-gradient` values.\n     * Default value: false.\n     */\n    val defaultLineMetrics: Boolean?\n      /**\n       * Get the LineMetrics property\n       *\n       * @return Boolean\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"lineMetrics\").silentUnwrap()\n\n    /**\n     * Whether to generate ids for the GeoJSON features. When enabled, the `feature.id` property will be auto\n     * assigned based on its index in the `features` array, over-writing any previous values.\n     * Default value: false.\n     */\n    val defaultGenerateId: Boolean?\n      /**\n       * Get the GenerateId property\n       *\n       * @return Boolean\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"generateId\").silentUnwrap()\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    val defaultPrefetchZoomDelta: Long?\n      /**\n       * Get the PrefetchZoomDelta property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"prefetch-zoom-delta\").silentUnwrap()\n  }\n}\n\n/**\n * DSL function for [GeoJsonSource] accepting empty data source.\n * Immediately returns [GeoJsonSource] with no data set.\n */\nfun geoJsonSource(\n  id: String\n): GeoJsonSource = GeoJsonSource.Builder(id).build()\n\n/**\n * DSL function for [GeoJsonSource].\n *\n * Immediately returns [GeoJsonSource] with no data set and starts preparing actual data\n * using a worker thread if [GeoJsonSource.Builder.feature],\n * [GeoJsonSource.Builder.featureCollection] or [GeoJsonSource.Builder.geometry] were applied.\n *\n * If using runtime styling:\n *\n * loadStyle(style(Style.DARK) {\n *   +geoJsonSource(id) {\n *    featureCollection(collection)\n *   }\n *   ...\n * }\n *\n * [Style.OnStyleLoaded] will be emitted without waiting to draw [GeoJsonSource.feature],\n * [GeoJsonSource.featureCollection] or [GeoJsonSource.geometry] on the map.\n *\n * In order to capture events when actual data is drawn on the map please refer to [Observer] API\n * and listen to `SourceDataLoaded` (optionally pass `data-id` with the data update call\n * to filter the events) or `MapLoadingError` with `type = source`\n * if data parsing error has occurred.\n */\nfun geoJsonSource(\n  id: String,\n  block: GeoJsonSource.Builder.() -> Unit\n): GeoJsonSource = GeoJsonSource.Builder(id).apply(block).build()\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/generated/ImageSource.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.sources.Source\nimport com.mapbox.maps.extension.style.types.SourceDsl\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * An image data source.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources/#image)\n *\n */\nclass ImageSource(builder: Builder) : Source(builder.sourceId) {\n\n  init {\n    sourceProperties.putAll(builder.properties)\n    volatileSourceProperties.putAll(builder.volatileProperties)\n  }\n\n  /**\n   * Get the type of the current source as a String.\n   */\n  override fun getType(): String {\n    return \"image\"\n  }\n\n  /**\n   * URL that points to an image. If the URL is not specified, the image is expected\n   * to be loaded directly during runtime.\n   */\n  fun url(value: String): ImageSource = apply {\n    setProperty(PropertyValue(\"url\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * URL that points to an image. If the URL is not specified, the image is expected\n   * to be loaded directly during runtime.\n   */\n  val url: String?\n    /**\n     * Get the Url property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"url\")\n\n  /**\n   * Corners of image specified in longitude, latitude pairs. Note: When using globe projection, the image will\n   * be centered at the North or South Pole in the respective hemisphere if the average latitude\n   * value exceeds 85 degrees or falls below -85 degrees.\n   */\n  fun coordinates(value: List<List<Double>>): ImageSource = apply {\n    setProperty(PropertyValue(\"coordinates\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Corners of image specified in longitude, latitude pairs. Note: When using globe projection, the image will\n   * be centered at the North or South Pole in the respective hemisphere if the average latitude\n   * value exceeds 85 degrees or falls below -85 degrees.\n   */\n  val coordinates: List<List<Double>>?\n    /**\n     * Get the Coordinates property\n     *\n     * @return List<List<Double>>\n     */\n    get() = getPropertyValue(\"coordinates\")\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  fun prefetchZoomDelta(value: Long = 4L): ImageSource = apply {\n    setVolatileProperty(PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  val prefetchZoomDelta: Long?\n    /**\n     * Get the PrefetchZoomDelta property\n     *\n     * Use static method [ImageSource.defaultPrefetchZoomDelta] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"prefetch-zoom-delta\")\n\n  /**\n   * Builder for ImageSource.\n   *\n   * @param sourceId the ID of the source\n   */\n  @SourceDsl\n  class Builder(val sourceId: String) {\n    internal val properties = HashMap<String, PropertyValue<*>>()\n    // Properties that only settable after the source is added to the style.\n    internal val volatileProperties = HashMap<String, PropertyValue<*>>()\n\n    /**\n     * URL that points to an image. If the URL is not specified, the image is expected\n     * to be loaded directly during runtime.\n     */\n    fun url(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"url\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Corners of image specified in longitude, latitude pairs. Note: When using globe projection, the image will\n     * be centered at the North or South Pole in the respective hemisphere if the average latitude\n     * value exceeds 85 degrees or falls below -85 degrees.\n     */\n    fun coordinates(value: List<List<Double>>): Builder = apply {\n      val propertyValue = PropertyValue(\"coordinates\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    fun prefetchZoomDelta(value: Long = 4L): Builder = apply {\n      val propertyValue = PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n    /**\n     * Build the ImageSource.\n     *\n     * @return the ImageSource\n     */\n    fun build(): ImageSource = ImageSource(this)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    val defaultPrefetchZoomDelta: Long?\n      /**\n       * Get the PrefetchZoomDelta property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"image\", \"prefetch-zoom-delta\").silentUnwrap()\n  }\n}\n\n/**\n * DSL function for [ImageSource].\n */\nfun imageSource(id: String, block: ImageSource.Builder.() -> Unit): ImageSource =\n  ImageSource.Builder(id).apply(block).build()\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/generated/ModelSource.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.sources.Source\nimport com.mapbox.maps.extension.style.types.SourceDsl\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A collection of 3D models\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources/#model)\n *\n */\nclass ModelSource(builder: Builder) : Source(builder.sourceId) {\n  private val batched: Boolean\n  private var initialModels: List<ModelSourceModel>? = null\n\n  init {\n    batched = builder.batched\n    initialModels = builder.models\n    sourceProperties.putAll(builder.properties)\n    volatileSourceProperties.putAll(builder.volatileProperties)\n  }\n\n  /**\n   * Get the type of the current source as a String.\n   */\n  override fun getType(): String {\n    return if (batched) \"batched-model\" else \"model\"\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  fun url(value: String): ModelSource = apply {\n    setProperty(PropertyValue(\"url\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  val url: String?\n    /**\n     * Get the Url property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"url\")\n\n  /**\n   * Maximum zoom level at which to create batched model tiles. Data from tiles at the maxzoom\n   * are used when displaying the map at higher zoom levels.\n   * Default value: 18.\n   */\n  fun maxzoom(value: Long = 18L): ModelSource = apply {\n    setProperty(PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Maximum zoom level at which to create batched model tiles. Data from tiles at the maxzoom\n   * are used when displaying the map at higher zoom levels.\n   * Default value: 18.\n   */\n  val maxzoom: Long?\n    /**\n     * Get the Maxzoom property\n     *\n     * Use static method [ModelSource.defaultMaxzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * Minimum zoom level for which batched-model tiles are available\n   * Default value: 0.\n   */\n  fun minzoom(value: Long = 0L): ModelSource = apply {\n    setProperty(PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Minimum zoom level for which batched-model tiles are available\n   * Default value: 0.\n   */\n  val minzoom: Long?\n    /**\n     * Get the Minzoom property\n     *\n     * Use static method [ModelSource.defaultMinzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Requires `batched-model`\n   * source type.\n   */\n  fun tiles(value: List<String>): ModelSource = apply {\n    setProperty(PropertyValue(\"tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Requires `batched-model`\n   * source type.\n   */\n  val tiles: List<String>?\n    /**\n     * Get the Tiles property\n     *\n     * @return List<String>\n     */\n    get() = getPropertyValue(\"tiles\")\n\n  /**\n   * Defines properties of 3D models in collection. Requires `model` source type.\n   */\n  fun models(value: List<ModelSourceModel>): ModelSource = apply {\n    value.forEach { it.bindTo(this) }\n  }\n\n  /**\n   * Defines properties of 3D models in collection. Requires `model` source type.\n   */\n  val models: List<ModelSourceModel>?\n    /**\n     * Get the Models property\n     *\n     * @return List<ModelSourceModel>\n     */\n    get() = getPropertyValue<List<ModelSourceModel>?>(\"models\")\n      .also { it?.forEach { it.source = this } }\n\n  /**\n   * Removes model from source.\n   *\n   * @param model Model to be removed\n   */\n  fun removeModel(model: ModelSourceModel) {\n    removeModel(model.id)\n  }\n\n  /**\n   * Removes model from the source.\n   *\n   * @param id The id of model to be removed\n   */\n  fun removeModel(id: String) {\n    setProperty(PropertyValue(\"models\", TypeUtils.wrapToValue(hashMapOf(id to Value.nullValue()))))\n  }\n\n  /**\n   * Removes all models from the source.\n   */\n  fun removeAllModels() {\n    setProperty(PropertyValue(\"models\", Value.nullValue()))\n  }\n\n  override fun bindTo(delegate: MapboxStyleManager) {\n    super.bindTo(delegate)\n\n    initialModels?.forEach { it.bindTo(this) }\n    initialModels = null\n  }\n\n  /**\n   * Builder for ModelSource.\n   *\n   * @param sourceId the ID of the source\n   */\n  @SourceDsl\n  class Builder(val sourceId: String) {\n    internal val properties = HashMap<String, PropertyValue<*>>()\n    // Properties that only settable after the source is added to the style.\n    internal val volatileProperties = HashMap<String, PropertyValue<*>>()\n    internal var batched: Boolean = false\n    internal var models: List<ModelSourceModel>? = null\n\n    /**\n     * Configures source with batched-model type.\n     * @param batched Whether the source should have batched-model type.\n     */\n    fun batched(batched: Boolean): Builder = apply {\n      this.batched = batched\n    }\n\n    /**\n     * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n     * `tiles` is not provided.\n     */\n    fun url(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"url\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Maximum zoom level at which to create batched model tiles. Data from tiles at the maxzoom\n     * are used when displaying the map at higher zoom levels.\n     * Default value: 18.\n     */\n    fun maxzoom(value: Long = 18L): Builder = apply {\n      val propertyValue = PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum zoom level for which batched-model tiles are available\n     * Default value: 0.\n     */\n    fun minzoom(value: Long = 0L): Builder = apply {\n      val propertyValue = PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array of one or more tile source URLs, as in the TileJSON spec. Requires `batched-model`\n     * source type.\n     */\n    fun tiles(value: List<String>): Builder = apply {\n      val propertyValue = PropertyValue(\"tiles\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Defines properties of 3D models in collection. Requires `model` source type.\n     */\n    fun models(value: List<ModelSourceModel>): Builder = apply {\n      models = value\n    }\n    /**\n     * Build the ModelSource.\n     *\n     * @return the ModelSource\n     */\n    fun build(): ModelSource = ModelSource(this)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /**\n     * Maximum zoom level at which to create batched model tiles. Data from tiles at the maxzoom\n     * are used when displaying the map at higher zoom levels.\n     * Default value: 18.\n     */\n    val defaultMaxzoom: Long?\n      /**\n       * Get the Maxzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"model\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Minimum zoom level for which batched-model tiles are available\n     * Default value: 0.\n     */\n    val defaultMinzoom: Long?\n      /**\n       * Get the Minzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"model\", \"minzoom\").silentUnwrap()\n  }\n}\n\n/**\n * DSL function for [ModelSource].\n */\nfun modelSource(id: String, block: ModelSource.Builder.() -> Unit): ModelSource =\n  ModelSource.Builder(id).apply(block).build()\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/generated/ModelSourceModel.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.UiThread\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.sources.Source\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorToRgbaString\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.unwrapToTyped\nimport java.util.HashMap\n\n/**\n *\n * Check the [online documentation](https://docs.mapbox.com/style-spec/reference/types#modelSourceModels).\n */\n@UiThread\nclass ModelSourceModel(builder: Builder) {\n  internal var source: Source? = null\n  private val properties: HashMap<String, PropertyValue<*>> = builder.properties\n\n  /**\n   * The model's identifier.\n   */\n  val id: String = builder.id\n\n  /**\n   * An object defining custom properties of the model. Properties are accessible as feature properties in expressions.\n   *\n   * Example usage:\n   * ```kotlin\n   * modelSourceModel(\"car-1\") {\n   *   uri(\"https://example.com/car.glb\")\n   *   featureProperties(hashMapOf(\n   *     \"vehicleType\" to \"sedan\",\n   *     \"fleetId\" to 42\n   *   ))\n   * }\n   * ```\n   *\n   * These properties can then be accessed in layer expressions:\n   * ```kotlin\n   * modelLayer(\"car-layer\", \"car-source\") {\n   *   modelColor(\n   *     match {\n   *       get { literal(\"vehicleType\") }\n   *       literal(\"sedan\")\n   *       rgba { literal(0.0); literal(0.0); literal(1.0); literal(1.0) }\n   *       rgba { literal(1.0); literal(0.0); literal(0.0); literal(1.0) }\n   *     }\n   *   )\n   * }\n   * ```\n   */\n  val featureProperties: HashMap<String, Any>?\n    /**\n     * An object defining custom properties of the model. Properties are accessible as feature properties in expressions.\n     *\n     * @return featureProperties as HashMap<String, Any>\n     */\n    get() = getProperties()?.get(\"featureProperties\")?.unwrapToTyped()\n\n  /**\n   * An object defining custom properties of the model. Properties are accessible as feature properties in expressions.\n   *\n   * @param value as HashMap<String, Any>\n   */\n  fun featureProperties(value: HashMap<String, Any>): ModelSourceModel = apply {\n    setProperty(PropertyValue(\"featureProperties\", value))\n  }\n\n  /**\n   * An array of one or more model material names whose properties will be overridden from model layer paint properties.\n   */\n  val materialOverrideNames: List<String>?\n    /**\n     * An array of one or more model material names whose properties will be overridden from model layer paint properties.\n     *\n     * @return materialOverrideNames as List<String>\n     */\n    get() = getProperties()?.get(\"materialOverrideNames\")?.unwrapToTyped()\n\n  /**\n   * An array of one or more model material names whose properties will be overridden from model layer paint properties.\n   *\n   * @param value as List<String>\n   */\n  fun materialOverrideNames(value: List<String>): ModelSourceModel = apply {\n    setProperty(PropertyValue(\"materialOverrideNames\", value))\n  }\n\n  /**\n   * A collection of material overrides.\n   */\n  val materialOverrides: List<ModelMaterialOverride>?\n    /**\n     * A collection of material overrides.\n     *\n     * @return materialOverrides as List<ModelMaterialOverride>\n     */\n    get() = getProperties()?.get(\"materialOverrides\")?.unwrapToModelMaterialOverrides()\n\n  /**\n   * A collection of material overrides.\n   *\n   * @param value as List<ModelMaterialOverride>\n   */\n  fun materialOverrides(value: List<ModelMaterialOverride>): ModelSourceModel = apply {\n    val overridesMap = value.associateByTo(HashMap(), { it.name })\n    setProperty(PropertyValue(\"materialOverrides\", overridesMap))\n  }\n\n  /**\n   * An array of one or more model node names whose transform will be overridden from model layer paint properties.\n   */\n  val nodeOverrideNames: List<String>?\n    /**\n     * An array of one or more model node names whose transform will be overridden from model layer paint properties.\n     *\n     * @return nodeOverrideNames as List<String>\n     */\n    get() = getProperties()?.get(\"nodeOverrideNames\")?.unwrapToTyped()\n\n  /**\n   * An array of one or more model node names whose transform will be overridden from model layer paint properties.\n   *\n   * @param value as List<String>\n   */\n  fun nodeOverrideNames(value: List<String>): ModelSourceModel = apply {\n    setProperty(PropertyValue(\"nodeOverrideNames\", value))\n  }\n\n  /**\n   * A collection of node overrides.\n   */\n  val nodeOverrides: List<ModelNodeOverride>?\n    /**\n     * A collection of node overrides.\n     *\n     * @return nodeOverrides as List<ModelNodeOverride>\n     */\n    get() = getProperties()?.get(\"nodeOverrides\")?.unwrapToModelNodeOverrides()\n\n  /**\n   * A collection of node overrides.\n   *\n   * @param value as List<ModelNodeOverride>\n   */\n  fun nodeOverrides(value: List<ModelNodeOverride>): ModelSourceModel = apply {\n    val overridesMap = value.associateByTo(HashMap(), { it.name })\n    setProperty(PropertyValue(\"nodeOverrides\", overridesMap))\n  }\n\n  /**\n   * Orientation of the model in euler angles [x, y, z]. Default value: [0,0,0]. The unit of orientation is in degrees.\n   */\n  val orientation: List<Double>?\n    /**\n     * Orientation of the model in euler angles [x, y, z]. Default value: [0,0,0]. The unit of orientation is in degrees.\n     *\n     * @return orientation as List<Double>\n     */\n    get() = getProperties()?.get(\"orientation\")?.unwrapToTyped()\n\n  /**\n   * Orientation of the model in euler angles [x, y, z]. Default value: [0,0,0]. The unit of orientation is in degrees.\n   *\n   * @param value as List<Double>\n   */\n  fun orientation(value: List<Double>): ModelSourceModel = apply {\n    setProperty(PropertyValue(\"orientation\", value))\n  }\n\n  /**\n   * Position of the model in longitude and latitude [lng, lat]. Default value: [0,0]. Minimum value: [-180,-90]. Maximum value: [180,90].\n   */\n  val position: List<Double>?\n    /**\n     * Position of the model in longitude and latitude [lng, lat]. Default value: [0,0]. Minimum value: [-180,-90]. Maximum value: [180,90].\n     *\n     * @return position as List<Double>\n     */\n    get() = getProperties()?.get(\"position\")?.unwrapToTyped()\n\n  /**\n   * Position of the model in longitude and latitude [lng, lat]. Default value: [0,0]. Minimum value: [-180,-90]. Maximum value: [180,90].\n   *\n   * @param value as List<Double>\n   */\n  fun position(value: List<Double>): ModelSourceModel = apply {\n    setProperty(PropertyValue(\"position\", value))\n  }\n\n  /**\n   * A URL to a model resource. Supported protocols are `http:`, `https:`, and `mapbox://<Model ID>`.\n   */\n  val uri: String?\n    /**\n     * A URL to a model resource. Supported protocols are `http:`, `https:`, and `mapbox://<Model ID>`.\n     *\n     * @return uri as String\n     */\n    get() = getProperties()?.get(\"uri\")?.unwrapToTyped()\n\n  /**\n   * A URL to a model resource. Supported protocols are `http:`, `https:`, and `mapbox://<Model ID>`.\n   *\n   * @param value as String\n   */\n  fun uri(value: String): ModelSourceModel = apply {\n    setProperty(PropertyValue(\"uri\", value))\n  }\n\n  @Suppress(\"UNCHECKED_CAST\")\n  internal fun getProperties(): HashMap<String, Value>? {\n    val stylePropertyValue = source?.delegate?.getStyleSourceProperty(sourceId = source!!.sourceId, \"models\")\n    return (stylePropertyValue?.value?.contents as? HashMap<String, Value>)?.get(id)?.contents as? HashMap<String, Value>\n  }\n\n  private fun setProperty(property: PropertyValue<*>) {\n    properties[property.propertyName] = property\n    updateProperties()\n  }\n\n  internal fun bindTo(source: Source) {\n    this.source = source\n    updateProperties()\n  }\n\n  private fun updateProperties() {\n    source?.setProperty(PropertyValue(\"models\", TypeUtils.wrapToValue(hashMapOf(id to this.properties.mapValues { it.value.value }))))\n  }\n\n  /**\n   * Convert [ModelSourceModel] to a [Value] class to be passed to sources.\n   */\n  @JvmSynthetic\n  internal fun toValue(): Value {\n    return Value(HashMap(properties.mapValues { it.value.value }.toMutableMap()))\n  }\n\n  /**\n   * Builder for ModelSourceModel.\n   *\n   * @param id the ID of the mode\n   */\n  class Builder(val id: String) {\n    internal val properties = HashMap<String, PropertyValue<*>>()\n\n    /**\n     * An object defining custom properties of the model. Properties are accessible as feature properties in expressions.\n     *\n     * Example usage:\n     * ```kotlin\n     * modelSourceModel(\"car-1\") {\n     *   uri(\"https://example.com/car.glb\")\n     *   featureProperties(hashMapOf(\n     *     \"vehicleType\" to \"sedan\",\n     *     \"fleetId\" to 42\n     *   ))\n     * }\n     * ```\n     *\n     * These properties can then be accessed in layer expressions:\n     * ```kotlin\n     * modelLayer(\"car-layer\", \"car-source\") {\n     *   modelColor(\n     *     match {\n     *       get { literal(\"vehicleType\") }\n     *       literal(\"sedan\")\n     *       rgba { literal(0.0); literal(0.0); literal(1.0); literal(1.0) }\n     *       rgba { literal(1.0); literal(0.0); literal(0.0); literal(1.0) }\n     *     }\n     *   )\n     * }\n     * ```\n     */\n    fun featureProperties(value: HashMap<String, Any>): Builder = apply {\n      val propertyValue = PropertyValue(\"featureProperties\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array of one or more model material names whose properties will be overridden from model layer paint properties.\n     */\n    fun materialOverrideNames(value: List<String>): Builder = apply {\n      val propertyValue = PropertyValue(\"materialOverrideNames\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * A collection of material overrides.\n     */\n    fun materialOverrides(value: List<ModelMaterialOverride>): Builder = apply {\n      val overridesMap = value.associateByTo(HashMap(), { it.name })\n      val propertyValue = PropertyValue(\"materialOverrides\", TypeUtils.wrapToValue(overridesMap))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array of one or more model node names whose transform will be overridden from model layer paint properties.\n     */\n    fun nodeOverrideNames(value: List<String>): Builder = apply {\n      val propertyValue = PropertyValue(\"nodeOverrideNames\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * A collection of node overrides.\n     */\n    fun nodeOverrides(value: List<ModelNodeOverride>): Builder = apply {\n      val overridesMap = value.associateByTo(HashMap(), { it.name })\n      val propertyValue = PropertyValue(\"nodeOverrides\", TypeUtils.wrapToValue(overridesMap))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Orientation of the model in euler angles [x, y, z]. Default value: [0,0,0]. The unit of orientation is in degrees.\n     */\n    fun orientation(value: List<Double>): Builder = apply {\n      val propertyValue = PropertyValue(\"orientation\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Position of the model in longitude and latitude [lng, lat]. Default value: [0,0]. Minimum value: [-180,-90]. Maximum value: [180,90].\n     */\n    fun position(value: List<Double>): Builder = apply {\n      val propertyValue = PropertyValue(\"position\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * A URL to a model resource. Supported protocols are `http:`, `https:`, and `mapbox://<Model ID>`.\n     */\n    fun uri(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"uri\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Build the ModelSourceModel.\n     *\n     * @return the ModelSourceModel\n     */\n    fun build(): ModelSourceModel = ModelSourceModel(this)\n  }\n}\n\n/**\n * Parse [Value] to a [ModelSourceModel].\n */\n@Suppress(\"UNCHECKED_CAST\")\n@JvmSynthetic\ninternal fun Value.unwrapToModelSourceModels(): List<ModelSourceModel>? {\n  return (contents as? HashMap<String, Value>)?.map { modelMap ->\n    val contents = modelMap.value.contents as? HashMap<String, Value>\n    val builder = ModelSourceModel.Builder(modelMap.key)\n\n    if (contents == null) {\n      return@map builder.build()\n    }\n    (contents[\"featureProperties\"]?.unwrapToTyped<HashMap<String, Any>>())?.let { builder.featureProperties(it) }\n    (contents[\"materialOverrideNames\"]?.unwrapToTyped<List<String>>())?.let { builder.materialOverrideNames(it) }\n    (contents[\"materialOverrides\"]?.unwrapToModelMaterialOverrides())?.let { builder.materialOverrides(it) }\n    (contents[\"nodeOverrideNames\"]?.unwrapToTyped<List<String>>())?.let { builder.nodeOverrideNames(it) }\n    (contents[\"nodeOverrides\"]?.unwrapToModelNodeOverrides())?.let { builder.nodeOverrides(it) }\n    (contents[\"orientation\"]?.unwrapToTyped<List<Double>>())?.let { builder.orientation(it) }\n    (contents[\"position\"]?.unwrapToTyped<List<Double>>())?.let { builder.position(it) }\n    (contents[\"uri\"]?.unwrapToTyped<String>())?.let { builder.uri(it) }\n    return@map builder.build()\n  }\n}\n\n/**\n *\n * Check the [online documentation](https://docs.mapbox.com/style-spec/reference/types#modelMaterialOverrides).\n */\n@UiThread\nclass ModelMaterialOverride private constructor(builder: Builder) : HashMap<String, Value>(builder.parameters) {\n  internal val name: String = builder.name\n\n  /**\n   * Builder for ModelMaterialOverride.\n   *\n   * @param name the name of the override\n   */\n  class Builder(val name: String) {\n    internal val parameters: HashMap<String, Value> = HashMap()\n\n    /**\n     * Override the tint color of the material.\n     */\n    fun modelColor(value: String): Builder = apply {\n      parameters[\"model-color\"] = TypeUtils.wrapToValue(value)\n    }\n\n    /**\n     * Override the tint color of the material.\n     *\n     * @param modelColor value of modelColor as color int\n     */\n    fun modelColor(@ColorInt modelColor: Int): Builder = apply {\n      parameters[\"model-color\"] = TypeUtils.wrapToValue(colorToRgbaString(modelColor))\n    }\n\n    /**\n     * Override the intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors.\n     */\n    fun modelColorMixIntensity(value: Double): Builder = apply {\n      parameters[\"model-color-mix-intensity\"] = TypeUtils.wrapToValue(value)\n    }\n\n    /**\n     * Override strength of the emission of material. The unit of modelEmissiveStrength is in intensity.\n     */\n    fun modelEmissiveStrength(value: Double): Builder = apply {\n      parameters[\"model-emissive-strength\"] = TypeUtils.wrapToValue(value)\n    }\n\n    /**\n     * Override the opacity of the material.\n     */\n    fun modelOpacity(value: Double): Builder = apply {\n      parameters[\"model-opacity\"] = TypeUtils.wrapToValue(value)\n    }\n\n  /**\n   * Build the ModelMaterialOverride.\n   *\n   * @return the constructed ModelMaterialOverride\n   */\n  fun build(): ModelMaterialOverride = ModelMaterialOverride(this)\n  }\n}\n\n/**\n * Parse [Value] to a [ModelMaterialOverride].\n */\n@Suppress(\"UNCHECKED_CAST\")\n@JvmSynthetic\ninternal fun Value.unwrapToModelMaterialOverrides(): List<ModelMaterialOverride> {\n  return (contents as HashMap<String, Value>).map { entry ->\n    val builder = ModelMaterialOverride.Builder(entry.key)\n    val overrideMap = entry.value.contents as HashMap<String, Value>\n    (overrideMap[\"model-color\"]?.unwrapToTyped<String>())?.let { builder.modelColor(it) }\n    (overrideMap[\"model-color-mix-intensity\"]?.unwrapToTyped<Double>())?.let { builder.modelColorMixIntensity(it) }\n    (overrideMap[\"model-emissive-strength\"]?.unwrapToTyped<Double>())?.let { builder.modelEmissiveStrength(it) }\n    (overrideMap[\"model-opacity\"]?.unwrapToTyped<Double>())?.let { builder.modelOpacity(it) }\n\n    return@map builder.build()\n  }\n}\n\n/**\n *\n * Check the [online documentation](https://docs.mapbox.com/style-spec/reference/types#modelNodeOverrides).\n */\n@UiThread\nclass ModelNodeOverride private constructor(builder: Builder) : HashMap<String, Value>(builder.parameters) {\n  internal val name: String = builder.name\n\n  /**\n   * Builder for ModelNodeOverride.\n   *\n   * @param name the name of the override\n   */\n  class Builder(val name: String) {\n    internal val parameters: HashMap<String, Value> = HashMap()\n\n    /**\n     * Override the orientation of the model node in euler angles [x, y, z]. Default value: [0,0,0]. The unit of orientation is in degrees.\n     */\n    fun orientation(value: List<Double>): Builder = apply {\n      parameters[\"orientation\"] = TypeUtils.wrapToValue(value)\n    }\n\n  /**\n   * Build the ModelNodeOverride.\n   *\n   * @return the constructed ModelNodeOverride\n   */\n  fun build(): ModelNodeOverride = ModelNodeOverride(this)\n  }\n}\n\n/**\n * Parse [Value] to a [ModelNodeOverride].\n */\n@Suppress(\"UNCHECKED_CAST\")\n@JvmSynthetic\ninternal fun Value.unwrapToModelNodeOverrides(): List<ModelNodeOverride> {\n  return (contents as HashMap<String, Value>).map { entry ->\n    val builder = ModelNodeOverride.Builder(entry.key)\n    val overrideMap = entry.value.contents as HashMap<String, Value>\n    (overrideMap[\"orientation\"]?.unwrapToTyped<List<Double>>())?.let { builder.orientation(it) }\n\n    return@map builder.build()\n  }\n}\n\n/**\n * DSL function to create a [ModelSourceModel].\n *\n * @param id The unique identifier for this model\n * @param block The DSL configuration block\n * @return Configured [ModelSourceModel] instance\n */\nfun modelSourceModel(id: String, block: ModelSourceModel.Builder.() -> Unit): ModelSourceModel =\n  ModelSourceModel.Builder(id).apply(block).build()\n\n/**\n * DSL function to create a [ModelMaterialOverride].\n *\n * @param name The name of the material to override\n * @param block The DSL configuration block\n * @return Configured [ModelMaterialOverride] instance\n */\nfun modelMaterialOverride(name: String, block: ModelMaterialOverride.Builder.() -> Unit): ModelMaterialOverride =\n  ModelMaterialOverride.Builder(name).apply(block).build()\n\n/**\n * DSL function to create a [ModelNodeOverride].\n *\n * @param name The name of the node to override\n * @param block The DSL configuration block\n * @return Configured [ModelNodeOverride] instance\n */\nfun modelNodeOverride(name: String, block: ModelNodeOverride.Builder.() -> Unit): ModelNodeOverride =\n  ModelNodeOverride.Builder(name).apply(block).build()\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/generated/RasterArraySource.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.sources.Source\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.types.SourceDsl\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A raster array source\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources/#raster-array)\n *\n */\n@MapboxExperimental\nclass RasterArraySource(builder: Builder) : Source(builder.sourceId) {\n\n  init {\n    sourceProperties.putAll(builder.properties)\n    volatileSourceProperties.putAll(builder.volatileProperties)\n  }\n\n  /**\n   * Get the type of the current source as a String.\n   */\n  override fun getType(): String {\n    return \"raster-array\"\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  fun url(value: String): RasterArraySource = apply {\n    setProperty(PropertyValue(\"url\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  val url: String?\n    /**\n     * Get the Url property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"url\")\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  fun tiles(value: List<String>): RasterArraySource = apply {\n    setProperty(PropertyValue(\"tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  val tiles: List<String>?\n    /**\n     * Get the Tiles property\n     *\n     * @return List<String>\n     */\n    get() = getPropertyValue(\"tiles\")\n\n  /**\n   * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n   * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n   * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n   * Default value: [-180,-85.051129,180,85.051129].\n   */\n  val bounds: List<Double>?\n    /**\n     * Get the Bounds property\n     *\n     * @return List<Double>\n     */\n    get() = getPropertyValue(\"bounds\")\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  fun minzoom(value: Long = 0L): RasterArraySource = apply {\n    setProperty(PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  val minzoom: Long?\n    /**\n     * Get the Minzoom property\n     *\n     * Use static method [RasterArraySource.defaultMinzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  fun maxzoom(value: Long = 22L): RasterArraySource = apply {\n    setProperty(PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  val maxzoom: Long?\n    /**\n     * Get the Maxzoom property\n     *\n     * Use static method [RasterArraySource.defaultMaxzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The minimum visual size to display tiles for this layer. Only configurable for raster layers.\n   * Default value: 512. The unit of tileSize is in pixels.\n   */\n  val tileSize: Long?\n    /**\n     * Get the TileSize property\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"tileSize\")\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  val attribution: String?\n    /**\n     * Get the Attribution property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"attribution\")\n\n  /**\n   * Contains the description of the raster data layers and the bands contained within the tiles.\n   */\n  val rasterLayers: List<RasterDataLayer>?\n    /**\n     * Get the RasterLayers property\n     *\n     * @return List<RasterDataLayer>\n     */\n    get() = getPropertyValue(\"rasterLayers\")\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  fun volatile(value: Boolean = false): RasterArraySource = apply {\n    setProperty(PropertyValue(\"volatile\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  val volatile: Boolean?\n    /**\n     * Get the Volatile property\n     *\n     * Use static method [RasterArraySource.defaultVolatile] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() = getPropertyValue(\"volatile\")\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  fun tileCacheBudget(value: TileCacheBudget): RasterArraySource = apply {\n    setVolatileProperty(PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  val tileCacheBudget: TileCacheBudget?\n    /**\n     * Get the TileCacheBudget property\n     *\n     * @return TileCacheBudget\n     */\n    get() = getPropertyValue(\"tile-cache-budget\")\n\n  /**\n   * Builder for RasterArraySource.\n   *\n   * @param sourceId the ID of the source\n   */\n  @SourceDsl\n  class Builder(val sourceId: String) {\n    internal val properties = HashMap<String, PropertyValue<*>>()\n    // Properties that only settable after the source is added to the style.\n    internal val volatileProperties = HashMap<String, PropertyValue<*>>()\n\n    /**\n     * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n     * `tiles` is not provided.\n     */\n    fun url(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"url\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n     * `url` is not provided.\n     */\n    fun tiles(value: List<String>): Builder = apply {\n      val propertyValue = PropertyValue(\"tiles\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n     * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n     * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n     * Default value: [-180,-85.051129,180,85.051129].\n     */\n    fun bounds(value: List<Double> = listOf(-180.0, -85.051129, 180.0, 85.051129)): Builder = apply {\n      val propertyValue = PropertyValue(\"bounds\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n     * Default value: 0.\n     */\n    fun minzoom(value: Long = 0L): Builder = apply {\n      val propertyValue = PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n     * at the maxzoom are used when displaying the map at higher zoom levels.\n     * Default value: 22.\n     */\n    fun maxzoom(value: Long = 22L): Builder = apply {\n      val propertyValue = PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * The minimum visual size to display tiles for this layer. Only configurable for raster layers.\n     * Default value: 512. The unit of tileSize is in pixels.\n     */\n    fun tileSize(value: Long = 512L): Builder = apply {\n      val propertyValue = PropertyValue(\"tileSize\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Contains an attribution to be displayed when the map is shown to a user.\n     */\n    fun attribution(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"attribution\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * A setting to determine whether a source's tiles are cached locally.\n     * Default value: false.\n     */\n    fun volatile(value: Boolean = false): Builder = apply {\n      val propertyValue = PropertyValue(\"volatile\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n     * tile cache goes over the defined limit, the least recently used tile will be evicted from\n     * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n     * the visible tiles.\n     */\n    fun tileCacheBudget(value: TileCacheBudget): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Add a TileSet to the Source.\n     *\n     * @param tileSet\n     */\n    fun tileSet(tileSet: TileSet): Builder = apply {\n      for ((name, value) in tileSet) {\n        val propertyValue = PropertyValue(name, value)\n        properties[propertyValue.propertyName] = propertyValue\n      }\n    }\n\n    /**\n     * Add a TileSet to the Source, using DSL.\n     *\n     * @param tilejson\n     * @param tiles\n     * @param block\n     */\n    fun tileSet(tilejson: String, tiles: List<String>, block: TileSet.Builder.() -> Unit): Builder = apply {\n      val tileSet = TileSet.Builder(tilejson, tiles).apply(block).build()\n      for ((name, value) in tileSet) {\n        val propertyValue = PropertyValue(name, value)\n        properties[propertyValue.propertyName] = propertyValue\n      }\n    }\n    /**\n     * Build the RasterArraySource.\n     *\n     * @return the RasterArraySource\n     */\n    fun build(): RasterArraySource = RasterArraySource(this)\n  }\n\n  /**\n   * The description of the raster data layers and the bands contained within the tiles.\n   *\n   * @param layerId Identifier of the data layer fetched from tiles.\n   * @param bands An array of bands found in the data layer.\n   */\n  class RasterDataLayer internal constructor(\n    val layerId: String,\n    val bands: List<String>\n  ) {\n    /**\n     * Returns a readable String for the object.\n     *\n     * @return string\n     */\n    override fun toString(): String {\n      return \"RasterDataLayer(layerId=$layerId, bands:$bands)\"\n    }\n\n    /**\n     * Returns the hashcode for the object.\n     *\n     * @return hashcode\n     */\n    override fun hashCode(): Int {\n      return Objects.hash(layerId, bands)\n    }\n\n    /**\n     * Overloaded equals function.\n     *\n     * @return true if equal, false otherwise.\n     */\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (javaClass != other?.javaClass) return false\n      other as RasterDataLayer\n      return layerId == other.layerId && bands == other.bands\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /**\n     * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n     * Default value: 0.\n     */\n    val defaultMinzoom: Long?\n      /**\n       * Get the Minzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-array\", \"minzoom\").silentUnwrap()\n\n    /**\n     * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n     * at the maxzoom are used when displaying the map at higher zoom levels.\n     * Default value: 22.\n     */\n    val defaultMaxzoom: Long?\n      /**\n       * Get the Maxzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-array\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * A setting to determine whether a source's tiles are cached locally.\n     * Default value: false.\n     */\n    val defaultVolatile: Boolean?\n      /**\n       * Get the Volatile property\n       *\n       * @return Boolean\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-array\", \"volatile\").silentUnwrap()\n  }\n}\n\n/**\n * DSL function for [RasterArraySource].\n */\n@MapboxExperimental\nfun rasterArraySource(id: String, block: RasterArraySource.Builder.() -> Unit): RasterArraySource =\n  RasterArraySource.Builder(id).apply(block).build()\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/generated/RasterDemSource.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.sources.Source\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.types.SourceDsl\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A RGB-encoded raster DEM source\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources/#raster-dem)\n *\n */\nclass RasterDemSource(builder: Builder) : Source(builder.sourceId) {\n\n  init {\n    sourceProperties.putAll(builder.properties)\n    volatileSourceProperties.putAll(builder.volatileProperties)\n  }\n\n  /**\n   * Get the type of the current source as a String.\n   */\n  override fun getType(): String {\n    return \"raster-dem\"\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  fun url(value: String): RasterDemSource = apply {\n    setProperty(PropertyValue(\"url\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  val url: String?\n    /**\n     * Get the Url property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"url\")\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  fun tiles(value: List<String>): RasterDemSource = apply {\n    setProperty(PropertyValue(\"tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  val tiles: List<String>?\n    /**\n     * Get the Tiles property\n     *\n     * @return List<String>\n     */\n    get() = getPropertyValue(\"tiles\")\n\n  /**\n   * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n   * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n   * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n   * Default value: [-180,-85.051129,180,85.051129].\n   */\n  val bounds: List<Double>?\n    /**\n     * Get the Bounds property\n     *\n     * @return List<Double>\n     */\n    get() = getPropertyValue(\"bounds\")\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  fun minzoom(value: Long = 0L): RasterDemSource = apply {\n    setProperty(PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  val minzoom: Long?\n    /**\n     * Get the Minzoom property\n     *\n     * Use static method [RasterDemSource.defaultMinzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  fun maxzoom(value: Long = 22L): RasterDemSource = apply {\n    setProperty(PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  val maxzoom: Long?\n    /**\n     * Get the Maxzoom property\n     *\n     * Use static method [RasterDemSource.defaultMaxzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The minimum visual size to display tiles for this layer. Only configurable for raster layers.\n   * Default value: 512. The unit of tileSize is in pixels.\n   */\n  val tileSize: Long?\n    /**\n     * Get the TileSize property\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"tileSize\")\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  val attribution: String?\n    /**\n     * Get the Attribution property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"attribution\")\n\n  /**\n   * The encoding used by this source. Mapbox Terrain RGB is used by default\n   * Default value: \"mapbox\".\n   */\n  val encoding: Encoding?\n    /**\n     * Get the Encoding property\n     *\n     * Use static method [RasterDemSource.defaultEncoding] to get the default property.\n     *\n     * @return Encoding\n     */\n    get() {\n      getPropertyValue<String?>(\"encoding\")?.let {\n        return Encoding.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  fun volatile(value: Boolean = false): RasterDemSource = apply {\n    setProperty(PropertyValue(\"volatile\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  val volatile: Boolean?\n    /**\n     * Get the Volatile property\n     *\n     * Use static method [RasterDemSource.defaultVolatile] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() = getPropertyValue(\"volatile\")\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  fun prefetchZoomDelta(value: Long = 4L): RasterDemSource = apply {\n    setVolatileProperty(PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  val prefetchZoomDelta: Long?\n    /**\n     * Get the PrefetchZoomDelta property\n     *\n     * Use static method [RasterDemSource.defaultPrefetchZoomDelta] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"prefetch-zoom-delta\")\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  fun tileCacheBudget(value: TileCacheBudget): RasterDemSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  val tileCacheBudget: TileCacheBudget?\n    /**\n     * Get the TileCacheBudget property\n     *\n     * @return TileCacheBudget\n     */\n    get() = getPropertyValue(\"tile-cache-budget\")\n\n  /**\n   * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n   * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n   * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n   * Default value: 0.\n   */\n  fun minimumTileUpdateInterval(value: Double = 0.0): RasterDemSource = apply {\n    setVolatileProperty(PropertyValue(\"minimum-tile-update-interval\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n   * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n   * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n   * Default value: 0.\n   */\n  val minimumTileUpdateInterval: Double?\n    /**\n     * Get the MinimumTileUpdateInterval property\n     *\n     * Use static method [RasterDemSource.defaultMinimumTileUpdateInterval] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"minimum-tile-update-interval\")\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  fun maxOverscaleFactorForParentTiles(value: Long): RasterDemSource = apply {\n    setVolatileProperty(PropertyValue(\"max-overscale-factor-for-parent-tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  val maxOverscaleFactorForParentTiles: Long?\n    /**\n     * Get the MaxOverscaleFactorForParentTiles property\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"max-overscale-factor-for-parent-tiles\")\n\n  /**\n   * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n   * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n   * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n   * Default value: 0.\n   */\n  fun tileRequestsDelay(value: Double = 0.0): RasterDemSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-requests-delay\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n   * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n   * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n   * Default value: 0.\n   */\n  val tileRequestsDelay: Double?\n    /**\n     * Get the TileRequestsDelay property\n     *\n     * Use static method [RasterDemSource.defaultTileRequestsDelay] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"tile-requests-delay\")\n\n  /**\n   * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n   * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n   * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n   * superseded with tile-requests-delay property value, if both are provided.\n   * Default value: 0.\n   */\n  fun tileNetworkRequestsDelay(value: Double = 0.0): RasterDemSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-network-requests-delay\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n   * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n   * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n   * superseded with tile-requests-delay property value, if both are provided.\n   * Default value: 0.\n   */\n  val tileNetworkRequestsDelay: Double?\n    /**\n     * Get the TileNetworkRequestsDelay property\n     *\n     * Use static method [RasterDemSource.defaultTileNetworkRequestsDelay] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"tile-network-requests-delay\")\n\n  /**\n   * Builder for RasterDemSource.\n   *\n   * @param sourceId the ID of the source\n   */\n  @SourceDsl\n  class Builder(val sourceId: String) {\n    internal val properties = HashMap<String, PropertyValue<*>>()\n    // Properties that only settable after the source is added to the style.\n    internal val volatileProperties = HashMap<String, PropertyValue<*>>()\n\n    /**\n     * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n     * `tiles` is not provided.\n     */\n    fun url(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"url\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n     * `url` is not provided.\n     */\n    fun tiles(value: List<String>): Builder = apply {\n      val propertyValue = PropertyValue(\"tiles\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n     * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n     * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n     * Default value: [-180,-85.051129,180,85.051129].\n     */\n    fun bounds(value: List<Double> = listOf(-180.0, -85.051129, 180.0, 85.051129)): Builder = apply {\n      val propertyValue = PropertyValue(\"bounds\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n     * Default value: 0.\n     */\n    fun minzoom(value: Long = 0L): Builder = apply {\n      val propertyValue = PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n     * at the maxzoom are used when displaying the map at higher zoom levels.\n     * Default value: 22.\n     */\n    fun maxzoom(value: Long = 22L): Builder = apply {\n      val propertyValue = PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * The minimum visual size to display tiles for this layer. Only configurable for raster layers.\n     * Default value: 512. The unit of tileSize is in pixels.\n     */\n    fun tileSize(value: Long = 512L): Builder = apply {\n      val propertyValue = PropertyValue(\"tileSize\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Contains an attribution to be displayed when the map is shown to a user.\n     */\n    fun attribution(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"attribution\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * The encoding used by this source. Mapbox Terrain RGB is used by default\n     * Default value: \"mapbox\".\n     */\n    fun encoding(value: Encoding = Encoding.MAPBOX): Builder = apply {\n      val propertyValue = PropertyValue(\"encoding\", TypeUtils.wrapToValue(value.value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * A setting to determine whether a source's tiles are cached locally.\n     * Default value: false.\n     */\n    fun volatile(value: Boolean = false): Builder = apply {\n      val propertyValue = PropertyValue(\"volatile\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    fun prefetchZoomDelta(value: Long = 4L): Builder = apply {\n      val propertyValue = PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n     * tile cache goes over the defined limit, the least recently used tile will be evicted from\n     * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n     * the visible tiles.\n     */\n    fun tileCacheBudget(value: TileCacheBudget): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n     * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n     * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n     * Default value: 0.\n     */\n    fun minimumTileUpdateInterval(value: Double = 0.0): Builder = apply {\n      val propertyValue = PropertyValue(\"minimum-tile-update-interval\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * When a set of tiles for a current zoom level is being rendered and some of\n     * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n     * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n     * This property sets the maximum limit for how much a parent tile can be overscaled.\n     */\n    fun maxOverscaleFactorForParentTiles(value: Long): Builder = apply {\n      val propertyValue = PropertyValue(\"max-overscale-factor-for-parent-tiles\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n     * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n     * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n     * Default value: 0.\n     */\n    fun tileRequestsDelay(value: Double = 0.0): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-requests-delay\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n     * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n     * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n     * superseded with tile-requests-delay property value, if both are provided.\n     * Default value: 0.\n     */\n    fun tileNetworkRequestsDelay(value: Double = 0.0): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-network-requests-delay\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Add a TileSet to the Source.\n     *\n     * @param tileSet\n     */\n    fun tileSet(tileSet: TileSet): Builder = apply {\n      for ((name, value) in tileSet) {\n        val propertyValue = PropertyValue(name, value)\n        properties[propertyValue.propertyName] = propertyValue\n      }\n    }\n\n    /**\n     * Add a TileSet to the Source, using DSL.\n     *\n     * @param tilejson\n     * @param tiles\n     * @param block\n     */\n    fun tileSet(tilejson: String, tiles: List<String>, block: TileSet.RasterDemBuilder.() -> Unit): Builder = apply {\n      val tileSet = TileSet.RasterDemBuilder(tilejson, tiles).apply(block).build()\n      for ((name, value) in tileSet) {\n        val propertyValue = PropertyValue(name, value)\n        properties[propertyValue.propertyName] = propertyValue\n      }\n    }\n    /**\n     * Build the RasterDemSource.\n     *\n     * @return the RasterDemSource\n     */\n    fun build(): RasterDemSource = RasterDemSource(this)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /**\n     * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n     * Default value: 0.\n     */\n    val defaultMinzoom: Long?\n      /**\n       * Get the Minzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"minzoom\").silentUnwrap()\n\n    /**\n     * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n     * at the maxzoom are used when displaying the map at higher zoom levels.\n     * Default value: 22.\n     */\n    val defaultMaxzoom: Long?\n      /**\n       * Get the Maxzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * The encoding used by this source. Mapbox Terrain RGB is used by default\n     * Default value: \"mapbox\".\n     */\n    val defaultEncoding: Encoding?\n      /**\n       * Get the Encoding property\n       *\n       * @return Encoding\n       */\n      get() {\n        StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"encoding\").silentUnwrap<String>()?.let {\n          return Encoding.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * A setting to determine whether a source's tiles are cached locally.\n     * Default value: false.\n     */\n    val defaultVolatile: Boolean?\n      /**\n       * Get the Volatile property\n       *\n       * @return Boolean\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"volatile\").silentUnwrap()\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    val defaultPrefetchZoomDelta: Long?\n      /**\n       * Get the PrefetchZoomDelta property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"prefetch-zoom-delta\").silentUnwrap()\n\n    /**\n     * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n     * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n     * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n     * Default value: 0.\n     */\n    val defaultMinimumTileUpdateInterval: Double?\n      /**\n       * Get the MinimumTileUpdateInterval property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"minimum-tile-update-interval\").silentUnwrap()\n\n    /**\n     * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n     * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n     * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n     * Default value: 0.\n     */\n    val defaultTileRequestsDelay: Double?\n      /**\n       * Get the TileRequestsDelay property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"tile-requests-delay\").silentUnwrap()\n\n    /**\n     * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n     * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n     * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n     * superseded with tile-requests-delay property value, if both are provided.\n     * Default value: 0.\n     */\n    val defaultTileNetworkRequestsDelay: Double?\n      /**\n       * Get the TileNetworkRequestsDelay property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"tile-network-requests-delay\").silentUnwrap()\n  }\n}\n\n/**\n * DSL function for [RasterDemSource].\n */\nfun rasterDemSource(id: String, block: RasterDemSource.Builder.() -> Unit): RasterDemSource =\n  RasterDemSource.Builder(id).apply(block).build()\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/generated/RasterSource.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.sources.Source\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.types.SourceDsl\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A raster tile source.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources/#raster)\n *\n */\nclass RasterSource(builder: Builder) : Source(builder.sourceId) {\n\n  init {\n    sourceProperties.putAll(builder.properties)\n    volatileSourceProperties.putAll(builder.volatileProperties)\n  }\n\n  /**\n   * Get the type of the current source as a String.\n   */\n  override fun getType(): String {\n    return \"raster\"\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  fun url(value: String): RasterSource = apply {\n    setProperty(PropertyValue(\"url\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  val url: String?\n    /**\n     * Get the Url property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"url\")\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  fun tiles(value: List<String>): RasterSource = apply {\n    setProperty(PropertyValue(\"tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  val tiles: List<String>?\n    /**\n     * Get the Tiles property\n     *\n     * @return List<String>\n     */\n    get() = getPropertyValue(\"tiles\")\n\n  /**\n   * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n   * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n   * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n   * Default value: [-180,-85.051129,180,85.051129].\n   */\n  val bounds: List<Double>?\n    /**\n     * Get the Bounds property\n     *\n     * @return List<Double>\n     */\n    get() = getPropertyValue(\"bounds\")\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  fun minzoom(value: Long = 0L): RasterSource = apply {\n    setProperty(PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  val minzoom: Long?\n    /**\n     * Get the Minzoom property\n     *\n     * Use static method [RasterSource.defaultMinzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  fun maxzoom(value: Long = 22L): RasterSource = apply {\n    setProperty(PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  val maxzoom: Long?\n    /**\n     * Get the Maxzoom property\n     *\n     * Use static method [RasterSource.defaultMaxzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * The minimum visual size to display tiles for this layer. Only configurable for raster layers.\n   * Default value: 512. The unit of tileSize is in pixels.\n   */\n  val tileSize: Long?\n    /**\n     * Get the TileSize property\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"tileSize\")\n\n  /**\n   * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\n   * Default value: \"xyz\".\n   */\n  val scheme: Scheme?\n    /**\n     * Get the Scheme property\n     *\n     * Use static method [RasterSource.defaultScheme] to get the default property.\n     *\n     * @return Scheme\n     */\n    get() {\n      getPropertyValue<String?>(\"scheme\")?.let {\n        return Scheme.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  val attribution: String?\n    /**\n     * Get the Attribution property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"attribution\")\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  fun volatile(value: Boolean = false): RasterSource = apply {\n    setProperty(PropertyValue(\"volatile\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  val volatile: Boolean?\n    /**\n     * Get the Volatile property\n     *\n     * Use static method [RasterSource.defaultVolatile] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() = getPropertyValue(\"volatile\")\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  fun prefetchZoomDelta(value: Long = 4L): RasterSource = apply {\n    setVolatileProperty(PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  val prefetchZoomDelta: Long?\n    /**\n     * Get the PrefetchZoomDelta property\n     *\n     * Use static method [RasterSource.defaultPrefetchZoomDelta] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"prefetch-zoom-delta\")\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  fun tileCacheBudget(value: TileCacheBudget): RasterSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  val tileCacheBudget: TileCacheBudget?\n    /**\n     * Get the TileCacheBudget property\n     *\n     * @return TileCacheBudget\n     */\n    get() = getPropertyValue(\"tile-cache-budget\")\n\n  /**\n   * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n   * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n   * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n   * Default value: 0.\n   */\n  fun minimumTileUpdateInterval(value: Double = 0.0): RasterSource = apply {\n    setVolatileProperty(PropertyValue(\"minimum-tile-update-interval\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n   * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n   * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n   * Default value: 0.\n   */\n  val minimumTileUpdateInterval: Double?\n    /**\n     * Get the MinimumTileUpdateInterval property\n     *\n     * Use static method [RasterSource.defaultMinimumTileUpdateInterval] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"minimum-tile-update-interval\")\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  fun maxOverscaleFactorForParentTiles(value: Long): RasterSource = apply {\n    setVolatileProperty(PropertyValue(\"max-overscale-factor-for-parent-tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  val maxOverscaleFactorForParentTiles: Long?\n    /**\n     * Get the MaxOverscaleFactorForParentTiles property\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"max-overscale-factor-for-parent-tiles\")\n\n  /**\n   * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n   * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n   * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n   * Default value: 0.\n   */\n  fun tileRequestsDelay(value: Double = 0.0): RasterSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-requests-delay\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n   * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n   * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n   * Default value: 0.\n   */\n  val tileRequestsDelay: Double?\n    /**\n     * Get the TileRequestsDelay property\n     *\n     * Use static method [RasterSource.defaultTileRequestsDelay] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"tile-requests-delay\")\n\n  /**\n   * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n   * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n   * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n   * superseded with tile-requests-delay property value, if both are provided.\n   * Default value: 0.\n   */\n  fun tileNetworkRequestsDelay(value: Double = 0.0): RasterSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-network-requests-delay\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n   * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n   * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n   * superseded with tile-requests-delay property value, if both are provided.\n   * Default value: 0.\n   */\n  val tileNetworkRequestsDelay: Double?\n    /**\n     * Get the TileNetworkRequestsDelay property\n     *\n     * Use static method [RasterSource.defaultTileNetworkRequestsDelay] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"tile-network-requests-delay\")\n\n  /**\n   * Builder for RasterSource.\n   *\n   * @param sourceId the ID of the source\n   */\n  @SourceDsl\n  class Builder(val sourceId: String) {\n    internal val properties = HashMap<String, PropertyValue<*>>()\n    // Properties that only settable after the source is added to the style.\n    internal val volatileProperties = HashMap<String, PropertyValue<*>>()\n\n    /**\n     * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n     * `tiles` is not provided.\n     */\n    fun url(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"url\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n     * `url` is not provided.\n     */\n    fun tiles(value: List<String>): Builder = apply {\n      val propertyValue = PropertyValue(\"tiles\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n     * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n     * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n     * Default value: [-180,-85.051129,180,85.051129].\n     */\n    fun bounds(value: List<Double> = listOf(-180.0, -85.051129, 180.0, 85.051129)): Builder = apply {\n      val propertyValue = PropertyValue(\"bounds\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n     * Default value: 0.\n     */\n    fun minzoom(value: Long = 0L): Builder = apply {\n      val propertyValue = PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n     * at the maxzoom are used when displaying the map at higher zoom levels.\n     * Default value: 22.\n     */\n    fun maxzoom(value: Long = 22L): Builder = apply {\n      val propertyValue = PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * The minimum visual size to display tiles for this layer. Only configurable for raster layers.\n     * Default value: 512. The unit of tileSize is in pixels.\n     */\n    fun tileSize(value: Long = 512L): Builder = apply {\n      val propertyValue = PropertyValue(\"tileSize\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\n     * Default value: \"xyz\".\n     */\n    fun scheme(value: Scheme = Scheme.XYZ): Builder = apply {\n      val propertyValue = PropertyValue(\"scheme\", TypeUtils.wrapToValue(value.value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Contains an attribution to be displayed when the map is shown to a user.\n     */\n    fun attribution(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"attribution\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * A setting to determine whether a source's tiles are cached locally.\n     * Default value: false.\n     */\n    fun volatile(value: Boolean = false): Builder = apply {\n      val propertyValue = PropertyValue(\"volatile\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    fun prefetchZoomDelta(value: Long = 4L): Builder = apply {\n      val propertyValue = PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n     * tile cache goes over the defined limit, the least recently used tile will be evicted from\n     * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n     * the visible tiles.\n     */\n    fun tileCacheBudget(value: TileCacheBudget): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n     * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n     * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n     * Default value: 0.\n     */\n    fun minimumTileUpdateInterval(value: Double = 0.0): Builder = apply {\n      val propertyValue = PropertyValue(\"minimum-tile-update-interval\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * When a set of tiles for a current zoom level is being rendered and some of\n     * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n     * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n     * This property sets the maximum limit for how much a parent tile can be overscaled.\n     */\n    fun maxOverscaleFactorForParentTiles(value: Long): Builder = apply {\n      val propertyValue = PropertyValue(\"max-overscale-factor-for-parent-tiles\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n     * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n     * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n     * Default value: 0.\n     */\n    fun tileRequestsDelay(value: Double = 0.0): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-requests-delay\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n     * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n     * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n     * superseded with tile-requests-delay property value, if both are provided.\n     * Default value: 0.\n     */\n    fun tileNetworkRequestsDelay(value: Double = 0.0): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-network-requests-delay\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Add a TileSet to the Source.\n     *\n     * @param tileSet\n     */\n    fun tileSet(tileSet: TileSet): Builder = apply {\n      for ((name, value) in tileSet) {\n        val propertyValue = PropertyValue(name, value)\n        properties[propertyValue.propertyName] = propertyValue\n      }\n    }\n\n    /**\n     * Add a TileSet to the Source, using DSL.\n     *\n     * @param tilejson\n     * @param tiles\n     * @param block\n     */\n    fun tileSet(tilejson: String, tiles: List<String>, block: TileSet.Builder.() -> Unit): Builder = apply {\n      val tileSet = TileSet.Builder(tilejson, tiles).apply(block).build()\n      for ((name, value) in tileSet) {\n        val propertyValue = PropertyValue(name, value)\n        properties[propertyValue.propertyName] = propertyValue\n      }\n    }\n    /**\n     * Build the RasterSource.\n     *\n     * @return the RasterSource\n     */\n    fun build(): RasterSource = RasterSource(this)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /**\n     * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n     * Default value: 0.\n     */\n    val defaultMinzoom: Long?\n      /**\n       * Get the Minzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"minzoom\").silentUnwrap()\n\n    /**\n     * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n     * at the maxzoom are used when displaying the map at higher zoom levels.\n     * Default value: 22.\n     */\n    val defaultMaxzoom: Long?\n      /**\n       * Get the Maxzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\n     * Default value: \"xyz\".\n     */\n    val defaultScheme: Scheme?\n      /**\n       * Get the Scheme property\n       *\n       * @return Scheme\n       */\n      get() {\n        StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"scheme\").silentUnwrap<String>()?.let {\n          return Scheme.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * A setting to determine whether a source's tiles are cached locally.\n     * Default value: false.\n     */\n    val defaultVolatile: Boolean?\n      /**\n       * Get the Volatile property\n       *\n       * @return Boolean\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"volatile\").silentUnwrap()\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    val defaultPrefetchZoomDelta: Long?\n      /**\n       * Get the PrefetchZoomDelta property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"prefetch-zoom-delta\").silentUnwrap()\n\n    /**\n     * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n     * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n     * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n     * Default value: 0.\n     */\n    val defaultMinimumTileUpdateInterval: Double?\n      /**\n       * Get the MinimumTileUpdateInterval property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"minimum-tile-update-interval\").silentUnwrap()\n\n    /**\n     * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n     * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n     * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n     * Default value: 0.\n     */\n    val defaultTileRequestsDelay: Double?\n      /**\n       * Get the TileRequestsDelay property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"tile-requests-delay\").silentUnwrap()\n\n    /**\n     * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n     * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n     * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n     * superseded with tile-requests-delay property value, if both are provided.\n     * Default value: 0.\n     */\n    val defaultTileNetworkRequestsDelay: Double?\n      /**\n       * Get the TileNetworkRequestsDelay property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"tile-network-requests-delay\").silentUnwrap()\n  }\n}\n\n/**\n * DSL function for [RasterSource].\n */\nfun rasterSource(id: String, block: RasterSource.Builder.() -> Unit): RasterSource =\n  RasterSource.Builder(id).apply(block).build()\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/generated/SourceProperties.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\n/**\n * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\n *\n * @param value\n */\nclass Scheme private constructor(val value: String) {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is Scheme &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"Scheme(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Slippy map tilenames scheme.\n     */\n    @JvmField\n    val XYZ = Scheme(\"xyz\")\n    /**\n     * OSGeo spec scheme.\n     */\n    @JvmField\n    val TMS = Scheme(\"tms\")\n\n    /**\n     * Utility function to get [Scheme] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): Scheme {\n      return when (value) {\n        \"XYZ\" -> XYZ\n        \"TMS\" -> TMS\n        else -> throw RuntimeException(\"Scheme.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n\n/**\n * The encoding used by this source. Mapbox Terrain RGB is used by default\n *\n * @param value\n */\nclass Encoding private constructor(val value: String) {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is Encoding &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"Encoding(value=$value)\"\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Terrarium format PNG tiles. See https://aws.amazon.com/es/public-datasets/terrain/ for more info.\n     */\n    @JvmField\n    val TERRARIUM = Encoding(\"terrarium\")\n    /**\n     * Mapbox Terrain RGB tiles. See https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb for more info.\n     */\n    @JvmField\n    val MAPBOX = Encoding(\"mapbox\")\n\n    /**\n     * Utility function to get [Encoding] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): Encoding {\n      return when (value) {\n        \"TERRARIUM\" -> TERRARIUM\n        \"MAPBOX\" -> MAPBOX\n        else -> throw RuntimeException(\"Encoding.valueOf does not support [$value]\")\n      }\n    }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/sources/generated/VectorSource.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.sources.Source\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.types.PromoteId\nimport com.mapbox.maps.extension.style.types.SourceDsl\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.silentUnwrap\nimport java.util.*\n\n/**\n * A vector tile source.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/sources/#vector)\n *\n */\nclass VectorSource(builder: Builder) : Source(builder.sourceId) {\n\n  init {\n    sourceProperties.putAll(builder.properties)\n    volatileSourceProperties.putAll(builder.volatileProperties)\n  }\n\n  /**\n   * Get the type of the current source as a String.\n   */\n  override fun getType(): String {\n    return \"vector\"\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  fun url(value: String): VectorSource = apply {\n    setProperty(PropertyValue(\"url\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n   * `tiles` is not provided.\n   */\n  val url: String?\n    /**\n     * Get the Url property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"url\")\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  fun tiles(value: List<String>): VectorSource = apply {\n    setProperty(PropertyValue(\"tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n   * `url` is not provided.\n   */\n  val tiles: List<String>?\n    /**\n     * Get the Tiles property\n     *\n     * @return List<String>\n     */\n    get() = getPropertyValue(\"tiles\")\n\n  /**\n   * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n   * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n   * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n   * Default value: [-180,-85.051129,180,85.051129].\n   */\n  val bounds: List<Double>?\n    /**\n     * Get the Bounds property\n     *\n     * @return List<Double>\n     */\n    get() = getPropertyValue(\"bounds\")\n\n  /**\n   * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\n   * Default value: \"xyz\".\n   */\n  val scheme: Scheme?\n    /**\n     * Get the Scheme property\n     *\n     * Use static method [VectorSource.defaultScheme] to get the default property.\n     *\n     * @return Scheme\n     */\n    get() {\n      getPropertyValue<String?>(\"scheme\")?.let {\n        return Scheme.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  fun minzoom(value: Long = 0L): VectorSource = apply {\n    setProperty(PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n   * Default value: 0.\n   */\n  val minzoom: Long?\n    /**\n     * Get the Minzoom property\n     *\n     * Use static method [VectorSource.defaultMinzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"minzoom\")\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  fun maxzoom(value: Long = 22L): VectorSource = apply {\n    setProperty(PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n   * at the maxzoom are used when displaying the map at higher zoom levels.\n   * Default value: 22.\n   */\n  val maxzoom: Long?\n    /**\n     * Get the Maxzoom property\n     *\n     * Use static method [VectorSource.defaultMaxzoom] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"maxzoom\")\n\n  /**\n   * Contains an attribution to be displayed when the map is shown to a user.\n   */\n  val attribution: String?\n    /**\n     * Get the Attribution property\n     *\n     * @return String\n     */\n    get() = getPropertyValue(\"attribution\")\n\n  /**\n   * A property to use as a feature id (for feature state). It can be a property\n   * name, or an expression to evaluate as the ID, or an object of the form `{<sourceLayer>:\n   * <propertyName/expression>}`. The expression can only be feature dependent if it is used. If specified as a\n   * string for a vector tile source, the same property is used across all its source layers.\n   * If specified as an object only specified source layers will have id overriden, others will fallback\n   * to original feature id\n   */\n  val promoteId: PromoteId?\n    /**\n     * Get the PromoteId property\n     *\n     * @return PromoteId\n     */\n    get() {\n      val propertyValue = getPropertyValue<Any>(\"promoteId\")\n      propertyValue?.let {\n        return PromoteId.fromProperty(it)\n      }\n      return null\n    }\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  fun volatile(value: Boolean = false): VectorSource = apply {\n    setProperty(PropertyValue(\"volatile\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * A setting to determine whether a source's tiles are cached locally.\n   * Default value: false.\n   */\n  val volatile: Boolean?\n    /**\n     * Get the Volatile property\n     *\n     * Use static method [VectorSource.defaultVolatile] to get the default property.\n     *\n     * @return Boolean\n     */\n    get() = getPropertyValue(\"volatile\")\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  fun prefetchZoomDelta(value: Long = 4L): VectorSource = apply {\n    setVolatileProperty(PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n   * will first request a tile at zoom level lower than zoom - delta, but so that\n   * the zoom level is multiple of delta, in an attempt to display a full map at\n   * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n   * Default value: 4.\n   */\n  val prefetchZoomDelta: Long?\n    /**\n     * Get the PrefetchZoomDelta property\n     *\n     * Use static method [VectorSource.defaultPrefetchZoomDelta] to get the default property.\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"prefetch-zoom-delta\")\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  fun tileCacheBudget(value: TileCacheBudget): VectorSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n   * tile cache goes over the defined limit, the least recently used tile will be evicted from\n   * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n   * the visible tiles.\n   */\n  val tileCacheBudget: TileCacheBudget?\n    /**\n     * Get the TileCacheBudget property\n     *\n     * @return TileCacheBudget\n     */\n    get() = getPropertyValue(\"tile-cache-budget\")\n\n  /**\n   * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n   * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n   * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n   * Default value: 0.\n   */\n  fun minimumTileUpdateInterval(value: Double = 0.0): VectorSource = apply {\n    setVolatileProperty(PropertyValue(\"minimum-tile-update-interval\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n   * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n   * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n   * Default value: 0.\n   */\n  val minimumTileUpdateInterval: Double?\n    /**\n     * Get the MinimumTileUpdateInterval property\n     *\n     * Use static method [VectorSource.defaultMinimumTileUpdateInterval] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"minimum-tile-update-interval\")\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  fun maxOverscaleFactorForParentTiles(value: Long): VectorSource = apply {\n    setVolatileProperty(PropertyValue(\"max-overscale-factor-for-parent-tiles\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * When a set of tiles for a current zoom level is being rendered and some of\n   * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n   * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n   * This property sets the maximum limit for how much a parent tile can be overscaled.\n   */\n  val maxOverscaleFactorForParentTiles: Long?\n    /**\n     * Get the MaxOverscaleFactorForParentTiles property\n     *\n     * @return Long\n     */\n    get() = getPropertyValue(\"max-overscale-factor-for-parent-tiles\")\n\n  /**\n   * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n   * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n   * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n   * Default value: 0.\n   */\n  fun tileRequestsDelay(value: Double = 0.0): VectorSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-requests-delay\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n   * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n   * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n   * Default value: 0.\n   */\n  val tileRequestsDelay: Double?\n    /**\n     * Get the TileRequestsDelay property\n     *\n     * Use static method [VectorSource.defaultTileRequestsDelay] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"tile-requests-delay\")\n\n  /**\n   * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n   * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n   * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n   * superseded with tile-requests-delay property value, if both are provided.\n   * Default value: 0.\n   */\n  fun tileNetworkRequestsDelay(value: Double = 0.0): VectorSource = apply {\n    setVolatileProperty(PropertyValue(\"tile-network-requests-delay\", TypeUtils.wrapToValue(value)))\n  }\n\n  /**\n   * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n   * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n   * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n   * superseded with tile-requests-delay property value, if both are provided.\n   * Default value: 0.\n   */\n  val tileNetworkRequestsDelay: Double?\n    /**\n     * Get the TileNetworkRequestsDelay property\n     *\n     * Use static method [VectorSource.defaultTileNetworkRequestsDelay] to get the default property.\n     *\n     * @return Double\n     */\n    get() = getPropertyValue(\"tile-network-requests-delay\")\n\n  /**\n   * Builder for VectorSource.\n   *\n   * @param sourceId the ID of the source\n   */\n  @SourceDsl\n  class Builder(val sourceId: String) {\n    internal val properties = HashMap<String, PropertyValue<*>>()\n    // Properties that only settable after the source is added to the style.\n    internal val volatileProperties = HashMap<String, PropertyValue<*>>()\n\n    /**\n     * A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`. Required if\n     * `tiles` is not provided.\n     */\n    fun url(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"url\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array of one or more tile source URLs, as in the TileJSON spec. Required if\n     * `url` is not provided.\n     */\n    fun tiles(value: List<String>): Builder = apply {\n      val propertyValue = PropertyValue(\"tiles\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * An array containing the longitude and latitude of the southwest and northeast corners of the source's\n     * bounding box in the following order: `[sw.lng, sw.lat, ne.lng, ne.lat]`. When this property is included in\n     * a source, no tiles outside of the given bounds are requested by Mapbox GL.\n     * Default value: [-180,-85.051129,180,85.051129].\n     */\n    fun bounds(value: List<Double> = listOf(-180.0, -85.051129, 180.0, 85.051129)): Builder = apply {\n      val propertyValue = PropertyValue(\"bounds\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\n     * Default value: \"xyz\".\n     */\n    fun scheme(value: Scheme = Scheme.XYZ): Builder = apply {\n      val propertyValue = PropertyValue(\"scheme\", TypeUtils.wrapToValue(value.value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n     * Default value: 0.\n     */\n    fun minzoom(value: Long = 0L): Builder = apply {\n      val propertyValue = PropertyValue(\"minzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n     * at the maxzoom are used when displaying the map at higher zoom levels.\n     * Default value: 22.\n     */\n    fun maxzoom(value: Long = 22L): Builder = apply {\n      val propertyValue = PropertyValue(\"maxzoom\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Contains an attribution to be displayed when the map is shown to a user.\n     */\n    fun attribution(value: String): Builder = apply {\n      val propertyValue = PropertyValue(\"attribution\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * A property to use as a feature id (for feature state). It can be a property\n     * name, or an expression to evaluate as the ID, or an object of the form `{<sourceLayer>:\n     * <propertyName/expression>}`. The expression can only be feature dependent if it is used. If specified as a\n     * string for a vector tile source, the same property is used across all its source layers.\n     * If specified as an object only specified source layers will have id overriden, others will fallback\n     * to original feature id\n     */\n    fun promoteId(value: PromoteId): Builder = apply {\n      val propertyValue = PropertyValue(\"promoteId\", value.toValue())\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * A setting to determine whether a source's tiles are cached locally.\n     * Default value: false.\n     */\n    fun volatile(value: Boolean = false): Builder = apply {\n      val propertyValue = PropertyValue(\"volatile\", TypeUtils.wrapToValue(value))\n      properties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    fun prefetchZoomDelta(value: Long = 4L): Builder = apply {\n      val propertyValue = PropertyValue(\"prefetch-zoom-delta\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * This property defines a source-specific resource budget, either in tile units or in megabytes. Whenever the\n     * tile cache goes over the defined limit, the least recently used tile will be evicted from\n     * the in-memory cache. Note that the current implementation does not take into account resources allocated by\n     * the visible tiles.\n     */\n    fun tileCacheBudget(value: TileCacheBudget): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-cache-budget\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n     * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n     * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n     * Default value: 0.\n     */\n    fun minimumTileUpdateInterval(value: Double = 0.0): Builder = apply {\n      val propertyValue = PropertyValue(\"minimum-tile-update-interval\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * When a set of tiles for a current zoom level is being rendered and some of\n     * the ideal tiles that cover the screen are not yet loaded, parent tile could be used\n     * instead. This might introduce unwanted rendering side-effects, especially for raster tiles that are overscaled multiple times.\n     * This property sets the maximum limit for how much a parent tile can be overscaled.\n     */\n    fun maxOverscaleFactorForParentTiles(value: Long): Builder = apply {\n      val propertyValue = PropertyValue(\"max-overscale-factor-for-parent-tiles\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n     * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n     * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n     * Default value: 0.\n     */\n    fun tileRequestsDelay(value: Double = 0.0): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-requests-delay\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n     * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n     * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n     * superseded with tile-requests-delay property value, if both are provided.\n     * Default value: 0.\n     */\n    fun tileNetworkRequestsDelay(value: Double = 0.0): Builder = apply {\n      val propertyValue = PropertyValue(\"tile-network-requests-delay\", TypeUtils.wrapToValue(value))\n      volatileProperties[propertyValue.propertyName] = propertyValue\n    }\n\n    /**\n     * Add a TileSet to the Source.\n     *\n     * @param tileSet\n     */\n    fun tileSet(tileSet: TileSet): Builder = apply {\n      for ((name, value) in tileSet) {\n        val propertyValue = PropertyValue(name, value)\n        properties[propertyValue.propertyName] = propertyValue\n      }\n    }\n\n    /**\n     * Add a TileSet to the Source, using DSL.\n     *\n     * @param tilejson\n     * @param tiles\n     * @param block\n     */\n    fun tileSet(tilejson: String, tiles: List<String>, block: TileSet.Builder.() -> Unit): Builder = apply {\n      val tileSet = TileSet.Builder(tilejson, tiles).apply(block).build()\n      for ((name, value) in tileSet) {\n        val propertyValue = PropertyValue(name, value)\n        properties[propertyValue.propertyName] = propertyValue\n      }\n    }\n    /**\n     * Build the VectorSource.\n     *\n     * @return the VectorSource\n     */\n    fun build(): VectorSource = VectorSource(this)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /**\n     * Influences the y direction of the tile coordinates. The global-mercator (aka Spherical Mercator) profile is assumed.\n     * Default value: \"xyz\".\n     */\n    val defaultScheme: Scheme?\n      /**\n       * Get the Scheme property\n       *\n       * @return Scheme\n       */\n      get() {\n        StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"scheme\").silentUnwrap<String>()?.let {\n          return Scheme.valueOf(it.uppercase(Locale.US).replace('-', '_'))\n        }\n        return null\n      }\n\n    /**\n     * Minimum zoom level for which tiles are available, as in the TileJSON spec.\n     * Default value: 0.\n     */\n    val defaultMinzoom: Long?\n      /**\n       * Get the Minzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"minzoom\").silentUnwrap()\n\n    /**\n     * Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles\n     * at the maxzoom are used when displaying the map at higher zoom levels.\n     * Default value: 22.\n     */\n    val defaultMaxzoom: Long?\n      /**\n       * Get the Maxzoom property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"maxzoom\").silentUnwrap()\n\n    /**\n     * A setting to determine whether a source's tiles are cached locally.\n     * Default value: false.\n     */\n    val defaultVolatile: Boolean?\n      /**\n       * Get the Volatile property\n       *\n       * @return Boolean\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"volatile\").silentUnwrap()\n\n    /**\n     * When loading a map, if PrefetchZoomDelta is set to any number greater than 0, the map\n     * will first request a tile at zoom level lower than zoom - delta, but so that\n     * the zoom level is multiple of delta, in an attempt to display a full map at\n     * lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.\n     * Default value: 4.\n     */\n    val defaultPrefetchZoomDelta: Long?\n      /**\n       * Get the PrefetchZoomDelta property\n       *\n       * @return Long\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"prefetch-zoom-delta\").silentUnwrap()\n\n    /**\n     * Minimum tile update interval in seconds, which is used to throttle the tile update network requests.\n     * If the given source supports loading tiles from a server, sets the minimum tile update interval.\n     * Update network requests that are more frequent than the minimum tile update interval are suppressed.\n     * Default value: 0.\n     */\n    val defaultMinimumTileUpdateInterval: Double?\n      /**\n       * Get the MinimumTileUpdateInterval property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"minimum-tile-update-interval\").silentUnwrap()\n\n    /**\n     * For the tiled sources, this property sets the tile requests delay. The given delay comes in\n     * action only during an ongoing animation or gestures. It helps to avoid loading, parsing and rendering\n     * of the transient tiles and thus to improve the rendering performance, especially on low-end devices.\n     * Default value: 0.\n     */\n    val defaultTileRequestsDelay: Double?\n      /**\n       * Get the TileRequestsDelay property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"tile-requests-delay\").silentUnwrap()\n\n    /**\n     * For the tiled sources, this property sets the tile network requests delay. The given delay comes\n     * in action only during an ongoing animation or gestures. It helps to avoid loading the transient\n     * tiles from the network and thus to avoid redundant network requests. Note that tile-network-requests-delay value is\n     * superseded with tile-requests-delay property value, if both are provided.\n     * Default value: 0.\n     */\n    val defaultTileNetworkRequestsDelay: Double?\n      /**\n       * Get the TileNetworkRequestsDelay property\n       *\n       * @return Double\n       */\n      get() = StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"tile-network-requests-delay\").silentUnwrap()\n  }\n}\n\n/**\n * DSL function for [VectorSource].\n */\nfun vectorSource(id: String, block: VectorSource.Builder.() -> Unit): VectorSource =\n  VectorSource.Builder(id).apply(block).build()\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/terrain/generated/Terrain.kt",
    "content": "// This file is generated.\npackage com.mapbox.maps.extension.style.terrain.generated\n\nimport android.util.Log\nimport androidx.annotation.UiThread\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.types.TerrainDsl\nimport com.mapbox.maps.extension.style.utils.unwrap\n\n/**\n * A global modifier that elevates layers and markers based on a DEM data source.\n *\n * @see [The online documentation](https://docs.mapbox.com/style-spec/reference/terrain/)\n */\n@UiThread\nclass Terrain(private val sourceId: String) : TerrainDslReceiver, StyleContract.StyleTerrainExtension {\n  internal var delegate: MapboxStyleManager? = null\n  private val properties = HashMap<String, PropertyValue<*>>()\n\n  /**\n   * Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value. Default value: 1. Value range: [0, 1000]\n   */\n  val exaggeration: Double?\n    /**\n     * Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value. Default value: 1. Value range: [0, 1000]\n     *\n     * @return exaggeration as Double\n     */\n    get() {\n      return getPropertyValue(\"exaggeration\")\n    }\n\n  /**\n   * Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value. Default value: 1. Value range: [0, 1000]\n   *\n   * @param exaggeration as Double\n   */\n  override fun exaggeration(exaggeration: Double): Terrain = apply {\n    setProperty(PropertyValue(\"exaggeration\", exaggeration))\n  }\n\n  /**\n   * Exaggeration property transition options.\n   */\n  val exaggerationTransition: StyleTransition?\n    /**\n     * Get the Exaggeration property transition options.\n     *\n     * @return transition options for exaggeration\n     */\n    get() {\n      return getTransitionProperty(\"exaggeration-transition\")\n    }\n  /**\n   * Set the Exaggeration property transition options.\n   *\n   * @param options transition options for exaggeration\n   */\n  override fun exaggerationTransition(options: StyleTransition): Terrain = apply {\n    val propertyValue = PropertyValue(\"exaggeration-transition\", options)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * DSL for [exaggerationTransition].\n   */\n  override fun exaggerationTransition(block: StyleTransition.Builder.() -> Unit): Terrain = apply {\n    exaggerationTransition(StyleTransition.Builder().apply(block).build())\n  }\n\n  /**\n   * Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value. Default value: 1. Value range: [0, 1000]\n   *\n   * This is an Expression representation of \"exaggeration\".\n   */\n  val exaggerationAsExpression: Expression?\n    /**\n     * Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value. Default value: 1. Value range: [0, 1000]\n     *\n     * Get the Exaggeration property as an Expression\n     *\n     * @return Double\n     */\n    get() {\n      getPropertyValue<Expression>(\"exaggeration\")?.let {\n        return it\n      }\n      exaggeration?.let {\n        return Expression.literal(it)\n      }\n      return null\n    }\n  /**\n   * Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value. Default value: 1. Value range: [0, 1000]\n   *\n   * @param exaggeration value of exaggeration as Expression\n   */\n  override fun exaggeration(exaggeration: Expression): Terrain = apply {\n    val propertyValue = PropertyValue(\"exaggeration\", exaggeration)\n    setProperty(propertyValue)\n  }\n\n  /**\n   * Bind terrain to the map controller.\n   *\n   * @param delegate The map controller\n   */\n  override fun bindTo(delegate: MapboxStyleManager) {\n    this.delegate = delegate\n    val terrainParams = HashMap<String, Value>()\n    terrainParams[\"source\"] = Value(sourceId)\n    properties.forEach {\n      terrainParams[it.key] = it.value.value\n    }\n    val expected = delegate.setStyleTerrain(Value(terrainParams))\n    expected.error?.let {\n      throw MapboxStyleException(\"Set terrain failed: $it\")\n    }\n  }\n\n  private fun setProperty(property: PropertyValue<*>) {\n    properties[property.propertyName] = property\n    updateProperty(property)\n  }\n\n  private fun updateProperty(propertyValue: PropertyValue<*>) {\n    val expected = delegate?.setStyleTerrainProperty(\n      propertyValue.propertyName,\n      propertyValue.value\n    )\n    expected?.error?.let {\n      throw MapboxStyleException(\"Set terrain property failed: $it\")\n    }\n  }\n\n  private inline fun <reified T> getPropertyValue(propertyName: String): T? {\n    delegate?.let {\n      return try {\n        it.getStyleTerrainProperty(propertyName).unwrap()\n      } catch (e: RuntimeException) {\n        Log.e(TAG, \"Get terrain property failed: ${e.message}\")\n        Log.e(TAG, it.getStyleTerrainProperty(propertyName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $propertyName failed: terrain is not added to style yet.\")\n  }\n\n  private fun getTransitionProperty(transitionName: String): StyleTransition? {\n    delegate?.let {\n      return try {\n        @Suppress(\"UNCHECKED_CAST\")\n        val styleLayerProperty =\n          it.getStyleTerrainProperty(transitionName).value.contents as HashMap<String, Value>\n        val duration = styleLayerProperty[\"duration\"]?.contents as Long\n        val delay = styleLayerProperty[\"delay\"]?.contents as Long\n        StyleTransition.Builder().delay(delay).duration(duration).build()\n      } catch (e: RuntimeException) {\n        Log.e(TAG, \"Get terrain property failed: ${e.message}\")\n        Log.e(TAG, it.getStyleTerrainProperty(transitionName).toString())\n        null\n      }\n    }\n    throw MapboxStyleException(\"Get property $transitionName failed: terrain is not added to style yet.\")\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val TAG = \"Mbgl-Terrain\"\n  }\n}\n\n/**\n * This Interface contains all the functions that will be exposed to Koltin DSL.\n *\n * Separated the DSL receiver class to this interface to avoid IDE code suggestion for\n * property getters.\n */\n@TerrainDsl\ninterface TerrainDslReceiver {\n  /**\n   * Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value. Default value: 1. Value range: [0, 1000]\n   *\n   * @param exaggeration as Double\n   */\n  fun exaggeration(exaggeration: Double = 1.0): Terrain\n\n  /**\n   * Exaggerates the elevation of the terrain by multiplying the data from the DEM with this value. Default value: 1. Value range: [0, 1000]\n   *\n   * @param exaggeration value of exaggeration as Expression\n   */\n  fun exaggeration(exaggeration: Expression): Terrain\n\n  /**\n   * Set the Exaggeration property transition options.\n   *\n   * @param options transition options for exaggeration\n   */\n  fun exaggerationTransition(options: StyleTransition): Terrain\n\n  /**\n   * DSL for [exaggerationTransition].\n   */\n  fun exaggerationTransition(block: StyleTransition.Builder.() -> Unit): Terrain\n}\n\n/**\n * DSL function for creating [Terrain] instance.\n */\n@JvmOverloads\nfun terrain(sourceId: String, block: (TerrainDslReceiver.() -> Unit)? = null): Terrain {\n  return if (block != null) {\n    Terrain(sourceId).apply(block)\n  } else {\n    Terrain(sourceId)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/terrain/generated/TerrainExt.kt",
    "content": "// This file is generated.\n@file:JvmName(\"TerrainUtils\")\n\npackage com.mapbox.maps.extension.style.terrain.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.StyleContract\n\n/**\n * Extension function to get the terrain provided by the Style Extension.\n *\n * @return Terrain\n */\nfun MapboxStyleManager.getTerrain(sourceId: String): Terrain {\n  return Terrain(sourceId).also { it.delegate = this }\n}\n\n/**\n * Extension function to set the Terrain provided by the Style Extension to the Style.\n *\n * @param terrain The terrain to be set\n */\nfun MapboxStyleManager.setTerrain(terrain: StyleContract.StyleTerrainExtension) {\n  terrain.bindTo(this)\n}\n\n/**\n * Removes terrain from style if it was set.\n */\nfun MapboxStyleManager.removeTerrain() {\n  setStyleTerrain(Value.nullValue())\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/types/Formatted.kt",
    "content": "package com.mapbox.maps.extension.style.types\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.unwrapToTyped\nimport java.lang.StringBuilder\nimport java.util.ArrayList\n\n/**\n * Represents a string broken into sections annotated with separate formatting options.\n *\n * @see [Style specification](https://www.mapbox.com/mapbox-gl-js/style-spec/#types-formatted)\n *\n */\n@LayersDsl\nclass Formatted : ArrayList<FormattedSection>() {\n  /**\n   * Convert Formatted to a Value.\n   *\n   * @return a value class\n   */\n  fun toValue(): Value {\n    return Value(this.map { it.toValue() })\n  }\n\n  /**\n   * Get the formatted field's text as a plain String.\n   */\n  fun getTextAsString(): String {\n    val stringBuilder = StringBuilder()\n    this.forEach { section ->\n      stringBuilder.append(section.text)\n    }\n    return stringBuilder.toString()\n  }\n\n  /**\n   * DSL function to add a formatted section to the Formatted.\n   */\n  fun formattedSection(text: String, block: FormattedSection.() -> Unit) {\n    this.add(FormattedSection(text).apply(block))\n  }\n\n  /**\n   * Add a formatted section to the Formatted.\n   */\n  fun formattedSection(section: FormattedSection) {\n    this.add(section)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /**\n     * Construct a [Formatted] object from a format expression.\n     */\n    fun fromExpression(expression: Expression): Formatted {\n      return fromProperty(expression.unwrapToTyped<ArrayList<Any>>())\n    }\n\n    /**\n     * Construct a [Formatted] object from a Formatted List (Returned from the Core).\n     */\n    fun fromProperty(list: ArrayList<*>): Formatted {\n      val formatted = Formatted()\n\n      if (list.removeAt(0) == \"format\") {\n        list.forEachIndexed { index, element ->\n          when (element) {\n            is String -> {\n              val formattedSection = FormattedSection(element)\n              val optionsMap = list[index + 1] as HashMap<*, *>\n              optionsMap.keys.forEach { key ->\n                when (key) {\n                  \"text-color\" -> {\n                    val colorExpressionList = optionsMap[key] as ArrayList<*>\n                    if (colorExpressionList.removeAt(0) == \"rgba\") {\n                      formattedSection.textColor = ColorUtils.rgbaExpressionToColorString(\n                        rgba {\n                          literal(colorExpressionList[0] as Double)\n                          literal(colorExpressionList[1] as Double)\n                          literal(colorExpressionList[2] as Double)\n                          literal(colorExpressionList[3] as Double)\n                        }\n                      )\n                    }\n                  }\n                  \"font-scale\" -> formattedSection.fontScale = optionsMap[key] as Double\n                  \"text-font\" -> {\n                    val textFontExpressionList = optionsMap[key] as ArrayList<*>\n                    if (textFontExpressionList.removeAt(0) == \"literal\") {\n                      @Suppress(\"UNCHECKED_CAST\")\n                      formattedSection.fontStack =\n                        textFontExpressionList.last() as ArrayList<String>\n                    }\n                  }\n                }\n              }\n              formatted.add(formattedSection)\n            }\n            else -> Unit\n          }\n        }\n      }\n      return formatted\n    }\n  }\n}\n\n/**\n * DSL function for [Formatted].\n */\nfun formatted(block: Formatted.() -> Unit): Formatted = Formatted().apply(block)"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/types/FormattedSection.kt",
    "content": "package com.mapbox.maps.extension.style.types\n\nimport androidx.annotation.ColorInt\nimport androidx.annotation.Keep\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.style.utils.ColorUtils\n\n/**\n * A component of the [Formatted].\n *\n * @param text displayed string\n * @param fontScale scale of the font, setting to null will fall back to style's default settings\n * @param fontStack main and fallback fonts that are a part of the style,\n *                  setting null will fall back to style's default settings.\n *                  The requested font stack has to be a part of the used style.\n *                  For more information see\n *                  [The online documentation]https://www.mapbox.com/help/define-font-stack/).\n * @param textColor text color, setting to null will fall back to style's default settings.\n *                  Value of red, green, blue components must range between 0 and 255,\n *                  an alpha component must range between 0 and 1.\n *\n * For more information see [The online documentation]https://docs.mapbox.com/mapbox-gl-js/style-spec/#types-color).\n */\n@Keep\n@LayersDsl\ndata class FormattedSection @JvmOverloads constructor(\n  val text: String,\n  var fontScale: Double? = null,\n  var fontStack: List<String>? = null,\n  var textColor: String? = null\n) {\n  /**\n   * [ColorInt] representation for textColor.\n   */\n  var textColorAsInt: Int\n    @ColorInt\n    get() {\n      textColor?.let {\n        ColorUtils.rgbaToColor(it)?.let { colorInt ->\n          return colorInt\n        }\n      }\n      throw IllegalStateException(\"Property textColor is not set.\")\n    }\n    set(@ColorInt value) {\n      textColor = ColorUtils.colorToRgbaString(value)\n    }\n\n  /**\n   * Convert [FormattedSection] to a [Value].\n   *\n   * @return a value class\n   */\n  internal fun toValue(): Value {\n    val params = HashMap<String, Value>()\n    fontScale?.let {\n      params[\"font-scale\"] = Value(it)\n    }\n    fontStack?.let { strings ->\n      params[\"text-font\"] = Value(strings.map(::Value))\n    }\n    textColor?.let {\n      params[\"text-color\"] = Value(it)\n    }\n    return Value(listOf(Value(text), Value(params)))\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/types/PromoteId.kt",
    "content": "package com.mapbox.maps.extension.style.types\n\nimport androidx.annotation.Keep\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.sources.generated.VectorSource\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.extension.style.utils.unwrapToExpression\n\n/**\n * Holds a property type to promote a specific feature for feature state API.\n *\n * @param propertyName promote id value.\n * @param sourceId source layer in [VectorSource] to which the feature ID override applies.\n *\n * If not provided the override will be applied to all layers of the source.\n *\n * For more information see [The online documentation](https://docs.mapbox.com/mapbox-gl-js/style-spec/types/#promoteId).\n */\n@Keep\ndata class PromoteId @JvmOverloads constructor(\n  /*\n   * Feature property name.\n   */\n  val propertyName: String,\n\n  /*\n   * The source layer in [VectorSource] to which the feature ID override applies.\n   *\n   * If not provided the override will be applied to all layers of the source.\n   */\n  val sourceId: String? = null\n) {\n\n  /**\n   * Expression to promote.\n   */\n  val expression: Expression? = try {\n    Value.fromJson(propertyName).value?.unwrapToExpression()\n  } catch (_: Throwable) {\n    null\n  }\n\n  /**\n   * Construct a [PromoteId] object from an [Expression].\n   *\n   * @param expression expression to promote.\n   * @param sourceId source layer in [VectorSource] to which the feature ID override applies.\n   *\n   * If not provided the override will be applied to all layers of the source.\n   */\n  @JvmOverloads\n  constructor(expression: Expression, sourceId: String? = null) : this(\n    expression.toJson(),\n    sourceId\n  )\n\n  internal fun toValue(): Value {\n    val promoteIdValue = Value.fromJson(propertyName).getValueOrElse { Value.valueOf(propertyName) }\n    sourceId?.let {\n      return Value(hashMapOf(sourceId to promoteIdValue))\n    }\n    return promoteIdValue\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /**\n     * Construct a [PromoteId] object from a Property returned from the core.\n     *\n     * @param propertyName feature property name.\n     * Can be either of type [String] or [HashMap] of <String,String>\n     * Throws [RuntimeException] exception if couldn't construct to [PromoteId].\n     */\n    internal fun fromProperty(propertyName: Any) = when (propertyName) {\n      is String -> PromoteId(propertyName)\n      is List<*> -> PromoteId(TypeUtils.wrapToValue(propertyName).unwrapToExpression())\n      is HashMap<*, *> -> {\n        @Suppress(\"UNCHECKED_CAST\")\n        try {\n          val propertyMap = propertyName as HashMap<String, *>\n          if (propertyMap.keys.isNotEmpty()) {\n            val key = propertyMap.keys.iterator().next()\n            when (val value = propertyMap[key]) {\n              is String? -> PromoteId(value ?: \"\", key)\n              is List<*> -> PromoteId(TypeUtils.wrapToValue(value).unwrapToExpression(), key)\n              else -> throw RuntimeException(\"PromoteId value should be either String or Expression\")\n            }\n          } else {\n            PromoteId(\"\")\n          }\n        } catch (e: RuntimeException) {\n          throw IllegalArgumentException(\"$propertyName must be in the format HashMap<String,String> or HashMap<String,Expression>\")\n        }\n      }\n\n      else -> throw UnsupportedOperationException(\"Wrapping ${propertyName::class.java.simpleName} to PromoteId is not supported.\")\n    }\n  }\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/types/StyleTransition.kt",
    "content": "package com.mapbox.maps.extension.style.types\n\nimport com.mapbox.bindgen.Value\n\n/**\n * Concrete implementation of the StyleTransition interface.\n */\n@LayersDsl\nclass StyleTransition private constructor(builder: Builder) {\n  /**\n   * Duration of the transition.\n   */\n  val duration: Long?\n  /**\n   * Delay of the transition.\n   */\n  val delay: Long?\n\n  init {\n    this.duration = builder.duration\n    this.delay = builder.delay\n  }\n\n  /**\n   * The [Value] representation of the transition object.\n   */\n  fun toValue(): Value {\n    val transition = HashMap<String, Value>()\n    transition[\"delay\"] = Value(0)\n    transition[\"duration\"] = Value(0)\n    this.delay?.let {\n      transition[\"delay\"] = Value(it)\n    }\n    this.duration?.let {\n      transition[\"duration\"] = Value(it)\n    }\n    return Value(transition)\n  }\n\n  /**\n   * Builder for StyleTransitionImpl.\n   */\n  @LayersDsl\n  class Builder {\n    /**\n     * Duration of the transition.\n     */\n    var duration: Long? = null\n      private set\n    /**\n     * Delay of the transition.\n     */\n    var delay: Long? = null\n      private set\n\n    /**\n     * Duration of the transition.\n     */\n    fun duration(duration: Long): Builder = apply { this.duration = duration }\n\n    /**\n     * Delay of the transition.\n     */\n    fun delay(delay: Long): Builder = apply { this.delay = delay }\n\n    /**\n     * Build the StyleTransitionImpl.\n     *\n     * @return StyleTransitionImpl\n     */\n    fun build() = StyleTransition(this)\n  }\n\n  /**\n   * Assert an object is equal to this object.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (other is StyleTransition) {\n      if (this.delay == other.delay && this.duration == other.duration) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /**\n   * Override the hash code calculation.\n   */\n  override fun hashCode(): Int {\n    var result = duration?.hashCode() ?: 0\n    result = 31 * result + (delay?.hashCode() ?: 0)\n    return result\n  }\n}\n\n/**\n * DSL function for [StyleTransition].\n */\nfun transitionOptions(block: StyleTransition.Builder.() -> Unit): StyleTransition =\n  StyleTransition.Builder().apply(block).build()"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/types/TypeDSLs.kt",
    "content": "package com.mapbox.maps.extension.style.types\n\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Dsl marker for Light.\n *\n * Controls the scope of the Light Dsl.\n */\n@DslMarker\nannotation class LightDsl\n\n/**\n * Dsl marker for Layer.\n *\n * Controls the scope of the Layer Dsl.\n */\n@DslMarker\nannotation class LayersDsl\n\n/**\n * Dsl marker for Source.\n *\n * Controls the scope of the Source Dsl.\n */\n@DslMarker\nannotation class SourceDsl\n\n/**\n * Dsl marker for Expression.\n *\n * Controls the scope of the Expression Dsl.\n */\n@DslMarker\nannotation class ExpressionDsl\n\n/**\n * Dsl marker for Terrain.\n *\n * Controls the scope of the Terrain Dsl.\n */\n@DslMarker\nannotation class TerrainDsl\n\n/**\n * Dsl marker for Atmosphere.\n *\n * Controls the scope of the Atmosphere Dsl.\n */\n@DslMarker\nannotation class AtmosphereDsl\n\n/**\n * Dsl marker for Snow.\n *\n * Controls the scope of the Snow Dsl.\n */\n@DslMarker\n@MapboxExperimental\nannotation class SnowDsl\n\n/**\n * Dsl marker for Rain.\n *\n * Controls the scope of the Rain Dsl.\n */\n@DslMarker\n@MapboxExperimental\nannotation class RainDsl"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/utils/ColorUtils.kt",
    "content": "package com.mapbox.maps.extension.style.utils\n\nimport android.graphics.Color\nimport android.util.Log\nimport androidx.annotation.ColorInt\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.utils.ColorUtils.formatAlpha\nimport java.text.DecimalFormat\nimport java.text.NumberFormat\nimport java.util.Locale\nimport java.util.regex.Matcher\nimport java.util.regex.Pattern\n\n/**\n * Color utility class.\n */\nobject ColorUtils {\n  /**\n   * Convert an `rgba(...)` or `rgb(...)` string to a [Color] int.\n   *\n   *\n   * R, G, B color components have to be in the `[0-255]` range, while alpha has to be in the `[0.0-1.0]` range.\n   * For example: \"rgba(255, 128, 0, 0.7)\".\n   *\n   * @param value the [String] representation of rgba or rgb.\n   * @return the int representation\n   */\n  @ColorInt\n  fun rgbaToColor(value: String): Int? {\n    // we need to accept R, G and B as float values as well and floor them, as those can come from core\n    val c = Pattern.compile(\n      \"rgba?\\\\s*\\\\(\\\\s*(\\\\d+\\\\.?\\\\d*)\\\\s*,\\\\s*(\\\\d+\\\\.?\\\\d*)\\\\s*,\\\\s*(\\\\d+\\\\.?\\\\d*)\\\\s*,\" +\n        \"?\\\\s*(\\\\d+\\\\.?\\\\d*)?\\\\s*\\\\)\"\n    )\n    val m = c.matcher(value)\n    return matchToColorOrNull(m)\n  }\n\n  /**\n   * Converts Android color int to \"rbga(r, g, b, a)\" String equivalent.\n   *\n   * Alpha value will be converted from 0-255 range to 0-1.\n   *\n   * @param color Android [Color] int\n   * @return [String] `rgba(...)` color\n   */\n  fun colorToRgbaString(@ColorInt color: Int): String = formatARGB(\n    alpha = (color shr 24 and 0xFF) / 255.0,\n    red = color shr 16 and 0xFF,\n    green = color shr 8 and 0xFF,\n    blue = color and 0xFF\n  )\n\n  /**\n   * Convert an rgba or rgb [Expression] to a [Color] int.\n   *\n   *\n   * R, G, B color components have to be in the `[0-255]` range, while alpha has to be in the `[0.0-1.0]` range.\n   * For example: \"[rgba, 1, 1, 1, 0.7]\".\n   *\n   * @param value the Expression representation of rgba\n   * @return the int representation of rgba\n   */\n  @ColorInt\n  fun rgbaExpressionToColorInt(value: Expression): Int? {\n    // we need to accept R, G and B as float values as well and floor them, as those can come from core\n    val c = Pattern.compile(\n      \"\\\\[?\\\\s*rgba?\\\\s*,?\\\\s*(\\\\d+\\\\.?\\\\d*)\\\\s*,\\\\s*(\\\\d+\\\\.?\\\\d*)\\\\s*,\\\\s*(\\\\d+\\\\.?\\\\d*)\\\\s*,?\\\\s*(\\\\d+\\\\.?\\\\d*)?\\\\s*\\\\]\"\n    )\n    val m = c.matcher(value.toString())\n    return matchToColorOrNull(m)\n  }\n\n  /**\n   * Convert an rgba or rgb [Expression] to a `rgba(...)` [String].\n   *\n   *\n   * R, G, B color components have to be in the `[0-255]` range, while alpha has to be in the `[0.0-1.0]` range.\n   * For example: \"[rgba, 255, 128, 0, 0.7]\".\n   *\n   * @param value the [Expression] representation of rgba/rgb\n   * @return the [String] representation of rgba\n   */\n  fun rgbaExpressionToColorString(value: Expression): String? {\n    // we need to accept R, G and B as float values as well and floor them, as those can come from core\n    val c = Pattern.compile(\n      \"\\\\[?\\\\s*rgba?\\\\s*,?\\\\s*(\\\\d+\\\\.?\\\\d*)\\\\s*,\\\\s*(\\\\d+\\\\.?\\\\d*)\\\\s*,\\\\s*(\\\\d+\\\\.?\\\\d*)\\\\s*,?\\\\s*(\\\\d+\\\\.?\\\\d*)?\\\\s*\\\\]\"\n    )\n    val m = c.matcher(value.toString())\n    return if (m.matches() && m.groupCount() == 4) {\n      // Alpha is represented as a value from 0.0F to 1.0F.\n      // If alpha was not present (i.e. string was \"rgb[red, green, blue]\") then set it to 1.0F\n      val alpha = m.group(4)?.toDouble() ?: 1.0\n      formatARGB(\n        alpha = alpha,\n        red = m.group(1)!!.toFloat().toInt(),\n        green = m.group(2)!!.toFloat().toInt(),\n        blue = m.group(3)!!.toFloat().toInt()\n      )\n    } else {\n      Log.e(TAG, \"Not a valid rgb/rgba value\")\n      null\n    }\n  }\n\n  /**\n   * Converts Android color int to \"rbga(r, g, b, a)\" Expression equivalent.\n   *\n   *\n   * Alpha value will be converted from 0-255 range to 0-1.\n   *\n   *\n   * @param color Android color int\n   * @return Expression of rgba color\n   */\n  fun colorIntToRgbaExpression(@ColorInt color: Int): Expression {\n    val alpha = (color shr 24 and 0xFF).toDouble() / 255.0\n    return rgba {\n      literal((color shr 16 and 0xFF).toLong())\n      literal((color shr 8 and 0xFF).toLong())\n      literal((color and 0xFF).toLong())\n      literal(formatAlpha(alpha).toDouble())\n    }\n  }\n\n  /**\n   * Converts Android color int to rgba float array.\n   *\n   *\n   * Returned RGB values range from 0 to 255.\n   * Alpha value ranges from 0-1.\n   *\n   *\n   * @param color Android color int\n   * @return float rgba array, rgb values range from 0-255, alpha from 0-1\n   */\n  fun colorToRgbaArray(@ColorInt color: Int): FloatArray {\n    return floatArrayOf(\n      (color shr 16 and 0xFF.toFloat().toInt()).toFloat(), // r (0-255)\n      (color shr 8 and 0xFF.toFloat().toInt()).toFloat(), // g (0-255)\n      (color and 0xFF.toFloat().toInt()).toFloat(), // b (0-255)\n      (color shr 24 and 0xFF) / 255.0f // a (0-1)\n    )\n  }\n\n  /**\n   * Converts Android color int to GL rgba float array.\n   *\n   *\n   * Returned values range from 0-1.\n   *\n   *\n   * @param color Android color int\n   * @return float rgba array, values range from 0 to 1\n   */\n  fun colorToGlRgbaArray(@ColorInt color: Int): FloatArray {\n    return floatArrayOf(\n      (color shr 16 and 0xFF) / 255.0f, // r (0-1)\n      (color shr 8 and 0xFF) / 255.0f, // g (0-1)\n      (color and 0xFF) / 255.0f, // b (0-1)\n      (color shr 24 and 0xFF) / 255.0f // a (0-1)\n    )\n  }\n\n  private fun matchToColorOrNull(m: Matcher): Int? {\n    // Regardless of rgba or rgb we are always getting 4 groups, just that one will be empty\n    return if (m.matches() && m.groupCount() == 4) {\n      // Alpha is represented as a value from 0.0F to 1.0F.\n      // If alpha was not present (i.e. string was \"rgb(red, green, blue)\") then set it to 1.0F\n      val alphaFloat = m.group(4)?.toFloat() ?: 1.0F\n      // Apply rounding, same than in\n      // https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/graphics/java/android/graphics/Color.java;l=1318;drc=956a76ae36cfe0b5808abab81e3ccbc5c1fe3656\n      val alphaInt: Int = (alphaFloat * 255F + 0.5F).toInt()\n      // Red, green and blue are represented as values from 0 to 255 and they might be float.\n      // We don't round them but rather discard the fraction (e.g. 128.789 is converted as 128)\n      val red = m.group(1)!!.toFloat().toInt()\n      val green = m.group(2)!!.toFloat().toInt()\n      val blue = m.group(3)!!.toFloat().toInt()\n      Color.argb(alphaInt, red, green, blue)\n    } else {\n      Log.e(TAG, \"Not a valid rgb/rgba value\")\n      null\n    }\n  }\n\n  private fun formatARGB(\n    alpha: Double,\n    red: Int,\n    green: Int,\n    blue: Int\n  ): String {\n    val alphaString = formatAlpha(alpha)\n    return String.format(\n      Locale.US,\n      \"rgba(%d, %d, %d, %s)\",\n      red, green, blue, alphaString\n    )\n  }\n\n  private fun formatAlpha(alpha: Double): String {\n    val decimalFormat = NumberFormat.getNumberInstance(Locale.US) as DecimalFormat\n    decimalFormat.applyPattern(\"#.########\")\n    return decimalFormat.format(alpha)\n  }\n\n  private const val TAG = \"ColorUtils\"\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/utils/ExpectedUtils.kt",
    "content": "package com.mapbox.maps.extension.style.utils\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.maps.MapboxStyleException\n\n/**\n * Internal function to check if a method invoke on StyleDelegate succeeded, throws exception if not.\n */\ninternal fun Expected<String, None>?.check() {\n  this?.also {\n    it.error?.let { err ->\n      throw MapboxStyleException(err)\n    }\n  } ?: throw MapboxStyleException(\"Plugin is not added to Style yet.\")\n}\n\n/**\n * Internal function to check if a method invoke on StyleDelegate succeeded, throws exception if not.\n */\ninternal inline fun <reified T> Expected<String, T>?.take(): T {\n  this?.also {\n    it.error?.let { err ->\n      throw MapboxStyleException(err)\n    }\n    it.value?.let { v ->\n      return v\n    }\n  }\n  throw MapboxStyleException(\"Plugin is not added to Style yet.\")\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/utils/StyleTelemetryEvents.kt",
    "content": "package com.mapbox.maps.extension.style.utils\n\nimport com.mapbox.maps.module.TelemetryEvent\n\ninternal object StyleTelemetryEvents {\n  val dsl = TelemetryEvent.create(\"style/dsl\")\n}"
  },
  {
    "path": "extension-style/src/main/java/com/mapbox/maps/extension/style/utils/TypeUtils.kt",
    "content": "package com.mapbox.maps.extension.style.utils\n\nimport androidx.annotation.RestrictTo\nimport com.google.gson.JsonPrimitive\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TransitionOptions\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.generated.LayerProperty\nimport com.mapbox.maps.extension.style.light.LightPosition\nimport com.mapbox.maps.extension.style.sources.generated.ModelSourceModel\nimport com.mapbox.maps.extension.style.sources.toValue\nimport com.mapbox.maps.extension.style.types.Formatted\nimport com.mapbox.maps.extension.style.types.StyleTransition\n\n/**\n * Internal utility to convert Any type to Value class.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\nobject TypeUtils {\n  /**\n   * Wrap the Any Kotlin type to [Value] class to be consumed by native renderer.\n   *\n   * @param value the value to be wrapped.\n   * @return the [Value] class.\n   */\n  fun wrapToValue(value: Any): Value {\n    return when (value) {\n      is Value -> {\n        value\n      }\n      is Expression -> {\n        value\n      }\n      is Formatted -> {\n        value.toValue()\n      }\n      is StyleTransition -> {\n        value.toValue()\n      }\n      is LayerProperty -> {\n        Value(value.value)\n      }\n      is LightPosition -> {\n        value.toValue()\n      }\n      is TileCacheBudget -> {\n        value.toValue()\n      }\n      is ModelSourceModel -> {\n        value.toValue()\n      }\n      is Int -> {\n        Value(value.toLong())\n      }\n      is String -> {\n        Value(value)\n      }\n      is Boolean -> {\n        Value(value)\n      }\n      is Double -> {\n        require(value.isFinite()) { \"Value can not be Double.NaN, Double.POSITIVE_INFINITY or Double.NEGATIVE_INFINITY\" }\n        Value(value)\n      }\n      is Float -> {\n        require(value.isFinite()) { \"Value can not be Float.NaN, Float.POSITIVE_INFINITY or Float.NEGATIVE_INFINITY\" }\n        Value(value.toDouble())\n      }\n      is Long -> {\n        Value(value)\n      }\n      is IntArray -> {\n        val valueArray = value.map { wrapToValue(it.toLong()) }\n        Value(valueArray)\n      }\n      is BooleanArray -> {\n        val valueArray = value.map(::wrapToValue)\n        Value(valueArray)\n      }\n      is DoubleArray -> {\n        val valueArray = value.map(::wrapToValue)\n        Value(valueArray)\n      }\n      is FloatArray -> {\n        val valueArray = value.map { wrapToValue(it.toDouble()) }\n        Value(valueArray)\n      }\n      is LongArray -> {\n        val valueArray = value.map(::wrapToValue)\n        Value(valueArray)\n      }\n      is Array<*> -> {\n        val valueArray = value.map { it?.let { wrapToValue(it) } }\n        Value(valueArray)\n      }\n      is List<*> -> {\n        val valueArray = value.map { it?.let { wrapToValue(it) } }\n        Value(valueArray)\n      }\n      is HashMap<*, *> -> {\n        val result: HashMap<String, Value> = HashMap()\n        @Suppress(\"UNCHECKED_CAST\")\n        val castedValue = value as HashMap<String, Any>\n        castedValue.keys.forEach { key -> result[key] = wrapToValue(castedValue[key]!!) }\n        Value(result)\n      }\n      is JsonPrimitive -> {\n        if (value.isBoolean) {\n          return Value(value.asBoolean)\n        }\n        if (value.isNumber) {\n          return Value(value.asDouble)\n        }\n        if (value.isString) {\n          return Value(value.asString)\n        }\n        throw IllegalArgumentException(\"Failed to parse JsonPrimitive: $value\")\n      }\n      else -> throw UnsupportedOperationException(\"Wrapping \\\"${value::class.java.simpleName}\\\" is not supported.\")\n    }\n  }\n}\n\n/**\n * Extension function for [Value] to unwrap Value to [Any].\n *\n * @throws UnsupportedOperationException if type is not supported.\n */\nfun Value.unwrapToAny(): Any {\n  when (val contents = this.contents) {\n    is Double -> return contents\n    is Long -> return contents\n    is Boolean -> return contents\n    is String -> return contents\n    is DoubleArray -> return contents\n    is LongArray -> return contents\n    is BooleanArray -> return contents\n    is List<*> -> {\n      @Suppress(\"UNCHECKED_CAST\")\n      val valueList = contents as List<Value>\n      val ret = ArrayList<Any>()\n      valueList.forEach {\n        ret.add(it.unwrapToAny())\n      }\n      return ret\n    }\n    is HashMap<*, *> -> {\n      @Suppress(\"UNCHECKED_CAST\")\n      val valueMap = contents as HashMap<String, Value>\n      val ret = HashMap<String, Any>()\n      valueMap.keys.forEach { key ->\n        valueMap[key]?.let { value ->\n          ret[key] = value.unwrapToAny()\n        }\n      }\n      return ret\n    }\n  }\n  throw UnsupportedOperationException(\"unable to unwrap Value of content type: ${this.contents?.let { it::class.java.simpleName }}\")\n}\n\n/**\n * Extension function for [Value] to unwrap Value to a literal [Expression].\n */\nprivate fun Value.unwrapToLiteralExpression(): Expression {\n  when (val contents = this.contents) {\n    is Double -> return Expression.literal(contents)\n    is Long -> return Expression.literal(contents)\n    is Boolean -> return Expression.literal(contents)\n    is String -> return Expression.literal(contents)\n    is DoubleArray -> return Expression.literal(contents.asList())\n    is LongArray -> return Expression.literal(contents.asList())\n    is BooleanArray -> return Expression.literal(contents.asList())\n    is List<*> -> {\n      @Suppress(\"UNCHECKED_CAST\")\n      val valueList = contents as List<Value>\n      val ret = ArrayList<Any>()\n      valueList.forEach {\n        ret.add(it.unwrapToAny())\n      }\n      return Expression.literal(ret)\n    }\n    is HashMap<*, *> -> {\n      @Suppress(\"UNCHECKED_CAST\")\n      val valueMap = contents as HashMap<String, Value>\n      val ret = HashMap<String, Any>()\n      valueMap.keys.forEach { key ->\n        valueMap[key]?.let { value ->\n          ret[key] = value.unwrapToAny()\n        }\n      }\n      return Expression.literal(ret)\n    }\n  }\n  throw UnsupportedOperationException(\"unable to unwrap Value of content type: ${this.contents?.let { it::class.java.simpleName }}\")\n}\n\n/**\n * Extension function for [Value] to unwrap Value to the given type.\n *\n * Throws exception if type doesn't match.\n */\ninline fun <reified T> Value.unwrapToTyped(): T {\n  return unwrapToTyped(T::class.java)\n}\n\n/**\n * Extension function for [Value] to unwrap Value to the given type.\n *\n * Throws exception if type doesn't match.\n *\n * @param clazz the class to unwrap to.\n */\nfun <T> Value.unwrapToTyped(clazz: Class<T>): T {\n  val unwrappedValue = unwrapToAny()\n  if (clazz.isInstance(unwrappedValue)) {\n    @Suppress(\"UNCHECKED_CAST\")\n    return unwrappedValue as T\n  } else {\n    throw UnsupportedOperationException(\"Requested type ${clazz.simpleName} doesn't match ${unwrappedValue::class.java.simpleName}\")\n  }\n}\n\n/**\n * Extension function for [Value] to unwrap Value to [StyleTransition].\n *\n * Throws exception if couldn't convert.\n */\nfun Value.unwrapToStyleTransition(): StyleTransition {\n  when (val transition = this.contents) {\n    is HashMap<*, *> -> {\n      val builder = StyleTransition.Builder()\n      @Suppress(\"UNCHECKED_CAST\")\n      val map = transition as HashMap<String, Value>\n      map[\"delay\"]?.let {\n        builder.delay(it.contents as Long)\n      }\n      map[\"duration\"]?.let {\n        builder.duration(it.contents as Long)\n      }\n      return builder.build()\n    }\n    is List<*> -> {\n      @Suppress(\"UNCHECKED_CAST\")\n      val array = transition as List<Value>\n      val builder = StyleTransition.Builder()\n      builder.duration(array[0].contents as Long)\n      builder.delay(array[1].contents as Long)\n      return builder.build()\n    }\n  }\n  throw UnsupportedOperationException(\"unable to unwrap to StyleTransition: $this\")\n}\n\n/**\n * Unwraps an literal array to a array.\n *\n * e.g. translate [\"literal\", [0.0, 0.0, 0.0]] to [0.0, 0.0, 0.0].\n */\ninternal fun Expression.unwrapFromLiteralArray(): Expression {\n  if (this.contents is List<*>) {\n    @Suppress(\"UNCHECKED_CAST\")\n    val listValue = this.contents as List<Value>\n    val expressionOperator = listValue.first().contents as? String\n    if (\"literal\" == expressionOperator) {\n      when (val literalValue = listValue.last().contents) {\n        is List<*> -> {\n          @Suppress(\"UNCHECKED_CAST\")\n          val literalList = literalValue as List<Value>\n          return Expression(literalList)\n        }\n      }\n    }\n  }\n  return this\n}\n\n/**\n * Extension function for [Value] to unwrap Value to [Expression].\n *\n * Throws exception if couldn't convert.\n */\nfun Value.unwrapToExpression(): Expression {\n  when (val input = this.contents) {\n    is Double -> {\n      return Expression.literal(input)\n    }\n    is Long -> {\n      return Expression.literal(input)\n    }\n    is Boolean -> {\n      return Expression.literal(input)\n    }\n    is String -> {\n      return Expression.literal(input)\n    }\n    is List<*> -> {\n      @Suppress(\"UNCHECKED_CAST\")\n      val listValue = input as List<Value>\n      val operator = listValue.first().contents as? String ?: return Expression(input)\n      if (\"literal\" == operator) {\n        when (val literalValue = listValue.last().contents) {\n          is List<*> -> {\n            @Suppress(\"UNCHECKED_CAST\")\n            val literalList = literalValue as List<Value>\n            val resultList = ArrayList<Expression>()\n            literalList.forEach { resultList.add(it.unwrapToExpression()) }\n            return Expression.ExpressionBuilder(\"literal\").addArgument(Expression(resultList))\n              .build()\n          }\n          is HashMap<*, *> -> {\n            @Suppress(\"UNCHECKED_CAST\")\n            val literalMap = literalValue as HashMap<String, Value>\n            val resultMap = HashMap<String, Value>()\n            for ((key, value) in literalMap) {\n              resultMap[key] = value.unwrapToExpression()\n            }\n            @Suppress(\"UNCHECKED_CAST\")\n            return Expression.literal(resultMap as HashMap<String, Any>)\n          }\n        }\n      } else if (\"image\" == operator) {\n        val builder = Expression.ImageBuilder()\n        listValue.drop(1).forEach {\n          builder.addArgument(it.unwrapToExpression())\n        }\n        return builder.build()\n      }\n      val argList = listValue.drop(1)\n      val expressionBuilder = Expression.ExpressionBuilder(operator)\n      argList.forEach {\n        expressionBuilder.addArgument(it.unwrapToExpression())\n      }\n      return expressionBuilder.build()\n    }\n    is HashMap<*, *> -> {\n      @Suppress(\"UNCHECKED_CAST\")\n      val inputMap = input as HashMap<String, Value>\n      return Expression(inputMap)\n    }\n  }\n  throw UnsupportedOperationException(\"unable to unwrap to Expression: $this\")\n}\n\n/**\n * Extension function for [StylePropertyValue] to unwrap [StylePropertyValue] to given type.\n *\n * Throws exception if couldn't convert or type doesn't match.\n */\ninline fun <reified T> StylePropertyValue.unwrap(): T = unwrap(T::class.java)\n\n/**\n * Extension function for [StylePropertyValue] to unwrap [StylePropertyValue] to given type.\n *\n * Throws exception if couldn't convert or type doesn't match.\n *\n * @param clazz the class to unwrap to.\n */\nfun <T> StylePropertyValue.unwrap(clazz: Class<T>): T {\n  when (this.kind) {\n    StylePropertyValueKind.CONSTANT -> {\n      return this.value.unwrapToTyped(clazz)\n    }\n    StylePropertyValueKind.TRANSITION -> {\n      val unwrappedTransition = this.value.unwrapToStyleTransition()\n      @Suppress(\"UNCHECKED_CAST\")\n      if (clazz.isInstance(unwrappedTransition)) {\n        return unwrappedTransition as T\n      } else {\n        throw IllegalArgumentException(\"Requested type ${clazz.simpleName} doesn't match ${unwrappedTransition::class.java.simpleName}\")\n      }\n    }\n    StylePropertyValueKind.EXPRESSION -> {\n      val unwrappedExpression = this.value.unwrapToExpression()\n      if (clazz.isInstance(unwrappedExpression)) {\n        @Suppress(\"UNCHECKED_CAST\")\n        return unwrappedExpression as T\n      } else {\n        throw IllegalArgumentException(\"Requested type ${clazz.simpleName} doesn't match ${unwrappedExpression::class.java.simpleName}\")\n      }\n    }\n    StylePropertyValueKind.UNDEFINED -> {\n      throw IllegalArgumentException(\"Property is undefined\")\n    }\n    else -> throw UnsupportedOperationException(\"parsing ${this.kind} is not supported yet\")\n  }\n}\n\n/**\n * Extension function for [StylePropertyValue] to unwrap [StylePropertyValue] to an [Expression].\n *\n * Throws exception if couldn't convert.\n *\n * @throws UnsupportedOperationException if type can't be wrapped to an Expression.\n */\ninternal fun StylePropertyValue.unwrapToExpressionOrLiteralExpression(): Expression =\n  when (this.kind) {\n    StylePropertyValueKind.CONSTANT -> this.value.unwrapToLiteralExpression()\n    StylePropertyValueKind.EXPRESSION -> this.value.unwrapToExpression()\n    // Only CONSTANT and EXPRESSION can be unwrapped to Expression the rest throw exception\n    else -> throw UnsupportedOperationException(\"parsing [${this.kind}] as an expression is not supported\")\n  }\n\n/**\n * Extension function for [StylePropertyValue] to silently unwrap [StylePropertyValue] to given type.\n *\n * Returns null if couldn't convert or type doesn't match.\n */\ninline fun <reified T> StylePropertyValue.silentUnwrap(): T? {\n  return try {\n    this.unwrap(T::class.java)\n  } catch (e: RuntimeException) {\n    null\n  }\n}\n\n/**\n * Extension function for [Feature] to convert [Feature] to [Value].\n */\nfun Feature.toValue(): Value {\n  return TypeUtils.wrapToValue(this.toJson())\n}\n\n/**\n * Extension function for [FeatureCollection] to convert [FeatureCollection] to [Value].\n */\nfun FeatureCollection.toValue(): Value {\n  return TypeUtils.wrapToValue(this.toJson())\n}\n\n/**\n * Extension function for [Geometry] to convert [Geometry] to [Value].\n */\nfun Geometry.toValue(): Value {\n  return TypeUtils.wrapToValue(this.toJson())\n}\n\n/**\n * DSL builder function to create [TransitionOptions] object.\n */\ninline fun transition(block: TransitionOptions.Builder.() -> Unit): TransitionOptions =\n  TransitionOptions.Builder().apply(block).build()"
  },
  {
    "path": "extension-style/src/test/java/android/util/Log.java",
    "content": "package android.util;\n\npublic class Log {\n    public static int d(String tag, String msg) {\n        System.out.println(\"DEBUG: \" + tag + \": \" + msg);\n        return 0;\n    }\n\n    public static int i(String tag, String msg) {\n        System.out.println(\"INFO: \" + tag + \": \" + msg);\n        return 0;\n    }\n\n    public static int w(String tag, String msg) {\n        System.out.println(\"WARN: \" + tag + \": \" + msg);\n        return 0;\n    }\n\n    public static int e(String tag, String msg) {\n        System.out.println(\"ERROR: \" + tag + \": \" + msg);\n        return 0;\n    }\n}\n"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/EqualsHashCodeTest.kt",
    "content": "package com.mapbox.maps.extension.style\n\nimport com.mapbox.maps.extension.style.sources.generated.RasterArraySource\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport nl.jqno.equalsverifier.EqualsVerifier\nimport org.junit.Test\n\nclass EqualsHashCodeTest {\n\n  @Test\n  fun `StyleTransition hashCode and equals test`() {\n    val clazz = StyleTransition::class.java\n    EqualsVerifier.forClass(clazz)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `RasterDataLayer hashCode and equals test`() {\n    val clazz = RasterArraySource.RasterDataLayer::class.java\n    EqualsVerifier.forClass(clazz)\n      .usingGetClass()\n      .verify()\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/ShadowStyleManager.java",
    "content": "package com.mapbox.maps.extension.style;\n\nimport androidx.annotation.NonNull;\n\nimport com.mapbox.bindgen.Value;\nimport com.mapbox.maps.StyleManager;\nimport com.mapbox.maps.StylePropertyValue;\nimport com.mapbox.maps.StylePropertyValueKind;\n\nimport org.robolectric.annotation.Implementation;\nimport org.robolectric.annotation.Implements;\n\n/**\n * To avoid calling native method of StyleManager, this shadow StyleManager\n * will be used for the Robolectric unit tests.\n */\n@Implements(StyleManager.class)\npublic class ShadowStyleManager {\n\n  /**\n   * @param layerType Style layer type.\n   * @param property  Style layer property name.\n   * @return The default value of \\p property for the layers with type \\p layerType.\n   * @brief Gets the default value of style layer \\p property.\n   */\n  @Implementation\n  public static @NonNull\n  StylePropertyValue getStyleLayerPropertyDefaultValue(@NonNull String layerType, @NonNull String property) {\n    return new StylePropertyValue(Value.valueOf(0), StylePropertyValueKind.CONSTANT);\n  }\n\n\n  /**\n   * @param sourceType Style source type.\n   * @param property   Style source property name.\n   * @return The default value of \\p property for the sources with type \\p sourceType.\n   * @brief Gets the default value of style source \\p property.\n   */\n  @Implementation\n  public static @NonNull\n  StylePropertyValue getStyleSourcePropertyDefaultValue(@NonNull String sourceType, @NonNull String property) {\n    return new StylePropertyValue(Value.valueOf(0), StylePropertyValueKind.CONSTANT);\n  }\n}\n"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/atmosphere/generated/AtmosphereTest.kt",
    "content": "// This file is generated.\npackage com.mapbox.maps.extension.style.atmosphere.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass AtmosphereTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleAtmosphereProperty(any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleAtmosphereProperty(any(), any()) } returns expected\n    every { style.setStyleAtmosphere(any()) } returns expected\n    every { expected.error } returns null\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun colorAsColorIntSet() {\n    val atmosphere = atmosphere {\n      color(Color.CYAN)\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertEquals(\"{color=[rgba, 0, 255, 255, 1.0]}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun colorAsColorIntSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.color(Color.CYAN)\n    verify { style.setStyleAtmosphereProperty(\"color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun colorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(Color.RED, atmosphere.colorAsColorInt!!)\n    verify { style.getStyleAtmosphereProperty(\"color\") }\n  }\n\n  @Test\n  fun colorSet() {\n    val atmosphere = atmosphere {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.color(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleAtmosphereProperty(\"color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), atmosphere.color!!.toString())\n    verify { style.getStyleAtmosphereProperty(\"color\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun colorUseThemeAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.colorUseThemeAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"color-use-theme\") }\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(expression.toString(), atmosphere.colorUseThemeAsExpression?.toString())\n    verify { style.getStyleAtmosphereProperty(\"color-use-theme\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.colorAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"color\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere {\n      color(expression)\n    }\n    atmosphere.bindTo(style)\n    assertEquals(expression.toString(), atmosphere.colorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", atmosphere.color)\n    assertEquals(Color.BLACK, atmosphere.colorAsColorInt)\n    verify { style.getStyleAtmosphereProperty(\"color\") }\n  }\n\n  @Test\n  fun colorUseThemeSet() {\n    val atmosphere = atmosphere { }\n    val theme = \"none\"\n    atmosphere.bindTo(style)\n    atmosphere.colorUseTheme(theme)\n    verify { style.setStyleAtmosphereProperty(\"color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun colorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(theme.toString(), atmosphere.colorUseTheme?.toString())\n    verify { style.getStyleAtmosphereProperty(\"color-use-theme\") }\n  }\n\n  @Test\n  fun colorTransitionSet() {\n    val atmosphere = atmosphere {\n      colorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.colorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleAtmosphereProperty(\"color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(transition.toValue().toString(), atmosphere.colorTransition!!.toValue().toString())\n    verify { style.getStyleAtmosphereProperty(\"color-transition\") }\n  }\n\n  @Test\n  fun colorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.colorTransition)\n    verify { style.getStyleAtmosphereProperty(\"color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun colorTransitionGetException() {\n    val atmosphere = atmosphere {}\n    atmosphere.colorTransition\n  }\n\n  @Test\n  fun colorTransitionSetDsl() {\n    val atmosphere = atmosphere {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun highColorAsColorIntSet() {\n    val atmosphere = atmosphere {\n      highColor(Color.CYAN)\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertEquals(\"{high-color=[rgba, 0, 255, 255, 1.0]}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun highColorAsColorIntSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.highColor(Color.CYAN)\n    verify { style.setStyleAtmosphereProperty(\"high-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun highColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(Color.RED, atmosphere.highColorAsColorInt!!)\n    verify { style.getStyleAtmosphereProperty(\"high-color\") }\n  }\n\n  @Test\n  fun highColorSet() {\n    val atmosphere = atmosphere {\n      highColor(\"rgba(0, 0, 0, 1)\")\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"high-color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun highColorSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.highColor(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleAtmosphereProperty(\"high-color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun highColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), atmosphere.highColor!!.toString())\n    verify { style.getStyleAtmosphereProperty(\"high-color\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun highColorUseThemeAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.highColorUseThemeAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"high-color-use-theme\") }\n  }\n\n  @Test\n  fun highColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(expression.toString(), atmosphere.highColorUseThemeAsExpression?.toString())\n    verify { style.getStyleAtmosphereProperty(\"high-color-use-theme\") }\n  }\n\n  @Test\n  fun highColorAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.highColorAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"high-color\") }\n  }\n\n  @Test\n  fun highColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere {\n      highColor(expression)\n    }\n    atmosphere.bindTo(style)\n    assertEquals(expression.toString(), atmosphere.highColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", atmosphere.highColor)\n    assertEquals(Color.BLACK, atmosphere.highColorAsColorInt)\n    verify { style.getStyleAtmosphereProperty(\"high-color\") }\n  }\n\n  @Test\n  fun highColorUseThemeSet() {\n    val atmosphere = atmosphere { }\n    val theme = \"none\"\n    atmosphere.bindTo(style)\n    atmosphere.highColorUseTheme(theme)\n    verify { style.setStyleAtmosphereProperty(\"high-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun highColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(theme.toString(), atmosphere.highColorUseTheme?.toString())\n    verify { style.getStyleAtmosphereProperty(\"high-color-use-theme\") }\n  }\n\n  @Test\n  fun highColorTransitionSet() {\n    val atmosphere = atmosphere {\n      highColorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"high-color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun highColorTransitionSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.highColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleAtmosphereProperty(\"high-color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun highColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(transition.toValue().toString(), atmosphere.highColorTransition!!.toValue().toString())\n    verify { style.getStyleAtmosphereProperty(\"high-color-transition\") }\n  }\n\n  @Test\n  fun highColorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.highColorTransition)\n    verify { style.getStyleAtmosphereProperty(\"high-color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun highColorTransitionGetException() {\n    val atmosphere = atmosphere {}\n    atmosphere.highColorTransition\n  }\n\n  @Test\n  fun highColorTransitionSetDsl() {\n    val atmosphere = atmosphere {\n      highColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"high-color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun horizonBlendSet() {\n    val atmosphere = atmosphere {\n      horizonBlend(1.0)\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"horizon-blend=1.0\"))\n  }\n\n  @Test\n  fun horizonBlendSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.horizonBlend(1.0)\n    verify { style.setStyleAtmosphereProperty(\"horizon-blend\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun horizonBlendGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(1.0.toString(), atmosphere.horizonBlend!!.toString())\n    verify { style.getStyleAtmosphereProperty(\"horizon-blend\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun horizonBlendAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.horizonBlendAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"horizon-blend\") }\n  }\n\n  @Test\n  fun horizonBlendAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(1.0, atmosphere.horizonBlendAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, atmosphere.horizonBlend!!, 1E-5)\n    verify { style.getStyleAtmosphereProperty(\"horizon-blend\") }\n  }\n\n  @Test\n  fun horizonBlendTransitionSet() {\n    val atmosphere = atmosphere {\n      horizonBlendTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"horizon-blend-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun horizonBlendTransitionSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.horizonBlendTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleAtmosphereProperty(\"horizon-blend-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun horizonBlendTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(transition.toValue().toString(), atmosphere.horizonBlendTransition!!.toValue().toString())\n    verify { style.getStyleAtmosphereProperty(\"horizon-blend-transition\") }\n  }\n\n  @Test\n  fun horizonBlendTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.horizonBlendTransition)\n    verify { style.getStyleAtmosphereProperty(\"horizon-blend-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun horizonBlendTransitionGetException() {\n    val atmosphere = atmosphere {}\n    atmosphere.horizonBlendTransition\n  }\n\n  @Test\n  fun horizonBlendTransitionSetDsl() {\n    val atmosphere = atmosphere {\n      horizonBlendTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"horizon-blend-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun rangeSet() {\n    val atmosphere = atmosphere {\n      range(listOf(0.0, 1.0))\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"range=[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun rangeSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.range(listOf(0.0, 1.0))\n    verify { style.setStyleAtmosphereProperty(\"range\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun rangeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(listOf(0.0, 1.0).toString(), atmosphere.range!!.toString())\n    verify { style.getStyleAtmosphereProperty(\"range\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun rangeAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.rangeAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"range\") }\n  }\n\n  @Test\n  fun rangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", atmosphere.rangeAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), atmosphere.range)\n    verify { style.getStyleAtmosphereProperty(\"range\") }\n  }\n\n  @Test\n  fun rangeTransitionSet() {\n    val atmosphere = atmosphere {\n      rangeTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"range-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun rangeTransitionSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.rangeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleAtmosphereProperty(\"range-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun rangeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(transition.toValue().toString(), atmosphere.rangeTransition!!.toValue().toString())\n    verify { style.getStyleAtmosphereProperty(\"range-transition\") }\n  }\n\n  @Test\n  fun rangeTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.rangeTransition)\n    verify { style.getStyleAtmosphereProperty(\"range-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun rangeTransitionGetException() {\n    val atmosphere = atmosphere {}\n    atmosphere.rangeTransition\n  }\n\n  @Test\n  fun rangeTransitionSetDsl() {\n    val atmosphere = atmosphere {\n      rangeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"range-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun spaceColorAsColorIntSet() {\n    val atmosphere = atmosphere {\n      spaceColor(Color.CYAN)\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertEquals(\"{space-color=[rgba, 0, 255, 255, 1.0]}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun spaceColorAsColorIntSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.spaceColor(Color.CYAN)\n    verify { style.setStyleAtmosphereProperty(\"space-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun spaceColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(Color.RED, atmosphere.spaceColorAsColorInt!!)\n    verify { style.getStyleAtmosphereProperty(\"space-color\") }\n  }\n\n  @Test\n  fun spaceColorSet() {\n    val atmosphere = atmosphere {\n      spaceColor(\"rgba(0, 0, 0, 1)\")\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"space-color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun spaceColorSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.spaceColor(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleAtmosphereProperty(\"space-color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun spaceColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), atmosphere.spaceColor!!.toString())\n    verify { style.getStyleAtmosphereProperty(\"space-color\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun spaceColorUseThemeAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.spaceColorUseThemeAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"space-color-use-theme\") }\n  }\n\n  @Test\n  fun spaceColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(expression.toString(), atmosphere.spaceColorUseThemeAsExpression?.toString())\n    verify { style.getStyleAtmosphereProperty(\"space-color-use-theme\") }\n  }\n\n  @Test\n  fun spaceColorAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.spaceColorAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"space-color\") }\n  }\n\n  @Test\n  fun spaceColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val atmosphere = atmosphere {\n      spaceColor(expression)\n    }\n    atmosphere.bindTo(style)\n    assertEquals(expression.toString(), atmosphere.spaceColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", atmosphere.spaceColor)\n    assertEquals(Color.BLACK, atmosphere.spaceColorAsColorInt)\n    verify { style.getStyleAtmosphereProperty(\"space-color\") }\n  }\n\n  @Test\n  fun spaceColorUseThemeSet() {\n    val atmosphere = atmosphere { }\n    val theme = \"none\"\n    atmosphere.bindTo(style)\n    atmosphere.spaceColorUseTheme(theme)\n    verify { style.setStyleAtmosphereProperty(\"space-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun spaceColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(theme.toString(), atmosphere.spaceColorUseTheme?.toString())\n    verify { style.getStyleAtmosphereProperty(\"space-color-use-theme\") }\n  }\n\n  @Test\n  fun spaceColorTransitionSet() {\n    val atmosphere = atmosphere {\n      spaceColorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"space-color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun spaceColorTransitionSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.spaceColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleAtmosphereProperty(\"space-color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun spaceColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(transition.toValue().toString(), atmosphere.spaceColorTransition!!.toValue().toString())\n    verify { style.getStyleAtmosphereProperty(\"space-color-transition\") }\n  }\n\n  @Test\n  fun spaceColorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.spaceColorTransition)\n    verify { style.getStyleAtmosphereProperty(\"space-color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun spaceColorTransitionGetException() {\n    val atmosphere = atmosphere {}\n    atmosphere.spaceColorTransition\n  }\n\n  @Test\n  fun spaceColorTransitionSetDsl() {\n    val atmosphere = atmosphere {\n      spaceColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"space-color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun starIntensitySet() {\n    val atmosphere = atmosphere {\n      starIntensity(1.0)\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"star-intensity=1.0\"))\n  }\n\n  @Test\n  fun starIntensitySetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.starIntensity(1.0)\n    verify { style.setStyleAtmosphereProperty(\"star-intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun starIntensityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(1.0.toString(), atmosphere.starIntensity!!.toString())\n    verify { style.getStyleAtmosphereProperty(\"star-intensity\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun starIntensityAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.starIntensityAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"star-intensity\") }\n  }\n\n  @Test\n  fun starIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(1.0, atmosphere.starIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, atmosphere.starIntensity!!, 1E-5)\n    verify { style.getStyleAtmosphereProperty(\"star-intensity\") }\n  }\n\n  @Test\n  fun starIntensityTransitionSet() {\n    val atmosphere = atmosphere {\n      starIntensityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"star-intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun starIntensityTransitionSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.starIntensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleAtmosphereProperty(\"star-intensity-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun starIntensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(transition.toValue().toString(), atmosphere.starIntensityTransition!!.toValue().toString())\n    verify { style.getStyleAtmosphereProperty(\"star-intensity-transition\") }\n  }\n\n  @Test\n  fun starIntensityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.starIntensityTransition)\n    verify { style.getStyleAtmosphereProperty(\"star-intensity-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun starIntensityTransitionGetException() {\n    val atmosphere = atmosphere {}\n    atmosphere.starIntensityTransition\n  }\n\n  @Test\n  fun starIntensityTransitionSetDsl() {\n    val atmosphere = atmosphere {\n      starIntensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"star-intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun verticalRangeSet() {\n    val atmosphere = atmosphere {\n      verticalRange(listOf(0.0, 1.0))\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vertical-range=[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun verticalRangeSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.verticalRange(listOf(0.0, 1.0))\n    verify { style.setStyleAtmosphereProperty(\"vertical-range\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun verticalRangeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(listOf(0.0, 1.0).toString(), atmosphere.verticalRange!!.toString())\n    verify { style.getStyleAtmosphereProperty(\"vertical-range\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun verticalRangeAsExpressionGetNull() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.verticalRangeAsExpression)\n    verify { style.getStyleAtmosphereProperty(\"vertical-range\") }\n  }\n\n  @Test\n  fun verticalRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", atmosphere.verticalRangeAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), atmosphere.verticalRange)\n    verify { style.getStyleAtmosphereProperty(\"vertical-range\") }\n  }\n\n  @Test\n  fun verticalRangeTransitionSet() {\n    val atmosphere = atmosphere {\n      verticalRangeTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vertical-range-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun verticalRangeTransitionSetAfterInitialization() {\n    val atmosphere = atmosphere { }\n    atmosphere.bindTo(style)\n    atmosphere.verticalRangeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleAtmosphereProperty(\"vertical-range-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun verticalRangeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(transition.toValue().toString(), atmosphere.verticalRangeTransition!!.toValue().toString())\n    verify { style.getStyleAtmosphereProperty(\"vertical-range-transition\") }\n  }\n\n  @Test\n  fun verticalRangeTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val atmosphere = atmosphere {}\n    atmosphere.bindTo(style)\n    assertEquals(null, atmosphere.verticalRangeTransition)\n    verify { style.getStyleAtmosphereProperty(\"vertical-range-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun verticalRangeTransitionGetException() {\n    val atmosphere = atmosphere {}\n    atmosphere.verticalRangeTransition\n  }\n\n  @Test\n  fun verticalRangeTransitionSetDsl() {\n    val atmosphere = atmosphere {\n      verticalRangeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    atmosphere.bindTo(style)\n    verify { style.setStyleAtmosphere(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vertical-range-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun getAtmosphereTest() {\n    assertNotNull(style.getAtmosphere())\n    verify(exactly = 0) { style.setStyleAtmosphere(any()) }\n  }\n\n  @Test\n  fun removeAtmosphereTest() {\n    style.removeAtmosphere()\n    verify { style.setStyleAtmosphere(Value.nullValue()) }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/expressions/LiteralExpressionTest.kt",
    "content": "package com.mapbox.maps.extension.style.expressions\n\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.match\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.sum\nimport org.junit.Assert.*\nimport org.junit.Test\n\nclass LiteralExpressionTest {\n  @Test\n  fun literal_get_double() {\n    val expression = literal(1.0)\n    assertTrue(expression.isLiteral())\n    assertEquals(expression.getLiteral<Double>()!!, 1.0, 1E-10)\n  }\n\n  @Test\n  fun literal_get_doubleList() {\n    val expression = literal(listOf(1.0, 2.0, 3.0))\n    assertTrue(expression.isLiteral())\n    assertEquals(listOf(1.0, 2.0, 3.0), expression.getLiteral()!!)\n  }\n\n  @Test\n  fun literal_get_long() {\n    val expression = literal(123L)\n    assertTrue(expression.isLiteral())\n    assertEquals(123L, expression.getLiteral()!!)\n  }\n\n  @Test\n  fun literal_get_longList() {\n    val expression = literal(listOf(1L, 2L, 3L))\n    assertTrue(expression.isLiteral())\n    assertEquals(listOf(1L, 2L, 3L), expression.getLiteral()!!)\n  }\n\n  @Test\n  fun literal_get_boolean() {\n    val expression = literal(true)\n    assertTrue(expression.isLiteral())\n    assertEquals(true, expression.getLiteral()!!)\n  }\n\n  @Test\n  fun literal_get_booleanList() {\n    val expression = literal(listOf(true, true, false))\n    assertTrue(expression.isLiteral())\n    assertEquals(listOf(true, true, false), expression.getLiteral()!!)\n  }\n\n  @Test\n  fun literal_get_string() {\n    val expression = literal(\"abc\")\n    assertTrue(expression.isLiteral())\n    assertEquals(\"abc\", expression.getLiteral()!!)\n  }\n\n  @Test\n  fun literal_get_stringList() {\n    val expression = literal(listOf(\"abc\", \"def\"))\n    assertTrue(expression.isLiteral())\n    assertEquals(listOf(\"abc\", \"def\"), expression.getLiteral()!!)\n  }\n\n  @Test\n  fun literal_NotLiteral() {\n    val expression = sum {\n      literal(12)\n      literal(34)\n    }\n    assertFalse(expression.isLiteral())\n    assertNull(expression.getLiteral())\n  }\n\n  @Test\n  fun literal_inside_match_expression() {\n    val expression = match {\n      get {\n        literal(\"ethnicity\")\n      }\n      literal(listOf(\"white\", \"Black\", \"Hispanic\", \"Asian\"))\n      rgb(251.0, 176.0, 59.0)\n      literal(\"Other\")\n      rgb(204.0, 204.0, 204.0)\n      rgb(0.0, 0.0, 0.0)\n    }\n    assertEquals(\n      \"\"\"\n      [\"match\",[\"get\",\"ethnicity\"],[\"white\",\"Black\",\"Hispanic\",\"Asian\"],[\"rgb\",251.0,176.0,59.0],\"Other\",[\"rgb\",204.0,204.0,204.0],[\"rgb\",0.0,0.0,0.0]]\n      \"\"\".trimIndent(),\n      expression.toJson()\n    )\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/expressions/generated/ExpressionTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.expressions.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.expressions.types.FormatSection\nimport io.mockk.every\nimport io.mockk.mockkStatic\nimport io.mockk.verify\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport java.util.*\n\n@RunWith(RobolectricTestRunner::class)\nclass ExpressionTest {\n\n  @Before\n  fun prepareTest() {\n    val map = HashMap<String, Value>()\n    map[\"type\"] = Value(\"Polygon\")\n    map[\"coordinates\"] = Value(listOf(Value(30), Value(30)))\n    mockkStatic(Value::class)\n    every { Value.fromJson(any()) } returns ExpectedFactory.createValue<String, Value>(Value(map))\n  }\n\n  @Test\n  fun dsl_expression_subtract() {\n    val expression = subtract {\n      // test builder function\n      subtract {}\n    }\n    assertEquals(\"assert - expression\", \"[-, [-]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_subtract() {\n    val expression = Expression.subtract(Expression.literal(\"abc\"))\n    assertEquals(\"assert - expression\", \"[-, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_not() {\n    val expression = not {\n      // test builder function\n      not {}\n    }\n    assertEquals(\"assert ! expression\", \"[!, [!]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_not() {\n    val expression = Expression.not(Expression.literal(\"abc\"))\n    assertEquals(\"assert ! expression\", \"[!, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_neq() {\n    val expression = neq {\n      // test builder function\n      neq {}\n    }\n    assertEquals(\"assert != expression\", \"[!=, [!=]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_neq() {\n    val expression = Expression.neq(Expression.literal(\"abc\"))\n    assertEquals(\"assert != expression\", \"[!=, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_product() {\n    val expression = product {\n      // test builder function\n      product {}\n    }\n    assertEquals(\"assert * expression\", \"[*, [*]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_product() {\n    val expression = Expression.product(Expression.literal(\"abc\"))\n    assertEquals(\"assert * expression\", \"[*, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_division() {\n    val expression = division {\n      // test builder function\n      division {}\n    }\n    assertEquals(\"assert / expression\", \"[/, [/]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_division() {\n    val expression = Expression.division(Expression.literal(\"abc\"))\n    assertEquals(\"assert / expression\", \"[/, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_mod() {\n    val expression = mod {\n      // test builder function\n      mod {}\n    }\n    assertEquals(\"assert % expression\", \"[%, [%]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_mod() {\n    val expression = Expression.mod(Expression.literal(\"abc\"))\n    assertEquals(\"assert % expression\", \"[%, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_pow() {\n    val expression = pow {\n      // test builder function\n      pow {}\n    }\n    assertEquals(\"assert ^ expression\", \"[^, [^]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_pow() {\n    val expression = Expression.pow(Expression.literal(\"abc\"))\n    assertEquals(\"assert ^ expression\", \"[^, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_sum() {\n    val expression = sum {\n      // test builder function\n      sum {}\n    }\n    assertEquals(\"assert + expression\", \"[+, [+]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_sum() {\n    val expression = Expression.sum(Expression.literal(\"abc\"))\n    assertEquals(\"assert + expression\", \"[+, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_lt() {\n    val expression = lt {\n      // test builder function\n      lt {}\n    }\n    assertEquals(\"assert < expression\", \"[<, [<]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_lt() {\n    val expression = Expression.lt(Expression.literal(\"abc\"))\n    assertEquals(\"assert < expression\", \"[<, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_lte() {\n    val expression = lte {\n      // test builder function\n      lte {}\n    }\n    assertEquals(\"assert <= expression\", \"[<=, [<=]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_lte() {\n    val expression = Expression.lte(Expression.literal(\"abc\"))\n    assertEquals(\"assert <= expression\", \"[<=, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_eq() {\n    val expression = eq {\n      // test builder function\n      eq {}\n    }\n    assertEquals(\"assert == expression\", \"[==, [==]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_eq() {\n    val expression = Expression.eq(Expression.literal(\"abc\"))\n    assertEquals(\"assert == expression\", \"[==, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_gt() {\n    val expression = gt {\n      // test builder function\n      gt {}\n    }\n    assertEquals(\"assert > expression\", \"[>, [>]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_gt() {\n    val expression = Expression.gt(Expression.literal(\"abc\"))\n    assertEquals(\"assert > expression\", \"[>, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_gte() {\n    val expression = gte {\n      // test builder function\n      gte {}\n    }\n    assertEquals(\"assert >= expression\", \"[>=, [>=]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_gte() {\n    val expression = Expression.gte(Expression.literal(\"abc\"))\n    assertEquals(\"assert >= expression\", \"[>=, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_abs() {\n    val expression = abs {\n      // test builder function\n      abs {}\n    }\n    assertEquals(\"assert abs expression\", \"[abs, [abs]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_abs() {\n    val expression = Expression.abs(Expression.literal(\"abc\"))\n    assertEquals(\"assert abs expression\", \"[abs, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_accumulated() {\n    val expression = accumulated()\n    assertEquals(\"assert accumulated expression\", \"[accumulated]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_acos() {\n    val expression = acos {\n      // test builder function\n      acos {}\n    }\n    assertEquals(\"assert acos expression\", \"[acos, [acos]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_acos() {\n    val expression = Expression.acos(Expression.literal(\"abc\"))\n    assertEquals(\"assert acos expression\", \"[acos, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_activeAnchor() {\n    val expression = activeAnchor()\n    assertEquals(\"assert active-anchor expression\", \"[active-anchor]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_all() {\n    val expression = all {\n      // test builder function\n      all {}\n    }\n    assertEquals(\"assert all expression\", \"[all, [all]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_all() {\n    val expression = Expression.all(Expression.literal(\"abc\"))\n    assertEquals(\"assert all expression\", \"[all, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_any() {\n    val expression = any {\n      // test builder function\n      any {}\n    }\n    assertEquals(\"assert any expression\", \"[any, [any]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_any() {\n    val expression = Expression.any(Expression.literal(\"abc\"))\n    assertEquals(\"assert any expression\", \"[any, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_array() {\n    val expression = array {\n      // test builder function\n      array {}\n    }\n    assertEquals(\"assert array expression\", \"[array, [array]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_array() {\n    val expression = Expression.array(Expression.literal(\"abc\"))\n    assertEquals(\"assert array expression\", \"[array, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_asin() {\n    val expression = asin {\n      // test builder function\n      asin {}\n    }\n    assertEquals(\"assert asin expression\", \"[asin, [asin]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_asin() {\n    val expression = Expression.asin(Expression.literal(\"abc\"))\n    assertEquals(\"assert asin expression\", \"[asin, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_at() {\n    val expression = at {\n      // test builder function\n      at {}\n    }\n    assertEquals(\"assert at expression\", \"[at, [at]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_at() {\n    val expression = Expression.at(Expression.literal(\"abc\"))\n    assertEquals(\"assert at expression\", \"[at, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_atInterpolated_exponential() {\n    val expression = atInterpolated {\n      exponential {\n        literal(0.5)\n      }\n      zoom()\n      stop {\n        literal(1.0)\n        color(Color.RED)\n      }\n      stop {\n        literal(5.0)\n        color(Color.BLUE)\n      }\n      stop {\n        literal(10.0)\n        color(Color.GREEN)\n      }\n    }\n    assertEquals(\"assert at-interpolated expression\", \"[at-interpolated, [exponential, 0.5], [zoom], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 5.0, [rgba, 0.0, 0.0, 255.0, 1.0], 10.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_atInterpolated_cubicBezier() {\n    val expression = atInterpolated {\n      cubicBezier {\n        literal(0.42)\n        literal(0.0)\n        literal(1.0)\n        literal(1.0)\n      }\n      zoom()\n      stop {\n        literal(1.0)\n        color(Color.RED)\n      }\n      stop {\n        literal(5.0)\n        color(Color.BLUE)\n      }\n      stop {\n        literal(10.0)\n        color(Color.GREEN)\n      }\n    }\n    assertEquals(\"assert at-interpolated expression\", \"[at-interpolated, [cubic-bezier, 0.42, 0.0, 1.0, 1.0], [zoom], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 5.0, [rgba, 0.0, 0.0, 255.0, 1.0], 10.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\", expression.toString())\n  }\n\n  @Test\n  fun dls_expression_atInterpolated_linear() {\n    val expression = atInterpolated {\n      linear()\n      zoom()\n      stop {\n        literal(12)\n        step {\n          get { literal(\"stroke-width\") }\n          color(Color.BLACK)\n          stop {\n            literal(1.0)\n            color(Color.RED)\n          }\n          stop {\n            literal(2.0)\n            color(Color.WHITE)\n          }\n          stop {\n            literal(3.0)\n            color(Color.BLUE)\n          }\n        }\n      }\n      stop {\n        literal(15)\n        step {\n          get { literal(\"stroke-width\") }\n          color(Color.BLACK)\n          stop {\n            literal(1.0)\n            color(Color.YELLOW)\n          }\n          stop {\n            literal(2.0)\n            color(Color.LTGRAY)\n          }\n          stop {\n            literal(3.0)\n            color(Color.BLUE)\n          }\n        }\n      }\n      stop {\n        literal(18)\n        step {\n          get { literal(\"stroke-width\") }\n          color(Color.BLACK)\n          stop {\n            literal(1.0)\n            color(Color.WHITE)\n          }\n          stop {\n            literal(2.0)\n            color(Color.GRAY)\n          }\n          stop {\n            literal(3.0)\n            color(Color.GREEN)\n          }\n        }\n      }\n    }\n    assertEquals(\"assert at-interpolated expression\", \"[at-interpolated, [linear], [zoom], 12, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 2.0, [rgba, 255.0, 255.0, 255.0, 1.0], 3.0, [rgba, 0.0, 0.0, 255.0, 1.0]], 15, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 255.0, 0.0, 1.0], 2.0, [rgba, 204.0, 204.0, 204.0, 1.0], 3.0, [rgba, 0.0, 0.0, 255.0, 1.0]], 18, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 255.0, 255.0, 1.0], 2.0, [rgba, 136.0, 136.0, 136.0, 1.0], 3.0, [rgba, 0.0, 255.0, 0.0, 1.0]]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_atInterpolated_exponential() {\n    val expression = Expression.atInterpolated(\n      Expression.exponential(literal(0.5)),\n      Expression.zoom(),\n      Expression.literal(1.0),\n      Expression.color(Color.RED),\n      Expression.literal(5.0),\n      Expression.color(Color.BLUE),\n      Expression.literal(10.0),\n      Expression.color(Color.GREEN)\n    )\n    assertEquals(\"assert at-interpolated expression\", \"[at-interpolated, [exponential, 0.5], [zoom], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 5.0, [rgba, 0.0, 0.0, 255.0, 1.0], 10.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_atInterpolated_cubicBezier() {\n    val expression = Expression.atInterpolated(\n      Expression.cubicBezier(\n        Expression.literal(0.42),\n        Expression.literal(0.0),\n        Expression.literal(1.0),\n        Expression.literal(1.0)\n      ),\n      Expression.zoom(),\n      Expression.literal(1.0),\n      Expression.color(Color.RED),\n      Expression.literal(5.0),\n      Expression.color(Color.BLUE),\n      Expression.literal(10.0),\n      Expression.color(Color.GREEN)\n    )\n    assertEquals(\"assert at-interpolated expression\", \"[at-interpolated, [cubic-bezier, 0.42, 0.0, 1.0, 1.0], [zoom], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 5.0, [rgba, 0.0, 0.0, 255.0, 1.0], 10.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_atInterpolated_linear() {\n    val expression = Expression.atInterpolated(\n      Expression.linear(),\n      Expression.zoom(),\n      Expression.literal(12),\n      Expression.step(\n        Expression.get(Expression.literal(\"stroke-width\")),\n        Expression.color(Color.BLACK),\n        Expression.literal(1.0),\n        Expression.color(Color.RED),\n        Expression.literal(2.0),\n        Expression.color(Color.WHITE),\n        Expression.literal(3.0),\n        Expression.color(Color.BLUE)\n      ),\n      Expression.literal(15),\n      Expression.step(\n        Expression.get(Expression.literal(\"stroke-width\")),\n        Expression.color(Color.BLACK),\n        Expression.literal(1.0),\n        Expression.color(Color.YELLOW),\n        Expression.literal(2.0),\n        Expression.color(Color.LTGRAY),\n        Expression.literal(3.0),\n        Expression.color(Color.BLUE)\n      ),\n      Expression.literal(18),\n      Expression.step(\n        Expression.get(Expression.literal(\"stroke-width\")),\n        Expression.color(Color.BLACK),\n        Expression.literal(1.0),\n        Expression.color(Color.WHITE),\n        Expression.literal(2.0),\n        Expression.color(Color.GRAY),\n        Expression.literal(3.0),\n        Expression.color(Color.GREEN)\n      )\n    )\n    assertEquals(\"assert at-interpolated expression\", \"[at-interpolated, [linear], [zoom], 12, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 2.0, [rgba, 255.0, 255.0, 255.0, 1.0], 3.0, [rgba, 0.0, 0.0, 255.0, 1.0]], 15, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 255.0, 0.0, 1.0], 2.0, [rgba, 204.0, 204.0, 204.0, 1.0], 3.0, [rgba, 0.0, 0.0, 255.0, 1.0]], 18, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 255.0, 255.0, 1.0], 2.0, [rgba, 136.0, 136.0, 136.0, 1.0], 3.0, [rgba, 0.0, 255.0, 0.0, 1.0]]]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_atan() {\n    val expression = atan {\n      // test builder function\n      atan {}\n    }\n    assertEquals(\"assert atan expression\", \"[atan, [atan]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_atan() {\n    val expression = Expression.atan(Expression.literal(\"abc\"))\n    assertEquals(\"assert atan expression\", \"[atan, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_boolean() {\n    val expression = boolean {\n      // test builder function\n      boolean {}\n    }\n    assertEquals(\"assert boolean expression\", \"[boolean, [boolean]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_boolean() {\n    val expression = Expression.boolean(Expression.literal(\"abc\"))\n    assertEquals(\"assert boolean expression\", \"[boolean, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_switchCase() {\n    val expression = switchCase {\n      // test builder function\n      switchCase {}\n    }\n    assertEquals(\"assert case expression\", \"[case, [case]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_switchCase() {\n    val expression = Expression.switchCase(Expression.literal(\"abc\"))\n    assertEquals(\"assert case expression\", \"[case, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_ceil() {\n    val expression = ceil {\n      // test builder function\n      ceil {}\n    }\n    assertEquals(\"assert ceil expression\", \"[ceil, [ceil]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_ceil() {\n    val expression = Expression.ceil(Expression.literal(\"abc\"))\n    assertEquals(\"assert ceil expression\", \"[ceil, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_coalesce() {\n    val expression = coalesce {\n      // test builder function\n      coalesce {}\n    }\n    assertEquals(\"assert coalesce expression\", \"[coalesce, [coalesce]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_coalesce() {\n    val expression = Expression.coalesce(Expression.literal(\"abc\"))\n    assertEquals(\"assert coalesce expression\", \"[coalesce, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_collator() {\n    val expression = collator {\n      caseSensitive(true)\n      diacriticSensitive(true)\n      locale(Locale(\"en-US\"))\n    }\n    assertEquals(\n      \"assert collator expression\",\n      \"[collator, {diacritic-sensitive=true, case-sensitive=true, locale=en-us}]\",\n      expression.toString()\n    )\n  }\n\n  @Test\n  fun expression_collator() {\n    val expression = Expression.collator(\n      caseSensitive = true,\n      diacriticSensitive = true,\n      locale = Locale(\"en-US\")\n    )\n    assertEquals(\n      \"assert collator expression\",\n      \"[collator, {diacritic-sensitive=true, case-sensitive=true, locale=en-us}]\",\n      expression.toString()\n    )\n  }\n\n  @Test\n  fun dsl_expression_concat() {\n    val expression = concat {\n      // test builder function\n      concat {}\n    }\n    assertEquals(\"assert concat expression\", \"[concat, [concat]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_concat() {\n    val expression = Expression.concat(Expression.literal(\"abc\"))\n    assertEquals(\"assert concat expression\", \"[concat, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_config() {\n    val expression = config {\n      // test builder function\n      config {}\n    }\n    assertEquals(\"assert config expression\", \"[config, [config]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_config() {\n    val expression = Expression.config(Expression.literal(\"abc\"))\n    assertEquals(\"assert config expression\", \"[config, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_cos() {\n    val expression = cos {\n      // test builder function\n      cos {}\n    }\n    assertEquals(\"assert cos expression\", \"[cos, [cos]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_cos() {\n    val expression = Expression.cos(Expression.literal(\"abc\"))\n    assertEquals(\"assert cos expression\", \"[cos, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_distance() {\n    val polygon = Polygon.fromJson(\n      \"\"\"\n        {\n            \"type\": \"Polygon\",\n            \"coordinates\": [\n                [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]]\n            ]\n        }\n      \"\"\".trimIndent()\n    )\n    val expression = Expression.distance(polygon)\n    assertEquals(\"assert distance expression\", \"[distance, {coordinates=[30, 30], type=Polygon}]\", expression.toString())\n  }\n\n  @Test\n  fun expression_distanceFromCenter() {\n    val expression = distanceFromCenter()\n    assertEquals(\"assert distance-from-center expression\", \"[distance-from-center]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_downcase() {\n    val expression = downcase {\n      // test builder function\n      downcase {}\n    }\n    assertEquals(\"assert downcase expression\", \"[downcase, [downcase]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_downcase() {\n    val expression = Expression.downcase(Expression.literal(\"abc\"))\n    assertEquals(\"assert downcase expression\", \"[downcase, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_e() {\n    val expression = e()\n    assertEquals(\"assert e expression\", \"[e]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_featureState() {\n    val expression = featureState {\n      // test builder function\n      featureState {}\n    }\n    assertEquals(\"assert feature-state expression\", \"[feature-state, [feature-state]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_featureState() {\n    val expression = Expression.featureState(Expression.literal(\"abc\"))\n    assertEquals(\"assert feature-state expression\", \"[feature-state, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_floor() {\n    val expression = floor {\n      // test builder function\n      floor {}\n    }\n    assertEquals(\"assert floor expression\", \"[floor, [floor]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_floor() {\n    val expression = Expression.floor(Expression.literal(\"abc\"))\n    assertEquals(\"assert floor expression\", \"[floor, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_format() {\n    val expression = format {\n      formatSection(\"test\") {\n        fontScale(1.0)\n        textFont(listOf(\"font1\", \"font2\"))\n        textColor(\"blue\")\n      }\n    }\n    assertEquals(\n      \"assert format expression\",\n      \"[format, test, {text-color=blue, font-scale=1.0, text-font=[literal, [font1, font2]]}]\",\n      expression.toString()\n    )\n  }\n\n  @Test\n  fun expression_format() {\n    val expression = Expression.format(\n      FormatSection(\n        content = literal(\"test\"),\n        fontScale = literal(1.0),\n        textFont = literal(listOf(\"font1\", \"font2\")),\n        textColor = literal(\"blue\")\n      )\n    )\n    assertEquals(\n      \"assert format expression\",\n      \"[format, test, {text-color=blue, font-scale=1.0, text-font=[literal, [font1, font2]]}]\",\n      expression.toString()\n    )\n  }\n\n  @Test\n  fun expression_geometryType() {\n    val expression = geometryType()\n    assertEquals(\"assert geometry-type expression\", \"[geometry-type]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_get() {\n    val expression = get {\n      // test builder function\n      get {}\n    }\n    assertEquals(\"assert get expression\", \"[get, [get]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_get() {\n    val expression = Expression.get(Expression.literal(\"abc\"))\n    assertEquals(\"assert get expression\", \"[get, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_has() {\n    val expression = has {\n      // test builder function\n      has {}\n    }\n    assertEquals(\"assert has expression\", \"[has, [has]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_has() {\n    val expression = Expression.has(Expression.literal(\"abc\"))\n    assertEquals(\"assert has expression\", \"[has, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_heatmapDensity() {\n    val expression = heatmapDensity()\n    assertEquals(\"assert heatmap-density expression\", \"[heatmap-density]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_hsl() {\n    val expression = hsl {\n      // test builder function\n      hsl {}\n    }\n    assertEquals(\"assert hsl expression\", \"[hsl, [hsl]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_hsl() {\n    val expression = Expression.hsl(Expression.literal(\"abc\"))\n    assertEquals(\"assert hsl expression\", \"[hsl, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_hsla() {\n    val expression = hsla {\n      // test builder function\n      hsla {}\n    }\n    assertEquals(\"assert hsla expression\", \"[hsla, [hsla]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_hsla() {\n    val expression = Expression.hsla(Expression.literal(\"abc\"))\n    assertEquals(\"assert hsla expression\", \"[hsla, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_id() {\n    val expression = id()\n    assertEquals(\"assert id expression\", \"[id]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_image() {\n    val empty = image { }\n    val oneImage = image {\n      literal(\"image-name\")\n    }\n    val oneImageWithOptios = image {\n      literal(\"image-name\")\n      imageOptions(\"foo\" to Expression.literal(\"bar\"))\n    }\n    val twoImages = image {\n      literal(\"image-name\")\n      literal(\"image-name-2\")\n    }\n    val twoImagesWithOptios = image {\n      literal(\"image-name\")\n      imageOptions(\"foo\" to Expression.literal(\"bar\"))\n      literal(\"image-name-2\")\n      imageOptions(\"foo\" to Expression.get(\"bar\"))\n    }\n    val twoImagesOneOptions = image {\n      literal(\"image-name\")\n      literal(\"image-name-2\")\n      imageOptions(\"foo\" to Expression.get(\"bar\"))\n    }\n\n    assertEquals(\"assert empty image expression\", \"[image]\", empty.toString())\n    assertEquals(\"assert one image expression\", \"[image, image-name]\", oneImage.toString())\n    assertEquals(\n      \"assert one image with options expression\",\n      \"[image, image-name, {params={foo=bar}}]\",\n      oneImageWithOptios.toString()\n    )\n    assertEquals(\"assert two images expression\", \"[image, image-name, image-name-2]\", twoImages.toString())\n    assertEquals(\"assert two images two options expression\", \"[image, image-name, {params={foo=bar}}, image-name-2, {params={foo=[get, bar]}}]\", twoImagesWithOptios.toString())\n    assertEquals(\"assert two images one options expression\", \"[image, image-name, image-name-2, {params={foo=[get, bar]}}]\", twoImagesOneOptions.toString())\n  }\n\n  @Test\n  fun expression_image() {\n    val oneImage = Expression.image(Expression.literal(\"abc\"))\n    val oneImageWithOptions = Expression.image(Expression.literal(\"abc\"), mapOf(\"foo\" to Expression.literal(\"bar\")))\n    val twoImages = Expression.image(Expression.literal(\"abc\"), Expression.literal(\"def\"))\n    val twoImagesWithOptions = Expression.image(\n      Expression.literal(\"abc\"), mapOf(\"foo\" to Expression.literal(\"bar\")),\n      Expression.literal(\"foo\"), mapOf(\"option\" to Expression.literal(\"value\"))\n    )\n    val twoImagesOneOptions = Expression.image(\n      Expression.literal(\"abc\"), mapOf(),\n      Expression.literal(\"foo\"), mapOf(\"option\" to Expression.literal(\"value\"))\n    )\n\n    assertEquals(\"assert one image expression\", \"[image, abc]\", oneImage.toString())\n    assertEquals(\"assert one image with options expression\", \"[image, abc, {params={foo=bar}}]\", oneImageWithOptions.toString())\n    assertEquals(\"assert two images expression\", \"[image, abc, def]\", twoImages.toString())\n    assertEquals(\"assert two images two options expression\", \"[image, abc, {params={foo=bar}}, foo, {params={option=value}}]\", twoImagesWithOptions.toString())\n    assertEquals(\"assert two images one options expression\", \"[image, abc, {params={}}, foo, {params={option=value}}]\", twoImagesOneOptions.toString())\n  }\n\n  @Test\n  fun dsl_expression_inExpression() {\n    val expression = inExpression {\n      // test builder function\n      inExpression {}\n    }\n    assertEquals(\"assert in expression\", \"[in, [in]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_inExpression() {\n    val expression = Expression.inExpression(Expression.literal(\"abc\"))\n    assertEquals(\"assert in expression\", \"[in, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_indexOf() {\n    val expression = indexOf {\n      // test builder function\n      indexOf {}\n    }\n    assertEquals(\"assert index-of expression\", \"[index-of, [index-of]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_indexOf() {\n    val expression = Expression.indexOf(Expression.literal(\"abc\"))\n    assertEquals(\"assert index-of expression\", \"[index-of, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_interpolate_exponential() {\n    val expression = interpolate {\n      exponential {\n        literal(0.5)\n      }\n      zoom()\n      stop {\n        literal(1.0)\n        color(Color.RED)\n      }\n      stop {\n        literal(5.0)\n        color(Color.BLUE)\n      }\n      stop {\n        literal(10.0)\n        color(Color.GREEN)\n      }\n    }\n    assertEquals(\"assert interpolate expression\", \"[interpolate, [exponential, 0.5], [zoom], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 5.0, [rgba, 0.0, 0.0, 255.0, 1.0], 10.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_interpolate_cubicBezier() {\n    val expression = interpolate {\n      cubicBezier {\n        literal(0.42)\n        literal(0.0)\n        literal(1.0)\n        literal(1.0)\n      }\n      zoom()\n      stop {\n        literal(1.0)\n        color(Color.RED)\n      }\n      stop {\n        literal(5.0)\n        color(Color.BLUE)\n      }\n      stop {\n        literal(10.0)\n        color(Color.GREEN)\n      }\n    }\n    assertEquals(\"assert interpolate expression\", \"[interpolate, [cubic-bezier, 0.42, 0.0, 1.0, 1.0], [zoom], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 5.0, [rgba, 0.0, 0.0, 255.0, 1.0], 10.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\", expression.toString())\n  }\n\n  @Test\n  fun dls_expression_interpolate_linear() {\n    val expression = interpolate {\n      linear()\n      zoom()\n      stop {\n        literal(12)\n        step {\n          get { literal(\"stroke-width\") }\n          color(Color.BLACK)\n          stop {\n            literal(1.0)\n            color(Color.RED)\n          }\n          stop {\n            literal(2.0)\n            color(Color.WHITE)\n          }\n          stop {\n            literal(3.0)\n            color(Color.BLUE)\n          }\n        }\n      }\n      stop {\n        literal(15)\n        step {\n          get { literal(\"stroke-width\") }\n          color(Color.BLACK)\n          stop {\n            literal(1.0)\n            color(Color.YELLOW)\n          }\n          stop {\n            literal(2.0)\n            color(Color.LTGRAY)\n          }\n          stop {\n            literal(3.0)\n            color(Color.BLUE)\n          }\n        }\n      }\n      stop {\n        literal(18)\n        step {\n          get { literal(\"stroke-width\") }\n          color(Color.BLACK)\n          stop {\n            literal(1.0)\n            color(Color.WHITE)\n          }\n          stop {\n            literal(2.0)\n            color(Color.GRAY)\n          }\n          stop {\n            literal(3.0)\n            color(Color.GREEN)\n          }\n        }\n      }\n    }\n    assertEquals(\"assert interpolate expression\", \"[interpolate, [linear], [zoom], 12, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 2.0, [rgba, 255.0, 255.0, 255.0, 1.0], 3.0, [rgba, 0.0, 0.0, 255.0, 1.0]], 15, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 255.0, 0.0, 1.0], 2.0, [rgba, 204.0, 204.0, 204.0, 1.0], 3.0, [rgba, 0.0, 0.0, 255.0, 1.0]], 18, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 255.0, 255.0, 1.0], 2.0, [rgba, 136.0, 136.0, 136.0, 1.0], 3.0, [rgba, 0.0, 255.0, 0.0, 1.0]]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_interpolate_exponential() {\n    val expression = Expression.interpolate(\n      Expression.exponential(literal(0.5)),\n      Expression.zoom(),\n      Expression.literal(1.0),\n      Expression.color(Color.RED),\n      Expression.literal(5.0),\n      Expression.color(Color.BLUE),\n      Expression.literal(10.0),\n      Expression.color(Color.GREEN)\n    )\n    assertEquals(\"assert interpolate expression\", \"[interpolate, [exponential, 0.5], [zoom], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 5.0, [rgba, 0.0, 0.0, 255.0, 1.0], 10.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_interpolate_cubicBezier() {\n    val expression = Expression.interpolate(\n      Expression.cubicBezier(\n        Expression.literal(0.42),\n        Expression.literal(0.0),\n        Expression.literal(1.0),\n        Expression.literal(1.0)\n      ),\n      Expression.zoom(),\n      Expression.literal(1.0),\n      Expression.color(Color.RED),\n      Expression.literal(5.0),\n      Expression.color(Color.BLUE),\n      Expression.literal(10.0),\n      Expression.color(Color.GREEN)\n    )\n    assertEquals(\"assert interpolate expression\", \"[interpolate, [cubic-bezier, 0.42, 0.0, 1.0, 1.0], [zoom], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 5.0, [rgba, 0.0, 0.0, 255.0, 1.0], 10.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_interpolate_linear() {\n    val expression = Expression.interpolate(\n      Expression.linear(),\n      Expression.zoom(),\n      Expression.literal(12),\n      Expression.step(\n        Expression.get(Expression.literal(\"stroke-width\")),\n        Expression.color(Color.BLACK),\n        Expression.literal(1.0),\n        Expression.color(Color.RED),\n        Expression.literal(2.0),\n        Expression.color(Color.WHITE),\n        Expression.literal(3.0),\n        Expression.color(Color.BLUE)\n      ),\n      Expression.literal(15),\n      Expression.step(\n        Expression.get(Expression.literal(\"stroke-width\")),\n        Expression.color(Color.BLACK),\n        Expression.literal(1.0),\n        Expression.color(Color.YELLOW),\n        Expression.literal(2.0),\n        Expression.color(Color.LTGRAY),\n        Expression.literal(3.0),\n        Expression.color(Color.BLUE)\n      ),\n      Expression.literal(18),\n      Expression.step(\n        Expression.get(Expression.literal(\"stroke-width\")),\n        Expression.color(Color.BLACK),\n        Expression.literal(1.0),\n        Expression.color(Color.WHITE),\n        Expression.literal(2.0),\n        Expression.color(Color.GRAY),\n        Expression.literal(3.0),\n        Expression.color(Color.GREEN)\n      )\n    )\n    assertEquals(\"assert interpolate expression\", \"[interpolate, [linear], [zoom], 12, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 2.0, [rgba, 255.0, 255.0, 255.0, 1.0], 3.0, [rgba, 0.0, 0.0, 255.0, 1.0]], 15, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 255.0, 0.0, 1.0], 2.0, [rgba, 204.0, 204.0, 204.0, 1.0], 3.0, [rgba, 0.0, 0.0, 255.0, 1.0]], 18, [step, [get, stroke-width], [rgba, 0.0, 0.0, 0.0, 1.0], 1.0, [rgba, 255.0, 255.0, 255.0, 1.0], 2.0, [rgba, 136.0, 136.0, 136.0, 1.0], 3.0, [rgba, 0.0, 255.0, 0.0, 1.0]]]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_isSupportedScript() {\n    val expression = isSupportedScript {\n      // test builder function\n      isSupportedScript {}\n    }\n    assertEquals(\"assert is-supported-script expression\", \"[is-supported-script, [is-supported-script]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_isSupportedScript() {\n    val expression = Expression.isSupportedScript(Expression.literal(\"abc\"))\n    assertEquals(\"assert is-supported-script expression\", \"[is-supported-script, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_length() {\n    val expression = length {\n      // test builder function\n      length {}\n    }\n    assertEquals(\"assert length expression\", \"[length, [length]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_length() {\n    val expression = Expression.length(Expression.literal(\"abc\"))\n    assertEquals(\"assert length expression\", \"[length, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_letExpression() {\n    val expression = letExpression {\n      // test builder function\n      letExpression {}\n    }\n    assertEquals(\"assert let expression\", \"[let, [let]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_letExpression() {\n    val expression = Expression.letExpression(Expression.literal(\"abc\"))\n    assertEquals(\"assert let expression\", \"[let, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_lineProgress() {\n    val expression = lineProgress()\n    assertEquals(\"assert line-progress expression\", \"[line-progress]\", expression.toString())\n  }\n\n  @Test\n  fun expression_literal_Double() {\n    val expression = literal(0.1)\n    assertEquals(\"assert literal expression\", \"0.1\", expression.toString())\n  }\n\n  @Test\n  fun expression_literal_Long() {\n    val expression = literal(123)\n    assertEquals(\"assert literal expression\", \"123\", expression.toString())\n  }\n\n  @Test\n  fun expression_literal_Boolean() {\n    val expression = literal(true)\n    assertEquals(\"assert literal expression\", \"true\", expression.toString())\n  }\n\n  @Test\n  fun expression_literal_String() {\n    val expression = literal(\"abc\")\n    assertEquals(\"assert literal expression\", \"abc\", expression.toString())\n  }\n\n  @Test\n  fun expression_literal_DoubleArray() {\n    val expression = literal(listOf(0.1, 0.2, 0.3))\n    assertEquals(\"assert literal expression\", \"[literal, [0.1, 0.2, 0.3]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_literal_LongArray() {\n    val expression = literal(listOf(1, 2, 3))\n    assertEquals(\"assert literal expression\", \"[literal, [1, 2, 3]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_literal_BooleanArray() {\n    val expression = literal(listOf(true, false, true))\n    assertEquals(\"assert literal expression\", \"[literal, [true, false, true]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_literal_StringList() {\n    val expression = literal(listOf(\"apple\", \"orange\"))\n    assertEquals(\"assert literal expression\", \"[literal, [apple, orange]]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_ln() {\n    val expression = ln {\n      // test builder function\n      ln {}\n    }\n    assertEquals(\"assert ln expression\", \"[ln, [ln]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_ln() {\n    val expression = Expression.ln(Expression.literal(\"abc\"))\n    assertEquals(\"assert ln expression\", \"[ln, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_ln2() {\n    val expression = ln2()\n    assertEquals(\"assert ln2 expression\", \"[ln2]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_log10() {\n    val expression = log10 {\n      // test builder function\n      log10 {}\n    }\n    assertEquals(\"assert log10 expression\", \"[log10, [log10]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_log10() {\n    val expression = Expression.log10(Expression.literal(\"abc\"))\n    assertEquals(\"assert log10 expression\", \"[log10, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_log2() {\n    val expression = log2 {\n      // test builder function\n      log2 {}\n    }\n    assertEquals(\"assert log2 expression\", \"[log2, [log2]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_log2() {\n    val expression = Expression.log2(Expression.literal(\"abc\"))\n    assertEquals(\"assert log2 expression\", \"[log2, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_match() {\n    val expression = match {\n      // test builder function\n      match {}\n    }\n    assertEquals(\"assert match expression\", \"[match, [match]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_match() {\n    val expression = Expression.match(Expression.literal(\"abc\"))\n    assertEquals(\"assert match expression\", \"[match, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_max() {\n    val expression = max {\n      // test builder function\n      max {}\n    }\n    assertEquals(\"assert max expression\", \"[max, [max]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_max() {\n    val expression = Expression.max(Expression.literal(\"abc\"))\n    assertEquals(\"assert max expression\", \"[max, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_measureLight() {\n    val expression = measureLight {\n      // test builder function\n      measureLight {}\n    }\n    assertEquals(\"assert measure-light expression\", \"[measure-light, [measure-light]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_measureLight() {\n    val expression = Expression.measureLight(Expression.literal(\"abc\"))\n    assertEquals(\"assert measure-light expression\", \"[measure-light, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_min() {\n    val expression = min {\n      // test builder function\n      min {}\n    }\n    assertEquals(\"assert min expression\", \"[min, [min]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_min() {\n    val expression = Expression.min(Expression.literal(\"abc\"))\n    assertEquals(\"assert min expression\", \"[min, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_number() {\n    val expression = number {\n      // test builder function\n      number {}\n    }\n    assertEquals(\"assert number expression\", \"[number, [number]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_number() {\n    val expression = Expression.number(Expression.literal(\"abc\"))\n    assertEquals(\"assert number expression\", \"[number, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_numberFormat() {\n    val expression = numberFormat(literal(10)) {\n      locale(\"en-US\")\n      currency(\"USD\")\n      minFractionDigits(1)\n      maxFractionDigits(5)\n    }\n    assertEquals(\n      \"assert number-format expression\",\n      \"[number-format, 10, {min-fraction-digits=1, max-fraction-digits=5, currency=USD, locale=en-US}]\",\n      expression.toString()\n    )\n  }\n\n  @Test\n  fun expression_numberFormat() {\n    val expression = Expression.numberFormat(\n      number = literal(10),\n      locale = literal(\"en-US\"),\n      currency = literal(\"USD\"),\n      minFractionDigits = literal(1),\n      maxFractionDigits = literal(5)\n    )\n    assertEquals(\n      \"assert number-format expression\",\n      \"[number-format, 10, {min-fraction-digits=1, max-fraction-digits=5, currency=USD, locale=en-US}]\",\n      expression.toString()\n    )\n  }\n\n  @Test\n  fun dsl_expression_objectExpression() {\n    val expression = objectExpression {\n      // test builder function\n      objectExpression {}\n    }\n    assertEquals(\"assert object expression\", \"[object, [object]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_objectExpression() {\n    val expression = Expression.objectExpression(Expression.literal(\"abc\"))\n    assertEquals(\"assert object expression\", \"[object, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_pi() {\n    val expression = pi()\n    assertEquals(\"assert pi expression\", \"[pi]\", expression.toString())\n  }\n\n  @Test\n  fun expression_pitch() {\n    val expression = pitch()\n    assertEquals(\"assert pitch expression\", \"[pitch]\", expression.toString())\n  }\n\n  @Test\n  fun expression_properties() {\n    val expression = properties()\n    assertEquals(\"assert properties expression\", \"[properties]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_random() {\n    val expression = random {\n      // test builder function\n      random {}\n    }\n    assertEquals(\"assert random expression\", \"[random, [random]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_random() {\n    val expression = Expression.random(Expression.literal(\"abc\"))\n    assertEquals(\"assert random expression\", \"[random, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_rasterParticleSpeed() {\n    val expression = rasterParticleSpeed()\n    assertEquals(\"assert raster-particle-speed expression\", \"[raster-particle-speed]\", expression.toString())\n  }\n\n  @Test\n  fun expression_rasterValue() {\n    val expression = rasterValue()\n    assertEquals(\"assert raster-value expression\", \"[raster-value]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_resolvedLocale() {\n    val expression = resolvedLocale {\n      // test builder function\n      resolvedLocale {}\n    }\n    assertEquals(\"assert resolved-locale expression\", \"[resolved-locale, [resolved-locale]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_resolvedLocale() {\n    val expression = Expression.resolvedLocale(Expression.literal(\"abc\"))\n    assertEquals(\"assert resolved-locale expression\", \"[resolved-locale, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_rgb() {\n    val expression = rgb {\n      // test builder function\n      rgb {}\n    }\n    assertEquals(\"assert rgb expression\", \"[rgb, [rgb]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_rgb() {\n    val expression = Expression.rgb(Expression.literal(\"abc\"))\n    assertEquals(\"assert rgb expression\", \"[rgb, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_rgba() {\n    val expression = rgba {\n      // test builder function\n      rgba {}\n    }\n    assertEquals(\"assert rgba expression\", \"[rgba, [rgba]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_rgba() {\n    val expression = Expression.rgba(Expression.literal(\"abc\"))\n    assertEquals(\"assert rgba expression\", \"[rgba, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_round() {\n    val expression = round {\n      // test builder function\n      round {}\n    }\n    assertEquals(\"assert round expression\", \"[round, [round]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_round() {\n    val expression = Expression.round(Expression.literal(\"abc\"))\n    assertEquals(\"assert round expression\", \"[round, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_sin() {\n    val expression = sin {\n      // test builder function\n      sin {}\n    }\n    assertEquals(\"assert sin expression\", \"[sin, [sin]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_sin() {\n    val expression = Expression.sin(Expression.literal(\"abc\"))\n    assertEquals(\"assert sin expression\", \"[sin, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_skyRadialProgress() {\n    val expression = skyRadialProgress()\n    assertEquals(\"assert sky-radial-progress expression\", \"[sky-radial-progress]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_slice() {\n    val expression = slice {\n      // test builder function\n      slice {}\n    }\n    assertEquals(\"assert slice expression\", \"[slice, [slice]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_slice() {\n    val expression = Expression.slice(Expression.literal(\"abc\"))\n    assertEquals(\"assert slice expression\", \"[slice, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_split() {\n    val expression = split {\n      // test builder function\n      split {}\n    }\n    assertEquals(\"assert split expression\", \"[split, [split]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_split() {\n    val expression = Expression.split(Expression.literal(\"abc\"))\n    assertEquals(\"assert split expression\", \"[split, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_sqrt() {\n    val expression = sqrt {\n      // test builder function\n      sqrt {}\n    }\n    assertEquals(\"assert sqrt expression\", \"[sqrt, [sqrt]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_sqrt() {\n    val expression = Expression.sqrt(Expression.literal(\"abc\"))\n    assertEquals(\"assert sqrt expression\", \"[sqrt, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_step() {\n    val expression = step {\n      // test builder function\n      step {}\n    }\n    assertEquals(\"assert step expression\", \"[step, [step]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_step() {\n    val expression = Expression.step(Expression.literal(\"abc\"))\n    assertEquals(\"assert step expression\", \"[step, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_string() {\n    val expression = string {\n      // test builder function\n      string {}\n    }\n    assertEquals(\"assert string expression\", \"[string, [string]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_string() {\n    val expression = Expression.string(Expression.literal(\"abc\"))\n    assertEquals(\"assert string expression\", \"[string, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_tan() {\n    val expression = tan {\n      // test builder function\n      tan {}\n    }\n    assertEquals(\"assert tan expression\", \"[tan, [tan]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_tan() {\n    val expression = Expression.tan(Expression.literal(\"abc\"))\n    assertEquals(\"assert tan expression\", \"[tan, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_toBoolean() {\n    val expression = toBoolean {\n      // test builder function\n      toBoolean {}\n    }\n    assertEquals(\"assert to-boolean expression\", \"[to-boolean, [to-boolean]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_toBoolean() {\n    val expression = Expression.toBoolean(Expression.literal(\"abc\"))\n    assertEquals(\"assert to-boolean expression\", \"[to-boolean, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_toColor() {\n    val expression = toColor {\n      // test builder function\n      toColor {}\n    }\n    assertEquals(\"assert to-color expression\", \"[to-color, [to-color]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_toColor() {\n    val expression = Expression.toColor(Expression.literal(\"abc\"))\n    assertEquals(\"assert to-color expression\", \"[to-color, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_toHsla() {\n    val expression = toHsla {\n      // test builder function\n      toHsla {}\n    }\n    assertEquals(\"assert to-hsla expression\", \"[to-hsla, [to-hsla]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_toHsla() {\n    val expression = Expression.toHsla(Expression.literal(\"abc\"))\n    assertEquals(\"assert to-hsla expression\", \"[to-hsla, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_toNumber() {\n    val expression = toNumber {\n      // test builder function\n      toNumber {}\n    }\n    assertEquals(\"assert to-number expression\", \"[to-number, [to-number]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_toNumber() {\n    val expression = Expression.toNumber(Expression.literal(\"abc\"))\n    assertEquals(\"assert to-number expression\", \"[to-number, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_toRgba() {\n    val expression = toRgba {\n      // test builder function\n      toRgba {}\n    }\n    assertEquals(\"assert to-rgba expression\", \"[to-rgba, [to-rgba]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_toRgba() {\n    val expression = Expression.toRgba(Expression.literal(\"abc\"))\n    assertEquals(\"assert to-rgba expression\", \"[to-rgba, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_toString() {\n    val expression = toString {\n      // test builder function\n      toString {}\n    }\n    assertEquals(\"assert to-string expression\", \"[to-string, [to-string]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_toString() {\n    val expression = Expression.toString(Expression.literal(\"abc\"))\n    assertEquals(\"assert to-string expression\", \"[to-string, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_typeofExpression() {\n    val expression = typeofExpression {\n      // test builder function\n      typeofExpression {}\n    }\n    assertEquals(\"assert typeof expression\", \"[typeof, [typeof]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_typeofExpression() {\n    val expression = Expression.typeofExpression(Expression.literal(\"abc\"))\n    assertEquals(\"assert typeof expression\", \"[typeof, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_upcase() {\n    val expression = upcase {\n      // test builder function\n      upcase {}\n    }\n    assertEquals(\"assert upcase expression\", \"[upcase, [upcase]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_upcase() {\n    val expression = Expression.upcase(Expression.literal(\"abc\"))\n    assertEquals(\"assert upcase expression\", \"[upcase, abc]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_varExpression() {\n    val expression = varExpression {\n      // test builder function\n      varExpression {}\n    }\n    assertEquals(\"assert var expression\", \"[var, [var]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_varExpression() {\n    val expression = Expression.varExpression(Expression.literal(\"abc\"))\n    assertEquals(\"assert var expression\", \"[var, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_within() {\n    val polygon = Polygon.fromJson(\n      \"\"\"\n        {\n            \"type\": \"Polygon\",\n            \"coordinates\": [\n                [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]]\n            ]\n        }\n      \"\"\".trimIndent()\n    )\n    val expression = Expression.within(polygon)\n    assertEquals(\"assert within expression\", \"[within, {coordinates=[30, 30], type=Polygon}]\", expression.toString())\n  }\n\n  @Test\n  fun dsl_expression_worldview() {\n    val expression = worldview {\n      // test builder function\n      worldview {}\n    }\n    assertEquals(\"assert worldview expression\", \"[worldview, [worldview]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_worldview() {\n    val expression = Expression.worldview(Expression.literal(\"abc\"))\n    assertEquals(\"assert worldview expression\", \"[worldview, abc]\", expression.toString())\n  }\n\n  @Test\n  fun expression_zoom() {\n    val expression = zoom()\n    assertEquals(\"assert zoom expression\", \"[zoom]\", expression.toString())\n  }\n\n  @Test\n  fun expression_rgb_numbers() {\n    val expression = rgb(255.0, 0.0, 0.0)\n    assertEquals(\"assert color expression\", \"[rgb, 255.0, 0.0, 0.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_rgba_numbers() {\n    val expression = rgba(255.0, 0.0, 0.0, 1.0)\n    assertEquals(\"assert color expression\", \"[rgba, 255.0, 0.0, 0.0, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_color() {\n    val expression = color(Color.RED)\n    assertEquals(\"assert color expression\", \"[rgba, 255.0, 0.0, 0.0, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_raw() {\n    val expression = sum {\n      literal(1.0)\n      literal(2.0)\n    }\n    every { Value.fromJson(any()) } returns ExpectedFactory.createValue(Value(\"[+, 1.0, 2.0]\"))\n    assertEquals(expression.toString(), Expression.fromRaw(\"[+, 1.0, 2.0]\").toString())\n    verify { Value.fromJson(\"[+, 1.0, 2.0]\") }\n  }\n\n  @Test\n  fun expression_convenience_get() {\n    val expression = get(\"foobar\")\n    assertEquals(\"[get, foobar]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_get_multi() {\n    val expression = get(\"foobar\", get(\"fallback\"))\n    assertEquals(\"[get, foobar, [get, fallback]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_not() {\n    val expression = not(true)\n    assertEquals(\"[!, true]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_at() {\n    val expression = at(1.0, get(\"array\"))\n    assertEquals(\"[at, 1.0, [get, array]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_inExpression() {\n    val expression = inExpression(1.0, get(\"array\"))\n    assertEquals(\"[in, 1.0, [get, array]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_inExpression_multi() {\n    val expression = inExpression(\"foobar\", get(\"array\"))\n    assertEquals(\"[in, foobar, [get, array]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_has_multi() {\n    val expression = has(\"foobar\", get(\"array\"))\n    assertEquals(\"[has, foobar, [get, array]]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_has() {\n    val expression = has(\"foobar\")\n    assertEquals(\"[has, foobar]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_length() {\n    val expression = length(\"foobar\")\n    assertEquals(\"[length, foobar]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_sum() {\n    val expression = sum(1.0, 2.0, 3.0)\n    assertEquals(\"[+, 1.0, 2.0, 3.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_product() {\n    val expression = product(1.0, 2.0, 3.0)\n    assertEquals(\"[*, 1.0, 2.0, 3.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_subtract_multi() {\n    val expression = subtract(1.0, 2.0)\n    assertEquals(\"[-, 1.0, 2.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_subtract() {\n    val expression = subtract(1.0)\n    assertEquals(\"[-, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_division() {\n    val expression = division(1.0, 2.0)\n    assertEquals(\"[/, 1.0, 2.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_mod() {\n    val expression = mod(1.0, 2.0)\n    assertEquals(\"[%, 1.0, 2.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_pow() {\n    val expression = pow(1.0, 2.0)\n    assertEquals(\"[^, 1.0, 2.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_sqrt() {\n    val expression = sqrt(1.0)\n    assertEquals(\"[sqrt, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_log10() {\n    val expression = log10(1.0)\n    assertEquals(\"[log10, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_ln() {\n    val expression = ln(1.0)\n    assertEquals(\"[ln, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_log2() {\n    val expression = log2(1.0)\n    assertEquals(\"[log2, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_sin() {\n    val expression = sin(1.0)\n    assertEquals(\"[sin, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_cos() {\n    val expression = cos(1.0)\n    assertEquals(\"[cos, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_tan() {\n    val expression = tan(1.0)\n    assertEquals(\"[tan, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_asin() {\n    val expression = asin(1.0)\n    assertEquals(\"[asin, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_acos() {\n    val expression = acos(1.0)\n    assertEquals(\"[acos, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_atan() {\n    val expression = atan(1.0)\n    assertEquals(\"[atan, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_min() {\n    val expression = min(1.0, 2.0)\n    assertEquals(\"[min, 1.0, 2.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_max() {\n    val expression = max(1.0, 2.0)\n    assertEquals(\"[max, 1.0, 2.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_round() {\n    val expression = round(1.0)\n    assertEquals(\"[round, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_abs() {\n    val expression = abs(1.0)\n    assertEquals(\"[abs, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_ceil() {\n    val expression = ceil(1.0)\n    assertEquals(\"[ceil, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_floor() {\n    val expression = floor(1.0)\n    assertEquals(\"[floor, 1.0]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_isSupportedScript() {\n    val expression = isSupportedScript(\"foo\")\n    assertEquals(\"[is-supported-script, foo]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_upcase() {\n    val expression = upcase(\"foo\")\n    assertEquals(\"[upcase, foo]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_downcase() {\n    val expression = downcase(\"foo\")\n    assertEquals(\"[downcase, foo]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_concat() {\n    val expression = concat(\"foo\", \"bar\")\n    assertEquals(\"[concat, foo, bar]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_varExpression() {\n    val expression = varExpression(\"foo\")\n    assertEquals(\"[var, foo]\", expression.toString())\n  }\n\n  @Test\n  fun expression_convenience_stop_overloadDouble() {\n    val expression = interpolate {\n      linear()\n      stop(1.0) { color(Color.RED) }\n      stop(5.0) { color(Color.BLUE) }\n    }\n    assertEquals(\n      \"assert stop convenience overload double\",\n      \"[interpolate, [linear], 1.0, [rgba, 255.0, 0.0, 0.0, 1.0], 5.0, [rgba, 0.0, 0.0, 255.0, 1.0]]\",\n      expression.toString()\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/image/ImageNinePatchExtensionImplTest.kt",
    "content": "package com.mapbox.maps.extension.style.image\n\nimport android.graphics.Bitmap\nimport com.mapbox.bindgen.DataRef\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.ImageContent\nimport com.mapbox.maps.ImageStretches\nimport com.mapbox.maps.MapboxStyleManager\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass ImageNinePatchExtensionImplTest {\n\n  private val style = mockk<MapboxStyleManager>(relaxed = true)\n  private val pixelRatio = mockk<Float>(relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxed = true)\n  private val bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888)\n  private val imageContent = ImageContent(1f, 1f, 1f, 1f)\n  private val stretchX = listOf(ImageStretches(1f, 1f))\n  private val stretchY = listOf(ImageStretches(2f, 2f))\n  private lateinit var image: Image\n  private lateinit var ninePatchImage: NinePatchImage\n\n  @Before\n  fun prepareTest() {\n    mockkStatic(\"com.mapbox.maps.extension.style.image.NinePatchUtils\")\n    mockkStatic(DataRef::class)\n    val nativeDataRef = mockk<DataRef>(relaxed = true)\n    every { DataRef.allocateNative(any()) } returns nativeDataRef\n    image = Image(20, 20, nativeDataRef)\n    ninePatchImage = NinePatchImage(\n      image,\n      stretchX,\n      stretchY,\n      imageContent\n    )\n    every { style.pixelRatio } returns pixelRatio\n    every { style.addStyleImage(any(), any(), any(), any(), any(), any(), any()) } returns expected\n    every { expected.error } returns null\n    every { bitmap.parse9PatchBitmap() } returns ninePatchImage\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun imageDefaultScaleTest() {\n    val imagePlugin = image9Patch(\"imageId\", bitmap)\n    style.addImage9Patch(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", pixelRatio, image, false, stretchX, stretchY, imageContent) }\n  }\n\n  @Test\n  fun imageUserScaleTest() {\n    val imagePlugin = image9Patch(\"imageId\", bitmap) {\n      scale(0.4f)\n    }\n    style.addImage9Patch(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", 0.4f, image, false, stretchX, stretchY, imageContent) }\n  }\n\n  @Test\n  fun sdfTest() {\n    val imagePlugin = image9Patch(\"imageId\", bitmap) {\n      sdf(true)\n    }\n    style.addImage9Patch(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", pixelRatio, image, true, stretchX, stretchY, imageContent) }\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/image/ImagePluginImplTest.kt",
    "content": "package com.mapbox.maps.extension.style.image\n\nimport android.graphics.Bitmap\nimport com.mapbox.bindgen.DataRef\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.ImageContent\nimport com.mapbox.maps.ImageStretches\nimport com.mapbox.maps.MapboxStyleManager\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass ImagePluginImplTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val pixelRatio = mockk<Float>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n\n  @Before\n  fun prepareTest() {\n    every { style.pixelRatio } returns pixelRatio\n    every { style.addStyleImage(any(), any(), any(), any(), any(), any(), any()) } returns expected\n    every { expected.error } returns null\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun imageDefaultScaleTest() {\n    val image = mockk<Image>(relaxed = true)\n    val imagePlugin = image(\"imageId\", image)\n    style.addImage(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", pixelRatio, image, false, listOf(), listOf(), null) }\n  }\n\n  @Test\n  fun imageUserScaleTest() {\n    val image = mockk<Image>(relaxed = true)\n    val imagePlugin = image(\"imageId\", image) {\n      scale(0.4f)\n    }\n    style.addImage(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", 0.4f, image, false, listOf(), listOf(), null) }\n  }\n\n  /**\n   * Set bitmap data of the image.\n   */\n  @Test\n  fun bitmapDefaultScaleTest() {\n    val imageSlot = slot<Image>()\n    val bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888)\n    mockkStatic(DataRef::class)\n    val nativeDataRef = mockk<DataRef>(relaxed = true)\n    var allocatedByteCount = 0\n    every { DataRef.allocateNative(any()) } answers {\n      allocatedByteCount = firstArg()\n      nativeDataRef\n    }\n    val imagePlugin = image(\"imageId\", bitmap)\n    style.addImage(imagePlugin)\n    verify {\n      style.addStyleImage(\n        \"imageId\",\n        pixelRatio,\n        capture(imageSlot),\n        false,\n        listOf(),\n        listOf(),\n        null\n      )\n    }\n    assertEquals(400, imageSlot.captured.width)\n    assertEquals(400, imageSlot.captured.height)\n    assertEquals(bitmap.byteCount, allocatedByteCount)\n    unmockkStatic(DataRef::class)\n  }\n\n  /**\n   * Set bitmap data of the image.\n   */\n  @Test\n  fun bitmapCustomScaleTest() {\n    val imageSlot = slot<Image>()\n    val bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888)\n    mockkStatic(DataRef::class)\n    val nativeDataRef = mockk<DataRef>(relaxed = true)\n    var allocatedByteCount = 0\n    every { DataRef.allocateNative(any()) } answers {\n      allocatedByteCount = firstArg()\n      nativeDataRef\n    }\n    val imagePlugin = image(\"imageId\", bitmap) {\n      scale(1.5f)\n    }\n    style.addImage(imagePlugin)\n    verify {\n      style.addStyleImage(\n        \"imageId\",\n        1.5f,\n        capture(imageSlot),\n        false,\n        listOf(),\n        listOf(),\n        null\n      )\n    }\n    assertEquals(400, imageSlot.captured.width)\n    assertEquals(400, imageSlot.captured.height)\n    assertEquals(bitmap.byteCount, allocatedByteCount)\n    unmockkStatic(DataRef::class)\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun imageNotAvailableTest() {\n    val imagePlugin = image(\"imageId\") {\n      scale(1.1f)\n    }\n    style.addImage(imagePlugin)\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun bitmapWrongFormatTest() {\n    val imagePlugin = image(\"imageId\", Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565))\n    style.addImage(imagePlugin)\n  }\n\n  /**\n   * Scale factor for the image.\n   */\n  @Test\n  fun scaleTest() {\n    val image = mockk<Image>(relaxed = true)\n    val imagePlugin = image(\"imageId\", image) {\n      scale(1.1f)\n    }\n    style.addImage(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", 1.1f, image, false, listOf(), listOf(), null) }\n  }\n\n  /**\n   * Option to treat whether image is SDF(signed distance field) or not.\n   */\n  @Test\n  fun sdfTest() {\n    val image = mockk<Image>(relaxed = true)\n    val imagePlugin = image(\"imageId\", image) {\n      sdf(true)\n    }\n    style.addImage(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", pixelRatio, image, true, listOf(), listOf(), null) }\n  }\n\n  /**\n   * An array of two-element arrays, consisting of two numbers that represent\n   * the from position and the to position of areas that can be stretched horizontally.\n   */\n  @Test\n  fun stretchXTest() {\n    val image = mockk<Image>(relaxed = true)\n    val stretchX = listOf(ImageStretches(1.0f, 1.0f), ImageStretches(2.0f, 2.0f))\n    val imagePlugin = image(\"imageId\", image) {\n      stretchX(stretchX)\n    }\n    style.addImage(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", pixelRatio, image, false, stretchX, listOf(), null) }\n  }\n\n  /**\n   * An array of two-element arrays, consisting of two numbers that represent\n   * the from position and the to position of areas that can be stretched vertically.\n   */\n  @Test\n  fun stretchYTest() {\n    val image = mockk<Image>(relaxed = true)\n    val stretchY = listOf(ImageStretches(1.0f, 1.0f), ImageStretches(2.0f, 2.0f))\n    val imagePlugin = image(\"imageId\", image) {\n      stretchY(stretchY)\n    }\n    style.addImage(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", pixelRatio, image, false, listOf(), stretchY, null) }\n  }\n\n  /**\n   * An array of four numbers, with the first two specifying the left, top\n   * corner, and the last two specifying the right, bottom corner. If present, and if the\n   * icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n   */\n  @Test\n  fun contentTest() {\n    val image = mockk<Image>(relaxed = true)\n    val content = ImageContent(1.0f, 2.0f, 3.0f, 4.0f)\n    val imagePlugin = image(\"imageId\", image) {\n      content(content)\n    }\n    style.addImage(imagePlugin)\n    verify { style.addStyleImage(\"imageId\", pixelRatio, image, false, listOf(), listOf(), content) }\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/LayerExtTest.kt",
    "content": "package com.mapbox.maps.extension.style.layers\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.CustomLayerHost\nimport com.mapbox.maps.CustomLayerRenderParameters\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.layers.generated.clipLayer\nimport com.mapbox.maps.extension.style.layers.generated.slotLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass LayerExtTest {\n\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val booleanExpected =\n    mockk<Expected<String, Boolean>>(relaxUnitFun = true, relaxed = true)\n  private val emptyHost = object : CustomLayerHost {\n    override fun initialize() {\n    }\n\n    override fun render(parameters: CustomLayerRenderParameters) {\n    }\n\n    override fun contextLost() {\n    }\n\n    override fun deinitialize() {\n    }\n  }\n\n  @Before\n  fun prepareTest() {\n    every { style.isStyleLayerPersistent(any()) } returns booleanExpected\n    every { style.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { style.addPersistentStyleCustomLayer(any(), any(), any()) } returns ExpectedFactory.createNone()\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.addStyleCustomLayer(any(), any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { expected.error } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun testBindPersistentlyTo() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindPersistentlyTo(style)\n    verify(exactly = 1) { style.addPersistentStyleLayer(any(), any()) }\n  }\n\n  @Test\n  fun testAddLayer() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    style.addLayer(layer)\n    verify(exactly = 1) { style.addStyleLayer(any(), any()) }\n  }\n\n  @Test\n  fun testAddCustomLayer() {\n    val layer = customLayer(\"id\", emptyHost)\n    style.addLayer(layer)\n    verifySequence {\n      style.addStyleCustomLayer(\"id\", emptyHost, any())\n      style.setStyleLayerProperties(\"id\", any())\n    }\n  }\n\n  @Test\n  fun testAddPersistentLayer() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    style.addPersistentLayer(layer)\n    verify(exactly = 1) { style.addPersistentStyleLayer(any(), any()) }\n  }\n\n  @Test\n  fun testAddPersistentCustomLayer() {\n    val layer = customLayer(\"id\", emptyHost)\n    style.addPersistentLayer(layer)\n    verifySequence {\n      style.addPersistentStyleCustomLayer(\"id\", emptyHost, any())\n      style.setStyleLayerProperties(\"id\", any())\n    }\n  }\n\n  @Test\n  fun testPersistentGet() {\n    every { style.isStyleLayerPersistent(any()) } returns booleanExpected\n    every { booleanExpected.value } returns true\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertTrue(layer.isPersistent()!!)\n    verify { style.isStyleLayerPersistent(\"id\") }\n  }\n\n  @Test\n  fun testSlotLayerAdd() {\n    val layerId = \"id\"\n    val slotName = \"customSlot\"\n    val layer = slotLayer(layerId) {\n      slot(slotName)\n    }\n    style.addLayer(layer)\n    verify(exactly = 1) {\n      style.addStyleLayer(\n        Value.valueOf(\n          hashMapOf(\n            \"id\" to Value(layerId),\n            \"slot\" to Value(slotName),\n            \"type\" to Value(\"slot\"),\n          )\n        ),\n        any()\n      )\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun testClipLayerAdd() {\n    val layerId = \"layer-id\"\n    val sourceId = \"source-id\"\n    val layer = clipLayer(layerId, sourceId) {}\n    style.addLayer(layer)\n    verify(exactly = 1) {\n      style.addStyleLayer(\n        Value.valueOf(\n          hashMapOf(\n            \"id\" to Value(layerId),\n            \"source\" to Value(sourceId),\n            \"type\" to Value(\"clip\"),\n          )\n        ),\n        any()\n      )\n    }\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/BackgroundLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass BackgroundLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n  // Property getters and setters\n\n  @Test\n  fun backgroundColorSet() {\n    val layer = backgroundLayer(\"id\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.backgroundColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"background-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun backgroundColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.backgroundColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-color\") }\n  }\n\n  @Test\n  fun backgroundColorUseThemeSetAfterInitialization() {\n    val layer = backgroundLayer(\"id\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.backgroundColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"background-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun backgroundColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = backgroundLayer(\"id\") {\n      backgroundColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"background-color-use-theme\"))\n  }\n\n  @Test\n  fun backgroundColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.backgroundColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun backgroundColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"background-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun backgroundColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.backgroundColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-color-use-theme\") }\n  }\n\n  @Test\n  fun backgroundColorUseThemeAsExpressionGetNull() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.backgroundColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"background-color-use-theme\") }\n  }\n\n  @Test\n  fun backgroundColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.backgroundColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-color-use-theme\") }\n  }\n\n  @Test\n  fun backgroundColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = backgroundLayer(\"id\") {\n      backgroundColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.backgroundColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-color-use-theme\") }\n  }\n\n  @Test\n  fun backgroundColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"background-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun backgroundColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.backgroundColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-color\") }\n  }\n\n  @Test\n  fun backgroundColorAsExpressionGetNull() {\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.backgroundColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"background-color\") }\n  }\n\n  @Test\n  fun backgroundColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.backgroundColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.backgroundColor)\n    assertEquals(Color.BLACK, layer.backgroundColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"background-color\") }\n  }\n\n  @Test\n  fun backgroundColorAsColorIntSet() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"background-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun backgroundColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.backgroundColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"background-color\") }\n  }\n\n  @Test\n  fun backgroundColorTransitionSet() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"background-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun backgroundColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.backgroundColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-color-transition\") }\n  }\n\n  @Test\n  fun backgroundColorTransitionSetDsl() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"background-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun backgroundEmissiveStrengthSet() {\n    val layer = backgroundLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.backgroundEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"background-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun backgroundEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.backgroundEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun backgroundEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"background-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun backgroundEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.backgroundEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-emissive-strength\") }\n  }\n\n  @Test\n  fun backgroundEmissiveStrengthAsExpressionGetNull() {\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.backgroundEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"background-emissive-strength\") }\n  }\n\n  @Test\n  fun backgroundEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.backgroundEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.backgroundEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"background-emissive-strength\") }\n  }\n\n  @Test\n  fun backgroundEmissiveStrengthTransitionSet() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"background-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun backgroundEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.backgroundEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun backgroundEmissiveStrengthTransitionSetDsl() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"background-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun backgroundOpacitySet() {\n    val layer = backgroundLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.backgroundOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"background-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun backgroundOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.backgroundOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun backgroundOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"background-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun backgroundOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.backgroundOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-opacity\") }\n  }\n\n  @Test\n  fun backgroundOpacityAsExpressionGetNull() {\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.backgroundOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"background-opacity\") }\n  }\n\n  @Test\n  fun backgroundOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.backgroundOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.backgroundOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"background-opacity\") }\n  }\n\n  @Test\n  fun backgroundOpacityTransitionSet() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"background-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun backgroundOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.backgroundOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-opacity-transition\") }\n  }\n\n  @Test\n  fun backgroundOpacityTransitionSetDsl() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"background-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun backgroundPatternSet() {\n    val layer = backgroundLayer(\"id\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.backgroundPattern(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"background-pattern\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun backgroundPatternGet() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.backgroundPattern?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-pattern\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun backgroundPatternAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundPattern(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"background-pattern\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun backgroundPatternAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.backgroundPatternAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-pattern\") }\n  }\n\n  @Test\n  fun backgroundPatternAsExpressionGetNull() {\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.backgroundPatternAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"background-pattern\") }\n  }\n\n  @Test\n  fun backgroundPatternAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.backgroundPatternAsExpression.toString())\n    assertEquals(\"abc\", layer.backgroundPattern)\n    verify { style.getStyleLayerProperty(\"id\", \"background-pattern\") }\n  }\n\n  @Test\n  fun backgroundPitchAlignmentSet() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundPitchAlignment(BackgroundPitchAlignment.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"background-pitch-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun backgroundPitchAlignmentGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(BackgroundPitchAlignment.MAP, layer.backgroundPitchAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"background-pitch-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun backgroundPitchAlignmentAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.backgroundPitchAlignment(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"background-pitch-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun backgroundPitchAlignmentAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.backgroundPitchAlignmentAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"background-pitch-alignment\") }\n  }\n\n  @Test\n  fun backgroundPitchAlignmentAsExpressionGetNull() {\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.backgroundPitchAlignmentAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"background-pitch-alignment\") }\n  }\n\n  @Test\n  fun backgroundPitchAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.backgroundPitchAlignmentAsExpression?.toString())\n    assertEquals(BackgroundPitchAlignment.MAP.value, layer.backgroundPitchAlignmentAsExpression.toString())\n    assertEquals(BackgroundPitchAlignment.MAP, layer.backgroundPitchAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"background-pitch-alignment\") }\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = backgroundLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = backgroundLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = backgroundLayer(\"id\") { }\n    assertEquals(\"background\", layer.getType())\n  }\n\n  @Test\n  fun getBackgroundLayerTest() {\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"background\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as BackgroundLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"background\", layer.getType())\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultBackgroundColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), BackgroundLayer.defaultBackgroundColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-color\") }\n  }\n\n  @Test\n  fun defaultBackgroundColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, BackgroundLayer.defaultBackgroundColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultBackgroundColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), BackgroundLayer.defaultBackgroundColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-color\") }\n  }\n\n  @Test\n  fun defaultBackgroundColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), BackgroundLayer.defaultBackgroundColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", BackgroundLayer.defaultBackgroundColor)\n    assertEquals(Color.BLACK, BackgroundLayer.defaultBackgroundColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-color\") }\n  }\n\n  @Test\n  fun defaultBackgroundColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, BackgroundLayer.defaultBackgroundColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-color\") }\n  }\n\n  @Test\n  fun defaultBackgroundColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), BackgroundLayer.defaultBackgroundColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-color-transition\") }\n  }\n\n  @Test\n  fun defaultBackgroundEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), BackgroundLayer.defaultBackgroundEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultBackgroundEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), BackgroundLayer.defaultBackgroundEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultBackgroundEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, BackgroundLayer.defaultBackgroundEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, BackgroundLayer.defaultBackgroundEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultBackgroundEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), BackgroundLayer.defaultBackgroundEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultBackgroundOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), BackgroundLayer.defaultBackgroundOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultBackgroundOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), BackgroundLayer.defaultBackgroundOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-opacity\") }\n  }\n\n  @Test\n  fun defaultBackgroundOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, BackgroundLayer.defaultBackgroundOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, BackgroundLayer.defaultBackgroundOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-opacity\") }\n  }\n\n  @Test\n  fun defaultBackgroundOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), BackgroundLayer.defaultBackgroundOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultBackgroundPatternTest() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), BackgroundLayer.defaultBackgroundPattern?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pattern\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultBackgroundPatternAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), BackgroundLayer.defaultBackgroundPatternAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pattern\") }\n  }\n\n  @Test\n  fun defaultBackgroundPatternAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    assertEquals(\"abc\", BackgroundLayer.defaultBackgroundPatternAsExpression.toString())\n    assertEquals(\"abc\", BackgroundLayer.defaultBackgroundPattern)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pattern\") }\n  }\n\n  @Test\n  fun defaultBackgroundPitchAlignmentTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(BackgroundPitchAlignment.MAP, BackgroundLayer.defaultBackgroundPitchAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pitch-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultBackgroundPitchAlignmentAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), BackgroundLayer.defaultBackgroundPitchAlignmentAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pitch-alignment\") }\n  }\n\n  @Test\n  fun defaultBackgroundPitchAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), BackgroundLayer.defaultBackgroundPitchAlignmentAsExpression?.toString())\n    assertEquals(BackgroundPitchAlignment.MAP.value, BackgroundLayer.defaultBackgroundPitchAlignmentAsExpression.toString())\n    assertEquals(BackgroundPitchAlignment.MAP, BackgroundLayer.defaultBackgroundPitchAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"background-pitch-alignment\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, BackgroundLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"background\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/CircleLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass CircleLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = circleLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=circle}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = circleLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=circle, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = circleLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=circle}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun circleElevationReferenceSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleElevationReference(CircleElevationReference.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun circleElevationReferenceGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(CircleElevationReference.NONE, layer.circleElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleElevationReferenceAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleElevationReference(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleElevationReferenceAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleElevationReferenceAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-elevation-reference\") }\n  }\n\n  @Test\n  fun circleElevationReferenceAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleElevationReferenceAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-elevation-reference\") }\n  }\n\n  @Test\n  fun circleElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.circleElevationReferenceAsExpression?.toString())\n    assertEquals(CircleElevationReference.NONE.value, layer.circleElevationReferenceAsExpression.toString())\n    assertEquals(CircleElevationReference.NONE, layer.circleElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-elevation-reference\") }\n  }\n\n  @Test\n  fun circleSortKeySet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.circleSortKey(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-sort-key\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun circleSortKeyGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.circleSortKey?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-sort-key\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleSortKeyAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleSortKey(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-sort-key\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleSortKeyAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleSortKeyAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-sort-key\") }\n  }\n\n  @Test\n  fun circleSortKeyAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleSortKeyAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-sort-key\") }\n  }\n\n  @Test\n  fun circleSortKeyAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.circleSortKeyAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.circleSortKey!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-sort-key\") }\n  }\n\n  @Test\n  fun circleBlurSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.circleBlur(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-blur\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun circleBlurGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.circleBlur?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-blur\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleBlurAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleBlur(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-blur\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleBlurAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleBlurAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-blur\") }\n  }\n\n  @Test\n  fun circleBlurAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleBlurAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-blur\") }\n  }\n\n  @Test\n  fun circleBlurAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.circleBlurAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.circleBlur!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-blur\") }\n  }\n\n  @Test\n  fun circleBlurTransitionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleBlurTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"circle-blur-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleBlurTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.circleBlurTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-blur-transition\") }\n  }\n\n  @Test\n  fun circleBlurTransitionSetDsl() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleBlurTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"circle-blur-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleColorSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.circleColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun circleColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.circleColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color\") }\n  }\n\n  @Test\n  fun circleColorUseThemeSetAfterInitialization() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.circleColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun circleColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"circle-color-use-theme\"))\n  }\n\n  @Test\n  fun circleColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.circleColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun circleColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color-use-theme\") }\n  }\n\n  @Test\n  fun circleColorUseThemeAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.circleColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color-use-theme\") }\n  }\n\n  @Test\n  fun circleColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color-use-theme\") }\n  }\n\n  @Test\n  fun circleColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.circleColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color-use-theme\") }\n  }\n\n  @Test\n  fun circleColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color\") }\n  }\n\n  @Test\n  fun circleColorAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color\") }\n  }\n\n  @Test\n  fun circleColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.circleColor)\n    assertEquals(Color.BLACK, layer.circleColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color\") }\n  }\n\n  @Test\n  fun circleColorAsColorIntSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun circleColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.circleColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color\") }\n  }\n\n  @Test\n  fun circleColorTransitionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"circle-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.circleColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-color-transition\") }\n  }\n\n  @Test\n  fun circleColorTransitionSetDsl() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"circle-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleEmissiveStrengthSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.circleEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun circleEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.circleEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-emissive-strength\") }\n  }\n\n  @Test\n  fun circleEmissiveStrengthAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-emissive-strength\") }\n  }\n\n  @Test\n  fun circleEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.circleEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.circleEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-emissive-strength\") }\n  }\n\n  @Test\n  fun circleEmissiveStrengthTransitionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"circle-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.circleEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun circleEmissiveStrengthTransitionSetDsl() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"circle-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleOpacitySet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.circleOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun circleOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.circleOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-opacity\") }\n  }\n\n  @Test\n  fun circleOpacityAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-opacity\") }\n  }\n\n  @Test\n  fun circleOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.circleOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.circleOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-opacity\") }\n  }\n\n  @Test\n  fun circleOpacityTransitionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"circle-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.circleOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-opacity-transition\") }\n  }\n\n  @Test\n  fun circleOpacityTransitionSetDsl() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"circle-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circlePitchAlignmentSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circlePitchAlignment(CirclePitchAlignment.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-pitch-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun circlePitchAlignmentGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(CirclePitchAlignment.MAP, layer.circlePitchAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-pitch-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circlePitchAlignmentAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circlePitchAlignment(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-pitch-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circlePitchAlignmentAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circlePitchAlignmentAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-pitch-alignment\") }\n  }\n\n  @Test\n  fun circlePitchAlignmentAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circlePitchAlignmentAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-pitch-alignment\") }\n  }\n\n  @Test\n  fun circlePitchAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.circlePitchAlignmentAsExpression?.toString())\n    assertEquals(CirclePitchAlignment.MAP.value, layer.circlePitchAlignmentAsExpression.toString())\n    assertEquals(CirclePitchAlignment.MAP, layer.circlePitchAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-pitch-alignment\") }\n  }\n\n  @Test\n  fun circlePitchScaleSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circlePitchScale(CirclePitchScale.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-pitch-scale\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun circlePitchScaleGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(CirclePitchScale.MAP, layer.circlePitchScale)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-pitch-scale\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circlePitchScaleAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circlePitchScale(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-pitch-scale\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circlePitchScaleAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circlePitchScaleAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-pitch-scale\") }\n  }\n\n  @Test\n  fun circlePitchScaleAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circlePitchScaleAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-pitch-scale\") }\n  }\n\n  @Test\n  fun circlePitchScaleAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.circlePitchScaleAsExpression?.toString())\n    assertEquals(CirclePitchScale.MAP.value, layer.circlePitchScaleAsExpression.toString())\n    assertEquals(CirclePitchScale.MAP, layer.circlePitchScale)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-pitch-scale\") }\n  }\n\n  @Test\n  fun circleRadiusSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.circleRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun circleRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.circleRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-radius\") }\n  }\n\n  @Test\n  fun circleRadiusAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-radius\") }\n  }\n\n  @Test\n  fun circleRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.circleRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.circleRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-radius\") }\n  }\n\n  @Test\n  fun circleRadiusTransitionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleRadiusTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"circle-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleRadiusTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.circleRadiusTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-radius-transition\") }\n  }\n\n  @Test\n  fun circleRadiusTransitionSetDsl() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleRadiusTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"circle-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleStrokeColorSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.circleStrokeColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun circleStrokeColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.circleStrokeColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color\") }\n  }\n\n  @Test\n  fun circleStrokeColorUseThemeSetAfterInitialization() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.circleStrokeColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun circleStrokeColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"circle-stroke-color-use-theme\"))\n  }\n\n  @Test\n  fun circleStrokeColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.circleStrokeColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleStrokeColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun circleStrokeColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleStrokeColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color-use-theme\") }\n  }\n\n  @Test\n  fun circleStrokeColorUseThemeAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.circleStrokeColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color-use-theme\") }\n  }\n\n  @Test\n  fun circleStrokeColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleStrokeColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color-use-theme\") }\n  }\n\n  @Test\n  fun circleStrokeColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.circleStrokeColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color-use-theme\") }\n  }\n\n  @Test\n  fun circleStrokeColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleStrokeColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleStrokeColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color\") }\n  }\n\n  @Test\n  fun circleStrokeColorAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleStrokeColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color\") }\n  }\n\n  @Test\n  fun circleStrokeColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleStrokeColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.circleStrokeColor)\n    assertEquals(Color.BLACK, layer.circleStrokeColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color\") }\n  }\n\n  @Test\n  fun circleStrokeColorAsColorIntSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun circleStrokeColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.circleStrokeColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color\") }\n  }\n\n  @Test\n  fun circleStrokeColorTransitionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleStrokeColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.circleStrokeColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-color-transition\") }\n  }\n\n  @Test\n  fun circleStrokeColorTransitionSetDsl() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleStrokeOpacitySet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.circleStrokeOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun circleStrokeOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.circleStrokeOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleStrokeOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleStrokeOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleStrokeOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-opacity\") }\n  }\n\n  @Test\n  fun circleStrokeOpacityAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleStrokeOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-opacity\") }\n  }\n\n  @Test\n  fun circleStrokeOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.circleStrokeOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.circleStrokeOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-opacity\") }\n  }\n\n  @Test\n  fun circleStrokeOpacityTransitionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleStrokeOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.circleStrokeOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-opacity-transition\") }\n  }\n\n  @Test\n  fun circleStrokeOpacityTransitionSetDsl() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleStrokeWidthSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.circleStrokeWidth(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun circleStrokeWidthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.circleStrokeWidth?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleStrokeWidthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeWidth(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleStrokeWidthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleStrokeWidthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-width\") }\n  }\n\n  @Test\n  fun circleStrokeWidthAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleStrokeWidthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-width\") }\n  }\n\n  @Test\n  fun circleStrokeWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.circleStrokeWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.circleStrokeWidth!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-width\") }\n  }\n\n  @Test\n  fun circleStrokeWidthTransitionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeWidthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleStrokeWidthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.circleStrokeWidthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-stroke-width-transition\") }\n  }\n\n  @Test\n  fun circleStrokeWidthTransitionSetDsl() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleStrokeWidthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"circle-stroke-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleTranslateSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.circleTranslate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun circleTranslateGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.circleTranslate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleTranslateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleTranslate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleTranslateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleTranslateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-translate\") }\n  }\n\n  @Test\n  fun circleTranslateAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleTranslateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-translate\") }\n  }\n\n  @Test\n  fun circleTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.circleTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.circleTranslate!!)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-translate\") }\n  }\n\n  @Test\n  fun circleTranslateTransitionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleTranslateTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"circle-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleTranslateTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.circleTranslateTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-translate-transition\") }\n  }\n\n  @Test\n  fun circleTranslateTransitionSetDsl() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleTranslateTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"circle-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun circleTranslateAnchorSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleTranslateAnchor(CircleTranslateAnchor.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun circleTranslateAnchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(CircleTranslateAnchor.MAP, layer.circleTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun circleTranslateAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.circleTranslateAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"circle-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun circleTranslateAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.circleTranslateAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"circle-translate-anchor\") }\n  }\n\n  @Test\n  fun circleTranslateAnchorAsExpressionGetNull() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.circleTranslateAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-translate-anchor\") }\n  }\n\n  @Test\n  fun circleTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.circleTranslateAnchorAsExpression?.toString())\n    assertEquals(CircleTranslateAnchor.MAP.value, layer.circleTranslateAnchorAsExpression.toString())\n    assertEquals(CircleTranslateAnchor.MAP, layer.circleTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"circle-translate-anchor\") }\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = circleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = circleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = circleLayer(\"id\", \"source\") { }\n    assertEquals(\"circle\", layer.getType())\n  }\n\n  @Test\n  fun getCircleLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"circle\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as CircleLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"circle\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultCircleElevationReferenceTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(CircleElevationReference.NONE, CircleLayer.defaultCircleElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleElevationReferenceAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleElevationReferenceAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultCircleElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), CircleLayer.defaultCircleElevationReferenceAsExpression?.toString())\n    assertEquals(CircleElevationReference.NONE.value, CircleLayer.defaultCircleElevationReferenceAsExpression.toString())\n    assertEquals(CircleElevationReference.NONE, CircleLayer.defaultCircleElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultCircleSortKeyTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleSortKey?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-sort-key\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleSortKeyAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleSortKeyAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-sort-key\") }\n  }\n\n  @Test\n  fun defaultCircleSortKeyAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, CircleLayer.defaultCircleSortKeyAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, CircleLayer.defaultCircleSortKey!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-sort-key\") }\n  }\n\n  @Test\n  fun defaultCircleBlurTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleBlur?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-blur\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleBlurAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleBlurAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-blur\") }\n  }\n\n  @Test\n  fun defaultCircleBlurAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, CircleLayer.defaultCircleBlurAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, CircleLayer.defaultCircleBlur!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-blur\") }\n  }\n\n  @Test\n  fun defaultCircleBlurTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), CircleLayer.defaultCircleBlurTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-blur-transition\") }\n  }\n\n  @Test\n  fun defaultCircleColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color\") }\n  }\n\n  @Test\n  fun defaultCircleColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, CircleLayer.defaultCircleColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultCircleColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color\") }\n  }\n\n  @Test\n  fun defaultCircleColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", CircleLayer.defaultCircleColor)\n    assertEquals(Color.BLACK, CircleLayer.defaultCircleColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color\") }\n  }\n\n  @Test\n  fun defaultCircleColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, CircleLayer.defaultCircleColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color\") }\n  }\n\n  @Test\n  fun defaultCircleColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), CircleLayer.defaultCircleColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-color-transition\") }\n  }\n\n  @Test\n  fun defaultCircleEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultCircleEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, CircleLayer.defaultCircleEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, CircleLayer.defaultCircleEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultCircleEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), CircleLayer.defaultCircleEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultCircleOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-opacity\") }\n  }\n\n  @Test\n  fun defaultCircleOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, CircleLayer.defaultCircleOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, CircleLayer.defaultCircleOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-opacity\") }\n  }\n\n  @Test\n  fun defaultCircleOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), CircleLayer.defaultCircleOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultCirclePitchAlignmentTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(CirclePitchAlignment.MAP, CircleLayer.defaultCirclePitchAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCirclePitchAlignmentAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCirclePitchAlignmentAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-alignment\") }\n  }\n\n  @Test\n  fun defaultCirclePitchAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), CircleLayer.defaultCirclePitchAlignmentAsExpression?.toString())\n    assertEquals(CirclePitchAlignment.MAP.value, CircleLayer.defaultCirclePitchAlignmentAsExpression.toString())\n    assertEquals(CirclePitchAlignment.MAP, CircleLayer.defaultCirclePitchAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-alignment\") }\n  }\n\n  @Test\n  fun defaultCirclePitchScaleTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(CirclePitchScale.MAP, CircleLayer.defaultCirclePitchScale)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-scale\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCirclePitchScaleAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCirclePitchScaleAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-scale\") }\n  }\n\n  @Test\n  fun defaultCirclePitchScaleAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), CircleLayer.defaultCirclePitchScaleAsExpression?.toString())\n    assertEquals(CirclePitchScale.MAP.value, CircleLayer.defaultCirclePitchScaleAsExpression.toString())\n    assertEquals(CirclePitchScale.MAP, CircleLayer.defaultCirclePitchScale)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-scale\") }\n  }\n\n  @Test\n  fun defaultCircleRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-radius\") }\n  }\n\n  @Test\n  fun defaultCircleRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, CircleLayer.defaultCircleRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, CircleLayer.defaultCircleRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-radius\") }\n  }\n\n  @Test\n  fun defaultCircleRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), CircleLayer.defaultCircleRadiusTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-radius-transition\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleStrokeColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, CircleLayer.defaultCircleStrokeColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultCircleStrokeColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleStrokeColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleStrokeColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", CircleLayer.defaultCircleStrokeColor)\n    assertEquals(Color.BLACK, CircleLayer.defaultCircleStrokeColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, CircleLayer.defaultCircleStrokeColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), CircleLayer.defaultCircleStrokeColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-color-transition\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleStrokeOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleStrokeOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleStrokeOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-opacity\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, CircleLayer.defaultCircleStrokeOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, CircleLayer.defaultCircleStrokeOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-opacity\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), CircleLayer.defaultCircleStrokeOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeWidthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleStrokeWidth?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleStrokeWidthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleStrokeWidthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-width\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, CircleLayer.defaultCircleStrokeWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, CircleLayer.defaultCircleStrokeWidth!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-width\") }\n  }\n\n  @Test\n  fun defaultCircleStrokeWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), CircleLayer.defaultCircleStrokeWidthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-stroke-width-transition\") }\n  }\n\n  @Test\n  fun defaultCircleTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), CircleLayer.defaultCircleTranslate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleTranslateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleTranslateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate\") }\n  }\n\n  @Test\n  fun defaultCircleTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", CircleLayer.defaultCircleTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), CircleLayer.defaultCircleTranslate!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate\") }\n  }\n\n  @Test\n  fun defaultCircleTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), CircleLayer.defaultCircleTranslateTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate-transition\") }\n  }\n\n  @Test\n  fun defaultCircleTranslateAnchorTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(CircleTranslateAnchor.MAP, CircleLayer.defaultCircleTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultCircleTranslateAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), CircleLayer.defaultCircleTranslateAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultCircleTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), CircleLayer.defaultCircleTranslateAnchorAsExpression?.toString())\n    assertEquals(CircleTranslateAnchor.MAP.value, CircleLayer.defaultCircleTranslateAnchorAsExpression.toString())\n    assertEquals(CircleTranslateAnchor.MAP, CircleLayer.defaultCircleTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, CircleLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/ClipLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass ClipLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = clipLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=clip}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = clipLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = clipLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=clip, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = clipLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = clipLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=clip}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = clipLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = clipLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun clipLayerScopeSet() {\n    val layer = clipLayer(\"id\", \"source\") {}\n    val testValue = listOf(\"a\", \"b\", \"c\")\n    layer.bindTo(style)\n    layer.clipLayerScope(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"clip-layer-scope\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[a, b, c]\")\n  }\n\n  @Test\n  fun clipLayerScopeGet() {\n    val testValue = listOf(\"a\", \"b\", \"c\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(\"a\", \"b\", \"c\")\n    assertEquals(expectedValue.toString(), layer.clipLayerScope?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"clip-layer-scope\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun clipLayerScopeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = clipLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.clipLayerScope(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"clip-layer-scope\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun clipLayerScopeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.clipLayerScopeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"clip-layer-scope\") }\n  }\n\n  @Test\n  fun clipLayerScopeAsExpressionGetNull() {\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.clipLayerScopeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"clip-layer-scope\") }\n  }\n\n  @Test\n  fun clipLayerScopeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"a\", \"b\", \"c\"))\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [a, b, c]]\", layer.clipLayerScopeAsExpression.toString())\n    assertEquals(listOf(\"a\", \"b\", \"c\"), layer.clipLayerScope!!)\n    verify { style.getStyleLayerProperty(\"id\", \"clip-layer-scope\") }\n  }\n\n  @Test\n  fun clipLayerTypesSet() {\n    val layer = clipLayer(\"id\", \"source\") {}\n    val testValue = listOf(\"model\", \"symbol\")\n    layer.bindTo(style)\n    layer.clipLayerTypes(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"clip-layer-types\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[model, symbol]\")\n  }\n\n  @Test\n  fun clipLayerTypesGet() {\n    val testValue = listOf(\"model\", \"symbol\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(\"model\", \"symbol\")\n    assertEquals(expectedValue.toString(), layer.clipLayerTypes?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"clip-layer-types\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun clipLayerTypesAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = clipLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.clipLayerTypes(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"clip-layer-types\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun clipLayerTypesAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.clipLayerTypesAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"clip-layer-types\") }\n  }\n\n  @Test\n  fun clipLayerTypesAsExpressionGetNull() {\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.clipLayerTypesAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"clip-layer-types\") }\n  }\n\n  @Test\n  fun clipLayerTypesAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"model\", \"symbol\"))\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [model, symbol]]\", layer.clipLayerTypesAsExpression.toString())\n    assertEquals(listOf(\"model\", \"symbol\"), layer.clipLayerTypes!!)\n    verify { style.getStyleLayerProperty(\"id\", \"clip-layer-types\") }\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = clipLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = clipLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = clipLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = clipLayer(\"id\", \"source\") { }\n    assertEquals(\"clip\", layer.getType())\n  }\n\n  @Test\n  fun getClipLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"clip\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as ClipLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"clip\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultClipLayerScopeTest() {\n    val testValue = listOf(\"a\", \"b\", \"c\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(\"a\", \"b\", \"c\")\n    assertEquals(expectedValue.toString(), ClipLayer.defaultClipLayerScope?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-scope\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultClipLayerScopeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ClipLayer.defaultClipLayerScopeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-scope\") }\n  }\n\n  @Test\n  fun defaultClipLayerScopeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"a\", \"b\", \"c\"))\n    assertEquals(\"[literal, [a, b, c]]\", ClipLayer.defaultClipLayerScopeAsExpression.toString())\n    assertEquals(listOf(\"a\", \"b\", \"c\"), ClipLayer.defaultClipLayerScope!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-scope\") }\n  }\n\n  @Test\n  fun defaultClipLayerTypesTest() {\n    val testValue = listOf(\"model\", \"symbol\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(\"model\", \"symbol\")\n    assertEquals(expectedValue.toString(), ClipLayer.defaultClipLayerTypes?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-types\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultClipLayerTypesAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ClipLayer.defaultClipLayerTypesAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-types\") }\n  }\n\n  @Test\n  fun defaultClipLayerTypesAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"model\", \"symbol\"))\n    assertEquals(\"[literal, [model, symbol]]\", ClipLayer.defaultClipLayerTypesAsExpression.toString())\n    assertEquals(listOf(\"model\", \"symbol\"), ClipLayer.defaultClipLayerTypes!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"clip-layer-types\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, ClipLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"clip\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/FillExtrusionLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass FillExtrusionLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=fill-extrusion}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=fill-extrusion, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=fill-extrusion}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun fillExtrusionEdgeRadiusSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionEdgeRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-edge-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionEdgeRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionEdgeRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-edge-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionEdgeRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionEdgeRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-edge-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionEdgeRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionEdgeRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-edge-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionEdgeRadiusAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionEdgeRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-edge-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionEdgeRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionEdgeRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionEdgeRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-edge-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundAttenuationSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionGroundAttenuation(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-attenuation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundAttenuationGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionAmbientOcclusionGroundAttenuation?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-attenuation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundAttenuationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionGroundAttenuation(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-attenuation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundAttenuationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionAmbientOcclusionGroundAttenuationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-attenuation\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundAttenuationAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionAmbientOcclusionGroundAttenuationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-attenuation\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundAttenuationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionGroundAttenuationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionGroundAttenuation!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-attenuation\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundAttenuationTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionGroundAttenuationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-attenuation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundAttenuationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionAmbientOcclusionGroundAttenuationTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-attenuation-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundAttenuationTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionGroundAttenuationTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-attenuation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundRadiusSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionGroundRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionAmbientOcclusionGroundRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionGroundRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionAmbientOcclusionGroundRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundRadiusAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionAmbientOcclusionGroundRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionGroundRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionGroundRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundRadiusTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionGroundRadiusTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundRadiusTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionAmbientOcclusionGroundRadiusTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-radius-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionGroundRadiusTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionGroundRadiusTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-ground-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionIntensitySet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionIntensity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionIntensityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionAmbientOcclusionIntensity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionAmbientOcclusionIntensityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionIntensity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionIntensityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionAmbientOcclusionIntensityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionIntensityAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionAmbientOcclusionIntensityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionIntensity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionIntensityTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionIntensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionIntensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionAmbientOcclusionIntensityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-intensity-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionIntensityTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionIntensityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionRadiusSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionAmbientOcclusionRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionAmbientOcclusionRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionAmbientOcclusionRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionRadiusAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionAmbientOcclusionRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionRadiusTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionRadiusTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionRadiusTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionAmbientOcclusionRadiusTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-radius-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionRadiusTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionRadiusTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionWallRadiusSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionWallRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-wall-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionWallRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionAmbientOcclusionWallRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-wall-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionAmbientOcclusionWallRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionWallRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-wall-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionWallRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionAmbientOcclusionWallRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-wall-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionWallRadiusAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionAmbientOcclusionWallRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-wall-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionWallRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionWallRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionWallRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-wall-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionWallRadiusTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionWallRadiusTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-wall-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionWallRadiusTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionAmbientOcclusionWallRadiusTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-wall-radius-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionAmbientOcclusionWallRadiusTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionAmbientOcclusionWallRadiusTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-ambient-occlusion-wall-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionBaseSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionBase(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-base\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionBaseGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionBase?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-base\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionBaseAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionBase(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-base\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionBaseAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionBaseAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-base\") }\n  }\n\n  @Test\n  fun fillExtrusionBaseAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionBaseAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-base\") }\n  }\n\n  @Test\n  fun fillExtrusionBaseAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionBaseAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionBase!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-base\") }\n  }\n\n  @Test\n  fun fillExtrusionBaseTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionBaseTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-base-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionBaseTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionBaseTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-base-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionBaseTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionBaseTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-base-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionBaseAlignmentSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionBaseAlignment(FillExtrusionBaseAlignment.TERRAIN)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-base-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"terrain\")\n  }\n\n  @Test\n  fun fillExtrusionBaseAlignmentGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"terrain\")\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(FillExtrusionBaseAlignment.TERRAIN, layer.fillExtrusionBaseAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-base-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionBaseAlignmentAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionBaseAlignment(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-base-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionBaseAlignmentAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionBaseAlignmentAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-base-alignment\") }\n  }\n\n  @Test\n  fun fillExtrusionBaseAlignmentAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionBaseAlignmentAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-base-alignment\") }\n  }\n\n  @Test\n  fun fillExtrusionBaseAlignmentAsExpressionGetFromLiteral() {\n    val value = \"terrain\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.fillExtrusionBaseAlignmentAsExpression?.toString())\n    assertEquals(FillExtrusionBaseAlignment.TERRAIN.value, layer.fillExtrusionBaseAlignmentAsExpression.toString())\n    assertEquals(FillExtrusionBaseAlignment.TERRAIN, layer.fillExtrusionBaseAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-base-alignment\") }\n  }\n\n  @Test\n  fun fillExtrusionCastShadowsSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.fillExtrusionCastShadows(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-cast-shadows\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun fillExtrusionCastShadowsGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.fillExtrusionCastShadows?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-cast-shadows\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionCastShadowsAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionCastShadows(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-cast-shadows\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionCastShadowsAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionCastShadowsAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-cast-shadows\") }\n  }\n\n  @Test\n  fun fillExtrusionCastShadowsAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionCastShadowsAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-cast-shadows\") }\n  }\n\n  @Test\n  fun fillExtrusionCastShadowsAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.fillExtrusionCastShadowsAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.fillExtrusionCastShadows)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-cast-shadows\") }\n  }\n\n  @Test\n  fun fillExtrusionColorSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.fillExtrusionColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun fillExtrusionColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.fillExtrusionColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color\") }\n  }\n\n  @Test\n  fun fillExtrusionColorUseThemeSetAfterInitialization() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.fillExtrusionColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun fillExtrusionColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"fill-extrusion-color-use-theme\"))\n  }\n\n  @Test\n  fun fillExtrusionColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.fillExtrusionColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun fillExtrusionColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color-use-theme\") }\n  }\n\n  @Test\n  fun fillExtrusionColorUseThemeAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color-use-theme\") }\n  }\n\n  @Test\n  fun fillExtrusionColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color-use-theme\") }\n  }\n\n  @Test\n  fun fillExtrusionColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.fillExtrusionColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color-use-theme\") }\n  }\n\n  @Test\n  fun fillExtrusionColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color\") }\n  }\n\n  @Test\n  fun fillExtrusionColorAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color\") }\n  }\n\n  @Test\n  fun fillExtrusionColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.fillExtrusionColor)\n    assertEquals(Color.BLACK, layer.fillExtrusionColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color\") }\n  }\n\n  @Test\n  fun fillExtrusionColorAsColorIntSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun fillExtrusionColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.fillExtrusionColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color\") }\n  }\n\n  @Test\n  fun fillExtrusionColorTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-color-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionColorTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionCutoffFadeRangeSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionCutoffFadeRange(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-cutoff-fade-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionCutoffFadeRangeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionCutoffFadeRange?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-cutoff-fade-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionCutoffFadeRangeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionCutoffFadeRange(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-cutoff-fade-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionCutoffFadeRangeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionCutoffFadeRangeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun fillExtrusionCutoffFadeRangeAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionCutoffFadeRangeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun fillExtrusionCutoffFadeRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionCutoffFadeRangeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionCutoffFadeRange!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun fillExtrusionEmissiveStrengthSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-emissive-strength\") }\n  }\n\n  @Test\n  fun fillExtrusionEmissiveStrengthAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-emissive-strength\") }\n  }\n\n  @Test\n  fun fillExtrusionEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-emissive-strength\") }\n  }\n\n  @Test\n  fun fillExtrusionEmissiveStrengthTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionEmissiveStrengthTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.fillExtrusionFloodLightColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorUseThemeSetAfterInitialization() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"fill-extrusion-flood-light-color-use-theme\"))\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.fillExtrusionFloodLightColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionFloodLightColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-use-theme\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorUseThemeAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionFloodLightColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-use-theme\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-use-theme\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.fillExtrusionFloodLightColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-use-theme\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionFloodLightColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.fillExtrusionFloodLightColor)\n    assertEquals(Color.BLACK, layer.fillExtrusionFloodLightColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorAsColorIntSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.fillExtrusionFloodLightColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionFloodLightColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightColorTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundAttenuationSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightGroundAttenuation(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-attenuation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundAttenuationGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionFloodLightGroundAttenuation?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-attenuation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionFloodLightGroundAttenuationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightGroundAttenuation(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-attenuation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundAttenuationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightGroundAttenuationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-attenuation\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundAttenuationAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionFloodLightGroundAttenuationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-attenuation\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundAttenuationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionFloodLightGroundAttenuationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionFloodLightGroundAttenuation!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-attenuation\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundAttenuationTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightGroundAttenuationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-attenuation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundAttenuationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionFloodLightGroundAttenuationTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-attenuation-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundAttenuationTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightGroundAttenuationTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-attenuation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundRadiusSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightGroundRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionFloodLightGroundRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionFloodLightGroundRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightGroundRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightGroundRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundRadiusAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionFloodLightGroundRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionFloodLightGroundRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionFloodLightGroundRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundRadiusTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightGroundRadiusTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundRadiusTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionFloodLightGroundRadiusTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-radius-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightGroundRadiusTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightGroundRadiusTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-ground-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightIntensitySet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightIntensity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightIntensityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionFloodLightIntensity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionFloodLightIntensityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightIntensity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightIntensityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightIntensityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-intensity\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightIntensityAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionFloodLightIntensityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-intensity\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionFloodLightIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionFloodLightIntensity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-intensity\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightIntensityTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightIntensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightIntensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionFloodLightIntensityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-intensity-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightIntensityTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightIntensityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightWallRadiusSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightWallRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-wall-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightWallRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionFloodLightWallRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-wall-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionFloodLightWallRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightWallRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-wall-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightWallRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightWallRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-wall-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightWallRadiusAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionFloodLightWallRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-wall-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightWallRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionFloodLightWallRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionFloodLightWallRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-wall-radius\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightWallRadiusTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightWallRadiusTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-wall-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionFloodLightWallRadiusTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionFloodLightWallRadiusTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-wall-radius-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionFloodLightWallRadiusTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionFloodLightWallRadiusTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-flood-light-wall-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionHeightSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionHeight(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-height\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionHeightGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionHeight?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-height\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionHeightAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionHeight(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-height\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionHeightAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionHeightAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-height\") }\n  }\n\n  @Test\n  fun fillExtrusionHeightAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionHeightAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-height\") }\n  }\n\n  @Test\n  fun fillExtrusionHeightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionHeightAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionHeight!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-height\") }\n  }\n\n  @Test\n  fun fillExtrusionHeightTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionHeightTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-height-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionHeightTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionHeightTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-height-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionHeightTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionHeightTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-height-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionHeightAlignmentSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionHeightAlignment(FillExtrusionHeightAlignment.TERRAIN)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-height-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"terrain\")\n  }\n\n  @Test\n  fun fillExtrusionHeightAlignmentGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"terrain\")\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(FillExtrusionHeightAlignment.TERRAIN, layer.fillExtrusionHeightAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-height-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionHeightAlignmentAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionHeightAlignment(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-height-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionHeightAlignmentAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionHeightAlignmentAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-height-alignment\") }\n  }\n\n  @Test\n  fun fillExtrusionHeightAlignmentAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionHeightAlignmentAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-height-alignment\") }\n  }\n\n  @Test\n  fun fillExtrusionHeightAlignmentAsExpressionGetFromLiteral() {\n    val value = \"terrain\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.fillExtrusionHeightAlignmentAsExpression?.toString())\n    assertEquals(FillExtrusionHeightAlignment.TERRAIN.value, layer.fillExtrusionHeightAlignmentAsExpression.toString())\n    assertEquals(FillExtrusionHeightAlignment.TERRAIN, layer.fillExtrusionHeightAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-height-alignment\") }\n  }\n\n  @Test\n  fun fillExtrusionLineWidthSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionLineWidth(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-line-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionLineWidthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionLineWidth?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-line-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionLineWidthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionLineWidth(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-line-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionLineWidthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionLineWidthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-line-width\") }\n  }\n\n  @Test\n  fun fillExtrusionLineWidthAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionLineWidthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-line-width\") }\n  }\n\n  @Test\n  fun fillExtrusionLineWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionLineWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionLineWidth!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-line-width\") }\n  }\n\n  @Test\n  fun fillExtrusionLineWidthTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionLineWidthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-line-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionLineWidthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionLineWidthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-line-width-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionLineWidthTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionLineWidthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-line-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionOpacitySet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-opacity\") }\n  }\n\n  @Test\n  fun fillExtrusionOpacityAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-opacity\") }\n  }\n\n  @Test\n  fun fillExtrusionOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-opacity\") }\n  }\n\n  @Test\n  fun fillExtrusionOpacityTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-opacity-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionOpacityTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionPatternSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.fillExtrusionPattern(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-pattern\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun fillExtrusionPatternGet() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.fillExtrusionPattern?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-pattern\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionPatternAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionPattern(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-pattern\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionPatternAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionPatternAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-pattern\") }\n  }\n\n  @Test\n  fun fillExtrusionPatternAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionPatternAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-pattern\") }\n  }\n\n  @Test\n  fun fillExtrusionPatternAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.fillExtrusionPatternAsExpression.toString())\n    assertEquals(\"abc\", layer.fillExtrusionPattern)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-pattern\") }\n  }\n\n  @Test\n  fun fillExtrusionPatternCrossFadeSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionPatternCrossFade(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-pattern-cross-fade\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionPatternCrossFadeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionPatternCrossFade?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-pattern-cross-fade\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionPatternCrossFadeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionPatternCrossFade(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-pattern-cross-fade\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionPatternCrossFadeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionPatternCrossFadeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun fillExtrusionPatternCrossFadeAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionPatternCrossFadeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun fillExtrusionPatternCrossFadeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionPatternCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionPatternCrossFade!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun fillExtrusionRoundedRoofSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.fillExtrusionRoundedRoof(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-rounded-roof\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun fillExtrusionRoundedRoofGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.fillExtrusionRoundedRoof?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-rounded-roof\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionRoundedRoofAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionRoundedRoof(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-rounded-roof\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionRoundedRoofAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionRoundedRoofAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-rounded-roof\") }\n  }\n\n  @Test\n  fun fillExtrusionRoundedRoofAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionRoundedRoofAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-rounded-roof\") }\n  }\n\n  @Test\n  fun fillExtrusionRoundedRoofAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.fillExtrusionRoundedRoofAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.fillExtrusionRoundedRoof)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-rounded-roof\") }\n  }\n\n  @Test\n  fun fillExtrusionTranslateSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.fillExtrusionTranslate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun fillExtrusionTranslateGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.fillExtrusionTranslate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionTranslateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionTranslate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionTranslateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionTranslateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-translate\") }\n  }\n\n  @Test\n  fun fillExtrusionTranslateAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionTranslateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-translate\") }\n  }\n\n  @Test\n  fun fillExtrusionTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.fillExtrusionTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.fillExtrusionTranslate!!)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-translate\") }\n  }\n\n  @Test\n  fun fillExtrusionTranslateTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionTranslateTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionTranslateTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionTranslateTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-translate-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionTranslateTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionTranslateTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionTranslateAnchorSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionTranslateAnchor(FillExtrusionTranslateAnchor.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun fillExtrusionTranslateAnchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(FillExtrusionTranslateAnchor.MAP, layer.fillExtrusionTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionTranslateAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionTranslateAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionTranslateAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionTranslateAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-translate-anchor\") }\n  }\n\n  @Test\n  fun fillExtrusionTranslateAnchorAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionTranslateAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-translate-anchor\") }\n  }\n\n  @Test\n  fun fillExtrusionTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.fillExtrusionTranslateAnchorAsExpression?.toString())\n    assertEquals(FillExtrusionTranslateAnchor.MAP.value, layer.fillExtrusionTranslateAnchorAsExpression.toString())\n    assertEquals(FillExtrusionTranslateAnchor.MAP, layer.fillExtrusionTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-translate-anchor\") }\n  }\n\n  @Test\n  fun fillExtrusionVerticalGradientSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.fillExtrusionVerticalGradient(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-vertical-gradient\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun fillExtrusionVerticalGradientGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.fillExtrusionVerticalGradient?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-vertical-gradient\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionVerticalGradientAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionVerticalGradient(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-vertical-gradient\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionVerticalGradientAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionVerticalGradientAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-vertical-gradient\") }\n  }\n\n  @Test\n  fun fillExtrusionVerticalGradientAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionVerticalGradientAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-vertical-gradient\") }\n  }\n\n  @Test\n  fun fillExtrusionVerticalGradientAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.fillExtrusionVerticalGradientAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.fillExtrusionVerticalGradient)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-vertical-gradient\") }\n  }\n\n  @Test\n  fun fillExtrusionVerticalScaleSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillExtrusionVerticalScale(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-vertical-scale\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillExtrusionVerticalScaleGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillExtrusionVerticalScale?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-vertical-scale\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillExtrusionVerticalScaleAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionVerticalScale(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-vertical-scale\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillExtrusionVerticalScaleAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillExtrusionVerticalScaleAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-vertical-scale\") }\n  }\n\n  @Test\n  fun fillExtrusionVerticalScaleAsExpressionGetNull() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillExtrusionVerticalScaleAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-vertical-scale\") }\n  }\n\n  @Test\n  fun fillExtrusionVerticalScaleAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillExtrusionVerticalScaleAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionVerticalScale!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-vertical-scale\") }\n  }\n\n  @Test\n  fun fillExtrusionVerticalScaleTransitionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionVerticalScaleTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-vertical-scale-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillExtrusionVerticalScaleTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillExtrusionVerticalScaleTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-extrusion-vertical-scale-transition\") }\n  }\n\n  @Test\n  fun fillExtrusionVerticalScaleTransitionSetDsl() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillExtrusionVerticalScaleTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-extrusion-vertical-scale-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") { }\n    assertEquals(\"fill-extrusion\", layer.getType())\n  }\n\n  @Test\n  fun getFillExtrusionLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"fill-extrusion\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as FillExtrusionLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"fill-extrusion\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultFillExtrusionEdgeRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionEdgeRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-edge-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionEdgeRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionEdgeRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-edge-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionEdgeRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionEdgeRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionEdgeRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-edge-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionGroundAttenuationTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuation?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-attenuation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-attenuation\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuation!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-attenuation\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionGroundAttenuationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuationTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-attenuation-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionGroundRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionGroundRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadiusTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-ground-radius-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionIntensityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionIntensityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-intensity-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadiusTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-radius-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionWallRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-wall-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionWallRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-wall-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionWallRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-wall-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionAmbientOcclusionWallRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadiusTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-ambient-occlusion-wall-radius-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionBaseTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionBase?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionBaseAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionBaseAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionBaseAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionBaseAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionBase!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionBaseTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionBaseTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionBaseAlignmentTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"terrain\")\n\n    assertEquals(FillExtrusionBaseAlignment.TERRAIN, FillExtrusionLayer.defaultFillExtrusionBaseAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionBaseAlignmentAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionBaseAlignmentAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base-alignment\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionBaseAlignmentAsExpressionGetFromLiteral() {\n    val value = \"terrain\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), FillExtrusionLayer.defaultFillExtrusionBaseAlignmentAsExpression?.toString())\n    assertEquals(FillExtrusionBaseAlignment.TERRAIN.value, FillExtrusionLayer.defaultFillExtrusionBaseAlignmentAsExpression.toString())\n    assertEquals(FillExtrusionBaseAlignment.TERRAIN, FillExtrusionLayer.defaultFillExtrusionBaseAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-base-alignment\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionCastShadowsTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionCastShadows?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cast-shadows\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionCastShadowsAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionCastShadowsAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cast-shadows\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionCastShadowsAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", FillExtrusionLayer.defaultFillExtrusionCastShadowsAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, FillExtrusionLayer.defaultFillExtrusionCastShadows)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cast-shadows\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, FillExtrusionLayer.defaultFillExtrusionColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", FillExtrusionLayer.defaultFillExtrusionColor)\n    assertEquals(Color.BLACK, FillExtrusionLayer.defaultFillExtrusionColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, FillExtrusionLayer.defaultFillExtrusionColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-color-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionCutoffFadeRangeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionCutoffFadeRange?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cutoff-fade-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionCutoffFadeRangeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionCutoffFadeRangeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionCutoffFadeRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionCutoffFadeRangeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionCutoffFadeRange!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, FillExtrusionLayer.defaultFillExtrusionFloodLightColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionFloodLightColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", FillExtrusionLayer.defaultFillExtrusionFloodLightColor)\n    assertEquals(Color.BLACK, FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-color-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightGroundAttenuationTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuation?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-attenuation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionFloodLightGroundAttenuationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-attenuation\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightGroundAttenuationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuation!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-attenuation\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightGroundAttenuationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuationTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-attenuation-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightGroundRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionFloodLightGroundRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightGroundRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightGroundRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadiusTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-ground-radius-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightIntensityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightIntensity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionFloodLightIntensityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightIntensityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-intensity\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionFloodLightIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionFloodLightIntensity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-intensity\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightIntensityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-intensity-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightWallRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-wall-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionFloodLightWallRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-wall-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightWallRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-wall-radius\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionFloodLightWallRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadiusTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-flood-light-wall-radius-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionHeightTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionHeight?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionHeightAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionHeightAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionHeightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionHeightAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionHeight!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionHeightTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionHeightTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionHeightAlignmentTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"terrain\")\n\n    assertEquals(FillExtrusionHeightAlignment.TERRAIN, FillExtrusionLayer.defaultFillExtrusionHeightAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionHeightAlignmentAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionHeightAlignmentAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height-alignment\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionHeightAlignmentAsExpressionGetFromLiteral() {\n    val value = \"terrain\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), FillExtrusionLayer.defaultFillExtrusionHeightAlignmentAsExpression?.toString())\n    assertEquals(FillExtrusionHeightAlignment.TERRAIN.value, FillExtrusionLayer.defaultFillExtrusionHeightAlignmentAsExpression.toString())\n    assertEquals(FillExtrusionHeightAlignment.TERRAIN, FillExtrusionLayer.defaultFillExtrusionHeightAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-height-alignment\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionLineWidthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionLineWidth?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-line-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionLineWidthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionLineWidthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-line-width\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionLineWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionLineWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionLineWidth!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-line-width\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionLineWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionLineWidthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-line-width-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-opacity\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-opacity\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionPatternTest() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionPattern?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionPatternAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionPatternAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionPatternAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    assertEquals(\"abc\", FillExtrusionLayer.defaultFillExtrusionPatternAsExpression.toString())\n    assertEquals(\"abc\", FillExtrusionLayer.defaultFillExtrusionPattern)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionPatternCrossFadeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionPatternCrossFade?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern-cross-fade\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionPatternCrossFadeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionPatternCrossFadeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionPatternCrossFadeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionPatternCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionPatternCrossFade!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionRoundedRoofTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionRoundedRoof?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-rounded-roof\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionRoundedRoofAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionRoundedRoofAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-rounded-roof\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionRoundedRoofAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", FillExtrusionLayer.defaultFillExtrusionRoundedRoofAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, FillExtrusionLayer.defaultFillExtrusionRoundedRoof)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-rounded-roof\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionTranslate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionTranslateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionTranslateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", FillExtrusionLayer.defaultFillExtrusionTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), FillExtrusionLayer.defaultFillExtrusionTranslate!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionTranslateTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate-transition\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionTranslateAnchorTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(FillExtrusionTranslateAnchor.MAP, FillExtrusionLayer.defaultFillExtrusionTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionTranslateAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionTranslateAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), FillExtrusionLayer.defaultFillExtrusionTranslateAnchorAsExpression?.toString())\n    assertEquals(FillExtrusionTranslateAnchor.MAP.value, FillExtrusionLayer.defaultFillExtrusionTranslateAnchorAsExpression.toString())\n    assertEquals(FillExtrusionTranslateAnchor.MAP, FillExtrusionLayer.defaultFillExtrusionTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionVerticalGradientTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionVerticalGradient?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-gradient\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionVerticalGradientAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionVerticalGradientAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-gradient\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionVerticalGradientAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", FillExtrusionLayer.defaultFillExtrusionVerticalGradientAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, FillExtrusionLayer.defaultFillExtrusionVerticalGradient)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-gradient\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionVerticalScaleTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillExtrusionLayer.defaultFillExtrusionVerticalScale?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-scale\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillExtrusionVerticalScaleAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillExtrusionLayer.defaultFillExtrusionVerticalScaleAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-scale\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionVerticalScaleAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionVerticalScaleAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillExtrusionLayer.defaultFillExtrusionVerticalScale!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-scale\") }\n  }\n\n  @Test\n  fun defaultFillExtrusionVerticalScaleTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillExtrusionLayer.defaultFillExtrusionVerticalScaleTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"fill-extrusion-vertical-scale-transition\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, FillExtrusionLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill-extrusion\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/FillLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass FillLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = fillLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=fill}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = fillLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=fill, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = fillLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=fill}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun fillConstructBridgeGuardRailSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.fillConstructBridgeGuardRail(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-construct-bridge-guard-rail\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun fillConstructBridgeGuardRailGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.fillConstructBridgeGuardRail?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-construct-bridge-guard-rail\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillConstructBridgeGuardRailAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillConstructBridgeGuardRail(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-construct-bridge-guard-rail\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillConstructBridgeGuardRailAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillConstructBridgeGuardRailAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-construct-bridge-guard-rail\") }\n  }\n\n  @Test\n  fun fillConstructBridgeGuardRailAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillConstructBridgeGuardRailAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-construct-bridge-guard-rail\") }\n  }\n\n  @Test\n  fun fillConstructBridgeGuardRailAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.fillConstructBridgeGuardRailAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.fillConstructBridgeGuardRail)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-construct-bridge-guard-rail\") }\n  }\n\n  @Test\n  fun fillElevationReferenceSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillElevationReference(FillElevationReference.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun fillElevationReferenceGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(FillElevationReference.NONE, layer.fillElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillElevationReferenceAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillElevationReference(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillElevationReferenceAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillElevationReferenceAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-elevation-reference\") }\n  }\n\n  @Test\n  fun fillElevationReferenceAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillElevationReferenceAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-elevation-reference\") }\n  }\n\n  @Test\n  fun fillElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.fillElevationReferenceAsExpression?.toString())\n    assertEquals(FillElevationReference.NONE.value, layer.fillElevationReferenceAsExpression.toString())\n    assertEquals(FillElevationReference.NONE, layer.fillElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-elevation-reference\") }\n  }\n\n  @Test\n  fun fillSortKeySet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillSortKey(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-sort-key\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillSortKeyGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillSortKey?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-sort-key\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillSortKeyAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillSortKey(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-sort-key\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillSortKeyAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillSortKeyAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-sort-key\") }\n  }\n\n  @Test\n  fun fillSortKeyAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillSortKeyAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-sort-key\") }\n  }\n\n  @Test\n  fun fillSortKeyAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillSortKeyAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillSortKey!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-sort-key\") }\n  }\n\n  @Test\n  fun fillAntialiasSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.fillAntialias(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-antialias\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun fillAntialiasGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.fillAntialias?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-antialias\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillAntialiasAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillAntialias(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-antialias\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillAntialiasAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillAntialiasAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-antialias\") }\n  }\n\n  @Test\n  fun fillAntialiasAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillAntialiasAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-antialias\") }\n  }\n\n  @Test\n  fun fillAntialiasAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.fillAntialiasAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.fillAntialias)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-antialias\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.fillBridgeGuardRailColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.fillBridgeGuardRailColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorUseThemeSetAfterInitialization() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.fillBridgeGuardRailColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"fill-bridge-guard-rail-color-use-theme\"))\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.fillBridgeGuardRailColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillBridgeGuardRailColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillBridgeGuardRailColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillBridgeGuardRailColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-use-theme\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorUseThemeAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.fillBridgeGuardRailColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-use-theme\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillBridgeGuardRailColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-use-theme\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.fillBridgeGuardRailColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-use-theme\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillBridgeGuardRailColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillBridgeGuardRailColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillBridgeGuardRailColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillBridgeGuardRailColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.fillBridgeGuardRailColor)\n    assertEquals(Color.BLACK, layer.fillBridgeGuardRailColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorAsColorIntSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillBridgeGuardRailColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.fillBridgeGuardRailColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorTransitionSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillBridgeGuardRailColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillBridgeGuardRailColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-transition\") }\n  }\n\n  @Test\n  fun fillBridgeGuardRailColorTransitionSetDsl() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillBridgeGuardRailColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-bridge-guard-rail-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillColorSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.fillColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun fillColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.fillColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color\") }\n  }\n\n  @Test\n  fun fillColorUseThemeSetAfterInitialization() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.fillColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun fillColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"fill-color-use-theme\"))\n  }\n\n  @Test\n  fun fillColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.fillColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun fillColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color-use-theme\") }\n  }\n\n  @Test\n  fun fillColorUseThemeAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.fillColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color-use-theme\") }\n  }\n\n  @Test\n  fun fillColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color-use-theme\") }\n  }\n\n  @Test\n  fun fillColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.fillColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color-use-theme\") }\n  }\n\n  @Test\n  fun fillColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color\") }\n  }\n\n  @Test\n  fun fillColorAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color\") }\n  }\n\n  @Test\n  fun fillColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.fillColor)\n    assertEquals(Color.BLACK, layer.fillColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color\") }\n  }\n\n  @Test\n  fun fillColorAsColorIntSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun fillColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.fillColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color\") }\n  }\n\n  @Test\n  fun fillColorTransitionSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-color-transition\") }\n  }\n\n  @Test\n  fun fillColorTransitionSetDsl() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillEmissiveStrengthSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-emissive-strength\") }\n  }\n\n  @Test\n  fun fillEmissiveStrengthAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-emissive-strength\") }\n  }\n\n  @Test\n  fun fillEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-emissive-strength\") }\n  }\n\n  @Test\n  fun fillEmissiveStrengthTransitionSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun fillEmissiveStrengthTransitionSetDsl() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillOpacitySet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-opacity\") }\n  }\n\n  @Test\n  fun fillOpacityAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-opacity\") }\n  }\n\n  @Test\n  fun fillOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-opacity\") }\n  }\n\n  @Test\n  fun fillOpacityTransitionSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-opacity-transition\") }\n  }\n\n  @Test\n  fun fillOpacityTransitionSetDsl() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillOutlineColorSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.fillOutlineColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-outline-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun fillOutlineColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.fillOutlineColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color\") }\n  }\n\n  @Test\n  fun fillOutlineColorUseThemeSetAfterInitialization() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.fillOutlineColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-outline-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun fillOutlineColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"fill-outline-color-use-theme\"))\n  }\n\n  @Test\n  fun fillOutlineColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.fillOutlineColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillOutlineColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillOutlineColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-outline-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun fillOutlineColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillOutlineColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color-use-theme\") }\n  }\n\n  @Test\n  fun fillOutlineColorUseThemeAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.fillOutlineColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color-use-theme\") }\n  }\n\n  @Test\n  fun fillOutlineColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillOutlineColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color-use-theme\") }\n  }\n\n  @Test\n  fun fillOutlineColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.fillOutlineColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color-use-theme\") }\n  }\n\n  @Test\n  fun fillOutlineColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillOutlineColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-outline-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillOutlineColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillOutlineColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color\") }\n  }\n\n  @Test\n  fun fillOutlineColorAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillOutlineColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color\") }\n  }\n\n  @Test\n  fun fillOutlineColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillOutlineColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.fillOutlineColor)\n    assertEquals(Color.BLACK, layer.fillOutlineColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color\") }\n  }\n\n  @Test\n  fun fillOutlineColorAsColorIntSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillOutlineColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-outline-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun fillOutlineColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.fillOutlineColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color\") }\n  }\n\n  @Test\n  fun fillOutlineColorTransitionSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillOutlineColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-outline-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillOutlineColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillOutlineColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-outline-color-transition\") }\n  }\n\n  @Test\n  fun fillOutlineColorTransitionSetDsl() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillOutlineColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-outline-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillPatternSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.fillPattern(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-pattern\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun fillPatternGet() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.fillPattern?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-pattern\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillPatternAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillPattern(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-pattern\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillPatternAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillPatternAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-pattern\") }\n  }\n\n  @Test\n  fun fillPatternAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillPatternAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-pattern\") }\n  }\n\n  @Test\n  fun fillPatternAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.fillPatternAsExpression.toString())\n    assertEquals(\"abc\", layer.fillPattern)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-pattern\") }\n  }\n\n  @Test\n  fun fillPatternCrossFadeSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillPatternCrossFade(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-pattern-cross-fade\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillPatternCrossFadeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillPatternCrossFade?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-pattern-cross-fade\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillPatternCrossFadeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillPatternCrossFade(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-pattern-cross-fade\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillPatternCrossFadeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillPatternCrossFadeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun fillPatternCrossFadeAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillPatternCrossFadeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun fillPatternCrossFadeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillPatternCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillPatternCrossFade!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun fillTranslateSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.fillTranslate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun fillTranslateGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.fillTranslate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillTranslateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTranslate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillTranslateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillTranslateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-translate\") }\n  }\n\n  @Test\n  fun fillTranslateAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillTranslateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-translate\") }\n  }\n\n  @Test\n  fun fillTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.fillTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.fillTranslate!!)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-translate\") }\n  }\n\n  @Test\n  fun fillTranslateTransitionSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTranslateTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillTranslateTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillTranslateTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-translate-transition\") }\n  }\n\n  @Test\n  fun fillTranslateTransitionSetDsl() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTranslateTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillTranslateAnchorSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTranslateAnchor(FillTranslateAnchor.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun fillTranslateAnchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(FillTranslateAnchor.MAP, layer.fillTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillTranslateAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTranslateAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillTranslateAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillTranslateAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-translate-anchor\") }\n  }\n\n  @Test\n  fun fillTranslateAnchorAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillTranslateAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-translate-anchor\") }\n  }\n\n  @Test\n  fun fillTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.fillTranslateAnchorAsExpression?.toString())\n    assertEquals(FillTranslateAnchor.MAP.value, layer.fillTranslateAnchorAsExpression.toString())\n    assertEquals(FillTranslateAnchor.MAP, layer.fillTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-translate-anchor\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.fillTunnelStructureColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-tunnel-structure-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun fillTunnelStructureColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.fillTunnelStructureColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorUseThemeSetAfterInitialization() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.fillTunnelStructureColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun fillTunnelStructureColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"fill-tunnel-structure-color-use-theme\"))\n  }\n\n  @Test\n  fun fillTunnelStructureColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.fillTunnelStructureColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillTunnelStructureColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTunnelStructureColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun fillTunnelStructureColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillTunnelStructureColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-use-theme\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorUseThemeAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.fillTunnelStructureColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-use-theme\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillTunnelStructureColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-use-theme\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.fillTunnelStructureColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-use-theme\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTunnelStructureColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-tunnel-structure-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillTunnelStructureColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillTunnelStructureColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillTunnelStructureColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillTunnelStructureColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.fillTunnelStructureColor)\n    assertEquals(Color.BLACK, layer.fillTunnelStructureColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorAsColorIntSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTunnelStructureColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-tunnel-structure-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun fillTunnelStructureColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.fillTunnelStructureColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorTransitionSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTunnelStructureColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillTunnelStructureColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillTunnelStructureColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-transition\") }\n  }\n\n  @Test\n  fun fillTunnelStructureColorTransitionSetDsl() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillTunnelStructureColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-tunnel-structure-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillZOffsetSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.fillZOffset(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-z-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun fillZOffsetGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.fillZOffset?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-z-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun fillZOffsetAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillZOffset(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"fill-z-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun fillZOffsetAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.fillZOffsetAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-z-offset\") }\n  }\n\n  @Test\n  fun fillZOffsetAsExpressionGetNull() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.fillZOffsetAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-z-offset\") }\n  }\n\n  @Test\n  fun fillZOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.fillZOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillZOffset!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"fill-z-offset\") }\n  }\n\n  @Test\n  fun fillZOffsetTransitionSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillZOffsetTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"fill-z-offset-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun fillZOffsetTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.fillZOffsetTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"fill-z-offset-transition\") }\n  }\n\n  @Test\n  fun fillZOffsetTransitionSetDsl() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.fillZOffsetTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"fill-z-offset-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = fillLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = fillLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = fillLayer(\"id\", \"source\") { }\n    assertEquals(\"fill\", layer.getType())\n  }\n\n  @Test\n  fun getFillLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"fill\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as FillLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"fill\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultFillConstructBridgeGuardRailTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillConstructBridgeGuardRail?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-construct-bridge-guard-rail\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillConstructBridgeGuardRailAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillConstructBridgeGuardRailAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-construct-bridge-guard-rail\") }\n  }\n\n  @Test\n  fun defaultFillConstructBridgeGuardRailAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", FillLayer.defaultFillConstructBridgeGuardRailAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, FillLayer.defaultFillConstructBridgeGuardRail)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-construct-bridge-guard-rail\") }\n  }\n\n  @Test\n  fun defaultFillElevationReferenceTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(FillElevationReference.NONE, FillLayer.defaultFillElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillElevationReferenceAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillElevationReferenceAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultFillElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), FillLayer.defaultFillElevationReferenceAsExpression?.toString())\n    assertEquals(FillElevationReference.NONE.value, FillLayer.defaultFillElevationReferenceAsExpression.toString())\n    assertEquals(FillElevationReference.NONE, FillLayer.defaultFillElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultFillSortKeyTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillSortKey?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-sort-key\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillSortKeyAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillSortKeyAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-sort-key\") }\n  }\n\n  @Test\n  fun defaultFillSortKeyAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillLayer.defaultFillSortKeyAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillLayer.defaultFillSortKey!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-sort-key\") }\n  }\n\n  @Test\n  fun defaultFillAntialiasTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillAntialias?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-antialias\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillAntialiasAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillAntialiasAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-antialias\") }\n  }\n\n  @Test\n  fun defaultFillAntialiasAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", FillLayer.defaultFillAntialiasAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, FillLayer.defaultFillAntialias)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-antialias\") }\n  }\n\n  @Test\n  fun defaultFillBridgeGuardRailColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillBridgeGuardRailColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color\") }\n  }\n\n  @Test\n  fun defaultFillBridgeGuardRailColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, FillLayer.defaultFillBridgeGuardRailColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultFillBridgeGuardRailColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillBridgeGuardRailColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color\") }\n  }\n\n  @Test\n  fun defaultFillBridgeGuardRailColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), FillLayer.defaultFillBridgeGuardRailColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", FillLayer.defaultFillBridgeGuardRailColor)\n    assertEquals(Color.BLACK, FillLayer.defaultFillBridgeGuardRailColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color\") }\n  }\n\n  @Test\n  fun defaultFillBridgeGuardRailColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, FillLayer.defaultFillBridgeGuardRailColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color\") }\n  }\n\n  @Test\n  fun defaultFillBridgeGuardRailColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillLayer.defaultFillBridgeGuardRailColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-bridge-guard-rail-color-transition\") }\n  }\n\n  @Test\n  fun defaultFillColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color\") }\n  }\n\n  @Test\n  fun defaultFillColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, FillLayer.defaultFillColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultFillColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color\") }\n  }\n\n  @Test\n  fun defaultFillColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), FillLayer.defaultFillColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", FillLayer.defaultFillColor)\n    assertEquals(Color.BLACK, FillLayer.defaultFillColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color\") }\n  }\n\n  @Test\n  fun defaultFillColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, FillLayer.defaultFillColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color\") }\n  }\n\n  @Test\n  fun defaultFillColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillLayer.defaultFillColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-color-transition\") }\n  }\n\n  @Test\n  fun defaultFillEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultFillEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillLayer.defaultFillEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillLayer.defaultFillEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultFillEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillLayer.defaultFillEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultFillOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-opacity\") }\n  }\n\n  @Test\n  fun defaultFillOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillLayer.defaultFillOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillLayer.defaultFillOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-opacity\") }\n  }\n\n  @Test\n  fun defaultFillOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillLayer.defaultFillOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultFillOutlineColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillOutlineColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color\") }\n  }\n\n  @Test\n  fun defaultFillOutlineColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, FillLayer.defaultFillOutlineColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultFillOutlineColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillOutlineColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color\") }\n  }\n\n  @Test\n  fun defaultFillOutlineColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), FillLayer.defaultFillOutlineColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", FillLayer.defaultFillOutlineColor)\n    assertEquals(Color.BLACK, FillLayer.defaultFillOutlineColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color\") }\n  }\n\n  @Test\n  fun defaultFillOutlineColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, FillLayer.defaultFillOutlineColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color\") }\n  }\n\n  @Test\n  fun defaultFillOutlineColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillLayer.defaultFillOutlineColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-outline-color-transition\") }\n  }\n\n  @Test\n  fun defaultFillPatternTest() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillPattern?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillPatternAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillPatternAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern\") }\n  }\n\n  @Test\n  fun defaultFillPatternAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    assertEquals(\"abc\", FillLayer.defaultFillPatternAsExpression.toString())\n    assertEquals(\"abc\", FillLayer.defaultFillPattern)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern\") }\n  }\n\n  @Test\n  fun defaultFillPatternCrossFadeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillPatternCrossFade?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern-cross-fade\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillPatternCrossFadeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillPatternCrossFadeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun defaultFillPatternCrossFadeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillLayer.defaultFillPatternCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillLayer.defaultFillPatternCrossFade!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun defaultFillTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillTranslate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillTranslateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillTranslateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate\") }\n  }\n\n  @Test\n  fun defaultFillTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", FillLayer.defaultFillTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), FillLayer.defaultFillTranslate!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate\") }\n  }\n\n  @Test\n  fun defaultFillTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillLayer.defaultFillTranslateTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate-transition\") }\n  }\n\n  @Test\n  fun defaultFillTranslateAnchorTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(FillTranslateAnchor.MAP, FillLayer.defaultFillTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillTranslateAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillTranslateAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultFillTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), FillLayer.defaultFillTranslateAnchorAsExpression?.toString())\n    assertEquals(FillTranslateAnchor.MAP.value, FillLayer.defaultFillTranslateAnchorAsExpression.toString())\n    assertEquals(FillTranslateAnchor.MAP, FillLayer.defaultFillTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultFillTunnelStructureColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillTunnelStructureColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color\") }\n  }\n\n  @Test\n  fun defaultFillTunnelStructureColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, FillLayer.defaultFillTunnelStructureColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultFillTunnelStructureColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillTunnelStructureColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color\") }\n  }\n\n  @Test\n  fun defaultFillTunnelStructureColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), FillLayer.defaultFillTunnelStructureColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", FillLayer.defaultFillTunnelStructureColor)\n    assertEquals(Color.BLACK, FillLayer.defaultFillTunnelStructureColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color\") }\n  }\n\n  @Test\n  fun defaultFillTunnelStructureColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, FillLayer.defaultFillTunnelStructureColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color\") }\n  }\n\n  @Test\n  fun defaultFillTunnelStructureColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillLayer.defaultFillTunnelStructureColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-tunnel-structure-color-transition\") }\n  }\n\n  @Test\n  fun defaultFillZOffsetTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), FillLayer.defaultFillZOffset?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-z-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultFillZOffsetAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), FillLayer.defaultFillZOffsetAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-z-offset\") }\n  }\n\n  @Test\n  fun defaultFillZOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, FillLayer.defaultFillZOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, FillLayer.defaultFillZOffset!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-z-offset\") }\n  }\n\n  @Test\n  fun defaultFillZOffsetTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), FillLayer.defaultFillZOffsetTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-z-offset-transition\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, FillLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/HeatmapLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass HeatmapLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = heatmapLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=heatmap}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = heatmapLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=heatmap, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = heatmapLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=heatmap}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun heatmapColorSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    layer.bindTo(style)\n    layer.heatmapColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[interpolate, [linear], [heatmap-density], 0.0, [rgba, 0.0, 0.0, 0.0, 0.0], 1.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\")\n  }\n\n  @Test\n  fun heatmapColorGet() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    assertEquals(expectedValue.toString(), layer.heatmapColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-color\") }\n  }\n\n  @Test\n  fun heatmapColorUseThemeSetAfterInitialization() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.heatmapColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun heatmapColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"heatmap-color-use-theme\"))\n  }\n\n  @Test\n  fun heatmapColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.heatmapColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun heatmapIntensitySet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.heatmapIntensity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun heatmapIntensityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.heatmapIntensity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun heatmapIntensityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapIntensity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun heatmapIntensityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.heatmapIntensityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-intensity\") }\n  }\n\n  @Test\n  fun heatmapIntensityAsExpressionGetNull() {\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.heatmapIntensityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-intensity\") }\n  }\n\n  @Test\n  fun heatmapIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.heatmapIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.heatmapIntensity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-intensity\") }\n  }\n\n  @Test\n  fun heatmapIntensityTransitionSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapIntensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun heatmapIntensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.heatmapIntensityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-intensity-transition\") }\n  }\n\n  @Test\n  fun heatmapIntensityTransitionSetDsl() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapIntensityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun heatmapOpacitySet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.heatmapOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun heatmapOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.heatmapOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun heatmapOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun heatmapOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.heatmapOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-opacity\") }\n  }\n\n  @Test\n  fun heatmapOpacityAsExpressionGetNull() {\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.heatmapOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-opacity\") }\n  }\n\n  @Test\n  fun heatmapOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.heatmapOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.heatmapOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-opacity\") }\n  }\n\n  @Test\n  fun heatmapOpacityTransitionSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun heatmapOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.heatmapOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-opacity-transition\") }\n  }\n\n  @Test\n  fun heatmapOpacityTransitionSetDsl() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun heatmapRadiusSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.heatmapRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun heatmapRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.heatmapRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun heatmapRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun heatmapRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.heatmapRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-radius\") }\n  }\n\n  @Test\n  fun heatmapRadiusAsExpressionGetNull() {\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.heatmapRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-radius\") }\n  }\n\n  @Test\n  fun heatmapRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.heatmapRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.heatmapRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-radius\") }\n  }\n\n  @Test\n  fun heatmapRadiusTransitionSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapRadiusTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun heatmapRadiusTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.heatmapRadiusTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-radius-transition\") }\n  }\n\n  @Test\n  fun heatmapRadiusTransitionSetDsl() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapRadiusTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun heatmapWeightSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.heatmapWeight(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-weight\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun heatmapWeightGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.heatmapWeight?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-weight\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun heatmapWeightAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.heatmapWeight(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"heatmap-weight\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun heatmapWeightAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.heatmapWeightAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-weight\") }\n  }\n\n  @Test\n  fun heatmapWeightAsExpressionGetNull() {\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.heatmapWeightAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-weight\") }\n  }\n\n  @Test\n  fun heatmapWeightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.heatmapWeightAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.heatmapWeight!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"heatmap-weight\") }\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = heatmapLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = heatmapLayer(\"id\", \"source\") { }\n    assertEquals(\"heatmap\", layer.getType())\n  }\n\n  @Test\n  fun getHeatmapLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"heatmap\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as HeatmapLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"heatmap\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultHeatmapColorTest() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val expectedValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    assertEquals(expectedValue.toString(), HeatmapLayer.defaultHeatmapColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-color\") }\n  }\n\n  @Test\n  fun defaultHeatmapColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, HeatmapLayer.defaultHeatmapColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultHeatmapIntensityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), HeatmapLayer.defaultHeatmapIntensity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultHeatmapIntensityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HeatmapLayer.defaultHeatmapIntensityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-intensity\") }\n  }\n\n  @Test\n  fun defaultHeatmapIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, HeatmapLayer.defaultHeatmapIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, HeatmapLayer.defaultHeatmapIntensity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-intensity\") }\n  }\n\n  @Test\n  fun defaultHeatmapIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), HeatmapLayer.defaultHeatmapIntensityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-intensity-transition\") }\n  }\n\n  @Test\n  fun defaultHeatmapOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), HeatmapLayer.defaultHeatmapOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultHeatmapOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HeatmapLayer.defaultHeatmapOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-opacity\") }\n  }\n\n  @Test\n  fun defaultHeatmapOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, HeatmapLayer.defaultHeatmapOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, HeatmapLayer.defaultHeatmapOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-opacity\") }\n  }\n\n  @Test\n  fun defaultHeatmapOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), HeatmapLayer.defaultHeatmapOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultHeatmapRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), HeatmapLayer.defaultHeatmapRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultHeatmapRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HeatmapLayer.defaultHeatmapRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-radius\") }\n  }\n\n  @Test\n  fun defaultHeatmapRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, HeatmapLayer.defaultHeatmapRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, HeatmapLayer.defaultHeatmapRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-radius\") }\n  }\n\n  @Test\n  fun defaultHeatmapRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), HeatmapLayer.defaultHeatmapRadiusTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-radius-transition\") }\n  }\n\n  @Test\n  fun defaultHeatmapWeightTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), HeatmapLayer.defaultHeatmapWeight?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-weight\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultHeatmapWeightAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HeatmapLayer.defaultHeatmapWeightAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-weight\") }\n  }\n\n  @Test\n  fun defaultHeatmapWeightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, HeatmapLayer.defaultHeatmapWeightAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, HeatmapLayer.defaultHeatmapWeight!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"heatmap-weight\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, HeatmapLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"heatmap\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/HillshadeLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass HillshadeLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=hillshade}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=hillshade, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=hillshade}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n  // Property getters and setters\n\n  @Test\n  fun hillshadeAccentColorSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.hillshadeAccentColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-accent-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun hillshadeAccentColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.hillshadeAccentColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorUseThemeSetAfterInitialization() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.hillshadeAccentColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-accent-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun hillshadeAccentColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"hillshade-accent-color-use-theme\"))\n  }\n\n  @Test\n  fun hillshadeAccentColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.hillshadeAccentColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun hillshadeAccentColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeAccentColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-accent-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun hillshadeAccentColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeAccentColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorUseThemeAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeAccentColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeAccentColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.hillshadeAccentColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeAccentColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-accent-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun hillshadeAccentColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeAccentColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeAccentColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeAccentColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.hillshadeAccentColor)\n    assertEquals(Color.BLACK, layer.hillshadeAccentColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorAsColorIntSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeAccentColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-accent-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun hillshadeAccentColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.hillshadeAccentColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorTransitionSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeAccentColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-accent-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun hillshadeAccentColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.hillshadeAccentColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-accent-color-transition\") }\n  }\n\n  @Test\n  fun hillshadeAccentColorTransitionSetDsl() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeAccentColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-accent-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun hillshadeEmissiveStrengthSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.hillshadeEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun hillshadeEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.hillshadeEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun hillshadeEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun hillshadeEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-emissive-strength\") }\n  }\n\n  @Test\n  fun hillshadeEmissiveStrengthAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-emissive-strength\") }\n  }\n\n  @Test\n  fun hillshadeEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.hillshadeEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.hillshadeEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-emissive-strength\") }\n  }\n\n  @Test\n  fun hillshadeEmissiveStrengthTransitionSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun hillshadeEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.hillshadeEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun hillshadeEmissiveStrengthTransitionSetDsl() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun hillshadeExaggerationSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.hillshadeExaggeration(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-exaggeration\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun hillshadeExaggerationGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.hillshadeExaggeration?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-exaggeration\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun hillshadeExaggerationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeExaggeration(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-exaggeration\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun hillshadeExaggerationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeExaggerationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-exaggeration\") }\n  }\n\n  @Test\n  fun hillshadeExaggerationAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeExaggerationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-exaggeration\") }\n  }\n\n  @Test\n  fun hillshadeExaggerationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.hillshadeExaggerationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.hillshadeExaggeration!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-exaggeration\") }\n  }\n\n  @Test\n  fun hillshadeExaggerationTransitionSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeExaggerationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-exaggeration-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun hillshadeExaggerationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.hillshadeExaggerationTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-exaggeration-transition\") }\n  }\n\n  @Test\n  fun hillshadeExaggerationTransitionSetDsl() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeExaggerationTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-exaggeration-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun hillshadeHighlightColorSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.hillshadeHighlightColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-highlight-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun hillshadeHighlightColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.hillshadeHighlightColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorUseThemeSetAfterInitialization() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.hillshadeHighlightColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-highlight-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun hillshadeHighlightColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"hillshade-highlight-color-use-theme\"))\n  }\n\n  @Test\n  fun hillshadeHighlightColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.hillshadeHighlightColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun hillshadeHighlightColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeHighlightColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-highlight-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun hillshadeHighlightColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeHighlightColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorUseThemeAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeHighlightColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeHighlightColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.hillshadeHighlightColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeHighlightColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-highlight-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun hillshadeHighlightColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeHighlightColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeHighlightColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeHighlightColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.hillshadeHighlightColor)\n    assertEquals(Color.BLACK, layer.hillshadeHighlightColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorAsColorIntSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeHighlightColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-highlight-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun hillshadeHighlightColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.hillshadeHighlightColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorTransitionSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeHighlightColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-highlight-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun hillshadeHighlightColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.hillshadeHighlightColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-highlight-color-transition\") }\n  }\n\n  @Test\n  fun hillshadeHighlightColorTransitionSetDsl() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeHighlightColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-highlight-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun hillshadeIlluminationAnchorSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeIlluminationAnchor(HillshadeIlluminationAnchor.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-illumination-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun hillshadeIlluminationAnchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(HillshadeIlluminationAnchor.MAP, layer.hillshadeIlluminationAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-illumination-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun hillshadeIlluminationAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeIlluminationAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-illumination-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun hillshadeIlluminationAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeIlluminationAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-illumination-anchor\") }\n  }\n\n  @Test\n  fun hillshadeIlluminationAnchorAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeIlluminationAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-illumination-anchor\") }\n  }\n\n  @Test\n  fun hillshadeIlluminationAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.hillshadeIlluminationAnchorAsExpression?.toString())\n    assertEquals(HillshadeIlluminationAnchor.MAP.value, layer.hillshadeIlluminationAnchorAsExpression.toString())\n    assertEquals(HillshadeIlluminationAnchor.MAP, layer.hillshadeIlluminationAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-illumination-anchor\") }\n  }\n\n  @Test\n  fun hillshadeIlluminationDirectionSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.hillshadeIlluminationDirection(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-illumination-direction\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun hillshadeIlluminationDirectionGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.hillshadeIlluminationDirection?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-illumination-direction\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun hillshadeIlluminationDirectionAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeIlluminationDirection(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-illumination-direction\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun hillshadeIlluminationDirectionAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeIlluminationDirectionAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-illumination-direction\") }\n  }\n\n  @Test\n  fun hillshadeIlluminationDirectionAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeIlluminationDirectionAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-illumination-direction\") }\n  }\n\n  @Test\n  fun hillshadeIlluminationDirectionAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.hillshadeIlluminationDirectionAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.hillshadeIlluminationDirection!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-illumination-direction\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.hillshadeShadowColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-shadow-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun hillshadeShadowColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.hillshadeShadowColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorUseThemeSetAfterInitialization() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.hillshadeShadowColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-shadow-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun hillshadeShadowColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"hillshade-shadow-color-use-theme\"))\n  }\n\n  @Test\n  fun hillshadeShadowColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.hillshadeShadowColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun hillshadeShadowColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeShadowColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-shadow-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun hillshadeShadowColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeShadowColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorUseThemeAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeShadowColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeShadowColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.hillshadeShadowColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color-use-theme\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeShadowColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-shadow-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun hillshadeShadowColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeShadowColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorAsExpressionGetNull() {\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.hillshadeShadowColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.hillshadeShadowColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.hillshadeShadowColor)\n    assertEquals(Color.BLACK, layer.hillshadeShadowColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorAsColorIntSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeShadowColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-shadow-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun hillshadeShadowColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.hillshadeShadowColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorTransitionSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeShadowColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-shadow-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun hillshadeShadowColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.hillshadeShadowColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"hillshade-shadow-color-transition\") }\n  }\n\n  @Test\n  fun hillshadeShadowColorTransitionSetDsl() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.hillshadeShadowColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"hillshade-shadow-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = hillshadeLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = hillshadeLayer(\"id\", \"source\") { }\n    assertEquals(\"hillshade\", layer.getType())\n  }\n\n  @Test\n  fun getHillshadeLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"hillshade\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as HillshadeLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"hillshade\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultHillshadeAccentColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), HillshadeLayer.defaultHillshadeAccentColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeAccentColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, HillshadeLayer.defaultHillshadeAccentColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultHillshadeAccentColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeAccentColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeAccentColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeAccentColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", HillshadeLayer.defaultHillshadeAccentColor)\n    assertEquals(Color.BLACK, HillshadeLayer.defaultHillshadeAccentColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeAccentColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, HillshadeLayer.defaultHillshadeAccentColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeAccentColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), HillshadeLayer.defaultHillshadeAccentColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-accent-color-transition\") }\n  }\n\n  @Test\n  fun defaultHillshadeEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), HillshadeLayer.defaultHillshadeEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultHillshadeEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultHillshadeEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, HillshadeLayer.defaultHillshadeEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, HillshadeLayer.defaultHillshadeEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultHillshadeEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), HillshadeLayer.defaultHillshadeEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultHillshadeExaggerationTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), HillshadeLayer.defaultHillshadeExaggeration?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-exaggeration\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultHillshadeExaggerationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeExaggerationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-exaggeration\") }\n  }\n\n  @Test\n  fun defaultHillshadeExaggerationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, HillshadeLayer.defaultHillshadeExaggerationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, HillshadeLayer.defaultHillshadeExaggeration!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-exaggeration\") }\n  }\n\n  @Test\n  fun defaultHillshadeExaggerationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), HillshadeLayer.defaultHillshadeExaggerationTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-exaggeration-transition\") }\n  }\n\n  @Test\n  fun defaultHillshadeHighlightColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), HillshadeLayer.defaultHillshadeHighlightColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeHighlightColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, HillshadeLayer.defaultHillshadeHighlightColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultHillshadeHighlightColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeHighlightColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeHighlightColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeHighlightColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", HillshadeLayer.defaultHillshadeHighlightColor)\n    assertEquals(Color.BLACK, HillshadeLayer.defaultHillshadeHighlightColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeHighlightColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, HillshadeLayer.defaultHillshadeHighlightColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeHighlightColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), HillshadeLayer.defaultHillshadeHighlightColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-highlight-color-transition\") }\n  }\n\n  @Test\n  fun defaultHillshadeIlluminationAnchorTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(HillshadeIlluminationAnchor.MAP, HillshadeLayer.defaultHillshadeIlluminationAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultHillshadeIlluminationAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeIlluminationAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-anchor\") }\n  }\n\n  @Test\n  fun defaultHillshadeIlluminationAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), HillshadeLayer.defaultHillshadeIlluminationAnchorAsExpression?.toString())\n    assertEquals(HillshadeIlluminationAnchor.MAP.value, HillshadeLayer.defaultHillshadeIlluminationAnchorAsExpression.toString())\n    assertEquals(HillshadeIlluminationAnchor.MAP, HillshadeLayer.defaultHillshadeIlluminationAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-anchor\") }\n  }\n\n  @Test\n  fun defaultHillshadeIlluminationDirectionTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), HillshadeLayer.defaultHillshadeIlluminationDirection?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-direction\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultHillshadeIlluminationDirectionAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeIlluminationDirectionAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-direction\") }\n  }\n\n  @Test\n  fun defaultHillshadeIlluminationDirectionAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, HillshadeLayer.defaultHillshadeIlluminationDirectionAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, HillshadeLayer.defaultHillshadeIlluminationDirection!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-illumination-direction\") }\n  }\n\n  @Test\n  fun defaultHillshadeShadowColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), HillshadeLayer.defaultHillshadeShadowColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeShadowColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, HillshadeLayer.defaultHillshadeShadowColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultHillshadeShadowColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeShadowColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeShadowColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), HillshadeLayer.defaultHillshadeShadowColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", HillshadeLayer.defaultHillshadeShadowColor)\n    assertEquals(Color.BLACK, HillshadeLayer.defaultHillshadeShadowColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeShadowColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, HillshadeLayer.defaultHillshadeShadowColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color\") }\n  }\n\n  @Test\n  fun defaultHillshadeShadowColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), HillshadeLayer.defaultHillshadeShadowColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"hillshade-shadow-color-transition\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, HillshadeLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"hillshade\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/LineLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass LineLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = lineLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=line}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = lineLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=line, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = lineLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=line}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun lineCapSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineCap(LineCap.BUTT)\n    verify { style.setStyleLayerProperty(\"id\", \"line-cap\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"butt\")\n  }\n\n  @Test\n  fun lineCapGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"butt\")\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(LineCap.BUTT, layer.lineCap)\n    verify { style.getStyleLayerProperty(\"id\", \"line-cap\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineCapAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineCap(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-cap\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineCapAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineCapAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-cap\") }\n  }\n\n  @Test\n  fun lineCapAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineCapAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-cap\") }\n  }\n\n  @Test\n  fun lineCapAsExpressionGetFromLiteral() {\n    val value = \"butt\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.lineCapAsExpression?.toString())\n    assertEquals(LineCap.BUTT.value, layer.lineCapAsExpression.toString())\n    assertEquals(LineCap.BUTT, layer.lineCap)\n    verify { style.getStyleLayerProperty(\"id\", \"line-cap\") }\n  }\n\n  @Test\n  fun lineCrossSlopeSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineCrossSlope(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-cross-slope\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineCrossSlopeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineCrossSlope?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-cross-slope\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineCrossSlopeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineCrossSlope(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-cross-slope\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineCrossSlopeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineCrossSlopeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-cross-slope\") }\n  }\n\n  @Test\n  fun lineCrossSlopeAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineCrossSlopeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-cross-slope\") }\n  }\n\n  @Test\n  fun lineCrossSlopeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineCrossSlopeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineCrossSlope!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-cross-slope\") }\n  }\n\n  @Test\n  fun lineElevationGroundScaleSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineElevationGroundScale(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-elevation-ground-scale\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineElevationGroundScaleGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineElevationGroundScale?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-elevation-ground-scale\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineElevationGroundScaleAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineElevationGroundScale(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-elevation-ground-scale\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineElevationGroundScaleAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineElevationGroundScaleAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-elevation-ground-scale\") }\n  }\n\n  @Test\n  fun lineElevationGroundScaleAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineElevationGroundScaleAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-elevation-ground-scale\") }\n  }\n\n  @Test\n  fun lineElevationGroundScaleAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineElevationGroundScaleAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineElevationGroundScale!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-elevation-ground-scale\") }\n  }\n\n  @Test\n  fun lineElevationGroundScaleTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineElevationGroundScaleTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-elevation-ground-scale-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineElevationGroundScaleTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineElevationGroundScaleTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-elevation-ground-scale-transition\") }\n  }\n\n  @Test\n  fun lineElevationGroundScaleTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineElevationGroundScaleTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-elevation-ground-scale-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineElevationReferenceSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineElevationReference(LineElevationReference.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"line-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun lineElevationReferenceGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(LineElevationReference.NONE, layer.lineElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"line-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineElevationReferenceAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineElevationReference(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineElevationReferenceAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineElevationReferenceAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-elevation-reference\") }\n  }\n\n  @Test\n  fun lineElevationReferenceAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineElevationReferenceAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-elevation-reference\") }\n  }\n\n  @Test\n  fun lineElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.lineElevationReferenceAsExpression?.toString())\n    assertEquals(LineElevationReference.NONE.value, layer.lineElevationReferenceAsExpression.toString())\n    assertEquals(LineElevationReference.NONE, layer.lineElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"line-elevation-reference\") }\n  }\n\n  @Test\n  fun lineJoinSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineJoin(LineJoin.BEVEL)\n    verify { style.setStyleLayerProperty(\"id\", \"line-join\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"bevel\")\n  }\n\n  @Test\n  fun lineJoinGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"bevel\")\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(LineJoin.BEVEL, layer.lineJoin)\n    verify { style.getStyleLayerProperty(\"id\", \"line-join\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineJoinAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineJoin(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-join\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineJoinAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineJoinAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-join\") }\n  }\n\n  @Test\n  fun lineJoinAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineJoinAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-join\") }\n  }\n\n  @Test\n  fun lineJoinAsExpressionGetFromLiteral() {\n    val value = \"bevel\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.lineJoinAsExpression?.toString())\n    assertEquals(LineJoin.BEVEL.value, layer.lineJoinAsExpression.toString())\n    assertEquals(LineJoin.BEVEL, layer.lineJoin)\n    verify { style.getStyleLayerProperty(\"id\", \"line-join\") }\n  }\n\n  @Test\n  fun lineMiterLimitSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineMiterLimit(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-miter-limit\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineMiterLimitGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineMiterLimit?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-miter-limit\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineMiterLimitAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineMiterLimit(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-miter-limit\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineMiterLimitAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineMiterLimitAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-miter-limit\") }\n  }\n\n  @Test\n  fun lineMiterLimitAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineMiterLimitAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-miter-limit\") }\n  }\n\n  @Test\n  fun lineMiterLimitAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineMiterLimitAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineMiterLimit!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-miter-limit\") }\n  }\n\n  @Test\n  fun lineRoundLimitSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineRoundLimit(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-round-limit\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineRoundLimitGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineRoundLimit?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-round-limit\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineRoundLimitAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineRoundLimit(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-round-limit\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineRoundLimitAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineRoundLimitAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-round-limit\") }\n  }\n\n  @Test\n  fun lineRoundLimitAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineRoundLimitAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-round-limit\") }\n  }\n\n  @Test\n  fun lineRoundLimitAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineRoundLimitAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineRoundLimit!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-round-limit\") }\n  }\n\n  @Test\n  fun lineSortKeySet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineSortKey(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-sort-key\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineSortKeyGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineSortKey?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-sort-key\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineSortKeyAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineSortKey(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-sort-key\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineSortKeyAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineSortKeyAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-sort-key\") }\n  }\n\n  @Test\n  fun lineSortKeyAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineSortKeyAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-sort-key\") }\n  }\n\n  @Test\n  fun lineSortKeyAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineSortKeyAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineSortKey!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-sort-key\") }\n  }\n\n  @Test\n  fun lineWidthUnitSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineWidthUnit(LineWidthUnit.PIXELS)\n    verify { style.setStyleLayerProperty(\"id\", \"line-width-unit\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"pixels\")\n  }\n\n  @Test\n  fun lineWidthUnitGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"pixels\")\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(LineWidthUnit.PIXELS, layer.lineWidthUnit)\n    verify { style.getStyleLayerProperty(\"id\", \"line-width-unit\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineWidthUnitAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineWidthUnit(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-width-unit\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineWidthUnitAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineWidthUnitAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-width-unit\") }\n  }\n\n  @Test\n  fun lineWidthUnitAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineWidthUnitAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-width-unit\") }\n  }\n\n  @Test\n  fun lineWidthUnitAsExpressionGetFromLiteral() {\n    val value = \"pixels\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.lineWidthUnitAsExpression?.toString())\n    assertEquals(LineWidthUnit.PIXELS.value, layer.lineWidthUnitAsExpression.toString())\n    assertEquals(LineWidthUnit.PIXELS, layer.lineWidthUnit)\n    verify { style.getStyleLayerProperty(\"id\", \"line-width-unit\") }\n  }\n\n  @Test\n  fun lineZOffsetSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineZOffset(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-z-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineZOffsetGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineZOffset?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-z-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineZOffsetAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineZOffset(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-z-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineZOffsetAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineZOffsetAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-z-offset\") }\n  }\n\n  @Test\n  fun lineZOffsetAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineZOffsetAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-z-offset\") }\n  }\n\n  @Test\n  fun lineZOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineZOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineZOffset!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-z-offset\") }\n  }\n\n  @Test\n  fun lineBlurSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineBlur(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-blur\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineBlurGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineBlur?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-blur\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineBlurAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBlur(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-blur\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineBlurAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineBlurAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-blur\") }\n  }\n\n  @Test\n  fun lineBlurAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineBlurAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-blur\") }\n  }\n\n  @Test\n  fun lineBlurAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineBlurAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineBlur!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-blur\") }\n  }\n\n  @Test\n  fun lineBlurTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBlurTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-blur-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineBlurTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineBlurTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-blur-transition\") }\n  }\n\n  @Test\n  fun lineBlurTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBlurTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-blur-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineBorderColorSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.lineBorderColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun lineBorderColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.lineBorderColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color\") }\n  }\n\n  @Test\n  fun lineBorderColorUseThemeSetAfterInitialization() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.lineBorderColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun lineBorderColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"line-border-color-use-theme\"))\n  }\n\n  @Test\n  fun lineBorderColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.lineBorderColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineBorderColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBorderColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun lineBorderColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineBorderColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color-use-theme\") }\n  }\n\n  @Test\n  fun lineBorderColorUseThemeAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.lineBorderColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color-use-theme\") }\n  }\n\n  @Test\n  fun lineBorderColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineBorderColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color-use-theme\") }\n  }\n\n  @Test\n  fun lineBorderColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.lineBorderColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color-use-theme\") }\n  }\n\n  @Test\n  fun lineBorderColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBorderColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineBorderColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineBorderColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color\") }\n  }\n\n  @Test\n  fun lineBorderColorAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineBorderColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color\") }\n  }\n\n  @Test\n  fun lineBorderColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineBorderColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.lineBorderColor)\n    assertEquals(Color.BLACK, layer.lineBorderColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color\") }\n  }\n\n  @Test\n  fun lineBorderColorAsColorIntSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBorderColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun lineBorderColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.lineBorderColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color\") }\n  }\n\n  @Test\n  fun lineBorderColorTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBorderColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineBorderColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineBorderColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-color-transition\") }\n  }\n\n  @Test\n  fun lineBorderColorTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBorderColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineBorderWidthSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineBorderWidth(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineBorderWidthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineBorderWidth?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineBorderWidthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBorderWidth(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineBorderWidthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineBorderWidthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-width\") }\n  }\n\n  @Test\n  fun lineBorderWidthAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineBorderWidthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-width\") }\n  }\n\n  @Test\n  fun lineBorderWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineBorderWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineBorderWidth!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-width\") }\n  }\n\n  @Test\n  fun lineBorderWidthTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBorderWidthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineBorderWidthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineBorderWidthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-border-width-transition\") }\n  }\n\n  @Test\n  fun lineBorderWidthTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineBorderWidthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-border-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineColorSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.lineColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun lineColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.lineColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-color\") }\n  }\n\n  @Test\n  fun lineColorUseThemeSetAfterInitialization() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.lineColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"line-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun lineColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"line-color-use-theme\"))\n  }\n\n  @Test\n  fun lineColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.lineColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun lineColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-color-use-theme\") }\n  }\n\n  @Test\n  fun lineColorUseThemeAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.lineColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-color-use-theme\") }\n  }\n\n  @Test\n  fun lineColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-color-use-theme\") }\n  }\n\n  @Test\n  fun lineColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.lineColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-color-use-theme\") }\n  }\n\n  @Test\n  fun lineColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-color\") }\n  }\n\n  @Test\n  fun lineColorAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-color\") }\n  }\n\n  @Test\n  fun lineColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.lineColor)\n    assertEquals(Color.BLACK, layer.lineColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"line-color\") }\n  }\n\n  @Test\n  fun lineColorAsColorIntSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"line-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun lineColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.lineColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"line-color\") }\n  }\n\n  @Test\n  fun lineColorTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-color-transition\") }\n  }\n\n  @Test\n  fun lineColorTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineCutoutFadeWidthSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineCutoutFadeWidth(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-cutout-fade-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineCutoutFadeWidthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineCutoutFadeWidth?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-fade-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineCutoutFadeWidthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineCutoutFadeWidth(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-cutout-fade-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineCutoutFadeWidthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineCutoutFadeWidthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-fade-width\") }\n  }\n\n  @Test\n  fun lineCutoutFadeWidthAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineCutoutFadeWidthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-fade-width\") }\n  }\n\n  @Test\n  fun lineCutoutFadeWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineCutoutFadeWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineCutoutFadeWidth!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-fade-width\") }\n  }\n\n  @Test\n  fun lineCutoutFadeWidthTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineCutoutFadeWidthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-cutout-fade-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineCutoutFadeWidthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineCutoutFadeWidthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-fade-width-transition\") }\n  }\n\n  @Test\n  fun lineCutoutFadeWidthTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineCutoutFadeWidthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-cutout-fade-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineCutoutOpacitySet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineCutoutOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-cutout-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineCutoutOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineCutoutOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineCutoutOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineCutoutOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-cutout-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineCutoutOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineCutoutOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-opacity\") }\n  }\n\n  @Test\n  fun lineCutoutOpacityAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineCutoutOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-opacity\") }\n  }\n\n  @Test\n  fun lineCutoutOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineCutoutOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineCutoutOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-opacity\") }\n  }\n\n  @Test\n  fun lineCutoutOpacityTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineCutoutOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-cutout-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineCutoutOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineCutoutOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-cutout-opacity-transition\") }\n  }\n\n  @Test\n  fun lineCutoutOpacityTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineCutoutOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-cutout-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineDasharraySet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = listOf(1.0, 2.0)\n    layer.bindTo(style)\n    layer.lineDasharray(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-dasharray\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[1.0, 2.0]\")\n  }\n\n  @Test\n  fun lineDasharrayGet() {\n    val testValue = listOf(1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(1.0, 2.0)\n    assertEquals(expectedValue.toString(), layer.lineDasharray?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-dasharray\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineDasharrayAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineDasharray(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-dasharray\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineDasharrayAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineDasharrayAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-dasharray\") }\n  }\n\n  @Test\n  fun lineDasharrayAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineDasharrayAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-dasharray\") }\n  }\n\n  @Test\n  fun lineDasharrayAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(1.0, 2.0))\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [1.0, 2.0]]\", layer.lineDasharrayAsExpression.toString())\n    assertEquals(listOf(1.0, 2.0), layer.lineDasharray!!)\n    verify { style.getStyleLayerProperty(\"id\", \"line-dasharray\") }\n  }\n\n  @Test\n  fun lineDepthOcclusionFactorSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineDepthOcclusionFactor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-depth-occlusion-factor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineDepthOcclusionFactorGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineDepthOcclusionFactor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-depth-occlusion-factor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineDepthOcclusionFactorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineDepthOcclusionFactor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-depth-occlusion-factor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineDepthOcclusionFactorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineDepthOcclusionFactorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-depth-occlusion-factor\") }\n  }\n\n  @Test\n  fun lineDepthOcclusionFactorAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineDepthOcclusionFactorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-depth-occlusion-factor\") }\n  }\n\n  @Test\n  fun lineDepthOcclusionFactorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineDepthOcclusionFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineDepthOcclusionFactor!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-depth-occlusion-factor\") }\n  }\n\n  @Test\n  fun lineDepthOcclusionFactorTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineDepthOcclusionFactorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-depth-occlusion-factor-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineDepthOcclusionFactorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineDepthOcclusionFactorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-depth-occlusion-factor-transition\") }\n  }\n\n  @Test\n  fun lineDepthOcclusionFactorTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineDepthOcclusionFactorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-depth-occlusion-factor-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineEmissiveStrengthSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-emissive-strength\") }\n  }\n\n  @Test\n  fun lineEmissiveStrengthAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-emissive-strength\") }\n  }\n\n  @Test\n  fun lineEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-emissive-strength\") }\n  }\n\n  @Test\n  fun lineEmissiveStrengthTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun lineEmissiveStrengthTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineGapWidthSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineGapWidth(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-gap-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineGapWidthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineGapWidth?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-gap-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineGapWidthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineGapWidth(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-gap-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineGapWidthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineGapWidthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-gap-width\") }\n  }\n\n  @Test\n  fun lineGapWidthAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineGapWidthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-gap-width\") }\n  }\n\n  @Test\n  fun lineGapWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineGapWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineGapWidth!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-gap-width\") }\n  }\n\n  @Test\n  fun lineGapWidthTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineGapWidthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-gap-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineGapWidthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineGapWidthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-gap-width-transition\") }\n  }\n\n  @Test\n  fun lineGapWidthTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineGapWidthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-gap-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineGradientSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    layer.bindTo(style)\n    layer.lineGradient(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-gradient\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[interpolate, [linear], [heatmap-density], 0.0, [rgba, 0.0, 0.0, 0.0, 0.0], 1.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\")\n  }\n\n  @Test\n  fun lineGradientGet() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    assertEquals(expectedValue.toString(), layer.lineGradient?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-gradient\") }\n  }\n\n  @Test\n  fun lineGradientUseThemeSetAfterInitialization() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.lineGradientUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"line-gradient-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun lineGradientUseThemeSet() {\n    val theme = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGradientUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"line-gradient-use-theme\"))\n  }\n\n  @Test\n  fun lineGradientUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.lineGradientUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-gradient-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineOcclusionOpacitySet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineOcclusionOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-occlusion-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineOcclusionOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineOcclusionOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-occlusion-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineOcclusionOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineOcclusionOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-occlusion-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineOcclusionOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineOcclusionOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-occlusion-opacity\") }\n  }\n\n  @Test\n  fun lineOcclusionOpacityAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineOcclusionOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-occlusion-opacity\") }\n  }\n\n  @Test\n  fun lineOcclusionOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineOcclusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineOcclusionOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-occlusion-opacity\") }\n  }\n\n  @Test\n  fun lineOcclusionOpacityTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineOcclusionOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-occlusion-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineOcclusionOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineOcclusionOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-occlusion-opacity-transition\") }\n  }\n\n  @Test\n  fun lineOcclusionOpacityTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineOcclusionOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-occlusion-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineOffsetSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineOffset(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineOffsetGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineOffset?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineOffsetAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineOffset(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineOffsetAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineOffsetAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-offset\") }\n  }\n\n  @Test\n  fun lineOffsetAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineOffsetAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-offset\") }\n  }\n\n  @Test\n  fun lineOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineOffset!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-offset\") }\n  }\n\n  @Test\n  fun lineOffsetTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineOffsetTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-offset-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineOffsetTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineOffsetTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-offset-transition\") }\n  }\n\n  @Test\n  fun lineOffsetTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineOffsetTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-offset-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineOpacitySet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-opacity\") }\n  }\n\n  @Test\n  fun lineOpacityAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-opacity\") }\n  }\n\n  @Test\n  fun lineOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-opacity\") }\n  }\n\n  @Test\n  fun lineOpacityTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-opacity-transition\") }\n  }\n\n  @Test\n  fun lineOpacityTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun linePatternSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.linePattern(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-pattern\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun linePatternGet() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.linePattern?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-pattern\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun linePatternAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.linePattern(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-pattern\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun linePatternAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.linePatternAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-pattern\") }\n  }\n\n  @Test\n  fun linePatternAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.linePatternAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-pattern\") }\n  }\n\n  @Test\n  fun linePatternAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.linePatternAsExpression.toString())\n    assertEquals(\"abc\", layer.linePattern)\n    verify { style.getStyleLayerProperty(\"id\", \"line-pattern\") }\n  }\n\n  @Test\n  fun linePatternCrossFadeSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.linePatternCrossFade(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-pattern-cross-fade\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun linePatternCrossFadeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.linePatternCrossFade?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-pattern-cross-fade\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun linePatternCrossFadeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.linePatternCrossFade(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-pattern-cross-fade\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun linePatternCrossFadeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.linePatternCrossFadeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun linePatternCrossFadeAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.linePatternCrossFadeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun linePatternCrossFadeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.linePatternCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.linePatternCrossFade!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun lineTranslateSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.lineTranslate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun lineTranslateGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.lineTranslate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineTranslateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTranslate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineTranslateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineTranslateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-translate\") }\n  }\n\n  @Test\n  fun lineTranslateAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineTranslateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-translate\") }\n  }\n\n  @Test\n  fun lineTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.lineTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.lineTranslate!!)\n    verify { style.getStyleLayerProperty(\"id\", \"line-translate\") }\n  }\n\n  @Test\n  fun lineTranslateTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTranslateTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineTranslateTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineTranslateTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-translate-transition\") }\n  }\n\n  @Test\n  fun lineTranslateTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTranslateTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineTranslateAnchorSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTranslateAnchor(LineTranslateAnchor.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"line-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun lineTranslateAnchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(LineTranslateAnchor.MAP, layer.lineTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"line-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineTranslateAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTranslateAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineTranslateAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineTranslateAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-translate-anchor\") }\n  }\n\n  @Test\n  fun lineTranslateAnchorAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineTranslateAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-translate-anchor\") }\n  }\n\n  @Test\n  fun lineTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.lineTranslateAnchorAsExpression?.toString())\n    assertEquals(LineTranslateAnchor.MAP.value, layer.lineTranslateAnchorAsExpression.toString())\n    assertEquals(LineTranslateAnchor.MAP, layer.lineTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"line-translate-anchor\") }\n  }\n\n  @Test\n  fun lineTrimColorSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.lineTrimColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun lineTrimColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.lineTrimColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color\") }\n  }\n\n  @Test\n  fun lineTrimColorUseThemeSetAfterInitialization() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.lineTrimColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun lineTrimColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"line-trim-color-use-theme\"))\n  }\n\n  @Test\n  fun lineTrimColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.lineTrimColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineTrimColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTrimColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun lineTrimColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineTrimColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color-use-theme\") }\n  }\n\n  @Test\n  fun lineTrimColorUseThemeAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.lineTrimColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color-use-theme\") }\n  }\n\n  @Test\n  fun lineTrimColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineTrimColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color-use-theme\") }\n  }\n\n  @Test\n  fun lineTrimColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.lineTrimColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color-use-theme\") }\n  }\n\n  @Test\n  fun lineTrimColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTrimColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineTrimColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineTrimColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color\") }\n  }\n\n  @Test\n  fun lineTrimColorAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineTrimColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color\") }\n  }\n\n  @Test\n  fun lineTrimColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineTrimColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.lineTrimColor)\n    assertEquals(Color.BLACK, layer.lineTrimColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color\") }\n  }\n\n  @Test\n  fun lineTrimColorAsColorIntSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTrimColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun lineTrimColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.lineTrimColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color\") }\n  }\n\n  @Test\n  fun lineTrimColorTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTrimColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineTrimColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineTrimColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-color-transition\") }\n  }\n\n  @Test\n  fun lineTrimColorTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTrimColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineTrimFadeRangeSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.5, 0.5)\n    layer.bindTo(style)\n    layer.lineTrimFadeRange(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-fade-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.5, 0.5]\")\n  }\n\n  @Test\n  fun lineTrimFadeRangeGet() {\n    val testValue = listOf(0.5, 0.5)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.5, 0.5)\n    assertEquals(expectedValue.toString(), layer.lineTrimFadeRange?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-fade-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineTrimFadeRangeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTrimFadeRange(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-fade-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineTrimFadeRangeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineTrimFadeRangeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-fade-range\") }\n  }\n\n  @Test\n  fun lineTrimFadeRangeAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineTrimFadeRangeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-fade-range\") }\n  }\n\n  @Test\n  fun lineTrimFadeRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.5, 0.5))\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.5, 0.5]]\", layer.lineTrimFadeRangeAsExpression.toString())\n    assertEquals(listOf(0.5, 0.5), layer.lineTrimFadeRange!!)\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-fade-range\") }\n  }\n\n  @Test\n  fun lineTrimOffsetSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.5, 0.5)\n    layer.bindTo(style)\n    layer.lineTrimOffset(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.5, 0.5]\")\n  }\n\n  @Test\n  fun lineTrimOffsetGet() {\n    val testValue = listOf(0.5, 0.5)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.5, 0.5)\n    assertEquals(expectedValue.toString(), layer.lineTrimOffset?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineTrimOffsetAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineTrimOffset(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-trim-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineTrimOffsetAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineTrimOffsetAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-offset\") }\n  }\n\n  @Test\n  fun lineTrimOffsetAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineTrimOffsetAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-offset\") }\n  }\n\n  @Test\n  fun lineTrimOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.5, 0.5))\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.5, 0.5]]\", layer.lineTrimOffsetAsExpression.toString())\n    assertEquals(listOf(0.5, 0.5), layer.lineTrimOffset!!)\n    verify { style.getStyleLayerProperty(\"id\", \"line-trim-offset\") }\n  }\n\n  @Test\n  fun lineWidthSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.lineWidth(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"line-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun lineWidthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.lineWidth?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun lineWidthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineWidth(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"line-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun lineWidthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.lineWidthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-width\") }\n  }\n\n  @Test\n  fun lineWidthAsExpressionGetNull() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.lineWidthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"line-width\") }\n  }\n\n  @Test\n  fun lineWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.lineWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineWidth!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"line-width\") }\n  }\n\n  @Test\n  fun lineWidthTransitionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineWidthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"line-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun lineWidthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.lineWidthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"line-width-transition\") }\n  }\n\n  @Test\n  fun lineWidthTransitionSetDsl() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.lineWidthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"line-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = lineLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = lineLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = lineLayer(\"id\", \"source\") { }\n    assertEquals(\"line\", layer.getType())\n  }\n\n  @Test\n  fun getLineLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"line\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as LineLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"line\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultLineCapTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"butt\")\n\n    assertEquals(LineCap.BUTT, LineLayer.defaultLineCap)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cap\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineCapAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineCapAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cap\") }\n  }\n\n  @Test\n  fun defaultLineCapAsExpressionGetFromLiteral() {\n    val value = \"butt\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), LineLayer.defaultLineCapAsExpression?.toString())\n    assertEquals(LineCap.BUTT.value, LineLayer.defaultLineCapAsExpression.toString())\n    assertEquals(LineCap.BUTT, LineLayer.defaultLineCap)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cap\") }\n  }\n\n  @Test\n  fun defaultLineCrossSlopeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineCrossSlope?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cross-slope\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineCrossSlopeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineCrossSlopeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cross-slope\") }\n  }\n\n  @Test\n  fun defaultLineCrossSlopeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineCrossSlopeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineCrossSlope!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cross-slope\") }\n  }\n\n  @Test\n  fun defaultLineElevationGroundScaleTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineElevationGroundScale?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-ground-scale\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineElevationGroundScaleAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineElevationGroundScaleAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-ground-scale\") }\n  }\n\n  @Test\n  fun defaultLineElevationGroundScaleAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineElevationGroundScaleAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineElevationGroundScale!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-ground-scale\") }\n  }\n\n  @Test\n  fun defaultLineElevationGroundScaleTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineElevationGroundScaleTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-ground-scale-transition\") }\n  }\n\n  @Test\n  fun defaultLineElevationReferenceTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(LineElevationReference.NONE, LineLayer.defaultLineElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineElevationReferenceAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineElevationReferenceAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultLineElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), LineLayer.defaultLineElevationReferenceAsExpression?.toString())\n    assertEquals(LineElevationReference.NONE.value, LineLayer.defaultLineElevationReferenceAsExpression.toString())\n    assertEquals(LineElevationReference.NONE, LineLayer.defaultLineElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultLineJoinTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"bevel\")\n\n    assertEquals(LineJoin.BEVEL, LineLayer.defaultLineJoin)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-join\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineJoinAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineJoinAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-join\") }\n  }\n\n  @Test\n  fun defaultLineJoinAsExpressionGetFromLiteral() {\n    val value = \"bevel\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), LineLayer.defaultLineJoinAsExpression?.toString())\n    assertEquals(LineJoin.BEVEL.value, LineLayer.defaultLineJoinAsExpression.toString())\n    assertEquals(LineJoin.BEVEL, LineLayer.defaultLineJoin)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-join\") }\n  }\n\n  @Test\n  fun defaultLineMiterLimitTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineMiterLimit?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-miter-limit\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineMiterLimitAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineMiterLimitAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-miter-limit\") }\n  }\n\n  @Test\n  fun defaultLineMiterLimitAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineMiterLimitAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineMiterLimit!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-miter-limit\") }\n  }\n\n  @Test\n  fun defaultLineRoundLimitTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineRoundLimit?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-round-limit\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineRoundLimitAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineRoundLimitAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-round-limit\") }\n  }\n\n  @Test\n  fun defaultLineRoundLimitAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineRoundLimitAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineRoundLimit!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-round-limit\") }\n  }\n\n  @Test\n  fun defaultLineSortKeyTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineSortKey?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-sort-key\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineSortKeyAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineSortKeyAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-sort-key\") }\n  }\n\n  @Test\n  fun defaultLineSortKeyAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineSortKeyAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineSortKey!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-sort-key\") }\n  }\n\n  @Test\n  fun defaultLineWidthUnitTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"pixels\")\n\n    assertEquals(LineWidthUnit.PIXELS, LineLayer.defaultLineWidthUnit)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width-unit\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineWidthUnitAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineWidthUnitAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width-unit\") }\n  }\n\n  @Test\n  fun defaultLineWidthUnitAsExpressionGetFromLiteral() {\n    val value = \"pixels\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), LineLayer.defaultLineWidthUnitAsExpression?.toString())\n    assertEquals(LineWidthUnit.PIXELS.value, LineLayer.defaultLineWidthUnitAsExpression.toString())\n    assertEquals(LineWidthUnit.PIXELS, LineLayer.defaultLineWidthUnit)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width-unit\") }\n  }\n\n  @Test\n  fun defaultLineZOffsetTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineZOffset?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-z-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineZOffsetAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineZOffsetAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-z-offset\") }\n  }\n\n  @Test\n  fun defaultLineZOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineZOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineZOffset!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-z-offset\") }\n  }\n\n  @Test\n  fun defaultLineBlurTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineBlur?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-blur\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineBlurAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineBlurAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-blur\") }\n  }\n\n  @Test\n  fun defaultLineBlurAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineBlurAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineBlur!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-blur\") }\n  }\n\n  @Test\n  fun defaultLineBlurTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineBlurTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-blur-transition\") }\n  }\n\n  @Test\n  fun defaultLineBorderColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineBorderColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color\") }\n  }\n\n  @Test\n  fun defaultLineBorderColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, LineLayer.defaultLineBorderColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultLineBorderColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineBorderColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color\") }\n  }\n\n  @Test\n  fun defaultLineBorderColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), LineLayer.defaultLineBorderColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", LineLayer.defaultLineBorderColor)\n    assertEquals(Color.BLACK, LineLayer.defaultLineBorderColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color\") }\n  }\n\n  @Test\n  fun defaultLineBorderColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, LineLayer.defaultLineBorderColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color\") }\n  }\n\n  @Test\n  fun defaultLineBorderColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineBorderColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-color-transition\") }\n  }\n\n  @Test\n  fun defaultLineBorderWidthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineBorderWidth?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineBorderWidthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineBorderWidthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-width\") }\n  }\n\n  @Test\n  fun defaultLineBorderWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineBorderWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineBorderWidth!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-width\") }\n  }\n\n  @Test\n  fun defaultLineBorderWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineBorderWidthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-border-width-transition\") }\n  }\n\n  @Test\n  fun defaultLineColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-color\") }\n  }\n\n  @Test\n  fun defaultLineColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, LineLayer.defaultLineColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultLineColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-color\") }\n  }\n\n  @Test\n  fun defaultLineColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), LineLayer.defaultLineColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", LineLayer.defaultLineColor)\n    assertEquals(Color.BLACK, LineLayer.defaultLineColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-color\") }\n  }\n\n  @Test\n  fun defaultLineColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, LineLayer.defaultLineColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-color\") }\n  }\n\n  @Test\n  fun defaultLineColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-color-transition\") }\n  }\n\n  @Test\n  fun defaultLineCutoutFadeWidthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineCutoutFadeWidth?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-fade-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineCutoutFadeWidthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineCutoutFadeWidthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-fade-width\") }\n  }\n\n  @Test\n  fun defaultLineCutoutFadeWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineCutoutFadeWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineCutoutFadeWidth!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-fade-width\") }\n  }\n\n  @Test\n  fun defaultLineCutoutFadeWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineCutoutFadeWidthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-fade-width-transition\") }\n  }\n\n  @Test\n  fun defaultLineCutoutOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineCutoutOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineCutoutOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineCutoutOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-opacity\") }\n  }\n\n  @Test\n  fun defaultLineCutoutOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineCutoutOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineCutoutOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-opacity\") }\n  }\n\n  @Test\n  fun defaultLineCutoutOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineCutoutOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultLineDasharrayTest() {\n    val testValue = listOf(1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(1.0, 2.0)\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineDasharray?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-dasharray\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineDasharrayAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineDasharrayAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-dasharray\") }\n  }\n\n  @Test\n  fun defaultLineDasharrayAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(1.0, 2.0))\n    assertEquals(\"[literal, [1.0, 2.0]]\", LineLayer.defaultLineDasharrayAsExpression.toString())\n    assertEquals(listOf(1.0, 2.0), LineLayer.defaultLineDasharray!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-dasharray\") }\n  }\n\n  @Test\n  fun defaultLineDepthOcclusionFactorTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineDepthOcclusionFactor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-depth-occlusion-factor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineDepthOcclusionFactorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineDepthOcclusionFactorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-depth-occlusion-factor\") }\n  }\n\n  @Test\n  fun defaultLineDepthOcclusionFactorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineDepthOcclusionFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineDepthOcclusionFactor!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-depth-occlusion-factor\") }\n  }\n\n  @Test\n  fun defaultLineDepthOcclusionFactorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineDepthOcclusionFactorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-depth-occlusion-factor-transition\") }\n  }\n\n  @Test\n  fun defaultLineEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultLineEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultLineEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultLineGapWidthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineGapWidth?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gap-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineGapWidthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineGapWidthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gap-width\") }\n  }\n\n  @Test\n  fun defaultLineGapWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineGapWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineGapWidth!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gap-width\") }\n  }\n\n  @Test\n  fun defaultLineGapWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineGapWidthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gap-width-transition\") }\n  }\n\n  @Test\n  fun defaultLineGradientUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, LineLayer.defaultLineGradientUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gradient-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultLineOcclusionOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineOcclusionOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-occlusion-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineOcclusionOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineOcclusionOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-occlusion-opacity\") }\n  }\n\n  @Test\n  fun defaultLineOcclusionOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineOcclusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineOcclusionOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-occlusion-opacity\") }\n  }\n\n  @Test\n  fun defaultLineOcclusionOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineOcclusionOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-occlusion-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultLineOffsetTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineOffset?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineOffsetAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineOffsetAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-offset\") }\n  }\n\n  @Test\n  fun defaultLineOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineOffset!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-offset\") }\n  }\n\n  @Test\n  fun defaultLineOffsetTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineOffsetTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-offset-transition\") }\n  }\n\n  @Test\n  fun defaultLineOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-opacity\") }\n  }\n\n  @Test\n  fun defaultLineOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-opacity\") }\n  }\n\n  @Test\n  fun defaultLineOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultLinePatternTest() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), LineLayer.defaultLinePattern?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLinePatternAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLinePatternAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern\") }\n  }\n\n  @Test\n  fun defaultLinePatternAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    assertEquals(\"abc\", LineLayer.defaultLinePatternAsExpression.toString())\n    assertEquals(\"abc\", LineLayer.defaultLinePattern)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern\") }\n  }\n\n  @Test\n  fun defaultLinePatternCrossFadeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLinePatternCrossFade?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern-cross-fade\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLinePatternCrossFadeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLinePatternCrossFadeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun defaultLinePatternCrossFadeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLinePatternCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLinePatternCrossFade!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern-cross-fade\") }\n  }\n\n  @Test\n  fun defaultLineTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineTranslate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineTranslateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineTranslateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate\") }\n  }\n\n  @Test\n  fun defaultLineTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", LineLayer.defaultLineTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), LineLayer.defaultLineTranslate!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate\") }\n  }\n\n  @Test\n  fun defaultLineTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineTranslateTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate-transition\") }\n  }\n\n  @Test\n  fun defaultLineTranslateAnchorTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(LineTranslateAnchor.MAP, LineLayer.defaultLineTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineTranslateAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineTranslateAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultLineTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), LineLayer.defaultLineTranslateAnchorAsExpression?.toString())\n    assertEquals(LineTranslateAnchor.MAP.value, LineLayer.defaultLineTranslateAnchorAsExpression.toString())\n    assertEquals(LineTranslateAnchor.MAP, LineLayer.defaultLineTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultLineTrimColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineTrimColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color\") }\n  }\n\n  @Test\n  fun defaultLineTrimColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, LineLayer.defaultLineTrimColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultLineTrimColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineTrimColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color\") }\n  }\n\n  @Test\n  fun defaultLineTrimColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), LineLayer.defaultLineTrimColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", LineLayer.defaultLineTrimColor)\n    assertEquals(Color.BLACK, LineLayer.defaultLineTrimColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color\") }\n  }\n\n  @Test\n  fun defaultLineTrimColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, LineLayer.defaultLineTrimColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color\") }\n  }\n\n  @Test\n  fun defaultLineTrimColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineTrimColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color-transition\") }\n  }\n\n  @Test\n  fun defaultLineTrimFadeRangeTest() {\n    val testValue = listOf(0.5, 0.5)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.5, 0.5)\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineTrimFadeRange?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-fade-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineTrimFadeRangeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineTrimFadeRangeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-fade-range\") }\n  }\n\n  @Test\n  fun defaultLineTrimFadeRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.5, 0.5))\n    assertEquals(\"[literal, [0.5, 0.5]]\", LineLayer.defaultLineTrimFadeRangeAsExpression.toString())\n    assertEquals(listOf(0.5, 0.5), LineLayer.defaultLineTrimFadeRange!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-fade-range\") }\n  }\n\n  @Test\n  fun defaultLineTrimOffsetTest() {\n    val testValue = listOf(0.5, 0.5)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.5, 0.5)\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineTrimOffset?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineTrimOffsetAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineTrimOffsetAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-offset\") }\n  }\n\n  @Test\n  fun defaultLineTrimOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.5, 0.5))\n    assertEquals(\"[literal, [0.5, 0.5]]\", LineLayer.defaultLineTrimOffsetAsExpression.toString())\n    assertEquals(listOf(0.5, 0.5), LineLayer.defaultLineTrimOffset!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-offset\") }\n  }\n\n  @Test\n  fun defaultLineWidthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LineLayer.defaultLineWidth?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLineWidthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LineLayer.defaultLineWidthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width\") }\n  }\n\n  @Test\n  fun defaultLineWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LineLayer.defaultLineWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LineLayer.defaultLineWidth!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width\") }\n  }\n\n  @Test\n  fun defaultLineWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LineLayer.defaultLineWidthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width-transition\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, LineLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/LocationIndicatorLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass LocationIndicatorLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n  // Property getters and setters\n\n  @Test\n  fun accuracyRadiusSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.accuracyRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun accuracyRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.accuracyRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun accuracyRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun accuracyRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.accuracyRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius\") }\n  }\n\n  @Test\n  fun accuracyRadiusAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.accuracyRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius\") }\n  }\n\n  @Test\n  fun accuracyRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.accuracyRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.accuracyRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius\") }\n  }\n\n  @Test\n  fun accuracyRadiusTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun accuracyRadiusTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.accuracyRadiusTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-transition\") }\n  }\n\n  @Test\n  fun accuracyRadiusTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.accuracyRadiusBorderColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-border-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.accuracyRadiusBorderColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorUseThemeSetAfterInitialization() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.accuracyRadiusBorderColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-border-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"accuracy-radius-border-color-use-theme\"))\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.accuracyRadiusBorderColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun accuracyRadiusBorderColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusBorderColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-border-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.accuracyRadiusBorderColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color-use-theme\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorUseThemeAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.accuracyRadiusBorderColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color-use-theme\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.accuracyRadiusBorderColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color-use-theme\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.accuracyRadiusBorderColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color-use-theme\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusBorderColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-border-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.accuracyRadiusBorderColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.accuracyRadiusBorderColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.accuracyRadiusBorderColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.accuracyRadiusBorderColor)\n    assertEquals(Color.BLACK, layer.accuracyRadiusBorderColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorAsColorIntSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusBorderColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-border-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.accuracyRadiusBorderColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusBorderColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-border-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.accuracyRadiusBorderColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-border-color-transition\") }\n  }\n\n  @Test\n  fun accuracyRadiusBorderColorTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusBorderColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-border-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun accuracyRadiusColorSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.accuracyRadiusColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun accuracyRadiusColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.accuracyRadiusColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorUseThemeSetAfterInitialization() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.accuracyRadiusColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun accuracyRadiusColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"accuracy-radius-color-use-theme\"))\n  }\n\n  @Test\n  fun accuracyRadiusColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.accuracyRadiusColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun accuracyRadiusColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun accuracyRadiusColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.accuracyRadiusColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color-use-theme\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorUseThemeAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.accuracyRadiusColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color-use-theme\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.accuracyRadiusColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color-use-theme\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.accuracyRadiusColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color-use-theme\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun accuracyRadiusColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.accuracyRadiusColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.accuracyRadiusColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.accuracyRadiusColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.accuracyRadiusColor)\n    assertEquals(Color.BLACK, layer.accuracyRadiusColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorAsColorIntSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun accuracyRadiusColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.accuracyRadiusColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun accuracyRadiusColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.accuracyRadiusColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"accuracy-radius-color-transition\") }\n  }\n\n  @Test\n  fun accuracyRadiusColorTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.accuracyRadiusColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"accuracy-radius-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun bearingSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.bearing(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"bearing\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun bearingGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.bearing?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"bearing\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun bearingAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.bearing(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"bearing\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun bearingAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.bearingAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"bearing\") }\n  }\n\n  @Test\n  fun bearingAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.bearingAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"bearing\") }\n  }\n\n  @Test\n  fun bearingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.bearingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.bearing!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"bearing\") }\n  }\n\n  @Test\n  fun bearingTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.bearingTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"bearing-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun bearingTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.bearingTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-transition\") }\n  }\n\n  @Test\n  fun bearingTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.bearingTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"bearing-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun bearingImageSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.bearingImage(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"bearing-image\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun bearingImageGet() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.bearingImage?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-image\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun bearingImageAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.bearingImage(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"bearing-image\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun bearingImageAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.bearingImageAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-image\") }\n  }\n\n  @Test\n  fun bearingImageAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.bearingImageAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-image\") }\n  }\n\n  @Test\n  fun bearingImageAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.bearingImageAsExpression.toString())\n    assertEquals(\"abc\", layer.bearingImage)\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-image\") }\n  }\n\n  @Test\n  fun bearingImageSizeSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.bearingImageSize(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"bearing-image-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun bearingImageSizeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.bearingImageSize?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-image-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun bearingImageSizeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.bearingImageSize(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"bearing-image-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun bearingImageSizeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.bearingImageSizeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-image-size\") }\n  }\n\n  @Test\n  fun bearingImageSizeAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.bearingImageSizeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-image-size\") }\n  }\n\n  @Test\n  fun bearingImageSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.bearingImageSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.bearingImageSize!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-image-size\") }\n  }\n\n  @Test\n  fun bearingImageSizeTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.bearingImageSizeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"bearing-image-size-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun bearingImageSizeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.bearingImageSizeTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"bearing-image-size-transition\") }\n  }\n\n  @Test\n  fun bearingImageSizeTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.bearingImageSizeTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"bearing-image-size-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun emphasisCircleColorSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.emphasisCircleColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun emphasisCircleColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.emphasisCircleColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color\") }\n  }\n\n  @Test\n  fun emphasisCircleColorUseThemeSetAfterInitialization() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.emphasisCircleColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun emphasisCircleColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"emphasis-circle-color-use-theme\"))\n  }\n\n  @Test\n  fun emphasisCircleColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.emphasisCircleColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun emphasisCircleColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun emphasisCircleColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.emphasisCircleColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color-use-theme\") }\n  }\n\n  @Test\n  fun emphasisCircleColorUseThemeAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.emphasisCircleColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color-use-theme\") }\n  }\n\n  @Test\n  fun emphasisCircleColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.emphasisCircleColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color-use-theme\") }\n  }\n\n  @Test\n  fun emphasisCircleColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.emphasisCircleColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color-use-theme\") }\n  }\n\n  @Test\n  fun emphasisCircleColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun emphasisCircleColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.emphasisCircleColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color\") }\n  }\n\n  @Test\n  fun emphasisCircleColorAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.emphasisCircleColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color\") }\n  }\n\n  @Test\n  fun emphasisCircleColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.emphasisCircleColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.emphasisCircleColor)\n    assertEquals(Color.BLACK, layer.emphasisCircleColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color\") }\n  }\n\n  @Test\n  fun emphasisCircleColorAsColorIntSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun emphasisCircleColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.emphasisCircleColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color\") }\n  }\n\n  @Test\n  fun emphasisCircleColorTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun emphasisCircleColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.emphasisCircleColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-color-transition\") }\n  }\n\n  @Test\n  fun emphasisCircleColorTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun emphasisCircleGlowRangeSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.emphasisCircleGlowRange(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-glow-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun emphasisCircleGlowRangeGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.emphasisCircleGlowRange?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-glow-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun emphasisCircleGlowRangeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleGlowRange(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-glow-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun emphasisCircleGlowRangeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.emphasisCircleGlowRangeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-glow-range\") }\n  }\n\n  @Test\n  fun emphasisCircleGlowRangeAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.emphasisCircleGlowRangeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-glow-range\") }\n  }\n\n  @Test\n  fun emphasisCircleGlowRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.emphasisCircleGlowRangeAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.emphasisCircleGlowRange!!)\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-glow-range\") }\n  }\n\n  @Test\n  fun emphasisCircleGlowRangeTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleGlowRangeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-glow-range-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun emphasisCircleGlowRangeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.emphasisCircleGlowRangeTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-glow-range-transition\") }\n  }\n\n  @Test\n  fun emphasisCircleGlowRangeTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleGlowRangeTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-glow-range-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun emphasisCircleRadiusSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.emphasisCircleRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun emphasisCircleRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.emphasisCircleRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun emphasisCircleRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun emphasisCircleRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.emphasisCircleRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-radius\") }\n  }\n\n  @Test\n  fun emphasisCircleRadiusAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.emphasisCircleRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-radius\") }\n  }\n\n  @Test\n  fun emphasisCircleRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.emphasisCircleRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.emphasisCircleRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-radius\") }\n  }\n\n  @Test\n  fun emphasisCircleRadiusTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleRadiusTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun emphasisCircleRadiusTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.emphasisCircleRadiusTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"emphasis-circle-radius-transition\") }\n  }\n\n  @Test\n  fun emphasisCircleRadiusTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.emphasisCircleRadiusTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"emphasis-circle-radius-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun imagePitchDisplacementSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.imagePitchDisplacement(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"image-pitch-displacement\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun imagePitchDisplacementGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.imagePitchDisplacement?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"image-pitch-displacement\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun imagePitchDisplacementAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.imagePitchDisplacement(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"image-pitch-displacement\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun imagePitchDisplacementAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.imagePitchDisplacementAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"image-pitch-displacement\") }\n  }\n\n  @Test\n  fun imagePitchDisplacementAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.imagePitchDisplacementAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"image-pitch-displacement\") }\n  }\n\n  @Test\n  fun imagePitchDisplacementAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.imagePitchDisplacementAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.imagePitchDisplacement!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"image-pitch-displacement\") }\n  }\n\n  @Test\n  fun locationSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = listOf(0.0, 1.0, 2.0)\n    layer.bindTo(style)\n    layer.location(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"location\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0, 2.0]\")\n  }\n\n  @Test\n  fun locationGet() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0, 2.0)\n    assertEquals(expectedValue.toString(), layer.location?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"location\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun locationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.location(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"location\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun locationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.locationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"location\") }\n  }\n\n  @Test\n  fun locationAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.locationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"location\") }\n  }\n\n  @Test\n  fun locationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0))\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0, 2.0]]\", layer.locationAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0), layer.location!!)\n    verify { style.getStyleLayerProperty(\"id\", \"location\") }\n  }\n\n  @Test\n  fun locationTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.locationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"location-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun locationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.locationTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"location-transition\") }\n  }\n\n  @Test\n  fun locationTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.locationTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"location-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun locationIndicatorOpacitySet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.locationIndicatorOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"location-indicator-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun locationIndicatorOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.locationIndicatorOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"location-indicator-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun locationIndicatorOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.locationIndicatorOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"location-indicator-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun locationIndicatorOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.locationIndicatorOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"location-indicator-opacity\") }\n  }\n\n  @Test\n  fun locationIndicatorOpacityAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.locationIndicatorOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"location-indicator-opacity\") }\n  }\n\n  @Test\n  fun locationIndicatorOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.locationIndicatorOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.locationIndicatorOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"location-indicator-opacity\") }\n  }\n\n  @Test\n  fun locationIndicatorOpacityTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.locationIndicatorOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"location-indicator-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun locationIndicatorOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.locationIndicatorOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"location-indicator-opacity-transition\") }\n  }\n\n  @Test\n  fun locationIndicatorOpacityTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.locationIndicatorOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"location-indicator-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun perspectiveCompensationSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.perspectiveCompensation(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"perspective-compensation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun perspectiveCompensationGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.perspectiveCompensation?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"perspective-compensation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun perspectiveCompensationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.perspectiveCompensation(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"perspective-compensation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun perspectiveCompensationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.perspectiveCompensationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"perspective-compensation\") }\n  }\n\n  @Test\n  fun perspectiveCompensationAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.perspectiveCompensationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"perspective-compensation\") }\n  }\n\n  @Test\n  fun perspectiveCompensationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.perspectiveCompensationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.perspectiveCompensation!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"perspective-compensation\") }\n  }\n\n  @Test\n  fun shadowImageSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.shadowImage(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"shadow-image\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun shadowImageGet() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.shadowImage?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"shadow-image\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun shadowImageAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.shadowImage(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"shadow-image\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun shadowImageAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.shadowImageAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"shadow-image\") }\n  }\n\n  @Test\n  fun shadowImageAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.shadowImageAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"shadow-image\") }\n  }\n\n  @Test\n  fun shadowImageAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.shadowImageAsExpression.toString())\n    assertEquals(\"abc\", layer.shadowImage)\n    verify { style.getStyleLayerProperty(\"id\", \"shadow-image\") }\n  }\n\n  @Test\n  fun shadowImageSizeSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.shadowImageSize(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"shadow-image-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun shadowImageSizeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.shadowImageSize?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"shadow-image-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun shadowImageSizeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.shadowImageSize(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"shadow-image-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun shadowImageSizeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.shadowImageSizeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"shadow-image-size\") }\n  }\n\n  @Test\n  fun shadowImageSizeAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.shadowImageSizeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"shadow-image-size\") }\n  }\n\n  @Test\n  fun shadowImageSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.shadowImageSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.shadowImageSize!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"shadow-image-size\") }\n  }\n\n  @Test\n  fun shadowImageSizeTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.shadowImageSizeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"shadow-image-size-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun shadowImageSizeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.shadowImageSizeTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"shadow-image-size-transition\") }\n  }\n\n  @Test\n  fun shadowImageSizeTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.shadowImageSizeTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"shadow-image-size-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun topImageSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.topImage(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"top-image\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun topImageGet() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.topImage?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"top-image\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun topImageAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.topImage(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"top-image\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun topImageAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.topImageAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"top-image\") }\n  }\n\n  @Test\n  fun topImageAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.topImageAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"top-image\") }\n  }\n\n  @Test\n  fun topImageAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.topImageAsExpression.toString())\n    assertEquals(\"abc\", layer.topImage)\n    verify { style.getStyleLayerProperty(\"id\", \"top-image\") }\n  }\n\n  @Test\n  fun topImageSizeSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.topImageSize(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"top-image-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun topImageSizeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.topImageSize?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"top-image-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun topImageSizeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.topImageSize(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"top-image-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun topImageSizeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.topImageSizeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"top-image-size\") }\n  }\n\n  @Test\n  fun topImageSizeAsExpressionGetNull() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.topImageSizeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"top-image-size\") }\n  }\n\n  @Test\n  fun topImageSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.topImageSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.topImageSize!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"top-image-size\") }\n  }\n\n  @Test\n  fun topImageSizeTransitionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.topImageSizeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"top-image-size-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun topImageSizeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.topImageSizeTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"top-image-size-transition\") }\n  }\n\n  @Test\n  fun topImageSizeTransitionSetDsl() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.topImageSizeTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"top-image-size-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = locationIndicatorLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = locationIndicatorLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = locationIndicatorLayer(\"id\") { }\n    assertEquals(\"location-indicator\", layer.getType())\n  }\n\n  @Test\n  fun getLocationIndicatorLayerTest() {\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"location-indicator\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as LocationIndicatorLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"location-indicator\", layer.getType())\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultAccuracyRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultAccuracyRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultAccuracyRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultAccuracyRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LocationIndicatorLayer.defaultAccuracyRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LocationIndicatorLayer.defaultAccuracyRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultAccuracyRadiusTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-transition\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusBorderColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultAccuracyRadiusBorderColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusBorderColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, LocationIndicatorLayer.defaultAccuracyRadiusBorderColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultAccuracyRadiusBorderColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusBorderColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", LocationIndicatorLayer.defaultAccuracyRadiusBorderColor)\n    assertEquals(Color.BLACK, LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusBorderColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusBorderColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultAccuracyRadiusBorderColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-border-color-transition\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultAccuracyRadiusColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, LocationIndicatorLayer.defaultAccuracyRadiusColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultAccuracyRadiusColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultAccuracyRadiusColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultAccuracyRadiusColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", LocationIndicatorLayer.defaultAccuracyRadiusColor)\n    assertEquals(Color.BLACK, LocationIndicatorLayer.defaultAccuracyRadiusColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, LocationIndicatorLayer.defaultAccuracyRadiusColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color\") }\n  }\n\n  @Test\n  fun defaultAccuracyRadiusColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultAccuracyRadiusColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"accuracy-radius-color-transition\") }\n  }\n\n  @Test\n  fun defaultBearingTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultBearing?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultBearingAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultBearingAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing\") }\n  }\n\n  @Test\n  fun defaultBearingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LocationIndicatorLayer.defaultBearingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LocationIndicatorLayer.defaultBearing!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing\") }\n  }\n\n  @Test\n  fun defaultBearingTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultBearingTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-transition\") }\n  }\n\n  @Test\n  fun defaultBearingImageTest() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultBearingImage?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultBearingImageAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultBearingImageAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image\") }\n  }\n\n  @Test\n  fun defaultBearingImageAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    assertEquals(\"abc\", LocationIndicatorLayer.defaultBearingImageAsExpression.toString())\n    assertEquals(\"abc\", LocationIndicatorLayer.defaultBearingImage)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image\") }\n  }\n\n  @Test\n  fun defaultBearingImageSizeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultBearingImageSize?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultBearingImageSizeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultBearingImageSizeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image-size\") }\n  }\n\n  @Test\n  fun defaultBearingImageSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LocationIndicatorLayer.defaultBearingImageSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LocationIndicatorLayer.defaultBearingImageSize!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image-size\") }\n  }\n\n  @Test\n  fun defaultBearingImageSizeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultBearingImageSizeTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"bearing-image-size-transition\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultEmphasisCircleColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, LocationIndicatorLayer.defaultEmphasisCircleColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultEmphasisCircleColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultEmphasisCircleColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultEmphasisCircleColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", LocationIndicatorLayer.defaultEmphasisCircleColor)\n    assertEquals(Color.BLACK, LocationIndicatorLayer.defaultEmphasisCircleColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, LocationIndicatorLayer.defaultEmphasisCircleColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultEmphasisCircleColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-color-transition\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleGlowRangeTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultEmphasisCircleGlowRange?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-glow-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultEmphasisCircleGlowRangeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultEmphasisCircleGlowRangeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-glow-range\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleGlowRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", LocationIndicatorLayer.defaultEmphasisCircleGlowRangeAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), LocationIndicatorLayer.defaultEmphasisCircleGlowRange!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-glow-range\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleGlowRangeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultEmphasisCircleGlowRangeTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-glow-range-transition\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultEmphasisCircleRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultEmphasisCircleRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultEmphasisCircleRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-radius\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LocationIndicatorLayer.defaultEmphasisCircleRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LocationIndicatorLayer.defaultEmphasisCircleRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-radius\") }\n  }\n\n  @Test\n  fun defaultEmphasisCircleRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultEmphasisCircleRadiusTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"emphasis-circle-radius-transition\") }\n  }\n\n  @Test\n  fun defaultImagePitchDisplacementTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultImagePitchDisplacement?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"image-pitch-displacement\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultImagePitchDisplacementAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultImagePitchDisplacementAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"image-pitch-displacement\") }\n  }\n\n  @Test\n  fun defaultImagePitchDisplacementAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LocationIndicatorLayer.defaultImagePitchDisplacementAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LocationIndicatorLayer.defaultImagePitchDisplacement!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"image-pitch-displacement\") }\n  }\n\n  @Test\n  fun defaultLocationTest() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0, 2.0)\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultLocation?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLocationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultLocationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location\") }\n  }\n\n  @Test\n  fun defaultLocationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0))\n    assertEquals(\"[literal, [0.0, 1.0, 2.0]]\", LocationIndicatorLayer.defaultLocationAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0), LocationIndicatorLayer.defaultLocation!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location\") }\n  }\n\n  @Test\n  fun defaultLocationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultLocationTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location-transition\") }\n  }\n\n  @Test\n  fun defaultLocationIndicatorOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultLocationIndicatorOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location-indicator-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultLocationIndicatorOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultLocationIndicatorOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location-indicator-opacity\") }\n  }\n\n  @Test\n  fun defaultLocationIndicatorOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LocationIndicatorLayer.defaultLocationIndicatorOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LocationIndicatorLayer.defaultLocationIndicatorOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location-indicator-opacity\") }\n  }\n\n  @Test\n  fun defaultLocationIndicatorOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultLocationIndicatorOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"location-indicator-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultPerspectiveCompensationTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultPerspectiveCompensation?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"perspective-compensation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultPerspectiveCompensationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultPerspectiveCompensationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"perspective-compensation\") }\n  }\n\n  @Test\n  fun defaultPerspectiveCompensationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LocationIndicatorLayer.defaultPerspectiveCompensationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LocationIndicatorLayer.defaultPerspectiveCompensation!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"perspective-compensation\") }\n  }\n\n  @Test\n  fun defaultShadowImageTest() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultShadowImage?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultShadowImageAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultShadowImageAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image\") }\n  }\n\n  @Test\n  fun defaultShadowImageAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    assertEquals(\"abc\", LocationIndicatorLayer.defaultShadowImageAsExpression.toString())\n    assertEquals(\"abc\", LocationIndicatorLayer.defaultShadowImage)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image\") }\n  }\n\n  @Test\n  fun defaultShadowImageSizeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultShadowImageSize?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultShadowImageSizeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultShadowImageSizeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image-size\") }\n  }\n\n  @Test\n  fun defaultShadowImageSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LocationIndicatorLayer.defaultShadowImageSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LocationIndicatorLayer.defaultShadowImageSize!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image-size\") }\n  }\n\n  @Test\n  fun defaultShadowImageSizeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultShadowImageSizeTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"shadow-image-size-transition\") }\n  }\n\n  @Test\n  fun defaultTopImageTest() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultTopImage?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTopImageAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultTopImageAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image\") }\n  }\n\n  @Test\n  fun defaultTopImageAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    assertEquals(\"abc\", LocationIndicatorLayer.defaultTopImageAsExpression.toString())\n    assertEquals(\"abc\", LocationIndicatorLayer.defaultTopImage)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image\") }\n  }\n\n  @Test\n  fun defaultTopImageSizeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), LocationIndicatorLayer.defaultTopImageSize?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTopImageSizeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), LocationIndicatorLayer.defaultTopImageSizeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image-size\") }\n  }\n\n  @Test\n  fun defaultTopImageSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, LocationIndicatorLayer.defaultTopImageSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, LocationIndicatorLayer.defaultTopImageSize!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image-size\") }\n  }\n\n  @Test\n  fun defaultTopImageSizeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), LocationIndicatorLayer.defaultTopImageSizeTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"top-image-size-transition\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, LocationIndicatorLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"location-indicator\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/ModelLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass ModelLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = modelLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=model}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = modelLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=model, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = modelLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=model}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun modelAllowDensityReductionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.modelAllowDensityReduction(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-allow-density-reduction\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun modelAllowDensityReductionGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.modelAllowDensityReduction?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-allow-density-reduction\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelAllowDensityReductionAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelAllowDensityReduction(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-allow-density-reduction\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelAllowDensityReductionAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelAllowDensityReductionAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-allow-density-reduction\") }\n  }\n\n  @Test\n  fun modelAllowDensityReductionAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelAllowDensityReductionAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-allow-density-reduction\") }\n  }\n\n  @Test\n  fun modelAllowDensityReductionAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.modelAllowDensityReductionAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.modelAllowDensityReduction)\n    verify { style.getStyleLayerProperty(\"id\", \"model-allow-density-reduction\") }\n  }\n\n  @Test\n  fun modelIdSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.modelId(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-id\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun modelIdGet() {\n    val testValue = \"abc\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.modelId?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-id\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelIdAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelId(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-id\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelIdAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelIdAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-id\") }\n  }\n\n  @Test\n  fun modelIdAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelIdAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-id\") }\n  }\n\n  @Test\n  fun modelIdAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.modelIdAsExpression.toString())\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue, layer.modelId)\n    verify { style.getStyleLayerProperty(\"id\", \"model-id\") }\n  }\n\n  @Test\n  fun modelAmbientOcclusionIntensitySet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.modelAmbientOcclusionIntensity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-ambient-occlusion-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun modelAmbientOcclusionIntensityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.modelAmbientOcclusionIntensity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-ambient-occlusion-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelAmbientOcclusionIntensityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelAmbientOcclusionIntensity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-ambient-occlusion-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelAmbientOcclusionIntensityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelAmbientOcclusionIntensityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun modelAmbientOcclusionIntensityAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelAmbientOcclusionIntensityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun modelAmbientOcclusionIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.modelAmbientOcclusionIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.modelAmbientOcclusionIntensity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"model-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun modelAmbientOcclusionIntensityTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelAmbientOcclusionIntensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-ambient-occlusion-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelAmbientOcclusionIntensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelAmbientOcclusionIntensityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-ambient-occlusion-intensity-transition\") }\n  }\n\n  @Test\n  fun modelAmbientOcclusionIntensityTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelAmbientOcclusionIntensityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-ambient-occlusion-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelCastShadowsSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.modelCastShadows(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-cast-shadows\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun modelCastShadowsGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.modelCastShadows?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-cast-shadows\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelCastShadowsAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelCastShadows(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-cast-shadows\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelCastShadowsAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelCastShadowsAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-cast-shadows\") }\n  }\n\n  @Test\n  fun modelCastShadowsAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelCastShadowsAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-cast-shadows\") }\n  }\n\n  @Test\n  fun modelCastShadowsAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.modelCastShadowsAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.modelCastShadows)\n    verify { style.getStyleLayerProperty(\"id\", \"model-cast-shadows\") }\n  }\n\n  @Test\n  fun modelColorSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.modelColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun modelColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.modelColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color\") }\n  }\n\n  @Test\n  fun modelColorUseThemeSetAfterInitialization() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.modelColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"model-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun modelColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"model-color-use-theme\"))\n  }\n\n  @Test\n  fun modelColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.modelColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun modelColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-use-theme\") }\n  }\n\n  @Test\n  fun modelColorUseThemeAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.modelColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-use-theme\") }\n  }\n\n  @Test\n  fun modelColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-use-theme\") }\n  }\n\n  @Test\n  fun modelColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.modelColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-use-theme\") }\n  }\n\n  @Test\n  fun modelColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color\") }\n  }\n\n  @Test\n  fun modelColorAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-color\") }\n  }\n\n  @Test\n  fun modelColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.modelColor)\n    assertEquals(Color.BLACK, layer.modelColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"model-color\") }\n  }\n\n  @Test\n  fun modelColorAsColorIntSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"model-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun modelColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.modelColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"model-color\") }\n  }\n\n  @Test\n  fun modelColorTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-transition\") }\n  }\n\n  @Test\n  fun modelColorTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelColorMixIntensitySet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.modelColorMixIntensity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-color-mix-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun modelColorMixIntensityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.modelColorMixIntensity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-mix-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelColorMixIntensityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelColorMixIntensity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-color-mix-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelColorMixIntensityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelColorMixIntensityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-mix-intensity\") }\n  }\n\n  @Test\n  fun modelColorMixIntensityAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelColorMixIntensityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-mix-intensity\") }\n  }\n\n  @Test\n  fun modelColorMixIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.modelColorMixIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.modelColorMixIntensity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-mix-intensity\") }\n  }\n\n  @Test\n  fun modelColorMixIntensityTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelColorMixIntensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-color-mix-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelColorMixIntensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelColorMixIntensityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-color-mix-intensity-transition\") }\n  }\n\n  @Test\n  fun modelColorMixIntensityTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelColorMixIntensityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-color-mix-intensity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelCutoffFadeRangeSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.modelCutoffFadeRange(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-cutoff-fade-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun modelCutoffFadeRangeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.modelCutoffFadeRange?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-cutoff-fade-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelCutoffFadeRangeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelCutoffFadeRange(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-cutoff-fade-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelCutoffFadeRangeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelCutoffFadeRangeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun modelCutoffFadeRangeAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelCutoffFadeRangeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun modelCutoffFadeRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.modelCutoffFadeRangeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.modelCutoffFadeRange!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"model-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun modelElevationReferenceSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelElevationReference(ModelElevationReference.SEA)\n    verify { style.setStyleLayerProperty(\"id\", \"model-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"sea\")\n  }\n\n  @Test\n  fun modelElevationReferenceGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"sea\")\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(ModelElevationReference.SEA, layer.modelElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"model-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelElevationReferenceAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelElevationReference(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelElevationReferenceAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelElevationReferenceAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-elevation-reference\") }\n  }\n\n  @Test\n  fun modelElevationReferenceAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelElevationReferenceAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-elevation-reference\") }\n  }\n\n  @Test\n  fun modelElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"sea\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.modelElevationReferenceAsExpression?.toString())\n    assertEquals(ModelElevationReference.SEA.value, layer.modelElevationReferenceAsExpression.toString())\n    assertEquals(ModelElevationReference.SEA, layer.modelElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"model-elevation-reference\") }\n  }\n\n  @Test\n  fun modelEmissiveStrengthSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.modelEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun modelEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.modelEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-emissive-strength\") }\n  }\n\n  @Test\n  fun modelEmissiveStrengthAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-emissive-strength\") }\n  }\n\n  @Test\n  fun modelEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.modelEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.modelEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"model-emissive-strength\") }\n  }\n\n  @Test\n  fun modelEmissiveStrengthTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun modelEmissiveStrengthTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelHeightBasedEmissiveStrengthMultiplierSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0, 4.0)\n    layer.bindTo(style)\n    layer.modelHeightBasedEmissiveStrengthMultiplier(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-height-based-emissive-strength-multiplier\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0, 2.0, 3.0, 4.0]\")\n  }\n\n  @Test\n  fun modelHeightBasedEmissiveStrengthMultiplierGet() {\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0, 4.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0, 2.0, 3.0, 4.0)\n    assertEquals(expectedValue.toString(), layer.modelHeightBasedEmissiveStrengthMultiplier?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-height-based-emissive-strength-multiplier\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelHeightBasedEmissiveStrengthMultiplierAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelHeightBasedEmissiveStrengthMultiplier(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-height-based-emissive-strength-multiplier\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelHeightBasedEmissiveStrengthMultiplierAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelHeightBasedEmissiveStrengthMultiplierAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-height-based-emissive-strength-multiplier\") }\n  }\n\n  @Test\n  fun modelHeightBasedEmissiveStrengthMultiplierAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelHeightBasedEmissiveStrengthMultiplierAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-height-based-emissive-strength-multiplier\") }\n  }\n\n  @Test\n  fun modelHeightBasedEmissiveStrengthMultiplierAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0, 4.0))\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0, 2.0, 3.0, 4.0]]\", layer.modelHeightBasedEmissiveStrengthMultiplierAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0, 4.0), layer.modelHeightBasedEmissiveStrengthMultiplier!!)\n    verify { style.getStyleLayerProperty(\"id\", \"model-height-based-emissive-strength-multiplier\") }\n  }\n\n  @Test\n  fun modelHeightBasedEmissiveStrengthMultiplierTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelHeightBasedEmissiveStrengthMultiplierTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-height-based-emissive-strength-multiplier-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelHeightBasedEmissiveStrengthMultiplierTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelHeightBasedEmissiveStrengthMultiplierTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-height-based-emissive-strength-multiplier-transition\") }\n  }\n\n  @Test\n  fun modelHeightBasedEmissiveStrengthMultiplierTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelHeightBasedEmissiveStrengthMultiplierTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-height-based-emissive-strength-multiplier-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelOpacitySet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.modelOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun modelOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.modelOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-opacity\") }\n  }\n\n  @Test\n  fun modelOpacityAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-opacity\") }\n  }\n\n  @Test\n  fun modelOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.modelOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.modelOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"model-opacity\") }\n  }\n\n  @Test\n  fun modelOpacityTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-opacity-transition\") }\n  }\n\n  @Test\n  fun modelOpacityTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelReceiveShadowsSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.modelReceiveShadows(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-receive-shadows\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun modelReceiveShadowsGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.modelReceiveShadows?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-receive-shadows\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelReceiveShadowsAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelReceiveShadows(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-receive-shadows\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelReceiveShadowsAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelReceiveShadowsAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-receive-shadows\") }\n  }\n\n  @Test\n  fun modelReceiveShadowsAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelReceiveShadowsAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-receive-shadows\") }\n  }\n\n  @Test\n  fun modelReceiveShadowsAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.modelReceiveShadowsAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.modelReceiveShadows)\n    verify { style.getStyleLayerProperty(\"id\", \"model-receive-shadows\") }\n  }\n\n  @Test\n  fun modelRotationSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0, 2.0)\n    layer.bindTo(style)\n    layer.modelRotation(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-rotation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0, 2.0]\")\n  }\n\n  @Test\n  fun modelRotationGet() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0, 2.0)\n    assertEquals(expectedValue.toString(), layer.modelRotation?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-rotation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelRotationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelRotation(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-rotation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelRotationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelRotationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-rotation\") }\n  }\n\n  @Test\n  fun modelRotationAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelRotationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-rotation\") }\n  }\n\n  @Test\n  fun modelRotationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0))\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0, 2.0]]\", layer.modelRotationAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0), layer.modelRotation!!)\n    verify { style.getStyleLayerProperty(\"id\", \"model-rotation\") }\n  }\n\n  @Test\n  fun modelRotationTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelRotationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-rotation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelRotationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelRotationTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-rotation-transition\") }\n  }\n\n  @Test\n  fun modelRotationTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelRotationTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-rotation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelRoughnessSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.modelRoughness(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-roughness\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun modelRoughnessGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.modelRoughness?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-roughness\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelRoughnessAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelRoughness(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-roughness\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelRoughnessAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelRoughnessAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-roughness\") }\n  }\n\n  @Test\n  fun modelRoughnessAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelRoughnessAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-roughness\") }\n  }\n\n  @Test\n  fun modelRoughnessAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.modelRoughnessAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.modelRoughness!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"model-roughness\") }\n  }\n\n  @Test\n  fun modelRoughnessTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelRoughnessTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-roughness-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelRoughnessTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelRoughnessTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-roughness-transition\") }\n  }\n\n  @Test\n  fun modelRoughnessTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelRoughnessTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-roughness-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelScaleSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0, 2.0)\n    layer.bindTo(style)\n    layer.modelScale(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-scale\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0, 2.0]\")\n  }\n\n  @Test\n  fun modelScaleGet() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0, 2.0)\n    assertEquals(expectedValue.toString(), layer.modelScale?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-scale\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelScaleAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelScale(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-scale\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelScaleAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelScaleAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-scale\") }\n  }\n\n  @Test\n  fun modelScaleAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelScaleAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-scale\") }\n  }\n\n  @Test\n  fun modelScaleAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0))\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0, 2.0]]\", layer.modelScaleAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0), layer.modelScale!!)\n    verify { style.getStyleLayerProperty(\"id\", \"model-scale\") }\n  }\n\n  @Test\n  fun modelScaleTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelScaleTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-scale-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelScaleTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelScaleTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-scale-transition\") }\n  }\n\n  @Test\n  fun modelScaleTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelScaleTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-scale-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelScaleModeSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelScaleMode(ModelScaleMode.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"model-scale-mode\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun modelScaleModeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(ModelScaleMode.MAP, layer.modelScaleMode)\n    verify { style.getStyleLayerProperty(\"id\", \"model-scale-mode\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelScaleModeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelScaleMode(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-scale-mode\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelScaleModeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelScaleModeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-scale-mode\") }\n  }\n\n  @Test\n  fun modelScaleModeAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelScaleModeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-scale-mode\") }\n  }\n\n  @Test\n  fun modelScaleModeAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.modelScaleModeAsExpression?.toString())\n    assertEquals(ModelScaleMode.MAP.value, layer.modelScaleModeAsExpression.toString())\n    assertEquals(ModelScaleMode.MAP, layer.modelScaleMode)\n    verify { style.getStyleLayerProperty(\"id\", \"model-scale-mode\") }\n  }\n\n  @Test\n  fun modelTranslationSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0, 2.0)\n    layer.bindTo(style)\n    layer.modelTranslation(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"model-translation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0, 2.0]\")\n  }\n\n  @Test\n  fun modelTranslationGet() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0, 2.0)\n    assertEquals(expectedValue.toString(), layer.modelTranslation?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-translation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelTranslationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelTranslation(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-translation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelTranslationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelTranslationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-translation\") }\n  }\n\n  @Test\n  fun modelTranslationAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelTranslationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-translation\") }\n  }\n\n  @Test\n  fun modelTranslationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0))\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0, 2.0]]\", layer.modelTranslationAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0), layer.modelTranslation!!)\n    verify { style.getStyleLayerProperty(\"id\", \"model-translation\") }\n  }\n\n  @Test\n  fun modelTranslationTransitionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelTranslationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"model-translation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelTranslationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.modelTranslationTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-translation-transition\") }\n  }\n\n  @Test\n  fun modelTranslationTransitionSetDsl() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelTranslationTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"model-translation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun modelTypeSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelType(ModelType.COMMON_3D)\n    verify { style.setStyleLayerProperty(\"id\", \"model-type\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"common-3d\")\n  }\n\n  @Test\n  fun modelTypeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"common-3d\")\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(ModelType.COMMON_3D, layer.modelType)\n    verify { style.getStyleLayerProperty(\"id\", \"model-type\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun modelTypeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.modelType(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"model-type\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun modelTypeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.modelTypeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"model-type\") }\n  }\n\n  @Test\n  fun modelTypeAsExpressionGetNull() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.modelTypeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"model-type\") }\n  }\n\n  @Test\n  fun modelTypeAsExpressionGetFromLiteral() {\n    val value = \"common-3d\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.modelTypeAsExpression?.toString())\n    assertEquals(ModelType.COMMON_3D.value, layer.modelTypeAsExpression.toString())\n    assertEquals(ModelType.COMMON_3D, layer.modelType)\n    verify { style.getStyleLayerProperty(\"id\", \"model-type\") }\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = modelLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = modelLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = modelLayer(\"id\", \"source\") { }\n    assertEquals(\"model\", layer.getType())\n  }\n\n  @Test\n  fun getModelLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"model\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as ModelLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"model\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultModelAllowDensityReductionTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelAllowDensityReduction?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-allow-density-reduction\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelAllowDensityReductionAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelAllowDensityReductionAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-allow-density-reduction\") }\n  }\n\n  @Test\n  fun defaultModelAllowDensityReductionAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", ModelLayer.defaultModelAllowDensityReductionAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, ModelLayer.defaultModelAllowDensityReduction)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-allow-density-reduction\") }\n  }\n\n  @Test\n  fun defaultModelIdTest() {\n    val testValue = \"abc\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelId?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-id\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelIdAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelIdAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-id\") }\n  }\n\n  @Test\n  fun defaultModelIdAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    assertEquals(\"abc\", ModelLayer.defaultModelIdAsExpression.toString())\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue, ModelLayer.defaultModelId)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-id\") }\n  }\n\n  @Test\n  fun defaultModelAmbientOcclusionIntensityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelAmbientOcclusionIntensity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-ambient-occlusion-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelAmbientOcclusionIntensityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelAmbientOcclusionIntensityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun defaultModelAmbientOcclusionIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, ModelLayer.defaultModelAmbientOcclusionIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, ModelLayer.defaultModelAmbientOcclusionIntensity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-ambient-occlusion-intensity\") }\n  }\n\n  @Test\n  fun defaultModelAmbientOcclusionIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelAmbientOcclusionIntensityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-ambient-occlusion-intensity-transition\") }\n  }\n\n  @Test\n  fun defaultModelCastShadowsTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelCastShadows?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cast-shadows\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelCastShadowsAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelCastShadowsAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cast-shadows\") }\n  }\n\n  @Test\n  fun defaultModelCastShadowsAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", ModelLayer.defaultModelCastShadowsAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, ModelLayer.defaultModelCastShadows)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cast-shadows\") }\n  }\n\n  @Test\n  fun defaultModelColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color\") }\n  }\n\n  @Test\n  fun defaultModelColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, ModelLayer.defaultModelColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultModelColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color\") }\n  }\n\n  @Test\n  fun defaultModelColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", ModelLayer.defaultModelColor)\n    assertEquals(Color.BLACK, ModelLayer.defaultModelColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color\") }\n  }\n\n  @Test\n  fun defaultModelColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, ModelLayer.defaultModelColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color\") }\n  }\n\n  @Test\n  fun defaultModelColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-transition\") }\n  }\n\n  @Test\n  fun defaultModelColorMixIntensityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelColorMixIntensity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-mix-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelColorMixIntensityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelColorMixIntensityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-mix-intensity\") }\n  }\n\n  @Test\n  fun defaultModelColorMixIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, ModelLayer.defaultModelColorMixIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, ModelLayer.defaultModelColorMixIntensity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-mix-intensity\") }\n  }\n\n  @Test\n  fun defaultModelColorMixIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelColorMixIntensityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-color-mix-intensity-transition\") }\n  }\n\n  @Test\n  fun defaultModelCutoffFadeRangeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelCutoffFadeRange?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cutoff-fade-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelCutoffFadeRangeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelCutoffFadeRangeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun defaultModelCutoffFadeRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, ModelLayer.defaultModelCutoffFadeRangeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, ModelLayer.defaultModelCutoffFadeRange!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-cutoff-fade-range\") }\n  }\n\n  @Test\n  fun defaultModelElevationReferenceTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"sea\")\n\n    assertEquals(ModelElevationReference.SEA, ModelLayer.defaultModelElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelElevationReferenceAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelElevationReferenceAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultModelElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"sea\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), ModelLayer.defaultModelElevationReferenceAsExpression?.toString())\n    assertEquals(ModelElevationReference.SEA.value, ModelLayer.defaultModelElevationReferenceAsExpression.toString())\n    assertEquals(ModelElevationReference.SEA, ModelLayer.defaultModelElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultModelEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultModelEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, ModelLayer.defaultModelEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, ModelLayer.defaultModelEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultModelEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultModelHeightBasedEmissiveStrengthMultiplierTest() {\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0, 4.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0, 2.0, 3.0, 4.0)\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplier?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-height-based-emissive-strength-multiplier\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelHeightBasedEmissiveStrengthMultiplierAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplierAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-height-based-emissive-strength-multiplier\") }\n  }\n\n  @Test\n  fun defaultModelHeightBasedEmissiveStrengthMultiplierAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0, 4.0))\n    assertEquals(\"[literal, [0.0, 1.0, 2.0, 3.0, 4.0]]\", ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplierAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0, 4.0), ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplier!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-height-based-emissive-strength-multiplier\") }\n  }\n\n  @Test\n  fun defaultModelHeightBasedEmissiveStrengthMultiplierTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplierTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-height-based-emissive-strength-multiplier-transition\") }\n  }\n\n  @Test\n  fun defaultModelOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-opacity\") }\n  }\n\n  @Test\n  fun defaultModelOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, ModelLayer.defaultModelOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, ModelLayer.defaultModelOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-opacity\") }\n  }\n\n  @Test\n  fun defaultModelOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultModelReceiveShadowsTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelReceiveShadows?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-receive-shadows\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelReceiveShadowsAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelReceiveShadowsAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-receive-shadows\") }\n  }\n\n  @Test\n  fun defaultModelReceiveShadowsAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", ModelLayer.defaultModelReceiveShadowsAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, ModelLayer.defaultModelReceiveShadows)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-receive-shadows\") }\n  }\n\n  @Test\n  fun defaultModelRotationTest() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0, 2.0)\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelRotation?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-rotation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelRotationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelRotationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-rotation\") }\n  }\n\n  @Test\n  fun defaultModelRotationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0))\n    assertEquals(\"[literal, [0.0, 1.0, 2.0]]\", ModelLayer.defaultModelRotationAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0), ModelLayer.defaultModelRotation!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-rotation\") }\n  }\n\n  @Test\n  fun defaultModelRotationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelRotationTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-rotation-transition\") }\n  }\n\n  @Test\n  fun defaultModelRoughnessTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelRoughness?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-roughness\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelRoughnessAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelRoughnessAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-roughness\") }\n  }\n\n  @Test\n  fun defaultModelRoughnessAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, ModelLayer.defaultModelRoughnessAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, ModelLayer.defaultModelRoughness!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-roughness\") }\n  }\n\n  @Test\n  fun defaultModelRoughnessTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelRoughnessTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-roughness-transition\") }\n  }\n\n  @Test\n  fun defaultModelScaleTest() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0, 2.0)\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelScale?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelScaleAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelScaleAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale\") }\n  }\n\n  @Test\n  fun defaultModelScaleAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0))\n    assertEquals(\"[literal, [0.0, 1.0, 2.0]]\", ModelLayer.defaultModelScaleAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0), ModelLayer.defaultModelScale!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale\") }\n  }\n\n  @Test\n  fun defaultModelScaleTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelScaleTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale-transition\") }\n  }\n\n  @Test\n  fun defaultModelScaleModeTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(ModelScaleMode.MAP, ModelLayer.defaultModelScaleMode)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale-mode\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelScaleModeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelScaleModeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale-mode\") }\n  }\n\n  @Test\n  fun defaultModelScaleModeAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), ModelLayer.defaultModelScaleModeAsExpression?.toString())\n    assertEquals(ModelScaleMode.MAP.value, ModelLayer.defaultModelScaleModeAsExpression.toString())\n    assertEquals(ModelScaleMode.MAP, ModelLayer.defaultModelScaleMode)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-scale-mode\") }\n  }\n\n  @Test\n  fun defaultModelTranslationTest() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0, 2.0)\n    assertEquals(expectedValue.toString(), ModelLayer.defaultModelTranslation?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-translation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelTranslationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelTranslationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-translation\") }\n  }\n\n  @Test\n  fun defaultModelTranslationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0))\n    assertEquals(\"[literal, [0.0, 1.0, 2.0]]\", ModelLayer.defaultModelTranslationAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0), ModelLayer.defaultModelTranslation!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-translation\") }\n  }\n\n  @Test\n  fun defaultModelTranslationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), ModelLayer.defaultModelTranslationTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-translation-transition\") }\n  }\n\n  @Test\n  fun defaultModelTypeTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"common-3d\")\n\n    assertEquals(ModelType.COMMON_3D, ModelLayer.defaultModelType)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-type\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultModelTypeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), ModelLayer.defaultModelTypeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-type\") }\n  }\n\n  @Test\n  fun defaultModelTypeAsExpressionGetFromLiteral() {\n    val value = \"common-3d\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), ModelLayer.defaultModelTypeAsExpression?.toString())\n    assertEquals(ModelType.COMMON_3D.value, ModelLayer.defaultModelTypeAsExpression.toString())\n    assertEquals(ModelType.COMMON_3D, ModelLayer.defaultModelType)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"model-type\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, ModelLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"model\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/RasterLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass RasterLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=raster}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=raster, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=raster}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n  // Property getters and setters\n\n  @Test\n  fun rasterArrayBandSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.rasterArrayBand(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-array-band\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun rasterArrayBandGet() {\n    val testValue = \"abc\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.rasterArrayBand?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-array-band\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterArrayBandAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterArrayBand(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-array-band\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterArrayBandAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterArrayBandAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-array-band\") }\n  }\n\n  @Test\n  fun rasterArrayBandAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterArrayBandAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-array-band\") }\n  }\n\n  @Test\n  fun rasterArrayBandAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.rasterArrayBandAsExpression.toString())\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue, layer.rasterArrayBand)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-array-band\") }\n  }\n\n  @Test\n  fun rasterBrightnessMaxSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterBrightnessMax(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-brightness-max\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterBrightnessMaxGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterBrightnessMax?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-max\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterBrightnessMaxAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterBrightnessMax(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-brightness-max\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterBrightnessMaxAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterBrightnessMaxAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-max\") }\n  }\n\n  @Test\n  fun rasterBrightnessMaxAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterBrightnessMaxAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-max\") }\n  }\n\n  @Test\n  fun rasterBrightnessMaxAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterBrightnessMaxAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterBrightnessMax!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-max\") }\n  }\n\n  @Test\n  fun rasterBrightnessMaxTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterBrightnessMaxTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-brightness-max-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterBrightnessMaxTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterBrightnessMaxTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-max-transition\") }\n  }\n\n  @Test\n  fun rasterBrightnessMaxTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterBrightnessMaxTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-brightness-max-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterBrightnessMinSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterBrightnessMin(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-brightness-min\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterBrightnessMinGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterBrightnessMin?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-min\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterBrightnessMinAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterBrightnessMin(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-brightness-min\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterBrightnessMinAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterBrightnessMinAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-min\") }\n  }\n\n  @Test\n  fun rasterBrightnessMinAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterBrightnessMinAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-min\") }\n  }\n\n  @Test\n  fun rasterBrightnessMinAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterBrightnessMinAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterBrightnessMin!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-min\") }\n  }\n\n  @Test\n  fun rasterBrightnessMinTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterBrightnessMinTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-brightness-min-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterBrightnessMinTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterBrightnessMinTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-brightness-min-transition\") }\n  }\n\n  @Test\n  fun rasterBrightnessMinTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterBrightnessMinTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-brightness-min-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterColorSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    layer.bindTo(style)\n    layer.rasterColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[interpolate, [linear], [heatmap-density], 0.0, [rgba, 0.0, 0.0, 0.0, 0.0], 1.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\")\n  }\n\n  @Test\n  fun rasterColorGet() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    assertEquals(expectedValue.toString(), layer.rasterColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color\") }\n  }\n\n  @Test\n  fun rasterColorUseThemeSetAfterInitialization() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.rasterColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun rasterColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"raster-color-use-theme\"))\n  }\n\n  @Test\n  fun rasterColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.rasterColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterColorMixSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0)\n    layer.bindTo(style)\n    layer.rasterColorMix(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color-mix\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0, 2.0, 3.0]\")\n  }\n\n  @Test\n  fun rasterColorMixGet() {\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0, 2.0, 3.0)\n    assertEquals(expectedValue.toString(), layer.rasterColorMix?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-mix\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterColorMixAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterColorMix(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color-mix\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterColorMixAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterColorMixAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-mix\") }\n  }\n\n  @Test\n  fun rasterColorMixAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterColorMixAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-mix\") }\n  }\n\n  @Test\n  fun rasterColorMixAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0))\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0, 2.0, 3.0]]\", layer.rasterColorMixAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0), layer.rasterColorMix!!)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-mix\") }\n  }\n\n  @Test\n  fun rasterColorMixTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterColorMixTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color-mix-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterColorMixTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterColorMixTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-mix-transition\") }\n  }\n\n  @Test\n  fun rasterColorMixTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterColorMixTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color-mix-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterColorRangeSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.rasterColorRange(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun rasterColorRangeGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.rasterColorRange?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterColorRangeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterColorRange(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterColorRangeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterColorRangeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-range\") }\n  }\n\n  @Test\n  fun rasterColorRangeAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterColorRangeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-range\") }\n  }\n\n  @Test\n  fun rasterColorRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.rasterColorRangeAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.rasterColorRange!!)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-range\") }\n  }\n\n  @Test\n  fun rasterColorRangeTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterColorRangeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color-range-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterColorRangeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterColorRangeTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-color-range-transition\") }\n  }\n\n  @Test\n  fun rasterColorRangeTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterColorRangeTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-color-range-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterContrastSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterContrast(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-contrast\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterContrastGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterContrast?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-contrast\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterContrastAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterContrast(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-contrast\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterContrastAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterContrastAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-contrast\") }\n  }\n\n  @Test\n  fun rasterContrastAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterContrastAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-contrast\") }\n  }\n\n  @Test\n  fun rasterContrastAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterContrastAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterContrast!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-contrast\") }\n  }\n\n  @Test\n  fun rasterContrastTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterContrastTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-contrast-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterContrastTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterContrastTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-contrast-transition\") }\n  }\n\n  @Test\n  fun rasterContrastTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterContrastTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-contrast-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterElevationSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterElevation(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-elevation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterElevationGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterElevation?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-elevation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterElevationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterElevation(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-elevation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterElevationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterElevationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-elevation\") }\n  }\n\n  @Test\n  fun rasterElevationAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterElevationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-elevation\") }\n  }\n\n  @Test\n  fun rasterElevationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterElevationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterElevation!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-elevation\") }\n  }\n\n  @Test\n  fun rasterElevationTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterElevationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-elevation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterElevationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterElevationTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-elevation-transition\") }\n  }\n\n  @Test\n  fun rasterElevationTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterElevationTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-elevation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterEmissiveStrengthSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-emissive-strength\") }\n  }\n\n  @Test\n  fun rasterEmissiveStrengthAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-emissive-strength\") }\n  }\n\n  @Test\n  fun rasterEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-emissive-strength\") }\n  }\n\n  @Test\n  fun rasterEmissiveStrengthTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun rasterEmissiveStrengthTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterFadeDurationSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterFadeDuration(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-fade-duration\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterFadeDurationGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterFadeDuration?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-fade-duration\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterFadeDurationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterFadeDuration(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-fade-duration\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterFadeDurationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterFadeDurationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-fade-duration\") }\n  }\n\n  @Test\n  fun rasterFadeDurationAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterFadeDurationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-fade-duration\") }\n  }\n\n  @Test\n  fun rasterFadeDurationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterFadeDurationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterFadeDuration!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-fade-duration\") }\n  }\n\n  @Test\n  fun rasterHueRotateSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterHueRotate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-hue-rotate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterHueRotateGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterHueRotate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-hue-rotate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterHueRotateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterHueRotate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-hue-rotate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterHueRotateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterHueRotateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-hue-rotate\") }\n  }\n\n  @Test\n  fun rasterHueRotateAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterHueRotateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-hue-rotate\") }\n  }\n\n  @Test\n  fun rasterHueRotateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterHueRotateAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterHueRotate!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-hue-rotate\") }\n  }\n\n  @Test\n  fun rasterHueRotateTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterHueRotateTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-hue-rotate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterHueRotateTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterHueRotateTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-hue-rotate-transition\") }\n  }\n\n  @Test\n  fun rasterHueRotateTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterHueRotateTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-hue-rotate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterOpacitySet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-opacity\") }\n  }\n\n  @Test\n  fun rasterOpacityAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-opacity\") }\n  }\n\n  @Test\n  fun rasterOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-opacity\") }\n  }\n\n  @Test\n  fun rasterOpacityTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-opacity-transition\") }\n  }\n\n  @Test\n  fun rasterOpacityTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterResamplingSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterResampling(RasterResampling.LINEAR)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-resampling\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"linear\")\n  }\n\n  @Test\n  fun rasterResamplingGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"linear\")\n\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(RasterResampling.LINEAR, layer.rasterResampling)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-resampling\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterResamplingAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterResampling(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-resampling\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterResamplingAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterResamplingAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-resampling\") }\n  }\n\n  @Test\n  fun rasterResamplingAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterResamplingAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-resampling\") }\n  }\n\n  @Test\n  fun rasterResamplingAsExpressionGetFromLiteral() {\n    val value = \"linear\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.rasterResamplingAsExpression?.toString())\n    assertEquals(RasterResampling.LINEAR.value, layer.rasterResamplingAsExpression.toString())\n    assertEquals(RasterResampling.LINEAR, layer.rasterResampling)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-resampling\") }\n  }\n\n  @Test\n  fun rasterSaturationSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterSaturation(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-saturation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterSaturationGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterSaturation?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-saturation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterSaturationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterSaturation(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-saturation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterSaturationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterSaturationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-saturation\") }\n  }\n\n  @Test\n  fun rasterSaturationAsExpressionGetNull() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterSaturationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-saturation\") }\n  }\n\n  @Test\n  fun rasterSaturationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterSaturationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterSaturation!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-saturation\") }\n  }\n\n  @Test\n  fun rasterSaturationTransitionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterSaturationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-saturation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterSaturationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterSaturationTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-saturation-transition\") }\n  }\n\n  @Test\n  fun rasterSaturationTransitionSetDsl() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterSaturationTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-saturation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = rasterLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = rasterLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = rasterLayer(\"id\", \"source\") { }\n    assertEquals(\"raster\", layer.getType())\n  }\n\n  @Test\n  fun getRasterLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"raster\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as RasterLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"raster\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultRasterArrayBandTest() {\n    val testValue = \"abc\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterArrayBand?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-array-band\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterArrayBandAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterArrayBandAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-array-band\") }\n  }\n\n  @Test\n  fun defaultRasterArrayBandAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    assertEquals(\"abc\", RasterLayer.defaultRasterArrayBandAsExpression.toString())\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue, RasterLayer.defaultRasterArrayBand)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-array-band\") }\n  }\n\n  @Test\n  fun defaultRasterBrightnessMaxTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterBrightnessMax?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-max\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterBrightnessMaxAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterBrightnessMaxAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-max\") }\n  }\n\n  @Test\n  fun defaultRasterBrightnessMaxAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterLayer.defaultRasterBrightnessMaxAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterLayer.defaultRasterBrightnessMax!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-max\") }\n  }\n\n  @Test\n  fun defaultRasterBrightnessMaxTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterBrightnessMaxTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-max-transition\") }\n  }\n\n  @Test\n  fun defaultRasterBrightnessMinTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterBrightnessMin?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-min\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterBrightnessMinAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterBrightnessMinAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-min\") }\n  }\n\n  @Test\n  fun defaultRasterBrightnessMinAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterLayer.defaultRasterBrightnessMinAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterLayer.defaultRasterBrightnessMin!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-min\") }\n  }\n\n  @Test\n  fun defaultRasterBrightnessMinTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterBrightnessMinTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-brightness-min-transition\") }\n  }\n\n  @Test\n  fun defaultRasterColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, RasterLayer.defaultRasterColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultRasterColorMixTest() {\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0, 2.0, 3.0)\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterColorMix?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-mix\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterColorMixAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterColorMixAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-mix\") }\n  }\n\n  @Test\n  fun defaultRasterColorMixAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0))\n    assertEquals(\"[literal, [0.0, 1.0, 2.0, 3.0]]\", RasterLayer.defaultRasterColorMixAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0), RasterLayer.defaultRasterColorMix!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-mix\") }\n  }\n\n  @Test\n  fun defaultRasterColorMixTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterColorMixTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-mix-transition\") }\n  }\n\n  @Test\n  fun defaultRasterColorRangeTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterColorRange?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterColorRangeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterColorRangeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-range\") }\n  }\n\n  @Test\n  fun defaultRasterColorRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", RasterLayer.defaultRasterColorRangeAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), RasterLayer.defaultRasterColorRange!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-range\") }\n  }\n\n  @Test\n  fun defaultRasterColorRangeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterColorRangeTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-color-range-transition\") }\n  }\n\n  @Test\n  fun defaultRasterContrastTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterContrast?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-contrast\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterContrastAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterContrastAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-contrast\") }\n  }\n\n  @Test\n  fun defaultRasterContrastAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterLayer.defaultRasterContrastAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterLayer.defaultRasterContrast!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-contrast\") }\n  }\n\n  @Test\n  fun defaultRasterContrastTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterContrastTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-contrast-transition\") }\n  }\n\n  @Test\n  fun defaultRasterElevationTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterElevation?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-elevation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterElevationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterElevationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-elevation\") }\n  }\n\n  @Test\n  fun defaultRasterElevationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterLayer.defaultRasterElevationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterLayer.defaultRasterElevation!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-elevation\") }\n  }\n\n  @Test\n  fun defaultRasterElevationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterElevationTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-elevation-transition\") }\n  }\n\n  @Test\n  fun defaultRasterEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultRasterEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterLayer.defaultRasterEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterLayer.defaultRasterEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultRasterEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultRasterFadeDurationTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterFadeDuration?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-fade-duration\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterFadeDurationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterFadeDurationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-fade-duration\") }\n  }\n\n  @Test\n  fun defaultRasterFadeDurationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterLayer.defaultRasterFadeDurationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterLayer.defaultRasterFadeDuration!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-fade-duration\") }\n  }\n\n  @Test\n  fun defaultRasterHueRotateTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterHueRotate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-hue-rotate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterHueRotateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterHueRotateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-hue-rotate\") }\n  }\n\n  @Test\n  fun defaultRasterHueRotateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterLayer.defaultRasterHueRotateAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterLayer.defaultRasterHueRotate!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-hue-rotate\") }\n  }\n\n  @Test\n  fun defaultRasterHueRotateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterHueRotateTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-hue-rotate-transition\") }\n  }\n\n  @Test\n  fun defaultRasterOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-opacity\") }\n  }\n\n  @Test\n  fun defaultRasterOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterLayer.defaultRasterOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterLayer.defaultRasterOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-opacity\") }\n  }\n\n  @Test\n  fun defaultRasterOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultRasterResamplingTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"linear\")\n\n    assertEquals(RasterResampling.LINEAR, RasterLayer.defaultRasterResampling)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-resampling\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterResamplingAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterResamplingAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-resampling\") }\n  }\n\n  @Test\n  fun defaultRasterResamplingAsExpressionGetFromLiteral() {\n    val value = \"linear\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), RasterLayer.defaultRasterResamplingAsExpression?.toString())\n    assertEquals(RasterResampling.LINEAR.value, RasterLayer.defaultRasterResamplingAsExpression.toString())\n    assertEquals(RasterResampling.LINEAR, RasterLayer.defaultRasterResampling)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-resampling\") }\n  }\n\n  @Test\n  fun defaultRasterSaturationTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterLayer.defaultRasterSaturation?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-saturation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterSaturationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterLayer.defaultRasterSaturationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-saturation\") }\n  }\n\n  @Test\n  fun defaultRasterSaturationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterLayer.defaultRasterSaturationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterLayer.defaultRasterSaturation!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-saturation\") }\n  }\n\n  @Test\n  fun defaultRasterSaturationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterLayer.defaultRasterSaturationTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"raster-saturation-transition\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, RasterLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/RasterParticleLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass RasterParticleLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=raster-particle}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=raster-particle, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=raster-particle}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun rasterParticleArrayBandSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.rasterParticleArrayBand(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-array-band\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun rasterParticleArrayBandGet() {\n    val testValue = \"abc\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.rasterParticleArrayBand?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-array-band\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterParticleArrayBandAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleArrayBand(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-array-band\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterParticleArrayBandAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterParticleArrayBandAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-array-band\") }\n  }\n\n  @Test\n  fun rasterParticleArrayBandAsExpressionGetNull() {\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterParticleArrayBandAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-array-band\") }\n  }\n\n  @Test\n  fun rasterParticleArrayBandAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.rasterParticleArrayBandAsExpression.toString())\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue, layer.rasterParticleArrayBand)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-array-band\") }\n  }\n\n  @Test\n  fun rasterParticleColorSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    layer.bindTo(style)\n    layer.rasterParticleColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[interpolate, [linear], [heatmap-density], 0.0, [rgba, 0.0, 0.0, 0.0, 0.0], 1.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\")\n  }\n\n  @Test\n  fun rasterParticleColorGet() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    assertEquals(expectedValue.toString(), layer.rasterParticleColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-color\") }\n  }\n\n  @Test\n  fun rasterParticleColorUseThemeSetAfterInitialization() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.rasterParticleColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun rasterParticleColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"raster-particle-color-use-theme\"))\n  }\n\n  @Test\n  fun rasterParticleColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.rasterParticleColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterParticleCountSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    val testValue = 1L\n    layer.bindTo(style)\n    layer.rasterParticleCount(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-count\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun rasterParticleCountGet() {\n    val testValue = 1L\n    // Internally rasterParticleCount is not handled as Long type\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue.toDouble())\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1L\n    assertEquals(expectedValue.toString(), layer.rasterParticleCount?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-count\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterParticleCountAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleCount(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-count\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterParticleCountAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterParticleCountAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-count\") }\n  }\n\n  @Test\n  fun rasterParticleCountAsExpressionGetNull() {\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterParticleCountAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-count\") }\n  }\n\n  @Test\n  fun rasterParticleCountAsExpressionGetFromLiteral() {\n    // Internally rasterParticleCount is not handled as Long type\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L.toDouble())\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"1\", layer.rasterParticleCountAsExpression.toString())\n    val expectedValue = 1L\n    assertEquals(expectedValue, layer.rasterParticleCount)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-count\") }\n  }\n\n  @Test\n  fun rasterParticleFadeOpacityFactorSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterParticleFadeOpacityFactor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-fade-opacity-factor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterParticleFadeOpacityFactorGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterParticleFadeOpacityFactor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-fade-opacity-factor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterParticleFadeOpacityFactorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleFadeOpacityFactor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-fade-opacity-factor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterParticleFadeOpacityFactorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterParticleFadeOpacityFactorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-fade-opacity-factor\") }\n  }\n\n  @Test\n  fun rasterParticleFadeOpacityFactorAsExpressionGetNull() {\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterParticleFadeOpacityFactorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-fade-opacity-factor\") }\n  }\n\n  @Test\n  fun rasterParticleFadeOpacityFactorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterParticleFadeOpacityFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterParticleFadeOpacityFactor!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-fade-opacity-factor\") }\n  }\n\n  @Test\n  fun rasterParticleFadeOpacityFactorTransitionSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleFadeOpacityFactorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-fade-opacity-factor-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterParticleFadeOpacityFactorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterParticleFadeOpacityFactorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-fade-opacity-factor-transition\") }\n  }\n\n  @Test\n  fun rasterParticleFadeOpacityFactorTransitionSetDsl() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleFadeOpacityFactorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-fade-opacity-factor-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterParticleMaxSpeedSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterParticleMaxSpeed(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-max-speed\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterParticleMaxSpeedGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterParticleMaxSpeed?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-max-speed\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterParticleMaxSpeedAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleMaxSpeed(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-max-speed\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterParticleMaxSpeedAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterParticleMaxSpeedAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-max-speed\") }\n  }\n\n  @Test\n  fun rasterParticleMaxSpeedAsExpressionGetNull() {\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterParticleMaxSpeedAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-max-speed\") }\n  }\n\n  @Test\n  fun rasterParticleMaxSpeedAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterParticleMaxSpeedAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterParticleMaxSpeed!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-max-speed\") }\n  }\n\n  @Test\n  fun rasterParticleResetRateFactorSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterParticleResetRateFactor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-reset-rate-factor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterParticleResetRateFactorGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterParticleResetRateFactor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-reset-rate-factor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterParticleResetRateFactorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleResetRateFactor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-reset-rate-factor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterParticleResetRateFactorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterParticleResetRateFactorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-reset-rate-factor\") }\n  }\n\n  @Test\n  fun rasterParticleResetRateFactorAsExpressionGetNull() {\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterParticleResetRateFactorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-reset-rate-factor\") }\n  }\n\n  @Test\n  fun rasterParticleResetRateFactorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterParticleResetRateFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterParticleResetRateFactor!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-reset-rate-factor\") }\n  }\n\n  @Test\n  fun rasterParticleSpeedFactorSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.rasterParticleSpeedFactor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-speed-factor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun rasterParticleSpeedFactorGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.rasterParticleSpeedFactor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-speed-factor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun rasterParticleSpeedFactorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleSpeedFactor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-speed-factor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun rasterParticleSpeedFactorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.rasterParticleSpeedFactorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-speed-factor\") }\n  }\n\n  @Test\n  fun rasterParticleSpeedFactorAsExpressionGetNull() {\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.rasterParticleSpeedFactorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-speed-factor\") }\n  }\n\n  @Test\n  fun rasterParticleSpeedFactorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.rasterParticleSpeedFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterParticleSpeedFactor!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-speed-factor\") }\n  }\n\n  @Test\n  fun rasterParticleSpeedFactorTransitionSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleSpeedFactorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-speed-factor-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun rasterParticleSpeedFactorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.rasterParticleSpeedFactorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"raster-particle-speed-factor-transition\") }\n  }\n\n  @Test\n  fun rasterParticleSpeedFactorTransitionSetDsl() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.rasterParticleSpeedFactorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"raster-particle-speed-factor-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = rasterParticleLayer(\"id\", \"source\") { }\n    assertEquals(\"raster-particle\", layer.getType())\n  }\n\n  @Test\n  fun getRasterParticleLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"raster-particle\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as RasterParticleLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"raster-particle\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultRasterParticleArrayBandTest() {\n    val testValue = \"abc\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), RasterParticleLayer.defaultRasterParticleArrayBand?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-array-band\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterParticleArrayBandAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterParticleLayer.defaultRasterParticleArrayBandAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-array-band\") }\n  }\n\n  @Test\n  fun defaultRasterParticleArrayBandAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    assertEquals(\"abc\", RasterParticleLayer.defaultRasterParticleArrayBandAsExpression.toString())\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue, RasterParticleLayer.defaultRasterParticleArrayBand)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-array-band\") }\n  }\n\n  @Test\n  fun defaultRasterParticleColorTest() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val expectedValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    assertEquals(expectedValue.toString(), RasterParticleLayer.defaultRasterParticleColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-color\") }\n  }\n\n  @Test\n  fun defaultRasterParticleColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, RasterParticleLayer.defaultRasterParticleColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultRasterParticleCountTest() {\n    val testValue = 1L\n    // Internally rasterParticleCount is not handled as Long type\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue.toDouble())\n    val expectedValue = 1L\n    assertEquals(expectedValue.toString(), RasterParticleLayer.defaultRasterParticleCount?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-count\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterParticleCountAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterParticleLayer.defaultRasterParticleCountAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-count\") }\n  }\n\n  @Test\n  fun defaultRasterParticleCountAsExpressionGetFromLiteral() {\n    // Internally rasterParticleCount is not handled as Long type\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L.toDouble())\n    assertEquals(\"1\", RasterParticleLayer.defaultRasterParticleCountAsExpression.toString())\n    val expectedValue = 1L\n    assertEquals(expectedValue, RasterParticleLayer.defaultRasterParticleCount)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-count\") }\n  }\n\n  @Test\n  fun defaultRasterParticleFadeOpacityFactorTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterParticleLayer.defaultRasterParticleFadeOpacityFactor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-fade-opacity-factor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterParticleFadeOpacityFactorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterParticleLayer.defaultRasterParticleFadeOpacityFactorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-fade-opacity-factor\") }\n  }\n\n  @Test\n  fun defaultRasterParticleFadeOpacityFactorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterParticleLayer.defaultRasterParticleFadeOpacityFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterParticleLayer.defaultRasterParticleFadeOpacityFactor!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-fade-opacity-factor\") }\n  }\n\n  @Test\n  fun defaultRasterParticleFadeOpacityFactorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterParticleLayer.defaultRasterParticleFadeOpacityFactorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-fade-opacity-factor-transition\") }\n  }\n\n  @Test\n  fun defaultRasterParticleMaxSpeedTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterParticleLayer.defaultRasterParticleMaxSpeed?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-max-speed\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterParticleMaxSpeedAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterParticleLayer.defaultRasterParticleMaxSpeedAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-max-speed\") }\n  }\n\n  @Test\n  fun defaultRasterParticleMaxSpeedAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterParticleLayer.defaultRasterParticleMaxSpeedAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterParticleLayer.defaultRasterParticleMaxSpeed!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-max-speed\") }\n  }\n\n  @Test\n  fun defaultRasterParticleResetRateFactorTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterParticleLayer.defaultRasterParticleResetRateFactor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-reset-rate-factor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterParticleResetRateFactorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterParticleLayer.defaultRasterParticleResetRateFactorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-reset-rate-factor\") }\n  }\n\n  @Test\n  fun defaultRasterParticleResetRateFactorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterParticleLayer.defaultRasterParticleResetRateFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterParticleLayer.defaultRasterParticleResetRateFactor!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-reset-rate-factor\") }\n  }\n\n  @Test\n  fun defaultRasterParticleSpeedFactorTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), RasterParticleLayer.defaultRasterParticleSpeedFactor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-speed-factor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultRasterParticleSpeedFactorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), RasterParticleLayer.defaultRasterParticleSpeedFactorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-speed-factor\") }\n  }\n\n  @Test\n  fun defaultRasterParticleSpeedFactorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, RasterParticleLayer.defaultRasterParticleSpeedFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, RasterParticleLayer.defaultRasterParticleSpeedFactor!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-speed-factor\") }\n  }\n\n  @Test\n  fun defaultRasterParticleSpeedFactorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), RasterParticleLayer.defaultRasterParticleSpeedFactorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"raster-particle-speed-factor-transition\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, RasterParticleLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"raster-particle\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/SkyLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass SkyLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun skyAtmosphereColorSet() {\n    val layer = skyLayer(\"id\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.skyAtmosphereColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun skyAtmosphereColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.skyAtmosphereColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereColorUseThemeSetAfterInitialization() {\n    val layer = skyLayer(\"id\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.skyAtmosphereColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun skyAtmosphereColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"sky-atmosphere-color-use-theme\"))\n  }\n\n  @Test\n  fun skyAtmosphereColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.skyAtmosphereColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun skyAtmosphereColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyAtmosphereColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun skyAtmosphereColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color-use-theme\") }\n  }\n\n  @Test\n  fun skyAtmosphereColorUseThemeAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.skyAtmosphereColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color-use-theme\") }\n  }\n\n  @Test\n  fun skyAtmosphereColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color-use-theme\") }\n  }\n\n  @Test\n  fun skyAtmosphereColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.skyAtmosphereColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color-use-theme\") }\n  }\n\n  @Test\n  fun skyAtmosphereColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyAtmosphereColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun skyAtmosphereColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereColorAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.skyAtmosphereColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.skyAtmosphereColor)\n    assertEquals(Color.BLACK, layer.skyAtmosphereColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereColorAsColorIntSet() {\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyAtmosphereColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun skyAtmosphereColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.skyAtmosphereColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorSet() {\n    val layer = skyLayer(\"id\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.skyAtmosphereHaloColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.skyAtmosphereHaloColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorUseThemeSetAfterInitialization() {\n    val layer = skyLayer(\"id\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.skyAtmosphereHaloColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereHaloColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"sky-atmosphere-halo-color-use-theme\"))\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.skyAtmosphereHaloColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun skyAtmosphereHaloColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyAtmosphereHaloColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereHaloColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorUseThemeAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.skyAtmosphereHaloColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereHaloColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereHaloColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.skyAtmosphereHaloColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyAtmosphereHaloColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereHaloColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.skyAtmosphereHaloColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereHaloColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.skyAtmosphereHaloColor)\n    assertEquals(Color.BLACK, layer.skyAtmosphereHaloColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorAsColorIntSet() {\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyAtmosphereHaloColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun skyAtmosphereHaloColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.skyAtmosphereHaloColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-halo-color\") }\n  }\n\n  @Test\n  fun skyAtmosphereSunSet() {\n    val layer = skyLayer(\"id\") {}\n    val testValue = listOf(180.0, 90.0)\n    layer.bindTo(style)\n    layer.skyAtmosphereSun(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-sun\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[180.0, 90.0]\")\n  }\n\n  @Test\n  fun skyAtmosphereSunGet() {\n    val testValue = listOf(180.0, 90.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(180.0, 90.0)\n    assertEquals(expectedValue.toString(), layer.skyAtmosphereSun?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-sun\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun skyAtmosphereSunAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyAtmosphereSun(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-sun\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun skyAtmosphereSunAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereSunAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-sun\") }\n  }\n\n  @Test\n  fun skyAtmosphereSunAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.skyAtmosphereSunAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-sun\") }\n  }\n\n  @Test\n  fun skyAtmosphereSunAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(180.0, 90.0))\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [180.0, 90.0]]\", layer.skyAtmosphereSunAsExpression.toString())\n    assertEquals(listOf(180.0, 90.0), layer.skyAtmosphereSun!!)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-sun\") }\n  }\n\n  @Test\n  fun skyAtmosphereSunIntensitySet() {\n    val layer = skyLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.skyAtmosphereSunIntensity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-sun-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun skyAtmosphereSunIntensityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.skyAtmosphereSunIntensity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-sun-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun skyAtmosphereSunIntensityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyAtmosphereSunIntensity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-atmosphere-sun-intensity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun skyAtmosphereSunIntensityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyAtmosphereSunIntensityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-sun-intensity\") }\n  }\n\n  @Test\n  fun skyAtmosphereSunIntensityAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.skyAtmosphereSunIntensityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-sun-intensity\") }\n  }\n\n  @Test\n  fun skyAtmosphereSunIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.skyAtmosphereSunIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.skyAtmosphereSunIntensity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-atmosphere-sun-intensity\") }\n  }\n\n  @Test\n  fun skyGradientSet() {\n    val layer = skyLayer(\"id\") {}\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    layer.bindTo(style)\n    layer.skyGradient(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-gradient\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[interpolate, [linear], [heatmap-density], 0.0, [rgba, 0.0, 0.0, 0.0, 0.0], 1.0, [rgba, 0.0, 255.0, 0.0, 1.0]]\")\n  }\n\n  @Test\n  fun skyGradientGet() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    assertEquals(expectedValue.toString(), layer.skyGradient?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient\") }\n  }\n\n  @Test\n  fun skyGradientUseThemeSetAfterInitialization() {\n    val layer = skyLayer(\"id\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.skyGradientUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-gradient-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun skyGradientUseThemeSet() {\n    val theme = \"none\"\n    val layer = skyLayer(\"id\") {\n      skyGradientUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"sky-gradient-use-theme\"))\n  }\n\n  @Test\n  fun skyGradientUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.skyGradientUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun skyGradientCenterSet() {\n    val layer = skyLayer(\"id\") {}\n    val testValue = listOf(180.0, 90.0)\n    layer.bindTo(style)\n    layer.skyGradientCenter(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-gradient-center\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[180.0, 90.0]\")\n  }\n\n  @Test\n  fun skyGradientCenterGet() {\n    val testValue = listOf(180.0, 90.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(180.0, 90.0)\n    assertEquals(expectedValue.toString(), layer.skyGradientCenter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient-center\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun skyGradientCenterAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyGradientCenter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-gradient-center\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun skyGradientCenterAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyGradientCenterAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient-center\") }\n  }\n\n  @Test\n  fun skyGradientCenterAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.skyGradientCenterAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient-center\") }\n  }\n\n  @Test\n  fun skyGradientCenterAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(180.0, 90.0))\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [180.0, 90.0]]\", layer.skyGradientCenterAsExpression.toString())\n    assertEquals(listOf(180.0, 90.0), layer.skyGradientCenter!!)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient-center\") }\n  }\n\n  @Test\n  fun skyGradientRadiusSet() {\n    val layer = skyLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.skyGradientRadius(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-gradient-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun skyGradientRadiusGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.skyGradientRadius?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun skyGradientRadiusAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyGradientRadius(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-gradient-radius\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun skyGradientRadiusAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyGradientRadiusAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient-radius\") }\n  }\n\n  @Test\n  fun skyGradientRadiusAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.skyGradientRadiusAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient-radius\") }\n  }\n\n  @Test\n  fun skyGradientRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.skyGradientRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.skyGradientRadius!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-gradient-radius\") }\n  }\n\n  @Test\n  fun skyOpacitySet() {\n    val layer = skyLayer(\"id\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.skyOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun skyOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.skyOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun skyOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun skyOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-opacity\") }\n  }\n\n  @Test\n  fun skyOpacityAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.skyOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-opacity\") }\n  }\n\n  @Test\n  fun skyOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.skyOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.skyOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-opacity\") }\n  }\n\n  @Test\n  fun skyOpacityTransitionSet() {\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"sky-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun skyOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.skyOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-opacity-transition\") }\n  }\n\n  @Test\n  fun skyOpacityTransitionSetDsl() {\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"sky-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun skyTypeSet() {\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyType(SkyType.GRADIENT)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-type\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"gradient\")\n  }\n\n  @Test\n  fun skyTypeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"gradient\")\n\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(SkyType.GRADIENT, layer.skyType)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-type\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun skyTypeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.skyType(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"sky-type\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun skyTypeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.skyTypeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"sky-type\") }\n  }\n\n  @Test\n  fun skyTypeAsExpressionGetNull() {\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.skyTypeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-type\") }\n  }\n\n  @Test\n  fun skyTypeAsExpressionGetFromLiteral() {\n    val value = \"gradient\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.skyTypeAsExpression?.toString())\n    assertEquals(SkyType.GRADIENT.value, layer.skyTypeAsExpression.toString())\n    assertEquals(SkyType.GRADIENT, layer.skyType)\n    verify { style.getStyleLayerProperty(\"id\", \"sky-type\") }\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = skyLayer(\"id\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = skyLayer(\"id\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = skyLayer(\"id\") { }\n    assertEquals(\"sky\", layer.getType())\n  }\n\n  @Test\n  fun getSkyLayerTest() {\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"sky\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as SkyLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"sky\", layer.getType())\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultSkyAtmosphereColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), SkyLayer.defaultSkyAtmosphereColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-color\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, SkyLayer.defaultSkyAtmosphereColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultSkyAtmosphereColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyAtmosphereColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-color\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyAtmosphereColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", SkyLayer.defaultSkyAtmosphereColor)\n    assertEquals(Color.BLACK, SkyLayer.defaultSkyAtmosphereColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-color\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, SkyLayer.defaultSkyAtmosphereColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-color\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereHaloColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), SkyLayer.defaultSkyAtmosphereHaloColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-halo-color\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereHaloColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, SkyLayer.defaultSkyAtmosphereHaloColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-halo-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultSkyAtmosphereHaloColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyAtmosphereHaloColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-halo-color\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereHaloColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyAtmosphereHaloColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", SkyLayer.defaultSkyAtmosphereHaloColor)\n    assertEquals(Color.BLACK, SkyLayer.defaultSkyAtmosphereHaloColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-halo-color\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereHaloColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, SkyLayer.defaultSkyAtmosphereHaloColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-halo-color\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereSunTest() {\n    val testValue = listOf(180.0, 90.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(180.0, 90.0)\n    assertEquals(expectedValue.toString(), SkyLayer.defaultSkyAtmosphereSun?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSkyAtmosphereSunAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyAtmosphereSunAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereSunAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(180.0, 90.0))\n    assertEquals(\"[literal, [180.0, 90.0]]\", SkyLayer.defaultSkyAtmosphereSunAsExpression.toString())\n    assertEquals(listOf(180.0, 90.0), SkyLayer.defaultSkyAtmosphereSun!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereSunIntensityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SkyLayer.defaultSkyAtmosphereSunIntensity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSkyAtmosphereSunIntensityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyAtmosphereSunIntensityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun-intensity\") }\n  }\n\n  @Test\n  fun defaultSkyAtmosphereSunIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SkyLayer.defaultSkyAtmosphereSunIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SkyLayer.defaultSkyAtmosphereSunIntensity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-atmosphere-sun-intensity\") }\n  }\n\n  @Test\n  fun defaultSkyGradientTest() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val expectedValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    assertEquals(expectedValue.toString(), SkyLayer.defaultSkyGradient?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient\") }\n  }\n\n  @Test\n  fun defaultSkyGradientUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, SkyLayer.defaultSkyGradientUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultSkyGradientCenterTest() {\n    val testValue = listOf(180.0, 90.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(180.0, 90.0)\n    assertEquals(expectedValue.toString(), SkyLayer.defaultSkyGradientCenter?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-center\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSkyGradientCenterAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyGradientCenterAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-center\") }\n  }\n\n  @Test\n  fun defaultSkyGradientCenterAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(180.0, 90.0))\n    assertEquals(\"[literal, [180.0, 90.0]]\", SkyLayer.defaultSkyGradientCenterAsExpression.toString())\n    assertEquals(listOf(180.0, 90.0), SkyLayer.defaultSkyGradientCenter!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-center\") }\n  }\n\n  @Test\n  fun defaultSkyGradientRadiusTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SkyLayer.defaultSkyGradientRadius?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-radius\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSkyGradientRadiusAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyGradientRadiusAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-radius\") }\n  }\n\n  @Test\n  fun defaultSkyGradientRadiusAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SkyLayer.defaultSkyGradientRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SkyLayer.defaultSkyGradientRadius!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-gradient-radius\") }\n  }\n\n  @Test\n  fun defaultSkyOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SkyLayer.defaultSkyOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSkyOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-opacity\") }\n  }\n\n  @Test\n  fun defaultSkyOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SkyLayer.defaultSkyOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SkyLayer.defaultSkyOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-opacity\") }\n  }\n\n  @Test\n  fun defaultSkyOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SkyLayer.defaultSkyOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultSkyTypeTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"gradient\")\n\n    assertEquals(SkyType.GRADIENT, SkyLayer.defaultSkyType)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-type\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSkyTypeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SkyLayer.defaultSkyTypeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-type\") }\n  }\n\n  @Test\n  fun defaultSkyTypeAsExpressionGetFromLiteral() {\n    val value = \"gradient\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SkyLayer.defaultSkyTypeAsExpression?.toString())\n    assertEquals(SkyType.GRADIENT.value, SkyLayer.defaultSkyTypeAsExpression.toString())\n    assertEquals(SkyType.GRADIENT, SkyLayer.defaultSkyType)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"sky-type\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, SkyLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"sky\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/layers/generated/SymbolLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.layers.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass SymbolLayerTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueExpected = mockk<Expected<String, Value>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLayerProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { style.addStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperties(any(), any()) } returns expected\n    every { style.getStyleLayerProperties(any()) } returns valueExpected\n    every { expected.error } returns null\n    every { valueExpected.value } returns null\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleLayerPropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceLayerTestDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\n      \"{id=id, source=source, source-layer=test, type=symbol}\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun sourceLayerTestSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.sourceLayer(\"test\")\n    verify { style.setStyleLayerProperty(\"id\", \"source-layer\", capture(valueSlot)) }\n    assertEquals(\n      \"test\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun minZoomTestDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{id=id, source=source, type=symbol, minzoom=10.0}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minZoomTestSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.minZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun maxZoomTestDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertEquals(\"{maxzoom=10.0, id=id, source=source, type=symbol}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxZoomTestSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.maxZoom(12.0)\n    verify { style.setStyleLayerProperty(\"id\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(\n      \"12.0\",\n      valueSlot.captured.toString()\n    )\n  }\n\n  @Test\n  fun filterSet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.filter(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"filter\", capture(valueSlot)) }\n    assertEquals(expression.toString(), valueSlot.captured.toString())\n  }\n\n  @Test\n  fun filterGet() {\n    val expression = eq {\n      get {\n        literal(\"count\")\n      }\n      literal(0)\n    }\n    every { styleProperty.value } returns expression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.filter?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"filter\") }\n  }\n  // Property getters and setters\n\n  @Test\n  fun iconAllowOverlapSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.iconAllowOverlap(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-allow-overlap\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun iconAllowOverlapGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.iconAllowOverlap?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-allow-overlap\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconAllowOverlapAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconAllowOverlap(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-allow-overlap\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconAllowOverlapAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconAllowOverlapAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-allow-overlap\") }\n  }\n\n  @Test\n  fun iconAllowOverlapAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconAllowOverlapAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-allow-overlap\") }\n  }\n\n  @Test\n  fun iconAllowOverlapAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.iconAllowOverlapAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.iconAllowOverlap)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-allow-overlap\") }\n  }\n\n  @Test\n  fun iconAnchorSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconAnchor(IconAnchor.CENTER)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"center\")\n  }\n\n  @Test\n  fun iconAnchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"center\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(IconAnchor.CENTER, layer.iconAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-anchor\") }\n  }\n\n  @Test\n  fun iconAnchorAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-anchor\") }\n  }\n\n  @Test\n  fun iconAnchorAsExpressionGetFromLiteral() {\n    val value = \"center\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.iconAnchorAsExpression?.toString())\n    assertEquals(IconAnchor.CENTER.value, layer.iconAnchorAsExpression.toString())\n    assertEquals(IconAnchor.CENTER, layer.iconAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-anchor\") }\n  }\n\n  @Test\n  fun iconIgnorePlacementSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.iconIgnorePlacement(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-ignore-placement\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun iconIgnorePlacementGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.iconIgnorePlacement?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-ignore-placement\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconIgnorePlacementAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconIgnorePlacement(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-ignore-placement\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconIgnorePlacementAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconIgnorePlacementAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-ignore-placement\") }\n  }\n\n  @Test\n  fun iconIgnorePlacementAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconIgnorePlacementAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-ignore-placement\") }\n  }\n\n  @Test\n  fun iconIgnorePlacementAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.iconIgnorePlacementAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.iconIgnorePlacement)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-ignore-placement\") }\n  }\n\n  @Test\n  fun iconImageSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = \"abc\"\n    layer.bindTo(style)\n    layer.iconImage(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-image\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun iconImageGet() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), layer.iconImage?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-image\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconImageAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconImage(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-image\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconImageAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconImageAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-image\") }\n  }\n\n  @Test\n  fun iconImageAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconImageAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-image\") }\n  }\n\n  @Test\n  fun iconImageAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.iconImageAsExpression.toString())\n    assertEquals(\"abc\", layer.iconImage)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-image\") }\n  }\n\n  @Test\n  fun iconKeepUprightSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.iconKeepUpright(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-keep-upright\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun iconKeepUprightGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.iconKeepUpright?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-keep-upright\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconKeepUprightAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconKeepUpright(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-keep-upright\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconKeepUprightAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconKeepUprightAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-keep-upright\") }\n  }\n\n  @Test\n  fun iconKeepUprightAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconKeepUprightAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-keep-upright\") }\n  }\n\n  @Test\n  fun iconKeepUprightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.iconKeepUprightAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.iconKeepUpright)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-keep-upright\") }\n  }\n\n  @Test\n  fun iconOffsetSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.iconOffset(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun iconOffsetGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.iconOffset?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconOffsetAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconOffset(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconOffsetAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconOffsetAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-offset\") }\n  }\n\n  @Test\n  fun iconOffsetAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconOffsetAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-offset\") }\n  }\n\n  @Test\n  fun iconOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.iconOffsetAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.iconOffset!!)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-offset\") }\n  }\n\n  @Test\n  fun iconOptionalSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.iconOptional(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-optional\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun iconOptionalGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.iconOptional?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-optional\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconOptionalAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconOptional(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-optional\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconOptionalAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconOptionalAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-optional\") }\n  }\n\n  @Test\n  fun iconOptionalAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconOptionalAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-optional\") }\n  }\n\n  @Test\n  fun iconOptionalAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.iconOptionalAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.iconOptional)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-optional\") }\n  }\n\n  @Test\n  fun iconPaddingSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconPadding(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-padding\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconPaddingGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconPadding?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-padding\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconPaddingAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconPadding(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-padding\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconPaddingAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconPaddingAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-padding\") }\n  }\n\n  @Test\n  fun iconPaddingAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconPaddingAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-padding\") }\n  }\n\n  @Test\n  fun iconPaddingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconPaddingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconPadding!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-padding\") }\n  }\n\n  @Test\n  fun iconPitchAlignmentSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconPitchAlignment(IconPitchAlignment.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-pitch-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun iconPitchAlignmentGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(IconPitchAlignment.MAP, layer.iconPitchAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-pitch-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconPitchAlignmentAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconPitchAlignment(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-pitch-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconPitchAlignmentAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconPitchAlignmentAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-pitch-alignment\") }\n  }\n\n  @Test\n  fun iconPitchAlignmentAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconPitchAlignmentAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-pitch-alignment\") }\n  }\n\n  @Test\n  fun iconPitchAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.iconPitchAlignmentAsExpression?.toString())\n    assertEquals(IconPitchAlignment.MAP.value, layer.iconPitchAlignmentAsExpression.toString())\n    assertEquals(IconPitchAlignment.MAP, layer.iconPitchAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-pitch-alignment\") }\n  }\n\n  @Test\n  fun iconRotateSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconRotate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-rotate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconRotateGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconRotate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-rotate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconRotateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconRotate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-rotate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconRotateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconRotateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-rotate\") }\n  }\n\n  @Test\n  fun iconRotateAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconRotateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-rotate\") }\n  }\n\n  @Test\n  fun iconRotateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconRotateAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconRotate!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-rotate\") }\n  }\n\n  @Test\n  fun iconRotationAlignmentSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconRotationAlignment(IconRotationAlignment.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-rotation-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun iconRotationAlignmentGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(IconRotationAlignment.MAP, layer.iconRotationAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-rotation-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconRotationAlignmentAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconRotationAlignment(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-rotation-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconRotationAlignmentAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconRotationAlignmentAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-rotation-alignment\") }\n  }\n\n  @Test\n  fun iconRotationAlignmentAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconRotationAlignmentAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-rotation-alignment\") }\n  }\n\n  @Test\n  fun iconRotationAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.iconRotationAlignmentAsExpression?.toString())\n    assertEquals(IconRotationAlignment.MAP.value, layer.iconRotationAlignmentAsExpression.toString())\n    assertEquals(IconRotationAlignment.MAP, layer.iconRotationAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-rotation-alignment\") }\n  }\n\n  @Test\n  fun iconSizeSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconSize(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconSizeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconSize?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconSizeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconSize(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconSizeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconSizeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-size\") }\n  }\n\n  @Test\n  fun iconSizeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconSizeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-size\") }\n  }\n\n  @Test\n  fun iconSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconSize!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-size\") }\n  }\n\n  @Test\n  fun iconSizeScaleRangeSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(5.0, 5.0)\n    layer.bindTo(style)\n    layer.iconSizeScaleRange(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-size-scale-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[5.0, 5.0]\")\n  }\n\n  @Test\n  fun iconSizeScaleRangeGet() {\n    val testValue = listOf(5.0, 5.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(5.0, 5.0)\n    assertEquals(expectedValue.toString(), layer.iconSizeScaleRange?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-size-scale-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconSizeScaleRangeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconSizeScaleRange(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-size-scale-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconSizeScaleRangeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconSizeScaleRangeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-size-scale-range\") }\n  }\n\n  @Test\n  fun iconSizeScaleRangeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconSizeScaleRangeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-size-scale-range\") }\n  }\n\n  @Test\n  fun iconSizeScaleRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(5.0, 5.0))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [5.0, 5.0]]\", layer.iconSizeScaleRangeAsExpression.toString())\n    assertEquals(listOf(5.0, 5.0), layer.iconSizeScaleRange!!)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-size-scale-range\") }\n  }\n\n  @Test\n  fun iconTextFitSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconTextFit(IconTextFit.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-text-fit\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun iconTextFitGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(IconTextFit.NONE, layer.iconTextFit)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-text-fit\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconTextFitAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconTextFit(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-text-fit\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconTextFitAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconTextFitAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-text-fit\") }\n  }\n\n  @Test\n  fun iconTextFitAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconTextFitAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-text-fit\") }\n  }\n\n  @Test\n  fun iconTextFitAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.iconTextFitAsExpression?.toString())\n    assertEquals(IconTextFit.NONE.value, layer.iconTextFitAsExpression.toString())\n    assertEquals(IconTextFit.NONE, layer.iconTextFit)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-text-fit\") }\n  }\n\n  @Test\n  fun iconTextFitPaddingSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0)\n    layer.bindTo(style)\n    layer.iconTextFitPadding(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-text-fit-padding\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0, 2.0, 3.0]\")\n  }\n\n  @Test\n  fun iconTextFitPaddingGet() {\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0, 2.0, 3.0)\n    assertEquals(expectedValue.toString(), layer.iconTextFitPadding?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-text-fit-padding\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconTextFitPaddingAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconTextFitPadding(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-text-fit-padding\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconTextFitPaddingAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconTextFitPaddingAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-text-fit-padding\") }\n  }\n\n  @Test\n  fun iconTextFitPaddingAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconTextFitPaddingAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-text-fit-padding\") }\n  }\n\n  @Test\n  fun iconTextFitPaddingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0, 2.0, 3.0]]\", layer.iconTextFitPaddingAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0), layer.iconTextFitPadding!!)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-text-fit-padding\") }\n  }\n\n  @Test\n  fun symbolAvoidEdgesSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.symbolAvoidEdges(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-avoid-edges\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun symbolAvoidEdgesGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.symbolAvoidEdges?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-avoid-edges\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun symbolAvoidEdgesAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolAvoidEdges(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-avoid-edges\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun symbolAvoidEdgesAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.symbolAvoidEdgesAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-avoid-edges\") }\n  }\n\n  @Test\n  fun symbolAvoidEdgesAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.symbolAvoidEdgesAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-avoid-edges\") }\n  }\n\n  @Test\n  fun symbolAvoidEdgesAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.symbolAvoidEdgesAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.symbolAvoidEdges)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-avoid-edges\") }\n  }\n\n  @Test\n  fun symbolElevationReferenceSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolElevationReference(SymbolElevationReference.SEA)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"sea\")\n  }\n\n  @Test\n  fun symbolElevationReferenceGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"sea\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(SymbolElevationReference.SEA, layer.symbolElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun symbolElevationReferenceAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolElevationReference(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-elevation-reference\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun symbolElevationReferenceAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.symbolElevationReferenceAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-elevation-reference\") }\n  }\n\n  @Test\n  fun symbolElevationReferenceAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.symbolElevationReferenceAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-elevation-reference\") }\n  }\n\n  @Test\n  fun symbolElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"sea\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.symbolElevationReferenceAsExpression?.toString())\n    assertEquals(SymbolElevationReference.SEA.value, layer.symbolElevationReferenceAsExpression.toString())\n    assertEquals(SymbolElevationReference.SEA, layer.symbolElevationReference)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-elevation-reference\") }\n  }\n\n  @Test\n  fun symbolPlacementSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolPlacement(SymbolPlacement.POINT)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-placement\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"point\")\n  }\n\n  @Test\n  fun symbolPlacementGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"point\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(SymbolPlacement.POINT, layer.symbolPlacement)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-placement\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun symbolPlacementAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolPlacement(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-placement\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun symbolPlacementAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.symbolPlacementAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-placement\") }\n  }\n\n  @Test\n  fun symbolPlacementAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.symbolPlacementAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-placement\") }\n  }\n\n  @Test\n  fun symbolPlacementAsExpressionGetFromLiteral() {\n    val value = \"point\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.symbolPlacementAsExpression?.toString())\n    assertEquals(SymbolPlacement.POINT.value, layer.symbolPlacementAsExpression.toString())\n    assertEquals(SymbolPlacement.POINT, layer.symbolPlacement)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-placement\") }\n  }\n\n  @Test\n  fun symbolSortKeySet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.symbolSortKey(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-sort-key\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun symbolSortKeyGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.symbolSortKey?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-sort-key\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun symbolSortKeyAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolSortKey(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-sort-key\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun symbolSortKeyAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.symbolSortKeyAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-sort-key\") }\n  }\n\n  @Test\n  fun symbolSortKeyAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.symbolSortKeyAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-sort-key\") }\n  }\n\n  @Test\n  fun symbolSortKeyAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.symbolSortKeyAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.symbolSortKey!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-sort-key\") }\n  }\n\n  @Test\n  fun symbolSpacingSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.symbolSpacing(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-spacing\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun symbolSpacingGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.symbolSpacing?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-spacing\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun symbolSpacingAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolSpacing(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-spacing\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun symbolSpacingAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.symbolSpacingAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-spacing\") }\n  }\n\n  @Test\n  fun symbolSpacingAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.symbolSpacingAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-spacing\") }\n  }\n\n  @Test\n  fun symbolSpacingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.symbolSpacingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.symbolSpacing!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-spacing\") }\n  }\n\n  @Test\n  fun symbolZElevateSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.symbolZElevate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-z-elevate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun symbolZElevateGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.symbolZElevate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-elevate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun symbolZElevateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolZElevate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-z-elevate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun symbolZElevateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.symbolZElevateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-elevate\") }\n  }\n\n  @Test\n  fun symbolZElevateAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.symbolZElevateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-elevate\") }\n  }\n\n  @Test\n  fun symbolZElevateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.symbolZElevateAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.symbolZElevate)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-elevate\") }\n  }\n\n  @Test\n  fun symbolZOrderSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolZOrder(SymbolZOrder.AUTO)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-z-order\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"auto\")\n  }\n\n  @Test\n  fun symbolZOrderGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"auto\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(SymbolZOrder.AUTO, layer.symbolZOrder)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-order\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun symbolZOrderAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolZOrder(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-z-order\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun symbolZOrderAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.symbolZOrderAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-order\") }\n  }\n\n  @Test\n  fun symbolZOrderAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.symbolZOrderAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-order\") }\n  }\n\n  @Test\n  fun symbolZOrderAsExpressionGetFromLiteral() {\n    val value = \"auto\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.symbolZOrderAsExpression?.toString())\n    assertEquals(SymbolZOrder.AUTO.value, layer.symbolZOrderAsExpression.toString())\n    assertEquals(SymbolZOrder.AUTO, layer.symbolZOrder)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-order\") }\n  }\n\n  @Test\n  fun textAllowOverlapSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.textAllowOverlap(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-allow-overlap\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun textAllowOverlapGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.textAllowOverlap?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-allow-overlap\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textAllowOverlapAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textAllowOverlap(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-allow-overlap\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textAllowOverlapAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textAllowOverlapAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-allow-overlap\") }\n  }\n\n  @Test\n  fun textAllowOverlapAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textAllowOverlapAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-allow-overlap\") }\n  }\n\n  @Test\n  fun textAllowOverlapAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.textAllowOverlapAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.textAllowOverlap)\n    verify { style.getStyleLayerProperty(\"id\", \"text-allow-overlap\") }\n  }\n\n  @Test\n  fun textAnchorSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textAnchor(TextAnchor.CENTER)\n    verify { style.setStyleLayerProperty(\"id\", \"text-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"center\")\n  }\n\n  @Test\n  fun textAnchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"center\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(TextAnchor.CENTER, layer.textAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"text-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-anchor\") }\n  }\n\n  @Test\n  fun textAnchorAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-anchor\") }\n  }\n\n  @Test\n  fun textAnchorAsExpressionGetFromLiteral() {\n    val value = \"center\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.textAnchorAsExpression?.toString())\n    assertEquals(TextAnchor.CENTER.value, layer.textAnchorAsExpression.toString())\n    assertEquals(TextAnchor.CENTER, layer.textAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"text-anchor\") }\n  }\n\n  @Test\n  fun textFieldSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = formatted {\n      formattedSection(\"cyan\") {\n        fontScale = 0.9\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColorAsInt = Color.CYAN\n      }\n      formattedSection(\"black\") {\n        fontScale = 2.0\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColor = \"rgba(0, 0, 0, 1)\"\n      }\n    }\n    layer.bindTo(style)\n    layer.textField(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-field\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[[cyan, {text-color=rgba(0, 255, 255, 1), font-scale=0.9, text-font=[Open Sans Regular, Arial Unicode MS Regular]}], [black, {text-color=rgba(0, 0, 0, 1), font-scale=2.0, text-font=[Open Sans Regular, Arial Unicode MS Regular]}]]\")\n  }\n\n  @Test\n  fun textFieldGet() {\n    val formatExpression = format {\n      formatSection(\"cyan\") {\n        fontScale(0.9)\n        textFont(\n          listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n        )\n        textColor(Color.CYAN)\n      }\n      formatSection(\"black\") {\n        fontScale(2.0)\n        textFont(\n          listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n        )\n        textColor(rgba(0.0, 0.0, 0.0, 1.0))\n      }\n    }\n    every { styleProperty.value } returns formatExpression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = formatted {\n      formattedSection(\"cyan\") {\n        fontScale = 0.9\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColorAsInt = Color.CYAN\n      }\n      formattedSection(\"black\") {\n        fontScale = 2.0\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColor = \"rgba(0, 0, 0, 1)\"\n      }\n    }\n    assertEquals(expectedValue.toString(), layer.textField?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-field\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textFieldAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textField(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-field\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textFieldAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textFieldAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-field\") }\n  }\n\n  @Test\n  fun textFieldAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textFieldAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-field\") }\n  }\n\n  @Test\n  fun textFieldAsExpressionGetFromLiteral() {\n    val formatExpression = format {\n      formatSection(\"cyan\") {\n        fontScale(0.9)\n        textFont(\n          listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n        )\n        textColor(Color.CYAN)\n      }\n      formatSection(\"black\") {\n        fontScale(2.0)\n        textFont(\n          listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n        )\n        textColor(rgba(0.0, 0.0, 0.0, 1.0))\n      }\n    }\n    every { styleProperty.value } returns formatExpression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(formatExpression.toString(), layer.textFieldAsExpression.toString())\n    val expectedValue = formatted {\n      formattedSection(\"cyan\") {\n        fontScale = 0.9\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColorAsInt = Color.CYAN\n      }\n      formattedSection(\"black\") {\n        fontScale = 2.0\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColor = \"rgba(0, 0, 0, 1)\"\n      }\n    }\n    assertEquals(expectedValue, layer.textField)\n    verify { style.getStyleLayerProperty(\"id\", \"text-field\") }\n  }\n\n  @Test\n  fun textFieldAsStringSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textField(\"abc\")\n    verify { style.setStyleLayerProperty(\"id\", \"text-field\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun textFieldAsStringGet() {\n    val formatExpression = format {\n      formatSection(\"abc\")\n    }\n    every { styleProperty.value } returns formatExpression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"abc\", layer.textFieldAsString)\n    verify { style.getStyleLayerProperty(\"id\", \"text-field\") }\n  }\n\n  @Test\n  fun textFieldSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textField {\n      formattedSection(\"cyan\") {\n        fontScale = 0.9\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColorAsInt = Color.CYAN\n      }\n      formattedSection(\"black\") {\n        fontScale = 2.0\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColor = \"rgba(0, 0, 0, 1)\"\n      }\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"text-field\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[[cyan, {text-color=rgba(0, 255, 255, 1), font-scale=0.9, text-font=[Open Sans Regular, Arial Unicode MS Regular]}], [black, {text-color=rgba(0, 0, 0, 1), font-scale=2.0, text-font=[Open Sans Regular, Arial Unicode MS Regular]}]]\")\n  }\n\n  @Test\n  fun textFontSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(\"a\", \"b\", \"c\")\n    layer.bindTo(style)\n    layer.textFont(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-font\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[a, b, c]\")\n  }\n\n  @Test\n  fun textFontGet() {\n    val testValue = listOf(\"a\", \"b\", \"c\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(\"a\", \"b\", \"c\")\n    assertEquals(expectedValue.toString(), layer.textFont?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-font\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textFontAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textFont(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-font\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textFontAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textFontAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-font\") }\n  }\n\n  @Test\n  fun textFontAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textFontAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-font\") }\n  }\n\n  @Test\n  fun textFontAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"a\", \"b\", \"c\"))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [a, b, c]]\", layer.textFontAsExpression.toString())\n    assertEquals(listOf(\"a\", \"b\", \"c\"), layer.textFont!!)\n    verify { style.getStyleLayerProperty(\"id\", \"text-font\") }\n  }\n\n  @Test\n  fun textIgnorePlacementSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.textIgnorePlacement(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-ignore-placement\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun textIgnorePlacementGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.textIgnorePlacement?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-ignore-placement\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textIgnorePlacementAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textIgnorePlacement(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-ignore-placement\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textIgnorePlacementAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textIgnorePlacementAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-ignore-placement\") }\n  }\n\n  @Test\n  fun textIgnorePlacementAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textIgnorePlacementAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-ignore-placement\") }\n  }\n\n  @Test\n  fun textIgnorePlacementAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.textIgnorePlacementAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.textIgnorePlacement)\n    verify { style.getStyleLayerProperty(\"id\", \"text-ignore-placement\") }\n  }\n\n  @Test\n  fun textJustifySet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textJustify(TextJustify.AUTO)\n    verify { style.setStyleLayerProperty(\"id\", \"text-justify\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"auto\")\n  }\n\n  @Test\n  fun textJustifyGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"auto\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(TextJustify.AUTO, layer.textJustify)\n    verify { style.getStyleLayerProperty(\"id\", \"text-justify\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textJustifyAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textJustify(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-justify\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textJustifyAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textJustifyAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-justify\") }\n  }\n\n  @Test\n  fun textJustifyAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textJustifyAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-justify\") }\n  }\n\n  @Test\n  fun textJustifyAsExpressionGetFromLiteral() {\n    val value = \"auto\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.textJustifyAsExpression?.toString())\n    assertEquals(TextJustify.AUTO.value, layer.textJustifyAsExpression.toString())\n    assertEquals(TextJustify.AUTO, layer.textJustify)\n    verify { style.getStyleLayerProperty(\"id\", \"text-justify\") }\n  }\n\n  @Test\n  fun textKeepUprightSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.textKeepUpright(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-keep-upright\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun textKeepUprightGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.textKeepUpright?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-keep-upright\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textKeepUprightAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textKeepUpright(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-keep-upright\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textKeepUprightAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textKeepUprightAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-keep-upright\") }\n  }\n\n  @Test\n  fun textKeepUprightAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textKeepUprightAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-keep-upright\") }\n  }\n\n  @Test\n  fun textKeepUprightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.textKeepUprightAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.textKeepUpright)\n    verify { style.getStyleLayerProperty(\"id\", \"text-keep-upright\") }\n  }\n\n  @Test\n  fun textLetterSpacingSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textLetterSpacing(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-letter-spacing\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textLetterSpacingGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textLetterSpacing?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-letter-spacing\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textLetterSpacingAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textLetterSpacing(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-letter-spacing\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textLetterSpacingAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textLetterSpacingAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-letter-spacing\") }\n  }\n\n  @Test\n  fun textLetterSpacingAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textLetterSpacingAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-letter-spacing\") }\n  }\n\n  @Test\n  fun textLetterSpacingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textLetterSpacingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textLetterSpacing!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-letter-spacing\") }\n  }\n\n  @Test\n  fun textLineHeightSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textLineHeight(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-line-height\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textLineHeightGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textLineHeight?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-line-height\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textLineHeightAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textLineHeight(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-line-height\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textLineHeightAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textLineHeightAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-line-height\") }\n  }\n\n  @Test\n  fun textLineHeightAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textLineHeightAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-line-height\") }\n  }\n\n  @Test\n  fun textLineHeightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textLineHeightAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textLineHeight!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-line-height\") }\n  }\n\n  @Test\n  fun textMaxAngleSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textMaxAngle(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-max-angle\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textMaxAngleGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textMaxAngle?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-max-angle\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textMaxAngleAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textMaxAngle(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-max-angle\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textMaxAngleAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textMaxAngleAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-max-angle\") }\n  }\n\n  @Test\n  fun textMaxAngleAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textMaxAngleAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-max-angle\") }\n  }\n\n  @Test\n  fun textMaxAngleAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textMaxAngleAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textMaxAngle!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-max-angle\") }\n  }\n\n  @Test\n  fun textMaxWidthSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textMaxWidth(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-max-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textMaxWidthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textMaxWidth?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-max-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textMaxWidthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textMaxWidth(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-max-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textMaxWidthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textMaxWidthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-max-width\") }\n  }\n\n  @Test\n  fun textMaxWidthAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textMaxWidthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-max-width\") }\n  }\n\n  @Test\n  fun textMaxWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textMaxWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textMaxWidth!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-max-width\") }\n  }\n\n  @Test\n  fun textOffsetSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.textOffset(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun textOffsetGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.textOffset?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textOffsetAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textOffset(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textOffsetAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textOffsetAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-offset\") }\n  }\n\n  @Test\n  fun textOffsetAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textOffsetAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-offset\") }\n  }\n\n  @Test\n  fun textOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.textOffsetAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.textOffset!!)\n    verify { style.getStyleLayerProperty(\"id\", \"text-offset\") }\n  }\n\n  @Test\n  fun textOptionalSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = true\n    layer.bindTo(style)\n    layer.textOptional(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-optional\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun textOptionalGet() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), layer.textOptional?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-optional\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textOptionalAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textOptional(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-optional\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textOptionalAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textOptionalAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-optional\") }\n  }\n\n  @Test\n  fun textOptionalAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textOptionalAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-optional\") }\n  }\n\n  @Test\n  fun textOptionalAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"true\", layer.textOptionalAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, layer.textOptional)\n    verify { style.getStyleLayerProperty(\"id\", \"text-optional\") }\n  }\n\n  @Test\n  fun textPaddingSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textPadding(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-padding\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textPaddingGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textPadding?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-padding\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textPaddingAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textPadding(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-padding\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textPaddingAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textPaddingAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-padding\") }\n  }\n\n  @Test\n  fun textPaddingAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textPaddingAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-padding\") }\n  }\n\n  @Test\n  fun textPaddingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textPaddingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textPadding!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-padding\") }\n  }\n\n  @Test\n  fun textPitchAlignmentSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textPitchAlignment(TextPitchAlignment.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"text-pitch-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun textPitchAlignmentGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(TextPitchAlignment.MAP, layer.textPitchAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"text-pitch-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textPitchAlignmentAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textPitchAlignment(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-pitch-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textPitchAlignmentAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textPitchAlignmentAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-pitch-alignment\") }\n  }\n\n  @Test\n  fun textPitchAlignmentAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textPitchAlignmentAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-pitch-alignment\") }\n  }\n\n  @Test\n  fun textPitchAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.textPitchAlignmentAsExpression?.toString())\n    assertEquals(TextPitchAlignment.MAP.value, layer.textPitchAlignmentAsExpression.toString())\n    assertEquals(TextPitchAlignment.MAP, layer.textPitchAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"text-pitch-alignment\") }\n  }\n\n  @Test\n  fun textRadialOffsetSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textRadialOffset(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-radial-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textRadialOffsetGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textRadialOffset?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-radial-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textRadialOffsetAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textRadialOffset(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-radial-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textRadialOffsetAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textRadialOffsetAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-radial-offset\") }\n  }\n\n  @Test\n  fun textRadialOffsetAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textRadialOffsetAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-radial-offset\") }\n  }\n\n  @Test\n  fun textRadialOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textRadialOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textRadialOffset!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-radial-offset\") }\n  }\n\n  @Test\n  fun textRotateSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textRotate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-rotate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textRotateGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textRotate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-rotate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textRotateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textRotate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-rotate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textRotateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textRotateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-rotate\") }\n  }\n\n  @Test\n  fun textRotateAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textRotateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-rotate\") }\n  }\n\n  @Test\n  fun textRotateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textRotateAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textRotate!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-rotate\") }\n  }\n\n  @Test\n  fun textRotationAlignmentSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textRotationAlignment(TextRotationAlignment.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"text-rotation-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun textRotationAlignmentGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(TextRotationAlignment.MAP, layer.textRotationAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"text-rotation-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textRotationAlignmentAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textRotationAlignment(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-rotation-alignment\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textRotationAlignmentAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textRotationAlignmentAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-rotation-alignment\") }\n  }\n\n  @Test\n  fun textRotationAlignmentAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textRotationAlignmentAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-rotation-alignment\") }\n  }\n\n  @Test\n  fun textRotationAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.textRotationAlignmentAsExpression?.toString())\n    assertEquals(TextRotationAlignment.MAP.value, layer.textRotationAlignmentAsExpression.toString())\n    assertEquals(TextRotationAlignment.MAP, layer.textRotationAlignment)\n    verify { style.getStyleLayerProperty(\"id\", \"text-rotation-alignment\") }\n  }\n\n  @Test\n  fun textSizeSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textSize(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textSizeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textSize?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textSizeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textSize(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-size\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textSizeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textSizeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-size\") }\n  }\n\n  @Test\n  fun textSizeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textSizeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-size\") }\n  }\n\n  @Test\n  fun textSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textSize!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-size\") }\n  }\n\n  @Test\n  fun textSizeScaleRangeSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(5.0, 5.0)\n    layer.bindTo(style)\n    layer.textSizeScaleRange(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-size-scale-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[5.0, 5.0]\")\n  }\n\n  @Test\n  fun textSizeScaleRangeGet() {\n    val testValue = listOf(5.0, 5.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(5.0, 5.0)\n    assertEquals(expectedValue.toString(), layer.textSizeScaleRange?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-size-scale-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textSizeScaleRangeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textSizeScaleRange(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-size-scale-range\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textSizeScaleRangeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textSizeScaleRangeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-size-scale-range\") }\n  }\n\n  @Test\n  fun textSizeScaleRangeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textSizeScaleRangeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-size-scale-range\") }\n  }\n\n  @Test\n  fun textSizeScaleRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(5.0, 5.0))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [5.0, 5.0]]\", layer.textSizeScaleRangeAsExpression.toString())\n    assertEquals(listOf(5.0, 5.0), layer.textSizeScaleRange!!)\n    verify { style.getStyleLayerProperty(\"id\", \"text-size-scale-range\") }\n  }\n\n  @Test\n  fun textTransformSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textTransform(TextTransform.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"text-transform\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun textTransformGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(TextTransform.NONE, layer.textTransform)\n    verify { style.getStyleLayerProperty(\"id\", \"text-transform\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textTransformAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textTransform(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-transform\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textTransformAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textTransformAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-transform\") }\n  }\n\n  @Test\n  fun textTransformAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textTransformAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-transform\") }\n  }\n\n  @Test\n  fun textTransformAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.textTransformAsExpression?.toString())\n    assertEquals(TextTransform.NONE.value, layer.textTransformAsExpression.toString())\n    assertEquals(TextTransform.NONE, layer.textTransform)\n    verify { style.getStyleLayerProperty(\"id\", \"text-transform\") }\n  }\n\n  @Test\n  fun textVariableAnchorSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(\"center\", \"left\")\n    layer.bindTo(style)\n    layer.textVariableAnchor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-variable-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[center, left]\")\n  }\n\n  @Test\n  fun textVariableAnchorGet() {\n    val testValue = listOf(\"center\", \"left\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(\"center\", \"left\")\n    assertEquals(expectedValue.toString(), layer.textVariableAnchor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-variable-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textVariableAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textVariableAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-variable-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textVariableAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textVariableAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-variable-anchor\") }\n  }\n\n  @Test\n  fun textVariableAnchorAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textVariableAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-variable-anchor\") }\n  }\n\n  @Test\n  fun textVariableAnchorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"center\", \"left\"))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [center, left]]\", layer.textVariableAnchorAsExpression.toString())\n    assertEquals(listOf(\"center\", \"left\"), layer.textVariableAnchor!!)\n    verify { style.getStyleLayerProperty(\"id\", \"text-variable-anchor\") }\n  }\n\n  @Test\n  fun textWritingModeSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(\"horizontal\", \"vertical\")\n    layer.bindTo(style)\n    layer.textWritingMode(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-writing-mode\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[horizontal, vertical]\")\n  }\n\n  @Test\n  fun textWritingModeGet() {\n    val testValue = listOf(\"horizontal\", \"vertical\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(\"horizontal\", \"vertical\")\n    assertEquals(expectedValue.toString(), layer.textWritingMode?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-writing-mode\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textWritingModeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textWritingMode(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-writing-mode\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textWritingModeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textWritingModeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-writing-mode\") }\n  }\n\n  @Test\n  fun textWritingModeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textWritingModeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-writing-mode\") }\n  }\n\n  @Test\n  fun textWritingModeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"horizontal\", \"vertical\"))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [horizontal, vertical]]\", layer.textWritingModeAsExpression.toString())\n    assertEquals(listOf(\"horizontal\", \"vertical\"), layer.textWritingMode!!)\n    verify { style.getStyleLayerProperty(\"id\", \"text-writing-mode\") }\n  }\n\n  @Test\n  fun iconColorSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.iconColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun iconColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.iconColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color\") }\n  }\n\n  @Test\n  fun iconColorUseThemeSetAfterInitialization() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.iconColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun iconColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"icon-color-use-theme\"))\n  }\n\n  @Test\n  fun iconColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.iconColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun iconColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-use-theme\") }\n  }\n\n  @Test\n  fun iconColorUseThemeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.iconColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-use-theme\") }\n  }\n\n  @Test\n  fun iconColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-use-theme\") }\n  }\n\n  @Test\n  fun iconColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.iconColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-use-theme\") }\n  }\n\n  @Test\n  fun iconColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color\") }\n  }\n\n  @Test\n  fun iconColorAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color\") }\n  }\n\n  @Test\n  fun iconColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.iconColor)\n    assertEquals(Color.BLACK, layer.iconColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color\") }\n  }\n\n  @Test\n  fun iconColorAsColorIntSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun iconColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.iconColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color\") }\n  }\n\n  @Test\n  fun iconColorTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-transition\") }\n  }\n\n  @Test\n  fun iconColorTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconColorBrightnessMaxSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconColorBrightnessMax(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-brightness-max\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconColorBrightnessMaxGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconColorBrightnessMax?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-brightness-max\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconColorBrightnessMaxAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColorBrightnessMax(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-brightness-max\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconColorBrightnessMaxAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconColorBrightnessMaxAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-brightness-max\") }\n  }\n\n  @Test\n  fun iconColorBrightnessMaxAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconColorBrightnessMaxAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-brightness-max\") }\n  }\n\n  @Test\n  fun iconColorBrightnessMaxAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconColorBrightnessMaxAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconColorBrightnessMax!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-brightness-max\") }\n  }\n\n  @Test\n  fun iconColorBrightnessMinSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconColorBrightnessMin(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-brightness-min\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconColorBrightnessMinGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconColorBrightnessMin?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-brightness-min\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconColorBrightnessMinAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColorBrightnessMin(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-brightness-min\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconColorBrightnessMinAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconColorBrightnessMinAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-brightness-min\") }\n  }\n\n  @Test\n  fun iconColorBrightnessMinAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconColorBrightnessMinAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-brightness-min\") }\n  }\n\n  @Test\n  fun iconColorBrightnessMinAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconColorBrightnessMinAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconColorBrightnessMin!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-brightness-min\") }\n  }\n\n  @Test\n  fun iconColorContrastSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconColorContrast(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-contrast\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconColorContrastGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconColorContrast?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-contrast\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconColorContrastAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColorContrast(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-contrast\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconColorContrastAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconColorContrastAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-contrast\") }\n  }\n\n  @Test\n  fun iconColorContrastAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconColorContrastAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-contrast\") }\n  }\n\n  @Test\n  fun iconColorContrastAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconColorContrastAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconColorContrast!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-contrast\") }\n  }\n\n  @Test\n  fun iconColorSaturationSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconColorSaturation(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-saturation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconColorSaturationGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconColorSaturation?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-saturation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconColorSaturationAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColorSaturation(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-saturation\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconColorSaturationAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconColorSaturationAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-saturation\") }\n  }\n\n  @Test\n  fun iconColorSaturationAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconColorSaturationAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-saturation\") }\n  }\n\n  @Test\n  fun iconColorSaturationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconColorSaturationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconColorSaturation!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-saturation\") }\n  }\n\n  @Test\n  fun iconColorSaturationTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColorSaturationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-saturation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconColorSaturationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconColorSaturationTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-color-saturation-transition\") }\n  }\n\n  @Test\n  fun iconColorSaturationTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconColorSaturationTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-color-saturation-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconEmissiveStrengthSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-emissive-strength\") }\n  }\n\n  @Test\n  fun iconEmissiveStrengthAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-emissive-strength\") }\n  }\n\n  @Test\n  fun iconEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-emissive-strength\") }\n  }\n\n  @Test\n  fun iconEmissiveStrengthTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun iconEmissiveStrengthTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconHaloBlurSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconHaloBlur(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-blur\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconHaloBlurGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconHaloBlur?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-blur\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconHaloBlurAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloBlur(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-blur\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconHaloBlurAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconHaloBlurAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-blur\") }\n  }\n\n  @Test\n  fun iconHaloBlurAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconHaloBlurAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-blur\") }\n  }\n\n  @Test\n  fun iconHaloBlurAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconHaloBlurAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconHaloBlur!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-blur\") }\n  }\n\n  @Test\n  fun iconHaloBlurTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloBlurTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-blur-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconHaloBlurTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconHaloBlurTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-blur-transition\") }\n  }\n\n  @Test\n  fun iconHaloBlurTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloBlurTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-blur-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconHaloColorSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.iconHaloColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun iconHaloColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.iconHaloColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color\") }\n  }\n\n  @Test\n  fun iconHaloColorUseThemeSetAfterInitialization() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.iconHaloColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun iconHaloColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"icon-halo-color-use-theme\"))\n  }\n\n  @Test\n  fun iconHaloColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.iconHaloColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconHaloColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun iconHaloColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconHaloColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun iconHaloColorUseThemeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.iconHaloColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun iconHaloColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconHaloColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun iconHaloColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.iconHaloColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun iconHaloColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconHaloColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconHaloColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color\") }\n  }\n\n  @Test\n  fun iconHaloColorAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconHaloColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color\") }\n  }\n\n  @Test\n  fun iconHaloColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconHaloColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.iconHaloColor)\n    assertEquals(Color.BLACK, layer.iconHaloColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color\") }\n  }\n\n  @Test\n  fun iconHaloColorAsColorIntSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun iconHaloColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.iconHaloColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color\") }\n  }\n\n  @Test\n  fun iconHaloColorTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconHaloColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconHaloColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-color-transition\") }\n  }\n\n  @Test\n  fun iconHaloColorTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconHaloWidthSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconHaloWidth(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconHaloWidthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconHaloWidth?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconHaloWidthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloWidth(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconHaloWidthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconHaloWidthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-width\") }\n  }\n\n  @Test\n  fun iconHaloWidthAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconHaloWidthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-width\") }\n  }\n\n  @Test\n  fun iconHaloWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconHaloWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconHaloWidth!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-width\") }\n  }\n\n  @Test\n  fun iconHaloWidthTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloWidthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconHaloWidthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconHaloWidthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-halo-width-transition\") }\n  }\n\n  @Test\n  fun iconHaloWidthTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconHaloWidthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-halo-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconImageCrossFadeSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconImageCrossFade(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-image-cross-fade\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconImageCrossFadeGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconImageCrossFade?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-image-cross-fade\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconImageCrossFadeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconImageCrossFade(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-image-cross-fade\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconImageCrossFadeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconImageCrossFadeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-image-cross-fade\") }\n  }\n\n  @Test\n  fun iconImageCrossFadeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconImageCrossFadeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-image-cross-fade\") }\n  }\n\n  @Test\n  fun iconImageCrossFadeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconImageCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconImageCrossFade!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-image-cross-fade\") }\n  }\n\n  @Test\n  fun iconImageCrossFadeTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconImageCrossFadeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-image-cross-fade-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconImageCrossFadeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconImageCrossFadeTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-image-cross-fade-transition\") }\n  }\n\n  @Test\n  fun iconImageCrossFadeTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconImageCrossFadeTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-image-cross-fade-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconOcclusionOpacitySet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconOcclusionOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-occlusion-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconOcclusionOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconOcclusionOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-occlusion-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconOcclusionOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconOcclusionOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-occlusion-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconOcclusionOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconOcclusionOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-occlusion-opacity\") }\n  }\n\n  @Test\n  fun iconOcclusionOpacityAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconOcclusionOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-occlusion-opacity\") }\n  }\n\n  @Test\n  fun iconOcclusionOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconOcclusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconOcclusionOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-occlusion-opacity\") }\n  }\n\n  @Test\n  fun iconOcclusionOpacityTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconOcclusionOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-occlusion-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconOcclusionOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconOcclusionOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-occlusion-opacity-transition\") }\n  }\n\n  @Test\n  fun iconOcclusionOpacityTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconOcclusionOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-occlusion-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconOpacitySet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.iconOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun iconOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.iconOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-opacity\") }\n  }\n\n  @Test\n  fun iconOpacityAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-opacity\") }\n  }\n\n  @Test\n  fun iconOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.iconOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-opacity\") }\n  }\n\n  @Test\n  fun iconOpacityTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-opacity-transition\") }\n  }\n\n  @Test\n  fun iconOpacityTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconTranslateSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.iconTranslate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun iconTranslateGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.iconTranslate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconTranslateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconTranslate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconTranslateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconTranslateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-translate\") }\n  }\n\n  @Test\n  fun iconTranslateAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconTranslateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-translate\") }\n  }\n\n  @Test\n  fun iconTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.iconTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.iconTranslate!!)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-translate\") }\n  }\n\n  @Test\n  fun iconTranslateTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconTranslateTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"icon-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconTranslateTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.iconTranslateTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-translate-transition\") }\n  }\n\n  @Test\n  fun iconTranslateTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconTranslateTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"icon-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun iconTranslateAnchorSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconTranslateAnchor(IconTranslateAnchor.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun iconTranslateAnchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(IconTranslateAnchor.MAP, layer.iconTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun iconTranslateAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.iconTranslateAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"icon-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun iconTranslateAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.iconTranslateAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"icon-translate-anchor\") }\n  }\n\n  @Test\n  fun iconTranslateAnchorAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.iconTranslateAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-translate-anchor\") }\n  }\n\n  @Test\n  fun iconTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.iconTranslateAnchorAsExpression?.toString())\n    assertEquals(IconTranslateAnchor.MAP.value, layer.iconTranslateAnchorAsExpression.toString())\n    assertEquals(IconTranslateAnchor.MAP, layer.iconTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"icon-translate-anchor\") }\n  }\n\n  @Test\n  fun occlusionOpacityModeSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.occlusionOpacityMode(OcclusionOpacityMode.ANCHOR)\n    verify { style.setStyleLayerProperty(\"id\", \"occlusion-opacity-mode\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"anchor\")\n  }\n\n  @Test\n  fun occlusionOpacityModeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"anchor\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(OcclusionOpacityMode.ANCHOR, layer.occlusionOpacityMode)\n    verify { style.getStyleLayerProperty(\"id\", \"occlusion-opacity-mode\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun occlusionOpacityModeAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.occlusionOpacityMode(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"occlusion-opacity-mode\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun occlusionOpacityModeAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.occlusionOpacityModeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"occlusion-opacity-mode\") }\n  }\n\n  @Test\n  fun occlusionOpacityModeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.occlusionOpacityModeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"occlusion-opacity-mode\") }\n  }\n\n  @Test\n  fun occlusionOpacityModeAsExpressionGetFromLiteral() {\n    val value = \"anchor\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.occlusionOpacityModeAsExpression?.toString())\n    assertEquals(OcclusionOpacityMode.ANCHOR.value, layer.occlusionOpacityModeAsExpression.toString())\n    assertEquals(OcclusionOpacityMode.ANCHOR, layer.occlusionOpacityMode)\n    verify { style.getStyleLayerProperty(\"id\", \"occlusion-opacity-mode\") }\n  }\n\n  @Test\n  fun symbolZOffsetSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.symbolZOffset(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-z-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun symbolZOffsetGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.symbolZOffset?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun symbolZOffsetAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolZOffset(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-z-offset\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun symbolZOffsetAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.symbolZOffsetAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-offset\") }\n  }\n\n  @Test\n  fun symbolZOffsetAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.symbolZOffsetAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-offset\") }\n  }\n\n  @Test\n  fun symbolZOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.symbolZOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.symbolZOffset!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-offset\") }\n  }\n\n  @Test\n  fun symbolZOffsetTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolZOffsetTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-z-offset-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun symbolZOffsetTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.symbolZOffsetTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"symbol-z-offset-transition\") }\n  }\n\n  @Test\n  fun symbolZOffsetTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.symbolZOffsetTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"symbol-z-offset-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textColorSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.textColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun textColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.textColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-color\") }\n  }\n\n  @Test\n  fun textColorUseThemeSetAfterInitialization() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.textColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"text-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun textColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"text-color-use-theme\"))\n  }\n\n  @Test\n  fun textColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.textColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun textColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-color-use-theme\") }\n  }\n\n  @Test\n  fun textColorUseThemeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.textColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-color-use-theme\") }\n  }\n\n  @Test\n  fun textColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-color-use-theme\") }\n  }\n\n  @Test\n  fun textColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.textColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-color-use-theme\") }\n  }\n\n  @Test\n  fun textColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-color\") }\n  }\n\n  @Test\n  fun textColorAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-color\") }\n  }\n\n  @Test\n  fun textColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.textColor)\n    assertEquals(Color.BLACK, layer.textColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"text-color\") }\n  }\n\n  @Test\n  fun textColorAsColorIntSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"text-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun textColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.textColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"text-color\") }\n  }\n\n  @Test\n  fun textColorTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"text-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.textColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-color-transition\") }\n  }\n\n  @Test\n  fun textColorTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"text-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textEmissiveStrengthSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textEmissiveStrength(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textEmissiveStrengthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textEmissiveStrength?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textEmissiveStrengthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textEmissiveStrength(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-emissive-strength\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textEmissiveStrengthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textEmissiveStrengthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-emissive-strength\") }\n  }\n\n  @Test\n  fun textEmissiveStrengthAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textEmissiveStrengthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-emissive-strength\") }\n  }\n\n  @Test\n  fun textEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textEmissiveStrength!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-emissive-strength\") }\n  }\n\n  @Test\n  fun textEmissiveStrengthTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textEmissiveStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"text-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textEmissiveStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.textEmissiveStrengthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun textEmissiveStrengthTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textEmissiveStrengthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"text-emissive-strength-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textHaloBlurSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textHaloBlur(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-blur\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textHaloBlurGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textHaloBlur?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-blur\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textHaloBlurAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloBlur(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-blur\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textHaloBlurAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textHaloBlurAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-blur\") }\n  }\n\n  @Test\n  fun textHaloBlurAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textHaloBlurAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-blur\") }\n  }\n\n  @Test\n  fun textHaloBlurAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textHaloBlurAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textHaloBlur!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-blur\") }\n  }\n\n  @Test\n  fun textHaloBlurTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloBlurTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-blur-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textHaloBlurTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.textHaloBlurTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-blur-transition\") }\n  }\n\n  @Test\n  fun textHaloBlurTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloBlurTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-blur-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textHaloColorSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    layer.bindTo(style)\n    layer.textHaloColor(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"rgba(0, 0, 0, 1)\")\n  }\n\n  @Test\n  fun textHaloColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), layer.textHaloColor?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color\") }\n  }\n\n  @Test\n  fun textHaloColorUseThemeSetAfterInitialization() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val theme = \"none\"\n    layer.bindTo(style)\n    layer.textHaloColorUseTheme(theme)\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), theme)\n  }\n\n  @Test\n  fun textHaloColorUseThemeSet() {\n    val theme = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColorUseTheme(theme)\n    }\n    layer.bindTo(style)\n    verify { style.addStyleLayer(capture(valueSlot), any()) }\n    assertTrue(valueSlot.captured.toString().contains(\"text-halo-color-use-theme\"))\n  }\n\n  @Test\n  fun textHaloColorUseThemeGet() {\n    val theme = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(theme)\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(theme.toString(), layer.textHaloColorUseTheme?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textHaloColorUseThemeAsExpressionSet() {\n    val expression = literal(\"none\")\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloColorUseTheme(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-color-use-theme\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun textHaloColorUseThemeAsExpressionGet() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textHaloColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun textHaloColorUseThemeAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(null, layer.textHaloColorUseThemeAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun textHaloColorUseThemeAsExpressionGetFromLiteral() {\n    val expression = literal(\"none\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textHaloColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun textHaloColorUseThemeAsExpressionGetFromString() {\n    val testValue = \"none\"\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColorUseTheme(testValue)\n    }\n    layer.bindTo(style)\n    assertEquals(literal(testValue).toString(), layer.textHaloColorUseThemeAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color-use-theme\") }\n  }\n\n  @Test\n  fun textHaloColorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloColor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-color\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textHaloColorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textHaloColorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color\") }\n  }\n\n  @Test\n  fun textHaloColorAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textHaloColorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color\") }\n  }\n\n  @Test\n  fun textHaloColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textHaloColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.textHaloColor)\n    assertEquals(Color.BLACK, layer.textHaloColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color\") }\n  }\n\n  @Test\n  fun textHaloColorAsColorIntSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloColor(Color.CYAN)\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun textHaloColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(Color.RED, layer.textHaloColorAsColorInt)\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color\") }\n  }\n\n  @Test\n  fun textHaloColorTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textHaloColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.textHaloColorTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-color-transition\") }\n  }\n\n  @Test\n  fun textHaloColorTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloColorTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-color-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textHaloWidthSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textHaloWidth(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textHaloWidthGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textHaloWidth?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textHaloWidthAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloWidth(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-width\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textHaloWidthAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textHaloWidthAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-width\") }\n  }\n\n  @Test\n  fun textHaloWidthAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textHaloWidthAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-width\") }\n  }\n\n  @Test\n  fun textHaloWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textHaloWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textHaloWidth!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-width\") }\n  }\n\n  @Test\n  fun textHaloWidthTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloWidthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textHaloWidthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.textHaloWidthTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-halo-width-transition\") }\n  }\n\n  @Test\n  fun textHaloWidthTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textHaloWidthTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"text-halo-width-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textOcclusionOpacitySet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textOcclusionOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-occlusion-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textOcclusionOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textOcclusionOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-occlusion-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textOcclusionOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textOcclusionOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-occlusion-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textOcclusionOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textOcclusionOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-occlusion-opacity\") }\n  }\n\n  @Test\n  fun textOcclusionOpacityAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textOcclusionOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-occlusion-opacity\") }\n  }\n\n  @Test\n  fun textOcclusionOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textOcclusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textOcclusionOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-occlusion-opacity\") }\n  }\n\n  @Test\n  fun textOcclusionOpacityTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textOcclusionOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"text-occlusion-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textOcclusionOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.textOcclusionOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-occlusion-opacity-transition\") }\n  }\n\n  @Test\n  fun textOcclusionOpacityTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textOcclusionOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"text-occlusion-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textOpacitySet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = 1.0\n    layer.bindTo(style)\n    layer.textOpacity(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun textOpacityGet() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), layer.textOpacity?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textOpacityAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textOpacity(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-opacity\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textOpacityAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textOpacityAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-opacity\") }\n  }\n\n  @Test\n  fun textOpacityAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textOpacityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-opacity\") }\n  }\n\n  @Test\n  fun textOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(1.0, layer.textOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textOpacity!!, 1E-5)\n    verify { style.getStyleLayerProperty(\"id\", \"text-opacity\") }\n  }\n\n  @Test\n  fun textOpacityTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textOpacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"text-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textOpacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.textOpacityTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-opacity-transition\") }\n  }\n\n  @Test\n  fun textOpacityTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textOpacityTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"text-opacity-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textTranslateSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    val testValue = listOf(0.0, 1.0)\n    layer.bindTo(style)\n    layer.textTranslate(testValue)\n    verify { style.setStyleLayerProperty(\"id\", \"text-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[0.0, 1.0]\")\n  }\n\n  @Test\n  fun textTranslateGet() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), layer.textTranslate?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textTranslateAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textTranslate(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-translate\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textTranslateAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textTranslateAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-translate\") }\n  }\n\n  @Test\n  fun textTranslateAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textTranslateAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-translate\") }\n  }\n\n  @Test\n  fun textTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", layer.textTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.textTranslate!!)\n    verify { style.getStyleLayerProperty(\"id\", \"text-translate\") }\n  }\n\n  @Test\n  fun textTranslateTransitionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textTranslateTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLayerProperty(\"id\", \"text-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textTranslateTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    assertEquals(transition.toValue().toString(), layer.textTranslateTransition?.toValue().toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-translate-transition\") }\n  }\n\n  @Test\n  fun textTranslateTransitionSetDsl() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textTranslateTransition {\n      duration(100)\n      delay(200)\n    }\n    verify { style.setStyleLayerProperty(\"id\", \"text-translate-transition\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{duration=100, delay=200}\")\n  }\n\n  @Test\n  fun textTranslateAnchorSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textTranslateAnchor(TextTranslateAnchor.MAP)\n    verify { style.setStyleLayerProperty(\"id\", \"text-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"map\")\n  }\n\n  @Test\n  fun textTranslateAnchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(TextTranslateAnchor.MAP, layer.textTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"text-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun textTranslateAnchorAsExpressionSet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.textTranslateAnchor(expression)\n    verify { style.setStyleLayerProperty(\"id\", \"text-translate-anchor\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[+, 2, 3]\")\n  }\n\n  @Test\n  fun textTranslateAnchorAsExpressionGet() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(expression.toString(), layer.textTranslateAnchorAsExpression?.toString())\n    verify { style.getStyleLayerProperty(\"id\", \"text-translate-anchor\") }\n  }\n\n  @Test\n  fun textTranslateAnchorAsExpressionGetNull() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(null, layer.textTranslateAnchorAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"text-translate-anchor\") }\n  }\n\n  @Test\n  fun textTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(value.toString(), layer.textTranslateAnchorAsExpression?.toString())\n    assertEquals(TextTranslateAnchor.MAP.value, layer.textTranslateAnchorAsExpression.toString())\n    assertEquals(TextTranslateAnchor.MAP, layer.textTranslateAnchor)\n    verify { style.getStyleLayerProperty(\"id\", \"text-translate-anchor\") }\n  }\n\n  @Test\n  fun visibilitySet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(Visibility.NONE)\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(Visibility.NONE, layer.visibility)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun visibilityAsExpressionSet() {\n    val layer = symbolLayer(\"id\", \"source\") {}\n    layer.bindTo(style)\n    layer.visibility(literal(\"none\"))\n    verify { style.setStyleLayerProperty(\"id\", \"visibility\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"none\")\n  }\n\n  @Test\n  fun visibilityAsExpressionGet() {\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns literal(\"none\")\n\n    val layer = symbolLayer(\"id\", \"source\") { }\n    layer.bindTo(style)\n    assertEquals(literal(\"none\"), layer.visibilityAsExpression)\n    verify { style.getStyleLayerProperty(\"id\", \"visibility\") }\n  }\n\n  @Test\n  fun getType() {\n    val layer = symbolLayer(\"id\", \"source\") { }\n    assertEquals(\"symbol\", layer.getType())\n  }\n\n  @Test\n  fun getSymbolLayerTest() {\n    every { style.getStyleLayerProperty(\"id\", \"source\") } returns StylePropertyValue(\n      Value(\"source\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { style.getStyleLayerProperty(\"id\", \"type\") } returns StylePropertyValue(\n      Value(\"symbol\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    val layer = style.getLayer(\"id\") as SymbolLayer\n    assertNotNull(layer)\n    assertNotNull(layer.delegate)\n    assertEquals(style, layer.delegate)\n    assertEquals(\"symbol\", layer.getType())\n    assertEquals(\"source\", layer.sourceId)\n    assertEquals(\"id\", layer.layerId)\n  }\n\n  // Default property getter tests\n\n  @Test\n  fun defaultIconAllowOverlapTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconAllowOverlap?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-allow-overlap\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconAllowOverlapAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconAllowOverlapAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-allow-overlap\") }\n  }\n\n  @Test\n  fun defaultIconAllowOverlapAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultIconAllowOverlapAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultIconAllowOverlap)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-allow-overlap\") }\n  }\n\n  @Test\n  fun defaultIconAnchorTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"center\")\n\n    assertEquals(IconAnchor.CENTER, SymbolLayer.defaultIconAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-anchor\") }\n  }\n\n  @Test\n  fun defaultIconAnchorAsExpressionGetFromLiteral() {\n    val value = \"center\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultIconAnchorAsExpression?.toString())\n    assertEquals(IconAnchor.CENTER.value, SymbolLayer.defaultIconAnchorAsExpression.toString())\n    assertEquals(IconAnchor.CENTER, SymbolLayer.defaultIconAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-anchor\") }\n  }\n\n  @Test\n  fun defaultIconIgnorePlacementTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconIgnorePlacement?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-ignore-placement\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconIgnorePlacementAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconIgnorePlacementAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-ignore-placement\") }\n  }\n\n  @Test\n  fun defaultIconIgnorePlacementAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultIconIgnorePlacementAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultIconIgnorePlacement)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-ignore-placement\") }\n  }\n\n  @Test\n  fun defaultIconImageTest() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    val expectedValue = \"abc\"\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconImage?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconImageAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconImageAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image\") }\n  }\n\n  @Test\n  fun defaultIconImageAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns Value(\"abc\")\n\n    assertEquals(\"abc\", SymbolLayer.defaultIconImageAsExpression.toString())\n    assertEquals(\"abc\", SymbolLayer.defaultIconImage)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image\") }\n  }\n\n  @Test\n  fun defaultIconKeepUprightTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconKeepUpright?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-keep-upright\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconKeepUprightAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconKeepUprightAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-keep-upright\") }\n  }\n\n  @Test\n  fun defaultIconKeepUprightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultIconKeepUprightAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultIconKeepUpright)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-keep-upright\") }\n  }\n\n  @Test\n  fun defaultIconOffsetTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconOffset?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconOffsetAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconOffsetAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-offset\") }\n  }\n\n  @Test\n  fun defaultIconOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", SymbolLayer.defaultIconOffsetAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), SymbolLayer.defaultIconOffset!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-offset\") }\n  }\n\n  @Test\n  fun defaultIconOptionalTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconOptional?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-optional\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconOptionalAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconOptionalAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-optional\") }\n  }\n\n  @Test\n  fun defaultIconOptionalAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultIconOptionalAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultIconOptional)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-optional\") }\n  }\n\n  @Test\n  fun defaultIconPaddingTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconPadding?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-padding\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconPaddingAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconPaddingAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-padding\") }\n  }\n\n  @Test\n  fun defaultIconPaddingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconPaddingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconPadding!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-padding\") }\n  }\n\n  @Test\n  fun defaultIconPitchAlignmentTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(IconPitchAlignment.MAP, SymbolLayer.defaultIconPitchAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-pitch-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconPitchAlignmentAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconPitchAlignmentAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-pitch-alignment\") }\n  }\n\n  @Test\n  fun defaultIconPitchAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultIconPitchAlignmentAsExpression?.toString())\n    assertEquals(IconPitchAlignment.MAP.value, SymbolLayer.defaultIconPitchAlignmentAsExpression.toString())\n    assertEquals(IconPitchAlignment.MAP, SymbolLayer.defaultIconPitchAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-pitch-alignment\") }\n  }\n\n  @Test\n  fun defaultIconRotateTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconRotate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconRotateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconRotateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotate\") }\n  }\n\n  @Test\n  fun defaultIconRotateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconRotateAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconRotate!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotate\") }\n  }\n\n  @Test\n  fun defaultIconRotationAlignmentTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(IconRotationAlignment.MAP, SymbolLayer.defaultIconRotationAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotation-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconRotationAlignmentAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconRotationAlignmentAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotation-alignment\") }\n  }\n\n  @Test\n  fun defaultIconRotationAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultIconRotationAlignmentAsExpression?.toString())\n    assertEquals(IconRotationAlignment.MAP.value, SymbolLayer.defaultIconRotationAlignmentAsExpression.toString())\n    assertEquals(IconRotationAlignment.MAP, SymbolLayer.defaultIconRotationAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotation-alignment\") }\n  }\n\n  @Test\n  fun defaultIconSizeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconSize?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconSizeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconSizeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size\") }\n  }\n\n  @Test\n  fun defaultIconSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconSize!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size\") }\n  }\n\n  @Test\n  fun defaultIconSizeScaleRangeTest() {\n    val testValue = listOf(5.0, 5.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(5.0, 5.0)\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconSizeScaleRange?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size-scale-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconSizeScaleRangeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconSizeScaleRangeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size-scale-range\") }\n  }\n\n  @Test\n  fun defaultIconSizeScaleRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(5.0, 5.0))\n    assertEquals(\"[literal, [5.0, 5.0]]\", SymbolLayer.defaultIconSizeScaleRangeAsExpression.toString())\n    assertEquals(listOf(5.0, 5.0), SymbolLayer.defaultIconSizeScaleRange!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size-scale-range\") }\n  }\n\n  @Test\n  fun defaultIconTextFitTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(IconTextFit.NONE, SymbolLayer.defaultIconTextFit)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconTextFitAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconTextFitAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit\") }\n  }\n\n  @Test\n  fun defaultIconTextFitAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultIconTextFitAsExpression?.toString())\n    assertEquals(IconTextFit.NONE.value, SymbolLayer.defaultIconTextFitAsExpression.toString())\n    assertEquals(IconTextFit.NONE, SymbolLayer.defaultIconTextFit)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit\") }\n  }\n\n  @Test\n  fun defaultIconTextFitPaddingTest() {\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0, 2.0, 3.0)\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconTextFitPadding?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit-padding\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconTextFitPaddingAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconTextFitPaddingAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit-padding\") }\n  }\n\n  @Test\n  fun defaultIconTextFitPaddingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0))\n    assertEquals(\"[literal, [0.0, 1.0, 2.0, 3.0]]\", SymbolLayer.defaultIconTextFitPaddingAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0), SymbolLayer.defaultIconTextFitPadding!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-text-fit-padding\") }\n  }\n\n  @Test\n  fun defaultSymbolAvoidEdgesTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultSymbolAvoidEdges?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-avoid-edges\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSymbolAvoidEdgesAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultSymbolAvoidEdgesAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-avoid-edges\") }\n  }\n\n  @Test\n  fun defaultSymbolAvoidEdgesAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultSymbolAvoidEdgesAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultSymbolAvoidEdges)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-avoid-edges\") }\n  }\n\n  @Test\n  fun defaultSymbolElevationReferenceTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"sea\")\n\n    assertEquals(SymbolElevationReference.SEA, SymbolLayer.defaultSymbolElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-elevation-reference\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSymbolElevationReferenceAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultSymbolElevationReferenceAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultSymbolElevationReferenceAsExpressionGetFromLiteral() {\n    val value = \"sea\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultSymbolElevationReferenceAsExpression?.toString())\n    assertEquals(SymbolElevationReference.SEA.value, SymbolLayer.defaultSymbolElevationReferenceAsExpression.toString())\n    assertEquals(SymbolElevationReference.SEA, SymbolLayer.defaultSymbolElevationReference)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-elevation-reference\") }\n  }\n\n  @Test\n  fun defaultSymbolPlacementTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"point\")\n\n    assertEquals(SymbolPlacement.POINT, SymbolLayer.defaultSymbolPlacement)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-placement\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSymbolPlacementAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultSymbolPlacementAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-placement\") }\n  }\n\n  @Test\n  fun defaultSymbolPlacementAsExpressionGetFromLiteral() {\n    val value = \"point\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultSymbolPlacementAsExpression?.toString())\n    assertEquals(SymbolPlacement.POINT.value, SymbolLayer.defaultSymbolPlacementAsExpression.toString())\n    assertEquals(SymbolPlacement.POINT, SymbolLayer.defaultSymbolPlacement)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-placement\") }\n  }\n\n  @Test\n  fun defaultSymbolSortKeyTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultSymbolSortKey?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-sort-key\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSymbolSortKeyAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultSymbolSortKeyAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-sort-key\") }\n  }\n\n  @Test\n  fun defaultSymbolSortKeyAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultSymbolSortKeyAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultSymbolSortKey!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-sort-key\") }\n  }\n\n  @Test\n  fun defaultSymbolSpacingTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultSymbolSpacing?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-spacing\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSymbolSpacingAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultSymbolSpacingAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-spacing\") }\n  }\n\n  @Test\n  fun defaultSymbolSpacingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultSymbolSpacingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultSymbolSpacing!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-spacing\") }\n  }\n\n  @Test\n  fun defaultSymbolZElevateTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultSymbolZElevate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-elevate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSymbolZElevateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultSymbolZElevateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-elevate\") }\n  }\n\n  @Test\n  fun defaultSymbolZElevateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultSymbolZElevateAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultSymbolZElevate)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-elevate\") }\n  }\n\n  @Test\n  fun defaultSymbolZOrderTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"auto\")\n\n    assertEquals(SymbolZOrder.AUTO, SymbolLayer.defaultSymbolZOrder)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-order\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSymbolZOrderAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultSymbolZOrderAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-order\") }\n  }\n\n  @Test\n  fun defaultSymbolZOrderAsExpressionGetFromLiteral() {\n    val value = \"auto\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultSymbolZOrderAsExpression?.toString())\n    assertEquals(SymbolZOrder.AUTO.value, SymbolLayer.defaultSymbolZOrderAsExpression.toString())\n    assertEquals(SymbolZOrder.AUTO, SymbolLayer.defaultSymbolZOrder)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-order\") }\n  }\n\n  @Test\n  fun defaultTextAllowOverlapTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextAllowOverlap?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-allow-overlap\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextAllowOverlapAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextAllowOverlapAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-allow-overlap\") }\n  }\n\n  @Test\n  fun defaultTextAllowOverlapAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultTextAllowOverlapAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultTextAllowOverlap)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-allow-overlap\") }\n  }\n\n  @Test\n  fun defaultTextAnchorTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"center\")\n\n    assertEquals(TextAnchor.CENTER, SymbolLayer.defaultTextAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-anchor\") }\n  }\n\n  @Test\n  fun defaultTextAnchorAsExpressionGetFromLiteral() {\n    val value = \"center\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultTextAnchorAsExpression?.toString())\n    assertEquals(TextAnchor.CENTER.value, SymbolLayer.defaultTextAnchorAsExpression.toString())\n    assertEquals(TextAnchor.CENTER, SymbolLayer.defaultTextAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-anchor\") }\n  }\n\n  @Test\n  fun defaultTextFieldTest() {\n    val formatExpression = format {\n      formatSection(\"cyan\") {\n        fontScale(0.9)\n        textFont(\n          listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n        )\n        textColor(Color.CYAN)\n      }\n      formatSection(\"black\") {\n        fontScale(2.0)\n        textFont(\n          listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n        )\n        textColor(rgba(0.0, 0.0, 0.0, 1.0))\n      }\n    }\n    every { styleProperty.value } returns formatExpression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    val expectedValue = formatted {\n      formattedSection(\"cyan\") {\n        fontScale = 0.9\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColorAsInt = Color.CYAN\n      }\n      formattedSection(\"black\") {\n        fontScale = 2.0\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColor = \"rgba(0, 0, 0, 1)\"\n      }\n    }\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextField?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-field\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextFieldAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextFieldAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-field\") }\n  }\n\n  @Test\n  fun defaultTextFieldAsExpressionGetFromLiteral() {\n    val formatExpression = format {\n      formatSection(\"cyan\") {\n        fontScale(0.9)\n        textFont(\n          listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n        )\n        textColor(Color.CYAN)\n      }\n      formatSection(\"black\") {\n        fontScale(2.0)\n        textFont(\n          listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n        )\n        textColor(rgba(0.0, 0.0, 0.0, 1.0))\n      }\n    }\n    every { styleProperty.value } returns formatExpression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(formatExpression.toString(), SymbolLayer.defaultTextFieldAsExpression.toString())\n    val expectedValue = formatted {\n      formattedSection(\"cyan\") {\n        fontScale = 0.9\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColorAsInt = Color.CYAN\n      }\n      formattedSection(\"black\") {\n        fontScale = 2.0\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColor = \"rgba(0, 0, 0, 1)\"\n      }\n    }\n    assertEquals(expectedValue, SymbolLayer.defaultTextField)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-field\") }\n  }\n\n  @Test\n  fun defaultTextFieldAsStringTest() {\n    val formatExpression = format {\n      formatSection(\"abc\")\n    }\n    every { styleProperty.value } returns formatExpression\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(\"abc\", SymbolLayer.defaultTextFieldAsString)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-field\") }\n  }\n\n  @Test\n  fun defaultTextFontTest() {\n    val testValue = listOf(\"a\", \"b\", \"c\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(\"a\", \"b\", \"c\")\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextFont?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-font\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextFontAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextFontAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-font\") }\n  }\n\n  @Test\n  fun defaultTextFontAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"a\", \"b\", \"c\"))\n    assertEquals(\"[literal, [a, b, c]]\", SymbolLayer.defaultTextFontAsExpression.toString())\n    assertEquals(listOf(\"a\", \"b\", \"c\"), SymbolLayer.defaultTextFont!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-font\") }\n  }\n\n  @Test\n  fun defaultTextIgnorePlacementTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextIgnorePlacement?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-ignore-placement\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextIgnorePlacementAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextIgnorePlacementAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-ignore-placement\") }\n  }\n\n  @Test\n  fun defaultTextIgnorePlacementAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultTextIgnorePlacementAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultTextIgnorePlacement)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-ignore-placement\") }\n  }\n\n  @Test\n  fun defaultTextJustifyTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"auto\")\n\n    assertEquals(TextJustify.AUTO, SymbolLayer.defaultTextJustify)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-justify\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextJustifyAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextJustifyAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-justify\") }\n  }\n\n  @Test\n  fun defaultTextJustifyAsExpressionGetFromLiteral() {\n    val value = \"auto\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultTextJustifyAsExpression?.toString())\n    assertEquals(TextJustify.AUTO.value, SymbolLayer.defaultTextJustifyAsExpression.toString())\n    assertEquals(TextJustify.AUTO, SymbolLayer.defaultTextJustify)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-justify\") }\n  }\n\n  @Test\n  fun defaultTextKeepUprightTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextKeepUpright?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-keep-upright\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextKeepUprightAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextKeepUprightAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-keep-upright\") }\n  }\n\n  @Test\n  fun defaultTextKeepUprightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultTextKeepUprightAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultTextKeepUpright)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-keep-upright\") }\n  }\n\n  @Test\n  fun defaultTextLetterSpacingTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextLetterSpacing?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-letter-spacing\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextLetterSpacingAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextLetterSpacingAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-letter-spacing\") }\n  }\n\n  @Test\n  fun defaultTextLetterSpacingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextLetterSpacingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextLetterSpacing!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-letter-spacing\") }\n  }\n\n  @Test\n  fun defaultTextLineHeightTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextLineHeight?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-line-height\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextLineHeightAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextLineHeightAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-line-height\") }\n  }\n\n  @Test\n  fun defaultTextLineHeightAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextLineHeightAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextLineHeight!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-line-height\") }\n  }\n\n  @Test\n  fun defaultTextMaxAngleTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextMaxAngle?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-angle\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextMaxAngleAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextMaxAngleAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-angle\") }\n  }\n\n  @Test\n  fun defaultTextMaxAngleAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextMaxAngleAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextMaxAngle!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-angle\") }\n  }\n\n  @Test\n  fun defaultTextMaxWidthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextMaxWidth?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextMaxWidthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextMaxWidthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-width\") }\n  }\n\n  @Test\n  fun defaultTextMaxWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextMaxWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextMaxWidth!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-width\") }\n  }\n\n  @Test\n  fun defaultTextOffsetTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextOffset?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextOffsetAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextOffsetAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-offset\") }\n  }\n\n  @Test\n  fun defaultTextOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", SymbolLayer.defaultTextOffsetAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), SymbolLayer.defaultTextOffset!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-offset\") }\n  }\n\n  @Test\n  fun defaultTextOptionalTest() {\n    val testValue = true\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = true\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextOptional?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-optional\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextOptionalAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextOptionalAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-optional\") }\n  }\n\n  @Test\n  fun defaultTextOptionalAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    assertEquals(\"true\", SymbolLayer.defaultTextOptionalAsExpression.toString())\n    val expectedValue = true\n    assertEquals(expectedValue, SymbolLayer.defaultTextOptional)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-optional\") }\n  }\n\n  @Test\n  fun defaultTextPaddingTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextPadding?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-padding\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextPaddingAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextPaddingAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-padding\") }\n  }\n\n  @Test\n  fun defaultTextPaddingAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextPaddingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextPadding!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-padding\") }\n  }\n\n  @Test\n  fun defaultTextPitchAlignmentTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(TextPitchAlignment.MAP, SymbolLayer.defaultTextPitchAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-pitch-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextPitchAlignmentAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextPitchAlignmentAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-pitch-alignment\") }\n  }\n\n  @Test\n  fun defaultTextPitchAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultTextPitchAlignmentAsExpression?.toString())\n    assertEquals(TextPitchAlignment.MAP.value, SymbolLayer.defaultTextPitchAlignmentAsExpression.toString())\n    assertEquals(TextPitchAlignment.MAP, SymbolLayer.defaultTextPitchAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-pitch-alignment\") }\n  }\n\n  @Test\n  fun defaultTextRadialOffsetTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextRadialOffset?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-radial-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextRadialOffsetAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextRadialOffsetAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-radial-offset\") }\n  }\n\n  @Test\n  fun defaultTextRadialOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextRadialOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextRadialOffset!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-radial-offset\") }\n  }\n\n  @Test\n  fun defaultTextRotateTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextRotate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextRotateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextRotateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotate\") }\n  }\n\n  @Test\n  fun defaultTextRotateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextRotateAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextRotate!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotate\") }\n  }\n\n  @Test\n  fun defaultTextRotationAlignmentTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(TextRotationAlignment.MAP, SymbolLayer.defaultTextRotationAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotation-alignment\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextRotationAlignmentAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextRotationAlignmentAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotation-alignment\") }\n  }\n\n  @Test\n  fun defaultTextRotationAlignmentAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultTextRotationAlignmentAsExpression?.toString())\n    assertEquals(TextRotationAlignment.MAP.value, SymbolLayer.defaultTextRotationAlignmentAsExpression.toString())\n    assertEquals(TextRotationAlignment.MAP, SymbolLayer.defaultTextRotationAlignment)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotation-alignment\") }\n  }\n\n  @Test\n  fun defaultTextSizeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextSize?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextSizeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextSizeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size\") }\n  }\n\n  @Test\n  fun defaultTextSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextSize!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size\") }\n  }\n\n  @Test\n  fun defaultTextSizeScaleRangeTest() {\n    val testValue = listOf(5.0, 5.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(5.0, 5.0)\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextSizeScaleRange?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size-scale-range\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextSizeScaleRangeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextSizeScaleRangeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size-scale-range\") }\n  }\n\n  @Test\n  fun defaultTextSizeScaleRangeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(5.0, 5.0))\n    assertEquals(\"[literal, [5.0, 5.0]]\", SymbolLayer.defaultTextSizeScaleRangeAsExpression.toString())\n    assertEquals(listOf(5.0, 5.0), SymbolLayer.defaultTextSizeScaleRange!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size-scale-range\") }\n  }\n\n  @Test\n  fun defaultTextTransformTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(TextTransform.NONE, SymbolLayer.defaultTextTransform)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-transform\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextTransformAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextTransformAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-transform\") }\n  }\n\n  @Test\n  fun defaultTextTransformAsExpressionGetFromLiteral() {\n    val value = \"none\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultTextTransformAsExpression?.toString())\n    assertEquals(TextTransform.NONE.value, SymbolLayer.defaultTextTransformAsExpression.toString())\n    assertEquals(TextTransform.NONE, SymbolLayer.defaultTextTransform)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-transform\") }\n  }\n\n  @Test\n  fun defaultTextVariableAnchorTest() {\n    val testValue = listOf(\"center\", \"left\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(\"center\", \"left\")\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextVariableAnchor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-variable-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextVariableAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextVariableAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-variable-anchor\") }\n  }\n\n  @Test\n  fun defaultTextVariableAnchorAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"center\", \"left\"))\n    assertEquals(\"[literal, [center, left]]\", SymbolLayer.defaultTextVariableAnchorAsExpression.toString())\n    assertEquals(listOf(\"center\", \"left\"), SymbolLayer.defaultTextVariableAnchor!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-variable-anchor\") }\n  }\n\n  @Test\n  fun defaultTextWritingModeTest() {\n    val testValue = listOf(\"horizontal\", \"vertical\")\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(\"horizontal\", \"vertical\")\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextWritingMode?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-writing-mode\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextWritingModeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextWritingModeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-writing-mode\") }\n  }\n\n  @Test\n  fun defaultTextWritingModeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"horizontal\", \"vertical\"))\n    assertEquals(\"[literal, [horizontal, vertical]]\", SymbolLayer.defaultTextWritingModeAsExpression.toString())\n    assertEquals(listOf(\"horizontal\", \"vertical\"), SymbolLayer.defaultTextWritingMode!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-writing-mode\") }\n  }\n\n  @Test\n  fun defaultIconColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color\") }\n  }\n\n  @Test\n  fun defaultIconColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, SymbolLayer.defaultIconColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultIconColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color\") }\n  }\n\n  @Test\n  fun defaultIconColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", SymbolLayer.defaultIconColor)\n    assertEquals(Color.BLACK, SymbolLayer.defaultIconColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color\") }\n  }\n\n  @Test\n  fun defaultIconColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, SymbolLayer.defaultIconColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color\") }\n  }\n\n  @Test\n  fun defaultIconColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-transition\") }\n  }\n\n  @Test\n  fun defaultIconColorBrightnessMaxTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconColorBrightnessMax?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-max\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconColorBrightnessMaxAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconColorBrightnessMaxAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-max\") }\n  }\n\n  @Test\n  fun defaultIconColorBrightnessMaxAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconColorBrightnessMaxAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconColorBrightnessMax!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-max\") }\n  }\n\n  @Test\n  fun defaultIconColorBrightnessMinTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconColorBrightnessMin?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-min\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconColorBrightnessMinAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconColorBrightnessMinAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-min\") }\n  }\n\n  @Test\n  fun defaultIconColorBrightnessMinAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconColorBrightnessMinAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconColorBrightnessMin!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-min\") }\n  }\n\n  @Test\n  fun defaultIconColorContrastTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconColorContrast?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-contrast\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconColorContrastAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconColorContrastAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-contrast\") }\n  }\n\n  @Test\n  fun defaultIconColorContrastAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconColorContrastAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconColorContrast!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-contrast\") }\n  }\n\n  @Test\n  fun defaultIconColorSaturationTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconColorSaturation?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-saturation\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconColorSaturationAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconColorSaturationAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-saturation\") }\n  }\n\n  @Test\n  fun defaultIconColorSaturationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconColorSaturationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconColorSaturation!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-saturation\") }\n  }\n\n  @Test\n  fun defaultIconColorSaturationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconColorSaturationTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-saturation-transition\") }\n  }\n\n  @Test\n  fun defaultIconEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultIconEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultIconEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultIconHaloBlurTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconHaloBlur?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-blur\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconHaloBlurAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconHaloBlurAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-blur\") }\n  }\n\n  @Test\n  fun defaultIconHaloBlurAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconHaloBlurAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconHaloBlur!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-blur\") }\n  }\n\n  @Test\n  fun defaultIconHaloBlurTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconHaloBlurTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-blur-transition\") }\n  }\n\n  @Test\n  fun defaultIconHaloColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconHaloColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color\") }\n  }\n\n  @Test\n  fun defaultIconHaloColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, SymbolLayer.defaultIconHaloColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultIconHaloColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconHaloColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color\") }\n  }\n\n  @Test\n  fun defaultIconHaloColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconHaloColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", SymbolLayer.defaultIconHaloColor)\n    assertEquals(Color.BLACK, SymbolLayer.defaultIconHaloColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color\") }\n  }\n\n  @Test\n  fun defaultIconHaloColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, SymbolLayer.defaultIconHaloColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color\") }\n  }\n\n  @Test\n  fun defaultIconHaloColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconHaloColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-color-transition\") }\n  }\n\n  @Test\n  fun defaultIconHaloWidthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconHaloWidth?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconHaloWidthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconHaloWidthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-width\") }\n  }\n\n  @Test\n  fun defaultIconHaloWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconHaloWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconHaloWidth!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-width\") }\n  }\n\n  @Test\n  fun defaultIconHaloWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconHaloWidthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-halo-width-transition\") }\n  }\n\n  @Test\n  fun defaultIconImageCrossFadeTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconImageCrossFade?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image-cross-fade\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconImageCrossFadeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconImageCrossFadeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image-cross-fade\") }\n  }\n\n  @Test\n  fun defaultIconImageCrossFadeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconImageCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconImageCrossFade!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image-cross-fade\") }\n  }\n\n  @Test\n  fun defaultIconImageCrossFadeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconImageCrossFadeTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image-cross-fade-transition\") }\n  }\n\n  @Test\n  fun defaultIconOcclusionOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconOcclusionOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-occlusion-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconOcclusionOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconOcclusionOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-occlusion-opacity\") }\n  }\n\n  @Test\n  fun defaultIconOcclusionOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconOcclusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconOcclusionOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-occlusion-opacity\") }\n  }\n\n  @Test\n  fun defaultIconOcclusionOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconOcclusionOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-occlusion-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultIconOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-opacity\") }\n  }\n\n  @Test\n  fun defaultIconOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultIconOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultIconOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-opacity\") }\n  }\n\n  @Test\n  fun defaultIconOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultIconTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultIconTranslate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconTranslateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconTranslateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate\") }\n  }\n\n  @Test\n  fun defaultIconTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", SymbolLayer.defaultIconTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), SymbolLayer.defaultIconTranslate!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate\") }\n  }\n\n  @Test\n  fun defaultIconTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultIconTranslateTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate-transition\") }\n  }\n\n  @Test\n  fun defaultIconTranslateAnchorTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(IconTranslateAnchor.MAP, SymbolLayer.defaultIconTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultIconTranslateAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultIconTranslateAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultIconTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultIconTranslateAnchorAsExpression?.toString())\n    assertEquals(IconTranslateAnchor.MAP.value, SymbolLayer.defaultIconTranslateAnchorAsExpression.toString())\n    assertEquals(IconTranslateAnchor.MAP, SymbolLayer.defaultIconTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultOcclusionOpacityModeTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"anchor\")\n\n    assertEquals(OcclusionOpacityMode.ANCHOR, SymbolLayer.defaultOcclusionOpacityMode)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"occlusion-opacity-mode\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultOcclusionOpacityModeAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultOcclusionOpacityModeAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"occlusion-opacity-mode\") }\n  }\n\n  @Test\n  fun defaultOcclusionOpacityModeAsExpressionGetFromLiteral() {\n    val value = \"anchor\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultOcclusionOpacityModeAsExpression?.toString())\n    assertEquals(OcclusionOpacityMode.ANCHOR.value, SymbolLayer.defaultOcclusionOpacityModeAsExpression.toString())\n    assertEquals(OcclusionOpacityMode.ANCHOR, SymbolLayer.defaultOcclusionOpacityMode)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"occlusion-opacity-mode\") }\n  }\n\n  @Test\n  fun defaultSymbolZOffsetTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultSymbolZOffset?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-offset\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultSymbolZOffsetAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultSymbolZOffsetAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-offset\") }\n  }\n\n  @Test\n  fun defaultSymbolZOffsetAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultSymbolZOffsetAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultSymbolZOffset!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-offset\") }\n  }\n\n  @Test\n  fun defaultSymbolZOffsetTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultSymbolZOffsetTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-offset-transition\") }\n  }\n\n  @Test\n  fun defaultTextColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color\") }\n  }\n\n  @Test\n  fun defaultTextColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, SymbolLayer.defaultTextColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultTextColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color\") }\n  }\n\n  @Test\n  fun defaultTextColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", SymbolLayer.defaultTextColor)\n    assertEquals(Color.BLACK, SymbolLayer.defaultTextColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color\") }\n  }\n\n  @Test\n  fun defaultTextColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, SymbolLayer.defaultTextColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color\") }\n  }\n\n  @Test\n  fun defaultTextColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultTextColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-color-transition\") }\n  }\n\n  @Test\n  fun defaultTextEmissiveStrengthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextEmissiveStrength?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-emissive-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextEmissiveStrengthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextEmissiveStrengthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultTextEmissiveStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextEmissiveStrength!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-emissive-strength\") }\n  }\n\n  @Test\n  fun defaultTextEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultTextEmissiveStrengthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-emissive-strength-transition\") }\n  }\n\n  @Test\n  fun defaultTextHaloBlurTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextHaloBlur?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-blur\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextHaloBlurAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextHaloBlurAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-blur\") }\n  }\n\n  @Test\n  fun defaultTextHaloBlurAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextHaloBlurAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextHaloBlur!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-blur\") }\n  }\n\n  @Test\n  fun defaultTextHaloBlurTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultTextHaloBlurTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-blur-transition\") }\n  }\n\n  @Test\n  fun defaultTextHaloColorTest() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val expectedValue = \"rgba(0, 0, 0, 1)\"\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextHaloColor?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color\") }\n  }\n\n  @Test\n  fun defaultTextHaloColorUseThemeTest() {\n    val testValue = \"default\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    assertEquals(testValue, SymbolLayer.defaultTextHaloColorUseTheme)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color-use-theme\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun defaultTextHaloColorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextHaloColorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color\") }\n  }\n\n  @Test\n  fun defaultTextHaloColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextHaloColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", SymbolLayer.defaultTextHaloColor)\n    assertEquals(Color.BLACK, SymbolLayer.defaultTextHaloColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color\") }\n  }\n\n  @Test\n  fun defaultTextHaloColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    assertEquals(Color.RED, SymbolLayer.defaultTextHaloColorAsColorInt)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color\") }\n  }\n\n  @Test\n  fun defaultTextHaloColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultTextHaloColorTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-color-transition\") }\n  }\n\n  @Test\n  fun defaultTextHaloWidthTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextHaloWidth?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-width\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextHaloWidthAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextHaloWidthAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-width\") }\n  }\n\n  @Test\n  fun defaultTextHaloWidthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextHaloWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextHaloWidth!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-width\") }\n  }\n\n  @Test\n  fun defaultTextHaloWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultTextHaloWidthTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-halo-width-transition\") }\n  }\n\n  @Test\n  fun defaultTextOcclusionOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextOcclusionOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-occlusion-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextOcclusionOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextOcclusionOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-occlusion-opacity\") }\n  }\n\n  @Test\n  fun defaultTextOcclusionOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextOcclusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextOcclusionOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-occlusion-opacity\") }\n  }\n\n  @Test\n  fun defaultTextOcclusionOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultTextOcclusionOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-occlusion-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultTextOpacityTest() {\n    val testValue = 1.0\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = 1.0\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextOpacity?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextOpacityAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextOpacityAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-opacity\") }\n  }\n\n  @Test\n  fun defaultTextOpacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    assertEquals(1.0, SymbolLayer.defaultTextOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, SymbolLayer.defaultTextOpacity!!, 1E-5)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-opacity\") }\n  }\n\n  @Test\n  fun defaultTextOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultTextOpacityTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-opacity-transition\") }\n  }\n\n  @Test\n  fun defaultTextTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    every { styleProperty.value } returns TypeUtils.wrapToValue(testValue)\n    val expectedValue = listOf(0.0, 1.0)\n    assertEquals(expectedValue.toString(), SymbolLayer.defaultTextTranslate?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextTranslateAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextTranslateAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate\") }\n  }\n\n  @Test\n  fun defaultTextTranslateAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    assertEquals(\"[literal, [0.0, 1.0]]\", SymbolLayer.defaultTextTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), SymbolLayer.defaultTextTranslate!!)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate\") }\n  }\n\n  @Test\n  fun defaultTextTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    every { styleProperty.kind } returns StylePropertyValueKind.TRANSITION\n\n    assertEquals(transition.toValue().toString(), SymbolLayer.defaultTextTranslateTransition?.toValue().toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate-transition\") }\n  }\n\n  @Test\n  fun defaultTextTranslateAnchorTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    assertEquals(TextTranslateAnchor.MAP, SymbolLayer.defaultTextTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate-anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun defaultTextTranslateAnchorAsExpressionTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(expression)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n\n    assertEquals(expression.toString(), SymbolLayer.defaultTextTranslateAnchorAsExpression?.toString())\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultTextTranslateAnchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    assertEquals(value.toString(), SymbolLayer.defaultTextTranslateAnchorAsExpression?.toString())\n    assertEquals(TextTranslateAnchor.MAP.value, SymbolLayer.defaultTextTranslateAnchorAsExpression.toString())\n    assertEquals(TextTranslateAnchor.MAP, SymbolLayer.defaultTextTranslateAnchor)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate-anchor\") }\n  }\n\n  @Test\n  fun defaultVisibilityTest() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"none\")\n\n    assertEquals(Visibility.NONE, SymbolLayer.defaultVisibility)\n    verify { StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"visibility\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/light/generated/AmbientLightTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.light.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.light.setLights\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.logE\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass AmbientLightTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLightProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLightProperty(any(), any(), any()) } returns expected\n    every { style.setStyleLights(any()) } returns expected\n    every { expected.error } returns null\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun colorAsColorIntSet() {\n    val light = ambientLight(\"id\") {\n      color(Color.CYAN)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color=[rgba, 0, 255, 255, 1.0]\"))\n  }\n\n  @Test\n  fun colorAsColorIntSetAfterInitialization() {\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.color(Color.CYAN)\n    verify { style.setStyleLightProperty(\"id\", \"color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun colorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(Color.RED, light.colorAsColorInt!!)\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorSet() {\n    val light = ambientLight(\"id\") {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorSetAfterInitialization() {\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.color(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleLightProperty(\"id\", \"color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), light.color!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorAsExpressionSet() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val light = ambientLight(\"id\") {\n      color(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.color(expression)\n    verify { style.setStyleLightProperty(\"id\", \"color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorAsExpressionGet() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.colorAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetNull() {\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.colorAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.colorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", light.color)\n    assertEquals(Color.BLACK, light.colorAsColorInt)\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorTransitionSet() {\n    val light = ambientLight(\"id\") {\n      colorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionSetAfterInitialization() {\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.colorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLightProperty(\"id\", \"color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = ambientLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(transition.toValue().toString(), light.colorTransition!!.toValue().toString())\n    verify { style.getStyleLightProperty(\"id\", \"color-transition\") }\n  }\n\n  @Test\n  fun colorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = ambientLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(null, light.colorTransition)\n    verify { style.getStyleLightProperty(\"id\", \"color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun colorTransitionGetException() {\n    val light = ambientLight(\"id\") {}\n    light.colorTransition\n  }\n\n  @Test\n  fun colorTransitionSetDsl() {\n    val light = ambientLight(\"id\") {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensitySet() {\n    val light = ambientLight(\"id\") {\n      intensity(1.0)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity=1.0\"))\n  }\n\n  @Test\n  fun intensitySetAfterInitialization() {\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.intensity(1.0)\n    verify { style.setStyleLightProperty(\"id\", \"intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun intensityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(1.0.toString(), light.intensity!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun intensityAsExpressionSet() {\n    val expression = literal(1.0)\n\n    val light = ambientLight(\"id\") {\n      intensity(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun intensityAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.intensity(expression)\n    verify { style.setStyleLightProperty(\"id\", \"intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun intensityAsExpressionGet() {\n    val expression = literal(1.0)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.intensityAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n\n  @Test\n  fun intensityAsExpressionGetNull() {\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.intensityAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n\n  @Test\n  fun intensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(1.0, light.intensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, light.intensity!!, 1E-5)\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n\n  @Test\n  fun intensityTransitionSet() {\n    val light = ambientLight(\"id\") {\n      intensityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionSetAfterInitialization() {\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.intensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLightProperty(\"id\", \"intensity-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = ambientLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(transition.toValue().toString(), light.intensityTransition!!.toValue().toString())\n    verify { style.getStyleLightProperty(\"id\", \"intensity-transition\") }\n  }\n\n  @Test\n  fun intensityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = ambientLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(null, light.intensityTransition)\n    verify { style.getStyleLightProperty(\"id\", \"intensity-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun intensityTransitionGetException() {\n    val light = ambientLight(\"id\") {}\n    light.intensityTransition\n  }\n\n  @Test\n  fun intensityTransitionSetDsl() {\n    val light = ambientLight(\"id\") {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorUseThemeSet() {\n    val light = ambientLight(\"id\") {\n      colorUseTheme(\"default\")\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-use-theme=default\"))\n  }\n\n  @Test\n  fun colorUseThemeSetAfterInitialization() {\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.colorUseTheme(\"default\")\n    verify { style.setStyleLightProperty(\"id\", \"color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"default\"))\n  }\n\n  @Test\n  fun colorUseThemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(\"default\".toString(), light.colorUseTheme!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorUseThemeAsExpressionSet() {\n    val expression = literal(\"default\")\n\n    val light = ambientLight(\"id\") {\n      colorUseTheme(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.colorUseTheme(expression)\n    verify { style.setStyleLightProperty(\"id\", \"color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGet() {\n    val expression = literal(\"default\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.colorUseThemeAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGetNull() {\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.colorUseThemeAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n    val light = ambientLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertTrue(light.colorUseThemeAsExpression.toString().contains(\"default\"))\n    assertEquals(\"default\", light.colorUseTheme)\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/light/generated/DirectionalLightTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.light.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.light.setLights\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.logE\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass DirectionalLightTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLightProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLightProperty(any(), any(), any()) } returns expected\n    every { style.setStyleLights(any()) } returns expected\n    every { expected.error } returns null\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun castShadowsSet() {\n    val light = directionalLight(\"id\") {\n      castShadows(true)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"cast-shadows=true\"))\n  }\n\n  @Test\n  fun castShadowsSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.castShadows(true)\n    verify { style.setStyleLightProperty(\"id\", \"cast-shadows\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"true\"))\n  }\n\n  @Test\n  fun castShadowsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(true.toString(), light.castShadows!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"cast-shadows\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun castShadowsAsExpressionSet() {\n    val expression = literal(true)\n\n    val light = directionalLight(\"id\") {\n      castShadows(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun castShadowsAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.castShadows(expression)\n    verify { style.setStyleLightProperty(\"id\", \"cast-shadows\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun castShadowsAsExpressionGet() {\n    val expression = literal(true)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.castShadowsAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"cast-shadows\") }\n  }\n\n  @Test\n  fun castShadowsAsExpressionGetNull() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.castShadowsAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"cast-shadows\") }\n  }\n\n  @Test\n  fun castShadowsAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertTrue(light.castShadowsAsExpression.toString().contains(\"true\"))\n    assertEquals(true, light.castShadows)\n    verify { style.getStyleLightProperty(\"id\", \"cast-shadows\") }\n  }\n\n  @Test\n  fun colorAsColorIntSet() {\n    val light = directionalLight(\"id\") {\n      color(Color.CYAN)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color=[rgba, 0, 255, 255, 1.0]\"))\n  }\n\n  @Test\n  fun colorAsColorIntSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.color(Color.CYAN)\n    verify { style.setStyleLightProperty(\"id\", \"color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun colorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(Color.RED, light.colorAsColorInt!!)\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorSet() {\n    val light = directionalLight(\"id\") {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.color(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleLightProperty(\"id\", \"color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), light.color!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorAsExpressionSet() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val light = directionalLight(\"id\") {\n      color(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.color(expression)\n    verify { style.setStyleLightProperty(\"id\", \"color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorAsExpressionGet() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.colorAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetNull() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.colorAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.colorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", light.color)\n    assertEquals(Color.BLACK, light.colorAsColorInt)\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorTransitionSet() {\n    val light = directionalLight(\"id\") {\n      colorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.colorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLightProperty(\"id\", \"color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = directionalLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(transition.toValue().toString(), light.colorTransition!!.toValue().toString())\n    verify { style.getStyleLightProperty(\"id\", \"color-transition\") }\n  }\n\n  @Test\n  fun colorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = directionalLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(null, light.colorTransition)\n    verify { style.getStyleLightProperty(\"id\", \"color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun colorTransitionGetException() {\n    val light = directionalLight(\"id\") {}\n    light.colorTransition\n  }\n\n  @Test\n  fun colorTransitionSetDsl() {\n    val light = directionalLight(\"id\") {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun directionSet() {\n    val light = directionalLight(\"id\") {\n      direction(listOf(180.0, 45.0))\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"direction=[180.0, 45.0]\"))\n  }\n\n  @Test\n  fun directionSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.direction(listOf(180.0, 45.0))\n    verify { style.setStyleLightProperty(\"id\", \"direction\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"[180.0, 45.0]\"))\n  }\n\n  @Test\n  fun directionGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(180.0, 45.0))\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(listOf(180.0, 45.0).toString(), light.direction!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"direction\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun directionAsExpressionSet() {\n    val expression = literal(listOf(180.0, 45.0))\n\n    val light = directionalLight(\"id\") {\n      direction(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun directionAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.direction(expression)\n    verify { style.setStyleLightProperty(\"id\", \"direction\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun directionAsExpressionGet() {\n    val expression = literal(listOf(180.0, 45.0))\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.directionAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"direction\") }\n  }\n\n  @Test\n  fun directionAsExpressionGetNull() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.directionAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"direction\") }\n  }\n\n  @Test\n  fun directionAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(180.0, 45.0))\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(\"[literal, [180.0, 45.0]]\", light.directionAsExpression.toString())\n    assertEquals(listOf(180.0, 45.0), light.direction)\n    verify { style.getStyleLightProperty(\"id\", \"direction\") }\n  }\n\n  @Test\n  fun directionTransitionSet() {\n    val light = directionalLight(\"id\") {\n      directionTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"direction-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun directionTransitionSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.directionTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLightProperty(\"id\", \"direction-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun directionTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = directionalLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(transition.toValue().toString(), light.directionTransition!!.toValue().toString())\n    verify { style.getStyleLightProperty(\"id\", \"direction-transition\") }\n  }\n\n  @Test\n  fun directionTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = directionalLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(null, light.directionTransition)\n    verify { style.getStyleLightProperty(\"id\", \"direction-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun directionTransitionGetException() {\n    val light = directionalLight(\"id\") {}\n    light.directionTransition\n  }\n\n  @Test\n  fun directionTransitionSetDsl() {\n    val light = directionalLight(\"id\") {\n      directionTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"direction-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensitySet() {\n    val light = directionalLight(\"id\") {\n      intensity(1.0)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity=1.0\"))\n  }\n\n  @Test\n  fun intensitySetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.intensity(1.0)\n    verify { style.setStyleLightProperty(\"id\", \"intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun intensityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(1.0.toString(), light.intensity!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun intensityAsExpressionSet() {\n    val expression = literal(1.0)\n\n    val light = directionalLight(\"id\") {\n      intensity(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun intensityAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.intensity(expression)\n    verify { style.setStyleLightProperty(\"id\", \"intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun intensityAsExpressionGet() {\n    val expression = literal(1.0)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.intensityAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n\n  @Test\n  fun intensityAsExpressionGetNull() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.intensityAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n\n  @Test\n  fun intensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(1.0, light.intensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, light.intensity!!, 1E-5)\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n\n  @Test\n  fun intensityTransitionSet() {\n    val light = directionalLight(\"id\") {\n      intensityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.intensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLightProperty(\"id\", \"intensity-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = directionalLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(transition.toValue().toString(), light.intensityTransition!!.toValue().toString())\n    verify { style.getStyleLightProperty(\"id\", \"intensity-transition\") }\n  }\n\n  @Test\n  fun intensityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = directionalLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(null, light.intensityTransition)\n    verify { style.getStyleLightProperty(\"id\", \"intensity-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun intensityTransitionGetException() {\n    val light = directionalLight(\"id\") {}\n    light.intensityTransition\n  }\n\n  @Test\n  fun intensityTransitionSetDsl() {\n    val light = directionalLight(\"id\") {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun shadowDrawBeforeLayerSet() {\n    val light = directionalLight(\"id\") {\n      shadowDrawBeforeLayer(\"abc\")\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"shadow-draw-before-layer=abc\"))\n  }\n\n  @Test\n  fun shadowDrawBeforeLayerSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.shadowDrawBeforeLayer(\"abc\")\n    verify { style.setStyleLightProperty(\"id\", \"shadow-draw-before-layer\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"abc\"))\n  }\n\n  @Test\n  fun shadowDrawBeforeLayerGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(\"abc\".toString(), light.shadowDrawBeforeLayer!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"shadow-draw-before-layer\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun shadowDrawBeforeLayerAsExpressionSet() {\n    val expression = literal(\"abc\")\n\n    val light = directionalLight(\"id\") {\n      shadowDrawBeforeLayer(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun shadowDrawBeforeLayerAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.shadowDrawBeforeLayer(expression)\n    verify { style.setStyleLightProperty(\"id\", \"shadow-draw-before-layer\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun shadowDrawBeforeLayerAsExpressionGet() {\n    val expression = literal(\"abc\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.shadowDrawBeforeLayerAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"shadow-draw-before-layer\") }\n  }\n\n  @Test\n  fun shadowDrawBeforeLayerAsExpressionGetNull() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.shadowDrawBeforeLayerAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"shadow-draw-before-layer\") }\n  }\n\n  @Test\n  fun shadowDrawBeforeLayerAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertTrue(light.shadowDrawBeforeLayerAsExpression.toString().contains(\"abc\"))\n    assertEquals(\"abc\", light.shadowDrawBeforeLayer)\n    verify { style.getStyleLightProperty(\"id\", \"shadow-draw-before-layer\") }\n  }\n\n  @Test\n  fun shadowIntensitySet() {\n    val light = directionalLight(\"id\") {\n      shadowIntensity(1.0)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"shadow-intensity=1.0\"))\n  }\n\n  @Test\n  fun shadowIntensitySetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.shadowIntensity(1.0)\n    verify { style.setStyleLightProperty(\"id\", \"shadow-intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun shadowIntensityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(1.0.toString(), light.shadowIntensity!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"shadow-intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun shadowIntensityAsExpressionSet() {\n    val expression = literal(1.0)\n\n    val light = directionalLight(\"id\") {\n      shadowIntensity(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun shadowIntensityAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.shadowIntensity(expression)\n    verify { style.setStyleLightProperty(\"id\", \"shadow-intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun shadowIntensityAsExpressionGet() {\n    val expression = literal(1.0)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.shadowIntensityAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"shadow-intensity\") }\n  }\n\n  @Test\n  fun shadowIntensityAsExpressionGetNull() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.shadowIntensityAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"shadow-intensity\") }\n  }\n\n  @Test\n  fun shadowIntensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(1.0, light.shadowIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, light.shadowIntensity!!, 1E-5)\n    verify { style.getStyleLightProperty(\"id\", \"shadow-intensity\") }\n  }\n\n  @Test\n  fun shadowIntensityTransitionSet() {\n    val light = directionalLight(\"id\") {\n      shadowIntensityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"shadow-intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun shadowIntensityTransitionSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.shadowIntensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLightProperty(\"id\", \"shadow-intensity-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun shadowIntensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = directionalLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(transition.toValue().toString(), light.shadowIntensityTransition!!.toValue().toString())\n    verify { style.getStyleLightProperty(\"id\", \"shadow-intensity-transition\") }\n  }\n\n  @Test\n  fun shadowIntensityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = directionalLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(null, light.shadowIntensityTransition)\n    verify { style.getStyleLightProperty(\"id\", \"shadow-intensity-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun shadowIntensityTransitionGetException() {\n    val light = directionalLight(\"id\") {}\n    light.shadowIntensityTransition\n  }\n\n  @Test\n  fun shadowIntensityTransitionSetDsl() {\n    val light = directionalLight(\"id\") {\n      shadowIntensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"shadow-intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorUseThemeSet() {\n    val light = directionalLight(\"id\") {\n      colorUseTheme(\"default\")\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-use-theme=default\"))\n  }\n\n  @Test\n  fun colorUseThemeSetAfterInitialization() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.colorUseTheme(\"default\")\n    verify { style.setStyleLightProperty(\"id\", \"color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"default\"))\n  }\n\n  @Test\n  fun colorUseThemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(\"default\".toString(), light.colorUseTheme!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorUseThemeAsExpressionSet() {\n    val expression = literal(\"default\")\n\n    val light = directionalLight(\"id\") {\n      colorUseTheme(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.colorUseTheme(expression)\n    verify { style.setStyleLightProperty(\"id\", \"color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGet() {\n    val expression = literal(\"default\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.colorUseThemeAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGetNull() {\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.colorUseThemeAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n    val light = directionalLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertTrue(light.colorUseThemeAsExpression.toString().contains(\"default\"))\n    assertEquals(\"default\", light.colorUseTheme)\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/light/generated/FlatLightTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.light.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.layers.properties.generated.Anchor\nimport com.mapbox.maps.extension.style.light.LightPosition\nimport com.mapbox.maps.extension.style.light.setLights\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.logE\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass FlatLightTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleLightProperty(any(), any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleLightProperty(any(), any(), any()) } returns expected\n    every { style.setStyleLights(any()) } returns expected\n    every { expected.error } returns null\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun anchorSet() {\n    val light = flatLight(\"id\") {\n      anchor(Anchor.MAP)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"anchor=map\"))\n  }\n\n  @Test\n  fun anchorSetAfterInitialization() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.anchor(Anchor.MAP)\n    verify { style.setStyleLightProperty(\"id\", \"anchor\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"map\"))\n  }\n\n  @Test\n  fun anchorGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"map\")\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(Anchor.MAP, light.anchor!!)\n    verify { style.getStyleLightProperty(\"id\", \"anchor\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun anchorAsExpressionSet() {\n    val expression = literal(\"map\")\n\n    val light = flatLight(\"id\") {\n      anchor(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun anchorAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.anchor(expression)\n    verify { style.setStyleLightProperty(\"id\", \"anchor\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun anchorAsExpressionGet() {\n    val expression = literal(\"map\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.anchorAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"anchor\") }\n  }\n\n  @Test\n  fun anchorAsExpressionGetNull() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.anchorAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"anchor\") }\n  }\n\n  @Test\n  fun anchorAsExpressionGetFromLiteral() {\n    val value = \"map\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(value)\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(value.toString(), light.anchorAsExpression?.toString())\n    assertEquals(Anchor.MAP.value, light.anchorAsExpression.toString())\n    assertEquals(Anchor.MAP, light.anchor)\n    verify { style.getStyleLightProperty(\"id\", \"anchor\") }\n  }\n\n  @Test\n  fun colorAsColorIntSet() {\n    val light = flatLight(\"id\") {\n      color(Color.CYAN)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color=[rgba, 0, 255, 255, 1.0]\"))\n  }\n\n  @Test\n  fun colorAsColorIntSetAfterInitialization() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.color(Color.CYAN)\n    verify { style.setStyleLightProperty(\"id\", \"color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun colorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(Color.RED, light.colorAsColorInt!!)\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorSet() {\n    val light = flatLight(\"id\") {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorSetAfterInitialization() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.color(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleLightProperty(\"id\", \"color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), light.color!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorAsExpressionSet() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val light = flatLight(\"id\") {\n      color(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.color(expression)\n    verify { style.setStyleLightProperty(\"id\", \"color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorAsExpressionGet() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.colorAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetNull() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.colorAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.colorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", light.color)\n    assertEquals(Color.BLACK, light.colorAsColorInt)\n    verify { style.getStyleLightProperty(\"id\", \"color\") }\n  }\n\n  @Test\n  fun colorTransitionSet() {\n    val light = flatLight(\"id\") {\n      colorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionSetAfterInitialization() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.colorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLightProperty(\"id\", \"color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = flatLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(transition.toValue().toString(), light.colorTransition!!.toValue().toString())\n    verify { style.getStyleLightProperty(\"id\", \"color-transition\") }\n  }\n\n  @Test\n  fun colorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = flatLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(null, light.colorTransition)\n    verify { style.getStyleLightProperty(\"id\", \"color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun colorTransitionGetException() {\n    val light = flatLight(\"id\") {}\n    light.colorTransition\n  }\n\n  @Test\n  fun colorTransitionSetDsl() {\n    val light = flatLight(\"id\") {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensitySet() {\n    val light = flatLight(\"id\") {\n      intensity(1.0)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity=1.0\"))\n  }\n\n  @Test\n  fun intensitySetAfterInitialization() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.intensity(1.0)\n    verify { style.setStyleLightProperty(\"id\", \"intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun intensityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(1.0.toString(), light.intensity!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun intensityAsExpressionSet() {\n    val expression = literal(1.0)\n\n    val light = flatLight(\"id\") {\n      intensity(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun intensityAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.intensity(expression)\n    verify { style.setStyleLightProperty(\"id\", \"intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun intensityAsExpressionGet() {\n    val expression = literal(1.0)\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.intensityAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n\n  @Test\n  fun intensityAsExpressionGetNull() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.intensityAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n\n  @Test\n  fun intensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(1.0, light.intensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, light.intensity!!, 1E-5)\n    verify { style.getStyleLightProperty(\"id\", \"intensity\") }\n  }\n\n  @Test\n  fun intensityTransitionSet() {\n    val light = flatLight(\"id\") {\n      intensityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionSetAfterInitialization() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.intensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLightProperty(\"id\", \"intensity-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = flatLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(transition.toValue().toString(), light.intensityTransition!!.toValue().toString())\n    verify { style.getStyleLightProperty(\"id\", \"intensity-transition\") }\n  }\n\n  @Test\n  fun intensityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = flatLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(null, light.intensityTransition)\n    verify { style.getStyleLightProperty(\"id\", \"intensity-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun intensityTransitionGetException() {\n    val light = flatLight(\"id\") {}\n    light.intensityTransition\n  }\n\n  @Test\n  fun intensityTransitionSetDsl() {\n    val light = flatLight(\"id\") {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun positionSetDsl() {\n    val light = flatLight(\"id\") {\n      position(1.0, 2.0, 3.0)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"position=[1.0, 2.0, 3.0]\"))\n  }\n\n  @Test\n  fun positionSet() {\n    val light = flatLight(\"id\") {\n      position(LightPosition(0.0, 1.0, 2.0))\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"position=[0.0, 1.0, 2.0]\"))\n  }\n\n  @Test\n  fun positionSetAfterInitialization() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.position(LightPosition(0.0, 1.0, 2.0))\n    verify { style.setStyleLightProperty(\"id\", \"position\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"[0.0, 1.0, 2.0]\"))\n  }\n\n  @Test\n  fun positionGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(LightPosition(0.0, 1.0, 2.0))\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(LightPosition(0.0, 1.0, 2.0).toString(), light.position!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"position\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun positionAsExpressionSet() {\n    val expression = literal(listOf(0.0, 1.0, 2.0))\n\n    val light = flatLight(\"id\") {\n      position(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun positionAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.position(expression)\n    verify { style.setStyleLightProperty(\"id\", \"position\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun positionAsExpressionGet() {\n    val expression = literal(listOf(0.0, 1.0, 2.0))\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.positionAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"position\") }\n  }\n\n  @Test\n  fun positionAsExpressionGetNull() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.positionAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"position\") }\n  }\n\n  @Test\n  fun positionAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(LightPosition(0.0, 1.0, 2.0))\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(\"[literal, [0.0, 1.0, 2.0]]\", light.positionAsExpression.toString())\n    assertEquals(LightPosition(0.0, 1.0, 2.0), light.position)\n    verify { style.getStyleLightProperty(\"id\", \"position\") }\n  }\n\n  @Test\n  fun positionTransitionSet() {\n    val light = flatLight(\"id\") {\n      positionTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"position-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun positionTransitionSetAfterInitialization() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.positionTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleLightProperty(\"id\", \"position-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun positionTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = flatLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(transition.toValue().toString(), light.positionTransition!!.toValue().toString())\n    verify { style.getStyleLightProperty(\"id\", \"position-transition\") }\n  }\n\n  @Test\n  fun positionTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val light = flatLight(\"id\") {}\n    style.setLights(listOf(light))\n    assertEquals(null, light.positionTransition)\n    verify { style.getStyleLightProperty(\"id\", \"position-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun positionTransitionGetException() {\n    val light = flatLight(\"id\") {}\n    light.positionTransition\n  }\n\n  @Test\n  fun positionTransitionSetDsl() {\n    val light = flatLight(\"id\") {\n      positionTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"position-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorUseThemeSet() {\n    val light = flatLight(\"id\") {\n      colorUseTheme(\"default\")\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-use-theme=default\"))\n  }\n\n  @Test\n  fun colorUseThemeSetAfterInitialization() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.colorUseTheme(\"default\")\n    verify { style.setStyleLightProperty(\"id\", \"color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"default\"))\n  }\n\n  @Test\n  fun colorUseThemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(\"default\".toString(), light.colorUseTheme!!.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorUseThemeAsExpressionSet() {\n    val expression = literal(\"default\")\n\n    val light = flatLight(\"id\") {\n      colorUseTheme(expression)\n    }\n    style.setLights(listOf(light))\n    verify { style.setStyleLights(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionSetAfterInitialization() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    light.colorUseTheme(expression)\n    verify { style.setStyleLightProperty(\"id\", \"color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(expression.toString()))\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGet() {\n    val expression = literal(\"default\")\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(expression.toString(), light.colorUseThemeAsExpression?.toString())\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGetNull() {\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertEquals(null, light.colorUseThemeAsExpression)\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n    val light = flatLight(\"id\") { }\n    style.setLights(listOf(light))\n    assertTrue(light.colorUseThemeAsExpression.toString().contains(\"default\"))\n    assertEquals(\"default\", light.colorUseTheme)\n    verify { style.getStyleLightProperty(\"id\", \"color-use-theme\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/precipitations/generated/RainTest.kt",
    "content": "// This file is generated.\npackage com.mapbox.maps.extension.style.precipitations.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\n@OptIn(MapboxExperimental::class)\nclass RainTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleRainProperty(any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleRainProperty(any(), any()) } returns expected\n    every { style.setStyleRain(any()) } returns expected\n    every { expected.error } returns null\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun centerThinningSet() {\n    val rain = rain {\n      centerThinning(1.0)\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"center-thinning=1.0\"))\n  }\n\n  @Test\n  fun centerThinningSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.centerThinning(1.0)\n    verify { style.setStyleRainProperty(\"center-thinning\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun centerThinningGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0.toString(), rain.centerThinning!!.toString())\n    verify { style.getStyleRainProperty(\"center-thinning\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun centerThinningAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.centerThinningAsExpression)\n    verify { style.getStyleRainProperty(\"center-thinning\") }\n  }\n\n  @Test\n  fun centerThinningAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0, rain.centerThinningAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, rain.centerThinning!!, 1E-5)\n    verify { style.getStyleRainProperty(\"center-thinning\") }\n  }\n\n  @Test\n  fun centerThinningTransitionSet() {\n    val rain = rain {\n      centerThinningTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"center-thinning-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun centerThinningTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.centerThinningTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"center-thinning-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun centerThinningTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.centerThinningTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"center-thinning-transition\") }\n  }\n\n  @Test\n  fun centerThinningTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.centerThinningTransition)\n    verify { style.getStyleRainProperty(\"center-thinning-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun centerThinningTransitionGetException() {\n    val rain = rain {}\n    rain.centerThinningTransition\n  }\n\n  @Test\n  fun centerThinningTransitionSetDsl() {\n    val rain = rain {\n      centerThinningTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"center-thinning-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun colorAsColorIntSet() {\n    val rain = rain {\n      color(Color.CYAN)\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertEquals(\"{color=[rgba, 0, 255, 255, 1.0]}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun colorAsColorIntSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.color(Color.CYAN)\n    verify { style.setStyleRainProperty(\"color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun colorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(Color.RED, rain.colorAsColorInt!!)\n    verify { style.getStyleRainProperty(\"color\") }\n  }\n\n  @Test\n  fun colorSet() {\n    val rain = rain {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.color(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleRainProperty(\"color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), rain.color!!.toString())\n    verify { style.getStyleRainProperty(\"color\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.colorAsExpression)\n    verify { style.getStyleRainProperty(\"color\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val rain = rain {\n      color(expression)\n    }\n    rain.bindTo(style)\n    assertEquals(expression.toString(), rain.colorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", rain.color)\n    assertEquals(Color.BLACK, rain.colorAsColorInt)\n    verify { style.getStyleRainProperty(\"color\") }\n  }\n\n  @Test\n  fun colorTransitionSet() {\n    val rain = rain {\n      colorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.colorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.colorTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"color-transition\") }\n  }\n\n  @Test\n  fun colorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.colorTransition)\n    verify { style.getStyleRainProperty(\"color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun colorTransitionGetException() {\n    val rain = rain {}\n    rain.colorTransition\n  }\n\n  @Test\n  fun colorTransitionSetDsl() {\n    val rain = rain {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun densitySet() {\n    val rain = rain {\n      density(1.0)\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"density=1.0\"))\n  }\n\n  @Test\n  fun densitySetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.density(1.0)\n    verify { style.setStyleRainProperty(\"density\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun densityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0.toString(), rain.density!!.toString())\n    verify { style.getStyleRainProperty(\"density\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun densityAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.densityAsExpression)\n    verify { style.getStyleRainProperty(\"density\") }\n  }\n\n  @Test\n  fun densityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0, rain.densityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, rain.density!!, 1E-5)\n    verify { style.getStyleRainProperty(\"density\") }\n  }\n\n  @Test\n  fun densityTransitionSet() {\n    val rain = rain {\n      densityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"density-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun densityTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.densityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"density-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun densityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.densityTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"density-transition\") }\n  }\n\n  @Test\n  fun densityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.densityTransition)\n    verify { style.getStyleRainProperty(\"density-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun densityTransitionGetException() {\n    val rain = rain {}\n    rain.densityTransition\n  }\n\n  @Test\n  fun densityTransitionSetDsl() {\n    val rain = rain {\n      densityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"density-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun directionSet() {\n    val rain = rain {\n      direction(listOf(0.0, 1.0))\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"direction=[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun directionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.direction(listOf(0.0, 1.0))\n    verify { style.setStyleRainProperty(\"direction\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun directionGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(listOf(0.0, 1.0).toString(), rain.direction!!.toString())\n    verify { style.getStyleRainProperty(\"direction\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun directionAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.directionAsExpression)\n    verify { style.getStyleRainProperty(\"direction\") }\n  }\n\n  @Test\n  fun directionAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", rain.directionAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), rain.direction)\n    verify { style.getStyleRainProperty(\"direction\") }\n  }\n\n  @Test\n  fun directionTransitionSet() {\n    val rain = rain {\n      directionTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"direction-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun directionTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.directionTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"direction-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun directionTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.directionTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"direction-transition\") }\n  }\n\n  @Test\n  fun directionTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.directionTransition)\n    verify { style.getStyleRainProperty(\"direction-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun directionTransitionGetException() {\n    val rain = rain {}\n    rain.directionTransition\n  }\n\n  @Test\n  fun directionTransitionSetDsl() {\n    val rain = rain {\n      directionTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"direction-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun distortionStrengthSet() {\n    val rain = rain {\n      distortionStrength(1.0)\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"distortion-strength=1.0\"))\n  }\n\n  @Test\n  fun distortionStrengthSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.distortionStrength(1.0)\n    verify { style.setStyleRainProperty(\"distortion-strength\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun distortionStrengthGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0.toString(), rain.distortionStrength!!.toString())\n    verify { style.getStyleRainProperty(\"distortion-strength\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun distortionStrengthAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.distortionStrengthAsExpression)\n    verify { style.getStyleRainProperty(\"distortion-strength\") }\n  }\n\n  @Test\n  fun distortionStrengthAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0, rain.distortionStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, rain.distortionStrength!!, 1E-5)\n    verify { style.getStyleRainProperty(\"distortion-strength\") }\n  }\n\n  @Test\n  fun distortionStrengthTransitionSet() {\n    val rain = rain {\n      distortionStrengthTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"distortion-strength-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun distortionStrengthTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.distortionStrengthTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"distortion-strength-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun distortionStrengthTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.distortionStrengthTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"distortion-strength-transition\") }\n  }\n\n  @Test\n  fun distortionStrengthTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.distortionStrengthTransition)\n    verify { style.getStyleRainProperty(\"distortion-strength-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun distortionStrengthTransitionGetException() {\n    val rain = rain {}\n    rain.distortionStrengthTransition\n  }\n\n  @Test\n  fun distortionStrengthTransitionSetDsl() {\n    val rain = rain {\n      distortionStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"distortion-strength-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun dropletSizeSet() {\n    val rain = rain {\n      dropletSize(listOf(0.0, 1.0))\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"droplet-size=[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun dropletSizeSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.dropletSize(listOf(0.0, 1.0))\n    verify { style.setStyleRainProperty(\"droplet-size\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun dropletSizeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(listOf(0.0, 1.0).toString(), rain.dropletSize!!.toString())\n    verify { style.getStyleRainProperty(\"droplet-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun dropletSizeAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.dropletSizeAsExpression)\n    verify { style.getStyleRainProperty(\"droplet-size\") }\n  }\n\n  @Test\n  fun dropletSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", rain.dropletSizeAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), rain.dropletSize)\n    verify { style.getStyleRainProperty(\"droplet-size\") }\n  }\n\n  @Test\n  fun dropletSizeTransitionSet() {\n    val rain = rain {\n      dropletSizeTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"droplet-size-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun dropletSizeTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.dropletSizeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"droplet-size-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun dropletSizeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.dropletSizeTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"droplet-size-transition\") }\n  }\n\n  @Test\n  fun dropletSizeTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.dropletSizeTransition)\n    verify { style.getStyleRainProperty(\"droplet-size-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun dropletSizeTransitionGetException() {\n    val rain = rain {}\n    rain.dropletSizeTransition\n  }\n\n  @Test\n  fun dropletSizeTransitionSetDsl() {\n    val rain = rain {\n      dropletSizeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"droplet-size-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun intensitySet() {\n    val rain = rain {\n      intensity(1.0)\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity=1.0\"))\n  }\n\n  @Test\n  fun intensitySetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.intensity(1.0)\n    verify { style.setStyleRainProperty(\"intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun intensityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0.toString(), rain.intensity!!.toString())\n    verify { style.getStyleRainProperty(\"intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun intensityAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.intensityAsExpression)\n    verify { style.getStyleRainProperty(\"intensity\") }\n  }\n\n  @Test\n  fun intensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0, rain.intensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, rain.intensity!!, 1E-5)\n    verify { style.getStyleRainProperty(\"intensity\") }\n  }\n\n  @Test\n  fun intensityTransitionSet() {\n    val rain = rain {\n      intensityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.intensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"intensity-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.intensityTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"intensity-transition\") }\n  }\n\n  @Test\n  fun intensityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.intensityTransition)\n    verify { style.getStyleRainProperty(\"intensity-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun intensityTransitionGetException() {\n    val rain = rain {}\n    rain.intensityTransition\n  }\n\n  @Test\n  fun intensityTransitionSetDsl() {\n    val rain = rain {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun opacitySet() {\n    val rain = rain {\n      opacity(1.0)\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"opacity=1.0\"))\n  }\n\n  @Test\n  fun opacitySetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.opacity(1.0)\n    verify { style.setStyleRainProperty(\"opacity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun opacityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0.toString(), rain.opacity!!.toString())\n    verify { style.getStyleRainProperty(\"opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun opacityAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.opacityAsExpression)\n    verify { style.getStyleRainProperty(\"opacity\") }\n  }\n\n  @Test\n  fun opacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0, rain.opacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, rain.opacity!!, 1E-5)\n    verify { style.getStyleRainProperty(\"opacity\") }\n  }\n\n  @Test\n  fun opacityTransitionSet() {\n    val rain = rain {\n      opacityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"opacity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun opacityTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.opacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"opacity-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun opacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.opacityTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"opacity-transition\") }\n  }\n\n  @Test\n  fun opacityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.opacityTransition)\n    verify { style.getStyleRainProperty(\"opacity-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun opacityTransitionGetException() {\n    val rain = rain {}\n    rain.opacityTransition\n  }\n\n  @Test\n  fun opacityTransitionSetDsl() {\n    val rain = rain {\n      opacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"opacity-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun vignetteSet() {\n    val rain = rain {\n      vignette(1.0)\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette=1.0\"))\n  }\n\n  @Test\n  fun vignetteSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.vignette(1.0)\n    verify { style.setStyleRainProperty(\"vignette\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun vignetteGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0.toString(), rain.vignette!!.toString())\n    verify { style.getStyleRainProperty(\"vignette\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun vignetteAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.vignetteAsExpression)\n    verify { style.getStyleRainProperty(\"vignette\") }\n  }\n\n  @Test\n  fun vignetteAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(1.0, rain.vignetteAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, rain.vignette!!, 1E-5)\n    verify { style.getStyleRainProperty(\"vignette\") }\n  }\n\n  @Test\n  fun vignetteTransitionSet() {\n    val rain = rain {\n      vignetteTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun vignetteTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.vignetteTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"vignette-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun vignetteTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.vignetteTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"vignette-transition\") }\n  }\n\n  @Test\n  fun vignetteTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.vignetteTransition)\n    verify { style.getStyleRainProperty(\"vignette-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun vignetteTransitionGetException() {\n    val rain = rain {}\n    rain.vignetteTransition\n  }\n\n  @Test\n  fun vignetteTransitionSetDsl() {\n    val rain = rain {\n      vignetteTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun vignetteColorAsColorIntSet() {\n    val rain = rain {\n      vignetteColor(Color.CYAN)\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertEquals(\"{vignette-color=[rgba, 0, 255, 255, 1.0]}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun vignetteColorAsColorIntSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.vignetteColor(Color.CYAN)\n    verify { style.setStyleRainProperty(\"vignette-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun vignetteColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(Color.RED, rain.vignetteColorAsColorInt!!)\n    verify { style.getStyleRainProperty(\"vignette-color\") }\n  }\n\n  @Test\n  fun vignetteColorSet() {\n    val rain = rain {\n      vignetteColor(\"rgba(0, 0, 0, 1)\")\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun vignetteColorSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.vignetteColor(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleRainProperty(\"vignette-color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun vignetteColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), rain.vignetteColor!!.toString())\n    verify { style.getStyleRainProperty(\"vignette-color\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun vignetteColorAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.vignetteColorAsExpression)\n    verify { style.getStyleRainProperty(\"vignette-color\") }\n  }\n\n  @Test\n  fun vignetteColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val rain = rain {\n      vignetteColor(expression)\n    }\n    rain.bindTo(style)\n    assertEquals(expression.toString(), rain.vignetteColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", rain.vignetteColor)\n    assertEquals(Color.BLACK, rain.vignetteColorAsColorInt)\n    verify { style.getStyleRainProperty(\"vignette-color\") }\n  }\n\n  @Test\n  fun vignetteColorTransitionSet() {\n    val rain = rain {\n      vignetteColorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun vignetteColorTransitionSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.vignetteColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleRainProperty(\"vignette-color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun vignetteColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(transition.toValue().toString(), rain.vignetteColorTransition!!.toValue().toString())\n    verify { style.getStyleRainProperty(\"vignette-color-transition\") }\n  }\n\n  @Test\n  fun vignetteColorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val rain = rain {}\n    rain.bindTo(style)\n    assertEquals(null, rain.vignetteColorTransition)\n    verify { style.getStyleRainProperty(\"vignette-color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun vignetteColorTransitionGetException() {\n    val rain = rain {}\n    rain.vignetteColorTransition\n  }\n\n  @Test\n  fun vignetteColorTransitionSetDsl() {\n    val rain = rain {\n      vignetteColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-color-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun colorUseThemeSet() {\n    val rain = rain {\n      colorUseTheme(\"default\")\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-use-theme=default\"))\n  }\n\n  @Test\n  fun colorUseThemeSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.colorUseTheme(\"default\")\n    verify { style.setStyleRainProperty(\"color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"default\"))\n  }\n\n  @Test\n  fun colorUseThemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(\"default\".toString(), rain.colorUseTheme!!.toString())\n    verify { style.getStyleRainProperty(\"color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorUseThemeAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.colorUseThemeAsExpression)\n    verify { style.getStyleRainProperty(\"color-use-theme\") }\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(\"default\", rain.colorUseThemeAsExpression.toString())\n    assertEquals(\"default\", rain.colorUseTheme)\n    verify { style.getStyleRainProperty(\"color-use-theme\") }\n  }\n  @Test\n  fun vignetteColorUseThemeSet() {\n    val rain = rain {\n      vignetteColorUseTheme(\"default\")\n    }\n    rain.bindTo(style)\n    verify { style.setStyleRain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-color-use-theme=default\"))\n  }\n\n  @Test\n  fun vignetteColorUseThemeSetAfterInitialization() {\n    val rain = rain { }\n    rain.bindTo(style)\n    rain.vignetteColorUseTheme(\"default\")\n    verify { style.setStyleRainProperty(\"vignette-color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"default\"))\n  }\n\n  @Test\n  fun vignetteColorUseThemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(\"default\".toString(), rain.vignetteColorUseTheme!!.toString())\n    verify { style.getStyleRainProperty(\"vignette-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun vignetteColorUseThemeAsExpressionGetNull() {\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(null, rain.vignetteColorUseThemeAsExpression)\n    verify { style.getStyleRainProperty(\"vignette-color-use-theme\") }\n  }\n\n  @Test\n  fun vignetteColorUseThemeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n    val rain = rain { }\n    rain.bindTo(style)\n    assertEquals(\"default\", rain.vignetteColorUseThemeAsExpression.toString())\n    assertEquals(\"default\", rain.vignetteColorUseTheme)\n    verify { style.getStyleRainProperty(\"vignette-color-use-theme\") }\n  }\n\n  @Test\n  fun getRainTest() {\n    assertNotNull(style.getRain())\n    verify(exactly = 0) { style.setStyleRain(any()) }\n  }\n\n  @Test\n  fun removeRainTest() {\n    style.removeRain()\n    verify { style.setStyleRain(Value.nullValue()) }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/precipitations/generated/SnowTest.kt",
    "content": "// This file is generated.\npackage com.mapbox.maps.extension.style.precipitations.generated\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\n@OptIn(MapboxExperimental::class)\nclass SnowTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleSnowProperty(any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleSnowProperty(any(), any()) } returns expected\n    every { style.setStyleSnow(any()) } returns expected\n    every { expected.error } returns null\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun centerThinningSet() {\n    val snow = snow {\n      centerThinning(1.0)\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"center-thinning=1.0\"))\n  }\n\n  @Test\n  fun centerThinningSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.centerThinning(1.0)\n    verify { style.setStyleSnowProperty(\"center-thinning\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun centerThinningGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0.toString(), snow.centerThinning!!.toString())\n    verify { style.getStyleSnowProperty(\"center-thinning\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun centerThinningAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.centerThinningAsExpression)\n    verify { style.getStyleSnowProperty(\"center-thinning\") }\n  }\n\n  @Test\n  fun centerThinningAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0, snow.centerThinningAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, snow.centerThinning!!, 1E-5)\n    verify { style.getStyleSnowProperty(\"center-thinning\") }\n  }\n\n  @Test\n  fun centerThinningTransitionSet() {\n    val snow = snow {\n      centerThinningTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"center-thinning-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun centerThinningTransitionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.centerThinningTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleSnowProperty(\"center-thinning-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun centerThinningTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(transition.toValue().toString(), snow.centerThinningTransition!!.toValue().toString())\n    verify { style.getStyleSnowProperty(\"center-thinning-transition\") }\n  }\n\n  @Test\n  fun centerThinningTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(null, snow.centerThinningTransition)\n    verify { style.getStyleSnowProperty(\"center-thinning-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun centerThinningTransitionGetException() {\n    val snow = snow {}\n    snow.centerThinningTransition\n  }\n\n  @Test\n  fun centerThinningTransitionSetDsl() {\n    val snow = snow {\n      centerThinningTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"center-thinning-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun colorAsColorIntSet() {\n    val snow = snow {\n      color(Color.CYAN)\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertEquals(\"{color=[rgba, 0, 255, 255, 1.0]}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun colorAsColorIntSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.color(Color.CYAN)\n    verify { style.setStyleSnowProperty(\"color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun colorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(Color.RED, snow.colorAsColorInt!!)\n    verify { style.getStyleSnowProperty(\"color\") }\n  }\n\n  @Test\n  fun colorSet() {\n    val snow = snow {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.color(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleSnowProperty(\"color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun colorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), snow.color!!.toString())\n    verify { style.getStyleSnowProperty(\"color\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.colorAsExpression)\n    verify { style.getStyleSnowProperty(\"color\") }\n  }\n\n  @Test\n  fun colorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val snow = snow {\n      color(expression)\n    }\n    snow.bindTo(style)\n    assertEquals(expression.toString(), snow.colorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", snow.color)\n    assertEquals(Color.BLACK, snow.colorAsColorInt)\n    verify { style.getStyleSnowProperty(\"color\") }\n  }\n\n  @Test\n  fun colorTransitionSet() {\n    val snow = snow {\n      colorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.colorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleSnowProperty(\"color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun colorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(transition.toValue().toString(), snow.colorTransition!!.toValue().toString())\n    verify { style.getStyleSnowProperty(\"color-transition\") }\n  }\n\n  @Test\n  fun colorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(null, snow.colorTransition)\n    verify { style.getStyleSnowProperty(\"color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun colorTransitionGetException() {\n    val snow = snow {}\n    snow.colorTransition\n  }\n\n  @Test\n  fun colorTransitionSetDsl() {\n    val snow = snow {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun densitySet() {\n    val snow = snow {\n      density(1.0)\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"density=1.0\"))\n  }\n\n  @Test\n  fun densitySetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.density(1.0)\n    verify { style.setStyleSnowProperty(\"density\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun densityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0.toString(), snow.density!!.toString())\n    verify { style.getStyleSnowProperty(\"density\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun densityAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.densityAsExpression)\n    verify { style.getStyleSnowProperty(\"density\") }\n  }\n\n  @Test\n  fun densityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0, snow.densityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, snow.density!!, 1E-5)\n    verify { style.getStyleSnowProperty(\"density\") }\n  }\n\n  @Test\n  fun densityTransitionSet() {\n    val snow = snow {\n      densityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"density-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun densityTransitionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.densityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleSnowProperty(\"density-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun densityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(transition.toValue().toString(), snow.densityTransition!!.toValue().toString())\n    verify { style.getStyleSnowProperty(\"density-transition\") }\n  }\n\n  @Test\n  fun densityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(null, snow.densityTransition)\n    verify { style.getStyleSnowProperty(\"density-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun densityTransitionGetException() {\n    val snow = snow {}\n    snow.densityTransition\n  }\n\n  @Test\n  fun densityTransitionSetDsl() {\n    val snow = snow {\n      densityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"density-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun directionSet() {\n    val snow = snow {\n      direction(listOf(0.0, 1.0))\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"direction=[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun directionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.direction(listOf(0.0, 1.0))\n    verify { style.setStyleSnowProperty(\"direction\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"[0.0, 1.0]\"))\n  }\n\n  @Test\n  fun directionGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(listOf(0.0, 1.0).toString(), snow.direction!!.toString())\n    verify { style.getStyleSnowProperty(\"direction\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun directionAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.directionAsExpression)\n    verify { style.getStyleSnowProperty(\"direction\") }\n  }\n\n  @Test\n  fun directionAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0))\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(\"[literal, [0.0, 1.0]]\", snow.directionAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), snow.direction)\n    verify { style.getStyleSnowProperty(\"direction\") }\n  }\n\n  @Test\n  fun directionTransitionSet() {\n    val snow = snow {\n      directionTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"direction-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun directionTransitionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.directionTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleSnowProperty(\"direction-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun directionTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(transition.toValue().toString(), snow.directionTransition!!.toValue().toString())\n    verify { style.getStyleSnowProperty(\"direction-transition\") }\n  }\n\n  @Test\n  fun directionTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(null, snow.directionTransition)\n    verify { style.getStyleSnowProperty(\"direction-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun directionTransitionGetException() {\n    val snow = snow {}\n    snow.directionTransition\n  }\n\n  @Test\n  fun directionTransitionSetDsl() {\n    val snow = snow {\n      directionTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"direction-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun flakeSizeSet() {\n    val snow = snow {\n      flakeSize(1.0)\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"flake-size=1.0\"))\n  }\n\n  @Test\n  fun flakeSizeSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.flakeSize(1.0)\n    verify { style.setStyleSnowProperty(\"flake-size\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun flakeSizeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0.toString(), snow.flakeSize!!.toString())\n    verify { style.getStyleSnowProperty(\"flake-size\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun flakeSizeAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.flakeSizeAsExpression)\n    verify { style.getStyleSnowProperty(\"flake-size\") }\n  }\n\n  @Test\n  fun flakeSizeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0, snow.flakeSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, snow.flakeSize!!, 1E-5)\n    verify { style.getStyleSnowProperty(\"flake-size\") }\n  }\n\n  @Test\n  fun flakeSizeTransitionSet() {\n    val snow = snow {\n      flakeSizeTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"flake-size-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun flakeSizeTransitionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.flakeSizeTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleSnowProperty(\"flake-size-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun flakeSizeTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(transition.toValue().toString(), snow.flakeSizeTransition!!.toValue().toString())\n    verify { style.getStyleSnowProperty(\"flake-size-transition\") }\n  }\n\n  @Test\n  fun flakeSizeTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(null, snow.flakeSizeTransition)\n    verify { style.getStyleSnowProperty(\"flake-size-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun flakeSizeTransitionGetException() {\n    val snow = snow {}\n    snow.flakeSizeTransition\n  }\n\n  @Test\n  fun flakeSizeTransitionSetDsl() {\n    val snow = snow {\n      flakeSizeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"flake-size-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun intensitySet() {\n    val snow = snow {\n      intensity(1.0)\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity=1.0\"))\n  }\n\n  @Test\n  fun intensitySetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.intensity(1.0)\n    verify { style.setStyleSnowProperty(\"intensity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun intensityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0.toString(), snow.intensity!!.toString())\n    verify { style.getStyleSnowProperty(\"intensity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun intensityAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.intensityAsExpression)\n    verify { style.getStyleSnowProperty(\"intensity\") }\n  }\n\n  @Test\n  fun intensityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0, snow.intensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, snow.intensity!!, 1E-5)\n    verify { style.getStyleSnowProperty(\"intensity\") }\n  }\n\n  @Test\n  fun intensityTransitionSet() {\n    val snow = snow {\n      intensityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.intensityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleSnowProperty(\"intensity-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun intensityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(transition.toValue().toString(), snow.intensityTransition!!.toValue().toString())\n    verify { style.getStyleSnowProperty(\"intensity-transition\") }\n  }\n\n  @Test\n  fun intensityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(null, snow.intensityTransition)\n    verify { style.getStyleSnowProperty(\"intensity-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun intensityTransitionGetException() {\n    val snow = snow {}\n    snow.intensityTransition\n  }\n\n  @Test\n  fun intensityTransitionSetDsl() {\n    val snow = snow {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"intensity-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun opacitySet() {\n    val snow = snow {\n      opacity(1.0)\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"opacity=1.0\"))\n  }\n\n  @Test\n  fun opacitySetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.opacity(1.0)\n    verify { style.setStyleSnowProperty(\"opacity\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun opacityGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0.toString(), snow.opacity!!.toString())\n    verify { style.getStyleSnowProperty(\"opacity\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun opacityAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.opacityAsExpression)\n    verify { style.getStyleSnowProperty(\"opacity\") }\n  }\n\n  @Test\n  fun opacityAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0, snow.opacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, snow.opacity!!, 1E-5)\n    verify { style.getStyleSnowProperty(\"opacity\") }\n  }\n\n  @Test\n  fun opacityTransitionSet() {\n    val snow = snow {\n      opacityTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"opacity-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun opacityTransitionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.opacityTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleSnowProperty(\"opacity-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun opacityTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(transition.toValue().toString(), snow.opacityTransition!!.toValue().toString())\n    verify { style.getStyleSnowProperty(\"opacity-transition\") }\n  }\n\n  @Test\n  fun opacityTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(null, snow.opacityTransition)\n    verify { style.getStyleSnowProperty(\"opacity-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun opacityTransitionGetException() {\n    val snow = snow {}\n    snow.opacityTransition\n  }\n\n  @Test\n  fun opacityTransitionSetDsl() {\n    val snow = snow {\n      opacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"opacity-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun vignetteSet() {\n    val snow = snow {\n      vignette(1.0)\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette=1.0\"))\n  }\n\n  @Test\n  fun vignetteSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.vignette(1.0)\n    verify { style.setStyleSnowProperty(\"vignette\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun vignetteGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0.toString(), snow.vignette!!.toString())\n    verify { style.getStyleSnowProperty(\"vignette\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun vignetteAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.vignetteAsExpression)\n    verify { style.getStyleSnowProperty(\"vignette\") }\n  }\n\n  @Test\n  fun vignetteAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(1.0, snow.vignetteAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, snow.vignette!!, 1E-5)\n    verify { style.getStyleSnowProperty(\"vignette\") }\n  }\n\n  @Test\n  fun vignetteTransitionSet() {\n    val snow = snow {\n      vignetteTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun vignetteTransitionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.vignetteTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleSnowProperty(\"vignette-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun vignetteTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(transition.toValue().toString(), snow.vignetteTransition!!.toValue().toString())\n    verify { style.getStyleSnowProperty(\"vignette-transition\") }\n  }\n\n  @Test\n  fun vignetteTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(null, snow.vignetteTransition)\n    verify { style.getStyleSnowProperty(\"vignette-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun vignetteTransitionGetException() {\n    val snow = snow {}\n    snow.vignetteTransition\n  }\n\n  @Test\n  fun vignetteTransitionSetDsl() {\n    val snow = snow {\n      vignetteTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun vignetteColorAsColorIntSet() {\n    val snow = snow {\n      vignetteColor(Color.CYAN)\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertEquals(\"{vignette-color=[rgba, 0, 255, 255, 1.0]}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun vignetteColorAsColorIntSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.vignetteColor(Color.CYAN)\n    verify { style.setStyleSnowProperty(\"vignette-color\", capture(valueSlot)) }\n    assertEquals(\"[rgba, 0, 255, 255, 1.0]\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun vignetteColorAsColorIntGet() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(Color.RED, snow.vignetteColorAsColorInt!!)\n    verify { style.getStyleSnowProperty(\"vignette-color\") }\n  }\n\n  @Test\n  fun vignetteColorSet() {\n    val snow = snow {\n      vignetteColor(\"rgba(0, 0, 0, 1)\")\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-color=rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun vignetteColorSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.vignetteColor(\"rgba(0, 0, 0, 1)\")\n    verify { style.setStyleSnowProperty(\"vignette-color\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"rgba(0, 0, 0, 1)\"))\n  }\n\n  @Test\n  fun vignetteColorGet() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(\"rgba(0, 0, 0, 1)\".toString(), snow.vignetteColor!!.toString())\n    verify { style.getStyleSnowProperty(\"vignette-color\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun vignetteColorAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.vignetteColorAsExpression)\n    verify { style.getStyleSnowProperty(\"vignette-color\") }\n  }\n\n  @Test\n  fun vignetteColorAsExpressionGetFromLiteral() {\n    val expression = rgba {\n      literal(0)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    every { styleProperty.kind } returns StylePropertyValueKind.EXPRESSION\n    every { styleProperty.value } returns expression\n\n    val snow = snow {\n      vignetteColor(expression)\n    }\n    snow.bindTo(style)\n    assertEquals(expression.toString(), snow.vignetteColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", snow.vignetteColor)\n    assertEquals(Color.BLACK, snow.vignetteColorAsColorInt)\n    verify { style.getStyleSnowProperty(\"vignette-color\") }\n  }\n\n  @Test\n  fun vignetteColorTransitionSet() {\n    val snow = snow {\n      vignetteColorTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-color-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun vignetteColorTransitionSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.vignetteColorTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleSnowProperty(\"vignette-color-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun vignetteColorTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(transition.toValue().toString(), snow.vignetteColorTransition!!.toValue().toString())\n    verify { style.getStyleSnowProperty(\"vignette-color-transition\") }\n  }\n\n  @Test\n  fun vignetteColorTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val snow = snow {}\n    snow.bindTo(style)\n    assertEquals(null, snow.vignetteColorTransition)\n    verify { style.getStyleSnowProperty(\"vignette-color-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun vignetteColorTransitionGetException() {\n    val snow = snow {}\n    snow.vignetteColorTransition\n  }\n\n  @Test\n  fun vignetteColorTransitionSetDsl() {\n    val snow = snow {\n      vignetteColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-color-transition={duration=100, delay=200}\"))\n  }\n  @Test\n  fun colorUseThemeSet() {\n    val snow = snow {\n      colorUseTheme(\"default\")\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"color-use-theme=default\"))\n  }\n\n  @Test\n  fun colorUseThemeSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.colorUseTheme(\"default\")\n    verify { style.setStyleSnowProperty(\"color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"default\"))\n  }\n\n  @Test\n  fun colorUseThemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(\"default\".toString(), snow.colorUseTheme!!.toString())\n    verify { style.getStyleSnowProperty(\"color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun colorUseThemeAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.colorUseThemeAsExpression)\n    verify { style.getStyleSnowProperty(\"color-use-theme\") }\n  }\n\n  @Test\n  fun colorUseThemeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(\"default\", snow.colorUseThemeAsExpression.toString())\n    assertEquals(\"default\", snow.colorUseTheme)\n    verify { style.getStyleSnowProperty(\"color-use-theme\") }\n  }\n  @Test\n  fun vignetteColorUseThemeSet() {\n    val snow = snow {\n      vignetteColorUseTheme(\"default\")\n    }\n    snow.bindTo(style)\n    verify { style.setStyleSnow(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"vignette-color-use-theme=default\"))\n  }\n\n  @Test\n  fun vignetteColorUseThemeSetAfterInitialization() {\n    val snow = snow { }\n    snow.bindTo(style)\n    snow.vignetteColorUseTheme(\"default\")\n    verify { style.setStyleSnowProperty(\"vignette-color-use-theme\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"default\"))\n  }\n\n  @Test\n  fun vignetteColorUseThemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(\"default\".toString(), snow.vignetteColorUseTheme!!.toString())\n    verify { style.getStyleSnowProperty(\"vignette-color-use-theme\") }\n  }\n  // Expression Tests\n\n  @Test\n  fun vignetteColorUseThemeAsExpressionGetNull() {\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(null, snow.vignetteColorUseThemeAsExpression)\n    verify { style.getStyleSnowProperty(\"vignette-color-use-theme\") }\n  }\n\n  @Test\n  fun vignetteColorUseThemeAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"default\")\n    val snow = snow { }\n    snow.bindTo(style)\n    assertEquals(\"default\", snow.vignetteColorUseThemeAsExpression.toString())\n    assertEquals(\"default\", snow.vignetteColorUseTheme)\n    verify { style.getStyleSnowProperty(\"vignette-color-use-theme\") }\n  }\n\n  @Test\n  fun getSnowTest() {\n    assertNotNull(style.getSnow())\n    verify(exactly = 0) { style.setStyleSnow(any()) }\n  }\n\n  @Test\n  fun removeSnowTest() {\n    style.removeSnow()\n    verify { style.setStyleSnow(Value.nullValue()) }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/CustomGeometrySourceTest.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.slot\nimport io.mockk.verify\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\n\nclass CustomGeometrySourceTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n\n  private val tileFunctionCallback: TileFunctionCallback = mockk()\n  private val tileOptions: TileOptions = mockk()\n  private val styleProperty = mockk<StylePropertyValue>()\n\n  @Before\n  fun prepareTest() {\n    every { style.addStyleCustomGeometrySource(any(), any()) } returns expected\n    every { style.setStyleCustomGeometrySourceTileData(any(), any(), any()) } returns expected\n    every { style.invalidateStyleCustomGeometrySourceRegion(any(), any()) } returns expected\n    every { style.invalidateStyleCustomGeometrySourceTile(any(), any()) } returns expected\n\n    every { expected.error } returns null\n\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.getStyleSourceProperty(any(), any()) } returns styleProperty\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n\n    testSource = customGeometrySource(\"testId\") {\n      fetchTileFunction(tileFunctionCallback)\n      cancelTileFunction(tileFunctionCallback)\n      minZoom(0)\n      maxZoom(20)\n      tileOptions(tileOptions)\n    }\n  }\n\n  private lateinit var testSource: CustomGeometrySource\n\n  @Test\n  fun bindTest() {\n    testSource.bindTo(style)\n    verify { style.addStyleCustomGeometrySource(\"testId\", any()) }\n  }\n\n  @Test\n  fun setTileDataTest() {\n    val tileData = mutableListOf<Feature>(Feature.fromGeometry(Point.fromLngLat(0.0, 0.0)))\n    val tileID: CanonicalTileID = mockk()\n    testSource.bindTo(style)\n    testSource.setTileData(tileID, tileData)\n    verify { style.setStyleCustomGeometrySourceTileData(\"testId\", tileID, tileData) }\n  }\n\n  @Test(expected = MapboxStyleException::class)\n  fun setTileDataBeforeBindTest() {\n    val tileData = mutableListOf<Feature>(Feature.fromGeometry(Point.fromLngLat(0.0, 0.0)))\n    val tileID: CanonicalTileID = mockk()\n    testSource.setTileData(tileID, tileData)\n    verify { style.setStyleCustomGeometrySourceTileData(\"testId\", tileID, tileData) }\n  }\n\n  @Test\n  fun invalidateRegionTest() {\n    val coordinateBounds: CoordinateBounds = mockk()\n    testSource.bindTo(style)\n    testSource.invalidateRegion(coordinateBounds)\n    verify { style.invalidateStyleCustomGeometrySourceRegion(\"testId\", coordinateBounds) }\n  }\n\n  @Test(expected = MapboxStyleException::class)\n  fun invalidateRegionBeforeBindTest() {\n    val coordinateBounds: CoordinateBounds = mockk()\n    testSource.invalidateRegion(coordinateBounds)\n    verify { style.invalidateStyleCustomGeometrySourceRegion(\"testId\", coordinateBounds) }\n  }\n\n  @Test\n  fun invalidateTileTest() {\n    val tileID: CanonicalTileID = mockk()\n    testSource.bindTo(style)\n    testSource.invalidateTile(tileID)\n    verify { style.invalidateStyleCustomGeometrySourceTile(\"testId\", tileID) }\n  }\n\n  @Test(expected = MapboxStyleException::class)\n  fun invalidateTileBeforeBindTest() {\n    val tileID: CanonicalTileID = mockk()\n    testSource.invalidateTile(tileID)\n    verify { style.invalidateStyleCustomGeometrySourceTile(\"testId\", tileID) }\n  }\n\n  @Test\n  fun tileCacheBudgetSet() {\n    val valueSlot = slot<Value>()\n    testSource.bindTo(style)\n    testSource.setTileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    Assert.assertEquals(\"{megabytes=100}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileCacheBudgetGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    testSource.bindTo(style)\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    Assert.assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    Assert.assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-cache-budget\") }\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesSet() {\n    testSource.bindTo(style)\n    testSource.setMaxOverscaleFactorForParentTiles(83)\n    verify { style.setStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\", Value.valueOf(83L)) }\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(83)\n    testSource.bindTo(style)\n    val maxOverscaleFactorForParentTiles = testSource.maxOverscaleFactorForParentTiles\n    Assert.assertEquals(83L, maxOverscaleFactorForParentTiles)\n    verify { style.getStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\") }\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/CustomRasterSourceTest.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport android.graphics.Bitmap\nimport com.mapbox.bindgen.DataRef\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.CanonicalTileID\nimport com.mapbox.maps.CustomRasterSourceTileData\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.toMapboxImage\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\n\n@MapboxExperimental\nclass CustomRasterSourceTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n\n  private val styleProperty = mockk<StylePropertyValue>()\n  private lateinit var testSource: CustomRasterSource\n\n  @Before\n  fun prepareTest() {\n    every { style.addStyleCustomRasterSource(any(), any()) } returns expected\n    every { style.setStyleCustomRasterSourceTileData(any(), any()) } returns expected\n\n    every { expected.error } returns null\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.getStyleSourceProperty(any(), any()) } returns styleProperty\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n\n    testSource = customRasterSource(\"testId\") {\n      // mandatory builder argument\n      clientCallback(mockk())\n    }\n    testSource.setMaxOverscaleFactorForParentTiles(83)\n  }\n\n  @Test\n  fun bindTest() {\n    testSource.bindTo(style)\n    verify { style.addStyleCustomRasterSource(\"testId\", any()) }\n  }\n\n  @Test\n  fun setTileDataTest() {\n    val tileData = listOf<CustomRasterSourceTileData>()\n    testSource.bindTo(style)\n    testSource.setTileData(tileData)\n    verify { style.setStyleCustomRasterSourceTileData(\"testId\", tileData) }\n  }\n\n  @Test(expected = MapboxStyleException::class)\n  fun setTileDataBeforeBindTest() {\n    val tileData = listOf<CustomRasterSourceTileData>()\n    testSource.setTileData(tileData)\n    verify { style.setStyleCustomRasterSourceTileData(\"testId\", tileData) }\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun setTileDataBitmapTest() {\n    val tileID: CanonicalTileID = mockk()\n    val bitmap = mockk<Bitmap>()\n    val bitmapWidth = 64\n    val bitmapHeight = 64\n    val bitmapByteCount = bitmapWidth * bitmapHeight * 4\n    every { bitmap.config } returns Bitmap.Config.ARGB_8888\n    every { bitmap.byteCount } returns bitmapByteCount\n    every { bitmap.width } returns bitmapWidth\n    every { bitmap.height } returns bitmapHeight\n    every { bitmap.copyPixelsToBuffer(any()) } just Runs\n    mockkStatic(DataRef::class)\n    val nativeDataRef = mockk<DataRef>(relaxed = true)\n    every { DataRef.allocateNative(bitmapByteCount) } returns nativeDataRef\n    testSource.bindTo(style)\n    val tileData = listOf(CustomRasterSourceTileData(tileID, bitmap.toMapboxImage()))\n    testSource.setTileData(tileData)\n    verify {\n      style.setStyleCustomRasterSourceTileData(\n        \"testId\",\n        listOf(\n          CustomRasterSourceTileData(\n            tileID,\n            Image(\n              bitmapWidth,\n              bitmapHeight,\n              nativeDataRef\n            )\n          )\n        )\n      )\n    }\n    unmockkStatic(DataRef::class)\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesSet() {\n    testSource.bindTo(style)\n    testSource.setMaxOverscaleFactorForParentTiles(83)\n    verify { style.setStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\", Value.valueOf(83L)) }\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(83)\n    testSource.bindTo(style)\n    val maxOverscaleFactorForParentTiles = testSource.maxOverscaleFactorForParentTiles\n    Assert.assertEquals(83L, maxOverscaleFactorForParentTiles)\n    verify { style.getStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\") }\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/GeoJsonSourceMutateTest.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass GeoJsonSourceMutateTest {\n\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n\n  @Before\n  fun prepare() {\n    every { expected.error } returns null\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n\n    every { style.addStyleSource(any(), any()) } returns expected\n\n    mockkStatic(StyleManager::class)\n  }\n\n  @After\n  fun tearDown() {\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).run {\n      if (isPaused) unPause()\n    }\n  }\n\n  @Test\n  fun fullAfterPartialAfterFull() {\n    val testSource = geoJsonSource(SOURCE_ID) {}\n    testSource.bindTo(style)\n    clearMocks(style)\n\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n\n    testSource.featureCollection(FeatureCollection.fromFeatures(ALL_FEATURES), FULL_ID)\n    testSource.addGeoJSONSourceFeatures(ADD_FEATURES, ADD_ID)\n    testSource.updateGeoJSONSourceFeatures(UPDATE_FEATURES, UPDATE_ID)\n    testSource.removeGeoJSONSourceFeatures(REMOVE_FEATURES.map { it.id()!! }, REMOVE_ID)\n\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n\n    testSource.featureCollection(FeatureCollection.fromFeatures(ALL_FEATURES_2), FULL_ID_2)\n\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n\n    verifyOrder {\n      style.setStyleGeoJSONSourceData(\n        SOURCE_ID,\n        FULL_ID,\n        any(),\n      )\n      style.addGeoJSONSourceFeatures(\n        SOURCE_ID,\n        ADD_ID,\n        ADD_FEATURES,\n      )\n      style.updateGeoJSONSourceFeatures(\n        SOURCE_ID,\n        UPDATE_ID,\n        UPDATE_FEATURES,\n      )\n      style.removeGeoJSONSourceFeatures(\n        SOURCE_ID,\n        REMOVE_ID,\n        REMOVE_FEATURES.map { it.id()!! },\n      )\n      style.setStyleGeoJSONSourceData(\n        SOURCE_ID,\n        FULL_ID_2,\n        any(),\n      )\n    }\n  }\n\n  @Test\n  fun fullOverwritesPartialAfterFull() {\n    val testSource = geoJsonSource(SOURCE_ID) {}\n    testSource.bindTo(style)\n    clearMocks(style)\n\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n\n    testSource.featureCollection(FeatureCollection.fromFeatures(ALL_FEATURES), FULL_ID)\n    testSource.addGeoJSONSourceFeatures(ADD_FEATURES, ADD_ID)\n    testSource.updateGeoJSONSourceFeatures(UPDATE_FEATURES, UPDATE_ID)\n    testSource.removeGeoJSONSourceFeatures(REMOVE_FEATURES.map { it.id()!! }, REMOVE_ID)\n    testSource.featureCollection(FeatureCollection.fromFeatures(ALL_FEATURES_2), FULL_ID_2)\n\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n\n    verifyOrder {\n      style.setStyleGeoJSONSourceData(\n        SOURCE_ID,\n        FULL_ID_2,\n        any(),\n      )\n    }\n    verify(exactly = 0) {\n      style.setStyleGeoJSONSourceData(\n        SOURCE_ID,\n        FULL_ID,\n        any(),\n      )\n    }\n    verify(exactly = 0) {\n      style.addGeoJSONSourceFeatures(any(), any(), any())\n    }\n    verify(exactly = 0) {\n      style.updateGeoJSONSourceFeatures(any(), any(), any())\n    }\n    verify(exactly = 0) {\n      style.removeGeoJSONSourceFeatures(any(), any(), any())\n    }\n  }\n\n  @Test\n  fun partialUpdatesBeforeStyleLoadLost() {\n    val testSource = geoJsonSource(SOURCE_ID) {}\n\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n\n    testSource.featureCollection(FeatureCollection.fromFeatures(ALL_FEATURES), FULL_ID)\n    testSource.addGeoJSONSourceFeatures(ADD_FEATURES, ADD_ID)\n    testSource.updateGeoJSONSourceFeatures(UPDATE_FEATURES, UPDATE_ID)\n    testSource.removeGeoJSONSourceFeatures(REMOVE_FEATURES.map { it.id()!! }, REMOVE_ID)\n\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n\n    testSource.bindTo(style)\n    clearMocks(style)\n\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n\n    verifyOrder {\n      style.setStyleGeoJSONSourceData(\n        SOURCE_ID,\n        FULL_ID,\n        any(),\n      )\n    }\n    verify(exactly = 0) {\n      style.addGeoJSONSourceFeatures(any(), any(), any())\n    }\n    verify(exactly = 0) {\n      style.updateGeoJSONSourceFeatures(any(), any(), any())\n    }\n    verify(exactly = 0) {\n      style.removeGeoJSONSourceFeatures(any(), any(), any())\n    }\n    verify(exactly = 3) {\n      logW(\"GeoJsonSourceUtils\", any())\n    }\n  }\n\n  companion object {\n    private val SOURCE_ID = \"source-id\"\n    private val FULL_ID = \"full-id\"\n    private val FULL_ID_2 = \"full-id-2\"\n    private val ADD_ID = \"add-id\"\n    private val REMOVE_ID = \"remove-id\"\n    private val UPDATE_ID = \"update-id\"\n\n    private fun feature(id: Int) = Feature.fromGeometry(\n      Point.fromLngLat(0.01 * id, 0.01 * id),\n      null,\n      \"feature-$id\"\n    )\n\n    private val ALL_FEATURES = (0..100).map { feature(it) }\n    private val ALL_FEATURES_2 = (200..300).map { feature(it) }\n    private val ADD_FEATURES = (101..120).map { feature(it) }\n    private val REMOVE_FEATURES = (50..70).map { feature(it) }\n    private val UPDATE_FEATURES = (20..80).map { feature(it) }\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/ImageSourceExtTest.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport android.graphics.Bitmap\nimport com.mapbox.bindgen.DataRef\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.maps.Image\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.sources.generated.imageSource\nimport io.mockk.*\nimport org.junit.Before\nimport org.junit.Test\n\nclass ImageSourceExtTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n\n  @Before\n  fun prepareTest() {\n    every { style.addStyleSource(any(), any()) } returns expected\n    every { style.updateStyleImageSourceImage(any(), any()) } returns expected\n    every { expected.error } returns null\n  }\n\n  @Test\n  fun updateImageImageTest() {\n    val image = mockk<Image>()\n    val testSource = imageSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.updateImage(image)\n    verify(exactly = 1) {\n      style.updateStyleImageSourceImage(\n        \"testId\",\n        image\n      )\n    }\n  }\n\n  @Test\n  fun updateImageBitmapTest() {\n    val bitmap = mockk<Bitmap>()\n    val bitmapWidth = 64\n    val bitmapHeight = 64\n    val bitmapByteCount = bitmapWidth * bitmapHeight * 4\n    every { bitmap.config } returns Bitmap.Config.ARGB_8888\n    every { bitmap.byteCount } returns bitmapByteCount\n    every { bitmap.width } returns bitmapWidth\n    every { bitmap.height } returns bitmapHeight\n    every { bitmap.copyPixelsToBuffer(any()) } just Runs\n    mockkStatic(DataRef::class)\n    val nativeDataRef = mockk<DataRef>(relaxed = true)\n    every { DataRef.allocateNative(bitmapByteCount) } returns nativeDataRef\n    val testSource = imageSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.updateImage(bitmap)\n    verify(exactly = 1) {\n      style.updateStyleImageSourceImage(\n        \"testId\",\n        Image(\n          bitmapWidth,\n          bitmapHeight,\n          nativeDataRef\n        )\n      )\n    }\n    unmockkStatic(DataRef::class)\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/TileSetTest.kt",
    "content": "package com.mapbox.maps.extension.style.sources\n\nimport com.mapbox.maps.extension.style.sources.generated.Encoding\nimport com.mapbox.maps.extension.style.sources.generated.Scheme\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\n\nclass TileSetTest {\n  lateinit var builder: TileSet.Builder\n\n  @Before\n  fun prepareTest() {\n    builder = TileSet.Builder(\"abc\", listOf(\"a\", \"b\", \"c\"))\n  }\n\n  @After\n  fun cleanupTest() {\n    builder.parameters.clear()\n  }\n  @Test\n  fun tileSetBuilderTest() {\n    val tileset = builder.build()\n    assertEquals(tileset[\"tilejson\"].toString(), \"abc\")\n    assertEquals(tileset[\"tiles\"].toString(), \"[a, b, c]\")\n  }\n  @Test\n  fun nameTest() {\n    val tileset = builder.name(\"testName\").build()\n    assertEquals(tileset[\"name\"].toString(), \"testName\")\n  }\n  @Test\n  fun descriptionTest() {\n    val tileset = builder.description(\"testdescription\").build()\n    assertEquals(tileset[\"description\"].toString(), \"testdescription\")\n  }\n  @Test\n  fun versionTest() {\n    val tileset = builder.version(\"testversion\").build()\n    assertEquals(tileset[\"version\"].toString(), \"testversion\")\n  }\n  @Test\n  fun attributionTest() {\n    val tileset = builder.attribution(\"testattribution\").build()\n    assertEquals(tileset[\"attribution\"].toString(), \"testattribution\")\n  }\n  @Test\n  fun templateTest() {\n    val tileset = builder.template(\"testtemplate\").build()\n    assertEquals(tileset[\"template\"].toString(), \"testtemplate\")\n  }\n  @Test\n  fun legendTest() {\n    val tileset = builder.legend(\"testlegend\").build()\n    assertEquals(tileset[\"legend\"].toString(), \"testlegend\")\n  }\n  @Test\n  fun schemeTestTMS() {\n    val tileset = builder.scheme(Scheme.TMS).build()\n    assertEquals(tileset[\"scheme\"].toString(), \"tms\")\n  }\n  @Test\n  fun schemeTestXYZ() {\n    val tileset = builder.scheme(Scheme.XYZ).build()\n    assertEquals(tileset[\"scheme\"].toString(), \"xyz\")\n  }\n  @Test\n  fun gridsTest() {\n    val tileset = builder.grids(listOf(\"abc\", \"def\")).build()\n    assertEquals(tileset[\"grids\"].toString(), \"[abc, def]\")\n  }\n  @Test\n  fun dataTest() {\n    val tileset = builder.data(listOf(\"abc\", \"def\")).build()\n    assertEquals(tileset[\"data\"].toString(), \"[abc, def]\")\n  }\n  @Test\n  fun minZoomTest() {\n    val tileset = builder.minZoom(1).build()\n    assertEquals(tileset[\"minzoom\"].toString(), \"1\")\n  }\n  @Test\n  fun maxZoomTest() {\n    val tileset = builder.maxZoom(1).build()\n    assertEquals(tileset[\"maxzoom\"].toString(), \"1\")\n  }\n  @Test\n  fun boundsTest() {\n    val tileset = builder.bounds(listOf(-180.0, -90.0, 180.0, 90.0)).build()\n    assertEquals(tileset[\"bounds\"].toString(), \"[-180.0, -90.0, 180.0, 90.0]\")\n  }\n  @Test\n  fun centerTest() {\n    val tileset = builder.center(listOf(-180.0, -90.0)).build()\n    assertEquals(tileset[\"center\"].toString(), \"[-180.0, -90.0]\")\n  }\n  @Test\n  fun encodingTestMapbox() {\n    val tileset = TileSet.RasterDemBuilder(\"abc\", listOf(\"a\", \"b\", \"c\"))\n      .encoding(Encoding.MAPBOX).build()\n    assertEquals(tileset[\"encoding\"].toString(), \"mapbox\")\n  }\n  @Test\n  fun encodingTestTerrarium() {\n    val tileset = TileSet.RasterDemBuilder(\"abc\", listOf(\"a\", \"b\", \"c\"))\n      .encoding(Encoding.TERRARIUM).build()\n    assertEquals(tileset[\"encoding\"].toString(), \"terrarium\")\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/generated/GeoJsonSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport android.os.Handler\nimport android.os.Looper\nimport android.os.Process\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.maps.*\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.get\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.sum\nimport com.mapbox.maps.extension.style.types.PromoteId\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.Config\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass GeoJsonSourceTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n  private val jsonSlot = slot<GeoJSONSourceData>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val expectedDelta = mockk<Expected<String, Byte>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n\n  @Before\n  fun prepareTest() {\n    every { expected.error } returns null\n    every { expectedDelta.error } returns null\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n\n    mockkStyle(style)\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleSourcePropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  @After\n  fun tearDown() {\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).run {\n      if (isPaused)\n        unPause()\n    }\n  }\n\n  private fun mockkStyle(style: MapboxStyleManager) {\n    every { style.addStyleSource(any(), any()) } returns expected\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n    every { style.getStyleSourceProperty(any(), any()) } returns styleProperty\n  }\n\n  @Test\n  fun getTypeTest() {\n    val testSource = geoJsonSource(\"testId\") {}\n    assertEquals(\"geojson\", testSource.getType())\n  }\n\n  @Test\n  fun dataSet() {\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    val testSource = geoJsonSource(\"testId\") {\n      data(TEST_GEOJSON)\n    }\n    testSource.bindTo(style)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n\n    verify { style.setStyleGeoJSONSourceData(\"testId\", \"\", capture(jsonSlot)) }\n    assertTrue(jsonSlot.captured.string.contains(\"{\\\"type\\\":\\\"FeatureCollection\\\",\\\"features\\\":[]}\"))\n  }\n\n  @Test\n  fun dataSetWithId() {\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    val testSource = geoJsonSource(\"testId\") {\n      data(TEST_GEOJSON, DATA_ID)\n    }\n    testSource.bindTo(style)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n\n    verify { style.setStyleGeoJSONSourceData(\"testId\", DATA_ID, capture(jsonSlot)) }\n    assertTrue(jsonSlot.captured.string.contains(\"{\\\"type\\\":\\\"FeatureCollection\\\",\\\"features\\\":[]}\"))\n  }\n\n  @Test\n  fun dataSetAfterBind() {\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.data(TEST_GEOJSON)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    verify { style.setStyleGeoJSONSourceData(\"testId\", \"\", capture(jsonSlot)) }\n    assertEquals(jsonSlot.captured.string, \"{\\\"type\\\":\\\"FeatureCollection\\\",\\\"features\\\":[]}\")\n\n    testSource.data(TEST_GEOJSON, DATA_ID)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    verify { style.setStyleGeoJSONSourceData(\"testId\", DATA_ID, capture(jsonSlot)) }\n    assertEquals(jsonSlot.captured.string, \"{\\\"type\\\":\\\"FeatureCollection\\\",\\\"features\\\":[]}\")\n  }\n\n  @Test\n  fun dataGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(TEST_GEOJSON)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(TEST_GEOJSON.toString(), testSource.data?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"data\") }\n  }\n\n  @Test\n  fun urlSetTest() {\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    val testSource = geoJsonSource(\"testId\") {\n      url(\"testUrl\")\n    }\n    testSource.bindTo(style)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n\n    verify { style.setStyleGeoJSONSourceData(\"testId\", \"\", capture(jsonSlot)) }\n    assertEquals(jsonSlot.captured.string, \"testUrl\")\n  }\n\n  @Test\n  fun urlSetAfterBindTest() {\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.url(\"testUrl\")\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    verify { style.setStyleGeoJSONSourceData(\"testId\", \"\", capture(jsonSlot)) }\n    assertEquals(jsonSlot.captured.string, \"testUrl\")\n  }\n\n  @Test\n  fun maxzoomSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      maxzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"maxzoom=1\"))\n  }\n\n  @Test\n  fun maxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.maxzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"maxzoom\") }\n  }\n\n  @Test\n  fun minzoomSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      minzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"minzoom=1\"))\n  }\n\n  @Test\n  fun minzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.minzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"minzoom\") }\n  }\n\n  @Test\n  fun attributionSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      attribution(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"attribution=abc\"))\n  }\n\n  @Test\n  fun attributionGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.attribution?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"attribution\") }\n  }\n\n  @Test\n  fun bufferSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      buffer(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"buffer=1\"))\n  }\n\n  @Test\n  fun bufferGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.buffer?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"buffer\") }\n  }\n\n  @Test\n  fun toleranceSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      tolerance(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tolerance=1.0\"))\n  }\n\n  @Test\n  fun toleranceGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.tolerance?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tolerance\") }\n  }\n\n  @Test\n  fun clusterSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      cluster(true)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"cluster=true\"))\n  }\n\n  @Test\n  fun clusterGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(true.toString(), testSource.cluster?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"cluster\") }\n  }\n\n  @Test\n  fun clusterRadiusSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      clusterRadius(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"clusterRadius=1\"))\n  }\n\n  @Test\n  fun clusterRadiusGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.clusterRadius?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"clusterRadius\") }\n  }\n\n  @Test\n  fun clusterMaxZoomSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      clusterMaxZoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"clusterMaxZoom=1\"))\n  }\n\n  @Test\n  fun clusterMaxZoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.clusterMaxZoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"clusterMaxZoom\") }\n  }\n\n  @Test\n  fun clusterMinPointsSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      clusterMinPoints(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"clusterMinPoints=1\"))\n  }\n\n  @Test\n  fun clusterMinPointsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.clusterMinPoints?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"clusterMinPoints\") }\n  }\n\n  @Test\n  fun clusterPropertiesSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      clusterProperties((hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"clusterProperties={key1=x, key2=y}\"))\n  }\n\n  @Test\n  fun clusterPropertiesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue((hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>))\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals((hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>).toString(), testSource.clusterProperties?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"clusterProperties\") }\n  }\n\n  // Cluster Properties is not mutable so afterBind test is ignored\n  @Test\n  fun clusterPropertyTest() {\n    val testSource = geoJsonSource(\"testId\") {\n      clusterProperty(\"sum\", sum { get { literal(\"scalerank\") } })\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(\n      valueSlot.captured.toString().contains(\"clusterProperties={sum=[+, [get, scalerank]]}\")\n    )\n  }\n\n  @Test\n  fun clusterPropertyAdvancedTest() {\n    val testSource = geoJsonSource(\"testId\") {\n      clusterProperty(\n        \"sum\",\n        sum {\n          accumulated()\n          get {\n            literal(\"sum\")\n          }\n        },\n        get {\n          literal(\"scalerank\")\n        }\n      )\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(\n      valueSlot.captured.toString()\n        .contains(\"clusterProperties={sum=[[+, [accumulated], [get, sum]], [get, scalerank]]}\")\n    )\n  }\n\n  @Test\n  fun clusterPropertyTwiceTest() {\n    val testSource = geoJsonSource(\"testId\") {\n      clusterProperty(\"sum\", sum { get { literal(\"scalerank\") } })\n      clusterProperty(\n        \"sum1\",\n        sum {\n          accumulated()\n          get {\n            literal(\"sum\")\n          }\n        },\n        get {\n          literal(\"scalerank\")\n        }\n      )\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(\n      valueSlot.captured.toString()\n        .contains(\"clusterProperties={sum1=[[+, [accumulated], [get, sum]], [get, scalerank]], sum=[+, [get, scalerank]]}\")\n    )\n  }\n\n  @Test\n  fun lineMetricsSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      lineMetrics(true)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"lineMetrics=true\"))\n  }\n\n  @Test\n  fun lineMetricsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(true.toString(), testSource.lineMetrics?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"lineMetrics\") }\n  }\n\n  @Test\n  fun generateIdSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      generateId(true)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"generateId=true\"))\n  }\n\n  @Test\n  fun generateIdGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(true.toString(), testSource.generateId?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"generateId\") }\n  }\n\n  @Test\n  fun promoteIdSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      promoteId(PromoteId(propertyName = \"abc\"))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"promoteId=abc\"))\n  }\n\n  @Test\n  fun promoteIdGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(PromoteId(propertyName = \"abc\"), testSource.promoteId)\n    verify { style.getStyleSourceProperty(\"testId\", \"promoteId\") }\n  }\n\n  @Test\n  fun autoMaxZoomSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      autoMaxZoom(true)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"autoMaxZoom=true\"))\n  }\n\n  @Test\n  fun autoMaxZoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(true.toString(), testSource.autoMaxZoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"autoMaxZoom\") }\n  }\n\n  @Test\n  fun prefetchZoomDeltaSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      prefetchZoomDelta(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(\"1\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun prefetchZoomDeltaSetAfterBind() {\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.prefetchZoomDelta(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun prefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.prefetchZoomDelta?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\") }\n  }\n\n  @Test\n  fun tileCacheBudgetSet() {\n    val testSource = geoJsonSource(\"testId\") {\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(\"{megabytes=100}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileCacheBudgetSetAfterBind() {\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{megabytes=100}\")\n  }\n\n  @Test\n  fun tileCacheBudgetGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-cache-budget\") }\n  }\n\n  @Test\n  fun emptyDataTest() {\n    val testSource = geoJsonSource(\"testId\")\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"type=geojson\"))\n  }\n\n  @Test\n  fun dataSetBeforeBind() {\n    val testSource = geoJsonSource(\"testId\") {}\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.data(TEST_GEOJSON, DATA_ID)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.bindTo(style)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    verify(exactly = 1) {\n      style.setStyleGeoJSONSourceData(\n        \"testId\",\n        DATA_ID,\n        capture(jsonSlot)\n      )\n    }\n    assertEquals(jsonSlot.captured.string, \"{\\\"type\\\":\\\"FeatureCollection\\\",\\\"features\\\":[]}\")\n  }\n\n  @Test\n  fun reuseDataWithAnotherStyle() {\n    val testSource = geoJsonSource(\"testId\") {}\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.data(TEST_GEOJSON, DATA_ID)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.bindTo(style)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    val newStyle = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n    mockkStyle(newStyle)\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.bindTo(newStyle)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    verify(exactly = 1) {\n      style.setStyleGeoJSONSourceData(\n        \"testId\",\n        DATA_ID,\n        capture(jsonSlot)\n      )\n    }\n    verify(exactly = 1) {\n      newStyle.setStyleGeoJSONSourceData(\n        \"testId\",\n        DATA_ID,\n        capture(jsonSlot)\n      )\n    }\n    assertEquals(jsonSlot.captured.string, \"{\\\"type\\\":\\\"FeatureCollection\\\",\\\"features\\\":[]}\")\n  }\n\n  @Test\n  fun featureAfterBindTest() {\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.feature(FEATURE)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { style.setStyleGeoJSONSourceData(\"testId\", \"\", any()) }\n\n    testSource.feature(FEATURE, DATA_ID)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { style.setStyleGeoJSONSourceData(\"testId\", DATA_ID, any()) }\n  }\n\n  @Test\n  fun featureCollectionAfterBindTest() {\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.featureCollection(FEATURE_COLLECTION)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { style.setStyleGeoJSONSourceData(\"testId\", \"\", any()) }\n\n    testSource.featureCollection(FEATURE_COLLECTION, DATA_ID)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { style.setStyleGeoJSONSourceData(\"testId\", DATA_ID, any()) }\n  }\n\n  @Test\n  fun featureCollectionBeforeBindTest() {\n    val testSource = geoJsonSource(\"testId\") {}\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.featureCollection(FEATURE_COLLECTION, DATA_ID)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.bindTo(style)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) {\n      style.setStyleGeoJSONSourceData(\n        \"testId\",\n        DATA_ID,\n        any()\n      )\n    }\n  }\n\n  @Test\n  fun reuseFeatureCollectionWithAnotherStyle() {\n    val testSource = geoJsonSource(\"testId\") {}\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.featureCollection(FEATURE_COLLECTION, DATA_ID)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.bindTo(style)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    val newStyle = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n    mockkStyle(newStyle)\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.bindTo(newStyle)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    verify(exactly = 1) {\n      style.setStyleGeoJSONSourceData(\n        \"testId\",\n        DATA_ID,\n        any()\n      )\n    }\n    verify(exactly = 1) {\n      newStyle.setStyleGeoJSONSourceData(\n        \"testId\",\n        DATA_ID,\n        any()\n      )\n    }\n  }\n\n  @Test\n  fun geometryAfterBindTest() {\n    val testSource = geoJsonSource(\"testId\") {}\n    testSource.bindTo(style)\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).pause()\n    testSource.geometry(FEATURE.geometry()!!)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { style.setStyleGeoJSONSourceData(\"testId\", \"\", any()) }\n\n    testSource.geometry(FEATURE.geometry()!!, DATA_ID)\n    Shadows.shadowOf(GeoJsonSource.workerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { style.setStyleGeoJSONSourceData(\"testId\", DATA_ID, any()) }\n  }\n\n  @Test\n  fun featureTest() {\n    val testSource = geoJsonSource(\"testId\") {\n      feature(FEATURE)\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"type=geojson\"))\n  }\n\n  @Test\n  fun featureCollectionTest() {\n    val testSource = geoJsonSource(\"testId\") {\n      featureCollection(FEATURE_COLLECTION)\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"type=geojson\"))\n  }\n\n  @Test\n  fun geometryTest() {\n    val testSource = geoJsonSource(\"testId\") {\n      geometry(FEATURE.geometry()!!)\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"type=geojson\"))\n  }\n  // Default source property getters tests\n\n  @Test\n  fun defaultMaxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), GeoJsonSource.defaultMaxzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"maxzoom\") }\n  }\n\n  @Test\n  fun defaultMinzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), GeoJsonSource.defaultMinzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"minzoom\") }\n  }\n\n  @Test\n  fun defaultBufferGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), GeoJsonSource.defaultBuffer?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"buffer\") }\n  }\n\n  @Test\n  fun defaultToleranceGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), GeoJsonSource.defaultTolerance?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"tolerance\") }\n  }\n\n  @Test\n  fun defaultClusterGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n\n    assertEquals(true.toString(), GeoJsonSource.defaultCluster?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"cluster\") }\n  }\n\n  @Test\n  fun defaultClusterRadiusGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), GeoJsonSource.defaultClusterRadius?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"clusterRadius\") }\n  }\n\n  @Test\n  fun defaultClusterMaxZoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), GeoJsonSource.defaultClusterMaxZoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"clusterMaxZoom\") }\n  }\n\n  @Test\n  fun defaultClusterMinPointsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), GeoJsonSource.defaultClusterMinPoints?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"clusterMinPoints\") }\n  }\n\n  @Test\n  fun defaultLineMetricsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n\n    assertEquals(true.toString(), GeoJsonSource.defaultLineMetrics?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"lineMetrics\") }\n  }\n\n  @Test\n  fun defaultGenerateIdGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n\n    assertEquals(true.toString(), GeoJsonSource.defaultGenerateId?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"generateId\") }\n  }\n\n  @Test\n  fun defaultPrefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), GeoJsonSource.defaultPrefetchZoomDelta?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"geojson\", \"prefetch-zoom-delta\") }\n  }\n\n  @Test\n  fun testWorkerThread() {\n    val latch = CountDownLatch(1)\n    Handler(GeoJsonSource.workerThread.looper).post {\n      val actualPriority = Process.getThreadPriority(Process.myTid())\n      assertEquals(Process.THREAD_PRIORITY_DEFAULT, actualPriority)\n      assertEquals(\"GEOJSON_PARSER\", Thread.currentThread().name)\n      latch.countDown()\n    }\n    if (!latch.await(2, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  companion object {\n    private val TEST_GEOJSON = FeatureCollection.fromFeatures(listOf()).toJson()\n    private val DATA_ID = \"data-id\"\n    private val FEATURE = Feature.fromJson(\n      \"\"\"\n        {\n          \"type\": \"Feature\",\n          \"geometry\": {\n            \"type\": \"Point\",\n            \"coordinates\": [102.0, 0.5]\n          },\n          \"properties\": {\n                  \"prop0\": \"value0\"\n                }\n        }\n      \"\"\".trimIndent()\n    )\n    private val FEATURE_COLLECTION = FeatureCollection.fromJson(\n      \"\"\"\n        {\n          \"type\": \"FeatureCollection\",\n          \"features\": [\n            {\n              \"type\": \"Feature\",\n              \"geometry\": {\n                \"type\": \"Point\",\n                \"coordinates\": [102.0, 0.5]\n              }\n            },\n            {\n              \"type\": \"Feature\",\n              \"geometry\": {\n                \"type\": \"LineString\",\n                \"coordinates\": [\n                  [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]\n                ]\n              }\n            }\n          ]\n        }\n      \"\"\".trimIndent()\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/generated/ImageSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass ImageSourceTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val expectedDelta = mockk<Expected<String, Byte>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n\n  @Before\n  fun prepareTest() {\n    every { expected.error } returns null\n    every { expectedDelta.error } returns null\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n\n    mockkStyle(style)\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleSourcePropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  private fun mockkStyle(style: MapboxStyleManager) {\n    every { style.addStyleSource(any(), any()) } returns expected\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n    every { style.getStyleSourceProperty(any(), any()) } returns styleProperty\n  }\n\n  @Test\n  fun getTypeTest() {\n    val testSource = imageSource(\"testId\") {}\n    assertEquals(\"image\", testSource.getType())\n  }\n\n  @Test\n  fun urlSet() {\n    val testSource = imageSource(\"testId\") {\n      url(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"url=abc\"))\n  }\n\n  @Test\n  fun urlSetAfterBind() {\n    val testSource = imageSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.url(\"abc\")\n\n    verify { style.setStyleSourceProperty(\"testId\", \"url\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun urlGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = imageSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.url?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"url\") }\n  }\n\n  @Test\n  fun coordinatesSet() {\n    val testSource = imageSource(\"testId\") {\n      coordinates(listOf(listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0)))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"coordinates=[[0.0, 1.0], [0.0, 1.0], [0.0, 1.0], [0.0, 1.0]]\"))\n  }\n\n  @Test\n  fun coordinatesSetAfterBind() {\n    val testSource = imageSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.coordinates(listOf(listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0)))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"coordinates\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[[0.0, 1.0], [0.0, 1.0], [0.0, 1.0], [0.0, 1.0]]\")\n  }\n\n  @Test\n  fun coordinatesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0)))\n    val testSource = imageSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0)).toString(), testSource.coordinates?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"coordinates\") }\n  }\n\n  @Test\n  fun prefetchZoomDeltaSet() {\n    val testSource = imageSource(\"testId\") {\n      prefetchZoomDelta(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(\"1\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun prefetchZoomDeltaSetAfterBind() {\n    val testSource = imageSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.prefetchZoomDelta(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun prefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = imageSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.prefetchZoomDelta?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\") }\n  }\n  // Default source property getters tests\n\n  @Test\n  fun defaultPrefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), ImageSource.defaultPrefetchZoomDelta?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"image\", \"prefetch-zoom-delta\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/generated/ModelSourceModelTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.common.toValue\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.layers.properties.PropertyValue\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass ModelSourceModelTest {\n  private val modelSource = mockk<ModelSource>(relaxUnitFun = true, relaxed = true)\n  private val propertyValueSlot = slot<PropertyValue<*>>()\n\n  @Before\n  fun prepareTest() {\n    every { modelSource.setProperty(any()) } returns Unit\n    every { modelSource.getPropertyValue<HashMap<String, HashMap<String, Any>>>(any()) } returns null\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun idTest() {\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n\n    assertEquals(\"test-id\", model.id)\n  }\n\n  @Test\n  fun featurePropertiesSet() {\n    every { modelSource.setProperty(capture(propertyValueSlot)) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .featureProperties(hashMapOf<String, Any>(\"name\" to \"test\"))\n      .build()\n    model.bindTo(modelSource)\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", propertyValueSlot.captured.propertyName)\n  }\n\n  @Test\n  fun featurePropertiesSetAfterBind() {\n    every { modelSource.setProperty(any()) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n    model.bindTo(modelSource)\n\n    val localSlot = slot<PropertyValue<*>>()\n    every { modelSource.setProperty(capture(localSlot)) } returns Unit\n\n    model.featureProperties(hashMapOf<String, Any>(\"updated\" to true))\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", localSlot.captured.propertyName)\n  }\n\n  @Test\n  fun featurePropertiesGet() {\n    val testValue = hashMapOf(\"name\" to \"test\".toValue()).toValue()\n    val model = spyk(\n      ModelSourceModel.Builder(\"test-id\")\n        .uri(\"https://example.com/model.glb\")\n        .build()\n    )\n    every { model.getProperties() } returns hashMapOf(\"featureProperties\" to testValue)\n\n    model.bindTo(modelSource)\n\n    assertEquals(testValue, model.featureProperties)\n  }\n\n  @Test\n  fun materialOverrideNamesSet() {\n    every { modelSource.setProperty(capture(propertyValueSlot)) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .materialOverrideNames(listOf(\"material1\", \"material2\"))\n      .build()\n    model.bindTo(modelSource)\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", propertyValueSlot.captured.propertyName)\n  }\n\n  @Test\n  fun materialOverrideNamesSetAfterBind() {\n    every { modelSource.setProperty(any()) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n    model.bindTo(modelSource)\n\n    val localSlot = slot<PropertyValue<*>>()\n    every { modelSource.setProperty(capture(localSlot)) } returns Unit\n\n    model.materialOverrideNames(listOf(\"material3\"))\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", localSlot.captured.propertyName)\n  }\n\n  @Test\n  fun materialOverrideNamesGet() {\n    val testValue = listOf(\"material1\".toValue(), \"material2\".toValue()).toValue()\n    val model = spyk(\n      ModelSourceModel.Builder(\"test-id\")\n        .uri(\"https://example.com/model.glb\")\n        .build()\n    )\n    every { model.getProperties() } returns hashMapOf(\"materialOverrideNames\" to testValue)\n\n    model.bindTo(modelSource)\n\n    assertEquals(testValue, model.materialOverrideNames)\n  }\n\n  @Test\n  fun materialOverridesSet() {\n    every { modelSource.setProperty(capture(propertyValueSlot)) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .materialOverrides(listOf(ModelMaterialOverride.Builder(\"mat1\").modelEmissiveStrength(1.5).build()))\n      .build()\n    model.bindTo(modelSource)\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", propertyValueSlot.captured.propertyName)\n  }\n\n  @Test\n  fun materialOverridesSetAfterBind() {\n    every { modelSource.setProperty(any()) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n    model.bindTo(modelSource)\n\n    val localSlot = slot<PropertyValue<*>>()\n    every { modelSource.setProperty(capture(localSlot)) } returns Unit\n\n    model.materialOverrides(listOf(ModelMaterialOverride.Builder(\"mat2\").modelEmissiveStrength(2.0).build()))\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", localSlot.captured.propertyName)\n  }\n\n  @Test\n  fun materialOverridesGet() {\n    val override = ModelMaterialOverride.Builder(\"mat1\").modelEmissiveStrength(1.5).build()\n    val testValue = hashMapOf(\"mat1\" to override.toValue()).toValue()\n    val model = spyk(\n      ModelSourceModel.Builder(\"test-id\")\n        .uri(\"https://example.com/model.glb\")\n        .build()\n    )\n    every { model.getProperties() } returns hashMapOf(\"materialOverrides\" to testValue)\n\n    model.bindTo(modelSource)\n\n    assertEquals(listOf(override), model.materialOverrides)\n  }\n\n  @Test\n  fun nodeOverrideNamesSet() {\n    every { modelSource.setProperty(capture(propertyValueSlot)) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .nodeOverrideNames(listOf(\"node1\", \"node2\"))\n      .build()\n    model.bindTo(modelSource)\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", propertyValueSlot.captured.propertyName)\n  }\n\n  @Test\n  fun nodeOverrideNamesSetAfterBind() {\n    every { modelSource.setProperty(any()) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n    model.bindTo(modelSource)\n\n    val localSlot = slot<PropertyValue<*>>()\n    every { modelSource.setProperty(capture(localSlot)) } returns Unit\n\n    model.nodeOverrideNames(listOf(\"node3\"))\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", localSlot.captured.propertyName)\n  }\n\n  @Test\n  fun nodeOverrideNamesGet() {\n    val testValue = listOf(\"node1\".toValue(), \"node2\".toValue()).toValue()\n    val model = spyk(\n      ModelSourceModel.Builder(\"test-id\")\n        .uri(\"https://example.com/model.glb\")\n        .build()\n    )\n    every { model.getProperties() } returns hashMapOf(\"nodeOverrideNames\" to testValue)\n\n    model.bindTo(modelSource)\n\n    assertEquals(testValue, model.nodeOverrideNames)\n  }\n\n  @Test\n  fun nodeOverridesSet() {\n    every { modelSource.setProperty(capture(propertyValueSlot)) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .nodeOverrides(listOf(ModelNodeOverride.Builder(\"node1\").orientation(listOf(0.0, 0.0, 45.0)).build()))\n      .build()\n    model.bindTo(modelSource)\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", propertyValueSlot.captured.propertyName)\n  }\n\n  @Test\n  fun nodeOverridesSetAfterBind() {\n    every { modelSource.setProperty(any()) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n    model.bindTo(modelSource)\n\n    val localSlot = slot<PropertyValue<*>>()\n    every { modelSource.setProperty(capture(localSlot)) } returns Unit\n\n    model.nodeOverrides(listOf(ModelNodeOverride.Builder(\"node2\").orientation(listOf(0.0, 45.0, 0.0)).build()))\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", localSlot.captured.propertyName)\n  }\n\n  @Test\n  fun nodeOverridesGet() {\n    val override = ModelNodeOverride.Builder(\"node1\").orientation(listOf(0.0, 0.0, 45.0)).build()\n    val testValue = hashMapOf(\"node1\" to override.toValue()).toValue()\n    val model = spyk(\n      ModelSourceModel.Builder(\"test-id\")\n        .uri(\"https://example.com/model.glb\")\n        .build()\n    )\n    every { model.getProperties() } returns hashMapOf(\"nodeOverrides\" to testValue)\n\n    model.bindTo(modelSource)\n\n    assertEquals(listOf(override), model.nodeOverrides)\n  }\n\n  @Test\n  fun orientationSet() {\n    every { modelSource.setProperty(capture(propertyValueSlot)) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .orientation(listOf(0.0, 0.0, 90.0))\n      .build()\n    model.bindTo(modelSource)\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", propertyValueSlot.captured.propertyName)\n  }\n\n  @Test\n  fun orientationSetAfterBind() {\n    every { modelSource.setProperty(any()) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n    model.bindTo(modelSource)\n\n    val localSlot = slot<PropertyValue<*>>()\n    every { modelSource.setProperty(capture(localSlot)) } returns Unit\n\n    model.orientation(listOf(45.0, 0.0, 90.0))\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", localSlot.captured.propertyName)\n  }\n\n  @Test\n  fun orientationGet() {\n    val testValue = listOf(0.0.toValue(), 0.0.toValue(), 90.0.toValue()).toValue()\n    val model = spyk(\n      ModelSourceModel.Builder(\"test-id\")\n        .uri(\"https://example.com/model.glb\")\n        .build()\n    )\n    every { model.getProperties() } returns hashMapOf(\"orientation\" to testValue)\n\n    model.bindTo(modelSource)\n\n    assertEquals(testValue, model.orientation)\n  }\n\n  @Test\n  fun positionSet() {\n    every { modelSource.setProperty(capture(propertyValueSlot)) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(122.4, 37.8))\n      .build()\n    model.bindTo(modelSource)\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", propertyValueSlot.captured.propertyName)\n  }\n\n  @Test\n  fun positionSetAfterBind() {\n    every { modelSource.setProperty(any()) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n    model.bindTo(modelSource)\n\n    val localSlot = slot<PropertyValue<*>>()\n    every { modelSource.setProperty(capture(localSlot)) } returns Unit\n\n    model.position(listOf(-122.5, 37.9))\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", localSlot.captured.propertyName)\n  }\n\n  @Test\n  fun positionGet() {\n    val testValue = listOf(122.4.toValue(), 37.8.toValue()).toValue()\n    val model = spyk(\n      ModelSourceModel.Builder(\"test-id\")\n        .uri(\"https://example.com/model.glb\")\n        .build()\n    )\n    every { model.getProperties() } returns hashMapOf(\"position\" to testValue)\n\n    model.bindTo(modelSource)\n\n    assertEquals(testValue, model.position)\n  }\n\n  @Test\n  fun uriSet() {\n    every { modelSource.setProperty(capture(propertyValueSlot)) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n    model.bindTo(modelSource)\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", propertyValueSlot.captured.propertyName)\n  }\n\n  @Test\n  fun uriSetAfterBind() {\n    every { modelSource.setProperty(any()) } returns Unit\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .build()\n    model.bindTo(modelSource)\n\n    val localSlot = slot<PropertyValue<*>>()\n    every { modelSource.setProperty(capture(localSlot)) } returns Unit\n\n    model.uri(\"https://example.com/updated.glb\")\n\n    verify { modelSource.setProperty(any()) }\n    assertEquals(\"models\", localSlot.captured.propertyName)\n  }\n\n  @Test\n  fun uriGet() {\n    val testValue = \"https://example.com/model.glb\".toValue()\n    val model = spyk(\n      ModelSourceModel.Builder(\"test-id\")\n        .uri(\"https://example.com/model.glb\")\n        .build()\n    )\n    every { model.getProperties() } returns hashMapOf(\"uri\" to testValue)\n\n    model.bindTo(modelSource)\n\n    assertEquals(testValue, model.uri)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/generated/ModelSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass ModelSourceTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val expectedDelta = mockk<Expected<String, Byte>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n\n  @Before\n  fun prepareTest() {\n    every { expected.error } returns null\n    every { expectedDelta.error } returns null\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n\n    mockkStyle(style)\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleSourcePropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  private fun mockkStyle(style: MapboxStyleManager) {\n    every { style.addStyleSource(any(), any()) } returns expected\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n    every { style.getStyleSourceProperty(any(), any()) } returns styleProperty\n  }\n\n  @Test\n  fun getTypeTest() {\n    val testSource = modelSource(\"testId\") {}\n    assertEquals(\"model\", testSource.getType())\n  }\n\n  @Test\n  fun urlSet() {\n    val testSource = modelSource(\"testId\") {\n      url(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"url=abc\"))\n  }\n\n  @Test\n  fun urlSetAfterBind() {\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.url(\"abc\")\n\n    verify { style.setStyleSourceProperty(\"testId\", \"url\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun urlGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.url?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"url\") }\n  }\n\n  @Test\n  fun maxzoomSet() {\n    val testSource = modelSource(\"testId\") {\n      maxzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"maxzoom=1\"))\n  }\n\n  @Test\n  fun maxzoomSetAfterBind() {\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.maxzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun maxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.maxzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"maxzoom\") }\n  }\n\n  @Test\n  fun minzoomSet() {\n    val testSource = modelSource(\"testId\") {\n      minzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"minzoom=1\"))\n  }\n\n  @Test\n  fun minzoomSetAfterBind() {\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.minzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun minzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.minzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"minzoom\") }\n  }\n\n  @Test\n  fun tilesSet() {\n    val testSource = modelSource(\"testId\") {\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=[a, b, c]\"))\n  }\n\n  @Test\n  fun tilesSetAfterBind() {\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tiles\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[a, b, c]\")\n  }\n\n  @Test\n  fun tilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"a\", \"b\", \"c\"))\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(\"a\", \"b\", \"c\").toString(), testSource.tiles?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tiles\") }\n  }\n\n  @Test\n  fun modelsSet() {\n    val testSource = modelSource(\"testId\") {\n      models(listOf(ModelSourceModel.Builder(\"model\").uri(\"something://somewhere\").orientation(listOf(0.0, 0.0, 0.0)).position(listOf(0.0, 0.0)).build()))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    val modelSlot = slot<Value>()\n    verify { style.setStyleSourceProperty(\"testId\", \"models\", capture(modelSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{type=model}\"))\n    assertEquals(modelSlot.captured, TypeUtils.wrapToValue(hashMapOf(\"model\" to ModelSourceModel.Builder(\"model\").uri(\"something://somewhere\").orientation(listOf(0.0, 0.0, 0.0)).position(listOf(0.0, 0.0)).build())))\n  }\n\n  @Test\n  fun modelsSetAfterBind() {\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.models(listOf(ModelSourceModel.Builder(\"model\").uri(\"something://somewhere\").orientation(listOf(0.0, 0.0, 0.0)).position(listOf(0.0, 0.0)).build()))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"models\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{model={orientation=[0.0, 0.0, 0.0], position=[0.0, 0.0], uri=something://somewhere}}\")\n  }\n\n  @Test\n  fun modelsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(hashMapOf(\"model\" to ModelSourceModel.Builder(\"model\").uri(\"something://somewhere\").orientation(listOf(0.0, 0.0, 0.0)).position(listOf(0.0, 0.0)).build()))\n    val testSource = modelSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"model\", testSource.models?.first()?.id)\n    verify { style.getStyleSourceProperty(\"testId\", \"models\") }\n  }\n  // Default source property getters tests\n\n  @Test\n  fun defaultMaxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), ModelSource.defaultMaxzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"model\", \"maxzoom\") }\n  }\n\n  @Test\n  fun defaultMinzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), ModelSource.defaultMinzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"model\", \"minzoom\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/generated/RasterArraySourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass RasterArraySourceTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val expectedDelta = mockk<Expected<String, Byte>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n\n  @Before\n  fun prepareTest() {\n    every { expected.error } returns null\n    every { expectedDelta.error } returns null\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n\n    mockkStyle(style)\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleSourcePropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  private fun mockkStyle(style: MapboxStyleManager) {\n    every { style.addStyleSource(any(), any()) } returns expected\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n    every { style.getStyleSourceProperty(any(), any()) } returns styleProperty\n  }\n\n  @Test\n  fun getTypeTest() {\n    val testSource = rasterArraySource(\"testId\") {}\n    assertEquals(\"raster-array\", testSource.getType())\n  }\n\n  @Test\n  fun urlSet() {\n    val testSource = rasterArraySource(\"testId\") {\n      url(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"url=abc\"))\n  }\n\n  @Test\n  fun urlSetAfterBind() {\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.url(\"abc\")\n\n    verify { style.setStyleSourceProperty(\"testId\", \"url\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun urlGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.url?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"url\") }\n  }\n\n  @Test\n  fun tilesSet() {\n    val testSource = rasterArraySource(\"testId\") {\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=[a, b, c]\"))\n  }\n\n  @Test\n  fun tilesSetAfterBind() {\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tiles\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[a, b, c]\")\n  }\n\n  @Test\n  fun tilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"a\", \"b\", \"c\"))\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(\"a\", \"b\", \"c\").toString(), testSource.tiles?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tiles\") }\n  }\n\n  @Test\n  fun boundsSet() {\n    val testSource = rasterArraySource(\"testId\") {\n      bounds(listOf(0.0, 1.0, 2.0, 3.0))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"bounds=[0.0, 1.0, 2.0, 3.0]\"))\n  }\n\n  @Test\n  fun boundsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0))\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0).toString(), testSource.bounds?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"bounds\") }\n  }\n\n  @Test\n  fun minzoomSet() {\n    val testSource = rasterArraySource(\"testId\") {\n      minzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"minzoom=1\"))\n  }\n\n  @Test\n  fun minzoomSetAfterBind() {\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.minzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun minzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.minzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"minzoom\") }\n  }\n\n  @Test\n  fun maxzoomSet() {\n    val testSource = rasterArraySource(\"testId\") {\n      maxzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"maxzoom=1\"))\n  }\n\n  @Test\n  fun maxzoomSetAfterBind() {\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.maxzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun maxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.maxzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"maxzoom\") }\n  }\n\n  @Test\n  fun tileSizeSet() {\n    val testSource = rasterArraySource(\"testId\") {\n      tileSize(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tileSize=1\"))\n  }\n\n  @Test\n  fun tileSizeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.tileSize?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tileSize\") }\n  }\n\n  @Test\n  fun attributionSet() {\n    val testSource = rasterArraySource(\"testId\") {\n      attribution(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"attribution=abc\"))\n  }\n\n  @Test\n  fun attributionGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.attribution?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"attribution\") }\n  }\n\n  @Test\n  fun volatileSet() {\n    val testSource = rasterArraySource(\"testId\") {\n      volatile(true)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"volatile=true\"))\n  }\n\n  @Test\n  fun volatileSetAfterBind() {\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.volatile(true)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"volatile\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun volatileGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(true.toString(), testSource.volatile?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"volatile\") }\n  }\n\n  @Test\n  fun tileCacheBudgetSet() {\n    val testSource = rasterArraySource(\"testId\") {\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(\"{megabytes=100}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileCacheBudgetSetAfterBind() {\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{megabytes=100}\")\n  }\n\n  @Test\n  fun tileCacheBudgetGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val testSource = rasterArraySource(\"testId\") {}\n    testSource.bindTo(style)\n\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-cache-budget\") }\n  }\n  // Default source property getters tests\n\n  @Test\n  fun defaultMinzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), RasterArraySource.defaultMinzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-array\", \"minzoom\") }\n  }\n\n  @Test\n  fun defaultMaxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), RasterArraySource.defaultMaxzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-array\", \"maxzoom\") }\n  }\n\n  @Test\n  fun defaultVolatileGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n\n    assertEquals(true.toString(), RasterArraySource.defaultVolatile?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-array\", \"volatile\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/generated/RasterDemSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass RasterDemSourceTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val expectedDelta = mockk<Expected<String, Byte>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n\n  @Before\n  fun prepareTest() {\n    every { expected.error } returns null\n    every { expectedDelta.error } returns null\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n\n    mockkStyle(style)\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleSourcePropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  private fun mockkStyle(style: MapboxStyleManager) {\n    every { style.addStyleSource(any(), any()) } returns expected\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n    every { style.getStyleSourceProperty(any(), any()) } returns styleProperty\n  }\n\n  @Test\n  fun getTypeTest() {\n    val testSource = rasterDemSource(\"testId\") {}\n    assertEquals(\"raster-dem\", testSource.getType())\n  }\n\n  @Test\n  fun urlSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      url(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"url=abc\"))\n  }\n\n  @Test\n  fun urlSetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.url(\"abc\")\n\n    verify { style.setStyleSourceProperty(\"testId\", \"url\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun urlGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.url?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"url\") }\n  }\n\n  @Test\n  fun tilesSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=[a, b, c]\"))\n  }\n\n  @Test\n  fun tilesSetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tiles\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[a, b, c]\")\n  }\n\n  @Test\n  fun tilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"a\", \"b\", \"c\"))\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(\"a\", \"b\", \"c\").toString(), testSource.tiles?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tiles\") }\n  }\n\n  @Test\n  fun boundsSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      bounds(listOf(0.0, 1.0, 2.0, 3.0))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"bounds=[0.0, 1.0, 2.0, 3.0]\"))\n  }\n\n  @Test\n  fun boundsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0))\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0).toString(), testSource.bounds?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"bounds\") }\n  }\n\n  @Test\n  fun minzoomSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      minzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"minzoom=1\"))\n  }\n\n  @Test\n  fun minzoomSetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.minzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun minzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.minzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"minzoom\") }\n  }\n\n  @Test\n  fun maxzoomSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      maxzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"maxzoom=1\"))\n  }\n\n  @Test\n  fun maxzoomSetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.maxzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun maxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.maxzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"maxzoom\") }\n  }\n\n  @Test\n  fun tileSizeSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      tileSize(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tileSize=1\"))\n  }\n\n  @Test\n  fun tileSizeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.tileSize?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tileSize\") }\n  }\n\n  @Test\n  fun attributionSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      attribution(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"attribution=abc\"))\n  }\n\n  @Test\n  fun attributionGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.attribution?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"attribution\") }\n  }\n\n  @Test\n  fun encodingSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      encoding(Encoding.TERRARIUM)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"encoding=terrarium\"))\n  }\n\n  @Test\n  fun encodingGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"terrarium\")\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(Encoding.TERRARIUM, testSource.encoding)\n    verify { style.getStyleSourceProperty(\"testId\", \"encoding\") }\n  }\n\n  @Test\n  fun volatileSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      volatile(true)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"volatile=true\"))\n  }\n\n  @Test\n  fun volatileSetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.volatile(true)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"volatile\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun volatileGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(true.toString(), testSource.volatile?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"volatile\") }\n  }\n\n  @Test\n  fun prefetchZoomDeltaSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      prefetchZoomDelta(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(\"1\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun prefetchZoomDeltaSetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.prefetchZoomDelta(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun prefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.prefetchZoomDelta?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\") }\n  }\n\n  @Test\n  fun tileCacheBudgetSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(\"{megabytes=100}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileCacheBudgetSetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{megabytes=100}\")\n  }\n\n  @Test\n  fun tileCacheBudgetGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-cache-budget\") }\n  }\n\n  @Test\n  fun minimumTileUpdateIntervalSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      minimumTileUpdateInterval(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minimum-tile-update-interval\", capture(valueSlot)) }\n    assertEquals(\"1.0\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minimumTileUpdateIntervalSetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.minimumTileUpdateInterval(1.0)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minimum-tile-update-interval\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun minimumTileUpdateIntervalGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.minimumTileUpdateInterval?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"minimum-tile-update-interval\") }\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesSet() {\n    val testSource = rasterDemSource(\"testId\") {\n      maxOverscaleFactorForParentTiles(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\", capture(valueSlot)) }\n    assertEquals(\"1\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesSetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.maxOverscaleFactorForParentTiles(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.maxOverscaleFactorForParentTiles?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\") }\n  }\n\n  @Test\n  fun tileRequestsDelaySet() {\n    val testSource = rasterDemSource(\"testId\") {\n      tileRequestsDelay(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-requests-delay\", capture(valueSlot)) }\n    assertEquals(\"1.0\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileRequestsDelaySetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileRequestsDelay(1.0)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-requests-delay\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun tileRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.tileRequestsDelay?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-requests-delay\") }\n  }\n\n  @Test\n  fun tileNetworkRequestsDelaySet() {\n    val testSource = rasterDemSource(\"testId\") {\n      tileNetworkRequestsDelay(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-network-requests-delay\", capture(valueSlot)) }\n    assertEquals(\"1.0\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileNetworkRequestsDelaySetAfterBind() {\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileNetworkRequestsDelay(1.0)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-network-requests-delay\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun tileNetworkRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = rasterDemSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.tileNetworkRequestsDelay?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-network-requests-delay\") }\n  }\n\n  @Test\n  fun tileSetTest() {\n    val testSource = rasterDemSource(\"testId\") {\n      tileSet(\n        TileSet.Builder(\"testjson\", listOf(\"tile1\", \"tile2\")).description(\"description\")\n          .data(listOf(\"data\")).build()\n      )\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"tilejson=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"description=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"data=\"))\n  }\n\n  @Test\n  fun tileSetDslTest() {\n    val testSource = rasterDemSource(\"testId\") {\n      tileSet(tilejson = \"testjson\", tiles = listOf(\"tile1\", \"tile2\")) {\n        description(\"description\")\n        data(listOf(\"data\"))\n      }\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"tilejson=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"description=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"data=\"))\n  }\n  // Default source property getters tests\n\n  @Test\n  fun defaultMinzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), RasterDemSource.defaultMinzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"minzoom\") }\n  }\n\n  @Test\n  fun defaultMaxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), RasterDemSource.defaultMaxzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"maxzoom\") }\n  }\n\n  @Test\n  fun defaultEncodingGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"terrarium\")\n\n    assertEquals(Encoding.TERRARIUM.toString(), RasterDemSource.defaultEncoding?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"encoding\") }\n  }\n\n  @Test\n  fun defaultVolatileGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n\n    assertEquals(true.toString(), RasterDemSource.defaultVolatile?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"volatile\") }\n  }\n\n  @Test\n  fun defaultPrefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), RasterDemSource.defaultPrefetchZoomDelta?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"prefetch-zoom-delta\") }\n  }\n\n  @Test\n  fun defaultMinimumTileUpdateIntervalGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), RasterDemSource.defaultMinimumTileUpdateInterval?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"minimum-tile-update-interval\") }\n  }\n\n  @Test\n  fun defaultTileRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), RasterDemSource.defaultTileRequestsDelay?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"tile-requests-delay\") }\n  }\n\n  @Test\n  fun defaultTileNetworkRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), RasterDemSource.defaultTileNetworkRequestsDelay?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster-dem\", \"tile-network-requests-delay\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/generated/RasterSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass RasterSourceTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val expectedDelta = mockk<Expected<String, Byte>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n\n  @Before\n  fun prepareTest() {\n    every { expected.error } returns null\n    every { expectedDelta.error } returns null\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n\n    mockkStyle(style)\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleSourcePropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  private fun mockkStyle(style: MapboxStyleManager) {\n    every { style.addStyleSource(any(), any()) } returns expected\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n    every { style.getStyleSourceProperty(any(), any()) } returns styleProperty\n  }\n\n  @Test\n  fun getTypeTest() {\n    val testSource = rasterSource(\"testId\") {}\n    assertEquals(\"raster\", testSource.getType())\n  }\n\n  @Test\n  fun urlSet() {\n    val testSource = rasterSource(\"testId\") {\n      url(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"url=abc\"))\n  }\n\n  @Test\n  fun urlSetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.url(\"abc\")\n\n    verify { style.setStyleSourceProperty(\"testId\", \"url\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun urlGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.url?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"url\") }\n  }\n\n  @Test\n  fun tilesSet() {\n    val testSource = rasterSource(\"testId\") {\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=[a, b, c]\"))\n  }\n\n  @Test\n  fun tilesSetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tiles\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[a, b, c]\")\n  }\n\n  @Test\n  fun tilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"a\", \"b\", \"c\"))\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(\"a\", \"b\", \"c\").toString(), testSource.tiles?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tiles\") }\n  }\n\n  @Test\n  fun boundsSet() {\n    val testSource = rasterSource(\"testId\") {\n      bounds(listOf(0.0, 1.0, 2.0, 3.0))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"bounds=[0.0, 1.0, 2.0, 3.0]\"))\n  }\n\n  @Test\n  fun boundsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0))\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0).toString(), testSource.bounds?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"bounds\") }\n  }\n\n  @Test\n  fun minzoomSet() {\n    val testSource = rasterSource(\"testId\") {\n      minzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"minzoom=1\"))\n  }\n\n  @Test\n  fun minzoomSetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.minzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun minzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.minzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"minzoom\") }\n  }\n\n  @Test\n  fun maxzoomSet() {\n    val testSource = rasterSource(\"testId\") {\n      maxzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"maxzoom=1\"))\n  }\n\n  @Test\n  fun maxzoomSetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.maxzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun maxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.maxzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"maxzoom\") }\n  }\n\n  @Test\n  fun tileSizeSet() {\n    val testSource = rasterSource(\"testId\") {\n      tileSize(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tileSize=1\"))\n  }\n\n  @Test\n  fun tileSizeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.tileSize?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tileSize\") }\n  }\n\n  @Test\n  fun schemeSet() {\n    val testSource = rasterSource(\"testId\") {\n      scheme(Scheme.XYZ)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"scheme=xyz\"))\n  }\n\n  @Test\n  fun schemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"xyz\")\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(Scheme.XYZ, testSource.scheme)\n    verify { style.getStyleSourceProperty(\"testId\", \"scheme\") }\n  }\n\n  @Test\n  fun attributionSet() {\n    val testSource = rasterSource(\"testId\") {\n      attribution(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"attribution=abc\"))\n  }\n\n  @Test\n  fun attributionGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.attribution?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"attribution\") }\n  }\n\n  @Test\n  fun volatileSet() {\n    val testSource = rasterSource(\"testId\") {\n      volatile(true)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"volatile=true\"))\n  }\n\n  @Test\n  fun volatileSetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.volatile(true)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"volatile\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun volatileGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(true.toString(), testSource.volatile?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"volatile\") }\n  }\n\n  @Test\n  fun prefetchZoomDeltaSet() {\n    val testSource = rasterSource(\"testId\") {\n      prefetchZoomDelta(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(\"1\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun prefetchZoomDeltaSetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.prefetchZoomDelta(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun prefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.prefetchZoomDelta?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\") }\n  }\n\n  @Test\n  fun tileCacheBudgetSet() {\n    val testSource = rasterSource(\"testId\") {\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(\"{megabytes=100}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileCacheBudgetSetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{megabytes=100}\")\n  }\n\n  @Test\n  fun tileCacheBudgetGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-cache-budget\") }\n  }\n\n  @Test\n  fun minimumTileUpdateIntervalSet() {\n    val testSource = rasterSource(\"testId\") {\n      minimumTileUpdateInterval(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minimum-tile-update-interval\", capture(valueSlot)) }\n    assertEquals(\"1.0\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minimumTileUpdateIntervalSetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.minimumTileUpdateInterval(1.0)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minimum-tile-update-interval\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun minimumTileUpdateIntervalGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.minimumTileUpdateInterval?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"minimum-tile-update-interval\") }\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesSet() {\n    val testSource = rasterSource(\"testId\") {\n      maxOverscaleFactorForParentTiles(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\", capture(valueSlot)) }\n    assertEquals(\"1\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesSetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.maxOverscaleFactorForParentTiles(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.maxOverscaleFactorForParentTiles?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\") }\n  }\n\n  @Test\n  fun tileRequestsDelaySet() {\n    val testSource = rasterSource(\"testId\") {\n      tileRequestsDelay(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-requests-delay\", capture(valueSlot)) }\n    assertEquals(\"1.0\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileRequestsDelaySetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileRequestsDelay(1.0)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-requests-delay\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun tileRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.tileRequestsDelay?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-requests-delay\") }\n  }\n\n  @Test\n  fun tileNetworkRequestsDelaySet() {\n    val testSource = rasterSource(\"testId\") {\n      tileNetworkRequestsDelay(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-network-requests-delay\", capture(valueSlot)) }\n    assertEquals(\"1.0\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileNetworkRequestsDelaySetAfterBind() {\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileNetworkRequestsDelay(1.0)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-network-requests-delay\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun tileNetworkRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = rasterSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.tileNetworkRequestsDelay?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-network-requests-delay\") }\n  }\n\n  @Test\n  fun tileSetTest() {\n    val testSource = rasterSource(\"testId\") {\n      tileSet(\n        TileSet.Builder(\"testjson\", listOf(\"tile1\", \"tile2\")).description(\"description\")\n          .data(listOf(\"data\")).build()\n      )\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"tilejson=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"description=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"data=\"))\n  }\n\n  @Test\n  fun tileSetDslTest() {\n    val testSource = rasterSource(\"testId\") {\n      tileSet(tilejson = \"testjson\", tiles = listOf(\"tile1\", \"tile2\")) {\n        description(\"description\")\n        data(listOf(\"data\"))\n      }\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"tilejson=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"description=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"data=\"))\n  }\n  // Default source property getters tests\n\n  @Test\n  fun defaultMinzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), RasterSource.defaultMinzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"minzoom\") }\n  }\n\n  @Test\n  fun defaultMaxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), RasterSource.defaultMaxzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"maxzoom\") }\n  }\n\n  @Test\n  fun defaultSchemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"xyz\")\n\n    assertEquals(Scheme.XYZ.toString(), RasterSource.defaultScheme?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"scheme\") }\n  }\n\n  @Test\n  fun defaultVolatileGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n\n    assertEquals(true.toString(), RasterSource.defaultVolatile?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"volatile\") }\n  }\n\n  @Test\n  fun defaultPrefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), RasterSource.defaultPrefetchZoomDelta?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"prefetch-zoom-delta\") }\n  }\n\n  @Test\n  fun defaultMinimumTileUpdateIntervalGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), RasterSource.defaultMinimumTileUpdateInterval?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"minimum-tile-update-interval\") }\n  }\n\n  @Test\n  fun defaultTileRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), RasterSource.defaultTileRequestsDelay?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"tile-requests-delay\") }\n  }\n\n  @Test\n  fun defaultTileNetworkRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), RasterSource.defaultTileNetworkRequestsDelay?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"raster\", \"tile-network-requests-delay\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/sources/generated/VectorSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.sources.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.ShadowStyleManager\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.types.PromoteId\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowStyleManager::class])\nclass VectorSourceTest {\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val expectedDelta = mockk<Expected<String, Byte>>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n\n  @Before\n  fun prepareTest() {\n    every { expected.error } returns null\n    every { expectedDelta.error } returns null\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n\n    mockkStyle(style)\n\n    // For default property getters\n    mockkStatic(StyleManager::class)\n    every { StyleManager.getStyleSourcePropertyDefaultValue(any(), any()) } returns styleProperty\n  }\n\n  private fun mockkStyle(style: MapboxStyleManager) {\n    every { style.addStyleSource(any(), any()) } returns expected\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n    every { style.getStyleSourceProperty(any(), any()) } returns styleProperty\n  }\n\n  @Test\n  fun getTypeTest() {\n    val testSource = vectorSource(\"testId\") {}\n    assertEquals(\"vector\", testSource.getType())\n  }\n\n  @Test\n  fun urlSet() {\n    val testSource = vectorSource(\"testId\") {\n      url(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"url=abc\"))\n  }\n\n  @Test\n  fun urlSetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.url(\"abc\")\n\n    verify { style.setStyleSourceProperty(\"testId\", \"url\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"abc\")\n  }\n\n  @Test\n  fun urlGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.url?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"url\") }\n  }\n\n  @Test\n  fun tilesSet() {\n    val testSource = vectorSource(\"testId\") {\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=[a, b, c]\"))\n  }\n\n  @Test\n  fun tilesSetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tiles\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"[a, b, c]\")\n  }\n\n  @Test\n  fun tilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(\"a\", \"b\", \"c\"))\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(\"a\", \"b\", \"c\").toString(), testSource.tiles?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tiles\") }\n  }\n\n  @Test\n  fun boundsSet() {\n    val testSource = vectorSource(\"testId\") {\n      bounds(listOf(0.0, 1.0, 2.0, 3.0))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"bounds=[0.0, 1.0, 2.0, 3.0]\"))\n  }\n\n  @Test\n  fun boundsGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(listOf(0.0, 1.0, 2.0, 3.0))\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0).toString(), testSource.bounds?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"bounds\") }\n  }\n\n  @Test\n  fun schemeSet() {\n    val testSource = vectorSource(\"testId\") {\n      scheme(Scheme.XYZ)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"scheme=xyz\"))\n  }\n\n  @Test\n  fun schemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"xyz\")\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(Scheme.XYZ, testSource.scheme)\n    verify { style.getStyleSourceProperty(\"testId\", \"scheme\") }\n  }\n\n  @Test\n  fun minzoomSet() {\n    val testSource = vectorSource(\"testId\") {\n      minzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"minzoom=1\"))\n  }\n\n  @Test\n  fun minzoomSetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.minzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun minzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.minzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"minzoom\") }\n  }\n\n  @Test\n  fun maxzoomSet() {\n    val testSource = vectorSource(\"testId\") {\n      maxzoom(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"maxzoom=1\"))\n  }\n\n  @Test\n  fun maxzoomSetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.maxzoom(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"maxzoom\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun maxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.maxzoom?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"maxzoom\") }\n  }\n\n  @Test\n  fun attributionSet() {\n    val testSource = vectorSource(\"testId\") {\n      attribution(\"abc\")\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"attribution=abc\"))\n  }\n\n  @Test\n  fun attributionGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(\"abc\".toString(), testSource.attribution?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"attribution\") }\n  }\n\n  @Test\n  fun promoteIdSet() {\n    val testSource = vectorSource(\"testId\") {\n      promoteId(PromoteId(propertyName = \"abc\"))\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"promoteId=abc\"))\n  }\n\n  @Test\n  fun promoteIdGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"abc\")\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(PromoteId(propertyName = \"abc\"), testSource.promoteId)\n    verify { style.getStyleSourceProperty(\"testId\", \"promoteId\") }\n  }\n\n  @Test\n  fun volatileSet() {\n    val testSource = vectorSource(\"testId\") {\n      volatile(true)\n    }\n    testSource.bindTo(style)\n\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"volatile=true\"))\n  }\n\n  @Test\n  fun volatileSetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.volatile(true)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"volatile\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"true\")\n  }\n\n  @Test\n  fun volatileGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(true.toString(), testSource.volatile?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"volatile\") }\n  }\n\n  @Test\n  fun prefetchZoomDeltaSet() {\n    val testSource = vectorSource(\"testId\") {\n      prefetchZoomDelta(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(\"1\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun prefetchZoomDeltaSetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.prefetchZoomDelta(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun prefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.prefetchZoomDelta?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"prefetch-zoom-delta\") }\n  }\n\n  @Test\n  fun tileCacheBudgetSet() {\n    val testSource = vectorSource(\"testId\") {\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(\"{megabytes=100}\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileCacheBudgetSetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-cache-budget\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"{megabytes=100}\")\n  }\n\n  @Test\n  fun tileCacheBudgetGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-cache-budget\") }\n  }\n\n  @Test\n  fun minimumTileUpdateIntervalSet() {\n    val testSource = vectorSource(\"testId\") {\n      minimumTileUpdateInterval(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minimum-tile-update-interval\", capture(valueSlot)) }\n    assertEquals(\"1.0\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun minimumTileUpdateIntervalSetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.minimumTileUpdateInterval(1.0)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"minimum-tile-update-interval\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun minimumTileUpdateIntervalGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.minimumTileUpdateInterval?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"minimum-tile-update-interval\") }\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesSet() {\n    val testSource = vectorSource(\"testId\") {\n      maxOverscaleFactorForParentTiles(1L)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\", capture(valueSlot)) }\n    assertEquals(\"1\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesSetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.maxOverscaleFactorForParentTiles(1L)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1\")\n  }\n\n  @Test\n  fun maxOverscaleFactorForParentTilesGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1L.toString(), testSource.maxOverscaleFactorForParentTiles?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"max-overscale-factor-for-parent-tiles\") }\n  }\n\n  @Test\n  fun tileRequestsDelaySet() {\n    val testSource = vectorSource(\"testId\") {\n      tileRequestsDelay(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-requests-delay\", capture(valueSlot)) }\n    assertEquals(\"1.0\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileRequestsDelaySetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileRequestsDelay(1.0)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-requests-delay\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun tileRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.tileRequestsDelay?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-requests-delay\") }\n  }\n\n  @Test\n  fun tileNetworkRequestsDelaySet() {\n    val testSource = vectorSource(\"testId\") {\n      tileNetworkRequestsDelay(1.0)\n    }\n    testSource.bindTo(style)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-network-requests-delay\", capture(valueSlot)) }\n    assertEquals(\"1.0\", valueSlot.captured.toString())\n  }\n\n  @Test\n  fun tileNetworkRequestsDelaySetAfterBind() {\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n    testSource.tileNetworkRequestsDelay(1.0)\n\n    verify { style.setStyleSourceProperty(\"testId\", \"tile-network-requests-delay\", capture(valueSlot)) }\n    assertEquals(valueSlot.captured.toString(), \"1.0\")\n  }\n\n  @Test\n  fun tileNetworkRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val testSource = vectorSource(\"testId\") {}\n    testSource.bindTo(style)\n\n    assertEquals(1.0.toString(), testSource.tileNetworkRequestsDelay?.toString())\n    verify { style.getStyleSourceProperty(\"testId\", \"tile-network-requests-delay\") }\n  }\n\n  @Test\n  fun tileSetTest() {\n    val testSource = vectorSource(\"testId\") {\n      tileSet(\n        TileSet.Builder(\"testjson\", listOf(\"tile1\", \"tile2\")).description(\"description\")\n          .data(listOf(\"data\")).build()\n      )\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"tilejson=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"description=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"data=\"))\n  }\n\n  @Test\n  fun tileSetDslTest() {\n    val testSource = vectorSource(\"testId\") {\n      tileSet(tilejson = \"testjson\", tiles = listOf(\"tile1\", \"tile2\")) {\n        description(\"description\")\n        data(listOf(\"data\"))\n      }\n    }\n    testSource.bindTo(style)\n    verify { style.addStyleSource(\"testId\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"tiles=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"tilejson=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"description=\"))\n    assertTrue(valueSlot.captured.toString().contains(\"data=\"))\n  }\n  // Default source property getters tests\n\n  @Test\n  fun defaultSchemeGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(\"xyz\")\n\n    assertEquals(Scheme.XYZ.toString(), VectorSource.defaultScheme?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"scheme\") }\n  }\n\n  @Test\n  fun defaultMinzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), VectorSource.defaultMinzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"minzoom\") }\n  }\n\n  @Test\n  fun defaultMaxzoomGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), VectorSource.defaultMaxzoom?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"maxzoom\") }\n  }\n\n  @Test\n  fun defaultVolatileGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(true)\n\n    assertEquals(true.toString(), VectorSource.defaultVolatile?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"volatile\") }\n  }\n\n  @Test\n  fun defaultPrefetchZoomDeltaGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1L)\n\n    assertEquals(1L.toString(), VectorSource.defaultPrefetchZoomDelta?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"prefetch-zoom-delta\") }\n  }\n\n  @Test\n  fun defaultMinimumTileUpdateIntervalGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), VectorSource.defaultMinimumTileUpdateInterval?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"minimum-tile-update-interval\") }\n  }\n\n  @Test\n  fun defaultTileRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), VectorSource.defaultTileRequestsDelay?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"tile-requests-delay\") }\n  }\n\n  @Test\n  fun defaultTileNetworkRequestsDelayGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    assertEquals(1.0.toString(), VectorSource.defaultTileNetworkRequestsDelay?.toString())\n    verify { StyleManager.getStyleSourcePropertyDefaultValue(\"vector\", \"tile-network-requests-delay\") }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/terrain/generated/TerrainTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.extension.style.terrain.generated\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass TerrainTest {\n  private val sourceId = \"1\"\n  private val style = mockk<MapboxStyleManager>(relaxUnitFun = true, relaxed = true)\n  private val styleProperty = mockk<StylePropertyValue>()\n  private val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n  private val valueSlot = slot<Value>()\n\n  @Before\n  fun prepareTest() {\n    every { style.getStyleTerrainProperty(any()) } returns styleProperty\n    every { styleProperty.kind } returns StylePropertyValueKind.CONSTANT\n    every { style.setStyleTerrainProperty(any(), any()) } returns expected\n    every { style.setStyleTerrain(any()) } returns expected\n    every { expected.error } returns null\n  }\n\n  @After\n  fun cleanup() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun sourceIdTest() {\n    val terrain = terrain(sourceId)\n    terrain.bindTo(style)\n    verify { style.setStyleTerrain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"source=$sourceId\"))\n  }\n\n  @Test\n  fun exaggerationSet() {\n    val terrain = terrain(sourceId) {\n      exaggeration(1.0)\n    }\n    terrain.bindTo(style)\n    verify { style.setStyleTerrain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"exaggeration=1.0\"))\n  }\n\n  @Test\n  fun exaggerationSetAfterInitialization() {\n    val terrain = terrain(sourceId) { }\n    terrain.bindTo(style)\n    terrain.exaggeration(1.0)\n    verify { style.setStyleTerrainProperty(\"exaggeration\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"1.0\"))\n  }\n\n  @Test\n  fun exaggerationGet() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n\n    val terrain = terrain(sourceId) { }\n    terrain.bindTo(style)\n    assertEquals(1.0.toString(), terrain.exaggeration!!.toString())\n    verify { style.getStyleTerrainProperty(\"exaggeration\") }\n  }\n\n  // Expression Tests\n\n  @Test\n  fun exaggerationAsExpressionGetNull() {\n    val terrain = terrain(sourceId) { }\n    terrain.bindTo(style)\n    assertEquals(null, terrain.exaggerationAsExpression)\n    verify { style.getStyleTerrainProperty(\"exaggeration\") }\n  }\n\n  @Test\n  fun exaggerationAsExpressionGetFromLiteral() {\n    every { styleProperty.value } returns TypeUtils.wrapToValue(1.0)\n    val terrain = terrain(sourceId) { }\n    terrain.bindTo(style)\n    assertEquals(1.0, terrain.exaggerationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, terrain.exaggeration!!, 1E-5)\n    verify { style.getStyleTerrainProperty(\"exaggeration\") }\n  }\n\n  @Test\n  fun exaggerationTransitionSet() {\n    val terrain = terrain(sourceId) {\n      exaggerationTransition(\n        transitionOptions {\n          duration(100)\n          delay(200)\n        }\n      )\n    }\n    terrain.bindTo(style)\n    verify { style.setStyleTerrain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"exaggeration-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun exaggerationTransitionSetAfterInitialization() {\n    val terrain = terrain(sourceId) { }\n    terrain.bindTo(style)\n    terrain.exaggerationTransition(\n      transitionOptions {\n        duration(100)\n        delay(200)\n      }\n    )\n    verify { style.setStyleTerrainProperty(\"exaggeration-transition\", capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"{duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun exaggerationTransitionGet() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val terrain = terrain(sourceId) {}\n    terrain.bindTo(style)\n    assertEquals(transition.toValue().toString(), terrain.exaggerationTransition!!.toValue().toString())\n    verify { style.getStyleTerrainProperty(\"exaggeration-transition\") }\n  }\n\n  @Test\n  fun exaggerationTransitionGetNull() {\n    val transition = \"wrong type\"\n    every { styleProperty.value } returns TypeUtils.wrapToValue(transition)\n    val terrain = terrain(sourceId) {}\n    terrain.bindTo(style)\n    assertEquals(null, terrain.exaggerationTransition)\n    verify { style.getStyleTerrainProperty(\"exaggeration-transition\") }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun exaggerationTransitionGetException() {\n    val terrain = terrain(sourceId) {}\n    terrain.exaggerationTransition\n  }\n\n  @Test\n  fun exaggerationTransitionSetDsl() {\n    val terrain = terrain(sourceId) {\n      exaggerationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    terrain.bindTo(style)\n    verify { style.setStyleTerrain(capture(valueSlot)) }\n    assertTrue(valueSlot.captured.toString().contains(\"exaggeration-transition={duration=100, delay=200}\"))\n  }\n\n  @Test\n  fun getTerrainTest() {\n    assertNotNull(style.getTerrain(sourceId))\n    verify(exactly = 0) { style.setStyleTerrain(any()) }\n  }\n\n  @Test\n  fun removeTerrainTest() {\n    style.removeTerrain()\n    verify { style.setStyleTerrain(Value.nullValue()) }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/utils/ColorUtilsTest.kt",
    "content": "package com.mapbox.maps.extension.style.utils\n\nimport android.graphics.Color\nimport android.os.Build.VERSION_CODES\nimport androidx.core.graphics.alpha\nimport androidx.core.graphics.blue\nimport androidx.core.graphics.green\nimport androidx.core.graphics.red\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\nimport java.text.DecimalFormat\nimport java.text.NumberFormat\nimport java.util.Locale\nimport kotlin.math.roundToInt\n\n// Run with Robolectric due to `Method argb in android.graphics.Color not mocked`\n@RunWith(RobolectricTestRunner::class)\n// Version O is required to use Color.arg(float, float, float, float) method\n@Config(sdk = [VERSION_CODES.O])\nclass ColorUtilsTest {\n  @Test\n  fun `255 RGBA strings to Color int`() {\n    repeat(255) { value ->\n      val input = \"rgba($value,$value,$value,${value / 255F})\"\n      val result = ColorUtils.rgbaToColor(input)\n      assertEquals(Color.argb(value, value, value, value), result)\n    }\n  }\n\n  @Test\n  fun `255 RGBA expressions to Color int`() {\n    repeat(255) { value ->\n      val input = Expression.rgba {\n        this.literal(value.toLong())\n        this.literal(value.toLong())\n        this.literal(value.toLong())\n        this.literal(value / 255.0)\n      }\n      val result = ColorUtils.rgbaExpressionToColorInt(input)\n      assertEquals(Color.argb(value, value, value, value), result)\n    }\n  }\n\n  @Test\n  fun `255 RGBA expressions to Color string`() {\n    repeat(255) { value ->\n      val input = Expression.rgba {\n        this.literal(value.toLong())\n        this.literal(value.toLong())\n        this.literal(value.toLong())\n        this.literal(value / 255.0)\n      }\n      val result = ColorUtils.rgbaExpressionToColorString(input)\n      val decimalFormat = NumberFormat.getNumberInstance(Locale.US) as DecimalFormat\n      decimalFormat.applyPattern(\"#.########\")\n      val alphaString = decimalFormat.format(value / 255.0)\n      assertEquals(\"rgba($value, $value, $value, $alphaString)\", result)\n    }\n  }\n\n  @Test\n  fun `255 RGB strings to Color int`() {\n    repeat(255) { value ->\n      val input = \"rgb($value,$value,$value)\"\n      val result = ColorUtils.rgbaToColor(input)\n      assertEquals(Color.rgb(value, value, value), result)\n    }\n  }\n\n  @Test\n  fun `255 RGB expressions to Color int`() {\n    repeat(255) { value ->\n      val input = Expression.rgb {\n        this.literal(value.toLong())\n        this.literal(value.toLong())\n        this.literal(value.toLong())\n      }\n      val result = ColorUtils.rgbaExpressionToColorInt(input)\n      assertEquals(Color.rgb(value, value, value), result)\n    }\n  }\n\n  @Test\n  fun `255 RGB expressions to Color string`() {\n    repeat(255) { value ->\n      val input = Expression.rgb {\n        this.literal(value.toLong())\n        this.literal(value.toLong())\n        this.literal(value.toLong())\n      }\n      val result = ColorUtils.rgbaExpressionToColorString(input)\n      assertEquals(\"rgba($value, $value, $value, 1)\", result)\n    }\n  }\n\n  @Test\n  fun rgbaToColor_decimalComponent() {\n    val input = \"rgba(255,128.0000952303,0,0.7)\"\n    val result = ColorUtils.rgbaToColor(input)\n    assertEquals(Color.argb(0.7f, 1.0F, 0.5f, 0f), result)\n    assertEquals(Color.argb(179, 255, 128, 0), result)\n  }\n\n  @Test\n  fun rgbaToColor_decimalComponent_floor() {\n    val input = \"rgba(255,128.70123,0,0.7)\"\n    val result = ColorUtils.rgbaToColor(input)\n    assertEquals(Color.argb(0.7f, 1.0F, 0.5f, 0f), result)\n    assertEquals(Color.argb(179, 255, 128, 0), result)\n  }\n\n  @Test\n  fun rgbaExpressionToColorIntTest() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    val result = ColorUtils.rgbaExpressionToColorInt(expression)\n    assertEquals(Color.RED, result)\n  }\n\n  @Test\n  fun rgbaExpressionToColorStringTest() {\n    val expression = rgba {\n      literal(255)\n      literal(0)\n      literal(0)\n      literal(1.0)\n    }\n    val result = ColorUtils.rgbaExpressionToColorString(expression)\n    assertEquals(\"rgba(255, 0, 0, 1)\", result)\n  }\n\n  @Test\n  fun colorIntToRgbaExpressionTest() {\n    repeat(255) { value ->\n      val expression = rgba {\n        literal(value.toLong())\n        literal(value.toLong())\n        literal(value.toLong())\n        // We only care about 8 decimal values\n        literal(((value / 255.0) * 1e8).roundToInt() / 1e8)\n      }\n      val result =\n        ColorUtils.colorIntToRgbaExpression(Color.argb(value, value, value, value)).toString()\n      assertEquals(expression.toString(), result)\n    }\n  }\n\n  @Test\n  fun `color to RGBA string and back`() {\n    repeat(255) { value ->\n      val color = Color.argb(value, value, value, value)\n      val colorString = ColorUtils.colorToRgbaString(color)\n      val backToColor = ColorUtils.rgbaToColor(colorString)!!\n      assertEquals(\n        \"Expected argb(${color.alpha}, ${color.red}, ${color.green}, ${color.blue}) but got argb(${backToColor.alpha}, ${backToColor.red}, ${backToColor.green}, ${backToColor.blue})\",\n        color,\n        backToColor\n      )\n    }\n  }\n\n  @Test\n  fun colorToRgbaArray() {\n    repeat(255) { value ->\n      val color = Color.argb(value, value, value, value)\n      val result = ColorUtils.colorToRgbaArray(color)\n      val expectedArray = floatArrayOf(value.toFloat(), value.toFloat(), value.toFloat(), value / 255F)\n      assertTrue(\"${expectedArray.joinToString()} different than ${result.joinToString()}\", expectedArray contentEquals result)\n    }\n  }\n\n  @Test\n  fun colorToGlRgbaArray() {\n    val result = ColorUtils.colorToGlRgbaArray(Color.RED)\n    assertTrue(floatArrayOf(1f, 0f, 0f, 1f) contentEquals result)\n  }\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/utils/PromoteIdTest.kt",
    "content": "package com.mapbox.maps.extension.style.utils\n\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.coalesce\nimport com.mapbox.maps.extension.style.types.PromoteId\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\nclass PromoteIdTest {\n\n  @Test\n  fun fromProperty_String() {\n    val expected = PromoteId(\"property\")\n    assertEquals(expected, PromoteId.fromProperty(\"property\"))\n  }\n\n  @Test\n  fun fromProperty_EmptyString() {\n    val expected = PromoteId(\"\")\n    assertEquals(expected, PromoteId.fromProperty(\"\"))\n  }\n\n  @Test\n  fun fromProperty_HashMap() {\n    val expected = PromoteId(\"abc\", \"source\")\n    val actual = PromoteId.fromProperty(hashMapOf(\"source\" to \"abc\"))\n    assertEquals(expected, actual)\n  }\n\n  @Test\n  fun fromProperty_EmptyHashMap() {\n    val expected = PromoteId(\"\")\n    val actual = PromoteId.fromProperty(hashMapOf<String, String>())\n    assertEquals(expected, actual)\n  }\n\n  @Test\n  fun fromProperty_NullSource() {\n    val expected = PromoteId(\"abc\", null)\n    assertEquals(expected, PromoteId.fromProperty(\"abc\"))\n  }\n\n  @Test\n  fun fromProperty_EmptyPropertyAndValidSource() {\n    val expected = PromoteId(\"\", \"source\")\n    val actual = PromoteId.fromProperty(hashMapOf(\"source\" to \"\"))\n    assertEquals(expected, actual)\n  }\n\n  @Test(expected = UnsupportedOperationException::class)\n  fun fromProperty_UnsupportedType() {\n    PromoteId.fromProperty(intArrayOf(1, 2, 3))\n  }\n\n  @Test(expected = UnsupportedOperationException::class)\n  fun fromProperty_UnsupportedDataClassType() {\n    PromoteId.fromProperty(MockType(\"source\", \"abc\"))\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun fromProperty_InvalidHashMapType() {\n    PromoteId.fromProperty(hashMapOf(1 to 2))\n  }\n\n  @Test\n  fun fromProperty_Expression() {\n    val expected = PromoteId(\n      coalesce {\n        get { literal(\"building_id\") }\n        id()\n      },\n      \"building\"\n    )\n    val actual = PromoteId.fromProperty(\n      hashMapOf(\n        \"building\" to listOf(\n          \"coalesce\", listOf(\"get\", \"building_id\"), listOf(\"id\")\n        )\n      )\n    )\n\n    assertEquals(expected, actual)\n  }\n\n  @Test\n  fun fromProperty_ExpressionNullSource() {\n    val expected = PromoteId(\n      coalesce {\n        get { literal(\"building_id\") }\n        id()\n      },\n    )\n    val actual = PromoteId.fromProperty(\n      listOf(\n        \"coalesce\", listOf(\"get\", \"building_id\"), listOf(\"id\")\n      )\n    )\n\n    assertEquals(expected, actual)\n  }\n\n  private data class MockType(val a: String, val b: String)\n}"
  },
  {
    "path": "extension-style/src/test/java/com/mapbox/maps/extension/style/utils/TypeUtilsTest.kt",
    "content": "package com.mapbox.maps.extension.style.utils\n\nimport android.graphics.Color\nimport com.google.gson.JsonObject\nimport com.google.gson.JsonPrimitive\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.types.StyleTransition\nimport com.mapbox.maps.extension.style.types.formatted\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport io.mockk.every\nimport io.mockk.mockk\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass TypeUtilsTest {\n  private val expected = mockk<Expected<String, Value>>(relaxed = true)\n\n  @Before\n  fun prepare() {\n    every { expected.error } returns null\n    every { expected.value } returns Value(0)\n  }\n\n  @Test\n  fun wrapToValue_Int() {\n    testWrapToValue(123)\n  }\n\n  @Test\n  fun wrapToValue_Long() {\n    testWrapToValue(123L)\n  }\n\n  @Test\n  fun wrapToValue_String() {\n    testWrapToValue(\"abc\")\n  }\n\n  @Test\n  fun wrapToValue_Boolean() {\n    testWrapToValue(true)\n  }\n\n  @Test\n  fun wrapToValue_Double() {\n    testWrapToValue(0.01)\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_Double_NaN() {\n    testWrapToValue(Double.NaN)\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_Double_POSITIVE_INFINITY() {\n    testWrapToValue(Double.POSITIVE_INFINITY)\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_Double_NEGATIVE_INFINITY() {\n    testWrapToValue(Double.NEGATIVE_INFINITY)\n  }\n\n  @Test\n  fun wrapToValue_Float() {\n    val result = TypeUtils.wrapToValue(0.01f)\n    assertEquals(0.01f.toDouble(), result.contents)\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_Float_NaN() {\n    testWrapToValue(Float.NaN)\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_Float_POSITIVE_INFINITY() {\n    testWrapToValue(Float.POSITIVE_INFINITY)\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_Float_NEGATIVE_INFINITY() {\n    testWrapToValue(Float.NEGATIVE_INFINITY)\n  }\n\n  private fun testWrapToValue(value: Any) {\n    val result = TypeUtils.wrapToValue(value)\n    assertEquals(value.toString(), result.toString())\n  }\n\n  @Test\n  fun wrapToValue_IntArray() {\n    val result = TypeUtils.wrapToValue(intArrayOf(1, 2, 3))\n    assertEquals(\"[1, 2, 3]\", result.toString())\n  }\n\n  @Test\n  fun wrapToValue_BooleanArray() {\n    val result = TypeUtils.wrapToValue(booleanArrayOf(true, true, false))\n    assertEquals(\"[true, true, false]\", result.toString())\n  }\n\n  @Test\n  fun wrapToValue_DoubleArray() {\n    val result = TypeUtils.wrapToValue(doubleArrayOf(0.01, 0.02, 0.03))\n    assertEquals(\"[0.01, 0.02, 0.03]\", result.toString())\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_DoubleArray_contains_NaN() {\n    TypeUtils.wrapToValue(doubleArrayOf(0.01, 0.02, Double.NaN))\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_DoubleArray_contains_POSITIVE_INFINITY() {\n    TypeUtils.wrapToValue(doubleArrayOf(0.01, 0.02, Double.POSITIVE_INFINITY))\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_DoubleArray_contains_NEGATIVE_INFINITY() {\n    TypeUtils.wrapToValue(doubleArrayOf(0.01, 0.02, Double.NEGATIVE_INFINITY))\n  }\n\n  @Test\n  fun wrapToValue_FloatArray() {\n    val result = TypeUtils.wrapToValue(floatArrayOf(1.0f, 2.0f, 3.0f))\n    assertEquals(\"[1.0, 2.0, 3.0]\", result.toString())\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_FloatArray_contains_NaN() {\n    TypeUtils.wrapToValue(floatArrayOf(0.01f, 0.02f, Float.NaN))\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_FloatArray_contains_POSITIVE_INFINITY() {\n    TypeUtils.wrapToValue(floatArrayOf(0.01f, 0.02f, Float.POSITIVE_INFINITY))\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun wrapToValue_FloatArray_contains_NEGATIVE_INFINITY() {\n    TypeUtils.wrapToValue(floatArrayOf(0.01f, 0.02f, Float.NEGATIVE_INFINITY))\n  }\n\n  @Test\n  fun wrapToValue_LongArray() {\n    val result = TypeUtils.wrapToValue(longArrayOf(1L, 2L, 3L))\n    assertEquals(\"[1, 2, 3]\", result.toString())\n  }\n\n  @Test\n  fun wrapToValue_StringArray() {\n    val result = TypeUtils.wrapToValue(arrayOf(\"ABC\", \"DEF\", \"GHI\"))\n    assertEquals(\"[ABC, DEF, GHI]\", result.toString())\n  }\n\n  @Test\n  fun wrapToValue_MixedArray() {\n    val result = TypeUtils.wrapToValue(arrayOf(\"ABC\", 66, \"GHI\"))\n    assertEquals(\"[ABC, 66, GHI]\", result.toString())\n  }\n\n  @Test\n  fun wrapToValue_ArrayList() {\n    val arraylist = ArrayList<String>()\n    arraylist.add(\"abc\")\n    arraylist.add(\"def\")\n    val result = TypeUtils.wrapToValue(arraylist)\n    assertEquals(\"[abc, def]\", result.toString())\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun wrapToValue_NonStringArray() {\n    TypeUtils.wrapToValue(arrayOf(MockData(1, \"a\")))\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun wrapToValue_UnsupportedClass() {\n    TypeUtils.wrapToValue(MockData(1, \"a\"))\n  }\n\n  @Test\n  fun wrapToValue_StringHashMap() {\n    val map = HashMap<String, String>()\n    map[\"abc\"] = \"def\"\n    map[\"abcd\"] = \"defg\"\n    val result = TypeUtils.wrapToValue(map)\n    assertEquals(\"{abc=def, abcd=defg}\", result.toString())\n  }\n\n  @Test(expected = ClassCastException::class)\n  fun wrapToValue_WrongKeyHashMap() {\n    val map = HashMap<Int, String>()\n    map[1] = \"def\"\n    map[2] = \"defg\"\n    TypeUtils.wrapToValue(map)\n  }\n\n  @Test\n  fun wrapToValue_IntHashMap() {\n    val map = HashMap<String, Int>()\n    map[\"abc\"] = 1\n    map[\"def\"] = 2\n    val result = TypeUtils.wrapToValue(map)\n    assertEquals(\"{abc=1, def=2}\", result.toString())\n  }\n\n  @Test\n  fun wrapToValue_NestedHashMap() {\n    val map = HashMap<String, Any>()\n    map[\"abc\"] = 1\n    map[\"def\"] = 2\n    val map1 = HashMap<String, Any>()\n    map1[\"abc\"] = \"def\"\n    map1[\"abcd\"] = \"defg\"\n    map1[\"nested\"] = map\n    val result = TypeUtils.wrapToValue(map1)\n    assertEquals(\"{abc=def, nested={abc=1, def=2}, abcd=defg}\", result.toString())\n  }\n\n  @Test\n  fun wrapToValue_Json() {\n    // TODO add support of Json after introducing Value.\n    val innerObject = JsonObject()\n    innerObject.addProperty(\"name\", \"john\")\n    val jsonObject = JsonObject()\n    jsonObject.add(\"publisher\", innerObject)\n\n//    val result = TypeUtils.wrapToValue(jsonObject)\n  }\n\n  @Test\n  fun wrapToValue_JsonPrimitiveNumber() {\n    val jsonPrimitive = JsonPrimitive(1)\n\n    val result = TypeUtils.wrapToValue(jsonPrimitive)\n    assertEquals(1.0, result.contents)\n  }\n\n  @Test\n  fun wrapToValue_JsonPrimitiveBoolean() {\n    val jsonPrimitive = JsonPrimitive(true)\n\n    val result = TypeUtils.wrapToValue(jsonPrimitive)\n    assertEquals(true, result.contents)\n  }\n\n  @Test\n  fun wrapToValue_JsonPrimitiveString() {\n    val jsonPrimitive = JsonPrimitive(\"abc\")\n\n    val result = TypeUtils.wrapToValue(jsonPrimitive)\n    assertEquals(\"abc\", result.contents)\n  }\n\n  @Test\n  fun wrapToValue_Expression() {\n    val result = TypeUtils.wrapToValue(pi())\n    assertEquals(pi().toString(), result.toString())\n  }\n\n  @Test\n  fun wrapToValue_Formatted() {\n    val result = TypeUtils.wrapToValue(\n      formatted {\n        formattedSection(\"abc\") {\n          fontScale = 1.0\n        }\n      }\n    )\n    assertEquals(\"[[abc, {font-scale=1.0}]]\", result.contents.toString())\n  }\n\n  @Test\n  fun wrapToValue_StyleTransition() {\n    val result = TypeUtils.wrapToValue(\n      transitionOptions {\n        duration(100)\n        delay(100)\n      }\n    )\n    assertEquals(\"{duration=100, delay=100}\", result.contents.toString())\n  }\n\n  @Test\n  fun wrapToValue_LayerProperty() {\n    val result = TypeUtils.wrapToValue(Visibility.VISIBLE)\n    assertEquals(\"visible\", result.contents.toString())\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_Long() {\n    val styleProperty = StylePropertyValue(Value(123), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<Long>()\n    assertEquals(123L, result)\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_Double() {\n    val styleProperty = StylePropertyValue(Value(0.1), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<Double>()\n    assertEquals(0.1, result, 1E-10)\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_Boolean() {\n    val styleProperty = StylePropertyValue(Value(true), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<Boolean>()\n    assertEquals(true, result)\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_String() {\n    val styleProperty = StylePropertyValue(Value(\"abc\"), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<String>()\n    assertEquals(\"abc\", result)\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_LongArray() {\n    val array = longArrayOf(1L, 2L, 3L)\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(array), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<List<Long>>()\n    assertTrue(array contentEquals result.toTypedArray().toLongArray())\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_DoubleArray() {\n    val array = doubleArrayOf(1.0, 2.0, 3.0)\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(array), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<List<Double>>()\n    assertTrue(array contentEquals result.toTypedArray().toDoubleArray())\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_BooleanArray() {\n    val array = booleanArrayOf(true, true, false)\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(array), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<List<Boolean>>()\n    assertTrue(array contentEquals result.toTypedArray().toBooleanArray())\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_StringArray() {\n    val array = arrayOf(\"a\", \"b\")\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(array), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<List<String>>()\n    assertTrue(array contentEquals result.toTypedArray())\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_HashMapString() {\n    val map = HashMap<String, String>()\n    map[\"abc\"] = \"def\"\n    map[\"ddd\"] = \"fff\"\n\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(map), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<HashMap<String, String>>()\n    assertTrue(map.keys == result.keys)\n    map.keys.forEach {\n      assertEquals(map[it], result[it])\n    }\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_HashMapDouble() {\n    val map = HashMap<String, Double>()\n    map[\"abc\"] = 1.0\n    map[\"ddd\"] = 2.0\n\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(map), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<HashMap<String, Double>>()\n    assertTrue(map.keys == result.keys)\n    map.keys.forEach {\n      assertEquals(map[it], result[it])\n    }\n  }\n\n  @Test\n  fun unwrapStyleProperty_constant_nestedHashMap() {\n    val map = HashMap<String, Any>()\n    map[\"abc\"] = 1\n    map[\"def\"] = 2\n    val map1 = HashMap<String, Any>()\n    map1[\"abc\"] = \"def\"\n    map1[\"abcd\"] = \"defg\"\n    map1[\"nested\"] = map\n\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(map1), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<HashMap<String, Any>>()\n\n    assertTrue(map1.keys == result.keys)\n    map.keys.forEach {\n      assertEquals(map1[it], result[it])\n    }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun unwrapStyleProperty_constant_mismatch_type() {\n    val styleProperty = StylePropertyValue(Value(123), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.unwrap<Int>()\n    assertEquals(123, result)\n  }\n\n  @Test\n  fun silentUnwrapStyleProperty_constant_mismatch_type() {\n    val styleProperty = StylePropertyValue(Value(123), StylePropertyValueKind.CONSTANT)\n\n    val result = styleProperty.silentUnwrap<String>()\n    assertEquals(null, result)\n  }\n\n  @Test\n  fun unwrapTransitionAsHashMap() {\n    val styleProperty = StylePropertyValue(\n      TypeUtils.wrapToValue(\n        transitionOptions {\n          delay(100)\n          duration(200)\n        }\n      ),\n      StylePropertyValueKind.TRANSITION\n    )\n\n    val result = styleProperty.unwrap<StyleTransition>()\n    assertEquals(100L, result.delay)\n    assertEquals(200L, result.duration)\n  }\n\n  @Test\n  fun unwrapTransitionAsList() {\n    val styleProperty = StylePropertyValue(\n      TypeUtils.wrapToValue(longArrayOf(102, 103)),\n      StylePropertyValueKind.TRANSITION\n    )\n\n    val result = styleProperty.unwrap<StyleTransition>()\n    assertEquals(102L, result.duration)\n    assertEquals(103L, result.delay)\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun unwrapTransitionException() {\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(\"test\"), StylePropertyValueKind.TRANSITION)\n\n    styleProperty.unwrap<StyleTransition>()\n  }\n\n  @Test\n  fun unwrapExpression() {\n    val expression = sum {\n      pi()\n      literal(true)\n      literal(\"abc\")\n    }\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(expression), StylePropertyValueKind.EXPRESSION)\n\n    val result = styleProperty.unwrap<Expression>()\n    assertEquals(\"[+, [pi], true, abc]\", result.toString())\n  }\n\n  @Test\n  fun unwrapFormatExpression() {\n    val expression = format {\n      formatSection(\"cyan\") {\n        fontScale(0.9)\n        textFont(listOf(\"Open Sans Regular\", \"Arial Unicode MS Regular\"))\n        textColor(Color.CYAN)\n      }\n      formatSection(\"black\") {\n        fontScale(\n          get {\n            literal(\"scale\")\n          }\n        )\n        textFont(listOf(\"Open Sans Regular\", \"Arial Unicode MS Regular\"))\n        textColor(\n          rgba {\n            literal(0.0)\n            literal(0.0)\n            literal(0.0)\n            literal(1.0)\n          }\n        )\n      }\n    }\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(expression), StylePropertyValueKind.EXPRESSION)\n\n    val result = styleProperty.unwrap<Expression>()\n    assertEquals(\n      expression.toString(),\n      result.toString()\n    )\n  }\n\n  @Test\n  fun unwrapExpressionLiteralLong() {\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(literal(1)), StylePropertyValueKind.EXPRESSION)\n\n    val result = styleProperty.unwrap<Expression>()\n    assertEquals(\"1\", result.toString())\n  }\n\n  @Test\n  fun unwrapExpressionLiteralDouble() {\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(literal(1.0)), StylePropertyValueKind.EXPRESSION)\n\n    val result = styleProperty.unwrap<Expression>()\n    assertEquals(\"1.0\", result.toString())\n  }\n\n  @Test\n  fun unwrapExpressionLiteralBoolean() {\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(literal(true)), StylePropertyValueKind.EXPRESSION)\n\n    val result = styleProperty.unwrap<Expression>()\n    assertEquals(\"true\", result.toString())\n  }\n\n  @Test\n  fun unwrapExpressionLiteralString() {\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(literal(\"abc\")), StylePropertyValueKind.EXPRESSION)\n\n    val result = styleProperty.unwrap<Expression>()\n    assertEquals(\"abc\", result.toString())\n  }\n\n  @Test\n  fun unwrapExpressionNested() {\n    val expression = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0)\n        rgba {\n          literal(33)\n          literal(102)\n          literal(172)\n          literal(0)\n        }\n      }\n      stop {\n        literal(0.2)\n        rgb {\n          literal(103)\n          literal(169)\n          literal(207)\n        }\n      }\n      stop {\n        literal(0.4)\n        rgb {\n          literal(209)\n          literal(229)\n          literal(240)\n        }\n      }\n      stop {\n        literal(0.6)\n        rgb {\n          literal(253)\n          literal(219)\n          literal(240)\n        }\n      }\n      stop {\n        literal(0.8)\n        rgb {\n          literal(239)\n          literal(138)\n          literal(98)\n        }\n      }\n      stop {\n        literal(1)\n        rgb {\n          literal(178)\n          literal(24)\n          literal(43)\n        }\n      }\n    }\n    val styleProperty =\n      StylePropertyValue(TypeUtils.wrapToValue(expression), StylePropertyValueKind.EXPRESSION)\n\n    val result = styleProperty.unwrap<Expression>()\n    assertEquals(expression.toString(), result.toString())\n  }\n\n  @Test\n  fun featureTest() {\n    val featureString =\n      \"{\\\"type\\\":\\\"Feature\\\",\\\"bbox\\\":[100.0,0.0,-100.0,105.0,1.0,0.0],\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[125.6,10.1]},\\\"properties\\\":{\\\"name\\\":\\\"Dinagat Islands\\\"}}\"\n    val actual = Feature.fromJson(featureString).toValue()\n    assertEquals(Value.valueOf(featureString), actual)\n  }\n\n  @Test\n  fun unwrapRawExpression() {\n    val expressionString = \"\"\"\n      [\"match\",[\"get\",\"data_property\"],[0],true,false]\n    \"\"\".trimIndent()\n    val value = Value.fromJson(expressionString)\n    val expression = value.value!!.unwrapToExpression()\n    assertEquals(expressionString, expression.toJson())\n  }\n\n  @Test\n  fun unwrapImageExpression_empty() {\n    val actual = \"\"\"\n      [\"image\"]\n      \"\"\".trimIndent()\n    val expected = image { }\n    assertEquals(expected, Value.fromJson(actual).value!!.unwrapToExpression())\n  }\n\n  @Test\n  fun unwrapImageExpression_single() {\n    val actual = \"\"\"\n      [\"image\", \"image-name\"]\n    \"\"\".trimIndent()\n    val expected = image {\n      literal(\"image-name\")\n    }\n    assertEquals(expected, Value.fromJson(actual).value!!.unwrapToExpression())\n  }\n\n  @Test\n  fun unwrapImageExpression_with_options() {\n    val actual = \"\"\"\n      [\"image\", \"image-name\", {\"params\" : {\"foo\" : \"bar\"}}]\n    \"\"\".trimIndent()\n    val expected = image {\n      literal(\"image-name\")\n      imageOptions(\"foo\" to Expression.literal(\"bar\"))\n    }\n    assertEquals(expected, Value.fromJson(actual).value!!.unwrapToExpression())\n  }\n\n  @Test\n  fun unwrapImageExpression_two_images() {\n    val actual = \"\"\"\n      [\"image\", \"image-name\", \"image-name-2\"]\n    \"\"\".trimIndent()\n    val expected = image {\n      literal(\"image-name\")\n      literal(\"image-name-2\")\n    }\n    assertEquals(expected, Value.fromJson(actual).value!!.unwrapToExpression())\n  }\n\n  @Test\n  fun unwrapImageExpression_two_images_with_options() {\n    val actual = \"\"\"\n      [\"image\", \"image-name\", {\"params\" : {\"foo\" : \"bar\"}}, \"image-name-2\", {\"params\" : {\"foo\" : [\"get\", \"bar\"]}}]\n    \"\"\".trimIndent()\n    val expected = image {\n      literal(\"image-name\")\n      imageOptions(\"foo\" to Expression.literal(\"bar\"))\n      literal(\"image-name-2\")\n      imageOptions(\"foo\" to Expression.get(\"bar\"))\n    }\n    assertEquals(expected, Value.fromJson(actual).value!!.unwrapToExpression())\n  }\n\n  @Test\n  fun unwrapImageExpression_two_images_one_options() {\n    val actual = \"\"\"\n      [\"image\", \"image-name\", \"image-name-2\", {\"params\" : {\"foo\" : [\"get\", \"bar\"]}}]\n    \"\"\".trimIndent()\n    val expected = image {\n      literal(\"image-name\")\n      literal(\"image-name-2\")\n      imageOptions(\"foo\" to Expression.get(\"bar\"))\n    }\n    assertEquals(expected, Value.fromJson(actual).value!!.unwrapToExpression())\n  }\n\n  internal data class MockData(val a: Int, val b: String)\n}"
  },
  {
    "path": "extension-style-app/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.application\")\n  id(\"com.mapbox.maps.token\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.extension.testapp\"\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    applicationId = \"com.mapbox.maps.testapp.style\"\n    versionCode = 1\n    versionName = \"0.1.0\"\n    multiDexEnabled = true\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    testInstrumentationRunnerArguments[\"clearPackageData\"] = \"true\"\n  }\n\n  compileOptions {\n    sourceCompatibility = JavaVersion.VERSION_1_8\n    targetCompatibility = JavaVersion.VERSION_1_8\n  }\n\n  testOptions {\n    if (!project.hasProperty(\"android.injected.invoked.from.ide\")) {\n      execution = \"ANDROIDX_TEST_ORCHESTRATOR\"\n    }\n  }\n}\n\ndependencies {\n  implementation(project(\":maps-sdk\"))\n  implementation(libs.kotlin)\n  implementation(libs.androidx.appCompat)\n  androidTestUtil(libs.androidx.orchestrator)\n\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n  androidTestImplementation(libs.androidx.jUnitTestRules)\n  androidTestImplementation(libs.androidx.testJUnit)\n  androidTestImplementation(libs.androidx.uiAutomator)\n  testImplementation(libs.junit)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}\n\nval localPath: String = org.apache.commons.io.FilenameUtils.getFullPathNoEndSeparator(project.buildscript.sourceFile.toString())\nthe<com.mapbox.AccessTokenExtension>().file = \"$localPath/src/main/res/values/developer-config.xml\""
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/BaseStyleTest.kt",
    "content": "package com.mapbox.maps.testapp.style\n\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.test.core.app.ActivityScenario\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.atmosphere.generated.setAtmosphere\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.light.Light\nimport com.mapbox.maps.extension.style.light.generated.AmbientLight\nimport com.mapbox.maps.extension.style.light.generated.DirectionalLight\nimport com.mapbox.maps.extension.style.light.generated.FlatLight\nimport com.mapbox.maps.extension.style.light.getLight\nimport com.mapbox.maps.extension.style.light.setLight\nimport com.mapbox.maps.extension.style.precipitations.generated.Rain\nimport com.mapbox.maps.extension.style.precipitations.generated.Snow\nimport com.mapbox.maps.extension.style.precipitations.generated.setRain\nimport com.mapbox.maps.extension.style.precipitations.generated.setSnow\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.terrain.generated.setTerrain\nimport org.junit.After\nimport org.junit.AfterClass\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Instrumentation test for Layers to test Layer properties.\n *\n * The [ActivityScenario] is launched once per test class (in [setupClass]) to save time.\n * A fresh [MapView] and [MapboxMap] are created for each test (in [before]) for isolation.\n * UI thread work is dispatched via [runOnUiThread] ([Instrumentation.runOnMainSync]) to\n * avoid depending on the Activity not being destroyed between tests.\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nabstract class BaseStyleTest {\n\n  private lateinit var mapView: MapView\n  private lateinit var style: Style\n  protected lateinit var mapboxMap: MapboxMap\n\n  companion object {\n    private lateinit var _scenario: ActivityScenario<AppCompatActivity>\n\n    @BeforeClass\n    @JvmStatic\n    fun setupClass() {\n      _scenario = ActivityScenario.launch(AppCompatActivity::class.java)\n    }\n\n    @AfterClass\n    @JvmStatic\n    fun tearDownClass() {\n      _scenario.close()\n    }\n  }\n\n  protected fun runOnUiThread(block: () -> Unit) {\n    InstrumentationRegistry.getInstrumentation().runOnMainSync(block)\n  }\n\n  @Before\n  fun before() {\n    val latch = CountDownLatch(1)\n    InstrumentationRegistry.getInstrumentation().runOnMainSync {\n      val context = InstrumentationRegistry.getInstrumentation().targetContext\n      mapView = MapView(context)\n      mapboxMap = mapView.mapboxMap\n      mapboxMap.loadStyle(\n        \"mapbox://styles/mapbox/empty-v9\"\n      ) { style ->\n        this@BaseStyleTest.style = style\n        latch.countDown()\n      }\n      mapView.onStart()\n    }\n    if (!latch.await(10000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @After\n  fun tearDown() {\n    InstrumentationRegistry.getInstrumentation().runOnMainSync {\n      mapView.onStop()\n      mapView.onDestroy()\n    }\n  }\n\n  fun setupLayer(layer: StyleContract.StyleLayerExtension) {\n    style.addLayer(layer)\n  }\n\n  fun removeLayer(layer: Layer) {\n    style.removeStyleLayer(layer.layerId)\n  }\n\n  fun setupTerrain(terrain: StyleContract.StyleTerrainExtension) {\n    style.setTerrain(terrain)\n  }\n\n  fun setupAtmosphere(atmosphere: StyleContract.StyleAtmosphereExtension) {\n    style.setAtmosphere(atmosphere)\n  }\n\n  fun setupSource(source: StyleContract.StyleSourceExtension) {\n    style.addSource(source)\n  }\n\n  fun setupLight(light: FlatLight) {\n    style.setLight(light)\n  }\n\n  fun setupLight(ambientLight: AmbientLight, directionalLight: DirectionalLight) {\n    style.setLight(ambientLight, directionalLight)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  fun setupSnow(snow: Snow) {\n    style.setSnow(snow)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  fun setupRain(rain: Rain) {\n    style.setRain(rain)\n  }\n\n  fun getLayer(id: String): Layer? {\n    return style.getLayer(id)\n  }\n\n  fun getLight(id: String): Light? {\n    return style.getLight(id)\n  }\n}"
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/atmosphere/generated/AtmosphereTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.atmosphere.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.atmosphere.generated.atmosphere\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for Atmosphere\n */\n@RunWith(AndroidJUnit4::class)\nclass AtmosphereTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun colorAsColorIntTest() {\n    val atmosphere = atmosphere {\n      color(Color.CYAN)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(Color.CYAN, atmosphere.colorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorUseThemeDsl() {\n    val theme = \"none\"\n    val atmosphere = atmosphere {\n      colorUseTheme(theme)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(theme, atmosphere.colorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorUseThemeAsExpression() {\n    val expression = literal(\"none\")\n    val atmosphere = atmosphere {\n      colorUseTheme(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(expression.toString(), atmosphere.colorUseThemeAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun colorTest() {\n    val atmosphere = atmosphere {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(\"rgba(0, 0, 0, 1)\", atmosphere.color)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val atmosphere = atmosphere {\n      color(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(expression.toString(), atmosphere.colorAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      colorTransition(transition)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.colorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.colorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun highColorAsColorIntTest() {\n    val atmosphere = atmosphere {\n      highColor(Color.CYAN)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(Color.CYAN, atmosphere.highColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun highColorUseThemeDsl() {\n    val theme = \"none\"\n    val atmosphere = atmosphere {\n      highColorUseTheme(theme)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(theme, atmosphere.highColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun highColorUseThemeAsExpression() {\n    val expression = literal(\"none\")\n    val atmosphere = atmosphere {\n      highColorUseTheme(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(expression.toString(), atmosphere.highColorUseThemeAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun highColorTest() {\n    val atmosphere = atmosphere {\n      highColor(\"rgba(0, 0, 0, 1)\")\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(\"rgba(0, 0, 0, 1)\", atmosphere.highColor)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun highColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val atmosphere = atmosphere {\n      highColor(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(expression.toString(), atmosphere.highColorAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun highColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      highColorTransition(transition)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.highColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun highColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      highColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.highColorTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun horizonBlendTest() {\n    val atmosphere = atmosphere {\n      horizonBlend(1.0)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(1.0, atmosphere.horizonBlend!!, 1E-5)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun horizonBlendAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val atmosphere = atmosphere {\n      horizonBlend(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(1.0, atmosphere.horizonBlendAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun horizonBlendTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      horizonBlendTransition(transition)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.horizonBlendTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun horizonBlendTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      horizonBlendTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.horizonBlendTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun rangeTest() {\n    val atmosphere = atmosphere {\n      range(listOf(0.0, 1.0))\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(listOf(0.0, 1.0), atmosphere.range)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun rangeAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n\n    val atmosphere = atmosphere {\n      range(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(expression.toString(), atmosphere.rangeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rangeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      rangeTransition(transition)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.rangeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rangeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      rangeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.rangeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun spaceColorAsColorIntTest() {\n    val atmosphere = atmosphere {\n      spaceColor(Color.CYAN)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(Color.CYAN, atmosphere.spaceColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun spaceColorUseThemeDsl() {\n    val theme = \"none\"\n    val atmosphere = atmosphere {\n      spaceColorUseTheme(theme)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(theme, atmosphere.spaceColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun spaceColorUseThemeAsExpression() {\n    val expression = literal(\"none\")\n    val atmosphere = atmosphere {\n      spaceColorUseTheme(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(expression.toString(), atmosphere.spaceColorUseThemeAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun spaceColorTest() {\n    val atmosphere = atmosphere {\n      spaceColor(\"rgba(0, 0, 0, 1)\")\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(\"rgba(0, 0, 0, 1)\", atmosphere.spaceColor)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun spaceColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val atmosphere = atmosphere {\n      spaceColor(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(expression.toString(), atmosphere.spaceColorAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun spaceColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      spaceColorTransition(transition)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.spaceColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun spaceColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      spaceColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.spaceColorTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun starIntensityTest() {\n    val atmosphere = atmosphere {\n      starIntensity(1.0)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(1.0, atmosphere.starIntensity!!, 1E-5)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun starIntensityAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val atmosphere = atmosphere {\n      starIntensity(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(1.0, atmosphere.starIntensityAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun starIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      starIntensityTransition(transition)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.starIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun starIntensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      starIntensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.starIntensityTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun verticalRangeTest() {\n    val atmosphere = atmosphere {\n      verticalRange(listOf(0.0, 1.0))\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(listOf(0.0, 1.0), atmosphere.verticalRange)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun verticalRangeAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n\n    val atmosphere = atmosphere {\n      verticalRange(expression)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(expression.toString(), atmosphere.verticalRangeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun verticalRangeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      verticalRangeTransition(transition)\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.verticalRangeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun verticalRangeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val atmosphere = atmosphere {\n      verticalRangeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupAtmosphere(atmosphere)\n    assertEquals(transition, atmosphere.verticalRangeTransition)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/expressions/ExpressionTest.kt",
    "content": "package com.mapbox.maps.testapp.style.expressions\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.*\nimport kotlin.collections.HashMap\n\n/**\n * Basic smoke tests for Expressions\n */\n@RunWith(AndroidJUnit4::class)\nclass ExpressionTest : BaseStyleTest() {\n\n  /**\n   * For two inputs, returns the result of subtracting the second input from the first. For a single input, returns the result of subtracting it from 0.\n   */\n  @Test\n  @UiThreadTest\n  fun subtractTest() {\n    val expression = subtract {\n      literal(10)\n      literal(1)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(9.0, layer.textSize)\n  }\n\n  /**\n   * Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`.\n   */\n  @Test\n  @UiThreadTest\n  fun notTest() {\n    val expression = not {\n      literal(true)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(false, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Returns `true` if the input values are not equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n   */\n  @Test\n  @UiThreadTest\n  fun neqTestEq() {\n    val expression = neq {\n      literal(\"abc\")\n      literal(\"abc\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(false, layer.iconAllowOverlap)\n  }\n\n  @Test\n  @UiThreadTest\n  fun neqTestNeq() {\n    val expression = neq {\n      literal(\"abc\")\n      literal(\"def\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Returns the product of the inputs.\n   */\n  @Test\n  @UiThreadTest\n  fun productTest() {\n    val expression = product {\n      literal(12)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(36.0, layer.textSize)\n  }\n\n  /**\n   * Returns the result of floating point division of the first input by the second.\n   */\n  @Test\n  @UiThreadTest\n  fun divisionTest() {\n    val expression = division {\n      literal(12)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(4.0, layer.textSize)\n  }\n\n  /**\n   * Returns the remainder after integer division of the first input by the second.\n   */\n  @Test\n  @UiThreadTest\n  fun modTest() {\n    val expression = mod {\n      literal(4)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(1.0, layer.textSize)\n  }\n\n  /**\n   * Returns the result of raising the first input to the power specified by the second.\n   */\n  @Test\n  @UiThreadTest\n  fun powTest() {\n    val expression = pow {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(8.0, layer.textSize)\n  }\n\n  /**\n   * Returns the sum of the inputs.\n   */\n  @Test\n  @UiThreadTest\n  fun sumTest() {\n    val expression = sum {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(5.0, layer.textSize)\n  }\n\n  /**\n   * Returns `true` if the first input is strictly less than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n   */\n  @Test\n  @UiThreadTest\n  fun ltTest() {\n    val expression = lt {\n      literal(2)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Returns `true` if the first input is less than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n   */\n  @Test\n  @UiThreadTest\n  fun lteTest() {\n    val expression = lte {\n      literal(3)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconAllowOverlap)\n    layer.iconAllowOverlap(\n      lte {\n        literal(3)\n        literal(4)\n      }\n    )\n    assertEquals(true, layer.iconAllowOverlap)\n    layer.iconAllowOverlap(\n      lte {\n        literal(4)\n        literal(3)\n      }\n    )\n    assertEquals(false, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Returns `true` if the input values are equal, `false` otherwise. The comparison is strictly typed: values of different runtime types are always considered unequal. Cases where the types are known to be different at parse time are considered invalid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n   */\n  @Test\n  @UiThreadTest\n  fun eqTest() {\n    val expression = eq {\n      literal(3)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconAllowOverlap)\n    layer.iconAllowOverlap(\n      eq {\n        literal(4)\n        literal(3)\n      }\n    )\n    assertEquals(false, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Returns `true` if the first input is strictly greater than the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n   */\n  @Test\n  @UiThreadTest\n  fun gtTest() {\n    val expression = gt {\n      literal(3)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(false, layer.iconAllowOverlap)\n    layer.iconAllowOverlap(\n      gt {\n        literal(4)\n        literal(3)\n      }\n    )\n    assertEquals(true, layer.iconAllowOverlap)\n    layer.iconAllowOverlap(\n      gt {\n        literal(2)\n        literal(3)\n      }\n    )\n    assertEquals(false, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Returns `true` if the first input is greater than or equal to the second, `false` otherwise. The arguments are required to be either both strings or both numbers; if during evaluation they are not, expression evaluation produces an error. Cases where this constraint is known not to hold at parse time are considered in valid and will produce a parse error. Accepts an optional `collator` argument to control locale-dependent string comparisons.\n   */\n  @Test\n  @UiThreadTest\n  fun gteTest() {\n    val expression = gte {\n      literal(3)\n      literal(3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconAllowOverlap)\n    layer.iconAllowOverlap(\n      gte {\n        literal(4)\n        literal(3)\n      }\n    )\n    assertEquals(true, layer.iconAllowOverlap)\n    layer.iconAllowOverlap(\n      gte {\n        literal(2)\n        literal(3)\n      }\n    )\n    assertEquals(false, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Returns the absolute value of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun absTest() {\n    val expression = abs {\n      literal(-3)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(3.0, layer.textSize)\n  }\n\n  /**\n   * Gets the value of a cluster property accumulated so far. Can only be used in the `clusterProperties` option of a clustered GeoJSON source.\n   */\n  @Test\n  @UiThreadTest\n  fun accumulatedTest() {\n    val source = geoJsonSource(\"id\") {\n      url(\"http://mock.geojson\")\n      clusterProperty(\n        \"max\",\n        max {\n          accumulated()\n          get {\n            literal(\"max\")\n          }\n        },\n        get {\n          literal(\"mag\")\n        }\n      )\n    }\n    setupSource(source)\n  }\n\n  /**\n   * Returns the arccosine of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun acosTest() {\n    val expression = acos {\n      literal(1.0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(0.0, layer.textSize)\n  }\n\n  /**\n   * Returns `true` if all the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `false`, the result is `false` and no further input expressions are evaluated.\n   */\n  @Test\n  @UiThreadTest\n  fun allTest() {\n    val expression = all {\n      literal(true)\n      literal(true)\n      literal(false)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(false, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Returns `true` if any of the inputs are `true`, `false` otherwise. The inputs are evaluated in order, and evaluation is short-circuiting: once an input expression evaluates to `true`, the result is `true` and no further input expressions are evaluated.\n   */\n  @Test\n  @UiThreadTest\n  fun anyTest() {\n    val expression = any {\n      literal(true)\n      literal(true)\n      literal(false)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Asserts that the input is an array (optionally with a specific item type and length).  If, when the input expression is evaluated, it is not of the asserted type, then this assertion will cause the whole expression to be aborted.\n   */\n  @Test\n  @UiThreadTest\n  fun arrayTest() {\n    val expression = array {\n      literal(\"number\")\n      literal(2)\n      get {\n        literal(\"array_property\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOffset(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.iconOffsetAsExpression.toString())\n  }\n\n  /**\n   * Returns the arcsine of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun asinTest() {\n    val expression = asin {\n      literal(0.0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(0.0, layer.textSize)\n  }\n\n  /**\n   * Retrieves an item from an array.\n   */\n  @Test\n  @UiThreadTest\n  fun atTest() {\n    val expression = at {\n      literal(2)\n      literal(listOf(1.0, 2.0, 3.0, 4.0))\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolSortKey(expression)\n    }\n    setupLayer(layer)\n    assertEquals(3.0, layer.symbolSortKey)\n  }\n\n  /**\n   * Returns the arctangent of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun atanTest() {\n    val expression = atan {\n      literal(0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(0.0, layer.textSize)\n  }\n\n  /**\n   * Asserts that the input value is a boolean. If multiple values are provided, each one is evaluated in order until a boolean is obtained. If none of the inputs are booleans, the expression is an error.\n   */\n  @Test\n  @UiThreadTest\n  fun booleanTest() {\n    val expression = boolean {\n      literal(true)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOptional(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconOptional)\n  }\n\n  /**\n   * Selects the first output whose corresponding test condition evaluates to true, or the fallback value otherwise.\n   */\n  @Test\n  @UiThreadTest\n  fun switchCaseTest() {\n    val expression = switchCase {\n      eq {\n        get {\n          literal(\"count\")\n        }\n        literal(1.0)\n      }\n      literal(1.0)\n      eq {\n        get {\n          literal(\"count\")\n        }\n        literal(2.0)\n      }\n      literal(2.0)\n      literal(0.0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.textSizeAsExpression.toString())\n  }\n\n  /**\n   * Returns the smallest integer that is greater than or equal to the input.\n   */\n  @Test\n  @UiThreadTest\n  fun ceilTest() {\n    val expression = ceil {\n      literal(0.5)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(1.0, layer.textSize)\n  }\n\n  /**\n   * Evaluates each expression in turn until the first non-null value is obtained, and returns that value.\n   */\n  @Test\n  @UiThreadTest\n  fun coalesceTest() {\n    val expression = toColor {\n      coalesce {\n        get {\n          literal(\"keyToNullValue\")\n        }\n        get {\n          literal(\"keyToNonNullValue\")\n        }\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColor(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.textColorAsExpression.toString())\n  }\n\n  /**\n   * Returns a `collator` for use in locale-dependent comparison operations. The `case-sensitive` and `diacritic-sensitive` options default to `false`. The `locale` argument specifies the IETF language tag of the locale to use. If none is provided, the default locale is used. If the requested locale is not available, the `collator` will use a system-defined fallback locale. Use `resolved-locale` to test the results of locale fallback behavior.\n   */\n  @Test\n  @UiThreadTest\n  fun collatorTest() {\n    val expression = switchCase {\n      eq {\n        literal(\"Abc\")\n        literal(\"abc\")\n        collator {\n          caseSensitive(false)\n          locale(Locale(\"en_US\"))\n        }\n      }\n      literal(1.0)\n      literal(0.0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[case, [==, Abc, abc, [collator, {diacritic-sensitive=false, case-sensitive=false, locale=en_us}]], 1.0, 0.0]\",\n      layer.textSizeAsExpression.toString()\n    )\n  }\n\n  /**\n   * Returns a `string` consisting of the concatenation of the inputs. Each input is converted to a string as if by `to-string`.\n   */\n  @Test\n  @UiThreadTest\n  fun concatTest() {\n    val expression = concat {\n      literal(\"this\")\n      literal(\"is\")\n      literal(\"test\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\"thisistest\", layer.textFieldAsString)\n  }\n\n  /**\n   * Returns the cosine of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun cosTest() {\n    val expression = cos {\n      pi()\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolSortKey(expression)\n    }\n    setupLayer(layer)\n    assertEquals(-1.0, layer.symbolSortKey)\n  }\n\n  /**\n   * Returns the input string converted to lowercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.\n   */\n  @Test\n  @UiThreadTest\n  fun downcaseTest() {\n    val expression = downcase {\n      literal(\"TeSt\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.textFieldAsString)\n  }\n\n  /**\n   * Returns the mathematical constant e.\n   */\n  @Test\n  @UiThreadTest\n  fun eTest() {\n    val expression = e()\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(2.7182817459106445, layer.textSize)\n  }\n\n  /**\n   * Retrieves a property value from the current feature's state. Returns null if the requested property is not present on the feature's state. A feature's state is not part of the GeoJSON or vector tile data, and must be set programmatically on each feature. Features are identified by their `id` attribute, which must be an integer or a string that can be cast to an integer. Note that [\"feature-state\"] can only be used with paint properties that support data-driven styling.\n   */\n  @Test\n  @UiThreadTest\n  fun featureStateTest() {\n    val expression = switchCase {\n      boolean {\n        featureState {\n          literal(\"hover\")\n        }\n        literal(false)\n      }\n      literal(1.0)\n      literal(0.5)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOpacity(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.fillOpacityAsExpression.toString())\n  }\n\n  /**\n   * Returns the largest integer that is less than or equal to the input.\n   */\n  @Test\n  @UiThreadTest\n  fun floorTest() {\n    val expression = floor {\n      literal(1.6)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(1.0, layer.textSize)\n  }\n\n  /**\n   * Returns `formatted` text containing annotations for use in mixed-format `text-field` entries. If set, the `text-font` argument overrides the font specified by the root layout properties. If set, the `font-scale` argument specifies a scaling factor relative to the `text-size` specified in the root layout properties. If set, the `text-color` argument overrides the color specified by the paint properties for this layer.\n   */\n  @Test\n  @UiThreadTest\n  fun formatTest() {\n    val expression = format {\n      formatSection(literal(\"text\")) {\n        fontScale(1.0)\n        textFont(listOf(\"font1\", \"font2\"))\n        textColor(Color.BLUE)\n      }\n      formatSection(literal(\"text2\")) {\n        fontScale(2.0)\n        textFont(listOf(\"font1\", \"font2\"))\n        textColor(Color.RED)\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[format, text, {text-color=[rgba, 0.0, 0.0, 255.0, 1.0], font-scale=1.0, text-font=[literal, [font1, font2]]}, text2, {text-color=[rgba, 255.0, 0.0, 0.0, 1.0], font-scale=2.0, text-font=[literal, [font1, font2]]}]\",\n      layer.textFieldAsExpression.toString()\n    )\n  }\n\n  /**\n   * Gets the feature's geometry type: Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon.\n   */\n  @Test\n  @UiThreadTest\n  fun geometryTypeTest() {\n    val expression = format {\n      formatSection(\n        content = concat {\n          get {\n            literal(\"key-to-value\")\n          }\n          literal(\" \")\n          geometryType()\n        }\n      )\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[format, [concat, [get, key-to-value],  , [geometry-type]], {}]\",\n      layer.textFieldAsExpression.toString()\n    )\n  }\n\n  /**\n   * Retrieves a property value from the current feature's properties, or from another object if a second argument is provided. Returns null if the requested property is missing.\n   */\n  @Test\n  @UiThreadTest\n  fun getTest() {\n    val expression = image {\n      string {\n        get {\n          literal(\"key-to-value\")\n        }\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconImage(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.iconImageAsExpression.toString())\n  }\n\n  /**\n   * Tests for the presence of an property value in the current feature's properties, or from another object if a second argument is provided.\n   */\n  @Test\n  @UiThreadTest\n  fun hasTest() {\n    val expression = has {\n      literal(\"key\")\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n\n  /**\n   * Gets the kernel density estimation of a pixel in a heatmap layer, which is a relative measure of how many data points are crowded around a particular pixel. Can only be used in the `heatmap-color` property.\n   */\n  @Test\n  @UiThreadTest\n  fun heatmapDensityTest() {\n    val expression = interpolate {\n      linear()\n      heatmapDensity()\n      literal(1.0)\n      rgba {\n        literal(178.0)\n        literal(24.0)\n        literal(12.0)\n        literal(1.0)\n      }\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapColor(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.heatmapColor.toString())\n  }\n\n  /**\n   * Gets the feature's id, if it has one.\n   */\n  @Test\n  @UiThreadTest\n  fun idTest() {\n    val expression = format {\n      formatSection(\n        id()\n      )\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\"[format, [id], {}]\", layer.textFieldAsExpression.toString())\n  }\n\n  /**\n   * Returns an `image` type for use in `icon-image` and `*-pattern` entries. If set, the `image` argument will check that the requested image exists in the style and will return either the resolved image name or `null`, depending on whether or not the image is currently in the style. This validation process is synchronous and requires the image to have been added to the style before requesting it in the `image` argument.\n   */\n  @Test\n  @UiThreadTest\n  fun imageTest() {\n    val expression = image {\n      string {\n        get {\n          literal(\"key\")\n        }\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconImage(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.iconImageAsExpression.toString())\n  }\n\n  /**\n   * Determines whether an item exists in an array or a substring exists in a string.\n   */\n  @Test\n  @UiThreadTest\n  fun inExpressionTest() {\n    val expression = inExpression {\n      get {\n        literal(\"key\")\n      }\n      literal(listOf(\"abc\", \"def\"))\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n\n  /**\n   * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly ascending order. The output type must be `number`, `array<number>`, or `color`.\n\n   Interpolation types:\n   - `[\"linear\"]`: interpolates linearly between the pair of stops just less than and just greater than the input.\n   - `[\"exponential\", base]`: interpolates exponentially between the stops just less than and just greater than the input. `base` controls the rate at which the output increases: higher values make the output increase more towards the high end of the range. With values close to 1 the output increases linearly.\n   - `[\"cubic-bezier\", x1, y1, x2, y2]`: interpolates using the cubic bezier curve defined by the given control points.\n   */\n  @Test\n  @UiThreadTest\n  fun interpolateTest() {\n    val expression = interpolate {\n      exponential {\n        literal(0.5)\n      }\n      zoom()\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(10.0)\n        rgba {\n          literal(255.0)\n          literal(255.0)\n          literal(255.0)\n          literal(1.0)\n        }\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColor(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.fillColorAsExpression.toString())\n  }\n\n  /**\n   * Returns `true` if the input string is expected to render legibly. Returns `false` if the input string contains sections that cannot be rendered without potential loss of meaning (e.g. Indic scripts that require complex text shaping, or right-to-left scripts if the the `mapbox-gl-rtl-text` plugin is not in use in Mapbox GL JS).\n   */\n  @Test\n  @UiThreadTest\n  fun isSupportedScriptTest() {\n    val expression = isSupportedScript {\n      string {\n        get {\n          literal(\"script\")\n        }\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n\n  /**\n   * Gets the length of an array or string.\n   */\n  @Test\n  @UiThreadTest\n  fun lengthTest() {\n    val expression = length {\n      literal(listOf(\"one\", \"two\", \"three\"))\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(3.0, layer.textSize)\n  }\n\n  /**\n   * Binds expressions to named variables, which can then be referenced in the result expression using [\"var\", \"variable_name\"].\n   */\n  @Test\n  @UiThreadTest\n  fun letExpressionTest() {\n    val expression = letExpression {\n      literal(\"two\")\n      literal(2.0)\n      sum {\n        literal(1.0)\n        varExpression {\n          literal(\"two\")\n        }\n      }\n    }\n\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(3.0, layer.textSize)\n  }\n\n  /**\n   * Gets the progress along a gradient line. Can only be used in the `line-gradient` property.\n   */\n  @Test\n  @UiThreadTest\n  fun lineProgressTest() {\n    val expression = interpolate {\n      linear()\n      lineProgress()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(255.0)\n          literal(1.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(255.0)\n          literal(0.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGradient(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.lineGradient.toString())\n  }\n\n  /**\n   * Provides a literal array or object value.\n   */\n  @Test\n  @UiThreadTest\n  fun literalDoubleTest() {\n    val expression = literal(0.1)\n\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(0.1, layer.textSize!!, 1E-5)\n  }\n\n  /**\n   * Provides a literal array or object value.\n   */\n  @Test\n  @UiThreadTest\n  fun literalLongTest() {\n    val expression = literal(12L)\n\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(12.0, layer.textSize)\n  }\n\n  /**\n   * Provides a literal array or object value.\n   */\n  @Test\n  @UiThreadTest\n  fun literalBooleanTest() {\n    val expression = literal(true)\n\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Provides a literal array or object value.\n   */\n  @Test\n  @UiThreadTest\n  fun literalStringTest() {\n    val expression = literal(\"name\")\n\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\"name\", layer.textFieldAsString)\n  }\n\n  /**\n   * Provides a literal array or object value.\n   */\n  @Test\n  @UiThreadTest\n  fun literalDoubleArrayTest() {\n    val expression = literal(listOf(1.0, 2.0))\n\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOffset(expression)\n    }\n    setupLayer(layer)\n    assertEquals(listOf(1.0, 2.0), layer.iconOffset!!)\n  }\n\n  /**\n   * Provides a literal array or object value.\n   */\n  @Test\n  @UiThreadTest\n  fun literalLongArrayTest() {\n    val expression = literal(listOf(11L, 22L))\n\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOffset(expression)\n    }\n    setupLayer(layer)\n    assertEquals(listOf(11.0, 22.0), layer.iconOffset!!)\n  }\n\n  /**\n   * Provides a literal array or object value.\n   */\n  @Test\n  @UiThreadTest\n  fun literalBooleanArrayTest() {\n    val expression = at {\n      literal(2)\n      literal(listOf(true, true, false, true))\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(false, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Provides a literal array or object value.\n   */\n  @Test\n  @UiThreadTest\n  fun literalStringArrayTest() {\n    val expression = literal(listOf(\"text font a\", \"text font b\"))\n    val layer = symbolLayer(\"id\", \"source\") {\n      textFont(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.textFontAsExpression.toString())\n  }\n\n  /**\n   * Returns the natural logarithm of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun lnTest() {\n    val expression = ln {\n      e()\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(1.0, layer.textSize)\n  }\n\n  /**\n   * Returns mathematical constant ln(2).\n   */\n  @Test\n  @UiThreadTest\n  fun ln2Test() {\n    val expression = ln2()\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(0.6931471824645996, layer.textSize)\n  }\n\n  /**\n   * Returns the base-ten logarithm of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun log10Test() {\n    val expression = log10 {\n      literal(100)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(2.0, layer.textSize)\n  }\n\n  /**\n   * Returns the base-two logarithm of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun log2Test() {\n    val expression = log2 {\n      literal(8)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(3.0, layer.textSize)\n  }\n\n  /**\n   * Selects the output whose label value matches the input value, or the fallback value if no match is found. The input can be any expression (e.g. `[\"get\", \"building_type\"]`). Each label must be either:\n   * a single literal value; or\n   * an array of literal values, whose values must be all strings or all numbers (e.g. `[100, 101]` or `[\"c\", \"b\"]`). The input matches if any of the values in the array matches, similar to the deprecated `\"in\"` operator.\n   * Each label must be unique. If the input type does not match the type of the labels, the result will be the fallback value.\n   */\n  @Test\n  @UiThreadTest\n  fun matchTest() {\n    val expression = match {\n      get {\n        literal(\"key\")\n      }\n      literal(1)\n      literal(1.0)\n      literal(2)\n      literal(2.0)\n      literal(3.0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.textSizeAsExpression.toString())\n  }\n\n  /**\n   * Selects the output whose label value matches the input value, or the fallback value if no match is found. The input can be any expression (e.g. `[\"get\", \"building_type\"]`). Each label must be either:\n   * a single literal value; or\n   * an array of literal values, whose values must be all strings or all numbers (e.g. `[100, 101]` or `[\"c\", \"b\"]`). The input matches if any of the values in the array matches, similar to the deprecated `\"in\"` operator.\n   * Each label must be unique. If the input type does not match the type of the labels, the result will be the fallback value.\n   */\n  @Test\n  @UiThreadTest\n  fun matchWithLableListTest() {\n    val expression = match {\n      get {\n        literal(\"ethnicity\")\n      }\n      literal(listOf(\"Asian\", \"Black\", \"Hispanic\", \"white\"))\n      rgba(251.0, 176.0, 59.0, 1.0)\n      literal(\"Other\")\n      rgba(204.0, 204.0, 204.0, 1.0)\n      rgba(0.0, 0.0, 0.0, 1.0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColor(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toJson(), layer.textColorAsExpression?.toJson())\n  }\n\n  /**\n   * Selects the output whose label value matches the input value, or the fallback value if no match is found. The input can be any expression (e.g. `[\"get\", \"building_type\"]`). Each label must be either:\n   * a single literal value; or\n   * an array of literal values, whose values must be all strings or all numbers (e.g. `[100, 101]` or `[\"c\", \"b\"]`). The input matches if any of the values in the array matches, similar to the deprecated `\"in\"` operator.\n   * Each label must be unique. If the input type does not match the type of the labels, the result will be the fallback value.\n   */\n  @Test\n  @UiThreadTest\n  fun matchWithOutputListTest() {\n    val expression = match {\n      mod {\n        number {\n          id()\n        }\n        literal(4.0)\n      }\n      literal(0)\n      literal(listOf(0.0, 0.0))\n      literal(1)\n      literal(listOf(0.0, 20.0))\n      literal(2)\n      literal(listOf(0.0, 40.0))\n      literal(listOf(0.0, 60.0))\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      this.iconOffset(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toJson(), layer.iconOffsetAsExpression?.toJson())\n  }\n\n  /**\n   * Returns the maximum value of the inputs.\n   */\n  @Test\n  @UiThreadTest\n  fun maxTest() {\n    val expression = max {\n      literal(8)\n      literal(10)\n      literal(7)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.textSize)\n  }\n\n  /**\n   * Returns the minimum value of the inputs.\n   */\n  @Test\n  @UiThreadTest\n  fun minTest() {\n    val expression = min {\n      literal(8)\n      literal(10)\n      literal(7)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(7.0, layer.textSize)\n  }\n\n  /**\n   * Asserts that the input value is a number. If multiple values are provided, each one is evaluated in order until a number is obtained. If none of the inputs are numbers, the expression is an error.\n   */\n  @Test\n  @UiThreadTest\n  fun numberTest() {\n    val expression = number {\n      literal(\"string\")\n      literal(true)\n      literal(1)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(1.0, layer.textSize)\n  }\n\n  /**\n   * Converts the input number into a string representation using the providing formatting rules. If set, the `locale` argument specifies the locale to use, as a BCP 47 language tag. If set, the `currency` argument specifies an ISO 4217 code to use for currency-style formatting. If set, the `min-fraction-digits` and `max-fraction-digits` arguments specify the minimum and maximum number of fractional digits to include.\n   */\n  @Test\n  @UiThreadTest\n  fun numberFormatTest() {\n    val expression = numberFormat(literal(123.456789)) {\n      locale {\n        literal(\"en-US\")\n      }\n      minFractionDigits {\n        literal(1)\n      }\n      maxFractionDigits {\n        literal(4)\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\"123.4568\", layer.textFieldAsString)\n    layer.textField(\n      numberFormat(literal(1234567.1234567)) {\n        locale {\n          literal(\"en-US\")\n        }\n        currency {\n          literal(\"USD\")\n        }\n      }\n    )\n    assertEquals(\"$1,234,567.12\", layer.textFieldAsString)\n  }\n\n  /**\n   * Asserts that the input value is an object. If multiple values are provided, each one is evaluated in order until an object is obtained. If none of the inputs are objects, the expression is an error.\n   */\n  @Test\n  @UiThreadTest\n  fun objectExpressionTest() {\n    val map = HashMap<String, Value>()\n    map[\"key1\"] = literal(1)\n    map[\"key2\"] = literal(2)\n    val expression = toBoolean {\n      objectExpression {\n        literal(map as HashMap<String, Any>)\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Returns the mathematical constant pi.\n   */\n  @Test\n  @UiThreadTest\n  fun piTest() {\n    val expression = pi()\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(3.1415927410125732, layer.textSize)\n  }\n\n  /**\n   * Gets the feature properties object.  Note that in some cases, it may be more efficient to use [\"get\", \"property_name\"] directly.\n   */\n  @Test\n  @UiThreadTest\n  fun propertiesTest() {\n    val expression = number {\n      get {\n        literal(\"key\")\n        properties()\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.textSizeAsExpression.toString())\n  }\n\n  /**\n   * Returns the IETF language tag of the locale being used by the provided `collator`. This can be used to determine the default system locale, or to determine if a requested locale was successfully loaded.\n   */\n  @Test\n  @UiThreadTest\n  fun resolvedLocaleTest() {\n    val expression = number {\n      switchCase {\n        eq {\n          literal(\"it\")\n          resolvedLocale {\n            collator {\n              locale(Locale(\"en-US\"))\n            }\n          }\n        }\n        literal(1.0)\n        literal(2.0)\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[number, [case, [==, it, [resolved-locale, [collator, {diacritic-sensitive=false, case-sensitive=false, locale=en-us}]]], 1.0, 2.0]]\",\n      layer.textSizeAsExpression.toString()\n    )\n  }\n\n  /**\n   * Creates a color value from red, green, and blue components, which must range between 0 and 255, and an alpha component of 1. If any component is out of range, the expression is an error.\n   */\n  @Test\n  @UiThreadTest\n  fun rgbTest() {\n    val expression = rgb {\n      literal(0.0)\n      literal(1.0)\n      literal(2.0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColor(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      rgba {\n        literal(0.0)\n        literal(1.0)\n        literal(2.0)\n        literal(1.0)\n      }.toString(),\n      layer.textColorAsExpression.toString()\n    )\n  }\n\n  /**\n   * Creates a color value from red, green, blue components, which must range between 0 and 255, and an alpha component which must range between 0 and 1. If any component is out of range, the expression is an error.\n   */\n  @Test\n  @UiThreadTest\n  fun rgbaTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(1.0)\n      literal(2.0)\n      literal(0.5)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColor(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.textColorAsExpression.toString())\n  }\n\n  /**\n   * Rounds the input to the nearest integer. Halfway values are rounded away from zero. For example, `[\"round\", -1.5]` evaluates to -2.\n   */\n  @Test\n  @UiThreadTest\n  fun roundTest() {\n    val expression = round {\n      literal(-1.5)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolSortKey(expression)\n    }\n    setupLayer(layer)\n    assertEquals(-2.0, layer.symbolSortKey)\n  }\n\n  /**\n   * Returns the sine of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun sinTest() {\n    val expression = sin {\n      division {\n        pi()\n        literal(2)\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(1.0, layer.textSize)\n  }\n\n  /**\n   * Returns the square root of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun sqrtTest() {\n    val expression = sqrt {\n      literal(9)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(3.0, layer.textSize)\n  }\n\n  /**\n   * Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of input and output values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). Stop inputs must be numeric literals in strictly ascending order. Returns the output value of the stop just less than the input, or the first output if the input is less than the first stop.\n   */\n  @Test\n  @UiThreadTest\n  fun stepTest() {\n    val expression = step {\n      zoom()\n      literal(0.0)\n      stop(1.0) { literal(2.5) }\n      stop(10.0) { literal(5.0) }\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleRadius(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.circleRadiusAsExpression.toString())\n  }\n\n  /**\n   * Asserts that the input value is a string. If multiple values are provided, each one is evaluated in order until a string is obtained. If none of the inputs are strings, the expression is an error.\n   */\n  @Test\n  @UiThreadTest\n  fun stringTest() {\n    val expression = string {\n      literal(9)\n      literal(true)\n      literal(\"string\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\"string\", layer.textFieldAsString)\n  }\n\n  /**\n   * Returns the tangent of the input.\n   */\n  @Test\n  @UiThreadTest\n  fun tanTest() {\n    val expression = tan {\n      division {\n        pi()\n        literal(4)\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(1.0, layer.textSize)\n  }\n\n  /**\n   * Converts the input value to a boolean. The result is `false` when then input is an empty string, 0, `false`, `null`, or `NaN`; otherwise it is `true`.\n   */\n  @Test\n  @UiThreadTest\n  fun toBooleanTest() {\n    val expression = toBoolean {\n      literal(\"abc\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n    assertEquals(true, layer.iconAllowOverlap)\n    layer.iconAllowOverlap(\n      toBoolean {\n        literal(\"\")\n      }\n    )\n    assertEquals(false, layer.iconAllowOverlap)\n  }\n\n  /**\n   * Converts the input value to a color. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.\n   */\n  @Test\n  @UiThreadTest\n  fun toColorTest() {\n    val expression = toColor {\n      literal(\"abc\")\n      literal(\"def\")\n      literal(\"blue\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColor(expression)\n    }\n    setupLayer(layer)\n    assertEquals(Color.BLUE, layer.iconColorAsColorInt)\n  }\n\n  /**\n   * Converts the input value to a number, if possible. If the input is `null` or `false`, the result is 0. If the input is `true`, the result is 1. If the input is a string, it is converted to a number as specified by the [\"ToNumber Applied to the String Type\" algorithm](https://tc39.github.io/ecma262/#sec-tonumber-applied-to-the-string-type) of the ECMAScript Language Specification. If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. If none of the inputs can be converted, the expression is an error.\n   */\n  @Test\n  @UiThreadTest\n  fun toNumberTest() {\n    val expression = toNumber {\n      literal(\"2.0\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(2.0, layer.textSize)\n    // TODO this should work, created ticket to track it.\n    //    layer.textSize(toNumber {\n    //      literal(true)\n    //    })\n    //    assertEquals(1.0, layer.textSize)\n  }\n\n  /**\n   * Returns a four-element array containing the input color's red, green, blue, and alpha components, in that order.\n   */\n  @Test\n  @UiThreadTest\n  fun toRgbaTest() {\n    val expression = toRgba {\n      literal(\"blue\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTextFitPadding(expression)\n    }\n    setupLayer(layer)\n    assertEquals(listOf(0.0, 0.0, 255.0, 1.0), layer.iconTextFitPadding!!)\n  }\n\n  /**\n   * Returns a four-element array containing the input color's Hue, Saturation, Luminance and alpha components, in that order.\n   */\n  @Test\n  @UiThreadTest\n  fun toHslaTest() {\n    val expression = toHsla {\n      literal(\"blue\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTextFitPadding(expression)\n    }\n    setupLayer(layer)\n    assertEquals(listOf(240.0, 100.0, 50.0, 1.0), layer.iconTextFitPadding!!)\n  }\n\n  /**\n   * Converts the input value to a string. If the input is `null`, the result is `\"\"`. If the input is a boolean, the result is `\"true\"` or `\"false\"`. If the input is a number, it is converted to a string as specified by the [\"NumberToString\" algorithm](https://tc39.github.io/ecma262/#sec-tostring-applied-to-the-number-type) of the ECMAScript Language Specification. If the input is a color, it is converted to a string of the form `\"rgba(r,g,b,a)\"`, where `r`, `g`, and `b` are numerals ranging from 0 to 255, and `a` ranges from 0 to 1. Otherwise, the input is converted to a string in the format specified by the [`JSON.stringify`](https://tc39.github.io/ecma262/#sec-json.stringify) function of the ECMAScript Language Specification.\n   */\n  @Test\n  @UiThreadTest\n  fun toStringTest() {\n    val expression = toString {\n      literal(true)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\"true\", layer.textFieldAsString)\n    layer.textField(\n      toString {\n        literal(10)\n      }\n    )\n    assertEquals(\"10\", layer.textFieldAsString)\n    layer.textField(\n      toString {\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n    )\n    assertEquals(\"rgba(0,0,0,0)\", layer.textFieldAsString)\n  }\n\n  /**\n   * Returns a string describing the type of the given value.\n   */\n  @Test\n  @UiThreadTest\n  fun typeofExpressionTest() {\n    val expression = typeofExpression {\n      literal(true)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\"boolean\", layer.textFieldAsString)\n    layer.textField(\n      typeofExpression {\n        literal(10)\n      }\n    )\n    assertEquals(\"number\", layer.textFieldAsString)\n    layer.textField(\n      typeofExpression {\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n    )\n    assertEquals(\"color\", layer.textFieldAsString)\n    layer.textField(\n      typeofExpression {\n        literal(listOf(\"abc\", \"def\"))\n      }\n    )\n    assertEquals(\"array<string, 2>\", layer.textFieldAsString)\n  }\n\n  /**\n   * Returns the input string converted to uppercase. Follows the Unicode Default Case Conversion algorithm and the locale-insensitive case mappings in the Unicode Character Database.\n   */\n  @Test\n  @UiThreadTest\n  fun upcaseTest() {\n    val expression = upcase {\n      literal(\"small\")\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\"SMALL\", layer.textFieldAsString)\n  }\n\n  /**\n   * References variable bound using \"let\".\n   */\n  @Test\n  @UiThreadTest\n  fun varExpressionTest() {\n    val expression = number {\n      letExpression {\n        literal(\"two\")\n        literal(2.0)\n        sum {\n          literal(1.0)\n          varExpression {\n            literal(\"two\")\n          }\n        }\n      }\n    }\n\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n    assertEquals(3.0, layer.textSize)\n  }\n\n  /**\n   * Returns `true` if the feature being evaluated is inside the pre-defined geometry boundary, `false` otherwise. The expression has one argument which must be a valid GeoJSON Polygon/Multi-Polygon object. The expression only evaluates on `Point` or `LineString` feature. For `Point` feature, The expression will return false if any point of the feature is on the boundary or outside the boundary. For `LineString` feature, the expression will return false if the line is fully outside the boundary, or the line is partially intersecting the boundary, which means either part of the line is outside of the boundary, or end point of the line lies on the boundary.\n   */\n  @Test\n  @UiThreadTest\n  fun withinTest() {\n    val polygon = Polygon.fromJson(\n      \"\"\"\n        {\n            \"type\": \"Polygon\",\n            \"coordinates\": [\n                [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]]\n            ]\n        }\n      \"\"\".trimIndent()\n    )\n    val expression = within(polygon)\n    val layer = symbolLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[within, {coordinates=[[[30.0, 10.0], [40.0, 40.0], [20.0, 40.0], [10.0, 20.0], [30.0, 10.0]]], type=Polygon}]\",\n      layer.filter.toString()\n    )\n  }\n\n  /**\n   * Gets the current zoom level.  Note that in style layout and paint properties, [\"zoom\"] may only appear as the input to a top-level \"step\" or \"interpolate\" expression.\n   */\n  @Test\n  @UiThreadTest\n  fun zoomTest() {\n    val expression = interpolate {\n      exponential {\n        literal(0.5)\n      }\n      zoom()\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(10.0)\n        rgba {\n          literal(255.0)\n          literal(255.0)\n          literal(255.0)\n          literal(1.0)\n        }\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColor(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.fillColorAsExpression.toString())\n  }\n\n  /**\n   * Convert a color int to the rgba expression.\n   */\n  @Test\n  @UiThreadTest\n  fun colorTest() {\n    val expression = color(Color.RED)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColor(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      rgba {\n        literal(255.0)\n        literal(0.0)\n        literal(0.0)\n        literal(1.0)\n      }.toString(),\n      layer.textColorAsExpression.toString()\n    )\n  }\n\n  /**\n   * Test constructing an Expression from raw string.\n   */\n  @Test\n  @UiThreadTest\n  fun rawExpressionTest() {\n    val expression = color(Color.RED)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColor(Expression.fromRaw(\"[\\\"rgba\\\", 255.0, 0.0, 0.0, 1.0]\"))\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.textColorAsExpression.toString())\n  }\n\n  /**\n   * Test constructing an match Expression from raw string.\n   */\n  @Test\n  @UiThreadTest\n  fun rawMatchExpressionTest() {\n    val expressionString = \"\"\"\n      [\"match\",[\"get\",\"data_property\"],[0,1],true,false]\n    \"\"\".trimIndent()\n    val expression = Expression.fromRaw(expressionString)\n    val layer = symbolLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expressionString, layer.filter!!.toJson())\n  }\n\n  /**\n   * Returns the shortest distance in meters between the evaluated feature and the input geometry. The input value can be a valid GeoJSON of type Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon, Feature, or FeatureCollection. Distance values returned may vary in precision due to loss in precision from encoding geometries, particularly below zoom level 13.\n   */\n  @Test\n  @UiThreadTest\n  fun distanceTest() {\n    val polygon = Polygon.fromJson(\n      \"\"\"\n        {\n            \"type\": \"Polygon\",\n            \"coordinates\": [\n                [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]]\n            ]\n        }\n      \"\"\".trimIndent()\n    )\n    val expression = lt {\n      distance(polygon)\n      literal(150)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[<, [distance, {coordinates=[[[30.0, 10.0], [40.0, 40.0], [20.0, 40.0], [10.0, 20.0], [30.0, 10.0]]], type=Polygon}], 150.0]\",\n      layer.filter.toString()\n    )\n  }\n\n  /**\n   * Verify that symbol layers can be filtered using distance-from-center\n   */\n  @Test\n  @UiThreadTest\n  fun symbolLayerDistanceFromCenterFilterTest() {\n    val expression = lt {\n      distanceFromCenter()\n      literal(1.0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[<, [distance-from-center], 1.0]\",\n      layer.filter.toString()\n    )\n  }\n\n  /**\n   * Verify that symbol layers can be filtered using pitch\n   */\n  @Test\n  @UiThreadTest\n  fun symbolLayerPitchFilterTest() {\n    val expression = lt {\n      pitch()\n      literal(20.0)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[<, [pitch], 20.0]\",\n      layer.filter.toString()\n    )\n  }\n}"
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/CustomLayerTest.kt",
    "content": "package com.mapbox.maps.testapp.style.layers\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.CustomLayerHost\nimport com.mapbox.maps.CustomLayerRenderParameters\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.CustomLayer\nimport com.mapbox.maps.extension.style.layers.customLayer\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for CustomLayer\n */\n@RunWith(AndroidJUnit4::class)\nclass CustomLayerTest : BaseStyleTest() {\n\n  private val emptyHost = object : CustomLayerHost {\n    override fun initialize() {\n    }\n\n    override fun render(parameters: CustomLayerRenderParameters) {\n    }\n\n    override fun contextLost() {\n    }\n\n    override fun deinitialize() {\n    }\n  }\n\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val testValue = 10.0\n    val layer = customLayer(\"id\", emptyHost) {\n      maxZoom(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.maxZoom?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val testValue = 12.0\n    val layer = customLayer(\"id\", emptyHost) {\n      minZoom(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.minZoom?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun slotTest() {\n    val testValue = \"bottom\"\n    val layer = customLayer(\"id\", emptyHost) {\n      slot(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.slot)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = customLayer(\"id\", emptyHost) {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = customLayer(\"id\", emptyHost) {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", CustomLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", CustomLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", CustomLayer.defaultMaxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val slotTestValue = \"middle\"\n    val visibilityTestValue = Visibility.NONE\n    val maxZoomTestValue = 15.0\n    val minZoomTestValue = 10.0\n\n    val layer = customLayer(\"id\", emptyHost) {\n      slot(slotTestValue)\n      visibility(visibilityTestValue)\n      maxZoom(maxZoomTestValue)\n      minZoom(minZoomTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as CustomLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(slotTestValue, cachedLayer.slot)\n    assertEquals(visibilityTestValue, cachedLayer.visibility)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n  }\n}"
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/SlotLayerTest.kt",
    "content": "package com.mapbox.maps.testapp.style.layers\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.layers.generated.slotLayer\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\nclass SlotLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun slotTest() {\n    val slotLayerId = \"id\"\n    val testValue = \"customSlot\"\n    val layer = slotLayer(slotLayerId) {\n      slot(testValue)\n    }\n    setupLayer(layer)\n    Assert.assertEquals(testValue, layer.slot)\n  }\n}"
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/BackgroundLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for BackgroundLayer\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass BackgroundLayerTest : BaseStyleTest() {\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun backgroundColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = backgroundLayer(\"id\") {\n      backgroundColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.backgroundColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = backgroundLayer(\"id\") {\n      backgroundColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.backgroundColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.backgroundColor)\n    assertEquals(Color.BLACK, layer.backgroundColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = backgroundLayer(\"id\") {\n      backgroundColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.backgroundColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = backgroundLayer(\"id\") {\n      backgroundColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.backgroundColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundColorAsColorIntTest() {\n    val layer = backgroundLayer(\"id\") {\n      backgroundColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.backgroundColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundColorUseTheme() {\n    val theme = \"none\"\n    val layer = backgroundLayer(\"id\") {\n      backgroundColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.backgroundColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = backgroundLayer(\"id\") {\n      backgroundColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.backgroundColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = backgroundLayer(\"id\") {\n      backgroundColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.backgroundColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = backgroundLayer(\"id\") {\n      backgroundEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.backgroundEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundEmissiveStrengthAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = backgroundLayer(\"id\") {\n      backgroundEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.backgroundEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.backgroundEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = backgroundLayer(\"id\") {\n      backgroundEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.backgroundEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = backgroundLayer(\"id\") {\n      backgroundEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.backgroundEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundOpacityTest() {\n    val testValue = 1.0\n    val layer = backgroundLayer(\"id\") {\n      backgroundOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.backgroundOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundOpacityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = backgroundLayer(\"id\") {\n      backgroundOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.backgroundOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.backgroundOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = backgroundLayer(\"id\") {\n      backgroundOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.backgroundOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = backgroundLayer(\"id\") {\n      backgroundOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.backgroundOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundPatternTest() {\n    val testValue = \"abc\"\n    val layer = backgroundLayer(\"id\") {\n      backgroundPattern(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.backgroundPattern?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundPatternAsExpressionTest() {\n    val expression = literal(\"abc\")\n    val layer = backgroundLayer(\"id\") {\n      backgroundPattern(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.backgroundPatternAsExpression.toString())\n    assertEquals(expression.toString(), layer.backgroundPattern)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundPitchAlignmentTest() {\n    val layer = backgroundLayer(\"id\") {\n      backgroundPitchAlignment(BackgroundPitchAlignment.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(BackgroundPitchAlignment.MAP, layer.backgroundPitchAlignment)\n  }\n\n  @Test\n  @UiThreadTest\n  fun backgroundPitchAlignmentAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = backgroundLayer(\"id\") {\n      backgroundPitchAlignment(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.backgroundPitchAlignmentAsExpression.toString())\n    assertEquals(BackgroundPitchAlignment.MAP, layer.backgroundPitchAlignment!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = backgroundLayer(\"id\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = backgroundLayer(\"id\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", BackgroundLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", BackgroundLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", BackgroundLayer.defaultMaxZoom)\n    assertNotNull(\"defaultBackgroundColor should not be null\", BackgroundLayer.defaultBackgroundColor)\n    assertNotNull(\"defaultBackgroundColorAsExpression should not be null\", BackgroundLayer.defaultBackgroundColorAsExpression)\n    assertNotNull(\"defaultBackgroundColorAsColorInt should not be null\", BackgroundLayer.defaultBackgroundColorAsColorInt)\n    assertNotNull(\"defaultBackgroundColorUseTheme should not be null\", BackgroundLayer.defaultBackgroundColorUseTheme)\n    assertNotNull(\"defaultBackgroundColorUseThemeAsExpression should not be null\", BackgroundLayer.defaultBackgroundColorUseThemeAsExpression)\n    assertNotNull(\"defaultBackgroundColorTransition should not be null\", BackgroundLayer.defaultBackgroundColorTransition)\n    assertNotNull(\"defaultBackgroundEmissiveStrength should not be null\", BackgroundLayer.defaultBackgroundEmissiveStrength)\n    assertNotNull(\"defaultBackgroundEmissiveStrengthAsExpression should not be null\", BackgroundLayer.defaultBackgroundEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultBackgroundEmissiveStrengthTransition should not be null\", BackgroundLayer.defaultBackgroundEmissiveStrengthTransition)\n    assertNotNull(\"defaultBackgroundOpacity should not be null\", BackgroundLayer.defaultBackgroundOpacity)\n    assertNotNull(\"defaultBackgroundOpacityAsExpression should not be null\", BackgroundLayer.defaultBackgroundOpacityAsExpression)\n    assertNotNull(\"defaultBackgroundOpacityTransition should not be null\", BackgroundLayer.defaultBackgroundOpacityTransition)\n    assertNotNull(\"defaultBackgroundPattern should not be null\", BackgroundLayer.defaultBackgroundPattern)\n    assertNotNull(\"defaultBackgroundPatternAsExpression should not be null\", BackgroundLayer.defaultBackgroundPatternAsExpression)\n    assertNotNull(\"defaultBackgroundPitchAlignment should not be null\", BackgroundLayer.defaultBackgroundPitchAlignment)\n    assertNotNull(\"defaultBackgroundPitchAlignmentAsExpression should not be null\", BackgroundLayer.defaultBackgroundPitchAlignmentAsExpression)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val backgroundColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val backgroundColorUseThemeTestValue = \"default\"\n    val backgroundEmissiveStrengthTestValue = 1.0\n    val backgroundOpacityTestValue = 1.0\n    val backgroundPatternTestValue = \"abc\"\n    val backgroundPitchAlignmentTestValue = BackgroundPitchAlignment.MAP\n\n    val layer = backgroundLayer(\"id\") {\n      backgroundColor(backgroundColorTestValue)\n      backgroundColorUseTheme(backgroundColorUseThemeTestValue)\n      backgroundEmissiveStrength(backgroundEmissiveStrengthTestValue)\n      backgroundOpacity(backgroundOpacityTestValue)\n      backgroundPattern(backgroundPatternTestValue)\n      backgroundPitchAlignment(backgroundPitchAlignmentTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as BackgroundLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(backgroundColorTestValue, cachedLayer.backgroundColor)\n    assertEquals(backgroundColorUseThemeTestValue, cachedLayer.backgroundColorUseTheme)\n    assertEquals(backgroundEmissiveStrengthTestValue, cachedLayer.backgroundEmissiveStrength)\n    assertEquals(backgroundOpacityTestValue, cachedLayer.backgroundOpacity)\n    assertEquals(backgroundPatternTestValue, cachedLayer.backgroundPattern)\n    assertEquals(backgroundPitchAlignmentTestValue, cachedLayer.backgroundPitchAlignment)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/CircleLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for CircleLayer\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass CircleLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = circleLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun circleElevationReferenceTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      circleElevationReference(CircleElevationReference.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(CircleElevationReference.NONE, layer.circleElevationReference)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleElevationReferenceAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = circleLayer(\"id\", \"source\") {\n      circleElevationReference(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleElevationReferenceAsExpression.toString())\n    assertEquals(CircleElevationReference.NONE, layer.circleElevationReference!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleSortKeyTest() {\n    val testValue = 1.0\n    val layer = circleLayer(\"id\", \"source\") {\n      circleSortKey(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.circleSortKey!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleSortKeyAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleSortKey(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleSortKeyAsExpression.toString())\n    assertEquals(null, layer.circleSortKey)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleBlurTest() {\n    val testValue = 1.0\n    val layer = circleLayer(\"id\", \"source\") {\n      circleBlur(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.circleBlur!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleBlurAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleBlur(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleBlurAsExpression.toString())\n    assertEquals(null, layer.circleBlur)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleBlurTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleBlurTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleBlurTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleBlurTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleBlurTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleBlurTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.circleColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleColorAsExpression.toString())\n    assertEquals(null, layer.circleColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.circleColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.circleColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleColorAsColorIntTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.circleColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleColorUseTheme() {\n    val theme = \"none\"\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.circleColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = circleLayer(\"id\", \"source\") {\n      circleEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.circleEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleEmissiveStrengthAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = circleLayer(\"id\", \"source\") {\n      circleEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.circleEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.circleEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleOpacityTest() {\n    val testValue = 1.0\n    val layer = circleLayer(\"id\", \"source\") {\n      circleOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.circleOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleOpacityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleOpacityAsExpression.toString())\n    assertEquals(null, layer.circleOpacity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circlePitchAlignmentTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      circlePitchAlignment(CirclePitchAlignment.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(CirclePitchAlignment.MAP, layer.circlePitchAlignment)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circlePitchAlignmentAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = circleLayer(\"id\", \"source\") {\n      circlePitchAlignment(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circlePitchAlignmentAsExpression.toString())\n    assertEquals(CirclePitchAlignment.MAP, layer.circlePitchAlignment!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circlePitchScaleTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      circlePitchScale(CirclePitchScale.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(CirclePitchScale.MAP, layer.circlePitchScale)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circlePitchScaleAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = circleLayer(\"id\", \"source\") {\n      circlePitchScale(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circlePitchScaleAsExpression.toString())\n    assertEquals(CirclePitchScale.MAP, layer.circlePitchScale!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleRadiusTest() {\n    val testValue = 1.0\n    val layer = circleLayer(\"id\", \"source\") {\n      circleRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.circleRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleRadiusAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleRadiusAsExpression.toString())\n    assertEquals(null, layer.circleRadius)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleRadiusTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleRadiusTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleRadiusTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.circleStrokeColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleStrokeColorAsExpression.toString())\n    assertEquals(null, layer.circleStrokeColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.circleStrokeColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.circleStrokeColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeColorAsColorIntTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.circleStrokeColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeColorUseTheme() {\n    val theme = \"none\"\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.circleStrokeColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleStrokeColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleStrokeColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeOpacityTest() {\n    val testValue = 1.0\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.circleStrokeOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeOpacityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleStrokeOpacityAsExpression.toString())\n    assertEquals(null, layer.circleStrokeOpacity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleStrokeOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleStrokeOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeWidthTest() {\n    val testValue = 1.0\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeWidth(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.circleStrokeWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeWidthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeWidth(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleStrokeWidthAsExpression.toString())\n    assertEquals(null, layer.circleStrokeWidth)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeWidthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleStrokeWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleStrokeWidthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleStrokeWidthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleStrokeWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = circleLayer(\"id\", \"source\") {\n      circleTranslate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.circleTranslate?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleTranslateAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n    val layer = circleLayer(\"id\", \"source\") {\n      circleTranslate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.circleTranslate!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleTranslateTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleTranslateTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = circleLayer(\"id\", \"source\") {\n      circleTranslateTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.circleTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleTranslateAnchorTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      circleTranslateAnchor(CircleTranslateAnchor.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(CircleTranslateAnchor.MAP, layer.circleTranslateAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun circleTranslateAnchorAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = circleLayer(\"id\", \"source\") {\n      circleTranslateAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.circleTranslateAnchorAsExpression.toString())\n    assertEquals(CircleTranslateAnchor.MAP, layer.circleTranslateAnchor!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = circleLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", CircleLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", CircleLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", CircleLayer.defaultMaxZoom)\n    assertNotNull(\"defaultCircleElevationReference should not be null\", CircleLayer.defaultCircleElevationReference)\n    assertNotNull(\"defaultCircleElevationReferenceAsExpression should not be null\", CircleLayer.defaultCircleElevationReferenceAsExpression)\n    assertNotNull(\"defaultCircleSortKey should not be null\", CircleLayer.defaultCircleSortKey)\n    assertNotNull(\"defaultCircleSortKeyAsExpression should not be null\", CircleLayer.defaultCircleSortKeyAsExpression)\n    assertNotNull(\"defaultCircleBlur should not be null\", CircleLayer.defaultCircleBlur)\n    assertNotNull(\"defaultCircleBlurAsExpression should not be null\", CircleLayer.defaultCircleBlurAsExpression)\n    assertNotNull(\"defaultCircleBlurTransition should not be null\", CircleLayer.defaultCircleBlurTransition)\n    assertNotNull(\"defaultCircleColor should not be null\", CircleLayer.defaultCircleColor)\n    assertNotNull(\"defaultCircleColorAsExpression should not be null\", CircleLayer.defaultCircleColorAsExpression)\n    assertNotNull(\"defaultCircleColorAsColorInt should not be null\", CircleLayer.defaultCircleColorAsColorInt)\n    assertNotNull(\"defaultCircleColorUseTheme should not be null\", CircleLayer.defaultCircleColorUseTheme)\n    assertNotNull(\"defaultCircleColorUseThemeAsExpression should not be null\", CircleLayer.defaultCircleColorUseThemeAsExpression)\n    assertNotNull(\"defaultCircleColorTransition should not be null\", CircleLayer.defaultCircleColorTransition)\n    assertNotNull(\"defaultCircleEmissiveStrength should not be null\", CircleLayer.defaultCircleEmissiveStrength)\n    assertNotNull(\"defaultCircleEmissiveStrengthAsExpression should not be null\", CircleLayer.defaultCircleEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultCircleEmissiveStrengthTransition should not be null\", CircleLayer.defaultCircleEmissiveStrengthTransition)\n    assertNotNull(\"defaultCircleOpacity should not be null\", CircleLayer.defaultCircleOpacity)\n    assertNotNull(\"defaultCircleOpacityAsExpression should not be null\", CircleLayer.defaultCircleOpacityAsExpression)\n    assertNotNull(\"defaultCircleOpacityTransition should not be null\", CircleLayer.defaultCircleOpacityTransition)\n    assertNotNull(\"defaultCirclePitchAlignment should not be null\", CircleLayer.defaultCirclePitchAlignment)\n    assertNotNull(\"defaultCirclePitchAlignmentAsExpression should not be null\", CircleLayer.defaultCirclePitchAlignmentAsExpression)\n    assertNotNull(\"defaultCirclePitchScale should not be null\", CircleLayer.defaultCirclePitchScale)\n    assertNotNull(\"defaultCirclePitchScaleAsExpression should not be null\", CircleLayer.defaultCirclePitchScaleAsExpression)\n    assertNotNull(\"defaultCircleRadius should not be null\", CircleLayer.defaultCircleRadius)\n    assertNotNull(\"defaultCircleRadiusAsExpression should not be null\", CircleLayer.defaultCircleRadiusAsExpression)\n    assertNotNull(\"defaultCircleRadiusTransition should not be null\", CircleLayer.defaultCircleRadiusTransition)\n    assertNotNull(\"defaultCircleStrokeColor should not be null\", CircleLayer.defaultCircleStrokeColor)\n    assertNotNull(\"defaultCircleStrokeColorAsExpression should not be null\", CircleLayer.defaultCircleStrokeColorAsExpression)\n    assertNotNull(\"defaultCircleStrokeColorAsColorInt should not be null\", CircleLayer.defaultCircleStrokeColorAsColorInt)\n    assertNotNull(\"defaultCircleStrokeColorUseTheme should not be null\", CircleLayer.defaultCircleStrokeColorUseTheme)\n    assertNotNull(\"defaultCircleStrokeColorUseThemeAsExpression should not be null\", CircleLayer.defaultCircleStrokeColorUseThemeAsExpression)\n    assertNotNull(\"defaultCircleStrokeColorTransition should not be null\", CircleLayer.defaultCircleStrokeColorTransition)\n    assertNotNull(\"defaultCircleStrokeOpacity should not be null\", CircleLayer.defaultCircleStrokeOpacity)\n    assertNotNull(\"defaultCircleStrokeOpacityAsExpression should not be null\", CircleLayer.defaultCircleStrokeOpacityAsExpression)\n    assertNotNull(\"defaultCircleStrokeOpacityTransition should not be null\", CircleLayer.defaultCircleStrokeOpacityTransition)\n    assertNotNull(\"defaultCircleStrokeWidth should not be null\", CircleLayer.defaultCircleStrokeWidth)\n    assertNotNull(\"defaultCircleStrokeWidthAsExpression should not be null\", CircleLayer.defaultCircleStrokeWidthAsExpression)\n    assertNotNull(\"defaultCircleStrokeWidthTransition should not be null\", CircleLayer.defaultCircleStrokeWidthTransition)\n    assertNotNull(\"defaultCircleTranslate should not be null\", CircleLayer.defaultCircleTranslate)\n    assertNotNull(\"defaultCircleTranslateAsExpression should not be null\", CircleLayer.defaultCircleTranslateAsExpression)\n    assertNotNull(\"defaultCircleTranslateTransition should not be null\", CircleLayer.defaultCircleTranslateTransition)\n    assertNotNull(\"defaultCircleTranslateAnchor should not be null\", CircleLayer.defaultCircleTranslateAnchor)\n    assertNotNull(\"defaultCircleTranslateAnchorAsExpression should not be null\", CircleLayer.defaultCircleTranslateAnchorAsExpression)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val circleElevationReferenceTestValue = CircleElevationReference.NONE\n    val circleSortKeyTestValue = 1.0\n    val circleBlurTestValue = 1.0\n    val circleColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val circleColorUseThemeTestValue = \"default\"\n    val circleEmissiveStrengthTestValue = 1.0\n    val circleOpacityTestValue = 1.0\n    val circlePitchAlignmentTestValue = CirclePitchAlignment.MAP\n    val circlePitchScaleTestValue = CirclePitchScale.MAP\n    val circleRadiusTestValue = 1.0\n    val circleStrokeColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val circleStrokeColorUseThemeTestValue = \"default\"\n    val circleStrokeOpacityTestValue = 1.0\n    val circleStrokeWidthTestValue = 1.0\n    val circleTranslateTestValue = listOf(0.0, 1.0)\n    val circleTranslateAnchorTestValue = CircleTranslateAnchor.MAP\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = circleLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      filter(filterTestValue)\n      circleElevationReference(circleElevationReferenceTestValue)\n      circleSortKey(circleSortKeyTestValue)\n      circleBlur(circleBlurTestValue)\n      circleColor(circleColorTestValue)\n      circleColorUseTheme(circleColorUseThemeTestValue)\n      circleEmissiveStrength(circleEmissiveStrengthTestValue)\n      circleOpacity(circleOpacityTestValue)\n      circlePitchAlignment(circlePitchAlignmentTestValue)\n      circlePitchScale(circlePitchScaleTestValue)\n      circleRadius(circleRadiusTestValue)\n      circleStrokeColor(circleStrokeColorTestValue)\n      circleStrokeColorUseTheme(circleStrokeColorUseThemeTestValue)\n      circleStrokeOpacity(circleStrokeOpacityTestValue)\n      circleStrokeWidth(circleStrokeWidthTestValue)\n      circleTranslate(circleTranslateTestValue)\n      circleTranslateAnchor(circleTranslateAnchorTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as CircleLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(circleElevationReferenceTestValue, cachedLayer.circleElevationReference)\n    assertEquals(circleSortKeyTestValue, cachedLayer.circleSortKey)\n    assertEquals(circleBlurTestValue, cachedLayer.circleBlur)\n    assertEquals(circleColorTestValue, cachedLayer.circleColor)\n    assertEquals(circleColorUseThemeTestValue, cachedLayer.circleColorUseTheme)\n    assertEquals(circleEmissiveStrengthTestValue, cachedLayer.circleEmissiveStrength)\n    assertEquals(circleOpacityTestValue, cachedLayer.circleOpacity)\n    assertEquals(circlePitchAlignmentTestValue, cachedLayer.circlePitchAlignment)\n    assertEquals(circlePitchScaleTestValue, cachedLayer.circlePitchScale)\n    assertEquals(circleRadiusTestValue, cachedLayer.circleRadius)\n    assertEquals(circleStrokeColorTestValue, cachedLayer.circleStrokeColor)\n    assertEquals(circleStrokeColorUseThemeTestValue, cachedLayer.circleStrokeColorUseTheme)\n    assertEquals(circleStrokeOpacityTestValue, cachedLayer.circleStrokeOpacity)\n    assertEquals(circleStrokeWidthTestValue, cachedLayer.circleStrokeWidth)\n    assertEquals(circleTranslateTestValue, cachedLayer.circleTranslate)\n    assertEquals(circleTranslateAnchorTestValue, cachedLayer.circleTranslateAnchor)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/ClipLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for ClipLayer\n */\n@RunWith(AndroidJUnit4::class)\nclass ClipLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = clipLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = clipLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = clipLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = clipLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun clipLayerScopeTest() {\n    val testValue = listOf(\"a\", \"b\", \"c\")\n    val layer = clipLayer(\"id\", \"source\") {\n      clipLayerScope(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.clipLayerScope?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun clipLayerScopeAsExpressionTest() {\n    val expression = literal(listOf(\"a\", \"b\", \"c\"))\n    val layer = clipLayer(\"id\", \"source\") {\n      clipLayerScope(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.clipLayerScopeAsExpression.toString())\n    assertEquals(listOf(\"a\", \"b\", \"c\"), layer.clipLayerScope!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun clipLayerTypesTest() {\n    val testValue = listOf(\"model\", \"symbol\")\n    val layer = clipLayer(\"id\", \"source\") {\n      clipLayerTypes(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.clipLayerTypes?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun clipLayerTypesAsExpressionTest() {\n    val expression = literal(listOf(\"model\", \"symbol\"))\n    val layer = clipLayer(\"id\", \"source\") {\n      clipLayerTypes(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.clipLayerTypesAsExpression.toString())\n    assertEquals(listOf(\"model\", \"symbol\"), layer.clipLayerTypes!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = clipLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = clipLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", ClipLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", ClipLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", ClipLayer.defaultMaxZoom)\n    assertNotNull(\"defaultClipLayerScope should not be null\", ClipLayer.defaultClipLayerScope)\n    assertNotNull(\"defaultClipLayerScopeAsExpression should not be null\", ClipLayer.defaultClipLayerScopeAsExpression)\n    assertNotNull(\"defaultClipLayerTypes should not be null\", ClipLayer.defaultClipLayerTypes)\n    assertNotNull(\"defaultClipLayerTypesAsExpression should not be null\", ClipLayer.defaultClipLayerTypesAsExpression)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val clipLayerScopeTestValue = listOf(\"a\", \"b\", \"c\")\n    val clipLayerTypesTestValue = listOf(\"model\", \"symbol\")\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = clipLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      filter(filterTestValue)\n      clipLayerScope(clipLayerScopeTestValue)\n      clipLayerTypes(clipLayerTypesTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as ClipLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(clipLayerScopeTestValue, cachedLayer.clipLayerScope)\n    assertEquals(clipLayerTypesTestValue, cachedLayer.clipLayerTypes)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/FillExtrusionLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for FillExtrusionLayer\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass FillExtrusionLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionEdgeRadiusTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionEdgeRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionEdgeRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionEdgeRadiusAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionEdgeRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionEdgeRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionEdgeRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionGroundAttenuationTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionGroundAttenuation(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionAmbientOcclusionGroundAttenuation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionGroundAttenuationAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionGroundAttenuation(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionGroundAttenuationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionGroundAttenuation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionGroundAttenuationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionGroundAttenuationTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionGroundAttenuationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionGroundAttenuationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionGroundAttenuationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionGroundAttenuationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionGroundRadiusTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionGroundRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionAmbientOcclusionGroundRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionGroundRadiusAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionGroundRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionGroundRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionGroundRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionGroundRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionGroundRadiusTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionGroundRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionGroundRadiusTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionGroundRadiusTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionGroundRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionIntensityTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionIntensity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionAmbientOcclusionIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionIntensityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionIntensity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionIntensityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionIntensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionIntensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionRadiusTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionAmbientOcclusionRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionRadiusAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionRadiusTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionRadiusTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionRadiusTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionWallRadiusTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionWallRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionAmbientOcclusionWallRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionWallRadiusAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionWallRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionWallRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionAmbientOcclusionWallRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionWallRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionWallRadiusTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionWallRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionAmbientOcclusionWallRadiusTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionAmbientOcclusionWallRadiusTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionAmbientOcclusionWallRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionBaseTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionBase(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionBase!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionBaseAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionBase(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionBaseAsExpression.toString())\n    assertEquals(null, layer.fillExtrusionBase)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionBaseTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionBaseTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionBaseTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionBaseTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionBaseTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionBaseTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionBaseAlignmentTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionBaseAlignment(FillExtrusionBaseAlignment.TERRAIN)\n    }\n    setupLayer(layer)\n    assertEquals(FillExtrusionBaseAlignment.TERRAIN, layer.fillExtrusionBaseAlignment)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionBaseAlignmentAsExpressionTest() {\n    val expression = literal(\"terrain\")\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionBaseAlignment(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionBaseAlignmentAsExpression.toString())\n    assertEquals(FillExtrusionBaseAlignment.TERRAIN, layer.fillExtrusionBaseAlignment!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionCastShadowsTest() {\n    val testValue = true\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionCastShadows(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillExtrusionCastShadows?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionCastShadowsAsExpressionTest() {\n    val expression = literal(true)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionCastShadows(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionCastShadowsAsExpression.toString())\n    assertEquals(true, layer.fillExtrusionCastShadows!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillExtrusionColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionColorAsExpression.toString())\n    assertEquals(null, layer.fillExtrusionColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.fillExtrusionColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.fillExtrusionColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionColorAsColorIntTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.fillExtrusionColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionColorUseTheme() {\n    val theme = \"none\"\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.fillExtrusionColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionCutoffFadeRangeTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionCutoffFadeRange(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionCutoffFadeRange!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionCutoffFadeRangeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionCutoffFadeRange(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionCutoffFadeRangeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionCutoffFadeRange!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionEmissiveStrengthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionEmissiveStrengthAsExpression.toString())\n    assertEquals(null, layer.fillExtrusionEmissiveStrength)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillExtrusionFloodLightColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.fillExtrusionFloodLightColor)\n    assertEquals(Color.BLACK, layer.fillExtrusionFloodLightColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.fillExtrusionFloodLightColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightColorAsColorIntTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.fillExtrusionFloodLightColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightColorUseTheme() {\n    val theme = \"none\"\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.fillExtrusionFloodLightColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightGroundAttenuationTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightGroundAttenuation(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionFloodLightGroundAttenuation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightGroundAttenuationAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightGroundAttenuation(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionFloodLightGroundAttenuationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionFloodLightGroundAttenuation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightGroundAttenuationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightGroundAttenuationTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightGroundAttenuationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightGroundAttenuationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightGroundAttenuationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightGroundAttenuationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightGroundRadiusTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightGroundRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionFloodLightGroundRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightGroundRadiusAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightGroundRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightGroundRadiusAsExpression.toString())\n    assertEquals(null, layer.fillExtrusionFloodLightGroundRadius)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightGroundRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightGroundRadiusTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightGroundRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightGroundRadiusTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightGroundRadiusTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightGroundRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightIntensityTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightIntensity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionFloodLightIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightIntensityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightIntensity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionFloodLightIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionFloodLightIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightIntensityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightIntensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightIntensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightWallRadiusTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightWallRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionFloodLightWallRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightWallRadiusAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightWallRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionFloodLightWallRadiusAsExpression.toString())\n    assertEquals(null, layer.fillExtrusionFloodLightWallRadius)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightWallRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightWallRadiusTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightWallRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionFloodLightWallRadiusTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionFloodLightWallRadiusTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionFloodLightWallRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionHeightTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionHeight(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionHeight!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionHeightAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionHeight(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionHeightAsExpression.toString())\n    assertEquals(null, layer.fillExtrusionHeight)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionHeightTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionHeightTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionHeightTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionHeightTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionHeightTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionHeightTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionHeightAlignmentTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionHeightAlignment(FillExtrusionHeightAlignment.TERRAIN)\n    }\n    setupLayer(layer)\n    assertEquals(FillExtrusionHeightAlignment.TERRAIN, layer.fillExtrusionHeightAlignment)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionHeightAlignmentAsExpressionTest() {\n    val expression = literal(\"terrain\")\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionHeightAlignment(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionHeightAlignmentAsExpression.toString())\n    assertEquals(FillExtrusionHeightAlignment.TERRAIN, layer.fillExtrusionHeightAlignment!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionLineWidthTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionLineWidth(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionLineWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionLineWidthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionLineWidth(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionLineWidthAsExpression.toString())\n    assertEquals(null, layer.fillExtrusionLineWidth)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionLineWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionLineWidthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionLineWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionLineWidthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionLineWidthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionLineWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionOpacityTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionOpacityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionPatternTest() {\n    val testValue = \"abc\"\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionPattern(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillExtrusionPattern?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionPatternAsExpressionTest() {\n    val expression = image {\n      string {\n        get {\n          literal(\"resolvedImage\")\n        }\n      }\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionPattern(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionPatternAsExpression.toString())\n    assertEquals(null, layer.fillExtrusionPattern)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionPatternCrossFadeTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionPatternCrossFade(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionPatternCrossFade!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionPatternCrossFadeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionPatternCrossFade(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionPatternCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionPatternCrossFade!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionRoundedRoofTest() {\n    val testValue = true\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionRoundedRoof(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillExtrusionRoundedRoof?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionRoundedRoofAsExpressionTest() {\n    val expression = literal(true)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionRoundedRoof(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionRoundedRoofAsExpression.toString())\n    assertEquals(true, layer.fillExtrusionRoundedRoof!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionTranslate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillExtrusionTranslate?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionTranslateAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionTranslate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.fillExtrusionTranslate!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionTranslateTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionTranslateTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionTranslateTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionTranslateAnchorTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionTranslateAnchor(FillExtrusionTranslateAnchor.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(FillExtrusionTranslateAnchor.MAP, layer.fillExtrusionTranslateAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionTranslateAnchorAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionTranslateAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionTranslateAnchorAsExpression.toString())\n    assertEquals(FillExtrusionTranslateAnchor.MAP, layer.fillExtrusionTranslateAnchor!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionVerticalGradientTest() {\n    val testValue = true\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionVerticalGradient(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillExtrusionVerticalGradient?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionVerticalGradientAsExpressionTest() {\n    val expression = literal(true)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionVerticalGradient(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillExtrusionVerticalGradientAsExpression.toString())\n    assertEquals(true, layer.fillExtrusionVerticalGradient!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionVerticalScaleTest() {\n    val testValue = 1.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionVerticalScale(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillExtrusionVerticalScale!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionVerticalScaleAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionVerticalScale(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillExtrusionVerticalScaleAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillExtrusionVerticalScale!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionVerticalScaleTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionVerticalScaleTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionVerticalScaleTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillExtrusionVerticalScaleTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      fillExtrusionVerticalScaleTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillExtrusionVerticalScaleTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", FillExtrusionLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", FillExtrusionLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", FillExtrusionLayer.defaultMaxZoom)\n    assertNotNull(\"defaultFillExtrusionEdgeRadius should not be null\", FillExtrusionLayer.defaultFillExtrusionEdgeRadius)\n    assertNotNull(\"defaultFillExtrusionEdgeRadiusAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionEdgeRadiusAsExpression)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionGroundAttenuation should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuation)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuationAsExpression)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionGroundAttenuationTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundAttenuationTransition)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionGroundRadius should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadius)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadiusAsExpression)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionGroundRadiusTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionGroundRadiusTransition)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionIntensity should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensity)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionIntensityAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensityAsExpression)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionIntensityTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionIntensityTransition)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionRadius should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadius)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionRadiusAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadiusAsExpression)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionRadiusTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionRadiusTransition)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionWallRadius should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadius)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionWallRadiusAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadiusAsExpression)\n    assertNotNull(\"defaultFillExtrusionAmbientOcclusionWallRadiusTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionAmbientOcclusionWallRadiusTransition)\n    assertNotNull(\"defaultFillExtrusionBase should not be null\", FillExtrusionLayer.defaultFillExtrusionBase)\n    assertNotNull(\"defaultFillExtrusionBaseAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionBaseAsExpression)\n    assertNotNull(\"defaultFillExtrusionBaseTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionBaseTransition)\n    assertNotNull(\"defaultFillExtrusionBaseAlignment should not be null\", FillExtrusionLayer.defaultFillExtrusionBaseAlignment)\n    assertNotNull(\"defaultFillExtrusionBaseAlignmentAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionBaseAlignmentAsExpression)\n    assertNotNull(\"defaultFillExtrusionCastShadows should not be null\", FillExtrusionLayer.defaultFillExtrusionCastShadows)\n    assertNotNull(\"defaultFillExtrusionCastShadowsAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionCastShadowsAsExpression)\n    assertNotNull(\"defaultFillExtrusionColor should not be null\", FillExtrusionLayer.defaultFillExtrusionColor)\n    assertNotNull(\"defaultFillExtrusionColorAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionColorAsExpression)\n    assertNotNull(\"defaultFillExtrusionColorAsColorInt should not be null\", FillExtrusionLayer.defaultFillExtrusionColorAsColorInt)\n    assertNotNull(\"defaultFillExtrusionColorUseTheme should not be null\", FillExtrusionLayer.defaultFillExtrusionColorUseTheme)\n    assertNotNull(\"defaultFillExtrusionColorUseThemeAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionColorUseThemeAsExpression)\n    assertNotNull(\"defaultFillExtrusionColorTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionColorTransition)\n    assertNotNull(\"defaultFillExtrusionCutoffFadeRange should not be null\", FillExtrusionLayer.defaultFillExtrusionCutoffFadeRange)\n    assertNotNull(\"defaultFillExtrusionCutoffFadeRangeAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionCutoffFadeRangeAsExpression)\n    assertNotNull(\"defaultFillExtrusionEmissiveStrength should not be null\", FillExtrusionLayer.defaultFillExtrusionEmissiveStrength)\n    assertNotNull(\"defaultFillExtrusionEmissiveStrengthAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultFillExtrusionEmissiveStrengthTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionEmissiveStrengthTransition)\n    assertNotNull(\"defaultFillExtrusionFloodLightColor should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightColor)\n    assertNotNull(\"defaultFillExtrusionFloodLightColorAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsExpression)\n    assertNotNull(\"defaultFillExtrusionFloodLightColorAsColorInt should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightColorAsColorInt)\n    assertNotNull(\"defaultFillExtrusionFloodLightColorUseTheme should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightColorUseTheme)\n    assertNotNull(\"defaultFillExtrusionFloodLightColorUseThemeAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightColorUseThemeAsExpression)\n    assertNotNull(\"defaultFillExtrusionFloodLightColorTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightColorTransition)\n    assertNotNull(\"defaultFillExtrusionFloodLightGroundAttenuation should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuation)\n    assertNotNull(\"defaultFillExtrusionFloodLightGroundAttenuationAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuationAsExpression)\n    assertNotNull(\"defaultFillExtrusionFloodLightGroundAttenuationTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightGroundAttenuationTransition)\n    assertNotNull(\"defaultFillExtrusionFloodLightGroundRadius should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadius)\n    assertNotNull(\"defaultFillExtrusionFloodLightGroundRadiusAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadiusAsExpression)\n    assertNotNull(\"defaultFillExtrusionFloodLightGroundRadiusTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightGroundRadiusTransition)\n    assertNotNull(\"defaultFillExtrusionFloodLightIntensity should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightIntensity)\n    assertNotNull(\"defaultFillExtrusionFloodLightIntensityAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightIntensityAsExpression)\n    assertNotNull(\"defaultFillExtrusionFloodLightIntensityTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightIntensityTransition)\n    assertNotNull(\"defaultFillExtrusionFloodLightWallRadius should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadius)\n    assertNotNull(\"defaultFillExtrusionFloodLightWallRadiusAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadiusAsExpression)\n    assertNotNull(\"defaultFillExtrusionFloodLightWallRadiusTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionFloodLightWallRadiusTransition)\n    assertNotNull(\"defaultFillExtrusionHeight should not be null\", FillExtrusionLayer.defaultFillExtrusionHeight)\n    assertNotNull(\"defaultFillExtrusionHeightAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionHeightAsExpression)\n    assertNotNull(\"defaultFillExtrusionHeightTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionHeightTransition)\n    assertNotNull(\"defaultFillExtrusionHeightAlignment should not be null\", FillExtrusionLayer.defaultFillExtrusionHeightAlignment)\n    assertNotNull(\"defaultFillExtrusionHeightAlignmentAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionHeightAlignmentAsExpression)\n    assertNotNull(\"defaultFillExtrusionLineWidth should not be null\", FillExtrusionLayer.defaultFillExtrusionLineWidth)\n    assertNotNull(\"defaultFillExtrusionLineWidthAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionLineWidthAsExpression)\n    assertNotNull(\"defaultFillExtrusionLineWidthTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionLineWidthTransition)\n    assertNotNull(\"defaultFillExtrusionOpacity should not be null\", FillExtrusionLayer.defaultFillExtrusionOpacity)\n    assertNotNull(\"defaultFillExtrusionOpacityAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionOpacityAsExpression)\n    assertNotNull(\"defaultFillExtrusionOpacityTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionOpacityTransition)\n    assertNotNull(\"defaultFillExtrusionPattern should not be null\", FillExtrusionLayer.defaultFillExtrusionPattern)\n    assertNotNull(\"defaultFillExtrusionPatternAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionPatternAsExpression)\n    assertNotNull(\"defaultFillExtrusionPatternCrossFade should not be null\", FillExtrusionLayer.defaultFillExtrusionPatternCrossFade)\n    assertNotNull(\"defaultFillExtrusionPatternCrossFadeAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionPatternCrossFadeAsExpression)\n    assertNotNull(\"defaultFillExtrusionRoundedRoof should not be null\", FillExtrusionLayer.defaultFillExtrusionRoundedRoof)\n    assertNotNull(\"defaultFillExtrusionRoundedRoofAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionRoundedRoofAsExpression)\n    assertNotNull(\"defaultFillExtrusionTranslate should not be null\", FillExtrusionLayer.defaultFillExtrusionTranslate)\n    assertNotNull(\"defaultFillExtrusionTranslateAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionTranslateAsExpression)\n    assertNotNull(\"defaultFillExtrusionTranslateTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionTranslateTransition)\n    assertNotNull(\"defaultFillExtrusionTranslateAnchor should not be null\", FillExtrusionLayer.defaultFillExtrusionTranslateAnchor)\n    assertNotNull(\"defaultFillExtrusionTranslateAnchorAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionTranslateAnchorAsExpression)\n    assertNotNull(\"defaultFillExtrusionVerticalGradient should not be null\", FillExtrusionLayer.defaultFillExtrusionVerticalGradient)\n    assertNotNull(\"defaultFillExtrusionVerticalGradientAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionVerticalGradientAsExpression)\n    assertNotNull(\"defaultFillExtrusionVerticalScale should not be null\", FillExtrusionLayer.defaultFillExtrusionVerticalScale)\n    assertNotNull(\"defaultFillExtrusionVerticalScaleAsExpression should not be null\", FillExtrusionLayer.defaultFillExtrusionVerticalScaleAsExpression)\n    assertNotNull(\"defaultFillExtrusionVerticalScaleTransition should not be null\", FillExtrusionLayer.defaultFillExtrusionVerticalScaleTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val fillExtrusionEdgeRadiusTestValue = 1.0\n    val fillExtrusionAmbientOcclusionGroundAttenuationTestValue = 1.0\n    val fillExtrusionAmbientOcclusionGroundRadiusTestValue = 1.0\n    val fillExtrusionAmbientOcclusionIntensityTestValue = 1.0\n    val fillExtrusionAmbientOcclusionRadiusTestValue = 1.0\n    val fillExtrusionAmbientOcclusionWallRadiusTestValue = 1.0\n    val fillExtrusionBaseTestValue = 1.0\n    val fillExtrusionBaseAlignmentTestValue = FillExtrusionBaseAlignment.TERRAIN\n    val fillExtrusionCastShadowsTestValue = true\n    val fillExtrusionColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val fillExtrusionColorUseThemeTestValue = \"default\"\n    val fillExtrusionCutoffFadeRangeTestValue = 1.0\n    val fillExtrusionEmissiveStrengthTestValue = 1.0\n    val fillExtrusionFloodLightColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val fillExtrusionFloodLightColorUseThemeTestValue = \"default\"\n    val fillExtrusionFloodLightGroundAttenuationTestValue = 1.0\n    val fillExtrusionFloodLightGroundRadiusTestValue = 1.0\n    val fillExtrusionFloodLightIntensityTestValue = 1.0\n    val fillExtrusionFloodLightWallRadiusTestValue = 1.0\n    val fillExtrusionHeightTestValue = 1.0\n    val fillExtrusionHeightAlignmentTestValue = FillExtrusionHeightAlignment.TERRAIN\n    val fillExtrusionLineWidthTestValue = 1.0\n    val fillExtrusionOpacityTestValue = 1.0\n    val fillExtrusionPatternTestValue = \"abc\"\n    val fillExtrusionPatternCrossFadeTestValue = 1.0\n    val fillExtrusionRoundedRoofTestValue = true\n    val fillExtrusionTranslateTestValue = listOf(0.0, 1.0)\n    val fillExtrusionTranslateAnchorTestValue = FillExtrusionTranslateAnchor.MAP\n    val fillExtrusionVerticalGradientTestValue = true\n    val fillExtrusionVerticalScaleTestValue = 1.0\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = fillExtrusionLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      filter(filterTestValue)\n      fillExtrusionEdgeRadius(fillExtrusionEdgeRadiusTestValue)\n      fillExtrusionAmbientOcclusionGroundAttenuation(fillExtrusionAmbientOcclusionGroundAttenuationTestValue)\n      fillExtrusionAmbientOcclusionGroundRadius(fillExtrusionAmbientOcclusionGroundRadiusTestValue)\n      fillExtrusionAmbientOcclusionIntensity(fillExtrusionAmbientOcclusionIntensityTestValue)\n      fillExtrusionAmbientOcclusionRadius(fillExtrusionAmbientOcclusionRadiusTestValue)\n      fillExtrusionAmbientOcclusionWallRadius(fillExtrusionAmbientOcclusionWallRadiusTestValue)\n      fillExtrusionBase(fillExtrusionBaseTestValue)\n      fillExtrusionBaseAlignment(fillExtrusionBaseAlignmentTestValue)\n      fillExtrusionCastShadows(fillExtrusionCastShadowsTestValue)\n      fillExtrusionColor(fillExtrusionColorTestValue)\n      fillExtrusionColorUseTheme(fillExtrusionColorUseThemeTestValue)\n      fillExtrusionCutoffFadeRange(fillExtrusionCutoffFadeRangeTestValue)\n      fillExtrusionEmissiveStrength(fillExtrusionEmissiveStrengthTestValue)\n      fillExtrusionFloodLightColor(fillExtrusionFloodLightColorTestValue)\n      fillExtrusionFloodLightColorUseTheme(fillExtrusionFloodLightColorUseThemeTestValue)\n      fillExtrusionFloodLightGroundAttenuation(fillExtrusionFloodLightGroundAttenuationTestValue)\n      fillExtrusionFloodLightGroundRadius(fillExtrusionFloodLightGroundRadiusTestValue)\n      fillExtrusionFloodLightIntensity(fillExtrusionFloodLightIntensityTestValue)\n      fillExtrusionFloodLightWallRadius(fillExtrusionFloodLightWallRadiusTestValue)\n      fillExtrusionHeight(fillExtrusionHeightTestValue)\n      fillExtrusionHeightAlignment(fillExtrusionHeightAlignmentTestValue)\n      fillExtrusionLineWidth(fillExtrusionLineWidthTestValue)\n      fillExtrusionOpacity(fillExtrusionOpacityTestValue)\n      fillExtrusionPattern(fillExtrusionPatternTestValue)\n      fillExtrusionPatternCrossFade(fillExtrusionPatternCrossFadeTestValue)\n      fillExtrusionRoundedRoof(fillExtrusionRoundedRoofTestValue)\n      fillExtrusionTranslate(fillExtrusionTranslateTestValue)\n      fillExtrusionTranslateAnchor(fillExtrusionTranslateAnchorTestValue)\n      fillExtrusionVerticalGradient(fillExtrusionVerticalGradientTestValue)\n      fillExtrusionVerticalScale(fillExtrusionVerticalScaleTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as FillExtrusionLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(fillExtrusionEdgeRadiusTestValue, cachedLayer.fillExtrusionEdgeRadius)\n    assertEquals(fillExtrusionAmbientOcclusionGroundAttenuationTestValue, cachedLayer.fillExtrusionAmbientOcclusionGroundAttenuation)\n    assertEquals(fillExtrusionAmbientOcclusionGroundRadiusTestValue, cachedLayer.fillExtrusionAmbientOcclusionGroundRadius)\n    assertEquals(fillExtrusionAmbientOcclusionIntensityTestValue, cachedLayer.fillExtrusionAmbientOcclusionIntensity)\n    assertEquals(fillExtrusionAmbientOcclusionRadiusTestValue, cachedLayer.fillExtrusionAmbientOcclusionRadius)\n    assertEquals(fillExtrusionAmbientOcclusionWallRadiusTestValue, cachedLayer.fillExtrusionAmbientOcclusionWallRadius)\n    assertEquals(fillExtrusionBaseTestValue, cachedLayer.fillExtrusionBase)\n    assertEquals(fillExtrusionBaseAlignmentTestValue, cachedLayer.fillExtrusionBaseAlignment)\n    assertEquals(fillExtrusionCastShadowsTestValue, cachedLayer.fillExtrusionCastShadows)\n    assertEquals(fillExtrusionColorTestValue, cachedLayer.fillExtrusionColor)\n    assertEquals(fillExtrusionColorUseThemeTestValue, cachedLayer.fillExtrusionColorUseTheme)\n    assertEquals(fillExtrusionCutoffFadeRangeTestValue, cachedLayer.fillExtrusionCutoffFadeRange)\n    assertEquals(fillExtrusionEmissiveStrengthTestValue, cachedLayer.fillExtrusionEmissiveStrength)\n    assertEquals(fillExtrusionFloodLightColorTestValue, cachedLayer.fillExtrusionFloodLightColor)\n    assertEquals(fillExtrusionFloodLightColorUseThemeTestValue, cachedLayer.fillExtrusionFloodLightColorUseTheme)\n    assertEquals(fillExtrusionFloodLightGroundAttenuationTestValue, cachedLayer.fillExtrusionFloodLightGroundAttenuation)\n    assertEquals(fillExtrusionFloodLightGroundRadiusTestValue, cachedLayer.fillExtrusionFloodLightGroundRadius)\n    assertEquals(fillExtrusionFloodLightIntensityTestValue, cachedLayer.fillExtrusionFloodLightIntensity)\n    assertEquals(fillExtrusionFloodLightWallRadiusTestValue, cachedLayer.fillExtrusionFloodLightWallRadius)\n    assertEquals(fillExtrusionHeightTestValue, cachedLayer.fillExtrusionHeight)\n    assertEquals(fillExtrusionHeightAlignmentTestValue, cachedLayer.fillExtrusionHeightAlignment)\n    assertEquals(fillExtrusionLineWidthTestValue, cachedLayer.fillExtrusionLineWidth)\n    assertEquals(fillExtrusionOpacityTestValue, cachedLayer.fillExtrusionOpacity)\n    assertEquals(fillExtrusionPatternTestValue, cachedLayer.fillExtrusionPattern)\n    assertEquals(fillExtrusionPatternCrossFadeTestValue, cachedLayer.fillExtrusionPatternCrossFade)\n    assertEquals(fillExtrusionRoundedRoofTestValue, cachedLayer.fillExtrusionRoundedRoof)\n    assertEquals(fillExtrusionTranslateTestValue, cachedLayer.fillExtrusionTranslate)\n    assertEquals(fillExtrusionTranslateAnchorTestValue, cachedLayer.fillExtrusionTranslateAnchor)\n    assertEquals(fillExtrusionVerticalGradientTestValue, cachedLayer.fillExtrusionVerticalGradient)\n    assertEquals(fillExtrusionVerticalScaleTestValue, cachedLayer.fillExtrusionVerticalScale)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/FillLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for FillLayer\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass FillLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = fillLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun fillConstructBridgeGuardRailTest() {\n    val testValue = true\n    val layer = fillLayer(\"id\", \"source\") {\n      fillConstructBridgeGuardRail(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillConstructBridgeGuardRail?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillConstructBridgeGuardRailAsExpressionTest() {\n    val expression = boolean {\n      get {\n        literal(\"boolean\")\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillConstructBridgeGuardRail(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillConstructBridgeGuardRailAsExpression.toString())\n    assertEquals(null, layer.fillConstructBridgeGuardRail)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillElevationReferenceTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      fillElevationReference(FillElevationReference.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(FillElevationReference.NONE, layer.fillElevationReference)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillElevationReferenceAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = fillLayer(\"id\", \"source\") {\n      fillElevationReference(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillElevationReferenceAsExpression.toString())\n    assertEquals(FillElevationReference.NONE, layer.fillElevationReference!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillSortKeyTest() {\n    val testValue = 1.0\n    val layer = fillLayer(\"id\", \"source\") {\n      fillSortKey(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillSortKey!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillSortKeyAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillSortKey(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillSortKeyAsExpression.toString())\n    assertEquals(null, layer.fillSortKey)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillAntialiasTest() {\n    val testValue = true\n    val layer = fillLayer(\"id\", \"source\") {\n      fillAntialias(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillAntialias?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillAntialiasAsExpressionTest() {\n    val expression = literal(true)\n    val layer = fillLayer(\"id\", \"source\") {\n      fillAntialias(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillAntialiasAsExpression.toString())\n    assertEquals(true, layer.fillAntialias!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillBridgeGuardRailColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillBridgeGuardRailColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillBridgeGuardRailColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillBridgeGuardRailColorAsExpression.toString())\n    assertEquals(null, layer.fillBridgeGuardRailColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillBridgeGuardRailColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.fillBridgeGuardRailColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillBridgeGuardRailColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.fillBridgeGuardRailColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillBridgeGuardRailColorAsColorIntTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.fillBridgeGuardRailColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillBridgeGuardRailColorUseTheme() {\n    val theme = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.fillBridgeGuardRailColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillBridgeGuardRailColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillBridgeGuardRailColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillBridgeGuardRailColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillBridgeGuardRailColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillBridgeGuardRailColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillColorAsExpression.toString())\n    assertEquals(null, layer.fillColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.fillColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.fillColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillColorAsColorIntTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.fillColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillColorUseTheme() {\n    val theme = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.fillColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = fillLayer(\"id\", \"source\") {\n      fillEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillEmissiveStrengthAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillLayer(\"id\", \"source\") {\n      fillEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOpacityTest() {\n    val testValue = 1.0\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOpacityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillOpacityAsExpression.toString())\n    assertEquals(null, layer.fillOpacity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOutlineColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillOutlineColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOutlineColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillOutlineColorAsExpression.toString())\n    assertEquals(null, layer.fillOutlineColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOutlineColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.fillOutlineColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOutlineColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.fillOutlineColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOutlineColorAsColorIntTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.fillOutlineColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOutlineColorUseTheme() {\n    val theme = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.fillOutlineColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOutlineColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillOutlineColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillOutlineColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillOutlineColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillOutlineColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillPatternTest() {\n    val testValue = \"abc\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillPattern(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillPattern?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillPatternAsExpressionTest() {\n    val expression = image {\n      string {\n        get {\n          literal(\"resolvedImage\")\n        }\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillPattern(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillPatternAsExpression.toString())\n    assertEquals(null, layer.fillPattern)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillPatternCrossFadeTest() {\n    val testValue = 1.0\n    val layer = fillLayer(\"id\", \"source\") {\n      fillPatternCrossFade(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillPatternCrossFade!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillPatternCrossFadeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = fillLayer(\"id\", \"source\") {\n      fillPatternCrossFade(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.fillPatternCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.fillPatternCrossFade!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTranslate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillTranslate?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTranslateAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTranslate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.fillTranslate!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTranslateTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTranslateTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTranslateTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTranslateAnchorTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTranslateAnchor(FillTranslateAnchor.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(FillTranslateAnchor.MAP, layer.fillTranslateAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTranslateAnchorAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTranslateAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillTranslateAnchorAsExpression.toString())\n    assertEquals(FillTranslateAnchor.MAP, layer.fillTranslateAnchor!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTunnelStructureColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.fillTunnelStructureColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTunnelStructureColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillTunnelStructureColorAsExpression.toString())\n    assertEquals(null, layer.fillTunnelStructureColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTunnelStructureColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.fillTunnelStructureColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTunnelStructureColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.fillTunnelStructureColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTunnelStructureColorAsColorIntTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.fillTunnelStructureColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTunnelStructureColorUseTheme() {\n    val theme = \"none\"\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.fillTunnelStructureColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTunnelStructureColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillTunnelStructureColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillTunnelStructureColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillTunnelStructureColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillTunnelStructureColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillZOffsetTest() {\n    val testValue = 1.0\n    val layer = fillLayer(\"id\", \"source\") {\n      fillZOffset(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.fillZOffset!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillZOffsetAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillZOffset(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.fillZOffsetAsExpression.toString())\n    assertEquals(null, layer.fillZOffset)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillZOffsetTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillZOffsetTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillZOffsetTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun fillZOffsetTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = fillLayer(\"id\", \"source\") {\n      fillZOffsetTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.fillZOffsetTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = fillLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", FillLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", FillLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", FillLayer.defaultMaxZoom)\n    assertNotNull(\"defaultFillConstructBridgeGuardRail should not be null\", FillLayer.defaultFillConstructBridgeGuardRail)\n    assertNotNull(\"defaultFillConstructBridgeGuardRailAsExpression should not be null\", FillLayer.defaultFillConstructBridgeGuardRailAsExpression)\n    assertNotNull(\"defaultFillElevationReference should not be null\", FillLayer.defaultFillElevationReference)\n    assertNotNull(\"defaultFillElevationReferenceAsExpression should not be null\", FillLayer.defaultFillElevationReferenceAsExpression)\n    assertNotNull(\"defaultFillSortKey should not be null\", FillLayer.defaultFillSortKey)\n    assertNotNull(\"defaultFillSortKeyAsExpression should not be null\", FillLayer.defaultFillSortKeyAsExpression)\n    assertNotNull(\"defaultFillAntialias should not be null\", FillLayer.defaultFillAntialias)\n    assertNotNull(\"defaultFillAntialiasAsExpression should not be null\", FillLayer.defaultFillAntialiasAsExpression)\n    assertNotNull(\"defaultFillBridgeGuardRailColor should not be null\", FillLayer.defaultFillBridgeGuardRailColor)\n    assertNotNull(\"defaultFillBridgeGuardRailColorAsExpression should not be null\", FillLayer.defaultFillBridgeGuardRailColorAsExpression)\n    assertNotNull(\"defaultFillBridgeGuardRailColorAsColorInt should not be null\", FillLayer.defaultFillBridgeGuardRailColorAsColorInt)\n    assertNotNull(\"defaultFillBridgeGuardRailColorUseTheme should not be null\", FillLayer.defaultFillBridgeGuardRailColorUseTheme)\n    assertNotNull(\"defaultFillBridgeGuardRailColorUseThemeAsExpression should not be null\", FillLayer.defaultFillBridgeGuardRailColorUseThemeAsExpression)\n    assertNotNull(\"defaultFillBridgeGuardRailColorTransition should not be null\", FillLayer.defaultFillBridgeGuardRailColorTransition)\n    assertNotNull(\"defaultFillColor should not be null\", FillLayer.defaultFillColor)\n    assertNotNull(\"defaultFillColorAsExpression should not be null\", FillLayer.defaultFillColorAsExpression)\n    assertNotNull(\"defaultFillColorAsColorInt should not be null\", FillLayer.defaultFillColorAsColorInt)\n    assertNotNull(\"defaultFillColorUseTheme should not be null\", FillLayer.defaultFillColorUseTheme)\n    assertNotNull(\"defaultFillColorUseThemeAsExpression should not be null\", FillLayer.defaultFillColorUseThemeAsExpression)\n    assertNotNull(\"defaultFillColorTransition should not be null\", FillLayer.defaultFillColorTransition)\n    assertNotNull(\"defaultFillEmissiveStrength should not be null\", FillLayer.defaultFillEmissiveStrength)\n    assertNotNull(\"defaultFillEmissiveStrengthAsExpression should not be null\", FillLayer.defaultFillEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultFillEmissiveStrengthTransition should not be null\", FillLayer.defaultFillEmissiveStrengthTransition)\n    assertNotNull(\"defaultFillOpacity should not be null\", FillLayer.defaultFillOpacity)\n    assertNotNull(\"defaultFillOpacityAsExpression should not be null\", FillLayer.defaultFillOpacityAsExpression)\n    assertNotNull(\"defaultFillOpacityTransition should not be null\", FillLayer.defaultFillOpacityTransition)\n    assertNotNull(\"defaultFillOutlineColor should not be null\", FillLayer.defaultFillOutlineColor)\n    assertNotNull(\"defaultFillOutlineColorAsExpression should not be null\", FillLayer.defaultFillOutlineColorAsExpression)\n    assertNotNull(\"defaultFillOutlineColorAsColorInt should not be null\", FillLayer.defaultFillOutlineColorAsColorInt)\n    assertNotNull(\"defaultFillOutlineColorUseTheme should not be null\", FillLayer.defaultFillOutlineColorUseTheme)\n    assertNotNull(\"defaultFillOutlineColorUseThemeAsExpression should not be null\", FillLayer.defaultFillOutlineColorUseThemeAsExpression)\n    assertNotNull(\"defaultFillOutlineColorTransition should not be null\", FillLayer.defaultFillOutlineColorTransition)\n    assertNotNull(\"defaultFillPattern should not be null\", FillLayer.defaultFillPattern)\n    assertNotNull(\"defaultFillPatternAsExpression should not be null\", FillLayer.defaultFillPatternAsExpression)\n    assertNotNull(\"defaultFillPatternCrossFade should not be null\", FillLayer.defaultFillPatternCrossFade)\n    assertNotNull(\"defaultFillPatternCrossFadeAsExpression should not be null\", FillLayer.defaultFillPatternCrossFadeAsExpression)\n    assertNotNull(\"defaultFillTranslate should not be null\", FillLayer.defaultFillTranslate)\n    assertNotNull(\"defaultFillTranslateAsExpression should not be null\", FillLayer.defaultFillTranslateAsExpression)\n    assertNotNull(\"defaultFillTranslateTransition should not be null\", FillLayer.defaultFillTranslateTransition)\n    assertNotNull(\"defaultFillTranslateAnchor should not be null\", FillLayer.defaultFillTranslateAnchor)\n    assertNotNull(\"defaultFillTranslateAnchorAsExpression should not be null\", FillLayer.defaultFillTranslateAnchorAsExpression)\n    assertNotNull(\"defaultFillTunnelStructureColor should not be null\", FillLayer.defaultFillTunnelStructureColor)\n    assertNotNull(\"defaultFillTunnelStructureColorAsExpression should not be null\", FillLayer.defaultFillTunnelStructureColorAsExpression)\n    assertNotNull(\"defaultFillTunnelStructureColorAsColorInt should not be null\", FillLayer.defaultFillTunnelStructureColorAsColorInt)\n    assertNotNull(\"defaultFillTunnelStructureColorUseTheme should not be null\", FillLayer.defaultFillTunnelStructureColorUseTheme)\n    assertNotNull(\"defaultFillTunnelStructureColorUseThemeAsExpression should not be null\", FillLayer.defaultFillTunnelStructureColorUseThemeAsExpression)\n    assertNotNull(\"defaultFillTunnelStructureColorTransition should not be null\", FillLayer.defaultFillTunnelStructureColorTransition)\n    assertNotNull(\"defaultFillZOffset should not be null\", FillLayer.defaultFillZOffset)\n    assertNotNull(\"defaultFillZOffsetAsExpression should not be null\", FillLayer.defaultFillZOffsetAsExpression)\n    assertNotNull(\"defaultFillZOffsetTransition should not be null\", FillLayer.defaultFillZOffsetTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val fillConstructBridgeGuardRailTestValue = true\n    val fillElevationReferenceTestValue = FillElevationReference.NONE\n    val fillSortKeyTestValue = 1.0\n    val fillAntialiasTestValue = true\n    val fillBridgeGuardRailColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val fillBridgeGuardRailColorUseThemeTestValue = \"default\"\n    val fillColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val fillColorUseThemeTestValue = \"default\"\n    val fillEmissiveStrengthTestValue = 1.0\n    val fillOpacityTestValue = 1.0\n    val fillOutlineColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val fillOutlineColorUseThemeTestValue = \"default\"\n    val fillPatternTestValue = \"abc\"\n    val fillPatternCrossFadeTestValue = 1.0\n    val fillTranslateTestValue = listOf(0.0, 1.0)\n    val fillTranslateAnchorTestValue = FillTranslateAnchor.MAP\n    val fillTunnelStructureColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val fillTunnelStructureColorUseThemeTestValue = \"default\"\n    val fillZOffsetTestValue = 1.0\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = fillLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      filter(filterTestValue)\n      fillConstructBridgeGuardRail(fillConstructBridgeGuardRailTestValue)\n      fillElevationReference(fillElevationReferenceTestValue)\n      fillSortKey(fillSortKeyTestValue)\n      fillAntialias(fillAntialiasTestValue)\n      fillBridgeGuardRailColor(fillBridgeGuardRailColorTestValue)\n      fillBridgeGuardRailColorUseTheme(fillBridgeGuardRailColorUseThemeTestValue)\n      fillColor(fillColorTestValue)\n      fillColorUseTheme(fillColorUseThemeTestValue)\n      fillEmissiveStrength(fillEmissiveStrengthTestValue)\n      fillOpacity(fillOpacityTestValue)\n      fillOutlineColor(fillOutlineColorTestValue)\n      fillOutlineColorUseTheme(fillOutlineColorUseThemeTestValue)\n      fillPattern(fillPatternTestValue)\n      fillPatternCrossFade(fillPatternCrossFadeTestValue)\n      fillTranslate(fillTranslateTestValue)\n      fillTranslateAnchor(fillTranslateAnchorTestValue)\n      fillTunnelStructureColor(fillTunnelStructureColorTestValue)\n      fillTunnelStructureColorUseTheme(fillTunnelStructureColorUseThemeTestValue)\n      fillZOffset(fillZOffsetTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as FillLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(fillConstructBridgeGuardRailTestValue, cachedLayer.fillConstructBridgeGuardRail)\n    assertEquals(fillElevationReferenceTestValue, cachedLayer.fillElevationReference)\n    assertEquals(fillSortKeyTestValue, cachedLayer.fillSortKey)\n    assertEquals(fillAntialiasTestValue, cachedLayer.fillAntialias)\n    assertEquals(fillBridgeGuardRailColorTestValue, cachedLayer.fillBridgeGuardRailColor)\n    assertEquals(fillBridgeGuardRailColorUseThemeTestValue, cachedLayer.fillBridgeGuardRailColorUseTheme)\n    assertEquals(fillColorTestValue, cachedLayer.fillColor)\n    assertEquals(fillColorUseThemeTestValue, cachedLayer.fillColorUseTheme)\n    assertEquals(fillEmissiveStrengthTestValue, cachedLayer.fillEmissiveStrength)\n    assertEquals(fillOpacityTestValue, cachedLayer.fillOpacity)\n    assertEquals(fillOutlineColorTestValue, cachedLayer.fillOutlineColor)\n    assertEquals(fillOutlineColorUseThemeTestValue, cachedLayer.fillOutlineColorUseTheme)\n    assertEquals(fillPatternTestValue, cachedLayer.fillPattern)\n    assertEquals(fillPatternCrossFadeTestValue, cachedLayer.fillPatternCrossFade)\n    assertEquals(fillTranslateTestValue, cachedLayer.fillTranslate)\n    assertEquals(fillTranslateAnchorTestValue, cachedLayer.fillTranslateAnchor)\n    assertEquals(fillTunnelStructureColorTestValue, cachedLayer.fillTunnelStructureColor)\n    assertEquals(fillTunnelStructureColorUseThemeTestValue, cachedLayer.fillTunnelStructureColorUseTheme)\n    assertEquals(fillZOffsetTestValue, cachedLayer.fillZOffset)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/HeatmapLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for HeatmapLayer\n */\n@RunWith(AndroidJUnit4::class)\nclass HeatmapLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = heatmapLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = heatmapLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = heatmapLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = heatmapLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun heatmapColorTest() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.heatmapColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.heatmapColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.heatmapColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapColorUseTheme() {\n    val theme = \"none\"\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.heatmapColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapIntensityTest() {\n    val testValue = 1.0\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapIntensity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.heatmapIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapIntensityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapIntensity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.heatmapIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.heatmapIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapIntensityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.heatmapIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapIntensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapIntensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.heatmapIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapOpacityTest() {\n    val testValue = 1.0\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.heatmapOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapOpacityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.heatmapOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.heatmapOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.heatmapOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.heatmapOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapRadiusTest() {\n    val testValue = 1.0\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.heatmapRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapRadiusAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.heatmapRadiusAsExpression.toString())\n    assertEquals(null, layer.heatmapRadius)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapRadiusTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.heatmapRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapRadiusTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapRadiusTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.heatmapRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapWeightTest() {\n    val testValue = 1.0\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapWeight(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.heatmapWeight!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun heatmapWeightAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = heatmapLayer(\"id\", \"source\") {\n      heatmapWeight(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.heatmapWeightAsExpression.toString())\n    assertEquals(null, layer.heatmapWeight)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = heatmapLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = heatmapLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", HeatmapLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", HeatmapLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", HeatmapLayer.defaultMaxZoom)\n    assertNotNull(\"defaultHeatmapColor should not be null\", HeatmapLayer.defaultHeatmapColor)\n    assertNotNull(\"defaultHeatmapColorUseTheme should not be null\", HeatmapLayer.defaultHeatmapColorUseTheme)\n    assertNotNull(\"defaultHeatmapColorUseThemeAsExpression should not be null\", HeatmapLayer.defaultHeatmapColorUseThemeAsExpression)\n    assertNotNull(\"defaultHeatmapIntensity should not be null\", HeatmapLayer.defaultHeatmapIntensity)\n    assertNotNull(\"defaultHeatmapIntensityAsExpression should not be null\", HeatmapLayer.defaultHeatmapIntensityAsExpression)\n    assertNotNull(\"defaultHeatmapIntensityTransition should not be null\", HeatmapLayer.defaultHeatmapIntensityTransition)\n    assertNotNull(\"defaultHeatmapOpacity should not be null\", HeatmapLayer.defaultHeatmapOpacity)\n    assertNotNull(\"defaultHeatmapOpacityAsExpression should not be null\", HeatmapLayer.defaultHeatmapOpacityAsExpression)\n    assertNotNull(\"defaultHeatmapOpacityTransition should not be null\", HeatmapLayer.defaultHeatmapOpacityTransition)\n    assertNotNull(\"defaultHeatmapRadius should not be null\", HeatmapLayer.defaultHeatmapRadius)\n    assertNotNull(\"defaultHeatmapRadiusAsExpression should not be null\", HeatmapLayer.defaultHeatmapRadiusAsExpression)\n    assertNotNull(\"defaultHeatmapRadiusTransition should not be null\", HeatmapLayer.defaultHeatmapRadiusTransition)\n    assertNotNull(\"defaultHeatmapWeight should not be null\", HeatmapLayer.defaultHeatmapWeight)\n    assertNotNull(\"defaultHeatmapWeightAsExpression should not be null\", HeatmapLayer.defaultHeatmapWeightAsExpression)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val heatmapColorTestValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val heatmapColorUseThemeTestValue = \"default\"\n    val heatmapIntensityTestValue = 1.0\n    val heatmapOpacityTestValue = 1.0\n    val heatmapRadiusTestValue = 1.0\n    val heatmapWeightTestValue = 1.0\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = heatmapLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      filter(filterTestValue)\n      heatmapColor(heatmapColorTestValue)\n      heatmapColorUseTheme(heatmapColorUseThemeTestValue)\n      heatmapIntensity(heatmapIntensityTestValue)\n      heatmapOpacity(heatmapOpacityTestValue)\n      heatmapRadius(heatmapRadiusTestValue)\n      heatmapWeight(heatmapWeightTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as HeatmapLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(heatmapColorTestValue, cachedLayer.heatmapColor)\n    assertEquals(heatmapColorUseThemeTestValue, cachedLayer.heatmapColorUseTheme)\n    assertEquals(heatmapIntensityTestValue, cachedLayer.heatmapIntensity)\n    assertEquals(heatmapOpacityTestValue, cachedLayer.heatmapOpacity)\n    assertEquals(heatmapRadiusTestValue, cachedLayer.heatmapRadius)\n    assertEquals(heatmapWeightTestValue, cachedLayer.heatmapWeight)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/HillshadeLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for HillshadeLayer\n */\n@RunWith(AndroidJUnit4::class)\nclass HillshadeLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun hillshadeAccentColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.hillshadeAccentColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeAccentColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.hillshadeAccentColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.hillshadeAccentColor)\n    assertEquals(Color.BLACK, layer.hillshadeAccentColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeAccentColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.hillshadeAccentColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeAccentColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.hillshadeAccentColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeAccentColorAsColorIntTest() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.hillshadeAccentColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeAccentColorUseTheme() {\n    val theme = \"none\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.hillshadeAccentColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeAccentColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeAccentColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeAccentColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeAccentColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeAccentColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.hillshadeEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeEmissiveStrengthAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.hillshadeEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.hillshadeEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeExaggerationTest() {\n    val testValue = 1.0\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeExaggeration(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.hillshadeExaggeration!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeExaggerationAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeExaggeration(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.hillshadeExaggerationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.hillshadeExaggeration!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeExaggerationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeExaggerationTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeExaggerationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeExaggerationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeExaggerationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeExaggerationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeHighlightColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.hillshadeHighlightColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeHighlightColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.hillshadeHighlightColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.hillshadeHighlightColor)\n    assertEquals(Color.BLACK, layer.hillshadeHighlightColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeHighlightColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.hillshadeHighlightColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeHighlightColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.hillshadeHighlightColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeHighlightColorAsColorIntTest() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.hillshadeHighlightColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeHighlightColorUseTheme() {\n    val theme = \"none\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.hillshadeHighlightColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeHighlightColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeHighlightColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeHighlightColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeHighlightColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeHighlightColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeIlluminationAnchorTest() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeIlluminationAnchor(HillshadeIlluminationAnchor.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(HillshadeIlluminationAnchor.MAP, layer.hillshadeIlluminationAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeIlluminationAnchorAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeIlluminationAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.hillshadeIlluminationAnchorAsExpression.toString())\n    assertEquals(HillshadeIlluminationAnchor.MAP, layer.hillshadeIlluminationAnchor!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeIlluminationDirectionTest() {\n    val testValue = 1.0\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeIlluminationDirection(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.hillshadeIlluminationDirection!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeIlluminationDirectionAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeIlluminationDirection(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.hillshadeIlluminationDirectionAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.hillshadeIlluminationDirection!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeShadowColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.hillshadeShadowColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeShadowColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.hillshadeShadowColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.hillshadeShadowColor)\n    assertEquals(Color.BLACK, layer.hillshadeShadowColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeShadowColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.hillshadeShadowColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeShadowColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.hillshadeShadowColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeShadowColorAsColorIntTest() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.hillshadeShadowColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeShadowColorUseTheme() {\n    val theme = \"none\"\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.hillshadeShadowColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeShadowColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeShadowColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun hillshadeShadowColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      hillshadeShadowColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.hillshadeShadowColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", HillshadeLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", HillshadeLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", HillshadeLayer.defaultMaxZoom)\n    assertNotNull(\"defaultHillshadeAccentColor should not be null\", HillshadeLayer.defaultHillshadeAccentColor)\n    assertNotNull(\"defaultHillshadeAccentColorAsExpression should not be null\", HillshadeLayer.defaultHillshadeAccentColorAsExpression)\n    assertNotNull(\"defaultHillshadeAccentColorAsColorInt should not be null\", HillshadeLayer.defaultHillshadeAccentColorAsColorInt)\n    assertNotNull(\"defaultHillshadeAccentColorUseTheme should not be null\", HillshadeLayer.defaultHillshadeAccentColorUseTheme)\n    assertNotNull(\"defaultHillshadeAccentColorUseThemeAsExpression should not be null\", HillshadeLayer.defaultHillshadeAccentColorUseThemeAsExpression)\n    assertNotNull(\"defaultHillshadeAccentColorTransition should not be null\", HillshadeLayer.defaultHillshadeAccentColorTransition)\n    assertNotNull(\"defaultHillshadeEmissiveStrength should not be null\", HillshadeLayer.defaultHillshadeEmissiveStrength)\n    assertNotNull(\"defaultHillshadeEmissiveStrengthAsExpression should not be null\", HillshadeLayer.defaultHillshadeEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultHillshadeEmissiveStrengthTransition should not be null\", HillshadeLayer.defaultHillshadeEmissiveStrengthTransition)\n    assertNotNull(\"defaultHillshadeExaggeration should not be null\", HillshadeLayer.defaultHillshadeExaggeration)\n    assertNotNull(\"defaultHillshadeExaggerationAsExpression should not be null\", HillshadeLayer.defaultHillshadeExaggerationAsExpression)\n    assertNotNull(\"defaultHillshadeExaggerationTransition should not be null\", HillshadeLayer.defaultHillshadeExaggerationTransition)\n    assertNotNull(\"defaultHillshadeHighlightColor should not be null\", HillshadeLayer.defaultHillshadeHighlightColor)\n    assertNotNull(\"defaultHillshadeHighlightColorAsExpression should not be null\", HillshadeLayer.defaultHillshadeHighlightColorAsExpression)\n    assertNotNull(\"defaultHillshadeHighlightColorAsColorInt should not be null\", HillshadeLayer.defaultHillshadeHighlightColorAsColorInt)\n    assertNotNull(\"defaultHillshadeHighlightColorUseTheme should not be null\", HillshadeLayer.defaultHillshadeHighlightColorUseTheme)\n    assertNotNull(\"defaultHillshadeHighlightColorUseThemeAsExpression should not be null\", HillshadeLayer.defaultHillshadeHighlightColorUseThemeAsExpression)\n    assertNotNull(\"defaultHillshadeHighlightColorTransition should not be null\", HillshadeLayer.defaultHillshadeHighlightColorTransition)\n    assertNotNull(\"defaultHillshadeIlluminationAnchor should not be null\", HillshadeLayer.defaultHillshadeIlluminationAnchor)\n    assertNotNull(\"defaultHillshadeIlluminationAnchorAsExpression should not be null\", HillshadeLayer.defaultHillshadeIlluminationAnchorAsExpression)\n    assertNotNull(\"defaultHillshadeIlluminationDirection should not be null\", HillshadeLayer.defaultHillshadeIlluminationDirection)\n    assertNotNull(\"defaultHillshadeIlluminationDirectionAsExpression should not be null\", HillshadeLayer.defaultHillshadeIlluminationDirectionAsExpression)\n    assertNotNull(\"defaultHillshadeShadowColor should not be null\", HillshadeLayer.defaultHillshadeShadowColor)\n    assertNotNull(\"defaultHillshadeShadowColorAsExpression should not be null\", HillshadeLayer.defaultHillshadeShadowColorAsExpression)\n    assertNotNull(\"defaultHillshadeShadowColorAsColorInt should not be null\", HillshadeLayer.defaultHillshadeShadowColorAsColorInt)\n    assertNotNull(\"defaultHillshadeShadowColorUseTheme should not be null\", HillshadeLayer.defaultHillshadeShadowColorUseTheme)\n    assertNotNull(\"defaultHillshadeShadowColorUseThemeAsExpression should not be null\", HillshadeLayer.defaultHillshadeShadowColorUseThemeAsExpression)\n    assertNotNull(\"defaultHillshadeShadowColorTransition should not be null\", HillshadeLayer.defaultHillshadeShadowColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val hillshadeAccentColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val hillshadeAccentColorUseThemeTestValue = \"default\"\n    val hillshadeEmissiveStrengthTestValue = 1.0\n    val hillshadeExaggerationTestValue = 1.0\n    val hillshadeHighlightColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val hillshadeHighlightColorUseThemeTestValue = \"default\"\n    val hillshadeIlluminationAnchorTestValue = HillshadeIlluminationAnchor.MAP\n    val hillshadeIlluminationDirectionTestValue = 1.0\n    val hillshadeShadowColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val hillshadeShadowColorUseThemeTestValue = \"default\"\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = hillshadeLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      hillshadeAccentColor(hillshadeAccentColorTestValue)\n      hillshadeAccentColorUseTheme(hillshadeAccentColorUseThemeTestValue)\n      hillshadeEmissiveStrength(hillshadeEmissiveStrengthTestValue)\n      hillshadeExaggeration(hillshadeExaggerationTestValue)\n      hillshadeHighlightColor(hillshadeHighlightColorTestValue)\n      hillshadeHighlightColorUseTheme(hillshadeHighlightColorUseThemeTestValue)\n      hillshadeIlluminationAnchor(hillshadeIlluminationAnchorTestValue)\n      hillshadeIlluminationDirection(hillshadeIlluminationDirectionTestValue)\n      hillshadeShadowColor(hillshadeShadowColorTestValue)\n      hillshadeShadowColorUseTheme(hillshadeShadowColorUseThemeTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as HillshadeLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(hillshadeAccentColorTestValue, cachedLayer.hillshadeAccentColor)\n    assertEquals(hillshadeAccentColorUseThemeTestValue, cachedLayer.hillshadeAccentColorUseTheme)\n    assertEquals(hillshadeEmissiveStrengthTestValue, cachedLayer.hillshadeEmissiveStrength)\n    assertEquals(hillshadeExaggerationTestValue, cachedLayer.hillshadeExaggeration)\n    assertEquals(hillshadeHighlightColorTestValue, cachedLayer.hillshadeHighlightColor)\n    assertEquals(hillshadeHighlightColorUseThemeTestValue, cachedLayer.hillshadeHighlightColorUseTheme)\n    assertEquals(hillshadeIlluminationAnchorTestValue, cachedLayer.hillshadeIlluminationAnchor)\n    assertEquals(hillshadeIlluminationDirectionTestValue, cachedLayer.hillshadeIlluminationDirection)\n    assertEquals(hillshadeShadowColorTestValue, cachedLayer.hillshadeShadowColor)\n    assertEquals(hillshadeShadowColorUseThemeTestValue, cachedLayer.hillshadeShadowColorUseTheme)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/LineLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Ignore\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for LineLayer\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass LineLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = lineLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun lineCapTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCap(LineCap.BUTT)\n    }\n    setupLayer(layer)\n    assertEquals(LineCap.BUTT, layer.lineCap)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCapAsExpressionTest() {\n    val expression = literal(\"butt\")\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCap(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineCapAsExpression.toString())\n    assertEquals(LineCap.BUTT, layer.lineCap!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCrossSlopeTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCrossSlope(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineCrossSlope!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCrossSlopeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCrossSlope(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.lineCrossSlopeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineCrossSlope!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineElevationGroundScaleTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineElevationGroundScale(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineElevationGroundScale!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineElevationGroundScaleAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineElevationGroundScale(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineElevationGroundScaleAsExpression.toString())\n    assertEquals(null, layer.lineElevationGroundScale)\n  }\n\n  @Ignore(\"LineElevationGroundScale transition is not supported by the native engine\")\n  @Test\n  @UiThreadTest\n  fun lineElevationGroundScaleTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineElevationGroundScaleTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineElevationGroundScaleTransition)\n  }\n\n  @Ignore(\"LineElevationGroundScale transition is not supported by the native engine\")\n  @Test\n  @UiThreadTest\n  fun lineElevationGroundScaleTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineElevationGroundScaleTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineElevationGroundScaleTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineElevationReferenceTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      lineElevationReference(LineElevationReference.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(LineElevationReference.NONE, layer.lineElevationReference)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineElevationReferenceAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = lineLayer(\"id\", \"source\") {\n      lineElevationReference(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineElevationReferenceAsExpression.toString())\n    assertEquals(LineElevationReference.NONE, layer.lineElevationReference!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineJoinTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      lineJoin(LineJoin.BEVEL)\n    }\n    setupLayer(layer)\n    assertEquals(LineJoin.BEVEL, layer.lineJoin)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineJoinAsExpressionTest() {\n    val expression = toString {\n      get {\n        literal(\"enum\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineJoin(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineJoinAsExpression.toString())\n    assertEquals(null, layer.lineJoin)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineMiterLimitTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineMiterLimit(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineMiterLimit!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineMiterLimitAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineMiterLimit(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.lineMiterLimitAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineMiterLimit!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineRoundLimitTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineRoundLimit(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineRoundLimit!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineRoundLimitAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineRoundLimit(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.lineRoundLimitAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineRoundLimit!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineSortKeyTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineSortKey(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineSortKey!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineSortKeyAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineSortKey(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineSortKeyAsExpression.toString())\n    assertEquals(null, layer.lineSortKey)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineWidthUnitTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      lineWidthUnit(LineWidthUnit.PIXELS)\n    }\n    setupLayer(layer)\n    assertEquals(LineWidthUnit.PIXELS, layer.lineWidthUnit)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineWidthUnitAsExpressionTest() {\n    val expression = literal(\"pixels\")\n    val layer = lineLayer(\"id\", \"source\") {\n      lineWidthUnit(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineWidthUnitAsExpression.toString())\n    assertEquals(LineWidthUnit.PIXELS, layer.lineWidthUnit!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineZOffsetTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineZOffset(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineZOffset!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineZOffsetAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineZOffset(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineZOffsetAsExpression.toString())\n    assertEquals(null, layer.lineZOffset)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBlurTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBlur(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineBlur!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBlurAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBlur(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineBlurAsExpression.toString())\n    assertEquals(null, layer.lineBlur)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBlurTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBlurTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineBlurTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBlurTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBlurTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineBlurTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.lineBorderColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineBorderColorAsExpression.toString())\n    assertEquals(null, layer.lineBorderColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.lineBorderColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.lineBorderColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderColorAsColorIntTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.lineBorderColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderColorUseTheme() {\n    val theme = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.lineBorderColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineBorderColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineBorderColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderWidthTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderWidth(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineBorderWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderWidthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderWidth(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineBorderWidthAsExpression.toString())\n    assertEquals(null, layer.lineBorderWidth)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderWidthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineBorderWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineBorderWidthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineBorderWidthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineBorderWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.lineColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineColorAsExpression.toString())\n    assertEquals(null, layer.lineColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.lineColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.lineColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineColorAsColorIntTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.lineColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineColorUseTheme() {\n    val theme = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.lineColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCutoutFadeWidthTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCutoutFadeWidth(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineCutoutFadeWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCutoutFadeWidthAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCutoutFadeWidth(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.lineCutoutFadeWidthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineCutoutFadeWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCutoutFadeWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCutoutFadeWidthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineCutoutFadeWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCutoutFadeWidthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCutoutFadeWidthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineCutoutFadeWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCutoutOpacityTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCutoutOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineCutoutOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCutoutOpacityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCutoutOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.lineCutoutOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineCutoutOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCutoutOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCutoutOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineCutoutOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineCutoutOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineCutoutOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineCutoutOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineDasharrayTest() {\n    val testValue = listOf(1.0, 2.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineDasharray(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.lineDasharray?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineDasharrayAsExpressionTest() {\n    val expression = literal(listOf(1.0, 2.0))\n    val layer = lineLayer(\"id\", \"source\") {\n      lineDasharray(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineDasharrayAsExpression.toString())\n    assertEquals(listOf(1.0, 2.0), layer.lineDasharray!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineDepthOcclusionFactorTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineDepthOcclusionFactor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineDepthOcclusionFactor!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineDepthOcclusionFactorAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineDepthOcclusionFactor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.lineDepthOcclusionFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineDepthOcclusionFactor!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineDepthOcclusionFactorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineDepthOcclusionFactorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineDepthOcclusionFactorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineDepthOcclusionFactorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineDepthOcclusionFactorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineDepthOcclusionFactorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineEmissiveStrengthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineEmissiveStrengthAsExpression.toString())\n    assertEquals(null, layer.lineEmissiveStrength)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineGapWidthTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGapWidth(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineGapWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineGapWidthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGapWidth(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineGapWidthAsExpression.toString())\n    assertEquals(null, layer.lineGapWidth)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineGapWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGapWidthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineGapWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineGapWidthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGapWidthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineGapWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineGradientTest() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGradient(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.lineGradient?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineGradientUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGradientUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.lineGradientUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineGradientUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGradientUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.lineGradientUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineGradientUseTheme() {\n    val theme = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineGradientUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.lineGradientUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOcclusionOpacityTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOcclusionOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineOcclusionOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOcclusionOpacityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOcclusionOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.lineOcclusionOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.lineOcclusionOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOcclusionOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOcclusionOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineOcclusionOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOcclusionOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOcclusionOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineOcclusionOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOffsetTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOffset(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineOffset!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOffsetAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOffset(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineOffsetAsExpression.toString())\n    assertEquals(null, layer.lineOffset)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOffsetTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOffsetTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineOffsetTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOffsetTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOffsetTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineOffsetTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOpacityTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOpacityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineOpacityAsExpression.toString())\n    assertEquals(null, layer.lineOpacity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun linePatternTest() {\n    val testValue = \"abc\"\n    val layer = lineLayer(\"id\", \"source\") {\n      linePattern(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.linePattern?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun linePatternAsExpressionTest() {\n    val expression = image {\n      string {\n        get {\n          literal(\"resolvedImage\")\n        }\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      linePattern(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.linePatternAsExpression.toString())\n    assertEquals(null, layer.linePattern)\n  }\n\n  @Test\n  @UiThreadTest\n  fun linePatternCrossFadeTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      linePatternCrossFade(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.linePatternCrossFade!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun linePatternCrossFadeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      linePatternCrossFade(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.linePatternCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.linePatternCrossFade!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTranslate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.lineTranslate?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTranslateAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTranslate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.lineTranslate!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTranslateTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTranslateTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTranslateTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTranslateAnchorTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTranslateAnchor(LineTranslateAnchor.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(LineTranslateAnchor.MAP, layer.lineTranslateAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTranslateAnchorAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTranslateAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineTranslateAnchorAsExpression.toString())\n    assertEquals(LineTranslateAnchor.MAP, layer.lineTranslateAnchor!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.lineTrimColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineTrimColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.lineTrimColor)\n    assertEquals(Color.BLACK, layer.lineTrimColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.lineTrimColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.lineTrimColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimColorAsColorIntTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.lineTrimColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimColorUseTheme() {\n    val theme = \"none\"\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.lineTrimColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineTrimColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineTrimColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimFadeRangeTest() {\n    val testValue = listOf(0.5, 0.5)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimFadeRange(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.lineTrimFadeRange?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimFadeRangeAsExpressionTest() {\n    val expression = literal(listOf(0.5, 0.5))\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimFadeRange(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineTrimFadeRangeAsExpression.toString())\n    assertEquals(listOf(0.5, 0.5), layer.lineTrimFadeRange!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimOffsetTest() {\n    val testValue = listOf(0.5, 0.5)\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimOffset(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.lineTrimOffset?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineTrimOffsetAsExpressionTest() {\n    val expression = literal(listOf(0.5, 0.5))\n    val layer = lineLayer(\"id\", \"source\") {\n      lineTrimOffset(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineTrimOffsetAsExpression.toString())\n    assertEquals(listOf(0.5, 0.5), layer.lineTrimOffset!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineWidthTest() {\n    val testValue = 1.0\n    val layer = lineLayer(\"id\", \"source\") {\n      lineWidth(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.lineWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineWidthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineWidth(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.lineWidthAsExpression.toString())\n    assertEquals(null, layer.lineWidth)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineWidthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineWidthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = lineLayer(\"id\", \"source\") {\n      lineWidthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.lineWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = lineLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", LineLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", LineLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", LineLayer.defaultMaxZoom)\n    assertNotNull(\"defaultLineCap should not be null\", LineLayer.defaultLineCap)\n    assertNotNull(\"defaultLineCapAsExpression should not be null\", LineLayer.defaultLineCapAsExpression)\n    assertNotNull(\"defaultLineCrossSlope should not be null\", LineLayer.defaultLineCrossSlope)\n    assertNotNull(\"defaultLineCrossSlopeAsExpression should not be null\", LineLayer.defaultLineCrossSlopeAsExpression)\n    assertNotNull(\"defaultLineElevationGroundScale should not be null\", LineLayer.defaultLineElevationGroundScale)\n    assertNotNull(\"defaultLineElevationGroundScaleAsExpression should not be null\", LineLayer.defaultLineElevationGroundScaleAsExpression)\n    // LineElevationGroundScale transition is not supported by the native engine\n    // assertNotNull(\"defaultLineElevationGroundScaleTransition should not be null\", LineLayer.defaultLineElevationGroundScaleTransition)\n    assertNotNull(\"defaultLineElevationReference should not be null\", LineLayer.defaultLineElevationReference)\n    assertNotNull(\"defaultLineElevationReferenceAsExpression should not be null\", LineLayer.defaultLineElevationReferenceAsExpression)\n    assertNotNull(\"defaultLineJoin should not be null\", LineLayer.defaultLineJoin)\n    assertNotNull(\"defaultLineJoinAsExpression should not be null\", LineLayer.defaultLineJoinAsExpression)\n    assertNotNull(\"defaultLineMiterLimit should not be null\", LineLayer.defaultLineMiterLimit)\n    assertNotNull(\"defaultLineMiterLimitAsExpression should not be null\", LineLayer.defaultLineMiterLimitAsExpression)\n    assertNotNull(\"defaultLineRoundLimit should not be null\", LineLayer.defaultLineRoundLimit)\n    assertNotNull(\"defaultLineRoundLimitAsExpression should not be null\", LineLayer.defaultLineRoundLimitAsExpression)\n    assertNotNull(\"defaultLineSortKey should not be null\", LineLayer.defaultLineSortKey)\n    assertNotNull(\"defaultLineSortKeyAsExpression should not be null\", LineLayer.defaultLineSortKeyAsExpression)\n    assertNotNull(\"defaultLineWidthUnit should not be null\", LineLayer.defaultLineWidthUnit)\n    assertNotNull(\"defaultLineWidthUnitAsExpression should not be null\", LineLayer.defaultLineWidthUnitAsExpression)\n    assertNotNull(\"defaultLineZOffset should not be null\", LineLayer.defaultLineZOffset)\n    assertNotNull(\"defaultLineZOffsetAsExpression should not be null\", LineLayer.defaultLineZOffsetAsExpression)\n    assertNotNull(\"defaultLineBlur should not be null\", LineLayer.defaultLineBlur)\n    assertNotNull(\"defaultLineBlurAsExpression should not be null\", LineLayer.defaultLineBlurAsExpression)\n    assertNotNull(\"defaultLineBlurTransition should not be null\", LineLayer.defaultLineBlurTransition)\n    assertNotNull(\"defaultLineBorderColor should not be null\", LineLayer.defaultLineBorderColor)\n    assertNotNull(\"defaultLineBorderColorAsExpression should not be null\", LineLayer.defaultLineBorderColorAsExpression)\n    assertNotNull(\"defaultLineBorderColorAsColorInt should not be null\", LineLayer.defaultLineBorderColorAsColorInt)\n    assertNotNull(\"defaultLineBorderColorUseTheme should not be null\", LineLayer.defaultLineBorderColorUseTheme)\n    assertNotNull(\"defaultLineBorderColorUseThemeAsExpression should not be null\", LineLayer.defaultLineBorderColorUseThemeAsExpression)\n    assertNotNull(\"defaultLineBorderColorTransition should not be null\", LineLayer.defaultLineBorderColorTransition)\n    assertNotNull(\"defaultLineBorderWidth should not be null\", LineLayer.defaultLineBorderWidth)\n    assertNotNull(\"defaultLineBorderWidthAsExpression should not be null\", LineLayer.defaultLineBorderWidthAsExpression)\n    assertNotNull(\"defaultLineBorderWidthTransition should not be null\", LineLayer.defaultLineBorderWidthTransition)\n    assertNotNull(\"defaultLineColor should not be null\", LineLayer.defaultLineColor)\n    assertNotNull(\"defaultLineColorAsExpression should not be null\", LineLayer.defaultLineColorAsExpression)\n    assertNotNull(\"defaultLineColorAsColorInt should not be null\", LineLayer.defaultLineColorAsColorInt)\n    assertNotNull(\"defaultLineColorUseTheme should not be null\", LineLayer.defaultLineColorUseTheme)\n    assertNotNull(\"defaultLineColorUseThemeAsExpression should not be null\", LineLayer.defaultLineColorUseThemeAsExpression)\n    assertNotNull(\"defaultLineColorTransition should not be null\", LineLayer.defaultLineColorTransition)\n    assertNotNull(\"defaultLineCutoutFadeWidth should not be null\", LineLayer.defaultLineCutoutFadeWidth)\n    assertNotNull(\"defaultLineCutoutFadeWidthAsExpression should not be null\", LineLayer.defaultLineCutoutFadeWidthAsExpression)\n    assertNotNull(\"defaultLineCutoutFadeWidthTransition should not be null\", LineLayer.defaultLineCutoutFadeWidthTransition)\n    assertNotNull(\"defaultLineCutoutOpacity should not be null\", LineLayer.defaultLineCutoutOpacity)\n    assertNotNull(\"defaultLineCutoutOpacityAsExpression should not be null\", LineLayer.defaultLineCutoutOpacityAsExpression)\n    assertNotNull(\"defaultLineCutoutOpacityTransition should not be null\", LineLayer.defaultLineCutoutOpacityTransition)\n    assertNotNull(\"defaultLineDasharray should not be null\", LineLayer.defaultLineDasharray)\n    assertNotNull(\"defaultLineDasharrayAsExpression should not be null\", LineLayer.defaultLineDasharrayAsExpression)\n    assertNotNull(\"defaultLineDepthOcclusionFactor should not be null\", LineLayer.defaultLineDepthOcclusionFactor)\n    assertNotNull(\"defaultLineDepthOcclusionFactorAsExpression should not be null\", LineLayer.defaultLineDepthOcclusionFactorAsExpression)\n    assertNotNull(\"defaultLineDepthOcclusionFactorTransition should not be null\", LineLayer.defaultLineDepthOcclusionFactorTransition)\n    assertNotNull(\"defaultLineEmissiveStrength should not be null\", LineLayer.defaultLineEmissiveStrength)\n    assertNotNull(\"defaultLineEmissiveStrengthAsExpression should not be null\", LineLayer.defaultLineEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultLineEmissiveStrengthTransition should not be null\", LineLayer.defaultLineEmissiveStrengthTransition)\n    assertNotNull(\"defaultLineGapWidth should not be null\", LineLayer.defaultLineGapWidth)\n    assertNotNull(\"defaultLineGapWidthAsExpression should not be null\", LineLayer.defaultLineGapWidthAsExpression)\n    assertNotNull(\"defaultLineGapWidthTransition should not be null\", LineLayer.defaultLineGapWidthTransition)\n    assertNotNull(\"defaultLineGradientUseTheme should not be null\", LineLayer.defaultLineGradientUseTheme)\n    assertNotNull(\"defaultLineGradientUseThemeAsExpression should not be null\", LineLayer.defaultLineGradientUseThemeAsExpression)\n    assertNotNull(\"defaultLineOcclusionOpacity should not be null\", LineLayer.defaultLineOcclusionOpacity)\n    assertNotNull(\"defaultLineOcclusionOpacityAsExpression should not be null\", LineLayer.defaultLineOcclusionOpacityAsExpression)\n    assertNotNull(\"defaultLineOcclusionOpacityTransition should not be null\", LineLayer.defaultLineOcclusionOpacityTransition)\n    assertNotNull(\"defaultLineOffset should not be null\", LineLayer.defaultLineOffset)\n    assertNotNull(\"defaultLineOffsetAsExpression should not be null\", LineLayer.defaultLineOffsetAsExpression)\n    assertNotNull(\"defaultLineOffsetTransition should not be null\", LineLayer.defaultLineOffsetTransition)\n    assertNotNull(\"defaultLineOpacity should not be null\", LineLayer.defaultLineOpacity)\n    assertNotNull(\"defaultLineOpacityAsExpression should not be null\", LineLayer.defaultLineOpacityAsExpression)\n    assertNotNull(\"defaultLineOpacityTransition should not be null\", LineLayer.defaultLineOpacityTransition)\n    assertNotNull(\"defaultLinePattern should not be null\", LineLayer.defaultLinePattern)\n    assertNotNull(\"defaultLinePatternAsExpression should not be null\", LineLayer.defaultLinePatternAsExpression)\n    assertNotNull(\"defaultLinePatternCrossFade should not be null\", LineLayer.defaultLinePatternCrossFade)\n    assertNotNull(\"defaultLinePatternCrossFadeAsExpression should not be null\", LineLayer.defaultLinePatternCrossFadeAsExpression)\n    assertNotNull(\"defaultLineTranslate should not be null\", LineLayer.defaultLineTranslate)\n    assertNotNull(\"defaultLineTranslateAsExpression should not be null\", LineLayer.defaultLineTranslateAsExpression)\n    assertNotNull(\"defaultLineTranslateTransition should not be null\", LineLayer.defaultLineTranslateTransition)\n    assertNotNull(\"defaultLineTranslateAnchor should not be null\", LineLayer.defaultLineTranslateAnchor)\n    assertNotNull(\"defaultLineTranslateAnchorAsExpression should not be null\", LineLayer.defaultLineTranslateAnchorAsExpression)\n    assertNotNull(\"defaultLineTrimColor should not be null\", LineLayer.defaultLineTrimColor)\n    assertNotNull(\"defaultLineTrimColorAsExpression should not be null\", LineLayer.defaultLineTrimColorAsExpression)\n    assertNotNull(\"defaultLineTrimColorAsColorInt should not be null\", LineLayer.defaultLineTrimColorAsColorInt)\n    assertNotNull(\"defaultLineTrimColorUseTheme should not be null\", LineLayer.defaultLineTrimColorUseTheme)\n    assertNotNull(\"defaultLineTrimColorUseThemeAsExpression should not be null\", LineLayer.defaultLineTrimColorUseThemeAsExpression)\n    assertNotNull(\"defaultLineTrimColorTransition should not be null\", LineLayer.defaultLineTrimColorTransition)\n    assertNotNull(\"defaultLineTrimFadeRange should not be null\", LineLayer.defaultLineTrimFadeRange)\n    assertNotNull(\"defaultLineTrimFadeRangeAsExpression should not be null\", LineLayer.defaultLineTrimFadeRangeAsExpression)\n    assertNotNull(\"defaultLineTrimOffset should not be null\", LineLayer.defaultLineTrimOffset)\n    assertNotNull(\"defaultLineTrimOffsetAsExpression should not be null\", LineLayer.defaultLineTrimOffsetAsExpression)\n    assertNotNull(\"defaultLineWidth should not be null\", LineLayer.defaultLineWidth)\n    assertNotNull(\"defaultLineWidthAsExpression should not be null\", LineLayer.defaultLineWidthAsExpression)\n    assertNotNull(\"defaultLineWidthTransition should not be null\", LineLayer.defaultLineWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val lineCapTestValue = LineCap.BUTT\n    val lineCrossSlopeTestValue = 1.0\n    val lineElevationGroundScaleTestValue = 1.0\n    val lineElevationReferenceTestValue = LineElevationReference.NONE\n    val lineJoinTestValue = LineJoin.BEVEL\n    val lineMiterLimitTestValue = 1.0\n    val lineRoundLimitTestValue = 1.0\n    val lineSortKeyTestValue = 1.0\n    val lineWidthUnitTestValue = LineWidthUnit.PIXELS\n    val lineZOffsetTestValue = 1.0\n    val lineBlurTestValue = 1.0\n    val lineBorderColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val lineBorderColorUseThemeTestValue = \"default\"\n    val lineBorderWidthTestValue = 1.0\n    val lineColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val lineColorUseThemeTestValue = \"default\"\n    val lineCutoutFadeWidthTestValue = 1.0\n    val lineCutoutOpacityTestValue = 1.0\n    val lineDasharrayTestValue = listOf(1.0, 2.0)\n    val lineDepthOcclusionFactorTestValue = 1.0\n    val lineEmissiveStrengthTestValue = 1.0\n    val lineGapWidthTestValue = 1.0\n    val lineGradientTestValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val lineGradientUseThemeTestValue = \"default\"\n    val lineOcclusionOpacityTestValue = 1.0\n    val lineOffsetTestValue = 1.0\n    val lineOpacityTestValue = 1.0\n    val linePatternTestValue = \"abc\"\n    val linePatternCrossFadeTestValue = 1.0\n    val lineTranslateTestValue = listOf(0.0, 1.0)\n    val lineTranslateAnchorTestValue = LineTranslateAnchor.MAP\n    val lineTrimColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val lineTrimColorUseThemeTestValue = \"default\"\n    val lineTrimFadeRangeTestValue = listOf(0.5, 0.5)\n    val lineTrimOffsetTestValue = listOf(0.5, 0.5)\n    val lineWidthTestValue = 1.0\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = lineLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      filter(filterTestValue)\n      lineCap(lineCapTestValue)\n      lineCrossSlope(lineCrossSlopeTestValue)\n      lineElevationGroundScale(lineElevationGroundScaleTestValue)\n      lineElevationReference(lineElevationReferenceTestValue)\n      lineJoin(lineJoinTestValue)\n      lineMiterLimit(lineMiterLimitTestValue)\n      lineRoundLimit(lineRoundLimitTestValue)\n      lineSortKey(lineSortKeyTestValue)\n      lineWidthUnit(lineWidthUnitTestValue)\n      lineZOffset(lineZOffsetTestValue)\n      lineBlur(lineBlurTestValue)\n      lineBorderColor(lineBorderColorTestValue)\n      lineBorderColorUseTheme(lineBorderColorUseThemeTestValue)\n      lineBorderWidth(lineBorderWidthTestValue)\n      lineColor(lineColorTestValue)\n      lineColorUseTheme(lineColorUseThemeTestValue)\n      lineCutoutFadeWidth(lineCutoutFadeWidthTestValue)\n      lineCutoutOpacity(lineCutoutOpacityTestValue)\n      lineDasharray(lineDasharrayTestValue)\n      lineDepthOcclusionFactor(lineDepthOcclusionFactorTestValue)\n      lineEmissiveStrength(lineEmissiveStrengthTestValue)\n      lineGapWidth(lineGapWidthTestValue)\n      lineGradient(lineGradientTestValue)\n      lineGradientUseTheme(lineGradientUseThemeTestValue)\n      lineOcclusionOpacity(lineOcclusionOpacityTestValue)\n      lineOffset(lineOffsetTestValue)\n      lineOpacity(lineOpacityTestValue)\n      linePattern(linePatternTestValue)\n      linePatternCrossFade(linePatternCrossFadeTestValue)\n      lineTranslate(lineTranslateTestValue)\n      lineTranslateAnchor(lineTranslateAnchorTestValue)\n      lineTrimColor(lineTrimColorTestValue)\n      lineTrimColorUseTheme(lineTrimColorUseThemeTestValue)\n      lineTrimFadeRange(lineTrimFadeRangeTestValue)\n      lineTrimOffset(lineTrimOffsetTestValue)\n      lineWidth(lineWidthTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as LineLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(lineCapTestValue, cachedLayer.lineCap)\n    assertEquals(lineCrossSlopeTestValue, cachedLayer.lineCrossSlope)\n    assertEquals(lineElevationGroundScaleTestValue, cachedLayer.lineElevationGroundScale)\n    assertEquals(lineElevationReferenceTestValue, cachedLayer.lineElevationReference)\n    assertEquals(lineJoinTestValue, cachedLayer.lineJoin)\n    assertEquals(lineMiterLimitTestValue, cachedLayer.lineMiterLimit)\n    assertEquals(lineRoundLimitTestValue, cachedLayer.lineRoundLimit)\n    assertEquals(lineSortKeyTestValue, cachedLayer.lineSortKey)\n    assertEquals(lineWidthUnitTestValue, cachedLayer.lineWidthUnit)\n    assertEquals(lineZOffsetTestValue, cachedLayer.lineZOffset)\n    assertEquals(lineBlurTestValue, cachedLayer.lineBlur)\n    assertEquals(lineBorderColorTestValue, cachedLayer.lineBorderColor)\n    assertEquals(lineBorderColorUseThemeTestValue, cachedLayer.lineBorderColorUseTheme)\n    assertEquals(lineBorderWidthTestValue, cachedLayer.lineBorderWidth)\n    assertEquals(lineColorTestValue, cachedLayer.lineColor)\n    assertEquals(lineColorUseThemeTestValue, cachedLayer.lineColorUseTheme)\n    assertEquals(lineCutoutFadeWidthTestValue, cachedLayer.lineCutoutFadeWidth)\n    assertEquals(lineCutoutOpacityTestValue, cachedLayer.lineCutoutOpacity)\n    assertEquals(lineDasharrayTestValue, cachedLayer.lineDasharray)\n    assertEquals(lineDepthOcclusionFactorTestValue, cachedLayer.lineDepthOcclusionFactor)\n    assertEquals(lineEmissiveStrengthTestValue, cachedLayer.lineEmissiveStrength)\n    assertEquals(lineGapWidthTestValue, cachedLayer.lineGapWidth)\n    assertEquals(lineGradientTestValue, cachedLayer.lineGradient)\n    assertEquals(lineGradientUseThemeTestValue, cachedLayer.lineGradientUseTheme)\n    assertEquals(lineOcclusionOpacityTestValue, cachedLayer.lineOcclusionOpacity)\n    assertEquals(lineOffsetTestValue, cachedLayer.lineOffset)\n    assertEquals(lineOpacityTestValue, cachedLayer.lineOpacity)\n    assertEquals(linePatternTestValue, cachedLayer.linePattern)\n    assertEquals(linePatternCrossFadeTestValue, cachedLayer.linePatternCrossFade)\n    assertEquals(lineTranslateTestValue, cachedLayer.lineTranslate)\n    assertEquals(lineTranslateAnchorTestValue, cachedLayer.lineTranslateAnchor)\n    assertEquals(lineTrimColorTestValue, cachedLayer.lineTrimColor)\n    assertEquals(lineTrimColorUseThemeTestValue, cachedLayer.lineTrimColorUseTheme)\n    assertEquals(lineTrimFadeRangeTestValue, cachedLayer.lineTrimFadeRange)\n    assertEquals(lineTrimOffsetTestValue, cachedLayer.lineTrimOffset)\n    assertEquals(lineWidthTestValue, cachedLayer.lineWidth)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/LocationIndicatorLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for LocationIndicatorLayer\n */\n@RunWith(AndroidJUnit4::class)\nclass LocationIndicatorLayerTest : BaseStyleTest() {\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusTest() {\n    val testValue = 1.0\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.accuracyRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.accuracyRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.accuracyRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.accuracyRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.accuracyRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusBorderColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.accuracyRadiusBorderColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusBorderColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.accuracyRadiusBorderColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.accuracyRadiusBorderColor)\n    assertEquals(Color.BLACK, layer.accuracyRadiusBorderColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusBorderColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.accuracyRadiusBorderColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusBorderColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.accuracyRadiusBorderColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusBorderColorAsColorIntTest() {\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.accuracyRadiusBorderColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusBorderColorUseTheme() {\n    val theme = \"none\"\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.accuracyRadiusBorderColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusBorderColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.accuracyRadiusBorderColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusBorderColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusBorderColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.accuracyRadiusBorderColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.accuracyRadiusColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.accuracyRadiusColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.accuracyRadiusColor)\n    assertEquals(Color.BLACK, layer.accuracyRadiusColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.accuracyRadiusColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.accuracyRadiusColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusColorAsColorIntTest() {\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.accuracyRadiusColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusColorUseTheme() {\n    val theme = \"none\"\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.accuracyRadiusColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.accuracyRadiusColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun accuracyRadiusColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadiusColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.accuracyRadiusColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingTest() {\n    val testValue = 1.0\n    val layer = locationIndicatorLayer(\"id\") {\n      bearing(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.bearing!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      bearing(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.bearingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.bearing!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      bearingTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.bearingTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      bearingTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.bearingTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingImageTest() {\n    val testValue = \"abc\"\n    val layer = locationIndicatorLayer(\"id\") {\n      bearingImage(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.bearingImage?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingImageAsExpressionTest() {\n    val expression = literal(\"abc\")\n    val layer = locationIndicatorLayer(\"id\") {\n      bearingImage(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.bearingImageAsExpression.toString())\n    assertEquals(expression.toString(), layer.bearingImage)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingImageSizeTest() {\n    val testValue = 1.0\n    val layer = locationIndicatorLayer(\"id\") {\n      bearingImageSize(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.bearingImageSize!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingImageSizeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      bearingImageSize(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.bearingImageSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.bearingImageSize!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingImageSizeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      bearingImageSizeTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.bearingImageSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bearingImageSizeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      bearingImageSizeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.bearingImageSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.emphasisCircleColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.emphasisCircleColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.emphasisCircleColor)\n    assertEquals(Color.BLACK, layer.emphasisCircleColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.emphasisCircleColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.emphasisCircleColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleColorAsColorIntTest() {\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.emphasisCircleColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleColorUseTheme() {\n    val theme = \"none\"\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.emphasisCircleColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.emphasisCircleColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.emphasisCircleColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleGlowRangeTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleGlowRange(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.emphasisCircleGlowRange?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleGlowRangeAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleGlowRange(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.emphasisCircleGlowRangeAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.emphasisCircleGlowRange!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleGlowRangeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleGlowRangeTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.emphasisCircleGlowRangeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleGlowRangeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleGlowRangeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.emphasisCircleGlowRangeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleRadiusTest() {\n    val testValue = 1.0\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.emphasisCircleRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleRadiusAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.emphasisCircleRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.emphasisCircleRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleRadiusTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleRadiusTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.emphasisCircleRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun emphasisCircleRadiusTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      emphasisCircleRadiusTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.emphasisCircleRadiusTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun imagePitchDisplacementTest() {\n    val testValue = 1.0\n    val layer = locationIndicatorLayer(\"id\") {\n      imagePitchDisplacement(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.imagePitchDisplacement!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun imagePitchDisplacementAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      imagePitchDisplacement(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.imagePitchDisplacementAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.imagePitchDisplacement!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun locationTest() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      location(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.location?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun locationAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0, 2.0))\n    val layer = locationIndicatorLayer(\"id\") {\n      location(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.locationAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0), layer.location!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun locationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      locationTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.locationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun locationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      locationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.locationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun locationIndicatorOpacityTest() {\n    val testValue = 1.0\n    val layer = locationIndicatorLayer(\"id\") {\n      locationIndicatorOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.locationIndicatorOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun locationIndicatorOpacityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      locationIndicatorOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.locationIndicatorOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.locationIndicatorOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun locationIndicatorOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      locationIndicatorOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.locationIndicatorOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun locationIndicatorOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      locationIndicatorOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.locationIndicatorOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun perspectiveCompensationTest() {\n    val testValue = 1.0\n    val layer = locationIndicatorLayer(\"id\") {\n      perspectiveCompensation(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.perspectiveCompensation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun perspectiveCompensationAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      perspectiveCompensation(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.perspectiveCompensationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.perspectiveCompensation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun shadowImageTest() {\n    val testValue = \"abc\"\n    val layer = locationIndicatorLayer(\"id\") {\n      shadowImage(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.shadowImage?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun shadowImageAsExpressionTest() {\n    val expression = literal(\"abc\")\n    val layer = locationIndicatorLayer(\"id\") {\n      shadowImage(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.shadowImageAsExpression.toString())\n    assertEquals(expression.toString(), layer.shadowImage)\n  }\n\n  @Test\n  @UiThreadTest\n  fun shadowImageSizeTest() {\n    val testValue = 1.0\n    val layer = locationIndicatorLayer(\"id\") {\n      shadowImageSize(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.shadowImageSize!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun shadowImageSizeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      shadowImageSize(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.shadowImageSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.shadowImageSize!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun shadowImageSizeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      shadowImageSizeTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.shadowImageSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun shadowImageSizeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      shadowImageSizeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.shadowImageSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun topImageTest() {\n    val testValue = \"abc\"\n    val layer = locationIndicatorLayer(\"id\") {\n      topImage(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.topImage?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun topImageAsExpressionTest() {\n    val expression = literal(\"abc\")\n    val layer = locationIndicatorLayer(\"id\") {\n      topImage(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.topImageAsExpression.toString())\n    assertEquals(expression.toString(), layer.topImage)\n  }\n\n  @Test\n  @UiThreadTest\n  fun topImageSizeTest() {\n    val testValue = 1.0\n    val layer = locationIndicatorLayer(\"id\") {\n      topImageSize(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.topImageSize!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun topImageSizeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = locationIndicatorLayer(\"id\") {\n      topImageSize(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.topImageSizeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.topImageSize!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun topImageSizeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      topImageSizeTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.topImageSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun topImageSizeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = locationIndicatorLayer(\"id\") {\n      topImageSizeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.topImageSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = locationIndicatorLayer(\"id\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = locationIndicatorLayer(\"id\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", LocationIndicatorLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", LocationIndicatorLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", LocationIndicatorLayer.defaultMaxZoom)\n    assertNotNull(\"defaultAccuracyRadius should not be null\", LocationIndicatorLayer.defaultAccuracyRadius)\n    assertNotNull(\"defaultAccuracyRadiusAsExpression should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusAsExpression)\n    assertNotNull(\"defaultAccuracyRadiusTransition should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusTransition)\n    assertNotNull(\"defaultAccuracyRadiusBorderColor should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusBorderColor)\n    assertNotNull(\"defaultAccuracyRadiusBorderColorAsExpression should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsExpression)\n    assertNotNull(\"defaultAccuracyRadiusBorderColorAsColorInt should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusBorderColorAsColorInt)\n    assertNotNull(\"defaultAccuracyRadiusBorderColorUseTheme should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusBorderColorUseTheme)\n    assertNotNull(\"defaultAccuracyRadiusBorderColorUseThemeAsExpression should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusBorderColorUseThemeAsExpression)\n    assertNotNull(\"defaultAccuracyRadiusBorderColorTransition should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusBorderColorTransition)\n    assertNotNull(\"defaultAccuracyRadiusColor should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusColor)\n    assertNotNull(\"defaultAccuracyRadiusColorAsExpression should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusColorAsExpression)\n    assertNotNull(\"defaultAccuracyRadiusColorAsColorInt should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusColorAsColorInt)\n    assertNotNull(\"defaultAccuracyRadiusColorUseTheme should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusColorUseTheme)\n    assertNotNull(\"defaultAccuracyRadiusColorUseThemeAsExpression should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusColorUseThemeAsExpression)\n    assertNotNull(\"defaultAccuracyRadiusColorTransition should not be null\", LocationIndicatorLayer.defaultAccuracyRadiusColorTransition)\n    assertNotNull(\"defaultBearing should not be null\", LocationIndicatorLayer.defaultBearing)\n    assertNotNull(\"defaultBearingAsExpression should not be null\", LocationIndicatorLayer.defaultBearingAsExpression)\n    assertNotNull(\"defaultBearingTransition should not be null\", LocationIndicatorLayer.defaultBearingTransition)\n    assertNotNull(\"defaultBearingImage should not be null\", LocationIndicatorLayer.defaultBearingImage)\n    assertNotNull(\"defaultBearingImageAsExpression should not be null\", LocationIndicatorLayer.defaultBearingImageAsExpression)\n    assertNotNull(\"defaultBearingImageSize should not be null\", LocationIndicatorLayer.defaultBearingImageSize)\n    assertNotNull(\"defaultBearingImageSizeAsExpression should not be null\", LocationIndicatorLayer.defaultBearingImageSizeAsExpression)\n    assertNotNull(\"defaultBearingImageSizeTransition should not be null\", LocationIndicatorLayer.defaultBearingImageSizeTransition)\n    assertNotNull(\"defaultEmphasisCircleColor should not be null\", LocationIndicatorLayer.defaultEmphasisCircleColor)\n    assertNotNull(\"defaultEmphasisCircleColorAsExpression should not be null\", LocationIndicatorLayer.defaultEmphasisCircleColorAsExpression)\n    assertNotNull(\"defaultEmphasisCircleColorAsColorInt should not be null\", LocationIndicatorLayer.defaultEmphasisCircleColorAsColorInt)\n    assertNotNull(\"defaultEmphasisCircleColorUseTheme should not be null\", LocationIndicatorLayer.defaultEmphasisCircleColorUseTheme)\n    assertNotNull(\"defaultEmphasisCircleColorUseThemeAsExpression should not be null\", LocationIndicatorLayer.defaultEmphasisCircleColorUseThemeAsExpression)\n    assertNotNull(\"defaultEmphasisCircleColorTransition should not be null\", LocationIndicatorLayer.defaultEmphasisCircleColorTransition)\n    assertNotNull(\"defaultEmphasisCircleGlowRange should not be null\", LocationIndicatorLayer.defaultEmphasisCircleGlowRange)\n    assertNotNull(\"defaultEmphasisCircleGlowRangeAsExpression should not be null\", LocationIndicatorLayer.defaultEmphasisCircleGlowRangeAsExpression)\n    assertNotNull(\"defaultEmphasisCircleGlowRangeTransition should not be null\", LocationIndicatorLayer.defaultEmphasisCircleGlowRangeTransition)\n    assertNotNull(\"defaultEmphasisCircleRadius should not be null\", LocationIndicatorLayer.defaultEmphasisCircleRadius)\n    assertNotNull(\"defaultEmphasisCircleRadiusAsExpression should not be null\", LocationIndicatorLayer.defaultEmphasisCircleRadiusAsExpression)\n    assertNotNull(\"defaultEmphasisCircleRadiusTransition should not be null\", LocationIndicatorLayer.defaultEmphasisCircleRadiusTransition)\n    assertNotNull(\"defaultImagePitchDisplacement should not be null\", LocationIndicatorLayer.defaultImagePitchDisplacement)\n    assertNotNull(\"defaultImagePitchDisplacementAsExpression should not be null\", LocationIndicatorLayer.defaultImagePitchDisplacementAsExpression)\n    assertNotNull(\"defaultLocation should not be null\", LocationIndicatorLayer.defaultLocation)\n    assertNotNull(\"defaultLocationAsExpression should not be null\", LocationIndicatorLayer.defaultLocationAsExpression)\n    assertNotNull(\"defaultLocationTransition should not be null\", LocationIndicatorLayer.defaultLocationTransition)\n    assertNotNull(\"defaultLocationIndicatorOpacity should not be null\", LocationIndicatorLayer.defaultLocationIndicatorOpacity)\n    assertNotNull(\"defaultLocationIndicatorOpacityAsExpression should not be null\", LocationIndicatorLayer.defaultLocationIndicatorOpacityAsExpression)\n    assertNotNull(\"defaultLocationIndicatorOpacityTransition should not be null\", LocationIndicatorLayer.defaultLocationIndicatorOpacityTransition)\n    assertNotNull(\"defaultPerspectiveCompensation should not be null\", LocationIndicatorLayer.defaultPerspectiveCompensation)\n    assertNotNull(\"defaultPerspectiveCompensationAsExpression should not be null\", LocationIndicatorLayer.defaultPerspectiveCompensationAsExpression)\n    assertNotNull(\"defaultShadowImage should not be null\", LocationIndicatorLayer.defaultShadowImage)\n    assertNotNull(\"defaultShadowImageAsExpression should not be null\", LocationIndicatorLayer.defaultShadowImageAsExpression)\n    assertNotNull(\"defaultShadowImageSize should not be null\", LocationIndicatorLayer.defaultShadowImageSize)\n    assertNotNull(\"defaultShadowImageSizeAsExpression should not be null\", LocationIndicatorLayer.defaultShadowImageSizeAsExpression)\n    assertNotNull(\"defaultShadowImageSizeTransition should not be null\", LocationIndicatorLayer.defaultShadowImageSizeTransition)\n    assertNotNull(\"defaultTopImage should not be null\", LocationIndicatorLayer.defaultTopImage)\n    assertNotNull(\"defaultTopImageAsExpression should not be null\", LocationIndicatorLayer.defaultTopImageAsExpression)\n    assertNotNull(\"defaultTopImageSize should not be null\", LocationIndicatorLayer.defaultTopImageSize)\n    assertNotNull(\"defaultTopImageSizeAsExpression should not be null\", LocationIndicatorLayer.defaultTopImageSizeAsExpression)\n    assertNotNull(\"defaultTopImageSizeTransition should not be null\", LocationIndicatorLayer.defaultTopImageSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val accuracyRadiusTestValue = 1.0\n    val accuracyRadiusBorderColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val accuracyRadiusBorderColorUseThemeTestValue = \"default\"\n    val accuracyRadiusColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val accuracyRadiusColorUseThemeTestValue = \"default\"\n    val bearingTestValue = 1.0\n    val bearingImageTestValue = \"abc\"\n    val bearingImageSizeTestValue = 1.0\n    val emphasisCircleColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val emphasisCircleColorUseThemeTestValue = \"default\"\n    val emphasisCircleGlowRangeTestValue = listOf(0.0, 1.0)\n    val emphasisCircleRadiusTestValue = 1.0\n    val imagePitchDisplacementTestValue = 1.0\n    val locationTestValue = listOf(0.0, 1.0, 2.0)\n    val locationIndicatorOpacityTestValue = 1.0\n    val perspectiveCompensationTestValue = 1.0\n    val shadowImageTestValue = \"abc\"\n    val shadowImageSizeTestValue = 1.0\n    val topImageTestValue = \"abc\"\n    val topImageSizeTestValue = 1.0\n\n    val layer = locationIndicatorLayer(\"id\") {\n      accuracyRadius(accuracyRadiusTestValue)\n      accuracyRadiusBorderColor(accuracyRadiusBorderColorTestValue)\n      accuracyRadiusBorderColorUseTheme(accuracyRadiusBorderColorUseThemeTestValue)\n      accuracyRadiusColor(accuracyRadiusColorTestValue)\n      accuracyRadiusColorUseTheme(accuracyRadiusColorUseThemeTestValue)\n      bearing(bearingTestValue)\n      bearingImage(bearingImageTestValue)\n      bearingImageSize(bearingImageSizeTestValue)\n      emphasisCircleColor(emphasisCircleColorTestValue)\n      emphasisCircleColorUseTheme(emphasisCircleColorUseThemeTestValue)\n      emphasisCircleGlowRange(emphasisCircleGlowRangeTestValue)\n      emphasisCircleRadius(emphasisCircleRadiusTestValue)\n      imagePitchDisplacement(imagePitchDisplacementTestValue)\n      location(locationTestValue)\n      locationIndicatorOpacity(locationIndicatorOpacityTestValue)\n      perspectiveCompensation(perspectiveCompensationTestValue)\n      shadowImage(shadowImageTestValue)\n      shadowImageSize(shadowImageSizeTestValue)\n      topImage(topImageTestValue)\n      topImageSize(topImageSizeTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as LocationIndicatorLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(accuracyRadiusTestValue, cachedLayer.accuracyRadius)\n    assertEquals(accuracyRadiusBorderColorTestValue, cachedLayer.accuracyRadiusBorderColor)\n    assertEquals(accuracyRadiusBorderColorUseThemeTestValue, cachedLayer.accuracyRadiusBorderColorUseTheme)\n    assertEquals(accuracyRadiusColorTestValue, cachedLayer.accuracyRadiusColor)\n    assertEquals(accuracyRadiusColorUseThemeTestValue, cachedLayer.accuracyRadiusColorUseTheme)\n    assertEquals(bearingTestValue, cachedLayer.bearing)\n    assertEquals(bearingImageTestValue, cachedLayer.bearingImage)\n    assertEquals(bearingImageSizeTestValue, cachedLayer.bearingImageSize)\n    assertEquals(emphasisCircleColorTestValue, cachedLayer.emphasisCircleColor)\n    assertEquals(emphasisCircleColorUseThemeTestValue, cachedLayer.emphasisCircleColorUseTheme)\n    assertEquals(emphasisCircleGlowRangeTestValue, cachedLayer.emphasisCircleGlowRange)\n    assertEquals(emphasisCircleRadiusTestValue, cachedLayer.emphasisCircleRadius)\n    assertEquals(imagePitchDisplacementTestValue, cachedLayer.imagePitchDisplacement)\n    assertEquals(locationTestValue, cachedLayer.location)\n    assertEquals(locationIndicatorOpacityTestValue, cachedLayer.locationIndicatorOpacity)\n    assertEquals(perspectiveCompensationTestValue, cachedLayer.perspectiveCompensation)\n    assertEquals(shadowImageTestValue, cachedLayer.shadowImage)\n    assertEquals(shadowImageSizeTestValue, cachedLayer.shadowImageSize)\n    assertEquals(topImageTestValue, cachedLayer.topImage)\n    assertEquals(topImageSizeTestValue, cachedLayer.topImageSize)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/ModelLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for ModelLayer\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass ModelLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = modelLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = modelLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = modelLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = modelLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun modelAllowDensityReductionTest() {\n    val testValue = true\n    val layer = modelLayer(\"id\", \"source\") {\n      modelAllowDensityReduction(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.modelAllowDensityReduction?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelAllowDensityReductionAsExpressionTest() {\n    val expression = literal(true)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelAllowDensityReduction(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelAllowDensityReductionAsExpression.toString())\n    assertEquals(true, layer.modelAllowDensityReduction!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelIdTest() {\n    val testValue = \"abc\"\n    val layer = modelLayer(\"id\", \"source\") {\n      modelId(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.modelId?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelIdAsExpressionTest() {\n    val expression = toString {\n      get {\n        literal(\"string\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelId(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelIdAsExpression.toString())\n    assertEquals(null, layer.modelId)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelAmbientOcclusionIntensityTest() {\n    val testValue = 1.0\n    val layer = modelLayer(\"id\", \"source\") {\n      modelAmbientOcclusionIntensity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.modelAmbientOcclusionIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelAmbientOcclusionIntensityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelAmbientOcclusionIntensity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.modelAmbientOcclusionIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.modelAmbientOcclusionIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelAmbientOcclusionIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelAmbientOcclusionIntensityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelAmbientOcclusionIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelAmbientOcclusionIntensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelAmbientOcclusionIntensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelAmbientOcclusionIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelCastShadowsTest() {\n    val testValue = true\n    val layer = modelLayer(\"id\", \"source\") {\n      modelCastShadows(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.modelCastShadows?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelCastShadowsAsExpressionTest() {\n    val expression = literal(true)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelCastShadows(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelCastShadowsAsExpression.toString())\n    assertEquals(true, layer.modelCastShadows!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.modelColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelColorAsExpression.toString())\n    assertEquals(null, layer.modelColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.modelColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.modelColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorAsColorIntTest() {\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.modelColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorUseTheme() {\n    val theme = \"none\"\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.modelColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorMixIntensityTest() {\n    val testValue = 1.0\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorMixIntensity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.modelColorMixIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorMixIntensityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorMixIntensity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelColorMixIntensityAsExpression.toString())\n    assertEquals(null, layer.modelColorMixIntensity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorMixIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorMixIntensityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelColorMixIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelColorMixIntensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelColorMixIntensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelColorMixIntensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelCutoffFadeRangeTest() {\n    val testValue = 1.0\n    val layer = modelLayer(\"id\", \"source\") {\n      modelCutoffFadeRange(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.modelCutoffFadeRange!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelCutoffFadeRangeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelCutoffFadeRange(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.modelCutoffFadeRangeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.modelCutoffFadeRange!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelElevationReferenceTest() {\n    val layer = modelLayer(\"id\", \"source\") {\n      modelElevationReference(ModelElevationReference.SEA)\n    }\n    setupLayer(layer)\n    assertEquals(ModelElevationReference.SEA, layer.modelElevationReference)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelElevationReferenceAsExpressionTest() {\n    val expression = literal(\"sea\")\n    val layer = modelLayer(\"id\", \"source\") {\n      modelElevationReference(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelElevationReferenceAsExpression.toString())\n    assertEquals(ModelElevationReference.SEA, layer.modelElevationReference!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = modelLayer(\"id\", \"source\") {\n      modelEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.modelEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelEmissiveStrengthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelEmissiveStrengthAsExpression.toString())\n    assertEquals(null, layer.modelEmissiveStrength)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelHeightBasedEmissiveStrengthMultiplierTest() {\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0, 4.0)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelHeightBasedEmissiveStrengthMultiplier(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.modelHeightBasedEmissiveStrengthMultiplier?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelHeightBasedEmissiveStrengthMultiplierAsExpressionTest() {\n    val expression = array {\n      literal(\"number\")\n      literal(5)\n      get {\n        literal(\"array\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelHeightBasedEmissiveStrengthMultiplier(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelHeightBasedEmissiveStrengthMultiplierAsExpression.toString())\n    assertEquals(null, layer.modelHeightBasedEmissiveStrengthMultiplier)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelHeightBasedEmissiveStrengthMultiplierTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelHeightBasedEmissiveStrengthMultiplierTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelHeightBasedEmissiveStrengthMultiplierTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelHeightBasedEmissiveStrengthMultiplierTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelHeightBasedEmissiveStrengthMultiplierTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelHeightBasedEmissiveStrengthMultiplierTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelOpacityTest() {\n    val testValue = 1.0\n    val layer = modelLayer(\"id\", \"source\") {\n      modelOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.modelOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelOpacityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelOpacityAsExpression.toString())\n    assertEquals(null, layer.modelOpacity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelReceiveShadowsTest() {\n    val testValue = true\n    val layer = modelLayer(\"id\", \"source\") {\n      modelReceiveShadows(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.modelReceiveShadows?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelReceiveShadowsAsExpressionTest() {\n    val expression = literal(true)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelReceiveShadows(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelReceiveShadowsAsExpression.toString())\n    assertEquals(true, layer.modelReceiveShadows!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelRotationTest() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelRotation(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.modelRotation?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelRotationAsExpressionTest() {\n    val expression = array {\n      literal(\"number\")\n      literal(3)\n      get {\n        literal(\"array\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelRotation(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelRotationAsExpression.toString())\n    assertEquals(null, layer.modelRotation)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelRotationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelRotationTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelRotationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelRotationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelRotationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelRotationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelRoughnessTest() {\n    val testValue = 1.0\n    val layer = modelLayer(\"id\", \"source\") {\n      modelRoughness(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.modelRoughness!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelRoughnessAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelRoughness(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelRoughnessAsExpression.toString())\n    assertEquals(null, layer.modelRoughness)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelRoughnessTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelRoughnessTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelRoughnessTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelRoughnessTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelRoughnessTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelRoughnessTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelScaleTest() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelScale(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.modelScale?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelScaleAsExpressionTest() {\n    val expression = array {\n      literal(\"number\")\n      literal(3)\n      get {\n        literal(\"array\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelScale(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelScaleAsExpression.toString())\n    assertEquals(null, layer.modelScale)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelScaleTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelScaleTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelScaleTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelScaleTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelScaleTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelScaleTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelScaleModeTest() {\n    val layer = modelLayer(\"id\", \"source\") {\n      modelScaleMode(ModelScaleMode.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(ModelScaleMode.MAP, layer.modelScaleMode)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelScaleModeAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = modelLayer(\"id\", \"source\") {\n      modelScaleMode(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelScaleModeAsExpression.toString())\n    assertEquals(ModelScaleMode.MAP, layer.modelScaleMode!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelTranslationTest() {\n    val testValue = listOf(0.0, 1.0, 2.0)\n    val layer = modelLayer(\"id\", \"source\") {\n      modelTranslation(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.modelTranslation?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelTranslationAsExpressionTest() {\n    val expression = array {\n      literal(\"number\")\n      literal(3)\n      get {\n        literal(\"array\")\n      }\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelTranslation(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelTranslationAsExpression.toString())\n    assertEquals(null, layer.modelTranslation)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelTranslationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelTranslationTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelTranslationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelTranslationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = modelLayer(\"id\", \"source\") {\n      modelTranslationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.modelTranslationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelTypeTest() {\n    val layer = modelLayer(\"id\", \"source\") {\n      modelType(ModelType.COMMON_3D)\n    }\n    setupLayer(layer)\n    assertEquals(ModelType.COMMON_3D, layer.modelType)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelTypeAsExpressionTest() {\n    val expression = literal(\"common-3d\")\n    val layer = modelLayer(\"id\", \"source\") {\n      modelType(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.modelTypeAsExpression.toString())\n    assertEquals(ModelType.COMMON_3D, layer.modelType!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = modelLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = modelLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", ModelLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", ModelLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", ModelLayer.defaultMaxZoom)\n    assertNotNull(\"defaultModelAllowDensityReduction should not be null\", ModelLayer.defaultModelAllowDensityReduction)\n    assertNotNull(\"defaultModelAllowDensityReductionAsExpression should not be null\", ModelLayer.defaultModelAllowDensityReductionAsExpression)\n    assertNotNull(\"defaultModelId should not be null\", ModelLayer.defaultModelId)\n    assertNotNull(\"defaultModelIdAsExpression should not be null\", ModelLayer.defaultModelIdAsExpression)\n    assertNotNull(\"defaultModelAmbientOcclusionIntensity should not be null\", ModelLayer.defaultModelAmbientOcclusionIntensity)\n    assertNotNull(\"defaultModelAmbientOcclusionIntensityAsExpression should not be null\", ModelLayer.defaultModelAmbientOcclusionIntensityAsExpression)\n    assertNotNull(\"defaultModelAmbientOcclusionIntensityTransition should not be null\", ModelLayer.defaultModelAmbientOcclusionIntensityTransition)\n    assertNotNull(\"defaultModelCastShadows should not be null\", ModelLayer.defaultModelCastShadows)\n    assertNotNull(\"defaultModelCastShadowsAsExpression should not be null\", ModelLayer.defaultModelCastShadowsAsExpression)\n    assertNotNull(\"defaultModelColor should not be null\", ModelLayer.defaultModelColor)\n    assertNotNull(\"defaultModelColorAsExpression should not be null\", ModelLayer.defaultModelColorAsExpression)\n    assertNotNull(\"defaultModelColorAsColorInt should not be null\", ModelLayer.defaultModelColorAsColorInt)\n    assertNotNull(\"defaultModelColorUseTheme should not be null\", ModelLayer.defaultModelColorUseTheme)\n    assertNotNull(\"defaultModelColorUseThemeAsExpression should not be null\", ModelLayer.defaultModelColorUseThemeAsExpression)\n    assertNotNull(\"defaultModelColorTransition should not be null\", ModelLayer.defaultModelColorTransition)\n    assertNotNull(\"defaultModelColorMixIntensity should not be null\", ModelLayer.defaultModelColorMixIntensity)\n    assertNotNull(\"defaultModelColorMixIntensityAsExpression should not be null\", ModelLayer.defaultModelColorMixIntensityAsExpression)\n    assertNotNull(\"defaultModelColorMixIntensityTransition should not be null\", ModelLayer.defaultModelColorMixIntensityTransition)\n    assertNotNull(\"defaultModelCutoffFadeRange should not be null\", ModelLayer.defaultModelCutoffFadeRange)\n    assertNotNull(\"defaultModelCutoffFadeRangeAsExpression should not be null\", ModelLayer.defaultModelCutoffFadeRangeAsExpression)\n    assertNotNull(\"defaultModelElevationReference should not be null\", ModelLayer.defaultModelElevationReference)\n    assertNotNull(\"defaultModelElevationReferenceAsExpression should not be null\", ModelLayer.defaultModelElevationReferenceAsExpression)\n    assertNotNull(\"defaultModelEmissiveStrength should not be null\", ModelLayer.defaultModelEmissiveStrength)\n    assertNotNull(\"defaultModelEmissiveStrengthAsExpression should not be null\", ModelLayer.defaultModelEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultModelEmissiveStrengthTransition should not be null\", ModelLayer.defaultModelEmissiveStrengthTransition)\n    assertNotNull(\"defaultModelHeightBasedEmissiveStrengthMultiplier should not be null\", ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplier)\n    assertNotNull(\"defaultModelHeightBasedEmissiveStrengthMultiplierAsExpression should not be null\", ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplierAsExpression)\n    assertNotNull(\"defaultModelHeightBasedEmissiveStrengthMultiplierTransition should not be null\", ModelLayer.defaultModelHeightBasedEmissiveStrengthMultiplierTransition)\n    assertNotNull(\"defaultModelOpacity should not be null\", ModelLayer.defaultModelOpacity)\n    assertNotNull(\"defaultModelOpacityAsExpression should not be null\", ModelLayer.defaultModelOpacityAsExpression)\n    assertNotNull(\"defaultModelOpacityTransition should not be null\", ModelLayer.defaultModelOpacityTransition)\n    assertNotNull(\"defaultModelReceiveShadows should not be null\", ModelLayer.defaultModelReceiveShadows)\n    assertNotNull(\"defaultModelReceiveShadowsAsExpression should not be null\", ModelLayer.defaultModelReceiveShadowsAsExpression)\n    assertNotNull(\"defaultModelRotation should not be null\", ModelLayer.defaultModelRotation)\n    assertNotNull(\"defaultModelRotationAsExpression should not be null\", ModelLayer.defaultModelRotationAsExpression)\n    assertNotNull(\"defaultModelRotationTransition should not be null\", ModelLayer.defaultModelRotationTransition)\n    assertNotNull(\"defaultModelRoughness should not be null\", ModelLayer.defaultModelRoughness)\n    assertNotNull(\"defaultModelRoughnessAsExpression should not be null\", ModelLayer.defaultModelRoughnessAsExpression)\n    assertNotNull(\"defaultModelRoughnessTransition should not be null\", ModelLayer.defaultModelRoughnessTransition)\n    assertNotNull(\"defaultModelScale should not be null\", ModelLayer.defaultModelScale)\n    assertNotNull(\"defaultModelScaleAsExpression should not be null\", ModelLayer.defaultModelScaleAsExpression)\n    assertNotNull(\"defaultModelScaleTransition should not be null\", ModelLayer.defaultModelScaleTransition)\n    assertNotNull(\"defaultModelScaleMode should not be null\", ModelLayer.defaultModelScaleMode)\n    assertNotNull(\"defaultModelScaleModeAsExpression should not be null\", ModelLayer.defaultModelScaleModeAsExpression)\n    assertNotNull(\"defaultModelTranslation should not be null\", ModelLayer.defaultModelTranslation)\n    assertNotNull(\"defaultModelTranslationAsExpression should not be null\", ModelLayer.defaultModelTranslationAsExpression)\n    assertNotNull(\"defaultModelTranslationTransition should not be null\", ModelLayer.defaultModelTranslationTransition)\n    assertNotNull(\"defaultModelType should not be null\", ModelLayer.defaultModelType)\n    assertNotNull(\"defaultModelTypeAsExpression should not be null\", ModelLayer.defaultModelTypeAsExpression)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val modelAllowDensityReductionTestValue = true\n    val modelIdTestValue = \"abc\"\n    val modelAmbientOcclusionIntensityTestValue = 1.0\n    val modelCastShadowsTestValue = true\n    val modelColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val modelColorUseThemeTestValue = \"default\"\n    val modelColorMixIntensityTestValue = 1.0\n    val modelCutoffFadeRangeTestValue = 1.0\n    val modelElevationReferenceTestValue = ModelElevationReference.SEA\n    val modelEmissiveStrengthTestValue = 1.0\n    val modelHeightBasedEmissiveStrengthMultiplierTestValue = listOf(0.0, 1.0, 2.0, 3.0, 4.0)\n    val modelOpacityTestValue = 1.0\n    val modelReceiveShadowsTestValue = true\n    val modelRotationTestValue = listOf(0.0, 1.0, 2.0)\n    val modelRoughnessTestValue = 1.0\n    val modelScaleTestValue = listOf(0.0, 1.0, 2.0)\n    val modelScaleModeTestValue = ModelScaleMode.MAP\n    val modelTranslationTestValue = listOf(0.0, 1.0, 2.0)\n    val modelTypeTestValue = ModelType.COMMON_3D\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = modelLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      filter(filterTestValue)\n      modelAllowDensityReduction(modelAllowDensityReductionTestValue)\n      modelId(modelIdTestValue)\n      modelAmbientOcclusionIntensity(modelAmbientOcclusionIntensityTestValue)\n      modelCastShadows(modelCastShadowsTestValue)\n      modelColor(modelColorTestValue)\n      modelColorUseTheme(modelColorUseThemeTestValue)\n      modelColorMixIntensity(modelColorMixIntensityTestValue)\n      modelCutoffFadeRange(modelCutoffFadeRangeTestValue)\n      modelElevationReference(modelElevationReferenceTestValue)\n      modelEmissiveStrength(modelEmissiveStrengthTestValue)\n      modelHeightBasedEmissiveStrengthMultiplier(modelHeightBasedEmissiveStrengthMultiplierTestValue)\n      modelOpacity(modelOpacityTestValue)\n      modelReceiveShadows(modelReceiveShadowsTestValue)\n      modelRotation(modelRotationTestValue)\n      modelRoughness(modelRoughnessTestValue)\n      modelScale(modelScaleTestValue)\n      modelScaleMode(modelScaleModeTestValue)\n      modelTranslation(modelTranslationTestValue)\n      modelType(modelTypeTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as ModelLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(modelAllowDensityReductionTestValue, cachedLayer.modelAllowDensityReduction)\n    assertEquals(modelIdTestValue, cachedLayer.modelId)\n    assertEquals(modelAmbientOcclusionIntensityTestValue, cachedLayer.modelAmbientOcclusionIntensity)\n    assertEquals(modelCastShadowsTestValue, cachedLayer.modelCastShadows)\n    assertEquals(modelColorTestValue, cachedLayer.modelColor)\n    assertEquals(modelColorUseThemeTestValue, cachedLayer.modelColorUseTheme)\n    assertEquals(modelColorMixIntensityTestValue, cachedLayer.modelColorMixIntensity)\n    assertEquals(modelCutoffFadeRangeTestValue, cachedLayer.modelCutoffFadeRange)\n    assertEquals(modelElevationReferenceTestValue, cachedLayer.modelElevationReference)\n    assertEquals(modelEmissiveStrengthTestValue, cachedLayer.modelEmissiveStrength)\n    assertEquals(modelHeightBasedEmissiveStrengthMultiplierTestValue, cachedLayer.modelHeightBasedEmissiveStrengthMultiplier)\n    assertEquals(modelOpacityTestValue, cachedLayer.modelOpacity)\n    assertEquals(modelReceiveShadowsTestValue, cachedLayer.modelReceiveShadows)\n    assertEquals(modelRotationTestValue, cachedLayer.modelRotation)\n    assertEquals(modelRoughnessTestValue, cachedLayer.modelRoughness)\n    assertEquals(modelScaleTestValue, cachedLayer.modelScale)\n    assertEquals(modelScaleModeTestValue, cachedLayer.modelScaleMode)\n    assertEquals(modelTranslationTestValue, cachedLayer.modelTranslation)\n    assertEquals(modelTypeTestValue, cachedLayer.modelType)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/RasterLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for RasterLayer\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass RasterLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = rasterLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = rasterLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = rasterLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun rasterArrayBandTest() {\n    val testValue = \"abc\"\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterArrayBand(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.rasterArrayBand?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterArrayBandAsExpressionTest() {\n    val expression = literal(\"abc\")\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterArrayBand(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.rasterArrayBandAsExpression.toString())\n    assertEquals(\"abc\", layer.rasterArrayBand!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterBrightnessMaxTest() {\n    val testValue = 1.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterBrightnessMax(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterBrightnessMax!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterBrightnessMaxAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterBrightnessMax(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterBrightnessMaxAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterBrightnessMax!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterBrightnessMaxTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterBrightnessMaxTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterBrightnessMaxTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterBrightnessMaxTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterBrightnessMaxTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterBrightnessMaxTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterBrightnessMinTest() {\n    val testValue = 1.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterBrightnessMin(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterBrightnessMin!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterBrightnessMinAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterBrightnessMin(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterBrightnessMinAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterBrightnessMin!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterBrightnessMinTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterBrightnessMinTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterBrightnessMinTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterBrightnessMinTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterBrightnessMinTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterBrightnessMinTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorTest() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.rasterColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.rasterColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.rasterColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorUseTheme() {\n    val theme = \"none\"\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.rasterColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorMixTest() {\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorMix(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.rasterColorMix?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorMixAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0, 2.0, 3.0))\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorMix(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.rasterColorMixAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0), layer.rasterColorMix!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorMixTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorMixTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterColorMixTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorMixTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorMixTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterColorMixTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorRangeTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorRange(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.rasterColorRange?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorRangeAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorRange(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.rasterColorRangeAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.rasterColorRange!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorRangeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorRangeTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterColorRangeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterColorRangeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterColorRangeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterColorRangeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterContrastTest() {\n    val testValue = 1.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterContrast(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterContrast!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterContrastAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterContrast(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterContrastAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterContrast!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterContrastTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterContrastTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterContrastTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterContrastTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterContrastTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterContrastTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterElevationTest() {\n    val testValue = 1.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterElevation(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterElevation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterElevationAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterElevation(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterElevationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterElevation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterElevationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterElevationTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterElevationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterElevationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterElevationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterElevationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterEmissiveStrengthAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterEmissiveStrengthAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterFadeDurationTest() {\n    val testValue = 1.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterFadeDuration(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterFadeDuration!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterFadeDurationAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterFadeDuration(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterFadeDurationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterFadeDuration!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterHueRotateTest() {\n    val testValue = 1.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterHueRotate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterHueRotate!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterHueRotateAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterHueRotate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterHueRotateAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterHueRotate!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterHueRotateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterHueRotateTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterHueRotateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterHueRotateTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterHueRotateTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterHueRotateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterOpacityTest() {\n    val testValue = 1.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterOpacityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterResamplingTest() {\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterResampling(RasterResampling.LINEAR)\n    }\n    setupLayer(layer)\n    assertEquals(RasterResampling.LINEAR, layer.rasterResampling)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterResamplingAsExpressionTest() {\n    val expression = literal(\"linear\")\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterResampling(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.rasterResamplingAsExpression.toString())\n    assertEquals(RasterResampling.LINEAR, layer.rasterResampling!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterSaturationTest() {\n    val testValue = 1.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterSaturation(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterSaturation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterSaturationAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterSaturation(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterSaturationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterSaturation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterSaturationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterSaturationTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterSaturationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterSaturationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterLayer(\"id\", \"source\") {\n      rasterSaturationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterSaturationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = rasterLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = rasterLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", RasterLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", RasterLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", RasterLayer.defaultMaxZoom)\n    assertNotNull(\"defaultRasterArrayBand should not be null\", RasterLayer.defaultRasterArrayBand)\n    assertNotNull(\"defaultRasterArrayBandAsExpression should not be null\", RasterLayer.defaultRasterArrayBandAsExpression)\n    assertNotNull(\"defaultRasterBrightnessMax should not be null\", RasterLayer.defaultRasterBrightnessMax)\n    assertNotNull(\"defaultRasterBrightnessMaxAsExpression should not be null\", RasterLayer.defaultRasterBrightnessMaxAsExpression)\n    assertNotNull(\"defaultRasterBrightnessMaxTransition should not be null\", RasterLayer.defaultRasterBrightnessMaxTransition)\n    assertNotNull(\"defaultRasterBrightnessMin should not be null\", RasterLayer.defaultRasterBrightnessMin)\n    assertNotNull(\"defaultRasterBrightnessMinAsExpression should not be null\", RasterLayer.defaultRasterBrightnessMinAsExpression)\n    assertNotNull(\"defaultRasterBrightnessMinTransition should not be null\", RasterLayer.defaultRasterBrightnessMinTransition)\n    assertNotNull(\"defaultRasterColorUseTheme should not be null\", RasterLayer.defaultRasterColorUseTheme)\n    assertNotNull(\"defaultRasterColorUseThemeAsExpression should not be null\", RasterLayer.defaultRasterColorUseThemeAsExpression)\n    assertNotNull(\"defaultRasterColorMix should not be null\", RasterLayer.defaultRasterColorMix)\n    assertNotNull(\"defaultRasterColorMixAsExpression should not be null\", RasterLayer.defaultRasterColorMixAsExpression)\n    assertNotNull(\"defaultRasterColorMixTransition should not be null\", RasterLayer.defaultRasterColorMixTransition)\n    assertNotNull(\"defaultRasterColorRange should not be null\", RasterLayer.defaultRasterColorRange)\n    assertNotNull(\"defaultRasterColorRangeAsExpression should not be null\", RasterLayer.defaultRasterColorRangeAsExpression)\n    assertNotNull(\"defaultRasterColorRangeTransition should not be null\", RasterLayer.defaultRasterColorRangeTransition)\n    assertNotNull(\"defaultRasterContrast should not be null\", RasterLayer.defaultRasterContrast)\n    assertNotNull(\"defaultRasterContrastAsExpression should not be null\", RasterLayer.defaultRasterContrastAsExpression)\n    assertNotNull(\"defaultRasterContrastTransition should not be null\", RasterLayer.defaultRasterContrastTransition)\n    assertNotNull(\"defaultRasterElevation should not be null\", RasterLayer.defaultRasterElevation)\n    assertNotNull(\"defaultRasterElevationAsExpression should not be null\", RasterLayer.defaultRasterElevationAsExpression)\n    assertNotNull(\"defaultRasterElevationTransition should not be null\", RasterLayer.defaultRasterElevationTransition)\n    assertNotNull(\"defaultRasterEmissiveStrength should not be null\", RasterLayer.defaultRasterEmissiveStrength)\n    assertNotNull(\"defaultRasterEmissiveStrengthAsExpression should not be null\", RasterLayer.defaultRasterEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultRasterEmissiveStrengthTransition should not be null\", RasterLayer.defaultRasterEmissiveStrengthTransition)\n    assertNotNull(\"defaultRasterFadeDuration should not be null\", RasterLayer.defaultRasterFadeDuration)\n    assertNotNull(\"defaultRasterFadeDurationAsExpression should not be null\", RasterLayer.defaultRasterFadeDurationAsExpression)\n    assertNotNull(\"defaultRasterHueRotate should not be null\", RasterLayer.defaultRasterHueRotate)\n    assertNotNull(\"defaultRasterHueRotateAsExpression should not be null\", RasterLayer.defaultRasterHueRotateAsExpression)\n    assertNotNull(\"defaultRasterHueRotateTransition should not be null\", RasterLayer.defaultRasterHueRotateTransition)\n    assertNotNull(\"defaultRasterOpacity should not be null\", RasterLayer.defaultRasterOpacity)\n    assertNotNull(\"defaultRasterOpacityAsExpression should not be null\", RasterLayer.defaultRasterOpacityAsExpression)\n    assertNotNull(\"defaultRasterOpacityTransition should not be null\", RasterLayer.defaultRasterOpacityTransition)\n    assertNotNull(\"defaultRasterResampling should not be null\", RasterLayer.defaultRasterResampling)\n    assertNotNull(\"defaultRasterResamplingAsExpression should not be null\", RasterLayer.defaultRasterResamplingAsExpression)\n    assertNotNull(\"defaultRasterSaturation should not be null\", RasterLayer.defaultRasterSaturation)\n    assertNotNull(\"defaultRasterSaturationAsExpression should not be null\", RasterLayer.defaultRasterSaturationAsExpression)\n    assertNotNull(\"defaultRasterSaturationTransition should not be null\", RasterLayer.defaultRasterSaturationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val rasterArrayBandTestValue = \"abc\"\n    val rasterBrightnessMaxTestValue = 1.0\n    val rasterBrightnessMinTestValue = 1.0\n    val rasterColorTestValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val rasterColorUseThemeTestValue = \"default\"\n    val rasterColorMixTestValue = listOf(0.0, 1.0, 2.0, 3.0)\n    val rasterColorRangeTestValue = listOf(0.0, 1.0)\n    val rasterContrastTestValue = 1.0\n    val rasterElevationTestValue = 1.0\n    val rasterEmissiveStrengthTestValue = 1.0\n    val rasterFadeDurationTestValue = 1.0\n    val rasterHueRotateTestValue = 1.0\n    val rasterOpacityTestValue = 1.0\n    val rasterResamplingTestValue = RasterResampling.LINEAR\n    val rasterSaturationTestValue = 1.0\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = rasterLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      rasterArrayBand(rasterArrayBandTestValue)\n      rasterBrightnessMax(rasterBrightnessMaxTestValue)\n      rasterBrightnessMin(rasterBrightnessMinTestValue)\n      rasterColor(rasterColorTestValue)\n      rasterColorUseTheme(rasterColorUseThemeTestValue)\n      rasterColorMix(rasterColorMixTestValue)\n      rasterColorRange(rasterColorRangeTestValue)\n      rasterContrast(rasterContrastTestValue)\n      rasterElevation(rasterElevationTestValue)\n      rasterEmissiveStrength(rasterEmissiveStrengthTestValue)\n      rasterFadeDuration(rasterFadeDurationTestValue)\n      rasterHueRotate(rasterHueRotateTestValue)\n      rasterOpacity(rasterOpacityTestValue)\n      rasterResampling(rasterResamplingTestValue)\n      rasterSaturation(rasterSaturationTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as RasterLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(rasterArrayBandTestValue, cachedLayer.rasterArrayBand)\n    assertEquals(rasterBrightnessMaxTestValue, cachedLayer.rasterBrightnessMax)\n    assertEquals(rasterBrightnessMinTestValue, cachedLayer.rasterBrightnessMin)\n    assertEquals(rasterColorTestValue, cachedLayer.rasterColor)\n    assertEquals(rasterColorUseThemeTestValue, cachedLayer.rasterColorUseTheme)\n    assertEquals(rasterColorMixTestValue, cachedLayer.rasterColorMix)\n    assertEquals(rasterColorRangeTestValue, cachedLayer.rasterColorRange)\n    assertEquals(rasterContrastTestValue, cachedLayer.rasterContrast)\n    assertEquals(rasterElevationTestValue, cachedLayer.rasterElevation)\n    assertEquals(rasterEmissiveStrengthTestValue, cachedLayer.rasterEmissiveStrength)\n    assertEquals(rasterFadeDurationTestValue, cachedLayer.rasterFadeDuration)\n    assertEquals(rasterHueRotateTestValue, cachedLayer.rasterHueRotate)\n    assertEquals(rasterOpacityTestValue, cachedLayer.rasterOpacity)\n    assertEquals(rasterResamplingTestValue, cachedLayer.rasterResampling)\n    assertEquals(rasterSaturationTestValue, cachedLayer.rasterSaturation)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/RasterParticleLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for RasterParticleLayer\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass RasterParticleLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleArrayBandTest() {\n    val testValue = \"abc\"\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleArrayBand(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.rasterParticleArrayBand?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleArrayBandAsExpressionTest() {\n    val expression = literal(\"abc\")\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleArrayBand(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.rasterParticleArrayBandAsExpression.toString())\n    assertEquals(\"abc\", layer.rasterParticleArrayBand!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleColorTest() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.rasterParticleColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.rasterParticleColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.rasterParticleColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleColorUseTheme() {\n    val theme = \"none\"\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.rasterParticleColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleCountTest() {\n    val testValue = 1L\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleCount(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.rasterParticleCount?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleCountAsExpressionTest() {\n    val expression = literal(1L)\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleCount(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.rasterParticleCountAsExpression.toString())\n    assertEquals(1L, layer.rasterParticleCount!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleFadeOpacityFactorTest() {\n    val testValue = 1.0\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleFadeOpacityFactor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterParticleFadeOpacityFactor!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleFadeOpacityFactorAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleFadeOpacityFactor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterParticleFadeOpacityFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterParticleFadeOpacityFactor!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleFadeOpacityFactorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleFadeOpacityFactorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterParticleFadeOpacityFactorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleFadeOpacityFactorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleFadeOpacityFactorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterParticleFadeOpacityFactorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleMaxSpeedTest() {\n    val testValue = 1.0\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleMaxSpeed(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterParticleMaxSpeed!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleMaxSpeedAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleMaxSpeed(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterParticleMaxSpeedAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterParticleMaxSpeed!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleResetRateFactorTest() {\n    val testValue = 1.0\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleResetRateFactor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterParticleResetRateFactor!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleResetRateFactorAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleResetRateFactor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterParticleResetRateFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterParticleResetRateFactor!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleSpeedFactorTest() {\n    val testValue = 1.0\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleSpeedFactor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.rasterParticleSpeedFactor!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleSpeedFactorAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleSpeedFactor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.rasterParticleSpeedFactorAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.rasterParticleSpeedFactor!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleSpeedFactorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleSpeedFactorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterParticleSpeedFactorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun rasterParticleSpeedFactorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      rasterParticleSpeedFactorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.rasterParticleSpeedFactorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", RasterParticleLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", RasterParticleLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", RasterParticleLayer.defaultMaxZoom)\n    assertNotNull(\"defaultRasterParticleArrayBand should not be null\", RasterParticleLayer.defaultRasterParticleArrayBand)\n    assertNotNull(\"defaultRasterParticleArrayBandAsExpression should not be null\", RasterParticleLayer.defaultRasterParticleArrayBandAsExpression)\n    assertNotNull(\"defaultRasterParticleColorUseTheme should not be null\", RasterParticleLayer.defaultRasterParticleColorUseTheme)\n    assertNotNull(\"defaultRasterParticleColorUseThemeAsExpression should not be null\", RasterParticleLayer.defaultRasterParticleColorUseThemeAsExpression)\n    assertNotNull(\"defaultRasterParticleCount should not be null\", RasterParticleLayer.defaultRasterParticleCount)\n    assertNotNull(\"defaultRasterParticleCountAsExpression should not be null\", RasterParticleLayer.defaultRasterParticleCountAsExpression)\n    assertNotNull(\"defaultRasterParticleFadeOpacityFactor should not be null\", RasterParticleLayer.defaultRasterParticleFadeOpacityFactor)\n    assertNotNull(\"defaultRasterParticleFadeOpacityFactorAsExpression should not be null\", RasterParticleLayer.defaultRasterParticleFadeOpacityFactorAsExpression)\n    assertNotNull(\"defaultRasterParticleFadeOpacityFactorTransition should not be null\", RasterParticleLayer.defaultRasterParticleFadeOpacityFactorTransition)\n    assertNotNull(\"defaultRasterParticleMaxSpeed should not be null\", RasterParticleLayer.defaultRasterParticleMaxSpeed)\n    assertNotNull(\"defaultRasterParticleMaxSpeedAsExpression should not be null\", RasterParticleLayer.defaultRasterParticleMaxSpeedAsExpression)\n    assertNotNull(\"defaultRasterParticleResetRateFactor should not be null\", RasterParticleLayer.defaultRasterParticleResetRateFactor)\n    assertNotNull(\"defaultRasterParticleResetRateFactorAsExpression should not be null\", RasterParticleLayer.defaultRasterParticleResetRateFactorAsExpression)\n    assertNotNull(\"defaultRasterParticleSpeedFactor should not be null\", RasterParticleLayer.defaultRasterParticleSpeedFactor)\n    assertNotNull(\"defaultRasterParticleSpeedFactorAsExpression should not be null\", RasterParticleLayer.defaultRasterParticleSpeedFactorAsExpression)\n    assertNotNull(\"defaultRasterParticleSpeedFactorTransition should not be null\", RasterParticleLayer.defaultRasterParticleSpeedFactorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val rasterParticleArrayBandTestValue = \"abc\"\n    val rasterParticleColorTestValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val rasterParticleColorUseThemeTestValue = \"default\"\n    val rasterParticleCountTestValue = 1L\n    val rasterParticleFadeOpacityFactorTestValue = 1.0\n    val rasterParticleMaxSpeedTestValue = 1.0\n    val rasterParticleResetRateFactorTestValue = 1.0\n    val rasterParticleSpeedFactorTestValue = 1.0\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = rasterParticleLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      filter(filterTestValue)\n      rasterParticleArrayBand(rasterParticleArrayBandTestValue)\n      rasterParticleColor(rasterParticleColorTestValue)\n      rasterParticleColorUseTheme(rasterParticleColorUseThemeTestValue)\n      rasterParticleCount(rasterParticleCountTestValue)\n      rasterParticleFadeOpacityFactor(rasterParticleFadeOpacityFactorTestValue)\n      rasterParticleMaxSpeed(rasterParticleMaxSpeedTestValue)\n      rasterParticleResetRateFactor(rasterParticleResetRateFactorTestValue)\n      rasterParticleSpeedFactor(rasterParticleSpeedFactorTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as RasterParticleLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(rasterParticleArrayBandTestValue, cachedLayer.rasterParticleArrayBand)\n    assertEquals(rasterParticleColorTestValue, cachedLayer.rasterParticleColor)\n    assertEquals(rasterParticleColorUseThemeTestValue, cachedLayer.rasterParticleColorUseTheme)\n    assertEquals(rasterParticleCountTestValue, cachedLayer.rasterParticleCount)\n    assertEquals(rasterParticleFadeOpacityFactorTestValue, cachedLayer.rasterParticleFadeOpacityFactor)\n    assertEquals(rasterParticleMaxSpeedTestValue, cachedLayer.rasterParticleMaxSpeed)\n    assertEquals(rasterParticleResetRateFactorTestValue, cachedLayer.rasterParticleResetRateFactor)\n    assertEquals(rasterParticleSpeedFactorTestValue, cachedLayer.rasterParticleSpeedFactor)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/SkyLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for SkyLayer\n */\n@RunWith(AndroidJUnit4::class)\nclass SkyLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = skyLayer(\"id\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.skyAtmosphereColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.skyAtmosphereColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.skyAtmosphereColor)\n    assertEquals(Color.BLACK, layer.skyAtmosphereColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.skyAtmosphereColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.skyAtmosphereColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereColorAsColorIntTest() {\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.skyAtmosphereColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereColorUseTheme() {\n    val theme = \"none\"\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.skyAtmosphereColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereHaloColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereHaloColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.skyAtmosphereHaloColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereHaloColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereHaloColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.skyAtmosphereHaloColorAsExpression.toString())\n    assertEquals(\"rgba(0, 0, 0, 1)\", layer.skyAtmosphereHaloColor)\n    assertEquals(Color.BLACK, layer.skyAtmosphereHaloColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereHaloColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereHaloColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.skyAtmosphereHaloColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereHaloColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereHaloColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.skyAtmosphereHaloColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereHaloColorAsColorIntTest() {\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereHaloColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.skyAtmosphereHaloColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereHaloColorUseTheme() {\n    val theme = \"none\"\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereHaloColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.skyAtmosphereHaloColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereSunTest() {\n    val testValue = listOf(180.0, 90.0)\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereSun(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.skyAtmosphereSun?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereSunAsExpressionTest() {\n    val expression = literal(listOf(180.0, 90.0))\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereSun(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.skyAtmosphereSunAsExpression.toString())\n    assertEquals(listOf(180.0, 90.0), layer.skyAtmosphereSun!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereSunIntensityTest() {\n    val testValue = 1.0\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereSunIntensity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.skyAtmosphereSunIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyAtmosphereSunIntensityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = skyLayer(\"id\") {\n      skyAtmosphereSunIntensity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.skyAtmosphereSunIntensityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.skyAtmosphereSunIntensity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyGradientTest() {\n    val testValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val layer = skyLayer(\"id\") {\n      skyGradient(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.skyGradient?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyGradientUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = skyLayer(\"id\") {\n      skyGradientUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.skyGradientUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyGradientUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = skyLayer(\"id\") {\n      skyGradientUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.skyGradientUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyGradientUseTheme() {\n    val theme = \"none\"\n    val layer = skyLayer(\"id\") {\n      skyGradientUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.skyGradientUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyGradientCenterTest() {\n    val testValue = listOf(180.0, 90.0)\n    val layer = skyLayer(\"id\") {\n      skyGradientCenter(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.skyGradientCenter?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyGradientCenterAsExpressionTest() {\n    val expression = literal(listOf(180.0, 90.0))\n    val layer = skyLayer(\"id\") {\n      skyGradientCenter(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.skyGradientCenterAsExpression.toString())\n    assertEquals(listOf(180.0, 90.0), layer.skyGradientCenter!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyGradientRadiusTest() {\n    val testValue = 1.0\n    val layer = skyLayer(\"id\") {\n      skyGradientRadius(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.skyGradientRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyGradientRadiusAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = skyLayer(\"id\") {\n      skyGradientRadius(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.skyGradientRadiusAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.skyGradientRadius!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyOpacityTest() {\n    val testValue = 1.0\n    val layer = skyLayer(\"id\") {\n      skyOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.skyOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyOpacityAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = skyLayer(\"id\") {\n      skyOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.skyOpacityAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.skyOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = skyLayer(\"id\") {\n      skyOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.skyOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = skyLayer(\"id\") {\n      skyOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.skyOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyTypeTest() {\n    val layer = skyLayer(\"id\") {\n      skyType(SkyType.GRADIENT)\n    }\n    setupLayer(layer)\n    assertEquals(SkyType.GRADIENT, layer.skyType)\n  }\n\n  @Test\n  @UiThreadTest\n  fun skyTypeAsExpressionTest() {\n    val expression = literal(\"gradient\")\n    val layer = skyLayer(\"id\") {\n      skyType(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.skyTypeAsExpression.toString())\n    assertEquals(SkyType.GRADIENT, layer.skyType!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = skyLayer(\"id\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = skyLayer(\"id\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", SkyLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", SkyLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", SkyLayer.defaultMaxZoom)\n    assertNotNull(\"defaultSkyAtmosphereColor should not be null\", SkyLayer.defaultSkyAtmosphereColor)\n    assertNotNull(\"defaultSkyAtmosphereColorAsExpression should not be null\", SkyLayer.defaultSkyAtmosphereColorAsExpression)\n    assertNotNull(\"defaultSkyAtmosphereColorAsColorInt should not be null\", SkyLayer.defaultSkyAtmosphereColorAsColorInt)\n    assertNotNull(\"defaultSkyAtmosphereColorUseTheme should not be null\", SkyLayer.defaultSkyAtmosphereColorUseTheme)\n    assertNotNull(\"defaultSkyAtmosphereColorUseThemeAsExpression should not be null\", SkyLayer.defaultSkyAtmosphereColorUseThemeAsExpression)\n    assertNotNull(\"defaultSkyAtmosphereHaloColor should not be null\", SkyLayer.defaultSkyAtmosphereHaloColor)\n    assertNotNull(\"defaultSkyAtmosphereHaloColorAsExpression should not be null\", SkyLayer.defaultSkyAtmosphereHaloColorAsExpression)\n    assertNotNull(\"defaultSkyAtmosphereHaloColorAsColorInt should not be null\", SkyLayer.defaultSkyAtmosphereHaloColorAsColorInt)\n    assertNotNull(\"defaultSkyAtmosphereHaloColorUseTheme should not be null\", SkyLayer.defaultSkyAtmosphereHaloColorUseTheme)\n    assertNotNull(\"defaultSkyAtmosphereHaloColorUseThemeAsExpression should not be null\", SkyLayer.defaultSkyAtmosphereHaloColorUseThemeAsExpression)\n    assertNotNull(\"defaultSkyAtmosphereSun should not be null\", SkyLayer.defaultSkyAtmosphereSun)\n    assertNotNull(\"defaultSkyAtmosphereSunAsExpression should not be null\", SkyLayer.defaultSkyAtmosphereSunAsExpression)\n    assertNotNull(\"defaultSkyAtmosphereSunIntensity should not be null\", SkyLayer.defaultSkyAtmosphereSunIntensity)\n    assertNotNull(\"defaultSkyAtmosphereSunIntensityAsExpression should not be null\", SkyLayer.defaultSkyAtmosphereSunIntensityAsExpression)\n    assertNotNull(\"defaultSkyGradient should not be null\", SkyLayer.defaultSkyGradient)\n    assertNotNull(\"defaultSkyGradientUseTheme should not be null\", SkyLayer.defaultSkyGradientUseTheme)\n    assertNotNull(\"defaultSkyGradientUseThemeAsExpression should not be null\", SkyLayer.defaultSkyGradientUseThemeAsExpression)\n    assertNotNull(\"defaultSkyGradientCenter should not be null\", SkyLayer.defaultSkyGradientCenter)\n    assertNotNull(\"defaultSkyGradientCenterAsExpression should not be null\", SkyLayer.defaultSkyGradientCenterAsExpression)\n    assertNotNull(\"defaultSkyGradientRadius should not be null\", SkyLayer.defaultSkyGradientRadius)\n    assertNotNull(\"defaultSkyGradientRadiusAsExpression should not be null\", SkyLayer.defaultSkyGradientRadiusAsExpression)\n    assertNotNull(\"defaultSkyOpacity should not be null\", SkyLayer.defaultSkyOpacity)\n    assertNotNull(\"defaultSkyOpacityAsExpression should not be null\", SkyLayer.defaultSkyOpacityAsExpression)\n    assertNotNull(\"defaultSkyOpacityTransition should not be null\", SkyLayer.defaultSkyOpacityTransition)\n    assertNotNull(\"defaultSkyType should not be null\", SkyLayer.defaultSkyType)\n    assertNotNull(\"defaultSkyTypeAsExpression should not be null\", SkyLayer.defaultSkyTypeAsExpression)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val skyAtmosphereColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val skyAtmosphereColorUseThemeTestValue = \"default\"\n    val skyAtmosphereHaloColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val skyAtmosphereHaloColorUseThemeTestValue = \"default\"\n    val skyAtmosphereSunTestValue = listOf(180.0, 90.0)\n    val skyAtmosphereSunIntensityTestValue = 1.0\n    val skyGradientTestValue = interpolate {\n      linear()\n      heatmapDensity()\n      stop {\n        literal(0.0)\n        rgba {\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n          literal(0.0)\n        }\n      }\n      stop {\n        literal(1.0)\n        rgba {\n          literal(0.0)\n          literal(255.0)\n          literal(0.0)\n          literal(1.0)\n        }\n      }\n    }\n    val skyGradientUseThemeTestValue = \"default\"\n    val skyGradientCenterTestValue = listOf(180.0, 90.0)\n    val skyGradientRadiusTestValue = 1.0\n    val skyOpacityTestValue = 1.0\n    val skyTypeTestValue = SkyType.GRADIENT\n\n    val layer = skyLayer(\"id\") {\n      filter(filterTestValue)\n      skyAtmosphereColor(skyAtmosphereColorTestValue)\n      skyAtmosphereColorUseTheme(skyAtmosphereColorUseThemeTestValue)\n      skyAtmosphereHaloColor(skyAtmosphereHaloColorTestValue)\n      skyAtmosphereHaloColorUseTheme(skyAtmosphereHaloColorUseThemeTestValue)\n      skyAtmosphereSun(skyAtmosphereSunTestValue)\n      skyAtmosphereSunIntensity(skyAtmosphereSunIntensityTestValue)\n      skyGradient(skyGradientTestValue)\n      skyGradientUseTheme(skyGradientUseThemeTestValue)\n      skyGradientCenter(skyGradientCenterTestValue)\n      skyGradientRadius(skyGradientRadiusTestValue)\n      skyOpacity(skyOpacityTestValue)\n      skyType(skyTypeTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as SkyLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(skyAtmosphereColorTestValue, cachedLayer.skyAtmosphereColor)\n    assertEquals(skyAtmosphereColorUseThemeTestValue, cachedLayer.skyAtmosphereColorUseTheme)\n    assertEquals(skyAtmosphereHaloColorTestValue, cachedLayer.skyAtmosphereHaloColor)\n    assertEquals(skyAtmosphereHaloColorUseThemeTestValue, cachedLayer.skyAtmosphereHaloColorUseTheme)\n    assertEquals(skyAtmosphereSunTestValue, cachedLayer.skyAtmosphereSun)\n    assertEquals(skyAtmosphereSunIntensityTestValue, cachedLayer.skyAtmosphereSunIntensity)\n    assertEquals(skyGradientTestValue, cachedLayer.skyGradient)\n    assertEquals(skyGradientUseThemeTestValue, cachedLayer.skyGradientUseTheme)\n    assertEquals(skyGradientCenterTestValue, cachedLayer.skyGradientCenter)\n    assertEquals(skyGradientRadiusTestValue, cachedLayer.skyGradientRadius)\n    assertEquals(skyOpacityTestValue, cachedLayer.skyOpacity)\n    assertEquals(skyTypeTestValue, cachedLayer.skyType)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/layers/generated/SymbolLayerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.layers.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Ignore\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for SymbolLayer\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass SymbolLayerTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun sourceLayerTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n    }\n    setupLayer(layer)\n    assertEquals(\"test\", layer.sourceLayer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minZoomTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      minZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.minZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxZoomTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      maxZoom(10.0)\n    }\n    setupLayer(layer)\n    assertEquals(10.0, layer.maxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun filterTest() {\n    val expression = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    // Set filter property.\n    val layer = symbolLayer(\"id\", \"source\") {\n      filter(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.filter.toString())\n  }\n  // Property getters and setters\n\n  @Test\n  @UiThreadTest\n  fun iconAllowOverlapTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconAllowOverlap?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconAllowOverlapAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAllowOverlap(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconAllowOverlapAsExpression.toString())\n    assertEquals(true, layer.iconAllowOverlap!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconAnchorTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAnchor(IconAnchor.CENTER)\n    }\n    setupLayer(layer)\n    assertEquals(IconAnchor.CENTER, layer.iconAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconAnchorAsExpressionTest() {\n    val expression = toString {\n      get {\n        literal(\"enum\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconAnchorAsExpression.toString())\n    assertEquals(null, layer.iconAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconIgnorePlacementTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconIgnorePlacement(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconIgnorePlacement?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconIgnorePlacementAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconIgnorePlacement(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconIgnorePlacementAsExpression.toString())\n    assertEquals(true, layer.iconIgnorePlacement!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconImageTest() {\n    val testValue = \"abc\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconImage(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconImage?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconImageAsExpressionTest() {\n    val expression = image {\n      string {\n        get {\n          literal(\"resolvedImage\")\n        }\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconImage(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconImageAsExpression.toString())\n    assertEquals(null, layer.iconImage)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconKeepUprightTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconKeepUpright(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconKeepUpright?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconKeepUprightAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconKeepUpright(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconKeepUprightAsExpression.toString())\n    assertEquals(true, layer.iconKeepUpright!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOffsetTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOffset(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconOffset?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOffsetAsExpressionTest() {\n    val expression = array {\n      literal(\"number\")\n      literal(2)\n      get {\n        literal(\"array\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOffset(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconOffsetAsExpression.toString())\n    assertEquals(null, layer.iconOffset)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOptionalTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOptional(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconOptional?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOptionalAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOptional(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconOptionalAsExpression.toString())\n    assertEquals(true, layer.iconOptional!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconPaddingTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconPadding(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconPadding!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconPaddingAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconPadding(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.iconPaddingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconPadding!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconPitchAlignmentTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconPitchAlignment(IconPitchAlignment.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(IconPitchAlignment.MAP, layer.iconPitchAlignment)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconPitchAlignmentAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconPitchAlignment(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconPitchAlignmentAsExpression.toString())\n    assertEquals(IconPitchAlignment.MAP, layer.iconPitchAlignment!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconRotateTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconRotate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconRotate!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconRotateAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconRotate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconRotateAsExpression.toString())\n    assertEquals(null, layer.iconRotate)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconRotationAlignmentTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconRotationAlignment(IconRotationAlignment.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(IconRotationAlignment.MAP, layer.iconRotationAlignment)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconRotationAlignmentAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconRotationAlignment(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconRotationAlignmentAsExpression.toString())\n    assertEquals(IconRotationAlignment.MAP, layer.iconRotationAlignment!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconSizeTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconSize(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconSize!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconSizeAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconSize(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconSizeAsExpression.toString())\n    assertEquals(null, layer.iconSize)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconSizeScaleRangeTest() {\n    val testValue = listOf(5.0, 5.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconSizeScaleRange(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconSizeScaleRange?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconSizeScaleRangeAsExpressionTest() {\n    val expression = literal(listOf(5.0, 5.0))\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconSizeScaleRange(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconSizeScaleRangeAsExpression.toString())\n    assertEquals(listOf(5.0, 5.0), layer.iconSizeScaleRange!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTextFitTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTextFit(IconTextFit.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(IconTextFit.NONE, layer.iconTextFit)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTextFitAsExpressionTest() {\n    val expression = toString {\n      get {\n        literal(\"enum\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTextFit(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconTextFitAsExpression.toString())\n    assertEquals(null, layer.iconTextFit)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTextFitPaddingTest() {\n    val testValue = listOf(0.0, 1.0, 2.0, 3.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTextFitPadding(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconTextFitPadding?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTextFitPaddingAsExpressionTest() {\n    val expression = array {\n      literal(\"number\")\n      literal(4)\n      get {\n        literal(\"array\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTextFitPadding(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconTextFitPaddingAsExpression.toString())\n    assertEquals(null, layer.iconTextFitPadding)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolAvoidEdgesTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolAvoidEdges(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.symbolAvoidEdges?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolAvoidEdgesAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolAvoidEdges(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.symbolAvoidEdgesAsExpression.toString())\n    assertEquals(true, layer.symbolAvoidEdges!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolElevationReferenceTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolElevationReference(SymbolElevationReference.SEA)\n    }\n    setupLayer(layer)\n    assertEquals(SymbolElevationReference.SEA, layer.symbolElevationReference)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolElevationReferenceAsExpressionTest() {\n    val expression = literal(\"sea\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolElevationReference(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.symbolElevationReferenceAsExpression.toString())\n    assertEquals(SymbolElevationReference.SEA, layer.symbolElevationReference!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolPlacementTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolPlacement(SymbolPlacement.POINT)\n    }\n    setupLayer(layer)\n    assertEquals(SymbolPlacement.POINT, layer.symbolPlacement)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolPlacementAsExpressionTest() {\n    val expression = literal(\"point\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolPlacement(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.symbolPlacementAsExpression.toString())\n    assertEquals(SymbolPlacement.POINT, layer.symbolPlacement!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolSortKeyTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolSortKey(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.symbolSortKey!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolSortKeyAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolSortKey(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.symbolSortKeyAsExpression.toString())\n    assertEquals(null, layer.symbolSortKey)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolSpacingTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolSpacing(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.symbolSpacing!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolSpacingAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolSpacing(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.symbolSpacingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.symbolSpacing!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolZElevateTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolZElevate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.symbolZElevate?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolZElevateAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolZElevate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.symbolZElevateAsExpression.toString())\n    assertEquals(true, layer.symbolZElevate!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolZOrderTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolZOrder(SymbolZOrder.AUTO)\n    }\n    setupLayer(layer)\n    assertEquals(SymbolZOrder.AUTO, layer.symbolZOrder)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolZOrderAsExpressionTest() {\n    val expression = literal(\"auto\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolZOrder(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.symbolZOrderAsExpression.toString())\n    assertEquals(SymbolZOrder.AUTO, layer.symbolZOrder!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textAllowOverlapTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      textAllowOverlap(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textAllowOverlap?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textAllowOverlapAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textAllowOverlap(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textAllowOverlapAsExpression.toString())\n    assertEquals(true, layer.textAllowOverlap!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textAnchorTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textAnchor(TextAnchor.CENTER)\n    }\n    setupLayer(layer)\n    assertEquals(TextAnchor.CENTER, layer.textAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textAnchorAsExpressionTest() {\n    val expression = toString {\n      get {\n        literal(\"enum\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textAnchorAsExpression.toString())\n    assertEquals(null, layer.textAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textFieldTest() {\n    val testValue = formatted {\n      formattedSection(\"cyan\") {\n        fontScale = 0.9\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColorAsInt = Color.CYAN\n      }\n      formattedSection(\"black\") {\n        fontScale = 2.0\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColor = \"rgba(0, 0, 0, 1)\"\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textField?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textFieldAsExpressionTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(\n        format {\n          formatSection(\"cyan\") {\n            fontScale(0.9)\n            textFont(listOf(\"Open Sans Regular\", \"Arial Unicode MS Regular\"))\n            textColor(Color.CYAN)\n          }\n          formatSection(\"black\") {\n            fontScale(\n              get {\n                literal(\"scale\")\n              }\n            )\n            textFont(listOf(\"Open Sans Regular\", \"Arial Unicode MS Regular\"))\n            textColor(\n              rgba {\n                literal(0.0)\n                literal(0.0)\n                literal(0.0)\n                literal(1.0)\n              }\n            )\n          }\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[format, cyan, {text-color=[rgba, 0.0, 255.0, 255.0, 1.0], font-scale=0.9, text-font=[literal, [Open Sans Regular, Arial Unicode MS Regular]]}, black, {text-color=[rgba, 0.0, 0.0, 0.0, 1.0], font-scale=[number, [get, scale]], text-font=[literal, [Open Sans Regular, Arial Unicode MS Regular]]}]\",\n      layer.textFieldAsExpression?.toString()\n    )\n  }\n\n  @Test\n  @UiThreadTest\n  fun textFieldAsStringTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField(\"abc\")\n    }\n    setupLayer(layer)\n    assertEquals(\"abc\", layer.textFieldAsString)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textFieldSetDslTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textField {\n        formattedSection(\"cyan\") {\n          fontScale = 0.9\n          fontStack = listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n          textColorAsInt = Color.CYAN\n        }\n        formattedSection(\"black\") {\n          fontScale = 2.0\n          fontStack = listOf(\n            \"Open Sans Regular\",\n            \"Arial Unicode MS Regular\"\n          )\n          textColor = \"rgba(0, 0, 0, 1)\"\n        }\n      }\n    }\n    setupLayer(layer)\n    assertEquals(\n      \"[[cyan, {text-color=rgba(0, 255, 255, 1), font-scale=0.9, text-font=[Open Sans Regular, Arial Unicode MS Regular]}], [black, {text-color=rgba(0, 0, 0, 1), font-scale=2.0, text-font=[Open Sans Regular, Arial Unicode MS Regular]}]]\",\n      layer.textField?.toValue().toString()\n    )\n  }\n\n  @Test\n  @UiThreadTest\n  fun textFontTest() {\n    val testValue = listOf(\"a\", \"b\", \"c\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      textFont(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textFont?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textFontAsExpressionTest() {\n    val expression = array {\n      literal(\"string\")\n      get {\n        literal(\"array\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textFont(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textFontAsExpression.toString())\n    assertEquals(null, layer.textFont)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textIgnorePlacementTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      textIgnorePlacement(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textIgnorePlacement?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textIgnorePlacementAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textIgnorePlacement(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textIgnorePlacementAsExpression.toString())\n    assertEquals(true, layer.textIgnorePlacement!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textJustifyTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textJustify(TextJustify.AUTO)\n    }\n    setupLayer(layer)\n    assertEquals(TextJustify.AUTO, layer.textJustify)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textJustifyAsExpressionTest() {\n    val expression = toString {\n      get {\n        literal(\"enum\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textJustify(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textJustifyAsExpression.toString())\n    assertEquals(null, layer.textJustify)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textKeepUprightTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      textKeepUpright(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textKeepUpright?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textKeepUprightAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textKeepUpright(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textKeepUprightAsExpression.toString())\n    assertEquals(true, layer.textKeepUpright!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textLetterSpacingTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textLetterSpacing(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textLetterSpacing!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textLetterSpacingAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textLetterSpacing(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textLetterSpacingAsExpression.toString())\n    assertEquals(null, layer.textLetterSpacing)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textLineHeightTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textLineHeight(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textLineHeight!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textLineHeightAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textLineHeight(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textLineHeightAsExpression.toString())\n    assertEquals(null, layer.textLineHeight)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textMaxAngleTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textMaxAngle(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textMaxAngle!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textMaxAngleAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textMaxAngle(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.textMaxAngleAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textMaxAngle!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textMaxWidthTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textMaxWidth(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textMaxWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textMaxWidthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textMaxWidth(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textMaxWidthAsExpression.toString())\n    assertEquals(null, layer.textMaxWidth)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOffsetTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOffset(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textOffset?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOffsetAsExpressionTest() {\n    val expression = array {\n      literal(\"number\")\n      literal(2)\n      get {\n        literal(\"array\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOffset(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textOffsetAsExpression.toString())\n    assertEquals(null, layer.textOffset)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOptionalTest() {\n    val testValue = true\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOptional(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textOptional?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOptionalAsExpressionTest() {\n    val expression = literal(true)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOptional(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textOptionalAsExpression.toString())\n    assertEquals(true, layer.textOptional!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textPaddingTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textPadding(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textPadding!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textPaddingAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textPadding(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.textPaddingAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.textPadding!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textPitchAlignmentTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textPitchAlignment(TextPitchAlignment.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(TextPitchAlignment.MAP, layer.textPitchAlignment)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textPitchAlignmentAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      textPitchAlignment(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textPitchAlignmentAsExpression.toString())\n    assertEquals(TextPitchAlignment.MAP, layer.textPitchAlignment!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textRadialOffsetTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textRadialOffset(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textRadialOffset!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textRadialOffsetAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textRadialOffset(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textRadialOffsetAsExpression.toString())\n    assertEquals(null, layer.textRadialOffset)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textRotateTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textRotate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textRotate!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textRotateAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textRotate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textRotateAsExpression.toString())\n    assertEquals(null, layer.textRotate)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textRotationAlignmentTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textRotationAlignment(TextRotationAlignment.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(TextRotationAlignment.MAP, layer.textRotationAlignment)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textRotationAlignmentAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      textRotationAlignment(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textRotationAlignmentAsExpression.toString())\n    assertEquals(TextRotationAlignment.MAP, layer.textRotationAlignment!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textSizeTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textSize!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textSizeAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSize(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textSizeAsExpression.toString())\n    assertEquals(null, layer.textSize)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textSizeScaleRangeTest() {\n    val testValue = listOf(5.0, 5.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSizeScaleRange(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textSizeScaleRange?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textSizeScaleRangeAsExpressionTest() {\n    val expression = literal(listOf(5.0, 5.0))\n    val layer = symbolLayer(\"id\", \"source\") {\n      textSizeScaleRange(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textSizeScaleRangeAsExpression.toString())\n    assertEquals(listOf(5.0, 5.0), layer.textSizeScaleRange!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textTransformTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textTransform(TextTransform.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(TextTransform.NONE, layer.textTransform)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textTransformAsExpressionTest() {\n    val expression = toString {\n      get {\n        literal(\"enum\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textTransform(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textTransformAsExpression.toString())\n    assertEquals(null, layer.textTransform)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textVariableAnchorTest() {\n    val testValue = listOf(\"center\", \"left\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      textVariableAnchor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textVariableAnchor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textVariableAnchorAsExpressionTest() {\n    val expression = literal(listOf(\"center\", \"left\"))\n    val layer = symbolLayer(\"id\", \"source\") {\n      textVariableAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textVariableAnchorAsExpression.toString())\n    assertEquals(listOf(\"center\", \"left\"), layer.textVariableAnchor!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textWritingModeTest() {\n    val testValue = listOf(\"horizontal\", \"vertical\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      textWritingMode(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textWritingMode?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textWritingModeAsExpressionTest() {\n    val expression = literal(listOf(\"horizontal\", \"vertical\"))\n    val layer = symbolLayer(\"id\", \"source\") {\n      textWritingMode(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textWritingModeAsExpression.toString())\n    assertEquals(listOf(\"horizontal\", \"vertical\"), layer.textWritingMode!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconColorAsExpression.toString())\n    assertEquals(null, layer.iconColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.iconColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.iconColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorAsColorIntTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.iconColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorUseTheme() {\n    val theme = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.iconColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorBrightnessMaxTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorBrightnessMax(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconColorBrightnessMax!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorBrightnessMaxAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorBrightnessMax(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.iconColorBrightnessMaxAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconColorBrightnessMax!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorBrightnessMinTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorBrightnessMin(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconColorBrightnessMin!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorBrightnessMinAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorBrightnessMin(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.iconColorBrightnessMinAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconColorBrightnessMin!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorContrastTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorContrast(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconColorContrast!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorContrastAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorContrast(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.iconColorContrastAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconColorContrast!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorSaturationTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorSaturation(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconColorSaturation!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconColorSaturationAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorSaturation(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.iconColorSaturationAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconColorSaturation!!, 1E-5)\n  }\n\n  @Ignore(\"IconColorSaturation transition is not supported by the native engine\")\n  @Test\n  @UiThreadTest\n  fun iconColorSaturationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorSaturationTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconColorSaturationTransition)\n  }\n\n  @Ignore(\"IconColorSaturation transition is not supported by the native engine\")\n  @Test\n  @UiThreadTest\n  fun iconColorSaturationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconColorSaturationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconColorSaturationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconEmissiveStrengthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconEmissiveStrengthAsExpression.toString())\n    assertEquals(null, layer.iconEmissiveStrength)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloBlurTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloBlur(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconHaloBlur!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloBlurAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloBlur(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconHaloBlurAsExpression.toString())\n    assertEquals(null, layer.iconHaloBlur)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloBlurTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloBlurTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconHaloBlurTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloBlurTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloBlurTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconHaloBlurTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconHaloColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconHaloColorAsExpression.toString())\n    assertEquals(null, layer.iconHaloColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.iconHaloColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.iconHaloColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloColorAsColorIntTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.iconHaloColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloColorUseTheme() {\n    val theme = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.iconHaloColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconHaloColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconHaloColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloWidthTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloWidth(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconHaloWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloWidthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloWidth(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconHaloWidthAsExpression.toString())\n    assertEquals(null, layer.iconHaloWidth)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloWidthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconHaloWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconHaloWidthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconHaloWidthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconHaloWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconImageCrossFadeTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconImageCrossFade(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconImageCrossFade!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconImageCrossFadeAsExpressionTest() {\n    val expression = literal(1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconImageCrossFade(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(1.0, layer.iconImageCrossFadeAsExpression?.contents as Double, 1E-5)\n    assertEquals(1.0, layer.iconImageCrossFade!!, 1E-5)\n  }\n\n  @Ignore(\"IconImageCrossFade transition is not supported by the native engine\")\n  @Test\n  @UiThreadTest\n  fun iconImageCrossFadeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconImageCrossFadeTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconImageCrossFadeTransition)\n  }\n\n  @Ignore(\"IconImageCrossFade transition is not supported by the native engine\")\n  @Test\n  @UiThreadTest\n  fun iconImageCrossFadeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconImageCrossFadeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconImageCrossFadeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOcclusionOpacityTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOcclusionOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconOcclusionOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOcclusionOpacityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOcclusionOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconOcclusionOpacityAsExpression.toString())\n    assertEquals(null, layer.iconOcclusionOpacity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOcclusionOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOcclusionOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconOcclusionOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOcclusionOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOcclusionOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconOcclusionOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOpacityTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.iconOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOpacityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconOpacityAsExpression.toString())\n    assertEquals(null, layer.iconOpacity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTranslate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.iconTranslate?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTranslateAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTranslate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.iconTranslate!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTranslateTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTranslateTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTranslateTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.iconTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTranslateAnchorTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTranslateAnchor(IconTranslateAnchor.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(IconTranslateAnchor.MAP, layer.iconTranslateAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun iconTranslateAnchorAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      iconTranslateAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.iconTranslateAnchorAsExpression.toString())\n    assertEquals(IconTranslateAnchor.MAP, layer.iconTranslateAnchor!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun occlusionOpacityModeTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      occlusionOpacityMode(OcclusionOpacityMode.ANCHOR)\n    }\n    setupLayer(layer)\n    assertEquals(OcclusionOpacityMode.ANCHOR, layer.occlusionOpacityMode)\n  }\n\n  @Test\n  @UiThreadTest\n  fun occlusionOpacityModeAsExpressionTest() {\n    val expression = literal(\"anchor\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      occlusionOpacityMode(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.occlusionOpacityModeAsExpression.toString())\n    assertEquals(OcclusionOpacityMode.ANCHOR, layer.occlusionOpacityMode!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolZOffsetTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolZOffset(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.symbolZOffset!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolZOffsetAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolZOffset(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.symbolZOffsetAsExpression.toString())\n    assertEquals(null, layer.symbolZOffset)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolZOffsetTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolZOffsetTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.symbolZOffsetTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun symbolZOffsetTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      symbolZOffsetTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.symbolZOffsetTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textColorAsExpression.toString())\n    assertEquals(null, layer.textColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.textColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.textColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textColorAsColorIntTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.textColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textColorUseTheme() {\n    val theme = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.textColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textEmissiveStrengthTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textEmissiveStrength(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textEmissiveStrength!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textEmissiveStrengthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textEmissiveStrength(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textEmissiveStrengthAsExpression.toString())\n    assertEquals(null, layer.textEmissiveStrength)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textEmissiveStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textEmissiveStrengthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textEmissiveStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textEmissiveStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textEmissiveStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloBlurTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloBlur(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textHaloBlur!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloBlurAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloBlur(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textHaloBlurAsExpression.toString())\n    assertEquals(null, layer.textHaloBlur)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloBlurTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloBlurTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textHaloBlurTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloBlurTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloBlurTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textHaloBlurTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloColorTest() {\n    val testValue = \"rgba(0, 0, 0, 1)\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColor(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textHaloColor?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloColorAsExpressionTest() {\n    val expression = toColor {\n      get {\n        literal(\"color\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textHaloColorAsExpression.toString())\n    assertEquals(null, layer.textHaloColor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloColorUseThemeAsExpressionTest() {\n    val expression = literal(\"none\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColorUseTheme(expression)\n    }\n    setupLayer(layer)\n    assertEquals(expression.toString(), layer.textHaloColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloColorUseThemeStringAsExpressionTest() {\n    val testValue = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColorUseTheme(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(literal(testValue).toString(), layer.textHaloColorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloColorAsColorIntTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColor(Color.CYAN)\n    }\n    setupLayer(layer)\n    assertEquals(Color.CYAN, layer.textHaloColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloColorUseTheme() {\n    val theme = \"none\"\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColorUseTheme(theme)\n    }\n    setupLayer(layer)\n    assertEquals(theme, layer.textHaloColorUseTheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColorTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textHaloColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textHaloColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloWidthTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloWidth(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textHaloWidth!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloWidthAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloWidth(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textHaloWidthAsExpression.toString())\n    assertEquals(null, layer.textHaloWidth)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloWidthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloWidthTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textHaloWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textHaloWidthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textHaloWidthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textHaloWidthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOcclusionOpacityTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOcclusionOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textOcclusionOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOcclusionOpacityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOcclusionOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textOcclusionOpacityAsExpression.toString())\n    assertEquals(null, layer.textOcclusionOpacity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOcclusionOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOcclusionOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textOcclusionOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOcclusionOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOcclusionOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textOcclusionOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOpacityTest() {\n    val testValue = 1.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOpacity(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue, layer.textOpacity!!, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOpacityAsExpressionTest() {\n    val expression = number {\n      get {\n        literal(\"number\")\n      }\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOpacity(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textOpacityAsExpression.toString())\n    assertEquals(null, layer.textOpacity)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOpacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOpacityTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textOpacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textOpacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textOpacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textTranslateTest() {\n    val testValue = listOf(0.0, 1.0)\n    val layer = symbolLayer(\"id\", \"source\") {\n      textTranslate(testValue)\n    }\n    setupLayer(layer)\n    assertEquals(testValue.toString(), layer.textTranslate?.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun textTranslateAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n    val layer = symbolLayer(\"id\", \"source\") {\n      textTranslate(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textTranslateAsExpression.toString())\n    assertEquals(listOf(0.0, 1.0), layer.textTranslate!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textTranslateTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textTranslateTransition(transition)\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textTranslateTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val layer = symbolLayer(\"id\", \"source\") {\n      textTranslateTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLayer(layer)\n    assertEquals(transition, layer.textTranslateTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textTranslateAnchorTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      textTranslateAnchor(TextTranslateAnchor.MAP)\n    }\n    setupLayer(layer)\n    assertEquals(TextTranslateAnchor.MAP, layer.textTranslateAnchor)\n  }\n\n  @Test\n  @UiThreadTest\n  fun textTranslateAnchorAsExpressionTest() {\n    val expression = literal(\"map\")\n    val layer = symbolLayer(\"id\", \"source\") {\n      textTranslateAnchor(expression)\n    }\n    setupLayer(layer)\n\n    assertEquals(expression.toString(), layer.textTranslateAnchorAsExpression.toString())\n    assertEquals(TextTranslateAnchor.MAP, layer.textTranslateAnchor!!)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      visibility(Visibility.NONE)\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  @Test\n  @UiThreadTest\n  fun visibilityAsExpressionTest() {\n    val layer = symbolLayer(\"id\", \"source\") {\n      visibility(\n        concat {\n          literal(\"no\")\n          literal(\"ne\")\n        }\n      )\n    }\n    setupLayer(layer)\n    assertEquals(Visibility.NONE, layer.visibility)\n  }\n\n  // Default property getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultLayerPropertiesTest() {\n    assertNotNull(\"defaultVisibility should not be null\", SymbolLayer.defaultVisibility)\n    assertNotNull(\"defaultMinZoom should not be null\", SymbolLayer.defaultMinZoom)\n    assertNotNull(\"defaultMaxZoom should not be null\", SymbolLayer.defaultMaxZoom)\n    assertNotNull(\"defaultIconAllowOverlap should not be null\", SymbolLayer.defaultIconAllowOverlap)\n    assertNotNull(\"defaultIconAllowOverlapAsExpression should not be null\", SymbolLayer.defaultIconAllowOverlapAsExpression)\n    assertNotNull(\"defaultIconAnchor should not be null\", SymbolLayer.defaultIconAnchor)\n    assertNotNull(\"defaultIconAnchorAsExpression should not be null\", SymbolLayer.defaultIconAnchorAsExpression)\n    assertNotNull(\"defaultIconIgnorePlacement should not be null\", SymbolLayer.defaultIconIgnorePlacement)\n    assertNotNull(\"defaultIconIgnorePlacementAsExpression should not be null\", SymbolLayer.defaultIconIgnorePlacementAsExpression)\n    assertNotNull(\"defaultIconImage should not be null\", SymbolLayer.defaultIconImage)\n    assertNotNull(\"defaultIconImageAsExpression should not be null\", SymbolLayer.defaultIconImageAsExpression)\n    assertNotNull(\"defaultIconKeepUpright should not be null\", SymbolLayer.defaultIconKeepUpright)\n    assertNotNull(\"defaultIconKeepUprightAsExpression should not be null\", SymbolLayer.defaultIconKeepUprightAsExpression)\n    assertNotNull(\"defaultIconOffset should not be null\", SymbolLayer.defaultIconOffset)\n    assertNotNull(\"defaultIconOffsetAsExpression should not be null\", SymbolLayer.defaultIconOffsetAsExpression)\n    assertNotNull(\"defaultIconOptional should not be null\", SymbolLayer.defaultIconOptional)\n    assertNotNull(\"defaultIconOptionalAsExpression should not be null\", SymbolLayer.defaultIconOptionalAsExpression)\n    assertNotNull(\"defaultIconPadding should not be null\", SymbolLayer.defaultIconPadding)\n    assertNotNull(\"defaultIconPaddingAsExpression should not be null\", SymbolLayer.defaultIconPaddingAsExpression)\n    assertNotNull(\"defaultIconPitchAlignment should not be null\", SymbolLayer.defaultIconPitchAlignment)\n    assertNotNull(\"defaultIconPitchAlignmentAsExpression should not be null\", SymbolLayer.defaultIconPitchAlignmentAsExpression)\n    assertNotNull(\"defaultIconRotate should not be null\", SymbolLayer.defaultIconRotate)\n    assertNotNull(\"defaultIconRotateAsExpression should not be null\", SymbolLayer.defaultIconRotateAsExpression)\n    assertNotNull(\"defaultIconRotationAlignment should not be null\", SymbolLayer.defaultIconRotationAlignment)\n    assertNotNull(\"defaultIconRotationAlignmentAsExpression should not be null\", SymbolLayer.defaultIconRotationAlignmentAsExpression)\n    assertNotNull(\"defaultIconSize should not be null\", SymbolLayer.defaultIconSize)\n    assertNotNull(\"defaultIconSizeAsExpression should not be null\", SymbolLayer.defaultIconSizeAsExpression)\n    assertNotNull(\"defaultIconSizeScaleRange should not be null\", SymbolLayer.defaultIconSizeScaleRange)\n    assertNotNull(\"defaultIconSizeScaleRangeAsExpression should not be null\", SymbolLayer.defaultIconSizeScaleRangeAsExpression)\n    assertNotNull(\"defaultIconTextFit should not be null\", SymbolLayer.defaultIconTextFit)\n    assertNotNull(\"defaultIconTextFitAsExpression should not be null\", SymbolLayer.defaultIconTextFitAsExpression)\n    assertNotNull(\"defaultIconTextFitPadding should not be null\", SymbolLayer.defaultIconTextFitPadding)\n    assertNotNull(\"defaultIconTextFitPaddingAsExpression should not be null\", SymbolLayer.defaultIconTextFitPaddingAsExpression)\n    assertNotNull(\"defaultSymbolAvoidEdges should not be null\", SymbolLayer.defaultSymbolAvoidEdges)\n    assertNotNull(\"defaultSymbolAvoidEdgesAsExpression should not be null\", SymbolLayer.defaultSymbolAvoidEdgesAsExpression)\n    assertNotNull(\"defaultSymbolElevationReference should not be null\", SymbolLayer.defaultSymbolElevationReference)\n    assertNotNull(\"defaultSymbolElevationReferenceAsExpression should not be null\", SymbolLayer.defaultSymbolElevationReferenceAsExpression)\n    assertNotNull(\"defaultSymbolPlacement should not be null\", SymbolLayer.defaultSymbolPlacement)\n    assertNotNull(\"defaultSymbolPlacementAsExpression should not be null\", SymbolLayer.defaultSymbolPlacementAsExpression)\n    assertNotNull(\"defaultSymbolSortKey should not be null\", SymbolLayer.defaultSymbolSortKey)\n    assertNotNull(\"defaultSymbolSortKeyAsExpression should not be null\", SymbolLayer.defaultSymbolSortKeyAsExpression)\n    assertNotNull(\"defaultSymbolSpacing should not be null\", SymbolLayer.defaultSymbolSpacing)\n    assertNotNull(\"defaultSymbolSpacingAsExpression should not be null\", SymbolLayer.defaultSymbolSpacingAsExpression)\n    assertNotNull(\"defaultSymbolZElevate should not be null\", SymbolLayer.defaultSymbolZElevate)\n    assertNotNull(\"defaultSymbolZElevateAsExpression should not be null\", SymbolLayer.defaultSymbolZElevateAsExpression)\n    assertNotNull(\"defaultSymbolZOrder should not be null\", SymbolLayer.defaultSymbolZOrder)\n    assertNotNull(\"defaultSymbolZOrderAsExpression should not be null\", SymbolLayer.defaultSymbolZOrderAsExpression)\n    assertNotNull(\"defaultTextAllowOverlap should not be null\", SymbolLayer.defaultTextAllowOverlap)\n    assertNotNull(\"defaultTextAllowOverlapAsExpression should not be null\", SymbolLayer.defaultTextAllowOverlapAsExpression)\n    assertNotNull(\"defaultTextAnchor should not be null\", SymbolLayer.defaultTextAnchor)\n    assertNotNull(\"defaultTextAnchorAsExpression should not be null\", SymbolLayer.defaultTextAnchorAsExpression)\n    assertNotNull(\"defaultTextField should not be null\", SymbolLayer.defaultTextField)\n    assertNotNull(\"defaultTextFieldAsExpression should not be null\", SymbolLayer.defaultTextFieldAsExpression)\n    assertNotNull(\"defaultTextFieldAsString should not be null\", SymbolLayer.defaultTextFieldAsString)\n    assertNotNull(\"defaultTextFont should not be null\", SymbolLayer.defaultTextFont)\n    assertNotNull(\"defaultTextFontAsExpression should not be null\", SymbolLayer.defaultTextFontAsExpression)\n    assertNotNull(\"defaultTextIgnorePlacement should not be null\", SymbolLayer.defaultTextIgnorePlacement)\n    assertNotNull(\"defaultTextIgnorePlacementAsExpression should not be null\", SymbolLayer.defaultTextIgnorePlacementAsExpression)\n    assertNotNull(\"defaultTextJustify should not be null\", SymbolLayer.defaultTextJustify)\n    assertNotNull(\"defaultTextJustifyAsExpression should not be null\", SymbolLayer.defaultTextJustifyAsExpression)\n    assertNotNull(\"defaultTextKeepUpright should not be null\", SymbolLayer.defaultTextKeepUpright)\n    assertNotNull(\"defaultTextKeepUprightAsExpression should not be null\", SymbolLayer.defaultTextKeepUprightAsExpression)\n    assertNotNull(\"defaultTextLetterSpacing should not be null\", SymbolLayer.defaultTextLetterSpacing)\n    assertNotNull(\"defaultTextLetterSpacingAsExpression should not be null\", SymbolLayer.defaultTextLetterSpacingAsExpression)\n    assertNotNull(\"defaultTextLineHeight should not be null\", SymbolLayer.defaultTextLineHeight)\n    assertNotNull(\"defaultTextLineHeightAsExpression should not be null\", SymbolLayer.defaultTextLineHeightAsExpression)\n    assertNotNull(\"defaultTextMaxAngle should not be null\", SymbolLayer.defaultTextMaxAngle)\n    assertNotNull(\"defaultTextMaxAngleAsExpression should not be null\", SymbolLayer.defaultTextMaxAngleAsExpression)\n    assertNotNull(\"defaultTextMaxWidth should not be null\", SymbolLayer.defaultTextMaxWidth)\n    assertNotNull(\"defaultTextMaxWidthAsExpression should not be null\", SymbolLayer.defaultTextMaxWidthAsExpression)\n    assertNotNull(\"defaultTextOffset should not be null\", SymbolLayer.defaultTextOffset)\n    assertNotNull(\"defaultTextOffsetAsExpression should not be null\", SymbolLayer.defaultTextOffsetAsExpression)\n    assertNotNull(\"defaultTextOptional should not be null\", SymbolLayer.defaultTextOptional)\n    assertNotNull(\"defaultTextOptionalAsExpression should not be null\", SymbolLayer.defaultTextOptionalAsExpression)\n    assertNotNull(\"defaultTextPadding should not be null\", SymbolLayer.defaultTextPadding)\n    assertNotNull(\"defaultTextPaddingAsExpression should not be null\", SymbolLayer.defaultTextPaddingAsExpression)\n    assertNotNull(\"defaultTextPitchAlignment should not be null\", SymbolLayer.defaultTextPitchAlignment)\n    assertNotNull(\"defaultTextPitchAlignmentAsExpression should not be null\", SymbolLayer.defaultTextPitchAlignmentAsExpression)\n    assertNotNull(\"defaultTextRadialOffset should not be null\", SymbolLayer.defaultTextRadialOffset)\n    assertNotNull(\"defaultTextRadialOffsetAsExpression should not be null\", SymbolLayer.defaultTextRadialOffsetAsExpression)\n    assertNotNull(\"defaultTextRotate should not be null\", SymbolLayer.defaultTextRotate)\n    assertNotNull(\"defaultTextRotateAsExpression should not be null\", SymbolLayer.defaultTextRotateAsExpression)\n    assertNotNull(\"defaultTextRotationAlignment should not be null\", SymbolLayer.defaultTextRotationAlignment)\n    assertNotNull(\"defaultTextRotationAlignmentAsExpression should not be null\", SymbolLayer.defaultTextRotationAlignmentAsExpression)\n    assertNotNull(\"defaultTextSize should not be null\", SymbolLayer.defaultTextSize)\n    assertNotNull(\"defaultTextSizeAsExpression should not be null\", SymbolLayer.defaultTextSizeAsExpression)\n    assertNotNull(\"defaultTextSizeScaleRange should not be null\", SymbolLayer.defaultTextSizeScaleRange)\n    assertNotNull(\"defaultTextSizeScaleRangeAsExpression should not be null\", SymbolLayer.defaultTextSizeScaleRangeAsExpression)\n    assertNotNull(\"defaultTextTransform should not be null\", SymbolLayer.defaultTextTransform)\n    assertNotNull(\"defaultTextTransformAsExpression should not be null\", SymbolLayer.defaultTextTransformAsExpression)\n    assertNotNull(\"defaultTextVariableAnchor should not be null\", SymbolLayer.defaultTextVariableAnchor)\n    assertNotNull(\"defaultTextVariableAnchorAsExpression should not be null\", SymbolLayer.defaultTextVariableAnchorAsExpression)\n    assertNotNull(\"defaultTextWritingMode should not be null\", SymbolLayer.defaultTextWritingMode)\n    assertNotNull(\"defaultTextWritingModeAsExpression should not be null\", SymbolLayer.defaultTextWritingModeAsExpression)\n    assertNotNull(\"defaultIconColor should not be null\", SymbolLayer.defaultIconColor)\n    assertNotNull(\"defaultIconColorAsExpression should not be null\", SymbolLayer.defaultIconColorAsExpression)\n    assertNotNull(\"defaultIconColorAsColorInt should not be null\", SymbolLayer.defaultIconColorAsColorInt)\n    assertNotNull(\"defaultIconColorUseTheme should not be null\", SymbolLayer.defaultIconColorUseTheme)\n    assertNotNull(\"defaultIconColorUseThemeAsExpression should not be null\", SymbolLayer.defaultIconColorUseThemeAsExpression)\n    assertNotNull(\"defaultIconColorTransition should not be null\", SymbolLayer.defaultIconColorTransition)\n    assertNotNull(\"defaultIconColorBrightnessMax should not be null\", SymbolLayer.defaultIconColorBrightnessMax)\n    assertNotNull(\"defaultIconColorBrightnessMaxAsExpression should not be null\", SymbolLayer.defaultIconColorBrightnessMaxAsExpression)\n    assertNotNull(\"defaultIconColorBrightnessMin should not be null\", SymbolLayer.defaultIconColorBrightnessMin)\n    assertNotNull(\"defaultIconColorBrightnessMinAsExpression should not be null\", SymbolLayer.defaultIconColorBrightnessMinAsExpression)\n    assertNotNull(\"defaultIconColorContrast should not be null\", SymbolLayer.defaultIconColorContrast)\n    assertNotNull(\"defaultIconColorContrastAsExpression should not be null\", SymbolLayer.defaultIconColorContrastAsExpression)\n    assertNotNull(\"defaultIconColorSaturation should not be null\", SymbolLayer.defaultIconColorSaturation)\n    assertNotNull(\"defaultIconColorSaturationAsExpression should not be null\", SymbolLayer.defaultIconColorSaturationAsExpression)\n    // IconColorSaturation transition is not supported by the native engine\n    // assertNotNull(\"defaultIconColorSaturationTransition should not be null\", SymbolLayer.defaultIconColorSaturationTransition)\n    assertNotNull(\"defaultIconEmissiveStrength should not be null\", SymbolLayer.defaultIconEmissiveStrength)\n    assertNotNull(\"defaultIconEmissiveStrengthAsExpression should not be null\", SymbolLayer.defaultIconEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultIconEmissiveStrengthTransition should not be null\", SymbolLayer.defaultIconEmissiveStrengthTransition)\n    assertNotNull(\"defaultIconHaloBlur should not be null\", SymbolLayer.defaultIconHaloBlur)\n    assertNotNull(\"defaultIconHaloBlurAsExpression should not be null\", SymbolLayer.defaultIconHaloBlurAsExpression)\n    assertNotNull(\"defaultIconHaloBlurTransition should not be null\", SymbolLayer.defaultIconHaloBlurTransition)\n    assertNotNull(\"defaultIconHaloColor should not be null\", SymbolLayer.defaultIconHaloColor)\n    assertNotNull(\"defaultIconHaloColorAsExpression should not be null\", SymbolLayer.defaultIconHaloColorAsExpression)\n    assertNotNull(\"defaultIconHaloColorAsColorInt should not be null\", SymbolLayer.defaultIconHaloColorAsColorInt)\n    assertNotNull(\"defaultIconHaloColorUseTheme should not be null\", SymbolLayer.defaultIconHaloColorUseTheme)\n    assertNotNull(\"defaultIconHaloColorUseThemeAsExpression should not be null\", SymbolLayer.defaultIconHaloColorUseThemeAsExpression)\n    assertNotNull(\"defaultIconHaloColorTransition should not be null\", SymbolLayer.defaultIconHaloColorTransition)\n    assertNotNull(\"defaultIconHaloWidth should not be null\", SymbolLayer.defaultIconHaloWidth)\n    assertNotNull(\"defaultIconHaloWidthAsExpression should not be null\", SymbolLayer.defaultIconHaloWidthAsExpression)\n    assertNotNull(\"defaultIconHaloWidthTransition should not be null\", SymbolLayer.defaultIconHaloWidthTransition)\n    assertNotNull(\"defaultIconImageCrossFade should not be null\", SymbolLayer.defaultIconImageCrossFade)\n    assertNotNull(\"defaultIconImageCrossFadeAsExpression should not be null\", SymbolLayer.defaultIconImageCrossFadeAsExpression)\n    // IconImageCrossFade transition is not supported by the native engine\n    // assertNotNull(\"defaultIconImageCrossFadeTransition should not be null\", SymbolLayer.defaultIconImageCrossFadeTransition)\n    assertNotNull(\"defaultIconOcclusionOpacity should not be null\", SymbolLayer.defaultIconOcclusionOpacity)\n    assertNotNull(\"defaultIconOcclusionOpacityAsExpression should not be null\", SymbolLayer.defaultIconOcclusionOpacityAsExpression)\n    assertNotNull(\"defaultIconOcclusionOpacityTransition should not be null\", SymbolLayer.defaultIconOcclusionOpacityTransition)\n    assertNotNull(\"defaultIconOpacity should not be null\", SymbolLayer.defaultIconOpacity)\n    assertNotNull(\"defaultIconOpacityAsExpression should not be null\", SymbolLayer.defaultIconOpacityAsExpression)\n    assertNotNull(\"defaultIconOpacityTransition should not be null\", SymbolLayer.defaultIconOpacityTransition)\n    assertNotNull(\"defaultIconTranslate should not be null\", SymbolLayer.defaultIconTranslate)\n    assertNotNull(\"defaultIconTranslateAsExpression should not be null\", SymbolLayer.defaultIconTranslateAsExpression)\n    assertNotNull(\"defaultIconTranslateTransition should not be null\", SymbolLayer.defaultIconTranslateTransition)\n    assertNotNull(\"defaultIconTranslateAnchor should not be null\", SymbolLayer.defaultIconTranslateAnchor)\n    assertNotNull(\"defaultIconTranslateAnchorAsExpression should not be null\", SymbolLayer.defaultIconTranslateAnchorAsExpression)\n    assertNotNull(\"defaultOcclusionOpacityMode should not be null\", SymbolLayer.defaultOcclusionOpacityMode)\n    assertNotNull(\"defaultOcclusionOpacityModeAsExpression should not be null\", SymbolLayer.defaultOcclusionOpacityModeAsExpression)\n    assertNotNull(\"defaultSymbolZOffset should not be null\", SymbolLayer.defaultSymbolZOffset)\n    assertNotNull(\"defaultSymbolZOffsetAsExpression should not be null\", SymbolLayer.defaultSymbolZOffsetAsExpression)\n    assertNotNull(\"defaultSymbolZOffsetTransition should not be null\", SymbolLayer.defaultSymbolZOffsetTransition)\n    assertNotNull(\"defaultTextColor should not be null\", SymbolLayer.defaultTextColor)\n    assertNotNull(\"defaultTextColorAsExpression should not be null\", SymbolLayer.defaultTextColorAsExpression)\n    assertNotNull(\"defaultTextColorAsColorInt should not be null\", SymbolLayer.defaultTextColorAsColorInt)\n    assertNotNull(\"defaultTextColorUseTheme should not be null\", SymbolLayer.defaultTextColorUseTheme)\n    assertNotNull(\"defaultTextColorUseThemeAsExpression should not be null\", SymbolLayer.defaultTextColorUseThemeAsExpression)\n    assertNotNull(\"defaultTextColorTransition should not be null\", SymbolLayer.defaultTextColorTransition)\n    assertNotNull(\"defaultTextEmissiveStrength should not be null\", SymbolLayer.defaultTextEmissiveStrength)\n    assertNotNull(\"defaultTextEmissiveStrengthAsExpression should not be null\", SymbolLayer.defaultTextEmissiveStrengthAsExpression)\n    assertNotNull(\"defaultTextEmissiveStrengthTransition should not be null\", SymbolLayer.defaultTextEmissiveStrengthTransition)\n    assertNotNull(\"defaultTextHaloBlur should not be null\", SymbolLayer.defaultTextHaloBlur)\n    assertNotNull(\"defaultTextHaloBlurAsExpression should not be null\", SymbolLayer.defaultTextHaloBlurAsExpression)\n    assertNotNull(\"defaultTextHaloBlurTransition should not be null\", SymbolLayer.defaultTextHaloBlurTransition)\n    assertNotNull(\"defaultTextHaloColor should not be null\", SymbolLayer.defaultTextHaloColor)\n    assertNotNull(\"defaultTextHaloColorAsExpression should not be null\", SymbolLayer.defaultTextHaloColorAsExpression)\n    assertNotNull(\"defaultTextHaloColorAsColorInt should not be null\", SymbolLayer.defaultTextHaloColorAsColorInt)\n    assertNotNull(\"defaultTextHaloColorUseTheme should not be null\", SymbolLayer.defaultTextHaloColorUseTheme)\n    assertNotNull(\"defaultTextHaloColorUseThemeAsExpression should not be null\", SymbolLayer.defaultTextHaloColorUseThemeAsExpression)\n    assertNotNull(\"defaultTextHaloColorTransition should not be null\", SymbolLayer.defaultTextHaloColorTransition)\n    assertNotNull(\"defaultTextHaloWidth should not be null\", SymbolLayer.defaultTextHaloWidth)\n    assertNotNull(\"defaultTextHaloWidthAsExpression should not be null\", SymbolLayer.defaultTextHaloWidthAsExpression)\n    assertNotNull(\"defaultTextHaloWidthTransition should not be null\", SymbolLayer.defaultTextHaloWidthTransition)\n    assertNotNull(\"defaultTextOcclusionOpacity should not be null\", SymbolLayer.defaultTextOcclusionOpacity)\n    assertNotNull(\"defaultTextOcclusionOpacityAsExpression should not be null\", SymbolLayer.defaultTextOcclusionOpacityAsExpression)\n    assertNotNull(\"defaultTextOcclusionOpacityTransition should not be null\", SymbolLayer.defaultTextOcclusionOpacityTransition)\n    assertNotNull(\"defaultTextOpacity should not be null\", SymbolLayer.defaultTextOpacity)\n    assertNotNull(\"defaultTextOpacityAsExpression should not be null\", SymbolLayer.defaultTextOpacityAsExpression)\n    assertNotNull(\"defaultTextOpacityTransition should not be null\", SymbolLayer.defaultTextOpacityTransition)\n    assertNotNull(\"defaultTextTranslate should not be null\", SymbolLayer.defaultTextTranslate)\n    assertNotNull(\"defaultTextTranslateAsExpression should not be null\", SymbolLayer.defaultTextTranslateAsExpression)\n    assertNotNull(\"defaultTextTranslateTransition should not be null\", SymbolLayer.defaultTextTranslateTransition)\n    assertNotNull(\"defaultTextTranslateAnchor should not be null\", SymbolLayer.defaultTextTranslateAnchor)\n    assertNotNull(\"defaultTextTranslateAnchorAsExpression should not be null\", SymbolLayer.defaultTextTranslateAnchorAsExpression)\n  }\n\n  @Test\n  @UiThreadTest\n  fun getLayerTest() {\n    val filterTestValue = eq {\n      get {\n        literal(\"undefined\")\n      }\n      literal(1.0)\n    }\n    val iconAllowOverlapTestValue = true\n    val iconAnchorTestValue = IconAnchor.CENTER\n    val iconIgnorePlacementTestValue = true\n    val iconImageTestValue = \"abc\"\n    val iconKeepUprightTestValue = true\n    val iconOffsetTestValue = listOf(0.0, 1.0)\n    val iconOptionalTestValue = true\n    val iconPaddingTestValue = 1.0\n    val iconPitchAlignmentTestValue = IconPitchAlignment.MAP\n    val iconRotateTestValue = 1.0\n    val iconRotationAlignmentTestValue = IconRotationAlignment.MAP\n    val iconSizeTestValue = 1.0\n    val iconSizeScaleRangeTestValue = listOf(5.0, 5.0)\n    val iconTextFitTestValue = IconTextFit.NONE\n    val iconTextFitPaddingTestValue = listOf(0.0, 1.0, 2.0, 3.0)\n    val symbolAvoidEdgesTestValue = true\n    val symbolElevationReferenceTestValue = SymbolElevationReference.SEA\n    val symbolPlacementTestValue = SymbolPlacement.POINT\n    val symbolSortKeyTestValue = 1.0\n    val symbolSpacingTestValue = 1.0\n    val symbolZElevateTestValue = true\n    val symbolZOrderTestValue = SymbolZOrder.AUTO\n    val textAllowOverlapTestValue = true\n    val textAnchorTestValue = TextAnchor.CENTER\n    val textFieldTestValue = formatted {\n      formattedSection(\"cyan\") {\n        fontScale = 0.9\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColorAsInt = Color.CYAN\n      }\n      formattedSection(\"black\") {\n        fontScale = 2.0\n        fontStack = listOf(\n          \"Open Sans Regular\",\n          \"Arial Unicode MS Regular\"\n        )\n        textColor = \"rgba(0, 0, 0, 1)\"\n      }\n    }\n    val textFontTestValue = listOf(\"a\", \"b\", \"c\")\n    val textIgnorePlacementTestValue = true\n    val textJustifyTestValue = TextJustify.AUTO\n    val textKeepUprightTestValue = true\n    val textLetterSpacingTestValue = 1.0\n    val textLineHeightTestValue = 1.0\n    val textMaxAngleTestValue = 1.0\n    val textMaxWidthTestValue = 1.0\n    val textOffsetTestValue = listOf(0.0, 1.0)\n    val textOptionalTestValue = true\n    val textPaddingTestValue = 1.0\n    val textPitchAlignmentTestValue = TextPitchAlignment.MAP\n    val textRadialOffsetTestValue = 1.0\n    val textRotateTestValue = 1.0\n    val textRotationAlignmentTestValue = TextRotationAlignment.MAP\n    val textSizeTestValue = 1.0\n    val textSizeScaleRangeTestValue = listOf(5.0, 5.0)\n    val textTransformTestValue = TextTransform.NONE\n    val textVariableAnchorTestValue = listOf(\"center\", \"left\")\n    val textWritingModeTestValue = listOf(\"horizontal\", \"vertical\")\n    val iconColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val iconColorUseThemeTestValue = \"default\"\n    val iconColorBrightnessMaxTestValue = 1.0\n    val iconColorBrightnessMinTestValue = 1.0\n    val iconColorContrastTestValue = 1.0\n    val iconColorSaturationTestValue = 1.0\n    val iconEmissiveStrengthTestValue = 1.0\n    val iconHaloBlurTestValue = 1.0\n    val iconHaloColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val iconHaloColorUseThemeTestValue = \"default\"\n    val iconHaloWidthTestValue = 1.0\n    val iconImageCrossFadeTestValue = 1.0\n    val iconOcclusionOpacityTestValue = 1.0\n    val iconOpacityTestValue = 1.0\n    val iconTranslateTestValue = listOf(0.0, 1.0)\n    val iconTranslateAnchorTestValue = IconTranslateAnchor.MAP\n    val occlusionOpacityModeTestValue = OcclusionOpacityMode.ANCHOR\n    val symbolZOffsetTestValue = 1.0\n    val textColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val textColorUseThemeTestValue = \"default\"\n    val textEmissiveStrengthTestValue = 1.0\n    val textHaloBlurTestValue = 1.0\n    val textHaloColorTestValue = \"rgba(0, 0, 0, 1)\"\n    val textHaloColorUseThemeTestValue = \"default\"\n    val textHaloWidthTestValue = 1.0\n    val textOcclusionOpacityTestValue = 1.0\n    val textOpacityTestValue = 1.0\n    val textTranslateTestValue = listOf(0.0, 1.0)\n    val textTranslateAnchorTestValue = TextTranslateAnchor.MAP\n\n    val minZoomTestValue = 10.0\n    val maxZoomTestValue = 20.0\n    val layer = symbolLayer(\"id\", \"source\") {\n      sourceLayer(\"test\")\n      minZoom(minZoomTestValue)\n      maxZoom(maxZoomTestValue)\n      filter(filterTestValue)\n      iconAllowOverlap(iconAllowOverlapTestValue)\n      iconAnchor(iconAnchorTestValue)\n      iconIgnorePlacement(iconIgnorePlacementTestValue)\n      iconImage(iconImageTestValue)\n      iconKeepUpright(iconKeepUprightTestValue)\n      iconOffset(iconOffsetTestValue)\n      iconOptional(iconOptionalTestValue)\n      iconPadding(iconPaddingTestValue)\n      iconPitchAlignment(iconPitchAlignmentTestValue)\n      iconRotate(iconRotateTestValue)\n      iconRotationAlignment(iconRotationAlignmentTestValue)\n      iconSize(iconSizeTestValue)\n      iconSizeScaleRange(iconSizeScaleRangeTestValue)\n      iconTextFit(iconTextFitTestValue)\n      iconTextFitPadding(iconTextFitPaddingTestValue)\n      symbolAvoidEdges(symbolAvoidEdgesTestValue)\n      symbolElevationReference(symbolElevationReferenceTestValue)\n      symbolPlacement(symbolPlacementTestValue)\n      symbolSortKey(symbolSortKeyTestValue)\n      symbolSpacing(symbolSpacingTestValue)\n      symbolZElevate(symbolZElevateTestValue)\n      symbolZOrder(symbolZOrderTestValue)\n      textAllowOverlap(textAllowOverlapTestValue)\n      textAnchor(textAnchorTestValue)\n      textField(textFieldTestValue)\n      textFont(textFontTestValue)\n      textIgnorePlacement(textIgnorePlacementTestValue)\n      textJustify(textJustifyTestValue)\n      textKeepUpright(textKeepUprightTestValue)\n      textLetterSpacing(textLetterSpacingTestValue)\n      textLineHeight(textLineHeightTestValue)\n      textMaxAngle(textMaxAngleTestValue)\n      textMaxWidth(textMaxWidthTestValue)\n      textOffset(textOffsetTestValue)\n      textOptional(textOptionalTestValue)\n      textPadding(textPaddingTestValue)\n      textPitchAlignment(textPitchAlignmentTestValue)\n      textRadialOffset(textRadialOffsetTestValue)\n      textRotate(textRotateTestValue)\n      textRotationAlignment(textRotationAlignmentTestValue)\n      textSize(textSizeTestValue)\n      textSizeScaleRange(textSizeScaleRangeTestValue)\n      textTransform(textTransformTestValue)\n      textVariableAnchor(textVariableAnchorTestValue)\n      textWritingMode(textWritingModeTestValue)\n      iconColor(iconColorTestValue)\n      iconColorUseTheme(iconColorUseThemeTestValue)\n      iconColorBrightnessMax(iconColorBrightnessMaxTestValue)\n      iconColorBrightnessMin(iconColorBrightnessMinTestValue)\n      iconColorContrast(iconColorContrastTestValue)\n      iconColorSaturation(iconColorSaturationTestValue)\n      iconEmissiveStrength(iconEmissiveStrengthTestValue)\n      iconHaloBlur(iconHaloBlurTestValue)\n      iconHaloColor(iconHaloColorTestValue)\n      iconHaloColorUseTheme(iconHaloColorUseThemeTestValue)\n      iconHaloWidth(iconHaloWidthTestValue)\n      iconImageCrossFade(iconImageCrossFadeTestValue)\n      iconOcclusionOpacity(iconOcclusionOpacityTestValue)\n      iconOpacity(iconOpacityTestValue)\n      iconTranslate(iconTranslateTestValue)\n      iconTranslateAnchor(iconTranslateAnchorTestValue)\n      occlusionOpacityMode(occlusionOpacityModeTestValue)\n      symbolZOffset(symbolZOffsetTestValue)\n      textColor(textColorTestValue)\n      textColorUseTheme(textColorUseThemeTestValue)\n      textEmissiveStrength(textEmissiveStrengthTestValue)\n      textHaloBlur(textHaloBlurTestValue)\n      textHaloColor(textHaloColorTestValue)\n      textHaloColorUseTheme(textHaloColorUseThemeTestValue)\n      textHaloWidth(textHaloWidthTestValue)\n      textOcclusionOpacity(textOcclusionOpacityTestValue)\n      textOpacity(textOpacityTestValue)\n      textTranslate(textTranslateTestValue)\n      textTranslateAnchor(textTranslateAnchorTestValue)\n    }\n\n    setupLayer(layer)\n\n    val cachedLayer = getLayer(\"id\") as SymbolLayer\n\n    removeLayer(layer)\n    setupLayer(cachedLayer)\n\n    assertEquals(\"test\", cachedLayer.sourceLayer)\n    assertEquals(minZoomTestValue, cachedLayer.minZoom)\n    assertEquals(maxZoomTestValue, cachedLayer.maxZoom)\n    assertEquals(filterTestValue.toString(), cachedLayer.filter.toString())\n    assertEquals(iconAllowOverlapTestValue, cachedLayer.iconAllowOverlap)\n    assertEquals(iconAnchorTestValue, cachedLayer.iconAnchor)\n    assertEquals(iconIgnorePlacementTestValue, cachedLayer.iconIgnorePlacement)\n    assertEquals(iconImageTestValue, cachedLayer.iconImage)\n    assertEquals(iconKeepUprightTestValue, cachedLayer.iconKeepUpright)\n    assertEquals(iconOffsetTestValue, cachedLayer.iconOffset)\n    assertEquals(iconOptionalTestValue, cachedLayer.iconOptional)\n    assertEquals(iconPaddingTestValue, cachedLayer.iconPadding)\n    assertEquals(iconPitchAlignmentTestValue, cachedLayer.iconPitchAlignment)\n    assertEquals(iconRotateTestValue, cachedLayer.iconRotate)\n    assertEquals(iconRotationAlignmentTestValue, cachedLayer.iconRotationAlignment)\n    assertEquals(iconSizeTestValue, cachedLayer.iconSize)\n    assertEquals(iconSizeScaleRangeTestValue, cachedLayer.iconSizeScaleRange)\n    assertEquals(iconTextFitTestValue, cachedLayer.iconTextFit)\n    assertEquals(iconTextFitPaddingTestValue, cachedLayer.iconTextFitPadding)\n    assertEquals(symbolAvoidEdgesTestValue, cachedLayer.symbolAvoidEdges)\n    assertEquals(symbolElevationReferenceTestValue, cachedLayer.symbolElevationReference)\n    assertEquals(symbolPlacementTestValue, cachedLayer.symbolPlacement)\n    assertEquals(symbolSortKeyTestValue, cachedLayer.symbolSortKey)\n    assertEquals(symbolSpacingTestValue, cachedLayer.symbolSpacing)\n    assertEquals(symbolZElevateTestValue, cachedLayer.symbolZElevate)\n    assertEquals(symbolZOrderTestValue, cachedLayer.symbolZOrder)\n    assertEquals(textAllowOverlapTestValue, cachedLayer.textAllowOverlap)\n    assertEquals(textAnchorTestValue, cachedLayer.textAnchor)\n    assertEquals(textFieldTestValue, cachedLayer.textField)\n    assertEquals(textFontTestValue, cachedLayer.textFont)\n    assertEquals(textIgnorePlacementTestValue, cachedLayer.textIgnorePlacement)\n    assertEquals(textJustifyTestValue, cachedLayer.textJustify)\n    assertEquals(textKeepUprightTestValue, cachedLayer.textKeepUpright)\n    assertEquals(textLetterSpacingTestValue, cachedLayer.textLetterSpacing)\n    assertEquals(textLineHeightTestValue, cachedLayer.textLineHeight)\n    assertEquals(textMaxAngleTestValue, cachedLayer.textMaxAngle)\n    assertEquals(textMaxWidthTestValue, cachedLayer.textMaxWidth)\n    assertEquals(textOffsetTestValue, cachedLayer.textOffset)\n    assertEquals(textOptionalTestValue, cachedLayer.textOptional)\n    assertEquals(textPaddingTestValue, cachedLayer.textPadding)\n    assertEquals(textPitchAlignmentTestValue, cachedLayer.textPitchAlignment)\n    assertEquals(textRadialOffsetTestValue, cachedLayer.textRadialOffset)\n    assertEquals(textRotateTestValue, cachedLayer.textRotate)\n    assertEquals(textRotationAlignmentTestValue, cachedLayer.textRotationAlignment)\n    assertEquals(textSizeTestValue, cachedLayer.textSize)\n    assertEquals(textSizeScaleRangeTestValue, cachedLayer.textSizeScaleRange)\n    assertEquals(textTransformTestValue, cachedLayer.textTransform)\n    assertEquals(textVariableAnchorTestValue, cachedLayer.textVariableAnchor)\n    assertEquals(textWritingModeTestValue, cachedLayer.textWritingMode)\n    assertEquals(iconColorTestValue, cachedLayer.iconColor)\n    assertEquals(iconColorUseThemeTestValue, cachedLayer.iconColorUseTheme)\n    assertEquals(iconColorBrightnessMaxTestValue, cachedLayer.iconColorBrightnessMax)\n    assertEquals(iconColorBrightnessMinTestValue, cachedLayer.iconColorBrightnessMin)\n    assertEquals(iconColorContrastTestValue, cachedLayer.iconColorContrast)\n    assertEquals(iconColorSaturationTestValue, cachedLayer.iconColorSaturation)\n    assertEquals(iconEmissiveStrengthTestValue, cachedLayer.iconEmissiveStrength)\n    assertEquals(iconHaloBlurTestValue, cachedLayer.iconHaloBlur)\n    assertEquals(iconHaloColorTestValue, cachedLayer.iconHaloColor)\n    assertEquals(iconHaloColorUseThemeTestValue, cachedLayer.iconHaloColorUseTheme)\n    assertEquals(iconHaloWidthTestValue, cachedLayer.iconHaloWidth)\n    assertEquals(iconImageCrossFadeTestValue, cachedLayer.iconImageCrossFade)\n    assertEquals(iconOcclusionOpacityTestValue, cachedLayer.iconOcclusionOpacity)\n    assertEquals(iconOpacityTestValue, cachedLayer.iconOpacity)\n    assertEquals(iconTranslateTestValue, cachedLayer.iconTranslate)\n    assertEquals(iconTranslateAnchorTestValue, cachedLayer.iconTranslateAnchor)\n    assertEquals(occlusionOpacityModeTestValue, cachedLayer.occlusionOpacityMode)\n    assertEquals(symbolZOffsetTestValue, cachedLayer.symbolZOffset)\n    assertEquals(textColorTestValue, cachedLayer.textColor)\n    assertEquals(textColorUseThemeTestValue, cachedLayer.textColorUseTheme)\n    assertEquals(textEmissiveStrengthTestValue, cachedLayer.textEmissiveStrength)\n    assertEquals(textHaloBlurTestValue, cachedLayer.textHaloBlur)\n    assertEquals(textHaloColorTestValue, cachedLayer.textHaloColor)\n    assertEquals(textHaloColorUseThemeTestValue, cachedLayer.textHaloColorUseTheme)\n    assertEquals(textHaloWidthTestValue, cachedLayer.textHaloWidth)\n    assertEquals(textOcclusionOpacityTestValue, cachedLayer.textOcclusionOpacity)\n    assertEquals(textOpacityTestValue, cachedLayer.textOpacity)\n    assertEquals(textTranslateTestValue, cachedLayer.textTranslate)\n    assertEquals(textTranslateAnchorTestValue, cachedLayer.textTranslateAnchor)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/light/LightTest.kt",
    "content": "package com.mapbox.maps.testapp.style.light\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.light.generated.AmbientLight\nimport com.mapbox.maps.extension.style.light.generated.DirectionalLight\nimport com.mapbox.maps.extension.style.light.generated.ambientLight\nimport com.mapbox.maps.extension.style.light.generated.directionalLight\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\nclass LightTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun testGetLight() {\n    val ambientLight = ambientLight(AMBIENT_LIGHT_ID) {\n      color(Color.WHITE)\n      intensity(0.5)\n    }\n    val directionalLight = directionalLight(DIRECTIONAL_LIGHT_ID) {\n      color(Color.YELLOW)\n      intensity(0.9)\n      castShadows(true)\n      direction(listOf(0.0, 15.0))\n    }\n\n    setupLight(\n      ambientLight,\n      directionalLight,\n    )\n\n    Assert.assertTrue(getLight(DIRECTIONAL_LIGHT_ID) is DirectionalLight)\n    Assert.assertTrue(getLight(AMBIENT_LIGHT_ID) is AmbientLight)\n    Assert.assertEquals(0.9, (getLight(DIRECTIONAL_LIGHT_ID) as DirectionalLight).intensity!!, ESP)\n    Assert.assertEquals(0.5, (getLight(AMBIENT_LIGHT_ID) as AmbientLight).intensity!!, ESP)\n  }\n\n  private companion object {\n    private const val AMBIENT_LIGHT_ID = \"AMBIENT_LIGHT_ID\"\n    private const val DIRECTIONAL_LIGHT_ID = \"DIRECTIONAL_LIGHT_ID\"\n    private const val ESP = 0.000001\n  }\n}"
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/light/generated/AmbientLightTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.light.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.light.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for Ambient light.\n */\n@RunWith(AndroidJUnit4::class)\nclass AmbientLightTest : BaseStyleTest() {\n  @Test\n  @UiThreadTest\n  fun colorAsColorIntTest() {\n    val light = ambientLight {\n      color(Color.CYAN)\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(Color.CYAN, light.colorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTest() {\n    val light = ambientLight {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(\"rgba(0, 0, 0, 1)\", light.color)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val light = ambientLight {\n      color(expression)\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(expression.toString(), light.colorAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun colorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = ambientLight {\n      colorTransition(transition)\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(transition, light.colorTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun colorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = ambientLight {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(transition, light.colorTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun intensityTest() {\n    val light = ambientLight {\n      intensity(1.0)\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(1.0, light.intensity!!, 1E-5)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun intensityAsExpressionTest() {\n    val expression = literal(1.0)\n    val light = ambientLight {\n      intensity(expression)\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(1.0, light.intensityAsExpression?.contents as Double, 1E-5)\n  }\n  @Test\n  @UiThreadTest\n  fun intensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = ambientLight {\n      intensityTransition(transition)\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(transition, light.intensityTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun intensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = ambientLight {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(transition, light.intensityTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun colorUseThemeTest() {\n    val light = ambientLight {\n      colorUseTheme(\"default\")\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(\"default\", light.colorUseTheme)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorUseThemeAsExpressionTest() {\n    val expression = literal(\"default\")\n    val light = ambientLight {\n      colorUseTheme(expression)\n    }\n    setupLight(light, directionalLight { })\n    assertEquals(expression.toString(), light.colorUseThemeAsExpression.toString())\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/light/generated/DirectionalLightTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.light.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.light.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for Directional light.\n */\n@RunWith(AndroidJUnit4::class)\nclass DirectionalLightTest : BaseStyleTest() {\n  @Test\n  @UiThreadTest\n  fun castShadowsTest() {\n    val light = directionalLight {\n      castShadows(true)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(true, light.castShadows)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun castShadowsAsExpressionTest() {\n    val expression = literal(true)\n    val light = directionalLight {\n      castShadows(expression)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(expression.toString(), light.castShadowsAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun colorAsColorIntTest() {\n    val light = directionalLight {\n      color(Color.CYAN)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(Color.CYAN, light.colorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTest() {\n    val light = directionalLight {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(\"rgba(0, 0, 0, 1)\", light.color)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val light = directionalLight {\n      color(expression)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(expression.toString(), light.colorAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun colorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = directionalLight {\n      colorTransition(transition)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(transition, light.colorTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun colorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = directionalLight {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(transition, light.colorTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun directionTest() {\n    val light = directionalLight {\n      direction(listOf(180.0, 45.0))\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(listOf(180.0, 45.0), light.direction)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun directionAsExpressionTest() {\n    val expression = literal(listOf(180.0, 45.0))\n    val light = directionalLight {\n      direction(expression)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(expression.toString(), light.directionAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun directionTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = directionalLight {\n      directionTransition(transition)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(transition, light.directionTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun directionTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = directionalLight {\n      directionTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(transition, light.directionTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun intensityTest() {\n    val light = directionalLight {\n      intensity(1.0)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(1.0, light.intensity!!, 1E-5)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun intensityAsExpressionTest() {\n    val expression = literal(1.0)\n    val light = directionalLight {\n      intensity(expression)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(1.0, light.intensityAsExpression?.contents as Double, 1E-5)\n  }\n  @Test\n  @UiThreadTest\n  fun intensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = directionalLight {\n      intensityTransition(transition)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(transition, light.intensityTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun intensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = directionalLight {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(transition, light.intensityTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun shadowDrawBeforeLayerTest() {\n    val light = directionalLight {\n      shadowDrawBeforeLayer(\"abc\")\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(\"abc\", light.shadowDrawBeforeLayer)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun shadowDrawBeforeLayerAsExpressionTest() {\n    val expression = literal(\"abc\")\n    val light = directionalLight {\n      shadowDrawBeforeLayer(expression)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(expression.toString(), light.shadowDrawBeforeLayerAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun shadowIntensityTest() {\n    val light = directionalLight {\n      shadowIntensity(1.0)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(1.0, light.shadowIntensity!!, 1E-5)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun shadowIntensityAsExpressionTest() {\n    val expression = literal(1.0)\n    val light = directionalLight {\n      shadowIntensity(expression)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(1.0, light.shadowIntensityAsExpression?.contents as Double, 1E-5)\n  }\n  @Test\n  @UiThreadTest\n  fun shadowIntensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = directionalLight {\n      shadowIntensityTransition(transition)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(transition, light.shadowIntensityTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun shadowIntensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = directionalLight {\n      shadowIntensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(transition, light.shadowIntensityTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun colorUseThemeTest() {\n    val light = directionalLight {\n      colorUseTheme(\"default\")\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(\"default\", light.colorUseTheme)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorUseThemeAsExpressionTest() {\n    val expression = literal(\"default\")\n    val light = directionalLight {\n      colorUseTheme(expression)\n    }\n    setupLight(ambientLight { }, light)\n    assertEquals(expression.toString(), light.colorUseThemeAsExpression.toString())\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/light/generated/FlatLightTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.light.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.light.LightPosition\nimport com.mapbox.maps.extension.style.light.generated.*\nimport com.mapbox.maps.extension.style.types.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for Flat light.\n */\n@RunWith(AndroidJUnit4::class)\nclass FlatLightTest : BaseStyleTest() {\n  @Test\n  @UiThreadTest\n  fun anchorTest() {\n    val light = flatLight {\n      anchor(Anchor.MAP)\n    }\n    setupLight(light)\n    assertEquals(Anchor.MAP, light.anchor)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun anchorAsExpressionTest() {\n    val expression = literal(\"map\")\n    val light = flatLight {\n      anchor(expression)\n    }\n    setupLight(light)\n    assertEquals(expression.toString(), light.anchorAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun colorAsColorIntTest() {\n    val light = flatLight {\n      color(Color.CYAN)\n    }\n    setupLight(light)\n    assertEquals(Color.CYAN, light.colorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTest() {\n    val light = flatLight {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    setupLight(light)\n    assertEquals(\"rgba(0, 0, 0, 1)\", light.color)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n    val light = flatLight {\n      color(expression)\n    }\n    setupLight(light)\n    assertEquals(expression.toString(), light.colorAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun colorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = flatLight {\n      colorTransition(transition)\n    }\n    setupLight(light)\n    assertEquals(transition, light.colorTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun colorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = flatLight {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLight(light)\n    assertEquals(transition, light.colorTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun intensityTest() {\n    val light = flatLight {\n      intensity(1.0)\n    }\n    setupLight(light)\n    assertEquals(1.0, light.intensity!!, 1E-5)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun intensityAsExpressionTest() {\n    val expression = literal(1.0)\n    val light = flatLight {\n      intensity(expression)\n    }\n    setupLight(light)\n    assertEquals(1.0, light.intensityAsExpression?.contents as Double, 1E-5)\n  }\n  @Test\n  @UiThreadTest\n  fun intensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = flatLight {\n      intensityTransition(transition)\n    }\n    setupLight(light)\n    assertEquals(transition, light.intensityTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun intensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = flatLight {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLight(light)\n    assertEquals(transition, light.intensityTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun positionDslTest() {\n    val position = LightPosition(1.0, 2.0, 3.0)\n    val light = flatLight {\n      position(1.0, 2.0, 3.0)\n    }\n    setupLight(light)\n    assertEquals(position, light.position)\n  }\n  @Test\n  @UiThreadTest\n  fun positionTest() {\n    val light = flatLight {\n      position(LightPosition(0.0, 1.0, 2.0))\n    }\n    setupLight(light)\n    assertEquals(LightPosition(0.0, 1.0, 2.0), light.position)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun positionAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0, 2.0))\n    val light = flatLight {\n      position(expression)\n    }\n    setupLight(light)\n    assertEquals(expression.toString(), light.positionAsExpression.toString())\n  }\n  @Test\n  @UiThreadTest\n  fun positionTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = flatLight {\n      positionTransition(transition)\n    }\n    setupLight(light)\n    assertEquals(transition, light.positionTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun positionTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val light = flatLight {\n      positionTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupLight(light)\n    assertEquals(transition, light.positionTransition)\n  }\n  @Test\n  @UiThreadTest\n  fun colorUseThemeTest() {\n    val light = flatLight {\n      colorUseTheme(\"default\")\n    }\n    setupLight(light)\n    assertEquals(\"default\", light.colorUseTheme)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorUseThemeAsExpressionTest() {\n    val expression = literal(\"default\")\n    val light = flatLight {\n      colorUseTheme(expression)\n    }\n    setupLight(light)\n    assertEquals(expression.toString(), light.colorUseThemeAsExpression.toString())\n  }\n}\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/precipitations/generated/RainTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.precipitations.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.precipitations.generated.rain\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for Rain\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass RainTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun centerThinningTest() {\n    val rain = rain {\n      centerThinning(1.0)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.centerThinning!!, 1E-5)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun centerThinningAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val rain = rain {\n      centerThinning(expression)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.centerThinningAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun centerThinningTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      centerThinningTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.centerThinningTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun centerThinningTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      centerThinningTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.centerThinningTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorAsColorIntTest() {\n    val rain = rain {\n      color(Color.CYAN)\n    }\n    setupRain(rain)\n    assertEquals(Color.CYAN, rain.colorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTest() {\n    val rain = rain {\n      color(\"rgba(0, 0, 0, 1)\")\n    }\n    setupRain(rain)\n    assertEquals(\"rgba(0, 0, 0, 1)\", rain.color)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val rain = rain {\n      color(expression)\n    }\n    setupRain(rain)\n    assertEquals(expression.toString(), rain.colorAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      colorTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.colorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.colorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun densityTest() {\n    val rain = rain {\n      density(1.0)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.density!!, 1E-5)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun densityAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val rain = rain {\n      density(expression)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.densityAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun densityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      densityTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.densityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun densityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      densityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.densityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun directionTest() {\n    val rain = rain {\n      direction(listOf(0.0, 1.0))\n    }\n    setupRain(rain)\n    assertEquals(listOf(0.0, 1.0), rain.direction)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun directionAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n\n    val rain = rain {\n      direction(expression)\n    }\n    setupRain(rain)\n    assertEquals(expression.toString(), rain.directionAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun directionTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      directionTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.directionTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun directionTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      directionTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.directionTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun distortionStrengthTest() {\n    val rain = rain {\n      distortionStrength(1.0)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.distortionStrength!!, 1E-5)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun distortionStrengthAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val rain = rain {\n      distortionStrength(expression)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.distortionStrengthAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun distortionStrengthTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      distortionStrengthTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.distortionStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun distortionStrengthTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      distortionStrengthTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.distortionStrengthTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun dropletSizeTest() {\n    val rain = rain {\n      dropletSize(listOf(0.0, 1.0))\n    }\n    setupRain(rain)\n    assertEquals(listOf(0.0, 1.0), rain.dropletSize)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun dropletSizeAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n\n    val rain = rain {\n      dropletSize(expression)\n    }\n    setupRain(rain)\n    assertEquals(expression.toString(), rain.dropletSizeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun dropletSizeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      dropletSizeTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.dropletSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun dropletSizeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      dropletSizeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.dropletSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun intensityTest() {\n    val rain = rain {\n      intensity(1.0)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.intensity!!, 1E-5)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun intensityAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val rain = rain {\n      intensity(expression)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.intensityAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun intensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      intensityTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.intensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun intensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.intensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun opacityTest() {\n    val rain = rain {\n      opacity(1.0)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.opacity!!, 1E-5)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun opacityAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val rain = rain {\n      opacity(expression)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.opacityAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun opacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      opacityTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.opacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun opacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      opacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.opacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteTest() {\n    val rain = rain {\n      vignette(1.0)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.vignette!!, 1E-5)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun vignetteAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val rain = rain {\n      vignette(expression)\n    }\n    setupRain(rain)\n    assertEquals(1.0, rain.vignetteAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      vignetteTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.vignetteTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      vignetteTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.vignetteTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteColorAsColorIntTest() {\n    val rain = rain {\n      vignetteColor(Color.CYAN)\n    }\n    setupRain(rain)\n    assertEquals(Color.CYAN, rain.vignetteColorAsColorInt)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteColorTest() {\n    val rain = rain {\n      vignetteColor(\"rgba(0, 0, 0, 1)\")\n    }\n    setupRain(rain)\n    assertEquals(\"rgba(0, 0, 0, 1)\", rain.vignetteColor)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun vignetteColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val rain = rain {\n      vignetteColor(expression)\n    }\n    setupRain(rain)\n    assertEquals(expression.toString(), rain.vignetteColorAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      vignetteColorTransition(transition)\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.vignetteColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val rain = rain {\n      vignetteColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupRain(rain)\n    assertEquals(transition, rain.vignetteColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorUseThemeTest() {\n    val rain = rain {\n      colorUseTheme(\"default\")\n    }\n    setupRain(rain)\n    assertEquals(\"default\", rain.colorUseTheme)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorUseThemeAsExpressionTest() {\n    val expression = literal(\"default\")\n\n    val rain = rain {\n      colorUseTheme(expression)\n    }\n    setupRain(rain)\n    assertEquals(expression.toString(), rain.colorUseThemeAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteColorUseThemeTest() {\n    val rain = rain {\n      vignetteColorUseTheme(\"default\")\n    }\n    setupRain(rain)\n    assertEquals(\"default\", rain.vignetteColorUseTheme)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun vignetteColorUseThemeAsExpressionTest() {\n    val expression = literal(\"default\")\n\n    val rain = rain {\n      vignetteColorUseTheme(expression)\n    }\n    setupRain(rain)\n    assertEquals(expression.toString(), rain.vignetteColorUseThemeAsExpression.toString())\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/precipitations/generated/SnowTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.precipitations.generated\n\nimport android.graphics.Color\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.rgba\nimport com.mapbox.maps.extension.style.precipitations.generated.snow\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for Snow\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass SnowTest : BaseStyleTest() {\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun centerThinningAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val snow = snow {\n      centerThinning(expression)\n    }\n    setupSnow(snow)\n    assertEquals(1.0, snow.centerThinningAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun centerThinningTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      centerThinningTransition(transition)\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.centerThinningTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun centerThinningTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      centerThinningTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.centerThinningTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorAsColorIntTest() {\n    val snow = snow {\n      color(Color.CYAN)\n    }\n    setupSnow(snow)\n    assertEquals(Color.CYAN, snow.colorAsColorInt)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val snow = snow {\n      color(expression)\n    }\n    setupSnow(snow)\n    assertEquals(expression.toString(), snow.colorAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      colorTransition(transition)\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.colorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun colorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      colorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.colorTransition)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun densityAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val snow = snow {\n      density(expression)\n    }\n    setupSnow(snow)\n    assertEquals(1.0, snow.densityAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun densityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      densityTransition(transition)\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.densityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun densityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      densityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.densityTransition)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun directionAsExpressionTest() {\n    val expression = literal(listOf(0.0, 1.0))\n\n    val snow = snow {\n      direction(expression)\n    }\n    setupSnow(snow)\n    assertEquals(expression.toString(), snow.directionAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun directionTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      directionTransition(transition)\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.directionTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun directionTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      directionTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.directionTransition)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun flakeSizeAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val snow = snow {\n      flakeSize(expression)\n    }\n    setupSnow(snow)\n    assertEquals(1.0, snow.flakeSizeAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun flakeSizeTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      flakeSizeTransition(transition)\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.flakeSizeTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun flakeSizeTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      flakeSizeTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.flakeSizeTransition)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun intensityAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val snow = snow {\n      intensity(expression)\n    }\n    setupSnow(snow)\n    assertEquals(1.0, snow.intensityAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun intensityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      intensityTransition(transition)\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.intensityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun intensityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      intensityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.intensityTransition)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun opacityAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val snow = snow {\n      opacity(expression)\n    }\n    setupSnow(snow)\n    assertEquals(1.0, snow.opacityAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun opacityTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      opacityTransition(transition)\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.opacityTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun opacityTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      opacityTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.opacityTransition)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun vignetteAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val snow = snow {\n      vignette(expression)\n    }\n    setupSnow(snow)\n    assertEquals(1.0, snow.vignetteAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      vignetteTransition(transition)\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.vignetteTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      vignetteTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.vignetteTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteColorAsColorIntTest() {\n    val snow = snow {\n      vignetteColor(Color.CYAN)\n    }\n    setupSnow(snow)\n    assertEquals(Color.CYAN, snow.vignetteColorAsColorInt)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun vignetteColorAsExpressionTest() {\n    val expression = rgba {\n      literal(0.0)\n      literal(0.0)\n      literal(0.0)\n      literal(1.0)\n    }\n\n    val snow = snow {\n      vignetteColor(expression)\n    }\n    setupSnow(snow)\n    assertEquals(expression.toString(), snow.vignetteColorAsExpression.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteColorTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      vignetteColorTransition(transition)\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.vignetteColorTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun vignetteColorTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val snow = snow {\n      vignetteColorTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupSnow(snow)\n    assertEquals(transition, snow.vignetteColorTransition)\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun colorUseThemeAsExpressionTest() {\n    val expression = literal(\"default\")\n\n    val snow = snow {\n      colorUseTheme(expression)\n    }\n    setupSnow(snow)\n    assertEquals(expression.toString(), snow.colorUseThemeAsExpression.toString())\n  }\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun vignetteColorUseThemeAsExpressionTest() {\n    val expression = literal(\"default\")\n\n    val snow = snow {\n      vignetteColorUseTheme(expression)\n    }\n    setupSnow(snow)\n    assertEquals(expression.toString(), snow.vignetteColorUseThemeAsExpression.toString())\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/sources/RasterArraySourceTest.kt",
    "content": "package com.mapbox.maps.testapp.style.sources\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.extension.style.sources.getSourceAs\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Manually written test for RasterArraySource.\n */\n@RunWith(AndroidJUnit4::class)\nclass RasterArraySourceTest : BaseStyleTest() {\n  @Test\n  fun rasterLayersTest() {\n    val latch = CountDownLatch(1)\n    runOnUiThread {\n      mapboxMap.loadStyle(\n          style = \"\"\"\n        {\n          \"version\": 8,\n          \"name\": \"Temperature\",\n          \"sources\": {\n            \"mapbox\": {\n                \"type\": \"raster-array\",\n                \"tiles\": [\"mapbox://tiles/example/{z}/{x}/{y}.mrt\"],\n                \"scheme\": \"xyz\",\n                \"minzoom\": 1,\n                \"maxzoom\": 4,\n                \"attribution\": \"mapbox\",\n                \"volatile\": true,\n                \"raster_layers\": [\n                    {\n                        \"fields\": {\n                            \"bands\": [\n                                \"1659898800\", \"1659902400\", \"1659906000\", \"1659909600\", \"1659913200\", \"1659916800\"\n                            ],\n                            \"buffer\": 1,\n                            \"units\": \"degrees\"\n                        },\n                        \"id\": \"temperature\",\n                        \"maxzoom\": 3,\n                        \"minzoom\": 0\n                    },\n                    {\n                        \"fields\": {\n                            \"bands\": [\n                                \"1659898800\", \"1659902400\", \"1659906000\", \"1659909600\", \"1659913200\", \"1659916800\"\n                            ],\n                            \"buffer\": 1,\n                            \"units\": \"percent\"\n                        },\n                        \"id\": \"humidity\",\n                        \"maxzoom\": 3,\n                        \"minzoom\": 0\n                    }\n                ]\n            }\n          },\n          \"layers\": [\n            {\n            \"id\": \"temperature\",\n            \"type\": \"raster\",\n            \"source\": \"mapbox\",\n            \"source-layer\": \"temperature\",\n            \"paint\": {\n                \"raster-color\": [\n                  \"interpolate\",\n                  [\n                    \"linear\"\n                  ],\n                  [\n                    \"raster-value\"\n                  ],\n                  -5,\n                  \"rgba(94, 79, 162, 0.8)\",\n                  0,\n                  \"rgba(75, 160, 177, 0.8)\",\n                  5,\n                  \"rgba(160, 217, 163, 0.8)\",\n                  10,\n                  \"rgba(235, 247, 166, 0.8)\",\n                  15,\n                  \"rgba(254, 232, 154, 0.8)\",\n                  20,\n                  \"rgba(251, 163, 94, 0.8)\",\n                  25,\n                  \"rgba(225, 82, 74, 0.8)\",\n                  30,\n                  \"rgba(158, 1, 66, 0.8)\"\n                ],\n                \"raster-color-range\": [-5, 30]\n            }\n          }]\n        }\n      \"\"\".trimIndent()\n        ) { style ->\n          val source = style.getSourceAs<RasterArraySource>(\"mapbox\")\n          assertEquals(\n            /* expected = */ \"[RasterDataLayer(layerId=temperature, bands:[1659898800, 1659902400, 1659906000, 1659909600, 1659913200, 1659916800]), RasterDataLayer(layerId=humidity, bands:[1659898800, 1659902400, 1659906000, 1659909600, 1659913200, 1659916800])]\",\n            /* actual = */ source?.rasterLayers?.toString()\n          )\n          latch.countDown()\n        }\n    }\n\n    if (!latch.await(10000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n  }\n}"
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/sources/generated/GeoJsonSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.sources.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.SourceDataLoadedCallback\nimport com.mapbox.maps.SourceDataLoadedType\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.extension.style.types.PromoteId\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertNull\nimport org.junit.Ignore\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Basic smoke tests for GeoJsonSource.\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass GeoJsonSourceTest : BaseStyleTest() {\n  private var cancelable: Cancelable? = null\n\n  @Test\n  @UiThreadTest\n  fun dataTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      data(TEST_GEOJSON)\n    }\n    setupSource(testSource)\n    assertNotNull(testSource.data)\n  }\n\n  @Test\n  fun dataAfterBindTest() {\n    val latch = CountDownLatch(1)\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    val listener = SourceDataLoadedCallback {\n      if (it.type == SourceDataLoadedType.METADATA && it.sourceId == SOURCE_ID) {\n        assertNotNull(testSource.data)\n        latch.countDown()\n      }\n    }\n    runOnUiThread {\n      mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setupSource(testSource)\n          testSource.data(TEST_GEOJSON)\n      }\n    }\n    if (!latch.await(LATCH_MAX_TIME_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    cancelable?.cancel()\n  }\n\n  @Test\n  @UiThreadTest\n  fun emptyDataTest() {\n    val testSource = geoJsonSource(SOURCE_ID)\n    setupSource(testSource)\n    assertNotNull(testSource.data)\n  }\n\n  @Test\n  fun urlTest() {\n    val latch = CountDownLatch(2)\n    val answerList = mutableListOf<String?>()\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    val listener = SourceDataLoadedCallback {\n      if (it.type == SourceDataLoadedType.METADATA && it.sourceId == SOURCE_ID) {\n        answerList.add(testSource.data)\n        latch.countDown()\n      }\n    }\n    runOnUiThread {\n      mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setupSource(testSource)\n      }\n    }\n    if (!latch.await(LATCH_MAX_TIME_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    assertEquals(2, answerList.size)\n    assertEquals(\"\", answerList[0])\n    assertEquals(TEST_URI, answerList[1])\n    cancelable?.cancel()\n  }\n\n  @Test\n  fun urlAfterBindTest() {\n    val latch = CountDownLatch(2)\n    val answerList = mutableListOf<String?>()\n    val testSource = geoJsonSource(SOURCE_ID) { }\n    val listener = SourceDataLoadedCallback {\n      if (it.type == SourceDataLoadedType.METADATA && it.sourceId == SOURCE_ID) {\n        answerList.add(testSource.data)\n        latch.countDown()\n      }\n    }\n    runOnUiThread {\n      mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setupSource(testSource)\n          testSource.data(TEST_URI)\n      }\n    }\n    if (!latch.await(LATCH_MAX_TIME_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    assertEquals(2, answerList.size)\n    assertEquals(\"\", answerList[0])\n    assertEquals(TEST_URI, answerList[1])\n    cancelable?.cancel()\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      maxzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      minzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun attributionTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      attribution(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.attribution)\n  }\n\n  @Test\n  @UiThreadTest\n  fun bufferTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      buffer(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.buffer)\n  }\n\n  @Test\n  @UiThreadTest\n  fun toleranceTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      tolerance(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.tolerance)\n  }\n\n  @Test\n  @UiThreadTest\n  fun clusterTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      cluster(true)\n    }\n    setupSource(testSource)\n    assertEquals(true, testSource.cluster)\n  }\n\n  @Test\n  @UiThreadTest\n  fun clusterRadiusTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      clusterRadius(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.clusterRadius)\n  }\n\n  @Test\n  @UiThreadTest\n  fun clusterMaxZoomTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      clusterMaxZoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.clusterMaxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun clusterMinPointsTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      clusterMinPoints(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.clusterMinPoints)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun clusterPropertiesTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      clusterProperties((hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>))\n    }\n    setupSource(testSource)\n    assertEquals((hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>), testSource.clusterProperties)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun clusterPropertyTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      clusterProperty(\n        \"sum\",\n        sum {\n          accumulated()\n          get { literal(\"scalerank\") }\n        }\n      )\n    }\n    setupSource(testSource)\n    assertEquals(\"\", testSource.clusterProperties.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun clusterPropertyAdvancedTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      clusterProperty(\n        \"sum\",\n        sum {\n          accumulated()\n          get { literal(\"sum\") }\n        },\n        get { literal(\"scalerank\") }\n      )\n    }\n    setupSource(testSource)\n    assertEquals(\"{sum=[[+, [number, [accumulated]], [number, [get, sum]]], [get, scalerank]]}\", testSource.clusterProperties.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun multiClusterPropertyTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      clusterProperty(\n        \"sum\",\n        sum {\n          accumulated()\n          get { literal(\"sum\") }\n        },\n        get { literal(\"scalerank\") }\n      )\n      clusterProperty(\n        \"test\",\n        get { literal(\"scalerank\") },\n        sum {\n          literal(1)\n          literal(2)\n        }\n      )\n    }\n    setupSource(testSource)\n    assertEquals(\"{test=[[get, scalerank], 3.0], sum=[[+, [number, [accumulated]], [number, [get, sum]]], [get, scalerank]]}\", testSource.clusterProperties.toString())\n  }\n\n  @Test\n  @UiThreadTest\n  fun lineMetricsTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      lineMetrics(true)\n    }\n    setupSource(testSource)\n    assertEquals(true, testSource.lineMetrics)\n  }\n\n  @Test\n  @UiThreadTest\n  fun generateIdTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      generateId(true)\n    }\n    setupSource(testSource)\n    assertEquals(true, testSource.generateId)\n  }\n\n  @Test\n  @UiThreadTest\n  fun promoteIdTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      promoteId(PromoteId(propertyName = \"abc\"))\n    }\n    setupSource(testSource)\n    assertEquals(PromoteId(propertyName = \"abc\"), testSource.promoteId)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"Experimental GeoJsonSource.autoMaxZoom and GeoJsonSourceState.autoMaxZoom will return null value even after it's set.\")\n  fun autoMaxZoomTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      autoMaxZoom(true)\n    }\n    setupSource(testSource)\n    assertEquals(true, testSource.autoMaxZoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      prefetchZoomDelta(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaAfterBindTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.prefetchZoomDelta(1L)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    setupSource(testSource)\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetAfterBindTest() {\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  @Test\n  fun featureTest() {\n    val latch = CountDownLatch(2)\n    val answerList = mutableListOf<String?>()\n    val dataIdList = mutableListOf<String?>()\n    val testSource = geoJsonSource(SOURCE_ID) {\n      feature(FEATURE, DATA_ID)\n    }\n    val listener = SourceDataLoadedCallback {\n      if (it.type == SourceDataLoadedType.METADATA && it.sourceId == SOURCE_ID) {\n        answerList.add(testSource.data)\n        it.dataId?.let(dataIdList::add)\n        latch.countDown()\n      }\n    }\n    runOnUiThread {\n      mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setupSource(testSource)\n      }\n    }\n    if (!latch.await(LATCH_MAX_TIME_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    assertEquals(2, answerList.size)\n    assertEquals(\"\", answerList[0])\n    // Plain json string data getter is not supported due to performance consideration.\n    assertNull(answerList[1])\n    assertEquals(1, dataIdList.size)\n    assertEquals(DATA_ID, dataIdList.first())\n    cancelable?.cancel()\n  }\n\n  @Test\n  fun featureCollectionTest() {\n    val latch = CountDownLatch(2)\n    val answerList = mutableListOf<String?>()\n    val dataIdList = mutableListOf<String?>()\n    val testSource = geoJsonSource(SOURCE_ID) {\n      featureCollection(FEATURE_COLLECTION, DATA_ID)\n    }\n    val listener = SourceDataLoadedCallback {\n      if (it.type == SourceDataLoadedType.METADATA && it.sourceId == SOURCE_ID) {\n        answerList.add(testSource.data)\n        it.dataId?.let(dataIdList::add)\n        latch.countDown()\n      }\n    }\n    runOnUiThread {\n      mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setupSource(testSource)\n      }\n    }\n    if (!latch.await(LATCH_MAX_TIME_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    assertEquals(2, answerList.size)\n    assertEquals(\"\", answerList[0])\n    // Plain json string data getter is not supported due to performance consideration.\n    assertNull(answerList[1])\n    assertEquals(1, dataIdList.size)\n    assertEquals(DATA_ID, dataIdList.first())\n    cancelable?.cancel()\n  }\n\n  @Test\n  fun geometryTest() {\n    val latch = CountDownLatch(2)\n    val answerList = mutableListOf<String?>()\n    val dataIdList = mutableListOf<String?>()\n    val testSource = geoJsonSource(SOURCE_ID) {\n      geometry(FEATURE.geometry()!!, DATA_ID)\n    }\n    val listener = SourceDataLoadedCallback {\n      if (it.type == SourceDataLoadedType.METADATA && it.sourceId == SOURCE_ID) {\n        answerList.add(testSource.data)\n        it.dataId?.let(dataIdList::add)\n        latch.countDown()\n      }\n    }\n    runOnUiThread {\n      mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setupSource(testSource)\n      }\n    }\n    if (!latch.await(LATCH_MAX_TIME_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    assertEquals(2, answerList.size)\n    assertEquals(\"\", answerList[0])\n    // Plain json string data getter is not supported due to performance consideration.\n    assertNull(answerList[1])\n    assertEquals(1, dataIdList.size)\n    assertEquals(DATA_ID, dataIdList.first())\n    cancelable?.cancel()\n  }\n\n  @Test\n  fun featureAfterBindTest() {\n    val latch = CountDownLatch(2)\n    val answerList = mutableListOf<String?>()\n    val dataIdList = mutableListOf<String?>()\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    val listener = SourceDataLoadedCallback {\n      if (it.type == SourceDataLoadedType.METADATA && it.sourceId == SOURCE_ID) {\n        answerList.add(testSource.data)\n        it.dataId?.let(dataIdList::add)\n        latch.countDown()\n      }\n    }\n    runOnUiThread {\n      mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setupSource(testSource)\n          testSource.feature(FEATURE, DATA_ID)\n      }\n    }\n    if (!latch.await(LATCH_MAX_TIME_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    assertEquals(2, answerList.size)\n    assertEquals(\"\", answerList[0])\n    // Plain json string data getter is not supported due to performance consideration.\n    assertNull(answerList[1])\n    assertEquals(1, dataIdList.size)\n    assertEquals(DATA_ID, dataIdList.first())\n    cancelable?.cancel()\n  }\n\n  @Test\n  fun featureCollectionAfterBindTest() {\n    val latch = CountDownLatch(2)\n    val answerList = mutableListOf<String?>()\n    val dataIdList = mutableListOf<String?>()\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    val listener = SourceDataLoadedCallback {\n      if (it.type == SourceDataLoadedType.METADATA && it.sourceId == SOURCE_ID) {\n        answerList.add(testSource.data)\n        println(\"Data-id : ${it.dataId}\")\n        it.dataId?.let(dataIdList::add)\n        latch.countDown()\n      }\n    }\n    runOnUiThread {\n      mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setupSource(testSource)\n          testSource.featureCollection(FEATURE_COLLECTION, DATA_ID)\n      }\n    }\n    if (!latch.await(LATCH_MAX_TIME_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    assertEquals(2, answerList.size)\n    assertEquals(\"\", answerList[0])\n    // Plain json string data getter is not supported due to performance consideration.\n    assertNull(answerList[1])\n    assertEquals(1, dataIdList.size)\n    assertEquals(DATA_ID, dataIdList.first())\n    cancelable?.cancel()\n  }\n\n  @Test\n  fun geometryAfterBindTest() {\n    val latch = CountDownLatch(2)\n    val answerList = mutableListOf<String?>()\n    val dataIdList = mutableListOf<String?>()\n    val testSource = geoJsonSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    val listener = SourceDataLoadedCallback {\n      if (it.type == SourceDataLoadedType.METADATA && it.sourceId == SOURCE_ID) {\n        answerList.add(testSource.data)\n        it.dataId?.let(dataIdList::add)\n        latch.countDown()\n      }\n    }\n    runOnUiThread {\n      mapboxMap.apply {\n          cancelable = subscribeSourceDataLoaded(listener)\n          setupSource(testSource)\n          testSource.geometry(FEATURE.geometry()!!, DATA_ID)\n      }\n    }\n    if (!latch.await(LATCH_MAX_TIME_MS, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n    assertEquals(2, answerList.size)\n    assertEquals(\"\", answerList[0])\n    // Plain json string data getter is not supported due to performance consideration.\n    assertNull(answerList[1])\n    assertEquals(1, dataIdList.size)\n    assertEquals(DATA_ID, dataIdList.first())\n    cancelable?.cancel()\n  }\n\n  // Default source properties getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultSourcePropertiesTest() {\n    assertNotNull(\"defaultMaxzoom should not be null\", GeoJsonSource.defaultMaxzoom)\n    assertNotNull(\"defaultMinzoom should not be null\", GeoJsonSource.defaultMinzoom)\n    assertNotNull(\"defaultBuffer should not be null\", GeoJsonSource.defaultBuffer)\n    assertNotNull(\"defaultTolerance should not be null\", GeoJsonSource.defaultTolerance)\n    assertNotNull(\"defaultCluster should not be null\", GeoJsonSource.defaultCluster)\n    assertNotNull(\"defaultClusterRadius should not be null\", GeoJsonSource.defaultClusterRadius)\n    assertNotNull(\"defaultClusterMaxZoom should not be null\", GeoJsonSource.defaultClusterMaxZoom)\n    assertNotNull(\"defaultClusterMinPoints should not be null\", GeoJsonSource.defaultClusterMinPoints)\n    assertNotNull(\"defaultLineMetrics should not be null\", GeoJsonSource.defaultLineMetrics)\n    assertNotNull(\"defaultGenerateId should not be null\", GeoJsonSource.defaultGenerateId)\n    assertNotNull(\"defaultPrefetchZoomDelta should not be null\", GeoJsonSource.defaultPrefetchZoomDelta)\n  }\n\n  private companion object {\n    const val TEST_URI = \"https://raw.githubusercontent.com/mapbox/mapbox-gl-native-android/master/MapboxGLAndroidSDKTestApp/src/main/assets/earthquakes.geojson\"\n    const val SOURCE_ID = \"testId\"\n    val TEST_GEOJSON = FeatureCollection.fromFeatures(listOf()).toJson()\n    const val LATCH_MAX_TIME_MS = 10_000L\n    const val DATA_ID = \"data-id\"\n    val FEATURE = Feature.fromJson(\n      \"\"\"\n        {\n          \"type\": \"Feature\",\n          \"geometry\": {\n            \"type\": \"Point\",\n            \"coordinates\": [102.0, 0.5]\n          },\n          \"properties\": {\n                  \"prop0\": \"value0\"\n                }\n        }\n      \"\"\".trimIndent()\n    )\n    val FEATURE_COLLECTION = FeatureCollection.fromJson(\n      \"\"\"\n        {\n          \"type\": \"FeatureCollection\",\n          \"features\": [\n            {\n              \"type\": \"Feature\",\n              \"properties\": {},\n              \"geometry\": {\n                \"type\": \"Point\",\n                \"coordinates\": [102.0, 0.5]\n              }\n            },\n            {\n              \"type\": \"Feature\",\n              \"properties\": {},\n              \"geometry\": {\n                \"type\": \"LineString\",\n                \"coordinates\": [\n                  [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]\n                ]\n              }\n            }\n          ]\n        }\n      \"\"\".trimIndent()\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/sources/generated/ImageSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.sources.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for ImageSource.\n */\n@RunWith(AndroidJUnit4::class)\nclass ImageSourceTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun urlTest() {\n    val testSource = imageSource(SOURCE_ID) {\n      url(TEST_URI)\n      coordinates(TEST_COORDINATES)\n      url(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  fun urlAfterBindTest() {\n    val testSource = imageSource(SOURCE_ID) {\n      url(TEST_URI)\n      coordinates(TEST_COORDINATES)\n    }\n    setupSource(testSource)\n    testSource.url(\"abc\")\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  fun coordinatesTest() {\n    val testSource = imageSource(SOURCE_ID) {\n      url(TEST_URI)\n      coordinates(TEST_COORDINATES)\n      coordinates(listOf(listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0)))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0)), testSource.coordinates)\n  }\n\n  @Test\n  @UiThreadTest\n  fun coordinatesAfterBindTest() {\n    val testSource = imageSource(SOURCE_ID) {\n      url(TEST_URI)\n      coordinates(TEST_COORDINATES)\n    }\n    setupSource(testSource)\n    testSource.coordinates(listOf(listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0)))\n    assertEquals(listOf(listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0), listOf(0.0, 1.0)), testSource.coordinates)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaTest() {\n    val testSource = imageSource(SOURCE_ID) {\n      url(TEST_URI)\n      coordinates(TEST_COORDINATES)\n      prefetchZoomDelta(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaAfterBindTest() {\n    val testSource = imageSource(SOURCE_ID) {\n      url(TEST_URI)\n      coordinates(TEST_COORDINATES)\n    }\n    setupSource(testSource)\n    testSource.prefetchZoomDelta(1L)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  // Default source properties getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultSourcePropertiesTest() {\n    assertNotNull(\"defaultPrefetchZoomDelta should not be null\", ImageSource.defaultPrefetchZoomDelta)\n  }\n\n  private companion object {\n    const val TEST_URI = \"https://raw.githubusercontent.com/mapbox/mapbox-gl-native-android/master/MapboxGLAndroidSDKTestApp/src/main/assets/earthquakes.geojson\"\n    const val SOURCE_ID = \"testId\"\n    val TEST_COORDINATES = listOf(\n      listOf(-35.859375, 58.44773280389084),\n      listOf(-16.171875, 58.44773280389084),\n      listOf(-16.171875, 54.7246201949245),\n      listOf(-35.859375, 54.7246201949245)\n    )\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/sources/generated/ModelSourceModelTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.sources.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for ModelSourceModel.\n */\n@RunWith(AndroidJUnit4::class)\nclass ModelSourceModelTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun featurePropertiesTest() {\n    val testValue = hashMapOf<String, Any>(\"name\" to \"test\")\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .featureProperties(testValue)\n      .build()\n\n    source.models(listOf(model))\n\n    assertEquals(testValue, source.models?.first()?.featureProperties)\n  }\n\n  @Test\n  @UiThreadTest\n  fun featurePropertiesAfterBindTest() {\n    val testValue = hashMapOf<String, Any>(\"name\" to \"test\")\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .build()\n\n    source.models(listOf(model))\n\n    model.featureProperties(testValue)\n\n    assertEquals(testValue, source.models?.first()?.featureProperties)\n  }\n\n  @Test\n  @UiThreadTest\n  fun materialOverrideNamesTest() {\n    val testValue = listOf(\"material1\", \"material2\")\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .materialOverrideNames(testValue)\n      .build()\n\n    source.models(listOf(model))\n\n    assertEquals(testValue.sorted(), source.models?.first()?.materialOverrideNames?.sorted())\n  }\n\n  @Test\n  @UiThreadTest\n  fun materialOverrideNamesAfterBindTest() {\n    val testValue = listOf(\"material1\", \"material2\")\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .build()\n\n    source.models(listOf(model))\n\n    model.materialOverrideNames(testValue)\n\n    assertEquals(testValue.sorted(), source.models?.first()?.materialOverrideNames?.sorted())\n  }\n\n  @Test\n  @UiThreadTest\n  fun materialOverridesTest() {\n    val testValue = listOf(ModelMaterialOverride.Builder(\"mat1\").modelEmissiveStrength(1.5).build())\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .materialOverrides(testValue)\n      .build()\n\n    source.models(listOf(model))\n\n    assertEquals(testValue, source.models?.first()?.materialOverrides)\n  }\n\n  @Test\n  @UiThreadTest\n  fun materialOverridesAfterBindTest() {\n    val testValue = listOf(ModelMaterialOverride.Builder(\"mat1\").modelEmissiveStrength(1.5).build())\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .build()\n\n    source.models(listOf(model))\n\n    model.materialOverrides(testValue)\n\n    assertEquals(testValue, source.models?.first()?.materialOverrides)\n  }\n\n  @Test\n  @UiThreadTest\n  fun nodeOverrideNamesTest() {\n    val testValue = listOf(\"node1\", \"node2\")\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .nodeOverrideNames(testValue)\n      .build()\n\n    source.models(listOf(model))\n\n    assertEquals(testValue.sorted(), source.models?.first()?.nodeOverrideNames?.sorted())\n  }\n\n  @Test\n  @UiThreadTest\n  fun nodeOverrideNamesAfterBindTest() {\n    val testValue = listOf(\"node1\", \"node2\")\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .build()\n\n    source.models(listOf(model))\n\n    model.nodeOverrideNames(testValue)\n\n    assertEquals(testValue.sorted(), source.models?.first()?.nodeOverrideNames?.sorted())\n  }\n\n  @Test\n  @UiThreadTest\n  fun nodeOverridesTest() {\n    val testValue = listOf(ModelNodeOverride.Builder(\"node1\").orientation(listOf(0.0, 0.0, 45.0)).build())\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .nodeOverrides(testValue)\n      .build()\n\n    source.models(listOf(model))\n\n    assertEquals(testValue, source.models?.first()?.nodeOverrides)\n  }\n\n  @Test\n  @UiThreadTest\n  fun nodeOverridesAfterBindTest() {\n    val testValue = listOf(ModelNodeOverride.Builder(\"node1\").orientation(listOf(0.0, 0.0, 45.0)).build())\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .build()\n\n    source.models(listOf(model))\n\n    model.nodeOverrides(testValue)\n\n    assertEquals(testValue, source.models?.first()?.nodeOverrides)\n  }\n\n  @Test\n  @UiThreadTest\n  fun orientationTest() {\n    val testValue = listOf(0.0, 0.0, 90.0)\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(testValue)\n      .build()\n\n    source.models(listOf(model))\n\n    assertEquals(testValue, source.models?.first()?.orientation)\n  }\n\n  @Test\n  @UiThreadTest\n  fun orientationAfterBindTest() {\n    val testValue = listOf(0.0, 0.0, 90.0)\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .build()\n\n    source.models(listOf(model))\n\n    model.orientation(testValue)\n\n    assertEquals(testValue, source.models?.first()?.orientation)\n  }\n\n  @Test\n  @UiThreadTest\n  fun positionTest() {\n    val testValue = listOf(122.4, 37.8)\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .position(testValue)\n      .build()\n\n    source.models(listOf(model))\n\n    assertEquals(testValue, source.models?.first()?.position)\n  }\n\n  @Test\n  @UiThreadTest\n  fun positionAfterBindTest() {\n    val testValue = listOf(122.4, 37.8)\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .build()\n\n    source.models(listOf(model))\n\n    model.position(testValue)\n\n    assertEquals(testValue, source.models?.first()?.position)\n  }\n\n  @Test\n  @UiThreadTest\n  fun uriTest() {\n    val testValue = \"https://example.com/model.glb\"\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .uri(testValue)\n      .build()\n\n    source.models(listOf(model))\n\n    assertEquals(testValue, source.models?.first()?.uri)\n  }\n\n  @Test\n  @UiThreadTest\n  fun uriAfterBindTest() {\n    val testValue = \"https://example.com/model.glb\"\n    val source = modelSource(SOURCE_ID) { url(TEST_URI) }\n    setupSource(source)\n\n    val model = ModelSourceModel.Builder(\"test-id\")\n      .uri(\"https://example.com/model.glb\")\n      .position(listOf(0.0, 0.0))\n      .orientation(listOf(0.0, 0.0, 0.0))\n      .build()\n\n    source.models(listOf(model))\n\n    model.uri(testValue)\n\n    assertEquals(testValue, source.models?.first()?.uri)\n  }\n\n  private companion object {\n    const val SOURCE_ID = \"testId\"\n    const val TEST_URI = \"https://example.com/model.glb\"\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/sources/generated/ModelSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.sources.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Ignore\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for ModelSource.\n */\n@RunWith(AndroidJUnit4::class)\nclass ModelSourceTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun urlTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(TEST_URI))\n      batched(true)\n      url(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  fun urlAfterBindTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(TEST_URI))\n      batched(true)\n    }\n    setupSource(testSource)\n    testSource.url(\"abc\")\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(TEST_URI))\n      batched(true)\n      maxzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomAfterBindTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(TEST_URI))\n      batched(true)\n    }\n    setupSource(testSource)\n    testSource.maxzoom(1L)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(TEST_URI))\n      batched(true)\n      minzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomAfterBindTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(TEST_URI))\n      batched(true)\n    }\n    setupSource(testSource)\n    testSource.minzoom(1L)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun tilesTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(TEST_URI))\n      batched(true)\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tilesAfterBindTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(TEST_URI))\n      batched(true)\n    }\n    setupSource(testSource)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelsTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n      models(listOf(ModelSourceModel.Builder(\"model\").uri(\"something://somewhere\").orientation(listOf(0.0, 0.0, 0.0)).position(listOf(0.0, 0.0)).build()))\n    }\n    setupSource(testSource)\n  }\n\n  @Test\n  @UiThreadTest\n  fun modelsAfterBindTest() {\n    val testSource = modelSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.models(listOf(ModelSourceModel.Builder(\"model\").uri(\"something://somewhere\").orientation(listOf(0.0, 0.0, 0.0)).position(listOf(0.0, 0.0)).build()))\n  }\n\n  // Default source properties getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultSourcePropertiesTest() {\n    assertNotNull(\"defaultMaxzoom should not be null\", ModelSource.defaultMaxzoom)\n    assertNotNull(\"defaultMinzoom should not be null\", ModelSource.defaultMinzoom)\n  }\n\n  private companion object {\n    const val TEST_URI = \"https://raw.githubusercontent.com/mapbox/mapbox-gl-native-android/master/MapboxGLAndroidSDKTestApp/src/main/assets/earthquakes.geojson\"\n    const val SOURCE_ID = \"testId\"\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/sources/generated/RasterArraySourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.sources.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Ignore\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for RasterArraySource.\n */\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\nclass RasterArraySourceTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun urlTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n      url(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  fun urlAfterBindTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.url(\"abc\")\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun tilesTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tilesAfterBindTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun boundsTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n      bounds(listOf(0.0, 1.0, 2.0, 3.0))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0), testSource.bounds)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n      minzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomAfterBindTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.minzoom(1L)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n      maxzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomAfterBindTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.maxzoom(1L)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileSizeTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n      tileSize(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.tileSize)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun attributionTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n      attribution(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.attribution)\n  }\n\n  @Test\n  @UiThreadTest\n  fun volatileTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n      volatile(true)\n    }\n    setupSource(testSource)\n    assertEquals(true, testSource.volatile)\n  }\n\n  @Test\n  @UiThreadTest\n  fun volatileAfterBindTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.volatile(true)\n    assertEquals(true, testSource.volatile)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    setupSource(testSource)\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetAfterBindTest() {\n    val testSource = rasterArraySource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  // Default source properties getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultSourcePropertiesTest() {\n    assertNotNull(\"defaultMinzoom should not be null\", RasterArraySource.defaultMinzoom)\n    assertNotNull(\"defaultMaxzoom should not be null\", RasterArraySource.defaultMaxzoom)\n    assertNotNull(\"defaultVolatile should not be null\", RasterArraySource.defaultVolatile)\n  }\n\n  private companion object {\n    const val TEST_URI = \"https://raw.githubusercontent.com/mapbox/mapbox-gl-native-android/master/MapboxGLAndroidSDKTestApp/src/main/assets/earthquakes.geojson\"\n    const val SOURCE_ID = \"testId\"\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/sources/generated/RasterDemSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.sources.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Ignore\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for RasterDemSource.\n */\n@RunWith(AndroidJUnit4::class)\nclass RasterDemSourceTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun urlTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      url(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  fun urlAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.url(\"abc\")\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun tilesTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tilesAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun boundsTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      bounds(listOf(0.0, 1.0, 2.0, 3.0))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0), testSource.bounds)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      minzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.minzoom(1L)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      maxzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.maxzoom(1L)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileSizeTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileSize(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.tileSize)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun attributionTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      attribution(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.attribution)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun encodingTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      encoding(Encoding.TERRARIUM)\n    }\n    setupSource(testSource)\n    assertEquals(Encoding.TERRARIUM, testSource.encoding)\n  }\n\n  @Test\n  @UiThreadTest\n  fun volatileTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      volatile(true)\n    }\n    setupSource(testSource)\n    assertEquals(true, testSource.volatile)\n  }\n\n  @Test\n  @UiThreadTest\n  fun volatileAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.volatile(true)\n    assertEquals(true, testSource.volatile)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      prefetchZoomDelta(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.prefetchZoomDelta(1L)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    setupSource(testSource)\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minimumTileUpdateIntervalTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      minimumTileUpdateInterval(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.minimumTileUpdateInterval)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minimumTileUpdateIntervalAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.minimumTileUpdateInterval(1.0)\n    assertEquals(1.0, testSource.minimumTileUpdateInterval)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxOverscaleFactorForParentTilesTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      maxOverscaleFactorForParentTiles(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.maxOverscaleFactorForParentTiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxOverscaleFactorForParentTilesAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.maxOverscaleFactorForParentTiles(1L)\n    assertEquals(1L, testSource.maxOverscaleFactorForParentTiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileRequestsDelayTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileRequestsDelay(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.tileRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileRequestsDelayAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileRequestsDelay(1.0)\n    assertEquals(1.0, testSource.tileRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileNetworkRequestsDelayTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileNetworkRequestsDelay(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.tileNetworkRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileNetworkRequestsDelayAfterBindTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileNetworkRequestsDelay(1.0)\n    assertEquals(1.0, testSource.tileNetworkRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileSetTest() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileSet(TileSet.Builder(\"abc\", listOf(\"a\", \"b\", \"c\")).build())\n    }\n    setupSource(testSource)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileSetTestDsl() {\n    val testSource = rasterDemSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileSet(\"abc\", listOf(\"a\", \"b\", \"c\")) {\n        attribution(\"testattribution\")\n      }\n    }\n    setupSource(testSource)\n  }\n\n  // Default source properties getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultSourcePropertiesTest() {\n    assertNotNull(\"defaultMinzoom should not be null\", RasterDemSource.defaultMinzoom)\n    assertNotNull(\"defaultMaxzoom should not be null\", RasterDemSource.defaultMaxzoom)\n    assertNotNull(\"defaultEncoding should not be null\", RasterDemSource.defaultEncoding)\n    assertNotNull(\"defaultVolatile should not be null\", RasterDemSource.defaultVolatile)\n    assertNotNull(\"defaultPrefetchZoomDelta should not be null\", RasterDemSource.defaultPrefetchZoomDelta)\n    assertNotNull(\"defaultMinimumTileUpdateInterval should not be null\", RasterDemSource.defaultMinimumTileUpdateInterval)\n    assertNotNull(\"defaultTileRequestsDelay should not be null\", RasterDemSource.defaultTileRequestsDelay)\n    assertNotNull(\"defaultTileNetworkRequestsDelay should not be null\", RasterDemSource.defaultTileNetworkRequestsDelay)\n  }\n\n  private companion object {\n    const val TEST_URI = \"https://raw.githubusercontent.com/mapbox/mapbox-gl-native-android/master/MapboxGLAndroidSDKTestApp/src/main/assets/earthquakes.geojson\"\n    const val SOURCE_ID = \"testId\"\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/sources/generated/RasterSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.sources.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Ignore\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for RasterSource.\n */\n@RunWith(AndroidJUnit4::class)\nclass RasterSourceTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun urlTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      url(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  fun urlAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.url(\"abc\")\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun tilesTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tilesAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun boundsTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      bounds(listOf(0.0, 1.0, 2.0, 3.0))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0), testSource.bounds)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      minzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.minzoom(1L)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      maxzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.maxzoom(1L)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileSizeTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileSize(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.tileSize)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun schemeTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      scheme(Scheme.XYZ)\n    }\n    setupSource(testSource)\n    assertEquals(Scheme.XYZ, testSource.scheme)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun attributionTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      attribution(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.attribution)\n  }\n\n  @Test\n  @UiThreadTest\n  fun volatileTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      volatile(true)\n    }\n    setupSource(testSource)\n    assertEquals(true, testSource.volatile)\n  }\n\n  @Test\n  @UiThreadTest\n  fun volatileAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.volatile(true)\n    assertEquals(true, testSource.volatile)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      prefetchZoomDelta(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.prefetchZoomDelta(1L)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    setupSource(testSource)\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minimumTileUpdateIntervalTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      minimumTileUpdateInterval(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.minimumTileUpdateInterval)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minimumTileUpdateIntervalAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.minimumTileUpdateInterval(1.0)\n    assertEquals(1.0, testSource.minimumTileUpdateInterval)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxOverscaleFactorForParentTilesTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      maxOverscaleFactorForParentTiles(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.maxOverscaleFactorForParentTiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxOverscaleFactorForParentTilesAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.maxOverscaleFactorForParentTiles(1L)\n    assertEquals(1L, testSource.maxOverscaleFactorForParentTiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileRequestsDelayTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileRequestsDelay(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.tileRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileRequestsDelayAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileRequestsDelay(1.0)\n    assertEquals(1.0, testSource.tileRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileNetworkRequestsDelayTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileNetworkRequestsDelay(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.tileNetworkRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileNetworkRequestsDelayAfterBindTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileNetworkRequestsDelay(1.0)\n    assertEquals(1.0, testSource.tileNetworkRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileSetTest() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileSet(TileSet.Builder(\"abc\", listOf(\"a\", \"b\", \"c\")).build())\n    }\n    setupSource(testSource)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileSetTestDsl() {\n    val testSource = rasterSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileSet(\"abc\", listOf(\"a\", \"b\", \"c\")) {\n        attribution(\"testattribution\")\n      }\n    }\n    setupSource(testSource)\n  }\n\n  // Default source properties getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultSourcePropertiesTest() {\n    assertNotNull(\"defaultMinzoom should not be null\", RasterSource.defaultMinzoom)\n    assertNotNull(\"defaultMaxzoom should not be null\", RasterSource.defaultMaxzoom)\n    assertNotNull(\"defaultScheme should not be null\", RasterSource.defaultScheme)\n    assertNotNull(\"defaultVolatile should not be null\", RasterSource.defaultVolatile)\n    assertNotNull(\"defaultPrefetchZoomDelta should not be null\", RasterSource.defaultPrefetchZoomDelta)\n    assertNotNull(\"defaultMinimumTileUpdateInterval should not be null\", RasterSource.defaultMinimumTileUpdateInterval)\n    assertNotNull(\"defaultTileRequestsDelay should not be null\", RasterSource.defaultTileRequestsDelay)\n    assertNotNull(\"defaultTileNetworkRequestsDelay should not be null\", RasterSource.defaultTileNetworkRequestsDelay)\n  }\n\n  private companion object {\n    const val TEST_URI = \"https://raw.githubusercontent.com/mapbox/mapbox-gl-native-android/master/MapboxGLAndroidSDKTestApp/src/main/assets/earthquakes.geojson\"\n    const val SOURCE_ID = \"testId\"\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/sources/generated/VectorSourceTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.sources.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.TileCacheBudget\nimport com.mapbox.maps.TileCacheBudgetInMegabytes\nimport com.mapbox.maps.extension.style.sources.TileSet\nimport com.mapbox.maps.extension.style.sources.generated.*\nimport com.mapbox.maps.extension.style.types.PromoteId\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Ignore\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for VectorSource.\n */\n@RunWith(AndroidJUnit4::class)\nclass VectorSourceTest : BaseStyleTest() {\n\n  @Test\n  @UiThreadTest\n  fun urlTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      url(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  fun urlAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.url(\"abc\")\n    assertEquals(\"abc\", testSource.url)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun tilesTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      tiles(listOf(\"a\", \"b\", \"c\"))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tilesAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tiles(listOf(\"a\", \"b\", \"c\"))\n    assertEquals(listOf(\"a\", \"b\", \"c\"), testSource.tiles)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun boundsTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      bounds(listOf(0.0, 1.0, 2.0, 3.0))\n    }\n    setupSource(testSource)\n    assertEquals(listOf(0.0, 1.0, 2.0, 3.0), testSource.bounds)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun schemeTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      scheme(Scheme.XYZ)\n    }\n    setupSource(testSource)\n    assertEquals(Scheme.XYZ, testSource.scheme)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      minzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minzoomAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.minzoom(1L)\n    assertEquals(1L, testSource.minzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      maxzoom(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxzoomAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.maxzoom(1L)\n    assertEquals(1L, testSource.maxzoom)\n  }\n\n  @Test\n  @UiThreadTest\n  @Ignore(\"https://github.com/mapbox/mapbox-maps-android/issues/499\")\n  fun attributionTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      attribution(\"abc\")\n    }\n    setupSource(testSource)\n    assertEquals(\"abc\", testSource.attribution)\n  }\n\n  @Test\n  @UiThreadTest\n  fun promoteIdTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      promoteId(PromoteId(propertyName = \"abc\"))\n    }\n    setupSource(testSource)\n    assertEquals(PromoteId(propertyName = \"abc\"), testSource.promoteId)\n  }\n\n  @Test\n  @UiThreadTest\n  fun volatileTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      volatile(true)\n    }\n    setupSource(testSource)\n    assertEquals(true, testSource.volatile)\n  }\n\n  @Test\n  @UiThreadTest\n  fun volatileAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.volatile(true)\n    assertEquals(true, testSource.volatile)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      prefetchZoomDelta(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  @Test\n  @UiThreadTest\n  fun prefetchZoomDeltaAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.prefetchZoomDelta(1L)\n    assertEquals(1L, testSource.prefetchZoomDelta)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    }\n    setupSource(testSource)\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileCacheBudgetAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileCacheBudget(TileCacheBudget(TileCacheBudgetInMegabytes(100)))\n    val tileCacheBudget = testSource.tileCacheBudget!!\n    assertEquals(TileCacheBudget.Type.TILE_CACHE_BUDGET_IN_MEGABYTES, tileCacheBudget.typeInfo)\n    assertEquals(100L, tileCacheBudget.tileCacheBudgetInMegabytes.size)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minimumTileUpdateIntervalTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      minimumTileUpdateInterval(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.minimumTileUpdateInterval)\n  }\n\n  @Test\n  @UiThreadTest\n  fun minimumTileUpdateIntervalAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.minimumTileUpdateInterval(1.0)\n    assertEquals(1.0, testSource.minimumTileUpdateInterval)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxOverscaleFactorForParentTilesTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      maxOverscaleFactorForParentTiles(1L)\n    }\n    setupSource(testSource)\n    assertEquals(1L, testSource.maxOverscaleFactorForParentTiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun maxOverscaleFactorForParentTilesAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.maxOverscaleFactorForParentTiles(1L)\n    assertEquals(1L, testSource.maxOverscaleFactorForParentTiles)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileRequestsDelayTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileRequestsDelay(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.tileRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileRequestsDelayAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileRequestsDelay(1.0)\n    assertEquals(1.0, testSource.tileRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileNetworkRequestsDelayTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileNetworkRequestsDelay(1.0)\n    }\n    setupSource(testSource)\n    assertEquals(1.0, testSource.tileNetworkRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileNetworkRequestsDelayAfterBindTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n    }\n    setupSource(testSource)\n    testSource.tileNetworkRequestsDelay(1.0)\n    assertEquals(1.0, testSource.tileNetworkRequestsDelay)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileSetTest() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileSet(TileSet.Builder(\"abc\", listOf(\"a\", \"b\", \"c\")).build())\n    }\n    setupSource(testSource)\n  }\n\n  @Test\n  @UiThreadTest\n  fun tileSetTestDsl() {\n    val testSource = vectorSource(SOURCE_ID) {\n      url(TEST_URI)\n      tileSet(\"abc\", listOf(\"a\", \"b\", \"c\")) {\n        attribution(\"testattribution\")\n      }\n    }\n    setupSource(testSource)\n  }\n\n  // Default source properties getter tests\n\n  @Test\n  @UiThreadTest\n  fun defaultSourcePropertiesTest() {\n    assertNotNull(\"defaultScheme should not be null\", VectorSource.defaultScheme)\n    assertNotNull(\"defaultMinzoom should not be null\", VectorSource.defaultMinzoom)\n    assertNotNull(\"defaultMaxzoom should not be null\", VectorSource.defaultMaxzoom)\n    assertNotNull(\"defaultVolatile should not be null\", VectorSource.defaultVolatile)\n    assertNotNull(\"defaultPrefetchZoomDelta should not be null\", VectorSource.defaultPrefetchZoomDelta)\n    assertNotNull(\"defaultMinimumTileUpdateInterval should not be null\", VectorSource.defaultMinimumTileUpdateInterval)\n    assertNotNull(\"defaultTileRequestsDelay should not be null\", VectorSource.defaultTileRequestsDelay)\n    assertNotNull(\"defaultTileNetworkRequestsDelay should not be null\", VectorSource.defaultTileNetworkRequestsDelay)\n  }\n\n  private companion object {\n    const val TEST_URI = \"https://raw.githubusercontent.com/mapbox/mapbox-gl-native-android/master/MapboxGLAndroidSDKTestApp/src/main/assets/earthquakes.geojson\"\n    const val SOURCE_ID = \"testId\"\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/terrain/generated/TerrainTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.testapp.style.terrain.generated\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.*\nimport com.mapbox.maps.extension.style.terrain.generated.*\nimport com.mapbox.maps.extension.style.types.transitionOptions\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for Terrain\n */\n@RunWith(AndroidJUnit4::class)\nclass TerrainTest : BaseStyleTest() {\n  private val sourceId = \"1\"\n\n  @Test\n  @UiThreadTest\n  fun exaggerationTest() {\n    val terrain = terrain(sourceId) {\n      exaggeration(1.0)\n    }\n    setupTerrain(terrain)\n    assertEquals(1.0, terrain.exaggeration!!, 1E-5)\n  }\n\n  // Add Expression Test\n  @Test\n  @UiThreadTest\n  fun exaggerationAsExpressionTest() {\n    val expression = literal(1.0)\n\n    val terrain = terrain(sourceId) {\n      exaggeration(expression)\n    }\n    setupTerrain(terrain)\n    assertEquals(1.0, terrain.exaggerationAsExpression?.contents as Double, 1E-5)\n  }\n\n  @Test\n  @UiThreadTest\n  fun exaggerationTransitionTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val terrain = terrain(sourceId) {\n      exaggerationTransition(transition)\n    }\n    setupTerrain(terrain)\n    assertEquals(transition, terrain.exaggerationTransition)\n  }\n\n  @Test\n  @UiThreadTest\n  fun exaggerationTransitionSetDslTest() {\n    val transition = transitionOptions {\n      duration(100)\n      delay(200)\n    }\n    val terrain = terrain(sourceId) {\n      exaggerationTransition {\n        duration(100)\n        delay(200)\n      }\n    }\n    setupTerrain(terrain)\n    assertEquals(transition, terrain.exaggerationTransition)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "extension-style-app/src/androidTest/java/com/mapbox/maps/testapp/style/utils/TypeUtilsTest.kt",
    "content": "package com.mapbox.maps.testapp.style.utils\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.maps.extension.style.utils.toValue\nimport com.mapbox.maps.testapp.style.BaseStyleTest\nimport org.junit.Assert.*\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic smoke tests for TypeUtils.\n */\n@RunWith(AndroidJUnit4::class)\nclass TypeUtilsTest : BaseStyleTest() {\n\n  @Test\n  fun feature_toValue() {\n    val geojson =\n      \"\"\"\n      {\n        \"type\": \"Feature\",\n        \"bbox\": [100.0, 0.0, -100.0, 105.0, 1.0, 0.0],\n        \"geometry\": {\n          \"type\": \"Point\",\n          \"coordinates\": [125.6, 10.1]\n        },\n        \"properties\": {\n          \"name\": \"Dinagat Islands\"\n        }\n      }\n      \"\"\".trimIndent()\n    val feature = Feature.fromJson(geojson)\n    assertEquals(\n      \"{\\\"type\\\":\\\"Feature\\\",\\\"bbox\\\":[100.0,0.0,-100.0,105.0,1.0,0.0],\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[125.6,10.1]},\\\"properties\\\":{\\\"name\\\":\\\"Dinagat Islands\\\"}}\",\n      feature.toValue().toString()\n    )\n  }\n\n  @Test\n  fun featureCollection_toValue() {\n    val feature = FeatureCollection.fromJson(\n      \"\"\"\n      {\n         \"type\": \"FeatureCollection\",\n         \"bbox\": [100.0, 0.0, -100.0, 105.0, 1.0, 0.0],\n         \"features\": [\n             {\n                 \"type\": \"Feature\",\n                 \"id\": \"id0\",\n                 \"geometry\": {\n                     \"type\": \"LineString\",\n                     \"coordinates\": [\n                         [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]\n                     ]\n                 },\n                 \"properties\": {\n                     \"prop0\": \"value0\",\n                     \"prop1\": \"value1\"\n                 }\n             },\n             {\n                 \"type\": \"Feature\",\n                 \"id\": \"id1\",\n                 \"geometry\": {\n                     \"type\": \"Polygon\",\n                     \"coordinates\": [\n                         [\n                             [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]\n                         ]\n                     ]\n                 },\n                 \"properties\": {\n                     \"prop0\": \"value0\",\n                     \"prop1\": \"value1\"\n                 }\n             }\n         ]\n      }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"FeatureCollection\\\",\\\"bbox\\\":[100.0,0.0,-100.0,105.0,1.0,0.0],\\\"features\\\":[{\\\"type\\\":\\\"Feature\\\",\\\"id\\\":\\\"id0\\\",\\\"geometry\\\":{\\\"type\\\":\\\"LineString\\\",\\\"coordinates\\\":[[102.0,0.0],[103.0,1.0],[104.0,0.0],[105.0,1.0]]},\\\"properties\\\":{\\\"prop0\\\":\\\"value0\\\",\\\"prop1\\\":\\\"value1\\\"}},{\\\"type\\\":\\\"Feature\\\",\\\"id\\\":\\\"id1\\\",\\\"geometry\\\":{\\\"type\\\":\\\"Polygon\\\",\\\"coordinates\\\":[[[100.0,0.0],[101.0,0.0],[101.0,1.0],[100.0,1.0],[100.0,0.0]]]},\\\"properties\\\":{\\\"prop0\\\":\\\"value0\\\",\\\"prop1\\\":\\\"value1\\\"}}]}\",\n      feature.toValue().toString()\n    )\n  }\n\n  @Test\n  fun geometry_Point_toValue() {\n    val feature = Feature.fromJson(\n      \"\"\"\n      {\n        \"type\": \"Feature\",\n        \"geometry\": {\n          \"type\": \"Point\",\n          \"coordinates\": [125.6, 10.1]\n        },\n        \"properties\": {\n          \"name\": \"Dinagat Islands\"\n        }\n      }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[125.6,10.1]}\",\n      feature.geometry()!!.toValue().toString()\n    )\n  }\n\n  @Test\n  fun geometry_LineString_toValue() {\n    val feature = Feature.fromJson(\n      \"\"\"\n        {\n          \"type\": \"Feature\",\n          \"geometry\": {\n          \"type\": \"LineString\",\n          \"coordinates\": [\n           [100.0, 0.0], [101.0, 1.0]\n            ]\n          },\n          \"properties\": {\n          \"name\": \"Dinagat Islands\"\n          }\n        }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"LineString\\\",\\\"coordinates\\\":[[100.0,0.0],[101.0,1.0]]}\",\n      feature.geometry()!!.toValue().toString()\n    )\n  }\n\n  @Test\n  fun geometry_Polygon_toValue() {\n    val feature = Feature.fromJson(\n      \"\"\"\n      {\n        \"type\": \"Feature\",\n        \"geometry\": {\n          \"type\": \"Polygon\",\n          \"coordinates\": [\n             [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]\n          ]\n        },\n        \"properties\": {\n          \"name\": \"Dinagat Islands\"\n        }\n      }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"Polygon\\\",\\\"coordinates\\\":[[[100.0,0.0],[101.0,0.0],[101.0,1.0],[100.0,1.0],[100.0,0.0]]]}\",\n      feature.geometry()!!.toValue().toString()\n    )\n  }\n\n  @Test\n  fun geometry_PolygonWithHoles_toValue() {\n    val feature = Feature.fromJson(\n      \"\"\"\n      {\n        \"type\": \"Feature\",\n        \"geometry\": {\n          \"type\": \"Polygon\",\n          \"coordinates\": [\n           [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],\n           [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]\n          ]\n        },\n        \"properties\": {\n          \"name\": \"Dinagat Islands\"\n        }\n      }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"Polygon\\\",\\\"coordinates\\\":[[[100.0,0.0],[101.0,0.0],[101.0,1.0],[100.0,1.0],[100.0,0.0]],[[100.2,0.2],[100.8,0.2],[100.8,0.8],[100.2,0.8],[100.2,0.2]]]}\",\n      feature.geometry()!!.toValue().toString()\n    )\n  }\n\n  @Test\n  fun geometry_MultiPoint_toValue() {\n    val feature = Feature.fromJson(\n      \"\"\"\n      {\n        \"type\": \"Feature\",\n        \"geometry\": {\n          \"type\": \"MultiPoint\",\n          \"coordinates\": [\n           [100.0, 0.0], [101.0, 1.0]\n          ]\n        },\n        \"properties\": {\n          \"name\": \"Dinagat Islands\"\n        }\n      }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"MultiPoint\\\",\\\"coordinates\\\":[[100.0,0.0],[101.0,1.0]]}\",\n      feature.geometry()!!.toValue().toString()\n    )\n  }\n\n  @Test\n  fun geometry_MultiLineString_toValue() {\n    val feature = Feature.fromJson(\n      \"\"\"\n      {\n        \"type\": \"Feature\",\n        \"geometry\": {\n          \"type\": \"MultiLineString\",\n          \"coordinates\": [\n            [ [100.0, 0.0], [101.0, 1.0] ],\n            [ [102.0, 2.0], [103.0, 3.0] ]\n           ]\n        },\n        \"properties\": {\n          \"name\": \"Dinagat Islands\"\n        }\n      }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"MultiLineString\\\",\\\"coordinates\\\":[[[100.0,0.0],[101.0,1.0]],[[102.0,2.0],[103.0,3.0]]]}\",\n      feature.geometry()!!.toValue().toString()\n    )\n  }\n\n  @Test\n  fun geometry_MultiPolygon_toValue() {\n    val feature = Feature.fromJson(\n      \"\"\"\n      {\n        \"type\": \"Feature\",\n        \"geometry\": {\n          \"type\": \"MultiPolygon\",\n          \"coordinates\": [\n        [\n            [ [102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0] ]\n        ],\n        [\n            [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],\n            [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]\n        ]\n    ]\n        },\n        \"properties\": {\n          \"name\": \"Dinagat Islands\"\n        }\n      }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[102.0,2.0],[103.0,2.0],[103.0,3.0],[102.0,3.0],[102.0,2.0]]],[[[100.0,0.0],[101.0,0.0],[101.0,1.0],[100.0,1.0],[100.0,0.0]],[[100.2,0.2],[100.8,0.2],[100.8,0.8],[100.2,0.8],[100.2,0.2]]]]}\",\n      feature.geometry()!!.toValue().toString()\n    )\n  }\n\n  @Test\n  fun geometry_GeometryCollection_toValue() {\n    val feature = Feature.fromJson(\n      \"\"\"\n      {\n        \"type\": \"Feature\",\n        \"geometry\": {\n          \"type\": \"GeometryCollection\",\n          \"geometries\": [\n              {\n                  \"type\": \"Point\",\n                  \"coordinates\": [100.0, 0.0]\n              },\n              {\n                  \"type\": \"LineString\",\n                  \"coordinates\": [\n                      [101.0, 0.0], [102.0, 1.0]\n                  ]\n              }\n          ]\n        },\n        \"properties\": {\n          \"name\": \"Dinagat Islands\"\n        }\n      }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"GeometryCollection\\\",\\\"geometries\\\":[{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[100.0,0.0]},{\\\"type\\\":\\\"LineString\\\",\\\"coordinates\\\":[[101.0,0.0],[102.0,1.0]]}]}\",\n      feature.geometry()!!.toValue().toString()\n    )\n  }\n\n  @Test\n  fun geometry_NestedGeometryCollection_toValue() {\n    val feature = Feature.fromJson(\n      \"\"\"\n      {\n        \"type\": \"Feature\",\n        \"geometry\": {\n          \"type\": \"GeometryCollection\",\n          \"geometries\": [\n              {\n                  \"type\": \"Point\",\n                  \"coordinates\": [100.0, 0.0]\n              },\n              {\n                  \"type\": \"LineString\",\n                  \"coordinates\": [\n                      [101.0, 0.0], [102.0, 1.0]\n                  ]\n              },\n              {\n                  \"type\": \"GeometryCollection\",\n                  \"geometries\": [\n                      {\n                          \"type\": \"Point\",\n                          \"coordinates\": [100.0, 0.0]\n                      },\n                      {\n                          \"type\": \"LineString\",\n                          \"coordinates\": [\n                              [101.0, 0.0], [102.0, 1.0]\n                          ]\n                      }\n                  ]\n                }\n          ]\n        },\n        \"properties\": {\n          \"name\": \"Dinagat Islands\"\n        }\n      }\n      \"\"\".trimIndent()\n    )\n    assertEquals(\n      \"{\\\"type\\\":\\\"GeometryCollection\\\",\\\"geometries\\\":[{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[100.0,0.0]},{\\\"type\\\":\\\"LineString\\\",\\\"coordinates\\\":[[101.0,0.0],[102.0,1.0]]},{\\\"type\\\":\\\"GeometryCollection\\\",\\\"geometries\\\":[{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[100.0,0.0]},{\\\"type\\\":\\\"LineString\\\",\\\"coordinates\\\":[[101.0,0.0],[102.0,1.0]]}]}]}\",\n      feature.geometry()!!.toValue().toString()\n    )\n  }\n}"
  },
  {
    "path": "extension-style-app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"extension-style-app\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.AppCompat.Light.DarkActionBar\">\n        <activity android:name=\"androidx.appcompat.app.AppCompatActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "extension-style-app/src/main/java/com/mapbox/maps/testapp/style/MainActivity.kt",
    "content": "package com.mapbox.maps.testapp.style\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.Style\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate\nimport com.mapbox.maps.extension.style.layers.generated.lineLayer\nimport com.mapbox.maps.extension.style.style\n\nclass MainActivity : AppCompatActivity() {\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    val mapView = MapView(this)\n    setContentView(mapView)\n    mapView.mapboxMap.loadStyle(\n      styleExtension = style(Style.LIGHT) {\n        +lineLayer(\"line-layer\", \"line-source\") {\n          lineColor(\n            interpolate {\n              linear()\n              heatmapDensity()\n              stop {\n                literal(0)\n                rgba(33.0, 102.0, 172.0, 0.0)\n              }\n              stop {\n                literal(0.2)\n                rgb(103.0, 169.0, 207.0)\n              }\n              stop {\n                literal(0.4)\n                rgb(209.0, 229.0, 240.0)\n              }\n              stop {\n                literal(0.6)\n                rgb(253.0, 219.0, 240.0)\n              }\n              stop {\n                literal(0.8)\n                rgb(239.0, 138.0, 98.0)\n              }\n              stop {\n                literal(1)\n                rgb(178.0, 24.0, 43.0)\n              }\n            }\n          )\n        }\n      }\n    )\n  }\n}"
  },
  {
    "path": "extension-style-app/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"mapView\" type=\"id\" />\n</resources>\n"
  },
  {
    "path": "extension-style-lint-rules/.gitignore",
    "content": "/build\nlint-report.html"
  },
  {
    "path": "extension-style-lint-rules/build.gradle.kts",
    "content": "plugins {\n  id(\"java-library\")\n  id(\"kotlin\")\n  id(\"com.android.lint\")\n}\n\nlint {\n  htmlReport = true\n  htmlOutput = file(\"lint-report.html\")\n  textReport = true\n  absolutePaths = false\n  ignoreTestSources = true\n}\n\njava {\n  sourceCompatibility = JavaVersion.VERSION_11\n  targetCompatibility = JavaVersion.VERSION_11\n}\n\ndependencies {\n  compileOnly(libs.lintApi)\n  compileOnly(libs.lintChecks)\n  compileOnly(libs.kotlin)\n\n  testImplementation(libs.junit)\n  testImplementation(libs.lint)\n  testImplementation(libs.lintTests)\n  testImplementation(libs.testUtils)\n}\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}\n\ntasks.withType<Test> {\n  maxParallelForks = (Runtime.getRuntime().availableProcessors()).takeIf { it > 0 } ?: 1\n}"
  },
  {
    "path": "extension-style-lint-rules/src/main/java/com/mapbox/maps/lint/style/MapboxStyleDslDetector.kt",
    "content": "package com.mapbox.maps.lint.style\n\nimport com.android.tools.lint.client.api.UElementHandler\nimport com.android.tools.lint.detector.api.Detector\nimport com.android.tools.lint.detector.api.JavaContext\nimport org.jetbrains.uast.UElement\nimport org.jetbrains.uast.ULambdaExpression\n\n/**\n * A detector to scan through the source code and find the lambdas that applies to the Style DSL builder.\n */\nabstract class MapboxStyleDslDetector : Detector(), Detector.UastScanner {\n\n  /**\n   * Called when a Mapbox Style DSL lambda is visited\n   *\n   * @param context the Context for the file being analyzed\n   * @param lambda the lambda that's belonged to a Mapbox Style DSL builder\n   * @param receiverClass the canonical class name of the Mapbox Style DSL builder\n   */\n  abstract fun visitMapboxStyleDslLambda(\n    context: JavaContext,\n    lambda: ULambdaExpression,\n    receiverClass: String\n  )\n\n  override fun getApplicableUastTypes(): List<Class<out UElement>>? {\n    return listOf(\n      ULambdaExpression::class.java\n    )\n  }\n\n  override fun createUastHandler(context: JavaContext): UElementHandler? {\n    return object : UElementHandler() {\n      override fun visitLambdaExpression(node: ULambdaExpression) {\n        val receiverType = node.getExpressionType()?.canonicalText\n        if (receiverType?.contains(STYLE_DSL_RECEIVER_NAME) == true) {\n          visitMapboxStyleDslLambda(\n            context, node, STYLE_DSL_RECEIVER_NAME\n          )\n        }\n      }\n    }\n  }\n\n  companion object {\n    private const val STYLE_DSL_RECEIVER_NAME =\n      \"com.mapbox.maps.extension.style.StyleExtensionImpl.Builder\"\n  }\n}"
  },
  {
    "path": "extension-style-lint-rules/src/main/java/com/mapbox/maps/lint/style/StyleIssueRegistry.kt",
    "content": "package com.mapbox.maps.lint.style\n\nimport com.android.tools.lint.client.api.IssueRegistry\nimport com.android.tools.lint.client.api.Vendor\nimport com.mapbox.maps.lint.style.expressions.UnusedLiteralDetector\n\nclass StyleIssueRegistry : IssueRegistry() {\n\n  override val issues = listOf(\n    // Expression issues\n    UnusedLiteralDetector.ISSUE,\n    // TODO revisit this later; perhaps when we bump to AGP 8 and / or bump some related deps\n//    IllegalNumberOfArgumentsDetector.ISSUE,\n    // Style DSL issues\n    UnusedStyleDslDetector.ISSUE,\n  )\n\n  override val api: Int = com.android.tools.lint.detector.api.CURRENT_API\n\n  override val vendor = Vendor(\n    vendorName = \"Mapbox\",\n    identifier = \"com.mapbox.maps:style-lint\",\n    feedbackUrl = \"https://github.com/mapbox/mapbox-maps-android/issues\",\n    contact = \"https://github.com/mapbox/mapbox-maps-android\"\n  )\n}"
  },
  {
    "path": "extension-style-lint-rules/src/main/java/com/mapbox/maps/lint/style/UnusedStyleDslDetector.kt",
    "content": "package com.mapbox.maps.lint.style\n\nimport com.android.tools.lint.detector.api.*\nimport org.jetbrains.uast.*\n\n/**\n * A detector to scan through the source code and find the lambdas that applies to the Style DSL builder.\n * And find if a layer/source/light/terrain/atmosphere/projection/layer & position pair is present but\n * not added to the style.\n *\n * And it also suggest auto fix to add it to the style by prefixing `+` operator.\n */\nclass UnusedStyleDslDetector : MapboxStyleDslDetector() {\n  override fun visitMapboxStyleDslLambda(\n    context: JavaContext,\n    lambda: ULambdaExpression,\n    receiverClass: String\n  ) {\n    checkUnusedStyleDsl(context, lambda)\n  }\n\n  private fun checkUnusedStyleDsl(context: JavaContext, lambda: ULambdaExpression) {\n    // uncomment to print the expression tree within the lambda for debugging.\n    // println(\"checkUnusedLiteralsInLambda: ${lambda.asRecursiveLogString()}\")\n    val blockExpression = lambda.body as? UBlockExpression\n    blockExpression?.let {\n      for (expression in blockExpression.expressions) {\n        val type = expression.getExpressionType()?.canonicalText\n        type?.let {\n          if (isUnusedInStyleDsl(it)) {\n            context.reportIssue(\n              expression = expression,\n            )\n          }\n        }\n      }\n    }\n  }\n\n  private fun JavaContext.reportIssue(\n    expression: UExpression,\n  ) {\n    report(\n      issue = ISSUE,\n      scope = expression,\n      location = getLocation(expression),\n      message = REPORT_MESSAGE,\n      quickfixData = LintFix.create()\n        .name(\"Append with unaryPlus(+) operator\")\n        .replace()\n        .range(getRangeLocation(from = expression, fromDelta = 0, length = 1))\n        .with(\"+\" + getFirstCharOfExpression(expression))\n        .reformat(true)\n        .autoFix()\n        .build()\n    )\n  }\n\n  private fun getFirstCharOfExpression(expression: UExpression): Char {\n    val elementSource = when (expression) {\n      is UCallExpression -> {\n        expression.methodIdentifier?.name?.first() ?: expression.asSourceString().first()\n      }\n      else -> {\n        expression.asSourceString().first()\n      }\n    }\n    return elementSource\n  }\n\n  companion object {\n    private const val ISSUE_ID = \"UnusedBlockInStyleDsl\"\n    private const val BRIEF_DESCRIPTION =\n      \"This check detects unused block inside Style DSL.\"\n    private const val PRIORITY = 8\n    private const val REPORT_MESSAGE =\n      \"Unused block within Style DSL, consider adding it to the style using unaryPlus(+) operator.\"\n\n    private val LAYER_CLASS_NAME_PATTERN =\n      Regex(\"com\\\\.mapbox\\\\.maps\\\\.extension\\\\.style\\\\.layers\\\\.generated.*Layer\")\n    private val SOURCE_CLASS_NAME_PATTERN =\n      Regex(\"com\\\\.mapbox\\\\.maps\\\\.extension\\\\.style\\\\.sources\\\\.generated.*Source\")\n    private val LIGHT_CLASS_NAME_PATTERN =\n      Regex(\"com\\\\.mapbox\\\\.maps\\\\.extension\\\\.style\\\\.light\\\\.generated\\\\.Light\")\n    private val TERRAIN_CLASS_NAME_PATTERN =\n      Regex(\"com\\\\.mapbox\\\\.maps\\\\.extension\\\\.style\\\\.terrain\\\\.generated\\\\.Terrain\")\n    private val PROJECTION_CLASS_NAME_PATTERN =\n      Regex(\"com\\\\.mapbox\\\\.maps\\\\.extension\\\\.style\\\\.projection\\\\.generated\\\\.Projection\")\n    private val ATMOSPHERE_CLASS_NAME_PATTERN =\n      Regex(\"com\\\\.mapbox\\\\.maps\\\\.extension\\\\.style\\\\.atmosphere\\\\.generated\\\\.Atmosphere\")\n    private val IMAGE_CLASS_NAME_PATTERN =\n      Regex(\"com\\\\.mapbox\\\\.maps\\\\.extension\\\\.style\\\\.image\\\\.ImageExtensionImpl\")\n    private val IMAGE_NINE_PATCH_CLASS_NAME_PATTERN =\n      Regex(\"com\\\\.mapbox\\\\.maps\\\\.extension\\\\.style\\\\.image\\\\.ImageNinePatchExtensionImpl\")\n    private val LAYER_POSITION_PAIR_PATTERN =\n      Regex(\"kotlin\\\\.Pair<\\\\? extends com\\\\.mapbox\\\\.maps\\\\.extension\\\\.style\\\\.layers\\\\.Layer,\\\\? extends com\\\\.mapbox\\\\.maps\\\\.LayerPosition>\")\n    private val ALL_STYLE_DSL_CLASS_NAME_PATTERNS = listOf(\n      LAYER_CLASS_NAME_PATTERN,\n      SOURCE_CLASS_NAME_PATTERN,\n      LIGHT_CLASS_NAME_PATTERN,\n      TERRAIN_CLASS_NAME_PATTERN,\n      ATMOSPHERE_CLASS_NAME_PATTERN,\n      PROJECTION_CLASS_NAME_PATTERN,\n      IMAGE_CLASS_NAME_PATTERN,\n      IMAGE_NINE_PATCH_CLASS_NAME_PATTERN,\n      LAYER_POSITION_PAIR_PATTERN\n    )\n\n    private fun isUnusedInStyleDsl(className: String): Boolean {\n      return ALL_STYLE_DSL_CLASS_NAME_PATTERNS.any { it.matches(className) }\n    }\n\n    private val IMPLEMENTATION = Implementation(\n      UnusedStyleDslDetector::class.java, Scope.JAVA_FILE_SCOPE\n    )\n\n    @JvmField\n    val ISSUE = Issue.create(\n      id = ISSUE_ID,\n      briefDescription = BRIEF_DESCRIPTION,\n      explanation = REPORT_MESSAGE,\n      category = Category.CORRECTNESS,\n      priority = PRIORITY,\n      severity = Severity.FATAL,\n      implementation = IMPLEMENTATION\n    ).setAndroidSpecific(true)\n  }\n}"
  },
  {
    "path": "extension-style-lint-rules/src/main/java/com/mapbox/maps/lint/style/expressions/IllegalNumberOfArgumentsDetector.kt",
    "content": "package com.mapbox.maps.lint.style.expressions\n\nimport com.android.tools.lint.detector.api.*\nimport org.jetbrains.uast.UBlockExpression\nimport org.jetbrains.uast.UCallExpression\nimport org.jetbrains.uast.ULambdaExpression\n\n/**\n * A detector that scans through the source code and find the lambdas that applies to the ExpressionBuilder,\n * find the lambda's parent function name as the expression name, and then loop through direct expression\n * function calls to the ExpressionBuilder under the lambda, and count the number of arguments for the parent\n * Mapbox expression. In the end, we compares it to the expected number of arguments map, and report errors\n * for the incorrect number of arguments for the given expression.\n */\nclass IllegalNumberOfArgumentsDetector : MapboxExpressionDslDetector() {\n  override fun visitMapboxExpressionLambda(\n    context: JavaContext,\n    lambda: ULambdaExpression,\n    receiverClass: String\n  ) {\n    if (isGenericExpressionClass(receiverClass)) {\n      validateNumberOfArgumentsInExpression(context, lambda)\n    }\n  }\n\n  private fun validateNumberOfArgumentsInExpression(\n    context: JavaContext,\n    lambda: ULambdaExpression\n  ) {\n    // uncomment to print the expression tree within the lambda for debugging.\n    // println(\"validateNumberOfArgumentsInExpression: ${lambda.asSourceString()}\")\n    val parentExpression = lambda.uastParent as? UCallExpression\n    val parentExpressionName = parentExpression?.methodName\n    val body = lambda.body\n    if (body is UBlockExpression) {\n      val argumentCount = countNumberOfArguments(body)\n      // println(\"*** Number of argument for $parentExpressionName: $argumentCount\")\n      if (parentExpressionName != null && !validateNumberOfArguments(\n          expressionName = parentExpressionName,\n          argumentCount = argumentCount\n        )\n      ) {\n        context.report(\n          issue = ISSUE,\n          scope = parentExpression,\n          location = context.getLocation(parentExpression),\n          message = getReportMessage(parentExpressionName, argumentCount),\n        )\n      }\n    }\n  }\n\n  private fun countNumberOfArguments(blockExpression: UBlockExpression): Int {\n    return blockExpression.expressions.filterIsInstance<UCallExpression>().filter {\n      it.isGenericExpression()\n    }.fold(initial = 0) { acc, uCallExpression ->\n      // count stop expression as 2 arguments as it simply wraps a pair\n      acc + if (uCallExpression.isStopExpression()) 2 else 1\n    }\n  }\n\n  private fun UCallExpression.isStopExpression(): Boolean {\n    return isGenericExpressionClass(receiverType?.canonicalText) && this.methodName == \"stop\"\n  }\n\n  private fun UCallExpression.isGenericExpression(): Boolean {\n    return isGenericExpressionClass(this.receiverType?.canonicalText)\n  }\n\n  companion object {\n    private const val ISSUE_ID = \"IncorrectNumberOfArgumentsInExpression\"\n    private const val BRIEF_DESCRIPTION =\n      \"This check detects incorrect number of expressions within a code block that's applied to a given expression.\"\n    private const val PRIORITY = 8\n\n    private const val REPORT_MESSAGE = \"Incorrect number of arguments for this Expression.\"\n\n    private val IMPLEMENTATION = Implementation(\n      IllegalNumberOfArgumentsDetector::class.java, Scope.JAVA_FILE_SCOPE\n    )\n\n    // A map of expression name and the expected number of arguments for this expression\n    // * Use -1 to represent odd number is required\n    // * Use -2 to represent even number is required\n    internal const val ODD_NUMBER = -1\n    internal const val EVEN_NUMBER = -2\n    internal val ARGUMENT_COUNT_MAP = hashMapOf(\n      // Types https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#types\n      \"array\" to listOf(1, 2, 3),\n      // Ignore collator checker here, as we provide a specific CollatorBuilder\n      // \"collator\" to listOf(1),\n      \"image\" to listOf(1),\n      // Ignore numberFormat checker here, as we provide a specific NumberFormatBuilder\n      // \"numberFormat\" to listOf(2),\n      \"toBoolean\" to listOf(1),\n      \"toString\" to listOf(1),\n      \"typeofExpression\" to listOf(1),\n      // Feature data https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#feature-data\n      \"featureState\" to listOf(1),\n      // Lookup https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#lookup\n      \"at\" to listOf(2),\n      \"get\" to listOf(1, 2),\n      \"has\" to listOf(1, 2),\n      \"inExpression\" to listOf(2),\n      \"indexOf\" to listOf(2, 3),\n      \"length\" to listOf(1),\n      \"slice\" to listOf(2, 3),\n      // Decision https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#decision\n      \"not\" to listOf(1),\n      \"neq\" to listOf(2, 3),\n      \"less\" to listOf(2, 3),\n      \"lt\" to listOf(2, 3),\n      \"lte\" to listOf(2, 3),\n      \"eq\" to listOf(2, 3),\n      \"gt\" to listOf(2, 3),\n      \"gte\" to listOf(2, 3),\n      \"switchCase\" to listOf(ODD_NUMBER),\n      \"match\" to listOf(EVEN_NUMBER),\n      \"within\" to listOf(1),\n      // Ramps, scales, curves https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#ramps-scales-curves\n      \"interpolate\" to listOf(EVEN_NUMBER),\n      \"step\" to listOf(EVEN_NUMBER),\n      // Variable binding https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#variable-binding\n      \"varExpression\" to listOf(1),\n      // String https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#string\n      \"downcase\" to listOf(1),\n      \"isSupportedScript\" to listOf(1),\n      \"resolvedLocale\" to listOf(1),\n      \"upcase\" to listOf(1),\n      // Color https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#color\n      \"rgb\" to listOf(3),\n      \"rgba\" to listOf(4),\n      \"toRgba\" to listOf(1),\n      // Math https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#math\n      \"subtract\" to listOf(1, 2),\n      \"division\" to listOf(2),\n      \"mod\" to listOf(2),\n      \"pow\" to listOf(2),\n      \"abs\" to listOf(1),\n      \"acos\" to listOf(1),\n      \"asin\" to listOf(1),\n      \"atan\" to listOf(1),\n      \"ceil\" to listOf(1),\n      \"cos\" to listOf(1),\n      \"distance\" to listOf(1),\n      \"floor\" to listOf(1),\n      \"ln\" to listOf(1),\n      \"log10\" to listOf(1),\n      \"log2\" to listOf(1),\n      \"round\" to listOf(1),\n      \"sin\" to listOf(1),\n      \"sqrt\" to listOf(1),\n      \"tan\" to listOf(1),\n      // stop expression that groups 2 argument as a pair\n      \"stop\" to listOf(2),\n    )\n\n    private fun validateNumberOfArguments(expressionName: String, argumentCount: Int): Boolean {\n      val expectedNumberOfArguments: List<Int> = ARGUMENT_COUNT_MAP[expressionName] ?: return true\n      return if (expectedNumberOfArguments.first() >= 0) {\n        argumentCount in expectedNumberOfArguments\n      } else if (expectedNumberOfArguments.first() == ODD_NUMBER) {\n        argumentCount % 2 == 1\n      } else if (expectedNumberOfArguments.first() == EVEN_NUMBER) {\n        argumentCount % 2 == 0\n      } else {\n        // If the expectedNumberOfArguments is below -2, it's undefined use case, silently skip\n        true\n      }\n    }\n\n    internal fun getReportMessage(\n      expressionName: String,\n      actualNumberOfArguments: Int,\n    ): String {\n      val expectedNumberOfArguments = ARGUMENT_COUNT_MAP[expressionName]\n      val expectedString = if (expectedNumberOfArguments?.first() == ODD_NUMBER) {\n        \"an odd number\"\n      } else if (expectedNumberOfArguments?.first() == EVEN_NUMBER) {\n        \"an even number\"\n      } else if (expectedNumberOfArguments?.isNotEmpty() == true) {\n        expectedNumberOfArguments.joinToString(separator = \" or \")\n      } else {\n        \"unknown\"\n      }\n      return \"Incorrect number of expressions within $expressionName Expression: expected $expectedString, but $actualNumberOfArguments was found.\"\n    }\n\n    @JvmField\n    val ISSUE = Issue.create(\n      id = ISSUE_ID,\n      briefDescription = BRIEF_DESCRIPTION,\n      explanation = REPORT_MESSAGE,\n      category = Category.CORRECTNESS,\n      priority = PRIORITY,\n      severity = Severity.FATAL,\n      implementation = IMPLEMENTATION\n    ).setAndroidSpecific(true)\n  }\n}"
  },
  {
    "path": "extension-style-lint-rules/src/main/java/com/mapbox/maps/lint/style/expressions/MapboxExpressionDslDetector.kt",
    "content": "package com.mapbox.maps.lint.style.expressions\n\nimport com.android.tools.lint.client.api.UElementHandler\nimport com.android.tools.lint.detector.api.Detector\nimport com.android.tools.lint.detector.api.JavaContext\nimport org.jetbrains.uast.UElement\nimport org.jetbrains.uast.ULambdaExpression\n\n/**\n * A detector to scan through the source code and find the lambdas that applies to the ExpressionBuilder.\n */\nabstract class MapboxExpressionDslDetector : Detector(), Detector.UastScanner {\n\n  /**\n   * Called when a Mapbox Expression lambda is visited\n   *\n   * @param context the Context for the file being analyzed\n   * @param lambda the lambda that's belonged to a Mapbox Expression builder\n   * @param receiverClass the canonical class name of the Mapbox Expression builder\n   */\n  abstract fun visitMapboxExpressionLambda(\n    context: JavaContext,\n    lambda: ULambdaExpression,\n    receiverClass: String\n  )\n\n  override fun getApplicableUastTypes(): List<Class<out UElement>>? {\n    return listOf(\n      ULambdaExpression::class.java\n    )\n  }\n\n  override fun createUastHandler(context: JavaContext): UElementHandler? {\n    return object : UElementHandler() {\n      override fun visitLambdaExpression(node: ULambdaExpression) {\n        val receiverType = node.getExpressionType()?.canonicalText\n        for (name in ALL_EXPRESSION_CLASS_NAME_LIST) {\n          if (receiverType?.contains(name) == true) {\n            visitMapboxExpressionLambda(context, node, name)\n          }\n        }\n      }\n    }\n  }\n\n  companion object {\n    const val EXPRESSION_BUILDER_CLASS_NAME =\n      \"com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder\"\n    const val INTERPOLATOR_BUILDER_CLASS_NAME =\n      \"com.mapbox.maps.extension.style.expressions.generated.Expression.InterpolatorBuilder\"\n    const val NUMBER_FORMAT_BUILDER_CLASS_NAME =\n      \"com.mapbox.maps.extension.style.expressions.generated.Expression.NumberFormatBuilder\"\n    const val FORMAT_SECTION_BUILDER_CLASS_NAME =\n      \"com.mapbox.maps.extension.style.expressions.generated.Expression.FormatSectionBuilder\"\n    const val FORMAT_BUILDER_CLASS_NAME =\n      \"com.mapbox.maps.extension.style.expressions.generated.Expression.FormatBuilder\"\n    const val COLLATOR_BUILDER_CLASS_NAME =\n      \"com.mapbox.maps.extension.style.expressions.generated.Expression.CollatorBuilder\"\n    private val ALL_EXPRESSION_CLASS_NAME_LIST = listOf(\n      EXPRESSION_BUILDER_CLASS_NAME,\n      INTERPOLATOR_BUILDER_CLASS_NAME,\n      NUMBER_FORMAT_BUILDER_CLASS_NAME,\n      FORMAT_SECTION_BUILDER_CLASS_NAME,\n      FORMAT_BUILDER_CLASS_NAME,\n      COLLATOR_BUILDER_CLASS_NAME\n    )\n\n    /**\n     * Check if the class name is a generic expression class extends from\n     * `com.mapbox.maps.extension.style.expressions.generated.Expression.ExpressionBuilder`.\n     *\n     * A generic expression contains all the expression DSL methods.\n     */\n    fun isGenericExpressionClass(name: String?): Boolean {\n      return name == EXPRESSION_BUILDER_CLASS_NAME || name == INTERPOLATOR_BUILDER_CLASS_NAME\n    }\n  }\n}"
  },
  {
    "path": "extension-style-lint-rules/src/main/java/com/mapbox/maps/lint/style/expressions/UnusedLiteralDetector.kt",
    "content": "package com.mapbox.maps.lint.style.expressions\n\nimport com.android.tools.lint.detector.api.*\nimport org.jetbrains.uast.UBlockExpression\nimport org.jetbrains.uast.UExpression\nimport org.jetbrains.uast.ULambdaExpression\nimport org.jetbrains.uast.ULiteralExpression\n\n/**\n * A detector to scan through the source code and find the lambdas that applies to the ExpressionBuilder,\n * then loop through direct expressions under the lambda and analyse the expression's return type,\n * if the return type is one of supported literal types, we suggest user to wrap it inside the literal().\n *\n * We also suggest user to convert the int to long to match literal expression's signature.\n */\nclass UnusedLiteralDetector : MapboxExpressionDslDetector() {\n  override fun visitMapboxExpressionLambda(\n    context: JavaContext,\n    lambda: ULambdaExpression,\n    receiverClass: String\n  ) {\n    // We only care about ExpressionBuilder and InterpolatorBuilder here, as literal is only available\n    // under ExpressionBuilder, and InterpolatorBuilder extends ExpressionBuilder.\n    if (isGenericExpressionClass(receiverClass)) {\n      checkUnusedLiteralsInLambda(context, lambda)\n    }\n  }\n\n  private fun checkUnusedLiteralsInLambda(context: JavaContext, lambda: ULambdaExpression) {\n    // uncomment to print the expression tree within the lambda for debugging.\n    //    println(\"checkUnusedLiteralsInLambda: ${lambda.asRecursiveLogString()}\")\n    val blockExpression = lambda.body as? UBlockExpression\n    blockExpression?.let {\n      for (expression in blockExpression.expressions) {\n        when (val type = expression.getExpressionType()?.canonicalText) {\n          \"int\" -> {\n            // For int return type, we need to convert it to Long(supported literal expression)\n            val replaceWith = if (expression is ULiteralExpression) {\n              \"literal(${expression.asSourceString()})\"\n            } else {\n              \"literal((${expression.asSourceString()}).toLong())\"\n            }\n            context.reportIssue(\n              expression = expression,\n              replaceWith = replaceWith\n            )\n          }\n          \"float\" -> {\n            // For float return type, we need to convert it to Double(supported literal expression)\n            val replaceWith = if (expression is ULiteralExpression) {\n              \"literal(${expression.asSourceString()})\"\n            } else {\n              \"literal((${expression.asSourceString()}).toDouble())\"\n            }\n            context.reportIssue(\n              expression = expression,\n              replaceWith = replaceWith\n            )\n          }\n          \"long\", \"double\", \"java.lang.String\", \"boolean\" -> {\n            // For string literal expression like \"red\", context.getLocation(expression) will return\n            // the location of red without \"\", to bypass this issue, we need to extend the range by\n            // extending the range and offset it by 1.\n            val location = if (expression is ULiteralExpression && expression.isString) {\n              context.getRangeLocation(expression, -1, expression.asSourceString().length)\n            } else {\n              context.getLocation(expression)\n            }\n            context.reportIssue(\n              expression = expression,\n              location = location\n            )\n          }\n          \"kotlin.Unit\" -> {\n            // no-ops, as the expression returns nothing\n          }\n          else -> {\n            if (type?.startsWith(\"java.util.List\") == true) {\n              context.reportIssue(\n                expression = expression\n              )\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun JavaContext.reportIssue(\n    expression: UExpression,\n    location: Location = getLocation(expression),\n    replaceWith: String = \"literal(${expression.asSourceString()})\"\n  ) {\n    report(\n      issue = ISSUE,\n      scope = expression,\n      location = location,\n      message = REPORT_MESSAGE,\n      quickfixData = LintFix.create()\n        .name(\"Wrap unused literal with literal()\")\n        .replace()\n        .range(location)\n        .with(replaceWith)\n        .reformat(true)\n        .autoFix()\n        .build()\n    )\n  }\n\n  companion object {\n    private const val ISSUE_ID = \"IllegalExpressionLiteralUsage\"\n    private const val BRIEF_DESCRIPTION =\n      \"This check detects unused literal expressions within a code block that's applied to a Expression.ExpressionBuilder class.\"\n    private const val PRIORITY = 8\n    private const val REPORT_MESSAGE =\n      \"Unused literal expression within ExpressionBuilder, wrap it within literal().\"\n\n    private val IMPLEMENTATION = Implementation(\n      UnusedLiteralDetector::class.java, Scope.JAVA_FILE_SCOPE\n    )\n\n    @JvmField\n    val ISSUE = Issue.create(\n      id = ISSUE_ID,\n      briefDescription = BRIEF_DESCRIPTION,\n      explanation = REPORT_MESSAGE,\n      category = Category.CORRECTNESS,\n      priority = PRIORITY,\n      severity = Severity.FATAL,\n      implementation = IMPLEMENTATION\n    ).setAndroidSpecific(true)\n  }\n}"
  },
  {
    "path": "extension-style-lint-rules/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry",
    "content": "com.mapbox.maps.lint.style.StyleIssueRegistry"
  },
  {
    "path": "extension-style-lint-rules/src/test/java/com/mapbox/maps/lint/style/Stubs.kt",
    "content": "package com.mapbox.maps.lint.style\n\nimport com.android.tools.lint.checks.infrastructure.LintDetectorTest.kotlin\nimport com.android.tools.lint.checks.infrastructure.TestFile\n\nobject Stubs {\n  val expressionClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.expressions.generated\n\n      class Expression {\n        open class ExpressionBuilder(operator: String) {\n            /**\n             * Provides a literal array or object value.\n             */\n            fun literal(value: Double) {\n            }\n\n            /**\n             * Provides a literal array or object value.\n             */\n            fun literal(value: Long) {\n            }\n\n            /**\n             * Provides a literal array or object value.\n             */\n            fun literal(value: Boolean) {\n            }\n\n            /**\n             * Provides a literal array or object value.\n             */\n            fun literal(value: String) {\n            }\n\n            /**\n             * Provides a literal array or object value.\n             */\n            fun literal(value: HashMap<String, Any>) {\n            }\n\n            /**\n             * Provides a literal array or object value.\n             */\n            fun literal(value: List<Any>) {\n            }\n            // stop expression that groups 2 argument as a pair\n            fun stop(block: ExpressionBuilder.() -> Unit) {\n            }\n        }\n\n        class InterpolatorBuilder(operator: String) : ExpressionBuilder(operator) {\n        \n        }\n\n        companion object {\n            fun concat(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // Types https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#types\n            fun array(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun image(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun toBoolean(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun toString(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun typeofExpression(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // Feature data https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#feature-data\n            fun featureState(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // Lookup https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#lookup\n            fun at(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun get(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun has(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun inExpression(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun indexOf(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun length(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun slice(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // Decision https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#decision\n            fun not(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun neq(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun less(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun lt(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun lte(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun eq(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun gt(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun gte(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun switchCase(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun match(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun within(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // Ramps, scales, curves https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#ramps-scales-curves\n            fun interpolate(block: InterpolatorBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun step(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // Variable binding https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#variable-binding\n            fun varExpression(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // String https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#string\n            fun downcase(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun isSupportedScript(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun resolvedLocale(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun upcase(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // Color https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#color\n            fun rgb(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun rgba(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun toRgba(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // Math https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#math\n            fun subtract(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun division(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun mod(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun pow(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun abs(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun acos(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun asin(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun atan(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun ceil(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun cos(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun distance(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun floor(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun ln(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun log10(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun log2(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun round(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun sin(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun sqrt(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            fun tan(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n            // stop expression that groups 2 argument as a pair\n            fun stop(block: ExpressionBuilder.() -> Unit): Expression {\n              return Expression()\n            }\n        }\n      }\n\n    \"\"\".trimIndent()\n  )\n  val styleDslClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style\n      \n      import com.mapbox.maps.LayerPosition\n      import com.mapbox.maps.extension.style.layers.*\n      import com.mapbox.maps.extension.style.light.generated.Light\n      import com.mapbox.maps.extension.style.projection.generated.Projection\n      import com.mapbox.maps.extension.style.sources.*\n      import com.mapbox.maps.extension.style.terrain.generated.Terrain\n\n      class StyleExtensionImpl {\n        class Builder(styleUri: String) {\n          @JvmName(\"addLayer\")\n          operator fun Layer.unaryPlus() {\n            // stub\n          }\n          @JvmName(\"addLayerAtPosition\")\n          operator fun Pair<Layer, LayerPosition>.unaryPlus() {\n            // stub\n          }\n          @JvmName(\"addSource\")\n          operator fun Source.unaryPlus() {\n            // stub\n          }\n          @JvmName(\"setLight\")\n          operator fun Light.unaryPlus() {\n            // stub\n          }\n          @JvmName(\"setTerrain\")\n          operator fun Terrain.unaryPlus() {\n            // stub\n          }\n          @JvmName(\"setAtmosphere\")\n          operator fun Atmosphere.unaryPlus() {\n            // stub\n          }\n          @JvmName(\"setProjection\")\n          operator fun Projection.unaryPlus() {\n            // stub\n          }\n          @JvmName(\"addImage\")\n          operator fun ImageExtensionImpl.unaryPlus() {\n            // stub\n          }\n          @JvmName(\"addImage9Patch\")\n          operator fun ImageNinePatchExtensionImpl.unaryPlus() {\n            // stub\n          }\n          @JvmOverloads\n          fun layerAtPosition(\n            layer: Layer,\n            above: String? = null,\n            below: String? = null,\n            at: Int? = null\n          ): Pair<Layer, LayerPosition> {\n            // stub\n            TODO()\n          }\n          fun build(): StyleExtensionImpl {\n            return StyleExtensionImpl()\n          }\n        }\n      }\n      fun style(styleUri: String = \"\", block: StyleExtensionImpl.Builder.() -> Unit): StyleExtensionImpl =\n        StyleExtensionImpl.Builder(styleUri).apply(block).build()\n    \"\"\".trimIndent()\n  )\n  val layerClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.layers\n      abstract class Layer {\n        // stub\n        abstract fun stub()\n      }\n    \"\"\".trimIndent()\n  )\n  val layerPositionClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps\n      class LayerPosition {\n        // stub\n      }\n    \"\"\".trimIndent()\n  )\n  val symbolLayerClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.layers.generated\n      \n      import com.mapbox.maps.extension.style.layers.Layer\n\n      class SymbolLayer(val layerId: String, val sourceId: String) : Layer() {\n        // stub\n        override fun stub() {\n          // stub\n        }\n      }\n    \"\"\".trimIndent()\n  )\n  val sourceClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.sources.generated\n      abstract class Source {\n        // stub\n        abstract fun stub()\n      }\n    \"\"\".trimIndent()\n  )\n  val geoJsonSourceClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.sources.generated\n      class GeoJsonSource(val sourceId: String) : Source() {\n        // stub\n        override fun stub() {\n          // stub\n        }\n      }\n    \"\"\".trimIndent()\n  )\n  val lightClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.light.generated\n      class Light {\n        // stub\n      }\n    \"\"\".trimIndent()\n  )\n  val atmosphereClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.atmosphere.generated\n      class Atmosphere {\n        // stub\n      }\n    \"\"\".trimIndent()\n  )\n  val terrainClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.terrain.generated\n      class Terrain {\n        // stub\n      }\n    \"\"\".trimIndent()\n  )\n  val projectionClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.projection.generated\n      class Projection(val name: String) {\n        // stub\n      }\n    \"\"\".trimIndent()\n  )\n  val imageClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.image\n      class ImageExtensionImpl {\n        // stub\n      }\n    \"\"\".trimIndent()\n  )\n  val imageNinePatchClassFile: TestFile = kotlin(\n    \"\"\"\n      package com.mapbox.maps.extension.style.image\n      class ImageNinePatchExtensionImpl {\n        // stub\n      }\n    \"\"\".trimIndent()\n  )\n  val styleDslTestFiles = arrayOf(\n    styleDslClassFile,\n    layerClassFile,\n    layerPositionClassFile,\n    symbolLayerClassFile,\n    sourceClassFile,\n    geoJsonSourceClassFile,\n    lightClassFile,\n    atmosphereClassFile,\n    terrainClassFile,\n    projectionClassFile,\n    imageClassFile,\n    imageNinePatchClassFile\n  )\n}"
  },
  {
    "path": "extension-style-lint-rules/src/test/java/com/mapbox/maps/lint/style/UnusedStyleDslDetectorTest.kt",
    "content": "package com.mapbox.maps.lint.style\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles\nimport com.android.tools.lint.checks.infrastructure.TestLintTask\nimport com.android.tools.lint.checks.infrastructure.TestMode\nimport com.android.tools.lint.detector.api.TextFormat\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n@RunWith(Parameterized::class)\nclass UnusedStyleDslDetectorTest(\n  private val testInput: String,\n  private val expectedAutoFix: String\n) {\n  @Test\n  fun testUnusedStyleDslBlock() {\n    val testSource = \"\"\"\n          package com.mapbox.maps.style.test\n          \n          import com.mapbox.maps.extension.style.style\n          import com.mapbox.maps.extension.style.atmosphere.generated.Atmosphere\n          import com.mapbox.maps.extension.style.layers.generated.*\n          import com.mapbox.maps.extension.style.light.generated.Light\n          import com.mapbox.maps.extension.style.projection.generated.Projection\n          import com.mapbox.maps.extension.style.sources.*\n          import com.mapbox.maps.extension.style.sources.generated.*\n          import com.mapbox.maps.extension.style.terrain.generated.Terrain\n          import com.mapbox.maps.extension.style.image.ImageExtensionImpl\n          import com.mapbox.maps.extension.style.image.ImageNinePatchExtensionImpl\n\n          val testStyle = style(\"style-id\") {\n            $testInput\n          }\n        \"\"\".trimIndent()\n    TestLintTask\n      .lint()\n      .files(\n        *Stubs.styleDslTestFiles,\n        TestFiles.kotlin(testSource)\n      )\n      .issues(UnusedStyleDslDetector.ISSUE)\n      .skipTestModes(TestMode.UI_INJECTION_HOST)\n      .run()\n      .expectErrorCount(1)\n      .expect(\n        \"\"\"\n         |src/com/mapbox/maps/style/test/test.kt:15: Error: ${\n          UnusedStyleDslDetector.ISSUE.getExplanation(\n            TextFormat.RAW\n          )\n        } [${UnusedStyleDslDetector.ISSUE.id}]\n         |  $testInput\n         |  ${\"~\".repeat(testInput.length)}\n         |1 errors, 0 warnings\n        \"\"\".trimMargin()\n      )\n      .expectFixDiffs(\n        \"\"\"\n          Autofix for src/com/mapbox/maps/style/test/test.kt line 15: Append with unaryPlus(+) operator:\n          @@ -15 +15\n          -   $testInput\n          +   $expectedAutoFix\n        \"\"\".trimIndent()\n      )\n  }\n\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters(name = \"{0} -> {1}\")\n    fun data() = listOf(\n      arrayOf(\n        \"\"\"\n          SymbolLayer(\"layerId\", \"sourceId\")\n        \"\"\".trimIndent(),\n        \"\"\"\n          +SymbolLayer(\"layerId\", \"sourceId\")\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          GeoJsonSource(\"sourceId\")\n        \"\"\".trimIndent(),\n        \"\"\"\n          +GeoJsonSource(\"sourceId\")\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          Light()\n        \"\"\".trimIndent(),\n        \"\"\"\n          +Light()\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          Atmosphere()\n        \"\"\".trimIndent(),\n        \"\"\"\n          +Atmosphere()\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          Terrain()\n        \"\"\".trimIndent(),\n        \"\"\"\n          +Terrain()\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          Projection(\"GLOBE\")\n        \"\"\".trimIndent(),\n        \"\"\"\n          +Projection(\"GLOBE\")\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          ImageExtensionImpl()\n        \"\"\".trimIndent(),\n        \"\"\"\n          +ImageExtensionImpl()\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          ImageNinePatchExtensionImpl()\n        \"\"\".trimIndent(),\n        \"\"\"\n          +ImageNinePatchExtensionImpl()\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          layerAtPosition(SymbolLayer(\"layerId\", \"sourceId\"), above = \"aboveId\")\n        \"\"\".trimIndent(),\n        \"\"\"\n          +layerAtPosition(SymbolLayer(\"layerId\", \"sourceId\"), above = \"aboveId\")\n        \"\"\".trimIndent()\n      )\n    )\n  }\n}"
  },
  {
    "path": "extension-style-lint-rules/src/test/java/com/mapbox/maps/lint/style/expressions/IllegalNumberOfArgumentsDetectorTest.kt",
    "content": "package com.mapbox.maps.lint.style.expressions\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles\nimport com.android.tools.lint.checks.infrastructure.TestLintTask\nimport com.android.tools.lint.checks.infrastructure.TestMode\nimport com.mapbox.maps.lint.style.Stubs\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\nimport java.util.*\n\n@RunWith(Parameterized::class)\nclass IllegalNumberOfArgumentsDetectorTest(\n  private val testExpressionName: String,\n  private val testNumberOfArguments: Int,\n  private val expectError: Boolean,\n) {\n  @Test\n  fun testIllegalNumberOfArgument() {\n    val testContent =\n      List(testNumberOfArguments) { \"literal(0)\" }.joinToString(separator = \"\\n            \")\n    // add a stop expression to the even/odd number of argument tests to validate the proper handling of stop\n    // adding a stop expression should add 2 arguments to the parent expression and should not affect parity\n    val stopExpressionTestContent =\n      if (\n        IllegalNumberOfArgumentsDetector.ARGUMENT_COUNT_MAP[testExpressionName]?.first() == IllegalNumberOfArgumentsDetector.ODD_NUMBER ||\n        IllegalNumberOfArgumentsDetector.ARGUMENT_COUNT_MAP[testExpressionName]?.first() == IllegalNumberOfArgumentsDetector.EVEN_NUMBER\n      ) {\n        \"\"\"\n            stop {\n              literal(0)\n              literal(0)\n            }\n        \"\"\"\n      } else {\n        \"\"\n      }\n    val testLintResult = TestLintTask\n      .lint()\n      .files(\n        Stubs.expressionClassFile,\n        TestFiles.kotlin(\n          \"\"\"\n          package com.mapbox.maps.style.test\n          \n          import com.mapbox.maps.extension.style.expressions.generated.Expression\n\n          val expression = Expression.$testExpressionName {\n            $testContent\n            $stopExpressionTestContent\n          }\n        \"\"\".trimIndent()\n        )\n      )\n      .issues(IllegalNumberOfArgumentsDetector.ISSUE)\n      .skipTestModes(TestMode.UI_INJECTION_HOST, TestMode.PARENTHESIZED)\n      .run()\n\n    if (expectError) {\n      testLintResult\n        .expectErrorCount(1)\n        .expect(\n          \"\"\"\n         |src/com/mapbox/maps/style/test/test.kt:5: Error: ${\n            IllegalNumberOfArgumentsDetector.getReportMessage(\n              testExpressionName,\n              if (stopExpressionTestContent.isEmpty()) testNumberOfArguments else testNumberOfArguments + 2\n            )\n          } [${IllegalNumberOfArgumentsDetector.ISSUE.id}]\n         |val expression = Expression.$testExpressionName {\n         |                 ^\n         |1 errors, 0 warnings\n        \"\"\".trimMargin()\n        )\n    } else {\n      testLintResult.expectClean()\n    }\n  }\n\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters(name = \"{0} with {1} arguments should be warned?({2})\")\n    fun data(): List<Array<Any>> {\n      val mutableList = mutableListOf<Array<Any>>()\n      // Add illegal test cases\n      mutableList.addAll(\n        IllegalNumberOfArgumentsDetector\n          .ARGUMENT_COUNT_MAP\n          .entries\n          .map {\n            // produce illegal number of arguments\n            if (it.value.first() > 0) {\n              arrayOf(it.key, it.value.last() + 1, true)\n            } else if (it.value.first() == IllegalNumberOfArgumentsDetector.ODD_NUMBER) {\n              arrayOf(it.key, 4, true)\n            } else if (it.value.first() == IllegalNumberOfArgumentsDetector.EVEN_NUMBER) {\n              arrayOf(it.key, 5, true)\n            } else {\n              arrayOf()\n            }\n          }\n      )\n      // Add legal test cases\n      mutableList.addAll(\n        IllegalNumberOfArgumentsDetector\n          .ARGUMENT_COUNT_MAP\n          .entries\n          .map {\n            // produce legal number of arguments\n            if (it.value.first() > 0) {\n              arrayOf(it.key, it.value.last(), false)\n            } else if (it.value.first() == IllegalNumberOfArgumentsDetector.ODD_NUMBER) {\n              arrayOf(it.key, 5, false)\n            } else if (it.value.first() == IllegalNumberOfArgumentsDetector.EVEN_NUMBER) {\n              arrayOf(it.key, 4, false)\n            } else {\n              arrayOf()\n            }\n          }\n      )\n      return mutableList\n    }\n  }\n}"
  },
  {
    "path": "extension-style-lint-rules/src/test/java/com/mapbox/maps/lint/style/expressions/UnusedLiteralDetectorTest.kt",
    "content": "package com.mapbox.maps.lint.style.expressions\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles\nimport com.android.tools.lint.checks.infrastructure.TestLintTask\nimport com.android.tools.lint.checks.infrastructure.TestMode\nimport com.android.tools.lint.detector.api.TextFormat\nimport com.mapbox.maps.lint.style.Stubs\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\nimport java.util.*\n\n@RunWith(Parameterized::class)\nclass UnusedLiteralDetectorTest(\n  private val testInput: String,\n  private val expectedAutoFix: String\n) {\n  @Test\n  fun testUnwrappedLiteralExpression() {\n    TestLintTask\n      .lint()\n      .files(\n        Stubs.expressionClassFile,\n        TestFiles.kotlin(\n          \"\"\"\n          package com.mapbox.maps.style.test\n          \n          import com.mapbox.maps.extension.style.expressions.generated.Expression\n\n          val expression = Expression.concat {\n            $testInput\n          }\n          val interpolateExpression = Expression.interpolate {\n            $testInput\n          }\n        \"\"\".trimIndent()\n        )\n      )\n      .issues(UnusedLiteralDetector.ISSUE)\n      .skipTestModes(TestMode.UI_INJECTION_HOST)\n      .run()\n      .expectErrorCount(2)\n      .expect(\n        \"\"\"\n         |src/com/mapbox/maps/style/test/test.kt:6: Error: ${\n          UnusedLiteralDetector.ISSUE.getExplanation(\n            TextFormat.RAW\n          )\n        } [${UnusedLiteralDetector.ISSUE.id}]\n         |  $testInput\n         |  ${\"~\".repeat(testInput.length)}\n         |src/com/mapbox/maps/style/test/test.kt:9: Error: ${\n          UnusedLiteralDetector.ISSUE.getExplanation(\n            TextFormat.RAW\n          )\n        } [${UnusedLiteralDetector.ISSUE.id}]\n         |  $testInput\n         |  ${\"~\".repeat(testInput.length)}\n         |2 errors, 0 warnings\n        \"\"\".trimMargin()\n      )\n      .expectFixDiffs(\n        \"\"\"\n          Autofix for src/com/mapbox/maps/style/test/test.kt line 6: Wrap unused literal with literal():\n          @@ -6 +6\n          -   $testInput\n          +   $expectedAutoFix\n          Autofix for src/com/mapbox/maps/style/test/test.kt line 9: Wrap unused literal with literal():\n          @@ -9 +9\n          -   $testInput\n          +   $expectedAutoFix\n        \"\"\".trimIndent()\n      )\n  }\n\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters(name = \"{0} -> {1}\")\n    fun data() = listOf(\n      arrayOf(\n        \"\"\"\n          \"red\"\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(\"red\")\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          listOf(\"a\", \"b\")\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(listOf(\"a\", \"b\"))\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          \"abc\" + \"def\"\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(\"abc\" + \"def\")\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          \"abc\".length\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal((\"abc\".length).toLong())\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          1 + 2\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal((1 + 2).toLong())\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          3+4\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal((3 + 4).toLong())\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          1.0 + 2.0\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(1.0 + 2.0)\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          12\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(12)\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          1L\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(1)\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          0.1\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(0.1)\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          0.5f\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(0.5)\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          1.2.toFloat()\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal((1.2.toFloat()).toDouble())\n        \"\"\".trimIndent()\n      ),\n\n      arrayOf(\n        \"\"\"\n          0.5f+123\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal((0.5 + 123).toDouble())\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          false\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(false)\n        \"\"\".trimIndent()\n      ),\n      arrayOf(\n        \"\"\"\n          !true\n        \"\"\".trimIndent(),\n        \"\"\"\n          literal(!true)\n        \"\"\".trimIndent()\n      )\n    )\n  }\n}"
  },
  {
    "path": "gradle/apps.versions.toml",
    "content": "# This file contains dependencies only used in the test apps.\n# Upgrading this dependencies is not a breaking change for the Mapbox Maps SDK for Android.\n\n\n[versions]\nmapboxJavaServices = \"7.5.0\"\nsquareRetrofit = \"2.9.0\"\n\nandroidxRecyclerView = \"1.1.0\"\nandroidxConstraintLayout = \"2.0.0\"\nandroidxLifecycle = \"2.3.0\"\nandroidxFragmentTesting = \"1.6.0\"\nandroidxActivityCompose = \"1.4.0\"\nandroidxStartup = \"1.1.1\"\n\nmaterialDesign = \"1.2.0\"\ngooglePlayServicesLocation = \"18.0.0\"\n\nsquareLeakCanary = \"2.9.1\"\n\n\n[libraries]\nmapbox-turf = { module = \"com.mapbox.mapboxsdk:mapbox-sdk-turf\", version.ref = \"mapboxJavaServices\" }\nmapbox-services = { module = \"com.mapbox.mapboxsdk:mapbox-sdk-services\", version.ref = \"mapboxJavaServices\" }\n\nsquare-retrofit = { module = \"com.squareup.retrofit2:retrofit\", version.ref = \"squareRetrofit\" }\nsquare-retrofit-gsonConverter = { module = \"com.squareup.retrofit2:converter-gson\", version.ref = \"squareRetrofit\" }\n\nandroidx-recyclerView = { module = \"androidx.recyclerview:recyclerview\", version.ref = \"androidxRecyclerView\" }\nandroidx-constraintLayout = { module = \"androidx.constraintlayout:constraintlayout\", version.ref = \"androidxConstraintLayout\" }\nandroidx-lifecycleKtx = { module = \"androidx.lifecycle:lifecycle-runtime-ktx\", version.ref = \"androidxLifecycle\" }\nandroidx-fragmentTest = { module = \"androidx.fragment:fragment-testing\", version.ref = \"androidxFragmentTesting\" }\nandroidx-activityCompose = { module = \"androidx.activity:activity-compose\", version.ref = \"androidxActivityCompose\" }\nandroidx-startup = { module = \"androidx.startup:startup-runtime\", version.ref = \"androidxStartup\" }\n\ngoogleMaterialDesign = { module = \"com.google.android.material:material\", version.ref = \"materialDesign\" }\ngooglePlayServicesLocation = { module = \"com.google.android.gms:play-services-location\", version.ref = \"googlePlayServicesLocation\" }\n\ncompose-uiTooling = { module = \"androidx.compose.ui:ui-tooling\" }\ncompose-uiToolingPreview = { module = \"androidx.compose.ui:ui-tooling-preview\" }\n\nsquareLeakCanary = { module = \"com.squareup.leakcanary:leakcanary-android\", version.ref = \"squareLeakCanary\" }\n"
  },
  {
    "path": "gradle/commonlibs.versions.toml",
    "content": "[versions]\n\n# Mapbox NDK Gradle Plugin will read these versions to figure out what NDK versions are supported in\n# this codebase.\ndefaultNdkMajor = \"23\"\nndkMajor23 = \"23.2.8568313\"\nndkMajor27 = \"27.0.12077973\""
  },
  {
    "path": "gradle/dependency-updates.gradle",
    "content": "apply plugin: 'com.github.ben-manes.versions'\n\ndef isNonStable = { String version ->\n    def stableKeyword = ['RELEASE', 'FINAL', 'GA'].any { it -> version.toUpperCase().contains(it) }\n    def regex = /^[0-9,.v-]+(-r)?$/\n    return !stableKeyword && !(version ==~ regex)\n}\n\ntasks.named(\"dependencyUpdates\").configure {\n    checkForGradleUpdate = true\n\n    rejectVersionIf {\n        isNonStable(candidate.version)\n    }\n\n    rejectVersionIf {\n        isNonStable(candidate.version) && !isNonStable(currentVersion)\n    }\n\n    resolutionStrategy {\n        componentSelection {\n            all {\n                if (isNonStable(candidate.version) && !isNonStable(currentVersion)) {\n                    reject('Release candidate')\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gradle/ktlint.gradle.kts",
    "content": "val ktlintConfig by configurations.creating\n\ndependencies {\n  ktlintConfig(\"com.pinterest:ktlint:0.48.2\")\n}\n\nval ktlint by tasks.registering(JavaExec::class) {\n  group = LifecycleBasePlugin.VERIFICATION_GROUP\n  description = \"Check Kotlin code style\"\n  classpath = ktlintConfig\n  mainClass.set(\"com.pinterest.ktlint.Main\")\n  // see https://pinterest.github.io/ktlint/latest/install/cli/#command-line-usage for more information\n  args(\n    \"**/src/**/*.kt\",\n    \"**.kts\",\n    \"!**/build/**\",\n    \"!**/ksp/**/*.kt\",\n  )\n}\n\ntasks.register<JavaExec>(\"ktlintFormat\") {\n  group = LifecycleBasePlugin.VERIFICATION_GROUP\n  description = \"Check Kotlin code style and format\"\n  classpath = ktlintConfig\n  mainClass.set(\"com.pinterest.ktlint.Main\")\n  jvmArgs(\"--add-opens=java.base/java.lang=ALL-UNNAMED\")\n  // see https://pinterest.github.io/ktlint/latest/install/cli/#command-line-usage for more information\n  args(\n    \"-F\",\n    \"**/src/**/*.kt\",\n    \"**.kts\",\n    \"!**/build/**\",\n    \"!**/ksp/**/*.kt\",\n  )\n}\n"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions]\n# Versions\nandroidMinSdkVersion = \"21\"\nandroidTargetSdkVersion = \"35\"\nandroidCompileSdkVersion = \"35\"\nandroidMinCompileSdkVersion = \"31\"\n\nautoMinSdkVersion = \"23\"\nautoTargetSdkVersion = \"35\"\nautoCompileSdkVersion = \"35\"\n\nexampleMinSdkVersion = \"23\"\nexampleTargetSdkVersion = \"35\"\nexampleCompileSdkVersion = \"35\"\n\n# Plugins\npluginJacoco = \"0.8.12\"\npluginGradle = \"8.10.1\"\npluginLicense = \"0.9.0\"\npluginMapboxAccessToken = \"0.4.0\"\npluginMapboxSdkRegistry = \"1.5.6\"\npluginMapboxSdkVersions = \"1.1.3\"\npluginMapboxNdk = \"0.2.0\"\npluginTaskTree = \"2.1.0\"\npluginPlayPublisher = \"3.7.0\"\npluginGradleVersions = \"0.42.0\"\npluginBinaryCompatibilityValidator = \"0.13.2\"\n\ndokka = \"1.7.20\"\nkotlin = \"1.7.20\"\njapicmp = \"0.4.6\"\n\n# Dependencies\n\n# GlNative and Common are used by the convention plugin\nmapboxGlNative = \"11.23.0-SNAPSHOT-04-09--02-04.git-8a87ed7\"\nmapboxCommon = \"24.23.0-SNAPSHOT-04-09--02-04.git-8a87ed7\"\n\nmapboxBase = \"0.12.0\"\nmapboxGestures = \"0.9.2\"\nmapboxGeoJSON = \"7.5.0\"\n\nandroidXTestMonitor = \"1.6.1\"\nandroidxAnnotation = \"1.1.0\"\nandroidxAppcompat = \"1.6.1\"\nandroidxArchCoreTest = \"2.1.0\"\nandroidxCore = \"1.9.0\" # last version compatible with kotlin 1.8.10\nandroidxEspresso = \"3.5.1\"\n# can not bump to v1.6.0, due to incompatible\n# `@androidx.annotation.VisibleForTesting(otherwise = null)`\n# generated by the telemetry module setup, we can update either by updating the annotation\n# processor in mapbox-android-base, or remove the module setup in mapbox-maps-android\nandroidxInterpolator = \"1.0.0\"\nandroidxJUnit = \"1.1.5\"\nandroidxLifecycle = \"2.3.0\"\nandroidxTest = \"1.5.0\"\nandroidxTestOrchestrator = \"1.4.2\"\nandroidxTestRunner = \"1.5.2\"\nandroidxUiAutomator = \"2.2.0\"\n\ngoogleCarAppLibrary = \"1.2.0\"\n\n# Use kotlinCoroutines to 1.6.1 to be compatible with platform runtime.\nkotlinCoroutines = \"1.6.1\"\njunit = \"4.13.2\"\nmockk = \"1.13.5\"\nrobolectric = \"4.14\"\nrobolectricEgl = \"gl1.1-android-2.1_r1\"\nlint = \"30.4.2\"\nhamcrest = \"2.1\"\nequalsVerifier = \"3.14\"\nasyncInflater = \"1.0.0\"\n\ncompose = \"1.3.2\"\ncomposeBom = \"2023.01.00\"\ngradleVersionsPlugin = \"0.42.0\"\nksp = \"1.0.8\"\nkotlinDataCompat = \"0.8.0\"\n\ntoster = \"0.3.2\"\n\n\n[libraries]\nplugin-gradle = { module = \"com.android.tools.build:gradle\", version.ref = \"pluginGradle\" }\nplugin-kotlin = { module = \"org.jetbrains.kotlin:kotlin-gradle-plugin\", version.ref = \"kotlin\" }\nplugin-jacoco = { module = \"org.jacoco:org.jacoco.core\", version.ref = \"pluginJacoco\" }\nplugin-license = { module = \"com.jaredsburrows:gradle-license-plugin\", version.ref = \"pluginLicense\" }\nplugin-dokka = { module = \"org.jetbrains.dokka:dokka-gradle-plugin\", version.ref = \"dokka\" }\nplugin-japicmp = { module = \"me.champeau.gradle:japicmp-gradle-plugin\", version.ref = \"japicmp\" }\n\nplugin-mapbox-accessToken = { module = \"com.mapbox.gradle.plugins:access-token\", version.ref = \"pluginMapboxAccessToken\" }\nplugin-mapbox-sdkRegistry = { module = \"com.mapbox.gradle.plugins:sdk-registry\", version.ref = \"pluginMapboxSdkRegistry\" }\nplugin-mapbox-sdkVersions = { module = \"com.mapbox.mapboxsdk:mapbox-android-sdk-versions\", version.ref = \"pluginMapboxSdkVersions\" }\nplugin-mapbox-ndk = { module = \"com.mapbox.gradle.plugins:ndk\", version.ref = \"pluginMapboxNdk\" }\n\nplugin-playPublisher = { module = \"com.github.triplet.gradle:play-publisher\", version.ref = \"pluginPlayPublisher\" }\nplugin-gradleVersions = { module = \"com.github.ben-manes:gradle-versions-plugin\", version.ref = \"pluginGradleVersions\" }\n\n# Dependencies\n\nandroidx-annotations = { module = \"androidx.annotation:annotation\", version.ref = \"androidxAnnotation\" }\nandroidx-appCompat = { module = \"androidx.appcompat:appcompat\", version.ref = \"androidxAppcompat\" }\nandroidx-archCoreTest = { module = \"androidx.arch.core:core-testing\", version.ref = \"androidxArchCoreTest\" }\nandroidx-coreKtx = { module = \"androidx.core:core-ktx\", version.ref = \"androidxCore\" }\nandroidx-espresso = { module = \"androidx.test.espresso:espresso-core\", version.ref = \"androidxEspresso\" }\nandroidx-interpolators = { module = \"androidx.interpolator:interpolator\", version.ref = \"androidxInterpolator\" }\nandroidx-jUnitTestRules = { module = \"androidx.test:rules\", version.ref = \"androidxTest\" }\nandroidx-lifecycle = { module = \"androidx.lifecycle:lifecycle-runtime\", version.ref = \"androidxLifecycle\" }\nandroidx-lifecycleRuntimeTesting = { module = \"androidx.lifecycle:lifecycle-runtime-testing\", version.ref = \"androidxLifecycle\" }\nandroidx-orchestrator = { module = \"androidx.test:orchestrator\", version.ref = \"androidxTestOrchestrator\" }\nandroidx-testCore = { module = \"androidx.test:core\", version.ref = \"androidxTest\" }\nandroidx-testJUnit = { module = \"androidx.test.ext:junit\", version.ref = \"androidxJUnit\" }\nandroidx-testMonitor = { module = \"androidx.test:monitor\", version.ref = \"androidXTestMonitor\" }\nandroidx-testRunner = { module = \"androidx.test:runner\", version.ref = \"androidxTestRunner\" }\nandroidx-uiAutomator = { module = \"androidx.test.uiautomator:uiautomator\", version.ref = \"androidxUiAutomator\" }\nasyncInflater = { module = \"androidx.asynclayoutinflater:asynclayoutinflater\", version.ref = \"asyncInflater\" }\n\ncompose-bom = { module = \"androidx.compose:compose-bom\", version.ref = \"composeBom\" }\ncompose-material = { module = \"androidx.compose.material:material\" }\ncompose-ui = { module = \"androidx.compose.ui:ui\" }\ncompose-uiTest = { module = \"androidx.compose.ui:ui-test-junit4\" }\ncompose-uiTestManifest = { module = \"androidx.compose.ui:ui-test-manifest\" }\n\ncoroutines = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-core\", version.ref = \"kotlinCoroutines\" }\ncoroutines-android = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-android\", version.ref = \"kotlinCoroutines\" }\ncoroutinesTest = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-test\", version.ref = \"kotlinCoroutines\" }\n\nequalsVerifier = { module = \"nl.jqno.equalsverifier:equalsverifier\", version.ref = \"equalsVerifier\" }\ngoogleCarAppLibrary = { module = \"androidx.car.app:app\", version.ref = \"googleCarAppLibrary\" }\nhamcrest = { module = \"org.hamcrest:hamcrest\", version.ref = \"hamcrest\" }\njunit = { module = \"junit:junit\", version.ref = \"junit\" }\nkotlin = { module = \"org.jetbrains.kotlin:kotlin-stdlib-jdk8\", version.ref = \"kotlin\" }\nkotlinDataCompatAnnotation = { module = \"com.github.tobrun.kotlin-data-compat:annotation\", version.ref = \"kotlinDataCompat\" }\nkotlinDataCompatProcessor = { module = \"com.github.tobrun.kotlin-data-compat:processor\", version.ref = \"kotlinDataCompat\" }\nlint = { module = \"com.android.tools.lint:lint\", version.ref = \"lint\" }\nlintApi = { module = \"com.android.tools.lint:lint-api\", version.ref = \"lint\" }\nlintChecks = { module = \"com.android.tools.lint:lint-checks\", version.ref = \"lint\" }\nlintTests = { module = \"com.android.tools.lint:lint-tests\", version.ref = \"lint\" }\n\nmapbox-annotations = { module = \"com.mapbox.base:annotations\", version.ref = \"mapboxBase\" }\nmapbox-annotationsProcessor = { module = \"com.mapbox.base:annotations-processor\", version.ref = \"mapboxBase\" }\nmapbox-base = { module = \"com.mapbox.base:common\", version.ref = \"mapboxBase\" }\nmapbox-gestures = { module = \"com.mapbox.mapboxsdk:mapbox-android-gestures\", version.ref = \"mapboxGestures\" }\nmapbox-geoJSON = { module = \"com.mapbox.mapboxsdk:mapbox-sdk-geojson\", version.ref = \"mapboxGeoJSON\" }\n\nmockk = { module = \"io.mockk:mockk\", version.ref = \"mockk\" }\n\nrobolectric = { module = \"org.robolectric:robolectric\", version.ref = \"robolectric\" }\nrobolectricEgl = { module = \"org.khronos:opengl-api\", version.ref = \"robolectricEgl\" }\n\n\ntestUtils = { module = \"com.android.tools:testutils\", version.ref = \"lint\" }\ntoster = { module = \"by.epicbot:toster\", version.ref = \"toster\" }\n\n[bundles]\nbase-dependencies = [ \"mapbox-base\", \"kotlin\", \"androidx-appCompat\", \"androidx-coreKtx\", \"androidx-annotations\"]\nbase-dependenciesTests = [\"junit\", \"mockk\", \"androidx-testCore\", \"equalsVerifier\", \"robolectric\"]\nbase-dependenciesAndroidTests = [\"androidx-testRunner\", \"androidx-jUnitTestRules\", \"androidx-espresso\"]\n\n[plugins]\ntaskTreeId = { id = \"com.dorongold.task-tree\", version.ref = \"pluginTaskTree\" }\nbinaryCompatibilityValidatorId = { id = \"org.jetbrains.kotlinx.binary-compatibility-validator\", version.ref = \"pluginBinaryCompatibilityValidator\" }\n"
  },
  {
    "path": "gradle/lint.gradle",
    "content": "android {\n    lintOptions {\n        checkReleaseBuilds false\n        warningsAsErrors true\n        abortOnError false\n        xmlReport false\n        disable 'AllowBackup', 'UnusedResources'\n    }\n}\n"
  },
  {
    "path": "gradle/metalava.gradle",
    "content": "configurations {\n    metalava\n}\n\ndependencies {\n    // Metalava isn't released yet. Check in its jar and explicitly track its transitive deps.\n    metalava files('../metalava/metalava.jar')\n\n    // this version of JNA fixes issue with warnings on M1\n    metalava \"net.java.dev.jna:jna:5.7.0\"\n\n    metalava \"com.android.tools.external.org-jetbrains:uast:30.3.0-alpha08\"\n    metalava \"com.android.tools.external.com-intellij:kotlin-compiler:30.3.0-alpha08\"\n    metalava \"com.android.tools.external.com-intellij:intellij-core:30.3.0-alpha08\"\n    metalava \"com.android.tools.lint:lint-api:30.3.0-alpha08\"\n    metalava \"com.android.tools.lint:lint-checks:30.3.0-alpha08\"\n    metalava \"com.android.tools.lint:lint-gradle:30.3.0-alpha08\"\n    metalava \"com.android.tools.lint:lint:30.3.0-alpha08\"\n    metalava \"com.android.tools:common:30.3.0-alpha08\"\n    metalava \"com.android.tools:sdk-common:30.3.0-alpha08\"\n    metalava \"com.android.tools:sdklib:30.3.0-alpha08\"\n    metalava \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10\"\n    metalava \"org.jetbrains.kotlin:kotlin-reflect:1.8.10\"\n    metalava \"org.ow2.asm:asm:8.0\"\n    metalava \"org.ow2.asm:asm-tree:8.0\"\n    metalava \"com.google.guava:guava:30.1.1-jre\"\n}"
  },
  {
    "path": "gradle/play-publisher.gradle",
    "content": "apply plugin: 'com.github.triplet.play'\n\nplay {\n    track = findProperty(\"releaseTrack\") as String ?: \"internal\"\n    serviceAccountCredentials = file(\"test-app-play-publisher.json\")\n    defaultToAppBundles = true\n}"
  },
  {
    "path": "gradle/script-git-version.gradle",
    "content": "ext {\n    // use unix time to set unique version code. Note: google playstore max version code value is 2100000000\n    // this gives us expiration date till 2635.\n    gitVersionCode = (System.currentTimeSeconds() / 10).intValue()\n}"
  },
  {
    "path": "gradle/track-public-apis.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply from: \"${rootDir}/gradle/metalava.gradle\"\n\ntasks.register(\"updateApiMetalava\") {\n    group = \"Other\"\n    description = \"Update metalava generated public api files for all variants.\"\n}\n\ntasks.register(\"checkApiMetalava\") {\n    group = \"Other\"\n    description = \"Update metalava generated public api files for all variants.\"\n}\n\nandroid.libraryVariants.all { variant ->\n    // TODO eliminate variants https://issuetracker.google.com/issues/62201427\n    if (variant.buildType.isDebuggable()) {\n        return\n    }\n    def variantName = variant.name.capitalize()\n    def sources = variant.getSourceSets()\n\n    tasks.register(\"update${variantName}ApiMetalava\", JavaExec) {\n        group = 'Other'\n        description = \"Update metalava generated public api files for $variantName variant.\"\n        dependsOn \"assemble$variantName\"\n\n        sources.each {\n            it.kotlinDirectories.each { dir ->\n                // We will use `inputs` later for Metalava `source-path` and it doesn't like if the folder doesn't exist.\n                // So we filter it here\n                if (dir.exists()) {\n                    inputs.files(dir)\n                }\n            }\n        }\n\n        def outputFileName = \"api/${variantName}/metalava.txt\"\n        outputs.file(outputFileName)\n\n        classpath = configurations.metalava\n        mainClass.set(\"com.android.tools.metalava.Driver\")\n\n        // this path represents <module>/src/main/java\n        def sourcePathJava = inputs.getFiles().getAsPath()\n\n        doFirst {\n            def metalavaClasspath = (project.files(android.getBootClasspath()) + variant.javaCompile.classpath).join(File.pathSeparator)\n            args = [\n                    '--no-banner',\n                    // in order to include KSP files we need to go one directory up\n                    '--source-path', sourcePathJava.substring(0, sourcePathJava.lastIndexOf('/')),\n//                    '--compatible-output=no',\n//                    '--omit-common-packages=yes',\n                    '--output-kotlin-nulls=yes',\n                    '--hide', 'HiddenSuperclass',\n                    '--hide', 'DeprecationMismatch',\n                    '--classpath', metalavaClasspath,\n                    '--api', outputFileName\n            ]\n            if (project.hasProperty('hidePackage')) {\n                args += '--hide-package'\n                args += hidePackage\n            }\n            if (project.hasProperty('hideId')) {\n                args += '--hide'\n                args += hideId\n            }\n        }\n    }\n\n    tasks.named(\"updateApiMetalava\") { dependsOn(\"update${variantName}ApiMetalava\") }\n\n    tasks.register(\"check${variantName}ApiMetalava\", JavaExec) {\n        group = \"Verification\"\n        description = \"Checks signatures of public API against the golden value in API folder generated by metalava for $variantName variant.\"\n        dependsOn \"assemble$variantName\"\n\n        sources.each {\n            it.kotlinDirectories.each { dir ->\n                // We will use `inputs` later for Metalava `source-path` and it doesn't like if the folder doesn't exist.\n                // So we filter it here\n                if (dir.exists()) {\n                    inputs.files(dir)\n                }\n            }\n        }\n\n        // Copy the input source files before adding the variantMetalavaFilePath,\n        // this path represents <module>/src/main/java\n        def sourcePathJava = inputs.getFiles().getAsPath()\n\n        def variantMetalavaFilePath = \"api/${variantName}/metalava.txt\"\n        inputs.file(variantMetalavaFilePath)\n        outputs.file(variantMetalavaFilePath)\n\n        classpath = configurations.metalava\n        mainClass.set(\"com.android.tools.metalava.Driver\")\n\n        doFirst {\n            def metalavaClasspath = (project.files(android.getBootClasspath()) + variant.javaCompile.classpath).join(File.pathSeparator)\n            args = [\n                    '--no-banner',\n                    // in order to include KSP files we need to go one directory up\n                    '--source-path', sourcePathJava.substring(0, sourcePathJava.lastIndexOf('/')),\n//                    '--compatible-output=no',\n//                    '--omit-common-packages=yes',\n                    '--output-kotlin-nulls=yes',\n                    '--input-kotlin-nulls=yes',\n                    '--hide', 'HiddenSuperclass',\n                    '--hide', 'DeprecationMismatch',\n                    '--classpath', metalavaClasspath,\n                    '--check-compatibility:api:released', variantMetalavaFilePath\n            ]\n            if (project.hasProperty('hidePackage')) {\n                args += '--hide-package'\n                args += hidePackage\n            }\n            if (project.hasProperty('hideId')) {\n                args += '--hide'\n                args += hideId\n            }\n        }\n    }\n\n    tasks.named(\"checkApiMetalava\") { dependsOn(\"check${variantName}ApiMetalava\") }\n}\n\ntasks.register(\"checkApiKotlinValidator\") {\n    dependsOn(\"apiCheck\")\n    group = 'Verification'\n    description = 'Checks signatures of public API against the golden value in API folder generated by Kotlin binary compatibility validator.'\n}\n\ntasks.register(\"updateApiKotlinValidator\") {\n    dependsOn(\"apiDump\")\n    group = 'Other'\n    description = 'Update Kotlin binary compatibility validator generated public api files.'\n}\n\ntasks.register(\"checkApi\") {\n    dependsOn checkApiMetalava\n    dependsOn checkApiKotlinValidator\n    group = 'Verification'\n    description = 'Checks signatures of public API against the golden value in API folder generated by Metalava (Note: Kotlin binary compatibility validator is disabled).'\n}\n\ntasks.register(\"updateApi\") {\n    dependsOn updateApiMetalava\n    dependsOn updateApiKotlinValidator\n    group = 'Other'\n    description = 'Update generated public api files from Metalava (Note: Kotlin binary compatibility validator is disabled).'\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Wed Sep 04 18:43:58 EEST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.11.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "VERSION_NAME=11.23.0-SNAPSHOT-04-09--02-04.git-8a87ed7\nLAST_STABLE_VERSION=11.22.0-rc.1\n# version name for the test app\nTEST_APP_VERSION_NAME=0.1.0\n\n# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Ensure important default jvmargs aren't overwritten. See https://github.com/gradle/gradle/issues/19750\n#\n# For more information about how Gradle memory options were chosen:\n# - Metaspace See https://www.jasonpearson.dev/metaspace-in-jvm-builds/\n# - SoftRefLRUPolicyMSPerMB would default to 1000 which with a 4gb heap translates to ~51 minutes.\n#   A value of 1 means ~4 seconds before SoftRefs can be collected, which means its realistic to\n#   collect them as needed during a build that should take seconds to minutes.\n# - CodeCache normally defaults to a very small size. Increasing it from platform defaults of 32-48m\n#   because of how many classes can be loaded into memory and then cached as native compiled code\n#   for a small speed boost.\n# - Increased stack size (Xss) fixes StackOverFlow during javadoc generation\norg.gradle.jvmargs=-Dfile.encoding=UTF-8 -XX:+UseG1GC -XX:SoftRefLRUPolicyMSPerMB=1 -XX:ReservedCodeCacheSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xmx16g -Xms4g -Xss4m\n\n# For more information about how Kotlin Daemon memory options were chosen:\n# - Kotlin JVM args only inherit Xmx, ReservedCodeCache, and MaxMetaspace. Since we are specifying\n#   other args we need to specify all of them here.\n# - We're using the Kotlin Gradle Plugin's default value for ReservedCodeCacheSize, if we do not then\n#   the Gradle JVM arg value for ReservedCodeCacheSize will be used.\nkotlin.daemon.jvmargs=-Dfile.encoding=UTF-8 -XX:+UseG1GC -XX:SoftRefLRUPolicyMSPerMB=1 -XX:ReservedCodeCacheSize=320m -XX:+HeapDumpOnOutOfMemoryError -Xmx16g -Xms4g\n\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\n# Internal build flag to build from source.\nbuildFromSource=false\n# Internal build flag to build Android Gestures from `vendor/mapbox-gestures-android`.\nbuildAndroidGesturesFromSource=false\n\n# Disable ksp incremental feature due to ksp bug in https://github.com/google/ksp/issues/1280\nksp.incremental=false\n\nandroid.nonTransitiveRClass=false\n#android.nonFinalResIds=false\n\n# Enable caching between builds.\norg.gradle.caching=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "mapbox-convention-plugin/README.md",
    "content": "# Mapbox Convention plugin\n\nThis folder contains two Gradle plugins that encapsulates common build logic for our different modules:\n- `MapboxLibraryPlugin`: responsible to configure Android library modules\n- `MapboxApplicationPlugin`: responsible to configure Android application modules\n\n## Common features\nBoth plugins `MapboxLibraryPlugin` and `MapboxApplicationPlugin` will create product flavors for `private` and `public`.\n\nThey will also apply the Gradle plugins common.\n\n## MapboxLibraryPlugin\n\nIn your build Gradle file:\n```\nplugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nmapboxLibrary {\n  dokka {\n    extraListOfSources = File(\"api-doc-list-maps-core.txt\").readLines()\n    reportUndocumented = false\n  }\n}\n```\n\n## How to debug\n\nYou can debug this plugin by creating a `Remote JVM Debug` run configuration (instructions [here](https://www.jetbrains.com/help/idea/tutorial-remote-debug.html#debugger_rc)).\n\nThen, every time you want to debug, run the desired Gradle task from the command line with the parameter\n`-Dorg.gradle.debug=true` (e.g., `./gradlew plugin-annotation:tasks --no-parallel -no-daemon -Dorg.gradle.debug=true`).\nGradle will start but immediately wait for the debugger to attach before proceeding. \nAt this point, run the remote JVM debug configuration you created."
  },
  {
    "path": "mapbox-convention-plugin/build.gradle.kts",
    "content": "repositories {\n  mavenLocal()\n  google()\n  mavenCentral()\n  maven {\n    url = uri(\"https://api.mapbox.com/downloads/v2/releases/maven\")\n    credentials {\n      username = \"mapbox\"\n      password = System.getenv(\"SDK_REGISTRY_TOKEN\") ?: project.property(\"SDK_REGISTRY_TOKEN\") as String\n    }\n    authentication {\n      create<BasicAuthentication>(\"basic\")\n    }\n  }\n\n  // Some plugins are only published in plugins.gradle.org (e.g. `japicmp` one)\n  maven {\n    url = uri(\"https://plugins.gradle.org/m2/\")\n  }\n}\n\nplugins {\n  `kotlin-dsl`\n}\n\ngradlePlugin {\n  plugins {\n    register(\"MapboxRootPlugin\") {\n      id = \"com.mapbox.gradle.root\"\n      implementationClass = \"com.mapbox.maps.gradle.plugins.MapboxRootPlugin\"\n    }\n    register(\"MapboxLibraryPlugin\") {\n      id = \"com.mapbox.gradle.library\"\n      implementationClass = \"com.mapbox.maps.gradle.plugins.MapboxLibraryPlugin\"\n    }\n    register(\"MapboxApplicationPlugin\") {\n      id = \"com.mapbox.gradle.application\"\n      implementationClass = \"com.mapbox.maps.gradle.plugins.MapboxApplicationPlugin\"\n    }\n  }\n}\n\nkotlin {\n  explicitApi()\n  compilerOptions {\n    allWarningsAsErrors = true\n  }\n}\n\ndependencies {\n  compileOnly(gradleApi())\n\n  // compileOnly because we want to leave versioning to the consumers\n  compileOnly(libs.plugin.gradle)\n  implementation(libs.plugin.dokka)\n  implementation(libs.plugin.japicmp)\n  implementation(libs.plugin.jacoco)\n  implementation(libs.plugin.mapbox.accessToken)\n  implementation(libs.plugin.mapbox.sdkRegistry)\n}"
  },
  {
    "path": "mapbox-convention-plugin/settings.gradle.kts",
    "content": "dependencyResolutionManagement {\n  versionCatalogs {\n    create(\"libs\") {\n      from(files(\"$rootDir/../gradle/libs.versions.toml\"))\n    }\n  }\n}\n\nrootProject.name = \"MapboxConventionPlugin\""
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/MapboxPlugins.kt",
    "content": "package com.mapbox.maps.gradle.plugins\n\nimport com.mapbox.maps.gradle.plugins.extensions.MapboxApplicationExtension.Companion.mapboxApplicationExtension\nimport com.mapbox.maps.gradle.plugins.extensions.MapboxLibraryExtension.Companion.mapboxLibraryExtension\nimport com.mapbox.maps.gradle.plugins.extensions.MapboxRootExtension.Companion.mapboxRootExtension\nimport org.gradle.api.GradleException\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\n\n@Suppress(\"unused\")\ninternal class MapboxLibraryPlugin : Plugin<Project> {\n  override fun apply(project: Project) {\n    project.mapboxLibraryExtension().applyTo(project)\n  }\n}\n\n@Suppress(\"unused\")\ninternal class MapboxApplicationPlugin : Plugin<Project> {\n  override fun apply(project: Project) {\n    project.mapboxApplicationExtension().applyTo(project)\n  }\n}\n\n@Suppress(\"unused\")\ninternal class MapboxRootPlugin : Plugin<Project> {\n  override fun apply(project: Project) {\n    if (project != project.rootProject) {\n      throw GradleException(\"Mapbox root plugin can only be applied to root project\")\n    }\n    project.mapboxRootExtension().applyTo(project)\n  }\n}\n"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/extensions/MapboxApplicationExtension.kt",
    "content": "package com.mapbox.maps.gradle.plugins.extensions\n\nimport com.mapbox.AccessTokenExtension\nimport org.gradle.api.Project\nimport org.gradle.api.model.ObjectFactory\nimport javax.inject.Inject\n\npublic abstract class MapboxApplicationExtension @Inject constructor(objects: ObjectFactory) :\n  MapboxDependenciesExtension(objects) {\n\n  override fun applyTo(project: Project) {\n    super.applyTo(project)\n    project.applyRequiredPlugins()\n    project.configureAccessTokenExtension()\n  }\n\n  private fun Project.configureAccessTokenExtension() {\n    val accessTokenExtension = extensions.getByType(AccessTokenExtension::class.java)\n    accessTokenExtension.file = file(\"src/main/res/values/developer-config.xml\").canonicalPath\n  }\n\n  private fun Project.applyRequiredPlugins() {\n    plugins.apply(\"com.android.application\")\n    plugins.apply(\"kotlin-android\")\n    plugins.apply(\"com.mapbox.maps.token\")\n  }\n\n  internal companion object {\n    private const val NAME = \"mapboxApplication\"\n\n    internal fun Project.mapboxApplicationExtension(): MapboxApplicationExtension =\n      extensions.create(NAME, MapboxApplicationExtension::class.java)\n  }\n}"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/extensions/MapboxDependenciesExtension.kt",
    "content": "package com.mapbox.maps.gradle.plugins.extensions\n\nimport com.mapbox.maps.gradle.plugins.internal.MapboxDependencies\nimport com.mapbox.maps.gradle.plugins.internal.newInstance\nimport org.gradle.api.Action\nimport org.gradle.api.Project\nimport org.gradle.api.model.ObjectFactory\n\npublic open class MapboxDependenciesExtension(objects: ObjectFactory) {\n\n  private val glNative = objects.newInstance<MapboxDependencyExtension>(MapboxDependencies.GlNative)\n  private val common = objects.newInstance<MapboxDependencyExtension>(MapboxDependencies.Common)\n\n  /** Configure the inner DSL object, [MapboxDependencyExtension]. */\n  public fun glNative(action: Action<MapboxDependencyExtension>? = null) {\n    glNative.enabled = true\n    action?.execute(glNative)\n  }\n\n  /** Configure the inner DSL object, [MapboxDependencyExtension]. */\n  public fun common(action: Action<MapboxDependencyExtension>? = null) {\n    common.enabled = true\n    action?.execute(common)\n  }\n\n  internal open fun applyTo(project: Project) {\n    glNative.applyTo(project)\n    common.applyTo(project)\n  }\n}\n"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/extensions/MapboxDependencyExtension.kt",
    "content": "package com.mapbox.maps.gradle.plugins.extensions\n\nimport com.mapbox.maps.gradle.plugins.internal.BaseDependency\nimport com.mapbox.maps.gradle.plugins.internal.setDisallowChanges\nimport org.gradle.api.Project\nimport org.gradle.api.model.ObjectFactory\nimport org.gradle.api.provider.ListProperty\nimport org.gradle.api.provider.Property\nimport org.gradle.kotlin.dsl.listProperty\nimport org.gradle.kotlin.dsl.property\nimport javax.inject.Inject\n\npublic abstract class MapboxDependencyExtension\n@Inject\ninternal constructor(\n  objects: ObjectFactory,\n  private val dependency: BaseDependency\n) {\n  private val enabledProperty: Property<Boolean> = objects.property<Boolean>().convention(false)\n  private val configurationProperty: ListProperty<String> =\n    objects.listProperty<String>().convention(listOf(\"implementation\"))\n\n  /**\n   * True if this dependency should be added.\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  internal var enabled: Boolean\n    get() = enabledProperty.get()\n    set(value) {\n      enabledProperty.setDisallowChanges(value)\n    }\n\n  /**\n   * The configuration name to use when defining the dependency for the project.\n   *\n   * See [configurations] to add multiple configurations.\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var configuration: String\n    get() = configurationProperty.get().first()\n    set(value) {\n      configurationProperty.setDisallowChanges(listOf(value))\n    }\n\n  /**\n   * The configuration names to use when defining the dependency for the project.\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var configurations: List<String>\n    get() = configurationProperty.get()\n    set(value) {\n      configurationProperty.setDisallowChanges(value)\n    }\n\n  internal fun applyTo(project: Project) = project.afterEvaluate {\n    if (enabled) {\n      this@MapboxDependencyExtension.configurations.forEach { configuration ->\n        dependency.add(this, configuration)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/extensions/MapboxDokkaExtension.kt",
    "content": "package com.mapbox.maps.gradle.plugins.extensions\n\nimport com.android.build.gradle.LibraryExtension\nimport com.android.builder.model.SourceProvider\nimport com.mapbox.maps.gradle.plugins.internal.setDisallowChanges\nimport org.gradle.api.GradleException\nimport org.gradle.api.Project\nimport org.gradle.api.model.ObjectFactory\nimport org.gradle.api.provider.ListProperty\nimport org.gradle.api.provider.Property\nimport org.gradle.api.tasks.TaskProvider\nimport org.gradle.kotlin.dsl.listProperty\nimport org.jetbrains.dokka.gradle.DokkaCollectorTask\nimport org.jetbrains.dokka.gradle.DokkaTask\nimport javax.inject.Inject\n\n/**\n * Dokka extension that takes care of setting up related tasks and configuration for Dokka.\n *\n * It can be applied to root project (see [applyToRootProject]) or Android library subproject\n * (see [applyTo]).\n */\npublic abstract class MapboxDokkaExtension @Inject constructor(objects: ObjectFactory) {\n  private val extraListOfSourcesProperty: ListProperty<String> =\n    objects.listProperty<String>().convention(emptyList())\n\n  /**\n   * List of files to include as part of the Dokka source sets when generating documentation.\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var extraListOfSources: List<String>\n    get() = extraListOfSourcesProperty.get()\n    set(value) {\n      extraListOfSourcesProperty.setDisallowChanges(value)\n    }\n\n  private val reportUndocumentedProperty: Property<Boolean> =\n    objects.property(Boolean::class.java).convention(true)\n\n  /**\n   * Whether to emit warnings about visible undocumented declarations.\n   * `true` by default.\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var reportUndocumented: Boolean\n    get() = reportUndocumentedProperty.get()\n    set(value) {\n      reportUndocumentedProperty.setDisallowChanges(value)\n    }\n\n  internal fun applyToRootProject(project: Project) {\n    project.applyRequiredPlugins()\n    configureRootProjectDokka(project)\n  }\n\n  internal fun applyTo(project: Project, libraryExtension: LibraryExtension) {\n    project.applyRequiredPlugins()\n    libraryExtension.configureDokka(project)\n  }\n\n  private fun Project.applyRequiredPlugins() {\n    plugins.apply(\"org.jetbrains.dokka\")\n  }\n\n  private fun configureRootProjectDokka(rootProject: Project) = rootProject.run {\n    tasks.withType(DokkaCollectorTask::class.java).configureEach {\n      failOnWarning.set(true)\n    }\n  }\n\n  private fun LibraryExtension.configureDokka(project: Project) {\n    // \"mapbox.dokkaHtmlFlavor\" holds the variant to use. For example, \"release\". This is used\n    // when executing `dokkaHtmlCollector` task to be able to limit the source set to a specific\n    // variant\n    libraryVariants.all {\n      if (this.buildType.isDebuggable) {\n        return@all\n      }\n      val variantName: String = name\n      registerVariantDokkaJavadocTask(project, variantName).configure {\n        configureDokkaTaskSourceSets(variantName, sourceSets)\n      }\n\n      val mapboxHtmlDokkaFlavor: String? = project.findProperty(\"mapbox.dokkaHtmlFlavor\") as String?\n      val taskNames = project.gradle.startParameter.taskNames\n      if ((taskNames.contains(\"dokkaHtmlCollector\") || taskNames.contains(\"dokkaHtml\")) && mapboxHtmlDokkaFlavor == null) {\n        throw GradleException(\"Parameter `mapbox.dokkaHtmlFlavor` must be defined with `privateRelease` of `publicRelease`. For example, `./gradlew dokkaHtmlCollector -Pmapbox.dokkaHtmlFlavor=privateRelease`\")\n      }\n      if (variantName == mapboxHtmlDokkaFlavor) {\n        project.logger.warn(\"Forcing all Dokka tasks to variant $variantName\")\n        project.tasks.withType(DokkaTask::class.java).configureEach {\n          // Skip our own dokka tasks that are already configured\n          if (taskIdentity.taskType == OwnDokkaTask::class.java) {\n            return@configureEach\n          }\n          configureDokkaTaskSourceSets(variantName, sourceSets)\n        }\n      }\n    }\n  }\n\n  private fun registerVariantDokkaJavadocTask(\n    project: Project,\n    variantName: String\n  ): TaskProvider<OwnDokkaTask> =\n    project.tasks.register(\"${variantName}DokkaJavadoc\", OwnDokkaTask::class.java) {\n      // We want to generate Javadoc so we copy the `dokkaJavadoc` task plugins/runtime\n      val dokkaJavadocTask = project.tasks.findByName(\"dokkaJavadoc\") as DokkaTask\n      plugins.setExtendsFrom(listOf(dokkaJavadocTask.plugins))\n      runtime.setExtendsFrom(listOf(dokkaJavadocTask.runtime))\n    }\n\n  private fun DokkaTask.configureDokkaTaskSourceSets(\n    variantName: String,\n    sourceSets: MutableList<SourceProvider>\n  ) {\n    // First disable all dokka source sets except the `variantName` one that will be used later\n    dokkaSourceSets.configureEach {\n      suppress.set(name != variantName)\n    }\n    // To avoid undocumented inherited methods/classes we need to join all the source roots\n    // related to the flavor release variant into one source set (`variantName`).\n    dokkaSourceSets.named(variantName) {\n      sourceSets.forEach {\n        it.javaDirectories.forEach { javaDirectory ->\n          sourceRoots.from(javaDirectory)\n        }\n      }\n      this@MapboxDokkaExtension.extraListOfSources.forEach { filePath ->\n        if (filePath.isNotBlank() && !filePath.startsWith(\"//\")) {\n          sourceRoots.from(project.file(\"${project.rootDir}/$filePath\"))\n        }\n      }\n      reportUndocumented.set(this@MapboxDokkaExtension.reportUndocumented)\n      failOnWarning.set(true)\n    }\n  }\n\n  /**\n   * Our own [DokkaTask] to differentiate it from the ones provided by the Dokka plugin\n   */\n  internal abstract class OwnDokkaTask : DokkaTask()\n}\n"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/extensions/MapboxJApiCmpExtension.kt",
    "content": "package com.mapbox.maps.gradle.plugins.extensions\n\nimport com.mapbox.maps.gradle.plugins.internal.setDisallowChanges\nimport japicmp.model.JApiAnnotation\nimport japicmp.model.JApiClass\nimport japicmp.model.JApiCompatibility\nimport japicmp.model.JApiCompatibilityChangeType\nimport japicmp.model.JApiField\nimport japicmp.model.JApiMethod\nimport javassist.CtMethod\nimport me.champeau.gradle.japicmp.JapicmpTask\nimport me.champeau.gradle.japicmp.report.RichReportData\nimport me.champeau.gradle.japicmp.report.RichReportRenderer\nimport me.champeau.gradle.japicmp.report.Severity\nimport me.champeau.gradle.japicmp.report.Violation\nimport me.champeau.gradle.japicmp.report.stdrules.AbstractRecordingSeenMembers\nimport me.champeau.gradle.japicmp.report.stdrules.BinaryIncompatibleRule\nimport me.champeau.gradle.japicmp.report.stdrules.RecordSeenMembersSetup\nimport org.gradle.api.Project\nimport org.gradle.api.model.ObjectFactory\nimport org.gradle.api.provider.Property\nimport org.gradle.api.publish.PublishingExtension\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.tasks.Exec\nimport org.gradle.kotlin.dsl.property\nimport org.gradle.language.base.plugins.LifecycleBasePlugin\nimport java.io.File\nimport java.nio.file.Files\nimport javax.inject.Inject\n\npublic abstract class MapboxJApiCmpExtension @Inject constructor(objects: ObjectFactory) {\n  private val currentVersionProperty: Property<String> = objects.property<String>()\n  private val previousVersionProperty: Property<String> = objects.property<String>()\n  private val artifactGroupIdProperty: Property<String> = objects.property<String>()\n  private val artifactIdProperty: Property<String> = objects.property<String>()\n  private val downloadTokenProperty: Property<String> = objects.property<String>()\n\n  /**\n   * Current library version (e.g. `11.0.0-SNAPSHOT`)\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var currentVersion: String\n    get() = currentVersionProperty.get()\n    set(value) {\n      currentVersionProperty.setDisallowChanges(value)\n    }\n\n  /**\n   * Previous library version (e.g. `11.0.0-SNAPSHOT`) to compare against\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var previousVersion: String\n    get() = previousVersionProperty.get()\n    set(value) {\n      previousVersionProperty.setDisallowChanges(value)\n    }\n\n  /**\n   * Artifact group ID (e.g. `com.mapbox.maps`)\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var artifactGroupId: String\n    get() = artifactGroupIdProperty.get()\n    set(value) {\n      artifactGroupIdProperty.setDisallowChanges(value)\n    }\n\n  /**\n   * Artifact ID (e.g. `maps-viewport`)\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var artifactId: String\n    get() = artifactIdProperty.get()\n    set(value) {\n      artifactIdProperty.setDisallowChanges(value)\n    }\n\n  /**\n   * Mapbox Download Token to use when fetching artifacts\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var downloadToken: String\n    get() = downloadTokenProperty.get()\n    set(value) {\n      downloadTokenProperty.setDisallowChanges(value)\n    }\n\n  internal fun applyTo(project: Project) {\n    project.applyRequiredPlugins()\n    project.configure()\n  }\n\n  private fun Project.applyRequiredPlugins() {\n    plugins.apply(\"me.champeau.gradle.japicmp\")\n    plugins.apply(\"maven-publish\")\n  }\n\n  private fun Project.configure() {\n    val fetchPreviousReleaseAarTask = tasks.register(\"fetchPreviousReleaseAar\", Exec::class.java) {\n      val workingDir = layout.buildDirectory.dir(\"intermediates/previous_release\")\n      Files.createDirectories(workingDir.get().asFile.toPath())\n      workingDir(workingDir)\n\n      val publishing = project.extensions.getByType(PublishingExtension::class.java)\n      val releasePublication = publishing.publications.named(\"release\").get() as MavenPublication\n      val lastStableVersion = providers.gradleProperty(\"LAST_STABLE_VERSION\").orNull\n\n      val versionToFetch = if (previousVersionProperty.isPresent) {\n        previousVersionProperty.get()\n      } else if (lastStableVersion != null) {\n        lastStableVersion\n      } else {\n        val currentVersion =\n          currentVersionProperty.getOrElse(releasePublication.version as String)\n        val (majorStr, minorStr, patchStr) = semverRegex.find(currentVersion)!!.destructured\n        var major = majorStr.toInt()\n        var minor = minorStr.toInt()\n        var patch = patchStr.toInt()\n        if (patch > 0) {\n          patch--\n        } else if (minor > 0) {\n          minor--\n        } else {\n          major--\n        }\n\n        \"$major.$minor.$patch\"\n      }\n\n\n      val artifactGroupId = artifactGroupIdProperty.getOrElse(releasePublication.groupId)\n      val artifactPath = artifactGroupId.replace('.', '/')\n      val artifactId = artifactIdProperty.getOrElse(releasePublication.artifactId)\n      // https://api.mapbox.com/downloads/v2/releases/maven/com/mapbox/maps/base/11.0.0/base-11.0.0.aar\n      val url =\n        \"https://api.mapbox.com/downloads/v2/releases/maven/${artifactPath}/${artifactId}/${versionToFetch}/${artifactId}-${versionToFetch}.aar\"\n      val outputAar = \"${artifactId}-${versionToFetch}.aar\"\n\n      val sdkRegistryToken = downloadTokenProperty.orNull\n        ?: System.getenv(\"SDK_REGISTRY_TOKEN\")\n        ?: providers.gradleProperty(\"SDK_REGISTRY_TOKEN\").orNull\n\n      commandLine(\n        \"curl\",\n        \"-fL\",\n        \"--user\",\n        \"mapbox:$sdkRegistryToken\",\n        url,\n        \"--output\",\n        outputAar\n      )\n      outputs.file(workingDir.get().file(outputAar))\n    }\n    val preparePreviousReleaseLibJarsTask =\n      tasks.register(\"preparePreviousReleaseLibJars\", Exec::class.java) {\n        dependsOn(fetchPreviousReleaseAarTask)\n\n        val releaseAar = fetchPreviousReleaseAarTask.get().outputs.files.single()\n        val releaseName = releaseAar.nameWithoutExtension\n        workingDir = releaseAar.parentFile\n\n        commandLine(\"unzip\", \"-qq\", releaseAar, \"classes.jar\")\n        val classesJarFile = workingDir.resolve(\"classes.jar\")\n        val releaseJarFile = workingDir.resolve(\"${releaseName}.jar\")\n        outputs.file(releaseJarFile)\n\n        doLast {\n          classesJarFile.renameTo(releaseJarFile)\n        }\n      }\n\n    tasks.register(\"japicmp\", JapicmpTask::class.java) {\n      group = LifecycleBasePlugin.VERIFICATION_GROUP\n      description = \"Uses japicmp to report was has changed between releases\"\n\n      val syncReleaseLibJarsTask = tasks.named(\"syncReleaseLibJars\")\n      dependsOn(syncReleaseLibJarsTask, preparePreviousReleaseLibJarsTask)\n\n      // Assign the jar from previous release\n      oldClasspath.from(preparePreviousReleaseLibJarsTask.get().outputs.files.single())\n\n      // Figure out the new classes.jar for the current source code\n      val inputClassesJar =\n        syncReleaseLibJarsTask.get().outputs.files.filter { it.isFile && it.name == \"classes.jar\" }\n      newClasspath.from(inputClassesJar)\n\n      onlyModified.set(true)\n      //includeSynthetic.set(true)\n      ignoreMissingClasses.set(true)\n\n      // Exclude @RestrictTo, @VisibleForTesting and @MapboxExperimental annotations\n      annotationExcludes.set(\n        listOf(\n          RESTRICT_TO_ANNOTATION,\n          EXPERIMENTAL_ANNOTATION,\n          MAPS_EXPERIMENTAL_ANNOTATION,\n          VISIBLE_FOR_TESTING_ANNOTATION,\n        )\n      )\n\n      richReport {\n        addDefaultRules.set(true)\n        addSetupRule(RecordSeenMembersSetup::class.java)\n        addRule(InternalFilterRule::class.java)\n        destinationDir.set(rootProject.layout.projectDirectory.dir(\"japicmp-report/\"))\n        reportName.set(\"${project.path.drop(1)}.txt\")\n        renderer(CompatibilityReportRenderer::class.java)\n      }\n\n      htmlOutputFile.set(\n        rootProject.layout.buildDirectory.file(\"reports/japi/raw/${project.path.drop(1)}.html\")\n      )\n    }\n  }\n\n  /**\n   * Custom renderer to write compatibility violations to a file.\n   */\n  internal class CompatibilityReportRenderer : RichReportRenderer {\n    override fun render(\n      destinationDir: File?,\n      data: RichReportData?\n    ) {\n      // we only care about breaking changes\n      // otherwise report might be noisy since japicmp will report info and accepted changes too\n      val violations = data?.violations?.map { it.value }?.flatten()\n        ?.filter { it.severity == Severity.error }\n        ?.sortedBy { it.toString() }\n\n      if (violations.isNullOrEmpty()) {\n        // remove destination file as it'll be empty otherwise\n        destinationDir?.delete()\n        return\n      }\n      destinationDir?.bufferedWriter().use { writer ->\n        violations.forEach { violation ->\n          writer?.appendLine(violation.toString())\n        }\n      }\n    }\n  }\n\n  internal companion object {\n    private val semverRegex = \"^(0|[1-9]\\\\d*)\\\\.(0|[1-9]\\\\d*)\\\\.(0|[1-9]\\\\d*)\".toRegex()\n  }\n}\n\n\n/**\n * Changes to non-internal properties and changing their visibility to `internal` is a breaking change.\n * However, changes to the internal variables are not considered as a breaking change.\n */\npublic class InternalFilterRule : AbstractRecordingSeenMembers() {\n  private val binaryIncompatibleRule = BinaryIncompatibleRule()\n\n  override fun maybeAddViolation(member: JApiCompatibility): Violation? {\n    return if (member.containsInternallyVisibleFunctionOrVariableChanges()) {\n      Violation.accept(member, \"Kotlin internal visibility\")\n    } else if (member.hasOnlyKotlinMetadataModification()) {\n      Violation.accept(member, \"Kotlin metadata change\")\n    } else if(member.classContainsOnlyMethodChangesWithExcludedAnnotations()) {\n      Violation.accept(member, \"Contains changes to excluded annotations\")\n    } else if(member.containsChangesToCompanionObjectVariableWithExcludedAnnotations()) {\n      Violation.accept(member, \"Companion object variable with excluded annotations\")\n    } else {\n      binaryIncompatibleRule.maybeAddViolation(member)\n    }\n  }\n\n  /**\n   * This function checks if the given JApiCompatibility object has a change to an internal variable or function.\n   */\n  private fun JApiCompatibility.containsInternallyVisibleFunctionOrVariableChanges(): Boolean {\n    if (this.isBinaryCompatible) return false\n    val member = (this as? JApiMethod) ?: return false\n    val isKotlinClass = member.itOrDeclaringClassContainsKotlinMetadata()\n    // Check if the method corresponds to an internal variable\n    return isKotlinClass && member.name.contains(\"$\") && member.accessModifier.valueOld.equals(\n      \"public\", ignoreCase = true\n    )\n  }\n\n  /**\n   * This function checks if the given JApiCompatibility object has a modification to the Kotlin metadata.\n   * If the change is an  annotation modification and the member is a class,\n   * it checks if the class has only Kotlin metadata changes.\n   *\n   * @return true if member is not binary compatible and contains only Kotlin metadata changes, false otherwise.\n   */\n  private fun JApiCompatibility.hasOnlyKotlinMetadataModification(): Boolean {\n    if (this.isBinaryCompatible) return false\n    val member = this as? JApiClass\n    val incompatibleChanges = member?.compatibilityChanges\n    val compatibilityChange = incompatibleChanges?.firstOrNull()?.takeIf {\n      it.type == JApiCompatibilityChangeType.ANNOTATION_MODIFIED && incompatibleChanges.size == 1\n    }\n    if (compatibilityChange == null) return false\n    return member.annotations.containsKotlinMetadata()\n  }\n\n  private fun JApiMethod.itOrDeclaringClassContainsKotlinMetadata(): Boolean {\n    return this.annotations.containsKotlinMetadata() || this.getjApiClass()?.annotations.containsKotlinMetadata() == true\n  }\n\n  private fun List<JApiAnnotation>?.containsKotlinMetadata(): Boolean {\n    return this?.any { it.fullyQualifiedName == \"kotlin.Metadata\" } == true\n  }\n\n  /**\n   * When we have a constant declared in a companion object, the annotation is declared in separate class ending with '$Companion'.\n   * This function checks if field is declared in companion object and if it has any of the excluded annotations.\n   */\n  private fun JApiCompatibility.containsChangesToCompanionObjectVariableWithExcludedAnnotations(): Boolean {\n    if (this.isBinaryCompatible) return false\n    val member = (this as? JApiField) ?: return false\n    // Get the declaring class first\n    val declaringClass = member.getjApiClass()\n    val oldClass = declaringClass.oldClass.orElse(null) ?: return false\n    val companionClass =\n      oldClass.declaredClasses.firstOrNull { it.name.contains(\"${oldClass.name}\\$Companion\") }\n        ?: return false\n    val methodMatchingFieldName =\n      companionClass.methods.firstOrNull { it.name.contains(member.name) } ?: return false\n    return methodMatchingFieldName.containsExcludedAnnotation()\n  }\n\n  private fun CtMethod.containsExcludedAnnotation(): Boolean {\n    return arrayOf(\n      RESTRICT_TO_ANNOTATION,\n      MAPS_EXPERIMENTAL_ANNOTATION,\n      VISIBLE_FOR_TESTING_ANNOTATION,\n      EXPERIMENTAL_ANNOTATION\n    )\n      .map { it.substring(1) }\n      .any {\n        hasAnnotation(it)\n      }\n  }\n\n  /**\n   * Checks if all method updates in a class and its declared classes only affect methods with excluded annotations.\n   *\n   * This function identifies methods that existed in the old version of a class and its nested classes\n   * but were either removed or changed in the new version. It goes through updated methods\n   * and checks whether they contain excluded annotations (like @MapboxExperimental, @RestrictTo, etc.).\n   *\n   * @return true if all method changes only affect methods with excluded annotations.\n   */\n  private fun JApiCompatibility.classContainsOnlyMethodChangesWithExcludedAnnotations(): Boolean {\n    if (this.isBinaryCompatible) return false\n    val member = (this as? JApiClass) ?: return false\n    // Get the declaring class first\n    val declaringClass = member\n    val oldClass = declaringClass.oldClass.orElse(null) ?: return false\n    val newClass = declaringClass.newClass.orElse(null) ?: return false\n    val oldMethods = (oldClass.methods + oldClass.declaredClasses.flatMap { it.methods.toList() }).toMutableList()\n    val newMethods = newClass.methods + newClass.declaredClasses.flatMap { it.methods.toList() }\n    newMethods.forEach { newMethod ->\n      // remove methods that have the same name and signature\n      oldMethods.removeIf {\n        it.name == newMethod.name && it.signature == newMethod.signature\n      }\n    }\n    // Remaining methods might be deleted or have been changed.\n    // If they contain excluded annotations, we will not consider them as breaking changes.\n    // That's why we check if all of them contain excluded annotations.\n    // If there is at least one method that doesn't contain excluded annotation,\n    // we will consider it as breaking change and JApiCmp should provide details in the report.\n    return oldMethods.all { it.containsExcludedAnnotation() }\n  }\n}\n\nprivate const val RESTRICT_TO_ANNOTATION = \"@androidx.annotation.RestrictTo\"\nprivate const val MAPS_EXPERIMENTAL_ANNOTATION = \"@com.mapbox.maps.MapboxExperimental\"\nprivate const val VISIBLE_FOR_TESTING_ANNOTATION = \"@androidx.annotation.VisibleForTesting\"\nprivate const val EXPERIMENTAL_ANNOTATION = \"@com.mapbox.annotation.MapboxExperimental\"\n"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/extensions/MapboxJacocoExtension.kt",
    "content": "package com.mapbox.maps.gradle.plugins.extensions\n\nimport com.android.build.api.variant.AndroidComponentsExtension\nimport com.android.build.api.variant.Variant\nimport com.mapbox.maps.gradle.plugins.internal.setDisallowChanges\nimport org.gradle.api.Project\nimport org.gradle.api.model.ObjectFactory\nimport org.gradle.api.provider.ListProperty\nimport org.gradle.api.provider.Property\nimport org.gradle.api.tasks.testing.Test\nimport org.gradle.kotlin.dsl.configure\nimport org.gradle.kotlin.dsl.listProperty\nimport org.gradle.kotlin.dsl.register\nimport org.gradle.testing.jacoco.plugins.JacocoPluginExtension\nimport org.gradle.testing.jacoco.plugins.JacocoTaskExtension\nimport org.gradle.testing.jacoco.tasks.JacocoReport\nimport java.util.Locale\nimport javax.inject.Inject\n\n/**\n * Jacoco extension that takes care of setting up Jacoco.\n *\n * It can be applied to Android library subproject (see [applyTo]).\n */\npublic abstract class MapboxJacocoExtension @Inject constructor(objects: ObjectFactory) {\n\n  private val excludesProperty: ListProperty<String> = objects.listProperty<String>()\n    .convention(DEFAULT_EXCLUDED)\n\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var excludes: List<String>\n    get() = excludesProperty.get()\n    set(value) {\n      excludesProperty.setDisallowChanges(value)\n    }\n\n  private val xmlEnabledProperty: Property<Boolean> =\n    objects.property(Boolean::class.java).convention(true)\n\n  /**\n   * A flag that determines whether XML report should be generated.\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var xmlEnabled: Boolean\n    get() = xmlEnabledProperty.get()\n    set(value) {\n      xmlEnabledProperty.setDisallowChanges(value)\n    }\n\n  private val htmlEnabledProperty: Property<Boolean> =\n    objects.property(Boolean::class.java).convention(true)\n\n  /**\n   * A flag that determines whether HTML report should be generated.\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var htmlEnabled: Boolean\n    get() = htmlEnabledProperty.get()\n    set(value) {\n      htmlEnabledProperty.setDisallowChanges(value)\n    }\n\n  private val csvEnabledProperty: Property<Boolean> =\n    objects.property(Boolean::class.java).convention(true)\n\n  /**\n   * A flag that determines whether CSV report should be generated.\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var csvEnabled: Boolean\n    get() = csvEnabledProperty.get()\n    set(value) {\n      csvEnabledProperty.setDisallowChanges(value)\n    }\n\n  internal fun applyTo(project: Project) {\n    project.applyRequiredPlugins()\n    project.extensions.configure<JacocoPluginExtension> {\n      toolVersion = \"0.8.12\"\n    }\n    project.tasks.withType(Test::class.java).configureEach {\n      extensions.configure<JacocoTaskExtension> {\n        isIncludeNoLocationClasses = true\n        excludes = listOf(\"jdk.internal.*\")\n      }\n    }\n\n    project.extensions.getByType(AndroidComponentsExtension::class.java).onVariants {\n      project.configureJacocoForVariant(it)\n    }\n  }\n\n  private fun Project.configureJacocoForVariant(variant: Variant) {\n    val variantName = variant.name\n    val capitalizedVariant = variantName.replaceFirstChar { it.uppercase(Locale.ROOT) }\n    val testTaskName = \"test${capitalizedVariant}UnitTest\"\n    val reportTaskName = \"jacoco${testTaskName.replaceFirstChar { it.uppercase(Locale.ROOT) }}Report\"\n\n    tasks.register<JacocoReport>(reportTaskName) {\n      dependsOn(testTaskName)\n      group = \"Reporting\"\n      description = \"Generate Jacoco coverage reports for the $capitalizedVariant variant.\"\n\n      reports {\n        xml.required.set(xmlEnabled)\n        xml.outputLocation.set(\n          project.layout.buildDirectory.file(\"jacoco/jacoco.xml\").get().asFile\n        )\n\n        html.required.set(htmlEnabled)\n        html.outputLocation.set(\n          project.layout.buildDirectory.file(\"jacoco/jacocoHtml\").get().asFile\n        )\n\n        csv.required.set(csvEnabled)\n        csv.outputLocation.set(\n          project.layout.buildDirectory.file(\"jacoco/jacoco.csv\").get().asFile\n        )\n      }\n\n      val javaClasses = fileTree(layout.buildDirectory.dir(\"intermediates/javac/$variantName\")) {\n        exclude(this@MapboxJacocoExtension.excludes)\n      }\n      val kotlinClasses = fileTree(layout.buildDirectory.dir(\"tmp/kotlin-classes/$variantName\")) {\n        exclude(this@MapboxJacocoExtension.excludes)\n      }\n\n      classDirectories.setFrom(files(javaClasses, kotlinClasses))\n\n      sourceDirectories.setFrom(\n        files(\n          \"$projectDir/src/main/java\",\n          \"$projectDir/src/$variantName/java\",\n          \"$projectDir/src/main/kotlin\",\n          \"$projectDir/src/$variantName/kotlin\"\n        )\n      )\n\n      executionData.setFrom(\n        fileTree(layout.buildDirectory) {\n          include(\n            \"jacoco/$testTaskName.exec\",\n            \"outputs/unit_test_code_coverage/${variantName}UnitTest/$testTaskName.exec\"\n          )\n        }\n      )\n    }\n  }\n\n  private fun Project.applyRequiredPlugins() {\n    plugins.apply(\"jacoco\")\n  }\n\n  private companion object {\n    private val DEFAULT_EXCLUDED = listOf(\n      \"android/**/*.*\",\n      \"**/databinding/*Binding.*\",\n      \"**/R.class\",\n      \"**/R$*.class\",\n      \"**/BuildConfig.*\",\n      \"**/Manifest*.*\",\n      \"**/Lambda$*.class\",\n      \"**/Lambda.class\",\n      \"**/*BR*.*\",\n      \"**/*Companion*.*\",\n      \"**/*Lambda.class\",\n      \"**/*Lambda*.class\",\n      \"**/*\\$Lambda\\$*.*\",\n      \"**/*Test*.*\",\n      \"**/*MapboxStyleManager.class\",\n      \"**/*RenderThreadStatsRecorder.class\",\n      \"com/mapbox/maps/plugin/*/generated/*\",\n    )\n  }\n}"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/extensions/MapboxLibraryExtension.kt",
    "content": "package com.mapbox.maps.gradle.plugins.extensions\n\nimport com.android.build.api.variant.LibraryAndroidComponentsExtension\nimport com.android.build.gradle.LibraryExtension\nimport com.mapbox.maps.gradle.plugins.internal.getVersionCatalog\nimport com.mapbox.maps.gradle.plugins.internal.newInstance\nimport com.mapbox.maps.gradle.plugins.internal.setDisallowChanges\nimport org.gradle.api.Action\nimport org.gradle.api.Project\nimport org.gradle.api.model.ObjectFactory\nimport org.gradle.api.provider.Property\nimport org.gradle.kotlin.dsl.property\nimport javax.inject.Inject\nimport com.android.build.api.dsl.LibraryExtension as ApiLibraryExtension\n\npublic abstract class MapboxLibraryExtension @Inject constructor(objects: ObjectFactory) :\n  MapboxDependenciesExtension(objects) {\n\n  private var jApiCmpEnabledProperty: Property<Boolean> =\n    objects.property<Boolean>().convention(true)\n\n  /** Whether jApiCmpEnabled is enabled. Defaults to true. */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  public var jApiCmpEnabled: Boolean\n    get() = jApiCmpEnabledProperty.get()\n    set(value) {\n      jApiCmpEnabledProperty.setDisallowChanges(value)\n    }\n\n  private val dokka = objects.newInstance<MapboxDokkaExtension>()\n  private val jApiCmp = objects.newInstance<MapboxJApiCmpExtension>()\n  private val jacoco = objects.newInstance<MapboxJacocoExtension>()\n  private val publishLibrary = objects.newInstance<MapboxPublishLibraryExtension>()\n\n  /** Configure the inner DSL object, [MapboxDokkaExtension]. */\n  public fun dokka(action: Action<MapboxDokkaExtension>) {\n    action.execute(dokka)\n  }\n\n  /** Configure the inner DSL object, [MapboxJApiCmpExtension]. */\n  public fun jApiCmp(action: Action<MapboxJApiCmpExtension>) {\n    action.execute(jApiCmp)\n  }\n\n  /** Configure the inner DSL object, [MapboxJacocoExtension]. */\n  public fun jacoco(action: Action<MapboxJacocoExtension>) {\n    action.execute(jacoco)\n  }\n\n  /** Configure the inner DSL object, [MapboxJacocoExtension]. */\n  public fun publish(action: Action<MapboxPublishLibraryExtension>) {\n    publishLibrary.enabled = true\n    action.execute(publishLibrary)\n  }\n\n  override fun applyTo(project: Project) {\n    project.applyRequiredPlugins()\n    super.applyTo(project)\n\n    val androidComponentsExtension = project.extensions.getByType(LibraryAndroidComponentsExtension::class.java)\n    androidComponentsExtension.finalizeDsl { libraryExtension: ApiLibraryExtension ->\n      libraryExtension.enableBuildConfig()\n      libraryExtension.configurePublicResource(project)\n      libraryExtension.setMinCompileSdkVersion(project)\n    }\n    dokka.applyTo(project, project.extensions.getByType(LibraryExtension::class.java))\n    // we allow to disable jApiCmp so first we have to evaluate\n    project.afterEvaluate {\n      if (jApiCmpEnabledProperty.getOrElse(true)) {\n        jApiCmp.applyTo(this)\n      }\n    }\n    jacoco.applyTo(project)\n    publishLibrary.applyTo(project)\n  }\n\n  private fun Project.applyRequiredPlugins() {\n    plugins.apply(\"com.android.library\")\n    plugins.apply(\"kotlin-android\")\n  }\n\n  internal companion object {\n    private const val NAME = \"mapboxLibrary\"\n\n    internal fun Project.mapboxLibraryExtension(): MapboxLibraryExtension =\n      extensions.create(NAME, MapboxLibraryExtension::class.java)\n  }\n}\n\nprivate fun ApiLibraryExtension.configurePublicResource(project: Project) {\n  sourceSets.all {\n    // limit amount of exposed library resources\n    res.srcDir(\"${project.projectDir}/src/$name/res-public\")\n  }\n}\n\nprivate fun ApiLibraryExtension.setMinCompileSdkVersion(project: Project) {\n  val androidMinCompileSdkVersion =\n    project.getVersionCatalog().findVersion(\"androidMinCompileSdkVersion\")\n  if (androidMinCompileSdkVersion.isPresent) {\n    val minCompileSdkVersion = androidMinCompileSdkVersion.get().requiredVersion.toInt()\n    project.logger.info(\"Set minCompileSdkVersion=$minCompileSdkVersion\")\n    defaultConfig.aarMetadata.minCompileSdk = minCompileSdkVersion\n  } else {\n    project.logger.warn(\"androidMinCompileSdkVersion not found in versions catalog, skip setting minCompileSdkVersion..\")\n  }\n}\n\nprivate fun ApiLibraryExtension.enableBuildConfig() {\n  buildFeatures.buildConfig = true\n}"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/extensions/MapboxPublishLibraryExtension.kt",
    "content": "package com.mapbox.maps.gradle.plugins.extensions\n\nimport com.android.build.api.variant.LibraryAndroidComponentsExtension\nimport com.mapbox.maps.gradle.plugins.internal.appendNdkIfNeeded\nimport com.mapbox.maps.gradle.plugins.internal.setDisallowChanges\nimport com.mapbox.sdkregistry.SDKRegistryExtension\nimport com.mapbox.sdkregistry.SDKRegistryPublication\nimport org.gradle.api.Project\nimport org.gradle.api.model.ObjectFactory\nimport org.gradle.api.provider.Property\nimport org.gradle.api.publish.PublishingExtension\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.kotlin.dsl.property\nimport org.gradle.kotlin.dsl.register\nimport javax.inject.Inject\n\nprivate const val VARIANT_TO_PUBLISH = \"release\"\n\n/**\n * Extension that takes care of configuring publishing the library artifact to the Mapbox SDK\n * Registry and set up the right artifacts/tasks.\n *\n * It can be applied to Android library subproject (see [applyTo]).\n */\n@Suppress(\"MemberVisibilityCanBePrivate\")\npublic abstract class MapboxPublishLibraryExtension\n@Inject\nconstructor(objects: ObjectFactory) {\n  // Leverage SDKRegistryPublication by delegating because we don't want to expose all the properties\n  private val sdkRegistryPublication: SDKRegistryPublication = SDKRegistryPublication(\"\", objects)\n\n  /**\n   * Defines the name of the sdk, will be placed in the below default api Url.\n   *\n   * `s3://mapbox-api-downloads-production/v2/${sdkName}/releases/android`\n   */\n  public var sdkName: String by sdkRegistryPublication::sdkName\n  /**\n   * Defines whether to run the task in dryRun mode.\n   *\n   * When enabled, the task will prepare and pack all the artifacts locally but skip uploading to S3.\n   */\n  public var dryRun: Boolean by sdkRegistryPublication::dryRun\n  /**\n   * Defines whether to exclude the current module from the root project level's `mapboxSDKRegistryPublishAll` task.\n   *\n   * If true is specified, the module related sdk-registry tasks will be ignored from root project level's `mapboxSDKRegistryPublishAll` task.\n   *\n   * Tips:\n   *   When [executing tasks by name](https://docs.gradle.org/current/userguide/intro_multi_project_builds.html#sec:executing_tasks_by_name), the basic rule behind Gradle’s behavior is: execute all tasks down the hierarchy which have this name.\n   *   To exclude uploading/publishing tasks for given subproject, use following command: `./gradlew mapboxSDKRegistryUpload -x subproject-name-to-exclude:mapboxSDKRegistryUpload`\n   *\n   * Default: false\n   */\n  public var excludeFromRootProject: Boolean by sdkRegistryPublication::excludeFromRootProject\n\n  private val enabledProperty: Property<Boolean> = objects.property<Boolean>().convention(false)\n  private val publishProperty: Property<Boolean> = objects.property<Boolean>().convention(true)\n  private val publishMessageProperty: Property<String> = objects.property<String>().convention(\"cc @mapbox/maps-android\")\n  private val versionNameOverrideProperty: Property<String> = objects.property<String>()\n  private val snapshotOverrideProperty: Property<Boolean> = objects.property<Boolean>()\n  private val groupProperty: Property<String> = objects.property<String>()\n  private val artifactIdProperty: Property<String> = objects.property<String>()\n  private val artifactTitleProperty: Property<String> = objects.property<String>()\n  private val artifactDescriptionProperty: Property<String> = objects.property<String>()\n  private val publishNdkVariantProperty: Property<Boolean> = objects.property<Boolean>().convention(true)\n  /**\n   * Defines whether to publish the release when artifacts are uploaded.\n   *\n   * When enabled, the task will publish the release after the artifacts are uploaded.\n   *\n   * Default: true\n   */\n  public var publish: Boolean\n    get() = publishProperty.get()\n    set(value) = publishProperty.setDisallowChanges(value)\n  /**\n   * Defines the message appending to the publish PR's description.\n   *\n   * Optional, when specified, the message would be appended to the publish PR.\n   * Use this option to add the team for review.\n   *\n   * Default: \"cc @mapbox/maps-android\"\n   */\n  public var publishMessage: String\n    get() = publishMessageProperty.get()\n    set(value) = publishMessageProperty.setDisallowChanges(value)\n\n  /**\n   * Internal flag to know if this extension should be configured.\n   */\n  internal var enabled: Boolean\n    get() = enabledProperty.get()\n    set(value) = enabledProperty.setDisallowChanges(value)\n\n  /**\n   * Version name to use instead of the global one (defined in project property `VERSION_NAME`).\n   */\n  public var versionNameOverride: String\n    get() = versionNameOverrideProperty.get()\n    set(value) = versionNameOverrideProperty.setDisallowChanges(value)\n\n  /**\n   * Group ID for this project.\n   */\n  public var group: String\n    get() = groupProperty.get()\n    set(value) = groupProperty.setDisallowChanges(value)\n\n  /**\n   * Artifact ID for this project.\n   */\n  public var artifactId: String\n    get() = artifactIdProperty.get()\n    set(value) = artifactIdProperty.setDisallowChanges(value)\n\n  /**\n   * Force snapshot value, ignoring if version name contains `-SNAPSHOT`.\n   */\n  internal var snapshotOverride: Boolean\n    get() = snapshotOverrideProperty.get()\n    set(value) = snapshotOverrideProperty.setDisallowChanges(value)\n\n  /**\n   * The POM description field content.\n   */\n  public var artifactDescription: String\n    get() = artifactDescriptionProperty.get()\n    set(value) = artifactDescriptionProperty.setDisallowChanges(value)\n\n  /**\n   * The POM title field content.\n   */\n  public var artifactTitle: String\n    get() = artifactTitleProperty.get()\n    set(value) = artifactTitleProperty.setDisallowChanges(value)\n\n  /**\n   * If true, the artifact ID will be suffixed by the NDK Major version if it's not the default\n   * NDK version.\n   *\n   * True by default.\n   */\n  public var publishNdkVariant: Boolean\n    get() = publishNdkVariantProperty.get()\n    set(value) = publishNdkVariantProperty.setDisallowChanges(value)\n\n  internal fun applyTo(project: Project) {\n    project.applyRequiredPlugins()\n\n    project.extensions.getByType(LibraryAndroidComponentsExtension::class.java).apply {\n      configurePublicationVariant()\n      // We only care about `release` variant. Otherwise, we can modify the selector\n      onVariants(\n        selector = selector().withName(VARIANT_TO_PUBLISH)\n      ) { variant ->\n        project.createMavenPublication(variant.name)\n      }\n    }\n\n    project.afterEvaluate {\n      if (enabled) {\n        createSdkRegistryPublication()\n      }\n    }\n  }\n\n  @Suppress(\"UnstableApiUsage\")\n  private fun LibraryAndroidComponentsExtension.configurePublicationVariant() {\n    finalizeDsl {\n      it.publishing {\n        singleVariant(VARIANT_TO_PUBLISH) {\n          withSourcesJar()\n          withJavadocJar()\n        }\n      }\n    }\n  }\n\n  private fun Project.createMavenPublication(variantName: String) {\n    extensions.getByType(PublishingExtension::class.java).publications {\n      register<MavenPublication>(variantName) {\n        val publication = this\n        this@createMavenPublication.afterEvaluate {\n          if (!enabled) {\n            return@afterEvaluate\n          }\n          publication.from(components.getByName(variantName))\n          publication.groupId = group.toString()\n          publication.artifactId = if (publishNdkVariant) {\n            project.appendNdkIfNeeded(this@MapboxPublishLibraryExtension.artifactId)\n          } else {\n            this@MapboxPublishLibraryExtension.artifactId\n          }\n          publication.version = this.version.toString()\n        }\n\n        pom.withXml {\n          asNode().apply {\n            appendNode(\"name\", artifactTitle)\n            appendNode(\"description\", artifactDescription)\n            val url = \"https://github.com/mapbox/mapbox-maps-android\"\n            appendNode(\"url\", url)\n\n            appendNode(\"licenses\").appendNode(\"license\").apply {\n              appendNode(\"name\", \"Mapbox Terms of Service\")\n              appendNode(\"url\", \"https://www.mapbox.com/legal/tos/\")\n              appendNode(\"distribution\", \"repo\")\n            }\n\n            appendNode(\"developers\").appendNode(\"developer\").apply {\n              appendNode(\"id\", \"mapbox\")\n              appendNode(\"name\", \"Mapbox\")\n            }\n\n            appendNode(\"scm\").apply {\n              val scmUrl = \"scm:git@github.com:mapbox/mapbox-maps-android.git\"\n              appendNode(\"connection\", scmUrl)\n              appendNode(\"developerConnection\", scmUrl)\n              appendNode(\"url\", url)\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun Project.createSdkRegistryPublication() {\n    val versionName =\n      versionNameOverrideProperty.orElse(property(\"VERSION_NAME\")!!.toString()).get()\n    version = versionName\n    group = this@MapboxPublishLibraryExtension.group\n\n    val mapboxDryRun = (project.findProperty(\"mapbox.dryRun\") as String?)?.toBoolean()\n    val finalDryRun = mapboxDryRun ?: dryRun\n    val versionNameIsSnapshot = versionName.contains(\"-SNAPSHOT\")\n    val isSnapshot = snapshotOverrideProperty.orElse(versionNameIsSnapshot).get()\n    val finalSdkName = if (publishNdkVariant) {\n      project.appendNdkIfNeeded(sdkName)\n    } else {\n      sdkName\n    }\n\n    components.getByName(VARIANT_TO_PUBLISH) {\n      val currentComponent = this\n      extensions.getByType(SDKRegistryExtension::class.java).apply {\n        registryPublications {\n          register(currentComponent.name) {\n            sdkName = finalSdkName\n            dryRun = finalDryRun\n            publish = this@MapboxPublishLibraryExtension.publish\n            snapshot = isSnapshot\n            // Allow overriding if it\"s a SNAPSHOT\n            override = isSnapshot\n            publishMessage = this@MapboxPublishLibraryExtension.publishMessage\n            publications = arrayOf(currentComponent.name)\n            excludeFromRootProject = this@MapboxPublishLibraryExtension.excludeFromRootProject\n            sbom = true\n            sbomSupplier = \"Mapbox\"\n          }\n        }\n      }\n    }\n  }\n\n  private fun Project.applyRequiredPlugins() {\n    plugins.apply(\"maven-publish\")\n    plugins.apply(\"com.mapbox.sdkRegistry\")\n  }\n}"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/extensions/MapboxRootExtension.kt",
    "content": "package com.mapbox.maps.gradle.plugins.extensions\n\nimport com.mapbox.maps.gradle.plugins.internal.newInstance\nimport org.gradle.api.Action\nimport org.gradle.api.Project\nimport org.gradle.api.model.ObjectFactory\nimport javax.inject.Inject\n\npublic abstract class MapboxRootExtension @Inject constructor(objects: ObjectFactory) {\n  private val dokka = objects.newInstance<MapboxDokkaExtension>()\n\n  /** Configure the inner DSL object, [MapboxDokkaExtension]. */\n  public fun dokka(action: Action<MapboxDokkaExtension>) {\n    action.execute(dokka)\n  }\n\n  internal fun applyTo(project: Project) {\n    dokka.applyToRootProject(project)\n  }\n\n  internal companion object {\n    private const val NAME = \"mapboxRoot\"\n\n    internal fun Project.mapboxRootExtension(): MapboxRootExtension =\n      extensions.create(NAME, MapboxRootExtension::class.java)\n  }\n}"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/internal/Dependencies.kt",
    "content": "package com.mapbox.maps.gradle.plugins.internal\n\nimport org.gradle.api.Project\n\n/**\n * @param group The dependency group ID\n * @param artifact The dependency artifact ID\n * @param supportsNdkVariant True if this dependency also publishes variants for different NDKs.\n * The NDK will be suffixed to the artifact ID.\n */\ninternal abstract class BaseDependency(\n  open val group: String,\n  open val artifact: String,\n  open val supportsNdkVariant: Boolean = false,\n) {\n  abstract fun resolveVersion(project: Project): String\n\n  fun add(project: Project, configuration: String) {\n    val version = resolveVersion(project)\n    val artifactId = if (supportsNdkVariant) {\n      project.appendNdkIfNeeded(artifact)\n    } else {\n      artifact\n    }\n    val coordinates = \"${group}:$artifactId:$version\"\n    project.dependencies.add(configuration, coordinates)\n  }\n}\n\ninternal data class Dependency(\n  override val group: String,\n  override val artifact: String,\n  private val version: String,\n  override val supportsNdkVariant: Boolean = false,\n) : BaseDependency(group, artifact, supportsNdkVariant) {\n  override fun resolveVersion(project: Project): String = version\n}\n\n/**\n * @param versionRef Version reference. Declaration must be presented in `[versions]`.\n * @param catalogName The library version catalog name from where to fetch the version.\n */\ninternal data class VersionCatalogDependency(\n  override val group: String,\n  override val artifact: String,\n  private val versionRef: String,\n  private val catalogName: String = \"libs\",\n  override val supportsNdkVariant: Boolean = false,\n) : BaseDependency(group, artifact, supportsNdkVariant) {\n\n  override fun resolveVersion(project: Project): String =\n    project.getVersionCatalog(catalogName).findVersion(versionRef).get().toString()\n}\n"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/internal/GradleExt.kt",
    "content": "package com.mapbox.maps.gradle.plugins.internal\n\nimport org.gradle.api.Project\nimport org.gradle.api.artifacts.VersionCatalog\nimport org.gradle.api.artifacts.VersionCatalogsExtension\nimport org.gradle.api.model.ObjectFactory\nimport org.gradle.api.provider.ListProperty\nimport org.gradle.api.provider.Property\nimport org.gradle.kotlin.dsl.getByType\n\ninternal inline fun <reified T : Any> ObjectFactory.newInstance(vararg parameters: Any): T =\n  newInstance(T::class.java, *parameters)\n\ninternal fun Project.getVersionCatalog(name: String = \"libs\"): VersionCatalog {\n  return getVersionCatalogOrNull(name) ?: error(\"No versions catalog found!\")\n}\n\ninternal fun Project.getVersionCatalogOrNull(name: String = \"libs\"): VersionCatalog? = try {\n  project.extensions.getByType<VersionCatalogsExtension>().named(name)\n} catch (ignored: Exception) {\n  null\n}\n\ninternal fun <T> Property<T>.setDisallowChanges(value: T?) {\n  set(value)\n  disallowChanges()\n}\n\ninternal fun <T> ListProperty<T>.setDisallowChanges(value: List<T>?) {\n  set(value)\n  disallowChanges()\n}\n\n/**\n * Checks if the `ndkMajor` property is present in the project and appends it to the given [value].\n */\ninternal fun Project.appendNdkIfNeeded(value: String): String {\n  val ndkMajor: String? = project.findProperty(\"ndkMajor\")?.toString()\n  return if (ndkMajor != null && ndkMajor != findDefaultNdkMajor()) {\n    \"$value-ndk$ndkMajor\"\n  } else {\n    value\n  }\n}\n\n/**\n * @return the `defaultNdkMajor` version defined `projects/common/platform/android/gradle/libs.versions.toml`.\n */\nprivate fun Project.findDefaultNdkMajor(): String =\n  getVersionCatalog().findVersion(\"defaultNdkMajor\").get().toString()\n\nprivate fun Project.getVersionCatalog() =\n  extensions.getByType(VersionCatalogsExtension::class.java).named(\"commonLibs\")"
  },
  {
    "path": "mapbox-convention-plugin/src/main/kotlin/com/mapbox/maps/gradle/plugins/internal/MapboxDependencies.kt",
    "content": "package com.mapbox.maps.gradle.plugins.internal\n\ninternal object MapboxDependencies {\n  internal val Common = VersionCatalogDependency(\n    group = \"com.mapbox.common\",\n    artifact = \"common\",\n    versionRef = \"mapboxCommon\",\n    supportsNdkVariant = true\n  )\n\n  internal val GlNative = VersionCatalogDependency(\n    group = \"com.mapbox.maps\",\n    // v11.9 snapshots or earlier should use `android-core-internal` as `artifact`.\n    artifact = \"android-core\",\n    versionRef = \"mapboxGlNative\",\n    supportsNdkVariant = true\n  )\n}"
  },
  {
    "path": "maps-sdk/README.md",
    "content": "# The Mapbox Maps SDK Full for Android\n\nThe Mapbox Maps SDK Full is a fully-featured version of the Mapbox Maps SDK for Android for those less concerned with binary size.\n\nThe Maps SDK Full includes all functionality of the Maps SDK Lite, in addition to complex visualization layers and functionality such as heatmaps, data clustering, and full support for Expressions.\n"
  },
  {
    "path": "maps-sdk/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps {\n\n  public interface MapControllable extends com.mapbox.maps.MapboxLifecycleObserver {\n    method public void addRendererSetupErrorListener(com.mapbox.maps.renderer.RendererSetupErrorListener rendererSetupErrorListener);\n    method @com.mapbox.maps.MapboxExperimental public void addWidget(com.mapbox.maps.renderer.widget.Widget widget);\n    method public com.mapbox.maps.MapboxMap getMapboxMap();\n    method public boolean onGenericMotionEvent(android.view.MotionEvent event);\n    method public void onSizeChanged(int w, int h);\n    method public boolean onTouchEvent(android.view.MotionEvent event);\n    method public void queueEvent(Runnable event, boolean needRender = true);\n    method public void removeRendererSetupErrorListener(com.mapbox.maps.renderer.RendererSetupErrorListener rendererSetupErrorListener);\n    method @com.mapbox.maps.MapboxExperimental public boolean removeWidget(com.mapbox.maps.renderer.widget.Widget widget);\n    method public void setMaximumFps(int fps);\n    method public void setOnFpsChangedListener(com.mapbox.maps.renderer.OnFpsChangedListener listener);\n    method @com.mapbox.maps.MapboxExperimental public void setRenderThreadStatsRecorder(com.mapbox.maps.renderer.RenderThreadStatsRecorder renderThreadStatsRecorder);\n    method public android.graphics.Bitmap? snapshot();\n    method public void snapshot(com.mapbox.maps.MapView.OnSnapshotReady listener);\n    property public abstract com.mapbox.maps.MapboxMap mapboxMap;\n  }\n\n  public final class MapInitOptions {\n    ctor public MapInitOptions(android.content.Context context, com.mapbox.maps.MapOptions mapOptions = getDefaultMapOptions(context), java.util.List<? extends com.mapbox.maps.plugin.Plugin> plugins = defaultPluginList, com.mapbox.maps.CameraOptions? cameraOptions = null, boolean textureView = false, String? styleUri = \"mapbox://styles/mapbox/standard\", android.util.AttributeSet? attrs = null, int antialiasingSampleCount = 1, String mapName = \"\");\n    ctor public MapInitOptions(android.content.Context context, com.mapbox.maps.MapOptions mapOptions = getDefaultMapOptions(context), java.util.List<? extends com.mapbox.maps.plugin.Plugin> plugins = defaultPluginList, com.mapbox.maps.CameraOptions? cameraOptions = null, boolean textureView = false, String? styleUri = \"mapbox://styles/mapbox/standard\", android.util.AttributeSet? attrs = null, int antialiasingSampleCount = 1);\n    ctor public MapInitOptions(android.content.Context context, com.mapbox.maps.MapOptions mapOptions = getDefaultMapOptions(context), java.util.List<? extends com.mapbox.maps.plugin.Plugin> plugins = defaultPluginList, com.mapbox.maps.CameraOptions? cameraOptions = null, boolean textureView = false, String? styleUri = \"mapbox://styles/mapbox/standard\", android.util.AttributeSet? attrs = null);\n    ctor public MapInitOptions(android.content.Context context, com.mapbox.maps.MapOptions mapOptions = getDefaultMapOptions(context), java.util.List<? extends com.mapbox.maps.plugin.Plugin> plugins = defaultPluginList, com.mapbox.maps.CameraOptions? cameraOptions = null, boolean textureView = false, String? styleUri = \"mapbox://styles/mapbox/standard\");\n    ctor public MapInitOptions(android.content.Context context, com.mapbox.maps.MapOptions mapOptions = getDefaultMapOptions(context), java.util.List<? extends com.mapbox.maps.plugin.Plugin> plugins = defaultPluginList, com.mapbox.maps.CameraOptions? cameraOptions = null, boolean textureView = false);\n    ctor public MapInitOptions(android.content.Context context, com.mapbox.maps.MapOptions mapOptions = getDefaultMapOptions(context), java.util.List<? extends com.mapbox.maps.plugin.Plugin> plugins = defaultPluginList, com.mapbox.maps.CameraOptions? cameraOptions = null);\n    ctor public MapInitOptions(android.content.Context context, com.mapbox.maps.MapOptions mapOptions = getDefaultMapOptions(context), java.util.List<? extends com.mapbox.maps.plugin.Plugin> plugins = defaultPluginList);\n    ctor public MapInitOptions(android.content.Context context, com.mapbox.maps.MapOptions mapOptions = getDefaultMapOptions(context));\n    ctor public MapInitOptions(android.content.Context context);\n    method public android.content.Context component1();\n    method public com.mapbox.maps.MapOptions component2();\n    method public java.util.List<com.mapbox.maps.plugin.Plugin> component3();\n    method public com.mapbox.maps.CameraOptions? component4();\n    method public boolean component5();\n    method public String? component6();\n    method public android.util.AttributeSet? component7();\n    method public int component8();\n    method public String component9();\n    method public com.mapbox.maps.MapInitOptions copy(android.content.Context context, com.mapbox.maps.MapOptions mapOptions, java.util.List<? extends com.mapbox.maps.plugin.Plugin> plugins, com.mapbox.maps.CameraOptions? cameraOptions, boolean textureView, String? styleUri, android.util.AttributeSet? attrs, int antialiasingSampleCount, String mapName);\n    method public int getAntialiasingSampleCount();\n    method public android.util.AttributeSet? getAttrs();\n    method public com.mapbox.maps.CameraOptions? getCameraOptions();\n    method public android.content.Context getContext();\n    method public String getMapName();\n    method public com.mapbox.maps.MapOptions getMapOptions();\n    method public java.util.List<com.mapbox.maps.plugin.Plugin> getPlugins();\n    method public String? getStyleUri();\n    method public boolean getTextureView();\n    method public void setAntialiasingSampleCount(int);\n    method public void setAttrs(android.util.AttributeSet?);\n    method public void setCameraOptions(com.mapbox.maps.CameraOptions?);\n    method public void setMapName(String);\n    method public void setMapOptions(com.mapbox.maps.MapOptions);\n    method public void setPlugins(java.util.List<? extends com.mapbox.maps.plugin.Plugin>);\n    method public void setTextureView(boolean);\n    property public final int antialiasingSampleCount;\n    property public final android.util.AttributeSet? attrs;\n    property public final com.mapbox.maps.CameraOptions? cameraOptions;\n    property public final android.content.Context context;\n    property public final String mapName;\n    property public final com.mapbox.maps.MapOptions mapOptions;\n    property public final java.util.List<com.mapbox.maps.plugin.Plugin> plugins;\n    property public final String? styleUri;\n    property public final boolean textureView;\n    field public static final com.mapbox.maps.MapInitOptions.Companion Companion;\n  }\n\n  public static final class MapInitOptions.Companion {\n    method public com.mapbox.maps.MapOptions getDefaultMapOptions(android.content.Context context);\n    method public java.util.List<com.mapbox.maps.plugin.Plugin> getDefaultPluginList();\n    property public final java.util.List<com.mapbox.maps.plugin.Plugin> defaultPluginList;\n  }\n\n  public final class MapInitOptionsKt {\n    method public static com.mapbox.maps.MapOptions.Builder applyDefaultParams(com.mapbox.maps.MapOptions.Builder, android.content.Context context);\n    method public static com.mapbox.maps.MapOptions.Builder applyDefaultParams(com.mapbox.maps.MapOptions.Builder, float pixelRatio);\n  }\n\n  public final class MapSurface implements com.mapbox.maps.MapControllable com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate {\n    ctor public MapSurface(android.content.Context context, android.view.Surface surface, com.mapbox.maps.MapInitOptions mapInitOptions = com.mapbox.maps.MapInitOptions(context));\n    ctor public MapSurface(android.content.Context context, android.view.Surface surface);\n    method public void addRendererSetupErrorListener(com.mapbox.maps.renderer.RendererSetupErrorListener rendererSetupErrorListener);\n    method @com.mapbox.maps.MapboxExperimental public void addWidget(com.mapbox.maps.renderer.widget.Widget widget);\n    method public com.mapbox.maps.MapboxMap getMapboxMap();\n    method @Deprecated @kotlin.jvm.JvmSynthetic public com.mapbox.maps.MapboxMap! getMapboxMap();\n    method public <T extends com.mapbox.maps.plugin.MapPlugin> T? getPlugin(String id);\n    method public android.view.Surface getSurface();\n    method public void onDestroy();\n    method public boolean onGenericMotionEvent(android.view.MotionEvent event);\n    method public void onLowMemory();\n    method public void onResume();\n    method public void onSizeChanged(int w, int h);\n    method public void onStart();\n    method public void onStop();\n    method public boolean onTouchEvent(android.view.MotionEvent event);\n    method public void queueEvent(Runnable event, boolean needRender);\n    method public void removeRendererSetupErrorListener(com.mapbox.maps.renderer.RendererSetupErrorListener rendererSetupErrorListener);\n    method @com.mapbox.maps.MapboxExperimental public boolean removeWidget(com.mapbox.maps.renderer.widget.Widget widget);\n    method public void setMaximumFps(int fps);\n    method public void setOnFpsChangedListener(com.mapbox.maps.renderer.OnFpsChangedListener listener);\n    method @com.mapbox.maps.MapboxExperimental public void setRenderThreadStatsRecorder(com.mapbox.maps.renderer.RenderThreadStatsRecorder renderThreadStatsRecorder);\n    method public android.graphics.Bitmap? snapshot();\n    method public void snapshot(com.mapbox.maps.MapView.OnSnapshotReady listener);\n    method public void surfaceChanged(int width, int height);\n    method public void surfaceCreated();\n    method public void surfaceDestroyed();\n    property public com.mapbox.maps.MapboxMap mapboxMap;\n    property public final android.view.Surface surface;\n  }\n\n  public class MapView extends android.widget.FrameLayout implements com.mapbox.maps.MapControllable com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate {\n    ctor public MapView(android.content.Context context, com.mapbox.maps.MapInitOptions mapInitOptions = com.mapbox.maps.MapInitOptions(context));\n    ctor public MapView(android.content.Context context);\n    ctor public MapView(android.content.Context context, android.util.AttributeSet? attrs);\n    ctor public MapView(android.content.Context context, android.util.AttributeSet? attrs, int defStyleAttr);\n    method public void addRendererSetupErrorListener(com.mapbox.maps.renderer.RendererSetupErrorListener rendererSetupErrorListener);\n    method @com.mapbox.maps.MapboxExperimental public void addWidget(com.mapbox.maps.renderer.widget.Widget widget);\n    method public final void createPlugin(com.mapbox.maps.plugin.Plugin plugin);\n    method public final java.util.Set<com.mapbox.maps.debugoptions.MapViewDebugOptions> getDebugOptions();\n    method public com.mapbox.maps.MapboxMap getMapboxMap();\n    method @Deprecated @kotlin.jvm.JvmSynthetic public com.mapbox.maps.MapboxMap! getMapboxMap();\n    method public <T extends com.mapbox.maps.plugin.MapPlugin> T? getPlugin(String id);\n    method public final com.mapbox.maps.viewannotation.ViewAnnotationManager getViewAnnotationManager();\n    method public static final boolean isRenderingSupported();\n    method public static final boolean isTerrainRenderingSupported();\n    method public void onDestroy();\n    method public void onLowMemory();\n    method public void onResume();\n    method public void onSizeChanged(int w, int h, int oldw, int oldh);\n    method public void onSizeChanged(int w, int h);\n    method public void onStart();\n    method public void onStop();\n    method public void queueEvent(Runnable event, boolean needRender);\n    method public final void removePlugin(String id);\n    method public void removeRendererSetupErrorListener(com.mapbox.maps.renderer.RendererSetupErrorListener rendererSetupErrorListener);\n    method @com.mapbox.maps.MapboxExperimental public boolean removeWidget(com.mapbox.maps.renderer.widget.Widget widget);\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public final void scheduleThreadServiceTypeReset();\n    method public final void setDebugOptions(java.util.Set<com.mapbox.maps.debugoptions.MapViewDebugOptions>);\n    method public void setMaximumFps(@IntRange(from=1L, to=kotlin.jvm.internal.IntCompanionObject.MAX_VALUE.toLong()) int fps);\n    method public void setOnFpsChangedListener(com.mapbox.maps.renderer.OnFpsChangedListener listener);\n    method @com.mapbox.maps.MapboxExperimental public void setRenderThreadStatsRecorder(com.mapbox.maps.renderer.RenderThreadStatsRecorder renderThreadStatsRecorder);\n    method @com.mapbox.maps.MapboxExperimental public final void setSnapshotLegacyMode(boolean enabled);\n    method public android.graphics.Bitmap? snapshot();\n    method public void snapshot(com.mapbox.maps.MapView.OnSnapshotReady listener);\n    property public final java.util.Set<com.mapbox.maps.debugoptions.MapViewDebugOptions> debugOptions;\n    property public com.mapbox.maps.MapboxMap mapboxMap;\n    property public final com.mapbox.maps.viewannotation.ViewAnnotationManager viewAnnotationManager;\n    field public static final com.mapbox.maps.MapView.Companion Companion;\n  }\n\n  public static final class MapView.Companion {\n    method public boolean isRenderingSupported();\n    method public boolean isTerrainRenderingSupported();\n  }\n\n  public static fun interface MapView.OnSnapshotReady {\n    method public void onSnapshotReady(android.graphics.Bitmap? bitmap);\n  }\n\n  public final class MapboxConfigurationException extends java.lang.RuntimeException {\n    ctor public MapboxConfigurationException();\n    ctor public MapboxConfigurationException(String message);\n  }\n\n  public final class MapboxConstants {\n    method public static java.util.Locale getMAPBOX_LOCALE();\n    property public static final java.util.Locale MAPBOX_LOCALE;\n  }\n\n  public final class MapboxMap extends com.mapbox.maps.MapboxStyleManager implements com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate com.mapbox.maps.plugin.delegates.MapFeatureQueryDelegate com.mapbox.maps.plugin.delegates.MapFeatureStateDelegate com.mapbox.maps.plugin.delegates.MapInteractionDelegate com.mapbox.maps.plugin.delegates.MapListenerDelegate com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate com.mapbox.maps.plugin.delegates.MapProjectionDelegate com.mapbox.maps.plugin.delegates.MapTransformDelegate {\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.common.Cancelable addInteraction(com.mapbox.maps.MapInteraction interaction);\n    method @Deprecated public void addOnCameraChangeListener(com.mapbox.maps.plugin.delegates.listeners.OnCameraChangeListener onCameraChangeListener);\n    method @Deprecated public void addOnMapIdleListener(com.mapbox.maps.plugin.delegates.listeners.OnMapIdleListener onMapIdleListener);\n    method @Deprecated public void addOnMapLoadErrorListener(com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener onMapLoadErrorListener);\n    method @Deprecated public void addOnMapLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnMapLoadedListener onMapLoadedListener);\n    method @Deprecated public void addOnRenderFrameFinishedListener(com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameFinishedListener onRenderFrameFinishedListener);\n    method @Deprecated public void addOnRenderFrameStartedListener(com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameStartedListener onRenderFrameStartedListener);\n    method @Deprecated public void addOnSourceAddedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceAddedListener onSourceAddedListener);\n    method @Deprecated public void addOnSourceDataLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceDataLoadedListener onSourceDataLoadedListener);\n    method @Deprecated public void addOnSourceRemovedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceRemovedListener onSourceRemovedListener);\n    method @Deprecated public void addOnStyleDataLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleDataLoadedListener onStyleDataLoadedListener);\n    method @Deprecated public void addOnStyleImageMissingListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleImageMissingListener onStyleImageMissingListener);\n    method @Deprecated public void addOnStyleImageUnusedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleImageUnusedListener onStyleImageUnusedListener);\n    method @Deprecated public void addOnStyleLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleLoadedListener onStyleLoadedListener);\n    method public Object? cameraAnimationsPlugin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.animation.CameraAnimationsPlugin,?> function);\n    method @Deprecated public com.mapbox.maps.CameraOptions cameraForCoordinateBounds(com.mapbox.maps.CoordinateBounds bounds, com.mapbox.maps.EdgeInsets? boundsPadding, Double? bearing, Double? pitch, Double? maxZoom, com.mapbox.maps.ScreenCoordinate? offset);\n    method @Deprecated public com.mapbox.maps.CameraOptions cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.EdgeInsets? coordinatesPadding, Double? bearing, Double? pitch);\n    method @Deprecated public com.mapbox.maps.CameraOptions cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.CameraOptions camera, com.mapbox.maps.ScreenBox box);\n    method @com.mapbox.maps.MapboxDelicateApi public com.mapbox.maps.CameraOptions cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.CameraOptions camera, com.mapbox.maps.EdgeInsets? coordinatesPadding, Double? maxZoom, com.mapbox.maps.ScreenCoordinate? offset);\n    method public void cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.CameraOptions camera, com.mapbox.maps.EdgeInsets? coordinatesPadding, Double? maxZoom, com.mapbox.maps.ScreenCoordinate? offset, kotlin.jvm.functions.Function1<? super com.mapbox.maps.CameraOptions,kotlin.Unit> result);\n    method public com.mapbox.maps.CameraOptions cameraForDrag(com.mapbox.maps.ScreenCoordinate fromPoint, com.mapbox.maps.ScreenCoordinate toPoint);\n    method @Deprecated public com.mapbox.maps.CameraOptions cameraForGeometry(com.mapbox.geojson.Geometry geometry, com.mapbox.maps.EdgeInsets? geometryPadding, Double? bearing, Double? pitch);\n    method public static void clearData(com.mapbox.maps.AsyncOperationResultCallback callback);\n    method public com.mapbox.maps.CoordinateBounds coordinateBoundsForCamera(com.mapbox.maps.CameraOptions camera);\n    method public com.mapbox.maps.CoordinateBounds coordinateBoundsForCameraUnwrapped(com.mapbox.maps.CameraOptions camera);\n    method public com.mapbox.maps.CoordinateBounds coordinateBoundsForRect(android.graphics.RectF rectF);\n    method public com.mapbox.maps.CoordinateBoundsZoom coordinateBoundsZoomForCamera(com.mapbox.maps.CameraOptions camera);\n    method public com.mapbox.maps.CoordinateBoundsZoom coordinateBoundsZoomForCameraUnwrapped(com.mapbox.maps.CameraOptions camera);\n    method public com.mapbox.geojson.Point coordinateForPixel(com.mapbox.maps.ScreenCoordinate pixel);\n    method public com.mapbox.geojson.Point coordinateForProjectedMeters(com.mapbox.maps.ProjectedMeters projectedMeters);\n    method public com.mapbox.maps.CoordinateInfo coordinateInfoForPixel(com.mapbox.maps.ScreenCoordinate pixel);\n    method public java.util.List<com.mapbox.geojson.Point> coordinatesForPixels(java.util.List<com.mapbox.maps.ScreenCoordinate> pixels);\n    method public java.util.List<com.mapbox.maps.CoordinateInfo> coordinatesInfoForPixels(java.util.List<com.mapbox.maps.ScreenCoordinate> pixels);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.MapboxMapRecorder createRecorder();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @com.mapbox.maps.MapboxExperimental public void dispatch(com.mapbox.maps.PlatformEventInfo platformEventInfo);\n    method public void executeOnRenderThread(Runnable runnable);\n    method public Object? gesturesPlugin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.gestures.GesturesPlugin,?> function);\n    method public java.util.List<java.lang.String> getAttributions();\n    method public com.mapbox.maps.CameraBounds getBounds();\n    method public com.mapbox.maps.CameraState getCameraState();\n    method public com.mapbox.maps.MapCenterAltitudeMode getCenterAltitudeMode();\n    method @Deprecated public java.util.List<com.mapbox.maps.MapDebugOptions> getDebug();\n    method public Double? getElevation(com.mapbox.geojson.Point coordinate);\n    method public com.mapbox.common.Cancelable getFeatureState(String sourceId, String? sourceLayerId, String featureId, com.mapbox.maps.QueryFeatureStateCallback callback);\n    method public com.mapbox.common.Cancelable getFeatureState(String sourceId, String featureId, com.mapbox.maps.QueryFeatureStateCallback callback);\n    method @com.mapbox.maps.MapboxExperimental public <FS extends com.mapbox.maps.interactions.FeatureState> com.mapbox.common.Cancelable getFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature, com.mapbox.maps.interactions.FeatureStateCallback<FS> callback);\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public <FS extends com.mapbox.maps.interactions.FeatureState> com.mapbox.common.Cancelable getFeatureState(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> descriptor, com.mapbox.maps.FeaturesetFeatureId id, com.mapbox.maps.interactions.FeatureStateCallback<FS> callback);\n    method public com.mapbox.maps.FreeCameraOptions getFreeCameraOptions();\n    method public com.mapbox.common.Cancelable getGeoJsonClusterChildren(String sourceIdentifier, com.mapbox.geojson.Feature cluster, com.mapbox.maps.QueryFeatureExtensionCallback callback);\n    method public com.mapbox.common.Cancelable getGeoJsonClusterExpansionZoom(String sourceIdentifier, com.mapbox.geojson.Feature cluster, com.mapbox.maps.QueryFeatureExtensionCallback callback);\n    method public com.mapbox.common.Cancelable getGeoJsonClusterLeaves(String sourceIdentifier, com.mapbox.geojson.Feature cluster, long limit = 10L, long offset = 0L, com.mapbox.maps.QueryFeatureExtensionCallback callback);\n    method public com.mapbox.common.Cancelable getGeoJsonClusterLeaves(String sourceIdentifier, com.mapbox.geojson.Feature cluster, long limit = 10L, com.mapbox.maps.QueryFeatureExtensionCallback callback);\n    method public com.mapbox.common.Cancelable getGeoJsonClusterLeaves(String sourceIdentifier, com.mapbox.geojson.Feature cluster, com.mapbox.maps.QueryFeatureExtensionCallback callback);\n    method public com.mapbox.maps.IndoorManager getIndoor();\n    method public com.mapbox.maps.MapOptions getMapOptions();\n    method public double getMetersPerPixelAtLatitude(double latitude, double zoom);\n    method public double getMetersPerPixelAtLatitude(double latitude);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.Map getNativeMap();\n    method public byte getPrefetchZoomDelta();\n    method public boolean getRenderWorldCopies();\n    method @com.mapbox.maps.MapboxExperimental public java.util.List<com.mapbox.maps.Vec2> getScreenCullingShape();\n    method public com.mapbox.maps.Size getSize();\n    method public com.mapbox.maps.Style? getStyle();\n    method public void getStyle(com.mapbox.maps.Style.OnStyleLoaded onStyleLoaded);\n    method @Deprecated @kotlin.jvm.JvmSynthetic public com.mapbox.maps.Style! getStyle();\n    method public com.mapbox.maps.SymbolScaleBehavior getSymbolScaleBehavior();\n    method public boolean isGestureInProgress();\n    method public boolean isUserAnimationInProgress();\n    method public boolean isValid();\n    method public void loadStyle(String style, com.mapbox.maps.Style.OnStyleLoaded? onStyleLoaded = null);\n    method public void loadStyle(String style);\n    method public void loadStyle(com.mapbox.maps.extension.style.StyleContract.StyleExtension styleExtension, com.mapbox.maps.Style.OnStyleLoaded? onStyleLoaded = null);\n    method public void loadStyle(com.mapbox.maps.extension.style.StyleContract.StyleExtension styleExtension);\n    method @Deprecated public void loadStyle(com.mapbox.maps.extension.style.StyleContract.StyleExtension styleExtension, com.mapbox.maps.TransitionOptions? styleTransitionOptions = null, com.mapbox.maps.Style.OnStyleLoaded? onStyleLoaded = null, com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener? onMapLoadErrorListener = null);\n    method @Deprecated public void loadStyle(com.mapbox.maps.extension.style.StyleContract.StyleExtension styleExtension, com.mapbox.maps.Style.OnStyleLoaded? onStyleLoaded = null, com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener? onMapLoadErrorListener = null);\n    method @Deprecated public void loadStyleJson(String styleJson, com.mapbox.maps.TransitionOptions? styleTransitionOptions = null, com.mapbox.maps.Style.OnStyleLoaded? onStyleLoaded = null, com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener? onMapLoadErrorListener = null);\n    method @Deprecated public void loadStyleJson(String styleJson, com.mapbox.maps.Style.OnStyleLoaded? onStyleLoaded = null, com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener? onMapLoadErrorListener = null);\n    method @Deprecated public void loadStyleJson(String styleJson, com.mapbox.maps.Style.OnStyleLoaded onStyleLoaded);\n    method @Deprecated public void loadStyleJson(String styleJson);\n    method @Deprecated public void loadStyleUri(String styleUri, com.mapbox.maps.TransitionOptions? styleTransitionOptions = null, com.mapbox.maps.Style.OnStyleLoaded? onStyleLoaded = null, com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener? onMapLoadErrorListener = null);\n    method @Deprecated public void loadStyleUri(String styleUri, com.mapbox.maps.Style.OnStyleLoaded? onStyleLoaded = null, com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener? onMapLoadErrorListener = null);\n    method @Deprecated public void loadStyleUri(String styleUri, com.mapbox.maps.Style.OnStyleLoaded onStyleLoaded);\n    method @Deprecated public void loadStyleUri(String styleUri);\n    method public com.mapbox.maps.ScreenCoordinate pixelForCoordinate(com.mapbox.geojson.Point coordinate);\n    method public java.util.List<com.mapbox.maps.ScreenCoordinate> pixelsForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates);\n    method public com.mapbox.maps.MercatorCoordinate project(com.mapbox.geojson.Point point, double zoomScale);\n    method public com.mapbox.maps.ProjectedMeters projectedMetersForCoordinate(com.mapbox.geojson.Point point);\n    method public com.mapbox.common.Cancelable queryRenderedFeatures(com.mapbox.maps.RenderedQueryGeometry geometry, com.mapbox.maps.RenderedQueryOptions options, com.mapbox.maps.QueryRenderedFeaturesCallback callback);\n    method @com.mapbox.maps.MapboxExperimental public <FF extends com.mapbox.maps.interactions.FeaturesetFeature<?>> com.mapbox.common.Cancelable queryRenderedFeatures(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<?,FF> descriptor, com.mapbox.maps.RenderedQueryGeometry? geometry = null, com.mapbox.bindgen.Value? filter = null, com.mapbox.maps.interactions.QueryRenderedFeaturesetFeaturesCallback<FF> callback);\n    method @com.mapbox.maps.MapboxExperimental public <FF extends com.mapbox.maps.interactions.FeaturesetFeature<?>> com.mapbox.common.Cancelable queryRenderedFeatures(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<?,FF> descriptor, com.mapbox.maps.RenderedQueryGeometry? geometry = null, com.mapbox.maps.interactions.QueryRenderedFeaturesetFeaturesCallback<FF> callback);\n    method @com.mapbox.maps.MapboxExperimental public <FF extends com.mapbox.maps.interactions.FeaturesetFeature<?>> com.mapbox.common.Cancelable queryRenderedFeatures(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<?,FF> descriptor, com.mapbox.maps.interactions.QueryRenderedFeaturesetFeaturesCallback<FF> callback);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.common.Cancelable queryRenderedRasterValues(com.mapbox.maps.ScreenCoordinate coordinate, com.mapbox.maps.RenderedRasterQueryOptions options, com.mapbox.maps.QueryRenderedRasterValuesCallback callback);\n    method public com.mapbox.common.Cancelable querySourceFeatures(String sourceId, com.mapbox.maps.SourceQueryOptions options, com.mapbox.maps.QuerySourceFeaturesCallback callback);\n    method public void reduceMemoryUse();\n    method public com.mapbox.common.Cancelable removeFeatureState(String sourceId, String? sourceLayerId, String featureId, String? stateKey, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public com.mapbox.common.Cancelable removeFeatureState(String sourceId, String? sourceLayerId, String featureId, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public com.mapbox.common.Cancelable removeFeatureState(String sourceId, String featureId, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public <FS extends com.mapbox.maps.interactions.FeatureState, FSK extends com.mapbox.maps.interactions.FeatureStateKey<FS>> com.mapbox.common.Cancelable removeFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature, FSK? stateKey = null, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method public <FS extends com.mapbox.maps.interactions.FeatureState, FSK extends com.mapbox.maps.interactions.FeatureStateKey<FS>> com.mapbox.common.Cancelable removeFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature, FSK? stateKey = null);\n    method public <FS extends com.mapbox.maps.interactions.FeatureState, FSK extends com.mapbox.maps.interactions.FeatureStateKey<FS>> com.mapbox.common.Cancelable removeFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature);\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public <FS extends com.mapbox.maps.interactions.FeatureState, FSK extends com.mapbox.maps.interactions.FeatureStateKey<FS>> com.mapbox.common.Cancelable removeFeatureState(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> descriptor, com.mapbox.maps.FeaturesetFeatureId id, FSK? stateKey = null, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public <FS extends com.mapbox.maps.interactions.FeatureState, FSK extends com.mapbox.maps.interactions.FeatureStateKey<FS>> com.mapbox.common.Cancelable removeFeatureState(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> descriptor, com.mapbox.maps.FeaturesetFeatureId id, FSK? stateKey = null);\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public <FS extends com.mapbox.maps.interactions.FeatureState, FSK extends com.mapbox.maps.interactions.FeatureStateKey<FS>> com.mapbox.common.Cancelable removeFeatureState(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> descriptor, com.mapbox.maps.FeaturesetFeatureId id);\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public void removeFeatureStateExpression(int featureStateExpressionId, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method @Deprecated public void removeOnCameraChangeListener(com.mapbox.maps.plugin.delegates.listeners.OnCameraChangeListener onCameraChangeListener);\n    method @Deprecated public void removeOnMapIdleListener(com.mapbox.maps.plugin.delegates.listeners.OnMapIdleListener onMapIdleListener);\n    method @Deprecated public void removeOnMapLoadErrorListener(com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener onMapLoadErrorListener);\n    method @Deprecated public void removeOnMapLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnMapLoadedListener onMapLoadedListener);\n    method @Deprecated public void removeOnRenderFrameFinishedListener(com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameFinishedListener onRenderFrameFinishedListener);\n    method @Deprecated public void removeOnRenderFrameStartedListener(com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameStartedListener onRenderFrameStartedListener);\n    method @Deprecated public void removeOnSourceAddedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceAddedListener onSourceAddedListener);\n    method @Deprecated public void removeOnSourceDataLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceDataLoadedListener onSourceDataLoadedListener);\n    method @Deprecated public void removeOnSourceRemovedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceRemovedListener onSourceRemovedListener);\n    method @Deprecated public void removeOnStyleDataLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleDataLoadedListener onStyleDataLoadedListener);\n    method @Deprecated public void removeOnStyleImageMissingListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleImageMissingListener onStyleImageMissingListener);\n    method @Deprecated public void removeOnStyleImageUnusedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleImageUnusedListener onStyleImageUnusedListener);\n    method @Deprecated public void removeOnStyleLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleLoadedListener onStyleLoadedListener);\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public void resetFeatureStateExpressions(com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public com.mapbox.common.Cancelable resetFeatureStates(String sourceId, String? sourceLayerId, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public com.mapbox.common.Cancelable resetFeatureStates(String sourceId, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public com.mapbox.common.Cancelable resetFeatureStates(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<?,?> descriptor, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method public com.mapbox.common.Cancelable resetFeatureStates(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<?,?> descriptor);\n    method public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setBounds(com.mapbox.maps.CameraBoundsOptions options);\n    method public void setCamera(com.mapbox.maps.CameraOptions cameraOptions);\n    method public void setCamera(com.mapbox.maps.FreeCameraOptions freeCameraOptions);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @com.mapbox.maps.MapboxExperimental public void setCameraAnimationHint(com.mapbox.maps.CameraAnimationHint cameraAnimationHint);\n    method public void setCenterAltitudeMode(com.mapbox.maps.MapCenterAltitudeMode mode);\n    method public void setConstrainMode(com.mapbox.maps.ConstrainMode constrainMode);\n    method @Deprecated public void setDebug(java.util.List<? extends com.mapbox.maps.MapDebugOptions> debugOptions, boolean enabled);\n    method public com.mapbox.common.Cancelable setFeatureState(String sourceId, String? sourceLayerId, String featureId, com.mapbox.bindgen.Value state, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public com.mapbox.common.Cancelable setFeatureState(String sourceId, String featureId, com.mapbox.bindgen.Value state, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public <FS extends com.mapbox.maps.interactions.FeatureState> com.mapbox.common.Cancelable setFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature, FS state, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method public <FS extends com.mapbox.maps.interactions.FeatureState> com.mapbox.common.Cancelable setFeatureState(com.mapbox.maps.interactions.FeaturesetFeature<FS> featuresetFeature, FS state);\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public <FS extends com.mapbox.maps.interactions.FeatureState> com.mapbox.common.Cancelable setFeatureState(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> descriptor, com.mapbox.maps.FeaturesetFeatureId id, FS state, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public <FS extends com.mapbox.maps.interactions.FeatureState> com.mapbox.common.Cancelable setFeatureState(com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> descriptor, com.mapbox.maps.FeaturesetFeatureId id, FS state);\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public <FS extends com.mapbox.maps.interactions.FeatureState> void setFeatureStateExpression(int featureStateExpressionId, com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> featureset, com.mapbox.bindgen.Value expression, FS state, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public void setGestureInProgress(boolean inProgress);\n    method public void setNorthOrientation(com.mapbox.maps.NorthOrientation northOrientation);\n    method public void setPrefetchZoomDelta(byte delta);\n    method public void setRenderWorldCopies(boolean renderWorldCopies);\n    method @com.mapbox.maps.MapboxExperimental public void setScreenCullingShape(java.util.List<com.mapbox.maps.Vec2> shape);\n    method public void setSymbolScaleBehavior(com.mapbox.maps.SymbolScaleBehavior);\n    method public void setTileCacheBudget(com.mapbox.maps.TileCacheBudget? tileCacheBudget);\n    method public void setUserAnimationInProgress(boolean inProgress);\n    method public void setViewportMode(com.mapbox.maps.ViewportMode viewportMode);\n    method @com.mapbox.maps.MapboxExperimental public void startPerformanceStatisticsCollection(com.mapbox.maps.PerformanceStatisticsOptions options, com.mapbox.maps.PerformanceStatisticsCallback callback);\n    method @com.mapbox.maps.MapboxExperimental public void stopPerformanceStatisticsCollection();\n    method public com.mapbox.common.Cancelable subscribeCameraChanged(com.mapbox.maps.CameraChangedCallback cameraChangedCallback);\n    method @com.mapbox.annotation.MapboxExperimental public com.mapbox.common.Cancelable subscribeCameraChangedCoalesced(com.mapbox.maps.CameraChangedCoalescedCallback cameraChangedCoalescedCallback);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.common.Cancelable subscribeGenericEvent(String eventName, com.mapbox.maps.GenericEventCallback genericEventCallback);\n    method public com.mapbox.common.Cancelable subscribeMapIdle(com.mapbox.maps.MapIdleCallback mapIdleCallback);\n    method public com.mapbox.common.Cancelable subscribeMapLoaded(com.mapbox.maps.MapLoadedCallback mapLoadedCallback);\n    method public com.mapbox.common.Cancelable subscribeMapLoadingError(com.mapbox.maps.MapLoadingErrorCallback mapLoadingErrorCallback);\n    method public com.mapbox.common.Cancelable subscribeRenderFrameFinished(com.mapbox.maps.RenderFrameFinishedCallback renderFrameFinishedCallback);\n    method public com.mapbox.common.Cancelable subscribeRenderFrameStarted(com.mapbox.maps.RenderFrameStartedCallback renderFrameStartedCallback);\n    method public com.mapbox.common.Cancelable subscribeResourceRequest(com.mapbox.maps.ResourceRequestCallback resourceRequestCallback);\n    method public com.mapbox.common.Cancelable subscribeSourceAdded(com.mapbox.maps.SourceAddedCallback sourceAddedCallback);\n    method public com.mapbox.common.Cancelable subscribeSourceDataLoaded(com.mapbox.maps.SourceDataLoadedCallback sourceDataLoadedCallback);\n    method public com.mapbox.common.Cancelable subscribeSourceRemoved(com.mapbox.maps.SourceRemovedCallback sourceRemovedCallback);\n    method public com.mapbox.common.Cancelable subscribeStyleDataLoaded(com.mapbox.maps.StyleDataLoadedCallback styleDataLoadedCallback);\n    method public com.mapbox.common.Cancelable subscribeStyleImageMissing(com.mapbox.maps.StyleImageMissingCallback styleImageMissingCallback);\n    method public com.mapbox.common.Cancelable subscribeStyleImageRemoveUnused(com.mapbox.maps.StyleImageRemoveUnusedCallback styleImageRemoveUnusedCallback);\n    method public com.mapbox.common.Cancelable subscribeStyleLoaded(com.mapbox.maps.StyleLoadedCallback styleLoadedCallback);\n    method @com.mapbox.maps.MapboxExperimental public java.util.List<com.mapbox.maps.CanonicalTileID> tileCover(com.mapbox.maps.TileCoverOptions tileCoverOptions, com.mapbox.maps.CameraOptions? cameraOptions);\n    method public void triggerRepaint();\n    method public com.mapbox.geojson.Point unproject(com.mapbox.maps.MercatorCoordinate coordinate, double zoomScale);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @com.mapbox.maps.MapboxExperimental public void whenSizeReady(kotlin.jvm.functions.Function0<kotlin.Unit> action);\n    property public com.mapbox.maps.CameraState cameraState;\n    property public final com.mapbox.maps.IndoorManager indoor;\n    property public final com.mapbox.maps.Style? style;\n    property public final com.mapbox.maps.SymbolScaleBehavior symbolScaleBehavior;\n    field public static final com.mapbox.maps.MapboxMap.Companion Companion;\n  }\n\n  public static final class MapboxMap.Companion {\n    method public void clearData(com.mapbox.maps.AsyncOperationResultCallback callback);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class MapboxMapRecorder {\n    method public String getPlaybackState();\n    method public void replay(java.nio.ByteBuffer recordedSequence, com.mapbox.maps.MapPlayerOptions options = mapPlayerOptions({ \n\n}), kotlin.jvm.functions.Function0<kotlin.Unit> onEnded = {});\n    method public void replay(java.nio.ByteBuffer recordedSequence, com.mapbox.maps.MapPlayerOptions options = mapPlayerOptions({ \n\n}));\n    method public void replay(java.nio.ByteBuffer recordedSequence);\n    method public void startRecording(com.mapbox.maps.MapRecorderOptions options = mapRecorderOptions({ \n\n}));\n    method public void startRecording();\n    method public java.nio.ByteBuffer stopRecording();\n    method public void togglePauseReplay();\n  }\n\n  public final class MapboxMapRecorderKt {\n    method public static inline com.mapbox.maps.MapPlayerOptions mapPlayerOptions(kotlin.jvm.functions.Function1<? super com.mapbox.maps.MapPlayerOptions.Builder,kotlin.Unit> block);\n    method public static inline com.mapbox.maps.MapRecorderOptions mapRecorderOptions(kotlin.jvm.functions.Function1<? super com.mapbox.maps.MapRecorderOptions.Builder,kotlin.Unit> block);\n  }\n\n  public final class MapboxMapsOptions {\n    method public static String getBaseUrl();\n    method public static String getDataPath();\n    method public static com.mapbox.common.TileStore? getTileStore();\n    method public static com.mapbox.maps.TileStoreUsageMode getTileStoreUsageMode();\n    method public static void setBaseUrl(String);\n    method public static void setDataPath(String);\n    method public static void setTileStore(com.mapbox.common.TileStore?);\n    method public static void setTileStoreUsageMode(com.mapbox.maps.TileStoreUsageMode);\n    property public static final String baseUrl;\n    property public static final String dataPath;\n    property public static final com.mapbox.common.TileStore? tileStore;\n    property public static final com.mapbox.maps.TileStoreUsageMode tileStoreUsageMode;\n    field public static final com.mapbox.maps.MapboxMapsOptions INSTANCE;\n  }\n\n  public final class MapboxMapsOptionsKt {\n  }\n\n  @Deprecated public final class MapboxTracing {\n    method @Deprecated public void disableAll();\n    method @Deprecated public void enableAll();\n    method @Deprecated public void enableCore();\n    method @Deprecated public void enablePlatform();\n    field @Deprecated public static final com.mapbox.maps.MapboxTracing INSTANCE;\n  }\n\n  public abstract class SnapshotOverlay {\n    method public abstract com.mapbox.geojson.Point coordinate(com.mapbox.maps.ScreenCoordinate screenCoordinate);\n    method public abstract java.util.List<java.lang.String> getAttributions();\n    method public abstract android.graphics.Canvas getCanvas();\n    method public abstract com.mapbox.maps.ScreenCoordinate screenCoordinate(com.mapbox.geojson.Point coordinate);\n    property public abstract java.util.List<java.lang.String> attributions;\n    property public abstract android.graphics.Canvas canvas;\n  }\n\n  public fun interface SnapshotOverlayCallback {\n    method public void onSnapshotOverlay(com.mapbox.maps.SnapshotOverlay overlay);\n  }\n\n  public final class SnapshotOverlayOptions {\n    ctor public SnapshotOverlayOptions(boolean showLogo = true, boolean showAttributes = true);\n    ctor public SnapshotOverlayOptions(boolean showLogo = true);\n    ctor public SnapshotOverlayOptions();\n    method public boolean component1();\n    method public boolean component2();\n    method public com.mapbox.maps.SnapshotOverlayOptions copy(boolean showLogo, boolean showAttributes);\n    method public boolean getShowAttributes();\n    method public boolean getShowLogo();\n    property public final boolean showAttributes;\n    property public final boolean showLogo;\n  }\n\n  public fun interface SnapshotResultCallback {\n    method public void onSnapshotResult(android.graphics.Bitmap? snapshot, String? errorMessage);\n  }\n\n  public interface SnapshotStyleListener {\n    method public default void onDidFailLoadingStyle(String message);\n    method public void onDidFinishLoadingStyle(com.mapbox.maps.Style style);\n    method public default void onDidFullyLoadStyle(com.mapbox.maps.Style style);\n    method public default void onStyleImageMissing(String imageId);\n  }\n\n  public class Snapshotter {\n    ctor public Snapshotter(android.content.Context context, com.mapbox.maps.MapSnapshotOptions options, com.mapbox.maps.SnapshotOverlayOptions overlayOptions = com.mapbox.maps.SnapshotOverlayOptions());\n    ctor public Snapshotter(android.content.Context context, com.mapbox.maps.MapSnapshotOptions options);\n    method public final com.mapbox.maps.CameraOptions cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.EdgeInsets? padding, Double? bearing, Double? pitch);\n    method public final void cancel();\n    method public static final void clearData(com.mapbox.maps.AsyncOperationResultCallback callback);\n    method public final com.mapbox.maps.CoordinateBounds coordinateBoundsForCamera(com.mapbox.maps.CameraOptions options);\n    method public final void destroy();\n    method public final com.mapbox.maps.CameraState getCameraState();\n    method public final com.mapbox.maps.Size getSize();\n    method public final String getStyleJson();\n    method public final String getStyleUri();\n    method public final void setCamera(com.mapbox.maps.CameraOptions cameraOptions);\n    method public final void setSize(com.mapbox.maps.Size size);\n    method public final void setStyleJson(String styleJson);\n    method public final void setStyleListener(com.mapbox.maps.SnapshotStyleListener listener);\n    method public final void setStyleUri(String styleUri);\n    method public final void start(com.mapbox.maps.SnapshotOverlayCallback? overlayCallback = null, com.mapbox.maps.SnapshotResultCallback resultCallback);\n    method @com.mapbox.maps.MapboxExperimental public final java.util.List<com.mapbox.maps.CanonicalTileID> tileCover(com.mapbox.maps.TileCoverOptions tileCoverOptions, com.mapbox.maps.CameraOptions? cameraOptions);\n    field public static final com.mapbox.maps.Snapshotter.Companion Companion;\n  }\n\n  public static final class Snapshotter.Companion {\n    method public void clearData(com.mapbox.maps.AsyncOperationResultCallback callback);\n  }\n\n  public final class SnapshotterDestroyedException extends java.lang.IllegalStateException {\n    ctor public SnapshotterDestroyedException();\n  }\n\n  public final class Style extends com.mapbox.maps.MapboxStyleManager {\n    method public boolean isValid();\n    property @MainThread public com.mapbox.maps.CameraOptions styleDefaultCamera;\n    property @MainThread public String styleJSON;\n    property @MainThread public java.util.List<com.mapbox.maps.StyleObjectInfo> styleLayers;\n    property @MainThread public java.util.List<java.lang.String> styleSlots;\n    property @MainThread public java.util.List<com.mapbox.maps.StyleObjectInfo> styleSources;\n    property @MainThread public String styleURI;\n    field public static final com.mapbox.maps.Style.Companion Companion;\n    field public static final String DARK = \"mapbox://styles/mapbox/dark-v11\";\n    field public static final String LIGHT = \"mapbox://styles/mapbox/light-v11\";\n    field public static final String MAPBOX_STREETS = \"mapbox://styles/mapbox/streets-v12\";\n    field public static final String OUTDOORS = \"mapbox://styles/mapbox/outdoors-v12\";\n    field public static final String SATELLITE = \"mapbox://styles/mapbox/satellite-v9\";\n    field public static final String SATELLITE_STREETS = \"mapbox://styles/mapbox/satellite-streets-v12\";\n    field public static final String STANDARD = \"mapbox://styles/mapbox/standard\";\n    field public static final String STANDARD_SATELLITE = \"mapbox://styles/mapbox/standard-satellite\";\n    field public static final String TRAFFIC_DAY = \"mapbox://styles/mapbox/traffic-day-v2\";\n    field public static final String TRAFFIC_NIGHT = \"mapbox://styles/mapbox/traffic-night-v2\";\n  }\n\n  public static final class Style.Companion {\n  }\n\n  public static fun interface Style.OnStyleLoaded {\n    method public void onStyleLoaded(com.mapbox.maps.Style style);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class SymbolScaleBehavior {\n    method public static com.mapbox.maps.SymbolScaleBehavior fixed(float scaleFactor);\n    method public static com.mapbox.maps.SymbolScaleBehavior getSystem();\n    method public static com.mapbox.maps.SymbolScaleBehavior system(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> mapping);\n    property public static final com.mapbox.maps.SymbolScaleBehavior system;\n    field public static final com.mapbox.maps.SymbolScaleBehavior.Companion Companion;\n  }\n\n  public static final class SymbolScaleBehavior.Companion {\n    method public com.mapbox.maps.SymbolScaleBehavior fixed(float scaleFactor);\n    method public com.mapbox.maps.SymbolScaleBehavior getSystem();\n    method public com.mapbox.maps.SymbolScaleBehavior system(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> mapping);\n    property public final com.mapbox.maps.SymbolScaleBehavior system;\n  }\n\n  public final class UtilsKt {\n  }\n\n}\n\npackage com.mapbox.maps.attribution {\n\n  public final class AttributionLayout {\n    ctor public AttributionLayout(android.graphics.Bitmap? logo, android.graphics.PointF? anchorPoint, boolean isShortText);\n    method public android.graphics.Bitmap? component1();\n    method public android.graphics.PointF? component2();\n    method public boolean component3();\n    method public com.mapbox.maps.attribution.AttributionLayout copy(android.graphics.Bitmap? logo, android.graphics.PointF? anchorPoint, boolean isShortText);\n    method public android.graphics.PointF? getAnchorPoint();\n    method public android.graphics.Bitmap? getLogo();\n    method public boolean isShortText();\n    property public final android.graphics.PointF? anchorPoint;\n    property public final boolean isShortText;\n    property public final android.graphics.Bitmap? logo;\n  }\n\n  public final class AttributionMeasure {\n    method public android.widget.TextView getTextView();\n    method public com.mapbox.maps.attribution.AttributionLayout? measure();\n    field public static final com.mapbox.maps.attribution.AttributionMeasure.Companion Companion;\n  }\n\n  public static final class AttributionMeasure.Companion {\n  }\n\n  public class AttributionParser {\n    method public final String createAttributionString(boolean shortenedOutput = false);\n    method public final String createAttributionString();\n    method public final java.util.Set<com.mapbox.maps.plugin.attribution.Attribution> getAttributions();\n    method protected final void parse();\n    field public static final com.mapbox.maps.attribution.AttributionParser.Companion Companion;\n  }\n\n  public static final class AttributionParser.Companion {\n    method public java.util.List<java.lang.String> getIMPROVE_MAP_URLS();\n    property public final java.util.List<java.lang.String> IMPROVE_MAP_URLS;\n  }\n\n  public static final class AttributionParser.Options {\n    ctor public AttributionParser.Options(android.content.Context context);\n    method public com.mapbox.maps.attribution.AttributionParser build();\n    method public com.mapbox.maps.attribution.AttributionParser.Options withAttributionData(java.lang.String... attributionData);\n    method public com.mapbox.maps.attribution.AttributionParser.Options withCopyrightSign(boolean withCopyrightSign);\n    method public com.mapbox.maps.attribution.AttributionParser.Options withExtraAttributions(java.util.List<com.mapbox.maps.plugin.attribution.Attribution> attributions);\n    method public com.mapbox.maps.attribution.AttributionParser.Options withImproveMap(boolean withImproveMap);\n    method public com.mapbox.maps.attribution.AttributionParser.Options withMapboxAttribution(boolean withMapboxAttribution);\n    method public com.mapbox.maps.attribution.AttributionParser.Options withMapboxGeofencingConsent(boolean withMapboxGeofencingConsent);\n    method public com.mapbox.maps.attribution.AttributionParser.Options withMapboxPrivacyPolicy(boolean withMapboxPrivacyPolicy);\n    method public com.mapbox.maps.attribution.AttributionParser.Options withTelemetryAttribution(boolean withTelemetryAttribution);\n    field public static final String HTML_STYLE_REGEX = \"<(\\\"[^\\\"]*\\\"|\\'[^\\']*\\'|[^\\'\\\">])*>\";\n  }\n\n}\n\npackage com.mapbox.maps.coroutine {\n\n  public final class MapCameraManagerDelegateExtKt {\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.maps.CameraOptions! awaitCameraForCoordinates(com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate, java.util.List<? extends com.mapbox.geojson.Point> coordinates, com.mapbox.maps.CameraOptions camera, com.mapbox.maps.EdgeInsets? coordinatesPadding = null, double maxZoom = null, com.mapbox.maps.ScreenCoordinate? offset = null);\n  }\n\n  public final class MapFeatureQueryDelegateExtKt {\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,java.util.List<? extends com.mapbox.maps.QueriedRenderedFeature>>! queryRenderedFeatures(com.mapbox.maps.plugin.delegates.MapFeatureQueryDelegate, com.mapbox.maps.RenderedQueryGeometry geometry, com.mapbox.maps.RenderedQueryOptions options);\n    method @com.mapbox.maps.MapboxExperimental @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.maps.QueriedRasterValues>! queryRenderedRasterValues(com.mapbox.maps.plugin.delegates.MapFeatureQueryDelegate, com.mapbox.maps.ScreenCoordinate coordinate, com.mapbox.maps.RenderedRasterQueryOptions options);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,java.util.List<? extends com.mapbox.maps.QueriedSourceFeature>>! querySourceFeatures(com.mapbox.maps.plugin.delegates.MapFeatureQueryDelegate, String sourceId, com.mapbox.maps.SourceQueryOptions options);\n  }\n\n  public final class MapboxMapExtKt {\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.maps.Style! awaitLoadStyle(com.mapbox.maps.MapboxMap, com.mapbox.maps.extension.style.StyleContract.StyleExtension styleExtension);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.maps.Style! awaitLoadStyle(com.mapbox.maps.MapboxMap, String style);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.maps.Style! awaitStyle(com.mapbox.maps.MapboxMap);\n    method @Deprecated @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.maps.CameraOptions! cameraForCoordinates(com.mapbox.maps.MapboxMap, java.util.List<? extends com.mapbox.geojson.Point> coordinates, com.mapbox.maps.CameraOptions camera, com.mapbox.maps.EdgeInsets? coordinatesPadding = null, double maxZoom = null, com.mapbox.maps.ScreenCoordinate? offset = null);\n    method @com.mapbox.maps.MapboxExperimental @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<? extends com.mapbox.maps.GenericEvent>! genericEvents(com.mapbox.maps.MapboxMap, String eventName);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.CameraChangedCoalesced> getCameraChangedCoalescedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.CameraChanged> getCameraChangedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.Value>! getFeatureState(com.mapbox.maps.MapboxMap, String sourceId, String sourceLayerId = null, String featureId);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.maps.FeatureExtensionValue>! getGeoJsonClusterChildren(com.mapbox.maps.MapboxMap, String sourceIdentifier, com.mapbox.geojson.Feature cluster);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.maps.FeatureExtensionValue>! getGeoJsonClusterExpansionZoom(com.mapbox.maps.MapboxMap, String sourceIdentifier, com.mapbox.geojson.Feature cluster);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.maps.FeatureExtensionValue>! getGeoJsonClusterLeaves(com.mapbox.maps.MapboxMap, String sourceIdentifier, com.mapbox.geojson.Feature cluster, long limit, long offset);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.MapIdle> getMapIdleEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.MapLoaded> getMapLoadedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.MapLoadingError> getMapLoadingErrorEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.RenderFrameFinished> getRenderFrameFinishedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.RenderFrameStarted> getRenderFrameStartedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.ResourceRequest> getResourceRequestEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.SourceAdded> getSourceAddedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.SourceDataLoaded> getSourceDataLoadedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.SourceRemoved> getSourceRemovedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleDataLoaded> getStyleDataLoadedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleImageMissing> getStyleImageMissingEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleImageRemoveUnused> getStyleImageRemoveUnusedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static kotlinx.coroutines.flow.Flow<com.mapbox.maps.StyleLoaded> getStyleLoadedEvents(com.mapbox.maps.MapboxMap);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None>! removeFeatureState(com.mapbox.maps.MapboxMap, String sourceId, String sourceLayerId = null, String featureId, String stateKey = null);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None>! resetFeatureStates(com.mapbox.maps.MapboxMap, String sourceId, String sourceLayerId = null);\n    method @kotlin.jvm.JvmSynthetic public static suspend com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None>! setFeatureState(com.mapbox.maps.MapboxMap, String sourceId, String sourceLayerId = null, String featureId, com.mapbox.bindgen.Value state);\n  }\n\n}\n\npackage com.mapbox.maps.debugoptions {\n\n  public final class MapViewDebugOptions {\n    method public com.mapbox.maps.debugoptions.MapViewDebugOptions copy(String name);\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions CAMERA;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions COLLISION;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions.Companion Companion;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions DEPTH_BUFFER;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions LAYERS2_DWIREFRAME;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions LAYERS3_DWIREFRAME;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions LIGHT;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions MODEL_BOUNDS;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions OVERDRAW;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions PADDING;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions PARSE_STATUS;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions STENCIL_CLIP;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions TERRAIN_WIREFRAME;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions TILE_BORDERS;\n    field public static final com.mapbox.maps.debugoptions.MapViewDebugOptions TIMESTAMPS;\n  }\n\n  public static final class MapViewDebugOptions.Companion {\n  }\n\n  public final class MapViewDebugOptionsKt {\n  }\n\n  public final class PaddingDebugViewKt {\n  }\n\n}\n\npackage com.mapbox.maps.plugin {\n\n  public final class InvalidViewPluginHostException extends java.lang.Exception {\n    ctor public InvalidViewPluginHostException(String message);\n  }\n\n}\n\npackage com.mapbox.maps.renderer {\n\n  public fun interface OnFpsChangedListener {\n    method @com.mapbox.maps.renderer.RenderThread public void onFpsChanged(double fps);\n  }\n\n  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.CLASS}) public @interface RenderThread {\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class RenderThreadStats {\n    method public java.util.List<java.lang.Double> getFrameTimeList();\n    method public Double? getPercentile50();\n    method public Double? getPercentile90();\n    method public Double? getPercentile95();\n    method public Double? getPercentile99();\n    method public long getTotalDroppedFrames();\n    method public long getTotalFrames();\n    method public long getTotalTime();\n    property public final java.util.List<java.lang.Double> frameTimeList;\n    property public final Double? percentile50;\n    property public final Double? percentile90;\n    property public final Double? percentile95;\n    property public final Double? percentile99;\n    property public final long totalDroppedFrames;\n    property public final long totalFrames;\n    property public final long totalTime;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class RenderThreadStatsRecorder {\n    ctor public RenderThreadStatsRecorder();\n    method public com.mapbox.maps.renderer.RenderThreadStats end();\n    method public boolean isRecording();\n    method public void start();\n    property public final boolean isRecording;\n  }\n\n  public final class RendererError {\n    ctor public RendererError(int eglErrorCode);\n    method public int getEglErrorCode();\n    property public final int eglErrorCode;\n    field public static final com.mapbox.maps.renderer.RendererError.Companion Companion;\n    field public static final com.mapbox.maps.renderer.RendererError NO_VALID_EGL_CONFIG_FOUND;\n    field public static final com.mapbox.maps.renderer.RendererError OUT_OF_MEMORY;\n  }\n\n  public static final class RendererError.Companion {\n  }\n\n  public fun interface RendererSetupErrorListener {\n    method public void onError(com.mapbox.maps.renderer.RendererError error);\n  }\n\n}\n\npackage com.mapbox.maps.renderer.widget {\n\n  @com.mapbox.maps.MapboxExperimental public class BitmapWidget extends com.mapbox.maps.renderer.widget.Widget {\n    ctor public BitmapWidget(android.graphics.Bitmap bitmap, com.mapbox.maps.renderer.widget.WidgetPosition originalPosition = WidgetPosition({ \n    verticalAlignment = WidgetPosition.Vertical.TOP\n    horizontalAlignment = WidgetPosition.Horizontal.LEFT\n    offsetX = 0.0\n    offsetY = 0.0\n}));\n    ctor public BitmapWidget(android.graphics.Bitmap bitmap);\n    ctor @Deprecated public BitmapWidget(android.graphics.Bitmap bitmap, com.mapbox.maps.renderer.widget.WidgetPosition position = com.mapbox.maps.renderer.widget.WidgetPosition(com.mapbox.maps.renderer.widget.WidgetPosition.Vertical.TOP, com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal.LEFT), float marginX = 0f, float marginY = 0f);\n    ctor @Deprecated public BitmapWidget(android.graphics.Bitmap bitmap, com.mapbox.maps.renderer.widget.WidgetPosition position = com.mapbox.maps.renderer.widget.WidgetPosition(com.mapbox.maps.renderer.widget.WidgetPosition.Vertical.TOP, com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal.LEFT), float marginX = 0f);\n    method public com.mapbox.maps.renderer.widget.WidgetPosition getPosition();\n    method public float getRotation();\n    method public void setPosition(com.mapbox.maps.renderer.widget.WidgetPosition widgetPosition);\n    method public void setRotation(float angleDegrees);\n    method public final void updateBitmap(android.graphics.Bitmap bitmap);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public abstract class Widget {\n    method public abstract com.mapbox.maps.renderer.widget.WidgetPosition getPosition();\n    method public abstract float getRotation();\n    method public abstract void setPosition(com.mapbox.maps.renderer.widget.WidgetPosition widgetPosition);\n    method public abstract void setRotation(float angleDegrees);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public final class WidgetPosition {\n    ctor @Deprecated public WidgetPosition(com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal horizontal, com.mapbox.maps.renderer.widget.WidgetPosition.Vertical vertical);\n    method @Deprecated public com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal getHorizontal();\n    method public com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal getHorizontalAlignment();\n    method public float getOffsetX();\n    method public float getOffsetY();\n    method @Deprecated public com.mapbox.maps.renderer.widget.WidgetPosition.Vertical getVertical();\n    method public com.mapbox.maps.renderer.widget.WidgetPosition.Vertical getVerticalAlignment();\n    method public com.mapbox.maps.renderer.widget.WidgetPosition.Builder toBuilder();\n    property @Deprecated public final com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal horizontal;\n    property public final com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal horizontalAlignment;\n    property public final float offsetX;\n    property public final float offsetY;\n    property @Deprecated public final com.mapbox.maps.renderer.widget.WidgetPosition.Vertical vertical;\n    property public final com.mapbox.maps.renderer.widget.WidgetPosition.Vertical verticalAlignment;\n  }\n\n  public static final class WidgetPosition.Builder {\n    ctor public WidgetPosition.Builder();\n    method public com.mapbox.maps.renderer.widget.WidgetPosition build();\n    method public com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal getHorizontalAlignment();\n    method public float getOffsetX();\n    method public float getOffsetY();\n    method public com.mapbox.maps.renderer.widget.WidgetPosition.Vertical getVerticalAlignment();\n    method public com.mapbox.maps.renderer.widget.WidgetPosition.Builder setHorizontalAlignment(com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal horizontalAlignment);\n    method public com.mapbox.maps.renderer.widget.WidgetPosition.Builder setOffsetX(float offsetX);\n    method public com.mapbox.maps.renderer.widget.WidgetPosition.Builder setOffsetY(float offsetY);\n    method public com.mapbox.maps.renderer.widget.WidgetPosition.Builder setVerticalAlignment(com.mapbox.maps.renderer.widget.WidgetPosition.Vertical verticalAlignment);\n    property public final com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal horizontalAlignment;\n    property public final float offsetX;\n    property public final float offsetY;\n    property public final com.mapbox.maps.renderer.widget.WidgetPosition.Vertical verticalAlignment;\n  }\n\n  public enum WidgetPosition.Horizontal {\n    enum_constant public static final com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal CENTER;\n    enum_constant public static final com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal LEFT;\n    enum_constant public static final com.mapbox.maps.renderer.widget.WidgetPosition.Horizontal RIGHT;\n  }\n\n  public enum WidgetPosition.Vertical {\n    enum_constant public static final com.mapbox.maps.renderer.widget.WidgetPosition.Vertical BOTTOM;\n    enum_constant public static final com.mapbox.maps.renderer.widget.WidgetPosition.Vertical CENTER;\n    enum_constant public static final com.mapbox.maps.renderer.widget.WidgetPosition.Vertical TOP;\n  }\n\n  public final class WidgetPositionKt {\n    method @com.mapbox.maps.MapboxExperimental @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.renderer.widget.WidgetPosition! WidgetPosition(kotlin.jvm.functions.Function1<? super com.mapbox.maps.renderer.widget.WidgetPosition.Builder,? extends kotlin.Unit> initializer);\n  }\n\n}\n\npackage com.mapbox.maps.viewannotation {\n\n  public interface OnViewAnnotationUpdatedListener {\n    method public default void onViewAnnotationAnchorCoordinateUpdated(android.view.View view, com.mapbox.geojson.Point anchorCoordinate);\n    method public default void onViewAnnotationAnchorUpdated(android.view.View view, com.mapbox.maps.ViewAnnotationAnchorConfig anchor);\n    method public default void onViewAnnotationPositionUpdated(android.view.View view, com.mapbox.maps.ScreenCoordinate leftTopCoordinate, double width, double height);\n    method public default void onViewAnnotationVisibilityUpdated(android.view.View view, boolean visible);\n  }\n\n  public interface ViewAnnotationManager {\n    method public void addOnViewAnnotationUpdatedListener(com.mapbox.maps.viewannotation.OnViewAnnotationUpdatedListener listener);\n    method public android.view.View addViewAnnotation(@LayoutRes int resId, com.mapbox.maps.ViewAnnotationOptions options);\n    method public void addViewAnnotation(@LayoutRes int resId, com.mapbox.maps.ViewAnnotationOptions options, androidx.asynclayoutinflater.view.AsyncLayoutInflater asyncInflater, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> asyncInflateCallback);\n    method public void addViewAnnotation(android.view.View view, com.mapbox.maps.ViewAnnotationOptions options);\n    method @com.mapbox.maps.MapboxDelicateApi public com.mapbox.maps.CameraOptions? cameraForAnnotations(java.util.List<? extends android.view.View> annotations, com.mapbox.maps.EdgeInsets? edgeInsets = null, Double? bearing = null, Double? pitch = null);\n    method public void cameraForAnnotations(java.util.List<? extends android.view.View> annotations, com.mapbox.maps.EdgeInsets? edgeInsets = null, Double? bearing = null, Double? pitch = null, kotlin.jvm.functions.Function1<? super com.mapbox.maps.CameraOptions,kotlin.Unit> result);\n    method public java.util.Map<android.view.View,com.mapbox.maps.ViewAnnotationOptions> getAnnotations();\n    method public android.view.View? getViewAnnotation(com.mapbox.maps.AnnotatedLayerFeature annotatedLayerFeature);\n    method public java.util.HashSet<java.lang.String> getViewAnnotationAvoidLayers();\n    method public com.mapbox.maps.ViewAnnotationOptions? getViewAnnotationOptions(com.mapbox.maps.AnnotatedLayerFeature annotatedLayerFeature);\n    method public com.mapbox.maps.ViewAnnotationOptions? getViewAnnotationOptions(android.view.View view);\n    method public com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode getViewAnnotationUpdateMode();\n    method public void removeAllViewAnnotations();\n    method public void removeOnViewAnnotationUpdatedListener(com.mapbox.maps.viewannotation.OnViewAnnotationUpdatedListener listener);\n    method public boolean removeViewAnnotation(android.view.View view);\n    method public void setViewAnnotationAvoidLayers(java.util.HashSet<java.lang.String>);\n    method public void setViewAnnotationUpdateMode(com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode mode);\n    method public boolean updateViewAnnotation(android.view.View view, com.mapbox.maps.ViewAnnotationOptions options);\n    property public abstract java.util.Map<android.view.View,com.mapbox.maps.ViewAnnotationOptions> annotations;\n    property public abstract java.util.HashSet<java.lang.String> viewAnnotationAvoidLayers;\n    field public static final com.mapbox.maps.viewannotation.ViewAnnotationManager.Companion Companion;\n    field public static final com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode DEFAULT_UPDATE_MODE;\n  }\n\n  public static final class ViewAnnotationManager.Companion {\n  }\n\n  public final class ViewAnnotationOptionsKtxKt {\n    method public static inline com.mapbox.maps.ViewAnnotationOptions.Builder annotatedLayerFeature(com.mapbox.maps.ViewAnnotationOptions.Builder, String layerId, kotlin.jvm.functions.Function1<? super com.mapbox.maps.AnnotatedLayerFeature.Builder,kotlin.Unit> block = {});\n    method public static inline com.mapbox.maps.ViewAnnotationOptions.Builder annotationAnchor(com.mapbox.maps.ViewAnnotationOptions.Builder, kotlin.jvm.functions.Function1<? super com.mapbox.maps.ViewAnnotationAnchorConfig.Builder,kotlin.Unit> block);\n    method public static com.mapbox.maps.ViewAnnotationOptions.Builder annotationAnchors(com.mapbox.maps.ViewAnnotationOptions.Builder, kotlin.jvm.functions.Function1<? super com.mapbox.maps.ViewAnnotationAnchorConfig.Builder,kotlin.Unit>... blocks);\n    method public static com.mapbox.maps.ViewAnnotationOptions.Builder geometry(com.mapbox.maps.ViewAnnotationOptions.Builder, com.mapbox.geojson.Geometry geometry);\n    method public static inline com.mapbox.maps.ViewAnnotationOptions viewAnnotationOptions(kotlin.jvm.functions.Function1<? super com.mapbox.maps.ViewAnnotationOptions.Builder,kotlin.Unit> block);\n  }\n\n  public final class ViewAnnotationUpdateMode {\n    field public static final com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode.Companion Companion;\n    field public static final com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode MAP_FIXED_DELAY;\n    field public static final com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode MAP_SYNCHRONIZED;\n  }\n\n  public static final class ViewAnnotationUpdateMode.Companion {\n  }\n\n}\n\n"
  },
  {
    "path": "maps-sdk/api/maps-sdk.api",
    "content": "public abstract interface class com/mapbox/maps/MapControllable : com/mapbox/maps/MapboxLifecycleObserver {\n\tpublic abstract fun addRendererSetupErrorListener (Lcom/mapbox/maps/renderer/RendererSetupErrorListener;)V\n\tpublic abstract fun addWidget (Lcom/mapbox/maps/renderer/widget/Widget;)V\n\tpublic abstract fun getMapboxMap ()Lcom/mapbox/maps/MapboxMap;\n\tpublic abstract fun onGenericMotionEvent (Landroid/view/MotionEvent;)Z\n\tpublic abstract fun onSizeChanged (II)V\n\tpublic abstract fun onTouchEvent (Landroid/view/MotionEvent;)Z\n\tpublic abstract fun queueEvent (Ljava/lang/Runnable;Z)V\n\tpublic abstract fun removeRendererSetupErrorListener (Lcom/mapbox/maps/renderer/RendererSetupErrorListener;)V\n\tpublic abstract fun removeWidget (Lcom/mapbox/maps/renderer/widget/Widget;)Z\n\tpublic abstract fun setMaximumFps (I)V\n\tpublic abstract fun setOnFpsChangedListener (Lcom/mapbox/maps/renderer/OnFpsChangedListener;)V\n\tpublic abstract fun setRenderThreadStatsRecorder (Lcom/mapbox/maps/renderer/RenderThreadStatsRecorder;)V\n\tpublic abstract fun snapshot ()Landroid/graphics/Bitmap;\n\tpublic abstract fun snapshot (Lcom/mapbox/maps/MapView$OnSnapshotReady;)V\n}\n\npublic final class com/mapbox/maps/MapControllable$DefaultImpls {\n\tpublic static fun onResume (Lcom/mapbox/maps/MapControllable;)V\n\tpublic static synthetic fun queueEvent$default (Lcom/mapbox/maps/MapControllable;Ljava/lang/Runnable;ZILjava/lang/Object;)V\n}\n\npublic final class com/mapbox/maps/MapInitOptions {\n\tpublic static final field Companion Lcom/mapbox/maps/MapInitOptions$Companion;\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Z)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;ZLjava/lang/String;)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;ZLjava/lang/String;Landroid/util/AttributeSet;)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;ZLjava/lang/String;Landroid/util/AttributeSet;I)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;ZLjava/lang/String;Landroid/util/AttributeSet;ILjava/lang/String;)V\n\tpublic synthetic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;ZLjava/lang/String;Landroid/util/AttributeSet;ILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Landroid/content/Context;\n\tpublic final fun component2 ()Lcom/mapbox/maps/MapOptions;\n\tpublic final fun component3 ()Ljava/util/List;\n\tpublic final fun component4 ()Lcom/mapbox/maps/CameraOptions;\n\tpublic final fun component5 ()Z\n\tpublic final fun component6 ()Ljava/lang/String;\n\tpublic final fun component7 ()Landroid/util/AttributeSet;\n\tpublic final fun component8 ()I\n\tpublic final fun component9 ()Ljava/lang/String;\n\tpublic final fun copy (Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;ZLjava/lang/String;Landroid/util/AttributeSet;ILjava/lang/String;)Lcom/mapbox/maps/MapInitOptions;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/MapInitOptions;Landroid/content/Context;Lcom/mapbox/maps/MapOptions;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;ZLjava/lang/String;Landroid/util/AttributeSet;ILjava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/MapInitOptions;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAntialiasingSampleCount ()I\n\tpublic final fun getAttrs ()Landroid/util/AttributeSet;\n\tpublic final fun getCameraOptions ()Lcom/mapbox/maps/CameraOptions;\n\tpublic final fun getContext ()Landroid/content/Context;\n\tpublic final fun getMapName ()Ljava/lang/String;\n\tpublic final fun getMapOptions ()Lcom/mapbox/maps/MapOptions;\n\tpublic final fun getPlugins ()Ljava/util/List;\n\tpublic final fun getStyleUri ()Ljava/lang/String;\n\tpublic final fun getTextureView ()Z\n\tpublic fun hashCode ()I\n\tpublic final fun setAntialiasingSampleCount (I)V\n\tpublic final fun setAttrs (Landroid/util/AttributeSet;)V\n\tpublic final fun setCameraOptions (Lcom/mapbox/maps/CameraOptions;)V\n\tpublic final fun setMapName (Ljava/lang/String;)V\n\tpublic final fun setMapOptions (Lcom/mapbox/maps/MapOptions;)V\n\tpublic final fun setPlugins (Ljava/util/List;)V\n\tpublic final fun setTextureView (Z)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/MapInitOptions$Companion {\n\tpublic final fun getDefaultMapOptions (Landroid/content/Context;)Lcom/mapbox/maps/MapOptions;\n\tpublic final fun getDefaultPluginList ()Ljava/util/List;\n}\n\npublic final class com/mapbox/maps/MapInitOptionsKt {\n\tpublic static final fun applyDefaultParams (Lcom/mapbox/maps/MapOptions$Builder;F)Lcom/mapbox/maps/MapOptions$Builder;\n\tpublic static final fun applyDefaultParams (Lcom/mapbox/maps/MapOptions$Builder;Landroid/content/Context;)Lcom/mapbox/maps/MapOptions$Builder;\n}\n\npublic final class com/mapbox/maps/MapSurface : com/mapbox/maps/MapControllable, com/mapbox/maps/plugin/delegates/MapPluginProviderDelegate {\n\tpublic fun <init> (Landroid/content/Context;Landroid/view/Surface;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/view/Surface;Lcom/mapbox/maps/MapInitOptions;)V\n\tpublic synthetic fun <init> (Landroid/content/Context;Landroid/view/Surface;Lcom/mapbox/maps/MapInitOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun addRendererSetupErrorListener (Lcom/mapbox/maps/renderer/RendererSetupErrorListener;)V\n\tpublic fun addWidget (Lcom/mapbox/maps/renderer/widget/Widget;)V\n\tpublic fun getMapboxMap ()Lcom/mapbox/maps/MapboxMap;\n\tpublic final synthetic fun getMapboxMapDeprecated ()Lcom/mapbox/maps/MapboxMap;\n\tpublic fun getPlugin (Ljava/lang/String;)Lcom/mapbox/maps/plugin/MapPlugin;\n\tpublic final fun getSurface ()Landroid/view/Surface;\n\tpublic fun onDestroy ()V\n\tpublic fun onGenericMotionEvent (Landroid/view/MotionEvent;)Z\n\tpublic fun onLowMemory ()V\n\tpublic fun onResume ()V\n\tpublic fun onSizeChanged (II)V\n\tpublic fun onStart ()V\n\tpublic fun onStop ()V\n\tpublic fun onTouchEvent (Landroid/view/MotionEvent;)Z\n\tpublic fun queueEvent (Ljava/lang/Runnable;Z)V\n\tpublic fun removeRendererSetupErrorListener (Lcom/mapbox/maps/renderer/RendererSetupErrorListener;)V\n\tpublic fun removeWidget (Lcom/mapbox/maps/renderer/widget/Widget;)Z\n\tpublic fun setMaximumFps (I)V\n\tpublic fun setOnFpsChangedListener (Lcom/mapbox/maps/renderer/OnFpsChangedListener;)V\n\tpublic fun setRenderThreadStatsRecorder (Lcom/mapbox/maps/renderer/RenderThreadStatsRecorder;)V\n\tpublic fun snapshot ()Landroid/graphics/Bitmap;\n\tpublic fun snapshot (Lcom/mapbox/maps/MapView$OnSnapshotReady;)V\n\tpublic final fun surfaceChanged (II)V\n\tpublic final fun surfaceCreated ()V\n\tpublic final fun surfaceDestroyed ()V\n}\n\npublic class com/mapbox/maps/MapView : android/widget/FrameLayout, com/mapbox/maps/MapControllable, com/mapbox/maps/plugin/delegates/MapPluginProviderDelegate {\n\tpublic static final field Companion Lcom/mapbox/maps/MapView$Companion;\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;I)V\n\tpublic synthetic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;Lcom/mapbox/maps/MapController;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapInitOptions;)V\n\tpublic synthetic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapInitOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun addRendererSetupErrorListener (Lcom/mapbox/maps/renderer/RendererSetupErrorListener;)V\n\tpublic fun addWidget (Lcom/mapbox/maps/renderer/widget/Widget;)V\n\tpublic final fun createPlugin (Lcom/mapbox/maps/plugin/Plugin;)V\n\tpublic final fun getDebugOptions ()Ljava/util/Set;\n\tpublic fun getMapboxMap ()Lcom/mapbox/maps/MapboxMap;\n\tpublic final synthetic fun getMapboxMapDeprecated ()Lcom/mapbox/maps/MapboxMap;\n\tpublic fun getPlugin (Ljava/lang/String;)Lcom/mapbox/maps/plugin/MapPlugin;\n\tpublic final fun getViewAnnotationManager ()Lcom/mapbox/maps/viewannotation/ViewAnnotationManager;\n\tpublic static final fun isRenderingSupported ()Z\n\tpublic static final fun isTerrainRenderingSupported ()Z\n\tprotected fun onAttachedToWindow ()V\n\tpublic fun onDestroy ()V\n\tpublic fun onGenericMotionEvent (Landroid/view/MotionEvent;)Z\n\tpublic fun onInterceptTouchEvent (Landroid/view/MotionEvent;)Z\n\tpublic fun onLowMemory ()V\n\tpublic fun onResume ()V\n\tpublic fun onSizeChanged (II)V\n\tpublic fun onSizeChanged (IIII)V\n\tpublic fun onStart ()V\n\tpublic fun onStop ()V\n\tpublic fun onTouchEvent (Landroid/view/MotionEvent;)Z\n\tpublic fun queueEvent (Ljava/lang/Runnable;Z)V\n\tpublic final fun removePlugin (Ljava/lang/String;)V\n\tpublic fun removeRendererSetupErrorListener (Lcom/mapbox/maps/renderer/RendererSetupErrorListener;)V\n\tpublic fun removeWidget (Lcom/mapbox/maps/renderer/widget/Widget;)Z\n\tpublic final fun scheduleThreadServiceTypeReset ()V\n\tpublic final fun setDebugOptions (Ljava/util/Set;)V\n\tpublic fun setMaximumFps (I)V\n\tpublic fun setOnFpsChangedListener (Lcom/mapbox/maps/renderer/OnFpsChangedListener;)V\n\tpublic fun setRenderThreadStatsRecorder (Lcom/mapbox/maps/renderer/RenderThreadStatsRecorder;)V\n\tpublic final fun setSnapshotLegacyMode (Z)V\n\tpublic fun snapshot ()Landroid/graphics/Bitmap;\n\tpublic fun snapshot (Lcom/mapbox/maps/MapView$OnSnapshotReady;)V\n}\n\npublic final class com/mapbox/maps/MapView$Companion {\n\tpublic final fun isRenderingSupported ()Z\n\tpublic final fun isTerrainRenderingSupported ()Z\n}\n\npublic abstract interface class com/mapbox/maps/MapView$OnSnapshotReady {\n\tpublic abstract fun onSnapshotReady (Landroid/graphics/Bitmap;)V\n}\n\npublic final class com/mapbox/maps/MapboxConfigurationException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/MapboxConstants {\n\tpublic static final fun getMAPBOX_LOCALE ()Ljava/util/Locale;\n}\n\npublic final class com/mapbox/maps/MapboxMap : com/mapbox/maps/MapboxStyleManager, com/mapbox/maps/plugin/delegates/MapCameraManagerDelegate, com/mapbox/maps/plugin/delegates/MapFeatureQueryDelegate, com/mapbox/maps/plugin/delegates/MapFeatureStateDelegate, com/mapbox/maps/plugin/delegates/MapInteractionDelegate, com/mapbox/maps/plugin/delegates/MapListenerDelegate, com/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate, com/mapbox/maps/plugin/delegates/MapProjectionDelegate, com/mapbox/maps/plugin/delegates/MapTransformDelegate {\n\tpublic static final field Companion Lcom/mapbox/maps/MapboxMap$Companion;\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/NativeMapImpl;Lcom/mapbox/maps/NativeObserver;FLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/NativeMapImpl;Lcom/mapbox/maps/NativeObserver;Lcom/mapbox/maps/StyleObserver;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun addInteraction (Lcom/mapbox/maps/MapInteraction;)Lcom/mapbox/common/Cancelable;\n\tpublic fun addOnCameraChangeListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnCameraChangeListener;)V\n\tpublic fun addOnMapIdleListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapIdleListener;)V\n\tpublic fun addOnMapLoadErrorListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic fun addOnMapLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadedListener;)V\n\tpublic fun addOnRenderFrameFinishedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnRenderFrameFinishedListener;)V\n\tpublic fun addOnRenderFrameStartedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnRenderFrameStartedListener;)V\n\tpublic fun addOnSourceAddedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceAddedListener;)V\n\tpublic fun addOnSourceDataLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceDataLoadedListener;)V\n\tpublic fun addOnSourceRemovedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceRemovedListener;)V\n\tpublic fun addOnStyleDataLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleDataLoadedListener;)V\n\tpublic fun addOnStyleImageMissingListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleImageMissingListener;)V\n\tpublic fun addOnStyleImageUnusedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleImageUnusedListener;)V\n\tpublic fun addOnStyleLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleLoadedListener;)V\n\tpublic fun cameraAnimationsPlugin (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic fun cameraForCoordinateBounds (Lcom/mapbox/maps/CoordinateBounds;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/CameraOptions;\n\tpublic fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/CameraOptions;\n\tpublic fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;Lkotlin/jvm/functions/Function1;)V\n\tpublic fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/ScreenBox;)Lcom/mapbox/maps/CameraOptions;\n\tpublic fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;)Lcom/mapbox/maps/CameraOptions;\n\tpublic fun cameraForDrag (Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/CameraOptions;\n\tpublic fun cameraForGeometry (Lcom/mapbox/geojson/Geometry;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;)Lcom/mapbox/maps/CameraOptions;\n\tpublic static final fun clearData (Lcom/mapbox/maps/AsyncOperationResultCallback;)V\n\tpublic fun coordinateBoundsForCamera (Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/maps/CoordinateBounds;\n\tpublic fun coordinateBoundsForCameraUnwrapped (Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/maps/CoordinateBounds;\n\tpublic fun coordinateBoundsForRect (Landroid/graphics/RectF;)Lcom/mapbox/maps/CoordinateBounds;\n\tpublic fun coordinateBoundsZoomForCamera (Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/maps/CoordinateBoundsZoom;\n\tpublic fun coordinateBoundsZoomForCameraUnwrapped (Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/maps/CoordinateBoundsZoom;\n\tpublic fun coordinateForPixel (Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/geojson/Point;\n\tpublic fun coordinateForProjectedMeters (Lcom/mapbox/maps/ProjectedMeters;)Lcom/mapbox/geojson/Point;\n\tpublic fun coordinateInfoForPixel (Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/CoordinateInfo;\n\tpublic fun coordinatesForPixels (Ljava/util/List;)Ljava/util/List;\n\tpublic fun coordinatesInfoForPixels (Ljava/util/List;)Ljava/util/List;\n\tpublic final fun createRecorder ()Lcom/mapbox/maps/MapboxMapRecorder;\n\tpublic fun dispatch (Lcom/mapbox/maps/PlatformEventInfo;)V\n\tpublic fun executeOnRenderThread (Ljava/lang/Runnable;)V\n\tpublic fun gesturesPlugin (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic final fun getAttributions ()Ljava/util/List;\n\tpublic fun getBounds ()Lcom/mapbox/maps/CameraBounds;\n\tpublic fun getCameraState ()Lcom/mapbox/maps/CameraState;\n\tpublic fun getCenterAltitudeMode ()Lcom/mapbox/maps/MapCenterAltitudeMode;\n\tpublic final fun getDebug ()Ljava/util/List;\n\tpublic final fun getElevation (Lcom/mapbox/geojson/Point;)Ljava/lang/Double;\n\tpublic final fun getFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureStateCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun getFeatureState (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeaturesetFeatureId;Lcom/mapbox/maps/interactions/FeatureStateCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun getFeatureState (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/QueryFeatureStateCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun getFeatureState (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/QueryFeatureStateCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun getFreeCameraOptions ()Lcom/mapbox/maps/FreeCameraOptions;\n\tpublic final fun getGeoJsonClusterChildren (Ljava/lang/String;Lcom/mapbox/geojson/Feature;Lcom/mapbox/maps/QueryFeatureExtensionCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun getGeoJsonClusterExpansionZoom (Ljava/lang/String;Lcom/mapbox/geojson/Feature;Lcom/mapbox/maps/QueryFeatureExtensionCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun getGeoJsonClusterLeaves (Ljava/lang/String;Lcom/mapbox/geojson/Feature;JJLcom/mapbox/maps/QueryFeatureExtensionCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun getGeoJsonClusterLeaves (Ljava/lang/String;Lcom/mapbox/geojson/Feature;JLcom/mapbox/maps/QueryFeatureExtensionCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun getGeoJsonClusterLeaves (Ljava/lang/String;Lcom/mapbox/geojson/Feature;Lcom/mapbox/maps/QueryFeatureExtensionCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun getGeoJsonClusterLeaves$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lcom/mapbox/geojson/Feature;JJLcom/mapbox/maps/QueryFeatureExtensionCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun getIndoor ()Lcom/mapbox/maps/IndoorManager;\n\tpublic fun getMapOptions ()Lcom/mapbox/maps/MapOptions;\n\tpublic fun getMetersPerPixelAtLatitude (D)D\n\tpublic fun getMetersPerPixelAtLatitude (DD)D\n\tpublic final fun getNativeMap ()Lcom/mapbox/maps/Map;\n\tpublic final fun getPrefetchZoomDelta ()B\n\tpublic final fun getRenderWorldCopies ()Z\n\tpublic final fun getScreenCullingShape ()Ljava/util/List;\n\tpublic fun getSize ()Lcom/mapbox/maps/Size;\n\tpublic final fun getStyle ()Lcom/mapbox/maps/Style;\n\tpublic final fun getStyle (Lcom/mapbox/maps/Style$OnStyleLoaded;)V\n\tpublic final synthetic fun getStyleDeprecated ()Lcom/mapbox/maps/Style;\n\tpublic final fun getSymbolScaleBehavior ()Lcom/mapbox/maps/SymbolScaleBehavior;\n\tpublic fun isGestureInProgress ()Z\n\tpublic fun isUserAnimationInProgress ()Z\n\tpublic final fun isValid ()Z\n\tpublic final fun loadStyle (Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;)V\n\tpublic final fun loadStyle (Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;Lcom/mapbox/maps/Style$OnStyleLoaded;)V\n\tpublic final fun loadStyle (Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic final fun loadStyle (Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic final fun loadStyle (Ljava/lang/String;)V\n\tpublic final fun loadStyle (Ljava/lang/String;Lcom/mapbox/maps/Style$OnStyleLoaded;)V\n\tpublic static synthetic fun loadStyle$default (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;Lcom/mapbox/maps/Style$OnStyleLoaded;ILjava/lang/Object;)V\n\tpublic static synthetic fun loadStyle$default (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;ILjava/lang/Object;)V\n\tpublic static synthetic fun loadStyle$default (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;ILjava/lang/Object;)V\n\tpublic static synthetic fun loadStyle$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lcom/mapbox/maps/Style$OnStyleLoaded;ILjava/lang/Object;)V\n\tpublic final fun loadStyleJson (Ljava/lang/String;)V\n\tpublic final fun loadStyleJson (Ljava/lang/String;Lcom/mapbox/maps/Style$OnStyleLoaded;)V\n\tpublic final fun loadStyleJson (Ljava/lang/String;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic final fun loadStyleJson (Ljava/lang/String;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic static synthetic fun loadStyleJson$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;ILjava/lang/Object;)V\n\tpublic static synthetic fun loadStyleJson$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;ILjava/lang/Object;)V\n\tpublic final fun loadStyleUri (Ljava/lang/String;)V\n\tpublic final fun loadStyleUri (Ljava/lang/String;Lcom/mapbox/maps/Style$OnStyleLoaded;)V\n\tpublic final fun loadStyleUri (Ljava/lang/String;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic final fun loadStyleUri (Ljava/lang/String;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic static synthetic fun loadStyleUri$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;ILjava/lang/Object;)V\n\tpublic static synthetic fun loadStyleUri$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lcom/mapbox/maps/TransitionOptions;Lcom/mapbox/maps/Style$OnStyleLoaded;Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;ILjava/lang/Object;)V\n\tpublic fun pixelForCoordinate (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/ScreenCoordinate;\n\tpublic fun pixelsForCoordinates (Ljava/util/List;)Ljava/util/List;\n\tpublic fun project (Lcom/mapbox/geojson/Point;D)Lcom/mapbox/maps/MercatorCoordinate;\n\tpublic fun projectedMetersForCoordinate (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/ProjectedMeters;\n\tpublic fun queryRenderedFeatures (Lcom/mapbox/maps/RenderedQueryGeometry;Lcom/mapbox/maps/RenderedQueryOptions;Lcom/mapbox/maps/QueryRenderedFeaturesCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun queryRenderedFeatures (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/RenderedQueryGeometry;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/interactions/QueryRenderedFeaturesetFeaturesCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun queryRenderedFeatures (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/RenderedQueryGeometry;Lcom/mapbox/maps/interactions/QueryRenderedFeaturesetFeaturesCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun queryRenderedFeatures (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/interactions/QueryRenderedFeaturesetFeaturesCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun queryRenderedFeatures$default (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/RenderedQueryGeometry;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/interactions/QueryRenderedFeaturesetFeaturesCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic fun queryRenderedRasterValues (Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/RenderedRasterQueryOptions;Lcom/mapbox/maps/QueryRenderedRasterValuesCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun querySourceFeatures (Ljava/lang/String;Lcom/mapbox/maps/SourceQueryOptions;Lcom/mapbox/maps/QuerySourceFeaturesCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun reduceMemoryUse ()V\n\tpublic final fun removeFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun removeFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureStateKey;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun removeFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureStateKey;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun removeFeatureState (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeaturesetFeatureId;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun removeFeatureState (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeaturesetFeatureId;Lcom/mapbox/maps/interactions/FeatureStateKey;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun removeFeatureState (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeaturesetFeatureId;Lcom/mapbox/maps/interactions/FeatureStateKey;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun removeFeatureState (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun removeFeatureState (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun removeFeatureState (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun removeFeatureState$default (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureStateKey;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun removeFeatureState$default (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeaturesetFeatureId;Lcom/mapbox/maps/interactions/FeatureStateKey;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic fun removeFeatureStateExpression (ILcom/mapbox/maps/FeatureStateOperationCallback;)V\n\tpublic fun removeOnCameraChangeListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnCameraChangeListener;)V\n\tpublic fun removeOnMapIdleListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapIdleListener;)V\n\tpublic fun removeOnMapLoadErrorListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic fun removeOnMapLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadedListener;)V\n\tpublic fun removeOnRenderFrameFinishedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnRenderFrameFinishedListener;)V\n\tpublic fun removeOnRenderFrameStartedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnRenderFrameStartedListener;)V\n\tpublic fun removeOnSourceAddedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceAddedListener;)V\n\tpublic fun removeOnSourceDataLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceDataLoadedListener;)V\n\tpublic fun removeOnSourceRemovedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceRemovedListener;)V\n\tpublic fun removeOnStyleDataLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleDataLoadedListener;)V\n\tpublic fun removeOnStyleImageMissingListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleImageMissingListener;)V\n\tpublic fun removeOnStyleImageUnusedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleImageUnusedListener;)V\n\tpublic fun removeOnStyleLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleLoadedListener;)V\n\tpublic fun resetFeatureStateExpressions (Lcom/mapbox/maps/FeatureStateOperationCallback;)V\n\tpublic final fun resetFeatureStates (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun resetFeatureStates (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun resetFeatureStates (Ljava/lang/String;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun resetFeatureStates (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun resetFeatureStates$default (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic fun setBounds (Lcom/mapbox/maps/CameraBoundsOptions;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setCamera (Lcom/mapbox/maps/CameraOptions;)V\n\tpublic fun setCamera (Lcom/mapbox/maps/FreeCameraOptions;)V\n\tpublic fun setCameraAnimationHint (Lcom/mapbox/maps/CameraAnimationHint;)V\n\tpublic fun setCenterAltitudeMode (Lcom/mapbox/maps/MapCenterAltitudeMode;)V\n\tpublic fun setConstrainMode (Lcom/mapbox/maps/ConstrainMode;)V\n\tpublic final fun setDebug (Ljava/util/List;Z)V\n\tpublic final fun setFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureState;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun setFeatureState (Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun setFeatureState (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeaturesetFeatureId;Lcom/mapbox/maps/interactions/FeatureState;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun setFeatureState (Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeaturesetFeatureId;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun setFeatureState (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun setFeatureState (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun setFeatureState$default (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/interactions/FeaturesetFeature;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun setFeatureState$default (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/FeaturesetFeatureId;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic fun setFeatureStateExpression (ILcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/maps/FeatureStateOperationCallback;)V\n\tpublic fun setGestureInProgress (Z)V\n\tpublic fun setNorthOrientation (Lcom/mapbox/maps/NorthOrientation;)V\n\tpublic final fun setPrefetchZoomDelta (B)V\n\tpublic final fun setRenderWorldCopies (Z)V\n\tpublic final fun setScreenCullingShape (Ljava/util/List;)V\n\tpublic final fun setSymbolScaleBehavior (Lcom/mapbox/maps/SymbolScaleBehavior;)V\n\tpublic final fun setTileCacheBudget (Lcom/mapbox/maps/TileCacheBudget;)V\n\tpublic fun setUserAnimationInProgress (Z)V\n\tpublic fun setViewportMode (Lcom/mapbox/maps/ViewportMode;)V\n\tpublic final fun startPerformanceStatisticsCollection (Lcom/mapbox/maps/PerformanceStatisticsOptions;Lcom/mapbox/maps/PerformanceStatisticsCallback;)V\n\tpublic final fun stopPerformanceStatisticsCollection ()V\n\tpublic fun subscribeCameraChanged (Lcom/mapbox/maps/CameraChangedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeCameraChangedCoalesced (Lcom/mapbox/maps/CameraChangedCoalescedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeGenericEvent (Ljava/lang/String;Lcom/mapbox/maps/GenericEventCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeMapIdle (Lcom/mapbox/maps/MapIdleCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeMapLoaded (Lcom/mapbox/maps/MapLoadedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeMapLoadingError (Lcom/mapbox/maps/MapLoadingErrorCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeRenderFrameFinished (Lcom/mapbox/maps/RenderFrameFinishedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeRenderFrameStarted (Lcom/mapbox/maps/RenderFrameStartedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeResourceRequest (Lcom/mapbox/maps/ResourceRequestCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeSourceAdded (Lcom/mapbox/maps/SourceAddedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeSourceDataLoaded (Lcom/mapbox/maps/SourceDataLoadedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeSourceRemoved (Lcom/mapbox/maps/SourceRemovedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeStyleDataLoaded (Lcom/mapbox/maps/StyleDataLoadedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeStyleImageMissing (Lcom/mapbox/maps/StyleImageMissingCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeStyleImageRemoveUnused (Lcom/mapbox/maps/StyleImageRemoveUnusedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun subscribeStyleLoaded (Lcom/mapbox/maps/StyleLoadedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic final fun tileCover (Lcom/mapbox/maps/TileCoverOptions;Lcom/mapbox/maps/CameraOptions;)Ljava/util/List;\n\tpublic final fun triggerRepaint ()V\n\tpublic fun unproject (Lcom/mapbox/maps/MercatorCoordinate;D)Lcom/mapbox/geojson/Point;\n\tpublic final fun whenSizeReady (Lkotlin/jvm/functions/Function0;)V\n}\n\npublic final class com/mapbox/maps/MapboxMap$Companion {\n\tpublic final fun clearData (Lcom/mapbox/maps/AsyncOperationResultCallback;)V\n}\n\npublic final class com/mapbox/maps/MapboxMapRecorder {\n\tpublic final fun getPlaybackState ()Ljava/lang/String;\n\tpublic final fun replay (Ljava/nio/ByteBuffer;)V\n\tpublic final fun replay (Ljava/nio/ByteBuffer;Lcom/mapbox/maps/MapPlayerOptions;)V\n\tpublic final fun replay (Ljava/nio/ByteBuffer;Lcom/mapbox/maps/MapPlayerOptions;Lkotlin/jvm/functions/Function0;)V\n\tpublic static synthetic fun replay$default (Lcom/mapbox/maps/MapboxMapRecorder;Ljava/nio/ByteBuffer;Lcom/mapbox/maps/MapPlayerOptions;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V\n\tpublic final fun startRecording ()V\n\tpublic final fun startRecording (Lcom/mapbox/maps/MapRecorderOptions;)V\n\tpublic static synthetic fun startRecording$default (Lcom/mapbox/maps/MapboxMapRecorder;Lcom/mapbox/maps/MapRecorderOptions;ILjava/lang/Object;)V\n\tpublic final fun stopRecording ()Ljava/nio/ByteBuffer;\n\tpublic final fun togglePauseReplay ()V\n}\n\npublic final class com/mapbox/maps/MapboxMapRecorderKt {\n\tpublic static final fun mapPlayerOptions (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapPlayerOptions;\n\tpublic static final fun mapRecorderOptions (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapRecorderOptions;\n}\n\npublic final class com/mapbox/maps/MapboxMapsOptions {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/MapboxMapsOptions;\n\tpublic static final fun getBaseUrl ()Ljava/lang/String;\n\tpublic static final fun getDataPath ()Ljava/lang/String;\n\tpublic static final fun getTileStore ()Lcom/mapbox/common/TileStore;\n\tpublic static final fun getTileStoreUsageMode ()Lcom/mapbox/maps/TileStoreUsageMode;\n\tpublic static final fun setBaseUrl (Ljava/lang/String;)V\n\tpublic static final fun setDataPath (Ljava/lang/String;)V\n\tpublic static final fun setTileStore (Lcom/mapbox/common/TileStore;)V\n\tpublic static final fun setTileStoreUsageMode (Lcom/mapbox/maps/TileStoreUsageMode;)V\n}\n\npublic final class com/mapbox/maps/MapboxMapsOptionsKt {\n\tpublic static final synthetic fun getMapsOptions (Lcom/mapbox/common/MapboxOptions;)Lcom/mapbox/maps/MapboxMapsOptions;\n}\n\npublic final class com/mapbox/maps/MapboxTracing {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/MapboxTracing;\n\tpublic final fun disableAll ()V\n\tpublic final fun enableAll ()V\n\tpublic final fun enableCore ()V\n\tpublic final fun enablePlatform ()V\n}\n\npublic abstract class com/mapbox/maps/SnapshotOverlay {\n\tpublic abstract fun coordinate (Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/geojson/Point;\n\tpublic abstract fun getAttributions ()Ljava/util/List;\n\tpublic abstract fun getCanvas ()Landroid/graphics/Canvas;\n\tpublic abstract fun screenCoordinate (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/ScreenCoordinate;\n}\n\npublic abstract interface class com/mapbox/maps/SnapshotOverlayCallback {\n\tpublic abstract fun onSnapshotOverlay (Lcom/mapbox/maps/SnapshotOverlay;)V\n}\n\npublic final class com/mapbox/maps/SnapshotOverlayOptions {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Z)V\n\tpublic fun <init> (ZZ)V\n\tpublic synthetic fun <init> (ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Z\n\tpublic final fun component2 ()Z\n\tpublic final fun copy (ZZ)Lcom/mapbox/maps/SnapshotOverlayOptions;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/SnapshotOverlayOptions;ZZILjava/lang/Object;)Lcom/mapbox/maps/SnapshotOverlayOptions;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getShowAttributes ()Z\n\tpublic final fun getShowLogo ()Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class com/mapbox/maps/SnapshotResultCallback {\n\tpublic abstract fun onSnapshotResult (Landroid/graphics/Bitmap;Ljava/lang/String;)V\n}\n\npublic abstract interface class com/mapbox/maps/SnapshotStyleListener {\n\tpublic abstract fun onDidFailLoadingStyle (Ljava/lang/String;)V\n\tpublic abstract fun onDidFinishLoadingStyle (Lcom/mapbox/maps/Style;)V\n\tpublic abstract fun onDidFullyLoadStyle (Lcom/mapbox/maps/Style;)V\n\tpublic abstract fun onStyleImageMissing (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/SnapshotStyleListener$DefaultImpls {\n\tpublic static fun onDidFailLoadingStyle (Lcom/mapbox/maps/SnapshotStyleListener;Ljava/lang/String;)V\n\tpublic static fun onDidFullyLoadStyle (Lcom/mapbox/maps/SnapshotStyleListener;Lcom/mapbox/maps/Style;)V\n\tpublic static fun onStyleImageMissing (Lcom/mapbox/maps/SnapshotStyleListener;Ljava/lang/String;)V\n}\n\npublic class com/mapbox/maps/Snapshotter {\n\tpublic static final field Companion Lcom/mapbox/maps/Snapshotter$Companion;\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapSnapshotOptions;)V\n\tpublic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapSnapshotOptions;Lcom/mapbox/maps/SnapshotOverlayOptions;)V\n\tpublic synthetic fun <init> (Landroid/content/Context;Lcom/mapbox/maps/MapSnapshotOptions;Lcom/mapbox/maps/SnapshotOverlayOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/ref/WeakReference;Lcom/mapbox/maps/MapSnapshotOptions;Lcom/mapbox/maps/SnapshotOverlayOptions;Lcom/mapbox/maps/MapSnapshotter;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;)Lcom/mapbox/maps/CameraOptions;\n\tpublic final fun cancel ()V\n\tpublic static final fun clearData (Lcom/mapbox/maps/AsyncOperationResultCallback;)V\n\tpublic final fun coordinateBoundsForCamera (Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/maps/CoordinateBounds;\n\tpublic final fun destroy ()V\n\tpublic final fun getCameraState ()Lcom/mapbox/maps/CameraState;\n\tpublic final fun getSize ()Lcom/mapbox/maps/Size;\n\tpublic final fun getStyleJson ()Ljava/lang/String;\n\tpublic final fun getStyleUri ()Ljava/lang/String;\n\tpublic final fun setCamera (Lcom/mapbox/maps/CameraOptions;)V\n\tpublic final fun setSize (Lcom/mapbox/maps/Size;)V\n\tpublic final fun setStyleJson (Ljava/lang/String;)V\n\tpublic final fun setStyleListener (Lcom/mapbox/maps/SnapshotStyleListener;)V\n\tpublic final fun setStyleUri (Ljava/lang/String;)V\n\tpublic final fun start (Lcom/mapbox/maps/SnapshotOverlayCallback;Lcom/mapbox/maps/SnapshotResultCallback;)V\n\tpublic static synthetic fun start$default (Lcom/mapbox/maps/Snapshotter;Lcom/mapbox/maps/SnapshotOverlayCallback;Lcom/mapbox/maps/SnapshotResultCallback;ILjava/lang/Object;)V\n\tpublic final fun tileCover (Lcom/mapbox/maps/TileCoverOptions;Lcom/mapbox/maps/CameraOptions;)Ljava/util/List;\n}\n\npublic final class com/mapbox/maps/Snapshotter$Companion {\n\tpublic final fun clearData (Lcom/mapbox/maps/AsyncOperationResultCallback;)V\n}\n\npublic final class com/mapbox/maps/SnapshotterDestroyedException : java/lang/IllegalStateException {\n\tpublic fun <init> ()V\n}\n\npublic final class com/mapbox/maps/Style : com/mapbox/maps/MapboxStyleManager {\n\tpublic static final field Companion Lcom/mapbox/maps/Style$Companion;\n\tpublic static final field DARK Ljava/lang/String;\n\tpublic static final field LIGHT Ljava/lang/String;\n\tpublic static final field MAPBOX_STREETS Ljava/lang/String;\n\tpublic static final field OUTDOORS Ljava/lang/String;\n\tpublic static final field SATELLITE Ljava/lang/String;\n\tpublic static final field SATELLITE_STREETS Ljava/lang/String;\n\tpublic static final field STANDARD Ljava/lang/String;\n\tpublic static final field STANDARD_SATELLITE Ljava/lang/String;\n\tpublic static final field TRAFFIC_DAY Ljava/lang/String;\n\tpublic static final field TRAFFIC_NIGHT Ljava/lang/String;\n\tpublic fun addGeoJSONSourceFeatures (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addPersistentStyleCustomLayer (Ljava/lang/String;Lcom/mapbox/maps/CustomLayerHost;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addPersistentStyleLayer (Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleCustomGeometrySource (Ljava/lang/String;Lcom/mapbox/maps/CustomGeometrySourceOptions;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleCustomLayer (Ljava/lang/String;Lcom/mapbox/maps/CustomLayerHost;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleCustomRasterSource (Ljava/lang/String;Lcom/mapbox/maps/CustomRasterSourceOptions;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleImage (Ljava/lang/String;FLcom/mapbox/maps/Image;ZLjava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleImportFromJSON (Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;Lcom/mapbox/maps/ImportPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleImportFromURI (Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;Lcom/mapbox/maps/ImportPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleLayer (Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleModel (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleSource (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getFeaturesets ()Ljava/util/List;\n\tpublic fun getStyleAtmosphereProperty (Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleDefaultCamera ()Lcom/mapbox/maps/CameraOptions;\n\tpublic fun getStyleGlyphURL ()Ljava/lang/String;\n\tpublic fun getStyleImage (Ljava/lang/String;)Lcom/mapbox/maps/Image;\n\tpublic fun getStyleImportConfigProperties (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleImportConfigProperty (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleImportSchema (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleImports ()Ljava/util/List;\n\tpublic fun getStyleJSON ()Ljava/lang/String;\n\tpublic fun getStyleLayerProperties (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleLayerProperty (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleLayers ()Ljava/util/List;\n\tpublic fun getStyleLightProperty (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleLights ()Ljava/util/List;\n\tpublic fun getStyleProjectionProperty (Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleSlots ()Ljava/util/List;\n\tpublic fun getStyleSourceProperties (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleSourceProperty (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleSources ()Ljava/util/List;\n\tpublic fun getStyleTerrainProperty (Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleTransition ()Lcom/mapbox/maps/TransitionOptions;\n\tpublic fun getStyleURI ()Ljava/lang/String;\n\tpublic fun hasStyleImage (Ljava/lang/String;)Z\n\tpublic fun hasStyleModel (Ljava/lang/String;)Z\n\tpublic fun invalidateStyleCustomGeometrySourceRegion (Ljava/lang/String;Lcom/mapbox/maps/CoordinateBounds;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun invalidateStyleCustomGeometrySourceTile (Ljava/lang/String;Lcom/mapbox/maps/CanonicalTileID;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun isStyleLayerPersistent (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun isStyleLoaded ()Z\n\tpublic final fun isValid ()Z\n\tpublic fun moveStyleImport (Ljava/lang/String;Lcom/mapbox/maps/ImportPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun moveStyleLayer (Ljava/lang/String;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeGeoJSONSourceFeatures (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleImage (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleImport (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleLayer (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleModel (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleSource (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setImportColorTheme (Ljava/lang/String;Landroid/graphics/Bitmap;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setImportColorTheme (Ljava/lang/String;Lcom/mapbox/maps/ColorTheme;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setImportColorTheme (Ljava/lang/String;Lcom/mapbox/maps/Image;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setImportColorTheme (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleAtmosphere (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleAtmosphereProperty (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleColorTheme (Landroid/graphics/Bitmap;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleColorTheme (Lcom/mapbox/maps/ColorTheme;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleColorTheme (Lcom/mapbox/maps/Image;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleColorTheme (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleCustomGeometrySourceTileData (Ljava/lang/String;Lcom/mapbox/maps/CanonicalTileID;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleCustomRasterSourceTileData (Ljava/lang/String;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleGeoJSONSourceData (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/GeoJSONSourceData;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleGlyphURL (Ljava/lang/String;)V\n\tpublic fun setStyleImportConfigProperties (Ljava/lang/String;Ljava/util/HashMap;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleImportConfigProperty (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleLayerProperties (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleLayerProperty (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleLightProperty (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleLights (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleProjection (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleProjectionProperty (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleSourceProperties (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleSourceProperty (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleSourceProperty (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleTerrain (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleTerrainProperty (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleTransition (Lcom/mapbox/maps/TransitionOptions;)V\n\tpublic fun styleLayerExists (Ljava/lang/String;)Z\n\tpublic fun styleSourceExists (Ljava/lang/String;)Z\n\tpublic fun updateGeoJSONSourceFeatures (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun updateStyleImageSourceImage (Ljava/lang/String;Lcom/mapbox/maps/Image;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun updateStyleImportWithJSON (Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun updateStyleImportWithURI (Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;)Lcom/mapbox/bindgen/Expected;\n}\n\npublic final class com/mapbox/maps/Style$Companion {\n}\n\npublic abstract interface class com/mapbox/maps/Style$OnStyleLoaded {\n\tpublic abstract fun onStyleLoaded (Lcom/mapbox/maps/Style;)V\n}\n\npublic final class com/mapbox/maps/SymbolScaleBehavior {\n\tpublic static final field Companion Lcom/mapbox/maps/SymbolScaleBehavior$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/Float;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun fixed (F)Lcom/mapbox/maps/SymbolScaleBehavior;\n\tpublic static final fun getSystem ()Lcom/mapbox/maps/SymbolScaleBehavior;\n\tpublic fun hashCode ()I\n\tpublic static final fun system (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/SymbolScaleBehavior;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/SymbolScaleBehavior$Companion {\n\tpublic final fun fixed (F)Lcom/mapbox/maps/SymbolScaleBehavior;\n\tpublic final fun getSystem ()Lcom/mapbox/maps/SymbolScaleBehavior;\n\tpublic final fun system (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/SymbolScaleBehavior;\n}\n\npublic final class com/mapbox/maps/attribution/AttributionLayout {\n\tpublic fun <init> (Landroid/graphics/Bitmap;Landroid/graphics/PointF;Z)V\n\tpublic final fun component1 ()Landroid/graphics/Bitmap;\n\tpublic final fun component2 ()Landroid/graphics/PointF;\n\tpublic final fun component3 ()Z\n\tpublic final fun copy (Landroid/graphics/Bitmap;Landroid/graphics/PointF;Z)Lcom/mapbox/maps/attribution/AttributionLayout;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/attribution/AttributionLayout;Landroid/graphics/Bitmap;Landroid/graphics/PointF;ZILjava/lang/Object;)Lcom/mapbox/maps/attribution/AttributionLayout;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAnchorPoint ()Landroid/graphics/PointF;\n\tpublic final fun getLogo ()Landroid/graphics/Bitmap;\n\tpublic fun hashCode ()I\n\tpublic final fun isShortText ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/attribution/AttributionMeasure {\n\tpublic static final field Companion Lcom/mapbox/maps/attribution/AttributionMeasure$Companion;\n\tpublic final fun getTextView ()Landroid/widget/TextView;\n\tpublic final fun measure ()Lcom/mapbox/maps/attribution/AttributionLayout;\n}\n\npublic final class com/mapbox/maps/attribution/AttributionMeasure$Companion {\n}\n\npublic class com/mapbox/maps/attribution/AttributionParser {\n\tpublic static final field Companion Lcom/mapbox/maps/attribution/AttributionParser$Companion;\n\tpublic final fun createAttributionString ()Ljava/lang/String;\n\tpublic final fun createAttributionString (Z)Ljava/lang/String;\n\tpublic static synthetic fun createAttributionString$default (Lcom/mapbox/maps/attribution/AttributionParser;ZILjava/lang/Object;)Ljava/lang/String;\n\tpublic final fun getAttributions ()Ljava/util/Set;\n\tprotected final fun parse ()V\n}\n\npublic final class com/mapbox/maps/attribution/AttributionParser$Companion {\n\tpublic final fun getIMPROVE_MAP_URLS ()Ljava/util/List;\n}\n\npublic final class com/mapbox/maps/attribution/AttributionParser$Options {\n\tpublic static final field HTML_STYLE_REGEX Ljava/lang/String;\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic final fun build ()Lcom/mapbox/maps/attribution/AttributionParser;\n\tpublic final fun withAttributionData ([Ljava/lang/String;)Lcom/mapbox/maps/attribution/AttributionParser$Options;\n\tpublic final fun withCopyrightSign (Z)Lcom/mapbox/maps/attribution/AttributionParser$Options;\n\tpublic final fun withExtraAttributions (Ljava/util/List;)Lcom/mapbox/maps/attribution/AttributionParser$Options;\n\tpublic final fun withImproveMap (Z)Lcom/mapbox/maps/attribution/AttributionParser$Options;\n\tpublic final fun withMapboxAttribution (Z)Lcom/mapbox/maps/attribution/AttributionParser$Options;\n\tpublic final fun withMapboxGeofencingConsent (Z)Lcom/mapbox/maps/attribution/AttributionParser$Options;\n\tpublic final fun withMapboxPrivacyPolicy (Z)Lcom/mapbox/maps/attribution/AttributionParser$Options;\n\tpublic final fun withTelemetryAttribution (Z)Lcom/mapbox/maps/attribution/AttributionParser$Options;\n}\n\npublic final class com/mapbox/maps/coroutine/MapCameraManagerDelegateExtKt {\n\tpublic static final synthetic fun awaitCameraForCoordinates (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun awaitCameraForCoordinates$default (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/coroutine/MapFeatureQueryDelegateExtKt {\n\tpublic static final synthetic fun queryRenderedFeatures (Lcom/mapbox/maps/plugin/delegates/MapFeatureQueryDelegate;Lcom/mapbox/maps/RenderedQueryGeometry;Lcom/mapbox/maps/RenderedQueryOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun queryRenderedRasterValues (Lcom/mapbox/maps/plugin/delegates/MapFeatureQueryDelegate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/RenderedRasterQueryOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun querySourceFeatures (Lcom/mapbox/maps/plugin/delegates/MapFeatureQueryDelegate;Ljava/lang/String;Lcom/mapbox/maps/SourceQueryOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/coroutine/MapboxMapExtKt {\n\tpublic static final synthetic fun awaitLoadStyle (Lcom/mapbox/maps/MapboxMap;Lcom/mapbox/maps/extension/style/StyleContract$StyleExtension;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun awaitLoadStyle (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun awaitStyle (Lcom/mapbox/maps/MapboxMap;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun cameraForCoordinates (Lcom/mapbox/maps/MapboxMap;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun cameraForCoordinates$default (Lcom/mapbox/maps/MapboxMap;Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final synthetic fun genericEvents (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getCameraChangedCoalescedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getCameraChangedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getFeatureState (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getFeatureState$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final synthetic fun getGeoJsonClusterChildren (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lcom/mapbox/geojson/Feature;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun getGeoJsonClusterExpansionZoom (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lcom/mapbox/geojson/Feature;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun getGeoJsonClusterLeaves (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Lcom/mapbox/geojson/Feature;JJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun getMapIdleEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getMapLoadedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getMapLoadingErrorEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getRenderFrameFinishedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getRenderFrameStartedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getResourceRequestEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getSourceAddedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getSourceDataLoadedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getSourceRemovedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getStyleDataLoadedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getStyleImageMissingEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getStyleImageRemoveUnusedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun getStyleLoadedEvents (Lcom/mapbox/maps/MapboxMap;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static final synthetic fun removeFeatureState (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun removeFeatureState$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final synthetic fun resetFeatureStates (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun resetFeatureStates$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final synthetic fun setFeatureState (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun setFeatureState$default (Lcom/mapbox/maps/MapboxMap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/debugoptions/MapViewDebugOptions {\n\tpublic static final field CAMERA Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field COLLISION Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field Companion Lcom/mapbox/maps/debugoptions/MapViewDebugOptions$Companion;\n\tpublic static final field DEPTH_BUFFER Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field LAYERS2_DWIREFRAME Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field LAYERS3_DWIREFRAME Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field LIGHT Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field MODEL_BOUNDS Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field OVERDRAW Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field PADDING Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field PARSE_STATUS Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field STENCIL_CLIP Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field TERRAIN_WIREFRAME Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field TILE_BORDERS Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static final field TIMESTAMPS Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic final fun copy (Ljava/lang/String;)Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/debugoptions/MapViewDebugOptions;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/debugoptions/MapViewDebugOptions$Companion {\n}\n\npublic final class com/mapbox/maps/plugin/InvalidViewPluginHostException : java/lang/Exception {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic abstract interface class com/mapbox/maps/renderer/OnFpsChangedListener {\n\tpublic abstract fun onFpsChanged (D)V\n}\n\npublic abstract interface annotation class com/mapbox/maps/renderer/RenderThread : java/lang/annotation/Annotation {\n}\n\npublic final class com/mapbox/maps/renderer/RenderThreadStats {\n\tpublic synthetic fun <init> (JJJLjava/util/List;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getFrameTimeList ()Ljava/util/List;\n\tpublic final fun getPercentile50 ()Ljava/lang/Double;\n\tpublic final fun getPercentile90 ()Ljava/lang/Double;\n\tpublic final fun getPercentile95 ()Ljava/lang/Double;\n\tpublic final fun getPercentile99 ()Ljava/lang/Double;\n\tpublic final fun getTotalDroppedFrames ()J\n\tpublic final fun getTotalFrames ()J\n\tpublic final fun getTotalTime ()J\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/renderer/RenderThreadStatsRecorder {\n\tpublic fun <init> ()V\n\tpublic final fun end ()Lcom/mapbox/maps/renderer/RenderThreadStats;\n\tpublic final fun isRecording ()Z\n\tpublic final fun start ()V\n}\n\npublic final class com/mapbox/maps/renderer/RendererError {\n\tpublic static final field Companion Lcom/mapbox/maps/renderer/RendererError$Companion;\n\tpublic static final field NO_VALID_EGL_CONFIG_FOUND Lcom/mapbox/maps/renderer/RendererError;\n\tpublic static final field OUT_OF_MEMORY Lcom/mapbox/maps/renderer/RendererError;\n\tpublic fun <init> (I)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getEglErrorCode ()I\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/renderer/RendererError$Companion {\n}\n\npublic abstract interface class com/mapbox/maps/renderer/RendererSetupErrorListener {\n\tpublic abstract fun onError (Lcom/mapbox/maps/renderer/RendererError;)V\n}\n\npublic class com/mapbox/maps/renderer/widget/BitmapWidget : com/mapbox/maps/renderer/widget/Widget {\n\tpublic fun <init> (Landroid/graphics/Bitmap;)V\n\tpublic fun <init> (Landroid/graphics/Bitmap;Lcom/mapbox/maps/renderer/widget/WidgetPosition;)V\n\tpublic fun <init> (Landroid/graphics/Bitmap;Lcom/mapbox/maps/renderer/widget/WidgetPosition;F)V\n\tpublic fun <init> (Landroid/graphics/Bitmap;Lcom/mapbox/maps/renderer/widget/WidgetPosition;FF)V\n\tpublic synthetic fun <init> (Landroid/graphics/Bitmap;Lcom/mapbox/maps/renderer/widget/WidgetPosition;FFILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Landroid/graphics/Bitmap;Lcom/mapbox/maps/renderer/widget/WidgetPosition;FILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Landroid/graphics/Bitmap;Lcom/mapbox/maps/renderer/widget/WidgetPosition;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getPosition ()Lcom/mapbox/maps/renderer/widget/WidgetPosition;\n\tpublic synthetic fun getRenderer$maps_sdk_release ()Lcom/mapbox/maps/renderer/widget/WidgetRenderer;\n\tpublic fun getRotation ()F\n\tpublic fun setPosition (Lcom/mapbox/maps/renderer/widget/WidgetPosition;)V\n\tpublic fun setRotation (F)V\n\tpublic final fun updateBitmap (Landroid/graphics/Bitmap;)V\n}\n\npublic abstract class com/mapbox/maps/renderer/widget/Widget {\n\tpublic abstract fun getPosition ()Lcom/mapbox/maps/renderer/widget/WidgetPosition;\n\tpublic abstract fun getRotation ()F\n\tpublic abstract fun setPosition (Lcom/mapbox/maps/renderer/widget/WidgetPosition;)V\n\tpublic abstract fun setRotation (F)V\n}\n\npublic final class com/mapbox/maps/renderer/widget/WidgetPosition {\n\tpublic fun <init> (Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;FFLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getHorizontal ()Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;\n\tpublic final fun getHorizontalAlignment ()Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;\n\tpublic final fun getOffsetX ()F\n\tpublic final fun getOffsetY ()F\n\tpublic final fun getVertical ()Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;\n\tpublic final fun getVerticalAlignment ()Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/renderer/widget/WidgetPosition$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/renderer/widget/WidgetPosition$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/renderer/widget/WidgetPosition;\n\tpublic final fun getHorizontalAlignment ()Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;\n\tpublic final fun getOffsetX ()F\n\tpublic final fun getOffsetY ()F\n\tpublic final fun getVerticalAlignment ()Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;\n\tpublic final fun setHorizontalAlignment (Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;)Lcom/mapbox/maps/renderer/widget/WidgetPosition$Builder;\n\tpublic final synthetic fun setHorizontalAlignment (Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;)V\n\tpublic final fun setOffsetX (F)Lcom/mapbox/maps/renderer/widget/WidgetPosition$Builder;\n\tpublic final synthetic fun setOffsetX (F)V\n\tpublic final fun setOffsetY (F)Lcom/mapbox/maps/renderer/widget/WidgetPosition$Builder;\n\tpublic final synthetic fun setOffsetY (F)V\n\tpublic final fun setVerticalAlignment (Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;)Lcom/mapbox/maps/renderer/widget/WidgetPosition$Builder;\n\tpublic final synthetic fun setVerticalAlignment (Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;)V\n}\n\npublic final class com/mapbox/maps/renderer/widget/WidgetPosition$Horizontal : java/lang/Enum {\n\tpublic static final field CENTER Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;\n\tpublic static final field LEFT Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;\n\tpublic static final field RIGHT Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;\n\tpublic static fun values ()[Lcom/mapbox/maps/renderer/widget/WidgetPosition$Horizontal;\n}\n\npublic final class com/mapbox/maps/renderer/widget/WidgetPosition$Vertical : java/lang/Enum {\n\tpublic static final field BOTTOM Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;\n\tpublic static final field CENTER Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;\n\tpublic static final field TOP Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;\n\tpublic static fun values ()[Lcom/mapbox/maps/renderer/widget/WidgetPosition$Vertical;\n}\n\npublic final class com/mapbox/maps/renderer/widget/WidgetPositionKt {\n\tpublic static final synthetic fun WidgetPosition (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/renderer/widget/WidgetPosition;\n}\n\npublic abstract interface class com/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener {\n\tpublic abstract fun onViewAnnotationAnchorCoordinateUpdated (Landroid/view/View;Lcom/mapbox/geojson/Point;)V\n\tpublic abstract fun onViewAnnotationAnchorUpdated (Landroid/view/View;Lcom/mapbox/maps/ViewAnnotationAnchorConfig;)V\n\tpublic abstract fun onViewAnnotationPositionUpdated (Landroid/view/View;Lcom/mapbox/maps/ScreenCoordinate;DD)V\n\tpublic abstract fun onViewAnnotationVisibilityUpdated (Landroid/view/View;Z)V\n}\n\npublic final class com/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener$DefaultImpls {\n\tpublic static fun onViewAnnotationAnchorCoordinateUpdated (Lcom/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener;Landroid/view/View;Lcom/mapbox/geojson/Point;)V\n\tpublic static fun onViewAnnotationAnchorUpdated (Lcom/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener;Landroid/view/View;Lcom/mapbox/maps/ViewAnnotationAnchorConfig;)V\n\tpublic static fun onViewAnnotationPositionUpdated (Lcom/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener;Landroid/view/View;Lcom/mapbox/maps/ScreenCoordinate;DD)V\n\tpublic static fun onViewAnnotationVisibilityUpdated (Lcom/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener;Landroid/view/View;Z)V\n}\n\npublic abstract interface class com/mapbox/maps/viewannotation/ViewAnnotationManager {\n\tpublic static final field Companion Lcom/mapbox/maps/viewannotation/ViewAnnotationManager$Companion;\n\tpublic static final field DEFAULT_UPDATE_MODE Lcom/mapbox/maps/viewannotation/ViewAnnotationUpdateMode;\n\tpublic abstract fun addOnViewAnnotationUpdatedListener (Lcom/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener;)V\n\tpublic abstract fun addViewAnnotation (ILcom/mapbox/maps/ViewAnnotationOptions;)Landroid/view/View;\n\tpublic abstract fun addViewAnnotation (ILcom/mapbox/maps/ViewAnnotationOptions;Landroidx/asynclayoutinflater/view/AsyncLayoutInflater;Lkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun addViewAnnotation (Landroid/view/View;Lcom/mapbox/maps/ViewAnnotationOptions;)V\n\tpublic abstract fun cameraForAnnotations (Ljava/util/List;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;)Lcom/mapbox/maps/CameraOptions;\n\tpublic abstract fun cameraForAnnotations (Ljava/util/List;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;Lkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun getAnnotations ()Ljava/util/Map;\n\tpublic abstract fun getViewAnnotation (Lcom/mapbox/maps/AnnotatedLayerFeature;)Landroid/view/View;\n\tpublic abstract fun getViewAnnotationAvoidLayers ()Ljava/util/HashSet;\n\tpublic abstract fun getViewAnnotationOptions (Landroid/view/View;)Lcom/mapbox/maps/ViewAnnotationOptions;\n\tpublic abstract fun getViewAnnotationOptions (Lcom/mapbox/maps/AnnotatedLayerFeature;)Lcom/mapbox/maps/ViewAnnotationOptions;\n\tpublic abstract fun getViewAnnotationUpdateMode ()Lcom/mapbox/maps/viewannotation/ViewAnnotationUpdateMode;\n\tpublic abstract fun removeAllViewAnnotations ()V\n\tpublic abstract fun removeOnViewAnnotationUpdatedListener (Lcom/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener;)V\n\tpublic abstract fun removeViewAnnotation (Landroid/view/View;)Z\n\tpublic abstract fun setViewAnnotationAvoidLayers (Ljava/util/HashSet;)V\n\tpublic abstract fun setViewAnnotationUpdateMode (Lcom/mapbox/maps/viewannotation/ViewAnnotationUpdateMode;)V\n\tpublic abstract fun updateViewAnnotation (Landroid/view/View;Lcom/mapbox/maps/ViewAnnotationOptions;)Z\n}\n\npublic final class com/mapbox/maps/viewannotation/ViewAnnotationManager$Companion {\n}\n\npublic final class com/mapbox/maps/viewannotation/ViewAnnotationManager$DefaultImpls {\n\tpublic static synthetic fun cameraForAnnotations$default (Lcom/mapbox/maps/viewannotation/ViewAnnotationManager;Ljava/util/List;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;ILjava/lang/Object;)Lcom/mapbox/maps/CameraOptions;\n\tpublic static synthetic fun cameraForAnnotations$default (Lcom/mapbox/maps/viewannotation/ViewAnnotationManager;Ljava/util/List;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n}\n\npublic final class com/mapbox/maps/viewannotation/ViewAnnotationOptionsKtxKt {\n\tpublic static final fun annotatedLayerFeature (Lcom/mapbox/maps/ViewAnnotationOptions$Builder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/ViewAnnotationOptions$Builder;\n\tpublic static synthetic fun annotatedLayerFeature$default (Lcom/mapbox/maps/ViewAnnotationOptions$Builder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/ViewAnnotationOptions$Builder;\n\tpublic static final fun annotationAnchor (Lcom/mapbox/maps/ViewAnnotationOptions$Builder;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/ViewAnnotationOptions$Builder;\n\tpublic static final fun annotationAnchors (Lcom/mapbox/maps/ViewAnnotationOptions$Builder;[Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/ViewAnnotationOptions$Builder;\n\tpublic static final fun geometry (Lcom/mapbox/maps/ViewAnnotationOptions$Builder;Lcom/mapbox/geojson/Geometry;)Lcom/mapbox/maps/ViewAnnotationOptions$Builder;\n\tpublic static final fun viewAnnotationOptions (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/ViewAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/viewannotation/ViewAnnotationUpdateMode {\n\tpublic static final field Companion Lcom/mapbox/maps/viewannotation/ViewAnnotationUpdateMode$Companion;\n\tpublic static final field MAP_FIXED_DELAY Lcom/mapbox/maps/viewannotation/ViewAnnotationUpdateMode;\n\tpublic static final field MAP_SYNCHRONIZED Lcom/mapbox/maps/viewannotation/ViewAnnotationUpdateMode;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/viewannotation/ViewAnnotationUpdateMode$Companion {\n}\n\n"
  },
  {
    "path": "maps-sdk/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n  id(\"com.jaredsburrows.license\")\n}\n\nmapboxLibrary {\n  dokka {\n    // Include extra list of files to generate documentation if available\n    val extraApiDocs = mutableListOf<String>()\n\n    val coreApiDocFile = rootProject.file(\"api-doc-list-maps-core.txt\")\n    if (coreApiDocFile.exists()) {\n      extraApiDocs.addAll(coreApiDocFile.readLines())\n    }\n    val commonApiDocFile = rootProject.file(\"api-doc-list-maps-common.txt\")\n    if (commonApiDocFile.exists()) {\n      extraApiDocs.addAll(commonApiDocFile.readLines())\n    }\n    if (extraApiDocs.isNotEmpty()) {\n      extraListOfSources = extraApiDocs\n      // which might not have docs, so disable report undocumented\n      reportUndocumented = false\n    }\n  }\n  publish {\n    group = \"com.mapbox.maps\"\n    artifactId = \"android\"\n    artifactTitle = \"Mapbox Maps SDK\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android\"\n  }\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    consumerProguardFiles(\"proguard-rules.pro\")\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    testInstrumentationRunnerArguments[\"clearPackageData\"] = \"true\"\n\n    ndk {\n      val abi: String =\n        if (System.getenv(\"ANDROID_ABI\") != null) System.getenv(\"ANDROID_ABI\") else \"\"\n      if (abi.isNotBlank() && !project.hasProperty(\"android.injected.invoked.from.ide\")) {\n        abiFilters.add(abi)\n      }\n    }\n  }\n\n  buildTypes {\n    debug {\n      if (project.hasProperty(\"android.injected.invoked.from.ide\")) {\n        buildConfigField(\"boolean\", \"RUN_FROM_IDE\", \"true\")\n      } else {\n        buildConfigField(\"boolean\", \"RUN_FROM_IDE\", \"false\")\n      }\n    }\n  }\n\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    unitTests.apply {\n      isIncludeAndroidResources = true\n    }\n    unitTests.all {\n      /*\n      Allow Mockk to do deep reflection to access nonpublic members for the packages listed.\n      https://github.com/mockk/mockk/blob/master/doc/md/jdk16-access-exceptions.md\n       */\n      it.jvmArgs(\n        \"--add-opens\", \"java.base/java.util.concurrent.locks=ALL-UNNAMED\",\n      )\n    }\n    animationsDisabled = true\n    if (!project.hasProperty(\"android.injected.invoked.from.ide\")) {\n      execution = \"ANDROIDX_TEST_ORCHESTRATOR\"\n    }\n    compileOptions {\n      sourceCompatibility = JavaVersion.VERSION_1_8\n      targetCompatibility = JavaVersion.VERSION_1_8\n    }\n  }\n}\n\ndependencies {\n  api(libs.mapbox.base)\n\n  implementation(libs.mapbox.annotations)\n  api(project(\":sdk-base\"))\n  implementation(project(\":module-telemetry\"))\n  api(project(\":extension-style\"))\n  api(project(\":plugin-logo\"))\n  api(project(\":plugin-compass\"))\n  api(project(\":plugin-gestures\"))\n  api(project(\":plugin-attribution\"))\n  api(project(\":plugin-locationcomponent\"))\n  api(project(\":plugin-animation\"))\n  api(project(\":plugin-scalebar\"))\n  api(project(\":plugin-overlay\"))\n  api(project(\":plugin-annotation\"))\n  api(project(\":extension-localization\"))\n  api(project(\":plugin-lifecycle\"))\n  api(project(\":plugin-viewport\"))\n  api(project(\":plugin-indoorselector\"))\n  compileOnly(libs.asyncInflater)\n  api(libs.kotlin)\n  api(libs.coroutines)\n  implementation(libs.coroutines.android)\n  implementation(libs.androidx.coreKtx)\n  implementation(libs.androidx.annotations)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  testImplementation(libs.robolectricEgl)\n  testImplementation(libs.asyncInflater)\n  testImplementation(libs.androidx.testJUnit)\n  testImplementation(libs.coroutinesTest)\n  implementation(libs.androidx.appCompat)\n\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n  androidTestImplementation(libs.androidx.testJUnit)\n  androidTestImplementation(libs.androidx.jUnitTestRules)\n  androidTestImplementation(libs.androidx.uiAutomator)\n  androidTestUtil(libs.androidx.orchestrator)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "maps-sdk/proguard-rules.pro",
    "content": "-keep class com.google.gson.** {*;}\n-keep class com.mapbox.geojson.** {*;}\n-keep class com.mapbox.bindgen.** {*;}\n-keep class !com.mapbox.maps.extension.**,!com.mapbox.maps.plugin.**,com.mapbox.maps.** {*;}\n-keep class com.mapbox.mapboxsdk.log.** {*;}\n-keep class com.mapbox.common.** {*;}\n-keep class com.mapbox.mapboxsdk.text.** {*;}"
  },
  {
    "path": "maps-sdk/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n    android:versionName=\"1.0\">\n\n    <application\n        android:label=\"@string/test_app_name\"\n        android:theme=\"@style/Theme.AppCompat.Light.DarkActionBar\">\n\n        <activity\n            android:name=\"com.mapbox.maps.EmptyActivity\"\n            android:screenOrientation=\"portrait\"\n            android:label=\"@string/test_app_name\"\n            android:exported=\"true\" />\n    </application>\n</manifest>"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/BaseAnimationMapTest.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.camera\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n/**\n * Instrumentation test for Layers to test Layer properties.\n */\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nabstract class BaseAnimationMapTest {\n  private lateinit var mapboxMap: MapboxMap\n  protected lateinit var mapView: MapView\n  protected lateinit var style: Style\n  protected lateinit var cameraAnimationPlugin: CameraAnimationsPlugin\n\n  @get:Rule\n  var rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  @Before\n  fun before() {\n    if (!BuildConfig.RUN_FROM_IDE) {\n      with(InstrumentationRegistry.getInstrumentation().uiAutomation) {\n        executeShellCommand(\"settings put global window_animation_scale 1\")\n        executeShellCommand(\"settings put global transition_animation_scale 1\")\n        executeShellCommand(\"settings put global animator_duration_scale 1\")\n      }\n    }\n    val latch = CountDownLatch(2)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        val context = InstrumentationRegistry.getInstrumentation().targetContext\n        mapView = MapView(context)\n        mapView.id = R.id.mapView\n        cameraAnimationPlugin = mapView.camera\n        it.setContentView(mapView)\n\n        mapboxMap = mapView.mapboxMap.apply {\n          loadStyle(\n            Style.DARK\n          ) { style ->\n            this@BaseAnimationMapTest.style = style\n            latch.countDown()\n          }\n          subscribeMapIdle {\n            latch.countDown()\n          }\n        }\n        mapView.onStart()\n      }\n    }\n\n    if (!latch.await(10000, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @After\n  fun tearDown() {\n    if (!BuildConfig.RUN_FROM_IDE) {\n      with(InstrumentationRegistry.getInstrumentation().uiAutomation) {\n        executeShellCommand(\"settings put global window_animation_scale 0\")\n        executeShellCommand(\"settings put global transition_animation_scale 0\")\n        executeShellCommand(\"settings put global animator_duration_scale 0\")\n      }\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/CameraForCoordinatesTest.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.core.view.doOnLayout\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.util.isEmpty\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\n\n@RunWith(AndroidJUnit4::class)\nclass CameraForCoordinatesTest {\n\n  @get:Rule\n  val rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  private lateinit var mapView: MapView\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var countDownLatch: CountDownLatch\n\n  @Before\n  fun setUp() {\n    val latch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      val mapOptions = MapInitOptions.getDefaultMapOptions(it).toBuilder()\n        .pixelRatio(1F)\n        .build()\n      mapView = MapView(it, MapInitOptions(it, mapOptions = mapOptions))\n      mapboxMap = mapView.mapboxMap\n      mapboxMap.loadStyle(\"{}\")\n      // Hardcoded width and height to avoid issues with different screen sizes\n      it.frameLayout.addView(mapView, 200, 200)\n      mapView.doOnLayout {\n        latch.countDown()\n      }\n      mapboxMap.setStyleProjection(Value.valueOf(hashMapOf(\"name\" to Value.valueOf(\"mercator\"))))\n    }\n    latch.throwExceptionOnTimeoutMs(timeoutMs = 30_000L)\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun basicCameraForCoordinates() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n        val points: List<Point> = listOf(\n          Point.fromLngLat(0.0, 0.0),\n          Point.fromLngLat(1.0, 1.0),\n          Point.fromLngLat(2.0, 2.0),\n          Point.fromLngLat(4.0, 4.0),\n        )\n        val cameraForCoordinates = mapboxMap.cameraForCoordinates(\n          coordinates = points,\n          camera = cameraOptions { },\n          coordinatesPadding = null,\n          maxZoom = null,\n          offset = null,\n        )\n        Assert.assertFalse(cameraForCoordinates.isEmpty)\n        Assert.assertEquals(2.001, cameraForCoordinates.center!!.latitude(), 0.001)\n        Assert.assertEquals(2.001, cameraForCoordinates.center!!.longitude(), 0.001)\n        Assert.assertEquals(5.134, cameraForCoordinates.zoom!!, 0.001)\n        countDownLatch.countDown()\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun antimeridianCameraForCoordinates() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n        val points: List<Point> = listOf(\n          Point.fromLngLat(-180.0, 10.0),\n          Point.fromLngLat(180.0, 20.0),\n        )\n        val cameraForCoordinates = mapboxMap.cameraForCoordinates(\n          coordinates = points,\n          camera = cameraOptions { },\n          coordinatesPadding = null,\n          maxZoom = null,\n          offset = null,\n        )\n        Assert.assertFalse(cameraForCoordinates.isEmpty)\n        Assert.assertEquals(0.0, cameraForCoordinates.center!!.longitude(), 0.001)\n        Assert.assertEquals(15.058, cameraForCoordinates.center!!.latitude(), 0.001)\n        Assert.assertEquals(-1.356, cameraForCoordinates.zoom!!, 0.001)\n        countDownLatch.countDown()\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun antimeridian2CameraForCoordinates() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n        val points: List<Point> = listOf(\n          Point.fromLngLat(-185.0, 19.5),\n          Point.fromLngLat(-150.0, 20.0),\n        )\n        val cameraForCoordinates = mapboxMap.cameraForCoordinates(\n          coordinates = points,\n          camera = cameraOptions { },\n          coordinatesPadding = null,\n          maxZoom = null,\n          offset = null,\n        )\n        Assert.assertFalse(cameraForCoordinates.isEmpty)\n        Assert.assertEquals(-167.5, cameraForCoordinates.center!!.longitude(), 0.001)\n        Assert.assertEquals(19.750, cameraForCoordinates.center!!.latitude(), 0.001)\n        Assert.assertEquals(2.006, cameraForCoordinates.zoom!!, 0.001)\n        countDownLatch.countDown()\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n  }\n\n  @After\n  @UiThreadTest\n  fun teardown() {\n    mapView.onStop()\n    mapView.onDestroy()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/EmptyActivity.kt",
    "content": "package com.mapbox.maps\n\nimport android.os.Bundle\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.appcompat.app.AppCompatActivity\n\nclass EmptyActivity : AppCompatActivity() {\n\n  lateinit var frameLayout: FrameLayout\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    frameLayout = FrameLayout(this)\n    frameLayout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)\n    setContentView(frameLayout)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/LegacyOfflineManagerTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.geojson.Point\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass LegacyOfflineManagerTest {\n\n  private lateinit var offlineManager: OfflineRegionManager\n\n  @Test\n  fun sanity() {\n    val latch = CountDownLatch(1)\n    Handler(Looper.getMainLooper()).post {\n      offlineManager = OfflineRegionManager()\n      offlineManager.createOfflineRegion(\n        OfflineRegionGeometryDefinition.Builder()\n          .geometry(Point.fromLngLat(0.0, 0.0))\n          .minZoom(12.0)\n          .maxZoom(12.0)\n          .pixelRatio(1.0f)\n          .glyphsRasterizationMode(GlyphsRasterizationMode.NO_GLYPHS_RASTERIZED_LOCALLY)\n          .styleURL(Style.MAPBOX_STREETS)\n          .build()\n      ) {\n        latch.countDown()\n      }\n    }\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/MapIntegrationTest.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.geojson.Point\nimport org.junit.After\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass MapIntegrationTest {\n\n  @get:Rule\n  val rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  private lateinit var mapView: MapView\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var countDownLatch: CountDownLatch\n\n  @Test\n  fun testSetCameraOnStart() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView = MapView(it)\n        mapboxMap = mapView.mapboxMap\n        it.frameLayout.addView(mapView)\n        mapView.onStart()\n        mapboxMap.setCamera(\n          CameraOptions.Builder()\n            .center(Point.fromLngLat(17.045988781311138, 51.12341909978734))\n            .bearing(27.254667247679752)\n            .pitch(0.0)\n            .padding(EdgeInsets(140.0, 140.0, 140.0, 140.0))\n            .zoom(13.282170222962456)\n            .build()\n        )\n        countDownLatch.countDown()\n      }\n    }\n    if (!countDownLatch.await(5, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  @After\n  @UiThreadTest\n  fun teardown() {\n    mapView.onStop()\n    mapView.onDestroy()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/MapSnapshotterTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.platform.app.InstrumentationRegistry\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass MapSnapshotterTest {\n\n  private lateinit var mapSnapshotter: MapSnapshotter\n\n  @Test\n  fun sanity() {\n    val latch = CountDownLatch(1)\n    Handler(Looper.getMainLooper()).post {\n      val context = InstrumentationRegistry.getInstrumentation().targetContext\n      val snapshotterOptions = MapSnapshotOptions.Builder()\n        .size(Size(600.0f, 512.0f))\n        .pixelRatio(1.0f)\n        .build()\n\n      mapSnapshotter = MapSnapshotter(snapshotterOptions).apply {\n        setCamera(\n          CameraOptions.Builder().zoom(14.0).center(\n            com.mapbox.geojson.Point.fromLngLat(\n              4.895033, 52.374724\n            )\n          ).build()\n        )\n        styleURI = Style.MAPBOX_STREETS\n        start {\n          if (it.isValue) {\n            val image = it.value!!.moveImage()!!\n            if (image.data.buffer.hasRemaining() && image.width == 600 && image.height == 512) {\n              latch.countDown()\n            }\n          }\n        }\n      }\n    }\n    if (!latch.await(10, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/MapboxMapIntegrationTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.common.MapboxOptions\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass MapboxMapIntegrationTest {\n\n  @get:Rule\n  val rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  private lateinit var mapView: MapView\n  private lateinit var mapboxMap: MapboxMap\n\n  @Before\n  @UiThreadTest\n  fun setUp() {\n    rule.scenario.onActivity {\n      mapView = MapView(it)\n      mapboxMap = mapView.mapboxMap\n      it.frameLayout.addView(mapView)\n      mapView.onStart()\n    }\n  }\n\n  @UiThreadTest\n  @Test\n  fun testDefaultMapboxOptions() {\n    val context = mapView.context\n    assertEquals(context.getTokenFromResource(), MapboxOptions.accessToken)\n    assertEquals(\"${context.filesDir.absolutePath}/.mapbox/map_data/\", MapboxMapsOptions.dataPath)\n    assertEquals(\"https://api.mapbox.com\", MapboxMapsOptions.baseUrl)\n    assertNotNull(MapboxMapsOptions.tileStore)\n    assertEquals(TileStoreUsageMode.READ_ONLY, MapboxMapsOptions.tileStoreUsageMode)\n  }\n\n  @UiThreadTest\n  @Test\n  fun testMapViewIsRenderingSupported() {\n    assertEquals(true, MapView.isRenderingSupported())\n  }\n\n  @UiThreadTest\n  @Test\n  fun testMapViewIsTerrainRenderingSupported() {\n    assertEquals(true, MapView.isTerrainRenderingSupported())\n  }\n\n  private fun Context.getTokenFromResource(): String {\n    val resId = resources.getIdentifier(\n      \"mapbox_access_token\",\n      \"string\",\n      packageName\n    )\n    return getString(resId)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/RenderTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.opengl.GLES20\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.filters.LargeTest\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n@RunWith(Parameterized::class)\n@LargeTest\nclass RenderTest(\n  private val useTexture: Boolean,\n  private val eventNeedRender: Boolean,\n) {\n\n  @get:Rule\n  val rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  @Test\n  fun userQueueEventNeedRender() {\n    val latch = CountDownLatch(1)\n    var openGlVersionString = \"\"\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        val mapView = MapView(it, MapInitOptions(it, textureView = useTexture))\n        mapView.queueEvent(\n          {\n            openGlVersionString = GLES20.glGetString(GLES20.GL_VERSION)\n            // assume anything should already have OpenGL ES 3+...\n            assert(openGlVersionString.contains(\"OpenGL ES 3.\"))\n            latch.countDown()\n          },\n          needRender = eventNeedRender\n        )\n        it.frameLayout.addView(mapView)\n        mapView.onStart()\n      }\n    }\n    if (!latch.await(LATCH_TIMEOUT_SEC, TimeUnit.SECONDS)) {\n      throw TimeoutException()\n    }\n  }\n\n  companion object {\n    private const val LATCH_TIMEOUT_SEC = 5L\n    @JvmStatic\n    @Parameterized.Parameters\n    fun data() = listOf(\n      arrayOf(/* useTexture */ true, /* eventNeedRender */ true),\n      arrayOf(/* useTexture */ true, /* eventNeedRender */ false),\n      arrayOf(/* useTexture */ false, /* eventNeedRender */ true),\n      arrayOf(/* useTexture */ false, /* eventNeedRender */ false),\n    )\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/StyleLoadTest.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.sources.generated.rasterDemSource\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.extension.style.terrain.generated.terrain\nimport junit.framework.TestCase.*\nimport org.junit.*\nimport org.junit.Assert.assertArrayEquals\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport kotlin.random.Random\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass StyleLoadTest {\n\n  @get:Rule\n  val rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  private lateinit var mapView: MapView\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var countDownLatch: CountDownLatch\n\n  @Before\n  @UiThreadTest\n  fun setUp() {\n    rule.scenario.onActivity {\n      mapView = MapView(it, MapInitOptions(it, plugins = listOf()))\n      mapboxMap = mapView.mapboxMap\n      it.frameLayout.addView(mapView)\n    }\n  }\n\n  @Test\n  fun testStyleNull() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n        mapboxMap.getStyle {\n          countDownLatch.countDown()\n        }\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n  }\n\n  @Test\n  fun testStyleIsValid() {\n    countDownLatch = CountDownLatch(2)\n    val styles = mutableListOf<Style>()\n    rule.scenario.onActivity { style ->\n      style.runOnUiThread {\n        mapboxMap.loadStyle(\n          Style.MAPBOX_STREETS\n        ) { newStyle ->\n          styles.add(newStyle)\n          countDownLatch.countDown()\n\n          mapboxMap.loadStyle(\n            Style.MAPBOX_STREETS\n          ) { newStyle2 ->\n            styles.add(newStyle2)\n            countDownLatch.countDown()\n          }\n        }\n        mapView.onStart()\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n\n    assertFalse(styles[0].isValid())\n    assertTrue(styles[1].isValid())\n\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity { style ->\n      style.runOnUiThread {\n        mapboxMap.onDestroy()\n        countDownLatch.countDown()\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n\n    assertFalse(styles[0].isValid())\n    assertFalse(styles[1].isValid())\n  }\n\n  @Test\n  fun testStyleAsyncGetter() {\n    countDownLatch = CountDownLatch(2)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.getStyle { style ->\n          assertTrue(\"Style should be fully loaded\", style.isStyleLoaded())\n          countDownLatch.countDown()\n        }\n\n        mapboxMap.loadStyle(\n          Style.MAPBOX_STREETS\n        ) { style ->\n          assertTrue(\"Style should be fully loaded\", style.isStyleLoaded())\n          countDownLatch.countDown()\n        }\n        mapView.onStart()\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs(10_000)\n  }\n\n  @Test\n  fun testStyleIsLoadedOnStyleChange() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.loadStyle(\n          Style.MAPBOX_STREETS\n        ) { style ->\n          assertTrue(\"Style should be fully loaded\", style.isStyleLoaded())\n          mapboxMap.loadStyle(Style.SATELLITE) { style2 ->\n            assertTrue(\"Style should be still fully loaded although its flaw in our current implementation\", style.isStyleLoaded())\n            assertTrue(\"Style should be fully loaded again\", style2.isStyleLoaded())\n            assertTrue(\"New style should be valid\", style2.isValid())\n            assertFalse(\"Old style should not be valid\", style.isValid())\n            countDownLatch.countDown()\n          }\n          assertFalse(\"Map shouldn't be fully loaded\", style.isStyleLoaded())\n        }\n        mapView.onStart()\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs(30_000)\n  }\n\n  @Test\n  fun testLoadMultipleStylesInARow() {\n    countDownLatch = CountDownLatch(1)\n    var loadedStyles = 0\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapboxMap.loadStyle(Style.MAPBOX_STREETS) { loadedStyles++ }\n        mapboxMap.loadStyle(style(\"\") {}) { loadedStyles++ }\n        mapboxMap.loadStyle(Style.SATELLITE) { loadedStyles++ }\n        mapboxMap.loadStyle(Style.MAPBOX_STREETS) { loadedStyles++ }\n        mapboxMap.loadStyle(style(\"\") {}) { loadedStyles++ }\n        mapboxMap.loadStyle(\n          \"\"\"\n            {\n              \"version\": 8,\n              \"name\": \"Land\",\n              \"metadata\": {\n                \"mapbox:autocomposite\": true\n              },\n              \"sources\": {\n                \"composite\": {\n                  \"url\": \"mapbox://mapbox.mapbox-terrain-v2\",\n                  \"type\": \"vector\"\n                }\n              },\n              \"sprite\": \"mapbox://sprites/mapbox/mapbox-terrain-v2\",\n              \"glyphs\": \"mapbox://fonts/mapbox/{fontstack}/{range}.pbf\"\n            }\n          \"\"\".trimIndent()\n        ) { loadedStyles++ }\n        mapboxMap.loadStyle(Style.MAPBOX_STREETS) { loadedStyles++ }\n        mapboxMap.loadStyle(Style.SATELLITE) { loadedStyles++ }\n        mapboxMap.loadStyle(Style.MAPBOX_STREETS) { style ->\n          loadedStyles++\n          assertTrue(\"Style should be fully loaded\", style.isStyleLoaded())\n          assertTrue(\"Style should be valid\", style.isValid())\n          countDownLatch.countDown()\n        }\n        mapView.onStart()\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n    assertEquals(loadedStyles, 1)\n  }\n\n  @Test\n  fun testTerrainDoesNotCrashOnMultipleStyleLoad() {\n    fun loadStyleWithTerrain(\n      uri: String = Style.DARK,\n      terrainSource: String = \"TERRAIN_SOURCE\",\n      demSourceUri: String = \"mapbox://mapbox.mapbox-terrain-dem-v1\",\n      counter: CountDownLatch\n    ) {\n      mapboxMap.loadStyle(\n        styleExtension = style(uri) {\n          // we need terrain for the drape-mipmap parameter to be effective to reduce flickering\n          +rasterDemSource(terrainSource) {\n            url(demSourceUri)\n            // 514 specifies padded DEM tile and provides better performance than 512 tiles.\n            tileSize(514)\n            maxzoom(3)\n          }\n          +terrain(terrainSource) {\n            exaggeration(literal(0))\n          }\n        }\n      )\n      counter.countDown()\n    }\n\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n\n        countDownLatch = CountDownLatch(300)\n        for (i in 0 until 100) {\n          loadStyleWithTerrain(counter = countDownLatch)\n        }\n\n        val random = Random(0)\n        for (i in 0 until 100) {\n          loadStyleWithTerrain(counter = countDownLatch)\n          Thread.sleep(random.nextLong(from = 0, until = 5))\n        }\n\n        for (i in 0 until 100) {\n          mapView.postDelayed(\n            {\n              loadStyleWithTerrain(counter = countDownLatch)\n            },\n            i.toLong()\n          )\n        }\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n  }\n\n  @Test\n  fun testRegisterUserListenerRegisteredBeforeStyleLoad() {\n    countDownLatch = CountDownLatch(2)\n    val callbackResultList = mutableListOf<String>()\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n\n        val map = mapView.mapboxMap\n        var loadedStyle: Style? = null\n        map.subscribeStyleLoaded {\n          assertNotNull(map.style)\n          assert(map.style == loadedStyle)\n          callbackResultList.add(\"STYLE_LOADED\")\n          countDownLatch.countDown()\n        }\n        map.subscribeStyleDataLoaded { styleDataLoaded ->\n          // style is not loaded yet\n          assertNull(map.style)\n          assert(map.style == loadedStyle)\n          // ignore SPRITES and SOURCES as order is undetermined\n          if (styleDataLoaded.type == StyleDataLoadedType.STYLE) {\n            callbackResultList.add(styleDataLoaded.type.name)\n            countDownLatch.countDown()\n          }\n        }\n        map.loadStyle(Style.STANDARD) { style ->\n          loadedStyle = style\n        }\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n    assertArrayEquals(\n      arrayOf(\n        StyleDataLoadedType.STYLE.name,\n        \"STYLE_LOADED\"\n      ),\n      callbackResultList.toTypedArray()\n    )\n  }\n\n  @Test\n  fun testRegisterUserListenerRegisteredAfterStyleLoad() {\n    countDownLatch = CountDownLatch(2)\n    val callbackResultList = mutableListOf<String>()\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n\n        val map = mapView.mapboxMap\n        var loadedStyle: Style? = null\n        map.loadStyle(Style.STANDARD) { style ->\n          loadedStyle = style\n        }\n        map.subscribeStyleLoaded {\n          assertNotNull(map.style)\n          assert(map.style == loadedStyle)\n          callbackResultList.add(\"STYLE_LOADED\")\n          countDownLatch.countDown()\n        }\n        map.subscribeStyleDataLoaded { styleDataLoaded ->\n          // style is not loaded yet\n          assertNull(map.style)\n          assert(map.style == loadedStyle)\n          // ignore SPRITES and SOURCES as order is undetermined\n          if (styleDataLoaded.type == StyleDataLoadedType.STYLE) {\n            callbackResultList.add(styleDataLoaded.type.name)\n            countDownLatch.countDown()\n          }\n        }\n      }\n    }\n    countDownLatch.throwExceptionOnTimeoutMs()\n    assertArrayEquals(\n      arrayOf(\n        StyleDataLoadedType.STYLE.name,\n        \"STYLE_LOADED\"\n      ),\n      callbackResultList.toTypedArray()\n    )\n  }\n\n  @Test\n  fun testRegisterUserListenerRegisteredBeforeCanceledBeforeStyleLoad() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n\n        val map = mapView.mapboxMap\n        val c1 = map.subscribeStyleLoaded {\n          assert(false)\n        }\n        val c2 = map.subscribeStyleDataLoaded {\n          assert(false)\n        }\n        c1.cancel()\n        c2.cancel()\n        map.loadStyle(Style.STANDARD)\n      }\n    }\n    countDownLatch.await(5_000, TimeUnit.MILLISECONDS)\n  }\n\n  @Test\n  fun testRegisterUserListenerRegisteredAfterCanceledAfterStyleLoad() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n\n        val map = mapView.mapboxMap\n        map.loadStyle(Style.STANDARD)\n        val c1 = map.subscribeStyleLoaded {\n          assert(false)\n        }\n        val c2 = map.subscribeStyleDataLoaded {\n          assert(false)\n        }\n        c1.cancel()\n        c2.cancel()\n      }\n    }\n    countDownLatch.await(5_000, TimeUnit.MILLISECONDS)\n  }\n\n  @Test\n  fun testRegisterUserListenerRegisteredBeforeAndCanceledAfterStyleLoad() {\n    countDownLatch = CountDownLatch(1)\n    rule.scenario.onActivity {\n      it.runOnUiThread {\n        mapView.onStart()\n\n        val map = mapView.mapboxMap\n        val c1 = map.subscribeStyleLoaded {\n          assert(false)\n        }\n        val c2 = map.subscribeStyleDataLoaded {\n          assert(false)\n        }\n        map.loadStyle(Style.STANDARD)\n        c1.cancel()\n        c2.cancel()\n      }\n    }\n    countDownLatch.await(5_000, TimeUnit.MILLISECONDS)\n  }\n\n  @After\n  @UiThreadTest\n  fun teardown() {\n    mapView.onStop()\n    mapView.onDestroy()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/SymbolScaleBehaviorTest.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@OptIn(MapboxExperimental::class)\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass SymbolScaleBehaviorTest {\n\n  @get:Rule\n  val rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  private lateinit var mapView: MapView\n  private lateinit var mapboxMap: MapboxMap\n\n  @Before\n  @UiThreadTest\n  fun setUp() {\n    rule.scenario.onActivity {\n      mapView = MapView(it)\n      mapboxMap = mapView.mapboxMap\n      it.frameLayout.addView(mapView)\n      mapView.onStart()\n    }\n  }\n\n  @UiThreadTest\n  @Test\n  fun testSetSymbolScaleBehaviorWithFixedMode() {\n    val expected = SymbolScaleBehavior.fixed(1.5f)\n    mapboxMap.symbolScaleBehavior = expected\n    val actual = mapboxMap.symbolScaleBehavior\n    assertEquals(expected, actual)\n\n    // Verify native map received the scale factor\n    val actualScaleFactor = mapboxMap.getScaleFactor()\n    assertEquals(1.5f, actualScaleFactor, 0.001f)\n  }\n\n  @UiThreadTest\n  @Test\n  fun testSetSymbolScaleBehaviorWithSystemMode() {\n    val expected = SymbolScaleBehavior.system\n    mapboxMap.symbolScaleBehavior = expected\n    val actual = mapboxMap.symbolScaleBehavior\n    assertEquals(expected, actual)\n\n    // Verify scale factor is within valid range\n    val actualScaleFactor = mapboxMap.getScaleFactor()\n    assertTrue(actualScaleFactor >= 0.8f)\n    assertTrue(actualScaleFactor <= 2.0f)\n  }\n\n  @UiThreadTest\n  @Test\n  fun testSetSymbolScaleBehaviorWithCustomMapping() {\n    // Function-based custom mapping\n    val customMapping: (Float) -> Float = { systemScale ->\n      when {\n        systemScale <= 1.0f -> systemScale\n        systemScale <= 1.5f -> 1.0f + (systemScale - 1.0f) * 0.6f\n        else -> 1.5f\n      }\n    }\n    val expected = SymbolScaleBehavior.system(customMapping)\n    mapboxMap.symbolScaleBehavior = expected\n    val actual = mapboxMap.symbolScaleBehavior\n    // Custom mappings with functions can't be easily compared for equality,\n    // but we can verify it was set and is in System mode\n    assertEquals(true, actual.isSystem())\n\n    // Verify scale behavior was applied (exact value depends on the device's system font scale)\n    val actualScaleFactor = mapboxMap.getScaleFactor()\n    assertTrue(actualScaleFactor > 0f)\n  }\n\n  @UiThreadTest\n  @Test\n  fun testDefaultSymbolScaleBehavior() {\n    // Verify default is Fixed(1.0)\n    val defaultBehavior = mapboxMap.symbolScaleBehavior\n    assertEquals(true, defaultBehavior.isFixed())\n    assertEquals(1.0f, defaultBehavior.scaleFactor)\n\n    // Verify default scale factor\n    val actualScaleFactor = mapboxMap.getScaleFactor()\n    assertEquals(1.0f, actualScaleFactor, 0.001f)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/TestUtils.kt",
    "content": "package com.mapbox.maps\n\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.core.view.children\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\ninternal fun FrameLayout.hasChildView(view: View) = children.any { it == view }\n\ninternal fun FrameLayout.getChildViewIndex(view: View) = children.indexOf(view)\n\ninternal fun CountDownLatch.throwExceptionOnTimeoutMs(timeoutMs: Long = DEFAULT_LATCH_TIMEOUT_MS) {\n  if (!await(timeoutMs, TimeUnit.MILLISECONDS)) {\n    throw TimeoutException()\n  }\n}\n\ninternal const val DEFAULT_LATCH_TIMEOUT_MS = 10_000L"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/ThreadCheckTest.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.exception.WorkerThreadException\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.runBlocking\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass ThreadCheckTest {\n\n  @get:Rule\n  val rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  @Test\n  @UiThreadTest\n  fun testMainThread() {\n    rule.scenario.onActivity {\n      val mapView = MapView(it, MapInitOptions(it, plugins = listOf()))\n      mapView.mapboxMap.loadStyle(Style.MAPBOX_STREETS)\n    }\n  }\n\n  @Test(expected = WorkerThreadException::class)\n  @UiThreadTest\n  fun testCoroutineIO() {\n    rule.scenario.onActivity {\n      val mapView = MapView(it, MapInitOptions(it, plugins = listOf()))\n      runBlocking(Dispatchers.IO) {\n        mapView.mapboxMap.loadStyle(Style.MAPBOX_STREETS)\n      }\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/ViewAnnotationTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.os.Handler\nimport android.os.Looper\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.annotation.LayoutRes\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.filters.LargeTest\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.layers.getLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.Visibility\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.moveBy\nimport com.mapbox.maps.test.R\nimport com.mapbox.maps.viewannotation.OnViewAnnotationUpdatedListener\nimport com.mapbox.maps.viewannotation.ViewAnnotationManager\nimport com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode\nimport com.mapbox.maps.viewannotation.annotatedLayerFeature\nimport com.mapbox.maps.viewannotation.annotationAnchor\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport org.hamcrest.MatcherAssert\nimport org.hamcrest.Matchers\nimport org.junit.*\nimport org.junit.Assert.*\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n@RunWith(Parameterized::class)\n@LargeTest\nclass ViewAnnotationTest(\n  @LayoutRes private val layoutResId: Int,\n  private val mode: ViewAnnotationUpdateMode,\n) {\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var mapView: MapView\n  private lateinit var viewAnnotationsLayout: FrameLayout\n  private lateinit var viewAnnotationManager: ViewAnnotationManager\n  private val mainHandler = Handler(Looper.getMainLooper())\n\n  private lateinit var firstView: View\n  private lateinit var secondView: View\n\n  private lateinit var actualVisibilityUpdateList: MutableList<Pair<View, Boolean>>\n\n  @get:Rule\n  var rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  @Before\n  @UiThreadTest\n  fun before() {\n    val latch = CountDownLatch(2)\n    actualVisibilityUpdateList = mutableListOf()\n    rule.scenario.onActivity {\n      val context = InstrumentationRegistry.getInstrumentation().targetContext\n      mapView = MapView(context)\n      mapView.id = R.id.mapView\n      it.setContentView(mapView)\n\n      viewAnnotationManager = mapView.viewAnnotationManager.apply {\n        setViewAnnotationUpdateMode(mode)\n        // no need to remove it afterwards as map view is destroyed in cleanup\n        addOnViewAnnotationUpdatedListener(object : OnViewAnnotationUpdatedListener {\n          override fun onViewAnnotationPositionUpdated(\n            view: View,\n            leftTopCoordinate: ScreenCoordinate,\n            width: Double,\n            height: Double\n          ) { /** no-op **/ }\n\n          override fun onViewAnnotationVisibilityUpdated(view: View, visible: Boolean) {\n            actualVisibilityUpdateList.add(Pair(view, visible))\n          }\n        })\n      }\n      viewAnnotationsLayout = mapView.getChildAt(1) as FrameLayout\n      mapboxMap = mapView.mapboxMap.apply {\n        loadStyle(\n          Style.DARK\n        ) {\n          latch.countDown()\n        }\n        setCamera(\n          CameraOptions.Builder()\n            .center(CAMERA_CENTER)\n            .zoom(CAMERA_ZOOM)\n            .build()\n        )\n        subscribeMapIdle {\n          latch.countDown()\n        }\n      }\n      mapView.onStart()\n    }\n    // it seems that IDLE listener is sometimes not triggered, needs investigation,\n    // for now we proceed after timeout if style was loaded (count == 1)\n    // TODO https://github.com/mapbox/mapbox-maps-android/issues/1170\n    if (!latch.await(DEFAULT_LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {\n      if (latch.count < 1) {\n        throw TimeoutException()\n      }\n    }\n  }\n\n  /**\n   * Helper function that performs some action and verifies result after some delay\n   * when view annotations are fixed in the viewport\n   */\n  private fun viewAnnotationTestHelper(\n    additionalLatchCount: Int = 0,\n    performAction: () -> Unit,\n    makeChecks: (CountDownLatch) -> Unit\n  ) {\n    val latch = CountDownLatch(1 + additionalLatchCount)\n    mainHandler.post {\n      performAction.invoke()\n      mainHandler.postDelayed(\n        {\n          makeChecks.invoke(latch)\n          latch.countDown()\n        },\n        VIEW_PLACEMENT_DELAY_MS\n      )\n    }\n    latch.throwExceptionOnTimeoutMs(timeoutMs = TEST_RUN_MAX_TIME_MS)\n  }\n\n  // checking some use-cases when adding view annotation\n\n  @Test\n  fun addViewAnnotationNoOptions() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertEquals(\n          mapboxMap.pixelForCoordinate(CAMERA_CENTER).x - firstView.width / 2.0,\n          firstView.translationX.toDouble(),\n          ADMISSIBLE_ERROR_PX\n        )\n        assertEquals(\n          mapboxMap.pixelForCoordinate(CAMERA_CENTER).y - firstView.height / 2.0,\n          firstView.translationY.toDouble(),\n          ADMISSIBLE_ERROR_PX\n        )\n        assertArrayEquals(\n          arrayOf(\n            Pair(firstView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addViewAnnotationAnchor() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).x, firstView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).y, firstView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertArrayEquals(\n          arrayOf(\n            Pair(firstView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addViewAnnotationOffsets() {\n    val offsetX = 30.0\n    val offsetY = 20.0\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n              offsetX(offsetX)\n              offsetY(offsetY)\n            }\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertEquals(\n          mapboxMap.pixelForCoordinate(CAMERA_CENTER).x + offsetX,\n          firstView.translationX.toDouble(),\n          ADMISSIBLE_ERROR_PX\n        )\n        assertEquals(\n          mapboxMap.pixelForCoordinate(CAMERA_CENTER).y - offsetY,\n          firstView.translationY.toDouble(),\n          ADMISSIBLE_ERROR_PX\n        )\n        assertArrayEquals(\n          arrayOf(\n            Pair(firstView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addViewAnnotationNotVisible() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            visible(false)\n          }\n        )\n      },\n      makeChecks = {\n        assertFalse(viewAnnotationsLayout.hasChildView(firstView))\n        assertArrayEquals(\n          arrayOf(),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addTwoViewAnnotationsAllowOverlapTrue() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(true)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(true)\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertEquals(mapboxMap.pixelForCoordinate(SHIFTED_CENTER).x, firstView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(SHIFTED_CENTER).y, firstView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).x, secondView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).y, secondView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        MatcherAssert.assertThat(\n          viewAnnotationsLayout.getChildViewIndex(secondView),\n          Matchers.greaterThan(viewAnnotationsLayout.getChildViewIndex(firstView))\n        )\n        assertArrayEquals(\n          arrayOf(\n            Pair(firstView, true),\n            Pair(secondView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addTwoViewAnnotationsAllowOverlapFalse() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(false)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(false)\n          }\n        )\n      },\n      makeChecks = {\n        assertFalse(viewAnnotationsLayout.hasChildView(firstView))\n        assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).x, secondView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).y, secondView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertArrayEquals(\n          arrayOf(\n            Pair(secondView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addTwoViewAnnotationsOneWithPriorityAllowOverlapTrue() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(true)\n            priority(32)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(true)\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertEquals(mapboxMap.pixelForCoordinate(SHIFTED_CENTER).x, firstView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(SHIFTED_CENTER).y, firstView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).x, secondView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).y, secondView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        MatcherAssert.assertThat(\n          viewAnnotationsLayout.getChildViewIndex(secondView),\n          Matchers.lessThan(viewAnnotationsLayout.getChildViewIndex(firstView))\n        )\n        // although first view is selected - we still respect addition order\n        assertArrayEquals(\n          arrayOf(\n            Pair(secondView, true),\n            Pair(firstView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addTwoViewAnnotationsOneAllowOverlapTrueAnotherFalse() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(true)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(false)\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertEquals(mapboxMap.pixelForCoordinate(SHIFTED_CENTER).x, firstView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(SHIFTED_CENTER).y, firstView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).x, secondView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).y, secondView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        MatcherAssert.assertThat(\n          viewAnnotationsLayout.getChildViewIndex(secondView),\n          Matchers.greaterThan(viewAnnotationsLayout.getChildViewIndex(firstView))\n        )\n        assertArrayEquals(\n          arrayOf(\n            Pair(firstView, true),\n            Pair(secondView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addTwoViewAnnotationsOneAllowOverlapFalseAnotherTrue() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(false)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(true)\n          }\n        )\n      },\n      makeChecks = {\n        assertFalse(viewAnnotationsLayout.hasChildView(firstView))\n        assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).x, secondView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).y, secondView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertArrayEquals(\n          arrayOf(\n            Pair(secondView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addTwoViewAnnotationsOneWithPriorityAllowOverlapFalse() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(false)\n            priority(22)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(false)\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertEquals(mapboxMap.pixelForCoordinate(SHIFTED_CENTER).x, firstView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(SHIFTED_CENTER).y, firstView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertFalse(viewAnnotationsLayout.hasChildView(secondView))\n        assertArrayEquals(\n          arrayOf(\n            Pair(firstView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun addTwoViewAnnotationsTwoWithPriorityAllowOverlapFalse() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(false)\n            priority(1)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n            allowOverlap(false)\n            priority(34)\n          }\n        )\n      },\n      makeChecks = {\n        assertFalse(viewAnnotationsLayout.hasChildView(firstView))\n        assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).x, secondView.translationX.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(mapboxMap.pixelForCoordinate(CAMERA_CENTER).y, secondView.translationY.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertArrayEquals(\n          arrayOf(\n            Pair(secondView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  // checking some use-cases when updating view annotations\n\n  @Test\n  fun updateViewAnnotation() {\n    val offsetY = 30.0\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n          }\n        )\n        viewAnnotationManager.updateViewAnnotation(\n          view = firstView,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.CENTER)\n              offsetY(offsetY)\n            }\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertEquals(\n          mapboxMap.pixelForCoordinate(SHIFTED_CENTER).x - firstView.width / 2.0,\n          firstView.translationX.toDouble(),\n          ADMISSIBLE_ERROR_PX\n        )\n        assertEquals(\n          mapboxMap.pixelForCoordinate(SHIFTED_CENTER).y - firstView.height / 2.0 - offsetY,\n          firstView.translationY.toDouble(),\n          ADMISSIBLE_ERROR_PX\n        )\n        assertArrayEquals(\n          arrayOf(\n            Pair(firstView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun updateViewAnnotationDimensions() {\n    val updatedWidthPx = 120.0\n    val updatedHeightPx = 150.0\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n          }\n        )\n        viewAnnotationManager.updateViewAnnotation(\n          view = firstView,\n          options = viewAnnotationOptions {\n            width(updatedWidthPx)\n            height(updatedHeightPx)\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertEquals(updatedWidthPx, firstView.width.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(updatedHeightPx, firstView.height.toDouble(), ADMISSIBLE_ERROR_PX)\n        assertEquals(\n          mapboxMap.pixelForCoordinate(CAMERA_CENTER).x - firstView.width / 2.0,\n          firstView.translationX.toDouble(),\n          ADMISSIBLE_ERROR_PX\n        )\n        assertEquals(\n          mapboxMap.pixelForCoordinate(CAMERA_CENTER).y - firstView.height / 2.0,\n          firstView.translationY.toDouble(),\n          ADMISSIBLE_ERROR_PX\n        )\n        assertArrayEquals(\n          arrayOf(\n            Pair(firstView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun updateViewAnnotationAllowOverlap() {\n    viewAnnotationTestHelper(\n      additionalLatchCount = 1,\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            allowOverlap(false)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            allowOverlap(false)\n          }\n        )\n      },\n      makeChecks = {\n        assertFalse(viewAnnotationsLayout.hasChildView(firstView))\n        assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n        // update allowOverlap only for underlying view annotation\n        viewAnnotationManager.updateViewAnnotation(\n          firstView,\n          viewAnnotationOptions {\n            allowOverlap(true)\n          }\n        )\n        mainHandler.postDelayed(\n          {\n            assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n            assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n            assertArrayEquals(\n              arrayOf(\n                Pair(secondView, true),\n                Pair(firstView, true),\n              ),\n              actualVisibilityUpdateList.toTypedArray()\n            )\n            it.countDown()\n          },\n          VIEW_PLACEMENT_DELAY_MS\n        )\n      }\n    )\n  }\n\n  // checking some use-cases when deleting view annotations\n\n  @Test\n  fun removeViewAnnotation() {\n    viewAnnotationTestHelper(\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n          }\n        )\n        viewAnnotationManager.removeViewAnnotation(firstView)\n      },\n      makeChecks = {\n        assertFalse(viewAnnotationsLayout.hasChildView(firstView))\n        assertArrayEquals(\n          arrayOf(),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun removeViewAnnotationWhenTwoOverlap() {\n    viewAnnotationTestHelper(\n      additionalLatchCount = 1,\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            allowOverlap(false)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            allowOverlap(false)\n          }\n        )\n      },\n      makeChecks = {\n        assertFalse(viewAnnotationsLayout.hasChildView(firstView))\n        assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n        viewAnnotationManager.removeViewAnnotation(secondView)\n        mainHandler.postDelayed(\n          {\n            assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n            assertFalse(viewAnnotationsLayout.hasChildView(secondView))\n            assertArrayEquals(\n              arrayOf(\n                Pair(secondView, true),\n                Pair(secondView, false),\n                Pair(firstView, true),\n              ),\n              actualVisibilityUpdateList.toTypedArray()\n            )\n            it.countDown()\n          },\n          VIEW_PLACEMENT_DELAY_MS\n        )\n      }\n    )\n  }\n\n  // checking some use-cases when using [ViewAnnotationManager.annotatedLayerFeature]\n\n  @Test\n  fun annotatedFeatureIdWhenFeatureVisible() {\n    viewAnnotationTestHelper(\n      performAction = {\n        prepareStyle(mapboxMap.style!!, Visibility.VISIBLE)\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            annotatedLayerFeature(ANNOTATED_LAYER_ID) {\n              featureId(ANNOTATED_FEATURE_ID)\n            }\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.BOTTOM)\n              offsetY(50.0)\n            }\n            visible(true)\n          }\n        )\n      },\n      makeChecks = {\n        assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n        assertArrayEquals(\n          arrayOf(\n            Pair(firstView, true),\n          ),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun annotatedLayerFeatureWhenFeatureGone() {\n    viewAnnotationTestHelper(\n      performAction = {\n        prepareStyle(mapboxMap.style!!, Visibility.NONE)\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            annotatedLayerFeature(ANNOTATED_LAYER_ID) {\n              featureId(ANNOTATED_FEATURE_ID)\n            }\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.BOTTOM)\n              offsetY(50.0)\n            }\n            visible(true)\n          }\n        )\n      },\n      makeChecks = {\n        assertFalse(viewAnnotationsLayout.hasChildView(firstView))\n        // view does not even appear so update listener should not be triggered\n        assertArrayEquals(\n          arrayOf(),\n          actualVisibilityUpdateList.toTypedArray()\n        )\n      }\n    )\n  }\n\n  @Test\n  fun annotatedLayerFeatureWhenFeatureVisibleThenGone() {\n    viewAnnotationTestHelper(\n      additionalLatchCount = 1,\n      performAction = {\n        prepareStyle(mapboxMap.style!!, Visibility.VISIBLE)\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            annotatedLayerFeature(ANNOTATED_LAYER_ID) {\n              featureId(ANNOTATED_FEATURE_ID)\n            }\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.BOTTOM)\n              offsetY(50.0)\n            }\n            visible(true)\n          }\n        )\n      },\n      makeChecks = {\n        // hide marker\n        mapboxMap.style?.getLayer(ANNOTATED_LAYER_ID)?.visibility(Visibility.NONE)\n        mainHandler.postDelayed(\n          {\n            assertArrayEquals(\n              arrayOf(\n                Pair(firstView, true),\n                Pair(firstView, false),\n              ),\n              actualVisibilityUpdateList.toTypedArray()\n            )\n            it.countDown()\n          },\n          VIEW_PLACEMENT_DELAY_MS\n        )\n      }\n    )\n  }\n\n  @Test\n  fun automaticViewVisibilityHandlingViewsOverlap() {\n    viewAnnotationTestHelper(\n      additionalLatchCount = 1,\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            allowOverlap(false)\n          }\n        )\n        secondView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(SHIFTED_CENTER)\n            allowOverlap(false)\n          }\n        )\n      },\n      makeChecks = {\n        assertFalse(viewAnnotationsLayout.hasChildView(firstView))\n        assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n        secondView.visibility = View.GONE\n        mainHandler.postDelayed(\n          {\n            // second view is not removed from parent viewAnnotationsLayout but as it's gone first view should appear now\n            assertTrue(viewAnnotationsLayout.hasChildView(secondView))\n            assertTrue(viewAnnotationsLayout.hasChildView(firstView))\n            assertArrayEquals(\n              arrayOf(\n                Pair(secondView, true),\n                Pair(secondView, false),\n                Pair(firstView, true)\n              ),\n              actualVisibilityUpdateList.toTypedArray()\n            )\n            it.countDown()\n          },\n          VIEW_PLACEMENT_DELAY_MS\n        )\n      }\n    )\n  }\n\n  @Test\n  fun automaticViewVisibilityHandlingInvisibleCase() {\n    automaticViewVisibilityTest(View.INVISIBLE)\n  }\n\n  @Test\n  fun automaticViewVisibilityHandlingGoneCase() {\n    automaticViewVisibilityTest(View.GONE)\n  }\n\n  private fun automaticViewVisibilityTest(resultVisibility: Int) {\n    viewAnnotationTestHelper(\n      additionalLatchCount = 1,\n      performAction = {\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n          }\n        )\n        firstView.visibility = View.VISIBLE\n      },\n      makeChecks = {\n        val initialTranslation = firstView.translationX.toDouble()\n        assertEquals(\n          mapboxMap.pixelForCoordinate(CAMERA_CENTER).x,\n          initialTranslation,\n          ADMISSIBLE_ERROR_PX\n        )\n        firstView.visibility = resultVisibility\n        val shiftX = 50.0\n        // trigger map movement while view annotation is not visible to trigger several core updates\n        mapboxMap.moveBy(\n          ScreenCoordinate(\n            shiftX,\n            0.0\n          ),\n          mapAnimationOptions {\n            duration(100L)\n          }\n        )\n        mainHandler.postDelayed(\n          {\n            // make visible and move the map to make sure position is updated after view is visible\n            firstView.visibility = View.VISIBLE\n            val additionalShiftX = 50.0\n            mapboxMap.moveBy(\n              ScreenCoordinate(\n                additionalShiftX,\n                0.0\n              ),\n              mapAnimationOptions {\n                duration(100L)\n              }\n            )\n            mainHandler.postDelayed(\n              {\n                assertArrayEquals(\n                  arrayOf(\n                    Pair(firstView, true),\n                    Pair(firstView, false),\n                    Pair(firstView, true)\n                  ),\n                  actualVisibilityUpdateList.toTypedArray()\n                )\n                assertEquals(\n                  initialTranslation + shiftX + additionalShiftX,\n                  firstView.translationX.toDouble(),\n                  ADMISSIBLE_ERROR_PX\n                )\n                it.countDown()\n              },\n              VIEW_PLACEMENT_DELAY_MS / 3\n            )\n          },\n          VIEW_PLACEMENT_DELAY_MS / 3\n        )\n      }\n    )\n  }\n\n  @Test\n  fun viewAnnotationUpdateListener() {\n    var positionCallbackTriggerCount = 0\n    var visibilityCallbackTriggerCount = 0\n    var actualWidth = 0.0\n    var actualHeight = 0.0\n    var actualLeftTop = ScreenCoordinate(0.0, 0.0)\n    var actualVisibility = false\n    viewAnnotationTestHelper(\n      performAction = {\n        viewAnnotationManager.addOnViewAnnotationUpdatedListener(object : OnViewAnnotationUpdatedListener {\n          override fun onViewAnnotationPositionUpdated(\n            view: View,\n            leftTopCoordinate: ScreenCoordinate,\n            width: Double,\n            height: Double\n          ) {\n            if (firstView == view) {\n              positionCallbackTriggerCount++\n              actualLeftTop = leftTopCoordinate\n              actualWidth = width\n              actualHeight = height\n            }\n          }\n\n          override fun onViewAnnotationVisibilityUpdated(view: View, visible: Boolean) {\n            if (firstView == view) {\n              visibilityCallbackTriggerCount++\n              actualVisibility = visible\n            }\n          }\n        })\n        firstView = viewAnnotationManager.addViewAnnotation(\n          resId = layoutResId,\n          options = viewAnnotationOptions {\n            geometry(CAMERA_CENTER)\n            annotationAnchor {\n              anchor(ViewAnnotationAnchor.TOP_LEFT)\n            }\n          }\n        )\n      },\n      makeChecks = {\n        // callback should be triggered once and contain correct placement data\n        assert(positionCallbackTriggerCount == 1)\n        assertEquals(firstView.translationX.toDouble(), actualLeftTop.x, ADMISSIBLE_ERROR_PX)\n        assertEquals(firstView.translationY.toDouble(), actualLeftTop.y, ADMISSIBLE_ERROR_PX)\n        assertEquals(firstView.width.toDouble(), actualWidth, ADMISSIBLE_ERROR_PX)\n        assertEquals(firstView.height.toDouble(), actualHeight, ADMISSIBLE_ERROR_PX)\n        // callback should be triggered once and contain correct visibility data\n        assert(visibilityCallbackTriggerCount == 1)\n        assertEquals(true, actualVisibility)\n      }\n    )\n  }\n\n  private fun prepareStyle(style: Style, visibility: Visibility) {\n    style.addSource(\n      geoJsonSource(\"source\") {\n        feature(Feature.fromGeometry(CAMERA_CENTER, null, ANNOTATED_FEATURE_ID))\n      }\n    )\n    style.addLayer(\n      symbolLayer(ANNOTATED_LAYER_ID, \"source\") {\n        textField(ANNOTATED_FEATURE_ID)\n        visibility(visibility)\n      }\n    )\n  }\n\n  private companion object {\n    const val VIEW_PLACEMENT_DELAY_MS = 3000L\n    const val TEST_RUN_MAX_TIME_MS = 10_000L\n    const val ADMISSIBLE_ERROR_PX = 3.0\n\n    const val ANNOTATED_FEATURE_ID = \"featureTestId\"\n    const val ANNOTATED_LAYER_ID = \"layerTestId\"\n    const val CAMERA_ZOOM = 10.0\n    val CAMERA_CENTER: Point = Point.fromLngLat(0.0, 0.0)\n    val SHIFTED_CENTER: Point =\n      Point.fromLngLat(CAMERA_CENTER.longitude() - 0.01, CAMERA_CENTER.latitude() - 0.01)\n\n    @JvmStatic\n    @Parameterized.Parameters\n    fun data() = listOf(\n      arrayOf(R.layout.view_annotation, ViewAnnotationUpdateMode.MAP_SYNCHRONIZED),\n      arrayOf(R.layout.view_annotation, ViewAnnotationUpdateMode.MAP_FIXED_DELAY),\n      arrayOf(R.layout.view_annotation_wrap_content, ViewAnnotationUpdateMode.MAP_SYNCHRONIZED),\n      arrayOf(R.layout.view_annotation_wrap_content, ViewAnnotationUpdateMode.MAP_FIXED_DELAY),\n    )\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/renderer/egl/EGLSupportTest.kt",
    "content": "package com.mapbox.maps.renderer.egl\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.EmptyActivity\nimport com.mapbox.maps.MapView\nimport org.hamcrest.Matchers.*\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertThat\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass EGLSupportTest {\n\n  @get:Rule\n  val rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  @UiThreadTest\n  @Test\n  fun testEglContext() {\n    EGLCore(false, MapView.DEFAULT_ANTIALIASING_SAMPLE_COUNT, mapName = \"\").let { eglCore ->\n      val eglConfigOk = eglCore.prepareEgl()\n      val eglVersion = eglCore.queryContextVersion()\n\n      eglCore.release()\n\n      assertEquals(true, eglConfigOk)\n      assertThat(eglVersion, isOneOf(3, 2))\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/java/com/mapbox/maps/renderer/egl/RendererSetupTest.kt",
    "content": "package com.mapbox.maps.renderer.egl\n\nimport android.app.Activity\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.core.os.postDelayed\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.EmptyActivity\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.renderer.RendererError\nimport org.junit.*\nimport org.junit.Assert.assertArrayEquals\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CopyOnWriteArrayList\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass RendererSetupTest {\n\n  private lateinit var countDownLatch: CountDownLatch\n  private var cancelable: Cancelable? = null\n  private val eventList = CopyOnWriteArrayList<Event>()\n  private val mainHandler = Handler(Looper.getMainLooper())\n\n  @get:Rule\n  val rule = ActivityScenarioRule(EmptyActivity::class.java)\n\n  enum class Event {\n    MAP_LOAD_SUCCESS,\n    RENDERER_ERROR,\n  }\n\n  @Test\n  fun regularCreateMapTest() {\n    countDownLatch = CountDownLatch(2)\n    rule.scenario.onActivity {\n      val validMapView = createMapView(it, valid = true)\n      setupMapView(it, validMapView, withDelayMs = 0L)\n    }\n    countDownLatch.await(DEFAULT_LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS)\n    assertArrayEquals(\n      arrayOf(Event.MAP_LOAD_SUCCESS),\n      eventList.toArray()\n    )\n  }\n\n  @Test\n  fun recreateMapImmediateOnErrorTest() {\n    countDownLatch = CountDownLatch(3)\n    rule.scenario.onActivity {\n      val invalidMapView = createMapView(it, valid = false)\n      val delayMs = 0L\n      setupMapView(it, invalidMapView, withDelayMs = delayMs)\n      mainHandler.postDelayed(delayMs) {\n        val validMapView = createMapView(it, valid = true)\n        setupMapView(it, validMapView, withDelayMs = 0)\n      }\n    }\n    countDownLatch.await(DEFAULT_LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS)\n    // noting that number of RENDERER_ERROR is undermined as renderer automatically tries re-creating EGL\n    // so we're using distinct function to make sure we eventually re-created the MapView as expected\n    assertArrayEquals(\n      arrayOf(Event.RENDERER_ERROR, Event.MAP_LOAD_SUCCESS),\n      eventList.distinct().toTypedArray()\n    )\n  }\n\n  @Test\n  fun severalErrorListenersTest() {\n    countDownLatch = CountDownLatch(2)\n    rule.scenario.onActivity { activity ->\n      val invalidMapView = createMapView(activity, valid = false)\n      invalidMapView.addRendererSetupErrorListener {\n        when (it) {\n          RendererError.NO_VALID_EGL_CONFIG_FOUND -> {\n            eventList.add(Event.RENDERER_ERROR)\n            countDownLatch.countDown()\n          }\n          RendererError.OUT_OF_MEMORY -> { /** no-op **/ }\n          else -> { /** no-op **/ }\n        }\n      }\n      invalidMapView.addRendererSetupErrorListener {\n        when (it) {\n          RendererError.NO_VALID_EGL_CONFIG_FOUND -> {\n            eventList.add(Event.RENDERER_ERROR)\n            countDownLatch.countDown()\n          }\n          RendererError.OUT_OF_MEMORY -> { /** no-op **/ }\n          else -> { /** no-op **/ }\n        }\n      }\n    }\n    countDownLatch.await(DEFAULT_LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS)\n    assertArrayEquals(\n      arrayOf(Event.RENDERER_ERROR, Event.RENDERER_ERROR),\n      eventList.toArray()\n    )\n  }\n\n  @Test\n  fun recreateMapWithDelayOnErrorTest() {\n    countDownLatch = CountDownLatch(3)\n    rule.scenario.onActivity {\n      val invalidMapView = createMapView(it, valid = false)\n      val delayMs = 500L\n      setupMapView(it, invalidMapView, withDelayMs = delayMs)\n      mainHandler.postDelayed(delayMs) {\n        val validMapView = createMapView(it, valid = true)\n        setupMapView(it, validMapView, withDelayMs = 0)\n      }\n    }\n    countDownLatch.await(DEFAULT_LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS)\n    // noting that number of RENDERER_ERROR is undermined as renderer automatically tries re-creating EGL\n    // so we're using distinct function to make sure we eventually re-created the MapView as expected\n    assertArrayEquals(\n      arrayOf(Event.RENDERER_ERROR, Event.MAP_LOAD_SUCCESS),\n      eventList.distinct().toTypedArray()\n    )\n  }\n\n  private fun createMapView(activity: EmptyActivity, valid: Boolean): MapView {\n    if (valid) {\n      EGLConfigChooser.STENCIL_SIZE = VALID_STENCIL_SIZE\n    } else {\n      EGLConfigChooser.STENCIL_SIZE = INVALID_STENCIL_SIZE\n    }\n    val mapView = MapView(activity)\n    activity.frameLayout.addView(mapView)\n    mapView.mapboxMap.loadStyle(\"{}\")\n    return mapView\n  }\n\n  private fun setupMapView(\n    activity: Activity,\n    mapView: MapView,\n    withDelayMs: Long,\n  ) {\n    mapView.onStart()\n    cancelable?.cancel()\n    cancelable = mapView.mapboxMap.subscribeMapLoaded {\n      eventList.add(Event.MAP_LOAD_SUCCESS)\n      mapView.onStop()\n      mapView.onDestroy()\n      countDownLatch.countDown()\n    }\n    mainHandler.postDelayed(withDelayMs) {\n      mapView.addRendererSetupErrorListener {\n        when (it) {\n          RendererError.NO_VALID_EGL_CONFIG_FOUND -> {\n            eventList.add(Event.RENDERER_ERROR)\n            mapView.onStop()\n            mapView.onDestroy()\n            (activity as EmptyActivity).frameLayout.removeView(mapView)\n          }\n          RendererError.OUT_OF_MEMORY -> { /** no-op **/ }\n          else -> { /** no-op **/ }\n        }\n      }\n      countDownLatch.countDown()\n    }\n  }\n\n  @UiThreadTest\n  @After\n  fun cleanUp() {\n    cancelable?.cancel()\n    cancelable = null\n    eventList.clear()\n    EGLConfigChooser.STENCIL_SIZE = VALID_STENCIL_SIZE\n    mainHandler.removeCallbacksAndMessages(null)\n  }\n\n  private companion object {\n    const val DEFAULT_LATCH_TIMEOUT_MS = 10_000L\n    const val INVALID_STENCIL_SIZE = 23423\n    const val VALID_STENCIL_SIZE = 8\n  }\n}"
  },
  {
    "path": "maps-sdk/src/androidTest/res/layout/view_annotation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"100dp\"\n    android:layout_height=\"60dp\"\n    android:background=\"@android:color/black\">\n\n    <TextView\n        android:id=\"@+id/textNativeView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"10sp\"\n        android:padding=\"3dp\"\n        android:gravity=\"start|center_vertical\"\n        tools:ignore=\"SmallSp\" />\n\n</FrameLayout>"
  },
  {
    "path": "maps-sdk/src/androidTest/res/layout/view_annotation_wrap_content.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@android:color/black\">\n\n    <TextView\n        android:id=\"@+id/textNativeView\"\n        android:layout_width=\"100dp\"\n        android:layout_height=\"60dp\"\n        android:textSize=\"10sp\"\n        android:padding=\"3dp\"\n        android:gravity=\"start|center_vertical\"\n        tools:ignore=\"SmallSp\" />\n\n</FrameLayout>"
  },
  {
    "path": "maps-sdk/src/androidTest/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"test_app_name\">SDK instrumentation app</string>\n</resources>"
  },
  {
    "path": "maps-sdk/src/main/assets/sdk_versions/com.mapbox.maps",
    "content": "maps-sdk/11.23.0-SNAPSHOT-04-09--02-04.git-8a87ed7\n"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/CameraAttributeParser.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.res.TypedArray\nimport android.util.AttributeSet\nimport com.mapbox.geojson.Point.fromLngLat\n\n/**\n * Utility class for parsing [AttributeSet] to [CameraOptions].\n */\ninternal object CameraAttributeParser {\n\n  private var cameraOptionsBuilder: CameraOptions.Builder? = null\n\n  /**\n   * Parse [AttributeSet] to [CameraOptions].\n   *\n   * @param context Context\n   * @param attrs AttributionSet\n   */\n  fun parseCameraOptions(\n    attrs: TypedArray,\n    @Suppress(\"UNUSED_PARAMETER\")\n    pixelRatio: Float = 1.0f\n  ): CameraOptions? {\n    with(attrs) {\n      cameraOptionsBuilder = null\n      val zoom = R.styleable.mapbox_MapView_mapbox_cameraZoom.getCameraFloatAttribute(this)\n      if (zoom != 0.0) {\n        cameraOptionsBuilder?.zoom(zoom)\n      }\n      val centerLng = R.styleable.mapbox_MapView_mapbox_cameraTargetLng.getCameraFloatAttribute(\n        this\n      )\n      val centerLat = R.styleable.mapbox_MapView_mapbox_cameraTargetLat.getCameraFloatAttribute(\n        this\n      )\n      if (centerLat != 0.0 || centerLng != 0.0) {\n        cameraOptionsBuilder?.center(fromLngLat(centerLng, centerLat))\n      }\n      val bearing = R.styleable.mapbox_MapView_mapbox_cameraBearing.getCameraFloatAttribute(this)\n      if (bearing != 0.0) {\n        cameraOptionsBuilder?.bearing(bearing)\n      }\n      val pitch = R.styleable.mapbox_MapView_mapbox_cameraPitch.getCameraFloatAttribute(this)\n      if (pitch != 0.0) {\n        cameraOptionsBuilder?.pitch(pitch)\n      }\n      val anchorX = R.styleable.mapbox_MapView_mapbox_cameraAnchorX.getCameraFloatAttribute(this)\n      val anchorY = R.styleable.mapbox_MapView_mapbox_cameraAnchorY.getCameraFloatAttribute(this)\n      if (anchorX != 0.0 || anchorY != 0.0) {\n        cameraOptionsBuilder?.anchor(ScreenCoordinate(anchorX, anchorY))\n      }\n      val paddingTop = R.styleable.mapbox_MapView_mapbox_cameraPaddingTop.getCameraFloatAttribute(\n        this\n      )\n      val paddingLeft = R.styleable.mapbox_MapView_mapbox_cameraPaddingLeft.getCameraFloatAttribute(\n        this\n      )\n      val paddingBottom =\n        R.styleable.mapbox_MapView_mapbox_cameraPaddingBottom.getCameraFloatAttribute(\n          this\n        )\n      val paddingRight = R.styleable.mapbox_MapView_mapbox_cameraPaddingRight.getCameraFloatAttribute(\n        this\n      )\n      if (paddingTop != 0.0 || paddingLeft != 0.0 || paddingBottom != 0.0 || paddingRight != 0.0) {\n        cameraOptionsBuilder?.padding(\n          EdgeInsets(\n            paddingTop,\n            paddingLeft,\n            paddingBottom,\n            paddingRight\n          )\n        )\n      }\n      return cameraOptionsBuilder?.build()\n    }\n  }\n\n  private fun Int.getCameraFloatAttribute(typedArray: TypedArray): Double {\n    val value = typedArray.getFloat(this, 0f).toDouble()\n    if (cameraOptionsBuilder == null && value != 0.0) {\n      cameraOptionsBuilder = CameraOptions.Builder()\n    }\n    return value\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/DelegatingMapClient.kt",
    "content": "package com.mapbox.maps\n\ninternal interface DelegatingMapClient : MapClient"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/DelegatingViewAnnotation.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.geojson.Point\n\ninternal abstract class DelegatingViewAnnotationPositionsUpdateListener : ViewAnnotationPositionsUpdateListener {\n\n  final override fun onViewAnnotationPositionsUpdate(positions: MutableList<ViewAnnotationPositionDescriptor>) {\n    onDelegatingViewAnnotationPositionsUpdate(\n      positions.map {\n        DelegatingViewAnnotationPositionDescriptor(\n          identifier = it.identifier,\n          width = it.width,\n          height = it.height,\n          leftTopCoordinate = it.leftTopCoordinate,\n          anchorCoordinate = it.anchorCoordinate,\n          anchorConfig = it.anchorConfig,\n        )\n      }\n    )\n  }\n\n  abstract fun onDelegatingViewAnnotationPositionsUpdate(positions: List<DelegatingViewAnnotationPositionDescriptor>)\n}\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class DelegatingViewAnnotationPositionDescriptor(\n  identifier: String,\n  width: Double,\n  height: Double,\n  leftTopCoordinate: ScreenCoordinate,\n  anchorCoordinate: Point,\n  anchorConfig: ViewAnnotationAnchorConfig,\n) : ViewAnnotationPositionDescriptor(\n  /* identifier = */ identifier,\n  /* width = */ width,\n  /* height = */ height,\n  /* leftTopCoordinate = */ leftTopCoordinate,\n  /* anchorCoordinate = */ anchorCoordinate,\n  /* anchorConfig = */ anchorConfig\n)"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/FontUtils.kt",
    "content": "package com.mapbox.maps\n\nimport android.annotation.SuppressLint\nimport android.graphics.Typeface\nimport android.os.Build\nimport android.util.Log\nimport androidx.annotation.RequiresApi\nimport java.lang.reflect.Field\nimport kotlin.collections.Map\n\n/**\n * Utility class to select a font from a range of font names based on the availability of fonts on the device.\n */\ninternal object FontUtils {\n\n  private const val DEFAULT_FONT = \"sans-serif\"\n  private const val TAG = \"Mbgl-FontUtils\"\n  private const val TYPEFACE_FONTMAP_FIELD_NAME = \"sSystemFontMap\"\n  private val DEFAULT_FONT_STACKS: List<String> = listOf(\n    \"sans-serif\", \"serif\", \"monospace\"\n  )\n\n  /**\n   * Select a font from a range of font names to match the availability of fonts on the device.\n   *\n   * @param font font name to select\n   * @return the selected font\n   */\n  fun extractValidFont(font: String?): String {\n    var validFonts: List<String>? = deviceFonts\n    if (validFonts == null || validFonts.isEmpty()) {\n      validFonts = DEFAULT_FONT_STACKS\n    }\n    font?.let {\n      if (validFonts.contains(it)) {\n        return font\n      }\n    }\n    Log.i(\n      TAG, \"Couldn't map font family for local ideograph, using $DEFAULT_FONT instead\"\n    )\n    return DEFAULT_FONT\n  }\n\n  @get:RequiresApi(Build.VERSION_CODES.LOLLIPOP)\n  private val deviceFonts: List<String>\n    @SuppressLint(\"DiscouragedPrivateApi\")\n    get() {\n      val fonts: MutableList<String> = ArrayList()\n      try {\n        val typeface = Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)\n        val fontField: Field = Typeface::class.java.getDeclaredField(TYPEFACE_FONTMAP_FIELD_NAME)\n        fontField.isAccessible = true\n        @Suppress(\"UNCHECKED_CAST\")\n        val fontMap: Map<String, Typeface> = fontField.get(typeface) as Map<String, Typeface>\n        fonts.addAll(fontMap.keys)\n      } catch (exception: Exception) {\n        Log.e(TAG, \"Couldn't load fonts from Typeface: $exception\")\n      }\n      return fonts\n    }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapAttributeParser.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.res.TypedArray\nimport android.util.AttributeSet\nimport java.util.*\n\n/**\n * Utility class for parsing [AttributeSet] to [MapSettings].\n */\ninternal object MapAttributeParser {\n\n  private const val CONSTRAIN_MODE_HEIGHT_ONLY = 1\n  private const val NO_GLYPHS_RASTERIZED_LOCALLY = 0\n  private const val IDEOGRAPHS_RASTERIZED_LOCALLY = 1\n\n  /**\n   * Parse [AttributeSet] to [MapSettings].\n   *\n   * @param context Context\n   * @param attrs AttributionSet\n   */\n  fun parseMapOptions(\n    attrs: TypedArray,\n    pixelRatio: Float = 1.0f\n  ): MapOptions {\n    val contextMode = attrs.getInt(R.styleable.mapbox_MapView_mapbox_mapContextMode, 0)\n    val constrain = attrs.getInt(R.styleable.mapbox_MapView_mapbox_mapConstrainMode, CONSTRAIN_MODE_HEIGHT_ONLY)\n    val orientation = attrs.getInt(R.styleable.mapbox_MapView_mapbox_mapOrientation, 0)\n    val glyphsMode = attrs.getInt(R.styleable.mapbox_MapView_mapbox_mapGlyphRasterizationMode, IDEOGRAPHS_RASTERIZED_LOCALLY)\n    var fontFamily: String? = null\n    if (glyphsMode != NO_GLYPHS_RASTERIZED_LOCALLY) {\n      fontFamily = FontUtils.extractValidFont(attrs.getString(R.styleable.mapbox_MapView_mapbox_mapFontFamily))\n    }\n    val viewportMode = attrs.getInt(R.styleable.mapbox_MapView_mapbox_mapViewportMode, 0)\n    return MapOptions.Builder()\n      .contextMode(ContextMode.values()[contextMode])\n      .constrainMode(ConstrainMode.values()[constrain])\n      .viewportMode(ViewportMode.values()[viewportMode])\n      .orientation(NorthOrientation.values()[orientation])\n      .crossSourceCollisions(\n        attrs.getBoolean(\n          R.styleable.mapbox_MapView_mapbox_mapCrossSourceCollisionsEnabled,\n          true\n        )\n      )\n      .pixelRatio(attrs.getFloat(R.styleable.mapbox_MapView_mapbox_mapPixelRatio, pixelRatio))\n      .glyphsRasterizationOptions(\n        GlyphsRasterizationOptions.Builder()\n          .rasterizationMode(\n            GlyphsRasterizationMode.values()[glyphsMode]\n          )\n          .fontFamily(fontFamily)\n          .build()\n      )\n      .build()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapControllable.kt",
    "content": "package com.mapbox.maps\n\nimport android.graphics.Bitmap\nimport android.view.MotionEvent\nimport com.mapbox.maps.renderer.OnFpsChangedListener\nimport com.mapbox.maps.renderer.RenderThreadStatsRecorder\nimport com.mapbox.maps.renderer.RendererSetupErrorListener\nimport com.mapbox.maps.renderer.widget.Widget\n\n/**\n * MapControllable interface is the gateway for public API to talk to the internal map controller.\n */\ninterface MapControllable : MapboxLifecycleObserver {\n\n  /**\n   * A [MapboxMap] object that can be used to interact with the map.\n   */\n  val mapboxMap: MapboxMap\n\n  /**\n   * Called when a touch event has occurred.\n   *\n   * @param event the motion event that has occurred\n   * @return True if event was handled, false otherwise\n   */\n  fun onTouchEvent(event: MotionEvent): Boolean\n\n  /**\n   * Called when a motion event has occurred.\n   *\n   * @param event the motion event that has occurred\n   * @return True if event was handled, false otherwise\n   */\n  fun onGenericMotionEvent(event: MotionEvent): Boolean\n\n  /**\n   * Called when the size has changed.\n   *\n   * @param w width of the viewport\n   * @param h height of the viewport\n   */\n  fun onSizeChanged(w: Int, h: Int)\n\n  /**\n   * Queue a runnable to be executed on the map renderer thread.\n   *\n   * @param event the runnable to queue\n   * @param needRender if we should force redraw after running event (e.g. execute some GL commands)\n   */\n  fun queueEvent(event: Runnable, needRender: Boolean = true)\n\n  /**\n   * Called to capture a snapshot synchronously.\n   *\n   * @return the snapshot\n   */\n  fun snapshot(): Bitmap?\n\n  /**\n   * Called to capture a snapshot asynchronously.\n   *\n   * @param listener The listener to be invoked when snapshot finishes\n   */\n  fun snapshot(listener: MapView.OnSnapshotReady)\n\n  /**\n   * Called to limit the maximum fps\n   *\n   * @param fps The maximum fps\n   */\n  fun setMaximumFps(fps: Int)\n\n  /**\n   * Set [OnFpsChangedListener] to get map rendering FPS.\n   */\n  fun setOnFpsChangedListener(listener: OnFpsChangedListener)\n\n  /**\n   * Set [RenderThreadStatsRecorder] to record frame stats.\n   */\n  @MapboxExperimental\n  fun setRenderThreadStatsRecorder(renderThreadStatsRecorder: RenderThreadStatsRecorder)\n\n  /**\n   * Add [Widget] to the map.\n   *\n   * @throws RuntimeException when trying to add the Widget to the [MapControllable] that does not\n   * have [MapOptions.contextMode] = [ContextMode.SHARED] as part of [MapInitOptions].\n   */\n  @MapboxExperimental\n  fun addWidget(widget: Widget)\n\n  /**\n   * Remove [Widget] from the map.\n   *\n   * @return true if widget was present and removed, false otherwise\n   */\n  @MapboxExperimental\n  fun removeWidget(widget: Widget): Boolean\n\n  /**\n   * Add an instance of [RendererSetupErrorListener].\n   *\n   * Please note that errors could be already reported from the renderer during [MapView] creation\n   * before this method will be called - all accumulated renderer errors will be delivered.\n   */\n  fun addRendererSetupErrorListener(rendererSetupErrorListener: RendererSetupErrorListener)\n\n  /**\n   * Remove an instance of [RendererSetupErrorListener].\n   */\n  fun removeRendererSetupErrorListener(rendererSetupErrorListener: RendererSetupErrorListener)\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapController.kt",
    "content": "package com.mapbox.maps\n\nimport android.view.MotionEvent\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.common.Cancelable\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.maps.plugin.InvalidViewPluginHostException\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.MapPluginRegistry\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_ANNOTATION_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_ATTRIBUTION_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_CAMERA_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_COMPASS_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_GESTURES_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_INDOOR_SELECTOR_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_LIFECYCLE_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_LOCATION_COMPONENT_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_LOGO_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_MAP_OVERLAY_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_SCALEBAR_PLUGIN_ID\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_VIEWPORT_PLUGIN_ID\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.createCameraAnimationPlugin\nimport com.mapbox.maps.plugin.annotation.createAnnotationPlugin\nimport com.mapbox.maps.plugin.attribution.createAttributionPlugin\nimport com.mapbox.maps.plugin.compass.createCompassPlugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport com.mapbox.maps.plugin.gestures.createGesturePlugin\nimport com.mapbox.maps.plugin.indoorselector.createIndoorSelectorPlugin\nimport com.mapbox.maps.plugin.lifecycle.createLifecyclePlugin\nimport com.mapbox.maps.plugin.locationcomponent.createLocationComponentPlugin\nimport com.mapbox.maps.plugin.logo.createLogoPlugin\nimport com.mapbox.maps.plugin.overlay.createOverlayPlugin\nimport com.mapbox.maps.plugin.scalebar.createScaleBarPlugin\nimport com.mapbox.maps.plugin.viewport.createViewportPlugin\nimport com.mapbox.maps.renderer.MapboxRenderer\nimport com.mapbox.maps.renderer.OnFpsChangedListener\nimport com.mapbox.maps.renderer.RenderThreadStatsRecorder\nimport com.mapbox.maps.renderer.RendererSetupErrorListener\nimport com.mapbox.maps.renderer.widget.Widget\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.plus\nimport java.util.concurrent.CopyOnWriteArraySet\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapController : MapPluginProviderDelegate, MapControllable {\n\n  internal val renderer: MapboxRenderer\n  private val nativeObserver: NativeObserver\n  private val mapInitOptions: MapInitOptions\n  private val nativeMap: NativeMapImpl\n  private val _mapboxMap: MapboxMap\n  private val pluginRegistry: MapPluginRegistry\n  private val styleDataLoadedCallback: StyleDataLoadedCallback\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  private val cameraChangedCoalescedCallback: CameraChangedCoalescedCallback\n  private val cancelableSubscriberSet = CopyOnWriteArraySet<Cancelable>()\n\n  /**\n   * Lifecycle-aware coroutine scope that follows the MapView/MapSurface lifecycle.\n   * This scope is created when the MapController is constructed and cancelled when destroyed.\n   * Can be used for any background operations that should be tied to the map lifecycle.\n   */\n  internal val lifecycleScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) + CoroutineName(\n    \"MapControllerLifecycleScope\"\n  )\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var lifecycleState: LifecycleState = LifecycleState.STATE_STOPPED\n  private var style: Style? = null\n\n  private var contextMode: ContextMode? = null\n\n  override val mapboxMap: MapboxMap\n    get() = _mapboxMap\n\n  @OptIn(MapboxExperimental::class, com.mapbox.annotation.MapboxExperimental::class)\n  constructor(\n    renderer: MapboxRenderer,\n    mapInitOptions: MapInitOptions,\n  ) {\n    if (MapboxOptions.accessToken.isBlank()) {\n      throw MapboxConfigurationException()\n    }\n\n    this.renderer = renderer\n    this.mapInitOptions = mapInitOptions\n    this.contextMode = mapInitOptions.mapOptions.contextMode\n    this.nativeMap = MapProvider.getNativeMapWrapper(\n      mapInitOptions,\n      renderer,\n    )\n    this.nativeObserver = NativeObserver(nativeMap)\n    this._mapboxMap =\n      MapProvider.getMapboxMap(nativeMap, nativeObserver, mapInitOptions.mapOptions.pixelRatio)\n    this.mapboxMap.renderHandler = renderer.renderThread.renderHandlerThread.handler\n    this.pluginRegistry = MapProvider.getMapPluginRegistry(\n      mapboxMap,\n      this,\n      MapProvider.getMapTelemetryInstance(\n        mapInitOptions.context\n      ),\n      MapProvider.getMapGeofencingConsent(),\n    )\n    this.cameraChangedCoalescedCallback = CameraChangedCoalescedCallback {\n      pluginRegistry.onCameraMove(it.cameraState)\n    }\n    this.styleDataLoadedCallback = StyleDataLoadedCallback { eventData ->\n      if (eventData.type == StyleDataLoadedType.STYLE) {\n        mapboxMap.getStyle { style ->\n          this.style = style\n          pluginRegistry.onStyleChanged(style)\n        }\n      }\n    }\n    renderer.setMap(nativeMap)\n    this.mapInitOptions.cameraOptions?.let {\n      mapboxMap.setCamera(it)\n    }\n\n    _mapboxMap.initializeAccessibility(mapInitOptions.context)\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @VisibleForTesting(otherwise = VisibleForTesting.NONE)\n  constructor(\n    renderer: MapboxRenderer,\n    nativeObserver: NativeObserver,\n    mapInitOptions: MapInitOptions,\n    contextMode: ContextMode?,\n    nativeMap: NativeMapImpl,\n    mapboxMap: MapboxMap,\n    pluginRegistry: MapPluginRegistry,\n    onStyleLoadingFinishedListener: StyleDataLoadedCallback\n  ) {\n    this.renderer = renderer\n    this.nativeObserver = nativeObserver\n    this.mapInitOptions = mapInitOptions\n    this.contextMode = contextMode\n    this.nativeMap = nativeMap\n    this._mapboxMap = mapboxMap\n    this.pluginRegistry = pluginRegistry\n    this.cameraChangedCoalescedCallback = CameraChangedCoalescedCallback {\n      pluginRegistry.onCameraMove(it.cameraState)\n    }\n    this.styleDataLoadedCallback = onStyleLoadingFinishedListener\n  }\n\n  fun getNativeMap(): NativeMapImpl {\n    return nativeMap\n  }\n\n  /**\n   * Returns a [MapboxMap] object that can be used to interact with the map.\n   *\n   * @return [MapboxMap] object to interact with the map.\n   */\n  @Deprecated(\n    \"This method is deprecated, and will be removed in next major release. Use [mapboxMap] property instead.\",\n    replaceWith = ReplaceWith(\"mapboxMap\")\n  )\n  // Hide it from Java. They will use [mapboxMap] property getter above. Moreover, mangle the name\n  // in Java to avoid \"platform declaration clash\".\n  @JvmSynthetic @JvmName(\"getMapboxMapDeprecated\")\n  fun getMapboxMap(): MapboxMap = mapboxMap\n\n  override fun onStart() {\n\n    if (lifecycleState == LifecycleState.STATE_STARTED) {\n      return\n    }\n    lifecycleState = LifecycleState.STATE_STARTED\n\n    mapboxMap.style?.let {\n      if (it != style) {\n        style = it\n        pluginRegistry.onStyleChanged(it)\n      }\n    }\n    nativeObserver.apply {\n      cancelableSubscriberSet.add(subscribeCameraChangedCoalesced(cameraChangedCoalescedCallback))\n      cancelableSubscriberSet.add(subscribeStyleDataLoaded(styleDataLoadedCallback))\n    }\n    renderer.onStart()\n    if (!mapboxMap.isStyleLoadInitiated) {\n      // Load the style in mapInitOptions if no style has loaded yet.\n      mapInitOptions.styleUri?.let {\n        mapboxMap.loadStyle(it)\n      }\n    }\n    pluginRegistry.onStart()\n  }\n\n  override fun onStop() {\n    if (lifecycleState == LifecycleState.STATE_STOPPED) {\n      return\n    }\n    lifecycleState = LifecycleState.STATE_STOPPED\n\n    cancelableSubscriberSet.forEach {\n      it.cancel()\n    }\n    cancelableSubscriberSet.clear()\n    renderer.onStop()\n    pluginRegistry.onStop()\n    // flush the queued events before destroy to avoid lost telemetry events\n    MapProvider.flushPendingEvents()\n  }\n\n  override fun onResume() {\n    renderer.onResume()\n  }\n\n  override fun onDestroy() {\n    if (lifecycleState == LifecycleState.STATE_DESTROYED) {\n      return\n    }\n    lifecycleState = LifecycleState.STATE_DESTROYED\n\n    // Cancel the lifecycle coroutine scope to prevent memory leaks\n    lifecycleScope.cancel()\n\n    pluginRegistry.onDestroy()\n    nativeObserver.onDestroy()\n    renderer.onDestroy()\n    mapboxMap.onDestroy()\n    this.style = null\n  }\n\n  override fun onLowMemory() {\n    mapboxMap.reduceMemoryUse()\n  }\n\n  override fun onTouchEvent(event: MotionEvent): Boolean {\n    return pluginRegistry.onTouch(event)\n  }\n\n  override fun onGenericMotionEvent(event: MotionEvent): Boolean {\n    return pluginRegistry.onGenericMotionEvent(event)\n  }\n\n  override fun onSizeChanged(w: Int, h: Int) {\n    // we could not reliably check here if new dimensions differ from\n    // current ones due to different threads so we always set flag to false\n    // and set it to true below\n    nativeMap.sizeSet = false\n    renderer.queueRenderEvent {\n      renderer.onSurfaceChanged(w, h)\n      // Map.setSize might not be called if dimensions are the same\n      // so we need to make sure we set `sizeSet = true` explicitly\n      nativeMap.sizeSet = true\n    }\n    pluginRegistry.onSizeChanged(w, h)\n  }\n\n  override fun queueEvent(event: Runnable, needRender: Boolean) {\n    if (needRender) {\n      renderer.queueRenderEvent(event)\n    } else {\n      renderer.queueNonRenderEvent(event)\n    }\n  }\n\n  override fun snapshot() = renderer.snapshot()\n\n  override fun snapshot(listener: MapView.OnSnapshotReady) {\n    renderer.snapshot(listener)\n  }\n\n  override fun setMaximumFps(fps: Int) {\n    renderer.setMaximumFps(fps)\n  }\n\n  override fun setOnFpsChangedListener(listener: OnFpsChangedListener) {\n    renderer.setOnFpsChangedListener(listener)\n  }\n\n  override fun setRenderThreadStatsRecorder(renderThreadStatsRecorder: RenderThreadStatsRecorder) {\n    renderer.renderThread.renderThreadStatsRecorder = renderThreadStatsRecorder\n  }\n\n  @OptIn(MapboxExperimental::class)\n  override fun addWidget(widget: Widget) {\n    if (contextMode != ContextMode.SHARED) {\n      throw RuntimeException(\"Map view or map surface must be init with MapInitOptions.mapOptions.contextMode = ContextMode.SHARED when using widgets!\")\n    }\n    widget.setTriggerRepaintAction {\n      renderer.scheduleRepaint()\n    }\n    renderer.renderThread.addWidget(widget)\n    renderer.scheduleRepaint()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  override fun removeWidget(widget: Widget): Boolean {\n    val wasRemoved = renderer.renderThread.removeWidget(widget)\n    if (wasRemoved) {\n      renderer.scheduleRepaint()\n    }\n    return wasRemoved\n  }\n\n  override fun addRendererSetupErrorListener(rendererSetupErrorListener: RendererSetupErrorListener) {\n    renderer.renderThread.renderHandlerThread.post {\n      renderer.renderThread.addRendererStateListener(rendererSetupErrorListener)\n    }\n  }\n\n  override fun removeRendererSetupErrorListener(rendererSetupErrorListener: RendererSetupErrorListener) {\n    renderer.renderThread.renderHandlerThread.post {\n      renderer.renderThread.removeRendererStateListener(rendererSetupErrorListener)\n    }\n  }\n\n  internal fun setScreenRefreshRate(refreshRate: Int) {\n    if (refreshRate <= 0) {\n      logW(TAG, \"Invalid refresh rate $refreshRate. It must be positive!\")\n      return\n    }\n    renderer.renderThread.setScreenRefreshRate(refreshRate)\n  }\n\n  //\n  // Plugin API\n  //\n\n  override fun <T : MapPlugin> getPlugin(id: String): T? = pluginRegistry.getPlugin(id)\n\n  fun createPlugin(\n    mapView: MapView?,\n    plugin: Plugin\n  ) = pluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n\n  fun removePlugin(id: String) = pluginRegistry.removePlugin(id)\n\n  fun initializePlugins(\n    options: MapInitOptions,\n    mapView: MapView? = null,\n  ) {\n    for (plugin in options.plugins) {\n      try {\n        val pluginObject = when (plugin.id) {\n          MAPBOX_GESTURES_PLUGIN_ID -> {\n            createGesturePlugin(options.context, options.attrs, options.mapOptions.pixelRatio)\n          }\n          MAPBOX_CAMERA_PLUGIN_ID -> {\n            createCameraAnimationPlugin()\n          }\n          MAPBOX_ANNOTATION_PLUGIN_ID -> {\n            createAnnotationPlugin()\n          }\n          MAPBOX_COMPASS_PLUGIN_ID -> {\n            createCompassPlugin()\n          }\n          MAPBOX_ATTRIBUTION_PLUGIN_ID -> {\n            createAttributionPlugin()\n          }\n          MAPBOX_LIFECYCLE_PLUGIN_ID -> {\n            createLifecyclePlugin()\n          }\n          MAPBOX_LOCATION_COMPONENT_PLUGIN_ID -> {\n            createLocationComponentPlugin()\n          }\n          MAPBOX_LOGO_PLUGIN_ID -> {\n            createLogoPlugin()\n          }\n          MAPBOX_MAP_OVERLAY_PLUGIN_ID -> {\n            createOverlayPlugin()\n          }\n          MAPBOX_SCALEBAR_PLUGIN_ID -> {\n            createScaleBarPlugin()\n          }\n          MAPBOX_VIEWPORT_PLUGIN_ID -> {\n            createViewportPlugin()\n          }\n          MAPBOX_INDOOR_SELECTOR_PLUGIN_ID -> {\n            createIndoorSelectorPlugin()\n          }\n          else -> {\n            plugin.instance\n              ?: throw MapboxConfigurationException(\"Custom non Mapbox plugins must have non-null `instance` parameter!\")\n          }\n        }\n        createPlugin(mapView, Plugin.Custom(plugin.id, pluginObject))\n        if (plugin is Plugin.Mapbox) {\n          when (pluginObject) {\n            is CameraAnimationsPlugin -> mapboxMap.cameraAnimationsPlugin = pluginObject\n            is GesturesPlugin -> mapboxMap.gesturesPlugin = pluginObject\n          }\n        }\n      } catch (ex: NoClassDefFoundError) {\n        logI(TAG, PLUGIN_MISSING_TEMPLATE.format(plugin.id))\n      } catch (ex: InvalidViewPluginHostException) {\n        logI(TAG, VIEW_HIERARCHY_MISSING_TEMPLATE.format(plugin))\n      }\n    }\n  }\n\n  internal fun onAttachedToWindow(mapView: MapView) {\n    pluginRegistry.onAttachedToWindow(mapView)\n  }\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal enum class LifecycleState {\n    STATE_STOPPED,\n    STATE_STARTED,\n    STATE_DESTROYED\n  }\n\n  companion object {\n    const val TAG = \"MapController\"\n    private const val PLUGIN_MISSING_TEMPLATE =\n      \"Add %s plugin dependency to the classpath take automatically load the plugin implementation.\"\n    private const val VIEW_HIERARCHY_MISSING_TEMPLATE =\n      \"%s plugin requires a View hierarchy to be injected, plugin is ignored.\"\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapGeofencingConsentImpl.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.common.geofencing.GeofencingUtils\nimport com.mapbox.common.geofencing.GeofencingUtilsUserConsentResponseCallback\nimport com.mapbox.maps.geofencing.MapGeofencingConsent\n\n@OptIn(MapboxExperimental::class, com.mapbox.annotation.MapboxExperimental::class)\ninternal class MapGeofencingConsentImpl : MapGeofencingConsent {\n  override fun setUserConsent(\n    isConsentGiven: Boolean,\n    callback: GeofencingUtilsUserConsentResponseCallback\n  ) {\n    GeofencingUtils.setUserConsent(isConsentGiven, callback)\n  }\n\n  override fun getUserConsent(): Boolean = GeofencingUtils.getUserConsent()\n\n  override fun shouldShowConsent(): Boolean {\n    // We want to show the option to opt-out Geofencing if:\n    // 1. the user explicitly revoked the user consent\n    // 2. or if the geofencing engine is active\n    return !GeofencingUtils.getUserConsent() || GeofencingUtils.isActive()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapInitOptions.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport com.mapbox.maps.MapView.Companion.DEFAULT_ANTIALIASING_SAMPLE_COUNT\nimport com.mapbox.maps.plugin.*\n\n/**\n * Defines configuration [MapInitOptions] for a [MapboxMap]. These options can be used when adding a\n * map to your application programmatically (as opposed to via XML). If you are using a MapFragment,\n * you can pass these options in using the static factory method newInstance(MapboxMapOptions).\n * If you are using a [MapView], you can pass these options in using the constructor\n * MapView(Context, MapboxMapOptions). If you add a map using XML, then you can apply these options\n * using custom XML tags.\n *\n * @property context The context of the MapView.\n * @property mapOptions Describes the map options value when using a MapView.\n * @property plugins The plugins, a list of strings representing class names, that will be loaded as part of MapView initialisation,\n * @property cameraOptions The Initial Camera options when creating a MapView.\n * @property textureView Flag indicating to use a TextureView as render surface for the MapView. Default is false.\n * @property styleUri The styleUri will applied for the MapView in the onStart lifecycle event if no style is set. Default is [Style.STANDARD]. If set to null, then there is no default style will be loaded.\n * @property attrs The [AttributeSet] object that init the MapView.\n * @property antialiasingSampleCount Sample count to control multisample anti-aliasing (MSAA) option for rendering. E.g. passing 4 enables MSAA x4 if it is supported. Default is 1 (MSAA turned off).\n * @property mapName Custom name which will be appended to map render related logs. May be useful when using several [MapView]s. Defaults to an empty string.\n */\ndata class MapInitOptions @JvmOverloads constructor(\n  val context: Context,\n  var mapOptions: MapOptions = getDefaultMapOptions(context),\n  var plugins: List<Plugin> = defaultPluginList,\n  var cameraOptions: CameraOptions? = null,\n  var textureView: Boolean = false,\n  val styleUri: String? = Style.STANDARD,\n  var attrs: AttributeSet? = null,\n  var antialiasingSampleCount: Int = DEFAULT_ANTIALIASING_SAMPLE_COUNT,\n  var mapName: String = \"\",\n) {\n\n  /**\n   * Static methods\n   */\n  companion object {\n    /**\n     * Get a default [MapOptions] with reasterization mode [GlyphsRasterizationMode#ALL_GLYPHS_RASTERIZED_LOCALLY]\n     * @property context the context of the application.\n     */\n    fun getDefaultMapOptions(context: Context): MapOptions =\n      MapOptions.Builder().applyDefaultParams(context).build()\n\n    /**\n     * Default map view plugin registry. All Mapbox plugins are present in this list.\n     *\n     * If specific plugins are required to be added to [MapView] on startup\n     * consider creating [MapView] programmatically specifying [plugins].\n     *\n     * If creating [MapView] from xml - all plugins listed here will be applied to given [MapView] on startup.\n     */\n    val defaultPluginList: List<Plugin> = listOf(\n      Plugin.Mapbox(Plugin.MAPBOX_CAMERA_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_GESTURES_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_COMPASS_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_LOGO_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_ATTRIBUTION_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_LOCATION_COMPONENT_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_SCALEBAR_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_ANNOTATION_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_LIFECYCLE_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_MAP_OVERLAY_PLUGIN_ID),\n      Plugin.Mapbox(Plugin.MAPBOX_VIEWPORT_PLUGIN_ID),\n    )\n  }\n}\n\n/**\n * Get a default [MapOptions.Builder] with reasterization mode [GlyphsRasterizationMode#ALL_GLYPHS_RASTERIZED_LOCALLY]\n * @property context the context of the application.\n * @return [MapOptions.Builder]\n */\nfun MapOptions.Builder.applyDefaultParams(context: Context): MapOptions.Builder =\n  applyDefaultParams(context.resources.displayMetrics.density)\n\n/**\n * Get a default [MapOptions.Builder] with reasterization mode [GlyphsRasterizationMode#ALL_GLYPHS_RASTERIZED_LOCALLY]\n * @property context the context of the application.\n * @return [MapOptions.Builder]\n */\nfun MapOptions.Builder.applyDefaultParams(pixelRatio: Float): MapOptions.Builder = also {\n  glyphsRasterizationOptions(\n    GlyphsRasterizationOptions.Builder()\n      .rasterizationMode(GlyphsRasterizationMode.IDEOGRAPHS_RASTERIZED_LOCALLY)\n      .fontFamily(FontUtils.extractValidFont(null))\n      .build()\n  )\n  pixelRatio(pixelRatio)\n  constrainMode(ConstrainMode.HEIGHT_ONLY)\n  contextMode(ContextMode.UNIQUE)\n  orientation(NorthOrientation.UPWARDS)\n  viewportMode(ViewportMode.DEFAULT)\n  crossSourceCollisions(true)\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapProvider.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport com.mapbox.annotation.module.MapboxModuleType\nimport com.mapbox.common.EventsServerOptions\nimport com.mapbox.common.EventsService\nimport com.mapbox.common.SdkInformation\nimport com.mapbox.common.TelemetryService\nimport com.mapbox.common.module.provider.MapboxModuleProvider\nimport com.mapbox.common.module.provider.ModuleProviderArgument\nimport com.mapbox.maps.base.BuildConfig\nimport com.mapbox.maps.geofencing.MapGeofencingConsent\nimport com.mapbox.maps.module.MapTelemetry\nimport com.mapbox.maps.plugin.MapDelegateProviderImpl\nimport com.mapbox.maps.plugin.MapPluginRegistry\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.MainCoroutineDispatcher\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.launch\n\ninternal object MapProvider {\n\n  private lateinit var mapTelemetry: MapTelemetry\n\n  /**\n   * [CoroutineScope] that runs on Main dispatcher by default (NOTE that it is not using [MainCoroutineDispatcher.immediate]).\n   */\n  private val mainScope =\n    CoroutineScope(CoroutineName(MapController.TAG) + SupervisorJob() + Dispatchers.Main)\n\n  fun getNativeMapWrapper(\n    mapInitOptions: MapInitOptions,\n    mapClient: MapClient,\n  ) = NativeMapImpl(\n    Map(\n      mapClient,\n      mapInitOptions.mapOptions,\n    )\n  )\n\n  fun getNativeMapCore(mapView: MapView): Map {\n    return mapView.getController().getNativeMap().map\n  }\n\n  fun getMapboxMap(\n    nativeMap: NativeMapImpl,\n    nativeObserver: NativeObserver,\n    pixelRatio: Float\n  ) = MapboxMap(nativeMap, nativeObserver, pixelRatio)\n\n  @OptIn(MapboxExperimental::class)\n  fun getMapPluginRegistry(\n    mapboxMap: MapboxMap,\n    mapController: MapController,\n    telemetry: MapTelemetry,\n    mapGeofencingConsent: MapGeofencingConsent,\n  ) = MapPluginRegistry(MapDelegateProviderImpl(mapboxMap, mapController, telemetry, mapGeofencingConsent))\n\n  fun getMapTelemetryInstance(context: Context): MapTelemetry {\n    if (!::mapTelemetry.isInitialized) {\n      mapTelemetry = MapboxModuleProvider.createModule(MapboxModuleType.MapTelemetry) {\n        paramsProvider(context, MapboxModuleType.MapTelemetry)\n      }\n    }\n    // Schedule the turnstile event on the Main dispatcher to avoid blocking this call chain.\n    mainScope.launch {\n      mapTelemetry.onAppUserTurnstileEvent()\n    }\n    return mapTelemetry\n  }\n\n  @OptIn(MapboxExperimental::class)\n  fun getMapGeofencingConsent(): MapGeofencingConsent = MapGeofencingConsentImpl()\n\n  fun flushPendingEvents() {\n    val eventsServerOptions =\n      EventsServerOptions(\n        SdkInformation(\n          BuildConfig.MAPBOX_SDK_IDENTIFIER,\n          BuildConfig.MAPBOX_SDK_VERSION,\n          null\n        ),\n        null\n      )\n    EventsService.getOrCreate(eventsServerOptions).flush { expected ->\n      expected.error?.let { error ->\n        logW(MapController.TAG, \"EventsService flush error: $error\")\n      }\n    }\n    TelemetryService.getOrCreate().flush { expected ->\n      expected.error?.let { error ->\n        logW(MapController.TAG, \"TelemetryService flush error: $error\")\n      }\n    }\n  }\n\n  /**\n   * Provides parameters for Mapbox default modules, recursively if a module depends on other Mapbox modules.\n   */\n  private fun paramsProvider(\n    context: Context,\n    @Suppress(\"SameParameterValue\")\n    type: MapboxModuleType\n  ): Array<ModuleProviderArgument> {\n    return when (type) {\n      MapboxModuleType.MapTelemetry -> arrayOf(\n        ModuleProviderArgument(\n          Context::class.java,\n          context.applicationContext\n        ),\n      )\n      else -> throw IllegalArgumentException(\"${type.name} module is not supported by the Maps SDK\")\n    }\n  }\n\n  private fun MapView.getController(): MapController = this.mapController\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapSurface.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.os.Build\nimport android.view.MotionEvent\nimport android.view.Surface\nimport android.view.WindowManager\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.renderer.*\nimport com.mapbox.maps.renderer.widget.Widget\nimport kotlinx.coroutines.launch\n\n/**\n * A [MapSurface] provides an embeddable map interface.\n * You use this class to display map information and to manipulate the map contents from your application.\n * You can center the map on a given coordinate, specify the size of the area you want to display,\n * and style the features of the map to fit your application's use case.\n *\n * Use of [MapSurface] requires a Mapbox API access token.\n * Obtain an access token on the [Mapbox account page](https://www.mapbox.com/studio/account/tokens/).\n *\n * <strong>Warning:</strong> Please note that you are responsible for getting permission to use the map data,\n * and for ensuring your use adheres to the relevant terms of use.\n */\nclass MapSurface : MapPluginProviderDelegate, MapControllable {\n\n  private val context: Context\n  private val mapController: MapController\n  private val mapInitOptions: MapInitOptions\n  private val renderer: MapboxSurfaceRenderer\n\n  /**\n   * The surface to be used, set from the constructor.\n   */\n  val surface: Surface\n\n  /**\n   * @param context the application context to init the default [MapInitOptions]\n   * @param surface the surface that will display map\n   * @param mapInitOptions the init options for map\n   */\n  @JvmOverloads constructor(\n    context: Context,\n    surface: Surface,\n    mapInitOptions: MapInitOptions = MapInitOptions(context) // could use strong ref here as MapInitOptions have strong ref in any case\n  ) {\n    this.context = context\n    this.surface = surface\n    this.mapInitOptions = mapInitOptions\n    this.renderer = MapboxSurfaceRenderer(\n      antialiasingSampleCount = mapInitOptions.antialiasingSampleCount,\n      contextMode = mapInitOptions.mapOptions.contextMode ?: ContextMode.UNIQUE,\n      mapName = mapInitOptions.mapName,\n    )\n    this.mapController = MapController(renderer, mapInitOptions).apply {\n      initializePlugins(mapInitOptions)\n    }\n  }\n\n  /**\n   * @param context the application context to init the default [MapInitOptions]\n   * @param surface the surface that will display map\n   * @param mapInitOptions the init options for map\n   * @param renderer the MapboxSurfaceRenderer instance to be used\n   * @param mapController the MapController instance to be used\n   */\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal constructor(\n    context: Context,\n    surface: Surface,\n    mapInitOptions: MapInitOptions,\n    renderer: MapboxSurfaceRenderer,\n    mapController: MapController\n  ) {\n    this.context = context\n    this.surface = surface\n    this.mapInitOptions = mapInitOptions\n    this.renderer = renderer\n    this.mapController = mapController\n  }\n\n  /**\n   * Must be called when the surface has been created.\n   */\n  fun surfaceCreated() {\n    renderer.surfaceCreated()\n    // Set default refresh rate immediately to ensure map controller has a valid value\n    mapController.setScreenRefreshRate(MapView.DEFAULT_FPS)\n    // Retrieve screen refresh rate off the main thread to prevent ANR\n    mapController.lifecycleScope.launch {\n      safeSystemCallWithCallback(\n        fallback = MapView.DEFAULT_FPS,\n        logTag = TAG,\n        operation = {\n          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {\n            context.display.refreshRate.toInt()\n          } else {\n            @Suppress(\"DEPRECATION\")\n            (context.getSystemService(Context.WINDOW_SERVICE) as WindowManager?)\n              ?.defaultDisplay?.refreshRate?.toInt() ?: MapView.DEFAULT_FPS\n          }\n        }\n      ) { screenRefreshRate ->\n        mapController.setScreenRefreshRate(screenRefreshRate)\n      }\n    }\n  }\n\n  /**\n   * Must be called when the surface dimensions have changed.\n   *\n   * @param width The width of the surface viewport\n   * @param height The height of the surface viewport\n   */\n  fun surfaceChanged(width: Int, height: Int) {\n    renderer.surfaceChanged(surface, width, height)\n    onSizeChanged(width, height)\n  }\n\n  /**\n   * Must be called when the surface is destroyed.\n   */\n  fun surfaceDestroyed() {\n    renderer.surfaceDestroyed()\n  }\n\n  /**\n   * Returns a [MapboxMap] object that can be used to interact with the map.\n   *\n   * @return [MapboxMap] object to interact with the map.\n   */\n  override val mapboxMap: MapboxMap\n    get() = mapController.mapboxMap\n\n  /**\n   * Returns a [MapboxMap] object that can be used to interact with the map.\n   *\n   * @return [MapboxMap] object to interact with the map.\n   */\n  @Deprecated(\n    \"This method is deprecated, and will be removed in next major release. Use [mapboxMap] property instead.\",\n    replaceWith = ReplaceWith(\"mapboxMap\")\n  )\n  // Hide it from Java. They will use [mapboxMap] property getter above. Moreover, mangle the name\n  // in Java to avoid \"platform declaration clash\".\n  @JvmSynthetic @JvmName(\"getMapboxMapDeprecated\")\n  fun getMapboxMap(): MapboxMap = mapboxMap\n\n  /**\n   * Called when a touch event has occurred.\n   *\n   * @param event the motion event that has occurred\n   * @return True if event was handled, false otherwise\n   */\n  override fun onTouchEvent(event: MotionEvent): Boolean {\n    return mapController.onTouchEvent(event)\n  }\n\n  /**\n   * Called when a motion event has occurred.\n   *\n   * @param event the motion event that has occurred\n   * @return True if event was handled, false otherwise\n   */\n  override fun onGenericMotionEvent(event: MotionEvent): Boolean {\n    return mapController.onGenericMotionEvent(event)\n  }\n\n  /**\n   * Called when the size has changed.\n   *\n   * @param w width of the viewport\n   * @param h height of the viewport\n   */\n  override fun onSizeChanged(w: Int, h: Int) {\n    mapController.onSizeChanged(w, h)\n  }\n\n  /**\n   * Queue a runnable to be executed on the map renderer thread.\n   * Consecutive events will be called in the order they were queued.\n   *\n   * @param event the runnable to queue\n   * @param needRender if we should force redraw after running event (e.g. execute some GL commands)\n   */\n  override fun queueEvent(event: Runnable, needRender: Boolean) {\n    mapController.queueEvent(event)\n  }\n\n  /**\n   * Called to capture a snapshot synchronously.\n   *\n   * @return the snapshot\n   */\n  override fun snapshot(): Bitmap? = mapController.snapshot()\n\n  /**\n   * Called to capture a snapshot asynchronously.\n   * Consecutive requests will return snapshots in the order they were added.\n   *\n   * @param listener The listener to be invoked when snapshot finishes\n   */\n  override fun snapshot(listener: MapView.OnSnapshotReady) {\n    mapController.snapshot(listener)\n  }\n\n  /**\n   * Called to limit the maximum fps\n   *\n   * @param fps The maximum fps\n   */\n  override fun setMaximumFps(fps: Int) {\n    renderer.setMaximumFps(fps)\n  }\n\n  /**\n   * Set [OnFpsChangedListener] to get map rendering FPS.\n   */\n  override fun setOnFpsChangedListener(listener: OnFpsChangedListener) {\n    renderer.setOnFpsChangedListener(listener)\n  }\n\n  /**\n   * Set [RenderThreadStatsRecorder] to record frame stats.\n   */\n  @MapboxExperimental\n  override fun setRenderThreadStatsRecorder(renderThreadStatsRecorder: RenderThreadStatsRecorder) {\n    mapController.setRenderThreadStatsRecorder(renderThreadStatsRecorder)\n  }\n\n  /**\n   * Called to resume rendering\n   */\n  override fun onStart() {\n    mapController.onStart()\n  }\n\n  /**\n   * Called to stop rendering\n   */\n  override fun onStop() {\n    mapController.onStop()\n  }\n\n  /**\n   * Called when the activity is resumed\n   */\n  override fun onResume() {\n    mapController.onResume()\n  }\n\n  /**\n   * Called to dispose the renderer\n   */\n  override fun onDestroy() {\n    mapController.onDestroy()\n  }\n\n  /**\n   * Called to reduce memory use\n   */\n  override fun onLowMemory() {\n    mapController.onLowMemory()\n  }\n\n  /**\n   * Add [Widget] to the map.\n   *\n   * @throws RuntimeException when trying to add the Widget to the [MapSurface] that does not\n   * have [MapOptions.contextMode] = [ContextMode.SHARED] as part of [MapInitOptions].\n   */\n  @MapboxExperimental\n  override fun addWidget(widget: Widget) {\n    mapController.addWidget(widget)\n  }\n\n  /**\n   * Remove [Widget] from the map.\n   *\n   * @return true if widget was present and removed, false otherwise\n   */\n  @MapboxExperimental\n  override fun removeWidget(widget: Widget) = mapController.removeWidget(widget)\n\n  /**\n   * Add an instance of [RendererSetupErrorListener].\n   *\n   * Please note that errors could be already reported from the renderer during [MapView] creation\n   * before this method will be called - all accumulated renderer errors will be delivered.\n   */\n  override fun addRendererSetupErrorListener(rendererSetupErrorListener: RendererSetupErrorListener) {\n    mapController.addRendererSetupErrorListener(rendererSetupErrorListener)\n  }\n\n  /**\n   * Remove an instance of [RendererSetupErrorListener].\n   */\n  override fun removeRendererSetupErrorListener(rendererSetupErrorListener: RendererSetupErrorListener) {\n    mapController.removeRendererSetupErrorListener(rendererSetupErrorListener)\n  }\n\n  /**\n   * Get the plugin instance.\n   *\n   * @param id plugin id\n   * @return created plugin instance or null if no plugin is found for given id.\n   */\n  override fun <T : MapPlugin> getPlugin(id: String): T? = mapController.getPlugin(id)\n\n  private companion object {\n    private const val TAG = \"MapSurface\"\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapView.kt",
    "content": "package com.mapbox.maps\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.opengl.GLES20\nimport android.util.AttributeSet\nimport android.view.MotionEvent\nimport android.view.SurfaceView\nimport android.view.TextureView\nimport android.view.ViewConfiguration\nimport android.widget.FrameLayout\nimport androidx.annotation.IntRange\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.maps.debugoptions.DebugOptionsController\nimport com.mapbox.maps.debugoptions.MapViewDebugOptions\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.renderer.MapboxSurfaceHolderRenderer\nimport com.mapbox.maps.renderer.MapboxTextureViewRenderer\nimport com.mapbox.maps.renderer.OnFpsChangedListener\nimport com.mapbox.maps.renderer.RenderThreadStatsRecorder\nimport com.mapbox.maps.renderer.RendererSetupErrorListener\nimport com.mapbox.maps.renderer.egl.EGLCore\nimport com.mapbox.maps.renderer.widget.Widget\nimport com.mapbox.maps.viewannotation.ViewAnnotationManager\nimport com.mapbox.maps.viewannotation.ViewAnnotationManagerImpl\nimport kotlinx.coroutines.launch\nimport java.nio.IntBuffer\nimport kotlin.math.hypot\n\n/**\n * A [MapView] provides an embeddable map interface.\n * You use this class to display map information and to manipulate the map contents from your application.\n * You can center the map on a given coordinate, specify the size of the area you want to display,\n * and style the features of the map to fit your application's use case.\n *\n * Use of [MapView] requires a Mapbox API access token.\n * Obtain an access token on the [Mapbox account page](https://www.mapbox.com/studio/account/tokens/).\n *\n * <strong>Warning:</strong> Please note that you are responsible for getting permission to use the map data,\n * and for ensuring your use adheres to the relevant terms of use.\n */\nopen class MapView : FrameLayout, MapPluginProviderDelegate, MapControllable {\n  @get:JvmSynthetic\n  internal lateinit var mapController: MapController\n    private set\n  private val debugOptionsControllerDelegate = lazy {\n    DebugOptionsController(\n      this,\n      mapController.mapboxMap\n    )\n  }\n  private val debugOptionsController: DebugOptionsController by debugOptionsControllerDelegate\n  private var interceptedViewAnnotationEvents: MutableList<MotionEvent> = mutableListOf()\n  private val touchSlop: Int by lazy { ViewConfiguration.get(context).scaledTouchSlop }\n  private val viewAnnotationManagerDelegate = lazy { ViewAnnotationManagerImpl(this) }\n\n  /**\n   * Get view annotation manager instance to add / update / remove view annotations\n   * represented as Android views.\n   */\n  val viewAnnotationManager: ViewAnnotationManager by viewAnnotationManagerDelegate\n\n  /**\n   * [Set] of debug options for the current [MapView] and its native [MapboxMap].\n   */\n  var debugOptions: Set<MapViewDebugOptions>\n    get() = debugOptionsController.options\n    set(value) {\n      debugOptionsController.options = value\n    }\n\n  /**\n   * Build a [MapView] with [Context] and [MapInitOptions] objects.\n   */\n  @JvmOverloads\n  constructor(context: Context, mapInitOptions: MapInitOptions = MapInitOptions(context)) : this(\n    context,\n    null,\n    0,\n    0,\n    mapInitOptions\n  )\n\n  /**\n   * Build a [MapView] with [Context] and [AttributeSet] objects.\n   */\n  constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)\n\n  /**\n   * Build a [MapView] with a [Context] object, a [AttributeSet] object, and\n   * an [Int] which represents a style resource file.\n   */\n  constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(\n    context,\n    attrs,\n    defStyleAttr,\n    0,\n    null\n  )\n\n  /**\n   * Build a [MapView] with a [Context] object, a [MapInitOptions] object,\n   * a [AttributeSet] object, an [Int] which represents a style attribute file,\n   * and an [Int] which represents a style resource file.\n   */\n  private constructor(\n    context: Context,\n    attrs: AttributeSet?,\n    defStyleAttr: Int,\n    defStyleRes: Int,\n    initOptions: MapInitOptions?,\n  ) : super(context, attrs, defStyleAttr, defStyleRes) {\n    val resolvedMapInitOptions = if (attrs != null) {\n      parseTypedArray(context, attrs)\n    } else {\n      initOptions ?: MapInitOptions(context)\n    }\n    if (isInEditMode) {\n      return\n    }\n    val view = if (resolvedMapInitOptions.textureView) {\n      TextureView(context, attrs)\n    } else {\n      SurfaceView(context, attrs)\n    }\n    val contextMode = resolvedMapInitOptions.mapOptions.contextMode ?: ContextMode.UNIQUE\n    mapController = MapController(\n      when (view) {\n        is SurfaceView -> MapboxSurfaceHolderRenderer(\n          view.holder,\n          resolvedMapInitOptions.antialiasingSampleCount,\n          contextMode,\n          resolvedMapInitOptions.mapName,\n        )\n\n        is TextureView -> MapboxTextureViewRenderer(\n          view,\n          resolvedMapInitOptions.antialiasingSampleCount,\n          contextMode,\n          resolvedMapInitOptions.mapName,\n        )\n\n        else -> throw IllegalArgumentException(\"Provided view has to be a texture or a surface.\")\n      },\n      resolvedMapInitOptions\n    )\n    addView(view, 0)\n    mapController.initializePlugins(resolvedMapInitOptions, this)\n  }\n\n  override fun onAttachedToWindow() {\n    super.onAttachedToWindow()\n    if (!isInEditMode) {\n      mapController.onAttachedToWindow(this)\n    }\n  }\n\n  @SuppressLint(\"CustomViewStyleable\")\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  @JvmSynthetic\n  internal fun parseTypedArray(context: Context, attrs: AttributeSet?): MapInitOptions {\n    val typedArray = context.obtainStyledAttributes(attrs, R.styleable.mapbox_MapView, 0, 0)\n    try {\n      val mapOptions =\n        MapAttributeParser.parseMapOptions(typedArray, context.resources.displayMetrics.density)\n      val cameraOptions = CameraAttributeParser.parseCameraOptions(typedArray)\n      val textureView = typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapSurface, 0) != 0\n      val styleUri =\n        typedArray.getString(R.styleable.mapbox_MapView_mapbox_styleUri) ?: Style.STANDARD\n      val antialiasingSampleCount = typedArray.getInteger(\n        R.styleable.mapbox_MapView_mapbox_mapAntialiasingSampleCount,\n        DEFAULT_ANTIALIASING_SAMPLE_COUNT\n      )\n      val mapName = typedArray.getString(R.styleable.mapbox_MapView_mapbox_mapName) ?: \"\"\n\n      return MapInitOptions(\n        context,\n        mapOptions,\n        styleUri = if (styleUri.isEmpty()) {\n          null\n        } else {\n          styleUri\n        },\n        attrs = attrs,\n        antialiasingSampleCount = antialiasingSampleCount,\n        mapName = mapName,\n      ).also {\n        it.cameraOptions = cameraOptions\n        it.textureView = textureView\n      }\n    } finally {\n      typedArray.recycle()\n    }\n  }\n\n  private constructor(\n    context: Context,\n    attrs: AttributeSet?,\n    mapController: MapController,\n  ) : super(context, attrs, 0, 0) {\n    this.mapController = mapController\n  }\n\n  /**\n   * Called when the size of the MapView has changed.\n   */\n  public override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {\n    super.onSizeChanged(w, h, oldw, oldh)\n    if (w != oldw || h != oldh) {\n      onSizeChanged(w, h)\n    }\n  }\n\n  /**\n   * Called when the size of the MapView has changed\n   */\n  override fun onSizeChanged(w: Int, h: Int) {\n    if (!isInEditMode) {\n      mapController.onSizeChanged(w, h)\n    }\n  }\n\n  /**\n   * You must call this method from the parent's Activity#onStart() or Fragment#onStart()\n   * @see android.app.Activity.onStart\n   * @see android.app.Fragment.onStart\n   */\n  override fun onStart() {\n    // Set default refresh rate immediately to ensure map controller has a valid value\n    mapController.setScreenRefreshRate(DEFAULT_FPS)\n    // Retrieve screen refresh rate off the main thread to prevent ANR\n    mapController.lifecycleScope.launch {\n      safeSystemCallWithCallback(\n        fallback = DEFAULT_FPS,\n        logTag = TAG,\n        operation = {\n          display?.refreshRate?.toInt() ?: DEFAULT_FPS\n        }\n      ) { screenRefreshRate ->\n        mapController.setScreenRefreshRate(screenRefreshRate)\n      }\n    }\n\n    mapController.onStart()\n    if (debugOptionsControllerDelegate.isInitialized()) {\n      debugOptionsController.started = true\n    }\n  }\n\n  /**\n   * You must call this method from the parent's Activity#onStop() or Fragment#onStop()\n   * @see android.app.Activity.onStop\n   * @see android.app.Fragment.onStop\n   */\n  override fun onStop() {\n    mapController.onStop()\n    if (debugOptionsControllerDelegate.isInitialized()) {\n      debugOptionsController.started = false\n    }\n  }\n\n  /**\n   * You must call this method from the parent's Activity#onResume() or Fragment#onResume()\n   * @see android.app.Activity.onResume\n   * @see android.app.Fragment.onResume\n   */\n  override fun onResume() {\n    mapController.onResume()\n  }\n\n  /**\n   * You must call this method from the parent's Activity#onLowMemory() or Fragment#onLowMemory()\n   * @see android.app.Activity.onLowMemory\n   * @see android.app.Fragment.onLowMemory\n   */\n  override fun onLowMemory() {\n    mapController.onLowMemory()\n  }\n\n  /**\n   * You must call this method from the parent's Activity#onDestroy() or Fragment#onDestroy()\n   */\n  override fun onDestroy() {\n    if (viewAnnotationManagerDelegate.isInitialized()) {\n      (viewAnnotationManager as ViewAnnotationManagerImpl).destroy()\n    }\n    mapController.onDestroy()\n  }\n\n  /**\n   * Returns a [MapboxMap] object that can be used to interact with the map.\n   *\n   * Note: keeping the reference to an invalid [MapboxMap] instance introduces significant native memory leak,\n   * see [MapboxMap.isValid] for more details.\n   *\n   * @return [MapboxMap] object to interact with the map.\n   */\n  override val mapboxMap\n    get() = mapController.mapboxMap\n\n  /**\n   * Returns a [MapboxMap] object that can be used to interact with the map.\n   *\n   * @return [MapboxMap] object to interact with the map.\n   */\n  @Deprecated(\n    \"This method is deprecated, and will be removed in next major release. Use [mapboxMap] property instead.\",\n    replaceWith = ReplaceWith(\"mapboxMap\")\n  )\n  // Hide it from Java. They will use [mapboxMap] property getter above. Moreover, mangle the name\n  // in Java to avoid \"platform declaration clash\".\n  @JvmSynthetic\n  @JvmName(\"getMapboxMapDeprecated\")\n  fun getMapboxMap(): MapboxMap = mapboxMap\n\n  /**\n   * Queue a runnable to be executed on the map renderer thread.\n   * Consecutive events will be called in the order they were queued.\n   *\n   * @param event the runnable to queue\n   * @param needRender if we should force redraw after running event (e.g. execute some GL commands)\n   */\n  override fun queueEvent(event: Runnable, needRender: Boolean) {\n    mapController.queueEvent(event, needRender)\n  }\n\n  /**\n   * Perform snapshot of current [MapView] state.\n   * This method is synchronous so it blocks calling thread until [Bitmap] is ready.\n   *\n   * @return [Bitmap] representing current map state or null if map is not ready yet.\n   */\n  override fun snapshot() = mapController.snapshot()\n\n  /**\n   * Perform snapshot of current [MapView] state with notifying listener about it.\n   * This method is asynchronous so it does not block calling thread.\n   * Consecutive requests will return snapshots in the order they were added.\n   *\n   * [OnSnapshotReady.onSnapshotReady] is called from non UI thread.\n   *\n   * @param listener instance of [OnSnapshotReady] callback\n   */\n  override fun snapshot(listener: OnSnapshotReady) {\n    mapController.snapshot(listener)\n  }\n\n  /**\n   * Set whether legacy mode should be used for [snapshot].\n   *\n   * Legacy mode is not that efficient (as it blocks map rendering when making the snapshot)\n   * but may help with vendor specific issues like described in\n   * https://github.com/mapbox/mapbox-maps-android/issues/2280.\n   *\n   * @param enabled enables legacy mode when True and disables otherwise.\n   */\n  @MapboxExperimental\n  fun setSnapshotLegacyMode(enabled: Boolean) {\n    mapController.renderer.snapshotLegacyModeEnabled = enabled\n  }\n\n  /**\n   * Set new maximum FPS for map rendering.\n   *\n   * @param fps new maximum FPS value that must be greater than 0 and less than max integer.\n   * When setting this value higher than screen physically supports - max possible screen FPS rate will be used.\n   */\n  override fun setMaximumFps(@IntRange(from = 1, to = Int.MAX_VALUE.toLong()) fps: Int) {\n    mapController.setMaximumFps(fps)\n  }\n\n  /**\n   * Create a new plugin instance that will be added to the map.\n   * Only one instance of [Plugin.instance] with given [Plugin.id] can exist for given [MapView].\n   *\n   * @param plugin instance of [Plugin] that will be added to the [MapView].\n   */\n  fun createPlugin(\n    plugin: Plugin\n  ) = mapController.createPlugin(this, plugin)\n\n  /**\n   * Remove the plugin instance that will be removed from the map.\n   *\n   * Removing the plugin from [MapView] will result in [MapPlugin.cleanup] being called and existing\n   * events subscription cancelled.\n   *\n   * @param id the id of the plugin to be removed\n   */\n  fun removePlugin(id: String) = mapController.removePlugin(id)\n\n  /**\n   * Get the plugin instance.\n   *\n   * @param id plugin id\n   * @return created plugin instance or null if no plugin is found for given id.\n   */\n  override fun <T : MapPlugin> getPlugin(id: String): T? = mapController.getPlugin(id)\n\n  /**\n   * Called when a touch event has occurred.\n   *\n   * @return true to indicate the touch event has been handled\n   */\n  @SuppressLint(\"ClickableViewAccessibility\")\n  override fun onTouchEvent(event: MotionEvent): Boolean {\n    var interceptedTouchRes = false\n    if (interceptedViewAnnotationEvents.isNotEmpty() && interceptedViewAnnotationEvents.none { it.eventTime == event.eventTime }) {\n      interceptedViewAnnotationEvents.forEach {\n        interceptedTouchRes = mapController.onTouchEvent(it) || interceptedTouchRes\n        it.recycle()\n      }\n    }\n    interceptedViewAnnotationEvents.clear()\n    return mapController.onTouchEvent(event) || interceptedTouchRes\n  }\n\n  /**\n   * Called whenever a touch event is detected on the surface of a ViewGroup,\n   * including on the surface of its children\n   *\n   * @param event the motion event that has occurred\n   * @return True if event was intercepted, false otherwise\n   */\n  override fun onInterceptTouchEvent(event: MotionEvent): Boolean {\n    return when (event.actionMasked) {\n      MotionEvent.ACTION_DOWN,\n      MotionEvent.ACTION_POINTER_DOWN -> {\n        interceptedViewAnnotationEvents.add(MotionEvent.obtain(event))\n        false\n      }\n\n      MotionEvent.ACTION_MOVE -> {\n        interceptedViewAnnotationEvents.any { it.hypot(event, touchSlop) }\n      }\n\n      MotionEvent.ACTION_UP,\n      MotionEvent.ACTION_CANCEL -> {\n        interceptedViewAnnotationEvents.clear()\n        return false\n      }\n\n      MotionEvent.ACTION_POINTER_UP -> {\n        val upPointerId = event.getPointerId(event.actionIndex)\n        interceptedViewAnnotationEvents.removeAll {\n          upPointerId == it.getPointerId(it.actionIndex)\n        }\n\n        return false\n      }\n\n      else -> {\n        // In general, we don't want to intercept touch events. They should be\n        // handled by the child view.\n        false\n      }\n    }\n  }\n\n  private fun MotionEvent.hypot(moveEvent: MotionEvent, touchSlop: Int): Boolean {\n    for (i in 0 until moveEvent.pointerCount) {\n      val pointerId = moveEvent.getPointerId(i)\n      val originalCoordinateIndex = findPointerIndex(pointerId)\n      val moveCoordinateIndex = moveEvent.findPointerIndex(pointerId)\n      if (originalCoordinateIndex == -1 || moveCoordinateIndex == -1) {\n        continue\n      }\n      if (\n        hypot(\n          x = getX(originalCoordinateIndex) - moveEvent.getX(moveCoordinateIndex),\n          y = getY(originalCoordinateIndex) - moveEvent.getY(moveCoordinateIndex)\n        ) > touchSlop\n      ) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /**\n   * Called when a generic motion event has occurred.\n   *\n   * @return true to indicate the touch event has been handled\n   */\n  override fun onGenericMotionEvent(event: MotionEvent): Boolean {\n    return mapController.onGenericMotionEvent(event) ||\n      super.onGenericMotionEvent(event)\n  }\n\n  /**\n   * Set [OnFpsChangedListener] to get map rendering FPS.\n   */\n  override fun setOnFpsChangedListener(listener: OnFpsChangedListener) {\n    mapController.setOnFpsChangedListener(listener)\n  }\n\n  /**\n   * Set [RenderThreadStatsRecorder] to record frame stats.\n   */\n  @MapboxExperimental\n  override fun setRenderThreadStatsRecorder(renderThreadStatsRecorder: RenderThreadStatsRecorder) {\n    mapController.setRenderThreadStatsRecorder(renderThreadStatsRecorder)\n  }\n\n  /**\n   * Add [Widget] to the map.\n   *\n   * @throws RuntimeException when trying to add the Widget to the [MapView] that does not\n   * have [MapOptions.contextMode] = [ContextMode.SHARED] as part of [MapInitOptions].\n   */\n  @MapboxExperimental\n  override fun addWidget(widget: Widget) {\n    mapController.addWidget(widget)\n  }\n\n  /**\n   * Remove [Widget] from the map.\n   *\n   * @return true if widget was present and removed, false otherwise\n   */\n  @MapboxExperimental\n  override fun removeWidget(widget: Widget) = mapController.removeWidget(widget)\n\n  /**\n   * Schedules a thread service type reset on the render thread after a specified delay.\n   * This method is called to ensure CPU affinity is properly set\n   * when coming back from background, addressing timing issues where CPU affinity\n   * might not be immediately available.\n   * **Note:** This is a delicate API that should only be used when you experience\n   * performance issues after returning from background. Improper usage may not\n   * provide any benefits or could potentially affect rendering performance.\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  fun scheduleThreadServiceTypeReset() {\n    mapController.renderer.renderThread.scheduleThreadServiceTypeReset()\n  }\n\n  /**\n   * Add an instance of [RendererSetupErrorListener].\n   *\n   * Please note that errors could be already reported from the renderer during [MapView] creation\n   * before this method will be called - all accumulated renderer errors will be delivered.\n   */\n  override fun addRendererSetupErrorListener(rendererSetupErrorListener: RendererSetupErrorListener) {\n    mapController.addRendererSetupErrorListener(rendererSetupErrorListener)\n  }\n\n  /**\n   * Remove an instance of [RendererSetupErrorListener].\n   */\n  override fun removeRendererSetupErrorListener(rendererSetupErrorListener: RendererSetupErrorListener) {\n    mapController.removeRendererSetupErrorListener(rendererSetupErrorListener)\n  }\n\n  /**\n   * Interface for getting snapshot result [Bitmap].\n   */\n  fun interface OnSnapshotReady {\n    /**\n     * Will be called when snapshot [Bitmap] is ready.\n     *\n     * @param bitmap Returns valid [Bitmap] if snapshot was successful and null otherwise.\n     */\n    fun onSnapshotReady(bitmap: Bitmap?)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    @JvmSynthetic\n    internal const val DEFAULT_ANTIALIASING_SAMPLE_COUNT = 1\n\n    /**\n     * Fallback to this value if, for some reason, Android display is NULL.\n     * This will not affect rendering on displays with higher frame rate if [MapView.setMaximumFps] was not called.\n     */\n    @JvmSynthetic\n    internal const val DEFAULT_FPS = 60\n\n    private const val TAG = \"MapView\"\n\n    /**\n     * Static method to check if [MapView] could properly render on this device.\n     * This method may take some time on slow devices.\n     *\n     * @return true if [MapView] could be rendered on this device and false otherwise\n     */\n    @JvmStatic\n    fun isRenderingSupported(): Boolean {\n      EGLCore(false, DEFAULT_ANTIALIASING_SAMPLE_COUNT, mapName = \"\").apply {\n        val eglConfigOk = prepareEgl()\n        release()\n        return eglConfigOk\n      }\n    }\n\n    /**\n     * Static method to check if [MapView] could properly render 3D terrain on this device.\n     * This method may take some time on slow devices.\n     *\n     * @return true if 3D terrain could be rendered on this device and false otherwise\n     */\n    @JvmStatic\n    fun isTerrainRenderingSupported(): Boolean {\n      EGLCore(false, DEFAULT_ANTIALIASING_SAMPLE_COUNT, mapName = \"\").apply {\n        val eglConfigOk = prepareEgl()\n        val eglSurface = createOffscreenSurface(1, 1)\n        makeCurrent(eglSurface)\n        val resultBuffer = IntBuffer.allocate(1)\n        GLES20.glGetIntegerv(GLES20.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, resultBuffer)\n        resultBuffer.rewind()\n        val result = resultBuffer.get()\n        val terrainSupported = result > 0\n        releaseSurface(eglSurface)\n        release()\n        return eglConfigOk && terrainSupported\n      }\n    }\n\n    @VisibleForTesting\n    @JvmSynthetic\n    internal operator fun invoke(\n      context: Context,\n      attrs: AttributeSet?,\n      mapController: MapController,\n    ) = MapView(context, attrs, mapController)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapboxConfigurationException.kt",
    "content": "package com.mapbox.maps\n\n/**\n * A MapboxConfigurationException is thrown by MapboxMap when the SDK hasn't been properly initialised.\n */\nclass MapboxConfigurationException : RuntimeException {\n\n  /**\n   * Creates a Mapbox configuration exception thrown by MapboxMap when the SDK hasn't been properly initialised.\n   */\n  constructor() : super(\n    \"\"\"\n      Using MapView, MapSurface, Snapshotter or other Map components requires providing a valid access token when inflating or creating the map.\n      Provide the token by either:\n        1. Creating a mapbox_access_token string resource.\n        2. Or programmatically calling `MapboxOptions.accessToken = <your_access_token>`.\n      The access token parameter is required when using a Mapbox service.\n      Please see https://www.mapbox.com/help/create-api-access-token/ to learn how to create one.\n      More information in this guide https://www.mapbox.com/help/first-steps-android-sdk/#access-tokens.\n    \"\"\".trimIndent()\n  )\n\n  /**\n   * Creates a Mapbox configuration exception thrown by MapboxMap when the SDK hasn't been properly initialised.\n   */\n  constructor(message: String) : super(message)\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapboxConstants.kt",
    "content": "@file:JvmName(\"MapboxConstants\")\n\npackage com.mapbox.maps\n\nimport java.util.*\n\n/**\n * Default Locale for data processing\n */\nval MAPBOX_LOCALE: Locale = Locale.US\n\ninternal const val CORE_SHARED_LIBRARY_NAME = \"mapbox-common\"\n\ninternal const val MAP_SHARED_LIBRARY_NAME = \"mapbox-maps\"\n\n/**\n * The currently supported minimum zoom level.\n */\ninternal const val MINIMUM_ZOOM = 0.0f\n\n/**\n * The currently supported maximum zoom level.\n */\ninternal const val MAXIMUM_ZOOM = 25.5f\n\n/**\n * The currently supported maximum bearing\n */\ninternal const val MAXIMUM_BEARING = 360.0\n\n/**\n * The currently supported minimum bearing\n */\ninternal const val MINIMUM_BEARING = 0.0"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapboxMap.kt",
    "content": "package com.mapbox.maps\n\nimport android.app.Activity\nimport android.graphics.RectF\nimport android.os.Handler\nimport android.webkit.URLUtil\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.extension.style.utils.transition\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeatureStateCallback\nimport com.mapbox.maps.interactions.FeatureStateKey\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.QueryRenderedFeaturesetFeaturesCallback\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.delegates.*\nimport com.mapbox.maps.plugin.delegates.listeners.*\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport kotlin.math.roundToInt\n\n/**\n * The general class to interact with in the Mapbox Maps SDK for Android.\n * It exposes the entry point for all methods related to the Map object.\n * You cannot instantiate [MapboxMap] object directly, rather, you must obtain one\n * from the getMapboxMap() method MapView that you have\n * added to your application.\n *\n * Note: Similar to a View object, a MapboxMap should only be read and modified\n * from the main thread.\n *\n * @property style the map style.\n */\n@OptIn(MapboxExperimental::class)\n@Suppress(\"DEPRECATION\")\nclass MapboxMap :\n  MapTransformDelegate,\n  MapProjectionDelegate,\n  MapFeatureQueryDelegate,\n  MapListenerDelegate,\n  MapPluginExtensionsDelegate,\n  MapCameraManagerDelegate,\n  MapboxStyleManager,\n  MapInteractionDelegate,\n  MapFeatureStateDelegate {\n\n  private val nativeMap: NativeMapImpl\n  private var isMapValid = true\n  private var performanceCollectionStatisticsStarted = false\n  private val interactions = mutableListOf<Cancelable>()\n\n  /**\n   * Whether the [MapboxMap] instance is valid.\n   *\n   * [MapboxMap] becomes invalid after [MapView.onDestroy] is invoked,\n   * calling any method then could result in undefined behaviour and will print an error log.\n   *\n   * Keeping the reference to an invalid [MapboxMap] instance introduces significant native memory leak.\n   *\n   * @return True if [MapboxMap] is valid and false otherwise.\n   */\n  fun isValid(): Boolean {\n    return isMapValid\n  }\n\n  @get:JvmSynthetic\n  internal val nativeObserver: NativeObserver\n\n  /**\n   * [Style] of the map synchronously, will return null is style is not loaded yet.\n   *\n   * Note: keeping the reference to an invalid [Style] instance introduces significant native memory leak,\n   * see [Style.isValid] for more details.\n   *\n   * @return currently loaded [Style] object or NULL if it is not loaded.\n   */\n  var style: Style? = null\n    @JvmSynthetic\n    internal set\n    get() {\n      checkNativeMap(\"getStyle\")\n      return field\n    }\n\n  @get:JvmSynthetic @set:JvmSynthetic\n  internal var isStyleLoadInitiated = false\n  private val styleObserver: StyleObserver\n  @get:JvmSynthetic @set:JvmSynthetic\n  internal var renderHandler: Handler? = null\n\n  /**\n   * Represents current camera state.\n   */\n  override val cameraState: CameraState\n    get() {\n      checkNativeMap(\"cameraState\")\n      return nativeMap.getCameraState()\n    }\n\n  /**\n   * Indoor manager for controlling indoor map floor display.\n   *\n   * Provides access to indoor mapping features, allowing you to select floors\n   * and listen to indoor state updates.\n   *\n   * @return the [IndoorManager] instance.\n   */\n  @MapboxExperimental\n  val indoor: IndoorManager\n    get() {\n      checkNativeMap(\"indoor\")\n      return nativeMap.getIndoorManager()\n    }\n\n  @get:JvmSynthetic @set:JvmSynthetic\n  internal var cameraAnimationsPlugin: CameraAnimationsPlugin? = null\n  @get:JvmSynthetic @set:JvmSynthetic\n  internal var gesturesPlugin: GesturesPlugin? = null\n\n  private constructor(\n    nativeMap: NativeMapImpl,\n    nativeObserver: NativeObserver,\n    styleObserver: StyleObserver\n  ) : super(nativeMap.map, 1.0f, mapLoadingErrorDelegate = { }) {\n    this.nativeMap = nativeMap\n    this.nativeObserver = nativeObserver\n    this.styleObserver = styleObserver\n  }\n\n  private constructor(\n    nativeMap: NativeMapImpl,\n    nativeObserver: NativeObserver,\n    pixelRatio: Float\n  ) : super(\n    nativeMap.map,\n    pixelRatio,\n    MapLoadingErrorDelegate { error ->\n      nativeObserver.sendMapLoadingError(error)\n    }\n  ) {\n    this.nativeMap = nativeMap\n    this.nativeObserver = nativeObserver\n    val mapLoadingErrorDelegate = MapLoadingErrorDelegate { error ->\n      this.nativeObserver.sendMapLoadingError(error)\n    }\n    // we register our internal native observers here and\n    // this is critical to always have our observers registered first\n    this.styleObserver = StyleObserver(\n      this.nativeMap.map,\n      { style -> this.style = style },\n      nativeObserver,\n      pixelRatio,\n      mapLoadingErrorDelegate\n    )\n  }\n\n  /**\n   * @return The [MapboxMapRecorder] instance for this map or null if it can't be created\n   */\n  @MapboxExperimental\n  fun createRecorder(): MapboxMapRecorder {\n    val expected = MapRecorder.createInstance(nativeMap.map)\n    return if (expected.isValue) {\n      MapboxMapRecorder(expected.value!!)\n    } else {\n      throw RuntimeException(expected.error ?: \"Error occurred in MapboxMap.createRecorder!\")\n    }\n  }\n\n  private fun String.isValidUri(): Boolean {\n    val isMapboxStyleUri = startsWith(\"mapbox://\", ignoreCase = true)\n    val isMapboxAssetUri = startsWith(\"asset://\", ignoreCase = true)\n    val isMapboxFileUri = startsWith(\"file://\", ignoreCase = true)\n    return isMapboxStyleUri || isMapboxAssetUri || isMapboxFileUri || URLUtil.isValidUrl(this)\n  }\n\n  private fun applyStyle(style: String) {\n    if (style.isValidUri()) {\n      nativeMap.setStyleURI(style)\n    } else {\n      nativeMap.setStyleJSON(style.ifBlank { \"{}\" })\n    }\n  }\n\n  /**\n   * Loads the new map style either from a specified URI or from a JSON both represented as [String].\n   *\n   * URI can take the following forms:\n   *\n   * - **Constants**: load one of the bundled styles in [Style].\n   *\n   * - **`mapbox://styles/<user>/<style>`**:\n   * loads the style from a [Mapbox account](https://www.mapbox.com/account/).\n   * *user* is your username. *style* is the ID of your custom\n   * style created in [Mapbox Studio](https://www.mapbox.com/studio).\n   *\n   * - **`http://...` or `https://...`**:\n   * loads the style over the Internet from any web server.\n   *\n   * - **`asset://...`**:\n   * loads the style from the APK *assets* directory.\n   * This is used to load a style bundled with your app.\n   *\n   * - **`file://...`**:\n   * loads the style from a file path. This is used to load a style from disk.\n   *\n   * If [style] is not the valid URI - it will be treated as style JSON string.\n   *\n   * ** Important notes comparing to Maps v10 **:\n   * 1. Parameter `onMapLoadErrorListener` was removed as it was not covering all the map / style loading errors.\n   *  Now if you need to listen to those errors you have to register specific listener in advance, e.g.\n   *  [OnMapLoadErrorListener] should now be registered with [subscribeMapLoadingError];\n   *  you could also subscribe to other events like [subscribeStyleImageMissing] or [subscribeStyleImageRemoveUnused].\n   *\n   * 2. Parameter `styleTransitionOptions` was removed from this overloaded method.\n   *  In order to apply it you should use more granular overloaded [loadStyle] taking [StyleContract.StyleExtension]\n   *  and add transition options in DSL block:\n   *\n   *  mapboxMap.loadStyle(style(Style.DARK) {\n   *   +transition {\n   *     duration(100L)\n   *     enablePlacementTransitions(false)\n   *    }\n   *   // other runtime styling\n   * }\n   *\n   * @param style specified URI or from JSON both represented as [String].\n   * @param onStyleLoaded callback triggered when the style is successfully loaded.\n   */\n  @JvmOverloads\n  fun loadStyle(\n    style: String,\n    onStyleLoaded: Style.OnStyleLoaded? = null,\n  ) {\n    checkNativeMap(\"loadStyle\")\n    initializeStyleLoad(\n      onStyleLoaded,\n      styleDataStyleLoadedListener = {},\n    )\n    applyStyle(style)\n  }\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\" +\n      \" IMPORTANT: onMapLoadErrorListener will not be triggered anymore,\" +\n      \" please refer to documentation for new method to understand how to handle errors.\",\n    replaceWith = ReplaceWith(\"loadStyle(style, onStyleLoaded)\")\n  )\n  fun loadStyleUri(\n    styleUri: String,\n    styleTransitionOptions: TransitionOptions? = null,\n    onStyleLoaded: Style.OnStyleLoaded? = null,\n    onMapLoadErrorListener: OnMapLoadErrorListener? = null,\n  ) {\n    loadStyle(\n      style(styleUri) {\n        styleTransitionOptions?.let {\n          +transition {\n            it.toBuilder()\n          }\n        }\n      },\n      onStyleLoaded\n    )\n  }\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\" +\n      \" IMPORTANT: onMapLoadErrorListener will not be triggered anymore,\" +\n      \" please refer to documentation for new method to understand how to handle errors.\",\n    replaceWith = ReplaceWith(\"loadStyle(style, onStyleLoaded)\")\n  )\n  fun loadStyleUri(\n    styleUri: String,\n    onStyleLoaded: Style.OnStyleLoaded? = null,\n    onMapLoadErrorListener: OnMapLoadErrorListener? = null\n  ) {\n    loadStyleUri(styleUri, null, onStyleLoaded, onMapLoadErrorListener)\n  }\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\" +\n      \" IMPORTANT: onMapLoadErrorListener will not be triggered anymore,\" +\n      \" please refer to documentation for new method to understand how to handle errors.\",\n    replaceWith = ReplaceWith(\"loadStyle(style, onStyleLoaded)\")\n  )\n  fun loadStyleUri(\n    styleUri: String,\n    onStyleLoaded: Style.OnStyleLoaded\n  ) = loadStyleUri(styleUri, null, onStyleLoaded, null)\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\" +\n      \" IMPORTANT: onMapLoadErrorListener will not be triggered anymore,\" +\n      \" please refer to documentation for new method to understand how to handle errors.\",\n    replaceWith = ReplaceWith(\"loadStyle(style)\")\n  )\n  fun loadStyleUri(\n    styleUri: String,\n  ) = loadStyleUri(styleUri, null, null, null)\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\" +\n      \" IMPORTANT: onMapLoadErrorListener will not be triggered anymore,\" +\n      \" please refer to documentation for new method to understand how to handle errors.\",\n    replaceWith = ReplaceWith(\"loadStyle(style, onStyleLoaded)\")\n  )\n  fun loadStyleJson(\n    styleJson: String,\n    styleTransitionOptions: TransitionOptions? = null,\n    onStyleLoaded: Style.OnStyleLoaded? = null,\n    onMapLoadErrorListener: OnMapLoadErrorListener? = null,\n  ) {\n    loadStyleUri(styleJson, styleTransitionOptions, onStyleLoaded, onMapLoadErrorListener)\n  }\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\" +\n      \" IMPORTANT: onMapLoadErrorListener will not be triggered anymore,\" +\n      \" please refer to documentation for new method to understand how to handle errors.\",\n    replaceWith = ReplaceWith(\"loadStyle(style, onStyleLoaded)\")\n  )\n  fun loadStyleJson(\n    styleJson: String,\n    onStyleLoaded: Style.OnStyleLoaded? = null,\n    onMapLoadErrorListener: OnMapLoadErrorListener? = null\n  ) {\n    loadStyleUri(styleJson, null, onStyleLoaded, onMapLoadErrorListener)\n  }\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\",\n    replaceWith = ReplaceWith(\"loadStyle(style, onStyleLoaded)\")\n  )\n  fun loadStyleJson(\n    styleJson: String,\n    onStyleLoaded: Style.OnStyleLoaded\n  ) = loadStyleUri(styleJson, null, onStyleLoaded, null)\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\",\n    replaceWith = ReplaceWith(\"loadStyle(style)\")\n  )\n  fun loadStyleJson(\n    styleJson: String,\n  ) = loadStyleUri(styleJson, null, null, null)\n\n  /**\n   * Loads the new map style built from the specified style DSL block. For example:\n   *\n   * mapboxMap.loadStyle(style(Style.DARK) {\n   *   +geoJsonSource(SOURCE_ID) {\n   *     featureCollection(collection)\n   *   }\n   *   +symbolLayer(LAYER_ID, SOURCE_ID) {\n   *     iconImage(IMAGE_ID)\n   *   }\n   * }\n   *\n   * ** Important notes comparing to Maps v10 **:\n   * 1. Parameter `onMapLoadErrorListener` was removed as it was not covering all the map / style loading errors.\n   *  Now if you need to listen to those errors you have to register specific listener in advance, e.g.\n   *  [OnMapLoadErrorListener] should now be registered with [subscribeMapLoadingError];\n   *  you could also subscribe to other events like [subscribeStyleImageMissing] or [subscribeStyleImageRemoveUnused].\n   *\n   * 2. Parameter `styleTransitionOptions` was removed from this overloaded method. Instead you have to add transition options in the DSL block:\n   *\n   *  mapboxMap.loadStyle(style(Style.DARK) {\n   *   +transition {\n   *     duration(100L)\n   *     enablePlacementTransitions(false)\n   *    }\n   *   // other runtime styling\n   * }\n   *\n   * @param styleExtension The style DSL block used to describe the style with runtime styling on top of it.\n   * @param onStyleLoaded callback triggered when the style is successfully loaded.\n   */\n  @OptIn(MapboxExperimental::class)\n  @JvmOverloads\n  fun loadStyle(\n    styleExtension: StyleContract.StyleExtension,\n    onStyleLoaded: Style.OnStyleLoaded? = null,\n  ) {\n    checkNativeMap(\"loadStyle\")\n    initializeStyleLoad(\n      onStyleLoaded = onStyleLoaded,\n      styleDataStyleLoadedListener = { style ->\n        styleExtension.flatLight?.bindTo(style)\n        styleExtension.dynamicLight?.bindTo(style)\n        styleExtension.terrain?.bindTo(style)\n        styleExtension.atmosphere?.bindTo(style)\n        styleExtension.projection?.bindTo(style)\n        styleExtension.transition?.let(style::setStyleTransition)\n        styleExtension.rain?.bindTo(style)\n        styleExtension.snow?.bindTo(style)\n        styleExtension.colorTheme?.let(style::setStyleColorTheme)\n      },\n      styleDataSourcesLoadedListener = { style ->\n        styleExtension.sources.forEach {\n          it.bindTo(style)\n        }\n        styleExtension.layers.forEach { (layer, layerPosition) ->\n          layer.bindTo(style, layerPosition)\n        }\n      },\n      styleDataSpritesLoadedListener = { style ->\n        styleExtension.images.forEach {\n          it.bindTo(style)\n        }\n        // note - it is not strictly required to load models here, models can be loaded anytime during style load flow\n        styleExtension.models.forEach {\n          it.bindTo(style)\n        }\n      },\n    )\n    applyStyle(styleExtension.style)\n  }\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Suppress(\"UNUSED_PARAMETER\")\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\" +\n      \" IMPORTANT: onMapLoadErrorListener and styleTransitionOptions will not be applied anymore,\" +\n      \" please refer to documentation for new method to understand how to apply them properly.\",\n    replaceWith = ReplaceWith(\"loadStyle(styleExtension, onStyleLoaded)\")\n  )\n  fun loadStyle(\n    styleExtension: StyleContract.StyleExtension,\n    styleTransitionOptions: TransitionOptions? = null,\n    onStyleLoaded: Style.OnStyleLoaded? = null,\n    onMapLoadErrorListener: OnMapLoadErrorListener? = null,\n  ) {\n    loadStyle(styleExtension, onStyleLoaded)\n  }\n\n  /**\n   * Legacy method to load style, please refer to deprecation message for more details.\n   */\n  @Suppress(\"UNUSED_PARAMETER\")\n  @Deprecated(\n    message = \"Loading style was revisited in v11, this method is deprecated.\" +\n      \" IMPORTANT: onMapLoadErrorListener will not be triggered anymore,\" +\n      \" please refer to documentation for new method to understand how to handle errors.\",\n    replaceWith = ReplaceWith(\"loadStyle(styleExtension, onStyleLoaded)\")\n  )\n  fun loadStyle(\n    styleExtension: StyleContract.StyleExtension,\n    onStyleLoaded: Style.OnStyleLoaded? = null,\n    onMapLoadErrorListener: OnMapLoadErrorListener? = null\n  ) {\n    loadStyle(styleExtension, onStyleLoaded)\n  }\n\n  private fun initializeStyleLoad(\n    onStyleLoaded: Style.OnStyleLoaded? = null,\n    styleDataStyleLoadedListener: Style.OnStyleLoaded,\n    styleDataSpritesLoadedListener: Style.OnStyleLoaded? = null,\n    styleDataSourcesLoadedListener: Style.OnStyleLoaded? = null,\n  ) {\n    style = null\n    styleObserver.setLoadStyleListener(\n      onStyleLoaded,\n      styleDataStyleLoadedListener = styleDataStyleLoadedListener,\n      styleDataSpritesLoadedListener = styleDataSpritesLoadedListener,\n      styleDataSourcesLoadedListener = styleDataSourcesLoadedListener,\n    )\n    isStyleLoadInitiated = true\n  }\n\n  /**\n   * Get the Style of the map synchronously, will return null is style is not loaded yet.\n   *\n   * Note: keeping the reference to an invalid [Style] instance introduces significant native memory leak,\n   * see [Style.isValid] for more details.\n   *\n   * @return currently loaded [Style] object or NULL if it is not loaded.\n   */\n  @Deprecated(\n    \"This method is deprecated, and will be removed in next major release. Use [style] property instead.\",\n    replaceWith = ReplaceWith(\"style\")\n  )\n  // Hide it from Java. They will use [style] property getter above. Moreover, mangle the name\n  // in Java to avoid \"platform declaration clash\".\n  @JvmSynthetic @JvmName(\"getStyleDeprecated\")\n  fun getStyle(): Style? = style\n\n  /**\n   * Get the [Style] of the map asynchronously.\n   *\n   * Note: keeping the reference to an invalid [Style] instance introduces significant native memory leak,\n   * see [Style.isValid] for more details.\n   *\n   * @param onStyleLoaded the callback to be invoked when the style is fully loaded\n   */\n  fun getStyle(onStyleLoaded: Style.OnStyleLoaded) {\n    checkNativeMap(\"getStyle\")\n    style?.let(onStyleLoaded::onStyleLoaded)\n      ?: styleObserver.addGetStyleListener(onStyleLoaded)\n  }\n\n  /**\n   * Changes the map view by any combination of center, zoom, bearing, and pitch, without an animated transition.\n   * The map will retain its current values for any details not passed via the camera options argument.\n   * It is not guaranteed that the provided CameraOptions will be set, the map may apply constraints resulting in a\n   * different CameraState.\n   *\n   * @param cameraOptions New camera options\n   */\n  override fun setCamera(cameraOptions: CameraOptions) {\n    checkNativeMap(\"setCamera\")\n    nativeMap.setCamera(cameraOptions)\n  }\n\n  /**\n   * Tells the map rendering engine that there is currently a gesture in progress. This\n   * affects how the map renders labels, as it will use different texture filters if a gesture\n   * is ongoing.\n   *\n   * @param inProgress The `boolean` value representing if a gesture is in progress.\n   */\n  override fun setGestureInProgress(inProgress: Boolean) {\n    checkNativeMap(\"setGestureInProgress\")\n    nativeMap.setGestureInProgress(inProgress)\n  }\n\n  /**\n   * Returns if a gesture is in progress.\n   *\n   * @return Returns if a gesture is in progress\n   */\n  override fun isGestureInProgress(): Boolean {\n    checkNativeMap(\"isGestureInProgress\")\n    return nativeMap.isGestureInProgress()\n  }\n\n  /**\n   * Set the map north orientation\n   *\n   * @param northOrientation The map north orientation to set\n   */\n  override fun setNorthOrientation(northOrientation: NorthOrientation) {\n    checkNativeMap(\"setNorthOrientation\")\n    nativeMap.setNorthOrientation(northOrientation)\n  }\n\n  /**\n   * Set the map constrain mode\n   *\n   * @param constrainMode The map constraint mode to set\n   */\n  override fun setConstrainMode(constrainMode: ConstrainMode) {\n    checkNativeMap(\"setConstrainMode\")\n    nativeMap.setConstrainMode(constrainMode)\n  }\n\n  /**\n   * Set the map viewport mode\n   *\n   * @param viewportMode The map viewport mode to set\n   */\n  override fun setViewportMode(viewportMode: ViewportMode) {\n    checkNativeMap(\"setViewportMode\")\n    nativeMap.setViewportMode(viewportMode)\n  }\n\n  /**\n   * Set the map bounds.\n   *\n   * @param options the map bound options\n   */\n  override fun setBounds(options: CameraBoundsOptions): Expected<String, None> {\n    checkNativeMap(\"setBounds\")\n    return nativeMap.setBounds(options)\n  }\n\n  /**\n   * Get the map bounds options.\n   *\n   * @return Returns the map bounds options\n   */\n  override fun getBounds(): CameraBounds {\n    checkNativeMap(\"getBounds\")\n    return nativeMap.getBounds()\n  }\n\n  /**\n   * Tells the map rendering engine that the animation is currently performed by the\n   * user (e.g. with a `setCamera()` calls series). It adjusts the engine for the animation use case.\n   * In particular, it brings more stability to symbol placement and rendering.\n   *\n   * @param inProgress Bool representing if user animation is in progress\n   */\n  override fun setUserAnimationInProgress(inProgress: Boolean) {\n    checkNativeMap(\"setUserAnimationInProgress\")\n    nativeMap.setUserAnimationInProgress(inProgress)\n  }\n\n  /**\n   * This method provides hints for animations, enabling the rendering engine to pre-process animation\n   * frames and apply performance optimizations.\n   *\n   * The provided data is taken into action on the next\n   * [setUserAnimationInProgress(true)][setUserAnimationInProgress] call.\n   *\n   * @param cameraAnimationHint the camera animation hint\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  @MapboxExperimental\n  override fun setCameraAnimationHint(cameraAnimationHint: CameraAnimationHint) {\n    checkNativeMap(\"setCameraAnimationHint\")\n    nativeMap.setCameraAnimationHint(cameraAnimationHint)\n  }\n\n  /**\n   * Returns if user animation is currently in progress.\n   *\n   * @return Return true if a user animation is in progress.\n   */\n  override fun isUserAnimationInProgress(): Boolean {\n    checkNativeMap(\"isUserAnimationInProgress\")\n    return nativeMap.isUserAnimationInProgress()\n  }\n\n  /**\n   * Set the prefetch zoom delta\n   *\n   * @param delta The prefetch zoom delta\n   */\n  fun setPrefetchZoomDelta(delta: Byte) {\n    checkNativeMap(\"setPrefetchZoomDelta\")\n    nativeMap.setPrefetchZoomDelta(delta)\n  }\n\n  /**\n   * Get the prefetch zoom delta\n   *\n   * @return Returns the prefetch zoom delta\n   */\n  fun getPrefetchZoomDelta(): Byte {\n    checkNativeMap(\"getPrefetchZoomDelta\")\n    return nativeMap.getPrefetchZoomDelta()\n  }\n\n  /**\n   * Get map options.\n   *\n   * @return Returns map options\n   */\n  override fun getMapOptions(): MapOptions {\n    checkNativeMap(\"getMapOptions\")\n    return nativeMap.getMapOptions()\n  }\n\n  /**\n   * Gets the size of the map.\n   *\n   * @return size The size of the map in MapOptions#size platform pixels\n   */\n  override fun getSize(): Size {\n    checkNativeMap(\"getSize\")\n    return nativeMap.getSize()\n  }\n\n  /**\n   * Execute the provided [action] when map size becomes ready.\n   * Will be executed synchronously if map size is ready at the moment of invocation.\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  @MapboxExperimental\n  fun whenSizeReady(action: () -> Unit) {\n    checkNativeMap(\"whenSizeReady\")\n    nativeMap.whenMapSizeReady(action)\n  }\n\n  /**\n   * Get debug options\n   */\n  @Deprecated(\"Use `MapView.debugOptions` instead.\")\n  fun getDebug(): List<MapDebugOptions> {\n    checkNativeMap(\"getDebug\")\n    return nativeMap.getDebug()\n  }\n\n  /**\n   * Set debug options\n   */\n  @Deprecated(\"Use `MapView.debugOptions` instead.\")\n  fun setDebug(debugOptions: List<MapDebugOptions>, enabled: Boolean) {\n    checkNativeMap(\"setDebug\")\n    nativeMap.setDebug(debugOptions, enabled)\n  }\n\n  internal var debugOptions: Set<MapDebugOptions>\n    get() {\n      checkNativeMap(\"getDebug\")\n      return nativeMap.getDebug().toSet()\n    }\n    set(value) {\n      checkNativeMap(\"setDebug\")\n      // disable previously selected options\n      nativeMap.setDebug(nativeMap.getDebug(), false)\n\n      // enable new set of options\n      nativeMap.setDebug(value.toList(), true)\n    }\n\n  /**\n   * Convert the given [bounds], [boundsPadding], [bearing] and [pitch] values to [CameraOptions].\n   * Note that this method takes into account the current map padding in addition to the\n   * [boundsPadding] provided in parameters.\n   *\n   * In order for this method to produce correct results [MapView] must be already\n   * measured and inflated to have correct width and height values.\n   * Calling this method in [Activity.onCreate] will lead to incorrect results.\n   *\n   * @param bounds The [CoordinateBounds] of the camera.\n   * @param boundsPadding The amount of padding in [EdgeInsets] to add to the given bounds.\n   * @param bearing The bearing of the camera.\n   * @param pitch The pitch of the camera.\n   * @param maxZoom The maximum zoom level allowed in the returned camera options.\n   * @param offset The center of the given bounds relative to map center in pixels.\n   *\n   * @return the converted [CameraOptions]. Padding is absent in the returned [CameraOptions]\n   * as the zoom level already accounts for the [boundsPadding] provided.\n   */\n  @Deprecated(\n    message = \"Deprecated\",\n    replaceWith = ReplaceWith(\"cameraForCoordinates(coordinates, camera, coordinatesPadding, maxZoom, offset, result)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun cameraForCoordinateBounds(\n    bounds: CoordinateBounds,\n    boundsPadding: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?,\n    maxZoom: Double?,\n    offset: ScreenCoordinate?\n  ): CameraOptions {\n    checkNativeMap(\"cameraForCoordinateBounds\")\n    return nativeMap.cameraForCoordinateBounds(\n      bounds,\n      boundsPadding,\n      bearing,\n      pitch,\n      maxZoom,\n      offset,\n    )\n  }\n\n  /**\n   * Convenience method that returns the [CameraOptions] object for given parameters.\n   * This method takes into account the current map padding in addition to the padding provided in parameters.\n   *\n   * @param coordinates The `coordinates` representing the bounds of the camera.\n   * @param coordinatesPadding The amount of padding in pixels to add to the given `coordinates`.\n   * @param bearing The bearing of the camera.\n   * @param pitch The pitch of the camera.\n   *\n   * @return The [CameraOptions] object representing the provided parameters. Padding is absent in the returned [CameraOptions] as the zoom level already accounts for the padding.\n   */\n  @Deprecated(\n    message = \"Deprecated\",\n    replaceWith = ReplaceWith(\"cameraForCoordinates(coordinates, camera, coordinatesPadding, maxZoom, offset, result)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun cameraForCoordinates(\n    coordinates: List<Point>,\n    coordinatesPadding: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?\n  ): CameraOptions {\n    checkNativeMap(\"cameraForCoordinates\")\n    return nativeMap.cameraForCoordinates(\n      calculateBoundingBox(coordinates),\n      coordinatesPadding,\n      bearing,\n      pitch\n    )\n  }\n\n  /**\n   * Convenience method that adjusts the provided [CameraOptions] object for given parameters.\n   *\n   * Returns the provided `camera` options with zoom adjusted to fit `coordinates` into the `box`, so that `coordinates` on the left,\n   * top, right, and bottom of the effective `camera` center at the principal point of the projection (defined by `padding`) fit into the `box`.\n   * Returns the provided `camera` options object unchanged upon an error.\n   *\n   * The method fails if the principal point is positioned outside of the `box`\n   * or if there is no sufficient screen space, defined by principal point and the `box`, to fit the geometry.\n   * Additionally, in cases when the principal point is positioned exactly on one of the edges of the `box`,\n   * any geometry point that spans further than that edge on the same axis cannot possibly be framed and is ignored for zoom level calculation purposes.\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param coordinates The `coordinates` representing the bounds of the camera.\n   * @param camera The [CameraOptions] for which zoom should be adjusted. Note that the `camera.center`, and `camera.zoom` (as fallback) is required.\n   * @param box The [ScreenBox] into which [coordinates] should fit.\n   *\n   * @return The [CameraOptions] object with the zoom level adjusted to fit [coordinates] into the [box].\n   */\n  @Deprecated(\n    message = \"Deprecated\",\n    replaceWith = ReplaceWith(\"cameraForCoordinates(coordinates, camera, coordinatesPadding, maxZoom, offset, result)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun cameraForCoordinates(\n    coordinates: List<Point>,\n    camera: CameraOptions,\n    box: ScreenBox\n  ): CameraOptions {\n    checkNativeMap(\"cameraForCoordinates\")\n    return nativeMap.cameraForCoordinates(calculateBoundingBox(coordinates), camera, box)\n  }\n\n  /**\n   * Convenience method that returns the [CameraOptions] object for given parameters.\n   *\n   * Important: if the render thread did not yet calculate the size of the map (due to initialization or map resizing) - empty [CameraOptions] will be returned.\n   * Emptiness could be checked with [CameraOptions.isEmpty]. Consider using asynchronous overloaded method:\n   *    ```\n   *    fun cameraForCoordinates(\n   *     coordinates: List<Point>,\n   *     camera: CameraOptions,\n   *     coordinatesPadding: EdgeInsets?,\n   *     maxZoom: Double?,\n   *     offset: ScreenCoordinate?,\n   *     result: (CameraOptions) -> Unit\n   *    )\n   *    ```\n   * Consider using this synchronous method ONLY when you are absolutely sure that map is fully ready.\n   *\n   * @param coordinates The `coordinates` representing the bounds of the camera.\n   * @param camera The [CameraOptions] which will be applied before calculating the camera for the coordinates. If any of the fields in [CameraOptions] are not provided then the current value from the map for that field will be used.\n   * @param coordinatesPadding The amount of padding in pixels to add to the given `coordinates`.\n   *                           Note: This padding is not applied to the map but to the coordinates provided. If you want to apply padding to the map use param `camera`.\n   * @param maxZoom The maximum zoom level allowed in the returned camera options.\n   * @param offset The center of the given bounds relative to map center in pixels.\n   *\n   * @return The [CameraOptions] object representing the provided parameters if the map size was calculated and empty [CameraOptions] otherwise, see [CameraOptions.isEmpty].\n   *  Also empty [CameraOptions] are returned in case of an internal error.\n   */\n  @MapboxDelicateApi\n  override fun cameraForCoordinates(\n    coordinates: List<Point>,\n    camera: CameraOptions,\n    coordinatesPadding: EdgeInsets?,\n    maxZoom: Double?,\n    offset: ScreenCoordinate?\n  ): CameraOptions {\n    checkNativeMap(\"cameraForCoordinates\")\n    if (!nativeMap.sizeSet) {\n      return cameraOptions { }\n    }\n    return nativeMap.cameraForCoordinates(\n      calculateBoundingBox(coordinates),\n      camera,\n      coordinatesPadding,\n      maxZoom,\n      offset\n    ).getValueOrElse {\n      logW(\n        TAG,\n        \"Error occurred in synchronous cameraForCoordinates(coordinates: $coordinates, camera: $camera, coordinatesPadding: $coordinatesPadding, maxZoom: $maxZoom, offset: $offset, mapSize: ${nativeMap.getSize()}): $it, empty cameraState will be returned\"\n      )\n      return@getValueOrElse cameraOptions { }\n    }\n  }\n\n  /**\n   * Convenience method that returns the [CameraOptions] object for given parameters.\n   *\n   * @param coordinates The `coordinates` representing the bounds of the camera.\n   * @param camera The [CameraOptions] which will be applied before calculating the camera for the coordinates. If any of the fields in [CameraOptions] are not provided then the current value from the map for that field will be used.\n   * @param coordinatesPadding The amount of padding in pixels to add to the given `coordinates`.\n   *                           Note: This padding is not applied to the map but to the coordinates provided. If you want to apply padding to the map use param `camera`.\n   * @param maxZoom The maximum zoom level allowed in the returned camera options.\n   * @param offset The center of the given bounds relative to map center in pixels.\n   * @param result Callback returning the [CameraOptions] object representing the provided parameters. Those [CameraOptions] always take into account actual MapView size and may return empty ([CameraOptions.isEmpty]) options only if an internal error has occurred.\n   */\n  override fun cameraForCoordinates(\n    coordinates: List<Point>,\n    camera: CameraOptions,\n    coordinatesPadding: EdgeInsets?,\n    maxZoom: Double?,\n    offset: ScreenCoordinate?,\n    result: (CameraOptions) -> Unit\n  ) {\n    checkNativeMap(\"cameraForCoordinates\")\n    nativeMap.whenMapSizeReady {\n      result.invoke(\n        nativeMap.cameraForCoordinates(\n          calculateBoundingBox(coordinates),\n          camera,\n          coordinatesPadding,\n          maxZoom,\n          offset\n        ).getValueOrElse {\n          logW(\n            TAG,\n            \"Error occurred in asynchronous cameraForCoordinates(coordinates: $coordinates, camera: $camera, coordinatesPadding: $coordinatesPadding, maxZoom: $maxZoom, offset: $offset, mapSize: ${nativeMap.getSize()}): $it, empty cameraState will be returned\"\n          )\n          return@getValueOrElse cameraOptions { }\n        }\n      )\n    }\n  }\n\n  /**\n   * Convert the given [geometry], [geometryPadding], [bearing] and [pitch] values to [CameraOptions].\n   * Note that this method takes into account the current map padding in addition to the\n   * [geometryPadding] provided in parameters.\n   *\n   * In order for this method to produce correct results [MapView] must be already\n   * measured and inflated to have correct width and height values.\n   * Calling this method in [Activity.onCreate] will lead to incorrect results.\n   *\n   * @param geometry The [Geometry] to take in account when converting\n   * @param geometryPadding The optional amount of padding in pixels to add to the given [geometry].\n   * @param bearing The optional bearing to take in account when converting\n   * @param pitch The optional pitch to take in account when converting\n   *\n   * @return Returns the converted [CameraOptions]. Padding is absent in the returned\n   * [CameraOptions] as the zoom level already accounts for the [geometryPadding] provided.\n   */\n  @Deprecated(\n    message = \"Deprecated\",\n    replaceWith = ReplaceWith(\"cameraForCoordinates(coordinates, camera, coordinatesPadding, maxZoom, offset, result)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun cameraForGeometry(\n    geometry: Geometry,\n    geometryPadding: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?\n  ): CameraOptions {\n    checkNativeMap(\"cameraForGeometry\")\n    return nativeMap.cameraForGeometry(geometry, geometryPadding, bearing, pitch)\n  }\n\n  /**\n   * Returns the [CoordinateBounds] for a given camera.\n   *\n   * Note that if the given `camera` shows the antimeridian, the returned wrapped [CoordinateBounds]\n   * might not represent the minimum bounding box.\n   *\n   * This API isn't supported by Globe projection and will return a no-op result matching the world\n   * bounds.\n   * See [com.mapbox.maps.extension.style.projection.generated.setProjection]\n   * and [com.mapbox.maps.extension.style.projection.generated.getProjection]\n   *\n   * @param camera The [CameraOptions] to use for calculating [CoordinateBounds].\n   *\n   * @return The [CoordinateBounds] object representing a given `camera`.\n   */\n  override fun coordinateBoundsForCamera(camera: CameraOptions): CoordinateBounds {\n    checkNativeMap(\"coordinateBoundsForCamera\")\n    return nativeMap.coordinateBoundsForCamera(camera)\n  }\n\n  /**\n   * Returns the [CoordinateBounds] for a given camera.\n   *\n   * This method is useful if the `camera` shows the antimeridian.\n   *\n   * This API isn't supported by Globe projection and will return a no-op result matching the world\n   * bounds.\n   * See [com.mapbox.maps.extension.style.projection.generated.setProjection]\n   * and [com.mapbox.maps.extension.style.projection.generated.getProjection]\n   *\n   * @param camera The [CameraOptions] to use for calculating [CoordinateBounds].\n   *\n   * @return The [CoordinateBounds] object representing a given `camera`.\n   */\n  override fun coordinateBoundsForCameraUnwrapped(camera: CameraOptions): CoordinateBounds {\n    checkNativeMap(\"coordinateBoundsForCameraUnwrapped\")\n    return nativeMap.coordinateBoundsForCameraUnwrapped(camera)\n  }\n\n  /**\n   *  Returns the coordinate bounds and zoom for a given camera.\n   *\n   * In order for this method to produce correct results [MapView] must be already\n   * measured and inflated to have correct width and height values.\n   * Calling this method in [Activity.onCreate] will lead to incorrect results.\n   *\n   * Note that if the given camera shows the antimeridian, the returned wrapped bounds\n   * might not represent the minimum bounding box.\n   *\n   * See also {@link #coordinateBoundsZoomForCameraUnwrapped}\n   *\n   * This API isn't supported by Globe projection and will return a no-op result matching the world\n   * bounds\n   * See [com.mapbox.maps.extension.style.projection.generated.setProjection]\n   * and [com.mapbox.maps.extension.style.projection.generated.getProjection]\n   *\n   *  @return Returns the coordinate bounds and zoom for a given camera.\n   */\n  override fun coordinateBoundsZoomForCamera(camera: CameraOptions): CoordinateBoundsZoom {\n    checkNativeMap(\"coordinateBoundsZoomForCamera\")\n    return nativeMap.coordinateBoundsZoomForCamera(camera)\n  }\n\n  /**\n   * Returns the unwrapped coordinate bounds and zoom for a given camera.\n   *\n   * In order for this method to produce correct results [MapView] must be already\n   * measured and inflated to have correct width and height values.\n   * Calling this method in [Activity.onCreate] will lead to incorrect results.\n   *\n   * This method is particularly useful, if the camera shows the antimeridian.\n   *\n   * This API isn't supported by Globe projection and will return a no-op result matching the\n   * world bounds.\n   * See [com.mapbox.maps.extension.style.projection.generated.setProjection]\n   * and [com.mapbox.maps.extension.style.projection.generated.getProjection]\n   *\n   *  @return Returns the unwrapped coordinate bounds and zoom for a given camera.\n   */\n  override fun coordinateBoundsZoomForCameraUnwrapped(camera: CameraOptions): CoordinateBoundsZoom {\n    checkNativeMap(\"coordinateBoundsZoomForCameraUnwrapped\")\n    return nativeMap.coordinateBoundsZoomForCameraUnwrapped(camera)\n  }\n\n  /**\n   * Returns the [CoordinateBounds] for given [RectF] defined in screen points.\n   *\n   * The screen points are in `platform pixels` relative to the top left corner\n   * of the map (not of the whole screen).\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param rectF rectangle area defined in screen points.\n   * @return [CoordinateBounds] representing given [RectF].\n   * @throws [IllegalArgumentException] if [RectF] is empty\n   */\n  override fun coordinateBoundsForRect(rectF: RectF): CoordinateBounds {\n    checkNativeMap(\"coordinateBoundsForRect\")\n    if (rectF.isEmpty) throw IllegalArgumentException(\"RectF must not be empty\")\n    val coordinates = nativeMap.coordinatesForPixels(\n      mutableListOf(\n        // bottom-left corresponds to southwest\n        ScreenCoordinate(rectF.bottom.toDouble(), rectF.left.toDouble()),\n        // top-right corresponds to northeast\n        ScreenCoordinate(rectF.top.toDouble(), rectF.right.toDouble()),\n      )\n    )\n    return CoordinateBounds(\n      /* southwest */ coordinates[0],\n      /* northeast */ coordinates[1]\n    )\n  }\n\n  /**\n   * Calculate a screen coordinate that corresponds to a geographical coordinate\n   * (i.e., longitude-latitude pair).\n   *\n   * The screen coordinate is in [MapOptions.size] platform pixels relative to the top left\n   * of the map (not of the whole screen).\n   *\n   * Map must be fully loaded for getting an altitude-compliant result if using 3D terrain.\n   *\n   * If the screen coordinate is outside of the bounds of [MapView] the returned screen coordinate\n   * contains -1 for both coordinates.\n   *\n   * This API isn't supported by Globe projection and will return a no-op result matching center of\n   * the screen.\n   * See [com.mapbox.maps.extension.style.projection.generated.setProjection]\n   * and [com.mapbox.maps.extension.style.projection.generated.getProjection]\n   *\n   * @param coordinate A geographical coordinate on the map to convert to a screen coordinate.\n   *\n   * @return Returns a screen coordinate on the screen in [MapOptions.size] platform pixels. If the screen coordinate is outside of the bounds of [MapView] the returned screen coordinate contains -1 for both coordinates.\n   */\n  override fun pixelForCoordinate(coordinate: Point): ScreenCoordinate {\n    checkNativeMap(\"pixelForCoordinate\")\n    return nativeMap.pixelForCoordinate(coordinate).clampScreenCoordinate()\n  }\n\n  /**\n   * Calculate screen coordinates that corresponds to geographical coordinates\n   * (i.e., longitude-latitude pair).\n   *\n   * The screen coordinates are in [MapOptions.size] platform pixels relative to the top left\n   * of the map (not of the whole screen).\n   *\n   * Map must be fully loaded for getting an altitude-compliant result if using 3D terrain.\n   *\n   * This API isn't supported by Globe projection and will return a no-op result matching the center\n   * of the screen.\n   * See [com.mapbox.maps.extension.style.projection.generated.setProjection]\n   * and [com.mapbox.maps.extension.style.projection.generated.getProjection]\n   *\n   * @param coordinates A batch of geographical coordinates on the map to convert to screen coordinates.\n   *\n   * @return Returns a batch of screen coordinates on the screen in [MapOptions.size] platform pixels.\n   */\n  override fun pixelsForCoordinates(coordinates: List<Point>): List<ScreenCoordinate> {\n    checkNativeMap(\"pixelsForCoordinates\")\n    return nativeMap.pixelsForCoordinates(coordinates.toMutableList()).map { it.clampScreenCoordinate() }\n  }\n\n  /**\n   * Clamp screen coordinate to the bound of [MapView].\n   * If the screen coordinate is outside of the bounds of [MapView] the returned screen coordinate\n   * contains -1 for both coordinates.\n   */\n  private fun ScreenCoordinate.clampScreenCoordinate(): ScreenCoordinate {\n    val screenSize = nativeMap.getSize()\n\n    var x = this.x\n    var y = this.y\n\n    if (this.x < 0.0 || this.x > screenSize.width) {\n      x = this.x.roundToInt().toDouble()\n    }\n\n    if (this.y < 0.0 || this.y > screenSize.height) {\n      y = this.y.roundToInt().toDouble()\n    }\n    return if (x in 0.0..screenSize.width.toDouble() && y in 0.0..screenSize.height.toDouble()) {\n      ScreenCoordinate(x, y)\n    } else {\n      ScreenCoordinate(-1.0, -1.0)\n    }\n  }\n\n  /**\n   * Calculate a geographical coordinate(i.e., longitude-latitude pair) that corresponds\n   * to a screen coordinate.\n   *\n   * The screen coordinate is in [MapOptions.size] platform pixels relative to the top left\n   * of the map (not of the whole screen).\n   *\n   * Map must be fully loaded for getting an altitude-compliant result if using 3D terrain.\n   *\n   * This API isn't supported by Globe projection and will return a no-op result matching the center\n   * of the screen.\n   * See [com.mapbox.maps.extension.style.projection.generated.setProjection]\n   * and [com.mapbox.maps.extension.style.projection.generated.getProjection]\n   *\n   * @param pixel A screen coordinate represented by x y coordinates.\n   *\n   * @return Returns a geographical coordinate corresponding to the x y coordinates\n   * on the screen.\n   */\n  override fun coordinateForPixel(pixel: ScreenCoordinate): Point {\n    checkNativeMap(\"coordinateForPixel\")\n    return nativeMap.coordinateForPixel(pixel)\n  }\n\n  /**\n   * Calculate geographical coordinates(i.e., longitude-latitude pair) that corresponds\n   * to screen coordinates.\n   *\n   * The screen coordinates are in [MapOptions.size] platform pixels relative to the top left\n   * of the map (not of the whole screen).\n   *\n   * Map must be fully loaded for getting an altitude-compliant result if using 3D terrain.\n   *\n   * This API isn't supported by Globe projection and will return a no-op result matching the center\n   * of the screen.\n   * See [com.mapbox.maps.extension.style.projection.generated.setProjection]\n   * and [com.mapbox.maps.extension.style.projection.generated.getProjection]\n   *\n   * @param pixels A batch of screen coordinates on the screen in [MapOptions.size] platform pixels.\n   *\n   * @return Returns a batch of geographical coordinates corresponding to the screen coordinates\n   * on the screen.\n   */\n  override fun coordinatesForPixels(pixels: List<ScreenCoordinate>): List<Point> {\n    checkNativeMap(\"coordinatesForPixels\")\n    return nativeMap.coordinatesForPixels(pixels.toMutableList())\n  }\n\n  /**\n   * Calculates the geographical coordinate information that corresponds to a given screen coordinate.\n   *\n   * The screen coordinate is in platform pixels, relative to the top left corner of the map (not the whole screen).\n   *\n   * The returned coordinate will be the closest position projected onto the map surface,\n   * in case the screen coordinate does not intersect with the map surface.\n   *\n   * @param pixel The screen coordinate on the map, in platform pixels.\n   *\n   * @return A CoordinateInfo record containing information about the geographical coordinate corresponding to the given screen coordinate, including whether it is on the map surface.\n   *\n   */\n  override fun coordinateInfoForPixel(pixel: ScreenCoordinate): CoordinateInfo {\n    checkNativeMap(\"coordinateInfoForPixel\")\n    return nativeMap.coordinateInfoForPixel(pixel)\n  }\n\n  /**\n   * Calculates the geographical coordinates information that corresponds to the given screen coordinates.\n   *\n   * The screen coordinates are in platform pixels, relative to the top left corner of the map (not the whole screen).\n   *\n   * The returned coordinate will be the closest position projected onto the map surface,\n   * in case the screen coordinate does not intersect with the map surface.\n   *\n   * @param pixels The list of screen coordinates on the map, in platform pixels.\n   *\n   * @return The CoordinateInfo records containing information about the geographical coordinates corresponding to the given screen coordinates, including whether they are on the map surface.\n   *\n   */\n  override fun coordinatesInfoForPixels(pixels: List<ScreenCoordinate>): List<CoordinateInfo> {\n    checkNativeMap(\"coordinatesInfoForPixels\")\n    return nativeMap.coordinatesInfoForPixels(pixels)\n  }\n\n  /**\n   * Calculate distance spanned by one pixel at the specified latitude\n   * and zoom level.\n   *\n   * @param latitude The latitude for which to return the value\n   * @param zoom The zoom level\n   *\n   * @return Returns the distance measured in meters.\n   */\n  override fun getMetersPerPixelAtLatitude(latitude: Double, zoom: Double): Double {\n    return Projection.getMetersPerPixelAtLatitude(latitude, zoom)\n  }\n\n  /**\n   * Calculate distance spanned by one pixel at the specified latitude\n   * at current zoom level.\n   *\n   * @param latitude The latitude for which to return the value\n   *\n   * @return Returns the distance measured in meters.\n   */\n  override fun getMetersPerPixelAtLatitude(latitude: Double): Double {\n    return Projection.getMetersPerPixelAtLatitude(latitude, cameraState.zoom)\n  }\n\n  /**\n   * Calculate Spherical Mercator ProjectedMeters coordinates.\n   *\n   * @param point A longitude-latitude pair for which to calculate\n   * ProjectedMeters coordinates\n   *\n   * @return Returns Spherical Mercator ProjectedMeters coordinates\n   */\n  override fun projectedMetersForCoordinate(point: Point): ProjectedMeters {\n    return Projection.projectedMetersForCoordinate(point)\n  }\n\n  /**\n   * Calculate a longitude-latitude pair for a Spherical Mercator projected\n   * meters.\n   *\n   * @param projectedMeters Spherical Mercator ProjectedMeters coordinates for\n   * which to calculate a longitude-latitude pair.\n   *\n   * @return Returns a longitude-latitude pair.\n   */\n  override fun coordinateForProjectedMeters(projectedMeters: ProjectedMeters): Point {\n    return Projection.coordinateForProjectedMeters(projectedMeters)\n  }\n\n  /**\n   * Calculate a point on the map in Mercator Projection for a given\n   * coordinate at the specified zoom scale.\n   *\n   * @param point The longitude-latitude pair for which to return the value.\n   * @param zoomScale The current zoom factor applied on the map, is used to\n   * calculate the world size as tileSize * zoomScale (i.e., 512 * 2 ^ Zoom level)\n   * where tileSize is the width of a tile in pixels.\n   *\n   * @return Returns a point on the map in Mercator projection.\n   */\n  override fun project(point: Point, zoomScale: Double): MercatorCoordinate {\n    return Projection.project(point, zoomScale)\n  }\n\n  /**\n   * Calculate a coordinate for a given point on the map in Mercator Projection.\n   *\n   * @param coordinate Point on the map in Mercator projection.\n   * @param zoomScale The current zoom factor applied on the map, is used to\n   * calculate the world size as tileSize * zoomScale (i.e., 512 * 2 ^ Zoom level)\n   * where tileSize is the width of a tile in pixels.\n   *\n   * @return Returns a coordinate.\n   */\n  override fun unproject(coordinate: MercatorCoordinate, zoomScale: Double): Point {\n    return Projection.unproject(coordinate, zoomScale)\n  }\n\n  /**\n   * Queries the map for rendered features.\n   *\n   * @param geometry The `screen pixel coordinates` (point, line string or box) to query for rendered features.\n   * @param options The `render query options` for querying rendered features.\n   * @param callback The `query features callback` called when the query completes.\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  override fun queryRenderedFeatures(\n    geometry: RenderedQueryGeometry,\n    options: RenderedQueryOptions,\n    callback: QueryRenderedFeaturesCallback,\n  ): Cancelable {\n    checkNativeMap(\"queryRenderedFeatures\", false)\n    return nativeMap.queryRenderedFeatures(geometry, options, callback)\n  }\n\n  /**\n   * Queries the map for source features.\n   *\n   * @param sourceId The style source identifier used to query for source features.\n   * @param options The `source query options` for querying source features.\n   * @param callback The `query features callback` called when the query completes.\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   *\n   * Note: In order to get expected results, the corresponding source needs to be in use and\n   * the query shall be made after the corresponding source data is loaded.\n   */\n  override fun querySourceFeatures(\n    sourceId: String,\n    options: SourceQueryOptions,\n    callback: QuerySourceFeaturesCallback\n  ): Cancelable {\n    checkNativeMap(\"querySourceFeatures\", false)\n    return nativeMap.querySourceFeatures(sourceId, options, callback)\n  }\n\n  /**\n   * Queries the map for rendered raster values at a specific coordinate.\n   *\n   * @param coordinate The position on the screen to query.\n   * @param options The options for configuring the rendered raster value query.\n   * @param callback Callback invoked when the query completes\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  @MapboxExperimental\n  override fun queryRenderedRasterValues(\n    coordinate: ScreenCoordinate,\n    options: RenderedRasterQueryOptions,\n    callback: QueryRenderedRasterValuesCallback\n  ): Cancelable {\n    checkNativeMap(\"queryRenderedRasterValues\", false)\n    return nativeMap.queryRenderedRasterValues(coordinate, options, callback)\n  }\n\n  /**\n   * In some cases querying source / render features is expected to be a blocking operation\n   * e.g. performing this action on map click. In this case in order to avoid deadlock on main\n   * thread querying could be performed on render thread and in that case querying result will be also\n   * delivered on render thread not leading to the main thread deadlock. Example:\n   *\n   * fun onMapClick() {\n   *  executeOnRenderThread {\n   *    queryRenderedFeatures(pixel, options) {\n   *      // result callback called, do needed actions\n   *      lock.notify()\n   *    }\n   *  }\n   *  lock.wait()\n   *  return false\n   * }\n   */\n  override fun executeOnRenderThread(runnable: Runnable) {\n    checkNativeMap(\"executeOnRenderThread\")\n    renderHandler?.post(runnable)\n  }\n\n  /**\n   * Returns all the leaves (original points) of a cluster (given its cluster_id) from a GeoJsonSource, with pagination support: limit is the number of leaves\n   * to return (set to Infinity for all points), and offset is the amount of points to skip (for pagination).\n   *\n   * Requires configuring the source as a cluster by calling [GeoJsonSource.Builder#cluster(boolean)].\n   *\n   * @param sourceIdentifier GeoJsonSource identifier.\n   * @param cluster Cluster from which to retrieve leaves from\n   * @param limit The number of points to return from the query (must use type [Long], set to maximum for all points). Defaults to 10.\n   * @param offset The amount of points to skip (for pagination, must use type [Long]). Defaults to 0.\n   * @param callback The result will be returned through the [QueryFeatureExtensionCallback].\n   *         The result is a feature collection or a string describing an error if the operation was not successful.\n   *\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  @JvmOverloads\n  fun getGeoJsonClusterLeaves(\n    sourceIdentifier: String,\n    cluster: Feature,\n    limit: Long = QFE_DEFAULT_LIMIT,\n    offset: Long = QFE_DEFAULT_OFFSET,\n    callback: QueryFeatureExtensionCallback,\n  ): Cancelable = nativeMap.queryFeatureExtensions(\n    /* sourceIdentifier = */ sourceIdentifier,\n    /* feature = */ cluster,\n    /* extension = */ QFE_SUPER_CLUSTER,\n    /* extensionField = */ QFE_LEAVES,\n    /* args = */ hashMapOf(QFE_LIMIT to Value(limit), QFE_OFFSET to Value(offset)),\n    /* callback = */ callback\n  )\n\n  /**\n   * Returns the children (original points or clusters) of a cluster (on the next zoom level)\n   * given its id (cluster_id value from feature properties) from a GeoJsonSource.\n   *\n   * Requires configuring the source as a cluster by calling [GeoJsonSource.Builder#cluster(boolean)].\n   *\n   * @param sourceIdentifier GeoJsonSource identifier.\n   * @param cluster cluster from which to retrieve children from\n   * @param callback The result will be returned through the [QueryFeatureExtensionCallback].\n   *         The result is a feature collection or a string describing an error if the operation was not successful.\n   *\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  fun getGeoJsonClusterChildren(\n    sourceIdentifier: String,\n    cluster: Feature,\n    callback: QueryFeatureExtensionCallback,\n  ): Cancelable = nativeMap.queryFeatureExtensions(\n    /* sourceIdentifier = */ sourceIdentifier,\n    /* feature = */ cluster,\n    /* extension = */ QFE_SUPER_CLUSTER,\n    /* extensionField = */ QFE_CHILDREN,\n    /* args = */ null,\n    /* callback = */ callback\n  )\n\n  /**\n   * Returns the zoom on which the cluster expands into several children (useful for \"click to zoom\" feature)\n   * given the cluster's cluster_id (cluster_id value from feature properties) from a GeoJsonSource.\n   *\n   * Requires configuring the source as a cluster by calling [GeoJsonSource.Builder#cluster(boolean)].\n   *\n   * @param sourceIdentifier GeoJsonSource identifier.\n   * @param cluster cluster from which to retrieve the expansion zoom from\n   * @param callback The result will be returned through the [QueryFeatureExtensionCallback].\n   *         The result is a feature extension value containing a value or a string describing an error if the operation was not successful.\n   *\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  fun getGeoJsonClusterExpansionZoom(\n    sourceIdentifier: String,\n    cluster: Feature,\n    callback: QueryFeatureExtensionCallback,\n  ): Cancelable = nativeMap.queryFeatureExtensions(\n    /* sourceIdentifier = */ sourceIdentifier,\n    /* feature = */ cluster,\n    /* extension = */ QFE_SUPER_CLUSTER,\n    /* extensionField = */ QFE_EXPANSION_ZOOM,\n    /* args = */ null,\n    /* callback = */ callback\n  )\n\n  /**\n   * Updates the state object of a feature within a style source.\n   *\n   * Update entries in the `state` object of a given feature within a style source. Only properties of the\n   * `state` object will be updated. A property in the feature `state` object that is not listed in `state` will\n   * retain its previous value. The properties must be paint properties, layout properties are not supported.\n   *\n   * Note that updates to feature `state` are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`. And the corresponding source needs to be in use to ensure the\n   * feature data it contains can be successfully updated.\n   *\n   * @param sourceId The style source identifier.\n   * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n   * @param featureId The feature identifier of the feature whose state should be updated.\n   * @param state The `state` object with properties to update with their respective new values.\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   *\n   */\n  override fun setFeatureState(\n    sourceId: String,\n    sourceLayerId: String?,\n    featureId: String,\n    state: Value,\n    callback: FeatureStateOperationCallback,\n  ): Cancelable {\n    checkNativeMap(\"setFeatureState\")\n    return nativeMap.setFeatureState(\n      /* sourceId = */ sourceId,\n      /* sourceLayerId = */ sourceLayerId,\n      /* featureId = */ featureId,\n      /* state = */ state,\n      /* callback = */ callback\n    )\n  }\n\n  /**\n   * Updates the state object of a feature within a style source.\n   *\n   * Update entries in the `state` object of a given feature within a style source. Only properties of the\n   * `state` object will be updated. A property in the feature `state` object that is not listed in `state` will\n   * retain its previous value. The properties must be paint properties, layout properties are not supported.\n   *\n   * Note that updates to feature `state` are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`. And the corresponding source needs to be in use to ensure the\n   * feature data it contains can be successfully updated.\n   *\n   * @param sourceId The style source identifier.\n   * @param featureId The feature identifier of the feature whose state should be updated.\n   * @param state The `state` object with properties to update with their respective new values.\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   *\n   */\n  fun setFeatureState(\n    sourceId: String,\n    featureId: String,\n    state: Value,\n    callback: FeatureStateOperationCallback,\n  ): Cancelable {\n    return setFeatureState(\n      sourceId = sourceId,\n      sourceLayerId = null,\n      featureId = featureId,\n      state = state,\n      callback = callback\n    )\n  }\n\n  /**\n   * Get the state map of a feature within a style source.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by other methods might not be\n   * immediately visible.\n   *\n   * @param sourceId The style source identifier.\n   * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n   * @param featureId The feature identifier of the feature whose state should be queried.\n   * @param callback The `query feature state callback` called when the query completes.\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  override fun getFeatureState(\n    sourceId: String,\n    sourceLayerId: String?,\n    featureId: String,\n    callback: QueryFeatureStateCallback,\n  ): Cancelable {\n    checkNativeMap(\"getFeatureState\")\n    return nativeMap.getFeatureState(\n      /* sourceId = */ sourceId,\n      /* sourceLayerId = */ sourceLayerId,\n      /* featureId = */ featureId,\n      /* callback = */callback\n    )\n  }\n\n  /**\n   * Get the state map of a feature within a style source.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by other methods might not be\n   * immediately visible.\n   *\n   * @param sourceId The style source identifier.\n   * @param featureId The feature identifier of the feature whose state should be queried.\n   * @param callback The `query feature state callback` called when the query completes.\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  fun getFeatureState(\n    sourceId: String,\n    featureId: String,\n    callback: QueryFeatureStateCallback,\n  ): Cancelable {\n    return getFeatureState(\n      sourceId = sourceId,\n      sourceLayerId = null,\n      featureId = featureId,\n      callback = callback\n    )\n  }\n\n  /**\n   * Removes entries from a feature state object.\n   *\n   * Remove a specified property or all property from a feature's state object, depending on the value of\n   * `stateKey`.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`.\n   *\n   * @param sourceId The style source identifier.\n   * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n   * @param featureId The feature identifier of the feature whose state should be removed.\n   * @param stateKey The key of the property to remove. If `null`, all feature's state object properties are removed.\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   */\n  override fun removeFeatureState(\n    sourceId: String,\n    sourceLayerId: String?,\n    featureId: String,\n    stateKey: String?,\n    callback: FeatureStateOperationCallback,\n  ): Cancelable {\n    checkNativeMap(\"removeFeatureState\")\n    return nativeMap.removeFeatureState(\n      /* sourceId = */\n      sourceId,\n      /* sourceLayerId = */\n      sourceLayerId,\n      /* featureId = */\n      featureId,\n      /* stateKey = */\n      stateKey,\n      /* callback = */\n      callback,\n    )\n  }\n\n  /**\n   * Removes entries from a feature state object.\n   *\n   * Remove a specified property or all property from a feature's state object, depending on the value of\n   * `stateKey`.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`.\n   *\n   * @param sourceId The style source identifier.\n   * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n   * @param featureId The feature identifier of the feature whose state should be removed.\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   */\n  fun removeFeatureState(\n    sourceId: String,\n    sourceLayerId: String?,\n    featureId: String,\n    callback: FeatureStateOperationCallback,\n  ): Cancelable {\n    return removeFeatureState(\n      sourceId = sourceId,\n      sourceLayerId = sourceLayerId,\n      featureId = featureId,\n      stateKey = null,\n      callback = callback,\n    )\n  }\n\n  /**\n   * Removes entries from a feature state object.\n   *\n   * Remove a specified property or all property from a feature's state object, depending on the value of\n   * `stateKey`.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`.\n   *\n   * @param sourceId The style source identifier.\n   * @param featureId The feature identifier of the feature whose state should be removed.\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   */\n  fun removeFeatureState(\n    sourceId: String,\n    featureId: String,\n    callback: FeatureStateOperationCallback,\n  ): Cancelable {\n    return removeFeatureState(\n      sourceId = sourceId,\n      sourceLayerId = null,\n      featureId = featureId,\n      stateKey = null,\n      callback = callback,\n    )\n  }\n\n  /**\n   * Reset all the feature states within a style source.\n   *\n   * Remove all feature state entries from the specified style source or source layer.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`.\n   *\n   * @param sourceId The style source identifier.\n   * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   */\n  override fun resetFeatureStates(\n    sourceId: String,\n    sourceLayerId: String?,\n    callback: FeatureStateOperationCallback\n  ): Cancelable {\n    checkNativeMap(\"resetFeatureState\")\n    return nativeMap.resetFeatureStates(sourceId, sourceLayerId, callback)\n  }\n\n  /**\n   * Reset all the feature states within a style source.\n   *\n   * Remove all feature state entries from the specified style source or source layer.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`.\n   *\n   * @param sourceId The style source identifier.\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   */\n  fun resetFeatureStates(\n    sourceId: String,\n    callback: FeatureStateOperationCallback\n  ): Cancelable {\n    return resetFeatureStates(sourceId, null, callback)\n  }\n\n  /**\n   * Reduce memory use. Useful to call when the application gets paused or sent to background.\n   */\n  fun reduceMemoryUse() {\n    checkNativeMap(\"reduceMemoryUse\")\n    nativeMap.reduceMemoryUse()\n  }\n\n  /**\n   * Subscribes to `MapLoaded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param mapLoadedCallback\n   */\n  override fun subscribeMapLoaded(mapLoadedCallback: MapLoadedCallback): Cancelable {\n    checkNativeMap(\"subscribeMapLoaded\")\n    return nativeObserver.subscribeMapLoaded(mapLoadedCallback)\n  }\n\n  /**\n   * Subscribes to `MapIdle` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param mapIdleCallback\n   */\n  override fun subscribeMapIdle(mapIdleCallback: MapIdleCallback): Cancelable {\n    checkNativeMap(\"subscribeMapIdle\")\n    return nativeObserver.subscribeMapIdle(mapIdleCallback)\n  }\n\n  /**\n   * Subscribes to `MapLoadingError` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param mapLoadingErrorCallback\n   */\n  override fun subscribeMapLoadingError(mapLoadingErrorCallback: MapLoadingErrorCallback): Cancelable {\n    checkNativeMap(\"subscribeMapLoadingError\")\n    return nativeObserver.subscribeMapLoadingError(mapLoadingErrorCallback)\n  }\n\n  /**\n   * Subscribes to `StyleLoaded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param styleLoadedCallback\n   */\n  override fun subscribeStyleLoaded(styleLoadedCallback: StyleLoadedCallback): Cancelable {\n    checkNativeMap(\"subscribeStyleLoaded\")\n    return nativeObserver.subscribeStyleLoaded(styleLoadedCallback)\n  }\n\n  /**\n   * Subscribes to `StyleDataLoaded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param styleDataLoadedCallback\n   */\n  override fun subscribeStyleDataLoaded(styleDataLoadedCallback: StyleDataLoadedCallback): Cancelable {\n    checkNativeMap(\"subscribeStyleDataLoaded\")\n    return nativeObserver.subscribeStyleDataLoaded(styleDataLoadedCallback)\n  }\n\n  /**\n   * Subscribes to `SourceDataLoaded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param sourceDataLoadedCallback\n   */\n  override fun subscribeSourceDataLoaded(sourceDataLoadedCallback: SourceDataLoadedCallback): Cancelable {\n    checkNativeMap(\"subscribeSourceDataLoaded\")\n    return nativeObserver.subscribeSourceDataLoaded(sourceDataLoadedCallback)\n  }\n\n  /**\n   * Subscribes to `SourceAdded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param sourceAddedCallback\n   */\n  override fun subscribeSourceAdded(sourceAddedCallback: SourceAddedCallback): Cancelable {\n    checkNativeMap(\"subscribeSourceAdded\")\n    return nativeObserver.subscribeSourceAdded(sourceAddedCallback)\n  }\n\n  /**\n   * Subscribes to `SourceRemoved` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param sourceRemovedCallback\n   */\n  override fun subscribeSourceRemoved(sourceRemovedCallback: SourceRemovedCallback): Cancelable {\n    checkNativeMap(\"subscribeSourceRemoved\")\n    return nativeObserver.subscribeSourceRemoved(sourceRemovedCallback)\n  }\n\n  /**\n   * Subscribes to `StyleImageMissing` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param styleImageMissingCallback\n   */\n  override fun subscribeStyleImageMissing(styleImageMissingCallback: StyleImageMissingCallback): Cancelable {\n    checkNativeMap(\"subscribeStyleImageMissing\")\n    return nativeObserver.subscribeStyleImageMissing(styleImageMissingCallback)\n  }\n\n  /**\n   * Subscribes to `StyleImageRemoveUnused` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param styleImageRemoveUnusedCallback\n   */\n  override fun subscribeStyleImageRemoveUnused(styleImageRemoveUnusedCallback: StyleImageRemoveUnusedCallback): Cancelable {\n    checkNativeMap(\"subscribeStyleImageRemoveUnused\")\n    return nativeObserver.subscribeStyleImageRemoveUnused(styleImageRemoveUnusedCallback)\n  }\n\n  /**\n   * Subscribes to `CameraChanged` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param cameraChangedCallback\n   */\n  override fun subscribeCameraChanged(cameraChangedCallback: CameraChangedCallback): Cancelable {\n    checkNativeMap(\"subscribeCameraChanged\")\n    return nativeObserver.subscribeCameraChanged(cameraChangedCallback)\n  }\n\n  /**\n   * Subscribes to [CameraChangedCoalesced] event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param cameraChangedCoalescedCallback the callback to be invoked when the camera changes.\n   */\n  @com.mapbox.annotation.MapboxExperimental\n  override fun subscribeCameraChangedCoalesced(cameraChangedCoalescedCallback: CameraChangedCoalescedCallback): Cancelable {\n    checkNativeMap(\"subscribeCameraChangedCoalesced\")\n    return nativeObserver.subscribeCameraChangedCoalesced(cameraChangedCoalescedCallback)\n  }\n\n  /**\n   * Subscribes to `RenderFrameStarted` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param renderFrameStartedCallback\n   */\n  override fun subscribeRenderFrameStarted(renderFrameStartedCallback: RenderFrameStartedCallback): Cancelable {\n    checkNativeMap(\"subscribeRenderFrameStarted\")\n    return nativeObserver.subscribeRenderFrameStarted(renderFrameStartedCallback)\n  }\n\n  /**\n   * Subscribes to `RenderFrameFinished` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param renderFrameFinishedCallback\n   */\n  override fun subscribeRenderFrameFinished(renderFrameFinishedCallback: RenderFrameFinishedCallback): Cancelable {\n    checkNativeMap(\"subscribeRenderFrameFinished\")\n    return nativeObserver.subscribeRenderFrameFinished(renderFrameFinishedCallback)\n  }\n\n  /**\n   * Subscribes to `ResourceRequest` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param resourceRequestCallback\n   */\n  override fun subscribeResourceRequest(resourceRequestCallback: ResourceRequestCallback): Cancelable {\n    checkNativeMap(\"subscribeResourceRequest\")\n    return nativeObserver.subscribeResourceRequest(resourceRequestCallback)\n  }\n\n  /**\n   * Subscribes to an experimental `GenericEvent` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param eventName\n   * @param genericEventCallback\n   */\n  @MapboxExperimental\n  override fun subscribeGenericEvent(\n    eventName: String,\n    genericEventCallback: GenericEventCallback\n  ): Cancelable {\n    checkNativeMap(\"subscribeGenericEvent\")\n    return nativeObserver.subscribeGenericEvent(eventName, genericEventCallback)\n  }\n\n  /**\n   * Add a listener that's going to be invoked whenever map camera changes.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeCameraChange] instead.\",\n    replaceWith = ReplaceWith(\"subscribeCameraChanged(cameraChangedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnCameraChangeListener(onCameraChangeListener: OnCameraChangeListener) {\n    checkNativeMap(\"addOnCameraChangeListener\")\n    nativeObserver.addOnCameraChangeListener(onCameraChangeListener)\n  }\n\n  /**\n   * Remove the camera change listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeCameraChange] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnCameraChangeListener(onCameraChangeListener: OnCameraChangeListener) {\n    checkNativeMap(\"removeOnCameraChangeListener\")\n    nativeObserver.removeOnCameraChangeListener(onCameraChangeListener)\n  }\n\n  // Map events\n  /**\n   * Add a listener that's going to be invoked whenever map has entered the idle state.\n   *\n   * The Map is in the idle state when there are no ongoing transitions and the Map has rendered all\n   * available tiles.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeMapIdle] instead.\",\n    replaceWith = ReplaceWith(\"subscribeMapIdle(mapIdleCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnMapIdleListener(onMapIdleListener: OnMapIdleListener) {\n    checkNativeMap(\"addOnMapIdleListener\")\n    nativeObserver.addOnMapIdleListener(onMapIdleListener)\n  }\n\n  /**\n   * Remove the map idle listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeMapIdle] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnMapIdleListener(onMapIdleListener: OnMapIdleListener) {\n    checkNativeMap(\"removeOnMapIdleListener\")\n    nativeObserver.removeOnMapIdleListener(onMapIdleListener)\n  }\n\n  /**\n   * Add a listener that's going to be invoked whenever there's a map load error.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeMapLoadingError] instead.\",\n    replaceWith = ReplaceWith(\"subscribeMapLoadingError(mapLoadingErrorCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnMapLoadErrorListener(onMapLoadErrorListener: OnMapLoadErrorListener) {\n    checkNativeMap(\"addOnMapLoadErrorListener\")\n    nativeObserver.addOnMapLoadErrorListener(onMapLoadErrorListener)\n  }\n\n  /**\n   * Remove the map error listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeMapLoadingError] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnMapLoadErrorListener(onMapLoadErrorListener: OnMapLoadErrorListener) {\n    checkNativeMap(\"removeOnMapLoadErrorListener\")\n    nativeObserver.removeOnMapLoadErrorListener(onMapLoadErrorListener)\n  }\n\n  /**\n   * Add a listener that's going to be invoked whenever the Map's style has been fully loaded, and\n   * the Map has rendered all visible tiles.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeMapLoaded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeMapLoaded(mapLoadedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnMapLoadedListener(onMapLoadedListener: OnMapLoadedListener) {\n    checkNativeMap(\"addOnMapLoadedListener\")\n    nativeObserver.addOnMapLoadedListener(onMapLoadedListener)\n  }\n\n  /**\n   * Remove the map loaded listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeMapLoaded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnMapLoadedListener(onMapLoadedListener: OnMapLoadedListener) {\n    checkNativeMap(\"removeOnMapLoadedListener\")\n    nativeObserver.removeOnMapLoadedListener(onMapLoadedListener)\n  }\n\n  // Render frame events\n  /**\n   * Add a listener that's going to be invoked whenever the Map started rendering a frame.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeRenderFrameStarted] instead.\",\n    replaceWith = ReplaceWith(\"subscribeRenderFrameStarted(renderFrameStartedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnRenderFrameStartedListener(onRenderFrameStartedListener: OnRenderFrameStartedListener) {\n    checkNativeMap(\"addOnRenderFrameStartedListener\")\n    nativeObserver.addOnRenderFrameStartedListener(onRenderFrameStartedListener)\n  }\n\n  /**\n   * Remove the render frame started listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeRenderFrameStarted] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnRenderFrameStartedListener(onRenderFrameStartedListener: OnRenderFrameStartedListener) {\n    checkNativeMap(\"removeOnRenderFrameStartedListener\")\n    nativeObserver.removeOnRenderFrameStartedListener(onRenderFrameStartedListener)\n  }\n\n  /**\n   * Add a listener that's going to be invoked whenever the Map finished rendering a frame.\n   *\n   * The render-mode value tells whether the Map has all data (\"full\") required to render the visible viewport.\n   * The needs-repaint value provides information about ongoing transitions that trigger Map repaint.\n   * The placement-changed value tells if the symbol placement has been changed in the visible viewport.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeRenderFrameFinished] instead.\",\n    replaceWith = ReplaceWith(\"subscribeRenderFrameFinished(renderFrameFinishedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnRenderFrameFinishedListener(onRenderFrameFinishedListener: OnRenderFrameFinishedListener) {\n    checkNativeMap(\"addOnRenderFrameFinishedListener\")\n    nativeObserver.addOnRenderFrameFinishedListener(onRenderFrameFinishedListener)\n  }\n\n  /**\n   * Remove the render frame finished listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeRenderFrameFinished] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnRenderFrameFinishedListener(onRenderFrameFinishedListener: OnRenderFrameFinishedListener) {\n    checkNativeMap(\"removeOnRenderFrameFinishedListener\")\n    nativeObserver.removeOnRenderFrameFinishedListener(onRenderFrameFinishedListener)\n  }\n\n  // Source events\n  /**\n   * Add a listener that's going to be invoked whenever a source has been added with StyleManager#addStyleSource\n   * runtime API.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeSourceAdded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeSourceAdded(sourceAddedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnSourceAddedListener(onSourceAddedListener: OnSourceAddedListener) {\n    checkNativeMap(\"addOnSourceAddedListener\")\n    nativeObserver.addOnSourceAddedListener(onSourceAddedListener)\n  }\n\n  /**\n   * Remove the source added listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeSourceAdded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnSourceAddedListener(onSourceAddedListener: OnSourceAddedListener) {\n    checkNativeMap(\"removeOnSourceAddedListener\")\n    nativeObserver.removeOnSourceAddedListener(onSourceAddedListener)\n  }\n\n  /**\n   * Add a listener that's going to be invoked whenever the source data has been loaded.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeSourceDataLoaded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeSourceDataLoaded(sourceDataLoadedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnSourceDataLoadedListener(onSourceDataLoadedListener: OnSourceDataLoadedListener) {\n    checkNativeMap(\"addOnSourceDataLoadedListener\")\n    nativeObserver.addOnSourceDataLoadedListener(onSourceDataLoadedListener)\n  }\n\n  /**\n   * Remove the source data loaded listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeSourceDataLoaded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnSourceDataLoadedListener(onSourceDataLoadedListener: OnSourceDataLoadedListener) {\n    checkNativeMap(\"removeOnSourceDataLoadedListener\")\n    nativeObserver.removeOnSourceDataLoadedListener(onSourceDataLoadedListener)\n  }\n\n  /**\n   * Add a listener that's going to be invoked whenever a source has been removed with StyleManager#removeStyleSource\n   * runtime API.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeSourceRemoved] instead.\",\n    replaceWith = ReplaceWith(\"subscribeSourceRemoved(sourceRemovedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnSourceRemovedListener(onSourceRemovedListener: OnSourceRemovedListener) {\n    checkNativeMap(\"addOnSourceRemovedListener\")\n    nativeObserver.addOnSourceRemovedListener(onSourceRemovedListener)\n  }\n\n  /**\n   * Remove the source removed listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeSourceRemoved] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnSourceRemovedListener(onSourceRemovedListener: OnSourceRemovedListener) {\n    checkNativeMap(\"removeOnSourceRemovedListener\")\n    nativeObserver.removeOnSourceRemovedListener(onSourceRemovedListener)\n  }\n\n  // Style events\n  /**\n   * Add a listener that's going to be invoked whenever the requested style has been fully loaded,\n   * including the style specified sprite and sources.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeStyleLoaded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeStyleLoaded(styleLoadedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnStyleLoadedListener(onStyleLoadedListener: OnStyleLoadedListener) {\n    checkNativeMap(\"addOnStyleLoadedListener\")\n    nativeObserver.addOnStyleLoadedListener(onStyleLoadedListener)\n  }\n\n  /**\n   * Remove the style loaded listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeStyleLoaded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnStyleLoadedListener(onStyleLoadedListener: OnStyleLoadedListener) {\n    checkNativeMap(\"removeOnStyleLoadedListener\")\n    nativeObserver.removeOnStyleLoadedListener(onStyleLoadedListener)\n  }\n\n  /**\n   * Add a listener that's going to be invoked whenever the requested style data been loaded.\n   * The 'type' property defines what kind of style data has been loaded.\n   *\n   * This event may be useful when application needs to modify style layers or sources and add or remove sources\n   * before style is fully loaded.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeStyleDataLoaded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeStyleDataLoaded(styleDataLoadedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnStyleDataLoadedListener(onStyleDataLoadedListener: OnStyleDataLoadedListener) {\n    checkNativeMap(\"addOnStyleDataLoadedListener\")\n    nativeObserver.addOnStyleDataLoadedListener(onStyleDataLoadedListener)\n  }\n\n  /**\n   * Remove the style data loaded listener\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeStyleDataLoaded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnStyleDataLoadedListener(onStyleDataLoadedListener: OnStyleDataLoadedListener) {\n    checkNativeMap(\"removeOnStyleDataLoadedListener\")\n    nativeObserver.removeOnStyleDataLoadedListener(onStyleDataLoadedListener)\n  }\n\n  /**\n   * Add a listener that's going to be invoked whenever a style has a missing image.\n   *\n   * This event is emitted when the Map renders visible tiles and one of the required images is\n   * missing in the sprite sheet.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeStyleImageMissing] instead.\",\n    replaceWith = ReplaceWith(\"subscribeStyleImageMissing(styleImageMissingCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnStyleImageMissingListener(onStyleImageMissingListener: OnStyleImageMissingListener) {\n    checkNativeMap(\"addOnStyleImageMissingListener\")\n    nativeObserver.addOnStyleImageMissingListener(onStyleImageMissingListener)\n  }\n\n  /**\n   * Remove the style image missing listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeStyleImageMissing] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnStyleImageMissingListener(onStyleImageMissingListener: OnStyleImageMissingListener) {\n    checkNativeMap(\"removeOnStyleImageMissingListener\")\n    nativeObserver.removeOnStyleImageMissingListener(onStyleImageMissingListener)\n  }\n\n  /**\n   * Add a listener that's going to be invoked whenever an image added to the Style is no longer\n   * needed and can be removed using StyleManager#removeStyleImage method.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeStyleImageRemoveUnused] instead.\",\n    replaceWith = ReplaceWith(\"subscribeStyleImageRemoveUnused(styleImageRemoveUnusedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  override fun addOnStyleImageUnusedListener(onStyleImageUnusedListener: OnStyleImageUnusedListener) {\n    checkNativeMap(\"addOnStyleImageUnusedListener\")\n    nativeObserver.addOnStyleImageUnusedListener(onStyleImageUnusedListener)\n  }\n\n  /**\n   * Remove the style image unused listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeStyleImageRemoveUnused] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  override fun removeOnStyleImageUnusedListener(onStyleImageUnusedListener: OnStyleImageUnusedListener) {\n    checkNativeMap(\"removeOnStyleImageUnusedListener\")\n    nativeObserver.removeOnStyleImageUnusedListener(onStyleImageUnusedListener)\n  }\n\n  /**\n   * Triggers a repaint of the map.\n   */\n  fun triggerRepaint() {\n    checkNativeMap(\"triggerRepaint\")\n    nativeMap.triggerRepaint()\n  }\n\n  /**\n   * Get the map's current free camera options. After mutation, it should be set back to the map.\n   * @return The current free camera options.\n   */\n  override fun getFreeCameraOptions(): FreeCameraOptions {\n    checkNativeMap(\"getFreeCameraOptions\")\n    return nativeMap.getFreeCameraOptions()\n  }\n\n  /**\n   * Sets the map view with the free camera options.\n   *\n   * FreeCameraOptions provides more direct access to the underlying camera entity.\n   * For backwards compatibility the state set using this API must be representable with\n   * `CameraOptions` as well. Parameters are clamped to a valid range or discarded as invalid\n   * if the conversion to the pitch and bearing presentation is ambiguous. For example orientation\n   * can be invalid if it leads to the camera being upside down or the quaternion has zero length.\n   *\n   * @param freeCameraOptions The free camera options to set.\n   */\n  override fun setCamera(freeCameraOptions: FreeCameraOptions) {\n    checkNativeMap(\"setCamera\")\n    nativeMap.setCamera(freeCameraOptions)\n  }\n\n  /**\n   * Get elevation for given coordinate. Value is available only for the visible region on the screen, if terrain (DEM) tile is available.\n   *\n   * @param coordinate defined as longitude-latitude pair.\n   *\n   * @return Elevation (in meters) multiplied by current terrain exaggeration, or empty if elevation for the coordinate is not available.\n   */\n  fun getElevation(coordinate: Point): Double? {\n    checkNativeMap(\"getElevation\")\n    return nativeMap.getElevation(coordinate)\n  }\n\n  /**\n   * The tile cache budget hint to be used by the map. The budget can be given in\n   * tile units or in megabytes. A Map will do the best effort to keep memory\n   * allocations for a non essential resources within the budget.\n   *\n   * If the tile cache budget is specified in megabytes, the engine will attempt\n   * to use ETC2 texture compression for raster layers.\n   *\n   * If null is set, the tile cache budget in tile units will be dynamically calculated based on\n   * the current viewport size.\n   *\n   * @param tileCacheBudget The tile cache budget hint to be used by the Map.\n   */\n  fun setTileCacheBudget(tileCacheBudget: TileCacheBudget?) {\n    checkNativeMap(\"setTileCacheBudget\")\n    nativeMap.setTileCacheBudget(tileCacheBudget)\n  }\n\n  /**\n   * Sets whether multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude.\n   * If disabled, when the map is zoomed out far enough that a single representation of the world\n   * does not fill the map's entire container, there will be blank space beyond 180 and -180 degrees longitude.\n   * In this case, features that cross 180 and -180 degrees longitude will be cut in two\n   * (with one portion on the right edge of the map and the other on the left edge of the map) at every zoom level.\n   *\n   * By default, renderWorldCopies is set to `true`.\n   *\n   * @param renderWorldCopies The `boolean` value defining whether rendering world copies is going to be enabled or not.\n   */\n  fun setRenderWorldCopies(renderWorldCopies: Boolean) {\n    checkNativeMap(\"setRenderWorldCopies\")\n    nativeMap.setRenderWorldCopies(renderWorldCopies)\n  }\n\n  /**\n   * Returns whether multiple copies of the world are being rendered side by side beyond -180 and 180 degrees longitude.\n   *\n   * @return `true` if rendering world copies is enabled, `false` otherwise.\n   */\n  fun getRenderWorldCopies(): Boolean {\n    checkNativeMap(\"getRenderWorldCopies\")\n    return nativeMap.getRenderWorldCopies()\n  }\n\n  /**\n   * A convex polygon that describes the shape of the screen in case it is non-rectangular.\n   * Every coordinate is in 0 to 1 range, with (0, 0) being the map view top-left and (1, 1) the bottom-right.\n   * The points have to be given in clockwise winding order. The polygon will be closed automatically, so for a rectangular shape, pass in 4 points.\n   * Use this, if the visible screen area is obscured enough that using a custom shape improves performance.\n   *\n   * @param shape shape of the screen\n   *\n   */\n  @MapboxExperimental\n  fun setScreenCullingShape(shape: List<Vec2>) {\n    checkNativeMap(\"setScreenCullingShape\")\n    return nativeMap.setScreenCullingShape(shape)\n  }\n\n  /**\n   * A convex polygon that describes the shape of the screen in case it is non-rectangular.\n   * Every screen-coordinate is in 0 to 1 range, with (0, 0) being top-left and (1, 1) bottom-right.\n   * The points have to be given in clockwise winding order. The polygon will be closed automatically, so for a rectangular shape, pass in 4 points.\n   * Use this if the visible screen area is obscured enough that using a custom shape improves performance.\n   *\n   * @return shape of the screen\n   */\n  @MapboxExperimental\n  fun getScreenCullingShape(): List<Vec2> {\n    checkNativeMap(\"getScreenCullingShape\")\n    return nativeMap.getScreenCullingShape()\n  }\n\n  // MARK: - Accessibility Scale Behavior\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var scaleBehavior: SymbolScaleBehavior = SymbolScaleBehavior.fixed(1.0f)\n  private var accessibilityContext: android.content.Context? = null\n  private var configCallbacks: android.content.ComponentCallbacks? = null\n  private var currentSystemFontScale: Float = 1.0f\n\n  internal fun initializeAccessibility(context: android.content.Context) {\n    accessibilityContext = context.applicationContext\n    currentSystemFontScale = context.resources.configuration.fontScale\n  }\n\n  /**\n   * Controls how map symbols scale in response to system font size.\n   *\n   * Modes:\n   * - `.fixed(scaleFactor)` - Fixed scale (default: 1.0)\n   * - `.system` - Scales with system font size\n   * - `.system(mapping)` - Scales with custom mapping\n   */\n  @MapboxExperimental\n  var symbolScaleBehavior: SymbolScaleBehavior\n    get() = scaleBehavior\n    set(value) {\n      checkNativeMap(\"symbolScaleBehavior\")\n      scaleBehavior = value\n\n      if (value.isSystem()) {\n        registerConfigurationObserver()\n        applyCurrentScale()\n      } else if (value.isFixed()) {\n        unregisterConfigurationObserver()\n        value.scaleFactor?.let { setScaleFactor(it) }\n      }\n    }\n\n  /**\n   * Registers observer for system font scale changes.\n   * Thread-safe: synchronized to prevent concurrent registration.\n   */\n  @Synchronized\n  private fun registerConfigurationObserver() {\n    val context = accessibilityContext ?: return\n    if (configCallbacks != null) return\n\n    configCallbacks = object : android.content.ComponentCallbacks {\n      override fun onConfigurationChanged(newConfig: android.content.res.Configuration) {\n        val newFontScale = newConfig.fontScale\n        if (newFontScale != currentSystemFontScale && isMapValid) {\n          currentSystemFontScale = newFontScale\n          applyCurrentScale()\n        }\n      }\n      override fun onLowMemory() {}\n    }\n    context.registerComponentCallbacks(configCallbacks)\n  }\n\n  /**\n   * Unregisters observer for system font scale changes.\n   * Thread-safe: synchronized to prevent concurrent unregistration.\n   */\n  @Synchronized\n  private fun unregisterConfigurationObserver() {\n    val context = accessibilityContext ?: return\n    configCallbacks?.let {\n      try {\n        context.unregisterComponentCallbacks(it)\n      } catch (e: Exception) {\n        // Catch any exceptions during unregistration\n        logW(TAG, \"Failed to unregister configuration observer: ${e.message}\")\n      } finally {\n        // Always clear the reference even if unregistration fails\n        configCallbacks = null\n      }\n    }\n  }\n\n  /**\n   * Applies current system font scale using the configured mapping function.\n   * Only called for System mode (Fixed mode doesn't respond to system changes).\n   */\n  private fun applyCurrentScale() {\n    val mapping = scaleBehavior.mapping ?: SymbolScaleBehavior.defaultMapping\n    val scaleFactor = mapping(currentSystemFontScale)\n    setScaleFactor(scaleFactor)\n  }\n\n  private fun setScaleFactor(scaleFactor: Float) {\n    checkNativeMap(\"setScaleFactor\")\n    nativeMap.setScaleFactor(scaleFactor)\n  }\n\n  /**\n   * Internal accessor to retrieve the current scale factor from the native map.\n   */\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal fun getScaleFactor(): Float {\n    checkNativeMap(\"getScaleFactor\")\n    return nativeMap.getScaleFactor()\n  }\n\n  /**\n   * Enable real-time collection of map rendering performance statistics, for development purposes. Use after `render()` has\n   * been called for the first time.\n   *\n   * Collects CPU, GPU resource usage and timings of layers and rendering groups over a user-configurable sampling duration.\n   * Use the collected information to find which layers or rendering groups might be performing poorly. Use\n   * [PerformanceStatisticsOptions] to configure the following statistics collection behaviors:\n   * <ul>\n   *     <li>Specify the types of sampling: cumulative, per-frame, or both.</li>\n   *     <li>Define the minimum amount of time over which to perform sampling.</li>\n   * </ul>\n   *\n   * Utilize [PerformanceStatisticsCallback] to observe the collected performance statistics. The callback function is invoked\n   * after the configured sampling duration has elapsed. The callback is invoked on the main thread. The collection process is\n   * continuous; without user-input, it restarts after each callback invocation. Note: Specifying a negative sampling duration\n   * or omitting the callback function will result in no operation, which will be logged for visibility.\n   *\n   * In order to stop the collection process, call [stopPerformanceStatisticsCollection].\n   *\n   * @param options Statistics collection options\n   * @param callback The callback to be invoked when statistics are available after the configured amount of\n   * time.\n   */\n  @MapboxExperimental\n  fun startPerformanceStatisticsCollection(\n    options: PerformanceStatisticsOptions,\n    callback: PerformanceStatisticsCallback,\n  ) {\n    checkNativeMap(\"startPerformanceStatisticsCollection\")\n    nativeMap.startPerformanceStatisticsCollection(options, callback)\n    performanceCollectionStatisticsStarted = true\n  }\n\n  /**\n   * Disable performance statistics collection.\n   *\n   * Calling [stopPerformanceStatisticsCollection] when no collection is enabled is a no-op. After calling\n   * [startPerformanceStatisticsCollection], [stopPerformanceStatisticsCollection] must be called before collection can be\n   * restarted.\n   */\n  @MapboxExperimental\n  fun stopPerformanceStatisticsCollection() {\n    checkNativeMap(\"stopPerformanceStatisticsCollection\")\n    nativeMap.stopPerformanceStatisticsCollection()\n    performanceCollectionStatisticsStarted = false\n  }\n\n  /**\n   * Calculates a target point where the camera should move after dragging from\n   * a screen coordinate `startCoordinate` to another coordinate `endCoordinate`.\n   *\n   * @param fromPoint The `screen coordinate` to drag the map from, measured in `platform pixels` from top to bottom and from left to right.\n   * @param toPoint The `screen coordinate` to drag the map to, measured in `platform pixels` from top to bottom and from left to right.\n   *\n   * @return The [CameraOptions] object with the center variable set to the computed target location.\n   */\n  override fun cameraForDrag(fromPoint: ScreenCoordinate, toPoint: ScreenCoordinate): CameraOptions {\n    checkNativeMap(\"cameraForDrag\")\n    return nativeMap.cameraForDrag(fromPoint, toPoint)\n  }\n\n  /**\n   * Sets the map [MapCenterAltitudeMode] that defines behavior of the center point\n   * altitude for all subsequent camera manipulations.\n   *\n   * Note: any gesture changing the map camera will set [MapCenterAltitudeMode.TERRAIN]\n   * when finished.\n   */\n  override fun setCenterAltitudeMode(mode: MapCenterAltitudeMode) {\n    checkNativeMap(\"setCenterAltitudeMode\")\n    nativeMap.setCenterAltitudeMode(mode)\n  }\n\n  /**\n   * Returns the map's [MapCenterAltitudeMode].\n   *\n   * @return The map's [MapCenterAltitudeMode].\n   */\n  override fun getCenterAltitudeMode(): MapCenterAltitudeMode {\n    checkNativeMap(\"getCenterAltitudeMode\")\n    return nativeMap.getCenterAltitudeMode()\n  }\n\n  /**\n   * Call extension function on [CameraAnimationsPlugin].\n   * In most cases should not be called directly.\n   */\n  override fun cameraAnimationsPlugin(function: (CameraAnimationsPlugin.() -> Any?)): Any? {\n    cameraAnimationsPlugin?.let {\n      return function.invoke(it)\n    }\n    logW(\n      TAG,\n      \"Either camera plugin is not added to the MapView or MapView has already been destroyed;\" +\n        \" MapboxMap camera extension functions are no-op.\"\n    )\n    return null\n  }\n\n  /**\n   * Call extension function on [GesturesPlugin].\n   * In most cases should not be called directly.\n   */\n  override fun gesturesPlugin(function: (GesturesPlugin.() -> Any?)): Any? {\n    gesturesPlugin?.let {\n      return function.invoke(it)\n    }\n    logW(\n      TAG,\n      \"Either gestures plugin is not added to the MapView or MapView has already been destroyed;\" +\n        \" MapboxMap gestures extension functions are no-op.\"\n    )\n    return null\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @JvmSynthetic\n  internal fun onDestroy() {\n    // Always attempt to clean up observers first to prevent memory leaks\n    unregisterConfigurationObserver()\n    accessibilityContext = null\n\n    if (performanceCollectionStatisticsStarted) {\n      stopPerformanceStatisticsCollection()\n    }\n    cameraAnimationsPlugin = null\n    gesturesPlugin = null\n    interactions.forEach {\n      it.cancel()\n    }\n    interactions.clear()\n    styleObserver.onDestroy()\n    isMapValid = false\n  }\n\n  /**\n   * Returns tileIDs that cover current map camera\n   *\n   * Note! This is an experimental API and behavior might change in future.\n   *\n   * @param tileCoverOptions Options for the tile cover method\n   * @param cameraOptions This is an extra parameter for future use. Has no effect for now.\n   */\n  @MapboxExperimental\n  fun tileCover(\n    tileCoverOptions: TileCoverOptions,\n    cameraOptions: CameraOptions?\n  ): List<CanonicalTileID> {\n    checkNativeMap(\"tileCover\")\n    return nativeMap.tileCover(tileCoverOptions, cameraOptions)\n  }\n\n  /**\n   * Returns attributions for the data used by the Map's style.\n   *\n   * @return An array of attributions for the data sources used by the Map's style.\n   */\n  fun getAttributions(): List<String> {\n    checkNativeMap(\"getAttributions\")\n    return nativeMap.getAttributions()\n  }\n\n  @JvmSynthetic\n  internal fun addViewAnnotation(\n    viewId: String,\n    options: ViewAnnotationOptions\n  ): Expected<String, None> {\n    checkNativeMap(\"addViewAnnotation\")\n    return nativeMap.addViewAnnotation(viewId, options)\n  }\n\n  /**\n   * Specify layers that view annotations should avoid. This applies to ALL view annotations associated to any layer.\n   * The API currently only supports line layers.\n   *\n   * @param layerIds A list of layerIDs of layers on the features of which the view annotation should not be placed. Passing `null` will clear the list of layers.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MapboxExperimental\n  internal fun setViewAnnotationAvoidLayers(layerIds: HashSet<String>?): Expected<String, None> {\n    checkNativeMap(\"setViewAnnotationAvoidLayers\")\n    return nativeMap.setViewAnnotationAvoidLayers(layerIds)\n  }\n\n  /**\n   * Returns a list of layer ids of layers that all layer associated view annotations are set to avoid.\n   *\n   * @return A list of layer ids if there are any, empty set otherwise.\n   */\n  @MapboxExperimental\n  internal fun getViewAnnotationAvoidLayers(): HashSet<String> {\n    checkNativeMap(\"getViewAnnotationAvoidLayers\")\n    return nativeMap.getViewAnnotationAvoidLayers()\n  }\n\n  @JvmSynthetic\n  internal fun updateViewAnnotation(\n    viewId: String,\n    options: ViewAnnotationOptions\n  ): Expected<String, None> {\n    checkNativeMap(\"updateViewAnnotation\")\n    return nativeMap.updateViewAnnotation(viewId, options)\n  }\n\n  @JvmSynthetic\n  internal fun removeViewAnnotation(viewId: String): Expected<String, None> {\n    checkNativeMap(\"removeViewAnnotation\")\n    return nativeMap.removeViewAnnotation(viewId)\n  }\n\n  @JvmSynthetic\n  internal fun getViewAnnotationOptions(identifier: String): Expected<String, ViewAnnotationOptions> {\n    checkNativeMap(\"getViewAnnotationOptions\")\n    return nativeMap.getViewAnnotationOptions(identifier)\n  }\n\n  @JvmSynthetic\n  internal fun setViewAnnotationPositionsUpdateListener(listener: DelegatingViewAnnotationPositionsUpdateListener?) {\n    checkNativeMap(\"setViewAnnotationPositionsUpdateListener\")\n    return nativeMap.setViewAnnotationPositionsUpdateListener(listener)\n  }\n\n  private fun checkNativeMap(methodName: String, checkMainThread: Boolean = true) {\n    if (checkMainThread) {\n      ThreadChecker.throwIfNotMainThread()\n    }\n    if (!isMapValid) {\n      logW(\n        TAG,\n        \"MapboxMap object (accessing $methodName) should not be stored and used after MapView is destroyed.\"\n      )\n    }\n  }\n\n  /**\n   * Add the map interaction (e.g. clicking / long clicking map features or map surface).\n   * Most common interactions are [ClickInteraction] and [LongClickInteraction].\n   *\n   * @param interaction any concrete implementation of base [MapInteraction].\n   *\n   * @return [Cancelable] object. Call [Cancelable.cancel] when the interaction is not needed anymore.\n   *  Note: destroying the map will cancel all registered interactions.\n   */\n  @MapboxExperimental\n  override fun addInteraction(interaction: MapInteraction): Cancelable {\n    checkNativeMap(\"addInteraction\")\n    val cancelable = nativeMap.addInteraction(interaction.coreInteraction)\n    interactions.add(cancelable)\n    return Cancelable {\n      interactions.remove(cancelable)\n      cancelable.cancel()\n    }\n  }\n\n  /**\n   * For internal usage.\n   */\n  @MapboxExperimental\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  override fun dispatch(platformEventInfo: PlatformEventInfo) {\n    checkNativeMap(\"dispatch\")\n    nativeMap.dispatch(platformEventInfo)\n  }\n\n  /**\n   * Sets the state map for given [featuresetFeature] coming from an interaction callback asynchronously.\n   *\n   * @param featuresetFeature the featureset feature coming from an interaction callback.\n   * @param state describes the new state of the map for given [featuresetFeature].\n   * @param callback The optional [QueryFeatureStateCallback] called when the query completes.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending query.\n   */\n  @JvmOverloads\n  fun <FS : FeatureState> setFeatureState(\n    featuresetFeature: FeaturesetFeature<FS>,\n    state: FS,\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { }\n  ): Cancelable {\n    checkNativeMap(\"setFeatureState\")\n    return featuresetFeature.id?.let { id ->\n      nativeMap.setFeatureState(\n        featuresetFeature.descriptor.toFeaturesetDescriptor(),\n        id,\n        state.internalState,\n        callback\n      )\n    } ?: Cancelable { }.also {\n      logW(TAG, \"setFeatureState called but featuresetFeature.id is NULL!\")\n    }\n  }\n\n  /**\n   * Sets the state map of a feature within a style source asynchronously.\n   *\n   * This API should be used with caution as [Feature] defined by the [FeaturesetFeatureId.featureId] only might not\n   * be compatible with provided [FeaturesetFeatureId.featureNamespace] and [descriptor] and thus API behaviour might be\n   * unexpected. It is safer to use overloaded [getFeatureState] taking [FeaturesetFeature].\n   *\n   * @param descriptor [TypedFeaturesetDescriptor] object representing either a featureset or a single layer.\n   * @param id identifier holding feature id and feature namespace.\n   * @param state describes the new state of the map for given feature.\n   * @param callback The optional [QueryFeatureStateCallback] called when the query completes.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending query.\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  @JvmOverloads\n  fun <FS : FeatureState> setFeatureState(\n    descriptor: TypedFeaturesetDescriptor<FS, *>,\n    id: FeaturesetFeatureId,\n    state: FS,\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { }\n  ): Cancelable {\n    checkNativeMap(\"setFeatureState\")\n    return nativeMap.setFeatureState(\n      descriptor.toFeaturesetDescriptor(),\n      id,\n      state.internalState,\n      callback\n    )\n  }\n\n  /**\n   * Gets the state map for given [FeaturesetFeature].\n   *\n   * @param featuresetFeature typed [FeaturesetFeature] obtained from [MapInteraction] or needed overload of [queryRenderedFeatures].\n   * @param callback The [FeatureStateCallback] called when the query completes.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending query.\n   */\n  @MapboxExperimental\n  fun <FS : FeatureState> getFeatureState(\n    featuresetFeature: FeaturesetFeature<FS>,\n    callback: FeatureStateCallback<FS>\n  ): Cancelable {\n    checkNativeMap(\"getFeatureState\")\n    return featuresetFeature.id?.let { id ->\n      nativeMap.getFeatureState(\n        featuresetFeature.descriptor.toFeaturesetDescriptor(),\n        id\n      ) {\n        // trigger callback only when no error occurred\n        it.onValue { stateAsValue ->\n          callback.onFeatureState(\n            featuresetFeature.descriptor.getFeatureState(stateAsValue)\n          )\n        }\n      }\n    } ?: Cancelable { }.also {\n      logW(TAG, \"getFeatureState called but featuresetFeature.id is NULL!\")\n    }\n  }\n\n  /**\n   * Gets the state map of a feature from a featureset asynchronously.\n   *\n   * This API should be used with caution as [Feature] defined by the [FeaturesetFeatureId.featureId] only might not\n   * be compatible with provided [FeaturesetFeatureId.featureNamespace] and [descriptor] and thus API behaviour might be\n   * unexpected. It is safer to use overloaded [getFeatureState] taking [FeaturesetFeature].\n   *\n   * @param descriptor [TypedFeaturesetDescriptor] object representing either a featureset or a single layer.\n   * @param id identifier holding feature id and feature namespace.\n   * @param callback The [FeatureStateCallback] called when the query completes.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending query.\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  fun <FS : FeatureState> getFeatureState(\n    descriptor: TypedFeaturesetDescriptor<FS, *>,\n    id: FeaturesetFeatureId,\n    callback: FeatureStateCallback<FS>\n  ): Cancelable {\n    checkNativeMap(\"getFeatureState\")\n    return nativeMap.getFeatureState(\n      descriptor.toFeaturesetDescriptor(),\n      id,\n    ) {\n      // trigger callback only when no error occurred\n      it.onValue { stateAsValue ->\n        callback.onFeatureState(\n          descriptor.getFeatureState(stateAsValue)\n        )\n      }\n    }\n  }\n\n  /**\n   * Removes entries from a feature state based on [featuresetFeature] coming from an interaction callback.\n   *\n   * Removes a specified property or all property from a feature's state object, depending on the value of\n   * [stateKey].\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using [getFeatureState].\n   *\n   * @param featuresetFeature The featureset feature coming from an interaction callback.\n   * @param stateKey The key of the property to remove. If `null`, all feature's state object properties are removed.\n   * @param callback The [FeatureStateOperationCallback] called when the operation completes or ends.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending operation.\n   */\n  @JvmOverloads\n  fun <FS, FSK> removeFeatureState(\n    featuresetFeature: FeaturesetFeature<FS>,\n    stateKey: FSK? = null,\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { }\n  ): Cancelable where FS : FeatureState, FSK : FeatureStateKey<FS> {\n    checkNativeMap(\"removeFeatureState\")\n    return featuresetFeature.id?.let { id ->\n      nativeMap.removeFeatureState(\n        featuresetFeature.descriptor.toFeaturesetDescriptor(),\n        id,\n        stateKey?.key,\n        callback\n      )\n    } ?: Cancelable { }.also {\n      logW(TAG, \"removeFeatureState called but featuresetFeature.id is NULL!\")\n    }\n  }\n\n  /**\n   * Removes entries from a feature state object.\n   *\n   * This API should be used with caution as [Feature] defined by the [FeaturesetFeatureId.featureId] only might not\n   * be compatible with provided [FeaturesetFeatureId.featureNamespace] and [descriptor] and thus API behaviour might be\n   * unexpected. It is safer to use overloaded [getFeatureState] taking [FeaturesetFeature].\n   *\n   * Removes a specified property or all property from a feature's state object, depending on the value of\n   * [stateKey].\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using [getFeatureState].\n   *\n   * @param descriptor [TypedFeaturesetDescriptor] object representing either a featureset or a single layer.\n   * @param id identifier holding feature id and feature namespace.\n   * @param stateKey The key of the property to remove. If `null`, all feature's state object properties are removed.\n   * @param callback The [FeatureStateOperationCallback] called when the operation completes or ends.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending operation.\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  @JvmOverloads\n  fun <FS, FSK> removeFeatureState(\n    descriptor: TypedFeaturesetDescriptor<FS, *>,\n    id: FeaturesetFeatureId,\n    stateKey: FSK? = null,\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { },\n  ): Cancelable where FS : FeatureState, FSK : FeatureStateKey<FS> {\n    checkNativeMap(\"removeFeatureState\")\n    return nativeMap.removeFeatureState(\n      descriptor.toFeaturesetDescriptor(),\n      id,\n      stateKey?.key,\n      callback\n    )\n  }\n\n  /**\n   * Reset all the feature states within a style source.\n   *\n   * Remove all feature state entries from the specified style source or source layer.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using [getFeatureState].\n   *\n   * @param descriptor [TypedFeaturesetDescriptor] object representing either a featureset or a single layer.\n   * @param callback The [FeatureStateOperationCallback] called when the operation completes or ends.\n   *\n   * @return A [Cancelable] object that could be used to cancel the pending operation.\n   */\n  @JvmOverloads\n  fun resetFeatureStates(\n    descriptor: TypedFeaturesetDescriptor<*, *>,\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { }\n  ): Cancelable {\n    checkNativeMap(\"resetFeatureState\")\n    return nativeMap.resetFeatureStates(descriptor.toFeaturesetDescriptor(), callback)\n  }\n\n  /**\n   * Queries the map for given [descriptor] and returns typed [FeaturesetFeature] list in the callback.\n   *\n   * @param descriptor [TypedFeaturesetDescriptor] object representing either a featureset or a single layer.\n   * @param geometry The optional geometry ([ScreenCoordinate], [ScreenBox] or list of [ScreenCoordinate]s) to query for rendered features.\n   *  Passing NULL is equivalent to passing a bounding box encompassing the entire map viewport.\n   * @param filter optional global filter.\n   * @param callback The [QueryRenderedFeaturesetFeaturesCallback] called when the query operation completes.\n   *\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  @MapboxExperimental\n  @JvmOverloads\n  fun <FF : FeaturesetFeature<*>> queryRenderedFeatures(\n    descriptor: TypedFeaturesetDescriptor<*, FF>,\n    geometry: RenderedQueryGeometry? = null,\n    filter: Value? = null,\n    callback: QueryRenderedFeaturesetFeaturesCallback<FF>,\n  ): Cancelable {\n    checkNativeMap(\"queryRenderedFeatures\")\n    return nativeMap.queryRenderedFeatures(\n      geometry ?: RenderedQueryGeometry.valueOf(\n        ScreenBox(\n          ScreenCoordinate(0.0, 0.0),\n          ScreenCoordinate(getSize().width.toDouble(), getSize().height.toDouble())\n        )\n      ),\n      listOf(\n        FeaturesetQueryTarget(\n          descriptor.toFeaturesetDescriptor(),\n          filter,\n          null\n        )\n      )\n    ) { expected ->\n      expected.onValue { listQueriedRenderedFeatureAsValue ->\n        callback.onQueryRenderedFeatures(\n          listQueriedRenderedFeatureAsValue\n            // it is fine to have the QueriedFeature without an ID but we require the geometry\n            .filter { it.queriedFeature.feature.geometry() != null }\n            .map {\n              descriptor.getFeaturesetFeature(\n                feature = it.queriedFeature.feature,\n                featureNamespace = it.queriedFeature.featuresetFeatureId?.featureNamespace,\n                rawState = it.queriedFeature.state\n              )\n            }\n        )\n      }\n    }\n  }\n\n  /**\n   * Sets a feature state expression that applies to features within the specified featureset.\n   *\n   * All feature states with expressions that evaluate to true will be applied to the feature.\n   * Feature states from later added feature state expressions have higher priority. Regular feature states have higher priority than feature state expressions.\n   * The final feature state is determined by applying states in order from lower to higher priority. As a result, multiple expressions that set states with different keys can affect the same features simultaneously.\n   * If an expression is added for a feature set, properties from that feature set are used, not the properties from original sources.\n   *\n   * Note that updates to feature state expressions are asynchronous, so changes made by this method might not be\n   * immediately visible and will have some delay. The displayed data will not be affected immediately.\n   *\n   * @param featureStateExpressionId Unique identifier for the state expression.\n   * @param featureset The featureset descriptor that specifies which featureset the expression applies to.\n   * @param expression The expression to evaluate for the state. Should return boolean.\n   * @param state The `state` object with properties to update with their respective new values.\n   * @param callback The `feature state operation callback` called when the operation completes.\n   *\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  override fun <FS : FeatureState> setFeatureStateExpression(\n    featureStateExpressionId: Int,\n    featureset: TypedFeaturesetDescriptor<FS, *>,\n    expression: Value,\n    state: FS,\n    callback: FeatureStateOperationCallback,\n  ) {\n    checkNativeMap(\"setFeatureStateExpression\")\n    nativeMap.setFeatureStateExpression(\n      featureStateExpressionId,\n      featureset.toFeaturesetDescriptor(),\n      expression,\n      state.internalState,\n      callback\n    )\n  }\n\n  /**\n   * Removes a specific feature state expression.\n   *\n   * Remove a specific expression from the feature state expressions based on the expression ID.\n   *\n   * Note that updates to feature state expressions are asynchronous, so changes made by this method might not be\n   * immediately visible and will have some delay.\n   *\n   * @param featureStateExpressionId The unique identifier of the expression to remove.\n   * @param callback The `feature state operation callback` called when the operation completes.\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  override fun removeFeatureStateExpression(\n    featureStateExpressionId: Int,\n    callback: FeatureStateOperationCallback,\n  ) {\n    checkNativeMap(\"removeFeatureStateExpression\")\n    nativeMap.removeFeatureStateExpression(featureStateExpressionId, callback)\n  }\n\n  /**\n   * Reset all feature state expressions.\n   *\n   * Note that updates to feature state expressions are asynchronous, so changes made by this method might not be\n   * immediately visible and will have some delay.\n   *\n   * @param callback The `feature state operation callback` called when the operation completes.\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  override fun resetFeatureStateExpressions(\n    callback: FeatureStateOperationCallback,\n  ) {\n    checkNativeMap(\"resetFeatureStateExpressions\")\n    nativeMap.resetFeatureStateExpressions(callback)\n  }\n\n  /**\n   * For internal usage only.\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  fun getNativeMap(): Map = nativeMap.map\n\n  /**\n   * A convenience object to access MapboxMap's static utilities.\n   */\n  companion object {\n    /**\n     * Clears temporary map data.\n     *\n     * Clears temporary map data from the data path defined in the current options.\n     * Useful to reduce the disk usage or in case the disk cache contains invalid data.\n     *\n     * Note that calling this API will affect all maps that use the same data path and does not\n     * affect persistent map data like offline style packages.\n     *\n     * @param callback Called once the request is complete or an error occurred.\n     */\n    @JvmStatic\n    fun clearData(callback: AsyncOperationResultCallback) {\n      MapsResourceOptions.clearData(callback)\n    }\n\n    private const val TAG = \"Mbgl-MapboxMap\"\n    @JvmSynthetic\n    internal const val QFE_SUPER_CLUSTER = \"supercluster\"\n    @JvmSynthetic\n    internal const val QFE_LEAVES = \"leaves\"\n    @JvmSynthetic\n    internal const val QFE_LIMIT = \"limit\"\n    @JvmSynthetic\n    internal const val QFE_OFFSET = \"offset\"\n    @JvmSynthetic\n    internal const val QFE_DEFAULT_LIMIT = 10L\n    @JvmSynthetic\n    internal const val QFE_DEFAULT_OFFSET = 0L\n    @JvmSynthetic\n    internal const val QFE_CHILDREN = \"children\"\n    @JvmSynthetic\n    internal const val QFE_EXPANSION_ZOOM = \"expansion-zoom\"\n\n    @VisibleForTesting(otherwise = PRIVATE)\n    @JvmSynthetic\n    internal operator fun invoke(\n      nativeMap: NativeMapImpl,\n      nativeObserver: NativeObserver,\n      styleObserver: StyleObserver\n    ) = MapboxMap(nativeMap, nativeObserver, styleObserver)\n\n    @JvmSynthetic\n    internal operator fun invoke(\n      nativeMap: NativeMapImpl,\n      nativeObserver: NativeObserver,\n      pixelRatio: Float\n    ) = MapboxMap(nativeMap, nativeObserver, pixelRatio)\n\n    /**\n     * Calculates the bounding box for a list of points.\n     *\n     * @return the bounding box as a list of two points or the original [points] if the size is less than or equal to 2.\n     */\n    private fun calculateBoundingBox(points: List<Point>): List<Point> {\n      if (points.size <= 2) {\n        return points\n      }\n      var minLongitude = Double.POSITIVE_INFINITY\n      var minLatitude = Double.POSITIVE_INFINITY\n      var maxLongitude = Double.NEGATIVE_INFINITY\n      var maxLatitude = Double.NEGATIVE_INFINITY\n\n      for (point in points) {\n        val longitude = point.longitude()\n        val latitude = point.latitude()\n\n        if (minLongitude > longitude) {\n          minLongitude = longitude\n        }\n        if (minLatitude > latitude) {\n          minLatitude = latitude\n        }\n        if (maxLongitude < longitude) {\n          maxLongitude = longitude\n        }\n        if (maxLatitude < latitude) {\n          maxLatitude = latitude\n        }\n      }\n      return listOf(\n        Point.fromLngLat(minLongitude, minLatitude),\n        Point.fromLngLat(maxLongitude, maxLatitude)\n      )\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapboxMapRecorder.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.DataRef\nimport java.nio.ByteBuffer\n\n/**\n * MapboxMapRecorder provides functions to record and replay API calls of a [MapboxMap] instance.\n * These recordings can be used to debug issues which require multiple steps to reproduce.\n * Additionally, playbacks can be used for performance testing custom scenarios.\n *\n * Note: The raw format produced by [stopRecording] is experimental and there is no guarantee for version cross-compatibility when feeding it to [replay].\n *\n * To create the MapboxMapRecorder instance refer to [MapboxMap.createRecorder].\n */\n@MapboxExperimental\nclass MapboxMapRecorder @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) internal constructor(\n  private val mapRecorder: MapRecorder\n) {\n\n  /**\n   * Begins the recording session.\n   *\n   * @param options [MapRecorderOptions] to control recording.\n   */\n  @JvmOverloads\n  fun startRecording(options: MapRecorderOptions = mapRecorderOptions { }) {\n    mapRecorder.startRecording(options)\n  }\n\n  /**\n   * Stops the current recording session.\n   * Recorded section could be replayed with [replay] function.\n   *\n   * @return the [ByteBuffer] containing the recorded sequence in raw format.\n   */\n  fun stopRecording(): ByteBuffer {\n    val data = mapRecorder.stopRecording()\n    return data.buffer.apply { rewind() }\n  }\n\n  /**\n   * Replay a supplied sequence.\n   *\n   * @param recordedSequence Sequence recorded with [stopRecording] method.\n   * @param options Options to customize the behaviour of the playback.\n   * @param onEnded Callback to call when the playback ends.\n   */\n  @JvmOverloads\n  fun replay(\n    recordedSequence: ByteBuffer,\n    options: MapPlayerOptions = mapPlayerOptions { },\n    onEnded: () -> Unit = { }\n  ) {\n    val dataRef = DataRef.allocateNative(recordedSequence.limit())\n    dataRef.buffer.put(recordedSequence.apply { rewind() }).rewind()\n    mapRecorder.replay(dataRef, options) {\n      onEnded.invoke()\n    }\n  }\n\n  /**\n   * Temporarily pauses or resumes playback if already paused.\n   */\n  fun togglePauseReplay() {\n    mapRecorder.togglePauseReplay()\n  }\n\n  /**\n   * Returns the string description of the current state of playback.\n   */\n  fun getPlaybackState(): String {\n    return mapRecorder.playbackState\n  }\n}\n\n/**\n * DSL builder function to create [MapRecorderOptions] object.\n */\ninline fun mapRecorderOptions(block: MapRecorderOptions.Builder.() -> Unit): MapRecorderOptions =\n  MapRecorderOptions.Builder().apply(block).build()\n\n/**\n * DSL builder function to create [MapPlayerOptions] object.\n */\ninline fun mapPlayerOptions(block: MapPlayerOptions.Builder.() -> Unit): MapPlayerOptions =\n  MapPlayerOptions.Builder().apply(block).build()"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapboxMapsOptions.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.common.TileStore\n\n/**\n * Manages configuration options that are used by the Maps API objects, such as maps data directory and base URL.\n *\n * The Maps API objects include instances of [MapView], [Snapshotter], [OfflineManager] and [OfflineRegionManager].\n *\n * The options changes are taken into consideration by the Maps API objects during their construction phase.\n * Any changes made to the options during runtime will not impact objects that have already been created.\n *\n * If the options need to be overridden, it is recommended to do it once at the application start and before\n * any of the Maps API objects are constructed. Although it is technically possible to run Maps API objects that use different\n * resource options, such a setup might cause performance implications.\n */\nobject MapboxMapsOptions {\n  /**\n   * Base URL that would be used by the Maps engine to make HTTP requests.\n   *\n   * The value of the key must be a string that is a valid URL.\n   *\n   * By default the engine uses the base URL `https://api.mapbox.com`\n   */\n  @JvmStatic\n  var baseUrl: String\n    get() = MapsResourceOptions.getBaseURL()\n    set(value) = MapsResourceOptions.setBaseURL(value)\n\n  /**\n   * The path to the Mapbox Maps data folder.\n   *\n   * The engine will use this folder for storing offline style packages and temporary data.\n   *\n   * The application must have sufficient permissions to create files within the provided directory.\n   */\n  @JvmStatic\n  var dataPath: String\n    get() = MapsResourceOptions.getDataPath()\n    set(value) = MapsResourceOptions.setDataPath(value)\n\n  /**\n   * the tile store usage mode for the Maps API objects.\n   *\n   * The [TileStoreUsageMode.READ_ONLY] mode is used by default.\n   */\n  @JvmStatic\n  var tileStoreUsageMode: TileStoreUsageMode\n    get() = MapsResourceOptions.getTileStoreUsageMode()\n    set(value) = MapsResourceOptions.setTileStoreUsageMode(value)\n\n  /**\n   * The [TileStore] instance for the Maps API objects.\n   *\n   * This resource option is taken into consideration by the Maps API objects only if tile store usage is enabled.\n   *\n   * If null is set, but tile store usage is enabled, a tile store at the default location will be created and used.\n   */\n  @JvmStatic\n  var tileStore: TileStore?\n    get() = MapsResourceOptions.getTileStore()\n    set(value) = MapsResourceOptions.setTileStore(value)\n}\n\n/**\n * Access Mapbox Maps SDK specific options.\n */\n@Suppress(\"UnusedReceiverParameter\")\n@get:JvmSynthetic\nval MapboxOptions.mapsOptions\n  get() = MapboxMapsOptions"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/MapboxTracing.kt",
    "content": "package com.mapbox.maps\n\n/**\n * Allows to control several levels of tracing that could be useful to understand the performance of Mapbox Maps.\n * For more details about Android tracing refer to relevant section of DEVELOPING.md file.\n * API is deprecated, please use com.mapbox.common.MapboxTracing\n */\n@Deprecated(\n  \"Please use com.mapbox.common.MapboxTracing instead.\",\n  replaceWith = ReplaceWith(\"MapboxTracing\", \"com.mapbox.common.MapboxTracing\")\n)\nobject MapboxTracing {\n  private val impl = com.mapbox.common.MapboxTracing\n\n  /**\n   * Enable all the traces: native rendering engine traces and Android Maps SDK traces.\n   *\n   * Enabling Mapbox tracing is only recommended for local performance measurements, to capture accurate results.\n   * This tracing is designed to be usable in release builds to enable local profiling.\n   */\n  fun enableAll() {\n    impl.enableAll()\n  }\n\n  /**\n   * Enable only native rendering engine traces.\n   *\n   * @throws [RuntimeException] if build is not debuggable.\n   */\n  fun enablePlatform() {\n    impl.enablePlatform()\n  }\n\n  /**\n   * Enable only Android Maps SDK traces.\n   *\n   * @throws [RuntimeException] if build is not debuggable.\n   */\n  fun enableCore() {\n    impl.enableCore()\n  }\n\n  /**\n   * Disable all traces.\n   *\n   * @throws [RuntimeException] if build is not debuggable.\n   */\n  fun disableAll() {\n    impl.disableAll()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/NativeMapImpl.kt",
    "content": "package com.mapbox.maps\n\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.annotation.MainThread\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.Point\nimport java.util.HashSet\nimport java.util.concurrent.CopyOnWriteArrayList\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class NativeMapImpl(val map: Map) {\n\n  @Volatile\n  internal var sizeSet = false\n    @Synchronized\n    set(value) {\n      // callbacks should be invoked only when size was not set and being set now\n      if (value && !field) {\n        // in current design this function is called from Android render thread\n        // so we explicitly invoke callback on main thread\n        if (Looper.myLooper() != Looper.getMainLooper()) {\n          mainHandler.post {\n            if (sizeSet) {\n              sizeSetCallbackList.forEach {\n                it.invoke()\n              }\n              sizeSetCallbackList.clear()\n            }\n          }\n        } else {\n          sizeSetCallbackList.forEach {\n            it.invoke()\n          }\n          sizeSetCallbackList.clear()\n        }\n      }\n      field = value\n    }\n  private var sizeSetCallbackList = CopyOnWriteArrayList<() -> (Unit)>()\n  private val mainHandler = Handler(Looper.getMainLooper())\n\n  @MainThread\n  fun whenMapSizeReady(callback: () -> (Unit)) {\n    if (sizeSet) {\n      callback.invoke()\n    } else {\n      sizeSetCallbackList.add(callback)\n    }\n  }\n\n  fun setSize(size: Size) {\n    map.size = size\n    sizeSet = true\n  }\n\n  fun getSize(): Size {\n    return map.size\n  }\n\n  fun createRenderer() {\n    map.createRenderer()\n  }\n\n  fun destroyRenderer() {\n    map.destroyRenderer()\n  }\n\n  fun render() {\n    map.render()\n  }\n\n  fun getVulkanManager(): IVulkanManager? {\n    return map.createVulkanManager()\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @MapboxExperimental\n  fun resetThreadServiceType() {\n    map.resetThreadServiceType()\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @MapboxExperimental\n  fun setScaleFactor(scaleFactor: Float) {\n    map.scaleFactor = scaleFactor\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @MapboxExperimental\n  fun getScaleFactor(): Float {\n    return map.scaleFactor\n  }\n\n  fun setCamera(cameraOptions: CameraOptions) {\n    map.setCamera(cameraOptions)\n  }\n\n  fun getCameraState(): CameraState {\n    return map.cameraState\n  }\n\n  fun coordinatesForPixels(pixels: MutableList<ScreenCoordinate>): MutableList<Point> {\n    return map.coordinatesForPixels(pixels)\n  }\n\n  fun cameraForCoordinateBounds(\n    coordinateBounds: CoordinateBounds,\n    padding: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?,\n    maxZoom: Double?,\n    offset: ScreenCoordinate?\n  ): CameraOptions {\n    return map.cameraForCoordinateBounds(coordinateBounds, padding, bearing, pitch, maxZoom, offset)\n  }\n\n  fun coordinateInfoForPixel(pixel: ScreenCoordinate): CoordinateInfo {\n    return map.coordinateInfoForPixel(pixel)\n  }\n\n  fun coordinatesInfoForPixels(pixels: List<ScreenCoordinate>): List<CoordinateInfo> {\n    return map.coordinatesInfoForPixels(pixels)\n  }\n\n  fun setUserAnimationInProgress(inProgress: Boolean) {\n    map.isUserAnimationInProgress = inProgress\n  }\n\n  @MapboxExperimental\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  fun setCameraAnimationHint(cameraAnimationHint: CameraAnimationHint) {\n    map.setCameraAnimationHint(cameraAnimationHint)\n  }\n\n  fun invalidateStyleCustomGeometrySourceRegion(\n    sourceId: String,\n    coordinateBounds: CoordinateBounds\n  ): Expected<String, None> {\n    return map.invalidateStyleCustomGeometrySourceRegion(sourceId, coordinateBounds)\n  }\n\n  fun setStyleTerrain(properties: Value): Expected<String, None> {\n    return map.setStyleTerrain(properties)\n  }\n\n  fun getStyleTerrainProperty(property: String): StylePropertyValue {\n    return map.getStyleTerrainProperty(property)\n  }\n\n  fun setStyleTerrainProperty(property: String, value: Value): Expected<String, None> {\n    return map.setStyleTerrainProperty(property, value)\n  }\n\n  fun setStyleProjection(properties: Value): Expected<String, None> {\n    return map.setStyleProjection(properties)\n  }\n\n  fun getStyleProjectionProperty(property: String): StylePropertyValue {\n    return map.getStyleProjectionProperty(property)\n  }\n\n  fun setStyleProjectionProperty(property: String, value: Value): Expected<String, None> {\n    return map.setStyleProjectionProperty(property, value)\n  }\n\n  fun cameraForCoordinates(\n    points: List<Point>,\n    padding: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?\n  ): CameraOptions {\n    return map.cameraForCoordinates(points, padding, bearing, pitch)\n  }\n\n  fun cameraForCoordinates(\n    points: List<Point>,\n    camera: CameraOptions,\n    box: ScreenBox\n  ): CameraOptions {\n    return map.cameraForCoordinates(points, camera, box)\n  }\n\n  fun cameraForCoordinates(\n    points: List<Point>,\n    camera: CameraOptions,\n    padding: EdgeInsets?,\n    maxZoom: Double?,\n    offset: ScreenCoordinate?\n  ): Expected<String, CameraOptions> {\n    return map.cameraForCoordinates(points, camera, padding, maxZoom, offset)\n  }\n\n  fun cameraForGeometry(\n    geometry: Geometry,\n    padding: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?\n  ): CameraOptions {\n    return map.cameraForGeometry(geometry, padding, bearing, pitch)\n  }\n\n  fun getElevation(point: Point): Double? {\n    return map.getElevation(point)\n  }\n\n  fun setViewAnnotationPositionsUpdateListener(listener: ViewAnnotationPositionsUpdateListener?) {\n    map.setViewAnnotationPositionsUpdateListener(listener)\n  }\n\n  fun addViewAnnotation(\n    identifier: String,\n    options: ViewAnnotationOptions\n  ): Expected<String, None> {\n    return map.addViewAnnotation(identifier, options)\n  }\n\n  fun updateViewAnnotation(\n    identifier: String,\n    options: ViewAnnotationOptions\n  ): Expected<String, None> {\n    return map.updateViewAnnotation(identifier, options)\n  }\n\n  fun removeViewAnnotation(identifier: String): Expected<String, None> {\n    return map.removeViewAnnotation(identifier)\n  }\n\n  fun getViewAnnotationOptions(identifier: String): Expected<String, ViewAnnotationOptions> {\n    return map.getViewAnnotationOptions(identifier)\n  }\n\n  fun tileCover(\n    tileCoverOptions: TileCoverOptions,\n    cameraOptions: CameraOptions?\n  ): MutableList<CanonicalTileID> {\n    return map.tileCover(tileCoverOptions, cameraOptions)\n  }\n\n  fun coordinateBoundsForCamera(cameraOptions: CameraOptions): CoordinateBounds {\n    return map.coordinateBoundsForCamera(cameraOptions)\n  }\n\n  fun coordinateBoundsForCameraUnwrapped(cameraOptions: CameraOptions): CoordinateBounds {\n    return map.coordinateBoundsForCameraUnwrapped(cameraOptions)\n  }\n\n  fun coordinateBoundsZoomForCameraUnwrapped(cameraOptions: CameraOptions): CoordinateBoundsZoom {\n    return map.coordinateBoundsZoomForCameraUnwrapped(cameraOptions)\n  }\n\n  fun pixelsForCoordinates(coordinates: MutableList<Point>): MutableList<ScreenCoordinate> {\n    return map.pixelsForCoordinates(coordinates)\n  }\n\n  fun setGestureInProgress(gestureInProgress: Boolean) {\n    map.isGestureInProgress = gestureInProgress\n  }\n\n  fun isGestureInProgress(): Boolean {\n    return map.isGestureInProgress\n  }\n\n  fun setBounds(boundOptions: CameraBoundsOptions): Expected<String, None> {\n    return map.setBounds(boundOptions)\n  }\n\n  fun getBounds(): CameraBounds {\n    return map.bounds\n  }\n\n  fun setPrefetchZoomDelta(zoomDelta: Byte) {\n    map.prefetchZoomDelta = zoomDelta\n  }\n\n  fun getPrefetchZoomDelta(): Byte {\n    return map.prefetchZoomDelta\n  }\n\n  fun setNorthOrientation(northOrientation: NorthOrientation) {\n    map.setNorthOrientation(northOrientation)\n  }\n\n  fun setConstrainMode(constrainMode: ConstrainMode) {\n    map.setConstrainMode(constrainMode)\n  }\n\n  fun setViewportMode(viewportMode: ViewportMode) {\n    map.setViewportMode(viewportMode)\n  }\n\n  fun getMapOptions(): MapOptions {\n    return map.mapOptions\n  }\n\n  fun triggerRepaint() {\n    map.triggerRepaint()\n  }\n\n  fun setStyleLayerProperty(\n    layerId: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    return map.setStyleLayerProperty(layerId, property, value)\n  }\n\n  fun pixelForCoordinate(pixel: Point): ScreenCoordinate {\n    return map.pixelForCoordinate((pixel))\n  }\n\n  fun coordinateForPixel(screenCoordinate: ScreenCoordinate): Point {\n    return map.coordinateForPixel(screenCoordinate)\n  }\n\n  fun getDebug(): List<MapDebugOptions> {\n    return map.debug\n  }\n\n  fun setDebug(list: List<MapDebugOptions>, debugActive: Boolean) {\n    map.setDebug(list, debugActive)\n  }\n\n  fun addStyleLayer(\n    parameters: Value,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    return map.addStyleLayer(parameters, layerPosition)\n  }\n\n  fun addStyleCustomLayer(\n    layerId: String,\n    layerHost: CustomLayerHost,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    return map.addStyleCustomLayer(layerId, layerHost, layerPosition)\n  }\n\n  fun addPersistentStyleLayer(\n    properties: Value,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    return map.addPersistentStyleLayer(properties, layerPosition)\n  }\n\n  fun addPersistentStyleCustomLayer(\n    layerId: String,\n    layerHost: CustomLayerHost,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    return map.addPersistentStyleCustomLayer(layerId, layerHost, layerPosition)\n  }\n\n  fun isStyleLayerPersistent(layerId: String): Expected<String, Boolean> {\n    return map.isStyleLayerPersistent(layerId)\n  }\n\n  fun moveStyleLayer(\n    layerId: String,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    return map.moveStyleLayer(layerId, layerPosition)\n  }\n\n  fun setStyleJSON(json: String) {\n    map.styleJSON = json\n  }\n\n  fun getStyleJSON(): String {\n    return map.styleJSON\n  }\n\n  fun getStyleURI(): String {\n    return map.styleURI\n  }\n\n  fun setStyleURI(uri: String) {\n    map.styleURI = uri\n  }\n\n  fun getStyleDefaultCamera(): CameraOptions {\n    return map.styleDefaultCamera\n  }\n\n  fun getStyleTransition(): TransitionOptions {\n    return map.styleTransition\n  }\n\n  fun setStyleTransition(transitionOptions: TransitionOptions) {\n    map.styleTransition = transitionOptions\n  }\n\n  fun removeStyleLayer(layerId: String): Expected<String, None> {\n    return map.removeStyleLayer(layerId)\n  }\n\n  fun styleLayerExists(layerId: String): Boolean {\n    return map.styleLayerExists(layerId)\n  }\n\n  fun getStyleLayerProperty(layerId: String, property: String): StylePropertyValue {\n    return map.getStyleLayerProperty(layerId, property)\n  }\n\n  fun setStyleLayerProperties(layerId: String, properties: Value): Expected<String, None> {\n    return map.setStyleLayerProperties(layerId, properties)\n  }\n\n  fun addStyleSource(sourceId: String, source: Value): Expected<String, None> {\n    return map.addStyleSource(sourceId, source)\n  }\n\n  fun getStyleSourceProperties(sourceId: String): Expected<String, Value> {\n    return map.getStyleSourceProperties(sourceId)\n  }\n\n  fun updateStyleImageSourceImage(sourceId: String, image: Image): Expected<String, None> {\n    return map.updateStyleImageSourceImage(sourceId, image)\n  }\n\n  fun getStyleLayerProperties(layerId: String): Expected<String, Value> {\n    return map.getStyleLayerProperties(layerId)\n  }\n\n  fun removeStyleSource(sourceId: String): Expected<String, None> {\n    return map.removeStyleSource(sourceId)\n  }\n\n  fun setStyleCustomGeometrySourceTileData(\n    sourceId: String,\n    tileId: CanonicalTileID,\n    featureCollection: MutableList<Feature>\n  ): Expected<String, None> {\n    return map.setStyleCustomGeometrySourceTileData(sourceId, tileId, featureCollection)\n  }\n\n  fun styleSourceExists(sourceId: String): Boolean {\n    return map.styleSourceExists(sourceId)\n  }\n\n  fun setStyleLightProperty(\n    id: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    return map.setStyleLightProperty(id, property, value)\n  }\n\n  fun getStyleLights(): MutableList<StyleObjectInfo> {\n    return map.styleLights\n  }\n\n  fun setStyleLights(lights: Value): Expected<String, None> {\n    return map.setStyleLights(lights)\n  }\n\n  fun setStyleAtmosphere(properties: Value): Expected<String, None> {\n    return map.setStyleAtmosphere(properties)\n  }\n\n  fun getStyleAtmosphereProperty(property: String): StylePropertyValue {\n    return map.getStyleAtmosphereProperty(property)\n  }\n\n  fun setStyleAtmosphereProperty(property: String, value: Value): Expected<String, None> {\n    return map.setStyleAtmosphereProperty(property, value)\n  }\n\n  fun getStyleLightProperty(id: String, property: String): StylePropertyValue {\n    return map.getStyleLightProperty(id, property)\n  }\n\n  fun getStyleImage(imageId: String): Image? {\n    return map.getStyleImage(imageId)\n  }\n\n  fun removeStyleImage(imageId: String): Expected<String, None> {\n    return map.removeStyleImage(imageId)\n  }\n\n  fun hasStyleImage(imageId: String): Boolean {\n    return map.hasStyleImage(imageId)\n  }\n\n  fun addStyleModel(modelId: String, modelUri: String): Expected<String, None> {\n    return map.addStyleModel(modelId, modelUri)\n  }\n\n  fun removeStyleModel(modelId: String): Expected<String, None> {\n    return map.removeStyleModel(modelId)\n  }\n\n  fun hasStyleModel(modelId: String): Boolean {\n    return map.hasStyleModel(modelId)\n  }\n\n  fun queryRenderedFeatures(\n    geometry: RenderedQueryGeometry,\n    options: RenderedQueryOptions,\n    callback: QueryRenderedFeaturesCallback\n  ): Cancelable = map.queryRenderedFeatures(geometry, options, callback)\n\n  fun querySourceFeatures(\n    sourceId: String,\n    options: SourceQueryOptions,\n    callback: QuerySourceFeaturesCallback\n  ): Cancelable = map.querySourceFeatures(sourceId, options, callback)\n\n  @MapboxExperimental\n  fun queryRenderedRasterValues(\n    coordinate: ScreenCoordinate,\n    options: RenderedRasterQueryOptions,\n    callback: QueryRenderedRasterValuesCallback\n  ): Cancelable = map.queryRenderedRasterValues(coordinate, options, callback)\n\n  fun queryFeatureExtensions(\n    sourceIdentifier: String,\n    feature: Feature,\n    extension: String,\n    extensionField: String,\n    args: HashMap<String, Value>?,\n    callback: QueryFeatureExtensionCallback\n  ): Cancelable = map.queryFeatureExtensions(sourceIdentifier, feature, extension, extensionField, args, callback)\n\n  fun setFeatureState(\n    sourceId: String,\n    sourceLayerId: String?,\n    featureId: String,\n    state: Value,\n    callback: FeatureStateOperationCallback,\n  ): Cancelable = map.setFeatureState(sourceId, sourceLayerId, featureId, state, callback)\n\n  fun getFeatureState(\n    sourceId: String,\n    sourceLayerId: String?,\n    featureId: String,\n    callback: QueryFeatureStateCallback\n  ): Cancelable = map.getFeatureState(sourceId, sourceLayerId, featureId, callback)\n\n  fun getFreeCameraOptions(): FreeCameraOptions {\n    return map.freeCameraOptions\n  }\n\n  fun setCamera(freeCameraOptions: FreeCameraOptions) {\n    map.setCamera(freeCameraOptions)\n  }\n\n  fun invalidateStyleCustomGeometrySourceTile(\n    sourceId: String,\n    tileId: CanonicalTileID\n  ): Expected<String, None> {\n    return map.invalidateStyleCustomGeometrySourceTile(sourceId, tileId)\n  }\n\n  fun setStyleSourceProperties(\n    sourceId: String,\n    properties: Value\n  ): Expected<String, None> {\n    return map.setStyleSourceProperties(sourceId, properties)\n  }\n\n  fun setStyleGeoJSONSourceData(\n    sourceId: String,\n    dataId: String,\n    data: GeoJSONSourceData\n  ): Expected<String, None> {\n    return map.setStyleGeoJSONSourceData(sourceId, dataId, data)\n  }\n\n  fun removeFeatureState(\n    sourceId: String,\n    sourceLayerId: String?,\n    featureId: String,\n    stateKey: String?,\n    callback: FeatureStateOperationCallback,\n  ): Cancelable {\n    return map.removeFeatureState(sourceId, sourceLayerId, featureId, stateKey, callback)\n  }\n\n  fun resetFeatureStates(\n    sourceId: String,\n    sourceLayerId: String?,\n    callback: FeatureStateOperationCallback\n  ): Cancelable {\n    return map.resetFeatureStates(sourceId, sourceLayerId, callback)\n  }\n\n  fun setTileCacheBudget(tileCacheBudget: TileCacheBudget?) {\n    map.setTileCacheBudget(tileCacheBudget)\n  }\n\n  fun addStyleCustomGeometrySource(\n    sourceId: String,\n    options: CustomGeometrySourceOptions\n  ): Expected<String, None> {\n    return map.addStyleCustomGeometrySource(sourceId, options)\n  }\n\n  fun addStyleImage(\n    imageId: String,\n    scale: Float,\n    image: Image,\n    sdf: Boolean,\n    stretchX: MutableList<ImageStretches>,\n    stretchY: MutableList<ImageStretches>,\n    content: ImageContent?\n  ): Expected<String, None> {\n    return map.addStyleImage(imageId, scale, image, sdf, stretchX, stretchY, content)\n  }\n\n  fun reduceMemoryUse() {\n    map.reduceMemoryUse()\n  }\n\n  fun isUserAnimationInProgress(): Boolean {\n    return map.isUserAnimationInProgress\n  }\n\n  fun getStyleSourceProperty(sourceId: String, property: String): StylePropertyValue {\n    return map.getStyleSourceProperty(sourceId, property)\n  }\n\n  fun isStyleLoaded(): Boolean {\n    return map.isStyleLoaded\n  }\n\n  fun setStyleSourceProperty(\n    sourceId: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    return map.setStyleSourceProperty(sourceId, property, value)\n  }\n\n  @MapboxExperimental\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  fun setStyleSourceProperty(\n    importId: String,\n    sourceId: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    return map.setStyleSourceProperty(importId, sourceId, property, value)\n  }\n\n  fun coordinateBoundsZoomForCamera(camera: CameraOptions): CoordinateBoundsZoom {\n    return map.coordinateBoundsZoomForCamera(camera)\n  }\n\n  fun getStyleLayers(): List<StyleObjectInfo> {\n    return map.styleLayers\n  }\n\n  fun getStyleSources(): List<StyleObjectInfo> {\n    return map.styleSources\n  }\n\n  fun setRenderWorldCopies(renderWorldCopies: Boolean) {\n    map.renderWorldCopies = renderWorldCopies\n  }\n\n  fun getRenderWorldCopies(): Boolean {\n    return map.renderWorldCopies\n  }\n\n  fun subscribe(mapLoadedCallback: MapLoadedCallback): Cancelable {\n    return map.subscribe(mapLoadedCallback)\n  }\n\n  fun subscribe(onMapIdleListener: MapIdleCallback): Cancelable {\n    return map.subscribe(onMapIdleListener)\n  }\n\n  fun subscribe(mapLoadingErrorCallback: MapLoadingErrorCallback): Cancelable {\n    return map.subscribe(mapLoadingErrorCallback)\n  }\n\n  fun subscribe(styleLoadedCallback: StyleLoadedCallback): Cancelable {\n    return map.subscribe(styleLoadedCallback)\n  }\n\n  fun subscribe(styleDataLoadedCallback: StyleDataLoadedCallback): Cancelable {\n    return map.subscribe(styleDataLoadedCallback)\n  }\n\n  fun subscribe(sourceDataLoadedCallback: SourceDataLoadedCallback): Cancelable {\n    return map.subscribe(sourceDataLoadedCallback)\n  }\n\n  fun subscribe(sourceAddedCallback: SourceAddedCallback): Cancelable {\n    return map.subscribe(sourceAddedCallback)\n  }\n\n  fun subscribe(sourceRemovedCallback: SourceRemovedCallback): Cancelable {\n    return map.subscribe(sourceRemovedCallback)\n  }\n\n  fun subscribe(styleImageMissingCallback: StyleImageMissingCallback): Cancelable {\n    return map.subscribe(styleImageMissingCallback)\n  }\n\n  fun subscribe(styleImageRemoveUnusedCallback: StyleImageRemoveUnusedCallback): Cancelable {\n    return map.subscribe(styleImageRemoveUnusedCallback)\n  }\n\n  fun subscribe(cameraChangedCallback: CameraChangedCallback): Cancelable {\n    return map.subscribe(cameraChangedCallback)\n  }\n\n  @com.mapbox.annotation.MapboxExperimental\n  fun subscribe(cameraChangedCoalescedCallback: CameraChangedCoalescedCallback): Cancelable {\n    return map.subscribe(cameraChangedCoalescedCallback)\n  }\n\n  fun subscribe(renderFrameStartedCallback: RenderFrameStartedCallback): Cancelable {\n    return map.subscribe(renderFrameStartedCallback)\n  }\n\n  fun subscribe(renderFrameFinishedCallback: RenderFrameFinishedCallback): Cancelable {\n    return map.subscribe(renderFrameFinishedCallback)\n  }\n\n  fun subscribe(resourceRequestCallback: ResourceRequestCallback): Cancelable {\n    return map.subscribe(resourceRequestCallback)\n  }\n\n  @MapboxExperimental\n  fun subscribe(eventName: String, onGenericEventsListener: GenericEventCallback): Cancelable {\n    return map.subscribe(eventName, onGenericEventsListener)\n  }\n\n  fun getAttributions(): List<String> {\n    return map.attributions\n  }\n\n  fun cameraForDrag(fromPoint: ScreenCoordinate, toPoint: ScreenCoordinate): CameraOptions {\n    return map.cameraForDrag(fromPoint, toPoint)\n  }\n\n  fun setCenterAltitudeMode(mode: MapCenterAltitudeMode) {\n    map.setCenterAltitudeMode(mode)\n  }\n\n  fun getCenterAltitudeMode(): MapCenterAltitudeMode {\n    return map.centerAltitudeMode\n  }\n\n  fun setScreenCullingShape(shape: List<Vec2>) {\n    map.screenCullingShape = shape\n  }\n\n  fun getScreenCullingShape(): List<Vec2> {\n    return map.screenCullingShape\n  }\n\n  fun startPerformanceStatisticsCollection(\n    options: PerformanceStatisticsOptions,\n    callback: PerformanceStatisticsCallback,\n  ) {\n    map.startPerformanceStatisticsCollection(options, callback)\n  }\n\n  fun stopPerformanceStatisticsCollection() {\n    map.stopPerformanceStatisticsCollection()\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @MapboxExperimental\n  fun setViewAnnotationAvoidLayers(layerIds: HashSet<String>?): Expected<String, None> {\n    return map.setViewAnnotationAvoidLayers(layerIds)\n  }\n\n  fun getViewAnnotationAvoidLayers(): HashSet<String> {\n    return map.viewAnnotationAvoidLayers\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @MapboxExperimental\n  fun getIndoorManager(): IndoorManager {\n    return map.indoorManager\n  }\n\n  // ///// START INTERACTIONS /////////\n\n  fun addInteraction(interaction: Interaction): Cancelable {\n    return map.addInteraction(interaction)\n  }\n\n  fun dispatch(platformEventInfo: PlatformEventInfo) {\n    map.dispatch(platformEventInfo)\n  }\n\n  fun setFeatureState(\n    featureset: FeaturesetDescriptor,\n    featureId: FeaturesetFeatureId,\n    state: Value,\n    callback: FeatureStateOperationCallback\n  ): Cancelable {\n    return map.setFeatureState(featureset, featureId, state, callback)\n  }\n\n  fun getFeatureState(\n    featureset: FeaturesetDescriptor,\n    featureId: FeaturesetFeatureId,\n    callback: QueryFeatureStateCallback\n  ): Cancelable {\n    return map.getFeatureState(featureset, featureId, callback)\n  }\n\n  fun removeFeatureState(\n    featureset: FeaturesetDescriptor,\n    featureId: FeaturesetFeatureId,\n    stateKey: String?,\n    callback: FeatureStateOperationCallback\n  ): Cancelable {\n    return map.removeFeatureState(featureset, featureId, stateKey, callback)\n  }\n\n  fun resetFeatureStates(\n    featureset: FeaturesetDescriptor,\n    callback: FeatureStateOperationCallback\n  ): Cancelable {\n    return map.resetFeatureStates(featureset, callback)\n  }\n\n  fun queryRenderedFeatures(\n    geometry: RenderedQueryGeometry,\n    targets: List<FeaturesetQueryTarget>,\n    callback: QueryRenderedFeaturesCallback\n  ): Cancelable {\n    return map.queryRenderedFeatures(geometry, targets, callback)\n  }\n  // ///// END INTERACTIONS /////////\n\n  @MapboxExperimental\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  fun setFeatureStateExpression(\n    featureStateExpressionId: Int,\n    featureset: FeaturesetDescriptor,\n    expression: Value,\n    state: Value,\n    callback: FeatureStateOperationCallback,\n  ) = map.setFeatureStateExpression(featureStateExpressionId.toLong(), featureset, expression, state, callback)\n\n  @MapboxExperimental\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  fun removeFeatureStateExpression(\n    featureStateExpressionId: Int,\n    callback: FeatureStateOperationCallback,\n  ) = map.removeFeatureStateExpression(featureStateExpressionId.toLong(), callback)\n\n  @MapboxExperimental\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  fun resetFeatureStateExpressions(\n    callback: FeatureStateOperationCallback,\n  ) = map.resetFeatureStateExpressions(callback)\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/NativeObserver.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.UiThread\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.extension.observable.*\nimport com.mapbox.maps.plugin.delegates.listeners.*\nimport java.util.Objects\nimport java.util.concurrent.CopyOnWriteArraySet\n\n@Suppress(\"DeprecatedCallableAddReplaceWith\", \"DEPRECATION\")\n@UiThread\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class NativeObserver(\n  private val observable: NativeMapImpl\n) {\n  /**\n   * A [Cancelable] that will add itself to the given [cancelableSet] when created and remove\n   * itself when [cancel]ed.\n   *\n   * @param originalCancelable its [Cancelable.cancel] will be called when [cancel] is executed.\n   * @param onCancel function to be called after [cancel] is executed.\n   * @param cancelableSet a [MutableSet] that will hold this cancelable while it is active.\n   * @param listener a listener called [cancel] is executed.\n   */\n  private open inner class ExtendedCancelable(\n    open val originalCancelable: Cancelable,\n    val onCancel: (() -> Unit)? = null,\n    private val cancelableSet: MutableSet<ExtendedCancelable> = this@NativeObserver.cancelableSet,\n    val listener: Any? = null,\n  ) : Cancelable {\n    init {\n      @Suppress(\"LeakingThis\")\n      cancelableSet.add(this)\n    }\n\n    override fun cancel() {\n      cancelableSet.remove(this)\n      originalCancelable.cancel()\n      onCancel?.invoke()\n    }\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (javaClass != other?.javaClass) return false\n\n      other as ExtendedCancelable\n\n      if (originalCancelable != other.originalCancelable) return false\n      if (cancelableSet != other.cancelableSet) return false\n      if (onCancel != other.onCancel) return false\n      if (listener != other.listener) return false\n\n      return true\n    }\n\n    override fun hashCode(): Int =\n      Objects.hash(originalCancelable, cancelableSet, onCancel, listener)\n  }\n\n  /**\n   * An [ExtendedCancelable] that can resubscribe with [resubscriber].\n   *\n   * @param resubscriber lambda to produce new [Cancelable] when [resubscribe] is called.\n   * @param originalCancelable its [Cancelable.cancel] will be called when [cancel] is executed. It will be updated when [resubscribe] is executed.\n   * @param cancelableSet a [MutableSet] that will hold this cancelable while it is active.\n   * @param onCancel function to be called after [cancel] is executed.\n   * @param listener a listener called [cancel] is executed.\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  private inner class ResubscribeExtendedCancelable(\n    private val resubscriber: () -> Cancelable,\n    override var originalCancelable: Cancelable,\n    cancelableSet: MutableSet<ResubscribeExtendedCancelable>,\n    onCancel: (() -> Unit)? = null,\n    listener: Any? = null,\n  ) : ExtendedCancelable(\n    originalCancelable = originalCancelable,\n    cancelableSet = cancelableSet as MutableSet<ExtendedCancelable>,\n    onCancel = onCancel,\n    listener = listener,\n  ) {\n    fun resubscribe() {\n      originalCancelable.cancel()\n      originalCancelable = resubscriber()\n    }\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (javaClass != other?.javaClass) return false\n      if (!super.equals(other)) return false\n\n      other as ResubscribeExtendedCancelable\n\n      return resubscriber == other.resubscriber\n    }\n\n    override fun hashCode(): Int = Objects.hash(super.hashCode(), resubscriber)\n  }\n\n  private val mapLoadingErrorCallbackSet = CopyOnWriteArraySet<MapLoadingErrorCallback>()\n\n  private val cancelableSet = CopyOnWriteArraySet<ExtendedCancelable>()\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  // ExtendedCancelable is private so we expose the set as generic Cancelable set\n  internal val _cancelableSet: MutableSet<out Cancelable> = cancelableSet\n\n  private val resubscribableSet = CopyOnWriteArraySet<ResubscribeExtendedCancelable>()\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  // ResubscribeExtendedCancelable is private so we expose the set as generic Cancelable set\n  internal val _resubscribableSet: MutableSet<out Cancelable> = resubscribableSet\n\n  private fun unsubscribeListener(listener: Any, cancelableSet: Set<ExtendedCancelable>) {\n    cancelableSet\n      .filter { it.listener == listener }\n      .forEach { it.cancel() }\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnCameraChangeListener(onCameraChangeListener: OnCameraChangeListener) {\n    subscribeCameraChanged(\n      cameraChangedCallback = {\n        onCameraChangeListener.onCameraChanged(it.toCameraChangedEventData())\n      },\n      onCameraChangeListener = onCameraChangeListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnCameraChangeListener(onCameraChangeListener: OnCameraChangeListener) {\n    unsubscribeListener(onCameraChangeListener, cancelableSet)\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnMapLoadedListener(onMapLoadedListener: OnMapLoadedListener) {\n    subscribeMapLoaded(\n      mapLoadedCallback = {\n        onMapLoadedListener.onMapLoaded(it.toMapLoadedEventData())\n      },\n      mapLoadedListener = onMapLoadedListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnMapLoadedListener(onMapLoadedListener: OnMapLoadedListener) {\n    unsubscribeListener(onMapLoadedListener, cancelableSet)\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnMapIdleListener(onMapIdleListener: OnMapIdleListener) {\n    subscribeMapIdle(\n      mapIdleCallback = {\n        onMapIdleListener.onMapIdle(it.toMapIdleEventData())\n      },\n      mapIdleListener = onMapIdleListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnMapIdleListener(onMapIdleListener: OnMapIdleListener) {\n    unsubscribeListener(onMapIdleListener, cancelableSet)\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnMapLoadErrorListener(onMapLoadErrorListener: OnMapLoadErrorListener) {\n    subscribeMapLoadingError(\n      mapLoadingErrorCallback = {\n        onMapLoadErrorListener.onMapLoadError(it.toMapLoadingErrorEventData())\n      },\n      mapLoadingErrorListener = onMapLoadErrorListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnMapLoadErrorListener(onMapLoadErrorListener: OnMapLoadErrorListener) {\n    unsubscribeListener(onMapLoadErrorListener, cancelableSet)\n  }\n\n  // Style events\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnStyleLoadedListener(onStyleLoadedListener: OnStyleLoadedListener) {\n    subscribeStyleLoaded(\n      styleLoadedCallback = {\n        onStyleLoadedListener.onStyleLoaded(it.toStyleLoadedEventData())\n      },\n      styleLoadedListener = onStyleLoadedListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnStyleLoadedListener(onStyleLoadedListener: OnStyleLoadedListener) {\n    unsubscribeListener(onStyleLoadedListener, resubscribableSet)\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnStyleDataLoadedListener(onStyleDataLoadedListener: OnStyleDataLoadedListener) {\n    subscribeStyleDataLoaded(\n      styleDataLoadedCallback = {\n        onStyleDataLoadedListener.onStyleDataLoaded(it.toStyleDataLoadedEventData())\n      },\n      styleDataLoadedListener = onStyleDataLoadedListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnStyleDataLoadedListener(onStyleDataLoadedListener: OnStyleDataLoadedListener) {\n    unsubscribeListener(onStyleDataLoadedListener, resubscribableSet)\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnSourceDataLoadedListener(onSourceDataLoadedListener: OnSourceDataLoadedListener) {\n    subscribeSourceDataLoaded(\n      sourceDataLoadedCallback = {\n        onSourceDataLoadedListener.onSourceDataLoaded(it.toSourceDataLoadedEventData())\n      },\n      sourceDataLoadedListener = onSourceDataLoadedListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnSourceDataLoadedListener(onSourceDataLoadedListener: OnSourceDataLoadedListener) {\n    unsubscribeListener(onSourceDataLoadedListener, cancelableSet)\n  }\n\n  // Source events\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnSourceAddedListener(onSourceAddedListener: OnSourceAddedListener) {\n    subscribeSourceAdded(\n      sourceAddedCallback = {\n        onSourceAddedListener.onSourceAdded(it.toSourceAddedEventData())\n      },\n      sourceAddedListener = onSourceAddedListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnSourceAddedListener(onSourceAddedListener: OnSourceAddedListener) {\n    unsubscribeListener(onSourceAddedListener, cancelableSet)\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnSourceRemovedListener(onSourceRemovedListener: OnSourceRemovedListener) {\n    subscribeSourceRemoved(\n      sourceRemovedCallback = {\n        onSourceRemovedListener.onSourceRemoved(it.toSourceRemovedEventData())\n      },\n      sourceRemovedListener = onSourceRemovedListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnSourceRemovedListener(onSourceRemovedListener: OnSourceRemovedListener) {\n    unsubscribeListener(onSourceRemovedListener, cancelableSet)\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnStyleImageMissingListener(onStyleImageMissingListener: OnStyleImageMissingListener) {\n    subscribeStyleImageMissing(\n      styleImageMissingCallback = {\n        onStyleImageMissingListener.onStyleImageMissing(it.toStyleImageMissingEventData())\n      },\n      styleImageMissingListener = onStyleImageMissingListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnStyleImageMissingListener(onStyleImageMissingListener: OnStyleImageMissingListener) {\n    unsubscribeListener(onStyleImageMissingListener, cancelableSet)\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnStyleImageUnusedListener(onStyleImageUnusedListener: OnStyleImageUnusedListener) {\n    subscribeStyleImageRemoveUnused(\n      styleImageRemoveUnusedCallback = {\n        onStyleImageUnusedListener.onStyleImageUnused(it.toStyleImageUnusedEventData())\n      },\n      styleImageUnusedListener = onStyleImageUnusedListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnStyleImageUnusedListener(onStyleImageUnusedListener: OnStyleImageUnusedListener) {\n    unsubscribeListener(onStyleImageUnusedListener, cancelableSet)\n  }\n\n  // Render frame events\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnRenderFrameStartedListener(onRenderFrameStartedListener: OnRenderFrameStartedListener) {\n    subscribeRenderFrameStarted(\n      renderFrameStartedCallback = {\n        onRenderFrameStartedListener.onRenderFrameStarted(it.toRenderFrameStartedEventData())\n      },\n      renderFrameStarted = onRenderFrameStartedListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnRenderFrameStartedListener(onRenderFrameStartedListener: OnRenderFrameStartedListener) {\n    unsubscribeListener(onRenderFrameStartedListener, cancelableSet)\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnRenderFrameFinishedListener(onRenderFrameFinishedListener: OnRenderFrameFinishedListener) {\n    subscribeRenderFrameFinished(\n      renderFrameFinishedCallback = {\n        onRenderFrameFinishedListener.onRenderFrameFinished(it.toRenderFrameFinishedEventData())\n      },\n      renderFrameFinishedListener = onRenderFrameFinishedListener,\n    )\n  }\n\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnRenderFrameFinishedListener(onRenderFrameFinishedListener: OnRenderFrameFinishedListener) {\n    unsubscribeListener(onRenderFrameFinishedListener, cancelableSet)\n  }\n\n  // new subscribe* methods\n  fun subscribeCameraChanged(\n    cameraChangedCallback: CameraChangedCallback,\n    onCancel: (() -> Unit)? = null,\n    onCameraChangeListener: OnCameraChangeListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(cameraChangedCallback),\n    onCancel = onCancel,\n    listener = onCameraChangeListener,\n  )\n\n  @com.mapbox.annotation.MapboxExperimental\n  fun subscribeCameraChangedCoalesced(\n    cameraChangedCoalescedCallback: CameraChangedCoalescedCallback,\n    onCancel: (() -> Unit)? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(cameraChangedCoalescedCallback),\n    onCancel = onCancel,\n  )\n\n  fun subscribeMapLoaded(\n    mapLoadedCallback: MapLoadedCallback,\n    onCancel: (() -> Unit)? = null,\n    mapLoadedListener: OnMapLoadedListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(mapLoadedCallback),\n    onCancel = onCancel,\n    listener = mapLoadedListener,\n  )\n\n  fun subscribeMapIdle(\n    mapIdleCallback: MapIdleCallback,\n    onCancel: (() -> Unit)? = null,\n    mapIdleListener: OnMapIdleListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(mapIdleCallback),\n    onCancel = onCancel,\n    listener = mapIdleListener,\n  )\n\n  /**\n   * This method differs from similar other ones.\n   *\n   * We allow sending [MapLoadingErrorCallback] from GeoJsonSource directly from our code\n   * when exception happens during marshalling and initial parsing on worker thread.\n   * In order to trigger user's [mapLoadingErrorCallback] when [sendMapLoadingError] happens we\n   * store them in [mapLoadingErrorCallbackSet] and remove when the user unsubscribes and [onCancel] is triggered.\n   */\n  fun subscribeMapLoadingError(\n    mapLoadingErrorCallback: MapLoadingErrorCallback,\n    onCancel: (() -> Unit)? = null,\n    mapLoadingErrorListener: OnMapLoadErrorListener? = null,\n  ): Cancelable {\n    mapLoadingErrorCallbackSet.add(mapLoadingErrorCallback)\n    return ExtendedCancelable(\n      observable.subscribe(mapLoadingErrorCallback),\n      onCancel = {\n        mapLoadingErrorCallbackSet.remove(mapLoadingErrorCallback)\n        onCancel?.invoke()\n      },\n      listener = mapLoadingErrorListener,\n    )\n  }\n\n  fun subscribeStyleLoaded(\n    styleLoadedCallback: StyleLoadedCallback,\n    onCancel: (() -> Unit)? = null,\n    styleLoadedListener: OnStyleLoadedListener? = null,\n  ): Cancelable {\n    val resubscriber = {\n      observable.subscribe(styleLoadedCallback)\n    }\n\n    return ResubscribeExtendedCancelable(\n      resubscriber = resubscriber,\n      originalCancelable = resubscriber(),\n      cancelableSet = resubscribableSet,\n      onCancel = onCancel,\n      listener = styleLoadedListener,\n    )\n  }\n\n  fun subscribeStyleDataLoaded(\n    styleDataLoadedCallback: StyleDataLoadedCallback,\n    onCancel: (() -> Unit)? = null,\n    styleDataLoadedListener: OnStyleDataLoadedListener? = null,\n  ): Cancelable {\n    val resubscriber = {\n      observable.subscribe(styleDataLoadedCallback)\n    }\n\n    return ResubscribeExtendedCancelable(\n      resubscriber = resubscriber,\n      originalCancelable = resubscriber(),\n      cancelableSet = resubscribableSet,\n      onCancel = onCancel,\n      listener = styleDataLoadedListener,\n    )\n  }\n\n  fun subscribeSourceDataLoaded(\n    sourceDataLoadedCallback: SourceDataLoadedCallback,\n    onCancel: (() -> Unit)? = null,\n    sourceDataLoadedListener: OnSourceDataLoadedListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(sourceDataLoadedCallback),\n    onCancel = onCancel,\n    listener = sourceDataLoadedListener,\n  )\n\n  fun subscribeSourceAdded(\n    sourceAddedCallback: SourceAddedCallback,\n    onCancel: (() -> Unit)? = null,\n    sourceAddedListener: OnSourceAddedListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(sourceAddedCallback),\n    onCancel = onCancel,\n    listener = sourceAddedListener,\n  )\n\n  fun subscribeSourceRemoved(\n    sourceRemovedCallback: SourceRemovedCallback,\n    onCancel: (() -> Unit)? = null,\n    sourceRemovedListener: OnSourceRemovedListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(sourceRemovedCallback),\n    onCancel = onCancel,\n    listener = sourceRemovedListener,\n  )\n\n  fun subscribeStyleImageMissing(\n    styleImageMissingCallback: StyleImageMissingCallback,\n    onCancel: (() -> Unit)? = null,\n    styleImageMissingListener: OnStyleImageMissingListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(styleImageMissingCallback),\n    onCancel = onCancel,\n    listener = styleImageMissingListener,\n  )\n\n  fun subscribeStyleImageRemoveUnused(\n    styleImageRemoveUnusedCallback: StyleImageRemoveUnusedCallback,\n    onCancel: (() -> Unit)? = null,\n    styleImageUnusedListener: OnStyleImageUnusedListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(styleImageRemoveUnusedCallback),\n    onCancel = onCancel,\n    listener = styleImageUnusedListener,\n  )\n\n  fun subscribeRenderFrameStarted(\n    renderFrameStartedCallback: RenderFrameStartedCallback,\n    onCancel: (() -> Unit)? = null,\n    renderFrameStarted: OnRenderFrameStartedListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(renderFrameStartedCallback),\n    onCancel = onCancel,\n    listener = renderFrameStarted,\n  )\n\n  fun subscribeRenderFrameFinished(\n    renderFrameFinishedCallback: RenderFrameFinishedCallback,\n    onCancel: (() -> Unit)? = null,\n    renderFrameFinishedListener: OnRenderFrameFinishedListener? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(renderFrameFinishedCallback),\n    onCancel = onCancel,\n    listener = renderFrameFinishedListener,\n  )\n\n  fun subscribeResourceRequest(\n    resourceRequestCallback: ResourceRequestCallback,\n    onCancel: (() -> Unit)? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(resourceRequestCallback),\n    onCancel = onCancel,\n  )\n\n  @MapboxExperimental\n  fun subscribeGenericEvent(\n    eventName: String,\n    genericEventCallback: GenericEventCallback,\n    onCancel: (() -> Unit)? = null,\n  ): Cancelable = ExtendedCancelable(\n    observable.subscribe(eventName, genericEventCallback),\n    onCancel = onCancel,\n  )\n\n  // This method is needed to prevent receiving styleLoaded events with the old style\n  // when new style is loaded. For example loading empty style and another style immediately after\n  // that will notify STYLE_LOADED event for the first style after second style has already started\n  // loading\n  fun resubscribeStyleLoadListeners() {\n    resubscribableSet.forEach(ResubscribeExtendedCancelable::resubscribe)\n  }\n\n  fun onDestroy() {\n    cancelableSet.forEach(Cancelable::cancel)\n    resubscribableSet.forEach(Cancelable::cancel)\n  }\n\n  fun sendMapLoadingError(error: MapLoadingError) {\n    mapLoadingErrorCallbackSet.forEach { it.run(error) }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/SnapshotOverlay.kt",
    "content": "package com.mapbox.maps\n\nimport android.graphics.Canvas\nimport com.mapbox.geojson.Point\n\n/**\n * An instance of overlay allowing to draw custom content directly over the snapshot image on the [Canvas].\n */\nabstract class SnapshotOverlay internal constructor() {\n\n  /**\n   * Canvas that should be used for drawing on top of the snapshot image.\n   */\n  abstract val canvas: Canvas\n\n  /**\n   * List of attributions for the sources in this snapshot.\n   */\n  abstract val attributions: List<String>\n\n  /**\n   * Calculate screen coordinate on the snapshot from geographical `coordinate`.\n   *\n   * @param coordinate A geographical `coordinate`.\n   * @return A `screen coordinate` measured in `platform pixels` on the snapshot for geographical `coordinate`.\n   */\n  abstract fun screenCoordinate(coordinate: Point): ScreenCoordinate\n\n  /**\n   * Calculate geographical coordinates from a point on the snapshot.\n   *\n   * @param screenCoordinate A `screen coordinate` on the snapshot in `platform pixels`.\n   * @return A geographical `coordinate` for a `screen coordinate` on the snapshot.\n   */\n  abstract fun coordinate(screenCoordinate: ScreenCoordinate): Point\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/SnapshotOverlayCallback.kt",
    "content": "package com.mapbox.maps\n\n/**\n * A block which can be used to obtain a [SnapshotOverlay] to draw custom content directly over the snapshot image.\n */\nfun interface SnapshotOverlayCallback {\n\n  /**\n   * Invoked when snapshot overlay has been prepared.\n   */\n  fun onSnapshotOverlay(overlay: SnapshotOverlay)\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/SnapshotOverlayOptions.kt",
    "content": "package com.mapbox.maps\n\n/**\n * Data class to config the overlays on the snapshotter\n *\n * @param showLogo whether show Mapbox logo on the taken snapshot\n * @param showAttributes whether show attribution on the taken snapshot\n */\n\ndata class SnapshotOverlayOptions @JvmOverloads constructor(\n  val showLogo: Boolean = true,\n  val showAttributes: Boolean = true\n)"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/SnapshotResultCallback.kt",
    "content": "package com.mapbox.maps\n\nimport android.graphics.Bitmap\n\n/**\n * Callback invoked when obtaining the map snapshot.\n */\nfun interface SnapshotResultCallback {\n\n  /**\n   * If snapshot was successful - [snapshot] will contain the actual [Bitmap] with an actual map snapshot result.\n   * If snapshot was not successful - [snapshot] will be NULL and [errorMessage] will contain the error message.\n   */\n  fun onSnapshotResult(snapshot: Bitmap?, errorMessage: String?)\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/SnapshotStyleListener.kt",
    "content": "package com.mapbox.maps\n\n/**\n * Interface for getting all style related events for snapshotter.\n */\ninterface SnapshotStyleListener {\n\n  /**\n   * Notifies the client when style loading completed, not including the style specified sprite and sources.\n   *\n   * @param style style that was loaded for given snapshotter.\n   */\n  fun onDidFinishLoadingStyle(style: Style)\n\n  /**\n   * Notifies the client when style loading completed, including the style specified sprite and sources.\n   *\n   * @param style style that was loaded for given snapshotter.\n   */\n  fun onDidFullyLoadStyle(style: Style) { }\n\n  /**\n   * Notifies the client about style load errors.\n   *\n   * @param message Error message associated with the error.\n   */\n  fun onDidFailLoadingStyle(message: String) { }\n\n  /**\n   * Notifies the client about a missing style image.\n   *\n   * @param imageId The id of the image that is missing.\n   */\n  fun onStyleImageMissing(imageId: String) { }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/Snapshotter.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport android.graphics.*\nimport android.text.Html\nimport android.util.DisplayMetrics\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.annotation.VisibleForTesting\nimport androidx.core.content.res.ResourcesCompat\nimport com.mapbox.annotation.module.MapboxModuleType\nimport com.mapbox.common.Cancelable\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.common.module.provider.MapboxModuleProvider\nimport com.mapbox.common.module.provider.ModuleProviderArgument\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.attribution.AttributionLayout\nimport com.mapbox.maps.attribution.AttributionMeasure\nimport com.mapbox.maps.attribution.AttributionParser\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.module.MapTelemetry\nimport java.lang.ref.WeakReference\nimport kotlin.math.min\n\n/**\n * [Snapshotter] is high-level component responsible for taking map snapshot with given [MapSnapshotOptions].\n * The [Snapshotter] is valid until [destroy] is called.\n */\nopen class Snapshotter {\n\n  private val context: WeakReference<Context>\n\n  /**\n   * The [MapSnapshotter] created in constructor. It is valid until [destroy] is called.\n   */\n  private var coreSnapshotter: MapSnapshotter?\n  private val pixelRatio: Float\n  private val mapSnapshotOptions: MapSnapshotOptions\n  @get:JvmSynthetic @set:JvmSynthetic\n  internal var snapshotStyleCallback: SnapshotStyleListener? = null\n  private val snapshotOverlayOptions: SnapshotOverlayOptions\n  private var cancelableEvents = mutableListOf<Cancelable>()\n  private var loadingErrorCancelable: Cancelable? = null\n  private var styleLoadedCancelable: Cancelable? = null\n\n  @JvmOverloads\n  constructor(\n    context: Context,\n    options: MapSnapshotOptions,\n    overlayOptions: SnapshotOverlayOptions = SnapshotOverlayOptions()\n  ) {\n    if (MapboxOptions.accessToken.isBlank()) {\n      throw MapboxConfigurationException()\n    }\n\n    this.context = WeakReference(context)\n    mapSnapshotOptions = options\n    snapshotOverlayOptions = overlayOptions\n    pixelRatio = context.resources.displayMetrics.density\n    coreSnapshotter = MapSnapshotter(options)\n    dispatchTelemetryTurnstileEvent(context)\n    val weakSelf = WeakReference(this)\n    loadingErrorCancelable = subscribeMapLoadingError {\n      weakSelf.get()?.apply {\n        loadingErrorCancelable?.cancel()\n        snapshotStyleCallback?.onDidFailLoadingStyle(it.message)\n      }\n    }\n    cancelableEvents.add(\n      subscribeStyleDataLoaded {\n        if (it.type == StyleDataLoadedType.STYLE) {\n          weakSelf.get()?.apply {\n            coreSnapshotter?.let { snapshotter ->\n              snapshotStyleCallback?.onDidFinishLoadingStyle(\n                Style(\n                  snapshotter,\n                  pixelRatio,\n                  mapLoadingErrorDelegate = { }\n                )\n              )\n            }\n          }\n        }\n      }\n    )\n    styleLoadedCancelable = subscribeStyleLoaded {\n      weakSelf.get()?.apply {\n        coreSnapshotter?.let { snapshotter ->\n          snapshotStyleCallback?.onDidFullyLoadStyle(\n            Style(\n              snapshotter,\n              pixelRatio,\n              mapLoadingErrorDelegate = { }\n            )\n          )\n        }\n        styleLoadedCancelable?.cancel()\n      }\n    }\n    cancelableEvents.add(\n      subscribeStyleImageMissing {\n      weakSelf.get()?.apply {\n        snapshotStyleCallback?.onStyleImageMissing(it.imageId)\n      }\n    }\n    )\n  }\n\n  private fun dispatchTelemetryTurnstileEvent(\n    context: Context\n  ) {\n    MapboxModuleProvider.createModule<MapTelemetry>(MapboxModuleType.MapTelemetry) {\n      arrayOf(\n        ModuleProviderArgument(\n          Context::class.java,\n          context.applicationContext\n        ),\n      )\n    }.onAppUserTurnstileEvent()\n  }\n\n  private constructor(\n    context: WeakReference<Context>,\n    options: MapSnapshotOptions,\n    overlayOptions: SnapshotOverlayOptions,\n    coreSnapshotter: MapSnapshotter,\n  ) {\n    this.context = context\n    mapSnapshotOptions = options\n    snapshotOverlayOptions = overlayOptions\n    this.coreSnapshotter = coreSnapshotter\n    pixelRatio = 1f\n  }\n\n  /**\n   * Set [SnapshotStyleListener] to listen to all events style related.\n   */\n  fun setStyleListener(listener: SnapshotStyleListener) {\n    snapshotStyleCallback = listener\n  }\n\n  /**\n   * Request a new snapshot.\n   * If there is a running snapshot request, it is cancelled and [SnapshotResultCallback.onSnapshotResult] for it will be called with snapshot=NULL.\n   *\n   * @param overlayCallback optional callback that could be used to draw custom content directly over the snapshot image.\n   * @param resultCallback callback triggered when snapshot was obtained or if an error occurred.\n   */\n  fun start(\n    overlayCallback: SnapshotOverlayCallback? = null,\n    resultCallback: SnapshotResultCallback,\n  ) {\n    if (getStyleJson().isEmpty() && getStyleUri().isEmpty()) {\n      throw IllegalStateException(\"It's required to call setUri or setJson to provide a style definition before calling start.\")\n    }\n    requireCoreSnapshotter().start { result ->\n      if (result.isValue) {\n        result.value?.let { coreMapSnapshot ->\n          val snapshotBitmap = coreMapSnapshot.moveImage()?.let { coreImage ->\n            Bitmap.createBitmap(\n              coreImage.width, coreImage.height, Bitmap.Config.ARGB_8888\n            ).apply {\n              copyPixelsFromBuffer(coreImage.data.buffer)\n            }\n          } ?: run {\n            resultCallback.onSnapshotResult(\n              snapshot = null,\n              errorMessage = \"Moving image data failed!\"\n            )\n            return@let\n          }\n          // create canvas just once and use it for all the drawings\n          val canvas = Canvas(snapshotBitmap)\n          val snapshotOverlay = object : SnapshotOverlay() {\n\n            override val canvas = canvas\n\n            override val attributions = coreMapSnapshot.attributions()\n\n            override fun screenCoordinate(coordinate: Point): ScreenCoordinate {\n              return coreMapSnapshot.screenCoordinate(coordinate)\n            }\n\n            override fun coordinate(screenCoordinate: ScreenCoordinate): Point {\n              return coreMapSnapshot.coordinate(screenCoordinate)\n            }\n          }\n          // do the user drawing if needed\n          overlayCallback?.onSnapshotOverlay(snapshotOverlay)\n          // draw Mapbox attribution on top of user drawing\n          addOverlay(snapshotBitmap, snapshotOverlay)\n          resultCallback.onSnapshotResult(\n            snapshot = snapshotBitmap,\n            errorMessage = null,\n          )\n        } ?: run {\n          resultCallback.onSnapshotResult(\n            snapshot = null,\n            errorMessage = \"Snapshot was empty.\"\n          )\n        }\n      } else {\n        resultCallback.onSnapshotResult(\n          snapshot = null,\n          errorMessage = result.error ?: \"Undefined error happened.\"\n        )\n      }\n    }\n  }\n\n  /**\n   * Cancel taking snapshot if it was running.\n   */\n  fun cancel() {\n    requireCoreSnapshotter().cancel()\n  }\n\n  /**\n   * Destroy snapshotter.\n   */\n  fun destroy() {\n    cancel()\n    cancelableEvents.forEach(Cancelable::cancel)\n    cancelableEvents.clear()\n    loadingErrorCancelable?.cancel()\n    styleLoadedCancelable?.cancel()\n    snapshotStyleCallback = null\n    coreSnapshotter = null\n  }\n\n  /**\n   * Set the camera options of the snapshot.\n   *\n   * @param cameraOptions the camera options of the snapshot.\n   */\n  fun setCamera(cameraOptions: CameraOptions) {\n    requireCoreSnapshotter().setCamera(cameraOptions)\n  }\n\n  /**\n   * Set the URI of the current Mapbox Style in use.\n   *\n   * @param styleUri string containing a Mapbox style URI.\n   */\n  fun setStyleUri(styleUri: String) {\n    requireCoreSnapshotter().styleURI = styleUri\n  }\n\n  /**\n   * Returns the coordinate bounds for a given camera.\n   *\n   * Note that if the given camera shows the antimeridian, the returned wrapped bounds\n   * might not represent the minimum bounding box.\n   *\n   * @return CoordinateBounds\n   */\n  fun coordinateBoundsForCamera(options: CameraOptions): CoordinateBounds {\n    return requireCoreSnapshotter().coordinateBoundsForCamera(options)\n  }\n\n  /**\n   * Convenience method that returns the camera options object for given arguments\n   *\n   * @param coordinates The coordinates representing the bounds of the map\n   * @param padding The edge padding of the map\n   * @param bearing The bearing of the map\n   * @param pitch The pitch of the map\n   *\n   * @return Returns the camera options object representing the provided params\n   */\n  fun cameraForCoordinates(\n    coordinates: List<Point>,\n    padding: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?\n  ): CameraOptions {\n    return requireCoreSnapshotter().cameraForCoordinates(\n      coordinates,\n      cameraOptions {\n        bearing(bearing)\n        pitch(pitch)\n      },\n      padding,\n      null,\n      null\n    ).getValueOrElse {\n      logW(\n        TAG,\n        \"Error occurred in synchronous cameraForCoordinates: $it, empty cameraState will be returned\"\n      )\n      return@getValueOrElse cameraOptions { }\n    }\n  }\n\n  /**\n   * Get the current camera state.\n   *\n   * @return [CameraState] object.\n   */\n  fun getCameraState(): CameraState {\n    return requireCoreSnapshotter().cameraState\n  }\n\n  /**\n   * Sets the size of the snapshot\n   *\n   * @param size The new size of the snapshot in \\link MapOptions#size platform pixels \\endlink\n   */\n  fun setSize(size: Size) {\n    requireCoreSnapshotter().size = size\n  }\n\n  /**\n   * Gets the size of the snapshot\n   *\n   * @return Snapshot size in \\link MapOptions#size platform pixels \\endlink\n   */\n  fun getSize(): Size {\n    return requireCoreSnapshotter().size\n  }\n\n  /**\n   * Load the style from a provided JSON string.\n   *\n   * This method should be called on the same thread where @see Map object is initialized.\n   *\n   * @param styleJson A JSON string containing a serialized Mapbox Style.\n   */\n  fun setStyleJson(styleJson: String) {\n    requireCoreSnapshotter().styleJSON = styleJson\n  }\n\n  /**\n   * Get the JSON serialization string of the current Mapbox Style in use.\n   *\n   * @return A JSON string containing a serialized Mapbox Style.\n   */\n  fun getStyleJson(): String {\n    return requireCoreSnapshotter().styleJSON\n  }\n\n  /**\n   * Get the URI of the current Mapbox Style in use.\n   *\n   * @return A string containing a Mapbox style URI.\n   */\n  fun getStyleUri(): String {\n    return requireCoreSnapshotter().styleURI\n  }\n\n  private fun subscribeMapLoadingError(mapLoadingErrorCallback: MapLoadingErrorCallback): Cancelable {\n    return requireCoreSnapshotter().subscribe(mapLoadingErrorCallback)\n  }\n\n  private fun subscribeStyleLoaded(styleLoadedCallback: StyleLoadedCallback): Cancelable {\n    return requireCoreSnapshotter().subscribe(styleLoadedCallback)\n  }\n\n  private fun subscribeStyleDataLoaded(styleDataLoadedCallback: StyleDataLoadedCallback): Cancelable {\n    return requireCoreSnapshotter().subscribe(styleDataLoadedCallback)\n  }\n\n  private fun subscribeStyleImageMissing(styleImageMissingCallback: StyleImageMissingCallback): Cancelable {\n    return requireCoreSnapshotter().subscribe(styleImageMissingCallback)\n  }\n\n  private fun drawAttribution(\n    overlay: SnapshotOverlay,\n    measure: AttributionMeasure,\n    layout: AttributionLayout\n  ) {\n    // draw attribution\n    val anchorPoint = layout.anchorPoint\n    if (anchorPoint != null) {\n      drawAttribution(overlay.canvas, measure, anchorPoint)\n    } else {\n      logW(\n        TAG,\n        \"Could not generate attribution for snapshot size: ${overlay.canvas.width}x${overlay.canvas.height}.\" + \" You are required to provide your own attribution for the used sources: ${overlay.attributions}\"\n      )\n    }\n  }\n\n  private fun drawAttribution(canvas: Canvas, measure: AttributionMeasure, anchorPoint: PointF) {\n    canvas.save()\n    canvas.translate(anchorPoint.x, anchorPoint.y)\n    measure.getTextView().draw(canvas)\n    canvas.restore()\n  }\n\n  private fun addOverlay(\n    snapshotBitmap: Bitmap,\n    overlay: SnapshotOverlay\n  ) {\n    context.get()?.apply {\n      val margin: Int = this.resources.displayMetrics.density.toInt() * 4\n      drawOverlay(snapshotBitmap, overlay, margin)\n    }\n  }\n\n  private fun drawOverlay(\n    snapshotBitmap: Bitmap,\n    overlay: SnapshotOverlay,\n    margin: Int\n  ) {\n    context.get()?.let {\n      val measure: AttributionMeasure = getAttributionMeasure(it, overlay, snapshotBitmap, margin)\n      val layout = measure.measure()\n      layout?.let {\n        if (snapshotOverlayOptions.showLogo) {\n          drawLogo(snapshotBitmap, overlay.canvas, margin, layout)\n        }\n        if (snapshotOverlayOptions.showAttributes) {\n          drawAttribution(overlay, measure, layout)\n        }\n      }\n    }\n  }\n\n  private fun getAttributionMeasure(\n    context: Context,\n    overlay: SnapshotOverlay,\n    snapshotBitmap: Bitmap,\n    margin: Int\n  ): AttributionMeasure {\n    val logo: Logo = createScaledLogo(context, snapshotBitmap)\n    return AttributionMeasure(\n      snapshot = snapshotBitmap,\n      logo = logo.large,\n      logoSmall = logo.small,\n      textView = createTextView(context, overlay, false, logo.scale),\n      textViewShort = createTextView(context, overlay, true, logo.scale),\n      margin = margin.toFloat()\n    )\n  }\n\n  private fun createTextView(\n    context: Context,\n    overlay: SnapshotOverlay,\n    shortText: Boolean,\n    scale: Float\n  ): TextView {\n    val textColor: Int = ResourcesCompat.getColor(\n      context.resources, R.color.mapbox_gray_dark, context.theme\n    )\n    val widthMeasureSpec: Int = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)\n    val heightMeasureSpec: Int = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)\n    val textView = TextView(context)\n    textView.layoutParams = ViewGroup.LayoutParams(\n      ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT\n    )\n    val attributionString = createAttributionString(overlay, shortText)\n    if (attributionString.isNotEmpty()) {\n      textView.isSingleLine = true\n      textView.textSize = 10 * scale\n      textView.setTextColor(textColor)\n      textView.setBackgroundResource(R.drawable.mapbox_rounded_corner)\n      @Suppress(\"DEPRECATION\")\n      textView.text = Html.fromHtml(attributionString)\n      textView.measure(widthMeasureSpec, heightMeasureSpec)\n      textView.layout(0, 0, textView.measuredWidth, textView.measuredHeight)\n    }\n    return textView\n  }\n\n  private fun createAttributionString(\n    overlay: SnapshotOverlay,\n    shortText: Boolean\n  ): String {\n    context.get()?.apply {\n      val attributionParser: AttributionParser = AttributionParser.Options(this)\n        .withAttributionData(*overlay.attributions.toTypedArray())\n        .withCopyrightSign(false)\n        .withImproveMap(false)\n        .withMapboxPrivacyPolicy(false)\n        .withTelemetryAttribution(false)\n        .withMapboxGeofencingConsent(false)\n        .build()\n      return attributionParser.createAttributionString(shortText)\n    }\n    return \"\"\n  }\n\n  private fun drawLogo(\n    snapshot: Bitmap,\n    canvas: Canvas,\n    margin: Int,\n    placement: AttributionLayout\n  ) {\n    placement.logo?.let {\n      canvas.drawBitmap(\n        it, margin.toFloat(), (snapshot.height - it.height - margin).toFloat(), null\n      )\n    }\n  }\n\n  private fun createScaledLogo(context: Context, snapshotBitmap: Bitmap): Logo {\n    val logo = BitmapFactory.decodeResource(context.resources, R.drawable.mapbox_logo_icon, null)\n    val scale = calculateLogoScale(context, snapshotBitmap, logo)\n    val matrix = Matrix()\n    matrix.postScale(scale, scale)\n    val helmet =\n      BitmapFactory.decodeResource(context.resources, R.drawable.mapbox_logo_helmet, null)\n    val large = Bitmap.createBitmap(logo, 0, 0, logo.width, logo.height, matrix, true)\n    val small = Bitmap.createBitmap(helmet, 0, 0, helmet.width, helmet.height, matrix, true)\n    return Logo(large, small, scale)\n  }\n\n  private fun calculateLogoScale(context: Context, snapshot: Bitmap, logo: Bitmap): Float {\n    val displayMetrics: DisplayMetrics = context.resources.displayMetrics\n    val widthRatio = displayMetrics.widthPixels / snapshot.width.toFloat()\n    val heightRatio = displayMetrics.heightPixels / snapshot.height.toFloat()\n    val prefWidth = logo.width / widthRatio\n    val prefHeight = logo.height / heightRatio\n    var calculatedScale = min(prefWidth / logo.width, prefHeight / logo.height) * 2\n    if (calculatedScale > 1) {\n      // don't allow over-scaling\n      calculatedScale = 1.0f\n    } else if (calculatedScale < 0.60f) {\n      // don't scale to low either\n      calculatedScale = 0.60f\n    }\n    return calculatedScale\n  }\n\n  /**\n   * Returns tileIDs that cover current map camera\n   *\n   * Note! This is an experimental API and behavior might change in future.\n   *\n   * @param tileCoverOptions Options for the tile cover method\n   * @param cameraOptions This is an extra parameter for future use. Has no effect for now.\n   */\n  @MapboxExperimental\n  fun tileCover(\n    tileCoverOptions: TileCoverOptions,\n    cameraOptions: CameraOptions?\n  ): MutableList<CanonicalTileID> {\n    return requireCoreSnapshotter().tileCover(tileCoverOptions, cameraOptions)\n  }\n\n  private data class Logo constructor(\n    val large: Bitmap,\n    val small: Bitmap,\n    val scale: Float\n  )\n\n  /**\n   * @return the current [coreSnapshotter] or throws [IllegalStateException] if not available\n   * @throws IllegalStateException if [coreSnapshotter] was already destroyed\n   */\n  private fun requireCoreSnapshotter(): MapSnapshotter {\n    return coreSnapshotter ?: throw SnapshotterDestroyedException()\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /**\n     * Clears temporary map data.\n     *\n     * Clears temporary map data from the data path defined in the current options.\n     * Useful to reduce the disk usage or in case the disk cache contains invalid data.\n     *\n     * Note that calling this API will affect all maps that use the same data path and does not\n     * affect persistent map data like offline style packages.\n     *\n     * @param callback Called once the request is complete or an error occurred.\n     */\n    @JvmStatic\n    fun clearData(callback: AsyncOperationResultCallback) {\n      MapsResourceOptions.clearData(callback)\n    }\n\n    private const val TAG = \"Snapshotter\"\n\n    @JvmSynthetic\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    internal operator fun invoke(\n      context: WeakReference<Context>,\n      options: MapSnapshotOptions,\n      overlayOptions: SnapshotOverlayOptions,\n      coreSnapshotter: MapSnapshotter,\n    ) = Snapshotter(context, options, overlayOptions, coreSnapshotter)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/SnapshotterDestroyedException.kt",
    "content": "package com.mapbox.maps\n\n/**\n * Runtime exception thrown when the [Snapshotter] has already been destroyed.\n */\nclass SnapshotterDestroyedException : IllegalStateException(\"This snapshotter was already destroyed.\")"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/Style.kt",
    "content": "package com.mapbox.maps\n\nimport android.graphics.Bitmap\nimport androidx.annotation.AnyThread\nimport androidx.annotation.MainThread\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\n\n/**\n * The general class to interact with Styles in the Modular Mapbox Maps SDK for Android.\n * It exposes the entry point for all methods related to the Style.\n * You cannot instantiate [Style] object directly, rather, you must obtain one\n * from the [getStyle(onStyleLoaded)][MapboxMap.getStyle] method on [MapboxMap].\n *\n * Note: Similar to a View object, a [Style] should only be read and modified\n * from the main thread.\n */\nclass Style internal constructor(\n  styleManager: StyleManager,\n  pixelRatio: Float,\n  mapLoadingErrorDelegate: MapLoadingErrorDelegate,\n) : MapboxStyleManager(styleManager, pixelRatio, mapLoadingErrorDelegate) {\n\n  @Volatile\n  private var isStyleValid = true\n\n  /**\n   * Mark style invalid.\n   */\n  internal fun markInvalid() {\n    isStyleValid = false\n  }\n\n  /**\n   * Whether the Style instance is valid.\n   *\n   * Style becomes invalid after MapView.onDestroy() is invoked or if new style was loaded,\n   * calling any method then could result in undefined behaviour and will print an error log.\n   *\n   * Keeping the reference to an invalid Style instance introduces significant native memory leak.\n   *\n   * @return True if Style is valid and false otherwise.\n   */\n  fun isValid(): Boolean {\n    return isStyleValid\n  }\n\n  /**\n   * Returns the map style's default camera, if any, or a default camera otherwise.\n   * The map style default camera is defined as follows:\n   * - [center](https://docs.mapbox.com/mapbox-gl-js/style-spec/#root-center)\n   * - [zoom](https://docs.mapbox.com/mapbox-gl-js/style-spec/#root-zoom)\n   * - [bearing](https://docs.mapbox.com/mapbox-gl-js/style-spec/#root-bearing)\n   * - [pitch](https://docs.mapbox.com/mapbox-gl-js/style-spec/#root-pitch)\n   *\n   * The style default camera is re-evaluated when a new style is loaded.\n   *\n   * @return Returns the map style default [camera][CameraOptions].\n   */\n  override val styleDefaultCamera: CameraOptions\n    @MainThread\n    get() {\n      checkNativeStyle(\"getStyleDefaultCamera\")\n      return super.styleDefaultCamera\n    }\n\n  /**\n   * Gets the value of style source property.\n   *\n   * @param sourceId A style source identifier.\n   * @param property The style source property name.\n   * @return The [StylePropertyValue] object.\n   */\n  @MainThread\n  override fun getStyleSourceProperty(sourceId: String, property: String): StylePropertyValue {\n    checkNativeStyle(\"getStyleSourceProperty\")\n    return super.getStyleSourceProperty(sourceId, property)\n  }\n\n  /**\n   * Sets a value to a style source property.\n   * Note: When setting the \"data\" property of a geojson source, this method does not synchronously parse the GeoJSON data.\n   * The events API shall be used to make sure the provided GeoJSON data is valid.\n   * In case the GeoJSON is valid, a [MapLoaded] event will be propagated. In case of errors, a [MapLoadingError] event will be propagated instead.\n   *\n   * @param sourceId A style source identifier.\n   * @param property The style source property name.\n   * @param value The style source property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleSourceProperty(\n    sourceId: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    checkNativeStyle(\"setStyleSourceProperty\")\n    return super.setStyleSourceProperty(sourceId, property, value)\n  }\n\n  /**\n   * Sets a value to a style source property for a source that belongs to a specific style import.\n   *\n   * This method allows modification of source properties within imported styles, enabling\n   * fine-grained control over sources from different style fragments or imports.\n   * If `importId` is empty, this method falls back to updating the root style.\n   *\n   * @param importId An identifier of the style import containing the target source.\n   * @param sourceId A style source identifier.\n   * @param property The style source property name.\n   * @param value The style source property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MapboxExperimental\n  @MainThread\n  override fun setStyleSourceProperty(\n    importId: String,\n    sourceId: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    checkNativeStyle(\"setStyleSourceProperty\")\n    return super.setStyleSourceProperty(importId, sourceId, property, value)\n  }\n\n  /**\n   * Returns the map style's transition options. By default, the style parser will attempt\n   * to read the style default transition options, if any, fallbacking to an immediate transition\n   * otherwise. Transition options can be overridden via [setStyleTransition], but the options are\n   * reset once a new style has been loaded.\n   *\n   * The style transition is re-evaluated when a new style is loaded.\n   *\n   * @return Returns the map style [transition options][TransitionOptions].\n   */\n  @MainThread\n  override fun getStyleTransition(): TransitionOptions {\n    checkNativeStyle(\"getStyleTransition\")\n    return super.getStyleTransition()\n  }\n\n  /**\n   * Overrides the map style's transition options with user-provided options.\n   *\n   * The style transition is re-evaluated when a new style is loaded.\n   *\n   * @param transitionOptions Map style [transition options][TransitionOptions].\n   */\n  @MainThread\n  override fun setStyleTransition(transitionOptions: TransitionOptions) {\n    checkNativeStyle(\"setStyleTransition\")\n    super.setStyleTransition(transitionOptions)\n  }\n\n  /**\n   * Returns the existing style imports.\n   *\n   * @return The list containing the information about existing style import objects.\n   */\n  @MainThread\n  override fun getStyleImports(): List<StyleObjectInfo> {\n    checkNativeStyle(\"getStyleImports\")\n    return super.getStyleImports()\n  }\n\n  /**\n   * Removes an existing style import.\n   *\n   * @param importId An identifier of the style import to remove.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun removeStyleImport(importId: String): Expected<String, None> {\n    checkNativeStyle(\"removeStyleImport\")\n    return super.removeStyleImport(importId)\n  }\n\n  /**\n   * Gets style import schema.\n   *\n   * @param importId A style import identifier.\n   *\n   * @return The style import schema or a string describing an error if the operation was not successful.\n   */\n  @MainThread\n  override fun getStyleImportSchema(importId: String): Expected<String, Value> {\n    checkNativeStyle(\"getStyleImportSchema\")\n    return super.getStyleImportSchema(importId)\n  }\n\n  /**\n   * Gets style import config.\n   *\n   * @return The style import configuration or a string describing an error if the operation was not successful.\n   */\n  @MainThread\n  override fun getStyleImportConfigProperties(importId: String): Expected<String, HashMap<String, StylePropertyValue>> {\n    checkNativeStyle(\"getStyleImportConfigProperties\")\n    return super.getStyleImportConfigProperties(importId)\n  }\n\n  /**\n   * Gets the value of style import config.\n   *\n   * @param importId A style import identifier.\n   * @param config The style import config name.\n   * @return The style import config value.\n   */\n  @MainThread\n  override fun getStyleImportConfigProperty(\n    importId: String,\n    config: String\n  ): Expected<String, StylePropertyValue> {\n    checkNativeStyle(\"getStyleImportConfigProperty\")\n    return super.getStyleImportConfigProperty(importId, config)\n  }\n\n  /**\n   * Sets style import config.\n   * This method can be used to perform batch update for a style import configurations.\n   *\n   * @param importId A style import identifier.\n   * @param configs A map of style import configurations.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleImportConfigProperties(\n    importId: String,\n    configs: HashMap<String, Value>\n  ): Expected<String, None> {\n    checkNativeStyle(\"setStyleImportConfigProperties\")\n    return super.setStyleImportConfigProperties(importId, configs)\n  }\n\n  /**\n   * Sets a value to a style import config.\n   *\n   * @param importId A style import identifier.\n   * @param config The style import config name.\n   * @param value The style import config value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleImportConfigProperty(\n    importId: String,\n    config: String,\n    value: Value\n  ): Expected<String, None> {\n    checkNativeStyle(\"setStyleImportConfigProperty\")\n    return super.setStyleImportConfigProperty(importId, config, value)\n  }\n\n  /**\n   * Adds new import to current style, loaded from a JSON string.\n   *\n   * @param importId Identifier of import to update.\n   * @param json The JSON string to be loaded directly as the import.\n   * @param config A map containing the configuration options of the import.\n   * @param importPosition The import will be positioned according to the ImportPosition parameters. If not specified, then the import is moved to the top of the import stack.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun addStyleImportFromJSON(\n    importId: String,\n    json: String,\n    config: HashMap<String, Value>?,\n    importPosition: ImportPosition?\n  ): Expected<String, None> {\n    checkNativeStyle(\"addStyleImportFromJSON\")\n    return super.addStyleImportFromJSON(importId, json, config, importPosition)\n  }\n\n  /**\n   * Adds new import to current style, loaded from an URI.\n   *\n   * @param importId Identifier of import to update.\n   * @param uri URI of the import.\n   * @param config A map containing the configuration options of the import.\n   * @param importPosition The import will be positioned according to the ImportPosition parameters. If not specified, then the import is moved to the top of the import stack.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun addStyleImportFromURI(\n    importId: String,\n    uri: String,\n    config: HashMap<String, Value>?,\n    importPosition: ImportPosition?\n  ): Expected<String, None> {\n    checkNativeStyle(\"addStyleImportFromURI\")\n    return super.addStyleImportFromURI(importId, uri, config, importPosition)\n  }\n\n  /**\n   * Updates an existing import in the style.\n   * The function replaces the content of the import, with the content loaded from the provided data value.\n   * The configuration values of the import are merged with the configuration provided in the update.\n   *\n   * @param importId Identifier of import to update.\n   * @param json The JSON string to be loaded directly as the import.\n   * @param config A map containing the configuration options of the import.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun updateStyleImportWithJSON(\n    importId: String,\n    json: String,\n    config: HashMap<String, Value>?\n  ): Expected<String, None> {\n    checkNativeStyle(\"updateStyleImportWithJSON\")\n    return super.updateStyleImportWithJSON(\n      importId, json, config\n    )\n  }\n\n  /**\n   * Updates an existing import in the style.\n   * The function replaces the content of the import, with the content loaded from the provided URI.\n   * The configuration values of the import are merged with the configuration provided in the update.\n   *\n   * @param importId Identifier of import to update.\n   * @param uri URI of the import.\n   * @param config A map containing the configuration options of the import.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun updateStyleImportWithURI(\n    importId: String,\n    uri: String,\n    config: HashMap<String, Value>?\n  ): Expected<String, None> {\n    checkNativeStyle(\"updateStyleImportWithURI\")\n    return super.updateStyleImportWithURI(importId, uri, config)\n  }\n\n  /**\n   * Moves import to position before another import, specified with `beforeId`. Order of imported styles corresponds to order of their layers.\n   *\n   * @param importId Identifier of import to move.\n   * @param importPosition The import will be positioned according to the ImportPosition parameters. If not specified, then the import is moved to the top of the import stack.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun moveStyleImport(\n    importId: String,\n    importPosition: ImportPosition?\n  ): Expected<String, None> {\n    checkNativeStyle(\"moveStyleImport\")\n    return super.moveStyleImport(importId, importPosition)\n  }\n\n  /**\n   * Get the styleURI of the current Mapbox Style in use.\n   */\n  override val styleURI: String\n    @MainThread\n    get() {\n      checkNativeStyle(\"getStyleURI\")\n      return super.styleURI\n    }\n\n  /**\n   * Get the JSON serialization string of the current Mapbox Style in use.\n   *\n   * @return A JSON string containing a serialized Mapbox Style.\n   */\n  override val styleJSON: String\n    @MainThread\n    get() {\n      checkNativeStyle(\"getStyleJSON\")\n      return super.styleJSON\n    }\n\n  /**\n   * Adds a new style layer.\n   *\n   * See [Style Specification - Layers](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers)\n   *\n   * Runtime style layers are valid until they are either removed or a new style is loaded.\n   *\n   * @param parameters A [map][Value] of style layer parameters.\n   * @param position If not empty, the new layer will be added immediately below the layer with this id.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun addStyleLayer(parameters: Value, position: LayerPosition?): Expected<String, None> {\n    checkNativeStyle(\"addStyleLayer\")\n    return super.addStyleLayer(parameters, position)\n  }\n\n  /**\n   * Removes an existing style layer\n   *\n   * Runtime style layers are valid until they are either removed or a new style is loaded.\n   *\n   * @param layerId Identifier of the style layer to remove.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun removeStyleLayer(layerId: String): Expected<String, None> {\n    checkNativeStyle(\"removeStyleLayer\")\n    return super.removeStyleLayer(layerId)\n  }\n\n  /**\n   * Moves an existing style layer.\n   *\n   * @param layerId – Identifier of the style layer to move.\n   * @param layerPosition – The layer will be positioned according to the [LayerPosition] parameters. If an empty LayerPosition is provided then the layer is moved to the top of the layerstack.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun moveStyleLayer(\n    layerId: String,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    checkNativeStyle(\"moveStyleLayer\")\n    return super.moveStyleLayer(layerId, layerPosition)\n  }\n\n  /**\n   * Checks whether a given style layer exists.\n   *\n   * Runtime style layers are valid until they are either removed or a new style is loaded.\n   *\n   * @param layerId Style layer identifier.\n   *\n   * @return True if the given style layer exists, false otherwise.\n   */\n  @MainThread\n  override fun styleLayerExists(layerId: String): Boolean {\n    checkNativeStyle(\"styleLayerExists\")\n    return super.styleLayerExists(layerId)\n  }\n\n  /**\n   * Gets the value of [style layer property][StylePropertyValue].\n   *\n   * @param layerId Style layer identifier.\n   * @param property Style layer property name.\n   * @return The property value in the layer with layerId.\n   */\n  @MainThread\n  override fun getStyleLayerProperty(layerId: String, property: String): StylePropertyValue {\n    checkNativeStyle(\"getStyleLayerProperty\")\n    return super.getStyleLayerProperty(layerId, property)\n  }\n\n  /**\n   * Sets a value to a style layer property.\n   *\n   * @param layerId Style layer identifier.\n   * @param property Style layer property name.\n   * @param value Style layer property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleLayerProperty(\n    layerId: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    checkNativeStyle(\"setStyleLayerProperty\")\n    return super.setStyleLayerProperty(layerId, property, value)\n  }\n\n  /**\n   * Adds a new style source.\n   *\n   * See [Style Specification - Sources](https://docs.mapbox.com/mapbox-gl-js/style-spec/#sources)\n   *\n   * @param sourceId An identifier for the style source.\n   * @param properties A map of style source parameters.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun addStyleSource(sourceId: String, properties: Value): Expected<String, None> {\n    checkNativeStyle(\"addStyleSource\")\n    return super.addStyleSource(sourceId, properties)\n  }\n\n  /**\n   * Invalidate region for provided custom geometry source.\n   *\n   * @param sourceId Style source identifier\n   * @param coordinateBounds Coordinate bounds.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun invalidateStyleCustomGeometrySourceRegion(\n    sourceId: String,\n    coordinateBounds: CoordinateBounds\n  ): Expected<String, None> {\n    checkNativeStyle(\"invalidateStyleCustomGeometrySourceRegion\")\n    return super.invalidateStyleCustomGeometrySourceRegion(sourceId, coordinateBounds)\n  }\n\n  /**\n   * Invalidate tile for provided custom geometry source.\n   *\n   * @param sourceId Style source identifier\n   * @param tileId Identifier of the tile\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun invalidateStyleCustomGeometrySourceTile(\n    sourceId: String,\n    tileId: CanonicalTileID\n  ): Expected<String, None> {\n    checkNativeStyle(\"invalidateStyleCustomGeometrySourceTile\")\n    return super.invalidateStyleCustomGeometrySourceTile(sourceId, tileId)\n  }\n\n  /**\n   * Updates the image of an image style source.\n   *\n   * See [Style Specification - Sources Image](https://docs.mapbox.com/mapbox-gl-js/style-spec/#sources-image)\n   *\n   * @param sourceId Style source identifier.\n   * @param image Pixel data of the image.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun updateStyleImageSourceImage(sourceId: String, image: Image): Expected<String, None> {\n    checkNativeStyle(\"updateStyleImageSourceImage\")\n    return super.updateStyleImageSourceImage(sourceId, image)\n  }\n\n  /**\n   * Removes an existing style source.\n   *\n   * @param sourceId Identifier of the style source to remove.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun removeStyleSource(sourceId: String): Expected<String, None> {\n    checkNativeStyle(\"removeStyleSource\")\n    return super.removeStyleSource(sourceId)\n  }\n\n  /**\n   * Set tile data of a custom geometry.\n   *\n   * @param sourceId Style source identifier\n   * @param tileId Identifier of the tile\n   * @param featureCollection An array with the features to add\n   */\n  @MainThread\n  override fun setStyleCustomGeometrySourceTileData(\n    sourceId: String,\n    tileId: CanonicalTileID,\n    featureCollection: MutableList<Feature>\n  ): Expected<String, None> {\n    checkNativeStyle(\"setStyleCustomGeometrySourceTileData\")\n    return super.setStyleCustomGeometrySourceTileData(sourceId, tileId, featureCollection)\n  }\n\n  /**\n   * Checks whether a given style source exists.\n   *\n   * @param sourceId Style source identifier.\n   *\n   * @return True if the given source exists, false otherwise.\n   */\n  @MainThread\n  override fun styleSourceExists(sourceId: String): Boolean {\n    checkNativeStyle(\"styleSourceExists\")\n    return super.styleSourceExists(sourceId)\n  }\n\n  /**\n   * Sets a value to the light property.\n   *\n   * @param id light id.\n   * @param property light property name.\n   * @param value light property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleLightProperty(\n    id: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    checkNativeStyle(\"setStyleLightProperty\")\n    return super.setStyleLightProperty(id, property, value)\n  }\n\n  /**\n   * Gets added lights to the style.\n   *\n   * @return list of [StyleObjectInfo].\n   */\n  @MainThread\n  override fun getStyleLights(): MutableList<StyleObjectInfo> {\n    checkNativeStyle(\"getStyleLights\")\n    return super.getStyleLights()\n  }\n\n  /**\n   * Sets lights to the style.\n   *\n   * @param lights light value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleLights(lights: Value): Expected<String, None> {\n    checkNativeStyle(\"setStyleLights\")\n    return super.setStyleLights(lights)\n  }\n\n  /**\n   * Sets the style global [atmosphere](https://docs.mapbox.com/mapbox-gl-js/style-spec/fog/) properties.\n   *\n   * @param properties A map of style atmosphere properties values, with their names as a key.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleAtmosphere(properties: Value): Expected<String, None> {\n    checkNativeStyle(\"setStyleAtmosphere\")\n    return super.setStyleAtmosphere(properties)\n  }\n\n  /**\n   * Gets the value of a style atmosphere property.\n   *\n   * @param property The style atmosphere property name.\n   * @return The style atmosphere property value.\n   */\n  @MainThread\n  override fun getStyleAtmosphereProperty(property: String): StylePropertyValue {\n    checkNativeStyle(\"getStyleAtmosphereProperty\")\n    return super.getStyleAtmosphereProperty(property)\n  }\n\n  /**\n   * Sets a value to the the style atmosphere property.\n   *\n   * @param property The style atmosphere property name.\n   * @param value The style atmosphere property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleAtmosphereProperty(property: String, value: Value): Expected<String, None> {\n    checkNativeStyle(\"setStyleAtmosphereProperty\")\n    return super.setStyleAtmosphereProperty(property, value)\n  }\n\n  /**\n   * Sets the style global terrain source properties.\n   *\n   * See [Mapbox Style Specification: Terrain](https://docs.mapbox.com/mapbox-gl-js/style-spec/terrain/).\n   *\n   * @param properties A map of style terrain properties values, with their names as key.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleTerrain(properties: Value): Expected<String, None> {\n    checkNativeStyle(\"setStyleTerrain\")\n    return super.setStyleTerrain(properties)\n  }\n\n  /**\n   * Get the value of a style terrain property.\n   *\n   * @param property Style terrain property name.\n   * @return Style terrain property value.\n   */\n  @MainThread\n  override fun getStyleTerrainProperty(property: String): StylePropertyValue {\n    checkNativeStyle(\"getStyleTerrainProperty\")\n    return super.getStyleTerrainProperty(property)\n  }\n\n  /**\n   * Sets the value of a style terrain property.\n   *\n   * @param property Style terrain property name.\n   * @param value Style terrain property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleTerrainProperty(property: String, value: Value): Expected<String, None> {\n    checkNativeStyle(\"setStyleTerrainProperty\")\n    return super.setStyleTerrainProperty(property, value)\n  }\n\n  /**\n   * Sets the map's [projection](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/).\n   * If called with `null`, the map will reset to Mercator.\n   *\n   * @param properties A map of style projection values, with their names as a key.\n   * Supported projections are:\n   *  * Mercator\n   *  * Globe\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleProjection(properties: Value): Expected<String, None> {\n    checkNativeStyle(\"setStyleProjection\")\n    return super.setStyleProjection(properties)\n  }\n\n  /**\n   * Gets the value of a style projection property.\n   *\n   * @param property The style projection property name.\n   * @return The style projection property value.\n   */\n  @MainThread\n  override fun getStyleProjectionProperty(property: String): StylePropertyValue {\n    checkNativeStyle(\"getStyleProjectionProperty\")\n    return super.getStyleProjectionProperty(property)\n  }\n\n  /**\n   * Sets a value to the the style projection property.\n   *\n   * @param property The style projection property name.\n   * @param value The style projection property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleProjectionProperty(property: String, value: Value): Expected<String, None> {\n    checkNativeStyle(\"setStyleProjectionProperty\")\n    return super.setStyleProjectionProperty(property, value)\n  }\n\n  /**\n   * Gets the value of the style light property.\n   *\n   * @param id light id.\n   * @param property light property name.\n   *\n   * @return The value of property in the light.\n   */\n  @MainThread\n  override fun getStyleLightProperty(id: String, property: String): StylePropertyValue {\n    checkNativeStyle(\"getStyleLightProperty\")\n    return super.getStyleLightProperty(id, property)\n  }\n\n  /**\n   * Adds an image to be used in the style. This API can also be used for updating\n   * an image. If the image id was already added, it gets replaced by the new image.\n   *\n   * The image can be used in `icon-image`, `fill-pattern`, and `line-pattern`.\n   *\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image](https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern)\n   *\n   * @param imageId ID of the image.\n   * @param scale The pixel density of the provided image. The image's pixel dimensions are divided\n   * by this value to determine its display size in density-independent pixels. For example, a\n   * 100x100 pixel image with scale=2.0 will be displayed as 50x50 density-independent pixels.\n   * @param image Pixel data of the image.\n   * @param sdf Option to treat whether image is SDF(signed distance field) or not.\n   * @param stretchX An array of two-element arrays, consisting of two numbers that represent\n   * the from position and the to position of areas that can be stretched horizontally.\n   * @param stretchY An array of two-element arrays, consisting of two numbers that represent\n   * the from position and the to position of areas that can be stretched vertically.\n   * @param content An array of four numbers, with the first two specifying the left, top\n   * corner, and the last two specifying the right, bottom corner. If present, and if the\n   * icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun addStyleImage(\n    imageId: String,\n    scale: Float,\n    image: Image,\n    sdf: Boolean,\n    stretchX: List<ImageStretches>,\n    stretchY: List<ImageStretches>,\n    content: ImageContent?\n  ): Expected<String, None> {\n    checkNativeStyle(\"addStyleImage\")\n    return super.addStyleImage(\n      imageId,\n      scale,\n      image,\n      sdf,\n      stretchX,\n      stretchY,\n      content\n    )\n  }\n\n  /**\n   * Get an image from the style.\n   *\n   * @param imageId ID of the image.\n   *\n   * @return Image data associated with the given ID, or empty if no image is\n   * associated with that ID.\n   */\n  @MainThread\n  override fun getStyleImage(imageId: String): Image? {\n    checkNativeStyle(\"getStyleImage\")\n    return super.getStyleImage(imageId)\n  }\n\n  /**\n   * Removes an image from the style.\n   *\n   * @param imageId ID of the image to remove.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun removeStyleImage(imageId: String): Expected<String, None> {\n    checkNativeStyle(\"removeStyleImage\")\n    return super.removeStyleImage(imageId)\n  }\n\n  /**\n   * Checks whether an image exists.\n   *\n   * @param imageId The identifier of the image.\n   *\n   * @return True if image exists, false otherwise.\n   */\n  @MainThread\n  override fun hasStyleImage(imageId: String): Boolean {\n    checkNativeStyle(\"hasStyleImage\")\n    return super.hasStyleImage(imageId)\n  }\n\n  /**\n   * Adds a model to be used in the style. This API can also be used for updating\n   * a model. If the model for a given `modelId` was already added, it gets replaced by the new model.\n   *\n   * The model can be used in `model-id` property in model layer.\n   *\n   * @param modelId An identifier of the model.\n   * @param modelUri A URI for the model.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MapboxExperimental\n  @MainThread\n  override fun addStyleModel(modelId: String, modelUri: String): Expected<String, None> {\n    checkNativeStyle(\"addStyleModel\")\n    return super.addStyleModel(modelId, modelUri)\n  }\n\n  /**\n   * Removes a model from the style.\n   *\n   * @param modelId The identifier of the model to remove.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MapboxExperimental\n  @MainThread\n  override fun removeStyleModel(modelId: String): Expected<String, None> {\n    checkNativeStyle(\"removeStyleModel\")\n    return super.removeStyleModel(modelId)\n  }\n\n  /**\n   * Checks whether a model exists.\n   *\n   * @param modelId The identifier of the model.\n   *\n   * @return True if model exists, false otherwise.\n   */\n  @MapboxExperimental\n  @MainThread\n  override fun hasStyleModel(modelId: String): Boolean {\n    checkNativeStyle(\"hasStyleModel\")\n    return super.hasStyleModel(modelId)\n  }\n\n  /**\n   * Gets style layer properties.\n   *\n   * @param layerId A style layer identifier.\n   * @return Style layer metadata or a string describing an error if the operation was not successful.\n   */\n  @MainThread\n  override fun getStyleLayerProperties(layerId: String): Expected<String, Value> {\n    checkNativeStyle(\"getStyleLayerProperties\")\n    return super.getStyleLayerProperties(layerId)\n  }\n\n  /**\n   * Sets style layer metadata.\n   *\n   * @param layerId A style layer identifier.\n   * @param properties the value wrapper around layer metadata\n   * @return a string describing an error if the operation was not successful.\n   */\n  @MainThread\n  override fun setStyleLayerProperties(layerId: String, properties: Value): Expected<String, None> {\n    checkNativeStyle(\"setStyleLayerProperties\")\n    return super.setStyleLayerProperties(layerId, properties)\n  }\n\n  /**\n   * Adds a new style custom layer.\n   *\n   * [style-spec#layers](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers)\n   *\n   * Runtime style layers are valid until they are either removed or a new style is loaded.\n   *\n   * Note: Custom layers are only valid on OpenGL rendering backend. Attempting to add a custom layer on Metal\n   * rendering backend results in undefined behavior.\n   *\n   * @param layerId Style layer id.\n   * @param layerHost Style custom layer host.\n   * @param layerPosition The position of the layer\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun addStyleCustomLayer(\n    layerId: String,\n    layerHost: CustomLayerHost,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    checkNativeStyle(\"addStyleCustomLayer\")\n    return super.addStyleCustomLayer(layerId, layerHost, layerPosition)\n  }\n\n  /**\n   * Adds a new [style layer](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers).\n   *\n   * Whenever a new style is being parsed and currently used style has persistent layers,\n   * an engine will try to do following:\n   *   - keep the persistent layer at its relative position\n   *   - keep the source used by a persistent layer\n   *   - keep images added through `addStyleImage` method\n   *\n   * In cases when a new style has the same layer, source or image resource, style's resources would be\n   * used instead and `MapLoadingError` event will be emitted.\n   *\n   * @param properties A map of style layer properties.\n   * @param layerPosition If not empty, the new layer will be positioned according to `layer position` parameters.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun addPersistentStyleLayer(\n    properties: Value,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    checkNativeStyle(\"addPersistentStyleLayer\")\n    return super.addPersistentStyleLayer(properties, layerPosition)\n  }\n\n  /**\n   * Adds a new [style custom layer](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers).\n   *\n   * Whenever a new style is being parsed and currently used style has persistent layers,\n   * an engine will try to do following:\n   *   - keep the persistent layer at its relative position\n   *   - keep the source used by a persistent layer\n   *   - keep images added through `addStyleImage` method\n   *\n   * In cases when a new style has the same layer, source or image resource, style's resources would be\n   * used instead and `MapLoadingError` event will be emitted.\n   *\n   * @param layerId A style layer identifier.\n   * @param layerHost The custom layer host.\n   * @param layerPosition If not empty, the new layer will be positioned according to `layer position` parameters.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @MainThread\n  override fun addPersistentStyleCustomLayer(\n    layerId: String,\n    layerHost: CustomLayerHost,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    checkNativeStyle(\"addPersistentStyleCustomLayer\")\n    return super.addPersistentStyleCustomLayer(layerId, layerHost, layerPosition)\n  }\n\n  /**\n   * Checks if a style layer is persistent.\n   *\n   * @param layerId A style layer identifier.\n   * @return A string describing an error if the operation was not successful, boolean representing state otherwise.\n   */\n  @MainThread\n  override fun isStyleLayerPersistent(layerId: String): Expected<String, Boolean> {\n    checkNativeStyle(\"isStyleLayerPersistent\")\n    return super.isStyleLayerPersistent(layerId)\n  }\n\n  /**\n   * Adds a custom geometry to be used in the style. To add the data, implement the [CustomGeometrySourceOptions.fetchTile@MainThread\n  override function]\n   * callback in the options and call [setStyleCustomGeometrySourceTileData]\n   *\n   * @param sourceId Style source identifier\n   * @param options Settings for the custom geometry\n   */\n  @MainThread\n  override fun addStyleCustomGeometrySource(\n    sourceId: String,\n    options: CustomGeometrySourceOptions\n  ): Expected<String, None> {\n    checkNativeStyle(\"addStyleCustomGeometrySource\")\n    return super.addStyleCustomGeometrySource(sourceId, options)\n  }\n\n  /**\n   * Returns the existing style sources.\n   *\n   * @return The list containing the ids of the existing style sources.\n   */\n  override val styleSources: List<StyleObjectInfo>\n    @MainThread\n    get() {\n      checkNativeStyle(\"getStyleSources\")\n      return super.styleSources\n    }\n\n  /**\n   * Returns the ordered slot identifiers of current style and its imports.\n   *\n   * @return The ordered list of slot identifiers.\n   */\n  @MapboxExperimental\n  override val styleSlots: List<String>\n    @MainThread\n    get() {\n      checkNativeStyle(\"getStyleSlots\")\n      return super.styleSlots\n    }\n\n  /**\n   * Returns the existing style layers.\n   *\n   * @return The list containing the ids of the existing style layers.\n   */\n  override val styleLayers: List<StyleObjectInfo>\n    @MainThread\n    get() {\n      checkNativeStyle(\"getStyleLayers\")\n      return super.styleLayers\n    }\n\n  /**\n   * Get the glyph URL of the current style in use.\n   *\n   * @return A string containing a glyph URI.\n   */\n  @MapboxExperimental\n  override fun getStyleGlyphURL(): String {\n    checkNativeStyle(\"getStyleGlyphURL\")\n    return super.getStyleGlyphURL()\n  }\n\n  /**\n   * Load the style glyphs from a provided URL.\n   *\n   * @param url URL where the glyphs should be loaded from.\n   */\n  @MapboxExperimental\n  override fun setStyleGlyphURL(url: String) {\n    checkNativeStyle(\"setStyleGlyphURL\")\n    super.setStyleGlyphURL(url)\n  }\n\n  /**\n   * Gets style source parameters.\n   * In order to convert returned value to a json string please take a look at [Value.toJson].\n   *\n   * @param sourceId Style source identifier.\n   *\n   * @return Style source parameters or a string describing an error if the operation was not successful.\n   */\n  @MainThread\n  override fun getStyleSourceProperties(sourceId: String): Expected<String, Value> {\n    checkNativeStyle(\"getStyleSourceProperties\")\n    return super.getStyleSourceProperties(sourceId)\n  }\n\n  /**\n   * Sets style source parameters.\n   * This method can be used to perform batch update for a style source parameters. The structure of a\n   * provided `parameters` value must conform to [Style Specification - Sources](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/)\n   * format for a corresponding source type. Modification of a source type\n   * https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#type is not allowed.\n   *\n   * @param sourceId Style source identifier.\n   * @param properties A map of Style source parameters.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  override fun setStyleSourceProperties(\n    sourceId: String,\n    properties: Value\n  ): Expected<String, None> {\n    checkNativeStyle(\"setStyleSourceProperties\")\n    return super.setStyleSourceProperties(sourceId, properties)\n  }\n\n  /**\n   * Set geojson source data.\n   * Call may take significant time for parsing and marshalling depending on the data size.\n   *\n   * Direct method use is not recommended, consider using `GeoJsonSource.geometry`, `GeoJsonSource.feature`, `GeoJsonSource.featureCollection`, `GeoJsonSource.data` instead.\n   *\n   * @param sourceId the id of the GeoJSON source\n   * @param dataId an arbitrary string used to track the given GeoJSON data, empty string means null ID\n   * @param data the GeoJson source data\n   *\n   */\n  @AnyThread\n  override fun setStyleGeoJSONSourceData(\n    sourceId: String,\n    dataId: String,\n    data: GeoJSONSourceData\n  ): Expected<String, None> {\n    if (!isStyleValid) {\n      logW(\n        TAG,\n        \"Style object (accessing setStyleGeoJSONSourceData) should not be stored and used after MapView is destroyed or new style has been loaded.\"\n      )\n    }\n    return super.setStyleGeoJSONSourceData(sourceId, dataId, data)\n  }\n\n  /**\n   * Add additional features to a GeoJSON style source.\n   *\n   * This method is thread-safe.\n   *\n   * Note that when calling this method from a thread other than the main thread, the return value does\n   * not contain the actual operation status. To ensure the success of the operation, use the events API,\n   * which will propagate a [MapLoaded] event upon success or a [MapLoadingError] event upon failure.\n   *\n   * Partially updating a GeoJSON source is not compatible with using shared cache and generated IDs.\n   * It is important to ensure that every feature in the GeoJSON style source, as well as the newly added\n   * feature, has a unique ID (or a unique promote ID if in use). Failure to provide unique IDs will result\n   * in a [MapLoadingError].\n   *\n   * The method allows the user to provide a data ID, which will be returned as the dataId parameter in the\n   * [SourceDataLoaded] event. However, it's important to note that multiple partial updates can be queued\n   * for the same GeoJSON source when ongoing source parsing is taking place. In these cases, the partial\n   * updates will be applied to the source in batches. Only the data ID provided in the most recent call within\n   * each batch will be included in the [SourceDataLoaded] event. If no data ID is provided in the most recent\n   * call, the data ID in the [SourceDataLoaded]event will be null.\n   *\n   * @param sourceId The identifier of the style source.\n   * @param dataId An arbitrary string used to track the given GeoJSON data, empty string means null ID.\n   * @param features An array of GeoJSON features to be added to the source.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @AnyThread\n  override fun addGeoJSONSourceFeatures(\n    sourceId: String,\n    dataId: String,\n    features: List<Feature>\n  ): Expected<String, None> {\n    if (!isStyleValid) {\n      logW(\n        TAG,\n        \"Style object (accessing addGeoJSONSourceFeatures) should not be stored and used after MapView is destroyed or new style has been loaded.\"\n      )\n    }\n    return super.addGeoJSONSourceFeatures(sourceId, dataId, features)\n  }\n\n  /**\n   * Update existing features in a GeoJSON style source.\n   *\n   * This method is thread safe.\n   *\n   * Note that when calling this method from a thread other than the main thread, the return value does\n   * not contain the actual operation status. To ensure the success of the operation, use the events API,\n   * which will propagate a [MapLoaded] event upon success or a [MapLoadingError] event upon failure.\n   *\n   * Partially updating a GeoJSON source is not compatible with using shared cache and generated IDs.\n   * It is important to ensure that every feature in the GeoJSON style source, as well as the newly added\n   * feature, has a unique ID (or a unique promote ID if in use). Failure to provide unique IDs will result\n   * in a [MapLoadingError].\n   *\n   * The method allows the user to provide a data ID, which will be returned as the dataId parameter in the\n   * [SourceDataLoaded] event. However, it's important to note that multiple partial updates can be queued\n   * for the same GeoJSON source when ongoing source parsing is taking place. In these cases, the partial\n   * updates will be applied to the source in batches. Only the data ID provided in the most recent call within\n   * each batch will be included in the [SourceDataLoaded] event. If no data ID is provided in the most recent\n   * call, the data ID in the [SourceDataLoaded]event will be null.\n   *\n   * @param sourceId A style source identifier.\n   * @param dataId An arbitrary string used to track the given GeoJSON data, empty string means null ID.\n   * @param features the GeoJSON features to be updated in the source.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @AnyThread\n  override fun updateGeoJSONSourceFeatures(\n    sourceId: String,\n    dataId: String,\n    features: List<Feature>\n  ): Expected<String, None> {\n    if (!isStyleValid) {\n      logW(\n        TAG,\n        \"Style object (accessing updateGeoJSONSourceFeatures) should not be stored and used after MapView is destroyed or new style has been loaded.\"\n      )\n    }\n    return super.updateGeoJSONSourceFeatures(sourceId, dataId, features)\n  }\n\n  /**\n   * Remove features from a GeoJSON style source.\n   *\n   * Note that when calling this method from a thread other than the main thread, the return value does\n   * not contain the actual operation status. To ensure the success of the operation, use the events API,\n   * which will propagate a [MapLoaded] event upon success or a [MapLoadingError] event upon failure.\n   *\n   * Partially updating a GeoJSON source is not compatible with using shared cache and generated IDs.\n   * It is important to ensure that every feature in the GeoJSON style source, as well as the newly added\n   * feature, has a unique ID (or a unique promote ID if in use). Failure to provide unique IDs will result\n   * in a [MapLoadingError].\n   *\n   * The method allows the user to provide a data ID, which will be returned as the dataId parameter in the\n   * [SourceDataLoaded] event. However, it's important to note that multiple partial updates can be queued\n   * for the same GeoJSON source when ongoing source parsing is taking place. In these cases, the partial\n   * updates will be applied to the source in batches. Only the data ID provided in the most recent call within\n   * each batch will be included in the [SourceDataLoaded] event. If no data ID is provided in the most recent\n   * call, the data ID in the [SourceDataLoaded]event will be null.\n   *\n   * @param sourceId A style source identifier.\n   * @param dataId An arbitrary string used to track the given GeoJSON data, empty string means null ID.\n   * @param featureIds the Ids of the features that need to be removed from the source.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @AnyThread\n  override fun removeGeoJSONSourceFeatures(\n    sourceId: String,\n    dataId: String,\n    featureIds: List<String>\n  ): Expected<String, None> {\n    if (!isStyleValid) {\n      logW(\n        TAG,\n        \"Style object (accessing removeGeoJSONSourceFeatures) should not be stored and used after MapView is destroyed or new style has been loaded.\"\n      )\n    }\n    return super.removeGeoJSONSourceFeatures(sourceId, dataId, featureIds)\n  }\n\n  /**\n   * Check if the style is completely loaded.\n   *\n   * @return TRUE if and only if the style JSON contents, the style specified sprite and sources are all loaded, otherwise returns FALSE.\n   */\n  @MainThread\n  override fun isStyleLoaded(): Boolean {\n    checkNativeStyle(\"isStyleLoaded\")\n    return super.isStyleLoaded()\n  }\n\n  /**\n   * Set color theme to style.\n   *\n   * @param colorTheme Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @MapboxExperimental\n  override fun setStyleColorTheme(colorTheme: ColorTheme?): Expected<String, None> {\n    checkNativeStyle(\"setStyleColorTheme\")\n    return super.setStyleColorTheme(colorTheme)\n  }\n\n  /**\n   * Set color theme to style.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param bitmap [Bitmap] of an LUT image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @MapboxExperimental\n  override fun setStyleColorTheme(bitmap: Bitmap): Expected<String, None> {\n    checkNativeStyle(\"setStyleColorTheme\")\n    return super.setStyleColorTheme(bitmap)\n  }\n\n  /**\n   * Set color theme to style.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param base64 base64 representation of an LUT image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @MapboxExperimental\n  override fun setStyleColorTheme(base64: String): Expected<String, None> {\n    checkNativeStyle(\"setStyleColorTheme\")\n    return super.setStyleColorTheme(base64)\n  }\n\n  /**\n   * Set color theme to style.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param image image data of an LUT image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @MapboxExperimental\n  override fun setStyleColorTheme(image: Image): Expected<String, None> {\n    checkNativeStyle(\"setStyleColorTheme\")\n    return super.setStyleColorTheme(image)\n  }\n\n  /**\n   * Set color theme to style import.\n   *\n   * @param importId String id of the style import to which the color theme will be applied.\n   * @param colorTheme Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @MapboxExperimental\n  override fun setImportColorTheme(importId: String, colorTheme: ColorTheme?): Expected<String, None> {\n    checkNativeStyle(\"setImportColorTheme\")\n    return super.setImportColorTheme(importId, colorTheme)\n  }\n\n  /**\n   * Set color theme to style import.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param importId String id of the style import to which the color theme will be applied.\n   * @param bitmap [Bitmap] of an LUT image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @MapboxExperimental\n  override fun setImportColorTheme(importId: String, bitmap: Bitmap): Expected<String, None> {\n    checkNativeStyle(\"setImportColorTheme\")\n    return super.setImportColorTheme(importId, bitmap)\n  }\n\n  /**\n   * Set color theme to style import.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param importId String id of the style import to which the color theme will be applied.\n   * @param base64 base64 representation of an LUT image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @MapboxExperimental\n  override fun setImportColorTheme(importId: String, base64: String): Expected<String, None> {\n    checkNativeStyle(\"setImportColorTheme\")\n    return super.setImportColorTheme(importId, base64)\n  }\n\n  /**\n   * Set color theme to style import.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param importId String id of the style import to which the color theme will be applied.\n   * @param image image data of an LUT image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @MapboxExperimental\n  override fun setImportColorTheme(importId: String, image: Image): Expected<String, None> {\n    checkNativeStyle(\"setImportColorTheme\")\n    return super.setImportColorTheme(importId, image)\n  }\n\n  /**\n   * Note! This is an experimental feature. It can be changed or removed in future versions.\n   *\n   * Adds a custom raster source to be used in the style. To add the data, implement the fetchTile@MainThread\n  override function callback in the options and call setStyleCustomRasterSourceTileData()\n   *\n   * @param sourceId A style source identifier\n   * @param options The `custom raster source options` for the custom raster source.\n   */\n  @MapboxExperimental\n  @MainThread\n  override fun addStyleCustomRasterSource(\n    sourceId: String,\n    options: CustomRasterSourceOptions\n  ): Expected<String, None> {\n    checkNativeStyle(\"addStyleCustomRasterSource\")\n    return super.addStyleCustomRasterSource(sourceId, options)\n  }\n\n  /**\n   * Note! This is an experimental feature. It can be changed or removed in future versions.\n   *\n   * Set tile data for raster tiles.\n   *\n   * The provided data is not cached, and the implementation will call the fetch callback each time the tile reappears.\n   *\n   * @param sourceId A style source identifier.\n   * @param tiles Array with new tile data.\n   */\n  @MapboxExperimental\n  @MainThread\n  override fun setStyleCustomRasterSourceTileData(\n    sourceId: String,\n    tiles: List<CustomRasterSourceTileData>,\n  ): Expected<String, None> {\n    checkNativeStyle(\"setStyleCustomRasterSourceTileData\")\n    return super.setStyleCustomRasterSourceTileData(sourceId, tiles)\n  }\n\n  /**\n   * Returns the available featuresets in the currently loaded style.\n   *\n   * Note: This function should only be called after the style is fully loaded; otherwise, the result may be unreliable.\n   */\n  @MainThread\n  @MapboxExperimental\n  override fun getFeaturesets(): List<FeaturesetDescriptor> {\n    checkNativeStyle(\"getFeaturesets\")\n    return super.getFeaturesets()\n  }\n\n  private fun checkNativeStyle(methodName: String) {\n    if (!isStyleValid) {\n      logW(\n        TAG,\n        \"Style object (accessing $methodName) should not be stored and used after MapView is destroyed or new style has been loaded.\"\n      )\n    }\n  }\n\n  /**\n   * A convenience object to access [the style ID](https://docs.mapbox.com/help/glossary/style-id/) strings of the professionally-designed\n   * map styles made by Mapbox.\n   */\n  companion object {\n    private const val TAG = \"Mbgl-Style\"\n\n    /**\n     * Mapbox Standard: A dynamic and performant 3D style that is the default for Mapbox maps.\n     */\n    const val STANDARD = \"mapbox://styles/mapbox/standard\"\n\n    /**\n     * Mapbox Standard Satellite: Combines updated satellite imagery and vector layers to offer users improved clarity and detail.\n     */\n    const val STANDARD_SATELLITE = \"mapbox://styles/mapbox/standard-satellite\"\n\n    /**\n     * Mapbox Streets: A complete base map, perfect for incorporating your own data. Using this\n     * constant means your map style will always use the latest version and may change as we\n     * improve the style.\n     */\n    const val MAPBOX_STREETS = \"mapbox://styles/mapbox/streets-v12\"\n\n    /**\n     * Outdoors: A general-purpose style tailored to outdoor activities. Using this constant means\n     * your map style will always use the latest version and may change as we improve the style.\n     */\n    const val OUTDOORS = \"mapbox://styles/mapbox/outdoors-v12\"\n\n    /**\n     * Light: Subtle light backdrop for data visualizations. Using this constant means your map\n     * style will always use the latest version and may change as we improve the style.\n     */\n    const val LIGHT = \"mapbox://styles/mapbox/light-v11\"\n\n    /**\n     * Dark: Subtle dark backdrop for data visualizations. Using this constant means your map style\n     * will always use the latest version and may change as we improve the style.\n     */\n    const val DARK = \"mapbox://styles/mapbox/dark-v11\"\n\n    /**\n     * Satellite: A beautiful global satellite and aerial imagery layer. Using this constant means\n     * your map style will always use the latest version and may change as we improve the style.\n     */\n    const val SATELLITE = \"mapbox://styles/mapbox/satellite-v9\"\n\n    /**\n     * Satellite Streets: Global satellite and aerial imagery with unobtrusive labels. Using this\n     * constant means your map style will always use the latest version and may change as we\n     * improve the style.\n     */\n    const val SATELLITE_STREETS = \"mapbox://styles/mapbox/satellite-streets-v12\"\n\n    /**\n     * Traffic Day: Color-coded roads based on live traffic congestion data. Traffic data is currently\n     * available in [these select countries](https://www.mapbox.com/help/how-directions-work/#traffic-data).\n     * Using this constant means your map style will always use the latest version and may change as we improve the style.\n     */\n    const val TRAFFIC_DAY = \"mapbox://styles/mapbox/traffic-day-v2\"\n\n    /**\n     * Traffic Night: Color-coded roads based on live traffic congestion data, designed to maximize\n     * legibility in low-light situations. Traffic data is currently available in\n     * [these select countries](https://www.mapbox.com/help/how-directions-work/#traffic-data).\n     * Using this constant means your map style will always use the latest version and may change as we improve the style.\n     */\n    const val TRAFFIC_NIGHT = \"mapbox://styles/mapbox/traffic-night-v2\"\n  }\n\n  /**\n   * Callback to be invoked when a style has finished loading.\n   */\n  fun interface OnStyleLoaded {\n    /**\n     * Invoked when a style has finished loading.\n     *\n     * @param style the style that has finished loading\n     */\n    fun onStyleLoaded(style: Style)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/StyleObserver.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.common.Cancelable\nimport java.util.concurrent.CopyOnWriteArraySet\n\n/**\n * Class that listens to style error and load events\n * and maintains and invokes user added listeners.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class StyleObserver(\n  private val styleManager: StyleManager,\n  private val styleLoadedListener: Style.OnStyleLoaded,\n  private val nativeObserver: NativeObserver,\n  private val pixelRatio: Float,\n  private val mapLoadingErrorDelegate: MapLoadingErrorDelegate,\n) : StyleLoadedCallback, MapLoadingErrorCallback, StyleDataLoadedCallback {\n\n  private var userStyleLoadedListener: Style.OnStyleLoaded? = null\n  // fired when [StyleDataType.STYLE] arrives, first of all style data loaded events\n  private var styleDataStyleLoadedListener: Style.OnStyleLoaded? = null\n  // if the listener is not null - style load has been started\n  // but the initial event has NOT arrived yet\n  private val isWaitingStyleDataStyleEvent\n    get() = styleDataStyleLoadedListener != null\n  // fired when [StyleDataType.SPRITE] arrives\n  private var styleDataSpritesLoadedListener: Style.OnStyleLoaded? = null\n  // fired when [StyleDataType.SOURCES] arrives\n  private var styleDataSourcesLoadedListener: Style.OnStyleLoaded? = null\n  private val getStyleListeners = CopyOnWriteArraySet<Style.OnStyleLoaded>()\n\n  /** Initialized after [MapEvent.STYLE_LOADED] event from [preLoadedStyle], sent to user and all plugins. */\n  private var loadedStyle: Style? = null\n\n  /** Initialized after [MapEvent.STYLE_DATA_LOADED] event to notify [styleDataStyleLoadedListener]\n   *  listener to apply style extension properties. They should be applied ASAP (before the final\n   *  [MapEvent.STYLE_LOADED] event) to make sure map is rendered correctly from the very beginning\n   *  (e.g. with the correct [Projection]). */\n  private var preLoadedStyle: Style? = null\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  val cancelableList = CopyOnWriteArraySet<Cancelable>()\n\n  init {\n    cancelableList.apply {\n      add(nativeObserver.subscribeStyleLoaded(this@StyleObserver))\n      add(nativeObserver.subscribeMapLoadingError(this@StyleObserver))\n      add(nativeObserver.subscribeStyleDataLoaded(this@StyleObserver))\n    }\n  }\n\n  /**\n   * Set a style listener coming from loadStyle request.\n   * Overwrites listener from previous loadStyle request.\n   * NOTE : listener is invoked only once after successful style load.\n   */\n  fun setLoadStyleListener(\n    userOnStyleLoaded: Style.OnStyleLoaded?,\n    styleDataStyleLoadedListener: Style.OnStyleLoaded,\n    styleDataSpritesLoadedListener: Style.OnStyleLoaded? = null,\n    styleDataSourcesLoadedListener: Style.OnStyleLoaded? = null,\n  ) {\n    // needed to prevent receiving onStyleLoaded for the old style in some rare cases\n    nativeObserver.resubscribeStyleLoadListeners()\n    this.userStyleLoadedListener = userOnStyleLoaded\n    this.styleDataStyleLoadedListener = styleDataStyleLoadedListener\n    this.styleDataSpritesLoadedListener = styleDataSpritesLoadedListener\n    this.styleDataSourcesLoadedListener = styleDataSourcesLoadedListener\n  }\n\n  /**\n   * Add a style listener coming from getStyle requests.\n   * NOTE : listener is invoked only once after successful style load.\n   */\n  fun addGetStyleListener(loadedListener: Style.OnStyleLoaded) {\n    getStyleListeners.add(loadedListener)\n  }\n\n  /**\n   * Invoked when a style has loaded\n   */\n  override fun run(eventData: StyleLoaded) {\n    loadedStyle?.markInvalid()\n    loadedStyle = preLoadedStyle\n    val style = loadedStyle\n      ?: throw MapboxMapException(\"Style is not initialized on onStyleLoaded callback!\")\n\n    // notify style extension DSL in case StyleDataType.SPRITES was not fired\n    onStyleSpritesReady()\n    // notify style extension DSL in case StyleDataType.SOURCES was not fired\n    onStyleSourcesReady()\n    styleLoadedListener.onStyleLoaded(style)\n\n    userStyleLoadedListener?.let {\n      userStyleLoadedListener = null\n      it.onStyleLoaded(style)\n    }\n\n    getStyleListeners.forEach { listener ->\n      listener.onStyleLoaded(style)\n    }\n    getStyleListeners.clear()\n  }\n\n  /**\n   * Invoked when map loading error occurred.\n   */\n  override fun run(eventData: MapLoadingError) {\n    logE(\n      TAG,\n      \"OnMapLoadError: ${eventData.type}, message: ${eventData.message}, sourceID: ${eventData.sourceId}, tileID: ${eventData.tileId}\"\n    )\n  }\n\n  /**\n   * Invoked when style data is loaded.\n   */\n  override fun run(eventData: StyleDataLoaded) {\n    when (eventData.type) {\n      StyleDataLoadedType.STYLE -> {\n        preLoadedStyle = Style(styleManager, pixelRatio, mapLoadingErrorDelegate).also {\n          styleDataStyleLoadedListener?.onStyleLoaded(it)\n        }\n        styleDataStyleLoadedListener = null\n      }\n      StyleDataLoadedType.SPRITE -> {\n        // if we're waiting for the [StyleDataType.STYLE] event - then this [StyleDataType.SPRITE]\n        // is related to the previously loaded style, don't notify style extension DSL about it\n        if (!isWaitingStyleDataStyleEvent) {\n          onStyleSpritesReady()\n        }\n      }\n      StyleDataLoadedType.SOURCES -> {\n        // if we're waiting for the [StyleDataType.STYLE] event - then this [StyleDataType.SOURCES]\n        // is related to the previously loaded style, don't notify style extension DSL about it\n        if (!isWaitingStyleDataStyleEvent) {\n          onStyleSourcesReady()\n        }\n      }\n    }\n  }\n\n  private fun onStyleSourcesReady() {\n    styleDataSourcesLoadedListener?.let { listener ->\n      // reset listener first, firing onStyleLoaded\n      // may produce another StyleDataType.SOURCES event if sources are added\n      styleDataSourcesLoadedListener = null\n      preLoadedStyle?.let(listener::onStyleLoaded)\n        ?: logE(TAG, \"Style is not initialized yet although SOURCES event has arrived!\")\n    }\n  }\n\n  private fun onStyleSpritesReady() {\n    styleDataSpritesLoadedListener?.let { listener ->\n      styleDataSpritesLoadedListener = null\n      preLoadedStyle?.let(listener::onStyleLoaded)\n        ?: logE(TAG, \"Style is not initialized yet although SPRITES event has arrived!\")\n    }\n  }\n\n  fun onDestroy() {\n    userStyleLoadedListener = null\n    styleDataStyleLoadedListener = null\n    styleDataSpritesLoadedListener = null\n    styleDataSourcesLoadedListener = null\n    preLoadedStyle?.markInvalid()\n    preLoadedStyle = null\n    loadedStyle?.markInvalid()\n    loadedStyle = null\n    getStyleListeners.clear()\n    cancelableList.forEach { it.cancel() }\n    cancelableList.clear()\n  }\n\n  companion object {\n    const val TAG = \"Mbgl-StyleObserver\"\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/SymbolScaleBehavior.kt",
    "content": "package com.mapbox.maps\n\nimport java.util.Objects\n\n/**\n * Controls how map symbols scale in response to system font size settings.\n *\n * Use factory methods to create instances:\n * - [system] - Automatic scaling with default or custom mapping\n * - [fixed] - Fixed scale factor, no dynamic updates\n */\n@MapboxExperimental\nclass SymbolScaleBehavior private constructor(\n  private val type: String,\n  internal val scaleFactor: Float?,\n  internal val mapping: ((Float) -> Float)?\n) {\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   *\n   * Note: Mapping functions are compared by reference identity.\n   * Two System instances are equal only if they share the same mapping function reference.\n   */\n  override fun equals(other: Any?) = other is SymbolScaleBehavior &&\n    type == other.type &&\n    scaleFactor == other.scaleFactor &&\n    mapping === other.mapping\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = Objects.hash(type, scaleFactor, mapping)\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = when (type) {\n    TYPE_FIXED -> \"SymbolScaleBehavior.Fixed(scaleFactor=$scaleFactor)\"\n    TYPE_SYSTEM -> \"SymbolScaleBehavior.System(mapping=${if (mapping == defaultMapping) \"default\" else \"custom\"})\"\n    else -> \"SymbolScaleBehavior(type=$type)\"\n  }\n\n  /**\n   * Returns true if this is a System mode (responds to system font scale changes).\n   */\n  internal fun isSystem(): Boolean = type == TYPE_SYSTEM\n\n  /**\n   * Returns true if this is a Fixed mode (fixed scale factor).\n   */\n  internal fun isFixed(): Boolean = type == TYPE_FIXED\n\n  companion object {\n    private const val TYPE_SYSTEM = \"SYSTEM\"\n    private const val TYPE_FIXED = \"FIXED\"\n\n    /**\n     * Automatic scaling based on system font size.\n     * Scales symbols from 0.8x (small fonts) to 2.0x (accessibility sizes).\n     */\n    @JvmStatic\n    val system: SymbolScaleBehavior\n      get() = SymbolScaleBehavior(TYPE_SYSTEM, null, defaultMapping)\n\n    /**\n     * Automatic scaling with custom mapping function.\n     *\n     * @param mapping Transforms system font scale (Float) to symbol scale (Float).\n     *\n     * Example: `SymbolScaleBehavior.system { scale -> min(scale * 1.2f, 1.5f) }`\n     */\n    @JvmStatic\n    fun system(mapping: (Float) -> Float): SymbolScaleBehavior =\n      SymbolScaleBehavior(TYPE_SYSTEM, null, mapping)\n\n    /**\n     * Fixed scale factor (no system font scaling).\n     *\n     * @param scaleFactor Scale value (recommended: 0.8-2.0)\n     */\n    @JvmStatic\n    fun fixed(scaleFactor: Float): SymbolScaleBehavior =\n      SymbolScaleBehavior(TYPE_FIXED, scaleFactor, null)\n\n    /**\n     * Default mapping function that converts system font scale to map symbol scale.\n     */\n    internal val defaultMapping: (Float) -> Float = { systemFontScale ->\n      when {\n        systemFontScale < 0.85f -> 0.8f\n        systemFontScale > 2.0f -> 2.0f\n        systemFontScale < 1.0f -> {\n          // Linear interpolation: [0.85, 1.0] → [0.8, 1.0]\n          0.8f + (systemFontScale - 0.85f) / 0.15f * 0.2f\n        }\n        else -> systemFontScale // Already in [1.0, 2.0]\n      }\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/Utils.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport android.util.TypedValue\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.common.Cancelable\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport kotlinx.coroutines.withContext\nimport kotlinx.coroutines.withTimeoutOrNull\nimport java.lang.ref.WeakReference\nimport kotlin.coroutines.Continuation\n\n/**\n * Checks the reference and if valid, calls the requested method.\n */\ninternal fun <T, R> WeakReference<T>.call(method: T.() -> R): R {\n  return (this.get() ?: throw IllegalStateException()).method()\n}\n\n/**\n * Wraps the methods returning [Cancelable] with `suspendCancellableCoroutine`,\n * canceling continuation if calling coroutine's Job has been cancelled.\n */\ninternal suspend inline fun <reified E, reified V, reified T : Expected<E, V>> suspendMapboxCancellableCoroutine(\n  crossinline block: (Continuation<T>) -> Cancelable\n): T {\n  return suspendCancellableCoroutine { continuation ->\n    val cancelable = block(continuation)\n    continuation.invokeOnCancellation { cancelable.cancel() }\n  }\n}\n\n@Suppress(\"UNCHECKED_CAST\")\ninternal fun <T : Number> T.toDP(context: Context): T {\n  return TypedValue.applyDimension(\n      TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), context.resources.displayMetrics\n  ) as T\n}\n\n/**\n * Executes a potentially blocking system call off the main thread with timeout and error handling.\n * This utility helps prevent ANRs caused by blocking IPC calls to system services.\n *\n * Uses [Dispatchers.Default] as system calls are CPU-bound operations involving IPC to system services.\n *\n * @param timeoutMs Timeout in milliseconds for the operation (default: 5000ms)\n * @param fallback Fallback value to return if the operation fails or times out\n * @param logTag Tag for logging errors (default: \"SystemCall\")\n * @param dispatcher The dispatcher to use for the operation (default: Dispatchers.Default)\n * @param operation The blocking operation to execute\n * @return The result of the operation or the fallback value\n */\ninternal suspend fun <T> safeSystemCall(\n  timeoutMs: Long = 5000L,\n  fallback: T,\n  logTag: String = \"SystemCall\",\n  dispatcher: CoroutineDispatcher = Dispatchers.Default,\n  operation: suspend () -> T\n): T {\n  return try {\n    withTimeoutOrNull(timeoutMs) {\n      withContext(dispatcher) {\n        operation()\n      }\n    } ?: run {\n      logW(logTag, \"System call timed out after ${timeoutMs}ms, using fallback\")\n      fallback\n    }\n  } catch (e: Exception) {\n    logE(logTag, \"System call failed: ${e.message}, using fallback\")\n    fallback\n  }\n}\n\n/**\n * Executes a potentially blocking system call off the main thread and posts the result back to the main thread.\n * This is useful for updating UI components after retrieving system information.\n *\n * @param timeoutMs Timeout in milliseconds for the operation (default: 5000ms)\n * @param fallback Fallback value to return if the operation fails or times out\n * @param logTag Tag for logging errors (default: \"SystemCall\")\n * @param dispatcher The dispatcher to use for the operation (default: Dispatchers.Default)\n * @param mainDispatcher The dispatcher to use for the callback (default: Dispatchers.Main)\n * @param operation The blocking operation to execute\n * @param onResult Callback to handle the result on the main thread\n */\ninternal suspend fun <T> safeSystemCallWithCallback(\n  timeoutMs: Long = 5000L,\n  fallback: T,\n  logTag: String = \"SystemCall\",\n  dispatcher: CoroutineDispatcher = Dispatchers.Default,\n  mainDispatcher: CoroutineDispatcher = Dispatchers.Main,\n  operation: suspend () -> T,\n  onResult: (T) -> Unit\n) {\n  val result = safeSystemCall(timeoutMs, fallback, logTag, dispatcher, operation)\n  withContext(mainDispatcher) {\n    onResult(result)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/attribution/AttributionLayout.kt",
    "content": "package com.mapbox.maps.attribution\n\nimport android.graphics.Bitmap\nimport android.graphics.PointF\n\n/**\n * Class representing attribution properties.\n */\ndata class AttributionLayout(\n  /**\n   * [Bitmap] logo.\n   */\n  val logo: Bitmap?,\n  /**\n   * [x, y] anchor point for placing the logo on the screen.\n   */\n  val anchorPoint: PointF?,\n  /**\n   * If set to `true` shorter text version will be used.\n   */\n  val isShortText: Boolean\n)"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/attribution/AttributionMeasure.kt",
    "content": "package com.mapbox.maps.attribution\n\nimport android.graphics.Bitmap\nimport android.graphics.PointF\nimport android.widget.TextView\n\n/**\n * Class used to measure all attributions for placing them on the screen.\n */\nclass AttributionMeasure internal constructor(\n  private val snapshot: Bitmap,\n  private val logo: Bitmap,\n  private val logoSmall: Bitmap,\n  private val textView: TextView,\n  private val textViewShort: TextView,\n  private val margin: Float\n) {\n  private var shorterText = false\n\n  /**\n   * Measure all attributions.\n   *\n   * @return [AttributionLayout] with all attributions.\n   */\n  fun measure(): AttributionLayout? {\n    val chain = Chain(\n      FullLogoLongTextCommand(),\n      FullLogoShortTextCommand(),\n      SmallLogoLongTextCommand(),\n      SmallLogoShortTextCommand(),\n      LongTextCommand(),\n      ShortTextCommand(),\n      NoTextCommand()\n    )\n    val attributionLayout = chain.start(this)\n    attributionLayout?.let {\n      shorterText = it.isShortText\n    }\n    return attributionLayout\n  }\n\n  private class FullLogoLongTextCommand : Command {\n    override fun execute(measure: AttributionMeasure): AttributionLayout? {\n      val width = measure.logoContainerWidth + measure.textViewContainerWidth\n      return execute(measure, width, measure.maxSize, measure.logo)\n    }\n  }\n\n  private class FullLogoShortTextCommand : Command {\n    override fun execute(measure: AttributionMeasure): AttributionLayout? {\n      val width = measure.logoContainerWidth + measure.textViewShortContainerWidth\n      return execute(measure, width, measure.maxSizeShort, measure.logo, true)\n    }\n  }\n\n  private class SmallLogoLongTextCommand : Command {\n    override fun execute(measure: AttributionMeasure): AttributionLayout? {\n      val width = measure.logoSmallContainerWidth + measure.textViewContainerWidth\n      return execute(measure, width, measure.maxSize, measure.logoSmall)\n    }\n  }\n\n  private class SmallLogoShortTextCommand : Command {\n    override fun execute(measure: AttributionMeasure): AttributionLayout? {\n      val width = measure.logoContainerWidth + measure.textViewShortContainerWidth\n      return execute(measure, width, measure.maxSizeShort, measure.logoSmall, true)\n    }\n  }\n\n  private class LongTextCommand : Command {\n    override fun execute(measure: AttributionMeasure): AttributionLayout? {\n      val width = measure.textViewContainerWidth + measure.margin\n      return execute(measure, width, measure.maxSize, null)\n    }\n  }\n\n  private class ShortTextCommand : Command {\n    override fun execute(measure: AttributionMeasure): AttributionLayout? {\n      val width = measure.textViewShortContainerWidth + measure.margin\n      return execute(measure, width, measure.maxSizeShort, null, true)\n    }\n  }\n\n  private class NoTextCommand : Command {\n    override fun execute(measure: AttributionMeasure): AttributionLayout? {\n      return AttributionLayout(null, null, false)\n    }\n  }\n\n  /**\n   * @return short or full version of [TextView] depending on [AttributionLayout.isShortText] flag\n   */\n  fun getTextView(): TextView {\n    return if (shorterText) textViewShort else textView\n  }\n\n  private inner class Chain(vararg commands: Command) {\n    var commands: List<Command> = listOf(*commands)\n\n    fun start(measure: AttributionMeasure): AttributionLayout? {\n      var attributionLayout: AttributionLayout? = null\n      for (command in commands) {\n        attributionLayout = command.execute(measure)\n        if (attributionLayout != null) {\n          break\n        }\n      }\n      return attributionLayout\n    }\n  }\n\n  private fun interface Command {\n    fun execute(\n      measure: AttributionMeasure,\n      width: Float,\n      maxSize: Float,\n      logo: Bitmap?,\n      isShortText: Boolean = false\n    ): AttributionLayout? {\n      return if (width <= maxSize)\n        AttributionLayout(\n          logo,\n          calculateAnchor(measure.snapshot, measure.textView, measure.margin),\n          isShortText\n        )\n      else\n        null\n    }\n\n    fun execute(measure: AttributionMeasure): AttributionLayout?\n  }\n\n  private val textViewContainerWidth: Float\n    get() = textView.measuredWidth + margin\n\n  private val logoContainerWidth: Float\n    get() = logo.width + 2 * margin\n\n  private val textViewShortContainerWidth: Float\n    get() = textViewShort.measuredWidth + margin\n\n  private val logoSmallContainerWidth: Float\n    get() = logoSmall.width + 2 * margin\n\n  private val maxSize: Float\n    get() = (snapshot.width * 8 / 10).toFloat()\n\n  private val maxSizeShort: Float\n    get() = snapshot.width.toFloat()\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private fun calculateAnchor(\n      snapshot: Bitmap,\n      textView: TextView,\n      margin: Float\n    ): PointF {\n      return PointF(\n        snapshot.width - textView.measuredWidth - margin,\n        snapshot.height - textView.measuredHeight - margin\n      )\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/attribution/AttributionParser.kt",
    "content": "package com.mapbox.maps.attribution\n\nimport android.content.Context\nimport android.os.Build\nimport android.text.Html\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\nimport android.text.style.URLSpan\nimport com.mapbox.maps.R\nimport com.mapbox.maps.plugin.attribution.Attribution\nimport java.lang.ref.WeakReference\nimport java.util.*\nimport java.util.regex.Pattern\n\n/**\n * Responsible for parsing attribution data coming from Sources and MapSnapshot.\n *\n *\n * Exposes multiple configuration options to manipulate data being parsed.\n * Use the Options object to build these configurations.\n *\n */\nopen class AttributionParser internal constructor(\n  private val context: WeakReference<Context>,\n  private val attributionData: String,\n  private val withImproveMap: Boolean,\n  private val withCopyrightSign: Boolean,\n  private val withTelemetryAttribution: Boolean,\n  private val withMapboxAttribution: Boolean,\n  private val withMapboxPrivacyPolicy: Boolean,\n  private val withMapboxGeofencingConsent: Boolean,\n  private val extraAttributions: List<Attribution>,\n) {\n  private val attributions: MutableSet<Attribution> = LinkedHashSet()\n\n  /**\n   * Get parsed attributions.\n   *\n   * @return the attributions\n   */\n  fun getAttributions(): Set<Attribution> {\n    return attributions\n  }\n\n  /**\n   * Get parsed attribution string.\n   *\n   * @param shortenedOutput if attribution string should contain shortened output\n   * @return the parsed attribution string\n   */\n  @JvmOverloads\n  fun createAttributionString(shortenedOutput: Boolean = false): String {\n    if (attributions.isEmpty()) {\n      return EMPTY_STRING\n    }\n\n    val stringBuilder = StringBuilder(if (withCopyrightSign) EMPTY_STRING else COPYRIGHT)\n    var counter = 0\n    for (attribution in attributions) {\n      counter++\n      stringBuilder.append(if (!shortenedOutput) attribution.title else attribution.titleAbbreviated)\n      if (counter != attributions.size) {\n        stringBuilder.append(\" / \")\n      }\n    }\n    return stringBuilder.toString()\n  }\n\n  /**\n   * Main attribution for configuration\n   */\n  protected fun parse() {\n    parseAttributions()\n    addAdditionalAttributions()\n  }\n\n  /**\n   * Parse string literal to attribution with empty url.\n   */\n  private fun parseStringLiteralToAttributions(stringLiteralList: List<String>) {\n    for (strLiteral in stringLiteralList) {\n      var htmlStr = fromHtml(strLiteral).toString()\n      if (!withCopyrightSign) {\n        htmlStr = stripCopyright(htmlStr)\n      }\n      attributions.add(\n        Attribution(\n          htmlStr,\n          \"\"\n        )\n      )\n    }\n  }\n\n  /**\n   * Parse attributions\n   */\n  private fun parseAttributions() {\n    val htmlBuilder =\n      fromHtml(\n        attributionData\n      ) as SpannableStringBuilder\n    val urlSpans =\n      htmlBuilder.getSpans(0, htmlBuilder.length, URLSpan::class.java)\n    for (urlSpan in urlSpans) {\n      parseUrlSpan(htmlBuilder, urlSpan)\n    }\n  }\n\n  /**\n   * Parse an URLSpan containing an attribution.\n   *\n   * @param htmlBuilder the html builder\n   * @param urlSpan the url span to be parsed\n   */\n  private fun parseUrlSpan(htmlBuilder: SpannableStringBuilder, urlSpan: URLSpan) {\n    val url = urlSpan.url\n    if (isUrlValid(url)) {\n      var anchor = parseAnchorValue(htmlBuilder, urlSpan)\n      if (isImproveThisMapAnchor(anchor)) {\n        if (!withImproveMap) {\n          return\n        }\n        anchor = translateImproveThisMapAnchor(anchor)\n      }\n      attributions.add(\n        Attribution(\n          anchor,\n          url\n        )\n      )\n    }\n  }\n\n  /**\n   * Invoked to validate if an url is valid to be included in the final attribution.\n   *\n   * @param url the url to be validated\n   * @return if the url is valid\n   */\n  private fun isUrlValid(url: String): Boolean {\n    return isValidForImproveThisMap(url) && isValidForMapbox(url)\n  }\n\n  /**\n   * Invoked to validate if an anchor is equal to Improve this map coming from tilesets.\n   *\n   * @param anchor the anchor to be validated\n   * @return if the url is valid\n   */\n  private fun isImproveThisMapAnchor(anchor: String): Boolean {\n    return anchor == IMPROVE_THIS_MAP\n  }\n\n  /**\n   * Invoked to replace the english Improve this map with localized variant.\n   *\n   * @param anchorString the anchor to be translated\n   * @return the translated anchor\n   */\n  private fun translateImproveThisMapAnchor(anchorString: String): String {\n    var anchor = anchorString\n    val context = context.get()\n    if (context != null) {\n      anchor = context.getString(R.string.mapbox_telemetryImproveMap)\n    }\n    return anchor\n  }\n\n  /**\n   * Invoked to validate if an url is valid for the improve map configuration.\n   *\n   * @param url the url to be validated\n   * @return if the url is valid for improve this map\n   */\n  private fun isValidForImproveThisMap(url: String): Boolean {\n    return withImproveMap || !IMPROVE_MAP_URLS.contains(url)\n  }\n\n  /**\n   * Invoked to validate if an url is valid for the Mapbox configuration.\n   *\n   * @param url the url to be validated\n   * @return if the url is valid for Mapbox\n   */\n  private fun isValidForMapbox(url: String): Boolean {\n    return withMapboxAttribution || url != Attribution.ABOUT_MAPS_URL\n  }\n\n  /**\n   * Parse the attribution by parsing the anchor value of html href tag.\n   *\n   * @param htmlBuilder the html builder\n   * @param urlSpan the current urlSpan\n   * @return the parsed anchor value\n   */\n  private fun parseAnchorValue(\n    htmlBuilder: SpannableStringBuilder,\n    urlSpan: URLSpan\n  ): String {\n    val start = htmlBuilder.getSpanStart(urlSpan)\n    val end = htmlBuilder.getSpanEnd(urlSpan)\n    val length = end - start\n    val charKey = CharArray(length)\n    htmlBuilder.getChars(start, end, charKey, 0)\n    return stripCopyright(String(charKey))\n  }\n\n  /**\n   * Utility to strip the copyright sign from an attribution\n   *\n   * @param anchorString the attribution string to strip\n   * @return the stripped attribution string without the copyright sign\n   */\n  private fun stripCopyright(anchorString: String): String {\n    var anchor = anchorString\n    if (!withCopyrightSign && anchor.startsWith(COPYRIGHT)) {\n      anchor = anchor.substring(2, anchor.length)\n    }\n    return anchor\n  }\n\n  /**\n   * Invoked to manually add attributions\n   */\n  private fun addAdditionalAttributions() {\n    val context = context.get()\n    if (withTelemetryAttribution) {\n      attributions.add(\n        Attribution(\n          context?.getString(R.string.mapbox_telemetrySettings) ?: Attribution.TELEMETRY_SETTINGS,\n          Attribution.ABOUT_TELEMETRY_URL\n        )\n      )\n    }\n    if (withMapboxGeofencingConsent) {\n      attributions.add(\n        Attribution(\n          context?.getString(R.string.mapbox_geofencing_consent) ?: Attribution.GEOFENCING,\n          Attribution.GEOFENCING_URL_MARKER\n        )\n      )\n    }\n    if (withMapboxPrivacyPolicy) {\n      attributions.add(\n        Attribution(\n          context?.getString(R.string.mapbox_privacy_policy) ?: Attribution.PRIVACY_POLICY,\n          Attribution.PRIVACY_POLICY_URL\n        )\n      )\n    }\n    attributions.addAll(extraAttributions)\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val EMPTY_STRING = \"\"\n    private const val COPYRIGHT = \"© \"\n    private const val IMPROVE_THIS_MAP = \"Improve this map\"\n\n    /**\n     * List of improve map URLs.\n     */\n    val IMPROVE_MAP_URLS: MutableList<String> = ArrayList()\n\n    /**\n     * Convert a string to a spanned html representation.\n     *\n     * @param html the string to convert\n     * @return the spanned html representation\n     */\n    private fun fromHtml(html: String): Spanned {\n      return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n        Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)\n      } else {\n        @Suppress(\"DEPRECATION\")\n        Html.fromHtml(html)\n      }\n    }\n\n    init {\n      // Using a List makes URL backwards compatible\n      IMPROVE_MAP_URLS.add(\"https://www.mapbox.com/feedback/\")\n      IMPROVE_MAP_URLS.add(\"https://www.mapbox.com/map-feedback/\")\n      IMPROVE_MAP_URLS.add(\"https://apps.mapbox.com/feedback/\")\n    }\n  }\n\n  /**\n   * Builder to configure using an AttributionParser.\n   *\n   *\n   * AttributionData, set with [.withAttributionData], is the only required property to build\n   * the underlying AttributionParser. Other properties include trimming the copyright sign, adding telemetry\n   * attribution or hiding attribution as improve this map and Mapbox.\n   *\n   */\n  class Options(context: Context) {\n    private val context: WeakReference<Context> = WeakReference(context)\n    private var withImproveMap = true\n    private var withCopyrightSign = true\n    private var withTelemetryAttribution = false\n    private var withMapboxAttribution = true\n    private var withMapboxPrivacyPolicy = true\n    private var withMapboxGeofencingConsent = true\n    private var attributionDataStringArray: Array<String>? = null\n    private var stringLiteralArray = mutableListOf<String>()\n    private var extraAttributions = emptyList<Attribution>()\n\n    /**\n     * Adds attribution data to the attribution parser builder\n     */\n    fun withAttributionData(vararg attributionData: String): Options {\n      attributionDataStringArray = arrayOf(*attributionData)\n      return this\n    }\n\n    /**\n     * Adds extra attributions to the attribution dialog\n     */\n    fun withExtraAttributions(attributions: List<Attribution>) = this.apply { extraAttributions = attributions }\n\n    /**\n     * Flag indicating to add improve this map to the attribution dialog\n     */\n    fun withImproveMap(withImproveMap: Boolean): Options {\n      this.withImproveMap = withImproveMap\n      return this\n    }\n\n    /**\n     * Flag indicating to add the copyright sign\n     */\n    fun withCopyrightSign(withCopyrightSign: Boolean): Options {\n      this.withCopyrightSign = withCopyrightSign\n      return this\n    }\n\n    /**\n     * Flag indicating to add telemetry attribution\n     */\n    fun withTelemetryAttribution(withTelemetryAttribution: Boolean): Options {\n      this.withTelemetryAttribution = withTelemetryAttribution\n      return this\n    }\n\n    /**\n     * Flag indicating to add Mapbox attribution\n     */\n    fun withMapboxAttribution(withMapboxAttribution: Boolean): Options {\n      this.withMapboxAttribution = withMapboxAttribution\n      return this\n    }\n\n    /**\n     * Flag indicating to add privacy policy\n     */\n    fun withMapboxPrivacyPolicy(withMapboxPrivacyPolicy: Boolean): Options {\n      this.withMapboxPrivacyPolicy = withMapboxPrivacyPolicy\n      return this\n    }\n\n    /**\n     * Flag indicating to show Geofencing user consent option.\n     * Note that the entry will be shown only if the Geofencing is currently active or the user has\n     * previously opted out.\n     */\n    fun withMapboxGeofencingConsent(withMapboxGeofencingConsent: Boolean): Options = this.apply {\n      this.withMapboxGeofencingConsent = withMapboxGeofencingConsent\n    }\n\n    /**\n     * Build the attribution parser\n     */\n    fun build(): AttributionParser {\n      checkNotNull(attributionDataStringArray) { \"Using builder without providing attribution data\" }\n      val fullAttributionString = parseAttribution(attributionDataStringArray!!)\n      val attributionParser =\n        AttributionParser(\n          context,\n          fullAttributionString,\n          withImproveMap,\n          withCopyrightSign,\n          withTelemetryAttribution,\n          withMapboxAttribution,\n          withMapboxPrivacyPolicy,\n          withMapboxGeofencingConsent,\n          extraAttributions\n        )\n      attributionParser.parse()\n      // parse string literals provided by source attribution.\n      attributionParser.parseStringLiteralToAttributions(stringLiteralArray)\n      return attributionParser\n    }\n\n    private fun parseAttribution(attribution: Array<String>): String {\n      val builder = StringBuilder()\n      for (attr in attribution) {\n        if (attr.isNotEmpty()) {\n          if (hasValidHTMLTag(attr)) builder.append(attr) else stringLiteralArray.add(attr)\n        }\n      }\n      return builder.toString()\n    }\n\n    /**\n     * check if the string contains valid HTML tag.\n     */\n    private fun hasValidHTMLTag(htmlStr: String): Boolean =\n      Pattern.compile(HTML_STYLE_REGEX).matcher(htmlStr).find()\n\n    private companion object {\n      const val HTML_STYLE_REGEX = \"<(\\\"[^\\\"]*\\\"|'[^']*'|[^'\\\">])*>\"\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/coroutine/MapCameraManagerDelegateExt.kt",
    "content": "package com.mapbox.maps.coroutine\n\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\n/**\n * Convenience method that returns the [CameraOptions] object for given parameters.\n *\n * @param coordinates The `coordinates` representing the bounds of the camera.\n * @param camera The [CameraOptions] which will be applied before calculating the camera for the coordinates. If any of the fields in [CameraOptions] are not provided then the current value from the map for that field will be used.\n * @param coordinatesPadding The amount of padding in pixels to add to the given `coordinates`.\n *                           Note: This padding is not applied to the map but to the coordinates provided. If you want to apply padding to the map use param `camera`.\n * @param maxZoom The maximum zoom level allowed in the returned camera options.\n * @param offset The center of the given bounds relative to map center in pixels.\n *\n * @return the [CameraOptions] object representing the provided parameters. Empty [CameraOptions] (see [CameraOptions.isEmpty]) could be returned only if an internal error occurred.\n */\n@JvmSynthetic\nsuspend fun MapCameraManagerDelegate.awaitCameraForCoordinates(\n  coordinates: List<Point>,\n  camera: CameraOptions,\n  coordinatesPadding: EdgeInsets? = null,\n  maxZoom: Double? = null,\n  offset: ScreenCoordinate? = null,\n): CameraOptions = suspendCoroutine { continuation ->\n  cameraForCoordinates(\n    coordinates = coordinates,\n    camera = camera,\n    coordinatesPadding = coordinatesPadding,\n    maxZoom = maxZoom,\n    offset = offset,\n    result = continuation::resume\n  )\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/coroutine/MapFeatureQueryDelegateExt.kt",
    "content": "package com.mapbox.maps.coroutine\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.QueriedRasterValues\nimport com.mapbox.maps.QueriedRenderedFeature\nimport com.mapbox.maps.QueriedSourceFeature\nimport com.mapbox.maps.RenderedQueryGeometry\nimport com.mapbox.maps.RenderedQueryOptions\nimport com.mapbox.maps.RenderedRasterQueryOptions\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.SourceQueryOptions\nimport com.mapbox.maps.plugin.delegates.MapFeatureQueryDelegate\nimport com.mapbox.maps.suspendMapboxCancellableCoroutine\nimport kotlin.coroutines.resume\n\n/**\n * Queries the map for rendered features.\n *\n * @param geometry The `screen pixel coordinates` (point, line string or box) to query for rendered features.\n * @param options The `render query options` for querying rendered features.\n *\n * @return a list of [QueriedRenderedFeature] or a string describing an error.\n */\n@JvmSynthetic\nsuspend fun MapFeatureQueryDelegate.queryRenderedFeatures(\n  geometry: RenderedQueryGeometry,\n  options: RenderedQueryOptions,\n): Expected<String, List<QueriedRenderedFeature>> =\n  suspendMapboxCancellableCoroutine { continuation ->\n    queryRenderedFeatures(geometry, options, continuation::resume)\n  }\n\n/**\n * Queries the map for source features.\n *\n * @param sourceId The style source identifier used to query for source features.\n * @param options The `source query options` for querying source features.\n *\n * @return a list of [QueriedSourceFeature] or a string describing an error.\n *\n * Note: In order to get expected results, the corresponding source needs to be in use and\n * the query shall be made after the corresponding source data is loaded.\n */\n@JvmSynthetic\nsuspend fun MapFeatureQueryDelegate.querySourceFeatures(\n  sourceId: String,\n  options: SourceQueryOptions,\n): Expected<String, List<QueriedSourceFeature>> =\n  suspendMapboxCancellableCoroutine { continuation ->\n    querySourceFeatures(sourceId, options, continuation::resume)\n  }\n\n/**\n * Queries the map for rendered raster values at a specific coordinate.\n *\n * This is a suspend function variant of [MapFeatureQueryDelegate.queryRenderedRasterValues].\n *\n * @param coordinate The position on the screen to query.\n * @param options The options for configuring the rendered raster value query.\n *\n * @return [QueriedRasterValues] containing raster values or a string describing an error.\n */\n@MapboxExperimental\n@JvmSynthetic\nsuspend fun MapFeatureQueryDelegate.queryRenderedRasterValues(\n  coordinate: ScreenCoordinate,\n  options: RenderedRasterQueryOptions,\n): Expected<String, QueriedRasterValues> =\n  suspendMapboxCancellableCoroutine { continuation ->\n    queryRenderedRasterValues(coordinate, options, continuation::resume)\n  }"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/coroutine/MapboxMapExt.kt",
    "content": "// Suppress to keep <T> generic type for `callbackFlow<T>` - otherwise kotlin compiler crashes because the onCancel lambda\n// see :\n// https://youtrack.jetbrains.com/issue/KT-53478/Could-not-load-module-Error-module\n// https://youtrack.jetbrains.com/issue/KT-52757/Type-inference-for-builders-fails-if-inferred-from-a-function\n@file:Suppress(\"RemoveExplicitTypeArguments\")\n\npackage com.mapbox.maps.coroutine\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.StyleContract\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.channels.trySendBlocking\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.callbackFlow\nimport kotlinx.coroutines.flow.conflate\nimport kotlinx.coroutines.flow.flowOn\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\n/**\n * Get the [Style] of the map.\n *\n * Note: keeping the reference to an invalid [Style] instance introduces significant native memory leak,\n * see [Style.isValid] for more details.\n */\n@JvmSynthetic\nsuspend fun MapboxMap.awaitStyle(): Style = suspendCoroutine { continuation ->\n  getStyle(continuation::resume)\n}\n\n/**\n * Load a new style from a style extension, suspends until style is loaded.\n *\n * @param styleExtension the style extension to load\n */\n@JvmSynthetic\nsuspend fun MapboxMap.awaitLoadStyle(\n  styleExtension: StyleContract.StyleExtension,\n): Style = suspendCoroutine { continuation ->\n  loadStyle(\n    styleExtension,\n    onStyleLoaded = continuation::resume\n  )\n}\n\n/**\n * Load a new style from a style URI or JSON, suspends until style is loaded.\n *\n * @param style the style URI to load\n */\n@JvmSynthetic\nsuspend fun MapboxMap.awaitLoadStyle(\n  style: String,\n): Style = suspendCoroutine { continuation ->\n  loadStyle(\n    style = style,\n    onStyleLoaded = continuation::resume\n  )\n}\n\n/**\n * Returns all the leaves (original points) of a cluster (given its cluster_id) from a GeoJsonSource, with pagination support: limit is the number of leaves\n * to return (set to Infinity for all points), and offset is the amount of points to skip (for pagination).\n *\n * Requires configuring the source as a cluster by calling [GeoJsonSource.Builder#cluster(boolean)].\n *\n * @param sourceIdentifier GeoJsonSource identifier.\n * @param cluster Cluster from which to retrieve leaves from.\n * @param limit The number of points to return from the query (must use type [Long], set to maximum for all points). Defaults to 10.\n * @param offset The amount of points to skip (for pagination, must use type [Long]). Defaults to 0.\n *\n * @return a feature collection or a string describing an error.\n */\n@JvmSynthetic\nsuspend fun MapboxMap.getGeoJsonClusterLeaves(\n  sourceIdentifier: String,\n  cluster: Feature,\n  limit: Long,\n  offset: Long,\n): Expected<String, FeatureExtensionValue> = suspendMapboxCancellableCoroutine { continuation ->\n  getGeoJsonClusterLeaves(\n    sourceIdentifier = sourceIdentifier,\n    cluster = cluster,\n    limit = limit,\n    offset = offset,\n    callback = continuation::resume\n  )\n}\n\n/**\n * Returns the children (original points or clusters) of a cluster (on the next zoom level)\n * given its id (cluster_id value from feature properties) from a GeoJsonSource.\n *\n * Requires configuring the source as a cluster by calling [GeoJsonSource.Builder#cluster(boolean)].\n *\n * @param sourceIdentifier GeoJsonSource identifier.\n * @param cluster cluster from which to retrieve children from\n *\n * @return a feature collection or a string describing an error.\n */\n@JvmSynthetic\nsuspend fun MapboxMap.getGeoJsonClusterChildren(\n  sourceIdentifier: String,\n  cluster: Feature,\n): Expected<String, FeatureExtensionValue> = suspendMapboxCancellableCoroutine { continuation ->\n  getGeoJsonClusterChildren(\n    sourceIdentifier = sourceIdentifier,\n    cluster = cluster,\n    callback = continuation::resume\n  )\n}\n\n/**\n * Returns the zoom on which the cluster expands into several children (useful for \"click to zoom\" feature)\n * given the cluster's cluster_id (cluster_id value from feature properties) from a GeoJsonSource.\n *\n * Requires configuring the source as a cluster by calling [GeoJsonSource.Builder#cluster(boolean)].\n *\n * @param sourceIdentifier GeoJsonSource identifier.\n * @param cluster cluster from which to retrieve the expansion zoom from\n *\n * @return a value or a string describing an error.\n */\n@JvmSynthetic\nsuspend fun MapboxMap.getGeoJsonClusterExpansionZoom(\n  sourceIdentifier: String,\n  cluster: Feature,\n): Expected<String, FeatureExtensionValue> = suspendMapboxCancellableCoroutine { continuation ->\n  getGeoJsonClusterExpansionZoom(\n    sourceIdentifier = sourceIdentifier,\n    cluster = cluster,\n    callback = continuation::resume\n  )\n}\n\n/**\n * Get the state map of a feature within a style source.\n *\n * Note that updates to feature state are asynchronous, so changes made by other methods might not be\n * immediately visible.\n *\n * @param sourceId The style source identifier.\n * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n * @param featureId The feature identifier of the feature whose state should be queried.\n *\n * @return a feature state value or a string describing an error.\n */\n@JvmSynthetic\nsuspend fun MapboxMap.getFeatureState(\n  sourceId: String,\n  sourceLayerId: String? = null,\n  featureId: String,\n): Expected<String, Value> = suspendMapboxCancellableCoroutine { continuation ->\n  getFeatureState(\n    sourceId = sourceId,\n    sourceLayerId = sourceLayerId,\n    featureId = featureId,\n    callback = continuation::resume\n  )\n}\n\n/**\n * Removes entries from a feature state object.\n *\n * Remove a specified property or all property from a feature's state object, depending on the value of\n * `stateKey`.\n *\n * Note that updates to feature state are asynchronous, so changes made by this method might not be\n * immediately visible using `getStateFeature`.\n *\n * @param sourceId The style source identifier.\n * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n * @param featureId The feature identifier of the feature whose state should be removed.\n * @param stateKey The key of the property to remove. If `null`, all feature's state object properties are removed.\n *\n * @return [None] or a string describing an error.\n */\n@JvmSynthetic\nsuspend fun MapboxMap.removeFeatureState(\n  sourceId: String,\n  sourceLayerId: String? = null,\n  featureId: String,\n  stateKey: String? = null,\n): Expected<String, None> = suspendMapboxCancellableCoroutine { continuation ->\n  removeFeatureState(\n    sourceId = sourceId,\n    sourceLayerId = sourceLayerId,\n    featureId = featureId,\n    stateKey = stateKey,\n    callback = continuation::resume\n  )\n}\n\n/**\n * Reset all the feature states within a style source.\n *\n * Remove all feature state entries from the specified style source or source layer.\n *\n * Note that updates to feature state are asynchronous, so changes made by this method might not be\n * immediately visible using `getStateFeature`.\n *\n * @param sourceId The style source identifier.\n * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n *\n * @return [None] or a string describing an error.\n */\n@JvmSynthetic\nsuspend fun MapboxMap.resetFeatureStates(\n  sourceId: String,\n  sourceLayerId: String? = null,\n): Expected<String, None> = suspendMapboxCancellableCoroutine { continuation ->\n  resetFeatureStates(\n    sourceId = sourceId,\n    sourceLayerId = sourceLayerId,\n    callback = continuation::resume\n  )\n}\n\n/**\n * Updates the state object of a feature within a style source.\n *\n * Update entries in the `state` object of a given feature within a style source. Only properties of the\n * `state` object will be updated. A property in the feature `state` object that is not listed in `state` will\n * retain its previous value. The properties must be paint properties, layout properties are not supported.\n *\n * Note that updates to feature `state` are asynchronous, so changes made by this method might not be\n * immediately visible using `getStateFeature`. And the corresponding source needs to be in use to ensure the\n * feature data it contains can be successfully updated.\n *\n * @param sourceId The style source identifier.\n * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n * @param featureId The feature identifier of the feature whose state should be updated.\n * @param state The `state` object with properties to update with their respective new values.\n *\n * @return [None] or a string describing an error.\n */\n@JvmSynthetic\nsuspend fun MapboxMap.setFeatureState(\n  sourceId: String,\n  sourceLayerId: String? = null,\n  featureId: String,\n  state: Value,\n): Expected<String, None> = suspendMapboxCancellableCoroutine { continuation ->\n  setFeatureState(\n    sourceId = sourceId,\n    sourceLayerId = sourceLayerId,\n    featureId = featureId,\n    state = state,\n    callback = continuation::resume\n  )\n}\n\n/**\n * Conflated [Flow] of [MapLoaded] updates from [MapboxMap.subscribeMapLoaded].\n */\nval MapboxMap.mapLoadedEvents: Flow<MapLoaded>\n  @JvmSynthetic\n  get() = callbackFlow<MapLoaded> {\n    val cancelable = nativeObserver.subscribeMapLoaded(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [MapLoadingError] updates from [MapboxMap.subscribeMapLoadingError].\n */\nval MapboxMap.mapLoadingErrorEvents: Flow<MapLoadingError>\n  @JvmSynthetic\n  get() = callbackFlow<MapLoadingError> {\n    val cancelable = nativeObserver.subscribeMapLoadingError(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [StyleLoaded] updates from [MapboxMap.subscribeStyleLoaded].\n */\nval MapboxMap.styleLoadedEvents: Flow<StyleLoaded>\n  @JvmSynthetic\n  get() = callbackFlow<StyleLoaded> {\n    val cancelable = nativeObserver.subscribeStyleLoaded(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [StyleDataLoaded] updates from [MapboxMap.subscribeStyleDataLoaded].\n */\nval MapboxMap.styleDataLoadedEvents: Flow<StyleDataLoaded>\n  @JvmSynthetic\n  get() = callbackFlow<StyleDataLoaded> {\n    val cancelable = nativeObserver.subscribeStyleDataLoaded(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [CameraChanged] updates from [MapboxMap.subscribeCameraChanged].\n */\nval MapboxMap.cameraChangedEvents: Flow<CameraChanged>\n  @JvmSynthetic\n  get() = callbackFlow<CameraChanged> {\n    val cancelable = nativeObserver.subscribeCameraChanged(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [CameraChangedCoalesced] updates from [MapboxMap.subscribeCameraChangedCoalesced].\n */\n@com.mapbox.annotation.MapboxExperimental\nval MapboxMap.cameraChangedCoalescedEvents: Flow<CameraChangedCoalesced>\n  @JvmSynthetic\n  get() = callbackFlow<CameraChangedCoalesced> {\n    val cancelable =\n      nativeObserver.subscribeCameraChangedCoalesced(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [MapIdle] updates from [MapboxMap.subscribeMapIdle].\n */\nval MapboxMap.mapIdleEvents: Flow<MapIdle>\n  @JvmSynthetic\n  get() = callbackFlow<MapIdle> {\n    val cancelable = nativeObserver.subscribeMapIdle(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [SourceAdded] updates from [MapboxMap.subscribeSourceAdded].\n */\nval MapboxMap.sourceAddedEvents: Flow<SourceAdded>\n  @JvmSynthetic\n  get() = callbackFlow<SourceAdded> {\n    val cancelable = nativeObserver.subscribeSourceAdded(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [SourceRemoved] updates from [MapboxMap.subscribeSourceRemoved].\n */\nval MapboxMap.sourceRemovedEvents: Flow<SourceRemoved>\n  @JvmSynthetic\n  get() = callbackFlow<SourceRemoved> {\n    val cancelable = nativeObserver.subscribeSourceRemoved(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [SourceDataLoaded] updates from [MapboxMap.subscribeSourceDataLoaded].\n */\nval MapboxMap.sourceDataLoadedEvents: Flow<SourceDataLoaded>\n  @JvmSynthetic\n  get() = callbackFlow<SourceDataLoaded> {\n    val cancelable = nativeObserver.subscribeSourceDataLoaded(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [StyleImageMissing] updates from [MapboxMap.subscribeStyleImageMissing].\n */\nval MapboxMap.styleImageMissingEvents: Flow<StyleImageMissing>\n  @JvmSynthetic\n  get() = callbackFlow<StyleImageMissing> {\n    val cancelable =\n      nativeObserver.subscribeStyleImageMissing(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [StyleImageRemoveUnused] updates from [MapboxMap.subscribeStyleImageRemoveUnused].\n */\nval MapboxMap.styleImageRemoveUnusedEvents: Flow<StyleImageRemoveUnused>\n  @JvmSynthetic\n  get() = callbackFlow<StyleImageRemoveUnused> {\n    val cancelable =\n      nativeObserver.subscribeStyleImageRemoveUnused(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [RenderFrameStarted] updates from [MapboxMap.subscribeRenderFrameStarted].\n */\nval MapboxMap.renderFrameStartedEvents: Flow<RenderFrameStarted>\n  @JvmSynthetic\n  get() = callbackFlow<RenderFrameStarted> {\n    val cancelable =\n      nativeObserver.subscribeRenderFrameStarted(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [RenderFrameFinished] updates from [MapboxMap.subscribeRenderFrameFinished].\n */\nval MapboxMap.renderFrameFinishedEvents: Flow<RenderFrameFinished>\n  @JvmSynthetic\n  get() = callbackFlow<RenderFrameFinished> {\n    val cancelable =\n      nativeObserver.subscribeRenderFrameFinished(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [ResourceRequest] updates from [MapboxMap.subscribeResourceRequest].\n */\nval MapboxMap.resourceRequestEvents: Flow<ResourceRequest>\n  @JvmSynthetic\n  get() = callbackFlow<ResourceRequest> {\n    val cancelable = nativeObserver.subscribeResourceRequest(::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n\n/**\n * Conflated [Flow] of [GenericEvent] updates from [MapboxMap.subscribeGenericEvent].\n */\n@JvmSynthetic\n@MapboxExperimental\nfun MapboxMap.genericEvents(eventName: String): Flow<GenericEvent> {\n  return callbackFlow<GenericEvent> {\n    val cancelable =\n      nativeObserver.subscribeGenericEvent(eventName, ::trySendBlocking, onCancel = channel::close)\n    awaitClose(cancelable::cancel)\n  }.flowOn(Dispatchers.Main.immediate).conflate()\n}\n\n/**\n * Convenience method that returns the [CameraOptions] object for given parameters.\n *\n * @param coordinates The `coordinates` representing the bounds of the camera.\n * @param camera The [CameraOptions] which will be applied before calculating the camera for the coordinates. If any of the fields in [CameraOptions] are not provided then the current value from the map for that field will be used.\n * @param coordinatesPadding The amount of padding in pixels to add to the given `coordinates`.\n *                           Note: This padding is not applied to the map but to the coordinates provided. If you want to apply padding to the map use param `camera`.\n * @param maxZoom The maximum zoom level allowed in the returned camera options.\n * @param offset The center of the given bounds relative to map center in pixels.\n *\n * @return the [CameraOptions] object representing the provided parameters. Empty [CameraOptions] (see [CameraOptions.isEmpty]) could be returned only if an internal error occurred.\n */\n@Deprecated(\n  message = \"Deprecated because extension is shadowed by non-suspend method\",\n  replaceWith = ReplaceWith(\"awaitCameraForCoordinates(coordinates, camera, coordinatesPadding, maxZoom, offset)\"),\n  level = DeprecationLevel.WARNING\n)\n@JvmSynthetic\nsuspend fun MapboxMap.cameraForCoordinates(\n  coordinates: List<Point>,\n  camera: CameraOptions,\n  coordinatesPadding: EdgeInsets? = null,\n  maxZoom: Double? = null,\n  offset: ScreenCoordinate? = null,\n): CameraOptions = suspendCoroutine { continuation ->\n  cameraForCoordinates(\n    coordinates = coordinates,\n    camera = camera,\n    coordinatesPadding = coordinatesPadding,\n    maxZoom = maxZoom,\n    offset = offset,\n    result = continuation::resume\n  )\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/debugoptions/CameraDebugView.kt",
    "content": "package com.mapbox.maps.debugoptions\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.graphics.Typeface\nimport android.graphics.drawable.GradientDrawable\nimport android.text.SpannableStringBuilder\nimport android.util.AttributeSet\nimport android.widget.FrameLayout\nimport androidx.appcompat.widget.AppCompatTextView\nimport androidx.core.text.bold\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.toDP\n\ninternal class CameraDebugView(\n  context: Context,\n  attrs: AttributeSet? = null,\n  defStyleAttr: Int = 0\n) : AppCompatTextView(context, attrs, defStyleAttr) {\n\n  init {\n    setTypeface(Typeface.MONOSPACE)\n    val padding = 4f.toDP(context).toInt()\n    textSize = 13f\n    setPadding(padding, padding, padding, padding)\n    setTextColor(Color.BLACK)\n    val leftMargin = 8f.toDP(context).toInt()\n    val topMargin = 48f.toDP(context).toInt()\n    layoutParams = FrameLayout.LayoutParams(\n      FrameLayout.LayoutParams.WRAP_CONTENT,\n      FrameLayout.LayoutParams.WRAP_CONTENT\n    ).also { it.setMargins(leftMargin, topMargin, 0, 0) }\n\n    val cornerRadius = 5f.toDP(context)\n    val drawable = GradientDrawable()\n    drawable.cornerRadius = cornerRadius\n    drawable.setColor(Color.WHITE)\n    background = drawable\n  }\n\n  fun update(cameraState: CameraState) {\n    val string = SpannableStringBuilder()\n      .bold { append(\"lat:\") }.append(\" %.4f\".format(cameraState.center.latitude()))\n      .append(\"\\n\")\n      .bold { append(\"lon:\") }.append(\" %.4f\".format(cameraState.center.longitude()))\n      .append(\"\\n\")\n      .bold { append(\"zoom:\") }.append(\" %.2f\".format(cameraState.zoom))\n\n    if (cameraState.bearing != 0.0) {\n      string.append(\"\\n\")\n      string.bold { append(\"bearing:\") }.append(\" %.2f\".format(cameraState.bearing))\n    }\n    if (cameraState.pitch != 0.toDouble()) {\n      string.append(\"\\n\")\n      string.bold { append(\"pitch:\") }.append(\" %.2f\".format(cameraState.pitch))\n    }\n\n    text = string\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/debugoptions/DebugOptionsController.kt",
    "content": "package com.mapbox.maps.debugoptions\n\nimport android.content.Context\nimport android.widget.FrameLayout\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.MapboxMap\nimport kotlin.properties.Delegates\n\ninternal class DebugOptionsController {\n  private val mapView: FrameLayout\n  private val mapboxMap: MapboxMap\n  private val cameraDebugViewProvider: (Context) -> CameraDebugView\n  private val paddingDebugViewProvider: (Context) -> PaddingDebugView\n\n  private var cameraDebugView: CameraDebugView? = null\n  private var paddingDebugView: PaddingDebugView? = null\n  private var cameraSubscriptionCancelable: Cancelable? = null\n  var started by Delegates.observable(false) {\n    _, wasStarted, started ->\n    if (wasStarted != started) {\n      updateCameraSubscriptionIfNeeded()\n    }\n  }\n\n  var options: Set<MapViewDebugOptions> = setOf()\n    set(newValue) {\n      field = newValue\n      mapboxMap.debugOptions = newValue.nativeDebugOptions\n      toggleMapViewDebugOptionsIfNeeded()\n      updateCameraSubscriptionIfNeeded()\n    }\n\n  constructor(\n    mapView: FrameLayout,\n    mapboxMap: MapboxMap,\n  ) : this(mapView, mapboxMap, { CameraDebugView(it) }, { PaddingDebugView(it) })\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  constructor(\n    mapView: FrameLayout,\n    mapboxMap: MapboxMap,\n    cameraDebugViewProvider: (Context) -> CameraDebugView,\n    paddingDebugViewProvider: (Context) -> PaddingDebugView,\n  ) {\n    this.mapView = mapView\n    this.mapboxMap = mapboxMap\n    this.cameraDebugViewProvider = cameraDebugViewProvider\n    this.paddingDebugViewProvider = paddingDebugViewProvider\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun updateCameraSubscriptionIfNeeded() {\n    val needsCameraUpdates =\n      options.contains(MapViewDebugOptions.CAMERA) || options.contains(MapViewDebugOptions.PADDING)\n    if (started && needsCameraUpdates && cameraSubscriptionCancelable == null) {\n      cameraSubscriptionCancelable = mapboxMap.subscribeCameraChangedCoalesced {\n        cameraDebugView?.update(it.cameraState)\n        paddingDebugView?.update(it.cameraState.padding)\n      }\n    } else {\n      cameraSubscriptionCancelable?.cancel()\n      cameraSubscriptionCancelable = null\n    }\n  }\n\n  private fun toggleMapViewDebugOptionsIfNeeded() {\n    if (options.contains(MapViewDebugOptions.CAMERA)) {\n      if (cameraDebugView == null) {\n        cameraDebugView = cameraDebugViewProvider(mapView.context).also {\n          mapView.addView(it)\n          it.update(mapboxMap.cameraState)\n        }\n      }\n    } else {\n      cameraDebugView?.let {\n        mapView.removeView(it)\n        cameraDebugView = null\n      }\n    }\n\n    if (options.contains(MapViewDebugOptions.PADDING)) {\n      if (paddingDebugView == null) {\n        paddingDebugView = paddingDebugViewProvider(mapView.context).also {\n          mapView.addView(it)\n          it.update(mapboxMap.cameraState.padding)\n        }\n      }\n    } else {\n      paddingDebugView?.let {\n        mapView.removeView(it)\n        paddingDebugView = null\n      }\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/debugoptions/MapViewDebugOptions.kt",
    "content": "package com.mapbox.maps.debugoptions\n\nimport com.mapbox.maps.MapDebugOptions\n\n/** Options for enabling debugging features in a map view. */\ndata class MapViewDebugOptions internal constructor(internal val name: String) {\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Edges of tile boundaries are shown as thick, red lines to help diagnose\n     * tile clipping issues.\n     */\n    @JvmField\n    val TILE_BORDERS = MapViewDebugOptions(\"TILE_BORDERS\")\n\n    /** Each tile shows its tile coordinate (x/y/z) in the upper-left corner. */\n    @JvmField\n    val PARSE_STATUS = MapViewDebugOptions(\"PARSE_STATUS\")\n\n    /**\n     * Each tile shows a timestamps with modified and expires dates or n/a if\n     * timestamp is not available.\n     */\n    @JvmField\n    val TIMESTAMPS = MapViewDebugOptions(\"TIMESTAMPS\")\n\n    /**\n     * Edges of glyphs and symbols are shown as faint, green lines to help\n     * diagnose collision and label placement issues.\n     */\n    @JvmField\n    val COLLISION = MapViewDebugOptions(\"COLLISION\")\n\n    /**\n     * Each drawing operation is replaced by a translucent fill. Overlapping\n     * drawing operations appear more prominent to help diagnose overdrawing.\n     */\n    @JvmField\n    val OVERDRAW = MapViewDebugOptions(\"OVERDRAW\")\n\n    /** The stencil buffer is shown instead of the color buffer. */\n    @JvmField\n    val STENCIL_CLIP = MapViewDebugOptions(\"STENCIL_CLIP\")\n\n    /** The depth buffer is shown instead of the color buffer. */\n    @JvmField\n    val DEPTH_BUFFER = MapViewDebugOptions(\"DEPTH_BUFFER\")\n\n    /** Show 3D model bounding boxes. */\n    @JvmField\n    val MODEL_BOUNDS = MapViewDebugOptions(\"MODEL_BOUNDS\")\n\n    /** Show a wireframe for terrain. Currently supported for GL backend only. */\n    @JvmField\n    val TERRAIN_WIREFRAME = MapViewDebugOptions(\"TERRAIN_WIREFRAME\")\n\n    /** Show a wireframe for 2d layers. Currently supported for GL backend only. */\n    @JvmField\n    val LAYERS2_DWIREFRAME = MapViewDebugOptions(\"LAYERS2_DWIREFRAME\")\n\n    /** Show a wireframe for 3d layers. Currently supported for GL backend only. */\n    @JvmField\n    val LAYERS3_DWIREFRAME = MapViewDebugOptions(\"LAYERS3_DWIREFRAME\")\n\n    /** Each tile shows its local lighting conditions in the upper-left corner. (If `lights` properties are used, otherwise they show zero.) */\n    @JvmField\n    val LIGHT = MapViewDebugOptions(\"LIGHT\")\n\n    /**\n     * Show a debug view with information about the current camera state\n     * including lat, lng, zoom, pitch and bearing.\n     */\n    @JvmField\n    val CAMERA = MapViewDebugOptions(\"CAMERA\")\n\n    /**\n     * Draws camera padding frame.\n     */\n    @JvmField\n    val PADDING = MapViewDebugOptions(\"PADDING\")\n  }\n}\n\ninternal val Set<MapViewDebugOptions>.nativeDebugOptions: Set<MapDebugOptions>\n  get() = mapNotNull {\n    try {\n      MapDebugOptions.valueOf(it.name)\n    } catch (e: Exception) {\n      // skip map view options that don't have native counterparts\n      null\n    }\n  }.toSet()"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/debugoptions/PaddingDebugView.kt",
    "content": "package com.mapbox.maps.debugoptions\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.Typeface\nimport android.graphics.drawable.GradientDrawable\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.TextView\nimport androidx.core.graphics.ColorUtils\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.toDP\n\ninternal class PaddingDebugView(\n  context: Context,\n  attrs: AttributeSet? = null,\n  defStyleAttr: Int = 0\n) : FrameLayout(context, attrs, defStyleAttr) {\n  private val paddingFrame = FrameLayout(context)\n  private val top = TextView(context)\n  private val left = TextView(context)\n  private val right = TextView(context)\n  private val bottom = TextView(context)\n\n  init {\n    val paddingDrawable = GradientDrawable()\n    paddingDrawable.setColor(Color.TRANSPARENT)\n    paddingDrawable.setStroke(1f.toDP(context).toInt(), GREEN_DARK)\n    paddingFrame.background = paddingDrawable\n    paddingFrame.layoutParams = LayoutParams(\n      LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT\n    )\n\n    val crossView = CrossView(context)\n    crossView.layoutParams =\n      LayoutParams(15f.toDP(context).toInt(), 15f.toDP(context).toInt()).also {\n        it.gravity = Gravity.CENTER\n      }\n\n    for (textView in listOf(top, left, right, bottom)) {\n      textView.typeface = Typeface.MONOSPACE\n      textView.textSize = 10f\n      textView.setTextColor(Color.WHITE)\n      textView.setBackgroundColor(GREEN_DARK)\n      textView.layoutParams =\n        LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).also {\n          when (textView) {\n            top -> it.gravity = Gravity.CENTER_HORIZONTAL\n            left -> it.gravity = Gravity.CENTER_VERTICAL\n            right -> it.gravity = Gravity.CENTER_VERTICAL or Gravity.RIGHT\n            bottom -> it.gravity = Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM\n          }\n          it.leftMargin = 1f.toDP(context).toInt()\n          it.rightMargin = 1f.toDP(context).toInt()\n        }\n      textView.setPadding(1f.toDP(context).toInt(), 0, 1f.toDP(context).toInt(), 0)\n      paddingFrame.addView(textView)\n    }\n\n    paddingFrame.addView(crossView)\n    addView(paddingFrame)\n  }\n\n  @SuppressLint(\"SetTextI18n\")\n  fun update(padding: EdgeInsets) {\n    paddingFrame.layoutParams = (paddingFrame.layoutParams as LayoutParams).apply {\n      this.setMargins(\n        padding.left.toDP(context).toInt(),\n        padding.top.toDP(context).toInt(),\n        padding.right.toDP(context).toInt(),\n        padding.bottom.toDP(context).toInt()\n      )\n    }\n    top.text = \"%.1f\".format(padding.top)\n    left.text = \"%.1f\".format(padding.left)\n    right.text = \"%.1f\".format(padding.right)\n    bottom.text = \"%.1f\".format(padding.bottom)\n  }\n}\ninternal class CrossView(\n  context: Context,\n  attrs: AttributeSet? = null,\n  defStyleAttr: Int = 0\n) : View(context, attrs, defStyleAttr) {\n  private val greenPaint = Paint(0).apply {\n    color = GREEN_DARK\n    strokeWidth = 1f.toDP(context)\n  }\n\n  override fun onDraw(canvas: Canvas) {\n    canvas.apply {\n      val midY = height / 2f\n      val midX = width / 2f\n      drawLine(0f, midY, width.toFloat(), midY, greenPaint)\n      drawLine(midX, 0f, midX, height.toFloat(), greenPaint)\n    }\n  }\n}\n\nprivate val GREEN_DARK = ColorUtils.blendARGB(Color.GREEN, Color.BLACK, 0.25f)"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/plugin/InvalidViewPluginHostException.kt",
    "content": "package com.mapbox.maps.plugin\n\n/**\n * Exception thrown when a [ViewPlugin] is loaded in a context that doesn't have a view hierarchy associated.\n * @param message The exception message\n */\nclass InvalidViewPluginHostException(message: String) : Exception(message)"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/plugin/MapAttributionDelegateImpl.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport android.content.Context\nimport android.net.Uri\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.attribution.AttributionParser\nimport com.mapbox.maps.geofencing.MapGeofencingConsent\nimport com.mapbox.maps.module.MapTelemetry\nimport com.mapbox.maps.plugin.attribution.Attribution\nimport com.mapbox.maps.plugin.attribution.AttributionParserConfig\nimport com.mapbox.maps.plugin.attribution.isMapboxFeedback\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\nimport java.util.regex.Matcher\nimport java.util.regex.Pattern\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapAttributionDelegateImpl @OptIn(MapboxExperimental::class) constructor(\n  private val mapboxMap: MapboxMap,\n  private val mapTelemetry: MapTelemetry,\n  private val mapGeofencingConsent: MapGeofencingConsent,\n) : MapAttributionDelegate {\n\n  /**\n   * Called to request an instance of map telemetry.\n   *\n   * @return map telemetry instance\n   */\n  override fun telemetry(): MapTelemetry {\n    return mapTelemetry\n  }\n\n  /**\n   * Called to request an instance of geofencing consent.\n   *\n   * @return the geofencing consent instance\n   */\n  @MapboxExperimental\n  override fun geofencingConsent(): MapGeofencingConsent = mapGeofencingConsent\n\n  /**\n   * List of extra attributions for the data shown in the map.\n   */\n  override var extraAttributions: List<Attribution> = emptyList()\n\n  /**\n   * Parse attributions with the given config\n   *\n   * @param context the context\n   * @param config configuration for parings\n   *\n   * @return the parsed attributions\n   */\n  @OptIn(MapboxExperimental::class, com.mapbox.annotation.MapboxExperimental::class)\n  override fun parseAttributions(\n    context: Context,\n    config: AttributionParserConfig\n  ): List<Attribution> {\n    val attributionsArray = mapboxMap.getAttributions().toTypedArray()\n\n    return AttributionParser.Options(context)\n      .withCopyrightSign(config.withCopyrightSign)\n      .withImproveMap(config.withImproveMap)\n      .withTelemetryAttribution(config.withTelemetryAttribution)\n      .withMapboxAttribution(config.withMapboxAttribution)\n      .withMapboxPrivacyPolicy(config.withMapboxPrivacyPolicy)\n      .withMapboxGeofencingConsent(config.withMapboxGeofencingConsent)\n      .withAttributionData(*attributionsArray)\n      .withExtraAttributions(extraAttributions)\n      .build()\n      .getAttributions()\n      .sortedByDescending { attr ->\n        // Sort attribution by putting Mapbox related special attributions at the bottom of the list\n        when {\n          attr.url == Attribution.ABOUT_TELEMETRY_URL -> -1\n          attr.url == Attribution.GEOFENCING_URL_MARKER -> -2\n          attr.url == Attribution.PRIVACY_POLICY_URL -> -3\n          attr.isMapboxFeedback() -> -4\n          else -> 0\n        }\n      }\n  }\n\n  /**\n   * Build the feedback url\n   *\n   * @param context the context\n   */\n  override fun buildMapBoxFeedbackUrl(context: Context): String {\n    val builder = Uri.parse(MAP_FEEDBACK_URL).buildUpon()\n    val cameraPosition = mapboxMap.cameraState\n    cameraPosition.center.let {\n      builder.encodedFragment(\n        \"/${it.longitude()}/${it.latitude()}/${cameraPosition.zoom}/${cameraPosition.bearing}/${cameraPosition.pitch}\"\n      )\n    }\n    val packageName = context.applicationContext.packageName\n    if (packageName != null) {\n      builder.appendQueryParameter(\"referrer\", packageName)\n    }\n    builder.appendQueryParameter(\"access_token\", MapboxOptions.accessToken)\n\n    mapboxMap.style?.let {\n      val pattern: Pattern = Pattern.compile(MAP_FEEDBACK_STYLE_URI_REGEX)\n      val matcher: Matcher = pattern.matcher(it.styleURI)\n      if (matcher.find()) {\n        val styleOwner: String? = matcher.group(2)\n        val styleId: String? = matcher.group(3)\n        builder.appendQueryParameter(\"owner\", styleOwner)\n          .appendQueryParameter(\"id\", styleId)\n      }\n    }\n    return builder.build().toString()\n  }\n\n  companion object {\n    private const val MAP_FEEDBACK_URL = \"https://apps.mapbox.com/feedback\"\n    private const val MAP_FEEDBACK_STYLE_URI_REGEX = \"^(.*://[^:^/]*)/(.*)/(.*)\"\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/plugin/MapDelegateProviderImpl.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.IndoorManager\nimport com.mapbox.maps.MapController\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.geofencing.MapGeofencingConsent\nimport com.mapbox.maps.module.MapTelemetry\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapFeatureQueryDelegate\nimport com.mapbox.maps.plugin.delegates.MapFeatureStateDelegate\nimport com.mapbox.maps.plugin.delegates.MapInteractionDelegate\nimport com.mapbox.maps.plugin.delegates.MapListenerDelegate\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.delegates.MapProjectionDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\n\n@OptIn(MapboxExperimental::class)\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapDelegateProviderImpl(\n  val mapboxMap: MapboxMap,\n  mapController: MapController,\n  telemetry: MapTelemetry,\n  mapGeofencingConsent: MapGeofencingConsent,\n) : MapDelegateProvider {\n  override val mapCameraManagerDelegate: MapCameraManagerDelegate = mapboxMap\n  override val mapProjectionDelegate: MapProjectionDelegate = mapboxMap\n  override val mapTransformDelegate: MapTransformDelegate = mapboxMap\n  override val mapAttributionDelegate: MapAttributionDelegate by lazy {\n    MapAttributionDelegateImpl(mapboxMap, telemetry, mapGeofencingConsent)\n  }\n  override val mapFeatureQueryDelegate: MapFeatureQueryDelegate = mapboxMap\n  override val mapPluginProviderDelegate: MapPluginProviderDelegate = mapController\n  override val mapListenerDelegate: MapListenerDelegate = mapboxMap\n  override val mapFeatureStateDelegate: MapFeatureStateDelegate = mapboxMap\n\n  override fun getStyle(callback: (MapboxStyleManager) -> Unit) {\n    mapboxMap.getStyle { style -> callback(style) }\n  }\n\n  override val mapStyleManagerDelegate: MapboxStyleManager = mapboxMap\n  override val mapInteractionDelegate: MapInteractionDelegate = mapboxMap\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  override val indoorManager: IndoorManager = mapboxMap.indoor\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/plugin/MapPluginRegistry.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport android.view.MotionEvent\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.*\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport com.mapbox.maps.plugin.lifecycle.MapboxLifecyclePlugin\nimport java.util.concurrent.CopyOnWriteArraySet\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapPluginRegistry(private val mapDelegateProvider: MapDelegateProvider) {\n\n  private enum class State {\n    STARTED,\n    STOPPED,\n  }\n\n  private var mapState = State.STOPPED\n    set(value) {\n      if (value != field) {\n        field = value\n        when (field) {\n          State.STARTED -> plugins.values.forEach {\n            if (it is LifecyclePlugin) {\n              it.onStart()\n            }\n          }\n\n          State.STOPPED -> plugins.values.forEach {\n            if (it is LifecyclePlugin) {\n              it.onStop()\n            }\n          }\n        }\n      }\n    }\n\n  private var mapSize: Pair<Int, Int>? = null\n\n  private val plugins = mutableMapOf<String, MapPlugin>()\n  private val cameraPlugins = CopyOnWriteArraySet<MapCameraPlugin>()\n  private val gesturePlugins = CopyOnWriteArraySet<GesturesPlugin>()\n  private val styleObserverPlugins = CopyOnWriteArraySet<MapStyleObserverPlugin>()\n  private val mapSizePlugins = CopyOnWriteArraySet<MapSizePlugin>()\n  private var mapboxLifecyclePlugin: MapboxLifecyclePlugin? = null\n\n  fun createPlugin(\n    mapView: MapView?,\n    mapInitOptions: MapInitOptions,\n    plugin: Plugin\n  ) {\n    val mapPlugin = plugin.instance\n    if (mapPlugin == null) {\n      throw MapboxConfigurationException(\"MapPlugin instance is missing for ${plugin.id}!\")\n    } else {\n      if (!plugins.containsKey(plugin.id)) {\n        if (plugin.instance is ViewPlugin && mapView == null) {\n          // throw if view plugin if host is not a MapView (eg. MapSurface)\n          throw InvalidViewPluginHostException(\"Cause: ${mapPlugin.javaClass}\")\n        }\n\n        plugins[plugin.id] = mapPlugin\n        mapPlugin.onDelegateProvider(mapDelegateProvider)\n\n        if (mapPlugin is ViewPlugin) {\n          val pluginView = mapPlugin.bind(\n            mapView!!,\n            mapInitOptions.attrs,\n            mapInitOptions.mapOptions.pixelRatio\n          )\n          mapView.addView(pluginView)\n          mapPlugin.onPluginView(pluginView)\n        }\n\n        if (mapPlugin is ContextBinder) {\n          mapPlugin.bind(\n            mapInitOptions.context,\n            mapInitOptions.attrs,\n            mapInitOptions.mapOptions.pixelRatio\n          )\n        }\n\n        if (mapPlugin is MapSizePlugin) {\n          mapSizePlugins.add(mapPlugin)\n          mapSize?.let {\n            mapPlugin.onSizeChanged(it.first, it.second)\n          }\n        }\n\n        if (mapPlugin is MapCameraPlugin) {\n          cameraPlugins.add(mapPlugin)\n        }\n\n        if (mapPlugin is GesturesPlugin) {\n          gesturePlugins.add(mapPlugin)\n        }\n\n        if (mapPlugin is MapStyleObserverPlugin) {\n          styleObserverPlugins.add(mapPlugin)\n        }\n\n        if (mapPlugin is MapboxLifecyclePlugin) {\n          mapboxLifecyclePlugin = mapPlugin\n        }\n\n        mapPlugin.initialize()\n\n        if (mapState == State.STARTED && mapPlugin is LifecyclePlugin) {\n          mapPlugin.onStart()\n        }\n      } else {\n        plugins[plugin.id]?.initialize()\n      }\n    }\n  }\n\n  @Suppress(\"UNCHECKED_CAST\")\n  fun <T> getPlugin(id: String): T? = plugins[id] as T\n\n  fun removePlugin(id: String) {\n    val plugin = plugins[id]\n    when (plugin) {\n      is MapCameraPlugin -> cameraPlugins.remove(plugin)\n      is GesturesPlugin -> gesturePlugins.remove(plugin)\n      is MapStyleObserverPlugin -> styleObserverPlugins.remove(plugin)\n      is MapSizePlugin -> mapSizePlugins.remove(plugin)\n      is MapboxLifecyclePlugin -> mapboxLifecyclePlugin = null\n      else -> Unit\n    }\n    plugin?.cleanup()\n    plugins.remove(id)\n    logI(TAG, \"Removed plugin: $id from the Map.\")\n  }\n\n  fun onStart() {\n    mapState = State.STARTED\n  }\n\n  fun onStop() {\n    mapState = State.STOPPED\n  }\n\n  fun onDestroy() {\n    plugins.forEach {\n      it.value.cleanup()\n    }\n  }\n\n  fun onTouch(event: MotionEvent?): Boolean {\n    var onTouchResult = false\n    gesturePlugins.forEach {\n      onTouchResult = it.onTouchEvent(event) || onTouchResult\n    }\n    return onTouchResult\n  }\n\n  fun onGenericMotionEvent(event: MotionEvent): Boolean {\n    var onGenericMotionEventResult = false\n    gesturePlugins.forEach {\n      onGenericMotionEventResult = it.onGenericMotionEvent(event) || onGenericMotionEventResult\n    }\n    return onGenericMotionEventResult\n  }\n\n  fun onSizeChanged(width: Int, height: Int) {\n    mapSize = width to height\n    for (mapSizePlugin in mapSizePlugins) {\n      mapSizePlugin.onSizeChanged(width, height)\n    }\n  }\n\n  fun onCameraMove(cameraState: CameraState) {\n    cameraPlugins.forEach {\n      it.onCameraMove(\n        cameraState.center,\n        cameraState.zoom,\n        cameraState.pitch,\n        cameraState.bearing,\n        cameraState.padding\n      )\n    }\n  }\n\n  fun onStyleChanged(style: Style) {\n    styleObserverPlugins.forEach {\n      it.onStyleChanged(style)\n    }\n  }\n\n  fun onAttachedToWindow(mapView: MapView) {\n    mapboxLifecyclePlugin?.registerLifecycleObserver(mapView, mapView)\n  }\n\n  private companion object {\n    private const val TAG = \"MapPluginRegistry\"\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/FpsManager.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.os.Handler\nimport androidx.annotation.RestrictTo\nimport androidx.core.os.HandlerCompat\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport kotlin.math.pow\n\n@RenderThread\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class FpsManager(\n  private val handler: Handler,\n  mapName: String,\n) {\n  private var userRefreshRate = USER_DEFINED_REFRESH_RATE_NOT_SET\n  private var userToScreenRefreshRateRatio: Double? = null\n\n  private var screenRefreshRate = SCREEN_METRICS_NOT_DEFINED\n  private var screenRefreshPeriodNs = -1L\n  private var previousFrameTimeNs = -1L\n  private var previousDrawnFrameIndex = 0\n  private var frameRenderTimeAccumulatedNs = 0L\n  var skippedNow = 0\n    private set\n\n  private var preRenderTimeNs = -1L\n  private var choreographerTicks = 0\n\n  /**\n   * VSYNC skipped, either due to taking too long (see [updateFrameStats]) or due to frame pacing\n   * (see [performPacing])\n   */\n  private var choreographerSkips = 0\n\n  /**\n   * VSYNC skipped due to frame pacing (see [performPacing])\n   */\n  private var choreographerPacingSkips = 0\n\n  /**\n   * Amount of render frames missed (based on map render frame rate) due to map render taking too long\n   */\n  private var missedMapRenderFrames = 0\n\n  internal var fpsChangedListener: OnFpsChangedListener? = null\n\n  @Suppress(\"PrivatePropertyName\")\n  private val TAG = \"Mbgl-FpsManager\" + if (mapName.isNotBlank()) \"\\\\$mapName\" else \"\"\n\n  fun setScreenRefreshRate(screenRefreshRate: Int) {\n    if (this.screenRefreshRate == screenRefreshRate) {\n      return\n    }\n    this.screenRefreshRate = screenRefreshRate\n    screenRefreshPeriodNs = ONE_SECOND_NS / screenRefreshRate\n    updateUserToScreenRefreshRatio()\n    if (LOG_STATISTICS) {\n      logI(\n        TAG,\n        \"Device screen frequency is $screenRefreshRate,\" +\n          \" user defined refresh rate is ${if (userRefreshRate == USER_DEFINED_REFRESH_RATE_NOT_SET) \"not set\" else userRefreshRate}\"\n      )\n    }\n  }\n\n  fun setUserRefreshRate(refreshRate: Int) {\n    if (userRefreshRate != refreshRate) {\n      userRefreshRate = refreshRate\n      logI(TAG, \"User set max FPS to $userRefreshRate\")\n      updateUserToScreenRefreshRatio()\n    }\n  }\n\n  private fun updateUserToScreenRefreshRatio() {\n    if (userRefreshRate == USER_DEFINED_REFRESH_RATE_NOT_SET || screenRefreshRate == SCREEN_METRICS_NOT_DEFINED) {\n      logI(TAG, \"userToScreenRefreshRateRatio is not set (userRefreshRate=$userRefreshRate, screenRefreshRate=$screenRefreshRate)\")\n      return\n    }\n    userToScreenRefreshRateRatio = (userRefreshRate.toDouble() / screenRefreshRate).coerceIn(0.0, 1.0)\n    logI(TAG, \"User defined ratio is $userToScreenRefreshRateRatio\")\n    // After changing the ratio we need to reset counters\n    calculateFpsAndReset()\n  }\n\n  /**\n   * Return true if rendering should happen this frame and false otherwise.\n   *\n   * @param frameTimeNs time value from Choreographer in [System.nanoTime] timebase.\n   * @param recorderStarted whether [RenderThreadStatsRecorder.start] has been called\n   * - in that case we want to [updateFrameStats] even if there is no [OnFpsChangedListener] attached and no frame pacing needed\n   */\n  fun preRender(frameTimeNs: Long, recorderStarted: Boolean = false): Boolean {\n    // no need to perform neither pacing nor FPS calculation when setMaxFps / setOnFpsChangedListener was not called by the user\n    if (userToScreenRefreshRateRatio == null && fpsChangedListener == null && !recorderStarted) {\n      return true\n    }\n    // clear any scheduled task as new render call is about to happen\n    handler.removeCallbacksAndMessages(fpsManagerToken)\n    // update frame stats, count skipped / total VSYNC events\n    updateFrameStats(frameTimeNs)\n    userToScreenRefreshRateRatio?.let {\n      return performPacing(it)\n    }\n    return true\n  }\n\n  /**\n   * Keep a runnable to [onRenderingPaused] to avoid creating a new one every time.\n   */\n  private val onRenderingPausedRunnable = Runnable { onRenderingPaused() }\n  fun postRender() {\n    val frameRenderTimeNs = System.nanoTime() - preRenderTimeNs\n    frameRenderTimeAccumulatedNs += frameRenderTimeNs\n    // normally we update FPS counter and reset counters once a second (since screenRefreshRate is FPS)\n    if (choreographerTicks >= screenRefreshRate) {\n      calculateFpsAndReset()\n    } else {\n      // however to produce correct values we also update FPS after IDLE_TIMEOUT_MS\n      // otherwise when updating the map after it was IDLE first update will report\n      // huge delta between new frame and last frame (as we're using dirty rendering)\n      val delayMillis = VSYNC_COUNT_TILL_IDLE * (screenRefreshPeriodNs / ONE_MILLISECOND_NS)\n      HandlerCompat.postDelayed(\n        handler,\n        onRenderingPausedRunnable,\n        fpsManagerToken,\n        delayMillis\n      )\n    }\n    preRenderTimeNs = -1L\n  }\n\n  fun onSurfaceDestroyed() {\n    onRenderingPaused()\n  }\n\n  fun destroy() {\n    handler.removeCallbacksAndMessages(fpsManagerToken)\n    fpsChangedListener = null\n  }\n\n  /**\n   * This is called on every VSYNC (screenRefreshRate)\n   */\n  private fun updateFrameStats(frameTimeNs: Long) {\n    preRenderTimeNs = System.nanoTime()\n    skippedNow = 0\n    if (previousFrameTimeNs != -1L) {\n      val frameElapsedTimeNs = frameTimeNs - previousFrameTimeNs\n\n      // check if we did miss VSYNC deadline meaning too much work was done in previous doFrame\n      if (frameElapsedTimeNs > screenRefreshPeriodNs + ONE_MILLISECOND_NS) {\n        // Figure out how many VSYNC (`screenRefreshPeriod`) we missed due to the map rendering taking too long\n        skippedNow =\n          (frameElapsedTimeNs / (screenRefreshPeriodNs + ONE_MILLISECOND_NS)).toInt()\n        choreographerSkips += skippedNow\n      }\n\n      // Check if we did miss map render frames\n      // The map render frame time is based on the userToScreenRefreshRateRatio or the screen refresh rate (1.0)\n      val mapRenderFrameRatio = userToScreenRefreshRateRatio ?: 1.0\n      val mapRenderTimeNs = screenRefreshPeriodNs / mapRenderFrameRatio\n      val missedMapRenderFramesNow =\n        (frameElapsedTimeNs / (mapRenderTimeNs + ONE_MILLISECOND_NS)).toInt()\n      if (missedMapRenderFramesNow > 0) {\n        missedMapRenderFrames += missedMapRenderFramesNow\n      }\n    }\n    previousFrameTimeNs = frameTimeNs\n    // we always increase choreographer tick by one + add number of skipped frames for consistent results\n    choreographerTicks += skippedNow + 1\n    if (LOG_STATISTICS && skippedNow > 0) {\n      logW(\n        TAG,\n        \"Skipped $skippedNow VSYNC pulses since last actual render,\" +\n          \" total skipped in measurement period $choreographerSkips / $choreographerTicks\"\n      )\n    }\n  }\n\n  private fun onRenderingPaused() {\n    handler.removeCallbacksAndMessages(fpsManagerToken)\n    calculateFpsAndReset()\n    previousFrameTimeNs = -1\n  }\n\n  /**\n   * Pacing algorithm relies on current choreographer tick\n   * for the measuring interval in (0; screenRefreshRate] range (that also means one second time).\n   *\n   * We actually proceed with drawing only when we change integer part of the index we calculate.\n   *\n   * E.g. if we wish to have 24 FPS on a 60 FPS screen, the [userToScreenRefreshRateRatio] will be 0.4\n   * so that's how we will render them:\n   *\n   * --------------------------------------------------\n   * choreographerTicks | drawnFrameIndex | need render\n   * --------------------------------------------------\n   *        1           |       0.4       |   false\n   *        2           |       0.8       |   false\n   *        3           |       1.2       |   true\n   *        4           |       1.6       |   false\n   *        5           |       2.0       |   true\n   *                        ...\n   *       60           |       24        |   true\n   *                 // reset counters\n   *        1           |       0.4       |   false\n   *        2           |       0.8       |   false\n   *\n   * @return true if we should render this frame, false otherwise\n   */\n  private fun performPacing(userToScreenRefreshRateRatio: Double): Boolean {\n    val drawnFrameIndex = (choreographerTicks * userToScreenRefreshRateRatio).toInt()\n    if (LOG_STATISTICS) {\n      logI(\n        TAG,\n        \"Performing pacing, current index=$drawnFrameIndex, choreographerTicks=$choreographerTicks,\" +\n          \" previous drawn=$previousDrawnFrameIndex, proceed with rendering=${drawnFrameIndex > previousDrawnFrameIndex}\"\n      )\n    }\n    if (drawnFrameIndex > previousDrawnFrameIndex) {\n      previousDrawnFrameIndex = drawnFrameIndex\n      return true\n    }\n    choreographerPacingSkips++\n    // We also increase choreographerSkips when performing pacing. Note this is not really a\n    // missed map render frame since we're doing pacing.\n    choreographerSkips++\n    return false\n  }\n\n  private fun calculateFpsAndReset() {\n    if (choreographerTicks == 0) {\n      return\n    }\n    fpsChangedListener?.let { listener ->\n      val droppedFps = choreographerSkips.toDouble() / choreographerTicks\n      val fps = (1.0 - droppedFps) * screenRefreshRate\n      listener.onFpsChanged(fps)\n      if (choreographerTicks == choreographerSkips) {\n        logI(\n          TAG,\n          \"VSYNC based FPS is $fps, \" +\n            \"skipped $choreographerSkips ($choreographerPacingSkips due to pacing) \" +\n            \"out of $choreographerTicks VSYNC pulses\"\n        )\n      } else {\n        val actualAmountOfFramesRendered = choreographerTicks - choreographerSkips\n        val averageRenderTimeNs =\n          frameRenderTimeAccumulatedNs.toDouble() / actualAmountOfFramesRendered\n        val averageFps =\n          String.format(\"%.2f\", (screenRefreshPeriodNs / averageRenderTimeNs) * screenRefreshRate)\n        logI(\n          TAG,\n          \"Average map core rendering time is \" +\n            \"${averageRenderTimeNs / ONE_MILLISECOND_NS} ms (or $averageFps FPS), \" +\n            \"missed $missedMapRenderFrames map render frames, \" +\n            \"skipped $choreographerSkips ($choreographerPacingSkips due to render pacing) \" +\n            \"out of $choreographerTicks VSYNC pulses\"\n        )\n      }\n    }\n    previousDrawnFrameIndex = 0\n    frameRenderTimeAccumulatedNs = 0L\n    choreographerTicks = 0\n    choreographerSkips = 0\n    choreographerPacingSkips = 0\n    missedMapRenderFrames = 0\n  }\n\n  internal companion object {\n    private const val USER_DEFINED_REFRESH_RATE_NOT_SET = -1\n    private const val SCREEN_METRICS_NOT_DEFINED = -1\n    private const val LOG_STATISTICS = false\n\n    /**\n     * Empiric metric to understand how many VSYNC updates without [preRender] will happen\n     * after last [postRender] so that we assume map is IDLE.\n     */\n    internal const val VSYNC_COUNT_TILL_IDLE = 3\n    private val fpsManagerToken = Any()\n    private val ONE_SECOND_NS = 10.0.pow(9.0).toLong()\n    private val ONE_MILLISECOND_NS = 10.0.pow(6.0).toLong()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/GLMapboxRenderThread.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.annotation.SuppressLint\nimport android.opengl.EGL14\nimport android.opengl.EGLSurface\nimport android.opengl.GLES20\nimport android.view.Surface\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.maps.ContextMode\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.renderer.egl.EGLCore\nimport com.mapbox.maps.renderer.gl.TextureRenderer\nimport java.util.concurrent.locks.Condition\nimport java.util.concurrent.locks.ReentrantLock\n\n/**\n * OpenGL ES -based implementation of MapboxRenderThread.\n */\ninternal class GLMapboxRenderThread : MapboxRenderThread {\n\n  private val translucentSurface: Boolean\n  private val eglCore: EGLCore\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var eglSurface: EGLSurface\n\n  private var widgetRenderCreated = false\n  private val widgetTextureRenderer: TextureRenderer\n\n  private val contextMode: ContextMode\n\n  private var eglContextCreated = false\n\n  constructor(\n    mapboxRenderer: MapboxRenderer,\n    mapboxWidgetRenderer: MapboxWidgetRenderer,\n    translucentSurface: Boolean,\n    antialiasingSampleCount: Int,\n    contextMode: ContextMode,\n    mapName: String,\n  ) : super(mapboxRenderer, mapboxWidgetRenderer, mapName, \"GL\") {\n    this.eglCore = EGLCore(translucentSurface, antialiasingSampleCount, mapName = mapName)\n    this.eglSurface = eglCore.eglNoSurface\n    this.widgetTextureRenderer = TextureRenderer()\n    this.contextMode = contextMode\n    this.translucentSurface = translucentSurface\n  }\n\n  @SuppressLint(\"VisibleForTests\")\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  constructor(\n    mapboxRenderer: MapboxRenderer,\n    mapboxWidgetRenderer: MapboxWidgetRenderer,\n    handlerThread: RenderHandlerThread,\n    eglCore: EGLCore,\n    fpsManager: FpsManager,\n    widgetTextureRenderer: TextureRenderer,\n    surfaceProcessingLock: ReentrantLock,\n    createCondition: Condition,\n    destroyCondition: Condition,\n  ) : super(\n    mapboxRenderer,\n    mapboxWidgetRenderer,\n    handlerThread,\n    fpsManager,\n    surfaceProcessingLock,\n    createCondition,\n    destroyCondition\n  ) {\n    this.translucentSurface = false\n    this.eglCore = eglCore\n    this.widgetTextureRenderer = widgetTextureRenderer\n    this.eglSurface = eglCore.eglNoSurface\n    this.contextMode = ContextMode.UNIQUE\n  }\n  init {\n    logI(TAG, \"GLMapboxRenderThread created\")\n  }\n\n  override fun detachSurfaceFromRenderer(creatingSurface: Boolean) {\n    // on Android SDK <= 23 at least on x86 emulators we need to force set EGL14.EGL_NO_CONTEXT\n    // when resuming activity\n    if (creatingSurface) {\n      eglCore.makeNothingCurrent()\n    }\n  }\n\n  override fun prepareRenderer(): Boolean {\n    logI(\n      TAG,\n      \"prepareRenderer:\" +\n        \" eglContextCreated=$eglContextCreated\"\n    )\n    if (!eglContextCreated) {\n      val eglOk = eglCore.prepareEgl()\n      if (eglOk) {\n        eglContextCreated = true\n      } else {\n        logW(TAG, \"EGL was not configured, please check logs above.\")\n        return false\n      }\n    }\n    return true\n  }\n\n  /**\n   * Create the EGL surface [eglSurface] from the given surface if not yet created.\n   */\n  override fun attachSurfaceToRenderer(surface: Surface): Boolean {\n    if (eglSurface == eglCore.eglNoSurface) {\n      eglSurface = eglCore.createWindowSurface(surface)\n      if (eglSurface == eglCore.eglNoSurface) {\n        // try to recreate it in next iteration.\n        logW(\n          TAG,\n          \"Could not create EGL surface although Android surface was valid,\" +\n            \" retrying in $RETRY_DELAY_MS ms...\"\n        )\n        postPrepareRenderFrame(delayMillis = RETRY_DELAY_MS)\n        return false\n      }\n    }\n    // Once we have a valid eglSurface let's make it current.\n    return checkEglContextCurrent()\n  }\n\n  override fun presentFrame() {\n    swapBuffers()\n  }\n\n  override fun preRenderWithSharedContext() {\n    if (contextMode == ContextMode.SHARED) {\n      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT or GLES20.GL_DEPTH_BUFFER_BIT or GLES20.GL_STENCIL_BUFFER_BIT)\n    }\n  }\n\n  override fun renderWithWidgets() {\n    if (widgetRenderer?.needRender == true) {\n      widgetRenderer.renderToFrameBuffer()\n      eglCore.makeCurrent(eglSurface)\n    }\n    render()\n    resetGlState()\n    if (widgetRenderer?.hasTexture() == true) {\n      widgetTextureRenderer.render(widgetRenderer.getTexture())\n    }\n  }\n\n  override fun releaseResources() {\n    releaseEglSurface()\n    if (eglContextCreated) {\n      eglCore.release()\n    }\n    eglContextCreated = false\n  }\n\n  override fun prepareWidgetRender() {\n    if (eglContextCreated && !widgetRenderCreated && widgetRenderer?.hasWidgets() == true) {\n      widgetRenderer.setSharedContext(eglCore.eglContext)\n      widgetRenderCreated = true\n    }\n  }\n\n  override fun releaseRenderSurface() {\n    releaseEglSurface()\n  }\n\n  override fun clearRendererStateListeners() {\n    eglCore.clearRendererStateListeners()\n  }\n\n  override fun addRendererStateListener(listener: RendererSetupErrorListener) {\n    eglCore.addRendererStateListener(listener)\n  }\n\n  override fun removeRendererStateListener(listener: RendererSetupErrorListener) {\n    eglCore.removeRendererStateListener(listener)\n  }\n\n  override fun resize(width: Int, height: Int) {\n    GLES20.glViewport(0, 0, width, height)\n  }\n\n  override fun renderWithoutWidgets() {\n    render()\n  }\n\n  private fun render() {\n    mapboxRenderer.render()\n  }\n\n  override fun flushCommands() {\n    // explicit flush as we will not be doing any drawing until buffer swap for the next frame -\n    // we send commands to GPU this frame as we should have some free time and perform present frame asap on the next frame\n    // note that this doesn't block the calling thread, it merely signals the driver that we might not be sending any additional commands.\n    // ref https://stackoverflow.com/a/38297697\n    GLES20.glFlush()\n  }\n\n  private fun checkEglContextCurrent(): Boolean {\n    val eglContextAttached = eglCore.makeCurrent(eglSurface)\n    if (!eglContextAttached) {\n      logW(TAG, \"EGL was configured but context could not be made current. Trying again in a moment...\")\n      postPrepareRenderFrame(delayMillis = RETRY_DELAY_MS)\n      return false\n    }\n    return true\n  }\n\n  /**\n   * Resetting OpenGL state to make sure widget textures are rendered on top of the map.\n   */\n  // TODO remove when rendering engine will handle this for us;\n  //  for now we have to clean context a bit so that our texture(s) is (are) drawn on top of the map\n  private fun resetGlState() {\n    // using at least MapDebugOptions.TILE_BORDERS and perhaps in other situations\n    // rending engine may change the blend function; so we explicitly reset it to needed values\n    GLES20.glEnable(GLES20.GL_BLEND)\n    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA)\n    GLES20.glBlendEquation(GLES20.GL_FUNC_ADD)\n\n    // explicitly disable stencil and depth because otherwise widgets may be rendered\n    // behind the map tiles in some scenarios\n    GLES20.glDisable(GLES20.GL_STENCIL_TEST)\n    GLES20.glDisable(GLES20.GL_DEPTH_TEST)\n    GLES20.glUseProgram(0)\n    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0)\n    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0)\n  }\n\n  private fun swapBuffers() {\n    when (val swapStatus = eglCore.swapBuffers(eglSurface)) {\n      EGL14.EGL_SUCCESS -> { }\n      EGL14.EGL_CONTEXT_LOST -> {\n        logW(TAG, \"Context lost. Waiting for re-acquire\")\n        // release all resources but not release Android surface\n        // as it still potentially may be valid - then it could be re-used to recreate EGL;\n        // if it's not valid - system should shortly send us brand new surface and\n        // we will recreate EGL and native renderer anyway\n        releaseAll(tryRecreate = true)\n      }\n      else -> {\n        logW(TAG, \"eglSwapBuffer error: $swapStatus. Waiting for new surface\")\n        releaseEglSurface()\n      }\n    }\n  }\n\n  private fun releaseEglSurface() {\n    trace(\"release-egl-surface\") {\n      widgetTextureRenderer.release()\n      eglCore.releaseSurface(eglSurface)\n      isRendererReady = false\n      eglSurface = eglCore.eglNoSurface\n      widgetRenderCreated = false\n      widgetRenderer?.release()\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/MapboxRenderThread.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.os.Handler\nimport android.os.Looper\nimport android.os.SystemClock\nimport android.os.Trace\nimport android.view.Choreographer\nimport android.view.Surface\nimport androidx.annotation.AnyThread\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.UiThread\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.common.LogThrottler\nimport com.mapbox.common.MapboxTracing\nimport com.mapbox.common.MapboxTracing.MAPBOX_TRACE_ID\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.renderer.widget.Widget\nimport com.mapbox.maps.viewannotation.ViewAnnotationManager\nimport com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode\nimport java.util.concurrent.ConcurrentLinkedQueue\nimport java.util.concurrent.locks.Condition\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.concurrent.withLock\nimport kotlin.properties.Delegates\n\n/**\n * Manages the map rendering lifecycle on a dedicated thread.\n *\n * This abstract class is the core of the rendering engine, acting as a bridge between the Android\n * view system (specifically the [Surface]) and the underlying native Mapbox renderer. It runs on a\n * dedicated [RenderHandlerThread] to avoid blocking the main UI thread with potentially\n * long-running rendering tasks.\n *\n * ### Key Responsibilities:\n *\n * 1.  **Thread and Lifecycle Management:**\n *     - Initializes and manages a dedicated render thread ([RenderHandlerThread]).\n *     - Synchronizes with the main UI thread during critical lifecycle events like surface creation,\n *       resizing, and destruction using locks ([ReentrantLock]) and conditions ([Condition]) to\n *       prevent race conditions and ensure a consistent state.\n *     - Handles pausing and resuming of the renderer, stopping frame production when the map is not\n *       visible and resuming it when it comes back to the foreground.\n *\n * 2.  **Surface and Renderer Orchestration:**\n *     - Receives a [Surface] from the view system (e.g., `TextureView` or `SurfaceView`).\n *     - Prepares the graphics backend (e.g., OpenGL ES context) via the abstract [prepareRenderer]\n *       method.\n *     - Creates and manages the native [MapboxRenderer] instance, which communicates with the\n *       Mapbox Core engine.\n *     - Attaches the [Surface] to the renderer and handles size changes, notifying the graphics\n *       backend, the Mapbox Core engine, and any associated widget renderers.\n *\n * 3.  **The Rendering Loop:**\n *     - Implements [Choreographer.FrameCallback] to hook into the display's VSYNC signal.\n *     - The [doFrame] method is the heart of the render loop. On each VSYNC pulse, it orchestrates\n *       the sequence of operations required to render a single frame.\n *     - It calls [renderWithoutWidgets] or [renderWithWidgets] to execute native drawing\n *       commands ([MapboxRenderer].\n *     - After drawing, it calls [presentFrame] to swap the graphics buffers and display the newly\n *       rendered image on the screen.\n *\n * 4.  **Event and Task Queuing:**\n *     - Manages two concurrent queues for tasks: [renderEventQueue] and [nonRenderEventQueue].\n *     - [renderEventQueue]: Holds tasks that must be executed synchronously within the rendering\n *       cycle, such as OpenGL commands or snapshot requests. These are processed after the map is\n *       drawn but before the frame is presented.\n *     - [nonRenderEventQueue]: Holds tasks that can be executed asynchronously on the render thread\n *       but outside the immediate drawing sequence.\n *     - Provides the [queueRenderEvent] method to safely post runnables from any thread to be\n *       executed on the render thread.\n *\n * 5.  **Performance and Frame Pacing:**\n *     - Manages frame pacing through an [FpsManager], allowing for throttling the frame rate at a\n *       specific target FPS.\n *     - Can skip rendering frames if the desired FPS is lower than the display's refresh rate.\n *\n * Subclasses, such as [GLMapboxRenderThread], implement the abstract methods to provide the\n * specific graphics backend setup (e.g., EGL context management) required for rendering.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal abstract class MapboxRenderThread : Choreographer.FrameCallback {\n\n  internal val renderHandlerThread: RenderHandlerThread\n  protected val mapboxRenderer: MapboxRenderer\n  protected val widgetRenderer: MapboxWidgetRenderer?\n\n  /**\n   * [ReentrantLock] to guarantee consistent behaviour of surface create / destroy events.\n   */\n  private val surfaceProcessingLock: ReentrantLock\n\n  /**\n   * Condition used to lock the Android main thread until underlying renderer is set up.\n   */\n  private val createCondition: Condition\n\n  /**\n   * Condition used to lock the Android main thread until either the renderer is destroyed\n   * or we understand renderer was already destroyed before (checking [isRendererReady] flag from render thread).\n   */\n  private val destroyCondition: Condition\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal val renderEventQueue = ConcurrentLinkedQueue<RenderEvent>()\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal val nonRenderEventQueue = ConcurrentLinkedQueue<RenderEvent>()\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var surface: Surface? = null\n\n  /**\n   * Throttler for high-frequency render thread logs to prevent logcat spam.\n   */\n  private val logThrottler = LogThrottler(LOG_THROTTLE_INTERVAL_MS)\n\n  @RenderThread\n  private var width: Int = 0\n  @RenderThread\n  private var height: Int = 0\n\n  /**\n   * Flag that signals that we're waiting for the next [doFrame] (VSYNC) to run.\n   */\n  @Volatile\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var awaitingNextVsync = false\n\n  @Volatile\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var paused = false\n\n  @OptIn(MapboxExperimental::class)\n  internal var renderThreadStatsRecorder: RenderThreadStatsRecorder? = null\n\n  /**\n   * Handler for posting tasks to the main thread.\n   */\n  private val mainHandler by lazy {\n    Handler(Looper.getMainLooper())\n  }\n\n  private val renderThreadPreparedLock = ReentrantLock()\n\n  /**\n   * We track when native Map renderer is prepared ([MapboxRenderer.createRenderer]).\n   */\n  @get:RenderThread\n  @set:AnyThread\n  protected var nativeMapRenderCreated = false\n    // no need for synchronized getter, getting value for this var happens on render thread only\n    set(value) = renderThreadPreparedLock.withLock {\n      field = value\n    }\n\n  /**\n   * We track when renderer (e.g. OpenGL ES context) is created and associated with current\n   * Android surface.\n   */\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  @get:RenderThread\n  @set:AnyThread\n  internal var isRendererReady = false\n    set(value) = renderThreadPreparedLock.withLock {\n      field = value\n    }\n\n  /**\n   * Render thread should be treated as valid (prepared to render a map) when both flags are true.\n   * Getter is thread-safe as this flag could be accessed from any thread.\n   */\n  protected val renderThreadPrepared: Boolean\n    get() = renderThreadPreparedLock.withLock {\n      isRendererReady && nativeMapRenderCreated\n    }\n\n  /**\n   * Flag that signals that renderer is not supported.\n   */\n  private var rendererNotSupported = false\n\n  // could not be volatile as setter method is synchronized\n  internal var fpsChangedListener by Delegates.observable<OnFpsChangedListener?>(null) { _, old, new ->\n    if (old != new) {\n      /**\n       * Consider setting [OnFpsChangedListener] as non-render event to make sure that\n       * it does not get dropped if user has set it right after MapView creation before render thread\n       * is actually fully prepared for rendering.\n       */\n      postNonRenderEvent(\n        RenderEvent(\n          { fpsManager.fpsChangedListener = new },\n          false,\n        )\n      )\n    }\n  }\n\n  private val fpsManager: FpsManager\n\n  /**\n   * Modified from render thread only, needed to understand when exactly to present frame\n   * to achieve better synchronization with view annotation updates.\n   */\n  @RenderThread\n  internal var needViewAnnotationSync = false\n  @Volatile\n  internal var viewAnnotationMode = ViewAnnotationManager.DEFAULT_UPDATE_MODE\n\n  @Suppress(\"PropertyName\")\n  protected val TAG: String\n\n  constructor(\n    mapboxRenderer: MapboxRenderer,\n    widgetRenderer: MapboxWidgetRenderer?,\n    mapName: String,\n    rendererName: String\n  ) {\n    this.mapboxRenderer = mapboxRenderer\n    this.widgetRenderer = widgetRenderer\n    this.TAG = \"${rendererName}RenderThread\" + if (mapName.isNotBlank()) \"\\\\$mapName\" else \"\"\n    renderHandlerThread = RenderHandlerThread(mapName)\n    val handler = renderHandlerThread.start()\n    fpsManager = FpsManager(handler, mapName)\n    surfaceProcessingLock = ReentrantLock()\n    createCondition = surfaceProcessingLock.newCondition()\n    destroyCondition = surfaceProcessingLock.newCondition()\n  }\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  constructor(\n    mapboxRenderer: MapboxRenderer,\n    mapboxWidgetRenderer: MapboxWidgetRenderer?,\n    handlerThread: RenderHandlerThread,\n    fpsManager: FpsManager,\n    surfaceProcessingLock: ReentrantLock,\n    createCondition: Condition,\n    destroyCondition: Condition,\n  ) {\n    this.TAG = \"\"\n    this.widgetRenderer = mapboxWidgetRenderer\n    this.mapboxRenderer = mapboxRenderer\n    this.renderHandlerThread = handlerThread\n    this.fpsManager = fpsManager\n    this.surfaceProcessingLock = surfaceProcessingLock\n    this.createCondition = createCondition\n    this.destroyCondition = destroyCondition\n  }\n\n  protected abstract fun prepareRenderer(): Boolean\n  protected abstract fun prepareWidgetRender()\n  protected abstract fun attachSurfaceToRenderer(surface: Surface): Boolean\n  protected abstract fun detachSurfaceFromRenderer(creatingSurface: Boolean)\n  protected abstract fun presentFrame()\n  protected abstract fun preRenderWithSharedContext()\n  protected abstract fun renderWithWidgets()\n  protected abstract fun renderWithoutWidgets()\n  protected abstract fun releaseResources()\n  protected abstract fun releaseRenderSurface()\n  protected abstract fun clearRendererStateListeners()\n  protected abstract fun flushCommands()\n  abstract fun addRendererStateListener(listener: RendererSetupErrorListener)\n  abstract fun removeRendererStateListener(listener: RendererSetupErrorListener)\n  abstract fun resize(width: Int, height: Int)\n\n  protected inline fun trace(sectionName: String, section: (() -> Unit)) {\n    if (MapboxTracing.platformTracingEnabled) {\n      Trace.beginSection(\"$MAPBOX_TRACE_ID: $sectionName\")\n      try {\n        section.invoke()\n      } finally {\n        Trace.endSection()\n      }\n    } else {\n      section.invoke()\n    }\n  }\n\n  /**\n   * Keep a runnable to [prepareRenderFrame] to avoid creating a new one on every frame.\n   */\n  private val prepareRenderFrameRunnable: Runnable = Runnable {\n      prepareRenderFrame(width = null, height = null, creatingSurface = false)\n  }\n  protected fun postPrepareRenderFrame(delayMillis: Long = 0L) {\n    renderHandlerThread.postDelayed(\n      prepareRenderFrameRunnable,\n      delayMillis\n    )\n  }\n\n  /**\n   * Setting up the render thread means that:\n   * - the Mapbox Map renderer is created ([MapboxRenderer.createRenderer])\n   * - The graphics renderer backend is prepared ([prepareRenderer]) and ready to render ([isRendererReady])\n   */\n  private fun setUpRenderThread(creatingSurface: Boolean): Boolean {\n    surfaceProcessingLock.withLock {\n      try {\n        logI(\n          TAG,\n          \"Setting up render thread, flags:\" +\n            \" creatingSurface=$creatingSurface,\" +\n            \" isRendererReady=$isRendererReady,\" +\n            \" nativeMapRenderCreated=$nativeMapRenderCreated,\" +\n            \" paused=$paused\"\n        )\n        val rendererPrepared = prepareRenderer()\n        logI(TAG, \"Renderer prepared: $rendererPrepared\")\n        rendererNotSupported = !rendererPrepared\n        val androidSurfaceReady = checkAndroidSurface()\n        if (rendererPrepared && androidSurfaceReady) {\n          detachSurfaceFromRenderer(creatingSurface)\n          // it's safe to use !! here as we checked surface above\n          isRendererReady = attachSurfaceToRenderer(surface!!)\n          if (isRendererReady) {\n            if (!nativeMapRenderCreated) {\n              // we set `nativeMapRenderCreated` as `true` before creating native render as core could potentially\n              // schedule task in the same callchain and we need to make sure that `renderThreadPrepared` is already `true`\n              // so that we do not drop this task\n              nativeMapRenderCreated = true\n              mapboxRenderer.createRenderer()\n              logI(TAG, \"Native renderer created.\")\n            }\n            return true\n          }\n        }\n        return false\n      } finally {\n        createCondition.signal()\n      }\n    }\n  }\n\n  private fun checkAndroidSurface(): Boolean {\n    return if (surface?.isValid == true) {\n      true\n    } else {\n      logW(TAG, \"Android surface.isValid=${surface?.isValid}, waiting ${RETRY_DELAY_MS}ms for a new one...\")\n      // give system a bit of time and try rendering again hoping surface will be valid now\n      postPrepareRenderFrame(delayMillis = RETRY_DELAY_MS)\n      false\n    }\n  }\n\n  @RenderThread\n  private fun notifyRenderersSizeChanged(width: Int, height: Int) {\n    mapboxRenderer.onSurfaceChanged(width = width, height = height)\n    widgetRenderer?.onSurfaceChanged(width = width, height = height)\n  }\n\n  private val presentFrameFunc = Choreographer.FrameCallback { presentFrame() }\n\n  @OptIn(MapboxExperimental::class)\n  private fun draw(frameTimeNanos: Long) {\n    if (!fpsManager.preRender(frameTimeNanos, renderThreadStatsRecorder?.isRecording == true)) {\n      // when we have FPS limited and desire to skip core render - we must schedule new draw call\n      // otherwise map may remain in not fully loaded state\n      postPrepareRenderFrame()\n      return\n    }\n    preRenderWithSharedContext()\n    if (widgetRenderer?.hasWidgets() == true) {\n      renderWithWidgets()\n    } else {\n      renderWithoutWidgets()\n    }\n\n    // assuming render event queue holds user's runnables with renderer commands (e.g. OpenGL\n    // commands) it makes sense to execute them after drawing a map but before swapping buffers\n    // **note** this queue also holds snapshot tasks\n    drainQueue(renderEventQueue)\n    fpsManager.postRender()\n    if (needViewAnnotationSync && viewAnnotationMode == ViewAnnotationUpdateMode.MAP_SYNCHRONIZED) {\n      // when we're syncing view annotations with the map -\n      // we present frame the next frame to achieve better synchronization with view annotations update\n      // that always happens 1 frame later\n      Choreographer.getInstance().postFrameCallback(presentFrameFunc)\n      flushCommands()\n    } else {\n      // present frame immediately if no view annotations are visible or mode is not MAP_SYNCHRONIZED\n     presentFrame()\n    }\n    // always reset the flag\n    needViewAnnotationSync = false\n  }\n\n  protected fun releaseAll(tryRecreate: Boolean = false) {\n    trace(\"release-all\") {\n      mapboxRenderer.destroyRenderer()\n      logI(TAG, \"Native renderer destroyed.\")\n      renderEventQueue.clear()\n      nonRenderEventQueue.clear()\n      nativeMapRenderCreated = false\n      releaseResources()\n      if (tryRecreate) {\n        if (setUpRenderThread(creatingSurface = true)) {\n          notifyRenderersSizeChanged(width, height)\n        }\n      } else {\n        surface?.release()\n      }\n    }\n  }\n\n  /**\n   * Responsible to prepare for rendering and schedule a new frame render (synchronized with the\n   * display's refresh rate using [Choreographer]).\n   * There are 3 main reasons to request a new frame:\n   * 1. A new surface is available ([creatingSurface] flag is true and [width] and [height] are given).\n   * 2. The surface was resized (new [width] and [height] are given).\n   * 3. Normal render pass ([creatingSurface] flag is false and no sizes are given).\n   */\n  @RenderThread\n  private fun prepareRenderFrame(\n    width: Int?,\n    height: Int?,\n    creatingSurface: Boolean\n  ) {\n    // no need to do anything if we're already waiting for next VSYNC (`doFrame`);\n    // however if Android has sent us new surface - we must proceed up to `setUpRenderThread` or\n    // otherwise main thread will end up having deadlock\n    // We also should go through if we've new sizes to set\n    if (awaitingNextVsync && !creatingSurface && width == null && height == null) {\n      return\n    }\n    // We need to check ASAP if we have to stop rendering in order not to block thread that is calling `onSurfaceTextureDestroyed`:\n    // - Check MapView could be actually rendered on this device (renderer configuration is not supported).\n    // - Check if activity / fragment is paused.\n    if (rendererNotSupported || paused) {\n      // at least on Android 8 devices we create surface before Activity#onStart (i.e. still paused)\n      // so we need to proceed to EGL creation in any case to avoid deadlock\n      if (!creatingSurface) {\n        logI(\n          TAG,\n          \"Skip render frame - NOT creating surface although \" +\n            \"rendererNotSupported ($rendererNotSupported) || paused ($paused)\"\n        )\n        return\n      }\n    }\n    // check for creatingSurface flag to make sure we don't hit deadlock\n    if (creatingSurface || !renderThreadPrepared) {\n      trace(\"set-up-render-thread\") {\n        val renderThreadPreparedOk = setUpRenderThread(creatingSurface)\n        if (!renderThreadPreparedOk) {\n          logI(\n            TAG,\n            \"Skip render frame - render thread NOT prepared although \" +\n              \"creatingSurface ($creatingSurface) || !renderThreadPrepared (${!renderThreadPrepared})\"\n          )\n          return@trace\n        }\n      }\n    }\n    prepareWidgetRender()\n    if (width != null && height != null && renderThreadPrepared) {\n      notifyRenderersSizeChanged(width, height)\n    }\n    // Finally schedule next doFrame call\n    Choreographer.getInstance().postFrameCallback(this)\n    awaitingNextVsync = true\n  }\n\n  @UiThread\n  fun onSurfaceSizeChanged(width: Int, height: Int) {\n    renderHandlerThread.post {\n      if (this.width != width || this.height != height) {\n        this@MapboxRenderThread.width = width\n        this@MapboxRenderThread.height = height\n        // Schedule a new frame to draw map with the new size\n        prepareRenderFrame(width = width, height = height, creatingSurface = false)\n      }\n    }\n  }\n\n  @UiThread\n  fun onSurfaceDestroyed() {\n    trace(\"surface-destroyed\") {\n      logI(TAG, \"onSurfaceDestroyed\")\n      surfaceProcessingLock.withLock {\n        if (renderHandlerThread.isRunning) {\n          renderHandlerThread.post {\n            awaitingNextVsync = false\n            Choreographer.getInstance().removeFrameCallback(this@MapboxRenderThread)\n            surfaceProcessingLock.withLock {\n              // TODO https://github.com/mapbox/mapbox-maps-android/issues/607\n              if (nativeMapRenderCreated && mapboxRenderer is MapboxTextureViewRenderer) {\n                releaseAll()\n                renderHandlerThread.clearRenderEventQueue()\n              } else {\n                releaseRenderSurface()\n              }\n              fpsManager.onSurfaceDestroyed()\n              destroyCondition.signal()\n            }\n          }\n          logI(TAG, \"onSurfaceDestroyed: waiting until EGL will be cleaned up...\")\n          destroyCondition.await()\n          logI(TAG, \"onSurfaceDestroyed: EGL resources were cleaned up.\")\n        } else {\n          logI(TAG, \"onSurfaceDestroyed: render thread is not running.\")\n        }\n      }\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  fun addWidget(widget: Widget) {\n    widgetRenderer?.addWidget(widget)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  fun removeWidget(widget: Widget): Boolean = widgetRenderer?.removeWidget(widget) == true\n\n  @RenderThread\n  internal fun processAndroidSurface(surface: Surface, width: Int, height: Int) {\n    if (this.surface != surface) {\n      if (this.surface != null) {\n        logI(\n          TAG,\n          \"Processing new android surface while current is not null, \" +\n            \"releasing current EGL and recreating native renderer.\"\n        )\n        releaseAll()\n      }\n      this.surface = surface\n    }\n    this.width = width\n    this.height = height\n    // Make sure we initialize renderer and schedule next frame to draw map.\n    prepareRenderFrame(width, height, creatingSurface = true)\n  }\n\n  @UiThread\n  fun setScreenRefreshRate(refreshRate: Int) {\n    renderHandlerThread.post {\n      fpsManager.setScreenRefreshRate(refreshRate)\n    }\n  }\n\n  @UiThread\n  fun onSurfaceCreated(surface: Surface, width: Int, height: Int) {\n    trace(\"surface-created\") {\n      logI(TAG, \"onSurfaceCreated\")\n      surfaceProcessingLock.withLock {\n        if (renderHandlerThread.isRunning) {\n          renderHandlerThread.post {\n            this.width = width\n            this.height = height\n            processAndroidSurface(surface, width, height)\n          }\n          logI(TAG, \"onSurfaceCreated: waiting Android surface to be processed...\")\n          createCondition.await()\n          logI(TAG, \"onSurfaceCreated: Android surface was processed.\")\n        } else {\n          logI(TAG, \"onSurfaceCreated: render thread is not running.\")\n        }\n      }\n    }\n  }\n\n  @AnyThread\n  fun setUserRefreshRate(fps: Int) {\n    renderHandlerThread.post {\n      fpsManager.setUserRefreshRate(fps)\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @RenderThread\n  final override fun doFrame(frameTimeNanos: Long) {\n    trace(\"do-frame\") {\n      val startTime = if (renderThreadStatsRecorder?.isRecording == true) {\n        SystemClock.elapsedRealtimeNanos()\n      } else {\n        0L\n      }\n      // it makes sense to draw not only when EGL config is prepared but when native renderer is created\n      if (renderThreadPrepared && !paused) {\n        draw(frameTimeNanos)\n      }\n      awaitingNextVsync = false\n      // It's critical to drain queue after setting `awaitingNextVsync` to false as some tasks may recursively schedule other tasks when executed.\n      // With `awaitingNextVsync = false` we will always schedule recursive tasks for later execution\n      // via `renderHandlerThread.postDelayed` instead of updating queue concurrently that is being drained (which may lead to deadlock in core).\n      drainQueue(nonRenderEventQueue)\n      val endTime = if (renderThreadStatsRecorder?.isRecording == true) {\n        SystemClock.elapsedRealtimeNanos()\n      } else {\n        0L\n      }\n      if (startTime != 0L && endTime != 0L) {\n        renderThreadStatsRecorder?.addFrameStats(\n          (endTime - startTime) / 1e6,\n          fpsManager.skippedNow\n        )\n      }\n    }\n  }\n\n  @AnyThread\n  fun queueRenderEvent(renderEvent: RenderEvent) {\n    if (renderEvent.needRender) {\n      renderEvent.runnable?.let {\n        renderEventQueue.add(renderEvent)\n      }\n      renderPreparedGuardedRun {\n        postPrepareRenderFrame()\n      }\n    } else {\n      postNonRenderEvent(renderEvent)\n    }\n  }\n\n  private inline fun renderPreparedGuardedRun(crossinline block: () -> Unit) {\n    if (renderThreadPrepared) {\n      block.invoke()\n      return\n    }\n    // it may happen that Android surface is valid but renderThreadPrepared=false\n    // due to eglContextMadeCurrent=false when we do `releaseEglSurface()` after some egl error;\n    // in this case we try to re-setup render thread; if Android surface is invalid - we can't do anything\n    // until Android system sends us the new one\n    if (surface?.isValid == true) {\n      logI(TAG, \"renderThreadPrepared=false but Android surface is valid, trying to setup render thread again...\")\n      renderHandlerThread.post {\n        if (setUpRenderThread(creatingSurface = true)) {\n          block.invoke()\n          logI(TAG, \"Setting up render thread was OK, map should render again!\")\n        } else {\n          logI(TAG, \"Setting up render thread failed, check logs above.\")\n        }\n      }\n    } else if (!paused) {\n      logI(\n        TAG,\n        \"renderThreadPrepared=false and Android surface is not valid (isValid=${surface?.isValid}). Waiting for new one.\",\n        logThrottler\n      )\n    }\n  }\n\n  private fun postNonRenderEvent(renderEvent: RenderEvent, delayMillis: Long = 0L) {\n    // if we already waiting listening for next VSYNC then add runnable to queue to execute\n    // after actual drawing otherwise execute asap on render thread\n    if (awaitingNextVsync) {\n      nonRenderEventQueue.add(renderEvent)\n    } else {\n      renderHandlerThread.postDelayed(\n        {\n          when {\n            renderThreadPrepared -> {\n              renderEvent.runnable?.run()\n            }\n\n            paused -> {\n              nonRenderEventQueue.add(renderEvent)\n            }\n\n            else -> {\n              logW(TAG, \"Non-render event could not be run, retrying in $RETRY_DELAY_MS ms...\")\n              postNonRenderEvent(renderEvent, delayMillis = RETRY_DELAY_MS)\n            }\n          }\n        },\n        delayMillis,\n      )\n    }\n  }\n\n  /**\n   * Schedules a resetThreadServiceType on the main thread after a specified delay.\n   * This method is called to ensure CPU affinity is properly set\n   * when coming back from background, addressing timing issues where CPU affinity\n   * might not be immediately available.\n   */\n  @OptIn(MapboxExperimental::class)\n  fun scheduleThreadServiceTypeReset() {\n    logI(TAG, \"Scheduling thread service type reset with delay\")\n    mainHandler.postDelayed({\n      // log current thread name to help debug\n      logI(TAG, \"Executing thread service type reset from ${Thread.currentThread().name} thread\")\n      mapboxRenderer.resetThreadServiceType()\n    }, RESET_THREAD_SERVICE_TYPE_DELAY_MS)\n  }\n\n  @UiThread\n  fun pause() {\n    paused = true\n    logI(TAG, \"Renderer paused\")\n  }\n\n  @UiThread\n  fun resume() {\n    paused = false\n    logI(\n      TAG,\n      \"Renderer resumed, renderThreadPrepared=$renderThreadPrepared, surface.isValid=${surface?.isValid}\"\n    )\n    // schedule render if we resume not after first create (e.g. bring map back to front)\n    renderPreparedGuardedRun(::postPrepareRenderFrame)\n  }\n\n  @UiThread\n  internal fun destroy() {\n    trace(\"destroy\") {\n      logI(TAG, \"destroy\")\n      surfaceProcessingLock.withLock {\n        if (renderHandlerThread.isRunning) {\n          renderHandlerThread.post {\n            var synchronousCleanUpNeeded = true\n            surfaceProcessingLock.lock()\n            try {\n              // For OpenGL renderer:\n              // It is safe to release main thread immediately (destroyCondition.signal()) if\n              // renderer is not ready (i.e. EGLSurface was destroyed and EGLContext was cleared\n              // beforehand in onSurfaceDestroyed)\n              if (!isRendererReady) {\n                destroyCondition.signal()\n                surfaceProcessingLock.unlock()\n                synchronousCleanUpNeeded = false\n              }\n              if (nativeMapRenderCreated) {\n                releaseAll()\n              }\n              renderHandlerThread.clearRenderEventQueue()\n              fpsManager.destroy()\n              clearRendererStateListeners()\n              mapboxRenderer.map = null\n              renderHandlerThread.stop()\n            } finally {\n              if (synchronousCleanUpNeeded) {\n                destroyCondition.signal()\n                surfaceProcessingLock.unlock()\n              } else {\n                // if the system somehow sent us surfaceCreated / surfaceDestroyed from main thread\n                // during async destroy - signal to release the lock on main thread to avoid ANR\n                surfaceProcessingLock.withLock {\n                  createCondition.signal()\n                }\n                surfaceProcessingLock.withLock {\n                  destroyCondition.signal()\n                }\n              }\n            }\n          }\n          logI(TAG, \"destroy: waiting until all resources will be cleaned up...\")\n          destroyCondition.await()\n          logI(TAG, \"destroy: all resources were cleaned up.\")\n        } else {\n          logI(TAG, \"destroy: render thread is not running.\")\n        }\n      }\n    }\n  }\n\n  private fun drainQueue(originalQueue: ConcurrentLinkedQueue<RenderEvent>) {\n    var event = originalQueue.poll()\n    while (event != null) {\n      event.runnable?.run()\n      event = originalQueue.poll()\n    }\n  }\n\n  internal companion object {\n    /**\n     * If we hit some issue caused by invalid state (most likely caused by GPU driver) we start\n     * rescheduling configuration with that delay in order not to overflood handler thread message queue.\n     */\n    internal const val RETRY_DELAY_MS = 50L\n    /**\n     * Interval for throttling high-frequency render thread logs (in milliseconds).\n     */\n    private const val LOG_THROTTLE_INTERVAL_MS = 300L\n    /**\n     * Delay before calling resetThreadServiceType() on resume to ensure CPU affinity is properly set.\n     * This delay helps address timing issues where CPU affinity might not be set immediately\n     * when coming back from background.\n     */\n    internal const val RESET_THREAD_SERVICE_TYPE_DELAY_MS = 300L\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/MapboxRenderer.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.graphics.Bitmap\nimport android.graphics.Matrix\nimport androidx.annotation.AnyThread\nimport androidx.annotation.MainThread\nimport androidx.annotation.UiThread\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.DelegatingMapClient\nimport com.mapbox.maps.Map\nimport com.mapbox.maps.MapView.OnSnapshotReady\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.NativeMapImpl\nimport com.mapbox.maps.RenderBackendType\nimport com.mapbox.maps.RenderFrameFinishedCallback\nimport com.mapbox.maps.RenderModeType\nimport com.mapbox.maps.Size\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.renderer.gl.PixelReader\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.atomic.AtomicBoolean\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.concurrent.withLock\n\ninternal abstract class MapboxRenderer(\n  mapName: String,\n) : DelegatingMapClient {\n\n  internal lateinit var renderThread: MapboxRenderThread\n  internal abstract val widgetRenderer: MapboxWidgetRenderer\n\n  internal var map: NativeMapImpl? = null\n\n  private var width: Int = 0\n  private var height: Int = 0\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var pixelReader: PixelReader? = null\n\n  // in order to prevent snapshots being black we capture first moment\n  // when map is rendered fully\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var readyForSnapshot = AtomicBoolean(false)\n  private var renderFrameCancelable: Cancelable? = null\n  private val renderFrameFinishedCallback = RenderFrameFinishedCallback { eventData ->\n    if (eventData.renderMode == RenderModeType.FULL) {\n      readyForSnapshot.set(true)\n      renderFrameCancelable?.cancel()\n    }\n  }\n  @Suppress(\"PrivatePropertyName\")\n  private val TAG = \"Mbgl-Renderer\" + if (mapName.isNotBlank()) \"\\\\$mapName\" else \"\"\n\n  internal var snapshotLegacyModeEnabled = false\n    @MainThread\n    get\n    @MainThread\n    set\n\n  @UiThread\n  fun onDestroy() {\n    widgetRenderer.cleanUpAllWidgets()\n    renderThread.destroy()\n    renderThread.fpsChangedListener = null\n  }\n\n  @AnyThread\n  @Synchronized\n  fun setMap(map: NativeMapImpl) {\n    this.map = map\n  }\n\n  @AnyThread\n  override fun scheduleRepaint() {\n    renderThread.queueRenderEvent(repaintRenderEvent)\n  }\n\n  @AnyThread\n  fun queueRenderEvent(runnable: Runnable) {\n    renderThread.queueRenderEvent(\n      RenderEvent(\n        runnable = runnable,\n        needRender = true,\n      )\n    )\n  }\n\n  @AnyThread\n  fun queueNonRenderEvent(runnable: Runnable) {\n    renderThread.queueRenderEvent(\n      RenderEvent(\n        runnable = runnable,\n        needRender = false,\n      )\n    )\n  }\n\n  @RenderThread\n  fun createRenderer() {\n    map?.createRenderer()\n  }\n\n  @RenderThread\n  fun onSurfaceChanged(width: Int, height: Int) {\n    if (width != this.width || height != this.height) {\n      this.width = width\n      this.height = height\n      renderThread.resize(width, height)\n      map?.setSize(Size(width.toFloat(), height.toFloat()))\n    }\n  }\n\n  @RenderThread\n  fun destroyRenderer() {\n    map?.destroyRenderer()\n    // additionally it's correct moment to release pixel reader while we still have EGL context\n    pixelReader?.release()\n    pixelReader = null\n  }\n\n  @RenderThread\n  fun render() {\n    map?.render()\n  }\n\n  /**\n   * Resets the renderer thread service type to Interactive.\n   * Must be called on the render thread.\n   */\n  @MapboxExperimental\n  @UiThread\n  fun resetThreadServiceType() {\n    map?.resetThreadServiceType()\n  }\n\n  @UiThread\n  fun onStop() {\n    renderThread.pause()\n    renderFrameCancelable?.cancel()\n    readyForSnapshot.set(false)\n  }\n\n  @UiThread\n  fun onStart() {\n    renderThread.resume()\n    renderFrameCancelable = map?.subscribe(renderFrameFinishedCallback)\n  }\n\n  @UiThread\n  fun onResume() {\n    renderThread.scheduleThreadServiceTypeReset()\n  }\n\n  @RenderThread\n  fun snapshot(): Bitmap? {\n    if (!readyForSnapshot.get()) {\n      logW(TAG, \"Could not take map snapshot because map is not ready yet.\")\n      return null\n    }\n    val lock = ReentrantLock()\n    val waitCondition = lock.newCondition()\n    val legacyMode = snapshotLegacyModeEnabled\n    lock.withLock {\n      var snapshot: Bitmap? = null\n      renderThread.queueRenderEvent(\n        RenderEvent(\n          runnable = {\n            lock.withLock {\n              snapshot = performSnapshot(legacyMode)\n              waitCondition.signal()\n            }\n          },\n          needRender = true,\n        )\n      )\n      waitCondition.await(1, TimeUnit.SECONDS)\n      return snapshot\n    }\n  }\n\n  @AnyThread\n  fun snapshot(listener: OnSnapshotReady) {\n    if (!readyForSnapshot.get()) {\n      logW(TAG, \"Could not take map snapshot because map is not ready yet.\")\n      listener.onSnapshotReady(null)\n    } else {\n      val legacyMode = snapshotLegacyModeEnabled\n      renderThread.queueRenderEvent(\n        RenderEvent(\n          runnable = { listener.onSnapshotReady(performSnapshot(legacyMode)) },\n          needRender = true,\n        )\n      )\n    }\n  }\n\n  @AnyThread\n  fun setMaximumFps(fps: Int) {\n    if (fps <= 0) {\n      logW(TAG, \"Maximum FPS could not be <= 0, ignoring $fps value.\")\n      return\n    }\n    renderThread.setUserRefreshRate(fps)\n  }\n\n  @AnyThread\n  @Synchronized\n  fun setOnFpsChangedListener(listener: OnFpsChangedListener) {\n    renderThread.fpsChangedListener = listener\n  }\n\n  @RenderThread\n  private fun performSnapshot(legacyMode: Boolean): Bitmap? {\n    if (width == 0 && height == 0) {\n      logW(TAG, \"Could not take map snapshot because map is not ready yet.\")\n      return null\n    }\n\n    if (pixelReader == null || pixelReader?.width != width || pixelReader?.height != height || pixelReader?.legacyMode != legacyMode) {\n      pixelReader?.release()\n      pixelReader = PixelReader(width, height, legacyMode)\n    }\n    val pixelReader = pixelReader!!\n\n    try {\n      val buffer = pixelReader.readPixels()\n      buffer.rewind()\n      val flipped = Bitmap.createBitmap(\n        width,\n        height,\n        Bitmap.Config.ARGB_8888\n      ).apply {\n        copyPixelsFromBuffer(buffer)\n      }\n      val cx = width / 2.0f\n      val cy = height / 2.0f\n      try {\n        return Bitmap.createBitmap(\n          flipped,\n          0, 0,\n          width, height,\n          Matrix().apply { postScale(1f, -1f, cx, cy) },\n          true\n        )\n      } finally {\n        flipped.recycle()\n      }\n    } catch (e: Throwable) {\n      logW(TAG, \"Exception ${e.localizedMessage} happened when reading pixels\")\n      if (!pixelReader.legacyMode) {\n        logW(TAG, \"Re-creating PixelReader with no PBO support and making snapshot again\")\n        pixelReader.release()\n        this.pixelReader = PixelReader(\n          width = pixelReader.width,\n          height = pixelReader.height,\n          legacyMode = true\n        )\n        return performSnapshot(legacyMode = true)\n      }\n    }\n    return null\n  }\n\n  companion object {\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    internal val repaintRenderEvent = RenderEvent(null, true)\n\n    internal val supportedRenderBackend: RenderBackendType by lazy {\n      Map.getSupportedRenderBackend()\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/MapboxSurfaceHolderRenderer.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.view.SurfaceHolder\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.maps.ContextMode\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapboxSurfaceHolderRenderer : MapboxSurfaceRenderer, SurfaceHolder.Callback {\n\n  constructor(\n    surfaceHolder: SurfaceHolder,\n    antialiasingSampleCount: Int,\n    contextMode: ContextMode,\n    mapName: String,\n  ) : super(antialiasingSampleCount, contextMode, mapName) {\n    surfaceHolder.addCallback(this)\n  }\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal constructor(renderThread: MapboxRenderThread) : super(renderThread)\n\n  override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {\n    super.surfaceChanged(holder.surface, width, height)\n  }\n\n  override fun surfaceDestroyed(holder: SurfaceHolder) {\n    super.surfaceDestroyed()\n  }\n\n  override fun surfaceCreated(holder: SurfaceHolder) {\n    super.surfaceCreated()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/MapboxSurfaceRenderer.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.view.Surface\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.maps.ContextMode\nimport com.mapbox.maps.RenderBackendType\n\ninternal open class MapboxSurfaceRenderer : MapboxRenderer {\n\n  private var createSurface = false\n\n  override val widgetRenderer: MapboxWidgetRenderer\n\n  constructor(\n    antialiasingSampleCount: Int,\n    contextMode: ContextMode,\n    mapName: String,\n  ) : super(mapName) {\n    widgetRenderer = MapboxWidgetRenderer(\n      antialiasingSampleCount = antialiasingSampleCount,\n      mapName = mapName,\n    )\n    renderThread = when (supportedRenderBackend) {\n      RenderBackendType.VULKAN -> VulkanMapboxRenderThread(\n        mapboxRenderer = this,\n        mapName = mapName,\n      )\n      RenderBackendType.OPEN_GL -> GLMapboxRenderThread(\n        mapboxRenderer = this,\n        mapboxWidgetRenderer = widgetRenderer,\n        translucentSurface = false,\n        antialiasingSampleCount = antialiasingSampleCount,\n        contextMode = contextMode,\n        mapName = mapName,\n      )\n    }\n  }\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal constructor(renderThread: MapboxRenderThread) : super(mapName = \"\") {\n    widgetRenderer = MapboxWidgetRenderer(\n      antialiasingSampleCount = 1,\n      mapName = \"\",\n    )\n    this.renderThread = renderThread\n  }\n\n  fun surfaceChanged(surface: Surface, width: Int, height: Int) {\n    if (createSurface) {\n      renderThread.onSurfaceCreated(\n        surface = surface,\n        width = width,\n        height = height\n      )\n      createSurface = false\n    }\n    renderThread.onSurfaceSizeChanged(\n      width = width,\n      height = height\n    )\n  }\n\n  fun surfaceDestroyed() {\n    renderThread.onSurfaceDestroyed()\n  }\n\n  fun surfaceCreated() {\n    createSurface = true\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/MapboxTextureViewRenderer.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.graphics.SurfaceTexture\nimport android.view.Surface\nimport android.view.TextureView\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.maps.ContextMode\nimport com.mapbox.maps.RenderBackendType\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapboxTextureViewRenderer : MapboxRenderer, TextureView.SurfaceTextureListener {\n\n  override val widgetRenderer: MapboxWidgetRenderer\n\n  constructor(\n    textureView: TextureView,\n    antialiasingSampleCount: Int,\n    contextMode: ContextMode,\n    mapName: String,\n  ) : super(mapName) {\n    val widgetRenderer = MapboxWidgetRenderer(\n      antialiasingSampleCount = antialiasingSampleCount,\n      mapName = mapName,\n    )\n    this.widgetRenderer = widgetRenderer\n    renderThread = when (supportedRenderBackend) {\n      RenderBackendType.VULKAN -> VulkanMapboxRenderThread(\n        mapboxRenderer = this,\n        mapName = mapName,\n      )\n      RenderBackendType.OPEN_GL -> GLMapboxRenderThread(\n        mapboxRenderer = this,\n        mapboxWidgetRenderer = widgetRenderer,\n        translucentSurface = true,\n        antialiasingSampleCount = antialiasingSampleCount,\n        contextMode = contextMode,\n        mapName = mapName,\n      )\n    }\n    textureView.let {\n      it.isOpaque = false\n      it.surfaceTextureListener = this\n    }\n  }\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal constructor(renderThread: MapboxRenderThread) : super(mapName = \"\") {\n    val widgetRenderer = MapboxWidgetRenderer(\n      antialiasingSampleCount = 1,\n      mapName = \"\",\n    )\n    this.widgetRenderer = widgetRenderer\n    this.renderThread = renderThread\n  }\n\n  override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {\n    renderThread.onSurfaceSizeChanged(width, height)\n  }\n\n  override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {\n    // do nothing\n  }\n\n  override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean {\n    renderThread.onSurfaceDestroyed()\n    surface.release()\n    return true\n  }\n\n  override fun onSurfaceTextureAvailable(surfaceTexture: SurfaceTexture, width: Int, height: Int) {\n    renderThread.onSurfaceCreated(\n      surface = Surface(surfaceTexture),\n      width = width,\n      height = height\n    )\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/MapboxWidgetRenderer.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.opengl.EGLContext\nimport android.opengl.EGLSurface\nimport android.opengl.GLES20\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.renderer.egl.EGLCore\nimport com.mapbox.maps.renderer.widget.Widget\nimport java.util.concurrent.CopyOnWriteArraySet\n\n@OptIn(MapboxExperimental::class)\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapboxWidgetRenderer(\n  private val antialiasingSampleCount: Int,\n  private val mapName: String,\n) {\n  private var eglCore: EGLCore? = null\n  private var eglContextCreated = false\n  private var eglSurface: EGLSurface? = null\n  private var sizeChanged = false\n\n  private val textures = intArrayOf(0)\n  private val framebuffers = intArrayOf(0)\n\n  private val widgets = CopyOnWriteArraySet<Widget>()\n\n  private var width = 0\n  private var height = 0\n\n  @Suppress(\"PrivatePropertyName\")\n  private val TAG = \"MapboxWidgetRenderer\" + if (mapName.isNotBlank()) \"\\\\$mapName\" else \"\"\n\n  val needRender: Boolean\n    get() = widgets.any { it.renderer.needRender }\n\n  fun hasWidgets() = widgets.isNotEmpty()\n\n  fun hasTexture() = textures[0] != 0\n\n  fun getTexture() = textures[0]\n\n  fun setSharedContext(sharedContext: EGLContext) {\n    if (eglContextCreated) {\n      release()\n    }\n    eglCore = EGLCore(\n      translucentSurface = false,\n      antialiasingSampleCount = antialiasingSampleCount,\n      sharedContext = sharedContext,\n      mapName = mapName,\n    )\n  }\n\n  fun onSurfaceChanged(width: Int, height: Int) {\n    sizeChanged = true\n    this.width = width\n    this.height = height\n    widgets.forEach { it.renderer.onSurfaceChanged(width, height) }\n  }\n\n  private fun prepareFrameBufferWithTexture() {\n    GLES20.glGenFramebuffers(1, framebuffers, 0)\n    GLES20.glGenTextures(1, textures, 0)\n    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0])\n    GLES20.glTexParameterf(\n      GLES20.GL_TEXTURE_2D,\n      GLES20.GL_TEXTURE_MAG_FILTER,\n      GLES20.GL_LINEAR.toFloat()\n    )\n    GLES20.glTexParameterf(\n      GLES20.GL_TEXTURE_2D,\n      GLES20.GL_TEXTURE_MIN_FILTER,\n      GLES20.GL_LINEAR.toFloat()\n    )\n    GLES20.glTexParameterf(\n      GLES20.GL_TEXTURE_2D,\n      GLES20.GL_TEXTURE_WRAP_S,\n      GLES20.GL_CLAMP_TO_EDGE.toFloat()\n    )\n    GLES20.glTexParameterf(\n      GLES20.GL_TEXTURE_2D,\n      GLES20.GL_TEXTURE_WRAP_T,\n      GLES20.GL_CLAMP_TO_EDGE.toFloat()\n    )\n    GLES20.glTexImage2D(\n      GLES20.GL_TEXTURE_2D,\n      0,\n      GLES20.GL_RGBA,\n      width,\n      height,\n      0,\n      GLES20.GL_RGBA,\n      GLES20.GL_UNSIGNED_BYTE,\n      null\n    )\n    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0)\n    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebuffers[0])\n    GLES20.glFramebufferTexture2D(\n      GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,\n      GLES20.GL_TEXTURE_2D, textures[0], 0\n    )\n    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0)\n  }\n\n  fun release() {\n    releaseAll(resizing = false)\n  }\n\n  private fun releaseAll(resizing: Boolean) {\n    val eglCore = this.eglCore\n    val eglSurface = this.eglSurface\n    if (eglCore != null) {\n      if (eglSurface != null && eglSurface != eglCore.eglNoSurface) {\n        eglCore.makeCurrent(eglSurface)\n        deleteFrameBufferWithTexture()\n        // Do not clear widgets here, or they will be lost if Activity is paused/resumed.\n        widgets.forEach {\n          it.renderer.release()\n        }\n\n        eglCore.releaseSurface(eglSurface)\n      }\n\n      eglCore.release()\n    }\n    this.eglSurface = null\n    if (!resizing) {\n      this.eglCore = null\n    }\n    this.eglContextCreated = false\n  }\n\n  fun renderToFrameBuffer() {\n    checkSizeChanged()\n    checkEgl()\n    val eglCore = this.eglCore\n    val eglSurface = this.eglSurface\n    if (eglCore == null || eglSurface == null || eglSurface == eglCore.eglNoSurface) {\n      return\n    }\n    eglCore.makeCurrent(eglSurface)\n    if (!hasTexture()) {\n      prepareFrameBufferWithTexture()\n    }\n    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebuffers[0])\n    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT or GLES20.GL_DEPTH_BUFFER_BIT or GLES20.GL_STENCIL_BUFFER_BIT)\n    widgets.forEach {\n      it.renderer.render()\n    }\n    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0)\n  }\n\n  private fun deleteFrameBufferWithTexture() {\n    GLES20.glDeleteFramebuffers(framebuffers.size, framebuffers, 0)\n    GLES20.glDeleteTextures(textures.size, textures, 0)\n    framebuffers[0] = 0\n    textures[0] = 0\n  }\n\n  private fun checkSizeChanged() {\n    if (sizeChanged) {\n      val eglCore = this.eglCore\n      val eglSurface = this.eglSurface\n      if (eglCore != null && eglSurface != null && eglSurface != eglCore.eglNoSurface) {\n        releaseAll(resizing = true)\n      }\n      sizeChanged = false\n    }\n  }\n\n  private fun checkEgl() {\n    val eglSurface = this.eglSurface\n    val eglCore = this.eglCore\n\n    if (eglCore == null) {\n      logE(TAG, \"Cannot prepare egl, eglCore has not been initialized yet.\")\n      return\n    }\n    if (eglSurface != null && eglSurface != eglCore.eglNoSurface) {\n      return\n    }\n\n    if (!eglContextCreated) {\n      eglContextCreated = eglCore.prepareEgl()\n      if (!eglContextCreated) {\n        logW(TAG, \"Widget EGL was not configured, please check logs above.\")\n        return\n      }\n    }\n\n    if (eglSurface == null || eglSurface == eglCore.eglNoSurface) {\n      this.eglSurface = eglCore.createOffscreenSurface(width = width, height = height)\n      if (this.eglSurface == eglCore.eglNoSurface) {\n        logE(TAG, \"Widget offscreen surface was not configured, please check logs above.\")\n        return\n      }\n    }\n  }\n\n  fun addWidget(widget: Widget) {\n    widget.renderer.onSurfaceChanged(width, height)\n    widgets.add(widget)\n  }\n\n  fun removeWidget(widget: Widget): Boolean {\n    val removed = widgets.remove(widget)\n    if (removed) {\n      widget.setTriggerRepaintAction(null)\n    }\n    return removed\n  }\n\n  fun cleanUpAllWidgets() {\n    widgets.forEach { it.setTriggerRepaintAction(null) }\n    widgets.clear()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/OnFpsChangedListener.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport com.mapbox.maps.MapView\n\n/**\n * Interface definition for a callback to be invoked when a frame is rendered to the map view.\n * Important note: [onFpsChanged] is called on non-UI thread.\n *\n * @see [MapView.setOnFpsChangedListener]\n */\nfun interface OnFpsChangedListener {\n  /**\n   * Called on non-UI thread for every frame rendered to the map view.\n   *\n   * @param fps The average number of frames rendered over the last second.\n   */\n  @RenderThread\n  fun onFpsChanged(fps: Double)\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/RenderEvent.kt",
    "content": "package com.mapbox.maps.renderer\n\n/**\n * Class describing internal render event.\n *\n * This abstraction is needed to run any render event from [MapboxRenderer]\n * to schedule it on [MapboxRenderThread]'s message queue.\n */\ninternal data class RenderEvent(\n  /**\n   * Optional callback to be run on render thread's looper.\n   */\n  val runnable: Runnable?,\n  /**\n   * Whether that event requires actual render.\n   * If set to `true` - render call will be scheduled, [runnable] will be put in a separate queue\n   * which is drained after native draw calls but before swapping buffers.\n   * If set to `false` - no render call will be scheduled, [runnable] will be either be put in a\n   * render thread message queue and executed asap if no pending VSYNC event\n   * or executed right after swapping buffers if VSYNC event is pending. Runnables are executed\n   * only if render thread is in fully prepared state.\n   */\n  val needRender: Boolean,\n)"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/RenderHandlerThread.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.os.Handler\nimport android.os.HandlerThread\nimport android.os.Message\nimport android.os.Process.THREAD_PRIORITY_DISPLAY\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.maps.logW\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class RenderHandlerThread(\n  mapName: String,\n) {\n\n  private val handlerThreadName = if (mapName.isNotBlank())\n    \"MbxRender$mapName\"\n  else\n    \"MapboxRenderThread\"\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal val handlerThread: HandlerThread =\n    HandlerThread(handlerThreadName, THREAD_PRIORITY_DISPLAY)\n\n  @Volatile\n  internal var handler: Handler? = null\n\n  internal val isRunning\n    get() = handler != null && handlerThread.isAlive\n\n  @Suppress(\"PrivatePropertyName\")\n  private val TAG = \"Mbgl-$handlerThreadName\" + if (mapName.isNotBlank()) \"\\\\$mapName\" else \"\"\n\n  fun post(task: Runnable) {\n    postDelayed(task, 0)\n  }\n\n  fun postDelayed(task: Runnable, delayMillis: Long) {\n    handler?.let {\n      val message = Message.obtain(it, task)\n      it.sendMessageDelayed(message, delayMillis)\n    } ?: logW(TAG, \"Thread $handlerThreadName was not started, ignoring event\")\n  }\n\n  fun start(): Handler {\n    handlerThread.start()\n    return Handler(handlerThread.looper).also {\n      handler = it\n    }\n  }\n\n  fun stop() {\n    handlerThread.quit()\n    handler = null\n  }\n\n  /**\n   * Clears all messages.\n   */\n  fun clearRenderEventQueue() {\n    handler?.removeCallbacksAndMessages(null)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/RenderThread.kt",
    "content": "package com.mapbox.maps.renderer\n\n/**\n * Denotes that the annotated method should only be called on a Mapbox render thread.\n * If the annotated element is a class, then all methods in the class should be called\n * on a Mapbox render thread.\n */\n@MustBeDocumented\n@Retention(AnnotationRetention.SOURCE)\n@Target(\n  AnnotationTarget.FUNCTION,\n  AnnotationTarget.PROPERTY_GETTER,\n  AnnotationTarget.PROPERTY_SETTER,\n  AnnotationTarget.PROPERTY,\n  AnnotationTarget.CONSTRUCTOR,\n  AnnotationTarget.CLASS,\n)\nannotation class RenderThread"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/RenderThreadStatsRecorder.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.os.SystemClock\nimport com.mapbox.maps.MapboxExperimental\nimport java.util.Objects\nimport kotlin.math.ceil\n\n/**\n * Recorder for tracking [MapboxRenderThread] frame stats.\n *\n * Note that [RenderThreadStatsRecorder] results are relevant when the map is continuously\n * rendering (for example, during an animation).\n */\n@MapboxExperimental\nclass RenderThreadStatsRecorder {\n\n  private var startTime = 0L\n  private var totalDroppedFrames = 0L\n  private val frameTimeList = mutableListOf<Double>()\n\n  /**\n   * @return true if recording is in progress.\n   */\n  val isRecording: Boolean\n    get() = startTime != 0L\n\n  /**\n   * Start recording frame stats.\n   *\n   * @throws RuntimeException if the recorder was already started.\n   */\n  fun start() {\n    if (isRecording) {\n      throw RuntimeException(\"RendererStatRecorder: end() was not called after previous start()!\")\n    }\n    startTime = SystemClock.elapsedRealtime()\n  }\n\n  internal fun addFrameStats(frameTime: Double, droppedFrames: Int) {\n    totalDroppedFrames += droppedFrames\n    frameTimeList.add(frameTime)\n  }\n\n  private fun percentileOfSortedList(sortedValues: List<Double>, percentile: Double): Double? {\n    val index = ceil((percentile / 100.0) * sortedValues.size).toInt()\n    return sortedValues.elementAtOrNull(index - 1)\n  }\n\n  /**\n   * End recording and calculate final results.\n   *\n   * @return [RenderThreadStats] with calculated stats.\n   *\n   * @throws RuntimeException if [start] was not called before.\n   */\n  fun end(): RenderThreadStats {\n    if (!isRecording) {\n      throw RuntimeException(\"RendererStatRecorder: start() was not called!\")\n    }\n    val frameTimeListCopy = frameTimeList.toList()\n    val sortedFrameTimeList = frameTimeList.sorted()\n\n    return RenderThreadStats.Builder()\n      .setTotalTime(SystemClock.elapsedRealtime() - startTime)\n      .setTotalFrames(frameTimeList.size + totalDroppedFrames)\n      .setTotalDroppedFrames(totalDroppedFrames)\n      .setFrameTimeList(frameTimeListCopy)\n      .setPercentile50(percentileOfSortedList(sortedFrameTimeList, 50.0))\n      .setPercentile90(percentileOfSortedList(sortedFrameTimeList, 90.0))\n      .setPercentile95(percentileOfSortedList(sortedFrameTimeList, 95.0))\n      .setPercentile99(percentileOfSortedList(sortedFrameTimeList, 99.0))\n      .build()\n      .also {\n        startTime = 0L\n        totalDroppedFrames = 0L\n        frameTimeList.clear()\n      }\n  }\n}\n\n/**\n * Data class for holding frame stats.\n */\n@MapboxExperimental\nclass RenderThreadStats private constructor(\n  /**\n   * Total time in milliseconds that the recorder was running.\n   */\n  val totalTime: Long,\n  /**\n   * Total number of frames (rendered + dropped).\n   */\n  val totalFrames: Long,\n  /**\n   * Total number of dropped frames.\n   */\n  val totalDroppedFrames: Long,\n  /**\n   * List of rendered frames times in milliseconds.\n   */\n  val frameTimeList: List<Double>,\n  /**\n   * 50th percentile of frame times in milliseconds.\n   */\n  val percentile50: Double?,\n  /**\n   * 90th percentile of frame times in milliseconds.\n   */\n  val percentile90: Double?,\n  /**\n   * 95th percentile of frame times in milliseconds.\n   */\n  val percentile95: Double?,\n  /**\n   * 99th percentile of frame times in milliseconds.\n   */\n  val percentile99: Double?,\n) {\n  /**\n   * @return Returns a string representation of the object.\n   */\n  override fun toString() =\n    \"RenderThreadStats(totalTime=$totalTime, totalFrames=$totalFrames, totalDroppedFrames=$totalDroppedFrames, frameTimeList=$frameTimeList, percentile50=$percentile50, percentile90=$percentile90, percentile95=$percentile95, percentile99=$percentile99)\"\n\n  /**\n   * @return Returns true if the object is equal to the other object.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as RenderThreadStats\n\n    if (totalTime != other.totalTime) return false\n    if (totalFrames != other.totalFrames) return false\n    if (totalDroppedFrames != other.totalDroppedFrames) return false\n    if (percentile50 != other.percentile50) return false\n    if (percentile90 != other.percentile90) return false\n    if (percentile95 != other.percentile95) return false\n    if (percentile99 != other.percentile99) return false\n    if (frameTimeList != other.frameTimeList) return false\n\n    return true\n  }\n\n  /**\n   * @return Returns the hash code of the object.\n   */\n  override fun hashCode(): Int = Objects.hash(\n    totalTime,\n    totalFrames,\n    totalDroppedFrames,\n    percentile50,\n    percentile90,\n    percentile95,\n    percentile99\n  )\n\n  internal class Builder {\n    private var totalTime: Long = 0\n    private var totalFrames: Long = 0\n    private var totalDroppedFrames: Long = 0\n    private var frameTimeList: List<Double> = emptyList()\n    private var percentile50: Double? = null\n    private var percentile90: Double? = null\n    private var percentile95: Double? = null\n    private var percentile99: Double? = null\n\n    fun setTotalTime(totalTime: Long) = apply { this.totalTime = totalTime }\n    fun setTotalFrames(totalFrames: Long) = apply { this.totalFrames = totalFrames }\n    fun setTotalDroppedFrames(totalDroppedFrames: Long) =\n      apply { this.totalDroppedFrames = totalDroppedFrames }\n\n    fun setFrameTimeList(frameTimeList: List<Double>) = apply { this.frameTimeList = frameTimeList }\n    fun setPercentile50(percentile50: Double?) = apply { this.percentile50 = percentile50 }\n    fun setPercentile90(percentile90: Double?) = apply { this.percentile90 = percentile90 }\n    fun setPercentile95(percentile95: Double?) = apply { this.percentile95 = percentile95 }\n    fun setPercentile99(percentile99: Double?) = apply { this.percentile99 = percentile99 }\n\n    fun build(): RenderThreadStats {\n      return RenderThreadStats(\n        totalTime,\n        totalFrames,\n        totalDroppedFrames,\n        frameTimeList,\n        percentile50,\n        percentile90,\n        percentile95,\n        percentile99\n      )\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/RendererError.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.opengl.EGL14\nimport com.mapbox.maps.MapView\n\n/**\n * Typed enum wrapping up all the EGL error codes represented as ints.\n * We do have SDK specific error types: [NO_VALID_EGL_CONFIG_FOUND] and [OUT_OF_MEMORY].\n */\nclass RendererError(\n  /**\n   * EGL error code.\n   */\n  val eglErrorCode: Int\n) {\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?): Boolean = other is RendererError &&\n    eglErrorCode == other.eglErrorCode\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode(): Int = eglErrorCode.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString(): String = if (eglErrorCode == 0)\n    \"RendererError(NO_VALID_EGL_CONFIG_FOUND)\"\n  else\n    \"RendererError(EGL_ERROR_CODE=$eglErrorCode)\"\n\n  /**\n   * Companion object.\n   */\n  companion object {\n    /**\n     * Error code returned when no matching EGL config was found meaning that map rendering is not supported on given device.\n     * This could be also checked with static method [MapView.isRenderingSupported] prior to creating the [MapView].\n     */\n    @JvmField\n    val NO_VALID_EGL_CONFIG_FOUND = RendererError(0)\n\n    /**\n     * Represents out of memory caused by [EGL14.EGL_BAD_ALLOC].\n     *\n     * Could be thrown when creating context, surface or display and system is running low on resources.\n     * Best action will be try to release Android resources and re-create the [MapView].\n     */\n    @JvmField\n    val OUT_OF_MEMORY = RendererError(EGL14.EGL_BAD_ALLOC)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/RendererSetupErrorListener.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport com.mapbox.maps.MapView\n\n/**\n * Callback used to get notified when issues occur during renderer preparation.\n * Note that callback will be delivered on main thread.\n */\nfun interface RendererSetupErrorListener {\n  /**\n   * Triggered when error occurs during renderer setup. As the result the map will not be rendered properly.\n   *\n   * In some cases (e.g. when [RendererError.OutOfMemory] is returned) it may be sufficient try\n   * to release some Android resources (e.g. free up some memory) and re-create the [MapView] again.\n   *\n   * @param error typed renderer error taken from [RendererError] enum\n   */\n  fun onError(error: RendererError)\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/VulkanMapboxRenderThread.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.view.Surface\nimport com.mapbox.maps.IVulkanManager\nimport com.mapbox.maps.RenderCallback\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\n\n/**\n * Vulkan-based implementation of MapboxRenderThread.\n */\ninternal class VulkanMapboxRenderThread(mapboxRenderer: MapboxRenderer, mapName: String) :\n  MapboxRenderThread(\n    mapboxRenderer = mapboxRenderer,\n    widgetRenderer = null,\n    mapName = mapName,\n    rendererName = \"Vulkan\"\n  ) {\n\n  private var nativeVulkanManager: IVulkanManager? = null\n  private val surfaceWrapper: SurfaceWrapper = SurfaceWrapper()\n\n  init {\n    logI(TAG, \"VulkanMapboxRenderThread created\")\n  }\n\n  override fun detachSurfaceFromRenderer(creatingSurface: Boolean) {\n    // no-op for now\n  }\n\n  /**\n   * For Vulkan renderer there's not much to prepare, just get the [IVulkanManager].\n   * Preparations will be done in [attachSurfaceToRenderer].\n   */\n  override fun prepareRenderer(): Boolean {\n    // TODO: How to handle vulkan not supported in the device?\n    if (nativeVulkanManager == null) {\n      nativeVulkanManager = mapboxRenderer.map?.getVulkanManager()\n      if (nativeVulkanManager == null) {\n        logW(TAG, \"Failed to obtain VulkanManager - Vulkan rendering will not be available\")\n      }\n    }\n    return nativeVulkanManager != null\n  }\n\n  override fun attachSurfaceToRenderer(surface: Surface): Boolean {\n    surfaceWrapper.setSurface(surface)\n    val nativeWindowPtr = surfaceWrapper.aNativeWindow\n\n    if (nativeWindowPtr == 0L) {\n      logW(TAG, \"Failed to get native window pointer\")\n      return false\n    }\n\n    val result = nativeVulkanManager?.init(nativeWindowPtr) ?: run {\n      // TODO cache surface until nativeVulkanManager is set via setMap\n      false\n    }\n\n    return result\n  }\n\n  private val renderCallback: RenderCallback = RenderCallback(mapboxRenderer::render)\n\n  override fun renderWithoutWidgets() {\n    nativeVulkanManager?.render(renderCallback)\n  }\n\n  override fun presentFrame() {\n    // no-op as presentFrame is called from native side as part of `render { }`\n  }\n\n  override fun preRenderWithSharedContext() {\n    // no-op for now\n  }\n\n  override fun renderWithWidgets() {\n    TODO(\"Not yet supported in Vulkan\")\n  }\n\n  override fun releaseResources() {\n    isRendererReady = false\n    surfaceWrapper.releaseSurface()\n    nativeVulkanManager?.release()\n  }\n\n  override fun prepareWidgetRender() {\n    // no-op for now\n  }\n\n  override fun releaseRenderSurface() {\n    nativeVulkanManager?.releaseSurface()\n    isRendererReady = false\n  }\n\n  override fun clearRendererStateListeners() {\n    // no-op for now\n  }\n\n  override fun addRendererStateListener(listener: RendererSetupErrorListener) {\n    // no-op for now\n  }\n\n  override fun removeRendererStateListener(listener: RendererSetupErrorListener) {\n    // no-op for now\n  }\n\n  override fun resize(width: Int, height: Int) {\n    // TODO cache width/height if NULL\n    nativeVulkanManager?.resize(width, height)\n  }\n\n  override fun flushCommands() {\n    // no-op for now\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/egl/EGLConfigChooser.kt",
    "content": "package com.mapbox.maps.renderer.egl\n\nimport android.opengl.EGL14\nimport android.opengl.EGLConfig\nimport android.opengl.EGLDisplay\nimport android.os.Build\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.maps.MAPBOX_LOCALE\nimport com.mapbox.maps.MapView.Companion.DEFAULT_ANTIALIASING_SAMPLE_COUNT\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.renderer.RenderThread\nimport java.lang.Boolean.compare\nimport java.lang.Integer.compare\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\n@RenderThread\ninternal class EGLConfigChooser constructor(\n  private val translucentSurface: Boolean,\n  private var antialiasingSampleCount: Int,\n  mapName: String,\n) {\n  private val antialiasingEnabled get() = antialiasingSampleCount > DEFAULT_ANTIALIASING_SAMPLE_COUNT\n\n  // Get all configs at least RGB 565 with 16 depth and 8 stencil.\n  // For all features to work we absolutely prefer RGBA_8888 with 24-bit depth,\n  // this should be supported on almost all devices\n  private val configAttributes: IntArray\n    get() {\n      val emulator = inEmulator()\n      logI(TAG, \"In emulator: $emulator\")\n      return intArrayOf(\n        EGL14.EGL_CONFIG_CAVEAT, EGL14.EGL_NONE,\n        EGL14.EGL_SURFACE_TYPE, EGL14.EGL_WINDOW_BIT,\n        EGL14.EGL_BUFFER_SIZE, 16,\n        EGL14.EGL_RED_SIZE, 5,\n        EGL14.EGL_GREEN_SIZE, 6,\n        EGL14.EGL_BLUE_SIZE, 5,\n        EGL14.EGL_ALPHA_SIZE, if (translucentSurface) 8 else 0,\n        EGL14.EGL_DEPTH_SIZE, 16,\n        EGL14.EGL_STENCIL_SIZE, STENCIL_SIZE,\n        EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT\n      ).plus(\n        if (antialiasingEnabled) {\n          intArrayOf(\n            EGL14.EGL_SAMPLE_BUFFERS, 1,\n            EGL14.EGL_SAMPLES, antialiasingSampleCount\n          )\n        } else {\n          intArrayOf()\n        }\n      ).plus(\n        if (emulator) {\n          intArrayOf(\n            EGL14.EGL_CONFORMANT, EGL14.EGL_OPENGL_ES2_BIT,\n            EGL14.EGL_COLOR_BUFFER_TYPE, EGL14.EGL_RGB_BUFFER,\n          )\n        } else {\n          intArrayOf()\n        }\n      ).plus(EGL14.EGL_NONE)\n    }\n\n  @Suppress(\"PrivatePropertyName\")\n  private val TAG = \"Mbgl-EGLConfigChooser\" + if (mapName.isNotBlank()) \"\\\\$mapName\" else \"\"\n\n  fun chooseConfig(display: EGLDisplay): EGLConfig? {\n    val allConfigs = getConfigs(display)\n    val config = chooseBestMatchConfig(display, allConfigs)\n    if (config == null) {\n      logE(TAG, \"No EGL config found, see log above for concrete error.\")\n    }\n    return config\n  }\n\n  private fun getConfigs(display: EGLDisplay): List<EGLConfig> {\n    val numConfigs = IntArray(1)\n    val configs = arrayOfNulls<EGLConfig>(100)\n    val initialSampleCount = antialiasingSampleCount\n    var suitableConfigsFound = false\n    while (!suitableConfigsFound) {\n      val success = EGL14.eglChooseConfig(\n        /* dpy */ display,\n        /* attrib_list */ configAttributes,\n        /* attrib_listOffset */ 0,\n        /* configs */ configs,\n        /* configsOffset */ 0,\n        /* config_size */ configs.size,\n        /* num_config */ numConfigs,\n        /* num_configOffset */ 0,\n      )\n      if (!success || numConfigs[0] < 1) {\n        if (antialiasingSampleCount > 1) {\n          // try again with halved antialiasingSampleCount\n          logW(TAG, \"Reducing sample count in 2 times for MSAA as EGL_SAMPLES=$antialiasingSampleCount is not supported\")\n          antialiasingSampleCount /= 2\n        } else {\n          // no config found even without anti-aliasing, return error\n          logE(TAG, \"No suitable EGL configs were found, eglChooseConfig returned error ${EGL14.eglGetError()}.\")\n          return emptyList()\n        }\n      } else {\n        suitableConfigsFound = true\n      }\n    }\n\n    if (initialSampleCount != antialiasingSampleCount) {\n        logW(\n          TAG,\n          if (antialiasingSampleCount == 1) \"Found EGL configs only with MSAA disabled.\"\n          else \"Found EGL configs with MSAA enabled, EGL_SAMPLES=$antialiasingSampleCount.\"\n        )\n    }\n\n    return configs.take(numConfigs[0]).requireNoNulls()\n  }\n\n  // Quality\n  internal enum class BufferFormat(var value: Int) {\n    Format32BitAlpha(0),\n    Format32BitNoAlpha(1),\n    Format24Bit(2),\n    Format16Bit(3),\n    Unknown(4),\n  }\n\n  internal enum class DepthStencilFormat(var value: Int) {\n    Format24Depth8Stencil(0),\n    Format16Depth8Stencil(1),\n  }\n\n  private fun chooseBestMatchConfig(\n    display: EGLDisplay,\n    configs: List<EGLConfig>\n  ): EGLConfig? {\n\n    class Config(\n      val bufferFormat: BufferFormat,\n      val depthStencilFormat: DepthStencilFormat,\n      val isNotConformant: Boolean,\n      val isCaveat: Boolean,\n      val index: Int,\n      val config: EGLConfig,\n      val samples: Int,\n    ) : Comparable<Config> {\n\n      override fun compareTo(other: Config): Int {\n        var i = compare(bufferFormat.value, other.bufferFormat.value)\n        if (i != 0) {\n          return i\n        }\n\n        i = compare(depthStencilFormat.value, other.depthStencilFormat.value)\n        if (i != 0) {\n          return i\n        }\n\n        i = compare(isNotConformant, other.isNotConformant)\n        if (i != 0) {\n          return i\n        }\n\n        i = compare(isCaveat, other.isCaveat)\n        if (i != 0) {\n          return i\n        }\n\n        i = compare(index, other.index)\n        return if (i != 0) i else 0\n      }\n    }\n\n    val matches = ArrayList<Config>()\n\n    var i = 0\n    for (config in configs) {\n      i++\n\n      fun getConfigAttr(\n        attributeName: Int\n      ): Int? {\n        val attributeValue = IntArray(1)\n        if (!EGL14.eglGetConfigAttrib(\n            /* dpy = */ display,\n            /* config = */ config,\n            /* attribute = */ attributeName,\n            /* value = */ attributeValue,\n            /* offset = */ 0\n          )\n        ) {\n          logE(\n            TAG,\n            String.format(\n              MAPBOX_LOCALE,\n              \"eglGetConfigAttrib(%d) returned error %d\",\n              attributeName,\n              EGL14.eglGetError()\n            )\n          )\n          return null\n        }\n        return attributeValue[0]\n      }\n\n      val caveat = getConfigAttr(EGL14.EGL_CONFIG_CAVEAT) ?: return null\n      val conformant = getConfigAttr(EGL14.EGL_CONFORMANT) ?: return null\n      val bits = getConfigAttr(EGL14.EGL_BUFFER_SIZE) ?: return null\n      val red = getConfigAttr(EGL14.EGL_RED_SIZE) ?: return null\n      val green = getConfigAttr(EGL14.EGL_GREEN_SIZE) ?: return null\n      val blue = getConfigAttr(EGL14.EGL_BLUE_SIZE) ?: return null\n      val alpha = getConfigAttr(EGL14.EGL_ALPHA_SIZE) ?: return null\n      val depth = getConfigAttr(EGL14.EGL_DEPTH_SIZE) ?: return null\n      val stencil = getConfigAttr(EGL14.EGL_STENCIL_SIZE) ?: return null\n      val sampleBuffers = getConfigAttr(EGL14.EGL_SAMPLE_BUFFERS) ?: return null\n      val samples = getConfigAttr(EGL14.EGL_SAMPLES) ?: return null\n\n      var configOk = depth == 24 || depth == 16\n      configOk = configOk and (stencil == 8)\n      if (antialiasingEnabled) {\n        configOk = configOk and (sampleBuffers >= 1)\n        configOk = configOk and (samples >= antialiasingSampleCount)\n      } else {\n        configOk = configOk and (sampleBuffers == 0)\n        configOk = configOk and (samples == 0)\n      }\n\n      // Filter our configs first for depth, stencil and anti-aliasing\n      if (configOk) {\n        val bufferFormat: BufferFormat = if (bits == 16 && red == 5 && green == 6 && blue == 5 && alpha == 0) {\n          BufferFormat.Format16Bit\n        } else if (bits == 32 && red == 8 && green == 8 && blue == 8 && alpha == 0) {\n          BufferFormat.Format32BitNoAlpha\n        } else if (bits == 32 && red == 8 && green == 8 && blue == 8 && alpha == 8) {\n          BufferFormat.Format32BitAlpha\n        } else if (bits == 24 && red == 8 && green == 8 && blue == 8 && alpha == 0) {\n          BufferFormat.Format24Bit\n        } else {\n          BufferFormat.Unknown\n        }\n\n        // Ignore formats we don't recognise\n        if (bufferFormat != BufferFormat.Unknown) {\n          // Work out the config's depth stencil format\n          val depthStencilFormat = if (depth == 16 && stencil == 8) {\n            DepthStencilFormat.Format16Depth8Stencil\n          } else {\n            DepthStencilFormat.Format24Depth8Stencil\n          }\n\n          val isNotConformant = (conformant and EGL14.EGL_OPENGL_ES2_BIT) != EGL14.EGL_OPENGL_ES2_BIT\n          val isCaveat = caveat != EGL14.EGL_NONE\n\n          matches.add(\n            Config(\n              bufferFormat = bufferFormat,\n              depthStencilFormat = depthStencilFormat,\n              isNotConformant = isNotConformant,\n              isCaveat = isCaveat,\n              index = i,\n              config = config,\n              samples = samples,\n            )\n          )\n        }\n      }\n    }\n\n    if (matches.size == 0) {\n      logE(TAG, \"No matching configurations after filtering\")\n      return null\n    }\n\n    // Sort and choose the best one\n    matches.sort()\n    val bestMatch = matches[0]\n    if (bestMatch.isCaveat) {\n      logW(TAG, \"Chosen config has a caveat.\")\n    }\n    if (bestMatch.isNotConformant) {\n      logW(TAG, \"Chosen config is not conformant.\")\n    }\n    if (antialiasingEnabled && bestMatch.samples != antialiasingSampleCount) {\n      logW(\n        TAG,\n        \"MSAA x$antialiasingSampleCount requested, but closest supported x${bestMatch.samples} applied\"\n      )\n    }\n    return bestMatch.config\n  }\n\n  companion object {\n\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    internal var STENCIL_SIZE = 8\n\n    /**\n     * Detect if we are in emulator.\n     */\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    internal fun inEmulator(): Boolean {\n      return Build.FINGERPRINT.startsWith(\"generic\") ||\n        Build.FINGERPRINT.startsWith(\"unknown\") ||\n        Build.MODEL.contains(\"google_sdk\") ||\n        Build.MODEL.contains(\"Emulator\") ||\n        Build.MODEL.contains(\"Android SDK built for x86\") ||\n        Build.BRAND.startsWith(\"generic\") ||\n        Build.DEVICE.startsWith(\"generic\") ||\n        Build.PRODUCT == \"google_sdk\" ||\n        Build.MANUFACTURER.contains(\"Genymotion\") ||\n        System.getProperty(\"ro.kernel.qemu\") != null\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/egl/EGLCore.kt",
    "content": "package com.mapbox.maps.renderer.egl\n\nimport android.opengl.*\nimport android.os.Handler\nimport android.os.Looper\nimport android.view.Surface\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.renderer.RenderThread\nimport com.mapbox.maps.renderer.RendererError\nimport com.mapbox.maps.renderer.RendererSetupErrorListener\nimport java.util.*\n\n/**\n * Core EGL state (display, context, config).\n *\n * The EGLContext must only be attached to one thread at a time. This class is not thread-safe.\n *\n * Inspired by [Grafika](https://github.com/google/grafika/blob/master/app/src/main/java/com/android/grafika/gles/EglCore.java)\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\n@RenderThread\ninternal class EGLCore(\n  private val translucentSurface: Boolean,\n  private val antialiasingSampleCount: Int,\n  private val sharedContext: EGLContext = EGL14.EGL_NO_CONTEXT,\n  private val mapName: String,\n) {\n  private lateinit var eglConfig: EGLConfig\n  private var eglDisplay: EGLDisplay = EGL14.EGL_NO_DISPLAY\n  internal var eglContext: EGLContext = EGL14.EGL_NO_CONTEXT\n\n  internal val eglNoSurface: EGLSurface = EGL14.EGL_NO_SURFACE\n\n  /**\n   * For user convenience we will deliver [RendererSetupErrorListener] on main thread.\n   */\n  private val mainHandler = Handler(Looper.getMainLooper())\n  /**\n   * We require error accumulation as renderer is created when [MapView] is created and\n   * some errors could already be triggered on render thread\n   * before user will call [MapView.addRendererSetupErrorListener] -\n   * in that case accumulated errors will still be delivered to the user.\n   */\n  private val accumulatedRendererErrorList = LinkedList<RendererError>()\n  private val rendererSetupErrorListenerSet = HashSet<RendererSetupErrorListener>()\n\n  @Suppress(\"PrivatePropertyName\")\n  private val TAG = \"Mbgl-EglCore\" + if (mapName.isNotBlank()) \"\\\\$mapName\" else \"\"\n\n  fun prepareEgl(): Boolean {\n    eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY)\n    if (eglDisplay == EGL14.EGL_NO_DISPLAY) {\n      // no need to report error upstream here due to https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglGetDisplay.xhtml\n      logW(TAG, \"Unable to get default display, eglInitialize will most likely fail shortly.\")\n    }\n    val versions = IntArray(2)\n    if (!EGL14.eglInitialize(\n        /* dpy = */ eglDisplay,\n        /* major = */ versions,\n        /* majorOffset = */ 0,\n        /* minor = */ versions,\n        /* minorOffset = */ 1\n      )\n    ) {\n      checkEglErrorAndNotify(\"eglInitialize\")\n      return false\n    }\n\n    EGLConfigChooser(translucentSurface, antialiasingSampleCount, mapName).chooseConfig(eglDisplay)?.let {\n      eglConfig = it\n    } ?: run {\n      notifyListeners(RendererError.NO_VALID_EGL_CONFIG_FOUND)\n      return false\n    }\n    val contextEgl3 = EGL14.eglCreateContext(\n      /* dpy = */ eglDisplay,\n      /* config = */ eglConfig,\n      /* share_context = */ sharedContext,\n      /* attrib_list = */ attribsEgl3,\n      /* offset = */ 0,\n    )\n\n    val notSupportingEglContext3 = checkEglError(\"eglCreateContext\") != null\n    eglContext = if (notSupportingEglContext3) {\n      throw IllegalStateException(\"OpenGL ES 3.0 context could not be created\")\n    } else {\n      contextEgl3\n    }\n\n    val eglVersion = queryContextVersion()\n    logI(TAG, \"EGLContext created, client version $eglVersion\")\n    return true\n  }\n\n  fun queryContextVersion(): Int {\n    val values = IntArray(1)\n    val eglQueryContextSuccess = EGL14.eglQueryContext(\n      /* dpy = */ eglDisplay,\n      /* ctx = */ eglContext,\n      /* attribute = */ EGL14.EGL_CONTEXT_CLIENT_VERSION,\n      /* value = */ values,\n      /* offset = */ 0,\n    )\n    if (!eglQueryContextSuccess) {\n      checkEglErrorAndNotify(\"eglQueryContext\")\n    }\n    return values[0]\n  }\n\n  /**\n   * Discards all resources held by this class, notably the EGL context.  This must be\n   * called from the thread where the context was created.\n   *\n   * On completion, no context will be current.\n   */\n  fun release() {\n    if (eglDisplay != EGL14.EGL_NO_DISPLAY) {\n      // Android is unusual in that it uses a reference-counted EGLDisplay.  So for\n      // every eglInitialize() we need an eglTerminate().\n      makeNothingCurrent()\n      EGL14.eglDestroyContext(eglDisplay, eglContext)\n      EGL14.eglTerminate(eglDisplay)\n    }\n    eglDisplay = EGL14.EGL_NO_DISPLAY\n    eglContext = EGL14.EGL_NO_CONTEXT\n  }\n\n  /**\n   * Destroys the specified surface. Note the EGLSurface won't actually be destroyed if it's\n   * still current in a context.\n   */\n  fun releaseSurface(eglSurface: EGLSurface) {\n    if (eglSurface != EGL14.EGL_NO_SURFACE && eglDisplay != EGL14.EGL_NO_DISPLAY) {\n      EGL14.eglDestroySurface(eglDisplay, eglSurface)\n      logI(TAG, \"EGL surface was destroyed.\")\n    } else {\n      logW(TAG, \"EGL surface was already destroyed before.\")\n    }\n  }\n\n  /**\n   * Creates an EGL surface associated with a Surface.\n   */\n  fun createWindowSurface(surface: Surface): EGLSurface {\n    try {\n      // Create a window surface, and attach it to the Surface we received.\n      val surfaceAttribs = intArrayOf(EGL14.EGL_NONE)\n      // may throw java.lang.IllegalArgumentException even when surface is valid\n      val eglSurface = EGL14.eglCreateWindowSurface(\n        /* dpy = */ eglDisplay,\n        /* config = */ eglConfig,\n        /* win = */ surface,\n        /* attrib_list = */ surfaceAttribs,\n        /* offset = */ 0,\n      )\n      val eglWindowCreatedError = checkEglErrorAndNotify(\"eglCreateWindowSurface\")\n      if (eglWindowCreatedError != null || eglSurface == null) {\n        return eglNoSurface\n      }\n      return eglSurface\n    } catch (e: Exception) {\n      logE(TAG, \"eglCreateWindowSurface has thrown an exception:\\n${e.localizedMessage}\")\n      return eglNoSurface\n    }\n  }\n\n  /**\n   * Creates an EGL surface associated with an offscreen buffer.\n   */\n  fun createOffscreenSurface(width: Int, height: Int): EGLSurface {\n    val surfaceAttribs =\n      intArrayOf(EGL14.EGL_WIDTH, width, EGL14.EGL_HEIGHT, height, EGL14.EGL_NONE)\n    val eglSurface = EGL14.eglCreatePbufferSurface(\n      /* dpy = */ eglDisplay,\n      /* config = */ eglConfig,\n      /* attrib_list = */ surfaceAttribs,\n      /* offset = */ 0,\n    )\n    val eglCreatePbufferSurfaceError = checkEglErrorAndNotify(\"eglCreatePbufferSurface\")\n    if (eglCreatePbufferSurfaceError != null || eglSurface == null) {\n      return eglNoSurface\n    }\n    logD(TAG, \"Created PBuffer, w = $width, h = $height\")\n    return eglSurface\n  }\n\n  /**\n   * Makes no context current.\n   */\n  fun makeNothingCurrent(): Boolean {\n    if (!EGL14.eglMakeCurrent(\n        /* dpy = */ eglDisplay,\n        /* draw = */ EGL14.EGL_NO_SURFACE,\n        /* read = */ EGL14.EGL_NO_SURFACE,\n        /* ctx = */ EGL14.EGL_NO_CONTEXT\n      )\n    ) {\n      checkEglErrorAndNotify(\"makeNothingCurrent\")\n      return false\n    }\n    return true\n  }\n\n  /**\n   * Makes our EGL context current, using the supplied surface for both \"draw\" and \"read\".\n   */\n  fun makeCurrent(eglSurface: EGLSurface): Boolean {\n    // do nothing if current context is applied before\n    if (EGL14.eglGetCurrentContext() == eglContext) {\n      return true\n    }\n    if (eglDisplay == EGL14.EGL_NO_DISPLAY) {\n      logI(TAG, \"NOTE: makeCurrent but eglDisplay is EGL_NO_DISPLAY\")\n    }\n    if (!EGL14.eglMakeCurrent(\n        /* dpy = */ eglDisplay,\n        /* draw = */ eglSurface,\n        /* read = */ eglSurface,\n        /* ctx = */ eglContext\n      )\n    ) {\n      checkEglErrorAndNotify(\"eglMakeCurrent\")\n      return false\n    }\n    return true\n  }\n\n  /**\n   * Calls eglSwapBuffers. Use this to \"publish\" the current frame.\n   */\n  fun swapBuffers(eglSurface: EGLSurface): Int {\n    val swapStatus = EGL14.eglSwapBuffers(eglDisplay, eglSurface)\n    if (!swapStatus) {\n      return EGL14.eglGetError()\n    }\n    return EGL14.EGL_SUCCESS\n  }\n\n  internal fun addRendererStateListener(listener: RendererSetupErrorListener) {\n    rendererSetupErrorListenerSet.add(listener)\n    if (accumulatedRendererErrorList.isNotEmpty()) {\n      val immutableCopy = LinkedList(accumulatedRendererErrorList)\n      mainHandler.post {\n        immutableCopy.forEach { error ->\n          listener.onError(error)\n        }\n      }\n    }\n  }\n\n  internal fun removeRendererStateListener(listener: RendererSetupErrorListener) {\n    rendererSetupErrorListenerSet.remove(listener)\n  }\n\n  internal fun clearRendererStateListeners() {\n    accumulatedRendererErrorList.clear()\n    rendererSetupErrorListenerSet.clear()\n  }\n\n  private fun checkEglErrorAndNotify(functionName: String): Int? {\n    val eglError = checkEglError(functionName)\n    if (eglError != null) {\n      val mappedError = if (eglError == EGL14.EGL_BAD_ALLOC)\n        RendererError.OUT_OF_MEMORY\n      else\n        RendererError(eglError)\n      logE(TAG, \"EGL error ${mappedError.eglErrorCode} occurred for $functionName!\")\n      notifyListeners(mappedError)\n    }\n    return eglError\n  }\n\n  private fun checkEglError(msg: String): Int? {\n    val error = EGL14.eglGetError()\n    if (error != EGL14.EGL_SUCCESS) {\n      logE(TAG, msg + \": EGL error: 0x${Integer.toHexString(error)}\")\n      return error\n    }\n    return null\n  }\n\n  private fun notifyListeners(error: RendererError) {\n    accumulatedRendererErrorList.add(error)\n    if (rendererSetupErrorListenerSet.isNotEmpty()) {\n      val immutableCopy = HashSet(rendererSetupErrorListenerSet)\n      mainHandler.post {\n        immutableCopy.forEach {\n          it.onError(error)\n        }\n      }\n    }\n  }\n\n  private companion object {\n    private val attribsEgl3 = intArrayOf(EGL14.EGL_CONTEXT_CLIENT_VERSION, 3, EGL14.EGL_NONE)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/gl/GlUtils.kt",
    "content": "package com.mapbox.maps.renderer.gl\n\nimport android.opengl.GLES20\nimport android.opengl.Matrix\nimport com.mapbox.maps.BuildConfig\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport java.nio.FloatBuffer\n\ninternal object GlUtils {\n\n  fun FloatArray.put(vararg values: Float) {\n    values.forEachIndexed { index, value ->\n      this[index] = value\n    }\n  }\n\n  fun FloatBuffer.put(vararg values: Float) {\n    rewind()\n    values.forEach { value ->\n      this.put(value)\n    }\n    rewind()\n  }\n\n  fun FloatArray.toFloatBuffer(): FloatBuffer = ByteBuffer.allocateDirect(size * 4)\n    .order(ByteOrder.nativeOrder())\n    .asFloatBuffer().also {\n      it.put(this@toFloatBuffer)\n      it.rewind()\n    }\n\n  /**\n   * @param type GLES20.GL_VERTEX_SHADER or GLES20.GL_FRAGMENT_SHADER\n   */\n  fun loadShader(type: Int, shaderCode: String) =\n    GLES20.glCreateShader(type).also { shader ->\n      GLES20.glShaderSource(shader, shaderCode)\n      GLES20.glCompileShader(shader)\n    }\n\n  // We inline this function so in release flavour it is completely removed and no call is done\n  @Suppress(\"NOTHING_TO_INLINE\")\n  inline fun checkError(cmd: String? = null) {\n    if (BuildConfig.DEBUG) {\n      throwIfError(cmd)\n    }\n  }\n\n  private fun throwIfError(cmd: String?) {\n    when (val error = GLES20.glGetError()) {\n      GLES20.GL_NO_ERROR -> {}\n      else -> throw java.lang.RuntimeException(\n        \"$cmd - error in GL : ${\n          when (error) {\n            GLES20.GL_INVALID_ENUM -> \"GL_INVALID_ENUM\"\n            GLES20.GL_INVALID_VALUE -> \"GL_INVALID_VALUE\"\n            GLES20.GL_INVALID_OPERATION -> \"GL_INVALID_OPERATION\"\n            GLES20.GL_INVALID_FRAMEBUFFER_OPERATION -> \"GL_INVALID_FRAMEBUFFER_OPERATION\"\n            GLES20.GL_OUT_OF_MEMORY -> \"GL_OUT_OF_MEMORY\"\n            else -> error\n          }\n        }\"\n      )\n    }\n  }\n\n  fun checkCompileStatus(shader: Int) {\n    if (BuildConfig.DEBUG) {\n      val isCompiled = IntArray(1)\n      GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, isCompiled, 0)\n      if (isCompiled[0] == GLES20.GL_FALSE) {\n        val infoLog = GLES20.glGetShaderInfoLog(shader)\n        throw RuntimeException(\"checkCompileStatus error: $infoLog\")\n      }\n    }\n  }\n\n  fun getIdentityMatrix(): FloatArray = FloatArray(16).also { Matrix.setIdentityM(it, 0) }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/gl/PixelReader.kt",
    "content": "package com.mapbox.maps.renderer.gl\n\nimport android.annotation.SuppressLint\nimport android.opengl.GLES20\nimport android.opengl.GLES30\nimport android.os.Build\nimport androidx.annotation.ChecksSdkIntAtLeast\nimport androidx.annotation.RequiresApi\nimport androidx.annotation.RestrictTo\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport java.nio.IntBuffer\n\n/**\n * Designed to perform pixel reading via `glReadPixels` in the most optimal way:\n *\n * 1. By using canonical `glReadPixels` on older devices.\n * 2. By using single PBO with `glReadPixels` on newer devices in order not to block GPU pipeline.\n *\n * Inspired by http://www.songho.ca/opengl/gl_pbo.html\n *\n * @param width width in pixels to read\n * @param height height in pixels to read\n * @param legacyMode if true we read pixels without using PBO (use glReadPixels).\n *  Otherwise, we use PBO for faster reading if it is supported.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class PixelReader(\n  val width: Int,\n  val height: Int,\n  val legacyMode: Boolean,\n) {\n  @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.N)\n  private val supportsPbo: Boolean = if (legacyMode)\n    false\n  else\n    Build.VERSION.SDK_INT >= Build.VERSION_CODES.N\n\n  private val bufferSize = width * height * channelNum\n  private var buffer = ByteBuffer\n    .allocateDirect(bufferSize)\n    .order(ByteOrder.nativeOrder())\n  private val idsPbo = intArrayOf(0)\n\n  init {\n    if (supportsPbo) {\n      GLES30.glGenBuffers(idsPbo.size, idsPbo, 0)\n      GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, idsPbo[0])\n      GLES30.glBufferData(\n        GLES30.GL_PIXEL_PACK_BUFFER,\n        bufferSize,\n        null,\n        GLES30.GL_STREAM_READ\n      )\n      GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0)\n    }\n  }\n\n  @RequiresApi(Build.VERSION_CODES.N)\n  private fun readPixelsWithPBO() {\n    GLES30.glReadBuffer(GLES30.GL_FRONT)\n    GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, idsPbo[0])\n    GLES30.glReadPixels(\n      0, 0, width, height,\n      GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, 0\n    )\n    val bufferData = GLES30.glMapBufferRange(\n      GLES30.GL_PIXEL_PACK_BUFFER,\n      0,\n      bufferSize,\n      GLES30.GL_MAP_READ_BIT\n    )\n    if (bufferData != null) {\n      buffer = (bufferData as ByteBuffer).order(ByteOrder.nativeOrder())\n      GLES30.glUnmapBuffer(GLES30.GL_PIXEL_PACK_BUFFER)\n    }\n    GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0)\n  }\n\n  @SuppressLint(\"NewApi\")\n  fun readPixels(): ByteBuffer {\n    buffer.rewind()\n    if (supportsPbo) {\n      readPixelsWithPBO()\n    } else {\n      GLES20.glReadPixels(\n        0, 0, width, height,\n        GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer\n      )\n    }\n    return buffer\n  }\n\n  fun release() {\n    if (supportsPbo) {\n      GLES30.glDeleteBuffers(idsPbo.size, IntBuffer.wrap(idsPbo))\n    }\n  }\n\n  private companion object {\n    // currently support just RGBA\n    private const val channelNum = 4\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/gl/TextureRenderer.kt",
    "content": "package com.mapbox.maps.renderer.gl\n\nimport android.opengl.GLES20\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.renderer.gl.GlUtils.toFloatBuffer\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class TextureRenderer(\n  private val depth: Float = 0f\n) {\n\n  private var program: Int = 0\n  private var attributePosition: Int = 0\n  private var attributeTextureCoord: Int = 0\n  private var uniformTexture: Int = 0\n  private var vbo: IntArray = IntArray(2)\n\n  private fun prepare() {\n    setupVbo(\n      vertexArray = floatArrayOf(\n        -1f, -1f, depth,\n        1f, -1f, depth,\n        -1f, 1f, depth,\n        1f, 1f, depth,\n      ),\n      textureArray = floatArrayOf(\n        0f, 0f,\n        1f, 0f,\n        0f, 1f,\n        1f, 1f,\n      )\n    )\n\n    val vertexShader = GlUtils.loadShader(\n      GLES20.GL_VERTEX_SHADER,\n      VERTEX_SHADER_CODE\n    ).also(GlUtils::checkCompileStatus)\n\n    val fragmentShader = GlUtils.loadShader(\n      GLES20.GL_FRAGMENT_SHADER,\n      FRAGMENT_SHADER_CODE\n    ).also(GlUtils::checkCompileStatus)\n\n    program = GLES20.glCreateProgram().also {\n      GlUtils.checkError(\"glCreateProgram\")\n      GLES20.glAttachShader(it, vertexShader)\n      GlUtils.checkError(\"glAttachShader\")\n\n      GLES20.glAttachShader(it, fragmentShader)\n      GlUtils.checkError(\"glAttachShader\")\n\n      GLES20.glLinkProgram(it)\n      GlUtils.checkError(\"glLinkProgram\")\n    }\n    attributePosition = GLES20.glGetAttribLocation(program, \"aPosition\")\n    attributeTextureCoord = GLES20.glGetAttribLocation(program, \"aTexCoord\")\n\n    uniformTexture = GLES20.glGetUniformLocation(program, \"uTexture\")\n  }\n\n  fun render(textureID: Int) {\n    if (program == 0) {\n      prepare()\n    }\n    GLES20.glUseProgram(program)\n    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[0])\n    GLES20.glVertexAttribPointer(\n      attributePosition,\n      COORDS_PER_VERTEX,\n      GLES20.GL_FLOAT,\n      false,\n      VERTEX_STRIDE,\n      0\n    )\n    GLES20.glEnableVertexAttribArray(attributePosition)\n    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[1])\n    GLES20.glVertexAttribPointer(\n      attributeTextureCoord,\n      COORDS_PER_TEX,\n      GLES20.GL_FLOAT,\n      false,\n      TEX_STRIDE,\n      0\n    )\n    GLES20.glEnableVertexAttribArray(attributeTextureCoord)\n\n    GLES20.glActiveTexture(GLES20.GL_TEXTURE0)\n    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID)\n    GLES20.glUniform1i(uniformTexture, 0)\n\n    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, VERTEX_COUNT)\n\n    GLES20.glDisableVertexAttribArray(attributePosition)\n    GLES20.glDisableVertexAttribArray(attributeTextureCoord)\n    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0)\n    GLES20.glUseProgram(0)\n  }\n\n  fun release() {\n    if (program != 0) {\n      GLES20.glDeleteBuffers(vbo.size, vbo, 0)\n      GLES20.glDeleteProgram(program)\n      program = 0\n    }\n  }\n\n  private fun setupVbo(vertexArray: FloatArray, textureArray: FloatArray) {\n    GLES20.glGenBuffers(2, vbo, 0)\n    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[0])\n    GLES20.glBufferData(\n      GLES20.GL_ARRAY_BUFFER,\n      vertexArray.size * BYTES_PER_FLOAT,\n      vertexArray.toFloatBuffer(),\n      GLES20.GL_STATIC_DRAW\n    )\n    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[1])\n    GLES20.glBufferData(\n      GLES20.GL_ARRAY_BUFFER,\n      textureArray.size * BYTES_PER_FLOAT,\n      textureArray.toFloatBuffer(),\n      GLES20.GL_STATIC_DRAW\n    )\n    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0)\n  }\n\n  private companion object {\n    const val COORDS_PER_VERTEX = 3\n    const val COORDS_PER_TEX = 2\n    const val BYTES_PER_FLOAT = 4\n    const val VERTEX_STRIDE = COORDS_PER_VERTEX * BYTES_PER_FLOAT\n    const val TEX_STRIDE = COORDS_PER_TEX * BYTES_PER_FLOAT\n    const val VERTEX_COUNT = 4\n\n    val VERTEX_SHADER_CODE = \"\"\"\n        precision highp float;\n        attribute vec4 aPosition;\n        attribute vec2 aTexCoord;\n        varying vec2 vTexCoord;\n        void main()\n        {\n            gl_Position = aPosition;\n            vTexCoord = aTexCoord;\n        }\n    \"\"\".trimIndent()\n\n    val FRAGMENT_SHADER_CODE = \"\"\"\n        precision mediump float;\n        varying vec2 vTexCoord;\n        uniform sampler2D uTexture;\n        void main()\n        {\n            gl_FragColor = texture2D(uTexture, vTexCoord);\n        }\n    \"\"\".trimIndent()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/widget/BitmapWidget.kt",
    "content": "package com.mapbox.maps.renderer.widget\n\nimport android.graphics.Bitmap\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Widget displaying bitmap within specified position and margins.\n *\n * @param bitmap bitmap used to draw widget\n * @param originalPosition position of widget\n */\n@MapboxExperimental\nopen class BitmapWidget @JvmOverloads constructor(\n  bitmap: Bitmap,\n  private val originalPosition: WidgetPosition = WidgetPosition {\n    verticalAlignment = WidgetPosition.Vertical.TOP\n    horizontalAlignment = WidgetPosition.Horizontal.LEFT\n    offsetX = 0f\n    offsetY = 0f\n  }\n) : Widget() {\n  /**\n   * The deprecated constructor for BitmapWidget.\n   *\n   * @param bitmap bitmap used to draw widget\n   * @param position position of widget\n   * @param marginX horizontal margin in pixels\n   * @param marginY vertical margin in pixels\n   */\n  @Deprecated(\n    message = \"Constructor with margins is deprecated, the offset parameters has been merged into \" +\n      \"the WidgetPosition class, and the legacy constructor might be removed in future releases.\",\n    replaceWith = ReplaceWith(\"BitmapWidget(context, position)\")\n  )\n  constructor(\n    bitmap: Bitmap,\n    @Suppress(\"DEPRECATION\")\n    position: WidgetPosition = WidgetPosition(\n      vertical = WidgetPosition.Vertical.TOP,\n      horizontal = WidgetPosition.Horizontal.LEFT,\n    ),\n    marginX: Float = 0f,\n    marginY: Float = 0f,\n  ) : this(\n    bitmap = bitmap,\n    originalPosition = WidgetPosition {\n      horizontalAlignment = position.horizontalAlignment\n      verticalAlignment = position.verticalAlignment\n      offsetX = when (position.horizontalAlignment) {\n        // as the WidgetPosition.offsetX now uses the absolute direction towards the right of the\n        // screen, and for marginX we move the widget towards opposite of the horizontal alignment,\n        // we need to flip the sign when horizontal alignment is set to RIGHT.\n        WidgetPosition.Horizontal.LEFT, WidgetPosition.Horizontal.CENTER -> marginX\n        WidgetPosition.Horizontal.RIGHT -> -marginX\n      }\n      offsetY = when (position.verticalAlignment) {\n        // as the WidgetPosition.offsetY now uses the absolute direction towards the bottom of the\n        // screen, and for marginY we move the widget towards opposite of the vertical alignment,\n        // we need to flip the sign when vertical alignment is set to BOTTOM.\n        WidgetPosition.Vertical.TOP, WidgetPosition.Vertical.CENTER -> marginY\n        WidgetPosition.Vertical.BOTTOM -> -marginY\n      }\n    }\n  )\n\n  /**\n   * The deprecated constructor for BitmapWidget.\n   *\n   * @param bitmap bitmap used to draw widget\n   * @param position position of widget\n   * @param marginX horizontal margin in pixels\n   */\n  @Suppress(\"DEPRECATION\")\n  @Deprecated(\n    message = \"Constructor with margins is deprecated, the offset parameters has been merged into \" +\n      \"the WidgetPosition class, and the legacy constructor might be removed in future releases.\",\n    replaceWith = ReplaceWith(\"BitmapWidget(context, position)\")\n  )\n  constructor(\n    bitmap: Bitmap,\n    @Suppress(\"DEPRECATION\")\n    position: WidgetPosition = WidgetPosition(\n      vertical = WidgetPosition.Vertical.TOP,\n      horizontal = WidgetPosition.Horizontal.LEFT,\n    ),\n    marginX: Float = 0f,\n  ) : this(bitmap, position, marginX, 0f)\n\n  override val renderer = BitmapWidgetRenderer(\n    bitmap = bitmap,\n    position = originalPosition\n  )\n\n  /**\n   * Update bitmap widget uses.\n   *\n   * @param bitmap the new Bitmap to render in the Widget.\n   */\n  fun updateBitmap(bitmap: Bitmap) {\n    renderer.updateBitmap(bitmap)\n    triggerRepaint()\n  }\n\n  /**\n   * Update the widget to the new position.\n   */\n  override fun setPosition(widgetPosition: WidgetPosition) {\n    renderer.setPosition(widgetPosition)\n    triggerRepaint()\n  }\n\n  /**\n   * Get the current position of the widget.\n   */\n  override fun getPosition() = renderer.getPosition()\n\n  /**\n   * Set the absolute rotation of widget in degrees.\n   */\n  override fun setRotation(angleDegrees: Float) {\n    renderer.setRotation(angleDegrees = angleDegrees)\n    triggerRepaint()\n  }\n\n  /**\n   * Get absolute rotation of widget in degrees.\n   */\n  override fun getRotation(): Float = renderer.getRotation()\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/widget/BitmapWidgetRenderer.kt",
    "content": "package com.mapbox.maps.renderer.widget\n\nimport android.graphics.Bitmap\nimport android.opengl.GLES20\nimport android.opengl.GLUtils\nimport android.opengl.Matrix\nimport androidx.annotation.AnyThread\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.renderer.RenderThread\nimport com.mapbox.maps.renderer.gl.GlUtils\nimport com.mapbox.maps.renderer.gl.GlUtils.put\nimport com.mapbox.maps.renderer.gl.GlUtils.toFloatBuffer\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.concurrent.withLock\n\n@OptIn(MapboxExperimental::class)\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class BitmapWidgetRenderer(\n  // Bitmap is retained throughout BitmapWidgetRenderer lifetime.\n  private var bitmap: Bitmap?,\n  @Volatile\n  private var position: WidgetPosition\n) : WidgetRenderer {\n\n  /**\n   * Needed to synchronize setting data (translation, rotation, updating bitmap) from any thread (most likely main)\n   * and rendering it using Mapbox render thread.\n   */\n  private val lock = ReentrantLock()\n\n  private var halfBitmapWidth = (bitmap?.width ?: 0) / 2f\n  private var halfBitmapHeight = (bitmap?.height ?: 0) / 2f\n\n  private var surfaceWidth = 0\n  private var surfaceHeight = 0\n\n  private var program = 0\n  private var vertexShader = 0\n  private var fragmentShader = 0\n\n  private var attributeVertexPosition = 0\n  private var attributeTexturePosition = 0\n  private var uniformTexture = 0\n  private var uniformMvpMatrix = 0\n  private val textures = intArrayOf(0)\n\n  private var screenMatrix = FloatArray(16)\n  private var translateRotate = FloatArray(16)\n  private val rotationMatrix = GlUtils.getIdentityMatrix()\n  private val translateMatrix = GlUtils.getIdentityMatrix()\n  private val mvpMatrix = GlUtils.getIdentityMatrix()\n  private val mvpMatrixBuffer = mvpMatrix.toFloatBuffer()\n\n  private var updateBitmap: Boolean = true\n  private var updateMatrix: Boolean = true\n\n  private val vertexPositionBuffer = FloatArray(8).toFloatBuffer()\n  private val texturePositionBuffer = floatArrayOf(\n    0f, 0f,\n    0f, 1f,\n    1f, 0f,\n    1f, 1f\n  ).toFloatBuffer()\n\n  @Volatile\n  private var rotationDegrees = 0F\n\n  @set:AnyThread\n  @get:AnyThread\n  override var needRender: Boolean = true\n\n  @RenderThread\n  override fun onSurfaceChanged(width: Int, height: Int) {\n    lock.withLock {\n      surfaceWidth = width\n      surfaceHeight = height\n\n      // transforms from (0,0) - (width, height) in screen pixels\n      // to (-1, -1) - (1, 1) for GL\n      screenMatrix.put(\n        2f / width, 0f, 0f, 0f,\n        0f, -2f / height, 0f, 0f,\n        0f, 0f, 0f, 0f,\n        -1f, 1f, 0f, 1f\n      )\n\n      updateVertexBuffer()\n      updateTranslateMatrix()\n    }\n  }\n\n  private fun updateVertexBuffer() {\n    // in pixels, (-bitmapWidth / 2, -bitmapHeight/2) - (bitmapWidth / 2, bitmapHeight/2)\n    vertexPositionBuffer.put(\n      -halfBitmapWidth, -halfBitmapHeight,\n      -halfBitmapWidth, halfBitmapHeight,\n      halfBitmapWidth, -halfBitmapHeight,\n      halfBitmapWidth, halfBitmapHeight\n    )\n  }\n\n  private fun topY() = position.offsetY + when (position.verticalAlignment) {\n    WidgetPosition.Vertical.TOP -> halfBitmapHeight\n    WidgetPosition.Vertical.CENTER -> surfaceHeight.toFloat() / 2\n    WidgetPosition.Vertical.BOTTOM -> surfaceHeight.toFloat() - halfBitmapHeight\n  }\n\n  private fun leftX() = position.offsetX + when (position.horizontalAlignment) {\n    WidgetPosition.Horizontal.LEFT -> halfBitmapWidth\n    WidgetPosition.Horizontal.CENTER -> surfaceWidth.toFloat() / 2\n    WidgetPosition.Horizontal.RIGHT -> surfaceWidth.toFloat() - halfBitmapWidth\n  }\n\n  @RenderThread\n  override fun prepare() {\n    lock.withLock {\n      val maxAttrib = IntArray(1)\n      GLES20.glGetIntegerv(GLES20.GL_MAX_VERTEX_ATTRIBS, maxAttrib, 0)\n\n      vertexShader = GlUtils.loadShader(\n        GLES20.GL_VERTEX_SHADER,\n        VERTEX_SHADER_CODE\n      ).also(GlUtils::checkCompileStatus)\n\n      fragmentShader = GlUtils.loadShader(\n        GLES20.GL_FRAGMENT_SHADER,\n        FRAGMENT_SHADER_CODE\n      ).also(GlUtils::checkCompileStatus)\n\n      program = GLES20.glCreateProgram().also { program ->\n        GlUtils.checkError(\"glCreateProgram\")\n\n        GLES20.glAttachShader(program, vertexShader)\n        GlUtils.checkError(\"glAttachShader\")\n\n        GLES20.glAttachShader(program, fragmentShader)\n        GlUtils.checkError(\"glAttachShader\")\n\n        GLES20.glLinkProgram(program)\n        GlUtils.checkError(\"glLinkProgram\")\n      }\n\n      uniformMvpMatrix =\n        GLES20.glGetUniformLocation(program, \"uMvpMatrix\")\n      GlUtils.checkError(\"glGetUniformLocation\")\n\n      attributeVertexPosition =\n        GLES20.glGetAttribLocation(program, \"aPosition\")\n      GlUtils.checkError(\"glGetAttribLocation\")\n\n      attributeTexturePosition =\n        GLES20.glGetAttribLocation(program, \"aCoordinate\")\n      GlUtils.checkError(\"glGetAttribLocation\")\n\n      uniformTexture =\n        GLES20.glGetUniformLocation(program, \"uTexture\")\n      GlUtils.checkError(\"glGetUniformLocation\")\n\n      needRender = true\n      updateBitmap = true\n    }\n  }\n\n  @RenderThread\n  override fun render() {\n    lock.withLock {\n      if (program == 0) {\n        prepare()\n      }\n      GLES20.glUseProgram(program)\n      GlUtils.checkError(\"glUseProgram\")\n\n      if (updateMatrix) {\n        Matrix.setIdentityM(mvpMatrix, 0)\n\n        Matrix.multiplyMM(translateRotate, 0, translateMatrix, 0, rotationMatrix, 0)\n        Matrix.multiplyMM(mvpMatrix, 0, screenMatrix, 0, translateRotate, 0)\n\n        mvpMatrixBuffer.rewind()\n        mvpMatrixBuffer.put(mvpMatrix)\n        mvpMatrixBuffer.rewind()\n\n        updateMatrix = false\n      }\n\n      GLES20.glUniformMatrix4fv(uniformMvpMatrix, 1, false, mvpMatrixBuffer)\n\n      textureFromBitmapIfChanged()\n\n      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0])\n\n      GLES20.glUniform1i(uniformTexture, 0)\n\n      GLES20.glEnableVertexAttribArray(attributeVertexPosition)\n      GlUtils.checkError(\"glEnableVertexAttribArray\")\n\n      GLES20.glVertexAttribPointer(\n        attributeVertexPosition, COORDS_PER_VERTEX,\n        GLES20.GL_FLOAT, false,\n        VERTEX_STRIDE, vertexPositionBuffer\n      )\n      GlUtils.checkError(\"glVertexAttribPointer\")\n\n      GLES20.glEnableVertexAttribArray(attributeTexturePosition)\n      GlUtils.checkError(\"glEnableVertexAttribArray\")\n\n      GLES20.glVertexAttribPointer(\n        attributeTexturePosition, COORDS_PER_VERTEX,\n        GLES20.GL_FLOAT, false,\n        VERTEX_STRIDE, texturePositionBuffer\n      )\n      GlUtils.checkError(\"glVertexAttribPointer\")\n\n      GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, VERTEX_COUNT)\n      GlUtils.checkError(\"glDrawArrays\")\n\n      GLES20.glDisableVertexAttribArray(attributeVertexPosition)\n      GLES20.glDisableVertexAttribArray(attributeTexturePosition)\n      GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0)\n      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0)\n      GLES20.glUseProgram(0)\n\n      needRender = false\n    }\n  }\n\n  @RenderThread\n  override fun release() {\n    lock.withLock {\n      if (program != 0) {\n        GLES20.glDisableVertexAttribArray(attributeVertexPosition)\n        GLES20.glDetachShader(program, vertexShader)\n        GLES20.glDetachShader(program, fragmentShader)\n        GLES20.glDeleteShader(vertexShader)\n        GLES20.glDeleteShader(fragmentShader)\n        GLES20.glDeleteTextures(textures.size, textures, 0)\n        textures[0] = 0\n        GLES20.glDeleteProgram(program)\n        program = 0\n      }\n      needRender = false\n    }\n  }\n\n  /**\n   * Updates texture from bitmap once.\n   */\n  private fun textureFromBitmapIfChanged() {\n    if (updateBitmap && bitmap != null) {\n      if (textures[0] == 0) {\n        GLES20.glGenTextures(1, textures, 0)\n      }\n      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0])\n      GLES20.glTexParameterf(\n        GLES20.GL_TEXTURE_2D,\n        GLES20.GL_TEXTURE_MIN_FILTER,\n        GLES20.GL_NEAREST.toFloat()\n      )\n      GLES20.glTexParameterf(\n        GLES20.GL_TEXTURE_2D,\n        GLES20.GL_TEXTURE_MAG_FILTER,\n        GLES20.GL_LINEAR.toFloat()\n      )\n      GLES20.glTexParameterf(\n        GLES20.GL_TEXTURE_2D,\n        GLES20.GL_TEXTURE_WRAP_S,\n        GLES20.GL_CLAMP_TO_EDGE.toFloat()\n      )\n      GLES20.glTexParameterf(\n        GLES20.GL_TEXTURE_2D,\n        GLES20.GL_TEXTURE_WRAP_T,\n        GLES20.GL_CLAMP_TO_EDGE.toFloat()\n      )\n      GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0)\n      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0)\n\n      updateBitmap = false\n    }\n  }\n\n  @AnyThread\n  fun updateBitmap(bitmap: Bitmap) {\n    lock.withLock {\n      this.bitmap = bitmap\n      this.halfBitmapWidth = bitmap.width / 2f\n      this.halfBitmapHeight = bitmap.height / 2f\n      updateTranslateMatrix()\n      updateVertexBuffer()\n      updateBitmap = true\n      updateMatrix = true\n      needRender = true\n    }\n  }\n\n  @AnyThread\n  override fun setRotation(angleDegrees: Float) {\n    lock.withLock {\n      rotationDegrees = angleDegrees\n      Matrix.setIdentityM(rotationMatrix, 0)\n      Matrix.setRotateM(rotationMatrix, 0, angleDegrees, 0f, 0f, 1f)\n      updateMatrix = true\n      needRender = true\n    }\n  }\n\n  @AnyThread\n  override fun getRotation(): Float {\n    return rotationDegrees\n  }\n\n  @AnyThread\n  override fun setPosition(widgetPosition: WidgetPosition) {\n    lock.withLock {\n      this.position = widgetPosition\n      updateTranslateMatrix()\n    }\n  }\n\n  @AnyThread\n  override fun getPosition(): WidgetPosition {\n    return position\n  }\n\n  private fun updateTranslateMatrix() {\n    Matrix.setIdentityM(translateMatrix, 0)\n    Matrix.translateM(\n      translateMatrix,\n      0,\n      leftX(),\n      topY(),\n      0f\n    )\n\n    updateMatrix = true\n    needRender = true\n  }\n\n  private companion object {\n    const val COORDS_PER_VERTEX = 2\n    const val BYTES_PER_FLOAT = 4\n    const val VERTEX_STRIDE = COORDS_PER_VERTEX * BYTES_PER_FLOAT\n    const val VERTEX_COUNT = 4\n\n    val VERTEX_SHADER_CODE = \"\"\"\n      precision highp float;\n      uniform mat4 uMvpMatrix;\n      attribute vec2 aPosition;\n      attribute vec2 aCoordinate;\n      varying vec2 vCoordinate;\n      void main() {\n        vCoordinate = aCoordinate;\n        gl_Position = uMvpMatrix * vec4(aPosition, 0.0, 1.0);\n      }\n    \"\"\".trimIndent()\n\n    val FRAGMENT_SHADER_CODE = \"\"\"\n      precision mediump float;\n      uniform sampler2D uTexture;\n      varying vec2 vCoordinate;\n      void main() {\n        gl_FragColor = texture2D(uTexture, vCoordinate);\n      }\n    \"\"\".trimIndent()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/widget/Widget.kt",
    "content": "package com.mapbox.maps.renderer.widget\n\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Base class for widgets displayed on top of the map.\n */\n@MapboxExperimental\nabstract class Widget internal constructor() {\n  internal abstract val renderer: WidgetRenderer\n  private var triggerRepaintAction: (() -> Unit)? = null\n\n  /**\n   * Triggers a repaint of the widget, as well as the map.\n   * It will do nothing if the widget has not been added to the map.\n   */\n  @JvmSynthetic\n  internal fun triggerRepaint() {\n    triggerRepaintAction?.invoke()\n  }\n\n  /**\n   * Update the widget to the new position.\n   */\n  abstract fun setPosition(widgetPosition: WidgetPosition)\n\n  /**\n   * Get the current position of the widget.\n   */\n  abstract fun getPosition(): WidgetPosition\n\n  /**\n   * Set the absolute rotation of widget in degrees.\n   */\n  abstract fun setRotation(angleDegrees: Float)\n\n  /**\n   * Get absolute rotation of widget in degrees.\n   */\n  abstract fun getRotation(): Float\n\n  @JvmSynthetic\n  internal fun setTriggerRepaintAction(action: (() -> Unit)?) {\n    triggerRepaintAction = action\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/widget/WidgetPosition.kt",
    "content": "package com.mapbox.maps.renderer.widget\n\nimport com.mapbox.maps.MapboxExperimental\nimport java.util.Objects\n\n/**\n * Specifies widget position relative to the map.\n *\n * @property horizontalAlignment the horizontal position relative to the map.\n * @property verticalAlignment the vertical position relative to the map.\n * @property offsetX the horizontal offset in pixels towards the right of the map.\n * @property offsetY the vertical offset in pixels towards the bottom of the map.\n */\n@MapboxExperimental\nclass WidgetPosition private constructor(\n  val horizontalAlignment: Horizontal,\n  val verticalAlignment: Vertical,\n  val offsetX: Float,\n  val offsetY: Float\n) {\n  /**\n   * Deprecated constructor for WidgetPosition.\n   *\n   * @param horizontal the horizontal position relative to the map.\n   * @param vertical the vertical position relative to the map.\n   */\n  @Deprecated(\n    message = \"Direct constructor of WidgetPosition is deprecated, and might be removed in future releases.\",\n    replaceWith = ReplaceWith(\"WidgetPosition.Builder()\")\n  )\n  constructor(horizontal: Horizontal, vertical: Vertical) : this(horizontal, vertical, 0f, 0f)\n\n  /**\n   * The horizontal position relative to the map.\n   */\n  @Deprecated(\n    message = \"horizontal has been renamed to horizontalAlignment, and might be removed in future releases.\",\n    replaceWith = ReplaceWith(\"horizontalAlignment\")\n  )\n  val horizontal = horizontalAlignment\n\n  /**\n   * The vertical position relative to the map.\n   */\n  @Deprecated(\n    message = \"vertical has been renamed to verticalAlignment, and might be removed in future releases.\",\n    replaceWith = ReplaceWith(\"verticalAlignment\")\n  )\n  val vertical = verticalAlignment\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString(): String =\n    \"WidgetPosition(horizontalAlignment=$horizontalAlignment,verticalAlignment=$verticalAlignment,offsetX=$offsetX,offsetY=$offsetY)\"\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?): Boolean = other is WidgetPosition &&\n    horizontalAlignment == other.horizontalAlignment &&\n    verticalAlignment == other.verticalAlignment &&\n    offsetX.compareTo(other.offsetX) == 0 &&\n    offsetY.compareTo(other.offsetY) == 0\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode(): Int = Objects.hash(\n    horizontalAlignment,\n    verticalAlignment,\n    offsetX,\n    offsetY\n  )\n\n  /**\n   * Builder for WidgetPosition class.\n   *\n   * @property horizontalAlignment the horizontal position relative to the map, defaults to [Horizontal.LEFT].\n   * @property verticalAlignment the vertical position relative to the map, defaults to [Vertical.TOP].\n   * @property offsetX the horizontal offset in pixels towards the right of the map, defaults to 0.\n   * @property offsetY the vertical offset in pixels towards the bottom of the map, defaults to 0.\n   */\n  class Builder {\n    @set:JvmSynthetic\n    var horizontalAlignment: Horizontal = Horizontal.LEFT\n\n    @set:JvmSynthetic\n    var verticalAlignment: Vertical = Vertical.TOP\n\n    @set:JvmSynthetic\n    var offsetX: Float = 0f\n\n    @set:JvmSynthetic\n    var offsetY: Float = 0f\n\n    /**\n     * Set the horizontal position, defaults to [Horizontal.LEFT].\n     */\n    fun setHorizontalAlignment(horizontalAlignment: Horizontal): Builder =\n      apply { this.horizontalAlignment = horizontalAlignment }\n\n    /**\n     * Set the vertical position, defaults to [Vertical.TOP].\n     */\n    fun setVerticalAlignment(verticalAlignment: Vertical): Builder =\n      apply { this.verticalAlignment = verticalAlignment }\n\n    /**\n     * Set the horizontal offset in pixels towards the right of the map, defaults to 0.\n     */\n    fun setOffsetX(offsetX: Float): Builder = apply { this.offsetX = offsetX }\n\n    /**\n     * Set the vertical offset in pixels towards the bottom of the map, defaults to 0.\n     */\n    fun setOffsetY(offsetY: Float): Builder = apply { this.offsetY = offsetY }\n\n    /**\n     * Build the [WidgetPosition] from the current settings.\n     */\n    fun build(): WidgetPosition =\n      WidgetPosition(horizontalAlignment, verticalAlignment, offsetX, offsetY)\n  }\n\n  /**\n   * Returns a builder that created the [WidgetPosition].\n   */\n  fun toBuilder(): Builder = Builder()\n    .setHorizontalAlignment(horizontalAlignment)\n    .setVerticalAlignment(verticalAlignment)\n    .setOffsetX(offsetX)\n    .setOffsetY(offsetY)\n\n  /**\n   * Widget position Horizontal\n   */\n  enum class Horizontal {\n    /**\n     * Left Horizontal Position\n     */\n    LEFT,\n\n    /**\n     * Center Horizontal Position\n     */\n    CENTER,\n\n    /**\n     * Right Horizontal Position\n     */\n    RIGHT,\n  }\n\n  /**\n   * Widget position Vertical\n   */\n  enum class Vertical {\n    /**\n     * Top Vertical Position\n     */\n    TOP,\n\n    /**\n     * Center Vertical Position\n     */\n    CENTER,\n\n    /**\n     * Bottom Vertical Position\n     */\n    BOTTOM,\n  }\n}\n\n/**\n * Creates a [WidgetPosition] through a DSL builder.\n *\n * @param initializer the initialisation block\n * @return [WidgetPosition]\n */\n@MapboxExperimental\n@JvmSynthetic\nfun WidgetPosition(initializer: WidgetPosition.Builder.() -> Unit): WidgetPosition {\n  return WidgetPosition.Builder().apply(initializer).build()\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/renderer/widget/WidgetRenderer.kt",
    "content": "package com.mapbox.maps.renderer.widget\n\nimport androidx.annotation.AnyThread\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.renderer.RenderThread\n\ninternal interface WidgetRenderer {\n\n  @get:AnyThread\n  val needRender: Boolean\n\n  @RenderThread\n  fun onSurfaceChanged(width: Int, height: Int)\n\n  @RenderThread\n  fun prepare()\n\n  @RenderThread\n  fun render()\n\n  @RenderThread\n  fun release()\n\n  @AnyThread\n  fun setRotation(angleDegrees: Float)\n\n  @AnyThread\n  fun getRotation(): Float\n\n  @MapboxExperimental\n  @AnyThread\n  fun setPosition(widgetPosition: WidgetPosition)\n\n  @MapboxExperimental\n  @AnyThread\n  fun getPosition(): WidgetPosition\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/viewannotation/OnViewAnnotationUpdatedListener.kt",
    "content": "package com.mapbox.maps.viewannotation\n\nimport android.view.View\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.ViewAnnotationAnchorConfig\nimport com.mapbox.maps.ViewAnnotationOptions\n\n/**\n * Interface responsible for notifying when core updated view annotation position or visibility.\n */\ninterface OnViewAnnotationUpdatedListener {\n\n  /**\n   * Callback triggered when core updated view annotation position.\n   *\n   * Note: although view has already translation updated properly prior to this callback -\n   * view could actually still not be there on the screen due to Android rendering invalidate mechanism.\n   *\n   * @param view view that is updated.\n   * @param leftTopCoordinate left-top screen coordinate of the view in pixels;\n   * both x and y may be < 0 if view does not fully fits the screen.\n   * @param width width > 0 in pixels.\n   * @param height height > 0 in pixels.\n   */\n  fun onViewAnnotationPositionUpdated(\n    view: View,\n    leftTopCoordinate: ScreenCoordinate,\n    width: Double,\n    height: Double,\n  ) = Unit\n\n  /**\n   * Callback triggered when view visibility has changed.\n   * By visibility we understand whether view is shown or hidden and that's not precisely equivalent\n   * listening to [View.getVisibility] as view may be visible but not yet shown.\n   *\n   * Note: this callback is triggered when using view annotation with not explicitly setting\n   * [ViewAnnotationOptions.visible] meaning view annotation manager handles showing / hiding automatically\n   * based on [View.getVisibility] on top of the map until it is not positioned correctly.\n   *\n   * @param view view that is updated.\n   * @param visible true when [view] is shown on top of the map\n   * and false if it's hidden either due to visibility or when it's removed from [MapView] completely.\n   */\n  fun onViewAnnotationVisibilityUpdated(\n    view: View,\n    visible: Boolean,\n  ) = Unit\n\n  /**\n   * Callback triggered when view annotation anchor coordinate has changed.\n   * When it triggers it means that view annotation is repositioned on the attached geometry.\n   *\n   * @param view view annotation that is updated.\n   * @param anchorCoordinate anchor geo coordinate.\n   */\n  fun onViewAnnotationAnchorCoordinateUpdated(\n    view: View,\n    anchorCoordinate: Point,\n  ) = Unit\n\n  /**\n   * Callback triggered when view annotation anchor has changed.\n   * When it triggers it means that view annotation placement relative to its anchor coordinate has\n   * been updated.\n   *\n   * @param view view annotation that is updated.\n   * @param anchor anchor config.\n   */\n  fun onViewAnnotationAnchorUpdated(\n    view: View,\n    anchor: ViewAnnotationAnchorConfig,\n  ) = Unit\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/viewannotation/ViewAnnotationManager.kt",
    "content": "package com.mapbox.maps.viewannotation\n\nimport android.view.View\nimport androidx.annotation.LayoutRes\nimport androidx.asynclayoutinflater.view.AsyncLayoutInflater\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.AnnotatedLayerFeature\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.ViewAnnotationOptions\n\n/**\n * Manager API to control View Annotations.\n *\n * View annotations are Android [View]s on top of the [MapView] and bound to some [Geometry] or [AnnotatedLayerFeature].\n *\n * In case some view annotations intersect on the screen Z-index is based on addition order.\n *\n * View annotations are invariant to map camera transformations however such properties as size, visibility etc\n * could be controlled by the user using update operation.\n *\n * View annotation manager instance is destroyed automatically when [MapView.onDestroy] is called.\n */\ninterface ViewAnnotationManager {\n\n  /**\n   * Specify layers that view annotations should avoid. This applies to ALL view annotations associated to any layer.\n   * The API currently only supports line layers.\n   *\n   * @return A list of layer ids if there are any, empty set otherwise.\n   */\n  @MapboxExperimental\n  var viewAnnotationAvoidLayers: HashSet<String>\n\n  /**\n   * Add view annotation inflated from [resId] synchronously.\n   *\n   * Annotation [options] must include Geometry where we want to bind our view annotation.\n   *\n   * Width and height could be specified explicitly but better idea will be not specifying them\n   * as they will be calculated automatically based on view layout.\n   *\n   * @param resId layout resource id\n   * @param options view annotation options\n   *\n   * @return inflated [View].\n   *\n   * @throws [RuntimeException] if options did not include geometry.\n   */\n  fun addViewAnnotation(\n    @LayoutRes resId: Int,\n    options: ViewAnnotationOptions\n  ): View\n\n  /**\n   * Add view annotation inflated from [resId] asynchronously.\n   *\n   * In order to use this function please add following [dependency](https://mvnrepository.com/artifact/androidx.asynclayoutinflater/asynclayoutinflater/1.0.0) to your project.\n   *\n   * Annotation [options] must include Geometry where we want to bind our view annotation.\n   *\n   * Width and height could be specified explicitly but better idea will be not specifying them\n   * as they will be calculated automatically based on view layout.\n   *\n   * @param resId layout resource id\n   * @param options view annotation options\n   * @param asyncInflater instance of [AsyncLayoutInflater] provided by the user\n   * @param asyncInflateCallback callback triggered when [View] is inflated.\n   *\n   * @throws [RuntimeException] if options did not include geometry.\n   */\n  fun addViewAnnotation(\n    @LayoutRes resId: Int,\n    options: ViewAnnotationOptions,\n    asyncInflater: AsyncLayoutInflater,\n    asyncInflateCallback: (View) -> Unit\n  )\n\n  /**\n   * Add annotation [View] which is already inflated.\n   * View dimensions will be taken as width / height from view's layout params\n   * unless they are not specified explicitly with [ViewAnnotationOptions.Builder.width] and [ViewAnnotationOptions.Builder.height].\n   *\n   * Annotation [options] must include Geometry where we want to bind our view annotation.\n   *\n   * Width and height could be specified explicitly but better idea will be not specifying them\n   * as they will be calculated automatically based on view layout.\n   *\n   * @param view view that was already inflated\n   * @param options view annotation options\n   *\n   * @throws [RuntimeException] if options did not include geometry.\n   */\n  fun addViewAnnotation(\n    view: View,\n    options: ViewAnnotationOptions\n  )\n\n  /**\n   * Remove given annotation [view] from the map if it was present.\n   *\n   * @return true if view was removed and false if view was not found on the map.\n   */\n  fun removeViewAnnotation(view: View): Boolean\n\n  /**\n   * Remove all view annotations.\n   */\n  fun removeAllViewAnnotations()\n\n  /**\n   * Update given view annotation [view] with [ViewAnnotationOptions].\n   * Important thing to keep in mind that only properties present in [options] will be updated,\n   * all other will remain the same as specified before.\n   *\n   * @return true if view was updated and false if view was not found on the map.\n   */\n  fun updateViewAnnotation(\n    view: View,\n    options: ViewAnnotationOptions\n  ): Boolean\n\n  /**\n   * Find [View] by annotated layer feature if it was specified as part of [ViewAnnotationOptions.getAnnotatedFeature].\n   *\n   * @return [View] if view was found and NULL otherwise.\n   */\n  fun getViewAnnotation(annotatedLayerFeature: AnnotatedLayerFeature): View?\n\n  /**\n   * Find [ViewAnnotationOptions] by annotated layer feature if it was specified as part of [ViewAnnotationOptions.getAnnotatedFeature].\n   *\n   * @return [ViewAnnotationOptions] if view was found and NULL otherwise.\n   */\n  fun getViewAnnotationOptions(annotatedLayerFeature: AnnotatedLayerFeature): ViewAnnotationOptions?\n\n  /**\n   * Get current [ViewAnnotationOptions] for given [view].\n   *\n   * @return [ViewAnnotationOptions] if view was found and NULL otherwise.\n   */\n  fun getViewAnnotationOptions(view: View): ViewAnnotationOptions?\n\n  /**\n   * Add an instance of [OnViewAnnotationUpdatedListener].\n   */\n  fun addOnViewAnnotationUpdatedListener(listener: OnViewAnnotationUpdatedListener)\n\n  /**\n   * Remove an instance of [OnViewAnnotationUpdatedListener].\n   */\n  fun removeOnViewAnnotationUpdatedListener(listener: OnViewAnnotationUpdatedListener)\n\n  /**\n   * Set view annotation update mode defined in [ViewAnnotationUpdateMode].\n   */\n  fun setViewAnnotationUpdateMode(mode: ViewAnnotationUpdateMode)\n\n  /**\n   * Get view annotation update mode.\n   */\n  fun getViewAnnotationUpdateMode(): ViewAnnotationUpdateMode\n\n  /**\n   * Return Map of added [View] with their [ViewAnnotationOptions]. This method should be called every time\n   * to get all added [View]s and associated [ViewAnnotationOptions].\n   *\n   * Note: Modifying [ViewAnnotationOptions] will not update actual annotation options. Use\n   * [ViewAnnotationManager.updateViewAnnotation] instead. Modifying [View] will update the actual view property.\n   *\n   * @return Map of [View] and associated [ViewAnnotationOptions].\n   */\n  val annotations: Map<View, ViewAnnotationOptions>\n\n  /**\n   * Return camera options bound to given view annotation list, padding, bearing and pitch values.\n   * Annotations with [ViewAnnotationOptions.visible] set to false will be excluded from the calculations of [CameraOptions].\n   * Annotations with only [View.VISIBLE] will be included in the calculations for [CameraOptions].\n   *\n   * Important: if the render thread did not yet calculate the size of the map (due to initialization or map resizing) - empty [CameraOptions] will be returned.\n   * Emptiness could be checked with [CameraOptions.isEmpty]. Consider using asynchronous overloaded method:\n   *    ```\n   *    fun cameraForAnnotations(\n   *      annotations: List<View>,\n   *      edgeInsets: EdgeInsets? = null,\n   *      bearing: Double? = null,\n   *      pitch: Double? = null,\n   *      result: (CameraOptions) -> Unit\n   *    )\n   *    ```\n   * Consider using this synchronous method ONLY when you are absolutely sure that map is fully ready.\n   *\n   * Calling this API immediately after adding the view is a no-op.\n   * Please refer to [OnViewAnnotationUpdatedListener] documentation for understanding the exact moment of time when\n   * view annotation is positioned.\n   *\n   * @param annotations view annotation list to be shown. Annotations should be added beforehand\n   * with [ViewAnnotationManager.addViewAnnotation] API.\n   * @param edgeInsets paddings to apply.\n   * @param bearing camera bearing to apply.\n   * @param pitch camera pitch to apply.\n   *\n   * @return [CameraOptions] object or NULL if [annotations] list is empty or map size is not yet known.\n   */\n  @MapboxDelicateApi\n  fun cameraForAnnotations(\n    annotations: List<View>,\n    edgeInsets: EdgeInsets? = null,\n    bearing: Double? = null,\n    pitch: Double? = null\n  ): CameraOptions?\n\n  /**\n   * Return camera options bound to given view annotation list, padding, bearing and pitch values.\n   * Annotations with [ViewAnnotationOptions.visible] set to false will be excluded from the calculations of [CameraOptions].\n   * Annotations with only [View.VISIBLE] will be included in the calculations for [CameraOptions]\n   *\n   * Calling this API immediately after adding the view is a no-op.\n   * Please refer to [OnViewAnnotationUpdatedListener] documentation for understanding the exact moment of time when\n   * view annotation is positioned.\n   *\n   * @param annotations view annotation list to be shown. Annotations should be added beforehand\n   * with [ViewAnnotationManager.addViewAnnotation] API.\n   * @param edgeInsets paddings to apply.\n   * @param bearing camera bearing to apply.\n   * @param pitch camera pitch to apply.\n   * @param result [CameraOptions] bound to given view annotation list.\n   *  Empty camera (could be checked with [CameraOptions.isEmpty]) is returned when [annotations] is an empty list.\n   */\n  fun cameraForAnnotations(\n    annotations: List<View>,\n    edgeInsets: EdgeInsets? = null,\n    bearing: Double? = null,\n    pitch: Double? = null,\n    result: (CameraOptions) -> Unit\n  )\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Default view annotation update mode.\n     */\n    @JvmField\n    val DEFAULT_UPDATE_MODE = ViewAnnotationUpdateMode.MAP_SYNCHRONIZED\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/viewannotation/ViewAnnotationManagerImpl.kt",
    "content": "package com.mapbox.maps.viewannotation\n\nimport android.graphics.Rect\nimport android.os.Looper\nimport android.view.*\nimport android.view.View.MeasureSpec\nimport android.view.ViewTreeObserver.OnGlobalLayoutListener\nimport android.widget.FrameLayout\nimport androidx.annotation.*\nimport androidx.asynclayoutinflater.view.AsyncLayoutInflater\nimport androidx.core.view.isVisible\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.renderer.RenderThread\nimport com.mapbox.maps.util.isEmpty\nimport java.util.UUID\nimport java.util.concurrent.CopyOnWriteArraySet\nimport kotlin.math.abs\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class ViewAnnotationManagerImpl(\n  mapView: MapView,\n  private val viewAnnotationsLayout: FrameLayout = FrameLayout(mapView.context),\n) : ViewAnnotationManager, DelegatingViewAnnotationPositionsUpdateListener() {\n  private val mapboxMap: MapboxMap = mapView.mapboxMap\n  private val renderThread = mapView.mapController.renderer.renderThread\n  private val pixelRatio = mapView.resources.displayMetrics.density\n\n  private data class ViewAnnotation(\n    val view: View,\n    var viewLayoutParams: ViewGroup.LayoutParams,\n    // needed to control global layout / on draw listeners lifecycle\n    var attachStateListener: View.OnAttachStateChangeListener? = null,\n    // if user did not specify [ViewAnnotationOptions.visible]  explicitly\n    var handleVisibilityAutomatically: Boolean,\n    // TODO could be simplified with isPositioned flag\n    var visibility: ViewAnnotationVisibility,\n    var measuredWidth: Int,\n    var measuredHeight: Int,\n    var positionDescriptor: DelegatingViewAnnotationPositionDescriptor?,\n    var isPositioned: Boolean,\n    // id passed to gl-native\n    val id: String = UUID.randomUUID().toString()\n  ) {\n    // Helper function to understand if view is visible from Android visibility perspective.\n    val isVisible\n      get() = visibility == ViewAnnotationVisibility.VISIBLE_AND_POSITIONED ||\n        visibility == ViewAnnotationVisibility.VISIBLE_AND_NOT_POSITIONED\n  }\n\n  private val viewAnnotations = mutableMapOf<String, ViewAnnotation>()\n\n  // using copy on write as user could remove listener while callback is invoked\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal val viewUpdatedListenerSet = CopyOnWriteArraySet<OnViewAnnotationUpdatedListener>()\n\n  @Volatile\n  private var updatedPositionDescriptors = emptyList<DelegatingViewAnnotationPositionDescriptor>()\n  private var currentPositionDescriptors = emptyList<DelegatingViewAnnotationPositionDescriptor>()\n\n  /**\n   * Specify layers that view annotations should avoid. This applies to ALL view annotations associated to any layer.\n   * The API currently only supports line layers.\n   *\n   * @return A list of layer ids if there are any, empty set otherwise.\n   */\n  @MapboxExperimental\n  override var viewAnnotationAvoidLayers: HashSet<String>\n    get() = mapboxMap.getViewAnnotationAvoidLayers()\n    set(value) {\n      mapboxMap.setViewAnnotationAvoidLayers(value)\n    }\n\n  init {\n    viewAnnotationsLayout.layoutParams = FrameLayout.LayoutParams(\n      ViewGroup.LayoutParams.MATCH_PARENT,\n      ViewGroup.LayoutParams.MATCH_PARENT,\n    )\n    // place the view annotations above the map (index 0) but below the compass, ruler and other plugin views\n    mapView.addView(viewAnnotationsLayout, 1)\n    mapView.requestDisallowInterceptTouchEvent(false)\n    mapboxMap.setViewAnnotationPositionsUpdateListener(this)\n  }\n\n  override fun addViewAnnotation(\n    @LayoutRes resId: Int,\n    options: ViewAnnotationOptions,\n    asyncInflater: AsyncLayoutInflater,\n    asyncInflateCallback: (View) -> Unit\n  ) {\n    validateOptions(options)\n    asyncInflater.inflate(resId, viewAnnotationsLayout) { view, _, _ ->\n      prepareViewAnnotation(view, options)\n      asyncInflateCallback.invoke(view)\n    }\n  }\n\n  override fun addViewAnnotation(\n    @LayoutRes resId: Int,\n    options: ViewAnnotationOptions\n  ): View {\n    validateOptions(options)\n    val view = LayoutInflater.from(viewAnnotationsLayout.context)\n      .inflate(resId, viewAnnotationsLayout, false)\n    prepareViewAnnotation(view, options)\n    return view\n  }\n\n  override fun addViewAnnotation(view: View, options: ViewAnnotationOptions) {\n    if (viewAnnotations.any { it.value.view == view }) {\n      throw MapboxViewAnnotationException(\n        \"Trying to add view annotation that was already added before! \" +\n          \"Please consider deleting annotation view ($view) beforehand.\"\n      )\n    }\n    validateOptions(options)\n    prepareViewAnnotation(view, options)\n  }\n\n  override fun removeViewAnnotation(view: View): Boolean {\n    return viewAnnotations.entries\n      .find { (_, viewAnnotation) -> viewAnnotation.view == view }\n      ?.let { (id, viewAnnotation) ->\n        viewAnnotations.remove(id)\n        remove(viewAnnotation)\n        true\n      } ?: false\n  }\n\n  override fun removeAllViewAnnotations() {\n    viewAnnotations.iterator().let { iterator ->\n      while (iterator.hasNext()) {\n        val viewAnnotation = iterator.next().value\n        remove(viewAnnotation)\n        iterator.remove()\n      }\n    }\n  }\n\n  override fun updateViewAnnotation(\n    view: View,\n    options: ViewAnnotationOptions,\n  ): Boolean {\n    return viewAnnotations\n      .values\n      .find { it.view == view }\n      ?.let { viewAnnotation ->\n        // FIXME does it conform the documented behaviour if `visible` was set but is not present in the update call ?\n        // `When updating existing annotations, if `visible` is not explicitly set, the current value will be retained.`\n        viewAnnotation.handleVisibilityAutomatically = (options.visible == null)\n        if (options.width != null) {\n          viewAnnotation.measuredWidth = USER_FIXED_DIMENSION\n        }\n        if (options.height != null) {\n          viewAnnotation.measuredHeight = USER_FIXED_DIMENSION\n        }\n        getValue(mapboxMap.updateViewAnnotation(viewAnnotation.id, options))\n        true\n      } ?: false\n  }\n\n  override fun getViewAnnotation(annotatedLayerFeature: AnnotatedLayerFeature): View? {\n    return findByAnnotatedLayerFeature(annotatedLayerFeature).first\n  }\n\n  override fun getViewAnnotationOptions(annotatedLayerFeature: AnnotatedLayerFeature): ViewAnnotationOptions? {\n    return findByAnnotatedLayerFeature(annotatedLayerFeature).second\n  }\n\n  override fun getViewAnnotationOptions(view: View): ViewAnnotationOptions? {\n    return viewAnnotations\n      .values\n      .find { it.view == view }\n      ?.let { viewAnnotation ->\n        getValue(mapboxMap.getViewAnnotationOptions(viewAnnotation.id))\n      }\n  }\n\n  override fun addOnViewAnnotationUpdatedListener(listener: OnViewAnnotationUpdatedListener) {\n    viewUpdatedListenerSet.add(listener)\n  }\n\n  override fun removeOnViewAnnotationUpdatedListener(listener: OnViewAnnotationUpdatedListener) {\n    viewUpdatedListenerSet.remove(listener)\n  }\n\n  @RenderThread\n  override fun setViewAnnotationUpdateMode(mode: ViewAnnotationUpdateMode) {\n    renderThread.viewAnnotationMode = mode\n  }\n\n  @RenderThread\n  override fun getViewAnnotationUpdateMode(): ViewAnnotationUpdateMode {\n    return renderThread.viewAnnotationMode\n  }\n\n  override val annotations: Map<View, ViewAnnotationOptions>\n    get() = viewAnnotations\n      .mapNotNull { (_, viewAnnotation) ->\n        val options = getValue(mapboxMap.getViewAnnotationOptions(viewAnnotation.id))\n\n        options?.let {\n          viewAnnotation.view to options\n        }\n      }\n      .toMap()\n\n  /**\n   * Return camera options bound to given view annotation list, padding, bearing and pitch values.\n   * Annotations with [ViewAnnotationOptions.visible] set to false will be excluded from the calculations of [CameraOptions].\n   * Annotations with only [View.VISIBLE] will be included in the calculations for [CameraOptions].\n   *\n   * Important: if the render thread did not yet calculate the size of the map (due to initialization or map resizing) - empty [CameraOptions] will be returned.\n   * Emptiness could be checked with [CameraOptions.isEmpty]. Consider using asynchronous overloaded method:\n   *    ```\n   *    fun cameraForAnnotations(\n   *      annotations: List<View>,\n   *      edgeInsets: EdgeInsets? = null,\n   *      bearing: Double? = null,\n   *      pitch: Double? = null,\n   *      result: (CameraOptions) -> Unit\n   *    )\n   *    ```\n   * Consider using this synchronous method ONLY when you are absolutely sure that map is fully ready.\n   *\n   * Calling this API immediately after adding the view is a no-op.\n   * Please refer to [OnViewAnnotationUpdatedListener] documentation for understanding the exact moment of time when\n   * view annotation is positioned.\n   *\n   * @param annotations view annotation list to be shown. Annotations should be added beforehand\n   * with [ViewAnnotationManager.addViewAnnotation] API.\n   * @param edgeInsets paddings to apply.\n   * @param bearing camera bearing to apply.\n   * @param pitch camera pitch to apply.\n   *\n   * @return [CameraOptions] object or NULL if [annotations] list is empty or map size is not yet known.\n   */\n  @MapboxDelicateApi\n  override fun cameraForAnnotations(\n    annotations: List<View>,\n    edgeInsets: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?\n  ): CameraOptions? {\n    return cameraForAnnotationsImpl(\n      annotations = annotations,\n      edgeInsets = edgeInsets,\n      bearing = bearing,\n      pitch = pitch,\n      resultCallback = null,\n    )\n  }\n\n  /**\n   * Return camera options bound to given view annotation list, padding, bearing and pitch values.\n   * Annotations with [ViewAnnotationOptions.visible] set to false will be excluded from the calculations of [CameraOptions].\n   * Annotations with only [View.VISIBLE] will be included in the calculations for [CameraOptions]\n   *\n   * Calling this API immediately after adding the view is a no-op.\n   * Please refer to [OnViewAnnotationUpdatedListener] documentation for understanding the exact moment of time when\n   * view annotation is positioned.\n   *\n   * @param annotations view annotation list to be shown. Annotations should be added beforehand\n   * with [ViewAnnotationManager.addViewAnnotation] API.\n   * @param edgeInsets paddings to apply.\n   * @param bearing camera bearing to apply.\n   * @param pitch camera pitch to apply.\n   * @param result [CameraOptions] bound to given view annotation list.\n   *  Empty camera (could be checked with [CameraOptions.isEmpty]) is returned when [annotations] is an empty list.\n   */\n  override fun cameraForAnnotations(\n    annotations: List<View>,\n    edgeInsets: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?,\n    result: (CameraOptions) -> Unit\n  ) {\n    cameraForAnnotationsImpl(\n      annotations = annotations,\n      edgeInsets = edgeInsets,\n      bearing = bearing,\n      pitch = pitch,\n      resultCallback = result,\n    )\n  }\n\n  private fun cameraForAnnotationsImpl(\n    annotations: List<View>,\n    edgeInsets: EdgeInsets?,\n    bearing: Double?,\n    pitch: Double?,\n    resultCallback: ((CameraOptions) -> Unit)?\n  ): CameraOptions? {\n    val viewAnnotations = annotations\n      .filter { it.isVisible }\n      .mapNotNull { view ->\n        viewAnnotations.values.find { it.view == view }\n      }\n\n    if (viewAnnotations.isEmpty()) {\n      return invokeCallbackAndReturn(\n        camera = null,\n        resultCallback\n      )\n    }\n    val pointCoordinates =\n      viewAnnotations.mapNotNull { it.coordinate(it.positionDescriptor) }\n\n    // zoom will be adjusted later calling cameraFor in a loop\n    val cameraOptionsWithNoZoom = cameraOptions {\n      pitch(pitch)\n      bearing(bearing)\n    }\n\n    if (resultCallback == null) {\n      val cameraForViewAnnotationPoints = mapboxMap.cameraForCoordinates(\n        coordinates = pointCoordinates,\n        camera = cameraOptionsWithNoZoom,\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = null\n      )\n      return adjustCameraForAnnotations(\n        cameraForViewAnnotationPoints = cameraForViewAnnotationPoints,\n        edgeInsets = edgeInsets,\n        viewAnnotations = viewAnnotations,\n        cameraOptionsWithNoZoom = cameraOptionsWithNoZoom,\n        resultCallback = null\n      )\n    } else {\n      mapboxMap.cameraForCoordinates(\n        coordinates = pointCoordinates,\n        camera = cameraOptionsWithNoZoom,\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = null\n      ) { cameraForViewAnnotationPoints ->\n        adjustCameraForAnnotations(\n          cameraForViewAnnotationPoints = cameraForViewAnnotationPoints,\n          edgeInsets = edgeInsets,\n          viewAnnotations = viewAnnotations,\n          cameraOptionsWithNoZoom = cameraOptionsWithNoZoom,\n          resultCallback = resultCallback\n        )\n      }\n    }\n    return null\n  }\n\n  private fun adjustCameraForAnnotations(\n    cameraForViewAnnotationPoints: CameraOptions,\n    edgeInsets: EdgeInsets?,\n    viewAnnotations: List<ViewAnnotation>,\n    cameraOptionsWithNoZoom: CameraOptions,\n    resultCallback: ((CameraOptions) -> Unit)?\n  ): CameraOptions? {\n    if (cameraForViewAnnotationPoints.isEmpty) {\n      return invokeCallbackAndReturn(\n        camera = null,\n        resultCallback\n      )\n    }\n\n    var adjustedCamera = cameraForViewAnnotationPoints\n    var isCorrectBound = false\n    // viewAnnotation, frame and max coordinate\n    var north: Triple<ViewAnnotation, Rect?, Double>? = null\n    var east: Triple<ViewAnnotation, Rect?, Double>? = null\n    var west: Triple<ViewAnnotation, Rect?, Double>? = null\n    var south: Triple<ViewAnnotation, Rect?, Double>? = null\n\n    // we run the loop twice to optimize bounds correctly to fit all the annotations. this might not\n    // provide correct results when map is pitched or have bearing.\n    var boundsCounter = 1\n\n    while (!isCorrectBound && boundsCounter <= MAX_ADJUST_BOUNDS_COUNTER) {\n      val zoom = adjustedCamera.zoom\n      boundsCounter++\n      isCorrectBound = true\n\n      viewAnnotations.forEach { viewAnnotation ->\n        val frame = getViewAnnotationOptionsFrame(\n          viewAnnotation,\n          viewAnnotation.positionDescriptor\n        ) ?: Rect(0, 0, 0, 0)\n        val annotationBounds = calculateCoordinateBoundForAnnotation(viewAnnotation, frame, zoom)\n          ?: return@forEach\n\n        if (north == null || north!!.third < annotationBounds.north()) {\n          north = Triple(viewAnnotation, frame, annotationBounds.north())\n          isCorrectBound = false\n        }\n        if (east == null || east!!.third < annotationBounds.east()) {\n          east = Triple(viewAnnotation, frame, annotationBounds.east())\n          isCorrectBound = false\n        }\n        if (south == null || south!!.third > annotationBounds.south()) {\n          south = Triple(viewAnnotation, frame, annotationBounds.south())\n          isCorrectBound = false\n        }\n        if (west == null || west!!.third > annotationBounds.west()) {\n          west = Triple(viewAnnotation, frame, annotationBounds.west())\n          isCorrectBound = false\n        }\n      }\n\n      // adding extra checks for nullability (this shouldn't execute normally as we are checking nullability in loop of viewannotations).\n      if (north == null || east == null || south == null || west == null) {\n        logW(TAG, \"ViewAnnotation options framing is null. Returning empty camera\")\n        return invokeCallbackAndReturn(\n          camera = null,\n          resultCallback\n        )\n      }\n\n      val coordinateBoundsForCamera = listOf(\n        Point.fromLngLat(\n          west!!.first.coordinate(west!!.first.positionDescriptor)!!.longitude(),\n          south!!.first.coordinate(south!!.first.positionDescriptor)!!.latitude()\n        ),\n        Point.fromLngLat(\n          east!!.first.coordinate(east!!.first.positionDescriptor)!!.longitude(),\n          north!!.first.coordinate(north!!.first.positionDescriptor)!!.latitude()\n        )\n      )\n\n      val paddings = EdgeInsets(\n        (edgeInsets?.top ?: 0).toDouble() + abs((north!!.second?.top ?: 0.0).toDouble()),\n        (edgeInsets?.left ?: 0).toDouble() + abs((west!!.second?.left ?: 0.0).toDouble()),\n        (edgeInsets?.bottom ?: 0).toDouble() + abs((south!!.second?.bottom ?: 0.0).toDouble()),\n        (edgeInsets?.right ?: 0).toDouble() + abs((east!!.second?.right ?: 0.0).toDouble())\n      )\n\n      @Suppress(\"OPT_IN_USAGE\")\n      adjustedCamera = mapboxMap.cameraForCoordinates(\n        coordinates = coordinateBoundsForCamera,\n        camera = cameraOptionsWithNoZoom,\n        coordinatesPadding = paddings,\n        maxZoom = null,\n        offset = null\n      )\n    }\n    return invokeCallbackAndReturn(\n      camera = adjustedCamera.takeUnless { it.isEmpty },\n      resultCallback\n    )\n  }\n\n  private fun invokeCallbackAndReturn(\n    camera: CameraOptions?,\n    callback: ((CameraOptions) -> Unit)?\n  ): CameraOptions? {\n    callback?.invoke(camera ?: cameraOptions { })\n    return camera\n  }\n\n  /**\n   * Function to calculate coordinatebound associated with annotation option.\n   * this uses [MapboxMap.projectedMetersForCoordinate] and [MapboxMap.coordinateForProjectedMeters]\n   * function to get correct coordinate for northEast and southWest point of annotations.\n   */\n  private fun calculateCoordinateBoundForAnnotation(\n    viewAnnotation: ViewAnnotation,\n    annotationFrame: Rect,\n    zoom: Double?\n  ): CoordinateBounds? {\n    val pointCoordinate =\n      viewAnnotation.coordinate(viewAnnotation.positionDescriptor)\n        ?: return null\n\n    val metersPerPixelAtLatitude = if (zoom == null) {\n      mapboxMap.getMetersPerPixelAtLatitude(pointCoordinate.latitude())\n    } else {\n      mapboxMap.getMetersPerPixelAtLatitude(pointCoordinate.latitude(), zoom)\n    }\n\n    val projectedMeterForCoordinate = mapboxMap.projectedMetersForCoordinate(pointCoordinate)\n    val metersPerPixelDensity = metersPerPixelAtLatitude / pixelRatio\n    val northing =\n      projectedMeterForCoordinate.northing + (abs(annotationFrame.top).toDouble() * metersPerPixelDensity)\n    val easting =\n      projectedMeterForCoordinate.easting + (abs(annotationFrame.right).toDouble() * metersPerPixelDensity)\n    val southing =\n      projectedMeterForCoordinate.northing - (abs(annotationFrame.bottom).toDouble() * metersPerPixelDensity)\n    val westing =\n      projectedMeterForCoordinate.easting - (abs(annotationFrame.left).toDouble() * metersPerPixelDensity)\n\n    val projectedMeterNorthEast = ProjectedMeters(northing, easting)\n    val projectedMeterSouthWest = ProjectedMeters(southing, westing)\n\n    val coordinateNorthEast = mapboxMap.coordinateForProjectedMeters(projectedMeterNorthEast)\n    val coordinateSouthWest = mapboxMap.coordinateForProjectedMeters(projectedMeterSouthWest)\n    return CoordinateBounds(coordinateSouthWest, coordinateNorthEast)\n  }\n\n  private fun ViewAnnotation.coordinate(positionDescriptor: DelegatingViewAnnotationPositionDescriptor?): Point? {\n    val viewAnnotationOptions = getValue(mapboxMap.getViewAnnotationOptions(id)) ?: return null\n\n    return if (viewAnnotationOptions.annotatedFeature!!.isGeometry) {\n      viewAnnotationOptions.annotatedFeature!!.geometry as? Point\n    } else {\n      positionDescriptor?.anchorCoordinate\n    }\n  }\n\n  /**\n   * Get [Rect] from [ViewAnnotationOptions]'s geometry, width and height.\n   * This function takes [ViewAnnotationOptions.geometry] as the center of rectangle and\n   * use width, height and offset values to calculate [Rect] associated.\n   *\n   * @return [Rect] associated with [ViewAnnotationOptions]\n   */\n  private fun getViewAnnotationOptionsFrame(\n    viewAnnotation: ViewAnnotation,\n    positionDescriptor: DelegatingViewAnnotationPositionDescriptor?\n  ): Rect? {\n    val viewAnnotationOptions = getValue(mapboxMap.getViewAnnotationOptions(viewAnnotation.id))\n\n    viewAnnotationOptions?.let { options ->\n      if (options.width != null && options.height != null) {\n        val offsetWidth = if (options.width!! > 0) (options.width!! * 0.5).toInt() else 0\n        val offsetHeight = if (options.height!! > 0) (options.height!! * 0.5).toInt() else 0\n        // create a dummy rect with center assume at 0,0 with offsetWidth and offsetHeight.\n        val rect = Rect(\n          -offsetWidth,\n          -offsetHeight,\n          offsetWidth,\n          offsetHeight\n        )\n\n        // offset rect with respect to anchor defined in viewannotation options.\n        val anchor = positionDescriptor?.anchorConfig ?: ViewAnnotationAnchorConfig.Builder()\n          .anchor(ViewAnnotationAnchor.CENTER).build()\n\n        when (anchor.anchor) {\n          ViewAnnotationAnchor.TOP -> rect.offset(0, offsetHeight)\n          ViewAnnotationAnchor.TOP_LEFT -> rect.offset(offsetWidth, offsetHeight)\n          ViewAnnotationAnchor.TOP_RIGHT -> rect.offset(-offsetWidth, offsetHeight)\n          ViewAnnotationAnchor.BOTTOM -> rect.offset(0, -offsetHeight)\n          ViewAnnotationAnchor.BOTTOM_LEFT -> rect.offset(offsetWidth, -offsetHeight)\n          ViewAnnotationAnchor.BOTTOM_RIGHT -> rect.offset(-offsetWidth, -offsetHeight)\n          ViewAnnotationAnchor.LEFT -> rect.offset(offsetWidth, 0)\n          ViewAnnotationAnchor.RIGHT -> rect.offset(-offsetWidth, 0)\n          else -> rect.offset(0, 0)\n        }\n        // add view annotation option's offsetX and offsetY field to offset the rect.\n        rect.offset(anchor.offsetX.toInt(), anchor.offsetY.toInt())\n        return rect\n      }\n    }\n    return null\n  }\n\n  /**\n   * We will have two calls of this callback:\n   * - first from render thread with actual position list\n   * - second from main thread with empty list in any case.\n   *\n   * We need separate call from main thread as scheduling on main thread happens much faster in C++\n   * then rescheduling using Java handler.\n   */\n  @AnyThread\n  override fun onDelegatingViewAnnotationPositionsUpdate(positions: List<DelegatingViewAnnotationPositionDescriptor>) {\n    // When called from render thread it means we're in the end of [MapInterface.render] call if positions did change.\n    // It's crucial to notify render thread in this callback as depending on mode we're using we need\n    // either swap buffers the same or the next frame.\n    if (Looper.myLooper() == Looper.getMainLooper()) {\n      // create copy to avoid concurrent modification exception\n      val immutableUpdatedPositionDescriptorsCopy = updatedPositionDescriptors\n      // schedule positioning on next frame using Choreographer from main thread\n      Choreographer.getInstance().postFrameCallback {\n        positionAnnotationViews(immutableUpdatedPositionDescriptorsCopy)\n      }\n    } else {\n      // Called as soon as possible on main thread after updated positions arrived on render thread.\n      // We need another callback from core as scheduling from render thread to main happens too slow\n      // when using Java Main Looper.\n      // update that flag here if callback was triggered, it will be reset by renderer directly when swapping buffers\n      renderThread.needViewAnnotationSync = true\n      updatedPositionDescriptors = positions\n    }\n  }\n\n  fun destroy() {\n    mapboxMap.setViewAnnotationPositionsUpdateListener(null)\n    viewUpdatedListenerSet.clear()\n    removeAllViewAnnotations()\n  }\n\n  private fun validateOptions(options: ViewAnnotationOptions) {\n    if (options.annotatedFeature == null) {\n      throw IllegalArgumentException(EXCEPTION_TEXT_FEATURE_IS_NULL)\n    }\n  }\n\n  private fun prepareViewAnnotation(inflatedView: View, options: ViewAnnotationOptions) {\n    measureView(inflatedView)\n    val inflatedViewLayoutParams = inflatedView.layoutParams as ViewGroup.LayoutParams\n    // If values in layout params are negative - view is wrap_content (assuming match_parent view annotations\n    // make no sense) and size is determined during measure() above.\n    // Otherwise, size is determined by layout params.\n    val measuredWidth = if (inflatedViewLayoutParams.width < 0) {\n      inflatedView.measuredWidth\n    } else {\n      inflatedViewLayoutParams.width\n    }\n    val measuredHeight = if (inflatedViewLayoutParams.height < 0) {\n      inflatedView.measuredHeight\n    } else {\n      inflatedViewLayoutParams.height\n    }\n\n    val updatedOptions = options.toBuilder()\n      .width(options.width ?: measuredWidth.toDouble())\n      .height(options.height ?: measuredHeight.toDouble())\n      .build()\n    val viewAnnotation = ViewAnnotation(\n      view = inflatedView,\n      handleVisibilityAutomatically = (options.visible == null),\n      visibility = ViewAnnotationVisibility.INITIAL,\n      viewLayoutParams = inflatedViewLayoutParams,\n      measuredWidth = if (options.width != null) USER_FIXED_DIMENSION else measuredWidth,\n      measuredHeight = if (options.height != null) USER_FIXED_DIMENSION else measuredHeight,\n      positionDescriptor = null,\n      isPositioned = false,\n    )\n\n    val onGlobalLayoutListener = buildGlobalLayoutListener(viewAnnotation)\n    val onDrawListener = buildDrawListener(viewAnnotation)\n    viewAnnotation.attachStateListener =\n      buildAttachStateListener(viewAnnotation.view, onGlobalLayoutListener, onDrawListener)\n    inflatedView.addOnAttachStateChangeListener(viewAnnotation.attachStateListener)\n\n    viewAnnotations[viewAnnotation.id] = viewAnnotation\n    getValue(mapboxMap.addViewAnnotation(viewAnnotation.id, updatedOptions))\n  }\n\n  private fun measureView(view: View) {\n    val measureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)\n    val isComposeView = view.getTag(R.id.composeView) != null\n    // compose expects view to be added to the layout, otherwise it crashes\n    // so we attach it temporarily, then detach until it's positioned and added in [positionAnnotationViews]\n    // also see https://stackoverflow.com/questions/72802387/compose-view-instead-of-native-view-for-markers-info-window\n    // or https://github.com/googlemaps/android-maps-compose/blob/main/maps-compose/src/main/java/com/google/maps/android/compose/ComposeInfoWindowAdapter.kt\n    if (isComposeView) {\n      viewAnnotationsLayout.addView(view)\n    }\n    view.measure(\n      measureSpec,\n      measureSpec,\n    )\n    if (isComposeView) {\n      viewAnnotationsLayout.removeView(view)\n    }\n    view.layout(\n      /* l = */ 0,\n      /* t = */ 0,\n      /* r = */ view.measuredWidth,\n      /* b = */ view.measuredHeight\n    )\n  }\n\n  private fun buildAttachStateListener(\n    view: View,\n    onGlobalLayoutListener: OnGlobalLayoutListener,\n    onDrawListener: ViewTreeObserver.OnDrawListener\n  ) = object : View.OnAttachStateChangeListener {\n    override fun onViewAttachedToWindow(v: View) {\n      view.viewTreeObserver.addOnDrawListener(onDrawListener)\n      view.viewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener)\n    }\n\n    override fun onViewDetachedFromWindow(v: View) {\n      view.viewTreeObserver.removeOnDrawListener(onDrawListener)\n      view.viewTreeObserver.removeOnGlobalLayoutListener(onGlobalLayoutListener)\n    }\n  }\n\n  // triggers on every frame and checks if visibility changed\n  // as OnGlobalLayoutListener does not cover cases for View.INVISIBLE properly\n  private fun buildDrawListener(viewAnnotation: ViewAnnotation) = ViewTreeObserver.OnDrawListener {\n    if (viewAnnotation.handleVisibilityAutomatically) {\n      val isAndroidViewVisible = viewAnnotation.view.isVisible\n\n      if (\n        (isAndroidViewVisible && viewAnnotation.isVisible) ||\n        (!isAndroidViewVisible && viewAnnotation.visibility == ViewAnnotationVisibility.INVISIBLE) ||\n        (!isAndroidViewVisible && viewAnnotation.visibility == ViewAnnotationVisibility.VISIBLE_AND_NOT_POSITIONED)\n      ) {\n        return@OnDrawListener\n      }\n\n      // hide view until it is positioned in [positionAnnotationViews]\n      if (isAndroidViewVisible) {\n        viewAnnotations[viewAnnotation.id]?.isPositioned = false\n        viewAnnotation.view.visibility = View.INVISIBLE\n      }\n\n      updateVisibilityAndNotifyUpdateListeners(\n        viewAnnotation,\n        if (isAndroidViewVisible) {\n          ViewAnnotationVisibility.VISIBLE_AND_NOT_POSITIONED\n        } else {\n          ViewAnnotationVisibility.INVISIBLE\n        }\n      )\n      if (getValue(mapboxMap.getViewAnnotationOptions(viewAnnotation.id))?.visible != isAndroidViewVisible) {\n        getValue(\n          mapboxMap.updateViewAnnotation(\n            viewAnnotation.id,\n            ViewAnnotationOptions.Builder()\n              .visible(isAndroidViewVisible)\n              .build()\n          )\n        )\n      }\n    }\n  }\n\n  // controls view annotations's width and height when dimensions of the view change\n  private fun buildGlobalLayoutListener(viewAnnotation: ViewAnnotation) =\n    OnGlobalLayoutListener {\n      if (\n        viewAnnotation.measuredWidth != USER_FIXED_DIMENSION &&\n        viewAnnotation.view.measuredWidth > 0 &&\n        viewAnnotation.view.measuredWidth != viewAnnotation.measuredWidth\n      ) {\n        viewAnnotation.measuredWidth = viewAnnotation.view.measuredWidth\n        getValue(\n          mapboxMap.updateViewAnnotation(\n            viewAnnotation.id,\n            ViewAnnotationOptions.Builder()\n              .width(viewAnnotation.view.measuredWidth.toDouble())\n              .build()\n          )\n        )\n      }\n      if (\n        viewAnnotation.measuredHeight != USER_FIXED_DIMENSION &&\n        viewAnnotation.view.measuredHeight > 0 &&\n        viewAnnotation.view.measuredHeight != viewAnnotation.measuredHeight\n      ) {\n        viewAnnotation.measuredHeight = viewAnnotation.view.measuredHeight\n        getValue(\n          mapboxMap.updateViewAnnotation(\n            viewAnnotation.id,\n            ViewAnnotationOptions.Builder()\n              .height(viewAnnotation.view.measuredHeight.toDouble())\n              .build()\n          )\n        )\n      }\n    }\n\n  private fun findByAnnotatedLayerFeature(annotatedLayerFeature: AnnotatedLayerFeature): Pair<View?, ViewAnnotationOptions?> {\n    return viewAnnotations\n      .map { (id, viewAnnotation) ->\n        viewAnnotation.view to getValue(mapboxMap.getViewAnnotationOptions(id))\n      }\n      .firstOrNull { (_, viewAnnotationOptions) ->\n        viewAnnotationOptions?.annotatedFeature?.isAnnotatedLayerFeature == true &&\n          viewAnnotationOptions.annotatedFeature?.annotatedLayerFeature == annotatedLayerFeature\n      } ?: Pair(null, null)\n  }\n\n  private fun positionAnnotationViews(\n    updatedPositionDescriptors: List<DelegatingViewAnnotationPositionDescriptor>\n  ) {\n    val needToReorderZ = needToReorderZ(\n      currentPositionDescriptors,\n      updatedPositionDescriptors,\n    )\n    currentPositionDescriptors = updatedPositionDescriptors\n\n    // add and reposition new and existed views\n    updatedPositionDescriptors.forEach { descriptor ->\n      viewAnnotations[descriptor.identifier]?.let { viewAnnotation ->\n        // update translation first - notify Android render node to schedule updates\n        viewAnnotation.view.apply {\n          translationX = descriptor.leftTopCoordinate.x.toFloat()\n          translationY = descriptor.leftTopCoordinate.y.toFloat()\n        }\n\n        // update layout params explicitly if user has specified concrete width or height\n        viewAnnotation.viewLayoutParams.apply {\n          if (viewAnnotation.measuredWidth == USER_FIXED_DIMENSION) {\n            width = descriptor.width.toInt()\n          }\n          if (viewAnnotation.measuredHeight == USER_FIXED_DIMENSION) {\n            height = descriptor.height.toInt()\n          }\n        }\n\n        if (\n          !viewAnnotation.isVisible &&\n          viewAnnotationsLayout.indexOfChild(viewAnnotation.view) == -1\n        ) {\n          viewAnnotation.isPositioned = true\n          viewAnnotationsLayout.addView(viewAnnotation.view, viewAnnotation.viewLayoutParams)\n          updateVisibilityAndNotifyUpdateListeners(\n            viewAnnotation,\n            if (viewAnnotation.view.isVisible) {\n              ViewAnnotationVisibility.VISIBLE_AND_POSITIONED\n            } else {\n              ViewAnnotationVisibility.INVISIBLE\n            }\n          )\n        }\n\n        if (!viewAnnotation.isPositioned) {\n          viewAnnotation.isPositioned = true\n          viewAnnotation.view.visibility = View.VISIBLE\n          updateVisibilityAndNotifyUpdateListeners(\n            viewAnnotation,\n            ViewAnnotationVisibility.VISIBLE_AND_POSITIONED\n          )\n          notifyPositionListeners(viewAnnotation, descriptor, positionChanged = true)\n        } else {\n          notifyPositionListeners(viewAnnotation, descriptor)\n        }\n\n        notifyAnchorListeners(viewAnnotation, descriptor)\n        notifyAnchorCoordinateListeners(viewAnnotation, descriptor)\n        viewAnnotation.positionDescriptor = descriptor\n\n        // reorder Z index with the iteration order to keep selected annotations on top of others\n        if (needToReorderZ) {\n          viewAnnotation.view.bringToFront()\n        }\n      }\n    }\n\n    // remove visible views that are not present in positions list\n    // TODO should we make them invisible instead?\n    viewAnnotations\n      .filter {\n        it.value.view.isVisible\n      }\n      .filter {\n        currentPositionDescriptors.none { positionDescriptor ->\n          positionDescriptor.identifier == it.key\n        }\n      }\n      .forEach { (_, viewAnnotation) ->\n        viewAnnotationsLayout.removeView(viewAnnotation.view)\n        updateVisibilityAndNotifyUpdateListeners(\n          viewAnnotation,\n          ViewAnnotationVisibility.INVISIBLE\n        )\n      }\n  }\n\n  private fun notifyPositionListeners(\n    viewAnnotation: ViewAnnotation,\n    newPositionDescriptor: DelegatingViewAnnotationPositionDescriptor,\n    positionChanged: Boolean = false,\n  ) {\n    if (\n      positionChanged ||\n      viewAnnotation.positionDescriptor?.leftTopCoordinate != newPositionDescriptor.leftTopCoordinate ||\n      viewAnnotation.positionDescriptor?.width != newPositionDescriptor.width ||\n      viewAnnotation.positionDescriptor?.height != newPositionDescriptor.height\n    ) {\n      viewUpdatedListenerSet.forEach {\n        it.onViewAnnotationPositionUpdated(\n          view = viewAnnotation.view,\n          leftTopCoordinate = newPositionDescriptor.leftTopCoordinate,\n          width = newPositionDescriptor.width,\n          height = newPositionDescriptor.height,\n        )\n      }\n    }\n  }\n\n  private fun notifyAnchorCoordinateListeners(\n    viewAnnotation: ViewAnnotation,\n    newPositionDescriptor: DelegatingViewAnnotationPositionDescriptor\n  ) {\n    if (viewAnnotation.positionDescriptor?.anchorCoordinate != newPositionDescriptor.anchorCoordinate) {\n      viewUpdatedListenerSet.forEach {\n        it.onViewAnnotationAnchorCoordinateUpdated(\n          viewAnnotation.view,\n          newPositionDescriptor.anchorCoordinate,\n        )\n      }\n    }\n  }\n\n  private fun notifyAnchorListeners(\n    viewAnnotation: ViewAnnotation,\n    newPositionDescriptor: DelegatingViewAnnotationPositionDescriptor\n  ) {\n    if (viewAnnotation.positionDescriptor?.anchorConfig != newPositionDescriptor.anchorConfig) {\n      viewUpdatedListenerSet.forEach {\n        it.onViewAnnotationAnchorUpdated(\n          viewAnnotation.view,\n          newPositionDescriptor.anchorConfig,\n        )\n      }\n    }\n  }\n\n  private inline fun <reified V> getValue(expected: Expected<String, V>): V? {\n    if (expected.isError) {\n      throw MapboxViewAnnotationException(expected.error)\n    }\n    return expected.value\n  }\n\n  private fun updateVisibilityAndNotifyUpdateListeners(\n    annotation: ViewAnnotation,\n    currentVisibility: ViewAnnotationVisibility\n  ) {\n    // we do nothing if currentVisibility value did not change and additionally if view is just added but not shown\n    if (annotation.visibility == currentVisibility ||\n      (annotation.visibility == ViewAnnotationVisibility.INITIAL && currentVisibility == ViewAnnotationVisibility.INVISIBLE)\n    ) {\n      return\n    }\n    val wasVisibleBefore = annotation.isVisible\n    val isVisibleNow =\n      currentVisibility == ViewAnnotationVisibility.VISIBLE_AND_POSITIONED ||\n        currentVisibility == ViewAnnotationVisibility.VISIBLE_AND_NOT_POSITIONED\n    annotation.visibility = currentVisibility\n    if (viewUpdatedListenerSet.isNotEmpty() && isVisibleNow != wasVisibleBefore) {\n      viewUpdatedListenerSet.forEach {\n        it.onViewAnnotationVisibilityUpdated(\n          view = annotation.view,\n          visible = isVisibleNow\n        )\n      }\n    }\n  }\n\n  private fun remove(annotation: ViewAnnotation) {\n    viewAnnotationsLayout.removeView(annotation.view)\n    updateVisibilityAndNotifyUpdateListeners(annotation, ViewAnnotationVisibility.INVISIBLE)\n    // explicit onViewDetachedFromWindow call is needed to handle use-case\n    // if the view has an animation attached\n    annotation.attachStateListener?.onViewDetachedFromWindow(annotation.view)\n    annotation.view.removeOnAttachStateChangeListener(annotation.attachStateListener)\n    annotation.attachStateListener = null\n    getValue(mapboxMap.removeViewAnnotation(annotation.id))\n  }\n\n  companion object {\n    private const val EXCEPTION_TEXT_FEATURE_IS_NULL = \"Annotated feature can not be null!\"\n    private const val TAG = \"ViewAnnotationImpl\"\n    private const val MAX_ADJUST_BOUNDS_COUNTER = 2\n\n    private const val USER_FIXED_DIMENSION = -1\n\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    internal fun needToReorderZ(\n      currentPositionDescriptors: List<DelegatingViewAnnotationPositionDescriptor>,\n      updatedPositionDescriptors: List<DelegatingViewAnnotationPositionDescriptor>\n    ): Boolean {\n      when {\n        // new annotations will be added to layout and trigger on measure anyway\n        currentPositionDescriptors.size < updatedPositionDescriptors.size -> {\n          return true\n        }\n\n        currentPositionDescriptors.isEmpty() || updatedPositionDescriptors.isEmpty() -> {\n          return false\n        }\n\n        else -> {\n          var currentIndex = 0\n          var updatedIndex = 0\n          // descriptor of items removed from the new list\n          val removedDescriptors = mutableSetOf<String>()\n          while (currentIndex < currentPositionDescriptors.size &&\n            updatedIndex < updatedPositionDescriptors.size\n          ) {\n            // skip equal items\n            if (currentPositionDescriptors[currentIndex].identifier == updatedPositionDescriptors[updatedIndex].identifier) {\n              currentIndex++\n              updatedIndex++\n              continue\n            }\n\n            // if removed descriptors list contains the item from the new list - it means\n            // the element was not removed but moved, need to invalidate Z order\n            if (removedDescriptors.contains(updatedPositionDescriptors[updatedIndex].identifier)) {\n              return true\n            }\n\n            // find the elements removed from the old list, add them to set\n            while (currentIndex < currentPositionDescriptors.size &&\n              currentPositionDescriptors[currentIndex].identifier != updatedPositionDescriptors[updatedIndex].identifier\n            ) {\n              removedDescriptors.add(currentPositionDescriptors[currentIndex].identifier)\n              currentIndex++\n            }\n          }\n          // iterate to the end of updated list\n          while (updatedIndex < updatedPositionDescriptors.size) {\n            if (removedDescriptors.contains(updatedPositionDescriptors[updatedIndex].identifier)) {\n              return true\n            }\n            updatedIndex++\n          }\n        }\n      }\n      return false\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/viewannotation/ViewAnnotationOptionsKtx.kt",
    "content": "package com.mapbox.maps.viewannotation\n\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.AnnotatedFeature\nimport com.mapbox.maps.AnnotatedLayerFeature\nimport com.mapbox.maps.ViewAnnotationAnchorConfig\nimport com.mapbox.maps.ViewAnnotationOptions\n\n/**\n * DSL builder functions to create [ViewAnnotationOptions] object.\n */\ninline fun viewAnnotationOptions(block: ViewAnnotationOptions.Builder.() -> Unit): ViewAnnotationOptions =\n  ViewAnnotationOptions.Builder().apply(block).build()\n\n/**\n * DSL function to set multiple [ViewAnnotationAnchorConfig]'s to [ViewAnnotationOptions.Builder.variableAnchors].\n * Anchors will be applied in the order they are specified.\n */\nfun ViewAnnotationOptions.Builder.annotationAnchors(\n  vararg blocks: ViewAnnotationAnchorConfig.Builder.() -> Unit\n): ViewAnnotationOptions.Builder =\n  variableAnchors(\n    listOf(*blocks.map { ViewAnnotationAnchorConfig.Builder().apply(it).build() }.toTypedArray())\n  )\n\n/**\n * DSL function to set single [ViewAnnotationAnchorConfig]  to [ViewAnnotationOptions.Builder.variableAnchors].\n */\ninline fun ViewAnnotationOptions.Builder.annotationAnchor(block: ViewAnnotationAnchorConfig.Builder.() -> Unit): ViewAnnotationOptions.Builder =\n  variableAnchors(listOf(ViewAnnotationAnchorConfig.Builder().apply(block).build()))\n\n/**\n * DSL function to set [AnnotatedLayerFeature] to [ViewAnnotationOptions.Builder.annotatedFeature].\n */\ninline fun ViewAnnotationOptions.Builder.annotatedLayerFeature(\n  layerId: String,\n  block: AnnotatedLayerFeature.Builder.() -> Unit = {}\n): ViewAnnotationOptions.Builder =\n  annotatedFeature(\n    AnnotatedFeature.valueOf(\n      AnnotatedLayerFeature.Builder().layerId(layerId).apply(block).build()\n    )\n  )\n\n/**\n * DSL function to set [Geometry] to [ViewAnnotationOptions.Builder.annotatedFeature].\n */\nfun ViewAnnotationOptions.Builder.geometry(geometry: Geometry): ViewAnnotationOptions.Builder =\n  annotatedFeature(AnnotatedFeature.valueOf(geometry))"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/viewannotation/ViewAnnotationUpdateMode.kt",
    "content": "package com.mapbox.maps.viewannotation\n\n/**\n * Describes modes that could be applied to update view annotation positions and\n * synchronize them with current map camera.\n *\n * Note: behaviour could still be undetermined as we could not control Android render thread directly.\n */\nclass ViewAnnotationUpdateMode private constructor(\n  /**\n   * Mode name.\n   */\n  private val mode: String,\n) {\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is ViewAnnotationUpdateMode &&\n    mode == other.mode\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = mode.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = mode\n\n  /**\n   * Companion object.\n   */\n  companion object {\n    /**\n     * View annotations are updated on the next frame comparing to the MapView camera.\n     *\n     * Using this mode introduces fixed 1-frame delay for view annotation position and if panning the map\n     * quickly view annotation will be visually behind the map.\n     */\n    @JvmField\n    val MAP_FIXED_DELAY = ViewAnnotationUpdateMode(\"MAP_FIXED_DELAY\")\n\n    /**\n     * View annotations are updated on the same frame as the MapView camera.\n     *\n     * Using this mode results in updating both map camera and view annotation position with 1-frame delay.\n     * Please note that using this mode may slightly decrease FPS when view annotations are visible on the map.\n     */\n    @JvmField\n    val MAP_SYNCHRONIZED = ViewAnnotationUpdateMode(\"MAP_SYNCHRONIZED\")\n  }\n}"
  },
  {
    "path": "maps-sdk/src/main/java/com/mapbox/maps/viewannotation/ViewAnnotationVisibility.kt",
    "content": "package com.mapbox.maps.viewannotation\n\ninternal enum class ViewAnnotationVisibility {\n  /**\n   * Initial state, track it separately for several corner cases.\n   */\n  INITIAL,\n\n  /**\n   * View is set to be visible based on Android view visibility obtained from OnGlobalLayoutListener\n   * but view will actually be positioned later based on [VISIBLE_AND_POSITIONED].\n   */\n  VISIBLE_AND_NOT_POSITIONED,\n\n  /**\n   * View is totally visible for the user.\n   */\n  VISIBLE_AND_POSITIONED,\n\n  /**\n   * View is either removed from layout or not visible.\n   */\n  INVISIBLE,\n}"
  },
  {
    "path": "maps-sdk/src/main/res/drawable/mapbox_rounded_corner.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"#A6FFFFFF\"/>\n    <padding\n            android:left=\"7.5dp\"\n            android:right=\"7.5dp\"\n            android:top=\"2dp\"\n            android:bottom=\"3dp\"/>\n    <corners android:radius=\"7.5dp\"/>\n</shape>"
  },
  {
    "path": "maps-sdk/src/main/res/values/attrs.xml",
    "content": "<resources>\n    <declare-styleable name=\"mapbox_MapView\">\n        <!-- The map context mode. This can be used to optimizations if we know that the drawing context is not shared with other code. -->\n        <attr name=\"mapbox_mapContextMode\" format=\"enum\">\n            <!-- Unique context mode: in OpenGL, the GL context is not shared, thus we can retain knowledge about the GL state from a previous render pass. It also enables clearing the screen using glClear for the bottommost background layer when no pattern is applied to that layer. -->\n            <enum name=\"unique\" value=\"0\" />\n            <!-- Shared context mode: in OpenGL, the GL context is shared with other renderers, thus we cannot rely on the GL state set from a previous render pass. -->\n            <enum name=\"shared\" value=\"1\" />\n        </attr>\n        <!-- The map constrain mode. This can be used to limit the map to wrap around the globe horizontally. By default, it is set to HeightOnly. -->\n        <attr name=\"mapbox_mapConstrainMode\" format=\"enum\">\n            <!-- No constraints. -->\n            <enum name=\"none\" value=\"0\" />\n            <!-- Constrain to height only. -->\n            <enum name=\"height_only\" value=\"1\" />\n            <!-- Constrain both width and height axes. -->\n            <enum name=\"width_and_height\" value=\"2\" />\n        </attr>\n        <!-- The viewport mode. This can be used to flip the vertical orientation of the map as some devices may use inverted orientation. -->\n        <attr name=\"mapbox_mapViewportMode\" format=\"enum\">\n            <!-- Default viewport. -->\n            <enum name=\"default_viewport\" value=\"0\" />\n            <!-- Viewport flipped on the y-axis. -->\n            <enum name=\"flipped_y\" value=\"1\" />\n        </attr>\n        <!-- The orientation of the Map. By default, it is set to upwards. -->\n        <attr name=\"mapbox_mapOrientation\" format=\"enum\">\n            <!-- Default, map oriented upwards. -->\n            <enum name=\"upwards\" value=\"0\" />\n            <!-- Map oriented rightwards. -->\n            <enum name=\"rightwards\" value=\"1\" />\n            <!-- Map oriented downwards. -->\n            <enum name=\"downwards\" value=\"2\" />\n            <!-- Map oriented lefttwards. -->\n            <enum name=\"lefttwards\" value=\"3\" />\n        </attr>\n        <!-- To enable cross-source symbol collision detection or not. By default, it is set to true. -->\n        <attr name=\"mapbox_mapCrossSourceCollisionsEnabled\" format=\"boolean\" />\n        <!-- The custom pixel ratio. By default, it is set to 1. -->\n        <attr name=\"mapbox_mapPixelRatio\" format=\"float\" />\n        <!-- The view type used to render. -->\n        <attr name=\"mapbox_mapSurface\" format=\"enum\">\n            <!-- Default, map rendering on a SurfaceView with no alpha channel in EGL config. -->\n            <enum name=\"surface_view\" value=\"0\" />\n            <!-- Map rendering on a TextureView with 8-byte alpha channel in EGL config. -->\n            <enum name=\"texture_view\" value=\"1\" />\n        </attr>\n        <!-- MSAA sample count. Defaults to 1 meaning MSAA is disabled. Most common values are 4, 8 etc (stand for MSAA x4, x8 etc). Higher values result in better quality, but may reduce overall performance. -->\n        <attr name=\"mapbox_mapAntialiasingSampleCount\" format=\"integer\"/>\n        <!-- Custom name which will be appended to map render related logs. May be useful when using several MapViews. Defaults to an empty string. -->\n        <attr name=\"mapbox_mapName\" format=\"string\"/>\na\n        <!-- Font family to use as font fallback for client-side text renderings. -->\n        <attr name=\"mapbox_mapFontFamily\" format=\"string\" />\n        <!-- Describes glyphs rasterization modes. -->\n        <attr name=\"mapbox_mapGlyphRasterizationMode\" format=\"enum\">\n            <!-- No glyphs are rasterized locally. All glyphs are loaded from the server. -->\n            <enum name=\"no_glyphs_rasterized_locally\" value=\"0\" />\n            <!-- Ideographs are rasterized locally, and they are not loaded from the server. -->\n            <enum name=\"ideographs_rasterized_locally\" value=\"1\" />\n            <!-- All glyphs are rasterized locally. No glyphs are loaded from the server. -->\n            <enum name=\"all_glyphs_rasterized_locally\" value=\"2\" />\n        </attr>\n\n        <!-- OLD MANUAL WRITTEN configuration-->\n        <!--Camera-->\n        <attr name=\"mapbox_cameraTargetLat\" format=\"float\" />\n        <attr name=\"mapbox_cameraTargetLng\" format=\"float\" />\n        <attr name=\"mapbox_cameraZoom\" format=\"float\" />\n        <attr name=\"mapbox_cameraBearing\" format=\"float\" />\n        <attr name=\"mapbox_cameraPitch\" format=\"float\" />\n        <attr name=\"mapbox_cameraAnchorX\" format=\"float\" />\n        <attr name=\"mapbox_cameraAnchorY\" format=\"float\" />\n        <attr name=\"mapbox_cameraPaddingTop\" format=\"float\" />\n        <attr name=\"mapbox_cameraPaddingLeft\" format=\"float\" />\n        <attr name=\"mapbox_cameraPaddingBottom\" format=\"float\" />\n        <attr name=\"mapbox_cameraPaddingRight\" format=\"float\" />\n\n        <!-- The default style uri to load when no style is set. -->\n        <attr name=\"mapbox_styleUri\" format=\"string\" />\n    </declare-styleable>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"mapbox_gray_dark\">#5F5F5F</color>\n    <color name=\"mapbox_gray\">#7D7F80</color>\n    <color name=\"mapbox_blue\">#1E8CAB</color>\n\n    <color name=\"mapbox_location_layer_blue\">#4A90E2</color>\n    <color name=\"mapbox_location_layer_gray\">#A1B0C0</color>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"mapView\" type=\"id\"/>\n    <item name=\"composeView\" type=\"id\"/>\n</resources>"
  },
  {
    "path": "maps-sdk/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Improve This Map</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox Telemetry</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox Privacy Policy</string>\n    <string name=\"mapbox_geofencing_consent\">Mapbox Geofencing</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-ar/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">تحسين هذه الخريطة</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox القياس عن بعد</string>\n    <string name=\"mapbox_privacy_policy\">سياسة خصوصية Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-be/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Палепшыць карту</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox Тэлеметрыя</string>\n    <string name=\"mapbox_privacy_policy\">Палітыка прыватнасці Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-bg/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Подобрете тази карта</string>\n    <string name=\"mapbox_telemetrySettings\">Телеметрия на Mapbox</string>\n    <string name=\"mapbox_privacy_policy\">Правила за поверителност на Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-ca/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Millora aquest mapa</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetria de Mapbox</string>\n    <string name=\"mapbox_privacy_policy\">Política de privadesa de Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-cs/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Vylepšete tuto mapu</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetrie Mapboxu</string>\n    <string name=\"mapbox_privacy_policy\">Zásady ochrany osobních údajů Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-da/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Forbedre dette kort</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox Telemetri</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox Privatlivspolitik</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-de/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Verbessere diese Karte</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox-Telemetrie</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox-Datenschutzrichtlinie</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-es/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Mejorar este mapa</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetría de Mapbox</string>\n    <string name=\"mapbox_privacy_policy\">Política de privacidad de Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-fr/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Améliorer cette carte</string>\n    <string name=\"mapbox_telemetrySettings\">Télémétrie Mapbox</string>\n    <string name=\"mapbox_privacy_policy\">Politique de confidentialité de Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-gl/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Mellora este mapa</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetría Mapbox</string>\n    <string name=\"mapbox_privacy_policy\">Política de privacidade de Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-it/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Migliora questa mappa</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetria Mapbox</string>\n    <string name=\"mapbox_privacy_policy\">Informativa sulla privacy di Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-iw/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">שפר את המפה הזו</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox Telemetry</string>\n    <string name=\"mapbox_privacy_policy\">מדיניות הפרטיות של Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-ja/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">この地図を改善してください</string>\n    <string name=\"mapbox_telemetrySettings\">マップボックス テレメトリ</string>\n    <string name=\"mapbox_privacy_policy\">マップボックスのプライバシーポリシー</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-ko/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">이 지도를 개선하세요</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox 원격 측정</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox 개인정보 보호정책</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-lt/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Patobulinkite šį žemėlapį</string>\n    <string name=\"mapbox_telemetrySettings\">„Mapbox“ telemetrija</string>\n    <string name=\"mapbox_privacy_policy\">„Mapbox“ privatumo politika</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-nl/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Verbeter deze kaart</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox-telemetrie</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox-privacybeleid</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-no/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Forbedre dette kartet</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox Telemetri</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox personvernerklæring</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-pl/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Popraw tę mapę</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetria Mapboxa</string>\n    <string name=\"mapbox_privacy_policy\">Polityka prywatności Mapboxa</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-pt/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Melhore este mapa</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetria Mapbox</string>\n    <string name=\"mapbox_privacy_policy\">Política de Privacidade da Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-ru/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Улучшить карту</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox Телеметрия</string>\n    <string name=\"mapbox_privacy_policy\">Политика конфиденциальности Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-sv/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Förbättra den här kartan</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox Telemetri</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox sekretesspolicy</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-uk/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Поліпшити картку</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox Телеметрія</string>\n    <string name=\"mapbox_privacy_policy\">Політика конфіденційності Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-vi/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">Cải thiện bản đồ này</string>\n    <string name=\"mapbox_telemetrySettings\">Đo từ xa Mapbox</string>\n    <string name=\"mapbox_privacy_policy\">Chính sách quyền riêng tư của Mapbox</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-zh/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">改进这张地图</string>\n    <string name=\"mapbox_telemetrySettings\">Mapbox 遥测</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox 隐私政策</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-zh-rCN/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">完善地图</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetry设置</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox隐私政策</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-zh-rHK/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">完善地圖</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetry設置</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox隱私權政策</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res/values-zh-rTW/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_telemetryImproveMap\">完善地圖</string>\n    <string name=\"mapbox_telemetrySettings\">Telemetry設置</string>\n    <string name=\"mapbox_privacy_policy\">Mapbox隱私權政策</string>\n</resources>\n"
  },
  {
    "path": "maps-sdk/src/main/res-public/values/public.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- The map context mode. This can be used to optimizations if we know that the drawing context is not shared with other code. -->\n    <public name=\"mapbox_mapContextMode\" type=\"attr\" />\n\n    <!-- The map constrain mode. This can be used to limit the map to wrap around the globe horizontally. By default, it is set to HeightOnly. -->\n    <public name=\"mapbox_mapConstrainMode\" type=\"attr\" />\n\n    <!-- The viewport mode. This can be used to flip the vertical orientation of the map as some devices may use inverted orientation. -->\n    <public name=\"mapbox_mapViewportMode\" type=\"attr\" />\n\n    <!-- The orientation of the Map. By default, it is set to upwards. -->\n    <public name=\"mapbox_mapOrientation\" type=\"attr\" />\n\n    <!-- To enable cross-source symbol collision detection or not. By default, it is set to true. -->\n    <public name=\"mapbox_mapCrossSourceCollisionsEnabled\" type=\"attr\" />\n\n    <!-- The custom pixel ratio. By default, it is set to 1. -->\n    <public name=\"mapbox_mapPixelRatio\" type=\"attr\" />\n\n    <!-- Font family used for client-side text rendering. -->\n    <public name=\"mapbox_mapFontFamily\" type=\"attr\" />\n\n    <!-- The view type used to render. -->\n    <public name=\"mapbox_mapSurface\" type=\"attr\" />\n\n    <!-- MSAA sample count. Defaults to 1 meaning MSAA is disabled. Most common values are 4, 8 etc (stand for MSAA x4, x8 etc). Higher values result in better quality, but may reduce overall performance. -->\n    <public name=\"mapbox_mapAntialiasingSampleCount\" type=\"attr\"/>\n\n    <!-- Custom name which will be appended to map render related logs. May be useful when using several MapViews. Defaults to an empty string. -->\n    <public name=\"mapbox_mapName\" type=\"string\"/>\n\n    <!-- Describes glyphs rasterization modes. -->\n    <public name=\"mapbox_mapGlyphRasterizationMode\" type=\"attr\" />\n\n    <!-- OLD MANUAL WRITTEN configuration-->\n\n    <!--Camera-->\n    <public name=\"mapbox_cameraTargetLat\" type=\"attr\"/>\n    <public name=\"mapbox_cameraTargetLng\" type=\"attr\"/>\n    <public name=\"mapbox_cameraZoom\" type=\"attr\"/>\n    <public name=\"mapbox_cameraBearing\" type=\"attr\"/>\n    <public name=\"mapbox_cameraPitch\" type=\"attr\"/>\n    <public name=\"mapbox_cameraAnchorX\" type=\"attr\"/>\n    <public name=\"mapbox_cameraAnchorY\" type=\"attr\"/>\n    <public name=\"mapbox_cameraPaddingTop\" type=\"attr\"/>\n    <public name=\"mapbox_cameraPaddingLeft\" type=\"attr\"/>\n    <public name=\"mapbox_cameraPaddingBottom\" type=\"attr\"/>\n    <public name=\"mapbox_cameraPaddingRight\" type=\"attr\"/>\n\n    <!-- The default style uri to load when no style is set. -->\n    <public name=\"mapbox_styleUri\" type=\"attr\" />\n</resources>"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/TestUtils.kt",
    "content": "package com.mapbox\n\nimport io.mockk.*\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\ninternal fun verifyNo(\n  ordering: Ordering = Ordering.UNORDERED,\n  timeout: Long = 0,\n  verifyBlock: MockKVerificationScope.() -> Unit\n) = verify(\n  ordering = ordering,\n  exactly = 0,\n  timeout = timeout,\n  verifyBlock = verifyBlock,\n)\n\ninternal fun verifyOnce(\n  ordering: Ordering = Ordering.UNORDERED,\n  timeout: Long = 0,\n  verifyBlock: MockKVerificationScope.() -> Unit\n) = verify(\n  ordering = ordering,\n  exactly = 1,\n  timeout = timeout,\n  verifyBlock = verifyBlock,\n)\n\ninternal fun waitZeroCounter(startCounter: Int = 1, timeoutMillis: Int = 1000, runnable: CountDownLatch.() -> Unit) {\n  val countDownLatch = CountDownLatch(startCounter)\n  runnable(countDownLatch)\n  if (!countDownLatch.await(timeoutMillis.toLong(), TimeUnit.MILLISECONDS)) {\n    throw TimeoutException(\"Test had failed, counter is not zero but $startCounter after $timeoutMillis milliseconds!\")\n  }\n}\n\ninternal fun CountDownLatch.countDownEvery(stubBlock: MockKMatcherScope.() -> Unit) {\n  every(stubBlock).answers { countDown() }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/CameraAttributeParserTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.res.TypedArray\nimport io.mockk.every\nimport io.mockk.mockk\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\n\nclass CameraAttributeParserTest {\n\n  private val typedArray = mockk<TypedArray>()\n\n  @Before\n  fun setUp() {\n    every { typedArray.getFloat(any(), any()) } returns 0.0f\n  }\n\n  @Test\n  fun getCameraOptionsNoXmlAttributes() {\n    val cameraOptions = CameraAttributeParser.parseCameraOptions(typedArray, 1.0f)\n    assertEquals(\n      \"Camera options should be null\",\n      null,\n      cameraOptions,\n    )\n  }\n\n  @Test\n  fun getCameraOptionsHasFullXmlAttribute() {\n    every { typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraBearing, 0f) } returns 5.0f\n    val cameraOptions = CameraAttributeParser.parseCameraOptions(typedArray, 1.0f)\n    assertEquals(\n      \"Camera options should have valid attribute\",\n      5.0,\n      cameraOptions?.bearing\n    )\n  }\n\n  @Test\n  fun getCameraOptionsMostPartXmlAttribute() {\n    every {\n      typedArray.getFloat(\n        R.styleable.mapbox_MapView_mapbox_cameraPaddingRight,\n        0f\n      )\n    } returns 5.0f\n    val cameraOptions = CameraAttributeParser.parseCameraOptions(typedArray, 99.0f)\n    assertEquals(\n      \"Camera options should have valid attribute parameter and all other defaulted\",\n      EdgeInsets(0.0, 0.0, 0.0, 5.0),\n      cameraOptions?.padding,\n    )\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/EqualsHashCodeTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.maps.renderer.RendererError\nimport com.mapbox.maps.renderer.widget.WidgetPosition\nimport com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode\nimport nl.jqno.equalsverifier.EqualsVerifier\nimport org.junit.Test\n\nclass EqualsHashCodeTest {\n  @Test\n  fun `RendererError hashCode and equals test`() {\n    val clazz = RendererError::class.java\n    EqualsVerifier.forClass(clazz)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `ViewAnnotationUpdateMode hashCode and equals test`() {\n    val clazz = ViewAnnotationUpdateMode::class.java\n    EqualsVerifier.forClass(clazz)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  @OptIn(MapboxExperimental::class)\n  fun `WidgetPosition hashCode and equals test`() {\n    val clazz = WidgetPosition::class.java\n    EqualsVerifier.forClass(clazz)\n      .withIgnoredFields(\"horizontal\", \"vertical\")\n      .usingGetClass()\n      .verify()\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/FontUtilsTest.kt",
    "content": "package com.mapbox.maps\n\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass FontUtilsTest {\n\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun testExtractedFontShouldMatchDefault() {\n    val actual = FontUtils.extractValidFont(\"foo\")\n    assertEquals(\"Selected font should match\", \"sans-serif\", actual)\n  }\n\n  @Test\n  fun testExtractedFontShouldMatchSansSerif() {\n    val actual = FontUtils.extractValidFont(\"sans-serif\")\n    assertEquals(\"Selected font should match\", \"sans-serif\", actual)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapAttributeParserTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.res.TypedArray\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass MapAttributeParserTest {\n\n  private lateinit var typedArray: TypedArray\n\n  @Before\n  fun setUp() {\n    typedArray = mockk(relaxed = true)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    every { typedArray.getString(any()) } returns null\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getFloat(any(), any()) } returns 99.0f\n    every { typedArray.getInt(any(), any()) } returns 0\n    every {\n      typedArray.getInt(\n        R.styleable.mapbox_MapView_mapbox_mapGlyphRasterizationMode,\n        any()\n      )\n    } returns 1\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun default() {\n    val mapOptions = MapAttributeParser.parseMapOptions(typedArray, 99.0f)\n    assertEquals(ConstrainMode.NONE, mapOptions.constrainMode)\n    assertEquals(ContextMode.UNIQUE, mapOptions.contextMode)\n    assertEquals(true, mapOptions.crossSourceCollisions)\n    assertEquals(\"sans-serif\", mapOptions.glyphsRasterizationOptions!!.fontFamily)\n    assertEquals(\n      GlyphsRasterizationMode.IDEOGRAPHS_RASTERIZED_LOCALLY,\n      mapOptions.glyphsRasterizationOptions!!.rasterizationMode,\n    )\n    assertEquals(NorthOrientation.UPWARDS, mapOptions.orientation)\n    assertEquals(99.0f, mapOptions.pixelRatio)\n    assertEquals(null, mapOptions.size)\n    assertEquals(ViewportMode.DEFAULT, mapOptions.viewportMode)\n  }\n\n  @Test\n  fun fontFamilyNone() {\n    every {\n      typedArray.getInt(\n        R.styleable.mapbox_MapView_mapbox_mapGlyphRasterizationMode,\n        any()\n      )\n    } returns 0\n    val mapOptions = MapAttributeParser.parseMapOptions(typedArray, 99.0f)\n    assertNull(\"monospace\", mapOptions.glyphsRasterizationOptions!!.fontFamily)\n  }\n\n  @Test\n  fun fontFamilyNope() {\n    every { typedArray.getString(R.styleable.mapbox_MapView_mapbox_mapFontFamily) } returns \"foobar\"\n    val mapOptions = MapAttributeParser.parseMapOptions(typedArray, 99.0f)\n    assertEquals(\"sans-serif\", mapOptions.glyphsRasterizationOptions!!.fontFamily)\n  }\n\n  @Test\n  fun constraintModeNone() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapConstrainMode, 1) } returns 0\n    assertEquals(\n      ConstrainMode.NONE,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).constrainMode\n    )\n  }\n\n  @Test\n  fun constraintModeHeightOnly() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapConstrainMode, 1) } returns 1\n    assertEquals(\n      ConstrainMode.HEIGHT_ONLY,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).constrainMode\n    )\n  }\n\n  @Test\n  fun constraintModeWidthAndHeight() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapConstrainMode, 1) } returns 2\n    assertEquals(\n      ConstrainMode.WIDTH_AND_HEIGHT,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).constrainMode\n    )\n  }\n\n  @Test\n  fun contextUnique() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapContextMode, 0) } returns 0\n    assertEquals(\n      ContextMode.UNIQUE,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).contextMode\n    )\n  }\n\n  @Test\n  fun contextModeShared() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapContextMode, 0) } returns 1\n    assertEquals(\n      ContextMode.SHARED,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).contextMode\n    )\n  }\n\n  @Test\n  fun mapAttributeParserCrossSourceCollisionsTrue() {\n    every {\n      typedArray.getBoolean(\n        R.styleable.mapbox_MapView_mapbox_mapCrossSourceCollisionsEnabled,\n        true\n      )\n    } returns true\n    assertEquals(\n      true,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).crossSourceCollisions\n    )\n  }\n\n  @Test\n  fun mapAttributeParserCrossSourceCollisionsFalse() {\n    every {\n      typedArray.getBoolean(\n        R.styleable.mapbox_MapView_mapbox_mapCrossSourceCollisionsEnabled,\n        true\n      )\n    } returns false\n    assertEquals(\n      false,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).crossSourceCollisions\n    )\n  }\n\n  @Test\n  fun northOrientationUpwards() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapOrientation, 0) } returns 0\n    assertEquals(\n      NorthOrientation.UPWARDS,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).orientation\n    )\n  }\n\n  @Test\n  fun northOrientationDownwards() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapOrientation, 0) } returns 2\n    assertEquals(\n      NorthOrientation.DOWNWARDS,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).orientation\n    )\n  }\n\n  @Test\n  fun northOrientationLeftwards() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapOrientation, 0) } returns 3\n    assertEquals(\n      NorthOrientation.LEFTWARDS,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).orientation\n    )\n  }\n\n  @Test\n  fun northOrientationRightwards() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapOrientation, 0) } returns 1\n    assertEquals(\n      NorthOrientation.RIGHTWARDS,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).orientation\n    )\n  }\n\n  @Test\n  fun viewportModeDefault() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapViewportMode, 0) } returns 0\n    assertEquals(\n      ViewportMode.DEFAULT,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).viewportMode\n    )\n  }\n\n  @Test\n  fun viewportModeYFlipped() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapViewportMode, 0) } returns 1\n    assertEquals(\n      ViewportMode.FLIPPED_Y,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).viewportMode\n    )\n  }\n\n  @Test\n  fun pixelRatio() {\n    every {\n      typedArray.getFloat(\n        R.styleable.mapbox_MapView_mapbox_mapPixelRatio,\n        any()\n      )\n    } returns 9000.0f\n    assertEquals(\n      9000.0f,\n      MapAttributeParser.parseMapOptions(typedArray, 99.0f).pixelRatio\n    )\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapControllerTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.view.MotionEvent\nimport com.mapbox.common.Cancelable\nimport com.mapbox.common.EventsService\nimport com.mapbox.common.TelemetryService\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.MapPluginRegistry\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.renderer.MapboxRenderThread\nimport com.mapbox.maps.renderer.MapboxRenderer\nimport com.mapbox.maps.renderer.OnFpsChangedListener\nimport com.mapbox.maps.renderer.widget.BitmapWidget\nimport com.mapbox.maps.renderer.widget.Widget\nimport com.mapbox.maps.shadows.ShadowCancelable\nimport com.mapbox.maps.shadows.ShadowEventsService\nimport com.mapbox.maps.shadows.ShadowTelemetryService\nimport com.mapbox.verifyOnce\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(\n  shadows = [\n    ShadowEventsService::class,\n    ShadowTelemetryService::class,\n    ShadowCancelable::class\n  ]\n)\nclass MapControllerTest {\n  private val mockRenderer: MapboxRenderer = mockk()\n  private val mockNativeObserver: NativeObserver = mockk()\n  private val mockNativeMap: NativeMapImpl = mockk()\n  private val mockMapboxMap: MapboxMap = mockk()\n  private val mockPluginRegistry: MapPluginRegistry = mockk()\n  private val mockMapInitOptions: MapInitOptions = mockk()\n  private val mockCameraState: CameraState = mockk()\n  private val mockMotionEvent: MotionEvent = mockk()\n  private val mockContext: Context = mockk()\n  private val mockMapView: MapView = mockk()\n  private val mockOnStyleDataLoadedListener: StyleDataLoadedCallback = mockk()\n  private val mockEventsService = mockk<EventsService>()\n  private val mockTelemetryService = mockk<TelemetryService>()\n\n  private lateinit var testMapController: MapController\n  private val cancelable = mockk<Cancelable>(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    every { mockContext.packageName } returns \"com.mapbox.maps\"\n\n    testMapController = MapController(\n      mockRenderer,\n      mockNativeObserver,\n      mockMapInitOptions,\n      ContextMode.SHARED,\n      mockNativeMap,\n      mockMapboxMap,\n      mockPluginRegistry,\n      mockOnStyleDataLoadedListener\n    )\n\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n\n    mockkStatic(EventsService::class)\n    every { EventsService.getOrCreate(any()) } returns mockEventsService\n    every { mockEventsService.flush(any()) } just runs\n\n    mockkStatic(TelemetryService::class)\n    every { TelemetryService.getOrCreate() } returns mockTelemetryService\n    every { mockTelemetryService.flush(any()) } just runs\n    every { cancelable.cancel() } just runs\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @Test\n  fun onStart() {\n    every { mockPluginRegistry.onStart() } just Runs\n    every { mockMapboxMap.loadStyle(Style.MAPBOX_STREETS) } just Runs\n    every { mockNativeObserver.subscribeCameraChangedCoalesced(any()) } returns cancelable\n    every { mockNativeObserver.subscribeStyleDataLoaded(any()) } returns cancelable\n    every { mockRenderer.onStart() } just Runs\n    every { mockMapboxMap.isStyleLoadInitiated } returns false\n    every { mockMapInitOptions.styleUri } answers { Style.MAPBOX_STREETS }\n    every { mockMapboxMap.style } returns null\n\n    testMapController.onStart()\n\n    verifySequence {\n      mockMapboxMap.style\n      mockNativeObserver.subscribeCameraChangedCoalesced(any())\n      mockNativeObserver.subscribeStyleDataLoaded(any())\n      mockRenderer.onStart()\n      mockMapboxMap.isStyleLoadInitiated\n      mockMapboxMap.loadStyle(Style.MAPBOX_STREETS)\n      mockPluginRegistry.onStart()\n    }\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @Test\n  fun onStartWithStyleLoaded() {\n    every { mockMapboxMap.isStyleLoadInitiated } returns true\n    every { mockPluginRegistry.onStart() } just Runs\n    every { mockRenderer.onStart() } just Runs\n    every { mockNativeObserver.subscribeCameraChangedCoalesced(any()) } returns cancelable\n    every { mockNativeObserver.subscribeStyleDataLoaded(any()) } returns cancelable\n    every { mockMapboxMap.style } returns mockk()\n    every { mockPluginRegistry.onStyleChanged(any()) } just Runs\n\n    testMapController.onStart()\n\n    verify(exactly = 0) { mockMapboxMap.loadStyle(Style.MAPBOX_STREETS) }\n  }\n\n  @Test\n  fun onStop() {\n    every { cancelable.cancel() } just Runs\n    every { mockPluginRegistry.onStop() } just Runs\n    every { mockRenderer.onStop() } just Runs\n    testMapController.lifecycleState = MapController.LifecycleState.STATE_STARTED\n    testMapController.onStop()\n\n    verifySequence {\n      mockRenderer.onStop()\n      mockPluginRegistry.onStop()\n      mockEventsService.flush(any())\n      mockTelemetryService.flush(any())\n    }\n  }\n\n  @Test\n  fun onResume() {\n    every { mockRenderer.onResume() } just Runs\n\n    testMapController.onResume()\n\n    verifySequence {\n      mockRenderer.onResume()\n    }\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @Test\n  fun onStartDeliversUpdatedStyle() {\n    every { mockPluginRegistry.onStyleChanged(any()) } just Runs\n    every { mockPluginRegistry.onStop() } just Runs\n    every { mockPluginRegistry.onStart() } just Runs\n    every { mockRenderer.onStop() } just Runs\n    every { mockRenderer.onStart() } just Runs\n    every { mockNativeObserver.subscribeCameraChangedCoalesced(any()) } returns cancelable\n    every { mockNativeObserver.subscribeStyleDataLoaded(any()) } returns cancelable\n    every { cancelable.cancel() } just Runs\n    every { mockMapboxMap.isStyleLoadInitiated } returns false\n    every { mockMapboxMap.loadStyle(any<String>()) } just Runs\n    every { mockMapInitOptions.styleUri } returns \"uri\"\n\n    val style1 = mockk<Style>()\n    every { mockMapboxMap.style } returns style1\n    testMapController.onStart()\n\n    testMapController.onStop()\n    val style2 = mockk<Style>()\n    every { mockMapboxMap.style } returns style2\n    testMapController.onStart()\n\n    verifySequence {\n      mockPluginRegistry.onStyleChanged(style1)\n      mockPluginRegistry.onStart()\n      mockPluginRegistry.onStop()\n      mockPluginRegistry.onStyleChanged(style2)\n      mockPluginRegistry.onStart()\n    }\n  }\n\n  @Test\n  fun onReduceMemoryUse() {\n    every { mockMapboxMap.reduceMemoryUse() } just Runs\n\n    testMapController.onLowMemory()\n\n    verify { mockMapboxMap.reduceMemoryUse() }\n  }\n\n  @Test\n  fun onDestroy() {\n    every { mockMapboxMap.onDestroy() } just Runs\n    every { mockPluginRegistry.onDestroy() } just Runs\n    every { mockNativeObserver.onDestroy() } just Runs\n    every { mockRenderer.onDestroy() } just Runs\n\n    testMapController.onDestroy()\n\n    verifySequence {\n      mockPluginRegistry.onDestroy()\n      mockNativeObserver.onDestroy()\n      mockRenderer.onDestroy()\n      mockMapboxMap.onDestroy()\n    }\n  }\n\n  @Test\n  fun onTouch() {\n    every { mockPluginRegistry.onTouch(mockMotionEvent) } returns true\n\n    testMapController.onTouchEvent(mockMotionEvent)\n\n    verify { mockPluginRegistry.onTouch(mockMotionEvent) }\n  }\n\n  @Test\n  fun onGenericMotionEvent() {\n    val expectedValue = true\n    every { mockPluginRegistry.onGenericMotionEvent(mockMotionEvent) } returns expectedValue\n\n    val actualValue = testMapController.onGenericMotionEvent(mockMotionEvent)\n\n    assertEquals(expectedValue, actualValue)\n    verify { mockPluginRegistry.onGenericMotionEvent(mockMotionEvent) }\n  }\n\n  @Test\n  fun onSizeChanged() {\n    every { mockPluginRegistry.onSizeChanged(0, 0) } just Runs\n\n    val slotRunnable = slot<Runnable>()\n    every { mockRenderer.queueRenderEvent(capture(slotRunnable)) } answers { slotRunnable.captured.run() }\n    every { mockRenderer.onSurfaceChanged(any(), any()) } just Runs\n    every { mockNativeMap.sizeSet = any() } just Runs\n\n    testMapController.onSizeChanged(0, 0)\n\n    verify { mockRenderer.onSurfaceChanged(0, 0) }\n    verify { mockPluginRegistry.onSizeChanged(0, 0) }\n  }\n\n  @Test\n  fun mapboxMapRequest() {\n    assertEquals(mockMapboxMap, testMapController.mapboxMap)\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @Test\n  fun cameraPluginNotified() {\n    val onCameraChangeListenerSlot = slot<CameraChangedCallback>()\n    val cameraChangedCoalescedCallbackSlot = slot<CameraChangedCoalescedCallback>()\n    every { mockNativeObserver.subscribeCameraChanged(capture(onCameraChangeListenerSlot)) } returns cancelable\n    every { mockNativeObserver.subscribeCameraChangedCoalesced(capture(cameraChangedCoalescedCallbackSlot)) } returns cancelable\n    every { mockNativeObserver.subscribeStyleDataLoaded(any()) } returns cancelable\n    every { mockPluginRegistry.onStart() } just Runs\n    every { mockRenderer.onStart() } just Runs\n    every { mockPluginRegistry.onCameraMove(mockCameraState) } just Runs\n    every { mockMapboxMap.loadStyle(Style.MAPBOX_STREETS) } just Runs\n//    every { mockNativeMap.getCameraState() } returns mockCameraState\n    every { mockMapboxMap.isStyleLoadInitiated } returns false\n    every { mockMapInitOptions.styleUri } answers { Style.MAPBOX_STREETS }\n    every { mockMapboxMap.style } returns null\n\n    testMapController.onStart()\n\n    // Make sure MapController uses the coalesced callback instead of normal one.\n    assertFalse(onCameraChangeListenerSlot.isCaptured)\n\n    val cameraChangedCoalescedCallback = cameraChangedCoalescedCallbackSlot.captured\n    cameraChangedCoalescedCallback.run(CameraChangedCoalesced(mockCameraState, mockk()))\n\n    verifySequence {\n      mockMapboxMap.style\n      mockMapboxMap.isStyleLoadInitiated\n      mockMapboxMap.loadStyle(Style.MAPBOX_STREETS)\n      mockPluginRegistry.onStart()\n      mockPluginRegistry.onCameraMove(mockCameraState)\n    }\n  }\n\n  @Test\n  fun createPlugin() {\n    val mockPlugin = mockk<Plugin.Custom>()\n    every { mockPluginRegistry.createPlugin(mockMapView, mockMapInitOptions, mockPlugin) } just Runs\n\n    testMapController.createPlugin(mockMapView, mockPlugin)\n\n    verify { mockPluginRegistry.createPlugin(mockMapView, mockMapInitOptions, mockPlugin) }\n  }\n\n  @Test\n  fun getPlugin() {\n    val plugin = mockk<MapPlugin>()\n    every { mockPluginRegistry.getPlugin<MapPlugin>(\"id\") } returns plugin\n\n    assertEquals(plugin, testMapController.getPlugin(\"id\"))\n    verify { mockPluginRegistry.getPlugin<MapPlugin>(\"id\") }\n  }\n\n  @Test\n  fun queueEvent() {\n    val event = mockk<Runnable>()\n    every { mockRenderer.queueNonRenderEvent(event) } just Runs\n    every { mockRenderer.queueRenderEvent(event) } just Runs\n\n    testMapController.queueEvent(event, false)\n    testMapController.queueEvent(event, true)\n\n    verifySequence {\n      mockRenderer.queueNonRenderEvent(event)\n      mockRenderer.queueRenderEvent(event)\n    }\n  }\n\n  @Test\n  fun snapshotSync() {\n    every { mockRenderer.snapshot() } answers { Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) }\n\n    testMapController.snapshot()\n\n    verify { mockRenderer.snapshot() }\n  }\n\n  @Test\n  fun snapshotAsync() {\n    val listener = mockk<MapView.OnSnapshotReady>()\n    every { mockRenderer.snapshot(listener) } just Runs\n\n    testMapController.snapshot(listener)\n\n    verify { mockRenderer.snapshot(listener) }\n  }\n\n  @Test\n  fun setMaximumFpsValid() {\n    every { mockRenderer.setMaximumFps(60) } just Runs\n\n    testMapController.setMaximumFps(60)\n\n    verify { mockRenderer.setMaximumFps(60) }\n  }\n\n  @Test\n  fun setMaximumFpsInvalid() {\n    every { mockRenderer.setMaximumFps(any()) } just Runs\n\n    testMapController.setMaximumFps(-1)\n\n    // range check is performed within MapboxRenderer\n    verify { mockRenderer.setMaximumFps(any()) }\n  }\n\n  @Test\n  fun setOnFpsChangedListener() {\n    val listener = mockk<OnFpsChangedListener>()\n    every { mockRenderer.setOnFpsChangedListener(listener) } just Runs\n\n    testMapController.setOnFpsChangedListener(listener)\n\n    verifyAll { mockRenderer.setOnFpsChangedListener(listener) }\n  }\n\n  @Test\n  fun initializePluginsEmpty() {\n    every { mockMapInitOptions.plugins } answers { emptyList() }\n\n    testMapController.initializePlugins(mockMapInitOptions)\n    verify(exactly = 0) {\n      mockPluginRegistry.createPlugin(any(), mockMapInitOptions, any())\n      mockMapboxMap.cameraAnimationsPlugin = any()\n      mockMapboxMap.gesturesPlugin = any()\n    }\n  }\n\n  @Test\n  fun initializePluginsCamera() {\n    every { mockMapboxMap.cameraAnimationsPlugin = any() } just Runs\n    every { mockMapInitOptions.plugins } answers { listOf(Plugin.Mapbox(Plugin.MAPBOX_CAMERA_PLUGIN_ID)) }\n    val createPluginSlot = slot<Plugin>()\n    every {\n      mockPluginRegistry.createPlugin(\n        mockMapView,\n        mockMapInitOptions,\n        capture(createPluginSlot)\n      )\n    } just Runs\n\n    testMapController.initializePlugins(mockMapInitOptions, mockMapView)\n\n    val createdPlugin = createPluginSlot.captured\n    assertEquals(Plugin.MAPBOX_CAMERA_PLUGIN_ID, createdPlugin.id)\n    verifySequence {\n      mockMapInitOptions.plugins\n      mockPluginRegistry.createPlugin(mockMapView, mockMapInitOptions, createdPlugin)\n      mockMapboxMap.cameraAnimationsPlugin = createdPlugin.instance as CameraAnimationsPlugin\n    }\n  }\n\n  @Test\n  fun deliversStyleOnStartIfChanged() {\n    every { mockMapboxMap.cameraAnimationsPlugin = any() } just Runs\n    every { mockMapInitOptions.plugins } answers { listOf(Plugin.Mapbox(Plugin.MAPBOX_CAMERA_PLUGIN_ID)) }\n    val createPluginSlot = slot<Plugin>()\n    every {\n      mockPluginRegistry.createPlugin(\n        mockMapView,\n        mockMapInitOptions,\n        capture(createPluginSlot)\n      )\n    } just Runs\n\n    testMapController.initializePlugins(mockMapInitOptions, mockMapView)\n\n    val createdPlugin = createPluginSlot.captured\n    assertEquals(Plugin.MAPBOX_CAMERA_PLUGIN_ID, createdPlugin.id)\n    verifySequence {\n      mockMapInitOptions.plugins\n      mockPluginRegistry.createPlugin(mockMapView, mockMapInitOptions, createdPlugin)\n      mockMapboxMap.cameraAnimationsPlugin = createdPlugin.instance as CameraAnimationsPlugin\n    }\n  }\n\n  @Test\n  fun setValidScreenRefreshRate() {\n    screenRefreshRateTest(1, 60)\n  }\n\n  @Test\n  fun setZeroScreenRefreshRate() {\n    screenRefreshRateTest(0, 0)\n  }\n\n  @Test\n  fun setNegativeScreenRefreshRate() {\n    screenRefreshRateTest(0, -1)\n  }\n\n  @Test\n  fun setMaxScreenRefreshRate() {\n    screenRefreshRateTest(1, Int.MAX_VALUE)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun addWidgetTest() {\n    val mockWidget = mockk<BitmapWidget>()\n    every { mockWidget.setTriggerRepaintAction(any()) } just runs\n    val mockRenderThread = mockk<MapboxRenderThread>(relaxed = true)\n    every { mockRenderer.renderThread } returns mockRenderThread\n    every { mockRenderer.scheduleRepaint() } just runs\n    testMapController.addWidget(mockWidget)\n    verifyOnce { mockRenderThread.addWidget(mockWidget) }\n    verifyOnce { mockWidget.setTriggerRepaintAction(any()) }\n    verifyOnce { mockRenderer.scheduleRepaint() }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun removeWidgetTest() {\n    val widget = createTestWidget()\n    val mockRenderThread = mockk<MapboxRenderThread>(relaxed = true)\n    every { mockRenderer.renderThread } returns mockRenderThread\n    every { mockRenderer.scheduleRepaint() } just runs\n    every { mockRenderThread.removeWidget(widget) } returns true\n    assertTrue(testMapController.removeWidget(widget))\n    verifyOnce { mockRenderThread.removeWidget(widget) }\n    verifyOnce { mockRenderer.scheduleRepaint() }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun removeWidgetWithoutAddTest() {\n    val widget = createTestWidget()\n    val mockRenderThread = mockk<MapboxRenderThread>(relaxed = true)\n    every { mockRenderer.renderThread } returns mockRenderThread\n    assertFalse(testMapController.removeWidget(widget))\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test(expected = RuntimeException::class)\n  fun addWidgetTestUniqueContext() {\n    val initOptions = mockk<MapInitOptions>(relaxed = true)\n    every { initOptions.mapOptions } returns MapOptions.Builder().contextMode(ContextMode.UNIQUE).build()\n    testMapController = MapController(\n      mockRenderer,\n      mockNativeObserver,\n      mockMapInitOptions,\n      ContextMode.UNIQUE,\n      mockNativeMap,\n      mockMapboxMap,\n      mockPluginRegistry,\n      mockOnStyleDataLoadedListener\n    )\n    testMapController.addWidget(mockk())\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun addWidgetTestNullContext() {\n    val initOptions = mockk<MapInitOptions>(relaxed = true)\n    every { initOptions.mapOptions } returns MapOptions.Builder().build()\n    testMapController = MapController(\n      mockRenderer,\n      mockNativeObserver,\n      mockMapInitOptions,\n      null,\n      mockNativeMap,\n      mockMapboxMap,\n      mockPluginRegistry,\n      mockOnStyleDataLoadedListener\n    )\n    testMapController.addWidget(mockk())\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun createTestWidget(): Widget {\n    val bitmap = mockk<Bitmap>()\n    every { bitmap.width } returns 0\n    every { bitmap.height } returns 0\n    return BitmapWidget(bitmap)\n  }\n\n  private fun screenRefreshRateTest(expectedCallCount: Int, actualRefreshRate: Int) {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    val mockRenderThread = mockk<MapboxRenderThread>(relaxed = true)\n    every { mockRenderer.renderThread } returns mockRenderThread\n    testMapController.setScreenRefreshRate(actualRefreshRate)\n    verify(exactly = expectedCallCount) {\n      mockRenderThread.setScreenRefreshRate(any())\n    }\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapInitOptionsTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport android.util.DisplayMetrics\nimport com.mapbox.maps.MapView.Companion.DEFAULT_ANTIALIASING_SAMPLE_COUNT\nimport com.mapbox.maps.plugin.*\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass MapInitOptionsTest {\n\n  private val context: Context = mockk(relaxUnitFun = true)\n  private val displayMetrics: DisplayMetrics = mockk(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    every { context.resources.displayMetrics } returns displayMetrics\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    displayMetrics.density = 1f\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun surfaceView() {\n    assertEquals(false, MapInitOptions(context).textureView)\n    assertEquals(true, MapInitOptions(context, textureView = true).textureView)\n  }\n\n  @Test\n  fun antialiasingSampleCount() {\n    assertEquals(DEFAULT_ANTIALIASING_SAMPLE_COUNT, MapInitOptions(context).antialiasingSampleCount)\n    assertEquals(0, MapInitOptions(context, antialiasingSampleCount = 0).antialiasingSampleCount)\n    assertEquals(8, MapInitOptions(context, antialiasingSampleCount = 8).antialiasingSampleCount)\n  }\n\n  @Test\n  fun defaultMapOptions() {\n    val mapboxMapOptions = MapInitOptions(context)\n    assertEquals(\n      GlyphsRasterizationMode.IDEOGRAPHS_RASTERIZED_LOCALLY,\n      mapboxMapOptions.mapOptions.glyphsRasterizationOptions!!.rasterizationMode\n    )\n    assertEquals(\n      FontUtils.extractValidFont(null),\n      mapboxMapOptions.mapOptions.glyphsRasterizationOptions!!.fontFamily\n    )\n    assertEquals(1f, mapboxMapOptions.mapOptions.pixelRatio)\n    assertEquals(1f, mapboxMapOptions.mapOptions.scaleFactor)\n    assertEquals(\n      ConstrainMode.HEIGHT_ONLY,\n      mapboxMapOptions.mapOptions.constrainMode\n    )\n    assertEquals(ContextMode.UNIQUE, mapboxMapOptions.mapOptions.contextMode)\n    assertEquals(NorthOrientation.UPWARDS, mapboxMapOptions.mapOptions.orientation)\n    assertEquals(ViewportMode.DEFAULT, mapboxMapOptions.mapOptions.viewportMode)\n    assertEquals(true, mapboxMapOptions.mapOptions.crossSourceCollisions)\n    assertEquals(Style.STANDARD, mapboxMapOptions.styleUri)\n  }\n\n  @Test\n  fun defaultPlugins() {\n    val mapboxMapOptions = MapInitOptions(context)\n    val plugins = mapboxMapOptions.plugins\n    assertEquals(\n      MapInitOptions.defaultPluginList,\n      plugins\n    )\n  }\n\n  @Test\n  fun emptyPlugins() {\n    val mapboxMapOptions = MapInitOptions(context, plugins = listOf())\n    val plugins = mapboxMapOptions.plugins\n    assertTrue(plugins.isEmpty())\n  }\n\n  @Test\n  fun customPlugins() {\n    val customPluginDummy = object : MapPlugin {}\n    val mapboxMapOptions = MapInitOptions(\n      context,\n      plugins = listOf(\n        Plugin.Custom(\"customId\", customPluginDummy)\n      )\n    )\n    val plugins = mapboxMapOptions.plugins\n    assertTrue(plugins.size == 1)\n    assertEquals(\"customId\", plugins[0].id)\n    assertEquals(customPluginDummy, plugins[0].instance)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapSurfaceTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.view.Display\nimport android.view.MotionEvent\nimport android.view.Surface\nimport android.view.WindowManager\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.renderer.MapboxSurfaceRenderer\nimport com.mapbox.maps.renderer.OnFpsChangedListener\nimport com.mapbox.maps.renderer.RendererSetupErrorListener\nimport com.mapbox.maps.renderer.widget.BitmapWidget\nimport com.mapbox.verifyOnce\nimport io.mockk.*\nimport junit.framework.Assert.assertEquals\nimport junit.framework.Assert.assertNull\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.TestCoroutineScheduler\nimport kotlinx.coroutines.test.UnconfinedTestDispatcher\nimport kotlinx.coroutines.test.resetMain\nimport kotlinx.coroutines.test.setMain\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@RunWith(RobolectricTestRunner::class)\nclass MapSurfaceTest {\n\n  private lateinit var context: Context\n  private lateinit var mapController: MapController\n  private lateinit var mapSurface: MapSurface\n  private lateinit var mapInitOptions: MapInitOptions\n  private lateinit var mapboxSurfaceRenderer: MapboxSurfaceRenderer\n  private lateinit var surface: Surface\n\n  private val testScheduler = TestCoroutineScheduler()\n  private val testDispatcher = UnconfinedTestDispatcher(testScheduler)\n  private val mainTestDispatcher = UnconfinedTestDispatcher(testScheduler, \"MainTestDispatcher\")\n  private val testScope = CoroutineScope(testDispatcher)\n\n  @Before\n  fun setUp() {\n    Dispatchers.setMain(mainTestDispatcher)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    every { logW(any(), any()) } just Runs\n    every { logE(any(), any()) } just Runs\n\n    context = mockk(relaxUnitFun = true)\n    mapInitOptions = mockk(relaxUnitFun = true)\n    mapController = mockk(relaxUnitFun = true)\n    mapboxSurfaceRenderer = mockk(relaxUnitFun = true)\n    surface = mockk(relaxed = true)\n\n    // Use test scope for lifecycleScope\n    every { mapController.lifecycleScope } returns testScope\n\n    mapSurface = MapSurface(\n      context,\n      surface,\n      mapInitOptions,\n      mapboxSurfaceRenderer,\n      mapController\n    )\n  }\n\n  @After\n  fun cleanUp() {\n    Dispatchers.resetMain()\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun testGetSurface() {\n    assertEquals(surface, mapSurface.surface)\n  }\n\n  @Test\n  fun testSurfaceCreated() {\n    val display: Display = mockk()\n    val windowManager: WindowManager = mockk()\n    val refreshRate = 100f\n    @Suppress(\"DEPRECATION\")\n    every { windowManager.defaultDisplay } returns display\n    every { display.refreshRate } returns refreshRate\n    every { context.getSystemService(Context.WINDOW_SERVICE) } returns windowManager\n\n    mapSurface.surfaceCreated()\n\n    verifyOnce { mapboxSurfaceRenderer.surfaceCreated() }\n    // Verify the immediate default setting is called\n    verifySequence {\n      mapController.setScreenRefreshRate(MapView.DEFAULT_FPS)\n      mapController.lifecycleScope\n      mapController.setScreenRefreshRate(refreshRate.toInt())\n    }\n  }\n\n  @Test\n  fun testSurfaceCreatedWithNoWindowManager() {\n    every { context.getSystemService(Context.WINDOW_SERVICE) } returns null\n\n    mapSurface.surfaceCreated()\n\n    verifyOnce { mapboxSurfaceRenderer.surfaceCreated() }\n    // Verify the immediate default setting is called\n    verify { mapController.setScreenRefreshRate(MapView.DEFAULT_FPS) }\n  }\n\n  @Test\n  fun checkSurfaceChanged() {\n    val w = 100\n    val h = 200\n    mapSurface.surfaceChanged(w, h)\n    verifyOnce { mapboxSurfaceRenderer.surfaceChanged(surface, w, h) }\n    verifyOnce { mapSurface.onSizeChanged(w, h) }\n  }\n\n  @Test\n  fun testSurfaceDestroyed() {\n    mapSurface.surfaceDestroyed()\n    verifyOnce { mapboxSurfaceRenderer.surfaceDestroyed() }\n  }\n\n  @Test\n  fun testGetMapboxMap() {\n    val nativeMap: NativeMapImpl = mockk(relaxed = true)\n    val nativeObserver: NativeObserver = mockk(relaxed = true)\n    val styleObserver: StyleObserver = mockk(relaxUnitFun = true)\n    val mapboxMap = MapboxMap(nativeMap, nativeObserver, styleObserver)\n    every { mapController.mapboxMap } returns mapboxMap\n    val result = mapSurface.mapboxMap\n    verifyOnce { mapController.mapboxMap }\n    assertEquals(mapboxMap, result)\n  }\n\n  @Test\n  fun testOnTouchEvent() {\n    val event = MotionEvent.obtain(0, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)\n    every { mapController.onTouchEvent(any()) } returns true\n    mapSurface.onTouchEvent(event)\n    verifyOnce { mapController.onTouchEvent(event) }\n  }\n\n  @Test\n  fun testOnGenericMotionEvent() {\n    val event = MotionEvent.obtain(0, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)\n    every { mapController.onGenericMotionEvent(any()) } returns true\n    mapSurface.onGenericMotionEvent(event)\n    verifyOnce { mapController.onGenericMotionEvent(event) }\n  }\n\n  @Test\n  fun testQueueEvent() {\n    val event = Runnable {}\n    mapSurface.queueEvent(event)\n    verifyOnce { mapController.queueEvent(event) }\n  }\n\n  @Test\n  fun testSnapshot() {\n    every { mapController.snapshot() } returns null\n    val snapshot = mapSurface.snapshot()\n    verifyOnce { mapController.snapshot() }\n    assertNull(snapshot)\n  }\n\n  @Test\n  fun testSnapshotAsync() {\n    every { mapController.snapshot(any()) } just runs\n    val listener = MapView.OnSnapshotReady { }\n    mapSurface.snapshot(listener)\n    verifyOnce { mapController.snapshot(listener) }\n  }\n\n  @Test\n  fun setMaximumFpsTest() {\n    val fps = 160\n    mapSurface.setMaximumFps(fps)\n    verifyOnce { mapboxSurfaceRenderer.setMaximumFps(fps) }\n  }\n\n  @Test\n  fun setOnFpsChangedListenerTest() {\n    val listener = OnFpsChangedListener { }\n    mapSurface.setOnFpsChangedListener(listener)\n    verifyOnce { mapboxSurfaceRenderer.setOnFpsChangedListener(listener) }\n  }\n\n  @Test\n  fun onStartTest() {\n    mapSurface.onStart()\n    verifyOnce { mapController.onStart() }\n  }\n\n  @Test\n  fun onStopTest() {\n    mapSurface.onStop()\n    verifyOnce { mapController.onStop() }\n  }\n\n  @Test\n  fun onDestroyTest() {\n    mapSurface.onDestroy()\n    verifyOnce { mapController.onDestroy() }\n  }\n\n  @Test\n  fun onLowMemoryTest() {\n    mapSurface.onLowMemory()\n    verifyOnce { mapController.onLowMemory() }\n  }\n\n  @MapboxExperimental\n  @Test\n  fun addWidgetTest() {\n    val bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)\n    val widget = BitmapWidget(bitmap)\n    mapSurface.addWidget(widget)\n    verifyOnce { mapController.addWidget(widget) }\n    bitmap.recycle()\n  }\n\n  @MapboxExperimental\n  @Test\n  fun removeWidgetTest() {\n    val bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)\n    val widget = BitmapWidget(bitmap)\n    every { mapController.removeWidget(any()) } returns true\n    mapSurface.removeWidget(widget)\n    verifyOnce { mapController.removeWidget(widget) }\n    bitmap.recycle()\n  }\n\n  @Test\n  fun addRendererSetupErrorListenerTest() {\n    val listener = RendererSetupErrorListener { }\n    mapSurface.addRendererSetupErrorListener(listener)\n    verifyOnce { mapController.addRendererSetupErrorListener(listener) }\n  }\n\n  @Test\n  fun removeRendererSetupErrorListenerTest() {\n    val listener = RendererSetupErrorListener { }\n    mapSurface.removeRendererSetupErrorListener(listener)\n    verifyOnce { mapController.removeRendererSetupErrorListener(listener) }\n  }\n\n  @Test\n  fun getPluginTest() {\n    val pluginId = \"no_such_plugin\"\n    every { mapSurface.getPlugin<MapPlugin>(any()) } returns null\n    val plugin: MapPlugin? = mapSurface.getPlugin(pluginId)\n    verifyOnce { mapController.getPlugin<MapPlugin>(pluginId) }\n    assertNull(plugin)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapViewTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.view.MotionEvent\nimport androidx.test.core.app.ApplicationProvider\nimport com.mapbox.maps.debugoptions.DebugOptionsController\nimport com.mapbox.maps.debugoptions.MapViewDebugOptions\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.renderer.OnFpsChangedListener\nimport com.mapbox.maps.renderer.RendererSetupErrorListener\nimport com.mapbox.verifyNo\nimport io.mockk.*\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.TestCoroutineScheduler\nimport kotlinx.coroutines.test.UnconfinedTestDispatcher\nimport kotlinx.coroutines.test.resetMain\nimport kotlinx.coroutines.test.setMain\nimport org.junit.After\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@RunWith(RobolectricTestRunner::class)\nclass MapViewTest {\n\n  private lateinit var mapController: MapController\n  private lateinit var mapboxMap: MapboxMap\n  private lateinit var mapView: MapView\n\n  private val testScheduler = TestCoroutineScheduler()\n  private val testDispatcher = UnconfinedTestDispatcher(testScheduler)\n  private val mainTestDispatcher = UnconfinedTestDispatcher(testScheduler, \"MainTestDispatcher\")\n  private val testScope = CoroutineScope(testDispatcher)\n\n  @Before\n  fun setUp() {\n    Dispatchers.setMain(mainTestDispatcher)\n    mockkConstructor(DebugOptionsController::class)\n    every { anyConstructed<DebugOptionsController>().options = any() } just Runs\n    mapController = mockk(relaxUnitFun = true)\n    mapboxMap = mockk(relaxUnitFun = true)\n    every { mapController.mapboxMap } returns mapboxMap\n    // Use test scope for lifecycleScope\n    every { mapController.lifecycleScope } returns testScope\n\n    mapView = MapView(\n      ApplicationProvider.getApplicationContext(),\n      null,\n      mapController,\n    )\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    every { logW(any(), any()) } just Runs\n    every { logE(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    Dispatchers.resetMain()\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun start() {\n    mapView.onStart()\n\n    verify { mapController.onStart() }\n    verify { mapController.setScreenRefreshRate(MapView.DEFAULT_FPS) }\n  }\n\n  @Test\n  fun stop() {\n    mapView.onStop()\n    verify { mapController.onStop() }\n  }\n\n  @Test\n  fun resume() {\n    mapView.onResume()\n    verify { mapController.onResume() }\n  }\n\n  @Test\n  fun onDestroy() {\n    mapView.onDestroy()\n    verify { mapController.onDestroy() }\n  }\n\n  @Test\n  fun onLowMemory() {\n    mapView.onLowMemory()\n    verify { mapController.onLowMemory() }\n  }\n\n  @Test\n  fun getMapboxMap() {\n    mapView.mapboxMap\n    verify { mapController.mapboxMap }\n  }\n\n  @Test\n  fun getDebugOptions() {\n    mapView.debugOptions\n    verify { anyConstructed<DebugOptionsController>().options }\n  }\n\n  @Test\n  fun setDebugOption() {\n    val debugOptions: Set<MapViewDebugOptions> = mockk()\n\n    mapView.debugOptions = debugOptions\n\n    verify { anyConstructed<DebugOptionsController>().options = debugOptions }\n  }\n\n  @Test\n  fun debugOptionsControllerNotInitializedByLifecycle() {\n    mapView.onStart()\n    mapView.onStop()\n\n    verifyNo { anyConstructed<DebugOptionsController>().started = any() }\n    verifyNo { anyConstructed<DebugOptionsController>().started = any() }\n  }\n\n  @Test\n  fun debugOptionsControllerInitializedByOptions() {\n    mapView.debugOptions = setOf()\n\n    mapView.onStart()\n    mapView.onStop()\n\n    verify { anyConstructed<DebugOptionsController>().started = true }\n    verify { anyConstructed<DebugOptionsController>().started = false }\n  }\n\n  @Test\n  fun onSizeChangedCalled() {\n    mapView.onSizeChanged(10, 15, 5, 5)\n    verify { mapController.onSizeChanged(10, 15) }\n  }\n\n  @Test\n  fun onSizeChangedNotCalled() {\n    mapView.onSizeChanged(1, 1, 1, 1)\n    verify(exactly = 0) { mapController.onSizeChanged(any(), any()) }\n  }\n\n  @Test\n  fun onGenericMotionEventController() {\n    val event = mockk<MotionEvent>()\n    every { mapController.onGenericMotionEvent(any()) } returns true\n    assertTrue(mapView.onGenericMotionEvent(event))\n    verify { mapController.onGenericMotionEvent(event) }\n  }\n\n  @Test\n  fun onGenericMotionEventSuper() {\n    val event = mockk<MotionEvent>()\n    every { mapController.onGenericMotionEvent(any()) } returns false\n    assertFalse(mapView.onGenericMotionEvent(event))\n    verify { mapController.onGenericMotionEvent(event) }\n  }\n\n  @Test\n  fun onTouchEventController() {\n    val event = mockk<MotionEvent>()\n    every { mapController.onTouchEvent(any()) } returns true\n    assertTrue(mapView.onTouchEvent(event))\n    verify { mapController.onTouchEvent(event) }\n  }\n\n  @Test\n  fun onTouchEventSuper() {\n    val event = mockk<MotionEvent>()\n    every { mapController.onTouchEvent(any()) } returns false\n    assertFalse(mapView.onTouchEvent(event))\n    verify { mapController.onTouchEvent(event) }\n  }\n\n  @Test\n  fun setMaximumFps() {\n    mapView.setMaximumFps(60)\n    verify { mapController.setMaximumFps(60) }\n  }\n\n  @Test\n  fun queueEvent() {\n    val runnable = mockk<Runnable>()\n    mapView.queueEvent(runnable)\n    verify { mapController.queueEvent(runnable) }\n  }\n\n  @Test\n  fun snapshotSync() {\n    every { mapController.snapshot() } returns mockk()\n    mapView.snapshot()\n    verify { mapController.snapshot() }\n  }\n\n  @Test\n  fun snapshotCallback() {\n    val callback = mockk<MapView.OnSnapshotReady>()\n    mapView.snapshot(callback)\n    verify { mapController.snapshot(callback) }\n  }\n\n  @Test\n  fun createPlugin() {\n    every { mapController.createPlugin(any(), any()) } returns mockk()\n    val plugin = Plugin.Custom(\"id\", mockk())\n    mapView.createPlugin(plugin)\n    verify { mapController.createPlugin(mapView, plugin) }\n  }\n\n  @Test\n  fun getPlugin() {\n    every { mapController.getPlugin<MapPlugin>(any()) } returns mockk()\n    mapView.getPlugin<MapPlugin>(\"id\")\n    verify { mapController.getPlugin<MapPlugin>(\"id\") }\n  }\n\n  @Test\n  fun setOnFpsChangedListener() {\n    val listener = mockk<OnFpsChangedListener>()\n    mapView.setOnFpsChangedListener(listener)\n    verify { mapController.setOnFpsChangedListener(listener) }\n  }\n\n  @Test\n  fun addRendererSetupErrorListener() {\n    val listener = mockk<RendererSetupErrorListener>()\n    mapView.addRendererSetupErrorListener(listener)\n    verify { mapController.addRendererSetupErrorListener(listener) }\n  }\n\n  @Test\n  fun removeRendererSetupErrorListener() {\n    val listener = mockk<RendererSetupErrorListener>()\n    mapView.removeRendererSetupErrorListener(listener)\n    verify { mapController.removeRendererSetupErrorListener(listener) }\n  }\n\n  @OptIn(MapboxExperimental::class, MapboxDelicateApi::class)\n  @Test\n  fun scheduleThreadServiceTypeReset() {\n    val renderThread = mockk<com.mapbox.maps.renderer.MapboxRenderThread>(relaxUnitFun = true)\n    val renderer = mockk<com.mapbox.maps.renderer.MapboxRenderer>(relaxed = true)\n    every { mapController.renderer } returns renderer\n    every { renderer.renderThread } returns renderThread\n    mapView.scheduleThreadServiceTypeReset()\n    verify { renderThread.scheduleThreadServiceTypeReset() }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapViewTypedArrayTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.Context\nimport android.content.res.Resources\nimport android.content.res.TypedArray\nimport android.util.AttributeSet\nimport android.util.DisplayMetrics\nimport com.mapbox.maps.MapView.Companion.DEFAULT_ANTIALIASING_SAMPLE_COUNT\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n@RunWith(Parameterized::class)\nclass MapViewTypedArrayTest(\n  private val inputAntialiasingSampleCount: Int,\n  private val inputMapSurfaceMode: Int,\n  private val inputMapStyle: String?,\n  private val expectedAntialiasingSampleCount: Int,\n  private val expectedTextureMode: Boolean,\n  private val expectedStyle: String?,\n) {\n\n  private lateinit var attrs: AttributeSet\n  private lateinit var context: Context\n  private lateinit var mapView: MapView\n\n  @Before\n  fun setUp() {\n    attrs = mockk()\n    val mapController = mockk<MapController>(relaxUnitFun = true)\n    val mapboxMap = mockk<MapboxMap>(relaxUnitFun = true)\n    every { mapController.mapboxMap } returns mapboxMap\n    mapView = MapView(\n      mockk(relaxed = true),\n      mockk(relaxed = true),\n      mapController,\n    )\n    context = mockk()\n    val typedArray = mockk<TypedArray>()\n    val resources = mockk<Resources>()\n    val mapOptions = mockk<MapOptions>()\n    val cameraOptions = mockk<CameraOptions>()\n    val displayMetrics: DisplayMetrics = mockk()\n    mockkObject(MapAttributeParser)\n    mockkObject(CameraAttributeParser)\n    every { context.resources } returns resources\n    every { resources.displayMetrics } returns displayMetrics\n    every { MapAttributeParser.parseMapOptions(any(), any()) } returns mapOptions\n    every { CameraAttributeParser.parseCameraOptions(any()) } returns cameraOptions\n\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_mapSurface, 0) } returns inputMapSurfaceMode\n    every { typedArray.getInteger(R.styleable.mapbox_MapView_mapbox_mapAntialiasingSampleCount, DEFAULT_ANTIALIASING_SAMPLE_COUNT) } returns inputAntialiasingSampleCount\n    every { typedArray.getString(R.styleable.mapbox_MapView_mapbox_mapName) } returns \"\"\n    every { typedArray.getString(R.styleable.mapbox_MapView_mapbox_styleUri) } returns inputMapStyle\n    every { typedArray.recycle() } just Runs\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n  }\n\n  @Test\n  fun parseTypedArray() {\n    val mapInitOptions = mapView.parseTypedArray(context, attrs)\n    assertEquals(expectedTextureMode, mapInitOptions.textureView)\n    assertEquals(expectedAntialiasingSampleCount, mapInitOptions.antialiasingSampleCount)\n    assertEquals(expectedStyle, mapInitOptions.styleUri)\n  }\n\n  @After\n  fun shutDown() {\n    unmockkAll()\n  }\n\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters\n    fun data() = listOf(\n      arrayOf(\n        /* inputAntialiasingSampleCount */ 8,\n        /* inputMapSurfaceMode */ 0,\n        /* inputMapStyle */ null,\n        /* expectedAntialiasingSampleCount */ 8,\n        /* expectedTextureMode */ false,\n        /* expectedStyle */ Style.STANDARD,\n      ),\n      arrayOf(\n        /* inputAntialiasingSampleCount */ DEFAULT_ANTIALIASING_SAMPLE_COUNT,\n        /* inputMapSurfaceMode */ 0,\n        /* inputMapStyle */ \"\",\n        /* expectedAntialiasingSampleCount */ DEFAULT_ANTIALIASING_SAMPLE_COUNT,\n        /* expectedTextureMode */ false,\n        /* expectedStyle */ null,\n      ),\n      arrayOf(\n        /* inputAntialiasingSampleCount */ 16,\n        /* inputMapSurfaceMode */ 1,\n        /* inputMapStyle */ Style.SATELLITE,\n        /* expectedAntialiasingSampleCount */ 16,\n        /* expectedTextureMode */ true,\n        /* expectedStyle */ Style.SATELLITE,\n      ),\n    )\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapboxMapExtTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.coroutine.cameraChangedCoalescedEvents\nimport com.mapbox.maps.coroutine.cameraChangedEvents\nimport com.mapbox.maps.coroutine.genericEvents\nimport com.mapbox.maps.coroutine.mapIdleEvents\nimport com.mapbox.maps.coroutine.mapLoadedEvents\nimport com.mapbox.maps.coroutine.mapLoadingErrorEvents\nimport com.mapbox.maps.coroutine.renderFrameFinishedEvents\nimport com.mapbox.maps.coroutine.renderFrameStartedEvents\nimport com.mapbox.maps.coroutine.resourceRequestEvents\nimport com.mapbox.maps.coroutine.sourceAddedEvents\nimport com.mapbox.maps.coroutine.sourceDataLoadedEvents\nimport com.mapbox.maps.coroutine.sourceRemovedEvents\nimport com.mapbox.maps.coroutine.styleDataLoadedEvents\nimport com.mapbox.maps.coroutine.styleImageMissingEvents\nimport com.mapbox.maps.coroutine.styleImageRemoveUnusedEvents\nimport com.mapbox.maps.coroutine.styleLoadedEvents\nimport io.mockk.CapturingSlot\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.runs\nimport io.mockk.slot\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.toList\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.test.TestScope\nimport kotlinx.coroutines.test.UnconfinedTestDispatcher\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertSame\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\nimport org.robolectric.annotation.LooperMode\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\n@Config(shadows = [ShadowMap::class])\nclass MapboxMapExtTest {\n\n  private lateinit var nativeObserver: NativeObserver\n  private val cancelable = mockk<Cancelable>(relaxUnitFun = true)\n  private val nativeMap: NativeMapImpl = mockk(relaxed = true)\n\n  private lateinit var styleObserver: StyleObserver\n  private lateinit var mapboxMap: MapboxMap\n\n  @Before\n  fun setUp() {\n    nativeObserver = mockk()\n    every { cancelable.cancel() } just runs\n    styleObserver = mockk(relaxUnitFun = true)\n    mapboxMap = MapboxMap(nativeMap, nativeObserver, styleObserver)\n  }\n\n  @Test\n  fun mapLoadedEvents() = runTest {\n    testEventsFlow(NativeObserver::subscribeMapLoaded, MapboxMap::mapLoadedEvents, MapLoadedCallback::run)\n  }\n\n  @Test\n  fun mapLoadingErrorEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeMapLoadingError,\n      MapboxMap::mapLoadingErrorEvents,\n      MapLoadingErrorCallback::run\n    )\n  }\n\n  @Test\n  fun styleLoadedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeStyleLoaded,\n      MapboxMap::styleLoadedEvents,\n      StyleLoadedCallback::run\n    )\n  }\n\n  @Test\n  fun styleDataLoadedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeStyleDataLoaded,\n      MapboxMap::styleDataLoadedEvents,\n      StyleDataLoadedCallback::run\n    )\n  }\n\n  @Test\n  fun cameraChangedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeCameraChanged,\n      MapboxMap::cameraChangedEvents,\n      CameraChangedCallback::run\n    )\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun cameraChangedCoalescedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeCameraChangedCoalesced,\n      MapboxMap::cameraChangedCoalescedEvents,\n      CameraChangedCoalescedCallback::run\n    )\n  }\n\n  @Test\n  fun mapIdleEvents() = runTest {\n    testEventsFlow(NativeObserver::subscribeMapIdle, MapboxMap::mapIdleEvents, MapIdleCallback::run)\n  }\n\n  @Test\n  fun sourceAddedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeSourceAdded,\n      MapboxMap::sourceAddedEvents,\n      SourceAddedCallback::run\n    )\n  }\n\n  @Test\n  fun sourceRemovedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeSourceRemoved,\n      MapboxMap::sourceRemovedEvents,\n      SourceRemovedCallback::run\n    )\n  }\n\n  @Test\n  fun sourceDataLoadedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeSourceDataLoaded,\n      MapboxMap::sourceDataLoadedEvents,\n      SourceDataLoadedCallback::run\n    )\n  }\n\n  @Test\n  fun styleImageMissingEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeStyleImageMissing,\n      MapboxMap::styleImageMissingEvents,\n      StyleImageMissingCallback::run\n    )\n  }\n\n  @Test\n  fun styleImageRemoveUnusedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeStyleImageRemoveUnused,\n      MapboxMap::styleImageRemoveUnusedEvents,\n      StyleImageRemoveUnusedCallback::run\n    )\n  }\n\n  @Test\n  fun renderFrameStartedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeRenderFrameStarted,\n      MapboxMap::renderFrameStartedEvents,\n      RenderFrameStartedCallback::run\n    )\n  }\n\n  @Test\n  fun renderFrameFinishedEvents() = runTest {\n    testEventsFlow(\n      NativeObserver::subscribeRenderFrameFinished,\n      MapboxMap::renderFrameFinishedEvents,\n      RenderFrameFinishedCallback::run\n    )\n  }\n\n  @Test\n  fun resourceRequestEvents() = runTest {\n    val callbackSlot: CapturingSlot<ResourceRequestCallback> = CapturingSlot()\n    val onCancelSlot: CapturingSlot<() -> Unit> = slot()\n    every {\n      nativeObserver.subscribeResourceRequest(\n        capture(callbackSlot),\n        capture(onCancelSlot),\n      )\n    } returns cancelable\n\n    val values = mutableListOf<ResourceRequest>()\n    backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {\n      mapboxMap.resourceRequestEvents.toList(values)\n    }\n    val event: ResourceRequest = mockk()\n    callbackSlot.captured.run(event)\n    callbackSlot.captured.run(event)\n    val event2: ResourceRequest = mockk()\n    callbackSlot.captured.run(event2)\n    onCancelSlot.captured.invoke()\n\n    assertEquals(3, values.size)\n    assertSame(event, values[0])\n    assertSame(event, values[1])\n    assertSame(event2, values[2])\n  }\n\n  @Test\n  fun genericEvents() = runTest {\n    val eventName = \"test-event\"\n    val callbackSlot: CapturingSlot<GenericEventCallback> = CapturingSlot()\n    val onCancelSlot = mutableListOf<(() -> Unit)?>()\n    every {\n      nativeObserver.subscribeGenericEvent(\n        eventName,\n        capture(callbackSlot),\n        captureNullable(onCancelSlot),\n      )\n    } returns cancelable\n\n    val values = mutableListOf<GenericEvent>()\n    backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {\n      mapboxMap.genericEvents(eventName).toList(values)\n    }\n    val genericEvent: GenericEvent = mockk()\n    callbackSlot.captured.run(genericEvent)\n    callbackSlot.captured.run(genericEvent)\n    val genericEvent2: GenericEvent = mockk()\n    callbackSlot.captured.run(genericEvent2)\n    onCancelSlot.first()!!.invoke()\n\n    assertEquals(3, values.size)\n    assertSame(genericEvent, values[0])\n    assertSame(genericEvent, values[1])\n    assertSame(genericEvent2, values[2])\n  }\n\n  private inline fun <reified EventCallback : Any, reified EventData> testEventsFlow(\n    crossinline subscribe: NativeObserver.(EventCallback, (() -> Unit)?) -> Cancelable,\n    crossinline getFlow: MapboxMap.() -> Flow<EventData>,\n    crossinline callbackRun: EventCallback.(EventData) -> Unit\n  ) = runTest {\n    val callbackSlot: CapturingSlot<EventCallback> = CapturingSlot()\n    val onCancelSlot = slot<() -> Unit>()\n    every {\n      nativeObserver.subscribe(\n        capture(callbackSlot),\n        capture(onCancelSlot),\n      )\n    } returns cancelable\n    testEventsFlow<EventCallback, EventData>(getFlow, callbackSlot, callbackRun, onCancelSlot)\n  }\n\n  private inline fun <reified EventCallback : Any, reified EventListener : Any, reified EventData> testEventsFlow(\n    crossinline subscribe: NativeObserver.(EventCallback, (() -> Unit)?, EventListener?) -> Cancelable,\n    crossinline getFlow: MapboxMap.() -> Flow<EventData>,\n    crossinline callbackRun: EventCallback.(EventData) -> Unit\n  ) = runTest {\n    val callbackSlot: CapturingSlot<EventCallback> = CapturingSlot()\n    val onCancelSlot = slot<() -> Unit>()\n    every {\n      nativeObserver.subscribe(\n        capture(callbackSlot),\n        capture(onCancelSlot),\n        any(),\n      )\n    } returns cancelable\n\n    testEventsFlow<EventCallback, EventData>(getFlow, callbackSlot, callbackRun, onCancelSlot)\n  }\n\n  private inline fun <reified EventCallback : Any, reified EventData> TestScope.testEventsFlow(\n      crossinline getFlow: MapboxMap.() -> Flow<EventData>,\n      callbackSlot: CapturingSlot<EventCallback>,\n      callbackRun: EventCallback.(EventData) -> Unit,\n      onCancelSlot: CapturingSlot<() -> Unit>\n  ) {\n    val values = mutableListOf<EventData>()\n    backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {\n      mapboxMap.getFlow().toList(values)\n      }\n    val styleDataLoaded: EventData = mockk()\n    callbackSlot.captured.callbackRun(styleDataLoaded)\n    callbackSlot.captured.callbackRun(styleDataLoaded)\n    val styleDataLoaded2: EventData = mockk()\n    callbackSlot.captured.callbackRun(styleDataLoaded2)\n    onCancelSlot.captured.invoke()\n\n    assertEquals(3, values.size)\n    assertSame(styleDataLoaded, values[0])\n    assertSame(styleDataLoaded, values[1])\n    assertSame(styleDataLoaded2, values[2])\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapboxMapRecorderTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.bindgen.DataRef\nimport com.mapbox.verifyOnce\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.unmockkStatic\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\nimport java.nio.ByteBuffer\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowMapRecorder::class])\nclass MapboxMapRecorderTest {\n\n  private val coreRecorder = mockk<MapRecorder>(relaxed = true)\n  private val mapboxMapRecorder = MapboxMapRecorder(coreRecorder)\n\n  @Test\n  fun startRecording() {\n    val options = mapRecorderOptions { }\n    mapboxMapRecorder.startRecording(options)\n    verifyOnce { coreRecorder.startRecording(options) }\n  }\n\n  @Test\n  fun stopRecording() {\n    val buffer = ByteBuffer.allocateDirect(5)\n    val dataRef = mockk<DataRef>()\n    every { dataRef.buffer } returns buffer\n    every { coreRecorder.stopRecording() } returns dataRef\n    val result = mapboxMapRecorder.stopRecording()\n    verifyOnce { coreRecorder.stopRecording() }\n    assert(result == buffer.rewind())\n  }\n\n  @Test\n  fun replay() {\n    mockkStatic(DataRef::class)\n    val buffer = ByteBuffer.allocateDirect(5)\n    val dataRef = mockk<DataRef>(relaxed = true)\n    every { DataRef.allocateNative(any()) } returns dataRef\n    val options = mapPlayerOptions { }\n    mapboxMapRecorder.replay(buffer, options) { }\n    verifyOnce {\n      coreRecorder.replay(dataRef, options, any())\n    }\n    unmockkStatic(DataRef::class)\n  }\n\n  @Test\n  fun togglePauseReplay() {\n    mapboxMapRecorder.togglePauseReplay()\n    verifyOnce { coreRecorder.togglePauseReplay() }\n  }\n\n  @Test\n  fun getPlaybackState() {\n    every { coreRecorder.playbackState } returns \"state\"\n    val result = mapboxMapRecorder.getPlaybackState()\n    verifyOnce { coreRecorder.playbackState }\n    assert(result == \"state\")\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapboxMapTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.graphics.RectF\nimport android.os.Looper\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.style.StyleContract\nimport com.mapbox.maps.extension.style.color.colorTheme\nimport com.mapbox.maps.extension.style.style\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeatureStateKey\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.delegates.listeners.OnCameraChangeListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnMapIdleListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnMapLoadedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameFinishedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameStartedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnSourceAddedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnSourceDataLoadedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnSourceRemovedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnStyleDataLoadedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnStyleImageMissingListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnStyleImageUnusedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnStyleLoadedListener\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport com.mapbox.maps.plugin.gestures.OnMoveListener\nimport com.mapbox.verifyNo\nimport com.mapbox.verifyOnce\nimport io.mockk.CapturingSlot\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.slot\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport io.mockk.verifySequence\nimport junit.framework.Assert.assertEquals\nimport junit.framework.Assert.assertFalse\nimport junit.framework.Assert.assertNotNull\nimport junit.framework.Assert.assertNull\nimport junit.framework.Assert.assertTrue\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.ParameterizedRobolectricTestRunner\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.Config\nimport org.robolectric.annotation.LooperMode\n\nprivate val ZERO_EDGE_INSETS = EdgeInsets(0.0, 0.0, 0.0, 0.0)\n\n@OptIn(MapboxExperimental::class)\n@Suppress(\"DEPRECATION\")\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\n@Config(shadows = [ShadowMap::class])\nclass MapboxMapTest {\n\n  private val nativeMap: NativeMapImpl = mockk(relaxed = true)\n  private val nativeObserver: NativeObserver = mockk(relaxed = true)\n\n  private lateinit var styleObserver: StyleObserver\n  private lateinit var mapboxMap: MapboxMap\n\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    styleObserver = mockk(relaxUnitFun = true)\n    mapboxMap = MapboxMap(nativeMap, nativeObserver, styleObserver)\n  }\n\n  @Test\n  fun isValid() {\n    assertTrue(mapboxMap.isValid())\n    mapboxMap.onDestroy()\n    assertFalse(mapboxMap.isValid())\n  }\n\n  @Test\n  fun onDestroyWithPlugins() {\n    mapboxMap.cameraAnimationsPlugin = mockk()\n    mapboxMap.gesturesPlugin = mockk()\n    mapboxMap.onDestroy()\n    assertTrue(mapboxMap.cameraAnimationsPlugin == null)\n    assertTrue(mapboxMap.gesturesPlugin == null)\n  }\n\n  @Test\n  fun onDestroyWhenPerformanceStatisticsStarted() {\n    mapboxMap.startPerformanceStatisticsCollection(mockk(), mockk())\n    mapboxMap.onDestroy()\n    verify(exactly = 1) { nativeMap.stopPerformanceStatisticsCollection() }\n  }\n\n  @Test\n  fun onDestroyWhenPerformanceStatisticsNotStarted() {\n    mapboxMap.onDestroy()\n    verify(exactly = 0) { nativeMap.stopPerformanceStatisticsCollection() }\n  }\n\n  @Test\n  fun loadStyleMapboxUri() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    assertFalse(mapboxMap.isStyleLoadInitiated)\n    mapboxMap.loadStyle(\"mapbox://foo\")\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { nativeMap.setStyleURI(\"mapbox://foo\") }\n    assertTrue(mapboxMap.isStyleLoadInitiated)\n  }\n\n  @Test\n  fun loadStyleMapboxFile() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    assertFalse(mapboxMap.isStyleLoadInitiated)\n    mapboxMap.loadStyle(\"file://foo\")\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { nativeMap.setStyleURI(\"file://foo\") }\n    assertTrue(mapboxMap.isStyleLoadInitiated)\n  }\n\n  @Test\n  fun loadStyleInvalidUri() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    assertFalse(mapboxMap.isStyleLoadInitiated)\n    mapboxMap.loadStyle(\"foo\")\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { nativeMap.setStyleJSON(\"foo\") }\n    assertTrue(mapboxMap.isStyleLoadInitiated)\n  }\n\n  @Test\n  fun loadStyleUriLambda() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    assertFalse(mapboxMap.isStyleLoadInitiated)\n    mapboxMap.loadStyle(\"foo\") {}\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    assertTrue(mapboxMap.isStyleLoadInitiated)\n  }\n\n  @Test\n  fun loadStyleJSON() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    assertFalse(mapboxMap.isStyleLoadInitiated)\n    mapboxMap.loadStyle(\"foo\")\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { nativeMap.setStyleJSON(\"foo\") }\n    assertTrue(mapboxMap.isStyleLoadInitiated)\n  }\n\n  @Test\n  fun loadStyleJSONLambda() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    assertFalse(mapboxMap.isStyleLoadInitiated)\n    mapboxMap.loadStyle(\"foo\") {}\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { nativeMap.setStyleJSON(\"foo\") }\n    assertTrue(mapboxMap.isStyleLoadInitiated)\n  }\n\n  @Test\n  fun loadEmptyStyle() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    assertFalse(mapboxMap.isStyleLoadInitiated)\n    mapboxMap.loadStyle(style(\"\") {})\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { nativeMap.setStyleJSON(\"{}\") }\n    assertTrue(mapboxMap.isStyleLoadInitiated)\n  }\n\n  @Test\n  fun loadStyle() {\n    val styleExtension = mockk<StyleContract.StyleExtension>()\n    every { styleExtension.style } returns \"asset://foobar\"\n    val onMapLoadError = mockk<OnMapLoadErrorListener>()\n    val onStyleLoadError = mockk<Style.OnStyleLoaded>()\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    assertFalse(mapboxMap.isStyleLoadInitiated)\n    mapboxMap.loadStyle(styleExtension, onStyleLoadError, onMapLoadError)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { nativeMap.setStyleURI(\"asset://foobar\") }\n    assertTrue(mapboxMap.isStyleLoadInitiated)\n  }\n\n  @Test\n  fun loadStyleLambda() {\n    val styleExtension = mockk<StyleContract.StyleExtension>()\n    every { styleExtension.style } returns \"asset://foobar\"\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    assertFalse(mapboxMap.isStyleLoadInitiated)\n    mapboxMap.loadStyle(styleExtension) {}\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { nativeMap.setStyleURI(\"asset://foobar\") }\n    assertTrue(mapboxMap.isStyleLoadInitiated)\n  }\n\n  @Test\n  fun bindsStyleExtensionComponentsInCorrectOrderAfterStyleDataLoadEvents() {\n    val style = mockk<Style>()\n    val styleExtension = mockk<StyleContract.StyleExtension>(relaxed = true)\n\n    val source = mockk<StyleContract.StyleSourceExtension>(relaxed = true)\n    every { styleExtension.sources } returns listOf(source)\n\n    val image = mockk<StyleContract.StyleImageExtension>(relaxed = true)\n    every { styleExtension.images } returns listOf(image)\n\n    val layer = mockk<StyleContract.StyleLayerExtension>(relaxed = true)\n    val layerPosition = LayerPosition(null, null, 0)\n    every { styleExtension.layers } returns listOf(Pair(layer, layerPosition))\n\n    val flatLight = mockk<StyleContract.StyleLightExtension>(relaxed = true)\n    every { styleExtension.flatLight } returns flatLight\n\n    val dynamicLight = mockk<StyleContract.StyleLightExtension>(relaxed = true)\n    every { styleExtension.dynamicLight } returns dynamicLight\n\n    val terrain = mockk<StyleContract.StyleTerrainExtension>(relaxed = true)\n    every { styleExtension.terrain } returns terrain\n\n    val atmosphere = mockk<StyleContract.StyleAtmosphereExtension>(relaxed = true)\n    every { styleExtension.atmosphere } returns atmosphere\n\n    val projection = mockk<StyleContract.StyleProjectionExtension>(relaxed = true)\n    every { styleExtension.projection } returns projection\n\n    val model = mockk<StyleContract.StyleModelExtension>(relaxed = true)\n    every { styleExtension.models } returns listOf(model)\n\n    val transition = mockk<TransitionOptions>(relaxed = true)\n    every { styleExtension.transition } returns transition\n    every { style.setStyleTransition(any()) } just Runs\n\n    val colorTheme = colorTheme()\n    every { styleExtension.colorTheme } returns colorTheme\n    every { style.setStyleColorTheme(any<ColorTheme>()) } returns ExpectedFactory.createNone()\n\n    val styleLoadCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    val userCallbackStyleSlots = mutableListOf<Style.OnStyleLoaded?>()\n    val callbackStyleSlots = mutableListOf<Style.OnStyleLoaded>()\n    val callbackStyleSpritesSlots = mutableListOf<Style.OnStyleLoaded?>()\n    val callbackStyleSourcesSlots = mutableListOf<Style.OnStyleLoaded?>()\n\n    mapboxMap.loadStyle(styleExtension, styleLoadCallback)\n\n    verify {\n      styleObserver.setLoadStyleListener(\n        captureNullable(userCallbackStyleSlots),\n        capture(callbackStyleSlots),\n        captureNullable(callbackStyleSpritesSlots),\n        captureNullable(callbackStyleSourcesSlots),\n      )\n    }\n\n    verifyNo { source.bindTo(style) }\n    verifyNo { image.bindTo(style) }\n    verifyNo { layer.bindTo(style, layerPosition) }\n    verifyNo { flatLight.bindTo(style) }\n    verifyNo { dynamicLight.bindTo(style) }\n    verifyNo { terrain.bindTo(style) }\n    verifyNo { projection.bindTo(style) }\n    verifyNo { atmosphere.bindTo(style) }\n    verifyNo { style.setStyleTransition(any()) }\n    verifyNo { styleLoadCallback.onStyleLoaded(style) }\n    verifyNo { model.bindTo(style) }\n    verifyNo { style.setStyleColorTheme(colorTheme) }\n\n    callbackStyleSlots.first().onStyleLoaded(style)\n\n    verify { flatLight.bindTo(style) }\n    verify { dynamicLight.bindTo(style) }\n    verify { terrain.bindTo(style) }\n    verify { projection.bindTo(style) }\n    verify { atmosphere.bindTo(style) }\n    verify { style.setStyleColorTheme(colorTheme) }\n    verify { style.setStyleTransition(any()) }\n    verifyNo { source.bindTo(style) }\n    verifyNo { image.bindTo(style) }\n    verifyNo { layer.bindTo(style, layerPosition) }\n    verifyNo { styleLoadCallback.onStyleLoaded(style) }\n    verifyNo { model.bindTo(style) }\n\n    callbackStyleSpritesSlots.first()!!.onStyleLoaded(style)\n\n    verify { image.bindTo(style) }\n    verify { model.bindTo(style) }\n    verifyNo { source.bindTo(style) }\n    verifyNo { layer.bindTo(style, layerPosition) }\n    verifyNo { styleLoadCallback.onStyleLoaded(style) }\n\n    callbackStyleSourcesSlots.first()!!.onStyleLoaded(style)\n\n    verify { source.bindTo(style) }\n    verify { layer.bindTo(style, layerPosition) }\n\n    userCallbackStyleSlots.first()!!.onStyleLoaded(style)\n    verify { image.bindTo(style) }\n    verify { source.bindTo(style) }\n    verify { layer.bindTo(style, layerPosition) }\n    verify { styleLoadCallback.onStyleLoaded(style) }\n  }\n\n  @Test\n  fun getStyleLoadedCallback() {\n    val style = mockk<Style>()\n    mapboxMap.style = style\n    val styleLoadCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    mapboxMap.getStyle(styleLoadCallback)\n    verify { styleLoadCallback.onStyleLoaded(style) }\n  }\n\n  @Test\n  fun getStyleSynchronously() {\n    val style = mockk<Style>()\n    mapboxMap.style = style\n    assertNotNull(mapboxMap.style)\n  }\n\n  @Test\n  fun getStyleSynchronouslyNotReady() {\n    assertNull(mapboxMap.style)\n  }\n\n  @Test\n  fun addOnCameraChangeListener() {\n    val listener = mockk<OnCameraChangeListener>()\n    mapboxMap.addOnCameraChangeListener(listener)\n    verify { nativeObserver.addOnCameraChangeListener(listener) }\n  }\n\n  @Test\n  fun removeOnCameraChangeListener() {\n    val listener = mockk<OnCameraChangeListener>()\n    mapboxMap.removeOnCameraChangeListener(listener)\n    verify { nativeObserver.removeOnCameraChangeListener(listener) }\n  }\n\n  // Map events\n  @Test\n  fun addOnMapIdleListener() {\n    val listener = mockk<OnMapIdleListener>()\n    mapboxMap.addOnMapIdleListener(listener)\n    verify { nativeObserver.addOnMapIdleListener(listener) }\n  }\n\n  @Test\n  fun removeOnMapIdleListener() {\n    val listener = mockk<OnMapIdleListener>()\n    mapboxMap.removeOnMapIdleListener(listener)\n    verify { nativeObserver.removeOnMapIdleListener(listener) }\n  }\n\n  @Test\n  fun addOnMapLoadErrorListener() {\n    val listener = mockk<OnMapLoadErrorListener>()\n    mapboxMap.addOnMapLoadErrorListener(listener)\n    verify { nativeObserver.addOnMapLoadErrorListener(listener) }\n  }\n\n  @Test\n  fun removeOnMapLoadErrorListener() {\n    val listener = mockk<OnMapLoadErrorListener>()\n    mapboxMap.removeOnMapLoadErrorListener(listener)\n    verify { nativeObserver.removeOnMapLoadErrorListener(listener) }\n  }\n\n  @Test\n  fun addOnMapLoadedListener() {\n    val listener = mockk<OnMapLoadedListener>()\n    mapboxMap.addOnMapLoadedListener(listener)\n    verify { nativeObserver.addOnMapLoadedListener(listener) }\n  }\n\n  @Test\n  fun removeOnMapLoadedListener() {\n    val listener = mockk<OnMapLoadedListener>()\n    mapboxMap.removeOnMapLoadedListener(listener)\n    verify { nativeObserver.removeOnMapLoadedListener(listener) }\n  }\n\n  // Render frame events\n  @Test\n  fun addOnRenderFrameFinishedListener() {\n    val listener = mockk<OnRenderFrameFinishedListener>()\n    mapboxMap.addOnRenderFrameFinishedListener(listener)\n    verify { nativeObserver.addOnRenderFrameFinishedListener(listener) }\n  }\n\n  @Test\n  fun removeOnRenderFrameFinishedListener() {\n    val listener = mockk<OnRenderFrameFinishedListener>()\n    mapboxMap.removeOnRenderFrameFinishedListener(listener)\n    verify { nativeObserver.removeOnRenderFrameFinishedListener(listener) }\n  }\n\n  @Test\n  fun addOnRenderFrameStartedListener() {\n    val listener = mockk<OnRenderFrameStartedListener>()\n    mapboxMap.addOnRenderFrameStartedListener(listener)\n    verify { nativeObserver.addOnRenderFrameStartedListener(listener) }\n  }\n\n  @Test\n  fun removeOnRenderFrameStartedListener() {\n    val listener = mockk<OnRenderFrameStartedListener>()\n    mapboxMap.removeOnRenderFrameStartedListener(listener)\n    verify { nativeObserver.removeOnRenderFrameStartedListener(listener) }\n  }\n\n  // Source events\n  @Test\n  fun addOnSourceAddedListener() {\n    val listener = mockk<OnSourceAddedListener>()\n    mapboxMap.addOnSourceAddedListener(listener)\n    verify { nativeObserver.addOnSourceAddedListener(listener) }\n  }\n\n  @Test\n  fun removeOnSourceAddedListener() {\n    val listener = mockk<OnSourceAddedListener>()\n    mapboxMap.removeOnSourceAddedListener(listener)\n    verify { nativeObserver.removeOnSourceAddedListener(listener) }\n  }\n\n  @Test\n  fun addOnSourceDataLoadedListener() {\n    val listener = mockk<OnSourceDataLoadedListener>()\n    mapboxMap.addOnSourceDataLoadedListener(listener)\n    verify { nativeObserver.addOnSourceDataLoadedListener(listener) }\n  }\n\n  @Test\n  fun removeOnSourceDataLoadedListener() {\n    val listener = mockk<OnSourceDataLoadedListener>()\n    mapboxMap.removeOnSourceDataLoadedListener(listener)\n    verify { nativeObserver.removeOnSourceDataLoadedListener(listener) }\n  }\n\n  @Test\n  fun addOnSourceRemovedListener() {\n    val listener = mockk<OnSourceRemovedListener>()\n    mapboxMap.addOnSourceRemovedListener(listener)\n    verify { nativeObserver.addOnSourceRemovedListener(listener) }\n  }\n\n  @Test\n  fun removeOnSourceRemovedListener() {\n    val listener = mockk<OnSourceRemovedListener>()\n    mapboxMap.removeOnSourceRemovedListener(listener)\n    verify { nativeObserver.removeOnSourceRemovedListener(listener) }\n  }\n\n  // Style events\n  @Test\n  fun addOnStyleLoadedListener() {\n    val listener = mockk<OnStyleLoadedListener>()\n    mapboxMap.addOnStyleLoadedListener(listener)\n    verify { nativeObserver.addOnStyleLoadedListener(listener) }\n  }\n\n  @Test\n  fun removeOnStyleLoadedListener() {\n    val listener = mockk<OnStyleLoadedListener>()\n    mapboxMap.removeOnStyleLoadedListener(listener)\n    verify { nativeObserver.removeOnStyleLoadedListener(listener) }\n  }\n\n  @Test\n  fun addOnStyleImageMissingListener() {\n    val listener = mockk<OnStyleImageMissingListener>()\n    mapboxMap.addOnStyleImageMissingListener(listener)\n    verify { nativeObserver.addOnStyleImageMissingListener(listener) }\n  }\n\n  @Test\n  fun removeOnStyleImageMissingListener() {\n    val listener = mockk<OnStyleImageMissingListener>()\n    mapboxMap.removeOnStyleImageMissingListener(listener)\n    verify { nativeObserver.removeOnStyleImageMissingListener(listener) }\n  }\n\n  @Test\n  fun addOnStyleImageUnusedListener() {\n    val listener = mockk<OnStyleImageUnusedListener>()\n    mapboxMap.addOnStyleImageUnusedListener(listener)\n    verify { nativeObserver.addOnStyleImageUnusedListener(listener) }\n  }\n\n  @Test\n  fun removeOnStyleImageUnusedListener() {\n    val listener = mockk<OnStyleImageUnusedListener>()\n    mapboxMap.removeOnStyleImageUnusedListener(listener)\n    verify { nativeObserver.removeOnStyleImageUnusedListener(listener) }\n  }\n\n  @Test\n  fun addOnStyleDataLoadedListener() {\n    val listener = mockk<OnStyleDataLoadedListener>()\n    mapboxMap.addOnStyleDataLoadedListener(listener)\n    verify { nativeObserver.addOnStyleDataLoadedListener(listener) }\n  }\n\n  @Test\n  fun removeOnStyleDataLoadedListener() {\n    val listener = mockk<OnStyleDataLoadedListener>()\n    mapboxMap.removeOnStyleDataLoadedListener(listener)\n    verify { nativeObserver.removeOnStyleDataLoadedListener(listener) }\n  }\n\n  @Test\n  fun setPrefetchZoomDelta() {\n    mapboxMap.setPrefetchZoomDelta(3)\n    verify { nativeMap.setPrefetchZoomDelta(3) }\n  }\n\n  @Test\n  fun getPrefetchZoomDelta() {\n    mapboxMap.getPrefetchZoomDelta()\n    verify { nativeMap.getPrefetchZoomDelta() }\n  }\n\n  @Test\n  fun setCamera() {\n    val cameraOptions = CameraOptions.Builder().build()\n    mapboxMap.setCamera(cameraOptions)\n    verify { nativeMap.setCamera(cameraOptions) }\n  }\n\n  @Test\n  fun cameraForCoordinateBounds() {\n    val bounds = mockk<CoordinateBounds>()\n    val edgeInsets = mockk<EdgeInsets>()\n    val screenCoordinate = mockk<ScreenCoordinate>()\n    mapboxMap.cameraForCoordinateBounds(\n      bounds = bounds,\n      boundsPadding = edgeInsets,\n      bearing = 0.0,\n      pitch = 1.0,\n      maxZoom = 2.0,\n      offset = screenCoordinate\n    )\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = edgeInsets,\n        bearing = 0.0,\n        pitch = 1.0,\n        maxZoom = 2.0,\n        offset = screenCoordinate\n      )\n    }\n  }\n\n  @Test\n  fun cameraForCoordinateBoundsOverload() {\n    val bounds = mockk<CoordinateBounds>()\n    mapboxMap.cameraForCoordinateBounds(bounds = bounds)\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = null,\n        bearing = null,\n        pitch = null,\n        maxZoom = null,\n        offset = null\n      )\n    }\n  }\n\n  @Test\n  fun cameraForCoordinateBoundsOverloadPadding() {\n    val bounds = mockk<CoordinateBounds>()\n    val padding = EdgeInsets(1.1, 1.3, 1.4, 1.2)\n    mapboxMap.cameraForCoordinateBounds(bounds = bounds, boundsPadding = padding)\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = padding,\n        bearing = null,\n        pitch = null,\n        maxZoom = null,\n        offset = null\n      )\n    }\n  }\n\n  @Test\n  fun cameraForCoordinateBoundsWithoutPadding() {\n    val bounds = mockk<CoordinateBounds>()\n    val offset = mockk<ScreenCoordinate>()\n    mapboxMap.cameraForCoordinateBounds(\n      bounds = bounds,\n      bearing = 1.0,\n      pitch = 2.0,\n      maxZoom = 12.0,\n      offset = offset\n    )\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = null,\n        bearing = 1.0,\n        pitch = 2.0,\n        maxZoom = 12.0,\n        offset = offset\n      )\n    }\n  }\n\n  @Test\n  fun cameraForCoordinateBoundsOverloadBearing() {\n    val bounds = mockk<CoordinateBounds>()\n    mapboxMap.cameraForCoordinateBounds(bounds = bounds, bearing = 2.0)\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = null,\n        bearing = 2.0,\n        pitch = null,\n        maxZoom = null,\n        offset = null\n      )\n    }\n  }\n\n  @Test\n  fun cameraForCoordinateBoundsOverloadPitch() {\n    val bounds = mockk<CoordinateBounds>()\n    mapboxMap.cameraForCoordinateBounds(bounds = bounds, pitch = 2.0)\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = null,\n        bearing = null,\n        pitch = 2.0,\n        maxZoom = null,\n        offset = null\n      )\n    }\n  }\n\n  @Test\n  fun cameraForCoordinateBoundsOverloadMaxZoom() {\n    val bounds = mockk<CoordinateBounds>()\n    mapboxMap.cameraForCoordinateBounds(bounds = bounds, maxZoom = 10.0)\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = null,\n        bearing = null,\n        pitch = null,\n        maxZoom = 10.0,\n        offset = null\n      )\n    }\n  }\n\n  @Test\n  fun cameraForCoordinateBoundsOverloadOffset() {\n    val bounds = mockk<CoordinateBounds>()\n    val screenCoordinate = mockk<ScreenCoordinate>()\n    mapboxMap.cameraForCoordinateBounds(bounds, offset = screenCoordinate)\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = null,\n        bearing = null,\n        pitch = null,\n        maxZoom = null,\n        offset = screenCoordinate\n      )\n    }\n  }\n\n  @Test\n  fun coordinateBoundsForCamera() {\n    val cameraOptions = mockk<CameraOptions>()\n    mapboxMap.coordinateBoundsForCamera(cameraOptions)\n    verify { nativeMap.coordinateBoundsForCamera(cameraOptions) }\n  }\n\n  @Test\n  fun coordinateBoundsForCameraUnwrapped() {\n    val cameraOptions = mockk<CameraOptions>()\n    mapboxMap.coordinateBoundsForCameraUnwrapped(cameraOptions)\n    verify { nativeMap.coordinateBoundsForCameraUnwrapped(cameraOptions) }\n  }\n\n  @Test\n  fun coordinateBoundsZoomForCamera() {\n    val cameraOptions = mockk<CameraOptions>()\n    mapboxMap.coordinateBoundsZoomForCamera(cameraOptions)\n    verify { nativeMap.coordinateBoundsZoomForCamera(cameraOptions) }\n  }\n\n  @Test\n  fun coordinateBoundsZoomForCameraUnwrapped() {\n    val cameraOptions = mockk<CameraOptions>()\n    mapboxMap.coordinateBoundsZoomForCameraUnwrapped(cameraOptions)\n    verify { nativeMap.coordinateBoundsZoomForCameraUnwrapped(cameraOptions) }\n  }\n\n  @Test\n  fun cameraForCoordinatesOne() {\n    val points = defaultPointsList\n    val camera = mockk<CameraOptions>()\n    val box = mockk<ScreenBox>()\n    mapboxMap.cameraForCoordinates(points, camera, box)\n    verify { nativeMap.cameraForCoordinates(defaultPointsBbox, camera, box) }\n  }\n\n  @Test\n  fun cameraForCoordinatesTwo() {\n    val points = defaultPointsList\n    val edgeInsets = mockk<EdgeInsets>()\n    mapboxMap.cameraForCoordinates(points, edgeInsets, 0.0, 1.0)\n    verify { nativeMap.cameraForCoordinates(defaultPointsBbox, edgeInsets, 0.0, 1.0) }\n  }\n\n  @Test\n  fun cameraForCoordinatesOverload() {\n    val points = defaultPointsList\n    mapboxMap.cameraForCoordinates(points)\n    verify { nativeMap.cameraForCoordinates(defaultPointsBbox, null, null, null) }\n  }\n\n  @Test\n  fun cameraForCoordinatesWithoutPadding() {\n    val points = defaultPointsList\n    mapboxMap.cameraForCoordinates(points)\n    verify { nativeMap.cameraForCoordinates(defaultPointsBbox, null, null, null) }\n  }\n\n  @Test\n  fun cameraForCoordinatesOverloadBearing() {\n    val points = defaultPointsList\n    mapboxMap.cameraForCoordinates(points, bearing = 2.0)\n    verify { nativeMap.cameraForCoordinates(defaultPointsBbox, null, 2.0, null) }\n  }\n\n  @Test\n  fun cameraForCoordinatesOverloadPitch() {\n    val points = defaultPointsList\n    mapboxMap.cameraForCoordinates(points, pitch = 2.0)\n    verify { nativeMap.cameraForCoordinates(defaultPointsBbox, null, null, 2.0) }\n  }\n\n  @Test\n  fun cameraForCoordinatesWithOffset() {\n    val points = defaultPointsList\n    val camera = mockk<CameraOptions>()\n    val offset = mockk<ScreenCoordinate>()\n    every { nativeMap.sizeSet } returns true\n    every { nativeMap.cameraForCoordinates(any(), any(), any(), any(), any()) } returns\n      ExpectedFactory.createValue(mockk())\n\n    mapboxMap.cameraForCoordinates(points, camera, ZERO_EDGE_INSETS, 1.0, offset)\n    verify { nativeMap.cameraForCoordinates(defaultPointsBbox, camera, ZERO_EDGE_INSETS, 1.0, offset) }\n  }\n\n  @Test\n  fun cameraForGeometry() {\n    val point = mockk<Point>()\n    mapboxMap.cameraForGeometry(point, ZERO_EDGE_INSETS, 0.0, 1.0)\n    verify { nativeMap.cameraForGeometry(point, ZERO_EDGE_INSETS, 0.0, 1.0) }\n  }\n\n  @Test\n  fun cameraForGeometryOverload() {\n    val point = mockk<Point>()\n    mapboxMap.cameraForGeometry(point)\n    verify { nativeMap.cameraForGeometry(point, null, null, null) }\n  }\n\n  @Test\n  fun cameraForGeometryWithoutPadding() {\n    val point = mockk<Point>()\n    mapboxMap.cameraForGeometry(point)\n    verify { nativeMap.cameraForGeometry(point, null, null, null) }\n  }\n\n  @Test\n  fun cameraForGeometryOverloadBearing() {\n    val point = mockk<Point>()\n    mapboxMap.cameraForGeometry(point, bearing = 2.0)\n    verify { nativeMap.cameraForGeometry(point, null, 2.0, null) }\n  }\n\n  @Test\n  fun cameraForGeometryOverloadPitch() {\n    val point = mockk<Point>()\n    mapboxMap.cameraForGeometry(point, pitch = 2.0)\n    verify { nativeMap.cameraForGeometry(point, null, null, 2.0) }\n  }\n\n  @Test\n  fun coordinateForPixel() {\n    val point = mockk<ScreenCoordinate>()\n    mapboxMap.coordinateForPixel(point)\n    verify { nativeMap.coordinateForPixel(point) }\n  }\n\n  @Test\n  fun pixelsForCoordinates() {\n    val points: List<Point> = emptyList()\n    mapboxMap.pixelsForCoordinates(points)\n    verify { nativeMap.pixelsForCoordinates(points.toMutableList()) }\n  }\n\n  @Test\n  fun coordinatesForPixels() {\n    val points: List<ScreenCoordinate> = emptyList()\n    mapboxMap.coordinatesForPixels(points)\n    verify { nativeMap.coordinatesForPixels(points.toMutableList()) }\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun coordinatesForRectWithEmptyRect() {\n    val rect = RectF()\n    mapboxMap.coordinateBoundsForRect(rect)\n  }\n\n  @Test\n  fun coordinatesForRectWithValidRect() {\n    val rect = RectF(1f, 2f, 3f, 4f)\n    val screenCoordinates = listOf(\n      ScreenCoordinate(/* bottom */ 4.0, /* left */ 1.0),\n      ScreenCoordinate(/* top */ 2.0, /* right */ 3.0),\n    )\n    every { nativeMap.coordinatesForPixels(any()) } returns\n      mutableListOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))\n    mapboxMap.coordinateBoundsForRect(rect)\n    verify { nativeMap.coordinatesForPixels(screenCoordinates.toMutableList()) }\n  }\n\n  @Test\n  fun coordinateInfoForPixel() {\n    val pixel = mockk<ScreenCoordinate>()\n    mapboxMap.coordinateInfoForPixel(pixel)\n    verify { nativeMap.coordinateInfoForPixel(pixel) }\n  }\n\n  @Test\n  fun coordinateInfoForPixels() {\n    val pixels = mockk<List<ScreenCoordinate>>()\n    mapboxMap.coordinatesInfoForPixels(pixels)\n    verify { nativeMap.coordinatesInfoForPixels(pixels) }\n  }\n\n  @Test\n  fun getBounds() {\n    mapboxMap.getBounds()\n    verify { nativeMap.getBounds() }\n  }\n\n  @Test\n  fun setBounds() {\n    val bounds = mockk<CameraBoundsOptions>()\n    mapboxMap.setBounds(bounds)\n    verify { nativeMap.setBounds(bounds) }\n  }\n\n  @Test\n  fun setGestureInProgress() {\n    mapboxMap.setGestureInProgress(true)\n    verify { nativeMap.setGestureInProgress(true) }\n  }\n\n  @Test\n  fun isGestureInProgress() {\n    mapboxMap.isGestureInProgress()\n    verify { nativeMap.isGestureInProgress() }\n  }\n\n  @Test\n  fun setNorthOrientation() {\n    mapboxMap.setNorthOrientation(NorthOrientation.DOWNWARDS)\n    verify { nativeMap.setNorthOrientation(NorthOrientation.DOWNWARDS) }\n  }\n\n  @Test\n  fun setConstrainMode() {\n    mapboxMap.setConstrainMode(ConstrainMode.HEIGHT_ONLY)\n    verify { nativeMap.setConstrainMode(ConstrainMode.HEIGHT_ONLY) }\n  }\n\n  @Test\n  fun setViewportMode() {\n    mapboxMap.setViewportMode(ViewportMode.FLIPPED_Y)\n    verify { nativeMap.setViewportMode(ViewportMode.FLIPPED_Y) }\n  }\n\n  @Test\n  fun setFeatureState() {\n    val value = mockk<Value>()\n    val callback = mockk<FeatureStateOperationCallback>()\n    mapboxMap.setFeatureState(\"id\", \"source-layer\", \"feature\", value, callback)\n    verify { nativeMap.setFeatureState(\"id\", \"source-layer\", \"feature\", value, callback) }\n  }\n\n  @Test\n  fun getFeatureState() {\n    val value = mockk<QueryFeatureStateCallback>()\n    mapboxMap.getFeatureState(\"id\", \"source-layer\", \"feature\", value)\n    verify { nativeMap.getFeatureState(\"id\", \"source-layer\", \"feature\", value) }\n  }\n\n  @Test\n  fun removeFeatureState() {\n    val callback = mockk<FeatureStateOperationCallback>()\n    mapboxMap.removeFeatureState(\"id\", \"source-layer\", \"feature\", \"state\", callback)\n    verify { nativeMap.removeFeatureState(\"id\", \"source-layer\", \"feature\", \"state\", callback) }\n  }\n\n  @Test\n  fun addInteraction() {\n    val interaction = mockk<MapInteraction>()\n    val coreInteraction = mockk<Interaction>()\n    interaction.coreInteraction = coreInteraction\n    mapboxMap.addInteraction(interaction)\n    verify { nativeMap.addInteraction(coreInteraction) }\n  }\n\n  @Test\n  fun dispatch() {\n    val dispatchEvent = mockk<PlatformEventInfo>()\n    mapboxMap.dispatch(dispatchEvent)\n    verify { nativeMap.dispatch(dispatchEvent) }\n  }\n\n  @Test\n  fun setFeatureStateFeatureset() {\n    val featuresetId = \"featuresetId\"\n    val importId = \"importId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val newStateKey1 = \"newStateKey1\"\n    val newStateValue1 = \"newStateValue1\"\n    val newStateKey2 = \"newStateKey2\"\n    val newStateValue2 = \"newStateValue2\"\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      descriptor = TypedFeaturesetDescriptor.Featureset(featuresetId = featuresetId, importId = importId),\n      originalFeature = Feature.fromGeometry(Point.fromLngLat(0.0, 0.0), null, /* id */ featureId),\n      state = FeatureState { },\n    )\n    val newState = FeatureState {\n      addStringState(newStateKey1, newStateValue1)\n      addStringState(newStateKey2, newStateValue2)\n    }\n    mapboxMap.setFeatureState(\n      featuresetFeature,\n      newState\n    )\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.setFeatureState(\n        FeaturesetDescriptor(featuresetId, importId, /* layerId */ null),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        Value.valueOf(hashMapOf(newStateKey1 to Value(newStateValue1), newStateKey2 to Value(newStateValue2))),\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @Test\n  fun setFeatureStateLayer() {\n    val layerId = \"layerId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val newStateKey1 = \"newStateKey1\"\n    val newStateValue1 = \"newStateValue1\"\n    val newStateKey2 = \"newStateKey2\"\n    val newStateValue2 = \"newStateValue2\"\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      descriptor = TypedFeaturesetDescriptor.Layer(layerId = layerId),\n      originalFeature = Feature.fromGeometry(Point.fromLngLat(0.0, 0.0), null, /* id */ featureId),\n      state = FeatureState { },\n    )\n    val newState = FeatureState {\n      addStringState(newStateKey1, newStateValue1)\n      addStringState(newStateKey2, newStateValue2)\n    }\n    mapboxMap.setFeatureState(\n      featuresetFeature,\n      newState\n    )\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.setFeatureState(\n        FeaturesetDescriptor(/* featuresetId */ null, /* importId */ null, /* layerId */ layerId),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        Value.valueOf(hashMapOf(newStateKey1 to Value(newStateValue1), newStateKey2 to Value(newStateValue2))),\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun setFeatureStateTypedFeaturesetDescriptorFeatureset() {\n    val featuresetId = \"featuresetId\"\n    val importId = \"importId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val descriptor = TypedFeaturesetDescriptor.Featureset(featuresetId, importId)\n    val state = FeatureState { }\n    mapboxMap.setFeatureState(\n      descriptor,\n      FeaturesetFeatureId(featureId, featureNamespace),\n      state\n    )\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.setFeatureState(\n        FeaturesetDescriptor(featuresetId, importId, /* layerId */ null),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        state.internalState,\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun setFeatureStateTypedFeaturesetDescriptorLayer() {\n    val layerId = \"layerId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val descriptor = TypedFeaturesetDescriptor.Layer(layerId)\n    val state = FeatureState { }\n    mapboxMap.setFeatureState(\n      descriptor,\n      FeaturesetFeatureId(featureId, featureNamespace),\n      state\n    )\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.setFeatureState(\n        FeaturesetDescriptor(/* featuresetId */ null, /* importId */ null, /* layerId */ layerId),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        state.internalState,\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun getFeatureStateTypedFeaturesetDescriptorFeatureset() {\n    val featuresetId = \"featuresetId\"\n    val importId = \"importId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val descriptor = TypedFeaturesetDescriptor.Featureset(featuresetId, importId)\n    mapboxMap.getFeatureState(\n      descriptor,\n      FeaturesetFeatureId(featureId, featureNamespace),\n    ) { }\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.getFeatureState(\n        FeaturesetDescriptor(featuresetId, importId, /* layerId */ null),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun getFeatureStateTypedFeaturesetDescriptorLayer() {\n    val layerId = \"layerId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val descriptor = TypedFeaturesetDescriptor.Layer(layerId)\n    mapboxMap.getFeatureState(\n      descriptor,\n      FeaturesetFeatureId(featureId, featureNamespace),\n    ) { }\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.getFeatureState(\n        FeaturesetDescriptor(/* featuresetId */ null, /* importId */ null, /* layerId */ layerId),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @Test\n  fun getFeatureStateFeaturesetFeatureLayer() {\n    val layerId = \"layerId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      descriptor = TypedFeaturesetDescriptor.Layer(layerId = layerId),\n      originalFeature = Feature.fromGeometry(Point.fromLngLat(0.0, 0.0), null, /* id */ featureId),\n      state = FeatureState { },\n    )\n    mapboxMap.getFeatureState(\n      featuresetFeature,\n    ) { }\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.getFeatureState(\n        FeaturesetDescriptor(/* featuresetId */ null, /* importId */ null, /* layerId */ layerId),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @Test\n  fun getFeatureStateFeaturesetFeatureFeatureset() {\n    val featuresetId = \"featuresetId\"\n    val importId = \"importId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      descriptor = TypedFeaturesetDescriptor.Featureset(featuresetId = featuresetId, importId = importId),\n      originalFeature = Feature.fromGeometry(Point.fromLngLat(0.0, 0.0), null, /* id */ featureId),\n      state = FeatureState { },\n    )\n    mapboxMap.getFeatureState(\n      featuresetFeature,\n    ) { }\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.getFeatureState(\n        FeaturesetDescriptor(/* featuresetId */ featuresetId, /* importId */ importId, /* layerId */ null),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @Test\n  fun removeFeatureStateFeaturesetFeatureFromFeatureset() {\n    val featuresetId = \"featuresetId\"\n    val importId = \"importId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val stateKey = \"stateKey\"\n    val descriptor = TypedFeaturesetDescriptor.Featureset(featuresetId, importId)\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      descriptor = descriptor,\n      originalFeature = Feature.fromGeometry(Point.fromLngLat(0.0, 0.0), null, /* id */ featureId),\n      state = FeatureState { },\n    )\n    mapboxMap.removeFeatureState(\n      featuresetFeature = featuresetFeature,\n      stateKey = FeatureStateKey.create(stateKey),\n    ) { }\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.removeFeatureState(\n        FeaturesetDescriptor(featuresetId, importId, /* layerId */ null),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        stateKey,\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @Test\n  fun removeFeatureStateFeaturesetFeatureFromLayer() {\n    val layerId = \"layerId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val stateKey = \"stateKey\"\n    val descriptor = TypedFeaturesetDescriptor.Layer(layerId)\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      descriptor = descriptor,\n      originalFeature = Feature.fromGeometry(Point.fromLngLat(0.0, 0.0), null, /* id */ featureId),\n      state = FeatureState { },\n    )\n    mapboxMap.removeFeatureState(\n      featuresetFeature = featuresetFeature,\n      stateKey = FeatureStateKey.create(stateKey),\n    ) { }\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.removeFeatureState(\n        FeaturesetDescriptor(/* featuresetId */ null, /* importId */ null, /* layerId */ layerId),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        stateKey,\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun removeFeatureStateTypedFeaturesetDescriptorFromFeatureset() {\n    val featuresetId = \"featuresetId\"\n    val importId = \"importId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val stateKey = \"stateKey\"\n    val descriptor = TypedFeaturesetDescriptor.Featureset(featuresetId, importId)\n    mapboxMap.removeFeatureState(\n      descriptor = descriptor,\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      stateKey = FeatureStateKey.create(stateKey),\n    ) { }\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.removeFeatureState(\n        FeaturesetDescriptor(featuresetId, importId, /* layerId */ null),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        stateKey,\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @OptIn(MapboxDelicateApi::class)\n  @Test\n  fun removeFeatureStateTypedFeaturesetDescriptorFromLayer() {\n    val layerId = \"layerId\"\n    val featureId = \"featureId\"\n    val featureNamespace = \"featureNamespace\"\n    val stateKey = \"stateKey\"\n    val descriptor = TypedFeaturesetDescriptor.Layer(layerId)\n    mapboxMap.removeFeatureState(\n      descriptor = descriptor,\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      stateKey = FeatureStateKey.create(stateKey),\n    ) { }\n    val featureFeatuersetIdSlot = slot<FeaturesetFeatureId>()\n    verify {\n      nativeMap.removeFeatureState(\n        FeaturesetDescriptor(/* featuresetId */ null, /* importId */ null, /* layerId */ layerId),\n        // missing equals for Bindgen variant, so checking fields with a slot\n        capture(featureFeatuersetIdSlot),\n        stateKey,\n        /* callback */ any()\n      )\n    }\n    assert(featureFeatuersetIdSlot.captured.featureId == featureId)\n    assert(featureFeatuersetIdSlot.captured.featureNamespace == featureNamespace)\n  }\n\n  @Test\n  fun resetFeatureStatesTypedFeaturesetDescriptorFromFeatureset() {\n    val featuresetId = \"featuresetId\"\n    val importId = \"importId\"\n    val descriptor = TypedFeaturesetDescriptor.Featureset(featuresetId, importId)\n    mapboxMap.resetFeatureStates(\n      descriptor = descriptor,\n    ) { }\n    verify {\n      nativeMap.resetFeatureStates(\n        FeaturesetDescriptor(featuresetId, importId, /* layerId */ null),\n        /* callback */ any()\n      )\n    }\n  }\n\n  @Test\n  fun resetFeatureStatesTypedFeaturesetDescriptorFromLayer() {\n    val layerId = \"layerId\"\n    val descriptor = TypedFeaturesetDescriptor.Layer(layerId)\n    mapboxMap.resetFeatureStates(\n      descriptor = descriptor,\n    ) { }\n    verify {\n      nativeMap.resetFeatureStates(\n        FeaturesetDescriptor(/* featuresetId */ null, /* importId */ null, /* layerId */ layerId),\n        /* callback */ any()\n      )\n    }\n  }\n\n  @Test\n  @OptIn(MapboxDelicateApi::class)\n  fun setFeatureStateExpression() {\n    val featureExpressionId = 2345325\n    val layerId = \"layerId\"\n    val descriptor = TypedFeaturesetDescriptor.Layer(layerId)\n    val state = FeatureState { }\n    val expression = Value.nullValue()\n    mapboxMap.setFeatureStateExpression(featureExpressionId, descriptor, expression, state) {}\n\n    verify {\n      nativeMap.setFeatureStateExpression(\n        featureExpressionId,\n        FeaturesetDescriptor(/* featuresetId */ null, /* importId */ null, /* layerId */ layerId),\n        expression,\n        state.internalState,\n        /* callback */ any()\n        )\n    }\n  }\n\n  @Test\n  @OptIn(MapboxDelicateApi::class)\n  fun removeFeatureStateExpression() {\n    val featureExpressionId = 2643634\n    mapboxMap.removeFeatureStateExpression(featureExpressionId) {}\n\n    verify {\n      nativeMap.removeFeatureStateExpression(\n        featureExpressionId,\n        /* callback */ any()\n      )\n    }\n  }\n\n  @Test\n  @OptIn(MapboxDelicateApi::class)\n  fun resetFeatureStateExpressions() {\n    mapboxMap.resetFeatureStateExpressions() {}\n\n    verify {\n      nativeMap.resetFeatureStateExpressions(\n        /* callback */ any()\n      )\n    }\n  }\n\n  @Test\n  fun queryRenderedFeatures() {\n    val geometry = mockk<RenderedQueryGeometry>()\n    val descriptor = mockk<TypedFeaturesetDescriptor<FeatureState, *>>()\n    val coreFeaturesetDescriptor = mockk<FeaturesetDescriptor>()\n    every { descriptor.toFeaturesetDescriptor() } returns coreFeaturesetDescriptor\n    val filter = Value.nullValue()\n    mapboxMap.queryRenderedFeatures(descriptor, geometry, filter) { }\n    verify {\n      nativeMap.queryRenderedFeatures(\n        geometry,\n        listOf(\n          FeaturesetQueryTarget(\n            coreFeaturesetDescriptor,\n            filter,\n            null,\n          )\n        ),\n        /* callback */ any()\n      )\n    }\n  }\n\n  @Test\n  fun queryRenderedFeaturesNoGeometry() {\n    val descriptor = mockk<TypedFeaturesetDescriptor<FeatureState, *>>()\n    val coreFeaturesetDescriptor = mockk<FeaturesetDescriptor>()\n    every { descriptor.toFeaturesetDescriptor() } returns coreFeaturesetDescriptor\n    every { nativeMap.getSize() } returns Size(10f, 20f)\n    mapboxMap.queryRenderedFeatures(descriptor) { }\n    val geometrySlot = slot<RenderedQueryGeometry>()\n    verify {\n      nativeMap.queryRenderedFeatures(\n        capture(geometrySlot),\n        listOf(\n          FeaturesetQueryTarget(\n            coreFeaturesetDescriptor,\n            null,\n            null,\n          )\n        ),\n        /* callback */ any()\n      )\n    }\n    assertEquals(0.0, geometrySlot.captured.screenBox.min.x, 0.0001)\n    assertEquals(0.0, geometrySlot.captured.screenBox.min.y, 0.0001)\n    assertEquals(10.0, geometrySlot.captured.screenBox.max.x, 0.0001)\n    assertEquals(20.0, geometrySlot.captured.screenBox.max.y, 0.0001)\n  }\n\n  @Test\n  fun getClusterLeavesDefaultParam() {\n    val feature = mockk<Feature>()\n    val mapSlot = slot<HashMap<String, Value>>()\n    val callback = mockk<QueryFeatureExtensionCallback>()\n    mapboxMap.getGeoJsonClusterLeaves(\"id\", feature, callback = callback)\n    verify {\n      nativeMap.queryFeatureExtensions(\n        \"id\",\n        feature,\n        MapboxMap.QFE_SUPER_CLUSTER,\n        MapboxMap.QFE_LEAVES,\n        capture(mapSlot),\n        callback\n      )\n    }\n    checkCapturedMap(\n      mapSlot,\n      MapboxMap.QFE_DEFAULT_LIMIT.toString(),\n      MapboxMap.QFE_DEFAULT_OFFSET.toString()\n    )\n  }\n\n  private fun checkCapturedMap(\n    mapSlot: CapturingSlot<HashMap<String, Value>>,\n    expectedLimit: String,\n    expectedOffset: String\n  ) {\n    val captureMap = mapSlot.captured\n    assertEquals(2, captureMap.size)\n    assertEquals(expectedLimit, captureMap[\"limit\"]!!.contents.toString())\n    assertEquals(expectedOffset, captureMap[\"offset\"]!!.contents.toString())\n  }\n\n  @Test\n  fun getClusterLeaves() {\n    val feature = mockk<Feature>()\n    val mapSlot = slot<HashMap<String, Value>>()\n    val callback = mockk<QueryFeatureExtensionCallback>()\n    mapboxMap.getGeoJsonClusterLeaves(\"id\", feature, 1, 2, callback = callback)\n    verify {\n      nativeMap.queryFeatureExtensions(\n        \"id\",\n        feature,\n        MapboxMap.QFE_SUPER_CLUSTER,\n        MapboxMap.QFE_LEAVES,\n        capture(mapSlot),\n        callback\n      )\n    }\n    checkCapturedMap(mapSlot, \"1\", \"2\")\n  }\n\n  @Test\n  fun getClusterChildren() {\n    val feature = mockk<Feature>()\n    val callback = mockk<QueryFeatureExtensionCallback>()\n    mapboxMap.getGeoJsonClusterChildren(\"id\", feature, callback = callback)\n    verify {\n      nativeMap.queryFeatureExtensions(\n        \"id\",\n        feature,\n        MapboxMap.QFE_SUPER_CLUSTER,\n        MapboxMap.QFE_CHILDREN,\n        null,\n        callback\n      )\n    }\n  }\n\n  @Test\n  fun getClusterExpansionZoom() {\n    val feature = mockk<Feature>()\n    val callback = mockk<QueryFeatureExtensionCallback>()\n    mapboxMap.getGeoJsonClusterExpansionZoom(\"id\", feature, callback = callback)\n    verify {\n      nativeMap.queryFeatureExtensions(\n        \"id\",\n        feature,\n        MapboxMap.QFE_SUPER_CLUSTER,\n        MapboxMap.QFE_EXPANSION_ZOOM,\n        null,\n        callback\n      )\n    }\n  }\n\n  @Test\n  fun getCameraState() {\n    mapboxMap.cameraState\n    verify { nativeMap.getCameraState() }\n  }\n\n  @Test\n  fun setDebug() {\n    val debugOptions = mockk<List<MapDebugOptions>>()\n    mapboxMap.setDebug(debugOptions, true)\n    verify { nativeMap.setDebug(debugOptions, true) }\n  }\n\n  @Test\n  fun getDebug() {\n    mapboxMap.getDebug()\n    verify { nativeMap.getDebug() }\n  }\n\n  @Test\n  fun getDebugOptions() {\n    mapboxMap.debugOptions\n    verify { nativeMap.getDebug() }\n  }\n\n  @Test\n  fun setDebugOptions() {\n    val initialDebugOptions = listOf(MapDebugOptions.DEPTH_BUFFER, MapDebugOptions.TERRAIN_WIREFRAME)\n    every { nativeMap.getDebug() } returns initialDebugOptions\n    val newDebugOptions = setOf(MapDebugOptions.COLLISION, MapDebugOptions.LAYERS3_DWIREFRAME)\n    mapboxMap.debugOptions = newDebugOptions\n\n    verify { nativeMap.setDebug(initialDebugOptions, false) }\n    verify { nativeMap.setDebug(newDebugOptions.toList(), true) }\n  }\n\n  @Test\n  fun getMapOptions() {\n    mapboxMap.getMapOptions()\n    verify { mapboxMap.getMapOptions() }\n  }\n\n  @Test\n  fun setUserAnimationInProgress() {\n    mapboxMap.setUserAnimationInProgress(true)\n    verify { nativeMap.setUserAnimationInProgress(true) }\n  }\n\n  @Test\n  fun isUserAnimationInProgress() {\n    mapboxMap.isUserAnimationInProgress()\n    verify { nativeMap.isUserAnimationInProgress() }\n  }\n\n  @Test\n  fun reduceMemoryUse() {\n    mapboxMap.reduceMemoryUse()\n    verify { mapboxMap.reduceMemoryUse() }\n  }\n\n  @Test\n  fun querySourceFeatures() {\n    val querySourceCallback = mockk<QuerySourceFeaturesCallback>()\n    val querySourceOptions = mockk<SourceQueryOptions>()\n    mapboxMap.querySourceFeatures(\"id\", querySourceOptions, querySourceCallback)\n    verify { nativeMap.querySourceFeatures(\"id\", querySourceOptions, querySourceCallback) }\n  }\n\n  @Test\n  fun queryRenderedRasterValues() {\n    val coordinate = mockk<ScreenCoordinate>()\n    val options = mockk<RenderedRasterQueryOptions>()\n    val callback = mockk<QueryRenderedRasterValuesCallback>()\n    mapboxMap.queryRenderedRasterValues(coordinate, options, callback)\n    verify { nativeMap.queryRenderedRasterValues(coordinate, options, callback) }\n  }\n\n  @Test\n  fun queryRenderedFeaturesGeometry() {\n    val queryCallback = mockk<QueryRenderedFeaturesCallback>()\n    val geometry = mockk<RenderedQueryGeometry>()\n    val renderedQueryOptions = mockk<RenderedQueryOptions>()\n    mapboxMap.queryRenderedFeatures(geometry, renderedQueryOptions, queryCallback)\n    verify { nativeMap.queryRenderedFeatures(geometry, renderedQueryOptions, queryCallback) }\n  }\n\n  @Test\n  fun queryRenderedFeaturesRenderedQueryGeometry() {\n    val queryCallback = mockk<QueryRenderedFeaturesCallback>()\n    val geometry = mockk<RenderedQueryGeometry>()\n    val renderedQueryOptions = mockk<RenderedQueryOptions>()\n    mapboxMap.queryRenderedFeatures(geometry, renderedQueryOptions, queryCallback)\n    verify { nativeMap.queryRenderedFeatures(geometry, renderedQueryOptions, queryCallback) }\n  }\n\n  @Test\n  fun getSize() {\n    mapboxMap.getSize()\n    verify { nativeMap.getSize() }\n  }\n\n  @Test\n  fun whenSizeReady() {\n    val action = mockk<() -> Unit>()\n    mapboxMap.whenSizeReady(action)\n    verify { nativeMap.whenMapSizeReady(action) }\n  }\n\n  @Test\n  fun getFreeCameraOptions() {\n    mapboxMap.getFreeCameraOptions()\n    verify { nativeMap.getFreeCameraOptions() }\n  }\n\n  @Test\n  fun setFreeCameraOptions() {\n    val options = mockk<FreeCameraOptions>()\n    mapboxMap.setCamera(options)\n    verify { nativeMap.setCamera(options) }\n  }\n\n  @Test\n  fun getElevation() {\n    val point = mockk<Point>()\n    mapboxMap.getElevation(point)\n    verify { nativeMap.getElevation(point) }\n  }\n\n  @Test\n  fun cameraForDrag() {\n    val fromPoint = mockk<ScreenCoordinate>()\n    val toPoint = mockk<ScreenCoordinate>()\n    mapboxMap.cameraForDrag(fromPoint, toPoint)\n    verify { nativeMap.cameraForDrag(fromPoint, toPoint) }\n  }\n\n  @Test\n  fun setCenterAltitudeMode() {\n    val altitude = MapCenterAltitudeMode.SEA\n    mapboxMap.setCenterAltitudeMode(altitude)\n    verify { nativeMap.setCenterAltitudeMode(altitude) }\n  }\n\n  @Test\n  fun startPerformanceStatisticsCollection() {\n    val options = mockk<PerformanceStatisticsOptions>()\n    val callback = mockk<PerformanceStatisticsCallback>()\n    mapboxMap.startPerformanceStatisticsCollection(options, callback)\n    verify { nativeMap.startPerformanceStatisticsCollection(options, callback) }\n  }\n\n  @Test\n  fun stopPerformanceStatisticsCollection() {\n    mapboxMap.stopPerformanceStatisticsCollection()\n    verify { nativeMap.stopPerformanceStatisticsCollection() }\n  }\n\n  @Test\n  fun cameraAnimationsPluginValid() {\n    val animations = mockk<CameraAnimationsPlugin>(relaxed = true)\n    mapboxMap.cameraAnimationsPlugin = animations\n    val options = CameraOptions.Builder().build()\n    mapboxMap.cameraAnimationsPlugin { easeTo(options) }\n    verify {\n      animations.easeTo(options, null)\n    }\n  }\n\n  @Test\n  fun cameraAnimationsPluginInvalid() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    mapboxMap.cameraAnimationsPlugin = null\n    val options = CameraOptions.Builder().build()\n    assertNull(mapboxMap.cameraAnimationsPlugin { easeTo(options) })\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun gesturesPluginValid() {\n    val gestures = mockk<GesturesPlugin>(relaxed = true)\n    mapboxMap.gesturesPlugin = gestures\n    val moveListener = mockk<OnMoveListener>(relaxed = true)\n    mapboxMap.gesturesPlugin { addOnMoveListener(moveListener) }\n    verify {\n      gestures.addOnMoveListener(moveListener)\n    }\n  }\n\n  @Test\n  fun gesturesPluginInvalid() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    mapboxMap.gesturesPlugin = null\n    val moveListener = mockk<OnMoveListener>(relaxed = true)\n    assertNull(mapboxMap.gesturesPlugin { addOnMoveListener(moveListener) })\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun cameraState() {\n    mapboxMap.cameraState\n    verify { nativeMap.getCameraState() }\n  }\n\n  @Test\n  fun setTileCacheBudget() {\n    val tileCacheBudget = mockk<TileCacheBudget>()\n    mapboxMap.setTileCacheBudget(tileCacheBudget)\n    verify { nativeMap.setTileCacheBudget(tileCacheBudget) }\n  }\n\n  @Test\n  fun setsStyleTransitionAfterOnStyleDataEvent() {\n    val options = mockk<TransitionOptions>(relaxed = true)\n    val style = mockk<Style>(relaxUnitFun = true)\n    mapboxMap.loadStyle(\n      style(Style.STANDARD) {\n        +options\n      },\n    )\n\n    val userCallbackStyleSlot = CapturingSlot<Style.OnStyleLoaded>()\n\n    verify {\n      styleObserver.setLoadStyleListener(any(), capture(userCallbackStyleSlot), any(), any())\n    }\n\n    userCallbackStyleSlot.captured.onStyleLoaded(style)\n\n    verify { style.setStyleTransition(options) }\n  }\n\n  @Test\n  fun tileCover() {\n    val tileCoverOptions = TileCoverOptions.Builder().build()\n    val cameraOptions = CameraOptions.Builder().build()\n    mapboxMap.tileCover(tileCoverOptions, cameraOptions)\n    verify { nativeMap.tileCover(tileCoverOptions, cameraOptions) }\n  }\n\n  @Test\n  fun getAttributions() {\n    mapboxMap.getAttributions()\n    verify { nativeMap.getAttributions() }\n  }\n\n  @Test\n  fun subscribeCameraChange() {\n    val listener = mockk<CameraChangedCallback>()\n    mapboxMap.subscribeCameraChanged(listener)\n    verify { nativeObserver.subscribeCameraChanged(listener) }\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @Test\n  fun subscribeCameraChangeCoalesced() {\n    val callback = mockk<CameraChangedCoalescedCallback>()\n    mapboxMap.subscribeCameraChangedCoalesced(callback)\n    verify { nativeObserver.subscribeCameraChangedCoalesced(callback) }\n  }\n\n  @Test\n  fun subscribeMapIdleListener() {\n    val listener = mockk<MapIdleCallback>()\n    mapboxMap.subscribeMapIdle(listener)\n    verify { nativeObserver.subscribeMapIdle(listener) }\n  }\n\n  @Test\n  fun subscribeMapLoadErrorListener() {\n    val listener = mockk<MapLoadingErrorCallback>()\n    mapboxMap.subscribeMapLoadingError(listener)\n    verify { nativeObserver.subscribeMapLoadingError(listener) }\n  }\n\n  @Test\n  fun subscribeMapLoadedListener() {\n    val listener = mockk<MapLoadedCallback>()\n    mapboxMap.subscribeMapLoaded(listener)\n    verify { nativeObserver.subscribeMapLoaded(listener) }\n  }\n\n  // Render frame events\n  @Test\n  fun subscribeRenderFrameFinishedListener() {\n    val listener = mockk<RenderFrameFinishedCallback>()\n    mapboxMap.subscribeRenderFrameFinished(listener)\n    verify { nativeObserver.subscribeRenderFrameFinished(listener) }\n  }\n\n  @Test\n  fun subscribeRenderFrameStartedListener() {\n    val listener = mockk<RenderFrameStartedCallback>()\n    mapboxMap.subscribeRenderFrameStarted(listener)\n    verify { nativeObserver.subscribeRenderFrameStarted(listener) }\n  }\n\n  // Source events\n  @Test\n  fun subscribeSourceAddedListener() {\n    val listener = mockk<SourceAddedCallback>()\n    mapboxMap.subscribeSourceAdded(listener)\n    verify { nativeObserver.subscribeSourceAdded(listener) }\n  }\n\n  @Test\n  fun subscribeSourceDataLoadedListener() {\n    val listener = mockk<SourceDataLoadedCallback>()\n    mapboxMap.subscribeSourceDataLoaded(listener)\n    verify { nativeObserver.subscribeSourceDataLoaded(listener) }\n  }\n\n  @Test\n  fun subscribeSourceRemovedListener() {\n    val listener = mockk<SourceRemovedCallback>()\n    mapboxMap.subscribeSourceRemoved(listener)\n    verify { nativeObserver.subscribeSourceRemoved(listener) }\n  }\n\n  // Style events\n  @Test\n  fun subscribeStyleLoadedListener() {\n    val listener = mockk<StyleLoadedCallback>()\n    mapboxMap.subscribeStyleLoaded(listener)\n    verify { nativeObserver.subscribeStyleLoaded(listener) }\n  }\n\n  @Test\n  fun subscribeStyleImageMissingListener() {\n    val listener = mockk<StyleImageMissingCallback>()\n    mapboxMap.subscribeStyleImageMissing(listener)\n    verify { nativeObserver.subscribeStyleImageMissing(listener) }\n  }\n\n  @Test\n  fun subscribeStyleImageRemoveUnusedListener() {\n    val listener = mockk<StyleImageRemoveUnusedCallback>()\n    mapboxMap.subscribeStyleImageRemoveUnused(listener)\n    verify { nativeObserver.subscribeStyleImageRemoveUnused(listener) }\n  }\n\n  @Test\n  fun subscribeStyleDataLoaded() {\n    val listener = mockk<StyleDataLoadedCallback>()\n    mapboxMap.subscribeStyleDataLoaded(listener)\n    verify { nativeObserver.subscribeStyleDataLoaded(listener) }\n  }\n\n  @Test\n  fun subscribeResourceRequest() {\n    val listener = mockk<ResourceRequestCallback>()\n    mapboxMap.subscribeResourceRequest(listener)\n    verify { nativeObserver.subscribeResourceRequest(listener) }\n  }\n\n  @Test\n  fun subscribeGenericEvent() {\n    val listener = mockk<GenericEventCallback>()\n    mapboxMap.subscribeGenericEvent(\"event1\", listener)\n    verify { nativeObserver.subscribeGenericEvent(\"event1\", listener) }\n  }\n\n  @Test\n  fun setRenderWorldCopies() {\n    mapboxMap.setRenderWorldCopies(true)\n    verify { nativeMap.setRenderWorldCopies(true) }\n  }\n\n  @Test\n  fun getRenderWorldCopies() {\n    mapboxMap.getRenderWorldCopies()\n    verify { nativeMap.getRenderWorldCopies() }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun setViewAnnotationAvoidLayers() {\n    val layerIds = hashSetOf(\"layer-1\", \"layer-2\")\n    mapboxMap.setViewAnnotationAvoidLayers(layerIds)\n    verifyOnce { nativeMap.setViewAnnotationAvoidLayers(layerIds) }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun getViewAnnotationAvoidLayers() {\n    val layerIds = hashSetOf(\"layer-1\", \"layer-2\")\n    every { nativeMap.getViewAnnotationAvoidLayers() } returns layerIds\n    mapboxMap.getViewAnnotationAvoidLayers()\n    verifyOnce { mapboxMap.getViewAnnotationAvoidLayers() }\n    assertEquals(layerIds, mapboxMap.getViewAnnotationAvoidLayers())\n  }\n\n  @OptIn(MapboxExperimental::class, MapboxDelicateApi::class)\n  @Test\n  fun getNativeMap() {\n    val map = mockk<Map>()\n    every { nativeMap.map } returns map\n    assertEquals(mapboxMap.getNativeMap(), map)\n  }\n\n  private companion object {\n    private val defaultPointsList = listOf(\n      Point.fromLngLat(0.0, 0.0),\n      Point.fromLngLat(1.1, 1.1),\n      Point.fromLngLat(2.2, 2.2),\n      Point.fromLngLat(3.3, 3.3),\n    )\n    private val defaultPointsBbox = listOf(\n      Point.fromLngLat(0.0, 0.0),\n      Point.fromLngLat(3.3, 3.3),\n    )\n  }\n}\n\n@RunWith(ParameterizedRobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass PixelForCoordinatesTest(\n  private val input: List<ScreenCoordinate>,\n  private val expected: List<ScreenCoordinate>,\n) {\n  private val nativeMap: NativeMapImpl = mockk(relaxed = true)\n  private val nativeObserver: NativeObserver = mockk(relaxed = true)\n\n  private lateinit var styleObserver: StyleObserver\n  private lateinit var mapboxMap: MapboxMap\n\n  @Before\n  fun setUp() {\n    mockkStatic(kotlin.collections.Map::class)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    styleObserver = mockk(relaxUnitFun = true)\n    mapboxMap = MapboxMap(nativeMap, nativeObserver, styleObserver)\n  }\n\n  @Test\n  fun pixelForCoordinate() {\n    val point = mockk<Point>()\n    every { nativeMap.getSize() } returns Size(100f, 100f)\n    every { nativeMap.pixelForCoordinate(point) } returns input[0]\n    val screenCoordinate = mapboxMap.pixelForCoordinate(point)\n    verifySequence {\n      nativeMap.map\n      nativeMap.pixelForCoordinate(point)\n      nativeMap.getSize()\n    }\n    assertEquals(expected[0], screenCoordinate)\n  }\n\n  @Test\n  fun pixelsForCoordinates() {\n    val points = mockk<List<Point>>(relaxed = true)\n    every { nativeMap.getSize() } returns Size(100f, 100f)\n    every { nativeMap.pixelsForCoordinates(points.toMutableList()) } returns input.toMutableList()\n    val screenCoordinates = mapboxMap.pixelsForCoordinates(points)\n    assertEquals(expected, screenCoordinates)\n  }\n\n  @Test\n  fun getScreenCullingShape() {\n    mapboxMap.getScreenCullingShape()\n    verify { nativeMap.getScreenCullingShape() }\n  }\n\n  @Test\n  fun setScreenShape() {\n    val shape = mockk<List<Vec2>>()\n    mapboxMap.setScreenCullingShape(shape)\n    verify { nativeMap.setScreenCullingShape(shape) }\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(Map::class)\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  companion object {\n    @JvmStatic\n    @ParameterizedRobolectricTestRunner.Parameters(name = \"Input ScreenCoordinate({0}, {1}) should be mapped to ScreenCoordinate({2}, {3})\")\n    @Suppress(\"unused\")\n    fun data() = listOf(\n      arrayOf(\n        listOf(ScreenCoordinate(150.0, 150.0)),\n        listOf(ScreenCoordinate(-1.0, -1.0)),\n      ),\n      arrayOf(\n        listOf(ScreenCoordinate(50.0, 50.0)),\n        listOf(ScreenCoordinate(50.0, 50.0)),\n      ),\n      arrayOf(\n        listOf(ScreenCoordinate(0.0, 0.0)),\n        listOf(ScreenCoordinate(0.0, 0.0)),\n      ),\n      arrayOf(\n        listOf(ScreenCoordinate(100.0, 100.0)),\n        listOf(ScreenCoordinate(100.0, 100.0))\n      ),\n      arrayOf(\n        listOf(ScreenCoordinate(100.0000000345, 100.0)),\n        listOf(ScreenCoordinate(100.0, 100.0))\n      ),\n      arrayOf(\n        listOf(ScreenCoordinate(0.0000000345, 100.0)),\n        listOf(ScreenCoordinate(0.0000000345, 100.0))\n      ),\n      arrayOf(\n        listOf(ScreenCoordinate(0.1000000345, 100.0)),\n        listOf(ScreenCoordinate(0.1000000345, 100.0))\n      ),\n      arrayOf(\n        listOf(ScreenCoordinate(100.45, 100.0)),\n        listOf(ScreenCoordinate(100.0, 100.0))\n      ),\n      arrayOf(\n        listOf(ScreenCoordinate(100.500001, 100.0)),\n        listOf(ScreenCoordinate(-1.0, -1.0))\n      ),\n      arrayOf(\n        listOf(ScreenCoordinate(100.0, -0.0000001)),\n        listOf(ScreenCoordinate(100.0, 0.0)),\n      ),\n      arrayOf(\n        listOf(\n          ScreenCoordinate(100.0, -0.0000001),\n          ScreenCoordinate(0.0, 0.0),\n          ScreenCoordinate(100.0, 100.0),\n          ScreenCoordinate(100.1233445, 100.0000434)\n        ),\n        listOf(\n          ScreenCoordinate(100.0, 0.0),\n          ScreenCoordinate(0.0, 0.0),\n          ScreenCoordinate(100.0, 100.0),\n          ScreenCoordinate(100.0, 100.0)\n        ),\n      ),\n      arrayOf(\n        listOf(\n          ScreenCoordinate(100.56666, 110.0000001),\n          ScreenCoordinate(-10.0, -10.0),\n          ScreenCoordinate(0.023456, -0.023456),\n          ScreenCoordinate(100.1233445, 50.0)\n        ),\n        listOf(\n          ScreenCoordinate(-1.0, -1.0),\n          ScreenCoordinate(-1.0, -1.0),\n          ScreenCoordinate(0.023456, 0.0),\n          ScreenCoordinate(100.0, 50.0)\n        ),\n      ),\n    )\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/MapboxOptionsTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.common.TileStore\nimport com.mapbox.maps.shadows.ShadowMapsResourceOptions\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowMapsResourceOptions::class])\nclass MapboxOptionsTest {\n  private val mockedTileStore = mockk<TileStore>()\n\n  @Before\n  fun setUp() {\n    mockkStatic(MapsResourceOptions::class)\n    every { MapsResourceOptions.getBaseURL() } returns \"https://api.mapbox.com\"\n    every { MapsResourceOptions.getDataPath() } returns \"/tmp/data/\"\n    every { MapsResourceOptions.getTileStoreUsageMode() } returns TileStoreUsageMode.READ_ONLY\n    every { MapsResourceOptions.getTileStore() } returns mockedTileStore\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(MapsResourceOptions::class)\n  }\n\n  @Test\n  fun baseUrl() {\n    val baseUrl = MapboxOptions.mapsOptions.baseUrl\n    assertEquals(\"https://api.mapbox.com\", baseUrl)\n    verify(exactly = 1) { MapsResourceOptions.getBaseURL() }\n    MapboxOptions.mapsOptions.baseUrl = \"https://test.com\"\n    verify(exactly = 1) { MapsResourceOptions.setBaseURL(\"https://test.com\") }\n  }\n\n  @Test\n  fun dataPath() {\n    val dataPath = MapboxOptions.mapsOptions.dataPath\n    assertEquals(\"/tmp/data/\", dataPath)\n    verify(exactly = 1) { MapsResourceOptions.getDataPath() }\n    MapboxOptions.mapsOptions.dataPath = \"/var/data\"\n    verify(exactly = 1) { MapsResourceOptions.setDataPath(\"/var/data\") }\n  }\n\n  @Test\n  fun tileStoreUsageMode() {\n    val tileStoreUsageMode = MapboxOptions.mapsOptions.tileStoreUsageMode\n    assertEquals(TileStoreUsageMode.READ_ONLY, tileStoreUsageMode)\n    verify(exactly = 1) { MapsResourceOptions.getTileStoreUsageMode() }\n    MapboxOptions.mapsOptions.tileStoreUsageMode = TileStoreUsageMode.DISABLED\n    verify(exactly = 1) { MapsResourceOptions.setTileStoreUsageMode(TileStoreUsageMode.DISABLED) }\n  }\n\n  @Test\n  fun tileStore() {\n    val tileStore = MapboxOptions.mapsOptions.tileStore\n    assertEquals(mockedTileStore, tileStore)\n    verify(exactly = 1) { MapsResourceOptions.getTileStore() }\n    val tileStore2 = mockk<TileStore>()\n    MapboxOptions.mapsOptions.tileStore = tileStore2\n    verify(exactly = 1) { MapsResourceOptions.setTileStore(tileStore2) }\n    MapboxOptions.mapsOptions.tileStore = null\n    verify(exactly = 1) { MapsResourceOptions.setTileStore(null) }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/NativeMapTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.shadows.ShadowObservable\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(\n  shadows = [\n    ShadowMap::class,\n    ShadowMapSnapshotter::class,\n    ShadowObservable::class,\n    ShadowCameraManager::class,\n    ShadowStyleManager::class,\n  ]\n)\nclass NativeMapTest {\n\n  private val map = mockk<Map>(relaxed = true)\n\n  @Test\n  fun subscribeCameraChangeEvent() {\n    subscribeEvent<CameraChangedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun subscribeCameraChangeCoalescedEvent() {\n    subscribeEvent<CameraChangedCoalescedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeMapIdleEvent() {\n    subscribeEvent<MapIdleCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n  @Test\n  fun subscribeStyleDataLoadedEvent() {\n    subscribeEvent<StyleDataLoadedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeStyleLoadedEvent() {\n    subscribeEvent<StyleLoadedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeImageMissingEvent() {\n    subscribeEvent<StyleImageMissingCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeImageRemovedEvent() {\n    subscribeEvent<StyleImageRemoveUnusedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeRenderFrameFinishedEvent() {\n    subscribeEvent<RenderFrameFinishedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeRenderFrameStartedEvent() {\n    subscribeEvent<RenderFrameStartedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeSourceAddedEvent() {\n    subscribeEvent<SourceAddedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeSourceDataLoadedEvent() {\n    subscribeEvent<SourceDataLoadedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeSourceRemovedEvent() {\n    subscribeEvent<SourceRemovedCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  @Test\n  fun subscribeResourceRequestEvent() {\n    subscribeEvent<ResourceRequestCallback>(NativeMapImpl::subscribe, Map::subscribe)\n  }\n\n  private inline fun <reified C> subscribeEvent(\n    nativeSubscribe: NativeMapImpl.(C) -> Unit,\n    crossinline mapSubscribe: Map.(C) -> Unit\n  ) {\n    val nativeMap = NativeMapImpl(map)\n    val callback: C = mockk()\n    nativeMap.nativeSubscribe(callback)\n    verify { map.mapSubscribe(callback) }\n  }\n\n  @Test\n  fun subscribeUntypedEvent() {\n    val nativeMap = NativeMapImpl(map)\n    val callback = mockk<GenericEventCallback>()\n    nativeMap.subscribe(\"event\", callback)\n    verify { map.subscribe(\"event\", callback) }\n  }\n\n  @Test\n  fun getStyleURI() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleURI()\n    verify { map.styleURI }\n  }\n\n  @Test\n  fun setStyleURI() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleURI(\"foobar\")\n    verify { map.styleURI = \"foobar\" }\n  }\n\n  @Test\n  fun getStyleJSON() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleJSON()\n    verify { map.styleJSON }\n  }\n\n  @Test\n  fun setStyleJSON() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleJSON(\"foobar\")\n    verify { map.styleJSON = \"foobar\" }\n  }\n\n  @Test\n  fun getStyleDefaultCamera() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleDefaultCamera()\n    verify { map.styleDefaultCamera }\n  }\n\n  @Test\n  fun getStyleTransition() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleTransition()\n    verify { map.styleTransition }\n  }\n\n  @Test\n  fun setStyleTransition() {\n    val transitionOptions = TransitionOptions.Builder().build()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleTransition(transitionOptions)\n    verify { map.styleTransition = transitionOptions }\n  }\n\n  @Test\n  fun addStyleLayer() {\n    val value = mockk<Value>()\n    val layerPosition = LayerPosition(null, null, null)\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.addStyleLayer(value, layerPosition)\n    verify { map.addStyleLayer(value, layerPosition) }\n  }\n\n  @Test\n  fun addStyleCustomLayer() {\n    val value = mockk<CustomLayerHost>()\n    val layerPosition = LayerPosition(null, null, null)\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.addStyleCustomLayer(\"foobar\", value, layerPosition)\n    verify { map.addStyleCustomLayer(\"foobar\", value, layerPosition) }\n  }\n\n  @Test\n  fun addPersistentStyleLayer() {\n    val value = mockk<Value>()\n    val layerPosition = LayerPosition(null, null, null)\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.addPersistentStyleLayer(value, layerPosition)\n    verify { map.addPersistentStyleLayer(value, layerPosition) }\n  }\n\n  @Test\n  fun addPersistentStyleCustomLayer() {\n    val value = mockk<CustomLayerHost>()\n    val layerPosition = LayerPosition(null, null, null)\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.addPersistentStyleCustomLayer(\"foobar\", value, layerPosition)\n    verify { map.addPersistentStyleCustomLayer(\"foobar\", value, layerPosition) }\n  }\n\n  @Test\n  fun isStyleLayerPersistent() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.isStyleLayerPersistent(\"foobar\")\n    verify { map.isStyleLayerPersistent(\"foobar\") }\n  }\n\n  @Test\n  fun removeStyleLayer() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.removeStyleLayer(\"foobar\")\n    verify { map.removeStyleLayer(\"foobar\") }\n  }\n\n  @Test\n  fun styleLayerExists() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.styleLayerExists(\"foobar\")\n    verify { map.styleLayerExists(\"foobar\") }\n  }\n\n  @Test\n  fun getStyleLayers() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleLayers()\n    verify { map.styleLayers }\n  }\n\n  @Test\n  fun getStyleLayerProperty() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleLayerProperty(\"foo\", \"bar\")\n    verify { map.getStyleLayerProperty(\"foo\", \"bar\") }\n  }\n\n  @Test\n  fun setStyleLayerProperty() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleLayerProperty(\"foo\", \"bar\", value)\n    verify { map.setStyleLayerProperty(\"foo\", \"bar\", value) }\n  }\n\n  @Test\n  fun getStyleLayerProperties() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleLayerProperties(\"foo\")\n    verify { map.getStyleLayerProperties(\"foo\") }\n  }\n\n  @Test\n  fun setStyleLayerProperties() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleLayerProperties(\"foo\", value)\n    verify { map.setStyleLayerProperties(\"foo\", value) }\n  }\n\n  @Test\n  fun addStyleSource() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.addStyleSource(\"foo\", value)\n    verify { map.addStyleSource(\"foo\", value) }\n  }\n\n  @Test\n  fun getStyleSourceProperty() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleSourceProperty(\"foo\", \"bar\")\n    verify { map.getStyleSourceProperty(\"foo\", \"bar\") }\n  }\n\n  @Test\n  fun setStyleSourceProperty() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleSourceProperty(\"foo\", \"bar\", value)\n    verify { map.setStyleSourceProperty(\"foo\", \"bar\", value) }\n  }\n\n  @Test\n  fun setStyleSourcePropertyWithImportId() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleSourceProperty(\"importId\", \"foo\", \"bar\", value)\n    verify { map.setStyleSourceProperty(\"importId\", \"foo\", \"bar\", value) }\n  }\n\n  @Test\n  fun getStyleSourceProperties() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleSourceProperties(\"foo\")\n    verify { map.getStyleSourceProperties(\"foo\") }\n  }\n\n  @Test\n  fun setStyleSourceProperties() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleSourceProperties(\"foo\", value)\n    verify { map.setStyleSourceProperties(\"foo\", value) }\n  }\n\n  @Test\n  fun updateStyleImageSourceImage() {\n    val value = mockk<Image>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.updateStyleImageSourceImage(\"foo\", value)\n    verify { map.updateStyleImageSourceImage(\"foo\", value) }\n  }\n\n  @Test\n  fun removeStyleSource() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.removeStyleSource(\"foo\")\n    verify { map.removeStyleSource(\"foo\") }\n  }\n\n  @Test\n  fun styleSourceExists() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.styleSourceExists(\"foo\")\n    verify { map.styleSourceExists(\"foo\") }\n  }\n\n  @Test\n  fun getStyleSources() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleSources()\n    verify { map.styleSources }\n  }\n\n  @Test\n  fun setStyleTerrain() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleTerrain(value)\n    verify { map.setStyleTerrain(value) }\n  }\n\n  @Test\n  fun getStyleTerrainProperty() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleTerrainProperty(\"foo\")\n    verify { map.getStyleTerrainProperty(\"foo\") }\n  }\n\n  @Test\n  fun setStyleTerrainProperty() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleTerrainProperty(\"foo\", value)\n    verify { map.setStyleTerrainProperty(\"foo\", value) }\n  }\n\n  @Test\n  fun getStyleImage() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleImage(\"foo\")\n    verify { map.getStyleImage(\"foo\") }\n  }\n\n  @Test\n  fun addStyleImage() {\n    val value = mockk<Image>()\n    val imageContent = mockk<ImageContent>()\n    val stretches = mutableListOf<ImageStretches>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.addStyleImage(\"foo\", 1.0f, value, true, stretches, stretches, imageContent)\n    verify { map.addStyleImage(\"foo\", 1.0f, value, true, stretches, stretches, imageContent) }\n  }\n\n  @Test\n  fun removeStyleImage() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.removeStyleImage(\"foo\")\n    verify { map.removeStyleImage(\"foo\") }\n  }\n\n  @Test\n  fun hasStyleImage() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.hasStyleImage(\"foo\")\n    verify { map.hasStyleImage(\"foo\") }\n  }\n\n  @Test\n  fun addStyleCustomGeometrySource() {\n    val value = mockk<CustomGeometrySourceOptions>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.addStyleCustomGeometrySource(\"foo\", value)\n    verify { map.addStyleCustomGeometrySource(\"foo\", value) }\n  }\n\n  @Test\n  fun setStyleCustomGeometrySourceTileData() {\n    val id = mockk<CanonicalTileID>()\n    val featureCollection = mockk<MutableList<Feature>>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleCustomGeometrySourceTileData(\"foo\", id, featureCollection)\n    verify { map.setStyleCustomGeometrySourceTileData(\"foo\", id, featureCollection) }\n  }\n\n  @Test\n  fun invalidateStyleCustomGeometrySourceTile() {\n    val id = mockk<CanonicalTileID>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.invalidateStyleCustomGeometrySourceTile(\"foo\", id)\n    verify { map.invalidateStyleCustomGeometrySourceTile(\"foo\", id) }\n  }\n\n  @Test\n  fun invalidateStyleCustomGeometrySourceRegion() {\n    val bounds = mockk<CoordinateBounds>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.invalidateStyleCustomGeometrySourceRegion(\"foo\", bounds)\n    verify { map.invalidateStyleCustomGeometrySourceRegion(\"foo\", bounds) }\n  }\n\n  @Test\n  fun createRenderer() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.createRenderer()\n    verify { map.createRenderer() }\n  }\n\n  @Test\n  fun destroyRenderer() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.destroyRenderer()\n    verify { map.destroyRenderer() }\n  }\n\n  @Test\n  fun render() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.render()\n    verify { map.render() }\n  }\n\n  @Test\n  fun setSize() {\n    val size = Size(1.0f, 2.0f)\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setSize(size)\n    verify { map.size = size }\n  }\n  @Test\n  fun initialSizeSetCallbacksTestBeforeSetSize() {\n    val nativeMap = NativeMapImpl(map)\n    var callbackTriggered = false\n    var anotherCallbackTriggered = false\n    val callback: () -> Unit = { callbackTriggered = true }\n    val anotherCallback: () -> Unit = { anotherCallbackTriggered = true }\n    nativeMap.whenMapSizeReady(callback)\n    nativeMap.whenMapSizeReady(anotherCallback)\n    assert(!callbackTriggered)\n    assert(!anotherCallbackTriggered)\n    nativeMap.setSize(Size(1.0f, 2.0f))\n    assert(callbackTriggered)\n    assert(anotherCallbackTriggered)\n  }\n\n  @Test\n  fun initialSizeSetCallbackTestAfterSetSize() {\n    val nativeMap = NativeMapImpl(map)\n    var callbackTriggered = false\n    val callback: () -> Unit = { callbackTriggered = true }\n    nativeMap.setSize(Size(1.0f, 2.0f))\n    nativeMap.whenMapSizeReady(callback)\n    assert(callbackTriggered)\n  }\n\n  @Test\n  fun getSize() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getSize()\n    verify { map.size }\n  }\n\n  @Test\n  fun triggerRepaint() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.triggerRepaint()\n    verify { map.triggerRepaint() }\n  }\n\n  @Test\n  fun setCameraOptions() {\n    val value = mockk<CameraOptions>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setCamera(value)\n    verify { map.setCamera(value) }\n  }\n\n  @Test\n  fun getCameraState() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getCameraState()\n    verify { map.cameraState }\n  }\n\n  @Test\n  fun cameraForCoordinateBounds() {\n    val bounds = mockk<CoordinateBounds>()\n    val edgeInsets = mockk<EdgeInsets>()\n    val offset = mockk<ScreenCoordinate>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.cameraForCoordinateBounds(\n      coordinateBounds = bounds,\n      padding = edgeInsets,\n      bearing = 1.0,\n      pitch = 2.0,\n      maxZoom = 2.0,\n      offset = offset,\n    )\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = edgeInsets,\n        bearing = 1.0,\n        pitch = 2.0,\n        maxZoom = 2.0,\n        offset = offset\n      )\n    }\n  }\n\n  @Test\n  fun cameraForCoordinates() {\n    val points = mockk<MutableList<Point>>()\n    val edgeInsets = mockk<EdgeInsets>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.cameraForCoordinates(points, edgeInsets, 1.0, 2.0)\n    verify { map.cameraForCoordinates(points, edgeInsets, 1.0, 2.0) }\n  }\n\n  @Test\n  fun cameraForCoordinatesWithOffset() {\n    val points = mockk<MutableList<Point>>()\n    val camera = mockk<CameraOptions>()\n    val edgeInsets = mockk<EdgeInsets>()\n    val offset = mockk<ScreenCoordinate>()\n    val nativeMap = NativeMapImpl(map)\n\n    nativeMap.cameraForCoordinates(points, camera, edgeInsets, 1.0, offset)\n    verify { map.cameraForCoordinates(points, camera, edgeInsets, 1.0, offset) }\n  }\n\n  @Test\n  fun cameraForGeometry() {\n    val geometry = mockk<Geometry>()\n    val edgeInsets = mockk<EdgeInsets>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.cameraForGeometry(geometry, edgeInsets, 1.0, 2.0)\n    verify { map.cameraForGeometry(geometry, edgeInsets, 1.0, 2.0) }\n  }\n\n  @Test\n  fun coordinateBoundsForCamera() {\n    val value = mockk<CameraOptions>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.coordinateBoundsForCamera(value)\n    verify { map.coordinateBoundsForCamera(value) }\n  }\n\n  @Test\n  fun coordinateBoundsZoomForCamera() {\n    val value = mockk<CameraOptions>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.coordinateBoundsZoomForCamera(value)\n    verify { map.coordinateBoundsZoomForCamera(value) }\n  }\n\n  @Test\n  fun coordinateBoundsForCameraUnwrapped() {\n    val value = mockk<CameraOptions>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.coordinateBoundsForCameraUnwrapped(value)\n    verify { map.coordinateBoundsForCameraUnwrapped(value) }\n  }\n\n  @Test\n  fun coordinateBoundsZoomForCameraUnwrapped() {\n    val value = mockk<CameraOptions>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.coordinateBoundsZoomForCameraUnwrapped(value)\n    verify { map.coordinateBoundsZoomForCameraUnwrapped(value) }\n  }\n\n  @Test\n  fun setGestureInProgress() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setGestureInProgress(true)\n    verify { map.isGestureInProgress = true }\n  }\n\n  @Test\n  fun isGestureInProgress() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.isGestureInProgress()\n    verify { map.isGestureInProgress }\n  }\n\n  @Test\n  fun setUserAnimationInProgress() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setUserAnimationInProgress(true)\n    verify { map.isUserAnimationInProgress = true }\n  }\n\n  @Test\n  fun isUserAnimationInProgress() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.isUserAnimationInProgress()\n    verify { map.isUserAnimationInProgress }\n  }\n\n  @Test\n  fun setBounds() {\n    val value = mockk<CameraBoundsOptions>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setBounds(value)\n    verify { map.setBounds(value) }\n  }\n\n  @Test\n  fun getBounds() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getBounds()\n    verify { map.bounds }\n  }\n\n  @Test\n  fun setPrefetchZoomDelta() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setPrefetchZoomDelta(2)\n    verify { map.prefetchZoomDelta = 2 }\n  }\n\n  @Test\n  fun getPrefetchZoomDelta() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getPrefetchZoomDelta()\n    verify { map.prefetchZoomDelta }\n  }\n\n  @Test\n  fun setNorthOrientation() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setNorthOrientation(NorthOrientation.DOWNWARDS)\n    verify { map.setNorthOrientation(NorthOrientation.DOWNWARDS) }\n  }\n\n  @Test\n  fun setConstrainMode() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setConstrainMode(ConstrainMode.HEIGHT_ONLY)\n    verify { map.setConstrainMode(ConstrainMode.HEIGHT_ONLY) }\n  }\n\n  @Test\n  fun setViewportMode() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setViewportMode(ViewportMode.FLIPPED_Y)\n    verify { map.setViewportMode(ViewportMode.FLIPPED_Y) }\n  }\n\n  @Test\n  fun getMapOptions() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getMapOptions()\n    verify { map.mapOptions }\n  }\n\n  @Test\n  fun pixelForCoordinate() {\n    val value = mockk<Point>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.pixelForCoordinate(value)\n    verify { map.pixelForCoordinate(value) }\n  }\n\n  @Test\n  fun coordinateForPixel() {\n    val value = mockk<ScreenCoordinate>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.coordinateForPixel(value)\n    verify { map.coordinateForPixel(value) }\n  }\n\n  @Test\n  fun pixelsForCoordinates() {\n    val value = mockk<MutableList<Point>>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.pixelsForCoordinates(value)\n    verify { map.pixelsForCoordinates(value) }\n  }\n\n  @Test\n  fun coordinatesForPixels() {\n    val value = mockk<MutableList<ScreenCoordinate>>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.coordinatesForPixels(value)\n    verify { map.coordinatesForPixels(value) }\n  }\n\n  @Test\n  fun getDebug() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getDebug()\n    verify { map.debug }\n  }\n\n  @Test\n  fun setDebug() {\n    val value = mockk<List<MapDebugOptions>>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setDebug(value, true)\n    verify { map.setDebug(value, true) }\n  }\n\n  @Test\n  fun isStyleFullyLoaded() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.isStyleLoaded()\n    verify { map.isStyleLoaded }\n  }\n\n  @Test\n  fun queryRenderedFeatures() {\n    val callback = mockk<QueryRenderedFeaturesCallback>()\n    val geometry = mockk<RenderedQueryGeometry>()\n    val queryOptions = mockk<RenderedQueryOptions>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.queryRenderedFeatures(geometry, queryOptions, callback)\n    verify { map.queryRenderedFeatures(geometry, queryOptions, callback) }\n  }\n\n  @Test\n  fun querySourceFeatures() {\n    val callback = mockk<QuerySourceFeaturesCallback>()\n    val queryOptions = mockk<SourceQueryOptions>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.querySourceFeatures(\"foo\", queryOptions, callback)\n    verify { map.querySourceFeatures(\"foo\", queryOptions, callback) }\n  }\n\n  @Test\n  fun queryFeatureExtensions() {\n    val callback = mockk<QueryFeatureExtensionCallback>()\n    val value = mockk<Feature>()\n    val hashMap = mockk<HashMap<String, Value>>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.queryFeatureExtensions(\"id\", value, \"extension\", \"extensionField\", hashMap, callback)\n    verify {\n      map.queryFeatureExtensions(\n        \"id\",\n        value,\n        \"extension\",\n        \"extensionField\",\n        hashMap,\n        callback\n      )\n    }\n  }\n\n  @Test\n  fun setFeatureState() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    val callback = mockk<FeatureStateOperationCallback>()\n    nativeMap.setFeatureState(\"foo\", \"bar\", \"id\", value, callback)\n    verify { map.setFeatureState(\"foo\", \"bar\", \"id\", any(), callback) }\n  }\n\n  @Test\n  fun setFeatureStateFestureset() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    val featuresetDescriptor = mockk<FeaturesetDescriptor>()\n    val featuresetFeatureId = mockk<FeaturesetFeatureId>()\n    val callback = mockk<FeatureStateOperationCallback>()\n    nativeMap.setFeatureState(featuresetDescriptor, featuresetFeatureId, value, callback)\n    verify { map.setFeatureState(featuresetDescriptor, featuresetFeatureId, value, callback) }\n  }\n\n  @Test\n  fun getFeatureState() {\n    val nativeMap = NativeMapImpl(map)\n    val callback = mockk<QueryFeatureStateCallback>()\n    nativeMap.getFeatureState(\"foo\", \"bar\", \"id\", callback)\n    verify { map.getFeatureState(\"foo\", \"bar\", \"id\", callback) }\n  }\n\n  @Test\n  fun getFeatureStateFestureset() {\n    val nativeMap = NativeMapImpl(map)\n    val featuresetDescriptor = mockk<FeaturesetDescriptor>()\n    val featuresetFeatureId = mockk<FeaturesetFeatureId>()\n    val callback = mockk<QueryFeatureStateCallback>()\n    nativeMap.getFeatureState(featuresetDescriptor, featuresetFeatureId, callback)\n    verify { map.getFeatureState(featuresetDescriptor, featuresetFeatureId, callback) }\n  }\n\n  @Test\n  fun removeFeatureState() {\n    val nativeMap = NativeMapImpl(map)\n    val callback = mockk<FeatureStateOperationCallback>()\n    nativeMap.removeFeatureState(\"foo\", \"bar\", \"id\", \"key\", callback)\n    verify { map.removeFeatureState(\"foo\", \"bar\", \"id\", \"key\", callback) }\n  }\n\n  @Test\n  fun removeFeatureStateFeatureset() {\n    val nativeMap = NativeMapImpl(map)\n    val callback = mockk<FeatureStateOperationCallback>()\n    val featuresetDescriptor = mockk<FeaturesetDescriptor>()\n    val featuresetFeatureId = mockk<FeaturesetFeatureId>()\n    nativeMap.removeFeatureState(featuresetDescriptor, featuresetFeatureId, \"key\", callback)\n    verify { map.removeFeatureState(featuresetDescriptor, featuresetFeatureId, \"key\", callback) }\n  }\n\n  @Test\n  fun resetFeatureStates() {\n    val nativeMap = NativeMapImpl(map)\n    val callback = mockk<FeatureStateOperationCallback>()\n    nativeMap.resetFeatureStates(\"foo\", \"bar\", callback)\n    verify { map.resetFeatureStates(\"foo\", \"bar\", callback) }\n  }\n\n  @Test\n  fun resetFeatureStatesFeatureset() {\n    val nativeMap = NativeMapImpl(map)\n    val callback = mockk<FeatureStateOperationCallback>()\n    val featuresetDescriptor = mockk<FeaturesetDescriptor>()\n    nativeMap.resetFeatureStates(featuresetDescriptor, callback)\n    verify { map.resetFeatureStates(featuresetDescriptor, callback) }\n  }\n\n  @Test\n  @OptIn(com.mapbox.maps.MapboxExperimental::class, MapboxExperimental::class)\n  fun setFeatureStateExpression() {\n    val expression = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n\n    val featuresetDescriptor = mockk<FeaturesetDescriptor>()\n    val state = mockk<Value>()\n    val callback = mockk<FeatureStateOperationCallback>()\n    nativeMap.setFeatureStateExpression(3, featuresetDescriptor, state, expression, callback)\n    verify { map.setFeatureStateExpression(3, featuresetDescriptor, state, expression, callback) }\n  }\n\n  @Test\n  @OptIn(com.mapbox.maps.MapboxExperimental::class, MapboxExperimental::class)\n  fun removeFeatureStateExpression() {\n    val nativeMap = NativeMapImpl(map)\n\n    val callback = mockk<FeatureStateOperationCallback>()\n    nativeMap.removeFeatureStateExpression(3, callback)\n    verify { map.removeFeatureStateExpression(3, callback) }\n  }\n\n  @Test\n  @OptIn(com.mapbox.maps.MapboxExperimental::class, MapboxExperimental::class)\n  fun resetFeatureStateExpressions() {\n    val nativeMap = NativeMapImpl(map)\n\n    val callback = mockk<FeatureStateOperationCallback>()\n    nativeMap.resetFeatureStateExpressions(callback)\n    verify { map.resetFeatureStateExpressions(callback) }\n  }\n\n  @Test\n  fun reduceMemoryUse() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.reduceMemoryUse()\n    verify { map.reduceMemoryUse() }\n  }\n\n  @Test\n  fun moveStyleLayer() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.moveStyleLayer(\"layerId\", LayerPosition(\"above\", \"below\", 0))\n    verify { map.moveStyleLayer(\"layerId\", LayerPosition(\"above\", \"below\", 0)) }\n  }\n\n  @Test\n  fun setStyleProjection() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleProjection(value)\n    verify { map.setStyleProjection(value) }\n  }\n\n  @Test\n  fun getStyleProjectionProperty() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleProjectionProperty(\"foo\")\n    verify { map.getStyleProjectionProperty(\"foo\") }\n  }\n\n  @Test\n  fun setStyleProjectionProperty() {\n    val value = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleProjectionProperty(\"foo\", value)\n    verify { map.setStyleProjectionProperty(\"foo\", value) }\n  }\n\n  @Test\n  fun addStyleModel() {\n    val modelId = \"modelId\"\n    val modelUri = \"modelUri\"\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.addStyleModel(modelId, modelUri)\n    verify { map.addStyleModel(modelId, modelUri) }\n  }\n\n  @Test\n  fun removeStyleModel() {\n    val modelId = \"modelId\"\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.removeStyleModel(modelId)\n    verify { map.removeStyleModel(modelId) }\n  }\n\n  @Test\n  fun hasStyleModel() {\n    val modelId = \"modelId\"\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.hasStyleModel(modelId)\n    verify { map.hasStyleModel(modelId) }\n  }\n\n  @Test\n  fun setStyleAtmosphere() {\n    val atmosphereValue = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleAtmosphere(atmosphereValue)\n    verify { map.setStyleAtmosphere(atmosphereValue) }\n  }\n\n  @Test\n  fun setStyleAtmosphereProperty() {\n    val property = \"property\"\n    val atmosphereValueProperty = mockk<Value>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setStyleAtmosphereProperty(property, atmosphereValueProperty)\n    verify { map.setStyleAtmosphereProperty(property, atmosphereValueProperty) }\n  }\n\n  @Test\n  fun getStyleAtmosphereProperty() {\n    val property = \"property\"\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getStyleAtmosphereProperty(property)\n    verify { map.getStyleAtmosphereProperty(property) }\n  }\n\n  @Test\n  fun setRenderWorldCopiesProperty() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setRenderWorldCopies(true)\n    verify { map.renderWorldCopies = true }\n  }\n\n  @Test\n  fun getRenderWorldCopiesProperty() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getRenderWorldCopies()\n    verify { map.renderWorldCopies }\n  }\n\n  @Test\n  fun cameraForCoordinateBoundsWithoutPadding() {\n    val bounds = mockk<CoordinateBounds>()\n    val offset = mockk<ScreenCoordinate>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.cameraForCoordinateBounds(\n      coordinateBounds = bounds,\n      padding = null,\n      bearing = 1.0,\n      pitch = 2.0,\n      maxZoom = 2.0,\n      offset = offset,\n    )\n    verify {\n      nativeMap.cameraForCoordinateBounds(\n        coordinateBounds = bounds,\n        padding = null,\n        bearing = 1.0,\n        pitch = 2.0,\n        maxZoom = 2.0,\n        offset = offset\n      )\n    }\n  }\n\n  @Test\n  fun cameraForCoordinatesWithoutPadding() {\n    val points = mockk<MutableList<Point>>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.cameraForCoordinates(points, null, 1.0, 2.0)\n    verify { map.cameraForCoordinates(points, null, 1.0, 2.0) }\n  }\n\n  @Test\n  fun cameraForGeometryWithoutPadding() {\n    val geometry = mockk<Geometry>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.cameraForGeometry(geometry, null, 1.0, 2.0)\n    verify { map.cameraForGeometry(geometry, null, 1.0, 2.0) }\n  }\n\n  @Test\n  fun coordinateInfoForPixel() {\n    val pixel = mockk<ScreenCoordinate>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.coordinateInfoForPixel(pixel)\n    verify { map.coordinateInfoForPixel(pixel) }\n  }\n\n  @Test\n  fun coordinateInfoForPixels() {\n    val pixels = mockk<List<ScreenCoordinate>>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.coordinatesInfoForPixels(pixels)\n    verify { map.coordinatesInfoForPixels(pixels) }\n  }\n\n  @Test\n  fun getAttributions() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getAttributions()\n    verify { map.attributions }\n  }\n\n  @Test\n  fun cameraForDrag() {\n    val nativeMap = NativeMapImpl(map)\n    val start = ScreenCoordinate(0.0, 0.0)\n    val end = ScreenCoordinate(1.0, 1.0)\n    nativeMap.cameraForDrag(start, end)\n    verify { map.cameraForDrag(start, end) }\n  }\n\n  @Test\n  fun setCenterAltitudeMode() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setCenterAltitudeMode(MapCenterAltitudeMode.TERRAIN)\n    verify { map.centerAltitudeMode = MapCenterAltitudeMode.TERRAIN }\n  }\n\n  @Test\n  fun startPerformanceStatisticsCollection() {\n    val nativeMap = NativeMapImpl(map)\n    val options = mockk<PerformanceStatisticsOptions>()\n    val callback = mockk<PerformanceStatisticsCallback>()\n    nativeMap.startPerformanceStatisticsCollection(options, callback)\n    verify { map.startPerformanceStatisticsCollection(options, callback) }\n  }\n\n  @Test\n  fun stopPerformanceStatisticsCollection() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.stopPerformanceStatisticsCollection()\n    verify { map.stopPerformanceStatisticsCollection() }\n  }\n\n  @Test\n  fun getScreenCullingShape() {\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.getScreenCullingShape()\n    verify { map.screenCullingShape }\n  }\n\n  @Test\n  fun setCustomScreenShape() {\n    val shape = mockk<List<Vec2>>()\n    val nativeMap = NativeMapImpl(map)\n    nativeMap.setScreenCullingShape(shape)\n    verify { map.screenCullingShape = shape }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/NativeObserverTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.extension.observable.eventdata.RenderFrameStartedEventData\nimport com.mapbox.maps.plugin.delegates.listeners.*\nimport com.mapbox.maps.shadows.ShadowCancelable\nimport com.mapbox.maps.shadows.ShadowObservable\nimport com.mapbox.verifyNo\nimport io.mockk.*\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@Suppress(\"DEPRECATION\")\n@RunWith(RobolectricTestRunner::class)\n@Config(\n  shadows = [\n    ShadowObservable::class,\n    ShadowCancelable::class\n  ]\n)\nclass NativeObserverTest {\n\n  private val observableInterface = mockk<NativeMapImpl>(relaxed = true)\n  private lateinit var nativeObserver: NativeObserver\n  private val cancelable = mockk<Cancelable>(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    nativeObserver = NativeObserver(observableInterface)\n    every { cancelable.cancel() } just runs\n  }\n\n  @Test\n  fun addAndRemoveOnCameraChangeListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnCameraChangeListener,\n      NativeObserver::removeOnCameraChangeListener,\n      OnCameraChangeListener::onCameraChanged\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnMapIdleListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnMapIdleListener,\n      NativeObserver::removeOnMapIdleListener,\n      OnMapIdleListener::onMapIdle\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnMapLoadErrorListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnMapLoadErrorListener,\n      NativeObserver::removeOnMapLoadErrorListener,\n      OnMapLoadErrorListener::onMapLoadError\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnMapLoadedListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnMapLoadedListener,\n      NativeObserver::removeOnMapLoadedListener,\n      OnMapLoadedListener::onMapLoaded\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnRenderFrameFinishedListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnRenderFrameFinishedListener,\n      NativeObserver::removeOnRenderFrameFinishedListener,\n      OnRenderFrameFinishedListener::onRenderFrameFinished\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnRenderFrameStartedListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnRenderFrameStartedListener,\n      NativeObserver::removeOnRenderFrameStartedListener,\n      OnRenderFrameStartedListener::onRenderFrameStarted\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnSourceAddedListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnSourceAddedListener,\n      NativeObserver::removeOnSourceAddedListener,\n      OnSourceAddedListener::onSourceAdded\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnSourceDataLoadedListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnSourceDataLoadedListener,\n      NativeObserver::removeOnSourceDataLoadedListener,\n      OnSourceDataLoadedListener::onSourceDataLoaded\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnSourceRemovedListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnSourceRemovedListener,\n      NativeObserver::removeOnSourceRemovedListener,\n      OnSourceRemovedListener::onSourceRemoved\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnStyleImageMissingListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnStyleImageMissingListener,\n      NativeObserver::removeOnStyleImageMissingListener,\n      OnStyleImageMissingListener::onStyleImageMissing\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnStyleImageUnusedListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnStyleImageUnusedListener,\n      NativeObserver::removeOnStyleImageUnusedListener,\n      OnStyleImageUnusedListener::onStyleImageUnused\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnStyleLoadedListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnStyleLoadedListener,\n      NativeObserver::removeOnStyleLoadedListener,\n      OnStyleLoadedListener::onStyleLoaded,\n      NativeObserver::_resubscribableSet\n    )\n  }\n\n  @Test\n  fun addAndRemoveOnStyleDataLoadedListener() {\n    addAndRemoveListener(\n      NativeObserver::addOnStyleDataLoadedListener,\n      NativeObserver::removeOnStyleDataLoadedListener,\n      OnStyleDataLoadedListener::onStyleDataLoaded,\n      NativeObserver::_resubscribableSet\n    )\n  }\n\n  /**\n   * @param L the listener type (e.g. [OnRenderFrameStartedListener])\n   * @param D the listener data type (e.g. [RenderFrameStartedEventData])\n   */\n  private inline fun <reified L, reified D> addAndRemoveListener(\n    addListener: NativeObserver.(L) -> Unit,\n    removeListener: NativeObserver.(L) -> Unit,\n    crossinline listenerOn: L.(D) -> Unit,\n    cancelableSet: NativeObserver.() -> MutableSet<*> = NativeObserver::_cancelableSet,\n  ) {\n    val listener: L = mockk(relaxUnitFun = true)\n    nativeObserver.addListener(listener)\n    assertEquals(1, nativeObserver.cancelableSet().size)\n\n    val listener2: L = mockk(relaxUnitFun = true)\n    nativeObserver.addListener(listener2)\n    assertEquals(2, nativeObserver.cancelableSet().size)\n\n    nativeObserver.removeListener(listener)\n    assertEquals(1, nativeObserver.cancelableSet().size)\n\n    nativeObserver.removeListener(listener2)\n    assertEquals(0, nativeObserver.cancelableSet().size)\n\n    verifyNo { listener.listenerOn(any()) }\n    verifyNo { listener2.listenerOn(any()) }\n  }\n\n  // Test for subscribe methods.\n  @Test\n  fun subscribeCameraChange() {\n    subscribe(NativeObserver::subscribeCameraChanged, NativeMapImpl::subscribe)\n  }\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  @Test\n  fun subscribeCameraChangeCoalesced() {\n    subscribe(NativeObserver::subscribeCameraChangedCoalesced, NativeMapImpl::subscribe)\n  }\n\n  @Test\n  fun subscribeMapIdleListener() {\n    subscribe(NativeObserver::subscribeMapIdle, NativeMapImpl::subscribe)\n  }\n\n  @Test\n  fun subscribeMapLoadErrorListener() {\n    subscribe(NativeObserver::subscribeMapLoadingError, NativeMapImpl::subscribe)\n  }\n\n  @Test\n  fun subscribeMapLoadedListener() {\n    subscribe(NativeObserver::subscribeMapLoaded, NativeMapImpl::subscribe)\n  }\n\n  // Render frame events\n  @Test\n  fun subscribeRenderFrameFinishedListener() {\n    subscribe(NativeObserver::subscribeRenderFrameFinished, NativeMapImpl::subscribe)\n  }\n\n  @Test\n  fun subscribeRenderFrameStartedListener() {\n    subscribe(NativeObserver::subscribeRenderFrameStarted, NativeMapImpl::subscribe)\n  }\n\n  // Source events\n  @Test\n  fun subscribeSourceAddedListener() {\n    subscribe(NativeObserver::subscribeSourceAdded, NativeMapImpl::subscribe)\n  }\n\n  @Test\n  fun subscribeSourceDataLoadedListener() {\n    subscribe(NativeObserver::subscribeSourceDataLoaded, NativeMapImpl::subscribe)\n  }\n\n  @Test\n  fun subscribeSourceRemovedListener() {\n    subscribe(NativeObserver::subscribeSourceRemoved, NativeMapImpl::subscribe)\n  }\n\n  @Test\n  fun subscribeResourceRequest() {\n    subscribe(NativeObserver::subscribeResourceRequest, NativeMapImpl::subscribe)\n  }\n\n  // Style events\n  @Test\n  fun subscribeStyleLoadedListener() {\n    subscribe(NativeObserver::subscribeStyleLoaded, NativeMapImpl::subscribe, NativeObserver::_resubscribableSet)\n  }\n\n  @Test\n  fun subscribeStyleDataLoaded() {\n    subscribe(NativeObserver::subscribeStyleDataLoaded, NativeMapImpl::subscribe, NativeObserver::_resubscribableSet)\n  }\n\n  @Test\n  fun subscribeStyleImageMissingListener() {\n    subscribe(NativeObserver::subscribeStyleImageMissing, NativeMapImpl::subscribe)\n  }\n\n  @Test\n  fun subscribeStyleImageRemoveUnusedListener() {\n    subscribe(NativeObserver::subscribeStyleImageRemoveUnused, NativeMapImpl::subscribe)\n  }\n\n  private inline fun <reified C> subscribe(\n    subscribe: NativeObserver.(C) -> Cancelable,\n    crossinline nativeSubscribe: NativeMapImpl.(C) -> Cancelable,\n    cancelableSet: NativeObserver.() -> MutableSet<*> = NativeObserver::_cancelableSet,\n  ) {\n    val callback: C = mockk()\n    val cancelable = nativeObserver.subscribe(callback)\n    verify { observableInterface.nativeSubscribe(callback) }\n    assertEquals(1, nativeObserver.cancelableSet().size)\n    assertSame(cancelable, nativeObserver.cancelableSet().first())\n\n    val callback2: C = mockk()\n    val cancelable2 = nativeObserver.subscribe(callback2)\n    verify { observableInterface.nativeSubscribe(callback2) }\n    assertEquals(2, nativeObserver.cancelableSet().size)\n    assertTrue(nativeObserver.cancelableSet().containsAll(listOf(cancelable, cancelable2)))\n\n    cancelable.cancel()\n    assertEquals(1, nativeObserver.cancelableSet().size)\n    assertSame(cancelable2, nativeObserver.cancelableSet().first())\n\n    cancelable2.cancel()\n    assertTrue(nativeObserver.cancelableSet().isEmpty())\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun subscribeGenericEvent() {\n    val event1 = \"Event1\"\n    val event2 = \"Event2\"\n    val callback = mockk<GenericEventCallback>(relaxUnitFun = true)\n    val cancelable = nativeObserver.subscribeGenericEvent(event1, callback)\n    verify { observableInterface.subscribe(event1, callback) }\n    assertEquals(1, nativeObserver._cancelableSet.size)\n    assertSame(cancelable, nativeObserver._cancelableSet.first())\n\n    val callback2 = mockk<GenericEventCallback>(relaxUnitFun = true)\n    val cancelable2 = nativeObserver.subscribeGenericEvent(event2, callback2)\n    verify { observableInterface.subscribe(event2, callback2) }\n    assertEquals(2, nativeObserver._cancelableSet.size)\n    assertTrue(nativeObserver._cancelableSet.containsAll(listOf(cancelable, cancelable2)))\n\n    cancelable.cancel()\n    assertEquals(1, nativeObserver._cancelableSet.size)\n    assertSame(cancelable2, nativeObserver._cancelableSet.first())\n\n    cancelable2.cancel()\n    assertTrue(nativeObserver._cancelableSet.isEmpty())\n  }\n\n  @Test\n  fun clearListeners() {\n    val onCancel: () -> Unit = mockk(relaxed = true)\n    nativeObserver.subscribeCameraChanged(mockk(relaxed = true), onCancel)\n    nativeObserver.subscribeStyleDataLoaded(mockk(relaxed = true), onCancel)\n    nativeObserver.subscribeStyleLoaded(mockk(relaxed = true), onCancel)\n    assertEquals(1, nativeObserver._cancelableSet.size)\n    assertEquals(2, nativeObserver._resubscribableSet.size)\n\n    nativeObserver.onDestroy()\n    assertTrue(nativeObserver._cancelableSet.isEmpty())\n    assertTrue(nativeObserver._resubscribableSet.isEmpty())\n\n    verify(exactly = 3) { onCancel.invoke() }\n  }\n\n  @Test\n  fun resubscribesStyleLoadedEvents() {\n    val listener1 = mockk<StyleLoadedCallback>()\n    val listener2 = mockk<StyleDataLoadedCallback>()\n    assertEquals(0, nativeObserver._cancelableSet.size)\n    assertEquals(0, nativeObserver._resubscribableSet.size)\n    nativeObserver.subscribeStyleLoaded(listener1)\n    assertEquals(1, nativeObserver._resubscribableSet.size)\n    nativeObserver.subscribeStyleDataLoaded(listener2)\n    assertEquals(2, nativeObserver._resubscribableSet.size)\n\n    nativeObserver.resubscribeStyleLoadListeners()\n    assertEquals(0, nativeObserver._cancelableSet.size)\n    assertEquals(2, nativeObserver._resubscribableSet.size)\n\n    verify(exactly = 2) {\n      observableInterface.subscribe(listener1)\n      observableInterface.subscribe(listener2)\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/SafeSystemCallTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.verifyOnce\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockkStatic\nimport io.mockk.unmockkStatic\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.test.TestCoroutineScheduler\nimport kotlinx.coroutines.test.UnconfinedTestDispatcher\nimport kotlinx.coroutines.test.resetMain\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.coroutines.test.setMain\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@RunWith(RobolectricTestRunner::class)\nclass SafeSystemCallTest {\n\n  private val testScheduler = TestCoroutineScheduler()\n  private val testDispatcher = UnconfinedTestDispatcher(testScheduler)\n  private val mainTestDispatcher = UnconfinedTestDispatcher(testScheduler, \"MainTestDispatcher\")\n\n  @Before\n  fun setUp() {\n    Dispatchers.setMain(mainTestDispatcher)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    every { logW(any(), any()) } just Runs\n    every { logE(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    Dispatchers.resetMain()\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  // Core functionality tests that should run quickly\n\n  @Test\n  fun `safeSystemCall should return operation result when successful`() = runTest {\n    val expected = 42\n    val result = safeSystemCall(\n      fallback = 0,\n      logTag = \"Test\",\n      dispatcher = testDispatcher\n    ) {\n      expected\n    }\n    assertEquals(expected, result)\n  }\n\n  @Test\n  fun `safeSystemCall should return fallback when operation throws exception`() = runTest {\n    val fallback = 100\n    val result = safeSystemCall(\n      fallback = fallback,\n      logTag = \"Test\",\n      dispatcher = testDispatcher\n    ) {\n      throw RuntimeException(\"Test exception\")\n    }\n    assertEquals(fallback, result)\n    verifyOnce { logE(\"Test\", \"System call failed: Test exception, using fallback\") }\n  }\n\n  @Test\n  fun `safeSystemCall should return fallback when operation times out`() = runTest {\n    val fallback = 200\n    val result = safeSystemCall(\n      timeoutMs = 10L,\n      fallback = fallback,\n      logTag = \"Test\",\n      dispatcher = testDispatcher\n    ) {\n      delay(100) // Simulate slow operation with coroutine delay\n      42\n    }\n    assertEquals(fallback, result)\n    verifyOnce { logW(\"Test\", \"System call timed out after 10ms, using fallback\") }\n  }\n\n  @Test\n  fun `safeSystemCall should use default log tag when not specified`() = runTest {\n    safeSystemCall(\n      fallback = 0,\n      dispatcher = testDispatcher\n    ) {\n      throw RuntimeException(\"Test exception\")\n    }\n    verifyOnce { logE(\"SystemCall\", \"System call failed: Test exception, using fallback\") }\n  }\n\n  @Test\n  fun `safeSystemCall should handle null values properly`() = runTest {\n    val result = safeSystemCall(\n      fallback = null,\n      logTag = \"Test\",\n      dispatcher = testDispatcher\n    ) {\n      null\n    }\n    assertEquals(null, result)\n  }\n\n  @Test\n  fun `safeSystemCall should handle string values properly`() = runTest {\n    val expected = \"test_result\"\n    val result = safeSystemCall(\n      fallback = \"fallback\",\n      logTag = \"Test\",\n      dispatcher = testDispatcher\n    ) {\n      expected\n    }\n    assertEquals(expected, result)\n  }\n\n  @Test\n  fun `safeSystemCallWithCallback should execute callback with result on success`() = runTest {\n    val expected = 42\n    var callbackResult = -1\n    safeSystemCallWithCallback(\n      fallback = 0,\n      logTag = \"Test\",\n      dispatcher = testDispatcher,\n      mainDispatcher = mainTestDispatcher,\n      operation = { expected }\n    ) { result ->\n      callbackResult = result\n    }\n    assertEquals(expected, callbackResult)\n  }\n\n  @Test\n  fun `safeSystemCallWithCallback should execute callback with fallback on exception`() = runTest {\n    val fallback = 100\n    var callbackResult = -1\n    safeSystemCallWithCallback(\n      fallback = fallback,\n      logTag = \"Test\",\n      dispatcher = testDispatcher,\n      mainDispatcher = mainTestDispatcher,\n      operation = { throw RuntimeException(\"Test exception\") }\n    ) { result ->\n      callbackResult = result\n    }\n    assertEquals(fallback, callbackResult)\n    verifyOnce { logE(\"Test\", \"System call failed: Test exception, using fallback\") }\n  }\n\n  @Test\n  fun `safeSystemCallWithCallback should execute callback with fallback on timeout`() = runTest {\n    val fallback = 200\n    var callbackResult = -1\n    safeSystemCallWithCallback(\n      timeoutMs = 10L,\n      fallback = fallback,\n      logTag = \"Test\",\n      dispatcher = testDispatcher,\n      mainDispatcher = mainTestDispatcher,\n      operation = {\n        delay(100) // Simulate slow operation with coroutine delay\n        42\n      }\n    ) { result ->\n      callbackResult = result\n    }\n    assertEquals(fallback, callbackResult)\n    verifyOnce { logW(\"Test\", \"System call timed out after 10ms, using fallback\") }\n  }\n\n  @Test\n  fun `safeSystemCallWithCallback should handle null values properly`() = runTest {\n    var callbackResult: String? = \"initial\"\n    safeSystemCallWithCallback(\n      fallback = null,\n      logTag = \"Test\",\n      dispatcher = testDispatcher,\n      mainDispatcher = mainTestDispatcher,\n      operation = { null }\n    ) { result ->\n      callbackResult = result\n    }\n    assertEquals(null, callbackResult)\n  }\n\n  @Test\n  fun `safeSystemCallWithCallback should handle string values properly`() = runTest {\n    val expected = \"test_result\"\n    var callbackResult = \"initial\"\n    safeSystemCallWithCallback(\n      fallback = \"fallback\",\n      logTag = \"Test\",\n      dispatcher = testDispatcher,\n      mainDispatcher = mainTestDispatcher,\n      operation = { expected }\n    ) { result ->\n      callbackResult = result\n    }\n    assertEquals(expected, callbackResult)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/ShadowCameraManager.java",
    "content": "package com.mapbox.maps;\n\n\nimport org.robolectric.annotation.*;\n\n@Implements(CameraManager.class)\npublic class ShadowCameraManager {\n\n}\n"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/ShadowMap.java",
    "content": "package com.mapbox.maps;\n\nimport org.robolectric.annotation.Implements;\n\n@Implements(Map.class)\npublic class ShadowMap {\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/ShadowMapRecorder.java",
    "content": "package com.mapbox.maps;\n\nimport org.robolectric.annotation.Implements;\n\n@Implements(MapRecorder.class)\npublic class ShadowMapRecorder {\n}\n"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/ShadowMapSnapshotter.java",
    "content": "package com.mapbox.maps;\n\nimport androidx.annotation.*;\n\nimport com.mapbox.maps.*;\n\nimport org.robolectric.annotation.*;\n\n@Implements(MapSnapshotter.class)\npublic class ShadowMapSnapshotter {\n\n    @Implementation\n    public void setStyleJson(){\n\n    }\n\n    @Implementation\n    public void setCamera(@NonNull CameraOptions cameraOptions){\n\n    }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/ShadowStyleManager.java",
    "content": "package com.mapbox.maps;\n\n\nimport org.robolectric.annotation.*;\n\n@Implements(StyleManager.class)\npublic class ShadowStyleManager {\n\n}\n"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/ShadowTracing.kt",
    "content": "package com.mapbox.maps\n\nimport org.robolectric.annotation.Implements\n\n@Implements(Tracing::class)\nclass ShadowTracing {\n\n  companion object {\n    fun setTracingBackendType(type: TracingBackendType) {\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/SnapshotterTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.maps.shadows.ShadowObservable\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\nimport java.lang.IllegalStateException\n\n@RunWith(RobolectricTestRunner::class)\n@Config(\n  shadows = [\n    ShadowMap::class,\n    ShadowMapSnapshotter::class,\n    ShadowObservable::class,\n    ShadowCameraManager::class,\n    ShadowStyleManager::class,\n  ]\n)\nclass SnapshotterTest {\n\n  private lateinit var snapshotter: Snapshotter\n  private lateinit var coreSnapshotter: MapSnapshotter\n  private val mapSnapshotOptions = mockk<MapSnapshotOptions>(relaxed = true)\n\n  @Before\n  fun setUp() {\n    mockkStatic(Map::class)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    coreSnapshotter = mockk(relaxed = true)\n    snapshotter = Snapshotter(\n      mockk(relaxed = true),\n      mapSnapshotOptions,\n      mockk(relaxed = true),\n      coreSnapshotter\n    )\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(Map::class)\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun getStyleURI() {\n    snapshotter.setStyleUri(\"foo\")\n    verify { coreSnapshotter.styleURI = \"foo\" }\n  }\n\n  @Test\n  fun setStyleURI() {\n    snapshotter.getStyleUri()\n    verify { coreSnapshotter.styleURI }\n  }\n\n  @Test\n  fun getStyleJSON() {\n    snapshotter.getStyleJson()\n    verify { coreSnapshotter.styleJSON }\n  }\n\n  @Test\n  fun setStyleJSON() {\n    snapshotter.setStyleJson(\"foo\")\n    verify { coreSnapshotter.styleJSON = \"foo\" }\n  }\n\n  @Test\n  fun setSize() {\n    val size = Size(4.0f, 3.0f)\n    snapshotter.setSize(size)\n    verify { coreSnapshotter.size = size }\n  }\n\n  @Test\n  fun getSize() {\n    snapshotter.getSize()\n    verify { coreSnapshotter.size }\n  }\n\n  @Test\n  fun setCamera() {\n    val options = CameraOptions.Builder().build()\n    snapshotter.setCamera(options)\n    verify { coreSnapshotter.setCamera(options) }\n  }\n\n  @Test\n  fun getCameraState() {\n    snapshotter.getCameraState()\n    verify { coreSnapshotter.cameraState }\n  }\n\n  @Test\n  fun coordinateBoundsForCamera() {\n    val camera = mockk<CameraOptions>()\n    snapshotter.coordinateBoundsForCamera(camera)\n    verify { coreSnapshotter.coordinateBoundsForCamera(any()) }\n  }\n\n  @Test\n  fun start() {\n    every { coreSnapshotter.styleJSON } returns \"foobar\"\n    snapshotter.start(mockk(), mockk())\n    verify { coreSnapshotter.start(any()) }\n  }\n\n  @Test(expected = IllegalStateException::class)\n  fun startWithException() {\n    every { coreSnapshotter.styleJSON } returns \"\"\n    snapshotter.start(mockk(), mockk())\n    verify { coreSnapshotter.start(any()) }\n  }\n\n  @Test\n  fun tileCover() {\n    val tileCoverOptions = TileCoverOptions.Builder().build()\n    val cameraOptions = CameraOptions.Builder().build()\n    snapshotter.tileCover(tileCoverOptions, cameraOptions)\n    verify { coreSnapshotter.tileCover(tileCoverOptions, cameraOptions) }\n  }\n  @Test\n  fun cancel() {\n    snapshotter.cancel()\n    verify { coreSnapshotter.cancel() }\n  }\n\n  @Test\n  fun destroy() {\n    snapshotter.destroy()\n    verify { coreSnapshotter.cancel() }\n    Assert.assertNull(snapshotter.snapshotStyleCallback)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/StyleObserverTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.verifyNo\nimport com.mapbox.verifyOnce\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertThrows\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport java.util.Date\n\n@RunWith(RobolectricTestRunner::class)\nclass StyleObserverTest {\n\n  private lateinit var mainStyleLoadedListener: Style.OnStyleLoaded\n  private lateinit var styleObserver: StyleObserver\n  private lateinit var nativeObserver: NativeObserver\n  private val cancelable = mockk<Cancelable>(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    nativeObserver = mockk(relaxUnitFun = true)\n    every { nativeObserver.subscribeStyleLoaded(any()) } returns cancelable\n    every { nativeObserver.subscribeStyleDataLoaded(any()) } returns cancelable\n    every { nativeObserver.subscribeMapLoadingError(any()) } returns cancelable\n    every { cancelable.cancel() } just Runs\n    every { logE(any(), any()) } just Runs\n    mainStyleLoadedListener = mockk(relaxed = true)\n    styleObserver = StyleObserver(\n      styleManager = mockk(relaxUnitFun = true),\n      styleLoadedListener = mainStyleLoadedListener,\n      nativeObserver = nativeObserver,\n      pixelRatio = 1.0f,\n      mockk()\n    )\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  /**\n   * Verifies if the correct listeners are attached to NativeMapObserver when StyleObserver is created\n   */\n  @Test\n  fun onStyleObserverCreate() {\n    StyleObserver(mockk(), mockk(relaxed = true), nativeObserver, 1.0f, mockk())\n    verify { nativeObserver.subscribeStyleLoaded(any()) }\n    verify { nativeObserver.subscribeMapLoadingError(any()) }\n    verify { nativeObserver.subscribeStyleDataLoaded(any()) }\n  }\n\n  /**\n   * Verifies if the correct listeners are detached to NativeMapObserver when StyleObserver is destroyed\n   */\n  @Test\n  fun onStyleObserverDestroy() {\n    val styleObserver = StyleObserver(mockk(), mockk(relaxed = true), nativeObserver, 1.0f, mockk())\n    styleObserver.onDestroy()\n    assertTrue(styleObserver.cancelableList.isEmpty())\n  }\n\n  /**\n   * Verifies if the user provided OnStyleLoaded is called when style loading finishes.\n   * Additionally verify we don't apply transition options if they were not specified.\n   */\n  @Test\n  fun onStyleLoadSuccess() {\n    val styleLoaded = mockk<Style.OnStyleLoaded>(relaxed = true)\n    styleObserver.setLoadStyleListener(styleLoaded, mockk(relaxed = true), null, null)\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    ) // needed to initialize style internally\n    styleObserver.run(mockk<StyleLoaded>())\n    verify { styleLoaded.onStyleLoaded(any()) }\n    verify { mainStyleLoadedListener.onStyleLoaded(any()) }\n  }\n\n  /**\n   * Verifies if the multiple user provided OnStyleLoaded are called when style loading finishes\n   */\n  @Test\n  fun onStyleLoadSuccessMulti() {\n    val userLoadStyleListener = mockk<Style.OnStyleLoaded>(relaxed = true)\n    styleObserver.setLoadStyleListener(\n      userLoadStyleListener,\n      mockk(relaxed = true),\n      null,\n      null,\n    )\n    val getStyleListener = mockk<Style.OnStyleLoaded>(relaxed = true)\n    styleObserver.addGetStyleListener(getStyleListener)\n    val getStyleListener2 = mockk<Style.OnStyleLoaded>(relaxed = true)\n    styleObserver.addGetStyleListener(getStyleListener2)\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    ) // needed to initialize style internally\n    styleObserver.run(mockk<StyleLoaded>())\n    verify { userLoadStyleListener.onStyleLoaded(any()) }\n    verify { getStyleListener.onStyleLoaded(any()) }\n    verify { getStyleListener2.onStyleLoaded(any()) }\n  }\n\n  /**\n   * Verifies that loadStyle callback is overwritten with the consecutive call\n   */\n  @Test\n  fun onStyleLoadedOverwritten() {\n    val styleLoadedFail = mockk<Style.OnStyleLoaded>(relaxed = true)\n    styleObserver.setLoadStyleListener(styleLoadedFail, mockk(relaxed = true), null, null)\n    val styleLoadedSuccess = mockk<Style.OnStyleLoaded>(relaxed = true)\n    styleObserver.setLoadStyleListener(styleLoadedSuccess, mockk(relaxed = true), null, null)\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    ) // needed to initialize style internally\n    styleObserver.run(mockk<StyleLoaded>())\n    verifyNo { styleLoadedFail.onStyleLoaded(any()) }\n    verify { styleLoadedSuccess.onStyleLoaded(any()) }\n  }\n\n  @Test\n  fun onStyleDataLoadedNotifiesMapboxMap() {\n    val styleCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSpritesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSourcesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleUserCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    styleObserver.setLoadStyleListener(\n      styleUserCallback,\n      styleCallback,\n      styleSpritesCallback,\n      styleSourcesCallback,\n    )\n\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n\n    verify { styleCallback.onStyleLoaded(any()) }\n    verifyNo { styleSpritesCallback.onStyleLoaded(any()) }\n    verifyNo { styleSourcesCallback.onStyleLoaded(any()) }\n\n    verifyNo { styleSpritesCallback.onStyleLoaded(any()) }\n    verifyNo { mainStyleLoadedListener.onStyleLoaded(any()) }\n  }\n\n  @Test\n  fun onStyleDataSpritesLoadedNotifiesMapboxMap() {\n    val styleCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSpritesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSourcesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleUserCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    styleObserver.setLoadStyleListener(\n      styleUserCallback,\n      styleCallback,\n      styleSpritesCallback,\n      styleSourcesCallback,\n    )\n\n    // STYLE event arrives first and initializes Style object internally\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n\n    verify { styleCallback.onStyleLoaded(any()) }\n    verifyNo { styleSpritesCallback.onStyleLoaded(any()) }\n\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SPRITE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n\n    verify { styleSpritesCallback.onStyleLoaded(any()) }\n    verifyNo { styleSourcesCallback.onStyleLoaded(any()) }\n\n    verifyNo { styleUserCallback.onStyleLoaded(any()) }\n    verifyNo { mainStyleLoadedListener.onStyleLoaded(any()) }\n  }\n\n  @Test\n  fun onStyleDataSourcesLoadedNotifiesMapboxMap() {\n    val styleCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSpritesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSourcesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleUserCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    styleObserver.setLoadStyleListener(\n      styleUserCallback,\n      styleCallback,\n      styleSpritesCallback,\n      styleSourcesCallback,\n    )\n\n    // STYLE event arrives first and initializes Style object internally\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n\n    verifyNo { styleSourcesCallback.onStyleLoaded(any()) }\n\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SOURCES,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n\n    verify { styleSourcesCallback.onStyleLoaded(any()) }\n    verify { styleCallback.onStyleLoaded(any()) }\n    verifyNo { styleSpritesCallback.onStyleLoaded(any()) }\n\n    verifyNo { styleSpritesCallback.onStyleLoaded(any()) }\n    verifyNo { mainStyleLoadedListener.onStyleLoaded(any()) }\n  }\n\n  @Test\n  fun onStyleDataOverwritten() {\n    val styleNotCalled = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val spritesNotCalled = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val sourcesNotCalled = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    val styleCalled = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val spritesCalled = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val sourcesCalled = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    styleObserver.setLoadStyleListener(\n      null,\n      styleNotCalled,\n      spritesNotCalled,\n      sourcesNotCalled,\n    )\n    styleObserver.setLoadStyleListener(null, styleCalled, spritesCalled, sourcesCalled)\n\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SOURCES,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SPRITE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n    verifyNo { styleNotCalled.onStyleLoaded(any()) }\n    verifyNo { spritesNotCalled.onStyleLoaded(any()) }\n    verifyNo { sourcesNotCalled.onStyleLoaded(any()) }\n\n    verify { styleCalled.onStyleLoaded(any()) }\n    verify { spritesCalled.onStyleLoaded(any()) }\n    verify { sourcesCalled.onStyleLoaded(any()) }\n  }\n\n  @Test\n  fun onStyleLoadedThrowsIfNoStyleData() {\n    val styleCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSpritesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSourcesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    styleObserver.setLoadStyleListener(\n      null,\n      styleCallback,\n      styleSpritesCallback,\n      styleSourcesCallback,\n    )\n\n    assertThrows(MapboxMapException::class.java) {\n      styleObserver.run(mockk<StyleLoaded>())\n    }\n  }\n\n  @Test\n  fun onStyleLoadedCallsSpritesListenerIfNoStyleDataSpritesLoaded() {\n    val styleCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSpritesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    styleObserver.setLoadStyleListener(\n      null,\n      styleCallback,\n      styleSpritesCallback,\n      null,\n    )\n\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SOURCES,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n\n    verifyNo { styleSpritesCallback.onStyleLoaded(any()) }\n\n    styleObserver.run(mockk<StyleLoaded>())\n\n    verify { styleSpritesCallback.onStyleLoaded(any()) }\n  }\n\n  @Test\n  fun onStyleLoadedCallsSourcesListenerIfNoStyleDataSourcesLoaded() {\n    val styleCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSourcesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    styleObserver.setLoadStyleListener(\n      null,\n      styleCallback,\n      null,\n      styleSourcesCallback,\n    )\n\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SPRITE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n\n    verifyNo { styleSourcesCallback.onStyleLoaded(any()) }\n\n    styleObserver.run(mockk<StyleLoaded>())\n\n    verify { styleSourcesCallback.onStyleLoaded(any()) }\n  }\n\n  @Test\n  fun `StyleDataType - Sources and Sprites events are ignored until StyleDataType - Style is not received on style change`() {\n    val styleCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSourcesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n    val styleSpritesCallback = mockk<Style.OnStyleLoaded>(relaxed = true)\n\n    styleObserver.setLoadStyleListener(\n      null,\n      styleCallback,\n      styleSpritesCallback,\n      styleSourcesCallback,\n    )\n\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SOURCES,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SPRITE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n\n    verifyNo { styleSourcesCallback.onStyleLoaded(any()) }\n    verifyNo { styleSpritesCallback.onStyleLoaded(any()) }\n\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.STYLE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SOURCES,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n    styleObserver.run(\n      StyleDataLoaded(\n        StyleDataLoadedType.SPRITE,\n        EventTimeInterval(\n          Date(0), Date(0)\n        )\n      )\n    )\n\n    verifyOnce { styleCallback.onStyleLoaded(any()) }\n    verifyOnce { styleSourcesCallback.onStyleLoaded(any()) }\n    verifyOnce { styleSpritesCallback.onStyleLoaded(any()) }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/StyleTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.graphics.Bitmap\nimport com.mapbox.bindgen.DataRef\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.verifyOnce\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.slot\nimport io.mockk.spyk\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@Config(\n  shadows = [\n    ShadowStyleManager::class,\n  ]\n)\n@RunWith(RobolectricTestRunner::class)\nclass StyleTest {\n\n  private lateinit var style: Style\n  private val styleManager: StyleManager = mockk(relaxed = true)\n\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    style = Style(styleManager, 1.0f, mapLoadingErrorDelegate = { })\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun isValid() {\n    assertTrue(style.isValid())\n    style.markInvalid()\n    assertFalse(style.isValid())\n  }\n\n  @Test\n  fun addImage() {\n    val image: Image = mockk()\n    style.addImage(\"foobar\", image)\n    verify {\n      styleManager.addStyleImage(\n        \"foobar\",\n        1.0f,\n        image,\n        false,\n        mutableListOf(),\n        mutableListOf(),\n        null\n      )\n    }\n  }\n\n  @Test\n  fun addImageSdf() {\n    val image: Image = mockk()\n    style.addImage(\"foobar\", image, true)\n    verify {\n      styleManager.addStyleImage(\n        \"foobar\",\n        1.0f,\n        image,\n        true,\n        mutableListOf(),\n        mutableListOf(),\n        null\n      )\n    }\n  }\n\n  @Test\n  fun addImageFull() {\n    val image: Image = mockk()\n    val stretchesLeft = listOf(ImageStretches(1.0f, 2.0f))\n    val stretchesRight = listOf(ImageStretches(3.0f, 4.0f))\n    val imageContent = ImageContent(1.0f, 2.0f, 3.0f, 4.0f)\n    style.addStyleImage(\"foobar\", 2.0f, image, true, stretchesLeft, stretchesRight, imageContent)\n    verify {\n      styleManager.addStyleImage(\n        \"foobar\",\n        2.0f,\n        image,\n        true,\n        stretchesLeft,\n        stretchesRight,\n        imageContent\n      )\n    }\n  }\n\n  @Test\n  fun removeImage() {\n    style.removeStyleImage(\"id\")\n    verify { styleManager.removeStyleImage(\"id\") }\n  }\n\n  @Test\n  fun hasImage() {\n    style.hasStyleImage(\"id\")\n    verify { styleManager.hasStyleImage(\"id\") }\n  }\n\n  @Test\n  fun addBitmap() {\n    val bitmapWidth = 1\n    val bitmapHeight = 2\n    val bitmap = spyk(Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888))\n    mockkStatic(DataRef::class)\n    val nativeDataRef = mockk<DataRef>(relaxed = true)\n    every { DataRef.allocateNative(any()) } returns nativeDataRef\n    style.addImage(\"foobar\", bitmap)\n    verify { bitmap.height }\n    verify { bitmap.width }\n    verify { bitmap.byteCount }\n    verify(exactly = 1) {\n      styleManager.addStyleImage(\n        \"foobar\",\n        1.0f,\n        Image(bitmapWidth, bitmapHeight, nativeDataRef),\n        false,\n        mutableListOf(),\n        mutableListOf(),\n        null\n      )\n    }\n    unmockkStatic(DataRef::class)\n  }\n\n  @Test\n  fun addBitmapSdf() {\n    val bitmapWidth = 1\n    val bitmapHeight = 2\n    val bitmap = spyk(Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888))\n    mockkStatic(DataRef::class)\n    val nativeDataRef = mockk<DataRef>(relaxed = true)\n    every { DataRef.allocateNative(any()) } returns nativeDataRef\n    style.addImage(\"foobar\", bitmap, true)\n    verify { bitmap.height }\n    verify { bitmap.width }\n    verify { bitmap.byteCount }\n    verify(exactly = 1) {\n      styleManager.addStyleImage(\n        \"foobar\",\n        1.0f,\n        Image(bitmapWidth, bitmapHeight, nativeDataRef),\n        true,\n        mutableListOf(),\n        mutableListOf(),\n        null\n      )\n    }\n    unmockkStatic(DataRef::class)\n  }\n\n  @Test\n  fun addLayer() {\n    val value = mockk<Value>()\n    val position = mockk<LayerPosition>()\n    style.addStyleLayer(value, position)\n    verify { styleManager.addStyleLayer(value, position) }\n  }\n\n  @Test\n  fun getLayers() {\n    style.styleLayers\n    verify { styleManager.styleLayers }\n  }\n\n  @Test\n  fun removeLayer() {\n    style.removeStyleLayer(\"id\")\n    verify { styleManager.removeStyleLayer(\"id\") }\n  }\n\n  @Test\n  fun layerExist() {\n    style.styleLayerExists(\"id\")\n    verify { styleManager.styleLayerExists(\"id\") }\n  }\n\n  @Test\n  fun setLayerProperty() {\n    val value = mockk<Value>()\n    style.setStyleLayerProperty(\"id\", \"foobar\", value)\n    verify { styleManager.setStyleLayerProperty(\"id\", \"foobar\", value) }\n  }\n\n  @Test\n  fun getLayerProperty() {\n    style.getStyleLayerProperty(\"id\", \"foobar\")\n    verify { styleManager.getStyleLayerProperty(\"id\", \"foobar\") }\n  }\n\n  @Test\n  fun setLayerProperties() {\n    val properties = mockk<Value>()\n    style.setStyleLayerProperties(\"id\", properties)\n    verify { styleManager.setStyleLayerProperties(\"id\", properties) }\n  }\n\n  @Test\n  fun getLayerProperties() {\n    style.getStyleLayerProperties(\"id\")\n    verify { styleManager.getStyleLayerProperties(\"id\") }\n  }\n\n  @Test\n  fun addSource() {\n    val properties = mockk<Value>()\n    style.addStyleSource(\"id\", properties)\n    verify { styleManager.addStyleSource(\"id\", properties) }\n  }\n\n  @Test\n  fun getSources() {\n    style.styleSources\n    verify { styleManager.styleSources }\n  }\n\n  @Test\n  fun removeSource() {\n    style.removeStyleSource(\"id\")\n    verify { style.removeStyleSource(\"id\") }\n  }\n\n  @Test\n  fun sourceExist() {\n    style.styleSourceExists(\"id\")\n    verify { styleManager.styleSourceExists(\"id\") }\n  }\n\n  @Test\n  fun setSourceProperties() {\n    val value = mockk<Value>()\n    style.setStyleSourceProperties(\"id\", value)\n    verify { styleManager.setStyleSourceProperties(\"id\", value) }\n  }\n\n  @Test\n  fun getSourceProperties() {\n    style.getStyleSourceProperties(\"id\")\n    verify { styleManager.getStyleSourceProperties(\"id\") }\n  }\n\n  @Test\n  fun setSourceProperty() {\n    val value = mockk<Value>()\n    style.setStyleSourceProperty(\"id\", \"foobar\", value)\n    verify { styleManager.setStyleSourceProperty(\"id\", \"foobar\", value) }\n  }\n\n  @Test\n  fun setSourcePropertyWithImportId() {\n    val value = mockk<Value>()\n    style.setStyleSourceProperty(\"importId\", \"id\", \"foobar\", value)\n    verify { styleManager.setStyleSourceProperty(\"importId\", \"id\", \"foobar\", value) }\n  }\n  @Test\n  fun getSourceProperty() {\n    style.getStyleSourceProperty(\"id\", \"foobar\")\n    verify { styleManager.getStyleSourceProperty(\"id\", \"foobar\") }\n  }\n\n  @Test\n  fun updateImageSourceImage() {\n    val image = mockk<Image>()\n    style.updateStyleImageSourceImage(\"id\", image)\n    verify { styleManager.updateStyleImageSourceImage(\"id\", image) }\n  }\n\n  @Test\n  fun addCustomLayer() {\n    val layerHost = mockk<CustomLayerHost>()\n    val layerPosition = mockk<LayerPosition>()\n    style.addStyleCustomLayer(\"id\", layerHost, layerPosition)\n  }\n\n  @Test\n  fun setCustomGeometrySourceTileData() {\n    val canonicalTileID = mockk<CanonicalTileID>()\n    val features = mockk<MutableList<Feature>>()\n    style.setStyleCustomGeometrySourceTileData(\"id\", canonicalTileID, features)\n  }\n\n  @Test\n  fun getStyleSlots() {\n    style.styleSlots\n    verify { styleManager.styleSlots }\n  }\n\n  @Test\n  fun addCustomGeometrySource() {\n    val options = mockk<CustomGeometrySourceOptions>()\n    style.addStyleCustomGeometrySource(\"id\", options)\n    verify { styleManager.addStyleCustomGeometrySource(\"id\", options) }\n  }\n\n  @Test\n  fun invalidateCustomGeometrySourceBounds() {\n    val bounds = mockk<CoordinateBounds>()\n    style.invalidateStyleCustomGeometrySourceRegion(\"id\", bounds)\n    verify { styleManager.invalidateStyleCustomGeometrySourceRegion(\"id\", bounds) }\n  }\n\n  @Test\n  fun invalidateCustomGeometrySourceId() {\n    val tileId = mockk<CanonicalTileID>()\n    style.invalidateStyleCustomGeometrySourceTile(\"id\", tileId)\n    verify { styleManager.invalidateStyleCustomGeometrySourceTile(\"id\", tileId) }\n  }\n\n  @Test\n  fun addPersistentStyleLayer() {\n    val value = mockk<Value>()\n    val position = mockk<LayerPosition>()\n    style.addPersistentStyleLayer(value, position)\n    verify { styleManager.addPersistentStyleLayer(value, position) }\n  }\n\n  @Test\n  fun addPersistentStyleCustomLayer() {\n    val layerHost = mockk<CustomLayerHost>()\n    val layerPosition = mockk<LayerPosition>()\n    style.addPersistentStyleCustomLayer(\"id\", layerHost, layerPosition)\n    verify { styleManager.addPersistentStyleCustomLayer(\"id\", layerHost, layerPosition) }\n  }\n\n  @Test\n  fun isStyleLayerPersistent() {\n    style.isStyleLayerPersistent(\"id\")\n    verify { styleManager.isStyleLayerPersistent(\"id\") }\n  }\n\n  @Test\n  fun getJson() {\n    style.styleJSON\n    verify { styleManager.styleJSON }\n  }\n\n  @Test\n  fun getUri() {\n    style.styleURI\n    verify { styleManager.styleURI }\n  }\n\n  @Test\n  fun setTransition() {\n    val transition = mockk<TransitionOptions>()\n    style.setStyleTransition(transition)\n    verify { styleManager.styleTransition = transition }\n  }\n\n  @Test\n  fun getTransition() {\n    style.getStyleTransition()\n    verify { styleManager.styleTransition }\n  }\n\n  @Test\n  fun getDefaultCamera() {\n    style.styleDefaultCamera\n    verify { styleManager.styleDefaultCamera }\n  }\n\n  @Test\n  fun getImage() {\n    style.getStyleImage(\"foobar\")\n    verify { styleManager.getStyleImage(\"foobar\") }\n  }\n\n  @Test\n  fun setLight() {\n    val value = mockk<Value>()\n    style.setStyleLights(value)\n    verify { styleManager.setStyleLights(value) }\n  }\n\n  @Test\n  fun getLight() {\n    style.getStyleLightProperty(\"id\", \"prop\")\n    verify { styleManager.getStyleLightProperty(\"id\", \"prop\") }\n  }\n\n  @Test\n  fun setLightProperty() {\n    val value = mockk<Value>()\n    style.setStyleLightProperty(\"id\", \"prop\", value)\n    verify { styleManager.setStyleLightProperty(\"id\", \"prop\", value) }\n  }\n\n  @Test\n  fun setStyleTerrain() {\n    val value = mockk<Value>()\n    style.setStyleTerrain(value)\n    verify { styleManager.setStyleTerrain(value) }\n  }\n\n  @Test\n  fun getStyleTerrainProperty() {\n    style.getStyleTerrainProperty(\"id\")\n    verify { styleManager.getStyleTerrainProperty(\"id\") }\n  }\n\n  @Test\n  fun setStyleTerrainProperty() {\n    val value = mockk<Value>()\n    style.setStyleTerrainProperty(\"id\", value)\n    verify { styleManager.setStyleTerrainProperty(\"id\", value) }\n  }\n\n  @Test\n  fun setStyleProjection() {\n    val value = mockk<Value>()\n    style.setStyleProjection(value)\n    verify { styleManager.setStyleProjection(value) }\n  }\n\n  @Test\n  fun getStyleProjectionProperty() {\n    style.getStyleProjectionProperty(\"foo\")\n    verify { styleManager.getStyleProjectionProperty(\"foo\") }\n  }\n\n  @Test\n  fun setStyleProjectionProperty() {\n    val value = mockk<Value>()\n    style.setStyleProjectionProperty(\"foo\", value)\n    verify { styleManager.setStyleProjectionProperty(\"foo\", value) }\n  }\n\n  @Test\n  fun addStyleModel() {\n    val modelId = \"modelId\"\n    val modelUri = \"modelUri\"\n    style.addStyleModel(modelId, modelUri)\n    verify { styleManager.addStyleModel(modelId, modelUri) }\n  }\n\n  @Test\n  fun removeStyleModel() {\n    val modelId = \"modelId\"\n    style.removeStyleModel(modelId)\n    verify { styleManager.removeStyleModel(modelId) }\n  }\n\n  @Test\n  fun hasStyleModel() {\n    val modelId = \"modelId\"\n    style.hasStyleModel(modelId)\n    verify { styleManager.hasStyleModel(modelId) }\n  }\n\n  @Test\n  fun setStyleAtmosphere() {\n    val atmosphereValue = mockk<Value>()\n    style.setStyleAtmosphere(atmosphereValue)\n    verify { styleManager.setStyleAtmosphere(atmosphereValue) }\n  }\n\n  @Test\n  fun setStyleAtmosphereProperty() {\n    val property = \"property\"\n    val atmosphereValueProperty = mockk<Value>()\n    style.setStyleAtmosphereProperty(property, atmosphereValueProperty)\n    verify { styleManager.setStyleAtmosphereProperty(property, atmosphereValueProperty) }\n  }\n\n  @Test\n  fun getStyleAtmosphereProperty() {\n    val property = \"property\"\n    style.getStyleAtmosphereProperty(property)\n    verify { styleManager.getStyleAtmosphereProperty(property) }\n  }\n\n  @Test\n  fun addGeoJSONSourceFeatures() {\n    val feature = mockk<Feature>()\n    style.addGeoJSONSourceFeatures(\"id\", \"dataId\", listOf(feature))\n    verify { styleManager.addGeoJSONSourceFeatures(\"id\", \"dataId\", listOf(feature)) }\n  }\n\n  @Test\n  fun updateGeoJSONSourceFeatures() {\n    val feature = mockk<Feature>()\n    style.updateGeoJSONSourceFeatures(\"id\", \"dataId\", listOf(feature))\n    verify { styleManager.updateGeoJSONSourceFeatures(\"id\", \"dataId\", listOf(feature)) }\n  }\n\n  @Test\n  fun removeGeoJSONSourceFeatures() {\n    val featureId = \"feature_id\"\n    style.removeGeoJSONSourceFeatures(\"id\", \"dataId\", listOf(featureId))\n    verify { styleManager.removeGeoJSONSourceFeatures(\"id\", \"dataId\", listOf(featureId)) }\n  }\n\n  @Test\n  fun getStyleImports() {\n    style.getStyleImports()\n    verify { styleManager.styleImports }\n  }\n\n  @Test\n  fun removeStyleImports() {\n    val importId = \"import-id\"\n    style.removeStyleImport(importId)\n    verify { styleManager.removeStyleImport(importId) }\n  }\n\n  @Test\n  fun getStyleImportSchema() {\n    val importId = \"import-id\"\n    style.getStyleImportSchema(importId)\n    verify { styleManager.getStyleImportSchema(importId) }\n  }\n\n  @Test\n  fun getStyleImportConfigProperties() {\n    val importId = \"import-id\"\n    style.getStyleImportConfigProperties(importId)\n    verify { styleManager.getStyleImportConfigProperties(importId) }\n  }\n\n  @Test\n  fun getStyleImportConfigProperty() {\n    val importId = \"import-id\"\n    val config = \"config\"\n    style.getStyleImportConfigProperty(importId, config)\n    verify { styleManager.getStyleImportConfigProperty(importId, config) }\n  }\n\n  @Test\n  fun setStyleImportConfigProperties() {\n    val importId = \"import-id\"\n    val config = hashMapOf(\n      \"key\" to Value.valueOf(\"value\")\n    )\n    style.setStyleImportConfigProperties(importId, config)\n    verify { styleManager.setStyleImportConfigProperties(importId, config) }\n  }\n\n  @Test\n  fun setStyleImportConfigProperty() {\n    val importId = \"import-id\"\n    val config = \"config\"\n    val value = Value.valueOf(\"value\")\n    style.setStyleImportConfigProperty(importId, config, value)\n    verify { styleManager.setStyleImportConfigProperty(importId, config, value) }\n  }\n\n  @Test\n  fun addStyleImportFromJSON() {\n    val importId = \"import-id\"\n    val json = \"{}\"\n    val configs = hashMapOf(\"test\" to Value(\"testvalue\"))\n    val importPosition = ImportPosition(null, \"below-layer\", null)\n    style.addStyleImportFromJSON(importId, json, configs, importPosition)\n    verify { styleManager.addStyleImportFromJSON(importId, json, configs, importPosition) }\n  }\n\n  @Test\n  fun addStyleImportFromURI() {\n    val importId = \"import-id\"\n    val uri = \"mapbox://standard\"\n    val configs = hashMapOf(\"test\" to Value(\"testvalue\"))\n    val importPosition = ImportPosition(null, \"below-layer\", null)\n    style.addStyleImportFromJSON(importId, uri, configs, importPosition)\n    verify { styleManager.addStyleImportFromJSON(importId, uri, configs, importPosition) }\n  }\n\n  @Test\n  fun updateStyleImportWithJSON() {\n    val importId = \"import-id\"\n    val json = \"{}\"\n    val configs = hashMapOf(\"test\" to Value(\"testvalue\"))\n    style.updateStyleImportWithJSON(importId, json, configs)\n    verify { styleManager.updateStyleImportWithJSON(importId, json, configs) }\n  }\n\n  @Test\n  fun updateStyleImportWithURI() {\n    val importId = \"import-id\"\n    val uri = \"mapbox://standard\"\n    val configs = hashMapOf(\"test\" to Value(\"testvalue\"))\n    style.updateStyleImportWithURI(importId, uri, configs)\n    verify { styleManager.updateStyleImportWithURI(importId, uri, configs) }\n  }\n\n  @Test\n  fun moveStyleImport() {\n    val importId = \"import-id\"\n    val importPosition = ImportPosition(null, \"below-layer\", null)\n    style.moveStyleImport(importId, importPosition)\n    verify { styleManager.moveStyleImport(importId, importPosition) }\n  }\n\n  @Test\n  fun addStyleCustomRasterSource() {\n    val sourceId = \"source-id\"\n    val options = mockk<CustomRasterSourceOptions>()\n    style.addStyleCustomRasterSource(sourceId, options)\n    verify { styleManager.addStyleCustomRasterSource(sourceId, options) }\n  }\n\n  @Test\n  fun setStyleCustomRasterSourceTileData() {\n    val sourceId = \"source-id\"\n    val tileData = listOf<CustomRasterSourceTileData>()\n    style.setStyleCustomRasterSourceTileData(sourceId, tileData)\n    verify { styleManager.setStyleCustomRasterSourceTileData(sourceId, tileData) }\n  }\n\n  @Test\n  fun getStyleGlyphURL() {\n    every { styleManager.styleGlyphURL } returns \"url\"\n    val url = style.getStyleGlyphURL()\n    verifyOnce { styleManager.styleGlyphURL }\n    assertEquals(\"url\", url)\n  }\n\n  @Test\n  fun setStyleGlyphURL() {\n    style.setStyleGlyphURL(\"url\")\n    verifyOnce { styleManager.styleGlyphURL = \"url\" }\n  }\n\n  @Test\n  fun getFeaturesets() {\n    val featuresets = mockk<List<FeaturesetDescriptor>>()\n    every { styleManager.styleFeaturesets } returns featuresets\n    val actualFeaturesets = style.getFeaturesets()\n    verifyOnce { styleManager.styleFeaturesets }\n    assertEquals(featuresets, actualFeaturesets)\n  }\n\n  @Test\n  fun setColorThemeTest() {\n    val image = mockk<Image>()\n    val colorTheme = ColorTheme.valueOf(image)\n    style.setStyleColorTheme(colorTheme)\n    verifyOnce { styleManager.setStyleColorTheme(colorTheme) }\n  }\n\n  @Test\n  fun setImageColorThemeTest() {\n    val image = mockk<Image>()\n    style.setStyleColorTheme(image)\n    val slot = slot<ColorTheme>()\n    verifyOnce { styleManager.setStyleColorTheme(capture(slot)) }\n    assertEquals(true, slot.captured.isImage)\n    assertEquals(false, slot.captured.isStylePropertyValue)\n    assertEquals(image, slot.captured.image)\n  }\n\n  @Test\n  fun setBitmapColorThemeTest() {\n    mockkStatic(DataRef::class)\n    val nativeDataRef = mockk<DataRef>(relaxed = true)\n    every { DataRef.allocateNative(any()) } returns nativeDataRef\n    val bitmap = Bitmap.createBitmap(1024, 32, Bitmap.Config.ARGB_8888)\n    style.setStyleColorTheme(bitmap)\n    val slot = slot<ColorTheme>()\n    verifyOnce { styleManager.setStyleColorTheme(capture(slot)) }\n    assertEquals(true, slot.captured.isImage)\n    assertEquals(false, slot.captured.isStylePropertyValue)\n    assertEquals(1024, slot.captured.image.width)\n    assertEquals(32, slot.captured.image.height)\n    assertEquals(nativeDataRef, slot.captured.image.data)\n  }\n\n  @Test\n  fun setBase64ColorThemeTest() {\n    val encodedTheme = \"base64\"\n    val slot = slot<ColorTheme>()\n    style.setStyleColorTheme(encodedTheme)\n    verifyOnce { styleManager.setStyleColorTheme(capture(slot)) }\n    assertEquals(false, slot.captured.isImage)\n    assertEquals(true, slot.captured.isStylePropertyValue)\n    assertEquals(Value.valueOf(encodedTheme), slot.captured.stylePropertyValue.value)\n  }\n\n  @Test\n  fun setImportColorThemeTest() {\n    val image = mockk<Image>()\n    val importId = \"import-id\"\n    style.setImportColorTheme(importId, image)\n    val slot = slot<ColorTheme>()\n    verifyOnce { styleManager.setImportColorTheme(importId, capture(slot)) }\n    assertEquals(image, slot.captured.image)\n  }\n\n  @Test\n  fun setImportImageColorThemeTest() {\n    val image = mockk<Image>()\n    val importId = \"import-id\"\n    style.setImportColorTheme(importId, image)\n    val slot = slot<ColorTheme>()\n    verifyOnce { styleManager.setImportColorTheme(importId, capture(slot)) }\n    assertEquals(image, slot.captured.image)\n  }\n\n  @Test\n  fun setImportBitmapColorThemeTest() {\n    mockkStatic(DataRef::class)\n    val nativeDataRef = mockk<DataRef>(relaxed = true)\n    every { DataRef.allocateNative(any()) } returns nativeDataRef\n    val bitmap = Bitmap.createBitmap(1024, 32, Bitmap.Config.ARGB_8888)\n    val importId = \"import-id\"\n    style.setImportColorTheme(importId, bitmap)\n    val slot = slot<ColorTheme>()\n    verifyOnce { styleManager.setImportColorTheme(importId, capture(slot)) }\n    assertEquals(1024, slot.captured.image.width)\n    assertEquals(32, slot.captured.image.height)\n    assertEquals(nativeDataRef, slot.captured.image.data)\n  }\n\n  @Test\n  fun setImportBase64ColorThemeTest() {\n    val importId = \"import-id\"\n    val encodedTheme = \"base64\"\n    style.setImportColorTheme(importId, encodedTheme)\n    val slot = slot<ColorTheme>()\n    verifyOnce { styleManager.setImportColorTheme(importId, capture(slot)) }\n    assertEquals(Value.valueOf(encodedTheme), slot.captured.stylePropertyValue.value)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/ViewAnnotationManagerAddTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.util.DisplayMetrics\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.View.*\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.asynclayoutinflater.view.AsyncLayoutInflater\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.renderer.MapboxRenderThread\nimport com.mapbox.maps.viewannotation.ViewAnnotationManagerImpl\nimport com.mapbox.maps.viewannotation.annotatedLayerFeature\nimport com.mapbox.maps.viewannotation.annotationAnchor\nimport com.mapbox.maps.viewannotation.geometry\nimport com.mapbox.maps.viewannotation.viewAnnotationOptions\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertThrows\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n@RunWith(Parameterized::class)\nclass ViewAnnotationManagerAddTest(\n  private val resIdActual: Int,\n  private val layoutParamsWidthActual: Int,\n  private val layoutParamsHeightActual: Int,\n  private val viewAnnotationOptionsActual: ViewAnnotationOptions,\n  private val viewAnnotationOptionsExpected: ViewAnnotationOptions,\n  private val runtimeExceptionThrown: Boolean,\n) {\n  private val mapboxMap: MapboxMap = mockk(relaxUnitFun = true)\n  private lateinit var viewAnnotationsLayout: FrameLayout\n  private lateinit var renderer: MapboxRenderThread\n\n  private lateinit var viewAnnotationManager: ViewAnnotationManagerImpl\n  private lateinit var expectedView: View\n  private lateinit var layoutParams: ViewGroup.LayoutParams\n\n  @Before\n  fun setUp() {\n    val mapView: MapView = mockk(relaxUnitFun = true)\n    mockkStatic(MeasureSpec::class)\n    every { MeasureSpec.makeMeasureSpec(any(), any()) } returns 0\n    every { mapView.mapboxMap } returns mapboxMap\n    every { mapView.layoutParams = any() } just Runs\n    every { mapView.context } returns mockk()\n    renderer = mockk(relaxUnitFun = true)\n    every { mapView.mapController.renderer.renderThread } returns renderer\n    layoutParams = ViewGroup.LayoutParams(0, 0)\n    layoutParams.width = layoutParamsWidthActual\n    layoutParams.height = layoutParamsHeightActual\n    expectedView = mockk(relaxed = true)\n    every { expectedView.layoutParams } returns layoutParams\n    every { expectedView.measuredWidth } returns layoutParamsWidthActual\n    every { expectedView.measuredHeight } returns layoutParamsHeightActual\n    every { expectedView.width } returns layoutParamsWidthActual\n    every { expectedView.height } returns layoutParamsHeightActual\n    every { expectedView.measure(any(), any()) } just Runs\n    every { expectedView.layout(any(), any(), any(), any()) } just Runs\n\n    every { mapboxMap.addViewAnnotation(any(), any()) } returns ExpectedFactory.createNone()\n    viewAnnotationsLayout = mockk()\n    every { viewAnnotationsLayout.layoutParams = any() } just Runs\n    every { viewAnnotationsLayout.addView(any()) } just Runs\n    every { viewAnnotationsLayout.removeView(any()) } just Runs\n    every { viewAnnotationsLayout.context } returns mockk()\n    val displayMetrics = DisplayMetrics().apply { density = 1f }\n    every { mapView.resources.displayMetrics } returns displayMetrics\n\n    mockkStatic(LayoutInflater::class)\n    every {\n      LayoutInflater.from(any()).inflate(resIdActual, viewAnnotationsLayout, false)\n    } returns expectedView\n\n    viewAnnotationManager = ViewAnnotationManagerImpl(mapView, viewAnnotationsLayout)\n  }\n\n  @After\n  fun tearDown() {\n    every { mapboxMap.removeViewAnnotation(any()) } returns ExpectedFactory.createNone()\n    viewAnnotationManager.destroy()\n    unmockkStatic(LayoutInflater::class)\n    unmockkStatic(MeasureSpec::class)\n  }\n\n  @Test\n  fun addViewAnnotationWithSyncResId() {\n    if (runtimeExceptionThrown) {\n      assertThrows(RuntimeException::class.java) {\n        viewAnnotationManager.addViewAnnotation(\n          resIdActual,\n          viewAnnotationOptionsActual\n        )\n      }\n    } else {\n      val actualView = viewAnnotationManager.addViewAnnotation(\n        resIdActual,\n        viewAnnotationOptionsActual\n      )\n      assertEquals(expectedView, actualView)\n      val optionsSlot = slot<ViewAnnotationOptions>()\n\n      verify(exactly = 1) {\n        mapboxMap.addViewAnnotation(\n          any(),\n          capture(optionsSlot)\n        )\n      }\n\n      assertViewAnnotationOptions(viewAnnotationOptionsExpected, optionsSlot.captured)\n    }\n  }\n\n  @Test\n  fun addViewAnnotationWithAsyncResId() {\n    val asyncInflater = mockk<AsyncLayoutInflater>()\n    val callback = slot<AsyncLayoutInflater.OnInflateFinishedListener>()\n    every { asyncInflater.inflate(resIdActual, viewAnnotationsLayout, capture(callback)) } answers {\n      callback.captured.onInflateFinished(expectedView, resIdActual, viewAnnotationsLayout)\n    }\n    if (runtimeExceptionThrown) {\n      assertThrows(RuntimeException::class.java) {\n        viewAnnotationManager.addViewAnnotation(\n          resIdActual,\n          viewAnnotationOptionsActual,\n          asyncInflater,\n        ) {}\n      }\n    } else {\n      viewAnnotationManager.addViewAnnotation(\n        resIdActual,\n        viewAnnotationOptionsActual,\n        asyncInflater,\n      ) {\n        assertEquals(expectedView, it)\n        val optionsSlot = slot<ViewAnnotationOptions>()\n        verify(exactly = 1) {\n          mapboxMap.addViewAnnotation(\n            any(),\n            capture(optionsSlot)\n          )\n        }\n        assertViewAnnotationOptions(viewAnnotationOptionsExpected, optionsSlot.captured)\n      }\n    }\n  }\n\n  @Test\n  fun addViewAnnotationWithView() {\n    val actualView = mockk<View>(relaxed = true)\n    every { actualView.layoutParams } returns layoutParams\n    every { actualView.width } returns layoutParamsWidthActual\n    every { actualView.height } returns layoutParamsHeightActual\n    every { actualView.measuredWidth } returns layoutParamsWidthActual\n    every { actualView.measuredHeight } returns layoutParamsHeightActual\n    if (runtimeExceptionThrown) {\n      assertThrows(RuntimeException::class.java) {\n        viewAnnotationManager.addViewAnnotation(\n          actualView,\n          viewAnnotationOptionsActual\n        )\n      }\n    } else {\n      viewAnnotationManager.addViewAnnotation(\n        actualView,\n        viewAnnotationOptionsActual\n      )\n      val optionsSlot = slot<ViewAnnotationOptions>()\n      verify(exactly = 1) {\n        mapboxMap.addViewAnnotation(\n          any(),\n          capture(optionsSlot)\n        )\n      }\n      assertViewAnnotationOptions(viewAnnotationOptionsExpected, optionsSlot.captured)\n    }\n  }\n\n  private fun assertViewAnnotationOptions(\n    viewAnnotationOptionsExpected: ViewAnnotationOptions,\n    capturedOptions: ViewAnnotationOptions\n  ) {\n    if (capturedOptions.annotatedFeature?.isGeometry == true) {\n      assertEquals(\n        viewAnnotationOptionsExpected.annotatedFeature!!.geometry,\n        capturedOptions.annotatedFeature!!.geometry,\n      )\n    } else {\n      assertEquals(\n        viewAnnotationOptionsExpected.annotatedFeature!!.annotatedLayerFeature,\n        capturedOptions.annotatedFeature!!.annotatedLayerFeature,\n      )\n    }\n    assertEquals(viewAnnotationOptionsExpected.height, capturedOptions.height)\n    assertEquals(viewAnnotationOptionsExpected.width, capturedOptions.width)\n    assertEquals(viewAnnotationOptionsExpected.visible, capturedOptions.visible)\n    assertEquals(viewAnnotationOptionsExpected.allowOverlap, capturedOptions.allowOverlap)\n    assertEquals(viewAnnotationOptionsExpected.selected, capturedOptions.selected)\n    assertEquals(viewAnnotationOptionsExpected.variableAnchors, capturedOptions.variableAnchors)\n  }\n\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters\n    fun data() = listOf(\n      arrayOf(\n        /* resIdActual */ 1,\n        /* layoutParamsWidthActual */ 20,\n        /* layoutParamsHeightActual */ 30,\n        /* viewAnnotationOptionsActual */\n        viewAnnotationOptions {\n          geometry(Point.fromLngLat(0.0, 0.0))\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n        },\n        /* viewAnnotationOptionsExpected */\n        viewAnnotationOptions {\n          geometry(Point.fromLngLat(0.0, 0.0))\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n          // width and height are calculated based on layout params\n          width(20.0)\n          height(30.0)\n        },\n        /* runtimeExceptionThrown */ false,\n      ),\n      arrayOf(\n        /* resIdActual */ 1,\n        /* layoutParamsWidthActual */ 20,\n        /* layoutParamsHeightActual */ 30,\n        /* viewAnnotationOptionsActual */\n        viewAnnotationOptions {\n          geometry(Point.fromLngLat(0.0, 0.0))\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n          width(40.0)\n        },\n        /* viewAnnotationOptionsExpected */\n        viewAnnotationOptions {\n          geometry(Point.fromLngLat(0.0, 0.0))\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n          width(40.0)\n          height(30.0)\n        },\n        /* runtimeExceptionThrown */ false,\n      ),\n      arrayOf(\n        /* resIdActual */ 1,\n        /* layoutParamsWidthActual */ 20,\n        /* layoutParamsHeightActual */ 30,\n        /* viewAnnotationOptionsActual */\n        viewAnnotationOptions {\n          geometry(Point.fromLngLat(0.0, 0.0))\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n          height(40.0)\n        },\n        /* viewAnnotationOptionsExpected */\n        viewAnnotationOptions {\n          geometry(Point.fromLngLat(0.0, 0.0))\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n          width(20.0)\n          height(40.0)\n        },\n        /* runtimeExceptionThrown */ false,\n      ),\n      arrayOf(\n        /* resIdActual */ 1,\n        /* layoutParamsWidthActual */ 20,\n        /* layoutParamsHeightActual */ 30,\n        /* viewAnnotationOptionsActual */\n        viewAnnotationOptions {\n          geometry(Point.fromLngLat(0.0, 0.0))\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n          width(50.0)\n          height(40.0)\n        },\n        /* viewAnnotationOptionsExpected */\n        viewAnnotationOptions {\n          geometry(Point.fromLngLat(0.0, 0.0))\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n          width(50.0)\n          height(40.0)\n        },\n        /* runtimeExceptionThrown */ false,\n      ),\n      arrayOf(\n        /* resIdActual */ 1,\n        /* layoutParamsWidthActual */ 20,\n        /* layoutParamsHeightActual */ 30,\n        /* viewAnnotationOptionsActual */\n        viewAnnotationOptions {\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n          width(50.0)\n          height(40.0)\n        },\n        /* viewAnnotationOptionsExpected */\n        viewAnnotationOptions {\n          annotatedLayerFeature(\"layer\") {\n            featureId(\"feature\")\n          }\n          annotationAnchor {\n            anchor(ViewAnnotationAnchor.CENTER)\n            offsetX(10.0)\n          }\n          width(50.0)\n          height(40.0)\n        },\n        /* runtimeExceptionThrown */ true,\n      ),\n    )\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/ViewAnnotationManagerTest.kt",
    "content": "package com.mapbox.maps\n\nimport android.util.DisplayMetrics\nimport android.view.View\nimport android.view.View.MeasureSpec\nimport android.view.ViewTreeObserver\nimport android.widget.FrameLayout\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.extension.style.layers.properties.generated.ProjectionName\nimport com.mapbox.maps.renderer.MapboxRenderThread\nimport com.mapbox.maps.shadows.ShadowCoordinateBounds\nimport com.mapbox.maps.viewannotation.*\nimport com.mapbox.verifyOnce\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowCoordinateBounds::class])\nclass ViewAnnotationManagerTest {\n  private val mapboxMap: MapboxMap = mockk(relaxUnitFun = true)\n  private val mapView: MapView = mockk(relaxUnitFun = true)\n\n  private lateinit var viewAnnotationManager: ViewAnnotationManagerImpl\n  private lateinit var frameLayoutParams: FrameLayout.LayoutParams\n  private lateinit var view: View\n  private lateinit var viewAnnotationsLayout: FrameLayout\n  private lateinit var renderer: MapboxRenderThread\n  private lateinit var viewTreeObserver: ViewTreeObserver\n  private val style: Style = mockk(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    mockkStatic(MeasureSpec::class)\n    every { mapView.mapboxMap } returns mapboxMap\n    every { mapView.layoutParams = any() } just Runs\n    every { mapView.context } returns mockk()\n    renderer = mockk(relaxUnitFun = true)\n    viewTreeObserver = mockk(relaxed = true)\n    every { mapView.mapController.renderer.renderThread } returns renderer\n    frameLayoutParams = FrameLayout.LayoutParams(0, 0)\n    frameLayoutParams.width = DEFAULT_WIDTH.toInt()\n    frameLayoutParams.height = DEFAULT_HEIGHT.toInt()\n    view = mockView()\n    viewAnnotationsLayout = mockk()\n    every { viewAnnotationsLayout.layoutParams = any() } just Runs\n    every { viewAnnotationsLayout.removeView(any()) } just Runs\n    every { mapboxMap.addViewAnnotation(any(), any()) } returns ExpectedFactory.createNone()\n    val displayMetrics = DisplayMetrics().apply { density = 1f }\n    every { mapView.resources.displayMetrics } returns displayMetrics\n    viewAnnotationManager = ViewAnnotationManagerImpl(mapView, viewAnnotationsLayout)\n    every { mapboxMap.style } returns style\n    every { style.getStyleProjectionProperty(\"name\") } returns\n      StylePropertyValue(Value(ProjectionName.MERCATOR.value), StylePropertyValueKind.CONSTANT)\n  }\n\n  private fun mockView(): View = mockk<View>().also {\n    every { it.layoutParams } returns frameLayoutParams\n    every { it.measuredWidth } returns 10\n    every { it.measuredHeight } returns 10\n    every { it.measure(any(), any()) } just Runs\n    every { it.layout(any(), any(), any(), any()) } just Runs\n    every { it.visibility } returns View.VISIBLE\n    every { it.viewTreeObserver } returns viewTreeObserver\n    every { it.addOnAttachStateChangeListener(any()) } just Runs\n    every { it.removeOnAttachStateChangeListener(any()) } just Runs\n    every { it.getTag(any()) } returns null\n  }\n\n  @After\n  fun tearDown() {\n    every { mapboxMap.removeViewAnnotation(any()) } returns ExpectedFactory.createNone()\n    viewAnnotationManager.destroy()\n    unmockkStatic(MeasureSpec::class)\n  }\n\n  @Test\n  fun addViewAnnotationWithDuplicateView() {\n    viewAnnotationManager.addViewAnnotation(\n      view,\n      viewAnnotationOptions {\n        geometry(DEFAULT_GEOMETRY)\n      }\n    )\n    assertThrows(RuntimeException::class.java) {\n      viewAnnotationManager.addViewAnnotation(\n        view,\n        viewAnnotationOptions {\n          geometry(DEFAULT_GEOMETRY)\n        }\n      )\n    }\n  }\n\n  @Test\n  fun updateViewAnnotationSuccess() {\n    every { mapboxMap.updateViewAnnotation(any(), any()) } returns ExpectedFactory.createNone()\n    val updatedOptions = viewAnnotationOptions {\n      annotationAnchor {\n        anchor(ViewAnnotationAnchor.CENTER)\n        offsetX(10.0)\n      }\n    }\n\n    val idSlot = slot<String>()\n    every {\n      mapboxMap.addViewAnnotation(\n        capture(idSlot), any()\n      )\n    } returns ExpectedFactory.createNone()\n\n    viewAnnotationManager.addViewAnnotation(\n      view,\n      viewAnnotationOptions {\n        geometry(DEFAULT_GEOMETRY)\n      }\n    )\n\n    val updateActualResult = viewAnnotationManager.updateViewAnnotation(view, updatedOptions)\n    assertEquals(true, updateActualResult)\n    verify(exactly = 1) { mapboxMap.updateViewAnnotation(idSlot.captured, updatedOptions) }\n  }\n\n  @Test\n  fun updateViewAnnotationFailure() {\n    every { mapboxMap.updateViewAnnotation(any(), any()) } returns ExpectedFactory.createNone()\n    val updatedOptions = viewAnnotationOptions {\n      annotationAnchor {\n        anchor(ViewAnnotationAnchor.CENTER)\n        offsetX(10.0)\n      }\n    }\n    val updateActualResult = viewAnnotationManager.updateViewAnnotation(mockk(), updatedOptions)\n    assertEquals(false, updateActualResult)\n    verify(exactly = 0) { mapboxMap.updateViewAnnotation(any(), updatedOptions) }\n  }\n\n  @Test\n  fun removeViewAnnotationSuccess() {\n    every { mapboxMap.removeViewAnnotation(any()) } returns ExpectedFactory.createNone()\n    val idSlot = slot<String>()\n    every {\n      mapboxMap.addViewAnnotation(\n        capture(idSlot), any()\n      )\n    } returns ExpectedFactory.createNone()\n\n    viewAnnotationManager.addViewAnnotation(\n      view,\n      viewAnnotationOptions {\n        geometry(DEFAULT_GEOMETRY)\n      }\n    )\n    val removeActualResult = viewAnnotationManager.removeViewAnnotation(view)\n    assertEquals(true, removeActualResult)\n    verify(exactly = 1) { view.removeOnAttachStateChangeListener(any()) }\n    verify(exactly = 1) { mapboxMap.removeViewAnnotation(idSlot.captured) }\n    verify(exactly = 1) { viewAnnotationsLayout.removeView(view) }\n    verify(exactly = 1) { viewTreeObserver.removeOnDrawListener(any()) }\n    verify(exactly = 1) { viewTreeObserver.removeOnGlobalLayoutListener(any()) }\n  }\n\n  @Test\n  fun removeViewAnnotationFailure() {\n    every { mapboxMap.removeViewAnnotation(any()) } returns ExpectedFactory.createNone()\n    val removeActualResult = viewAnnotationManager.removeViewAnnotation(mockk())\n    assertEquals(false, removeActualResult)\n    verify(exactly = 0) { mapboxMap.removeViewAnnotation(any()) }\n  }\n\n  @Test\n  fun removeAllViewAnnotations() {\n    every { mapboxMap.removeViewAnnotation(any()) } returns ExpectedFactory.createNone()\n    // add first view\n    viewAnnotationManager.addViewAnnotation(\n      view,\n      viewAnnotationOptions {\n        geometry(DEFAULT_GEOMETRY)\n      }\n    )\n    val anotherView = mockView()\n    // add another view\n    viewAnnotationManager.addViewAnnotation(\n      anotherView,\n      viewAnnotationOptions {\n        geometry(Point.fromLngLat(90.0, 90.0))\n      }\n    )\n    viewAnnotationManager.removeAllViewAnnotations()\n    verify(exactly = 2) { mapboxMap.removeViewAnnotation(any()) }\n    verify(exactly = 1) { viewAnnotationsLayout.removeView(view) }\n    verify(exactly = 1) { viewAnnotationsLayout.removeView(anotherView) }\n  }\n\n  @Test\n  fun getViewAnnotationByFeatureIdSuccess() {\n    val idSlot = slot<String>()\n    every {\n      mapboxMap.addViewAnnotation(\n        capture(idSlot), any()\n      )\n    } returns ExpectedFactory.createNone()\n    val viewAnnotationOptions = viewAnnotationOptions {\n      annotatedLayerFeature(LAYER_ID) {\n        featureId(FEATURE_ID)\n      }\n    }\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    every { mapboxMap.getViewAnnotationOptions(idSlot.captured) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n    assertEquals(\n      view,\n      viewAnnotationManager.getViewAnnotation(\n        AnnotatedLayerFeature.Builder().featureId(FEATURE_ID).layerId(LAYER_ID).build()\n      )\n    )\n  }\n\n  @Test\n  fun getViewAnnotationByFeatureIdFailureNoFeatureId() {\n    val viewAnnotationOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n    }\n    val idSlot = slot<String>()\n    every {\n      mapboxMap.addViewAnnotation(\n        capture(idSlot), any()\n      )\n    } returns ExpectedFactory.createNone()\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    every { mapboxMap.getViewAnnotationOptions(idSlot.captured) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n    assertNull(\n      viewAnnotationManager.getViewAnnotationOptions(\n        AnnotatedLayerFeature.Builder().featureId(FEATURE_ID).layerId(LAYER_ID).build()\n      )\n    )\n  }\n\n  @Test\n  fun getViewAnnotationByFeatureIdFailureNoView() {\n    assertNull(\n      viewAnnotationManager.getViewAnnotationOptions(\n        AnnotatedLayerFeature.Builder().featureId(FEATURE_ID).layerId(LAYER_ID).build()\n      )\n    )\n  }\n\n  @Test\n  fun getViewAnnotationOptionsByFeatureIdSuccess() {\n    val viewAnnotationOptions = viewAnnotationOptions {\n      annotatedLayerFeature(LAYER_ID) {\n        featureId(FEATURE_ID)\n      }\n    }\n    val idSlot = slot<String>()\n    every {\n      mapboxMap.addViewAnnotation(\n        capture(idSlot), any()\n      )\n    } returns ExpectedFactory.createNone()\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    every { mapboxMap.getViewAnnotationOptions(idSlot.captured) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n    assertEquals(\n      viewAnnotationOptions,\n      viewAnnotationManager.getViewAnnotationOptions(\n        AnnotatedLayerFeature.Builder().featureId(FEATURE_ID).layerId(LAYER_ID).build()\n      )\n    )\n  }\n\n  @Test\n  fun getViewAnnotationOptionsByFeatureIdFailureNoFeatureId() {\n    val viewAnnotationOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n    }\n    val idSlot = slot<String>()\n    every {\n      mapboxMap.addViewAnnotation(\n        capture(idSlot), any()\n      )\n    } returns ExpectedFactory.createNone()\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    every { mapboxMap.getViewAnnotationOptions(idSlot.captured) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n    assertNull(\n      viewAnnotationManager.getViewAnnotationOptions(\n        AnnotatedLayerFeature.Builder().featureId(FEATURE_ID).layerId(LAYER_ID).build()\n      )\n    )\n  }\n\n  @Test\n  fun getViewAnnotationOptionsByFeatureIdFailureNoView() {\n    assertNull(\n      viewAnnotationManager.getViewAnnotationOptions(\n        AnnotatedLayerFeature.Builder().featureId(FEATURE_ID).layerId(LAYER_ID).build()\n      )\n    )\n  }\n\n  @Test\n  fun getViewAnnotationOptionsByViewSuccess() {\n    val viewAnnotationOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n    }\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    every { mapboxMap.getViewAnnotationOptions(any()) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n    assertEquals(viewAnnotationOptions, viewAnnotationManager.getViewAnnotationOptions(view))\n  }\n\n  @Test\n  fun getViewAnnotationOptionsByViewNoViewFailure() {\n    assertNull(viewAnnotationManager.getViewAnnotationOptions(view))\n  }\n\n  @Test\n  fun addViewPositioningListener() {\n    val listener = mockk<OnViewAnnotationUpdatedListener>()\n    viewAnnotationManager.addOnViewAnnotationUpdatedListener(listener)\n    assert(viewAnnotationManager.viewUpdatedListenerSet.contains(listener))\n  }\n\n  @Test\n  fun removeViewPositioningListener() {\n    val listener = mockk<OnViewAnnotationUpdatedListener>()\n    viewAnnotationManager.addOnViewAnnotationUpdatedListener(listener)\n    viewAnnotationManager.removeOnViewAnnotationUpdatedListener(listener)\n    assert(viewAnnotationManager.viewUpdatedListenerSet.isEmpty())\n  }\n\n  @Test\n  fun setViewAnnotationUpdateMode() {\n    viewAnnotationManager.setViewAnnotationUpdateMode(ViewAnnotationUpdateMode.MAP_FIXED_DELAY)\n    verify(exactly = 1) { renderer.viewAnnotationMode = ViewAnnotationUpdateMode.MAP_FIXED_DELAY }\n  }\n\n  @Test\n  fun getViewAnnotationUpdateMode() {\n    every { renderer.viewAnnotationMode } returns ViewAnnotationManager.DEFAULT_UPDATE_MODE\n    assertEquals(\n      ViewAnnotationManager.DEFAULT_UPDATE_MODE,\n      viewAnnotationManager.getViewAnnotationUpdateMode()\n    )\n    every { renderer.viewAnnotationMode } returns ViewAnnotationUpdateMode.MAP_FIXED_DELAY\n    assertEquals(\n      ViewAnnotationUpdateMode.MAP_FIXED_DELAY,\n      viewAnnotationManager.getViewAnnotationUpdateMode()\n    )\n  }\n\n  @Test\n  fun getViewAnnotationsSize() {\n    val viewAnnotationOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n    }\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    val anotherView = mockView()\n    viewAnnotationManager.addViewAnnotation(\n      anotherView,\n      viewAnnotationOptions {\n        geometry(Point.fromLngLat(90.0, 90.0))\n      }\n    )\n    every { mapboxMap.getViewAnnotationOptions(any()) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n    every { anotherView.removeOnAttachStateChangeListener(any()) } just Runs\n    assertEquals(2, viewAnnotationManager.annotations.size)\n  }\n\n  @Test\n  fun getViewAnnotationOptionsFromAnnotationsMap() {\n    val viewAnnotationOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n      width(DEFAULT_WIDTH)\n      height(DEFAULT_HEIGHT)\n    }\n    every { mapboxMap.getViewAnnotationOptions(any()) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    assertEquals(viewAnnotationOptions, viewAnnotationManager.annotations[view])\n  }\n\n  @Test\n  fun getViewAnnotationsAfterRemoveAnnotation() {\n    every { mapboxMap.removeViewAnnotation(any()) } returns ExpectedFactory.createNone()\n    val viewAnnotationOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n    }\n    every { mapboxMap.getViewAnnotationOptions(any()) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    assertEquals(1, viewAnnotationManager.annotations.size)\n    viewAnnotationManager.removeViewAnnotation(view)\n    assert(viewAnnotationManager.annotations.isEmpty())\n  }\n\n  @Test\n  fun getViewAnnotationsAfterRemoveAllAnnotations() {\n    every { mapboxMap.removeViewAnnotation(any()) } returns ExpectedFactory.createNone()\n    every { view.removeOnAttachStateChangeListener(any()) } just Runs\n    viewAnnotationManager.addViewAnnotation(\n      view,\n      viewAnnotationOptions {\n        geometry(DEFAULT_GEOMETRY)\n      }\n    )\n    viewAnnotationManager.removeAllViewAnnotations()\n    assert(viewAnnotationManager.annotations.isEmpty())\n  }\n\n  @Test\n  fun validateUpdateOptionsFromAnnotationsMap() {\n    every { mapboxMap.updateViewAnnotation(any(), any()) } returns ExpectedFactory.createNone()\n    val expectedOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n      annotationAnchor {\n        anchor(ViewAnnotationAnchor.CENTER)\n        offsetX(10.0)\n      }\n    }\n    every { mapboxMap.getViewAnnotationOptions(any()) } returns ExpectedFactory.createValue(\n      expectedOptions\n    )\n    viewAnnotationManager.addViewAnnotation(\n      view,\n      viewAnnotationOptions {\n        geometry(DEFAULT_GEOMETRY)\n      }\n    )\n    // check annotations size\n    assertEquals(1, viewAnnotationManager.annotations.size)\n    // update annotation options\n    val result = viewAnnotationManager.updateViewAnnotation(view, expectedOptions)\n    assertTrue(result)\n\n    // validate annotation options from annotations map\n    val actualOptions = viewAnnotationManager.annotations[view]\n    assertEquals(expectedOptions, actualOptions)\n\n    // validate annotation size after update options\n    assertEquals(1, viewAnnotationManager.annotations.size)\n  }\n\n  @Test\n  fun validateViewAnnotationSizeAfterAddingDuplicateView() {\n    val viewAnnotationOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n    }\n    every { mapboxMap.getViewAnnotationOptions(any()) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    assertEquals(1, viewAnnotationManager.annotations.size)\n\n    assertThrows(RuntimeException::class.java) {\n      viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    }\n    assertEquals(1, viewAnnotationManager.annotations.size)\n  }\n\n  @Test\n  fun testCameraForAnnotationsWithEmptyViews() {\n    val annotations = listOf<View>()\n    assertNull(viewAnnotationManager.cameraForAnnotations(annotations))\n  }\n\n  @Test\n  fun testCameraForAnnotationsWithValidViews() {\n    val annotations = mutableListOf<View>()\n    val viewAnnotationOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n    }\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    annotations.add(view)\n    every { mapboxMap.getViewAnnotationOptions(any()) } returns ExpectedFactory.createValue(\n      viewAnnotationOptions\n    )\n\n    val point = Point.fromJson(DEFAULT_GEOMETRY.toJson())\n    val zoom = 1.0\n    val expectedCameraOptions = CameraOptions.Builder().center(point).zoom(zoom).build()\n    every {\n      mapboxMap.cameraForCoordinates(\n        any(),\n        any(),\n        any(),\n        any(),\n        any()\n      )\n    } answers { expectedCameraOptions }\n    val coordinateBounds = mockk<CoordinateBounds>(relaxUnitFun = true)\n    every { coordinateBounds.north() } returns 20.0\n    every { coordinateBounds.east() } returns 20.0\n    every { coordinateBounds.west() } returns 10.0\n    every { coordinateBounds.south() } returns 10.0\n\n    every { mapboxMap.coordinateBoundsForCamera(any()) } returns coordinateBounds\n    every { mapboxMap.getMetersPerPixelAtLatitude(any(), any()) } returns 1.0\n    every { mapboxMap.projectedMetersForCoordinate(any()) } returns ProjectedMeters(1.0, 1.0)\n    every { mapboxMap.coordinateForProjectedMeters(any()) } returns Point.fromLngLat(0.0, 0.0)\n    every { mapboxMap.cameraForCoordinateBounds(any(), any()) } returns expectedCameraOptions\n\n    val cameraOptionsActual = viewAnnotationManager.cameraForAnnotations(annotations)\n    assertNotNull(cameraOptionsActual)\n    assertEquals(expectedCameraOptions, cameraOptionsActual!!)\n  }\n\n  @Test\n  fun testCameraForAnnotationsWithInvisibleViews() {\n    val annotations = mutableListOf<View>()\n    val viewAnnotationOptions = viewAnnotationOptions {\n      geometry(DEFAULT_GEOMETRY)\n    }\n    every { view.visibility } returns View.INVISIBLE\n    viewAnnotationManager.addViewAnnotation(view, viewAnnotationOptions)\n    annotations.add(view)\n\n    assertNull(viewAnnotationManager.cameraForAnnotations(annotations))\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun testViewAnnotationAvoidLayers() {\n    val layerIds = hashSetOf(\"layer-1\", \"layer-2\")\n    every { mapboxMap.setViewAnnotationAvoidLayers(any()) } returns ExpectedFactory.createNone()\n    every { mapboxMap.getViewAnnotationAvoidLayers() } returns layerIds\n    viewAnnotationManager.viewAnnotationAvoidLayers = layerIds\n    verifyOnce { mapboxMap.setViewAnnotationAvoidLayers(layerIds) }\n    assertEquals(layerIds, viewAnnotationManager.viewAnnotationAvoidLayers)\n    verifyOnce { mapboxMap.getViewAnnotationAvoidLayers() }\n  }\n\n  private companion object {\n    private const val LAYER_ID = \"layerId\"\n    private const val FEATURE_ID = \"featureId\"\n    private val DEFAULT_GEOMETRY: Geometry = Point.fromLngLat(0.0, 0.0)\n    private const val DEFAULT_WIDTH = 20.0\n    private const val DEFAULT_HEIGHT = 20.0\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/ViewAnnotationManagerZOrderingTest.kt",
    "content": " package com.mapbox.maps\n\n import com.mapbox.geojson.Point\nimport com.mapbox.maps.viewannotation.ViewAnnotationManagerImpl\nimport io.mockk.*\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n @RunWith(Parameterized::class)\n internal class ViewAnnotationManagerZOrderingTest(\n  private val oldDescriptors: List<DelegatingViewAnnotationPositionDescriptor>,\n  private val newDescriptors: List<DelegatingViewAnnotationPositionDescriptor>,\n  private val shouldChangeZOrder: Boolean,\n ) {\n\n  @Test\n  fun calculatesCorrectZOrder() {\n    assertEquals(\n      shouldChangeZOrder,\n      ViewAnnotationManagerImpl.needToReorderZ(\n        oldDescriptors, newDescriptors\n      ),\n    )\n  }\n\n  companion object {\n    private fun descriptors(vararg identifiers: String) = identifiers.map {\n      DelegatingViewAnnotationPositionDescriptor(\n        it,\n        0.0,\n        0.0,\n        // different identifiers should have different screen coordinates\n        ScreenCoordinate(\n          (identifiers.hashCode() % 500).toDouble(),\n          (identifiers.hashCode() % 300).toDouble()\n        ),\n        anchorCoordinate = Point.fromLngLat(0.0, 0.0),\n        anchorConfig = ViewAnnotationAnchorConfig.Builder().anchor(ViewAnnotationAnchor.CENTER).build(),\n      )\n    }\n\n    @JvmStatic\n    @Parameterized.Parameters\n    fun data() = listOf(\n      arrayOf(\n        /* old descriptors */\n        descriptors(),\n        /* new descriptors */\n        descriptors(),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\"1\"),\n        /* new descriptors */\n        descriptors(\"1\"),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\"1\", \"2\", \"3\"),\n        /* new descriptors */\n        descriptors(\"1\", \"2\", \"3\"),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n        ),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"2\",\n          \"4\",\n        ),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"4\",\n        ),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n        ),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"3\",\n          \"2\",\n        ),\n        /* change z order */\n        true,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n        ),\n        /* new descriptors */\n        listOf<String>(),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"3\",\n          \"2\",\n        ),\n        /* change z order */\n        true,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"3\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n        ),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"2\",\n          \"3\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n        ),\n        /* change z order */\n        true,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"3\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n        ),\n        /* change z order */\n        true,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"7\",\n          \"8\",\n          \"9\",\n        ),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"7\",\n          \"8\",\n          \"9\",\n        ),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"5\",\n          \"7\",\n          \"8\",\n          \"9\",\n        ),\n        /* change z order */\n        false,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"5\",\n          \"3\",\n          \"8\",\n          \"9\",\n        ),\n        /* change z order */\n        true,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"5\",\n          \"8\",\n          \"3\",\n          \"9\",\n        ),\n        /* change z order */\n        true,\n      ),\n      arrayOf(\n        /* old descriptors */\n        descriptors(\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\",\n        ),\n        /* new descriptors */\n        descriptors(\n          \"1\",\n          \"3\",\n          \"5\",\n          \"8\",\n          \"9\",\n        ),\n        /* change z order */\n        false,\n      ),\n    )\n  }\n }"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/attribution/AttributionParseTest.java",
    "content": "package com.mapbox.maps.attribution;\n\nimport com.mapbox.maps.plugin.attribution.Attribution;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.RobolectricTestRunner;\nimport org.robolectric.RuntimeEnvironment;\n\nimport java.util.Set;\n\nimport static junit.framework.Assert.assertEquals;\n\n@RunWith(RobolectricTestRunner.class)\npublic class AttributionParseTest {\n\n  private static final String STREETS_ATTRIBUTION = \"<a href=\\\"https://www.mapbox.com/about/maps/\\\" target=\\\"_blank\\\">&copy; Mapbox</a> <a href=\\\"http://www.openstreetmap.org/about/\\\" target=\\\"_blank\\\">&copy; OpenStreetMap</a> <a class=\\\"mapbox-improve-map\\\" href=\\\"https://apps.mapbox.com/feedback/\\\" target=\\\"_blank\\\">Improve this map</a>\\n\";\n  private static final String SATELLITE_ATTRIBUTION = \"<a href=\\\"https://www.mapbox.com/about/maps/\\\" target=\\\"_blank\\\">&copy; Mapbox</a> <a href=\\\"http://www.openstreetmap.org/about/\\\" target=\\\"_blank\\\">&copy; OpenStreetMap</a> <a class=\\\"mapbox-improve-map\\\" href=\\\"https://apps.mapbox.com/feedback/\\\" target=\\\"_blank\\\">Improve this map</a> <a href=\\\"https://www.digitalglobe.com/\\\" target=\\\"_blank\\\">&copy; DigitalGlobe</a>\\n\";\n  private static final String CUSTOM_ATTRIBUTION = \"&copy; Custom Contributors\";\n  private static final String CUSTOM_ATTRIBUTION_OPENSTREET = \"OpenStreetMap CC-BY-SA\";\n\n  @Test\n  public void testParseAttributionStringSatellite() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(SATELLITE_ATTRIBUTION)\n      .withMapboxPrivacyPolicy(false)\n      .build();\n\n    Set<Attribution> attributionList = attributionParser.getAttributions();\n    assertEquals(\"Size of list should match\", 5, attributionList.size());\n\n    int counter = 0;\n    for (Attribution attribution : attributionList) {\n      switch (counter) {\n        case 0:\n          assertEquals(\"URL mapbox should match\", \"https://www.mapbox.com/about/maps/\", attribution.getUrl());\n          assertEquals(\"Title mapbox should match\", \"© Mapbox\", attribution.getTitle());\n          break;\n        case 1:\n          assertEquals(\"URL openstreetmap should match\", \"http://www.openstreetmap.org/about/\", attribution.getUrl());\n          assertEquals(\"Title openstreetmap should match\", \"© OpenStreetMap\", attribution.getTitle());\n          break;\n        case 2:\n          assertEquals(\"URL improve map should match\", \"https://apps.mapbox.com/feedback/\", attribution.getUrl());\n          assertEquals(\"Title improve map should match\", \"Improve This Map\", attribution.getTitle());\n          break;\n        case 3:\n          assertEquals(\"URL digital globe should match\", \"https://www.digitalglobe.com/\", attribution.getUrl());\n          assertEquals(\"Title digital globe should match\", \"© DigitalGlobe\", attribution.getTitle());\n          break;\n      }\n      counter++;\n    }\n  }\n\n  @Test\n  public void testParseAttributionStringStreets() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION)\n      .withMapboxPrivacyPolicy(false)\n      .build();\n\n    Set<Attribution> attributionList = attributionParser.getAttributions();\n    assertEquals(\"Size of list should match\", 4, attributionList.size());\n\n    int counter = 0;\n    for (Attribution attribution : attributionList) {\n      switch (counter) {\n        case 0:\n          assertEquals(\"URL mapbox should match\", \"https://www.mapbox.com/about/maps/\", attribution.getUrl());\n          assertEquals(\"Title mapbox should match\", \"© Mapbox\", attribution.getTitle());\n          break;\n        case 1:\n          assertEquals(\"URL openstreetmap should match\", \"http://www.openstreetmap.org/about/\", attribution.getUrl());\n          assertEquals(\"Title openstreetmap should match\", \"© OpenStreetMap\", attribution.getTitle());\n          break;\n        case 2:\n          assertEquals(\"URL improve map should match\", \"https://apps.mapbox.com/feedback/\", attribution.getUrl());\n          assertEquals(\"Title improve map should match\", \"Improve This Map\", attribution.getTitle());\n          break;\n      }\n      counter++;\n    }\n  }\n\n  @Test\n  public void testParseAttributionWithoutMapbox() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION)\n      .withMapboxAttribution(false)\n      .build();\n\n    Set<Attribution> attributionList = attributionParser.getAttributions();\n    assertEquals(\"Size of list should match\", 4, attributionList.size());\n\n    int counter = 0;\n    for (Attribution attribution : attributionList) {\n      switch (counter) {\n        case 0:\n          assertEquals(\"URL openstreetmap should match\", \"http://www.openstreetmap.org/about/\", attribution.getUrl());\n          assertEquals(\"Title openstreetmap should match\", \"© OpenStreetMap\", attribution.getTitle());\n          break;\n        case 1:\n          assertEquals(\"URL improve map should match\", \"https://apps.mapbox.com/feedback/\", attribution.getUrl());\n          assertEquals(\"Title improve map should match\", \"Improve This Map\", attribution.getTitle());\n          break;\n        case 2:\n          assertEquals(Attribution.GEOFENCING_URL_MARKER, attribution.getUrl());\n          assertEquals(Attribution.GEOFENCING, attribution.getTitle());\n          break;\n        case 3:\n          assertEquals(\"URL improve map should match\", \"https://www.mapbox.com/legal/privacy#product-privacy-policy/\", attribution.getUrl());\n          assertEquals(\"Title improve map should match\", \"Mapbox Privacy Policy\", attribution.getTitle());\n          break;\n      }\n      counter++;\n    }\n  }\n\n  @Test\n  public void testParseAttributionArrayString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(new String[] {STREETS_ATTRIBUTION, \"\", SATELLITE_ATTRIBUTION})\n      .build();\n    Set<Attribution> attributionList = attributionParser.getAttributions();\n    assertEquals(\"Size of list should match\", 6, attributionList.size());\n\n    int counter = 0;\n    for (Attribution attribution : attributionList) {\n      switch (counter) {\n        case 0:\n          assertEquals(\"URL mapbox should match\", \"https://www.mapbox.com/about/maps/\", attribution.getUrl());\n          assertEquals(\"Title mapbox should match\", \"© Mapbox\", attribution.getTitle());\n          break;\n        case 1:\n          assertEquals(\"URL openstreetmap should match\", \"http://www.openstreetmap.org/about/\", attribution.getUrl());\n          assertEquals(\"Title openstreetmap should match\", \"© OpenStreetMap\", attribution.getTitle());\n          break;\n        case 2:\n          assertEquals(\"URL improve map should match\", \"https://apps.mapbox.com/feedback/\", attribution.getUrl());\n          assertEquals(\"Title improve map should match\", \"Improve This Map\", attribution.getTitle());\n          break;\n        case 3:\n          assertEquals(\"URL digital globe should match\", \"https://www.digitalglobe.com/\", attribution.getUrl());\n          assertEquals(\"Title digital globe should match\", \"© DigitalGlobe\", attribution.getTitle());\n          break;\n        case 4:\n          assertEquals(Attribution.GEOFENCING_URL_MARKER, attribution.getUrl());\n          assertEquals(Attribution.GEOFENCING, attribution.getTitle());\n          break;\n        case 5:\n          assertEquals(\"URL improve map should match\", \"https://www.mapbox.com/legal/privacy#product-privacy-policy/\", attribution.getUrl());\n          assertEquals(\"Title improve map should match\", \"Mapbox Privacy Policy\", attribution.getTitle());\n          break;\n      }\n      counter++;\n    }\n  }\n\n  @Test\n  public void testHideImproveThisMapAttributionArrayString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(SATELLITE_ATTRIBUTION)\n      .withImproveMap(false)\n      .withMapboxPrivacyPolicy(false)\n      .build();\n    Set<Attribution> attributionList = attributionParser.getAttributions();\n    assertEquals(\"Size of list should match\", 4, attributionList.size());\n\n    int counter = 0;\n    for (Attribution attribution : attributionList) {\n      switch (counter) {\n        case 0:\n          assertEquals(\"URL mapbox should match\", \"https://www.mapbox.com/about/maps/\", attribution.getUrl());\n          assertEquals(\"Title mapbox should match\", \"© Mapbox\", attribution.getTitle());\n          break;\n        case 1:\n          assertEquals(\"URL openstreetmap should match\", \"http://www.openstreetmap.org/about/\", attribution.getUrl());\n          assertEquals(\"Title openstreetmap should match\", \"© OpenStreetMap\", attribution.getTitle());\n          break;\n        case 2:\n          assertEquals(\"URL digital globe should match\", \"https://www.digitalglobe.com/\", attribution.getUrl());\n          assertEquals(\"Title digital globe should match\", \"© DigitalGlobe\", attribution.getTitle());\n          break;\n      }\n      counter++;\n    }\n  }\n\n  @Test\n  public void testParseHideCopyrightAttributionArrayString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION, \"\", SATELLITE_ATTRIBUTION)\n      .withCopyrightSign(false)\n      .build();\n    Set<Attribution> attributionList = attributionParser.getAttributions();\n    assertEquals(\"Size of list should match\", 6, attributionList.size());\n\n    int counter = 0;\n    for (Attribution attribution : attributionList) {\n      switch (counter) {\n        case 0:\n          assertEquals(\"URL mapbox should match\", \"https://www.mapbox.com/about/maps/\", attribution.getUrl());\n          assertEquals(\"Title mapbox should match\", \"Mapbox\", attribution.getTitle());\n          break;\n        case 1:\n          assertEquals(\"URL openstreetmap should match\", \"http://www.openstreetmap.org/about/\", attribution.getUrl());\n          assertEquals(\"Title openstreetmap should match\", \"OpenStreetMap\", attribution.getTitle());\n          break;\n        case 2:\n          assertEquals(\"URL improve map should match\", \"https://apps.mapbox.com/feedback/\", attribution.getUrl());\n          assertEquals(\"Title improve map should match\", \"Improve This Map\", attribution.getTitle());\n          break;\n        case 3:\n          assertEquals(\"URL digital globe should match\", \"https://www.digitalglobe.com/\", attribution.getUrl());\n          assertEquals(\"Title digital globe should match\", \"DigitalGlobe\", attribution.getTitle());\n          break;\n        case 4:\n          assertEquals(Attribution.GEOFENCING_URL_MARKER, attribution.getUrl());\n          assertEquals(Attribution.GEOFENCING, attribution.getTitle());\n          break;\n        case 5:\n          assertEquals(\"URL improve map should match\", \"https://www.mapbox.com/legal/privacy#product-privacy-policy/\", attribution.getUrl());\n          assertEquals(\"Title improve map should match\", \"Mapbox Privacy Policy\", attribution.getTitle());\n          break;\n      }\n      counter++;\n    }\n  }\n\n  @Test\n  public void testOutputWithoutCopyRightString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION)\n      .withCopyrightSign(false)\n      .withImproveMap(false)\n      .withMapboxPrivacyPolicy(false)\n      .withMapboxGeofencingConsent(false)\n      .build();\n\n    assertEquals(\n      \"Attribution string should match\",\n      \"© Mapbox / OpenStreetMap\",\n      attributionParser.createAttributionString()\n    );\n  }\n\n\n  @Test\n  public void testOutputWithCopyRightString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION)\n      .withImproveMap(false)\n      .withMapboxPrivacyPolicy(false)\n      .withMapboxGeofencingConsent(false)\n      .build();\n\n    assertEquals(\n      \"Attribution string should match\",\n      \"© Mapbox / © OpenStreetMap\",\n      attributionParser.createAttributionString()\n    );\n  }\n\n  @Test\n  public void testOutputWithoutCopyRightWithoutMapboxString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION)\n      .withCopyrightSign(false)\n      .withImproveMap(false)\n      .withMapboxAttribution(false)\n      .withMapboxPrivacyPolicy(false)\n      .withMapboxGeofencingConsent(false)\n      .build();\n\n    assertEquals(\n      \"Attribution string should match\",\n      \"© OpenStreetMap\",\n      attributionParser.createAttributionString()\n    );\n  }\n\n  @Test\n  public void testOutputWithCopyRightWithoutMapboxString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION)\n      .withImproveMap(false)\n      .withMapboxAttribution(false)\n      .withMapboxPrivacyPolicy(false)\n      .withMapboxGeofencingConsent(false)\n      .build();\n\n    assertEquals(\n      \"Attribution string should match\",\n      \"© OpenStreetMap\",\n      attributionParser.createAttributionString()\n    );\n  }\n\n  @Test\n  public void testOutputSatelliteString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION, SATELLITE_ATTRIBUTION, \"\")\n      .withImproveMap(false)\n      .withCopyrightSign(false)\n      .withMapboxAttribution(false)\n      .withMapboxPrivacyPolicy(false)\n      .withMapboxGeofencingConsent(false)\n      .build();\n\n    assertEquals(\n      \"Attribution string should match\",\n      \"© OpenStreetMap / DigitalGlobe\",\n      attributionParser.createAttributionString()\n    );\n  }\n\n  @Test\n  public void testShortOpenStreetMapString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION, SATELLITE_ATTRIBUTION, \"\")\n      .withImproveMap(false)\n      .withCopyrightSign(false)\n      .withMapboxAttribution(false)\n      .withMapboxPrivacyPolicy(false)\n      .withMapboxGeofencingConsent(false)\n      .build();\n\n    assertEquals(\n      \"Attribution string should match\",\n      \"© OSM / DigitalGlobe\",\n      attributionParser.createAttributionString(true)\n    );\n  }\n\n  @Test\n  public void testShortOpenStreetMapWithoutCopyrightString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION, SATELLITE_ATTRIBUTION, \"\")\n      .withImproveMap(false)\n      .withCopyrightSign(false)\n      .withMapboxPrivacyPolicy(false)\n      .withMapboxGeofencingConsent(false)\n      .build();\n\n    assertEquals(\n      \"Attribution string should match\",\n      \"© Mapbox / OSM / DigitalGlobe\",\n      attributionParser.createAttributionString(true)\n    );\n  }\n\n  @Test\n  public void testWithImproveThisMapString() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n      .withAttributionData(STREETS_ATTRIBUTION, CUSTOM_ATTRIBUTION, \"\")\n      .withImproveMap(true)\n      .withCopyrightSign(false)\n      .withMapboxPrivacyPolicy(false)\n      .withMapboxGeofencingConsent(false)\n      .build();\n\n    assertEquals(\n      \"Attribution string should match\",\n      \"© Mapbox / OSM / Improve This Map / Custom Contributors\",\n      attributionParser.createAttributionString(true)\n    );\n  }\n\n  @Test\n  public void testParseAttributionWithCustomStringAttribution() throws Exception {\n    AttributionParser attributionParser = new AttributionParser.Options(RuntimeEnvironment.application)\n            .withAttributionData(CUSTOM_ATTRIBUTION, CUSTOM_ATTRIBUTION_OPENSTREET)\n            .withMapboxPrivacyPolicy(false)\n            .build();\n\n    final Set<Attribution> attributionList = attributionParser.getAttributions();\n    assertEquals(\"Size of list should match\", 3, attributionList.size());\n\n    int counter = 0;\n    for (final Attribution attribution : attributionList) {\n      switch (counter) {\n        case 0:\n          assertEquals(Attribution.GEOFENCING_URL_MARKER, attribution.getUrl());\n          assertEquals(Attribution.GEOFENCING, attribution.getTitle());\n          break;\n        case 1:\n          assertEquals(\"URL should match\", \"\", attribution.getUrl());\n          assertEquals(\"Title should match\", \"© Custom Contributors\", attribution.getTitle());\n          break;\n        case 2:\n          assertEquals(\"URL should match\", \"\", attribution.getUrl());\n          assertEquals(\"Title should match\", \"OpenStreetMap CC-BY-SA\", attribution.getTitle());\n          break;\n      }\n      counter++;\n    }\n  }\n}\n"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/attribution/MapAttributionDelegateImplTest.kt",
    "content": "package com.mapbox.maps.attribution\n\nimport android.content.Context\nimport androidx.test.core.app.ApplicationProvider\nimport com.mapbox.common.MapboxOptions\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.geofencing.MapGeofencingConsent\nimport com.mapbox.maps.module.MapTelemetry\nimport com.mapbox.maps.plugin.MapAttributionDelegateImpl\nimport com.mapbox.maps.plugin.attribution.Attribution\nimport com.mapbox.maps.plugin.attribution.AttributionParserConfig\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass MapAttributionDelegateImplTest {\n  private val mapboxMap: MapboxMap = mockk()\n  private val mapTelemetry: MapTelemetry = mockk()\n  @OptIn(MapboxExperimental::class)\n  private val mapGeofencingConsent: MapGeofencingConsent = mockk()\n  private val style: Style = mockk()\n  private lateinit var mapAttributionDelegate: MapAttributionDelegate\n  private lateinit var context: Context\n\n  @OptIn(MapboxExperimental::class)\n  @Before\n  fun setUp() {\n    context = ApplicationProvider.getApplicationContext()\n    every { mapGeofencingConsent.shouldShowConsent() } returns true\n    mapAttributionDelegate =\n      MapAttributionDelegateImpl(mapboxMap, mapTelemetry, mapGeofencingConsent)\n    every { mapboxMap.getAttributions() } returns listOf(ATTRIBUTION)\n    every { mapboxMap.style } returns style\n    every { style.styleURI } returns STYLE_URL\n  }\n\n  @Test\n  fun telemetry() {\n    assertEquals(mapTelemetry, mapAttributionDelegate.telemetry())\n  }\n\n  @Test\n  fun buildMapBoxFeedbackUrl() {\n    val camera: CameraState = mockk()\n    every { camera.center } returns Point.fromLngLat(1.0, 2.0)\n    every { camera.zoom } returns 0.0\n    every { camera.bearing } returns 0.0\n    every { camera.pitch } returns 0.0\n    every { mapboxMap.cameraState } returns camera\n    mockkStatic(MapboxOptions::class)\n    every { MapboxOptions.accessToken } returns TOKEN\n    val url = mapAttributionDelegate.buildMapBoxFeedbackUrl(context)\n    assertEquals(\n      \"https://apps.mapbox.com/feedback?referrer=com.mapbox.maps.test&access_token=$TOKEN&owner=mapbox&id=light-v10#/1.0/2.0/0.0/0.0/0.0\",\n      url\n    )\n  }\n\n  @Test\n  fun parseAttributions() {\n    var attributions = mapAttributionDelegate.parseAttributions(\n      context,\n      AttributionParserConfig(\n        withImproveMap = false,\n        withTelemetryAttribution = false,\n        withMapboxAttribution = false,\n        withMapboxPrivacyPolicy = false,\n        withMapboxGeofencingConsent = false,\n      )\n    )\n    assertEquals(1, attributions.size)\n    assertEquals(\n      \"URL openstreetmap should match\", \"http://www.openstreetmap.org/about/\",\n      attributions.first().url\n    )\n    assertEquals(\n      \"Title openstreetmap should match\", \"© OpenStreetMap\",\n      attributions.first().title\n    )\n\n    attributions = mapAttributionDelegate.parseAttributions(\n      context,\n      AttributionParserConfig(\n        withImproveMap = true,\n        withTelemetryAttribution = false,\n        withMapboxAttribution = false,\n        withMapboxPrivacyPolicy = false,\n        withMapboxGeofencingConsent = false,\n      )\n    )\n    assertEquals(2, attributions.size)\n    assertEquals(\n      \"URL improve map should match\", \"https://www.mapbox.com/map-feedback/\",\n      attributions.last().url\n    )\n    assertEquals(\n      \"Title improve map should match\", \"Improve This Map\",\n      attributions.last().title\n    )\n\n    attributions = mapAttributionDelegate.parseAttributions(\n      context,\n      AttributionParserConfig(\n        withImproveMap = false,\n        withTelemetryAttribution = true,\n        withMapboxAttribution = false,\n        withMapboxPrivacyPolicy = false,\n        withMapboxGeofencingConsent = false,\n      )\n    )\n\n    assertEquals(2, attributions.size)\n    assertEquals(\n      \"Telemetry URL should match\", \"https://www.mapbox.com/telemetry/\",\n      attributions.last().url\n    )\n    assertEquals(\n      \"Telemetry title should match\", \"Mapbox Telemetry\",\n      attributions.last().title\n    )\n\n    attributions = mapAttributionDelegate.parseAttributions(\n      context,\n      AttributionParserConfig(\n        withImproveMap = false,\n        withTelemetryAttribution = false,\n        withMapboxAttribution = false,\n        withMapboxPrivacyPolicy = false,\n        withMapboxGeofencingConsent = true,\n      )\n    )\n\n    assertEquals(2, attributions.size)\n    assertEquals(\n      \"Geofencing Consent URL should match\", Attribution.GEOFENCING_URL_MARKER,\n      attributions.last().url\n    )\n    assertEquals(\n      \"Geofencing Consent title should match\", Attribution.GEOFENCING,\n      attributions.last().title\n    )\n\n    attributions = mapAttributionDelegate.parseAttributions(\n      context,\n      AttributionParserConfig(\n        withImproveMap = false,\n        withTelemetryAttribution = false,\n        withMapboxAttribution = true,\n        withMapboxPrivacyPolicy = false,\n        withMapboxGeofencingConsent = false,\n      )\n    )\n\n    assertEquals(2, attributions.size)\n    assertEquals(\n      \"URL mapbox should match\", \"https://www.mapbox.com/about/maps/\",\n      attributions.first().url\n    )\n    assertEquals(\n      \"Title mapbox should match\", \"© Mapbox\", attributions.first().title\n    )\n\n    mapAttributionDelegate.extraAttributions = listOf(Attribution(\"Custom One\", \"https://www.custom.com\"))\n    attributions = mapAttributionDelegate.parseAttributions(\n      context,\n      AttributionParserConfig(\n        withImproveMap = false,\n        withTelemetryAttribution = false,\n        withMapboxAttribution = false,\n        withMapboxPrivacyPolicy = false,\n        withMapboxGeofencingConsent = false,\n      )\n    )\n\n    assertEquals(2, attributions.size)\n    assertEquals(\"https://www.custom.com\", attributions.last().url)\n    assertEquals(\"Custom One\", attributions.last().title)\n\n    mapAttributionDelegate.extraAttributions = emptyList()\n    attributions = mapAttributionDelegate.parseAttributions(context, AttributionParserConfig())\n    println(attributions)\n    assertEquals(6, attributions.size)\n    var counter = 0\n    for ((title, url) in attributions) {\n      when (counter) {\n        0 -> {\n          assertEquals(\n            \"URL mapbox should match\", \"https://www.mapbox.com/about/maps/\",\n            url\n          )\n          assertEquals(\"Title mapbox should match\", \"© Mapbox\", title)\n        }\n        1 -> {\n          assertEquals(\n            \"URL openstreetmap should match\", \"http://www.openstreetmap.org/about/\",\n            url\n          )\n          assertEquals(\n            \"Title openstreetmap should match\", \"© OpenStreetMap\",\n            title\n          )\n        }\n        2 -> {\n          assertEquals(\n            \"Telemetry URL should match\", \"https://www.mapbox.com/telemetry/\",\n            url\n          )\n          assertEquals(\n            \"Telemetry title should match\", \"Mapbox Telemetry\",\n            title\n          )\n        }\n        3 -> {\n          assertEquals(\n            \"Geofencing consent URL should match\", Attribution.GEOFENCING_URL_MARKER,\n            url\n          )\n          assertEquals(\n            \"Geofencing consent title should match\", Attribution.GEOFENCING,\n            title\n          )\n        }\n        4 -> {\n          assertEquals(\n            \"Telemetry URL should match\", \"https://www.mapbox.com/legal/privacy#product-privacy-policy/\",\n            url\n          )\n          assertEquals(\n            \"Telemetry title should match\", \"Mapbox Privacy Policy\",\n            title\n          )\n        }\n        5 -> {\n          assertEquals(\n            \"URL improve map should match\", \"https://www.mapbox.com/map-feedback/\",\n            url\n          )\n          assertEquals(\n            \"Title improve map should match\", \"Improve This Map\",\n            title\n          )\n        }\n      }\n      counter++\n    }\n  }\n\n  companion object {\n    private const val TOKEN = \"token\"\n    private const val STYLE_URL = \"mapbox://styles/mapbox/light-v10\"\n    private const val ATTRIBUTION =\n      \"<a href=\\\"https://www.mapbox.com/about/maps/\\\" target=\\\"_blank\\\">&copy; Mapbox</a> <a href=\\\"http://www.openstreetmap.org/about/\\\" target=\\\"_blank\\\">&copy; OpenStreetMap</a> <a class=\\\"mapbox-improve-map\\\" href=\\\"https://www.mapbox.com/map-feedback/\\\" target=\\\"_blank\\\">Improve this map</a>\"\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/debugoptions/DebugOptionsControllerTest.kt",
    "content": "package com.mapbox.maps.debugoptions\n\nimport androidx.test.core.app.ApplicationProvider\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.CameraChangedCoalescedCallback\nimport com.mapbox.maps.MapDebugOptions\nimport com.mapbox.maps.MapView\nimport com.mapbox.maps.MapboxMap\nimport com.mapbox.verifyNo\nimport io.mockk.clearAllMocks\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.slot\nimport io.mockk.unmockkAll\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass DebugOptionsControllerTest {\n  private val mapboxMap: MapboxMap = mockk(relaxed = true)\n  private val cameraDebugView: CameraDebugView = mockk(relaxed = true)\n  private val paddingDebugView: PaddingDebugView = mockk(relaxed = true)\n  private val mapView: MapView = mockk(relaxed = true)\n  private lateinit var debugOptionsController: DebugOptionsController\n\n  @Before\n  fun setUp() {\n    clearAllMocks()\n    every { mapView.context } returns ApplicationProvider.getApplicationContext()\n    every { cameraDebugView.parent } returns null\n    every { paddingDebugView.parent } returns null\n\n    debugOptionsController =\n      DebugOptionsController(mapView, mapboxMap, { cameraDebugView }, { paddingDebugView })\n  }\n\n  @After\n  fun tearDown() {\n    unmockkAll()\n  }\n\n  @Test\n  fun updatesDebugViewsWhenCameraUpdated() {\n    val onCameraChangeCoalescedListenerSlot = slot<CameraChangedCoalescedCallback>()\n    every { mapboxMap.subscribeCameraChangedCoalesced(capture(onCameraChangeCoalescedListenerSlot)) } returns mockk()\n\n    debugOptionsController.started = true\n    debugOptionsController.options = setOf(MapViewDebugOptions.CAMERA, MapViewDebugOptions.PADDING)\n\n    // Verify the callback was captured, then invoke it\n    verify { mapboxMap.subscribeCameraChangedCoalesced(any()) }\n    val onCameraChangeCoalescedListener = onCameraChangeCoalescedListenerSlot.captured\n    onCameraChangeCoalescedListener.run(mockk(relaxed = true))\n\n    verify { cameraDebugView.update(any()) }\n    verify { paddingDebugView.update(any()) }\n  }\n\n  @Test\n  fun providesInitialDataToDebugViews() {\n    debugOptionsController.options = setOf(MapViewDebugOptions.CAMERA, MapViewDebugOptions.PADDING)\n\n    verify { cameraDebugView.update(any()) }\n    verify { paddingDebugView.update(any()) }\n  }\n\n  @Test\n  fun propagatesNativeDebugOptions() {\n    debugOptionsController.options = setOf(\n      MapViewDebugOptions.TILE_BORDERS,\n      MapViewDebugOptions.COLLISION,\n      MapViewDebugOptions.CAMERA\n    )\n\n    verify {\n      mapboxMap.debugOptions = setOf(MapDebugOptions.TILE_BORDERS, MapDebugOptions.COLLISION)\n    }\n  }\n\n  @Test\n  fun addsDebugViewsWhenEnabled() {\n    debugOptionsController.options = setOf(MapViewDebugOptions.CAMERA, MapViewDebugOptions.PADDING)\n\n    verify { mapView.addView(cameraDebugView) }\n    verify { mapView.addView(paddingDebugView) }\n  }\n\n  @Test\n  fun removesCameraDebugViewsWhenEnabled() {\n    debugOptionsController.options = setOf(MapViewDebugOptions.CAMERA, MapViewDebugOptions.PADDING)\n\n    debugOptionsController.options = setOf()\n\n    verify { mapView.removeView(cameraDebugView) }\n    verify { mapView.removeView(paddingDebugView) }\n  }\n\n  @Test\n  fun subscribesToCameraUpdatesOnStart() {\n    debugOptionsController.options = setOf(MapViewDebugOptions.CAMERA)\n\n    verifyNo { mapboxMap.subscribeCameraChangedCoalesced(any()) }\n\n    debugOptionsController.started = true\n\n    verify { mapboxMap.subscribeCameraChangedCoalesced(any()) }\n  }\n\n  @Test\n  fun doesNotSubscribeToCameraUpdatesOnStart() {\n    debugOptionsController.options = setOf(MapViewDebugOptions.COLLISION)\n\n    debugOptionsController.started = true\n\n    verifyNo { mapboxMap.subscribeCameraChangedCoalesced(any()) }\n  }\n\n  @Test\n  fun subscribesToCameraUpdatesAfterStart() {\n    debugOptionsController.started = true\n\n    verifyNo { mapboxMap.subscribeCameraChangedCoalesced(any()) }\n\n    debugOptionsController.options = setOf(MapViewDebugOptions.PADDING)\n\n    verify { mapboxMap.subscribeCameraChangedCoalesced(any()) }\n  }\n\n  @Test\n  fun doesNotSubscribeToCameraUpdatesBeforeStart() {\n    debugOptionsController.options = setOf(MapViewDebugOptions.CAMERA)\n\n    verifyNo { mapboxMap.subscribeCameraChangedCoalesced(any()) }\n  }\n\n  @Test\n  fun unsubscribesFromCameraUpdatesOnStop() {\n    val cancelableMock = mockk<Cancelable>(relaxed = true)\n    every { mapboxMap.subscribeCameraChangedCoalesced(any()) } returns cancelableMock\n\n    debugOptionsController.options = setOf(MapViewDebugOptions.CAMERA)\n    debugOptionsController.started = true\n\n    debugOptionsController.started = false\n\n    verify { cancelableMock.cancel() }\n  }\n\n  @Test\n  fun unsubscribesFromCameraUpdatesWhenNeeded() {\n    val cancelableMock = mockk<Cancelable>(relaxed = true)\n    every { mapboxMap.subscribeCameraChangedCoalesced(any()) } returns cancelableMock\n    debugOptionsController.options = setOf(MapViewDebugOptions.CAMERA)\n    debugOptionsController.started = true\n\n    debugOptionsController.options = setOf(MapViewDebugOptions.TILE_BORDERS)\n\n    verify { cancelableMock.cancel() }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/plugin/MapDelegateProviderTest.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport com.mapbox.maps.*\nimport com.mapbox.maps.geofencing.MapGeofencingConsent\nimport com.mapbox.maps.module.MapTelemetry\nimport com.mapbox.maps.plugin.attribution.attribution\nimport io.mockk.*\nimport junit.framework.Assert.assertEquals\nimport junit.framework.Assert.assertNotNull\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass MapDelegateProviderTest {\n\n  private lateinit var mapView: MapView\n  private val mapboxMap = mockk<MapboxMap>()\n  private val indoor = mockk<IndoorManager>()\n\n  @Before\n  fun setUp() {\n    mapView = mockk(relaxed = true)\n    every { mapView.mapboxMap } returns mapboxMap\n    every { mapboxMap.indoor } returns indoor\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun mapCameraDelegate() {\n    val mapDelegateProvider = MapDelegateProviderImpl(mapboxMap, mockk(), mockk(), mockk())\n    assertNotNull(mapDelegateProvider.mapCameraManagerDelegate)\n  }\n\n  @Test\n  fun mapFeatureQueryDelegate() {\n    val mapDelegateProvider = MapDelegateProviderImpl(mapboxMap, mockk(), mockk(), mockk())\n    assertEquals(mapboxMap, mapDelegateProvider.mapFeatureQueryDelegate)\n  }\n\n  @Test\n  fun mapListenerDelegate() {\n    val mapDelegateProvider = MapDelegateProviderImpl(mapboxMap, mockk(), mockk(), mockk())\n    assertEquals(mapboxMap, mapDelegateProvider.mapListenerDelegate)\n  }\n\n  @Test\n  fun mapTransformDelegate() {\n    val mapDelegateProvider = MapDelegateProviderImpl(mapboxMap, mockk(), mockk(), mockk())\n    assertEquals(mapboxMap, mapDelegateProvider.mapTransformDelegate)\n  }\n\n  @Test\n  fun mapPluginProviderDelegate() {\n    val expected = mockk<MapController>()\n    val mapDelegateProvider = MapDelegateProviderImpl(mapboxMap, expected, mockk(), mockk())\n    assertEquals(expected, mapDelegateProvider.mapPluginProviderDelegate)\n  }\n\n  @Test\n  fun styleExtensionDelegate() {\n    val captureCallback = slot<Style.OnStyleLoaded>()\n    every { mapboxMap.getStyle(capture(captureCallback)) } answers {\n      captureCallback.captured.onStyleLoaded(mockk())\n    }\n    val mapDelegateProvider = MapDelegateProviderImpl(mapboxMap, mockk(), mockk(), mockk())\n    mapDelegateProvider.getStyle {}\n    assertNotNull(captureCallback.captured)\n  }\n\n  @Test\n  fun mapAttributionDelegate() {\n    val expectedTelemetry = mockk<MapTelemetry>()\n    val expectedMapGeofencingConsent = mockk<MapGeofencingConsent>()\n    val mapController = mockk<MapController>()\n    every { mapController.attribution } returns mockk()\n    val mapDelegateProvider =\n      MapDelegateProviderImpl(\n        mapboxMap,\n        mapController, expectedTelemetry, expectedMapGeofencingConsent\n      )\n\n    assertEquals(expectedTelemetry, mapDelegateProvider.mapAttributionDelegate.telemetry())\n    assertEquals(expectedMapGeofencingConsent, mapDelegateProvider.mapAttributionDelegate.geofencingConsent())\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/plugin/MapPluginRegistryTest.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport android.content.Context\nimport android.util.DisplayMetrics\nimport android.view.MotionEvent\nimport android.view.View\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass MapPluginRegistryTest {\n\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private lateinit var mapPluginRegistry: MapPluginRegistry\n  private val mapInitOptions = mockk<MapInitOptions>()\n  private val mapOptions = mockk<MapOptions>()\n\n  @Before\n  fun setUp() {\n    mapPluginRegistry = MapPluginRegistry(delegateProvider)\n    every { mapInitOptions.mapOptions } returns mapOptions\n    every { mapInitOptions.attrs } returns null\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun createPlugin() {\n    val mapView = mockk<MapView>(relaxUnitFun = true)\n    val mapPlugin = mockk<MapPlugin>(relaxUnitFun = true)\n    val plugin = Plugin.Custom(\"id\", mapPlugin)\n\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    verify { mapPlugin.onDelegateProvider(delegateProvider) }\n    verify { mapPlugin.initialize() }\n  }\n\n  @Test\n  fun createPlugin_duplicate() {\n    val mapView = mockk<MapView>(relaxUnitFun = true)\n    val mapPluginOne = mockk<MapPlugin>(relaxUnitFun = true)\n    val pluginOne = Plugin.Custom(\"id\", mapPluginOne)\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, pluginOne)\n\n    val mapPluginTwo = mockk<MapPlugin>(relaxUnitFun = true)\n    val pluginTwo = Plugin.Custom(\"id\", mapPluginTwo)\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, pluginTwo)\n\n    verify(exactly = 1) { mapPluginOne.onDelegateProvider(delegateProvider) }\n    verify(exactly = 2) { mapPluginOne.initialize() }\n    verify(exactly = 0) { mapPluginTwo.onDelegateProvider(delegateProvider) }\n    verify(exactly = 0) { mapPluginTwo.initialize() }\n  }\n\n  @Test\n  fun createPlugin_startedBefore() {\n    val mapView = mockk<MapView>()\n    val lifecyclePlugin = mockk<TestLifecyclePlugin>(relaxUnitFun = true)\n    val plugin = Plugin.Custom(\"id\", lifecyclePlugin)\n\n    mapPluginRegistry.onStart()\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    verify { lifecyclePlugin.onStart() }\n  }\n\n  @Test\n  fun createPlugin_viewPlugin() {\n    val mapView = mockk<MapView>(relaxed = true)\n    val viewPlugin = mockk<ViewPlugin>(relaxUnitFun = true)\n    val view = mockk<View>()\n    val plugin = Plugin.Custom(\"id\", viewPlugin)\n    every { mapInitOptions.context } returns mockk()\n    every { mapOptions.pixelRatio } returns 1f\n    every { viewPlugin.bind(mapView, any(), any()) } returns view\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    verify { viewPlugin.bind(mapView, any(), any()) }\n    verify { mapView.addView(view) }\n    verify { viewPlugin.onPluginView(view) }\n  }\n\n  @Test\n  fun createPlugin_gesturePlugin() {\n    val mapView = mockk<MapView>(relaxed = true)\n    val gesturesPlugin = mockk<GesturesPlugin>(relaxUnitFun = true)\n    val plugin = Plugin.Custom(\"id\", gesturesPlugin)\n    every { gesturesPlugin.bind(any(), any(), any()) } returns mockk()\n    every { mapInitOptions.context } returns mockk()\n    every { mapOptions.pixelRatio } returns 1f\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    verify { gesturesPlugin.bind(any(), any(), any()) }\n\n    verify { gesturesPlugin.onDelegateProvider(any()) }\n    verify { gesturesPlugin.initialize() }\n  }\n\n  @Test\n  fun getPlugin() {\n    val mapView = mockk<MapView>()\n    val mapPlugin = mockk<MapPlugin>(relaxUnitFun = true)\n    val plugin = Plugin.Custom(\"id\", mapPlugin)\n\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    Assert.assertEquals(mapPlugin, mapPluginRegistry.getPlugin(\"id\"))\n  }\n\n  @Test\n  fun getPlugin_null() {\n    Assert.assertNull(mapPluginRegistry.getPlugin(\"id\"))\n  }\n\n  @Test\n  fun onStart() {\n    val mapView = mockk<MapView>()\n    val lifecyclePlugin = mockk<TestLifecyclePlugin>(relaxUnitFun = true)\n    val plugin = Plugin.Custom(\"id\", lifecyclePlugin)\n\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    mapPluginRegistry.onStart()\n    verify { lifecyclePlugin.onStart() }\n  }\n\n  @Test\n  fun onStop() {\n    val mapView = mockk<MapView>()\n    val lifecyclePlugin = mockk<TestLifecyclePlugin>(relaxUnitFun = true)\n    val plugin = Plugin.Custom(\"id\", lifecyclePlugin)\n\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    mapPluginRegistry.onStart()\n    mapPluginRegistry.onStop()\n    verify { lifecyclePlugin.onStop() }\n  }\n\n  @Test\n  fun onCameraMove() {\n    val mapView = mockk<MapView>(relaxUnitFun = true)\n    val cameraPlugin = mockk<MapCameraPlugin>(relaxUnitFun = true)\n    val plugin = Plugin.Custom(\"id\", cameraPlugin)\n    val cameraState = mockk<CameraState>()\n\n    val center = Point.fromLngLat(1.0, 2.0)\n    every { cameraState.center } returns center\n    val zoom = 5.0\n    every { cameraState.zoom } returns zoom\n    val bearing = 15.0\n    every { cameraState.bearing } returns bearing\n    val pitch = 30.0\n    every { cameraState.pitch } returns pitch\n    val insets = EdgeInsets(1.0, 2.0, 3.0, 4.0)\n    every { cameraState.padding } returns insets\n\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    mapPluginRegistry.onCameraMove(cameraState)\n    verify {\n      cameraPlugin.onCameraMove(\n          center,\n          zoom,\n          pitch,\n          bearing,\n          insets\n      )\n    }\n  }\n\n  @Test\n  fun onTouch() {\n    val mapView = mockk<MapView>(relaxUnitFun = true)\n    val context = mockk<Context>(relaxUnitFun = true)\n    val displayMetrics = DisplayMetrics().also { it.density = 1f }\n    val motionEvent = mockk<MotionEvent>(relaxUnitFun = true)\n    val gesturesPlugin = mockk<GesturesPlugin>(relaxed = true)\n    val plugin = Plugin.Custom(\"id\", gesturesPlugin)\n\n    every { mapView.context.applicationContext } returns context\n    every { mapInitOptions.context } returns context\n    every { mapOptions.pixelRatio } returns 1f\n    every { mapView.resources.displayMetrics } returns displayMetrics\n    every { gesturesPlugin.onTouchEvent(motionEvent) } returns true\n\n    assertFalse(mapPluginRegistry.onTouch(motionEvent))\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    assertTrue(mapPluginRegistry.onTouch(motionEvent))\n\n    verify {\n      gesturesPlugin.onTouchEvent(motionEvent)\n    }\n  }\n\n  @Test\n  fun onGenericMotionEvent() {\n    val mapView = mockk<MapView>(relaxUnitFun = true)\n    val context = mockk<Context>(relaxUnitFun = true)\n    val displayMetrics = DisplayMetrics().also { it.density = 1f }\n    val motionEvent = mockk<MotionEvent>(relaxUnitFun = true)\n    val gesturesPlugin = mockk<GesturesPlugin>(relaxed = true)\n    val plugin = Plugin.Custom(\"id\", gesturesPlugin)\n\n    every { mapView.context.applicationContext } returns context\n    every { mapInitOptions.context } returns context\n    every { mapOptions.pixelRatio } returns 1f\n    every { mapView.resources.displayMetrics } returns displayMetrics\n    every { gesturesPlugin.onGenericMotionEvent(motionEvent) } returns true\n\n    assertFalse(mapPluginRegistry.onGenericMotionEvent(motionEvent))\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    assertTrue(mapPluginRegistry.onGenericMotionEvent(motionEvent))\n\n    verify {\n      gesturesPlugin.onGenericMotionEvent(motionEvent)\n    }\n  }\n\n  @Test\n  fun onSizeChanged() {\n    val mapView = mockk<MapView>(relaxUnitFun = true)\n    val context = mockk<Context>(relaxUnitFun = true)\n    val displayMetrics = DisplayMetrics().also { it.density = 1f }\n    val gesturesPlugin = mockk<GesturesPlugin>(relaxed = true)\n    val plugin = Plugin.Custom(\"id\", gesturesPlugin)\n\n    every { mapView.context.applicationContext } returns context\n    every { mapInitOptions.context } returns context\n    every { mapOptions.pixelRatio } returns 1f\n    every { mapView.resources.displayMetrics } returns displayMetrics\n\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n    mapPluginRegistry.onSizeChanged(1, 2)\n\n    verify {\n      gesturesPlugin.onSizeChanged(1, 2)\n    }\n  }\n\n  @Test\n  fun onStyleChanged() {\n    val mapView = mockk<MapView>(relaxed = true)\n    val stylePlugin = mockk<TestStyleObserverPlugin>(relaxUnitFun = true)\n    val style = mockk<Style>()\n    val plugin = Plugin.Custom(\"id\", stylePlugin)\n\n    mapPluginRegistry.createPlugin(mapView, mapInitOptions, plugin)\n\n    mapPluginRegistry.onStyleChanged(style)\n\n    verify {\n      stylePlugin.onStyleChanged(style)\n    }\n  }\n\n  class TestLifecyclePlugin : MapPlugin, LifecyclePlugin {\n    override fun cleanup() {\n    }\n\n    override fun initialize() {\n    }\n\n    override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    }\n\n    override fun onStart() {\n    }\n\n    override fun onStop() {\n    }\n  }\n\n  class TestStyleObserverPlugin : MapPlugin, MapStyleObserverPlugin {\n    override fun initialize() {\n    }\n\n    override fun cleanup() {\n    }\n\n    override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    }\n\n    override fun onStyleChanged(style: MapboxStyleManager) {\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/Cleanup.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport org.robolectric.shadows.ShadowPausedSystemClock\nimport java.util.concurrent.CopyOnWriteArrayList\n\n@Suppress(\"UNCHECKED_CAST\")\nprivate val staticListeners = ShadowPausedSystemClock::class.java\n  .getDeclaredField(\"staticListeners\")\n  .apply { isAccessible = true }\n  .get(null) as CopyOnWriteArrayList<Any?>\n\nfun cleanupShadows() {\n  // clean global state for shadow loopers\n  staticListeners.run {\n    val first = firstOrNull() ?: return@run\n    clear()\n    // intentionally keep the first listener as it is expected to be for the global Looper\n    add(first)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/EglConfigChooserTest.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.opengl.EGL14\nimport android.opengl.EGLConfig\nimport com.mapbox.maps.*\nimport com.mapbox.maps.renderer.egl.EGLConfigChooser\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\ninternal data class EglSettings(\n  val redSize: Int,\n  val greenSize: Int,\n  val blueSize: Int,\n  val alphaSize: Int,\n  val depthSize: Int,\n  val stencilSize: Int,\n  val samples: Int,\n  val sampleBuffers: Int,\n  val caveat: Int,\n  val conformant: Int,\n  val bufferSize: Int,\n  val eglConfig: EGLConfig,\n)\n\n@RunWith(Parameterized::class)\ninternal class EglConfigChooserTest(\n  private val eglSettings: List<EglSettings>,\n  private val expectedEglSettingsIndex: Int,\n  private val antialiasingSampleCount: Int,\n  private val translucentSurface: Boolean,\n) {\n\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters\n    fun data(): List<Any?> {\n      return listOf<Array<Any?>>(\n        arrayOf(\n          /* eglSettings */ emptyList<EglSettings>(),\n          /* expectedEglSettingsIndex */ -1,\n          /* antialiasingSampleCount */ 4,\n          /* translucentSurface */ false,\n        ),\n        arrayOf(\n          /* eglSettings */ emptyList<EglSettings>(),\n          /* expectedEglSettingsIndex */ -1,\n          /* antialiasingSampleCount */ 0,\n          /* translucentSurface */ false,\n        ),\n        arrayOf(\n          /* eglSettings */ listOf(\n            EglSettings(\n              bufferSize = 32,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 8,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n          ),\n          /* expectedEglSettingsIndex */ 0,\n          /* antialiasingSampleCount */ 4,\n          /* translucentSurface */ false,\n        ),\n        arrayOf(\n          /* eglSettings */ listOf(\n            EglSettings(\n              bufferSize = 32,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 8,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 32,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 16,\n              redSize = 5,\n              greenSize = 6,\n              blueSize = 5,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 24,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n          ),\n          /* expectedEglSettingsIndex */ 0,\n          /* antialiasingSampleCount */ 4,\n          /* translucentSurface */ false,\n        ),\n        arrayOf(\n          /* eglSettings */ listOf(\n            EglSettings(\n              bufferSize = 32,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 8,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 0,\n              sampleBuffers = 0,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 32,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 8,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 16,\n              redSize = 5,\n              greenSize = 6,\n              blueSize = 5,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 16,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 16,\n              redSize = 5,\n              greenSize = 6,\n              blueSize = 5,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 0,\n              sampleBuffers = 0,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 24,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 16,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n          ),\n          /* expectedEglSettingsIndex */ 1,\n          /* antialiasingSampleCount */ 4,\n          /* translucentSurface */ false,\n        ),\n        arrayOf(\n          /* eglSettings */ listOf(\n            EglSettings(\n              bufferSize = 32,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 8,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 0,\n              sampleBuffers = 0,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 32,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 16,\n              redSize = 5,\n              greenSize = 6,\n              blueSize = 5,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 16,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 16,\n              redSize = 5,\n              greenSize = 6,\n              blueSize = 5,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 0,\n              sampleBuffers = 0,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 24,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 16,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n          ),\n          /* expectedEglSettingsIndex */ 0,\n          /* antialiasingSampleCount */ 0,\n          /* translucentSurface */ false,\n        ),\n        arrayOf(\n          /* eglSettings */ listOf(\n            EglSettings(\n              bufferSize = 32,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 8,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 24,\n              redSize = 8,\n              greenSize = 8,\n              blueSize = 8,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n            EglSettings(\n              bufferSize = 16,\n              redSize = 5,\n              greenSize = 6,\n              blueSize = 5,\n              alphaSize = 0,\n              depthSize = 24,\n              stencilSize = 8,\n              samples = 4,\n              sampleBuffers = 1,\n              caveat = EGL14.EGL_NONE,\n              conformant = EGL14.EGL_OPENGL_ES2_BIT,\n              eglConfig = mockk(relaxed = true),\n            ),\n          ),\n          /* expectedEglSettingsIndex */ 0,\n          /* antialiasingSampleCount */ 4,\n          /* translucentSurface */ false,\n        ),\n      )\n    }\n  }\n\n  private lateinit var eglConfigChooser: EGLConfigChooser\n\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { logI(any(), any()) } just Runs\n    every { logW(any(), any()) } just Runs\n    every { logD(any(), any<String>()) } just Runs\n    every { isLoggableD() } returns true\n    mockkObject(EGLConfigChooser.Companion)\n    every { EGLConfigChooser.inEmulator() } returns false\n\n    mockkStatic(\"android.opengl.EGL14\")\n    every { EGL14.eglGetError() } returns EGL14.EGL_BAD_DISPLAY\n    eglConfigChooser = EGLConfigChooser(translucentSurface, antialiasingSampleCount, mapName = \"\")\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"android.opengl.EGL14\")\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    unmockkObject(EGLConfigChooser.Companion)\n  }\n\n  private fun mockChooseConfig(configs: Array<EGLConfig>) {\n    val numConfigsSlot = slot<IntArray>()\n    val configsSlot = slot<Array<EGLConfig>>()\n\n    every {\n      EGL14.eglChooseConfig(\n        any(),\n        any(),\n        any(),\n        capture(configsSlot),\n        any(),\n        any(),\n        capture(numConfigsSlot),\n        any(),\n      )\n    } answers {\n      numConfigsSlot.captured[0] = configs.size\n      configs.copyInto(configsSlot.captured)\n      true\n    }\n  }\n\n  private fun mockEglConfigAttributes(\n    eglSettings: EglSettings?\n  ) {\n    val attributeSlot = slot<Int>()\n    val valueSlot = slot<IntArray>()\n    every {\n      EGL14.eglGetConfigAttrib(\n        any(),\n        eglSettings?.eglConfig,\n        capture(attributeSlot),\n        capture(valueSlot),\n        any(),\n      )\n    } answers {\n      val value = when (attributeSlot.captured) {\n        EGL14.EGL_CONFIG_CAVEAT -> eglSettings?.caveat\n        EGL14.EGL_CONFORMANT -> eglSettings?.conformant\n        EGL14.EGL_BUFFER_SIZE -> eglSettings?.bufferSize\n        EGL14.EGL_RED_SIZE -> eglSettings?.redSize\n        EGL14.EGL_GREEN_SIZE -> eglSettings?.greenSize\n        EGL14.EGL_BLUE_SIZE -> eglSettings?.blueSize\n        EGL14.EGL_ALPHA_SIZE -> eglSettings?.alphaSize\n        EGL14.EGL_DEPTH_SIZE -> eglSettings?.depthSize\n        EGL14.EGL_STENCIL_SIZE -> eglSettings?.stencilSize\n        EGL14.EGL_SAMPLE_BUFFERS -> eglSettings?.sampleBuffers\n        EGL14.EGL_SAMPLES -> eglSettings?.samples\n        else -> throw java.lang.IllegalStateException(\"Unexpected attribute ${attributeSlot.captured}\")\n      }\n\n      value?.let { valueSlot.captured[0] = it }\n\n      value != null\n    }\n  }\n\n  @Test\n  fun supportedConfigsTest() {\n    mockChooseConfig(eglSettings.map { it.eglConfig }.toTypedArray())\n    eglSettings.forEach(::mockEglConfigAttributes)\n\n    assertEquals(eglSettings.getOrNull(expectedEglSettingsIndex)?.eglConfig, eglConfigChooser.chooseConfig(mockk()))\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/FpsManagerTest.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.os.Handler\nimport android.os.Looper\nimport android.view.Choreographer\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.renderer.FpsManager.Companion.VSYNC_COUNT_TILL_IDLE\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.LooperMode\nimport org.robolectric.shadows.ShadowChoreographer\nimport java.util.concurrent.TimeUnit\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass FpsManagerTest {\n\n  private lateinit var fpsManager: FpsManager\n\n  @Before\n  fun setUp() {\n    fpsManager = FpsManager(Handler(Looper.getMainLooper()), mapName = \"\")\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logI(any(), any()) } just Runs\n    every { logW(any(), any()) } just Runs\n    // simulate all the tests on 60 Hz screen, meaning we have 16.6 ms time to render a frame\n    ShadowChoreographer.setPostFrameCallbackDelay(CHOREOGRAPHER_POST_FRAME_CALLBACK_DELAY_MS)\n    fpsManager.setScreenRefreshRate(SCREEN_FPS)\n  }\n\n  @Test\n  fun userRefreshRateNotSetTest() {\n    pauseHandler()\n    idleHandler(vsyncCount = 10) {\n      assert(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n  }\n\n  @Test\n  fun userRefreshRate24Test() {\n    fpsManager.setUserRefreshRate(24)\n    pauseHandler()\n    val frameRenderedPattern = mutableListOf<Boolean>()\n    idleHandler(vsyncCount = 10) {\n      frameRenderedPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      arrayOf(\n        false, false, true, false, true,\n        false, false, true, false, true\n      ),\n      frameRenderedPattern.toTypedArray()\n    )\n  }\n\n  @Test\n  fun userRefreshRate7Test() {\n    fpsManager.setUserRefreshRate(7)\n    pauseHandler()\n    val vsyncCount = 18\n    val frameRenderedPattern = mutableListOf<Boolean>()\n    idleHandler(vsyncCount = vsyncCount) {\n      frameRenderedPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      Array(vsyncCount) { it == 8 || it == 17 },\n      frameRenderedPattern.toTypedArray()\n    )\n  }\n\n  @Test\n  fun userRefreshRate3for2secondsTest() {\n    fpsManager.setUserRefreshRate(3)\n    pauseHandler()\n    val vsyncCount = 120\n    val frameRenderedPattern = mutableListOf<Boolean>()\n    idleHandler(vsyncCount = vsyncCount) {\n      frameRenderedPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      // 6 frames should be rendered in total during 2 seconds with 3 FPS\n      Array(vsyncCount) { it == 19 || it == 39 || it == 59 || it == 79 || it == 99 || it == 119 },\n      frameRenderedPattern.toTypedArray()\n    )\n  }\n\n  @Test\n  fun userRefreshRate1Test() {\n    fpsManager.setUserRefreshRate(1)\n    pauseHandler()\n    val vsyncCount = 120\n    val frameRenderedPattern = mutableListOf<Boolean>()\n    idleHandler(vsyncCount = vsyncCount) {\n      frameRenderedPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      Array(vsyncCount) { it == 59 || it == 119 },\n      frameRenderedPattern.toTypedArray()\n    )\n  }\n\n  @Test\n  fun userRefreshRateMaxIntTest() {\n    fpsManager.setUserRefreshRate(Int.MAX_VALUE)\n    pauseHandler()\n    val vsyncCount = 1000\n    val frameRenderedPattern = mutableListOf<Boolean>()\n    idleHandler(vsyncCount = vsyncCount) {\n      frameRenderedPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      Array(vsyncCount) { true },\n      frameRenderedPattern.toTypedArray()\n    )\n  }\n\n  @Test\n  fun userRefreshRateSameAsScreenRefreshRateTest() {\n    fpsManager.setUserRefreshRate(SCREEN_FPS)\n    pauseHandler()\n    val frameRenderedPattern = mutableListOf<Boolean>()\n    idleHandler(vsyncCount = 5 * SCREEN_FPS) {\n      frameRenderedPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      Array(5 * SCREEN_FPS) { true },\n      frameRenderedPattern.toTypedArray()\n    )\n  }\n\n  @Test\n  fun `user refresh rate changes mid render with listener`() {\n    val fpsValueArray = mutableListOf<Double>()\n    val fpsChangedListener = OnFpsChangedListener {\n      fpsValueArray.add(it)\n    }\n    fpsManager.fpsChangedListener = fpsChangedListener\n    pauseHandler()\n    val frameRenderedPattern = mutableListOf<Boolean>()\n    val vsyncCount = 90\n\n    // First set user refresh rate to be the same as screen refresh rate\n    fpsManager.setUserRefreshRate(SCREEN_FPS)\n    idleHandler(vsyncCount = vsyncCount) {\n      frameRenderedPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      Array(vsyncCount) { true },\n      frameRenderedPattern.toTypedArray()\n    )\n    Assert.assertEquals(1, fpsValueArray.size)\n    Assert.assertEquals(SCREEN_FPS.toDouble(), fpsValueArray.last(), EPS)\n\n    frameRenderedPattern.clear()\n\n    // Now change the user refresh ratio to be half of the screen refresh rate\n    fpsManager.setUserRefreshRate(SCREEN_FPS / 2)\n    // That triggers a new listener with the FPS value for the remaining 30 frames out of the 90 above\n    Assert.assertEquals(2, fpsValueArray.size)\n    Assert.assertEquals(SCREEN_FPS.toDouble(), fpsValueArray.last(), EPS)\n\n    // Now render vsyncCount frames with the new user refresh rate\n    idleHandler(vsyncCount = vsyncCount) {\n      frameRenderedPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      // We expect every other frame to be rendered (user SCREEN_FPS/2 FPS)\n      Array(vsyncCount) { it % 2 != 0 },\n      frameRenderedPattern.toTypedArray()\n    )\n    Assert.assertEquals(3, fpsValueArray.size)\n    Assert.assertEquals(SCREEN_FPS / 2.0, fpsValueArray.last(), EPS)\n\n    frameRenderedPattern.clear()\n\n    // Reset user refresh rate to be the same as screen one\n    fpsManager.setUserRefreshRate(SCREEN_FPS)\n    // That triggers a new listener with the FPS value for the remaining 30 frames out of the 90 above\n    Assert.assertEquals(4, fpsValueArray.size)\n    Assert.assertEquals(SCREEN_FPS / 2.0, fpsValueArray.last(), EPS)\n\n    idleHandler(vsyncCount = vsyncCount) {\n      frameRenderedPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      Array(vsyncCount) { true },\n      frameRenderedPattern.toTypedArray()\n    )\n    Assert.assertEquals(5, fpsValueArray.size)\n    Assert.assertEquals(SCREEN_FPS.toDouble(), fpsValueArray.last(), EPS)\n\n    fpsManager.onSurfaceDestroyed()\n    // One last FPS value for the remaining 30 frames out of the 90 above\n    Assert.assertEquals(6, fpsValueArray.size)\n    Assert.assertEquals(SCREEN_FPS.toDouble(), fpsValueArray.last(), EPS)\n  }\n\n  @Test\n  fun userFpsListenerTest() {\n    val fpsValueArray = mutableListOf<Double>()\n    val fpsChangedListener = OnFpsChangedListener {\n      fpsValueArray.add(it)\n    }\n    fpsManager.fpsChangedListener = fpsChangedListener\n    pauseHandler()\n    // render a bit more frames than screen frequency\n    idleHandler(vsyncCount = SCREEN_FPS + 10) {\n      assert(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    assert(fpsValueArray.size == 1)\n    Assert.assertEquals(SCREEN_FPS.toDouble(), fpsValueArray[0], EPS)\n  }\n\n  @Test\n  fun mapBecomeIdleDuringRenderingNoFpsListenerTest() {\n    mapIdleTest()\n  }\n\n  @Test\n  fun mapBecomeIdleDuringRenderingWithFpsListenerTest() {\n    var fpsValue = 0.0\n    val fpsChangedListener = OnFpsChangedListener {\n      fpsValue = it\n    }\n    fpsManager.fpsChangedListener = fpsChangedListener\n    mapIdleTest()\n    Assert.assertEquals(40.0, fpsValue, EPS)\n  }\n\n  private fun mapIdleTest() {\n    // pattern is [0, 1, 1, 1, 1]\n    fpsManager.setUserRefreshRate(48)\n    pauseHandler()\n    val frameRenderedBeforePattern = mutableListOf<Boolean>()\n    // first we render 3 frames\n    idleHandler(vsyncCount = 3) {\n      frameRenderedBeforePattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    // then we simulate map being IDLE for several vsync ticks - counters should be reset, fps should be reported\n    idleHandler(vsyncCount = VSYNC_COUNT_TILL_IDLE + 1) {}\n    val frameRenderedAfterPattern = mutableListOf<Boolean>()\n    // and render 5 more frames\n    idleHandler(vsyncCount = 5) {\n      frameRenderedAfterPattern.add(fpsManager.preRender(it))\n      fpsManager.postRender()\n    }\n    Assert.assertArrayEquals(\n      arrayOf(\n        false, true, true,\n        false, true, true, true, true\n      ),\n      frameRenderedBeforePattern.plus(frameRenderedAfterPattern).toTypedArray()\n    )\n  }\n\n  private fun pauseHandler() = Shadows.shadowOf(Looper.getMainLooper()).pause()\n\n  private fun idleHandler(vsyncCount: Int, actionOnVsync: ((Long) -> Unit)) {\n    val choreographer = Choreographer.getInstance()\n    val looper = Shadows.shadowOf(Looper.getMainLooper())\n    repeat(vsyncCount) {\n      choreographer.postFrameCallback(actionOnVsync)\n      looper.idleFor(CHOREOGRAPHER_POST_FRAME_CALLBACK_DELAY_MS.toLong(), TimeUnit.MILLISECONDS)\n    }\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  private companion object {\n    private const val EPS = 0.0001\n    private const val SCREEN_FPS = 60\n    private const val CHOREOGRAPHER_POST_FRAME_CALLBACK_DELAY_MS = 16\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/GLMapboxRenderThreadTest.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.opengl.EGL14\nimport android.opengl.EGLContext\nimport android.util.Log\nimport android.view.Surface\nimport com.mapbox.countDownEvery\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.renderer.MapboxRenderThread.Companion.RETRY_DELAY_MS\nimport com.mapbox.maps.renderer.egl.EGLCore\nimport com.mapbox.maps.renderer.gl.TextureRenderer\nimport com.mapbox.maps.shadows.ShadowLogThrottler\nimport com.mapbox.maps.viewannotation.ViewAnnotationUpdateMode\nimport com.mapbox.verifyNo\nimport com.mapbox.verifyOnce\nimport com.mapbox.waitZeroCounter\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.spyk\nimport io.mockk.unmockkAll\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport io.mockk.verifyOrder\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.Config\nimport org.robolectric.annotation.LooperMode\nimport org.robolectric.shadows.ShadowChoreographer\nimport org.robolectric.shadows.ShadowLog\nimport org.robolectric.shadows.ShadowLooper\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.locks.Condition\nimport java.util.concurrent.locks.ReentrantLock\n\n@RunWith(RobolectricTestRunner::class)\n@Config(\n  shadows = [\n    ShadowLogThrottler::class\n  ]\n)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass GLMapboxRenderThreadTest {\n\n  private lateinit var mapboxRenderThread: MapboxRenderThread\n  private lateinit var mapboxRenderer: MapboxRenderer\n  private lateinit var mapboxWidgetRenderer: MapboxWidgetRenderer\n  private lateinit var eglCore: EGLCore\n  private lateinit var renderHandlerThread: RenderHandlerThread\n  private lateinit var textureRenderer: TextureRenderer\n  private lateinit var surface: Surface\n  private lateinit var fpsManager: FpsManager\n  private lateinit var destroyCondition: Condition\n\n  private fun initRenderThread(mapboxRenderer: MapboxRenderer = mockk(relaxUnitFun = true)) {\n    this.mapboxRenderer = mapboxRenderer\n    mockEglCore()\n    mockWidgetRenderer()\n    renderHandlerThread = RenderHandlerThread(mapName = \"\")\n    textureRenderer = mockk(relaxed = true)\n    fpsManager = mockk(relaxUnitFun = true)\n    every { fpsManager.preRender(any()) } returns true\n    val surfaceProcessingLock = ReentrantLock()\n    destroyCondition = spyk(surfaceProcessingLock.newCondition())\n    mapboxRenderThread = GLMapboxRenderThread(\n      mapboxRenderer,\n      mapboxWidgetRenderer,\n      renderHandlerThread,\n      eglCore,\n      fpsManager,\n      textureRenderer,\n      surfaceProcessingLock,\n      createCondition = surfaceProcessingLock.newCondition(),\n      destroyCondition = destroyCondition\n    )\n    renderHandlerThread.start()\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    ShadowLog.stream = System.out\n    every { logE(any(), any()) } answers { Log.e(firstArg(), secondArg()) }\n    every { logW(any(), any()) } answers { Log.e(firstArg(), secondArg()) }\n    every { logI(any(), any()) } answers { Log.i(firstArg(), secondArg()) }\n    every { logI(any(), any(), any()) } answers { Log.i(firstArg(), secondArg()) }\n  }\n\n  private fun mockSurface() {\n    surface = mockk()\n    every { surface.isValid } returns true\n    every { surface.release() } just Runs\n  }\n\n  private fun mockWidgetRenderer() {\n    mapboxWidgetRenderer = mockk(relaxUnitFun = true)\n    every { mapboxWidgetRenderer.getTexture() } returns 0\n    every { mapboxWidgetRenderer.hasTexture() } returns false\n    every { mapboxWidgetRenderer.needRender } returns false\n    every { mapboxWidgetRenderer.hasWidgets() } returns false\n  }\n\n  private fun mockEglCore() {\n    eglCore = mockk(relaxUnitFun = true)\n    every { eglCore.eglNoSurface } returns mockk()\n    every { eglCore.eglContext } returns mockk()\n    every { eglCore.prepareEgl() } returns true\n    every { eglCore.createWindowSurface(any()) } returns mockk(relaxed = true)\n    every { eglCore.makeNothingCurrent() } returns true\n    every { eglCore.makeCurrent(any()) } returns true\n    every { eglCore.swapBuffers(any()) } returns EGL14.EGL_SUCCESS\n  }\n\n  private fun pauseHandler() = Shadows.shadowOf(renderHandlerThread.handler?.looper).pause()\n\n  /**\n   * advances system clock by [millis] and executes all the tasks posted by the advanced time\n   * by default millis = 0 (e.g. only tasks posted without delay are executed)\n   */\n  private fun idleHandler(\n    millis: Long = 0L\n  ) = Shadows.shadowOf(renderHandlerThread.handler?.looper).idleFor(millis, TimeUnit.MILLISECONDS)\n\n  private fun provideValidSurface() {\n    mockSurface()\n    mapboxRenderThread.onSurfaceCreated(surface, 1, 1)\n    idleHandler()\n  }\n\n  private fun mockCountdownRunnable(latch: CountDownLatch) =\n    mockk<Runnable>(relaxUnitFun = true).also {\n      every { it.run() } answers { latch.countDown() }\n    }\n\n  @After\n  fun cleanup() {\n    cleanupShadows()\n    renderHandlerThread.stop()\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    unmockkAll()\n  }\n\n  @Test\n  fun onSurfaceCreatedTest() {\n    initRenderThread()\n    provideValidSurface()\n    verifyOnce {\n      mapboxRenderer.createRenderer()\n      eglCore.makeNothingCurrent()\n      mapboxRenderer.onSurfaceChanged(1, 1)\n    }\n  }\n\n  @Test\n  fun onInvalidEglSurfaceNotCreateRenderer() {\n    initRenderThread()\n    every { eglCore.createWindowSurface(any()) } returns eglCore.eglNoSurface\n    provideValidSurface()\n    verifyNo {\n      mapboxRenderer.createRenderer()\n      mapboxRenderer.onSurfaceChanged(1, 1)\n    }\n  }\n\n  @Test\n  fun onInvalidSurfaceNotInitNativeRenderer() {\n    initRenderThread()\n    val surface = mockk<Surface>()\n    every { surface.isValid } returns false\n    mapboxRenderThread.onSurfaceCreated(surface, 1, 1)\n    idleHandler()\n    verifyNo {\n      mapboxRenderer.createRenderer()\n      mapboxRenderer.onSurfaceChanged(1, 1)\n    }\n  }\n\n  @Test\n  fun onEglCorePrepareFailNotInitNativeRenderer() {\n    initRenderThread()\n    every { eglCore.prepareEgl() } returns false\n    provideValidSurface()\n    verifyNo {\n      mapboxRenderer.createRenderer()\n      mapboxRenderer.onSurfaceChanged(1, 1)\n    }\n  }\n\n  @Test\n  fun onMakeCurrentErrorNotInitNativeRenderer() {\n    initRenderThread()\n    every { eglCore.makeCurrent(any()) } returns false\n    provideValidSurface()\n    verifyNo {\n      mapboxRenderer.createRenderer()\n      mapboxRenderer.onSurfaceChanged(1, 1)\n    }\n  }\n\n  @Test\n  fun onSurfaceSizeChangedTest() {\n    initRenderThread()\n    provideValidSurface()\n    pauseHandler()\n    mapboxRenderThread.onSurfaceSizeChanged(2, 2)\n    idleHandler()\n    verifyOnce {\n      mapboxRenderer.createRenderer()\n      mapboxRenderer.onSurfaceChanged(1, 1)\n      mapboxRenderer.onSurfaceChanged(2, 2)\n    }\n  }\n\n  @Test\n  fun onSurfaceSizeChangedWhileBusyTest() {\n    val mapboxRenderer: MapboxRenderer = mockk(relaxUnitFun = true)\n    initRenderThread(mapboxRenderer)\n    provideValidSurface()\n    pauseHandler()\n    mapboxRenderThread.onSurfaceSizeChanged(2, 2)\n    mapboxRenderThread.onSurfaceSizeChanged(1, 1)\n    idleHandler()\n    verifyOrder {\n      mapboxRenderer.createRenderer()\n      mapboxRenderer.onSurfaceChanged(1, 1)\n      mapboxRenderer.onSurfaceChanged(2, 2)\n      mapboxRenderer.onSurfaceChanged(1, 1)\n    }\n  }\n\n  @Test\n  fun onSurfaceSizeChangedSameSizeTest() {\n    initRenderThread()\n    provideValidSurface()\n    pauseHandler()\n    mapboxRenderThread.onSurfaceSizeChanged(1, 1)\n    idleHandler()\n    verifyOnce {\n      mapboxRenderer.createRenderer()\n      mapboxRenderer.onSurfaceChanged(1, 1)\n    }\n  }\n\n  @Test\n  fun onSurfaceWithActivityDestroyedAfterSurfaceTest() {\n    initRenderThread()\n    provideValidSurface()\n    waitZeroCounter {\n      countDownEvery { mapboxRenderer.destroyRenderer() }\n      mapboxRenderThread.onSurfaceDestroyed()\n      mapboxRenderThread.destroy()\n    }\n    verifyOnce { eglCore.release() }\n    verifyOnce { mapboxRenderer.destroyRenderer() }\n    verifyOnce { fpsManager.destroy() }\n    assertFalse(renderHandlerThread.isRunning)\n  }\n\n  @Test\n  fun onSurfaceWithActivityDestroyedBeforeSurfaceTest() {\n    initRenderThread()\n    provideValidSurface()\n    waitZeroCounter {\n      countDownEvery { mapboxRenderer.destroyRenderer() }\n      mapboxRenderThread.destroy()\n      mapboxRenderThread.onSurfaceDestroyed()\n    }\n    verifyOnce { eglCore.release() }\n    verifyOnce { mapboxRenderer.destroyRenderer() }\n    verifyOnce { fpsManager.destroy() }\n    assertFalse(renderHandlerThread.isRunning)\n  }\n\n  @Test\n  fun onDrawFrameSeparateRequestRender() {\n    initRenderThread()\n    provideValidSurface()\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    // one swap buffer for surface creation, two for not squashed render requests\n    verify(exactly = 3) {\n      eglCore.swapBuffers(any())\n    }\n    // make EGL context current only once when creating surface\n    verifyOnce {\n      eglCore.makeNothingCurrent()\n    }\n  }\n\n  @Test\n  fun needViewAnnotationSyncMapSynchronized() {\n    initRenderThread()\n    provideValidSurface()\n    val choreographerCallbackDelayMs = 16L\n    // static method so does not matter which thread is called from -\n    // we need this interval for our render thread\n    ShadowChoreographer.setPostFrameCallbackDelay(choreographerCallbackDelayMs.toInt())\n    pauseHandler()\n    mapboxRenderThread.viewAnnotationMode = ViewAnnotationUpdateMode.MAP_SYNCHRONIZED\n    mapboxRenderThread.needViewAnnotationSync = true\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler(choreographerCallbackDelayMs)\n    // buffers are already swapped once when surface was created\n    // they should not be swapped this frame N, they need to be swapped next frame N+1\n    verifyOnce {\n      eglCore.swapBuffers(any())\n    }\n    // we need another explicit IDLE call as we're performing Choreographer.getInstance().postFrameCallback\n    // inside doFrame we're already executing\n    idleHandler(choreographerCallbackDelayMs)\n    // we swap buffers for frame N+1\n    verify(exactly = 2) {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun needViewAnnotationSyncMapFixedDelay() {\n    initRenderThread()\n    provideValidSurface()\n    val choreographerCallbackDelayMs = 16L\n    // static method so does not matter which thread is called from -\n    // we need this interval for our render thread\n    ShadowChoreographer.setPostFrameCallbackDelay(choreographerCallbackDelayMs.toInt())\n    pauseHandler()\n    mapboxRenderThread.viewAnnotationMode = ViewAnnotationUpdateMode.MAP_FIXED_DELAY\n    mapboxRenderThread.needViewAnnotationSync = true\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler(choreographerCallbackDelayMs)\n    // buffers are already swapped once when surface was created\n    // they should be swapped on this frame N\n    verify(exactly = 2) {\n      eglCore.swapBuffers(any())\n    }\n    // we need another explicit IDLE call to make sure we don't have anything scheduled\n    idleHandler(choreographerCallbackDelayMs)\n    // count should be the same as we already swapped buffers for frame N\n    verify(exactly = 2) {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun onDrawFrameSquashedRequestRender() {\n    initRenderThread()\n    provideValidSurface()\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    // one swap buffer for surface creation, 2 render requests squash in one swap buffers call\n    verify(exactly = 2) {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun setUserRefreshRateTest() {\n    initRenderThread()\n    val userRefreshRate = 30\n    mapboxRenderThread.setUserRefreshRate(userRefreshRate)\n    idleHandler()\n    verifyOnce {\n      fpsManager.setUserRefreshRate(userRefreshRate)\n    }\n  }\n\n  @Test\n  fun pauseTest() {\n    initRenderThread()\n    provideValidSurface()\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    mapboxRenderThread.pause()\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    // one swap buffer for surface creation, one request render after pause is omitted\n    verify(exactly = 2) {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun resumeTestWithRequestRenderAtPause() {\n    initRenderThread()\n    provideValidSurface()\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    mapboxRenderThread.pause()\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    mapboxRenderThread.resume()\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    // render requests after pause do not swap buffer, we do it on resume if needed once\n    verify(exactly = 4) {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun resumeTestWithoutRequestRenderAtPause() {\n    initRenderThread()\n    provideValidSurface()\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    mapboxRenderThread.pause()\n    idleHandler()\n    mapboxRenderThread.resume()\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    // we always do extra render call on resume\n    verify(exactly = 4) {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  /**\n   * Test to validate that main thread is not locked when render thread destroy is run\n   * asynchronously.\n   */\n  @Test\n  fun destroySurfaceDestroyedBeforeTest() {\n    initRenderThread()\n    provideValidSurface()\n    mapboxRenderThread.onSurfaceDestroyed()\n    // Call `onSurfaceDestroyed` first so `destroy` can perform asynchronous clean up\n    mapboxRenderThread.destroy()\n    // we firstly release the lock and clean up async\n    verifyOrder {\n      destroyCondition.signal()\n      mapboxRenderer.destroyRenderer()\n      mapboxRenderer.map = null\n    }\n  }\n\n  /**\n   * Validate that `onSurfaceCreated` does not hang in main thread if render thread is destroyed\n   * asynchronously\n   */\n  @Test\n  fun surfaceCreatedDuringDestroyTest() {\n    initRenderThread()\n    provideValidSurface()\n    mapboxRenderThread.onSurfaceDestroyed()\n    mapboxRenderThread.destroy()\n    val someSurface = mockk<Surface>()\n    every { surface.isValid } returns true\n    every { surface.release() } just Runs\n    mapboxRenderThread.onSurfaceCreated(someSurface, 1, 1)\n    verifyOnce {\n      mapboxRenderer.onSurfaceChanged(any(), any())\n    }\n    // we firstly release the lock and clean up async\n    verifyOrder {\n      destroyCondition.signal()\n      mapboxRenderer.destroyRenderer()\n      mapboxRenderer.map = null\n    }\n  }\n\n  @Test\n  fun surfaceDestroyedDuringDestroyTest() {\n    initRenderThread()\n    provideValidSurface()\n    mapboxRenderThread.onSurfaceDestroyed()\n    mapboxRenderThread.destroy()\n    mapboxRenderThread.onSurfaceDestroyed()\n    verify(exactly = 2) {\n      eglCore.releaseSurface(any())\n    }\n    // we firstly release the lock and clean up async\n    verifyOrder {\n      destroyCondition.signal()\n      mapboxRenderer.destroyRenderer()\n      mapboxRenderer.map = null\n    }\n  }\n\n  @Test\n  fun noSurfaceDestroyedBeforeDestroyTest() {\n    initRenderThread()\n    provideValidSurface()\n    mapboxRenderThread.destroy()\n    // lock is held until render thread cleans up and stops itself\n    verifyOrder {\n      mapboxRenderer.destroyRenderer()\n      mapboxRenderer.map = null\n      destroyCondition.signal()\n    }\n  }\n\n  @Test\n  fun destroySurfaceNotProvidedTest() {\n    initRenderThread()\n    mapboxRenderThread.destroy()\n    // as no surface was provided, we did not either create nor destroy native renderer\n    verifyNo { mapboxRenderer.createRenderer() }\n    verifyNo { mapboxRenderer.destroyRenderer() }\n    // when native renderer was not created - destroy async\n    verifyOrder {\n      destroyCondition.signal()\n      mapboxRenderer.map = null\n    }\n  }\n\n  @Test\n  fun queueRenderEventTest() {\n    initRenderThread()\n    provideValidSurface()\n    val runnable = mockk<Runnable>(relaxUnitFun = true)\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(\n      RenderEvent(\n        runnable,\n        true,\n      )\n    )\n    assertEquals(1, mapboxRenderThread.renderEventQueue.size)\n    idleHandler()\n    assert(mapboxRenderThread.renderEventQueue.isEmpty())\n    verifyOnce { runnable.run() }\n    // one swap buffer from surface creation, one for custom event\n    verify(exactly = 2) {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun queueNonRenderEventTestNoVsync() {\n    initRenderThread()\n    provideValidSurface()\n    val runnable = mockk<Runnable>(relaxUnitFun = true)\n    mapboxRenderThread.awaitingNextVsync = false\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(\n      RenderEvent(\n        runnable,\n        false,\n      )\n    )\n    // we do not add non-render event to the queue\n    assert(mapboxRenderThread.nonRenderEventQueue.isEmpty())\n    // do not schedule any render requests explicitly\n    idleHandler()\n    verifyOnce { runnable.run() }\n    // one swap buffer from surface creation only\n    verifyOnce {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun queueNonRenderEventTestWithVsync() {\n    initRenderThread()\n    provideValidSurface()\n    val runnable = mockk<Runnable>(relaxUnitFun = true)\n    mapboxRenderThread.awaitingNextVsync = true\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(\n      RenderEvent(\n        runnable,\n        false,\n      )\n    )\n    // we add to the queue\n    assert(mapboxRenderThread.nonRenderEventQueue.size == 1)\n    // do not schedule any render requests explicitly\n    idleHandler()\n    // without explicit render event runnable should not be executed\n    verifyNo { runnable.run() }\n    mapboxRenderThread.awaitingNextVsync = false\n    pauseHandler()\n    // schedule render request\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    assert(mapboxRenderThread.nonRenderEventQueue.isEmpty())\n    // one swap buffer from surface creation + one for render request\n    verify(exactly = 2) {\n      eglCore.swapBuffers(any())\n    }\n    verifyOnce { runnable.run() }\n  }\n\n  @Test\n  fun queueNonRenderEventLoosingSurfaceTest() {\n    initRenderThread()\n    provideValidSurface()\n    val runnable = mockk<Runnable>(relaxUnitFun = true)\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(\n      RenderEvent(\n        runnable,\n        false,\n      )\n    )\n    // simulate render thread is not fully prepared, e.g. EGL context is lost\n    mapboxRenderThread.isRendererReady = false\n    idleHandler()\n    verifyNo { runnable.run() }\n    pauseHandler()\n    // simulate render thread is fully prepared again\n    mapboxRenderThread.isRendererReady = true\n    mapboxRenderThread.processAndroidSurface(surface, 1, 1)\n    // taking into account we try to reschedule event with some delay\n    idleHandler(RETRY_DELAY_MS)\n    // user's runnable is executed when thread is fully prepared again\n    verifyOnce { runnable.run() }\n  }\n\n  @Test\n  fun fpsListenerTest() {\n    initRenderThread()\n    mapboxRenderThread.fpsChangedListener = mockk()\n    provideValidSurface()\n    pauseHandler()\n    every { fpsManager.preRender(any()) } returns false\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    every { fpsManager.preRender(any()) } returns true\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    // one swap for surface creation and one more when preRender returns true\n    verify(exactly = 2) {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun sameFpsListenerTest() {\n    initRenderThread()\n    val fpsChangedListener = mockk<OnFpsChangedListener>()\n    provideValidSurface()\n    mapboxRenderThread.fpsChangedListener = fpsChangedListener\n    idleHandler()\n    mapboxRenderThread.fpsChangedListener = fpsChangedListener\n    idleHandler()\n    verifyOnce {\n      fpsManager.fpsChangedListener = fpsChangedListener\n    }\n  }\n\n  @Test\n  fun queueNonRenderEventAfterOnStop() {\n    initRenderThread()\n    provideValidSurface()\n    val runnable = mockk<Runnable>(relaxUnitFun = true)\n    mapboxRenderThread.awaitingNextVsync = false\n\n    // paused state\n    mapboxRenderThread.isRendererReady = false\n    mapboxRenderThread.pause()\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(\n      RenderEvent(\n        runnable,\n        false,\n      )\n    )\n    idleHandler()\n    // event should be added to the queue and not executed until `resume`\n    assertEquals(1, mapboxRenderThread.nonRenderEventQueue.size)\n    verifyNo { runnable.run() }\n\n    // resumed state\n    mapboxRenderThread.isRendererReady = true\n    mapboxRenderThread.resume()\n    idleHandler()\n    assertEquals(0, mapboxRenderThread.nonRenderEventQueue.size)\n    verifyOnce { runnable.run() }\n  }\n\n  @Test\n  fun surfaceCreatedCalledBeforeActivityStartTest() {\n    initRenderThread()\n    mapboxRenderThread.paused = true\n    provideValidSurface()\n    verifyOnce { mapboxRenderer.createRenderer() }\n    // EGL should be fully prepared\n    verifyNo { eglCore.releaseSurface(any()) }\n  }\n\n  @Test\n  fun snapshotsAreTakenAfterDrawAndBeforeSwapBuffers() {\n    initRenderThread()\n    provideValidSurface()\n\n    lateinit var runnable: Runnable\n    lateinit var runnable2: Runnable\n    lateinit var runnable3: Runnable\n    waitZeroCounter(startCounter = 3) {\n      runnable = mockCountdownRunnable(this)\n      runnable2 = mockCountdownRunnable(this)\n      runnable3 = mockCountdownRunnable(this)\n\n      pauseHandler()\n\n      mapboxRenderThread.queueRenderEvent(RenderEvent(runnable, true))\n      mapboxRenderThread.queueRenderEvent(RenderEvent(runnable2, true))\n      mapboxRenderThread.queueRenderEvent(RenderEvent(runnable3, true))\n\n      idleHandler()\n    }\n\n    verifyOrder {\n      mapboxRenderer.render()\n      runnable.run()\n      runnable2.run()\n      runnable3.run()\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun onSurfaceDestroyedWithRenderCallAfterTestSurfaceView() {\n    initRenderThread(mockk<MapboxSurfaceRenderer>(relaxUnitFun = true))\n    provideValidSurface()\n    mapboxRenderThread.onSurfaceDestroyed()\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    verifyNo {\n      // we do not destroy native renderer if it's stop and not destroy\n      mapboxRenderer.destroyRenderer()\n      eglCore.release()\n    }\n    // we clear only EGLSurface but not all EGL\n    verifyOnce { eglCore.releaseSurface(any()) }\n    // we notify fps manager\n    verifyOnce { fpsManager.onSurfaceDestroyed() }\n  }\n\n  @Test\n  fun onSurfaceDestroyedWithRenderCallAfterTestTextureView() {\n    initRenderThread(mockk<MapboxTextureViewRenderer>(relaxUnitFun = true))\n    provideValidSurface()\n    mapboxRenderThread.onSurfaceDestroyed()\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n\n    verifyOnce {\n      // we do destroy native renderer if it's stop (for texture renderer)\n      mapboxRenderer.destroyRenderer()\n      // we clear all EGL\n      eglCore.releaseSurface(any())\n      eglCore.release()\n      // we notify fps manager\n      fpsManager.onSurfaceDestroyed()\n    }\n  }\n\n  @Test\n  fun renderWithMaxFpsSet() {\n    initRenderThread()\n    provideValidSurface()\n    mapboxRenderThread.setUserRefreshRate(15)\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    // 1 swap when creating surface + 1 for request render call\n    verify(exactly = 2) {\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun onDrawDoesNotRenderWidgets() {\n    initRenderThread()\n    provideValidSurface()\n    every { mapboxWidgetRenderer.needRender } returns false\n    every { mapboxWidgetRenderer.getTexture() } returns 0\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    verifyNo {\n      mapboxWidgetRenderer.renderToFrameBuffer()\n      textureRenderer.render(any())\n    }\n  }\n\n  @Test\n  fun onDrawRendersWidgets() {\n    initRenderThread()\n    provideValidSurface()\n    val textureId = 1\n    every { mapboxWidgetRenderer.needRender } returns true\n    every { mapboxWidgetRenderer.hasWidgets() } returns true\n    every { mapboxWidgetRenderer.hasTexture() } returns true\n    every { mapboxWidgetRenderer.getTexture() } returns textureId\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    verify(exactly = 2) {\n      mapboxWidgetRenderer.renderToFrameBuffer()\n      textureRenderer.render(textureId)\n    }\n  }\n\n  @Test\n  fun onDrawRendersWidgetsBeforeMap() {\n    initRenderThread()\n    provideValidSurface()\n    val textureId = 1\n    every { mapboxWidgetRenderer.needRender } returns true\n    every { mapboxWidgetRenderer.hasWidgets() } returns true\n    every { mapboxWidgetRenderer.hasTexture() } returns true\n    every { mapboxWidgetRenderer.getTexture() } returns textureId\n    pauseHandler()\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    verifyOrder {\n      mapboxWidgetRenderer.renderToFrameBuffer()\n      mapboxRenderer.render()\n      textureRenderer.render(textureId)\n    }\n  }\n\n  @Test\n  fun onSurfaceCreatedWidgetsInitWidgetRender() {\n    initRenderThread()\n    val eglContext = mockk<EGLContext>()\n    every { eglCore.eglContext } returns eglContext\n    every { mapboxWidgetRenderer.hasWidgets() } returns true\n    provideValidSurface()\n    verifyOnce {\n      mapboxWidgetRenderer.setSharedContext(eglContext)\n    }\n  }\n\n  @Test\n  fun onSurfaceCreatedNoWidgetsNotInitWidgetRender() {\n    initRenderThread()\n    every { mapboxWidgetRenderer.hasWidgets() } returns false\n    provideValidSurface()\n    verifyNo {\n      mapboxWidgetRenderer.setSharedContext(any())\n    }\n  }\n\n  @Test\n  fun onEglCorePrepareFailNotInitWidgetRender() {\n    initRenderThread()\n    every { eglCore.prepareEgl() } returns false\n    provideValidSurface()\n    verifyNo {\n      mapboxWidgetRenderer.setSharedContext(any())\n    }\n  }\n\n  @Test\n  fun onInvalidSurfaceNotInitWidgetRender() {\n    initRenderThread()\n    val surface = mockk<Surface>()\n    every { surface.isValid } returns false\n    mapboxRenderThread.onSurfaceCreated(surface, 1, 1)\n    idleHandler()\n    verifyNo {\n      mapboxWidgetRenderer.setSharedContext(any())\n    }\n  }\n\n  @Test\n  fun onInvalidEglSurfaceNotInitWidgetRender() {\n    initRenderThread()\n    every { eglCore.createWindowSurface(any()) } returns eglCore.eglNoSurface\n    provideValidSurface()\n    verifyNo {\n      mapboxWidgetRenderer.setSharedContext(any())\n    }\n  }\n\n  @Test\n  fun onMakeCurrentErrorNotInitWidgetRender() {\n    initRenderThread()\n    every { eglCore.makeCurrent(any()) } returns false\n    provideValidSurface()\n    verifyNo {\n      mapboxWidgetRenderer.setSharedContext(any())\n    }\n  }\n\n  @Test\n  fun onDestroyClearsAllTasks() {\n    initRenderThread()\n    every { eglCore.makeCurrent(any()) } returns true\n    val runnables = listOf<Runnable>(\n      mockk(relaxUnitFun = true),\n      mockk(relaxUnitFun = true),\n      mockk(relaxUnitFun = true),\n    )\n    // first is render event, second and third are non-render events\n    val events = runnables.mapIndexed { i, runnable ->\n      RenderEvent(runnable, i == 0)\n    }\n\n    // simulate chained DESTROY events being added via scheduleTask on destroyRenderer call\n    every { mapboxRenderer.destroyRenderer() } answers {\n      events.forEach(mapboxRenderThread::queueRenderEvent)\n    }\n\n    provideValidSurface()\n    mapboxRenderThread.destroy()\n\n    verifyNo {\n      runnables.forEach { it.run() }\n    }\n  }\n\n  @Test\n  fun onAddRenderEventWhenSurfaceIsDestroyed() {\n    initRenderThread()\n    provideValidSurface()\n\n    lateinit var runnable: Runnable\n    lateinit var runnable2: Runnable\n    waitZeroCounter(startCounter = 2) {\n      runnable = mockCountdownRunnable(this)\n      runnable2 = mockCountdownRunnable(this)\n      mapboxRenderThread.onSurfaceDestroyed()\n\n      mapboxRenderThread.queueRenderEvent(RenderEvent(runnable, false))\n      mapboxRenderThread.queueRenderEvent(RenderEvent(runnable2, false))\n\n      mapboxRenderThread.onSurfaceCreated(surface, 1, 1)\n\n      // non-render events are posted with 50 millis delay when surface is destroyed\n      idleHandler(RETRY_DELAY_MS)\n    }\n\n    verify { runnable.run() }\n    verify { runnable2.run() }\n  }\n\n  @Test\n  fun contextLostTest() {\n    initRenderThread()\n    provideValidSurface()\n    pauseHandler()\n    every { eglCore.swapBuffers(any()) } returns EGL14.EGL_CONTEXT_LOST\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    every { eglCore.swapBuffers(any()) } returns EGL14.EGL_SUCCESS\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    verifyOrder {\n      // swap buffers for surface creation\n      eglCore.swapBuffers(any())\n      // swap buffers for EGL_CONTEXT_LOST\n      eglCore.swapBuffers(any())\n      // EGL and native renderer are recreated\n      mapboxRenderer.destroyRenderer()\n      eglCore.releaseSurface(any())\n      eglCore.release()\n      eglCore.prepareEgl()\n      mapboxRenderer.createRenderer()\n      // swap buffers for EGL_SUCCESS\n      eglCore.swapBuffers(any())\n    }\n    // however Android surface is not released\n    verifyNo {\n      surface.release()\n    }\n  }\n\n  @Test\n  fun anotherAndroidSurfaceProvidedTest() {\n    initRenderThread()\n    provideValidSurface()\n    val oldSurface = surface\n    // simulate Android providing new surface\n    surface = mockk(relaxUnitFun = true)\n    provideValidSurface()\n    // EGL and native renderer are recreated\n    verifyOrder {\n      mapboxRenderer.destroyRenderer()\n      eglCore.releaseSurface(any())\n      eglCore.release()\n      // old surface must be released to avoid memory leak\n      oldSurface.release()\n      eglCore.prepareEgl()\n      mapboxRenderer.createRenderer()\n    }\n  }\n\n  @Test(timeout = 10000) // Added timeout to ensure that if test fails, test does not hang forever.\n  fun onSurfaceWithActivityDestroyedBeforeSurfaceWithDestroyTaskInQueueTest() {\n    initRenderThread()\n    provideValidSurface()\n    waitZeroCounter {\n      val latch = this\n      // `destroyRenderer` should not schedule anything but even if it does - we make sure we do\n      // not execute it and clean up resources\n      every { mapboxRenderer.destroyRenderer() } answers {\n        renderHandlerThread.handler?.post {\n          Thread.sleep(500)\n          assert(false)\n        }\n      }\n      mapboxRenderThread.destroy()\n      mapboxRenderThread.onSurfaceDestroyed()\n      latch.countDown()\n    }\n    verifyOnce { eglCore.release() }\n    verifyOnce { mapboxRenderer.destroyRenderer() }\n    assertFalse(renderHandlerThread.isRunning)\n  }\n\n  @Test(timeout = 10000) // Added timeout to ensure that if test fails, test does not hang forever.\n  fun newAndroidSurfaceArriveWhenWaitingVsyncTest() {\n    initRenderThread()\n    val choreographerCallbackDelayMs = 16L\n    ShadowChoreographer.setPostFrameCallbackDelay(choreographerCallbackDelayMs.toInt())\n    mockSurface()\n    mapboxRenderThread.onSurfaceCreated(surface, 1, 1)\n    // make sure we prepareRenderFrame but do not yet swap buffers\n    idleHandler(choreographerCallbackDelayMs / 2)\n    // current surface becomes invalid\n    every { surface.isValid } returns false\n    // new valid surface arrives from Android\n    val validSurface = mockk<Surface>()\n    every { validSurface.isValid } returns true\n    mapboxRenderThread.onSurfaceCreated(\n      validSurface,\n      2,\n      2\n    )\n    // and we have time to process this new valid surface before doFrame is called on VSYNC\n    idleHandler(choreographerCallbackDelayMs / 4)\n    // finally we get to doFrame\n    idleHandler(choreographerCallbackDelayMs)\n    verifyOrder {\n      // initially we have created the native renderer instance as well as EGL\n      eglCore.prepareEgl()\n      eglCore.createWindowSurface(surface)\n      eglCore.makeCurrent(any())\n      mapboxRenderer.createRenderer()\n      // as new Android surface != current one - we perform releaseAll()\n      mapboxRenderer.destroyRenderer()\n      eglCore.release()\n      // and then recreate native renderer and EGL before scheduled swap\n      eglCore.prepareEgl()\n      eglCore.createWindowSurface(validSurface)\n      eglCore.makeCurrent(any())\n      mapboxRenderer.createRenderer()\n      // swap works OK with new EGLSurface already\n      eglCore.swapBuffers(any())\n    }\n  }\n\n  @Test\n  fun eglErrorTest() {\n    initRenderThread()\n    provideValidSurface()\n    pauseHandler()\n    every { eglCore.swapBuffers(any()) } returns EGL14.EGL_BAD_ALLOC\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    every { eglCore.swapBuffers(any()) } returns EGL14.EGL_SUCCESS\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    verifyOrder {\n      // swap buffers for surface creation\n      eglCore.swapBuffers(any())\n      // swap buffers for EGL_BAD_ALLOC\n      eglCore.swapBuffers(any())\n      // releasing EGL surface\n      eglCore.releaseSurface(any())\n      // because of creatingSurface=true argument\n      eglCore.makeNothingCurrent()\n      // create new EGL surface\n      eglCore.createWindowSurface(any())\n      // re-create the EGL context\n      eglCore.makeCurrent(any())\n      // swap buffers for EGL_SUCCESS\n      eglCore.swapBuffers(any())\n    }\n    // we do not destroy the native renderer\n    verifyNo {\n      mapboxRenderer.destroyRenderer()\n    }\n  }\n\n  @Test\n  fun noLogSpamDuringPauseTest() {\n    initRenderThread()\n    provideValidSurface()\n    mapboxRenderThread.pause()\n    // easiest way to simulate that Android surface is not valid\n    mapboxRenderThread.surface = null\n    mapboxRenderThread.isRendererReady = false\n    idleHandler()\n    // make sure we do not print any logI\n    every { logI(any(), any()) } answers { throw RuntimeException() }\n    // simulate engine sending request render while we are paused\n    mapboxRenderThread.queueRenderEvent(MapboxRenderer.repaintRenderEvent)\n    idleHandler()\n    every { logI(any(), any()) } answers { Log.i(firstArg(), secondArg()) }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun scheduleThreadServiceTypeResetCallsRendererOnMainThread() {\n    initRenderThread()\n\n    // Verify resetThreadServiceType was not called initially\n    verify(exactly = 0) { mapboxRenderer.resetThreadServiceType() }\n\n    // Schedule the thread service type reset\n    mapboxRenderThread.scheduleThreadServiceTypeReset()\n\n    // Advance time by the delay amount (300ms) and process delayed main thread tasks\n    ShadowLooper.runUiThreadTasksIncludingDelayedTasks()\n\n    // Verify that resetThreadServiceType was called exactly once on the renderer\n    verify(exactly = 1) { mapboxRenderer.resetThreadServiceType() }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/MapboxRendererTest.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.os.Handler\nimport android.os.HandlerThread\nimport android.os.Looper\nimport com.mapbox.maps.*\nimport com.mapbox.maps.renderer.gl.PixelReader\nimport com.mapbox.maps.renderer.widget.BitmapWidget\nimport com.mapbox.maps.renderer.widget.BitmapWidgetRenderer\nimport com.mapbox.maps.renderer.widget.WidgetPosition\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.LooperMode\nimport java.nio.ByteBuffer\nimport java.util.concurrent.atomic.AtomicBoolean\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\ninternal abstract class MapboxRendererTest {\n\n  protected lateinit var renderThread: MapboxRenderThread\n  protected lateinit var mapboxRenderer: MapboxRenderer\n\n  @Before\n  open fun setUp() {\n    renderThread = mockk(relaxUnitFun = true)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { logI(any(), any()) } just Runs\n    every { logW(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun setMapTest() {\n    val map = mockk<NativeMapImpl>(relaxUnitFun = true)\n    mapboxRenderer.setMap(map)\n    assert(mapboxRenderer.map == map)\n  }\n\n  @Test\n  fun scheduleRepaintTest() {\n    mapboxRenderer.scheduleRepaint()\n    verify {\n      renderThread.queueRenderEvent(\n        RenderEvent(\n          null,\n          true,\n        )\n      )\n    }\n  }\n\n  @Test\n  fun onStartTest() {\n    mapboxRenderer.onStart()\n    verify { renderThread.resume() }\n  }\n\n  @Test\n  fun onStopTest() {\n    mapboxRenderer.onStop()\n    verify { renderThread.pause() }\n  }\n\n  @Test\n  fun onResumeTest() {\n    mapboxRenderer.onResume()\n    verify { renderThread.scheduleThreadServiceTypeReset() }\n  }\n\n  @Test\n  fun setValidMaximumFpsTest() {\n    mapboxRenderer.setMaximumFps(10)\n    verify(exactly = 1) { renderThread.setUserRefreshRate(10) }\n  }\n\n  @Test\n  fun setMaximumFpsTest() {\n    mapboxRenderer.setMaximumFps(Int.MAX_VALUE)\n    verify(exactly = 1) { renderThread.setUserRefreshRate(Int.MAX_VALUE) }\n  }\n\n  @Test\n  fun setNegativeFpsTest() {\n    mapboxRenderer.setMaximumFps(-1)\n    verify(exactly = 0) { renderThread.setUserRefreshRate(any()) }\n  }\n\n  @Test\n  fun setZeroFpsTest() {\n    mapboxRenderer.setMaximumFps(0)\n    verify(exactly = 0) { renderThread.setUserRefreshRate(any()) }\n  }\n\n  @Test\n  fun queueEventTest() {\n    val event = mockk<Runnable>(relaxUnitFun = true)\n    mapboxRenderer.queueNonRenderEvent(event)\n    verify {\n      renderThread.queueRenderEvent(\n        RenderEvent(\n          event,\n          false,\n        )\n      )\n    }\n  }\n\n  @Test\n  fun queueRenderEventTest() {\n    val event = mockk<Runnable>(relaxUnitFun = true)\n    mapboxRenderer.queueRenderEvent(event)\n    verify {\n      renderThread.queueRenderEvent(\n        RenderEvent(\n          event,\n          true,\n        )\n      )\n    }\n  }\n\n  @Test\n  fun onSurfaceCreatedTest() {\n    val map = mockk<NativeMapImpl>(relaxUnitFun = true)\n    mapboxRenderer.map = map\n    mapboxRenderer.createRenderer()\n    verify { map.createRenderer() }\n  }\n\n  @Test\n  fun onSurfaceChangedTest() {\n    val map = mockk<NativeMapImpl>(relaxUnitFun = true)\n    mapboxRenderer.map = map\n    mapboxRenderer.onSurfaceChanged(1, 1)\n    verify { map.setSize(Size(1f, 1f)) }\n  }\n\n  @Test\n  fun onSurfaceDestroyedTest() {\n    val map = mockk<NativeMapImpl>(relaxUnitFun = true)\n    mapboxRenderer.map = map\n    mapboxRenderer.destroyRenderer()\n    verify { map.destroyRenderer() }\n  }\n\n  @Test\n  fun onDrawFrameTest() {\n    val map = mockk<NativeMapImpl>(relaxUnitFun = true)\n    mapboxRenderer.map = map\n    mapboxRenderer.render()\n    verify { map.render() }\n  }\n\n  @Test\n  fun onSnapshotSuccessSync() {\n    val pixelReader = mockk<PixelReader>(relaxed = true)\n    every { pixelReader.width } returns 1\n    every { pixelReader.height } returns 1\n    every { pixelReader.readPixels() } returns ByteBuffer.allocateDirect(1 * 1 * 4)\n    var handler: Handler\n    val handlerThread = HandlerThread(\"thread\").apply {\n      start()\n      handler = Handler(this.looper)\n    }\n    val event = slot<RenderEvent>()\n    every { renderThread.queueRenderEvent(capture(event)) } answers {\n      handler.post(event.captured.runnable!!)\n    }\n    mapboxRenderer.pixelReader = pixelReader\n    mapboxRenderer.readyForSnapshot = AtomicBoolean(true)\n    mapboxRenderer.onSurfaceChanged(1, 1)\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    mapboxRenderer.snapshot()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { pixelReader.readPixels() }\n    handlerThread.quit()\n  }\n\n  @Test\n  fun onSnapshotFailureSync() {\n    val pixelReader = mockk<PixelReader>(relaxed = true)\n    every { pixelReader.width } returns 1\n    every { pixelReader.height } returns 1\n    every { pixelReader.readPixels() } returns ByteBuffer.allocateDirect(1 * 1 * 4)\n    var handler: Handler\n    val handlerThread = HandlerThread(\"thread\").apply {\n      start()\n      handler = Handler(this.looper)\n    }\n    val event = slot<RenderEvent>()\n    every { renderThread.queueRenderEvent(capture(event)) } answers {\n      handler.post(event.captured.runnable!!)\n    }\n    mapboxRenderer.pixelReader = pixelReader\n    mapboxRenderer.readyForSnapshot = AtomicBoolean(false)\n    mapboxRenderer.onSurfaceChanged(1, 1)\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    mapboxRenderer.snapshot()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { pixelReader.readPixels() }\n    handlerThread.quit()\n  }\n\n  @Test\n  fun onSnapshotSuccessAsync() {\n    val pixelReader = mockk<PixelReader>(relaxed = true)\n    every { pixelReader.width } returns 1\n    every { pixelReader.height } returns 1\n    every { pixelReader.readPixels() } returns ByteBuffer.allocateDirect(1 * 1 * 4)\n    var handler: Handler\n    val handlerThread = HandlerThread(\"thread\").apply {\n      start()\n      handler = Handler(this.looper)\n    }\n    val event = slot<RenderEvent>()\n    every { renderThread.queueRenderEvent(capture(event)) } answers {\n      handler.post(event.captured.runnable!!)\n    }\n    mapboxRenderer.pixelReader = pixelReader\n    mapboxRenderer.readyForSnapshot = AtomicBoolean(true)\n    mapboxRenderer.onSurfaceChanged(1, 1)\n    val callback = MapView.OnSnapshotReady {\n      verify { pixelReader.readPixels() }\n      handlerThread.quit()\n    }\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    Shadows.shadowOf(handlerThread.looper).pause()\n    mapboxRenderer.snapshot(callback)\n    Shadows.shadowOf(handlerThread.looper).idle()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n  }\n\n  @Test\n  fun onSnapshotFailureAsync() {\n    val pixelReader = mockk<PixelReader>(relaxed = true)\n    every { pixelReader.width } returns 1\n    every { pixelReader.height } returns 1\n    every { pixelReader.readPixels() } returns ByteBuffer.allocateDirect(1 * 1 * 4)\n    var handler: Handler\n    val handlerThread = HandlerThread(\"thread\").apply {\n      start()\n      handler = Handler(this.looper)\n    }\n    val event = slot<RenderEvent>()\n    every { renderThread.queueRenderEvent(capture(event)) } answers {\n      throw AssertionError(\"Render event should not be queued when not ready for snapshot\")\n    }\n    mapboxRenderer.pixelReader = pixelReader\n    mapboxRenderer.readyForSnapshot = AtomicBoolean(false)\n    mapboxRenderer.onSurfaceChanged(1, 1)\n    val callback = MapView.OnSnapshotReady {\n      Assert.assertNull(it)\n      handlerThread.quit()\n    }\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    mapboxRenderer.snapshot(callback)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n  }\n\n  @Test\n  fun onDestroyTest() {\n    val mockWidget = mockk<BitmapWidget>()\n    val bitmapWidgetRenderer = BitmapWidgetRenderer(null, WidgetPosition { })\n    every { mockWidget.renderer } returns bitmapWidgetRenderer\n    every { mockWidget.setTriggerRepaintAction(any()) } just runs\n    val listener = OnFpsChangedListener { }\n    every { renderThread.fpsChangedListener } returns listener\n    mapboxRenderer.widgetRenderer.addWidget(mockWidget)\n    assertTrue(mapboxRenderer.widgetRenderer.hasWidgets())\n    mapboxRenderer.setOnFpsChangedListener(listener)\n    mapboxRenderer.onDestroy()\n    assertFalse(mapboxRenderer.widgetRenderer.hasWidgets())\n    verify { mockWidget.setTriggerRepaintAction(null) }\n    verify { renderThread.destroy() }\n    verify { renderThread.fpsChangedListener = null }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/MapboxSurfaceHolderRendererTest.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.view.SurfaceHolder\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.Before\nimport org.junit.Test\n\ninternal class MapboxSurfaceHolderRendererTest : MapboxRendererTest() {\n\n  private lateinit var surfaceHolderRenderer: MapboxSurfaceHolderRenderer\n  private lateinit var surfaceHolder: SurfaceHolder\n\n  @Before\n  override fun setUp() {\n    super.setUp()\n    surfaceHolder = mockk(relaxed = true)\n    mapboxRenderer = MapboxSurfaceHolderRenderer(renderThread)\n    surfaceHolderRenderer = MapboxSurfaceHolderRenderer(renderThread)\n  }\n\n  @Test\n  fun surfaceChangedTest() {\n    surfaceHolderRenderer.surfaceChanged(surfaceHolder, 0, 1, 1)\n    verify { renderThread.onSurfaceSizeChanged(1, 1) }\n  }\n\n  @Test\n  fun surfaceCreatedTest() {\n    surfaceHolderRenderer.surfaceCreated(surfaceHolder)\n    surfaceHolderRenderer.surfaceChanged(surfaceHolder, 0, 1, 1)\n    verify {\n      renderThread.onSurfaceCreated(surfaceHolder.surface, 1, 1)\n      renderThread.onSurfaceSizeChanged(1, 1)\n    }\n  }\n\n  @Test\n  fun surfaceDestroyedTest() {\n    surfaceHolderRenderer.surfaceDestroyed(surfaceHolder)\n    verify { renderThread.onSurfaceDestroyed() }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/MapboxSurfaceRendererTest.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.view.Surface\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.Before\nimport org.junit.Test\n\ninternal class MapboxSurfaceRendererTest : MapboxRendererTest() {\n\n  private lateinit var surfaceRenderer: MapboxSurfaceRenderer\n  private lateinit var surface: Surface\n\n  @Before\n  override fun setUp() {\n    super.setUp()\n    surface = mockk(relaxed = true)\n    mapboxRenderer = MapboxSurfaceRenderer(renderThread)\n    surfaceRenderer = MapboxSurfaceRenderer(renderThread)\n  }\n\n  @Test\n  fun surfaceChangedTest() {\n    surfaceRenderer.surfaceChanged(surface, 1, 1)\n    verify { renderThread.onSurfaceSizeChanged(1, 1) }\n  }\n\n  @Test\n  fun surfaceCreatedTest() {\n    surfaceRenderer.surfaceCreated()\n    surfaceRenderer.surfaceChanged(surface, 1, 1)\n    verify {\n      renderThread.onSurfaceCreated(surface, 1, 1)\n      renderThread.onSurfaceSizeChanged(1, 1)\n    }\n  }\n\n  @Test\n  fun surfaceDestroyedTest() {\n    surfaceRenderer.surfaceDestroyed()\n    verify { renderThread.onSurfaceDestroyed() }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/MapboxTextureViewRendererTest.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport android.graphics.SurfaceTexture\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.Before\nimport org.junit.Test\n\ninternal class MapboxTextureViewRendererTest : MapboxRendererTest() {\n\n  private lateinit var textureViewRenderer: MapboxTextureViewRenderer\n\n  @Before\n  override fun setUp() {\n    super.setUp()\n    mapboxRenderer = MapboxTextureViewRenderer(renderThread)\n    textureViewRenderer = MapboxTextureViewRenderer(renderThread)\n  }\n\n  @Test\n  fun onSurfaceTextureSizeChangedTest() {\n    textureViewRenderer.onSurfaceTextureAvailable(mockk(relaxed = true), 1, 1)\n    verify { renderThread.onSurfaceCreated(any(), 1, 1) }\n  }\n\n  @Test\n  fun onSurfaceTextureUpdatedTest() {\n    assert(true)\n  }\n\n  @Test\n  fun onSurfaceTextureDestroyedTest() {\n    val surfaceTexture = mockk<SurfaceTexture>(relaxUnitFun = true)\n    textureViewRenderer.onSurfaceTextureDestroyed(surfaceTexture)\n    verify { renderThread.onSurfaceDestroyed() }\n    verify { surfaceTexture.release() }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/RenderHandlerThreadTest.kt",
    "content": "package com.mapbox.maps.renderer\n\nimport com.mapbox.maps.logW\nimport com.mapbox.verifyNo\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertThrows\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.LooperMode\nimport java.time.Duration\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass RenderHandlerThreadTest {\n\n  private lateinit var renderHandlerThread: RenderHandlerThread\n\n  @Before\n  fun setUp() {\n    renderHandlerThread = RenderHandlerThread(mapName = \"\")\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    cleanupShadows()\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    renderHandlerThread.stop()\n  }\n\n  @Test\n  fun startTest() {\n    renderHandlerThread.start()\n    assert(renderHandlerThread.handler != null)\n    assert(renderHandlerThread.handlerThread.isAlive)\n    assert(renderHandlerThread.isRunning)\n  }\n\n  @Test\n  fun startStartTest() {\n    renderHandlerThread.start()\n    assertThrows(IllegalThreadStateException::class.java) {\n      renderHandlerThread.start()\n    }\n  }\n\n  @Test\n  fun startStopTest() {\n    renderHandlerThread.start()\n    renderHandlerThread.stop()\n    assert(renderHandlerThread.handler == null)\n  }\n\n  @Test\n  fun startStopStartTest() {\n    renderHandlerThread.start()\n    renderHandlerThread.stop()\n    assertThrows(IllegalThreadStateException::class.java) {\n      renderHandlerThread.start()\n    }\n  }\n\n  @Test\n  fun isRunningTest() {\n    with(renderHandlerThread) {\n      assert(!isRunning)\n      start()\n      assert(isRunning)\n      stop()\n      assert(!isRunning)\n    }\n  }\n\n  @Test\n  fun clearRenderEventQueueTest() {\n    renderHandlerThread.start()\n    renderHandlerThread.handler = mockk(relaxed = true)\n    renderHandlerThread.clearRenderEventQueue()\n    verify { renderHandlerThread.handler?.removeCallbacksAndMessages(null) }\n  }\n\n  @Test\n  fun postThreadNotStarted() {\n    val action = mockk<Runnable>(relaxed = true)\n    renderHandlerThread.post(action)\n    verifyNo { action.run() }\n  }\n\n  @Test\n  fun postThreadStopped() {\n    val actionOne = mockk<Runnable>(relaxed = true)\n    val actionTwo = mockk<Runnable>(relaxed = true)\n    val actionThree = mockk<Runnable>(relaxed = true)\n    val actionFour = mockk<Runnable>(relaxed = true)\n    renderHandlerThread.apply {\n      start()\n      val handlerLooperShadow = Shadows.shadowOf(renderHandlerThread.handlerThread.looper)\n      handlerLooperShadow.pause()\n      post(actionOne)\n      postDelayed(actionTwo, 50)\n      // Idle handler thread looper to run actionOne (0ms delay)\n      // but not actionTwo (50ms delay)\n      handlerLooperShadow.idleFor(Duration.ofMillis(40))\n      stop()\n      post(actionThree)\n      postDelayed(\n        actionFour,\n        50\n      )\n    }\n    verify { actionOne.run() }\n    // action two skipped because of using HandlerThread#quit() and not quitSafely()\n    verifyNo { actionTwo.run() }\n    verifyNo { actionThree.run() }\n    verifyNo { actionFour.run() }\n  }\n\n  @Test\n  fun postThreadStarted() {\n    val actionOne = mockk<Runnable>(relaxed = true)\n    val actionTwo = mockk<Runnable>(relaxed = true)\n    renderHandlerThread.start()\n    val handlerLooperShadow = Shadows.shadowOf(renderHandlerThread.handlerThread.looper)\n    renderHandlerThread.apply {\n      post(actionOne)\n      postDelayed(actionTwo, 50)\n    }\n    // Advance time by 50ms and idle to run both actions\n    handlerLooperShadow.idleFor(Duration.ofMillis(50))\n    verify { actionOne.run() }\n    verify { actionTwo.run() }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/renderer/widget/BitmapWidgetRendererTest.kt",
    "content": "package com.mapbox.maps.renderer.widget\n\nimport android.graphics.Bitmap\nimport android.opengl.GLES20\nimport android.opengl.GLUtils\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\ninternal class BitmapWidgetRendererTest {\n\n  private lateinit var renderer: BitmapWidgetRenderer\n  private lateinit var bitmap: Bitmap\n  private var genTexturesCallCount = 0\n\n  @Before\n  fun setUp() {\n    genTexturesCallCount = 0\n\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { logI(any(), any()) } just Runs\n    every { logW(any(), any()) } just Runs\n\n    mockkStatic(\"android.opengl.GLES20\")\n    mockkStatic(\"android.opengl.GLUtils\")\n\n    every { GLES20.glGetIntegerv(any(), any(), any()) } just Runs\n    every { GLES20.glCreateShader(any()) } returns 1\n    every { GLES20.glShaderSource(any(), any()) } just Runs\n    every { GLES20.glCompileShader(any()) } just Runs\n    every { GLES20.glGetShaderiv(any(), any(), any(), any()) } answers {\n      val params = arg<IntArray>(2)\n      params[0] = GLES20.GL_TRUE\n    }\n    every { GLES20.glCreateProgram() } returns 1\n    every { GLES20.glAttachShader(any(), any()) } just Runs\n    every { GLES20.glLinkProgram(any()) } just Runs\n    every { GLES20.glGetUniformLocation(any(), any()) } returns 1\n    every { GLES20.glGetAttribLocation(any(), any()) } returns 1\n    every { GLES20.glGetError() } returns GLES20.GL_NO_ERROR\n    every { GLES20.glGenTextures(any(), any<IntArray>(), any()) } answers {\n      val texArray = arg<IntArray>(1)\n      texArray[0] = 42 + genTexturesCallCount\n      genTexturesCallCount++\n    }\n    every { GLES20.glBindTexture(any(), any()) } just Runs\n    every { GLES20.glTexParameterf(any(), any(), any()) } just Runs\n    every { GLES20.glUniformMatrix4fv(any(), any(), any(), any()) } just Runs\n    every { GLES20.glUniform1i(any(), any()) } just Runs\n    every { GLES20.glEnableVertexAttribArray(any()) } just Runs\n    every { GLES20.glVertexAttribPointer(any(), any(), any(), any(), any(), any<java.nio.Buffer>()) } just Runs\n    every { GLES20.glDrawArrays(any(), any(), any()) } just Runs\n    every { GLES20.glDisableVertexAttribArray(any()) } just Runs\n    every { GLES20.glBindBuffer(any(), any()) } just Runs\n    every { GLES20.glUseProgram(any()) } just Runs\n    every { GLES20.glDeleteTextures(any(), any<IntArray>(), any()) } just Runs\n    every { GLES20.glDeleteProgram(any()) } just Runs\n    every { GLES20.glDeleteShader(any()) } just Runs\n    every { GLES20.glDetachShader(any(), any()) } just Runs\n    every { GLES20.glEnable(any()) } just Runs\n    every { GLES20.glBlendFunc(any(), any()) } just Runs\n    every { GLUtils.texImage2D(any(), any(), any<Bitmap>(), any()) } just Runs\n\n    bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)\n    renderer = BitmapWidgetRenderer(bitmap, WidgetPosition { })\n  }\n\n  @After\n  fun tearDown() {\n    unmockkStatic(\"android.opengl.GLES20\")\n    unmockkStatic(\"android.opengl.GLUtils\")\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun `release then re-render allocates fresh texture`() {\n    renderer.onSurfaceChanged(800, 600)\n    renderer.prepare()\n    renderer.render()\n\n    // First render should have called glGenTextures once\n    verify(exactly = 1) { GLES20.glGenTextures(1, any(), 0) }\n\n    // Release deletes the texture\n    renderer.release()\n    verify { GLES20.glDeleteTextures(any(), any<IntArray>(), any()) }\n\n    // Re-render after release: render() internally calls prepare() when program == 0,\n    // and should call glGenTextures again because textures[0] was reset to 0\n    renderer.onSurfaceChanged(800, 600)\n    renderer.render()\n\n    // glGenTextures should have been called a second time for the new texture\n    verify(exactly = 2) { GLES20.glGenTextures(1, any(), 0) }\n  }\n\n  @Test\n  fun `release sets needRender to false`() {\n    renderer.onSurfaceChanged(800, 600)\n    renderer.prepare()\n    assertTrue(renderer.needRender)\n    renderer.release()\n    assertFalse(renderer.needRender)\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/shadows/ShadowCancelable.java",
    "content": "package com.mapbox.maps.shadows;\n\n\nimport com.mapbox.common.Cancelable;\nimport org.robolectric.annotation.Implementation;\nimport org.robolectric.annotation.Implements;\n\n@Implements(Cancelable.class)\npublic class ShadowCancelable {\n    @Implementation\n    public void cancel() {\n\n    }\n}\n"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/shadows/ShadowCoordinateBounds.java",
    "content": "package com.mapbox.maps.shadows;\n\nimport com.mapbox.maps.CoordinateBounds;\nimport org.robolectric.annotation.Implementation;\nimport org.robolectric.annotation.Implements;\n\n/**\n * To avoid calling native method of CoordinateBounds, this shadow class\n * will be used for the Robolectric unit tests.\n */\n@Implements(CoordinateBounds.class)\npublic class ShadowCoordinateBounds {\n    @Implementation\n    public static double north() {\n        return 20.0;\n    }\n    @Implementation\n    public static double east() {\n        return 20.0;\n    }\n    @Implementation\n    public static double south() {\n        return 10.0;\n    }\n    @Implementation\n    public static double west() {\n        return 10.0;\n    }\n}\n"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/shadows/ShadowEventsService.kt",
    "content": "package com.mapbox.maps.shadows\n\nimport com.mapbox.common.EventsServerOptions\nimport com.mapbox.common.EventsService\nimport com.mapbox.common.FlushOperationResultCallback\nimport org.robolectric.annotation.Implementation\nimport org.robolectric.annotation.Implements\n\n@Implements(EventsService::class)\nclass ShadowEventsService {\n  @Implementation\n  fun flush(callback: FlushOperationResultCallback?) {\n    TODO(\"mocked implementation\")\n  }\n\n  companion object {\n    @Implementation\n    fun getOrCreate(options: EventsServerOptions): EventsService {\n      TODO(\"mocked implementation\")\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/shadows/ShadowLogThrottler.kt",
    "content": "package com.mapbox.maps.shadows\n\nimport com.mapbox.common.LogThrottler\nimport org.robolectric.annotation.Implements\n\n@Implements(LogThrottler::class)\npublic class ShadowLogThrottler"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/shadows/ShadowMapsResourceOptions.java",
    "content": "package com.mapbox.maps.shadows;\n\nimport com.mapbox.maps.MapsResourceOptions;\n\nimport org.robolectric.annotation.Implements;\n\n@Implements(MapsResourceOptions.class)\npublic class ShadowMapsResourceOptions {\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/shadows/ShadowObservable.java",
    "content": "package com.mapbox.maps.shadows;\n\nimport com.mapbox.maps.*;\n\nimport org.robolectric.annotation.*;\n\n@Implements(Observable.class)\npublic class ShadowObservable {\n}"
  },
  {
    "path": "maps-sdk/src/test/java/com/mapbox/maps/shadows/ShadowTelemetryService.kt",
    "content": "package com.mapbox.maps.shadows\n\nimport com.mapbox.common.EventsServerOptions\nimport com.mapbox.common.EventsService\nimport com.mapbox.common.FlushOperationResultCallback\nimport com.mapbox.common.TelemetryService\nimport org.robolectric.annotation.Implementation\nimport org.robolectric.annotation.Implements\n\n@Implements(TelemetryService::class)\nclass ShadowTelemetryService {\n  @Implementation\n  fun flush(callback: FlushOperationResultCallback?) {\n    TODO(\"mocked implementation\")\n  }\n\n  companion object {\n    @Implementation\n    fun getOrCreate(options: EventsServerOptions): EventsService {\n      TODO(\"mocked implementation\")\n    }\n  }\n}"
  },
  {
    "path": "maps-sdk/src/test/resources/robolectric.properties",
    "content": "sdk=28"
  },
  {
    "path": "metalava/README.md",
    "content": "## [Metalava](https://android.googlesource.com/platform/tools/metalava/) setup\n\nUse `$> make check-api` / `$> make update-api` from the [`Makefile`](https://github.com/mapbox/mapbox-maps-android/blob/main/Makefile) to interact. Make sure to run compile the SDK first so all deps (`jar`s) are available in the `classpath` and no errors are thrown.\n\n:warning: note that we need to update / push `api/current.txt` files after running `$> make update-api`. If there are changes / errors we're 🆗 with (e.g. `AddedMethod` changes are marked as errors but don't break SemVer) 🚀\n\n#### To update `metalava`\n\n```\n$> make update-metalava\nsh ./scripts/update_metalava.sh\n-n Cloning…\n Done\n-n Building…\n Done\n-e\nDependencies:\n\ncom.android.tools.external.org-jetbrains:uast:30.3.0-alpha08\ncom.android.tools.external.com-intellij:kotlin-compiler:30.3.0-alpha08\ncom.android.tools.external.com-intellij:intellij-core:30.3.0-alpha08\ncom.android.tools.lint:lint-api:30.3.0-alpha08\ncom.android.tools.lint:lint-checks:30.3.0-alpha08\ncom.android.tools.lint:lint-gradle:30.3.0-alpha08\ncom.android.tools.lint:lint:30.3.0-alpha08\ncom.android.tools:common:30.3.0-alpha08\ncom.android.tools:sdk-common:30.3.0-alpha08\ncom.android.tools:sdklib:30.3.0-alpha08\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10\norg.jetbrains.kotlin:kotlin-reflect:1.8.10\norg.ow2.asm:asm:8.0\norg.ow2.asm:asm-tree:8.0\ncom.google.guava:guava:30.1.1-jre\n```\n\n- That places the latest `metalava.jar` into this folder and prints out its deps 👀\n\n```groovy\n// Metalava isn't released yet. Check in its jar and explicitly track its transitive deps.\n```\n\n- Copy and paste (update) the new deps into [`gradle/metalava.gradle`](../gradle/metalava.gradle)"
  },
  {
    "path": "metalava/metalava.patch",
    "content": "diff --git a/build.gradle.kts b/build.gradle.kts\nindex 6f2499ba..11235cf6 100644\n--- a/build.gradle.kts\n+++ b/build.gradle.kts\n@@ -51,13 +51,13 @@ java {\n }\n \n tasks.withType(KotlinCompile::class.java) {\n-    sourceCompatibility = \"1.8\"\n-    targetCompatibility = \"1.8\"\n+//    sourceCompatibility = \"1.8\"\n+//    targetCompatibility = \"1.8\"\n \n     kotlinOptions {\n         jvmTarget = \"1.8\"\n-        apiVersion = \"1.6\"\n-        languageVersion = \"1.6\"\n+        apiVersion = \"1.8\"\n+        languageVersion = \"1.8\"\n         allWarningsAsErrors = true\n     }\n }\ndiff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml\nindex 00069cea..d6df5381 100644\n--- a/gradle/libs.versions.toml\n+++ b/gradle/libs.versions.toml\n@@ -1,5 +1,5 @@\n [versions]\n-kotlin = \"1.6.20\"\n+kotlin = \"1.8.10\"\n \n [libraries]\n kotlinStdlib = { module = \"org.jetbrains.kotlin:kotlin-stdlib-jdk8\", version.ref = \"kotlin\" }\ndiff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml\ndeleted file mode 100644\nindex d63300cf..00000000\n--- a/gradle/verification-metadata.xml\n+++ /dev/null\n@@ -1,212 +0,0 @@\n-<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n-<verification-metadata xmlns=\"https://schema.gradle.org/dependency-verification\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.1.xsd\">\n-   <configuration>\n-      <verify-metadata>true</verify-metadata>\n-      <verify-signatures>true</verify-signatures>\n-      <key-servers enabled=\"false\"/>\n-      <trusted-artifacts>\n-         <trust group=\"^com.android($|([.].*))\" regex=\"true\"/>\n-         <trust file=\".*-javadoc[.]jar\" regex=\"true\"/>\n-         <trust file=\".*-sources[.]jar\" regex=\"true\"/>\n-      </trusted-artifacts>\n-      <trusted-keys>\n-         <trusted-key id=\"04543577d6a9cc626239c50c7ecbd740ff06aeb5\">\n-            <trusting group=\"com.sun.xml.fastinfoset\"/>\n-            <trusting group=\"com.sun.istack\"/>\n-            <trusting group=\"org.glassfish.jaxb\"/>\n-            <trusting group=\"com.sun.xml.bind\"/>\n-            <trusting group=\"com.sun.xml.bind.mvn\"/>\n-            <trusting group=\"org.jvnet.staxex\"/>\n-         </trusted-key>\n-         <trusted-key id=\"0785b3eff60b1b1bea94e0bb7c25280eae63ebe5\" group=\"org.apache.httpcomponents\"/>\n-         <trusted-key id=\"08f0aab4d0c1a4bdde340765b341ddb020fcb6ab\" group=\"org.bouncycastle\"/>\n-         <trusted-key id=\"0cc641c3a62453ab390066c4a41f13c999945293\" group=\"commons-logging\"/>\n-         <trusted-key id=\"160a7a9cf46221a56b06ad64461a804f2609fd89\" group=\"com.github.shyiko.klob\"/>\n-         <trusted-key id=\"190d5a957ff22273e601f7a7c92c5fec70161c62\" group=\"org.apache\"/>\n-         <trusted-key id=\"19beab2d799c020f17c69126b16698a4adf4d638\" group=\"org.checkerframework\"/>\n-         <trusted-key id=\"1fa37fbe4453c1073e7ef61d6449005f96bc97a3\" group=\"de.undercouch\"/>\n-         <trusted-key id=\"2bcbdd0f23ea1cafcc11d4860374cf2e8dd1bdfd\">\n-            <trusting group=\"org.codehaus\"/>\n-            <trusting group=\"net.java\"/>\n-         </trusted-key>\n-         <trusted-key id=\"2db4f1ef0fa761ecc4ea935c86fdc7e2a11262cb\">\n-            <trusting group=\"commons-io\"/>\n-            <trusting group=\"commons-codec\"/>\n-            <trusting group=\"org.apache.commons\"/>\n-            <trusting group=\"xml-apis\"/>\n-         </trusted-key>\n-         <trusted-key id=\"2e3a1affe42b5f53af19f780bcf4173966770193\" group=\"org.jetbrains\"/>\n-         <trusted-key id=\"2e92113263fc31c74ccbaab20e91c2de43b72bb1\" group=\"org.ec4j.core\"/>\n-         <trusted-key id=\"31fae244a81d64507b47182e1b2718089ce964b8\" group=\"com.thoughtworks.qdox\"/>\n-         <trusted-key id=\"3d11126ea77e4e07fbabb38614a84c976d265b25\" group=\"com.google.protobuf\"/>\n-         <trusted-key id=\"3d5839a2262cbbfb\" group=\"org.jetbrains.kotlinx\"/>\n-         <trusted-key id=\"44fbdbbc1a00fe414f1c1873586654072ead6677\" group=\"org.sonatype.oss\"/>\n-         <trusted-key id=\"476634a4694e716a\" group=\"com.googlecode.java-diff-utils\"/>\n-         <trusted-key id=\"4db1a49729b053caf015cee9a6adfc93ef34893e\" group=\"org.hamcrest\"/>\n-         <trusted-key id=\"4f7e32d440ef90a83011a8fc6425559c47cc79c4\" group=\"com.sun.activation\"/>\n-         <trusted-key id=\"517b94f8d0a46317a28d8ab30da8a5ec02d11ead\" group=\"net.sf.jopt-simple\"/>\n-         <trusted-key id=\"51b52dc5dd452f92be342cc2858fc4c4f43856a3\" group=\"xerces\"/>\n-         <trusted-key id=\"5208812e1e4a6db0\" group=\"com.gradle\"/>\n-         <trusted-key id=\"55e770230e69cc6de143fb5b62c82e50836eb3ee\" group=\"com.github.gundy\"/>\n-         <trusted-key id=\"694621a7227d8d5289699830abe9f3126bb741c1\">\n-            <trusting group=\"com.google.guava\"/>\n-            <trusting group=\"com.google.jimfs\"/>\n-         </trusted-key>\n-         <trusted-key id=\"6a65176a0fb1cd0b\" group=\"org.codehaus.groovy\"/>\n-         <trusted-key id=\"6bdaca2c0493cca133b372d09c4f7e9d98b1cc53\" group=\"org.apache\"/>\n-         <trusted-key id=\"6dd3b8c64ef75253beb2c53ad908a43fb7ec07ac\">\n-            <trusting group=\"com.sun.activation\"/>\n-            <trusting group=\"jakarta.activation\"/>\n-         </trusted-key>\n-         <trusted-key id=\"6f538074ccebf35f28af9b066a0975f8b1127b83\" group=\"org.jetbrains.kotlin\"/>\n-         <trusted-key id=\"7615ad56144df2376f49d98b1669c4bb543e0445\" group=\"com.google.errorprone\"/>\n-         <trusted-key id=\"7616eb882daf57a11477aaf559a252fb1199d873\" group=\"com.google.code.findbugs\"/>\n-         <trusted-key id=\"7999befba1039e8b\" group=\"net.bytebuddy\"/>\n-         <trusted-key id=\"7c7d8456294423ba\" group=\"org.objenesis\"/>\n-         <trusted-key id=\"7faa0f2206de228f0db01ad741321490758aad6f\" group=\"org.codehaus.groovy\"/>\n-         <trusted-key id=\"8254180bfc943b816e0b5e2e5e2f2b3d474efe6b\" group=\"it.unimi.dsi\"/>\n-         <trusted-key id=\"8756c4f765c9ac3cb6b85d62379ce192d401ab61\">\n-            <trusting group=\"org.jetbrains.intellij.deps\"/>\n-            <trusting group=\"org.jetbrains.kotlinx\"/>\n-            <trusting group=\"com.github.javaparser\"/>\n-            <trusting group=\"info.picocli\"/>\n-         </trusted-key>\n-         <trusted-key id=\"90ee19787a7bcf6fd37a1e9180c08b1c29100955\" group=\"com.squareup\"/>\n-         <trusted-key id=\"9a259c7ee636c5ed\" group=\"com.google.errorprone\"/>\n-         <trusted-key id=\"a1b4460d8ba7b9af\" group=\"org.mockito\"/>\n-         <trusted-key id=\"a5bd02b93e7a40482eb1d66a5f69ad087600b22c\" group=\"org.ow2.asm\"/>\n-         <trusted-key id=\"aa70c7c433d501636392ec02153e7a3c2b4e5118\" group=\"org.eclipse.ee4j\"/>\n-         <trusted-key id=\"adbc987d1a7b91db6b0aaa81995efbf4a3d20beb\">\n-            <trusting group=\"com.pinterest.ktlint\"/>\n-            <trusting group=\"com.pinterest\"/>\n-         </trusted-key>\n-         <trusted-key id=\"afcc4c7594d09e2182c60e0f7a01b0f236e5430f\" group=\"com.google.code.gson\"/>\n-         <trusted-key id=\"b0f3710fa64900e7\" group=\"com.google.auto.value\"/>\n-         <trusted-key id=\"b6e73d84ea4fcc47166087253faad2cd5ecbb314\" group=\"org.apache.commons\"/>\n-         <trusted-key id=\"b801e2f8ef035068ec1139cc29579f18fa8fd93b\" group=\"com.google.j2objc\"/>\n-         <trusted-key id=\"bac30622339994c4\" group=\"com.google.truth\"/>\n-         <trusted-key id=\"bdb5fa4fe719d787fb3d3197f6d4a1d411e9d1ae\" group=\"com.google.guava\"/>\n-         <trusted-key id=\"c51e6cbc7ff46f0b\" group=\"com.google.auto\"/>\n-         <trusted-key id=\"c70b844f002f21f6d2b9c87522e44ac0622b91c3\" group=\"com.beust\"/>\n-         <trusted-key id=\"c7cb325467893cc4\" group=\"junit\"/>\n-         <trusted-key id=\"ce8075a251547bee249bc151a2115ae15f6b8b72\">\n-            <trusting group=\"org.apache.ant\"/>\n-            <trusting group=\"org.apache.commons\"/>\n-         </trusted-key>\n-         <trusted-key id=\"d041cad2e452550f\" group=\"com.google.protobuf\"/>\n-         <trusted-key id=\"d6f1bc78607808ec8e9f69437a8860944fad5f62\" group=\"org.apache.commons\"/>\n-         <trusted-key id=\"da7a1bb85b19e4fb05073431205c8673dc742c7c\" group=\"org.apache\"/>\n-         <trusted-key id=\"dcba03381ef6c89096acd985ac5ec74981f9cda6\" group=\"org.testng\"/>\n-         <trusted-key id=\"dddafa7674e54418\" group=\"org.testng\"/>\n-         <trusted-key id=\"e0130a3ed5a2079e\" group=\"org.webjars\"/>\n-         <trusted-key id=\"ea23db1360d9029481e7f2efecdfea3cb4493b94\" group=\"jline\"/>\n-         <trusted-key id=\"ee9e7dc9d92fc896\" group=\"com.google.errorprone\"/>\n-         <trusted-key id=\"efe8086f9e93774e\" group=\"junit\"/>\n-         <trusted-key id=\"f254b35617dc255d9344bcfa873a8e86b4372146\" group=\"org.apache\"/>\n-         <trusted-key id=\"fa77dcfef2ee6eb2debedd2c012579464d01c06a\" group=\"org.apache\"/>\n-         <trusted-key id=\"fa7929f83ad44c4590f6cc6815c71c0a4e0b8edd\" group=\"net.java.dev.jna\"/>\n-         <trusted-key id=\"fc411cd3cb7dcb0abc9801058118b3bcdb1a5000\" group=\"jakarta.xml.bind\"/>\n-         <trusted-key id=\"ff6e2c001948c5f2f38b0cc385911f425ec61b51\">\n-            <trusting group=\"junit\"/>\n-            <trusting group=\"org.junit\"/>\n-            <trusting group=\"org.junit.platform\"/>\n-            <trusting group=\"org.junit.jupiter\"/>\n-            <trusting group=\"org.opentest4j\"/>\n-         </trusted-key>\n-      </trusted-keys>\n-   </configuration>\n-   <components>\n-      <component group=\"com.googlecode.json-simple\" name=\"json-simple\" version=\"1.1\">\n-         <artifact name=\"json-simple-1.1.jar\">\n-            <sha256 value=\"2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-         <artifact name=\"json-simple-1.1.pom\">\n-            <sha256 value=\"47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"de.undercouch\" name=\"gradle-download-task\" version=\"4.1.1\">\n-         <artifact name=\"gradle-download-task-4.1.1.pom\">\n-            <ignored-keys>\n-               <ignored-key id=\"1fa37fbe4453c1073e7ef61d6449005f96bc97a3\" reason=\"PGP verification failed\"/>\n-            </ignored-keys>\n-            <sha256 value=\"85e6607260dbbdb5e85f1988840b0d9ac4be9119dde90a1baca8ea775646415a\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"javax.inject\" name=\"javax.inject\" version=\"1\">\n-         <artifact name=\"javax.inject-1.jar\">\n-            <sha256 value=\"91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-         <artifact name=\"javax.inject-1.pom\">\n-            <sha256 value=\"943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"net.sf.kxml\" name=\"kxml2\" version=\"2.3.0\">\n-         <artifact name=\"kxml2-2.3.0.jar\">\n-            <sha256 value=\"f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-         <artifact name=\"kxml2-2.3.0.pom\">\n-            <sha256 value=\"31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"org.jetbrains.intellij.deps\" name=\"trove4j\" version=\"1.0.20181211\">\n-         <artifact name=\"trove4j-1.0.20181211.jar\">\n-            <sha256 value=\"affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-         <artifact name=\"trove4j-1.0.20181211.pom\">\n-            <sha256 value=\"310a6aa2d90534c32b8f46f1fc98cd0edae95dcdfca23e2847e5efa9ae0c019a\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"org.jetbrains.kotlin.jvm\" name=\"org.jetbrains.kotlin.jvm.gradle.plugin\" version=\"1.6.20\">\n-         <artifact name=\"org.jetbrains.kotlin.jvm.gradle.plugin-1.6.20.pom\">\n-            <sha256 value=\"eb30990a12cace57fd1e2c0484fe482e0cdb9ba680e4b15996d9324495638903\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"org.mockito\" name=\"mockito-core\" version=\"3.4.6\">\n-         <artifact name=\"mockito-core-3.4.6.jar\">\n-            <sha256 value=\"1977fb3356258862b8373702de8818fb549f409298b9d4fe8339973879a89ea1\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-         <artifact name=\"mockito-core-3.4.6.pom\">\n-            <sha256 value=\"f0a883f76a8b484009119fab1319d9a96e1d76ee672cb979c2af5944d54597d3\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"org.ow2\" name=\"ow2\" version=\"1.5\">\n-         <artifact name=\"ow2-1.5.pom\">\n-            <sha256 value=\"0f8a1b116e760b8fe6389c51b84e4b07a70fc11082d4f936e453b583dd50b43b\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"org.ow2.asm\" name=\"asm-analysis\" version=\"7.0\">\n-         <artifact name=\"asm-analysis-7.0.jar\">\n-            <sha256 value=\"e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-         <artifact name=\"asm-analysis-7.0.pom\">\n-            <sha256 value=\"c6b54477e9d5bae1e7addff2e24cbf92aaff2ff08fd6bc0596c3933c3fadc2cb\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"org.ow2.asm\" name=\"asm-commons\" version=\"7.0\">\n-         <artifact name=\"asm-commons-7.0.jar\">\n-            <sha256 value=\"fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-         <artifact name=\"asm-commons-7.0.pom\">\n-            <sha256 value=\"f4c697886cdb4a5b2472054a0b5e34371e9b48e620be40c3ed48e1f4b6d51eb4\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"org.ow2.asm\" name=\"asm-util\" version=\"7.0\">\n-         <artifact name=\"asm-util-7.0.jar\">\n-            <sha256 value=\"75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-         <artifact name=\"asm-util-7.0.pom\">\n-            <sha256 value=\"e07bce4bb55d5a06f4c10d912fc9dee8a9b9c04ec549bbb8db4f20db34706f75\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"org.sonatype.oss\" name=\"oss-parent\" version=\"7\">\n-         <artifact name=\"oss-parent-7.pom\">\n-            <sha256 value=\"b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-      <component group=\"com.gradle\" name=\"gradle-enterprise-gradle-plugin\" version=\"3.6.3\">\n-         <artifact name=\"gradle-enterprise-gradle-plugin-3.6.3.pom\">\n-            <sha256 value=\"792024ac9c73fb240d1f0e1183adceca3527b97cc4e808fcea09e1b232d0acb7\" origin=\"Generated by Gradle\"/>\n-         </artifact>\n-      </component>\n-   </components>\n-</verification-metadata>\ndiff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties\nindex a49e9c4d..cefe9084 100644\n--- a/gradle/wrapper/gradle-wrapper.properties\n+++ b/gradle/wrapper/gradle-wrapper.properties\n@@ -4,4 +4,4 @@ distributionBase=GRADLE_USER_HOME\n distributionPath=wrapper/dists\n zipStoreBase=GRADLE_USER_HOME\n zipStorePath=wrapper/dists\n-distributionUrl=https\\://services.gradle.org/distributions/gradle-7.4-all.zip\n+distributionUrl=https\\://services.gradle.org/distributions/gradle-7.5-all.zip\ndiff --git a/gradlew b/gradlew\nindex e3a0ab04..f2290cd1 100755\n--- a/gradlew\n+++ b/gradlew\n@@ -72,7 +72,6 @@ if [ $darwin == \"true\" ]; then\n else\n     plat=\"linux\"\n fi\n-export JAVA_HOME=\"$APP_HOME/../../prebuilts/jdk/jdk11/$plat-x86\"\n # --------------------- end of metalava changes ------------------------\n\n # Determine the Java command to use to start the JVM.\n"
  },
  {
    "path": "metalava/update.sh",
    "content": "#!/bin/bash\n\nset -e\n\necho -n \"Cloning…\"\n\nif [ ! -d ./build/fake-aosp/tools/metalava ]; then\n    git clone -q https://android.googlesource.com/platform/tools/metalava/ ./build/fake-aosp/tools/metalava\nfi\n\n(\n    cd ./build/fake-aosp/tools/metalava\n\n    # Update in case the repo was already cloned.\n    git pull -q\n    echo \" Done\"\n\n    echo -n \"Building…\"\n    # Dev branch has JAVA_HOME defined in the project, if building from development branches,\n    # uncomment below to exclude JAVA_HOME export and use JAVA_HOME from local machine.\n#    sed '/^export JAVA_HOME=/d' gradlew > gradlew.temp\n#    mv gradlew.temp gradlew\n#    chmod a+x gradlew\n\n    # Pick the release tag you prefer,\n    # more detailed tags/versions can be found at https://android.googlesource.com/platform/tools/metalava/+refs\n    git checkout android13-s3-release\n    git apply ../../../../metalava/metalava.patch\n    ./gradlew jar --console=plain -q --no-daemon\n    find ../../out/metalava/libs ! -name '*full*' -type f -exec cp {} ../../../../metalava/metalava.jar \\;\n    echo \" Done\"\n\n    echo -e \"\\nDependencies:\\n\"\n    ./gradlew dependencies --no-daemon --configuration implementation | \\egrep '^.--- ' | cut -d' ' -f2\n)"
  },
  {
    "path": "module-telemetry/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.module.telemetry {\n\n  @com.mapbox.annotation.module.MapboxModule(type=com.mapbox.annotation.module.MapboxModuleType.MapTelemetry) public final class MapTelemetryImpl implements com.mapbox.maps.module.MapTelemetry {\n    ctor public MapTelemetryImpl(android.content.Context appContext);\n    method public void disableTelemetrySession();\n    method public void onAppUserTurnstileEvent();\n    method public void onPerformanceEvent(android.os.Bundle? data);\n    method public void setUserTelemetryRequestState(boolean enabled);\n  }\n\n}\n\n"
  },
  {
    "path": "module-telemetry/api/module-telemetry.api",
    "content": "public final class com/mapbox/maps/module/telemetry/MapTelemetryImpl : com/mapbox/maps/module/MapTelemetry {\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic fun disableTelemetrySession ()V\n\tpublic fun onAppUserTurnstileEvent ()V\n\tpublic fun onPerformanceEvent (Landroid/os/Bundle;)V\n\tpublic fun setUserTelemetryRequestState (Z)V\n}\n\npublic final class com/mapbox/module/Mapbox_MapTelemetryModuleConfiguration {\n\tpublic static final field INSTANCE Lcom/mapbox/module/Mapbox_MapTelemetryModuleConfiguration;\n\tpublic static final fun getEnableConfiguration ()Z\n\tpublic static final fun getImplClass ()Ljava/lang/Class;\n}\n\n"
  },
  {
    "path": "module-telemetry/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n  kotlin(\"kapt\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.module.telemetry\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    ndk {\n      val abi: String =\n        if (System.getenv(\"ANDROID_ABI\") != null) System.getenv(\"ANDROID_ABI\") else \"\"\n      if (abi.isNotBlank() && !project.hasProperty(\"android.injected.invoked.from.ide\")) {\n        abiFilters.add(abi)\n      }\n    }\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.module\"\n    artifactId = \"maps-telemetry\"\n    artifactTitle = \"Telemetry for the Mapbox Maps SDK\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-telemetry\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.mapbox.base)\n  implementation(libs.coroutines)\n  compileOnly(libs.mapbox.annotations)\n  kapt(libs.mapbox.annotationsProcessor)\n  implementation(libs.kotlin)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n  androidTestImplementation(libs.androidx.testJUnit)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "module-telemetry/src/androidTest/java/com/mapbox/maps/module/telemetry/MapTelemetryEventsServiceTest.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport android.util.Log\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.ConfigurationOptions\nimport com.mapbox.common.ConfigurationService\nimport com.mapbox.common.ConfigurationServiceError\nimport com.mapbox.common.ConfigurationServiceObserver\nimport com.mapbox.common.EventsServerOptions\nimport com.mapbox.common.EventsService\nimport com.mapbox.common.EventsServiceError\nimport com.mapbox.common.EventsServiceObserver\nimport com.mapbox.common.SdkInformation\nimport com.mapbox.common.TelemetryService\nimport com.mapbox.common.TelemetryUtils\nimport kotlinx.coroutines.Dispatchers\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\nprivate const val TAG = \"MapTelemetryEventsServi\"\n\n@RunWith(AndroidJUnit4::class)\nclass MapTelemetryEventsServiceTest {\n  private lateinit var eventsService: EventsService\n  private lateinit var telemetry: MapTelemetryImpl\n\n  @Before\n  fun setUp() {\n    eventsService = EventsService.getOrCreate(options)\n\n    val telemetryService = TelemetryService.getOrCreate()\n    val context = InstrumentationRegistry.getInstrumentation().context\n    telemetry = MapTelemetryImpl(context, eventsService, telemetryService, options, Dispatchers.Unconfined)\n  }\n\n  @Test\n  fun testSetUserTelemetryRequestStateDisabled() {\n    telemetry.userTelemetryRequestState = false\n    Assert.assertFalse(TelemetryUtils.getEventsCollectionState())\n  }\n\n  @Test\n  fun testSetUserTelemetryRequestStateEnabled() {\n    telemetry.userTelemetryRequestState = true\n    Assert.assertTrue(TelemetryUtils.getEventsCollectionState())\n  }\n\n  @Test\n  fun testDisableTelemetrySession() {\n    telemetry.disableTelemetrySession()\n    val observerErrors = mutableListOf<String>()\n    val eventsServiceObserver = object : EventsServiceObserver {\n      override fun didEncounterError(error: EventsServiceError, events: Value) {\n        Log.e(TAG, \"didEncounterError() called with: error = $error, events = $events\")\n        observerErrors.add(\"We should not reach this. No errors should have been encountered\")\n      }\n\n      override fun didSendEvents(events: Value) {\n        Log.e(TAG, \"didSendEvents() called with: events = $events\")\n        observerErrors.add(\"We should not reach this. No events should have been sent!\")\n      }\n    }\n\n    eventsService.registerObserver(eventsServiceObserver)\n    try {\n      // Try to send events while being disabled\n      repeat(TEST_ITERATIONS) {\n        telemetry.onPerformanceEvent(null)\n      }\n\n      var flushResult: Expected<String, None>? = null\n      val flushLatch = CountDownLatch(1)\n      eventsService.flush {\n        flushResult = it\n        flushLatch.countDown()\n      }\n\n      Assert.assertTrue(flushLatch.await(1_000L, TimeUnit.MILLISECONDS))\n      Assert.assertEquals(\n        \"Failed to flush 0 event(s): events dispatch disabled\",\n        flushResult!!.error\n      )\n      Assert.assertTrue(\"Errors found: $observerErrors\", observerErrors.isEmpty())\n    } finally {\n      eventsService.unregisterObserver(eventsServiceObserver)\n    }\n  }\n\n  @Test\n  @Throws(InterruptedException::class, TimeoutException::class)\n  fun testPerformanceEvent() {\n    telemetry.userTelemetryRequestState = true\n    val latch = CountDownLatch(TEST_ITERATIONS)\n    val eventsServiceObserver = object : EventsServiceObserver {\n      override fun didEncounterError(error: EventsServiceError, events: Value) {\n        Log.w(TAG, \"didEncounterError() called with: error = $error, events = $events\")\n        throw RuntimeException(\"Failed to send events\")\n      }\n\n      override fun didSendEvents(eventsValue: Value) {\n        val events = eventsValue.contents as ArrayList<*>\n        repeat(events.size) { latch.countDown() }\n      }\n    }\n\n    eventsService.registerObserver(eventsServiceObserver)\n\n    try {\n      repeat(TEST_ITERATIONS) {\n        telemetry.onPerformanceEvent(null)\n      }\n\n      var flushResult: Expected<String, None>? = null\n      val flushLatch = CountDownLatch(1)\n      eventsService.flush {\n        flushResult = it\n        flushLatch.countDown()\n      }\n      Assert.assertTrue(flushLatch.await(1_000L, TimeUnit.MILLISECONDS))\n      Assert.assertNull(flushResult!!.error)\n      Assert.assertEquals(None.getInstance(), flushResult!!.value)\n\n      Assert.assertTrue(latch.await(10_000, TimeUnit.MILLISECONDS))\n    } finally {\n      eventsService.unregisterObserver(eventsServiceObserver)\n    }\n  }\n\n  companion object {\n    private const val TEST_ITERATIONS = 190\n\n    private val options = EventsServerOptions(\n      SdkInformation(\"empty\", \"empty\", \"com.mapbox.maps.module.telemetry.test\"),\n      null\n    )\n\n    @BeforeClass\n    @JvmStatic\n    fun waitForValidConfiguration() {\n      val configurationUpdateLatch = CountDownLatch(1)\n      val configurationLatch = CountDownLatch(1)\n      var configurationResult: Expected<ConfigurationServiceError, ConfigurationOptions>? = null\n      val configurationService = ConfigurationService.getOrCreate(options)\n      val configurationObserver = object : ConfigurationServiceObserver {\n        override fun didStartUpdate() {\n          Log.d(TAG, \"didStartUpdate() called\")\n        }\n\n        override fun didUpdate(options: ConfigurationOptions) {\n          Log.d(TAG, \"didUpdate() called with: options = $options\")\n          configurationUpdateLatch.countDown()\n        }\n\n        override fun didEncounterError(error: ConfigurationServiceError) {\n          Log.d(TAG, \"didEncounterError() called with: error = $error\")\n        }\n      }\n      configurationService.registerObserver(configurationObserver)\n      configurationService.getConfig {\n        Log.d(TAG, \"setUp: configuration result ${it.value} or ${it.error}\")\n        configurationResult = it\n        configurationLatch.countDown()\n      }\n\n      Assert.assertTrue(configurationLatch.await(10_000L, TimeUnit.MILLISECONDS))\n      if (configurationResult!!.isError) {\n        // If there's no configuration let's wait for an update...\n        Assert.assertTrue(configurationUpdateLatch.await(30_000L, TimeUnit.MILLISECONDS))\n      }\n      configurationService.unregisterObserver(configurationObserver)\n    }\n  }\n}"
  },
  {
    "path": "module-telemetry/src/main/java/com/mapbox/maps/module/telemetry/MapBaseEvent.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport android.annotation.SuppressLint\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Base event class for telemetry events.\n */\n@SuppressLint(\"ParcelCreator\")\ninternal abstract class MapBaseEvent(phoneState: PhoneState) {\n  @SerializedName(\"event\")\n  val event: String\n\n  @SerializedName(\"created\")\n  val created: String\n\n  init {\n    event = this.getEventName()\n    created = phoneState.created\n  }\n\n  abstract fun getEventName(): String\n}"
  },
  {
    "path": "module-telemetry/src/main/java/com/mapbox/maps/module/telemetry/MapEventFactory.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport android.os.Bundle\nimport com.mapbox.common.TelemetrySystemUtils\n\ninternal object MapEventFactory {\n  fun buildMapLoadEvent(phoneState: PhoneState): MapLoadEvent {\n    val userId = TelemetrySystemUtils.obtainUniversalUniqueIdentifier()\n    return MapLoadEvent(userId, phoneState)\n  }\n\n  fun buildPerformanceEvent(\n    phoneState: PhoneState,\n    sessionId: String,\n    data: Bundle\n  ): PerformanceEvent {\n    return PerformanceEvent(phoneState, sessionId, data)\n  }\n}"
  },
  {
    "path": "module-telemetry/src/main/java/com/mapbox/maps/module/telemetry/MapLoadEvent.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport android.annotation.SuppressLint\nimport android.os.Build\nimport androidx.annotation.RestrictTo\nimport com.google.gson.annotations.SerializedName\nimport com.mapbox.maps.base.BuildConfig\n\n/**\n * Event will be sent while map is loaded.\n */\n@SuppressLint(\"ParcelCreator\")\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapLoadEvent(\n  @field:SerializedName(\"userId\") val userId: String?,\n  phoneState: PhoneState\n) :\n  MapBaseEvent(phoneState) {\n  @SerializedName(\"operatingSystem\")\n  val operatingSystem: String? = \"Android - \" + Build.VERSION.RELEASE\n\n  @SerializedName(\"sdkIdentifier\")\n  val sdkIdentifier =\n    BuildConfig.MAPBOX_SDK_IDENTIFIER\n\n  @SerializedName(\"sdkVersion\")\n  val sdkVersion =\n    BuildConfig.MAPBOX_SDK_VERSION\n\n  @SerializedName(\"model\")\n  val model: String = Build.MODEL\n\n  @SerializedName(\"carrier\")\n  val carrier: String? = phoneState.carrier\n\n  @SerializedName(\"cellularNetworkType\")\n  val cellularNetworkType: String? = phoneState.cellularNetworkType\n\n  @SerializedName(\"orientation\")\n  val orientation: String = phoneState.orientation.orientation\n\n  @SerializedName(\"resolution\")\n  val resolution: Float = phoneState.resolution\n\n  @SerializedName(\"accessibilityFontScale\")\n  val accessibilityFontScale: Float = phoneState.accessibilityFontScale\n\n  @SerializedName(\"batteryLevel\")\n  val batteryLevel: Int = phoneState.batteryLevel\n\n  @SerializedName(\"pluggedIn\")\n  val isPluggedIn: Boolean = phoneState.isPluggedIn\n\n  @SerializedName(\"wifi\")\n  val isWifi: Boolean = phoneState.isWifi\n\n  override fun getEventName(): String {\n    return EVENT_NAME\n  }\n\n  override fun equals(other: Any?): Boolean {\n    if (this === other) {\n      return true\n    }\n    if (other == null || javaClass != other.javaClass) {\n      return false\n    }\n    val that = other as MapLoadEvent\n    if (event != that.event) {\n      return false\n    }\n    if (created != that.created) {\n      return false\n    }\n    if (that.resolution.compareTo(resolution) != 0) {\n      return false\n    }\n    if (that.accessibilityFontScale.compareTo(accessibilityFontScale) != 0) {\n      return false\n    }\n    if (batteryLevel != that.batteryLevel) {\n      return false\n    }\n    if (isPluggedIn != that.isPluggedIn) {\n      return false\n    }\n    if (isWifi != that.isWifi) {\n      return false\n    }\n    if (operatingSystem != that.operatingSystem) {\n      return false\n    }\n    if (sdkIdentifier != that.sdkIdentifier) {\n      return false\n    }\n    if (sdkVersion != that.sdkVersion) {\n      return false\n    }\n    if (model != that.model) {\n      return false\n    }\n    if (userId != that.userId) {\n      return false\n    }\n    if (carrier != that.carrier) {\n      return false\n    }\n    return if (cellularNetworkType != that.cellularNetworkType) {\n      false\n    } else orientation == that.orientation\n  }\n\n  override fun hashCode(): Int {\n    var result = operatingSystem?.hashCode() ?: 0\n    result = 31 * result + event.hashCode()\n    result = 31 * result + created.hashCode()\n    result = 31 * result + sdkIdentifier.hashCode()\n    result = 31 * result + sdkVersion.hashCode()\n    result = 31 * result + model.hashCode()\n    result = 31 * result + (userId?.hashCode() ?: 0)\n    result = 31 * result + (carrier?.hashCode() ?: 0)\n    result = 31 * result + (cellularNetworkType?.hashCode() ?: 0)\n    result = 31 * result + orientation.hashCode()\n    result =\n      31 * result + if (resolution != +0.0f) java.lang.Float.floatToIntBits(resolution) else 0\n    result = 31 * result + if (accessibilityFontScale != +0.0f) java.lang.Float.floatToIntBits(\n      accessibilityFontScale\n    ) else 0\n    result = 31 * result + batteryLevel\n    result = 31 * result + if (isPluggedIn) 1 else 0\n    result = 31 * result + if (isWifi) 1 else 0\n    return result\n  }\n\n  override fun toString(): String {\n    return (\n      \"MapLoadEvent{\" +\n        \", operatingSystem='\" + operatingSystem + '\\'' +\n        \", sdkIdentifier='\" + sdkIdentifier + '\\'' +\n        \", sdkVersion='\" + sdkVersion + '\\'' +\n        \", model='\" + model + '\\'' +\n        \", userId='\" + userId + '\\'' +\n        \", carrier='\" + carrier + '\\'' +\n        \", cellularNetworkType='\" + cellularNetworkType + '\\'' +\n        \", orientation='\" + orientation + '\\'' +\n        \", resolution=\" + resolution +\n        \", accessibilityFontScale=\" + accessibilityFontScale +\n        \", batteryLevel=\" + batteryLevel +\n        \", pluggedIn=\" + isPluggedIn +\n        \", wifi=\" + isWifi +\n        '}'\n      )\n  }\n\n  companion object {\n    private const val EVENT_NAME = \"map.load\"\n  }\n}"
  },
  {
    "path": "module-telemetry/src/main/java/com/mapbox/maps/module/telemetry/MapTelemetryImpl.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport android.content.Context\nimport android.os.Bundle\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.google.gson.Gson\nimport com.mapbox.annotation.module.MapboxModule\nimport com.mapbox.annotation.module.MapboxModuleType\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.Event\nimport com.mapbox.common.EventPriority\nimport com.mapbox.common.EventsServerOptions\nimport com.mapbox.common.EventsService\nimport com.mapbox.common.EventsServiceInterface\nimport com.mapbox.common.SdkInformation\nimport com.mapbox.common.TelemetryCollectionState\nimport com.mapbox.common.TelemetryService\nimport com.mapbox.common.TelemetryUtils\nimport com.mapbox.common.TurnstileEvent\nimport com.mapbox.common.UserSKUIdentifier\nimport com.mapbox.maps.base.BuildConfig\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.module.MapTelemetry\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.launch\nimport java.util.UUID\n\n/**\n * Concrete implementation of map telemetry.\n */\n@MapboxModule(MapboxModuleType.MapTelemetry)\nclass MapTelemetryImpl : MapTelemetry {\n\n  private val appContext: Context\n  private val eventsService: EventsServiceInterface\n  // We need telemetryService for location and metrics events which will be sent automatically if telemetryService is initialized.\n  private val telemetryService: TelemetryService\n  private val eventsServiceOptions: EventsServerOptions\n\n  /**\n   * [CoroutineScope] that runs on IO dispatcher by default.\n   */\n  private val bgScope: CoroutineScope\n\n  /**\n   * Creates a map telemetry instance using application context\n   *\n   * @param appContext the application context\n   */\n  constructor(appContext: Context) {\n    this.appContext = appContext\n\n    eventsServiceOptions = EventsServerOptions(\n      SdkInformation(\n        BuildConfig.MAPBOX_SDK_IDENTIFIER,\n        BuildConfig.MAPBOX_SDK_VERSION,\n        null\n      ),\n      null\n    )\n    this.eventsService = EventsService.getOrCreate(eventsServiceOptions)\n    this.telemetryService = TelemetryService.getOrCreate()\n    bgScope = CoroutineScope(CoroutineName(TAG) + SupervisorJob() + Dispatchers.IO)\n  }\n\n  /**\n   * Creates a map telemetry instance using telemetry, application context and access token\n   *\n   * @param appContext the application context\n   * @param eventsService the mapbox EventsServiceInterface\n   * @param telemetryService the mapbox TelemetryService\n   */\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal constructor(\n    appContext: Context,\n    eventsService: EventsServiceInterface,\n    telemetryService: TelemetryService,\n    eventsServerOptions: EventsServerOptions,\n    defaultCoroutineDispatcher: CoroutineDispatcher,\n  ) {\n    this.appContext = appContext\n    this.eventsService = eventsService\n    this.telemetryService = telemetryService\n    this.eventsServiceOptions = eventsServerOptions\n    bgScope = CoroutineScope(CoroutineName(TAG) + SupervisorJob() + defaultCoroutineDispatcher)\n  }\n\n  /**\n   * Register the app user turnstile event\n   */\n  override fun onAppUserTurnstileEvent() {\n    eventsService.sendTurnstileEvent(TurnstileEvent(UserSKUIdentifier.MAPS_MAUS)) { response ->\n      if (response.isError) {\n        logE(TAG, \"sendTurnstileEvent error: ${response.error}\")\n      }\n    }\n\n    if (shouldSendEvents()) {\n      sendMapLoadEvent()\n    }\n  }\n\n  private fun sendMapLoadEvent() {\n    bgScope.launch {\n      try {\n        val mapLoadEvent = MapEventFactory.buildMapLoadEvent(PhoneState(appContext))\n        sendEvent(Gson().toJson(mapLoadEvent))\n      } catch (e: Throwable) {\n        logW(TAG, \"sendMapLoadEvent error: $e\")\n      }\n    }\n  }\n\n  private fun shouldSendEvents() = TelemetryUtils.getClientServerEventsCollectionState() != TelemetryCollectionState.TURNSTILE_EVENTS_ONLY\n\n  private fun sendEvent(event: String) {\n    val eventAttributes = Value.fromJson(event)\n    val mapEvent = eventAttributes.value?.let { Event(EventPriority.QUEUED, it, null) }\n    if (mapEvent != null) {\n      eventsService.sendEvent(mapEvent) { response ->\n        if (response.isError) {\n          logE(TAG, \"sendEvent error: ${response.error}\")\n        }\n      }\n    }\n  }\n\n  private fun enableTelemetryCollection(enabled: Boolean) {\n    TelemetryUtils.setEventsCollectionState(enabled) { response ->\n      if (response.isError) {\n        logE(TAG, \"setEventsCollectionState error: ${response.error}\")\n      }\n    }\n  }\n\n  /**\n   * Set the end-user selected state to participate or opt-out in telemetry collection.\n   *\n   * @param enabled true if enabled, false otherwise\n   */\n  override fun setUserTelemetryRequestState(enabled: Boolean) {\n    enableTelemetryCollection(enabled)\n  }\n\n  /**\n   * Disables a started telemetry service for this session only.\n   */\n  override fun disableTelemetrySession() {\n    enableTelemetryCollection(false)\n  }\n\n  /**\n   * Register a performance event\n   *\n   * @param data performance event data\n   */\n  override fun onPerformanceEvent(data: Bundle?) {\n    if (shouldSendEvents()) {\n      val performanceEvent = MapEventFactory.buildPerformanceEvent(\n        PhoneState(appContext),\n        UUID.randomUUID().toString(), data ?: Bundle()\n      )\n      sendEvent(Gson().toJson(performanceEvent))\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  private companion object {\n    private const val TAG = \"MapTelemetryImpl\"\n  }\n}"
  },
  {
    "path": "module-telemetry/src/main/java/com/mapbox/maps/module/telemetry/PerformanceEvent.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport androidx.annotation.RestrictTo\nimport com.google.gson.Gson\nimport com.google.gson.JsonObject\nimport com.google.gson.annotations.SerializedName\nimport com.google.gson.reflect.TypeToken\nimport java.util.*\n\n/**\n * Generic Performance Event that can be used for performance measurements.\n * Customer measurements can be added to the bundle.\n *\n * Bundle is expected to have following properties:\n * \"attributes\", \"counters\", and \"metadata\" with String values.\n *\n * Attributes: a string representing an array of name/string value pair objects.\n * Counters: a string representing an array of name/number value pair objects.\n * Metadata is a string representation of a JsonObject with string values.\n *\n * Here is an example of a Performance event bundle data:\n *\n * \"attributes\": [{ \"name\": \"style_id\", \"value\": \"mapbox://styles/mapbox/streets-v10\"}]\n *\n * \"counters\": [{\"name\": \"fps_average\", \"value\": 90.7655486547093},\n * {\"name\": \"fps_deviation\", \"value\": 29.301809631465574}]\n * “metadata”: {\n * “version”: “9”,\n * “screenSize”: “1080x1794”,\n * “country”: “US”,\n * “device”: “Pixel 2”,\n * “abi”: “arm64-v8a”,\n * “brand”: “google”,\n * “ram”: “3834167296”,\n * “os”: “android”,\n * “gpu”: “Qualcomm, Adreno (TM) 540, OpenGL ES 3.2 V@313.0 (GIT@7bf2852, Ie32bfa6f6f)“,\n * “manufacturer”: “Google”\n * }\n *\n */\n@SuppressLint(\"ParcelCreator\")\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class PerformanceEvent(\n  phoneState: PhoneState,\n  @field:SerializedName(\"sessionId\") val sessionId: String?,\n  bundle: Bundle\n) : MapBaseEvent(phoneState) {\n\n  @SerializedName(\"attributes\")\n  val attributes: List<PerformanceAttribute<String>>?\n\n  @SerializedName(\"counters\")\n  val counters: List<PerformanceAttribute<Double>>?\n\n  @SerializedName(\"metadata\")\n  val metadata: JsonObject?\n\n  init {\n    attributes = initList(\n      bundle.getString(\"attributes\"),\n      object :\n        TypeToken<ArrayList<PerformanceAttribute<String?>?>?>() {}\n    )\n    counters = initList(\n      bundle.getString(\"counters\"),\n      object :\n        TypeToken<ArrayList<PerformanceAttribute<Double?>?>?>() {}\n    )\n    metadata = initMetaData(bundle.getString(\"metadata\"))\n  }\n\n  private fun <T> initList(\n    fromString: String?,\n    typeToken: TypeToken<*>\n  ): ArrayList<PerformanceAttribute<T>> {\n    return if (fromString == null || fromString.isEmpty()) {\n      ArrayList()\n    } else Gson().fromJson(fromString, typeToken.type)\n  }\n\n  private fun initMetaData(fromString: String?): JsonObject {\n    return if (fromString == null) {\n      JsonObject()\n    } else {\n      Gson()\n        .fromJson(fromString, JsonObject::class.java)\n    }\n  }\n\n  override fun getEventName(): String {\n    return PERFORMANCE_TRACE\n  }\n\n  override fun equals(other: Any?): Boolean {\n    if (this === other) {\n      return true\n    }\n    if (other == null || javaClass != other.javaClass) {\n      return false\n    }\n    val that = other as PerformanceEvent\n    if (event != that.event) {\n      return false\n    }\n    if (created != that.created) {\n      return false\n    }\n    if (sessionId != that.sessionId) {\n      return false\n    }\n    if (attributes != that.attributes) {\n      return false\n    }\n    return if (counters != that.counters) {\n      false\n    } else metadata == that.metadata\n  }\n\n  override fun hashCode(): Int {\n    var result = sessionId?.hashCode() ?: 0\n    result = 31 * result + event.hashCode()\n    result = 31 * result + created.hashCode()\n    result = 31 * result + (attributes?.hashCode() ?: 0)\n    result = 31 * result + (counters?.hashCode() ?: 0)\n    result = 31 * result + (metadata?.hashCode() ?: 0)\n    return result\n  }\n\n  override fun toString(): String {\n    return (\n      \"PerformanceEvent{\" +\n        \"sessionId='\" + sessionId + '\\'' +\n        \", attributes=\" + attributes +\n        \", counters=\" + counters +\n        \", metadata=\" + metadata +\n        '}'\n      )\n  }\n\n  internal class PerformanceAttribute<T>(private val name: String?, value: T) {\n    private val value: T?\n    override fun equals(other: Any?): Boolean {\n      if (this === other) {\n        return true\n      }\n      if (other == null || javaClass != other.javaClass) {\n        return false\n      }\n      val that = other as PerformanceAttribute<*>\n      return if (name != that.name) {\n        false\n      } else value == that.value\n    }\n\n    override fun hashCode(): Int {\n      var result = name?.hashCode() ?: 0\n      result = 31 * result + (value?.hashCode() ?: 0)\n      return result\n    }\n\n    init {\n      this.value = value\n    }\n  }\n\n  companion object {\n    private const val PERFORMANCE_TRACE = \"mobile.performance_trace\"\n  }\n}"
  },
  {
    "path": "module-telemetry/src/main/java/com/mapbox/maps/module/telemetry/PhoneState.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.res.Configuration\nimport android.net.ConnectivityManager\nimport android.net.NetworkCapabilities\nimport android.os.Build\nimport android.telephony.TelephonyManager\nimport android.text.TextUtils\nimport android.util.DisplayMetrics\nimport android.view.WindowManager\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.google.gson.annotations.SerializedName\nimport com.mapbox.common.TelemetrySystemUtils\n\n/**\n * Class that holds kinds of states of the current phone.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class PhoneState {\n  @SerializedName(\"created\")\n  var created: String\n\n  @SerializedName(\"cellularNetworkType\")\n  var cellularNetworkType: String? = null\n\n  @SerializedName(\"orientation\")\n  var orientation: Orientation\n\n  @SerializedName(\"carrier\")\n  var carrier: String? = null\n\n  @SerializedName(\"batteryLevel\")\n  var batteryLevel = 0\n\n  @SerializedName(\"pluggedIn\")\n  var isPluggedIn = false\n\n  @SerializedName(\"wifi\")\n  var isWifi = false\n\n  @SerializedName(\"accessibilityFontScale\")\n  var accessibilityFontScale = 0f\n\n  @SerializedName(\"resolution\")\n  var resolution = 0f\n\n  @VisibleForTesting\n  constructor() {\n    created = \"2020-07-12\"\n    orientation = Orientation.ORIENTATION_PORTRAIT\n  }\n\n  constructor(context: Context) {\n    created = TelemetrySystemUtils.obtainCurrentDate()\n    batteryLevel = TelemetrySystemUtils.obtainBatteryLevel(context)\n    isPluggedIn = TelemetrySystemUtils.isPluggedIn(context)\n    cellularNetworkType = TelemetrySystemUtils.obtainCellularNetworkType(context)\n    orientation =\n      Orientation.getOrientation(\n        context.resources.configuration.orientation\n      )\n    accessibilityFontScale = context.resources.configuration.fontScale\n    carrier = obtainCellularCarrier(context)\n    resolution = obtainDisplayDensity(context)\n    isWifi = isConnectedToWifi(context)\n  }\n\n  private fun obtainCellularCarrier(context: Context): String {\n    val manager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager\n    val carrierName = manager.networkOperatorName\n    return if (TextUtils.isEmpty(carrierName)) {\n      NO_CARRIER\n    } else carrierName\n  }\n\n  private fun obtainDisplayDensity(context: Context): Float {\n    val displayMetrics = DisplayMetrics()\n    @Suppress(\"DEPRECATION\")\n    (context.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay\n      .getMetrics(displayMetrics)\n    return displayMetrics.density\n  }\n\n  @SuppressLint(\"MissingPermission\")\n  private fun isConnectedToWifi(context: Context): Boolean {\n    try {\n      val connectivityManager =\n        context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager\n      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n        val activeNetwork = connectivityManager.activeNetwork ?: return false\n        val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false\n        return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)\n      } else {\n        @Suppress(\"DEPRECATION\")\n        val activeNetworkInfo = connectivityManager.activeNetworkInfo ?: return false\n        @Suppress(\"DEPRECATION\")\n        return activeNetworkInfo.isConnected && activeNetworkInfo.type == ConnectivityManager.TYPE_WIFI\n      }\n    } catch (exception: Exception) {\n      return false\n    }\n  }\n\n  internal enum class Orientation(val orientation: String) {\n    ORIENTATION_PORTRAIT(\"Portrait\"), ORIENTATION_LANDSCAPE(\"Landscape\");\n\n    companion object {\n      fun getOrientation(index: Int): Orientation {\n        return if (Configuration.ORIENTATION_PORTRAIT == index) {\n          ORIENTATION_PORTRAIT\n        } else ORIENTATION_LANDSCAPE\n      }\n    }\n  }\n\n  companion object {\n    private const val NO_CARRIER = \"EMPTY_CARRIER\"\n    private const val NO_NETWORK = -1\n  }\n}"
  },
  {
    "path": "module-telemetry/src/test/java/com/mapbox/maps/module/telemetry/EqualsHashCodeTest.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport com.google.gson.JsonObject\nimport nl.jqno.equalsverifier.EqualsVerifier\nimport org.junit.Test\n\nclass EqualsHashCodeTest {\n  @Test\n  fun `MapLoadEvent hashCode and equals test`() {\n    val clazz = MapLoadEvent::class.java\n    EqualsVerifier.forClass(clazz)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `PerformanceEvent hashCode and equals test`() {\n    val clazz = PerformanceEvent::class.java\n    EqualsVerifier.forClass(clazz)\n      .usingGetClass()\n      .withRedefinedSuperclass()\n      .withPrefabValues(\n        JsonObject::class.java,\n        JsonObject(),\n        JsonObject().apply {\n          addProperty(\"test\", false)\n        }\n      ).verify()\n  }\n\n  @Test\n  fun `PerformanceAttribute hashCode and equals test`() {\n    val clazz = PerformanceEvent.PerformanceAttribute::class.java\n    EqualsVerifier.forClass(clazz)\n      .usingGetClass()\n      .verify()\n  }\n}"
  },
  {
    "path": "module-telemetry/src/test/java/com/mapbox/maps/module/telemetry/MapEventFactoryTest.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport android.os.Build\nimport android.os.Bundle\nimport com.google.gson.Gson\nimport com.google.gson.JsonObject\nimport com.mapbox.maps.base.BuildConfig\nimport com.mapbox.maps.module.telemetry.PerformanceEvent.PerformanceAttribute\nimport io.mockk.every\nimport io.mockk.mockk\nimport org.junit.Assert\nimport org.junit.Assert.assertNotEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.util.ReflectionHelpers\nimport java.util.*\n\n@RunWith(RobolectricTestRunner::class)\nclass MapEventFactoryTest {\n  private lateinit var phoneState: PhoneState\n  private val gson = Gson()\n\n  @Before\n  fun setUp() {\n    ReflectionHelpers.setStaticField(\n      Build::class.java,\n      \"MODEL\",\n      \"Foobar\"\n    )\n\n    phoneState = PhoneState()\n    phoneState.accessibilityFontScale = FONT_SCALE\n    phoneState.batteryLevel = BATTERY_LEVEL\n    phoneState.carrier = CARRIER\n    phoneState.cellularNetworkType = NETWORK_TYPE\n    phoneState.created = CREATED\n    phoneState.orientation = PhoneState.Orientation.ORIENTATION_LANDSCAPE\n    phoneState.isPluggedIn = PLUGIN\n    phoneState.resolution = RESOLUTION\n    phoneState.isWifi = WIFI\n  }\n\n  @Test\n  fun testMapLoadEvent() {\n    val mapLoadEvent = MapEventFactory.buildMapLoadEvent(phoneState)\n    Assert.assertEquals(\n      \"Android - \" + Build.VERSION.RELEASE,\n      mapLoadEvent.operatingSystem\n    )\n    Assert.assertEquals(Build.MODEL, mapLoadEvent.model)\n    Assert.assertNotNull(mapLoadEvent.userId)\n    Assert.assertEquals(\n      BATTERY_LEVEL.toLong(),\n      mapLoadEvent.batteryLevel.toLong()\n    )\n    Assert.assertEquals(CARRIER, mapLoadEvent.carrier)\n    Assert.assertEquals(\n      NETWORK_TYPE,\n      mapLoadEvent.cellularNetworkType\n    )\n    Assert.assertEquals(CREATED, mapLoadEvent.created)\n    Assert.assertEquals(\"Landscape\", mapLoadEvent.orientation)\n    Assert.assertEquals(\n      BuildConfig.MAPBOX_SDK_IDENTIFIER,\n      mapLoadEvent.sdkIdentifier\n    )\n    Assert.assertEquals(\n      BuildConfig.MAPBOX_SDK_VERSION,\n      mapLoadEvent.sdkVersion\n    )\n    Assert.assertEquals(PLUGIN, mapLoadEvent.isPluggedIn)\n    Assert.assertEquals(WIFI, mapLoadEvent.isWifi)\n    Assert.assertEquals(\n      FONT_SCALE,\n      mapLoadEvent.accessibilityFontScale,\n      0f\n    )\n    val json = gson.toJson(mapLoadEvent)\n    val event = gson.fromJson(json, MapLoadEvent::class.java)\n    Assert.assertEquals(mapLoadEvent, event)\n  }\n\n  @Test\n  fun testPerformanceEvent() {\n    val nameAttribute = \"nameAttribute\"\n    val valueAttribute = \"100\"\n    val nameCounters = \"nameCounters\"\n    val valuesCounters = 1000.0\n    val metaData = JsonObject()\n    metaData.addProperty(\"os\", \"android\")\n    metaData.addProperty(\"manufacturer\", Build.MANUFACTURER)\n    metaData.addProperty(\"brand\", Build.BRAND)\n    metaData.addProperty(\"device\", Build.MODEL)\n    metaData.addProperty(\"version\", Build.VERSION.RELEASE)\n    metaData.addProperty(\"abi\", Build.CPU_ABI)\n    metaData.addProperty(\"country\", Locale.getDefault().isO3Country)\n    metaData.addProperty(\"ram\", \"ram\")\n    metaData.addProperty(\"screenSize\", \"1000\")\n    val data: Bundle = mockk()\n    val attribtueList =\n      ArrayList<PerformanceAttribute<String>>()\n    val attribute =\n      PerformanceAttribute(nameAttribute, valueAttribute)\n    attribtueList.add(attribute)\n    val countersList =\n      ArrayList<PerformanceAttribute<Double>>()\n    val counter =\n      PerformanceAttribute(nameCounters, valuesCounters)\n    countersList.add(counter)\n    every { data.getString(\"attributes\") } returns gson.toJson(attribtueList)\n    every { data.getString(\"counters\") } returns gson.toJson(countersList)\n    every { data.getString(\"metadata\") } returns metaData.toString()\n    val performanceEvent = MapEventFactory.buildPerformanceEvent(\n      phoneState,\n      SESSION_ID, data\n    )\n    Assert.assertEquals(\n      CREATED,\n      performanceEvent.created\n    )\n    Assert.assertEquals(metaData.toString(), performanceEvent.metadata.toString())\n    Assert.assertEquals(\n      SESSION_ID,\n      performanceEvent.sessionId\n    )\n    val attributeList = performanceEvent.attributes\n    Assert.assertEquals(1, attributeList?.size)\n    Assert.assertEquals(attribute, attributeList!![0])\n    val counterList = performanceEvent.counters\n    Assert.assertEquals(1, counterList?.size)\n    Assert.assertEquals(counter, counterList!![0])\n  }\n\n  @Test\n  fun testBuildConfigValues() {\n    // Regression test\n    assertNotEquals(\"version shouldn't be null\", \"null\", BuildConfig.MAPBOX_SDK_VERSION)\n    assertNotEquals(\"sdk identifier shouldn't be null\", \"Mapbox/null\", BuildConfig.MAPBOX_VERSION_STRING)\n    // Value test\n    assertTrue(\"sdk identifier like should match\", BuildConfig.MAPBOX_SDK_IDENTIFIER.contains(\"mapbox-maps-android\"))\n    assertTrue(\"version like should match\", BuildConfig.MAPBOX_VERSION_STRING.contains(\"Mapbox/\"))\n  }\n\n  companion object {\n    private const val FONT_SCALE = 1f\n    private const val BATTERY_LEVEL = 50\n    private const val CARRIER = \"carrier\"\n    private const val NETWORK_TYPE = \"network\"\n    private const val CREATED = \"2019-04-09\"\n    private const val PLUGIN = true\n    private const val RESOLUTION = 1024f\n    private const val WIFI = true\n    private const val SESSION_ID = \"001\"\n  }\n}"
  },
  {
    "path": "module-telemetry/src/test/java/com/mapbox/maps/module/telemetry/MapTelemetryTest.kt",
    "content": "package com.mapbox.maps.module.telemetry\n\nimport android.content.Context\nimport android.telephony.TelephonyManager\nimport android.view.Display\nimport android.view.WindowManager\nimport com.mapbox.common.*\nimport com.mapbox.maps.base.BuildConfig\nimport io.mockk.*\nimport kotlinx.coroutines.Dispatchers\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\nimport org.robolectric.annotation.Implementation\nimport org.robolectric.annotation.Implements\n\n@Implements(EventsService::class)\nobject ShadowEventsService {\n  @Implementation\n  open fun setEventsCollectionState(\n    enableCollection: Boolean,\n    callback: EventsServiceResponseCallback?\n  ) {\n  }\n\n  @Implementation\n  open fun getEventsCollectionState(): Boolean {\n    return true\n  }\n}\n\n@Implements(TelemetryService::class)\nobject ShadowTelemetryService\n\n@Implements(TelemetryUtils::class)\nobject ShadowTelemetryUtils {\n  @Implementation\n  fun setEventsCollectionState(\n    enableCollection: Boolean,\n    callback: TelemetryUtilsResponseCallback?\n  ) {\n  }\n\n  @Implementation\n  fun getEventsCollectionState(): Boolean {\n    return true\n  }\n\n  @Implementation\n  fun getUserID(): String = \"\"\n}\n\n@Config(shadows = [ShadowEventsService::class, ShadowTelemetryService::class, ShadowTelemetryUtils::class])\n@RunWith(RobolectricTestRunner::class)\nclass MapTelemetryTest {\n\n  private lateinit var telemetry: MapTelemetryImpl\n  private val eventsService: EventsService = mockk()\n  private val telemetryService: TelemetryService = mockk()\n  private val context = mockk<Context>(relaxed = true)\n  private val telephonyManager = mockk<TelephonyManager>()\n  private val windowManager = mockk<WindowManager>(relaxUnitFun = true)\n  private val display = mockk<Display>(relaxUnitFun = true)\n\n  private val turnstileEvent = TurnstileEvent(UserSKUIdentifier.MAPS_MAUS)\n\n  @Before\n  fun setUp() {\n    mockkStatic(TelemetryUtils::class)\n    every { TelemetryUtils.getEventsCollectionState() } returns true\n    every { TelemetryUtils.setEventsCollectionState(any(), any()) } returns Unit\n    every { TelemetryUtils.getClientServerEventsCollectionState() } returns TelemetryCollectionState.ENABLED\n\n    every { eventsService.sendEvent(any(), any()) } returns Unit\n    every { eventsService.sendTurnstileEvent(any(), any()) } returns Unit\n\n    every { context.getSystemService(Context.TELEPHONY_SERVICE) } returns telephonyManager\n    every { telephonyManager.networkType } returns TelephonyManager.NETWORK_TYPE_GPRS\n    every { telephonyManager.networkOperatorName } returns \"foobar\"\n\n    every { context.getSystemService(Context.WINDOW_SERVICE) } returns windowManager\n    every { windowManager.defaultDisplay } returns display\n\n    telemetry = MapTelemetryImpl(\n      context, eventsService, telemetryService,\n        EventsServerOptions(\n        SdkInformation(\n          BuildConfig.MAPBOX_SDK_IDENTIFIER,\n          BuildConfig.MAPBOX_SDK_VERSION,\n          null\n        ),\n        null\n      ),\n        Dispatchers.Unconfined\n    )\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(TelemetryUtils::class)\n    unmockkAll()\n  }\n\n  @Test\n  fun testDefaultConstructorInitialisation() {\n    mockkStatic(EventsService::class)\n    mockkStatic(TelemetryService::class)\n    every { EventsService.getOrCreate(any()) } returns eventsService\n    every { TelemetryService.getOrCreate() } returns telemetryService\n    MapTelemetryImpl(context)\n    // validate the event service is initialised\n    verify { EventsService.getOrCreate(any()) }\n    // validate the telemetry service is initialised\n    verify { TelemetryService.getOrCreate() }\n    unmockkStatic(EventsService::class)\n    unmockkStatic(TelemetryService::class)\n  }\n\n  @Test\n  fun testOnAppUserTurnstileEvent() {\n    telemetry.onAppUserTurnstileEvent()\n    verify {\n      eventsService.sendTurnstileEvent(turnstileEvent, any())\n    }\n    val slot = slot<Event>()\n    verify { eventsService.sendEvent(capture(slot), any()) }\n    assertEquals(EventPriority.QUEUED, slot.captured.priority)\n    assertTrue(slot.captured.attributes.toJson().contains(\"\\\"event\\\":\\\"map.load\\\"\"))\n    assertTrue(\n      slot.captured.attributes.toJson().contains(\"\\\"sdkIdentifier\\\":\\\"mapbox-maps-android\\\"\")\n    )\n  }\n\n  @Test\n  fun testOnAppUserTurnstileStateTurnstileOnly() {\n    every { TelemetryUtils.getClientServerEventsCollectionState() } returns TelemetryCollectionState.TURNSTILE_EVENTS_ONLY\n    telemetry.onAppUserTurnstileEvent()\n    verify {\n      eventsService.sendTurnstileEvent(turnstileEvent, any())\n    }\n    verify(exactly = 0) { eventsService.sendEvent(any(), any()) }\n  }\n\n  @Test\n  fun testOnAppUserTurnstileStateUnknown() {\n    every { TelemetryUtils.getClientServerEventsCollectionState() } returns TelemetryCollectionState.UNKNOWN\n    telemetry.onAppUserTurnstileEvent()\n    verify {\n      eventsService.sendTurnstileEvent(\n        turnstileEvent, any()\n      )\n    }\n    verify(exactly = 1) { eventsService.sendEvent(any(), any()) }\n  }\n\n  @Test\n  fun testSetUserTelemetryRequestStateEnabled() {\n    telemetry.userTelemetryRequestState = true\n    verify { TelemetryUtils.setEventsCollectionState(true, any()) }\n  }\n\n  @Test\n  fun testSetUserTelemetryRequestStateDisabled() {\n    telemetry.userTelemetryRequestState = false\n    verify { TelemetryUtils.setEventsCollectionState(false, any()) }\n  }\n\n  @Test\n  fun testDisableTelemetrySession() {\n    telemetry.disableTelemetrySession()\n    verify { TelemetryUtils.setEventsCollectionState(false, any()) }\n  }\n\n  @Test\n  fun testPerformanceEvent() {\n    telemetry.onPerformanceEvent(null)\n    val slot = slot<Event>()\n    verify { eventsService.sendEvent(capture(slot), any()) }\n    assertEquals(EventPriority.QUEUED, slot.captured.priority)\n    assertTrue(slot.captured.attributes.toJson().contains(\"\\\"event\\\":\\\"mobile.performance_trace\\\"\"))\n  }\n\n  @Test\n  fun testPerformanceEventDisabledStateTurnstileOnly() {\n    every { TelemetryUtils.getClientServerEventsCollectionState() } returns TelemetryCollectionState.TURNSTILE_EVENTS_ONLY\n    telemetry.onPerformanceEvent(null)\n    verify(exactly = 0) { eventsService.sendEvent(any(), any()) }\n  }\n\n  @Test\n  fun testPerformanceEventDisabledStateUnknown() {\n    every { TelemetryUtils.getClientServerEventsCollectionState() } returns TelemetryCollectionState.UNKNOWN\n    telemetry.onPerformanceEvent(null)\n    verify(exactly = 1) { eventsService.sendEvent(any(), any()) }\n  }\n}"
  },
  {
    "path": "plugin-animation/.gitignore",
    "content": "/build"
  },
  {
    "path": "plugin-animation/README.md",
    "content": "## Mapbox Maps Animation Plugin for Android\n\n![Camera Animation Plugin](https://user-images.githubusercontent.com/15800566/95355920-c49f6e00-08ce-11eb-9f79-4d2cbbfc2855.gif)\n\n## Overview\n\nThe Mapbox Maps Animation Plugin for Android is an public library for animating camera for `MapboxMap`. Following animations types are currently supported: center (camera center represented as lng-lat point), zoom, bearing, pitch, anchor (screen coordinate relative to the camera movement), padding. Plugin uses Android `ValueAnimator`s that extend `CameraAnimator`. There is a possibility to receive camera updates callbacks during animation transition by adding animation listeners.\n\n**Note**: If animation is about to start while an animation of the same type is already running -- the latter one will be canceled.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n## Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Animation Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the Animation plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-animation:11.22.0-rc.1'\n}\n```\n\n## Examples\n\nCustomizing Mapbox Maps Animation Plugin for Android could be done in two ways: by either providing your own version of the Animation plugin or by using existing API. The former is documented in [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md), the latter can be achieved with three logical API levels.\n\n### High-level API\n\nA set of ready-to-use functions for animating map camera transitions. It includes such functions as `easeTo`, `moveBy`, `flyTo`, `pitchBy`, `rotateBy`, `scaleBy`. Those functions could be easily called with `MapboxMap` object. Depending on function type different parameters will be used but all of those functions support customizing animation duration and interpolator. It is possible to add `Animator.AnimatorListener` object to listen to animation start / cancel / end.\n\n**Note**: If animation is about to start while any other high-level API animation is already running -- the latter one will be canceled.\n\n```kotlin\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\n\nmapboxMap.flyTo(\n    CameraOptions.Builder().center(geoPoint).build(),\n    mapAnimationOptions { duration = 7000L }\n)\n```\n\n### Medium-level API\n\nAny number of animators extending `CameraAnimator` could be created and started sequentially or in parallel. In that case user should not take care of registering and unregistering those animators.\n\n```kotlin\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion.cameraAnimatorOptions\n\nmapView.camera.apply {\n    val bearing = createBearingAnimator(cameraAnimatorOptions(18.0, 20.0) { startValue = 15.0 }) {\n          duration = 8500\n          interpolator = AnticipateOvershootInterpolator()\n    }\n    val pitch = createPitchAnimator(cameraAnimatorOptions(30.0) { startValue = 15.0 }) {\n          duration = 2000\n    }\n    playAnimatorsTogether(bearing, pitch)\n}\n```\n\n### Low-level API\n\nAny number of animators extending `CameraAnimator` could be created but user should also register them in Mapbox Maps Animation Plugin in order for map camera to work properly and unregister them when they will not be needed anymore. Animation lifecycle (start, end, cancel) is driven directly by user in this case.\n\n```kotlin\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion.cameraAnimatorOptions\n\nval plugin = mapView.camera\nval bearing = plugin.createBearingAnimator(cameraAnimatorOptions(160.0) { startValue = 0.0 }) {\n      duration = 8500\n      interpolator = AnticipateOvershootInterpolator()\n}\nplugin.registerAnimators(bearing)\nbearing.apply {\n    addListener(\n        object : Animator.AnimatorListener {\n            override fun onAnimationStart(animation: Animator?) {}\n\n            override fun onAnimationEnd(animation: Animator?) {\n              (animation as? CameraAnimator<*>)?.let {\n                plugin.unregisterAnimators(it)\n              }\n            }\n\n            override fun onAnimationCancel(animation: Animator?) {\n              (animation as? CameraAnimator<*>)?.let {\n                plugin.unregisterAnimators(it)\n              }\n            }\n\n            override fun onAnimationRepeat(animation: Animator?) {}\n        }\n    )\n    start()\n}\n```\n\nMore concrete examples of the Animation plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-animation/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.animation {\n\n  public final class CameraAnimationsUtils {\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.CameraAnimationHint! calculateCameraAnimationHint(android.animation.AnimatorSet, java.util.List<? extends java.lang.Float> fractions, com.mapbox.maps.CameraState? startCameraState = null);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @kotlin.jvm.JvmSynthetic public static <T extends com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>> com.mapbox.maps.CameraAnimationHint! calculateCameraAnimationHint(java.util.List<? extends T>, java.util.List<? extends java.lang.Float> fractions, com.mapbox.maps.CameraState? startCameraState = null);\n    method public static com.mapbox.common.Cancelable easeTo(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public static com.mapbox.common.Cancelable easeTo(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null);\n    method public static com.mapbox.common.Cancelable easeTo(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.CameraOptions cameraOptions);\n    method public static com.mapbox.common.Cancelable flyTo(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public static com.mapbox.common.Cancelable flyTo(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null);\n    method public static com.mapbox.common.Cancelable flyTo(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.CameraOptions cameraOptions);\n    method public static com.mapbox.maps.plugin.animation.CameraAnimationsPlugin getCamera(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n    method public static com.mapbox.common.Cancelable moveBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.ScreenCoordinate screenCoordinate, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public static com.mapbox.common.Cancelable moveBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.ScreenCoordinate screenCoordinate, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null);\n    method public static com.mapbox.common.Cancelable moveBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.ScreenCoordinate screenCoordinate);\n    method public static com.mapbox.common.Cancelable pitchBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, double pitch, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public static com.mapbox.common.Cancelable pitchBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, double pitch, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null);\n    method public static com.mapbox.common.Cancelable pitchBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, double pitch);\n    method public static com.mapbox.common.Cancelable rotateBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.ScreenCoordinate first, com.mapbox.maps.ScreenCoordinate second, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public static com.mapbox.common.Cancelable rotateBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.ScreenCoordinate first, com.mapbox.maps.ScreenCoordinate second, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null);\n    method public static com.mapbox.common.Cancelable rotateBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.ScreenCoordinate first, com.mapbox.maps.ScreenCoordinate second);\n    method public static com.mapbox.common.Cancelable scaleBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, double amount, com.mapbox.maps.ScreenCoordinate? screenCoordinate, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public static com.mapbox.common.Cancelable scaleBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, double amount, com.mapbox.maps.ScreenCoordinate? screenCoordinate, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null);\n    method public static com.mapbox.common.Cancelable scaleBy(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, double amount, com.mapbox.maps.ScreenCoordinate? screenCoordinate);\n  }\n\n  public final class CameraAnimatorsFactory {\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getEaseTo(com.mapbox.maps.CameraOptions cameraOptions, String? owner = null);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getEaseTo(com.mapbox.maps.CameraOptions cameraOptions);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getFlyTo(com.mapbox.maps.CameraOptions cameraOptions, String? owner = null);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getFlyTo(com.mapbox.maps.CameraOptions cameraOptions);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getMoveBy(com.mapbox.maps.ScreenCoordinate offset, String? owner = null);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getMoveBy(com.mapbox.maps.ScreenCoordinate offset);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getPitchBy(double pitch, String? owner = null);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getPitchBy(double pitch);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getRotateBy(com.mapbox.maps.ScreenCoordinate first, com.mapbox.maps.ScreenCoordinate second, String? owner = null);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getRotateBy(com.mapbox.maps.ScreenCoordinate first, com.mapbox.maps.ScreenCoordinate second);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getScaleBy(double amount, com.mapbox.maps.ScreenCoordinate? anchor = null, String? owner = null);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getScaleBy(double amount, com.mapbox.maps.ScreenCoordinate? anchor = null);\n    method public com.mapbox.maps.plugin.animation.animator.CameraAnimator<?>![] getScaleBy(double amount);\n    method public static void setDefaultAnimatorOptions(com.mapbox.maps.plugin.animation.CameraAnimatorType type, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit> block);\n    method public static void setDefaultAnimatorOptions(kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit> block);\n    field public static final android.view.animation.Interpolator CUBIC_BEZIER_INTERPOLATOR;\n    field public static final com.mapbox.maps.plugin.animation.CameraAnimatorsFactory.Companion Companion;\n    field public static final long DEFAULT_ANIMATION_DURATION_MS = 300L; // 0x12cL\n  }\n\n  public static final class CameraAnimatorsFactory.Companion {\n    method public void setDefaultAnimatorOptions(com.mapbox.maps.plugin.animation.CameraAnimatorType type, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit> block);\n    method public void setDefaultAnimatorOptions(kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit> block);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.animation.animator {\n\n  public abstract class CameraAnimator<T> extends android.animation.ValueAnimator {\n    ctor public CameraAnimator(android.animation.TypeEvaluator<T> evaluator, com.mapbox.maps.plugin.animation.CameraAnimatorOptions<? extends T> cameraAnimatorOptions);\n    method public final void addListener(android.animation.Animator.AnimatorListener? listener);\n    method public final void addUpdateListener(android.animation.ValueAnimator.AnimatorUpdateListener? listener);\n    method public final void cancel();\n    method public final String? getOwner();\n    method public final T? getStartValue();\n    method public final T![] getTargets();\n    method public abstract com.mapbox.maps.plugin.animation.CameraAnimatorType getType();\n    method public final void removeAllListeners();\n    method public final void removeAllUpdateListeners();\n    method public final void removeListener(android.animation.Animator.AnimatorListener? listener);\n    method public final void removeUpdateListener(android.animation.ValueAnimator.AnimatorUpdateListener? listener);\n    method public Object![] resolveAnimationObjectValues(Object startValue);\n    method public final void setEvaluator(android.animation.TypeEvaluator<T!>? value);\n    method public final void setObjectValues(java.lang.Object?... values);\n    method public final void start();\n    method public final void updateObjectValues(kotlin.jvm.functions.Function0<com.mapbox.maps.CameraState> getStartCameraState);\n    property public final String? owner;\n    property public final T? startValue;\n    property public final T![] targets;\n    property public abstract com.mapbox.maps.plugin.animation.CameraAnimatorType type;\n    field public static final com.mapbox.maps.plugin.animation.animator.CameraAnimator.Companion Companion;\n  }\n\n  public static final class CameraAnimator.Companion {\n  }\n\n  public fun interface CameraTypeEvaluator<T> extends android.animation.TypeEvaluator<T> {\n    method public default boolean canSkip(Object cameraCurrentValue, Object startValue, Object![] values);\n  }\n\n  public final class Evaluators {\n    method public android.animation.TypeEvaluator<java.lang.Double> getDOUBLE();\n    method public android.animation.TypeEvaluator<com.mapbox.maps.EdgeInsets> getEDGE_INSET();\n    method public android.animation.TypeEvaluator<com.mapbox.geojson.Point> getPOINT();\n    method public android.animation.TypeEvaluator<com.mapbox.maps.ScreenCoordinate> getSCREEN_COORDINATE();\n    property public final android.animation.TypeEvaluator<java.lang.Double> DOUBLE;\n    property public final android.animation.TypeEvaluator<com.mapbox.maps.EdgeInsets> EDGE_INSET;\n    property public final android.animation.TypeEvaluator<com.mapbox.geojson.Point> POINT;\n    property public final android.animation.TypeEvaluator<com.mapbox.maps.ScreenCoordinate> SCREEN_COORDINATE;\n    field public static final com.mapbox.maps.plugin.animation.animator.Evaluators INSTANCE;\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-animation/api/plugin-animation.api",
    "content": "public final class com/mapbox/maps/plugin/animation/CameraAnimationsUtils {\n\tpublic static final synthetic fun calculateCameraAnimationHint (Landroid/animation/AnimatorSet;Ljava/util/List;Lcom/mapbox/maps/CameraState;)Lcom/mapbox/maps/CameraAnimationHint;\n\tpublic static final synthetic fun calculateCameraAnimationHint (Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/CameraState;)Lcom/mapbox/maps/CameraAnimationHint;\n\tpublic static synthetic fun calculateCameraAnimationHint$default (Landroid/animation/AnimatorSet;Ljava/util/List;Lcom/mapbox/maps/CameraState;ILjava/lang/Object;)Lcom/mapbox/maps/CameraAnimationHint;\n\tpublic static synthetic fun calculateCameraAnimationHint$default (Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/CameraState;ILjava/lang/Object;)Lcom/mapbox/maps/CameraAnimationHint;\n\tpublic static final synthetic fun createCameraAnimationPlugin ()Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;\n\tpublic static final fun easeTo (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun easeTo (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun easeTo (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun easeTo$default (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun flyTo (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun flyTo (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun flyTo (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun flyTo$default (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun getCamera (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;\n\tpublic static final synthetic fun getCameraAnimatorsFactory (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;)Lcom/mapbox/maps/plugin/animation/CameraAnimatorsFactory;\n\tpublic static final fun moveBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun moveBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun moveBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun moveBy$default (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun pitchBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;D)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun pitchBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;DLcom/mapbox/maps/plugin/animation/MapAnimationOptions;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun pitchBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;DLcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun pitchBy$default (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;DLcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun rotateBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun rotateBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun rotateBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun rotateBy$default (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun scaleBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;DLcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun scaleBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;DLcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;)Lcom/mapbox/common/Cancelable;\n\tpublic static final fun scaleBy (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;DLcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun scaleBy$default (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;DLcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n}\n\npublic final class com/mapbox/maps/plugin/animation/CameraAnimatorsFactory {\n\tpublic static final field CUBIC_BEZIER_INTERPOLATOR Landroid/view/animation/Interpolator;\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/animation/CameraAnimatorsFactory$Companion;\n\tpublic static final field DEFAULT_ANIMATION_DURATION_MS J\n\tpublic final fun getEaseTo (Lcom/mapbox/maps/CameraOptions;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getEaseTo (Lcom/mapbox/maps/CameraOptions;Ljava/lang/String;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic static synthetic fun getEaseTo$default (Lcom/mapbox/maps/plugin/animation/CameraAnimatorsFactory;Lcom/mapbox/maps/CameraOptions;Ljava/lang/String;ILjava/lang/Object;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getFlyTo (Lcom/mapbox/maps/CameraOptions;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getFlyTo (Lcom/mapbox/maps/CameraOptions;Ljava/lang/String;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic static synthetic fun getFlyTo$default (Lcom/mapbox/maps/plugin/animation/CameraAnimatorsFactory;Lcom/mapbox/maps/CameraOptions;Ljava/lang/String;ILjava/lang/Object;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getMoveBy (Lcom/mapbox/maps/ScreenCoordinate;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getMoveBy (Lcom/mapbox/maps/ScreenCoordinate;Ljava/lang/String;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic static synthetic fun getMoveBy$default (Lcom/mapbox/maps/plugin/animation/CameraAnimatorsFactory;Lcom/mapbox/maps/ScreenCoordinate;Ljava/lang/String;ILjava/lang/Object;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getPitchBy (D)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getPitchBy (DLjava/lang/String;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic static synthetic fun getPitchBy$default (Lcom/mapbox/maps/plugin/animation/CameraAnimatorsFactory;DLjava/lang/String;ILjava/lang/Object;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getRotateBy (Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getRotateBy (Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;Ljava/lang/String;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic static synthetic fun getRotateBy$default (Lcom/mapbox/maps/plugin/animation/CameraAnimatorsFactory;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;Ljava/lang/String;ILjava/lang/Object;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getScaleBy (D)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getScaleBy (DLcom/mapbox/maps/ScreenCoordinate;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic final fun getScaleBy (DLcom/mapbox/maps/ScreenCoordinate;Ljava/lang/String;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic static synthetic fun getScaleBy$default (Lcom/mapbox/maps/plugin/animation/CameraAnimatorsFactory;DLcom/mapbox/maps/ScreenCoordinate;Ljava/lang/String;ILjava/lang/Object;)[Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator;\n\tpublic static final fun setDefaultAnimatorOptions (Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;Lkotlin/jvm/functions/Function1;)V\n\tpublic static final fun setDefaultAnimatorOptions (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/animation/CameraAnimatorsFactory$Companion {\n\tpublic final fun setDefaultAnimatorOptions (Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun setDefaultAnimatorOptions (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic abstract class com/mapbox/maps/plugin/animation/animator/CameraAnimator : android/animation/ValueAnimator {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/animation/animator/CameraAnimator$Companion;\n\tpublic fun <init> (Landroid/animation/TypeEvaluator;Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;)V\n\tpublic final fun addListener (Landroid/animation/Animator$AnimatorListener;)V\n\tpublic final fun addUpdateListener (Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V\n\tpublic final fun cancel ()V\n\tpublic fun end ()V\n\tpublic fun getAnimatedValue ()Ljava/lang/Object;\n\tpublic final fun getOwner ()Ljava/lang/String;\n\tpublic final fun getStartValue ()Ljava/lang/Object;\n\tpublic final fun getTargets ()[Ljava/lang/Object;\n\tpublic abstract fun getType ()Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;\n\tpublic final fun removeAllListeners ()V\n\tpublic final fun removeAllUpdateListeners ()V\n\tpublic final fun removeListener (Landroid/animation/Animator$AnimatorListener;)V\n\tpublic final fun removeUpdateListener (Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V\n\tpublic fun resolveAnimationObjectValues (Ljava/lang/Object;)[Ljava/lang/Object;\n\tpublic final fun setEvaluator (Landroid/animation/TypeEvaluator;)V\n\tpublic final fun setObjectValues ([Ljava/lang/Object;)V\n\tpublic final fun start ()V\n\tpublic final fun updateObjectValues (Lkotlin/jvm/functions/Function0;)V\n}\n\npublic final class com/mapbox/maps/plugin/animation/animator/CameraAnimator$Companion {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/animation/animator/CameraTypeEvaluator : android/animation/TypeEvaluator {\n\tpublic abstract fun canSkip (Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Z\n}\n\npublic final class com/mapbox/maps/plugin/animation/animator/CameraTypeEvaluator$DefaultImpls {\n\tpublic static fun canSkip (Lcom/mapbox/maps/plugin/animation/animator/CameraTypeEvaluator;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Z\n}\n\npublic final class com/mapbox/maps/plugin/animation/animator/Evaluators {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/plugin/animation/animator/Evaluators;\n\tpublic final fun getDOUBLE ()Landroid/animation/TypeEvaluator;\n\tpublic final fun getEDGE_INSET ()Landroid/animation/TypeEvaluator;\n\tpublic final fun getPOINT ()Landroid/animation/TypeEvaluator;\n\tpublic final fun getSCREEN_COORDINATE ()Landroid/animation/TypeEvaluator;\n}\n\n"
  },
  {
    "path": "plugin-animation/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n  kotlin(\"kapt\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.camera.animation\"\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    unitTests.apply {\n      isIncludeAndroidResources = true\n    }\n  }\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-animation\"\n    artifactTitle = \"The camera animation module for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-animation\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.androidx.interpolators)\n  implementation(libs.kotlin)\n  implementation(libs.androidx.coreKtx)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\ntasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { kotlinOptions.jvmTarget = \"1.8\" }\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsExt.kt",
    "content": "@file:JvmName(\"CameraAnimationsUtils\")\npackage com.mapbox.maps.plugin.animation\n\nimport android.animation.Animator\nimport android.animation.Animator.DURATION_INFINITE\nimport android.animation.AnimatorSet\nimport android.os.Build\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraAnimationHint\nimport com.mapbox.maps.CameraAnimationHintStage\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_CAMERA_PLUGIN_ID\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPluginImpl.Companion.TAG\nimport com.mapbox.maps.plugin.animation.animator.CameraAnchorAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraBearingAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraCenterAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraPaddingAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraPitchAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraZoomAnimator\nimport com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val for MapView to get the Camera Animations plugin instance.\n */\nval MapPluginProviderDelegate.camera: CameraAnimationsPlugin\n  @JvmName(\"getCamera\")\n  get() = this.getPlugin(MAPBOX_CAMERA_PLUGIN_ID)!!\n\nprivate val emptyCancelable = Cancelable { }\n\n/**\n * Extension easeTo() for [MapPluginExtensionsDelegate]\n * Ease the map camera to a given camera options and animation options\n *\n * Camera plugin with id = [Plugin.MAPBOX_CAMERA_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n *\n * @param cameraOptions The camera options to ease to\n * @param animationOptions Transition options (animation duration, listeners etc)\n *\n * @return [Cancelable] animator set object or empty cancelable object if associated `MapView` was destroyed.\n */\n@JvmOverloads\nfun MapPluginExtensionsDelegate.easeTo(\n  cameraOptions: CameraOptions,\n  animationOptions: MapAnimationOptions? = null,\n  animatorListener: Animator.AnimatorListener? = null\n) = (cameraAnimationsPlugin { easeTo(cameraOptions, animationOptions, animatorListener) } as? Cancelable) ?: emptyCancelable\n\n/**\n * Extension flyTo() function for [MapPluginExtensionsDelegate]\n * Fly the map camera to a given camera options.\n *\n * Camera plugin with id = [Plugin.MAPBOX_CAMERA_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n *\n * @param cameraOptions The camera options to fly to\n * @param animationOptions Transition options (animation duration, listeners etc)\n *\n * @return [Cancelable] animator set object or empty cancelable object if associated `MapView` was destroyed.\n */\n@JvmOverloads\nfun MapPluginExtensionsDelegate.flyTo(\n  cameraOptions: CameraOptions,\n  animationOptions: MapAnimationOptions? = null,\n  animatorListener: Animator.AnimatorListener? = null\n) = (cameraAnimationsPlugin { flyTo(cameraOptions, animationOptions, animatorListener) } as? Cancelable) ?: emptyCancelable\n\n/**\n * Extension pitchBy() function for [MapPluginExtensionsDelegate]\n * Pitch the map by with optional animation.\n *\n * Camera plugin with id = [Plugin.MAPBOX_CAMERA_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n *\n * @param pitch The amount to pitch by\n * @param animationOptions Transition options (animation duration, listeners etc)\n *\n * @return [Cancelable] animator set object or empty cancelable object if associated `MapView` was destroyed.\n */\n@JvmOverloads\nfun MapPluginExtensionsDelegate.pitchBy(\n  pitch: Double,\n  animationOptions: MapAnimationOptions? = null,\n  animatorListener: Animator.AnimatorListener? = null\n) = (cameraAnimationsPlugin { pitchBy(pitch, animationOptions, animatorListener) } as? Cancelable) ?: emptyCancelable\n\n/**\n * Extension scaleBy() function for [MapPluginExtensionsDelegate]\n * Scale the map by with optional animation.\n *\n * Camera plugin with id = [Plugin.MAPBOX_CAMERA_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n *\n * @param amount The amount to scale by\n * @param screenCoordinate The optional focal point to scale on\n * @param animationOptions Transition options (animation duration, listeners etc)\n *\n * @return [Cancelable] animator set object or empty cancelable object if associated `MapView` was destroyed.\n */\n@JvmOverloads\nfun MapPluginExtensionsDelegate.scaleBy(\n  amount: Double,\n  screenCoordinate: ScreenCoordinate?,\n  animationOptions: MapAnimationOptions? = null,\n  animatorListener: Animator.AnimatorListener? = null\n) = (cameraAnimationsPlugin { scaleBy(amount, screenCoordinate, animationOptions, animatorListener) } as? Cancelable) ?: emptyCancelable\n\n/**\n * Extension moveBy() function for [MapPluginExtensionsDelegate]\n * Move the map by a given screen coordinate with optional animation.\n *\n * Camera plugin with id = [Plugin.MAPBOX_CAMERA_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n *\n * @param screenCoordinate The screen coordinate distance to move by\n * @param animationOptions Transition options (animation duration, listeners etc)\n *\n * @return [Cancelable] animator set object or empty cancelable object if associated `MapView` was destroyed.\n */\n@JvmOverloads\nfun MapPluginExtensionsDelegate.moveBy(\n  screenCoordinate: ScreenCoordinate,\n  animationOptions: MapAnimationOptions? = null,\n  animatorListener: Animator.AnimatorListener? = null\n) = (cameraAnimationsPlugin { moveBy(screenCoordinate, animationOptions, animatorListener) } as? Cancelable) ?: emptyCancelable\n\n/**\n * Extension rotateBy() function for [MapPluginExtensionsDelegate]\n * Rotate the map by with optional animation.\n *\n * Camera plugin with id = [Plugin.MAPBOX_CAMERA_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n *\n * @param first The first pointer to rotate on\n * @param second The second pointer to rotate on\n * @param animationOptions Transition options (animation duration, listeners etc)\n *\n * @return [Cancelable] animator set object or empty cancelable object if associated `MapView` was destroyed.\n */\n@JvmOverloads\nfun MapPluginExtensionsDelegate.rotateBy(\n  first: ScreenCoordinate,\n  second: ScreenCoordinate,\n  animationOptions: MapAnimationOptions? = null,\n  animatorListener: Animator.AnimatorListener? = null\n) = (cameraAnimationsPlugin { rotateBy(first, second, animationOptions, animatorListener) } as? Cancelable) ?: emptyCancelable\n\n/**\n * Static method to create instance of Mapbox camera animation plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createCameraAnimationPlugin(): CameraAnimationsPlugin {\n  return CameraAnimationsPluginImpl()\n}\n\n/**\n * Static method to get [CameraAnimatorsFactory].\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun CameraAnimationsPlugin.getCameraAnimatorsFactory(): CameraAnimatorsFactory {\n  return (this as CameraAnimationsPluginImpl).cameraAnimationsFactory\n}\n\n/**\n * Calculates camera animation hints for provided [AnimatorSet] at specified fractions.\n * This API must be called right before the animation is started: moving camera in-between should be avoided.\n *\n * Requirements:\n * 1. [AnimatorSet] must have startDelay = 0 (TODO support non-zero startDelay).\n *  However, a child animator is allowed to have a non-zero startDelay.\n * 2. All child animations must be instances of [CameraAnimator].\n * 3. None of the child animations are allowed to have infinite duration.\n *  Note: [AnimatorSet] itself may have infinite duration.\n *\n * If [AnimatorSet] has zero duration, no camera animation hints are calculated: null is returned.\n *\n * @param fractions list of fractions at which to calculate intermediate camera states\n * @param startCameraState start value of the animations.\n *  Must be provided in case your [AnimatorSet]'s child animators do not have a startValue.\n *\n *  @return [CameraAnimationHint] object, null if calculation could not be performed\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun AnimatorSet.calculateCameraAnimationHint(\n  fractions: List<Float>,\n  startCameraState: CameraState? = null,\n): CameraAnimationHint? {\n  // Make sure all animators in animatorSet are camera animators\n  val cameraAnimators = childAnimations.filterIsInstance<CameraAnimator<*>>()\n  if (cameraAnimators.size != childAnimations.size) {\n    logW(TAG, \"Incompatible animators: all should be instances of CameraAnimator\")\n    return null\n  }\n\n  if (startDelay != 0L) {\n    logW(TAG, \"AnimatorSets with non-zero startDelay are not supported.\")\n    return null\n  }\n\n  if (childAnimations.isEmpty()) {\n    logW(TAG, \"AnimatorSet has no child animations.\")\n    return null\n  }\n\n  val totalDuration = if (duration >= 0) {\n    duration\n  } else {\n    cameraAnimators.maxOf { it.safeTotalDuration() }\n  }\n  return cameraAnimators.calculateCameraAnimationHint(fractions, totalDuration, startCameraState)\n}\n\n/**\n * Calculates camera animation hints for provided list of [Animator] at specified fractions.\n * This API must be called right before the animation is started: moving camera in-between should be avoided.\n *\n * Requirements:\n * 1. None of the animations are allowed to have infinite duration.\n *\n * If all animators have zero duration, no camera animation hints are calculated: null is returned.\n *\n * @param fractions list of fractions at which to calculate intermediate camera states\n * @param startCameraState start value of the animations.\n *  Must be provided in case your [AnimatorSet]'s child animators do not have a startValue.\n *\n *  @return [CameraAnimationHint] object, null if calculation could not be performed\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun <T : CameraAnimator<*>> List<T>.calculateCameraAnimationHint(\n  fractions: List<Float>,\n  startCameraState: CameraState? = null,\n): CameraAnimationHint? {\n  if (isEmpty()) {\n    return null\n  }\n  val totalDuration = maxOf { it.safeTotalDuration() }\n  return calculateCameraAnimationHint(fractions, totalDuration, startCameraState)\n}\n\nprivate fun Animator.safeTotalDuration(): Long {\n  return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n    totalDuration\n  } else {\n    // For pre-N devices, totalDuration is not available, so we use the duration of the animator.\n    duration + startDelay\n  }\n}\n\nprivate fun <T : CameraAnimator<*>> List<T>.calculateCameraAnimationHint(\n  fractions: List<Float>,\n  totalDuration: Long,\n  startCameraState: CameraState?,\n): CameraAnimationHint? {\n  if (isEmpty()) {\n    return null\n  }\n\n  // No need to calculate camera animation hints if the animation is instant\n  if (totalDuration == 0L) {\n    return null\n  }\n\n  if (totalDuration == DURATION_INFINITE || this.any { it.duration == DURATION_INFINITE }) {\n    logW(\n      TAG,\n      \"Animators with infinite duration are not supported. \" +\n        \"Please use finite duration for all animators.\",\n    )\n    return null\n  }\n\n  val cameraOptionsBuilder = CameraOptions.Builder()\n\n  val stages = fractions.map { totalFraction ->\n    cameraOptionsBuilder.clear()\n    this.map { cameraAnimator ->\n      try {\n        val fraction = getRelativeFraction(cameraAnimator, totalDuration, totalFraction)\n        val value = cameraAnimator.getAnimatedValueAt(fraction, startCameraState)\n        updateCameraValue(cameraAnimator, value, cameraOptionsBuilder)\n      } catch (e: UnsupportedOperationException) {\n        logW(\n          TAG,\n          \"Unable to calculate animated value ahead of time for ${cameraAnimator.type.name}: ${e.message}\"\n        )\n      }\n    }\n    val camera = cameraOptionsBuilder.build()\n    // We use totalDuration to keep track of the progress because that's the total duration of the animation. That is,\n    // the time between `setUserAnimationInProgress(true)` and `setUserAnimationInProgress(false)`\n    val progress = (totalDuration * totalFraction).toLong()\n    CameraAnimationHintStage.Builder()\n      .camera(camera)\n      .progress(progress)\n      .build()\n  }\n  return CameraAnimationHint.Builder().stages(stages).build()\n}\n\nprivate fun getRelativeFraction(cameraAnimator: CameraAnimator<*>, totalDuration: Long, totalFraction: Float): Float {\n  val childDuration = cameraAnimator.duration\n  if (childDuration <= 0L) {\n    return 1f\n  }\n  return ((totalFraction * totalDuration - cameraAnimator.startDelay) / childDuration).coerceIn(0f, 1f)\n}\n\ninternal fun updateCameraValue(\n  cameraAnimator: CameraAnimator<*>,\n  animatedValue: Any?,\n  cameraOptionsBuilder: CameraOptions.Builder\n) {\n  when (cameraAnimator) {\n    is CameraCenterAnimator -> cameraOptionsBuilder.center(animatedValue as? Point)\n    is CameraZoomAnimator -> cameraOptionsBuilder.zoom(animatedValue as? Double)\n    is CameraAnchorAnimator -> cameraOptionsBuilder.anchor(animatedValue as? ScreenCoordinate)\n    is CameraPaddingAnimator -> cameraOptionsBuilder.padding(animatedValue as? EdgeInsets)\n    is CameraBearingAnimator -> cameraOptionsBuilder.bearing(animatedValue as? Double)\n    is CameraPitchAnimator -> cameraOptionsBuilder.pitch(animatedValue as? Double)\n  }\n}\n\n/**\n * Convenience method to clear camera options so it can be reused instead of creating\n * new [CameraOptions.Builder].\n */\ninternal fun CameraOptions.Builder.clear() {\n  center(null)\n  padding(null)\n  anchor(null)\n  zoom(null)\n  bearing(null)\n  pitch(null)\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.AnimatorSet\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapboxCameraAnimationException\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.MapCameraPlugin\nimport com.mapbox.maps.plugin.animation.animator.CameraAnchorAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraBearingAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraCenterAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraPaddingAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraPitchAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraZoomAnimator\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapProjectionDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.threading.AnimationThreadController.postOnAnimatorThread\nimport com.mapbox.maps.threading.AnimationThreadController.postOnMainThread\nimport com.mapbox.maps.threading.AnimationThreadController.usingBackgroundThread\nimport com.mapbox.maps.util.isEmpty\nimport java.util.concurrent.CopyOnWriteArraySet\nimport kotlin.properties.Delegates\n\n/**\n * [CameraAnimationsPluginImpl] is designed to rule all the animations happening to the map driven by changing [CameraOptions].\n * It is responsible for:\n *   - Storing all the [ValueAnimator]'s that could be run. Only specific camera animators could be used in this plugin.\n *   - Controlling animation execution - only one [ValueAnimator] of certain type could be run at a time.\n *     If some another animation with same [CameraAnimator.type] is about to start previous one will be cancelled.\n *   - Giving possibility to listen to [CameraOptions] values changes during animations via listeners.\n *   - If several animations of different [CameraAnimator.type] are running simultaneously map camera\n *     will be updated only on oldest animation update (the oldest is the one that was started first).\n *     That actually means that animation start order matters. High-level animations [flyTo] and [easeTo]\n *     will always trigger camera center animator first.\n *\n * [CameraAnimationsPluginImpl] is NOT thread-safe meaning all animations must be started from one thread.\n * However, it doesn't have to be the UI thread.\n */\n@OptIn(MapboxExperimental::class)\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class CameraAnimationsPluginImpl : CameraAnimationsPlugin, MapCameraPlugin {\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal val animators = hashSetOf<CameraAnimator<*>>()\n  private val runningAnimatorsQueue = LinkedHashSet<ValueAnimator>()\n\n  /**\n   * Using single [AnimatorSet] for high-level API functions like easeTo, flyTo etc\n   * Only one high-level animator set could be active in a moment of time.\n   * Consists of set owner + animator set itself.\n   */\n  private var highLevelAnimatorSet: HighLevelAnimatorSet? = null\n\n  private val centerListeners = CopyOnWriteArraySet<CameraAnimatorChangeListener<Point>>()\n  private val zoomListeners = CopyOnWriteArraySet<CameraAnimatorChangeListener<Double>>()\n  private val paddingListeners = CopyOnWriteArraySet<CameraAnimatorChangeListener<EdgeInsets>>()\n  private val anchorListeners =\n    CopyOnWriteArraySet<CameraAnimatorNullableChangeListener<ScreenCoordinate?>>()\n  private val bearingListeners = CopyOnWriteArraySet<CameraAnimatorChangeListener<Double>>()\n  private val pitchListeners = CopyOnWriteArraySet<CameraAnimatorChangeListener<Double>>()\n\n  private val lifecycleListeners = CopyOnWriteArraySet<CameraAnimationsLifecycleListener>()\n\n  /**\n   * Animation fraction at which the camera animation hints will be calculated.\n   * Note: at least 1.0F should be present and entries should be in ascent order.\n   */\n  private val cameraAnimationHintFractions = listOf(0.25F, 0.5F, 0.75F, 1.0F)\n\n  /**\n   * If debug mode is enabled extra logs will be written about animation lifecycle and\n   * some other events that may be useful for debugging.\n   */\n  override var debugMode: Boolean = false\n\n  private var center by Delegates.observable<Point?>(null) { _, old, new ->\n    new?.let {\n      if (old != it) {\n        centerListeners.forEach { listener -> listener.onChanged(it) }\n      }\n    }\n  }\n\n  private var zoom by Delegates.observable<Double?>(null) { _, old, new ->\n    new?.let {\n      if (old != it) {\n        zoomListeners.forEach { listener -> listener.onChanged(it) }\n      }\n    }\n  }\n\n  private var padding by Delegates.observable<EdgeInsets?>(null) { _, old, new ->\n    new?.let {\n      if (old != it) {\n        paddingListeners.forEach { listener -> listener.onChanged(it) }\n      }\n    }\n  }\n\n  /**\n   * Map camera anchor value.\n   * Default value is NULL meaning center of given map view.\n   * Left-top corner is represented as [ScreenCoordinate] (0.0, 0.0).\n   *\n   * If [anchor] is set to some specific value (set directly or by some running anchor animation)\n   * it will be used as anchor for all upcoming animations even if they do not animate anchor directly.\n   *\n   * **Note**: If anchor animator is started and no start value is specified explicitly\n   * and [anchor] = NULL - then start value will be set to ScreenCoordinate(0.0, 0.0) automatically\n   * and it will be start point for interpolation.\n   */\n  override var anchor by Delegates.observable<ScreenCoordinate?>(null) { _, old, new ->\n    if (old != new) {\n      anchorListeners.forEach { listener -> listener.onChanged(new) }\n    }\n  }\n\n  private var bearing by Delegates.observable<Double?>(null) { _, old, new ->\n    new?.let {\n      if (old != it) {\n        bearingListeners.forEach { listener -> listener.onChanged(it) }\n      }\n    }\n  }\n\n  private var pitch by Delegates.observable<Double?>(null) { _, old, new ->\n    new?.let {\n      if (old != it) {\n        pitchListeners.forEach { listener -> listener.onChanged(it) }\n      }\n    }\n  }\n\n  private var cameraOptionsBuilder = CameraOptions.Builder()\n\n  private lateinit var mapDelegateProvider: MapDelegateProvider\n  private lateinit var mapCameraManagerDelegate: MapCameraManagerDelegate\n  private lateinit var mapTransformDelegate: MapTransformDelegate\n  private lateinit var mapProjectionDelegate: MapProjectionDelegate\n  private val getCurrentCameraState = {\n    mapCameraManagerDelegate.cameraState\n  }\n\n  /**\n   * Factory to provide animators for the default animations like easeTo, scaleBy, moveBy, rotateBy, pitchBy\n   */\n  lateinit var cameraAnimationsFactory: CameraAnimatorsFactory\n\n  private enum class AnimationFinishStatus {\n    CANCELED,\n    ENDED\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    mapDelegateProvider = delegateProvider\n    mapCameraManagerDelegate = mapDelegateProvider.mapCameraManagerDelegate\n    mapTransformDelegate = mapDelegateProvider.mapTransformDelegate\n    mapProjectionDelegate = mapDelegateProvider.mapProjectionDelegate\n    cameraAnimationsFactory = CameraAnimatorsFactory(mapDelegateProvider)\n  }\n\n  /**\n   * Called whenever camera position changes.\n   *\n   * @param center camera center\n   * @param zoom zoom\n   * @param pitch pitch in degrees\n   * @param bearing bearing in degrees\n   * @param padding padding\n   */\n  override fun onCameraMove(\n    center: Point,\n    zoom: Double,\n    pitch: Double,\n    bearing: Double,\n    padding: EdgeInsets\n  ) {\n    this.bearing = bearing\n    this.center = center\n    this.padding = padding\n    this.pitch = pitch\n    this.zoom = zoom\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   * Cancel all running animations and cleanup all resources (registered animations, listeners).\n   */\n  override fun cleanup() {\n    unregisterAnimators(*animators.toTypedArray())\n    cancelAnimatorSet()\n    centerListeners.clear()\n    zoomListeners.clear()\n    bearingListeners.clear()\n    pitchListeners.clear()\n    anchorListeners.clear()\n    paddingListeners.clear()\n    lifecycleListeners.clear()\n    animators.clear()\n  }\n\n  /*\n   * CameraOptions that are already applied should be skipped.\n   */\n  private fun skipMapJump(cameraOptions: CameraOptions): Boolean {\n    if (cameraOptions.isEmpty) {\n      return true\n    }\n    if (cameraOptions.anchor != null) {\n      return false\n    }\n    cameraOptions.pitch?.let { userPitch ->\n      // use-case when pitch >= 60 and terrain enabled might result in some optimizations\n      // in gl-native and different result camera state - we check just for the pitch as\n      // checking for terrain enabled requires having the style object and more complex code\n      if (userPitch >= 60.0 || userPitch != pitch) return false\n    }\n    if (cameraOptions.zoom != null && cameraOptions.zoom != zoom) {\n      return false\n    }\n    if (cameraOptions.bearing != null && cameraOptions.bearing != bearing) {\n      return false\n    }\n    if (cameraOptions.center != null && cameraOptions.center != center) {\n      return false\n    }\n    if (cameraOptions.padding != null && cameraOptions.padding != padding) {\n      return false\n    }\n    return true\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal fun performMapJump(cameraOptions: CameraOptions) {\n    if (skipMapJump(cameraOptions)) {\n      if (debugMode) {\n        logI(\n          TAG,\n          \"Setting $cameraOptions to core was skipped due to optimization.\"\n        )\n      }\n      return\n    }\n    // move native map to new position\n    try {\n      // setCamera triggers OnCameraMove that updates camera options and notifies listeners\n      mapCameraManagerDelegate.setCamera(cameraOptions)\n    } catch (e: Exception) {\n      logE(\n        TAG,\n        \"Exception while setting camera options : ${e.message} CameraOptions = $cameraOptions\"\n      )\n    }\n  }\n\n  private fun registerInternalListener(animator: CameraAnimator<*>) {\n    postOnAnimatorThread {\n      animator.addInternalListener(object : Animator.AnimatorListener {\n\n        override fun onAnimationStart(animation: Animator) {\n          // Hack needed to register update listener earlier for 0 duration animators\n          // when using background thread. Due to series of rescheduling in this case and\n          // taking into account that Android will trigger `onAnimationEnd` in the same callchain -\n          // update logic will simply get skipped resulting in no map movement.\n          if (usingBackgroundThread && animation.duration == 0L) {\n            registerInternalUpdateListener(animation as CameraAnimator<*>)\n          }\n          postOnMainThread {\n            onAnimationStartInternal(animation)\n          }\n        }\n\n        private fun onAnimationStartInternal(animation: Animator) {\n          (animation as? CameraAnimator<*>)?.let { startingAnimator ->\n            // check for a specific use-case when canceling an animation with start delay that\n            // has not yet started - in that case onAnimationStart logic must be skipped\n            if (startingAnimator.canceled) {\n              return\n            }\n            startingAnimator.updateObjectValues(getCurrentCameraState)\n            if (startingAnimator.skipped) {\n              // animation was skipped - camera values are already applied\n              return\n            }\n            lifecycleListeners.forEach {\n              it.onAnimatorStarting(startingAnimator.type, startingAnimator, startingAnimator.owner)\n            }\n            mapTransformDelegate.setUserAnimationInProgress(true)\n            // check if such animation is not running already\n            // if it is - then cancel it\n            // Safely iterate over new set because of the possible changes of \"this.animators\" in Animator callbacks\n            HashSet(animators).forEach { existingAnimator ->\n              if (existingAnimator.type == startingAnimator.type && existingAnimator.isRunning && existingAnimator != startingAnimator) {\n                lifecycleListeners.forEach { listener ->\n                  listener.onAnimatorInterrupting(\n                    startingAnimator.type,\n                    existingAnimator,\n                    existingAnimator.owner,\n                    startingAnimator,\n                    startingAnimator.owner\n                  )\n                }\n                postOnAnimatorThread {\n                  existingAnimator.cancel()\n                }\n              }\n            }\n            // finally register update listener in order to update map properly -\n            // if it's not specific use-case using 0-duration animations with background thread\n            if (!usingBackgroundThread || startingAnimator.duration != 0L) {\n              registerInternalUpdateListener(startingAnimator)\n            }\n            if (debugMode) {\n              logI(\n                TAG,\n                \"Animation ${startingAnimator.type.name}(${startingAnimator.hashCode()}) started.\"\n              )\n            }\n          } ?: throw MapboxCameraAnimationException(\n            \"Could not start animation as it must be an instance of CameraAnimator and not null!\"\n          )\n        }\n\n        override fun onAnimationEnd(animation: Animator) {\n          postOnMainThread { finishAnimation(animation, AnimationFinishStatus.ENDED) }\n        }\n\n        override fun onAnimationCancel(animation: Animator) {\n          postOnMainThread { finishAnimation(animation, AnimationFinishStatus.CANCELED) }\n        }\n\n        override fun onAnimationRepeat(animation: Animator) {}\n\n        private fun finishAnimation(animation: Animator, finishStatus: AnimationFinishStatus) {\n          (animation as? CameraAnimator<*>)?.apply {\n            if (debugMode) {\n              val logText = when (finishStatus) {\n                AnimationFinishStatus.CANCELED -> \"was canceled.\"\n                AnimationFinishStatus.ENDED -> \"ended.\"\n              }\n              logI(TAG, \"Animation ${type.name}(${hashCode()})${if (skipped) \" skipped\" else \"\"} $logText\")\n            }\n            // Even if skipped we need to unregister it\n            if (isInternal) {\n              unregisterAnimators(this, cancelAnimators = false)\n              if (debugMode) {\n                logI(TAG, \"Internal Animator ${type.name}(${hashCode()}) was unregistered (${animators.size})\")\n              }\n            }\n            if (skipped) {\n              return\n            }\n            runningAnimatorsQueue.remove(animation)\n            if (runningAnimatorsQueue.isEmpty()) {\n              mapTransformDelegate.setUserAnimationInProgress(false)\n            }\n            lifecycleListeners.forEach {\n              when (finishStatus) {\n                AnimationFinishStatus.CANCELED -> it.onAnimatorCancelling(type, this, owner)\n                AnimationFinishStatus.ENDED -> it.onAnimatorEnding(type, this, owner)\n              }\n            }\n          } ?: throw MapboxCameraAnimationException(\n            \"Could not finish animation as it must be an instance of CameraAnimator and not null!\"\n          )\n        }\n      })\n    }\n  }\n\n  private fun registerInternalUpdateListener(animator: CameraAnimator<*>) {\n    // Since we have the `animator` we can constructor the update listener once here instead of\n    // every time the animator is updated.\n    val updateInternalFun = { onAnimationUpdateInternal(animator) }\n    animator.addInternalUpdateListener { postOnMainThread(updateInternalFun) }\n  }\n\n  private fun onAnimationUpdateInternal(animator: CameraAnimator<*>) {\n    if (animator.canceled || animator.endedManually) {\n      if (debugMode) {\n        logW(\n          TAG,\n          \"Ignoring onAnimationUpdateInternal callback as animator is cancelled: \" +\n            \"${animator.canceled}; is ended normally: ${animator.endedManually}.\",\n        )\n      }\n      return\n    }\n    // add current animator to queue-set if was not present\n    runningAnimatorsQueue.add(animator)\n\n    // Anchor animator is a special case. It won't affect the camera by itself so we cache the value\n    // and apply it to the other animators.\n    if (animator.type == CameraAnimatorType.ANCHOR) {\n      anchor = animator.animatedValue as ScreenCoordinate\n    } else {\n      // set current animator value to the camera options builder\n      updateCameraValue(animator, animator.animatedValue, cameraOptionsBuilder)\n\n      // commit applies changes immediately\n      // this helps to avoid camera animations jitter noticeable on high zoom levels using location puck following mode.\n      commitChanges()\n    }\n  }\n\n  private fun commitChanges() {\n    performMapJump(cameraOptionsBuilder.anchor(anchor).build())\n    // reset values so it can be reused\n    cameraOptionsBuilder.clear()\n  }\n\n  private fun cancelAnimatorSet() {\n    highLevelAnimatorSet?.let {\n      postOnAnimatorThread {\n        it.animatorSet.cancel()\n        it.animatorSet.removeAllListeners()\n      }\n    }\n  }\n\n  /**\n   * Register given [ValueAnimator]'s.\n   * Such [ValueAnimator]'s must be created with static methods like [CameraAnimationsPlugin.createCenterAnimator] or similar.\n   * Only registered animations affect MapboxMap and would not even start otherwise.\n   *\n   * @param cameraAnimators Variable number of [ValueAnimator]'s\n   */\n  override fun registerAnimators(\n    vararg cameraAnimators: ValueAnimator\n  ) {\n    postOnMainThread {\n      for (animator in cameraAnimators) {\n        if (animator is CameraAnimator<*>) {\n          registerInternalListener(animator)\n        } else {\n          logW(TAG, \"All animators must be CameraAnimator's to be registered!\")\n          return@postOnMainThread\n        }\n      }\n      animators.addAll(cameraAnimators.map { it as CameraAnimator<*> })\n      if (debugMode) {\n        logI(TAG, \"Registered ${cameraAnimators.size} animators. Currently, ${animators.size} animators registered.\")\n      }\n    }\n  }\n\n  /**\n   * Unregister given [ValueAnimator]'s.\n   *\n   * @param cameraAnimators variable number of [ValueAnimator]'s\n   * @param cancelAnimators flag to manage animators cancelling\n   */\n  override fun unregisterAnimators(\n    vararg cameraAnimators: ValueAnimator,\n    cancelAnimators: Boolean\n  ) {\n    postOnMainThread {\n      for (animator in cameraAnimators) {\n        if (animator is CameraAnimator<*>) {\n          postOnAnimatorThread {\n            if (cancelAnimators) {\n              animator.cancel()\n            }\n            animator.removeInternalListener()\n            animator.removeInternalUpdateListener()\n          }\n        } else {\n          logW(TAG, \"All animators must be CameraAnimator's to be unregistered!\")\n          return@postOnMainThread\n        }\n      }\n      animators.removeAll(cameraAnimators.map { it as CameraAnimator<*> })\n    }\n  }\n\n  /**\n   * Unregister all previously registered [ValueAnimator]'s.\n   */\n  fun unregisterAllAnimators() {\n    unregisterAnimators(*animators.toTypedArray())\n  }\n\n  /**\n   * Cancel all animators except ones owned by [exceptOwnerList] list.\n   */\n  override fun cancelAllAnimators(exceptOwnerList: List<String>) {\n    // Safely iterate over new set because of the possible changes of \"this.animators\" in Animator callbacks\n    HashSet(animators).forEach {\n      if (!exceptOwnerList.contains(it.owner)) {\n        postOnAnimatorThread {\n          it.cancel()\n        }\n      }\n    }\n    if (!exceptOwnerList.contains(highLevelAnimatorSet?.owner)) {\n      cancelAnimatorSet()\n    }\n  }\n\n  // property update listeners\n\n  /**\n   * Add [CameraAnimatorChangeListener] to receive map zoom updates.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun addCameraZoomChangeListener(listener: CameraAnimatorChangeListener<Double>) {\n    zoomListeners.add(listener)\n  }\n\n  /**\n   * Remove [CameraAnimatorChangeListener]. No updates will arrive after that.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun removeCameraZoomChangeListener(listener: CameraAnimatorChangeListener<Double>) {\n    zoomListeners.remove(listener)\n  }\n\n  /**\n   * Add [CameraAnimatorChangeListener] to receive map center updates.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun addCameraCenterChangeListener(listener: CameraAnimatorChangeListener<Point>) {\n    centerListeners.add(listener)\n  }\n\n  /**\n   * Remove [CameraAnimatorChangeListener]. No updates will arrive after that.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun removeCameraCenterChangeListener(listener: CameraAnimatorChangeListener<Point>) {\n    centerListeners.remove(listener)\n  }\n\n  /**\n   * Add [CameraAnimatorChangeListener] to receive map padding updates.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun addCameraPaddingChangeListener(listener: CameraAnimatorChangeListener<EdgeInsets>) {\n    paddingListeners.add(listener)\n  }\n\n  /**\n   * Remove [CameraAnimatorChangeListener]. No updates will arrive after that.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun removeCameraPaddingChangeListener(listener: CameraAnimatorChangeListener<EdgeInsets>) {\n    paddingListeners.remove(listener)\n  }\n\n  /**\n   * Add [CameraAnimatorNullableChangeListener] to receive map anchor updates.\n   *\n   * @param listener Instance of [CameraAnimatorNullableChangeListener]\n   */\n  override fun addCameraAnchorChangeListener(listener: CameraAnimatorNullableChangeListener<ScreenCoordinate?>) {\n    anchorListeners.add(listener)\n  }\n\n  /**\n   * Remove [CameraAnimatorNullableChangeListener]. No updates will arrive after that.\n   *\n   * @param listener Instance of [CameraAnimatorNullableChangeListener]\n   */\n  override fun removeCameraAnchorChangeListener(listener: CameraAnimatorNullableChangeListener<ScreenCoordinate?>) {\n    anchorListeners.remove(listener)\n  }\n\n  /**\n   * Add [CameraAnimatorChangeListener] to receive map bearing updates.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun addCameraBearingChangeListener(listener: CameraAnimatorChangeListener<Double>) {\n    bearingListeners.add(listener)\n  }\n\n  /**\n   * Remove [CameraAnimatorChangeListener]. No updates will arrive after that.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun removeCameraBearingChangeListener(listener: CameraAnimatorChangeListener<Double>) {\n    bearingListeners.remove(listener)\n  }\n\n  /**\n   * Add [CameraAnimatorChangeListener] to receive map pitch updates.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun addCameraPitchChangeListener(listener: CameraAnimatorChangeListener<Double>) {\n    pitchListeners.add(listener)\n  }\n\n  /**\n   * Remove [CameraAnimatorChangeListener]. No updates will arrive after that.\n   *\n   * @param listener Instance of [CameraAnimatorChangeListener]\n   */\n  override fun removeCameraPitchChangeListener(listener: CameraAnimatorChangeListener<Double>) {\n    pitchListeners.remove(listener)\n  }\n\n  /**\n   * Add given [CameraAnimationsLifecycleListener] for capturing all events about animators lifecycle.\n   *\n   */\n  override fun addCameraAnimationsLifecycleListener(listener: CameraAnimationsLifecycleListener) {\n    lifecycleListeners.add(listener)\n  }\n\n  /**\n   * Remove given [CameraAnimationsLifecycleListener] for capturing all events about animators lifecycle.\n   *\n   */\n  override fun removeCameraAnimationsLifecycleListener(listener: CameraAnimationsLifecycleListener) {\n    lifecycleListeners.remove(listener)\n  }\n\n  /**\n   * Ease the map camera to a given camera options and animation options.\n   *\n   * @param cameraOptions The camera options to ease to\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  override fun easeTo(\n    cameraOptions: CameraOptions,\n    animationOptions: MapAnimationOptions?,\n    animatorListener: Animator.AnimatorListener?\n  ): Cancelable {\n    if (cameraOptions.isEmpty) {\n      logW(TAG, \"No-op easeTo camera high-level animation as CameraOptions.isEmpty == true.\")\n      return Cancelable { }\n    }\n    return startHighLevelAnimation(\n      cameraAnimationsFactory.getEaseTo(cameraOptions),\n      animationOptions,\n      animatorListener\n    )\n  }\n\n  /**\n   * Move the map by a given screen coordinate with optional animation.\n   *\n   * @param screenCoordinate The screen coordinate distance to move by\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  override fun moveBy(\n    screenCoordinate: ScreenCoordinate,\n    animationOptions: MapAnimationOptions?,\n    animatorListener: Animator.AnimatorListener?\n  ) = startHighLevelAnimation(\n    cameraAnimationsFactory.getMoveBy(screenCoordinate),\n    animationOptions,\n    animatorListener\n  )\n\n  /**\n   * Scale the map by with optional animation.\n   *\n   * @param amount The amount to scale by\n   * @param screenCoordinate The optional focal point to scale on\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  override fun scaleBy(\n    amount: Double,\n    screenCoordinate: ScreenCoordinate?,\n    animationOptions: MapAnimationOptions?,\n    animatorListener: Animator.AnimatorListener?\n  ) = startHighLevelAnimation(\n    cameraAnimationsFactory.getScaleBy(amount, screenCoordinate),\n    animationOptions,\n    animatorListener\n  )\n\n  /**\n   * Calculate target zoom by applying scale\n   *\n   * @param amount The amount to scale by\n   * @param currentZoom The current zoom value\n   *\n   * @return [Cancelable] animator set object.\n   */\n  override fun calculateScaleBy(amount: Double, currentZoom: Double): Double =\n    CameraTransform.calculateScaleBy(amount, currentZoom)\n\n  /**\n   * Rotate the map by with optional animation.\n   *\n   * @param first The first pointer to rotate on\n   * @param second The second pointer to rotate on\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  override fun rotateBy(\n    first: ScreenCoordinate,\n    second: ScreenCoordinate,\n    animationOptions: MapAnimationOptions?,\n    animatorListener: Animator.AnimatorListener?\n  ) = startHighLevelAnimation(\n    cameraAnimationsFactory.getRotateBy(first, second),\n    animationOptions,\n    animatorListener\n  )\n\n  /**\n   * Pitch the map by with optional animation.\n   *\n   * @param pitch The amount to pitch by\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  override fun pitchBy(\n    pitch: Double,\n    animationOptions: MapAnimationOptions?,\n    animatorListener: Animator.AnimatorListener?\n  ) = startHighLevelAnimation(\n    cameraAnimationsFactory.getPitchBy(pitch),\n    animationOptions,\n    animatorListener\n  )\n\n  /**\n   * Fly the map camera to a given camera options.\n   *\n   * This method implements an “optimal path” animation, as detailed in:\n   * Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and\n   * panning.” INFOVIS ’03. pp. 15–22.\n   * [The online documentation](https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5).\n   * Where applicable, local variable documentation begins with the associated\n   * variable or function in van Wijk (2003).\n   *\n   * @param cameraOptions The camera options to fly to\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  override fun flyTo(\n    cameraOptions: CameraOptions,\n    animationOptions: MapAnimationOptions?,\n    animatorListener: Animator.AnimatorListener?\n  ): Cancelable {\n    if (cameraOptions.isEmpty) {\n      logW(TAG, \"No-op flyTo camera high-level animation as CameraOptions.isEmpty == true.\")\n      return Cancelable { }\n    }\n    return startHighLevelAnimation(\n      cameraAnimationsFactory.getFlyTo(cameraOptions),\n      animationOptions,\n      animatorListener\n    )\n  }\n\n  /**\n   * Create CameraZoomAnimator\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  override fun createZoomAnimator(\n    options: CameraAnimatorOptions<Double>,\n    block: (ValueAnimator.() -> Unit)?\n  ): ValueAnimator = CameraZoomAnimator(options, block)\n\n  /**\n   * Create CameraAnchorAnimator\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  override fun createAnchorAnimator(\n    options: CameraAnimatorOptions<ScreenCoordinate>,\n    block: (ValueAnimator.() -> Unit)?\n  ): ValueAnimator = CameraAnchorAnimator(options, block)\n\n  /**\n   * Create CameraBearingAnimator. Current map camera option will be applied on animation start if not specified explicitly with [options.startValue][CameraAnimatorOptions.startValue].\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param useShortestPath if set to True shortest bearing path will be applied while animating bearing values.\n   * If set to False clock-wise rotation will be used if next target is greater or equal than current one\n   * and counter clock-wise rotation will be used if next target less than current one.\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  override fun createBearingAnimator(\n    options: CameraAnimatorOptions<Double>,\n    useShortestPath: Boolean,\n    block: (ValueAnimator.() -> Unit)?\n  ): ValueAnimator = CameraBearingAnimator(options, useShortestPath, block)\n\n  /**\n   * Create CameraPitchAnimator. Current map camera option will be applied on animation start if not specified explicitly with [options.startValue][CameraAnimatorOptions.startValue].\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  override fun createPitchAnimator(\n    options: CameraAnimatorOptions<Double>,\n    block: (ValueAnimator.() -> Unit)?\n  ): ValueAnimator = CameraPitchAnimator(options, block)\n\n  /**\n   * Create CameraPaddingAnimator. Current map camera option will be applied on animation start if not specified explicitly with [options.startValue][CameraAnimatorOptions.startValue].\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  override fun createPaddingAnimator(\n    options: CameraAnimatorOptions<EdgeInsets>,\n    block: (ValueAnimator.() -> Unit)?\n  ): ValueAnimator = CameraPaddingAnimator(options, block)\n\n  /**\n   * Create CameraCenterAnimator. Current map camera option will be applied on animation start if not specified explicitly with [options.startValue][CameraAnimatorOptions.startValue].\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param useShortestPath if set to True, shortest path will be applied when the start and end camera center is across the antimeridian, for example from -170 to 170 longitude.\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  override fun createCenterAnimator(\n    options: CameraAnimatorOptions<Point>,\n    useShortestPath: Boolean,\n    block: (ValueAnimator.() -> Unit)?\n  ): ValueAnimator =\n    CameraCenterAnimator(options = options, useShortestPath = useShortestPath, block = block)\n\n  /**\n   * Play given [ValueAnimator]'s together.\n   *\n   * Note: [animators] will get registered and run in the same order as passed here.\n   * This is important if any actions should be run before or after all the animators, e.g. [Animator.AnimatorListener.onAnimationEnd] should be registered for the **last** animator from [animators] to be run after all the [animators] ended.\n   *\n   * @param animators Variable number of [ValueAnimator]'s\n   */\n  override fun playAnimatorsTogether(vararg animators: ValueAnimator) {\n    if (animators.isEmpty()) {\n      logW(\n        TAG,\n        \"No-op playAnimatorsTogether() as no animators are passed\"\n      )\n      return\n    }\n    val cameraAnimators = mutableListOf<CameraAnimator<*>>()\n    for (cameraAnimator in animators) {\n      if (cameraAnimator is CameraAnimator<*>) {\n        cameraAnimator.isInternal = true\n        if (cameraAnimator.owner == null) {\n          cameraAnimator.owner = MapAnimationOwnerRegistry.INTERNAL\n        }\n        cameraAnimators.add(cameraAnimator)\n      } else {\n        logW(TAG, \"All animators must be CameraAnimator's to be played together!\")\n      }\n    }\n    registerAnimators(*cameraAnimators.toTypedArray())\n    AnimatorSet().apply {\n      playTogether(*cameraAnimators.toTypedArray())\n      postOnAnimatorThread { start() }\n    }\n  }\n\n  /**\n   * Play given [ValueAnimator]'s sequentially.\n   *\n   * @param animators Variable number of [ValueAnimator]'s\n   */\n  override fun playAnimatorsSequentially(vararg animators: ValueAnimator) {\n    if (animators.isEmpty()) {\n      logW(\n        TAG,\n        \"No-op playAnimatorsSequentially() as no animators are passed\"\n      )\n      return\n    }\n    val cameraAnimators = mutableListOf<CameraAnimator<*>>()\n    for (cameraAnimator in animators) {\n      if (cameraAnimator is CameraAnimator<*>) {\n        cameraAnimator.isInternal = true\n        if (cameraAnimator.owner == null) {\n          cameraAnimator.owner = MapAnimationOwnerRegistry.INTERNAL\n        }\n        cameraAnimators.add(cameraAnimator)\n      } else {\n        logW(TAG, \"All animators must be CameraAnimator's to be played sequentially!\")\n      }\n    }\n    registerAnimators(*cameraAnimators.toTypedArray())\n    AnimatorSet().apply {\n      playSequentially(*cameraAnimators.toTypedArray())\n      postOnAnimatorThread { start() }\n    }\n  }\n\n  /**\n   * Convenient property to clean up highLevelAnimatorSet listener on animation end.\n   * This is reused to avoid recreating new listener each time.\n   */\n  private val clearHighLevelAnimatorSetListener = object : AnimatorListenerAdapter() {\n    override fun onAnimationEnd(animation: Animator) {\n      // Make sure we only clean the current highLevelAnimatorSet\n      if (highLevelAnimatorSet?.animatorSet === animation) {\n        highLevelAnimatorSet = null\n      }\n    }\n  }\n\n  private fun startHighLevelAnimation(\n    animators: Array<CameraAnimator<*>>,\n    animationOptions: MapAnimationOptions?,\n    animatorListener: Animator.AnimatorListener?\n  ): Cancelable {\n    if (animators.isEmpty()) {\n      logW(\n        TAG,\n        \"No-op camera high-level animation as CameraOptions are empty.\"\n      )\n      return Cancelable { }\n    }\n\n    animators.forEach {\n      it.isInternal = true\n      it.owner = animationOptions?.owner\n    }\n    cancelAnimatorSet()\n    registerAnimators(*animators)\n    val animatorSet = AnimatorSet().apply {\n      animationOptions?.duration?.let {\n        duration = it\n      }\n      animationOptions?.startDelay?.let {\n        startDelay = it\n      }\n      animationOptions?.interpolator?.let {\n        interpolator = it\n      }\n      // listeners in Android SDK use non thread safe lists\n      postOnAnimatorThread {\n        addListener(clearHighLevelAnimatorSetListener)\n        animatorListener?.let {\n          addListener(it)\n        }\n      }\n\n      playTogether(*animators)\n    }\n    animatorSet.calculateCameraAnimationHint(cameraAnimationHintFractions)?.let {\n      mapTransformDelegate.setCameraAnimationHint(it)\n    }\n\n    return HighLevelAnimatorSet(animationOptions?.owner, animatorSet).also {\n      highLevelAnimatorSet = it\n      postOnAnimatorThread { it.animatorSet.start() }\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  internal companion object {\n    internal const val TAG = \"Mbgl-CameraManager\"\n  }\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorsFactory.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.ValueAnimator\nimport android.view.animation.Interpolator\nimport androidx.core.view.animation.PathInterpolatorCompat\nimport androidx.interpolator.view.animation.FastOutSlowInInterpolator\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MercatorCoordinate\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion.cameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.CameraTransform.deg2rad\nimport com.mapbox.maps.plugin.animation.CameraTransform.offset\nimport com.mapbox.maps.plugin.animation.CameraTransform.rad2deg\nimport com.mapbox.maps.plugin.animation.CameraTransform.scaleZoom\nimport com.mapbox.maps.plugin.animation.CameraTransform.wrapCoordinate\nimport com.mapbox.maps.plugin.animation.CameraTransform.zoomScale\nimport com.mapbox.maps.plugin.animation.animator.*\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapProjectionDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport kotlin.math.*\n\n/**\n *  [CameraAnimatorsFactory] stands for storing default animation options.\n *  Provides default animators for \"easeTo\", \"scaleBy\", \"pitchBy\", \"moveBy\", \"rotateBy\" animations\n */\nclass CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelegateProvider) {\n\n  private val mapTransformDelegate: MapTransformDelegate = mapDelegateProvider.mapTransformDelegate\n  private val mapProjectionDelegate: MapProjectionDelegate =\n    mapDelegateProvider.mapProjectionDelegate\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate = mapDelegateProvider.mapCameraManagerDelegate\n\n  /**\n   * Get default animators for \"easeTo\" animation\n   *\n   * @param cameraOptions Camera options values to animate\n   */\n  @JvmOverloads\n  fun getEaseTo(cameraOptions: CameraOptions, owner: String? = null): Array<CameraAnimator<*>> {\n    val animationList = mutableListOf<ValueAnimator>()\n    val currentCameraState = mapCameraManagerDelegate.cameraState\n\n    cameraOptions.center?.let { target ->\n      animationList.add(\n        CameraCenterAnimator(\n          options = cameraAnimatorOptions(target) {\n            startValue(currentCameraState.center)\n          },\n          useShortestPath = true,\n          block = defaultAnimationParameters[CameraAnimatorType.CENTER]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n\n    cameraOptions.anchor?.let {\n      animationList.add(\n        CameraAnchorAnimator(\n          options = cameraAnimatorOptions(it) {\n            startValue(it)\n          },\n          block = defaultAnimationParameters[CameraAnimatorType.ANCHOR]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n\n    cameraOptions.bearing?.let {\n      animationList.add(\n        CameraBearingAnimator(\n          options = cameraAnimatorOptions(it) {\n            startValue(currentCameraState.bearing)\n          },\n          useShortestPath = true,\n          block = defaultAnimationParameters[CameraAnimatorType.BEARING]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n\n    cameraOptions.padding?.let { target ->\n      animationList.add(\n        CameraPaddingAnimator(\n          options = cameraAnimatorOptions(target) {\n            startValue(currentCameraState.padding)\n          },\n          block = defaultAnimationParameters[CameraAnimatorType.PADDING]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n\n    cameraOptions.pitch?.let { target ->\n      animationList.add(\n        CameraPitchAnimator(\n          options = cameraAnimatorOptions(target) {\n            startValue(currentCameraState.pitch)\n          },\n          block = defaultAnimationParameters[CameraAnimatorType.PITCH]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n\n    cameraOptions.zoom?.let { target ->\n      animationList.add(\n        CameraZoomAnimator(\n          options = cameraAnimatorOptions(target) {\n            startValue(currentCameraState.zoom)\n          },\n          block = defaultAnimationParameters[CameraAnimatorType.ZOOM]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n\n    return animationList.map { it as CameraAnimator<*> }.toTypedArray()\n  }\n\n  /**\n   * Get default animators for \"pitchBy\" animation\n   * Add pitch value to current camera pitch\n   *\n   * @param pitch The amount to pitch by in degrees\n   * @return Array of the created animators\n   */\n  @JvmOverloads\n  fun getPitchBy(pitch: Double, owner: String? = null): Array<CameraAnimator<*>> {\n    val startPitch = mapCameraManagerDelegate.cameraState.pitch\n    return arrayOf(\n      CameraPitchAnimator(\n        options = cameraAnimatorOptions(startPitch + pitch) {\n          startValue(startPitch)\n        },\n        block = defaultAnimationParameters[CameraAnimatorType.PITCH]\n      ).apply {\n        owner?.let { customOwner ->\n          this.owner = customOwner\n        }\n      }\n    )\n  }\n\n  /**\n   * Get default animators for \"scaleBy\" animation\n   * Add scale value to current camera scale\n   *\n   * @param amount The amount to scale by\n   * @param anchor The optional focal point to scale on\n   * @return Array of the created animators\n   */\n  @JvmOverloads\n  fun getScaleBy(\n    amount: Double,\n    anchor: ScreenCoordinate? = null,\n    owner: String? = null\n  ): Array<CameraAnimator<*>> {\n    val animationList = mutableListOf<CameraAnimator<*>>()\n    anchor?.let {\n      animationList.add(\n        CameraAnchorAnimator(\n          options = cameraAnimatorOptions(it) {\n            startValue(it)\n          },\n          block = defaultAnimationParameters[CameraAnimatorType.ANCHOR]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n    val currentZoom = mapCameraManagerDelegate.cameraState.zoom\n    val newScale = CameraTransform.calculateScaleBy(amount, currentZoom)\n    animationList.add(\n      CameraZoomAnimator(\n        options = cameraAnimatorOptions(newScale) {\n          startValue(currentZoom)\n        },\n        block = defaultAnimationParameters[CameraAnimatorType.ZOOM]\n      ).apply {\n        owner?.let { customOwner ->\n          this.owner = customOwner\n        }\n      }\n    )\n    return animationList.toTypedArray()\n  }\n\n  /**\n   * Get default animators for \"moveBy\" animation\n   * Add offset to current camera position\n   *\n   * @param offset The screen coordinate distance to move by\n   * @return Array of the created animators\n   */\n  @JvmOverloads\n  fun getMoveBy(offset: ScreenCoordinate, owner: String? = null): Array<CameraAnimator<*>> {\n    val cameraState = mapCameraManagerDelegate.cameraState\n    val centerTarget = CameraTransform.calculateLatLngMoveBy(\n      offset,\n      cameraState,\n      mapTransformDelegate,\n      mapCameraManagerDelegate\n    )\n    return arrayOf(\n      CameraCenterAnimator(\n        options = cameraAnimatorOptions(centerTarget) {\n          startValue(cameraState.center)\n        },\n        useShortestPath = true,\n        block = defaultAnimationParameters[CameraAnimatorType.CENTER]\n      ).apply {\n        owner?.let { customOwner ->\n          this.owner = customOwner\n        }\n      }\n    )\n  }\n\n  /**\n   * Get default animators for \"rotateBy\" animation\n   *\n   * @param first The first pointer to rotate on\n   * @param second The second pointer to rotate on\n   * @return Array of the created animators\n   */\n  @JvmOverloads\n  fun getRotateBy(\n    first: ScreenCoordinate,\n    second: ScreenCoordinate,\n    owner: String? = null\n  ): Array<CameraAnimator<*>> {\n    val cameraOptions = mapCameraManagerDelegate.cameraState\n    val mapSizePixels = mapTransformDelegate.getMapOptions().size\n    val cameraBearingDegrees = cameraOptions.bearing\n    if (mapSizePixels != null) {\n      var mapCenter = CameraTransform.getMapCenter(\n        cameraOptions.padding,\n        mapSizePixels\n      )\n      val cameraBearingRadians = -cameraBearingDegrees.deg2rad()\n      val offset = first.offset(mapCenter)\n      val distance = hypot(offset.x, offset.y)\n\n      // If the first click was too close to the center, move the center of rotation by 200 pixels\n      // in the direction of the click.\n      if (distance < 200) {\n        val heightOffset = -200\n        val rotateBearing = atan2(offset.y, offset.x)\n        mapCenter = ScreenCoordinate(\n          first.x + cos(rotateBearing) * heightOffset,\n          first.y + sin(rotateBearing) * heightOffset\n        )\n      }\n\n      val angleRadians = CameraTransform.angleBetween(\n        first.offset(mapCenter),\n        second.offset(mapCenter)\n      )\n      val bearing = -(cameraBearingRadians + angleRadians).rad2deg()\n\n      return arrayOf(\n        CameraBearingAnimator(\n          options = cameraAnimatorOptions(bearing) {\n            startValue(cameraBearingDegrees)\n          },\n          useShortestPath = true,\n          block = defaultAnimationParameters[CameraAnimatorType.BEARING]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n    return emptyArray()\n  }\n\n  /**\n   * Get default animators for \"flyTo\" animation\n   *\n   * @param cameraOptions Camera options values to animate\n   */\n  @JvmOverloads\n  fun getFlyTo(cameraOptions: CameraOptions, owner: String? = null): Array<CameraAnimator<*>> {\n\n    val currentCameraState = mapCameraManagerDelegate.cameraState\n\n    val startPadding = currentCameraState.padding\n    val endPadding = cameraOptions.padding ?: startPadding\n    val endPointRaw = (cameraOptions.center ?: currentCameraState.center).wrapCoordinate()\n    var endZoom = cameraOptions.zoom ?: currentCameraState.zoom\n    val endBearing = cameraOptions.bearing ?: currentCameraState.bearing\n    val startPitch = currentCameraState.pitch\n    val endPitch = cameraOptions.pitch ?: startPitch\n\n    val startBearing = currentCameraState.bearing\n    val startScale = 2.0.pow(currentCameraState.zoom)\n    val startZoom = startScale.scaleZoom()\n    endZoom = endZoom.coerceIn(\n      mapCameraManagerDelegate.getBounds().minZoom,\n      mapCameraManagerDelegate.getBounds().maxZoom\n    )\n\n    // Determine endpoints\n    var startPointRaw = currentCameraState.center.wrapCoordinate()\n    startPointRaw = CameraTransform.unwrapForShortestPath(startPointRaw, endPointRaw)\n\n    val startPoint = mapProjectionDelegate.project(startPointRaw, startScale)\n    val endPoint = mapProjectionDelegate.project(endPointRaw, startScale)\n\n    // w₀: Initial visible span, measured in pixels at the initial scale.\n    // Known henceforth as a <i>screenful</i>.\n\n    val size = mapTransformDelegate.getSize()\n    val pixelRatio = mapTransformDelegate.getMapOptions().pixelRatio\n    val w0 = if (size.width.toDouble() != endPadding.left + endPadding.right &&\n      size.height.toDouble() != endPadding.bottom + endPadding.top\n    ) {\n      max(\n        (size.width - endPadding.left - endPadding.right) / pixelRatio,\n        (size.height - endPadding.top - endPadding.bottom) / pixelRatio\n      )\n    } else {\n      max(\n        size.width.toDouble() / pixelRatio,\n        size.height.toDouble() / pixelRatio\n      )\n    }\n    // w₁: Final visible span, measured in pixels with respect to the initial\n    // scale.\n    val w1 = w0 / (endZoom - startZoom).zoomScale()\n    // Length of the flight path as projected onto the ground plane, measured\n    // in pixels from the world image origin at the initial scale.\n    val u1 = hypot((endPoint.offset(startPoint)).x, (endPoint.offset(startPoint)).y)\n\n    val rho = 1.42\n    val rho2 = rho * rho\n\n    /**\n     * rᵢ: Returns the zoom-out factor at one end of the animation.\n     *\n     * @param i ∈ {0, 1}\n     */\n    fun r(i: Int): Double {\n      // bᵢ\n      val b = (w1 * w1 - w0 * w0 + (if (i == 0) 1 else -1) * rho2 * rho2 * u1 * u1) /\n        (2 * (if (i == 0) w0 else w1) * rho2 * u1)\n      return ln(sqrt(b * b + 1) - b)\n    }\n\n    // r₀: Zoom-out factor during ascent.\n    val r0 = if (u1 != 0.0) {\n      r(0)\n    } else {\n      Double.POSITIVE_INFINITY\n    }\n    val r1 = if (u1 != 0.0) {\n      r(1)\n    } else {\n      Double.POSITIVE_INFINITY\n    }\n\n    // When u₀ = u₁, the optimal path doesn’t require both ascent and descent.\n    val isClose = abs(u1) < 0.000001 || r0.isInfinite() || r1.isInfinite()\n\n    /** w(s): Returns the visible span on the ground, measured in pixels with respect to the initial scale.\n     * Assumes an angular field of view of 2 arctan ½ ≈ 53°.\n     */\n    fun w(s: Double) = if (isClose) {\n      exp((if (w1 < w0) -1 else 1) * rho * s)\n    } else {\n      cosh(r0) / cosh(r0 + rho * s)\n    }\n\n    // u(s): Returns the distance along the flight path as projected onto the\n    // ground plane, measured in pixels from the world image origin at the\n    // initial scale.\n    fun u(s: Double) = if (isClose)\n      0.0\n    else\n      w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2 / u1\n\n    // S: Total length of the flight path, measured in ρ-screenfuls.\n    val S = if (isClose)\n      abs(ln(w1 / w0)) / rho\n    else\n      (r1 - r0) / rho\n\n    val animators = mutableListOf(\n      CameraCenterAnimator(\n        evaluator = { fraction, _, _ ->\n          val safeFraction = fraction.getSafeFraction()\n          // s: The distance traveled along the flight path, measured in\n          // ρ-screenfuls.\n          val s = safeFraction * S\n          val us = if (safeFraction == 1.0f) 1.0 else u(s)\n          val interpolated = MercatorCoordinate(\n            startPoint.x + us * (endPoint.x - startPoint.x),\n            startPoint.y + us * (endPoint.y - startPoint.y)\n          )\n          mapProjectionDelegate.unproject(interpolated, startScale)\n        },\n        options = cameraAnimatorOptions(endPointRaw) {\n          startValue(startPointRaw)\n        },\n        useShortestPath = true,\n        block = defaultAnimationParameters[CameraAnimatorType.CENTER]\n      ).apply {\n        owner?.let { customOwner ->\n          this.owner = customOwner\n        }\n      },\n      CameraZoomAnimator(\n        evaluator = object : CameraTypeEvaluator<Double> {\n          override fun canSkip(cameraCurrentValue: Any, startValue: Any, values: Array<*>): Boolean {\n            return S == 0.0\n          }\n\n          override fun evaluate(fraction: Float, startValue: Double, endValue: Double): Double {\n            val safeFraction = fraction.getSafeFraction()\n            // s: The distance traveled along the flight path, measured in\n            // ρ-screenfuls.\n            val s = safeFraction * S\n            return startZoom + (1 / w(s)).scaleZoom()\n          }\n        },\n        options = cameraAnimatorOptions(endZoom) {\n          startValue(startZoom)\n        },\n        block = defaultAnimationParameters[CameraAnimatorType.ZOOM]\n      ).apply {\n        owner?.let { customOwner ->\n          this.owner = customOwner\n        }\n      }\n    )\n\n    if (endBearing != startBearing) {\n      animators.add(\n        CameraBearingAnimator(\n        options = cameraAnimatorOptions(endBearing) {\n          startValue(startBearing)\n        },\n        useShortestPath = true,\n        block = defaultAnimationParameters[CameraAnimatorType.BEARING]\n      ).apply {\n        owner?.let { customOwner ->\n          this.owner = customOwner\n        }\n      }\n      )\n    }\n\n    if (endPitch != startPitch) {\n      animators.add(\n        CameraPitchAnimator(\n          options = cameraAnimatorOptions(endPitch) {\n            startValue(startPitch)\n          },\n          block = defaultAnimationParameters[CameraAnimatorType.PITCH]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n\n    if (endPadding != startPadding) {\n      animators.add(\n        CameraPaddingAnimator(\n          options = cameraAnimatorOptions(endPadding) {\n            startValue(startPadding)\n          },\n          block = defaultAnimationParameters[CameraAnimatorType.PADDING]\n        ).apply {\n          owner?.let { customOwner ->\n            this.owner = customOwner\n          }\n        }\n      )\n    }\n    return animators.toTypedArray()\n  }\n\n  // TODO: remove it after https://issuetracker.google.com/issues/280660517 will be fixed\n  private fun Float.getSafeFraction(): Float = if (this.isNaN()) 0f else this\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /**\n     * Default animation duration\n     */\n    const val DEFAULT_ANIMATION_DURATION_MS = 300L\n\n    /**\n     * Interpolator based on Bezier Curve which is default in v9 version of the SDK\n     */\n    @JvmField\n    val CUBIC_BEZIER_INTERPOLATOR: Interpolator = PathInterpolatorCompat.create(\n      0.0f,\n      0.0f,\n      0.25f,\n      1.0f\n    )\n\n    private val DEFAULT_INTERPOLATOR = FastOutSlowInInterpolator()\n\n    private val defaultAnimationParameters =\n      hashMapOf<CameraAnimatorType, ValueAnimator.() -> Unit>().apply {\n        put(CameraAnimatorType.ANCHOR) {\n          duration = DEFAULT_ANIMATION_DURATION_MS\n          interpolator = DEFAULT_INTERPOLATOR\n        }\n        put(CameraAnimatorType.BEARING) {\n          duration = DEFAULT_ANIMATION_DURATION_MS\n          interpolator = DEFAULT_INTERPOLATOR\n        }\n        put(CameraAnimatorType.PADDING) {\n          duration = DEFAULT_ANIMATION_DURATION_MS\n          interpolator = DEFAULT_INTERPOLATOR\n        }\n        put(CameraAnimatorType.PITCH) {\n          duration = DEFAULT_ANIMATION_DURATION_MS\n          interpolator = DEFAULT_INTERPOLATOR\n        }\n        put(CameraAnimatorType.CENTER) {\n          duration = DEFAULT_ANIMATION_DURATION_MS\n          interpolator = DEFAULT_INTERPOLATOR\n        }\n        put(CameraAnimatorType.ZOOM) {\n          duration = DEFAULT_ANIMATION_DURATION_MS\n          interpolator = DEFAULT_INTERPOLATOR\n        }\n      }\n\n    /**\n     * Set default global options for given animator type.\n     * All newly created animators will have those options applied.\n     *\n     * @param type Type of default animator\n     * @param block Block to apply any [ValueAnimator] parameters\n     */\n    @JvmStatic\n    fun setDefaultAnimatorOptions(type: CameraAnimatorType, block: ValueAnimator.() -> Unit) {\n      defaultAnimationParameters[type] = block\n    }\n\n    /**\n     * Set default global options for all animator types\n     * All newly created animators will have those options applied.\n     *\n     * @param block Block to apply any [ValueAnimator] parameters\n     */\n    @JvmStatic\n    fun setDefaultAnimatorOptions(block: ValueAnimator.() -> Unit) {\n      defaultAnimationParameters[CameraAnimatorType.CENTER] = block\n      defaultAnimationParameters[CameraAnimatorType.ZOOM] = block\n      defaultAnimationParameters[CameraAnimatorType.BEARING] = block\n      defaultAnimationParameters[CameraAnimatorType.PITCH] = block\n      defaultAnimationParameters[CameraAnimatorType.ANCHOR] = block\n      defaultAnimationParameters[CameraAnimatorType.PADDING] = block\n    }\n  }\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraTransform.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.plugin.animation.CameraTransform.ge\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport kotlin.math.*\n\ninternal object CameraTransform {\n\n  private const val LONGITUDE_MAX = 180\n  private const val DEGREES_MAX = 360\n\n  fun angleBetween(p1: ScreenCoordinate, p2: ScreenCoordinate) =\n    atan2((p1.x * p2.y - p1.y * p2.x), p1.x * p2.x + p1.y * p2.y)\n\n  fun Double.scaleZoom() = log2(this)\n\n  fun Double.zoomScale() = 2.0.pow(this)\n\n  fun Double.rad2deg() = this * 180.0 / Math.PI\n\n  fun Double.deg2rad() = this * Math.PI / 180.0\n\n  fun MercatorCoordinate.offset(arg: MercatorCoordinate) = ScreenCoordinate(x - arg.x, y - arg.y)\n\n  fun ScreenCoordinate.offset(arg: ScreenCoordinate) = ScreenCoordinate(x - arg.x, y - arg.y)\n\n  fun getMapCenter(edgeInsets: EdgeInsets, mapSize: Size): ScreenCoordinate {\n    val centerX = (mapSize.width - edgeInsets.left - edgeInsets.right) / 2.0 + edgeInsets.left\n    val centerY = (mapSize.height - edgeInsets.top - edgeInsets.bottom) / 2.0 + edgeInsets.top\n    return ScreenCoordinate(centerX, centerY)\n  }\n\n  fun unwrapForShortestPath(start: Point, end: Point): Point {\n    val delta = abs(end.longitude() - start.longitude())\n    if (delta <= LONGITUDE_MAX || delta >= DEGREES_MAX) return start\n    var lon: Double = start.longitude()\n    if (start.longitude() > 0 && end.longitude() < 0) {\n      lon -= DEGREES_MAX\n    } else if (start.longitude() < 0 && end.longitude() > 0) {\n      lon += DEGREES_MAX\n    }\n    return Point.fromLngLat(lon, start.latitude())\n  }\n\n  fun calculateLatLngMoveBy(\n    offset: ScreenCoordinate,\n    cameraState: CameraState,\n    mapTransformDelegate: MapTransformDelegate,\n    mapCameraManagerDelegate: MapCameraManagerDelegate\n  ): Point {\n    val mapOptions = mapTransformDelegate.getMapOptions()\n    val mapCenter = getMapCenter(\n      cameraState.padding,\n      mapOptions.size!!\n    )\n    val pointOnScreenX = mapCenter.x - offset.x\n    val pointOnScreenY = mapCenter.y - offset.y\n    val pointOnScreen = ScreenCoordinate(pointOnScreenX, pointOnScreenY)\n    return mapCameraManagerDelegate.coordinateForPixel(pointOnScreen)\n  }\n\n  fun calculateScaleBy(amount: Double, currentZoom: Double) = log2(amount) + currentZoom\n\n  /**\n   * Extension function to wrap coordinate to one world copy.\n   */\n  fun Point.wrapCoordinate(): Point {\n    val lng = wrap(\n      value = this.longitude(),\n      min = -LONGITUDE_MAX.toDouble(),\n      max = LONGITUDE_MAX.toDouble()\n    )\n    return if (lng.isNaN()) Point.fromLngLat(this.longitude(), this.latitude())\n    else Point.fromLngLat(lng, this.latitude())\n  }\n\n  // Wrap value to the given range (including min, excluding max).\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal fun wrap(value: Double, min: Double, max: Double): Double {\n    if (value.eq(max)) {\n      return min\n    } else if (value.ge(min) && value.less(max)) {\n      return value\n    }\n    val delta = max - min\n    val wrapped = min + ((value - min) % delta)\n    return if (value < min) wrapped + delta else wrapped\n  }\n\n  private const val PRECISION = 1e-6\n  private fun Double.eq(other: Double) = abs(this - other) < PRECISION\n  private fun Double.ge(other: Double) = (this - other) > PRECISION || this.eq(other)\n  private fun Double.less(other: Double) = (this - other) < -PRECISION\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/HighLevelAnimatorSet.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.AnimatorSet\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.threading.AnimationThreadController\n\ninternal data class HighLevelAnimatorSet(\n  val owner: String?,\n  val animatorSet: AnimatorSet\n) : Cancelable {\n\n  @OptIn(MapboxExperimental::class)\n  override fun cancel() {\n    AnimationThreadController.postOnAnimatorThread {\n      animatorSet.cancel()\n    }\n  }\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnchorAnimator.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\n\n/**\n * Animator class used to animate [CameraOptions.anchor] property.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class CameraAnchorAnimator(\n  options: CameraAnimatorOptions<ScreenCoordinate>,\n  block: (ValueAnimator.() -> Unit)? = null\n) : CameraAnimator<ScreenCoordinate>(\n  anchorEvaluator,\n  options\n) {\n\n  init {\n    block?.invoke(this)\n  }\n\n  /**\n   * Animator type.\n   */\n  override val type = CameraAnimatorType.ANCHOR\n\n  private companion object {\n    private val anchorEvaluator = object : CameraTypeEvaluator<ScreenCoordinate> {\n      override fun canSkip(cameraCurrentValue: Any, startValue: Any, values: Array<*>) = false\n      override fun evaluate(\n        fraction: Float,\n        startValue: ScreenCoordinate?,\n        endValue: ScreenCoordinate?,\n      ) = Evaluators.SCREEN_COORDINATE.evaluate(fraction, startValue, endValue)\n    }\n  }\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnimator.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.TypeEvaluator\nimport android.animation.ValueAnimator\nimport android.annotation.SuppressLint\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPluginImpl\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType.ANCHOR\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType.BEARING\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType.CENTER\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType.PADDING\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType.PITCH\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType.ZOOM\nimport com.mapbox.maps.threading.AnimationThreadController.postOnAnimatorThread\nimport java.util.concurrent.CopyOnWriteArraySet\n\n/**\n * Base generic class for all camera animators.\n */\n@OptIn(MapboxExperimental::class)\n@SuppressLint(\"Recycle\")\nabstract class CameraAnimator<out T>(\n  /**\n   * [TypeEvaluator] for generic type\n   */\n  private val evaluator: TypeEvaluator<T>,\n  /**\n   * Camera animator options.\n   */\n  cameraAnimatorOptions: CameraAnimatorOptions<out T>\n) : ValueAnimator() {\n\n  /**\n   * Animator owner or creator.\n   */\n  var owner = cameraAnimatorOptions.owner\n    internal set\n\n  /**\n   * Start animation value, will use current map value option from [CameraOptions] if null.\n   */\n  val startValue = cameraAnimatorOptions.startValue\n\n  /**\n   * Sets the values to animate between for this animation (except start value).\n   */\n  val targets = cameraAnimatorOptions.targets\n\n  private var registered = false\n  private var internalUpdateListener: AnimatorUpdateListener? = null\n  private var internalListener: AnimatorListener? = null\n\n  private val userUpdateListeners = CopyOnWriteArraySet<AnimatorUpdateListener?>()\n  private val userListeners = CopyOnWriteArraySet<AnimatorListener?>()\n\n  internal var canceled = false\n  // set when animation is ended manually (by calling Animator#end),\n  // i. e. not when it finished \"normally\" because it reached its end\n  internal var endedManually = false\n    private set\n  internal var isInternal = false\n  internal var skipped = false\n  private val immediate get() = duration == 0L && startDelay == 0L\n\n  init {\n    setObjectValues(targets[0], targets[0])\n    setEvaluator(evaluator)\n  }\n\n  /**\n   * The type of CameraAnimator\n   */\n  abstract val type: CameraAnimatorType\n\n  /**\n   * Set the animator object values\n   *\n   * @param values varags of object values\n   */\n  final override fun setObjectValues(vararg values: Any?) {\n    super.setObjectValues(*values)\n  }\n\n  /**\n   * Update object values if animator is not [skipped], has [targets], start value and can not be skipped.\n   *\n   * @param getStartCameraState provider for [CameraState]\n   */\n  fun updateObjectValues(getStartCameraState: () -> CameraState) {\n    if (skipped) {\n      return\n    }\n    if (targets.isEmpty()) {\n      logE(\n        CameraAnimationsPluginImpl.Companion.TAG,\n        \"Skipped animation ${type.name} with no targets!\"\n      )\n      skipped = true\n      return\n    }\n\n    val cameraCurrentValue = defaultStartValue(getStartCameraState)\n    val resolvedStartValue = startValue ?: cameraCurrentValue\n    if (DEBUG_MODE) {\n      logD(\n        CameraAnimationsPluginImpl.Companion.TAG,\n        \"Animation ${type.name}(${hashCode()}): automatically setting start value $resolvedStartValue.\"\n      )\n    }\n    val animationObjectValues = resolveAnimationObjectValues(resolvedStartValue)\n    if ((evaluator is CameraTypeEvaluator) &&\n      evaluator.canSkip(cameraCurrentValue, resolvedStartValue, animationObjectValues)\n    ) {\n      skipped = true\n      if (DEBUG_MODE) {\n        logD(\n          CameraAnimationsPluginImpl.Companion.TAG,\n          \"Animation ${type.name}(${hashCode()}) was skipped.\"\n        )\n      }\n      return\n    }\n    setObjectValues(*animationObjectValues)\n  }\n\n  /**\n   * Provide a default start value for animation in case it is not provided by [cameraAnimatorOptions]\n   *\n   * @param cameraState current camera state\n   */\n  private inline fun defaultStartValue(cameraState: () -> CameraState): Any = run {\n    when (type) {\n      CENTER -> cameraState().center\n      ZOOM -> cameraState().zoom\n      ANCHOR -> ZERO_SCREEN_COORDINATE\n      PADDING -> cameraState().padding\n      BEARING -> cameraState().bearing\n      PITCH -> cameraState().pitch\n    }\n  }\n\n  /**\n   * Resolve animation object values to provide to [setObjectValues] and animate over\n   *\n   * @param startValue start value resolved by [cameraAnimatorOptions] or [defaultStartValue]\n   */\n  open fun resolveAnimationObjectValues(startValue: Any): Array<*> =\n    Array(targets.size + 1) { index ->\n      if (index == 0) {\n        startValue\n      } else {\n        targets[index - 1]\n      }\n    }\n\n  /**\n   * Set the animator evaluator\n   *\n   * @param value the animator type evaluator\n   */\n  final override fun setEvaluator(value: TypeEvaluator<*>?) {\n    super.setEvaluator(value)\n  }\n\n  /**\n   * Start the animator\n   */\n  final override fun start() {\n    postOnAnimatorThread {\n      if (registered) {\n        canceled = false\n        endedManually = false\n        if (immediate) {\n          handleImmediateAnimation()\n          return@postOnAnimatorThread\n        }\n        super.start()\n      } else {\n        logW(\n          TAG,\n          \"Animation $type was not registered and will not run. Register it with registerAnimation() method.\"\n        )\n      }\n    }\n  }\n\n  /**\n   * The most recent value calculated by this <code>ValueAnimator</code> when there is just one\n   * property being animated. This value is only sensible while the animation is running. The main\n   * purpose for this read-only property is to retrieve the value from the <code>ValueAnimator</code>\n   * during a call to {@link AnimatorUpdateListener#onAnimationUpdate(ValueAnimator)}, which\n   * is called during each animation frame, immediately after the value is calculated.\n   *\n   * @return animatedValue The value most recently calculated by this <code>ValueAnimator</code> for\n   * the single property being animated. If there are several properties being animated\n   * (specified by several PropertyValuesHolder objects in the constructor), this function\n   * returns the animated value for the first of those objects.\n   */\n  override fun getAnimatedValue(): Any {\n    // For immediate animations the returned ValueAnimator.getAnimatedValue() will be null, in this case, we should return the\n    // last configured target value, so we immediately jump to the target value.\n    if (immediate) {\n      return targets.last() as Any\n    }\n    return super.getAnimatedValue()\n  }\n\n  /**\n   * @throws UnsupportedOperationException if this animator does not support this method\n   */\n  internal fun getAnimatedValueAt(fraction: Float, startCameraState: CameraState? = null): T {\n    if (targets.size != 1) {\n      throw UnsupportedOperationException(\n        \"getAnimatedValueAt() is only supported for single target animations.\"\n      )\n    }\n    if (startValue == null && startCameraState == null) {\n      throw UnsupportedOperationException(\n        \"getAnimatedValueAt() is only supported for animators with a startValue \" +\n          \"or a non-null current camera state must be provided.\"\n      )\n    }\n    val resolvedStartValue =\n      startValue ?: startCameraState?.let { defaultStartValue { startCameraState } } as? T\n    if (resolvedStartValue == null) {\n      throw UnsupportedOperationException(\"Could not resolve start value for animator\")\n    }\n    val interpolation = interpolator.getInterpolation(fraction)\n    return evaluator.evaluate(interpolation, resolvedStartValue, targets.last())\n  }\n\n  /**\n   * Handle immediate animation(when duration and startDelay of the animation is 0)\n   * we trigger animator listeners directly without triggering [ValueAnimator]'s start().\n   *\n   * This brings the following benefits:\n   *  1. Saves resources by not starting the whole Android SDK animation framing.\n   *  2. Has consistent behaviour on all supported APIs as on API <= 23 Android SDK Animator logic\n   *  is different and has an explicit Handler.post which makes code unpredictable and brings in race conditions.\n   */\n  private fun handleImmediateAnimation() {\n    // bypass the ValueAnimator and emit the user registered AnimatorListeners and AnimatorUpdateListeners immediately\n    // in the same callchain (if not using AnimationThreadController with background thread)\n    listeners.toList().let { listeners ->\n      listeners.forEach {\n        it.onAnimationStart(this)\n      }\n      internalUpdateListener?.onAnimationUpdate(this)\n      userUpdateListeners.forEach {\n        it?.onAnimationUpdate(this)\n      }\n      listeners.forEach {\n        it.onAnimationEnd(this)\n      }\n    }\n  }\n\n  /**\n   * Add an animator listener\n   *\n   * @param listener the listener to be invoked when animation state changes\n   */\n  final override fun addListener(listener: AnimatorListener?) {\n    postOnAnimatorThread {\n      if (internalListener != null) {\n        super.addListener(listener)\n      }\n      userListeners.add(listener)\n    }\n  }\n\n  /**\n   * Add an animator update listener\n   *\n   * @param listener the listener to be invoked when animation update changes\n   */\n  final override fun addUpdateListener(listener: AnimatorUpdateListener?) {\n    postOnAnimatorThread {\n      if (internalUpdateListener != null) {\n        super.addUpdateListener(listener)\n      }\n      userUpdateListeners.add(listener)\n    }\n  }\n\n  /**\n   * Remove an animator update listener\n   *\n   * @param listener the listener to be removed\n   */\n  final override fun removeUpdateListener(listener: AnimatorUpdateListener?) {\n    postOnAnimatorThread {\n      if (listener != internalUpdateListener) {\n        super.removeUpdateListener(listener)\n      }\n      if (userUpdateListeners.contains(listener)) {\n        userUpdateListeners.remove(listener)\n      }\n    }\n  }\n\n  /**\n   * Remove all update listeners\n   */\n  final override fun removeAllUpdateListeners() {\n    postOnAnimatorThread {\n      super.removeAllUpdateListeners()\n      if (internalUpdateListener != null) {\n        super.addUpdateListener(internalUpdateListener)\n      }\n      userUpdateListeners.clear()\n    }\n  }\n\n  /**\n   * Remove an animator listener\n   *\n   * @param listener the listener to be removed\n   */\n  final override fun removeListener(listener: AnimatorListener?) {\n    postOnAnimatorThread {\n      if (listener != internalListener) {\n        super.removeListener(listener)\n      }\n      if (userListeners.contains(listener)) {\n        userListeners.remove(listener)\n      }\n    }\n  }\n\n  /**\n   * Remove all animator listeners\n   */\n  final override fun removeAllListeners() {\n    postOnAnimatorThread {\n      super.removeAllListeners()\n      if (internalListener != null) {\n        super.addListener(internalListener)\n      }\n      userListeners.clear()\n    }\n  }\n\n  /**\n   * Cancels the animation. Unlike end(), cancel() causes the animation to stop in its tracks,\n   * sending an Animator.AnimatorListener.onAnimationCancel(Animator) to its listeners,\n   * followed by an Animator.AnimatorListener.onAnimationEnd(Animator) message.\n   *\n   * This method must be called on the thread that is running the animation.\n   */\n  final override fun cancel() {\n    postOnAnimatorThread {\n      canceled = true\n      super.cancel()\n    }\n  }\n\n  /**\n   * Ends the animation.\n   * Causes sending an Animator.AnimatorListener.onAnimationEnd(Animator) to its listeners.\n   *\n   * This method must be called on the thread that is running the animation.\n   */\n  override fun end() {\n    postOnAnimatorThread {\n      endedManually = true\n      super.end()\n    }\n  }\n\n  /**\n   * true if CameraAnimator have any external listeners registered.\n   */\n  internal val hasUserListeners: Boolean\n    get() = userUpdateListeners.isNotEmpty()\n\n  internal fun addInternalUpdateListener(listener: AnimatorUpdateListener) {\n    super.removeAllUpdateListeners()\n    internalUpdateListener = listener\n    super.addUpdateListener(internalUpdateListener)\n    userUpdateListeners.forEach {\n      super.addUpdateListener(it)\n    }\n  }\n\n  internal fun removeInternalUpdateListener() {\n    super.removeUpdateListener(internalUpdateListener)\n    internalUpdateListener = null\n  }\n\n  internal fun addInternalListener(listener: AnimatorListener) {\n    super.removeAllListeners()\n    registered = true\n    internalListener = listener\n    super.addListener(internalListener)\n    userListeners.forEach {\n      super.addListener(it)\n    }\n  }\n\n  internal fun removeInternalListener() {\n    super.removeListener(internalListener)\n    internalListener = null\n    registered = false\n  }\n\n  internal fun getTargetValues(): Array<out T> {\n    return targets\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val TAG = \"Mbgl-CameraAnimator\"\n    private const val DEBUG_MODE = false\n    private val ZERO_SCREEN_COORDINATE = ScreenCoordinate(0.0, 0.0)\n  }\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraBearingAnimator.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\nimport com.mapbox.maps.util.MathUtils\n\n/**\n * Animator class used to animate [CameraOptions.bearing] property.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class CameraBearingAnimator(\n  options: CameraAnimatorOptions<Double>,\n  val useShortestPath: Boolean,\n  block: (ValueAnimator.() -> Unit)? = null\n) : CameraAnimator<Double>(\n  Evaluators.DOUBLE,\n  options\n) {\n\n  init {\n    block?.invoke(this)\n  }\n\n  override fun resolveAnimationObjectValues(startValue: Any) =\n    if (useShortestPath) {\n      MathUtils.prepareOptimalBearingPath(\n        DoubleArray(targets.size + 1) { index ->\n          if (index == 0) {\n            startValue as Double\n          } else {\n            targets[index - 1]\n          }\n        }\n      ).toTypedArray()\n    } else {\n      super.resolveAnimationObjectValues(startValue)\n    }\n\n  /**\n   * Animator type.\n   */\n  override val type = CameraAnimatorType.BEARING\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraCenterAnimator.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.TypeEvaluator\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\nimport com.mapbox.maps.plugin.animation.CameraTransform\nimport com.mapbox.maps.plugin.animation.CameraTransform.wrapCoordinate\n\n/**\n * Animator class used to animate [CameraOptions.center] property.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class CameraCenterAnimator internal constructor(\n  evaluator: TypeEvaluator<Point> = Evaluators.POINT,\n  options: CameraAnimatorOptions<Point>,\n  val useShortestPath: Boolean,\n  block: (ValueAnimator.() -> Unit)? = null\n) : CameraAnimator<Point>(\n  evaluator, options\n) {\n  init {\n    block?.invoke(this)\n  }\n\n  override fun resolveAnimationObjectValues(startValue: Any) =\n    if (useShortestPath) {\n      // assemble the original targets by inserting the start point\n      val originalTargets: List<Point> = listOf(startValue as Point) + targets\n      // Build the reversed target list with wrapped coordinates\n      val mutableTargetReversedList = mutableListOf<Point>()\n      originalTargets.map { it.wrapCoordinate() }.asReversed().forEach {\n        if (mutableTargetReversedList.isEmpty()) {\n          // insert the raw end point\n          mutableTargetReversedList.add(it)\n        } else {\n          // calculate the previous point\n          mutableTargetReversedList.add(\n            CameraTransform.unwrapForShortestPath(\n              start = it,\n              end = mutableTargetReversedList.last()\n            )\n          )\n        }\n      }\n      mutableTargetReversedList.asReversed().toTypedArray()\n    } else {\n      super.resolveAnimationObjectValues(startValue)\n    }\n\n  /**\n   * Animator type.\n   */\n  override val type = CameraAnimatorType.CENTER\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraPaddingAnimator.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\n\n/**\n * Animator class used to animate [CameraOptions.padding] property.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class CameraPaddingAnimator(\n  options: CameraAnimatorOptions<EdgeInsets>,\n  block: (ValueAnimator.() -> Unit)? = null\n) : CameraAnimator<EdgeInsets>(\n  Evaluators.EDGE_INSET,\n  options\n) {\n\n  init {\n    block?.invoke(this)\n  }\n\n  /**\n   * Animator type.\n   */\n  override val type = CameraAnimatorType.PADDING\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraPitchAnimator.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\n\n/**\n * Animator class used to animate [CameraOptions.pitch] property.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class CameraPitchAnimator(\n  options: CameraAnimatorOptions<Double>,\n  block: (ValueAnimator.() -> Unit)? = null\n) : CameraAnimator<Double>(\n  Evaluators.DOUBLE,\n  options\n) {\n\n  init {\n    block?.invoke(this)\n  }\n\n  /**\n   * Animator type.\n   */\n  override val type = CameraAnimatorType.PITCH\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraTypeEvaluator.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.TypeEvaluator\nimport java.util.Objects\n\n/**\n * Extension over [TypeEvaluator] to support skip optimizations.\n */\nfun interface CameraTypeEvaluator<T> : TypeEvaluator<T> {\n\n  /**\n   * Returns true if animator can be skipped and not registered as update listener.\n   * It usually means that [evaluate] function does not change on defined values range.\n   *\n   * @param startValue a start animation value\n   * @param values values to animate over\n   */\n  fun canSkip(cameraCurrentValue: Any, startValue: Any, values: Array<*>): Boolean {\n    if (cameraCurrentValue != startValue) return false\n    return values.all { Objects.equals(startValue, it) }\n  }\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraZoomAnimator.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.TypeEvaluator\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\n\n/**\n * Animator class used to animate [CameraOptions.zoom] property.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class CameraZoomAnimator : CameraAnimator<Double> {\n  internal constructor(\n    options: CameraAnimatorOptions<Double>,\n    block: (ValueAnimator.() -> Unit)? = null\n  ) : super(Evaluators.DOUBLE, options) {\n    block?.invoke(this)\n  }\n\n  internal constructor(\n    evaluator: TypeEvaluator<Double>,\n    options: CameraAnimatorOptions<Double>,\n    block: (ValueAnimator.() -> Unit)? = null\n  ) : super(evaluator, options) {\n    block?.invoke(this)\n  }\n\n  /**\n   * Animator type.\n   */\n  override val type = CameraAnimatorType.ZOOM\n}"
  },
  {
    "path": "plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/Evaluators.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.TypeEvaluator\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPluginImpl.Companion.TAG\n\n/**\n * Contains custom animator evaluators related to animating camera properties\n */\nobject Evaluators {\n\n  /**\n   * Type evaluator for Point data\n   */\n  val POINT: TypeEvaluator<Point> = CameraTypeEvaluator { fraction, startValue, endValue ->\n    // If fraction is 1 or 0 then return `endValue`/`startValue` directly without creating new Point\n    if (fraction == 1F) {\n      endValue\n    } else if (fraction == 0F) {\n      startValue\n    } else {\n      val longitudeDelta = endValue.longitude() - startValue.longitude()\n      val latitudeDelta = endValue.latitude() - startValue.latitude()\n      if (longitudeDelta == 0.0 && latitudeDelta == 0.0) {\n        startValue\n      } else {\n        Point.fromLngLat(\n          startValue.longitude() + fraction * longitudeDelta,\n          startValue.latitude() + fraction * latitudeDelta\n        )\n      }\n    }\n  }\n\n  /**\n   * Type evaluator for Double data\n   */\n  val DOUBLE: TypeEvaluator<Double> = CameraTypeEvaluator { fraction, startValue, endValue ->\n    // If fraction is 1 or 0 then return `endValue`/`startValue` directly without creating new Double\n    if (fraction == 1F) {\n      endValue\n    } else if (fraction == 0F) {\n      startValue\n    } else {\n      val delta = endValue - startValue\n      if (delta == 0.0) {\n        startValue\n      } else {\n        startValue + fraction * delta\n      }\n    }\n  }\n\n  private val zeroEdgeInsets = EdgeInsets(0.0, 0.0, 0.0, 0.0)\n\n  /**\n   * Type evaluator for EdgeInsets data\n   */\n  val EDGE_INSET: TypeEvaluator<EdgeInsets> = CameraTypeEvaluator { fraction, startValue: EdgeInsets?, endValue: EdgeInsets? ->\n    // We have seen in the wild that under some conditions we get null values. So let's guard\n    // against possible null start/end\n    val nonNullEnd = if (endValue != null) {\n      endValue\n    } else {\n      logW(TAG, \"End edge insets are null (fraction: $fraction)\")\n      zeroEdgeInsets\n    }\n\n    // If fraction is 1 then we can return the `endValue` directly without creating new EdgeInsets\n    if (fraction == 1F) {\n      return@CameraTypeEvaluator nonNullEnd\n    }\n    val nonNullStart = if (startValue != null) {\n      startValue\n    } else {\n      logW(TAG, \"Start edge insets are null (fraction: $fraction)\")\n      zeroEdgeInsets\n    }\n\n    // If fraction is 0 then we can return the `startValue` directly without creating new EdgeInsets\n    if (fraction == 0F) {\n      return@CameraTypeEvaluator nonNullStart\n    }\n\n    val topDelta = nonNullEnd.top - nonNullStart.top\n    val leftDelta = nonNullEnd.left - nonNullStart.left\n    val bottomDelta = nonNullEnd.bottom - nonNullStart.bottom\n    val rightDelta = nonNullEnd.right - nonNullStart.right\n\n    // As an optimization we can avoid creating EdgeInsets object if there's no delta for any side\n    if (topDelta == 0.0 && leftDelta == 0.0 && bottomDelta == 0.0 && rightDelta == 0.0) {\n      nonNullStart\n    } else {\n      EdgeInsets(\n        nonNullStart.top + fraction * topDelta,\n        nonNullStart.left + fraction * leftDelta,\n        nonNullStart.bottom + fraction * bottomDelta,\n        nonNullStart.right + fraction * rightDelta\n      )\n    }\n  }\n\n  /**\n   * Type evaluator for ScreenCoordinate data\n   */\n  val SCREEN_COORDINATE: TypeEvaluator<ScreenCoordinate> = CameraTypeEvaluator { fraction, startValue, endValue ->\n    // If fraction is 1 or 0 then return `endValue`/`startValue` directly without creating new ScreenCoordinate\n    if (fraction == 1F) {\n      endValue\n    } else if (fraction == 0F) {\n      startValue\n    } else {\n      val xDelta = endValue.x - startValue.x\n      val yDelta = endValue.y - startValue.y\n      if (xDelta == 0.0 && yDelta == 0.0) {\n        startValue\n      } else {\n        ScreenCoordinate(startValue.x + fraction * xDelta, startValue.y + fraction * yDelta)\n      }\n    }\n  }\n}"
  },
  {
    "path": "plugin-animation/src/test/java/com/mapbox/maps/plugin/animation/CameraAnimationsChangeListenersTest.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPluginImplTest.Companion.cameraState\nimport org.junit.Assert\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport kotlin.math.pow\n\n@RunWith(RobolectricTestRunner::class)\nclass CameraAnimationsChangeListenersTest {\n\n  private fun CameraAnimationsPluginImpl.onCameraMove(cameraState: CameraState) {\n    onCameraMove(\n        center = cameraState.center,\n        zoom = cameraState.zoom,\n        pitch = cameraState.pitch,\n        bearing = cameraState.bearing,\n        padding = cameraState.padding\n    )\n  }\n\n  @Test\n  fun addCameraZoomChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorChangeListener<Double> {\n      Assert.assertEquals(CameraAnimationsPluginImplTest.VALUE, it, 10.0.pow(-6.0))\n    }\n    cameraAnimationsPluginImpl.addCameraZoomChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun removeCameraZoomChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorChangeListener<Double> { assert(false) }\n    cameraAnimationsPluginImpl.addCameraZoomChangeListener(listener)\n    cameraAnimationsPluginImpl.removeCameraZoomChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun addCameraCenterChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener =\n      CameraAnimatorChangeListener<Point> { updatedValue ->\n        Assert.assertEquals(\n          Point.fromLngLat(\n            CameraAnimationsPluginImplTest.VALUE,\n            CameraAnimationsPluginImplTest.VALUE\n          ),\n          updatedValue\n        )\n      }\n    cameraAnimationsPluginImpl.addCameraCenterChangeListener(listener)\n  }\n\n  @Test\n  fun removeCameraCenterChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorChangeListener<Point> { assert(false) }\n    cameraAnimationsPluginImpl.addCameraCenterChangeListener(listener)\n    cameraAnimationsPluginImpl.removeCameraCenterChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun addCameraPitchChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorChangeListener<Double> {\n      Assert.assertEquals(CameraAnimationsPluginImplTest.VALUE, it, 10.0.pow(-6.0))\n    }\n    cameraAnimationsPluginImpl.addCameraPitchChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun removeCameraPitchChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorChangeListener<Double> { assert(false) }\n    cameraAnimationsPluginImpl.addCameraPitchChangeListener(listener)\n    cameraAnimationsPluginImpl.removeCameraPitchChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun addCameraBearingChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorChangeListener<Double> {\n      Assert.assertEquals(CameraAnimationsPluginImplTest.VALUE, it, 10.0.pow(-6.0))\n    }\n    cameraAnimationsPluginImpl.addCameraBearingChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun removeCameraBearingChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorChangeListener<Double> { assert(false) }\n    cameraAnimationsPluginImpl.addCameraBearingChangeListener(listener)\n    cameraAnimationsPluginImpl.removeCameraBearingChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun addCameraPaddingChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorChangeListener<EdgeInsets> {\n      Assert.assertEquals(\n        EdgeInsets(\n          CameraAnimationsPluginImplTest.VALUE,\n          CameraAnimationsPluginImplTest.VALUE,\n          CameraAnimationsPluginImplTest.VALUE,\n          CameraAnimationsPluginImplTest.VALUE\n        ),\n        it\n      )\n    }\n    cameraAnimationsPluginImpl.addCameraPaddingChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun removeCameraPaddinghangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorChangeListener<EdgeInsets> { assert(false) }\n    cameraAnimationsPluginImpl.addCameraPaddingChangeListener(listener)\n    cameraAnimationsPluginImpl.removeCameraPaddingChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun addCameraAnchorChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorNullableChangeListener<ScreenCoordinate?> { updatedValue ->\n      Assert.assertEquals(\n        ScreenCoordinate(\n          CameraAnimationsPluginImplTest.VALUE,\n          CameraAnimationsPluginImplTest.VALUE\n        ),\n        updatedValue\n      )\n    }\n    cameraAnimationsPluginImpl.addCameraAnchorChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n\n  @Test\n  fun removeCameraAnchorChangeListener() {\n    val cameraAnimationsPluginImpl = CameraAnimationsPluginImpl()\n    val listener = CameraAnimatorNullableChangeListener<ScreenCoordinate?> { assert(false) }\n    cameraAnimationsPluginImpl.addCameraAnchorChangeListener(listener)\n    cameraAnimationsPluginImpl.removeCameraAnchorChangeListener(listener)\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n  }\n}"
  },
  {
    "path": "plugin-animation/src/test/java/com/mapbox/maps/plugin/animation/CameraAnimationsExtTest.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.Animator.DURATION_INFINITE\nimport android.animation.AnimatorSet\nimport android.animation.ValueAnimator\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.animation.animator.CameraAnchorAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraBearingAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraCenterAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraPaddingAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraPitchAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraZoomAnimator\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.spyk\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass CameraAnimationsExtTest {\n\n  private lateinit var mockCameraState: CameraState\n\n  @Before\n  fun setUp() {\n    mockCameraState = mockk {\n      every { center } returns Point.fromLngLat(0.0, 0.0)\n      every { zoom } returns 10.0\n      every { bearing } returns 0.0\n      every { pitch } returns 0.0\n      every { padding } returns EdgeInsets(0.0, 0.0, 0.0, 0.0)\n    }\n  }\n\n  @Test\n  fun `AnimatorSet calculateCameraAnimationHint returns null for empty AnimatorSet`() {\n    val animatorSet = AnimatorSet()\n\n    val result = animatorSet.calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertNull(result)\n  }\n\n  @Test\n  fun `AnimatorSet calculateCameraAnimationHint returns null for AnimatorSet with non-zero startDelay`() {\n    val animatorSet = AnimatorSet()\n    animatorSet.startDelay = 100L\n\n    val result = animatorSet.calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertNull(result)\n  }\n\n  @Test\n  fun `AnimatorSet calculateCameraAnimationHint returns null for AnimatorSet with non-CameraAnimator children`() {\n    val animatorSet = AnimatorSet()\n    val valueAnimator = ValueAnimator.ofFloat(0f, 1f)\n    animatorSet.playTogether(valueAnimator)\n\n    val result = animatorSet.calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertNull(result)\n  }\n\n  @Test\n  fun `AnimatorSet calculateCameraAnimationHint returns valid hint for CameraAnimators`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns Point.fromLngLat(0.5, 0.5)\n    }\n\n    val zoomAnimator = mockk<CameraZoomAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns 11.0\n    }\n\n    val animatorSet = spyk(AnimatorSet()) {\n      every { childAnimations } returns arrayListOf(centerAnimator, zoomAnimator)\n      every { duration } returns -1L // Let it use children's max duration\n    }\n\n    val result = animatorSet.calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertEquals(1, result?.stages?.size)\n    assertEquals(500L, result?.stages?.get(0)?.progress)\n    assertEquals(Point.fromLngLat(0.5, 0.5), result?.stages?.get(0)?.camera?.center)\n    assertEquals(11.0, result?.stages?.get(0)?.camera?.zoom!!, 0.000001)\n  }\n\n  @Test\n  fun `AnimatorSet calculateCameraAnimationHint uses AnimatorSet duration when set`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(1f, mockCameraState) } returns Point.fromLngLat(0.5, 0.5)\n    }\n\n    val animatorSet = spyk(AnimatorSet()) {\n      every { childAnimations } returns arrayListOf(centerAnimator)\n      every { duration } returns 2000L // AnimatorSet has its own duration\n    }\n\n    val result = animatorSet.calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertEquals(1, result?.stages?.size)\n    assertEquals(1000L, result?.stages?.get(0)?.progress) // 0.5 * 2000ms AnimatorSet duration\n    assertEquals(Point.fromLngLat(0.5, 0.5), result?.stages?.get(0)?.camera?.center)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint returns null for empty list`() {\n    val emptyList = emptyList<CameraAnimator<*>>()\n\n    val result = emptyList.calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertNull(result)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint returns null for zero duration animations`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 0L\n      every { totalDuration } returns 0L\n      every { startDelay } returns 0L\n    }\n\n    val result = listOf(centerAnimator).calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertNull(result)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint calculates correct progress for single fraction`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns Point.fromLngLat(0.5, 0.5)\n    }\n\n    val result = listOf(centerAnimator).calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertEquals(1, result?.stages?.size)\n    assertEquals(500L, result?.stages?.get(0)?.progress)\n    assertEquals(Point.fromLngLat(0.5, 0.5), result?.stages?.get(0)?.camera?.center)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint calculates correct progress for multiple fractions`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.0f, mockCameraState) } returns Point.fromLngLat(0.0, 0.0)\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns Point.fromLngLat(0.5, 0.5)\n      every { getAnimatedValueAt(1.0f, mockCameraState) } returns Point.fromLngLat(1.0, 1.0)\n    }\n\n    val result = listOf(centerAnimator).calculateCameraAnimationHint(listOf(0.0f, 0.5f, 1.0f), mockCameraState)\n\n    assertEquals(3, result?.stages?.size)\n    assertEquals(0L, result?.stages?.get(0)?.progress)\n    assertEquals(500L, result?.stages?.get(1)?.progress)\n    assertEquals(1000L, result?.stages?.get(2)?.progress)\n    assertEquals(Point.fromLngLat(0.0, 0.0), result?.stages?.get(0)?.camera?.center)\n    assertEquals(Point.fromLngLat(0.5, 0.5), result?.stages?.get(1)?.camera?.center)\n    assertEquals(Point.fromLngLat(1.0, 1.0), result?.stages?.get(2)?.camera?.center)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint calculates correct progress for multiple animators with different durations`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 2000L\n      every { totalDuration } returns 2000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns Point.fromLngLat(0.5, 0.5)\n    }\n\n    val zoomAnimator = mockk<CameraZoomAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(1f, mockCameraState) } returns 11.0\n    }\n\n    val result = listOf(centerAnimator, zoomAnimator).calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertEquals(1, result?.stages?.size)\n    assertEquals(1000L, result?.stages?.get(0)?.progress) // 0.5 * 2000ms (max safeTotalDuration)\n    assertEquals(Point.fromLngLat(0.5, 0.5), result?.stages?.get(0)?.camera?.center)\n    assertEquals(11.0, result?.stages?.get(0)?.camera?.zoom!!, 0.000001)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint handles animators with start delays correctly`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1500L // duration + startDelay\n      every { startDelay } returns 500L\n      // At 0.5 total progress (750ms), this animator will be at 250 ms out of 1000 ms.\n      every { getAnimatedValueAt(0.25f, mockCameraState) } returns Point.fromLngLat(0.25, 0.25)\n    }\n\n    val zoomAnimator = mockk<CameraZoomAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L // duration + startDelay\n      every { startDelay } returns 0L\n      // At 0.5 total progress (750ms), relative fraction = (750 - 0) / 1000 = 0.75\n      every { getAnimatedValueAt(0.75f, mockCameraState) } returns 11.0\n    }\n\n    val result = listOf(centerAnimator, zoomAnimator).calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertEquals(1, result?.stages?.size)\n    // Total duration is max(1500, 1000) = 1500ms, so 0.5 * 1500 = 750ms\n    assertEquals(750L, result?.stages?.get(0)?.progress)\n    // Verify the calculated values are used\n    assertEquals(Point.fromLngLat(0.25, 0.25), result?.stages?.get(0)?.camera?.center)\n    assertEquals(11.0, result?.stages?.get(0)?.camera?.zoom!!, 0.001)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint handles UnsupportedOperationException gracefully`() {\n    val centerAnimator = mockk<CameraCenterAnimator>(relaxed = true) {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } throws UnsupportedOperationException(\"Test exception\")\n    }\n\n    val result = listOf(centerAnimator).calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertEquals(1, result?.stages?.size)\n    assertEquals(500L, result?.stages?.get(0)?.progress)\n    assertNull(result?.stages?.get(0)?.camera?.center)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint works with different camera animator types`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns Point.fromLngLat(0.5, 0.5)\n    }\n\n    val zoomAnimator = mockk<CameraZoomAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns 11.0\n    }\n\n    val bearingAnimator = mockk<CameraBearingAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns 22.5\n    }\n\n    val pitchAnimator = mockk<CameraPitchAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns 15.0\n    }\n\n    val anchorAnimator = mockk<CameraAnchorAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns ScreenCoordinate(100.0, 100.0)\n    }\n\n    val paddingAnimator = mockk<CameraPaddingAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns EdgeInsets(5.0, 5.0, 5.0, 5.0)\n    }\n\n    val animators = listOf(centerAnimator, zoomAnimator, bearingAnimator, pitchAnimator, anchorAnimator, paddingAnimator)\n    val result = animators.calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertEquals(1, result?.stages?.size)\n    assertEquals(500L, result?.stages?.get(0)?.progress)\n    assertEquals(Point.fromLngLat(0.5, 0.5), result?.stages?.get(0)?.camera?.center)\n    assertEquals(11.0, result?.stages?.get(0)?.camera?.zoom ?: -1.0, 0.001)\n    assertEquals(22.5, result?.stages?.get(0)?.camera?.bearing ?: -1.0, 0.001)\n    assertEquals(15.0, result?.stages?.get(0)?.camera?.pitch ?: -1.0, 0.001)\n    assertEquals(ScreenCoordinate(100.0, 100.0), result?.stages?.get(0)?.camera?.anchor)\n    assertEquals(EdgeInsets(5.0, 5.0, 5.0, 5.0), result?.stages?.get(0)?.camera?.padding)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint handles null startCameraState`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, null) } returns Point.fromLngLat(0.75, 0.75)\n    }\n\n    val result = listOf(centerAnimator).calculateCameraAnimationHint(listOf(0.5f), null)\n\n    assertEquals(1, result?.stages?.size)\n    assertEquals(500L, result?.stages?.get(0)?.progress)\n    assertEquals(Point.fromLngLat(0.75, 0.75), result?.stages?.get(0)?.camera?.center)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint handles negative duration gracefully`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns -1L\n      every { totalDuration } returns -1L\n      every { startDelay } returns 0L\n    }\n\n    val result = listOf(centerAnimator).calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertNull(result)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint works when some animators have zero duration but max duration is non-zero`() {\n    val validAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      // At 0.5 total progress (500ms), relative fraction = (500 - 0) / 1000 = 0.5\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns Point.fromLngLat(0.5, 0.5)\n    }\n\n    val zeroDurationAnimator = mockk<CameraZoomAnimator>() {\n      every { duration } returns 0L\n      every { totalDuration } returns 0L\n      every { startDelay } returns 0L\n      // For zero duration animator, relative fraction calculation: (500 - 0) / 0 = infinity\n      // This gets clamped to 1.0f by coerceIn(0f, 1f)\n      every { getAnimatedValueAt(1.0f, mockCameraState) } returns 12.0\n    }\n\n    val result = listOf(validAnimator, zeroDurationAnimator).calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    // Should work because max duration is 1000L (from validAnimator)\n    assertEquals(1, result?.stages?.size)\n    assertEquals(500L, result?.stages?.get(0)?.progress)\n\n    // Check interpolated values for both animators\n    val stage = result?.stages?.get(0)\n    assertEquals(Point.fromLngLat(0.5, 0.5), stage?.camera?.center) // From validAnimator at 0.5 fraction\n    assertEquals(12.0, stage?.camera?.zoom!!, 0.001) // From zeroDurationAnimator at 1.0 fraction (clamped)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint with empty fractions list`() {\n    val centerAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n    }\n\n    val result = listOf(centerAnimator).calculateCameraAnimationHint(emptyList(), mockCameraState)\n\n    assertEquals(0, result?.stages?.size)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint relative fraction calculation for animators with delays`() {\n    val delayedAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 500L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 500L\n      every { getAnimatedValueAt(0f, mockCameraState) } returns Point.fromLngLat(0.5, 0.5)\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns Point.fromLngLat(0.7, 0.7)\n    }\n\n    val result = listOf(delayedAnimator).calculateCameraAnimationHint(listOf(0.25f, 0.75f), mockCameraState)\n\n    assertEquals(2, result?.stages?.size)\n    // Total duration is 500+500=1000ms\n    // At 0.25 total progress (250ms), animator hasn't started yet (starts at 500ms)\n    assertEquals(250L, result?.stages?.get(0)?.progress)\n    assertEquals(Point.fromLngLat(0.5, 0.5), result?.stages?.get(0)?.camera?.center)\n    // At 0.75 total progress (750ms), animator is at (750-500)/500 = 0.5 relative progress\n    assertEquals(750L, result?.stages?.get(1)?.progress)\n    assertEquals(Point.fromLngLat(0.7, 0.7), result?.stages?.get(1)?.camera?.center)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint with different start delays chooses correct total duration`() {\n    val shortAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 500L\n      every { totalDuration } returns 500L // duration + startDelay\n      every { startDelay } returns 0L\n      // At 0.5 total progress (600ms), relative fraction = (600 - 0) / 500 = 1.2\n      // Gets clamped to 1.0f by coerceIn(0f, 1f)\n      every { getAnimatedValueAt(1.0f, mockCameraState) } returns Point.fromLngLat(1.0, 1.0)\n    }\n\n    val delayedAnimator = mockk<CameraZoomAnimator>() {\n      every { duration } returns 800L\n      every { totalDuration } returns 1200L // duration + startDelay\n      every { startDelay } returns 400L\n      // At 0.5 total progress (600ms), relative fraction = (600 - 400) / 800 = 0.25\n      every { getAnimatedValueAt(0.25f, mockCameraState) } returns 10.25\n    }\n\n    val result = listOf(shortAnimator, delayedAnimator).calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertEquals(1, result?.stages?.size)\n    // Total duration is max(500, 1200) = 1200ms, so 0.5 * 1200 = 600ms\n    assertEquals(600L, result?.stages?.get(0)?.progress)\n\n    // Check interpolated values\n    val stage = result?.stages?.get(0)\n    assertEquals(Point.fromLngLat(1.0, 1.0), stage?.camera?.center) // shortAnimator finished (fraction 1.0)\n    assertEquals(10.25, stage?.camera?.zoom ?: -1.0, 0.001) // delayedAnimator at 0.25 fraction\n  }\n\n  @Test\n  fun `getRelativeFraction handles zero duration child animations correctly`() {\n    val normalAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1000L\n      every { totalDuration } returns 1000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.3f, mockCameraState) } returns Point.fromLngLat(0.3, 0.3)\n    }\n\n    val zeroDurationAnimator = mockk<CameraZoomAnimator>() {\n      every { duration } returns 0L\n      every { totalDuration } returns 0L\n      every { startDelay } returns 0L\n      // For zero duration, getRelativeFraction should return 1f regardless of totalFraction\n      every { getAnimatedValueAt(1.0f, mockCameraState) } returns 15.0\n    }\n\n    val result = listOf(normalAnimator, zeroDurationAnimator)\n      .calculateCameraAnimationHint(listOf(0.3f), mockCameraState)\n\n    assertEquals(1, result?.stages?.size)\n    // Total duration is max(1000, 0) = 1000ms, so 0.3 * 1000 = 300ms\n    assertEquals(300L, result?.stages?.get(0)?.progress)\n\n    val stage = result?.stages?.get(0)\n    // Normal animator: relative fraction = (300 - 0) / 1000 = 0.3\n    assertEquals(Point.fromLngLat(0.3, 0.3), stage?.camera?.center)\n    // Zero duration animator: relative fraction = 1.0 (hardcoded for zero duration)\n    assertEquals(15.0, stage?.camera?.zoom!!, 0.001)\n  }\n\n  @Test\n  fun `List calculateCameraAnimationHint handles infinite duration animators correctly`() {\n    val normalAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 2000L\n      every { totalDuration } returns 2000L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.5f, mockCameraState) } returns Point.fromLngLat(0.5, 0.5)\n    }\n\n    val infiniteDurationAnimator = mockk<CameraZoomAnimator>() {\n      every { duration } returns DURATION_INFINITE\n      every { totalDuration } returns DURATION_INFINITE\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(1.0f, mockCameraState) } returns 20.0\n    }\n\n    val result = listOf(normalAnimator, infiniteDurationAnimator).calculateCameraAnimationHint(listOf(0.5f), mockCameraState)\n\n    assertNull(result)\n  }\n\n  @Test\n  fun `AnimatorSet calculateCameraAnimationHint returns null for infinite duration child animators`() {\n    val normalAnimator = mockk<CameraCenterAnimator>() {\n      every { duration } returns 1500L\n      every { totalDuration } returns 1500L\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(0.6f, mockCameraState) } returns Point.fromLngLat(0.6, 0.6)\n    }\n\n    val infiniteDurationAnimator = mockk<CameraZoomAnimator>() {\n      every { duration } returns DURATION_INFINITE\n      every { totalDuration } returns DURATION_INFINITE\n      every { startDelay } returns 0L\n      every { getAnimatedValueAt(1.0f, mockCameraState) } returns 25.0\n    }\n\n    val animatorSet = spyk(AnimatorSet()) {\n      every { childAnimations } returns arrayListOf(normalAnimator, infiniteDurationAnimator)\n      every { duration } returns 1500L\n    }\n\n    val result = animatorSet.calculateCameraAnimationHint(listOf(0.6f), mockCameraState)\n\n    assertNull(result)\n  }\n}"
  },
  {
    "path": "plugin-animation/src/test/java/com/mapbox/maps/plugin/animation/CameraAnimationsListenersTest.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.Animator\nimport android.animation.ValueAnimator\nimport android.os.Looper\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPluginImplTest.Companion.toCameraState\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion.cameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.animator.CameraBearingAnimator\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.LooperMode\nimport org.robolectric.shadows.ShadowLog\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass CameraAnimationsListenersTest {\n\n  private lateinit var cameraAnimationsPluginImpl: CameraAnimationsPluginImpl\n  private lateinit var mapTransformDelegate: MapTransformDelegate\n  private lateinit var mapCameraManagerDelegate: MapCameraManagerDelegate\n\n  private class Listener : Animator.AnimatorListener {\n    override fun onAnimationStart(animation: Animator) {}\n\n    override fun onAnimationEnd(animation: Animator) {}\n\n    override fun onAnimationCancel(animation: Animator) {}\n\n    override fun onAnimationRepeat(animation: Animator) {}\n  }\n\n  @Before\n  fun setUp() {\n    ShadowLog.stream = System.out\n    val delegateProvider = mockk<MapDelegateProvider>(relaxed = true)\n    mapCameraManagerDelegate = mockk(relaxed = true)\n    mapTransformDelegate = mockk(relaxed = true)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    mockkObject(CameraTransform)\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapTransformDelegate } returns mapTransformDelegate\n    cameraAnimationsPluginImpl = CameraAnimationsPluginImpl().apply {\n      onDelegateProvider(delegateProvider)\n    }\n    var actualCameraState = CameraAnimationsPluginImplTest.cameraState\n\n    every {\n      mapCameraManagerDelegate.cameraState\n    } answers { actualCameraState }\n\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      actualCameraState = firstArg<CameraOptions>().toCameraState()\n      cameraAnimationsPluginImpl.onCameraMove(\n          center = actualCameraState.center,\n          zoom = actualCameraState.zoom,\n          pitch = actualCameraState.pitch,\n          bearing = actualCameraState.bearing,\n          padding = actualCameraState.padding\n      )\n    }\n  }\n\n  private fun CameraAnimationsPluginImpl.onCameraMove(cameraOptions: CameraOptions) {\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    unmockkObject(CameraTransform)\n  }\n\n  @Test\n  fun testAddListenerBeforeRegister() {\n    val bearingAnimator = CameraBearingAnimator(CameraAnimatorOptions.Builder(1.0).build(), true)\n    val listener1 = Listener()\n    val listener2 = Listener()\n    bearingAnimator.addListener(listener1)\n    bearingAnimator.addListener(listener2)\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    Assert.assertEquals(3, bearingAnimator.listeners.size)\n    Assert.assertEquals(\n      \"User animator should be second (first one is always internal)\",\n      listener1,\n      bearingAnimator.listeners[1]\n    )\n    Assert.assertEquals(\n      \"User animator should be third (first one is always internal)\",\n      listener2,\n      bearingAnimator.listeners[2]\n    )\n  }\n\n  @Test\n  fun testAddListenerAfterRegister() {\n    val bearingAnimator = CameraBearingAnimator(CameraAnimatorOptions.Builder(1.0).build(), true)\n    val listener1 = Listener()\n    val listener2 = Listener()\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    bearingAnimator.addListener(listener1)\n    bearingAnimator.addListener(listener2)\n    Assert.assertEquals(3, bearingAnimator.listeners.size)\n    Assert.assertEquals(\n      \"User animator should be second (first one is always internal)\",\n      listener1,\n      bearingAnimator.listeners[1]\n    )\n    Assert.assertEquals(\n      \"User animator should be third (first one is always internal)\",\n      listener2,\n      bearingAnimator.listeners[2]\n    )\n  }\n\n  @Test\n  fun testAddAndRemoveUserListeners() {\n    val bearingAnimator = CameraBearingAnimator(CameraAnimatorOptions.Builder(1.0).build(), true)\n    val listener1 = Listener()\n    bearingAnimator.addListener(listener1)\n    bearingAnimator.removeListener(listener1)\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    Assert.assertEquals(1, bearingAnimator.listeners.size)\n    Assert.assertNotEquals(listener1, bearingAnimator.listeners[0])\n\n    bearingAnimator.addListener(listener1)\n    bearingAnimator.addListener(listener1)\n    Assert.assertEquals(3, bearingAnimator.listeners.size)\n    Assert.assertEquals(listener1, bearingAnimator.listeners[1])\n    Assert.assertEquals(listener1, bearingAnimator.listeners[2])\n\n    bearingAnimator.removeListener(listener1)\n    Assert.assertEquals(2, bearingAnimator.listeners.size)\n    Assert.assertNotEquals(listener1, bearingAnimator.listeners[0])\n    Assert.assertEquals(listener1, bearingAnimator.listeners[1])\n  }\n\n  @Test\n  fun testAddAndRemoveInternalListeners() {\n    val bearingAnimator = CameraBearingAnimator(CameraAnimatorOptions.Builder(1.0).build(), true)\n    val listener1 = Listener()\n    bearingAnimator.addListener(listener1)\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    cameraAnimationsPluginImpl.unregisterAnimators(bearingAnimator)\n\n    Assert.assertEquals(1, bearingAnimator.listeners.size)\n    Assert.assertEquals(\n      \"User animator should be first (internal should be removed)\",\n      listener1,\n      bearingAnimator.listeners[0]\n    )\n    val listener2 = Listener()\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    bearingAnimator.addListener(listener2)\n\n    Assert.assertEquals(3, bearingAnimator.listeners.size)\n    Assert.assertEquals(\n      \"User animator should be second one (first one is always internal)\",\n      listener1,\n      bearingAnimator.listeners[1]\n    )\n    Assert.assertEquals(\n      \"User animator should be third one (first one is always internal)\",\n      listener2,\n      bearingAnimator.listeners[2]\n    )\n\n    cameraAnimationsPluginImpl.unregisterAllAnimators()\n\n    Assert.assertEquals(2, bearingAnimator.listeners.size)\n    Assert.assertEquals(\n      \"User animator should be first (internal should be removed)\",\n      listener1,\n      bearingAnimator.listeners[0]\n    )\n    Assert.assertEquals(\n      \"User animator should be first (internal should be removed)\",\n      listener2,\n      bearingAnimator.listeners[1]\n    )\n  }\n\n  @Test\n  fun testAddUpdateListenerBeforeRegister() {\n    val bearingAnimator = CameraBearingAnimator(\n      CameraAnimatorOptions.Builder(100.0).build(),\n      true\n    ) {\n      duration = 0\n    }\n    val valuesList = mutableListOf<Int>()\n    val listener1 = ValueAnimator.AnimatorUpdateListener {\n      valuesList.add(1)\n    }\n    val listener2 = ValueAnimator.AnimatorUpdateListener {\n      valuesList.add(2)\n    }\n    bearingAnimator.addUpdateListener(listener1)\n    bearingAnimator.addUpdateListener(listener2)\n    cameraAnimationsPluginImpl.addCameraBearingChangeListener { valuesList.add(0) }\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.start()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Assert.assertEquals(3, valuesList.size)\n    Assert.assertArrayEquals(intArrayOf(0, 1, 2), valuesList.toIntArray())\n  }\n\n  @Test\n  fun testAddUpdateListenerAfterRegister() {\n    val bearingAnimator = CameraBearingAnimator(\n      CameraAnimatorOptions.Builder(100.0).build(),\n      true\n    ) {\n      duration = 0\n    }\n    val valuesList = mutableListOf<Int>()\n    val listener1 = ValueAnimator.AnimatorUpdateListener {\n      valuesList.add(1)\n    }\n    val listener2 = ValueAnimator.AnimatorUpdateListener {\n      valuesList.add(2)\n    }\n    cameraAnimationsPluginImpl.addCameraBearingChangeListener { valuesList.add(0) }\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    bearingAnimator.addUpdateListener(listener1)\n    bearingAnimator.addUpdateListener(listener2)\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.start()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Assert.assertEquals(3, valuesList.size)\n    Assert.assertArrayEquals(intArrayOf(0, 1, 2), valuesList.toIntArray())\n  }\n\n  @Test\n  fun testAddAndRemoveUserUpdateListeners() {\n    val bearingAnimator = CameraBearingAnimator(\n      CameraAnimatorOptions.Builder(100.0).build(),\n      true\n    ) {\n      duration = 0\n    }\n    val valuesList = mutableListOf<Int>()\n    val listener = ValueAnimator.AnimatorUpdateListener {\n      valuesList.add(1)\n    }\n    cameraAnimationsPluginImpl.addCameraBearingChangeListener { valuesList.add(0) }\n    bearingAnimator.addUpdateListener(listener)\n    bearingAnimator.removeUpdateListener(listener)\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.start()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Assert.assertArrayEquals(intArrayOf(0), valuesList.toIntArray())\n  }\n\n  @Test\n  fun testAddTwoSameUserUpdateListeners() {\n    val bearingAnimator = CameraBearingAnimator(\n      CameraAnimatorOptions.Builder(100.0).build(),\n      true\n    ) {\n      duration = 0\n    }\n    val valuesList = mutableListOf<Int>()\n    val listener = ValueAnimator.AnimatorUpdateListener {\n      valuesList.add(1)\n    }\n    cameraAnimationsPluginImpl.addCameraBearingChangeListener { valuesList.add(0) }\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n\n    bearingAnimator.addUpdateListener(listener)\n    bearingAnimator.addUpdateListener(listener)\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.start()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Assert.assertEquals(2, valuesList.size)\n    Assert.assertArrayEquals(intArrayOf(0, 1), valuesList.toIntArray())\n  }\n\n  @Test\n  fun testAddAndRemoveInternalUpdateListeners() {\n    val bearingAnimator = CameraBearingAnimator(\n      CameraAnimatorOptions.Builder(100.0).build(),\n      true\n    ) {\n      duration = 0\n    }\n    val valuesList = mutableListOf<Int>()\n    val listener1 = ValueAnimator.AnimatorUpdateListener {\n      valuesList.add(1)\n    }\n    cameraAnimationsPluginImpl.addCameraBearingChangeListener { valuesList.add(0) }\n    bearingAnimator.addUpdateListener(listener1)\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    cameraAnimationsPluginImpl.unregisterAnimators(bearingAnimator)\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.start()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Assert.assertEquals(0, valuesList.size)\n\n    val listener2 = ValueAnimator.AnimatorUpdateListener {\n      valuesList.add(2)\n    }\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    bearingAnimator.addUpdateListener(listener2)\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.start()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Assert.assertEquals(3, valuesList.size)\n    Assert.assertArrayEquals(intArrayOf(0, 1, 2), valuesList.toIntArray())\n    valuesList.clear()\n\n    cameraAnimationsPluginImpl.unregisterAllAnimators()\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.start()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Assert.assertEquals(0, valuesList.size)\n  }\n\n  @Test\n  fun testRemoveAllListeners() {\n    val bearingAnimator = CameraBearingAnimator(\n      CameraAnimatorOptions.Builder(1.0).build(),\n      true\n    )\n    val listener1 = Listener()\n    val listener2 = Listener()\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    bearingAnimator.addListener(listener1)\n    bearingAnimator.addListener(listener2)\n\n    bearingAnimator.removeAllListeners()\n    Assert.assertEquals(1, bearingAnimator.listeners.size)\n    Assert.assertNotEquals(listener1, bearingAnimator.listeners[0])\n    Assert.assertNotEquals(listener2, bearingAnimator.listeners[0])\n  }\n\n  @Test\n  fun testRemoveAllUpdateListeners() {\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(100.0) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = 50\n    }\n    var bearing = 0.0\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    cameraAnimationsPluginImpl.addCameraBearingChangeListener { bearing = it }\n    var userBearing = bearing\n    val listener1 = ValueAnimator.AnimatorUpdateListener {\n      userBearing = it.animatedValue as Double\n    }\n    val listener2 = ValueAnimator.AnimatorUpdateListener {\n      userBearing = it.animatedValue as Double\n    }\n    bearingAnimator.addUpdateListener(listener1)\n    bearingAnimator.addUpdateListener(listener2)\n\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.start()\n    bearingAnimator.removeAllUpdateListeners()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n\n    Assert.assertEquals(0.0, userBearing, EPS)\n    Assert.assertEquals(100.0, bearing, EPS)\n  }\n\n  companion object {\n    private const val EPS = 0.000001\n  }\n}"
  },
  {
    "path": "plugin-animation/src/test/java/com/mapbox/maps/plugin/animation/CameraAnimationsPluginImplTest.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.Animator\nimport android.animation.Animator.AnimatorListener\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.AnimatorSet\nimport android.animation.ValueAnimator\nimport android.os.Handler\nimport android.os.Looper.getMainLooper\nimport androidx.core.animation.addListener\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPluginImpl.Companion.TAG\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion.cameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.animator.CameraAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraBearingAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraCenterAnimator\nimport com.mapbox.maps.plugin.animation.animator.CameraPitchAnimator\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.toCameraOptions\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkObject\nimport io.mockk.mockkStatic\nimport io.mockk.runs\nimport io.mockk.slot\nimport io.mockk.spyk\nimport io.mockk.unmockkObject\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport io.mockk.verifyOrder\nimport org.junit.After\nimport org.junit.Assert.assertArrayEquals\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.ParameterizedRobolectricTestRunner\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows.shadowOf\nimport org.robolectric.annotation.LooperMode\nimport org.robolectric.shadows.ShadowLog\nimport java.time.Duration\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass CameraAnimationsPluginImplTest {\n\n  private lateinit var cameraAnimationsPluginImpl: CameraAnimationsPluginImpl\n  private lateinit var mapTransformDelegate: MapTransformDelegate\n  private lateinit var mapCameraManagerDelegate: MapCameraManagerDelegate\n  private lateinit var cameraAnimatorsFactory: CameraAnimatorsFactory\n  private lateinit var bearingAnimator: CameraBearingAnimator\n  private lateinit var centerAnimator: CameraCenterAnimator\n\n  @Before\n  fun setUp() {\n    ShadowLog.stream = System.out\n    cameraAnimatorsFactory = mockk(relaxed = true)\n    bearingAnimator = mockk(relaxed = true)\n    centerAnimator = mockk(relaxed = true)\n    every { cameraAnimatorsFactory.getEaseTo(any()) } returns arrayOf(\n      bearingAnimator,\n      centerAnimator\n    )\n    every { cameraAnimatorsFactory.getMoveBy(any()) } returns arrayOf(\n      bearingAnimator,\n      centerAnimator\n    )\n    every { cameraAnimatorsFactory.getPitchBy(any()) } returns arrayOf(\n      bearingAnimator,\n      centerAnimator\n    )\n    every { cameraAnimatorsFactory.getRotateBy(any(), any()) } returns arrayOf(\n      bearingAnimator,\n      centerAnimator\n    )\n    every { cameraAnimatorsFactory.getScaleBy(any(), any()) } returns arrayOf(\n      bearingAnimator,\n      centerAnimator\n    )\n\n    val delegateProvider = mockk<MapDelegateProvider>(relaxed = true)\n    mapCameraManagerDelegate = mockk(relaxed = true)\n    mapTransformDelegate = mockk(relaxed = true)\n    mockkObject(CameraTransform)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    every { logI(any(), any()) } just Runs\n    every { logE(any(), any()) } just Runs\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapTransformDelegate } returns mapTransformDelegate\n    cameraAnimationsPluginImpl = CameraAnimationsPluginImpl().apply {\n      onDelegateProvider(delegateProvider)\n    }\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkObject(CameraTransform)\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun registerAnimators() {\n    val animators = arrayOf(\n      centerAnimator, bearingAnimator\n    )\n    cameraAnimationsPluginImpl.registerAnimators(*animators)\n    animators.forEach {\n      verify { it.addInternalListener(any()) }\n    }\n    animators.forEach {\n      assertTrue(cameraAnimationsPluginImpl.animators.contains(it))\n    }\n  }\n\n  @Test\n  fun unregisterAnimators() {\n    val animators = arrayOf(\n      centerAnimator, bearingAnimator\n    )\n    cameraAnimationsPluginImpl.registerAnimators(*animators)\n    cameraAnimationsPluginImpl.unregisterAnimators(*animators)\n    animators.forEach {\n      verify {\n        it.addInternalListener(any())\n        it.removeInternalListener()\n      }\n    }\n    assertTrue(\"Animators is not empty\", cameraAnimationsPluginImpl.animators.isEmpty())\n  }\n\n  @Test\n  fun unregisterAllAnimators() {\n    val animators = arrayOf(\n      centerAnimator, bearingAnimator\n    )\n    cameraAnimationsPluginImpl.registerAnimators(*animators)\n    cameraAnimationsPluginImpl.unregisterAllAnimators()\n    animators.forEach {\n      verify {\n        it.addInternalListener(any())\n        it.removeInternalListener()\n      }\n    }\n  }\n\n  @Test\n  fun startRegisteredAnimation() {\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(10.0) {\n        startValue(0.0)\n      },\n      true\n    )\n    val animators = arrayOf(\n      bearingAnimator\n    )\n    cameraAnimationsPluginImpl.registerAnimators(*animators)\n    AnimatorSet().apply {\n      duration = DURATION\n      playTogether(*animators)\n      start()\n    }\n\n    shadowOf(getMainLooper()).idle()\n\n    verify { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun startUnregisteredAnimation() {\n    cameraAnimationsPluginImpl.unregisterAllAnimators()\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(10.0) {\n        startValue(0.0)\n      },\n      true\n    )\n    val animators = arrayOf(\n      bearingAnimator\n    )\n    AnimatorSet().apply {\n      duration = DURATION\n      playTogether(*animators)\n      start()\n    }\n    verify(exactly = 0) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun testEaseToRegister() {\n    cameraAnimationsPluginImpl.cameraAnimationsFactory = cameraAnimatorsFactory\n    cameraAnimationsPluginImpl.easeTo(\n      cameraState.toCameraOptions(),\n      mapAnimationOptions { duration(DURATION) }\n    )\n    verify {\n      centerAnimator.addInternalListener(any())\n      bearingAnimator.addInternalListener(any())\n    }\n  }\n\n  @Test\n  fun testMoveToRegister() {\n    cameraAnimationsPluginImpl.cameraAnimationsFactory = cameraAnimatorsFactory\n    cameraAnimationsPluginImpl.moveBy(\n      ScreenCoordinate(VALUE, VALUE),\n      mapAnimationOptions { duration(DURATION) }\n    )\n    verify {\n      centerAnimator.addInternalListener(any())\n      bearingAnimator.addInternalListener(any())\n    }\n  }\n\n  @Test\n  fun testScaleByRegister() {\n    cameraAnimationsPluginImpl.cameraAnimationsFactory = cameraAnimatorsFactory\n    cameraAnimationsPluginImpl.scaleBy(\n      VALUE,\n      ScreenCoordinate(VALUE, VALUE),\n      mapAnimationOptions { duration(DURATION) }\n    )\n    verify {\n      centerAnimator.addInternalListener(any())\n      bearingAnimator.addInternalListener(any())\n    }\n  }\n\n  @Test\n  fun testRotateByRegister() {\n    cameraAnimationsPluginImpl.cameraAnimationsFactory = cameraAnimatorsFactory\n    cameraAnimationsPluginImpl.rotateBy(\n      ScreenCoordinate(VALUE, VALUE),\n      ScreenCoordinate(VALUE, VALUE),\n      mapAnimationOptions { duration(DURATION) }\n    )\n    verify {\n      centerAnimator.addInternalListener(any())\n      bearingAnimator.addInternalListener(any())\n    }\n  }\n\n  @Test\n  fun testPitchByRegister() {\n    cameraAnimationsPluginImpl.cameraAnimationsFactory = cameraAnimatorsFactory\n    cameraAnimationsPluginImpl.pitchBy(VALUE, mapAnimationOptions { duration(DURATION) })\n    verify {\n      centerAnimator.addInternalListener(any())\n      bearingAnimator.addInternalListener(any())\n    }\n  }\n\n  @Test\n  fun testEaseToWithEmptyCameraOptions() {\n    val cancelable = cameraAnimationsPluginImpl.easeTo(\n      cameraOptions { },\n      mapAnimationOptions { duration(DURATION) }\n    )\n    // Checking that passing empty cameraOptions doesn't throw exception\n    assertTrue(cancelable != null)\n  }\n\n  @Test\n  fun testFlyToWithEmptyCameraOptions() {\n    val cancelable = cameraAnimationsPluginImpl.flyTo(\n      cameraOptions { },\n      mapAnimationOptions { duration(DURATION) }\n    )\n    // Checking that passing empty cameraOptions doesn't throw exception\n    assertTrue(cancelable != null)\n  }\n\n  @Test\n  fun startSubsequentAnimationsWithTheSameType1() {\n    var cameraPosition = CameraOptions.Builder().build()\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg()\n    }\n\n    val targetFirst = 10.0\n    val bearingAnimatorFirst = createBearingAnimator(targetFirst, 2, 5)\n    val listenerFirst = CameraAnimatorListener()\n    bearingAnimatorFirst.addListener(listenerFirst)\n\n    val targetSecond = 12.0\n    val bearingAnimatorSecond = createBearingAnimator(targetSecond, 4, 5)\n    val listenerSecond = CameraAnimatorListener()\n    bearingAnimatorSecond.addListener(listenerSecond)\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimatorFirst, bearingAnimatorSecond)\n\n    shadowOf(getMainLooper()).pause()\n    bearingAnimatorFirst.start()\n    bearingAnimatorSecond.start()\n\n    shadowOf(getMainLooper()).idle()\n\n    assertTrue(listenerFirst.started)\n    assertTrue(listenerSecond.started)\n    assertTrue(listenerFirst.canceled)\n    assertTrue(listenerSecond.ended)\n    assertTrue(listenerSecond.ended)\n\n    assertEquals(targetSecond, cameraPosition.bearing)\n  }\n\n  @Test\n  fun startSubsequentAnimationsWithTheSameType2() {\n    var cameraPosition = CameraOptions.Builder().build()\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg()\n    }\n\n    val targetFirst = 10.0\n    val bearingAnimatorFirst = createBearingAnimator(targetFirst, 2, 3)\n    val listenerFirst = CameraAnimatorListener()\n    bearingAnimatorFirst.addListener(listenerFirst)\n\n    val targetSecond = 12.0\n    val bearingAnimatorSecond = createBearingAnimator(targetSecond, 7, 3)\n    val listenerSecond = CameraAnimatorListener()\n    bearingAnimatorSecond.addListener(listenerSecond)\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimatorFirst, bearingAnimatorSecond)\n\n    shadowOf(getMainLooper()).pause()\n    bearingAnimatorFirst.start()\n    bearingAnimatorSecond.start()\n\n    shadowOf(getMainLooper()).idle()\n\n    assertTrue(listenerFirst.started)\n    assertTrue(listenerSecond.started)\n    assertFalse(listenerFirst.canceled)\n    assertFalse(listenerSecond.canceled)\n    assertTrue(listenerSecond.ended)\n    assertTrue(listenerSecond.ended)\n\n    assertEquals(targetSecond, cameraPosition.bearing)\n  }\n\n  @Test\n  fun testEaseToSingleDurationZero() {\n    var cameraPosition = CameraOptions.Builder().build()\n    every {\n      mapCameraManagerDelegate.cameraState\n    } answers { cameraPosition.toCameraState() }\n\n    every {\n      mapCameraManagerDelegate.setCamera(any<CameraOptions>())\n    } answers {\n      cameraPosition = firstArg<CameraOptions>()\n      cameraAnimationsPluginImpl.onCameraMove(cameraPosition.toCameraState())\n    }\n\n    val targetPitch = 5.0\n    val cameraOptions = CameraOptions.Builder().pitch(targetPitch).build()\n    val expectedValues = mutableSetOf(targetPitch)\n    val updatedValues = mutableListOf<Double>()\n\n    cameraAnimationsPluginImpl.addCameraPitchChangeListener { updatedValue ->\n      updatedValues.add(\n        updatedValue\n      )\n    }\n\n    shadowOf(getMainLooper()).pause()\n\n    cameraAnimationsPluginImpl.easeTo(cameraOptions, mapAnimationOptions { duration(0) })\n\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(targetPitch, cameraPosition.pitch)\n    assertArrayEquals(expectedValues.toDoubleArray(), updatedValues.toDoubleArray(), EPS)\n  }\n\n  @Test\n  fun testEaseToSingleDurationShort() {\n    var cameraPosition = CameraOptions.Builder().build()\n    every {\n      mapCameraManagerDelegate.cameraState\n    } answers { cameraPosition.toCameraState() }\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg<CameraOptions>()\n      cameraAnimationsPluginImpl.onCameraMove(cameraPosition.toCameraState())\n    }\n    val targetPitch = 5.0\n    val cameraOptions = CameraOptions.Builder().pitch(targetPitch).build()\n    val expectedValues = mutableSetOf(VALUE, targetPitch)\n    val updatedValues = mutableListOf<Double>()\n\n    cameraAnimationsPluginImpl.addCameraPitchChangeListener { updatedValue ->\n      updatedValues.add(\n        updatedValue\n      )\n    }\n\n    shadowOf(getMainLooper()).pause()\n\n    cameraAnimationsPluginImpl.easeTo(cameraOptions, mapAnimationOptions { duration(1L) })\n\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(targetPitch, cameraPosition.pitch)\n    assertArrayEquals(expectedValues.toDoubleArray(), updatedValues.toDoubleArray(), EPS)\n  }\n\n  @Test\n  fun `two same immediate animations, second is skipped`() {\n    var cameraPosition = CameraOptions.Builder().bearing(0.0).build()\n    every {\n      mapCameraManagerDelegate.cameraState\n    } answers {\n      cameraPosition.toCameraState()\n    }\n    every {\n      mapCameraManagerDelegate.setCamera(any<CameraOptions>())\n    } answers {\n      cameraPosition = firstArg<CameraOptions>()\n      cameraAnimationsPluginImpl.onCameraMove(cameraPosition.toCameraState())\n    }\n\n    val cameraAnimatorOptions = cameraAnimatorOptions(10.0) {\n      startValue(10.0)\n    }\n    val bearingFirst = CameraBearingAnimator(cameraAnimatorOptions, true) {\n      duration = 0\n    }\n    bearingFirst.addListener(onStart = {\n      assertEquals(2, cameraAnimationsPluginImpl.animators.size)\n      assertEquals(false, (it as CameraAnimator<*>).skipped)\n    })\n\n    val bearingSecond = CameraBearingAnimator(cameraAnimatorOptions, true) {\n      duration = 0\n    }\n    bearingSecond.addListener(onStart = {\n      assertEquals(1, cameraAnimationsPluginImpl.animators.size)\n      assertEquals(true, (it as CameraAnimator<*>).skipped)\n    })\n\n    cameraAnimationsPluginImpl.playAnimatorsTogether(bearingFirst, bearingSecond)\n    assertTrue(\"Animators is not empty\", cameraAnimationsPluginImpl.animators.isEmpty())\n  }\n\n  @Test\n  fun `animation skipped if camera already has target value`() {\n    val cameraPosition = CameraOptions.Builder().bearing(10.0).build().toCameraState()\n    // Make sure current camera animations plugin has the right initial value\n    every {\n      mapCameraManagerDelegate.cameraState\n    } answers {\n      cameraPosition\n    }\n    cameraAnimationsPluginImpl.onCameraMove(cameraPosition)\n\n    val cameraAnimatorOptions = cameraAnimatorOptions(10.0) {\n      startValue(10.0)\n    }\n\n    val bearingAnimator = CameraBearingAnimator(cameraAnimatorOptions, true) {\n      duration = 0\n    }\n    bearingAnimator.addListener(onStart = {\n      assertEquals(1, cameraAnimationsPluginImpl.animators.size)\n      assertEquals(true, (it as CameraAnimator<*>).skipped)\n    })\n\n    cameraAnimationsPluginImpl.playAnimatorsTogether(bearingAnimator)\n    assertTrue(\"Animators is not empty\", cameraAnimationsPluginImpl.animators.isEmpty())\n  }\n\n  @Test\n  fun testEaseToSequenceDurationZero() {\n    var cameraPosition = CameraState(\n      Point.fromLngLat(90.0, 90.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      3.0,\n      90.0,\n      0.0\n    )\n    every {\n      mapCameraManagerDelegate.cameraState\n    } answers { cameraPosition }\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg<CameraOptions>().toCameraState()\n      cameraAnimationsPluginImpl.onCameraMove(cameraPosition)\n    }\n    val targetPitchFirst = 5.0\n    val targetPitchSecond = 10.0\n    val targetPitchThird = 15.0\n    val cameraOptions1 = CameraOptions.Builder().pitch(targetPitchFirst).build()\n    val cameraOptions2 = CameraOptions.Builder().pitch(targetPitchSecond).build()\n    val cameraOptions3 = CameraOptions.Builder().pitch(targetPitchThird).build()\n    val expectedValues = mutableSetOf(targetPitchFirst, targetPitchSecond, targetPitchThird)\n    val updatedValues = mutableListOf<Double>()\n\n    cameraAnimationsPluginImpl.addCameraPitchChangeListener { updatedValue ->\n      updatedValues.add(\n        updatedValue\n      )\n    }\n\n    shadowOf(getMainLooper()).pause()\n\n    cameraAnimationsPluginImpl.easeTo(cameraOptions1, mapAnimationOptions { duration(0) })\n\n    val handler = Handler(getMainLooper())\n    handler.postDelayed(\n      {\n        cameraAnimationsPluginImpl.easeTo(\n          cameraOptions2,\n          mapAnimationOptions { duration(0) }\n        )\n      },\n      1\n    )\n    handler.postDelayed(\n      {\n        cameraAnimationsPluginImpl.easeTo(\n          cameraOptions3,\n          mapAnimationOptions { duration(0) }\n        )\n      },\n      2\n    )\n\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(2))\n\n    assertEquals(targetPitchThird, cameraPosition.pitch, EPS)\n    assertArrayEquals(expectedValues.toDoubleArray(), updatedValues.toDoubleArray(), EPS)\n  }\n\n  @Test\n  fun testEaseToSequenceQuickDuration() {\n    var cameraPosition = CameraState(\n      Point.fromLngLat(90.0, 90.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      3.0,\n      90.0,\n      0.0\n    )\n    every {\n      mapCameraManagerDelegate.cameraState\n    } answers { cameraPosition }\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg<CameraOptions>().toCameraState()\n      cameraAnimationsPluginImpl.onCameraMove(cameraPosition)\n    }\n    val targetPitchFirst = 5.0\n    val targetPitchSecond = 10.0\n    val targetPitchThird = 15.0\n    val cameraOptions1 = CameraOptions.Builder().pitch(targetPitchFirst).build()\n    val cameraOptions2 = CameraOptions.Builder().pitch(targetPitchSecond).build()\n    val cameraOptions3 = CameraOptions.Builder().pitch(targetPitchThird).build()\n    val expectedValues = mutableSetOf(0.0, targetPitchFirst, targetPitchSecond, targetPitchThird)\n    val updatedValues = mutableListOf<Double>()\n\n    cameraAnimationsPluginImpl.addCameraPitchChangeListener { updatedValue ->\n      updatedValues.add(\n        updatedValue\n      )\n    }\n\n    shadowOf(getMainLooper()).pause()\n\n    val handler = Handler(getMainLooper())\n    cameraAnimationsPluginImpl.easeTo(cameraOptions1, mapAnimationOptions { duration(1) })\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(0))\n    shadowOf(getMainLooper()).idle()\n    handler.postDelayed(\n      {\n        cameraAnimationsPluginImpl.easeTo(\n          cameraOptions2,\n          mapAnimationOptions { duration(1) }\n        )\n      },\n      2\n    )\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(2))\n    shadowOf(getMainLooper()).idle()\n    handler.postDelayed(\n      {\n        cameraAnimationsPluginImpl.easeTo(\n          cameraOptions3,\n          mapAnimationOptions { duration(1) }\n        )\n      },\n      8\n    )\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(8))\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(targetPitchThird, cameraPosition.pitch, EPS)\n    assertArrayEquals(expectedValues.toDoubleArray(), updatedValues.toDoubleArray(), EPS)\n  }\n\n  @Test\n  fun testDelayedAnimatorsFinalStateAndCallbackResult() {\n    var cameraPosition = CameraOptions.Builder().build()\n    every {\n      mapCameraManagerDelegate.cameraState\n    } answers { cameraPosition.toCameraState() }\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg<CameraOptions>()\n      cameraAnimationsPluginImpl.onCameraMove(cameraPosition.toCameraState())\n    }\n    val targetPitchOne = 10.0\n    val pitchAnimatorOne = createPitchAnimator(targetPitchOne, 0, 1000L)\n    val pitchListenerOne = CameraAnimatorListener()\n    pitchAnimatorOne.addListener(pitchListenerOne)\n\n    val targetPitchTwo = 20.0\n    val pitchAnimatorTwo = createPitchAnimator(targetPitchTwo, 500, 1000L)\n    val pitchListenerTwo = CameraAnimatorListener()\n    pitchAnimatorTwo.addListener(pitchListenerTwo)\n\n    val targetPitchThree = 30.0\n    val pitchAnimatorThree = createPitchAnimator(targetPitchThree, 750, 1000L)\n    val pitchListenerThree = CameraAnimatorListener()\n    pitchAnimatorThree.addListener(pitchListenerThree)\n\n    var currentPitch = 0.0\n    cameraAnimationsPluginImpl.addCameraPitchChangeListener { updatedValue ->\n      currentPitch = updatedValue\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(\n      pitchAnimatorOne,\n      pitchAnimatorTwo,\n      pitchAnimatorThree\n    )\n\n    shadowOf(getMainLooper()).pause()\n\n    pitchAnimatorOne.start()\n    pitchAnimatorTwo.start()\n    pitchAnimatorThree.start()\n\n    shadowOf(getMainLooper()).idle()\n\n    assertTrue(pitchListenerOne.canceled)\n    assertTrue(pitchListenerTwo.canceled)\n    assertFalse(pitchListenerThree.canceled)\n    assertTrue(pitchListenerThree.ended)\n    assertEquals(targetPitchThree, currentPitch, EPS)\n    assertEquals(targetPitchThree, cameraPosition.pitch ?: -1.0, EPS)\n  }\n\n  @Test\n  fun testUpdateFrequency() {\n    val bearingDuration = 37L\n    val bearingAnimator = createBearingAnimator(10.0, 2, bearingDuration)\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n    shadowOf(getMainLooper()).idle()\n\n    // Adding value 2 because of first call after Animator.start()\n    val countUpdates = (bearingDuration + 1).toInt()\n    verify(exactly = countUpdates) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun testAnimatorListenersCallsCount() {\n    val bearingDuration = 17L\n    val bearingAnimator = createBearingAnimator(10.0, 2, bearingDuration)\n    val bearingListener = CameraAnimatorListener()\n    val bearingUpdateListener = CameraUpdateAnimatorListener()\n    bearingAnimator.addListener(bearingListener)\n    bearingAnimator.addUpdateListener(bearingUpdateListener)\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(1, bearingListener.endedCount)\n    assertEquals(1, bearingListener.startedCount)\n\n    // Adding +1 because of count of interpolated intervals (which is equal to bearing duration) and start value\n    assertEquals(bearingDuration + 1, bearingUpdateListener.updateCount)\n  }\n\n  @Test\n  fun executeBearingAnimator() {\n    var cameraPosition = CameraOptions.Builder().build()\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg()\n    }\n\n    val targetBearing = 12.0\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(targetBearing) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = DURATION\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(targetBearing, cameraPosition.bearing)\n  }\n\n  @Test\n  fun testSetUserAnimationProgressSubsequentAnimators() {\n    val bearingAnimatorFirst = createBearingAnimator(10.0, 2, 5)\n    val bearingAnimatorSecond = createBearingAnimator(12.0, 8, 5)\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimatorFirst, bearingAnimatorSecond)\n\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimatorFirst.start()\n    bearingAnimatorSecond.start()\n\n    shadowOf(getMainLooper()).idle()\n\n    verifyOrder {\n      mapTransformDelegate.setUserAnimationInProgress(true)\n      mapTransformDelegate.setUserAnimationInProgress(false)\n      mapTransformDelegate.setUserAnimationInProgress(true)\n      mapTransformDelegate.setUserAnimationInProgress(false)\n    }\n  }\n\n  @Test\n  fun testSetUserAnimationProgressOverlappedAnimators() {\n    val bearingAnimatorFirst = createBearingAnimator(10.0, 2, 5)\n    val bearingAnimatorSecond = createBearingAnimator(12.0, 4, 5)\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimatorFirst, bearingAnimatorSecond)\n\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimatorFirst.start()\n    bearingAnimatorSecond.start()\n\n    shadowOf(getMainLooper()).idle()\n\n    verifyOrder {\n      mapTransformDelegate.setUserAnimationInProgress(true)\n      mapTransformDelegate.setUserAnimationInProgress(true)\n      mapTransformDelegate.setUserAnimationInProgress(false)\n    }\n  }\n\n  @Test\n  fun testPlayAnimatorsTogether() {\n    val pitch = createPitchAnimator(15.0, 0, 5)\n    val pitchListener = CameraAnimatorListener()\n    pitch.addListener(pitchListener)\n\n    val bearing = createBearingAnimator(10.0, 0, 5)\n    bearing.addListener(\n      onStart = {\n        assertEquals(pitchListener.started, true)\n        assertEquals(pitchListener.ended, false)\n        assertEquals(pitchListener.canceled, false)\n        assertEquals((it as CameraAnimator<*>).owner, MapAnimationOwnerRegistry.INTERNAL)\n      }\n    )\n\n    shadowOf(getMainLooper()).pause()\n\n    cameraAnimationsPluginImpl.playAnimatorsTogether(pitch, bearing)\n\n    shadowOf(getMainLooper()).idle()\n  }\n\n  @Test\n  fun testPlayAnimatorsTogetherCustomOwner() {\n    val pitch = createPitchAnimator(15.0, 0, 5, owner = MapAnimationOwnerRegistry.GESTURES)\n    val pitchListener = CameraAnimatorListener()\n    pitch.addListener(pitchListener)\n\n    val bearing = createBearingAnimator(10.0, 0, 5, owner = MapAnimationOwnerRegistry.GESTURES)\n    bearing.addListener(\n      onStart = {\n        assertEquals(pitchListener.started, true)\n        assertEquals(pitchListener.ended, false)\n        assertEquals(pitchListener.canceled, false)\n        assertEquals((it as CameraAnimator<*>).owner, MapAnimationOwnerRegistry.GESTURES)\n      }\n    )\n\n    shadowOf(getMainLooper()).pause()\n\n    cameraAnimationsPluginImpl.playAnimatorsTogether(pitch, bearing)\n\n    shadowOf(getMainLooper()).idle()\n  }\n\n  @Test\n  fun testPlayAnimatorsSequentially() {\n\n    val pitch = createPitchAnimator(15.0, 0, 5)\n    val pitchListener = CameraAnimatorListener()\n    pitch.addListener(pitchListener)\n\n    val bearing = createBearingAnimator(10.0, 0, 5)\n    bearing.addListener(\n      onStart = {\n        assertEquals(pitchListener.started, true)\n        assertEquals(pitchListener.ended, true)\n      }\n    )\n\n    shadowOf(getMainLooper()).pause()\n\n    cameraAnimationsPluginImpl.playAnimatorsSequentially(pitch, bearing)\n\n    shadowOf(getMainLooper()).idle()\n  }\n\n  @Test\n  fun testPlayEmptyAnimatorsSequentially() {\n    cameraAnimationsPluginImpl = spyk(CameraAnimationsPluginImpl())\n    cameraAnimationsPluginImpl.playAnimatorsSequentially(*emptyArray())\n\n    verify(exactly = 0) { cameraAnimationsPluginImpl.registerAnimators(any()) }\n  }\n\n  @Test\n  fun testPlayEmptyAnimatorsTogether() {\n    cameraAnimationsPluginImpl = spyk(CameraAnimationsPluginImpl())\n    cameraAnimationsPluginImpl.playAnimatorsTogether(*emptyArray())\n\n    verify(exactly = 0) { cameraAnimationsPluginImpl.registerAnimators(any()) }\n  }\n\n  @Test\n  fun testAnimatorListenerParameterEnd() {\n    val listener = CameraAnimatorListener()\n    shadowOf(getMainLooper()).pause()\n    cameraAnimationsPluginImpl.easeTo(\n      cameraState.toCameraOptions(),\n      mapAnimationOptions {\n        duration(100L)\n      },\n      listener\n    )\n    shadowOf(getMainLooper()).idle()\n    assertEquals(true, listener.started)\n    assertEquals(false, listener.canceled)\n    assertEquals(true, listener.ended)\n  }\n\n  @Test\n  fun testAnimatorListenerParameterCancel() {\n    val listener = CameraAnimatorListener()\n\n    shadowOf(getMainLooper()).pause()\n\n    val handler = Handler(getMainLooper())\n    cameraAnimationsPluginImpl.easeTo(\n      cameraState.toCameraOptions(),\n      mapAnimationOptions {\n        duration(10L)\n      },\n      listener\n    )\n    handler.postDelayed(\n      {\n        cameraAnimationsPluginImpl.cancelAllAnimators()\n      },\n      5L\n    )\n\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(5))\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(true, listener.started)\n    assertEquals(true, listener.canceled)\n    // end is triggered after cancel in any case\n    assertEquals(true, listener.ended)\n  }\n\n  @Test\n  fun testCancelAllExceptProtected() {\n    val listenerOne = CameraAnimatorListener()\n    val listenerTwo = CameraAnimatorListener()\n    val listenerThree = CameraAnimatorListener()\n\n    val animatorOne = cameraAnimationsPluginImpl.createBearingAnimator(\n      cameraAnimatorOptions(2.0) {\n        owner(\"Owner_1\")\n      }\n    ) {\n      duration = 200L\n      addListener(listenerOne)\n    }\n    val animatorTwo = cameraAnimationsPluginImpl.createZoomAnimator(\n      cameraAnimatorOptions(3.0) {\n        owner(\"Owner_2\")\n      }\n    ) {\n      duration = 200L\n      addListener(listenerTwo)\n    }\n    val animatorThree = cameraAnimationsPluginImpl.createPitchAnimator(\n      cameraAnimatorOptions(4.0) {\n        owner(\"Owner_3\")\n      }\n    ) {\n      duration = 200L\n      addListener(listenerThree)\n    }\n\n    val handler = Handler(getMainLooper())\n\n    shadowOf(getMainLooper()).pause()\n    cameraAnimationsPluginImpl.registerAnimators(animatorOne, animatorTwo, animatorThree)\n    animatorOne.start()\n    animatorTwo.start()\n    animatorThree.start()\n    handler.postDelayed(\n      {\n        cameraAnimationsPluginImpl.cancelAllAnimators(listOf(\"Owner_1\", \"Owner_3\"))\n      },\n      5L\n    )\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(20L))\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(false, listenerOne.canceled)\n    assertEquals(true, listenerTwo.canceled)\n    assertEquals(false, listenerThree.canceled)\n  }\n\n  @Test\n  fun testAnimatorListenerParameterCancelAnotherAnimation() {\n    val listenerOne = CameraAnimatorListener()\n    val listenerTwo = CameraAnimatorListener()\n\n    shadowOf(getMainLooper()).pause()\n\n    val handler = Handler(getMainLooper())\n    cameraAnimationsPluginImpl.easeTo(\n      cameraState.toCameraOptions(),\n      mapAnimationOptions {\n        duration(10L)\n      },\n      listenerOne\n    )\n    handler.postDelayed(\n      {\n        cameraAnimationsPluginImpl.easeTo(\n          cameraState.toCameraOptions(),\n          mapAnimationOptions {\n            duration(10L)\n          },\n          listenerTwo\n        )\n      },\n      5L\n    )\n\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(20L))\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(true, listenerOne.started)\n    assertEquals(true, listenerOne.canceled)\n    // end is triggered after cancel in any case\n    assertEquals(true, listenerOne.ended)\n\n    assertEquals(true, listenerTwo.started)\n    assertEquals(false, listenerTwo.canceled)\n    assertEquals(true, listenerTwo.ended)\n  }\n\n  @Test\n  fun testLifecycleListener() {\n    val listenerOne = LifecycleListener()\n    shadowOf(getMainLooper()).pause()\n    cameraAnimationsPluginImpl.addCameraAnimationsLifecycleListener(listenerOne)\n    val bearingAnimatorOne = cameraAnimationsPluginImpl.createBearingAnimator(\n      cameraAnimatorOptions(60.0) {\n        startValue(10.0)\n      }\n    ) {\n      duration = 10L\n    }\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimatorOne)\n    bearingAnimatorOne.start()\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(true, listenerOne.starting)\n    assertEquals(false, listenerOne.cancelling)\n    assertEquals(true, listenerOne.ending)\n    assertEquals(false, listenerOne.interrupting)\n\n    shadowOf(getMainLooper()).pause()\n\n    val bearingAnimatorTwo = cameraAnimationsPluginImpl.createBearingAnimator(\n      cameraAnimatorOptions(90.0) {\n        startValue(10.0)\n      }\n    ) {\n      duration = 50L\n    }\n    val listenerTwo = LifecycleListener()\n    cameraAnimationsPluginImpl.removeCameraAnimationsLifecycleListener(listenerOne)\n    cameraAnimationsPluginImpl.addCameraAnimationsLifecycleListener(listenerTwo)\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimatorTwo)\n    bearingAnimatorOne.start()\n    bearingAnimatorTwo.start()\n\n    shadowOf(getMainLooper()).idle()\n\n    assertEquals(false, listenerOne.cancelling)\n    assertEquals(true, listenerTwo.starting)\n    assertEquals(true, listenerTwo.cancelling)\n    assertEquals(true, listenerTwo.ending)\n    assertEquals(true, listenerTwo.interrupting)\n  }\n\n  @Test\n  fun registerOnlyCameraAnimatorsTest() {\n    val pitch = createPitchAnimator(15.0, 0, 5)\n    val bearing = createBearingAnimator(10.0, 0, 5)\n    val animator = ValueAnimator.ofFloat(0.0f, 10.0f)\n    cameraAnimationsPluginImpl.playAnimatorsSequentially(pitch, bearing, animator)\n    assert(cameraAnimationsPluginImpl.animators.size == 2)\n    cameraAnimationsPluginImpl.unregisterAllAnimators()\n    cameraAnimationsPluginImpl.playAnimatorsTogether(pitch, bearing, animator)\n    assert(cameraAnimationsPluginImpl.animators.size == 2)\n  }\n\n  @Test\n  fun cancelStartedHighLevelAnimation() {\n    val listener = CameraAnimatorListener()\n    shadowOf(getMainLooper()).pause()\n    val cancelable = cameraAnimationsPluginImpl.flyTo(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(VALUE, VALUE))\n        .bearing(VALUE)\n        .build(),\n      mapAnimationOptions {\n        duration(50L)\n      },\n      listener\n    )\n    cancelable.cancel()\n    shadowOf(getMainLooper()).idle()\n    // expecting 1 (and not 2) because we register 1 high-level animator listener\n    assertEquals(1, listener.startedCount)\n    assertEquals(1, listener.canceledCount)\n  }\n\n  @Test\n  fun anchorTest() {\n    shadowOf(getMainLooper()).pause()\n    val anchor = ScreenCoordinate(7.0, 7.0)\n    val anchorAnimator = cameraAnimationsPluginImpl.createAnchorAnimator(\n      cameraAnimatorOptions(anchor) {\n        startValue(anchor)\n      }\n    ) {\n      duration = 10L\n    }\n    cameraAnimationsPluginImpl.registerAnimators(anchorAnimator)\n    anchorAnimator.start()\n    shadowOf(getMainLooper()).idle()\n    assertEquals(anchor, cameraAnimationsPluginImpl.anchor)\n    var counter = 0\n    cameraAnimationsPluginImpl.addCameraAnchorChangeListener { counter++ }\n    cameraAnimationsPluginImpl.anchor = null\n    assertEquals(null, cameraAnimationsPluginImpl.anchor)\n    assertEquals(1, counter)\n  }\n\n  @Test\n  fun nestedHighLevelAnimationListeners() {\n    val listener = CameraAnimatorListener()\n    shadowOf(getMainLooper()).pause()\n    cameraAnimationsPluginImpl.flyTo(\n      CameraOptions.Builder()\n        .center(Point.fromLngLat(VALUE, VALUE))\n        .bearing(VALUE)\n        .build(),\n      mapAnimationOptions {\n        duration(50L)\n      },\n      object : AnimatorListenerAdapter() {\n        override fun onAnimationEnd(animation: Animator) {\n          super.onAnimationEnd(animation)\n          cameraAnimationsPluginImpl.flyTo(\n            CameraOptions.Builder()\n              .center(Point.fromLngLat(VALUE, VALUE))\n              .bearing(VALUE)\n              .build(),\n            mapAnimationOptions {\n              duration(50L)\n            },\n            listener\n          )\n        }\n      }\n    )\n    shadowOf(getMainLooper()).idle()\n    assertEquals(1, listener.startedCount)\n    assertEquals(1, listener.endedCount)\n  }\n\n  @Test\n  fun firstUpdateTickTest() {\n    val updateList = mutableListOf<CameraOptions>()\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      updateList.add(firstArg())\n    }\n    shadowOf(getMainLooper()).pause()\n    val bearingAnimator = cameraAnimationsPluginImpl.createBearingAnimator(\n      cameraAnimatorOptions(60.0) {\n        startValue(20.0)\n      }\n    ) {\n      duration = 50\n    }\n    val pitchAnimator = cameraAnimationsPluginImpl.createPitchAnimator(\n      cameraAnimatorOptions(40.0) {\n        startValue(10.0)\n      }\n    ) {\n      duration = 50\n    }\n    cameraAnimationsPluginImpl.registerAnimators(\n      bearingAnimator, pitchAnimator\n    )\n    bearingAnimator.start()\n    pitchAnimator.start()\n    shadowOf(getMainLooper()).idle()\n    // animators are applied one after each other now to avoid jittering\n    assertEquals(20.0, updateList[0].bearing!!, EPS)\n    assertEquals(10.0, updateList[1].pitch!!, EPS)\n  }\n\n  @Test\n  fun debugModeTrueTest() {\n    cameraAnimationsPluginImpl.debugMode = true\n    shadowOf(getMainLooper()).pause()\n    cameraAnimationsPluginImpl.easeTo(\n      cameraState.toCameraOptions(),\n      mapAnimationOptions { duration(DURATION) }\n    )\n    shadowOf(getMainLooper()).idle()\n    verify { logI(TAG, any()) }\n  }\n\n  @Test\n  fun debugModeFalseTest() {\n    cameraAnimationsPluginImpl.debugMode = false\n    shadowOf(getMainLooper()).pause()\n    cameraAnimationsPluginImpl.easeTo(\n      cameraState.toCameraOptions(),\n      mapAnimationOptions { duration(DURATION) }\n    )\n    shadowOf(getMainLooper()).idle()\n    verify(exactly = 0) { logI(TAG, any()) }\n  }\n\n  @Test\n  fun catchExceptionOnSetCameraTest() {\n    val targetCameraOptions = CameraOptions.Builder()\n      .center(Point.fromLngLat(50.0, 50.0))\n      .pitch(50.0)\n      .bearing(50.0)\n      .zoom(5.0)\n      .build()\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } throws Exception(\"Invalid camera options\")\n\n    cameraAnimationsPluginImpl.performMapJump(targetCameraOptions)\n\n    verify(exactly = 1) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun skipsEmptyCameraOptions() {\n    val targetCameraOptions = CameraOptions.Builder().build()\n\n    cameraAnimationsPluginImpl.performMapJump(targetCameraOptions)\n\n    verify(exactly = 0) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun skipsAlreadyAppliedCameraOptions() {\n    val startCameraOptions = CameraOptions.Builder()\n      .center(Point.fromLngLat(50.0, 50.0))\n      .pitch(50.0)\n      .bearing(50.0)\n      .zoom(5.0)\n      .build()\n\n    val sameCameraOptions1 = CameraOptions.Builder()\n      .center(Point.fromLngLat(50.0, 50.0))\n      .bearing(50.0)\n      .build()\n    val sameCameraOptions2 = CameraOptions.Builder()\n      .center(Point.fromLngLat(50.0, 50.0))\n      .bearing(50.0)\n      .build()\n    val sameCameraOptions3 = CameraOptions.Builder()\n      .zoom(5.0)\n      .build()\n\n    cameraAnimationsPluginImpl.onCameraMove(startCameraOptions.toCameraState())\n    cameraAnimationsPluginImpl.performMapJump(sameCameraOptions1)\n    cameraAnimationsPluginImpl.performMapJump(sameCameraOptions2)\n    cameraAnimationsPluginImpl.performMapJump(sameCameraOptions3)\n    cameraAnimationsPluginImpl.performMapJump(startCameraOptions)\n\n    verify(exactly = 0) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun doesNotSkipNewCameraOptions() {\n    val startCameraOptions = CameraOptions.Builder()\n      .center(Point.fromLngLat(50.0, 50.0))\n      .pitch(50.0)\n      .bearing(50.0)\n      .zoom(5.0)\n      .build()\n    val newCameraOptions1 = CameraOptions.Builder()\n      .center(Point.fromLngLat(50.0, 50.0))\n      .bearing(60.0)\n      .build()\n    val newCameraOptions2 = CameraOptions.Builder()\n      .center(Point.fromLngLat(50.0, 50.0))\n      .bearing(20.0)\n      .build()\n    val newCameraOptions3 = CameraOptions.Builder()\n      .zoom(1.0)\n      .build()\n\n    cameraAnimationsPluginImpl.onCameraMove(startCameraOptions.toCameraState())\n    cameraAnimationsPluginImpl.performMapJump(newCameraOptions1)\n\n    cameraAnimationsPluginImpl.onCameraMove(newCameraOptions1.toCameraState())\n    cameraAnimationsPluginImpl.performMapJump(newCameraOptions2)\n\n    cameraAnimationsPluginImpl.onCameraMove(newCameraOptions2.toCameraState())\n    cameraAnimationsPluginImpl.performMapJump(newCameraOptions3)\n\n    cameraAnimationsPluginImpl.onCameraMove(newCameraOptions3.toCameraState())\n    cameraAnimationsPluginImpl.performMapJump(startCameraOptions)\n\n    verify(exactly = 4) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun doesNotSkipCameraOptionsWithAnchor() {\n    val startCameraOptions = CameraOptions.Builder()\n      .center(Point.fromLngLat(50.0, 50.0))\n      .pitch(50.0)\n      .bearing(50.0)\n      .zoom(5.0)\n      .anchor(ScreenCoordinate(0.0, 5.0))\n      .build()\n\n    val newCameraOptions = CameraOptions.Builder()\n      .anchor(ScreenCoordinate(0.0, 5.0))\n      .build()\n\n    cameraAnimationsPluginImpl.onCameraMove(startCameraOptions.toCameraState())\n    cameraAnimationsPluginImpl.performMapJump(startCameraOptions)\n\n    cameraAnimationsPluginImpl.onCameraMove(startCameraOptions.toCameraState())\n    cameraAnimationsPluginImpl.performMapJump(newCameraOptions)\n\n    verify(exactly = 2) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun skipsCameraOptionsWithLowPitch() {\n    val startCameraOptionsPitchLow = CameraOptions.Builder()\n      .pitch(50.0)\n      .build()\n\n    cameraAnimationsPluginImpl.onCameraMove(startCameraOptionsPitchLow.toCameraState())\n    cameraAnimationsPluginImpl.performMapJump(startCameraOptionsPitchLow)\n    cameraAnimationsPluginImpl.performMapJump(startCameraOptionsPitchLow)\n    cameraAnimationsPluginImpl.performMapJump(startCameraOptionsPitchLow)\n\n    verify(exactly = 0) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun doesNotSkipCameraOptionsWithPitch60() {\n    val startCameraOptionsPitchHigh = CameraOptions.Builder()\n      .pitch(65.0)\n      .build()\n\n    cameraAnimationsPluginImpl.onCameraMove(startCameraOptionsPitchHigh.toCameraState())\n    cameraAnimationsPluginImpl.performMapJump(startCameraOptionsPitchHigh)\n    cameraAnimationsPluginImpl.performMapJump(startCameraOptionsPitchHigh)\n    cameraAnimationsPluginImpl.performMapJump(startCameraOptionsPitchHigh)\n\n    verify(exactly = 3) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun listenersAreNotified() {\n    val cameraState = CameraOptions.Builder()\n      .center(Point.fromLngLat(30.0, 20.0))\n      .pitch(50.0)\n      .bearing(60.0)\n      .zoom(5.0)\n      .padding(EdgeInsets(1.0, 2.0, 3.0, 4.0))\n      .build()\n      .toCameraState()\n\n    var pitch = 0.0\n    cameraAnimationsPluginImpl.addCameraPitchChangeListener { pitch = it }\n    var edgeInsets: EdgeInsets? = null\n    cameraAnimationsPluginImpl.addCameraPaddingChangeListener { edgeInsets = it }\n    var center: Point? = null\n    cameraAnimationsPluginImpl.addCameraCenterChangeListener { center = it }\n    var bearing = 0.0\n    cameraAnimationsPluginImpl.addCameraBearingChangeListener { bearing = it }\n    var zoom = 0.0\n    cameraAnimationsPluginImpl.addCameraZoomChangeListener { zoom = it }\n\n    cameraAnimationsPluginImpl.onCameraMove(cameraState)\n\n    assertEquals(50.0, pitch, EPS)\n    assertEquals(60.0, bearing, EPS)\n    assertEquals(5.0, zoom, EPS)\n    assertEquals(Point.fromLngLat(30.0, 20.0), center)\n    assertEquals(EdgeInsets(1.0, 2.0, 3.0, 4.0), edgeInsets)\n  }\n\n  @Test\n  fun useCameraStateValuesIfStartValueIsNotSet() {\n    val cachedCameraOptions = CameraOptions.Builder()\n      .center(Point.fromLngLat(50.0, 50.0))\n      .pitch(50.0)\n      .bearing(50.0)\n      .zoom(5.0)\n      .padding(EdgeInsets(50.0, 50.0, 50.0, 50.0))\n      .anchor(ScreenCoordinate(50.0, 50.0))\n      .build()\n    cameraAnimationsPluginImpl.onCameraMove(cachedCameraOptions.toCameraState())\n\n    val mapCameraOptions = CameraOptions.Builder()\n      .center(Point.fromLngLat(51.0, 51.0))\n      .pitch(51.0)\n      .bearing(51.0)\n      .zoom(5.1)\n      .padding(EdgeInsets(51.0, 51.0, 51.0, 51.0))\n      .build()\n\n    every { mapCameraManagerDelegate.cameraState } returns mapCameraOptions.toCameraState()\n\n    val centerAnimator = spyk(\n      cameraAnimationsPluginImpl.createCenterAnimator(\n        cameraAnimatorOptions(Point.fromLngLat(52.0, 52.0))\n      )\n    )\n    val bearingAnimator = spyk(\n      cameraAnimationsPluginImpl.createBearingAnimator(\n        cameraAnimatorOptions(60.0)\n      )\n    )\n    val zoomAnimator = spyk(\n      cameraAnimationsPluginImpl.createZoomAnimator(\n        cameraAnimatorOptions(15.0)\n      )\n    )\n    val pitchAnimator = spyk(\n      cameraAnimationsPluginImpl.createPitchAnimator(\n        cameraAnimatorOptions(40.0)\n      )\n    )\n    val anchorAnimator = spyk(\n      cameraAnimationsPluginImpl.createAnchorAnimator(\n        cameraAnimatorOptions(ScreenCoordinate(52.0, 52.0))\n      )\n    )\n    val paddingAnimator = spyk(\n      cameraAnimationsPluginImpl.createPaddingAnimator(\n        cameraAnimatorOptions(EdgeInsets(52.0, 52.0, 52.0, 52.0))\n      )\n    )\n    cameraAnimationsPluginImpl.registerAnimators(\n      centerAnimator, bearingAnimator, zoomAnimator, pitchAnimator, anchorAnimator, paddingAnimator,\n    )\n\n    centerAnimator.start()\n    bearingAnimator.start()\n    zoomAnimator.start()\n    pitchAnimator.start()\n    anchorAnimator.start()\n    paddingAnimator.start()\n\n    verify {\n      centerAnimator.setObjectValues(mapCameraOptions.center, Point.fromLngLat(52.0, 52.0))\n    }\n    verify { bearingAnimator.setObjectValues(mapCameraOptions.bearing, 60.0) }\n    verify { zoomAnimator.setObjectValues(mapCameraOptions.zoom, 15.0) }\n    verify { pitchAnimator.setObjectValues(mapCameraOptions.pitch, 40.0) }\n    verify {\n      anchorAnimator.setObjectValues(\n        ScreenCoordinate(0.0, 0.0),\n        ScreenCoordinate(52.0, 52.0)\n      )\n    }\n    verify {\n      paddingAnimator.setObjectValues(\n        mapCameraOptions.padding,\n        EdgeInsets(52.0, 52.0, 52.0, 52.0),\n      )\n    }\n  }\n\n  @Test\n  fun `onAnimationUpdateInternal exits early when animator is canceled`() {\n    var cameraPosition = CameraOptions.Builder().build()\n    var updateCallCount = 0\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg()\n      updateCallCount++\n    }\n\n    val targetBearing = 12.0\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(targetBearing) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = 100L\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n\n    // Let a few updates happen\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(10))\n    val updatesBeforeCancel = updateCallCount\n    assertTrue(\"Expected at least one update before cancel\", updatesBeforeCancel > 0)\n\n    // Cancel the animator\n    bearingAnimator.cancel()\n    shadowOf(getMainLooper()).idle()\n\n    // Verify no additional setCamera calls happened after cancel\n    // (the cancel itself might trigger one final update, but subsequent updates should be ignored)\n    val updatesAfterCancel = updateCallCount\n    assertEquals(\n      \"No additional updates should occur after canceled flag is set\",\n      updatesBeforeCancel,\n      updatesAfterCancel\n    )\n  }\n\n  @Test\n  fun `onAnimationUpdateInternal exits early when animator endedNormally`() {\n    var cameraPosition = CameraOptions.Builder().build()\n    var updateCallCount = 0\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg()\n      updateCallCount++\n    }\n\n    val targetBearing = 12.0\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(targetBearing) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = 100L\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n\n    // Let a few updates happen\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(10))\n    val updatesBeforeEnd = updateCallCount\n    assertTrue(\"Expected at least one update before end\", updatesBeforeEnd > 0)\n\n    // End the animator\n    bearingAnimator.end()\n    shadowOf(getMainLooper()).idle()\n\n    // Verify no additional setCamera calls happened after end\n    val updatesAfterEnd = updateCallCount\n    assertEquals(\n      \"No additional updates should occur after endedNormally flag is set\",\n      updatesBeforeEnd,\n      updatesAfterEnd\n    )\n  }\n\n  @Test\n  fun `onAnimationUpdateInternal exits early when both canceled and endedNormally are true`() {\n    var cameraPosition = CameraOptions.Builder().build()\n    var updateCallCount = 0\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg()\n      updateCallCount++\n    }\n\n    val targetBearing = 12.0\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(targetBearing) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = 100L\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n\n    // Let a few updates happen\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(10))\n    val updatesBeforeEndAndCancel = updateCallCount\n    assertTrue(\"Expected at least one update before end and cancel\", updatesBeforeEndAndCancel > 0)\n\n    // End then cancel the animator (both flags will be true)\n    bearingAnimator.end()\n    bearingAnimator.cancel()\n    shadowOf(getMainLooper()).idle()\n\n    // Verify no additional setCamera calls happened after both flags are set\n    val updatesAfter = updateCallCount\n    assertEquals(\n      \"No additional updates should occur when both canceled and endedNormally are true\",\n      updatesBeforeEndAndCancel,\n      updatesAfter\n    )\n  }\n\n  @Test\n  fun `onAnimationUpdateInternal processes normally when neither canceled nor endedNormally is true`() {\n    var cameraPosition = CameraOptions.Builder().build()\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } answers {\n      cameraPosition = firstArg()\n    }\n\n    val targetBearing = 12.0\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(targetBearing) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = 50L\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n    shadowOf(getMainLooper()).idle()\n\n    // Animation completed normally, final camera position should be the target\n    assertEquals(targetBearing, cameraPosition.bearing)\n  }\n\n  @Test\n  fun `runningAnimatorsQueue remains empty when animator is canceled before updates`() {\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } just Runs\n\n    val targetBearing = 12.0\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(targetBearing) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = 100L\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n\n    // Cancel immediately before any updates are processed\n    bearingAnimator.cancel()\n    shadowOf(getMainLooper()).idle()\n\n    // Verify setUserAnimationInProgress was set to true on start, then false on cancel\n    // If the queue remained empty during updates, setUserAnimationInProgress(false)\n    // should be called when animation finishes\n    verifyOrder {\n      mapTransformDelegate.setUserAnimationInProgress(true)\n      mapTransformDelegate.setUserAnimationInProgress(false)\n    }\n  }\n\n  @Test\n  fun `runningAnimatorsQueue remains empty when animator endedNormally before updates`() {\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } just Runs\n\n    val targetBearing = 12.0\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(targetBearing) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = 100L\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n\n    // End immediately before any updates are processed\n    bearingAnimator.end()\n    shadowOf(getMainLooper()).idle()\n\n    // Verify setUserAnimationInProgress was set to true on start, then false on end\n    // If the queue remained empty during updates, setUserAnimationInProgress(false)\n    // should be called when animation finishes\n    verifyOrder {\n      mapTransformDelegate.setUserAnimationInProgress(true)\n      mapTransformDelegate.setUserAnimationInProgress(false)\n    }\n  }\n\n  @Test\n  fun `runningAnimatorsQueue is populated when animator runs normally`() {\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } just Runs\n\n    val targetBearing = 12.0\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(targetBearing) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = 50L\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n    shadowOf(getMainLooper()).idle()\n\n    // Verify setUserAnimationInProgress was set to true, then false\n    // Multiple setCamera calls indicate the animator was in the queue during updates\n    verifyOrder {\n      mapTransformDelegate.setUserAnimationInProgress(true)\n      mapTransformDelegate.setUserAnimationInProgress(false)\n    }\n    verify(atLeast = 1) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun `runningAnimatorsQueue not populated when canceled animator receives update callbacks`() {\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } just Runs\n    every { mapCameraManagerDelegate.cameraState } returns CameraOptions.Builder()\n      .bearing(0.0)\n      .build()\n      .toCameraState()\n\n    val targetBearing = 12.0\n    val bearingAnimator = CameraBearingAnimator(\n      cameraAnimatorOptions(targetBearing) {\n        startValue(0.0)\n      },\n      true\n    ) {\n      duration = 100L\n    }\n\n    cameraAnimationsPluginImpl.registerAnimators(bearingAnimator)\n    shadowOf(getMainLooper()).pause()\n\n    bearingAnimator.start()\n\n    // Let one update happen\n    shadowOf(getMainLooper()).idleFor(Duration.ofMillis(5))\n\n    // Cancel and continue processing\n    bearingAnimator.cancel()\n    shadowOf(getMainLooper()).idle()\n\n    // The key test: after cancel, any update callbacks that fire should exit early\n    // and not add to queue. We verify this by checking that setUserAnimationInProgress(false)\n    // is called after the animation ends (meaning queue is empty)\n    verifyOrder {\n      mapTransformDelegate.setUserAnimationInProgress(true)\n      mapTransformDelegate.setUserAnimationInProgress(false)\n    }\n    verify(exactly = 1) { mapTransformDelegate.setUserAnimationInProgress(true) }\n  }\n\n  class LifecycleListener : CameraAnimationsLifecycleListener {\n    var starting = false\n    var interrupting = false\n    var cancelling = false\n    var ending = false\n\n    override fun onAnimatorStarting(\n      type: CameraAnimatorType,\n      animator: ValueAnimator,\n      owner: String?\n    ) {\n      starting = true\n    }\n\n    override fun onAnimatorInterrupting(\n      type: CameraAnimatorType,\n      runningAnimator: ValueAnimator,\n      runningAnimatorOwner: String?,\n      newAnimator: ValueAnimator,\n      newAnimatorOwner: String?\n    ) {\n      interrupting = true\n    }\n\n    override fun onAnimatorEnding(\n      type: CameraAnimatorType,\n      animator: ValueAnimator,\n      owner: String?\n    ) {\n      ending = true\n    }\n\n    override fun onAnimatorCancelling(\n      type: CameraAnimatorType,\n      animator: ValueAnimator,\n      owner: String?\n    ) {\n      cancelling = true\n    }\n  }\n\n  class CameraUpdateAnimatorListener : ValueAnimator.AnimatorUpdateListener {\n\n    var updateCount = 0L\n\n    override fun onAnimationUpdate(animation: ValueAnimator) {\n      updateCount += 1\n    }\n  }\n\n  class CameraAnimatorListener : Animator.AnimatorListener {\n\n    var started = false\n    var startedCount = 0\n    var ended = false\n    var endedCount = 0\n    var canceled = false\n    var canceledCount = 0\n\n    override fun onAnimationRepeat(animation: Animator) {}\n\n    override fun onAnimationEnd(animation: Animator) {\n      endedCount += 1\n      ended = true\n    }\n\n    override fun onAnimationCancel(animation: Animator) {\n      canceledCount += 1\n      canceled = true\n    }\n\n    override fun onAnimationStart(animation: Animator) {\n      startedCount += 1\n      started = true\n    }\n  }\n\n  private fun createBearingAnimator(\n    target: Double,\n    animatorDelay: Long,\n    animatorDuration: Long,\n    owner: String? = null\n  ) =\n    CameraBearingAnimator(\n      cameraAnimatorOptions(target) {\n        startValue(0.0)\n        owner?.let {\n          owner(it)\n        }\n      },\n      true\n    ) {\n      startDelay = animatorDelay\n      duration = animatorDuration\n    }\n\n  private fun createPitchAnimator(\n    target: Double,\n    animatorDelay: Long,\n    animatorDuration: Long,\n    owner: String? = null\n  ) =\n    CameraPitchAnimator(\n      cameraAnimatorOptions(target) {\n        startValue(0.0)\n        owner?.let {\n          owner(it)\n        }\n      }\n    ) {\n      startDelay = animatorDelay\n      duration = animatorDuration\n    }\n\n  companion object {\n    private const val DURATION = 3000L\n    const val VALUE = 10.0\n    val cameraState: CameraState = CameraState(\n      Point.fromLngLat(VALUE, VALUE),\n      EdgeInsets(VALUE, VALUE, VALUE, VALUE),\n      VALUE,\n      VALUE,\n      VALUE\n    )\n\n    internal fun CameraOptions.toCameraState(): CameraState {\n      return CameraState(\n        center ?: cameraState.center,\n        padding ?: cameraState.padding,\n        zoom ?: cameraState.zoom,\n        bearing ?: cameraState.bearing,\n        pitch ?: cameraState.pitch\n      )\n    }\n\n    private fun CameraAnimationsPluginImpl.onCameraMove(cameraState: CameraState) {\n      onCameraMove(\n        center = cameraState.center,\n        zoom = cameraState.zoom,\n        pitch = cameraState.pitch,\n        bearing = cameraState.bearing,\n        padding = cameraState.padding\n      )\n    }\n\n    const val EPS = 0.000001\n  }\n}\n\n@RunWith(ParameterizedRobolectricTestRunner::class)\nclass RegisterCameraCenterAnimatorUsingShortestPathTest(\n  private val shortestPathEnabled: Boolean,\n  private val testStartValue: Point?,\n  private val testTargets: Array<Point>,\n  private val expectedObjectValues: Array<Point>\n) {\n  private lateinit var mapCameraManagerDelegate: MapCameraManagerDelegate\n  private lateinit var cameraAnimationsPluginImpl: CameraAnimationsPluginImpl\n\n  @Before\n  fun setup() {\n    val delegateProvider = mockk<MapDelegateProvider>(relaxed = true)\n    mapCameraManagerDelegate = mockk(relaxed = true)\n    val mapTransformDelegate = mockk<MapTransformDelegate>(relaxed = true)\n    mockkObject(CameraTransform)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    every { logI(any(), any()) } just Runs\n    every { logE(any(), any()) } just Runs\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapTransformDelegate } returns mapTransformDelegate\n    cameraAnimationsPluginImpl = CameraAnimationsPluginImpl().apply {\n      onDelegateProvider(delegateProvider)\n    }\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkObject(CameraTransform)\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun testCenterAnimationWithShortestPath() {\n    val internalListenerSlot = slot<AnimatorListener>()\n    val argValues = mutableListOf<Any?>()\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      0.0,\n      0.0\n    )\n    val cameraCenterAnimator = mockk<CameraCenterAnimator> {\n      every { addInternalListener(capture(internalListenerSlot)) } just runs\n      every { canceled } returns false\n      every { skipped } returns true\n      every { targets } returns testTargets\n      every { startValue } returns testStartValue\n      every { useShortestPath } returns shortestPathEnabled\n      every { type } returns CameraAnimatorType.CENTER\n      every { setObjectValues(*varargAllNullable { argValues.add(it); true }) } just runs\n      every { isRunning } returns false\n      every { addInternalUpdateListener(any()) } just runs\n      every { updateObjectValues(any()) } answers {\n        argValues.addAll(expectedObjectValues)\n      }\n    }\n    cameraAnimationsPluginImpl.registerAnimators(cameraCenterAnimator)\n\n    internalListenerSlot.captured.onAnimationStart(cameraCenterAnimator)\n\n    assertEquals(/* expected = */ expectedObjectValues.size, /* actual = */ argValues.size)\n    expectedObjectValues.forEachIndexed { index, point ->\n      assertEquals(\n        /* expected = */ point.longitude(),\n        /* actual = */ (argValues[index] as Point).longitude(),\n        /* delta = */ EPS\n      )\n      assertEquals(\n        /* expected = */ point.latitude(),\n        /* actual = */ (argValues[index] as Point).latitude(),\n        /* delta = */ EPS\n      )\n    }\n  }\n\n  private companion object {\n    @JvmStatic\n    @ParameterizedRobolectricTestRunner.Parameters(name = \"shortest path enabled: {0}, startPoint: {1}, original targets: {2}, expected targets: {3}\")\n    fun data() = listOf(\n      arrayOf(\n        true,\n        (-170.0).toTestPoint(),\n        arrayOf(170.0.toTestPoint(), (-90.0).toTestPoint()),\n        arrayOf((-170.0).toTestPoint(), (-190.0).toTestPoint(), (-90.0).toTestPoint())\n      ),\n      arrayOf(\n        false,\n        (-170.0).toTestPoint(),\n        arrayOf(170.0.toTestPoint(), (-90.0).toTestPoint()),\n        arrayOf((-170.0).toTestPoint(), (170.0).toTestPoint(), (-90.0).toTestPoint())\n      ),\n      arrayOf(\n        true,\n        (-170.0).toTestPoint(),\n        arrayOf(170.0.toTestPoint()),\n        arrayOf(190.0.toTestPoint(), 170.0.toTestPoint())\n      ),\n      arrayOf(\n        true,\n        null,\n        arrayOf(170.0.toTestPoint()),\n        arrayOf(0.0.toTestPoint(), 170.0.toTestPoint())\n      ),\n      arrayOf(\n        true,\n        null,\n        arrayOf(170.0.toTestPoint(), (-90.0).toTestPoint()),\n        arrayOf(0.0.toTestPoint(), (-190.0).toTestPoint(), (-90.0).toTestPoint())\n      ),\n    )\n\n    private fun Double.toTestPoint(): Point {\n      return Point.fromLngLat(this, 0.0)\n    }\n\n    private const val EPS = 0.000001\n  }\n}"
  },
  {
    "path": "plugin-animation/src/test/java/com/mapbox/maps/plugin/animation/CameraAnimatorsFactoryTest.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.Animator\nimport android.view.animation.DecelerateInterpolator\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapOptions\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.Size\nimport com.mapbox.maps.plugin.animation.animator.CameraAnimator\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapProjectionDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.toCameraOptions\nimport io.mockk.every\nimport io.mockk.mockk\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.LooperMode\nimport org.robolectric.shadows.ShadowLog\nimport org.robolectric.shadows.ShadowLooper.shadowMainLooper\nimport java.time.Duration\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass CameraAnimatorsFactoryTest {\n\n  private lateinit var mapTransformDelegate: MapTransformDelegate\n  private lateinit var mapCameraManagerDelegate: MapCameraManagerDelegate\n  private lateinit var mapProjectionDelegate: MapProjectionDelegate\n  private lateinit var cameraAnimatorsFactory: CameraAnimatorsFactory\n  private val initialCenter = Point.fromLngLat(-0.11968, 51.50325)\n  private val initialCameraPosition = CameraState(\n    initialCenter,\n    EdgeInsets(0.0, 0.0, 0.0, 0.0),\n    0.0,\n    -0.0,\n    15.0\n  )\n  private val decelerateInterpolatorNew = DecelerateInterpolator()\n  private val delayNew = 20L\n  private val durationNew = 50L\n  private val customOwner = \"customOwner\"\n\n  private val emptyListener = object : Animator.AnimatorListener {\n    override fun onAnimationStart(animation: Animator) {\n    }\n\n    override fun onAnimationEnd(animation: Animator) {\n    }\n\n    override fun onAnimationCancel(animation: Animator) {\n    }\n\n    override fun onAnimationRepeat(animation: Animator) {\n    }\n  }\n\n  @Before\n  fun setUp() {\n    ShadowLog.stream = System.out\n    val delegateProvider = mockk<MapDelegateProvider>(relaxed = true)\n    mapCameraManagerDelegate = mockk(relaxed = true)\n    mapTransformDelegate = mockk(relaxed = true)\n    mapProjectionDelegate = mockk(relaxed = true)\n\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapTransformDelegate } returns mapTransformDelegate\n    every { delegateProvider.mapProjectionDelegate } returns mapProjectionDelegate\n    every { mapCameraManagerDelegate.cameraState } returns initialCameraPosition\n    cameraAnimatorsFactory = CameraAnimatorsFactory(delegateProvider)\n\n    CameraAnimatorsFactory.setDefaultAnimatorOptions {\n      this.interpolator = decelerateInterpolatorNew\n      this.startDelay = delayNew\n      this.duration = durationNew\n    }\n  }\n\n  @Test\n  fun testEaseToAnimators() {\n    val targetEaseToPosition = CameraOptions.Builder()\n      .center(Point.fromLngLat(-0.07520, 51.50550))\n      .zoom(17.0)\n      .bearing(-180.0)\n      .pitch(30.0)\n      .build()\n    val animators = cameraAnimatorsFactory.getEaseTo(targetEaseToPosition, owner = customOwner)\n    testAnimators(animators, targetEaseToPosition)\n  }\n\n  @Test\n  fun testMoveByAnimators() {\n    every { mapCameraManagerDelegate.cameraState } returns initialCameraPosition\n    val targetCenter = Point.fromLngLat(-0.12376717562057138, 51.50579407417868)\n    every { mapCameraManagerDelegate.coordinateForPixel(any()) } returns targetCenter\n    val offset = ScreenCoordinate(500.0, 500.0)\n    val target = CameraOptions.Builder().center(targetCenter).build()\n    val animators = cameraAnimatorsFactory.getMoveBy(offset, owner = customOwner)\n    testAnimators(animators, target)\n  }\n\n  @Test\n  fun testRotateByAnimators() {\n    every { mapCameraManagerDelegate.cameraState } returns initialCameraPosition\n    every { mapTransformDelegate.getMapOptions() } returns MapOptions.Builder()\n      .size(Size(1078.875f, 1698.375f)).build()\n    val target = CameraOptions.Builder().bearing(-25.981604850040434).build()\n    val animators = cameraAnimatorsFactory.getRotateBy(\n      ScreenCoordinate(0.0, 0.0),\n      ScreenCoordinate(500.0, 500.0),\n      owner = customOwner\n    )\n    testAnimators(animators, target)\n  }\n\n  @Test\n  fun testFlyToAnimatorsWithSinglePixelPadding() {\n    val size = Size(800.0f, 600.0f)\n\n    every { mapProjectionDelegate.unproject(any(), any()) } returns initialCenter\n    every { mapCameraManagerDelegate.cameraState } returns initialCameraPosition\n    every { mapTransformDelegate.getMapOptions() } returns MapOptions.Builder().size(size).build()\n    every { mapTransformDelegate.getSize() } returns size\n\n    val target = initialCameraPosition.toCameraOptions().toBuilder()\n      .bearing(90.0)\n      .padding(EdgeInsets(300.0, 400.0, 300.0, 400.0))\n      .build()\n    val animators = cameraAnimatorsFactory.getFlyTo(target, owner = customOwner)\n    testAnimators(animators, target)\n  }\n\n  @Test\n  fun testScaleByAnimators() {\n    every { mapCameraManagerDelegate.cameraState } returns initialCameraPosition\n    val scaleBy = 15.0\n    val zoomTarget = CameraTransform.calculateScaleBy(scaleBy, initialCameraPosition.zoom)\n    val target =\n      CameraOptions.Builder().zoom(zoomTarget).anchor(ScreenCoordinate(10.0, 10.0)).build()\n    val animators = cameraAnimatorsFactory.getScaleBy(scaleBy, target.anchor, owner = customOwner)\n    testAnimators(animators, target)\n  }\n\n  @Test\n  fun testPitchByAnimators() {\n    every { mapCameraManagerDelegate.cameraState } returns initialCameraPosition\n    val pitchBy = 20.0\n    val target = CameraOptions.Builder().pitch(initialCameraPosition.pitch + pitchBy).build()\n    val animators = cameraAnimatorsFactory.getPitchBy(pitchBy, owner = customOwner)\n    testAnimators(animators, target)\n  }\n\n  private fun testAnimators(\n    animators: Array<CameraAnimator<*>>,\n    targetCameraPosition: CameraOptions\n  ) {\n    animators.forEach {\n      Assert.assertEquals(it.interpolator, decelerateInterpolatorNew)\n      Assert.assertEquals(it.startDelay, delayNew)\n      Assert.assertEquals(it.duration, durationNew)\n      Assert.assertEquals(it.owner, customOwner)\n\n      val startValue = it.startValue\n      val targetValue = it.targets.first()\n\n      when (it.type) {\n        CameraAnimatorType.BEARING -> {\n          Assert.assertEquals(initialCameraPosition.bearing, startValue)\n          Assert.assertEquals(targetCameraPosition.bearing!!, targetValue)\n        }\n\n        CameraAnimatorType.CENTER -> {\n          Assert.assertEquals(initialCameraPosition.center, startValue)\n          Assert.assertEquals(targetCameraPosition.center, targetValue)\n        }\n\n        CameraAnimatorType.PITCH -> {\n          Assert.assertEquals(initialCameraPosition.pitch, startValue)\n          Assert.assertEquals(targetCameraPosition.pitch, targetValue)\n        }\n\n        CameraAnimatorType.ZOOM -> {\n          Assert.assertEquals(initialCameraPosition.zoom, startValue)\n          Assert.assertEquals(targetCameraPosition.zoom, targetValue)\n        }\n\n        CameraAnimatorType.ANCHOR -> {\n          Assert.assertEquals(targetCameraPosition.anchor, targetValue)\n        }\n\n        CameraAnimatorType.PADDING -> {\n          Assert.assertEquals(initialCameraPosition.padding, startValue)\n          Assert.assertEquals(targetCameraPosition.padding, targetValue)\n        }\n      }\n    }\n\n    animators.forEach {\n      it.addInternalListener(emptyListener)\n      it.start()\n    }\n\n    shadowMainLooper().idleFor(Duration.ofMillis(delayNew + durationNew))\n\n    animators.forEach {\n      val startValue = it.startValue\n      val targetValue = it.animatedValue\n\n      when (it.type) {\n        CameraAnimatorType.BEARING -> {\n          Assert.assertEquals(initialCameraPosition.bearing, startValue)\n          Assert.assertEquals(targetCameraPosition.bearing!!, targetValue)\n        }\n\n        CameraAnimatorType.PITCH -> {\n          Assert.assertEquals(initialCameraPosition.pitch, startValue)\n          Assert.assertEquals(targetCameraPosition.pitch, targetValue)\n        }\n\n        CameraAnimatorType.ZOOM -> {\n          Assert.assertEquals(initialCameraPosition.zoom, startValue)\n          Assert.assertEquals(targetCameraPosition.zoom, targetValue)\n        }\n\n        CameraAnimatorType.ANCHOR -> {\n          Assert.assertEquals(targetCameraPosition.anchor, targetValue)\n        }\n\n        CameraAnimatorType.PADDING -> {\n          Assert.assertEquals(initialCameraPosition.padding, startValue)\n          Assert.assertEquals(targetCameraPosition.padding, targetValue)\n        }\n\n        CameraAnimatorType.CENTER -> {\n          Assert.assertEquals(initialCameraPosition.center, startValue)\n          Assert.assertEquals(targetCameraPosition.center, targetValue)\n        }\n      }\n    }\n  }\n}\n\n@RunWith(Parameterized::class)\nclass WrapCoordinateTest(\n  private val actual: Triple<Double, Double, Double>,\n  private val expected: Double\n) {\n\n  private companion object {\n    @JvmStatic\n    @Parameterized.Parameters\n    fun data() = listOf(\n      arrayOf(Triple(-0.911, -LONGITUDE_MAX, LONGITUDE_MAX), -0.911),\n      arrayOf(Triple(LONGITUDE_MAX, -LONGITUDE_MAX, LONGITUDE_MAX), -LONGITUDE_MAX),\n      arrayOf(Triple(-LONGITUDE_MAX, -LONGITUDE_MAX, LONGITUDE_MAX), -LONGITUDE_MAX),\n      arrayOf(Triple(275.0, -LONGITUDE_MAX, LONGITUDE_MAX), -85.0),\n      arrayOf(Triple(-458.0, -LONGITUDE_MAX, LONGITUDE_MAX), -98.0),\n      arrayOf(Triple(385.0, -LONGITUDE_MAX, LONGITUDE_MAX), 25.0),\n      arrayOf(Triple(0.0, LONGITUDE_MAX, LONGITUDE_MAX), Double.NaN),\n    )\n\n    private const val DELTA = 0.0001\n    private const val LONGITUDE_MAX = 180.0\n  }\n\n  @Test\n  fun testLongitudeWrap() {\n    Assert.assertEquals(\n      expected,\n      CameraTransform.wrap(actual.first, actual.second, actual.third),\n      DELTA\n    )\n  }\n}\n\n@RunWith(Parameterized::class)\nclass UnwrapForShortestPathTest(\n  private val actual: Pair<Double, Double>,\n  private val expected: Double\n) {\n\n  @Test\n  fun testUnwrapForShortestPath() {\n    val modifiedStart = CameraTransform.unwrapForShortestPath(\n      start = Point.fromLngLat(actual.first, LATITUDE),\n      end = Point.fromLngLat(actual.second, LATITUDE)\n    )\n    Assert.assertEquals(\n      expected,\n      modifiedStart.longitude(),\n      DELTA\n    )\n    Assert.assertEquals(\n      LATITUDE,\n      modifiedStart.latitude(),\n      DELTA\n    )\n  }\n\n  private companion object {\n    @JvmStatic\n    @Parameterized.Parameters(name = \"input start/end longitude {0} should be unwrapped to start longitude {1}\")\n    fun data() = listOf(\n      arrayOf(Pair(-170.0, -LONGITUDE_MAX), -170),\n      arrayOf(Pair(-170.0, LONGITUDE_MAX), 190),\n      arrayOf(Pair(-170.0, 170.0), 190.0),\n      arrayOf(Pair(LONGITUDE_MAX, -LONGITUDE_MAX), LONGITUDE_MAX),\n      arrayOf(Pair(275.0, -10.0), -85.0),\n    )\n\n    private const val DELTA = 0.0001\n    private const val LONGITUDE_MAX = 180.0\n    private const val LATITUDE = 40.0\n  }\n}"
  },
  {
    "path": "plugin-animation/src/test/java/com/mapbox/maps/plugin/animation/animator/CameraAnimatorTest.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport android.animation.Animator\nimport androidx.core.view.animation.PathInterpolatorCompat\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport io.mockk.every\nimport io.mockk.mockk\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass CameraAnimatorTest {\n\n  private val linearInterpolator = PathInterpolatorCompat.create(0f, 0f, 1f, 1f)\n\n  @Test\n  fun `CameraCenterAnimator getAnimatedValueAt with startValue interpolates correctly`() {\n    val options = CameraAnimatorOptions.Builder<Point>(\n      targets = arrayOf(Point.fromLngLat(10.0, 10.0)),\n    )\n      .startValue(Point.fromLngLat(0.0, 0.0))\n      .build()\n    val animator = CameraCenterAnimator(options = options, useShortestPath = true)\n    animator.interpolator = linearInterpolator\n\n    val result = animator.getAnimatedValueAt(0.5f)\n\n    assertEquals(Point.fromLngLat(5.0, 5.0), result)\n  }\n\n  @Test\n  fun `CameraZoomAnimator getAnimatedValueAt with startValue interpolates correctly`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(10.0),\n    )\n      .startValue(1.0)\n      .build()\n    val animator = CameraZoomAnimator(options)\n    animator.interpolator = linearInterpolator\n\n    val result = animator.getAnimatedValueAt(0.25f)\n\n    assertEquals(3.25, result, 0.001)\n  }\n\n  @Test\n  fun `CameraBearingAnimator getAnimatedValueAt with startValue interpolates correctly`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(90.0),\n    )\n      .startValue(0.0)\n      .build()\n    val animator = CameraBearingAnimator(options = options, useShortestPath = true)\n    animator.interpolator = linearInterpolator\n\n    val result = animator.getAnimatedValueAt(0.75f)\n\n    assertEquals(67.5, result, 0.001)\n  }\n\n  @Test\n  fun `CameraPitchAnimator getAnimatedValueAt with startValue interpolates correctly`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(60.0),\n    )\n      .startValue(0.0)\n      .build()\n    val animator = CameraPitchAnimator(options)\n    animator.interpolator = linearInterpolator\n\n    val result = animator.getAnimatedValueAt(1.0f)\n\n    assertEquals(60.0, result, 0.001)\n  }\n\n  @Test\n  fun `CameraAnchorAnimator getAnimatedValueAt with startValue interpolates correctly`() {\n    val options = CameraAnimatorOptions.Builder<ScreenCoordinate>(\n      targets = arrayOf(ScreenCoordinate(100.0, 100.0)),\n    )\n      .startValue(ScreenCoordinate(0.0, 0.0))\n      .build()\n    val animator = CameraAnchorAnimator(options)\n    animator.interpolator = linearInterpolator\n\n    val result = animator.getAnimatedValueAt(0.3f)\n\n    assertEquals(30.0, result.x, 0.0001)\n    assertEquals(30.0, result.y, 0.0001)\n  }\n\n  @Test\n  fun `CameraPaddingAnimator getAnimatedValueAt with startValue interpolates correctly`() {\n    val options = CameraAnimatorOptions.Builder<EdgeInsets>(\n      targets = arrayOf(EdgeInsets(10.0, 20.0, 30.0, 40.0)),\n    )\n      .startValue(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n      .build()\n    val animator = CameraPaddingAnimator(options)\n    animator.interpolator = linearInterpolator\n\n    val result = animator.getAnimatedValueAt(0.5f)\n\n    assertEquals(EdgeInsets(5.0, 10.0, 15.0, 20.0), result)\n  }\n\n  @Test\n  fun `CameraCenterAnimator getAnimatedValueAt with startCameraState uses camera state value`() {\n    val options = CameraAnimatorOptions.Builder<Point>(\n      targets = arrayOf(Point.fromLngLat(10.0, 10.0)),\n    )\n      .build()\n    val animator = CameraCenterAnimator(options = options, useShortestPath = true)\n    animator.interpolator = linearInterpolator\n\n    val cameraState = mockk<CameraState> {\n      every { center } returns Point.fromLngLat(2.0, 2.0)\n    }\n\n    val result = animator.getAnimatedValueAt(0.5f, cameraState)\n\n    assertEquals(Point.fromLngLat(6.0, 6.0), result)\n  }\n\n  @Test\n  fun `CameraZoomAnimator getAnimatedValueAt with startCameraState uses camera state value`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(15.0),\n    )\n      .build()\n    val animator = CameraZoomAnimator(options)\n    animator.interpolator = linearInterpolator\n\n    val cameraState = mockk<CameraState> {\n      every { zoom } returns 5.0\n    }\n\n    val result = animator.getAnimatedValueAt(0.25f, cameraState)\n\n    assertEquals(7.5, result, 0.001)\n  }\n\n  @Test\n  fun `CameraBearingAnimator getAnimatedValueAt with startCameraState uses camera state value`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(180.0),\n    )\n      .build()\n    val animator = CameraBearingAnimator(options = options, useShortestPath = true)\n    animator.interpolator = linearInterpolator\n\n    val cameraState = mockk<CameraState> {\n      every { bearing } returns 0.0\n    }\n\n    val result = animator.getAnimatedValueAt(0.75f, cameraState)\n\n    assertEquals(135.0, result, 0.001)\n  }\n\n  @Test\n  fun `CameraPitchAnimator getAnimatedValueAt with startCameraState uses camera state value`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(45.0),\n    )\n      .build()\n    val animator = CameraPitchAnimator(options)\n    animator.interpolator = linearInterpolator\n\n    val cameraState = mockk<CameraState> {\n      every { pitch } returns 15.0\n    }\n\n    val result = animator.getAnimatedValueAt(0.5f, cameraState)\n\n    assertEquals(30.0, result, 0.001)\n  }\n\n  @Test\n  fun `CameraAnchorAnimator getAnimatedValueAt with startCameraState uses default anchor`() {\n    val options = CameraAnimatorOptions.Builder<ScreenCoordinate>(\n      targets = arrayOf(ScreenCoordinate(200.0, 200.0)),\n    )\n      .build()\n    val animator = CameraAnchorAnimator(options)\n    animator.interpolator = linearInterpolator\n\n    val cameraState = mockk<CameraState>()\n\n    val result = animator.getAnimatedValueAt(0.5f, cameraState)\n\n    // Anchor defaults to ScreenCoordinate(0.0, 0.0) from camera state\n    assertEquals(ScreenCoordinate(100.0, 100.0), result)\n  }\n\n  @Test\n  fun `CameraPaddingAnimator getAnimatedValueAt with startCameraState uses camera state value`() {\n    val options = CameraAnimatorOptions.Builder<EdgeInsets>(\n      targets = arrayOf(EdgeInsets(20.0, 30.0, 40.0, 50.0)),\n    )\n      .build()\n    val animator = CameraPaddingAnimator(options)\n    animator.interpolator = linearInterpolator\n\n    val cameraState = mockk<CameraState> {\n      every { padding } returns EdgeInsets(0.0, 10.0, 20.0, 30.0)\n    }\n\n    val result = animator.getAnimatedValueAt(0.25f, cameraState)\n\n    assertEquals(EdgeInsets(5.0, 15.0, 25.0, 35.0), result)\n  }\n\n  @Test\n  fun `CameraCenterAnimator getAnimatedValueAt prefers startValue over startCameraState`() {\n    val options = CameraAnimatorOptions.Builder<Point>(\n      targets = arrayOf(Point.fromLngLat(9.0, 9.0)),\n    )\n      .startValue(Point.fromLngLat(1.0, 1.0)) // Should use this\n      .build()\n    val animator = CameraCenterAnimator(options = options, useShortestPath = true)\n    animator.interpolator = linearInterpolator\n\n    val cameraState = mockk<CameraState> {\n      every { center } returns Point.fromLngLat(100.0, 100.0) // Should be ignored\n    }\n\n    val result = animator.getAnimatedValueAt(0.5f, cameraState)\n\n    assertEquals(Point.fromLngLat(5.0, 5.0), result) // (1+9)/2 = 5\n  }\n\n  @Test(expected = UnsupportedOperationException::class)\n  fun `CameraCenterAnimator getAnimatedValueAt throws exception when multiple targets`() {\n    val options = CameraAnimatorOptions.Builder<Point>(\n      targets = arrayOf(Point.fromLngLat(5.0, 5.0), Point.fromLngLat(10.0, 10.0)),\n    )\n      .startValue(Point.fromLngLat(0.0, 0.0))\n      .build()\n    val animator = CameraCenterAnimator(options = options, useShortestPath = true)\n    animator.interpolator = linearInterpolator\n\n    animator.getAnimatedValueAt(0.5f)\n  }\n\n  @Test(expected = UnsupportedOperationException::class)\n  fun `CameraCenterAnimator getAnimatedValueAt throws exception when no startValue and null startCameraState`() {\n    val options = CameraAnimatorOptions.Builder<Point>(\n      targets = arrayOf(Point.fromLngLat(10.0, 10.0)),\n    )\n      .build()\n    val animator = CameraCenterAnimator(options = options, useShortestPath = true)\n    animator.interpolator = linearInterpolator\n\n    animator.getAnimatedValueAt(0.5f, null)\n  }\n\n  @Test\n  fun `CameraCenterAnimator getAnimatedValueAt at fraction 0 returns start value`() {\n    val options = CameraAnimatorOptions.Builder<Point>(\n      targets = arrayOf(Point.fromLngLat(10.0, 15.0)),\n    )\n      .startValue(Point.fromLngLat(2.0, 3.0))\n      .build()\n    val animator = CameraCenterAnimator(options = options, useShortestPath = true)\n    animator.interpolator = linearInterpolator\n\n    val result = animator.getAnimatedValueAt(0.0f)\n\n    assertEquals(Point.fromLngLat(2.0, 3.0), result)\n  }\n\n  @Test\n  fun `CameraCenterAnimator getAnimatedValueAt at fraction 1 returns target value`() {\n    val options = CameraAnimatorOptions.Builder<Point>(\n      targets = arrayOf(Point.fromLngLat(10.0, 15.0)),\n    )\n      .startValue(Point.fromLngLat(2.0, 3.0))\n      .build()\n    val animator = CameraCenterAnimator(options = options, useShortestPath = true)\n    animator.interpolator = linearInterpolator\n\n    val result = animator.getAnimatedValueAt(1.0f)\n\n    assertEquals(Point.fromLngLat(10.0, 15.0), result)\n  }\n\n  @Test\n  fun `end sets endedNormally flag to true`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(10.0),\n    )\n      .startValue(1.0)\n      .build()\n    val animator = CameraZoomAnimator(options)\n\n    // Register internal listener to allow animation to run\n    val mockListener = mockk<Animator.AnimatorListener>(relaxed = true)\n    animator.addInternalListener(mockListener)\n\n    // Initially endedNormally should be false\n    assertEquals(false, animator.endedManually)\n\n    // Call end\n    animator.end()\n\n    // After end is called, endedNormally should be true\n    assertEquals(true, animator.endedManually)\n    assertEquals(false, animator.canceled)\n  }\n\n  @Test\n  fun `cancel sets canceled flag to true`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(10.0),\n    )\n      .startValue(1.0)\n      .build()\n    val animator = CameraZoomAnimator(options)\n\n    // Register internal listener\n    val mockListener = mockk<Animator.AnimatorListener>(relaxed = true)\n    animator.addInternalListener(mockListener)\n\n    // Initially canceled should be false\n    assertEquals(false, animator.canceled)\n\n    // Call cancel\n    animator.cancel()\n\n    // After cancel is called, canceled should be true\n    assertEquals(true, animator.canceled)\n    assertEquals(false, animator.endedManually)\n  }\n\n  @Test\n  fun `cancel does not set endedNormally flag`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(10.0),\n    )\n      .startValue(1.0)\n      .build()\n    val animator = CameraZoomAnimator(options)\n\n    // Register internal listener\n    val mockListener = mockk<Animator.AnimatorListener>(relaxed = true)\n    animator.addInternalListener(mockListener)\n\n    // Call cancel\n    animator.cancel()\n\n    // endedNormally should remain false when cancel() is called\n    assertEquals(false, animator.endedManually)\n    assertEquals(true, animator.canceled)\n  }\n\n  @Test\n  fun `start resets endedNormally and canceled flags`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(10.0),\n    )\n      .startValue(1.0)\n      .build()\n    val animator = CameraZoomAnimator(options)\n\n    // Register internal listener to allow animation\n    val mockListener = mockk<Animator.AnimatorListener>(relaxed = true)\n    animator.addInternalListener(mockListener)\n\n    // Set flags by ending and canceling\n    animator.end()\n    assertEquals(true, animator.endedManually)\n\n    animator.cancel()\n    assertEquals(true, animator.canceled)\n\n    // Start again - should reset flags\n    animator.start()\n\n    // Both flags should be reset to false\n    assertEquals(false, animator.endedManually)\n    assertEquals(false, animator.canceled)\n  }\n\n  @Test\n  fun `end then cancel maintains canceled state`() {\n    val options = CameraAnimatorOptions.Builder<Double>(\n      targets = arrayOf(10.0),\n    )\n      .startValue(1.0)\n      .build()\n    val animator = CameraZoomAnimator(options)\n\n    // Register internal listener\n    val mockListener = mockk<Animator.AnimatorListener>(relaxed = true)\n    animator.addInternalListener(mockListener)\n\n    // Start, then end\n    animator.start()\n    animator.end()\n    assertEquals(true, animator.endedManually)\n    assertEquals(false, animator.canceled)\n\n    // Then cancel\n    animator.cancel()\n    assertEquals(true, animator.canceled)\n    // endedNormally remains true from previous end()\n    assertEquals(true, animator.endedManually)\n  }\n}"
  },
  {
    "path": "plugin-animation/src/test/java/com/mapbox/maps/plugin/animation/animator/EvaluatorsTest.kt",
    "content": "package com.mapbox.maps.plugin.animation.animator\n\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.animation.animator.Evaluators.EDGE_INSET\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockkStatic\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass EvaluatorsTest {\n  private val zeroEdgeInsets = EdgeInsets(0.0, 0.0, 0.0, 0.0)\n\n  @Before\n  fun setup() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n  }\n\n  @Test\n  fun edgeInsetEvaluatorFromZero() {\n    with(EDGE_INSET.evaluate(0F, zeroEdgeInsets, zeroEdgeInsets)) {\n      assertEquals(zeroEdgeInsets, this)\n    }\n\n    val endEdgeInsets = EdgeInsets(200.0, 300.0, 400.0, 500.0)\n    with(EDGE_INSET.evaluate(0F, zeroEdgeInsets, endEdgeInsets)) {\n      assertEquals(zeroEdgeInsets, this)\n    }\n\n    with(EDGE_INSET.evaluate(0.5F, zeroEdgeInsets, endEdgeInsets)) {\n      assertEquals(\n        EdgeInsets(\n          endEdgeInsets.top / 2F,\n          endEdgeInsets.left / 2F,\n          endEdgeInsets.bottom / 2F,\n          endEdgeInsets.right / 2F\n        ),\n        this\n      )\n    }\n\n    with(EDGE_INSET.evaluate(1F, zeroEdgeInsets, endEdgeInsets)) {\n      assertEquals(endEdgeInsets, this)\n    }\n  }\n\n  @Test\n  fun edgeInsetEvaluatorBasic() {\n    val startEdgeInsets = EdgeInsets(10.0, 20.0, 30.0, 40.0)\n    with(EDGE_INSET.evaluate(0F, startEdgeInsets, zeroEdgeInsets)) {\n      assertEquals(startEdgeInsets, this)\n    }\n\n    val endEdgeInsets = EdgeInsets(200.0, 300.0, 400.0, 500.0)\n    with(EDGE_INSET.evaluate(0F, startEdgeInsets, endEdgeInsets)) {\n      assertEquals(startEdgeInsets, this)\n    }\n\n    with(EDGE_INSET.evaluate(0.5F, startEdgeInsets, endEdgeInsets)) {\n      assertEquals(EdgeInsets(105.0, 160.0, 215.0, 270.0), this)\n    }\n\n    with(EDGE_INSET.evaluate(1F, startEdgeInsets, endEdgeInsets)) {\n      assertEquals(endEdgeInsets, this)\n    }\n  }\n\n  @Test\n  fun nullEdgeInsetEvaluator() {\n    with(EDGE_INSET.evaluate(0F, null, null)) {\n      assertEquals(zeroEdgeInsets, this)\n    }\n\n    with(EDGE_INSET.evaluate(0.5F, null, null)) {\n      assertEquals(zeroEdgeInsets, this)\n    }\n\n    with(EDGE_INSET.evaluate(1.0F, null, null)) {\n      assertEquals(zeroEdgeInsets, this)\n    }\n  }\n\n  @Test\n  fun startNullEdgeInsetEvaluator() {\n    val endEdgeInsets = EdgeInsets(200.0, 300.0, 400.0, 500.0)\n    with(EDGE_INSET.evaluate(0F, null, endEdgeInsets)) {\n      assertEquals(zeroEdgeInsets, this)\n    }\n\n    with(EDGE_INSET.evaluate(0.5F, null, endEdgeInsets)) {\n      assertEquals(\n        EdgeInsets(\n          endEdgeInsets.top / 2F,\n          endEdgeInsets.left / 2F,\n          endEdgeInsets.bottom / 2F,\n          endEdgeInsets.right / 2F\n        ),\n        this\n      )\n    }\n\n    with(EDGE_INSET.evaluate(1F, null, endEdgeInsets)) {\n      assertEquals(endEdgeInsets, this)\n    }\n  }\n\n  @Test\n  fun endNullEdgeInsetEvaluator() {\n    val startEdgeInsets = EdgeInsets(200.0, 300.0, 400.0, 500.0)\n    with(EDGE_INSET.evaluate(0F, startEdgeInsets, null)) {\n      assertEquals(startEdgeInsets, this)\n    }\n\n    with(EDGE_INSET.evaluate(0.5F, startEdgeInsets, null)) {\n      assertEquals(\n        EdgeInsets(\n          startEdgeInsets.top / 2F,\n          startEdgeInsets.left / 2F,\n          startEdgeInsets.bottom / 2F,\n          startEdgeInsets.right / 2F\n        ),\n        this\n      )\n    }\n\n    with(EDGE_INSET.evaluate(1F, startEdgeInsets, null)) {\n      assertEquals(zeroEdgeInsets, this)\n    }\n  }\n}"
  },
  {
    "path": "plugin-animation/src/test/resources/robolectric.properties",
    "content": "sdk=28"
  },
  {
    "path": "plugin-annotation/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "plugin-annotation/README.md",
    "content": "## Mapbox Maps Annotation Plugin for Android\n\n### Overview\n\nThe Mapbox Maps Annotation Plugin for Android is an public library for displaying Annotations(including Line/Circle/Symbol/Fill) on top of MapView.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Annotation Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the Annotation plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-annotation:11.22.0-rc.1'\n}\n```\n\n### Example\n\nCustomizing Mapbox Maps Annotation Plugin for Android could be done in two ways: by either providing your own version of the Annotation plugin or by setting the AnnotationOptions to the Annotation Managers. The former is documented in [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md), the latter can be achieved with:\n\n```kotlin\nval annotationPlugin = mapView.annotations\n// Take Circle for example here\nval circleManager = annotationPlugin.getCircleManager()\nval circleOptions: CircleOptions = CircleOptions()\n  .withPoint(Point.fromLngLat(0.381457, 6.687337))\n  .withCircleColor(ColorUtils.colorToRgbaString(Color.YELLOW))\n  .withCircleRadius(12.0)\n  .withDraggable(true)\ncircleManager.create(circleOptions)\n```\n\nMore concrete examples of the Annotation plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-annotation/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.annotation {\n\n  @MainThread public abstract class AnnotationManagerImpl<G extends com.mapbox.geojson.Geometry, T extends com.mapbox.maps.plugin.annotation.Annotation<G>, S extends com.mapbox.maps.plugin.annotation.AnnotationOptions<G, T>, D extends com.mapbox.maps.plugin.annotation.OnAnnotationDragListener<? extends T>, U extends com.mapbox.maps.plugin.annotation.OnAnnotationClickListener<T>, V extends com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener<T>, I extends com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener<T>, L extends com.mapbox.maps.extension.style.layers.Layer> implements com.mapbox.maps.plugin.annotation.AnnotationManager<G,T,S,D,U,V,I> {\n    method public T create(S option);\n    method public java.util.List<T> create(java.util.List<? extends S> options);\n    method public void delete(T annotation);\n    method public void delete(java.util.List<? extends T> annotations);\n    method public void deleteAll();\n    method public void enableDataDrivenProperty(String property);\n    method public abstract String getAnnotationIdKey();\n    method public java.util.List<T> getAnnotations();\n    method public final java.util.List<java.lang.String> getAssociatedLayers();\n    method public java.util.List<U> getClickListeners();\n    method protected final java.util.Map<java.lang.String,java.lang.Boolean> getDataDrivenPropertyUsageMap();\n    method public final com.mapbox.maps.plugin.delegates.MapDelegateProvider getDelegateProvider();\n    method public java.util.List<D> getDragListeners();\n    method public java.util.List<I> getInteractionListener();\n    method public abstract com.mapbox.maps.extension.style.expressions.generated.Expression? getLayerFilter();\n    method public java.util.List<V> getLongClickListeners();\n    method public void onDestroy();\n    method public void onSizeChanged(int width, int height);\n    method public final T? queryMapForFeatures(com.mapbox.geojson.Point point);\n    method public final T? queryMapForFeatures(com.mapbox.maps.ScreenCoordinate screenCoordinate);\n    method public void selectAnnotation(T annotation);\n    method protected abstract void setDataDrivenPropertyIsUsed(String property);\n    method public abstract void setLayerFilter(com.mapbox.maps.extension.style.expressions.generated.Expression?);\n    method protected final void setLayerProperty(com.mapbox.bindgen.Value value, String propertyName);\n    method public void update(T annotation);\n    method public void update(java.util.List<? extends T> annotations);\n    property public java.util.List<T> annotations;\n    property public final java.util.List<java.lang.String> associatedLayers;\n    property public java.util.List<U> clickListeners;\n    property protected final java.util.Map<java.lang.String,java.lang.Boolean> dataDrivenPropertyUsageMap;\n    property public final com.mapbox.maps.plugin.delegates.MapDelegateProvider delegateProvider;\n    property public java.util.List<D> dragListeners;\n    property public java.util.List<I> interactionListener;\n    property public abstract com.mapbox.maps.extension.style.expressions.generated.Expression? layerFilter;\n    property public java.util.List<V> longClickListeners;\n  }\n\n  @Deprecated public final class AnnotationManagerImpl.MapClick implements com.mapbox.maps.plugin.gestures.OnMapClickListener {\n    ctor @Deprecated public AnnotationManagerImpl.MapClick();\n    method @Deprecated public boolean onMapClick(com.mapbox.geojson.Point point);\n  }\n\n  @Deprecated public final class AnnotationManagerImpl.MapLongClick implements com.mapbox.maps.plugin.gestures.OnMapLongClickListener {\n    ctor @Deprecated public AnnotationManagerImpl.MapLongClick();\n    method @Deprecated public boolean onMapLongClick(com.mapbox.geojson.Point point);\n  }\n\n  @Deprecated public final class AnnotationManagerImpl.MapMove implements com.mapbox.maps.plugin.gestures.OnMoveListener {\n    ctor @Deprecated public AnnotationManagerImpl.MapMove();\n    method @Deprecated public boolean onMove(com.mapbox.android.gestures.MoveGestureDetector detector);\n    method @Deprecated public void onMoveBegin(com.mapbox.android.gestures.MoveGestureDetector detector);\n    method @Deprecated public void onMoveEnd(com.mapbox.android.gestures.MoveGestureDetector detector);\n  }\n\n  public final class AnnotationsUtils {\n    method public static com.mapbox.maps.plugin.annotation.AnnotationPlugin getAnnotations(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n  public final class ConvertUtils {\n    method public com.mapbox.maps.MercatorCoordinate calculateMercatorCoordinateShift(com.mapbox.geojson.Point startPoint, com.mapbox.geojson.Point endPoint, double zoomLevel);\n    method public com.google.gson.JsonArray convertDoubleArray(java.util.List<?>? value);\n    method public com.google.gson.JsonArray convertStringArray(java.util.List<?>? value);\n    method public com.mapbox.geojson.Point shiftPointWithMercatorCoordinate(com.mapbox.geojson.Point point, com.mapbox.maps.MercatorCoordinate shiftMercatorCoordinate, double zoomLevel);\n    method public java.util.List<java.lang.Double> toDoubleArray(com.google.gson.JsonArray? jsonArray);\n    method public java.util.List<java.lang.String> toStringArray(com.google.gson.JsonArray? jsonArray);\n    field public static final com.mapbox.maps.plugin.annotation.ConvertUtils INSTANCE;\n  }\n\n  public fun interface QueryAnnotationCallback<T> {\n    method public void onQueryAnnotation(T? annotations);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.annotation.generated {\n\n  public final class CircleAnnotation extends com.mapbox.maps.plugin.annotation.Annotation<com.mapbox.geojson.Point> {\n    ctor public CircleAnnotation(String id, com.mapbox.maps.plugin.annotation.AnnotationManager<com.mapbox.geojson.Point,com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,?,?,?,?,?> annotationManager, com.google.gson.JsonObject jsonObject, com.mapbox.geojson.Point geometry);\n    method public Double? getCircleBlur();\n    method @ColorInt public Integer? getCircleColorInt();\n    method public String? getCircleColorString();\n    method public String? getCircleColorUseTheme();\n    method public Double? getCircleOpacity();\n    method public Double? getCircleRadius();\n    method public Double? getCircleSortKey();\n    method @ColorInt public Integer? getCircleStrokeColorInt();\n    method public String? getCircleStrokeColorString();\n    method public String? getCircleStrokeColorUseTheme();\n    method public Double? getCircleStrokeOpacity();\n    method public Double? getCircleStrokeWidth();\n    method public com.mapbox.geojson.Point? getOffsetGeometry(com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate mapCameraManagerDelegate, com.mapbox.android.gestures.MoveDistancesObject moveDistancesObject);\n    method public com.mapbox.geojson.Point getPoint();\n    method public com.mapbox.maps.plugin.annotation.AnnotationType getType();\n    method public void setCircleBlur(Double?);\n    method public void setCircleColorInt(@ColorInt Integer?);\n    method public void setCircleColorString(String?);\n    method public void setCircleColorUseTheme(String?);\n    method public void setCircleOpacity(Double?);\n    method public void setCircleRadius(Double?);\n    method public void setCircleSortKey(Double?);\n    method public void setCircleStrokeColorInt(@ColorInt Integer?);\n    method public void setCircleStrokeColorString(String?);\n    method public void setCircleStrokeColorUseTheme(String?);\n    method public void setCircleStrokeOpacity(Double?);\n    method public void setCircleStrokeWidth(Double?);\n    method public void setPoint(com.mapbox.geojson.Point);\n    method public void setUsedDataDrivenProperties();\n    property public final Double? circleBlur;\n    property @ColorInt public final Integer? circleColorInt;\n    property public final String? circleColorString;\n    property public final String? circleColorUseTheme;\n    property public final Double? circleOpacity;\n    property public final Double? circleRadius;\n    property public final Double? circleSortKey;\n    property @ColorInt public final Integer? circleStrokeColorInt;\n    property public final String? circleStrokeColorString;\n    property public final String? circleStrokeColorUseTheme;\n    property public final Double? circleStrokeOpacity;\n    property public final Double? circleStrokeWidth;\n    property public final com.mapbox.geojson.Point point;\n    field public static final com.mapbox.maps.plugin.annotation.generated.CircleAnnotation.Companion Companion;\n    field public static final String ID_KEY = \"CircleAnnotation\";\n  }\n\n  public static final class CircleAnnotation.Companion {\n  }\n\n  public final class CircleAnnotationManager extends com.mapbox.maps.plugin.annotation.AnnotationManagerImpl<com.mapbox.geojson.Point,com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions,com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationDragListener,com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationClickListener,com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationLongClickListener,com.mapbox.maps.plugin.annotation.generated.OnCircleAnnotationInteractionListener,com.mapbox.maps.extension.style.layers.generated.CircleLayer> implements com.mapbox.maps.plugin.annotation.ClusterAnnotationManager {\n    ctor public CircleAnnotationManager(com.mapbox.maps.plugin.delegates.MapDelegateProvider delegateProvider, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null);\n    method public java.util.List<com.mapbox.maps.plugin.annotation.generated.CircleAnnotation> create(String json);\n    method public java.util.List<com.mapbox.maps.plugin.annotation.generated.CircleAnnotation> create(com.mapbox.geojson.FeatureCollection featureCollection);\n    method public String getAnnotationIdKey();\n    method public Double? getCircleBlur();\n    method @ColorInt public Integer? getCircleColorInt();\n    method public String? getCircleColorString();\n    method public String? getCircleColorUseTheme();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference? getCircleElevationReference();\n    method public Double? getCircleEmissiveStrength();\n    method public Double? getCircleOpacity();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment? getCirclePitchAlignment();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale? getCirclePitchScale();\n    method public Double? getCircleRadius();\n    method public Double? getCircleSortKey();\n    method @ColorInt public Integer? getCircleStrokeColorInt();\n    method public String? getCircleStrokeColorString();\n    method public String? getCircleStrokeColorUseTheme();\n    method public Double? getCircleStrokeOpacity();\n    method public Double? getCircleStrokeWidth();\n    method public java.util.List<java.lang.Double>? getCircleTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor? getCircleTranslateAnchor();\n    method public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterClickListener> getClusterClickListeners();\n    method public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterLongClickListener> getClusterLongClickListeners();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLayerFilter();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method public void setCircleBlur(Double?);\n    method public void setCircleColorInt(@ColorInt Integer?);\n    method public void setCircleColorString(String?);\n    method public void setCircleColorUseTheme(String?);\n    method public void setCircleElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference?);\n    method public void setCircleEmissiveStrength(Double?);\n    method public void setCircleOpacity(Double?);\n    method public void setCirclePitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment?);\n    method public void setCirclePitchScale(com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale?);\n    method public void setCircleRadius(Double?);\n    method public void setCircleSortKey(Double?);\n    method public void setCircleStrokeColorInt(@ColorInt Integer?);\n    method public void setCircleStrokeColorString(String?);\n    method public void setCircleStrokeColorUseTheme(String?);\n    method public void setCircleStrokeOpacity(Double?);\n    method public void setCircleStrokeWidth(Double?);\n    method public void setCircleTranslate(java.util.List<java.lang.Double>?);\n    method public void setCircleTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor?);\n    method protected void setDataDrivenPropertyIsUsed(String property);\n    method public void setLayerFilter(com.mapbox.maps.extension.style.expressions.generated.Expression?);\n    method public void setMaxZoom(Double?);\n    method public void setMinZoom(Double?);\n    method public void setSlot(String?);\n    property public final Double? circleBlur;\n    property @ColorInt public final Integer? circleColorInt;\n    property public final String? circleColorString;\n    property public final String? circleColorUseTheme;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CircleElevationReference? circleElevationReference;\n    property public final Double? circleEmissiveStrength;\n    property public final Double? circleOpacity;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchAlignment? circlePitchAlignment;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CirclePitchScale? circlePitchScale;\n    property public final Double? circleRadius;\n    property public final Double? circleSortKey;\n    property @ColorInt public final Integer? circleStrokeColorInt;\n    property public final String? circleStrokeColorString;\n    property public final String? circleStrokeColorUseTheme;\n    property public final Double? circleStrokeOpacity;\n    property public final Double? circleStrokeWidth;\n    property public final java.util.List<java.lang.Double>? circleTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.CircleTranslateAnchor? circleTranslateAnchor;\n    property public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterClickListener> clusterClickListeners;\n    property public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterLongClickListener> clusterLongClickListeners;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? layerFilter;\n    property public final Double? maxZoom;\n    property public final Double? minZoom;\n    property public final String? slot;\n    field public static final com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager.Companion Companion;\n  }\n\n  public static final class CircleAnnotationManager.Companion {\n    method public java.util.concurrent.atomic.AtomicLong getID_GENERATOR();\n    method public void setID_GENERATOR(java.util.concurrent.atomic.AtomicLong);\n    property public final java.util.concurrent.atomic.AtomicLong ID_GENERATOR;\n  }\n\n  public final class CircleAnnotationManagerKt {\n    method public static com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager createCircleAnnotationManager(com.mapbox.maps.plugin.annotation.AnnotationPlugin, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null);\n  }\n\n  public final class CircleAnnotationOptions implements com.mapbox.maps.plugin.annotation.AnnotationOptions<com.mapbox.geojson.Point,com.mapbox.maps.plugin.annotation.generated.CircleAnnotation> {\n    ctor public CircleAnnotationOptions();\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotation build(String id, com.mapbox.maps.plugin.annotation.AnnotationManager<com.mapbox.geojson.Point,com.mapbox.maps.plugin.annotation.generated.CircleAnnotation,?,?,?,?,?> annotationManager);\n    method public Double? getCircleBlur();\n    method public String? getCircleColor();\n    method public String? getCircleColorUseTheme();\n    method public Double? getCircleOpacity();\n    method public Double? getCircleRadius();\n    method public Double? getCircleSortKey();\n    method public String? getCircleStrokeColor();\n    method public String? getCircleStrokeColorUseTheme();\n    method public Double? getCircleStrokeOpacity();\n    method public Double? getCircleStrokeWidth();\n    method public com.google.gson.JsonElement? getData();\n    method public boolean getDraggable();\n    method public com.mapbox.geojson.Point? getGeometry();\n    method public com.mapbox.geojson.Point? getPoint();\n    method public void setCircleBlur(Double?);\n    method public void setCircleColor(String?);\n    method public void setCircleColorUseTheme(String?);\n    method public void setCircleOpacity(Double?);\n    method public void setCircleRadius(Double?);\n    method public void setCircleSortKey(Double?);\n    method public void setCircleStrokeColor(String?);\n    method public void setCircleStrokeColorUseTheme(String?);\n    method public void setCircleStrokeOpacity(Double?);\n    method public void setCircleStrokeWidth(Double?);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleBlur(double circleBlur);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleColor(String circleColor);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleColor(@ColorInt int circleColor);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleColorUseTheme(String circleColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleOpacity(double circleOpacity);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleRadius(double circleRadius);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleSortKey(double circleSortKey);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleStrokeColor(String circleStrokeColor);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleStrokeColor(@ColorInt int circleStrokeColor);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleStrokeColorUseTheme(String circleStrokeColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleStrokeOpacity(double circleStrokeOpacity);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withCircleStrokeWidth(double circleStrokeWidth);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withData(com.google.gson.JsonElement jsonElement);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withDraggable(boolean draggable);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withGeometry(com.mapbox.geojson.Point geometry);\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions withPoint(com.mapbox.geojson.Point point);\n    property public final Double? circleBlur;\n    property public final String? circleColor;\n    property public final String? circleColorUseTheme;\n    property public final Double? circleOpacity;\n    property public final Double? circleRadius;\n    property public final Double? circleSortKey;\n    property public final String? circleStrokeColor;\n    property public final String? circleStrokeColorUseTheme;\n    property public final Double? circleStrokeOpacity;\n    property public final Double? circleStrokeWidth;\n    field public static final com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions.Companion Companion;\n    field public static final String PROPERTY_CIRCLE_BLUR = \"circle-blur\";\n    field public static final String PROPERTY_CIRCLE_COLOR = \"circle-color\";\n    field public static final String PROPERTY_CIRCLE_COLOR_USE_THEME = \"circle-color-use-theme\";\n    field public static final String PROPERTY_CIRCLE_OPACITY = \"circle-opacity\";\n    field public static final String PROPERTY_CIRCLE_RADIUS = \"circle-radius\";\n    field public static final String PROPERTY_CIRCLE_SORT_KEY = \"circle-sort-key\";\n    field public static final String PROPERTY_CIRCLE_STROKE_COLOR = \"circle-stroke-color\";\n    field public static final String PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME = \"circle-stroke-color-use-theme\";\n    field public static final String PROPERTY_CIRCLE_STROKE_OPACITY = \"circle-stroke-opacity\";\n    field public static final String PROPERTY_CIRCLE_STROKE_WIDTH = \"circle-stroke-width\";\n  }\n\n  public static final class CircleAnnotationOptions.Companion {\n    method public com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions? fromFeature(com.mapbox.geojson.Feature feature);\n  }\n\n  public fun interface OnCircleAnnotationClickListener extends com.mapbox.maps.plugin.annotation.OnAnnotationClickListener<com.mapbox.maps.plugin.annotation.generated.CircleAnnotation> {\n  }\n\n  public interface OnCircleAnnotationDragListener extends com.mapbox.maps.plugin.annotation.OnAnnotationDragListener<com.mapbox.maps.plugin.annotation.generated.CircleAnnotation> {\n  }\n\n  public interface OnCircleAnnotationInteractionListener extends com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener<com.mapbox.maps.plugin.annotation.generated.CircleAnnotation> {\n  }\n\n  public fun interface OnCircleAnnotationLongClickListener extends com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener<com.mapbox.maps.plugin.annotation.generated.CircleAnnotation> {\n  }\n\n  public fun interface OnPointAnnotationClickListener extends com.mapbox.maps.plugin.annotation.OnAnnotationClickListener<com.mapbox.maps.plugin.annotation.generated.PointAnnotation> {\n  }\n\n  public interface OnPointAnnotationDragListener extends com.mapbox.maps.plugin.annotation.OnAnnotationDragListener<com.mapbox.maps.plugin.annotation.generated.PointAnnotation> {\n  }\n\n  public interface OnPointAnnotationInteractionListener extends com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener<com.mapbox.maps.plugin.annotation.generated.PointAnnotation> {\n  }\n\n  public fun interface OnPointAnnotationLongClickListener extends com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener<com.mapbox.maps.plugin.annotation.generated.PointAnnotation> {\n  }\n\n  public fun interface OnPolygonAnnotationClickListener extends com.mapbox.maps.plugin.annotation.OnAnnotationClickListener<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation> {\n  }\n\n  public interface OnPolygonAnnotationDragListener extends com.mapbox.maps.plugin.annotation.OnAnnotationDragListener<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation> {\n  }\n\n  public interface OnPolygonAnnotationInteractionListener extends com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation> {\n  }\n\n  public fun interface OnPolygonAnnotationLongClickListener extends com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation> {\n  }\n\n  public fun interface OnPolylineAnnotationClickListener extends com.mapbox.maps.plugin.annotation.OnAnnotationClickListener<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation> {\n  }\n\n  public interface OnPolylineAnnotationDragListener extends com.mapbox.maps.plugin.annotation.OnAnnotationDragListener<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation> {\n  }\n\n  public interface OnPolylineAnnotationInteractionListener extends com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation> {\n  }\n\n  public fun interface OnPolylineAnnotationLongClickListener extends com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation> {\n  }\n\n  public final class PointAnnotation extends com.mapbox.maps.plugin.annotation.Annotation<com.mapbox.geojson.Point> {\n    ctor public PointAnnotation(String id, com.mapbox.maps.plugin.annotation.AnnotationManager<com.mapbox.geojson.Point,com.mapbox.maps.plugin.annotation.generated.PointAnnotation,?,?,?,?,?> annotationManager, com.google.gson.JsonObject jsonObject, com.mapbox.geojson.Point geometry);\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? getIconAnchor();\n    method @ColorInt public Integer? getIconColorInt();\n    method public String? getIconColorString();\n    method public String? getIconColorUseTheme();\n    method public Double? getIconEmissiveStrength();\n    method public Double? getIconHaloBlur();\n    method @ColorInt public Integer? getIconHaloColorInt();\n    method public String? getIconHaloColorString();\n    method public String? getIconHaloColorUseTheme();\n    method public Double? getIconHaloWidth();\n    method @Deprecated public String? getIconImage();\n    method public android.graphics.Bitmap? getIconImageBitmap();\n    method @Deprecated public Double? getIconImageCrossFade();\n    method public Double? getIconOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getIconOffset();\n    method public Double? getIconOpacity();\n    method public Double? getIconRotate();\n    method public Double? getIconSize();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? getIconTextFit();\n    method public java.util.List<java.lang.Double>? getIconTextFitPadding();\n    method public com.mapbox.geojson.Point? getOffsetGeometry(com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate mapCameraManagerDelegate, com.mapbox.android.gestures.MoveDistancesObject moveDistancesObject);\n    method public com.mapbox.geojson.Point getPoint();\n    method public Double? getSymbolSortKey();\n    method public Double? getSymbolZOffset();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? getTextAnchor();\n    method @ColorInt public Integer? getTextColorInt();\n    method public String? getTextColorString();\n    method public String? getTextColorUseTheme();\n    method public Double? getTextEmissiveStrength();\n    method public String? getTextField();\n    method public Double? getTextHaloBlur();\n    method @ColorInt public Integer? getTextHaloColorInt();\n    method public String? getTextHaloColorString();\n    method public String? getTextHaloColorUseTheme();\n    method public Double? getTextHaloWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? getTextJustify();\n    method public Double? getTextLetterSpacing();\n    method public Double? getTextLineHeight();\n    method public Double? getTextMaxWidth();\n    method public Double? getTextOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getTextOffset();\n    method public Double? getTextOpacity();\n    method public Double? getTextRadialOffset();\n    method public Double? getTextRotate();\n    method public Double? getTextSize();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? getTextTransform();\n    method public com.mapbox.maps.plugin.annotation.AnnotationType getType();\n    method public void setIconAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor?);\n    method public void setIconColorInt(@ColorInt Integer?);\n    method public void setIconColorString(String?);\n    method public void setIconColorUseTheme(String?);\n    method public void setIconEmissiveStrength(Double?);\n    method public void setIconHaloBlur(Double?);\n    method public void setIconHaloColorInt(@ColorInt Integer?);\n    method public void setIconHaloColorString(String?);\n    method public void setIconHaloColorUseTheme(String?);\n    method public void setIconHaloWidth(Double?);\n    method public void setIconImage(String?);\n    method public void setIconImageBitmap(android.graphics.Bitmap?);\n    method @Deprecated public void setIconImageCrossFade(Double?);\n    method public void setIconOcclusionOpacity(Double?);\n    method public void setIconOffset(java.util.List<java.lang.Double>?);\n    method public void setIconOpacity(Double?);\n    method public void setIconRotate(Double?);\n    method public void setIconSize(Double?);\n    method public void setIconTextFit(com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit?);\n    method public void setIconTextFitPadding(java.util.List<java.lang.Double>?);\n    method public void setPoint(com.mapbox.geojson.Point);\n    method public void setSymbolSortKey(Double?);\n    method public void setSymbolZOffset(Double?);\n    method public void setTextAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor?);\n    method public void setTextColorInt(@ColorInt Integer?);\n    method public void setTextColorString(String?);\n    method public void setTextColorUseTheme(String?);\n    method public void setTextEmissiveStrength(Double?);\n    method public void setTextField(String?);\n    method public void setTextHaloBlur(Double?);\n    method public void setTextHaloColorInt(@ColorInt Integer?);\n    method public void setTextHaloColorString(String?);\n    method public void setTextHaloColorUseTheme(String?);\n    method public void setTextHaloWidth(Double?);\n    method public void setTextJustify(com.mapbox.maps.extension.style.layers.properties.generated.TextJustify?);\n    method public void setTextLetterSpacing(Double?);\n    method public void setTextLineHeight(Double?);\n    method public void setTextMaxWidth(Double?);\n    method public void setTextOcclusionOpacity(Double?);\n    method public void setTextOffset(java.util.List<java.lang.Double>?);\n    method public void setTextOpacity(Double?);\n    method public void setTextRadialOffset(Double?);\n    method public void setTextRotate(Double?);\n    method public void setTextSize(Double?);\n    method public void setTextTransform(com.mapbox.maps.extension.style.layers.properties.generated.TextTransform?);\n    method public void setUsedDataDrivenProperties();\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? iconAnchor;\n    property @ColorInt public final Integer? iconColorInt;\n    property public final String? iconColorString;\n    property public final String? iconColorUseTheme;\n    property public final Double? iconEmissiveStrength;\n    property public final Double? iconHaloBlur;\n    property @ColorInt public final Integer? iconHaloColorInt;\n    property public final String? iconHaloColorString;\n    property public final String? iconHaloColorUseTheme;\n    property public final Double? iconHaloWidth;\n    property @Deprecated public final String? iconImage;\n    property public final android.graphics.Bitmap? iconImageBitmap;\n    property @Deprecated public final Double? iconImageCrossFade;\n    property public final Double? iconOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? iconOffset;\n    property public final Double? iconOpacity;\n    property public final Double? iconRotate;\n    property public final Double? iconSize;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? iconTextFit;\n    property public final java.util.List<java.lang.Double>? iconTextFitPadding;\n    property public final com.mapbox.geojson.Point point;\n    property public final Double? symbolSortKey;\n    property public final Double? symbolZOffset;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? textAnchor;\n    property @ColorInt public final Integer? textColorInt;\n    property public final String? textColorString;\n    property public final String? textColorUseTheme;\n    property public final Double? textEmissiveStrength;\n    property public final String? textField;\n    property public final Double? textHaloBlur;\n    property @ColorInt public final Integer? textHaloColorInt;\n    property public final String? textHaloColorString;\n    property public final String? textHaloColorUseTheme;\n    property public final Double? textHaloWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? textJustify;\n    property public final Double? textLetterSpacing;\n    property public final Double? textLineHeight;\n    property public final Double? textMaxWidth;\n    property public final Double? textOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? textOffset;\n    property public final Double? textOpacity;\n    property public final Double? textRadialOffset;\n    property public final Double? textRotate;\n    property public final Double? textSize;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? textTransform;\n    field public static final com.mapbox.maps.plugin.annotation.generated.PointAnnotation.Companion Companion;\n    field public static final String ICON_DEFAULT_NAME_PREFIX = \"icon_default_name_\";\n    field public static final String ID_KEY = \"PointAnnotation\";\n  }\n\n  public static final class PointAnnotation.Companion {\n  }\n\n  public final class PointAnnotationManager extends com.mapbox.maps.plugin.annotation.AnnotationManagerImpl<com.mapbox.geojson.Point,com.mapbox.maps.plugin.annotation.generated.PointAnnotation,com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions,com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationDragListener,com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationClickListener,com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationLongClickListener,com.mapbox.maps.plugin.annotation.generated.OnPointAnnotationInteractionListener,com.mapbox.maps.extension.style.layers.generated.SymbolLayer> implements com.mapbox.maps.plugin.annotation.ClusterAnnotationManager {\n    ctor public PointAnnotationManager(com.mapbox.maps.plugin.delegates.MapDelegateProvider delegateProvider, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null);\n    method public java.util.List<com.mapbox.maps.plugin.annotation.generated.PointAnnotation> create(String json);\n    method public java.util.List<com.mapbox.maps.plugin.annotation.generated.PointAnnotation> create(com.mapbox.geojson.FeatureCollection featureCollection);\n    method public String getAnnotationIdKey();\n    method public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterClickListener> getClusterClickListeners();\n    method public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterLongClickListener> getClusterLongClickListeners();\n    method public Boolean? getIconAllowOverlap();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? getIconAnchor();\n    method public Double? getIconColorBrightnessMax();\n    method public Double? getIconColorBrightnessMin();\n    method public Double? getIconColorContrast();\n    method @ColorInt public Integer? getIconColorInt();\n    method public Double? getIconColorSaturation();\n    method public String? getIconColorString();\n    method public String? getIconColorUseTheme();\n    method public Double? getIconEmissiveStrength();\n    method public Double? getIconHaloBlur();\n    method @ColorInt public Integer? getIconHaloColorInt();\n    method public String? getIconHaloColorString();\n    method public String? getIconHaloColorUseTheme();\n    method public Double? getIconHaloWidth();\n    method public Boolean? getIconIgnorePlacement();\n    method @Deprecated public String? getIconImage();\n    method public android.graphics.Bitmap? getIconImageBitmap();\n    method public Double? getIconImageCrossFade();\n    method public Boolean? getIconKeepUpright();\n    method public Double? getIconOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getIconOffset();\n    method public Double? getIconOpacity();\n    method public Boolean? getIconOptional();\n    method public Double? getIconPadding();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment? getIconPitchAlignment();\n    method public Double? getIconRotate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment? getIconRotationAlignment();\n    method public Double? getIconSize();\n    method public java.util.List<java.lang.Double>? getIconSizeScaleRange();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? getIconTextFit();\n    method public java.util.List<java.lang.Double>? getIconTextFitPadding();\n    method public java.util.List<java.lang.Double>? getIconTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor? getIconTranslateAnchor();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLayerFilter();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode? getOcclusionOpacityMode();\n    method public String? getSlot();\n    method public Boolean? getSymbolAvoidEdges();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference? getSymbolElevationReference();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement? getSymbolPlacement();\n    method public Double? getSymbolSortKey();\n    method public Double? getSymbolSpacing();\n    method public Boolean? getSymbolZElevate();\n    method public Double? getSymbolZOffset();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder? getSymbolZOrder();\n    method public Boolean? getTextAllowOverlap();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? getTextAnchor();\n    method @ColorInt public Integer? getTextColorInt();\n    method public String? getTextColorString();\n    method public String? getTextColorUseTheme();\n    method public Double? getTextEmissiveStrength();\n    method public String? getTextField();\n    method public java.util.List<java.lang.String>? getTextFont();\n    method public Double? getTextHaloBlur();\n    method @ColorInt public Integer? getTextHaloColorInt();\n    method public String? getTextHaloColorString();\n    method public String? getTextHaloColorUseTheme();\n    method public Double? getTextHaloWidth();\n    method public Boolean? getTextIgnorePlacement();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? getTextJustify();\n    method public Boolean? getTextKeepUpright();\n    method public Double? getTextLetterSpacing();\n    method public Double? getTextLineHeight();\n    method public Double? getTextMaxAngle();\n    method public Double? getTextMaxWidth();\n    method public Double? getTextOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getTextOffset();\n    method public Double? getTextOpacity();\n    method public Boolean? getTextOptional();\n    method public Double? getTextPadding();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment? getTextPitchAlignment();\n    method public Double? getTextRadialOffset();\n    method public Double? getTextRotate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment? getTextRotationAlignment();\n    method public Double? getTextSize();\n    method public java.util.List<java.lang.Double>? getTextSizeScaleRange();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? getTextTransform();\n    method public java.util.List<java.lang.Double>? getTextTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor? getTextTranslateAnchor();\n    method public java.util.List<java.lang.String>? getTextVariableAnchor();\n    method public java.util.List<java.lang.String>? getTextWritingMode();\n    method protected void setDataDrivenPropertyIsUsed(String property);\n    method public void setIconAllowOverlap(Boolean?);\n    method public void setIconAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor?);\n    method public void setIconColorBrightnessMax(Double?);\n    method public void setIconColorBrightnessMin(Double?);\n    method public void setIconColorContrast(Double?);\n    method public void setIconColorInt(@ColorInt Integer?);\n    method public void setIconColorSaturation(Double?);\n    method public void setIconColorString(String?);\n    method public void setIconColorUseTheme(String?);\n    method public void setIconEmissiveStrength(Double?);\n    method public void setIconHaloBlur(Double?);\n    method public void setIconHaloColorInt(@ColorInt Integer?);\n    method public void setIconHaloColorString(String?);\n    method public void setIconHaloColorUseTheme(String?);\n    method public void setIconHaloWidth(Double?);\n    method public void setIconIgnorePlacement(Boolean?);\n    method public void setIconImage(String?);\n    method public void setIconImageBitmap(android.graphics.Bitmap?);\n    method public void setIconImageCrossFade(Double?);\n    method public void setIconKeepUpright(Boolean?);\n    method public void setIconOcclusionOpacity(Double?);\n    method public void setIconOffset(java.util.List<java.lang.Double>?);\n    method public void setIconOpacity(Double?);\n    method public void setIconOptional(Boolean?);\n    method public void setIconPadding(Double?);\n    method public void setIconPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment?);\n    method public void setIconRotate(Double?);\n    method public void setIconRotationAlignment(com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment?);\n    method public void setIconSize(Double?);\n    method public void setIconSizeScaleRange(java.util.List<java.lang.Double>?);\n    method public void setIconTextFit(com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit?);\n    method public void setIconTextFitPadding(java.util.List<java.lang.Double>?);\n    method public void setIconTranslate(java.util.List<java.lang.Double>?);\n    method public void setIconTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor?);\n    method public void setLayerFilter(com.mapbox.maps.extension.style.expressions.generated.Expression?);\n    method public void setMaxZoom(Double?);\n    method public void setMinZoom(Double?);\n    method public void setOcclusionOpacityMode(com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode?);\n    method public void setSlot(String?);\n    method public void setSymbolAvoidEdges(Boolean?);\n    method public void setSymbolElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference?);\n    method public void setSymbolPlacement(com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement?);\n    method public void setSymbolSortKey(Double?);\n    method public void setSymbolSpacing(Double?);\n    method public void setSymbolZElevate(Boolean?);\n    method public void setSymbolZOffset(Double?);\n    method public void setSymbolZOrder(com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder?);\n    method public void setTextAllowOverlap(Boolean?);\n    method public void setTextAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor?);\n    method public void setTextColorInt(@ColorInt Integer?);\n    method public void setTextColorString(String?);\n    method public void setTextColorUseTheme(String?);\n    method public void setTextEmissiveStrength(Double?);\n    method public void setTextField(String?);\n    method public void setTextFont(java.util.List<java.lang.String>?);\n    method public void setTextHaloBlur(Double?);\n    method public void setTextHaloColorInt(@ColorInt Integer?);\n    method public void setTextHaloColorString(String?);\n    method public void setTextHaloColorUseTheme(String?);\n    method public void setTextHaloWidth(Double?);\n    method public void setTextIgnorePlacement(Boolean?);\n    method public void setTextJustify(com.mapbox.maps.extension.style.layers.properties.generated.TextJustify?);\n    method public void setTextKeepUpright(Boolean?);\n    method public void setTextLetterSpacing(Double?);\n    method public void setTextLineHeight(Double?);\n    method public void setTextMaxAngle(Double?);\n    method public void setTextMaxWidth(Double?);\n    method public void setTextOcclusionOpacity(Double?);\n    method public void setTextOffset(java.util.List<java.lang.Double>?);\n    method public void setTextOpacity(Double?);\n    method public void setTextOptional(Boolean?);\n    method public void setTextPadding(Double?);\n    method public void setTextPitchAlignment(com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment?);\n    method public void setTextRadialOffset(Double?);\n    method public void setTextRotate(Double?);\n    method public void setTextRotationAlignment(com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment?);\n    method public void setTextSize(Double?);\n    method public void setTextSizeScaleRange(java.util.List<java.lang.Double>?);\n    method public void setTextTransform(com.mapbox.maps.extension.style.layers.properties.generated.TextTransform?);\n    method public void setTextTranslate(java.util.List<java.lang.Double>?);\n    method public void setTextTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor?);\n    method public void setTextVariableAnchor(java.util.List<java.lang.String>?);\n    method public void setTextWritingMode(java.util.List<java.lang.String>?);\n    property public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterClickListener> clusterClickListeners;\n    property public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterLongClickListener> clusterLongClickListeners;\n    property public final Boolean? iconAllowOverlap;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? iconAnchor;\n    property public final Double? iconColorBrightnessMax;\n    property public final Double? iconColorBrightnessMin;\n    property public final Double? iconColorContrast;\n    property @ColorInt public final Integer? iconColorInt;\n    property public final Double? iconColorSaturation;\n    property public final String? iconColorString;\n    property public final String? iconColorUseTheme;\n    property public final Double? iconEmissiveStrength;\n    property public final Double? iconHaloBlur;\n    property @ColorInt public final Integer? iconHaloColorInt;\n    property public final String? iconHaloColorString;\n    property public final String? iconHaloColorUseTheme;\n    property public final Double? iconHaloWidth;\n    property public final Boolean? iconIgnorePlacement;\n    property @Deprecated public final String? iconImage;\n    property public final android.graphics.Bitmap? iconImageBitmap;\n    property public final Double? iconImageCrossFade;\n    property public final Boolean? iconKeepUpright;\n    property public final Double? iconOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? iconOffset;\n    property public final Double? iconOpacity;\n    property public final Boolean? iconOptional;\n    property public final Double? iconPadding;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconPitchAlignment? iconPitchAlignment;\n    property public final Double? iconRotate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconRotationAlignment? iconRotationAlignment;\n    property public final Double? iconSize;\n    property public final java.util.List<java.lang.Double>? iconSizeScaleRange;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? iconTextFit;\n    property public final java.util.List<java.lang.Double>? iconTextFitPadding;\n    property public final java.util.List<java.lang.Double>? iconTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTranslateAnchor? iconTranslateAnchor;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? layerFilter;\n    property public final Double? maxZoom;\n    property public final Double? minZoom;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.OcclusionOpacityMode? occlusionOpacityMode;\n    property public final String? slot;\n    property public final Boolean? symbolAvoidEdges;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolElevationReference? symbolElevationReference;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolPlacement? symbolPlacement;\n    property public final Double? symbolSortKey;\n    property public final Double? symbolSpacing;\n    property public final Boolean? symbolZElevate;\n    property public final Double? symbolZOffset;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.SymbolZOrder? symbolZOrder;\n    property public final Boolean? textAllowOverlap;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? textAnchor;\n    property @ColorInt public final Integer? textColorInt;\n    property public final String? textColorString;\n    property public final String? textColorUseTheme;\n    property public final Double? textEmissiveStrength;\n    property public final String? textField;\n    property public final java.util.List<java.lang.String>? textFont;\n    property public final Double? textHaloBlur;\n    property @ColorInt public final Integer? textHaloColorInt;\n    property public final String? textHaloColorString;\n    property public final String? textHaloColorUseTheme;\n    property public final Double? textHaloWidth;\n    property public final Boolean? textIgnorePlacement;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? textJustify;\n    property public final Boolean? textKeepUpright;\n    property public final Double? textLetterSpacing;\n    property public final Double? textLineHeight;\n    property public final Double? textMaxAngle;\n    property public final Double? textMaxWidth;\n    property public final Double? textOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? textOffset;\n    property public final Double? textOpacity;\n    property public final Boolean? textOptional;\n    property public final Double? textPadding;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextPitchAlignment? textPitchAlignment;\n    property public final Double? textRadialOffset;\n    property public final Double? textRotate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment? textRotationAlignment;\n    property public final Double? textSize;\n    property public final java.util.List<java.lang.Double>? textSizeScaleRange;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? textTransform;\n    property public final java.util.List<java.lang.Double>? textTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTranslateAnchor? textTranslateAnchor;\n    property public final java.util.List<java.lang.String>? textVariableAnchor;\n    property public final java.util.List<java.lang.String>? textWritingMode;\n    field public static final com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager.Companion Companion;\n  }\n\n  public static final class PointAnnotationManager.Companion {\n    method public java.util.concurrent.atomic.AtomicLong getID_GENERATOR();\n    method public void setID_GENERATOR(java.util.concurrent.atomic.AtomicLong);\n    property public final java.util.concurrent.atomic.AtomicLong ID_GENERATOR;\n  }\n\n  public final class PointAnnotationManagerKt {\n    method public static com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager createPointAnnotationManager(com.mapbox.maps.plugin.annotation.AnnotationPlugin, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null);\n  }\n\n  public final class PointAnnotationOptions implements com.mapbox.maps.plugin.annotation.AnnotationOptions<com.mapbox.geojson.Point,com.mapbox.maps.plugin.annotation.generated.PointAnnotation> {\n    ctor public PointAnnotationOptions();\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotation build(String id, com.mapbox.maps.plugin.annotation.AnnotationManager<com.mapbox.geojson.Point,com.mapbox.maps.plugin.annotation.generated.PointAnnotation,?,?,?,?,?> annotationManager);\n    method public com.google.gson.JsonElement? getData();\n    method public boolean getDraggable();\n    method public com.mapbox.geojson.Point? getGeometry();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? getIconAnchor();\n    method public String? getIconColor();\n    method public String? getIconColorUseTheme();\n    method public Double? getIconEmissiveStrength();\n    method public Double? getIconHaloBlur();\n    method public String? getIconHaloColor();\n    method public String? getIconHaloColorUseTheme();\n    method public Double? getIconHaloWidth();\n    method public String? getIconImage();\n    method @Deprecated public Double? getIconImageCrossFade();\n    method public Double? getIconOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getIconOffset();\n    method public Double? getIconOpacity();\n    method public Double? getIconRotate();\n    method public Double? getIconSize();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? getIconTextFit();\n    method public java.util.List<java.lang.Double>? getIconTextFitPadding();\n    method public com.mapbox.geojson.Point? getPoint();\n    method public Double? getSymbolSortKey();\n    method public Double? getSymbolZOffset();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? getTextAnchor();\n    method public String? getTextColor();\n    method public String? getTextColorUseTheme();\n    method public Double? getTextEmissiveStrength();\n    method public String? getTextField();\n    method public Double? getTextHaloBlur();\n    method public String? getTextHaloColor();\n    method public String? getTextHaloColorUseTheme();\n    method public Double? getTextHaloWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? getTextJustify();\n    method public Double? getTextLetterSpacing();\n    method public Double? getTextLineHeight();\n    method public Double? getTextMaxWidth();\n    method public Double? getTextOcclusionOpacity();\n    method public java.util.List<java.lang.Double>? getTextOffset();\n    method public Double? getTextOpacity();\n    method public Double? getTextRadialOffset();\n    method public Double? getTextRotate();\n    method public Double? getTextSize();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? getTextTransform();\n    method public void setIconAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor?);\n    method public void setIconColor(String?);\n    method public void setIconColorUseTheme(String?);\n    method public void setIconEmissiveStrength(Double?);\n    method public void setIconHaloBlur(Double?);\n    method public void setIconHaloColor(String?);\n    method public void setIconHaloColorUseTheme(String?);\n    method public void setIconHaloWidth(Double?);\n    method public void setIconImage(String?);\n    method @Deprecated public void setIconImageCrossFade(Double?);\n    method public void setIconOcclusionOpacity(Double?);\n    method public void setIconOffset(java.util.List<java.lang.Double>?);\n    method public void setIconOpacity(Double?);\n    method public void setIconRotate(Double?);\n    method public void setIconSize(Double?);\n    method public void setIconTextFit(com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit?);\n    method public void setIconTextFitPadding(java.util.List<java.lang.Double>?);\n    method public void setSymbolSortKey(Double?);\n    method public void setSymbolZOffset(Double?);\n    method public void setTextAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor?);\n    method public void setTextColor(String?);\n    method public void setTextColorUseTheme(String?);\n    method public void setTextEmissiveStrength(Double?);\n    method public void setTextField(String?);\n    method public void setTextHaloBlur(Double?);\n    method public void setTextHaloColor(String?);\n    method public void setTextHaloColorUseTheme(String?);\n    method public void setTextHaloWidth(Double?);\n    method public void setTextJustify(com.mapbox.maps.extension.style.layers.properties.generated.TextJustify?);\n    method public void setTextLetterSpacing(Double?);\n    method public void setTextLineHeight(Double?);\n    method public void setTextMaxWidth(Double?);\n    method public void setTextOcclusionOpacity(Double?);\n    method public void setTextOffset(java.util.List<java.lang.Double>?);\n    method public void setTextOpacity(Double?);\n    method public void setTextRadialOffset(Double?);\n    method public void setTextRotate(Double?);\n    method public void setTextSize(Double?);\n    method public void setTextTransform(com.mapbox.maps.extension.style.layers.properties.generated.TextTransform?);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withData(com.google.gson.JsonElement jsonElement);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withDraggable(boolean draggable);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withGeometry(com.mapbox.geojson.Point geometry);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconAnchor(com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor iconAnchor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconColor(String iconColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconColor(@ColorInt int iconColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconColorUseTheme(String iconColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconEmissiveStrength(double iconEmissiveStrength);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconHaloBlur(double iconHaloBlur);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconHaloColor(String iconHaloColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconHaloColor(@ColorInt int iconHaloColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconHaloColorUseTheme(String iconHaloColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconHaloWidth(double iconHaloWidth);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconImage(android.graphics.Bitmap iconImageBitmap);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconImage(String iconImage);\n    method @Deprecated public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconImageCrossFade(double iconImageCrossFade);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconOcclusionOpacity(double iconOcclusionOpacity);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconOffset(java.util.List<java.lang.Double> iconOffset);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconOpacity(double iconOpacity);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconRotate(double iconRotate);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconSize(double iconSize);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconTextFit(com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit iconTextFit);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withIconTextFitPadding(java.util.List<java.lang.Double> iconTextFitPadding);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withPoint(com.mapbox.geojson.Point point);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withSymbolSortKey(double symbolSortKey);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withSymbolZOffset(double symbolZOffset);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextAnchor(com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor textAnchor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextColor(String textColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextColor(@ColorInt int textColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextColorUseTheme(String textColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextEmissiveStrength(double textEmissiveStrength);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextField(String textField);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextHaloBlur(double textHaloBlur);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextHaloColor(String textHaloColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextHaloColor(@ColorInt int textHaloColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextHaloColorUseTheme(String textHaloColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextHaloWidth(double textHaloWidth);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextJustify(com.mapbox.maps.extension.style.layers.properties.generated.TextJustify textJustify);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextLetterSpacing(double textLetterSpacing);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextLineHeight(double textLineHeight);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextMaxWidth(double textMaxWidth);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextOcclusionOpacity(double textOcclusionOpacity);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextOffset(java.util.List<java.lang.Double> textOffset);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextOpacity(double textOpacity);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextRadialOffset(double textRadialOffset);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextRotate(double textRotate);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextSize(double textSize);\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions withTextTransform(com.mapbox.maps.extension.style.layers.properties.generated.TextTransform textTransform);\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor? iconAnchor;\n    property public final String? iconColor;\n    property public final String? iconColorUseTheme;\n    property public final Double? iconEmissiveStrength;\n    property public final Double? iconHaloBlur;\n    property public final String? iconHaloColor;\n    property public final String? iconHaloColorUseTheme;\n    property public final Double? iconHaloWidth;\n    property public final String? iconImage;\n    property @Deprecated public final Double? iconImageCrossFade;\n    property public final Double? iconOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? iconOffset;\n    property public final Double? iconOpacity;\n    property public final Double? iconRotate;\n    property public final Double? iconSize;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit? iconTextFit;\n    property public final java.util.List<java.lang.Double>? iconTextFitPadding;\n    property public final Double? symbolSortKey;\n    property public final Double? symbolZOffset;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor? textAnchor;\n    property public final String? textColor;\n    property public final String? textColorUseTheme;\n    property public final Double? textEmissiveStrength;\n    property public final String? textField;\n    property public final Double? textHaloBlur;\n    property public final String? textHaloColor;\n    property public final String? textHaloColorUseTheme;\n    property public final Double? textHaloWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextJustify? textJustify;\n    property public final Double? textLetterSpacing;\n    property public final Double? textLineHeight;\n    property public final Double? textMaxWidth;\n    property public final Double? textOcclusionOpacity;\n    property public final java.util.List<java.lang.Double>? textOffset;\n    property public final Double? textOpacity;\n    property public final Double? textRadialOffset;\n    property public final Double? textRotate;\n    property public final Double? textSize;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.TextTransform? textTransform;\n    field public static final com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions.Companion Companion;\n    field public static final String PROPERTY_ICON_ANCHOR = \"icon-anchor\";\n    field public static final String PROPERTY_ICON_COLOR = \"icon-color\";\n    field public static final String PROPERTY_ICON_COLOR_USE_THEME = \"icon-color-use-theme\";\n    field public static final String PROPERTY_ICON_EMISSIVE_STRENGTH = \"icon-emissive-strength\";\n    field public static final String PROPERTY_ICON_HALO_BLUR = \"icon-halo-blur\";\n    field public static final String PROPERTY_ICON_HALO_COLOR = \"icon-halo-color\";\n    field public static final String PROPERTY_ICON_HALO_COLOR_USE_THEME = \"icon-halo-color-use-theme\";\n    field public static final String PROPERTY_ICON_HALO_WIDTH = \"icon-halo-width\";\n    field public static final String PROPERTY_ICON_IMAGE = \"icon-image\";\n    field public static final String PROPERTY_ICON_IMAGE_CROSS_FADE = \"icon-image-cross-fade\";\n    field public static final String PROPERTY_ICON_OCCLUSION_OPACITY = \"icon-occlusion-opacity\";\n    field public static final String PROPERTY_ICON_OFFSET = \"icon-offset\";\n    field public static final String PROPERTY_ICON_OPACITY = \"icon-opacity\";\n    field public static final String PROPERTY_ICON_ROTATE = \"icon-rotate\";\n    field public static final String PROPERTY_ICON_SIZE = \"icon-size\";\n    field public static final String PROPERTY_ICON_TEXT_FIT = \"icon-text-fit\";\n    field public static final String PROPERTY_ICON_TEXT_FIT_PADDING = \"icon-text-fit-padding\";\n    field public static final String PROPERTY_SYMBOL_SORT_KEY = \"symbol-sort-key\";\n    field public static final String PROPERTY_SYMBOL_Z_OFFSET = \"symbol-z-offset\";\n    field public static final String PROPERTY_TEXT_ANCHOR = \"text-anchor\";\n    field public static final String PROPERTY_TEXT_COLOR = \"text-color\";\n    field public static final String PROPERTY_TEXT_COLOR_USE_THEME = \"text-color-use-theme\";\n    field public static final String PROPERTY_TEXT_EMISSIVE_STRENGTH = \"text-emissive-strength\";\n    field public static final String PROPERTY_TEXT_FIELD = \"text-field\";\n    field public static final String PROPERTY_TEXT_HALO_BLUR = \"text-halo-blur\";\n    field public static final String PROPERTY_TEXT_HALO_COLOR = \"text-halo-color\";\n    field public static final String PROPERTY_TEXT_HALO_COLOR_USE_THEME = \"text-halo-color-use-theme\";\n    field public static final String PROPERTY_TEXT_HALO_WIDTH = \"text-halo-width\";\n    field public static final String PROPERTY_TEXT_JUSTIFY = \"text-justify\";\n    field public static final String PROPERTY_TEXT_LETTER_SPACING = \"text-letter-spacing\";\n    field public static final String PROPERTY_TEXT_LINE_HEIGHT = \"text-line-height\";\n    field public static final String PROPERTY_TEXT_MAX_WIDTH = \"text-max-width\";\n    field public static final String PROPERTY_TEXT_OCCLUSION_OPACITY = \"text-occlusion-opacity\";\n    field public static final String PROPERTY_TEXT_OFFSET = \"text-offset\";\n    field public static final String PROPERTY_TEXT_OPACITY = \"text-opacity\";\n    field public static final String PROPERTY_TEXT_RADIAL_OFFSET = \"text-radial-offset\";\n    field public static final String PROPERTY_TEXT_ROTATE = \"text-rotate\";\n    field public static final String PROPERTY_TEXT_SIZE = \"text-size\";\n    field public static final String PROPERTY_TEXT_TRANSFORM = \"text-transform\";\n  }\n\n  public static final class PointAnnotationOptions.Companion {\n    method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions? fromFeature(com.mapbox.geojson.Feature feature);\n  }\n\n  public final class PolygonAnnotation extends com.mapbox.maps.plugin.annotation.Annotation<com.mapbox.geojson.Polygon> {\n    ctor public PolygonAnnotation(String id, com.mapbox.maps.plugin.annotation.AnnotationManager<com.mapbox.geojson.Polygon,com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,?,?,?,?,?> annotationManager, com.google.gson.JsonObject jsonObject, com.mapbox.geojson.Polygon geometry);\n    method @ColorInt public Integer? getFillBridgeGuardRailColorInt();\n    method public String? getFillBridgeGuardRailColorString();\n    method public String? getFillBridgeGuardRailColorUseTheme();\n    method @ColorInt public Integer? getFillColorInt();\n    method public String? getFillColorString();\n    method public String? getFillColorUseTheme();\n    method public Boolean? getFillConstructBridgeGuardRail();\n    method public Double? getFillOpacity();\n    method @ColorInt public Integer? getFillOutlineColorInt();\n    method public String? getFillOutlineColorString();\n    method public String? getFillOutlineColorUseTheme();\n    method public String? getFillPattern();\n    method public Double? getFillSortKey();\n    method @ColorInt public Integer? getFillTunnelStructureColorInt();\n    method public String? getFillTunnelStructureColorString();\n    method public String? getFillTunnelStructureColorUseTheme();\n    method public Double? getFillZOffset();\n    method public com.mapbox.geojson.Polygon? getOffsetGeometry(com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate mapCameraManagerDelegate, com.mapbox.android.gestures.MoveDistancesObject moveDistancesObject);\n    method public java.util.List<java.util.List<com.mapbox.geojson.Point>> getPoints();\n    method public com.mapbox.maps.plugin.annotation.AnnotationType getType();\n    method public void setFillBridgeGuardRailColorInt(@ColorInt Integer?);\n    method public void setFillBridgeGuardRailColorString(String?);\n    method public void setFillBridgeGuardRailColorUseTheme(String?);\n    method public void setFillColorInt(@ColorInt Integer?);\n    method public void setFillColorString(String?);\n    method public void setFillColorUseTheme(String?);\n    method public void setFillConstructBridgeGuardRail(Boolean?);\n    method public void setFillOpacity(Double?);\n    method public void setFillOutlineColorInt(@ColorInt Integer?);\n    method public void setFillOutlineColorString(String?);\n    method public void setFillOutlineColorUseTheme(String?);\n    method public void setFillPattern(String?);\n    method public void setFillSortKey(Double?);\n    method public void setFillTunnelStructureColorInt(@ColorInt Integer?);\n    method public void setFillTunnelStructureColorString(String?);\n    method public void setFillTunnelStructureColorUseTheme(String?);\n    method public void setFillZOffset(Double?);\n    method public void setPoints(java.util.List<? extends java.util.List<com.mapbox.geojson.Point>>);\n    method public void setUsedDataDrivenProperties();\n    property @ColorInt public final Integer? fillBridgeGuardRailColorInt;\n    property public final String? fillBridgeGuardRailColorString;\n    property public final String? fillBridgeGuardRailColorUseTheme;\n    property @ColorInt public final Integer? fillColorInt;\n    property public final String? fillColorString;\n    property public final String? fillColorUseTheme;\n    property public final Boolean? fillConstructBridgeGuardRail;\n    property public final Double? fillOpacity;\n    property @ColorInt public final Integer? fillOutlineColorInt;\n    property public final String? fillOutlineColorString;\n    property public final String? fillOutlineColorUseTheme;\n    property public final String? fillPattern;\n    property public final Double? fillSortKey;\n    property @ColorInt public final Integer? fillTunnelStructureColorInt;\n    property public final String? fillTunnelStructureColorString;\n    property public final String? fillTunnelStructureColorUseTheme;\n    property public final Double? fillZOffset;\n    property public final java.util.List<java.util.List<com.mapbox.geojson.Point>> points;\n    field public static final com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation.Companion Companion;\n    field public static final String ID_KEY = \"PolygonAnnotation\";\n  }\n\n  public static final class PolygonAnnotation.Companion {\n  }\n\n  public final class PolygonAnnotationManager extends com.mapbox.maps.plugin.annotation.AnnotationManagerImpl<com.mapbox.geojson.Polygon,com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions,com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationDragListener,com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationClickListener,com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationLongClickListener,com.mapbox.maps.plugin.annotation.generated.OnPolygonAnnotationInteractionListener,com.mapbox.maps.extension.style.layers.generated.FillLayer> {\n    ctor public PolygonAnnotationManager(com.mapbox.maps.plugin.delegates.MapDelegateProvider delegateProvider, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null);\n    method public java.util.List<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation> create(String json);\n    method public java.util.List<com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation> create(com.mapbox.geojson.FeatureCollection featureCollection);\n    method public String getAnnotationIdKey();\n    method public Boolean? getFillAntialias();\n    method @ColorInt public Integer? getFillBridgeGuardRailColorInt();\n    method public String? getFillBridgeGuardRailColorString();\n    method public String? getFillBridgeGuardRailColorUseTheme();\n    method @ColorInt public Integer? getFillColorInt();\n    method public String? getFillColorString();\n    method public String? getFillColorUseTheme();\n    method public Boolean? getFillConstructBridgeGuardRail();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference? getFillElevationReference();\n    method public Double? getFillEmissiveStrength();\n    method public Double? getFillOpacity();\n    method @ColorInt public Integer? getFillOutlineColorInt();\n    method public String? getFillOutlineColorString();\n    method public String? getFillOutlineColorUseTheme();\n    method public String? getFillPattern();\n    method public Double? getFillPatternCrossFade();\n    method public Double? getFillSortKey();\n    method public java.util.List<java.lang.Double>? getFillTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor? getFillTranslateAnchor();\n    method @ColorInt public Integer? getFillTunnelStructureColorInt();\n    method public String? getFillTunnelStructureColorString();\n    method public String? getFillTunnelStructureColorUseTheme();\n    method public Double? getFillZOffset();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLayerFilter();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method protected void setDataDrivenPropertyIsUsed(String property);\n    method public void setFillAntialias(Boolean?);\n    method public void setFillBridgeGuardRailColorInt(@ColorInt Integer?);\n    method public void setFillBridgeGuardRailColorString(String?);\n    method public void setFillBridgeGuardRailColorUseTheme(String?);\n    method public void setFillColorInt(@ColorInt Integer?);\n    method public void setFillColorString(String?);\n    method public void setFillColorUseTheme(String?);\n    method public void setFillConstructBridgeGuardRail(Boolean?);\n    method public void setFillElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference?);\n    method public void setFillEmissiveStrength(Double?);\n    method public void setFillOpacity(Double?);\n    method public void setFillOutlineColorInt(@ColorInt Integer?);\n    method public void setFillOutlineColorString(String?);\n    method public void setFillOutlineColorUseTheme(String?);\n    method public void setFillPattern(String?);\n    method public void setFillPatternCrossFade(Double?);\n    method public void setFillSortKey(Double?);\n    method public void setFillTranslate(java.util.List<java.lang.Double>?);\n    method public void setFillTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor?);\n    method public void setFillTunnelStructureColorInt(@ColorInt Integer?);\n    method public void setFillTunnelStructureColorString(String?);\n    method public void setFillTunnelStructureColorUseTheme(String?);\n    method public void setFillZOffset(Double?);\n    method public void setLayerFilter(com.mapbox.maps.extension.style.expressions.generated.Expression?);\n    method public void setMaxZoom(Double?);\n    method public void setMinZoom(Double?);\n    method public void setSlot(String?);\n    property public final Boolean? fillAntialias;\n    property @ColorInt public final Integer? fillBridgeGuardRailColorInt;\n    property public final String? fillBridgeGuardRailColorString;\n    property public final String? fillBridgeGuardRailColorUseTheme;\n    property @ColorInt public final Integer? fillColorInt;\n    property public final String? fillColorString;\n    property public final String? fillColorUseTheme;\n    property public final Boolean? fillConstructBridgeGuardRail;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillElevationReference? fillElevationReference;\n    property public final Double? fillEmissiveStrength;\n    property public final Double? fillOpacity;\n    property @ColorInt public final Integer? fillOutlineColorInt;\n    property public final String? fillOutlineColorString;\n    property public final String? fillOutlineColorUseTheme;\n    property public final String? fillPattern;\n    property public final Double? fillPatternCrossFade;\n    property public final Double? fillSortKey;\n    property public final java.util.List<java.lang.Double>? fillTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.FillTranslateAnchor? fillTranslateAnchor;\n    property @ColorInt public final Integer? fillTunnelStructureColorInt;\n    property public final String? fillTunnelStructureColorString;\n    property public final String? fillTunnelStructureColorUseTheme;\n    property public final Double? fillZOffset;\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? layerFilter;\n    property public final Double? maxZoom;\n    property public final Double? minZoom;\n    property public final String? slot;\n    field public static final com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager.Companion Companion;\n  }\n\n  public static final class PolygonAnnotationManager.Companion {\n    method public java.util.concurrent.atomic.AtomicLong getID_GENERATOR();\n    method public void setID_GENERATOR(java.util.concurrent.atomic.AtomicLong);\n    property public final java.util.concurrent.atomic.AtomicLong ID_GENERATOR;\n  }\n\n  public final class PolygonAnnotationManagerKt {\n    method public static com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager createPolygonAnnotationManager(com.mapbox.maps.plugin.annotation.AnnotationPlugin, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null);\n  }\n\n  public final class PolygonAnnotationOptions implements com.mapbox.maps.plugin.annotation.AnnotationOptions<com.mapbox.geojson.Polygon,com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation> {\n    ctor public PolygonAnnotationOptions();\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation build(String id, com.mapbox.maps.plugin.annotation.AnnotationManager<com.mapbox.geojson.Polygon,com.mapbox.maps.plugin.annotation.generated.PolygonAnnotation,?,?,?,?,?> annotationManager);\n    method public com.google.gson.JsonElement? getData();\n    method public boolean getDraggable();\n    method public String? getFillBridgeGuardRailColor();\n    method public String? getFillBridgeGuardRailColorUseTheme();\n    method public String? getFillColor();\n    method public String? getFillColorUseTheme();\n    method public Boolean? getFillConstructBridgeGuardRail();\n    method public Double? getFillOpacity();\n    method public String? getFillOutlineColor();\n    method public String? getFillOutlineColorUseTheme();\n    method public String? getFillPattern();\n    method public Double? getFillSortKey();\n    method public String? getFillTunnelStructureColor();\n    method public String? getFillTunnelStructureColorUseTheme();\n    method public Double? getFillZOffset();\n    method public com.mapbox.geojson.Polygon? getGeometry();\n    method public java.util.List<java.util.List<com.mapbox.geojson.Point>> getPoints();\n    method public void setFillBridgeGuardRailColor(String?);\n    method public void setFillBridgeGuardRailColorUseTheme(String?);\n    method public void setFillColor(String?);\n    method public void setFillColorUseTheme(String?);\n    method public void setFillConstructBridgeGuardRail(Boolean?);\n    method public void setFillOpacity(Double?);\n    method public void setFillOutlineColor(String?);\n    method public void setFillOutlineColorUseTheme(String?);\n    method public void setFillPattern(String?);\n    method public void setFillSortKey(Double?);\n    method public void setFillTunnelStructureColor(String?);\n    method public void setFillTunnelStructureColorUseTheme(String?);\n    method public void setFillZOffset(Double?);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withData(com.google.gson.JsonElement jsonElement);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withDraggable(boolean draggable);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillBridgeGuardRailColor(String fillBridgeGuardRailColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillBridgeGuardRailColor(@ColorInt int fillBridgeGuardRailColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillBridgeGuardRailColorUseTheme(String fillBridgeGuardRailColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillColor(String fillColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillColor(@ColorInt int fillColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillColorUseTheme(String fillColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillConstructBridgeGuardRail(boolean fillConstructBridgeGuardRail);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillOpacity(double fillOpacity);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillOutlineColor(String fillOutlineColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillOutlineColor(@ColorInt int fillOutlineColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillOutlineColorUseTheme(String fillOutlineColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillPattern(String fillPattern);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillSortKey(double fillSortKey);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillTunnelStructureColor(String fillTunnelStructureColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillTunnelStructureColor(@ColorInt int fillTunnelStructureColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillTunnelStructureColorUseTheme(String fillTunnelStructureColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withFillZOffset(double fillZOffset);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withGeometry(com.mapbox.geojson.Polygon geometry);\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions withPoints(java.util.List<? extends java.util.List<com.mapbox.geojson.Point>> points);\n    property public final String? fillBridgeGuardRailColor;\n    property public final String? fillBridgeGuardRailColorUseTheme;\n    property public final String? fillColor;\n    property public final String? fillColorUseTheme;\n    property public final Boolean? fillConstructBridgeGuardRail;\n    property public final Double? fillOpacity;\n    property public final String? fillOutlineColor;\n    property public final String? fillOutlineColorUseTheme;\n    property public final String? fillPattern;\n    property public final Double? fillSortKey;\n    property public final String? fillTunnelStructureColor;\n    property public final String? fillTunnelStructureColorUseTheme;\n    property public final Double? fillZOffset;\n    field public static final com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions.Companion Companion;\n    field public static final String PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR = \"fill-bridge-guard-rail-color\";\n    field public static final String PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME = \"fill-bridge-guard-rail-color-use-theme\";\n    field public static final String PROPERTY_FILL_COLOR = \"fill-color\";\n    field public static final String PROPERTY_FILL_COLOR_USE_THEME = \"fill-color-use-theme\";\n    field public static final String PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL = \"fill-construct-bridge-guard-rail\";\n    field public static final String PROPERTY_FILL_OPACITY = \"fill-opacity\";\n    field public static final String PROPERTY_FILL_OUTLINE_COLOR = \"fill-outline-color\";\n    field public static final String PROPERTY_FILL_OUTLINE_COLOR_USE_THEME = \"fill-outline-color-use-theme\";\n    field public static final String PROPERTY_FILL_PATTERN = \"fill-pattern\";\n    field public static final String PROPERTY_FILL_SORT_KEY = \"fill-sort-key\";\n    field public static final String PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR = \"fill-tunnel-structure-color\";\n    field public static final String PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME = \"fill-tunnel-structure-color-use-theme\";\n    field public static final String PROPERTY_FILL_Z_OFFSET = \"fill-z-offset\";\n  }\n\n  public static final class PolygonAnnotationOptions.Companion {\n    method public com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationOptions? fromFeature(com.mapbox.geojson.Feature feature);\n  }\n\n  public final class PolylineAnnotation extends com.mapbox.maps.plugin.annotation.Annotation<com.mapbox.geojson.LineString> {\n    ctor public PolylineAnnotation(String id, com.mapbox.maps.plugin.annotation.AnnotationManager<com.mapbox.geojson.LineString,com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,?,?,?,?,?> annotationManager, com.google.gson.JsonObject jsonObject, com.mapbox.geojson.LineString geometry);\n    method public Double? getLineBlur();\n    method @ColorInt public Integer? getLineBorderColorInt();\n    method public String? getLineBorderColorString();\n    method public String? getLineBorderColorUseTheme();\n    method public Double? getLineBorderWidth();\n    method @ColorInt public Integer? getLineColorInt();\n    method public String? getLineColorString();\n    method public String? getLineColorUseTheme();\n    method public Double? getLineElevationGroundScale();\n    method public Double? getLineEmissiveStrength();\n    method public Double? getLineGapWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? getLineJoin();\n    method public Double? getLineOffset();\n    method public Double? getLineOpacity();\n    method public String? getLinePattern();\n    method public Double? getLineSortKey();\n    method public Double? getLineWidth();\n    method public Double? getLineZOffset();\n    method public com.mapbox.geojson.LineString? getOffsetGeometry(com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate mapCameraManagerDelegate, com.mapbox.android.gestures.MoveDistancesObject moveDistancesObject);\n    method public java.util.List<com.mapbox.geojson.Point> getPoints();\n    method public com.mapbox.maps.plugin.annotation.AnnotationType getType();\n    method public void setLineBlur(Double?);\n    method public void setLineBorderColorInt(@ColorInt Integer?);\n    method public void setLineBorderColorString(String?);\n    method public void setLineBorderColorUseTheme(String?);\n    method public void setLineBorderWidth(Double?);\n    method public void setLineColorInt(@ColorInt Integer?);\n    method public void setLineColorString(String?);\n    method public void setLineColorUseTheme(String?);\n    method public void setLineElevationGroundScale(Double?);\n    method public void setLineEmissiveStrength(Double?);\n    method public void setLineGapWidth(Double?);\n    method public void setLineJoin(com.mapbox.maps.extension.style.layers.properties.generated.LineJoin?);\n    method public void setLineOffset(Double?);\n    method public void setLineOpacity(Double?);\n    method public void setLinePattern(String?);\n    method public void setLineSortKey(Double?);\n    method public void setLineWidth(Double?);\n    method public void setLineZOffset(Double?);\n    method public void setPoints(java.util.List<com.mapbox.geojson.Point>);\n    method public void setUsedDataDrivenProperties();\n    property public final Double? lineBlur;\n    property @ColorInt public final Integer? lineBorderColorInt;\n    property public final String? lineBorderColorString;\n    property public final String? lineBorderColorUseTheme;\n    property public final Double? lineBorderWidth;\n    property @ColorInt public final Integer? lineColorInt;\n    property public final String? lineColorString;\n    property public final String? lineColorUseTheme;\n    property public final Double? lineElevationGroundScale;\n    property public final Double? lineEmissiveStrength;\n    property public final Double? lineGapWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? lineJoin;\n    property public final Double? lineOffset;\n    property public final Double? lineOpacity;\n    property public final String? linePattern;\n    property public final Double? lineSortKey;\n    property public final Double? lineWidth;\n    property public final Double? lineZOffset;\n    property public final java.util.List<com.mapbox.geojson.Point> points;\n    field public static final com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation.Companion Companion;\n    field public static final String ID_KEY = \"PolylineAnnotation\";\n  }\n\n  public static final class PolylineAnnotation.Companion {\n  }\n\n  public final class PolylineAnnotationManager extends com.mapbox.maps.plugin.annotation.AnnotationManagerImpl<com.mapbox.geojson.LineString,com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions,com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationDragListener,com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationClickListener,com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationLongClickListener,com.mapbox.maps.plugin.annotation.generated.OnPolylineAnnotationInteractionListener,com.mapbox.maps.extension.style.layers.generated.LineLayer> {\n    ctor public PolylineAnnotationManager(com.mapbox.maps.plugin.delegates.MapDelegateProvider delegateProvider, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null);\n    method public java.util.List<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation> create(String json);\n    method public java.util.List<com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation> create(com.mapbox.geojson.FeatureCollection featureCollection);\n    method public String getAnnotationIdKey();\n    method public com.mapbox.maps.extension.style.expressions.generated.Expression? getLayerFilter();\n    method public Double? getLineBlur();\n    method @ColorInt public Integer? getLineBorderColorInt();\n    method public String? getLineBorderColorString();\n    method public String? getLineBorderColorUseTheme();\n    method public Double? getLineBorderWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineCap? getLineCap();\n    method @ColorInt public Integer? getLineColorInt();\n    method public String? getLineColorString();\n    method public String? getLineColorUseTheme();\n    method public Double? getLineCrossSlope();\n    method public Double? getLineCutoutFadeWidth();\n    method public Double? getLineCutoutOpacity();\n    method public java.util.List<java.lang.Double>? getLineDasharray();\n    method public Double? getLineDepthOcclusionFactor();\n    method public Double? getLineElevationGroundScale();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference? getLineElevationReference();\n    method public Double? getLineEmissiveStrength();\n    method public Double? getLineGapWidth();\n    method public String? getLineGradientUseTheme();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? getLineJoin();\n    method public Double? getLineMiterLimit();\n    method public Double? getLineOcclusionOpacity();\n    method public Double? getLineOffset();\n    method public Double? getLineOpacity();\n    method public String? getLinePattern();\n    method public Double? getLinePatternCrossFade();\n    method public Double? getLineRoundLimit();\n    method public Double? getLineSortKey();\n    method public java.util.List<java.lang.Double>? getLineTranslate();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor? getLineTranslateAnchor();\n    method @Deprecated public String? getLineTrimColor();\n    method @ColorInt public Integer? getLineTrimColorInt();\n    method public String? getLineTrimColorString();\n    method public String? getLineTrimColorUseTheme();\n    method public java.util.List<java.lang.Double>? getLineTrimFadeRange();\n    method public java.util.List<java.lang.Double>? getLineTrimOffset();\n    method public Double? getLineWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit? getLineWidthUnit();\n    method public Double? getLineZOffset();\n    method public Double? getMaxZoom();\n    method public Double? getMinZoom();\n    method public String? getSlot();\n    method protected void setDataDrivenPropertyIsUsed(String property);\n    method public void setLayerFilter(com.mapbox.maps.extension.style.expressions.generated.Expression?);\n    method public void setLineBlur(Double?);\n    method public void setLineBorderColorInt(@ColorInt Integer?);\n    method public void setLineBorderColorString(String?);\n    method public void setLineBorderColorUseTheme(String?);\n    method public void setLineBorderWidth(Double?);\n    method public void setLineCap(com.mapbox.maps.extension.style.layers.properties.generated.LineCap?);\n    method public void setLineColorInt(@ColorInt Integer?);\n    method public void setLineColorString(String?);\n    method public void setLineColorUseTheme(String?);\n    method public void setLineCrossSlope(Double?);\n    method public void setLineCutoutFadeWidth(Double?);\n    method public void setLineCutoutOpacity(Double?);\n    method public void setLineDasharray(java.util.List<java.lang.Double>?);\n    method public void setLineDepthOcclusionFactor(Double?);\n    method public void setLineElevationGroundScale(Double?);\n    method public void setLineElevationReference(com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference?);\n    method public void setLineEmissiveStrength(Double?);\n    method public void setLineGapWidth(Double?);\n    method public void setLineGradientUseTheme(String?);\n    method public void setLineJoin(com.mapbox.maps.extension.style.layers.properties.generated.LineJoin?);\n    method public void setLineMiterLimit(Double?);\n    method public void setLineOcclusionOpacity(Double?);\n    method public void setLineOffset(Double?);\n    method public void setLineOpacity(Double?);\n    method public void setLinePattern(String?);\n    method public void setLinePatternCrossFade(Double?);\n    method public void setLineRoundLimit(Double?);\n    method public void setLineSortKey(Double?);\n    method public void setLineTranslate(java.util.List<java.lang.Double>?);\n    method public void setLineTranslateAnchor(com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor?);\n    method @Deprecated public void setLineTrimColor(String?);\n    method public void setLineTrimColorInt(@ColorInt Integer?);\n    method public void setLineTrimColorString(String?);\n    method public void setLineTrimColorUseTheme(String?);\n    method public void setLineTrimFadeRange(java.util.List<java.lang.Double>?);\n    method public void setLineTrimOffset(java.util.List<java.lang.Double>?);\n    method public void setLineWidth(Double?);\n    method public void setLineWidthUnit(com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit?);\n    method public void setLineZOffset(Double?);\n    method public void setMaxZoom(Double?);\n    method public void setMinZoom(Double?);\n    method public void setSlot(String?);\n    property public com.mapbox.maps.extension.style.expressions.generated.Expression? layerFilter;\n    property public final Double? lineBlur;\n    property @ColorInt public final Integer? lineBorderColorInt;\n    property public final String? lineBorderColorString;\n    property public final String? lineBorderColorUseTheme;\n    property public final Double? lineBorderWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineCap? lineCap;\n    property @ColorInt public final Integer? lineColorInt;\n    property public final String? lineColorString;\n    property public final String? lineColorUseTheme;\n    property public final Double? lineCrossSlope;\n    property public final Double? lineCutoutFadeWidth;\n    property public final Double? lineCutoutOpacity;\n    property public final java.util.List<java.lang.Double>? lineDasharray;\n    property public final Double? lineDepthOcclusionFactor;\n    property public final Double? lineElevationGroundScale;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineElevationReference? lineElevationReference;\n    property public final Double? lineEmissiveStrength;\n    property public final Double? lineGapWidth;\n    property public final String? lineGradientUseTheme;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? lineJoin;\n    property public final Double? lineMiterLimit;\n    property public final Double? lineOcclusionOpacity;\n    property public final Double? lineOffset;\n    property public final Double? lineOpacity;\n    property public final String? linePattern;\n    property public final Double? linePatternCrossFade;\n    property public final Double? lineRoundLimit;\n    property public final Double? lineSortKey;\n    property public final java.util.List<java.lang.Double>? lineTranslate;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineTranslateAnchor? lineTranslateAnchor;\n    property @Deprecated public final String? lineTrimColor;\n    property @ColorInt public final Integer? lineTrimColorInt;\n    property public final String? lineTrimColorString;\n    property public final String? lineTrimColorUseTheme;\n    property public final java.util.List<java.lang.Double>? lineTrimFadeRange;\n    property public final java.util.List<java.lang.Double>? lineTrimOffset;\n    property public final Double? lineWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineWidthUnit? lineWidthUnit;\n    property public final Double? lineZOffset;\n    property public final Double? maxZoom;\n    property public final Double? minZoom;\n    property public final String? slot;\n    field public static final com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager.Companion Companion;\n  }\n\n  public static final class PolylineAnnotationManager.Companion {\n    method public java.util.concurrent.atomic.AtomicLong getID_GENERATOR();\n    method public void setID_GENERATOR(java.util.concurrent.atomic.AtomicLong);\n    property public final java.util.concurrent.atomic.AtomicLong ID_GENERATOR;\n  }\n\n  public final class PolylineAnnotationManagerKt {\n    method public static com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager createPolylineAnnotationManager(com.mapbox.maps.plugin.annotation.AnnotationPlugin, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig = null);\n  }\n\n  public final class PolylineAnnotationOptions implements com.mapbox.maps.plugin.annotation.AnnotationOptions<com.mapbox.geojson.LineString,com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation> {\n    ctor public PolylineAnnotationOptions();\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation build(String id, com.mapbox.maps.plugin.annotation.AnnotationManager<com.mapbox.geojson.LineString,com.mapbox.maps.plugin.annotation.generated.PolylineAnnotation,?,?,?,?,?> annotationManager);\n    method public com.google.gson.JsonElement? getData();\n    method public boolean getDraggable();\n    method public com.mapbox.geojson.LineString? getGeometry();\n    method public Double? getLineBlur();\n    method public String? getLineBorderColor();\n    method public String? getLineBorderColorUseTheme();\n    method public Double? getLineBorderWidth();\n    method public String? getLineColor();\n    method public String? getLineColorUseTheme();\n    method public Double? getLineElevationGroundScale();\n    method public Double? getLineEmissiveStrength();\n    method public Double? getLineGapWidth();\n    method public com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? getLineJoin();\n    method public Double? getLineOffset();\n    method public Double? getLineOpacity();\n    method public String? getLinePattern();\n    method public Double? getLineSortKey();\n    method public Double? getLineWidth();\n    method public Double? getLineZOffset();\n    method public java.util.List<com.mapbox.geojson.Point> getPoints();\n    method public void setLineBlur(Double?);\n    method public void setLineBorderColor(String?);\n    method public void setLineBorderColorUseTheme(String?);\n    method public void setLineBorderWidth(Double?);\n    method public void setLineColor(String?);\n    method public void setLineColorUseTheme(String?);\n    method public void setLineElevationGroundScale(Double?);\n    method public void setLineEmissiveStrength(Double?);\n    method public void setLineGapWidth(Double?);\n    method public void setLineJoin(com.mapbox.maps.extension.style.layers.properties.generated.LineJoin?);\n    method public void setLineOffset(Double?);\n    method public void setLineOpacity(Double?);\n    method public void setLinePattern(String?);\n    method public void setLineSortKey(Double?);\n    method public void setLineWidth(Double?);\n    method public void setLineZOffset(Double?);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withData(com.google.gson.JsonElement jsonElement);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withDraggable(boolean draggable);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withGeometry(com.mapbox.geojson.LineString geometry);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineBlur(double lineBlur);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineBorderColor(String lineBorderColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineBorderColor(@ColorInt int lineBorderColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineBorderColorUseTheme(String lineBorderColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineBorderWidth(double lineBorderWidth);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineColor(String lineColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineColor(@ColorInt int lineColor);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineColorUseTheme(String lineColorUseTheme);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineElevationGroundScale(double lineElevationGroundScale);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineEmissiveStrength(double lineEmissiveStrength);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineGapWidth(double lineGapWidth);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineJoin(com.mapbox.maps.extension.style.layers.properties.generated.LineJoin lineJoin);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineOffset(double lineOffset);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineOpacity(double lineOpacity);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLinePattern(String linePattern);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineSortKey(double lineSortKey);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineWidth(double lineWidth);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withLineZOffset(double lineZOffset);\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions withPoints(java.util.List<com.mapbox.geojson.Point> points);\n    property public final Double? lineBlur;\n    property public final String? lineBorderColor;\n    property public final String? lineBorderColorUseTheme;\n    property public final Double? lineBorderWidth;\n    property public final String? lineColor;\n    property public final String? lineColorUseTheme;\n    property public final Double? lineElevationGroundScale;\n    property public final Double? lineEmissiveStrength;\n    property public final Double? lineGapWidth;\n    property public final com.mapbox.maps.extension.style.layers.properties.generated.LineJoin? lineJoin;\n    property public final Double? lineOffset;\n    property public final Double? lineOpacity;\n    property public final String? linePattern;\n    property public final Double? lineSortKey;\n    property public final Double? lineWidth;\n    property public final Double? lineZOffset;\n    field public static final com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions.Companion Companion;\n    field public static final String PROPERTY_LINE_BLUR = \"line-blur\";\n    field public static final String PROPERTY_LINE_BORDER_COLOR = \"line-border-color\";\n    field public static final String PROPERTY_LINE_BORDER_COLOR_USE_THEME = \"line-border-color-use-theme\";\n    field public static final String PROPERTY_LINE_BORDER_WIDTH = \"line-border-width\";\n    field public static final String PROPERTY_LINE_COLOR = \"line-color\";\n    field public static final String PROPERTY_LINE_COLOR_USE_THEME = \"line-color-use-theme\";\n    field public static final String PROPERTY_LINE_ELEVATION_GROUND_SCALE = \"line-elevation-ground-scale\";\n    field public static final String PROPERTY_LINE_EMISSIVE_STRENGTH = \"line-emissive-strength\";\n    field public static final String PROPERTY_LINE_GAP_WIDTH = \"line-gap-width\";\n    field public static final String PROPERTY_LINE_JOIN = \"line-join\";\n    field public static final String PROPERTY_LINE_OFFSET = \"line-offset\";\n    field public static final String PROPERTY_LINE_OPACITY = \"line-opacity\";\n    field public static final String PROPERTY_LINE_PATTERN = \"line-pattern\";\n    field public static final String PROPERTY_LINE_SORT_KEY = \"line-sort-key\";\n    field public static final String PROPERTY_LINE_WIDTH = \"line-width\";\n    field public static final String PROPERTY_LINE_Z_OFFSET = \"line-z-offset\";\n  }\n\n  public static final class PolylineAnnotationOptions.Companion {\n    method public com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationOptions? fromFeature(com.mapbox.geojson.Feature feature);\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-annotation/api/plugin-annotation.api",
    "content": "public abstract class com/mapbox/maps/plugin/annotation/AnnotationManagerImpl : com/mapbox/maps/plugin/annotation/AnnotationManager {\n\tpublic fun addClickListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationClickListener;)Z\n\tpublic fun addDragListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationDragListener;)Z\n\tpublic fun addInteractionListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener;)Z\n\tpublic fun addLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener;)Z\n\tpublic fun create (Lcom/mapbox/maps/plugin/annotation/AnnotationOptions;)Lcom/mapbox/maps/plugin/annotation/Annotation;\n\tpublic fun create (Ljava/util/List;)Ljava/util/List;\n\tpublic fun delete (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n\tpublic fun delete (Ljava/util/List;)V\n\tpublic fun deleteAll ()V\n\tpublic fun enableDataDrivenProperty (Ljava/lang/String;)V\n\tpublic abstract fun getAnnotationIdKey ()Ljava/lang/String;\n\tpublic fun getAnnotations ()Ljava/util/List;\n\tpublic final fun getAssociatedLayers ()Ljava/util/List;\n\tpublic fun getClickListeners ()Ljava/util/List;\n\tprotected final fun getDataDrivenPropertyUsageMap ()Ljava/util/Map;\n\tpublic final fun getDelegateProvider ()Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;\n\tpublic fun getDragListeners ()Ljava/util/List;\n\tpublic fun getInteractionListener ()Ljava/util/List;\n\tpublic abstract fun getLayerFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic fun getLongClickListeners ()Ljava/util/List;\n\tpublic fun onDestroy ()V\n\tpublic fun onSizeChanged (II)V\n\tpublic final fun queryMapForFeatures (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/plugin/annotation/Annotation;\n\tpublic final fun queryMapForFeatures (Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/plugin/annotation/Annotation;\n\tpublic fun removeClickListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationClickListener;)Z\n\tpublic fun removeDragListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationDragListener;)Z\n\tpublic fun removeInteractionListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener;)Z\n\tpublic fun removeLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener;)Z\n\tpublic fun selectAnnotation (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n\tprotected abstract fun setDataDrivenPropertyIsUsed (Ljava/lang/String;)V\n\tpublic abstract fun setLayerFilter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tprotected final fun setLayerProperty (Lcom/mapbox/bindgen/Value;Ljava/lang/String;)V\n\tpublic fun update (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n\tpublic fun update (Ljava/util/List;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/AnnotationManagerImpl$MapClick : com/mapbox/maps/plugin/gestures/OnMapClickListener {\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/annotation/AnnotationManagerImpl;)V\n\tpublic fun onMapClick (Lcom/mapbox/geojson/Point;)Z\n}\n\npublic final class com/mapbox/maps/plugin/annotation/AnnotationManagerImpl$MapLongClick : com/mapbox/maps/plugin/gestures/OnMapLongClickListener {\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/annotation/AnnotationManagerImpl;)V\n\tpublic fun onMapLongClick (Lcom/mapbox/geojson/Point;)Z\n}\n\npublic final class com/mapbox/maps/plugin/annotation/AnnotationManagerImpl$MapMove : com/mapbox/maps/plugin/gestures/OnMoveListener {\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/annotation/AnnotationManagerImpl;)V\n\tpublic fun onMove (Lcom/mapbox/android/gestures/MoveGestureDetector;)Z\n\tpublic fun onMoveBegin (Lcom/mapbox/android/gestures/MoveGestureDetector;)V\n\tpublic fun onMoveEnd (Lcom/mapbox/android/gestures/MoveGestureDetector;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/AnnotationsUtils {\n\tpublic static final synthetic fun createAnnotationPlugin ()Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;\n\tpublic static final fun getAnnotations (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/ConvertUtils {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/plugin/annotation/ConvertUtils;\n\tpublic final fun calculateMercatorCoordinateShift (Lcom/mapbox/geojson/Point;Lcom/mapbox/geojson/Point;D)Lcom/mapbox/maps/MercatorCoordinate;\n\tpublic final fun convertDoubleArray (Ljava/util/List;)Lcom/google/gson/JsonArray;\n\tpublic final fun convertStringArray (Ljava/util/List;)Lcom/google/gson/JsonArray;\n\tpublic final fun shiftPointWithMercatorCoordinate (Lcom/mapbox/geojson/Point;Lcom/mapbox/maps/MercatorCoordinate;D)Lcom/mapbox/geojson/Point;\n\tpublic final fun toDoubleArray (Lcom/google/gson/JsonArray;)Ljava/util/List;\n\tpublic final fun toStringArray (Lcom/google/gson/JsonArray;)Ljava/util/List;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/QueryAnnotationCallback {\n\tpublic abstract fun onQueryAnnotation (Ljava/lang/Object;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/CircleAnnotation : com/mapbox/maps/plugin/annotation/Annotation {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotation$Companion;\n\tpublic static final field ID_KEY Ljava/lang/String;\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/google/gson/JsonObject;Lcom/mapbox/geojson/Point;)V\n\tpublic final fun getCircleBlur ()Ljava/lang/Double;\n\tpublic final fun getCircleColorInt ()Ljava/lang/Integer;\n\tpublic final fun getCircleColorString ()Ljava/lang/String;\n\tpublic final fun getCircleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleRadius ()Ljava/lang/Double;\n\tpublic final fun getCircleSortKey ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeColorInt ()Ljava/lang/Integer;\n\tpublic final fun getCircleStrokeColorString ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeWidth ()Ljava/lang/Double;\n\tpublic synthetic fun getOffsetGeometry (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/android/gestures/MoveDistancesObject;)Lcom/mapbox/geojson/Geometry;\n\tpublic fun getOffsetGeometry (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/android/gestures/MoveDistancesObject;)Lcom/mapbox/geojson/Point;\n\tpublic final fun getPoint ()Lcom/mapbox/geojson/Point;\n\tpublic fun getType ()Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic final fun setCircleBlur (Ljava/lang/Double;)V\n\tpublic final fun setCircleColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setCircleColorString (Ljava/lang/String;)V\n\tpublic final fun setCircleColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCircleRadius (Ljava/lang/Double;)V\n\tpublic final fun setCircleSortKey (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setCircleStrokeColorString (Ljava/lang/String;)V\n\tpublic final fun setCircleStrokeColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleStrokeOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeWidth (Ljava/lang/Double;)V\n\tpublic final fun setPoint (Lcom/mapbox/geojson/Point;)V\n\tpublic fun setUsedDataDrivenProperties ()V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/CircleAnnotation$Companion {\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/CircleAnnotationManager : com/mapbox/maps/plugin/annotation/AnnotationManagerImpl, com/mapbox/maps/plugin/annotation/ClusterAnnotationManager {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationManager$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun addClusterClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterClickListener;)Z\n\tpublic fun addClusterLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterLongClickListener;)Z\n\tpublic final fun create (Lcom/mapbox/geojson/FeatureCollection;)Ljava/util/List;\n\tpublic final fun create (Ljava/lang/String;)Ljava/util/List;\n\tpublic fun getAnnotationIdKey ()Ljava/lang/String;\n\tpublic final fun getCircleBlur ()Ljava/lang/Double;\n\tpublic final fun getCircleColorInt ()Ljava/lang/Integer;\n\tpublic final fun getCircleColorString ()Ljava/lang/String;\n\tpublic final fun getCircleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;\n\tpublic final fun getCircleEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getCircleOpacity ()Ljava/lang/Double;\n\tpublic final fun getCirclePitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;\n\tpublic final fun getCirclePitchScale ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;\n\tpublic final fun getCircleRadius ()Ljava/lang/Double;\n\tpublic final fun getCircleSortKey ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeColorInt ()Ljava/lang/Integer;\n\tpublic final fun getCircleStrokeColorString ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeWidth ()Ljava/lang/Double;\n\tpublic final fun getCircleTranslate ()Ljava/util/List;\n\tpublic final fun getCircleTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;\n\tpublic fun getClusterClickListeners ()Ljava/util/List;\n\tpublic fun getClusterLongClickListeners ()Ljava/util/List;\n\tpublic fun getLayerFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getSlot ()Ljava/lang/String;\n\tpublic fun removeClusterClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterClickListener;)Z\n\tpublic fun removeClusterLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterLongClickListener;)Z\n\tpublic final fun setCircleBlur (Ljava/lang/Double;)V\n\tpublic final fun setCircleColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setCircleColorString (Ljava/lang/String;)V\n\tpublic final fun setCircleColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleElevationReference;)V\n\tpublic final fun setCircleEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setCircleOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCirclePitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchAlignment;)V\n\tpublic final fun setCirclePitchScale (Lcom/mapbox/maps/extension/style/layers/properties/generated/CirclePitchScale;)V\n\tpublic final fun setCircleRadius (Ljava/lang/Double;)V\n\tpublic final fun setCircleSortKey (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setCircleStrokeColorString (Ljava/lang/String;)V\n\tpublic final fun setCircleStrokeColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleStrokeOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeWidth (Ljava/lang/Double;)V\n\tpublic final fun setCircleTranslate (Ljava/util/List;)V\n\tpublic final fun setCircleTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/CircleTranslateAnchor;)V\n\tpublic fun setLayerFilter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun setMaxZoom (Ljava/lang/Double;)V\n\tpublic final fun setMinZoom (Ljava/lang/Double;)V\n\tpublic final fun setSlot (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/CircleAnnotationManager$Companion {\n\tpublic final fun getID_GENERATOR ()Ljava/util/concurrent/atomic/AtomicLong;\n\tpublic final fun setID_GENERATOR (Ljava/util/concurrent/atomic/AtomicLong;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/CircleAnnotationManagerKt {\n\tpublic static final fun createCircleAnnotationManager (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationManager;\n\tpublic static synthetic fun createCircleAnnotationManager$default (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationManager;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions : com/mapbox/maps/plugin/annotation/AnnotationOptions {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions$Companion;\n\tpublic static final field PROPERTY_CIRCLE_BLUR Ljava/lang/String;\n\tpublic static final field PROPERTY_CIRCLE_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_CIRCLE_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_CIRCLE_OPACITY Ljava/lang/String;\n\tpublic static final field PROPERTY_CIRCLE_RADIUS Ljava/lang/String;\n\tpublic static final field PROPERTY_CIRCLE_SORT_KEY Ljava/lang/String;\n\tpublic static final field PROPERTY_CIRCLE_STROKE_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_CIRCLE_STROKE_OPACITY Ljava/lang/String;\n\tpublic static final field PROPERTY_CIRCLE_STROKE_WIDTH Ljava/lang/String;\n\tpublic fun <init> ()V\n\tpublic synthetic fun build (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)Lcom/mapbox/maps/plugin/annotation/Annotation;\n\tpublic fun build (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotation;\n\tpublic final fun getCircleBlur ()Ljava/lang/Double;\n\tpublic final fun getCircleColor ()Ljava/lang/String;\n\tpublic final fun getCircleColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleRadius ()Ljava/lang/Double;\n\tpublic final fun getCircleSortKey ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeColor ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getCircleStrokeOpacity ()Ljava/lang/Double;\n\tpublic final fun getCircleStrokeWidth ()Ljava/lang/Double;\n\tpublic final fun getData ()Lcom/google/gson/JsonElement;\n\tpublic final fun getDraggable ()Z\n\tpublic final fun getGeometry ()Lcom/mapbox/geojson/Point;\n\tpublic final fun getPoint ()Lcom/mapbox/geojson/Point;\n\tpublic final fun setCircleBlur (Ljava/lang/Double;)V\n\tpublic final fun setCircleColor (Ljava/lang/String;)V\n\tpublic final fun setCircleColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCircleRadius (Ljava/lang/Double;)V\n\tpublic final fun setCircleSortKey (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeColor (Ljava/lang/String;)V\n\tpublic final fun setCircleStrokeColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setCircleStrokeOpacity (Ljava/lang/Double;)V\n\tpublic final fun setCircleStrokeWidth (Ljava/lang/Double;)V\n\tpublic final fun withCircleBlur (D)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleColor (I)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleOpacity (D)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleRadius (D)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleSortKey (D)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleStrokeColor (I)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleStrokeColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleStrokeColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleStrokeOpacity (D)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withCircleStrokeWidth (D)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withData (Lcom/google/gson/JsonElement;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withDraggable (Z)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withGeometry (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n\tpublic final fun withPoint (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions$Companion {\n\tpublic final fun fromFeature (Lcom/mapbox/geojson/Feature;)Lcom/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnCircleAnnotationClickListener : com/mapbox/maps/plugin/annotation/OnAnnotationClickListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnCircleAnnotationDragListener : com/mapbox/maps/plugin/annotation/OnAnnotationDragListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnCircleAnnotationInteractionListener : com/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnCircleAnnotationLongClickListener : com/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPointAnnotationClickListener : com/mapbox/maps/plugin/annotation/OnAnnotationClickListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPointAnnotationDragListener : com/mapbox/maps/plugin/annotation/OnAnnotationDragListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPointAnnotationInteractionListener : com/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPointAnnotationLongClickListener : com/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPolygonAnnotationClickListener : com/mapbox/maps/plugin/annotation/OnAnnotationClickListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPolygonAnnotationDragListener : com/mapbox/maps/plugin/annotation/OnAnnotationDragListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPolygonAnnotationInteractionListener : com/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPolygonAnnotationLongClickListener : com/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPolylineAnnotationClickListener : com/mapbox/maps/plugin/annotation/OnAnnotationClickListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPolylineAnnotationDragListener : com/mapbox/maps/plugin/annotation/OnAnnotationDragListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPolylineAnnotationInteractionListener : com/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/generated/OnPolylineAnnotationLongClickListener : com/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener {\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PointAnnotation : com/mapbox/maps/plugin/annotation/Annotation {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotation$Companion;\n\tpublic static final field ICON_DEFAULT_NAME_PREFIX Ljava/lang/String;\n\tpublic static final field ID_KEY Ljava/lang/String;\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/google/gson/JsonObject;Lcom/mapbox/geojson/Point;)V\n\tpublic final fun getIconAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic final fun getIconColorInt ()Ljava/lang/Integer;\n\tpublic final fun getIconColorString ()Ljava/lang/String;\n\tpublic final fun getIconColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getIconHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getIconHaloColorInt ()Ljava/lang/Integer;\n\tpublic final fun getIconHaloColorString ()Ljava/lang/String;\n\tpublic final fun getIconHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getIconImage ()Ljava/lang/String;\n\tpublic final fun getIconImageBitmap ()Landroid/graphics/Bitmap;\n\tpublic final fun getIconImageCrossFade ()Ljava/lang/Double;\n\tpublic final fun getIconOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconOffset ()Ljava/util/List;\n\tpublic final fun getIconOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconRotate ()Ljava/lang/Double;\n\tpublic final fun getIconSize ()Ljava/lang/Double;\n\tpublic final fun getIconTextFit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic final fun getIconTextFitPadding ()Ljava/util/List;\n\tpublic synthetic fun getOffsetGeometry (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/android/gestures/MoveDistancesObject;)Lcom/mapbox/geojson/Geometry;\n\tpublic fun getOffsetGeometry (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/android/gestures/MoveDistancesObject;)Lcom/mapbox/geojson/Point;\n\tpublic final fun getPoint ()Lcom/mapbox/geojson/Point;\n\tpublic final fun getSymbolSortKey ()Ljava/lang/Double;\n\tpublic final fun getSymbolZOffset ()Ljava/lang/Double;\n\tpublic final fun getTextAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic final fun getTextColorInt ()Ljava/lang/Integer;\n\tpublic final fun getTextColorString ()Ljava/lang/String;\n\tpublic final fun getTextColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getTextField ()Ljava/lang/String;\n\tpublic final fun getTextHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getTextHaloColorInt ()Ljava/lang/Integer;\n\tpublic final fun getTextHaloColorString ()Ljava/lang/String;\n\tpublic final fun getTextHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getTextJustify ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic final fun getTextLetterSpacing ()Ljava/lang/Double;\n\tpublic final fun getTextLineHeight ()Ljava/lang/Double;\n\tpublic final fun getTextMaxWidth ()Ljava/lang/Double;\n\tpublic final fun getTextOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextOffset ()Ljava/util/List;\n\tpublic final fun getTextOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextRadialOffset ()Ljava/lang/Double;\n\tpublic final fun getTextRotate ()Ljava/lang/Double;\n\tpublic final fun getTextSize ()Ljava/lang/Double;\n\tpublic final fun getTextTransform ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic fun getType ()Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic final fun setIconAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;)V\n\tpublic final fun setIconColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setIconColorString (Ljava/lang/String;)V\n\tpublic final fun setIconColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setIconHaloColorString (Ljava/lang/String;)V\n\tpublic final fun setIconHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setIconImage (Ljava/lang/String;)V\n\tpublic final fun setIconImageBitmap (Landroid/graphics/Bitmap;)V\n\tpublic final fun setIconImageCrossFade (Ljava/lang/Double;)V\n\tpublic final fun setIconOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconOffset (Ljava/util/List;)V\n\tpublic final fun setIconOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconRotate (Ljava/lang/Double;)V\n\tpublic final fun setIconSize (Ljava/lang/Double;)V\n\tpublic final fun setIconTextFit (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;)V\n\tpublic final fun setIconTextFitPadding (Ljava/util/List;)V\n\tpublic final fun setPoint (Lcom/mapbox/geojson/Point;)V\n\tpublic final fun setSymbolSortKey (Ljava/lang/Double;)V\n\tpublic final fun setSymbolZOffset (Ljava/lang/Double;)V\n\tpublic final fun setTextAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;)V\n\tpublic final fun setTextColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setTextColorString (Ljava/lang/String;)V\n\tpublic final fun setTextColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setTextField (Ljava/lang/String;)V\n\tpublic final fun setTextHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setTextHaloColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setTextHaloColorString (Ljava/lang/String;)V\n\tpublic final fun setTextHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextJustify (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;)V\n\tpublic final fun setTextLetterSpacing (Ljava/lang/Double;)V\n\tpublic final fun setTextLineHeight (Ljava/lang/Double;)V\n\tpublic final fun setTextMaxWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextOffset (Ljava/util/List;)V\n\tpublic final fun setTextOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextRadialOffset (Ljava/lang/Double;)V\n\tpublic final fun setTextRotate (Ljava/lang/Double;)V\n\tpublic final fun setTextSize (Ljava/lang/Double;)V\n\tpublic final fun setTextTransform (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;)V\n\tpublic fun setUsedDataDrivenProperties ()V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PointAnnotation$Companion {\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PointAnnotationManager : com/mapbox/maps/plugin/annotation/AnnotationManagerImpl, com/mapbox/maps/plugin/annotation/ClusterAnnotationManager {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationManager$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun addClusterClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterClickListener;)Z\n\tpublic fun addClusterLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterLongClickListener;)Z\n\tpublic final fun create (Lcom/mapbox/geojson/FeatureCollection;)Ljava/util/List;\n\tpublic final fun create (Ljava/lang/String;)Ljava/util/List;\n\tpublic fun getAnnotationIdKey ()Ljava/lang/String;\n\tpublic fun getClusterClickListeners ()Ljava/util/List;\n\tpublic fun getClusterLongClickListeners ()Ljava/util/List;\n\tpublic final fun getIconAllowOverlap ()Ljava/lang/Boolean;\n\tpublic final fun getIconAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic final fun getIconColorBrightnessMax ()Ljava/lang/Double;\n\tpublic final fun getIconColorBrightnessMin ()Ljava/lang/Double;\n\tpublic final fun getIconColorContrast ()Ljava/lang/Double;\n\tpublic final fun getIconColorInt ()Ljava/lang/Integer;\n\tpublic final fun getIconColorSaturation ()Ljava/lang/Double;\n\tpublic final fun getIconColorString ()Ljava/lang/String;\n\tpublic final fun getIconColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getIconHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getIconHaloColorInt ()Ljava/lang/Integer;\n\tpublic final fun getIconHaloColorString ()Ljava/lang/String;\n\tpublic final fun getIconHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getIconIgnorePlacement ()Ljava/lang/Boolean;\n\tpublic final fun getIconImage ()Ljava/lang/String;\n\tpublic final fun getIconImageBitmap ()Landroid/graphics/Bitmap;\n\tpublic final fun getIconImageCrossFade ()Ljava/lang/Double;\n\tpublic final fun getIconKeepUpright ()Ljava/lang/Boolean;\n\tpublic final fun getIconOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconOffset ()Ljava/util/List;\n\tpublic final fun getIconOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconOptional ()Ljava/lang/Boolean;\n\tpublic final fun getIconPadding ()Ljava/lang/Double;\n\tpublic final fun getIconPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;\n\tpublic final fun getIconRotate ()Ljava/lang/Double;\n\tpublic final fun getIconRotationAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;\n\tpublic final fun getIconSize ()Ljava/lang/Double;\n\tpublic final fun getIconSizeScaleRange ()Ljava/util/List;\n\tpublic final fun getIconTextFit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic final fun getIconTextFitPadding ()Ljava/util/List;\n\tpublic final fun getIconTranslate ()Ljava/util/List;\n\tpublic final fun getIconTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;\n\tpublic fun getLayerFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getOcclusionOpacityMode ()Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;\n\tpublic final fun getSlot ()Ljava/lang/String;\n\tpublic final fun getSymbolAvoidEdges ()Ljava/lang/Boolean;\n\tpublic final fun getSymbolElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;\n\tpublic final fun getSymbolPlacement ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;\n\tpublic final fun getSymbolSortKey ()Ljava/lang/Double;\n\tpublic final fun getSymbolSpacing ()Ljava/lang/Double;\n\tpublic final fun getSymbolZElevate ()Ljava/lang/Boolean;\n\tpublic final fun getSymbolZOffset ()Ljava/lang/Double;\n\tpublic final fun getSymbolZOrder ()Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;\n\tpublic final fun getTextAllowOverlap ()Ljava/lang/Boolean;\n\tpublic final fun getTextAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic final fun getTextColorInt ()Ljava/lang/Integer;\n\tpublic final fun getTextColorString ()Ljava/lang/String;\n\tpublic final fun getTextColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getTextField ()Ljava/lang/String;\n\tpublic final fun getTextFont ()Ljava/util/List;\n\tpublic final fun getTextHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getTextHaloColorInt ()Ljava/lang/Integer;\n\tpublic final fun getTextHaloColorString ()Ljava/lang/String;\n\tpublic final fun getTextHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getTextIgnorePlacement ()Ljava/lang/Boolean;\n\tpublic final fun getTextJustify ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic final fun getTextKeepUpright ()Ljava/lang/Boolean;\n\tpublic final fun getTextLetterSpacing ()Ljava/lang/Double;\n\tpublic final fun getTextLineHeight ()Ljava/lang/Double;\n\tpublic final fun getTextMaxAngle ()Ljava/lang/Double;\n\tpublic final fun getTextMaxWidth ()Ljava/lang/Double;\n\tpublic final fun getTextOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextOffset ()Ljava/util/List;\n\tpublic final fun getTextOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextOptional ()Ljava/lang/Boolean;\n\tpublic final fun getTextPadding ()Ljava/lang/Double;\n\tpublic final fun getTextPitchAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;\n\tpublic final fun getTextRadialOffset ()Ljava/lang/Double;\n\tpublic final fun getTextRotate ()Ljava/lang/Double;\n\tpublic final fun getTextRotationAlignment ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;\n\tpublic final fun getTextSize ()Ljava/lang/Double;\n\tpublic final fun getTextSizeScaleRange ()Ljava/util/List;\n\tpublic final fun getTextTransform ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic final fun getTextTranslate ()Ljava/util/List;\n\tpublic final fun getTextTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;\n\tpublic final fun getTextVariableAnchor ()Ljava/util/List;\n\tpublic final fun getTextWritingMode ()Ljava/util/List;\n\tpublic fun removeClusterClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterClickListener;)Z\n\tpublic fun removeClusterLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterLongClickListener;)Z\n\tpublic final fun setIconAllowOverlap (Ljava/lang/Boolean;)V\n\tpublic final fun setIconAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;)V\n\tpublic final fun setIconColorBrightnessMax (Ljava/lang/Double;)V\n\tpublic final fun setIconColorBrightnessMin (Ljava/lang/Double;)V\n\tpublic final fun setIconColorContrast (Ljava/lang/Double;)V\n\tpublic final fun setIconColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setIconColorSaturation (Ljava/lang/Double;)V\n\tpublic final fun setIconColorString (Ljava/lang/String;)V\n\tpublic final fun setIconColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setIconHaloColorString (Ljava/lang/String;)V\n\tpublic final fun setIconHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setIconIgnorePlacement (Ljava/lang/Boolean;)V\n\tpublic final fun setIconImage (Ljava/lang/String;)V\n\tpublic final fun setIconImageBitmap (Landroid/graphics/Bitmap;)V\n\tpublic final fun setIconImageCrossFade (Ljava/lang/Double;)V\n\tpublic final fun setIconKeepUpright (Ljava/lang/Boolean;)V\n\tpublic final fun setIconOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconOffset (Ljava/util/List;)V\n\tpublic final fun setIconOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconOptional (Ljava/lang/Boolean;)V\n\tpublic final fun setIconPadding (Ljava/lang/Double;)V\n\tpublic final fun setIconPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconPitchAlignment;)V\n\tpublic final fun setIconRotate (Ljava/lang/Double;)V\n\tpublic final fun setIconRotationAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconRotationAlignment;)V\n\tpublic final fun setIconSize (Ljava/lang/Double;)V\n\tpublic final fun setIconSizeScaleRange (Ljava/util/List;)V\n\tpublic final fun setIconTextFit (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;)V\n\tpublic final fun setIconTextFitPadding (Ljava/util/List;)V\n\tpublic final fun setIconTranslate (Ljava/util/List;)V\n\tpublic final fun setIconTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTranslateAnchor;)V\n\tpublic fun setLayerFilter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun setMaxZoom (Ljava/lang/Double;)V\n\tpublic final fun setMinZoom (Ljava/lang/Double;)V\n\tpublic final fun setOcclusionOpacityMode (Lcom/mapbox/maps/extension/style/layers/properties/generated/OcclusionOpacityMode;)V\n\tpublic final fun setSlot (Ljava/lang/String;)V\n\tpublic final fun setSymbolAvoidEdges (Ljava/lang/Boolean;)V\n\tpublic final fun setSymbolElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolElevationReference;)V\n\tpublic final fun setSymbolPlacement (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolPlacement;)V\n\tpublic final fun setSymbolSortKey (Ljava/lang/Double;)V\n\tpublic final fun setSymbolSpacing (Ljava/lang/Double;)V\n\tpublic final fun setSymbolZElevate (Ljava/lang/Boolean;)V\n\tpublic final fun setSymbolZOffset (Ljava/lang/Double;)V\n\tpublic final fun setSymbolZOrder (Lcom/mapbox/maps/extension/style/layers/properties/generated/SymbolZOrder;)V\n\tpublic final fun setTextAllowOverlap (Ljava/lang/Boolean;)V\n\tpublic final fun setTextAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;)V\n\tpublic final fun setTextColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setTextColorString (Ljava/lang/String;)V\n\tpublic final fun setTextColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setTextField (Ljava/lang/String;)V\n\tpublic final fun setTextFont (Ljava/util/List;)V\n\tpublic final fun setTextHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setTextHaloColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setTextHaloColorString (Ljava/lang/String;)V\n\tpublic final fun setTextHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextIgnorePlacement (Ljava/lang/Boolean;)V\n\tpublic final fun setTextJustify (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;)V\n\tpublic final fun setTextKeepUpright (Ljava/lang/Boolean;)V\n\tpublic final fun setTextLetterSpacing (Ljava/lang/Double;)V\n\tpublic final fun setTextLineHeight (Ljava/lang/Double;)V\n\tpublic final fun setTextMaxAngle (Ljava/lang/Double;)V\n\tpublic final fun setTextMaxWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextOffset (Ljava/util/List;)V\n\tpublic final fun setTextOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextOptional (Ljava/lang/Boolean;)V\n\tpublic final fun setTextPadding (Ljava/lang/Double;)V\n\tpublic final fun setTextPitchAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextPitchAlignment;)V\n\tpublic final fun setTextRadialOffset (Ljava/lang/Double;)V\n\tpublic final fun setTextRotate (Ljava/lang/Double;)V\n\tpublic final fun setTextRotationAlignment (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextRotationAlignment;)V\n\tpublic final fun setTextSize (Ljava/lang/Double;)V\n\tpublic final fun setTextSizeScaleRange (Ljava/util/List;)V\n\tpublic final fun setTextTransform (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;)V\n\tpublic final fun setTextTranslate (Ljava/util/List;)V\n\tpublic final fun setTextTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTranslateAnchor;)V\n\tpublic final fun setTextVariableAnchor (Ljava/util/List;)V\n\tpublic final fun setTextWritingMode (Ljava/util/List;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PointAnnotationManager$Companion {\n\tpublic final fun getID_GENERATOR ()Ljava/util/concurrent/atomic/AtomicLong;\n\tpublic final fun setID_GENERATOR (Ljava/util/concurrent/atomic/AtomicLong;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PointAnnotationManagerKt {\n\tpublic static final fun createPointAnnotationManager (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationManager;\n\tpublic static synthetic fun createPointAnnotationManager$default (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationManager;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions : com/mapbox/maps/plugin/annotation/AnnotationOptions {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions$Companion;\n\tpublic static final field PROPERTY_ICON_ANCHOR Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_EMISSIVE_STRENGTH Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_HALO_BLUR Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_HALO_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_HALO_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_HALO_WIDTH Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_IMAGE Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_IMAGE_CROSS_FADE Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_OCCLUSION_OPACITY Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_OFFSET Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_OPACITY Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_ROTATE Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_SIZE Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_TEXT_FIT Ljava/lang/String;\n\tpublic static final field PROPERTY_ICON_TEXT_FIT_PADDING Ljava/lang/String;\n\tpublic static final field PROPERTY_SYMBOL_SORT_KEY Ljava/lang/String;\n\tpublic static final field PROPERTY_SYMBOL_Z_OFFSET Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_ANCHOR Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_EMISSIVE_STRENGTH Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_FIELD Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_HALO_BLUR Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_HALO_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_HALO_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_HALO_WIDTH Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_JUSTIFY Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_LETTER_SPACING Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_LINE_HEIGHT Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_MAX_WIDTH Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_OCCLUSION_OPACITY Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_OFFSET Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_OPACITY Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_RADIAL_OFFSET Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_ROTATE Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_SIZE Ljava/lang/String;\n\tpublic static final field PROPERTY_TEXT_TRANSFORM Ljava/lang/String;\n\tpublic fun <init> ()V\n\tpublic synthetic fun build (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)Lcom/mapbox/maps/plugin/annotation/Annotation;\n\tpublic fun build (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotation;\n\tpublic final fun getData ()Lcom/google/gson/JsonElement;\n\tpublic final fun getDraggable ()Z\n\tpublic final fun getGeometry ()Lcom/mapbox/geojson/Point;\n\tpublic final fun getIconAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;\n\tpublic final fun getIconColor ()Ljava/lang/String;\n\tpublic final fun getIconColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getIconHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getIconHaloColor ()Ljava/lang/String;\n\tpublic final fun getIconHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getIconHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getIconImage ()Ljava/lang/String;\n\tpublic final fun getIconImageCrossFade ()Ljava/lang/Double;\n\tpublic final fun getIconOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconOffset ()Ljava/util/List;\n\tpublic final fun getIconOpacity ()Ljava/lang/Double;\n\tpublic final fun getIconRotate ()Ljava/lang/Double;\n\tpublic final fun getIconSize ()Ljava/lang/Double;\n\tpublic final fun getIconTextFit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;\n\tpublic final fun getIconTextFitPadding ()Ljava/util/List;\n\tpublic final fun getPoint ()Lcom/mapbox/geojson/Point;\n\tpublic final fun getSymbolSortKey ()Ljava/lang/Double;\n\tpublic final fun getSymbolZOffset ()Ljava/lang/Double;\n\tpublic final fun getTextAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;\n\tpublic final fun getTextColor ()Ljava/lang/String;\n\tpublic final fun getTextColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getTextField ()Ljava/lang/String;\n\tpublic final fun getTextHaloBlur ()Ljava/lang/Double;\n\tpublic final fun getTextHaloColor ()Ljava/lang/String;\n\tpublic final fun getTextHaloColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getTextHaloWidth ()Ljava/lang/Double;\n\tpublic final fun getTextJustify ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;\n\tpublic final fun getTextLetterSpacing ()Ljava/lang/Double;\n\tpublic final fun getTextLineHeight ()Ljava/lang/Double;\n\tpublic final fun getTextMaxWidth ()Ljava/lang/Double;\n\tpublic final fun getTextOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextOffset ()Ljava/util/List;\n\tpublic final fun getTextOpacity ()Ljava/lang/Double;\n\tpublic final fun getTextRadialOffset ()Ljava/lang/Double;\n\tpublic final fun getTextRotate ()Ljava/lang/Double;\n\tpublic final fun getTextSize ()Ljava/lang/Double;\n\tpublic final fun getTextTransform ()Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;\n\tpublic final fun setIconAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;)V\n\tpublic final fun setIconColor (Ljava/lang/String;)V\n\tpublic final fun setIconColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setIconHaloColor (Ljava/lang/String;)V\n\tpublic final fun setIconHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setIconHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setIconImage (Ljava/lang/String;)V\n\tpublic final fun setIconImageCrossFade (Ljava/lang/Double;)V\n\tpublic final fun setIconOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconOffset (Ljava/util/List;)V\n\tpublic final fun setIconOpacity (Ljava/lang/Double;)V\n\tpublic final fun setIconRotate (Ljava/lang/Double;)V\n\tpublic final fun setIconSize (Ljava/lang/Double;)V\n\tpublic final fun setIconTextFit (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;)V\n\tpublic final fun setIconTextFitPadding (Ljava/util/List;)V\n\tpublic final fun setSymbolSortKey (Ljava/lang/Double;)V\n\tpublic final fun setSymbolZOffset (Ljava/lang/Double;)V\n\tpublic final fun setTextAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;)V\n\tpublic final fun setTextColor (Ljava/lang/String;)V\n\tpublic final fun setTextColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setTextField (Ljava/lang/String;)V\n\tpublic final fun setTextHaloBlur (Ljava/lang/Double;)V\n\tpublic final fun setTextHaloColor (Ljava/lang/String;)V\n\tpublic final fun setTextHaloColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setTextHaloWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextJustify (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;)V\n\tpublic final fun setTextLetterSpacing (Ljava/lang/Double;)V\n\tpublic final fun setTextLineHeight (Ljava/lang/Double;)V\n\tpublic final fun setTextMaxWidth (Ljava/lang/Double;)V\n\tpublic final fun setTextOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextOffset (Ljava/util/List;)V\n\tpublic final fun setTextOpacity (Ljava/lang/Double;)V\n\tpublic final fun setTextRadialOffset (Ljava/lang/Double;)V\n\tpublic final fun setTextRotate (Ljava/lang/Double;)V\n\tpublic final fun setTextSize (Ljava/lang/Double;)V\n\tpublic final fun setTextTransform (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;)V\n\tpublic final fun withData (Lcom/google/gson/JsonElement;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withDraggable (Z)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withGeometry (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconAnchor;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconEmissiveStrength (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconHaloBlur (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconHaloColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconHaloColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconHaloColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconHaloWidth (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconImage (Landroid/graphics/Bitmap;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconImage (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconImageCrossFade (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconOcclusionOpacity (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconOffset (Ljava/util/List;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconOpacity (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconRotate (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconSize (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconTextFit (Lcom/mapbox/maps/extension/style/layers/properties/generated/IconTextFit;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withIconTextFitPadding (Ljava/util/List;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withPoint (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withSymbolSortKey (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withSymbolZOffset (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextAnchor;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextEmissiveStrength (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextField (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextHaloBlur (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextHaloColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextHaloColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextHaloColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextHaloWidth (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextJustify (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextJustify;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextLetterSpacing (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextLineHeight (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextMaxWidth (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextOcclusionOpacity (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextOffset (Ljava/util/List;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextOpacity (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextRadialOffset (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextRotate (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextSize (D)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n\tpublic final fun withTextTransform (Lcom/mapbox/maps/extension/style/layers/properties/generated/TextTransform;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions$Companion {\n\tpublic final fun fromFeature (Lcom/mapbox/geojson/Feature;)Lcom/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolygonAnnotation : com/mapbox/maps/plugin/annotation/Annotation {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotation$Companion;\n\tpublic static final field ID_KEY Ljava/lang/String;\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/google/gson/JsonObject;Lcom/mapbox/geojson/Polygon;)V\n\tpublic final fun getFillBridgeGuardRailColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillBridgeGuardRailColorString ()Ljava/lang/String;\n\tpublic final fun getFillBridgeGuardRailColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillColorString ()Ljava/lang/String;\n\tpublic final fun getFillColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillConstructBridgeGuardRail ()Ljava/lang/Boolean;\n\tpublic final fun getFillOpacity ()Ljava/lang/Double;\n\tpublic final fun getFillOutlineColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillOutlineColorString ()Ljava/lang/String;\n\tpublic final fun getFillOutlineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillPattern ()Ljava/lang/String;\n\tpublic final fun getFillSortKey ()Ljava/lang/Double;\n\tpublic final fun getFillTunnelStructureColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillTunnelStructureColorString ()Ljava/lang/String;\n\tpublic final fun getFillTunnelStructureColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillZOffset ()Ljava/lang/Double;\n\tpublic synthetic fun getOffsetGeometry (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/android/gestures/MoveDistancesObject;)Lcom/mapbox/geojson/Geometry;\n\tpublic fun getOffsetGeometry (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/android/gestures/MoveDistancesObject;)Lcom/mapbox/geojson/Polygon;\n\tpublic final fun getPoints ()Ljava/util/List;\n\tpublic fun getType ()Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic final fun setFillBridgeGuardRailColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setFillBridgeGuardRailColorString (Ljava/lang/String;)V\n\tpublic final fun setFillBridgeGuardRailColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setFillColorString (Ljava/lang/String;)V\n\tpublic final fun setFillColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillConstructBridgeGuardRail (Ljava/lang/Boolean;)V\n\tpublic final fun setFillOpacity (Ljava/lang/Double;)V\n\tpublic final fun setFillOutlineColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setFillOutlineColorString (Ljava/lang/String;)V\n\tpublic final fun setFillOutlineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillPattern (Ljava/lang/String;)V\n\tpublic final fun setFillSortKey (Ljava/lang/Double;)V\n\tpublic final fun setFillTunnelStructureColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setFillTunnelStructureColorString (Ljava/lang/String;)V\n\tpublic final fun setFillTunnelStructureColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillZOffset (Ljava/lang/Double;)V\n\tpublic final fun setPoints (Ljava/util/List;)V\n\tpublic fun setUsedDataDrivenProperties ()V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolygonAnnotation$Companion {\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolygonAnnotationManager : com/mapbox/maps/plugin/annotation/AnnotationManagerImpl {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationManager$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun create (Lcom/mapbox/geojson/FeatureCollection;)Ljava/util/List;\n\tpublic final fun create (Ljava/lang/String;)Ljava/util/List;\n\tpublic fun getAnnotationIdKey ()Ljava/lang/String;\n\tpublic final fun getFillAntialias ()Ljava/lang/Boolean;\n\tpublic final fun getFillBridgeGuardRailColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillBridgeGuardRailColorString ()Ljava/lang/String;\n\tpublic final fun getFillBridgeGuardRailColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillColorString ()Ljava/lang/String;\n\tpublic final fun getFillColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillConstructBridgeGuardRail ()Ljava/lang/Boolean;\n\tpublic final fun getFillElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;\n\tpublic final fun getFillEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getFillOpacity ()Ljava/lang/Double;\n\tpublic final fun getFillOutlineColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillOutlineColorString ()Ljava/lang/String;\n\tpublic final fun getFillOutlineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillPattern ()Ljava/lang/String;\n\tpublic final fun getFillPatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getFillSortKey ()Ljava/lang/Double;\n\tpublic final fun getFillTranslate ()Ljava/util/List;\n\tpublic final fun getFillTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;\n\tpublic final fun getFillTunnelStructureColorInt ()Ljava/lang/Integer;\n\tpublic final fun getFillTunnelStructureColorString ()Ljava/lang/String;\n\tpublic final fun getFillTunnelStructureColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillZOffset ()Ljava/lang/Double;\n\tpublic fun getLayerFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getSlot ()Ljava/lang/String;\n\tpublic final fun setFillAntialias (Ljava/lang/Boolean;)V\n\tpublic final fun setFillBridgeGuardRailColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setFillBridgeGuardRailColorString (Ljava/lang/String;)V\n\tpublic final fun setFillBridgeGuardRailColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setFillColorString (Ljava/lang/String;)V\n\tpublic final fun setFillColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillConstructBridgeGuardRail (Ljava/lang/Boolean;)V\n\tpublic final fun setFillElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillElevationReference;)V\n\tpublic final fun setFillEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setFillOpacity (Ljava/lang/Double;)V\n\tpublic final fun setFillOutlineColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setFillOutlineColorString (Ljava/lang/String;)V\n\tpublic final fun setFillOutlineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillPattern (Ljava/lang/String;)V\n\tpublic final fun setFillPatternCrossFade (Ljava/lang/Double;)V\n\tpublic final fun setFillSortKey (Ljava/lang/Double;)V\n\tpublic final fun setFillTranslate (Ljava/util/List;)V\n\tpublic final fun setFillTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/FillTranslateAnchor;)V\n\tpublic final fun setFillTunnelStructureColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setFillTunnelStructureColorString (Ljava/lang/String;)V\n\tpublic final fun setFillTunnelStructureColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillZOffset (Ljava/lang/Double;)V\n\tpublic fun setLayerFilter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun setMaxZoom (Ljava/lang/Double;)V\n\tpublic final fun setMinZoom (Ljava/lang/Double;)V\n\tpublic final fun setSlot (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolygonAnnotationManager$Companion {\n\tpublic final fun getID_GENERATOR ()Ljava/util/concurrent/atomic/AtomicLong;\n\tpublic final fun setID_GENERATOR (Ljava/util/concurrent/atomic/AtomicLong;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolygonAnnotationManagerKt {\n\tpublic static final fun createPolygonAnnotationManager (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationManager;\n\tpublic static synthetic fun createPolygonAnnotationManager$default (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationManager;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions : com/mapbox/maps/plugin/annotation/AnnotationOptions {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions$Companion;\n\tpublic static final field PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_OPACITY Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_OUTLINE_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_OUTLINE_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_PATTERN Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_SORT_KEY Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_FILL_Z_OFFSET Ljava/lang/String;\n\tpublic fun <init> ()V\n\tpublic synthetic fun build (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)Lcom/mapbox/maps/plugin/annotation/Annotation;\n\tpublic fun build (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotation;\n\tpublic final fun getData ()Lcom/google/gson/JsonElement;\n\tpublic final fun getDraggable ()Z\n\tpublic final fun getFillBridgeGuardRailColor ()Ljava/lang/String;\n\tpublic final fun getFillBridgeGuardRailColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillColor ()Ljava/lang/String;\n\tpublic final fun getFillColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillConstructBridgeGuardRail ()Ljava/lang/Boolean;\n\tpublic final fun getFillOpacity ()Ljava/lang/Double;\n\tpublic final fun getFillOutlineColor ()Ljava/lang/String;\n\tpublic final fun getFillOutlineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillPattern ()Ljava/lang/String;\n\tpublic final fun getFillSortKey ()Ljava/lang/Double;\n\tpublic final fun getFillTunnelStructureColor ()Ljava/lang/String;\n\tpublic final fun getFillTunnelStructureColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getFillZOffset ()Ljava/lang/Double;\n\tpublic final fun getGeometry ()Lcom/mapbox/geojson/Polygon;\n\tpublic final fun getPoints ()Ljava/util/List;\n\tpublic final fun setFillBridgeGuardRailColor (Ljava/lang/String;)V\n\tpublic final fun setFillBridgeGuardRailColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillColor (Ljava/lang/String;)V\n\tpublic final fun setFillColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillConstructBridgeGuardRail (Ljava/lang/Boolean;)V\n\tpublic final fun setFillOpacity (Ljava/lang/Double;)V\n\tpublic final fun setFillOutlineColor (Ljava/lang/String;)V\n\tpublic final fun setFillOutlineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillPattern (Ljava/lang/String;)V\n\tpublic final fun setFillSortKey (Ljava/lang/Double;)V\n\tpublic final fun setFillTunnelStructureColor (Ljava/lang/String;)V\n\tpublic final fun setFillTunnelStructureColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setFillZOffset (Ljava/lang/Double;)V\n\tpublic final fun withData (Lcom/google/gson/JsonElement;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withDraggable (Z)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillBridgeGuardRailColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillBridgeGuardRailColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillBridgeGuardRailColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillConstructBridgeGuardRail (Z)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillOpacity (D)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillOutlineColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillOutlineColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillOutlineColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillPattern (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillSortKey (D)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillTunnelStructureColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillTunnelStructureColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillTunnelStructureColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withFillZOffset (D)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withGeometry (Lcom/mapbox/geojson/Polygon;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n\tpublic final fun withPoints (Ljava/util/List;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions$Companion {\n\tpublic final fun fromFeature (Lcom/mapbox/geojson/Feature;)Lcom/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolylineAnnotation : com/mapbox/maps/plugin/annotation/Annotation {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotation$Companion;\n\tpublic static final field ID_KEY Ljava/lang/String;\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/google/gson/JsonObject;Lcom/mapbox/geojson/LineString;)V\n\tpublic final fun getLineBlur ()Ljava/lang/Double;\n\tpublic final fun getLineBorderColorInt ()Ljava/lang/Integer;\n\tpublic final fun getLineBorderColorString ()Ljava/lang/String;\n\tpublic final fun getLineBorderColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineBorderWidth ()Ljava/lang/Double;\n\tpublic final fun getLineColorInt ()Ljava/lang/Integer;\n\tpublic final fun getLineColorString ()Ljava/lang/String;\n\tpublic final fun getLineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineElevationGroundScale ()Ljava/lang/Double;\n\tpublic final fun getLineEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getLineGapWidth ()Ljava/lang/Double;\n\tpublic final fun getLineJoin ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic final fun getLineOffset ()Ljava/lang/Double;\n\tpublic final fun getLineOpacity ()Ljava/lang/Double;\n\tpublic final fun getLinePattern ()Ljava/lang/String;\n\tpublic final fun getLineSortKey ()Ljava/lang/Double;\n\tpublic final fun getLineWidth ()Ljava/lang/Double;\n\tpublic final fun getLineZOffset ()Ljava/lang/Double;\n\tpublic synthetic fun getOffsetGeometry (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/android/gestures/MoveDistancesObject;)Lcom/mapbox/geojson/Geometry;\n\tpublic fun getOffsetGeometry (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/android/gestures/MoveDistancesObject;)Lcom/mapbox/geojson/LineString;\n\tpublic final fun getPoints ()Ljava/util/List;\n\tpublic fun getType ()Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic final fun setLineBlur (Ljava/lang/Double;)V\n\tpublic final fun setLineBorderColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setLineBorderColorString (Ljava/lang/String;)V\n\tpublic final fun setLineBorderColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineBorderWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setLineColorString (Ljava/lang/String;)V\n\tpublic final fun setLineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineElevationGroundScale (Ljava/lang/Double;)V\n\tpublic final fun setLineEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setLineGapWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineJoin (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;)V\n\tpublic final fun setLineOffset (Ljava/lang/Double;)V\n\tpublic final fun setLineOpacity (Ljava/lang/Double;)V\n\tpublic final fun setLinePattern (Ljava/lang/String;)V\n\tpublic final fun setLineSortKey (Ljava/lang/Double;)V\n\tpublic final fun setLineWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineZOffset (Ljava/lang/Double;)V\n\tpublic final fun setPoints (Ljava/util/List;)V\n\tpublic fun setUsedDataDrivenProperties ()V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolylineAnnotation$Companion {\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolylineAnnotationManager : com/mapbox/maps/plugin/annotation/AnnotationManagerImpl {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationManager$Companion;\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun create (Lcom/mapbox/geojson/FeatureCollection;)Ljava/util/List;\n\tpublic final fun create (Ljava/lang/String;)Ljava/util/List;\n\tpublic fun getAnnotationIdKey ()Ljava/lang/String;\n\tpublic fun getLayerFilter ()Lcom/mapbox/maps/extension/style/expressions/generated/Expression;\n\tpublic final fun getLineBlur ()Ljava/lang/Double;\n\tpublic final fun getLineBorderColorInt ()Ljava/lang/Integer;\n\tpublic final fun getLineBorderColorString ()Ljava/lang/String;\n\tpublic final fun getLineBorderColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineBorderWidth ()Ljava/lang/Double;\n\tpublic final fun getLineCap ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;\n\tpublic final fun getLineColorInt ()Ljava/lang/Integer;\n\tpublic final fun getLineColorString ()Ljava/lang/String;\n\tpublic final fun getLineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineCrossSlope ()Ljava/lang/Double;\n\tpublic final fun getLineCutoutFadeWidth ()Ljava/lang/Double;\n\tpublic final fun getLineCutoutOpacity ()Ljava/lang/Double;\n\tpublic final fun getLineDasharray ()Ljava/util/List;\n\tpublic final fun getLineDepthOcclusionFactor ()Ljava/lang/Double;\n\tpublic final fun getLineElevationGroundScale ()Ljava/lang/Double;\n\tpublic final fun getLineElevationReference ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;\n\tpublic final fun getLineEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getLineGapWidth ()Ljava/lang/Double;\n\tpublic final fun getLineGradientUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineJoin ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic final fun getLineMiterLimit ()Ljava/lang/Double;\n\tpublic final fun getLineOcclusionOpacity ()Ljava/lang/Double;\n\tpublic final fun getLineOffset ()Ljava/lang/Double;\n\tpublic final fun getLineOpacity ()Ljava/lang/Double;\n\tpublic final fun getLinePattern ()Ljava/lang/String;\n\tpublic final fun getLinePatternCrossFade ()Ljava/lang/Double;\n\tpublic final fun getLineRoundLimit ()Ljava/lang/Double;\n\tpublic final fun getLineSortKey ()Ljava/lang/Double;\n\tpublic final fun getLineTranslate ()Ljava/util/List;\n\tpublic final fun getLineTranslateAnchor ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;\n\tpublic final fun getLineTrimColor ()Ljava/lang/String;\n\tpublic final fun getLineTrimColorInt ()Ljava/lang/Integer;\n\tpublic final fun getLineTrimColorString ()Ljava/lang/String;\n\tpublic final fun getLineTrimColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineTrimFadeRange ()Ljava/util/List;\n\tpublic final fun getLineTrimOffset ()Ljava/util/List;\n\tpublic final fun getLineWidth ()Ljava/lang/Double;\n\tpublic final fun getLineWidthUnit ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;\n\tpublic final fun getLineZOffset ()Ljava/lang/Double;\n\tpublic final fun getMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getMinZoom ()Ljava/lang/Double;\n\tpublic final fun getSlot ()Ljava/lang/String;\n\tpublic fun setLayerFilter (Lcom/mapbox/maps/extension/style/expressions/generated/Expression;)V\n\tpublic final fun setLineBlur (Ljava/lang/Double;)V\n\tpublic final fun setLineBorderColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setLineBorderColorString (Ljava/lang/String;)V\n\tpublic final fun setLineBorderColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineBorderWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineCap (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineCap;)V\n\tpublic final fun setLineColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setLineColorString (Ljava/lang/String;)V\n\tpublic final fun setLineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineCrossSlope (Ljava/lang/Double;)V\n\tpublic final fun setLineCutoutFadeWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineCutoutOpacity (Ljava/lang/Double;)V\n\tpublic final fun setLineDasharray (Ljava/util/List;)V\n\tpublic final fun setLineDepthOcclusionFactor (Ljava/lang/Double;)V\n\tpublic final fun setLineElevationGroundScale (Ljava/lang/Double;)V\n\tpublic final fun setLineElevationReference (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineElevationReference;)V\n\tpublic final fun setLineEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setLineGapWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineGradientUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineJoin (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;)V\n\tpublic final fun setLineMiterLimit (Ljava/lang/Double;)V\n\tpublic final fun setLineOcclusionOpacity (Ljava/lang/Double;)V\n\tpublic final fun setLineOffset (Ljava/lang/Double;)V\n\tpublic final fun setLineOpacity (Ljava/lang/Double;)V\n\tpublic final fun setLinePattern (Ljava/lang/String;)V\n\tpublic final fun setLinePatternCrossFade (Ljava/lang/Double;)V\n\tpublic final fun setLineRoundLimit (Ljava/lang/Double;)V\n\tpublic final fun setLineSortKey (Ljava/lang/Double;)V\n\tpublic final fun setLineTranslate (Ljava/util/List;)V\n\tpublic final fun setLineTranslateAnchor (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineTranslateAnchor;)V\n\tpublic final fun setLineTrimColor (Ljava/lang/String;)V\n\tpublic final fun setLineTrimColorInt (Ljava/lang/Integer;)V\n\tpublic final fun setLineTrimColorString (Ljava/lang/String;)V\n\tpublic final fun setLineTrimColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineTrimFadeRange (Ljava/util/List;)V\n\tpublic final fun setLineTrimOffset (Ljava/util/List;)V\n\tpublic final fun setLineWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineWidthUnit (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineWidthUnit;)V\n\tpublic final fun setLineZOffset (Ljava/lang/Double;)V\n\tpublic final fun setMaxZoom (Ljava/lang/Double;)V\n\tpublic final fun setMinZoom (Ljava/lang/Double;)V\n\tpublic final fun setSlot (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolylineAnnotationManager$Companion {\n\tpublic final fun getID_GENERATOR ()Ljava/util/concurrent/atomic/AtomicLong;\n\tpublic final fun setID_GENERATOR (Ljava/util/concurrent/atomic/AtomicLong;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolylineAnnotationManagerKt {\n\tpublic static final fun createPolylineAnnotationManager (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationManager;\n\tpublic static synthetic fun createPolylineAnnotationManager$default (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationManager;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions : com/mapbox/maps/plugin/annotation/AnnotationOptions {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions$Companion;\n\tpublic static final field PROPERTY_LINE_BLUR Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_BORDER_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_BORDER_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_BORDER_WIDTH Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_COLOR Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_COLOR_USE_THEME Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_ELEVATION_GROUND_SCALE Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_EMISSIVE_STRENGTH Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_GAP_WIDTH Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_JOIN Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_OFFSET Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_OPACITY Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_PATTERN Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_SORT_KEY Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_WIDTH Ljava/lang/String;\n\tpublic static final field PROPERTY_LINE_Z_OFFSET Ljava/lang/String;\n\tpublic fun <init> ()V\n\tpublic synthetic fun build (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)Lcom/mapbox/maps/plugin/annotation/Annotation;\n\tpublic fun build (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotation;\n\tpublic final fun getData ()Lcom/google/gson/JsonElement;\n\tpublic final fun getDraggable ()Z\n\tpublic final fun getGeometry ()Lcom/mapbox/geojson/LineString;\n\tpublic final fun getLineBlur ()Ljava/lang/Double;\n\tpublic final fun getLineBorderColor ()Ljava/lang/String;\n\tpublic final fun getLineBorderColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineBorderWidth ()Ljava/lang/Double;\n\tpublic final fun getLineColor ()Ljava/lang/String;\n\tpublic final fun getLineColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getLineElevationGroundScale ()Ljava/lang/Double;\n\tpublic final fun getLineEmissiveStrength ()Ljava/lang/Double;\n\tpublic final fun getLineGapWidth ()Ljava/lang/Double;\n\tpublic final fun getLineJoin ()Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;\n\tpublic final fun getLineOffset ()Ljava/lang/Double;\n\tpublic final fun getLineOpacity ()Ljava/lang/Double;\n\tpublic final fun getLinePattern ()Ljava/lang/String;\n\tpublic final fun getLineSortKey ()Ljava/lang/Double;\n\tpublic final fun getLineWidth ()Ljava/lang/Double;\n\tpublic final fun getLineZOffset ()Ljava/lang/Double;\n\tpublic final fun getPoints ()Ljava/util/List;\n\tpublic final fun setLineBlur (Ljava/lang/Double;)V\n\tpublic final fun setLineBorderColor (Ljava/lang/String;)V\n\tpublic final fun setLineBorderColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineBorderWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineColor (Ljava/lang/String;)V\n\tpublic final fun setLineColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setLineElevationGroundScale (Ljava/lang/Double;)V\n\tpublic final fun setLineEmissiveStrength (Ljava/lang/Double;)V\n\tpublic final fun setLineGapWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineJoin (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;)V\n\tpublic final fun setLineOffset (Ljava/lang/Double;)V\n\tpublic final fun setLineOpacity (Ljava/lang/Double;)V\n\tpublic final fun setLinePattern (Ljava/lang/String;)V\n\tpublic final fun setLineSortKey (Ljava/lang/Double;)V\n\tpublic final fun setLineWidth (Ljava/lang/Double;)V\n\tpublic final fun setLineZOffset (Ljava/lang/Double;)V\n\tpublic final fun withData (Lcom/google/gson/JsonElement;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withDraggable (Z)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withGeometry (Lcom/mapbox/geojson/LineString;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineBlur (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineBorderColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineBorderColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineBorderColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineBorderWidth (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineColor (I)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineColor (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineColorUseTheme (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineElevationGroundScale (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineEmissiveStrength (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineGapWidth (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineJoin (Lcom/mapbox/maps/extension/style/layers/properties/generated/LineJoin;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineOffset (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineOpacity (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLinePattern (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineSortKey (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineWidth (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withLineZOffset (D)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n\tpublic final fun withPoints (Ljava/util/List;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions$Companion {\n\tpublic final fun fromFeature (Lcom/mapbox/geojson/Feature;)Lcom/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions;\n}\n\n"
  },
  {
    "path": "plugin-annotation/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.annotation\"\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    unitTests.apply {\n      isIncludeAndroidResources = true\n    }\n  }\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-annotation\"\n    artifactTitle = \"The annotation module for the Mapbox Maps SDK\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-annotation\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  api(project(\":extension-style\"))\n  implementation(libs.mapbox.annotations)\n  implementation(libs.bundles.base.dependencies)\n  testImplementation(project(\":plugin-gestures\"))\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-annotation/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "plugin-annotation/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.kts.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/AnnotationExt.kt",
    "content": "@file:JvmName(\"AnnotationsUtils\")\n\npackage com.mapbox.maps.plugin.annotation\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val for MapView to get the Annotation plugin instance.\n */\nval MapPluginProviderDelegate.annotations: AnnotationPlugin\n  @JvmName(\"getAnnotations\")\n  get() = this.getPlugin(Plugin.MAPBOX_ANNOTATION_PLUGIN_ID)!!\n\n/**\n * Static method to create instance of Mapbox annotation plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createAnnotationPlugin(): AnnotationPlugin {\n  return AnnotationPluginImpl()\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/AnnotationManagerImpl.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport android.graphics.Bitmap\nimport android.graphics.PointF\nimport androidx.annotation.MainThread\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.google.gson.JsonObject\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.DragInteraction\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.LongClickInteraction\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.PlatformEventInfo\nimport com.mapbox.maps.PlatformEventType\nimport com.mapbox.maps.RenderedQueryGeometry\nimport com.mapbox.maps.RenderedQueryOptions\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.all\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.get\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.gt\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.gte\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.has\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.lt\nimport com.mapbox.maps.extension.style.image.addImage\nimport com.mapbox.maps.extension.style.image.image\nimport com.mapbox.maps.extension.style.layers.Layer\nimport com.mapbox.maps.extension.style.layers.addPersistentLayer\nimport com.mapbox.maps.extension.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.layers.generated.symbolLayer\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.generated.geoJsonSource\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.InvalidPluginConfigurationException\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_GESTURES_PLUGIN_ID\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport com.mapbox.maps.plugin.gestures.OnMapClickListener\nimport com.mapbox.maps.plugin.gestures.OnMapLongClickListener\nimport com.mapbox.maps.plugin.gestures.OnMoveListener\nimport java.util.UUID\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\n\n/**\n * Base class for annotation managers\n */\n@MainThread\nabstract class AnnotationManagerImpl<G : Geometry, T : Annotation<G>, S : AnnotationOptions<G, T>, D : OnAnnotationDragListener<T>, U : OnAnnotationClickListener<T>, V : OnAnnotationLongClickListener<T>, I : OnAnnotationInteractionListener<T>, L : Layer>\ninternal constructor(\n  /** The delegateProvider */\n  final override val delegateProvider: MapDelegateProvider,\n  annotationConfig: AnnotationConfig?,\n  id: Long,\n  typeName: String,\n  createLayerFunction: (layerId: String, sourceId: String) -> L\n) : AnnotationManager<G, T, S, D, U, V, I> {\n  protected val dataDrivenPropertyUsageMap: MutableMap<String, Boolean> = mutableMapOf()\n  private val mapCameraManagerDelegate = delegateProvider.mapCameraManagerDelegate\n  private val mapFeatureQueryDelegate = delegateProvider.mapFeatureQueryDelegate\n  @OptIn(MapboxExperimental::class)\n  private val mapInteractionDelegate = delegateProvider.mapInteractionDelegate\n  private var width = 0\n  private var height = 0\n\n  private var draggingAnnotation: T? = null\n  private val annotationMap = LinkedHashMap<String, T>()\n  private val dragAnnotationMap = LinkedHashMap<String, T>()\n  private val styleImages = PointAnnotationStyleImages()\n  internal val dataDrivenPropertyDefaultValues: JsonObject = JsonObject()\n\n  private val interactionsCancelableSet = mutableSetOf<Cancelable>()\n\n  /**\n   * The list of layer ids that's associated with the annotation manager.\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  val associatedLayers = mutableListOf<String>()\n  private val associatedSources = mutableListOf<String>()\n\n  private var gesturesPlugin: GesturesPlugin = delegateProvider.mapPluginProviderDelegate.getPlugin(\n    MAPBOX_GESTURES_PLUGIN_ID\n  ) ?: throw InvalidPluginConfigurationException(\n    \"Can't look up an instance of plugin, is it available on the clazz path and loaded through the map?\"\n  )\n  private val mapMoveDetector = gesturesPlugin.getGesturesManager().moveGestureDetector\n\n  /** The layer created by this manager. Annotations will be added to this layer.*/\n  internal var layer: L\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    @JvmSynthetic\n    set\n\n  /** The source created by this manager. Feature data will be added to this source.*/\n  internal var source: GeoJsonSource\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    @JvmSynthetic\n    set\n\n  /** The drag layer created by this manager. The dragging annotation will be added to this layer.*/\n  internal var dragLayer: L\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    @JvmSynthetic\n    set\n\n  /** The drag source created by this manager. The feature data of dragging annotation will be added to this source.*/\n  internal var dragSource: GeoJsonSource\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    @JvmSynthetic\n    set\n\n  /**\n   * The added annotations\n   */\n  override val annotations: List<T>\n    get() {\n      return annotationMap.values.plus(dragAnnotationMap.values)\n    }\n\n  /**\n   * The added dragListeners\n   */\n  override val dragListeners: MutableList<D> = mutableListOf()\n\n  /**\n   * The Added clickListeners\n   */\n  override val clickListeners: MutableList<U> = mutableListOf()\n\n  /**\n   * The added longClickListeners\n   */\n  override val longClickListeners: MutableList<V> = mutableListOf()\n\n  /**\n   * The added interactionListener\n   */\n  override val interactionListener: MutableList<I> = mutableListOf()\n\n  init {\n    val annotationSourceOptions = annotationConfig?.annotationSourceOptions\n    val styleManager = delegateProvider.mapStyleManagerDelegate\n\n    val layerId = annotationConfig?.layerId ?: \"mapbox-android-$typeName-layer-$id\"\n    val sourceId = annotationConfig?.sourceId ?: \"mapbox-android-$typeName-source-$id\"\n\n    source = createSource(sourceId, annotationSourceOptions)\n    layer = createLayerFunction(layerId, sourceId)\n\n    val dragLayerId = \"mapbox-android-$typeName-draglayer-$id\"\n    val dragSourceId = \"mapbox-android-$typeName-dragsource-$id\"\n    dragSource = createDragSource(dragSourceId, annotationSourceOptions)\n    dragLayer = createLayerFunction(dragLayerId, dragSourceId)\n    if (!styleManager.styleSourceExists(source.sourceId)) {\n      styleManager.addSource(source)\n      associatedSources.add(source.sourceId)\n    }\n    if (!styleManager.styleLayerExists(layer.layerId)) {\n      var layerAdded = false\n      annotationConfig?.belowLayerId?.let { belowLayerId ->\n        // Check whether the below layer exists in the current style.\n        if (styleManager.styleLayerExists(belowLayerId)) {\n          styleManager.addPersistentLayer(\n            layer,\n            LayerPosition(null, belowLayerId, null),\n          )\n          layerAdded = true\n        } else {\n          logW(\n            TAG,\n            \"Layer with id $belowLayerId doesn't exist in style ${styleManager.styleURI}, will add annotation layer directly.\"\n          )\n        }\n      }\n      if (!layerAdded) {\n        styleManager.addPersistentLayer(layer)\n      }\n      annotationConfig?.slotName?.let { slotName ->\n        if (slotName in styleManager.styleSlots) {\n          layer.slot(slotName)\n        } else {\n          logW(\n            TAG,\n            \"Slot with name $slotName doesn't exist in style ${styleManager.styleURI}, \" +\n              \"it will not be applied to the annotation layer.\"\n          )\n        }\n      }\n      associatedLayers.add(layer.layerId)\n    }\n    if (!styleManager.styleSourceExists(dragSource.sourceId)) {\n      styleManager.addSource(dragSource)\n      associatedSources.add(dragSource.sourceId)\n    }\n    if (!styleManager.styleLayerExists(dragLayer.layerId)) {\n      // Add drag layer above the annotation layer\n      styleManager.addPersistentLayer(\n        dragLayer,\n        LayerPosition(layer.layerId, null, null)\n      )\n      associatedLayers.add(dragLayer.layerId)\n    }\n    if (layer is SymbolLayer || layer is CircleLayer) {\n      // Only apply cluster for PointAnnotations or CircleAnnotations\n      initClusterLayers(styleManager, annotationSourceOptions, typeName, id)\n    }\n    updateSource()\n    registerInteractions()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun registerInteractions() {\n    val clickInteraction = { layerId: String, map: Map<String, T> ->\n      ClickInteraction.layer(layerId) { selectedFeature, _ ->\n        val annotationId = selectedFeature.properties.optString(getAnnotationIdKey(), \"\")\n        if (annotationId != \"\") {\n          map[annotationId]?.let { annotation ->\n            val consumeClick = clickListeners.any { it.onAnnotationClick(annotation) }\n            selectAnnotation(annotation)\n            return@layer consumeClick\n          }\n        }\n        return@layer false\n      }\n    }\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        clickInteraction(layer.layerId, annotationMap)\n      )\n    )\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        clickInteraction(dragLayer.layerId, dragAnnotationMap)\n      )\n    )\n    val longClickInteraction = { layerId: String, map: Map<String, T> ->\n      LongClickInteraction.layer(layerId) { selectedFeature, _ ->\n        val annotationId = selectedFeature.properties.optString(getAnnotationIdKey(), \"\")\n        if (annotationId != \"\") {\n          map[annotationId]?.let { annotation ->\n            return@layer longClickListeners.any { it.onAnnotationLongClick(annotation) }\n          }\n        }\n        return@layer false\n      }\n    }\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        longClickInteraction(layer.layerId, annotationMap)\n      )\n    )\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        longClickInteraction(dragLayer.layerId, dragAnnotationMap)\n      )\n    )\n    val dragInteraction = { layerId: String, map: Map<String, T> ->\n      DragInteraction.layer(\n        id = layerId,\n        onDragBegin = { selectedFeature, _ ->\n          val annotationId = selectedFeature.properties.optString(getAnnotationIdKey(), \"\")\n          if (annotationId != \"\") {\n            map[annotationId]?.let { annotation ->\n              return@layer startDragging(annotation)\n            }\n          }\n          return@layer false\n        },\n        onDrag = { drag() },\n        onDragEnd = { stopDragging() }\n      )\n    }\n    // drag interaction for non-drag layer is needed to transition the feature from `source` to `dragSource`\n    // that happens in the first `DragInteraction.onDrag`;\n    // all subsequent drags for that feature will be happening in the DragInteraction for `dragLayer`;\n    // note: when the feature is transitioned from `source` to `dragSource` - it is never transitioned back\n    // to avoid `layer` flickering.\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        dragInteraction(layer.layerId, annotationMap)\n      )\n    )\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        dragInteraction(dragLayer.layerId, dragAnnotationMap)\n      )\n    )\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun drag() {\n    // Updating symbol's position\n    draggingAnnotation?.let { annotation ->\n      val focalPoint = ScreenCoordinate(\n        mapMoveDetector.focalPoint.x.toDouble(),\n        mapMoveDetector.focalPoint.y.toDouble()\n      )\n      if (mapMoveDetector.pointersCount > 1 || !annotation.isDraggable) {\n        // Stopping the drag when we don't work with a simple, on-pointer move anymore\n        stopDragging()\n        // explicitly end the drag gesture so that other drag interactions start getting events\n        mapInteractionDelegate.dispatch(\n          PlatformEventInfo(\n            PlatformEventType.DRAG_END,\n            focalPoint\n          )\n        )\n        // skip updating the annotation's position as the drag is already ended\n        return\n      }\n      val moveObject = mapMoveDetector.getMoveObject(0)\n      val x = moveObject.currentX\n      val y = moveObject.currentY\n      val pointF = PointF(x, y)\n      if (pointF.x < 0 || pointF.y < 0 || pointF.x > width || pointF.y > height) {\n        stopDragging()\n        // explicitly end the drag gesture so that other drag interactions start getting events\n        mapInteractionDelegate.dispatch(\n          PlatformEventInfo(\n            PlatformEventType.DRAG_END,\n            focalPoint\n          )\n        )\n      }\n      if (annotationMap.containsKey(annotation.id)) {\n        // Delete the dragging annotation from original source and add it to drag source\n        annotationMap.remove(annotation.id)\n        dragAnnotationMap[annotation.id] = annotation\n        // The dragging annotation has been removed from original source,\n        // update both source and drag source to make sure it is shown in drag layer.\n        updateSource()\n        updateDragSource()\n      }\n      annotation.getOffsetGeometry(\n        delegateProvider.mapCameraManagerDelegate, moveObject\n      )?.let { geometry ->\n        annotation.geometry = geometry\n        updateDragSource()\n        dragListeners.forEach {\n          it.onAnnotationDrag(annotation)\n        }\n      }\n    }\n  }\n\n  private fun unregisterInteractions() {\n    interactionsCancelableSet.forEach {\n      it.cancel()\n    }\n    interactionsCancelableSet.clear()\n  }\n\n  /**\n   * Get the key of the id of the annotation.\n   *\n   * @return the key of the id of the annotation\n   */\n  abstract fun getAnnotationIdKey(): String\n\n  /**\n   * Set filter on the managed annotations.\n   */\n  abstract var layerFilter: Expression?\n\n  private fun createSource(\n    sourceId: String,\n    annotationSourceOptions: AnnotationSourceOptions?\n  ) = geoJsonSource(sourceId) {\n    annotationSourceOptions?.let { options ->\n      options.maxZoom?.let {\n        maxzoom(it)\n      }\n      options.buffer?.let {\n        buffer(it)\n      }\n      options.lineMetrics?.let {\n        lineMetrics(it)\n      }\n      options.tolerance?.let {\n        tolerance(it)\n      }\n      options.clusterOptions?.let { clusterOptions ->\n        cluster(clusterOptions.cluster)\n        clusterMaxZoom(clusterOptions.clusterMaxZoom)\n        clusterMinPoints(clusterOptions.clusterMinPoints)\n        clusterRadius(clusterOptions.clusterRadius)\n        clusterOptions.clusterProperties?.let {\n          clusterProperties(it)\n        }\n      }\n    }\n  }\n\n  private fun createDragSource(\n    dragSourceId: String,\n    annotationSourceOptions: AnnotationSourceOptions?\n  ): GeoJsonSource = geoJsonSource(dragSourceId) {\n    annotationSourceOptions?.let { options ->\n      options.maxZoom?.let {\n        maxzoom(it)\n      }\n      options.buffer?.let {\n        buffer(it)\n      }\n      options.lineMetrics?.let {\n        lineMetrics(it)\n      }\n      options.tolerance?.let {\n        tolerance(it)\n      }\n    }\n  }\n\n  private fun initClusterLayers(\n    style: MapboxStyleManager,\n    annotationSourceOptions: AnnotationSourceOptions?,\n    typeName: String,\n    id: Long\n  ) {\n    annotationSourceOptions?.clusterOptions?.let {\n      it.colorLevels.forEachIndexed { level, _ ->\n        val clusterLevelLayer =\n          createClusterLevelLayer(level, it.colorLevels, annotationSourceOptions, typeName, id)\n        if (!style.styleLayerExists(clusterLevelLayer.layerId)) {\n          style.addPersistentLayer(\n            clusterLevelLayer,\n            LayerPosition(\n              /* above = */ associatedLayers.lastOrNull(),\n              /* below = */ null,\n              /* at = */ null\n            )\n          )\n          associatedLayers.add(clusterLevelLayer.layerId)\n          initClusterListener(clusterLevelLayer.layerId)\n        }\n      }\n      val clusterTextLayer = createClusterTextLayer(annotationSourceOptions, typeName, id)\n      if (!style.styleLayerExists(clusterTextLayer.layerId)) {\n        style.addPersistentLayer(\n          clusterTextLayer,\n          LayerPosition(\n            /* above = */ associatedLayers.lastOrNull(),\n            /* below = */ null,\n            /* at = */ null\n          )\n        )\n        associatedLayers.add(clusterTextLayer.layerId)\n      }\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun initClusterListener(clusterLayerId: String) {\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        ClickInteraction.layer(clusterLayerId) { selectedFeature, _ ->\n          if (selectedFeature.isCluster() && this is ClusterAnnotationManager) {\n            return@layer clusterClickListeners.any { it.onClusterClick(ClusterFeature(selectedFeature)) }\n          }\n          return@layer false\n        }\n      )\n    )\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        LongClickInteraction.layer(clusterLayerId) { selectedFeature, _ ->\n          if (selectedFeature.isCluster() && this is ClusterAnnotationManager) {\n            return@layer clusterLongClickListeners.any { it.onClusterLongClick(ClusterFeature(selectedFeature)) }\n          }\n          return@layer false\n        }\n      )\n    )\n  }\n\n  private fun createClusterLevelLayer(\n    level: Int,\n    colorLevels: List<Pair<Int, Int>>,\n    annotationSourceOptions: AnnotationSourceOptions?,\n    typeName: String,\n    id: Long\n  ) =\n    circleLayer(\"mapbox-android-$typeName-cluster-circle-layer-$level-$id\", source.sourceId) {\n      circleColor(colorLevels[level].second)\n      annotationSourceOptions?.clusterOptions?.let {\n        if (it.circleRadiusExpression == null) {\n          circleRadius(it.circleRadius)\n        } else {\n          circleRadius(it.circleRadiusExpression as Expression)\n        }\n      }\n      val pointCount = Expression.toNumber(get(POINT_COUNT))\n      filter(\n        if (level == 0) all(\n          has(POINT_COUNT),\n          gte(pointCount, literal(colorLevels[level].first.toLong()))\n        ) else all(\n          has(POINT_COUNT),\n          gt(pointCount, literal(colorLevels[level].first.toLong())),\n          lt(pointCount, literal(colorLevels[level - 1].first.toLong()))\n        )\n      )\n    }\n\n  private fun createClusterTextLayer(\n    annotationSourceOptions: AnnotationSourceOptions?,\n    typeName: String,\n    id: Long\n  ) =\n    symbolLayer(\"mapbox-android-$typeName-cluster-text-layer-$id\", source.sourceId) {\n      annotationSourceOptions?.clusterOptions?.let {\n        textField(if (it.textField == null) DEFAULT_TEXT_FIELD else it.textField as Expression)\n        if (it.textSizeExpression == null) {\n          textSize(it.textSize)\n        } else {\n          textSize(it.textSizeExpression as Expression)\n        }\n        if (it.textColorExpression == null) {\n          textColor(it.textColor)\n        } else {\n          textColor(it.textColorExpression as Expression)\n        }\n        textIgnorePlacement(true)\n        textAllowOverlap(true)\n      }\n    }\n\n  /**\n   * Create an annotation with the option\n   */\n  override fun create(option: S): T {\n    return option.build(UUID.randomUUID().toString(), this).also {\n      annotationMap[it.id] = it\n      styleImages.put(it)\n      updateSource()\n    }\n  }\n\n  /**\n   * Create some annotations with the options\n   */\n  override fun create(options: List<S>): List<T> {\n    val list = options.map { option ->\n      option.build(UUID.randomUUID().toString(), this).also {\n        annotationMap[it.id] = it\n        styleImages.put(it)\n      }\n    }\n    updateSource()\n    return list\n  }\n\n  /**\n   * Delete the annotation\n   */\n  override fun delete(annotation: T) {\n    if (annotationMap.remove(annotation.id) != null) {\n      styleImages.remove(annotation)\n      updateSource()\n    } else if (dragAnnotationMap.remove(annotation.id) != null) {\n      styleImages.remove(annotation)\n      updateDragSource()\n    } else {\n      logW(\n        TAG,\n        \"Can't delete annotation: $annotation, the annotation isn't an active annotation.\"\n      )\n    }\n  }\n\n  /**\n   * Delete annotations in the list\n   */\n  override fun delete(annotations: List<T>) {\n    var needUpdateSource = false\n    var needUpdateDragSource = false\n    annotations.forEach {\n      if (annotationMap.remove(it.id) != null) {\n        styleImages.remove(it)\n        needUpdateSource = true\n      } else if (dragAnnotationMap.remove(it.id) != null) {\n        styleImages.remove(it)\n        needUpdateDragSource = true\n      }\n    }\n    if (needUpdateSource) {\n      updateSource()\n    }\n    if (needUpdateDragSource) {\n      updateDragSource()\n    }\n  }\n\n  /**\n   * Delete all the added annotations\n   */\n  override fun deleteAll() {\n    if (annotationMap.isNotEmpty()) {\n      annotationMap.clear()\n      updateSource()\n    }\n    if (dragAnnotationMap.isNotEmpty()) {\n      dragAnnotationMap.clear()\n      updateDragSource()\n    }\n    styleImages.clear()\n  }\n\n  private fun updateDragSource() {\n    val style = delegateProvider.mapStyleManagerDelegate\n    if (!style.styleSourceExists(dragSource.sourceId) || !style.styleLayerExists(dragLayer.layerId)) {\n      logW(\n        TAG,\n        \"Can't update dragSource: drag source or layer has not been added to style.\"\n      )\n      return\n    }\n    addIconToStyle(style, dragAnnotationMap.values)\n    val features = convertAnnotationsToFeatures(dragAnnotationMap.values)\n    dragSource.featureCollection(FeatureCollection.fromFeatures(features))\n  }\n\n  /**\n   * Trigger an update to the underlying source\n   */\n  private fun updateSource() {\n    val style = delegateProvider.mapStyleManagerDelegate\n    if (!style.styleSourceExists(source.sourceId) || !style.styleLayerExists(layer.layerId)) {\n      logW(TAG, \"Can't update source: source or layer has not been added to style.\")\n      return\n    }\n    addIconToStyle(style, annotationMap.values)\n    val features = convertAnnotationsToFeatures(annotationMap.values)\n    source.featureCollection(FeatureCollection.fromFeatures(features))\n  }\n\n  // Add a bitmap to the style.\n  internal fun addStyleImage(imageId: String, bitmap: Bitmap) {\n    delegateProvider.mapStyleManagerDelegate.addImage(image(imageId, bitmap))\n    styleImages.put(imageId)\n  }\n\n  // Add icons to style from PointAnnotation.\n  private fun addIconToStyle(style: MapboxStyleManager, annotations: Collection<T>) {\n    // Add icon image bitmap from point annotation\n    annotations.forEach { annotation ->\n      (annotation as? PointAnnotation)?.let { symbol ->\n        symbol.iconImageInternal?.let { imageId ->\n          if (imageId.startsWith(PointAnnotation.ICON_DEFAULT_NAME_PREFIX)) {\n            /*\n             * Basically if an image with the `imageId` already exists we don't add it again. The\n             * reason we can do that is because the `imageId` starts with `ICON_DEFAULT_NAME_PREFIX`\n             * which means it has unique ID per bitmap.\n             */\n            if (!style.hasStyleImage(imageId)) {\n              // User set the bitmap icon, add the icon to style\n              symbol.iconImageBitmap?.let { mapboxImage ->\n                style.addImage(image(imageId, mapboxImage))\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  // Extension function on the JsonObject that annotation defines.\n  // If the default property value is defined for the data driven property in `AnnotationManager`, we\n  // check if the property value is already set in the `Annotation` JsonObject, if it's not defined in\n  // `Annotation`, we fallback to the property defined in the `AnnotationManager`.\n  private fun JsonObject.applyPropertyDefaults(): JsonObject = apply {\n    dataDrivenPropertyDefaultValues.entrySet().forEach {\n      if (!has(it.key)) {\n        add(it.key, it.value)\n      }\n    }\n  }\n\n  private fun convertAnnotationsToFeatures(annotations: Collection<T>): List<Feature> =\n    annotations.map {\n      it.setUsedDataDrivenProperties()\n      Feature.fromGeometry(it.geometry, it.getJsonObjectCopy().applyPropertyDefaults(), it.id)\n    }\n\n  /**\n   * Update the annotation\n   */\n  override fun update(annotation: T) {\n    when {\n      annotationMap.containsKey(annotation.id) -> {\n        annotationMap[annotation.id] = annotation\n        updateSource()\n      }\n\n      dragAnnotationMap.containsKey(annotation.id) -> {\n        dragAnnotationMap[annotation.id] = annotation\n        updateDragSource()\n      }\n\n      else -> {\n        logW(\n          TAG,\n          \"Can't update annotation: $annotation, the annotation isn't an active annotation.\"\n        )\n      }\n    }\n  }\n\n  /**\n   * Update annotations in the list\n   */\n  override fun update(annotations: List<T>) {\n    var needUpdateSource = false\n    var needUpdateDragSource = false\n    annotations.forEach {\n      when {\n        annotationMap.containsKey(it.id) -> {\n          annotationMap[it.id] = it\n          needUpdateSource = true\n        }\n\n        dragAnnotationMap.containsKey(it.id) -> {\n          dragAnnotationMap[it.id] = it\n          needUpdateDragSource = true\n        }\n\n        else -> {\n          logW(\n            TAG,\n            \"Can't update annotation: $it, the annotation isn't an active annotation.\"\n          )\n        }\n      }\n    }\n    if (needUpdateSource) {\n      updateSource()\n    }\n    if (needUpdateDragSource) {\n      updateDragSource()\n    }\n  }\n\n  /**\n   * Invoked when Mapview or Annotation manager is destroyed.\n   */\n  override fun onDestroy() {\n    val style = delegateProvider.mapStyleManagerDelegate\n    associatedLayers.forEach {\n      if (style.styleLayerExists(it)) {\n        style.removeStyleLayer(it)\n      }\n    }\n    associatedSources.forEach {\n      if (style.styleSourceExists(it)) {\n        style.removeStyleSource(it)\n      }\n    }\n    styleImages.clear()\n\n    unregisterInteractions()\n    annotationMap.clear()\n    dragAnnotationMap.clear()\n    dragListeners.clear()\n    clickListeners.clear()\n    longClickListeners.clear()\n    interactionListener.clear()\n    if (this is ClusterAnnotationManager) {\n      clusterClickListeners.clear()\n      clusterLongClickListeners.clear()\n    }\n  }\n\n  /**\n   * Toggles the annotation's selection state.\n   * If the annotation is deselected, it becomes selected.\n   * If the annotation is selected, it becomes deselected.\n   * @param annotation: The annotation to select.\n   */\n  override fun selectAnnotation(annotation: T) {\n    when {\n      annotationMap.containsKey(annotation.id) -> {\n        annotation.isSelected = !annotation.isSelected\n        annotationMap[annotation.id] = annotation\n        interactionListener.forEach {\n          if (annotation.isSelected) {\n            it.onSelectAnnotation(annotation)\n          } else {\n            it.onDeselectAnnotation(annotation)\n          }\n        }\n      }\n\n      dragAnnotationMap.containsKey(annotation.id) -> {\n        annotation.isSelected = !annotation.isSelected\n        dragAnnotationMap[annotation.id] = annotation\n        interactionListener.forEach {\n          if (annotation.isSelected) {\n            it.onSelectAnnotation(annotation)\n          } else {\n            it.onDeselectAnnotation(annotation)\n          }\n        }\n      }\n\n      else -> {\n        logW(\n          TAG,\n          \"Can't select annotation: $annotation, the annotation isn't an active annotation.\"\n        )\n      }\n    }\n  }\n\n  private fun startDragging(annotation: T): Boolean {\n    if (!annotation.isDraggable) {\n      return false\n    }\n    dragListeners.forEach { it.onAnnotationDragStarted(annotation) }\n    draggingAnnotation = annotation\n    return true\n  }\n\n  private fun stopDragging() {\n    draggingAnnotation?.let { annotation ->\n      dragListeners.forEach { it.onAnnotationDragFinished(annotation) }\n      draggingAnnotation = null\n    }\n  }\n\n  /**\n   * Invoked when MapView's width and height have changed.\n   * @param width the width of mapView\n   * @param height the height of mapView\n   */\n  override fun onSizeChanged(width: Int, height: Int) {\n    this.width = width\n    this.height = height\n  }\n\n  /**\n   * Enable a data-driven property\n   */\n  override fun enableDataDrivenProperty(property: String) {\n    if (dataDrivenPropertyUsageMap[property] == false) {\n      dataDrivenPropertyUsageMap[property] = true\n      setDataDrivenPropertyIsUsed(property)\n    }\n  }\n\n  /**\n   * Update a data-driven property to used state. Please visit [The online documentation](https://docs.mapbox.com/android/maps/guides/data-driven-styling/) for more details about data-driven-styling\n   */\n  protected abstract fun setDataDrivenPropertyIsUsed(property: String)\n\n  /**\n   * Query the rendered annotation for given point.\n   *\n   * Note: using this method blocks the calling thread.\n   *\n   * @param point the point for querying\n   * @return the queried annotation at this point\n   */\n  fun queryMapForFeatures(point: Point): T? {\n    val screenCoordinate = mapCameraManagerDelegate.pixelForCoordinate(point)\n    return queryMapForFeatures(screenCoordinate)\n  }\n\n  /**\n   * Query the rendered annotation for given screen coordinate.\n   *\n   * Note: using this method blocks the calling thread.\n   *\n   * @param screenCoordinate the screenCoordinate for querying\n   * @return the queried annotation on this screenCoordinate\n   */\n  fun queryMapForFeatures(screenCoordinate: ScreenCoordinate): T? {\n    var annotation: T? = null\n    val layerList = mutableListOf<String>()\n    layerList.add(layer.layerId)\n    layerList.add(dragLayer.layerId)\n    val latch = CountDownLatch(1)\n    mapFeatureQueryDelegate.executeOnRenderThread {\n      mapFeatureQueryDelegate.queryRenderedFeatures(\n        RenderedQueryGeometry(screenCoordinate),\n        RenderedQueryOptions(\n          layerList,\n          literal(true)\n        )\n      ) { features ->\n        features.value?.firstOrNull()?.queriedFeature?.feature?.getProperty(getAnnotationIdKey())\n          ?.let { annotationId ->\n            val id = annotationId.asString\n            when {\n              annotationMap.containsKey(id) -> {\n                annotation = annotationMap[id]\n              }\n\n              dragAnnotationMap.containsKey(id) -> {\n                annotation = dragAnnotationMap[id]\n              }\n\n              else -> {\n                logW(\n                  TAG,\n                  \"The queried id: $id, doesn't belong to an active annotation.\"\n                )\n              }\n            }\n          }\n        latch.countDown()\n      }\n    }\n    latch.await(QUERY_WAIT_TIME, TimeUnit.SECONDS)\n    return annotation\n  }\n\n  protected fun setLayerProperty(value: Value, propertyName: String) {\n    try {\n      with(delegateProvider.mapStyleManagerDelegate) {\n        setStyleLayerProperty(layer.layerId, propertyName, value)\n        setStyleLayerProperty(dragLayer.layerId, propertyName, value)\n      }\n    } catch (e: IllegalArgumentException) {\n      throw IllegalArgumentException(\n        \"Incorrect property value for $propertyName: ${e.message}\",\n        e.cause\n      )\n    }\n  }\n\n  /**\n   * Should not be used.\n   */\n  @Deprecated(\"Should not be used, will be removed in the next major version\")\n  inner class MapClick : OnMapClickListener {\n\n    /**\n     * Should not be used.\n     */\n    override fun onMapClick(point: Point): Boolean {\n      return false\n    }\n  }\n\n  /**\n   * Should not be used.\n   */\n  @Deprecated(\"Should not be used, will be removed in the next major version\")\n  inner class MapLongClick : OnMapLongClickListener {\n\n    /**\n     * Should not be used.\n     */\n    override fun onMapLongClick(point: Point): Boolean {\n      return false\n    }\n  }\n\n  /**\n   * Should not be used.\n   */\n  @Deprecated(\"Should not be used, will be removed in the next major version\")\n  inner class MapMove : OnMoveListener {\n    /**\n     * Should not be used.\n     */\n    override fun onMoveBegin(detector: MoveGestureDetector) { }\n\n    /**\n     * Should not be used.\n     */\n    override fun onMove(detector: MoveGestureDetector): Boolean { return false }\n\n    /**\n     * Should not be used.\n     */\n    override fun onMoveEnd(detector: MoveGestureDetector) { }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun FeaturesetFeature<FeatureState>.isCluster(): Boolean {\n    return properties.optBoolean(\"cluster\", false)\n  }\n\n  /**\n   * Tracks reference counts for style images associated with [PointAnnotation]s that use\n   * auto-generated icon image IDs starting with [PointAnnotation.ICON_DEFAULT_NAME_PREFIX].\n   *\n   * Each unique image ID is reference-counted so that the underlying style image is only removed\n   * from the map style when no annotation still references it. Images whose IDs do not start with\n   * the default prefix must be managed externally.\n   */\n  private inner class PointAnnotationStyleImages() {\n\n    /** Map from image ID to the number of annotations currently referencing it. */\n    private val images: MutableMap<String, Int> = mutableMapOf()\n    private val style get() = delegateProvider.mapStyleManagerDelegate\n\n    fun put(annotation: T) {\n      val imageId = (annotation as? PointAnnotation)?.iconImageInternal ?: return\n      put(imageId)\n    }\n\n    fun put(imageId: String) {\n      if (!imageId.startsWith(PointAnnotation.ICON_DEFAULT_NAME_PREFIX)) return\n      images[imageId] = (images[imageId] ?: 0) + 1\n    }\n\n    /**\n     * Decrements the reference count for the icon image of [annotation].\n     * When the count reaches zero the image is removed from the map style.\n     */\n    fun remove(annotation: T) {\n      val imageId = (annotation as? PointAnnotation)?.iconImageInternal ?: return\n      if (!imageId.startsWith(PointAnnotation.ICON_DEFAULT_NAME_PREFIX)) return\n      val newCount = (images[imageId] ?: return) - 1\n      if (newCount <= 0) {\n        images.remove(imageId)\n        if (style.hasStyleImage(imageId)) {\n          style.removeStyleImage(imageId)\n        }\n      } else {\n        images[imageId] = newCount\n      }\n    }\n\n    /**\n     * Removes all tracked images from the map style and clears the reference-count map.\n     * Called when the annotation manager is destroyed or all annotations are deleted.\n     */\n    fun clear() {\n      val style = style\n      images.keys.forEach { imageId ->\n        if (style.hasStyleImage(imageId)) {\n          style.removeStyleImage(imageId)\n        }\n      }\n      images.clear()\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  private companion object {\n    /**\n     * Tag for log\n     */\n    private const val TAG = \"AnnotationManagerImpl\"\n    private const val POINT_COUNT = \"point_count\"\n\n    /** At most wait 2 seconds to prevent ANR */\n    private const val QUERY_WAIT_TIME = 2L\n    private val DEFAULT_TEXT_FIELD = get(\"point_count\")\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/AnnotationPluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.plugin.annotation.generated.*\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport java.lang.ref.WeakReference\n\n/**\n * The impl class for AnnotationPlugin\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class AnnotationPluginImpl : AnnotationPlugin {\n  private lateinit var delegateProvider: MapDelegateProvider\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal val managerList = mutableListOf<WeakReference<AnnotationManager<*, *, *, *, *, *, *>>>()\n  private var width = 0\n  private var height = 0\n\n  /**\n   * Create an annotation manager.\n   *\n   * @param type The type of the created annotation manager\n   * @param annotationConfig Default is null, used for some custom configs\n   * @return The created annotation manager\n   */\n  override fun createAnnotationManager(\n    type: AnnotationType,\n    annotationConfig: AnnotationConfig?\n  ): AnnotationManager<*, *, *, *, *, *, *> {\n    val manager = when (type) {\n      AnnotationType.PolygonAnnotation -> PolygonAnnotationManager(\n        delegateProvider,\n        annotationConfig\n      )\n      AnnotationType.CircleAnnotation -> CircleAnnotationManager(\n        delegateProvider,\n        annotationConfig\n      )\n      AnnotationType.PolylineAnnotation -> PolylineAnnotationManager(\n        delegateProvider,\n        annotationConfig\n      )\n      AnnotationType.PointAnnotation -> PointAnnotationManager(\n        delegateProvider,\n        annotationConfig\n      )\n    }\n    manager.onSizeChanged(width, height)\n    managerList.add(WeakReference(manager))\n    return manager\n  }\n\n  /**\n   * Removes an annotation manager, this will remove the underlying layer and source from the style.\n   * A removed annotation manager will not be able to reuse anymore, users need to create new annotation manager\n   * to add annotations.\n   */\n  override fun removeAnnotationManager(annotationManager: AnnotationManager<*, *, *, *, *, *, *>) {\n    managerList.forEachIndexed { index, weakReference ->\n      weakReference.get()?.let {\n        if (it == annotationManager) {\n          managerList.removeAt(index)\n          annotationManager.onDestroy()\n          return\n        }\n      }\n    }\n  }\n\n  /**\n   * Invoked when MapView's width and height have changed.\n   * @param width the width of mapView\n   * @param height the height of mapView\n   */\n  override fun onSizeChanged(width: Int, height: Int) {\n    this.width = width\n    this.height = height\n    managerList.forEach { it.get()?.onSizeChanged(width, height) }\n  }\n\n  /**\n   * Called when a new Style is loaded.\n   *\n   * @param style\n   */\n  override fun onStyleChanged(style: MapboxStyleManager) {\n    // no-ops\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   */\n  override fun cleanup() {\n    managerList.forEach {\n      it.get()?.onDestroy()\n    }\n    managerList.clear()\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    this.delegateProvider = delegateProvider\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/ConvertUtils.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport com.google.gson.JsonArray\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MercatorCoordinate\nimport com.mapbox.maps.Projection\n\n/**\n * Util class for converting properties.\n */\nobject ConvertUtils {\n  /**\n   * Convert a list into a JsonArray with string format\n   */\n  fun convertStringArray(value: List<Any>?): JsonArray {\n    val jsonArray = JsonArray()\n    if (value != null) {\n      for (element in value) {\n        jsonArray.add(element.toString())\n      }\n    }\n    return jsonArray\n  }\n\n  /**\n   * Convert a list into a JsonArray with double format\n   */\n  fun convertDoubleArray(value: List<Any>?): JsonArray {\n    val jsonArray = JsonArray()\n    if (value != null) {\n      for (element in value) {\n        jsonArray.add(element.toString().toDouble())\n      }\n    }\n    return jsonArray\n  }\n\n  /**\n   * Convert a JsonArray to a list of Double\n   */\n  fun toDoubleArray(jsonArray: JsonArray?): List<Double> {\n    val array = mutableListOf<Double>()\n    if (jsonArray != null) {\n      for (i in 0 until jsonArray.size()) {\n        array[i] = jsonArray[i].asDouble\n      }\n    }\n    return array\n  }\n\n  /**\n   * Convert a JsonArray to a list of String\n   */\n  fun toStringArray(jsonArray: JsonArray?): List<String> {\n    val array = mutableListOf<String>()\n    if (jsonArray != null) {\n      for (i in 0 until jsonArray.size()) {\n        array[i] = jsonArray[i].asString\n      }\n    }\n    return array\n  }\n\n  /**\n   * Calculate the shift between two [Point]s in Mercator coordinate.\n   *\n   * @param startPoint the start point for the calculation.\n   * @param endPoint the end point for the calculation.\n   * @param zoomLevel the zoom level that apply the calculation.\n   *\n   * @return A [MercatorCoordinate] represent the shift between startPoint and endPoint.\n   */\n  fun calculateMercatorCoordinateShift(\n    startPoint: Point,\n    endPoint: Point,\n    zoomLevel: Double\n  ): MercatorCoordinate {\n    val centerMercatorCoordinate = Projection.project(startPoint, zoomLevel)\n    val targetMercatorCoordinate = Projection.project(endPoint, zoomLevel)\n\n    // Get the shift in Mercator coordinates\n    return MercatorCoordinate(\n      targetMercatorCoordinate.x - centerMercatorCoordinate.x,\n      targetMercatorCoordinate.y - centerMercatorCoordinate.y\n    )\n  }\n\n  /**\n   * Apply a [MercatorCoordinate] to the original point.\n   *\n   * @param point the point needs to shift.\n   * @param shiftMercatorCoordinate the shift that applied to the original point.\n   * @param zoomLevel the zoom level that apply the calculation.\n   *\n   * @return a shift point that applied the shift MercatorCoordinate.\n   */\n  fun shiftPointWithMercatorCoordinate(\n    point: Point,\n    shiftMercatorCoordinate: MercatorCoordinate,\n    zoomLevel: Double\n  ): Point {\n    // transform point to Mercator coordinate\n    val mercatorCoordinate = Projection.project(point, zoomLevel)\n    // calculate the shifted Mercator coordinate\n    val shiftedMercatorCoordinate = MercatorCoordinate(\n      mercatorCoordinate.x + shiftMercatorCoordinate.x,\n      mercatorCoordinate.y + shiftMercatorCoordinate.y\n    )\n    // transform Mercator coordinate to point\n    return Projection.unproject(shiftedMercatorCoordinate, zoomLevel)\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/QueryAnnotationCallback.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Callback for query annotation\n */\nfun interface QueryAnnotationCallback<T> {\n  /**\n   * Get the queried annotation\n   */\n  fun onQueryAnnotation(annotations: T)\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/CircleAnnotation.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport androidx.annotation.ColorInt\nimport com.google.gson.*\nimport com.mapbox.android.gestures.MoveDistancesObject\nimport com.mapbox.geojson.*\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.AnnotationManager\nimport com.mapbox.maps.plugin.annotation.AnnotationType\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\n\n/**\n * Class for CircleAnnotation\n */\nclass CircleAnnotation(\n  id: String,\n  /** The annotation manager that manipulate this annotation */\n  private val annotationManager: AnnotationManager<Point, CircleAnnotation, *, *, *, *, *>,\n  jsonObject: JsonObject,\n  geometry: Point\n) : Annotation<Point>(id, jsonObject, geometry) {\n\n  init {\n    jsonObject.addProperty(ID_KEY, id)\n  }\n\n  /**\n   * Get the type of this annotation\n   */\n  override fun getType(): AnnotationType {\n    return AnnotationType.CircleAnnotation\n  }\n\n  /**\n   * The Point of the circleAnnotation, which represents the location of the circleAnnotation on the map\n   *\n   * To update the circleAnnotation on the map use {@link CircleAnnotationManager#update(Annotation)}.\n   */\n  var point: Point\n    get() {\n      return geometry\n    }\n    set(value) {\n      geometry = value\n    }\n\n  // Property accessors\n  /**\n   * The circleSortKey property\n   *\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  var circleSortKey: Double?\n    /**\n     * Get the circleSortKey property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleSortKey property\n     *\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)\n      }\n    }\n\n  /**\n   * The circleBlur property\n   *\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   */\n  var circleBlur: Double?\n    /**\n     * Get the circleBlur property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleBlur property\n     *\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)\n      }\n    }\n\n  /**\n   * The circleColor property in Int\n   * The fill color of the circle. Default value: \"#000000\".\n   */\n  var circleColorInt: Int?\n    /**\n     * Get the circleColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the circleColor property\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      }\n    }\n\n  /**\n   * The circleColor property in String\n   *\n   * The fill color of the circle. Default value: \"#000000\".\n   */\n  var circleColorString: String?\n    /**\n     * Get the circleColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the circleColor property\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      }\n    }\n\n  /**\n   * The circleOpacity property\n   *\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var circleOpacity: Double?\n    /**\n     * Get the circleOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleOpacity property\n     *\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)\n      }\n    }\n\n  /**\n   * The circleRadius property\n   *\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   */\n  var circleRadius: Double?\n    /**\n     * Get the circleRadius property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleRadius property\n     *\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)\n      }\n    }\n\n  /**\n   * The circleStrokeColor property in Int\n   * The stroke color of the circle. Default value: \"#000000\".\n   */\n  var circleStrokeColorInt: Int?\n    /**\n     * Get the circleStrokeColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeColor property\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      }\n    }\n\n  /**\n   * The circleStrokeColor property in String\n   *\n   * The stroke color of the circle. Default value: \"#000000\".\n   */\n  var circleStrokeColorString: String?\n    /**\n     * Get the circleStrokeColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeColor property\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      }\n    }\n\n  /**\n   * The circleStrokeOpacity property\n   *\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   */\n  var circleStrokeOpacity: Double?\n    /**\n     * Get the circleStrokeOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeOpacity property\n     *\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)\n      }\n    }\n\n  /**\n   * The circleStrokeWidth property\n   *\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   */\n  var circleStrokeWidth: Double?\n    /**\n     * Get the circleStrokeWidth property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeWidth property\n     *\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)\n      }\n    }\n\n  /**\n   * The circleColorUseTheme property\n   *\n   * This property defines whether the `circleColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var circleColorUseTheme: String?\n    /**\n     * Get the circleColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the circleColorUseTheme property\n     *\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * The circleStrokeColorUseTheme property\n   *\n   * This property defines whether the `circleStrokeColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var circleStrokeColorUseTheme: String?\n    /**\n     * Get the circleStrokeColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeColorUseTheme property\n     *\n     * To update the circleAnnotation on the map use {@link circleAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * Get the offset geometry for the touch point\n   */\n  override fun getOffsetGeometry(\n    mapCameraManagerDelegate: MapCameraManagerDelegate,\n    moveDistancesObject: MoveDistancesObject\n  ): Point? {\n    val point = mapCameraManagerDelegate.coordinateForPixel(\n      ScreenCoordinate(\n        moveDistancesObject.currentX.toDouble(),\n        moveDistancesObject.currentY.toDouble(),\n      )\n    )\n    if (point.latitude() > MAX_MERCATOR_LATITUDE || point.latitude() < MIN_MERCATOR_LATITUDE) {\n      return null\n    }\n    return point\n  }\n\n  /**\n   * Set the used data-driven properties\n   */\n  override fun setUsedDataDrivenProperties() {\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)\n    }\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)\n    }\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n    }\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)\n    }\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)\n    }\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n    }\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)\n    }\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)\n    }\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)\n    }\n    jsonObject.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /** the Id key for annotation */\n    const val ID_KEY: String = \"CircleAnnotation\"\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/CircleAnnotationManager.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport androidx.annotation.ColorInt\nimport com.mapbox.geojson.*\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.get\nimport com.mapbox.maps.extension.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationManagerImpl\nimport com.mapbox.maps.plugin.annotation.AnnotationPlugin\nimport com.mapbox.maps.plugin.annotation.AnnotationType\nimport com.mapbox.maps.plugin.annotation.ClusterAnnotationManager\nimport com.mapbox.maps.plugin.annotation.OnClusterClickListener\nimport com.mapbox.maps.plugin.annotation.OnClusterLongClickListener\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport java.util.concurrent.atomic.AtomicLong\n\n/**\n * The circleAnnotation manager allows to add circleAnnotations to a map.\n */\nclass CircleAnnotationManager(\n  delegateProvider: MapDelegateProvider,\n  annotationConfig: AnnotationConfig? = null\n) :\n  AnnotationManagerImpl<Point, CircleAnnotation, CircleAnnotationOptions, OnCircleAnnotationDragListener, OnCircleAnnotationClickListener, OnCircleAnnotationLongClickListener, OnCircleAnnotationInteractionListener, CircleLayer>(\n    delegateProvider, annotationConfig, ID_GENERATOR.incrementAndGet(), \"circleAnnotation\", ::CircleLayer\n  ),\n  ClusterAnnotationManager {\n\n  /**\n   * The Added clusterClickListeners\n   */\n  override val clusterClickListeners: MutableList<OnClusterClickListener> = mutableListOf()\n\n  /**\n   * The Added clusterLongClickListeners\n   */\n  override val clusterLongClickListeners: MutableList<OnClusterLongClickListener> = mutableListOf()\n\n  @OptIn(MapboxExperimental::class)\n  override fun setDataDrivenPropertyIsUsed(property: String) {\n    when (property) {\n      CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY -> {\n        layer.circleSortKey(get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY))\n        dragLayer.circleSortKey(get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY))\n      }\n      CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR -> {\n        layer.circleBlur(get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR))\n        dragLayer.circleBlur(get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR))\n      }\n      CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR -> {\n        layer.circleColor(get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR))\n        dragLayer.circleColor(get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR))\n      }\n      CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY -> {\n        layer.circleOpacity(get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY))\n        dragLayer.circleOpacity(get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY))\n      }\n      CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS -> {\n        layer.circleRadius(get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS))\n        dragLayer.circleRadius(get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS))\n      }\n      CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR -> {\n        layer.circleStrokeColor(get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR))\n        dragLayer.circleStrokeColor(get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR))\n      }\n      CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY -> {\n        layer.circleStrokeOpacity(get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY))\n        dragLayer.circleStrokeOpacity(get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY))\n      }\n      CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH -> {\n        layer.circleStrokeWidth(get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH))\n        dragLayer.circleStrokeWidth(get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH))\n      }\n      CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME -> {\n        layer.circleColorUseTheme(get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME))\n        dragLayer.circleColorUseTheme(get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME))\n      }\n      CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME -> {\n        layer.circleStrokeColorUseTheme(get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME))\n        dragLayer.circleStrokeColorUseTheme(get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME))\n      }\n    }\n  }\n\n  /**\n   * Create a list of circleAnnotations on the map.\n   *\n   * CircleAnnotations are going to be created only for features with a matching geometry.\n   *\n   * All supported properties are:\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR - String\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR - String\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME - String\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME - String\n   * Learn more about above properties in the )[The online documentation](https://docs.mapbox.com/style-spec/).\n   *\n   * Out of spec properties:\n   * \"is-draggable\" - Boolean, true if the circleAnnotation should be draggable, false otherwise\n   *\n   * @param json the GeoJSON defining the list of circleAnnotations to build\n   * @return the list of built circleAnnotations\n   */\n  fun create(json: String): List<CircleAnnotation> {\n    return create(FeatureCollection.fromJson(json))\n  }\n\n  /**\n   * Create a list of circleAnnotations on the map.\n   *\n   * CircleAnnotations are going to be created only for features with a matching geometry.\n   *\n   * All supported properties are:\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR - String\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR - String\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH - Double\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME - String\n   * CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME - String\n   * Learn more about above properties in the )[The online documentation](https://docs.mapbox.com/style-spec/).\n   *\n   * Out of spec properties:\n   * \"is-draggable\" - Boolean, true if the circleAnnotation should be draggable, false otherwise\n   *\n   * @param featureCollection the featureCollection defining the list of circleAnnotations to build\n   * @return the list of built circleAnnotations\n   */\n  fun create(featureCollection: FeatureCollection): List<CircleAnnotation> {\n    featureCollection.features()?.let { features ->\n      val options = features.mapNotNull {\n        CircleAnnotationOptions.fromFeature(it)\n      }\n      return create(options)\n    }\n    return listOf()\n  }\n\n  /**\n   * Get the key of the id of the annotation.\n   *\n   * @return the key of the id of the annotation\n   */\n  override fun getAnnotationIdKey(): String {\n    return CircleAnnotation.ID_KEY\n  }\n\n  // Property accessors\n  /**\n   * The CircleElevationReference property\n   *\n   * Selects the base of circle-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  @MapboxExperimental\n  var circleElevationReference: CircleElevationReference?\n    /**\n     * Get the CircleElevationReference property\n     *\n     * @return property wrapper value around CircleElevationReference\n     */\n    get(): CircleElevationReference? {\n      return layer.circleElevationReference\n    }\n    /**\n     * Set the CircleElevationReference property\n     * @param value property wrapper value around CircleElevationReference\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-elevation-reference\").value\n      }\n      setLayerProperty(wrappedValue, \"circle-elevation-reference\")\n    }\n\n  /**\n   * The default circleSortKey for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  var circleSortKey: Double?\n    /**\n     * Get the circleSortKey property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleSortKey property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default circleBlur for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   */\n  var circleBlur: Double?\n    /**\n     * Get the circleBlur property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleBlur property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default circleColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The fill color of the circle. Default value: \"#000000\".\n   */\n  var circleColorInt: Int?\n    /**\n     * Get the circleColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the circleColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default circleColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The fill color of the circle. Default value: \"#000000\".\n   */\n  var circleColorString: String?\n    /**\n     * Get the circleColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the circleColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The CircleEmissiveStrength property\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of circleEmissiveStrength is in intensity.\n   */\n  var circleEmissiveStrength: Double?\n    /**\n     * Get the CircleEmissiveStrength property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.circleEmissiveStrength\n    }\n    /**\n     * Set the CircleEmissiveStrength property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-emissive-strength\").value\n      }\n      setLayerProperty(wrappedValue, \"circle-emissive-strength\")\n    }\n\n  /**\n   * The default circleOpacity for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var circleOpacity: Double?\n    /**\n     * Get the circleOpacity property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleOpacity property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The CirclePitchAlignment property\n   *\n   * Orientation of circle when map is pitched. Default value: \"viewport\".\n   */\n  var circlePitchAlignment: CirclePitchAlignment?\n    /**\n     * Get the CirclePitchAlignment property\n     *\n     * @return property wrapper value around CirclePitchAlignment\n     */\n    get(): CirclePitchAlignment? {\n      return layer.circlePitchAlignment\n    }\n    /**\n     * Set the CirclePitchAlignment property\n     * @param value property wrapper value around CirclePitchAlignment\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-alignment\").value\n      }\n      setLayerProperty(wrappedValue, \"circle-pitch-alignment\")\n    }\n\n  /**\n   * The CirclePitchScale property\n   *\n   * Controls the scaling behavior of the circle when the map is pitched. Default value: \"map\".\n   */\n  var circlePitchScale: CirclePitchScale?\n    /**\n     * Get the CirclePitchScale property\n     *\n     * @return property wrapper value around CirclePitchScale\n     */\n    get(): CirclePitchScale? {\n      return layer.circlePitchScale\n    }\n    /**\n     * Set the CirclePitchScale property\n     * @param value property wrapper value around CirclePitchScale\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-pitch-scale\").value\n      }\n      setLayerProperty(wrappedValue, \"circle-pitch-scale\")\n    }\n\n  /**\n   * The default circleRadius for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   */\n  var circleRadius: Double?\n    /**\n     * Get the circleRadius property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleRadius property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default circleStrokeColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The stroke color of the circle. Default value: \"#000000\".\n   */\n  var circleStrokeColorInt: Int?\n    /**\n     * Get the circleStrokeColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default circleStrokeColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The stroke color of the circle. Default value: \"#000000\".\n   */\n  var circleStrokeColorString: String?\n    /**\n     * Get the circleStrokeColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default circleStrokeOpacity for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   */\n  var circleStrokeOpacity: Double?\n    /**\n     * Get the circleStrokeOpacity property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeOpacity property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default circleStrokeWidth for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   */\n  var circleStrokeWidth: Double?\n    /**\n     * Get the circleStrokeWidth property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeWidth property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The CircleTranslate property\n   *\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of circleTranslate is in pixels.\n   */\n  var circleTranslate: List<Double>?\n    /**\n     * Get the CircleTranslate property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.circleTranslate\n    }\n    /**\n     * Set the CircleTranslate property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate\").value\n      }\n      setLayerProperty(wrappedValue, \"circle-translate\")\n    }\n\n  /**\n   * The CircleTranslateAnchor property\n   *\n   * Controls the frame of reference for `circle-translate`. Default value: \"map\".\n   */\n  var circleTranslateAnchor: CircleTranslateAnchor?\n    /**\n     * Get the CircleTranslateAnchor property\n     *\n     * @return property wrapper value around CircleTranslateAnchor\n     */\n    get(): CircleTranslateAnchor? {\n      return layer.circleTranslateAnchor\n    }\n    /**\n     * Set the CircleTranslateAnchor property\n     * @param value property wrapper value around CircleTranslateAnchor\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"circle-translate-anchor\").value\n      }\n      setLayerProperty(wrappedValue, \"circle-translate-anchor\")\n    }\n\n  /**\n   * The Slot property\n   *\n   * The slot this layer is assigned to. If specified, and a slot with that name exists, it will be placed at that position in the layer order.\n   */\n  var slot: String?\n    /**\n     * Get the Slot property\n     *\n     * @return property wrapper value around String\n     */\n    get(): String? {\n      return layer.slot\n    }\n    /**\n     * Set the Slot property\n     * @param value property wrapper value around String\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"slot\").value\n      }\n      setLayerProperty(wrappedValue, \"slot\")\n    }\n\n  /**\n   * The MaxZoom property\n   *\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  var maxZoom: Double?\n    /**\n     * Get the MaxZoom property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.maxZoom\n    }\n    /**\n     * Set the MaxZoom property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"maxzoom\").value\n      }\n      setLayerProperty(wrappedValue, \"maxzoom\")\n    }\n\n  /**\n   * The MinZoom property\n   *\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  var minZoom: Double?\n    /**\n     * Get the MinZoom property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.minZoom\n    }\n    /**\n     * Set the MinZoom property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"circle\", \"minzoom\").value\n      }\n      setLayerProperty(wrappedValue, \"minzoom\")\n    }\n\n  /**\n   * The default circleColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `circleColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var circleColorUseTheme: String?\n    /**\n     * Get the circleColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the circleColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default circleStrokeColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `circleStrokeColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var circleStrokeColorUseTheme: String?\n    /**\n     * Get the circleStrokeColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the circleStrokeColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The filter on the managed circleAnnotations.\n   */\n  override var layerFilter: Expression?\n    /**\n     * Get filter of the managed circleAnnotations.\n     *\n     * @return expression\n     */\n    get() = layer.filter\n    /**\n     * Set filter on the managed circleAnnotations.\n     *\n     * @param value expression\n     */\n    set(value) {\n      value?.let {\n        layer.filter(it)\n        dragLayer.filter(it)\n      }\n    }\n\n  init {\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY] = false\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR] = false\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR] = false\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY] = false\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS] = false\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR] = false\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY] = false\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH] = false\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME] = false\n    dataDrivenPropertyUsageMap[CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME] = false\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /** The generator for id */\n    var ID_GENERATOR = AtomicLong(0)\n  }\n}\n\n/**\n * Extension function to create a CircleAnnotationManager instance.\n */\nfun AnnotationPlugin.createCircleAnnotationManager(\n  annotationConfig: AnnotationConfig? = null\n): CircleAnnotationManager {\n  return createAnnotationManager(AnnotationType.CircleAnnotation, annotationConfig) as CircleAnnotationManager\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/CircleAnnotationOptions.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport androidx.annotation.ColorInt\nimport com.google.gson.JsonElement\nimport com.google.gson.JsonObject\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxAnnotationException\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.AnnotationManager\nimport com.mapbox.maps.plugin.annotation.AnnotationOptions\n\n/**\n * Builder class from which a circleAnnotation is created.\n */\nclass CircleAnnotationOptions : AnnotationOptions<Point, CircleAnnotation> {\n  private var isDraggable: Boolean = false\n  private var data: JsonElement? = null\n  private var geometry: Point? = null\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  var circleSortKey: Double? = null\n\n  /**\n   * Set circle-sort-key to initialise the circleAnnotation with.\n   *\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * @param circleSortKey the circle-sort-key value\n   * @return this\n   */\n  fun withCircleSortKey(circleSortKey: Double): CircleAnnotationOptions {\n    this.circleSortKey = circleSortKey\n    return this\n  }\n\n  /**\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   */\n  var circleBlur: Double? = null\n\n  /**\n   * Set circle-blur to initialise the circleAnnotation with.\n   *\n   * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. Setting a negative value renders the blur as an inner glow effect. Default value: 0.\n   *\n   * @param circleBlur the circle-blur value\n   * @return this\n   */\n  fun withCircleBlur(circleBlur: Double): CircleAnnotationOptions {\n    this.circleBlur = circleBlur\n    return this\n  }\n\n  /**\n   * The fill color of the circle. Default value: \"#000000\".\n   */\n  var circleColor: String? = null\n\n  /**\n   * Set circle-color to initialise the circleAnnotation with.\n   *\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * @param circleColor the circle-color value\n   * @return this\n   */\n  fun withCircleColor(circleColor: String): CircleAnnotationOptions {\n    this.circleColor = circleColor\n    return this\n  }\n\n  /**\n   * Set circle-color to initialise the circleAnnotation with.\n   *\n   * The fill color of the circle. Default value: \"#000000\".\n   *\n   * @param circleColor the circle-color value with ColorInt format\n   * @return this\n   */\n  fun withCircleColor(@ColorInt circleColor: Int): CircleAnnotationOptions {\n    this.circleColor = ColorUtils.colorToRgbaString(circleColor)\n    return this\n  }\n\n  /**\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var circleOpacity: Double? = null\n\n  /**\n   * Set circle-opacity to initialise the circleAnnotation with.\n   *\n   * The opacity at which the circle will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param circleOpacity the circle-opacity value\n   * @return this\n   */\n  fun withCircleOpacity(circleOpacity: Double): CircleAnnotationOptions {\n    this.circleOpacity = circleOpacity\n    return this\n  }\n\n  /**\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   */\n  var circleRadius: Double? = null\n\n  /**\n   * Set circle-radius to initialise the circleAnnotation with.\n   *\n   * Circle radius. Default value: 5. Minimum value: 0. The unit of circleRadius is in pixels.\n   *\n   * @param circleRadius the circle-radius value\n   * @return this\n   */\n  fun withCircleRadius(circleRadius: Double): CircleAnnotationOptions {\n    this.circleRadius = circleRadius\n    return this\n  }\n\n  /**\n   * The stroke color of the circle. Default value: \"#000000\".\n   */\n  var circleStrokeColor: String? = null\n\n  /**\n   * Set circle-stroke-color to initialise the circleAnnotation with.\n   *\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * @param circleStrokeColor the circle-stroke-color value\n   * @return this\n   */\n  fun withCircleStrokeColor(circleStrokeColor: String): CircleAnnotationOptions {\n    this.circleStrokeColor = circleStrokeColor\n    return this\n  }\n\n  /**\n   * Set circle-stroke-color to initialise the circleAnnotation with.\n   *\n   * The stroke color of the circle. Default value: \"#000000\".\n   *\n   * @param circleStrokeColor the circle-stroke-color value with ColorInt format\n   * @return this\n   */\n  fun withCircleStrokeColor(@ColorInt circleStrokeColor: Int): CircleAnnotationOptions {\n    this.circleStrokeColor = ColorUtils.colorToRgbaString(circleStrokeColor)\n    return this\n  }\n\n  /**\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   */\n  var circleStrokeOpacity: Double? = null\n\n  /**\n   * Set circle-stroke-opacity to initialise the circleAnnotation with.\n   *\n   * The opacity of the circle's stroke. Default value: 1. Value range: [0, 1]\n   *\n   * @param circleStrokeOpacity the circle-stroke-opacity value\n   * @return this\n   */\n  fun withCircleStrokeOpacity(circleStrokeOpacity: Double): CircleAnnotationOptions {\n    this.circleStrokeOpacity = circleStrokeOpacity\n    return this\n  }\n\n  /**\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   */\n  var circleStrokeWidth: Double? = null\n\n  /**\n   * Set circle-stroke-width to initialise the circleAnnotation with.\n   *\n   * The width of the circle's stroke. Strokes are placed outside of the `circle-radius`. Default value: 0. Minimum value: 0. The unit of circleStrokeWidth is in pixels.\n   *\n   * @param circleStrokeWidth the circle-stroke-width value\n   * @return this\n   */\n  fun withCircleStrokeWidth(circleStrokeWidth: Double): CircleAnnotationOptions {\n    this.circleStrokeWidth = circleStrokeWidth\n    return this\n  }\n\n  /**\n   * This property defines whether the `circleColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var circleColorUseTheme: String? = null\n\n  /**\n   * Set circle-color-use-theme to initialise the circleAnnotation with.\n   *\n   * This property defines whether the `circleColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param circleColorUseTheme the circle-color-use-theme value\n   * @return this\n   */\n  fun withCircleColorUseTheme(circleColorUseTheme: String): CircleAnnotationOptions {\n    this.circleColorUseTheme = circleColorUseTheme\n    return this\n  }\n\n  /**\n   * This property defines whether the `circleStrokeColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var circleStrokeColorUseTheme: String? = null\n\n  /**\n   * Set circle-stroke-color-use-theme to initialise the circleAnnotation with.\n   *\n   * This property defines whether the `circleStrokeColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param circleStrokeColorUseTheme the circle-stroke-color-use-theme value\n   * @return this\n   */\n  fun withCircleStrokeColorUseTheme(circleStrokeColorUseTheme: String): CircleAnnotationOptions {\n    this.circleStrokeColorUseTheme = circleStrokeColorUseTheme\n    return this\n  }\n\n  /**\n   * Set the Point of the circleAnnotation, which represents the location of the circleAnnotation on the map\n   *\n   * @param point the location of the circleAnnotation in a longitude and latitude pair\n   * @return this\n   */\n  fun withPoint(point: Point): CircleAnnotationOptions {\n    geometry = point\n    return this\n  }\n\n  /**\n   * Get the Point of the circleAnnotation, which represents the location of the circleAnnotation on the map\n   *\n   * @return the location of the circleAnnotation in a longitude and latitude pair\n   */\n  fun getPoint(): Point? {\n    return geometry\n  }\n\n  /**\n   * Set the geometry of the circleAnnotation, which represents the location of the circleAnnotation on the map\n   *\n   * @param geometry the location of the circleAnnotation\n   * @return this\n   */\n  fun withGeometry(geometry: Point): CircleAnnotationOptions {\n    this.geometry = geometry\n    return this\n  }\n\n  /**\n   * Get the geometry of the circleAnnotation, which represents the location of the circleAnnotation on the map\n   *\n   * @return the location of the circleAnnotation\n   */\n  fun getGeometry(): Point? {\n    return geometry\n  }\n\n  /**\n   * Returns whether this circleAnnotation is draggable, meaning it can be dragged across the screen when touched and moved.\n   *\n   * @return draggable when touched\n   */\n  fun getDraggable(): Boolean {\n    return isDraggable\n  }\n\n  /**\n   * Set whether this circleAnnotation should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when circleAnnotation is also part of the cluster, then once circleAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate circleAnnotation.\n   *\n   * @param draggable should be draggable\n   */\n  fun withDraggable(draggable: Boolean): CircleAnnotationOptions {\n    isDraggable = draggable\n    return this\n  }\n\n  /**\n   * Set the arbitrary json data of the annotation.\n   *\n   * @param jsonElement the arbitrary json element data\n   */\n  fun withData(jsonElement: JsonElement): CircleAnnotationOptions {\n    this.data = jsonElement\n    return this\n  }\n\n  /**\n   * Get the arbitrary json data of the annotation.\n   *\n   * @return the arbitrary json object data if set, else null\n   */\n  fun getData(): JsonElement? {\n    return data\n  }\n\n  /**\n   * Build an annotation\n   *\n   * @param id: the id for this annotation\n   * @param annotationManager: the annotationManager that manage this annotation\n   *\n   * @return the annotation that is built\n   */\n  override fun build(\n    id: String,\n    annotationManager: AnnotationManager<Point, CircleAnnotation, *, *, *, *, *>\n  ): CircleAnnotation {\n    if (geometry == null) {\n      throw MapboxAnnotationException(\"geometry field is required\")\n    }\n    val jsonObject = JsonObject()\n    circleSortKey?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_SORT_KEY, it)\n    }\n    circleBlur?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_BLUR, it)\n    }\n    circleColor?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_COLOR, it)\n    }\n    circleOpacity?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_OPACITY, it)\n    }\n    circleRadius?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_RADIUS, it)\n    }\n    circleStrokeColor?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_STROKE_COLOR, it)\n    }\n    circleStrokeOpacity?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_STROKE_OPACITY, it)\n    }\n    circleStrokeWidth?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_STROKE_WIDTH, it)\n    }\n    circleColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_COLOR_USE_THEME, it)\n    }\n    circleStrokeColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME, it)\n    }\n    val circleAnnotation = CircleAnnotation(id, annotationManager, jsonObject, geometry!!)\n    circleAnnotation.isDraggable = isDraggable\n    circleAnnotation.setData(data)\n    return circleAnnotation\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /** The property for circle-sort-key */\n    const val PROPERTY_CIRCLE_SORT_KEY = \"circle-sort-key\"\n\n    /** The property for circle-blur */\n    const val PROPERTY_CIRCLE_BLUR = \"circle-blur\"\n\n    /** The property for circle-color */\n    const val PROPERTY_CIRCLE_COLOR = \"circle-color\"\n\n    /** The property for circle-opacity */\n    const val PROPERTY_CIRCLE_OPACITY = \"circle-opacity\"\n\n    /** The property for circle-radius */\n    const val PROPERTY_CIRCLE_RADIUS = \"circle-radius\"\n\n    /** The property for circle-stroke-color */\n    const val PROPERTY_CIRCLE_STROKE_COLOR = \"circle-stroke-color\"\n\n    /** The property for circle-stroke-opacity */\n    const val PROPERTY_CIRCLE_STROKE_OPACITY = \"circle-stroke-opacity\"\n\n    /** The property for circle-stroke-width */\n    const val PROPERTY_CIRCLE_STROKE_WIDTH = \"circle-stroke-width\"\n\n    /** The property for circle-color-use-theme */\n    const val PROPERTY_CIRCLE_COLOR_USE_THEME = \"circle-color-use-theme\"\n\n    /** The property for circle-stroke-color-use-theme */\n    const val PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME = \"circle-stroke-color-use-theme\"\n\n    /** The property for is-draggable */\n    private const val PROPERTY_IS_DRAGGABLE = \"is-draggable\"\n\n    /**\n     * Creates CircleAnnotationOptions out of a Feature.\n     *\n     * @param feature feature to be converted\n     */\n    fun fromFeature(feature: Feature): CircleAnnotationOptions? {\n      if (feature.geometry() == null) {\n        throw MapboxAnnotationException(\"geometry field is required\")\n      }\n      if (feature.geometry() !is Point) {\n\n        return null\n      }\n\n      val options = CircleAnnotationOptions()\n      options.geometry = feature.geometry() as (Point)\n      if (feature.hasProperty(PROPERTY_CIRCLE_SORT_KEY)) {\n        options.circleSortKey = feature.getProperty(PROPERTY_CIRCLE_SORT_KEY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_CIRCLE_BLUR)) {\n        options.circleBlur = feature.getProperty(PROPERTY_CIRCLE_BLUR).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_CIRCLE_COLOR)) {\n        options.circleColor = feature.getProperty(PROPERTY_CIRCLE_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_CIRCLE_OPACITY)) {\n        options.circleOpacity = feature.getProperty(PROPERTY_CIRCLE_OPACITY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_CIRCLE_RADIUS)) {\n        options.circleRadius = feature.getProperty(PROPERTY_CIRCLE_RADIUS).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_CIRCLE_STROKE_COLOR)) {\n        options.circleStrokeColor = feature.getProperty(PROPERTY_CIRCLE_STROKE_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_CIRCLE_STROKE_OPACITY)) {\n        options.circleStrokeOpacity = feature.getProperty(PROPERTY_CIRCLE_STROKE_OPACITY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_CIRCLE_STROKE_WIDTH)) {\n        options.circleStrokeWidth = feature.getProperty(PROPERTY_CIRCLE_STROKE_WIDTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_CIRCLE_COLOR_USE_THEME)) {\n        options.circleColorUseTheme = feature.getProperty(PROPERTY_CIRCLE_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)) {\n        options.circleStrokeColorUseTheme = feature.getProperty(PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_IS_DRAGGABLE)) {\n        options.isDraggable = feature.getProperty(PROPERTY_IS_DRAGGABLE).asBoolean\n      }\n      return options\n    }\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnCircleAnnotationClickListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationClickListener\n\n/**\n * Interface definition for a callback to be invoked when a circleAnnotation has been clicked.\n */\nfun interface OnCircleAnnotationClickListener : OnAnnotationClickListener<CircleAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnCircleAnnotationDragListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationDragListener\n\n/**\n * Interface definition for a callback to be invoked when a circleAnnotation is dragged.\n */\ninterface OnCircleAnnotationDragListener : OnAnnotationDragListener<CircleAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnCircleAnnotationInteractionListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener\n\n/**\n * Interface definition for a callback to be invoked when a circleAnnotation has been selected or deselected.\n */\ninterface OnCircleAnnotationInteractionListener : OnAnnotationInteractionListener<CircleAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnCircleAnnotationLongClickListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener\n\n/**\n * Interface definition for a callback to be invoked when a circleAnnotation has been long clicked.\n */\nfun interface OnCircleAnnotationLongClickListener : OnAnnotationLongClickListener<CircleAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPointAnnotationClickListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationClickListener\n\n/**\n * Interface definition for a callback to be invoked when a pointAnnotation has been clicked.\n */\nfun interface OnPointAnnotationClickListener : OnAnnotationClickListener<PointAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPointAnnotationDragListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationDragListener\n\n/**\n * Interface definition for a callback to be invoked when a pointAnnotation is dragged.\n */\ninterface OnPointAnnotationDragListener : OnAnnotationDragListener<PointAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPointAnnotationInteractionListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener\n\n/**\n * Interface definition for a callback to be invoked when a pointAnnotation has been selected or deselected.\n */\ninterface OnPointAnnotationInteractionListener : OnAnnotationInteractionListener<PointAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPointAnnotationLongClickListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener\n\n/**\n * Interface definition for a callback to be invoked when a pointAnnotation has been long clicked.\n */\nfun interface OnPointAnnotationLongClickListener : OnAnnotationLongClickListener<PointAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPolygonAnnotationClickListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationClickListener\n\n/**\n * Interface definition for a callback to be invoked when a polygonAnnotation has been clicked.\n */\nfun interface OnPolygonAnnotationClickListener : OnAnnotationClickListener<PolygonAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPolygonAnnotationDragListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationDragListener\n\n/**\n * Interface definition for a callback to be invoked when a polygonAnnotation is dragged.\n */\ninterface OnPolygonAnnotationDragListener : OnAnnotationDragListener<PolygonAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPolygonAnnotationInteractionListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener\n\n/**\n * Interface definition for a callback to be invoked when a polygonAnnotation has been selected or deselected.\n */\ninterface OnPolygonAnnotationInteractionListener : OnAnnotationInteractionListener<PolygonAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPolygonAnnotationLongClickListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener\n\n/**\n * Interface definition for a callback to be invoked when a polygonAnnotation has been long clicked.\n */\nfun interface OnPolygonAnnotationLongClickListener : OnAnnotationLongClickListener<PolygonAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPolylineAnnotationClickListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationClickListener\n\n/**\n * Interface definition for a callback to be invoked when a polylineAnnotation has been clicked.\n */\nfun interface OnPolylineAnnotationClickListener : OnAnnotationClickListener<PolylineAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPolylineAnnotationDragListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationDragListener\n\n/**\n * Interface definition for a callback to be invoked when a polylineAnnotation is dragged.\n */\ninterface OnPolylineAnnotationDragListener : OnAnnotationDragListener<PolylineAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPolylineAnnotationInteractionListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener\n\n/**\n * Interface definition for a callback to be invoked when a polylineAnnotation has been selected or deselected.\n */\ninterface OnPolylineAnnotationInteractionListener : OnAnnotationInteractionListener<PolylineAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/OnPolylineAnnotationLongClickListener.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener\n\n/**\n * Interface definition for a callback to be invoked when a polylineAnnotation has been long clicked.\n */\nfun interface OnPolylineAnnotationLongClickListener : OnAnnotationLongClickListener<PolylineAnnotation>"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/PointAnnotation.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport android.graphics.Bitmap\nimport androidx.annotation.ColorInt\nimport com.google.gson.*\nimport com.mapbox.android.gestures.MoveDistancesObject\nimport com.mapbox.geojson.*\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.AnnotationManager\nimport com.mapbox.maps.plugin.annotation.AnnotationType\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport java.util.Locale\n\n/**\n * Class for PointAnnotation\n */\nclass PointAnnotation(\n  id: String,\n  /** The annotation manager that manipulate this annotation */\n  private val annotationManager: AnnotationManager<Point, PointAnnotation, *, *, *, *, *>,\n  jsonObject: JsonObject,\n  geometry: Point\n) : Annotation<Point>(id, jsonObject, geometry) {\n\n  init {\n    jsonObject.addProperty(ID_KEY, id)\n  }\n\n  /**\n   * Get the type of this annotation\n   */\n  override fun getType(): AnnotationType {\n    return AnnotationType.PointAnnotation\n  }\n\n  /**\n   * The Point of the pointAnnotation, which represents the location of the pointAnnotation on the map\n   *\n   * To update the pointAnnotation on the map use {@link PointAnnotationManager#update(Annotation)}.\n   */\n  var point: Point\n    get() {\n      return geometry\n    }\n    set(value) {\n      geometry = value\n    }\n\n  /**\n   * The bitmap image for this Symbol\n   *\n   * Will not take effect if [iconImageInternal] has been set.\n   */\n  var iconImageBitmap: Bitmap? = null\n    /**\n     * Set the iconImageBitmap property\n     *\n     * @param value the iconBitmap\n     */\n    set(value) {\n      if (value != null) {\n        if (field != value) {\n          field = value\n          if (iconImageInternal == null || iconImageInternal!!.startsWith(ICON_DEFAULT_NAME_PREFIX)) {\n            // User does not set iconImage, update iconImage to this new bitmap\n            iconImageInternal = iconImageId(annotationManager, value)\n          }\n        }\n      } else {\n        field = null\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_IMAGE)\n      }\n    }\n\n  /**\n   * The iconImageCrossFade property\n   *\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. Default value: 0. Value range: [0, 1]\n   */\n  @Deprecated(\"This property has been deprecated and will do no operations. Use PointAnnotationManager.iconImageCrossFade instead\")\n  var iconImageCrossFade: Double?\n    /**\n     * Get the iconImageCrossFade property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      return null\n    }\n    /**\n     * Set the iconImageCrossFade property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      // Do nothing, this property is deprecated\n    }\n  // Property accessors\n  /**\n   * The iconAnchor property\n   *\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   */\n  var iconAnchor: IconAnchor?\n    /**\n     * Get the iconAnchor property\n     *\n     * @return property wrapper value around IconAnchor\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)\n      value?.let {\n        return IconAnchor.valueOf(it.asString.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n    /**\n     * Set the iconAnchor property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for IconAnchor\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_ANCHOR, value.value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)\n      }\n    }\n\n  /**\n   * Internal property for iconImage\n   */\n  internal var iconImageInternal: String?\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_IMAGE, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_IMAGE)\n      }\n    }\n\n  /**\n   * The iconImage property\n   *\n   * Name of image in sprite to use for drawing an image background.\n   */\n  var iconImage: String?\n    /**\n     * Get the iconImage property\n     *\n     * @return property wrapper value around String\n     */\n    @Deprecated(\n      \"Reading iconImage potentially exposes an internally generated image ID. \" +\n        \"Consider saving the image id argument for PointAnnotationOptions.withIconImage(String), or PointAnnotation.setIconImage(String) APIs \" +\n        \"This getter will be removed in future releases.\",\n      level = DeprecationLevel.WARNING\n    )\n    get() {\n      if (iconImageInternal?.startsWith(ICON_DEFAULT_NAME_PREFIX) == true) {\n        logE(\n          TAG,\n          \"Reading iconImage returned an internally generated image ID ('$iconImageInternal'). \" +\n          \"This is a misuse, save the argument passed to PointAnnotationOptions.withIconImage(String) or PointAnnotation.setIconImage(String) instead. \" +\n          \"Caching and reusing this value for other annotation creation may result in unexpected behaviour, \" +\n          \"as the image associated with the internal image ID can be removed by the internal system at runtime.\"\n        )\n      }\n      return iconImageInternal\n    }\n    /**\n     * Set the iconImage property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      iconImageInternal = value\n    }\n\n  /**\n   * The iconOffset property\n   *\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   */\n  var iconOffset: List<Double>?\n    /**\n     * Get the iconOffset property\n     *\n     * @return [Point] value for List<Double>\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)\n      return (value as? JsonArray)?.map { it.toString().toDouble() }\n    }\n    /**\n     * Set the iconOffset property.\n     * To update the pointAnnotation on the map use {@link PointAnnotationManager#update(Annotation)}.\n     */\n    set(value) {\n      if (!value.isNullOrEmpty()) {\n        val jsonArray = JsonArray(value.size)\n        value.forEach { jsonArray.add(it) }\n        jsonObject.add(PointAnnotationOptions.PROPERTY_ICON_OFFSET, jsonArray)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_OFFSET)\n      }\n    }\n\n  /**\n   * The iconRotate property\n   *\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   */\n  var iconRotate: Double?\n    /**\n     * Get the iconRotate property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconRotate property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_ROTATE, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_ROTATE)\n      }\n    }\n\n  /**\n   * The iconSize property\n   *\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   */\n  var iconSize: Double?\n    /**\n     * Get the iconSize property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconSize property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_SIZE, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_SIZE)\n      }\n    }\n\n  /**\n   * The iconTextFit property\n   *\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   */\n  var iconTextFit: IconTextFit?\n    /**\n     * Get the iconTextFit property\n     *\n     * @return property wrapper value around IconTextFit\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)\n      value?.let {\n        return IconTextFit.valueOf(it.asString.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n    /**\n     * Set the iconTextFit property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for IconTextFit\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT, value.value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)\n      }\n    }\n\n  /**\n   * The iconTextFitPadding property\n   *\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   */\n  var iconTextFitPadding: List<Double>?\n    /**\n     * Get the iconTextFitPadding property\n     *\n     * @return [Point] value for List<Double>\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)\n      return (value as? JsonArray)?.map { it.toString().toDouble() }\n    }\n    /**\n     * Set the iconTextFitPadding property.\n     * To update the pointAnnotation on the map use {@link PointAnnotationManager#update(Annotation)}.\n     */\n    set(value) {\n      if (!value.isNullOrEmpty()) {\n        val jsonArray = JsonArray(value.size)\n        value.forEach { jsonArray.add(it) }\n        jsonObject.add(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING, jsonArray)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)\n      }\n    }\n\n  /**\n   * The symbolSortKey property\n   *\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   */\n  var symbolSortKey: Double?\n    /**\n     * Get the symbolSortKey property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the symbolSortKey property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)\n      }\n    }\n\n  /**\n   * The textAnchor property\n   *\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   */\n  var textAnchor: TextAnchor?\n    /**\n     * Get the textAnchor property\n     *\n     * @return property wrapper value around TextAnchor\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)\n      value?.let {\n        return TextAnchor.valueOf(it.asString.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n    /**\n     * Set the textAnchor property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for TextAnchor\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR, value.value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)\n      }\n    }\n\n  /**\n   * The textField property\n   *\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   */\n  var textField: String?\n    /**\n     * Get the textField property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textField property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_FIELD, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_FIELD)\n      }\n    }\n\n  /**\n   * The textJustify property\n   *\n   * Text justification options. Default value: \"center\".\n   */\n  var textJustify: TextJustify?\n    /**\n     * Get the textJustify property\n     *\n     * @return property wrapper value around TextJustify\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)\n      value?.let {\n        return TextJustify.valueOf(it.asString.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n    /**\n     * Set the textJustify property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for TextJustify\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY, value.value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)\n      }\n    }\n\n  /**\n   * The textLetterSpacing property\n   *\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   */\n  var textLetterSpacing: Double?\n    /**\n     * Get the textLetterSpacing property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textLetterSpacing property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)\n      }\n    }\n\n  /**\n   * The textLineHeight property\n   *\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   */\n  var textLineHeight: Double?\n    /**\n     * Get the textLineHeight property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textLineHeight property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)\n      }\n    }\n\n  /**\n   * The textMaxWidth property\n   *\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   */\n  var textMaxWidth: Double?\n    /**\n     * Get the textMaxWidth property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textMaxWidth property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)\n      }\n    }\n\n  /**\n   * The textOffset property\n   *\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   */\n  var textOffset: List<Double>?\n    /**\n     * Get the textOffset property\n     *\n     * @return [Point] value for List<Double>\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)\n      return (value as? JsonArray)?.map { it.toString().toDouble() }\n    }\n    /**\n     * Set the textOffset property.\n     * To update the pointAnnotation on the map use {@link PointAnnotationManager#update(Annotation)}.\n     */\n    set(value) {\n      if (!value.isNullOrEmpty()) {\n        val jsonArray = JsonArray(value.size)\n        value.forEach { jsonArray.add(it) }\n        jsonObject.add(PointAnnotationOptions.PROPERTY_TEXT_OFFSET, jsonArray)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)\n      }\n    }\n\n  /**\n   * The textRadialOffset property\n   *\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   */\n  var textRadialOffset: Double?\n    /**\n     * Get the textRadialOffset property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textRadialOffset property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)\n      }\n    }\n\n  /**\n   * The textRotate property\n   *\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   */\n  var textRotate: Double?\n    /**\n     * Get the textRotate property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textRotate property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_ROTATE, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)\n      }\n    }\n\n  /**\n   * The textSize property\n   *\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   */\n  var textSize: Double?\n    /**\n     * Get the textSize property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textSize property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_SIZE, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_SIZE)\n      }\n    }\n\n  /**\n   * The textTransform property\n   *\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   */\n  var textTransform: TextTransform?\n    /**\n     * Get the textTransform property\n     *\n     * @return property wrapper value around TextTransform\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)\n      value?.let {\n        return TextTransform.valueOf(it.asString.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n    /**\n     * Set the textTransform property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for TextTransform\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM, value.value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)\n      }\n    }\n\n  /**\n   * The iconColor property in Int\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  var iconColorInt: Int?\n    /**\n     * Get the iconColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the iconColor property\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PointAnnotationOptions.PROPERTY_ICON_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      }\n    }\n\n  /**\n   * The iconColor property in String\n   *\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  var iconColorString: String?\n    /**\n     * Get the iconColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the iconColor property\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_COLOR, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      }\n    }\n\n  /**\n   * The iconEmissiveStrength property\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   */\n  var iconEmissiveStrength: Double?\n    /**\n     * Get the iconEmissiveStrength property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconEmissiveStrength property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)\n      }\n    }\n\n  /**\n   * The iconHaloBlur property\n   *\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   */\n  var iconHaloBlur: Double?\n    /**\n     * Get the iconHaloBlur property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloBlur property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)\n      }\n    }\n\n  /**\n   * The iconHaloColor property in Int\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var iconHaloColorInt: Int?\n    /**\n     * Get the iconHaloColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloColor property\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      }\n    }\n\n  /**\n   * The iconHaloColor property in String\n   *\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var iconHaloColorString: String?\n    /**\n     * Get the iconHaloColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloColor property\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      }\n    }\n\n  /**\n   * The iconHaloWidth property\n   *\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   */\n  var iconHaloWidth: Double?\n    /**\n     * Get the iconHaloWidth property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloWidth property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)\n      }\n    }\n\n  /**\n   * The iconOcclusionOpacity property\n   *\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  var iconOcclusionOpacity: Double?\n    /**\n     * Get the iconOcclusionOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconOcclusionOpacity property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)\n      }\n    }\n\n  /**\n   * The iconOpacity property\n   *\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var iconOpacity: Double?\n    /**\n     * Get the iconOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconOpacity property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_OPACITY, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_OPACITY)\n      }\n    }\n\n  /**\n   * The symbolZOffset property\n   *\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   */\n  var symbolZOffset: Double?\n    /**\n     * Get the symbolZOffset property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the symbolZOffset property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)\n      }\n    }\n\n  /**\n   * The textColor property in Int\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  var textColorInt: Int?\n    /**\n     * Get the textColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the textColor property\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PointAnnotationOptions.PROPERTY_TEXT_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      }\n    }\n\n  /**\n   * The textColor property in String\n   *\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  var textColorString: String?\n    /**\n     * Get the textColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textColor property\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_COLOR, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      }\n    }\n\n  /**\n   * The textEmissiveStrength property\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   */\n  var textEmissiveStrength: Double?\n    /**\n     * Get the textEmissiveStrength property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textEmissiveStrength property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)\n      }\n    }\n\n  /**\n   * The textHaloBlur property\n   *\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   */\n  var textHaloBlur: Double?\n    /**\n     * Get the textHaloBlur property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textHaloBlur property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)\n      }\n    }\n\n  /**\n   * The textHaloColor property in Int\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var textHaloColorInt: Int?\n    /**\n     * Get the textHaloColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the textHaloColor property\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      }\n    }\n\n  /**\n   * The textHaloColor property in String\n   *\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var textHaloColorString: String?\n    /**\n     * Get the textHaloColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textHaloColor property\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      }\n    }\n\n  /**\n   * The textHaloWidth property\n   *\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   */\n  var textHaloWidth: Double?\n    /**\n     * Get the textHaloWidth property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textHaloWidth property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)\n      }\n    }\n\n  /**\n   * The textOcclusionOpacity property\n   *\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  var textOcclusionOpacity: Double?\n    /**\n     * Get the textOcclusionOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textOcclusionOpacity property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)\n      }\n    }\n\n  /**\n   * The textOpacity property\n   *\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var textOpacity: Double?\n    /**\n     * Get the textOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textOpacity property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_OPACITY, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)\n      }\n    }\n\n  /**\n   * The iconColorUseTheme property\n   *\n   * This property defines whether the `iconColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var iconColorUseTheme: String?\n    /**\n     * Get the iconColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the iconColorUseTheme property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * The iconHaloColorUseTheme property\n   *\n   * This property defines whether the `iconHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var iconHaloColorUseTheme: String?\n    /**\n     * Get the iconHaloColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloColorUseTheme property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * The textColorUseTheme property\n   *\n   * This property defines whether the `textColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var textColorUseTheme: String?\n    /**\n     * Get the textColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textColorUseTheme property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * The textHaloColorUseTheme property\n   *\n   * This property defines whether the `textHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var textHaloColorUseTheme: String?\n    /**\n     * Get the textHaloColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textHaloColorUseTheme property\n     *\n     * To update the pointAnnotation on the map use {@link pointAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * Get the offset geometry for the touch point\n   */\n  override fun getOffsetGeometry(\n    mapCameraManagerDelegate: MapCameraManagerDelegate,\n    moveDistancesObject: MoveDistancesObject\n  ): Point? {\n    val point = mapCameraManagerDelegate.coordinateForPixel(\n      ScreenCoordinate(\n        moveDistancesObject.currentX.toDouble(),\n        moveDistancesObject.currentY.toDouble(),\n      )\n    )\n    if (point.latitude() > MAX_MERCATOR_LATITUDE || point.latitude() < MIN_MERCATOR_LATITUDE) {\n      return null\n    }\n    return point\n  }\n\n  /**\n   * Set the used data-driven properties\n   */\n  override fun setUsedDataDrivenProperties() {\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_IMAGE)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_OFFSET)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_ROTATE)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_SIZE)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_FIELD)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_SIZE)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_OPACITY)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)\n    }\n    jsonObject.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val TAG = \"PointAnnotation\"\n    /** the Id key for annotation */\n    const val ID_KEY: String = \"PointAnnotation\"\n    /** the default name for icon */\n    const val ICON_DEFAULT_NAME_PREFIX = \"icon_default_name_\"\n\n    /**\n     * Builds the auto-generated style image ID for the given [manager] and [bitmap].\n     * The ID encodes the manager identity and bitmap content so that identical bitmaps\n     * added through the same manager share a single style image.\n     */\n    internal fun iconImageId(manager: AnnotationManager<*, *, *, *, *, *, *>, bitmap: Bitmap): String =\n      ICON_DEFAULT_NAME_PREFIX + manager.hashCode().toString(16) + \"_\" + bitmap.hashCode()\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/PointAnnotationManager.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport android.graphics.Bitmap\nimport androidx.annotation.ColorInt\nimport com.google.gson.JsonArray\nimport com.mapbox.geojson.*\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.get\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationManagerImpl\nimport com.mapbox.maps.plugin.annotation.AnnotationPlugin\nimport com.mapbox.maps.plugin.annotation.AnnotationType\nimport com.mapbox.maps.plugin.annotation.ClusterAnnotationManager\nimport com.mapbox.maps.plugin.annotation.OnClusterClickListener\nimport com.mapbox.maps.plugin.annotation.OnClusterLongClickListener\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation.Companion.ICON_DEFAULT_NAME_PREFIX\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport java.util.Locale\nimport java.util.concurrent.atomic.AtomicLong\n\n/**\n * The pointAnnotation manager allows to add pointAnnotations to a map.\n */\nclass PointAnnotationManager(\n  delegateProvider: MapDelegateProvider,\n  annotationConfig: AnnotationConfig? = null\n) :\n  AnnotationManagerImpl<Point, PointAnnotation, PointAnnotationOptions, OnPointAnnotationDragListener, OnPointAnnotationClickListener, OnPointAnnotationLongClickListener, OnPointAnnotationInteractionListener, SymbolLayer>(\n    delegateProvider, annotationConfig, ID_GENERATOR.incrementAndGet(), \"pointAnnotation\", ::SymbolLayer\n  ),\n  ClusterAnnotationManager {\n\n  /**\n   * The Added clusterClickListeners\n   */\n  override val clusterClickListeners: MutableList<OnClusterClickListener> = mutableListOf()\n\n  /**\n   * The Added clusterLongClickListeners\n   */\n  override val clusterLongClickListeners: MutableList<OnClusterLongClickListener> = mutableListOf()\n\n  @OptIn(MapboxExperimental::class)\n  override fun setDataDrivenPropertyIsUsed(property: String) {\n    when (property) {\n      PointAnnotationOptions.PROPERTY_ICON_ANCHOR -> {\n        layer.iconAnchor(get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR))\n        dragLayer.iconAnchor(get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_IMAGE -> {\n        layer.iconImage(get(PointAnnotationOptions.PROPERTY_ICON_IMAGE))\n        dragLayer.iconImage(get(PointAnnotationOptions.PROPERTY_ICON_IMAGE))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_OFFSET -> {\n        layer.iconOffset(get(PointAnnotationOptions.PROPERTY_ICON_OFFSET))\n        dragLayer.iconOffset(get(PointAnnotationOptions.PROPERTY_ICON_OFFSET))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_ROTATE -> {\n        layer.iconRotate(get(PointAnnotationOptions.PROPERTY_ICON_ROTATE))\n        dragLayer.iconRotate(get(PointAnnotationOptions.PROPERTY_ICON_ROTATE))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_SIZE -> {\n        layer.iconSize(get(PointAnnotationOptions.PROPERTY_ICON_SIZE))\n        dragLayer.iconSize(get(PointAnnotationOptions.PROPERTY_ICON_SIZE))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT -> {\n        layer.iconTextFit(get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT))\n        dragLayer.iconTextFit(get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING -> {\n        layer.iconTextFitPadding(get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING))\n        dragLayer.iconTextFitPadding(get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING))\n      }\n      PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY -> {\n        layer.symbolSortKey(get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY))\n        dragLayer.symbolSortKey(get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_ANCHOR -> {\n        layer.textAnchor(get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR))\n        dragLayer.textAnchor(get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_FIELD -> {\n        layer.textField(get(PointAnnotationOptions.PROPERTY_TEXT_FIELD))\n        dragLayer.textField(get(PointAnnotationOptions.PROPERTY_TEXT_FIELD))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY -> {\n        layer.textJustify(get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY))\n        dragLayer.textJustify(get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING -> {\n        layer.textLetterSpacing(get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING))\n        dragLayer.textLetterSpacing(get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT -> {\n        layer.textLineHeight(get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT))\n        dragLayer.textLineHeight(get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH -> {\n        layer.textMaxWidth(get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH))\n        dragLayer.textMaxWidth(get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_OFFSET -> {\n        layer.textOffset(get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET))\n        dragLayer.textOffset(get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET -> {\n        layer.textRadialOffset(get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET))\n        dragLayer.textRadialOffset(get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_ROTATE -> {\n        layer.textRotate(get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE))\n        dragLayer.textRotate(get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_SIZE -> {\n        layer.textSize(get(PointAnnotationOptions.PROPERTY_TEXT_SIZE))\n        dragLayer.textSize(get(PointAnnotationOptions.PROPERTY_TEXT_SIZE))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM -> {\n        layer.textTransform(get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM))\n        dragLayer.textTransform(get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_COLOR -> {\n        layer.iconColor(get(PointAnnotationOptions.PROPERTY_ICON_COLOR))\n        dragLayer.iconColor(get(PointAnnotationOptions.PROPERTY_ICON_COLOR))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH -> {\n        layer.iconEmissiveStrength(get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH))\n        dragLayer.iconEmissiveStrength(get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR -> {\n        layer.iconHaloBlur(get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR))\n        dragLayer.iconHaloBlur(get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR -> {\n        layer.iconHaloColor(get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR))\n        dragLayer.iconHaloColor(get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH -> {\n        layer.iconHaloWidth(get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH))\n        dragLayer.iconHaloWidth(get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY -> {\n        layer.iconOcclusionOpacity(get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY))\n        dragLayer.iconOcclusionOpacity(get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_OPACITY -> {\n        layer.iconOpacity(get(PointAnnotationOptions.PROPERTY_ICON_OPACITY))\n        dragLayer.iconOpacity(get(PointAnnotationOptions.PROPERTY_ICON_OPACITY))\n      }\n      PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET -> {\n        layer.symbolZOffset(get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET))\n        dragLayer.symbolZOffset(get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_COLOR -> {\n        layer.textColor(get(PointAnnotationOptions.PROPERTY_TEXT_COLOR))\n        dragLayer.textColor(get(PointAnnotationOptions.PROPERTY_TEXT_COLOR))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH -> {\n        layer.textEmissiveStrength(get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH))\n        dragLayer.textEmissiveStrength(get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR -> {\n        layer.textHaloBlur(get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR))\n        dragLayer.textHaloBlur(get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR -> {\n        layer.textHaloColor(get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR))\n        dragLayer.textHaloColor(get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH -> {\n        layer.textHaloWidth(get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH))\n        dragLayer.textHaloWidth(get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY -> {\n        layer.textOcclusionOpacity(get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY))\n        dragLayer.textOcclusionOpacity(get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_OPACITY -> {\n        layer.textOpacity(get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY))\n        dragLayer.textOpacity(get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME -> {\n        layer.iconColorUseTheme(get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME))\n        dragLayer.iconColorUseTheme(get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME))\n      }\n      PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME -> {\n        layer.iconHaloColorUseTheme(get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME))\n        dragLayer.iconHaloColorUseTheme(get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME -> {\n        layer.textColorUseTheme(get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME))\n        dragLayer.textColorUseTheme(get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME))\n      }\n      PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME -> {\n        layer.textHaloColorUseTheme(get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME))\n        dragLayer.textHaloColorUseTheme(get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME))\n      }\n    }\n  }\n\n  /**\n   * Create a list of pointAnnotations on the map.\n   *\n   * PointAnnotations are going to be created only for features with a matching geometry.\n   *\n   * All supported properties are:\n   * PointAnnotationOptions.PROPERTY_ICON_ANCHOR - IconAnchor\n   * PointAnnotationOptions.PROPERTY_ICON_IMAGE - String\n   * PointAnnotationOptions.PROPERTY_ICON_OFFSET - List<Double>\n   * PointAnnotationOptions.PROPERTY_ICON_ROTATE - Double\n   * PointAnnotationOptions.PROPERTY_ICON_SIZE - Double\n   * PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT - IconTextFit\n   * PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING - List<Double>\n   * PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_ANCHOR - TextAnchor\n   * PointAnnotationOptions.PROPERTY_TEXT_FIELD - String\n   * PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY - TextJustify\n   * PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_OFFSET - List<Double>\n   * PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_ROTATE - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_SIZE - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM - TextTransform\n   * PointAnnotationOptions.PROPERTY_ICON_COLOR - String\n   * PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH - Double\n   * PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR - Double\n   * PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR - String\n   * PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH - Double\n   * PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY - Double\n   * PointAnnotationOptions.PROPERTY_ICON_OPACITY - Double\n   * PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_COLOR - String\n   * PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR - String\n   * PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_OPACITY - Double\n   * PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME - String\n   * PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME - String\n   * PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME - String\n   * PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME - String\n   * Learn more about above properties in the )[The online documentation](https://docs.mapbox.com/style-spec/).\n   *\n   * Out of spec properties:\n   * \"is-draggable\" - Boolean, true if the pointAnnotation should be draggable, false otherwise\n   *\n   * @param json the GeoJSON defining the list of pointAnnotations to build\n   * @return the list of built pointAnnotations\n   */\n  fun create(json: String): List<PointAnnotation> {\n    return create(FeatureCollection.fromJson(json))\n  }\n\n  /**\n   * Create a list of pointAnnotations on the map.\n   *\n   * PointAnnotations are going to be created only for features with a matching geometry.\n   *\n   * All supported properties are:\n   * PointAnnotationOptions.PROPERTY_ICON_ANCHOR - IconAnchor\n   * PointAnnotationOptions.PROPERTY_ICON_IMAGE - String\n   * PointAnnotationOptions.PROPERTY_ICON_OFFSET - List<Double>\n   * PointAnnotationOptions.PROPERTY_ICON_ROTATE - Double\n   * PointAnnotationOptions.PROPERTY_ICON_SIZE - Double\n   * PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT - IconTextFit\n   * PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING - List<Double>\n   * PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_ANCHOR - TextAnchor\n   * PointAnnotationOptions.PROPERTY_TEXT_FIELD - String\n   * PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY - TextJustify\n   * PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_OFFSET - List<Double>\n   * PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_ROTATE - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_SIZE - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM - TextTransform\n   * PointAnnotationOptions.PROPERTY_ICON_COLOR - String\n   * PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH - Double\n   * PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR - Double\n   * PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR - String\n   * PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH - Double\n   * PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY - Double\n   * PointAnnotationOptions.PROPERTY_ICON_OPACITY - Double\n   * PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_COLOR - String\n   * PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR - String\n   * PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY - Double\n   * PointAnnotationOptions.PROPERTY_TEXT_OPACITY - Double\n   * PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME - String\n   * PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME - String\n   * PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME - String\n   * PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME - String\n   * Learn more about above properties in the )[The online documentation](https://docs.mapbox.com/style-spec/).\n   *\n   * Out of spec properties:\n   * \"is-draggable\" - Boolean, true if the pointAnnotation should be draggable, false otherwise\n   *\n   * @param featureCollection the featureCollection defining the list of pointAnnotations to build\n   * @return the list of built pointAnnotations\n   */\n  fun create(featureCollection: FeatureCollection): List<PointAnnotation> {\n    featureCollection.features()?.let { features ->\n      val options = features.mapNotNull {\n        PointAnnotationOptions.fromFeature(it)\n      }\n      return create(options)\n    }\n    return listOf()\n  }\n\n  /**\n   * Get the key of the id of the annotation.\n   *\n   * @return the key of the id of the annotation\n   */\n  override fun getAnnotationIdKey(): String {\n    return PointAnnotation.ID_KEY\n  }\n\n  // Property accessors\n  /**\n   * The bitmap image for this Symbol\n   *\n   * Will not take effect if [iconImageInternal] has been set.\n   */\n  var iconImageBitmap: Bitmap? = null\n    /**\n     * Set the iconImageBitmap property\n     *\n     * @param value the iconBitmap\n     */\n    set(value) {\n      if (value != null) {\n        if (field != value) {\n          field = value\n          if (iconImageInternal == null || iconImageInternal!!.startsWith(ICON_DEFAULT_NAME_PREFIX)) {\n            // User does not set iconImage, update iconImage to this new bitmap\n            val imageId = PointAnnotation.iconImageId(this, value)\n            iconImageInternal = imageId\n            addStyleImage(imageId, value)\n          }\n        }\n      } else {\n        field = null\n        iconImageInternal = null\n      }\n    }\n\n  /**\n   * The IconAllowOverlap property\n   *\n   * If true, the icon will be visible even if it collides with other previously drawn symbols. Default value: false.\n   */\n  var iconAllowOverlap: Boolean?\n    /**\n     * Get the IconAllowOverlap property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.iconAllowOverlap\n    }\n    /**\n     * Set the IconAllowOverlap property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-allow-overlap\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-allow-overlap\")\n    }\n\n  /**\n   * The default iconAnchor for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   */\n  var iconAnchor: IconAnchor?\n    /**\n     * Get the iconAnchor property.\n     *\n     * @return property wrapper value around IconAnchor\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)\n      value?.let {\n        return IconAnchor.valueOf(it.asString.uppercase(Locale.US))\n      }\n      return null\n    }\n    /**\n     * Set the iconAnchor property.\n     *\n     * @param value constant property value for IconAnchor\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_ANCHOR, value.value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The IconIgnorePlacement property\n   *\n   * If true, other symbols can be visible even if they collide with the icon. Default value: false.\n   */\n  var iconIgnorePlacement: Boolean?\n    /**\n     * Get the IconIgnorePlacement property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.iconIgnorePlacement\n    }\n    /**\n     * Set the IconIgnorePlacement property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-ignore-placement\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-ignore-placement\")\n    }\n\n  /**\n   * Internal default iconImage property.\n   */\n  internal var iconImageInternal: String?\n    /**\n     * Get the iconImage property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the iconImage property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_IMAGE, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_IMAGE)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_IMAGE)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default iconImage for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Name of image in sprite to use for drawing an image background.\n   */\n  var iconImage: String?\n    /**\n     * Get the iconImage property.\n     *\n     * @return property wrapper value around String\n     */\n    @Deprecated(\n      \"Reading iconImage potentially exposes an internally generated image ID. \" +\n        \"Consider saving the image id argument for PointAnnotationOptions.withIconImage(String), or PointAnnotation.setIconImage(String) APIs \" +\n        \"This getter will be removed in future releases.\",\n      level = DeprecationLevel.WARNING\n    )\n    get() {\n      if (iconImageInternal?.startsWith(ICON_DEFAULT_NAME_PREFIX) == true) {\n        logE(\n          TAG,\n          \"Reading iconImage returned an internally generated image ID ('$iconImageInternal'). \" +\n          \"This is a misuse, save the argument passed to PointAnnotationOptions.withIconImage(String) or PointAnnotation.setIconImage(String) instead. \" +\n          \"Caching and reusing this value for other annotation creation may result in unexpected behaviour, \" +\n          \"as the image associated with the internal image ID can be removed by the internal system at runtime.\"\n        )\n      }\n      return iconImageInternal\n    }\n    /**\n     * Set the iconImage property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      iconImageInternal = value\n    }\n\n  /**\n   * The IconKeepUpright property\n   *\n   * If true, the icon may be flipped to prevent it from being rendered upside-down. Default value: false.\n   */\n  var iconKeepUpright: Boolean?\n    /**\n     * Get the IconKeepUpright property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.iconKeepUpright\n    }\n    /**\n     * Set the IconKeepUpright property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-keep-upright\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-keep-upright\")\n    }\n\n  /**\n   * The default iconOffset for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   */\n  var iconOffset: List<Double>?\n    /**\n     * Get the iconOffset property.\n     *\n     * @return [Point] value for List<Double>\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)\n      return (value as? JsonArray)?.map { it.toString().toDouble() }\n    }\n    /**\n     * Set the iconOffset property.\n     */\n    set(value) {\n      if (!value.isNullOrEmpty()) {\n        val jsonArray = JsonArray(value.size)\n        value.forEach { jsonArray.add(it) }\n        dataDrivenPropertyDefaultValues.add(PointAnnotationOptions.PROPERTY_ICON_OFFSET, jsonArray)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_OFFSET)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_OFFSET)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The IconOptional property\n   *\n   * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. Default value: false.\n   */\n  var iconOptional: Boolean?\n    /**\n     * Get the IconOptional property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.iconOptional\n    }\n    /**\n     * Set the IconOptional property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-optional\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-optional\")\n    }\n\n  /**\n   * The IconPadding property\n   *\n   * Size of the additional area around the icon bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of iconPadding is in pixels.\n   */\n  var iconPadding: Double?\n    /**\n     * Get the IconPadding property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.iconPadding\n    }\n    /**\n     * Set the IconPadding property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-padding\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-padding\")\n    }\n\n  /**\n   * The IconPitchAlignment property\n   *\n   * Orientation of icon when map is pitched. Default value: \"auto\".\n   */\n  var iconPitchAlignment: IconPitchAlignment?\n    /**\n     * Get the IconPitchAlignment property\n     *\n     * @return property wrapper value around IconPitchAlignment\n     */\n    get(): IconPitchAlignment? {\n      return layer.iconPitchAlignment\n    }\n    /**\n     * Set the IconPitchAlignment property\n     * @param value property wrapper value around IconPitchAlignment\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-pitch-alignment\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-pitch-alignment\")\n    }\n\n  /**\n   * The default iconRotate for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   */\n  var iconRotate: Double?\n    /**\n     * Get the iconRotate property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconRotate property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_ROTATE, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_ROTATE)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_ROTATE)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The IconRotationAlignment property\n   *\n   * In combination with `symbol-placement`, determines the rotation behavior of icons. Default value: \"auto\".\n   */\n  var iconRotationAlignment: IconRotationAlignment?\n    /**\n     * Get the IconRotationAlignment property\n     *\n     * @return property wrapper value around IconRotationAlignment\n     */\n    get(): IconRotationAlignment? {\n      return layer.iconRotationAlignment\n    }\n    /**\n     * Set the IconRotationAlignment property\n     * @param value property wrapper value around IconRotationAlignment\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-rotation-alignment\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-rotation-alignment\")\n    }\n\n  /**\n   * The default iconSize for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   */\n  var iconSize: Double?\n    /**\n     * Get the iconSize property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconSize property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_SIZE, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_SIZE)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_SIZE)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The IconSizeScaleRange property\n   *\n   * Limits the possible scaling range for `icon-size`, `icon-halo-width`, `icon-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   */\n  @MapboxExperimental\n  var iconSizeScaleRange: List<Double>?\n    /**\n     * Get the IconSizeScaleRange property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.iconSizeScaleRange\n    }\n    /**\n     * Set the IconSizeScaleRange property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-size-scale-range\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-size-scale-range\")\n    }\n\n  /**\n   * The default iconTextFit for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   */\n  var iconTextFit: IconTextFit?\n    /**\n     * Get the iconTextFit property.\n     *\n     * @return property wrapper value around IconTextFit\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)\n      value?.let {\n        return IconTextFit.valueOf(it.asString.uppercase(Locale.US))\n      }\n      return null\n    }\n    /**\n     * Set the iconTextFit property.\n     *\n     * @param value constant property value for IconTextFit\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT, value.value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default iconTextFitPadding for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   */\n  var iconTextFitPadding: List<Double>?\n    /**\n     * Get the iconTextFitPadding property.\n     *\n     * @return [Point] value for List<Double>\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)\n      return (value as? JsonArray)?.map { it.toString().toDouble() }\n    }\n    /**\n     * Set the iconTextFitPadding property.\n     */\n    set(value) {\n      if (!value.isNullOrEmpty()) {\n        val jsonArray = JsonArray(value.size)\n        value.forEach { jsonArray.add(it) }\n        dataDrivenPropertyDefaultValues.add(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING, jsonArray)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The SymbolAvoidEdges property\n   *\n   * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. When using a client that supports global collision detection, like Mapbox GL JS version 0.42.0 or greater, enabling this property is not needed to prevent clipped labels at tile boundaries. Default value: false.\n   */\n  var symbolAvoidEdges: Boolean?\n    /**\n     * Get the SymbolAvoidEdges property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.symbolAvoidEdges\n    }\n    /**\n     * Set the SymbolAvoidEdges property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-avoid-edges\").value\n      }\n      setLayerProperty(wrappedValue, \"symbol-avoid-edges\")\n    }\n\n  /**\n   * The SymbolElevationReference property\n   *\n   * Selects the base of symbol-elevation. Default value: \"ground\".\n   */\n  @MapboxExperimental\n  var symbolElevationReference: SymbolElevationReference?\n    /**\n     * Get the SymbolElevationReference property\n     *\n     * @return property wrapper value around SymbolElevationReference\n     */\n    get(): SymbolElevationReference? {\n      return layer.symbolElevationReference\n    }\n    /**\n     * Set the SymbolElevationReference property\n     * @param value property wrapper value around SymbolElevationReference\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-elevation-reference\").value\n      }\n      setLayerProperty(wrappedValue, \"symbol-elevation-reference\")\n    }\n\n  /**\n   * The SymbolPlacement property\n   *\n   * Label placement relative to its geometry. Default value: \"point\".\n   */\n  var symbolPlacement: SymbolPlacement?\n    /**\n     * Get the SymbolPlacement property\n     *\n     * @return property wrapper value around SymbolPlacement\n     */\n    get(): SymbolPlacement? {\n      return layer.symbolPlacement\n    }\n    /**\n     * Set the SymbolPlacement property\n     * @param value property wrapper value around SymbolPlacement\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-placement\").value\n      }\n      setLayerProperty(wrappedValue, \"symbol-placement\")\n    }\n\n  /**\n   * The default symbolSortKey for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   */\n  var symbolSortKey: Double?\n    /**\n     * Get the symbolSortKey property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the symbolSortKey property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The SymbolSpacing property\n   *\n   * Distance between two symbol anchors. Default value: 250. Minimum value: 1. The unit of symbolSpacing is in pixels.\n   */\n  var symbolSpacing: Double?\n    /**\n     * Get the SymbolSpacing property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.symbolSpacing\n    }\n    /**\n     * Set the SymbolSpacing property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-spacing\").value\n      }\n      setLayerProperty(wrappedValue, \"symbol-spacing\")\n    }\n\n  /**\n   * The SymbolZElevate property\n   *\n   * Position symbol on buildings (both fill extrusions and models) rooftops. In order to have minimal impact on performance, this is supported only when `fill-extrusion-height` is not zoom-dependent and remains unchanged. For fading in buildings when zooming in, fill-extrusion-vertical-scale should be used and symbols would raise with building rooftops. Symbols are sorted by elevation, except in cases when `viewport-y` sorting or `symbol-sort-key` are applied. Default value: false.\n   */\n  var symbolZElevate: Boolean?\n    /**\n     * Get the SymbolZElevate property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.symbolZElevate\n    }\n    /**\n     * Set the SymbolZElevate property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-elevate\").value\n      }\n      setLayerProperty(wrappedValue, \"symbol-z-elevate\")\n    }\n\n  /**\n   * The SymbolZOrder property\n   *\n   * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their y-position relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbol-sort-key`. Default value: \"auto\".\n   */\n  var symbolZOrder: SymbolZOrder?\n    /**\n     * Get the SymbolZOrder property\n     *\n     * @return property wrapper value around SymbolZOrder\n     */\n    get(): SymbolZOrder? {\n      return layer.symbolZOrder\n    }\n    /**\n     * Set the SymbolZOrder property\n     * @param value property wrapper value around SymbolZOrder\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"symbol-z-order\").value\n      }\n      setLayerProperty(wrappedValue, \"symbol-z-order\")\n    }\n\n  /**\n   * The TextAllowOverlap property\n   *\n   * If true, the text will be visible even if it collides with other previously drawn symbols. Default value: false.\n   */\n  var textAllowOverlap: Boolean?\n    /**\n     * Get the TextAllowOverlap property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.textAllowOverlap\n    }\n    /**\n     * Set the TextAllowOverlap property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-allow-overlap\").value\n      }\n      setLayerProperty(wrappedValue, \"text-allow-overlap\")\n    }\n\n  /**\n   * The default textAnchor for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   */\n  var textAnchor: TextAnchor?\n    /**\n     * Get the textAnchor property.\n     *\n     * @return property wrapper value around TextAnchor\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)\n      value?.let {\n        return TextAnchor.valueOf(it.asString.uppercase(Locale.US))\n      }\n      return null\n    }\n    /**\n     * Set the textAnchor property.\n     *\n     * @param value constant property value for TextAnchor\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR, value.value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textField for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   */\n  var textField: String?\n    /**\n     * Get the textField property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textField property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_FIELD, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_FIELD)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_FIELD)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The TextFont property\n   *\n   * Font stack to use for displaying text.\n   */\n  var textFont: List<String>?\n    /**\n     * Get the TextFont property\n     *\n     * @return property wrapper value around List<String>\n     */\n    get(): List<String>? {\n      return layer.textFont\n    }\n    /**\n     * Set the TextFont property\n     * @param value property wrapper value around List<String>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-font\").value\n      }\n      setLayerProperty(wrappedValue, \"text-font\")\n    }\n\n  /**\n   * The TextIgnorePlacement property\n   *\n   * If true, other symbols can be visible even if they collide with the text. Default value: false.\n   */\n  var textIgnorePlacement: Boolean?\n    /**\n     * Get the TextIgnorePlacement property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.textIgnorePlacement\n    }\n    /**\n     * Set the TextIgnorePlacement property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-ignore-placement\").value\n      }\n      setLayerProperty(wrappedValue, \"text-ignore-placement\")\n    }\n\n  /**\n   * The default textJustify for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Text justification options. Default value: \"center\".\n   */\n  var textJustify: TextJustify?\n    /**\n     * Get the textJustify property.\n     *\n     * @return property wrapper value around TextJustify\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)\n      value?.let {\n        return TextJustify.valueOf(it.asString.uppercase(Locale.US))\n      }\n      return null\n    }\n    /**\n     * Set the textJustify property.\n     *\n     * @param value constant property value for TextJustify\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY, value.value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The TextKeepUpright property\n   *\n   * If true, the text may be flipped vertically to prevent it from being rendered upside-down. Default value: true.\n   */\n  var textKeepUpright: Boolean?\n    /**\n     * Get the TextKeepUpright property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.textKeepUpright\n    }\n    /**\n     * Set the TextKeepUpright property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-keep-upright\").value\n      }\n      setLayerProperty(wrappedValue, \"text-keep-upright\")\n    }\n\n  /**\n   * The default textLetterSpacing for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   */\n  var textLetterSpacing: Double?\n    /**\n     * Get the textLetterSpacing property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textLetterSpacing property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textLineHeight for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   */\n  var textLineHeight: Double?\n    /**\n     * Get the textLineHeight property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textLineHeight property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The TextMaxAngle property\n   *\n   * Maximum angle change between adjacent characters. Default value: 45. The unit of textMaxAngle is in degrees.\n   */\n  var textMaxAngle: Double?\n    /**\n     * Get the TextMaxAngle property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.textMaxAngle\n    }\n    /**\n     * Set the TextMaxAngle property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-max-angle\").value\n      }\n      setLayerProperty(wrappedValue, \"text-max-angle\")\n    }\n\n  /**\n   * The default textMaxWidth for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   */\n  var textMaxWidth: Double?\n    /**\n     * Get the textMaxWidth property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textMaxWidth property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textOffset for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   */\n  var textOffset: List<Double>?\n    /**\n     * Get the textOffset property.\n     *\n     * @return [Point] value for List<Double>\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)\n      return (value as? JsonArray)?.map { it.toString().toDouble() }\n    }\n    /**\n     * Set the textOffset property.\n     */\n    set(value) {\n      if (!value.isNullOrEmpty()) {\n        val jsonArray = JsonArray(value.size)\n        value.forEach { jsonArray.add(it) }\n        dataDrivenPropertyDefaultValues.add(PointAnnotationOptions.PROPERTY_TEXT_OFFSET, jsonArray)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The TextOptional property\n   *\n   * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. Default value: false.\n   */\n  var textOptional: Boolean?\n    /**\n     * Get the TextOptional property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.textOptional\n    }\n    /**\n     * Set the TextOptional property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-optional\").value\n      }\n      setLayerProperty(wrappedValue, \"text-optional\")\n    }\n\n  /**\n   * The TextPadding property\n   *\n   * Size of the additional area around the text bounding box used for detecting symbol collisions. Default value: 2. Minimum value: 0. The unit of textPadding is in pixels.\n   */\n  var textPadding: Double?\n    /**\n     * Get the TextPadding property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.textPadding\n    }\n    /**\n     * Set the TextPadding property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-padding\").value\n      }\n      setLayerProperty(wrappedValue, \"text-padding\")\n    }\n\n  /**\n   * The TextPitchAlignment property\n   *\n   * Orientation of text when map is pitched. Default value: \"auto\".\n   */\n  var textPitchAlignment: TextPitchAlignment?\n    /**\n     * Get the TextPitchAlignment property\n     *\n     * @return property wrapper value around TextPitchAlignment\n     */\n    get(): TextPitchAlignment? {\n      return layer.textPitchAlignment\n    }\n    /**\n     * Set the TextPitchAlignment property\n     * @param value property wrapper value around TextPitchAlignment\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-pitch-alignment\").value\n      }\n      setLayerProperty(wrappedValue, \"text-pitch-alignment\")\n    }\n\n  /**\n   * The default textRadialOffset for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   */\n  var textRadialOffset: Double?\n    /**\n     * Get the textRadialOffset property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textRadialOffset property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textRotate for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   */\n  var textRotate: Double?\n    /**\n     * Get the textRotate property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textRotate property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_ROTATE, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The TextRotationAlignment property\n   *\n   * In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text. Default value: \"auto\".\n   */\n  var textRotationAlignment: TextRotationAlignment?\n    /**\n     * Get the TextRotationAlignment property\n     *\n     * @return property wrapper value around TextRotationAlignment\n     */\n    get(): TextRotationAlignment? {\n      return layer.textRotationAlignment\n    }\n    /**\n     * Set the TextRotationAlignment property\n     * @param value property wrapper value around TextRotationAlignment\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-rotation-alignment\").value\n      }\n      setLayerProperty(wrappedValue, \"text-rotation-alignment\")\n    }\n\n  /**\n   * The default textSize for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   */\n  var textSize: Double?\n    /**\n     * Get the textSize property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textSize property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_SIZE, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_SIZE)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_SIZE)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The TextSizeScaleRange property\n   *\n   * Limits the possible scaling range for `text-size`, `text-halo-width`, `text-halo-blur` properties to be within [min-scale, max-scale] Default value: [0.8,2]. Minimum value: [0.1,0.1]. Maximum value: [10,10].\n   */\n  @MapboxExperimental\n  var textSizeScaleRange: List<Double>?\n    /**\n     * Get the TextSizeScaleRange property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.textSizeScaleRange\n    }\n    /**\n     * Set the TextSizeScaleRange property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-size-scale-range\").value\n      }\n      setLayerProperty(wrappedValue, \"text-size-scale-range\")\n    }\n\n  /**\n   * The default textTransform for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   */\n  var textTransform: TextTransform?\n    /**\n     * Get the textTransform property.\n     *\n     * @return property wrapper value around TextTransform\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)\n      value?.let {\n        return TextTransform.valueOf(it.asString.uppercase(Locale.US))\n      }\n      return null\n    }\n    /**\n     * Set the textTransform property.\n     *\n     * @param value constant property value for TextTransform\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM, value.value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The TextVariableAnchor property\n   *\n   * To increase the chance of placing high-priority labels on the map, you can provide an array of `text-anchor` locations: the renderer will attempt to place the label at each location, in order, before moving onto the next label. Use `text-justify: auto` to choose justification based on anchor position. To apply an offset, use the `text-radial-offset` or the two-dimensional `text-offset`.\n   */\n  var textVariableAnchor: List<String>?\n    /**\n     * Get the TextVariableAnchor property\n     *\n     * @return property wrapper value around List<String>\n     */\n    get(): List<String>? {\n      return layer.textVariableAnchor\n    }\n    /**\n     * Set the TextVariableAnchor property\n     * @param value property wrapper value around List<String>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-variable-anchor\").value\n      }\n      setLayerProperty(wrappedValue, \"text-variable-anchor\")\n    }\n\n  /**\n   * The TextWritingMode property\n   *\n   * The property allows control over a symbol's orientation. Note that the property values act as a hint, so that a symbol whose language doesn’t support the provided orientation will be laid out in its natural orientation. Example: English point symbol will be rendered horizontally even if array value contains single 'vertical' enum value. For symbol with point placement, the order of elements in an array define priority order for the placement of an orientation variant. For symbol with line placement, the default text writing mode is either ['horizontal', 'vertical'] or ['vertical', 'horizontal'], the order doesn't affect the placement.\n   */\n  var textWritingMode: List<String>?\n    /**\n     * Get the TextWritingMode property\n     *\n     * @return property wrapper value around List<String>\n     */\n    get(): List<String>? {\n      return layer.textWritingMode\n    }\n    /**\n     * Set the TextWritingMode property\n     * @param value property wrapper value around List<String>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-writing-mode\").value\n      }\n      setLayerProperty(wrappedValue, \"text-writing-mode\")\n    }\n\n  /**\n   * The default iconColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  var iconColorInt: Int?\n    /**\n     * Get the iconColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the iconColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PointAnnotationOptions.PROPERTY_ICON_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default iconColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  var iconColorString: String?\n    /**\n     * Get the iconColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the iconColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_COLOR, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The IconColorBrightnessMax property\n   *\n   * Increase or reduce the brightness of the symbols. The value is the maximum brightness. Default value: 1. Value range: [0, 1]\n   */\n  var iconColorBrightnessMax: Double?\n    /**\n     * Get the IconColorBrightnessMax property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.iconColorBrightnessMax\n    }\n    /**\n     * Set the IconColorBrightnessMax property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-max\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-color-brightness-max\")\n    }\n\n  /**\n   * The IconColorBrightnessMin property\n   *\n   * Increase or reduce the brightness of the symbols. The value is the minimum brightness. Default value: 0. Value range: [0, 1]\n   */\n  var iconColorBrightnessMin: Double?\n    /**\n     * Get the IconColorBrightnessMin property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.iconColorBrightnessMin\n    }\n    /**\n     * Set the IconColorBrightnessMin property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-brightness-min\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-color-brightness-min\")\n    }\n\n  /**\n   * The IconColorContrast property\n   *\n   * Increase or reduce the contrast of the symbol icon. Default value: 0. Value range: [-1, 1]\n   */\n  var iconColorContrast: Double?\n    /**\n     * Get the IconColorContrast property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.iconColorContrast\n    }\n    /**\n     * Set the IconColorContrast property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-contrast\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-color-contrast\")\n    }\n\n  /**\n   * The IconColorSaturation property\n   *\n   * Increase or reduce the saturation of the symbol icon. Default value: 0. Value range: [-1, 1]\n   */\n  var iconColorSaturation: Double?\n    /**\n     * Get the IconColorSaturation property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.iconColorSaturation\n    }\n    /**\n     * Set the IconColorSaturation property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-color-saturation\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-color-saturation\")\n    }\n\n  /**\n   * The default iconEmissiveStrength for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   */\n  var iconEmissiveStrength: Double?\n    /**\n     * Get the iconEmissiveStrength property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconEmissiveStrength property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default iconHaloBlur for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   */\n  var iconHaloBlur: Double?\n    /**\n     * Get the iconHaloBlur property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloBlur property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default iconHaloColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var iconHaloColorInt: Int?\n    /**\n     * Get the iconHaloColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default iconHaloColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var iconHaloColorString: String?\n    /**\n     * Get the iconHaloColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default iconHaloWidth for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   */\n  var iconHaloWidth: Double?\n    /**\n     * Get the iconHaloWidth property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloWidth property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The IconImageCrossFade property\n   *\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. . Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  var iconImageCrossFade: Double?\n    /**\n     * Get the IconImageCrossFade property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.iconImageCrossFade\n    }\n    /**\n     * Set the IconImageCrossFade property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-image-cross-fade\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-image-cross-fade\")\n    }\n\n  /**\n   * The default iconOcclusionOpacity for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  var iconOcclusionOpacity: Double?\n    /**\n     * Get the iconOcclusionOpacity property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconOcclusionOpacity property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default iconOpacity for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var iconOpacity: Double?\n    /**\n     * Get the iconOpacity property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the iconOpacity property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_OPACITY, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_OPACITY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_OPACITY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The IconTranslate property\n   *\n   * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of iconTranslate is in pixels.\n   */\n  var iconTranslate: List<Double>?\n    /**\n     * Get the IconTranslate property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.iconTranslate\n    }\n    /**\n     * Set the IconTranslate property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-translate\")\n    }\n\n  /**\n   * The IconTranslateAnchor property\n   *\n   * Controls the frame of reference for `icon-translate`. Default value: \"map\".\n   */\n  var iconTranslateAnchor: IconTranslateAnchor?\n    /**\n     * Get the IconTranslateAnchor property\n     *\n     * @return property wrapper value around IconTranslateAnchor\n     */\n    get(): IconTranslateAnchor? {\n      return layer.iconTranslateAnchor\n    }\n    /**\n     * Set the IconTranslateAnchor property\n     * @param value property wrapper value around IconTranslateAnchor\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"icon-translate-anchor\").value\n      }\n      setLayerProperty(wrappedValue, \"icon-translate-anchor\")\n    }\n\n  /**\n   * The OcclusionOpacityMode property\n   *\n   * Specify how opacity in case of being occluded should be applied Default value: \"anchor\".\n   */\n  var occlusionOpacityMode: OcclusionOpacityMode?\n    /**\n     * Get the OcclusionOpacityMode property\n     *\n     * @return property wrapper value around OcclusionOpacityMode\n     */\n    get(): OcclusionOpacityMode? {\n      return layer.occlusionOpacityMode\n    }\n    /**\n     * Set the OcclusionOpacityMode property\n     * @param value property wrapper value around OcclusionOpacityMode\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"occlusion-opacity-mode\").value\n      }\n      setLayerProperty(wrappedValue, \"occlusion-opacity-mode\")\n    }\n\n  /**\n   * The default symbolZOffset for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  var symbolZOffset: Double?\n    /**\n     * Get the symbolZOffset property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the symbolZOffset property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  var textColorInt: Int?\n    /**\n     * Get the textColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the textColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PointAnnotationOptions.PROPERTY_TEXT_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  var textColorString: String?\n    /**\n     * Get the textColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_COLOR, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textEmissiveStrength for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   */\n  var textEmissiveStrength: Double?\n    /**\n     * Get the textEmissiveStrength property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textEmissiveStrength property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textHaloBlur for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   */\n  var textHaloBlur: Double?\n    /**\n     * Get the textHaloBlur property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textHaloBlur property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textHaloColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var textHaloColorInt: Int?\n    /**\n     * Get the textHaloColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the textHaloColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textHaloColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var textHaloColorString: String?\n    /**\n     * Get the textHaloColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textHaloColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textHaloWidth for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   */\n  var textHaloWidth: Double?\n    /**\n     * Get the textHaloWidth property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textHaloWidth property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textOcclusionOpacity for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  var textOcclusionOpacity: Double?\n    /**\n     * Get the textOcclusionOpacity property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textOcclusionOpacity property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textOpacity for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var textOpacity: Double?\n    /**\n     * Get the textOpacity property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the textOpacity property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_OPACITY, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The TextTranslate property\n   *\n   * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. Default value: [0,0]. The unit of textTranslate is in pixels.\n   */\n  var textTranslate: List<Double>?\n    /**\n     * Get the TextTranslate property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.textTranslate\n    }\n    /**\n     * Set the TextTranslate property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate\").value\n      }\n      setLayerProperty(wrappedValue, \"text-translate\")\n    }\n\n  /**\n   * The TextTranslateAnchor property\n   *\n   * Controls the frame of reference for `text-translate`. Default value: \"map\".\n   */\n  var textTranslateAnchor: TextTranslateAnchor?\n    /**\n     * Get the TextTranslateAnchor property\n     *\n     * @return property wrapper value around TextTranslateAnchor\n     */\n    get(): TextTranslateAnchor? {\n      return layer.textTranslateAnchor\n    }\n    /**\n     * Set the TextTranslateAnchor property\n     * @param value property wrapper value around TextTranslateAnchor\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"text-translate-anchor\").value\n      }\n      setLayerProperty(wrappedValue, \"text-translate-anchor\")\n    }\n\n  /**\n   * The Slot property\n   *\n   * The slot this layer is assigned to. If specified, and a slot with that name exists, it will be placed at that position in the layer order.\n   */\n  var slot: String?\n    /**\n     * Get the Slot property\n     *\n     * @return property wrapper value around String\n     */\n    get(): String? {\n      return layer.slot\n    }\n    /**\n     * Set the Slot property\n     * @param value property wrapper value around String\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"slot\").value\n      }\n      setLayerProperty(wrappedValue, \"slot\")\n    }\n\n  /**\n   * The MaxZoom property\n   *\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  var maxZoom: Double?\n    /**\n     * Get the MaxZoom property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.maxZoom\n    }\n    /**\n     * Set the MaxZoom property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"maxzoom\").value\n      }\n      setLayerProperty(wrappedValue, \"maxzoom\")\n    }\n\n  /**\n   * The MinZoom property\n   *\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  var minZoom: Double?\n    /**\n     * Get the MinZoom property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.minZoom\n    }\n    /**\n     * Set the MinZoom property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"symbol\", \"minzoom\").value\n      }\n      setLayerProperty(wrappedValue, \"minzoom\")\n    }\n\n  /**\n   * The default iconColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `iconColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var iconColorUseTheme: String?\n    /**\n     * Get the iconColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the iconColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default iconHaloColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `iconHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var iconHaloColorUseTheme: String?\n    /**\n     * Get the iconHaloColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the iconHaloColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `textColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var textColorUseTheme: String?\n    /**\n     * Get the textColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default textHaloColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `textHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var textHaloColorUseTheme: String?\n    /**\n     * Get the textHaloColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the textHaloColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The filter on the managed pointAnnotations.\n   */\n  override var layerFilter: Expression?\n    /**\n     * Get filter of the managed pointAnnotations.\n     *\n     * @return expression\n     */\n    get() = layer.filter\n    /**\n     * Set filter on the managed pointAnnotations.\n     *\n     * @param value expression\n     */\n    set(value) {\n      value?.let {\n        layer.filter(it)\n        dragLayer.filter(it)\n      }\n    }\n\n  init {\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_ANCHOR] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_IMAGE] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_OFFSET] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_ROTATE] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_SIZE] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_ANCHOR] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_FIELD] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_OFFSET] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_ROTATE] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_SIZE] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_COLOR] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_OPACITY] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_COLOR] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_OPACITY] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME] = false\n    dataDrivenPropertyUsageMap[PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME] = false\n\n    // Show all icons and texts by default.\n    iconAllowOverlap = true\n    textAllowOverlap = true\n    iconIgnorePlacement = true\n    textIgnorePlacement = true\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    private const val TAG = \"PointAnnotationManager\"\n    /** The generator for id */\n    var ID_GENERATOR = AtomicLong(0)\n  }\n}\n\n/**\n * Extension function to create a PointAnnotationManager instance.\n */\nfun AnnotationPlugin.createPointAnnotationManager(\n  annotationConfig: AnnotationConfig? = null\n): PointAnnotationManager {\n  return createAnnotationManager(AnnotationType.PointAnnotation, annotationConfig) as PointAnnotationManager\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/PointAnnotationOptions.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport android.graphics.Bitmap\nimport androidx.annotation.ColorInt\nimport com.google.gson.JsonElement\nimport com.google.gson.JsonObject\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxAnnotationException\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.IconTextFit\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextJustify\nimport com.mapbox.maps.extension.style.layers.properties.generated.TextTransform\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.AnnotationManager\nimport com.mapbox.maps.plugin.annotation.AnnotationOptions\nimport com.mapbox.maps.plugin.annotation.ConvertUtils.convertDoubleArray\nimport com.mapbox.maps.plugin.annotation.ConvertUtils.toDoubleArray\n\n/**\n * Builder class from which a pointAnnotation is created.\n */\nclass PointAnnotationOptions : AnnotationOptions<Point, PointAnnotation> {\n  private var isDraggable: Boolean = false\n  private var data: JsonElement? = null\n  private var geometry: Point? = null\n  private var iconImageBitmap: Bitmap? = null\n\n  /**\n   * Set bitmap icon-image to initialise the symbol.\n   *\n   * Will not take effect if a String iconImage name has been set.\n   *\n   * @param iconImage the bitmap image\n   * @return this\n   */\n  fun withIconImage(iconImageBitmap: Bitmap): PointAnnotationOptions {\n    this.iconImageBitmap = iconImageBitmap\n    return this\n  }\n\n  /**\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   */\n  var iconAnchor: IconAnchor? = null\n\n  /**\n   * Set icon-anchor to initialise the pointAnnotation with.\n   *\n   * Part of the icon placed closest to the anchor. Default value: \"center\".\n   *\n   * @param iconAnchor the icon-anchor value\n   * @return this\n   */\n  fun withIconAnchor(iconAnchor: IconAnchor): PointAnnotationOptions {\n    this.iconAnchor = iconAnchor\n    return this\n  }\n\n  /**\n   * Name of image in sprite to use for drawing an image background.\n   */\n  var iconImage: String? = null\n\n  /**\n   * Set icon-image to initialise the pointAnnotation with.\n   *\n   * Name of image in sprite to use for drawing an image background.\n   *\n   * @param iconImage the icon-image value\n   * @return this\n   */\n  fun withIconImage(iconImage: String): PointAnnotationOptions {\n    this.iconImage = iconImage\n    return this\n  }\n\n  /**\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   */\n  var iconOffset: List<Double>? = null\n\n  /**\n   * Set icon-offset to initialise the pointAnnotation with.\n   *\n   * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of `icon-size` to obtain the final offset in pixels. When combined with `icon-rotate` the offset will be as if the rotated direction was up. Default value: [0,0].\n   *\n   * @param iconOffset the icon-offset value\n   * @return this\n   */\n  fun withIconOffset(iconOffset: List<Double>): PointAnnotationOptions {\n    this.iconOffset = iconOffset\n    return this\n  }\n\n  /**\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   */\n  var iconRotate: Double? = null\n\n  /**\n   * Set icon-rotate to initialise the pointAnnotation with.\n   *\n   * Rotates the icon clockwise. Default value: 0. The unit of iconRotate is in degrees.\n   *\n   * @param iconRotate the icon-rotate value\n   * @return this\n   */\n  fun withIconRotate(iconRotate: Double): PointAnnotationOptions {\n    this.iconRotate = iconRotate\n    return this\n  }\n\n  /**\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   */\n  var iconSize: Double? = null\n\n  /**\n   * Set icon-size to initialise the pointAnnotation with.\n   *\n   * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by `icon-size`. 1 is the original size; 3 triples the size of the image. Default value: 1. Minimum value: 0. The unit of iconSize is in factor of the original icon size.\n   *\n   * @param iconSize the icon-size value\n   * @return this\n   */\n  fun withIconSize(iconSize: Double): PointAnnotationOptions {\n    this.iconSize = iconSize\n    return this\n  }\n\n  /**\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   */\n  var iconTextFit: IconTextFit? = null\n\n  /**\n   * Set icon-text-fit to initialise the pointAnnotation with.\n   *\n   * Scales the icon to fit around the associated text. Default value: \"none\".\n   *\n   * @param iconTextFit the icon-text-fit value\n   * @return this\n   */\n  fun withIconTextFit(iconTextFit: IconTextFit): PointAnnotationOptions {\n    this.iconTextFit = iconTextFit\n    return this\n  }\n\n  /**\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   */\n  var iconTextFitPadding: List<Double>? = null\n\n  /**\n   * Set icon-text-fit-padding to initialise the pointAnnotation with.\n   *\n   * Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left. Default value: [0,0,0,0]. The unit of iconTextFitPadding is in pixels.\n   *\n   * @param iconTextFitPadding the icon-text-fit-padding value\n   * @return this\n   */\n  fun withIconTextFitPadding(iconTextFitPadding: List<Double>): PointAnnotationOptions {\n    this.iconTextFitPadding = iconTextFitPadding\n    return this\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   */\n  var symbolSortKey: Double? = null\n\n  /**\n   * Set symbol-sort-key to initialise the pointAnnotation with.\n   *\n   * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `icon-allow-overlap` or `text-allow-overlap` is `false`, features with a lower sort key will have priority during placement. When `icon-allow-overlap` or `text-allow-overlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key.\n   *\n   * @param symbolSortKey the symbol-sort-key value\n   * @return this\n   */\n  fun withSymbolSortKey(symbolSortKey: Double): PointAnnotationOptions {\n    this.symbolSortKey = symbolSortKey\n    return this\n  }\n\n  /**\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   */\n  var textAnchor: TextAnchor? = null\n\n  /**\n   * Set text-anchor to initialise the pointAnnotation with.\n   *\n   * Part of the text placed closest to the anchor. Default value: \"center\".\n   *\n   * @param textAnchor the text-anchor value\n   * @return this\n   */\n  fun withTextAnchor(textAnchor: TextAnchor): PointAnnotationOptions {\n    this.textAnchor = textAnchor\n    return this\n  }\n\n  /**\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   */\n  var textField: String? = null\n\n  /**\n   * Set text-field to initialise the pointAnnotation with.\n   *\n   * Value to use for a text label. If a plain `string` is provided, it will be treated as a `formatted` with default/inherited formatting options. SDF images are not supported in formatted text and will be ignored. Default value: \"\".\n   *\n   * @param textField the text-field value\n   * @return this\n   */\n  fun withTextField(textField: String): PointAnnotationOptions {\n    this.textField = textField\n    return this\n  }\n\n  /**\n   * Text justification options. Default value: \"center\".\n   */\n  var textJustify: TextJustify? = null\n\n  /**\n   * Set text-justify to initialise the pointAnnotation with.\n   *\n   * Text justification options. Default value: \"center\".\n   *\n   * @param textJustify the text-justify value\n   * @return this\n   */\n  fun withTextJustify(textJustify: TextJustify): PointAnnotationOptions {\n    this.textJustify = textJustify\n    return this\n  }\n\n  /**\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   */\n  var textLetterSpacing: Double? = null\n\n  /**\n   * Set text-letter-spacing to initialise the pointAnnotation with.\n   *\n   * Text tracking amount. Default value: 0. The unit of textLetterSpacing is in ems.\n   *\n   * @param textLetterSpacing the text-letter-spacing value\n   * @return this\n   */\n  fun withTextLetterSpacing(textLetterSpacing: Double): PointAnnotationOptions {\n    this.textLetterSpacing = textLetterSpacing\n    return this\n  }\n\n  /**\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   */\n  var textLineHeight: Double? = null\n\n  /**\n   * Set text-line-height to initialise the pointAnnotation with.\n   *\n   * Text leading value for multi-line text. Default value: 1.2. The unit of textLineHeight is in ems.\n   *\n   * @param textLineHeight the text-line-height value\n   * @return this\n   */\n  fun withTextLineHeight(textLineHeight: Double): PointAnnotationOptions {\n    this.textLineHeight = textLineHeight\n    return this\n  }\n\n  /**\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   */\n  var textMaxWidth: Double? = null\n\n  /**\n   * Set text-max-width to initialise the pointAnnotation with.\n   *\n   * The maximum line width for text wrapping. Default value: 10. Minimum value: 0. The unit of textMaxWidth is in ems.\n   *\n   * @param textMaxWidth the text-max-width value\n   * @return this\n   */\n  fun withTextMaxWidth(textMaxWidth: Double): PointAnnotationOptions {\n    this.textMaxWidth = textMaxWidth\n    return this\n  }\n\n  /**\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   */\n  var textOffset: List<Double>? = null\n\n  /**\n   * Set text-offset to initialise the pointAnnotation with.\n   *\n   * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. If used with text-variable-anchor, input values will be taken as absolute values. Offsets along the x- and y-axis will be applied automatically based on the anchor position. Default value: [0,0]. The unit of textOffset is in ems.\n   *\n   * @param textOffset the text-offset value\n   * @return this\n   */\n  fun withTextOffset(textOffset: List<Double>): PointAnnotationOptions {\n    this.textOffset = textOffset\n    return this\n  }\n\n  /**\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   */\n  var textRadialOffset: Double? = null\n\n  /**\n   * Set text-radial-offset to initialise the pointAnnotation with.\n   *\n   * Radial offset of text, in the direction of the symbol's anchor. Useful in combination with `text-variable-anchor`, which defaults to using the two-dimensional `text-offset` if present. Default value: 0. The unit of textRadialOffset is in ems.\n   *\n   * @param textRadialOffset the text-radial-offset value\n   * @return this\n   */\n  fun withTextRadialOffset(textRadialOffset: Double): PointAnnotationOptions {\n    this.textRadialOffset = textRadialOffset\n    return this\n  }\n\n  /**\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   */\n  var textRotate: Double? = null\n\n  /**\n   * Set text-rotate to initialise the pointAnnotation with.\n   *\n   * Rotates the text clockwise. Default value: 0. The unit of textRotate is in degrees.\n   *\n   * @param textRotate the text-rotate value\n   * @return this\n   */\n  fun withTextRotate(textRotate: Double): PointAnnotationOptions {\n    this.textRotate = textRotate\n    return this\n  }\n\n  /**\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   */\n  var textSize: Double? = null\n\n  /**\n   * Set text-size to initialise the pointAnnotation with.\n   *\n   * Font size. Default value: 16. Minimum value: 0. The unit of textSize is in pixels.\n   *\n   * @param textSize the text-size value\n   * @return this\n   */\n  fun withTextSize(textSize: Double): PointAnnotationOptions {\n    this.textSize = textSize\n    return this\n  }\n\n  /**\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   */\n  var textTransform: TextTransform? = null\n\n  /**\n   * Set text-transform to initialise the pointAnnotation with.\n   *\n   * Specifies how to capitalize text, similar to the CSS `text-transform` property. Default value: \"none\".\n   *\n   * @param textTransform the text-transform value\n   * @return this\n   */\n  fun withTextTransform(textTransform: TextTransform): PointAnnotationOptions {\n    this.textTransform = textTransform\n    return this\n  }\n\n  /**\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   */\n  var iconColor: String? = null\n\n  /**\n   * Set icon-color to initialise the pointAnnotation with.\n   *\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * @param iconColor the icon-color value\n   * @return this\n   */\n  fun withIconColor(iconColor: String): PointAnnotationOptions {\n    this.iconColor = iconColor\n    return this\n  }\n\n  /**\n   * Set icon-color to initialise the pointAnnotation with.\n   *\n   * The color of the icon. This can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"#000000\".\n   *\n   * @param iconColor the icon-color value with ColorInt format\n   * @return this\n   */\n  fun withIconColor(@ColorInt iconColor: Int): PointAnnotationOptions {\n    this.iconColor = ColorUtils.colorToRgbaString(iconColor)\n    return this\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   */\n  var iconEmissiveStrength: Double? = null\n\n  /**\n   * Set icon-emissive-strength to initialise the pointAnnotation with.\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of iconEmissiveStrength is in intensity.\n   *\n   * @param iconEmissiveStrength the icon-emissive-strength value\n   * @return this\n   */\n  fun withIconEmissiveStrength(iconEmissiveStrength: Double): PointAnnotationOptions {\n    this.iconEmissiveStrength = iconEmissiveStrength\n    return this\n  }\n\n  /**\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   */\n  var iconHaloBlur: Double? = null\n\n  /**\n   * Set icon-halo-blur to initialise the pointAnnotation with.\n   *\n   * Fade out the halo towards the outside. Default value: 0. Minimum value: 0. The unit of iconHaloBlur is in pixels.\n   *\n   * @param iconHaloBlur the icon-halo-blur value\n   * @return this\n   */\n  fun withIconHaloBlur(iconHaloBlur: Double): PointAnnotationOptions {\n    this.iconHaloBlur = iconHaloBlur\n    return this\n  }\n\n  /**\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var iconHaloColor: String? = null\n\n  /**\n   * Set icon-halo-color to initialise the pointAnnotation with.\n   *\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param iconHaloColor the icon-halo-color value\n   * @return this\n   */\n  fun withIconHaloColor(iconHaloColor: String): PointAnnotationOptions {\n    this.iconHaloColor = iconHaloColor\n    return this\n  }\n\n  /**\n   * Set icon-halo-color to initialise the pointAnnotation with.\n   *\n   * The color of the icon's halo. Icon halos can only be used with [SDF icons](/help/troubleshooting/using-recolorable-images-in-mapbox-maps/). Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param iconHaloColor the icon-halo-color value with ColorInt format\n   * @return this\n   */\n  fun withIconHaloColor(@ColorInt iconHaloColor: Int): PointAnnotationOptions {\n    this.iconHaloColor = ColorUtils.colorToRgbaString(iconHaloColor)\n    return this\n  }\n\n  /**\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   */\n  var iconHaloWidth: Double? = null\n\n  /**\n   * Set icon-halo-width to initialise the pointAnnotation with.\n   *\n   * Distance of halo to the icon outline. Default value: 0. Minimum value: 0. The unit of iconHaloWidth is in pixels.\n   *\n   * @param iconHaloWidth the icon-halo-width value\n   * @return this\n   */\n  fun withIconHaloWidth(iconHaloWidth: Double): PointAnnotationOptions {\n    this.iconHaloWidth = iconHaloWidth\n    return this\n  }\n\n  /**\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  var iconOcclusionOpacity: Double? = null\n\n  /**\n   * Set icon-occlusion-opacity to initialise the pointAnnotation with.\n   *\n   * The opacity at which the icon will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * @param iconOcclusionOpacity the icon-occlusion-opacity value\n   * @return this\n   */\n  fun withIconOcclusionOpacity(iconOcclusionOpacity: Double): PointAnnotationOptions {\n    this.iconOcclusionOpacity = iconOcclusionOpacity\n    return this\n  }\n\n  /**\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var iconOpacity: Double? = null\n\n  /**\n   * Set icon-opacity to initialise the pointAnnotation with.\n   *\n   * The opacity at which the icon will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param iconOpacity the icon-opacity value\n   * @return this\n   */\n  fun withIconOpacity(iconOpacity: Double): PointAnnotationOptions {\n    this.iconOpacity = iconOpacity\n    return this\n  }\n\n  /**\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   */\n  var symbolZOffset: Double? = null\n\n  /**\n   * Set symbol-z-offset to initialise the pointAnnotation with.\n   *\n   * Specifies an uniform elevation from the ground, in meters. Default value: 0. Minimum value: 0.\n   *\n   * @param symbolZOffset the symbol-z-offset value\n   * @return this\n   */\n  fun withSymbolZOffset(symbolZOffset: Double): PointAnnotationOptions {\n    this.symbolZOffset = symbolZOffset\n    return this\n  }\n\n  /**\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   */\n  var textColor: String? = null\n\n  /**\n   * Set text-color to initialise the pointAnnotation with.\n   *\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * @param textColor the text-color value\n   * @return this\n   */\n  fun withTextColor(textColor: String): PointAnnotationOptions {\n    this.textColor = textColor\n    return this\n  }\n\n  /**\n   * Set text-color to initialise the pointAnnotation with.\n   *\n   * The color with which the text will be drawn. Default value: \"#000000\".\n   *\n   * @param textColor the text-color value with ColorInt format\n   * @return this\n   */\n  fun withTextColor(@ColorInt textColor: Int): PointAnnotationOptions {\n    this.textColor = ColorUtils.colorToRgbaString(textColor)\n    return this\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   */\n  var textEmissiveStrength: Double? = null\n\n  /**\n   * Set text-emissive-strength to initialise the pointAnnotation with.\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 1. Minimum value: 0. The unit of textEmissiveStrength is in intensity.\n   *\n   * @param textEmissiveStrength the text-emissive-strength value\n   * @return this\n   */\n  fun withTextEmissiveStrength(textEmissiveStrength: Double): PointAnnotationOptions {\n    this.textEmissiveStrength = textEmissiveStrength\n    return this\n  }\n\n  /**\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   */\n  var textHaloBlur: Double? = null\n\n  /**\n   * Set text-halo-blur to initialise the pointAnnotation with.\n   *\n   * The halo's fadeout distance towards the outside. Default value: 0. Minimum value: 0. The unit of textHaloBlur is in pixels.\n   *\n   * @param textHaloBlur the text-halo-blur value\n   * @return this\n   */\n  fun withTextHaloBlur(textHaloBlur: Double): PointAnnotationOptions {\n    this.textHaloBlur = textHaloBlur\n    return this\n  }\n\n  /**\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var textHaloColor: String? = null\n\n  /**\n   * Set text-halo-color to initialise the pointAnnotation with.\n   *\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param textHaloColor the text-halo-color value\n   * @return this\n   */\n  fun withTextHaloColor(textHaloColor: String): PointAnnotationOptions {\n    this.textHaloColor = textHaloColor\n    return this\n  }\n\n  /**\n   * Set text-halo-color to initialise the pointAnnotation with.\n   *\n   * The color of the text's halo, which helps it stand out from backgrounds. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param textHaloColor the text-halo-color value with ColorInt format\n   * @return this\n   */\n  fun withTextHaloColor(@ColorInt textHaloColor: Int): PointAnnotationOptions {\n    this.textHaloColor = ColorUtils.colorToRgbaString(textHaloColor)\n    return this\n  }\n\n  /**\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   */\n  var textHaloWidth: Double? = null\n\n  /**\n   * Set text-halo-width to initialise the pointAnnotation with.\n   *\n   * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. Default value: 0. Minimum value: 0. The unit of textHaloWidth is in pixels.\n   *\n   * @param textHaloWidth the text-halo-width value\n   * @return this\n   */\n  fun withTextHaloWidth(textHaloWidth: Double): PointAnnotationOptions {\n    this.textHaloWidth = textHaloWidth\n    return this\n  }\n\n  /**\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   */\n  var textOcclusionOpacity: Double? = null\n\n  /**\n   * Set text-occlusion-opacity to initialise the pointAnnotation with.\n   *\n   * The opacity at which the text will be drawn in case of being depth occluded. Absent value means full occlusion against terrain only. Default value: 0. Value range: [0, 1]\n   *\n   * @param textOcclusionOpacity the text-occlusion-opacity value\n   * @return this\n   */\n  fun withTextOcclusionOpacity(textOcclusionOpacity: Double): PointAnnotationOptions {\n    this.textOcclusionOpacity = textOcclusionOpacity\n    return this\n  }\n\n  /**\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var textOpacity: Double? = null\n\n  /**\n   * Set text-opacity to initialise the pointAnnotation with.\n   *\n   * The opacity at which the text will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param textOpacity the text-opacity value\n   * @return this\n   */\n  fun withTextOpacity(textOpacity: Double): PointAnnotationOptions {\n    this.textOpacity = textOpacity\n    return this\n  }\n\n  /**\n   * This property defines whether the `iconColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var iconColorUseTheme: String? = null\n\n  /**\n   * Set icon-color-use-theme to initialise the pointAnnotation with.\n   *\n   * This property defines whether the `iconColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param iconColorUseTheme the icon-color-use-theme value\n   * @return this\n   */\n  fun withIconColorUseTheme(iconColorUseTheme: String): PointAnnotationOptions {\n    this.iconColorUseTheme = iconColorUseTheme\n    return this\n  }\n\n  /**\n   * This property defines whether the `iconHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var iconHaloColorUseTheme: String? = null\n\n  /**\n   * Set icon-halo-color-use-theme to initialise the pointAnnotation with.\n   *\n   * This property defines whether the `iconHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param iconHaloColorUseTheme the icon-halo-color-use-theme value\n   * @return this\n   */\n  fun withIconHaloColorUseTheme(iconHaloColorUseTheme: String): PointAnnotationOptions {\n    this.iconHaloColorUseTheme = iconHaloColorUseTheme\n    return this\n  }\n\n  /**\n   * This property defines whether the `textColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var textColorUseTheme: String? = null\n\n  /**\n   * Set text-color-use-theme to initialise the pointAnnotation with.\n   *\n   * This property defines whether the `textColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param textColorUseTheme the text-color-use-theme value\n   * @return this\n   */\n  fun withTextColorUseTheme(textColorUseTheme: String): PointAnnotationOptions {\n    this.textColorUseTheme = textColorUseTheme\n    return this\n  }\n\n  /**\n   * This property defines whether the `textHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var textHaloColorUseTheme: String? = null\n\n  /**\n   * Set text-halo-color-use-theme to initialise the pointAnnotation with.\n   *\n   * This property defines whether the `textHaloColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param textHaloColorUseTheme the text-halo-color-use-theme value\n   * @return this\n   */\n  fun withTextHaloColorUseTheme(textHaloColorUseTheme: String): PointAnnotationOptions {\n    this.textHaloColorUseTheme = textHaloColorUseTheme\n    return this\n  }\n\n  /**\n   * Set the Point of the pointAnnotation, which represents the location of the pointAnnotation on the map\n   *\n   * @param point the location of the pointAnnotation in a longitude and latitude pair\n   * @return this\n   */\n  fun withPoint(point: Point): PointAnnotationOptions {\n    geometry = point\n    return this\n  }\n\n  /**\n   * Get the Point of the pointAnnotation, which represents the location of the pointAnnotation on the map\n   *\n   * @return the location of the pointAnnotation in a longitude and latitude pair\n   */\n  fun getPoint(): Point? {\n    return geometry\n  }\n\n  /**\n   * Set the geometry of the pointAnnotation, which represents the location of the pointAnnotation on the map\n   *\n   * @param geometry the location of the pointAnnotation\n   * @return this\n   */\n  fun withGeometry(geometry: Point): PointAnnotationOptions {\n    this.geometry = geometry\n    return this\n  }\n\n  /**\n   * Get the geometry of the pointAnnotation, which represents the location of the pointAnnotation on the map\n   *\n   * @return the location of the pointAnnotation\n   */\n  fun getGeometry(): Point? {\n    return geometry\n  }\n\n  /**\n  * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. Default value: 0. Value range: [0, 1]\n  */\n  @Deprecated(\"Use PointAnnotationManager.iconImageCrossFadeTransition instead\")\n  var iconImageCrossFade: Double? = null\n\n  /**\n   * Set icon-image-cross-fade to initialise the pointAnnotation with.\n   *\n   * Controls the transition progress between the image variants of icon-image. Zero means the first variant is used, one is the second, and in between they are blended together. Default value: 0. Value range: [0, 1]\n   *\n   * @param iconImageCrossFade the icon-image-cross-fade value\n   * @return this\n   */\n  @Deprecated(\"Use PointAnnotationManager.iconImageCrossFadeTransition instead\")\n  fun withIconImageCrossFade(iconImageCrossFade: Double): PointAnnotationOptions {\n    this.iconImageCrossFade = iconImageCrossFade\n    return this\n  }\n\n  /**\n   * Returns whether this pointAnnotation is draggable, meaning it can be dragged across the screen when touched and moved.\n   *\n   * @return draggable when touched\n   */\n  fun getDraggable(): Boolean {\n    return isDraggable\n  }\n\n  /**\n   * Set whether this pointAnnotation should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   * Note: If this param is used when pointAnnotation is also part of the cluster, then once pointAnnotation is dragged,\n   * it moves out of the cluster and can't be added back to it and is rendered as a separate pointAnnotation.\n   *\n   * @param draggable should be draggable\n   */\n  fun withDraggable(draggable: Boolean): PointAnnotationOptions {\n    isDraggable = draggable\n    return this\n  }\n\n  /**\n   * Set the arbitrary json data of the annotation.\n   *\n   * @param jsonElement the arbitrary json element data\n   */\n  fun withData(jsonElement: JsonElement): PointAnnotationOptions {\n    this.data = jsonElement\n    return this\n  }\n\n  /**\n   * Get the arbitrary json data of the annotation.\n   *\n   * @return the arbitrary json object data if set, else null\n   */\n  fun getData(): JsonElement? {\n    return data\n  }\n\n  /**\n   * Build an annotation\n   *\n   * @param id: the id for this annotation\n   * @param annotationManager: the annotationManager that manage this annotation\n   *\n   * @return the annotation that is built\n   */\n  override fun build(\n    id: String,\n    annotationManager: AnnotationManager<Point, PointAnnotation, *, *, *, *, *>\n  ): PointAnnotation {\n    if (geometry == null) {\n      throw MapboxAnnotationException(\"geometry field is required\")\n    }\n    val jsonObject = JsonObject()\n    iconAnchor?.let {\n      jsonObject.addProperty(PROPERTY_ICON_ANCHOR, it.value)\n    }\n    iconImage?.let {\n      jsonObject.addProperty(PROPERTY_ICON_IMAGE, it)\n    }\n    iconOffset?.let {\n      jsonObject.add(PROPERTY_ICON_OFFSET, convertDoubleArray(it))\n    }\n    iconRotate?.let {\n      jsonObject.addProperty(PROPERTY_ICON_ROTATE, it)\n    }\n    iconSize?.let {\n      jsonObject.addProperty(PROPERTY_ICON_SIZE, it)\n    }\n    iconTextFit?.let {\n      jsonObject.addProperty(PROPERTY_ICON_TEXT_FIT, it.value)\n    }\n    iconTextFitPadding?.let {\n      jsonObject.add(PROPERTY_ICON_TEXT_FIT_PADDING, convertDoubleArray(it))\n    }\n    symbolSortKey?.let {\n      jsonObject.addProperty(PROPERTY_SYMBOL_SORT_KEY, it)\n    }\n    textAnchor?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_ANCHOR, it.value)\n    }\n    textField?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_FIELD, it)\n    }\n    textJustify?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_JUSTIFY, it.value)\n    }\n    textLetterSpacing?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_LETTER_SPACING, it)\n    }\n    textLineHeight?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_LINE_HEIGHT, it)\n    }\n    textMaxWidth?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_MAX_WIDTH, it)\n    }\n    textOffset?.let {\n      jsonObject.add(PROPERTY_TEXT_OFFSET, convertDoubleArray(it))\n    }\n    textRadialOffset?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_RADIAL_OFFSET, it)\n    }\n    textRotate?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_ROTATE, it)\n    }\n    textSize?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_SIZE, it)\n    }\n    textTransform?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_TRANSFORM, it.value)\n    }\n    iconColor?.let {\n      jsonObject.addProperty(PROPERTY_ICON_COLOR, it)\n    }\n    iconEmissiveStrength?.let {\n      jsonObject.addProperty(PROPERTY_ICON_EMISSIVE_STRENGTH, it)\n    }\n    iconHaloBlur?.let {\n      jsonObject.addProperty(PROPERTY_ICON_HALO_BLUR, it)\n    }\n    iconHaloColor?.let {\n      jsonObject.addProperty(PROPERTY_ICON_HALO_COLOR, it)\n    }\n    iconHaloWidth?.let {\n      jsonObject.addProperty(PROPERTY_ICON_HALO_WIDTH, it)\n    }\n    iconOcclusionOpacity?.let {\n      jsonObject.addProperty(PROPERTY_ICON_OCCLUSION_OPACITY, it)\n    }\n    iconOpacity?.let {\n      jsonObject.addProperty(PROPERTY_ICON_OPACITY, it)\n    }\n    symbolZOffset?.let {\n      jsonObject.addProperty(PROPERTY_SYMBOL_Z_OFFSET, it)\n    }\n    textColor?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_COLOR, it)\n    }\n    textEmissiveStrength?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_EMISSIVE_STRENGTH, it)\n    }\n    textHaloBlur?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_HALO_BLUR, it)\n    }\n    textHaloColor?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_HALO_COLOR, it)\n    }\n    textHaloWidth?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_HALO_WIDTH, it)\n    }\n    textOcclusionOpacity?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_OCCLUSION_OPACITY, it)\n    }\n    textOpacity?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_OPACITY, it)\n    }\n    iconColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_ICON_COLOR_USE_THEME, it)\n    }\n    iconHaloColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_ICON_HALO_COLOR_USE_THEME, it)\n    }\n    textColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_COLOR_USE_THEME, it)\n    }\n    textHaloColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_TEXT_HALO_COLOR_USE_THEME, it)\n    }\n    val pointAnnotation = PointAnnotation(id, annotationManager, jsonObject, geometry!!)\n    iconImageBitmap?.let {\n      pointAnnotation.iconImageBitmap = iconImageBitmap\n    }\n    pointAnnotation.isDraggable = isDraggable\n    pointAnnotation.setData(data)\n    return pointAnnotation\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /** The property for icon-anchor */\n    const val PROPERTY_ICON_ANCHOR = \"icon-anchor\"\n\n    /** The property for icon-image */\n    const val PROPERTY_ICON_IMAGE = \"icon-image\"\n\n    /** The property for icon-offset */\n    const val PROPERTY_ICON_OFFSET = \"icon-offset\"\n\n    /** The property for icon-rotate */\n    const val PROPERTY_ICON_ROTATE = \"icon-rotate\"\n\n    /** The property for icon-size */\n    const val PROPERTY_ICON_SIZE = \"icon-size\"\n\n    /** The property for icon-text-fit */\n    const val PROPERTY_ICON_TEXT_FIT = \"icon-text-fit\"\n\n    /** The property for icon-text-fit-padding */\n    const val PROPERTY_ICON_TEXT_FIT_PADDING = \"icon-text-fit-padding\"\n\n    /** The property for symbol-sort-key */\n    const val PROPERTY_SYMBOL_SORT_KEY = \"symbol-sort-key\"\n\n    /** The property for text-anchor */\n    const val PROPERTY_TEXT_ANCHOR = \"text-anchor\"\n\n    /** The property for text-field */\n    const val PROPERTY_TEXT_FIELD = \"text-field\"\n\n    /** The property for text-justify */\n    const val PROPERTY_TEXT_JUSTIFY = \"text-justify\"\n\n    /** The property for text-letter-spacing */\n    const val PROPERTY_TEXT_LETTER_SPACING = \"text-letter-spacing\"\n\n    /** The property for text-line-height */\n    const val PROPERTY_TEXT_LINE_HEIGHT = \"text-line-height\"\n\n    /** The property for text-max-width */\n    const val PROPERTY_TEXT_MAX_WIDTH = \"text-max-width\"\n\n    /** The property for text-offset */\n    const val PROPERTY_TEXT_OFFSET = \"text-offset\"\n\n    /** The property for text-radial-offset */\n    const val PROPERTY_TEXT_RADIAL_OFFSET = \"text-radial-offset\"\n\n    /** The property for text-rotate */\n    const val PROPERTY_TEXT_ROTATE = \"text-rotate\"\n\n    /** The property for text-size */\n    const val PROPERTY_TEXT_SIZE = \"text-size\"\n\n    /** The property for text-transform */\n    const val PROPERTY_TEXT_TRANSFORM = \"text-transform\"\n\n    /** The property for icon-color */\n    const val PROPERTY_ICON_COLOR = \"icon-color\"\n\n    /** The property for icon-emissive-strength */\n    const val PROPERTY_ICON_EMISSIVE_STRENGTH = \"icon-emissive-strength\"\n\n    /** The property for icon-halo-blur */\n    const val PROPERTY_ICON_HALO_BLUR = \"icon-halo-blur\"\n\n    /** The property for icon-halo-color */\n    const val PROPERTY_ICON_HALO_COLOR = \"icon-halo-color\"\n\n    /** The property for icon-halo-width */\n    const val PROPERTY_ICON_HALO_WIDTH = \"icon-halo-width\"\n\n    /** The property for icon-occlusion-opacity */\n    const val PROPERTY_ICON_OCCLUSION_OPACITY = \"icon-occlusion-opacity\"\n\n    /** The property for icon-opacity */\n    const val PROPERTY_ICON_OPACITY = \"icon-opacity\"\n\n    /** The property for symbol-z-offset */\n    const val PROPERTY_SYMBOL_Z_OFFSET = \"symbol-z-offset\"\n\n    /** The property for text-color */\n    const val PROPERTY_TEXT_COLOR = \"text-color\"\n\n    /** The property for text-emissive-strength */\n    const val PROPERTY_TEXT_EMISSIVE_STRENGTH = \"text-emissive-strength\"\n\n    /** The property for text-halo-blur */\n    const val PROPERTY_TEXT_HALO_BLUR = \"text-halo-blur\"\n\n    /** The property for text-halo-color */\n    const val PROPERTY_TEXT_HALO_COLOR = \"text-halo-color\"\n\n    /** The property for text-halo-width */\n    const val PROPERTY_TEXT_HALO_WIDTH = \"text-halo-width\"\n\n    /** The property for text-occlusion-opacity */\n    const val PROPERTY_TEXT_OCCLUSION_OPACITY = \"text-occlusion-opacity\"\n\n    /** The property for text-opacity */\n    const val PROPERTY_TEXT_OPACITY = \"text-opacity\"\n\n    /** The property for icon-color-use-theme */\n    const val PROPERTY_ICON_COLOR_USE_THEME = \"icon-color-use-theme\"\n\n    /** The property for icon-halo-color-use-theme */\n    const val PROPERTY_ICON_HALO_COLOR_USE_THEME = \"icon-halo-color-use-theme\"\n\n    /** The property for text-color-use-theme */\n    const val PROPERTY_TEXT_COLOR_USE_THEME = \"text-color-use-theme\"\n\n    /** The property for text-halo-color-use-theme */\n    const val PROPERTY_TEXT_HALO_COLOR_USE_THEME = \"text-halo-color-use-theme\"\n\n    /** The property for is-draggable */\n    private const val PROPERTY_IS_DRAGGABLE = \"is-draggable\"\n    /** The property for icon-image-cross-fade */\n    const val PROPERTY_ICON_IMAGE_CROSS_FADE = \"icon-image-cross-fade\"\n\n    /**\n     * Creates PointAnnotationOptions out of a Feature.\n     *\n     * @param feature feature to be converted\n     */\n    fun fromFeature(feature: Feature): PointAnnotationOptions? {\n      if (feature.geometry() == null) {\n        throw MapboxAnnotationException(\"geometry field is required\")\n      }\n      if (feature.geometry() !is Point) {\n\n        return null\n      }\n\n      val options = PointAnnotationOptions()\n      options.geometry = feature.geometry() as (Point)\n      if (feature.hasProperty(PROPERTY_ICON_ANCHOR)) {\n        options.iconAnchor = IconAnchor.valueOf(feature.getProperty(PROPERTY_ICON_ANCHOR).asString)\n      }\n      if (feature.hasProperty(PROPERTY_ICON_IMAGE)) {\n        options.iconImage = feature.getProperty(PROPERTY_ICON_IMAGE).asString\n      }\n      if (feature.hasProperty(PROPERTY_ICON_OFFSET)) {\n        options.iconOffset = toDoubleArray(feature.getProperty(PROPERTY_ICON_OFFSET).asJsonArray)\n      }\n      if (feature.hasProperty(PROPERTY_ICON_ROTATE)) {\n        options.iconRotate = feature.getProperty(PROPERTY_ICON_ROTATE).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_ICON_SIZE)) {\n        options.iconSize = feature.getProperty(PROPERTY_ICON_SIZE).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_ICON_TEXT_FIT)) {\n        options.iconTextFit = IconTextFit.valueOf(feature.getProperty(PROPERTY_ICON_TEXT_FIT).asString)\n      }\n      if (feature.hasProperty(PROPERTY_ICON_TEXT_FIT_PADDING)) {\n        options.iconTextFitPadding = toDoubleArray(feature.getProperty(PROPERTY_ICON_TEXT_FIT_PADDING).asJsonArray)\n      }\n      if (feature.hasProperty(PROPERTY_SYMBOL_SORT_KEY)) {\n        options.symbolSortKey = feature.getProperty(PROPERTY_SYMBOL_SORT_KEY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_ANCHOR)) {\n        options.textAnchor = TextAnchor.valueOf(feature.getProperty(PROPERTY_TEXT_ANCHOR).asString)\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_FIELD)) {\n        options.textField = feature.getProperty(PROPERTY_TEXT_FIELD).asString\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_JUSTIFY)) {\n        options.textJustify = TextJustify.valueOf(feature.getProperty(PROPERTY_TEXT_JUSTIFY).asString)\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_LETTER_SPACING)) {\n        options.textLetterSpacing = feature.getProperty(PROPERTY_TEXT_LETTER_SPACING).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_LINE_HEIGHT)) {\n        options.textLineHeight = feature.getProperty(PROPERTY_TEXT_LINE_HEIGHT).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_MAX_WIDTH)) {\n        options.textMaxWidth = feature.getProperty(PROPERTY_TEXT_MAX_WIDTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_OFFSET)) {\n        options.textOffset = toDoubleArray(feature.getProperty(PROPERTY_TEXT_OFFSET).asJsonArray)\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_RADIAL_OFFSET)) {\n        options.textRadialOffset = feature.getProperty(PROPERTY_TEXT_RADIAL_OFFSET).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_ROTATE)) {\n        options.textRotate = feature.getProperty(PROPERTY_TEXT_ROTATE).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_SIZE)) {\n        options.textSize = feature.getProperty(PROPERTY_TEXT_SIZE).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_TRANSFORM)) {\n        options.textTransform = TextTransform.valueOf(feature.getProperty(PROPERTY_TEXT_TRANSFORM).asString)\n      }\n      if (feature.hasProperty(PROPERTY_ICON_COLOR)) {\n        options.iconColor = feature.getProperty(PROPERTY_ICON_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_ICON_EMISSIVE_STRENGTH)) {\n        options.iconEmissiveStrength = feature.getProperty(PROPERTY_ICON_EMISSIVE_STRENGTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_ICON_HALO_BLUR)) {\n        options.iconHaloBlur = feature.getProperty(PROPERTY_ICON_HALO_BLUR).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_ICON_HALO_COLOR)) {\n        options.iconHaloColor = feature.getProperty(PROPERTY_ICON_HALO_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_ICON_HALO_WIDTH)) {\n        options.iconHaloWidth = feature.getProperty(PROPERTY_ICON_HALO_WIDTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_ICON_OCCLUSION_OPACITY)) {\n        options.iconOcclusionOpacity = feature.getProperty(PROPERTY_ICON_OCCLUSION_OPACITY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_ICON_OPACITY)) {\n        options.iconOpacity = feature.getProperty(PROPERTY_ICON_OPACITY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_SYMBOL_Z_OFFSET)) {\n        options.symbolZOffset = feature.getProperty(PROPERTY_SYMBOL_Z_OFFSET).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_COLOR)) {\n        options.textColor = feature.getProperty(PROPERTY_TEXT_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_EMISSIVE_STRENGTH)) {\n        options.textEmissiveStrength = feature.getProperty(PROPERTY_TEXT_EMISSIVE_STRENGTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_HALO_BLUR)) {\n        options.textHaloBlur = feature.getProperty(PROPERTY_TEXT_HALO_BLUR).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_HALO_COLOR)) {\n        options.textHaloColor = feature.getProperty(PROPERTY_TEXT_HALO_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_HALO_WIDTH)) {\n        options.textHaloWidth = feature.getProperty(PROPERTY_TEXT_HALO_WIDTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_OCCLUSION_OPACITY)) {\n        options.textOcclusionOpacity = feature.getProperty(PROPERTY_TEXT_OCCLUSION_OPACITY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_OPACITY)) {\n        options.textOpacity = feature.getProperty(PROPERTY_TEXT_OPACITY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_ICON_COLOR_USE_THEME)) {\n        options.iconColorUseTheme = feature.getProperty(PROPERTY_ICON_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_ICON_HALO_COLOR_USE_THEME)) {\n        options.iconHaloColorUseTheme = feature.getProperty(PROPERTY_ICON_HALO_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_COLOR_USE_THEME)) {\n        options.textColorUseTheme = feature.getProperty(PROPERTY_TEXT_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_TEXT_HALO_COLOR_USE_THEME)) {\n        options.textHaloColorUseTheme = feature.getProperty(PROPERTY_TEXT_HALO_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_IS_DRAGGABLE)) {\n        options.isDraggable = feature.getProperty(PROPERTY_IS_DRAGGABLE).asBoolean\n      }\n      if (feature.hasProperty(PROPERTY_ICON_IMAGE_CROSS_FADE)) {\n        options.iconImageCrossFade = feature.getProperty(PROPERTY_ICON_IMAGE_CROSS_FADE).asDouble\n      }\n      return options\n    }\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/PolygonAnnotation.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport androidx.annotation.ColorInt\nimport com.google.gson.*\nimport com.mapbox.android.gestures.MoveDistancesObject\nimport com.mapbox.geojson.*\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.AnnotationManager\nimport com.mapbox.maps.plugin.annotation.AnnotationType\nimport com.mapbox.maps.plugin.annotation.ConvertUtils\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\n\n/**\n * Class for PolygonAnnotation\n */\nclass PolygonAnnotation(\n  id: String,\n  /** The annotation manager that manipulate this annotation */\n  private val annotationManager: AnnotationManager<Polygon, PolygonAnnotation, *, *, *, *, *>,\n  jsonObject: JsonObject,\n  geometry: Polygon\n) : Annotation<Polygon>(id, jsonObject, geometry) {\n\n  init {\n    jsonObject.addProperty(ID_KEY, id)\n  }\n\n  /**\n   * Get the type of this annotation\n   */\n  override fun getType(): AnnotationType {\n    return AnnotationType.PolygonAnnotation\n  }\n\n  /**\n   * A list of lists of Point for the fill, which represents the locations of the fill on the map\n   *\n   * To update the polygonAnnotation on the map use {@link PolygonAnnotationManager#update(Annotation)}.\n   */\n  var points: List<List<Point>>\n    get() {\n      return geometry.coordinates()\n    }\n    set(value) {\n      geometry = Polygon.fromLngLats(value)\n    }\n\n  // Property accessors\n  /**\n   * The fillConstructBridgeGuardRail property\n   *\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   */\n  var fillConstructBridgeGuardRail: Boolean?\n    /**\n     * Get the fillConstructBridgeGuardRail property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)\n      value?.let {\n        return it.asString.toBoolean()\n      }\n      return null\n    }\n    /**\n     * Set the fillConstructBridgeGuardRail property\n     *\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Boolean\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)\n      }\n    }\n\n  /**\n   * The fillSortKey property\n   *\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  var fillSortKey: Double?\n    /**\n     * Get the fillSortKey property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the fillSortKey property\n     *\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)\n      }\n    }\n\n  /**\n   * The fillBridgeGuardRailColor property in Int\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  var fillBridgeGuardRailColorInt: Int?\n    /**\n     * Get the fillBridgeGuardRailColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the fillBridgeGuardRailColor property\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      }\n    }\n\n  /**\n   * The fillBridgeGuardRailColor property in String\n   *\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  var fillBridgeGuardRailColorString: String?\n    /**\n     * Get the fillBridgeGuardRailColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillBridgeGuardRailColor property\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      }\n    }\n\n  /**\n   * The fillColor property in Int\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  var fillColorInt: Int?\n    /**\n     * Get the fillColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the fillColor property\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PolygonAnnotationOptions.PROPERTY_FILL_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      }\n    }\n\n  /**\n   * The fillColor property in String\n   *\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  var fillColorString: String?\n    /**\n     * Get the fillColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillColor property\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_COLOR, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      }\n    }\n\n  /**\n   * The fillOpacity property\n   *\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   */\n  var fillOpacity: Double?\n    /**\n     * Get the fillOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the fillOpacity property\n     *\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)\n      }\n    }\n\n  /**\n   * The fillOutlineColor property in Int\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  var fillOutlineColorInt: Int?\n    /**\n     * Get the fillOutlineColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the fillOutlineColor property\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      }\n    }\n\n  /**\n   * The fillOutlineColor property in String\n   *\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  var fillOutlineColorString: String?\n    /**\n     * Get the fillOutlineColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillOutlineColor property\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      }\n    }\n\n  /**\n   * The fillPattern property\n   *\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  var fillPattern: String?\n    /**\n     * Get the fillPattern property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillPattern property\n     *\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)\n      }\n    }\n\n  /**\n   * The fillTunnelStructureColor property in Int\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  var fillTunnelStructureColorInt: Int?\n    /**\n     * Get the fillTunnelStructureColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the fillTunnelStructureColor property\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      }\n    }\n\n  /**\n   * The fillTunnelStructureColor property in String\n   *\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  var fillTunnelStructureColorString: String?\n    /**\n     * Get the fillTunnelStructureColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillTunnelStructureColor property\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      }\n    }\n\n  /**\n   * The fillZOffset property\n   *\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   */\n  var fillZOffset: Double?\n    /**\n     * Get the fillZOffset property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the fillZOffset property\n     *\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)\n      }\n    }\n\n  /**\n   * The fillBridgeGuardRailColorUseTheme property\n   *\n   * This property defines whether the `fillBridgeGuardRailColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var fillBridgeGuardRailColorUseTheme: String?\n    /**\n     * Get the fillBridgeGuardRailColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillBridgeGuardRailColorUseTheme property\n     *\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * The fillColorUseTheme property\n   *\n   * This property defines whether the `fillColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var fillColorUseTheme: String?\n    /**\n     * Get the fillColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillColorUseTheme property\n     *\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * The fillOutlineColorUseTheme property\n   *\n   * This property defines whether the `fillOutlineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var fillOutlineColorUseTheme: String?\n    /**\n     * Get the fillOutlineColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillOutlineColorUseTheme property\n     *\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * The fillTunnelStructureColorUseTheme property\n   *\n   * This property defines whether the `fillTunnelStructureColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var fillTunnelStructureColorUseTheme: String?\n    /**\n     * Get the fillTunnelStructureColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillTunnelStructureColorUseTheme property\n     *\n     * To update the polygonAnnotation on the map use {@link polygonAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * Get the offset geometry for the touch point\n   */\n  override fun getOffsetGeometry(\n    mapCameraManagerDelegate: MapCameraManagerDelegate,\n    moveDistancesObject: MoveDistancesObject\n  ): Polygon? {\n    val points = geometry.outer()?.coordinates()\n    if (points == null || points.isEmpty()) return null\n\n    val centerPoint = Point.fromLngLat(points.map { it.longitude() }.average(), points.map { it.latitude() }.average())\n\n    val centerScreenCoordinate = mapCameraManagerDelegate.pixelForCoordinate(centerPoint)\n    val targetPoint = mapCameraManagerDelegate.coordinateForPixel(\n      ScreenCoordinate(\n        centerScreenCoordinate.x - moveDistancesObject.distanceXSinceLast,\n        centerScreenCoordinate.y - moveDistancesObject.distanceYSinceLast\n      )\n    )\n\n    val shiftMercatorCoordinate = ConvertUtils.calculateMercatorCoordinateShift(centerPoint, targetPoint, mapCameraManagerDelegate.cameraState.zoom)\n    val targetPoints = geometry.coordinates().map { sublist ->\n      sublist.map { ConvertUtils.shiftPointWithMercatorCoordinate(it, shiftMercatorCoordinate, mapCameraManagerDelegate.cameraState.zoom) }\n    }\n    if (targetPoints.any { subPointList -> subPointList.any { it.latitude() > MAX_MERCATOR_LATITUDE || it.latitude() < MIN_MERCATOR_LATITUDE } }) {\n      return null\n    }\n    return Polygon.fromLngLats(targetPoints)\n  }\n\n  /**\n   * Set the used data-driven properties\n   */\n  override fun setUsedDataDrivenProperties() {\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)\n    }\n    jsonObject.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /** the Id key for annotation */\n    const val ID_KEY: String = \"PolygonAnnotation\"\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/PolygonAnnotationManager.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport androidx.annotation.ColorInt\nimport com.mapbox.geojson.*\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.get\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationManagerImpl\nimport com.mapbox.maps.plugin.annotation.AnnotationPlugin\nimport com.mapbox.maps.plugin.annotation.AnnotationType\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport java.util.concurrent.atomic.AtomicLong\n\n/**\n * The polygonAnnotation manager allows to add polygonAnnotations to a map.\n */\nclass PolygonAnnotationManager(\n  delegateProvider: MapDelegateProvider,\n  annotationConfig: AnnotationConfig? = null\n) :\n  AnnotationManagerImpl<Polygon, PolygonAnnotation, PolygonAnnotationOptions, OnPolygonAnnotationDragListener, OnPolygonAnnotationClickListener, OnPolygonAnnotationLongClickListener, OnPolygonAnnotationInteractionListener, FillLayer>(\n    delegateProvider, annotationConfig, ID_GENERATOR.incrementAndGet(), \"polygonAnnotation\", ::FillLayer\n  ) {\n\n  @OptIn(MapboxExperimental::class)\n  override fun setDataDrivenPropertyIsUsed(property: String) {\n    when (property) {\n      PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL -> {\n        layer.fillConstructBridgeGuardRail(get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL))\n        dragLayer.fillConstructBridgeGuardRail(get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY -> {\n        layer.fillSortKey(get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY))\n        dragLayer.fillSortKey(get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR -> {\n        layer.fillBridgeGuardRailColor(get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR))\n        dragLayer.fillBridgeGuardRailColor(get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_COLOR -> {\n        layer.fillColor(get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR))\n        dragLayer.fillColor(get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_OPACITY -> {\n        layer.fillOpacity(get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY))\n        dragLayer.fillOpacity(get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR -> {\n        layer.fillOutlineColor(get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR))\n        dragLayer.fillOutlineColor(get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_PATTERN -> {\n        layer.fillPattern(get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN))\n        dragLayer.fillPattern(get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR -> {\n        layer.fillTunnelStructureColor(get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR))\n        dragLayer.fillTunnelStructureColor(get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET -> {\n        layer.fillZOffset(get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET))\n        dragLayer.fillZOffset(get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME -> {\n        layer.fillBridgeGuardRailColorUseTheme(get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME))\n        dragLayer.fillBridgeGuardRailColorUseTheme(get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME -> {\n        layer.fillColorUseTheme(get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME))\n        dragLayer.fillColorUseTheme(get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME -> {\n        layer.fillOutlineColorUseTheme(get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME))\n        dragLayer.fillOutlineColorUseTheme(get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME))\n      }\n      PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME -> {\n        layer.fillTunnelStructureColorUseTheme(get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME))\n        dragLayer.fillTunnelStructureColorUseTheme(get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME))\n      }\n    }\n  }\n\n  /**\n   * Create a list of polygonAnnotations on the map.\n   *\n   * PolygonAnnotations are going to be created only for features with a matching geometry.\n   *\n   * All supported properties are:\n   * PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL - Boolean\n   * PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY - Double\n   * PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_COLOR - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_OPACITY - Double\n   * PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_PATTERN - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET - Double\n   * PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME - String\n   * Learn more about above properties in the )[The online documentation](https://docs.mapbox.com/style-spec/).\n   *\n   * Out of spec properties:\n   * \"is-draggable\" - Boolean, true if the polygonAnnotation should be draggable, false otherwise\n   *\n   * @param json the GeoJSON defining the list of polygonAnnotations to build\n   * @return the list of built polygonAnnotations\n   */\n  fun create(json: String): List<PolygonAnnotation> {\n    return create(FeatureCollection.fromJson(json))\n  }\n\n  /**\n   * Create a list of polygonAnnotations on the map.\n   *\n   * PolygonAnnotations are going to be created only for features with a matching geometry.\n   *\n   * All supported properties are:\n   * PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL - Boolean\n   * PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY - Double\n   * PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_COLOR - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_OPACITY - Double\n   * PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_PATTERN - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET - Double\n   * PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME - String\n   * PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME - String\n   * Learn more about above properties in the )[The online documentation](https://docs.mapbox.com/style-spec/).\n   *\n   * Out of spec properties:\n   * \"is-draggable\" - Boolean, true if the polygonAnnotation should be draggable, false otherwise\n   *\n   * @param featureCollection the featureCollection defining the list of polygonAnnotations to build\n   * @return the list of built polygonAnnotations\n   */\n  fun create(featureCollection: FeatureCollection): List<PolygonAnnotation> {\n    featureCollection.features()?.let { features ->\n      val options = features.mapNotNull {\n        PolygonAnnotationOptions.fromFeature(it)\n      }\n      return create(options)\n    }\n    return listOf()\n  }\n\n  /**\n   * Get the key of the id of the annotation.\n   *\n   * @return the key of the id of the annotation\n   */\n  override fun getAnnotationIdKey(): String {\n    return PolygonAnnotation.ID_KEY\n  }\n\n  // Property accessors\n  /**\n   * The default fillConstructBridgeGuardRail for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   */\n  @MapboxExperimental\n  var fillConstructBridgeGuardRail: Boolean?\n    /**\n     * Get the fillConstructBridgeGuardRail property.\n     *\n     * @return property wrapper value around Boolean\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)\n      value?.let {\n        return it.asString.toBoolean()\n      }\n      return null\n    }\n    /**\n     * Set the fillConstructBridgeGuardRail property.\n     *\n     * @param value constant property value for Boolean\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The FillElevationReference property\n   *\n   * Selects the base of fill-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  @MapboxExperimental\n  var fillElevationReference: FillElevationReference?\n    /**\n     * Get the FillElevationReference property\n     *\n     * @return property wrapper value around FillElevationReference\n     */\n    get(): FillElevationReference? {\n      return layer.fillElevationReference\n    }\n    /**\n     * Set the FillElevationReference property\n     * @param value property wrapper value around FillElevationReference\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-elevation-reference\").value\n      }\n      setLayerProperty(wrappedValue, \"fill-elevation-reference\")\n    }\n\n  /**\n   * The default fillSortKey for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  var fillSortKey: Double?\n    /**\n     * Get the fillSortKey property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the fillSortKey property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The FillAntialias property\n   *\n   * Whether or not the fill should be antialiased. Default value: true.\n   */\n  var fillAntialias: Boolean?\n    /**\n     * Get the FillAntialias property\n     *\n     * @return property wrapper value around Boolean\n     */\n    get(): Boolean? {\n      return layer.fillAntialias\n    }\n    /**\n     * Set the FillAntialias property\n     * @param value property wrapper value around Boolean\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-antialias\").value\n      }\n      setLayerProperty(wrappedValue, \"fill-antialias\")\n    }\n\n  /**\n   * The default fillBridgeGuardRailColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  var fillBridgeGuardRailColorInt: Int?\n    /**\n     * Get the fillBridgeGuardRailColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the fillBridgeGuardRailColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillBridgeGuardRailColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  var fillBridgeGuardRailColorString: String?\n    /**\n     * Get the fillBridgeGuardRailColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillBridgeGuardRailColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  var fillColorInt: Int?\n    /**\n     * Get the fillColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the fillColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PolygonAnnotationOptions.PROPERTY_FILL_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  var fillColorString: String?\n    /**\n     * Get the fillColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_COLOR, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The FillEmissiveStrength property\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of fillEmissiveStrength is in intensity.\n   */\n  var fillEmissiveStrength: Double?\n    /**\n     * Get the FillEmissiveStrength property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.fillEmissiveStrength\n    }\n    /**\n     * Set the FillEmissiveStrength property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-emissive-strength\").value\n      }\n      setLayerProperty(wrappedValue, \"fill-emissive-strength\")\n    }\n\n  /**\n   * The default fillOpacity for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   */\n  var fillOpacity: Double?\n    /**\n     * Get the fillOpacity property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the fillOpacity property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillOutlineColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  var fillOutlineColorInt: Int?\n    /**\n     * Get the fillOutlineColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the fillOutlineColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillOutlineColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  var fillOutlineColorString: String?\n    /**\n     * Get the fillOutlineColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillOutlineColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillPattern for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  var fillPattern: String?\n    /**\n     * Get the fillPattern property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillPattern property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The FillPatternCrossFade property\n   *\n   * Controls the transition progress between the image variants of fill-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  var fillPatternCrossFade: Double?\n    /**\n     * Get the FillPatternCrossFade property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.fillPatternCrossFade\n    }\n    /**\n     * Set the FillPatternCrossFade property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-pattern-cross-fade\").value\n      }\n      setLayerProperty(wrappedValue, \"fill-pattern-cross-fade\")\n    }\n\n  /**\n   * The FillTranslate property\n   *\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of fillTranslate is in pixels.\n   */\n  var fillTranslate: List<Double>?\n    /**\n     * Get the FillTranslate property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.fillTranslate\n    }\n    /**\n     * Set the FillTranslate property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate\").value\n      }\n      setLayerProperty(wrappedValue, \"fill-translate\")\n    }\n\n  /**\n   * The FillTranslateAnchor property\n   *\n   * Controls the frame of reference for `fill-translate`. Default value: \"map\".\n   */\n  var fillTranslateAnchor: FillTranslateAnchor?\n    /**\n     * Get the FillTranslateAnchor property\n     *\n     * @return property wrapper value around FillTranslateAnchor\n     */\n    get(): FillTranslateAnchor? {\n      return layer.fillTranslateAnchor\n    }\n    /**\n     * Set the FillTranslateAnchor property\n     * @param value property wrapper value around FillTranslateAnchor\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"fill-translate-anchor\").value\n      }\n      setLayerProperty(wrappedValue, \"fill-translate-anchor\")\n    }\n\n  /**\n   * The default fillTunnelStructureColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  var fillTunnelStructureColorInt: Int?\n    /**\n     * Get the fillTunnelStructureColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the fillTunnelStructureColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillTunnelStructureColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  @MapboxExperimental\n  var fillTunnelStructureColorString: String?\n    /**\n     * Get the fillTunnelStructureColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillTunnelStructureColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillZOffset for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   */\n  @MapboxExperimental\n  var fillZOffset: Double?\n    /**\n     * Get the fillZOffset property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the fillZOffset property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The Slot property\n   *\n   * The slot this layer is assigned to. If specified, and a slot with that name exists, it will be placed at that position in the layer order.\n   */\n  var slot: String?\n    /**\n     * Get the Slot property\n     *\n     * @return property wrapper value around String\n     */\n    get(): String? {\n      return layer.slot\n    }\n    /**\n     * Set the Slot property\n     * @param value property wrapper value around String\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"slot\").value\n      }\n      setLayerProperty(wrappedValue, \"slot\")\n    }\n\n  /**\n   * The MaxZoom property\n   *\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  var maxZoom: Double?\n    /**\n     * Get the MaxZoom property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.maxZoom\n    }\n    /**\n     * Set the MaxZoom property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"maxzoom\").value\n      }\n      setLayerProperty(wrappedValue, \"maxzoom\")\n    }\n\n  /**\n   * The MinZoom property\n   *\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  var minZoom: Double?\n    /**\n     * Get the MinZoom property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.minZoom\n    }\n    /**\n     * Set the MinZoom property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"fill\", \"minzoom\").value\n      }\n      setLayerProperty(wrappedValue, \"minzoom\")\n    }\n\n  /**\n   * The default fillBridgeGuardRailColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `fillBridgeGuardRailColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var fillBridgeGuardRailColorUseTheme: String?\n    /**\n     * Get the fillBridgeGuardRailColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillBridgeGuardRailColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `fillColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var fillColorUseTheme: String?\n    /**\n     * Get the fillColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillOutlineColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `fillOutlineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var fillOutlineColorUseTheme: String?\n    /**\n     * Get the fillOutlineColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillOutlineColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default fillTunnelStructureColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `fillTunnelStructureColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var fillTunnelStructureColorUseTheme: String?\n    /**\n     * Get the fillTunnelStructureColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the fillTunnelStructureColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The filter on the managed polygonAnnotations.\n   */\n  override var layerFilter: Expression?\n    /**\n     * Get filter of the managed polygonAnnotations.\n     *\n     * @return expression\n     */\n    get() = layer.filter\n    /**\n     * Set filter on the managed polygonAnnotations.\n     *\n     * @param value expression\n     */\n    set(value) {\n      value?.let {\n        layer.filter(it)\n        dragLayer.filter(it)\n      }\n    }\n\n  init {\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_COLOR] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_OPACITY] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_PATTERN] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME] = false\n    dataDrivenPropertyUsageMap[PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME] = false\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /** The generator for id */\n    var ID_GENERATOR = AtomicLong(0)\n  }\n}\n\n/**\n * Extension function to create a PolygonAnnotationManager instance.\n */\nfun AnnotationPlugin.createPolygonAnnotationManager(\n  annotationConfig: AnnotationConfig? = null\n): PolygonAnnotationManager {\n  return createAnnotationManager(AnnotationType.PolygonAnnotation, annotationConfig) as PolygonAnnotationManager\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/PolygonAnnotationOptions.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport androidx.annotation.ColorInt\nimport com.google.gson.JsonElement\nimport com.google.gson.JsonObject\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.MapboxAnnotationException\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.AnnotationManager\nimport com.mapbox.maps.plugin.annotation.AnnotationOptions\n\n/**\n * Builder class from which a polygonAnnotation is created.\n */\nclass PolygonAnnotationOptions : AnnotationOptions<Polygon, PolygonAnnotation> {\n  private var isDraggable: Boolean = false\n  private var data: JsonElement? = null\n  private var geometry: Polygon? = null\n\n  /**\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   */\n  var fillConstructBridgeGuardRail: Boolean? = null\n\n  /**\n   * Set fill-construct-bridge-guard-rail to initialise the polygonAnnotation with.\n   *\n   * Determines whether bridge guard rails are added for elevated roads. Default value: \"true\".\n   *\n   * @param fillConstructBridgeGuardRail the fill-construct-bridge-guard-rail value\n   * @return this\n   */\n  fun withFillConstructBridgeGuardRail(fillConstructBridgeGuardRail: Boolean): PolygonAnnotationOptions {\n    this.fillConstructBridgeGuardRail = fillConstructBridgeGuardRail\n    return this\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  var fillSortKey: Double? = null\n\n  /**\n   * Set fill-sort-key to initialise the polygonAnnotation with.\n   *\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * @param fillSortKey the fill-sort-key value\n   * @return this\n   */\n  fun withFillSortKey(fillSortKey: Double): PolygonAnnotationOptions {\n    this.fillSortKey = fillSortKey\n    return this\n  }\n\n  /**\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  var fillBridgeGuardRailColor: String? = null\n\n  /**\n   * Set fill-bridge-guard-rail-color to initialise the polygonAnnotation with.\n   *\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillBridgeGuardRailColor the fill-bridge-guard-rail-color value\n   * @return this\n   */\n  fun withFillBridgeGuardRailColor(fillBridgeGuardRailColor: String): PolygonAnnotationOptions {\n    this.fillBridgeGuardRailColor = fillBridgeGuardRailColor\n    return this\n  }\n\n  /**\n   * Set fill-bridge-guard-rail-color to initialise the polygonAnnotation with.\n   *\n   * The color of bridge guard rail. Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillBridgeGuardRailColor the fill-bridge-guard-rail-color value with ColorInt format\n   * @return this\n   */\n  fun withFillBridgeGuardRailColor(@ColorInt fillBridgeGuardRailColor: Int): PolygonAnnotationOptions {\n    this.fillBridgeGuardRailColor = ColorUtils.colorToRgbaString(fillBridgeGuardRailColor)\n    return this\n  }\n\n  /**\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   */\n  var fillColor: String? = null\n\n  /**\n   * Set fill-color to initialise the polygonAnnotation with.\n   *\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * @param fillColor the fill-color value\n   * @return this\n   */\n  fun withFillColor(fillColor: String): PolygonAnnotationOptions {\n    this.fillColor = fillColor\n    return this\n  }\n\n  /**\n   * Set fill-color to initialise the polygonAnnotation with.\n   *\n   * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. Default value: \"#000000\".\n   *\n   * @param fillColor the fill-color value with ColorInt format\n   * @return this\n   */\n  fun withFillColor(@ColorInt fillColor: Int): PolygonAnnotationOptions {\n    this.fillColor = ColorUtils.colorToRgbaString(fillColor)\n    return this\n  }\n\n  /**\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   */\n  var fillOpacity: Double? = null\n\n  /**\n   * Set fill-opacity to initialise the polygonAnnotation with.\n   *\n   * The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used. Default value: 1. Value range: [0, 1]\n   *\n   * @param fillOpacity the fill-opacity value\n   * @return this\n   */\n  fun withFillOpacity(fillOpacity: Double): PolygonAnnotationOptions {\n    this.fillOpacity = fillOpacity\n    return this\n  }\n\n  /**\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   */\n  var fillOutlineColor: String? = null\n\n  /**\n   * Set fill-outline-color to initialise the polygonAnnotation with.\n   *\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * @param fillOutlineColor the fill-outline-color value\n   * @return this\n   */\n  fun withFillOutlineColor(fillOutlineColor: String): PolygonAnnotationOptions {\n    this.fillOutlineColor = fillOutlineColor\n    return this\n  }\n\n  /**\n   * Set fill-outline-color to initialise the polygonAnnotation with.\n   *\n   * The outline color of the fill. Matches the value of `fill-color` if unspecified.\n   *\n   * @param fillOutlineColor the fill-outline-color value with ColorInt format\n   * @return this\n   */\n  fun withFillOutlineColor(@ColorInt fillOutlineColor: Int): PolygonAnnotationOptions {\n    this.fillOutlineColor = ColorUtils.colorToRgbaString(fillOutlineColor)\n    return this\n  }\n\n  /**\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  var fillPattern: String? = null\n\n  /**\n   * Set fill-pattern to initialise the polygonAnnotation with.\n   *\n   * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param fillPattern the fill-pattern value\n   * @return this\n   */\n  fun withFillPattern(fillPattern: String): PolygonAnnotationOptions {\n    this.fillPattern = fillPattern\n    return this\n  }\n\n  /**\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   */\n  var fillTunnelStructureColor: String? = null\n\n  /**\n   * Set fill-tunnel-structure-color to initialise the polygonAnnotation with.\n   *\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillTunnelStructureColor the fill-tunnel-structure-color value\n   * @return this\n   */\n  fun withFillTunnelStructureColor(fillTunnelStructureColor: String): PolygonAnnotationOptions {\n    this.fillTunnelStructureColor = fillTunnelStructureColor\n    return this\n  }\n\n  /**\n   * Set fill-tunnel-structure-color to initialise the polygonAnnotation with.\n   *\n   * The color of tunnel structures (tunnel entrance and tunnel walls). Default value: \"rgba(241, 236, 225, 255)\".\n   *\n   * @param fillTunnelStructureColor the fill-tunnel-structure-color value with ColorInt format\n   * @return this\n   */\n  fun withFillTunnelStructureColor(@ColorInt fillTunnelStructureColor: Int): PolygonAnnotationOptions {\n    this.fillTunnelStructureColor = ColorUtils.colorToRgbaString(fillTunnelStructureColor)\n    return this\n  }\n\n  /**\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   */\n  var fillZOffset: Double? = null\n\n  /**\n   * Set fill-z-offset to initialise the polygonAnnotation with.\n   *\n   * Specifies an uniform elevation in meters. Note: If the value is zero, the layer will be rendered on the ground. Non-zero values will elevate the layer from the sea level, which can cause it to be rendered below the terrain. Default value: 0. Minimum value: 0.\n   *\n   * @param fillZOffset the fill-z-offset value\n   * @return this\n   */\n  fun withFillZOffset(fillZOffset: Double): PolygonAnnotationOptions {\n    this.fillZOffset = fillZOffset\n    return this\n  }\n\n  /**\n   * This property defines whether the `fillBridgeGuardRailColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var fillBridgeGuardRailColorUseTheme: String? = null\n\n  /**\n   * Set fill-bridge-guard-rail-color-use-theme to initialise the polygonAnnotation with.\n   *\n   * This property defines whether the `fillBridgeGuardRailColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param fillBridgeGuardRailColorUseTheme the fill-bridge-guard-rail-color-use-theme value\n   * @return this\n   */\n  fun withFillBridgeGuardRailColorUseTheme(fillBridgeGuardRailColorUseTheme: String): PolygonAnnotationOptions {\n    this.fillBridgeGuardRailColorUseTheme = fillBridgeGuardRailColorUseTheme\n    return this\n  }\n\n  /**\n   * This property defines whether the `fillColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var fillColorUseTheme: String? = null\n\n  /**\n   * Set fill-color-use-theme to initialise the polygonAnnotation with.\n   *\n   * This property defines whether the `fillColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param fillColorUseTheme the fill-color-use-theme value\n   * @return this\n   */\n  fun withFillColorUseTheme(fillColorUseTheme: String): PolygonAnnotationOptions {\n    this.fillColorUseTheme = fillColorUseTheme\n    return this\n  }\n\n  /**\n   * This property defines whether the `fillOutlineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var fillOutlineColorUseTheme: String? = null\n\n  /**\n   * Set fill-outline-color-use-theme to initialise the polygonAnnotation with.\n   *\n   * This property defines whether the `fillOutlineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param fillOutlineColorUseTheme the fill-outline-color-use-theme value\n   * @return this\n   */\n  fun withFillOutlineColorUseTheme(fillOutlineColorUseTheme: String): PolygonAnnotationOptions {\n    this.fillOutlineColorUseTheme = fillOutlineColorUseTheme\n    return this\n  }\n\n  /**\n   * This property defines whether the `fillTunnelStructureColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var fillTunnelStructureColorUseTheme: String? = null\n\n  /**\n   * Set fill-tunnel-structure-color-use-theme to initialise the polygonAnnotation with.\n   *\n   * This property defines whether the `fillTunnelStructureColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param fillTunnelStructureColorUseTheme the fill-tunnel-structure-color-use-theme value\n   * @return this\n   */\n  fun withFillTunnelStructureColorUseTheme(fillTunnelStructureColorUseTheme: String): PolygonAnnotationOptions {\n    this.fillTunnelStructureColorUseTheme = fillTunnelStructureColorUseTheme\n    return this\n  }\n\n  /**\n   * Set a list of lists of Point for the fill, which represents the locations of the fill on the map\n   *\n   * @param points a list of a lists of the locations of the line in a longitude and latitude pairs\n   * @return this\n   */\n  fun withPoints(points: List<List<Point>>): PolygonAnnotationOptions {\n    geometry = Polygon.fromLngLats(points)\n    return this\n  }\n\n  /**\n   * Get a list of lists of Point for the fill, which represents the locations of the fill on the map\n   *\n   * @return a list of a lists of the locations of the line in a longitude and latitude pairs\n   */\n  fun getPoints(): List<List<Point>> {\n    return geometry?.coordinates() as List<List<Point>>\n  }\n\n  /**\n   * Set the geometry of the polygonAnnotation, which represents the location of the polygonAnnotation on the map\n   *\n   * @param geometry the location of the polygonAnnotation\n   * @return this\n   */\n  fun withGeometry(geometry: Polygon): PolygonAnnotationOptions {\n    this.geometry = geometry\n    return this\n  }\n\n  /**\n   * Get the geometry of the polygonAnnotation, which represents the location of the polygonAnnotation on the map\n   *\n   * @return the location of the polygonAnnotation\n   */\n  fun getGeometry(): Polygon? {\n    return geometry\n  }\n\n  /**\n   * Returns whether this polygonAnnotation is draggable, meaning it can be dragged across the screen when touched and moved.\n   *\n   * @return draggable when touched\n   */\n  fun getDraggable(): Boolean {\n    return isDraggable\n  }\n\n  /**\n   * Set whether this polygonAnnotation should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   *\n   * @param draggable should be draggable\n   */\n  fun withDraggable(draggable: Boolean): PolygonAnnotationOptions {\n    isDraggable = draggable\n    return this\n  }\n\n  /**\n   * Set the arbitrary json data of the annotation.\n   *\n   * @param jsonElement the arbitrary json element data\n   */\n  fun withData(jsonElement: JsonElement): PolygonAnnotationOptions {\n    this.data = jsonElement\n    return this\n  }\n\n  /**\n   * Get the arbitrary json data of the annotation.\n   *\n   * @return the arbitrary json object data if set, else null\n   */\n  fun getData(): JsonElement? {\n    return data\n  }\n\n  /**\n   * Build an annotation\n   *\n   * @param id: the id for this annotation\n   * @param annotationManager: the annotationManager that manage this annotation\n   *\n   * @return the annotation that is built\n   */\n  override fun build(\n    id: String,\n    annotationManager: AnnotationManager<Polygon, PolygonAnnotation, *, *, *, *, *>\n  ): PolygonAnnotation {\n    if (geometry == null) {\n      throw MapboxAnnotationException(\"geometry field is required\")\n    }\n    val jsonObject = JsonObject()\n    fillConstructBridgeGuardRail?.let {\n      jsonObject.addProperty(PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL, it)\n    }\n    fillSortKey?.let {\n      jsonObject.addProperty(PROPERTY_FILL_SORT_KEY, it)\n    }\n    fillBridgeGuardRailColor?.let {\n      jsonObject.addProperty(PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR, it)\n    }\n    fillColor?.let {\n      jsonObject.addProperty(PROPERTY_FILL_COLOR, it)\n    }\n    fillOpacity?.let {\n      jsonObject.addProperty(PROPERTY_FILL_OPACITY, it)\n    }\n    fillOutlineColor?.let {\n      jsonObject.addProperty(PROPERTY_FILL_OUTLINE_COLOR, it)\n    }\n    fillPattern?.let {\n      jsonObject.addProperty(PROPERTY_FILL_PATTERN, it)\n    }\n    fillTunnelStructureColor?.let {\n      jsonObject.addProperty(PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR, it)\n    }\n    fillZOffset?.let {\n      jsonObject.addProperty(PROPERTY_FILL_Z_OFFSET, it)\n    }\n    fillBridgeGuardRailColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME, it)\n    }\n    fillColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_FILL_COLOR_USE_THEME, it)\n    }\n    fillOutlineColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_FILL_OUTLINE_COLOR_USE_THEME, it)\n    }\n    fillTunnelStructureColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME, it)\n    }\n    val polygonAnnotation = PolygonAnnotation(id, annotationManager, jsonObject, geometry!!)\n    polygonAnnotation.isDraggable = isDraggable\n    polygonAnnotation.setData(data)\n    return polygonAnnotation\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /** The property for fill-construct-bridge-guard-rail */\n    const val PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL = \"fill-construct-bridge-guard-rail\"\n\n    /** The property for fill-sort-key */\n    const val PROPERTY_FILL_SORT_KEY = \"fill-sort-key\"\n\n    /** The property for fill-bridge-guard-rail-color */\n    const val PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR = \"fill-bridge-guard-rail-color\"\n\n    /** The property for fill-color */\n    const val PROPERTY_FILL_COLOR = \"fill-color\"\n\n    /** The property for fill-opacity */\n    const val PROPERTY_FILL_OPACITY = \"fill-opacity\"\n\n    /** The property for fill-outline-color */\n    const val PROPERTY_FILL_OUTLINE_COLOR = \"fill-outline-color\"\n\n    /** The property for fill-pattern */\n    const val PROPERTY_FILL_PATTERN = \"fill-pattern\"\n\n    /** The property for fill-tunnel-structure-color */\n    const val PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR = \"fill-tunnel-structure-color\"\n\n    /** The property for fill-z-offset */\n    const val PROPERTY_FILL_Z_OFFSET = \"fill-z-offset\"\n\n    /** The property for fill-bridge-guard-rail-color-use-theme */\n    const val PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME = \"fill-bridge-guard-rail-color-use-theme\"\n\n    /** The property for fill-color-use-theme */\n    const val PROPERTY_FILL_COLOR_USE_THEME = \"fill-color-use-theme\"\n\n    /** The property for fill-outline-color-use-theme */\n    const val PROPERTY_FILL_OUTLINE_COLOR_USE_THEME = \"fill-outline-color-use-theme\"\n\n    /** The property for fill-tunnel-structure-color-use-theme */\n    const val PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME = \"fill-tunnel-structure-color-use-theme\"\n\n    /** The property for is-draggable */\n    private const val PROPERTY_IS_DRAGGABLE = \"is-draggable\"\n\n    /**\n     * Creates PolygonAnnotationOptions out of a Feature.\n     *\n     * @param feature feature to be converted\n     */\n    fun fromFeature(feature: Feature): PolygonAnnotationOptions? {\n      if (feature.geometry() == null) {\n        throw MapboxAnnotationException(\"geometry field is required\")\n      }\n      if (feature.geometry() !is Polygon) {\n        return null\n      }\n\n      val options = PolygonAnnotationOptions()\n      options.geometry = feature.geometry() as (Polygon)\n      if (feature.hasProperty(PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)) {\n        options.fillConstructBridgeGuardRail = feature.getProperty(PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL).asBoolean\n      }\n      if (feature.hasProperty(PROPERTY_FILL_SORT_KEY)) {\n        options.fillSortKey = feature.getProperty(PROPERTY_FILL_SORT_KEY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) {\n        options.fillBridgeGuardRailColor = feature.getProperty(PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_FILL_COLOR)) {\n        options.fillColor = feature.getProperty(PROPERTY_FILL_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_FILL_OPACITY)) {\n        options.fillOpacity = feature.getProperty(PROPERTY_FILL_OPACITY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_FILL_OUTLINE_COLOR)) {\n        options.fillOutlineColor = feature.getProperty(PROPERTY_FILL_OUTLINE_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_FILL_PATTERN)) {\n        options.fillPattern = feature.getProperty(PROPERTY_FILL_PATTERN).asString\n      }\n      if (feature.hasProperty(PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) {\n        options.fillTunnelStructureColor = feature.getProperty(PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_FILL_Z_OFFSET)) {\n        options.fillZOffset = feature.getProperty(PROPERTY_FILL_Z_OFFSET).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)) {\n        options.fillBridgeGuardRailColorUseTheme = feature.getProperty(PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_FILL_COLOR_USE_THEME)) {\n        options.fillColorUseTheme = feature.getProperty(PROPERTY_FILL_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)) {\n        options.fillOutlineColorUseTheme = feature.getProperty(PROPERTY_FILL_OUTLINE_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)) {\n        options.fillTunnelStructureColorUseTheme = feature.getProperty(PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_IS_DRAGGABLE)) {\n        options.isDraggable = feature.getProperty(PROPERTY_IS_DRAGGABLE).asBoolean\n      }\n      return options\n    }\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/PolylineAnnotation.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport androidx.annotation.ColorInt\nimport com.google.gson.*\nimport com.mapbox.android.gestures.MoveDistancesObject\nimport com.mapbox.geojson.*\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.Annotation\nimport com.mapbox.maps.plugin.annotation.AnnotationManager\nimport com.mapbox.maps.plugin.annotation.AnnotationType\nimport com.mapbox.maps.plugin.annotation.ConvertUtils\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport java.util.Locale\n\n/**\n * Class for PolylineAnnotation\n */\nclass PolylineAnnotation(\n  id: String,\n  /** The annotation manager that manipulate this annotation */\n  private val annotationManager: AnnotationManager<LineString, PolylineAnnotation, *, *, *, *, *>,\n  jsonObject: JsonObject,\n  geometry: LineString\n) : Annotation<LineString>(id, jsonObject, geometry) {\n\n  init {\n    jsonObject.addProperty(ID_KEY, id)\n  }\n\n  /**\n   * Get the type of this annotation\n   */\n  override fun getType(): AnnotationType {\n    return AnnotationType.PolylineAnnotation\n  }\n\n  /**\n   * A list of Point for the line, which represents the locations of the line on the map\n   *\n   * To update the polylineAnnotation on the map use {@link PolylineAnnotationManager#update(Annotation)}.\n   */\n  var points: List<Point>\n    get() {\n      return geometry.coordinates()\n    }\n    set(value) {\n      geometry = LineString.fromLngLats(value)\n    }\n\n  // Property accessors\n  /**\n   * The lineElevationGroundScale property\n   *\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   */\n  var lineElevationGroundScale: Double?\n    /**\n     * Get the lineElevationGroundScale property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineElevationGroundScale property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)\n      }\n    }\n\n  /**\n   * The lineJoin property\n   *\n   * The display of lines when joining. Default value: \"miter\".\n   */\n  var lineJoin: LineJoin?\n    /**\n     * Get the lineJoin property\n     *\n     * @return property wrapper value around LineJoin\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)\n      value?.let {\n        return LineJoin.valueOf(it.asString.uppercase(Locale.US).replace('-', '_'))\n      }\n      return null\n    }\n    /**\n     * Set the lineJoin property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for LineJoin\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_JOIN, value.value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)\n      }\n    }\n\n  /**\n   * The lineSortKey property\n   *\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  var lineSortKey: Double?\n    /**\n     * Get the lineSortKey property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineSortKey property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)\n      }\n    }\n\n  /**\n   * The lineZOffset property\n   *\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   */\n  var lineZOffset: Double?\n    /**\n     * Get the lineZOffset property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineZOffset property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)\n      }\n    }\n\n  /**\n   * The lineBlur property\n   *\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   */\n  var lineBlur: Double?\n    /**\n     * Get the lineBlur property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineBlur property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_BLUR, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)\n      }\n    }\n\n  /**\n   * The lineBorderColor property in Int\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var lineBorderColorInt: Int?\n    /**\n     * Get the lineBorderColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the lineBorderColor property\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      }\n    }\n\n  /**\n   * The lineBorderColor property in String\n   *\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var lineBorderColorString: String?\n    /**\n     * Get the lineBorderColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the lineBorderColor property\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      }\n    }\n\n  /**\n   * The lineBorderWidth property\n   *\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   */\n  var lineBorderWidth: Double?\n    /**\n     * Get the lineBorderWidth property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineBorderWidth property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)\n      }\n    }\n\n  /**\n   * The lineColor property in Int\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  var lineColorInt: Int?\n    /**\n     * Get the lineColor property\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the lineColor property\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        jsonObject.addProperty(\n          PolylineAnnotationOptions.PROPERTY_LINE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      }\n    }\n\n  /**\n   * The lineColor property in String\n   *\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  var lineColorString: String?\n    /**\n     * Get the lineColor property\n     * @return color value for String\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the lineColor property\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param color value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_COLOR, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      }\n    }\n\n  /**\n   * The lineEmissiveStrength property\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   */\n  var lineEmissiveStrength: Double?\n    /**\n     * Get the lineEmissiveStrength property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineEmissiveStrength property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)\n      }\n    }\n\n  /**\n   * The lineGapWidth property\n   *\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   */\n  var lineGapWidth: Double?\n    /**\n     * Get the lineGapWidth property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineGapWidth property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)\n      }\n    }\n\n  /**\n   * The lineOffset property\n   *\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   */\n  var lineOffset: Double?\n    /**\n     * Get the lineOffset property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineOffset property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)\n      }\n    }\n\n  /**\n   * The lineOpacity property\n   *\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var lineOpacity: Double?\n    /**\n     * Get the lineOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineOpacity property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)\n      }\n    }\n\n  /**\n   * The linePattern property\n   *\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  var linePattern: String?\n    /**\n     * Get the linePattern property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the linePattern property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)\n      }\n    }\n\n  /**\n   * The lineWidth property\n   *\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   */\n  var lineWidth: Double?\n    /**\n     * Get the lineWidth property\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineWidth property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)\n      }\n    }\n\n  /**\n   * The lineBorderColorUseTheme property\n   *\n   * This property defines whether the `lineBorderColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var lineBorderColorUseTheme: String?\n    /**\n     * Get the lineBorderColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the lineBorderColorUseTheme property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * The lineColorUseTheme property\n   *\n   * This property defines whether the `lineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var lineColorUseTheme: String?\n    /**\n     * Get the lineColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the lineColorUseTheme property\n     *\n     * To update the polylineAnnotation on the map use {@link polylineAnnotationManager#update(Annotation)}.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        jsonObject.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME, value)\n      } else {\n        jsonObject.remove(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)\n      }\n    }\n\n  /**\n   * Get the offset geometry for the touch point\n   */\n  override fun getOffsetGeometry(\n    mapCameraManagerDelegate: MapCameraManagerDelegate,\n    moveDistancesObject: MoveDistancesObject\n  ): LineString? {\n    val points = geometry.coordinates()\n    if (points.isEmpty()) return null\n\n    val centerPoint = Point.fromLngLat(points.map { it.longitude() }.average(), points.map { it.latitude() }.average())\n    val centerScreenCoordinate = mapCameraManagerDelegate.pixelForCoordinate(centerPoint)\n    val targetPoint = mapCameraManagerDelegate.coordinateForPixel(\n      ScreenCoordinate(\n        centerScreenCoordinate.x - moveDistancesObject.distanceXSinceLast,\n        centerScreenCoordinate.y - moveDistancesObject.distanceYSinceLast\n      )\n    )\n\n    val shiftMercatorCoordinate = ConvertUtils.calculateMercatorCoordinateShift(centerPoint, targetPoint, mapCameraManagerDelegate.cameraState.zoom)\n    val targetPoints =\n      points.map { ConvertUtils.shiftPointWithMercatorCoordinate(it, shiftMercatorCoordinate, mapCameraManagerDelegate.cameraState.zoom) }\n    if (targetPoints.any { it.latitude() > MAX_MERCATOR_LATITUDE || it.latitude() < MIN_MERCATOR_LATITUDE }) {\n      return null\n    }\n    return LineString.fromLngLats(targetPoints)\n  }\n\n  /**\n   * Set the used data-driven properties\n   */\n  override fun setUsedDataDrivenProperties() {\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)\n    }\n    jsonObject.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)?.let {\n      annotationManager.enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /** the Id key for annotation */\n    const val ID_KEY: String = \"PolylineAnnotation\"\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/PolylineAnnotationManager.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport androidx.annotation.ColorInt\nimport com.mapbox.geojson.*\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.StyleManager\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.expressions.generated.Expression.Companion.get\nimport com.mapbox.maps.extension.style.layers.generated.LineLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.extension.style.utils.TypeUtils\nimport com.mapbox.maps.plugin.annotation.AnnotationConfig\nimport com.mapbox.maps.plugin.annotation.AnnotationManagerImpl\nimport com.mapbox.maps.plugin.annotation.AnnotationPlugin\nimport com.mapbox.maps.plugin.annotation.AnnotationType\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport java.util.Locale\nimport java.util.concurrent.atomic.AtomicLong\n\n/**\n * The polylineAnnotation manager allows to add polylineAnnotations to a map.\n */\nclass PolylineAnnotationManager(\n  delegateProvider: MapDelegateProvider,\n  annotationConfig: AnnotationConfig? = null\n) :\n  AnnotationManagerImpl<LineString, PolylineAnnotation, PolylineAnnotationOptions, OnPolylineAnnotationDragListener, OnPolylineAnnotationClickListener, OnPolylineAnnotationLongClickListener, OnPolylineAnnotationInteractionListener, LineLayer>(\n    delegateProvider, annotationConfig, ID_GENERATOR.incrementAndGet(), \"polylineAnnotation\", ::LineLayer\n  ) {\n\n  @OptIn(MapboxExperimental::class)\n  override fun setDataDrivenPropertyIsUsed(property: String) {\n    when (property) {\n      PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE -> {\n        layer.lineElevationGroundScale(get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE))\n        dragLayer.lineElevationGroundScale(get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_JOIN -> {\n        layer.lineJoin(get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN))\n        dragLayer.lineJoin(get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY -> {\n        layer.lineSortKey(get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY))\n        dragLayer.lineSortKey(get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET -> {\n        layer.lineZOffset(get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET))\n        dragLayer.lineZOffset(get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_BLUR -> {\n        layer.lineBlur(get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR))\n        dragLayer.lineBlur(get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR -> {\n        layer.lineBorderColor(get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR))\n        dragLayer.lineBorderColor(get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH -> {\n        layer.lineBorderWidth(get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH))\n        dragLayer.lineBorderWidth(get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_COLOR -> {\n        layer.lineColor(get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR))\n        dragLayer.lineColor(get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH -> {\n        layer.lineEmissiveStrength(get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH))\n        dragLayer.lineEmissiveStrength(get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH -> {\n        layer.lineGapWidth(get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH))\n        dragLayer.lineGapWidth(get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_OFFSET -> {\n        layer.lineOffset(get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET))\n        dragLayer.lineOffset(get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_OPACITY -> {\n        layer.lineOpacity(get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY))\n        dragLayer.lineOpacity(get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_PATTERN -> {\n        layer.linePattern(get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN))\n        dragLayer.linePattern(get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_WIDTH -> {\n        layer.lineWidth(get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH))\n        dragLayer.lineWidth(get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME -> {\n        layer.lineBorderColorUseTheme(get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME))\n        dragLayer.lineBorderColorUseTheme(get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME))\n      }\n      PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME -> {\n        layer.lineColorUseTheme(get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME))\n        dragLayer.lineColorUseTheme(get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME))\n      }\n    }\n  }\n\n  /**\n   * Create a list of polylineAnnotations on the map.\n   *\n   * PolylineAnnotations are going to be created only for features with a matching geometry.\n   *\n   * All supported properties are:\n   * PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_JOIN - LineJoin\n   * PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_BLUR - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR - String\n   * PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_COLOR - String\n   * PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_OFFSET - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_OPACITY - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_PATTERN - String\n   * PolylineAnnotationOptions.PROPERTY_LINE_WIDTH - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME - String\n   * PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME - String\n   * Learn more about above properties in the )[The online documentation](https://docs.mapbox.com/style-spec/).\n   *\n   * Out of spec properties:\n   * \"is-draggable\" - Boolean, true if the polylineAnnotation should be draggable, false otherwise\n   *\n   * @param json the GeoJSON defining the list of polylineAnnotations to build\n   * @return the list of built polylineAnnotations\n   */\n  fun create(json: String): List<PolylineAnnotation> {\n    return create(FeatureCollection.fromJson(json))\n  }\n\n  /**\n   * Create a list of polylineAnnotations on the map.\n   *\n   * PolylineAnnotations are going to be created only for features with a matching geometry.\n   *\n   * All supported properties are:\n   * PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_JOIN - LineJoin\n   * PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_BLUR - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR - String\n   * PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_COLOR - String\n   * PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_OFFSET - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_OPACITY - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_PATTERN - String\n   * PolylineAnnotationOptions.PROPERTY_LINE_WIDTH - Double\n   * PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME - String\n   * PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME - String\n   * Learn more about above properties in the )[The online documentation](https://docs.mapbox.com/style-spec/).\n   *\n   * Out of spec properties:\n   * \"is-draggable\" - Boolean, true if the polylineAnnotation should be draggable, false otherwise\n   *\n   * @param featureCollection the featureCollection defining the list of polylineAnnotations to build\n   * @return the list of built polylineAnnotations\n   */\n  fun create(featureCollection: FeatureCollection): List<PolylineAnnotation> {\n    featureCollection.features()?.let { features ->\n      val options = features.mapNotNull {\n        PolylineAnnotationOptions.fromFeature(it)\n      }\n      return create(options)\n    }\n    return listOf()\n  }\n\n  /**\n   * Get the key of the id of the annotation.\n   *\n   * @return the key of the id of the annotation\n   */\n  override fun getAnnotationIdKey(): String {\n    return PolylineAnnotation.ID_KEY\n  }\n\n  // Property accessors\n  /**\n   * The LineTrimColor property\n   *\n   * The color to be used for rendering the trimmed line section that is defined by the {@link PropertyFactory#lineTrimOffset} property.\n   */\n  @MapboxExperimental\n  @Deprecated(\n    \"This property is deprecated, and will be removed in next major release. Use [lineTrimColorString] property instead.\",\n    replaceWith = ReplaceWith(\"lineTrimColorString\")\n  )\n  var lineTrimColor: String?\n    /**\n     * Get the lineTrimColor property.\n     * @return color value for String\n     */\n    get() {\n      return lineTrimColorString\n    }\n    /**\n     * Set the lineTrimColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      lineTrimColorString = value\n    }\n\n  /**\n   * The LineCap property\n   *\n   * The display of line endings. Default value: \"butt\".\n   */\n  var lineCap: LineCap?\n    /**\n     * Get the LineCap property\n     *\n     * @return property wrapper value around LineCap\n     */\n    get(): LineCap? {\n      return layer.lineCap\n    }\n    /**\n     * Set the LineCap property\n     * @param value property wrapper value around LineCap\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cap\").value\n      }\n      setLayerProperty(wrappedValue, \"line-cap\")\n    }\n\n  /**\n   * The LineCrossSlope property\n   *\n   * Defines the slope of an elevated line. A value of 0 creates a horizontal line. A value of 1 creates a vertical line. Other values are currently not supported. If undefined, the line follows the terrain slope. This is an experimental property with some known issues:  - Vertical lines don't support line caps  - `line-join: round` is not supported with this property\n   */\n  @MapboxExperimental\n  var lineCrossSlope: Double?\n    /**\n     * Get the LineCrossSlope property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.lineCrossSlope\n    }\n    /**\n     * Set the LineCrossSlope property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cross-slope\").value\n      }\n      setLayerProperty(wrappedValue, \"line-cross-slope\")\n    }\n\n  /**\n   * The default lineElevationGroundScale for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   */\n  var lineElevationGroundScale: Double?\n    /**\n     * Get the lineElevationGroundScale property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineElevationGroundScale property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The LineElevationReference property\n   *\n   * Selects the base of line-elevation. Some modes might require precomputed elevation data in the tileset. Default value: \"none\".\n   */\n  var lineElevationReference: LineElevationReference?\n    /**\n     * Get the LineElevationReference property\n     *\n     * @return property wrapper value around LineElevationReference\n     */\n    get(): LineElevationReference? {\n      return layer.lineElevationReference\n    }\n    /**\n     * Set the LineElevationReference property\n     * @param value property wrapper value around LineElevationReference\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-elevation-reference\").value\n      }\n      setLayerProperty(wrappedValue, \"line-elevation-reference\")\n    }\n\n  /**\n   * The default lineJoin for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The display of lines when joining. Default value: \"miter\".\n   */\n  var lineJoin: LineJoin?\n    /**\n     * Get the lineJoin property.\n     *\n     * @return property wrapper value around LineJoin\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)\n      value?.let {\n        return LineJoin.valueOf(it.asString.uppercase(Locale.US))\n      }\n      return null\n    }\n    /**\n     * Set the lineJoin property.\n     *\n     * @param value constant property value for LineJoin\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_JOIN, value.value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The LineMiterLimit property\n   *\n   * Used to automatically convert miter joins to bevel joins for sharp angles. Default value: 2.\n   */\n  var lineMiterLimit: Double?\n    /**\n     * Get the LineMiterLimit property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.lineMiterLimit\n    }\n    /**\n     * Set the LineMiterLimit property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-miter-limit\").value\n      }\n      setLayerProperty(wrappedValue, \"line-miter-limit\")\n    }\n\n  /**\n   * The LineRoundLimit property\n   *\n   * Used to automatically convert round joins to miter joins for shallow angles. Default value: 1.05.\n   */\n  var lineRoundLimit: Double?\n    /**\n     * Get the LineRoundLimit property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.lineRoundLimit\n    }\n    /**\n     * Set the LineRoundLimit property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-round-limit\").value\n      }\n      setLayerProperty(wrappedValue, \"line-round-limit\")\n    }\n\n  /**\n   * The default lineSortKey for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  var lineSortKey: Double?\n    /**\n     * Get the lineSortKey property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineSortKey property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The LineWidthUnit property\n   *\n   * Selects the unit of line-width. The same unit is automatically used for line-blur and line-offset. Note: This is an experimental property and might be removed in a future release. Default value: \"pixels\".\n   */\n  @MapboxExperimental\n  var lineWidthUnit: LineWidthUnit?\n    /**\n     * Get the LineWidthUnit property\n     *\n     * @return property wrapper value around LineWidthUnit\n     */\n    get(): LineWidthUnit? {\n      return layer.lineWidthUnit\n    }\n    /**\n     * Set the LineWidthUnit property\n     * @param value property wrapper value around LineWidthUnit\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-width-unit\").value\n      }\n      setLayerProperty(wrappedValue, \"line-width-unit\")\n    }\n\n  /**\n   * The default lineZOffset for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   */\n  var lineZOffset: Double?\n    /**\n     * Get the lineZOffset property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineZOffset property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default lineBlur for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   */\n  var lineBlur: Double?\n    /**\n     * Get the lineBlur property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineBlur property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_BLUR, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default lineBorderColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var lineBorderColorInt: Int?\n    /**\n     * Get the lineBorderColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the lineBorderColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default lineBorderColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var lineBorderColorString: String?\n    /**\n     * Get the lineBorderColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the lineBorderColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default lineBorderWidth for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   */\n  var lineBorderWidth: Double?\n    /**\n     * Get the lineBorderWidth property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineBorderWidth property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default lineColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color int.\n   *\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  var lineColorInt: Int?\n    /**\n     * Get the lineColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      value?.let {\n        ColorUtils.rgbaToColor(it.asString)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the lineColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(\n          PolylineAnnotationOptions.PROPERTY_LINE_COLOR, ColorUtils.colorToRgbaString(value)\n        )\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default lineColor for all annotations added to this annotation manager if not overwritten by individual annotation settings in color string.\n   *\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  var lineColorString: String?\n    /**\n     * Get the lineColor property.\n     * @return color value for String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the lineColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_COLOR, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The LineCutoutFadeWidth property\n   *\n   * The width of the cutout fade effect as a proportion of the cutout width. Default value: 0.4. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  var lineCutoutFadeWidth: Double?\n    /**\n     * Get the LineCutoutFadeWidth property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.lineCutoutFadeWidth\n    }\n    /**\n     * Set the LineCutoutFadeWidth property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-fade-width\").value\n      }\n      setLayerProperty(wrappedValue, \"line-cutout-fade-width\")\n    }\n\n  /**\n   * The LineCutoutOpacity property\n   *\n   * The opacity of the aboveground objects affected by the line cutout. Cutout for tunnels isn't affected by this property, If set to 0, the cutout is fully transparent. Cutout opacity should have the same value for all layers that specify it. If all layers don't have the same value, it is not specified which value is used. Default value: 1. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  var lineCutoutOpacity: Double?\n    /**\n     * Get the LineCutoutOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.lineCutoutOpacity\n    }\n    /**\n     * Set the LineCutoutOpacity property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-cutout-opacity\").value\n      }\n      setLayerProperty(wrappedValue, \"line-cutout-opacity\")\n    }\n\n  /**\n   * The LineDasharray property\n   *\n   * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width. Note that GeoJSON sources with `lineMetrics: true` specified won't render dashed lines to the expected scale. Also note that zoom-dependent expressions will be evaluated only at integer zoom levels. Minimum value: 0. The unit of lineDasharray is in line widths.\n   */\n  var lineDasharray: List<Double>?\n    /**\n     * Get the LineDasharray property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.lineDasharray\n    }\n    /**\n     * Set the LineDasharray property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-dasharray\").value\n      }\n      setLayerProperty(wrappedValue, \"line-dasharray\")\n    }\n\n  /**\n   * The LineDepthOcclusionFactor property\n   *\n   * This property is deprecated and replaced by line-occlusion-opacity. Value 0 disables occlusion, value 1 means fully occluded. Note: line-occlusion-opacity has the opposite effect - value 1 disables occlusion, value 0 means fully occluded. Default value: 1. Value range: [0, 1]\n   */\n  var lineDepthOcclusionFactor: Double?\n    /**\n     * Get the LineDepthOcclusionFactor property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.lineDepthOcclusionFactor\n    }\n    /**\n     * Set the LineDepthOcclusionFactor property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-depth-occlusion-factor\").value\n      }\n      setLayerProperty(wrappedValue, \"line-depth-occlusion-factor\")\n    }\n\n  /**\n   * The default lineEmissiveStrength for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   */\n  var lineEmissiveStrength: Double?\n    /**\n     * Get the lineEmissiveStrength property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineEmissiveStrength property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default lineGapWidth for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   */\n  var lineGapWidth: Double?\n    /**\n     * Get the lineGapWidth property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineGapWidth property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The LineOcclusionOpacity property\n   *\n   * Opacity multiplier (multiplies line-opacity value) of the line part that is occluded by 3D objects. Value 0 hides occluded part, value 1 means the same opacity as non-occluded part. The property is not supported when `line-opacity` has data-driven styling. Default value: 0. Value range: [0, 1]\n   */\n  var lineOcclusionOpacity: Double?\n    /**\n     * Get the LineOcclusionOpacity property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.lineOcclusionOpacity\n    }\n    /**\n     * Set the LineOcclusionOpacity property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-occlusion-opacity\").value\n      }\n      setLayerProperty(wrappedValue, \"line-occlusion-opacity\")\n    }\n\n  /**\n   * The default lineOffset for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   */\n  var lineOffset: Double?\n    /**\n     * Get the lineOffset property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineOffset property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default lineOpacity for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var lineOpacity: Double?\n    /**\n     * Get the lineOpacity property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineOpacity property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default linePattern for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  var linePattern: String?\n    /**\n     * Get the linePattern property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the linePattern property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The LinePatternCrossFade property\n   *\n   * Controls the transition progress between the image variants of line-pattern. Zero means the first variant is used, one is the second, and in between they are blended together. Both images should be the same size and have the same type (either raster or vector). Default value: 0. Value range: [0, 1]\n   */\n  var linePatternCrossFade: Double?\n    /**\n     * Get the LinePatternCrossFade property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.linePatternCrossFade\n    }\n    /**\n     * Set the LinePatternCrossFade property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-pattern-cross-fade\").value\n      }\n      setLayerProperty(wrappedValue, \"line-pattern-cross-fade\")\n    }\n\n  /**\n   * The LineTranslate property\n   *\n   * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. Default value: [0,0]. The unit of lineTranslate is in pixels.\n   */\n  var lineTranslate: List<Double>?\n    /**\n     * Get the LineTranslate property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.lineTranslate\n    }\n    /**\n     * Set the LineTranslate property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate\").value\n      }\n      setLayerProperty(wrappedValue, \"line-translate\")\n    }\n\n  /**\n   * The LineTranslateAnchor property\n   *\n   * Controls the frame of reference for `line-translate`. Default value: \"map\".\n   */\n  var lineTranslateAnchor: LineTranslateAnchor?\n    /**\n     * Get the LineTranslateAnchor property\n     *\n     * @return property wrapper value around LineTranslateAnchor\n     */\n    get(): LineTranslateAnchor? {\n      return layer.lineTranslateAnchor\n    }\n    /**\n     * Set the LineTranslateAnchor property\n     * @param value property wrapper value around LineTranslateAnchor\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-translate-anchor\").value\n      }\n      setLayerProperty(wrappedValue, \"line-translate-anchor\")\n    }\n\n  /**\n   * The LineTrimColor property\n   *\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   */\n  @MapboxExperimental\n  var lineTrimColorInt: Int?\n    /**\n     * Get the lineTrimColor property.\n     * @return color value for String\n     */\n    @ColorInt\n    get() {\n      val value = layer.lineTrimColor\n      value?.let {\n        ColorUtils.rgbaToColor(it)?.let {\n          return it\n        }\n      }\n      return null\n    }\n    /**\n     * Set the lineTrimColor property.\n     *\n     * @param value color value for String\n     */\n    set(@ColorInt value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(ColorUtils.colorToRgbaString(value))\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color\").value\n      }\n      setLayerProperty(wrappedValue, \"line-trim-color\")\n    }\n\n  /**\n   * Get the LineTrimColor property\n   *\n   * The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property. Default value: \"transparent\".\n   */\n  @MapboxExperimental\n  var lineTrimColorString: String?\n    /**\n     * Get the lineTrimColor property.\n     * @return color value for String\n     */\n    get() {\n      return layer.lineTrimColor\n    }\n    /**\n     * Set the lineTrimColor property.\n     *\n     * @param value color value for String\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color\").value\n      }\n      setLayerProperty(wrappedValue, \"line-trim-color\")\n    }\n\n  /**\n   * The LineTrimFadeRange property\n   *\n   * The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   */\n  @MapboxExperimental\n  var lineTrimFadeRange: List<Double>?\n    /**\n     * Get the LineTrimFadeRange property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.lineTrimFadeRange\n    }\n    /**\n     * Set the LineTrimFadeRange property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-fade-range\").value\n      }\n      setLayerProperty(wrappedValue, \"line-trim-fade-range\")\n    }\n\n  /**\n   * The LineTrimOffset property\n   *\n   * The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0]. Default value: [0,0]. Minimum value: [0,0]. Maximum value: [1,1].\n   */\n  var lineTrimOffset: List<Double>?\n    /**\n     * Get the LineTrimOffset property\n     *\n     * @return property wrapper value around List<Double>\n     */\n    get(): List<Double>? {\n      return layer.lineTrimOffset\n    }\n    /**\n     * Set the LineTrimOffset property\n     * @param value property wrapper value around List<Double>\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-offset\").value\n      }\n      setLayerProperty(wrappedValue, \"line-trim-offset\")\n    }\n\n  /**\n   * The default lineWidth for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   */\n  var lineWidth: Double?\n    /**\n     * Get the lineWidth property.\n     *\n     * @return property wrapper value around Double\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)\n      value?.let {\n        return it.asString.toDouble()\n      }\n      return null\n    }\n    /**\n     * Set the lineWidth property.\n     *\n     * @param value constant property value for Double\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The Slot property\n   *\n   * The slot this layer is assigned to. If specified, and a slot with that name exists, it will be placed at that position in the layer order.\n   */\n  var slot: String?\n    /**\n     * Get the Slot property\n     *\n     * @return property wrapper value around String\n     */\n    get(): String? {\n      return layer.slot\n    }\n    /**\n     * Set the Slot property\n     * @param value property wrapper value around String\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"slot\").value\n      }\n      setLayerProperty(wrappedValue, \"slot\")\n    }\n\n  /**\n   * The MaxZoom property\n   *\n   * The maximum zoom level for the layer. At zoom levels equal to or greater than the maxzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  var maxZoom: Double?\n    /**\n     * Get the MaxZoom property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.maxZoom\n    }\n    /**\n     * Set the MaxZoom property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"maxzoom\").value\n      }\n      setLayerProperty(wrappedValue, \"maxzoom\")\n    }\n\n  /**\n   * The MinZoom property\n   *\n   * The minimum zoom level for the layer. At zoom levels less than the minzoom, the layer will be hidden. Value range: [0, 24]\n   */\n  var minZoom: Double?\n    /**\n     * Get the MinZoom property\n     *\n     * @return property wrapper value around Double\n     */\n    get(): Double? {\n      return layer.minZoom\n    }\n    /**\n     * Set the MinZoom property\n     * @param value property wrapper value around Double\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"minzoom\").value\n      }\n      setLayerProperty(wrappedValue, \"minzoom\")\n    }\n\n  /**\n   * The default lineBorderColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `lineBorderColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var lineBorderColorUseTheme: String?\n    /**\n     * Get the lineBorderColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the lineBorderColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The default lineColorUseTheme for all annotations added to this annotation manager if not overwritten by individual annotation settings.\n   *\n   * This property defines whether the `lineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var lineColorUseTheme: String?\n    /**\n     * Get the lineColorUseTheme property.\n     *\n     * @return property wrapper value around String\n     */\n    get() {\n      val value = dataDrivenPropertyDefaultValues.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)\n      value?.let {\n        return it.asString.toString()\n      }\n      return null\n    }\n    /**\n     * Set the lineColorUseTheme property.\n     *\n     * @param value constant property value for String\n     */\n    set(value) {\n      if (value != null) {\n        dataDrivenPropertyDefaultValues.addProperty(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME, value)\n        enableDataDrivenProperty(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)\n      } else {\n        dataDrivenPropertyDefaultValues.remove(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)\n      }\n      // Update child annotation property if not being set.\n      update(annotations)\n    }\n\n  /**\n   * The LineGradientUseTheme property\n   *\n   * This property defines whether the `lineGradient` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var lineGradientUseTheme: String?\n    /**\n     * Get the LineGradientUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get(): String? {\n      return layer.lineGradientUseTheme\n    }\n    /**\n     * Set the LineGradientUseTheme property\n     * @param value property wrapper value around String\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-gradient-use-theme\").value\n      }\n      setLayerProperty(wrappedValue, \"line-gradient-use-theme\")\n    }\n\n  /**\n   * The LineTrimColorUseTheme property\n   *\n   * This property defines whether the `lineTrimColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var lineTrimColorUseTheme: String?\n    /**\n     * Get the LineTrimColorUseTheme property\n     *\n     * @return property wrapper value around String\n     */\n    get(): String? {\n      return layer.lineTrimColorUseTheme\n    }\n    /**\n     * Set the LineTrimColorUseTheme property\n     * @param value property wrapper value around String\n     */\n    set(value) {\n      val wrappedValue = if (value != null) {\n        TypeUtils.wrapToValue(value)\n      } else {\n        StyleManager.getStyleLayerPropertyDefaultValue(\"line\", \"line-trim-color-use-theme\").value\n      }\n      setLayerProperty(wrappedValue, \"line-trim-color-use-theme\")\n    }\n\n  /**\n   * The filter on the managed polylineAnnotations.\n   */\n  override var layerFilter: Expression?\n    /**\n     * Get filter of the managed polylineAnnotations.\n     *\n     * @return expression\n     */\n    get() = layer.filter\n    /**\n     * Set filter on the managed polylineAnnotations.\n     *\n     * @param value expression\n     */\n    set(value) {\n      value?.let {\n        layer.filter(it)\n        dragLayer.filter(it)\n      }\n    }\n\n  init {\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_JOIN] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_BLUR] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_COLOR] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_OFFSET] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_OPACITY] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_PATTERN] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_WIDTH] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME] = false\n    dataDrivenPropertyUsageMap[PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME] = false\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /** The generator for id */\n    var ID_GENERATOR = AtomicLong(0)\n  }\n}\n\n/**\n * Extension function to create a PolylineAnnotationManager instance.\n */\nfun AnnotationPlugin.createPolylineAnnotationManager(\n  annotationConfig: AnnotationConfig? = null\n): PolylineAnnotationManager {\n  return createAnnotationManager(AnnotationType.PolylineAnnotation, annotationConfig) as PolylineAnnotationManager\n}"
  },
  {
    "path": "plugin-annotation/src/main/java/com/mapbox/maps/plugin/annotation/generated/PolylineAnnotationOptions.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport androidx.annotation.ColorInt\nimport com.google.gson.JsonElement\nimport com.google.gson.JsonObject\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxAnnotationException\nimport com.mapbox.maps.extension.style.layers.properties.generated.LineJoin\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.plugin.annotation.AnnotationManager\nimport com.mapbox.maps.plugin.annotation.AnnotationOptions\n\n/**\n * Builder class from which a polylineAnnotation is created.\n */\nclass PolylineAnnotationOptions : AnnotationOptions<LineString, PolylineAnnotation> {\n  private var isDraggable: Boolean = false\n  private var data: JsonElement? = null\n  private var geometry: LineString? = null\n\n  /**\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   */\n  var lineElevationGroundScale: Double? = null\n\n  /**\n   * Set line-elevation-ground-scale to initialise the polylineAnnotation with.\n   *\n   * Controls how much the elevation of lines with `line-elevation-reference` set to `sea` scales with terrain exaggeration. A value of 0 keeps the line at a fixed altitude above sea level. A value of 1 scales the elevation proportionally with terrain exaggeration. Default value: 0. Value range: [0, 1]\n   *\n   * @param lineElevationGroundScale the line-elevation-ground-scale value\n   * @return this\n   */\n  fun withLineElevationGroundScale(lineElevationGroundScale: Double): PolylineAnnotationOptions {\n    this.lineElevationGroundScale = lineElevationGroundScale\n    return this\n  }\n\n  /**\n   * The display of lines when joining. Default value: \"miter\".\n   */\n  var lineJoin: LineJoin? = null\n\n  /**\n   * Set line-join to initialise the polylineAnnotation with.\n   *\n   * The display of lines when joining. Default value: \"miter\".\n   *\n   * @param lineJoin the line-join value\n   * @return this\n   */\n  fun withLineJoin(lineJoin: LineJoin): PolylineAnnotationOptions {\n    this.lineJoin = lineJoin\n    return this\n  }\n\n  /**\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   */\n  var lineSortKey: Double? = null\n\n  /**\n   * Set line-sort-key to initialise the polylineAnnotation with.\n   *\n   * Sorts features in ascending order based on this value. Features with a higher sort key will appear above features with a lower sort key.\n   *\n   * @param lineSortKey the line-sort-key value\n   * @return this\n   */\n  fun withLineSortKey(lineSortKey: Double): PolylineAnnotationOptions {\n    this.lineSortKey = lineSortKey\n    return this\n  }\n\n  /**\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   */\n  var lineZOffset: Double? = null\n\n  /**\n   * Set line-z-offset to initialise the polylineAnnotation with.\n   *\n   * Vertical offset from ground, in meters. Not supported for globe projection at the moment. Default value: 0.\n   *\n   * @param lineZOffset the line-z-offset value\n   * @return this\n   */\n  fun withLineZOffset(lineZOffset: Double): PolylineAnnotationOptions {\n    this.lineZOffset = lineZOffset\n    return this\n  }\n\n  /**\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   */\n  var lineBlur: Double? = null\n\n  /**\n   * Set line-blur to initialise the polylineAnnotation with.\n   *\n   * Blur applied to the line, in pixels. Default value: 0. Minimum value: 0. The unit of lineBlur is in pixels.\n   *\n   * @param lineBlur the line-blur value\n   * @return this\n   */\n  fun withLineBlur(lineBlur: Double): PolylineAnnotationOptions {\n    this.lineBlur = lineBlur\n    return this\n  }\n\n  /**\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   */\n  var lineBorderColor: String? = null\n\n  /**\n   * Set line-border-color to initialise the polylineAnnotation with.\n   *\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param lineBorderColor the line-border-color value\n   * @return this\n   */\n  fun withLineBorderColor(lineBorderColor: String): PolylineAnnotationOptions {\n    this.lineBorderColor = lineBorderColor\n    return this\n  }\n\n  /**\n   * Set line-border-color to initialise the polylineAnnotation with.\n   *\n   * The color of the line border. If line-border-width is greater than zero and the alpha value of this color is 0 (default), the color for the border will be selected automatically based on the line color. Default value: \"rgba(0, 0, 0, 0)\".\n   *\n   * @param lineBorderColor the line-border-color value with ColorInt format\n   * @return this\n   */\n  fun withLineBorderColor(@ColorInt lineBorderColor: Int): PolylineAnnotationOptions {\n    this.lineBorderColor = ColorUtils.colorToRgbaString(lineBorderColor)\n    return this\n  }\n\n  /**\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   */\n  var lineBorderWidth: Double? = null\n\n  /**\n   * Set line-border-width to initialise the polylineAnnotation with.\n   *\n   * The width of the line border. A value of zero means no border. Default value: 0. Minimum value: 0.\n   *\n   * @param lineBorderWidth the line-border-width value\n   * @return this\n   */\n  fun withLineBorderWidth(lineBorderWidth: Double): PolylineAnnotationOptions {\n    this.lineBorderWidth = lineBorderWidth\n    return this\n  }\n\n  /**\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   */\n  var lineColor: String? = null\n\n  /**\n   * Set line-color to initialise the polylineAnnotation with.\n   *\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * @param lineColor the line-color value\n   * @return this\n   */\n  fun withLineColor(lineColor: String): PolylineAnnotationOptions {\n    this.lineColor = lineColor\n    return this\n  }\n\n  /**\n   * Set line-color to initialise the polylineAnnotation with.\n   *\n   * The color with which the line will be drawn. Default value: \"#000000\".\n   *\n   * @param lineColor the line-color value with ColorInt format\n   * @return this\n   */\n  fun withLineColor(@ColorInt lineColor: Int): PolylineAnnotationOptions {\n    this.lineColor = ColorUtils.colorToRgbaString(lineColor)\n    return this\n  }\n\n  /**\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   */\n  var lineEmissiveStrength: Double? = null\n\n  /**\n   * Set line-emissive-strength to initialise the polylineAnnotation with.\n   *\n   * Controls the intensity of light emitted on the source features. Default value: 0. Minimum value: 0. The unit of lineEmissiveStrength is in intensity.\n   *\n   * @param lineEmissiveStrength the line-emissive-strength value\n   * @return this\n   */\n  fun withLineEmissiveStrength(lineEmissiveStrength: Double): PolylineAnnotationOptions {\n    this.lineEmissiveStrength = lineEmissiveStrength\n    return this\n  }\n\n  /**\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   */\n  var lineGapWidth: Double? = null\n\n  /**\n   * Set line-gap-width to initialise the polylineAnnotation with.\n   *\n   * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. Default value: 0. Minimum value: 0. The unit of lineGapWidth is in pixels.\n   *\n   * @param lineGapWidth the line-gap-width value\n   * @return this\n   */\n  fun withLineGapWidth(lineGapWidth: Double): PolylineAnnotationOptions {\n    this.lineGapWidth = lineGapWidth\n    return this\n  }\n\n  /**\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   */\n  var lineOffset: Double? = null\n\n  /**\n   * Set line-offset to initialise the polylineAnnotation with.\n   *\n   * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. Default value: 0. The unit of lineOffset is in pixels.\n   *\n   * @param lineOffset the line-offset value\n   * @return this\n   */\n  fun withLineOffset(lineOffset: Double): PolylineAnnotationOptions {\n    this.lineOffset = lineOffset\n    return this\n  }\n\n  /**\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   */\n  var lineOpacity: Double? = null\n\n  /**\n   * Set line-opacity to initialise the polylineAnnotation with.\n   *\n   * The opacity at which the line will be drawn. Default value: 1. Value range: [0, 1]\n   *\n   * @param lineOpacity the line-opacity value\n   * @return this\n   */\n  fun withLineOpacity(lineOpacity: Double): PolylineAnnotationOptions {\n    this.lineOpacity = lineOpacity\n    return this\n  }\n\n  /**\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   */\n  var linePattern: String? = null\n\n  /**\n   * Set line-pattern to initialise the polylineAnnotation with.\n   *\n   * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). Note that zoom-dependent expressions will be evaluated only at integer zoom levels.\n   *\n   * @param linePattern the line-pattern value\n   * @return this\n   */\n  fun withLinePattern(linePattern: String): PolylineAnnotationOptions {\n    this.linePattern = linePattern\n    return this\n  }\n\n  /**\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   */\n  var lineWidth: Double? = null\n\n  /**\n   * Set line-width to initialise the polylineAnnotation with.\n   *\n   * Stroke thickness. Default value: 1. Minimum value: 0. The unit of lineWidth is in pixels.\n   *\n   * @param lineWidth the line-width value\n   * @return this\n   */\n  fun withLineWidth(lineWidth: Double): PolylineAnnotationOptions {\n    this.lineWidth = lineWidth\n    return this\n  }\n\n  /**\n   * This property defines whether the `lineBorderColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var lineBorderColorUseTheme: String? = null\n\n  /**\n   * Set line-border-color-use-theme to initialise the polylineAnnotation with.\n   *\n   * This property defines whether the `lineBorderColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param lineBorderColorUseTheme the line-border-color-use-theme value\n   * @return this\n   */\n  fun withLineBorderColorUseTheme(lineBorderColorUseTheme: String): PolylineAnnotationOptions {\n    this.lineBorderColorUseTheme = lineBorderColorUseTheme\n    return this\n  }\n\n  /**\n   * This property defines whether the `lineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  var lineColorUseTheme: String? = null\n\n  /**\n   * Set line-color-use-theme to initialise the polylineAnnotation with.\n   *\n   * This property defines whether the `lineColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   *\n   * @param lineColorUseTheme the line-color-use-theme value\n   * @return this\n   */\n  fun withLineColorUseTheme(lineColorUseTheme: String): PolylineAnnotationOptions {\n    this.lineColorUseTheme = lineColorUseTheme\n    return this\n  }\n\n  /**\n   * Set a list of Point for the line, which represents the locations of the line on the map\n   *\n   * @param point a list of the locations of the line in a longitude and latitude pairs\n   * @return this\n   */\n  fun withPoints(points: List<Point>): PolylineAnnotationOptions {\n    geometry = LineString.fromLngLats(points)\n    return this\n  }\n\n  /**\n   * Get a list of Point for the line, which represents the locations of the line on the map\n   *\n   * @return a list of the locations of the line in a longitude and latitude pairs\n   */\n  fun getPoints(): List<Point> {\n    return geometry?.coordinates() as List<Point>\n  }\n\n  /**\n   * Set the geometry of the polylineAnnotation, which represents the location of the polylineAnnotation on the map\n   *\n   * @param geometry the location of the polylineAnnotation\n   * @return this\n   */\n  fun withGeometry(geometry: LineString): PolylineAnnotationOptions {\n    this.geometry = geometry\n    return this\n  }\n\n  /**\n   * Get the geometry of the polylineAnnotation, which represents the location of the polylineAnnotation on the map\n   *\n   * @return the location of the polylineAnnotation\n   */\n  fun getGeometry(): LineString? {\n    return geometry\n  }\n\n  /**\n   * Returns whether this polylineAnnotation is draggable, meaning it can be dragged across the screen when touched and moved.\n   *\n   * @return draggable when touched\n   */\n  fun getDraggable(): Boolean {\n    return isDraggable\n  }\n\n  /**\n   * Set whether this polylineAnnotation should be draggable,\n   * meaning it can be dragged across the screen when touched and moved.\n   *\n   * @param draggable should be draggable\n   */\n  fun withDraggable(draggable: Boolean): PolylineAnnotationOptions {\n    isDraggable = draggable\n    return this\n  }\n\n  /**\n   * Set the arbitrary json data of the annotation.\n   *\n   * @param jsonElement the arbitrary json element data\n   */\n  fun withData(jsonElement: JsonElement): PolylineAnnotationOptions {\n    this.data = jsonElement\n    return this\n  }\n\n  /**\n   * Get the arbitrary json data of the annotation.\n   *\n   * @return the arbitrary json object data if set, else null\n   */\n  fun getData(): JsonElement? {\n    return data\n  }\n\n  /**\n   * Build an annotation\n   *\n   * @param id: the id for this annotation\n   * @param annotationManager: the annotationManager that manage this annotation\n   *\n   * @return the annotation that is built\n   */\n  override fun build(\n    id: String,\n    annotationManager: AnnotationManager<LineString, PolylineAnnotation, *, *, *, *, *>\n  ): PolylineAnnotation {\n    if (geometry == null) {\n      throw MapboxAnnotationException(\"geometry field is required\")\n    }\n    val jsonObject = JsonObject()\n    lineElevationGroundScale?.let {\n      jsonObject.addProperty(PROPERTY_LINE_ELEVATION_GROUND_SCALE, it)\n    }\n    lineJoin?.let {\n      jsonObject.addProperty(PROPERTY_LINE_JOIN, it.value)\n    }\n    lineSortKey?.let {\n      jsonObject.addProperty(PROPERTY_LINE_SORT_KEY, it)\n    }\n    lineZOffset?.let {\n      jsonObject.addProperty(PROPERTY_LINE_Z_OFFSET, it)\n    }\n    lineBlur?.let {\n      jsonObject.addProperty(PROPERTY_LINE_BLUR, it)\n    }\n    lineBorderColor?.let {\n      jsonObject.addProperty(PROPERTY_LINE_BORDER_COLOR, it)\n    }\n    lineBorderWidth?.let {\n      jsonObject.addProperty(PROPERTY_LINE_BORDER_WIDTH, it)\n    }\n    lineColor?.let {\n      jsonObject.addProperty(PROPERTY_LINE_COLOR, it)\n    }\n    lineEmissiveStrength?.let {\n      jsonObject.addProperty(PROPERTY_LINE_EMISSIVE_STRENGTH, it)\n    }\n    lineGapWidth?.let {\n      jsonObject.addProperty(PROPERTY_LINE_GAP_WIDTH, it)\n    }\n    lineOffset?.let {\n      jsonObject.addProperty(PROPERTY_LINE_OFFSET, it)\n    }\n    lineOpacity?.let {\n      jsonObject.addProperty(PROPERTY_LINE_OPACITY, it)\n    }\n    linePattern?.let {\n      jsonObject.addProperty(PROPERTY_LINE_PATTERN, it)\n    }\n    lineWidth?.let {\n      jsonObject.addProperty(PROPERTY_LINE_WIDTH, it)\n    }\n    lineBorderColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_LINE_BORDER_COLOR_USE_THEME, it)\n    }\n    lineColorUseTheme?.let {\n      jsonObject.addProperty(PROPERTY_LINE_COLOR_USE_THEME, it)\n    }\n    val polylineAnnotation = PolylineAnnotation(id, annotationManager, jsonObject, geometry!!)\n    polylineAnnotation.isDraggable = isDraggable\n    polylineAnnotation.setData(data)\n    return polylineAnnotation\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /** The property for line-elevation-ground-scale */\n    const val PROPERTY_LINE_ELEVATION_GROUND_SCALE = \"line-elevation-ground-scale\"\n\n    /** The property for line-join */\n    const val PROPERTY_LINE_JOIN = \"line-join\"\n\n    /** The property for line-sort-key */\n    const val PROPERTY_LINE_SORT_KEY = \"line-sort-key\"\n\n    /** The property for line-z-offset */\n    const val PROPERTY_LINE_Z_OFFSET = \"line-z-offset\"\n\n    /** The property for line-blur */\n    const val PROPERTY_LINE_BLUR = \"line-blur\"\n\n    /** The property for line-border-color */\n    const val PROPERTY_LINE_BORDER_COLOR = \"line-border-color\"\n\n    /** The property for line-border-width */\n    const val PROPERTY_LINE_BORDER_WIDTH = \"line-border-width\"\n\n    /** The property for line-color */\n    const val PROPERTY_LINE_COLOR = \"line-color\"\n\n    /** The property for line-emissive-strength */\n    const val PROPERTY_LINE_EMISSIVE_STRENGTH = \"line-emissive-strength\"\n\n    /** The property for line-gap-width */\n    const val PROPERTY_LINE_GAP_WIDTH = \"line-gap-width\"\n\n    /** The property for line-offset */\n    const val PROPERTY_LINE_OFFSET = \"line-offset\"\n\n    /** The property for line-opacity */\n    const val PROPERTY_LINE_OPACITY = \"line-opacity\"\n\n    /** The property for line-pattern */\n    const val PROPERTY_LINE_PATTERN = \"line-pattern\"\n\n    /** The property for line-width */\n    const val PROPERTY_LINE_WIDTH = \"line-width\"\n\n    /** The property for line-border-color-use-theme */\n    const val PROPERTY_LINE_BORDER_COLOR_USE_THEME = \"line-border-color-use-theme\"\n\n    /** The property for line-color-use-theme */\n    const val PROPERTY_LINE_COLOR_USE_THEME = \"line-color-use-theme\"\n\n    /** The property for is-draggable */\n    private const val PROPERTY_IS_DRAGGABLE = \"is-draggable\"\n\n    /**\n     * Creates PolylineAnnotationOptions out of a Feature.\n     *\n     * @param feature feature to be converted\n     */\n    fun fromFeature(feature: Feature): PolylineAnnotationOptions? {\n      if (feature.geometry() == null) {\n        throw MapboxAnnotationException(\"geometry field is required\")\n      }\n      if (feature.geometry() !is LineString) {\n\n        return null\n      }\n\n      val options = PolylineAnnotationOptions()\n      options.geometry = feature.geometry() as (LineString)\n      if (feature.hasProperty(PROPERTY_LINE_ELEVATION_GROUND_SCALE)) {\n        options.lineElevationGroundScale = feature.getProperty(PROPERTY_LINE_ELEVATION_GROUND_SCALE).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_JOIN)) {\n        options.lineJoin = LineJoin.valueOf(feature.getProperty(PROPERTY_LINE_JOIN).asString)\n      }\n      if (feature.hasProperty(PROPERTY_LINE_SORT_KEY)) {\n        options.lineSortKey = feature.getProperty(PROPERTY_LINE_SORT_KEY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_Z_OFFSET)) {\n        options.lineZOffset = feature.getProperty(PROPERTY_LINE_Z_OFFSET).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_BLUR)) {\n        options.lineBlur = feature.getProperty(PROPERTY_LINE_BLUR).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_BORDER_COLOR)) {\n        options.lineBorderColor = feature.getProperty(PROPERTY_LINE_BORDER_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_LINE_BORDER_WIDTH)) {\n        options.lineBorderWidth = feature.getProperty(PROPERTY_LINE_BORDER_WIDTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_COLOR)) {\n        options.lineColor = feature.getProperty(PROPERTY_LINE_COLOR).asString\n      }\n      if (feature.hasProperty(PROPERTY_LINE_EMISSIVE_STRENGTH)) {\n        options.lineEmissiveStrength = feature.getProperty(PROPERTY_LINE_EMISSIVE_STRENGTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_GAP_WIDTH)) {\n        options.lineGapWidth = feature.getProperty(PROPERTY_LINE_GAP_WIDTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_OFFSET)) {\n        options.lineOffset = feature.getProperty(PROPERTY_LINE_OFFSET).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_OPACITY)) {\n        options.lineOpacity = feature.getProperty(PROPERTY_LINE_OPACITY).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_PATTERN)) {\n        options.linePattern = feature.getProperty(PROPERTY_LINE_PATTERN).asString\n      }\n      if (feature.hasProperty(PROPERTY_LINE_WIDTH)) {\n        options.lineWidth = feature.getProperty(PROPERTY_LINE_WIDTH).asDouble\n      }\n      if (feature.hasProperty(PROPERTY_LINE_BORDER_COLOR_USE_THEME)) {\n        options.lineBorderColorUseTheme = feature.getProperty(PROPERTY_LINE_BORDER_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_LINE_COLOR_USE_THEME)) {\n        options.lineColorUseTheme = feature.getProperty(PROPERTY_LINE_COLOR_USE_THEME).asString\n      }\n      if (feature.hasProperty(PROPERTY_IS_DRAGGABLE)) {\n        options.isDraggable = feature.getProperty(PROPERTY_IS_DRAGGABLE).asBoolean\n      }\n      return options\n    }\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/test/java/com/mapbox/maps/plugin/annotation/AnnotationPluginImplTest.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.layers.addLayer\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.annotation.generated.CircleAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolygonAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PolylineAnnotationManager\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.unmockkAll\nimport io.mockk.unmockkStatic\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass AnnotationPluginImplTest {\n  private val delegateProvider: MapDelegateProvider = mockk()\n  private val style: MapboxStyleManager = mockk(relaxed = true)\n  private val gesturesPlugin: GesturesPlugin = mockk(relaxed = true)\n  private lateinit var annotationPluginImpl: AnnotationPluginImpl\n\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.extension.style.layers.LayerUtils\")\n    mockkStatic(\"com.mapbox.maps.extension.style.sources.SourceUtils\")\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    every { logE(any(), any()) } just Runs\n\n    every { style.addSource(any()) } just Runs\n    every { style.addLayer(any()) } just Runs\n    every { style.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { style.styleSourceExists(any()) } returns false\n    every { style.styleLayerExists(any()) } returns false\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns ExpectedFactory.createNone()\n    every { delegateProvider.mapPluginProviderDelegate.getPlugin<GesturesPlugin>(Plugin.MAPBOX_GESTURES_PLUGIN_ID) } returns gesturesPlugin\n    every { delegateProvider.mapStyleManagerDelegate } returns style\n    every { delegateProvider.mapCameraManagerDelegate } returns mockk()\n    every { delegateProvider.mapFeatureQueryDelegate } returns mockk()\n    every { delegateProvider.mapInteractionDelegate } returns mockk(relaxed = true)\n    every { gesturesPlugin.getGesturesManager().moveGestureDetector } returns mockk(relaxed = true)\n\n    annotationPluginImpl = AnnotationPluginImpl()\n    annotationPluginImpl.onDelegateProvider(delegateProvider)\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.extension.style.layers.LayerUtils\")\n    unmockkStatic(\"com.mapbox.maps.extension.style.sources.SourceUtils\")\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    unmockkAll()\n  }\n\n  @Test\n  fun createAndRemove() {\n    val circleAnnotationManager =\n      annotationPluginImpl.createAnnotationManager(AnnotationType.CircleAnnotation, null)\n    assert(circleAnnotationManager is CircleAnnotationManager)\n    val pointAnnotationManager =\n      annotationPluginImpl.createAnnotationManager(AnnotationType.PointAnnotation, null)\n    assert(pointAnnotationManager is PointAnnotationManager)\n    val polygonAnnotationManager =\n      annotationPluginImpl.createAnnotationManager(AnnotationType.PolygonAnnotation, null)\n    assert(polygonAnnotationManager is PolygonAnnotationManager)\n    val polylineAnnotationManager =\n      annotationPluginImpl.createAnnotationManager(AnnotationType.PolylineAnnotation, null)\n    assert(polylineAnnotationManager is PolylineAnnotationManager)\n    assertEquals(4, annotationPluginImpl.managerList.size)\n\n    annotationPluginImpl.removeAnnotationManager(circleAnnotationManager)\n    annotationPluginImpl.removeAnnotationManager(pointAnnotationManager)\n    assertEquals(2, annotationPluginImpl.managerList.size)\n\n    annotationPluginImpl.cleanup()\n    assertEquals(0, annotationPluginImpl.managerList.size)\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/test/java/com/mapbox/maps/plugin/annotation/ShadowProjection.java",
    "content": "package com.mapbox.maps.plugin.annotation;\n\nimport com.mapbox.geojson.Point;\nimport com.mapbox.maps.MercatorCoordinate;\nimport com.mapbox.maps.Projection;\n\nimport org.robolectric.annotation.Implementation;\nimport org.robolectric.annotation.Implements;\n\n/**\n * To avoid calling native method of Projection, this shadow Projection\n * will be used for the Robolectric unit tests.\n */\n@Implements(Projection.class)\npublic class ShadowProjection {\n    @Implementation\n    public static MercatorCoordinate project(Point coordinate, double zoomScale) {\n        return new MercatorCoordinate(0.0,0.0);\n    }\n\n    @Implementation\n    public  static Point unproject(MercatorCoordinate coordinate, double zoomScale){\n        return Point.fromLngLat(0.0,0.0);\n    }\n}\n"
  },
  {
    "path": "plugin-annotation/src/test/java/com/mapbox/maps/plugin/annotation/StyleImageRefCountTest.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport android.graphics.Bitmap\nimport com.mapbox.bindgen.DataRef\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.None\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.addPersistentLayer\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotation.Companion.iconImageId\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager\nimport com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapInteractionDelegate\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.unmockkAll\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass StyleImageRefCountTest {\n\n  private val delegateProvider: MapDelegateProvider = mockk()\n  private val style: MapboxStyleManager = mockk()\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate = mockk()\n  private val mapInteractionDelegate: MapInteractionDelegate = mockk()\n  private val gesturesPlugin: GesturesPlugin = mockk()\n  private val layer: SymbolLayer = mockk()\n  private val source: GeoJsonSource = mockk()\n  private val dragLayer: SymbolLayer = mockk()\n  private val dragSource: GeoJsonSource = mockk()\n\n  private lateinit var manager: PointAnnotationManager\n\n  private val bitmap = Bitmap.createBitmap(40, 40, Bitmap.Config.ARGB_8888)\n  private val bitmap2 = Bitmap.createBitmap(60, 60, Bitmap.Config.ARGB_8888)\n\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.extension.style.layers.LayerUtils\")\n    mockkStatic(\"com.mapbox.maps.extension.style.sources.SourceUtils\")\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { delegateProvider.mapStyleManagerDelegate } returns style\n    every { style.addSource(any()) } just Runs\n    every { style.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { style.addPersistentLayer(any(), any()) } just Runs\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns mockk()\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    every { style.removeStyleLayer(any()) } returns mockk()\n    every { style.removeStyleSource(any()) } returns mockk()\n    every { style.pixelRatio } returns 1.0f\n    every { delegateProvider.mapPluginProviderDelegate.getPlugin<GesturesPlugin>(any()) } returns gesturesPlugin\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapInteractionDelegate } returns mapInteractionDelegate\n    every { delegateProvider.mapFeatureQueryDelegate } returns mockk()\n    every { mapInteractionDelegate.addInteraction(any()) } returns Cancelable { }\n    every { gesturesPlugin.getGesturesManager().moveGestureDetector } returns mockk()\n    every { mapCameraManagerDelegate.coordinateForPixel(any()) } returns Point.fromLngLat(0.0, 0.0)\n    every { mapCameraManagerDelegate.pixelForCoordinate(any()) } returns ScreenCoordinate(1.0, 1.0)\n    every { layer.layerId } returns \"layer0\"\n    every { source.sourceId } returns \"source0\"\n    every { source.featureCollection(any()) } answers { source }\n    every { dragLayer.layerId } returns \"draglayer0\"\n    every { dragSource.sourceId } returns \"dragsource0\"\n    every { dragSource.featureCollection(any()) } answers { dragSource }\n    val expected = mockk<Expected<String, None>>(relaxed = true)\n    every { style.addStyleImage(any(), any(), any(), any(), any(), any(), any()) } returns expected\n    every { expected.error } returns null\n    every { style.removeStyleImage(any()) } returns mockk()\n    every { layer.iconImage(any<Expression>()) } answers { layer }\n    every { dragLayer.iconImage(any<Expression>()) } answers { dragLayer }\n\n    manager = PointAnnotationManager(delegateProvider)\n    manager.layer = layer\n    manager.source = source\n    manager.dragLayer = dragLayer\n    manager.dragSource = dragSource\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkAll()\n  }\n\n  @Test\n  fun `delete annotation with unique bitmap removes style image`() {\n    val imageId = imageIdFor(bitmap)\n    withBitmapStatics {\n      every { style.hasStyleImage(imageId) } returns false\n      val annotation = createWithBitmap(bitmap)\n      every { style.hasStyleImage(imageId) } returns true\n\n      manager.delete(annotation)\n\n      verify(exactly = 1) { style.removeStyleImage(imageId) }\n    }\n  }\n\n  @Test\n  fun `deleteAll removes all unique style images`() {\n    val imageIdA = imageIdFor(bitmap)\n    val imageIdB = imageIdFor(bitmap2)\n    withBitmapStatics {\n      every { style.hasStyleImage(imageIdA) } returns false\n      every { style.hasStyleImage(imageIdB) } returns false\n      createWithBitmap(bitmap)\n      createWithBitmap(bitmap2)\n      every { style.hasStyleImage(imageIdA) } returns true\n      every { style.hasStyleImage(imageIdB) } returns true\n\n      manager.deleteAll()\n\n      verify(exactly = 1) { style.removeStyleImage(imageIdA) }\n      verify(exactly = 1) { style.removeStyleImage(imageIdB) }\n    }\n  }\n\n  /**\n   * Two annotations share the same bitmap (same imageId). Deleting the first must\n   * NOT remove the style image because the second annotation still references it.\n   */\n  @Test\n  fun `deleting first of two shared-bitmap annotations preserves style image`() {\n    val imageId = imageIdFor(bitmap)\n    withBitmapStatics {\n      every { style.hasStyleImage(imageId) } returns false\n      val annotationA = createWithBitmap(bitmap)\n      every { style.hasStyleImage(imageId) } returns true\n      createWithBitmap(bitmap)\n\n      manager.delete(annotationA)\n\n      verify(exactly = 0) { style.removeStyleImage(imageId) }\n    }\n  }\n\n  /**\n   * After deleting both shared-bitmap annotations the style image must be removed.\n   */\n  @Test\n  fun `deleting both shared-bitmap annotations removes style image`() {\n    val imageId = imageIdFor(bitmap)\n    withBitmapStatics {\n      every { style.hasStyleImage(imageId) } returns false\n      val annotationA = createWithBitmap(bitmap)\n      every { style.hasStyleImage(imageId) } returns true\n      val annotationB = createWithBitmap(bitmap)\n\n      manager.delete(annotationA)\n      manager.delete(annotationB)\n\n      verify(exactly = 1) { style.removeStyleImage(imageId) }\n    }\n  }\n\n  /**\n   * Annotation B is created using A's iconImage id (no bitmap) while A is still\n   * alive. Deleting A must NOT remove the style image because B holds the same id.\n   */\n  @Test\n  fun `deleting source annotation preserves style image when cached-id annotation is alive`() {\n    val imageId = imageIdFor(bitmap)\n    withBitmapStatics {\n      every { style.hasStyleImage(imageId) } returns false\n      val annotationA = createWithBitmap(bitmap)\n      every { style.hasStyleImage(imageId) } returns true\n      // B references only the id string — no bitmap\n      val annotationB = createWithIconImageString(imageId)\n\n      manager.delete(annotationA)\n\n      verify(exactly = 0) { style.removeStyleImage(imageId) }\n\n      // Once B is also deleted, the image should be released.\n      manager.delete(annotationB)\n      verify(exactly = 1) { style.removeStyleImage(imageId) }\n    }\n  }\n\n  /**\n   * Setting manager.iconImageBitmap registers the image via addStyleImage() with\n   * ref count = 1. Annotations created without an explicit iconImage don't\n   * contribute to the ref count (their _iconImage is null). Deleting such an\n   * annotation must NOT remove the manager-level style image.\n   */\n  @Test\n  fun `deleting individual annotation does not remove manager-level style image`() {\n    val imageId = imageIdFor(bitmap)\n    withBitmapStatics {\n      every { style.hasStyleImage(imageId) } returns false\n\n      // Triggers addStyleImage → styleImages.put(imageId), ref count = 1\n      manager.iconImageBitmap = bitmap\n      every { style.hasStyleImage(imageId) } returns true\n\n      // Annotation has no explicit iconImage → styleImages.put(annotation) is a no-op\n      val annotationA = manager.create(\n        PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n\n      manager.delete(annotationA)\n\n      verify(exactly = 0) { style.removeStyleImage(imageId) }\n    }\n  }\n\n  /**\n   * deleteAll must release the manager-level style image via styleImages.clear().\n   */\n  @Test\n  fun `deleteAll removes manager-level style image`() {\n    val imageId = imageIdFor(bitmap)\n    withBitmapStatics {\n      every { style.hasStyleImage(imageId) } returns false\n      manager.iconImageBitmap = bitmap\n      manager.create(PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)))\n      every { style.hasStyleImage(imageId) } returns true\n\n      manager.deleteAll()\n\n      verify(exactly = 1) { style.removeStyleImage(imageId) }\n    }\n  }\n\n  /**\n   *   1. Create A with a bitmap → image uploaded, cached ID = A._iconImage.\n   *   2. Delete A → ref count → 0, image removed from style.\n   *   3. Create B using the cached ID string (no bitmap) → ref count back to 1,\n   *      but the image is NOT re-uploaded because B has no bitmap to supply.\n   *\n   * This documents a known limitation: re-using a string ID after its originating\n   * annotation was deleted results in B having no icon in the style.\n   */\n  @Test\n  fun `creating string-id annotation after source annotation deleted does not re-add style image`() {\n    val imageId = imageIdFor(bitmap)\n    withBitmapStatics {\n      every { style.hasStyleImage(imageId) } returns false\n      val annotationA = createWithBitmap(bitmap)\n      every { style.hasStyleImage(imageId) } returns true\n\n      // Cache the ID and delete A - image removed from style\n      val cachedId = annotationA.iconImageInternal!!\n      manager.delete(annotationA)\n      every { style.hasStyleImage(imageId) } returns false\n      verify(exactly = 1) { style.addStyleImage(imageId, any(), any(), any(), any(), any(), any()) }\n\n      // Create B with the cached string ID only (no bitmap)\n      val annotationB = manager.create(\n        PointAnnotationOptions()\n          .withIconImage(cachedId)\n          .withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n\n      // Image was uploaded exactly once (for A). B has no bitmap to re-upload it.\n      verify(exactly = 1) { style.addStyleImage(imageId, any(), any(), any(), any(), any(), any()) }\n      // B holds the image ID but the image is absent from the style → B will not be shown on the map.\n      Assert.assertEquals(cachedId, annotationB.iconImageInternal)\n      Assert.assertFalse(style.hasStyleImage(cachedId))\n    }\n  }\n\n  /**\n   * Two different PointAnnotationManagers use the same bitmap. Each manager now\n   * produces a unique imageId (includes the manager's hashCode), so deleteAll on\n   * one manager only removes its own style image, leaving the other manager's\n   * image intact.\n   */\n  @Test\n  fun `deleteAll on one manager does not remove style image used by another manager`() {\n    // Set up a second manager with its own layer/source mocks\n    val layer2: SymbolLayer = mockk()\n    val source2: GeoJsonSource = mockk()\n    val dragLayer2: SymbolLayer = mockk()\n    val dragSource2: GeoJsonSource = mockk()\n    every { layer2.layerId } returns \"layer1\"\n    every { source2.sourceId } returns \"source1\"\n    every { source2.featureCollection(any()) } answers { source2 }\n    every { dragLayer2.layerId } returns \"draglayer1\"\n    every { dragSource2.sourceId } returns \"dragsource1\"\n    every { dragSource2.featureCollection(any()) } answers { dragSource2 }\n    every { layer2.iconImage(any<Expression>()) } answers { layer2 }\n    every { dragLayer2.iconImage(any<Expression>()) } answers { dragLayer2 }\n\n    val manager2 = PointAnnotationManager(delegateProvider)\n    manager2.layer = layer2\n    manager2.source = source2\n    manager2.dragLayer = dragLayer2\n    manager2.dragSource = dragSource2\n\n    val imageId1 = imageIdFor(bitmap, manager)\n    val imageId2 = imageIdFor(bitmap, manager2)\n\n    withBitmapStatics {\n      every { style.hasStyleImage(imageId1) } returns false\n      every { style.hasStyleImage(imageId2) } returns false\n\n      // Manager 1 creates an annotation with the bitmap\n      createWithBitmap(bitmap)\n      every { style.hasStyleImage(imageId1) } returns true\n\n      // Manager 2 creates an annotation with the same bitmap — gets its own imageId\n      manager2.create(\n        PointAnnotationOptions()\n          .withIconImage(bitmap)\n          .withPoint(Point.fromLngLat(0.0, 0.0))\n      )\n      every { style.hasStyleImage(imageId2) } returns true\n\n      // Manager 1 deletes all — removes only its own style image\n      manager.deleteAll()\n\n      verify(exactly = 1) { style.removeStyleImage(imageId1) }\n      // Manager 2's style image must NOT be removed\n      verify(exactly = 0) { style.removeStyleImage(imageId2) }\n    }\n  }\n\n  /**\n   * After deleting an annotation whose image was removed from the style, creating\n   * a new annotation with the same bitmap must re-upload the image to the style.\n   */\n  @Test\n  fun `creating annotation with previously deleted image re-adds style image`() {\n    val imageId = imageIdFor(bitmap)\n    withBitmapStatics {\n      every { style.hasStyleImage(imageId) } returns false\n      val annotationA = createWithBitmap(bitmap)\n      every { style.hasStyleImage(imageId) } returns true\n\n      // Delete A → image removed (ref count → 0, removeStyleImage called)\n      manager.delete(annotationA)\n      every { style.hasStyleImage(imageId) } returns false\n\n      // Create B with the same bitmap → image must be re-uploaded\n      val annotationB = createWithBitmap(bitmap)\n      every { style.hasStyleImage(imageId) } returns true\n\n      // Two addStyleImage calls: one for A, one for B\n      verify(exactly = 2) { style.addStyleImage(imageId, any(), any(), any(), any(), any(), any()) }\n\n      // Delete B → second removal\n      manager.delete(annotationB)\n      verify(exactly = 2) { style.removeStyleImage(imageId) }\n    }\n  }\n\n  private fun imageIdFor(b: Bitmap, mgr: PointAnnotationManager = manager) =\n    iconImageId(mgr, b)\n\n  private fun createWithBitmap(b: Bitmap) = manager.create(\n    PointAnnotationOptions()\n      .withIconImage(b)\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n  )\n\n  private fun createWithIconImageString(imageId: String) = manager.create(\n    PointAnnotationOptions()\n      .withIconImage(imageId)\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n  )\n\n  /** Wraps a test body that involves bitmap operations requiring DataRef mocking. */\n  private fun withBitmapStatics(block: () -> Unit) {\n    mockkStatic(DataRef::class)\n    every { DataRef.allocateNative(any()) } returns mockk(relaxed = true)\n    try {\n      block()\n    } finally {\n      unmockkStatic(DataRef::class)\n    }\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/test/java/com/mapbox/maps/plugin/annotation/generated/CircleAnnotationManagerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport android.graphics.Color\nimport android.graphics.PointF\nimport com.google.gson.JsonObject\nimport com.mapbox.android.gestures.MoveDistancesObject\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.addPersistentLayer\nimport com.mapbox.maps.extension.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSource\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.plugin.annotation.*\nimport com.mapbox.maps.plugin.delegates.*\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass CircleAnnotationManagerTest {\n  private val delegateProvider: MapDelegateProvider = mockk()\n  private val style: MapboxStyleManager = mockk()\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate = mockk()\n  private val mapInteractionDelegate: MapInteractionDelegate = mockk()\n  private val gesturesPlugin: GesturesPlugin = mockk()\n  private val moveGestureDetector: MoveGestureDetector = mockk()\n  private val layer: CircleLayer = mockk()\n  private val source: GeoJsonSource = mockk()\n  private val dragLayer: CircleLayer = mockk()\n  private val dragSource: GeoJsonSource = mockk()\n  private val feature = mockk<Feature>()\n\n  private lateinit var manager: CircleAnnotationManager\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.extension.style.layers.LayerUtils\")\n    mockkStatic(\"com.mapbox.maps.extension.style.sources.SourceUtils\")\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { delegateProvider.mapStyleManagerDelegate } returns style\n    every { style.addSource(any()) } just Runs\n    every { style.getSource(any()) } returns null\n    every { style.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { style.addPersistentLayer(any(), any()) } just Runs\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns mockk()\n    every { style.styleSourceExists(any()) } returns false\n    every { style.styleLayerExists(any()) } returns false\n    every { style.removeStyleLayer(any()) } returns mockk()\n    every { style.removeStyleSource(any()) } returns mockk()\n    every { style.pixelRatio } returns 1.0f\n    every { delegateProvider.mapPluginProviderDelegate.getPlugin<GesturesPlugin>(any()) } returns gesturesPlugin\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapInteractionDelegate } returns mapInteractionDelegate\n    every { delegateProvider.mapFeatureQueryDelegate } returns mockk()\n    every { mapInteractionDelegate.addInteraction(any()) } returns Cancelable { }\n    every { gesturesPlugin.getGesturesManager().moveGestureDetector } returns moveGestureDetector\n    every { mapCameraManagerDelegate.coordinateForPixel(any()) } returns Point.fromLngLat(0.0, 0.0)\n    every { mapCameraManagerDelegate.pixelForCoordinate(any()) } returns ScreenCoordinate(1.0, 1.0)\n    every { layer.layerId } returns \"layer0\"\n    every { source.sourceId } returns \"source0\"\n    every { source.featureCollection(any()) } answers { source }\n\n    manager = CircleAnnotationManager(delegateProvider)\n    manager.layer = layer\n    manager.source = source\n    manager.dragLayer = dragLayer\n    manager.dragSource = dragSource\n    every { layer.circleSortKey(any<Expression>()) } answers { layer }\n    every { dragLayer.circleSortKey(any<Expression>()) } answers { dragLayer }\n    every { layer.circleBlur(any<Expression>()) } answers { layer }\n    every { dragLayer.circleBlur(any<Expression>()) } answers { dragLayer }\n    every { layer.circleColor(any<Expression>()) } answers { layer }\n    every { dragLayer.circleColor(any<Expression>()) } answers { dragLayer }\n    every { layer.circleOpacity(any<Expression>()) } answers { layer }\n    every { dragLayer.circleOpacity(any<Expression>()) } answers { dragLayer }\n    every { layer.circleRadius(any<Expression>()) } answers { layer }\n    every { dragLayer.circleRadius(any<Expression>()) } answers { dragLayer }\n    every { layer.circleStrokeColor(any<Expression>()) } answers { layer }\n    every { dragLayer.circleStrokeColor(any<Expression>()) } answers { dragLayer }\n    every { layer.circleStrokeOpacity(any<Expression>()) } answers { layer }\n    every { dragLayer.circleStrokeOpacity(any<Expression>()) } answers { dragLayer }\n    every { layer.circleStrokeWidth(any<Expression>()) } answers { layer }\n    every { dragLayer.circleStrokeWidth(any<Expression>()) } answers { dragLayer }\n    every { layer.circleColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.circleColorUseTheme(any<Expression>()) } answers { dragLayer }\n    every { layer.circleStrokeColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.circleStrokeColorUseTheme(any<Expression>()) } answers { dragLayer }\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkAll()\n  }\n\n  @Test\n  fun initialize() {\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(ClickInteraction::class)) }\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(LongClickInteraction::class)) }\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(DragInteraction::class)) }\n    assertEquals(CircleAnnotation.ID_KEY, manager.getAnnotationIdKey())\n    verify { style.addPersistentLayer(any(), null) }\n    every { style.styleLayerExists(\"test_layer\") } returns true\n\n    manager = CircleAnnotationManager(delegateProvider, AnnotationConfig(\"test_layer\"))\n    verify { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n\n    manager.addClickListener(mockk())\n    manager.addDragListener(mockk())\n    manager.addLongClickListener(mockk())\n    assertEquals(1, manager.dragListeners.size)\n    assertEquals(1, manager.clickListeners.size)\n    assertEquals(1, manager.longClickListeners.size)\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    manager.onDestroy()\n    verify { style.removeStyleLayer(any()) }\n    verify { style.removeStyleSource(any()) }\n    assertTrue(manager.dragListeners.isEmpty())\n    assertTrue(manager.clickListeners.isEmpty())\n    assertTrue(manager.longClickListeners.isEmpty())\n  }\n\n  @Test\n  fun initializeBeforeStyleLoad() {\n    every { style.styleLayerExists(\"test_layer\") } returns true\n    val captureCallback = slot<(MapboxStyleManager) -> Unit>()\n    every { delegateProvider.getStyle(capture(captureCallback)) } just Runs\n    manager = CircleAnnotationManager(delegateProvider, AnnotationConfig(\"test_layer\"))\n    // Style is not loaded, still create and add layer to style as it's persistent layer\n    verify(exactly = 1) { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n    every { delegateProvider.getStyle(capture(captureCallback)) } answers {\n      captureCallback.captured.invoke(style)\n    }\n    manager.create(\n      CircleAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    // Style is loaded, will create and add layer to style while creating annotations\n    verify(exactly = 1) { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n  }\n\n  @Test\n  fun createWithGeoJsonOptions() {\n    manager = CircleAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0\n        )\n      )\n    )\n\n    val sourceString = manager.source.toString()\n    assertTrue(sourceString.contains(\"maxzoom = 10\"))\n    assertTrue(sourceString.contains(\"lineMetrics = true\"))\n    assertTrue(sourceString.contains(\"buffer = 20\"))\n    assertTrue(sourceString.contains(\"tolerance = 10.0\"))\n  }\n\n  @Test\n  fun createWithClusterOptions() {\n    @Suppress(\"UNCHECKED_CAST\")\n    manager = CircleAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0,\n          ClusterOptions(\n            clusterRadius = 30,\n            clusterMaxZoom = 15,\n            clusterMinPoints = 2,\n            clusterProperties = hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>\n          )\n        )\n      )\n    )\n\n    val sourceString = manager.source.toString()\n    assertTrue(sourceString.contains(\"maxzoom = 10\"))\n    assertTrue(sourceString.contains(\"cluster = true\"))\n    assertTrue(sourceString.contains(\"clusterRadius = 30\"))\n    assertTrue(sourceString.contains(\"clusterMaxZoom = 15\"))\n    assertTrue(sourceString.contains(\"clusterMinPoints = 2\"))\n    assertTrue(sourceString.contains(\"clusterProperties = {key1=x, key2=y}\"))\n    assertTrue(sourceString.contains(\"lineMetrics = true\"))\n    assertTrue(sourceString.contains(\"buffer = 20\"))\n    assertTrue(sourceString.contains(\"tolerance = 10.0\"))\n  }\n\n  @Test\n  fun create() {\n    val annotation = manager.create(\n      CircleAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n  }\n\n  @Test\n  fun createFromFeature() {\n    val featureCollection =\n      FeatureCollection.fromFeature(Feature.fromGeometry(Point.fromLngLat(0.0, 0.0)))\n    val annotations = manager.create(featureCollection.toJson())\n    assertEquals(annotations.first(), manager.annotations[0])\n    val annotations1 = manager.create(featureCollection)\n    assertEquals(annotations1.first(), manager.annotations[1])\n  }\n\n  @Test\n  fun createList() {\n    val list = listOf(\n      CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n      CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n  }\n\n  @Test\n  fun update() {\n    val annotation = manager.create(CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)))\n    assertEquals(annotation, manager.annotations[0])\n    annotation.point = Point.fromLngLat(1.0, 1.0)\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n  }\n\n  @Test\n  fun annotationPropertiesUpdate() {\n    val annotation = manager.create(CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)))\n\n    annotation.circleSortKey = 1.0\n    assertEquals(1.0, annotation.circleSortKey)\n    annotation.circleSortKey = null\n    assertNull(annotation.circleSortKey)\n\n    annotation.circleBlur = 0.0\n    assertEquals(0.0, annotation.circleBlur)\n    annotation.circleBlur = null\n    assertNull(annotation.circleBlur)\n\n    annotation.circleColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.circleColorInt)\n    annotation.circleColorInt = null\n    assertNull(annotation.circleColorInt)\n\n    annotation.circleColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.circleColorString)\n    annotation.circleColorString = null\n    assertNull(annotation.circleColorString)\n\n    annotation.circleOpacity = 1.0\n    assertEquals(1.0, annotation.circleOpacity)\n    annotation.circleOpacity = null\n    assertNull(annotation.circleOpacity)\n\n    annotation.circleRadius = 5.0\n    assertEquals(5.0, annotation.circleRadius)\n    annotation.circleRadius = null\n    assertNull(annotation.circleRadius)\n\n    annotation.circleStrokeColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.circleStrokeColorInt)\n    annotation.circleStrokeColorInt = null\n    assertNull(annotation.circleStrokeColorInt)\n\n    annotation.circleStrokeColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.circleStrokeColorString)\n    annotation.circleStrokeColorString = null\n    assertNull(annotation.circleStrokeColorString)\n\n    annotation.circleStrokeOpacity = 1.0\n    assertEquals(1.0, annotation.circleStrokeOpacity)\n    annotation.circleStrokeOpacity = null\n    assertNull(annotation.circleStrokeOpacity)\n\n    annotation.circleStrokeWidth = 0.0\n    assertEquals(0.0, annotation.circleStrokeWidth)\n    annotation.circleStrokeWidth = null\n    assertNull(annotation.circleStrokeWidth)\n\n    annotation.circleColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.circleColorUseTheme)\n    annotation.circleColorUseTheme = null\n    assertNull(annotation.circleColorUseTheme)\n\n    annotation.circleStrokeColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.circleStrokeColorUseTheme)\n    annotation.circleStrokeColorUseTheme = null\n    assertNull(annotation.circleStrokeColorUseTheme)\n  }\n\n  @Test\n  fun updateList() {\n    val list = listOf(\n      CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n      CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n    annotations[0].point = Point.fromLngLat(1.0, 1.0)\n    annotations[1].point = Point.fromLngLat(1.0, 1.0)\n    manager.update(annotations)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n  }\n\n  @Test\n  fun delete() {\n    val annotation = manager.create(\n      CircleAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun deleteList() {\n    val list = listOf(\n      CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n      CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n\n    manager.delete(annotations)\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun deleteAll() {\n    val list = listOf(\n      CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n      CircleAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n\n    manager.deleteAll()\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun clickWithNoAnnotation() {\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      ClickInteraction.layer(id = customLayerId, filter = any(), onClick = capture(onClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = CircleAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n\n    val listener = mockk<OnCircleAnnotationClickListener>()\n    every { listener.onAnnotationClick(any()) } returns false\n    manager.addClickListener(listener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(CircleAnnotation.ID_KEY, \"incorrectId\")\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify(exactly = 0) { listener.onAnnotationClick(any()) }\n    unmockkObject(ClickInteraction.Companion)\n  }\n\n  @Test\n  fun click() {\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      ClickInteraction.layer(id = customLayerId, filter = any(), onClick = capture(onClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = CircleAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    val annotation = manager.create(\n      CircleAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnCircleAnnotationClickListener>()\n    every { listener.onAnnotationClick(any()) } returns true\n    manager.addClickListener(listener)\n\n    val interactionListener = mockk<OnCircleAnnotationInteractionListener>()\n    every { interactionListener.onSelectAnnotation(any()) } just Runs\n    every { interactionListener.onDeselectAnnotation(any()) } just Runs\n    manager.addInteractionListener(interactionListener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(CircleAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n   onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationClick(annotation) }\n    verify { interactionListener.onSelectAnnotation(annotation) }\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(CircleAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(annotation.id),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { interactionListener.onDeselectAnnotation(annotation) }\n\n    manager.removeClickListener(listener)\n    assertTrue(manager.clickListeners.isEmpty())\n    manager.removeInteractionListener(interactionListener)\n    assertTrue(manager.interactionListener.isEmpty())\n    unmockkObject(ClickInteraction.Companion)\n  }\n\n  @Test\n  fun longClick() {\n    mockkObject(LongClickInteraction.Companion)\n    val onLongClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      LongClickInteraction.layer(id = customLayerId, filter = any(), onLongClick = capture(onLongClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      LongClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onLongClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = CircleAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n\n    val annotation = manager.create(\n      CircleAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnCircleAnnotationLongClickListener>()\n    every { listener.onAnnotationLongClick(any()) } returns false\n    manager.addLongClickListener(listener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(CircleAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onLongClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationLongClick(annotation) }\n\n    manager.removeLongClickListener(listener)\n    assertTrue(manager.longClickListeners.isEmpty())\n    unmockkObject(LongClickInteraction.Companion)\n  }\n\n  @Test\n  fun clusterClick() {\n    val customClusterLayerId = \"customClusterLayerId\"\n        mockkStatic(\"com.mapbox.maps.extension.style.layers.generated.CircleLayerKt\")\n        every { circleLayer(match { it.contains(\"cluster\") }, any(), any()) } returns CircleLayer(\n          customClusterLayerId,\n          \"clusterSource\"\n        )\n\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot =\n      slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    every {\n      ClickInteraction.layer(\n        id = customClusterLayerId,\n        filter = any(),\n        onClick = capture(onClickLayerIdSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n\n    @Suppress(\"UNCHECKED_CAST\")\n    manager = CircleAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0,\n          ClusterOptions(\n            clusterRadius = 30,\n            clusterMaxZoom = 15,\n            clusterMinPoints = 2,\n            clusterProperties = hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>\n          )\n        )\n      )\n    )\n\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(\"cluster\", true)\n      addProperty(\"cluster_id\", \"22\")\n      addProperty(\"point_count\", 22)\n      addProperty(\"point_count_abbreviated\", \"22K\")\n    }\n\n    val listener = mockk<OnClusterClickListener>()\n    every { listener.onClusterClick(any()) } returns true\n    manager.addClusterClickListener(listener)\n\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(feature.id()!!, null),\n      descriptor = TypedFeaturesetDescriptor.Layer(customClusterLayerId),\n      originalFeature = feature,\n      state = FeatureState { }\n    )\n\n    onClickLayerIdSlot.captured.invoke(\n      featuresetFeature,\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onClusterClick(match { it.originalFeature == feature }) }\n\n    manager.removeClusterClickListener(listener)\n    assertTrue(manager.clusterClickListeners.isEmpty())\n    unmockkObject(ClickInteraction.Companion)\n    unmockkStatic(\"com.mapbox.maps.extension.style.layers.generated.CircleLayerKt\")\n  }\n\n  @Test\n  fun clusterLongClick() {\n    val customClusterLayerId = \"customClusterLayerId\"\n    mockkStatic(\"com.mapbox.maps.extension.style.layers.generated.CircleLayerKt\")\n    every { circleLayer(match { it.contains(\"cluster\") }, any(), any()) } returns CircleLayer(\n      customClusterLayerId,\n      \"clusterSource\"\n    )\n\n    mockkObject(LongClickInteraction.Companion)\n    val onLongClickLayerIdSlot =\n      slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    every {\n      LongClickInteraction.layer(\n        id = customClusterLayerId,\n        filter = any(),\n        onLongClick = capture(onLongClickLayerIdSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      LongClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onLongClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n\n    @Suppress(\"UNCHECKED_CAST\")\n    manager = CircleAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0,\n          ClusterOptions(\n            clusterRadius = 30,\n            clusterMaxZoom = 15,\n            clusterMinPoints = 2,\n            clusterProperties = hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>\n          )\n        )\n      )\n    )\n\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(\"cluster\", true)\n      addProperty(\"cluster_id\", \"22\")\n      addProperty(\"point_count\", 22)\n      addProperty(\"point_count_abbreviated\", \"22K\")\n    }\n\n    val listener = mockk<OnClusterLongClickListener>()\n    every { listener.onClusterLongClick(any()) } returns true\n    manager.addClusterLongClickListener(listener)\n\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(feature.id()!!, null),\n      descriptor = TypedFeaturesetDescriptor.Layer(customClusterLayerId),\n      originalFeature = feature,\n      state = FeatureState { }\n    )\n\n    onLongClickLayerIdSlot.captured.invoke(\n      featuresetFeature,\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onClusterLongClick(match { it.originalFeature == feature }) }\n\n    manager.removeClusterLongClickListener(listener)\n    assertTrue(manager.clusterLongClickListeners.isEmpty())\n    unmockkObject(ClickInteraction.Companion)\n    unmockkStatic(\"com.mapbox.maps.extension.style.layers.generated.CircleLayerKt\")\n  }\n\n  @Test\n  fun drag() {\n    mockkObject(DragInteraction.Companion)\n    val onDragBeginLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val onDragSlot = slot<((InteractionContext) -> Unit)>()\n    val onDragEndSlot = slot<((InteractionContext) -> Unit)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      DragInteraction.layer(\n        id = customLayerId,\n        filter = any(),\n        onDragBegin = capture(onDragBeginLayerIdSlot),\n        onDrag = capture(onDragSlot),\n        onDragEnd = capture(onDragEndSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      DragInteraction.layer(\n        id = any(),\n        filter = any(),\n        onDragBegin = { _, _ -> return@layer false },\n        onDrag = { },\n        onDragEnd = { }\n      )\n    } returns mockk()\n    val manager = CircleAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    manager.onSizeChanged(100, 100)\n    val annotation = manager.create(\n      CircleAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnCircleAnnotationDragListener>(relaxed = true)\n    manager.addDragListener(listener)\n\n    annotation.isDraggable = true\n    val pointF = PointF(0f, 0f)\n    every { moveGestureDetector.pointersCount } returns 1\n    every { moveGestureDetector.focalPoint } returns pointF\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(CircleAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onDragBeginLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragStarted(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    val moveDistancesObject = mockk<MoveDistancesObject>()\n    every { moveDistancesObject.currentX } returns 1f\n    every { moveDistancesObject.currentY } returns 1f\n    every { moveDistancesObject.distanceXSinceLast } returns 1f\n    every { moveDistancesObject.distanceYSinceLast } returns 1f\n    every { moveGestureDetector.getMoveObject(any()) } returns moveDistancesObject\n    onDragSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDrag(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    onDragEndSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragFinished(annotation) }\n\n    manager.removeDragListener(listener)\n    assertTrue(manager.dragListeners.isEmpty())\n    assertEquals(1, manager.annotations.size)\n\n    // Verify update after drag\n    annotation.point = Point.fromLngLat(1.0, 1.0)\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n\n    // Verify delete after drag\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n    unmockkObject(DragInteraction.Companion)\n  }\n\n  @Test\n  fun testScaleDoesNotTriggerDrag() {\n    mockkObject(DragInteraction.Companion)\n    val onDragBeginLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val onDragSlot = slot<((InteractionContext) -> Unit)>()\n    val onDragEndSlot = slot<((InteractionContext) -> Unit)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      DragInteraction.layer(\n        id = customLayerId,\n        filter = any(),\n        onDragBegin = capture(onDragBeginLayerIdSlot),\n        onDrag = capture(onDragSlot),\n        onDragEnd = capture(onDragEndSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      DragInteraction.layer(\n        id = any(),\n        filter = any(),\n        onDragBegin = { _, _ -> return@layer false },\n        onDrag = { },\n        onDragEnd = { }\n      )\n    } returns mockk()\n    every { mapInteractionDelegate.dispatch(any()) } just runs\n    val manager = CircleAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    manager.onSizeChanged(100, 100)\n    val annotation = manager.create(\n      CircleAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnCircleAnnotationDragListener>(relaxed = true)\n    manager.addDragListener(listener)\n\n    annotation.isDraggable = true\n    val pointF = PointF(0f, 0f)\n    every { moveGestureDetector.pointersCount } returns 2\n    every { moveGestureDetector.focalPoint } returns pointF\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(CircleAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onDragBeginLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragStarted(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    val moveDistancesObject = mockk<MoveDistancesObject>()\n    every { moveDistancesObject.currentX } returns 1f\n    every { moveDistancesObject.currentY } returns 1f\n    every { moveDistancesObject.distanceXSinceLast } returns 1f\n    every { moveDistancesObject.distanceYSinceLast } returns 1f\n    every { moveGestureDetector.getMoveObject(any()) } returns moveDistancesObject\n    onDragSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify(exactly = 0) { listener.onAnnotationDrag(annotation) }\n    verify(exactly = 1) { listener.onAnnotationDragFinished(annotation) }\n\n    manager.removeDragListener(listener)\n    assertTrue(manager.dragListeners.isEmpty())\n    assertEquals(1, manager.annotations.size)\n\n    // Verify update after drag\n    annotation.point = Point.fromLngLat(1.0, 1.0)\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n\n    // Verify delete after drag\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n    unmockkObject(DragInteraction.Companion)\n  }\n\n  @Test\n  fun testCircleSortKeyLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleSortKey(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleSortKey(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleSortKey(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.circleSortKey(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleSortKey(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.circleSortKey(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)) }\n  }\n\n  @Test\n  fun testCircleSortKeyInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleSortKey(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleSortKey = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleSortKey(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.circleSortKey(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_SORT_KEY)) }\n  }\n\n  @Test\n  fun testCircleBlurLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleBlur(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleBlur(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleBlur(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.circleBlur(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleBlur(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.circleBlur(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)) }\n  }\n\n  @Test\n  fun testCircleBlurInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleBlur(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleBlur = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleBlur(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.circleBlur(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_BLUR)) }\n  }\n\n  @Test\n  fun testCircleColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n  }\n\n  @Test\n  fun testCircleColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n  }\n\n  @Test\n  fun testCircleColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.circleColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR)) }\n  }\n\n  @Test\n  fun testCircleOpacityLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleOpacity(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.circleOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.circleOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)) }\n  }\n\n  @Test\n  fun testCircleOpacityInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleOpacity = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.circleOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_OPACITY)) }\n  }\n\n  @Test\n  fun testCircleRadiusLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleRadius(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleRadius(5.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleRadius(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)) }\n    verify(exactly = 1) { manager.dragLayer.circleRadius(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleRadius(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)) }\n    verify(exactly = 1) { manager.dragLayer.circleRadius(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)) }\n  }\n\n  @Test\n  fun testCircleRadiusInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleRadius(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleRadius = 5.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleRadius(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)) }\n    verify(exactly = 1) { manager.dragLayer.circleRadius(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_RADIUS)) }\n  }\n\n  @Test\n  fun testCircleStrokeColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleStrokeColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n  }\n\n  @Test\n  fun testCircleStrokeColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleStrokeColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n  }\n\n  @Test\n  fun testCircleStrokeColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleStrokeColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeColor(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR)) }\n  }\n\n  @Test\n  fun testCircleStrokeOpacityLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleStrokeOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleStrokeOpacity(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)) }\n  }\n\n  @Test\n  fun testCircleStrokeOpacityInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleStrokeOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleStrokeOpacity = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeOpacity(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_OPACITY)) }\n  }\n\n  @Test\n  fun testCircleStrokeWidthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleStrokeWidth(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleStrokeWidth(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeWidth(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeWidth(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeWidth(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeWidth(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)) }\n  }\n\n  @Test\n  fun testCircleStrokeWidthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleStrokeWidth(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleStrokeWidth = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeWidth(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeWidth(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_WIDTH)) }\n  }\n\n  @Test\n  fun testCircleColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.circleColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.circleColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testCircleColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.circleColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testCircleStrokeColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleStrokeColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withCircleStrokeColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testCircleStrokeColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.circleStrokeColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)) }\n    val options = CircleAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.circleStrokeColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.circleStrokeColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.circleStrokeColorUseTheme(Expression.get(CircleAnnotationOptions.PROPERTY_CIRCLE_STROKE_COLOR_USE_THEME)) }\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/test/java/com/mapbox/maps/plugin/annotation/generated/PointAnnotationManagerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.graphics.PointF\nimport com.google.gson.JsonObject\nimport com.mapbox.android.gestures.MoveDistancesObject\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.bindgen.DataRef\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.None\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.addPersistentLayer\nimport com.mapbox.maps.extension.style.layers.generated.CircleLayer\nimport com.mapbox.maps.extension.style.layers.generated.SymbolLayer\nimport com.mapbox.maps.extension.style.layers.generated.circleLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSource\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.plugin.annotation.*\nimport com.mapbox.maps.plugin.delegates.*\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\nclass PointAnnotationManagerTest {\n  private val delegateProvider: MapDelegateProvider = mockk()\n  private val style: MapboxStyleManager = mockk()\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate = mockk()\n  private val mapInteractionDelegate: MapInteractionDelegate = mockk()\n  private val gesturesPlugin: GesturesPlugin = mockk()\n  private val moveGestureDetector: MoveGestureDetector = mockk()\n  private val layer: SymbolLayer = mockk()\n  private val source: GeoJsonSource = mockk()\n  private val dragLayer: SymbolLayer = mockk()\n  private val dragSource: GeoJsonSource = mockk()\n  private val feature = mockk<Feature>()\n\n  private lateinit var manager: PointAnnotationManager\n  private val bitmap = Bitmap.createBitmap(40, 40, Bitmap.Config.ARGB_8888)\n\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.extension.style.layers.LayerUtils\")\n    mockkStatic(\"com.mapbox.maps.extension.style.sources.SourceUtils\")\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { delegateProvider.mapStyleManagerDelegate } returns style\n    every { style.addSource(any()) } just Runs\n    every { style.getSource(any()) } returns null\n    every { style.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { style.addPersistentLayer(any(), any()) } just Runs\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns mockk()\n    every { style.styleSourceExists(any()) } returns false\n    every { style.styleLayerExists(any()) } returns false\n    every { style.removeStyleLayer(any()) } returns mockk()\n    every { style.removeStyleSource(any()) } returns mockk()\n    every { style.pixelRatio } returns 1.0f\n    every { delegateProvider.mapPluginProviderDelegate.getPlugin<GesturesPlugin>(any()) } returns gesturesPlugin\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapInteractionDelegate } returns mapInteractionDelegate\n    every { delegateProvider.mapFeatureQueryDelegate } returns mockk()\n    every { mapInteractionDelegate.addInteraction(any()) } returns Cancelable { }\n    every { gesturesPlugin.getGesturesManager().moveGestureDetector } returns moveGestureDetector\n    every { mapCameraManagerDelegate.coordinateForPixel(any()) } returns Point.fromLngLat(0.0, 0.0)\n    every { mapCameraManagerDelegate.pixelForCoordinate(any()) } returns ScreenCoordinate(1.0, 1.0)\n    every { layer.layerId } returns \"layer0\"\n    every { source.sourceId } returns \"source0\"\n    every { source.featureCollection(any()) } answers { source }\n\n    manager = PointAnnotationManager(delegateProvider)\n    manager.layer = layer\n    manager.source = source\n    manager.dragLayer = dragLayer\n    manager.dragSource = dragSource\n    val expected = mockk<Expected<String, None>>(relaxUnitFun = true, relaxed = true)\n    every { style.addStyleImage(any(), any(), any(), any(), any(), any(), any()) } returns expected\n    every { expected.error } returns null\n    every { layer.iconAnchor(any<Expression>()) } answers { layer }\n    every { dragLayer.iconAnchor(any<Expression>()) } answers { dragLayer }\n    every { layer.iconImage(any<Expression>()) } answers { layer }\n    every { dragLayer.iconImage(any<Expression>()) } answers { dragLayer }\n    every { layer.iconOffset(any<Expression>()) } answers { layer }\n    every { dragLayer.iconOffset(any<Expression>()) } answers { dragLayer }\n    every { layer.iconRotate(any<Expression>()) } answers { layer }\n    every { dragLayer.iconRotate(any<Expression>()) } answers { dragLayer }\n    every { layer.iconSize(any<Expression>()) } answers { layer }\n    every { dragLayer.iconSize(any<Expression>()) } answers { dragLayer }\n    every { layer.iconTextFit(any<Expression>()) } answers { layer }\n    every { dragLayer.iconTextFit(any<Expression>()) } answers { dragLayer }\n    every { layer.iconTextFitPadding(any<Expression>()) } answers { layer }\n    every { dragLayer.iconTextFitPadding(any<Expression>()) } answers { dragLayer }\n    every { layer.symbolSortKey(any<Expression>()) } answers { layer }\n    every { dragLayer.symbolSortKey(any<Expression>()) } answers { dragLayer }\n    every { layer.textAnchor(any<Expression>()) } answers { layer }\n    every { dragLayer.textAnchor(any<Expression>()) } answers { dragLayer }\n    every { layer.textField(any<Expression>()) } answers { layer }\n    every { dragLayer.textField(any<Expression>()) } answers { dragLayer }\n    every { layer.textJustify(any<Expression>()) } answers { layer }\n    every { dragLayer.textJustify(any<Expression>()) } answers { dragLayer }\n    every { layer.textLetterSpacing(any<Expression>()) } answers { layer }\n    every { dragLayer.textLetterSpacing(any<Expression>()) } answers { dragLayer }\n    every { layer.textLineHeight(any<Expression>()) } answers { layer }\n    every { dragLayer.textLineHeight(any<Expression>()) } answers { dragLayer }\n    every { layer.textMaxWidth(any<Expression>()) } answers { layer }\n    every { dragLayer.textMaxWidth(any<Expression>()) } answers { dragLayer }\n    every { layer.textOffset(any<Expression>()) } answers { layer }\n    every { dragLayer.textOffset(any<Expression>()) } answers { dragLayer }\n    every { layer.textRadialOffset(any<Expression>()) } answers { layer }\n    every { dragLayer.textRadialOffset(any<Expression>()) } answers { dragLayer }\n    every { layer.textRotate(any<Expression>()) } answers { layer }\n    every { dragLayer.textRotate(any<Expression>()) } answers { dragLayer }\n    every { layer.textSize(any<Expression>()) } answers { layer }\n    every { dragLayer.textSize(any<Expression>()) } answers { dragLayer }\n    every { layer.textTransform(any<Expression>()) } answers { layer }\n    every { dragLayer.textTransform(any<Expression>()) } answers { dragLayer }\n    every { layer.iconColor(any<Expression>()) } answers { layer }\n    every { dragLayer.iconColor(any<Expression>()) } answers { dragLayer }\n    every { layer.iconEmissiveStrength(any<Expression>()) } answers { layer }\n    every { dragLayer.iconEmissiveStrength(any<Expression>()) } answers { dragLayer }\n    every { layer.iconHaloBlur(any<Expression>()) } answers { layer }\n    every { dragLayer.iconHaloBlur(any<Expression>()) } answers { dragLayer }\n    every { layer.iconHaloColor(any<Expression>()) } answers { layer }\n    every { dragLayer.iconHaloColor(any<Expression>()) } answers { dragLayer }\n    every { layer.iconHaloWidth(any<Expression>()) } answers { layer }\n    every { dragLayer.iconHaloWidth(any<Expression>()) } answers { dragLayer }\n    every { layer.iconOcclusionOpacity(any<Expression>()) } answers { layer }\n    every { dragLayer.iconOcclusionOpacity(any<Expression>()) } answers { dragLayer }\n    every { layer.iconOpacity(any<Expression>()) } answers { layer }\n    every { dragLayer.iconOpacity(any<Expression>()) } answers { dragLayer }\n    every { layer.symbolZOffset(any<Expression>()) } answers { layer }\n    every { dragLayer.symbolZOffset(any<Expression>()) } answers { dragLayer }\n    every { layer.textColor(any<Expression>()) } answers { layer }\n    every { dragLayer.textColor(any<Expression>()) } answers { dragLayer }\n    every { layer.textEmissiveStrength(any<Expression>()) } answers { layer }\n    every { dragLayer.textEmissiveStrength(any<Expression>()) } answers { dragLayer }\n    every { layer.textHaloBlur(any<Expression>()) } answers { layer }\n    every { dragLayer.textHaloBlur(any<Expression>()) } answers { dragLayer }\n    every { layer.textHaloColor(any<Expression>()) } answers { layer }\n    every { dragLayer.textHaloColor(any<Expression>()) } answers { dragLayer }\n    every { layer.textHaloWidth(any<Expression>()) } answers { layer }\n    every { dragLayer.textHaloWidth(any<Expression>()) } answers { dragLayer }\n    every { layer.textOcclusionOpacity(any<Expression>()) } answers { layer }\n    every { dragLayer.textOcclusionOpacity(any<Expression>()) } answers { dragLayer }\n    every { layer.textOpacity(any<Expression>()) } answers { layer }\n    every { dragLayer.textOpacity(any<Expression>()) } answers { dragLayer }\n    every { layer.iconColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.iconColorUseTheme(any<Expression>()) } answers { dragLayer }\n    every { layer.iconHaloColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.iconHaloColorUseTheme(any<Expression>()) } answers { dragLayer }\n    every { layer.textColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.textColorUseTheme(any<Expression>()) } answers { dragLayer }\n    every { layer.textHaloColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.textHaloColorUseTheme(any<Expression>()) } answers { dragLayer }\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkAll()\n  }\n\n  @Test\n  fun initialize() {\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(ClickInteraction::class)) }\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(LongClickInteraction::class)) }\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(DragInteraction::class)) }\n    assertEquals(PointAnnotation.ID_KEY, manager.getAnnotationIdKey())\n    verify { style.addPersistentLayer(any(), null) }\n    every { style.styleLayerExists(\"test_layer\") } returns true\n\n    manager = PointAnnotationManager(delegateProvider, AnnotationConfig(\"test_layer\"))\n    verify { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n\n    manager.addClickListener(mockk())\n    manager.addDragListener(mockk())\n    manager.addLongClickListener(mockk())\n    assertEquals(1, manager.dragListeners.size)\n    assertEquals(1, manager.clickListeners.size)\n    assertEquals(1, manager.longClickListeners.size)\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    manager.onDestroy()\n    verify { style.removeStyleLayer(any()) }\n    verify { style.removeStyleSource(any()) }\n    assertTrue(manager.dragListeners.isEmpty())\n    assertTrue(manager.clickListeners.isEmpty())\n    assertTrue(manager.longClickListeners.isEmpty())\n  }\n\n  @Test\n  fun initializeBeforeStyleLoad() {\n    every { style.styleLayerExists(\"test_layer\") } returns true\n    val captureCallback = slot<(MapboxStyleManager) -> Unit>()\n    every { delegateProvider.getStyle(capture(captureCallback)) } just Runs\n    manager = PointAnnotationManager(delegateProvider, AnnotationConfig(\"test_layer\"))\n    // Style is not loaded, still create and add layer to style as it's persistent layer\n    verify(exactly = 1) { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n    every { delegateProvider.getStyle(capture(captureCallback)) } answers {\n      captureCallback.captured.invoke(style)\n    }\n    manager.create(\n      PointAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    // Style is loaded, will create and add layer to style while creating annotations\n    verify(exactly = 1) { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n  }\n\n  @Test\n  fun createWithGeoJsonOptions() {\n    manager = PointAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0\n        )\n      )\n    )\n\n    val sourceString = manager.source.toString()\n    assertTrue(sourceString.contains(\"maxzoom = 10\"))\n    assertTrue(sourceString.contains(\"lineMetrics = true\"))\n    assertTrue(sourceString.contains(\"buffer = 20\"))\n    assertTrue(sourceString.contains(\"tolerance = 10.0\"))\n  }\n\n  @Test\n  fun createWithClusterOptions() {\n    @Suppress(\"UNCHECKED_CAST\")\n    manager = PointAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0,\n          ClusterOptions(\n            clusterRadius = 30,\n            clusterMaxZoom = 15,\n            clusterMinPoints = 2,\n            clusterProperties = hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>\n          )\n        )\n      )\n    )\n\n    val sourceString = manager.source.toString()\n    assertTrue(sourceString.contains(\"maxzoom = 10\"))\n    assertTrue(sourceString.contains(\"cluster = true\"))\n    assertTrue(sourceString.contains(\"clusterRadius = 30\"))\n    assertTrue(sourceString.contains(\"clusterMaxZoom = 15\"))\n    assertTrue(sourceString.contains(\"clusterMinPoints = 2\"))\n    assertTrue(sourceString.contains(\"clusterProperties = {key1=x, key2=y}\"))\n    assertTrue(sourceString.contains(\"lineMetrics = true\"))\n    assertTrue(sourceString.contains(\"buffer = 20\"))\n    assertTrue(sourceString.contains(\"tolerance = 10.0\"))\n  }\n\n  @Test\n  fun iconImageBitmapWithIconImageIdAndBitmap() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withIconImage(\"car-15\")\n        .withIconImage(bitmap)\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(\"car-15\", annotation.iconImageInternal)\n    verify(exactly = 0) { style.addStyleImage(any(), any(), any(), any(), any(), any(), any()) }\n  }\n\n  @Test\n  fun iconImageBitmapWithoutIconImageId() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    mockkStatic(DataRef::class)\n    every { DataRef.allocateNative(any()) } returns mockk(relaxed = true)\n    val imageId = PointAnnotation.iconImageId(manager, bitmap)\n    every { style.hasStyleImage(imageId) } returns false\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withIconImage(bitmap)\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(imageId, annotation.iconImageInternal)\n\n    verify(exactly = 1) { style.addStyleImage(any(), any(), any(), any(), any(), any(), any()) }\n    unmockkStatic(DataRef::class)\n  }\n\n  @Test\n  fun twoPointsWithSameImageBitmap() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    mockkStatic(DataRef::class)\n    every { DataRef.allocateNative(any()) } returns mockk(relaxed = true)\n    val imageId = PointAnnotation.iconImageId(manager, bitmap)\n    every { style.hasStyleImage(imageId) } returns false\n\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withIconImage(bitmap)\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(imageId, annotation.iconImageInternal)\n\n    verify(exactly = 1) { style.addStyleImage(imageId, any(), any(), any(), any(), any(), any()) }\n\n    every { style.hasStyleImage(imageId) } returns true\n    val annotation2 = manager.create(\n      PointAnnotationOptions()\n        .withIconImage(bitmap)\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(imageId, annotation2.iconImageInternal)\n    // Only one image should be added to the style because we're re-using the same bitmap\n    verify(exactly = 1) { style.addStyleImage(imageId, any(), any(), any(), any(), any(), any()) }\n    unmockkStatic(DataRef::class)\n  }\n\n  @Test\n  fun onePointUpdateImageBitmap() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    mockkStatic(DataRef::class)\n    every { DataRef.allocateNative(any()) } returns mockk(relaxed = true)\n    val imageId = PointAnnotation.iconImageId(manager, bitmap)\n    every { style.hasStyleImage(imageId) } returns false\n\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withIconImage(bitmap)\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(imageId, annotation.iconImageInternal)\n\n    verify(exactly = 1) { style.addStyleImage(imageId, any(), any(), any(), any(), any(), any()) }\n\n    every { style.hasStyleImage(imageId) } returns true\n\n    val secondBitmap = Bitmap.createBitmap(40, 40, Bitmap.Config.ARGB_8888)\n    val secondImageId = PointAnnotation.iconImageId(manager, secondBitmap)\n    every { style.hasStyleImage(secondImageId) } returns false\n    annotation.iconImageBitmap = secondBitmap\n    manager.update(annotation)\n    // Only one image should be added to the style because we're re-using the same bitmap\n    verify(exactly = 1) { style.addStyleImage(secondImageId, any(), any(), any(), any(), any(), any()) }\n    unmockkStatic(DataRef::class)\n  }\n\n  @Test\n  fun updateIconImageBitmap() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    mockkStatic(DataRef::class)\n    every { DataRef.allocateNative(any()) } returns mockk(relaxed = true)\n    val imageId = PointAnnotation.iconImageId(manager, bitmap)\n    every { style.hasStyleImage(imageId) } returns false\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withIconImage(bitmap)\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    verify(exactly = 1) { style.addStyleImage(imageId, any(), any(), any(), any(), any(), any()) }\n\n    // Update the bitmap for the same point annotation\n    val createBitmap = Bitmap.createBitmap(40, 40, Bitmap.Config.ARGB_8888)\n    val secondImageId = PointAnnotation.iconImageId(manager, createBitmap)\n    every { style.hasStyleImage(secondImageId) } returns false\n    annotation.iconImageBitmap = createBitmap\n    manager.update(annotation)\n    assertEquals(secondImageId, annotation.iconImageInternal)\n    verify(exactly = 1) { style.addStyleImage(secondImageId, any(), any(), any(), any(), any(), any()) }\n    unmockkStatic(DataRef::class)\n  }\n  @Test\n  fun create() {\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n  }\n\n  @Test\n  fun createFromFeature() {\n    val featureCollection =\n      FeatureCollection.fromFeature(Feature.fromGeometry(Point.fromLngLat(0.0, 0.0)))\n    val annotations = manager.create(featureCollection.toJson())\n    assertEquals(annotations.first(), manager.annotations[0])\n    val annotations1 = manager.create(featureCollection)\n    assertEquals(annotations1.first(), manager.annotations[1])\n  }\n\n  @Test\n  fun createList() {\n    val list = listOf(\n      PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n      PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n  }\n\n  @Test\n  fun update() {\n    val annotation = manager.create(PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)))\n    assertEquals(annotation, manager.annotations[0])\n    annotation.point = Point.fromLngLat(1.0, 1.0)\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n  }\n\n  @Test\n  fun annotationPropertiesUpdate() {\n    val annotation = manager.create(PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)))\n\n    annotation.iconImageBitmap = bitmap\n    assertEquals(PointAnnotation.iconImageId(manager, bitmap), annotation.iconImageInternal)\n    annotation.iconImageBitmap = null\n    assertNull(annotation.iconImageInternal)\n\n    annotation.iconAnchor = IconAnchor.CENTER\n    assertEquals(IconAnchor.CENTER, annotation.iconAnchor)\n    annotation.iconAnchor = null\n    assertNull(annotation.iconAnchor)\n\n    annotation.iconImageInternal = \"\"\n    assertEquals(\"\", annotation.iconImageInternal)\n    annotation.iconImageInternal = null\n    assertNull(annotation.iconImageInternal)\n\n    annotation.iconOffset = listOf(0.0, 0.0)\n    assertEquals(listOf(0.0, 0.0), annotation.iconOffset)\n    annotation.iconOffset = null\n    assertNull(annotation.iconOffset)\n\n    annotation.iconRotate = 0.0\n    assertEquals(0.0, annotation.iconRotate)\n    annotation.iconRotate = null\n    assertNull(annotation.iconRotate)\n\n    annotation.iconSize = 1.0\n    assertEquals(1.0, annotation.iconSize)\n    annotation.iconSize = null\n    assertNull(annotation.iconSize)\n\n    annotation.iconTextFit = IconTextFit.NONE\n    assertEquals(IconTextFit.NONE, annotation.iconTextFit)\n    annotation.iconTextFit = null\n    assertNull(annotation.iconTextFit)\n\n    annotation.iconTextFitPadding = listOf(0.0, 0.0, 0.0, 0.0)\n    assertEquals(listOf(0.0, 0.0, 0.0, 0.0), annotation.iconTextFitPadding)\n    annotation.iconTextFitPadding = null\n    assertNull(annotation.iconTextFitPadding)\n\n    annotation.symbolSortKey = 1.0\n    assertEquals(1.0, annotation.symbolSortKey)\n    annotation.symbolSortKey = null\n    assertNull(annotation.symbolSortKey)\n\n    annotation.textAnchor = TextAnchor.CENTER\n    assertEquals(TextAnchor.CENTER, annotation.textAnchor)\n    annotation.textAnchor = null\n    assertNull(annotation.textAnchor)\n\n    annotation.textField = \"\"\n    assertEquals(\"\", annotation.textField)\n    annotation.textField = null\n    assertNull(annotation.textField)\n\n    annotation.textJustify = TextJustify.AUTO\n    assertEquals(TextJustify.AUTO, annotation.textJustify)\n    annotation.textJustify = null\n    assertNull(annotation.textJustify)\n\n    annotation.textLetterSpacing = 0.0\n    assertEquals(0.0, annotation.textLetterSpacing)\n    annotation.textLetterSpacing = null\n    assertNull(annotation.textLetterSpacing)\n\n    annotation.textLineHeight = 1.2\n    assertEquals(1.2, annotation.textLineHeight)\n    annotation.textLineHeight = null\n    assertNull(annotation.textLineHeight)\n\n    annotation.textMaxWidth = 10.0\n    assertEquals(10.0, annotation.textMaxWidth)\n    annotation.textMaxWidth = null\n    assertNull(annotation.textMaxWidth)\n\n    annotation.textOffset = listOf(0.0, 0.0)\n    assertEquals(listOf(0.0, 0.0), annotation.textOffset)\n    annotation.textOffset = null\n    assertNull(annotation.textOffset)\n\n    annotation.textRadialOffset = 0.0\n    assertEquals(0.0, annotation.textRadialOffset)\n    annotation.textRadialOffset = null\n    assertNull(annotation.textRadialOffset)\n\n    annotation.textRotate = 0.0\n    assertEquals(0.0, annotation.textRotate)\n    annotation.textRotate = null\n    assertNull(annotation.textRotate)\n\n    annotation.textSize = 16.0\n    assertEquals(16.0, annotation.textSize)\n    annotation.textSize = null\n    assertNull(annotation.textSize)\n\n    annotation.textTransform = TextTransform.NONE\n    assertEquals(TextTransform.NONE, annotation.textTransform)\n    annotation.textTransform = null\n    assertNull(annotation.textTransform)\n\n    annotation.iconColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.iconColorInt)\n    annotation.iconColorInt = null\n    assertNull(annotation.iconColorInt)\n\n    annotation.iconColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.iconColorString)\n    annotation.iconColorString = null\n    assertNull(annotation.iconColorString)\n\n    annotation.iconEmissiveStrength = 1.0\n    assertEquals(1.0, annotation.iconEmissiveStrength)\n    annotation.iconEmissiveStrength = null\n    assertNull(annotation.iconEmissiveStrength)\n\n    annotation.iconHaloBlur = 0.0\n    assertEquals(0.0, annotation.iconHaloBlur)\n    annotation.iconHaloBlur = null\n    assertNull(annotation.iconHaloBlur)\n\n    annotation.iconHaloColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.iconHaloColorInt)\n    annotation.iconHaloColorInt = null\n    assertNull(annotation.iconHaloColorInt)\n\n    annotation.iconHaloColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.iconHaloColorString)\n    annotation.iconHaloColorString = null\n    assertNull(annotation.iconHaloColorString)\n\n    annotation.iconHaloWidth = 0.0\n    assertEquals(0.0, annotation.iconHaloWidth)\n    annotation.iconHaloWidth = null\n    assertNull(annotation.iconHaloWidth)\n\n    annotation.iconOcclusionOpacity = 0.0\n    assertEquals(0.0, annotation.iconOcclusionOpacity)\n    annotation.iconOcclusionOpacity = null\n    assertNull(annotation.iconOcclusionOpacity)\n\n    annotation.iconOpacity = 1.0\n    assertEquals(1.0, annotation.iconOpacity)\n    annotation.iconOpacity = null\n    assertNull(annotation.iconOpacity)\n\n    annotation.symbolZOffset = 0.0\n    assertEquals(0.0, annotation.symbolZOffset)\n    annotation.symbolZOffset = null\n    assertNull(annotation.symbolZOffset)\n\n    annotation.textColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.textColorInt)\n    annotation.textColorInt = null\n    assertNull(annotation.textColorInt)\n\n    annotation.textColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.textColorString)\n    annotation.textColorString = null\n    assertNull(annotation.textColorString)\n\n    annotation.textEmissiveStrength = 1.0\n    assertEquals(1.0, annotation.textEmissiveStrength)\n    annotation.textEmissiveStrength = null\n    assertNull(annotation.textEmissiveStrength)\n\n    annotation.textHaloBlur = 0.0\n    assertEquals(0.0, annotation.textHaloBlur)\n    annotation.textHaloBlur = null\n    assertNull(annotation.textHaloBlur)\n\n    annotation.textHaloColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.textHaloColorInt)\n    annotation.textHaloColorInt = null\n    assertNull(annotation.textHaloColorInt)\n\n    annotation.textHaloColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.textHaloColorString)\n    annotation.textHaloColorString = null\n    assertNull(annotation.textHaloColorString)\n\n    annotation.textHaloWidth = 0.0\n    assertEquals(0.0, annotation.textHaloWidth)\n    annotation.textHaloWidth = null\n    assertNull(annotation.textHaloWidth)\n\n    annotation.textOcclusionOpacity = 0.0\n    assertEquals(0.0, annotation.textOcclusionOpacity)\n    annotation.textOcclusionOpacity = null\n    assertNull(annotation.textOcclusionOpacity)\n\n    annotation.textOpacity = 1.0\n    assertEquals(1.0, annotation.textOpacity)\n    annotation.textOpacity = null\n    assertNull(annotation.textOpacity)\n\n    annotation.iconColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.iconColorUseTheme)\n    annotation.iconColorUseTheme = null\n    assertNull(annotation.iconColorUseTheme)\n\n    annotation.iconHaloColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.iconHaloColorUseTheme)\n    annotation.iconHaloColorUseTheme = null\n    assertNull(annotation.iconHaloColorUseTheme)\n\n    annotation.textColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.textColorUseTheme)\n    annotation.textColorUseTheme = null\n    assertNull(annotation.textColorUseTheme)\n\n    annotation.textHaloColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.textHaloColorUseTheme)\n    annotation.textHaloColorUseTheme = null\n    assertNull(annotation.textHaloColorUseTheme)\n  }\n\n  @Test\n  fun updateList() {\n    val list = listOf(\n      PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n      PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n    annotations[0].point = Point.fromLngLat(1.0, 1.0)\n    annotations[1].point = Point.fromLngLat(1.0, 1.0)\n    manager.update(annotations)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n  }\n\n  @Test\n  fun delete() {\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun deleteList() {\n    val list = listOf(\n      PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n      PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n\n    manager.delete(annotations)\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun deleteAll() {\n    val list = listOf(\n      PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0)),\n      PointAnnotationOptions().withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n\n    manager.deleteAll()\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun clickWithNoAnnotation() {\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      ClickInteraction.layer(id = customLayerId, filter = any(), onClick = capture(onClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = PointAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n\n    val listener = mockk<OnPointAnnotationClickListener>()\n    every { listener.onAnnotationClick(any()) } returns false\n    manager.addClickListener(listener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PointAnnotation.ID_KEY, \"incorrectId\")\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify(exactly = 0) { listener.onAnnotationClick(any()) }\n    unmockkObject(ClickInteraction.Companion)\n  }\n\n  @Test\n  fun click() {\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      ClickInteraction.layer(id = customLayerId, filter = any(), onClick = capture(onClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = PointAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPointAnnotationClickListener>()\n    every { listener.onAnnotationClick(any()) } returns true\n    manager.addClickListener(listener)\n\n    val interactionListener = mockk<OnPointAnnotationInteractionListener>()\n    every { interactionListener.onSelectAnnotation(any()) } just Runs\n    every { interactionListener.onDeselectAnnotation(any()) } just Runs\n    manager.addInteractionListener(interactionListener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PointAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n   onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationClick(annotation) }\n    verify { interactionListener.onSelectAnnotation(annotation) }\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PointAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(annotation.id),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { interactionListener.onDeselectAnnotation(annotation) }\n\n    manager.removeClickListener(listener)\n    assertTrue(manager.clickListeners.isEmpty())\n    manager.removeInteractionListener(interactionListener)\n    assertTrue(manager.interactionListener.isEmpty())\n    unmockkObject(ClickInteraction.Companion)\n  }\n\n  @Test\n  fun longClick() {\n    mockkObject(LongClickInteraction.Companion)\n    val onLongClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      LongClickInteraction.layer(id = customLayerId, filter = any(), onLongClick = capture(onLongClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      LongClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onLongClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = PointAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPointAnnotationLongClickListener>()\n    every { listener.onAnnotationLongClick(any()) } returns false\n    manager.addLongClickListener(listener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PointAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onLongClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationLongClick(annotation) }\n\n    manager.removeLongClickListener(listener)\n    assertTrue(manager.longClickListeners.isEmpty())\n    unmockkObject(LongClickInteraction.Companion)\n  }\n\n  @Test\n  fun clusterClick() {\n    val customClusterLayerId = \"customClusterLayerId\"\n        mockkStatic(\"com.mapbox.maps.extension.style.layers.generated.CircleLayerKt\")\n        every { circleLayer(match { it.contains(\"cluster\") }, any(), any()) } returns CircleLayer(\n          customClusterLayerId,\n          \"clusterSource\"\n        )\n\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot =\n      slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    every {\n      ClickInteraction.layer(\n        id = customClusterLayerId,\n        filter = any(),\n        onClick = capture(onClickLayerIdSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n\n    @Suppress(\"UNCHECKED_CAST\")\n    manager = PointAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0,\n          ClusterOptions(\n            clusterRadius = 30,\n            clusterMaxZoom = 15,\n            clusterMinPoints = 2,\n            clusterProperties = hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>\n          )\n        )\n      )\n    )\n\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(\"cluster\", true)\n      addProperty(\"cluster_id\", \"22\")\n      addProperty(\"point_count\", 22)\n      addProperty(\"point_count_abbreviated\", \"22K\")\n    }\n\n    val listener = mockk<OnClusterClickListener>()\n    every { listener.onClusterClick(any()) } returns true\n    manager.addClusterClickListener(listener)\n\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(feature.id()!!, null),\n      descriptor = TypedFeaturesetDescriptor.Layer(customClusterLayerId),\n      originalFeature = feature,\n      state = FeatureState { }\n    )\n\n    onClickLayerIdSlot.captured.invoke(\n      featuresetFeature,\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onClusterClick(match { it.originalFeature == feature }) }\n\n    manager.removeClusterClickListener(listener)\n    assertTrue(manager.clusterClickListeners.isEmpty())\n    unmockkObject(ClickInteraction.Companion)\n    unmockkStatic(\"com.mapbox.maps.extension.style.layers.generated.CircleLayerKt\")\n  }\n\n  @Test\n  fun clusterLongClick() {\n    val customClusterLayerId = \"customClusterLayerId\"\n    mockkStatic(\"com.mapbox.maps.extension.style.layers.generated.CircleLayerKt\")\n    every { circleLayer(match { it.contains(\"cluster\") }, any(), any()) } returns CircleLayer(\n      customClusterLayerId,\n      \"clusterSource\"\n    )\n\n    mockkObject(LongClickInteraction.Companion)\n    val onLongClickLayerIdSlot =\n      slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    every {\n      LongClickInteraction.layer(\n        id = customClusterLayerId,\n        filter = any(),\n        onLongClick = capture(onLongClickLayerIdSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      LongClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onLongClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n\n    @Suppress(\"UNCHECKED_CAST\")\n    manager = PointAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0,\n          ClusterOptions(\n            clusterRadius = 30,\n            clusterMaxZoom = 15,\n            clusterMinPoints = 2,\n            clusterProperties = hashMapOf(\"key1\" to \"x\", \"key2\" to \"y\") as HashMap<String, Any>\n          )\n        )\n      )\n    )\n\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(\"cluster\", true)\n      addProperty(\"cluster_id\", \"22\")\n      addProperty(\"point_count\", 22)\n      addProperty(\"point_count_abbreviated\", \"22K\")\n    }\n\n    val listener = mockk<OnClusterLongClickListener>()\n    every { listener.onClusterLongClick(any()) } returns true\n    manager.addClusterLongClickListener(listener)\n\n    val featuresetFeature = FeaturesetFeature(\n      id = FeaturesetFeatureId(feature.id()!!, null),\n      descriptor = TypedFeaturesetDescriptor.Layer(customClusterLayerId),\n      originalFeature = feature,\n      state = FeatureState { }\n    )\n\n    onLongClickLayerIdSlot.captured.invoke(\n      featuresetFeature,\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onClusterLongClick(match { it.originalFeature == feature }) }\n\n    manager.removeClusterLongClickListener(listener)\n    assertTrue(manager.clusterLongClickListeners.isEmpty())\n    unmockkObject(ClickInteraction.Companion)\n    unmockkStatic(\"com.mapbox.maps.extension.style.layers.generated.CircleLayerKt\")\n  }\n\n  @Test\n  fun drag() {\n    mockkObject(DragInteraction.Companion)\n    val onDragBeginLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val onDragSlot = slot<((InteractionContext) -> Unit)>()\n    val onDragEndSlot = slot<((InteractionContext) -> Unit)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      DragInteraction.layer(\n        id = customLayerId,\n        filter = any(),\n        onDragBegin = capture(onDragBeginLayerIdSlot),\n        onDrag = capture(onDragSlot),\n        onDragEnd = capture(onDragEndSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      DragInteraction.layer(\n        id = any(),\n        filter = any(),\n        onDragBegin = { _, _ -> return@layer false },\n        onDrag = { },\n        onDragEnd = { }\n      )\n    } returns mockk()\n    val manager = PointAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    manager.onSizeChanged(100, 100)\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPointAnnotationDragListener>(relaxed = true)\n    manager.addDragListener(listener)\n\n    annotation.isDraggable = true\n    val pointF = PointF(0f, 0f)\n    every { moveGestureDetector.pointersCount } returns 1\n    every { moveGestureDetector.focalPoint } returns pointF\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PointAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onDragBeginLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragStarted(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    val moveDistancesObject = mockk<MoveDistancesObject>()\n    every { moveDistancesObject.currentX } returns 1f\n    every { moveDistancesObject.currentY } returns 1f\n    every { moveDistancesObject.distanceXSinceLast } returns 1f\n    every { moveDistancesObject.distanceYSinceLast } returns 1f\n    every { moveGestureDetector.getMoveObject(any()) } returns moveDistancesObject\n    onDragSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDrag(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    onDragEndSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragFinished(annotation) }\n\n    manager.removeDragListener(listener)\n    assertTrue(manager.dragListeners.isEmpty())\n    assertEquals(1, manager.annotations.size)\n\n    // Verify update after drag\n    annotation.point = Point.fromLngLat(1.0, 1.0)\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n\n    // Verify delete after drag\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n    unmockkObject(DragInteraction.Companion)\n  }\n\n  @Test\n  fun testScaleDoesNotTriggerDrag() {\n    mockkObject(DragInteraction.Companion)\n    val onDragBeginLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val onDragSlot = slot<((InteractionContext) -> Unit)>()\n    val onDragEndSlot = slot<((InteractionContext) -> Unit)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      DragInteraction.layer(\n        id = customLayerId,\n        filter = any(),\n        onDragBegin = capture(onDragBeginLayerIdSlot),\n        onDrag = capture(onDragSlot),\n        onDragEnd = capture(onDragEndSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      DragInteraction.layer(\n        id = any(),\n        filter = any(),\n        onDragBegin = { _, _ -> return@layer false },\n        onDrag = { },\n        onDragEnd = { }\n      )\n    } returns mockk()\n    every { mapInteractionDelegate.dispatch(any()) } just runs\n    val manager = PointAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    manager.onSizeChanged(100, 100)\n    val annotation = manager.create(\n      PointAnnotationOptions()\n        .withPoint(Point.fromLngLat(0.0, 0.0))\n    )\n    assertEquals(annotation, manager.annotations[0])\n\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPointAnnotationDragListener>(relaxed = true)\n    manager.addDragListener(listener)\n\n    annotation.isDraggable = true\n    val pointF = PointF(0f, 0f)\n    every { moveGestureDetector.pointersCount } returns 2\n    every { moveGestureDetector.focalPoint } returns pointF\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PointAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onDragBeginLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragStarted(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    val moveDistancesObject = mockk<MoveDistancesObject>()\n    every { moveDistancesObject.currentX } returns 1f\n    every { moveDistancesObject.currentY } returns 1f\n    every { moveDistancesObject.distanceXSinceLast } returns 1f\n    every { moveDistancesObject.distanceYSinceLast } returns 1f\n    every { moveGestureDetector.getMoveObject(any()) } returns moveDistancesObject\n    onDragSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify(exactly = 0) { listener.onAnnotationDrag(annotation) }\n    verify(exactly = 1) { listener.onAnnotationDragFinished(annotation) }\n\n    manager.removeDragListener(listener)\n    assertTrue(manager.dragListeners.isEmpty())\n    assertEquals(1, manager.annotations.size)\n\n    // Verify update after drag\n    annotation.point = Point.fromLngLat(1.0, 1.0)\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n\n    // Verify delete after drag\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n    unmockkObject(DragInteraction.Companion)\n  }\n\n  @Test\n  fun testIconAnchorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconAnchor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconAnchor(IconAnchor.CENTER)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconAnchor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)) }\n    verify(exactly = 1) { manager.dragLayer.iconAnchor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconAnchor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)) }\n    verify(exactly = 1) { manager.dragLayer.iconAnchor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)) }\n  }\n\n  @Test\n  fun testIconAnchorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconAnchor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconAnchor = IconAnchor.CENTER\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconAnchor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)) }\n    verify(exactly = 1) { manager.dragLayer.iconAnchor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ANCHOR)) }\n  }\n\n  @Test\n  fun testIconImageLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconImage(Expression.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconImage(\"\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconImage(Expression.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)) }\n    verify(exactly = 1) { manager.dragLayer.iconImage(Expression.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconImage(Expression.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)) }\n    verify(exactly = 1) { manager.dragLayer.iconImage(Expression.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)) }\n  }\n\n  @Test\n  fun testIconImageInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconImage(Expression.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconImage = \"\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconImage(Expression.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)) }\n    verify(exactly = 1) { manager.dragLayer.iconImage(Expression.get(PointAnnotationOptions.PROPERTY_ICON_IMAGE)) }\n  }\n\n  @Test\n  fun testIconOffsetLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconOffset(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconOffset(listOf(0.0, 0.0))\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconOffset(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.iconOffset(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconOffset(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.iconOffset(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)) }\n  }\n\n  @Test\n  fun testIconOffsetInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconOffset(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconOffset = listOf(0.0, 0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconOffset(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.iconOffset(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OFFSET)) }\n  }\n\n  @Test\n  fun testIconRotateLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconRotate(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconRotate(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconRotate(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)) }\n    verify(exactly = 1) { manager.dragLayer.iconRotate(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconRotate(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)) }\n    verify(exactly = 1) { manager.dragLayer.iconRotate(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)) }\n  }\n\n  @Test\n  fun testIconRotateInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconRotate(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconRotate = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconRotate(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)) }\n    verify(exactly = 1) { manager.dragLayer.iconRotate(Expression.get(PointAnnotationOptions.PROPERTY_ICON_ROTATE)) }\n  }\n\n  @Test\n  fun testIconSizeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconSize(Expression.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconSize(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconSize(Expression.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)) }\n    verify(exactly = 1) { manager.dragLayer.iconSize(Expression.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconSize(Expression.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)) }\n    verify(exactly = 1) { manager.dragLayer.iconSize(Expression.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)) }\n  }\n\n  @Test\n  fun testIconSizeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconSize(Expression.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconSize = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconSize(Expression.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)) }\n    verify(exactly = 1) { manager.dragLayer.iconSize(Expression.get(PointAnnotationOptions.PROPERTY_ICON_SIZE)) }\n  }\n\n  @Test\n  fun testIconTextFitLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconTextFit(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconTextFit(IconTextFit.NONE)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconTextFit(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)) }\n    verify(exactly = 1) { manager.dragLayer.iconTextFit(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconTextFit(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)) }\n    verify(exactly = 1) { manager.dragLayer.iconTextFit(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)) }\n  }\n\n  @Test\n  fun testIconTextFitInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconTextFit(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconTextFit = IconTextFit.NONE\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconTextFit(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)) }\n    verify(exactly = 1) { manager.dragLayer.iconTextFit(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT)) }\n  }\n\n  @Test\n  fun testIconTextFitPaddingLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconTextFitPadding(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconTextFitPadding(listOf(0.0, 0.0, 0.0, 0.0))\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconTextFitPadding(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)) }\n    verify(exactly = 1) { manager.dragLayer.iconTextFitPadding(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconTextFitPadding(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)) }\n    verify(exactly = 1) { manager.dragLayer.iconTextFitPadding(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)) }\n  }\n\n  @Test\n  fun testIconTextFitPaddingInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconTextFitPadding(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconTextFitPadding = listOf(0.0, 0.0, 0.0, 0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconTextFitPadding(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)) }\n    verify(exactly = 1) { manager.dragLayer.iconTextFitPadding(Expression.get(PointAnnotationOptions.PROPERTY_ICON_TEXT_FIT_PADDING)) }\n  }\n\n  @Test\n  fun testSymbolSortKeyLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.symbolSortKey(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withSymbolSortKey(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.symbolSortKey(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.symbolSortKey(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.symbolSortKey(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.symbolSortKey(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)) }\n  }\n\n  @Test\n  fun testSymbolSortKeyInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.symbolSortKey(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.symbolSortKey = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.symbolSortKey(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.symbolSortKey(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_SORT_KEY)) }\n  }\n\n  @Test\n  fun testTextAnchorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textAnchor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextAnchor(TextAnchor.CENTER)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textAnchor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)) }\n    verify(exactly = 1) { manager.dragLayer.textAnchor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textAnchor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)) }\n    verify(exactly = 1) { manager.dragLayer.textAnchor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)) }\n  }\n\n  @Test\n  fun testTextAnchorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textAnchor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textAnchor = TextAnchor.CENTER\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textAnchor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)) }\n    verify(exactly = 1) { manager.dragLayer.textAnchor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ANCHOR)) }\n  }\n\n  @Test\n  fun testTextFieldLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textField(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextField(\"\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textField(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)) }\n    verify(exactly = 1) { manager.dragLayer.textField(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textField(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)) }\n    verify(exactly = 1) { manager.dragLayer.textField(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)) }\n  }\n\n  @Test\n  fun testTextFieldInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textField(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textField = \"\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textField(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)) }\n    verify(exactly = 1) { manager.dragLayer.textField(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_FIELD)) }\n  }\n\n  @Test\n  fun testTextJustifyLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textJustify(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextJustify(TextJustify.CENTER)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textJustify(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)) }\n    verify(exactly = 1) { manager.dragLayer.textJustify(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textJustify(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)) }\n    verify(exactly = 1) { manager.dragLayer.textJustify(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)) }\n  }\n\n  @Test\n  fun testTextJustifyInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textJustify(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textJustify = TextJustify.CENTER\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textJustify(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)) }\n    verify(exactly = 1) { manager.dragLayer.textJustify(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_JUSTIFY)) }\n  }\n\n  @Test\n  fun testTextLetterSpacingLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textLetterSpacing(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextLetterSpacing(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textLetterSpacing(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)) }\n    verify(exactly = 1) { manager.dragLayer.textLetterSpacing(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textLetterSpacing(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)) }\n    verify(exactly = 1) { manager.dragLayer.textLetterSpacing(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)) }\n  }\n\n  @Test\n  fun testTextLetterSpacingInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textLetterSpacing(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textLetterSpacing = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textLetterSpacing(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)) }\n    verify(exactly = 1) { manager.dragLayer.textLetterSpacing(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LETTER_SPACING)) }\n  }\n\n  @Test\n  fun testTextLineHeightLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textLineHeight(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextLineHeight(1.2)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textLineHeight(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)) }\n    verify(exactly = 1) { manager.dragLayer.textLineHeight(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textLineHeight(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)) }\n    verify(exactly = 1) { manager.dragLayer.textLineHeight(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)) }\n  }\n\n  @Test\n  fun testTextLineHeightInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textLineHeight(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textLineHeight = 1.2\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textLineHeight(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)) }\n    verify(exactly = 1) { manager.dragLayer.textLineHeight(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_LINE_HEIGHT)) }\n  }\n\n  @Test\n  fun testTextMaxWidthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textMaxWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextMaxWidth(10.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textMaxWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.textMaxWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textMaxWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.textMaxWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)) }\n  }\n\n  @Test\n  fun testTextMaxWidthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textMaxWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textMaxWidth = 10.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textMaxWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.textMaxWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_MAX_WIDTH)) }\n  }\n\n  @Test\n  fun testTextOffsetLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextOffset(listOf(0.0, 0.0))\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.textOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.textOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)) }\n  }\n\n  @Test\n  fun testTextOffsetInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textOffset = listOf(0.0, 0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.textOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OFFSET)) }\n  }\n\n  @Test\n  fun testTextRadialOffsetLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textRadialOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextRadialOffset(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textRadialOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.textRadialOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textRadialOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.textRadialOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)) }\n  }\n\n  @Test\n  fun testTextRadialOffsetInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textRadialOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textRadialOffset = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textRadialOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.textRadialOffset(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_RADIAL_OFFSET)) }\n  }\n\n  @Test\n  fun testTextRotateLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textRotate(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextRotate(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textRotate(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)) }\n    verify(exactly = 1) { manager.dragLayer.textRotate(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textRotate(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)) }\n    verify(exactly = 1) { manager.dragLayer.textRotate(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)) }\n  }\n\n  @Test\n  fun testTextRotateInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textRotate(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textRotate = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textRotate(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)) }\n    verify(exactly = 1) { manager.dragLayer.textRotate(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_ROTATE)) }\n  }\n\n  @Test\n  fun testTextSizeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textSize(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextSize(16.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textSize(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)) }\n    verify(exactly = 1) { manager.dragLayer.textSize(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textSize(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)) }\n    verify(exactly = 1) { manager.dragLayer.textSize(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)) }\n  }\n\n  @Test\n  fun testTextSizeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textSize(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textSize = 16.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textSize(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)) }\n    verify(exactly = 1) { manager.dragLayer.textSize(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_SIZE)) }\n  }\n\n  @Test\n  fun testTextTransformLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textTransform(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextTransform(TextTransform.NONE)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textTransform(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)) }\n    verify(exactly = 1) { manager.dragLayer.textTransform(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textTransform(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)) }\n    verify(exactly = 1) { manager.dragLayer.textTransform(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)) }\n  }\n\n  @Test\n  fun testTextTransformInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textTransform(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textTransform = TextTransform.NONE\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textTransform(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)) }\n    verify(exactly = 1) { manager.dragLayer.textTransform(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_TRANSFORM)) }\n  }\n\n  @Test\n  fun testIconColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n  }\n\n  @Test\n  fun testIconColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n  }\n\n  @Test\n  fun testIconColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.iconColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR)) }\n  }\n\n  @Test\n  fun testIconEmissiveStrengthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconEmissiveStrength(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)) }\n    verify(exactly = 1) { manager.dragLayer.iconEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)) }\n    verify(exactly = 1) { manager.dragLayer.iconEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)) }\n  }\n\n  @Test\n  fun testIconEmissiveStrengthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconEmissiveStrength = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)) }\n    verify(exactly = 1) { manager.dragLayer.iconEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_ICON_EMISSIVE_STRENGTH)) }\n  }\n\n  @Test\n  fun testIconHaloBlurLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconHaloBlur(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)) }\n  }\n\n  @Test\n  fun testIconHaloBlurInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconHaloBlur = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_BLUR)) }\n  }\n\n  @Test\n  fun testIconHaloColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconHaloColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n  }\n\n  @Test\n  fun testIconHaloColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconHaloColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n  }\n\n  @Test\n  fun testIconHaloColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconHaloColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR)) }\n  }\n\n  @Test\n  fun testIconHaloWidthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconHaloWidth(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)) }\n  }\n\n  @Test\n  fun testIconHaloWidthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconHaloWidth = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_WIDTH)) }\n  }\n\n  @Test\n  fun testIconOcclusionOpacityLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconOcclusionOpacity(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.iconOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.iconOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)) }\n  }\n\n  @Test\n  fun testIconOcclusionOpacityInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconOcclusionOpacity = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.iconOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OCCLUSION_OPACITY)) }\n  }\n\n  @Test\n  fun testIconOpacityLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconOpacity(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.iconOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.iconOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)) }\n  }\n\n  @Test\n  fun testIconOpacityInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconOpacity = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.iconOpacity(Expression.get(PointAnnotationOptions.PROPERTY_ICON_OPACITY)) }\n  }\n\n  @Test\n  fun testSymbolZOffsetLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.symbolZOffset(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withSymbolZOffset(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.symbolZOffset(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.symbolZOffset(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.symbolZOffset(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.symbolZOffset(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)) }\n  }\n\n  @Test\n  fun testSymbolZOffsetInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.symbolZOffset(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.symbolZOffset = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.symbolZOffset(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.symbolZOffset(Expression.get(PointAnnotationOptions.PROPERTY_SYMBOL_Z_OFFSET)) }\n  }\n\n  @Test\n  fun testTextColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n  }\n\n  @Test\n  fun testTextColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n  }\n\n  @Test\n  fun testTextColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.textColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR)) }\n  }\n\n  @Test\n  fun testTextEmissiveStrengthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextEmissiveStrength(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)) }\n    verify(exactly = 1) { manager.dragLayer.textEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)) }\n    verify(exactly = 1) { manager.dragLayer.textEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)) }\n  }\n\n  @Test\n  fun testTextEmissiveStrengthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textEmissiveStrength = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)) }\n    verify(exactly = 1) { manager.dragLayer.textEmissiveStrength(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_EMISSIVE_STRENGTH)) }\n  }\n\n  @Test\n  fun testTextHaloBlurLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextHaloBlur(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)) }\n  }\n\n  @Test\n  fun testTextHaloBlurInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textHaloBlur = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloBlur(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_BLUR)) }\n  }\n\n  @Test\n  fun testTextHaloColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextHaloColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n  }\n\n  @Test\n  fun testTextHaloColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextHaloColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n  }\n\n  @Test\n  fun testTextHaloColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textHaloColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloColor(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR)) }\n  }\n\n  @Test\n  fun testTextHaloWidthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextHaloWidth(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)) }\n  }\n\n  @Test\n  fun testTextHaloWidthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textHaloWidth = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloWidth(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_WIDTH)) }\n  }\n\n  @Test\n  fun testTextOcclusionOpacityLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextOcclusionOpacity(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.textOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.textOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)) }\n  }\n\n  @Test\n  fun testTextOcclusionOpacityInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textOcclusionOpacity = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.textOcclusionOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OCCLUSION_OPACITY)) }\n  }\n\n  @Test\n  fun testTextOpacityLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextOpacity(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.textOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.textOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)) }\n  }\n\n  @Test\n  fun testTextOpacityInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textOpacity = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.textOpacity(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_OPACITY)) }\n  }\n\n  @Test\n  fun testIconColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.iconColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.iconColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testIconColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.iconColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testIconHaloColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withIconHaloColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testIconHaloColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.iconHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.iconHaloColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.iconHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.iconHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_ICON_HALO_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testTextColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.textColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.textColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testTextColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.textColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testTextHaloColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n      .withTextHaloColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testTextHaloColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.textHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)) }\n    val options = PointAnnotationOptions()\n      .withPoint(Point.fromLngLat(0.0, 0.0))\n    manager.textHaloColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.textHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.textHaloColorUseTheme(Expression.get(PointAnnotationOptions.PROPERTY_TEXT_HALO_COLOR_USE_THEME)) }\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/test/java/com/mapbox/maps/plugin/annotation/generated/PolygonAnnotationManagerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport android.graphics.Color\nimport android.graphics.PointF\nimport com.google.gson.JsonObject\nimport com.mapbox.android.gestures.MoveDistancesObject\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.addPersistentLayer\nimport com.mapbox.maps.extension.style.layers.generated.FillLayer\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSource\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.plugin.annotation.*\nimport com.mapbox.maps.plugin.delegates.*\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowProjection::class])\nclass PolygonAnnotationManagerTest {\n  private val delegateProvider: MapDelegateProvider = mockk()\n  private val style: MapboxStyleManager = mockk()\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate = mockk()\n  private val mapInteractionDelegate: MapInteractionDelegate = mockk()\n  private val gesturesPlugin: GesturesPlugin = mockk()\n  private val moveGestureDetector: MoveGestureDetector = mockk()\n  private val layer: FillLayer = mockk()\n  private val source: GeoJsonSource = mockk()\n  private val dragLayer: FillLayer = mockk()\n  private val dragSource: GeoJsonSource = mockk()\n  private val feature = mockk<Feature>()\n\n  private lateinit var manager: PolygonAnnotationManager\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.extension.style.layers.LayerUtils\")\n    mockkStatic(\"com.mapbox.maps.extension.style.sources.SourceUtils\")\n    mockkStatic(Projection::class)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { delegateProvider.mapStyleManagerDelegate } returns style\n    every { style.addSource(any()) } just Runs\n    every { style.getSource(any()) } returns null\n    every { style.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { style.addPersistentLayer(any(), any()) } just Runs\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns mockk()\n    every { style.styleSourceExists(any()) } returns false\n    every { style.styleLayerExists(any()) } returns false\n    every { style.removeStyleLayer(any()) } returns mockk()\n    every { style.removeStyleSource(any()) } returns mockk()\n    every { style.pixelRatio } returns 1.0f\n    every { delegateProvider.mapPluginProviderDelegate.getPlugin<GesturesPlugin>(any()) } returns gesturesPlugin\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapInteractionDelegate } returns mapInteractionDelegate\n    every { delegateProvider.mapFeatureQueryDelegate } returns mockk()\n    every { mapInteractionDelegate.addInteraction(any()) } returns Cancelable { }\n    every { gesturesPlugin.getGesturesManager().moveGestureDetector } returns moveGestureDetector\n    every { mapCameraManagerDelegate.coordinateForPixel(any()) } returns Point.fromLngLat(0.0, 0.0)\n    every { mapCameraManagerDelegate.pixelForCoordinate(any()) } returns ScreenCoordinate(1.0, 1.0)\n    every { mapCameraManagerDelegate.cameraState } returns mockk(relaxed = true)\n    every { layer.layerId } returns \"layer0\"\n    every { source.sourceId } returns \"source0\"\n    every { source.featureCollection(any()) } answers { source }\n\n    manager = PolygonAnnotationManager(delegateProvider)\n    manager.layer = layer\n    manager.source = source\n    manager.dragLayer = dragLayer\n    manager.dragSource = dragSource\n    every { layer.fillConstructBridgeGuardRail(any<Expression>()) } answers { layer }\n    every { dragLayer.fillConstructBridgeGuardRail(any<Expression>()) } answers { dragLayer }\n    every { layer.fillSortKey(any<Expression>()) } answers { layer }\n    every { dragLayer.fillSortKey(any<Expression>()) } answers { dragLayer }\n    every { layer.fillBridgeGuardRailColor(any<Expression>()) } answers { layer }\n    every { dragLayer.fillBridgeGuardRailColor(any<Expression>()) } answers { dragLayer }\n    every { layer.fillColor(any<Expression>()) } answers { layer }\n    every { dragLayer.fillColor(any<Expression>()) } answers { dragLayer }\n    every { layer.fillOpacity(any<Expression>()) } answers { layer }\n    every { dragLayer.fillOpacity(any<Expression>()) } answers { dragLayer }\n    every { layer.fillOutlineColor(any<Expression>()) } answers { layer }\n    every { dragLayer.fillOutlineColor(any<Expression>()) } answers { dragLayer }\n    every { layer.fillPattern(any<Expression>()) } answers { layer }\n    every { dragLayer.fillPattern(any<Expression>()) } answers { dragLayer }\n    every { layer.fillTunnelStructureColor(any<Expression>()) } answers { layer }\n    every { dragLayer.fillTunnelStructureColor(any<Expression>()) } answers { dragLayer }\n    every { layer.fillZOffset(any<Expression>()) } answers { layer }\n    every { dragLayer.fillZOffset(any<Expression>()) } answers { dragLayer }\n    every { layer.fillBridgeGuardRailColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.fillBridgeGuardRailColorUseTheme(any<Expression>()) } answers { dragLayer }\n    every { layer.fillColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.fillColorUseTheme(any<Expression>()) } answers { dragLayer }\n    every { layer.fillOutlineColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.fillOutlineColorUseTheme(any<Expression>()) } answers { dragLayer }\n    every { layer.fillTunnelStructureColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.fillTunnelStructureColorUseTheme(any<Expression>()) } answers { dragLayer }\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkAll()\n  }\n\n  @Test\n  fun initialize() {\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(ClickInteraction::class)) }\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(LongClickInteraction::class)) }\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(DragInteraction::class)) }\n    assertEquals(PolygonAnnotation.ID_KEY, manager.getAnnotationIdKey())\n    verify { style.addPersistentLayer(any(), null) }\n    every { style.styleLayerExists(\"test_layer\") } returns true\n\n    manager = PolygonAnnotationManager(delegateProvider, AnnotationConfig(\"test_layer\"))\n    verify { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n\n    manager.addClickListener(mockk())\n    manager.addDragListener(mockk())\n    manager.addLongClickListener(mockk())\n    assertEquals(1, manager.dragListeners.size)\n    assertEquals(1, manager.clickListeners.size)\n    assertEquals(1, manager.longClickListeners.size)\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    manager.onDestroy()\n    verify { style.removeStyleLayer(any()) }\n    verify { style.removeStyleSource(any()) }\n    assertTrue(manager.dragListeners.isEmpty())\n    assertTrue(manager.clickListeners.isEmpty())\n    assertTrue(manager.longClickListeners.isEmpty())\n  }\n\n  @Test\n  fun initializeBeforeStyleLoad() {\n    every { style.styleLayerExists(\"test_layer\") } returns true\n    val captureCallback = slot<(MapboxStyleManager) -> Unit>()\n    every { delegateProvider.getStyle(capture(captureCallback)) } just Runs\n    manager = PolygonAnnotationManager(delegateProvider, AnnotationConfig(\"test_layer\"))\n    // Style is not loaded, still create and add layer to style as it's persistent layer\n    verify(exactly = 1) { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n    every { delegateProvider.getStyle(capture(captureCallback)) } answers {\n      captureCallback.captured.invoke(style)\n    }\n    manager.create(\n      PolygonAnnotationOptions()\n        .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    // Style is loaded, will create and add layer to style while creating annotations\n    verify(exactly = 1) { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n  }\n\n  @Test\n  fun createWithGeoJsonOptions() {\n    manager = PolygonAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0\n        )\n      )\n    )\n\n    val sourceString = manager.source.toString()\n    assertTrue(sourceString.contains(\"maxzoom = 10\"))\n    assertTrue(sourceString.contains(\"lineMetrics = true\"))\n    assertTrue(sourceString.contains(\"buffer = 20\"))\n    assertTrue(sourceString.contains(\"tolerance = 10.0\"))\n  }\n\n  @Test\n  fun create() {\n    val annotation = manager.create(\n      PolygonAnnotationOptions()\n        .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    assertEquals(annotation, manager.annotations[0])\n  }\n\n  @Test\n  fun createFromFeature() {\n    val featureCollection =\n      FeatureCollection.fromFeature(Feature.fromGeometry(Polygon.fromLngLats(listOf(listOf(Point.fromLngLat(0.0, 0.0))))))\n    val annotations = manager.create(featureCollection.toJson())\n    assertEquals(annotations.first(), manager.annotations[0])\n    val annotations1 = manager.create(featureCollection)\n    assertEquals(annotations1.first(), manager.annotations[1])\n  }\n\n  @Test\n  fun createList() {\n    val list = listOf(\n      PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))),\n      PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n  }\n\n  @Test\n  fun update() {\n    val annotation = manager.create(PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))))\n    assertEquals(annotation, manager.annotations[0])\n    annotation.points = listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n  }\n\n  @Test\n  fun annotationPropertiesUpdate() {\n    val annotation = manager.create(PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))))\n\n    annotation.fillConstructBridgeGuardRail = true\n    assertEquals(true, annotation.fillConstructBridgeGuardRail)\n    annotation.fillConstructBridgeGuardRail = null\n    assertNull(annotation.fillConstructBridgeGuardRail)\n\n    annotation.fillSortKey = 1.0\n    assertEquals(1.0, annotation.fillSortKey)\n    annotation.fillSortKey = null\n    assertNull(annotation.fillSortKey)\n\n    annotation.fillBridgeGuardRailColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.fillBridgeGuardRailColorInt)\n    annotation.fillBridgeGuardRailColorInt = null\n    assertNull(annotation.fillBridgeGuardRailColorInt)\n\n    annotation.fillBridgeGuardRailColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.fillBridgeGuardRailColorString)\n    annotation.fillBridgeGuardRailColorString = null\n    assertNull(annotation.fillBridgeGuardRailColorString)\n\n    annotation.fillColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.fillColorInt)\n    annotation.fillColorInt = null\n    assertNull(annotation.fillColorInt)\n\n    annotation.fillColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.fillColorString)\n    annotation.fillColorString = null\n    assertNull(annotation.fillColorString)\n\n    annotation.fillOpacity = 1.0\n    assertEquals(1.0, annotation.fillOpacity)\n    annotation.fillOpacity = null\n    assertNull(annotation.fillOpacity)\n\n    annotation.fillOutlineColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.fillOutlineColorInt)\n    annotation.fillOutlineColorInt = null\n    assertNull(annotation.fillOutlineColorInt)\n\n    annotation.fillOutlineColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.fillOutlineColorString)\n    annotation.fillOutlineColorString = null\n    assertNull(annotation.fillOutlineColorString)\n\n    annotation.fillPattern = \"pedestrian-polygon\"\n    assertEquals(\"pedestrian-polygon\", annotation.fillPattern)\n    annotation.fillPattern = null\n    assertNull(annotation.fillPattern)\n\n    annotation.fillTunnelStructureColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.fillTunnelStructureColorInt)\n    annotation.fillTunnelStructureColorInt = null\n    assertNull(annotation.fillTunnelStructureColorInt)\n\n    annotation.fillTunnelStructureColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.fillTunnelStructureColorString)\n    annotation.fillTunnelStructureColorString = null\n    assertNull(annotation.fillTunnelStructureColorString)\n\n    annotation.fillZOffset = 0.0\n    assertEquals(0.0, annotation.fillZOffset)\n    annotation.fillZOffset = null\n    assertNull(annotation.fillZOffset)\n\n    annotation.fillBridgeGuardRailColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.fillBridgeGuardRailColorUseTheme)\n    annotation.fillBridgeGuardRailColorUseTheme = null\n    assertNull(annotation.fillBridgeGuardRailColorUseTheme)\n\n    annotation.fillColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.fillColorUseTheme)\n    annotation.fillColorUseTheme = null\n    assertNull(annotation.fillColorUseTheme)\n\n    annotation.fillOutlineColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.fillOutlineColorUseTheme)\n    annotation.fillOutlineColorUseTheme = null\n    assertNull(annotation.fillOutlineColorUseTheme)\n\n    annotation.fillTunnelStructureColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.fillTunnelStructureColorUseTheme)\n    annotation.fillTunnelStructureColorUseTheme = null\n    assertNull(annotation.fillTunnelStructureColorUseTheme)\n  }\n\n  @Test\n  fun updateList() {\n    val list = listOf(\n      PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))),\n      PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n    annotations[0].points = listOf(listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(1.0, 1.0)))\n    annotations[1].points = listOf(listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(1.0, 1.0)))\n    manager.update(annotations)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n  }\n\n  @Test\n  fun delete() {\n    val annotation = manager.create(\n      PolygonAnnotationOptions()\n        .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun deleteList() {\n    val list = listOf(\n      PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))),\n      PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n\n    manager.delete(annotations)\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun deleteAll() {\n    val list = listOf(\n      PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))),\n      PolygonAnnotationOptions().withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n\n    manager.deleteAll()\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun clickWithNoAnnotation() {\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      ClickInteraction.layer(id = customLayerId, filter = any(), onClick = capture(onClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = PolygonAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n\n    val listener = mockk<OnPolygonAnnotationClickListener>()\n    every { listener.onAnnotationClick(any()) } returns false\n    manager.addClickListener(listener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolygonAnnotation.ID_KEY, \"incorrectId\")\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify(exactly = 0) { listener.onAnnotationClick(any()) }\n    unmockkObject(ClickInteraction.Companion)\n  }\n\n  @Test\n  fun click() {\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      ClickInteraction.layer(id = customLayerId, filter = any(), onClick = capture(onClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = PolygonAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    val annotation = manager.create(\n      PolygonAnnotationOptions()\n        .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPolygonAnnotationClickListener>()\n    every { listener.onAnnotationClick(any()) } returns true\n    manager.addClickListener(listener)\n\n    val interactionListener = mockk<OnPolygonAnnotationInteractionListener>()\n    every { interactionListener.onSelectAnnotation(any()) } just Runs\n    every { interactionListener.onDeselectAnnotation(any()) } just Runs\n    manager.addInteractionListener(interactionListener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolygonAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n   onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationClick(annotation) }\n    verify { interactionListener.onSelectAnnotation(annotation) }\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolygonAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(annotation.id),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { interactionListener.onDeselectAnnotation(annotation) }\n\n    manager.removeClickListener(listener)\n    assertTrue(manager.clickListeners.isEmpty())\n    manager.removeInteractionListener(interactionListener)\n    assertTrue(manager.interactionListener.isEmpty())\n    unmockkObject(ClickInteraction.Companion)\n  }\n\n  @Test\n  fun longClick() {\n    mockkObject(LongClickInteraction.Companion)\n    val onLongClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      LongClickInteraction.layer(id = customLayerId, filter = any(), onLongClick = capture(onLongClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      LongClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onLongClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = PolygonAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n\n    val annotation = manager.create(\n      PolygonAnnotationOptions()\n        .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPolygonAnnotationLongClickListener>()\n    every { listener.onAnnotationLongClick(any()) } returns false\n    manager.addLongClickListener(listener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolygonAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onLongClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationLongClick(annotation) }\n\n    manager.removeLongClickListener(listener)\n    assertTrue(manager.longClickListeners.isEmpty())\n    unmockkObject(LongClickInteraction.Companion)\n  }\n\n  @Test\n  fun drag() {\n    mockkObject(DragInteraction.Companion)\n    val onDragBeginLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val onDragSlot = slot<((InteractionContext) -> Unit)>()\n    val onDragEndSlot = slot<((InteractionContext) -> Unit)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      DragInteraction.layer(\n        id = customLayerId,\n        filter = any(),\n        onDragBegin = capture(onDragBeginLayerIdSlot),\n        onDrag = capture(onDragSlot),\n        onDragEnd = capture(onDragEndSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      DragInteraction.layer(\n        id = any(),\n        filter = any(),\n        onDragBegin = { _, _ -> return@layer false },\n        onDrag = { },\n        onDragEnd = { }\n      )\n    } returns mockk()\n    val manager = PolygonAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    manager.onSizeChanged(100, 100)\n    val annotation = manager.create(\n      PolygonAnnotationOptions()\n        .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    assertEquals(annotation, manager.annotations[0])\n\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPolygonAnnotationDragListener>(relaxed = true)\n    manager.addDragListener(listener)\n\n    annotation.isDraggable = true\n    val pointF = PointF(0f, 0f)\n    every { moveGestureDetector.pointersCount } returns 1\n    every { moveGestureDetector.focalPoint } returns pointF\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolygonAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onDragBeginLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragStarted(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    val moveDistancesObject = mockk<MoveDistancesObject>()\n    every { moveDistancesObject.currentX } returns 1f\n    every { moveDistancesObject.currentY } returns 1f\n    every { moveDistancesObject.distanceXSinceLast } returns 1f\n    every { moveDistancesObject.distanceYSinceLast } returns 1f\n    every { moveGestureDetector.getMoveObject(any()) } returns moveDistancesObject\n    onDragSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDrag(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    onDragEndSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragFinished(annotation) }\n\n    manager.removeDragListener(listener)\n    assertTrue(manager.dragListeners.isEmpty())\n    assertEquals(1, manager.annotations.size)\n\n    // Verify update after drag\n    annotation.points = listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n\n    // Verify delete after drag\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n    unmockkObject(DragInteraction.Companion)\n  }\n\n  @Test\n  fun testScaleDoesNotTriggerDrag() {\n    mockkObject(DragInteraction.Companion)\n    val onDragBeginLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val onDragSlot = slot<((InteractionContext) -> Unit)>()\n    val onDragEndSlot = slot<((InteractionContext) -> Unit)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      DragInteraction.layer(\n        id = customLayerId,\n        filter = any(),\n        onDragBegin = capture(onDragBeginLayerIdSlot),\n        onDrag = capture(onDragSlot),\n        onDragEnd = capture(onDragEndSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      DragInteraction.layer(\n        id = any(),\n        filter = any(),\n        onDragBegin = { _, _ -> return@layer false },\n        onDrag = { },\n        onDragEnd = { }\n      )\n    } returns mockk()\n    every { mapInteractionDelegate.dispatch(any()) } just runs\n    val manager = PolygonAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    manager.onSizeChanged(100, 100)\n    val annotation = manager.create(\n      PolygonAnnotationOptions()\n        .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    )\n    assertEquals(annotation, manager.annotations[0])\n\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPolygonAnnotationDragListener>(relaxed = true)\n    manager.addDragListener(listener)\n\n    annotation.isDraggable = true\n    val pointF = PointF(0f, 0f)\n    every { moveGestureDetector.pointersCount } returns 2\n    every { moveGestureDetector.focalPoint } returns pointF\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolygonAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onDragBeginLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragStarted(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    val moveDistancesObject = mockk<MoveDistancesObject>()\n    every { moveDistancesObject.currentX } returns 1f\n    every { moveDistancesObject.currentY } returns 1f\n    every { moveDistancesObject.distanceXSinceLast } returns 1f\n    every { moveDistancesObject.distanceYSinceLast } returns 1f\n    every { moveGestureDetector.getMoveObject(any()) } returns moveDistancesObject\n    onDragSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify(exactly = 0) { listener.onAnnotationDrag(annotation) }\n    verify(exactly = 1) { listener.onAnnotationDragFinished(annotation) }\n\n    manager.removeDragListener(listener)\n    assertTrue(manager.dragListeners.isEmpty())\n    assertEquals(1, manager.annotations.size)\n\n    // Verify update after drag\n    annotation.points = listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0)))\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n\n    // Verify delete after drag\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n    unmockkObject(DragInteraction.Companion)\n  }\n\n  @Test\n  fun testFillConstructBridgeGuardRailLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillConstructBridgeGuardRail(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillConstructBridgeGuardRail(true)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillConstructBridgeGuardRail(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)) }\n    verify(exactly = 1) { manager.dragLayer.fillConstructBridgeGuardRail(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillConstructBridgeGuardRail(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)) }\n    verify(exactly = 1) { manager.dragLayer.fillConstructBridgeGuardRail(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)) }\n  }\n\n  @Test\n  fun testFillConstructBridgeGuardRailInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillConstructBridgeGuardRail(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillConstructBridgeGuardRail = true\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillConstructBridgeGuardRail(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)) }\n    verify(exactly = 1) { manager.dragLayer.fillConstructBridgeGuardRail(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_CONSTRUCT_BRIDGE_GUARD_RAIL)) }\n  }\n\n  @Test\n  fun testFillSortKeyLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillSortKey(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillSortKey(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillSortKey(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.fillSortKey(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillSortKey(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.fillSortKey(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)) }\n  }\n\n  @Test\n  fun testFillSortKeyInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillSortKey(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillSortKey = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillSortKey(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.fillSortKey(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_SORT_KEY)) }\n  }\n\n  @Test\n  fun testFillBridgeGuardRailColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillBridgeGuardRailColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n  }\n\n  @Test\n  fun testFillBridgeGuardRailColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillBridgeGuardRailColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n  }\n\n  @Test\n  fun testFillBridgeGuardRailColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillBridgeGuardRailColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillBridgeGuardRailColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR)) }\n  }\n\n  @Test\n  fun testFillColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n  }\n\n  @Test\n  fun testFillColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n  }\n\n  @Test\n  fun testFillColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR)) }\n  }\n\n  @Test\n  fun testFillOpacityLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillOpacity(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillOpacity(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOpacity(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.fillOpacity(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOpacity(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.fillOpacity(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)) }\n  }\n\n  @Test\n  fun testFillOpacityInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillOpacity(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillOpacity = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOpacity(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.fillOpacity(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OPACITY)) }\n  }\n\n  @Test\n  fun testFillOutlineColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillOutlineColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n  }\n\n  @Test\n  fun testFillOutlineColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillOutlineColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n  }\n\n  @Test\n  fun testFillOutlineColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillOutlineColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillOutlineColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR)) }\n  }\n\n  @Test\n  fun testFillPatternLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillPattern(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillPattern(\"pedestrian-polygon\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillPattern(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)) }\n    verify(exactly = 1) { manager.dragLayer.fillPattern(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillPattern(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)) }\n    verify(exactly = 1) { manager.dragLayer.fillPattern(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)) }\n  }\n\n  @Test\n  fun testFillPatternInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillPattern(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillPattern = \"pedestrian-polygon\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillPattern(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)) }\n    verify(exactly = 1) { manager.dragLayer.fillPattern(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_PATTERN)) }\n  }\n\n  @Test\n  fun testFillTunnelStructureColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillTunnelStructureColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n  }\n\n  @Test\n  fun testFillTunnelStructureColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillTunnelStructureColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n  }\n\n  @Test\n  fun testFillTunnelStructureColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillTunnelStructureColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.fillTunnelStructureColor(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR)) }\n  }\n\n  @Test\n  fun testFillZOffsetLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillZOffset(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillZOffset(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillZOffset(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.fillZOffset(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillZOffset(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.fillZOffset(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)) }\n  }\n\n  @Test\n  fun testFillZOffsetInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillZOffset(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillZOffset = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillZOffset(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.fillZOffset(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_Z_OFFSET)) }\n  }\n\n  @Test\n  fun testFillBridgeGuardRailColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillBridgeGuardRailColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillBridgeGuardRailColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillBridgeGuardRailColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillBridgeGuardRailColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillBridgeGuardRailColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillBridgeGuardRailColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testFillBridgeGuardRailColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillBridgeGuardRailColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillBridgeGuardRailColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillBridgeGuardRailColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillBridgeGuardRailColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_BRIDGE_GUARD_RAIL_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testFillColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testFillColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testFillOutlineColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillOutlineColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillOutlineColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOutlineColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillOutlineColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOutlineColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillOutlineColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testFillOutlineColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillOutlineColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillOutlineColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillOutlineColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillOutlineColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_OUTLINE_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testFillTunnelStructureColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillTunnelStructureColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n      .withFillTunnelStructureColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillTunnelStructureColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillTunnelStructureColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillTunnelStructureColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillTunnelStructureColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testFillTunnelStructureColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.fillTunnelStructureColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)) }\n    val options = PolygonAnnotationOptions()\n      .withPoints(listOf(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(1.0, 1.0))))\n    manager.fillTunnelStructureColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.fillTunnelStructureColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.fillTunnelStructureColorUseTheme(Expression.get(PolygonAnnotationOptions.PROPERTY_FILL_TUNNEL_STRUCTURE_COLOR_USE_THEME)) }\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/test/java/com/mapbox/maps/plugin/annotation/generated/PolylineAnnotationManagerTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.annotation.generated\n\nimport android.graphics.Color\nimport android.graphics.PointF\nimport com.google.gson.JsonObject\nimport com.mapbox.android.gestures.MoveDistancesObject\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.FeatureCollection\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.layers.addPersistentLayer\nimport com.mapbox.maps.extension.style.layers.generated.LineLayer\nimport com.mapbox.maps.extension.style.layers.properties.generated.*\nimport com.mapbox.maps.extension.style.sources.addSource\nimport com.mapbox.maps.extension.style.sources.generated.GeoJsonSource\nimport com.mapbox.maps.extension.style.sources.getSource\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.plugin.annotation.*\nimport com.mapbox.maps.plugin.delegates.*\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@OptIn(MapboxExperimental::class)\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowProjection::class])\nclass PolylineAnnotationManagerTest {\n  private val delegateProvider: MapDelegateProvider = mockk()\n  private val style: MapboxStyleManager = mockk()\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate = mockk()\n  private val mapInteractionDelegate: MapInteractionDelegate = mockk()\n  private val gesturesPlugin: GesturesPlugin = mockk()\n  private val moveGestureDetector: MoveGestureDetector = mockk()\n  private val layer: LineLayer = mockk()\n  private val source: GeoJsonSource = mockk()\n  private val dragLayer: LineLayer = mockk()\n  private val dragSource: GeoJsonSource = mockk()\n  private val feature = mockk<Feature>()\n\n  private lateinit var manager: PolylineAnnotationManager\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.extension.style.layers.LayerUtils\")\n    mockkStatic(\"com.mapbox.maps.extension.style.sources.SourceUtils\")\n    mockkStatic(Projection::class)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { delegateProvider.mapStyleManagerDelegate } returns style\n    every { style.addSource(any()) } just Runs\n    every { style.getSource(any()) } returns null\n    every { style.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { style.addPersistentLayer(any(), any()) } just Runs\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns mockk()\n    every { style.styleSourceExists(any()) } returns false\n    every { style.styleLayerExists(any()) } returns false\n    every { style.removeStyleLayer(any()) } returns mockk()\n    every { style.removeStyleSource(any()) } returns mockk()\n    every { style.pixelRatio } returns 1.0f\n    every { delegateProvider.mapPluginProviderDelegate.getPlugin<GesturesPlugin>(any()) } returns gesturesPlugin\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapInteractionDelegate } returns mapInteractionDelegate\n    every { delegateProvider.mapFeatureQueryDelegate } returns mockk()\n    every { mapInteractionDelegate.addInteraction(any()) } returns Cancelable { }\n    every { gesturesPlugin.getGesturesManager().moveGestureDetector } returns moveGestureDetector\n    every { mapCameraManagerDelegate.coordinateForPixel(any()) } returns Point.fromLngLat(0.0, 0.0)\n    every { mapCameraManagerDelegate.pixelForCoordinate(any()) } returns ScreenCoordinate(1.0, 1.0)\n    every { mapCameraManagerDelegate.cameraState } returns mockk(relaxed = true)\n    every { layer.layerId } returns \"layer0\"\n    every { source.sourceId } returns \"source0\"\n    every { source.featureCollection(any()) } answers { source }\n\n    manager = PolylineAnnotationManager(delegateProvider)\n    manager.layer = layer\n    manager.source = source\n    manager.dragLayer = dragLayer\n    manager.dragSource = dragSource\n    every { layer.lineElevationGroundScale(any<Expression>()) } answers { layer }\n    every { dragLayer.lineElevationGroundScale(any<Expression>()) } answers { dragLayer }\n    every { layer.lineJoin(any<Expression>()) } answers { layer }\n    every { dragLayer.lineJoin(any<Expression>()) } answers { dragLayer }\n    every { layer.lineSortKey(any<Expression>()) } answers { layer }\n    every { dragLayer.lineSortKey(any<Expression>()) } answers { dragLayer }\n    every { layer.lineZOffset(any<Expression>()) } answers { layer }\n    every { dragLayer.lineZOffset(any<Expression>()) } answers { dragLayer }\n    every { layer.lineBlur(any<Expression>()) } answers { layer }\n    every { dragLayer.lineBlur(any<Expression>()) } answers { dragLayer }\n    every { layer.lineBorderColor(any<Expression>()) } answers { layer }\n    every { dragLayer.lineBorderColor(any<Expression>()) } answers { dragLayer }\n    every { layer.lineBorderWidth(any<Expression>()) } answers { layer }\n    every { dragLayer.lineBorderWidth(any<Expression>()) } answers { dragLayer }\n    every { layer.lineColor(any<Expression>()) } answers { layer }\n    every { dragLayer.lineColor(any<Expression>()) } answers { dragLayer }\n    every { layer.lineEmissiveStrength(any<Expression>()) } answers { layer }\n    every { dragLayer.lineEmissiveStrength(any<Expression>()) } answers { dragLayer }\n    every { layer.lineGapWidth(any<Expression>()) } answers { layer }\n    every { dragLayer.lineGapWidth(any<Expression>()) } answers { dragLayer }\n    every { layer.lineOffset(any<Expression>()) } answers { layer }\n    every { dragLayer.lineOffset(any<Expression>()) } answers { dragLayer }\n    every { layer.lineOpacity(any<Expression>()) } answers { layer }\n    every { dragLayer.lineOpacity(any<Expression>()) } answers { dragLayer }\n    every { layer.linePattern(any<Expression>()) } answers { layer }\n    every { dragLayer.linePattern(any<Expression>()) } answers { dragLayer }\n    every { layer.lineWidth(any<Expression>()) } answers { layer }\n    every { dragLayer.lineWidth(any<Expression>()) } answers { dragLayer }\n    every { layer.lineBorderColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.lineBorderColorUseTheme(any<Expression>()) } answers { dragLayer }\n    every { layer.lineColorUseTheme(any<Expression>()) } answers { layer }\n    every { dragLayer.lineColorUseTheme(any<Expression>()) } answers { dragLayer }\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkAll()\n  }\n\n  @Test\n  fun initialize() {\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(ClickInteraction::class)) }\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(LongClickInteraction::class)) }\n    verify(exactly = 2) { mapInteractionDelegate.addInteraction(ofType(DragInteraction::class)) }\n    assertEquals(PolylineAnnotation.ID_KEY, manager.getAnnotationIdKey())\n    verify { style.addPersistentLayer(any(), null) }\n    every { style.styleLayerExists(\"test_layer\") } returns true\n\n    manager = PolylineAnnotationManager(delegateProvider, AnnotationConfig(\"test_layer\"))\n    verify { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n\n    manager.addClickListener(mockk())\n    manager.addDragListener(mockk())\n    manager.addLongClickListener(mockk())\n    assertEquals(1, manager.dragListeners.size)\n    assertEquals(1, manager.clickListeners.size)\n    assertEquals(1, manager.longClickListeners.size)\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    manager.onDestroy()\n    verify { style.removeStyleLayer(any()) }\n    verify { style.removeStyleSource(any()) }\n    assertTrue(manager.dragListeners.isEmpty())\n    assertTrue(manager.clickListeners.isEmpty())\n    assertTrue(manager.longClickListeners.isEmpty())\n  }\n\n  @Test\n  fun initializeBeforeStyleLoad() {\n    every { style.styleLayerExists(\"test_layer\") } returns true\n    val captureCallback = slot<(MapboxStyleManager) -> Unit>()\n    every { delegateProvider.getStyle(capture(captureCallback)) } just Runs\n    manager = PolylineAnnotationManager(delegateProvider, AnnotationConfig(\"test_layer\"))\n    // Style is not loaded, still create and add layer to style as it's persistent layer\n    verify(exactly = 1) { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n    every { delegateProvider.getStyle(capture(captureCallback)) } answers {\n      captureCallback.captured.invoke(style)\n    }\n    manager.create(\n      PolylineAnnotationOptions()\n        .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    // Style is loaded, will create and add layer to style while creating annotations\n    verify(exactly = 1) { style.addPersistentLayer(any(), LayerPosition(null, \"test_layer\", null)) }\n  }\n\n  @Test\n  fun createWithGeoJsonOptions() {\n    manager = PolylineAnnotationManager(\n      delegateProvider,\n      AnnotationConfig(\n        annotationSourceOptions = AnnotationSourceOptions(\n          10, 20L, true, 10.0\n        )\n      )\n    )\n\n    val sourceString = manager.source.toString()\n    assertTrue(sourceString.contains(\"maxzoom = 10\"))\n    assertTrue(sourceString.contains(\"lineMetrics = true\"))\n    assertTrue(sourceString.contains(\"buffer = 20\"))\n    assertTrue(sourceString.contains(\"tolerance = 10.0\"))\n  }\n\n  @Test\n  fun create() {\n    val annotation = manager.create(\n      PolylineAnnotationOptions()\n        .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    assertEquals(annotation, manager.annotations[0])\n  }\n\n  @Test\n  fun createFromFeature() {\n    val featureCollection =\n      FeatureCollection.fromFeature(Feature.fromGeometry(LineString.fromLngLats(listOf(Point.fromLngLat(0.0, 0.0)))))\n    val annotations = manager.create(featureCollection.toJson())\n    assertEquals(annotations.first(), manager.annotations[0])\n    val annotations1 = manager.create(featureCollection)\n    assertEquals(annotations1.first(), manager.annotations[1])\n  }\n\n  @Test\n  fun createList() {\n    val list = listOf(\n      PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))),\n      PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n  }\n\n  @Test\n  fun update() {\n    val annotation = manager.create(PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))))\n    assertEquals(annotation, manager.annotations[0])\n    annotation.points = listOf(Point.fromLngLat(1.0, 1.0), Point.fromLngLat(1.0, 1.0))\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n  }\n\n  @Test\n  fun annotationPropertiesUpdate() {\n    val annotation = manager.create(PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))))\n\n    annotation.lineElevationGroundScale = 0.0\n    assertEquals(0.0, annotation.lineElevationGroundScale)\n    annotation.lineElevationGroundScale = null\n    assertNull(annotation.lineElevationGroundScale)\n\n    annotation.lineJoin = LineJoin.BEVEL\n    assertEquals(LineJoin.BEVEL, annotation.lineJoin)\n    annotation.lineJoin = null\n    assertNull(annotation.lineJoin)\n\n    annotation.lineSortKey = 1.0\n    assertEquals(1.0, annotation.lineSortKey)\n    annotation.lineSortKey = null\n    assertNull(annotation.lineSortKey)\n\n    annotation.lineZOffset = 0.0\n    assertEquals(0.0, annotation.lineZOffset)\n    annotation.lineZOffset = null\n    assertNull(annotation.lineZOffset)\n\n    annotation.lineBlur = 0.0\n    assertEquals(0.0, annotation.lineBlur)\n    annotation.lineBlur = null\n    assertNull(annotation.lineBlur)\n\n    annotation.lineBorderColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.lineBorderColorInt)\n    annotation.lineBorderColorInt = null\n    assertNull(annotation.lineBorderColorInt)\n\n    annotation.lineBorderColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.lineBorderColorString)\n    annotation.lineBorderColorString = null\n    assertNull(annotation.lineBorderColorString)\n\n    annotation.lineBorderWidth = 0.0\n    assertEquals(0.0, annotation.lineBorderWidth)\n    annotation.lineBorderWidth = null\n    assertNull(annotation.lineBorderWidth)\n\n    annotation.lineColorInt = Color.BLACK\n    assertEquals(Color.BLACK, annotation.lineColorInt)\n    annotation.lineColorInt = null\n    assertNull(annotation.lineColorInt)\n\n    annotation.lineColorString = ColorUtils.colorToRgbaString(Color.YELLOW)\n    assertEquals(ColorUtils.colorToRgbaString(Color.YELLOW), annotation.lineColorString)\n    annotation.lineColorString = null\n    assertNull(annotation.lineColorString)\n\n    annotation.lineEmissiveStrength = 0.0\n    assertEquals(0.0, annotation.lineEmissiveStrength)\n    annotation.lineEmissiveStrength = null\n    assertNull(annotation.lineEmissiveStrength)\n\n    annotation.lineGapWidth = 0.0\n    assertEquals(0.0, annotation.lineGapWidth)\n    annotation.lineGapWidth = null\n    assertNull(annotation.lineGapWidth)\n\n    annotation.lineOffset = 0.0\n    assertEquals(0.0, annotation.lineOffset)\n    annotation.lineOffset = null\n    assertNull(annotation.lineOffset)\n\n    annotation.lineOpacity = 1.0\n    assertEquals(1.0, annotation.lineOpacity)\n    annotation.lineOpacity = null\n    assertNull(annotation.lineOpacity)\n\n    annotation.linePattern = \"pedestrian-polygon\"\n    assertEquals(\"pedestrian-polygon\", annotation.linePattern)\n    annotation.linePattern = null\n    assertNull(annotation.linePattern)\n\n    annotation.lineWidth = 1.0\n    assertEquals(1.0, annotation.lineWidth)\n    annotation.lineWidth = null\n    assertNull(annotation.lineWidth)\n\n    annotation.lineBorderColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.lineBorderColorUseTheme)\n    annotation.lineBorderColorUseTheme = null\n    assertNull(annotation.lineBorderColorUseTheme)\n\n    annotation.lineColorUseTheme = \"default\"\n    assertEquals(\"default\", annotation.lineColorUseTheme)\n    annotation.lineColorUseTheme = null\n    assertNull(annotation.lineColorUseTheme)\n  }\n\n  @Test\n  fun updateList() {\n    val list = listOf(\n      PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))),\n      PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n    annotations[0].points = listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(1.0, 0.0))\n    annotations[1].points = listOf(Point.fromLngLat(1.0, 0.0), Point.fromLngLat(1.0, 0.0))\n    manager.update(annotations)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n  }\n\n  @Test\n  fun delete() {\n    val annotation = manager.create(\n      PolylineAnnotationOptions()\n        .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun deleteList() {\n    val list = listOf(\n      PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))),\n      PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n\n    manager.delete(annotations)\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun deleteAll() {\n    val list = listOf(\n      PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0))),\n      PolylineAnnotationOptions().withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    val annotations = manager.create(list)\n    assertEquals(annotations[0], manager.annotations[0])\n    assertEquals(annotations[1], manager.annotations[1])\n\n    manager.deleteAll()\n    assertTrue(manager.annotations.isEmpty())\n  }\n\n  @Test\n  fun clickWithNoAnnotation() {\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      ClickInteraction.layer(id = customLayerId, filter = any(), onClick = capture(onClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = PolylineAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n\n    val listener = mockk<OnPolylineAnnotationClickListener>()\n    every { listener.onAnnotationClick(any()) } returns false\n    manager.addClickListener(listener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolylineAnnotation.ID_KEY, \"incorrectId\")\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify(exactly = 0) { listener.onAnnotationClick(any()) }\n    unmockkObject(ClickInteraction.Companion)\n  }\n\n  @Test\n  fun click() {\n    mockkObject(ClickInteraction.Companion)\n    val onClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      ClickInteraction.layer(id = customLayerId, filter = any(), onClick = capture(onClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      ClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = PolylineAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    val annotation = manager.create(\n      PolylineAnnotationOptions()\n        .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPolylineAnnotationClickListener>()\n    every { listener.onAnnotationClick(any()) } returns true\n    manager.addClickListener(listener)\n\n    val interactionListener = mockk<OnPolylineAnnotationInteractionListener>()\n    every { interactionListener.onSelectAnnotation(any()) } just Runs\n    every { interactionListener.onDeselectAnnotation(any()) } just Runs\n    manager.addInteractionListener(interactionListener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolylineAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n   onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationClick(annotation) }\n    verify { interactionListener.onSelectAnnotation(annotation) }\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolylineAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(annotation.id),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { interactionListener.onDeselectAnnotation(annotation) }\n\n    manager.removeClickListener(listener)\n    assertTrue(manager.clickListeners.isEmpty())\n    manager.removeInteractionListener(interactionListener)\n    assertTrue(manager.interactionListener.isEmpty())\n    unmockkObject(ClickInteraction.Companion)\n  }\n\n  @Test\n  fun longClick() {\n    mockkObject(LongClickInteraction.Companion)\n    val onLongClickLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      LongClickInteraction.layer(id = customLayerId, filter = any(), onLongClick = capture(onLongClickLayerIdSlot))\n    } answers {\n      mockk()\n    }\n    every {\n      LongClickInteraction.layer(\n        id = any(),\n        filter = any(),\n        onLongClick = { _, _ -> return@layer false }\n      )\n    } returns mockk()\n    val manager = PolylineAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n\n    val annotation = manager.create(\n      PolylineAnnotationOptions()\n        .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    assertEquals(annotation, manager.annotations[0])\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPolylineAnnotationLongClickListener>()\n    every { listener.onAnnotationLongClick(any()) } returns false\n    manager.addLongClickListener(listener)\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolylineAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onLongClickLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationLongClick(annotation) }\n\n    manager.removeLongClickListener(listener)\n    assertTrue(manager.longClickListeners.isEmpty())\n    unmockkObject(LongClickInteraction.Companion)\n  }\n\n  @Test\n  fun drag() {\n    mockkObject(DragInteraction.Companion)\n    val onDragBeginLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val onDragSlot = slot<((InteractionContext) -> Unit)>()\n    val onDragEndSlot = slot<((InteractionContext) -> Unit)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      DragInteraction.layer(\n        id = customLayerId,\n        filter = any(),\n        onDragBegin = capture(onDragBeginLayerIdSlot),\n        onDrag = capture(onDragSlot),\n        onDragEnd = capture(onDragEndSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      DragInteraction.layer(\n        id = any(),\n        filter = any(),\n        onDragBegin = { _, _ -> return@layer false },\n        onDrag = { },\n        onDragEnd = { }\n      )\n    } returns mockk()\n    val manager = PolylineAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    manager.onSizeChanged(100, 100)\n    val annotation = manager.create(\n      PolylineAnnotationOptions()\n        .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    assertEquals(annotation, manager.annotations[0])\n\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPolylineAnnotationDragListener>(relaxed = true)\n    manager.addDragListener(listener)\n\n    annotation.isDraggable = true\n    val pointF = PointF(0f, 0f)\n    every { moveGestureDetector.pointersCount } returns 1\n    every { moveGestureDetector.focalPoint } returns pointF\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolylineAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onDragBeginLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragStarted(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    val moveDistancesObject = mockk<MoveDistancesObject>()\n    every { moveDistancesObject.currentX } returns 1f\n    every { moveDistancesObject.currentY } returns 1f\n    every { moveDistancesObject.distanceXSinceLast } returns 1f\n    every { moveDistancesObject.distanceYSinceLast } returns 1f\n    every { moveGestureDetector.getMoveObject(any()) } returns moveDistancesObject\n    onDragSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDrag(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    onDragEndSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragFinished(annotation) }\n\n    manager.removeDragListener(listener)\n    assertTrue(manager.dragListeners.isEmpty())\n    assertEquals(1, manager.annotations.size)\n\n    // Verify update after drag\n    annotation.points = listOf(Point.fromLngLat(1.0, 1.0), Point.fromLngLat(1.0, 1.0))\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n\n    // Verify delete after drag\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n    unmockkObject(DragInteraction.Companion)\n  }\n\n  @Test\n  fun testScaleDoesNotTriggerDrag() {\n    mockkObject(DragInteraction.Companion)\n    val onDragBeginLayerIdSlot = slot<((FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean)>()\n    val onDragSlot = slot<((InteractionContext) -> Unit)>()\n    val onDragEndSlot = slot<((InteractionContext) -> Unit)>()\n    val customLayerId = \"customLayerId\"\n    every {\n      DragInteraction.layer(\n        id = customLayerId,\n        filter = any(),\n        onDragBegin = capture(onDragBeginLayerIdSlot),\n        onDrag = capture(onDragSlot),\n        onDragEnd = capture(onDragEndSlot)\n      )\n    } answers {\n      mockk()\n    }\n    every {\n      DragInteraction.layer(\n        id = any(),\n        filter = any(),\n        onDragBegin = { _, _ -> return@layer false },\n        onDrag = { },\n        onDragEnd = { }\n      )\n    } returns mockk()\n    every { mapInteractionDelegate.dispatch(any()) } just runs\n    val manager = PolylineAnnotationManager(\n      delegateProvider,\n      annotationConfig = AnnotationConfig(layerId = customLayerId)\n    )\n    manager.onSizeChanged(100, 100)\n    val annotation = manager.create(\n      PolylineAnnotationOptions()\n        .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    )\n    assertEquals(annotation, manager.annotations[0])\n\n    every { feature.getProperty(any()).asString } returns annotation.id\n\n    val listener = mockk<OnPolylineAnnotationDragListener>(relaxed = true)\n    manager.addDragListener(listener)\n\n    annotation.isDraggable = true\n    val pointF = PointF(0f, 0f)\n    every { moveGestureDetector.pointersCount } returns 2\n    every { moveGestureDetector.focalPoint } returns pointF\n\n    every { feature.properties() } returns JsonObject().apply {\n      addProperty(PolylineAnnotation.ID_KEY, annotation.id)\n    }\n    every { feature.id() } returns \"featureId\"\n    every { feature.geometry() } returns Point.fromLngLat(0.0, 0.0)\n\n    onDragBeginLayerIdSlot.captured.invoke(\n      FeaturesetFeature(\n        id = FeaturesetFeatureId(feature.id()!!, null),\n        descriptor = TypedFeaturesetDescriptor.Layer(customLayerId),\n        originalFeature = feature,\n        state = FeatureState { }\n      ),\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify { listener.onAnnotationDragStarted(annotation) }\n    assertEquals(1, manager.annotations.size)\n\n    val moveDistancesObject = mockk<MoveDistancesObject>()\n    every { moveDistancesObject.currentX } returns 1f\n    every { moveDistancesObject.currentY } returns 1f\n    every { moveDistancesObject.distanceXSinceLast } returns 1f\n    every { moveDistancesObject.distanceYSinceLast } returns 1f\n    every { moveGestureDetector.getMoveObject(any()) } returns moveDistancesObject\n    onDragSlot.captured.invoke(\n      InteractionContext(\n        CoordinateInfo(\n          Point.fromLngLat(0.0, 0.0),\n          true\n        ),\n        ScreenCoordinate(0.0, 0.0)\n      )\n    )\n    verify(exactly = 0) { listener.onAnnotationDrag(annotation) }\n    verify(exactly = 1) { listener.onAnnotationDragFinished(annotation) }\n\n    manager.removeDragListener(listener)\n    assertTrue(manager.dragListeners.isEmpty())\n    assertEquals(1, manager.annotations.size)\n\n    // Verify update after drag\n    annotation.points = listOf(Point.fromLngLat(1.0, 1.0), Point.fromLngLat(1.0, 1.0))\n    manager.update(annotation)\n    assertEquals(annotation, manager.annotations[0])\n\n    // Verify delete after drag\n    manager.delete(annotation)\n    assertTrue(manager.annotations.isEmpty())\n    unmockkObject(DragInteraction.Companion)\n  }\n\n  @Test\n  fun testLineElevationGroundScaleLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineElevationGroundScale(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineElevationGroundScale(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineElevationGroundScale(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)) }\n    verify(exactly = 1) { manager.dragLayer.lineElevationGroundScale(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineElevationGroundScale(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)) }\n    verify(exactly = 1) { manager.dragLayer.lineElevationGroundScale(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)) }\n  }\n\n  @Test\n  fun testLineElevationGroundScaleInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineElevationGroundScale(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineElevationGroundScale = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineElevationGroundScale(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)) }\n    verify(exactly = 1) { manager.dragLayer.lineElevationGroundScale(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_ELEVATION_GROUND_SCALE)) }\n  }\n\n  @Test\n  fun testLineJoinLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineJoin(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineJoin(LineJoin.MITER)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineJoin(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)) }\n    verify(exactly = 1) { manager.dragLayer.lineJoin(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineJoin(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)) }\n    verify(exactly = 1) { manager.dragLayer.lineJoin(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)) }\n  }\n\n  @Test\n  fun testLineJoinInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineJoin(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineJoin = LineJoin.MITER\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineJoin(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)) }\n    verify(exactly = 1) { manager.dragLayer.lineJoin(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_JOIN)) }\n  }\n\n  @Test\n  fun testLineSortKeyLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineSortKey(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineSortKey(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineSortKey(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.lineSortKey(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineSortKey(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.lineSortKey(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)) }\n  }\n\n  @Test\n  fun testLineSortKeyInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineSortKey(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineSortKey = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineSortKey(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)) }\n    verify(exactly = 1) { manager.dragLayer.lineSortKey(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_SORT_KEY)) }\n  }\n\n  @Test\n  fun testLineZOffsetLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineZOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineZOffset(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineZOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.lineZOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineZOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.lineZOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)) }\n  }\n\n  @Test\n  fun testLineZOffsetInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineZOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineZOffset = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineZOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.lineZOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_Z_OFFSET)) }\n  }\n\n  @Test\n  fun testLineBlurLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineBlur(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineBlur(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBlur(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.lineBlur(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBlur(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.lineBlur(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)) }\n  }\n\n  @Test\n  fun testLineBlurInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineBlur(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineBlur = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBlur(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)) }\n    verify(exactly = 1) { manager.dragLayer.lineBlur(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BLUR)) }\n  }\n\n  @Test\n  fun testLineBorderColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineBorderColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n  }\n\n  @Test\n  fun testLineBorderColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineBorderColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n  }\n\n  @Test\n  fun testLineBorderColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineBorderColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.lineBorderColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR)) }\n  }\n\n  @Test\n  fun testLineBorderWidthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineBorderWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineBorderWidth(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineBorderWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineBorderWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)) }\n  }\n\n  @Test\n  fun testLineBorderWidthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineBorderWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineBorderWidth = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineBorderWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_WIDTH)) }\n  }\n\n  @Test\n  fun testLineColorIntLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineColor(Color.YELLOW)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n  }\n\n  @Test\n  fun testLineColorLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineColor(\"rgba(0, 0, 0, 1)\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n  }\n\n  @Test\n  fun testLineColorInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineColorString = \"rgba(0, 0, 0, 1)\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n    verify(exactly = 1) { manager.dragLayer.lineColor(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR)) }\n  }\n\n  @Test\n  fun testLineEmissiveStrengthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineEmissiveStrength(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineEmissiveStrength(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineEmissiveStrength(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineEmissiveStrength(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineEmissiveStrength(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineEmissiveStrength(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)) }\n  }\n\n  @Test\n  fun testLineEmissiveStrengthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineEmissiveStrength(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineEmissiveStrength = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineEmissiveStrength(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineEmissiveStrength(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_EMISSIVE_STRENGTH)) }\n  }\n\n  @Test\n  fun testLineGapWidthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineGapWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineGapWidth(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineGapWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineGapWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineGapWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineGapWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)) }\n  }\n\n  @Test\n  fun testLineGapWidthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineGapWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineGapWidth = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineGapWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineGapWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_GAP_WIDTH)) }\n  }\n\n  @Test\n  fun testLineOffsetLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineOffset(0.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.lineOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.lineOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)) }\n  }\n\n  @Test\n  fun testLineOffsetInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineOffset = 0.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)) }\n    verify(exactly = 1) { manager.dragLayer.lineOffset(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OFFSET)) }\n  }\n\n  @Test\n  fun testLineOpacityLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineOpacity(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineOpacity(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineOpacity(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.lineOpacity(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineOpacity(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.lineOpacity(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)) }\n  }\n\n  @Test\n  fun testLineOpacityInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineOpacity(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineOpacity = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineOpacity(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)) }\n    verify(exactly = 1) { manager.dragLayer.lineOpacity(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_OPACITY)) }\n  }\n\n  @Test\n  fun testLinePatternLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.linePattern(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLinePattern(\"pedestrian-polygon\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.linePattern(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)) }\n    verify(exactly = 1) { manager.dragLayer.linePattern(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.linePattern(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)) }\n    verify(exactly = 1) { manager.dragLayer.linePattern(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)) }\n  }\n\n  @Test\n  fun testLinePatternInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.linePattern(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.linePattern = \"pedestrian-polygon\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.linePattern(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)) }\n    verify(exactly = 1) { manager.dragLayer.linePattern(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_PATTERN)) }\n  }\n\n  @Test\n  fun testLineWidthLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineWidth(1.0)\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)) }\n  }\n\n  @Test\n  fun testLineWidthInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineWidth = 1.0\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)) }\n    verify(exactly = 1) { manager.dragLayer.lineWidth(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_WIDTH)) }\n  }\n\n  @Test\n  fun testLineBorderColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineBorderColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineBorderColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.lineBorderColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.lineBorderColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testLineBorderColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineBorderColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineBorderColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineBorderColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.lineBorderColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_BORDER_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testLineColorUseThemeLayerProperty() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n      .withLineColorUseTheme(\"default\")\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.lineColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)) }\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.lineColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)) }\n  }\n\n  @Test\n  fun testLineColorUseThemeInAnnotationManager() {\n    every { style.styleSourceExists(any()) } returns true\n    every { style.styleLayerExists(any()) } returns true\n    verify(exactly = 0) { manager.layer.lineColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)) }\n    val options = PolylineAnnotationOptions()\n      .withPoints(listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)))\n    manager.lineColorUseTheme = \"default\"\n    manager.create(options)\n    verify(exactly = 1) { manager.layer.lineColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)) }\n    verify(exactly = 1) { manager.dragLayer.lineColorUseTheme(Expression.get(PolylineAnnotationOptions.PROPERTY_LINE_COLOR_USE_THEME)) }\n  }\n}"
  },
  {
    "path": "plugin-annotation/src/test/resources/robolectric.properties",
    "content": "sdk=28"
  },
  {
    "path": "plugin-attribution/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "plugin-attribution/README.md",
    "content": "## Mapbox Maps Attribution Plugin for Android\n\n### Overview\n\nThe Mapbox Maps Attribution Plugin for Android is an public library for displaying map attribution on top of a MapView. By default the plugin will show an 'i'-icon on top of the map in bottom-left corner. When clicked, an attribution dialog will be shown that lists all of the attributions for the currently loaded map style as well as links to `Improve this map` and `Telemetry settings` items. Please visit our [documentation](https://docs.mapbox.com/help/how-mapbox-works/attribution/) for more information on displaying source attribution.\n\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n![image](https://user-images.githubusercontent.com/2151639/94667028-8c1bf500-030e-11eb-9922-0a913c715940.gif)\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Attribution Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the attribution plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-attribution:11.22.0-rc.1'\n}\n```\n\n### Example\n\nCustomizing Mapbox Maps Attribution Plugin for Android could be done in two ways: by either providing your own version of the attribution plugin or by providing a custom AttributionDialogManager. The former is documented in [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md), the latter can be achieved with:\n\n```kotlin\nval plugin = mapView.attribution\nplugin.setCustomAttributionDialogManager(object : AttributionDialogManager {\n  override fun showAttribution(attributionModel: AttributionModel) {\n    // called when the attribution dialog should be shown using the AttributionModel data\n  }\n\n  override fun onStop() {\n    // called when the hosting activity is stopped\n  }\n})\n```\n\nMore concrete examples of the attribution plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-attribution/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.attribution {\n\n  public final class AttributionDialogManagerImpl implements com.mapbox.maps.plugin.attribution.AttributionDialogManager android.content.DialogInterface.OnClickListener {\n    ctor public AttributionDialogManagerImpl(android.content.Context context);\n    method public void onClick(android.content.DialogInterface dialog, int which);\n    method public void onStop();\n    method public void showAttribution(com.mapbox.maps.plugin.delegates.MapAttributionDelegate mapAttributionDelegate);\n  }\n\n  public final class AttributionUtils {\n    method public static com.mapbox.maps.plugin.attribution.AttributionPlugin getAttribution(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n  public final class AttributionViewImpl extends androidx.appcompat.widget.AppCompatImageView implements com.mapbox.maps.plugin.attribution.AttributionView {\n    ctor public AttributionViewImpl(android.content.Context context, android.util.AttributeSet? attrs = null, int defStyleAttr = 0);\n    ctor public AttributionViewImpl(android.content.Context context, android.util.AttributeSet? attrs = null);\n    ctor public AttributionViewImpl(android.content.Context context);\n    method public void setAttributionMargins(int left, int top, int right, int bottom);\n    method public void setEnable(boolean enabled);\n    method public void setGravity(int gravity);\n    method public void setIconColor(int color);\n    method public void setViewOnClickListener(android.view.View.OnClickListener listener);\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-attribution/api/plugin-attribution.api",
    "content": "public final class com/mapbox/maps/plugin/attribution/AttributionDialogManagerImpl : android/content/DialogInterface$OnClickListener, com/mapbox/maps/plugin/attribution/AttributionDialogManager {\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic fun onClick (Landroid/content/DialogInterface;I)V\n\tpublic fun onStop ()V\n\tpublic fun showAttribution (Lcom/mapbox/maps/plugin/delegates/MapAttributionDelegate;)V\n}\n\npublic final class com/mapbox/maps/plugin/attribution/AttributionUtils {\n\tpublic static final synthetic fun createAttributionPlugin ()Lcom/mapbox/maps/plugin/attribution/AttributionPlugin;\n\tpublic static final fun getAttribution (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/attribution/AttributionPlugin;\n}\n\npublic final class com/mapbox/maps/plugin/attribution/AttributionViewImpl : androidx/appcompat/widget/AppCompatImageView, com/mapbox/maps/plugin/attribution/AttributionView {\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;I)V\n\tpublic synthetic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun setAttributionMargins (IIII)V\n\tpublic fun setContentDescription (Ljava/lang/CharSequence;)V\n\tpublic fun setEnable (Z)V\n\tpublic fun setGravity (I)V\n\tpublic fun setIconColor (I)V\n\tpublic fun setViewOnClickListener (Landroid/view/View$OnClickListener;)V\n}\n\n"
  },
  {
    "path": "plugin-attribution/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.attribution\"\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    unitTests.apply {\n      isIncludeAndroidResources = true\n    }\n  }\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-attribution\"\n    artifactTitle = \"The attribution module for the Mapbox Maps SDK\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-attribution\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.mapbox.annotations)\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-attribution/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "plugin-attribution/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.kts.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "plugin-attribution/src/main/java/com/mapbox/maps/plugin/attribution/AttributionDialogManagerImpl.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimport android.content.ActivityNotFoundException\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.graphics.Color\nimport android.net.Uri\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ArrayAdapter\nimport android.widget.TextView\nimport android.widget.Toast\nimport androidx.annotation.VisibleForTesting\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.view.ContextThemeWrapper\nimport androidx.core.content.ContextCompat\nimport com.mapbox.common.geofencing.GeofencingUtilsUserConsentResponseCallback\nimport com.mapbox.maps.geofencing.MapGeofencingConsent\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.module.MapTelemetry\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\n\n/**\n * Responsible for managing attribution interactions on the map.\n *\n * When the user clicks the attribution icon, [AttributionDialogManagerImpl.showAttribution]} will be invoked.\n * An attribution dialog will be shown to the user with contents based on the attributions found in the map style.\n * Additionally an telemetry option item is shown to configure telemetry settings.\n *\n */\nclass AttributionDialogManagerImpl(\n  private val context: Context\n) : AttributionDialogManager, DialogInterface.OnClickListener {\n\n  private lateinit var attributionList: List<Attribution>\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var dialog: AlertDialog? = null\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var telemetryDialog: AlertDialog? = null\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var geofencingDialog: AlertDialog? = null\n  private var mapAttributionDelegate: MapAttributionDelegate? = null\n  private var telemetry: MapTelemetry? = null\n  private var geofencingConsent: MapGeofencingConsent? = null\n  /**\n   * Invoked when the map attribution should be shown to the end user\n   */\n  override fun showAttribution(mapAttributionDelegate: MapAttributionDelegate) {\n    this.mapAttributionDelegate = mapAttributionDelegate\n    this.telemetry = mapAttributionDelegate.telemetry()\n    this.geofencingConsent = mapAttributionDelegate.geofencingConsent()\n    val withMapboxGeofencingConsent = geofencingConsent?.shouldShowConsent() ?: false\n    this.attributionList =\n      mapAttributionDelegate.parseAttributions(context, AttributionParserConfig(withMapboxGeofencingConsent = withMapboxGeofencingConsent))\n    var isActivityFinishing = false\n    if (context is Activity) {\n      isActivityFinishing = context.isFinishing\n    }\n    // check if hosting activity isn't finishing\n    if (!isActivityFinishing) {\n      showAttributionDialog(attributionList)\n    }\n  }\n\n  /**\n   * Invoked when the map attribution dialog should be shown to the end user\n   *\n   * @param attributions an array of attribution titles\n   */\n  private fun showAttributionDialog(attributions: List<Attribution>) {\n    val builder = prepareDialogBuilder()\n    builder.setTitle(R.string.mapbox_attributionsDialogTitle)\n    val adapter: ArrayAdapter<Attribution> = object : ArrayAdapter<Attribution>(\n      context,\n      R.layout.mapbox_attribution_list_item, attributions\n    ) {\n      override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {\n        val view = super.getView(position, convertView, parent)\n        val attribution = attributions[position]\n        view.findViewById<TextView>(android.R.id.text1).apply {\n          // if attribution url is empty, we show them as disabled.\n          setTextColor(\n            if (attribution.url.isEmpty()) Color.GRAY else ContextCompat.getColor(\n              context,\n              R.color.mapbox_blue\n            )\n          )\n          text = attribution.title\n        }\n        return view\n      }\n    }\n    builder.setAdapter(adapter, this)\n    dialog = builder.show()\n  }\n\n  /**\n   * Called when someone selects an attribution or telemetry settings from the dialog\n   */\n  override fun onClick(dialog: DialogInterface, which: Int) {\n    val attribution = attributionList[which]\n    when (attribution.url) {\n        Attribution.ABOUT_TELEMETRY_URL -> showTelemetryDialog()\n        Attribution.GEOFENCING_URL_MARKER -> showGeofencingConsentDialog()\n        else -> showMapAttributionWebPage(attribution.url)\n    }\n  }\n\n  /**\n   * Called when the hosting activity is stopped\n   */\n  override fun onStop() {\n    dialog?.takeIf { it.isShowing }?.dismiss()\n    telemetryDialog?.takeIf { it.isShowing }?.dismiss()\n    geofencingDialog?.takeIf { it.isShowing }?.dismiss()\n  }\n\n  private fun showTelemetryDialog() {\n    val builder = prepareDialogBuilder()\n    builder.setTitle(R.string.mapbox_attributionTelemetryTitle)\n    builder.setMessage(R.string.mapbox_attributionTelemetryMessage)\n    builder.setPositiveButton(R.string.mapbox_attributionTelemetryPositive) { dialog, _ ->\n      telemetry?.userTelemetryRequestState = true\n      dialog.cancel()\n    }\n    builder.setNeutralButton(R.string.mapbox_attributionTelemetryNeutral) { dialog, _ ->\n      showWebPage(context.resources.getString(R.string.mapbox_telemetryLink))\n      dialog.cancel()\n    }\n    builder.setNegativeButton(R.string.mapbox_attributionTelemetryNegative) { dialog, _ ->\n      telemetry?.userTelemetryRequestState = false\n      dialog.cancel()\n    }\n    telemetryDialog = builder.show()\n  }\n\n  private fun showGeofencingConsentDialog() {\n    val builder = prepareDialogBuilder()\n    builder.setTitle(R.string.mapbox_attributionGeofencingTitle)\n    builder.setMessage(R.string.mapbox_attributionGeofencingMessage)\n    val isUserConsentGiven = geofencingConsent?.getUserConsent() ?: false\n    val positiveTextRes = if (isUserConsentGiven) R.string.mapbox_attributionGeofencingConsentedPositive else R.string.mapbox_attributionGeofencingRevokedPositive\n    val negativeTextRes = if (isUserConsentGiven) R.string.mapbox_attributionGeofencingConsentedNegative else R.string.mapbox_attributionGeofencingRevokedNegative\n    val callback = GeofencingUtilsUserConsentResponseCallback { result ->\n        result.error?.let { error ->\n          logW(\"GeofencingConsent\", \"Unable to set user consent: ${error.type}\")\n        }\n      }\n    builder.setPositiveButton(positiveTextRes) { dialog, _ ->\n      geofencingConsent?.setUserConsent(true, callback)\n      dialog.cancel()\n    }\n    builder.setNegativeButton(negativeTextRes) { dialog, _ ->\n      geofencingConsent?.setUserConsent(false, callback)\n      dialog.cancel()\n    }\n    geofencingDialog = builder.show()\n  }\n\n  private fun showMapAttributionWebPage(attributionUrl: String) {\n    var url = attributionUrl\n    mapAttributionDelegate?.let {\n      if (url.contains(FEEDBACK_KEY_WORD)) {\n        url = it.buildMapBoxFeedbackUrl(context)\n      }\n    }\n    if (url.isNotEmpty()) {\n      showWebPage(url)\n    }\n  }\n\n  private fun showWebPage(url: String) {\n    try {\n      val intent = Intent(Intent.ACTION_VIEW)\n      intent.data = Uri.parse(url)\n      context.startActivity(intent)\n    } catch (exception: ActivityNotFoundException) {\n      Toast.makeText(context, R.string.mapbox_attributionErrorNoBrowser, Toast.LENGTH_LONG).show()\n    } catch (t: Throwable) {\n      Toast.makeText(context, t.localizedMessage, Toast.LENGTH_LONG).show()\n    }\n  }\n\n  @SuppressLint(\"PrivateResource\")\n  private fun prepareDialogBuilder(): AlertDialog.Builder {\n    // using way from AOSP to determine if current theme used is AppCompat, see\n    // https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java;l=908\n    val a = context.obtainStyledAttributes(androidx.appcompat.R.styleable.AppCompatTheme)\n    val appCompatThemeUsed = try {\n      a.hasValue(androidx.appcompat.R.styleable.AppCompatTheme_windowActionBar)\n    } catch (_: Throwable) {\n      false\n    }\n    val builder = if (appCompatThemeUsed) {\n      AlertDialog.Builder(context)\n    } else {\n      AlertDialog.Builder(\n        // explicitly use Day-Night AppCompat theme if non AppCompat theme is used in activity\n        // noting that using ContextThemeWrapper should make sure we apply our theme on top of base one\n        ContextThemeWrapper(context, androidx.appcompat.R.style.Theme_AppCompat_DayNight_Dialog_Alert)\n      )\n    }\n    a.recycle()\n    return builder\n  }\n\n  private companion object {\n    private const val FEEDBACK_KEY_WORD = \"contribute\"\n  }\n}"
  },
  {
    "path": "plugin-attribution/src/main/java/com/mapbox/maps/plugin/attribution/AttributionExt.kt",
    "content": "@file:JvmName(\"AttributionUtils\")\n\npackage com.mapbox.maps.plugin.attribution\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val for MapView to get the Attribution View plugin instance.\n */\nval MapPluginProviderDelegate.attribution: AttributionPlugin\n  @JvmName(\"getAttribution\")\n  get() = this.getPlugin(Plugin.MAPBOX_ATTRIBUTION_PLUGIN_ID)!!\n\n/**\n * Static method to create instance of Mapbox attribution plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createAttributionPlugin(): AttributionPlugin {\n  return AttributionPluginImpl()\n}"
  },
  {
    "path": "plugin-attribution/src/main/java/com/mapbox/maps/plugin/attribution/AttributionPluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.attribution.generated.AttributionAttributeParser\nimport com.mapbox.maps.plugin.attribution.generated.AttributionSettings\nimport com.mapbox.maps.plugin.attribution.generated.AttributionSettingsBase\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\n\n/**\n * Concrete implementation of AttributionViewPlugin.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class AttributionPluginImpl(\n  private val viewImplProvider: (Context) -> AttributionViewImpl = { AttributionViewImpl(it) }\n) : AttributionPlugin, AttributionSettingsBase(), View.OnClickListener {\n\n  private lateinit var attributionView: AttributionView\n  private lateinit var mapAttributionDelegate: MapAttributionDelegate\n  private lateinit var dialogManager: AttributionDialogManager\n\n  override var internalSettings: AttributionSettings = AttributionSettings { }\n\n  override fun applySettings() {\n    attributionView.setGravity(internalSettings.position)\n    attributionView.setEnable(internalSettings.enabled)\n    attributionView.setIconColor(internalSettings.iconColor)\n    attributionView.setAttributionMargins(\n      internalSettings.marginLeft.toInt(),\n      internalSettings.marginTop.toInt(),\n      internalSettings.marginRight.toInt(),\n      internalSettings.marginBottom.toInt()\n    )\n    attributionView.requestLayout()\n  }\n\n  /**\n   * Get the instance of MapAttributionDelegate\n   */\n  override fun getMapAttributionDelegate(): MapAttributionDelegate {\n    return mapAttributionDelegate\n  }\n\n  /**\n   * Called when the attribution view has been clicked.\n   *\n   * @param v The attribution view that was clicked.\n   */\n  override fun onClick(v: View?) {\n    if (!internalSettings.clickable) {\n      return\n    }\n    dialogManager.showAttribution(mapAttributionDelegate)\n  }\n\n  /**\n   * Set the content description for the attribution view.\n   *\n   * @param contentDescription the content description text\n   */\n  override fun setContentDescription(contentDescription: CharSequence?) {\n    if (::attributionView.isInitialized) {\n      attributionView.setContentDescription(contentDescription)\n    }\n  }\n\n  /**\n   * Set a custom AttributionDialogManager that is invoked when the attribution view is clicked.\n   */\n  override fun setCustomAttributionDialogManager(dialogManager: AttributionDialogManager) {\n    this.dialogManager = dialogManager\n  }\n\n  /**\n   * Bind the ViewPlugin with current map context. This will create a View that\n   * will be added to the MapView.\n   *\n   * @param mapView parent view which can be used to fetch [android.content.Context] or [ViewGroup.LayoutParams]\n   * @return View that will be added to the MapView\n   */\n  override fun bind(mapView: FrameLayout, attrs: AttributeSet?, pixelRatio: Float): View {\n    internalSettings = AttributionAttributeParser.parseAttributionSettings(\n      mapView.context,\n      attrs,\n      pixelRatio\n    )\n    dialogManager = AttributionDialogManagerImpl(\n      mapView.context\n    )\n\n    return viewImplProvider(mapView.context)\n  }\n\n  /**\n   * Called when the plugin is first added to the map.\n   */\n  override fun initialize() {\n    applySettings()\n  }\n\n  /**\n   * Provides map delegate instance.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    mapAttributionDelegate = delegateProvider.mapAttributionDelegate\n  }\n\n  /**\n   * Provides a view instances returned in [bind] after it's been added to the MapView.\n   *\n   * @param view plugin view\n   */\n  override fun onPluginView(view: View) {\n    attributionView = view as? AttributionView\n      ?: throw IllegalArgumentException(\"The provided view needs to implement AttributionView\")\n    attributionView.setViewOnClickListener(this)\n  }\n\n  /**\n   * Called whenever activity's/fragment's lifecycle is entering a \"stopped\" state.\n   */\n  override fun onStop() {\n    dialogManager.onStop()\n  }\n}"
  },
  {
    "path": "plugin-attribution/src/main/java/com/mapbox/maps/plugin/attribution/AttributionViewImpl.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport android.content.Context\nimport android.content.res.ColorStateList\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.appcompat.widget.AppCompatImageView\nimport androidx.core.content.res.ResourcesCompat\nimport androidx.core.widget.ImageViewCompat\nimport com.mapbox.maps.logW\n\n/**\n * Concrete implementation of AttributionView from AttributionContract.\n */\nclass AttributionViewImpl @JvmOverloads constructor(\n  context: Context,\n  attrs: AttributeSet? = null,\n  defStyleAttr: Int = 0\n) : AttributionView, AppCompatImageView(context, attrs, defStyleAttr) {\n\n  init {\n    ResourcesCompat.getDrawable(resources, R.drawable.mapbox_attribution_selector, null)\n      ?.let { setImageDrawable(it) }\n    layoutParams = FrameLayout.LayoutParams(\n      ViewGroup.LayoutParams.WRAP_CONTENT,\n      ViewGroup.LayoutParams.WRAP_CONTENT\n    )\n    // Set default content description for accessibility\n    contentDescription = context.getString(R.string.mapbox_attributionsDialogTitle)\n  }\n\n  /**\n   * Set whether the attribution view is enabled.\n   * @param enabled: the enable state\n   */\n  override fun setEnable(enabled: Boolean) {\n    visibility = if (enabled) View.VISIBLE else {\n      logW(\"MbxAttribution\", context.getString(R.string.mapbox_warning_attribution_disabled))\n      View.GONE\n    }\n  }\n\n  /**\n   * Set the gravity value of the attribution view.\n   * @param gravity view's gravity\n   */\n  override fun setGravity(gravity: Int) {\n    (layoutParams as FrameLayout.LayoutParams).gravity = gravity\n  }\n\n  /**\n   * Set the attribution tint color\n   * @param color the tint color\n   */\n  override fun setIconColor(color: Int) {\n    ImageViewCompat.setImageTintList(\n      this,\n      ColorStateList(\n        arrayOf(intArrayOf(android.R.attr.state_pressed), intArrayOf()),\n        intArrayOf(color, color)\n      )\n    )\n  }\n\n  /**\n   * Set the margins of the logo view.\n   *\n   * @param left Margin to the left in pixel\n   * @param top Margin to the top in pixel\n   * @param right Margin to the right in pixel\n   * @param bottom Margin to the bottom in pixel\n   */\n  override fun setAttributionMargins(left: Int, top: Int, right: Int, bottom: Int) {\n    (layoutParams as FrameLayout.LayoutParams).apply {\n      setMargins(left, top, right, bottom)\n      // Support RTL\n      marginStart = left\n      marginEnd = right\n    }\n  }\n\n  /**\n   * Set the content description for accessibility.\n   *\n   * @param contentDescription the content description text\n   */\n  override fun setContentDescription(contentDescription: CharSequence?) {\n    super<AppCompatImageView>.setContentDescription(contentDescription)\n  }\n\n  /**\n   * Set an [View.OnClickListener] to AttributionView\n   */\n  override fun setViewOnClickListener(listener: OnClickListener) {\n    super.setOnClickListener(listener)\n  }\n}"
  },
  {
    "path": "plugin-attribution/src/main/java/com/mapbox/maps/plugin/attribution/generated/AttributionAttributeParser.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.attribution.generated\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport com.mapbox.maps.plugin.attribution.R\n\n/**\n * Utility class for parsing [AttributeSet] to [AttributionSettings].\n */\ninternal object AttributionAttributeParser {\n  /**\n   * Parse [AttributeSet] to [AttributionSettings].\n   *\n   * @param context Context\n   * @param attrs AttributionSet\n   */\n  fun parseAttributionSettings(context: Context, attrs: AttributeSet?, pixelRatio: Float = 1.0f): AttributionSettings {\n    val typedArray = context.obtainStyledAttributes(attrs, R.styleable.mapbox_MapView, 0, 0)\n    try {\n      return AttributionSettings {\n        enabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_attributionEnabled, true)\n        iconColor = typedArray.getColor(R.styleable.mapbox_MapView_mapbox_attributionIconColor, Color.parseColor(\"#FF1E8CAB\"))\n        position = typedArray.getInt(R.styleable.mapbox_MapView_mapbox_attributionGravity, Gravity.BOTTOM or Gravity.START)\n        marginLeft = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_attributionMarginLeft, 92f * pixelRatio)\n        marginTop = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_attributionMarginTop, 4f * pixelRatio)\n        marginRight = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_attributionMarginRight, 4f * pixelRatio)\n        marginBottom = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_attributionMarginBottom, 4f * pixelRatio)\n        clickable = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_attributionClickable, true)\n      }\n    } finally {\n      typedArray.recycle()\n    }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-attribution/src/main/res/drawable/mapbox_attribution_default.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"21dp\"\n    android:height=\"21dp\"\n    android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\">\n    <path\n        android:fillColor=\"#FF1E8CAB\"\n        android:pathData=\"M11,17h2v-6h-2v6zm1,-15C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zm0,18c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2V7h-2v2z\"/>\n</vector>"
  },
  {
    "path": "plugin-attribution/src/main/res/drawable/mapbox_attribution_selected.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"21dp\"\n    android:height=\"21dp\"\n    android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\">\n    <path\n        android:fillColor=\"#551E8CAB\"\n        android:pathData=\"M11,17h2v-6h-2v6zm1,-15C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zm0,18c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2V7h-2v2z\"/>\n</vector>"
  },
  {
    "path": "plugin-attribution/src/main/res/drawable/mapbox_attribution_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/mapbox_attribution_selected\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/mapbox_attribution_default\" />\n</selector>"
  },
  {
    "path": "plugin-attribution/src/main/res/layout/mapbox_attribution_list_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@android:id/text1\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\"\n    android:paddingLeft=\"24dp\"\n    android:paddingRight=\"24dp\"\n    android:textAllCaps=\"true\"\n    android:textIsSelectable=\"false\"\n    android:textAppearance=\"?android:attr/textAppearanceButton\"\n    android:textColor=\"@color/mapbox_blue\"/>\n"
  },
  {
    "path": "plugin-attribution/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n    <declare-styleable name=\"mapbox_MapView\">\n        <!-- Whether the attribution icon is visible on the map. -->\n        <attr name=\"mapbox_attributionEnabled\" format=\"boolean\"/>\n        <!-- Defines text color of the attribution icon. -->\n        <attr name=\"mapbox_attributionIconColor\" format=\"color\"/>\n\n        <!-- Defines where the attribution icon is positioned on the map -->\n        <attr name=\"mapbox_attributionGravity\">\n            <!-- Push object to the top of its container, not changing its size. -->\n            <flag name=\"top\" value=\"0x30\" />\n            <!-- Push object to the bottom of its container, not changing its size. -->\n            <flag name=\"bottom\" value=\"0x50\" />\n            <!-- Push object to the left of its container, not changing its size. -->\n            <flag name=\"left\" value=\"0x03\" />\n            <!-- Push object to the right of its container, not changing its size. -->\n            <flag name=\"right\" value=\"0x05\" />\n            <!-- Place object in the vertical center of its container, not changing its size. -->\n            <flag name=\"center_vertical\" value=\"0x10\" />\n            <!-- Grow the vertical size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill_vertical\" value=\"0x70\" />\n            <!-- Place object in the horizontal center of its container, not changing its size. -->\n            <flag name=\"center_horizontal\" value=\"0x01\" />\n            <!-- Grow the horizontal size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill_horizontal\" value=\"0x07\" />\n            <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->\n            <flag name=\"center\" value=\"0x11\" />\n            <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill\" value=\"0x77\" />\n            <!-- Additional option that can be set to have the top and/or bottom edges of\n                 the child clipped to its container's bounds.\n                 The clip will be based on the vertical gravity: a top gravity will clip the bottom\n                 edge, a bottom gravity will clip the top edge, and neither will clip both edges. -->\n            <flag name=\"clip_vertical\" value=\"0x80\" />\n            <!-- Additional option that can be set to have the left and/or right edges of\n                 the child clipped to its container's bounds.\n                 The clip will be based on the horizontal gravity: a left gravity will clip the right\n                 edge, a right gravity will clip the left edge, and neither will clip both edges. -->\n            <flag name=\"clip_horizontal\" value=\"0x08\" />\n            <!-- Push object to the beginning of its container, not changing its size. -->\n            <flag name=\"start\" value=\"0x00800003\" />\n            <!-- Push object to the end of its container, not changing its size. -->\n            <flag name=\"end\" value=\"0x00800005\" />\n        </attr>\n        <!-- Defines the margin to the left that the attribution icon honors. -->\n        <attr name=\"mapbox_attributionMarginLeft\" format=\"dimension\"/>\n        <!-- Defines the margin to the top that the attribution icon honors. -->\n        <attr name=\"mapbox_attributionMarginTop\" format=\"dimension\"/>\n        <!-- Defines the margin to the right that the attribution icon honors. -->\n        <attr name=\"mapbox_attributionMarginRight\" format=\"dimension\"/>\n        <!-- Defines the margin to the bottom that the attribution icon honors. -->\n        <attr name=\"mapbox_attributionMarginBottom\" format=\"dimension\"/>\n        <!-- Whether the attribution can be clicked and click events can be registered. -->\n        <attr name=\"mapbox_attributionClickable\" format=\"boolean\"/>\n    </declare-styleable>\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-attribution/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"mapbox_blue\">#1E8CAB</color>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_telemetryLink\" translatable=\"false\">https://www.mapbox.com/telemetry/</string>\n    <string name=\"mapbox_attributionErrorNoBrowser\">No web browser installed on device, can\\'t open web page.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Powered by Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Make Mapbox Maps Better</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Allow this app to use Geofencing</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">You are helping to make OpenStreetMap and Mapbox maps better by contributing anonymous usage data.</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">This app uses Mapbox Geofencing to detect your device’s presence in areas the app developer has defined. Only the app developer can see where those areas are. You have the option to disable Mapbox Geofencing, which may affect app functionality.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Participate</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Stop participating</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">More info</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Keep Geofencing enabled</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Disable Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Enable Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Keep Geofencing disabled</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Attribution must be enabled if you use data from sources that require it. See https://docs.mapbox.com/help/getting-started/attribution/ for more details.</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-ar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">لا يوجد متصفح ويب مثبت على الجهاز، ولا يمكن فتح صفحة الويب.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">مدعوم من خرائط Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">جعل خرائط Mapbox أفضل</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">أنت تساعد في تحسين خرائط OpenStreetMap وMapbox من خلال المساهمة ببيانات استخدام مجهولة المصدر.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">يشارك</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">التوقف عن المشاركة</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">مزيد من المعلومات</string>\n    <string name=\"mapbox_warning_attribution_disabled\">يجب تمكين الإسناد إذا كنت تستخدم بيانات من مصادر تتطلب ذلك. راجع https://docs.mapbox.com/help/getting-started/attribution/ لمزيد من التفاصيل.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">السماح لهذا التطبيق باستخدام Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">يستخدم هذا التطبيق Mapbox Geofencing للكشف عن وجود جهازك في المناطق التي حددها مطور التطبيق. يمكن لمطور التطبيق فقط معرفة مكان تلك المناطق. لديك خيار تعطيل Mapbox Geofencing، والذي قد يؤثر على وظائف التطبيق.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">إبقاء Geofencing ممكّنًا</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">تعطيل السياج الجغرافي</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">تمكين تحديد المواقع الجغرافية</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">إبقاء ميزة Geofencing معطلة</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-be/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">На прыладзе адсутнічае вэб-браўзер, нельга паказаць вэб-старонку.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Hа платформе Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Зрабіць карты Mapbox лепей</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Вы дапамагаеце паляпшаць карты OpenStreetMap і Mapbox, падаючы абязлічаныя даныя аб выкарыстанні.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Удзельнічаць</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Спыніць удзел</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Дадатковая інфармацыя</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Атрыбуцыя павінна быць уключана пры выкарыстанні даных з крыніц, якія патрабуюць гэтага. Дадатковая інфармацыя: https://docs.mapbox.com/help/getting-started/attribution/.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Дазволіць гэтай праграме выкарыстоўваць Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Гэта праграма выкарыстоўвае Mapbox Geofencing для выяўлення прысутнасці вашай прылады ў раёнах, вызначаных распрацоўшчыкам праграмы. Толькі распрацоўшчык праграмы можа бачыць, дзе знаходзяцца гэтыя вобласці. У вас ёсць магчымасць адключыць Mapbox Geofencing, што можа паўплываць на функцыянальнасць праграмы.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Захаваць Geofencing уключаным</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Адключыць Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Уключыць Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Захаваць Geofencing адключаным</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-bg/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Няма инсталиран уеб браузър на устройството, не може да отвори уеб страница.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Осъществено от Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Направете Mapbox Maps по-добри</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Вие помагате да направим картите на OpenStreetMap и Mapbox по-добри, като предоставяте анонимни данни за употребата.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Участвайте</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Спрете да участвате</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Повече информация</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Приписването трябва да е активирано, ако използвате данни от източници, които го изискват. Вижте https://docs.mapbox.com/help/getting-started/attribution/ за повече подробности.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Разрешете на това приложение да използва Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Това приложение използва Mapbox Geofencing, за да открие присъствието на вашето устройство в области, дефинирани от разработчика на приложението. Само разработчикът на приложението може да види къде са тези области. Имате възможност да деактивирате Mapbox Geofencing, което може да повлияе на функционалността на приложението.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Поддържайте Geofencing активиран</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Деактивирайте Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Активирайте Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Поддържайте Geofencing деактивирано</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-ca/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">No hi ha navegador web instal·lat al dispositiu, no es pot obrir la pàgina web.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Desenvolupat per Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Millorar els mapes de Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Esteu ajudant a millorar els mapes OpenStreetMap i Mapbox aportant dades d\\'ús anònimes.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Participa</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Deixa de participar</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Més informació</string>\n    <string name=\"mapbox_warning_attribution_disabled\">L\\'atribució ha d\\'estar activada si utilitzeu dades de fonts que ho requereixen. Vegeu https://docs.mapbox.com/help/getting-started/attribution/ per a més detalls.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Permet que aquesta aplicació utilitzi Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Aquesta aplicació utilitza Mapbox Geofencing per detectar la presència del vostre dispositiu a les àrees que el desenvolupador de l\\'aplicació ha definit. Només el desenvolupador d\\'aplicacions pot veure on es troben aquestes àrees. Teniu l\\'opció de desactivar Mapbox Geofencing, que pot afectar la funcionalitat de l\\'aplicació.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Manteniu el geofencing habilitat</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Desactiva el geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Activa el geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Mantenir el geofencing desactivat</string>\n\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-cs/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">V zařízení není nainstalován webový prohlížeč, nelze otevřít webovou stránku.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Provozováno na Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Vylepšete Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Pomáháte zlepšovat mapy OpenStreetMap a Mapbox tím, že přispíváte anonymními údaji o používání.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Účastnit se</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Přestat se účastnit</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Více informací</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Pokud používáte data ze zdrojů, které to vyžadují, musí být atribuce povolena. Další podrobnosti najdete na https://docs.mapbox.com/help/getting-started/attribution/.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Povolit této aplikaci používat Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Tato aplikace používá Mapbox Geofencing ke zjištění přítomnosti vašeho zařízení v oblastech, které definoval vývojář aplikace. Pouze vývojář aplikace vidí, kde se tyto oblasti nacházejí. Máte možnost deaktivovat Mapbox Geofencing, což může ovlivnit funkčnost aplikace.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Ponechte funkci Geofencing povolenou</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Zakázat Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Povolit Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Ponechat geofencing vypnutý</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-da/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Ingen webbrowser installeret på enheden, kan ikke åbne websiden.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Drevet af Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Gør Mapbox Maps bedre</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Du er med til at gøre OpenStreetMap- og Mapbox-kort bedre ved at bidrage med anonyme brugsdata.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Deltage</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Stop med at deltage</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Mere info</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Tilskrivning skal være aktiveret, hvis du bruger data fra kilder, der kræver det. Se https://docs.mapbox.com/help/getting-started/attribution/ for flere detaljer.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Tillad denne app at bruge Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Denne app bruger Mapbox Geofencing til at registrere din enheds tilstedeværelse i områder, appudvikleren har defineret. Kun appudvikleren kan se, hvor disse områder er. Du har mulighed for at deaktivere Mapbox Geofencing, hvilket kan påvirke appens funktionalitet.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Hold Geofencing aktiveret</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Deaktiver Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Aktiver Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Hold Geofencing deaktiveret</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Auf dem Gerät ist kein Webbrowser installiert. Die Webseite kann nicht geöffnet werden.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Unterstützt von Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Machen Sie Mapbox-Karten besser</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Sie tragen dazu bei, die Karten von OpenStreetMap und Mapbox zu verbessern, indem Sie anonyme Nutzungsdaten beisteuern.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Teilnehmen</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Hören Sie auf, mitzumachen</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Mehr Info</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Die Attribution muss aktiviert sein, wenn Sie Daten aus Quellen verwenden, die dies erfordern. Weitere Einzelheiten finden Sie unter https://docs.mapbox.com/help/getting-started/attribution/.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Erlauben Sie dieser App die Verwendung von Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Diese App verwendet Mapbox Geofencing, um die Präsenz Ihres Geräts in vom App-Entwickler definierten Bereichen zu erkennen. Nur der App-Entwickler kann sehen, wo sich diese Bereiche befinden. Sie haben die Möglichkeit, Mapbox Geofencing zu deaktivieren, was jedoch die Funktionalität der App beeinträchtigen kann.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Geofencing aktiviert lassen</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Geofencing deaktivieren</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Geofencing aktivieren</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Geofencing deaktiviert lassen</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">No hay ningún navegador web instalado en el dispositivo, no se puede abrir la página web.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Desarrollado por Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Mejorar los mapas de Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Usted está ayudando a mejorar los mapas de OpenStreetMap y Mapbox al contribuir con datos de uso anónimos.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Participar</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Dejar de participar</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Más información</string>\n    <string name=\"mapbox_warning_attribution_disabled\">La atribución debe estar habilitada si utiliza datos de fuentes que la requieren. Consulte https://docs.mapbox.com/help/getting-started/attribution/ para obtener más detalles.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Permitir que esta aplicación utilice geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Esta aplicación utiliza Mapbox Geofencing para detectar la presencia de su dispositivo en áreas definidas por el desarrollador de la aplicación. Solo el desarrollador de la aplicación puede ver dónde se encuentran esas áreas. Tiene la opción de desactivar Mapbox Geofencing, lo que puede afectar la funcionalidad de la aplicación.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Mantener habilitada la geofencing</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Deshabilitar geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Habilitar geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Mantener la geocerca deshabilitada</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Aucun navigateur Web n\\'est installé sur l\\'appareil, impossible d\\'ouvrir la page Web.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Développé par Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Améliorer les cartes Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Vous contribuez à améliorer les cartes OpenStreetMap et Mapbox en fournissant des données d\\'utilisation anonymes.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Participer</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Arrêter de participer</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Plus d\\'informations</string>\n    <string name=\"mapbox_warning_attribution_disabled\">L\\'attribution doit être activée si vous utilisez des données provenant de sources qui l\\'exigent. Voir https://docs.mapbox.com/help/getting-started/attribution/ pour plus de détails.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Autoriser cette application à utiliser le géorepérage</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Cette application utilise Mapbox Geofencing pour détecter la présence de votre appareil dans les zones définies par le développeur de l\\'application. Seul le développeur de l\\'application peut voir où se trouvent ces zones. Vous avez la possibilité de désactiver Mapbox Geofencing, ce qui peut affecter les fonctionnalités de l\\'application.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Gardez le géorepérage activé</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Désactiver le géorepérage</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Activer le géorepérage</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Gardez le géorepérage désactivé</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-gl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Non hai ningún navegador web instalado no dispositivo, non se pode abrir a páxina web.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Desenvolvido por Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Mellora os mapas de Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Estás contribuíndo a mellorar os mapas de OpenStreetMap e Mapbox aportando datos de uso anónimos.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Participa</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Deixa de participar</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Máis información</string>\n    <string name=\"mapbox_warning_attribution_disabled\">A atribución debe estar activada se utilizas datos de fontes que o requiren. Consulte https://docs.mapbox.com/help/getting-started/attribution/ para obter máis detalles.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Permitir que esta aplicación use Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Esta aplicación usa Mapbox Geofencing para detectar a presenza do teu dispositivo nas áreas que definiu o programador da aplicación. Só o programador da aplicación pode ver onde están esas áreas. Tes a opción de desactivar Mapbox Geofencing, o que pode afectar á funcionalidade da aplicación.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Mantén o Geofencing activado</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Desactivar Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Activar Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Manter o geofencing desactivado</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Nessun browser Web installato sul dispositivo, impossibile aprire la pagina Web.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Fornito da Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Migliora le mappe Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Stai contribuendo a migliorare le mappe OpenStreetMap e Mapbox fornendo dati di utilizzo anonimi.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Partecipare</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Smettere di partecipare</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Ulteriori informazioni</string>\n    <string name=\"mapbox_warning_attribution_disabled\">L\\'attribuzione deve essere abilitata se utilizzi dati provenienti da origini che la richiedono. Vedi https://docs.mapbox.com/help/getting-started/attribution/ per maggiori dettagli.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Consenti a questa app di utilizzare il geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Questa app usa Mapbox Geofencing per rilevare la presenza del tuo dispositivo nelle aree definite dallo sviluppatore dell\\'app. Solo lo sviluppatore dell\\'app può vedere dove si trovano tali aree. Hai la possibilità di disattivare Mapbox Geofencing, il che potrebbe influire sulla funzionalità dell\\'app.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Mantieni abilitato il geofencing</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Disattivare il geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Abilita Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Mantieni il geofencing disabilitato</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-iw/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">לא מותקן דפדפן אינטרנט במכשיר, לא ניתן לפתוח דף אינטרנט.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">מופעל על ידי Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">הפוך את Mapbox Maps לטוב יותר</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">אתה עוזר לשפר את מפות OpenStreetMap ו- Mapbox על ידי תרומה של נתוני שימוש אנונימיים.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">לְהִשְׂתַתֵף</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">תפסיק להשתתף</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">עוד מידע</string>\n    <string name=\"mapbox_warning_attribution_disabled\">יש להפעיל ייחוס אם אתה משתמש בנתונים ממקורות הדורשים זאת. ראה https://docs.mapbox.com/help/getting-started/attribution/ לפרטים נוספים.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">אפשר לאפליקציה הזו להשתמש ב-Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">אפליקציה זו משתמשת ב- Mapbox Geofencing כדי לזהות את נוכחות המכשיר שלך באזורים שמפתח האפליקציה הגדיר. רק מפתח האפליקציה יכול לראות היכן נמצאים האזורים הללו. יש לך אפשרות להשבית את Mapbox Geofencing, מה שעשוי להשפיע על פונקציונליות האפליקציה.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">השאר גיאופנסינג מופעל</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">השבת גיאופנסינג</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">אפשר גיאופנסינג</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">השאר גיאופנסינג מושבת</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">デバイスに Web ブラウザがインストールされていないため、Web ページを開けません。</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Mapbox マップを利用</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Mapbox マップをより良くする</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">匿名の使用状況データを提供することで、OpenStreetMap と Mapbox の地図をより良くすることに貢献しています。</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">参加する</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">参加をやめる</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">より詳しい情報</string>\n    <string name=\"mapbox_warning_attribution_disabled\">アトリビューションを必要とするソースからのデータを使用する場合は、アトリビューションを有効にする必要があります。詳細については、https://docs.mapbox.com/help/getting-started/attribution/ を参照してください。</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">このアプリにジオフェンシングの使用を許可する</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">このアプリは、Mapbox ジオフェンシングを使用して、アプリ開発者が定義したエリア内でのデバイスの存在を検出します。これらのエリアの場所を確認できるのはアプリ開発者のみです。Mapbox ジオフェンシングを無効にするオプションがありますが、これによりアプリの機能に影響が出る可能性があります。</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">ジオフェンシングを有効にしておく</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">ジオフェンシングを無効にする</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">ジオフェンシングを有効にする</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">ジオフェンシングを無効のままにする</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">기기에 웹 브라우저가 설치되어 있지 않아 웹 페이지를 열 수 없습니다.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Mapbox 지도 제공</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Mapbox 지도를 더 좋게 만들기</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">익명의 사용 데이터를 제공하여 OpenStreetMap 및 Mapbox 지도를 개선하는 데 도움을 주고 계십니다.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">참가하다</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">참여 중지</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">더 많은 정보</string>\n    <string name=\"mapbox_warning_attribution_disabled\">기여가 필요한 소스의 데이터를 사용하는 경우 기여를 활성화해야 합니다. 자세한 내용은 https://docs.mapbox.com/help/getting-started/attribution/ 을 참조하세요.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">이 앱이 지오펜싱을 사용하도록 허용</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">이 앱은 Mapbox Geofencing을 사용하여 앱 개발자가 정의한 영역에서 기기의 존재를 감지합니다. 앱 개발자만 해당 영역의 위치를 볼 수 있습니다. 앱 기능에 영향을 줄 수 있는 Mapbox Geofencing을 비활성화할 수 있습니다.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">지오펜싱을 활성화 상태로 유지하세요</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">지오펜싱 비활성화</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">지오펜싱 활성화</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">지오펜싱을 비활성화 상태로 유지</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-lt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Įrenginyje neįdiegta žiniatinklio naršyklė, negalima atidaryti tinklalapio.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Parengta naudojant „Mapbox Maps“.</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Patobulinkite „Mapbox“ žemėlapius</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Pateikdami anoniminius naudojimo duomenis, padedate tobulinti „OpenStreetMap“ ir „Mapbox“ žemėlapius.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Dalyvauti</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Nustokite dalyvauti</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Daugiau informacijos</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Priskyrimas turi būti įgalintas, jei naudojate duomenis iš šaltinių, kuriems to reikia. Daugiau informacijos rasite adresu https://docs.mapbox.com/help/getting-started/attribution/.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Leiskite šiai programai naudoti geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Ši programa naudoja „Mapbox Geofencing“, kad nustatytų jūsų įrenginio buvimą programos kūrėjo nustatytose srityse. Tik programos kūrėjas gali matyti, kur yra šios sritys. Turite galimybę išjungti „Mapbox Geofencing“, kuri gali turėti įtakos programos funkcionalumui.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Laikykite įjungtą geotvorą</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Išjungti geotvorą</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Įgalinti Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Išjunkite geotvorą</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-nl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Er is geen webbrowser geïnstalleerd op het apparaat. Kan webpagina niet openen.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Mogelijk gemaakt door Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Maak Mapbox-kaarten beter</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">U helpt OpenStreetMap- en Mapbox-kaarten beter te maken door anonieme gebruiksgegevens bij te dragen.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Deelnemen</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Stop met deelnemen</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Meer informatie</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Attributie moet zijn ingeschakeld als u gegevens gebruikt uit bronnen waarvoor dit vereist is. Zie https://docs.mapbox.com/help/getting-started/attribution/ voor meer details.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Sta deze app toe om Geofencing te gebruiken</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Deze app gebruikt Mapbox Geofencing om de aanwezigheid van uw apparaat te detecteren in gebieden die de app-ontwikkelaar heeft gedefinieerd. Alleen de app-ontwikkelaar kan zien waar die gebieden zijn. U hebt de optie om Mapbox Geofencing uit te schakelen, wat de functionaliteit van de app kan beïnvloeden.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Houd Geofencing ingeschakeld</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Geofencing uitschakelen</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Geofencing inschakelen</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Geofencing uitgeschakeld houden</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-no/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Ingen nettleser installert på enheten, kan ikke åpne nettsiden.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Drevet av Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Gjør Mapbox Maps bedre</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Du er med på å gjøre OpenStreetMap- og Mapbox-kart bedre ved å bidra med anonyme bruksdata.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Delta</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Slutt å delta</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Mer informasjon</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Attribusjon må være aktivert hvis du bruker data fra kilder som krever det. Se https://docs.mapbox.com/help/getting-started/attribution/ for mer informasjon.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Tillat denne appen å bruke Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Denne appen bruker Mapbox Geofencing for å oppdage enhetens tilstedeværelse i områder apputvikleren har definert. Bare apputvikleren kan se hvor disse områdene er. Du har muligheten til å deaktivere Mapbox Geofencing, noe som kan påvirke appfunksjonaliteten.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Hold Geofencing aktivert</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Deaktiver Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Aktiver Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Hold Geofencing deaktivert</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-pl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Na urządzeniu nie jest zainstalowana przeglądarka internetowa, nie można otworzyć strony internetowej.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Obsługiwane przez mapy Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Ulepszaj mapy Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Pomagasz ulepszyć mapy OpenStreetMap i Mapbox, przekazując anonimowe dane o użytkowaniu.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Brać udział</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Przestań brać udział</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Więcej informacji</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Atrybucja musi być włączona, jeśli korzystasz z danych ze źródeł, które tego wymagają. Więcej szczegółów można znaleźć na stronie https://docs.mapbox.com/help/getting-started/attribution/.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Zezwól tej aplikacji na korzystanie z funkcji Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Ta aplikacja używa Mapbox Geofencing do wykrywania obecności Twojego urządzenia w obszarach zdefiniowanych przez programistę aplikacji. Tylko programista aplikacji może zobaczyć, gdzie znajdują się te obszary. Masz możliwość wyłączenia Mapbox Geofencing, co może mieć wpływ na funkcjonalność aplikacji.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Pozostaw włączoną funkcję Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Wyłącz geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Włącz geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Pozostaw geofencing wyłączony</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Nenhum navegador da web instalado no dispositivo, não é possível abrir a página da web.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Desenvolvido por Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Torne os mapas Mapbox melhores</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Você está ajudando a melhorar os mapas OpenStreetMap e Mapbox, contribuindo com dados de uso anônimos.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Participar</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Pare de participar</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Mais informações</string>\n    <string name=\"mapbox_warning_attribution_disabled\">A atribuição deverá ser habilitada se você usar dados de fontes que a exijam. Consulte https://docs.mapbox.com/help/getting-started/attribution/ para obter mais detalhes.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Permitir que este aplicativo use geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Este aplicativo usa o Mapbox Geofencing para detectar a presença do seu dispositivo em áreas definidas pelo desenvolvedor do aplicativo. Somente o desenvolvedor do aplicativo pode ver onde essas áreas estão. Você tem a opção de desabilitar o Mapbox Geofencing, o que pode afetar a funcionalidade do aplicativo.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Mantenha o Geofencing ativado</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Desativar Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Habilitar Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Mantenha a geocerca desabilitada</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">На устройстве нет веб-браузера, нельзя показать веб-страницу.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Предоставлено Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Сделать карты Mapbox лучше</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Вы помогаете улучшать карты OpenStreetMap и Mapbox, предоставляя обезличенные данные об использовании.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Участвовать</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Прекратить участие</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Дополнительная информация</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Атрибуция должна быть включена при использовании данных из источников, требующих этого. Дополнительная информация: https://docs.mapbox.com/help/getting-started/attribution/.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Разрешить этому приложению использовать геозонирование</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Это приложение использует Mapbox Geofencing для обнаружения присутствия вашего устройства в областях, определенных разработчиком приложения. Только разработчик приложения может видеть, где находятся эти области. У вас есть возможность отключить Mapbox Geofencing, что может повлиять на функциональность приложения.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Оставьте функцию Geofencing включенной</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Отключить геозонирование</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Включить геозонирование</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Оставьте геозонирование отключенным</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-sv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Ingen webbläsare installerad på enheten, kan inte öppna webbsidan.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Drivs av Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Gör Mapbox Maps bättre</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Du hjälper till att göra OpenStreetMap- och Mapbox-kartor bättre genom att bidra med anonym användningsdata.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Delta</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Sluta delta</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Mer information</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Attribution måste vara aktiverat om du använder data från källor som kräver det. Se https://docs.mapbox.com/help/getting-started/attribution/ för mer information.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Tillåt den här appen att använda Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Den här appen använder Mapbox Geofencing för att upptäcka din enhets närvaro i områden som apputvecklaren har definierat. Endast apputvecklaren kan se var dessa områden finns. Du har möjlighet att inaktivera Mapbox Geofencing, vilket kan påverka appens funktionalitet.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Håll Geofencing aktiverat</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Inaktivera Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Aktivera Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Håll Geofencing inaktiverat</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-uk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">На пристрої не встановлено веб-браузер, не вдається відкрити веб-сторінку.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Мапи від Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Зробимо мапи Mapbox кращими</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Ви допомагаєте покращити OpenStreetMap та Mapbox надаючи анонімні дані про користування.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Брати участь</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Припинити участь</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Більше інформації</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Атрибуцію потрібно ввімкнути, якщо ви використовуєте дані з джерел, які її потребують. Додаткову інформацію див. на сторінці https://docs.mapbox.com/help/getting-started/attribution/.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Дозволити цій програмі використовувати геофенсинг</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Ця програма використовує Mapbox Геофенсинг для виявлення присутності вашого пристрою в зонах, визначених розробником програми.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Залишити геофенсинг увімкнутим</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Вимкнути геофенсинг</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Увімкнути геофенсинг</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Залишити геофенсинг вимкненим</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-vi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">Không có trình duyệt web được cài đặt trên thiết bị, không thể mở trang web.</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Được hỗ trợ bởi Mapbox Maps</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">Làm cho bản đồ Mapbox tốt hơn</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">Bạn đang giúp cải thiện bản đồ OpenStreetMap và Mapbox bằng cách đóng góp dữ liệu sử dụng ẩn danh.</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">Tham gia</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">Ngừng tham gia</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">Thêm thông tin</string>\n    <string name=\"mapbox_warning_attribution_disabled\">Thuộc tính phải được bật nếu bạn sử dụng dữ liệu từ các nguồn yêu cầu nó. Xem https://docs.mapbox.com/help/getting-started/attribution/ để biết thêm chi tiết.</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">Cho phép ứng dụng này sử dụng Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">Ứng dụng này sử dụng Mapbox Geofencing để phát hiện sự hiện diện của thiết bị của bạn trong các khu vực mà nhà phát triển ứng dụng đã xác định. Chỉ nhà phát triển ứng dụng mới có thể thấy những khu vực đó. Bạn có tùy chọn tắt Mapbox Geofencing, điều này có thể ảnh hưởng đến chức năng của ứng dụng.</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">Giữ cho Geofencing được bật</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">Vô hiệu hóa Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">Bật Geofencing</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">Giữ Geofencing ở trạng thái vô hiệu hóa</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-zh/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">设备上未安装网页浏览器，无法打开网页。</string>\n    <string name=\"mapbox_attributionsDialogTitle\">由 Mapbox 地图提供支持</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">让 Mapbox 地图变得更好</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">您通过贡献匿名使用数据来帮助改进 OpenStreetMap 和 Mapbox 地图。</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">参加</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">停止参与</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">更多信息</string>\n    <string name=\"mapbox_warning_attribution_disabled\">如果您使用来自需要归因的来源的数据，则必须启用归因。有关更多详细信息，请参阅 https://docs.mapbox.com/help/getting-started/attribution/。</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">允许此应用使用地理围栏</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">此应用使用 Mapbox 地理围栏来检测您的设备是否位于应用开发人员定义的区域中。只有应用开发人员才能看到这些区域的位置。您可以选择禁用 Mapbox 地理围栏，但这可能会影响应用功能。</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">保持地理围栏处于启用状态</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">禁用地理围栏</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">启用地理围栏</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">保持地理围栏禁用</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">设备中未安装任何浏览器，不能打开该网页</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Powered by Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">让Mapbox地图变得更好</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">您的匿名数据将帮助OpenStreetMap和Mapbox的地图变得更好。</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">继续参与</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">不再参与</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">更多信息</string>\n    <string name=\"mapbox_warning_attribution_disabled\">如果您使用需要标注归属的数据源，则必须启用归属信息。有关更多详细信息，请参阅 https://docs.mapbox.com/help/getting-started/attribution/。</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">允许此应用使用地理围栏</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">此应用使用 Mapbox 地理围栏来检测您的设备是否位于应用开发人员定义的区域中。只有应用开发人员才能看到这些区域的位置。您可以选择禁用 Mapbox 地理围栏，但这可能会影响应用功能。</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">保持地理围栏处于启用状态</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">禁用地理围栏</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">启用地理围栏</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">保持地理围栏禁用</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-zh-rHK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">設備中未安裝任何瀏覽器，不能打開該網頁</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Powered by Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">讓Mapbox地圖變得更好</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">您的匿名數據幫助OpenStreetMap和Mapbox的地圖變得更好。</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">繼續參與</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">不再參與</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">更多資訊</string>\n    <string name=\"mapbox_warning_attribution_disabled\">如果您使用來自需要歸因的來源的數據，則必須啟用歸因。有關更多詳細信息，請參閱 https://docs.mapbox.com/help/getting-started/attribution/。</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">允許此應用程式使用地理圍欄</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">此應用程式使用 Mapbox 地理圍欄來偵測您的裝置是否存在於應用程式開發人員定義的區域中。只有應用程式開發人員才能看到這些區域的位置。您可以選擇停用 Mapbox 地理圍欄，這可能會影響應用程式功能。</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">保持地理圍籬啟用</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">禁用地理圍欄</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">啟用地理圍欄</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">保持地理圍欄禁用</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_attributionErrorNoBrowser\">設備中未安裝任何瀏覽器，不能打開該網頁。</string>\n    <string name=\"mapbox_attributionsDialogTitle\">Powered by Mapbox</string>\n    <string name=\"mapbox_attributionTelemetryTitle\">讓Mapbox地圖變得更好</string>\n    <string name=\"mapbox_attributionTelemetryMessage\">您的匿名數據幫助OpenStreetMap和Mapbox的地圖變得更好。</string>\n    <string name=\"mapbox_attributionTelemetryPositive\">繼續參與</string>\n    <string name=\"mapbox_attributionTelemetryNegative\">不再參與</string>\n    <string name=\"mapbox_attributionTelemetryNeutral\">更多資訊</string>\n    <string name=\"mapbox_warning_attribution_disabled\">如果您使用來自需要歸因的來源的數據，則必須啟用歸因。有關更多詳細信息，請參閱 https://docs.mapbox.com/help/getting-started/attribution/。</string>\n    <string name=\"mapbox_attributionGeofencingTitle\">允許此應用程式使用地理圍欄</string>\n    <string name=\"mapbox_attributionGeofencingMessage\">此應用程式使用 Mapbox 地理圍欄來偵測您的裝置是否存在於應用程式開發人員定義的區域中。只有應用程式開發人員才能看到這些區域的位置。您可以選擇停用 Mapbox 地理圍欄，這可能會影響應用程式功能。</string>\n    <string name=\"mapbox_attributionGeofencingConsentedPositive\">保持地理圍籬啟用</string>\n    <string name=\"mapbox_attributionGeofencingConsentedNegative\">禁用地理圍欄</string>\n    <string name=\"mapbox_attributionGeofencingRevokedPositive\">啟用地理圍欄</string>\n    <string name=\"mapbox_attributionGeofencingRevokedNegative\">保持地理圍欄禁用</string>\n</resources>"
  },
  {
    "path": "plugin-attribution/src/main/res-public/values/public.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n\n    <!-- Whether the attribution icon is visible on the map. -->\n    <public name=\"mapbox_attributionEnabled\" type=\"attr\" />\n\n    <!-- Defines text color of the attribution icon. -->\n    <public name=\"mapbox_attributionIconColor\" type=\"attr\" />\n\n    <!-- Defines where the attribution icon is positioned on the map -->\n    <public name=\"mapbox_attributionGravity\" type=\"attr\" />\n\n    <!-- Defines the margin to the left that the attribution icon honors. -->\n    <public name=\"mapbox_attributionMarginLeft\" type=\"attr\" />\n\n    <!-- Defines the margin to the top that the attribution icon honors. -->\n    <public name=\"mapbox_attributionMarginTop\" type=\"attr\" />\n\n    <!-- Defines the margin to the right that the attribution icon honors. -->\n    <public name=\"mapbox_attributionMarginRight\" type=\"attr\" />\n\n    <!-- Defines the margin to the bottom that the attribution icon honors. -->\n    <public name=\"mapbox_attributionMarginBottom\" type=\"attr\" />\n\n    <!-- Whether the attribution can be clicked and click events can be registered. -->\n    <public name=\"mapbox_attributionClickable\" type=\"attr\" />\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-attribution/src/test/java/com/mapbox/maps/plugin/attribution/AttributionDialogManagerImplTest.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport android.content.DialogInterface\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.geofencing.MapGeofencingConsent\nimport com.mapbox.maps.module.MapTelemetry\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.slot\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.Robolectric\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.shadows.ShadowLooper\n\n@RunWith(RobolectricTestRunner::class)\nclass AttributionDialogManagerImplTest {\n\n  private lateinit var attributionDialogManagerImpl: AttributionDialogManagerImpl\n  private val telemetry: MapTelemetry = mockk()\n  @OptIn(MapboxExperimental::class)\n  private val geofencingConsent: MapGeofencingConsent = mockk()\n  private val mapAttributionDelegate: MapAttributionDelegate = mockk()\n\n  @OptIn(MapboxExperimental::class)\n  @Before\n  fun setUp() {\n    every { mapAttributionDelegate.telemetry() } returns telemetry\n    every { mapAttributionDelegate.geofencingConsent() } returns geofencingConsent\n    every { geofencingConsent.shouldShowConsent() } returns true\n    every {\n      mapAttributionDelegate.parseAttributions(\n        any(),\n        any()\n      )\n    } returns listOf(\n      Attribution(\"feadback\", \"feadback_url\"),\n      Attribution(\"Telemetry\", Attribution.ABOUT_TELEMETRY_URL),\n      Attribution(Attribution.GEOFENCING, Attribution.GEOFENCING_URL_MARKER),\n    )\n    attributionDialogManagerImpl = AttributionDialogManagerImpl(\n      Robolectric.buildActivity(AppCompatActivity::class.java).get().also {\n        it.setTheme(R.style.Theme_AppCompat_Dialog_Alert)\n      }\n    )\n  }\n\n  @Test\n  fun showAttribution() {\n    assertNull(attributionDialogManagerImpl.dialog)\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    assertNotNull(attributionDialogManagerImpl.dialog)\n    assertTrue(attributionDialogManagerImpl.dialog!!.isShowing)\n    attributionDialogManagerImpl.onStop()\n    assertFalse(attributionDialogManagerImpl.dialog!!.isShowing)\n  }\n\n  @Test\n  fun onClick() {\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    attributionDialogManagerImpl.onClick(mockk(), 0)\n  }\n\n  @Test\n  fun onClickTelemetry() {\n    assertNull(attributionDialogManagerImpl.telemetryDialog)\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    attributionDialogManagerImpl.onClick(mockk(), 1)\n    assertNotNull(attributionDialogManagerImpl.telemetryDialog)\n    assertTrue(attributionDialogManagerImpl.telemetryDialog!!.isShowing)\n    attributionDialogManagerImpl.onStop()\n    assertFalse(attributionDialogManagerImpl.telemetryDialog!!.isShowing)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun onClickGeofencingConsentWithConsentGiven() {\n    assertNull(attributionDialogManagerImpl.geofencingDialog)\n    every { geofencingConsent.getUserConsent() } returns true\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    attributionDialogManagerImpl.onClick(mockk(), 2)\n    assertNotNull(attributionDialogManagerImpl.geofencingDialog)\n    val geofencingDialog = attributionDialogManagerImpl.geofencingDialog!!\n    assertTrue(geofencingDialog.isShowing)\n    attributionDialogManagerImpl.onStop()\n    assertFalse(geofencingDialog.isShowing)\n    val expectedPositive = geofencingDialog.context.getString(R.string.mapbox_attributionGeofencingConsentedPositive)\n    assertEquals(expectedPositive, geofencingDialog.getButton(DialogInterface.BUTTON_POSITIVE).text)\n    val expectedNegative = geofencingDialog.context.getString(R.string.mapbox_attributionGeofencingConsentedNegative)\n    assertEquals(expectedNegative, geofencingDialog.getButton(DialogInterface.BUTTON_NEGATIVE).text)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun onClickGeofencingConsentWithConsentRevoked() {\n    assertNull(attributionDialogManagerImpl.geofencingDialog)\n    every { geofencingConsent.getUserConsent() } returns false\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    attributionDialogManagerImpl.onClick(mockk(), 2)\n    assertNotNull(attributionDialogManagerImpl.geofencingDialog)\n    val geofencingDialog = attributionDialogManagerImpl.geofencingDialog!!\n    assertTrue(geofencingDialog.isShowing)\n    attributionDialogManagerImpl.onStop()\n    assertFalse(geofencingDialog.isShowing)\n    val expectedPositive = geofencingDialog.context.getString(R.string.mapbox_attributionGeofencingRevokedPositive)\n    assertEquals(expectedPositive, geofencingDialog.getButton(DialogInterface.BUTTON_POSITIVE).text)\n    val expectedNegative = geofencingDialog.context.getString(R.string.mapbox_attributionGeofencingRevokedNegative)\n    assertEquals(expectedNegative, geofencingDialog.getButton(DialogInterface.BUTTON_NEGATIVE).text)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun onClickGeofencingConsentPositive() {\n    val slot = slot<Boolean>()\n    every { geofencingConsent.setUserConsent(capture(slot), any()) } just Runs\n    assertNull(attributionDialogManagerImpl.geofencingDialog)\n    every { geofencingConsent.getUserConsent() } returns true\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    attributionDialogManagerImpl.onClick(mockk(), 2)\n    val geofencingDialog = attributionDialogManagerImpl.geofencingDialog!!\n    assertTrue(geofencingDialog.isShowing)\n    geofencingDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick()\n    ShadowLooper.runUiThreadTasks()\n    assertFalse(geofencingDialog.isShowing)\n    assertTrue(slot.captured)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun onClickGeofencingConsentNegative() {\n    val slot = slot<Boolean>()\n    every { geofencingConsent.setUserConsent(capture(slot), any()) } just Runs\n    assertNull(attributionDialogManagerImpl.geofencingDialog)\n    every { geofencingConsent.getUserConsent() } returns true\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    attributionDialogManagerImpl.onClick(mockk(), 2)\n    val geofencingDialog = attributionDialogManagerImpl.geofencingDialog!!\n    assertTrue(geofencingDialog.isShowing)\n    geofencingDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick()\n    ShadowLooper.runUiThreadTasks()\n    assertFalse(geofencingDialog.isShowing)\n    assertFalse(slot.captured)\n  }\n\n  @Test\n  fun onClickTelemetryPositive() {\n    val slot = slot<Boolean>()\n    every { telemetry.setUserTelemetryRequestState(capture(slot)) } just Runs\n    assertNull(attributionDialogManagerImpl.telemetryDialog)\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    attributionDialogManagerImpl.onClick(mockk(), 1)\n    assertNotNull(attributionDialogManagerImpl.telemetryDialog)\n    assertTrue(attributionDialogManagerImpl.telemetryDialog!!.isShowing)\n    val button =\n      attributionDialogManagerImpl.telemetryDialog!!.getButton(DialogInterface.BUTTON_POSITIVE)\n    assertNotNull(button)\n    button.performClick()\n    ShadowLooper.runUiThreadTasks()\n    assertFalse(attributionDialogManagerImpl.telemetryDialog!!.isShowing)\n    assertTrue(slot.captured)\n  }\n\n  @Test\n  fun onClickTelemetryNegativeButton() {\n    val slot = slot<Boolean>()\n    every { telemetry.setUserTelemetryRequestState(capture(slot)) } just Runs\n    assertNull(attributionDialogManagerImpl.telemetryDialog)\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    attributionDialogManagerImpl.onClick(mockk(), 1)\n    assertNotNull(attributionDialogManagerImpl.telemetryDialog)\n    assertTrue(attributionDialogManagerImpl.telemetryDialog!!.isShowing)\n    val button =\n      attributionDialogManagerImpl.telemetryDialog!!.getButton(DialogInterface.BUTTON_NEGATIVE)\n    assertNotNull(button)\n    button.performClick()\n    ShadowLooper.runUiThreadTasks()\n    assertFalse(attributionDialogManagerImpl.telemetryDialog!!.isShowing)\n    assertFalse(slot.captured)\n  }\n\n  @Test\n  fun onClickTelemetryNeutralButton() {\n    assertNull(attributionDialogManagerImpl.telemetryDialog)\n    attributionDialogManagerImpl.showAttribution(mapAttributionDelegate)\n    attributionDialogManagerImpl.onClick(mockk(), 1)\n    assertNotNull(attributionDialogManagerImpl.telemetryDialog)\n    assertTrue(attributionDialogManagerImpl.telemetryDialog!!.isShowing)\n    val button =\n      attributionDialogManagerImpl.telemetryDialog!!.getButton(DialogInterface.BUTTON_NEUTRAL)\n    assertNotNull(button)\n    button.performClick()\n    ShadowLooper.runUiThreadTasks()\n    assertFalse(attributionDialogManagerImpl.telemetryDialog!!.isShowing)\n  }\n}"
  },
  {
    "path": "plugin-attribution/src/test/java/com/mapbox/maps/plugin/attribution/AttributionPluginImplImplTest.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport android.view.View\nimport android.widget.FrameLayout\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass AttributionPluginImplImplTest {\n\n  private lateinit var attributionPlugin: AttributionPlugin\n  private val attributionView = mockk<AttributionViewImpl>(relaxUnitFun = true)\n  private val delegateProvider = mockk<MapDelegateProvider>(relaxed = true)\n  private val mapAttributionDelegate = mockk<MapAttributionDelegate>(relaxed = true)\n  private val clickSot = slot<View.OnClickListener>()\n  private val context: Context = mockk(relaxed = true)\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n  private val mapView = mockk<FrameLayout>()\n  private val typedArray: TypedArray = mockk(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    mockkStatic(Color::class)\n    every { Color.parseColor(any()) } returns Color.WHITE\n    every { delegateProvider.mapAttributionDelegate } returns mapAttributionDelegate\n    every { mapView.context } returns context\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getColor(any(), any()) } returns Color.WHITE\n    every { typedArray.getInt(any(), any()) } returns (Gravity.BOTTOM or Gravity.START)\n    every { typedArray.getDimension(any(), any()) } returns 0f\n\n    attributionPlugin = AttributionPluginImpl { attributionView }\n    attributionPlugin.onDelegateProvider(delegateProvider)\n    attributionPlugin.bind(mapView, attrs, 1f)\n    attributionPlugin.onPluginView(attributionView)\n    verify {\n      attributionView.setViewOnClickListener(capture(clickSot))\n    }\n    attributionPlugin.initialize()\n  }\n\n  @After\n  fun stop() {\n    attributionPlugin.onStop()\n  }\n\n  @Test\n  fun attributionGravity() {\n    assertEquals(Gravity.BOTTOM or Gravity.START, attributionPlugin.position)\n    attributionPlugin.position = Gravity.BOTTOM\n    verify { attributionView.setGravity(Gravity.BOTTOM) }\n  }\n\n  @Test\n  fun enabled() {\n    assertEquals(true, attributionPlugin.enabled)\n    attributionPlugin.enabled = false\n    verify { attributionView.setEnable(false) }\n    attributionPlugin.enabled = true\n    verify { attributionView.setEnable(true) }\n  }\n\n  @Test\n  fun bind() {\n    val mapView = mockk<FrameLayout>()\n    every { mapView.context } returns mockk(relaxed = true)\n    assertEquals(attributionView, attributionPlugin.bind(mapView, mockk(relaxed = true), 1.0f))\n  }\n\n  @Test\n  fun setAttributionMargins() {\n    attributionPlugin.updateSettings {\n      marginLeft = 1f; marginTop = 2f; marginRight = 3f; marginBottom = 4f\n    }\n    verify { attributionView.setAttributionMargins(1, 2, 3, 4) }\n    verify { attributionView.requestLayout() }\n  }\n\n  @Test\n  fun setDialogManager() {\n    val dialogManager = mockk<AttributionDialogManager>(relaxed = true)\n    attributionPlugin.setCustomAttributionDialogManager(dialogManager)\n    attributionPlugin.clickable = false\n    clickSot.captured.onClick(attributionView)\n    verify(exactly = 0) { dialogManager.showAttribution(mapAttributionDelegate) }\n    attributionPlugin.clickable = true\n    clickSot.captured.onClick(attributionView)\n    verify(exactly = 1) { dialogManager.showAttribution(mapAttributionDelegate) }\n  }\n\n  @Test\n  fun mapAttributionDelegate() {\n    assertEquals(mapAttributionDelegate, attributionPlugin.getMapAttributionDelegate())\n  }\n\n  @Test\n  fun setContentDescription() {\n    val customDescription = \"Custom attribution content description\"\n    attributionPlugin.setContentDescription(customDescription)\n    verify { attributionView.setContentDescription(customDescription) }\n  }\n\n  @Test\n  fun setContentDescriptionWithNull() {\n    attributionPlugin.setContentDescription(null)\n    verify { attributionView.setContentDescription(null) }\n  }\n}"
  },
  {
    "path": "plugin-attribution/src/test/java/com/mapbox/maps/plugin/attribution/AttributionViewImplTest.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport android.graphics.Color\nimport android.view.Gravity\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.test.core.app.ApplicationProvider\nimport com.mapbox.maps.logW\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass AttributionViewImplTest {\n\n  private lateinit var attributionView: AttributionViewImpl\n\n  @Before\n  fun setUp() {\n    attributionView = AttributionViewImpl(ApplicationProvider.getApplicationContext())\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun enabled() {\n    attributionView.setEnable(false)\n    assertEquals(View.GONE, attributionView.visibility)\n    attributionView.setEnable(true)\n    assertEquals(View.VISIBLE, attributionView.visibility)\n  }\n\n  @Test\n  fun gravity() {\n    attributionView.setGravity(Gravity.TOP)\n    assertEquals(Gravity.TOP, (attributionView.layoutParams as FrameLayout.LayoutParams).gravity)\n    attributionView.setGravity(Gravity.BOTTOM or Gravity.START)\n    assertEquals(\n      Gravity.BOTTOM or Gravity.START,\n      (attributionView.layoutParams as FrameLayout.LayoutParams).gravity\n    )\n  }\n\n  @Test\n  fun setIconColor() {\n    attributionView.setIconColor(Color.WHITE)\n    // todo: how to verify this?\n  }\n\n  @Test\n  fun setMargin() {\n    attributionView.setAttributionMargins(1, 2, 3, 4)\n    val layoutParams = attributionView.layoutParams as FrameLayout.LayoutParams\n    assertEquals(1, layoutParams.marginStart)\n    assertEquals(2, layoutParams.topMargin)\n    assertEquals(3, layoutParams.marginEnd)\n    assertEquals(4, layoutParams.bottomMargin)\n  }\n\n  @Test\n  fun setOnClickListener() {\n    assertFalse(attributionView.hasOnClickListeners())\n    attributionView.setViewOnClickListener(mockk())\n    assertTrue(attributionView.hasOnClickListeners())\n  }\n\n  @Test\n  fun setContentDescription() {\n    val customDescription = \"Custom attribution description\"\n    attributionView.setContentDescription(customDescription)\n    assertEquals(customDescription, attributionView.contentDescription)\n  }\n\n  @Test\n  fun setContentDescriptionWithNull() {\n    attributionView.setContentDescription(null)\n    assertNull(attributionView.contentDescription)\n  }\n\n  @Test\n  fun defaultContentDescription() {\n    // Default content description should be set from string resource\n    assertNotNull(attributionView.contentDescription)\n    assertTrue(attributionView.contentDescription.isNotEmpty())\n  }\n}"
  },
  {
    "path": "plugin-attribution/src/test/java/com/mapbox/maps/plugin/attribution/generated/AttributionAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.attribution.generated\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport com.mapbox.maps.plugin.attribution.R\nimport io.mockk.Runs\nimport io.mockk.clearAllMocks\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\n\nclass AttributionAttributeParserTest {\n  private val context: Context = mockk(relaxed = true)\n\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n\n  private val typedArray: TypedArray = mockk(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    mockkStatic(Color::class)\n    every { Color.parseColor(any()) } returns Color.WHITE\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getInt(any(), any()) } returns 0\n    every { typedArray.getColor(any(), any()) } returns Color.RED\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getResourceId(any(), -1) } returns 1\n    every { typedArray.hasValue(any()) } returns true\n    every { typedArray.recycle() } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun testTypedArrayRecycle() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, 1.2f)\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun testTypedArrayRecycleWithException() {\n    every { typedArray.getBoolean(any(), any()) }.throws(Exception(\"\"))\n    try {\n      val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, 1.2f)\n    } catch (e: Exception) {\n      // do nothing\n    }\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun enabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.enabled)\n  }\n\n  @Test\n  fun enabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.enabled)\n  }\n  @Test\n  fun iconColorTest() {\n    every { typedArray.getColor(any(), any()) } returns Color.parseColor(\"#FF1E8CAB\")\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, 1.2f)\n    assertEquals(Color.parseColor(\"#FF1E8CAB\"), settings.iconColor)\n  }\n\n  @Test\n  fun positionTest() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_attributionGravity, any()) } returns 100\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, 1.2f)\n    assertEquals(100, settings.position)\n  }\n\n  @Test\n  fun marginLeftTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 92f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginLeft)\n  }\n\n  @Test\n  fun marginTopTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginTop)\n  }\n\n  @Test\n  fun marginRightTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginRight)\n  }\n\n  @Test\n  fun marginBottomTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginBottom)\n  }\n\n  @Test\n  fun clickableTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.clickable)\n  }\n\n  @Test\n  fun clickableTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = AttributionAttributeParser.parseAttributionSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.clickable)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-attribution/src/test/resources/robolectric.properties",
    "content": "sdk=28"
  },
  {
    "path": "plugin-compass/README.md",
    "content": "## Mapbox Maps Compass Plugin for Android\n\n### Overview\n\nThe Mapbox Maps Compass Plugin for Android is an public library for displaying compass on top of MapView. By default the plugin will show a compass on top of the map at the top-right corner. The compass will appear and point to north direction when the map is rotated. When clicked, the map will be reset to face north and disappear. Please visit our [documentation](https://docs.mapbox.com/android/maps/guides/ui-settings/#compass) for more information on displaying compass.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n![compass-plugin](https://user-images.githubusercontent.com/2764714/94573517-d784c380-027a-11eb-9a1f-2d22a1bd2525.gif)\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Compass Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the compass plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-compass:11.22.0-rc.1'\n  // Mapbox Maps Compass Plugin depends on the Mapbox Maps Animation Plugin\n  implementation 'com.mapbox.plugin:maps-animation:11.22.0-rc.1'\n}\n```\n\nPlease note that Mapbox Maps Compass Plugin depends on the Mapbox Maps Animation Plugin, failing to provide the Mapbox Maps Animation Plugin dependency will result in a RuntimeException.\n\n### Example\n\nCustomizing Mapbox Maps Compass Plugin for Android could be done in two ways: by either providing your own version of the compass plugin or by setting the CompassSettings to the compass plugin. The former is documented in [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md), the latter can be achieved with:\n\n```kotlin\nval plugin = mapView.compass\nplugin.compassSettings = CompassSettings(...)\n```\n\nMore concrete examples of the compass plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-compass/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.compass {\n\n  public final class CompassUtils {\n    method public static com.mapbox.maps.plugin.compass.CompassPlugin getCompass(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n  public class CompassViewImpl extends androidx.appcompat.widget.AppCompatImageView implements com.mapbox.maps.plugin.compass.CompassView {\n    ctor public CompassViewImpl(android.content.Context context, android.util.AttributeSet? attrs = null, int defStyleAttr = 0);\n    ctor public CompassViewImpl(android.content.Context context, android.util.AttributeSet? attrs = null);\n    ctor public CompassViewImpl(android.content.Context context);\n    method public int getCompassGravity();\n    method public android.graphics.drawable.Drawable getCompassImage();\n    method public float getCompassRotation();\n    method public boolean isCompassEnabled();\n    method public boolean isCompassVisible();\n    method public void setCompassAlpha(float float);\n    method public void setCompassEnabled(boolean);\n    method public void setCompassGravity(int);\n    method public void setCompassImage(android.graphics.drawable.Drawable);\n    method public void setCompassMargins(int left, int top, int right, int bottom);\n    method public void setCompassRotation(float);\n    method public void setCompassVisible(boolean);\n    property public int compassGravity;\n    property public android.graphics.drawable.Drawable compassImage;\n    property public float compassRotation;\n    property public boolean isCompassEnabled;\n    property public boolean isCompassVisible;\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-compass/api/plugin-compass.api",
    "content": "public final class com/mapbox/maps/plugin/compass/CompassUtils {\n\tpublic static final synthetic fun createCompassPlugin ()Lcom/mapbox/maps/plugin/compass/CompassPlugin;\n\tpublic static final fun getCompass (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/compass/CompassPlugin;\n}\n\npublic class com/mapbox/maps/plugin/compass/CompassViewImpl : androidx/appcompat/widget/AppCompatImageView, com/mapbox/maps/plugin/compass/CompassView {\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;I)V\n\tpublic synthetic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCompassGravity ()I\n\tpublic fun getCompassImage ()Landroid/graphics/drawable/Drawable;\n\tpublic fun getCompassRotation ()F\n\tpublic fun isCompassEnabled ()Z\n\tpublic fun isCompassVisible ()Z\n\tpublic fun setCompassAlpha (F)V\n\tpublic fun setCompassEnabled (Z)V\n\tpublic fun setCompassGravity (I)V\n\tpublic fun setCompassImage (Landroid/graphics/drawable/Drawable;)V\n\tpublic fun setCompassMargins (IIII)V\n\tpublic fun setCompassRotation (F)V\n\tpublic fun setCompassVisible (Z)V\n}\n\n"
  },
  {
    "path": "plugin-compass/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.compass\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-compass\"\n    artifactTitle = \"The compass module for the Mapbox Maps SDK\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-compass\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  testImplementation(project(\":plugin-animation\"))\n\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\ntasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { kotlinOptions.jvmTarget = \"1.8\" }\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-compass/src/main/java/com/mapbox/maps/plugin/compass/CompassExt.kt",
    "content": "@file:JvmName(\"CompassUtils\")\n\npackage com.mapbox.maps.plugin.compass\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val for MapView to get the Compass View plugin instance.\n */\nval MapPluginProviderDelegate.compass: CompassPlugin\n  @JvmName(\"getCompass\")\n  get() = this.getPlugin(Plugin.MAPBOX_COMPASS_PLUGIN_ID)!!\n\n/**\n * Static method to create instance of Mapbox compass plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createCompassPlugin(): CompassPlugin {\n  return CompassViewPlugin()\n}"
  },
  {
    "path": "plugin-compass/src/main/java/com/mapbox/maps/plugin/compass/CompassViewImpl.kt",
    "content": "package com.mapbox.maps.plugin.compass\n\nimport android.content.Context\nimport android.graphics.drawable.Drawable\nimport android.util.AttributeSet\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.appcompat.widget.AppCompatImageView\nimport androidx.core.content.res.ResourcesCompat\n\n/**\n * Concrete implementation of CompassView.\n */\nopen class CompassViewImpl\n/**\n * Constructor with context, attribute set and defStyleAttr.\n *\n * @param context\n * @param attrs The attribution set.\n * @param defStyleAttr An attribute in the current theme that contains a reference to a style\n *  resource that supplies defaults values for the StyledAttributes. Can be 0 to not look for defaults.\n */\n@JvmOverloads constructor(\n  context: Context,\n  attrs: AttributeSet? = null,\n  defStyleAttr: Int = 0\n) : CompassView, AppCompatImageView(context, attrs, defStyleAttr) {\n\n  private lateinit var presenter: CompassPlugin\n\n  init {\n    ResourcesCompat.getDrawable(\n      resources,\n      R.drawable.mapbox_compass_icon,\n      null\n    )?.let { compassImage = it }\n\n    // Layout params\n    val compassViewSize = resources.getDimensionPixelSize(R.dimen.compass_view_size)\n    layoutParams = FrameLayout.LayoutParams(compassViewSize, compassViewSize)\n\n    // click listener\n    setOnClickListener { if (::presenter.isInitialized) presenter.onCompassClicked() }\n    contentDescription = context.getString(R.string.mapbox_compassContentDescription)\n  }\n\n  /**\n   * Whether the compass view is visible.\n   */\n  override var isCompassVisible: Boolean\n    get() = visibility == View.VISIBLE\n    set(value) {\n      visibility = if (value) {\n        View.VISIBLE\n      } else {\n        View.GONE\n      }\n    }\n\n  /**\n   * Returns the gravity value of the CompassView.\n   */\n  override var compassGravity: Int\n    get() = (layoutParams as FrameLayout.LayoutParams).gravity\n    set(value) {\n      (layoutParams as FrameLayout.LayoutParams).gravity = value\n    }\n\n  /**\n   * The direction of the CompassView.\n   */\n  override var compassRotation: Float\n    get() = rotation\n    set(value) {\n      rotation = value\n    }\n\n  /**\n   * Whether the compass view is enabled.\n   */\n  override var isCompassEnabled: Boolean\n    get() = isEnabled\n    set(value) {\n      if (isEnabled != value) {\n        isEnabled = value\n      }\n    }\n\n  /**\n   * The CompassView image as a Drawable.\n   */\n  override var compassImage: Drawable\n    get() = drawable\n    set(compass) {\n      setImageDrawable(compass)\n    }\n\n  /**\n   * Set the margins of the compass view.\n   *\n   * @param left Margin to the left in pixel\n   * @param top Margin to the top in pixel\n   * @param right Margin to the right in pixel\n   * @param bottom Margin to the bottom in pixel\n   */\n  override fun setCompassMargins(left: Int, top: Int, right: Int, bottom: Int) {\n    (layoutParams as FrameLayout.LayoutParams).setMargins(left, top, right, bottom)\n  }\n\n  /**\n   * Set the alpha value of the compass.\n   *\n   * @param float the alpha value\n   */\n  override fun setCompassAlpha(float: Float) {\n    alpha = float\n  }\n\n  internal fun injectPresenter(presenter: CompassPlugin) {\n    this.presenter = presenter\n  }\n}"
  },
  {
    "path": "plugin-compass/src/main/java/com/mapbox/maps/plugin/compass/CompassViewPlugin.kt",
    "content": "package com.mapbox.maps.plugin.compass\n\nimport android.animation.ValueAnimator\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.graphics.drawable.BitmapDrawable\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.annotation.RestrictTo\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.core.animation.doOnEnd\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.plugin.InvalidPluginConfigurationException\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_CAMERA_PLUGIN_ID\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOwnerRegistry\nimport com.mapbox.maps.plugin.compass.generated.CompassAttributeParser\nimport com.mapbox.maps.plugin.compass.generated.CompassSettings\nimport com.mapbox.maps.plugin.compass.generated.CompassSettingsBase\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport java.util.concurrent.CopyOnWriteArraySet\nimport kotlin.math.abs\n\n/**\n * Concrete implementation of CompassPlugin.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class CompassViewPlugin(\n  private val viewImplProvider: (Context) -> CompassViewImpl = { CompassViewImpl(it) },\n  @SuppressLint(\"Recycle\")\n  private val fadeAnimator: ValueAnimator = ValueAnimator.ofFloat(1f, 0f)\n) : CompassPlugin, CompassSettingsBase() {\n\n  private lateinit var compassView: CompassView\n  private lateinit var mapCameraManager: MapCameraManagerDelegate\n  internal var bearing: Double = DEFAULT_BEARING\n  private var animationPlugin: CameraAnimationsPlugin? = null\n\n  private var isHidden = false\n\n  override var internalSettings: CompassSettings = CompassSettings { }\n\n  private val compassClickListeners: CopyOnWriteArraySet<OnCompassClickListener> =\n    CopyOnWriteArraySet()\n\n  init {\n    fadeAnimator.apply {\n      duration = TIME_FADE_ANIMATION\n      startDelay = TIME_WAIT_IDLE\n      doOnEnd {\n        compassView.isCompassVisible = false\n      }\n      addUpdateListener {\n        val value = it.animatedValue as Float\n        if (value < internalSettings.opacity) {\n          compassView.setCompassAlpha(value)\n        }\n      }\n    }\n  }\n\n  override fun applySettings() {\n    enabled = internalSettings.enabled\n    compassView.apply {\n      compassGravity = internalSettings.position\n      internalSettings.image?.let { imageHolder ->\n        val context = (this as CompassViewImpl).context\n        imageHolder.bitmap?.let {\n          compassImage = BitmapDrawable(context.resources, it)\n        }\n        imageHolder.drawableId?.let { id ->\n          if (id != -1) {\n            compassImage = AppCompatResources.getDrawable(context, id)!!\n          }\n        }\n      }\n      compassRotation = internalSettings.rotation\n      isCompassEnabled = internalSettings.enabled\n      setCompassAlpha(internalSettings.opacity)\n      setCompassMargins(\n        internalSettings.marginLeft.toInt(),\n        internalSettings.marginTop.toInt(),\n        internalSettings.marginRight.toInt(),\n        internalSettings.marginBottom.toInt()\n      )\n      update(bearing)\n      requestLayout()\n    }\n  }\n\n  /**\n   * Defines whether the plugins is enabled or disabled.\n   */\n  override var enabled: Boolean\n    get() = internalSettings.enabled\n    set(value) {\n      internalSettings = internalSettings.toBuilder().setEnabled(value).build()\n      compassView.isCompassEnabled = value\n      update(bearing)\n      if (value && !shouldHideCompass()) {\n        compassView.setCompassAlpha(internalSettings.opacity)\n        compassView.isCompassVisible = true\n      } else {\n        compassView.setCompassAlpha(0f)\n        compassView.isCompassVisible = false\n      }\n    }\n\n  /**\n   * Bind the ViewPlugin with current map context. This will create a View that\n   * will be added to the MapView.\n   *\n   * @param mapView parent view which can be used to fetch [android.content.Context] or [ViewGroup.LayoutParams]\n   * @param attrs parent attributes\n   * @param pixelRatio the pixel ratio of the device\n   * @return View that will be added to the MapView\n   */\n  override fun bind(mapView: FrameLayout, attrs: AttributeSet?, pixelRatio: Float): View {\n    internalSettings =\n      CompassAttributeParser.parseCompassSettings(mapView.context, attrs, pixelRatio)\n    return viewImplProvider(mapView.context).also {\n      it.injectPresenter(this)\n    }\n  }\n\n  /**\n   * Provides a view instances returned in [bind] after it's been added to the MapView.\n   *\n   * @param view plugin view\n   */\n  override fun onPluginView(view: View) {\n    compassView = view as? CompassView\n      ?: throw IllegalArgumentException(\"The provided view needs to implement CompassContract.CompassView\")\n    updateVisibility(false)\n  }\n\n  /**\n   * Called when the plugin is first added to the map.\n   */\n  override fun initialize() {\n    applySettings()\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   */\n  override fun cleanup() {\n    compassClickListeners.clear()\n    fadeAnimator.cancel()\n    compassView.isCompassEnabled = false\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    mapCameraManager = delegateProvider.mapCameraManagerDelegate\n    bearing = mapCameraManager.cameraState.bearing\n    animationPlugin = delegateProvider.mapPluginProviderDelegate.getPlugin(MAPBOX_CAMERA_PLUGIN_ID)\n      ?: throw InvalidPluginConfigurationException(\n        \"Can't look up an instance of plugin, \" +\n          \"is it available on the clazz path and loaded through the map?\"\n      )\n  }\n\n  /**\n   * Called whenever activity's/fragment's lifecycle is entering a \"started\" state.\n   */\n  override fun onStart() {\n    update(bearing)\n  }\n\n  /**\n   * Called whenever activity's/fragment's lifecycle is entering a \"stopped\" state.\n   */\n  override fun onStop() {\n    fadeAnimator.cancel()\n  }\n\n  /**\n   * Called whenever camera position changes.\n   * Could be invoked from any thread when map starts rendering.\n   */\n  override fun onCameraMove(\n      center: Point,\n      zoom: Double,\n      pitch: Double,\n      bearing: Double,\n      padding: EdgeInsets\n  ) {\n    update(bearing)\n  }\n\n  /**\n   * Add an OnClick listener to the presenter.\n   *\n   * @param onClickListener Listener for OnClick events\n   */\n  override fun addCompassClickListener(onClickListener: OnCompassClickListener) {\n    compassClickListeners.add(onClickListener)\n  }\n\n  /**\n   * Remove an OnClick listener from the presenter.\n   *\n   * @param onClickListener Listener for OnClick events\n   */\n  override fun removeCompassClickListener(onClickListener: OnCompassClickListener) {\n    compassClickListeners.remove(onClickListener)\n  }\n\n  /**\n   * Invoked when the compass view is clicked.\n   */\n  override fun onCompassClicked() {\n    if (internalSettings.clickable) {\n      animationPlugin?.flyTo(\n        CameraOptions.Builder().bearing(DEFAULT_BEARING).build(),\n        mapAnimationOptions {\n          owner(MapAnimationOwnerRegistry.COMPASS)\n          duration(BEARING_NORTH_ANIMATION_DURATION)\n        }\n      ) ?: mapCameraManager.setCamera(CameraOptions.Builder().bearing(DEFAULT_BEARING).build())\n      compassClickListeners.forEach { it.onCompassClick() }\n    }\n  }\n\n  private fun update(bearing: Double) {\n    this.bearing = bearing\n    compassView.compassRotation = -bearing.toFloat()\n    updateVisibility()\n  }\n\n  private fun updateVisibility(withAnimator: Boolean = true) {\n    if (!compassView.isCompassEnabled) {\n      return\n    }\n\n    if (shouldHideCompass()) {\n      if (isHidden) {\n        return\n      }\n      isHidden = true\n      if (withAnimator) {\n        fadeAnimator.start()\n      } else {\n        compassView.isCompassVisible = false\n        compassView.setCompassAlpha(0f)\n      }\n    } else {\n      isHidden = false\n      fadeAnimator.cancel()\n      compassView.isCompassVisible = true\n      compassView.setCompassAlpha(internalSettings.opacity)\n    }\n  }\n\n  private fun shouldHideCompass(): Boolean {\n    return internalSettings.fadeWhenFacingNorth && isFacingNorth()\n  }\n\n  private fun isFacingNorth(): Boolean {\n    // increase range of facing north to more than only 0.0\n    return abs(compassView.compassRotation) >= 359.0 || abs(compassView.compassRotation) <= 1.0\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  private companion object {\n    private const val DEFAULT_BEARING = 0.0\n    private const val TIME_WAIT_IDLE = 500L\n    private const val TIME_FADE_ANIMATION = TIME_WAIT_IDLE\n    private const val BEARING_NORTH_ANIMATION_DURATION = 300L\n  }\n}"
  },
  {
    "path": "plugin-compass/src/main/java/com/mapbox/maps/plugin/compass/generated/CompassAttributeParser.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.compass.generated\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.plugin.compass.R\n\n/**\n * Utility class for parsing [AttributeSet] to [CompassSettings].\n */\ninternal object CompassAttributeParser {\n  /**\n   * Parse [AttributeSet] to [CompassSettings].\n   *\n   * @param context Context\n   * @param attrs AttributionSet\n   */\n  fun parseCompassSettings(context: Context, attrs: AttributeSet?, pixelRatio: Float = 1.0f): CompassSettings {\n    val typedArray = context.obtainStyledAttributes(attrs, R.styleable.mapbox_MapView, 0, 0)\n    try {\n      return CompassSettings {\n        enabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_compassEnabled, true)\n        position = typedArray.getInt(R.styleable.mapbox_MapView_mapbox_compassGravity, Gravity.TOP or Gravity.END)\n        marginLeft = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_compassMarginLeft, 4f * pixelRatio)\n        marginTop = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_compassMarginTop, 4f * pixelRatio)\n        marginRight = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_compassMarginRight, 4f * pixelRatio)\n        marginBottom = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_compassMarginBottom, 4f * pixelRatio)\n        opacity = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_compassOpacity, 1f)\n        rotation = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_compassRotation, 0f)\n        visibility = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_compassVisibility, true)\n        fadeWhenFacingNorth = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_compassFadeWhenFacingNorth, true)\n        clickable = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_compassClickable, true)\n        image = ImageHolder.from(typedArray.getResourceId(R.styleable.mapbox_MapView_mapbox_compassImage, -1))\n      }\n    } finally {\n      typedArray.recycle()\n    }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-compass/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n    <declare-styleable name=\"mapbox_MapView\">\n        <!-- Whether the compass is visible on the map. -->\n        <attr name=\"mapbox_compassEnabled\" format=\"boolean\"/>\n\n        <!-- Defines where the compass is positioned on the map -->\n        <attr name=\"mapbox_compassGravity\">\n            <!-- Push object to the top of its container, not changing its size. -->\n            <flag name=\"top\" value=\"0x30\" />\n            <!-- Push object to the bottom of its container, not changing its size. -->\n            <flag name=\"bottom\" value=\"0x50\" />\n            <!-- Push object to the left of its container, not changing its size. -->\n            <flag name=\"left\" value=\"0x03\" />\n            <!-- Push object to the right of its container, not changing its size. -->\n            <flag name=\"right\" value=\"0x05\" />\n            <!-- Place object in the vertical center of its container, not changing its size. -->\n            <flag name=\"center_vertical\" value=\"0x10\" />\n            <!-- Grow the vertical size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill_vertical\" value=\"0x70\" />\n            <!-- Place object in the horizontal center of its container, not changing its size. -->\n            <flag name=\"center_horizontal\" value=\"0x01\" />\n            <!-- Grow the horizontal size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill_horizontal\" value=\"0x07\" />\n            <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->\n            <flag name=\"center\" value=\"0x11\" />\n            <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill\" value=\"0x77\" />\n            <!-- Additional option that can be set to have the top and/or bottom edges of\n                 the child clipped to its container's bounds.\n                 The clip will be based on the vertical gravity: a top gravity will clip the bottom\n                 edge, a bottom gravity will clip the top edge, and neither will clip both edges. -->\n            <flag name=\"clip_vertical\" value=\"0x80\" />\n            <!-- Additional option that can be set to have the left and/or right edges of\n                 the child clipped to its container's bounds.\n                 The clip will be based on the horizontal gravity: a left gravity will clip the right\n                 edge, a right gravity will clip the left edge, and neither will clip both edges. -->\n            <flag name=\"clip_horizontal\" value=\"0x08\" />\n            <!-- Push object to the beginning of its container, not changing its size. -->\n            <flag name=\"start\" value=\"0x00800003\" />\n            <!-- Push object to the end of its container, not changing its size. -->\n            <flag name=\"end\" value=\"0x00800005\" />\n        </attr>\n        <!-- Defines the margin to the left that the compass icon honors. -->\n        <attr name=\"mapbox_compassMarginLeft\" format=\"dimension\"/>\n        <!-- Defines the margin to the top that the compass icon honors. -->\n        <attr name=\"mapbox_compassMarginTop\" format=\"dimension\"/>\n        <!-- Defines the margin to the right that the compass icon honors. -->\n        <attr name=\"mapbox_compassMarginRight\" format=\"dimension\"/>\n        <!-- Defines the margin to the bottom that the compass icon honors. -->\n        <attr name=\"mapbox_compassMarginBottom\" format=\"dimension\"/>\n        <!-- The alpha channel value of the compass image -->\n        <attr name=\"mapbox_compassOpacity\" format=\"float\"/>\n        <!-- The clockwise rotation value in degrees of the compass. -->\n        <attr name=\"mapbox_compassRotation\" format=\"float\"/>\n        <!-- Whether the compass is displayed. -->\n        <attr name=\"mapbox_compassVisibility\" format=\"boolean\"/>\n        <!-- Whether the compass fades out to invisible when facing north direction. -->\n        <attr name=\"mapbox_compassFadeWhenFacingNorth\" format=\"boolean\"/>\n        <!-- Whether the compass can be clicked and click events can be registered. -->\n        <attr name=\"mapbox_compassClickable\" format=\"boolean\"/>\n        <!-- The compass image, the visual representation of the compass. -->\n        <attr name=\"mapbox_compassImage\" format=\"reference\"/>\n    </declare-styleable>\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-compass/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"compass_view_size\">48dp</dimen>\n</resources>"
  },
  {
    "path": "plugin-compass/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"mapbox_compassContentDescription\">Map compass. Activate to reset the map rotation to North.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-ar/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">بوصلة الخريطة. قم بالتنشيط لإعادة ضبط دوران الخريطة إلى الشمال.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-be/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Компас. Актывуйце, каб разгарнуць карту на поўнач.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-bg/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Компас на картата. Активирайте, за да нулирате завъртането на картата на север.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-ca/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Brúixola del mapa. Activeu-lo per restablir la rotació del mapa al nord.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-cs/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Mapový kompas. Aktivací obnovíte otočení mapy na sever.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-da/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Kort kompas. Aktiver for at nulstille kortrotationen til nord.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-de/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Kartenkompass. Aktivieren Sie diese Option, um die Kartendrehung auf Norden zurückzusetzen.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-es/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Brújula del mapa. Actívelo para restablecer la rotación del mapa hacia el norte.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-fr/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Boussole cartographique. Activez pour réinitialiser la rotation de la carte vers le Nord.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-gl/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Compás do mapa. Active para restablecer a rotación do mapa ao norte.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-it/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Bussola della mappa. Attiva per reimpostare la rotazione della mappa verso Nord.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-iw/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">מצפן מפה. הפעל כדי לאפס את סיבוב המפה לצפון.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-ja/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">地図コンパス。有効にすると、マップの回転が北にリセットされます。</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-ko/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">지도 나침반. 지도 회전을 북쪽으로 재설정하려면 활성화하세요.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-lt/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Žemėlapio kompasas. Suaktyvinkite, kad iš naujo nustatytumėte žemėlapio pasukimą į šiaurę.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-nl/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Kaart kompas. Activeer om de kaartrotatie naar het noorden te resetten.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-no/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Kart kompass. Aktiver for å tilbakestille kartrotasjonen til nord.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-pl/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Mapa kompasu. Aktywuj, aby zresetować obrót mapy na północ.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-pt/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Bússola do mapa. Ative para redefinir a rotação do mapa para Norte.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-ru/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Компас. Активируйте, чтобы развернуть карту на север.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-sv/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Karta kompass. Aktivera för att återställa kartrotationen till norr.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-uk/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">Компас. Активуйте, щоб скинути обертання карти на північ.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-vi/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">La bàn bản đồ. Kích hoạt để đặt lại vòng xoay bản đồ về hướng Bắc.</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-zh/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">地图指南针。激活可将地图旋转重置为北。</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-zh-rCN/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">地图指南针。激活可将地图旋转重置为北。</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-zh-rHK/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">地圖指南針。啟動可將地圖旋轉重置為北。</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res/values-zh-rTW/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_compassContentDescription\">地圖指南針。啟動可將地圖旋轉重置為北。</string>\n</resources>\n"
  },
  {
    "path": "plugin-compass/src/main/res-public/values/public.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n\n    <!-- Whether the compass is visible on the map. -->\n    <public name=\"mapbox_compassEnabled\" type=\"attr\" />\n\n    <!-- Defines where the compass is positioned on the map -->\n    <public name=\"mapbox_compassGravity\" type=\"attr\" />\n\n    <!-- Defines the margin to the left that the compass icon honors. -->\n    <public name=\"mapbox_compassMarginLeft\" type=\"attr\" />\n\n    <!-- Defines the margin to the top that the compass icon honors. -->\n    <public name=\"mapbox_compassMarginTop\" type=\"attr\" />\n\n    <!-- Defines the margin to the right that the compass icon honors. -->\n    <public name=\"mapbox_compassMarginRight\" type=\"attr\" />\n\n    <!-- Defines the margin to the bottom that the compass icon honors. -->\n    <public name=\"mapbox_compassMarginBottom\" type=\"attr\" />\n\n    <!-- The alpha channel value of the compass image -->\n    <public name=\"mapbox_compassOpacity\" type=\"attr\" />\n\n    <!-- The clockwise rotation value in degrees of the compass. -->\n    <public name=\"mapbox_compassRotation\" type=\"attr\" />\n\n    <!-- Whether the compass is displayed. -->\n    <public name=\"mapbox_compassVisibility\" type=\"attr\" />\n\n    <!-- Whether the compass fades out to invisible when facing north direction. -->\n    <public name=\"mapbox_compassFadeWhenFacingNorth\" type=\"attr\" />\n\n    <!-- Whether the compass can be clicked and click events can be registered. -->\n    <public name=\"mapbox_compassClickable\" type=\"attr\" />\n\n    <!-- The compass image, the visual representation of the compass. -->\n    <public name=\"mapbox_compassImage\" type=\"attr\" />\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-compass/src/test/java/com/mapbox/maps/plugin/compass/CompassViewPluginTest.kt",
    "content": "package com.mapbox.maps.plugin.compass\n\nimport android.animation.Animator\nimport android.animation.ValueAnimator\nimport android.graphics.Bitmap\nimport android.graphics.drawable.BitmapDrawable\nimport android.graphics.drawable.Drawable\nimport android.os.Handler\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport android.widget.FrameLayout\nimport androidx.appcompat.content.res.AppCompatResources\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOwnerRegistry\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport io.mockk.*\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\n\nclass CompassViewPluginTest {\n\n  private lateinit var compassPlugin: CompassPlugin\n  private val compassView = mockk<CompassViewImpl>(relaxed = true)\n  private val fadeAnimator = mockk<ValueAnimator>(relaxUnitFun = true)\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private val mapCameraDelegate = mockk<MapCameraManagerDelegate>(relaxUnitFun = true)\n  private val animatePlugin = mockk<CameraAnimationsPlugin>(relaxed = true)\n  private lateinit var fadeAnimatorEndListener: Animator.AnimatorListener\n  private lateinit var fadeAnimatorUpdateListener: ValueAnimator.AnimatorUpdateListener\n  private val padding = EdgeInsets(0.0, 0.0, 0.0, 0.0)\n  private val zeroPoint = Point.fromLngLat(0.0, 0.0)\n\n  @Before\n  fun setUp() {\n    val animatorEndListenerSlot = slot<Animator.AnimatorListener>()\n    val updateListenerSlot = slot<ValueAnimator.AnimatorUpdateListener>()\n    val mainHandler = mockk<Handler>()\n    val runnableSlot = slot<Runnable>()\n    every { fadeAnimator.addListener(capture(animatorEndListenerSlot)) } answers {}\n    every { fadeAnimator.addUpdateListener(capture(updateListenerSlot)) } answers {}\n    every { fadeAnimator.setDuration(any()) } returns fadeAnimator\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraDelegate\n    every { mapCameraDelegate.cameraState.bearing } returns 0.0\n    every { compassView.isCompassEnabled } returns true\n    every { compassView.compassRotation } returns 0f\n    every { delegateProvider.mapPluginProviderDelegate.getPlugin<CameraAnimationsPlugin>(Plugin.MAPBOX_CAMERA_PLUGIN_ID) } returns animatePlugin\n    every { mainHandler.post(capture(runnableSlot)) } answers {\n      runnableSlot.captured.run()\n      true\n    }\n\n    compassPlugin = CompassViewPlugin({ compassView }, fadeAnimator)\n    compassPlugin.onPluginView(compassView)\n    compassPlugin.onDelegateProvider(delegateProvider)\n    fadeAnimatorEndListener = animatorEndListenerSlot.captured\n    fadeAnimatorUpdateListener = updateListenerSlot.captured\n  }\n\n  @Test\n  fun fadeAnimatorDuration() {\n    verify { fadeAnimator.duration = 500L }\n  }\n\n  @Test\n  fun fadeAnimatorDelay() {\n    verify { fadeAnimator.startDelay = 500L }\n  }\n\n  @Test\n  fun fadeAnimatorEndListener() {\n    fadeAnimatorEndListener.onAnimationEnd(fadeAnimator)\n    verify { compassView.isCompassVisible = false }\n  }\n\n  @Test\n  fun fadeAnimatorValue() {\n    compassPlugin.opacity = 0.5f\n    every { fadeAnimator.animatedValue } returns 1.0f\n    fadeAnimatorUpdateListener.onAnimationUpdate(fadeAnimator)\n    verify(exactly = 0) { compassView.setCompassAlpha(1.0f) }\n\n    every { fadeAnimator.animatedValue } returns 0.6f\n    fadeAnimatorUpdateListener.onAnimationUpdate(fadeAnimator)\n    verify(exactly = 0) { compassView.setCompassAlpha(0.6f) }\n\n    every { fadeAnimator.animatedValue } returns 0.4f\n    fadeAnimatorUpdateListener.onAnimationUpdate(fadeAnimator)\n    verify(exactly = 1) { compassView.setCompassAlpha(0.4f) }\n\n    every { fadeAnimator.animatedValue } returns 0.1f\n    fadeAnimatorUpdateListener.onAnimationUpdate(fadeAnimator)\n    verify(exactly = 1) { compassView.setCompassAlpha(0.1f) }\n  }\n\n  @Test\n  fun fadeAnimatorUpdateListener() {\n    every { fadeAnimator.animatedValue } returns 0.78f\n    fadeAnimatorUpdateListener.onAnimationUpdate(fadeAnimator)\n    verify { compassView.setCompassAlpha(0.78f) }\n  }\n\n  @Test\n  fun getFadeCompassViewWhenFacingNorth() {\n    assertTrue(compassPlugin.fadeWhenFacingNorth)\n  }\n\n  @Test\n  fun setFadeCompassViewWhenFacingNorth() {\n    every { compassView.isCompassEnabled } returns true\n    compassPlugin.fadeWhenFacingNorth = false\n    assertFalse(compassPlugin.fadeWhenFacingNorth)\n  }\n\n  @Test\n  fun resetFadeCompassViewWhenFacingNorth_false() {\n    every { compassView.isCompassEnabled } returns true\n    every { compassView.compassRotation } returns 0.33f\n    compassPlugin.onCameraMove(\n        zeroPoint,\n        0.0,\n        0.0,\n        -0.33,\n        padding\n    )\n    compassPlugin.fadeWhenFacingNorth = false\n    verify { compassView.setCompassAlpha(1.0f) }\n    verify { compassView.isCompassVisible = true }\n  }\n\n  @Test\n  fun resetFadeCompassViewWhenFacingNorth_true() {\n    every { compassView.isCompassEnabled } returns true\n    compassPlugin.fadeWhenFacingNorth = false\n    every { compassView.isCompassEnabled } returns true\n    every { compassView.compassRotation } returns 0.33f\n    compassPlugin.onCameraMove(\n      zeroPoint,\n        0.0,\n        0.0,\n        -0.33,\n        padding\n    )\n    compassPlugin.fadeWhenFacingNorth = true\n    verify { fadeAnimator.start() }\n  }\n\n  @Test\n  fun getCompassImage() {\n    assertNull(compassPlugin.image)\n  }\n\n  @Test\n  fun setCompassImageAsBitmap() {\n    val image = mockk<Bitmap>()\n    compassPlugin.image = ImageHolder.from(image)\n    val slot = slot<Drawable>()\n    verify { compassView.compassImage = capture(slot) }\n    // did not find a way to check that BitmapDrawable is created with specific arg, see\n    // https://github.com/mockk/mockk/issues/735\n    assert(slot.captured is BitmapDrawable)\n  }\n\n  @Test\n  fun setCompassImageAsDrawable() {\n    val imageId = 1\n    mockkStatic(AppCompatResources::class)\n    every { AppCompatResources.getDrawable(any(), any()) } returns mockk()\n    compassPlugin.image = ImageHolder.from(imageId)\n    verify { compassView.compassImage = any() }\n    verify { AppCompatResources.getDrawable(any(), imageId) }\n    unmockkStatic(AppCompatResources::class)\n  }\n\n  @Test\n  fun getCompassGravity() {\n    assertEquals(Gravity.TOP or Gravity.END, compassPlugin.position)\n  }\n\n  @Test\n  fun setCompassGravity() {\n    compassPlugin.position = Gravity.BOTTOM\n    verify { compassView.compassGravity = Gravity.BOTTOM }\n  }\n\n  @Test\n  fun getEnabled() {\n    every { compassView.isCompassEnabled } returns true\n    assertEquals(true, compassPlugin.enabled)\n  }\n\n  @Test\n  fun setEnabled_true() {\n    every { mapCameraDelegate.cameraState.bearing } returns 10.0\n    compassPlugin.onDelegateProvider(delegateProvider)\n    every { compassView.compassRotation } returns -10f\n    every { compassView.isCompassEnabled } returns true\n    compassPlugin.enabled = true\n    verify { compassView.isCompassEnabled = true }\n    verify { compassView.compassRotation = -(10.0).toFloat() }\n    verify { compassView.setCompassAlpha(1.0f) }\n    verify { compassView.isCompassVisible = true }\n  }\n\n  @Test\n  fun setEnabled_true_hidden() {\n    every { mapCameraDelegate.cameraState.bearing } returns 0.0\n    every { compassView.compassRotation } returns 0f\n    every { compassView.isCompassEnabled } returns true\n    compassPlugin.enabled = true\n    verify { compassView.isCompassEnabled = true }\n    verify { compassView.compassRotation = (-0.0).toFloat() }\n    verify { compassView.setCompassAlpha(0.0f) }\n    verify { compassView.isCompassVisible = false }\n  }\n\n  @Test\n  fun setEnabled_false() {\n    every { mapCameraDelegate.cameraState.bearing } returns 0.0\n    every { compassView.isCompassEnabled } returns false\n    compassPlugin.enabled = false\n    verify { compassView.isCompassEnabled = false }\n    verify { compassView.compassRotation = (-0.0).toFloat() }\n    verify { compassView.setCompassAlpha(0.0f) }\n    verify { compassView.isCompassVisible = false }\n  }\n\n  @Test\n  fun setEnabledWithMarginUpdate_false() {\n    every { mapCameraDelegate.cameraState.bearing } returns 0.0\n    val enabledSlot = slot<Boolean>()\n    every { compassView.isCompassEnabled = capture(enabledSlot) } answers { }\n    compassPlugin.enabled = false\n    verify { compassView.isCompassEnabled = false }\n    verify { compassView.compassRotation = (-0.0).toFloat() }\n    verify { compassView.setCompassAlpha(0.0f) }\n    compassPlugin.marginLeft = 1f\n    assertEquals(false, enabledSlot.captured)\n  }\n\n  @Test\n  fun bind() {\n    val mapView = mockk<FrameLayout>()\n    every { mapView.context } returns mockk(relaxed = true)\n    assertEquals(compassView, compassPlugin.bind(mapView, mockk(relaxUnitFun = true), 1.0f))\n    verify { compassView.injectPresenter(compassPlugin) }\n    verify { compassView.isCompassVisible = false }\n  }\n\n  @Test\n  fun initialize() {\n    every { mapCameraDelegate.cameraState.bearing } returns 0.0\n    every { compassView.compassRotation } returns 0f\n    every { compassView.isCompassEnabled } returns true\n    mockkStatic(AppCompatResources::class)\n    every { AppCompatResources.getDrawable(any(), any()) } returns mockk()\n    val attrs = mockk<AttributeSet>()\n    compassPlugin.bind(mockk(relaxed = true), attrs, 1.0f)\n    compassPlugin.initialize()\n    verify { compassView.isCompassVisible = false }\n    verify { compassView.compassGravity = any() }\n    verify { compassView.compassRotation = (-0.0).toFloat() }\n    unmockkStatic(AppCompatResources::class)\n  }\n\n  @Test\n  fun cleanup() {\n    val clickListener = mockk<OnCompassClickListener>()\n    compassPlugin.addCompassClickListener(clickListener)\n    compassPlugin.cleanup()\n    verify { fadeAnimator.cancel() }\n    verify { compassView.isCompassEnabled = false }\n    compassPlugin.onCompassClicked()\n    verify(exactly = 0) { clickListener.onCompassClick() }\n  }\n\n  @Test\n  fun onStart() {\n    every { mapCameraDelegate.cameraState.bearing } returns 0.0\n    every { compassView.compassRotation } returns 0f\n    every { compassView.isCompassEnabled } returns true\n    compassPlugin.onStart()\n    verify { compassView.compassRotation = (-0.0).toFloat() }\n  }\n\n  @Test\n  fun onStop() {\n    compassPlugin.onStop()\n    verify { fadeAnimator.cancel() }\n  }\n\n  @Test\n  fun onCameraMove() {\n    every { compassView.isCompassEnabled } returns true\n    every { compassView.compassRotation } returns 15f\n    compassPlugin.onCameraMove(\n      zeroPoint,\n        0.0,\n        0.0,\n        -15.0,\n        padding\n    )\n    verify { compassView.compassRotation = -(-15.0).toFloat() }\n    verify { fadeAnimator.cancel() }\n    verify { compassView.setCompassAlpha(1.0f) }\n  }\n\n  @Test\n  fun onCameraMove_disabled() {\n    every { compassView.isCompassEnabled } returns false\n    every { compassView.compassRotation } returns 15f\n    compassPlugin.onCameraMove(\n      zeroPoint,\n        0.0,\n        0.0,\n        -15.0,\n        padding\n    )\n    verify { compassView.compassRotation = -(-15.0).toFloat() }\n    verify(exactly = 0) { fadeAnimator.cancel() }\n    verify(exactly = 0) { compassView.setCompassAlpha(1.0f) }\n  }\n\n  @Test\n  fun onCameraMove_north_hide() {\n    every { compassView.isCompassEnabled } returns true\n    every { compassView.compassRotation } returns 15f\n    compassPlugin.onCameraMove(\n      zeroPoint,\n        0.0,\n        0.0,\n        -15.0,\n        padding\n    )\n    every { compassView.compassRotation } returns 0.33f\n    compassPlugin.onCameraMove(\n      zeroPoint,\n        0.0,\n        0.0,\n        -0.33,\n        padding\n    )\n    every { compassView.compassRotation } returns 0.23f\n    compassPlugin.onCameraMove(\n      zeroPoint,\n        0.0,\n        0.0,\n        -0.23,\n        padding\n    )\n    verify(exactly = 1) { fadeAnimator.start() }\n  }\n\n  @Test\n  fun onCameraMove_north_doNotHide() {\n    every { compassView.isCompassEnabled } returns true\n    every { compassView.compassRotation } returns 15f\n    compassPlugin.fadeWhenFacingNorth = false\n    compassPlugin.onCameraMove(\n      zeroPoint,\n        0.0,\n        0.0,\n        -15.0,\n        padding\n    )\n    every { compassView.compassRotation } returns 0.23f\n    compassPlugin.onCameraMove(\n      zeroPoint,\n        0.0,\n        0.0,\n        -0.23,\n        padding\n    )\n    verify(exactly = 0) { fadeAnimator.start() }\n  }\n\n  @Test\n  fun setCompassMargins() {\n    compassPlugin.updateSettings {\n      marginLeft = 1f; marginTop = 2f; marginRight = 3f; marginBottom = 4f\n    }\n    verify { compassView.setCompassMargins(1, 2, 3, 4) }\n    verify { compassView.requestLayout() }\n  }\n\n  @Test\n  fun addCompassClickListener() {\n    val clickListener = mockk<OnCompassClickListener>(relaxUnitFun = true)\n    compassPlugin.addCompassClickListener(clickListener)\n    compassPlugin.onCompassClicked()\n    verify { clickListener.onCompassClick() }\n  }\n\n  @Test\n  fun removeCompassClickListener() {\n    val clickListener = mockk<OnCompassClickListener>()\n    compassPlugin.addCompassClickListener(clickListener)\n    compassPlugin.removeCompassClickListener(clickListener)\n    compassPlugin.onCompassClicked()\n    verify(exactly = 0) { clickListener.onCompassClick() }\n  }\n\n  @Test\n  fun onCompassClicked() {\n    compassPlugin.onCompassClicked()\n    verify {\n      animatePlugin.flyTo(\n        any(),\n        mapAnimationOptions {\n          owner(MapAnimationOwnerRegistry.COMPASS)\n          duration(300L)\n        }\n      )\n    }\n  }\n\n  @Test\n  fun onCompassDisabledRotateMapEnabled() {\n    compassPlugin.enabled = false\n    compassPlugin.onCameraMove(zeroPoint, 0.0, 0.0, 40.0, padding)\n    every { compassView.compassRotation } returns -40.0f\n    compassPlugin.enabled = true\n    verify { compassView.isCompassVisible = true }\n  }\n\n  @Test\n  fun updateSettings_disableCompass_viewHidden() {\n    clearMocks(compassView)\n\n    compassPlugin.updateSettings { this.enabled = false }\n\n    assertFalse(compassPlugin.enabled)\n    verify { compassView.isCompassVisible = false }\n  }\n}"
  },
  {
    "path": "plugin-compass/src/test/java/com/mapbox/maps/plugin/compass/generated/CompassAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.compass.generated\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport com.mapbox.maps.plugin.compass.R\nimport io.mockk.Runs\nimport io.mockk.clearAllMocks\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\n\nclass CompassAttributeParserTest {\n  private val context: Context = mockk(relaxed = true)\n\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n\n  private val typedArray: TypedArray = mockk(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getInt(any(), any()) } returns 0\n    every { typedArray.getColor(any(), any()) } returns Color.RED\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getResourceId(any(), -1) } returns 1\n    every { typedArray.hasValue(any()) } returns true\n    every { typedArray.recycle() } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun testTypedArrayRecycle() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun testTypedArrayRecycleWithException() {\n    every { typedArray.getBoolean(any(), any()) }.throws(Exception(\"\"))\n    try {\n      val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    } catch (e: Exception) {\n      // do nothing\n    }\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun enabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.enabled)\n  }\n\n  @Test\n  fun enabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.enabled)\n  }\n\n  @Test\n  fun positionTest() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_compassGravity, any()) } returns 100\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(100, settings.position)\n  }\n\n  @Test\n  fun marginLeftTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginLeft)\n  }\n\n  @Test\n  fun marginTopTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginTop)\n  }\n\n  @Test\n  fun marginRightTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginRight)\n  }\n\n  @Test\n  fun marginBottomTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginBottom)\n  }\n  @Test\n  fun opacityTest() {\n    every { typedArray.getFloat(any(), any()) } returns 1f\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(1f, settings.opacity)\n  }\n  @Test\n  fun rotationTest() {\n    every { typedArray.getFloat(any(), any()) } returns 0f\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(0f, settings.rotation)\n  }\n\n  @Test\n  fun visibilityTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.visibility)\n  }\n\n  @Test\n  fun visibilityTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.visibility)\n  }\n\n  @Test\n  fun fadeWhenFacingNorthTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.fadeWhenFacingNorth)\n  }\n\n  @Test\n  fun fadeWhenFacingNorthTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.fadeWhenFacingNorth)\n  }\n\n  @Test\n  fun clickableTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.clickable)\n  }\n\n  @Test\n  fun clickableTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.clickable)\n  }\n\n  @Test\n  fun imageTest() {\n    every { typedArray.getResourceId(any(), any()) } returns 1\n    val settings = CompassAttributeParser.parseCompassSettings(context, attrs, 1.2f)\n    assertEquals(1, settings.image?.drawableId)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-gestures/.gitignore",
    "content": "/build"
  },
  {
    "path": "plugin-gestures/README.md",
    "content": "## Mapbox Maps Gestures Plugin for Android\n\n### Overview\n\nThe Mapbox Maps Gestures Plugin for Android is an public library for handling gesture interaction with a MapView. By default the plugin provides a default gesture interaction. Gestures supported include scrolling, scaling, rotating and shoving. Please visit our [documentation](https://docs.mapbox.com/android/maps/guides/user-interaction/) for more information on interacting with gestures.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Gestures Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the gestures plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-gestures:11.22.0-rc.1'\n    // Mapbox Maps Gestures Plugin depends on the Mapbox Maps Animation Plugin\n  implementation 'com.mapbox.plugin:maps-animation:11.22.0-rc.1'\n}\n```\n\nPlease note that Mapbox Maps Gestures Plugin uses on the Mapbox Gestures Android, for more information visit [mapbox/mapbox-gestures-android](https://github.com/mapbox/mapbox-gestures-android).\n\n### Example\n\nCustomizing Mapbox Maps Gestures Plugin for Android could be done in two ways: by either providing your own version of the gestures plugin or by setting the GesturesSettings to the gestures plugin. The former is documented in [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md), the latter can be achieved with:\n\n```kotlin\nval plugin = mapView.gestures\nplugin.gesturesSettings = GesturesSettings(...)\n```\n\nMore concrete examples of the gestures plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-gestures/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.gestures {\n\n  public final class GesturesConstantsKt {\n  }\n\n  public final class GesturesPluginImplKt {\n  }\n\n  public final class GesturesUtils {\n    method public static void addOnFlingListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnFlingListener onFlingListener);\n    method public static void addOnMapClickListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnMapClickListener onMapClickListener);\n    method public static void addOnMapLongClickListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnMapLongClickListener onMapLongClickListener);\n    method public static void addOnMoveListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnMoveListener listener);\n    method public static void addOnRotateListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnRotateListener listener);\n    method public static void addOnScaleListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnScaleListener listener);\n    method public static void addOnShoveListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnShoveListener listener);\n    method public static com.mapbox.maps.plugin.gestures.GesturesPlugin getGestures(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n    method public static com.mapbox.android.gestures.AndroidGesturesManager? getGesturesManager(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate);\n    method public static boolean isScrollHorizontallyLimited(com.mapbox.maps.plugin.gestures.generated.GesturesSettings);\n    method public static boolean isScrollVerticallyLimited(com.mapbox.maps.plugin.gestures.generated.GesturesSettings);\n    method public static void removeOnFlingListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnFlingListener onFlingListener);\n    method public static void removeOnMapClickListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnMapClickListener onMapClickListener);\n    method public static void removeOnMapLongClickListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnMapLongClickListener onMapLongClickListener);\n    method public static void removeOnMoveListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnMoveListener listener);\n    method public static void removeOnRotateListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnRotateListener listener);\n    method public static void removeOnScaleListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnScaleListener listener);\n    method public static void removeOnShoveListener(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.maps.plugin.gestures.OnShoveListener listener);\n    method public static void setGesturesManager(com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate, com.mapbox.android.gestures.AndroidGesturesManager androidGesturesManager, boolean attachDefaultListeners, boolean setDefaultMutuallyExclusives);\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-gestures/api/plugin-gestures.api",
    "content": "public final class com/mapbox/maps/plugin/gestures/GesturesUtils {\n\tpublic static final fun addOnFlingListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnFlingListener;)V\n\tpublic static final fun addOnMapClickListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnMapClickListener;)V\n\tpublic static final fun addOnMapLongClickListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnMapLongClickListener;)V\n\tpublic static final fun addOnMoveListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnMoveListener;)V\n\tpublic static final fun addOnRotateListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnRotateListener;)V\n\tpublic static final fun addOnScaleListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnScaleListener;)V\n\tpublic static final fun addOnShoveListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnShoveListener;)V\n\tpublic static final synthetic fun createGesturePlugin (Landroid/content/Context;Landroid/util/AttributeSet;F)Lcom/mapbox/maps/plugin/gestures/GesturesPlugin;\n\tpublic static final fun getGestures (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/gestures/GesturesPlugin;\n\tpublic static final fun getGesturesManager (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;)Lcom/mapbox/android/gestures/AndroidGesturesManager;\n\tpublic static final fun isScrollHorizontallyLimited (Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;)Z\n\tpublic static final fun isScrollVerticallyLimited (Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;)Z\n\tpublic static final fun removeOnFlingListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnFlingListener;)V\n\tpublic static final fun removeOnMapClickListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnMapClickListener;)V\n\tpublic static final fun removeOnMapLongClickListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnMapLongClickListener;)V\n\tpublic static final fun removeOnMoveListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnMoveListener;)V\n\tpublic static final fun removeOnRotateListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnRotateListener;)V\n\tpublic static final fun removeOnScaleListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnScaleListener;)V\n\tpublic static final fun removeOnShoveListener (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/maps/plugin/gestures/OnShoveListener;)V\n\tpublic static final fun setGesturesManager (Lcom/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate;Lcom/mapbox/android/gestures/AndroidGesturesManager;ZZ)V\n}\n\n"
  },
  {
    "path": "plugin-gestures/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.gestures\"\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    unitTests.apply {\n      isIncludeAndroidResources = true\n    }\n  }\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  kotlinOptions {\n    jvmTarget = \"1.8\"\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-gestures\"\n    artifactTitle = \"The gestures module for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-gestures\"\n  }\n}\n\ndependencies {\n  api(libs.mapbox.gestures)\n  implementation(project(\":sdk-base\"))\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  testImplementation(project(\":plugin-animation\"))\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/GestureState.kt",
    "content": "package com.mapbox.maps.plugin.gestures\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.android.gestures.AndroidGesturesManager\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class GestureState(private val gesturesManager: AndroidGesturesManager) {\n  enum class Type {\n    DoubleTap,\n    Scale,\n    ScaleQuickZoom,\n    Shove,\n  }\n\n  private val savedGestureEnabledMap = mutableMapOf<Type, Boolean>()\n\n  fun saveAndDisable(gesture: Type): Boolean =\n    when (gesture) {\n      Type.Scale -> gesturesManager.rotateGestureDetector\n      else -> gesturesManager.moveGestureDetector\n    }.let { detector ->\n      val state = detector.isEnabled\n      savedGestureEnabledMap[gesture] = state\n      detector.isEnabled = false\n      state\n    }\n\n  fun restore(gesture: Type) {\n    savedGestureEnabledMap.remove(gesture)?.let { state ->\n      when (gesture) {\n        Type.Scale -> gesturesManager.rotateGestureDetector\n        else -> gesturesManager.moveGestureDetector\n      }.isEnabled = state\n    }\n  }\n\n  fun peek(gesture: Type): Boolean? {\n    return savedGestureEnabledMap[gesture]\n  }\n}"
  },
  {
    "path": "plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/GesturesConstants.kt",
    "content": "package com.mapbox.maps.plugin.gestures\n\ninternal const val SCHEDULED_ANIMATION_TIMEOUT = 150L\n\n/**\n * The velocity threshold value at which a fling gesture is ignored.\n * The Android OS produces fling gestures fairly easy, this results in unwanted fling invocations.\n */\ninternal const val VELOCITY_THRESHOLD_IGNORE_FLING: Long = 1000\n\n/**\n * Fling limiting factor. Velocity values produces by Android OS are not related to any pixel value.\n * We add a limiting factor to produce values that create a good user experience when flinging.\n */\ninternal const val FLING_LIMITING_FACTOR: Double = 10.0\n\n/**\n * Scroll limiting factor. This limit factor is used to limit the maximum scroll speed that's generated\n * by the native drag API.\n */\ninternal const val SCROLL_LIMITING_FACTOR: Double = 100.0\n\n/**\n * Last scale span delta to XY velocity ratio required to execute scale velocity animation.\n */\ninternal const val SCALE_VELOCITY_RATIO_THRESHOLD = 4 * 1e-3\n\n/**\n * Last rotation delta to XY velocity ratio required to execute rotation velocity animation.\n */\ninternal const val ROTATE_VELOCITY_RATIO_THRESHOLD = 2.2 * 1e-4\n\n/**\n * Maximum absolute zoom change for multi-pointer scale velocity animation\n */\ninternal const val MAX_ABSOLUTE_SCALE_VELOCITY_CHANGE = 2.5\n\n/**\n * Scale velocity animation duration multiplier.\n */\ninternal const val SCALE_VELOCITY_ANIMATION_DURATION_MULTIPLIER = 150.0\n\n/**\n * Maximum possible zoom change during the quick zoom gesture executed across the whole screen\n */\ninternal const val QUICK_ZOOM_MAX_ZOOM_CHANGE = 4.0\n\n/**\n * Zoom value multiplier for scale gestures.\n */\ninternal const val ZOOM_RATE = 0.65f\n\n/**\n * Maximum angular velocity for rotation animation\n */\ninternal const val MAXIMUM_ANGULAR_VELOCITY = 30f\n\n/**\n * Factor to calculate pitch change based on pixel change during shove gesture.\n */\ninternal const val SHOVE_PIXEL_CHANGE_FACTOR = 0.1f\n\n/**\n * The currently supported minimum pitch value.\n */\ninternal const val MINIMUM_PITCH = 0.0\n\n/**\n * Maximum locked pitch value.\n */\ninternal const val NORMAL_MAX_PITCH = 60.0\n\n/**\n * Maximum pitch additional component for the fling gesture.\n */\ninternal const val MAX_FLING_PITCH_FACTOR = 300.0\n\n/**\n * The currently supported maximum unlocked pitch value.\n */\ninternal const val MAXIMUM_PITCH = 85.0\n\n/**\n * Default animation time\n */\ninternal const val ANIMATION_DURATION = 300"
  },
  {
    "path": "plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/GesturesExt.kt",
    "content": "@file:JvmName(\"GesturesUtils\")\n\npackage com.mapbox.maps.plugin.gestures\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.annotation.RestrictTo\nimport com.mapbox.android.gestures.AndroidGesturesManager\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.ScrollMode\nimport com.mapbox.maps.plugin.delegates.MapPluginExtensionsDelegate\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettings\n\n/**\n * Extension val for MapView to get the Gestures plugin instance.\n */\nval MapPluginProviderDelegate.gestures: GesturesPlugin\n  @JvmName(\"getGestures\")\n  get() = this.getPlugin(Plugin.MAPBOX_GESTURES_PLUGIN_ID)!!\n\n/**\n * Add a callback that is invoked when the map is clicked.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.addOnMapClickListener(onMapClickListener: OnMapClickListener) {\n  gesturesPlugin { addOnMapClickListener(onMapClickListener) }\n}\n\n/**\n * Remove a callback that is invoked when the map is clicked.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.removeOnMapClickListener(onMapClickListener: OnMapClickListener) {\n  gesturesPlugin { removeOnMapClickListener(onMapClickListener) }\n}\n\n/**\n * Add a callback that is invoked when the map is long clicked.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.addOnMapLongClickListener(onMapLongClickListener: OnMapLongClickListener) {\n  gesturesPlugin { addOnMapLongClickListener(onMapLongClickListener) }\n}\n\n/**\n * Remove a callback that is invoked when the map is long clicked.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.removeOnMapLongClickListener(onMapLongClickListener: OnMapLongClickListener) {\n  gesturesPlugin { removeOnMapLongClickListener(onMapLongClickListener) }\n}\n\n/**\n * Add a callback that is invoked when the map is has received a fling gesture.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.addOnFlingListener(onFlingListener: OnFlingListener) {\n  gesturesPlugin { addOnFlingListener(onFlingListener) }\n}\n\n/**\n * Remove a callback that is invoked when the map is has received a fling gesture.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.removeOnFlingListener(onFlingListener: OnFlingListener) {\n  gesturesPlugin { removeOnFlingListener(onFlingListener) }\n}\n\n/**\n * Add a callback that is invoked when the map is moved.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.addOnMoveListener(listener: OnMoveListener) {\n  gesturesPlugin { addOnMoveListener(listener) }\n}\n\n/**\n * Remove a callback that is invoked when the map is moved.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.removeOnMoveListener(listener: OnMoveListener) {\n  gesturesPlugin { removeOnMoveListener(listener) }\n}\n\n/**\n * Add a callback that is invoked when the map is rotated.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.addOnRotateListener(listener: OnRotateListener) {\n  gesturesPlugin { addOnRotateListener(listener) }\n}\n\n/**\n * Remove a callback that is invoked when the map is rotated.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.removeOnRotateListener(listener: OnRotateListener) {\n  gesturesPlugin { removeOnRotateListener(listener) }\n}\n\n/**\n * Add a callback that is invoked when the map is scaled.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.addOnScaleListener(listener: OnScaleListener) {\n  gesturesPlugin { addOnScaleListener(listener) }\n}\n\n/**\n * Remove a callback that is invoked when the map is scaled.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.removeOnScaleListener(listener: OnScaleListener) {\n  gesturesPlugin { removeOnScaleListener(listener) }\n}\n\n/**\n * Add a callback that is invoked when the map is shoved.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.addOnShoveListener(listener: OnShoveListener) {\n  gesturesPlugin { addOnShoveListener(listener) }\n}\n\n/**\n * Remove a callback that is invoked when the map is shoved.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.removeOnShoveListener(listener: OnShoveListener) {\n  gesturesPlugin { removeOnShoveListener(listener) }\n}\n\n/**\n * Get the current configured AndroidGesturesManager.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.getGesturesManager(): AndroidGesturesManager? {\n  return gesturesPlugin { getGesturesManager() } as AndroidGesturesManager?\n}\n\n/**\n * Set the AndroidGesturesManager instance.\n * Gesture plugin with id = [Plugin.MAPBOX_GESTURES_PLUGIN_ID] must be added while constructing\n * `MapView` as part of `MapInitOptions.plugins`.\n */\nfun MapPluginExtensionsDelegate.setGesturesManager(\n  androidGesturesManager: AndroidGesturesManager,\n  attachDefaultListeners: Boolean,\n  setDefaultMutuallyExclusives: Boolean\n) {\n  gesturesPlugin {\n    setGesturesManager(\n      androidGesturesManager,\n      attachDefaultListeners,\n      setDefaultMutuallyExclusives\n    )\n  }\n}\n\n/**\n * Returns if the scroll is horizontally limited,\n * In other words, the scroll mode is set to vertical.\n */\nfun GesturesSettings.isScrollHorizontallyLimited(): Boolean {\n  return scrollMode == ScrollMode.VERTICAL\n}\n\n/**\n * Returns if the scroll is vertically limited,\n * In other words, the scroll mode is set to horizontal.\n */\nfun GesturesSettings.isScrollVerticallyLimited(): Boolean {\n  return scrollMode == ScrollMode.HORIZONTAL\n}\n\n/**\n * Static method to create instance of Mapbox gesture plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createGesturePlugin(\n  context: Context,\n  attributeSet: AttributeSet?,\n  pixelRatio: Float,\n): GesturesPlugin {\n  return attributeSet?.let {\n    GesturesPluginImpl(context, it, pixelRatio)\n  } ?: GesturesPluginImpl(context, pixelRatio)\n}"
  },
  {
    "path": "plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/GesturesPluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.gestures\n\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.AttributeSet\nimport android.view.InputDevice\nimport android.view.MotionEvent\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport androidx.core.animation.doOnEnd\nimport androidx.core.animation.doOnStart\nimport androidx.interpolator.view.animation.LinearOutSlowInInterpolator\nimport com.mapbox.android.gestures.AndroidGesturesManager\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.android.gestures.MultiFingerTapGestureDetector\nimport com.mapbox.android.gestures.RotateGestureDetector\nimport com.mapbox.android.gestures.ShoveGestureDetector\nimport com.mapbox.android.gestures.StandardScaleGestureDetector\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.DragInteraction\nimport com.mapbox.maps.LongClickInteraction\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.PlatformEventInfo\nimport com.mapbox.maps.PlatformEventType\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.InvalidPluginConfigurationException\nimport com.mapbox.maps.plugin.MapStyleObserverPlugin\nimport com.mapbox.maps.plugin.Plugin.Companion.MAPBOX_CAMERA_PLUGIN_ID\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion.cameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOwnerRegistry\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapInteractionDelegate\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.delegates.MapProjectionDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.plugin.gestures.generated.GesturesAttributeParser\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettings\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettingsBase\nimport com.mapbox.maps.util.CoreGesturesHandler\nimport java.util.concurrent.CopyOnWriteArraySet\nimport kotlin.math.PI\nimport kotlin.math.abs\nimport kotlin.math.exp\nimport kotlin.math.hypot\nimport kotlin.math.ln\nimport kotlin.math.min\nimport kotlin.math.pow\n\n/**\n * Manages gestures events on a MapView.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase, MapStyleObserverPlugin {\n\n  private val context: Context\n  private var pixelRatio: Float = 1f\n\n  private lateinit var gesturesManager: AndroidGesturesManager\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal lateinit var moveGestureListener: MoveGestureListener\n  private lateinit var gestureState: GestureState\n  private var style: MapboxStyleManager? = null\n  private val interactionsCancelableSet = mutableSetOf<Cancelable>()\n\n  private lateinit var mapTransformDelegate: MapTransformDelegate\n  private lateinit var mapCameraManagerDelegate: MapCameraManagerDelegate\n  private lateinit var mapProjectionDelegate: MapProjectionDelegate\n  private lateinit var mapPluginProviderDelegate: MapPluginProviderDelegate\n  @OptIn(MapboxExperimental::class)\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal lateinit var mapInteractionDelegate: MapInteractionDelegate\n  private lateinit var cameraAnimationsPlugin: CameraAnimationsPlugin\n\n  private val protectedCameraAnimatorOwners = CopyOnWriteArraySet<String>()\n\n  // Listeners\n  private val onMapClickListeners = CopyOnWriteArraySet<OnMapClickListener>()\n  private val onMapLongClickListeners = CopyOnWriteArraySet<OnMapLongClickListener>()\n  private val onFlingListeners = CopyOnWriteArraySet<OnFlingListener>()\n  private val onMoveListeners = CopyOnWriteArraySet<OnMoveListener>()\n  private val onRotateListeners = CopyOnWriteArraySet<OnRotateListener>()\n  private val onScaleListeners = CopyOnWriteArraySet<OnScaleListener>()\n  private val onShoveListeners = CopyOnWriteArraySet<OnShoveListener>()\n\n  // FocalPoint\n  private var doubleTapFocalPoint = ScreenCoordinate(0.0, 0.0)\n  private var centerScreen = doubleTapFocalPoint\n  private var cameraCenterScreenCoordinate = doubleTapFocalPoint\n  private var sizeChanged = true\n  private var cameraPaddingChanged = false\n\n  // Scale\n  private var minimumGestureSpeed: Float = 0f\n  private var minimumAngledGestureSpeed: Float = 0f\n  private var minimumVelocity: Float = 0f\n  private var scaleVelocityRatioThreshold: Double = 0.0\n  private var quickZoom: Boolean = false\n  private var spanSinceLast: Float = 0.0f\n  private var screenHeight: Double = 0.0\n  private var startZoom: Double = 0.0\n  private var scaleCachedAnchor: ScreenCoordinate? = null\n\n  // Rotate\n  private var minimumScaleSpanWhenRotating: Float = 0f\n  private var angularVelocityMultiplier: Float = 0f\n  private var minimumAngularVelocity: Float = 0f\n  private var rotateVelocityRatioThreshold: Double = 0.0\n  private var defaultSpanSinceStartThreshold: Float = 0f\n  private var rotateCachedAnchor: ScreenCoordinate? = null\n\n  // Animators\n  private var scaleAnimators: Array<ValueAnimator>? = null\n  private var rotateAnimators: Array<ValueAnimator>? = null\n  private val scheduledAnimators = ArrayList<ValueAnimator>()\n  private var gesturesInterpolator = LinearOutSlowInInterpolator()\n\n  private lateinit var coreGesturesHandler: CoreGesturesHandler\n\n  /**\n   * Cancels scheduled velocity animations if user doesn't lift fingers within [SCHEDULED_ANIMATION_TIMEOUT]\n   */\n  private val animationsTimeoutHandler: Handler\n  internal var doubleTapRegistered: Boolean = false\n\n  override var internalSettings: GesturesSettings\n\n  constructor(\n    context: Context,\n    pixelRatio: Float\n  ) {\n    this.context = context\n    this.pixelRatio = pixelRatio\n    internalSettings = GesturesAttributeParser.parseGesturesSettings(context, null)\n    animationsTimeoutHandler = Handler(Looper.getMainLooper())\n  }\n\n  constructor(\n    context: Context,\n    attributeSet: AttributeSet,\n    pixelRatio: Float\n  ) {\n    this.context = context\n    this.pixelRatio = pixelRatio\n    internalSettings =\n      GesturesAttributeParser.parseGesturesSettings(context, attributeSet)\n    animationsTimeoutHandler = Handler(Looper.getMainLooper())\n  }\n\n  @VisibleForTesting\n  internal constructor(\n    context: Context,\n    attributeSet: AttributeSet,\n    style: MapboxStyleManager\n  ) {\n    this.context = context\n    this.pixelRatio = 1.0f\n    internalSettings =\n      GesturesAttributeParser.parseGesturesSettings(context, attributeSet)\n    animationsTimeoutHandler = Handler(Looper.getMainLooper())\n    this.style = style\n  }\n\n  @VisibleForTesting\n  internal constructor(\n    context: Context,\n    attributeSet: AttributeSet,\n    pixelRatio: Float,\n    animationsTimeoutHandler: Handler\n  ) {\n    this.context = context\n    this.pixelRatio = pixelRatio\n    this.internalSettings =\n      GesturesAttributeParser.parseGesturesSettings(context, attributeSet)\n    this.animationsTimeoutHandler = animationsTimeoutHandler\n  }\n\n  override fun applySettings() {\n    // no-ops\n  }\n\n  private fun initializeGestureListeners(context: Context, attachDefaultListeners: Boolean) {\n    if (attachDefaultListeners) {\n      val standardGestureListener = StandardGestureListener(\n        context.resources.getDimension(\n          com.mapbox.android.gestures.R.dimen.mapbox_defaultScaleSpanSinceStartThreshold\n        )\n      )\n      moveGestureListener = MoveGestureListener()\n      minimumGestureSpeed = context.resources.getDimension(R.dimen.mapbox_minimum_scale_speed)\n      minimumAngledGestureSpeed =\n        context.resources.getDimension(R.dimen.mapbox_minimum_angled_scale_speed)\n      minimumVelocity = context.resources.getDimension(R.dimen.mapbox_minimum_scale_velocity)\n      scaleVelocityRatioThreshold =\n        SCALE_VELOCITY_RATIO_THRESHOLD * context.resources.getDimension(R.dimen.mapbox_density_constant)\n\n      val scaleGestureListener = ScaleGestureListener()\n      minimumScaleSpanWhenRotating =\n        context.resources.getDimension(R.dimen.mapbox_minimum_scale_span_when_rotating)\n      angularVelocityMultiplier =\n        context.resources.getDimension(R.dimen.mapbox_angular_velocity_multiplier)\n      minimumAngularVelocity =\n        context.resources.getDimension(R.dimen.mapbox_minimum_angular_velocity)\n      rotateVelocityRatioThreshold =\n        ROTATE_VELOCITY_RATIO_THRESHOLD * context.resources.getDimension(R.dimen.mapbox_density_constant)\n      defaultSpanSinceStartThreshold = context.resources.getDimension(\n        com.mapbox.android.gestures.R.dimen.mapbox_defaultScaleSpanSinceStartThreshold\n      )\n      val rotateGestureListener = RotateGestureListener()\n\n      val shoveGestureListener = ShoveGestureListener()\n      val tapGestureListener = TapGestureListener()\n\n      gesturesManager.setStandardGestureListener(standardGestureListener)\n      gesturesManager.setMoveGestureListener(moveGestureListener)\n      gesturesManager.setStandardScaleGestureListener(scaleGestureListener)\n      gesturesManager.setRotateGestureListener(rotateGestureListener)\n      gesturesManager.setShoveGestureListener(shoveGestureListener)\n      gesturesManager.setMultiFingerTapGestureListener(tapGestureListener)\n      registerInteractions()\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun registerInteractions() {\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        ClickInteraction { context ->\n          handleClickEvent(context.screenCoordinate)\n          return@ClickInteraction true\n        }\n      )\n    )\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        LongClickInteraction {\n          handleLongPressEvent(it.screenCoordinate)\n          return@LongClickInteraction true\n        }\n      )\n    )\n    interactionsCancelableSet.add(\n      mapInteractionDelegate.addInteraction(\n        DragInteraction(\n          onDragBegin = {\n            handleMoveStartEvent()\n            return@DragInteraction true\n          },\n          onDrag = { handleMove(it.screenCoordinate) },\n          onDragEnd = { handleMoveEnd() }\n        )\n      )\n    )\n  }\n\n  private fun unregisterInteractions() {\n    interactionsCancelableSet.forEach {\n      it.cancel()\n    }\n    interactionsCancelableSet.clear()\n  }\n\n  private fun initializeGesturesManager(\n    gesturesManager: AndroidGesturesManager,\n    setDefaultMutuallyExclusives: Boolean\n  ) {\n    if (setDefaultMutuallyExclusives) {\n      val shoveScaleSet = HashSet<Int>()\n      shoveScaleSet.add(AndroidGesturesManager.GESTURE_TYPE_SHOVE)\n      shoveScaleSet.add(AndroidGesturesManager.GESTURE_TYPE_SCALE)\n\n      val shoveRotateSet = HashSet<Int>()\n      shoveRotateSet.add(AndroidGesturesManager.GESTURE_TYPE_SHOVE)\n      shoveRotateSet.add(AndroidGesturesManager.GESTURE_TYPE_ROTATE)\n\n      val scaleLongPressSet = HashSet<Int>()\n      scaleLongPressSet.add(AndroidGesturesManager.GESTURE_TYPE_SCALE)\n      scaleLongPressSet.add(AndroidGesturesManager.GESTURE_TYPE_LONG_PRESS)\n\n      gesturesManager.setMutuallyExclusiveGestures(\n        shoveScaleSet,\n        shoveRotateSet,\n        scaleLongPressSet\n      )\n    }\n    gesturesManager.rotateGestureDetector.angleThreshold = ROTATION_ANGLE_THRESHOLD\n    gesturesManager.shoveGestureDetector.maxShoveAngle = MAX_SHOVE_ANGLE\n    this.gesturesManager = gesturesManager\n  }\n\n  /**\n   * Called when user touches the screen, all positions are absolute.\n   *\n   *\n   * Forwards event to the related gesture detectors.\n   *\n   *\n   * @param motionEvent the MotionEvent\n   * @return True if touch event is handled\n   */\n  override fun onTouchEvent(motionEvent: MotionEvent?): Boolean {\n    // Framework can return null motion events in edge cases mapbox-gl-native#9432\n    if (motionEvent == null) {\n      return false\n    }\n\n    // Check and ignore non touch or left clicks\n    if (motionEvent.buttonState != 0 && motionEvent.buttonState != MotionEvent.BUTTON_PRIMARY) {\n      return false\n    }\n\n    if (motionEvent.actionMasked == MotionEvent.ACTION_DOWN) {\n      unregisterScheduledAnimators()\n    }\n\n    val result = gesturesManager.onTouchEvent(motionEvent)\n\n    when (motionEvent.actionMasked) {\n      MotionEvent.ACTION_POINTER_DOWN -> doubleTapFinished()\n\n      MotionEvent.ACTION_UP -> {\n        doubleTapFinished()\n        coreGesturesHandler.notifyCoreTouchEnded()\n        if (scheduledAnimators.isNotEmpty()) {\n          // Start all awaiting velocity animations\n          animationsTimeoutHandler.removeCallbacksAndMessages(null)\n          cameraAnimationsPlugin.registerAnimators(*scheduledAnimators.toTypedArray())\n          for (animator in scheduledAnimators) {\n            animator.start()\n          }\n          scheduledAnimators.clear()\n        }\n      }\n\n      MotionEvent.ACTION_CANCEL -> {\n        scheduledAnimators.clear()\n        coreGesturesHandler.notifyCoreTouchEnded()\n        doubleTapFinished()\n      }\n    }\n\n    return result\n  }\n\n  private fun unregisterScheduledAnimators() {\n    animationsTimeoutHandler.removeCallbacksAndMessages(null)\n    scheduledAnimators.clear()\n    unregisterScheduledAnimators(scaleAnimators)\n    unregisterScheduledAnimators(rotateAnimators)\n  }\n\n  private fun unregisterScheduledAnimators(animators: Array<ValueAnimator>?) =\n    animators?.let { cameraAnimationsPlugin.unregisterAnimators(*it) }\n\n  /**\n   * Schedules a velocity animator to be executed when user lifts fingers.\n   *\n   * @param animators animator ot be scheduled\n   */\n  private fun scheduleAnimators(animators: Array<ValueAnimator>?) {\n    animators?.forEach {\n      scheduledAnimators.add(it)\n    }\n    animationsTimeoutHandler.removeCallbacksAndMessages(null)\n    animationsTimeoutHandler.postDelayed(\n      { unregisterScheduledAnimators() },\n      SCHEDULED_ANIMATION_TIMEOUT\n    )\n  }\n\n  /**\n   * Called for events that don't fit the other handlers.\n   *\n   *\n   * Examples of such events are mouse scroll events, mouse moves, joystick & trackpad.\n   *\n   *\n   * @param event The MotionEvent occurred\n   * @return True is the event is handled\n   */\n  override fun onGenericMotionEvent(event: MotionEvent): Boolean {\n    // Mouse events\n    // if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { // this is not available before API 18\n    if (event.source and InputDevice.SOURCE_CLASS_POINTER == InputDevice.SOURCE_CLASS_POINTER) {\n      // Choose the action\n      when (event.actionMasked) {\n        // Mouse scrolls\n        MotionEvent.ACTION_SCROLL -> {\n          if (!internalSettings.pinchToZoomEnabled) {\n            return false\n          }\n\n          // Cancel any animation\n          cameraAnimationsPlugin.cancelAllAnimators(protectedCameraAnimatorOwners.toList())\n\n          // Get the vertical scroll amount, one click = 1\n          val scrollDist = event.getAxisValue(MotionEvent.AXIS_VSCROLL)\n\n          // Scale the map by the appropriate power of two factor\n          val currentZoom = mapCameraManagerDelegate.cameraState.zoom\n          val cachedAnchor = cameraAnimationsPlugin.anchor\n          val anchor = event.toScreenCoordinate()\n          val zoom =\n            cameraAnimationsPlugin.calculateScaleBy(scrollDist.toDouble(), currentZoom)\n          cameraAnimationsPlugin.easeTo(\n            CameraOptions.Builder().anchor(anchor).zoom(zoom).build(),\n            IMMEDIATE_ANIMATION_OPTIONS\n          )\n          cameraAnimationsPlugin.anchor = cachedAnchor\n          return true\n        }\n\n        else ->\n          // We are not interested in this event\n          return false\n      }\n    }\n\n    // We are not interested in this event\n    return false\n  }\n\n  /**\n   * Called when the size of the MapView has changed.\n   */\n  override fun onSizeChanged(width: Int, height: Int) {\n    centerScreen = ScreenCoordinate((width / 2).toDouble(), (height / 2).toDouble())\n    sizeChanged = true\n  }\n\n  /**\n   * Standard gesture listener, receives callbacks for gestures detected by AndroidGesturesManager.\n   */\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal inner class StandardGestureListener internal constructor(private val doubleTapMovementThreshold: Float) :\n    StandardGestureListenerShim() {\n\n    /**\n     * Called when an on down gesture was detected.\n     */\n    override fun onDown(motionEvent: MotionEvent?): Boolean {\n      return true\n    }\n\n    /**\n     * Called when an on single tap up gesture was detected.\n     */\n    override fun onSingleTapUp(motionEvent: MotionEvent?): Boolean {\n      return handleSingleTapUpEvent()\n    }\n\n    /**\n     * Called when an on single tap up confirmed gesture was detected.\n     */\n    @OptIn(MapboxExperimental::class)\n    override fun onSingleTapConfirmed(motionEvent: MotionEvent?): Boolean {\n      if (motionEvent == null) {\n        return false\n      }\n      mapInteractionDelegate.dispatch(\n        PlatformEventInfo(\n          PlatformEventType.CLICK,\n          motionEvent.toScreenCoordinate()\n        )\n      )\n      // always propagate false here;\n      // InteractionHandlers will define the correct callback order after QRF is run\n      return false\n    }\n\n    /**\n     * Called when an on double tap gesture was detected.\n     */\n    override fun onDoubleTapEvent(motionEvent: MotionEvent?): Boolean {\n      if (motionEvent == null) {\n        return false\n      }\n      return if (handleDoubleTapEvent(motionEvent, doubleTapMovementThreshold)) {\n        true\n      } else super.onDoubleTapEvent(motionEvent)\n    }\n\n    /**\n     * Called when an on long press gesture was detected.\n     */\n    @OptIn(MapboxExperimental::class)\n    override fun onLongPress(motionEvent: MotionEvent?) {\n      if (motionEvent == null) {\n        return\n      }\n      mapInteractionDelegate.dispatch(\n        PlatformEventInfo(\n          PlatformEventType.LONG_CLICK,\n          motionEvent.toScreenCoordinate()\n        )\n      )\n    }\n\n    /**\n     * Called when an on fling gesture was detected.\n     */\n    override fun onFling(\n      e1: MotionEvent?,\n      e2: MotionEvent?,\n      velocityX: Float,\n      velocityY: Float\n    ): Boolean {\n      if (e1 == null || e2 == null) {\n        return false\n      }\n\n      return handleFlingEvent(e2, velocityX, velocityY)\n    }\n  }\n\n  private fun doubleTapFinished() {\n    if (doubleTapRegistered) {\n      gestureState.restore(GestureState.Type.DoubleTap)\n      doubleTapRegistered = false\n    }\n  }\n\n  /**\n   * Move gesture listener, receives callbacks for gestures detected by AndroidGesturesManager.\n   */\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal inner class MoveGestureListener : MoveGestureDetector.SimpleOnMoveGestureListener() {\n\n    lateinit var detector: MoveGestureDetector\n\n    /**\n     * Indicates that the move gesture started.\n     *\n     * @param detector this detector\n     *\n     * @return true if you want to receive subsequent `onMove(MoveGestureDetector, float, float)` callbacks,\n     * false if you want to ignore this gesture.\n     */\n    @OptIn(MapboxExperimental::class)\n    override fun onMoveBegin(detector: MoveGestureDetector): Boolean {\n      if (!::detector.isInitialized || this.detector !== detector) {\n        this.detector = detector\n      }\n      if (!internalSettings.scrollEnabled) {\n        return false\n      }\n      mapInteractionDelegate.dispatch(\n        PlatformEventInfo(\n          PlatformEventType.DRAG_BEGIN,\n          ScreenCoordinate(\n            detector.focalPoint.x.toDouble(),\n            detector.focalPoint.y.toDouble()\n          )\n        )\n      )\n      return true\n    }\n\n    /**\n     * Called when an on move gesture was detected.\n     */\n    @OptIn(MapboxExperimental::class)\n    override fun onMove(\n      detector: MoveGestureDetector,\n      distanceX: Float,\n      distanceY: Float\n    ): Boolean {\n      // Skip if there is no actual movement\n      if (distanceX == 0f && distanceY == 0f) {\n        return false\n      }\n      // Skip 3 or more fingers pan\n      if (detector.pointersCount > 2) {\n        return false\n      }\n      // Skip 2-finger scroll if pinchScrollEnabled is disabled.\n      if (!internalSettings.pinchScrollEnabled && detector.pointersCount > 1) {\n        return false\n      }\n      // Skip any scroll if shove gesture is already in progress\n      // Without this fix scroll interferences with shove and the camera makes unwanted moves\n      if (gesturesManager.shoveGestureDetector.isInProgress) {\n        return false\n      }\n\n      val fromX = detector.focalPoint.x.toDouble()\n      val fromY = detector.focalPoint.y.toDouble()\n\n      // Skip invalid focal points with non-finite values\n      if (!fromX.isFinite() || !fromY.isFinite()) {\n        logE(TAG, \"Invalid focal point=${detector.focalPoint} to perform map panning!\")\n        return false\n      }\n      // Skip invalid distance with non-finite values\n      if (!distanceX.isFinite() || !distanceY.isFinite()) {\n        logE(TAG, \"Invalid distanceX=$distanceX or distanceY=$distanceY to perform map panning!\")\n        return false\n      }\n      // Skip if focal point is above horizon\n      if (isPointAboveHorizon(ScreenCoordinate(fromX, fromY))) {\n        return false\n      }\n      val resolvedDistanceX =\n        if (internalSettings.isScrollHorizontallyLimited()) 0.0 else (distanceX.toDouble())\n      val resolvedDistanceY =\n        if (internalSettings.isScrollVerticallyLimited()) 0.0 else (distanceY.toDouble())\n\n      val toX = fromX - resolvedDistanceX\n      val toY = fromY - resolvedDistanceY\n      // Dispatch to perform actual camera movement in `onDrag` interaction callback\n      mapInteractionDelegate.dispatch(\n        PlatformEventInfo(\n          PlatformEventType.DRAG,\n          ScreenCoordinate(toX, toY)\n        )\n      )\n      return false\n    }\n\n    /**\n     * Called when an on move end gesture was detected.\n     */\n    @OptIn(MapboxExperimental::class)\n    override fun onMoveEnd(detector: MoveGestureDetector, velocityX: Float, velocityY: Float) {\n      mapInteractionDelegate.dispatch(\n        PlatformEventInfo(\n          PlatformEventType.DRAG_END,\n          ScreenCoordinate(\n            detector.focalPoint.x.toDouble(),\n            detector.focalPoint.y.toDouble()\n          )\n        )\n      )\n    }\n  }\n\n  /**\n   * Scale gesture listener, receives callbacks for gestures detected by AndroidGesturesManager.\n   */\n  private inner class ScaleGestureListener :\n    StandardScaleGestureDetector.SimpleStandardOnScaleGestureListener() {\n\n    /**\n     * Called when an on scale begin gesture was detected.\n     */\n    override fun onScaleBegin(detector: StandardScaleGestureDetector): Boolean {\n      return handleScaleBegin(detector)\n    }\n\n    /**\n     * Called when an on scale gesture was detected.\n     */\n    override fun onScale(detector: StandardScaleGestureDetector): Boolean {\n      return handleScale(detector)\n    }\n\n    /**\n     * Called when an on scale end gesture was detected.\n     */\n    override fun onScaleEnd(\n      detector: StandardScaleGestureDetector,\n      velocityX: Float,\n      velocityY: Float\n    ) {\n      handleScaleEnd(detector, velocityX, velocityY)\n    }\n  }\n\n  private fun getScaleFocalPoint(detector: StandardScaleGestureDetector): ScreenCoordinate {\n    internalSettings.focalPoint?.let {\n      // around user provided focal point\n      return it\n    }\n\n    return if (quickZoom) {\n      // around center\n      doubleTapFocalPoint\n    } else {\n      // around gesture\n      val pointF = detector.focalPoint\n      ScreenCoordinate(pointF.x.toDouble(), pointF.y.toDouble())\n    }\n  }\n\n  private fun calculateScale(velocityXY: Double, isScalingOut: Boolean): Double {\n    var zoomAddition = velocityXY * MAX_ABSOLUTE_SCALE_VELOCITY_CHANGE * 1e-4\n    zoomAddition = clamp(zoomAddition, 0.0, MAX_ABSOLUTE_SCALE_VELOCITY_CHANGE)\n    if (isScalingOut) {\n      zoomAddition = -zoomAddition\n    }\n    return zoomAddition\n  }\n\n  internal fun handleScaleEnd(\n    detector: StandardScaleGestureDetector,\n    velocityX: Float,\n    velocityY: Float\n  ) {\n    gestureState.restore(if (quickZoom) GestureState.Type.ScaleQuickZoom else GestureState.Type.Scale)\n\n    notifyOnScaleEndListeners(detector)\n\n    val velocityXY = abs(velocityX) + abs(velocityY)\n    if (!internalSettings.pinchToZoomDecelerationEnabled || velocityXY < minimumVelocity || spanSinceLast / velocityXY < scaleVelocityRatioThreshold\n    ) {\n      return\n    }\n\n    val zoomAddition = calculateScale(velocityXY.toDouble(), detector.isScalingOut)\n    val currentZoom = mapCameraManagerDelegate.cameraState.zoom\n    val focalPoint = getScaleFocalPoint(detector)\n    // (log(x + 1 / e^2) + 2) * 150, x=0 to 2.5 (MapboxConstants#MAX_ABSOLUTE_SCALE_VELOCITY_CHANGE)\n    val animationTime = (\n      (\n        ln(\n          abs(zoomAddition) + 1 / Math.E.pow(2.0)\n        ) + 2\n        ) * SCALE_VELOCITY_ANIMATION_DURATION_MULTIPLIER\n      ).toLong()\n    val animators =\n      createScaleAnimators(currentZoom, zoomAddition, focalPoint, animationTime)\n    scaleAnimators = animators\n    scheduleAnimators(animators)\n  }\n\n  internal fun handleScale(detector: StandardScaleGestureDetector): Boolean {\n    val focalPoint = getScaleFocalPoint(detector)\n    scaleCachedAnchor = cameraAnimationsPlugin.anchor\n    coreGesturesHandler.notifyCoreGestureStarted()\n    if (quickZoom) {\n      val pixelDeltaChange = abs(detector.currentEvent.y - doubleTapFocalPoint.y)\n      val zoomedOut = detector.currentEvent.y < doubleTapFocalPoint.y\n\n      // normalize the pixel delta change, ranging from 0 to screen height, to a constant zoom change range\n      val normalizedDeltaChange = 0.0.normalize(\n        pixelDeltaChange,\n        0.0,\n        screenHeight,\n        QUICK_ZOOM_MAX_ZOOM_CHANGE\n      )\n\n      // calculate target zoom and adjust for a multiplier\n      var targetZoom =\n        if (zoomedOut) startZoom - normalizedDeltaChange else startZoom + normalizedDeltaChange\n      targetZoom *= internalSettings.zoomAnimationAmount.toDouble()\n      cameraAnimationsPlugin.easeTo(\n        CameraOptions.Builder()\n          .zoom(targetZoom)\n          .anchor(focalPoint)\n          .build(),\n        IMMEDIATE_ANIMATION_OPTIONS\n      )\n    } else {\n      val zoomBy = calculateZoomBy(detector)\n      if (internalSettings.simultaneousRotateAndPinchToZoomEnabled) {\n        val zoomAnimator = cameraAnimationsPlugin.createZoomAnimator(\n          cameraAnimatorOptions(mapCameraManagerDelegate.cameraState.zoom + zoomBy) {\n            startValue(mapCameraManagerDelegate.cameraState.zoom)\n            owner(MapAnimationOwnerRegistry.GESTURES)\n          }\n        ) {\n          duration = 0\n        }\n        val anchorAnimator = cameraAnimationsPlugin.createAnchorAnimator(\n          options = cameraAnimatorOptions(focalPoint) {\n            owner(MapAnimationOwnerRegistry.GESTURES)\n          },\n        ) {\n          duration = 0\n        }\n        cameraAnimationsPlugin.playAnimatorsTogether(\n          anchorAnimator,\n          zoomAnimator\n        )\n      } else {\n        cameraAnimationsPlugin.easeTo(\n          CameraOptions.Builder()\n            .zoom(mapCameraManagerDelegate.cameraState.zoom + zoomBy)\n            .anchor(focalPoint)\n            .build(),\n          IMMEDIATE_ANIMATION_OPTIONS\n        )\n      }\n    }\n    // All the camera animations above have duration 0. We can call onScaleAnimationEnd immediately.\n    onScaleAnimationEnd(detector)\n    return true\n  }\n\n  private fun onScaleAnimationEnd(detector: StandardScaleGestureDetector) {\n    cameraAnimationsPlugin.anchor = scaleCachedAnchor\n    notifyOnScaleListeners(detector)\n    spanSinceLast = abs(detector.currentSpan - detector.previousSpan)\n  }\n\n  internal fun handleScaleBegin(detector: StandardScaleGestureDetector): Boolean {\n    quickZoom = detector.pointersCount == 1\n    if (quickZoom) {\n      if (!internalSettings.quickZoomEnabled) {\n        return false\n      }\n      // re-try disabling the move detector in case double tap has been interrupted before quickzoom started\n      gestureState.saveAndDisable(GestureState.Type.ScaleQuickZoom)\n    } else {\n      if (!internalSettings.pinchToZoomEnabled) {\n        return false\n      }\n      if (detector.previousSpan > 0) {\n        val currSpan = detector.currentSpan\n        val prevSpan = detector.previousSpan\n        val currTime = detector.currentEvent.eventTime.toDouble()\n        val prevTime = detector.previousEvent.eventTime.toDouble()\n        if (currTime == prevTime) {\n          return false\n        }\n        val speed = abs(currSpan - prevSpan) / (currTime - prevTime)\n        if (speed < minimumGestureSpeed) {\n          // do not scale if the minimal gesture speed is not met\n          return false\n        } else if (!gesturesManager.rotateGestureDetector.isInProgress) {\n          val rotationDeltaSinceLast = gesturesManager.rotateGestureDetector.deltaSinceLast\n          if (abs(rotationDeltaSinceLast) > 0.4 && speed < minimumAngledGestureSpeed) {\n            // do not scale in case we're preferring to start rotation\n            return false\n          }\n          if (!internalSettings.simultaneousRotateAndPinchToZoomEnabled) {\n            gestureState.saveAndDisable(GestureState.Type.Scale)\n          }\n        }\n      } else {\n        return false\n      }\n    }\n\n    screenHeight = context.resources.displayMetrics.heightPixels.toDouble()\n    startZoom = mapCameraManagerDelegate.cameraState.zoom\n\n    cancelTransitionsIfRequired()\n\n    notifyOnScaleBeginListeners(detector)\n\n    spanSinceLast = abs(detector.currentSpan - detector.previousSpan)\n\n    return true\n  }\n\n  /**\n   * Rotate gesture listener, receives callbacks for gestures detected by AndroidGesturesManager.\n   */\n  private inner class RotateGestureListener :\n    RotateGestureDetector.SimpleOnRotateGestureListener() {\n\n    /**\n     * Called when an on rotate begin gesture was detected.\n     */\n    override fun onRotateBegin(detector: RotateGestureDetector): Boolean {\n      return handleRotateBegin(detector)\n    }\n\n    /**\n     * Called when an on rotate gesture was detected.\n     */\n    override fun onRotate(\n      detector: RotateGestureDetector,\n      rotationDegreesSinceLast: Float,\n      rotationDegreesSinceFirst: Float\n    ): Boolean {\n      return handleRotate(detector, rotationDegreesSinceLast)\n    }\n\n    /**\n     * Called when an on rotate endw gesture was detected.\n     */\n    override fun onRotateEnd(\n      detector: RotateGestureDetector,\n      velocityX: Float,\n      velocityY: Float,\n      angularVelocity: Float\n    ) {\n      handleRotateEnd(detector, velocityX, velocityY, angularVelocity)\n    }\n  }\n\n  private fun getRotateFocalPoint(detector: RotateGestureDetector): ScreenCoordinate {\n    internalSettings.focalPoint?.let {\n      // User provided focal point\n      return it\n    }\n\n    // around gesture\n    val pointF = detector.focalPoint\n    return ScreenCoordinate(pointF.x.toDouble(), pointF.y.toDouble())\n  }\n\n  private fun createRotateAnimators(\n    angularVelocity: Float,\n    animationTime: Long,\n    animationFocalPoint: ScreenCoordinate\n  ): Array<ValueAnimator> {\n\n    val rotateInterpolator = gesturesInterpolator\n\n    // Calculate steps count of interpolation, rely on display update rate = 16ms\n    val interpolatorSteps = animationTime.div(16) + 1\n    var bearingDistance = angularVelocity\n    for (step in 1..interpolatorSteps) {\n      val fraction = step.toFloat() / interpolatorSteps\n      val fractionInterpolated = rotateInterpolator.getInterpolation(fraction)\n      val stepVelocity = angularVelocity * (1 - fractionInterpolated)\n      bearingDistance += stepVelocity\n    }\n\n    val bearingCurrent = mapCameraManagerDelegate.cameraState.bearing\n    val bearingTarget = bearingCurrent + bearingDistance\n\n    val bearingAnimator = cameraAnimationsPlugin.createBearingAnimator(\n      options = cameraAnimatorOptions(bearingTarget) {\n        owner(MapAnimationOwnerRegistry.GESTURES)\n        startValue(bearingCurrent)\n      },\n    ) {\n      interpolator = rotateInterpolator\n      duration = animationTime\n    }\n\n    bearingAnimator.addListener(coreGesturesHandler.coreGestureAnimatorHandler)\n\n    val screenCoordinate = ScreenCoordinate(animationFocalPoint.x, animationFocalPoint.y)\n    val anchorAnimator = cameraAnimationsPlugin.createAnchorAnimator(\n      options = cameraAnimatorOptions(screenCoordinate) {\n        owner(MapAnimationOwnerRegistry.GESTURES)\n        startValue(screenCoordinate)\n      },\n    ) {\n      interpolator = rotateInterpolator\n      duration = animationTime\n    }\n\n    anchorAnimator.doOnEnd { cameraAnimationsPlugin.anchor = rotateCachedAnchor }\n\n    return arrayOf(bearingAnimator, anchorAnimator)\n  }\n\n  internal fun handleRotateEnd(\n    detector: RotateGestureDetector,\n    velocityX: Float,\n    velocityY: Float,\n    angularVelocityEvent: Float\n  ) {\n    var angularVelocity = angularVelocityEvent\n    if (internalSettings.increasePinchToZoomThresholdWhenRotating) {\n      // resetting default scale threshold values\n      gesturesManager.standardScaleGestureDetector.spanSinceStartThreshold =\n        defaultSpanSinceStartThreshold\n    }\n\n    notifyOnRotateEndListeners(detector)\n\n    angularVelocity *= angularVelocityMultiplier\n    angularVelocity = clamp(\n      angularVelocity,\n      -MAXIMUM_ANGULAR_VELOCITY,\n      MAXIMUM_ANGULAR_VELOCITY\n    )\n\n    val velocityXY = abs(velocityX) + abs(velocityY)\n    val delta = abs(detector.deltaSinceLast)\n    val ratio = (delta / velocityXY).toDouble()\n\n    if (!internalSettings.rotateDecelerationEnabled || abs(angularVelocity) < minimumAngularVelocity || gesturesManager.standardScaleGestureDetector.isInProgress && ratio < rotateVelocityRatioThreshold) {\n      // notifying listeners that camera is idle only if there is no follow-up animation\n      return\n    }\n\n    val animationTime = (\n      (\n        ln(\n          abs(angularVelocity) + 1 / Math.E.pow(2.0)\n        ) + 2\n        ) * SCALE_VELOCITY_ANIMATION_DURATION_MULTIPLIER\n      ).toLong()\n\n    val focalPoint = getRotateFocalPoint(detector)\n    rotateAnimators = createRotateAnimators(angularVelocity, animationTime, focalPoint)\n    scheduleAnimators(rotateAnimators)\n  }\n\n  internal fun handleRotate(\n    detector: RotateGestureDetector,\n    rotationDegreesSinceLast: Float\n  ): Boolean {\n    // Calculate map bearing value\n    val currentBearing = mapCameraManagerDelegate.cameraState.bearing\n    rotateCachedAnchor = cameraAnimationsPlugin.anchor\n    val bearing = currentBearing + rotationDegreesSinceLast\n    val focalPoint = getRotateFocalPoint(detector)\n    coreGesturesHandler.notifyCoreGestureStarted()\n    // Rotate the map\n    if (internalSettings.simultaneousRotateAndPinchToZoomEnabled) {\n      val bearingAnimator =\n        cameraAnimationsPlugin.createBearingAnimator(\n          cameraAnimatorOptions(bearing) {\n            owner(MapAnimationOwnerRegistry.GESTURES)\n          }\n        ) {\n          duration = 0\n        }\n      val anchorAnimator = cameraAnimationsPlugin.createAnchorAnimator(\n        options = cameraAnimatorOptions(focalPoint) {\n          owner(MapAnimationOwnerRegistry.GESTURES)\n        },\n      ) {\n        duration = 0\n      }\n      cameraAnimationsPlugin.playAnimatorsTogether(\n        anchorAnimator,\n        bearingAnimator\n      )\n    } else {\n      cameraAnimationsPlugin.easeTo(\n        CameraOptions.Builder()\n          .anchor(focalPoint)\n          .bearing(bearing)\n          .build(),\n        IMMEDIATE_ANIMATION_OPTIONS\n      )\n    }\n    // All the camera animations above have duration 0. We can call onRotateAnimationEnd immediately.\n    onRotateAnimationEnd(detector)\n    return true\n  }\n\n  private fun onRotateAnimationEnd(detector: RotateGestureDetector) {\n    cameraAnimationsPlugin.anchor = rotateCachedAnchor\n    notifyOnRotateListeners(detector)\n  }\n\n  internal fun handleRotateBegin(detector: RotateGestureDetector): Boolean {\n    if (!internalSettings.rotateEnabled) {\n      return false\n    }\n\n    val deltaSinceLast = abs(detector.deltaSinceLast)\n    val currTime = detector.currentEvent.eventTime.toDouble()\n    val prevTime = detector.previousEvent.eventTime.toDouble()\n    if (currTime == prevTime) {\n      return false\n    }\n    val speed = deltaSinceLast / (currTime - prevTime)\n    val deltaSinceStart = abs(detector.deltaSinceStart)\n\n    // adjust the responsiveness of a rotation gesture - the higher the speed, the bigger the threshold\n    if (\n      speed < 0.04 ||\n      speed > 0.07 && deltaSinceStart < 5 ||\n      speed > 0.15 && deltaSinceStart < 7 ||\n      speed > 0.5 && deltaSinceStart < 15 ||\n      // There's a threshold to avoid unnecessary rotation on scale\n      gesturesManager.standardScaleGestureDetector.isInProgress && deltaSinceStart < 16\n    ) {\n      return false\n    }\n\n    if (internalSettings.increasePinchToZoomThresholdWhenRotating) {\n      // when rotation starts, interrupting scale and increasing the threshold\n      // to make rotation without scaling easier\n      gesturesManager.standardScaleGestureDetector.spanSinceStartThreshold =\n        minimumScaleSpanWhenRotating\n      gesturesManager.standardScaleGestureDetector.interrupt()\n    }\n\n    cancelTransitionsIfRequired()\n\n    notifyOnRotateBeginListeners(detector)\n\n    return true\n  }\n\n  /**\n   * Shove gesture listener, receives callbacks for gestures detected by AndroidGesturesManager.\n   */\n  private inner class ShoveGestureListener : ShoveGestureDetector.SimpleOnShoveGestureListener() {\n    /**\n     * Called when an on shove begin gesture was detected.\n     */\n    override fun onShoveBegin(detector: ShoveGestureDetector): Boolean {\n      return handleShoveBegin(detector)\n    }\n\n    /**\n     * Called when an on shove gesture was detected.\n     */\n    override fun onShove(\n      detector: ShoveGestureDetector,\n      deltaPixelsSinceLast: Float,\n      deltaPixelsSinceStart: Float\n    ): Boolean {\n      return handleShove(detector, deltaPixelsSinceLast)\n    }\n\n    /**\n     * Called when an on shove end gesture was detected.\n     */\n    override fun onShoveEnd(detector: ShoveGestureDetector, velocityX: Float, velocityY: Float) {\n      handleShoveEnd(detector)\n    }\n  }\n\n  internal fun handleShoveBegin(detector: ShoveGestureDetector): Boolean {\n    if (!internalSettings.pitchEnabled) {\n      return false\n    }\n\n    cancelTransitionsIfRequired()\n\n    gestureState.saveAndDisable(GestureState.Type.Shove)\n\n    notifyOnShoveBeginListeners(detector)\n\n    return true\n  }\n\n  internal fun handleShove(\n    detector: ShoveGestureDetector,\n    deltaPixelsSinceLast: Float\n  ): Boolean {\n    // Get pitch value (scale and clamp)\n    var pitch = mapCameraManagerDelegate.cameraState.pitch\n    val optimizedPitch =\n      pitch - (SHOVE_PIXEL_CHANGE_FACTOR * (deltaPixelsSinceLast))\n    pitch = clamp(optimizedPitch, MINIMUM_PITCH, MAXIMUM_PITCH)\n    if (cameraPaddingChanged || sizeChanged) {\n      cameraCenterScreenCoordinate =\n        mapCameraManagerDelegate.pixelForCoordinate(mapCameraManagerDelegate.cameraState.center)\n      cameraPaddingChanged = false\n      sizeChanged = false\n    }\n    coreGesturesHandler.notifyCoreGestureStarted()\n    cameraAnimationsPlugin.easeTo(\n      CameraOptions.Builder().anchor(cameraCenterScreenCoordinate).pitch(pitch).build(),\n      IMMEDIATE_ANIMATION_OPTIONS\n    )\n    notifyOnShoveListeners(detector)\n    return true\n  }\n\n  internal fun handleShoveEnd(\n    detector: ShoveGestureDetector\n  ) {\n    gestureState.restore(GestureState.Type.Shove)\n    notifyOnShoveEndListeners(detector)\n  }\n\n  private inner class TapGestureListener :\n    MultiFingerTapGestureDetector.OnMultiFingerTapGestureListener {\n    override fun onMultiFingerTap(\n      detector: MultiFingerTapGestureDetector,\n      pointersCount: Int\n    ): Boolean {\n      if (!internalSettings.doubleTouchToZoomOutEnabled || pointersCount != 2) {\n        return false\n      }\n\n      cameraAnimationsPlugin.cancelAllAnimators(protectedCameraAnimatorOwners.toList())\n\n      val zoomFocalPoint: ScreenCoordinate\n      // Single finger double tap\n      internalSettings.focalPoint?.let {\n        // zoom in on user focal point\n        zoomFocalPoint = it\n        animateZoomOut(zoomFocalPoint, false)\n        return true\n      }\n\n      // Zoom in on gesture\n      val pointF = detector.focalPoint\n      zoomFocalPoint = ScreenCoordinate(pointF.x.toDouble(), pointF.y.toDouble())\n      animateZoomOut(zoomFocalPoint, false)\n      return true\n    }\n  }\n\n  private fun createScaleAnimators(\n    currentZoom: Double,\n    zoomAddition: Double,\n    animationFocalPoint: ScreenCoordinate,\n    animationTime: Long\n  ): Array<ValueAnimator> {\n\n    val scaleInterpolator = gesturesInterpolator\n    val zoomAnimator = cameraAnimationsPlugin.createZoomAnimator(\n      options = cameraAnimatorOptions(currentZoom + zoomAddition) {\n        owner(MapAnimationOwnerRegistry.GESTURES)\n        startValue(currentZoom)\n      }\n    ) {\n      interpolator = scaleInterpolator\n      duration = animationTime\n    }\n\n    zoomAnimator.doOnStart {\n      // notify scale gesture started when zoom animation (first registered) starts.\n      notifyOnScaleListeners(gesturesManager.standardScaleGestureDetector)\n    }\n\n    zoomAnimator.addListener(coreGesturesHandler.coreGestureAnimatorHandler)\n\n    val anchorAnimator = cameraAnimationsPlugin.createAnchorAnimator(\n      options = cameraAnimatorOptions(animationFocalPoint) {\n        owner(MapAnimationOwnerRegistry.GESTURES)\n        startValue(animationFocalPoint)\n      },\n    ) {\n      interpolator = scaleInterpolator\n      duration = animationTime\n    }\n\n    anchorAnimator.doOnEnd {\n      // notify scale gesture ended when anchor animation (last registered) finished.\n      notifyOnScaleEndListeners(gesturesManager.standardScaleGestureDetector)\n      cameraAnimationsPlugin.anchor = scaleCachedAnchor\n    }\n\n    return arrayOf(zoomAnimator, anchorAnimator)\n  }\n\n  /**\n   * Zoom in by 1.\n   *\n   * @param zoomFocalPoint focal point of zoom animation\n   * @param runImmediately if true, animation will be started right away, otherwise it will wait until\n   * [MotionEvent.ACTION_UP] is registered.\n   */\n  private fun animateZoomIn(\n    zoomFocalPoint: ScreenCoordinate,\n    @Suppress(\"SameParameterValue\") runImmediately: Boolean\n  ) {\n    handleZoomAnimation(true, zoomFocalPoint, runImmediately)\n  }\n\n  /**\n   * Zoom out by 1.\n   *\n   * @param zoomFocalPoint focal point of zoom animation\n   * @param runImmediately if true, animation will be started right away, otherwise it will wait until\n   * [MotionEvent.ACTION_UP] is registered.\n   */\n  internal fun animateZoomOut(zoomFocalPoint: ScreenCoordinate, runImmediately: Boolean) {\n    handleZoomAnimation(false, zoomFocalPoint, runImmediately)\n  }\n\n  /**\n   * handle zoom animation and notify scale gesture events.\n   * @param zoomIn true for zoom-in, false for zoom-out\n   * @param zoomFocalPoint focal point of zoom animation\n   * @param runImmediately if true, animation will be started right away, otherwise it will wait until\n   * [MotionEvent.ACTION_UP] is registered.\n   */\n  internal fun handleZoomAnimation(\n    zoomIn: Boolean,\n    zoomFocalPoint: ScreenCoordinate,\n    runImmediately: Boolean\n  ) {\n    // canceling here as well, because when using a button it will not be canceled automatically by onDown()\n    unregisterScheduledAnimators(scaleAnimators)\n    // notify scale gesture is starting.\n    notifyOnScaleBeginListeners(gesturesManager.standardScaleGestureDetector)\n    val currentZoom = mapCameraManagerDelegate.cameraState.zoom\n    val animators = createScaleAnimators(\n      currentZoom,\n      (if (zoomIn) 1 else -1).toDouble(),\n      zoomFocalPoint,\n      ANIMATION_DURATION.toLong()\n    )\n    scaleAnimators = animators\n    if (runImmediately) {\n      animators.forEach {\n        it.start()\n      }\n    } else {\n      scheduleAnimators(animators)\n    }\n  }\n\n  private fun cancelTransitionsIfRequired() {\n    // we need to cancel core transitions only if there is no started gesture yet\n    if (noGesturesInProgress()) {\n      cameraAnimationsPlugin.cancelAllAnimators(protectedCameraAnimatorOwners.toList())\n    }\n  }\n\n  private fun noGesturesInProgress(): Boolean {\n    return (\n      (!internalSettings.scrollEnabled || !gesturesManager.moveGestureDetector.isInProgress) &&\n        ((!internalSettings.pinchToZoomEnabled && !internalSettings.doubleTouchToZoomOutEnabled && !internalSettings.doubleTapToZoomInEnabled) || !gesturesManager.standardScaleGestureDetector.isInProgress)\n      ) &&\n      (!internalSettings.rotateEnabled || !gesturesManager.rotateGestureDetector.isInProgress) &&\n      (!internalSettings.pitchEnabled || !gesturesManager.shoveGestureDetector.isInProgress)\n  }\n\n  internal fun handleLongPressEvent(screenCoordinate: ScreenCoordinate) {\n    if (!onMapLongClickListeners.isEmpty()) {\n      val clickedPoint = mapCameraManagerDelegate.coordinateForPixel(screenCoordinate)\n      for (listener in onMapLongClickListeners) {\n        if (listener.onMapLongClick(clickedPoint)) {\n          return\n        }\n      }\n    }\n  }\n\n  internal fun handleClickEvent(screenCoordinate: ScreenCoordinate): Boolean {\n    if (!onMapClickListeners.isEmpty()) {\n      val clickedPoint = mapCameraManagerDelegate.coordinateForPixel(screenCoordinate)\n      for (listener in onMapClickListeners) {\n        if (listener.onMapClick(clickedPoint)) {\n          return true\n        }\n      }\n    }\n    return false\n  }\n\n  internal fun handleDoubleTapEvent(\n    motionEvent: MotionEvent,\n    doubleTapMovementThreshold: Float\n  ): Boolean {\n    val action = motionEvent.actionMasked\n    if (action == MotionEvent.ACTION_DOWN) {\n      doubleTapFocalPoint = motionEvent.toScreenCoordinate()\n      // disable the move detector in preparation for the quickzoom,\n      // so that we don't move the map's center slightly before the quickzoom is started (see #14227)\n      gestureState.saveAndDisable(GestureState.Type.DoubleTap)\n      doubleTapRegistered = true\n    }\n\n    if (motionEvent.actionMasked == MotionEvent.ACTION_UP) {\n      val diffX = abs(motionEvent.x - doubleTapFocalPoint.x)\n      val diffY = abs(motionEvent.y - doubleTapFocalPoint.y)\n      if (diffX > doubleTapMovementThreshold || diffY > doubleTapMovementThreshold) {\n        // Ignore double-tap event because we've started the quick-zoom. See #14013.\n        return false\n      }\n\n      if (!internalSettings.doubleTapToZoomInEnabled) {\n        return false\n      }\n\n      internalSettings.focalPoint?.let {\n        // User provided focal point\n        doubleTapFocalPoint = it\n      }\n\n      animateZoomIn(doubleTapFocalPoint, false)\n      return true\n    }\n    return false\n  }\n\n  @OptIn(MapboxExperimental::class)\n  internal fun handleFlingEvent(\n    e2: MotionEvent,\n    velocityX: Float,\n    velocityY: Float\n  ): Boolean {\n    if (!internalSettings.scrollEnabled) {\n      // don't allow a fling if scroll is disabled\n      return false\n    }\n\n    if (isPointAboveHorizon(e2.toScreenCoordinate())) {\n      return false\n    }\n\n    notifyOnFlingListeners()\n\n    if (!internalSettings.scrollDecelerationEnabled) {\n      return false\n    }\n\n    val screenDensity = pixelRatio\n\n    // calculate velocity vector for xy dimensions, independent from screen size\n    val velocityXY =\n      hypot((velocityX / screenDensity).toDouble(), (velocityY / screenDensity).toDouble())\n    if (velocityXY < VELOCITY_THRESHOLD_IGNORE_FLING) {\n      // ignore short flings, these can occur when other gestures just have finished executing\n      return false\n    }\n\n    val pitch = mapCameraManagerDelegate.cameraState.pitch\n\n    // We limit the amount of fling displacement based on the camera pitch value.\n    val pitchFactorAdditionalComponent = when {\n      pitch < NORMAL_MAX_PITCH -> {\n        pitch / 10.0\n      }\n\n      pitch in NORMAL_MAX_PITCH..MAXIMUM_PITCH -> {\n        val a = ln(NORMAL_MAX_PITCH / 10.0)\n        val b = ln(MAX_FLING_PITCH_FACTOR)\n        // exp(a) = pitch / 10.0\n        // exp(b) = pitch\n        exp((b - a) * (pitch - NORMAL_MAX_PITCH) / (MAXIMUM_PITCH - NORMAL_MAX_PITCH) + a)\n      }\n\n      else -> 0.0\n    }\n    val pitchFactor =\n      FLING_LIMITING_FACTOR + pitchFactorAdditionalComponent / screenDensity.toDouble()\n\n    val offsetX =\n      if (internalSettings.isScrollHorizontallyLimited()) 0.0 else velocityX.toDouble() / pitchFactor\n    val offsetY =\n      if (internalSettings.isScrollVerticallyLimited()) 0.0 else velocityY.toDouble() / pitchFactor\n\n    cameraAnimationsPlugin.cancelAllAnimators(protectedCameraAnimatorOwners.toList())\n\n    // calculate animation time based on displacement\n    // velocityXY ranges from VELOCITY_THRESHOLD_IGNORE_FLING to ~5000\n    // limit animation time to Android SDK default animation time\n    val animationTime = (velocityXY / pitchFactor).toLong()\n\n    // start the fling animation from a simulated touch point at the bottom of the display to reduce the fling speed at high pitch level.\n    val simulateTouchPoint = ScreenCoordinate(centerScreen.x, centerScreen.y * 2.0)\n    cameraAnimationsPlugin.easeTo(\n      mapCameraManagerDelegate.cameraForDrag(\n        simulateTouchPoint,\n        ScreenCoordinate(simulateTouchPoint.x + offsetX, simulateTouchPoint.y + offsetY)\n      ),\n      mapAnimationOptions {\n        owner(MapAnimationOwnerRegistry.GESTURES)\n        duration(animationTime)\n        interpolator(gesturesInterpolator)\n      },\n      animatorListener = coreGesturesHandler.coreGestureAnimatorHandler\n    )\n    return true\n  }\n\n  internal fun handleMoveStartEvent() {\n    cancelTransitionsIfRequired()\n    notifyOnMoveBeginListeners(moveGestureListener.detector)\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal fun isPointAboveHorizon(\n    pixel: ScreenCoordinate\n  ): Boolean {\n    // as we don't depend on style extension - working with raw values here\n    style?.getStyleProjectionProperty(\"name\").apply {\n      if (this == null) {\n        return false\n      }\n      val currentProjection = if (kind == StylePropertyValueKind.UNDEFINED) {\n        \"MERCATOR\"\n      } else {\n        (value.contents as String).uppercase()\n      }\n      if (currentProjection != \"MERCATOR\") {\n        return false\n      }\n    }\n    // Prevent drag start in area around horizon to avoid sharp map movements\n    val topMapMargin = 0.04 * mapTransformDelegate.getSize().height\n    val reprojectErrorMargin = min(10.0, topMapMargin / 2)\n\n    // sanitize input x to be non NaN\n    var pointX = pixel.x\n    if (pointX.isNaN()) {\n      logE(TAG, \"isPointAboveHorizon: screen coordinate x is NaN.\")\n      pointX = 0.0\n    }\n\n    // sanitize input y to be non NaN\n    var pointY = pixel.y\n    if (pointY.isNaN()) {\n      logE(TAG, \"isPointAboveHorizon: screen coordinate y is NaN.\")\n      pointY = 0.0\n    }\n\n    val point = ScreenCoordinate(pointX, pointY - topMapMargin)\n    val coordinate = mapCameraManagerDelegate.coordinateForPixel(point)\n    val roundtripPoint = mapCameraManagerDelegate.pixelForCoordinate(coordinate)\n    return (roundtripPoint.y >= point.y + reprojectErrorMargin)\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal fun calculateZoomBy(standardScaleGestureDetector: StandardScaleGestureDetector) =\n    ln(standardScaleGestureDetector.scaleFactor.toDouble()) /\n      ln(PI / 2) *\n      ZOOM_RATE.toDouble() *\n      internalSettings.zoomAnimationAmount.toDouble()\n\n  internal fun handleMove(targetScreenCoordinate: ScreenCoordinate) {\n    val detector = moveGestureListener.detector\n    // return early if any user-registered OnMoveListener returns `true`\n    if (notifyOnMoveListeners(detector)) {\n      return\n    }\n    val focalPoint = detector.focalPoint\n    val fromX = focalPoint.x.toDouble()\n    val fromY = focalPoint.y.toDouble()\n    coreGesturesHandler.notifyCoreGestureStarted()\n    val cameraOptions = mapCameraManagerDelegate.cameraForDrag(\n      ScreenCoordinate(fromX, fromY),\n      targetScreenCoordinate\n    )\n    cameraAnimationsPlugin.easeTo(\n      cameraOptions,\n      IMMEDIATE_ANIMATION_OPTIONS\n    )\n  }\n\n  internal fun handleMoveEnd() {\n    notifyOnMoveEndListeners(moveGestureListener.detector)\n  }\n\n  internal fun handleSingleTapUpEvent(): Boolean {\n    cameraAnimationsPlugin.cancelAllAnimators(protectedCameraAnimatorOwners.toList())\n    return true\n  }\n\n  private fun notifyOnFlingListeners() {\n    for (listener in onFlingListeners) {\n      listener.onFling()\n    }\n  }\n\n  private fun notifyOnMoveBeginListeners(detector: MoveGestureDetector) {\n    for (listener in onMoveListeners) {\n      listener.onMoveBegin(detector)\n    }\n  }\n\n  private fun notifyOnMoveListeners(detector: MoveGestureDetector): Boolean {\n    for (listener in onMoveListeners) {\n      if (listener.onMove(detector)) {\n        return true\n      }\n    }\n    return false\n  }\n\n  private fun notifyOnMoveEndListeners(detector: MoveGestureDetector) {\n    for (listener in onMoveListeners) {\n      listener.onMoveEnd(detector)\n    }\n  }\n\n  private fun notifyOnRotateBeginListeners(detector: RotateGestureDetector) {\n    for (listener in onRotateListeners) {\n      listener.onRotateBegin(detector)\n    }\n  }\n\n  private fun notifyOnRotateListeners(detector: RotateGestureDetector) {\n    for (listener in onRotateListeners) {\n      listener.onRotate(detector)\n    }\n  }\n\n  private fun notifyOnRotateEndListeners(detector: RotateGestureDetector) {\n    for (listener in onRotateListeners) {\n      listener.onRotateEnd(detector)\n    }\n  }\n\n  private fun notifyOnScaleBeginListeners(detector: StandardScaleGestureDetector) {\n    for (listener in onScaleListeners) {\n      listener.onScaleBegin(detector)\n    }\n  }\n\n  private fun notifyOnScaleListeners(detector: StandardScaleGestureDetector) {\n    for (listener in onScaleListeners) {\n      listener.onScale(detector)\n    }\n  }\n\n  private fun notifyOnScaleEndListeners(detector: StandardScaleGestureDetector) {\n    for (listener in onScaleListeners) {\n      listener.onScaleEnd(detector)\n    }\n  }\n\n  private fun notifyOnShoveBeginListeners(detector: ShoveGestureDetector) {\n    for (listener in onShoveListeners) {\n      listener.onShoveBegin(detector)\n    }\n  }\n\n  private fun notifyOnShoveListeners(detector: ShoveGestureDetector) {\n    for (listener in onShoveListeners) {\n      listener.onShove(detector)\n    }\n  }\n\n  private fun notifyOnShoveEndListeners(detector: ShoveGestureDetector) {\n    for (listener in onShoveListeners) {\n      listener.onShoveEnd(detector)\n    }\n  }\n\n  /**\n   * Add a callback that is invoked when the map is clicked.\n   */\n  override fun addOnMapClickListener(onMapClickListener: OnMapClickListener) {\n    onMapClickListeners.add(onMapClickListener)\n  }\n\n  /**\n   * Remove a callback that is invoked when the map is clicked.\n   */\n  override fun removeOnMapClickListener(onMapClickListener: OnMapClickListener) {\n    onMapClickListeners.remove(onMapClickListener)\n  }\n\n  /**\n   * Add a callback that is invoked when the map is long clicked.\n   */\n  override fun addOnMapLongClickListener(onMapLongClickListener: OnMapLongClickListener) {\n    onMapLongClickListeners.add(onMapLongClickListener)\n  }\n\n  /**\n   * Remove a callback that is invoked when the map is long clicked.\n   */\n  override fun removeOnMapLongClickListener(onMapLongClickListener: OnMapLongClickListener) {\n    onMapLongClickListeners.remove(onMapLongClickListener)\n  }\n\n  /**\n   * Add a callback that is invoked when the map is has received a fling gesture.\n   */\n  override fun addOnFlingListener(onFlingListener: OnFlingListener) {\n    onFlingListeners.add(onFlingListener)\n  }\n\n  /**\n   * Remove a callback that is invoked when the map is has received a fling gesture.\n   */\n  override fun removeOnFlingListener(onFlingListener: OnFlingListener) {\n    onFlingListeners.remove(onFlingListener)\n  }\n\n  /**\n   * Add a callback that is invoked when the map is moved.\n   */\n  override fun addOnMoveListener(onMoveListener: OnMoveListener) {\n    onMoveListeners.add(onMoveListener)\n  }\n\n  /**\n   * Remove a callback that is invoked when the map is moved.\n   */\n  override fun removeOnMoveListener(listener: OnMoveListener) {\n    onMoveListeners.remove(listener)\n  }\n\n  /**\n   * Add a callback that is invoked when the map is rotated.\n   */\n  override fun addOnRotateListener(onRotateListener: OnRotateListener) {\n    onRotateListeners.add(onRotateListener)\n  }\n\n  /**\n   * Remove a callback that is invoked when the map is rotated.\n   */\n  override fun removeOnRotateListener(listener: OnRotateListener) {\n    onRotateListeners.remove(listener)\n  }\n\n  /**\n   * Add a callback that is invoked when the map is scaled.\n   */\n  override fun addOnScaleListener(onScaleListener: OnScaleListener) {\n    onScaleListeners.add(onScaleListener)\n  }\n\n  /**\n   * Remove a callback that is invoked when the map is scaled.\n   */\n  override fun removeOnScaleListener(listener: OnScaleListener) {\n    onScaleListeners.remove(listener)\n  }\n\n  /**\n   * Add a callback that is invoked when the map is shoved.\n   */\n  override fun addOnShoveListener(onShoveListener: OnShoveListener) {\n    onShoveListeners.add(onShoveListener)\n  }\n\n  /**\n   * Remove a callback that is invoked when the map is shoved.\n   */\n  override fun removeOnShoveListener(listener: OnShoveListener) {\n    onShoveListeners.remove(listener)\n  }\n\n  /**\n   * Add animator owner (see [CameraAnimatorOptions.owner] or [MapAnimationOptions.owner]\n   * which animation will not be canceled with when gesture animation is about to start.\n   * When specified, you are responsible for listening to gesture interactions and canceling the specified owners' animations to avoid competing with gestures.\n   */\n  override fun addProtectedAnimationOwner(owner: String) {\n    protectedCameraAnimatorOwners.add(owner)\n  }\n\n  /**\n   * Remove animator owner (see [CameraAnimatorOptions.owner] or [MapAnimationOptions.owner])\n   * which animation will not be canceled with when gesture animation is about to start.\n   * When specified, you are responsible for listening to gesture interactions and canceling the specified owners' animations to avoid competing with gestures.\n   */\n  override fun removeProtectedAnimationOwner(owner: String) {\n    protectedCameraAnimatorOwners.remove(owner)\n  }\n\n  /**\n   * Get the current configured AndroidGesturesManager.\n   */\n  override fun getGesturesManager(): AndroidGesturesManager {\n    return gesturesManager\n  }\n\n  /**\n   * Set the AndroidGesturesManager instance.\n   */\n  override fun setGesturesManager(\n    internalGesturesManager: AndroidGesturesManager,\n    attachDefaultListeners: Boolean,\n    setDefaultMutuallyExclusives: Boolean\n  ) {\n    initializeGesturesManager(\n      internalGesturesManager,\n      setDefaultMutuallyExclusives\n    )\n    initializeGestureListeners(context, attachDefaultListeners)\n  }\n\n  private fun clamp(value: Double, min: Double, max: Double): Double {\n    return min.coerceAtLeast(max.coerceAtMost(value))\n  }\n\n  @Suppress(\"SameParameterValue\")\n  private fun clamp(value: Float, min: Float, max: Float): Float {\n    return min.coerceAtLeast(max.coerceAtMost(value))\n  }\n\n  private fun Double.normalize(\n    x: Double,\n    dataLow: Double,\n    dataHigh: Double,\n    normalizedHigh: Double\n  ): Double {\n    return (x - dataLow) / (dataHigh - dataLow) * (normalizedHigh - this) + this\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   */\n  override fun cleanup() {\n    style = null\n    unregisterInteractions()\n    protectedCameraAnimatorOwners.clear()\n    animationsTimeoutHandler.removeCallbacksAndMessages(null)\n  }\n\n  /**\n   * Bind the Gestures plugin with current context. This will enable the map\n   * to use the Gesture plugin.\n   *\n   * @param context The Context\n   * @param attrs The attribution set of the MapView.\n   * @param pixelRatio The pixel density of the screen.\n   */\n  override fun bind(context: Context, attrs: AttributeSet?, pixelRatio: Float) {\n    val gesturesManager = AndroidGesturesManager(context)\n    bind(context, gesturesManager, attrs, pixelRatio)\n  }\n\n  // For internal testing.\n  internal fun bind(\n    context: Context,\n    gesturesManager: AndroidGesturesManager,\n    attrs: AttributeSet?,\n    pixelRatio: Float\n  ) {\n    this.gesturesManager = gesturesManager\n    this.gestureState = GestureState(gesturesManager)\n    this.pixelRatio = pixelRatio\n    internalSettings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    delegateProvider.getStyle {\n      this.style = it\n    }\n    this.mapTransformDelegate = delegateProvider.mapTransformDelegate\n    this.mapCameraManagerDelegate = delegateProvider.mapCameraManagerDelegate\n    this.mapProjectionDelegate = delegateProvider.mapProjectionDelegate\n    this.mapInteractionDelegate = delegateProvider.mapInteractionDelegate\n    this.mapPluginProviderDelegate = delegateProvider.mapPluginProviderDelegate\n    this.cameraAnimationsPlugin = delegateProvider.mapPluginProviderDelegate.getPlugin(\n      MAPBOX_CAMERA_PLUGIN_ID\n    ) ?: throw InvalidPluginConfigurationException(\n      \"Can't look up an instance of plugin, \" +\n        \"is it available on the clazz path and loaded through the map?\"\n    )\n    this.cameraAnimationsPlugin.addCameraPaddingChangeListener {\n      cameraPaddingChanged = true\n    }\n    coreGesturesHandler = CoreGesturesHandler(mapTransformDelegate, mapCameraManagerDelegate)\n  }\n\n  /**\n   * Called when new style is loaded.\n   */\n  override fun onStyleChanged(style: MapboxStyleManager) {\n    this.style = style\n  }\n\n  /**\n   * Called when the plugin is first added to the map.\n   */\n  override fun initialize() {\n    initializeGesturesManager(gesturesManager, true)\n    initializeGestureListeners(context, true)\n  }\n\n  private companion object {\n    private const val TAG = \"Gestures\"\n\n    // immediate options (duration = 0) are handled by Mapbox animation plugin instantly\n    private val IMMEDIATE_ANIMATION_OPTIONS = mapAnimationOptions {\n      duration(0)\n      owner(MapAnimationOwnerRegistry.GESTURES)\n    }\n    const val ROTATION_ANGLE_THRESHOLD = 3.0f\n    const val MAX_SHOVE_ANGLE = 45.0f\n  }\n}\n\n/**\n * Convert a motion event to ScreenCoordinate.\n */\nprivate fun MotionEvent.toScreenCoordinate() = ScreenCoordinate(x.toDouble(), y.toDouble())"
  },
  {
    "path": "plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/StandardGestureListenerShim.java",
    "content": "package com.mapbox.maps.plugin.gestures;\n\nimport android.view.MotionEvent;\n\nimport androidx.annotation.Nullable;\n\nimport com.mapbox.android.gestures.StandardGestureDetector;\n\n/**\n * Gesture listener callbacks comes from the Java library and could still be NULL.\n * This shim redeclares nullability annotations to allow overriding corresponding methods\n * with an optional type in Kotlin.\n */\nclass StandardGestureListenerShim extends StandardGestureDetector.SimpleStandardOnGestureListener {\n\n  @Override\n  public boolean onSingleTapConfirmed(@Nullable MotionEvent e) {\n    return super.onSingleTapConfirmed(e);\n  }\n\n  @Override\n  public boolean onDoubleTap(@Nullable MotionEvent e) {\n    return super.onDoubleTap(e);\n  }\n\n  @Override\n  public boolean onDoubleTapEvent(@Nullable MotionEvent e) {\n    return super.onDoubleTapEvent(e);\n  }\n\n  @Override\n  public boolean onDown(@Nullable MotionEvent e) {\n    return super.onDown(e);\n  }\n\n  @Override\n  public void onShowPress(@Nullable MotionEvent e) {\n    super.onShowPress(e);\n  }\n\n  @Override\n  public boolean onSingleTapUp(@Nullable MotionEvent e) {\n    return super.onSingleTapUp(e);\n  }\n\n  @Override\n  public boolean onScroll(@Nullable MotionEvent e1, @Nullable MotionEvent e2, float distanceX, float distanceY) {\n    return super.onScroll(e1, e2, distanceX, distanceY);\n  }\n\n  @Override\n  public void onLongPress(@Nullable MotionEvent e) {\n    super.onLongPress(e);\n  }\n\n  @Override\n  public boolean onFling(@Nullable MotionEvent e1, @Nullable MotionEvent e2, float velocityX, float velocityY) {\n    return super.onFling(e1, e2, velocityX, velocityY);\n  }\n}\n"
  },
  {
    "path": "plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/generated/GesturesAttributeParser.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.gestures.generated\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.ScrollMode\nimport com.mapbox.maps.plugin.gestures.R\n\n/**\n * Utility class for parsing [AttributeSet] to [GesturesSettings].\n */\ninternal object GesturesAttributeParser {\n  /**\n   * Parse [AttributeSet] to [GesturesSettings].\n   *\n   * @param context Context\n   * @param attrs AttributionSet\n   */\n  fun parseGesturesSettings(context: Context, attrs: AttributeSet?): GesturesSettings {\n    val typedArray = context.obtainStyledAttributes(attrs, R.styleable.mapbox_MapView, 0, 0)\n    try {\n      return GesturesSettings {\n        rotateEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesRotateEnabled, true)\n        pinchToZoomEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesPinchToZoomEnabled, true)\n        scrollEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesScrollEnabled, true)\n        simultaneousRotateAndPinchToZoomEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesSimultaneousRotateAndPinchToZoomEnabled, true)\n        pitchEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesPitchEnabled, true)\n        scrollMode = ScrollMode.values()[typedArray.getInt(R.styleable.mapbox_MapView_mapbox_gesturesScrollMode, ScrollMode.HORIZONTAL_AND_VERTICAL.ordinal)]\n        doubleTapToZoomInEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesDoubleTapToZoomInEnabled, true)\n        doubleTouchToZoomOutEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesDoubleTouchToZoomOutEnabled, true)\n        quickZoomEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesQuickZoomEnabled, true)\n        focalPoint = if (typedArray.hasValue(R.styleable.mapbox_MapView_mapbox_gesturesFocalPointX) && typedArray.hasValue(R.styleable.mapbox_MapView_mapbox_gesturesFocalPointY)) {\n          ScreenCoordinate(\n            typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_gesturesFocalPointX, 0.0f).toDouble(),\n            typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_gesturesFocalPointY, 0.0f).toDouble()\n          )\n        } else {\n          null\n        }\n        pinchToZoomDecelerationEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesPinchToZoomDecelerationEnabled, true)\n        rotateDecelerationEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesRotateDecelerationEnabled, true)\n        scrollDecelerationEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesScrollDecelerationEnabled, true)\n        increaseRotateThresholdWhenPinchingToZoom = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesIncreaseRotateThresholdWhenPinchingToZoom, true)\n        increasePinchToZoomThresholdWhenRotating = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesIncreasePinchToZoomThresholdWhenRotating, true)\n        zoomAnimationAmount = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_gesturesZoomAnimationAmount, 1f)\n        pinchScrollEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_gesturesPinchScrollEnabled, true)\n      }\n    } finally {\n      typedArray.recycle()\n    }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-gestures/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n    <declare-styleable name=\"mapbox_MapView\">\n        <!-- Whether the rotate gesture is enabled. -->\n        <attr name=\"mapbox_gesturesRotateEnabled\" format=\"boolean\"/>\n        <!-- Whether the pinch to zoom gesture is enabled. -->\n        <attr name=\"mapbox_gesturesPinchToZoomEnabled\" format=\"boolean\"/>\n        <!-- Whether the single-touch scroll gesture is enabled. -->\n        <attr name=\"mapbox_gesturesScrollEnabled\" format=\"boolean\"/>\n        <!-- Whether rotation is enabled for the pinch to zoom gesture. -->\n        <attr name=\"mapbox_gesturesSimultaneousRotateAndPinchToZoomEnabled\" format=\"boolean\"/>\n        <!-- Whether the pitch gesture is enabled. -->\n        <attr name=\"mapbox_gesturesPitchEnabled\" format=\"boolean\"/>\n        <!-- Configures the directions in which the map is allowed to move during a scroll gesture. -->\n        <attr name=\"mapbox_gesturesScrollMode\" format=\"enum\">\n          <!-- The map may only move horizontally. -->\n          <enum name=\"horizontal\" value=\"0\"/>\n          <!-- The map may only move vertically. -->\n          <enum name=\"vertical\" value=\"1\"/>\n          <!-- The map may move both horizontally and vertically. -->\n          <enum name=\"horizontal_and_vertical\" value=\"2\"/>\n        </attr>\n        <!-- Whether double tapping the map with one touch results in a zoom-in animation. -->\n        <attr name=\"mapbox_gesturesDoubleTapToZoomInEnabled\" format=\"boolean\"/>\n        <!-- Whether single tapping the map with two touches results in a zoom-out animation. -->\n        <attr name=\"mapbox_gesturesDoubleTouchToZoomOutEnabled\" format=\"boolean\"/>\n        <!-- Whether the quick zoom gesture is enabled. -->\n        <attr name=\"mapbox_gesturesQuickZoomEnabled\" format=\"boolean\"/>\n        <!-- By default, gestures rotate and zoom around the center of the gesture. Set this property to rotate and zoom around a fixed point instead. -->\n        <attr name=\"mapbox_gesturesFocalPointX\" format=\"float\"/>\n        <attr name=\"mapbox_gesturesFocalPointY\" format=\"float\"/>\n        <!-- Whether a deceleration animation following a pinch-to-zoom gesture is enabled. True by default. -->\n        <attr name=\"mapbox_gesturesPinchToZoomDecelerationEnabled\" format=\"boolean\"/>\n        <!-- Whether a deceleration animation following a rotate gesture is enabled. True by default. -->\n        <attr name=\"mapbox_gesturesRotateDecelerationEnabled\" format=\"boolean\"/>\n        <!-- Whether a deceleration animation following a scroll gesture is enabled. True by default. -->\n        <attr name=\"mapbox_gesturesScrollDecelerationEnabled\" format=\"boolean\"/>\n        <!-- Whether rotate threshold increases when pinching to zoom. true by default.\n            {@deprecated This property has no effect} -->\n        <attr name=\"mapbox_gesturesIncreaseRotateThresholdWhenPinchingToZoom\" format=\"boolean\"/>\n        <!-- Whether pinch to zoom threshold increases when rotating. true by default. -->\n        <attr name=\"mapbox_gesturesIncreasePinchToZoomThresholdWhenRotating\" format=\"boolean\"/>\n        <!-- The amount by which the zoom level increases or decreases during a double-tap-to-zoom-in or double-touch-to-zoom-out gesture. 1.0 by default. Must be positive. -->\n        <attr name=\"mapbox_gesturesZoomAnimationAmount\" format=\"float\"/>\n        <!-- Whether pan is enabled for the pinch gesture. -->\n        <attr name=\"mapbox_gesturesPinchScrollEnabled\" format=\"boolean\"/>\n    </declare-styleable>\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-gestures/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!--Minimum scale velocity required to start animation-->\n    <dimen name=\"mapbox_minimum_scale_velocity\">225dp</dimen>\n    <!--Minimum scale span delta required to execute scale gesture when rotating-->\n    <dimen name=\"mapbox_minimum_scale_span_when_rotating\">75dp</dimen>\n    <!--Minimum angular velocity required to start rotation animation-->\n    <dimen name=\"mapbox_minimum_angular_velocity\">0.10dp</dimen>\n    <!--Angular velocity multiplier. Adapts the velocity for screen density-->\n    <dimen name=\"mapbox_angular_velocity_multiplier\">1.3dp</dimen>\n    <!--Screen density constant to adjust gesture's velocityXY thresholds-->\n    <dimen name=\"mapbox_density_constant\">0.29dp</dimen>\n    <dimen name=\"mapbox_minimum_scale_speed\">0.6dp</dimen>\n    <dimen name=\"mapbox_minimum_angled_scale_speed\">0.9dp</dimen>\n</resources>"
  },
  {
    "path": "plugin-gestures/src/main/res/values/strings.xml",
    "content": "<resources>\n</resources>"
  },
  {
    "path": "plugin-gestures/src/main/res-public/values/public.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n\n    <!-- Whether the rotate gesture is enabled. -->\n    <public name=\"mapbox_gesturesRotateEnabled\" type=\"attr\" />\n\n    <!-- Whether the pinch to zoom gesture is enabled. -->\n    <public name=\"mapbox_gesturesPinchToZoomEnabled\" type=\"attr\" />\n\n    <!-- Whether the single-touch scroll gesture is enabled. -->\n    <public name=\"mapbox_gesturesScrollEnabled\" type=\"attr\" />\n\n    <!-- Whether rotation is enabled for the pinch to zoom gesture. -->\n    <public name=\"mapbox_gesturesSimultaneousRotateAndPinchToZoomEnabled\" type=\"attr\" />\n\n    <!-- Whether the pitch gesture is enabled. -->\n    <public name=\"mapbox_gesturesPitchEnabled\" type=\"attr\" />\n\n    <!-- Configures the directions in which the map is allowed to move during a scroll gesture. -->\n    <public name=\"mapbox_gesturesScrollMode\" type=\"attr\" />\n\n    <!-- Whether double tapping the map with one touch results in a zoom-in animation. -->\n    <public name=\"mapbox_gesturesDoubleTapToZoomInEnabled\" type=\"attr\" />\n\n    <!-- Whether single tapping the map with two touches results in a zoom-out animation. -->\n    <public name=\"mapbox_gesturesDoubleTouchToZoomOutEnabled\" type=\"attr\" />\n\n    <!-- Whether the quick zoom gesture is enabled. -->\n    <public name=\"mapbox_gesturesQuickZoomEnabled\" type=\"attr\" />\n\n    <!-- By default, gestures rotate and zoom around the center of the gesture. Set this property to rotate and zoom around a fixed point instead. -->\n    <public name=\"mapbox_gesturesFocalPointX\" type=\"attr\" />\n    <public name=\"mapbox_gesturesFocalPointY\" type=\"attr\" />\n\n\n    <!-- Whether a deceleration animation following a pinch-to-zoom gesture is enabled. True by default. -->\n    <public name=\"mapbox_gesturesPinchToZoomDecelerationEnabled\" type=\"attr\" />\n\n    <!-- Whether a deceleration animation following a rotate gesture is enabled. True by default. -->\n    <public name=\"mapbox_gesturesRotateDecelerationEnabled\" type=\"attr\" />\n\n    <!-- Whether a deceleration animation following a scroll gesture is enabled. True by default. -->\n    <public name=\"mapbox_gesturesScrollDecelerationEnabled\" type=\"attr\" />\n\n    <!-- Whether rotate threshold increases when pinching to zoom. true by default.\n         {@deprecated This property has no effect} -->\n    <public name=\"mapbox_gesturesIncreaseRotateThresholdWhenPinchingToZoom\" type=\"attr\" />\n\n    <!-- Whether pinch to zoom threshold increases when rotating. true by default. -->\n    <public name=\"mapbox_gesturesIncreasePinchToZoomThresholdWhenRotating\" type=\"attr\" />\n\n    <!-- The amount by which the zoom level increases or decreases during a double-tap-to-zoom-in or double-touch-to-zoom-out gesture. 1.0 by default. Must be positive. -->\n    <public name=\"mapbox_gesturesZoomAnimationAmount\" type=\"attr\" />\n\n    <!-- Whether pan is enabled for the pinch gesture. -->\n    <public name=\"mapbox_gesturesPinchScrollEnabled\" type=\"attr\" />\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-gestures/src/test/java/com/mapbox/maps/plugin/gestures/GestureOptionsTest.kt",
    "content": "package com.mapbox.maps.plugin.gestures\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.os.Handler\nimport android.util.AttributeSet\nimport com.mapbox.android.gestures.AndroidGesturesManager\nimport com.mapbox.maps.plugin.ScrollMode\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.delegates.MapProjectionDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.plugin.gestures.generated.GesturesAttributeParser\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\n\nclass GestureOptionsTest {\n\n  private val context: Context = mockk(relaxed = true)\n\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n\n  private val typedArray: TypedArray = mockk(relaxUnitFun = true)\n\n  private val gestureManager: AndroidGesturesManager = mockk(relaxed = true)\n\n  private val mapTransformDelegate: MapTransformDelegate = mockk(relaxUnitFun = true)\n\n  private val mapProjectionDelegate: MapProjectionDelegate = mockk(relaxUnitFun = true)\n\n  private val mapDelegateProvider: MapDelegateProvider = mockk(relaxUnitFun = true)\n\n  private val mapPluginProviderDelegate: MapPluginProviderDelegate = mockk(relaxUnitFun = true)\n\n  private val cameraAnimationsPlugin: CameraAnimationsPlugin = mockk(relaxed = true)\n\n  private val pack = \"com.mapbox.maps\"\n\n  private val animationsTimeoutHandler = mockk<Handler>()\n\n  private val runnableSlot = slot<Runnable>()\n\n  private val gesturePlugin =\n    GesturesPluginImpl(context, mockk(relaxed = true), mockk(relaxed = true), animationsTimeoutHandler)\n\n  @Before\n  fun setUp() {\n    mockkObject(GesturesAttributeParser::class)\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { context.packageName } returns pack\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getInt(any(), any()) } returns 0\n    every { typedArray.hasValue(any()) } returns true\n    every { mapDelegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    every { mapPluginProviderDelegate.camera } returns cameraAnimationsPlugin\n    every { mapDelegateProvider.mapTransformDelegate } returns mapTransformDelegate\n    every { mapDelegateProvider.mapProjectionDelegate } returns mapProjectionDelegate\n    gesturePlugin.mapInteractionDelegate = mockk(relaxed = true)\n  }\n\n  private fun setupGesturePlugin() {\n    gesturePlugin.bind(context, gestureManager, attrs, 1f)\n    gesturePlugin.initialize()\n  }\n\n  @After\n  fun cleanUp() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun getGestureSettingsPinchToZoomEnabled() {\n    setupGesturePlugin()\n    assertTrue(gesturePlugin.getSettings().pinchToZoomEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsPinchToZoomDisabled() {\n    every {\n      typedArray.getBoolean(\n        R.styleable.mapbox_MapView_mapbox_gesturesPinchToZoomEnabled,\n        true\n      )\n    } returns false\n    setupGesturePlugin()\n    assertFalse(gesturePlugin.getSettings().pinchToZoomEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsRotateEnabled() {\n    setupGesturePlugin()\n    assertTrue(gesturePlugin.getSettings().rotateEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsRotateDisabled() {\n    every {\n      typedArray.getBoolean(\n        R.styleable.mapbox_MapView_mapbox_gesturesRotateEnabled,\n        true\n      )\n    } returns false\n    setupGesturePlugin()\n    assertFalse(gesturePlugin.getSettings().rotateEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsPitchEnabled() {\n    setupGesturePlugin()\n    assertTrue(gesturePlugin.getSettings().pitchEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsPitchDisabled() {\n    every {\n      typedArray.getBoolean(\n        R.styleable.mapbox_MapView_mapbox_gesturesPitchEnabled,\n        true\n      )\n    } returns false\n    setupGesturePlugin()\n    assertFalse(gesturePlugin.getSettings().pitchEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsScrollEnabled() {\n    setupGesturePlugin()\n    assertTrue(gesturePlugin.getSettings().scrollEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsScrollDisabled() {\n    every {\n      typedArray.getBoolean(\n        R.styleable.mapbox_MapView_mapbox_gesturesScrollEnabled,\n        true\n      )\n    } returns false\n    setupGesturePlugin()\n    assertFalse(gesturePlugin.getSettings().scrollEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsQuickZoomEnabled() {\n    setupGesturePlugin()\n    assertTrue(gesturePlugin.getSettings().quickZoomEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsQuickZoomDisabled() {\n    every {\n      typedArray.getBoolean(\n        R.styleable.mapbox_MapView_mapbox_gesturesQuickZoomEnabled,\n        true\n      )\n    } returns false\n    setupGesturePlugin()\n    assertFalse(gesturePlugin.getSettings().quickZoomEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsDoubleTapToZoomInEnabled() {\n    setupGesturePlugin()\n    assertTrue(gesturePlugin.getSettings().doubleTapToZoomInEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsDoubleTapToZoomInDisabled() {\n    every {\n      typedArray.getBoolean(\n        R.styleable.mapbox_MapView_mapbox_gesturesDoubleTapToZoomInEnabled,\n        true\n      )\n    } returns false\n    setupGesturePlugin()\n    assertFalse(gesturePlugin.getSettings().doubleTapToZoomInEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsDoubleTouchToZoomOutEnabled() {\n    setupGesturePlugin()\n    assertTrue(gesturePlugin.getSettings().doubleTouchToZoomOutEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsDoubleTouchToZoomOutDisabled() {\n    every {\n      typedArray.getBoolean(\n        R.styleable.mapbox_MapView_mapbox_gesturesDoubleTouchToZoomOutEnabled,\n        true\n      )\n    } returns false\n    setupGesturePlugin()\n    assertFalse(gesturePlugin.getSettings().doubleTouchToZoomOutEnabled)\n  }\n\n  @Test\n  fun getGestureSettingsPanScrollDefault() {\n    every {\n      typedArray.getInt(\n        R.styleable.mapbox_MapView_mapbox_gesturesScrollMode,\n        any()\n      )\n    } returns ScrollMode.HORIZONTAL_AND_VERTICAL.ordinal\n    setupGesturePlugin()\n    assertEquals(gesturePlugin.getSettings().scrollMode, ScrollMode.HORIZONTAL_AND_VERTICAL)\n  }\n\n  @Test\n  fun getGestureSettingsPanScrollHorizontal() {\n    every {\n      typedArray.getInt(\n        R.styleable.mapbox_MapView_mapbox_gesturesScrollMode,\n        any()\n      )\n    } returns ScrollMode.HORIZONTAL.ordinal\n    setupGesturePlugin()\n    assertEquals(gesturePlugin.getSettings().scrollMode, ScrollMode.HORIZONTAL)\n  }\n\n  @Test\n  fun getGestureSettingsPanScrollVertical() {\n    every {\n      typedArray.getInt(\n        R.styleable.mapbox_MapView_mapbox_gesturesScrollMode,\n        any()\n      )\n    } returns ScrollMode.VERTICAL.ordinal\n    setupGesturePlugin()\n    assertEquals(gesturePlugin.getSettings().scrollMode, ScrollMode.VERTICAL)\n  }\n}"
  },
  {
    "path": "plugin-gestures/src/test/java/com/mapbox/maps/plugin/gestures/GestureStateTest.kt",
    "content": "package com.mapbox.maps.plugin.gestures\n\nimport com.mapbox.android.gestures.AndroidGesturesManager\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.android.gestures.RotateGestureDetector\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.runs\nimport io.mockk.verify\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertNull\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n@RunWith(Parameterized::class)\ninternal class GestureStateTest(private val type: GestureState.Type) {\n  private lateinit var gestureState: GestureState\n  private lateinit var moveGestureDetector: MoveGestureDetector\n  private lateinit var rotateGestureDetector: RotateGestureDetector\n\n  @Before\n  fun setup() {\n    val gesturesManager = mockk<AndroidGesturesManager>()\n    moveGestureDetector = mockk()\n    rotateGestureDetector = mockk()\n    every { gesturesManager.moveGestureDetector } returns moveGestureDetector\n    every { gesturesManager.rotateGestureDetector } returns rotateGestureDetector\n    every { moveGestureDetector.isEnabled = any() } just runs\n    every { rotateGestureDetector.isEnabled = any() } just runs\n    gestureState = GestureState(gesturesManager)\n  }\n\n  @Test\n  fun checkPeekReturnsNull() {\n    assertNull(gestureState.peek(type))\n  }\n\n  private fun checkSaveAndDisableWithValue(value: Boolean) {\n    every { moveGestureDetector.isEnabled } returns value\n    every { rotateGestureDetector.isEnabled } returns value\n    gestureState.saveAndDisable(type)\n    assertEquals(value, gestureState.peek(type))\n    when (type) {\n      GestureState.Type.Scale -> verify { rotateGestureDetector.isEnabled = false }\n      else -> verify { moveGestureDetector.isEnabled = false }\n    }\n    assertNotNull(gestureState.peek(type))\n    // Ensure no other gestures were stored.\n    for (t in GestureState.Type.values()) {\n      if (t != type) {\n        assertNull(gestureState.peek(t))\n      }\n    }\n  }\n\n  @Test\n  fun checkSaveAndDisableWhenGestureIsDisabled() {\n    checkSaveAndDisableWithValue(false)\n  }\n\n  @Test\n  fun checkSaveAndDisableWhenGestureIsEnabled() {\n    checkSaveAndDisableWithValue(true)\n  }\n\n  private fun restoreWithValue(value: Boolean) {\n    every { moveGestureDetector.isEnabled } returns value\n    every { rotateGestureDetector.isEnabled } returns value\n    gestureState.saveAndDisable(type)\n    assertEquals(value, gestureState.peek(type))\n    gestureState.restore(type)\n    when (type) {\n      GestureState.Type.Scale -> verify { rotateGestureDetector.isEnabled = value }\n      else -> verify { moveGestureDetector.isEnabled = value }\n    }\n    // There should be no gestures stored of any type.\n    for (t in GestureState.Type.values()) {\n      assertNull(gestureState.peek(t))\n    }\n  }\n\n  @Test\n  fun checkRestoreWhenGestureIsDisabled() {\n    restoreWithValue(false)\n  }\n\n  @Test\n  fun checkRestoreWhenGestureIsEnabled() {\n    restoreWithValue(true)\n  }\n\n  internal companion object {\n    @JvmStatic\n    @Parameterized.Parameters(name = \"for gesture type {0}\")\n    fun data() = GestureState.Type.values()\n  }\n}"
  },
  {
    "path": "plugin-gestures/src/test/java/com/mapbox/maps/plugin/gestures/GesturesPluginTest.kt",
    "content": "package com.mapbox.maps.plugin.gestures\n\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.PointF\nimport android.util.AttributeSet\nimport android.view.InputDevice.SOURCE_CLASS_POINTER\nimport android.view.MotionEvent\nimport android.view.MotionEvent.ACTION_DOWN\nimport android.view.MotionEvent.ACTION_MOVE\nimport android.view.MotionEvent.ACTION_POINTER_DOWN\nimport android.view.MotionEvent.ACTION_UP\nimport android.view.MotionEvent.BUTTON_SECONDARY\nimport android.view.MotionEvent.TOOL_TYPE_FINGER\nimport android.view.MotionEvent.obtain\nimport androidx.test.core.view.PointerCoordsBuilder\nimport androidx.test.core.view.PointerPropertiesBuilder\nimport com.mapbox.android.gestures.AndroidGesturesManager\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.android.gestures.RotateGestureDetector\nimport com.mapbox.android.gestures.ShoveGestureDetector\nimport com.mapbox.android.gestures.StandardGestureDetector\nimport com.mapbox.android.gestures.StandardScaleGestureDetector\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapCenterAltitudeMode\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.PlatformEventInfo\nimport com.mapbox.maps.PlatformEventType\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.Size\nimport com.mapbox.maps.StylePropertyValue\nimport com.mapbox.maps.StylePropertyValueKind\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.ScrollMode\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOwnerRegistry\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapInteractionDelegate\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.delegates.MapProjectionDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.plugin.gestures.generated.GesturesAttributeParser\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettings\nimport io.mockk.Runs\nimport io.mockk.clearAllMocks\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkObject\nimport io.mockk.mockkStatic\nimport io.mockk.runs\nimport io.mockk.slot\nimport io.mockk.unmockkAll\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.ParameterizedRobolectricTestRunner\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.LooperMode\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass GesturesPluginTest {\n\n  private val context: Context = mockk(relaxed = true)\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n\n  private val mapDelegateProvider: MapDelegateProvider = mockk(relaxUnitFun = true)\n\n  private val mapTransformDelegate: MapTransformDelegate = mockk(relaxUnitFun = true)\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate = mockk()\n  private val mapPluginProviderDelegate: MapPluginProviderDelegate = mockk(relaxUnitFun = true)\n  private val mapProjectionDelegate: MapProjectionDelegate = mockk(relaxUnitFun = true)\n  @OptIn(MapboxExperimental::class)\n  private val mapInteractionDelegate: MapInteractionDelegate = mockk()\n  private val cameraAnimationsPlugin: CameraAnimationsPlugin = mockk(relaxed = true)\n\n  private val mapCenterAltitudeMode: MapCenterAltitudeMode = mockk()\n\n  private val gesturesManager: AndroidGesturesManager = mockk(relaxed = true)\n  private var rotateGestureDetector: RotateGestureDetector = mockk(relaxUnitFun = true)\n  private var shoveGestureDetector: ShoveGestureDetector = mockk()\n  private var scaleGestureDetector: StandardScaleGestureDetector = mockk(relaxUnitFun = true)\n  private var moveGestureDetector: MoveGestureDetector = mockk(relaxUnitFun = true)\n\n  private lateinit var style: MapboxStyleManager\n\n  private val motionEvent1 = mockk<MotionEvent>()\n  private val motionEvent2 = mockk<MotionEvent>()\n\n  private val typedArray: TypedArray = mockk(relaxed = true)\n  private val pack = \"com.mapbox.maps\"\n\n  private val gestureListener = slot<StandardGestureDetector.StandardOnGestureListener>()\n  private lateinit var presenter: GesturesPluginImpl\n\n  @MapboxExperimental\n  @Before\n  fun setUp() {\n    mockkObject(GesturesAttributeParser)\n    every {\n      GesturesAttributeParser.parseGesturesSettings(\n        context,\n        attrs\n      )\n    } returns GesturesSettings { }\n\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { context.packageName } returns pack\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getInt(any(), any()) } returns 2\n    every { typedArray.hasValue(any()) } returns true\n\n    every { mapDelegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { mapDelegateProvider.mapTransformDelegate } returns mapTransformDelegate\n    every { mapDelegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    every { mapDelegateProvider.mapProjectionDelegate } returns mapProjectionDelegate\n\n    every { mapDelegateProvider.mapInteractionDelegate } returns mapInteractionDelegate\n    every { mapInteractionDelegate.addInteraction(any()) } returns Cancelable { }\n    every { mapInteractionDelegate.dispatch(any()) } answers {\n      val platformEventInfo = firstArg<PlatformEventInfo>()\n      when (platformEventInfo.type) {\n        PlatformEventType.CLICK -> presenter.handleClickEvent(platformEventInfo.screenCoordinate)\n        PlatformEventType.LONG_CLICK -> presenter.handleLongPressEvent(platformEventInfo.screenCoordinate)\n        PlatformEventType.DRAG_BEGIN -> presenter.handleMoveStartEvent()\n        PlatformEventType.DRAG -> presenter.handleMove(platformEventInfo.screenCoordinate)\n        PlatformEventType.DRAG_END -> presenter.handleMoveEnd()\n      }\n    }\n\n    every { mapPluginProviderDelegate.getPlugin<CameraAnimationsPlugin>(Plugin.MAPBOX_CAMERA_PLUGIN_ID) } returns cameraAnimationsPlugin\n\n    every { mapTransformDelegate.getSize() } returns Size(100.0f, 100.0f)\n    every { mapCameraManagerDelegate.coordinateForPixel(any()) } returns Point.fromLngLat(0.0, 0.0)\n    every { mapCameraManagerDelegate.pixelForCoordinate(any()) } returns ScreenCoordinate(\n      0.0,\n      -10.0\n    )\n    every { mapCameraManagerDelegate.getCenterAltitudeMode() } returns mapCenterAltitudeMode\n    every { mapCameraManagerDelegate.setCenterAltitudeMode(any()) } just runs\n    style = mockk<MapboxStyleManager>()\n    every { style.getStyleProjectionProperty(\"name\") } returns StylePropertyValue(\n      Value.valueOf(\"mercator\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    every { motionEvent1.x } returns 0.0f\n    every { motionEvent1.y } returns 0.0f\n    every { motionEvent2.x } returns 0.0f\n    every { motionEvent2.y } returns 0.0f\n\n    presenter = GesturesPluginImpl(context, attrs, style)\n\n    presenter.bind(context, gesturesManager, attrs, 1f)\n    presenter.onDelegateProvider(mapDelegateProvider)\n    every {\n      gesturesManager.setStandardGestureListener(capture(gestureListener))\n    } just Runs\n    presenter.initialize()\n\n    every { gesturesManager.rotateGestureDetector } returns rotateGestureDetector\n    every { gesturesManager.standardScaleGestureDetector } returns scaleGestureDetector\n    every { gesturesManager.shoveGestureDetector } returns shoveGestureDetector\n    every { shoveGestureDetector.isInProgress } returns false\n    every { gesturesManager.moveGestureDetector } returns moveGestureDetector\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      0.0,\n      0.0\n    )\n    every {\n      mapCameraManagerDelegate.cameraForDrag(\n        any(),\n        any()\n      )\n    } returns CameraOptions.Builder().build()\n  }\n\n  private fun setupMoveListener(isEnabled: Boolean = true): OnMoveListener {\n    val listener: OnMoveListener = mockk(relaxed = true)\n    presenter.addOnMoveListener(listener)\n    every { moveGestureDetector.isEnabled } returns isEnabled\n    every { moveGestureDetector.focalPoint } returns PointF(1.0f, 1.0f)\n    presenter.moveGestureListener.detector = moveGestureDetector\n    return listener\n  }\n\n  private fun setupRotateListener(isEnabled: Boolean = true): OnRotateListener {\n    val listener: OnRotateListener = mockk(relaxed = true)\n    presenter.addOnRotateListener(listener)\n    every { rotateGestureDetector.isEnabled } returns isEnabled\n    return listener\n  }\n\n  private fun setupScaleListener(isEnabled: Boolean = true): OnScaleListener {\n    val listener: OnScaleListener = mockk(relaxed = true)\n    presenter.addOnScaleListener(listener)\n    every { scaleGestureDetector.isEnabled } returns isEnabled\n    return listener\n  }\n\n  private fun setupShoveListener(isEnabled: Boolean = true): OnShoveListener {\n    val listener: OnShoveListener = mockk(relaxed = true)\n    presenter.addOnShoveListener(listener)\n    every { shoveGestureDetector.isEnabled } returns isEnabled\n    return listener\n  }\n\n  private fun setupFlingListener(): OnFlingListener {\n    val listener: OnFlingListener = mockk(relaxed = true)\n    presenter.addOnFlingListener(listener)\n    return listener\n  }\n\n  @After\n  fun cleanUp() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun verifyIgnoreEvent() {\n    val touchHandled = presenter.onTouchEvent(null)\n    verify(exactly = 0) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 0) { mapCameraManagerDelegate.setCenterAltitudeMode(any()) }\n    assertFalse(touchHandled)\n  }\n\n  @Test\n  fun verifyOnGenericMoveEventIgnored() {\n    assertFalse(presenter.onGenericMotionEvent(obtainMotionEventAction(ACTION_DOWN)))\n  }\n\n  @Test\n  fun verifyOnGenericMoveEvent() {\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      1.0,\n      0.0,\n      0.0\n    )\n    every { cameraAnimationsPlugin.calculateScaleBy(any(), any()) } returns 2.0\n    assert(presenter.onGenericMotionEvent(obtainMotionEventButton(BUTTON_SECONDARY)))\n    verify(exactly = 1) { cameraAnimationsPlugin.easeTo(any(), any(), any()) }\n  }\n\n  @Test\n  fun verifyDoubleTapFinished() {\n    setupMoveListener()\n    every { gesturesManager.onTouchEvent(any()) } returns true\n    presenter.handleDoubleTapEvent(obtainMotionEventAction(ACTION_DOWN), 12.0f)\n    val touchHandled = presenter.onTouchEvent(obtainMotionEventAction(ACTION_POINTER_DOWN))\n    assert(touchHandled)\n  }\n\n  @Test\n  fun verifyOnGenericMoveEventIgnore() {\n    presenter.pinchToZoomEnabled = false\n    assertFalse(presenter.onGenericMotionEvent(obtainMotionEventButton(BUTTON_SECONDARY)))\n    verify(exactly = 0) { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) }\n  }\n\n  @Test\n  fun ignoreNonZeroButtonState() {\n    val touchHandled = presenter.onTouchEvent(obtainMotionEventButton(BUTTON_SECONDARY))\n    verify(exactly = 0) { mapTransformDelegate.setGestureInProgress(true) }\n    assertFalse(touchHandled)\n  }\n\n  @Test\n  fun verifyMotionEvent() {\n    every { gesturesManager.onTouchEvent(any()) }.returns(true)\n    val motionEvent: MotionEvent = obtainMotionEventAction(ACTION_DOWN)\n    presenter.onTouchEvent(motionEvent)\n    verify(exactly = 1) { gesturesManager.onTouchEvent(motionEvent) }\n  }\n\n  @Test\n  fun verifyLongPressListener() {\n    val listener: OnMapLongClickListener = mockk()\n    every { listener.onMapLongClick(any()) } returns true\n    val screenCoordinate = ScreenCoordinate(1.0, 1.0)\n    val point = Point.fromLngLat(0.0, 0.0)\n    every { mapCameraManagerDelegate.coordinateForPixel(screenCoordinate) } returns point\n\n    presenter.addOnMapLongClickListener(listener)\n    presenter.handleLongPressEvent(screenCoordinate)\n    verify(exactly = 1) { listener.onMapLongClick(point) }\n    presenter.removeOnMapLongClickListener(listener)\n    presenter.handleLongPressEvent(screenCoordinate)\n    verify(exactly = 1) { listener.onMapLongClick(point) }\n  }\n\n  @Test\n  fun verifyClickListener() {\n    val listener: OnMapClickListener = mockk(relaxed = true)\n    every { listener.onMapClick(any()) } returns true\n    val screenCoordinate = ScreenCoordinate(1.0, 1.0)\n    val point = Point.fromLngLat(0.0, 0.0)\n\n    every { mapCameraManagerDelegate.coordinateForPixel(screenCoordinate) } returns point\n    presenter.addOnMapClickListener(listener)\n    presenter.handleClickEvent(screenCoordinate)\n    verify(exactly = 1) { listener.onMapClick(point) }\n    presenter.removeOnMapClickListener(listener)\n    presenter.handleClickEvent(screenCoordinate)\n    verify(exactly = 1) { listener.onMapClick(point) }\n  }\n\n  @Test\n  fun verifySingleTapUp() {\n    presenter.handleSingleTapUpEvent()\n    verify(exactly = 1) { cameraAnimationsPlugin.cancelAllAnimators() }\n  }\n\n  @Test\n  fun verifyDoubleTapEvent() {\n    setupMoveListener()\n\n    // verify initial tap\n    val downEvent = obtainMotionEventAction(ACTION_DOWN)\n    presenter.handleDoubleTapEvent(downEvent, 0.0f)\n    verify(exactly = 1) { moveGestureDetector.isEnabled = false }\n    assertTrue(presenter.doubleTapRegistered)\n\n    // verify second tap\n    val upEvent = obtainMotionEventAction(ACTION_UP)\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 5.0\n    assert(presenter.handleDoubleTapEvent(upEvent, 0.0f))\n  }\n\n  @Test\n  fun verifyDoubleTapEventIgnoreLargeThreshold() {\n    setupMoveListener()\n\n    // verify initial tap\n    val downEvent = obtainMotionEventAction(ACTION_DOWN)\n    presenter.handleDoubleTapEvent(downEvent, 0.0f)\n    verify(exactly = 1) { moveGestureDetector.isEnabled = false }\n    assertTrue(presenter.doubleTapRegistered)\n\n    // verify second tap\n    val upEvent = obtainMotionEventActionDistant(ACTION_UP)\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 5.0\n    assertFalse(presenter.handleDoubleTapEvent(upEvent, 0.0f))\n  }\n\n  @Test\n  fun verifyDoubleTapEventIgnorePinchToZoomGesturesDisabled() {\n    presenter.doubleTapToZoomInEnabled = false\n\n    setupMoveListener()\n\n    // verify initial tap\n    val downEvent = obtainMotionEventAction(ACTION_DOWN)\n    presenter.handleDoubleTapEvent(downEvent, 0.0f)\n    verify(exactly = 1) { moveGestureDetector.isEnabled = false }\n    assertTrue(presenter.doubleTapRegistered)\n\n    // verify second tap\n    val upEvent = obtainMotionEventAction(ACTION_UP)\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 5.0\n    assertFalse(presenter.handleDoubleTapEvent(upEvent, 0.0f))\n  }\n\n  @Test\n  fun verifyDoubleTapEventIgnoreDoubleTapGesturesDisabled() {\n    presenter.doubleTapToZoomInEnabled = false\n    setupMoveListener()\n\n    // verify initial tap\n    val downEvent = obtainMotionEventAction(ACTION_DOWN)\n    presenter.handleDoubleTapEvent(downEvent, 0.0f)\n    verify(exactly = 1) { moveGestureDetector.isEnabled = false }\n    assertTrue(presenter.doubleTapRegistered)\n\n    // verify second tap\n    val upEvent = obtainMotionEventAction(ACTION_UP)\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 5.0\n    assertFalse(presenter.handleDoubleTapEvent(upEvent, 0.0f))\n  }\n\n  @Test\n  fun verifyDoubleTapEventFocalPoint() {\n    presenter.focalPoint = ScreenCoordinate(0.5, 0.5)\n\n    setupMoveListener()\n\n    // verify initial tap\n    val downEvent = obtainMotionEventAction(ACTION_DOWN)\n    presenter.handleDoubleTapEvent(downEvent, 0.0f)\n    verify(exactly = 1) { moveGestureDetector.isEnabled = false }\n    assertTrue(presenter.doubleTapRegistered)\n\n    // verify second tap\n    val upEvent = obtainMotionEventAction(ACTION_UP)\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 5.0\n    assert(presenter.handleDoubleTapEvent(upEvent, 0.0f))\n  }\n\n  @Test\n  fun verifyFlingListener() {\n    val listener = setupFlingListener()\n    setupMoveListener()\n\n    presenter.handleFlingEvent(motionEvent2, 0.0f, 0.0f)\n    verify(exactly = 1) { listener.onFling() }\n    presenter.removeOnFlingListener(listener)\n    presenter.handleFlingEvent(motionEvent2, 0.0f, 0.0f)\n    verify(exactly = 1) { listener.onFling() }\n  }\n\n  @Test\n  fun verifyFlingIgnoreSmallDisplacement() {\n    val result = presenter.handleFlingEvent(motionEvent2, 0.1f, 0.1f)\n    assertFalse(result)\n  }\n\n  @Test\n  fun verifyFlingIgnoreConfiguration() {\n    val listener = setupFlingListener()\n    presenter.scrollEnabled = false\n    val result = presenter.handleFlingEvent(motionEvent2, 0.1f, 0.1f)\n    assertFalse(result)\n    verify(exactly = 0) { listener.onFling() }\n  }\n\n  @Test\n  fun verifyMoveStartDisabled() {\n    val listener = setupMoveListener()\n    presenter.scrollEnabled = false\n    val handled = presenter.moveGestureListener.onMoveBegin(moveGestureDetector)\n    assertFalse(handled)\n    verify(exactly = 0) { listener.onMoveBegin(any()) }\n  }\n\n  @Test\n  fun verifyMoveStartListener() {\n    val listener = setupMoveListener()\n    every { moveGestureDetector.isInProgress } returns false\n    every { scaleGestureDetector.isInProgress } returns false\n    every { rotateGestureDetector.isInProgress } returns false\n    every { shoveGestureDetector.isInProgress } returns false\n    val handled = presenter.moveGestureListener.onMoveBegin(moveGestureDetector)\n    assertTrue(handled)\n    verify(exactly = 1) { listener.onMoveBegin(any()) }\n    presenter.removeOnMoveListener(listener)\n    presenter.handleMoveStartEvent()\n    verify(exactly = 1) { listener.onMoveBegin(any()) }\n  }\n\n  @Test\n  fun verifyHandleMoveExceptionFreeForInvalidFocalPoint() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    val moveGestureDetector = mockk<MoveGestureDetector>()\n    every { moveGestureDetector.pointersCount } returns 1\n    every {\n      moveGestureDetector.focalPoint\n    } returns PointF(Float.NaN, Float.NaN)\n    var handled = presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    assertFalse(handled)\n    verify(exactly = 1) { logE(any(), any()) }\n    every {\n      moveGestureDetector.focalPoint\n    } returns PointF(Float.POSITIVE_INFINITY, Float.NaN)\n    handled = presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    assertFalse(handled)\n    verify(exactly = 2) { logE(any(), any()) }\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun verifyHandleMoveExceptionFreeForInvalidDistance() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    val moveGestureDetector = mockk<MoveGestureDetector>()\n    every { moveGestureDetector.pointersCount } returns 1\n    every {\n      moveGestureDetector.focalPoint\n    } returns PointF(0f, 0f)\n    presenter.moveGestureListener.onMove(moveGestureDetector, 1f, Float.NaN)\n    verify(exactly = 1) { logE(any(), any()) }\n    presenter.moveGestureListener.onMove(moveGestureDetector, Float.NaN, 1f)\n    verify(exactly = 2) { logE(any(), any()) }\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun verifyMoveListenerPinchScrollDisabled() {\n    presenter.pinchScrollEnabled = false\n    val listener = setupMoveListener()\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      0.0,\n      0.0\n    )\n    every {\n      mapCameraManagerDelegate.cameraForDrag(\n        any(),\n        any()\n      )\n    } returns CameraOptions.Builder().center(Point.fromLngLat(0.0, 0.0)).build()\n\n    val moveGestureDetector = mockk<MoveGestureDetector>()\n    every { moveGestureDetector.focalPoint } returns PointF(0.0f, 0.0f)\n    every { moveGestureDetector.isInProgress } returns false\n    presenter.moveGestureListener.detector = moveGestureDetector\n    every { moveGestureDetector.pointersCount } returns 3\n    presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    every { moveGestureDetector.pointersCount } returns 2\n    presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    every { moveGestureDetector.pointersCount } returns 1\n    presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    // only 1-pan gesture did actually trigger dispatch\n    verify(exactly = 1) {\n      mapInteractionDelegate.dispatch(\n        PlatformEventInfo(\n          PlatformEventType.DRAG,\n          ScreenCoordinate(-50.0, -50.0)\n        )\n      )\n    }\n    // user listener is triggered only once\n    verify(exactly = 1) { listener.onMove(any()) }\n    // animation is run only once as well\n    verify(exactly = 1) {\n      mapCameraManagerDelegate.cameraForDrag(\n        ScreenCoordinate(0.0, 0.0),\n        ScreenCoordinate(-50.0, -50.0)\n      )\n    }\n    verify(exactly = 1) { cameraAnimationsPlugin.easeTo(any(), any(), any()) }\n    verify(exactly = 2) { mapCameraManagerDelegate.getCenterAltitudeMode() }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA) }\n\n    presenter.onTouchEvent(obtainMotionEventAction(ACTION_UP))\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(mapCenterAltitudeMode) }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(false) }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun verifyMoveListenerShoveInProgress() {\n    every { shoveGestureDetector.isInProgress } returns true\n\n    val moveGestureDetector = mockk<MoveGestureDetector>()\n    every { moveGestureDetector.pointersCount } returns 2\n    every {\n      moveGestureDetector.focalPoint\n    } returns PointF(0.0f, 0.0f)\n    presenter.moveGestureListener.detector = moveGestureDetector\n    var handled = presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    assertFalse(handled)\n    verify(exactly = 0) { presenter.mapInteractionDelegate.dispatch(any()) }\n  }\n\n  @Test\n  fun verifyMoveListenerPinchScrollEnabled() {\n    presenter.pinchScrollEnabled = true\n    val listener = setupMoveListener()\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      0.0,\n      0.0\n    )\n    every {\n      mapCameraManagerDelegate.cameraForDrag(\n        any(),\n        any()\n      )\n    } returns CameraOptions.Builder().center(Point.fromLngLat(0.0, 0.0)).build()\n    val moveGestureDetector = mockk<MoveGestureDetector>()\n    every { moveGestureDetector.focalPoint } returns PointF(0.0f, 0.0f)\n    every { moveGestureDetector.isInProgress } returns false\n    presenter.moveGestureListener.detector = moveGestureDetector\n    every { moveGestureDetector.pointersCount } returns 3\n    presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    every { moveGestureDetector.pointersCount } returns 2\n    presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    val mapAnimationOptionsSlot = slot<MapAnimationOptions>()\n    verify(exactly = 1) {\n      cameraAnimationsPlugin.easeTo(any(), capture(mapAnimationOptionsSlot))\n    }\n    every { moveGestureDetector.pointersCount } returns 1\n    presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    verify(exactly = 2) { listener.onMove(any()) }\n    verify(exactly = 2) {\n      mapCameraManagerDelegate.cameraForDrag(\n        ScreenCoordinate(0.0, 0.0),\n        ScreenCoordinate(-50.0, -50.0)\n      )\n    }\n    verify(exactly = 2) { cameraAnimationsPlugin.easeTo(any(), any(), any()) }\n    verify(exactly = 2) { mapCameraManagerDelegate.getCenterAltitudeMode() }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA) }\n\n    presenter.onTouchEvent(obtainMotionEventAction(ACTION_UP))\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(mapCenterAltitudeMode) }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(false) }\n  }\n\n  @Test\n  fun verifyMoveEndListener() {\n    val listener = setupMoveListener()\n    presenter.moveGestureListener.onMoveEnd(moveGestureDetector, 0f, 0f)\n    verify(exactly = 1) { listener.onMoveEnd(any()) }\n  }\n\n  @Test\n  fun verifyPinchToZoomDisabled() {\n    presenter.pinchToZoomEnabled = false\n\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.pointersCount } returns 2\n    every { scaleDetector.currentSpan } returns 100.0f\n    every { scaleDetector.previousSpan } returns 80.0f\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 1.0\n\n    val listener = setupScaleListener()\n    val result = presenter.handleScaleBegin(scaleDetector)\n    assertFalse(result)\n    verify(exactly = 0) { listener.onScaleBegin(any()) }\n  }\n\n  @Test\n  fun verifyScaleBegin() {\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.pointersCount } returns 2\n    every { scaleDetector.currentSpan } returns 80.0f\n    every { scaleDetector.previousSpan } returns 5000.0f\n    every { rotateGestureDetector.deltaSinceLast } returns 50.0f\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      1.0,\n      0.0,\n      0.0\n    )\n    every { scaleGestureDetector.isInProgress } returns true\n    every { moveGestureDetector.isInProgress } returns false\n    every { rotateGestureDetector.isInProgress } returns false\n    every { scaleDetector.previousEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    every { scaleDetector.currentEvent } returns obtainMotionEventActionLater(ACTION_MOVE)\n    val listener = setupScaleListener()\n    setupRotateListener()\n    val result = presenter.handleScaleBegin(scaleDetector)\n    assert(result)\n    verify(exactly = 1) { listener.onScaleBegin(any()) }\n    presenter.removeOnScaleListener(listener)\n    presenter.handleScaleBegin(scaleDetector)\n    verify(exactly = 1) { listener.onScaleBegin(any()) }\n  }\n\n  @Test\n  fun verifySimultaneousRotateAndPinchToZoomDisabled() {\n    // Override creation of default GesturesPluginImpl to apply custom GesturesSettings\n    every {\n      GesturesAttributeParser.parseGesturesSettings(\n        context,\n        attrs\n      )\n    } returns GesturesSettings { simultaneousRotateAndPinchToZoomEnabled = false }\n\n    presenter = GesturesPluginImpl(context, attrs, style)\n    presenter.bind(context, gesturesManager, attrs, 1f)\n    presenter.onDelegateProvider(mapDelegateProvider)\n\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.pointersCount } returns 2\n    every { scaleDetector.currentSpan } returns 80.0f\n    every { scaleDetector.previousSpan } returns 5000.0f\n\n    every { scaleGestureDetector.isInProgress } returns true\n    every { moveGestureDetector.isInProgress } returns false\n    every { rotateGestureDetector.isInProgress } returns false\n    every { rotateGestureDetector.deltaSinceStart } returns 0.0f\n    every { rotateGestureDetector.deltaSinceLast } returns 0.0f\n    every { rotateGestureDetector.isEnabled } returns true\n    every { scaleDetector.previousEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    every { scaleDetector.currentEvent } returns obtainMotionEventActionLater(ACTION_MOVE)\n\n    presenter.handleScaleBegin(scaleDetector)\n    verify(exactly = 1) { rotateGestureDetector.setEnabled(false) }\n  }\n\n  @Test\n  fun verifySimultaneousRotateAndPinchToZoomEnabled() {\n    // Override creation of default GesturesPluginImpl to apply custom GesturesSettings\n    every {\n      GesturesAttributeParser.parseGesturesSettings(\n        context,\n        attrs\n      )\n    } returns GesturesSettings { simultaneousRotateAndPinchToZoomEnabled = true }\n\n    presenter = GesturesPluginImpl(context, attrs, style)\n    presenter.bind(context, gesturesManager, attrs, 1f)\n    presenter.onDelegateProvider(mapDelegateProvider)\n\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.pointersCount } returns 2\n    every { scaleDetector.currentSpan } returns 80.0f\n    every { scaleDetector.previousSpan } returns 5000.0f\n\n    every { scaleGestureDetector.isInProgress } returns true\n    every { moveGestureDetector.isInProgress } returns false\n    every { rotateGestureDetector.isInProgress } returns false\n    every { rotateGestureDetector.deltaSinceStart } returns 0.0f\n    every { rotateGestureDetector.deltaSinceLast } returns 0.0f\n    every { scaleDetector.previousEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    every { scaleDetector.currentEvent } returns obtainMotionEventActionLater(ACTION_MOVE)\n\n    presenter.handleScaleBegin(scaleDetector)\n    verify(exactly = 0) { rotateGestureDetector.setEnabled(any()) }\n  }\n\n  @Test\n  fun verifyScaleBeginIgnoreSpeed() {\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.pointersCount } returns 2\n    every { scaleDetector.currentSpan } returns 80.0f\n    every { scaleDetector.previousSpan } returns 5000.0f\n    every { rotateGestureDetector.deltaSinceLast } returns 50.0f\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 1.0\n    every { scaleGestureDetector.isInProgress } returns true\n    every { moveGestureDetector.isInProgress } returns false\n    every { rotateGestureDetector.isInProgress } returns false\n    every { scaleDetector.currentEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    every { scaleDetector.previousEvent } returns obtainMotionEventActionLater(ACTION_MOVE)\n    setupScaleListener()\n    val result = presenter.handleScaleBegin(scaleDetector)\n    assertFalse(result)\n  }\n\n  @Test\n  fun verifyScaleBeginIgnoreSameTime() {\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.pointersCount } returns 2\n    every { scaleDetector.currentSpan } returns 80.0f\n    every { scaleDetector.previousSpan } returns 5000.0f\n    every { rotateGestureDetector.deltaSinceLast } returns 50.0f\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 1.0\n    every { scaleGestureDetector.isInProgress } returns true\n    every { moveGestureDetector.isInProgress } returns false\n    every { rotateGestureDetector.isInProgress } returns false\n    every { scaleDetector.currentEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    every { scaleDetector.previousEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    setupScaleListener()\n    val result = presenter.handleScaleBegin(scaleDetector)\n    assertFalse(result)\n  }\n\n  @Test\n  fun verifyScaleWithSimultaneousRotateAndPinchToZoomDisabled() {\n    presenter.updateSettings { simultaneousRotateAndPinchToZoomEnabled = false }\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      1.0,\n      0.0,\n      0.0\n    )\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.currentSpan } returns 100.0f\n    every { scaleDetector.previousSpan } returns 80.0f\n    every { scaleDetector.focalPoint } returns PointF(1.0f, 1.0f)\n    every { scaleDetector.scaleFactor } returns 2.0f\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 1.0\n\n    setupScaleListener()\n    val result = presenter.handleScale(scaleDetector)\n    assert(result)\n    // setMoveDetectorEnabled\n    verify(exactly = 1) { cameraAnimationsPlugin.easeTo(any(), any(), any()) }\n    verify(exactly = 2) { mapCameraManagerDelegate.getCenterAltitudeMode() }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA) }\n\n    presenter.onTouchEvent(obtainMotionEventAction(ACTION_UP))\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(mapCenterAltitudeMode) }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(false) }\n  }\n\n  @Test\n  fun verifyScaleWithSimultaneousRotateAndPinchToZoomEnabled() {\n    val zoomAnimator = mockk<ValueAnimator>(relaxUnitFun = true)\n    every { cameraAnimationsPlugin.createZoomAnimator(any(), any()) } returns zoomAnimator\n\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      1.0,\n      0.0,\n      0.0\n    )\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.currentSpan } returns 100.0f\n    every { scaleDetector.previousSpan } returns 80.0f\n    every { scaleDetector.focalPoint } returns PointF(1.0f, 1.0f)\n    every { scaleDetector.scaleFactor } returns 2.0f\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 1.0\n\n    val listener = setupScaleListener()\n    val result = presenter.handleScale(scaleDetector)\n    assert(result)\n    verify(exactly = 1) { cameraAnimationsPlugin.playAnimatorsTogether(any(), zoomAnimator) }\n    verify(exactly = 1) { listener.onScale(any()) }\n    verify(exactly = 2) { mapCameraManagerDelegate.getCenterAltitudeMode() }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA) }\n\n    presenter.onTouchEvent(obtainMotionEventAction(ACTION_UP))\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(mapCenterAltitudeMode) }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(false) }\n  }\n\n  @Test\n  fun verifyScaleQuickZoom() {\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.pointersCount } returns 1\n    every { moveGestureDetector.isInProgress } returns false\n    every { rotateGestureDetector.isInProgress } returns false\n    every { shoveGestureDetector.isInProgress } returns false\n    every { scaleGestureDetector.isInProgress } returns false\n    every { scaleDetector.currentSpan } returns 100.0f\n    every { scaleDetector.previousSpan } returns 80.0f\n    every { scaleDetector.currentEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      1.0,\n      0.0,\n      0.0\n    )\n    setupMoveListener()\n    presenter.handleScaleBegin(scaleDetector)\n\n    every { scaleDetector.currentSpan } returns 100.0f\n    every { scaleDetector.previousSpan } returns 80.0f\n    every { scaleDetector.focalPoint } returns PointF(1.0f, 1.0f)\n    every { scaleDetector.scaleFactor } returns 2.0f\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 1.0\n\n    setupScaleListener()\n    val result = presenter.handleScale(scaleDetector)\n    assert(result)\n    // setMoveDetectorEnabled\n    verify(exactly = 1) { cameraAnimationsPlugin.easeTo(any(), any(), any()) }\n    verify(exactly = 2) { mapCameraManagerDelegate.getCenterAltitudeMode() }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA) }\n\n    presenter.onTouchEvent(obtainMotionEventAction(ACTION_UP))\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(mapCenterAltitudeMode) }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(false) }\n  }\n\n  @Test\n  fun verifyScaleEnd() {\n    val scaleDetector = mockk<StandardScaleGestureDetector>()\n    every { scaleDetector.isScalingOut } returns true\n    every { scaleDetector.currentSpan } returns 100.0f\n    every { scaleDetector.previousSpan } returns 80.0f\n    every { scaleDetector.focalPoint } returns PointF(1.0f, 1.0f)\n    every { scaleDetector.scaleFactor } returns 2.0f\n    every { mapCameraManagerDelegate.cameraState.zoom } returns 1.0\n\n    setupScaleListener()\n    presenter.handleScaleEnd(scaleDetector, 15.0f, 15.0f)\n    // todo animator testing\n  }\n\n  @Test\n  fun verifyRotateDisabled() {\n    presenter.rotateEnabled = false\n    val listener = setupRotateListener()\n    val rotateGestureDetector = mockk<RotateGestureDetector>(relaxUnitFun = true)\n    every { rotateGestureDetector.deltaSinceLast } returns 500.0f\n    every { rotateGestureDetector.deltaSinceStart } returns 10000.0f\n    // every { rotateGestureDetector.cursetMoveDetectorEnabledrentEvent } returns obtainMotionEventActionLater(MotionEvent.ACTION_MOVE)\n    every { rotateGestureDetector.previousEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    val result = presenter.handleRotateBegin(rotateGestureDetector)\n    assertFalse(result)\n    verify(exactly = 0) { listener.onRotateBegin(any()) }\n  }\n\n  @Test\n  fun verifyRotateDisabledByThresholdIfScaleInProgress() {\n    val rotateGestureDetector = mockk<RotateGestureDetector>(relaxUnitFun = true)\n    every { scaleGestureDetector.isInProgress } returns true\n\n    every { rotateGestureDetector.deltaSinceLast } returns 150.5f\n    every { rotateGestureDetector.deltaSinceStart } returns 15.5f\n    every { rotateGestureDetector.currentEvent } returns obtainMotionEventActionLater(ACTION_MOVE)\n    every { rotateGestureDetector.previousEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    val result = presenter.handleRotateBegin(rotateGestureDetector)\n    assertFalse(result)\n  }\n\n  @Test\n  fun verifyRotateIgnoreSameTime() {\n    val listener = setupRotateListener()\n    val rotateGestureDetector = mockk<RotateGestureDetector>(relaxUnitFun = true)\n    every { rotateGestureDetector.deltaSinceLast } returns 500.0f\n    every { rotateGestureDetector.deltaSinceStart } returns 10000.0f\n    every { rotateGestureDetector.currentEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    every { rotateGestureDetector.previousEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    val result = presenter.handleRotateBegin(rotateGestureDetector)\n    assertFalse(result)\n    verify(exactly = 0) { listener.onRotateBegin(any()) }\n  }\n\n  @Test\n  fun verifyRotateIgnoreTooSlow() {\n    val listener = setupRotateListener()\n    val rotateGestureDetector = mockk<RotateGestureDetector>(relaxUnitFun = true)\n    every { rotateGestureDetector.deltaSinceLast } returns 0.0f\n    every { rotateGestureDetector.deltaSinceStart } returns 0.0f\n    every { rotateGestureDetector.currentEvent } returns obtainMotionEventActionLater(ACTION_MOVE)\n    every { rotateGestureDetector.previousEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    val result = presenter.handleRotateBegin(rotateGestureDetector)\n    assertFalse(result)\n    verify(exactly = 0) { listener.onRotateBegin(any()) }\n  }\n\n  @Test\n  fun verifyRotateBegin() {\n    val listener = setupRotateListener()\n    every { rotateGestureDetector.deltaSinceLast } returns 500.0f\n    every { rotateGestureDetector.deltaSinceStart } returns 10000.0f\n    every { rotateGestureDetector.currentEvent } returns obtainMotionEventActionLater(ACTION_MOVE)\n    every { rotateGestureDetector.previousEvent } returns obtainMotionEventAction(ACTION_MOVE)\n    every { rotateGestureDetector.isInProgress } returns true\n    every { moveGestureDetector.isInProgress } returns false\n    every { moveGestureDetector.isInProgress } returns false\n    every { scaleGestureDetector.isInProgress } returns false\n    val result = presenter.handleRotateBegin(rotateGestureDetector)\n    assert(result)\n    verify(exactly = 1) { listener.onRotateBegin(any()) }\n    presenter.removeOnRotateListener(listener)\n    presenter.handleRotateBegin(rotateGestureDetector)\n    verify(exactly = 1) { listener.onRotateBegin(any()) }\n  }\n\n  @Test\n  fun verifyRotateWithSimultaneousRotateAndPinchToZoomDisabled() {\n    presenter.updateSettings { simultaneousRotateAndPinchToZoomEnabled = false }\n    val rotateGestureDetector = mockk<RotateGestureDetector>()\n    setupRotateListener()\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      1.0,\n      0.0\n    )\n    every { rotateGestureDetector.focalPoint } returns PointF(0.0f, 0.0f)\n    val result = presenter.handleRotate(rotateGestureDetector, 34.0f)\n    assert(result)\n    verify(exactly = 1) { cameraAnimationsPlugin.easeTo(any(), any(), any()) }\n\n    verify(exactly = 2) { mapCameraManagerDelegate.getCenterAltitudeMode() }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA) }\n\n    presenter.onTouchEvent(obtainMotionEventAction(ACTION_UP))\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(mapCenterAltitudeMode) }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(false) }\n  }\n\n  @Test\n  fun verifyRotateWithSimultaneousRotateAndPinchToZoomEnabled() {\n    val bearingAnimator = mockk<ValueAnimator>(relaxUnitFun = true)\n    every {\n      cameraAnimationsPlugin.createBearingAnimator(\n        any(),\n        any(),\n        any()\n      )\n    } returns bearingAnimator\n\n    val rotateGestureDetector = mockk<RotateGestureDetector>()\n    every { rotateGestureDetector.focalPoint } returns PointF(1.0f, 1.0f)\n    val listener = setupRotateListener()\n    val result = presenter.handleRotate(rotateGestureDetector, 34.0f)\n    assert(result)\n    verify(exactly = 1) { cameraAnimationsPlugin.playAnimatorsTogether(any(), bearingAnimator) }\n    verify(exactly = 1) { listener.onRotate(any()) }\n\n    verify(exactly = 2) { mapCameraManagerDelegate.getCenterAltitudeMode() }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA) }\n\n    presenter.onTouchEvent(obtainMotionEventAction(ACTION_UP))\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(mapCenterAltitudeMode) }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(false) }\n  }\n\n  @Test\n  fun verifyRotateEnd() {\n    val rotateGestureDetector = mockk<RotateGestureDetector>()\n    every { rotateGestureDetector.focalPoint } returns PointF(0.0f, 0.0f)\n    every { rotateGestureDetector.deltaSinceLast } returns 500.0f\n    every { mapCameraManagerDelegate.cameraState.bearing } returns 0.0\n    every { rotateGestureDetector.isInProgress } returns true\n    every { scaleGestureDetector.isInProgress } returns false\n    setupRotateListener()\n    presenter.handleRotateEnd(rotateGestureDetector, 15.0f, 15.0f, 15.0f)\n    // todo animator testing\n  }\n\n  @Test\n  fun verifyShoveDisabled() {\n    presenter.pitchEnabled = false\n\n    val listener = setupShoveListener()\n    val gestureDetector = mockk<ShoveGestureDetector>(relaxUnitFun = true)\n    val result = presenter.handleShoveBegin(gestureDetector)\n    assertFalse(result)\n    verify(exactly = 0) { listener.onShoveBegin(any()) }\n  }\n\n  @Test\n  fun verifyShoveBegin() {\n    val shoveListener = setupShoveListener()\n    val gestureDetector = mockk<ShoveGestureDetector>(relaxUnitFun = true)\n    val moveListener = setupMoveListener()\n    every { moveGestureDetector.isInProgress } returns true\n    val result = presenter.handleShoveBegin(gestureDetector)\n    assert(result)\n    verify(exactly = 1) { shoveListener.onShoveBegin(any()) }\n    presenter.removeOnShoveListener(shoveListener)\n    presenter.removeOnMoveListener(moveListener)\n    presenter.handleShoveBegin(gestureDetector)\n    verify(exactly = 1) { shoveListener.onShoveBegin(any()) }\n  }\n\n  @Test\n  fun verifyShove() {\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      0.0,\n      1.0\n    )\n    val cameraCenterScreenCoordinate = ScreenCoordinate(\n      10.0,\n      10.0\n    )\n    every { mapCameraManagerDelegate.pixelForCoordinate(any()) } returns cameraCenterScreenCoordinate\n    setupShoveListener()\n    val gestureDetector = mockk<ShoveGestureDetector>(relaxUnitFun = true)\n    val result = presenter.handleShove(gestureDetector, -15.0f)\n    val resultCameraOptions = slot<CameraOptions>()\n    assert(result)\n    verify(exactly = 1) {\n      cameraAnimationsPlugin.easeTo(\n        capture(resultCameraOptions),\n        any(),\n      )\n    }\n    assertEquals(resultCameraOptions.captured.pitch!!, 2.5, EPS)\n    assertEquals(resultCameraOptions.captured.anchor, cameraCenterScreenCoordinate)\n\n    verify(exactly = 2) { mapCameraManagerDelegate.getCenterAltitudeMode() }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA) }\n\n    presenter.onTouchEvent(obtainMotionEventAction(ACTION_UP))\n    verify(exactly = 1) { mapCameraManagerDelegate.setCenterAltitudeMode(mapCenterAltitudeMode) }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(false) }\n  }\n\n  @Test\n  fun verifyMapCenterAltitudeModeIsSEABeforeGesture() {\n    every { mapCameraManagerDelegate.getCenterAltitudeMode() } returns MapCenterAltitudeMode.SEA\n    val moveGestureDetector = mockk<MoveGestureDetector>()\n    every {\n      moveGestureDetector.focalPoint\n    } returns PointF(0.0f, 0.0f)\n\n    every { moveGestureDetector.pointersCount } returns 1\n    presenter.moveGestureListener.detector = moveGestureDetector\n    presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    verify(exactly = 2) { mapCameraManagerDelegate.getCenterAltitudeMode() }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(true) }\n    verify(exactly = 0) { mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA) }\n\n    presenter.onTouchEvent(obtainMotionEventAction(ACTION_UP))\n    verify(exactly = 0) { mapCameraManagerDelegate.setCenterAltitudeMode(mapCenterAltitudeMode) }\n    verify(exactly = 1) { mapTransformDelegate.setGestureInProgress(false) }\n  }\n\n  @Test\n  fun verifyShoveEnd() {\n    every { mapCameraManagerDelegate.cameraState.pitch } returns 5.0\n    val listener = setupShoveListener()\n    val gestureDetector = mockk<ShoveGestureDetector>(relaxUnitFun = true)\n    presenter.handleShoveEnd(gestureDetector)\n    verify(exactly = 1) { listener.onShoveEnd(any()) }\n  }\n\n  @Test\n  fun verifyCustomGestureManager() {\n    val customManager = mockk<AndroidGesturesManager>(relaxed = true)\n    presenter.setGesturesManager(\n      customManager,\n      attachDefaultListeners = false,\n      setDefaultMutuallyExclusives = false\n    )\n    assertEquals(customManager, presenter.getGesturesManager())\n  }\n\n  @Test\n  fun verifyAddProtectedAnimationOwner() {\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      1.0,\n      0.0,\n      0.0\n    )\n    every { cameraAnimationsPlugin.calculateScaleBy(any(), any()) } returns 2.0\n    presenter.addProtectedAnimationOwner(\"Owner\")\n    assert(presenter.onGenericMotionEvent(obtainMotionEventButton(BUTTON_SECONDARY)))\n    verify(exactly = 1) { cameraAnimationsPlugin.cancelAllAnimators(listOf(\"Owner\")) }\n  }\n\n  @Test\n  fun verifyRemoveProtectedAnimationOwner() {\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      1.0,\n      0.0,\n      0.0\n    )\n    every { cameraAnimationsPlugin.calculateScaleBy(any(), any()) } returns 2.0\n    presenter.addProtectedAnimationOwner(\"OwnerOne\")\n    presenter.addProtectedAnimationOwner(\"OwnerTwo\")\n    presenter.removeProtectedAnimationOwner(\"OwnerOne\")\n    assert(presenter.onGenericMotionEvent(obtainMotionEventButton(BUTTON_SECONDARY)))\n    verify(exactly = 1) { cameraAnimationsPlugin.cancelAllAnimators(listOf(\"OwnerTwo\")) }\n    presenter.removeProtectedAnimationOwner(\"OwnerTwo\")\n    assert(presenter.onGenericMotionEvent(obtainMotionEventButton(BUTTON_SECONDARY)))\n    verify(exactly = 1) { cameraAnimationsPlugin.cancelAllAnimators() }\n  }\n\n  @Test\n  fun verifyDefaultShoveGestureAngle() {\n    verify(exactly = 1) {\n      gesturesManager.shoveGestureDetector.maxShoveAngle = MAX_SHOVE_ANGLE\n    }\n  }\n\n  @Test\n  fun verifyDefaultRotationAngleThreshold() {\n    verify(exactly = 1) {\n      gesturesManager.rotateGestureDetector.angleThreshold = ROTATION_ANGLE_THRESHOLD\n    }\n  }\n\n  @Test\n  fun testIsPointAboveHorizonNanX() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n\n    assertEquals(false, presenter.isPointAboveHorizon(ScreenCoordinate(Double.NaN, 10.0)))\n    verify {\n      mapCameraManagerDelegate.coordinateForPixel(ScreenCoordinate(0.0, 6.0))\n    }\n    verify {\n      logE(any(), \"isPointAboveHorizon: screen coordinate x is NaN.\")\n    }\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun testIsPointAboveHorizonNanY() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n\n    assertEquals(false, presenter.isPointAboveHorizon(ScreenCoordinate(0.0, Double.NaN)))\n    verify {\n      mapCameraManagerDelegate.coordinateForPixel(ScreenCoordinate(0.0, -4.0))\n    }\n    verify {\n      logE(any(), \"isPointAboveHorizon: screen coordinate y is NaN.\")\n    }\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  private companion object {\n    const val ROTATION_ANGLE_THRESHOLD = 3.0f\n    const val MAX_SHOVE_ANGLE = 45.0f\n\n    const val EPS = 0.000001\n\n    fun obtainMotionEventButton(buttonType: Int): MotionEvent {\n      return obtain(\n        200,\n        200,\n        MotionEvent.ACTION_SCROLL,\n        1,\n        arrayOf(\n          PointerPropertiesBuilder.newBuilder().setId(0).setToolType(TOOL_TYPE_FINGER).build()\n        ),\n        arrayOf(PointerCoordsBuilder.newBuilder().build()),\n        0,\n        buttonType,\n        0.0f,\n        0.0f,\n        0,\n        0,\n        SOURCE_CLASS_POINTER,\n        0\n      )\n    }\n\n    fun obtainMotionEventAction(action: Int): MotionEvent {\n      return obtain(200, 300, action, 15.0f, 10.0f, 0)\n    }\n\n    fun obtainMotionEventActionDistant(action: Int): MotionEvent {\n      return obtain(200, 300, action, 500.0f, 500.0f, 0)\n    }\n\n    fun obtainMotionEventActionLater(action: Int): MotionEvent {\n      return obtain(200, 500, action, 15.0f, 10.0f, 0)\n    }\n  }\n}\n\n@RunWith(ParameterizedRobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass IsPointAboveHorizonTest(\n  private val testProjectionStylePropertyValue: StylePropertyValue,\n  private val testScreenCoordinate: ScreenCoordinate,\n  private val testMapSize: Size,\n  private val testPixelForCoordinate: ScreenCoordinate,\n  private val expectedResult: Boolean\n) {\n  private val context: Context = mockk(relaxed = true)\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n  private val mapDelegateProvider: MapDelegateProvider = mockk(relaxUnitFun = true)\n  private val gesturesManager: AndroidGesturesManager = mockk(relaxed = true)\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate = mockk(relaxUnitFun = true)\n  private val mapTransformDelegate: MapTransformDelegate = mockk(relaxUnitFun = true)\n  private val mapPluginProviderDelegate: MapPluginProviderDelegate = mockk(relaxUnitFun = true)\n  private val mapProjectionDelegate: MapProjectionDelegate = mockk(relaxUnitFun = true)\n  @OptIn(MapboxExperimental::class)\n  private val mapInteractionDelegate: MapInteractionDelegate = mockk()\n  private val cameraAnimationsPlugin: CameraAnimationsPlugin = mockk(relaxed = true)\n  private val style: MapboxStyleManager = mockk()\n\n  private lateinit var presenter: GesturesPluginImpl\n\n  private val typedArray: TypedArray = mockk(relaxed = true)\n  private val pack = \"com.mapbox.maps\"\n\n  @MapboxExperimental\n  @Before\n  fun prepare() {\n    mockkObject(GesturesAttributeParser)\n    every {\n      GesturesAttributeParser.parseGesturesSettings(\n        context,\n        attrs\n      )\n    } returns GesturesSettings { }\n\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { context.packageName } returns pack\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getInt(any(), any()) } returns 2\n    every { typedArray.hasValue(any()) } returns true\n\n    presenter = GesturesPluginImpl(context, attrs, style)\n    presenter.bind(\n      context,\n      gesturesManager,\n      attrs,\n      1f\n    )\n\n    every { mapDelegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { mapDelegateProvider.mapTransformDelegate } returns mapTransformDelegate\n    every { mapDelegateProvider.mapProjectionDelegate } returns mapProjectionDelegate\n    every { mapDelegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    every { mapDelegateProvider.mapInteractionDelegate } returns mapInteractionDelegate\n    every { mapInteractionDelegate.addInteraction(any()) } returns Cancelable { }\n    every { mapInteractionDelegate.dispatch(any()) } answers {\n      val platformEventInfo = firstArg<PlatformEventInfo>()\n      when (platformEventInfo.type) {\n        PlatformEventType.DRAG -> presenter.handleMove(platformEventInfo.screenCoordinate)\n        else -> throw RuntimeException(\"Not needed in this test\")\n      }\n    }\n    every { mapPluginProviderDelegate.getPlugin<CameraAnimationsPlugin>(Plugin.MAPBOX_CAMERA_PLUGIN_ID) } returns cameraAnimationsPlugin\n    every { style.getStyleProjectionProperty(\"name\") } returns testProjectionStylePropertyValue\n    every { mapTransformDelegate.getSize() } returns testMapSize\n    every { mapCameraManagerDelegate.coordinateForPixel(any()) } returns Point.fromLngLat(0.0, 0.0)\n    every { mapCameraManagerDelegate.pixelForCoordinate(any()) } returns testPixelForCoordinate\n    every { mapCameraManagerDelegate.getCenterAltitudeMode() } returns MapCenterAltitudeMode.TERRAIN\n\n    presenter.onDelegateProvider(mapDelegateProvider)\n    presenter.initialize()\n  }\n\n  @Test\n  fun testIsPointAboveHorizon() {\n    assertEquals(expectedResult, presenter.isPointAboveHorizon(testScreenCoordinate))\n  }\n\n  @Test\n  fun testMoveEvent() {\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      0.0,\n      0.0\n    )\n    every {\n      mapCameraManagerDelegate.cameraForDrag(\n        any(),\n        any()\n      )\n    } returns CameraOptions.Builder().center(Point.fromLngLat(0.0, 0.0)).build()\n\n    val moveGestureDetector = mockk<MoveGestureDetector>()\n    every {\n      moveGestureDetector.focalPoint\n    } returns PointF(testScreenCoordinate.x.toFloat(), testScreenCoordinate.y.toFloat())\n    every { moveGestureDetector.pointersCount } returns 1\n    presenter.moveGestureListener.detector = moveGestureDetector\n    presenter.moveGestureListener.onMove(moveGestureDetector, 50.0f, 50.0f)\n    verify(exactly = if (expectedResult) 0 else 1) {\n      cameraAnimationsPlugin.easeTo(any(), any(), any())\n    }\n  }\n\n  @Test\n  fun testFlingEvent() {\n    val motionEvent1 = mockk<MotionEvent>()\n    val motionEvent2 = mockk<MotionEvent>()\n    every { motionEvent1.x } returns testScreenCoordinate.x.toFloat()\n    every { motionEvent1.y } returns testScreenCoordinate.y.toFloat()\n    every { motionEvent2.x } returns testScreenCoordinate.x.toFloat()\n    every { motionEvent2.y } returns testScreenCoordinate.y.toFloat()\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      0.0,\n      0.0\n    )\n    every {\n      mapCameraManagerDelegate.cameraForDrag(\n        any(),\n        any()\n      )\n    } returns CameraOptions.Builder().center(Point.fromLngLat(0.0, 0.0)).build()\n\n    val listener: OnFlingListener = mockk(relaxed = true)\n    presenter.addOnFlingListener(listener)\n    presenter.handleFlingEvent(motionEvent2, 1000.0f, 1000.0f)\n    verify(exactly = if (expectedResult) 0 else 1) { listener.onFling() }\n    verify(exactly = if (expectedResult) 0 else 1) {\n      cameraAnimationsPlugin.easeTo(\n        any(),\n        any(),\n        any()\n      )\n    }\n  }\n\n  @After\n  fun cleanup() {\n    unmockkAll()\n  }\n\n  private companion object {\n    @JvmStatic\n    @ParameterizedRobolectricTestRunner.Parameters(name = \"IsPointAboveHorizon using {0} projection at {1}, with MapSize {2}, testPixelForCoordinate {3} should be {4}\")\n    fun data() = listOf(\n      arrayOf(\n        StylePropertyValue(\n          Value.valueOf(\"globe\"),\n          StylePropertyValueKind.CONSTANT\n        ),\n        ScreenCoordinate(0.0, 0.0),\n        Size(100f, 100f),\n        ScreenCoordinate(0.0, 0.0),\n        false\n      ),\n      arrayOf(\n        StylePropertyValue(\n          Value.valueOf(\"mercator\"),\n          StylePropertyValueKind.CONSTANT\n        ),\n        ScreenCoordinate(0.0, 0.0),\n        Size(100f, 100f),\n        ScreenCoordinate(0.0, 0.0),\n        true\n      ),\n      arrayOf(\n        StylePropertyValue(\n          Value.valueOf(\"any\"),\n          StylePropertyValueKind.UNDEFINED\n        ),\n        ScreenCoordinate(0.0, 0.0),\n        Size(100f, 100f),\n        ScreenCoordinate(0.0, 0.0),\n        true\n      ),\n      arrayOf(\n        StylePropertyValue(\n          Value.valueOf(\"mercator\"),\n          StylePropertyValueKind.CONSTANT\n        ),\n        ScreenCoordinate(0.0, 2.0),\n        Size(100f, 100f),\n        ScreenCoordinate(0.0, 0.0),\n        true\n      ),\n      arrayOf(\n        StylePropertyValue(\n          Value.valueOf(\"mercator\"),\n          StylePropertyValueKind.CONSTANT\n        ),\n        ScreenCoordinate(0.0, 3.0),\n        Size(100f, 100f),\n        ScreenCoordinate(0.0, 0.0),\n        false\n      ),\n      arrayOf(\n        StylePropertyValue(\n          Value.valueOf(\"mercator\"),\n          StylePropertyValueKind.CONSTANT\n        ),\n        ScreenCoordinate(0.0, 10.0),\n        Size(500f, 500f),\n        ScreenCoordinate(0.0, 0.0),\n        true\n      ),\n      arrayOf(\n        StylePropertyValue(\n          Value.valueOf(\"mercator\"),\n          StylePropertyValueKind.CONSTANT\n        ),\n        ScreenCoordinate(0.0, 11.0),\n        Size(500f, 500f),\n        ScreenCoordinate(0.0, 0.0),\n        false\n      ),\n      arrayOf(\n        StylePropertyValue(\n          Value.valueOf(\"mercator\"),\n          StylePropertyValueKind.CONSTANT\n        ),\n        ScreenCoordinate(0.0, 10.0),\n        Size(1000f, 1000f),\n        ScreenCoordinate(0.0, 0.0),\n        true\n      ),\n      arrayOf(\n        StylePropertyValue(\n          Value.valueOf(\"mercator\"),\n          StylePropertyValueKind.CONSTANT\n        ),\n        ScreenCoordinate(0.0, 11.0),\n        Size(500f, 500f),\n        ScreenCoordinate(0.0, 0.0),\n        false\n      ),\n    )\n  }\n}\n\n@RunWith(ParameterizedRobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass FlingGestureTest(\n  private val targetPitch: Double,\n  private val targetScrollMode: ScrollMode,\n  private val targetVelocity: Pair<Float, Float>,\n  private val expectedCoordinate: ScreenCoordinate,\n  private val expectedFlingDuration: Long\n) {\n  private val context: Context = mockk(relaxed = true)\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n  private val mapDelegateProvider: MapDelegateProvider = mockk(relaxUnitFun = true)\n  private val gesturesManager: AndroidGesturesManager = mockk(relaxed = true)\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate = mockk(relaxUnitFun = true)\n  private val mapTransformDelegate: MapTransformDelegate = mockk(relaxUnitFun = true)\n  private val mapPluginProviderDelegate: MapPluginProviderDelegate = mockk(relaxUnitFun = true)\n  private val mapProjectionDelegate: MapProjectionDelegate = mockk(relaxUnitFun = true)\n  private val cameraAnimationsPlugin: CameraAnimationsPlugin = mockk(relaxed = true)\n\n  private lateinit var presenter: GesturesPluginImpl\n\n  private val typedArray: TypedArray = mockk(relaxed = true)\n  private val pack = \"com.mapbox.maps\"\n\n  private val motionEvent1 = mockk<MotionEvent>()\n  private val motionEvent2 = mockk<MotionEvent>()\n  private val mapAnimationOptionsSlot = slot<MapAnimationOptions>()\n\n  @MapboxExperimental\n  @Before\n  fun prepare() {\n    mockkObject(GesturesAttributeParser)\n    every {\n      GesturesAttributeParser.parseGesturesSettings(\n        context,\n        attrs\n      )\n    } returns GesturesSettings { }\n\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { context.packageName } returns pack\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getInt(any(), any()) } returns 2\n    every { typedArray.hasValue(any()) } returns true\n\n    every { mapDelegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { mapDelegateProvider.mapTransformDelegate } returns mapTransformDelegate\n    every { mapDelegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    every { mapDelegateProvider.mapProjectionDelegate } returns mapProjectionDelegate\n    every { mapDelegateProvider.mapInteractionDelegate } returns mockk(relaxed = true)\n    every { mapPluginProviderDelegate.getPlugin<CameraAnimationsPlugin>(Plugin.MAPBOX_CAMERA_PLUGIN_ID) } returns cameraAnimationsPlugin\n    every { mapTransformDelegate.getSize() } returns Size(100.0f, 100.0f)\n    every { mapCameraManagerDelegate.coordinateForPixel(any()) } returns Point.fromLngLat(1.0, 1.0)\n    // Make sure isPointAboveHorizon return false\n    every { mapCameraManagerDelegate.pixelForCoordinate(any()) } returns ScreenCoordinate(\n      0.0,\n      -10.0\n    )\n    every { mapCameraManagerDelegate.getCenterAltitudeMode() } returns MapCenterAltitudeMode.TERRAIN\n    val style = mockk<MapboxStyleManager>()\n    every { style.getStyleProjectionProperty(\"name\") } returns StylePropertyValue(\n      Value.valueOf(\"mercator\"),\n      StylePropertyValueKind.CONSTANT\n    )\n\n    presenter = GesturesPluginImpl(context, attrs, style)\n\n    presenter.bind(context, gesturesManager, attrs, 1f)\n    presenter.onDelegateProvider(mapDelegateProvider)\n    presenter.initialize()\n\n    every { mapCameraManagerDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      0.0,\n      targetPitch\n    )\n    every {\n      mapCameraManagerDelegate.cameraForDrag(\n        any(),\n        any()\n      )\n    } returns CameraOptions.Builder().build()\n    presenter.updateSettings { scrollMode = targetScrollMode }\n    every { motionEvent1.x } returns 0.0f\n    every { motionEvent1.y } returns 0.0f\n    every { motionEvent2.x } returns 0.0f\n    every { motionEvent2.y } returns 0.0f\n  }\n\n  @Test\n  fun testFling() {\n    val result =\n      presenter.handleFlingEvent(\n        motionEvent2,\n        targetVelocity.first,\n        targetVelocity.second\n      )\n    verify(exactly = 1) {\n      mapCameraManagerDelegate.cameraForDrag(\n        ScreenCoordinate(0.0, 0.0),\n        expectedCoordinate\n      )\n    }\n    verify(exactly = 1) {\n      cameraAnimationsPlugin.easeTo(\n        CameraOptions.Builder().build(),\n        capture(mapAnimationOptionsSlot),\n        any()\n      )\n    }\n    assert(result)\n    assertEquals(MapAnimationOwnerRegistry.GESTURES, mapAnimationOptionsSlot.captured.owner)\n    assertEquals(expectedFlingDuration, mapAnimationOptionsSlot.captured.duration)\n  }\n\n  private companion object {\n    @JvmStatic\n    @ParameterizedRobolectricTestRunner.Parameters(name = \"Fling at pitch {0} with scroll mode {1} and velocity {2} should end at screen coordinate {3} and fling duration should be {4}\")\n    fun data() = listOf(\n      arrayOf(\n        0.0,\n        ScrollMode.HORIZONTAL_AND_VERTICAL,\n        Pair(FLING_VELOCITY, FLING_VELOCITY),\n        ScreenCoordinate(FLING_DISPLACEMENT, FLING_DISPLACEMENT),\n        1414L\n      ),\n      arrayOf(\n        55.0,\n        ScrollMode.HORIZONTAL_AND_VERTICAL,\n        Pair(FLING_VELOCITY, FLING_VELOCITY),\n        ScreenCoordinate(645.1612903225806, 645.1612903225806),\n        912L\n      ),\n      arrayOf(\n        80.0,\n        ScrollMode.HORIZONTAL_AND_VERTICAL,\n        Pair(FLING_VELOCITY, FLING_VELOCITY),\n        ScreenCoordinate(67.93869850933991, 67.93869850933991),\n        96L\n      ),\n      arrayOf(\n        0.0,\n        ScrollMode.HORIZONTAL_AND_VERTICAL,\n        Pair(800f, 750f),\n        ScreenCoordinate(80.0, 75.0),\n        109L\n      ),\n      arrayOf(\n        55.0,\n        ScrollMode.HORIZONTAL_AND_VERTICAL,\n        Pair(800f, 750f),\n        ScreenCoordinate(51.61290322580645, 48.38709677419355),\n        70L\n      ),\n      arrayOf(\n        80.0,\n        ScrollMode.HORIZONTAL_AND_VERTICAL,\n        Pair(800f, 750f),\n        ScreenCoordinate(5.435095880747194, 5.095402388200494),\n        7L\n      ),\n      arrayOf(\n        0.0,\n        ScrollMode.VERTICAL,\n        Pair(FLING_VELOCITY, FLING_VELOCITY),\n        ScreenCoordinate(0.0, FLING_DISPLACEMENT),\n        1414L\n      ),\n      arrayOf(\n        0.0,\n        ScrollMode.HORIZONTAL,\n        Pair(FLING_VELOCITY, FLING_VELOCITY),\n        ScreenCoordinate(FLING_DISPLACEMENT, 0.0),\n        1414L\n      ),\n    )\n\n    const val FLING_DISPLACEMENT = 1000.0\n    const val FLING_VELOCITY = 10000f\n  }\n}"
  },
  {
    "path": "plugin-gestures/src/test/java/com/mapbox/maps/plugin/gestures/StandardGestureListenerTest.java",
    "content": "package com.mapbox.maps.plugin.gestures;\n\nimport static com.mapbox.maps.plugin.Plugin.MAPBOX_CAMERA_PLUGIN_ID;\n\nimport static io.mockk.MockKKt.every;\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin;\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider;\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate;\nimport com.mapbox.maps.plugin.gestures.GesturesPluginImpl.StandardGestureListener;\n\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.RobolectricTestRunner;\nimport org.robolectric.RuntimeEnvironment;\n\nimport io.mockk.MockKAnnotations;\nimport io.mockk.impl.annotations.RelaxedMockK;\n\n@RunWith(RobolectricTestRunner.class)\npublic class StandardGestureListenerTest {\n  @RelaxedMockK\n  MapDelegateProvider delegateProvider;\n  @RelaxedMockK\n  MapPluginProviderDelegate providerDelegate;\n  @RelaxedMockK\n  CameraAnimationsPlugin cameraAnimationsPlugin;\n  GesturesPluginImpl plugin;\n  StandardGestureListener listener;\n\n  @Before\n  public void setup() {\n    MockKAnnotations.INSTANCE.init(new Object[]{this}, true, true, true);\n    every((matcher) -> delegateProvider.getMapPluginProviderDelegate())\n        .returns(providerDelegate);\n    every((matcher) -> providerDelegate.getPlugin(MAPBOX_CAMERA_PLUGIN_ID))\n        .returns(cameraAnimationsPlugin);\n    plugin = new GesturesPluginImpl(RuntimeEnvironment.getApplication(), 1.f);\n    listener = plugin.new StandardGestureListener(1.f);\n    plugin.onDelegateProvider(delegateProvider);\n  }\n\n  @After\n  public void tearDown() {\n    delegateProvider = null;\n    providerDelegate = null;\n    cameraAnimationsPlugin = null;\n    plugin = null;\n    listener = null;\n  }\n\n  @Test\n  public void testOnDown() {\n    listener.onDown(null);\n  }\n\n  @Test\n  public void testOnSingleTapUp() {\n    listener.onSingleTapUp(null);\n  }\n\n  @Test\n  public void testOnSingleTapConfirmed() {\n    listener.onSingleTapConfirmed(null);\n  }\n\n  @Test\n  public void testOnDoubleTap() {\n    listener.onDoubleTap(null);\n  }\n\n  @Test\n  public void testOnShowPress() {\n    listener.onShowPress(null);\n  }\n\n  @Test\n  public void testOnDoubleTapEvent() {\n    listener.onDoubleTapEvent(null);\n  }\n\n  @Test\n  public void testOnLongPress() {\n    listener.onLongPress(null);\n  }\n\n  @Test\n  public void testOnFlingNull() {\n    listener.onFling(null, null, 0.f, 0.f);\n  }\n\n  @Test\n  public void testOnScroll() {\n    listener.onScroll(null, null, 0.f, 0.f);\n  }\n}\n"
  },
  {
    "path": "plugin-gestures/src/test/java/com/mapbox/maps/plugin/gestures/generated/GesturesAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.gestures.generated\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.ScrollMode\nimport io.mockk.Runs\nimport io.mockk.clearAllMocks\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\n\nclass GesturesAttributeParserTest {\n  private val context: Context = mockk(relaxed = true)\n\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n\n  private val typedArray: TypedArray = mockk(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getInt(any(), any()) } returns 0\n    every { typedArray.getColor(any(), any()) } returns Color.RED\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getResourceId(any(), -1) } returns 1\n    every { typedArray.hasValue(any()) } returns true\n    every { typedArray.recycle() } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun testTypedArrayRecycle() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun testTypedArrayRecycleWithException() {\n    every { typedArray.getBoolean(any(), any()) }.throws(Exception(\"\"))\n    try {\n      val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    } catch (e: Exception) {\n      // do nothing\n    }\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun rotateEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.rotateEnabled)\n  }\n\n  @Test\n  fun rotateEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.rotateEnabled)\n  }\n\n  @Test\n  fun pinchToZoomEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.pinchToZoomEnabled)\n  }\n\n  @Test\n  fun pinchToZoomEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.pinchToZoomEnabled)\n  }\n\n  @Test\n  fun scrollEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.scrollEnabled)\n  }\n\n  @Test\n  fun scrollEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.scrollEnabled)\n  }\n\n  @Test\n  fun simultaneousRotateAndPinchToZoomEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.simultaneousRotateAndPinchToZoomEnabled)\n  }\n\n  @Test\n  fun simultaneousRotateAndPinchToZoomEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.simultaneousRotateAndPinchToZoomEnabled)\n  }\n\n  @Test\n  fun pitchEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.pitchEnabled)\n  }\n\n  @Test\n  fun pitchEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.pitchEnabled)\n  }\n\n  @Test\n  fun scrollModeTestHORIZONTAL() {\n    every { typedArray.getInt(any(), any()) } returns ScrollMode.HORIZONTAL.ordinal\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(ScrollMode.HORIZONTAL, settings.scrollMode)\n  }\n\n  @Test\n  fun scrollModeTestVERTICAL() {\n    every { typedArray.getInt(any(), any()) } returns ScrollMode.VERTICAL.ordinal\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(ScrollMode.VERTICAL, settings.scrollMode)\n  }\n\n  @Test\n  fun scrollModeTestHORIZONTAL_AND_VERTICAL() {\n    every { typedArray.getInt(any(), any()) } returns ScrollMode.HORIZONTAL_AND_VERTICAL.ordinal\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(ScrollMode.HORIZONTAL_AND_VERTICAL, settings.scrollMode)\n  }\n\n  @Test\n  fun doubleTapToZoomInEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.doubleTapToZoomInEnabled)\n  }\n\n  @Test\n  fun doubleTapToZoomInEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.doubleTapToZoomInEnabled)\n  }\n\n  @Test\n  fun doubleTouchToZoomOutEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.doubleTouchToZoomOutEnabled)\n  }\n\n  @Test\n  fun doubleTouchToZoomOutEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.doubleTouchToZoomOutEnabled)\n  }\n\n  @Test\n  fun quickZoomEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.quickZoomEnabled)\n  }\n\n  @Test\n  fun quickZoomEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.quickZoomEnabled)\n  }\n\n  @Test\n  fun focalPointTest() {\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(ScreenCoordinate(10.0, 10.0), settings.focalPoint)\n  }\n\n  @Test\n  fun pinchToZoomDecelerationEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.pinchToZoomDecelerationEnabled)\n  }\n\n  @Test\n  fun pinchToZoomDecelerationEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.pinchToZoomDecelerationEnabled)\n  }\n\n  @Test\n  fun rotateDecelerationEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.rotateDecelerationEnabled)\n  }\n\n  @Test\n  fun rotateDecelerationEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.rotateDecelerationEnabled)\n  }\n\n  @Test\n  fun scrollDecelerationEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.scrollDecelerationEnabled)\n  }\n\n  @Test\n  fun scrollDecelerationEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.scrollDecelerationEnabled)\n  }\n\n  @Test\n  fun increaseRotateThresholdWhenPinchingToZoomTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.increaseRotateThresholdWhenPinchingToZoom)\n  }\n\n  @Test\n  fun increaseRotateThresholdWhenPinchingToZoomTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.increaseRotateThresholdWhenPinchingToZoom)\n  }\n\n  @Test\n  fun increasePinchToZoomThresholdWhenRotatingTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.increasePinchToZoomThresholdWhenRotating)\n  }\n\n  @Test\n  fun increasePinchToZoomThresholdWhenRotatingTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.increasePinchToZoomThresholdWhenRotating)\n  }\n  @Test\n  fun zoomAnimationAmountTest() {\n    every { typedArray.getFloat(any(), any()) } returns 1f\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(1f, settings.zoomAnimationAmount)\n  }\n\n  @Test\n  fun pinchScrollEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(true, settings.pinchScrollEnabled)\n  }\n\n  @Test\n  fun pinchScrollEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = GesturesAttributeParser.parseGesturesSettings(context, attrs)\n    assertEquals(false, settings.pinchScrollEnabled)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-gestures/src/test/resources/robolectric.properties",
    "content": "sdk=28"
  },
  {
    "path": "plugin-indoorselector/README.md",
    "content": "## Mapbox Maps Indoor Selector Plugin for Android\n\n### Overview\n\nThe Mapbox Maps Indoor Selector Plugin for Android is a public library for displaying an indoor floor selector on top of a MapView. When enabled, the plugin will show a floor selector on the top-right corner of the map when indoor map data is available. The selector displays available floors and allows users to navigate between them. The plugin automatically shows and hides based on whether indoor data is present in the current map view.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Indoor Selector Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the indoor selector plugin to your project, you configure its dependency in your `build.gradle` files.\n\n### Enabling the Plugin\n\n⚠️ **Important**: The indoor selector plugin is **not included in the default plugin list**. You must explicitly add it when creating your MapView.\n\n**Recommendation**: Only add this plugin to your application if you specifically need indoor mapping functionality and have access to indoor map data with a supported style.\n\n```kotlin\n// In your Activity or Fragment\nval mapView = MapView(\n  this,\n  MapInitOptions(\n    context = this,\n    plugins = MapInitOptions.defaultPluginList + Plugin.Mapbox(Plugin.MAPBOX_INDOOR_SELECTOR_PLUGIN_ID)\n  )\n)\n```\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-indoorselector:11.17.0'\n}\n```\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-indoorselector/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.indoorselector {\n\n  public final class IndoorUtils {\n    method public static com.mapbox.maps.plugin.indoorselector.IndoorSelectorPlugin getIndoorSelector(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-indoorselector/api/plugin-indoorselector.api",
    "content": "public final class com/mapbox/maps/plugin/indoorselector/IndoorUtils {\n\tpublic static final synthetic fun createIndoorSelectorPlugin ()Lcom/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin;\n\tpublic static final fun getIndoorSelector (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin;\n}\n\n"
  },
  {
    "path": "plugin-indoorselector/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.indoorselector\"\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-indoorselector\"\n    artifactTitle = \"The indoor floor selector module for the Mapbox Maps SDK\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-indoorselector\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\ntasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { kotlinOptions.jvmTarget = \"1.8\" }\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-indoorselector/src/main/java/com/mapbox/maps/plugin/indoorselector/IndoorSelectorExt.kt",
    "content": "@file:JvmName(\"IndoorUtils\")\n\npackage com.mapbox.maps.plugin.indoorselector\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val for MapView to get the indoor selector plugin instance.\n */\n@MapboxExperimental\nval MapPluginProviderDelegate.indoorSelector: IndoorSelectorPlugin\n  @JvmName(\"getIndoorSelector\")\n  get() = this.getPlugin(Plugin.MAPBOX_INDOOR_SELECTOR_PLUGIN_ID)!!\n\n/**\n * Static method to create instance of Mapbox indoor selector plugin.\n * @suppress\n */\n@MapboxExperimental\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createIndoorSelectorPlugin(): IndoorSelectorPlugin {\n  return IndoorSelectorPluginImpl()\n}"
  },
  {
    "path": "plugin-indoorselector/src/main/java/com/mapbox/maps/plugin/indoorselector/IndoorSelectorPluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.indoorselector\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.IndoorFloor\nimport com.mapbox.maps.IndoorManager\nimport com.mapbox.maps.IndoorState\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings\nimport com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettingsBase\nimport java.util.concurrent.CopyOnWriteArraySet\n\n/**\n * Concrete implementation of IndoorSelectorPlugin.\n *\n * This plugin manages the indoor floor selector UI, displaying available floors\n * and allowing users to switch between them.\n */\n@MapboxExperimental\n@RestrictTo(RestrictTo.Scope.LIBRARY)\n@OptIn(com.mapbox.annotation.MapboxExperimental::class)\ninternal class IndoorSelectorPluginImpl(\n  private val viewImplProvider: (Context) -> IndoorSelectorViewImpl = { IndoorSelectorViewImpl(it) }\n) : IndoorSelectorPlugin, IndoorSelectorSettingsBase() {\n\n  private lateinit var indoorSelectorView: IndoorSelectorView\n  private lateinit var indoorManager: IndoorManager\n\n  override var internalSettings: IndoorSelectorSettings = IndoorSelectorSettings { }\n\n  private val floorSelectedListeners: CopyOnWriteArraySet<OnFloorSelectedListener> =\n    CopyOnWriteArraySet()\n\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  private var currentFloors: List<IndoorFloor> = emptyList()\n  private var selectedFloorId: String? = null\n\n  private val onFloorSelectedListener = OnFloorSelectedListener { floorId ->\n    indoorManager.selectFloor(floorId)\n  }\n\n  private val onIndoorUpdatedCallback = object : IndoorManager.OnIndoorUpdatedCallback {\n    override fun onIndoorUpdated(indoorState: IndoorState) {\n      if (!internalSettings.enabled) return\n      updateFloors(indoorState.floors, indoorState.selectedFloorId)\n    }\n  }\n\n  private var cancelable: Cancelable? = null\n\n  override fun applySettings() {\n    indoorSelectorView.apply {\n      isIndoorSelectorVisible = internalSettings.enabled\n      setIndoorGravity(internalSettings.position)\n      setIndoorSelectorMargins(\n        internalSettings.marginLeft.toInt(),\n        internalSettings.marginTop.toInt(),\n        internalSettings.marginRight.toInt(),\n        internalSettings.marginBottom.toInt()\n      )\n    }\n  }\n\n  /**\n   * Defines whether the plugin is enabled or disabled.\n   */\n  override var enabled: Boolean\n    get() = internalSettings.enabled\n    set(value) {\n      if (value == internalSettings.enabled) return\n      internalSettings = internalSettings.toBuilder().setEnabled(value).build()\n      if (value) {\n        cancelable = indoorManager.subscribeOnIndoorUpdated(onIndoorUpdatedCallback)\n        addOnFloorSelectedListener(onFloorSelectedListener)\n      } else {\n        cancelable?.cancel()\n        removeOnFloorSelectedListener(onFloorSelectedListener)\n      }\n      updateIndoorVisibility()\n    }\n\n  /**\n   * Bind the ViewPlugin with current map context. This will create a View that\n   * will be added to the MapView.\n   *\n   * @param mapView parent view which can be used to fetch [android.content.Context] or [android.view.ViewGroup.LayoutParams]\n   * @param attrs parent attributes\n   * @param pixelRatio the pixel ratio of the device\n   * @return View that will be added to the MapView\n   */\n  override fun bind(mapView: FrameLayout, attrs: AttributeSet?, pixelRatio: Float): View {\n    return viewImplProvider(mapView.context).also {\n      it.injectPresenter(this)\n    }\n  }\n\n  /**\n   * Provides a view instance returned in [bind] after it's been added to the MapView.\n   *\n   * @param view plugin view\n   */\n  override fun onPluginView(view: View) {\n    indoorSelectorView = view as? IndoorSelectorView\n      ?: throw IllegalArgumentException(\"The provided view needs to implement IndoorSelectorView\")\n\n    // Initialize with empty state\n    updateIndoorVisibility()\n  }\n\n  /**\n   * Called when the plugin is first added to the map.\n   */\n  override fun initialize() {\n    applySettings()\n    if (internalSettings.enabled) {\n      cancelable = indoorManager.subscribeOnIndoorUpdated(onIndoorUpdatedCallback)\n      addOnFloorSelectedListener(onFloorSelectedListener)\n    }\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   */\n  override fun cleanup() {\n    floorSelectedListeners.clear()\n    cancelable?.cancel()\n    currentFloors = emptyList()\n    selectedFloorId = null\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    this.indoorManager = delegateProvider.indoorManager\n  }\n\n  /**\n   * Called whenever activity's/fragment's lifecycle is entering a \"started\" state.\n   */\n  override fun onStart() {\n    // Update visibility based on current state\n    updateIndoorVisibility()\n  }\n\n  /**\n   * Called whenever activity's/fragment's lifecycle is entering a \"stopped\" state.\n   */\n  override fun onStop() {\n    // No-op for indoor plugin\n  }\n\n  /**\n   * Add a listener to be notified when a floor is selected.\n   *\n   * @param listener The listener to add\n   */\n  override fun addOnFloorSelectedListener(listener: OnFloorSelectedListener) {\n    floorSelectedListeners.add(listener)\n  }\n\n  /**\n   * Remove a floor selection listener.\n   *\n   * @param listener The listener to remove\n   */\n  override fun removeOnFloorSelectedListener(listener: OnFloorSelectedListener) {\n    floorSelectedListeners.remove(listener)\n  }\n\n  /**\n   * Called when a floor is selected by the user via the UI.\n   * This method updates the view and notifies all registered listeners.\n   *\n   * @param floorId The ID of the selected floor\n   */\n  override fun onFloorSelected(floorId: String) {\n    if (selectedFloorId != floorId) {\n      selectedFloorId = floorId\n\n      // Update the view to reflect the new selection\n      indoorSelectorView.updateFloors(currentFloors, selectedFloorId)\n\n      // Notify all listeners (which can call IndoorManager.selectFloor())\n      floorSelectedListeners.forEach { listener ->\n        listener.onFloorSelected(floorId)\n      }\n    }\n  }\n\n  /**\n   * Called when the building button is tapped by the user via the UI.\n   * Clears the active floor selection so the map shows buildings.\n   */\n  fun onBuildingSelected() {\n    selectedFloorId = null\n    indoorManager.selectFloor(null)\n    indoorSelectorView.updateFloors(currentFloors, null)\n  }\n\n  /**\n   * Update the list of available floors.\n   * Call this method when indoor data becomes available or changes.\n   *\n   * @param floors List of available floors\n   * @param selectedFloorId ID of the currently selected floor (optional)\n   */\n  override fun updateFloors(floors: List<IndoorFloor>, selectedFloorId: String?) {\n    currentFloors = floors\n    this.selectedFloorId = selectedFloorId\n\n    indoorSelectorView.updateFloors(floors, selectedFloorId)\n    updateIndoorVisibility()\n  }\n\n  /**\n   * Update the visibility of the indoor selector based on current state.\n   * The selector is visible only if enabled and there are floors to display.\n   */\n  private fun updateIndoorVisibility() {\n    val shouldBeVisible = internalSettings.enabled && currentFloors.isNotEmpty()\n    indoorSelectorView.isIndoorSelectorVisible = shouldBeVisible\n  }\n}"
  },
  {
    "path": "plugin-indoorselector/src/main/java/com/mapbox/maps/plugin/indoorselector/IndoorSelectorViewImpl.kt",
    "content": "package com.mapbox.maps.plugin.indoorselector\n\nimport android.content.Context\nimport android.content.res.ColorStateList\nimport android.graphics.Color\nimport android.graphics.PorterDuff\nimport android.graphics.drawable.GradientDrawable\nimport android.util.AttributeSet\nimport android.util.TypedValue\nimport android.view.Gravity\nimport android.view.MotionEvent\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.ScrollView\nimport android.widget.TextView\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.isVisible\nimport com.mapbox.maps.IndoorFloor\nimport com.mapbox.maps.MapboxExperimental\nimport kotlin.math.roundToInt\n\n/**\n * Custom view for selecting indoor floor levels.\n *\n * Layout structure:\n * - FrameLayout container with rounded corners and elevation\n * - SnappingScrollView in the center containing floor items in a LinearLayout\n * - Top and bottom arrow buttons overlaid on the scroll view for navigation\n *\n * The scroll view snaps to floor items and shows/hides arrows based on scroll position.\n * Touch events are intercepted to prevent map gestures while interacting with the selector.\n */\n@MapboxExperimental\n@OptIn(com.mapbox.annotation.MapboxExperimental::class)\ninternal class IndoorSelectorViewImpl @JvmOverloads constructor(\n  context: Context,\n  attrs: AttributeSet? = null,\n  defStyleAttr: Int = 0\n) : IndoorSelectorView, FrameLayout(context, attrs, defStyleAttr) {\n\n  private val itemHeightPx = resources.getDimensionPixelSize(R.dimen.mapbox_indoor_item_height)\n  private val cornerRadiusPx = resources.getDimension(R.dimen.mapbox_indoor_corner_radius)\n\n  private val containerLayout = LinearLayout(context).apply {\n    orientation = LinearLayout.VERTICAL\n  }\n\n  private val scrollView = SnappingScrollView(context).apply {\n    isVerticalScrollBarEnabled = false\n    overScrollMode = View.OVER_SCROLL_NEVER\n    isFillViewport = true\n    addView(containerLayout)\n  }\n\n  private val topArrow: ImageView\n  private val bottomArrow: ImageView\n  private val buildingButton: ImageView\n\n  private var indoorFloors: List<IndoorFloor> = emptyList()\n  private var selectedFloorId: String? = null\n  private var isBuildingSelected = false\n  private lateinit var presenter: IndoorSelectorPluginImpl\n\n  init {\n    layoutParams = LayoutParams(itemHeightPx, LayoutParams.WRAP_CONTENT)\n    elevation = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4f, resources.displayMetrics)\n    clipToOutline = true\n\n    // blocking touch events from passing through to map\n    isClickable = true\n    isFocusable = true\n\n    background = GradientDrawable().apply {\n      color = ColorStateList.valueOf(ContextCompat.getColor(context, R.color.mapbox_indoor_bg))\n      cornerRadius = cornerRadiusPx\n    }\n\n    buildingButton = createBuildingButton()\n    addView(buildingButton)\n\n    val scrollParams = LayoutParams(itemHeightPx, LayoutParams.WRAP_CONTENT).apply {\n      topMargin = itemHeightPx\n    }\n    addView(scrollView, scrollParams)\n\n    topArrow = createArrowButton(isUp = true)\n    bottomArrow = createArrowButton(isUp = false)\n\n    (topArrow.layoutParams as LayoutParams).topMargin = itemHeightPx\n    (bottomArrow.layoutParams as LayoutParams).topMargin = itemHeightPx\n\n    addView(topArrow)\n    addView(bottomArrow)\n\n    scrollView.viewTreeObserver.addOnScrollChangedListener { updateArrows() }\n    topArrow.setOnClickListener { scrollByItem(-1) }\n    bottomArrow.setOnClickListener { scrollByItem(1) }\n  }\n\n  override fun dispatchTouchEvent(ev: MotionEvent): Boolean {\n    // Prevent parent from intercepting scroll/pan gestures\n    if (ev.action == MotionEvent.ACTION_DOWN) {\n      parent?.requestDisallowInterceptTouchEvent(true)\n    } else if (ev.action == MotionEvent.ACTION_UP || ev.action == MotionEvent.ACTION_CANCEL) {\n      parent?.requestDisallowInterceptTouchEvent(false)\n    }\n    return super.dispatchTouchEvent(ev)\n  }\n\n  internal fun injectPresenter(plugin: IndoorSelectorPluginImpl) {\n    this.presenter = plugin\n  }\n\n  override var isIndoorSelectorVisible: Boolean\n    get() = isVisible\n    set(value) {\n      isVisible = value && indoorFloors.isNotEmpty()\n    }\n\n  override fun setIndoorGravity(gravity: Int) {\n    updateLayoutParams { it.gravity = gravity }\n  }\n\n  override fun setIndoorSelectorMargins(left: Int, top: Int, right: Int, bottom: Int) {\n    updateLayoutParams { it.setMargins(left, top, right, bottom) }\n  }\n\n  override fun updateFloors(floors: List<IndoorFloor>, selectedFloorId: String?) {\n    val floorsChanged = this.indoorFloors != floors\n    this.indoorFloors = floors\n    this.selectedFloorId = selectedFloorId\n\n    if (floorsChanged) {\n      rebuildFloorViews(floors)\n    }\n\n    updateSelectionHighlight(selectedFloorId)\n    isIndoorSelectorVisible = indoorFloors.isNotEmpty()\n  }\n\n  private fun rebuildFloorViews(floors: List<IndoorFloor>) {\n    containerLayout.removeAllViews()\n\n    floors.forEach { level ->\n      val view = TextView(context).apply {\n        layoutParams = LinearLayout.LayoutParams(itemHeightPx, itemHeightPx)\n        gravity = Gravity.CENTER\n        includeFontPadding = false\n        text = level.name.take(FLOOR_LABEL_MAX_CHARS)\n        setTextSize(TypedValue.COMPLEX_UNIT_SP, FLOOR_LABEL_TEXT_SIZE_SP)\n\n        setOnClickListener {\n          if (isBuildingSelected) {\n            isBuildingSelected = false\n            updateBuildingButtonStyle()\n          }\n          if (::presenter.isInitialized) {\n            presenter.onFloorSelected(level.id)\n          }\n          updateSelectionHighlight(level.id)\n        }\n      }\n      containerLayout.addView(view)\n    }\n\n    updateContainerHeight()\n    post { updateArrows() }\n  }\n\n  // Updates background and text color for all floor items based on selection\n  private fun updateSelectionHighlight(activeId: String?) {\n    selectedFloorId = activeId\n\n    val selectedBg = ContextCompat.getColor(context, R.color.mapbox_indoor_selected_bg)\n    val selectedTxt = ContextCompat.getColor(context, R.color.mapbox_indoor_selected_text)\n    val normalTxt = ContextCompat.getColor(context, R.color.mapbox_indoor_text)\n\n    for (i in 0 until containerLayout.childCount) {\n      val view = containerLayout.getChildAt(i) as TextView\n      val level = indoorFloors.getOrNull(i) ?: continue\n      // When building button is active, no floor appears highlighted\n      val isActive = !isBuildingSelected && level.id == activeId\n\n      view.setBackgroundColor(if (isActive) selectedBg else Color.TRANSPARENT)\n      view.setTextColor(if (isActive) selectedTxt else normalTxt)\n    }\n  }\n\n  private fun updateContainerHeight() {\n    val visibleCount = indoorFloors.size.coerceAtMost(MAX_VISIBLE_ITEMS)\n    // Add 1 for the building button\n    val targetHeight = (visibleCount + 1) * itemHeightPx\n\n    updateLayoutParams {\n      it.height = targetHeight\n      it.width = itemHeightPx\n    }\n  }\n\n  private fun updateArrows() {\n    if (indoorFloors.size <= MAX_VISIBLE_ITEMS) {\n      topArrow.isVisible = false\n      bottomArrow.isVisible = false\n      return\n    }\n\n    val scrollY = scrollView.scrollY\n    val maxScroll = (indoorFloors.size * itemHeightPx) - (MAX_VISIBLE_ITEMS * itemHeightPx)\n\n    topArrow.isVisible = scrollY > SCROLL_THRESHOLD\n    bottomArrow.isVisible = scrollY < maxScroll - SCROLL_THRESHOLD\n  }\n\n  private fun scrollByItem(direction: Int) {\n    val targetY = scrollView.scrollY + (direction * itemHeightPx)\n    scrollView.smoothSnapTo(targetY)\n  }\n\n  private fun createArrowButton(isUp: Boolean) = ImageView(context).apply {\n    scaleType = ImageView.ScaleType.CENTER_INSIDE\n    setBackgroundColor(ContextCompat.getColor(context, R.color.mapbox_indoor_bg))\n\n    val imageResId = if (isUp) R.drawable.mapbox_indoor_selector_arrow_up else R.drawable.mapbox_indoor_selector_arrow_down\n    setImageResource(imageResId)\n    val contentDescriptionResId = if (isUp) R.string.mapbox_indoorselector_scroll_up else R.string.mapbox_indoorselector_scroll_down\n    contentDescription = context.getString(contentDescriptionResId)\n\n    setColorFilter(ContextCompat.getColor(context, R.color.mapbox_indoor_text), PorterDuff.Mode.SRC_IN)\n\n    layoutParams = LayoutParams(itemHeightPx, itemHeightPx).apply {\n      gravity = if (isUp) Gravity.TOP else Gravity.BOTTOM\n    }\n  }\n\n  private fun createBuildingButton() = ImageView(context).apply {\n    scaleType = ImageView.ScaleType.CENTER_INSIDE\n    setBackgroundColor(ContextCompat.getColor(context, R.color.mapbox_indoor_bg))\n    setImageResource(R.drawable.mapbox_indoor_selector_building)\n    contentDescription = context.getString(R.string.mapbox_indoorselector_building)\n    setColorFilter(ContextCompat.getColor(context, R.color.mapbox_indoor_text), PorterDuff.Mode.SRC_IN)\n\n    layoutParams = LayoutParams(itemHeightPx, itemHeightPx).apply {\n      gravity = Gravity.TOP\n    }\n\n    setOnClickListener { onBuildingButtonTapped() }\n  }\n\n  private fun onBuildingButtonTapped() {\n    if (isBuildingSelected) return\n    isBuildingSelected = true\n    updateBuildingButtonStyle()\n    if (::presenter.isInitialized) {\n      presenter.onBuildingSelected()\n    }\n  }\n\n  private fun updateBuildingButtonStyle() {\n    val bgColor = if (isBuildingSelected) {\n      ContextCompat.getColor(context, R.color.mapbox_indoor_selected_bg)\n    } else {\n      ContextCompat.getColor(context, R.color.mapbox_indoor_bg)\n    }\n    val iconColor = if (isBuildingSelected) {\n      ContextCompat.getColor(context, R.color.mapbox_indoor_selected_text)\n    } else {\n      ContextCompat.getColor(context, R.color.mapbox_indoor_text)\n    }\n    buildingButton.setBackgroundColor(bgColor)\n    buildingButton.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN)\n    updateSelectionHighlight(selectedFloorId)\n  }\n\n  private inline fun updateLayoutParams(block: (LayoutParams) -> Unit) {\n    (layoutParams as? LayoutParams)?.let {\n      block(it)\n      layoutParams = it\n    }\n  }\n\n  private inner class SnappingScrollView(context: Context) : ScrollView(context) {\n\n    override fun fling(velocityY: Int) {\n      if (childCount == 0) return\n\n      // Scale velocity to determine how many items to jump\n      val itemJump = (velocityY / FLING_VELOCITY_SCALE).roundToInt()\n      // Find which item we're currently closest to\n      val currentItem = (scrollY + (itemHeightPx / 2)) / itemHeightPx\n      val targetItem = (currentItem + itemJump).coerceIn(0, indoorFloors.size - 1)\n\n      val targetY = targetItem * itemHeightPx\n      smoothSnapTo(targetY)\n    }\n\n    override fun onTouchEvent(ev: MotionEvent): Boolean {\n      val result = super.onTouchEvent(ev)\n      if (ev.action == MotionEvent.ACTION_UP || ev.action == MotionEvent.ACTION_CANCEL) {\n        snapToNearest()\n      }\n      return result\n    }\n\n    fun smoothSnapTo(y: Int) {\n      val maxScroll = (getChildAt(0).height - height).coerceAtLeast(0)\n      smoothScrollTo(0, y.coerceIn(0, maxScroll))\n    }\n\n    private fun snapToNearest() {\n      val nearestItemIndex = (scrollY.toFloat() / itemHeightPx).roundToInt()\n      smoothSnapTo(nearestItemIndex * itemHeightPx)\n    }\n  }\n  companion object {\n    private const val MAX_VISIBLE_ITEMS = 4\n    // Buffer to prevent arrow flicker at scroll boundaries\n    private const val SCROLL_THRESHOLD = 5\n    // Convert velocity to item jump distance\n    private const val FLING_VELOCITY_SCALE = 1000f\n    private const val FLOOR_LABEL_TEXT_SIZE_SP = 16f\n    private const val FLOOR_LABEL_MAX_CHARS = 3\n  }\n}"
  },
  {
    "path": "plugin-indoorselector/src/main/res/drawable/mapbox_indoor_selector_arrow_down.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"10dp\"\n    android:viewportWidth=\"16\"\n    android:viewportHeight=\"10\">\n  <path\n      android:pathData=\"M13.686,0.22C13.979,-0.073 14.453,-0.073 14.746,0.22L15.383,0.856C15.676,1.149 15.676,1.624 15.383,1.917L8.332,8.968C8.039,9.261 7.564,9.261 7.271,8.968L0.22,1.917C-0.073,1.624 -0.073,1.149 0.22,0.856L0.856,0.22C1.149,-0.073 1.624,-0.073 1.917,0.22L7.801,6.104L13.686,0.22Z\"\n      android:fillColor=\"#3D3D3D\"/>\n</vector>\n"
  },
  {
    "path": "plugin-indoorselector/src/main/res/drawable/mapbox_indoor_selector_arrow_up.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"10dp\"\n    android:viewportWidth=\"16\"\n    android:viewportHeight=\"10\">\n  <path\n      android:pathData=\"M13.686,8.968C13.979,9.261 14.453,9.261 14.746,8.968L15.383,8.332C15.676,8.039 15.676,7.564 15.383,7.271L8.332,0.22C8.039,-0.073 7.564,-0.073 7.271,0.22L0.22,7.271C-0.073,7.564 -0.073,8.039 0.22,8.332L0.856,8.968C1.149,9.261 1.624,9.261 1.917,8.968L7.801,3.083L13.686,8.968Z\"\n      android:fillColor=\"#0E2127\"/>\n</vector>\n"
  },
  {
    "path": "plugin-indoorselector/src/main/res/drawable/mapbox_indoor_selector_building.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M12,7L12,3L2,3v18h20L22,7L12,7zM6,19L4,19v-2h2v2zM6,15L4,15v-2h2v2zM6,11L4,11L4,9h2v2zM6,7L4,7L4,5h2v2zM10,19L8,19v-2h2v2zM10,15L8,15v-2h2v2zM10,11L8,11L8,9h2v2zM10,7L8,7L8,5h2v2zM20,19h-8v-2h2v-2h-2v-2h2v-2h-2L12,9h8v10zM18,11h-2v2h2v-2zM18,15h-2v2h2v-2z\"/>\n</vector>\n"
  },
  {
    "path": "plugin-indoorselector/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"mapbox_indoor_bg\">#FFFFFF</color>\n    <color name=\"mapbox_indoor_text\">#000000</color>\n    <color name=\"mapbox_indoor_selected_bg\">#333333</color>\n    <color name=\"mapbox_indoor_selected_text\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "plugin-indoorselector/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"mapbox_indoor_item_height\">44dp</dimen>\n    <dimen name=\"mapbox_indoor_corner_radius\">8dp</dimen>\n    <dimen name=\"mapbox_indoor_elevation\">4dp</dimen>\n    <dimen name=\"mapbox_indoor_text_size\">16sp</dimen>\n</resources>"
  },
  {
    "path": "plugin-indoorselector/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Indoor selector accessibility strings -->\n    <string name=\"mapbox_indoorselector_scroll_up\">Scroll up</string>\n    <string name=\"mapbox_indoorselector_scroll_down\">Scroll down</string>\n    <string name=\"mapbox_indoorselector_building\">Show building</string>\n</resources>\n"
  },
  {
    "path": "plugin-indoorselector/src/main/res/values-night/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"mapbox_indoor_bg\">#1E1E1E</color>\n    <color name=\"mapbox_indoor_text\">#E0E0E0</color>\n    <color name=\"mapbox_indoor_selected_bg\">#3D3D3D</color>\n    <color name=\"mapbox_indoor_selected_text\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "plugin-lifecycle/.gitignore",
    "content": "/build"
  },
  {
    "path": "plugin-lifecycle/README.md",
    "content": "## Mapbox Maps Lifecycle Plugin for Android\n\n### Overview\n\nThe Mapbox Maps Lifecycle Plugin for Android is an public library for handling Lifecycle events of the Mapbox SDK MapView. By default, the Lifecycle Plugin will automatically hook into the lifecycle events(onStart/onStop/onResume/onDestroy) of the host Activity or Fragment, so that developers don't need to invoke the corresponding lifecycle methods of MapView manually themselves.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Lifecycle Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the Lifecycle plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-lifecycle:11.22.0-rc.1'\n  // Make sure the version of appcompat is 1.3.0+\n  implementation 'androidx.appcompat:appcompat:1.3.0'\n}\n```\nThe Lifecycle Plugin will take effect automatically if added as dependency.\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-lifecycle/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.lifecycle {\n\n  public final class LifecycleUtils {\n    method public static com.mapbox.maps.plugin.lifecycle.MapboxLifecyclePlugin getLifecycle(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-lifecycle/api/plugin-lifecycle.api",
    "content": "public final class com/mapbox/maps/plugin/lifecycle/LifecycleUtils {\n\tpublic static final synthetic fun createLifecyclePlugin ()Lcom/mapbox/maps/plugin/lifecycle/MapboxLifecyclePlugin;\n\tpublic static final fun getLifecycle (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/lifecycle/MapboxLifecyclePlugin;\n}\n\n"
  },
  {
    "path": "plugin-lifecycle/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.lifecycle\"\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n    unitTests.isReturnDefaultValues = true\n  }\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-lifecycle\"\n    artifactTitle = \"The map lifecycle module for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-lifecycle\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.mapbox.base)\n  implementation(libs.kotlin)\n  implementation(libs.androidx.coreKtx)\n  implementation(libs.androidx.lifecycle)\n\n  testImplementation(libs.coroutinesTest)\n  testImplementation(libs.bundles.base.dependenciesTests)\n  testImplementation(libs.androidx.archCoreTest)\n  testImplementation(libs.androidx.lifecycleRuntimeTesting)\n\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n  lintPublish(project(\":plugin-lifecycle-lint-rules\"))\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-lifecycle/src/main/java/com/mapbox/maps/plugin/lifecycle/LifecycleExt.kt",
    "content": "@file:JvmName(\"LifecycleUtils\")\n\npackage com.mapbox.maps.plugin.lifecycle\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension function for MapView to get the lifecycle plugin instance.\n *\n * @return Lifecycle plugin instance\n */\nval MapPluginProviderDelegate.lifecycle: MapboxLifecyclePlugin\n  @JvmName(\"getLifecycle\")\n  get() = this.getPlugin(Plugin.MAPBOX_LIFECYCLE_PLUGIN_ID)!!\n\n/**\n * Static method to create instance of Mapbox lifecycle plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createLifecyclePlugin(): MapboxLifecyclePlugin {\n  return MapboxLifecyclePluginImpl()\n}"
  },
  {
    "path": "plugin-lifecycle/src/main/java/com/mapbox/maps/plugin/lifecycle/MapboxLifecyclePluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.lifecycle\n\nimport android.content.ComponentCallbacks2\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_COMPLETE\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_MODERATE\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN\nimport android.content.res.Configuration\nimport android.view.View\nimport androidx.annotation.RestrictTo\nimport androidx.lifecycle.*\nimport com.mapbox.maps.MapboxLifecycleObserver\nimport com.mapbox.maps.logD\nimport com.mapbox.maps.logI\nimport com.mapbox.maps.logW\n\n/**\n * Concrete implementation of MapboxLifecyclePlugin.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapboxLifecyclePluginImpl : MapboxLifecyclePlugin {\n  /**\n   * Register a MapboxLifecycleObserver to observe life cycle events from LifecycleOwner\n   *\n   * @param mapView the instance of mapView, will get the LifecycleOwner from mapview's parent\n   * @param observer the observer that listen to the life cycle events\n   */\n  override fun registerLifecycleObserver(mapView: View, observer: MapboxLifecycleObserver) {\n    val viewLifecycleRegistry = ViewLifecycleOwner(\n      view = mapView\n    )\n    logD(TAG, \"registerLifecycleObserver is called\")\n\n    val componentCallback = object : ComponentCallbacks2 {\n      override fun onConfigurationChanged(newConfig: Configuration) {\n        // no need\n      }\n\n      override fun onLowMemory() {\n        observer.onLowMemory()\n      }\n\n      override fun onTrimMemory(level: Int) {\n        when (level) {\n          TRIM_MEMORY_RUNNING_CRITICAL, TRIM_MEMORY_RUNNING_LOW -> {\n            logW(TAG, \"onTrimMemory with level $level is received, reduceMemoryUse will be called.\")\n            observer.onLowMemory()\n          }\n          TRIM_MEMORY_BACKGROUND, TRIM_MEMORY_COMPLETE, TRIM_MEMORY_MODERATE, TRIM_MEMORY_RUNNING_MODERATE, TRIM_MEMORY_UI_HIDDEN -> Unit\n        }\n      }\n    }\n    mapView.context.registerComponentCallbacks(componentCallback)\n    viewLifecycleRegistry.lifecycle.addObserver(\n      object : LifecycleObserver {\n        @OnLifecycleEvent(Lifecycle.Event.ON_START)\n        fun onStart() {\n          logI(TAG, \"onStart is called, MapboxLifecycleObserver will be notified.\")\n          observer.onStart()\n        }\n\n        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)\n        fun onStop() {\n          logI(TAG, \"onStop is called, MapboxLifecycleObserver will be notified.\")\n          observer.onStop()\n        }\n\n        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)\n        fun onResume() {\n          logI(TAG, \"onResume is called, MapboxLifecycleObserver will be notified.\")\n          observer.onResume()\n        }\n\n        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)\n        fun onDestroy() {\n          logI(TAG, \"onDestroy is called, MapboxLifecycleObserver will be notified.\")\n          observer.onDestroy()\n          viewLifecycleRegistry.lifecycle.removeObserver(this)\n          viewLifecycleRegistry.cleanUp()\n          mapView.context.unregisterComponentCallbacks(componentCallback)\n        }\n      })\n  }\n\n  private companion object {\n    private const val TAG = \"MapboxLifecyclePlugin\"\n  }\n}"
  },
  {
    "path": "plugin-lifecycle/src/main/java/com/mapbox/maps/plugin/lifecycle/ViewLifecycleOwner.kt",
    "content": "package com.mapbox.maps.plugin.lifecycle\n\nimport android.view.View\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.UiThread\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleEventObserver\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LifecycleRegistry\nimport androidx.lifecycle.ViewTreeLifecycleOwner\nimport java.lang.ref.WeakReference\n\n/**\n * A [LifecycleOwner] that merges the hosting lifecycle owner's [Lifecycle] (of an Activity or Fragment)\n * with the [View]'s drawing surface lifecycle.\n *\n * In general, this lifecycle reflects the hosting lifecycle owner's [Lifecycle] whenever the `View` is attached\n * but whenever the `View` is detached and we want to stop rendering the MapView, this lifecycle will transition\n * to [Lifecycle.State.CREATED] (and invoke [Lifecycle.Event.ON_STOP]) even if the hosting Activity or Fragment\n * is still running.\n *\n * This lifecycle reaches [Lifecycle.State.DESTROYED] only when the hosting lifecycle owner is destroyed.\n */\n@UiThread\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class ViewLifecycleOwner(\n  view: View,\n) : LifecycleOwner {\n  private val viewWeakReference = WeakReference(view)\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal val viewLifecycleRegistry = LifecycleRegistry(this)\n\n  override fun getLifecycle() = viewLifecycleRegistry\n\n  private var isAttached = false\n  private var hostingLifecycleOwner: LifecycleOwner? = null\n\n  private val hostingLifecycleObserver = LifecycleEventObserver { _, event ->\n    val isAtLeastCreated = viewLifecycleRegistry.currentState.isAtLeast(Lifecycle.State.CREATED)\n    if (isAttached || (isAtLeastCreated && event == Lifecycle.Event.ON_DESTROY)) {\n      viewLifecycleRegistry.handleLifecycleEvent(event)\n    }\n  }\n\n  private val attachStateChangeListener = object : View.OnAttachStateChangeListener {\n    override fun onViewAttachedToWindow(view: View) {\n      doOnAttached(view)\n    }\n\n    override fun onViewDetachedFromWindow(view: View) {\n      doOnDetached()\n    }\n  }\n\n  init {\n    view.addOnAttachStateChangeListener(attachStateChangeListener)\n    if (view.isAttachedToWindow) {\n      doOnAttached(view)\n    }\n  }\n\n  private fun doOnAttached(view: View) {\n    if (isAttached) return\n\n    hostingLifecycleOwner?.lifecycle?.removeObserver(hostingLifecycleObserver)\n\n    val hostingLifecycleOwner = ViewTreeLifecycleOwner.get(view)\n      ?: throw IllegalStateException(\n        \"Please ensure that the hosting activity/fragment is a valid LifecycleOwner\"\n      )\n    viewLifecycleRegistry.currentState = hostingLifecycleOwner.lifecycle.currentState\n    hostingLifecycleOwner.lifecycle.addObserver(hostingLifecycleObserver)\n    this@ViewLifecycleOwner.hostingLifecycleOwner = hostingLifecycleOwner\n    isAttached = true\n  }\n\n  private fun doOnDetached() {\n    if (!isAttached) return\n\n    isAttached = false\n    val hostingLifecycleOwner: LifecycleOwner = checkNotNull(hostingLifecycleOwner)\n    if (hostingLifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) {\n      viewLifecycleRegistry.currentState = Lifecycle.State.CREATED\n    }\n  }\n\n  fun cleanUp() {\n    hostingLifecycleOwner?.lifecycle?.removeObserver(hostingLifecycleObserver)\n    viewWeakReference.get()?.removeOnAttachStateChangeListener(attachStateChangeListener)\n  }\n}"
  },
  {
    "path": "plugin-lifecycle/src/test/java/com/mapbox/maps/extension/lifecycle/MapboxLifecyclePluginImplTest.kt",
    "content": "package com.mapbox.maps.extension.lifecycle\n\nimport android.content.ComponentCallbacks2\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_COMPLETE\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_MODERATE\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE\nimport android.content.ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN\nimport android.content.Context\nimport android.widget.FrameLayout\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.ViewTreeLifecycleOwner\nimport com.mapbox.maps.MapboxLifecycleObserver\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.lifecycle.MapboxLifecyclePlugin\nimport com.mapbox.maps.plugin.lifecycle.MapboxLifecyclePluginImpl\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\nclass MapboxLifecyclePluginImplTest {\n  @get:Rule\n  val instantTaskExecutorRule = InstantTaskExecutorRule()\n\n  private lateinit var mapboxLifecyclePlugin: MapboxLifecyclePlugin\n  private val mapView: FrameLayout = mockk(relaxed = true)\n  private val context: Context = mockk(relaxed = true)\n  private val lifecycleOwner: LifecycleOwner = mockk(relaxed = true)\n  private val slot = slot<ComponentCallbacks2>()\n\n  @Before\n  fun setUp() {\n    mockkStatic(ViewTreeLifecycleOwner::class)\n    every { mapView.context } returns context\n    every { ViewTreeLifecycleOwner.get(any()) } returns lifecycleOwner\n    mapboxLifecyclePlugin = MapboxLifecyclePluginImpl()\n  }\n\n  @Test\n  fun testOnLowMemory() {\n    val mapboxLifecycleObserver: MapboxLifecycleObserver = mockk(relaxed = true)\n    every { context.registerComponentCallbacks(capture(slot)) } answers {\n      slot.captured.onLowMemory()\n    }\n    mapboxLifecyclePlugin.registerLifecycleObserver(mapView, mapboxLifecycleObserver)\n\n    verify { mapboxLifecycleObserver.onLowMemory() }\n  }\n}\n\n@RunWith(Parameterized::class)\nclass TrimMemoryLevelTest(private val level: Pair<Int, Int>) {\n  @get:Rule\n  val instantTaskExecutorRule = InstantTaskExecutorRule()\n\n  private lateinit var mapboxLifecyclePlugin: MapboxLifecyclePlugin\n  private val mapView: FrameLayout = mockk(relaxed = true)\n  private val context: Context = mockk(relaxed = true)\n  private val lifecycleOwner: LifecycleOwner = mockk(relaxed = true)\n  private val slot = slot<ComponentCallbacks2>()\n\n  @Before\n  fun setUp() {\n    mockkStatic(ViewTreeLifecycleOwner::class)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    every { mapView.context } returns context\n    every { ViewTreeLifecycleOwner.get(any()) } returns lifecycleOwner\n    mapboxLifecyclePlugin = MapboxLifecyclePluginImpl()\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(ViewTreeLifecycleOwner::class)\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun checkOnLowMemoryIsCalled() {\n    val mapboxLifecycleObserver: MapboxLifecycleObserver = mockk(relaxed = true)\n    every { context.registerComponentCallbacks(capture(slot)) } answers {\n      slot.captured.onTrimMemory(level.first)\n    }\n    mapboxLifecyclePlugin.registerLifecycleObserver(mapView, mapboxLifecycleObserver)\n\n    verify(exactly = level.second) { mapboxLifecycleObserver.onLowMemory() }\n  }\n\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters(name = \"The TrimMemoryLevel and number of onLowMemory calls should match: {0}\")\n    fun data() = listOf(\n      TRIM_MEMORY_RUNNING_CRITICAL to 1,\n      TRIM_MEMORY_RUNNING_LOW to 1,\n      TRIM_MEMORY_BACKGROUND to 0,\n      TRIM_MEMORY_COMPLETE to 0,\n      TRIM_MEMORY_MODERATE to 0,\n      TRIM_MEMORY_RUNNING_MODERATE to 0,\n      TRIM_MEMORY_UI_HIDDEN to 0\n    )\n  }\n}"
  },
  {
    "path": "plugin-lifecycle/src/test/java/com/mapbox/maps/extension/lifecycle/ViewLifecycleOwnerTest.kt",
    "content": "package com.mapbox.maps.extension.lifecycle\n\nimport android.view.View\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleEventObserver\nimport androidx.lifecycle.ViewTreeLifecycleOwner\nimport androidx.lifecycle.testing.TestLifecycleOwner\nimport com.mapbox.maps.plugin.lifecycle.ViewLifecycleOwner\nimport io.mockk.*\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.newSingleThreadContext\nimport kotlinx.coroutines.test.resetMain\nimport kotlinx.coroutines.test.setMain\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\n\nclass ViewLifecycleOwnerTest {\n  @get:Rule\n  val instantTaskExecutorRule = InstantTaskExecutorRule()\n\n  private lateinit var hostingLifecycleOwner: TestLifecycleOwner\n  private var view = mockk<View>()\n  private val attachStateSlot = slot<View.OnAttachStateChangeListener>()\n  private val mainThreadSurrogate = newSingleThreadContext(\"UI thread\")\n\n  @Before\n  fun setup() {\n    // Needed as we don't have access to Dispatchers.Main in unit testing\n    Dispatchers.setMain(mainThreadSurrogate)\n    hostingLifecycleOwner = generateHostingLifecycleOwner()\n    mockkStatic(ViewTreeLifecycleOwner::class)\n    every { ViewTreeLifecycleOwner.get(view) } returns hostingLifecycleOwner\n    every { view.addOnAttachStateChangeListener(capture(attachStateSlot)) } just Runs\n    every { view.removeOnAttachStateChangeListener(any()) } just Runs\n    every { view.isAttachedToWindow } returns false\n  }\n\n  @Test\n  fun `mirrors hosting lifecycles state when attached`() {\n    val localLifecycleOwner = ViewLifecycleOwner(view)\n    val lifecycleObserver = mockk<LifecycleEventObserver>(relaxUnitFun = true)\n\n    localLifecycleOwner.lifecycle.addObserver(lifecycleObserver)\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)\n    attach()\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)\n    detach()\n\n    verifyOrder {\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_CREATE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_START)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_RESUME)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_PAUSE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_STOP)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_DESTROY)\n    }\n  }\n\n  @Test\n  fun `stops when detached and hosting lifecycle resumed`() {\n    val localLifecycleOwner = ViewLifecycleOwner(view)\n    val lifecycleObserver = mockk<LifecycleEventObserver>(relaxUnitFun = true)\n\n    localLifecycleOwner.lifecycle.addObserver(lifecycleObserver)\n    attach()\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)\n    detach()\n\n    verifyOrder {\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_CREATE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_START)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_RESUME)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_PAUSE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_STOP)\n    }\n  }\n\n  @Test\n  fun `stopped when detached and hosting lifecycle stopped`() {\n    val localLifecycleOwner = ViewLifecycleOwner(view)\n    val lifecycleObserver = mockk<LifecycleEventObserver>(relaxUnitFun = true)\n\n    localLifecycleOwner.lifecycle.addObserver(lifecycleObserver)\n    attach()\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_STOP)\n    detach()\n\n    verifyOrder {\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_CREATE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_START)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_RESUME)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_PAUSE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_STOP)\n    }\n  }\n\n  @Test\n  fun `hosting lifecycle destroyed but view never attached, remain initialized only`() {\n    val localLifecycleOwner = ViewLifecycleOwner(view)\n    val viewLifecycleRegistry = localLifecycleOwner.viewLifecycleRegistry\n    val lifecycleObserver = mockk<LifecycleEventObserver>(relaxUnitFun = true)\n\n    viewLifecycleRegistry.addObserver(lifecycleObserver)\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)\n\n    verify(exactly = 0) {\n      lifecycleObserver.onStateChanged(any(), any())\n    }\n    Assert.assertTrue(localLifecycleOwner.lifecycle.currentState == Lifecycle.State.INITIALIZED)\n  }\n\n  @Test\n  fun `destroyed state delivered even if view is detached`() {\n    val localLifecycleOwner = ViewLifecycleOwner(view)\n    val lifecycleObserver = mockk<LifecycleEventObserver>(relaxUnitFun = true)\n\n    localLifecycleOwner.lifecycle.addObserver(lifecycleObserver)\n    attach()\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)\n    detach()\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)\n\n    verifyOrder {\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_CREATE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_START)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_RESUME)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_PAUSE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_STOP)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_DESTROY)\n    }\n  }\n\n  @Test\n  fun `detaching view when hosting lifecycle is only initialized has no effect`() {\n    val localLifecycleOwner = ViewLifecycleOwner(view)\n    val lifecycleObserver = mockk<LifecycleEventObserver>(relaxUnitFun = true)\n\n    localLifecycleOwner.lifecycle.addObserver(lifecycleObserver)\n    attach()\n    detach()\n\n    verify(exactly = 0) {\n      lifecycleObserver.onStateChanged(any(), any())\n    }\n    Assert.assertTrue(localLifecycleOwner.lifecycle.currentState == Lifecycle.State.INITIALIZED)\n  }\n\n  @Test\n  fun `view is already attached on lifecycle creation, handle state correctly`() {\n    every { view.isAttachedToWindow } returns true\n    val localLifecycleOwner = ViewLifecycleOwner(view)\n    val lifecycleObserver = mockk<LifecycleEventObserver>(relaxUnitFun = true)\n\n    localLifecycleOwner.lifecycle.addObserver(lifecycleObserver)\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)\n    hostingLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)\n\n    verifyOrder {\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_CREATE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_START)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_RESUME)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_PAUSE)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_STOP)\n      lifecycleObserver.onStateChanged(localLifecycleOwner, Lifecycle.Event.ON_DESTROY)\n    }\n  }\n\n  @Test\n  fun testCleaUp() {\n    val localLifecycleOwner = ViewLifecycleOwner(view)\n    attach()\n    assertEquals(1, hostingLifecycleOwner.observerCount)\n    localLifecycleOwner.cleanUp()\n    assertEquals(0, hostingLifecycleOwner.observerCount)\n    verify { view.removeOnAttachStateChangeListener(attachStateSlot.captured) }\n  }\n\n  @Test(expected = IllegalStateException::class)\n  fun testNullLifecycleOwner() {\n    every { ViewTreeLifecycleOwner.get(view) } returns null\n    every { view.isAttachedToWindow } returns true\n    ViewLifecycleOwner(view)\n  }\n\n  @After\n  fun tearDown() {\n    Dispatchers.resetMain() // reset the main dispatcher to the original Main dispatcher\n    mainThreadSurrogate.close()\n    unmockkStatic(ViewTreeLifecycleOwner::class)\n    unmockkAll()\n  }\n\n  private fun generateHostingLifecycleOwner() = TestLifecycleOwner(\n    initialState = Lifecycle.State.INITIALIZED\n  )\n\n  private fun attach() {\n    attachStateSlot.captured.onViewAttachedToWindow(view)\n    every { view.isAttachedToWindow } returns true\n  }\n\n  private fun detach() {\n    attachStateSlot.captured.onViewDetachedFromWindow(view)\n    every { view.isAttachedToWindow } returns false\n  }\n}"
  },
  {
    "path": "plugin-lifecycle-lint-rules/.gitignore",
    "content": "/build\nlint-report.html"
  },
  {
    "path": "plugin-lifecycle-lint-rules/build.gradle.kts",
    "content": "plugins {\n  id(\"java-library\")\n  id(\"kotlin\")\n  id(\"com.android.lint\")\n}\n\nlint {\n  htmlReport = true\n  htmlOutput = file(\"lint-report.html\")\n  textReport = true\n  absolutePaths = false\n  ignoreTestSources = true\n}\n\njava {\n  sourceCompatibility = JavaVersion.VERSION_11\n  targetCompatibility = JavaVersion.VERSION_11\n}\n\ndependencies {\n  compileOnly(libs.lintApi)\n  compileOnly(libs.lintChecks)\n  compileOnly(libs.kotlin)\n  testImplementation(libs.junit)\n  testImplementation(libs.lint)\n  testImplementation(libs.lintTests)\n  testImplementation(libs.testUtils)\n}\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-lifecycle-lint-rules/src/main/java/com/mapbox/maps/lint/lifecycle/LifecycleIssueRegistry.kt",
    "content": "package com.mapbox.maps.lint.lifecycle\n\nimport com.android.tools.lint.client.api.IssueRegistry\nimport com.android.tools.lint.client.api.Vendor\n\nclass LifecycleIssueRegistry : IssueRegistry() {\n\n  override val issues = listOf(LifecycleMethodDetector.ISSUE)\n\n  override val api: Int = com.android.tools.lint.detector.api.CURRENT_API\n\n  override val vendor = Vendor(\n    vendorName = \"Mapbox\",\n    identifier = \"com.mapbox.maps:lifecycle-lint\",\n    feedbackUrl = \"https://github.com/mapbox/mapbox-maps-android/issues\",\n    contact = \"https://github.com/mapbox/mapbox-maps-android\"\n  )\n}"
  },
  {
    "path": "plugin-lifecycle-lint-rules/src/main/java/com/mapbox/maps/lint/lifecycle/LifecycleMethodDetector.kt",
    "content": "package com.mapbox.maps.lint.lifecycle\n\nimport com.android.tools.lint.detector.api.*\nimport com.intellij.psi.PsiMethod\nimport org.jetbrains.uast.UCallExpression\n\n/**\n * Lint detector for lifecycle events\n */\nclass LifecycleMethodDetector : Detector(), Detector.UastScanner {\n\n  override fun getApplicableMethodNames() = listOf(ON_START, ON_STOP, ON_RESUME, ON_DESTROY, ON_LOW_MEMORY)\n\n  override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {\n    if (context.evaluator.isMemberInClass(method, \"com.mapbox.maps.MapView\")) {\n      context.report(\n        ISSUE, node, context.getLocation(node),\n        REPORT_MESSAGE\n      )\n    }\n  }\n\n  companion object Issues {\n    private const val ON_START = \"onStart\"\n    private const val ON_STOP = \"onStop\"\n    private const val ON_RESUME = \"onResume\"\n    private const val ON_DESTROY = \"onDestroy\"\n    private const val ON_LOW_MEMORY = \"onLowMemory\"\n    private const val ISSUE_ID = \"Lifecycle\"\n    private const val BRIEF_DESCRIPTION = \"Redundant method call\"\n    private const val PRIORITY = 8\n    private const val REPORT_MESSAGE =\n      \"It's no longer required to manually invoke onStart/onStop/onResume/onDestroy/onLowMemory MapView lifecycle methods explicitly. The Mapbox Maps SDK for Android depends on the plugin-lifecycle that leverages androidx.lifecycle to make the MapView a lifecycle aware component. This behavior is automatically enforced when appcompact 1.3.0+ is used. The plugin-lifecycle can be removed from class path to opt-out of the associated behavior.\"\n\n    private val IMPLEMENTATION = Implementation(\n      LifecycleMethodDetector::class.java, Scope.JAVA_FILE_SCOPE\n    )\n\n    @JvmField\n    val ISSUE = Issue.create(\n      ISSUE_ID, BRIEF_DESCRIPTION, REPORT_MESSAGE,\n      Category.CORRECTNESS,\n      PRIORITY,\n      Severity.WARNING,\n      IMPLEMENTATION\n    ).setAndroidSpecific(true)\n  }\n}"
  },
  {
    "path": "plugin-lifecycle-lint-rules/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry",
    "content": "com.mapbox.maps.lint.lifecycle.LifecycleIssueRegistry"
  },
  {
    "path": "plugin-lifecycle-lint-rules/src/test/java/com/mapbox/maps/lint/LifecycleMethodDetectorTest.kt",
    "content": "package com.mapbox.maps.lint\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles\nimport com.android.tools.lint.checks.infrastructure.TestLintTask\nimport com.android.tools.lint.detector.api.TextFormat\nimport com.mapbox.maps.lint.lifecycle.LifecycleMethodDetector\nimport org.junit.Test\n\nclass LifecycleMethodDetectorTest {\n  val mapViewFile = TestFiles.java(\n    \"\"\"\n              package com.mapbox.maps;\n              public class MapView {\n                  void onStart() {\n                  }\n                  void onStop() {\n                  }\n                  void onDestroy() {\n                  }\n                  void onLowMemory() {\n                  }\n              }\n              \"\"\"\n  ).indented()\n\n  val fooFile = TestFiles.java(\n    \"\"\"\n              package com.foo;\n              public class Foo {\n                  void onStart() {\n                  }\n                  void onStop() {\n                  }\n                  void onDestroy() {\n                  }\n                  void onLowMemory() {\n                  }\n              }\n              \"\"\"\n  ).indented()\n\n  @Test\n  fun mapViewOnStart() {\n    TestLintTask.lint().files(\n      mapViewFile,\n      TestFiles.java(\n        \"\"\"\n                  package com.foo;\n                  import com.mapbox.maps.MapView;\n                  public class TestClass {\n                      MapView mapView = new MapView();\n                      void onStart() {\n                          mapView.onStart();\n                      }\n                  }\n                  \"\"\"\n      ).indented()\n    )\n      .issues(\n        LifecycleMethodDetector.ISSUE\n      )\n      .run()\n      .expect(\n        \"\"\"\n         |src/com/foo/TestClass.java:6: Warning: ${LifecycleMethodDetector.ISSUE.getExplanation(TextFormat.RAW)} [Lifecycle]\n         |        mapView.onStart();\n         |        ~~~~~~~~~~~~~~~~~\n         |0 errors, 1 warnings\n        \"\"\".trimMargin()\n      )\n      .expectWarningCount(1)\n  }\n\n  @Test\n  fun mapViewOnStop() {\n    TestLintTask.lint().files(\n      mapViewFile,\n      TestFiles.java(\n        \"\"\"\n                  package com.foo;\n                  import com.mapbox.maps.MapView;\n                  public class TestClass {\n                      MapView mapView = new MapView();\n                      void onStop() {\n                          mapView.onStop();\n                      }\n                  }\n                  \"\"\"\n      ).indented()\n    )\n      .issues(\n        LifecycleMethodDetector.ISSUE\n      )\n      .run()\n      .expect(\n        \"\"\"\n         |src/com/foo/TestClass.java:6: Warning: ${LifecycleMethodDetector.ISSUE.getExplanation(TextFormat.RAW)} [Lifecycle]\n         |        mapView.onStop();\n         |        ~~~~~~~~~~~~~~~~\n         |0 errors, 1 warnings\n        \"\"\".trimMargin()\n      )\n      .expectWarningCount(1)\n  }\n\n  @Test\n  fun mapViewOnDestroy() {\n    TestLintTask.lint().files(\n      mapViewFile,\n      TestFiles.java(\n        \"\"\"\n                  package com.foo;\n                  import com.mapbox.maps.MapView;\n                  public class TestClass {\n                      MapView mapView = new MapView();\n                      void onDestroy() {\n                          mapView.onDestroy();\n                      }\n                  }\n                  \"\"\"\n      ).indented()\n    )\n      .issues(\n        LifecycleMethodDetector.ISSUE\n      )\n      .run()\n      .expect(\n        \"\"\"\n         |src/com/foo/TestClass.java:6: Warning: ${LifecycleMethodDetector.ISSUE.getExplanation(TextFormat.RAW)} [Lifecycle]\n         |        mapView.onDestroy();\n         |        ~~~~~~~~~~~~~~~~~~~\n         |0 errors, 1 warnings\n        \"\"\".trimMargin()\n      )\n      .expectWarningCount(1)\n  }\n\n  @Test\n  fun mapViewOnLowMemory() {\n    TestLintTask.lint().files(\n      mapViewFile,\n      TestFiles.java(\n        \"\"\"\n                  package com.foo;\n                  import com.mapbox.maps.MapView;\n                  public class TestClass {\n                      MapView mapView = new MapView();\n                      void onLowMemory() {\n                          mapView.onLowMemory();\n                      }\n                  }\n                  \"\"\"\n      ).indented()\n    )\n      .issues(\n        LifecycleMethodDetector.ISSUE\n      )\n      .run()\n      .expect(\n        \"\"\"\n         |src/com/foo/TestClass.java:6: Warning: ${LifecycleMethodDetector.ISSUE.getExplanation(TextFormat.RAW)} [Lifecycle]\n         |        mapView.onLowMemory();\n         |        ~~~~~~~~~~~~~~~~~~~~~\n         |0 errors, 1 warnings\n        \"\"\".trimMargin()\n      )\n      .expectWarningCount(1)\n  }\n\n  @Test\n  fun normalOnStart() {\n    TestLintTask.lint().files(\n      fooFile,\n      TestFiles.java(\n        \"\"\"\n                  package com.foo;\n                  public class TestClass {\n                      Foo foo = new Foo();\n                      void onStart() {\n                          foo.onStart();\n                      }\n                  }\n                  \"\"\"\n      ).indented()\n    )\n      .issues(\n        LifecycleMethodDetector.ISSUE\n      )\n      .run()\n      .expectClean()\n  }\n\n  @Test\n  fun normalOnStop() {\n    TestLintTask.lint().files(\n      fooFile,\n      TestFiles.java(\n        \"\"\"\n                  package com.foo;\n                  public class TestClass {\n                      Foo foo = new Foo();\n                      void onStop() {\n                          foo.onStop();\n                      }\n                  }\n                  \"\"\"\n      ).indented()\n    )\n      .issues(\n        LifecycleMethodDetector.ISSUE\n      )\n      .run()\n      .expectClean()\n  }\n\n  @Test\n  fun normalOnDestroy() {\n    TestLintTask.lint().files(\n      fooFile,\n      TestFiles.java(\n        \"\"\"\n                  package com.foo;\n                  public class TestClass {\n                      Foo foo = new Foo();\n                      void onDestroy() {\n                          foo.onDestroy();\n                      }\n                  }\n                  \"\"\"\n      ).indented()\n    )\n      .issues(\n        LifecycleMethodDetector.ISSUE\n      )\n      .run()\n      .expectClean()\n  }\n\n  @Test\n  fun normalOnLowMemory() {\n    TestLintTask.lint().files(\n      fooFile,\n      TestFiles.java(\n        \"\"\"\n                  package com.foo;\n                  public class TestClass {\n                      Foo foo = new Foo();\n                      void onLowMemory() {\n                          foo.onLowMemory();\n                      }\n                  }\n                  \"\"\"\n      ).indented()\n    )\n      .issues(\n        LifecycleMethodDetector.ISSUE\n      )\n      .run()\n      .expectClean()\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/.gitignore",
    "content": "/build"
  },
  {
    "path": "plugin-locationcomponent/README.md",
    "content": "## Mapbox Maps Location Component Plugin for Android\n\n### Overview\n\nThe Mapbox Maps Location Component Plugin for Android is an public library for displaying a 2D or 3D location puck at user's location. By default the plugin provides a default 2D location puck. Users has the flexibility to customise location puck.\n\n**Note**:\nWith v10, the puck and camera updates have been decoupled, the location component plugin will only handle the location puck updates. Camera updates can be manually handled and synced. And the [Mapbox Viewport Plugin](https://github.com/mapbox/mapbox-maps-android/tree/main/plugin-viewport) is introduced as the successor of the location tracking modes of v9.\n\nA full overview of classes and interfaces can be found in our [User location guide](https://docs.mapbox.com/android/maps/guides/user-location) and [API documentation](https://docs.mapbox.com/android/maps/api-reference/).\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Location Component Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the location component plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-locationcomponent:11.22.0-rc.1'\n}\n```\n\n#### Using Google's Fused Location Provider\n\nBy default, the Maps SDK uses the Android Location Provider to obtain raw location updates. And with Android 11, the raw location updates might suffer from precision issue.\n\nThe Maps SDK also comes pre-compiled with support for the [Google's Fused Location Provider](https://developers.google.com/location-context/fused-location-provider) if that dependency is available. This means, that if your target devices support Google Play Services, [we recommend adding the Google Play Location Services dependency to your project](https://developers.google.com/android/guides/setup).\n```groovy\nimplementation(\"com.google.android.gms:play-services-location:18.0.0\")\n```\n\nIf that dependency is available in your app build, the Maps SDK will automatically use the Google's Fused Location Provider.\n\n### Example\n\nCustomizing Mapbox Maps Location Component Plugin for Android could be done in two ways: by either providing your own version of the location component plugin or by updating the settings on the location component plugin. The former is documented in [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md), the latter can be achieved with:\n\n```kotlin\nval plugin = mapView.location\n// Enable location component plugin\nplugin.enabled = true\n```\n\n#### Customize 2D puck appearance\n\n```kotlin\n// Customise a 2D location puck:\nplugin.locationPuck = LocationPuck2D(\n topImage = ... ,\n bearingImage = ... ,\n shadowImage =  ... ,\n // Scale expression defines the expression that will be applied to the image sizes.\n // This example provides an linear interpolate expression to scale the image size according to the zoom level.\n scaleExpression = interpolate {\n   linear()\n   zoom()\n   stop {\n     literal(0.0)\n     literal(0.6)\n   }\n   stop {\n     literal(20.0)\n     literal(1.0)\n   }\n }.toJson()\n)\n```\n\n#### Customize 3D puck appearance\n\n```kotlin\n// Customise a 3D location puck:\nplugin.locationPuck = LocationPuck3D(\n modelUri = ... ,\n // Model scale is used to set the initial scale of the model when the map is at maximum zoom level.\n // By default, Mapbox provides a default expression to keep the model size constant during zoom changes,\n // however, it could also be overwritten by the setting the modelScaleExpression property.\n modelScale = listOf(0.1f, 0.1f, 0.1f)\n)\n```\n\n#### Provide your own LocationProvider with custom puck animators\n\n```kotlin\n// Provide your own Location Updates:\n// Create your own Location Provider implementation that implements the LocationProvider interface.\nclass MyLocationProvider : LocationProvider {\n  // Your logic here to send location updates to the location consumer asynchronously.\n  // Location and bearing updates to the location consumer can be customised with flexible animation options.\n  ...\n}\nval myLocationProvider = MyLocationProvider()\n// Set your own location provider, it will replace the default implementation.\nplugin.setLocationProvider(myLocationProvider)\n```\n\nIf using own LocationProvider there is a possibility to customize puck animation to upcoming bearing and location updates.\n\n```kotlin\nprivate inner class CustomLocationProvider : LocationProvider {\n  override fun registerLocationConsumer(locationConsumer: LocationConsumer) {\n    // set default animation options that will be used for all upcoming location updates.\n    locationConsumer.onPuckLocationAnimatorDefaultOptionsUpdated() {\n      duration = 2000\n      interpolator = FastOutSlowInInterpolator()\n    }\n    locationConsumer.onLocationUpdated(geoPointOne)\n    locationConsumer.onLocationUpdated(geoPointTwo)\n    // set custom animator options for next update only, then default animator options will apply\n    locationConsumer.onLocationUpdated(geoPointThree) {\n      duration = 1000\n    }\n  }\n  ...\n}\n```\n\nMore concrete examples of the location component plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-locationcomponent/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.locationcomponent {\n\n  public final class DefaultLocationProvider implements com.mapbox.maps.plugin.locationcomponent.LocationProvider {\n    ctor public DefaultLocationProvider(android.content.Context context);\n    method public void addOnCompassCalibrationListener(com.mapbox.maps.plugin.locationcomponent.LocationCompassCalibrationListener listener);\n    method public void locationAnimatorOptions(kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? options);\n    method public void registerLocationConsumer(com.mapbox.maps.plugin.locationcomponent.LocationConsumer locationConsumer);\n    method public void removeCompassCalibrationListener(com.mapbox.maps.plugin.locationcomponent.LocationCompassCalibrationListener listener);\n    method public void unRegisterLocationConsumer(com.mapbox.maps.plugin.locationcomponent.LocationConsumer locationConsumer);\n    method public void updatePuckBearing(com.mapbox.maps.plugin.PuckBearing? source);\n  }\n\n  public fun interface LocationCompassCalibrationListener {\n    method public void onCompassCalibrationNeeded();\n  }\n\n  public final class LocationComponentConstants {\n    field public static final long ACCURACY_RADIUS_ANIMATION_DURATION = 250L; // 0xfaL\n    field public static final String BEARING_ICON = \"mapbox-location-bearing-icon\";\n    field public static final long COMPASS_UPDATE_RATE_MS = 500L; // 0x1f4L\n    field public static final long DEFAULT_FASTEST_INTERVAL_MILLIS = 1000L; // 0x3e8L\n    field public static final long DEFAULT_INTERVAL_MILLIS = 1000L; // 0x3e8L\n    field public static final float DEFAULT_MINIMUM_DISPLACEMENT_METERS = 0.1f;\n    field public static final long DEFAULT_TRACKING_PADDING_ANIM_DURATION = 750L; // 0x2eeL\n    field public static final long DEFAULT_TRACKING_TILT_ANIM_DURATION = 1250L; // 0x4e2L\n    field public static final long DEFAULT_TRACKING_ZOOM_ANIM_DURATION = 750L; // 0x2eeL\n    field public static final com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants INSTANCE;\n    field public static final double INSTANT_LOCATION_TRANSITION_THRESHOLD = 50000.0;\n    field public static final String LOCATION_INDICATOR_LAYER = \"mapbox-location-indicator-layer\";\n    field public static final long MAX_ANIMATION_DURATION_MS = 2000L; // 0x7d0L\n    field public static final String MODEL_LAYER = \"mapbox-location-model-layer\";\n    field public static final String MODEL_SOURCE = \"mapbox-location-model-source\";\n    field public static final float PULSING_MAX_RADIUS_FOLLOW_ACCURACY = -1.0f;\n    field public static final String SHADOW_ICON = \"mapbox-location-shadow-icon\";\n    field public static final String TOP_ICON = \"mapbox-location-top-icon\";\n    field public static final long TRANSITION_ANIMATION_DURATION_MS = 750L; // 0x2eeL\n  }\n\n  public final class LocationComponentUtils {\n    method public static com.mapbox.maps.plugin.LocationPuck2D createDefault2DPuck(boolean withBearing = false);\n    method public static com.mapbox.maps.plugin.LocationPuck2D createDefault2DPuck();\n    method public static com.mapbox.maps.plugin.locationcomponent.LocationComponentPlugin getLocationComponent(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.locationcomponent.model {\n\n  @com.mapbox.maps.MapboxExperimental public final class AnimatableModel {\n    method public String getColor();\n    method public double getColorMixIntensity();\n    method public double getEmissiveStrength();\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.maps.plugin.LocationPuck3D getLocationPuck3D();\n    method public String getModelUri();\n    method public double getOpacity();\n    method public java.util.List<java.lang.Double> getRotation();\n    method public void setColor(String);\n    method public void setColorMixIntensity(double);\n    method public void setEmissiveStrength(double);\n    method public void setOpacity(double);\n    method public void setRotation(java.util.List<java.lang.Double>);\n    property public final String color;\n    property public final double colorMixIntensity;\n    property public final double emissiveStrength;\n    property public final String modelUri;\n    property public final double opacity;\n    property public final java.util.List<java.lang.Double> rotation;\n  }\n\n  public final class AnimatableModelKt {\n    method @com.mapbox.maps.MapboxExperimental public static com.mapbox.maps.plugin.locationcomponent.model.AnimatableModel createAnimatableModel(com.mapbox.maps.plugin.locationcomponent.LocationComponentPlugin, String modelUri, java.util.List<? extends com.mapbox.maps.plugin.locationcomponent.model.ModelPart> modelParts);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public class ModelMaterialPart extends com.mapbox.maps.plugin.locationcomponent.model.ModelPart {\n    ctor public ModelMaterialPart(String featureStateId, java.util.List<java.lang.String> materialOverrides);\n    ctor public ModelMaterialPart(String materialOverride);\n    method public final String getColor();\n    method public final double getColorMixIntensity();\n    method public final double getEmissiveStrength();\n    method public final java.util.List<java.lang.String> getMaterialOverrides();\n    method public final double getOpacity();\n    method @com.mapbox.maps.MapboxExperimental public final void resetColor();\n    method public final void setColor(String);\n    method public final void setColorMixIntensity(double);\n    method public final void setEmissiveStrength(double);\n    method public final void setOpacity(double);\n    method @com.mapbox.maps.MapboxExperimental public final void updateColor(@ColorInt int color, double colorMixIntensity = 1.0);\n    property public final String color;\n    property public final double colorMixIntensity;\n    property public final double emissiveStrength;\n    property public final java.util.List<java.lang.String> materialOverrides;\n    property public final double opacity;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public class ModelNodePart extends com.mapbox.maps.plugin.locationcomponent.model.ModelPart {\n    ctor public ModelNodePart(String featureStateId, java.util.List<java.lang.String> nodeOverrides);\n    ctor public ModelNodePart(String nodeOverride);\n    method public final java.util.List<java.lang.String> getNodeOverrides();\n    method public final java.util.List<java.lang.Double> getRotation();\n    method public final void setRotation(java.util.List<java.lang.Double>);\n    property public final java.util.List<java.lang.String> nodeOverrides;\n    property public final java.util.List<java.lang.Double> rotation;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public abstract class ModelPart {\n    ctor public ModelPart(String featureStateId);\n    method public final String getFeatureStateId();\n    method protected final kotlin.jvm.functions.Function1<com.mapbox.bindgen.Value,java.lang.Boolean> getUpdateFeatureState();\n    method protected final void setUpdateFeatureState(kotlin.jvm.functions.Function1<? super com.mapbox.bindgen.Value,java.lang.Boolean>);\n    property public final String featureStateId;\n    property protected final kotlin.jvm.functions.Function1<com.mapbox.bindgen.Value,java.lang.Boolean> updateFeatureState;\n  }\n\n}\n\npackage com.mapbox.maps.plugin.locationcomponent.utils {\n\n  public final class ExpectedUtilsKt {\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-locationcomponent/api/plugin-locationcomponent.api",
    "content": "public final class com/mapbox/maps/plugin/locationcomponent/DefaultLocationProvider : com/mapbox/maps/plugin/locationcomponent/LocationProvider {\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic final fun addOnCompassCalibrationListener (Lcom/mapbox/maps/plugin/locationcomponent/LocationCompassCalibrationListener;)V\n\tpublic final fun locationAnimatorOptions (Lkotlin/jvm/functions/Function1;)V\n\tpublic fun registerLocationConsumer (Lcom/mapbox/maps/plugin/locationcomponent/LocationConsumer;)V\n\tpublic final fun removeCompassCalibrationListener (Lcom/mapbox/maps/plugin/locationcomponent/LocationCompassCalibrationListener;)V\n\tpublic fun unRegisterLocationConsumer (Lcom/mapbox/maps/plugin/locationcomponent/LocationConsumer;)V\n\tpublic final fun updatePuckBearing (Lcom/mapbox/maps/plugin/PuckBearing;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/locationcomponent/LocationCompassCalibrationListener {\n\tpublic abstract fun onCompassCalibrationNeeded ()V\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/LocationComponentConstants {\n\tpublic static final field ACCURACY_RADIUS_ANIMATION_DURATION J\n\tpublic static final field BEARING_ICON Ljava/lang/String;\n\tpublic static final field COMPASS_UPDATE_RATE_MS J\n\tpublic static final field DEFAULT_FASTEST_INTERVAL_MILLIS J\n\tpublic static final field DEFAULT_INTERVAL_MILLIS J\n\tpublic static final field DEFAULT_MINIMUM_DISPLACEMENT_METERS F\n\tpublic static final field DEFAULT_TRACKING_PADDING_ANIM_DURATION J\n\tpublic static final field DEFAULT_TRACKING_TILT_ANIM_DURATION J\n\tpublic static final field DEFAULT_TRACKING_ZOOM_ANIM_DURATION J\n\tpublic static final field INSTANCE Lcom/mapbox/maps/plugin/locationcomponent/LocationComponentConstants;\n\tpublic static final field INSTANT_LOCATION_TRANSITION_THRESHOLD D\n\tpublic static final field LOCATION_INDICATOR_LAYER Ljava/lang/String;\n\tpublic static final field MAX_ANIMATION_DURATION_MS J\n\tpublic static final field MODEL_LAYER Ljava/lang/String;\n\tpublic static final field MODEL_SOURCE Ljava/lang/String;\n\tpublic static final field PULSING_MAX_RADIUS_FOLLOW_ACCURACY F\n\tpublic static final field SHADOW_ICON Ljava/lang/String;\n\tpublic static final field TOP_ICON Ljava/lang/String;\n\tpublic static final field TRANSITION_ANIMATION_DURATION_MS J\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/LocationComponentUtils {\n\tpublic static final fun createDefault2DPuck ()Lcom/mapbox/maps/plugin/LocationPuck2D;\n\tpublic static final fun createDefault2DPuck (Z)Lcom/mapbox/maps/plugin/LocationPuck2D;\n\tpublic static synthetic fun createDefault2DPuck$default (ZILjava/lang/Object;)Lcom/mapbox/maps/plugin/LocationPuck2D;\n\tpublic static final synthetic fun createLocationComponentPlugin ()Lcom/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin;\n\tpublic static final fun getLocationComponent (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin;\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/model/AnimatableModel {\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getColorMixIntensity ()D\n\tpublic final fun getEmissiveStrength ()D\n\tpublic final fun getLocationPuck3D ()Lcom/mapbox/maps/plugin/LocationPuck3D;\n\tpublic final fun getModelUri ()Ljava/lang/String;\n\tpublic final fun getOpacity ()D\n\tpublic final fun getRotation ()Ljava/util/List;\n\tpublic final fun setColor (Ljava/lang/String;)V\n\tpublic final fun setColorMixIntensity (D)V\n\tpublic final fun setEmissiveStrength (D)V\n\tpublic final fun setOpacity (D)V\n\tpublic final fun setRotation (Ljava/util/List;)V\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/model/AnimatableModelKt {\n\tpublic static final fun createAnimatableModel (Lcom/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin;Ljava/lang/String;Ljava/util/List;)Lcom/mapbox/maps/plugin/locationcomponent/model/AnimatableModel;\n}\n\npublic class com/mapbox/maps/plugin/locationcomponent/model/ModelMaterialPart : com/mapbox/maps/plugin/locationcomponent/model/ModelPart {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;)V\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getColorMixIntensity ()D\n\tpublic final fun getEmissiveStrength ()D\n\tpublic final fun getMaterialOverrides ()Ljava/util/List;\n\tpublic final fun getOpacity ()D\n\tpublic final fun resetColor ()V\n\tpublic final fun setColor (Ljava/lang/String;)V\n\tpublic final fun setColorMixIntensity (D)V\n\tpublic final fun setEmissiveStrength (D)V\n\tpublic final fun setOpacity (D)V\n\tpublic final fun updateColor (ID)V\n\tpublic static synthetic fun updateColor$default (Lcom/mapbox/maps/plugin/locationcomponent/model/ModelMaterialPart;IDILjava/lang/Object;)V\n}\n\npublic class com/mapbox/maps/plugin/locationcomponent/model/ModelNodePart : com/mapbox/maps/plugin/locationcomponent/model/ModelPart {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;)V\n\tpublic final fun getNodeOverrides ()Ljava/util/List;\n\tpublic final fun getRotation ()Ljava/util/List;\n\tpublic final fun setRotation (Ljava/util/List;)V\n}\n\npublic abstract class com/mapbox/maps/plugin/locationcomponent/model/ModelPart {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun getFeatureStateId ()Ljava/lang/String;\n\tprotected final fun getUpdateFeatureState ()Lkotlin/jvm/functions/Function1;\n\tprotected final fun setUpdateFeatureState (Lkotlin/jvm/functions/Function1;)V\n}\n\n"
  },
  {
    "path": "plugin-locationcomponent/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.locationcomponent\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    vectorDrawables.useSupportLibrary = true\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-locationcomponent\"\n    artifactTitle = \"The location component module for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-locationcomponent\"\n  }\n}\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(project(\":extension-style\"))\n  implementation(libs.bundles.base.dependencies)\n  implementation(libs.mapbox.geoJSON)\n  implementation(libs.coroutines)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  testImplementation(libs.hamcrest)\n  testImplementation(project(\":plugin-gestures\"))\n  testImplementation(project(\":plugin-animation\"))\n  testImplementation(libs.coroutinesTest)\n\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/DefaultLocationProvider.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.animation.ValueAnimator\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.mapbox.android.core.permissions.PermissionsManager\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.common.Cancelable\nimport com.mapbox.common.location.AccuracyLevel\nimport com.mapbox.common.location.IntervalSettings\nimport com.mapbox.common.location.Location\nimport com.mapbox.common.location.LocationError\nimport com.mapbox.common.location.LocationErrorCode\nimport com.mapbox.common.location.LocationObserver\nimport com.mapbox.common.location.LocationProviderRequest\nimport com.mapbox.common.location.LocationService\nimport com.mapbox.common.location.LocationServiceFactory\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.LocationCompassEngine.CompassListener\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.channels.ProducerScope\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.channels.trySendBlocking\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.callbackFlow\nimport kotlinx.coroutines.flow.emptyFlow\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapNotNull\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.launch\nimport java.util.concurrent.ConcurrentHashMap\n\n/**\n * Default Location Provider implementation that produces location updates according to the device's\n * GPS or magnetic field sensor data.\n */\nclass DefaultLocationProvider @VisibleForTesting(otherwise = PRIVATE) internal constructor(\n  context: Context,\n  private val locationCompassEngine: LocationCompassEngine,\n  locationService: LocationService,\n  private val mainCoroutineDispatcher: CoroutineDispatcher,\n) : LocationProvider {\n  constructor(context: Context) : this(\n    context,\n    LocationCompassEngine(context.applicationContext),\n    LocationServiceFactory.getOrCreate(),\n    Dispatchers.Main.immediate,\n  )\n\n  private var _locationAnimatorOptions: (ValueAnimator.() -> Unit)? = null\n\n  /**\n   * On each location received [locationAnimatorOptions] will be called giving the opportunity to\n   * change the [ValueAnimator] properties.\n   */\n  fun locationAnimatorOptions(options: (ValueAnimator.() -> Unit)?) {\n    _locationAnimatorOptions = options\n  }\n\n  private var locationProviderNotAvailable: LocationError? = null\n\n  private val scope = CoroutineScope(SupervisorJob() + mainCoroutineDispatcher)\n\n  /**\n   * A [MutableStateFlow] that holds the current puck bearing source. Or null to disable listening\n   * for bearing updates completely.\n   */\n  private val puckBearingFlow: MutableStateFlow<PuckBearing?> = MutableStateFlow(PuckBearing.COURSE)\n\n  /**\n   * A hot [Flow] that subscribes to the [locationCompassEngine] to receive device orientation.\n   * It emits degrees.\n   */\n  private val deviceOrientationFlow: Flow<Double> = callbackFlow {\n    val compassListener = CompassListener { userHeading -> trySendBlocking(userHeading.toDouble()) }\n    locationCompassEngine.addCompassListener(compassListener)\n    awaitClose {\n      locationCompassEngine.removeCompassListener(compassListener)\n    }\n  }.shareIn(scope, SharingStarted.WhileSubscribed(replayExpirationMillis = 0L), replay = 1)\n\n  /**\n   * A hot [Flow] that emits [Location]s or [LocationError] wrapped in a [Expected].\n   */\n  private val locationUpdatesFlow: Flow<Location>\n\n  /**\n   * A map that keeps track of each [Job] associated to the [LocationConsumer].\n   *\n   * When [registerLocationConsumer] is called we start a new [Job] and add it to this map.\n   * When [unRegisterLocationConsumer] is called we stop the associated [Job] and remove it from this map.\n   */\n  private val locationConsumersJobs = ConcurrentHashMap<LocationConsumer, Job>()\n\n  init {\n    val request = LocationProviderRequest.Builder()\n      .accuracy(AccuracyLevel.HIGH)\n      .interval(\n        IntervalSettings.Builder()\n          .minimumInterval(LocationComponentConstants.DEFAULT_FASTEST_INTERVAL_MILLIS)\n          .interval(LocationComponentConstants.DEFAULT_INTERVAL_MILLIS).build()\n      )\n      .displacement(LocationComponentConstants.DEFAULT_MINIMUM_DISPLACEMENT_METERS)\n      .build()\n    val result = locationService.getDeviceLocationProvider(request)\n    // Depending on the result we either create a flow that will subscribe to the live tracking\n    // client or create a flow that will emit a LocationError\n    locationUpdatesFlow = if (result.isValue) {\n      val applicationContext = context.applicationContext\n      val locationProvider = result.value!!\n      callbackFlow<Location> {\n\n        // Wait that we have the right permissions\n        var updateDelay = INIT_UPDATE_DELAY\n        while (!PermissionsManager.areLocationPermissionsGranted(applicationContext)) {\n          logW(TAG, MISSING_PERMISSION_MSG)\n          delay(updateDelay)\n          updateDelay = (updateDelay * 2).coerceAtMost(MAX_UPDATE_DELAY)\n        }\n\n        // If possible send the most recent location available\n        val lastLocationCancelable = locationProvider.getLastLocation { result ->\n          result?.let { trySend(it) }\n        }\n\n        // Then, register an observer that will emit the locations provided by the liveTrackingClient\n        val observer = locationObserver(lastLocationCancelable)\n        locationProvider.addLocationObserver(observer)\n        // Finally wait for the flow to close to unregister the observer and stop live tracking\n        awaitClose {\n          locationProvider.removeLocationObserver(observer)\n        }\n      }\n        // Convert this Flow into a hot flow so emissions are shared. That is, instead of each\n        // collector (see registerLocationConsumer) create a new flow, the locations retrieved from\n        // liveTrackingClient will be shared between all collectors.\n        // This flow will replay the last emitted item to new collectors and remains active as long\n        // as there are active collectors.\n        .shareIn(scope, SharingStarted.WhileSubscribed(replayExpirationMillis = 0L), replay = 1)\n    } else {\n      // Live tracking client not available. Create a flow that emits LocationError\n      val error = result.error!!\n      logE(TAG, \"LocationService error: $error\")\n      locationProviderNotAvailable =\n        LocationError(LocationErrorCode.NOT_AVAILABLE, LIVE_TRACKING_CLIENT_NOT_AVAILABLE)\n      emptyFlow()\n    }\n  }\n\n  /**\n   * @return a [LocationObserver] that emits the most recent [Location].\n   */\n  private fun ProducerScope<Location>.locationObserver(\n    lastLocationCancelable: Cancelable?\n  ) =\n    object : LocationObserver {\n      // Keep track of being already canceled to avoid calling native per each location update\n      var lastLocationCanBeCanceled = lastLocationCancelable != null\n\n      override fun onLocationUpdateReceived(locations: List<Location>) {\n        if (lastLocationCanBeCanceled) {\n          lastLocationCancelable?.cancel()\n          lastLocationCanBeCanceled = false\n        }\n        trySendBlocking(locations.last())\n      }\n    }\n\n  /**\n   * Update the data source that drives the bearing updates of the [LocationProvider].\n   *\n   * @param source The [PuckBearing] used to drive the bearing updates. Or null to disable listening\n   * for bearing updates completely.\n   */\n  fun updatePuckBearing(source: PuckBearing?) {\n    // emit the new source if it's different\n    puckBearingFlow.value = source\n  }\n\n  /**\n   * Register the location consumer to the Location Provider.\n   *\n   * The Location Consumer will get location and bearing updates from the Location Provider.\n   *\n   * @param locationConsumer\n   */\n  @SuppressLint(\"MissingPermission\")\n  override fun registerLocationConsumer(locationConsumer: LocationConsumer) {\n    // If there's no location provider we can immediately inform the consumer\n    if (locationProviderNotAvailable != null) {\n      locationConsumer.onError(locationProviderNotAvailable!!)\n    } else {\n      // Otherwise, let's start a series of jobs responsible to collect various signals (altitude,\n      // bearing, horizontal accuracy...) and proxy them to the `locationConsumer`.\n      val previousJob =\n        locationConsumersJobs.put(locationConsumer, collectLocationFlow(locationConsumer))\n      previousJob?.cancel()\n    }\n  }\n\n  /**\n   * Creates a new [Job] responsible to notify [locationConsumer] about the different events: new\n   * location, errors, bearing and accuracy.\n   *\n   * Internally, the created [Job] wraps four coroutines, one per each kind of event.\n   */\n  @OptIn(ExperimentalCoroutinesApi::class)\n  private fun collectLocationFlow(locationConsumer: LocationConsumer): Job =\n    CoroutineScope(Job() + mainCoroutineDispatcher).launch {\n      val locationFlow = locationUpdatesFlow\n      // Second one listens for new locations, converts it to Point and notifies the consumer\n      launch {\n        locationFlow.map {\n          with(it) {\n            altitude?.let { Point.fromLngLat(longitude, latitude, altitude!!) }\n              ?: Point.fromLngLat(longitude, latitude)\n          }\n        }.collect {\n          locationConsumer.onLocationUpdated(\n            it,\n            options = _locationAnimatorOptions\n          )\n        }\n      }\n\n      // Third one is responsible to provide bearing updates. It can get its values from either\n      // the locationCompassEngineFlow or the locationFlow\n      launch {\n        // Listen for changes in the puck bearing source and switch the flow based on it\n        puckBearingFlow.flatMapLatest { puckBearing ->\n          when (puckBearing) {\n            PuckBearing.HEADING -> deviceOrientationFlow\n            PuckBearing.COURSE -> locationFlow.mapNotNull { it.bearing }\n            null -> emptyFlow()\n          }\n        }.collect {\n          locationConsumer.onBearingUpdated(it)\n        }\n      }\n\n      // Finally, notify about accuracy changes if the consumer supports it\n      launch {\n        locationFlow.collect { location: Location ->\n          location.horizontalAccuracy?.let { locationConsumer.onHorizontalAccuracyRadiusUpdated(it) }\n        }\n      }\n    }\n\n  /**\n   * Unregister the location consumer from the Location Provider.\n   *\n   * @param locationConsumer\n   */\n  override fun unRegisterLocationConsumer(locationConsumer: LocationConsumer) {\n    locationConsumersJobs.remove(locationConsumer)?.cancel()\n  }\n\n  /**\n   * Register a listener to be invoked when compass needs to be calibrated.\n   *\n   * @param listener\n   */\n  fun addOnCompassCalibrationListener(listener: LocationCompassCalibrationListener) {\n    locationCompassEngine.addCalibrationListener(listener)\n  }\n\n  /**\n   * Unregister a listener to be invoked when compass needs to be calibrated.\n   *\n   * @param listener\n   */\n  fun removeCompassCalibrationListener(listener: LocationCompassCalibrationListener) {\n    locationCompassEngine.removeCalibrationListener(listener)\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal companion object {\n    private const val TAG = \"MapboxLocationProvider\"\n\n    @VisibleForTesting(otherwise = PRIVATE)\n    internal const val INIT_UPDATE_DELAY = 500L\n\n    @VisibleForTesting(otherwise = PRIVATE)\n    internal const val MAX_UPDATE_DELAY = 5000L\n\n    @VisibleForTesting(otherwise = PRIVATE)\n    internal const val LIVE_TRACKING_CLIENT_NOT_AVAILABLE = \"LiveTrackingClient not available\"\n    private const val MISSING_PERMISSION_MSG =\n      \"Missing location permission, location component will not take effect before location permission is granted.\"\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LayerSourceProvider.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.content.Context\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.LOCATION_INDICATOR_LAYER\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.MODEL_LAYER\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.MODEL_SOURCE\nimport com.mapbox.maps.plugin.locationcomponent.utils.take\nimport java.lang.ref.WeakReference\n\n@OptIn(MapboxExperimental::class)\ninternal object LayerSourceProvider {\n\n  fun getModelSource(locationModelLayerOptions: LocationPuck3D): ModelSourceWrapper {\n    if (locationModelLayerOptions.modelUri.isEmpty()) {\n      throw IllegalArgumentException(\"Model Url must not be empty!\")\n    }\n    return ModelSourceWrapper(\n      sourceId = MODEL_SOURCE,\n      url = locationModelLayerOptions.modelUri,\n      position = locationModelLayerOptions.position.map { it.toDouble() },\n      materialOverrides = locationModelLayerOptions.materialOverrides,\n      nodeOverrides = locationModelLayerOptions.nodeOverrides\n    )\n  }\n\n  fun getModelLayer(locationModelLayerOptions: LocationPuck3D) =\n    ModelLayerWrapper(\n      layerId = MODEL_LAYER,\n      sourceId = MODEL_SOURCE,\n      modelScale = locationModelLayerOptions.modelScale.map { it.toDouble() },\n      modelRotation = locationModelLayerOptions.modelRotation.map { it.toDouble() },\n      modelRotationExpression = locationModelLayerOptions.modelRotationExpression?.let { Value.fromJson(it).take() },\n      modelTranslation = locationModelLayerOptions.modelTranslation.map { it.toDouble() },\n      modelCastShadows = locationModelLayerOptions.modelCastShadows,\n      modelReceiveShadows = locationModelLayerOptions.modelReceiveShadows,\n      modelOpacity = locationModelLayerOptions.modelOpacity.toDouble(),\n      modelOpacityExpression = locationModelLayerOptions.modelOpacityExpression?.let { Value.fromJson(it).take() },\n      modelScaleMode = locationModelLayerOptions.modelScaleMode,\n      modelEmissiveStrength = locationModelLayerOptions.modelEmissiveStrength.toDouble(),\n      modelEmissiveStrengthExpression = locationModelLayerOptions.modelEmissiveStrengthExpression?.let { Value.fromJson(it).take() },\n      modelColor = locationModelLayerOptions.modelColor,\n      modelColorExpression = locationModelLayerOptions.modelColorExpression?.let { Value.fromJson(it).take() },\n      modelColorMixIntensity = locationModelLayerOptions.modelColorMixIntensity.toDouble(),\n      modelColorMixIntensityExpression = locationModelLayerOptions.modelColorMixIntensityExpression?.let { Value.fromJson(it).take() },\n      modelElevationReference = locationModelLayerOptions.modelElevationReference\n    )\n\n  fun getLocationIndicatorLayer() = LocationIndicatorLayerWrapper(LOCATION_INDICATOR_LAYER)\n\n  fun getLocationIndicatorLayerRenderer(puckOptions: LocationPuck2D, weakContext: WeakReference<Context>) =\n    LocationIndicatorLayerRenderer(puckOptions, weakContext)\n\n  fun getModelLayerRenderer(locationModelLayerOptions: LocationPuck3D) =\n    ModelLayerRenderer(this, locationModelLayerOptions)\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationCompassCalibrationListener.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\n/**\n * Callback to receive compass calibration events\n */\nfun interface LocationCompassCalibrationListener {\n  /**\n   * Callback's invoked when compass needs to be calibrated.\n   */\n  fun onCompassCalibrationNeeded()\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationCompassEngine.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.content.Context\nimport android.hardware.Sensor\nimport android.hardware.SensorEvent\nimport android.hardware.SensorEventListener\nimport android.hardware.SensorManager\nimport android.os.SystemClock\nimport android.view.Surface\nimport android.view.WindowManager\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.logW\n\n/**\n * This class handles compass events and tracking the current device heading.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class LocationCompassEngine(context: Context) : SensorEventListener {\n  private val windowManager: WindowManager =\n    context.applicationContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager\n  private val sensorManager: SensorManager =\n    context.applicationContext.getSystemService(Context.SENSOR_SERVICE) as SensorManager\n  private val compassListeners = mutableSetOf<CompassListener>()\n  private val calibrationListeners = mutableSetOf<LocationCompassCalibrationListener>()\n\n  // Not all devices have a compassSensor\n  private var compassSensor: Sensor? = null\n  private var gravitySensor: Sensor? = null\n  private var magneticFieldSensor: Sensor? = null\n\n  private val rotationMatrix = FloatArray(9)\n  private var rotationVectorValue: FloatArray? = null\n  private var compassUpdateNextTimestamp: Long = 0\n  private var gravityValues = FloatArray(3)\n  private var magneticValues = FloatArray(3)\n  private val orientation = FloatArray(3)\n\n  init {\n    compassSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)\n    if (compassSensor == null) {\n      logW(\n        TAG,\n        \"Rotation vector sensor not supported on device, falling back to accelerometer and magnetic field.\"\n      )\n      gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)\n      magneticFieldSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)\n    }\n  }\n\n  internal fun addCompassListener(compassListener: CompassListener) {\n    if (compassListeners.isEmpty()) {\n      registerSensorListeners()\n    }\n    compassListeners.add(compassListener)\n  }\n\n  internal fun removeCompassListener(compassListener: CompassListener) {\n    if (compassListeners.remove(compassListener) && compassListeners.isEmpty()) {\n      unregisterSensorListeners()\n    }\n  }\n\n  fun addCalibrationListener(compassCalibrationListener: LocationCompassCalibrationListener) {\n    calibrationListeners.add(compassCalibrationListener)\n  }\n\n  fun removeCalibrationListener(compassCalibrationListener: LocationCompassCalibrationListener) {\n    calibrationListeners.remove(compassCalibrationListener)\n  }\n\n  override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {\n    if (accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {\n      logW(TAG, \"Compass sensor is unreliable, device calibration is needed.\")\n      for (calibrationListener in calibrationListeners) {\n        calibrationListener.onCompassCalibrationNeeded()\n      }\n    }\n  }\n\n  override fun onSensorChanged(event: SensorEvent) {\n    when (event.sensor.type) {\n      Sensor.TYPE_ROTATION_VECTOR -> {\n        rotationVectorValue = event.values\n      }\n      Sensor.TYPE_ACCELEROMETER -> {\n        gravityValues = lowPassFilter(event.values, gravityValues)\n      }\n      Sensor.TYPE_MAGNETIC_FIELD -> {\n        magneticValues = lowPassFilter(event.values, magneticValues)\n      }\n    }\n    updateOrientation()\n  }\n\n  private fun updateOrientation() {\n    // check when the last time the compass was updated, return if too soon.\n    val currentTime = SystemClock.elapsedRealtime()\n    if (currentTime < compassUpdateNextTimestamp) {\n      return\n    }\n    if (rotationVectorValue != null) {\n      SensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVectorValue)\n    } else {\n      // Get rotation matrix given the gravity and geomagnetic matrices\n      SensorManager.getRotationMatrix(rotationMatrix, null, gravityValues, magneticValues)\n    }\n    val (worldAxisForDeviceAxisX, worldAxisForDeviceAxisY) = getWorldAxisFromRotation()\n    val adjustedRotationMatrix = FloatArray(9)\n    SensorManager.remapCoordinateSystem(\n      rotationMatrix, worldAxisForDeviceAxisX,\n      worldAxisForDeviceAxisY, adjustedRotationMatrix\n    )\n\n    // Transform rotation matrix into azimuth/pitch/roll\n    SensorManager.getOrientation(adjustedRotationMatrix, orientation)\n    val (adjustedWorldAxisForDeviceAxisX, adjustedWorldAxisForDeviceAxisY) = adjustWorldAxis(\n      orientation,\n      worldAxisForDeviceAxisX,\n      worldAxisForDeviceAxisY\n    )\n    SensorManager.remapCoordinateSystem(\n      rotationMatrix, adjustedWorldAxisForDeviceAxisX,\n      adjustedWorldAxisForDeviceAxisY, adjustedRotationMatrix\n    )\n\n    // Transform rotation matrix into azimuth/pitch/roll\n    SensorManager.getOrientation(adjustedRotationMatrix, orientation)\n\n    // The x-axis is all we care about here.\n    notifyCompassChangeListeners(Math.toDegrees(orientation[0].toDouble()).toFloat())\n\n    // Update the compassUpdateNextTimestamp\n    compassUpdateNextTimestamp = currentTime + LocationComponentConstants.COMPASS_UPDATE_RATE_MS\n  }\n\n  @Suppress(\"DEPRECATION\")\n  private fun adjustWorldAxis(\n    orientation: FloatArray,\n    worldAxisForDeviceAxisX: Int,\n    worldAxisForDeviceAxisY: Int\n  ): Pair<Int, Int> {\n    var worldAxisForDeviceAxisX1 = worldAxisForDeviceAxisX\n    var worldAxisForDeviceAxisY1 = worldAxisForDeviceAxisY\n    when {\n      orientation[1] < -Math.PI / 4 -> {\n        // The pitch is less than -45 degrees.\n        // Remap the axes as if the device screen was the instrument panel.\n        when (windowManager.defaultDisplay.rotation) {\n          Surface.ROTATION_90 -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_Z\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_MINUS_X\n          }\n          Surface.ROTATION_180 -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_MINUS_X\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_MINUS_Z\n          }\n          Surface.ROTATION_270 -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_MINUS_Z\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_X\n          }\n          else -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_X\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_Z\n          }\n        }\n      }\n      orientation[1] > Math.PI / 4 -> {\n        // The pitch is larger than 45 degrees.\n        // Remap the axes as if the device screen was upside down and facing back.\n        when (windowManager.defaultDisplay.rotation) {\n          Surface.ROTATION_90 -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_MINUS_Z\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_MINUS_X\n          }\n          Surface.ROTATION_180 -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_MINUS_X\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_Z\n          }\n          Surface.ROTATION_270 -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_Z\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_X\n          }\n          else -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_X\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_MINUS_Z\n          }\n        }\n      }\n      Math.abs(orientation[2]) > Math.PI / 2 -> {\n        // The roll is less than -90 degrees, or is larger than 90 degrees.\n        // Remap the axes as if the device screen was face down.\n        when (windowManager.defaultDisplay.rotation) {\n          Surface.ROTATION_90 -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_MINUS_Y\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_MINUS_X\n          }\n          Surface.ROTATION_180 -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_MINUS_X\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_Y\n          }\n          Surface.ROTATION_270 -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_Y\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_X\n          }\n          else -> {\n            worldAxisForDeviceAxisX1 = SensorManager.AXIS_X\n            worldAxisForDeviceAxisY1 = SensorManager.AXIS_MINUS_Y\n          }\n        }\n      }\n    }\n    return worldAxisForDeviceAxisX1 to worldAxisForDeviceAxisY1\n  }\n\n  private fun getWorldAxisFromRotation(): Pair<Int, Int> {\n    val worldAxisForDeviceAxisX: Int\n    val worldAxisForDeviceAxisY: Int\n    @Suppress(\"DEPRECATION\")\n    when (windowManager.defaultDisplay.rotation) {\n      Surface.ROTATION_90 -> {\n        worldAxisForDeviceAxisX = SensorManager.AXIS_Y\n        worldAxisForDeviceAxisY = SensorManager.AXIS_MINUS_X\n      }\n      Surface.ROTATION_180 -> {\n        worldAxisForDeviceAxisX = SensorManager.AXIS_MINUS_X\n        worldAxisForDeviceAxisY = SensorManager.AXIS_MINUS_Y\n      }\n      Surface.ROTATION_270 -> {\n        worldAxisForDeviceAxisX = SensorManager.AXIS_MINUS_Y\n        worldAxisForDeviceAxisY = SensorManager.AXIS_X\n      }\n      else -> {\n        worldAxisForDeviceAxisX = SensorManager.AXIS_X\n        worldAxisForDeviceAxisY = SensorManager.AXIS_Y\n      }\n    }\n    return worldAxisForDeviceAxisX to worldAxisForDeviceAxisY\n  }\n\n  private fun notifyCompassChangeListeners(heading: Float) {\n    for (compassListener in compassListeners) {\n      compassListener.onCompassChanged(heading)\n    }\n  }\n\n  private fun registerSensorListeners() {\n    if (isCompassSensorAvailable()) {\n      // Does nothing if the sensors already registered.\n      sensorManager.registerListener(\n        this,\n        compassSensor,\n        SENSOR_DELAY_MICROS\n      )\n    } else {\n      sensorManager.registerListener(\n        this,\n        gravitySensor,\n        SENSOR_DELAY_MICROS\n      )\n      sensorManager.registerListener(\n        this,\n        magneticFieldSensor,\n        SENSOR_DELAY_MICROS\n      )\n    }\n  }\n\n  private fun unregisterSensorListeners() {\n    if (isCompassSensorAvailable()) {\n      sensorManager.unregisterListener(this, compassSensor)\n    } else {\n      sensorManager.unregisterListener(this, gravitySensor)\n      sensorManager.unregisterListener(this, magneticFieldSensor)\n    }\n  }\n\n  private fun isCompassSensorAvailable() = compassSensor != null\n\n  /**\n   * Helper function, that filters newValues, considering previous values\n   *\n   * @param newValues      array of float, that contains new data\n   * @param smoothedValues array of float, that contains previous state\n   * @return float filtered array of float\n   */\n  private fun lowPassFilter(newValues: FloatArray, smoothedValues: FloatArray?): FloatArray {\n    if (smoothedValues == null) {\n      return newValues\n    }\n    for (i in newValues.indices) {\n      smoothedValues[i] += ALPHA * (newValues[i] - smoothedValues[i])\n    }\n    return smoothedValues\n  }\n\n  /**\n   * Callback to receive compass update event\n   */\n  fun interface CompassListener {\n    /**\n     * Callback's invoked when a new compass update occurs.\n     *\n     * @param userHeading the new compass heading\n     */\n    fun onCompassChanged(userHeading: Float)\n  }\n\n  private companion object {\n    private const val TAG = \"LocationCompassProvider\"\n\n    // The rate sensor events will be delivered at. As the Android documentation states, this is only\n    // a hint to the system and the events might actually be received faster or slower then this\n    // specified rate. Since the minimum Android API levels about 9, we are able to set this value\n    // ourselves rather than using one of the provided constants which deliver updates too quickly for\n    // our use case. The default is set to 100ms\n    private const val SENSOR_DELAY_MICROS = 100 * 1000\n\n    // Filtering coefficient 0 < ALPHA < 1\n    private const val ALPHA = 0.45f\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationComponentConstants.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\n/**\n * Contains all the constants being used for the [LocationComponentPlugin].\n */\nobject LocationComponentConstants {\n  /**\n   * Controls the compass update rate in milliseconds\n   */\n  const val COMPASS_UPDATE_RATE_MS: Long = 500\n\n  /**\n   * Sets the transition animation duration when switching camera modes.\n   */\n  const val TRANSITION_ANIMATION_DURATION_MS: Long = 750\n\n  /**\n   * Sets the max allowed time for the location icon animation from one LatLng to another.\n   */\n  const val MAX_ANIMATION_DURATION_MS: Long = 2000\n\n  /**\n   * Sets the duration of change of accuracy radius when a different value is provided.\n   */\n  const val ACCURACY_RADIUS_ANIMATION_DURATION: Long = 250\n\n  /**\n   * Default animation duration for zooming while tracking.\n   */\n  const val DEFAULT_TRACKING_ZOOM_ANIM_DURATION: Long = 750\n\n  /**\n   * Default animation duration for updating padding while tracking.\n   */\n  const val DEFAULT_TRACKING_PADDING_ANIM_DURATION: Long = 750\n\n  /**\n   * Default animation duration for tilting while tracking.\n   */\n  const val DEFAULT_TRACKING_TILT_ANIM_DURATION: Long = 1250\n\n  /**\n   * Threshold value to perform immediate camera/layer position update.\n   */\n  const val INSTANT_LOCATION_TRANSITION_THRESHOLD = 50000.0\n\n  /**\n   * Default interval between location updates\n   */\n  const val DEFAULT_INTERVAL_MILLIS: Long = 1000\n\n  /**\n   * Default fastest acceptable interval between location updates\n   */\n  const val DEFAULT_FASTEST_INTERVAL_MILLIS: Long = 1000\n\n  /**\n   * Default minimum displacement between location updates in meters.\n   */\n  const val DEFAULT_MINIMUM_DISPLACEMENT_METERS: Float = 0.1f\n  // Layers\n  /**\n   * Layer ID of the location indicator layer.\n   */\n  const val LOCATION_INDICATOR_LAYER = \"mapbox-location-indicator-layer\"\n\n  /**\n   * Source ID of the background source.\n   */\n  const val MODEL_SOURCE = \"mapbox-location-model-source\"\n\n  /**\n   * Layer ID of the location background layer.\n   */\n  const val MODEL_LAYER = \"mapbox-location-model-layer\"\n\n  // Icons\n  /**\n   * Image ID for the top icon of the location indicator layer.\n   */\n  const val TOP_ICON = \"mapbox-location-top-icon\"\n\n  /**\n   * Image ID for the shadow icon of the location indicator layer.\n   */\n  const val SHADOW_ICON = \"mapbox-location-shadow-icon\"\n\n  /**\n   * Image ID for the bearing icon of the location indicator layer.\n   */\n  const val BEARING_ICON = \"mapbox-location-bearing-icon\"\n\n  /**\n   * Control maximum radius for pulsing puck to follow location accuracy’s radius.\n   */\n  const val PULSING_MAX_RADIUS_FOLLOW_ACCURACY = -1f\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationComponentExt.kt",
    "content": "@file:JvmName(\"LocationComponentUtils\")\n\npackage com.mapbox.maps.plugin.locationcomponent\n\nimport android.content.Context\nimport androidx.annotation.DrawableRes\nimport androidx.annotation.RestrictTo\nimport androidx.core.content.res.ResourcesCompat\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val to get the LocationComponentPlugin instance.\n */\nval MapPluginProviderDelegate.location: LocationComponentPlugin\n  @JvmName(\"getLocationComponent\")\n  get() = this.getPlugin(Plugin.MAPBOX_LOCATION_COMPONENT_PLUGIN_ID)!!\n\nprivate fun Context.getCompatDrawable(@DrawableRes resId: Int) = ResourcesCompat.getDrawable(\n  this.resources,\n  resId,\n  null\n)\n\n/**\n * Create a [LocationPuck2D] instance with or without an arrow bearing image.\n * @param withBearing if true, the location puck will show an arrow bearing image, default is false.\n */\n@JvmOverloads\nfun createDefault2DPuck(\n  withBearing: Boolean = false\n): LocationPuck2D = LocationPuck2D(\n  topImage = ImageHolder.from(R.drawable.mapbox_user_icon),\n  bearingImage = if (withBearing)\n    ImageHolder.from(R.drawable.mapbox_user_bearing_icon)\n  else\n    ImageHolder.from(R.drawable.mapbox_user_stroke_icon),\n  shadowImage = if (withBearing)\n    ImageHolder.from(R.drawable.mapbox_user_stroke_icon)\n  else\n    ImageHolder.from(R.drawable.mapbox_user_icon_shadow)\n)\n\n/**\n * Static method to create instance of Mapbox location component plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createLocationComponentPlugin(): LocationComponentPlugin {\n  return LocationComponentPluginImpl()\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationComponentPluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.mapbox.common.location.LocationError\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxLocationComponentException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.RenderedQueryGeometry\nimport com.mapbox.maps.RenderedQueryOptions\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.LOCATION_INDICATOR_LAYER\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.MODEL_LAYER\nimport com.mapbox.maps.plugin.locationcomponent.animators.PuckAnimatorManager\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentAttributeParser\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettingsBase\nimport com.mapbox.maps.plugin.locationcomponent.model.AnimatableModel\nimport java.lang.ref.WeakReference\nimport java.util.concurrent.CopyOnWriteArraySet\n\n/**\n * Default implementation of the LocationComponentPlugin, it renders the configured location puck\n * to the user's current location.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class LocationComponentPluginImpl : LocationComponentPlugin, LocationConsumer,\n  LocationComponentSettingsBase() {\n  private lateinit var delegateProvider: MapDelegateProvider\n\n  private lateinit var weakContext: WeakReference<Context>\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var locationPuckManager: LocationPuckManager? = null\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var locationProvider: LocationProvider? = null\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var isLocationComponentActivated = false\n\n  private var lastIndicatorPosition: Point? = null\n\n  private var lastIndicatorBearing: Double? = null\n\n  private var lastIndicatorAccuracyRadius: Double? = null\n\n  private val onIndicatorPositionChangedListeners =\n    CopyOnWriteArraySet<OnIndicatorPositionChangedListener>()\n\n  private val onIndicatorBearingChangedListeners =\n    CopyOnWriteArraySet<OnIndicatorBearingChangedListener>()\n\n  private val onIndicatorAccuracyRadiusChangedListeners =\n    CopyOnWriteArraySet<OnIndicatorAccuracyRadiusChangedListener>()\n\n  /**\n   * Adds a listener that gets invoked when indicator position changes.\n   *\n   * @param listener Listener that gets invoked when indicator position changes\n   */\n  override fun addOnIndicatorPositionChangedListener(listener: OnIndicatorPositionChangedListener) {\n    onIndicatorPositionChangedListeners.add(listener)\n    lastIndicatorPosition?.let {\n      listener.onIndicatorPositionChanged(it)\n    }\n  }\n\n  /**\n   * Removes a listener that gets invoked when indicator position changes.\n   *\n   * @param listener Listener that gets invoked when indicator position changes.\n   */\n  override fun removeOnIndicatorPositionChangedListener(listener: OnIndicatorPositionChangedListener) {\n    onIndicatorPositionChangedListeners.remove(listener)\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal val indicatorPositionChangedListener = OnIndicatorPositionChangedListener {\n    lastIndicatorPosition = it\n    for (listener in onIndicatorPositionChangedListeners) {\n      listener.onIndicatorPositionChanged(it)\n    }\n  }\n\n  /**\n   * Adds a listener that gets invoked when indicator bearing changes.\n   *\n   * @param listener Listener that gets invoked when indicator bearing changes\n   */\n  override fun addOnIndicatorBearingChangedListener(listener: OnIndicatorBearingChangedListener) {\n    onIndicatorBearingChangedListeners.add(listener)\n    lastIndicatorBearing?.let {\n      listener.onIndicatorBearingChanged(it)\n    }\n  }\n\n  /**\n   * Removes a listener that gets invoked when indicator bearing changes.\n   *\n   * @param listener Listener that gets invoked when indicator bearing changes.\n   */\n  override fun removeOnIndicatorBearingChangedListener(listener: OnIndicatorBearingChangedListener) {\n    onIndicatorBearingChangedListeners.remove(listener)\n  }\n\n  /**\n   * Adds a listener that gets invoked when indicator accuracy radius changes.\n   *\n   * @param listener Listener that gets invoked when indicator accuracy radius changes\n   */\n  override fun addOnIndicatorAccuracyRadiusChangedListener(listener: OnIndicatorAccuracyRadiusChangedListener) {\n    onIndicatorAccuracyRadiusChangedListeners.add(listener)\n    lastIndicatorAccuracyRadius?.let {\n      listener.onIndicatorAccuracyRadiusChanged(it)\n    }\n  }\n\n  /**\n   * Removes a listener that gets invoked when indicator accuracy radius changes.\n   *\n   * @param listener Listener that gets invoked when indicator accuracy radius changes.\n   */\n  override fun removeOnIndicatorAccuracyRadiusChangedListener(listener: OnIndicatorAccuracyRadiusChangedListener) {\n    onIndicatorAccuracyRadiusChangedListeners.remove(listener)\n  }\n\n  /**\n   * Check whether the rendered location puck is on the given point.\n   *\n   * @param point the point to validate\n   * @param listener Listener that gets invoked when the validation finished.\n   */\n  override fun isLocatedAt(point: Point, listener: PuckLocatedAtPointListener) {\n    delegateProvider.mapFeatureQueryDelegate.queryRenderedFeatures(\n      RenderedQueryGeometry(delegateProvider.mapCameraManagerDelegate.pixelForCoordinate(point)),\n      RenderedQueryOptions(\n        listOf(\n          LOCATION_INDICATOR_LAYER,\n          MODEL_LAYER\n        ),\n        null\n      )\n    ) { expected ->\n      expected.value?.let {\n        if (it.isNotEmpty()) {\n          listener.onResult(true)\n        } else {\n          listener.onResult(false)\n        }\n      }\n      expected.error?.let {\n        throw MapboxLocationComponentException(it)\n      }\n    }\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal val indicatorBearingChangedListener = OnIndicatorBearingChangedListener {\n    lastIndicatorBearing = it\n    for (listener in onIndicatorBearingChangedListeners) {\n      listener.onIndicatorBearingChanged(it)\n    }\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal val indicatorAccuracyRadiusChangedListener = OnIndicatorAccuracyRadiusChangedListener {\n    lastIndicatorAccuracyRadius = it\n    for (listener in onIndicatorAccuracyRadiusChangedListeners) {\n      listener.onIndicatorAccuracyRadiusChanged(it)\n    }\n  }\n\n  /**\n   * Set the LocationProvider, it will replace the default location provider provided by the LocationComponentPlugin.\n   */\n  override fun setLocationProvider(locationProvider: LocationProvider) {\n    this.locationProvider?.unRegisterLocationConsumer(this)\n    this.locationProvider = locationProvider\n    if (isLocationComponentActivated) {\n      locationProvider.registerLocationConsumer(this)\n    }\n  }\n\n  /**\n   * Get the current LocationProvider under usage with the LocationComponentPlugin.\n   *\n   * @return The location provider currently under usage, and will return null if the location component plugin is not enabled and not initialised.\n   */\n  override fun getLocationProvider(): LocationProvider? {\n    return locationProvider\n  }\n\n  /**\n   * Called whenever activity's/fragment's lifecycle is entering a \"started\" state.\n   */\n  override fun onStart() {\n    activateLocationComponent()\n  }\n\n  private fun activateLocationComponent() {\n    if (internalSettings.enabled) {\n      val style = delegateProvider.mapStyleManagerDelegate\n      if (locationPuckManager?.isLayerInitialised() == true && isLocationComponentActivated) {\n        return\n      }\n      if (locationPuckManager == null) {\n        locationPuckManager = LocationPuckManager(\n          settings = internalSettings,\n          weakContext = weakContext,\n          delegateProvider = delegateProvider,\n          positionManager = LocationComponentPositionManager(\n            style,\n            internalSettings.layerAbove,\n            internalSettings.layerBelow\n          ),\n          animationManager = PuckAnimatorManager(\n            indicatorPositionChangedListener,\n            indicatorBearingChangedListener,\n            indicatorAccuracyRadiusChangedListener,\n            style.pixelRatio\n          )\n        )\n      }\n      locationPuckManager?.initialize(style)\n      locationPuckManager?.onStart()\n      locationProvider?.registerLocationConsumer(this)\n      isLocationComponentActivated = true\n    }\n  }\n\n  /**\n   * Called whenever activity's/fragment's lifecycle is entering a \"stopped\" state.\n   */\n  override fun onStop() {\n    isLocationComponentActivated = false\n    locationPuckManager?.onStop()\n    locationProvider?.unRegisterLocationConsumer(this)\n  }\n\n  private fun deactivateLocationComponent() {\n    locationPuckManager?.cleanUp()\n    locationPuckManager = null\n    locationProvider?.unRegisterLocationConsumer(this)\n    isLocationComponentActivated = false\n  }\n\n  /**\n   * Bind the ViewPlugin with current map context. This will create a View that\n   * will be added to the MapView.\n   *\n   * @param context The hosting context\n   * @param attrs parent attributes\n   * @param pixelRatio the pixel ratio of the device\n   * @return View that will be added to the MapView\n   */\n  override fun bind(context: Context, attrs: AttributeSet?, pixelRatio: Float) {\n    this.weakContext = WeakReference(context)\n    internalSettings =\n      LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, pixelRatio)\n\n    if (internalSettings.enabled && locationProvider == null) {\n      locationProvider = DefaultLocationProvider(context.applicationContext).apply {\n        updatePuckBearingSettings(internalSettings)\n      }\n    }\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal fun bind(\n    context: Context,\n    attrs: AttributeSet?,\n    pixelRatio: Float,\n    locationProvider: LocationProvider,\n    locationPuckManager: LocationPuckManager\n  ) {\n    this.weakContext = WeakReference(context)\n    this.internalSettings =\n      LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, pixelRatio)\n    this.locationProvider = locationProvider\n    this.locationPuckManager = locationPuckManager\n  }\n\n  /**\n   * Called whenever the location is updated.\n   * @param location - supports multiple points to create more complex animations with intermediate points.\n   *  Last [location] value will always be the animator target for next animation.\n   * @param options - if specified explicitly will apply current animator option to single location update animation.\n   *  Otherwise default animator options will be used.\n   */\n  override fun onLocationUpdated(vararg location: Point, options: (ValueAnimator.() -> Unit)?) {\n    locationPuckManager?.updateCurrentPosition(*location, options = options)\n  }\n\n  /**\n   * Called whenever the bearing is updated.\n   * @param bearing - supports multiple bearing values to create more complex animations with intermediate points.\n   *  Last [bearing] value will always be the animator target for next animation.\n   * @param options - if specified explicitly will apply current animator option to single location bearing animation.\n   *  Otherwise default animator options will be used.\n   */\n  override fun onBearingUpdated(vararg bearing: Double, options: (ValueAnimator.() -> Unit)?) {\n    locationPuckManager?.updateCurrentBearing(*bearing, options = options)\n  }\n\n  /**\n   * Called whenever the horizontal accuracy radius is updated.\n   * @param radius - supports multiple radius value to create more complex animations with intermediate points.\n   *  Last [radius] value will always be the animator target for next animation.\n   * @param options - if specified explicitly will apply current animator option to radius animation.\n   *  Otherwise default animator options will be used.\n   */\n  override fun onHorizontalAccuracyRadiusUpdated(\n    vararg radius: Double,\n    options: (ValueAnimator.() -> Unit)?\n  ) {\n    locationPuckManager?.updateHorizontalAccuracyRadius(*radius, options = options)\n  }\n\n  /**\n   * Update [ValueAnimator] options that will be used to animate between [Point] updates by default.\n   * This will apply to all upcoming updates.\n   */\n  override fun onPuckLocationAnimatorDefaultOptionsUpdated(options: ValueAnimator.() -> Unit) {\n    locationPuckManager?.updateLocationAnimator(options)\n  }\n\n  /**\n   * Update [ValueAnimator] options that will be used to animate between bearing [Double] updates by default.\n   * This will apply to all upcoming updates.\n   */\n  override fun onPuckBearingAnimatorDefaultOptionsUpdated(options: ValueAnimator.() -> Unit) {\n    locationPuckManager?.updateBearingAnimator(options)\n  }\n\n  /**\n   * Called whenever there is an error with the location provider.\n   * @param error The actual [LocationError]\n   */\n  override fun onError(error: LocationError) {\n    locationPuckManager?.onLocationError(error)\n  }\n\n  /**\n   * Update [ValueAnimator] options that will be used to animate between accuracy radius [Double] updates by default.\n   * This will apply to all upcoming updates.\n   */\n  override fun onPuckAccuracyRadiusAnimatorDefaultOptionsUpdated(options: ValueAnimator.() -> Unit) {\n    locationPuckManager?.updateAccuracyRadiusAnimator(options)\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    this.delegateProvider = delegateProvider\n  }\n\n  /**\n   * Called when a new Style is loaded.\n   *\n   * @param style\n   */\n  override fun onStyleChanged(style: MapboxStyleManager) {\n    locationPuckManager?.updateStyle(style)\n  }\n\n  override lateinit var internalSettings: LocationComponentSettings\n\n  /**\n   * Apply the changes to the LocationComponentSettings to the LocationComponentPlugin.\n   */\n  override fun applySettings() {\n    if (internalSettings.enabled && !isLocationComponentActivated) {\n      weakContext.get()?.let {\n        if (locationProvider == null) {\n          locationProvider = DefaultLocationProvider(it)\n        }\n        activateLocationComponent()\n      }\n    }\n    if (internalSettings.enabled) {\n      locationPuckManager?.updateSettings(internalSettings)\n      (locationProvider as? DefaultLocationProvider)?.updatePuckBearingSettings(internalSettings)\n    } else {\n      deactivateLocationComponent()\n    }\n  }\n\n  private fun DefaultLocationProvider.updatePuckBearingSettings(internalSettings: LocationComponentSettings) {\n    val puckBearingSource =\n      internalSettings.puckBearing.takeIf { internalSettings.puckBearingEnabled }\n    updatePuckBearing(puckBearingSource)\n  }\n\n  @OptIn(MapboxExperimental::class)\n  internal fun bindToAnimatableModel(animatableModel: AnimatableModel) {\n    animatableModel.bindTo(delegateProvider.mapFeatureStateDelegate)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationComponentPositionManager.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxStyleManager\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class LocationComponentPositionManager(\n  private var style: MapboxStyleManager,\n  internal var layerAbove: String?,\n  internal var layerBelow: String?\n) {\n  /**\n   * Returns true whenever layer above/below configuration has changed and requires re-layout.\n   */\n  fun update(layerAbove: String?, layerBelow: String?): Boolean {\n    val requiresUpdate =\n      (\n        !(this.layerAbove == layerAbove || this.layerAbove != null && this.layerAbove == layerAbove) ||\n          !(this.layerBelow == layerBelow || this.layerBelow != null && this.layerBelow == layerBelow)\n        )\n    this.layerAbove = layerAbove\n    this.layerBelow = layerBelow\n    return requiresUpdate\n  }\n\n  fun addLayerToMap(layer: LocationLayerWrapper) {\n    when {\n      layerAbove != null -> layer.bindTo(style, LayerPosition(layerAbove, null, null))\n      layerBelow != null -> layer.bindTo(style, LayerPosition(null, layerBelow, null))\n      else -> layer.bindTo(style, null)\n    }\n  }\n\n  fun updateStyle(style: MapboxStyleManager) {\n    this.style = style\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationIndicatorLayerRenderer.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.content.Context\nimport androidx.annotation.ColorInt\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.BEARING_ICON\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.LOCATION_INDICATOR_LAYER\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.SHADOW_ICON\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.TOP_ICON\nimport com.mapbox.maps.plugin.locationcomponent.utils.BitmapUtils\nimport java.lang.ref.WeakReference\nimport java.text.DecimalFormat\nimport java.text.NumberFormat\nimport java.util.Locale\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class LocationIndicatorLayerRenderer(\n  private val puckOptions: LocationPuck2D,\n  private val weakContext: WeakReference<Context>,\n  private val layer: LocationIndicatorLayerWrapper = LayerSourceProvider.getLocationIndicatorLayer()\n) : LocationLayerRenderer {\n\n  private var style: MapboxStyleManager? = null\n\n  override fun initializeComponents(style: MapboxStyleManager) {\n    this.style = style\n    setupBitmaps(style)\n  }\n\n  override fun isRendererInitialised(): Boolean {\n    return style?.styleLayerExists(LOCATION_INDICATOR_LAYER) ?: false\n  }\n\n  override fun addLayers(positionManager: LocationComponentPositionManager) {\n    positionManager.addLayerToMap(layer)\n  }\n\n  override fun removeLayers() {\n    style?.removeStyleLayer(layer.layerId)\n  }\n\n  override fun hide() {\n    setLayerVisibility(false)\n  }\n\n  override fun show() {\n    setLayerVisibility(true)\n  }\n\n  override fun styleAccuracy(accuracyColor: Int, accuracyBorderColor: Int) {\n    val colorArray: FloatArray = colorToRgbaArray(accuracyColor)\n    val borderColorArray: FloatArray = colorToRgbaArray(accuracyBorderColor)\n    val rgbaExpression = buildRGBAExpression(colorArray)\n    val borderRgbaExpression = buildRGBAExpression(borderColorArray)\n    layer.accuracyRadiusColor(rgbaExpression)\n    layer.accuracyRadiusBorderColor(borderRgbaExpression)\n  }\n\n  override fun setLatLng(latLng: Point) {\n    setLayerLocation(latLng)\n  }\n\n  override fun setBearing(bearing: Double) {\n    setLayerBearing(bearing)\n  }\n\n  override fun setAccuracyRadius(accuracy: Float) {\n    layer.accuracyRadius(accuracy.toDouble())\n  }\n\n  override fun styleScaling(scaleExpression: Value) {\n    layer.shadowImageSize(scaleExpression)\n    layer.bearingImageSize(scaleExpression)\n    layer.topImageSize(scaleExpression)\n  }\n\n  override fun slot(slot: String?) {\n    layer.slot(slot)\n  }\n\n  private fun setupBitmaps(style: MapboxStyleManager) {\n    addImageToStyle(style, TOP_ICON, puckOptions.topImage)\n    addImageToStyle(style, BEARING_ICON, puckOptions.bearingImage)\n    addImageToStyle(style, SHADOW_ICON, puckOptions.shadowImage)\n    layer.topImage(TOP_ICON)\n    layer.bearingImage(BEARING_ICON)\n    layer.shadowImage(SHADOW_ICON)\n    layer.opacity(puckOptions.opacity.toDouble())\n  }\n\n  private fun addImageToStyle(style: MapboxStyleManager, iconId: String, imageHolder: ImageHolder?) {\n    // First try to use the bitmap directly\n    imageHolder?.bitmap?.let { bitmap ->\n      style.addImage(iconId, bitmap)\n      return\n    }\n    // Otherwise, let's try to get the bitmap from the drawable resource ID\n    weakContext.get()?.let { context ->\n      imageHolder?.drawableId?.let { drawableRes ->\n        BitmapUtils.getBitmapFromDrawableRes(context, drawableRes)?.let { bitmap ->\n          style.addImage(iconId, bitmap)\n        }\n      } ?: logE(TAG, \"No image holder data for $iconId!\")\n    } ?: logE(\n      TAG,\n      \"Could not set 2D puck image as drawable for $iconId\" +\n        \" because there is no Android Context!\"\n    )\n  }\n\n  override fun clearBitmaps() {\n    style?.removeStyleImage(TOP_ICON)\n    style?.removeStyleImage(BEARING_ICON)\n    style?.removeStyleImage(SHADOW_ICON)\n  }\n\n  override fun updateStyle(style: MapboxStyleManager) {\n    this.style = style\n    layer.updateStyle(style)\n  }\n\n  private fun setLayerVisibility(visible: Boolean) {\n    layer.visibility(visible)\n  }\n\n  private fun setLayerLocation(latLng: Point) {\n    val values = listOf(latLng.latitude(), latLng.longitude(), 0.0)\n    layer.location(values)\n  }\n\n  private fun setLayerBearing(bearing: Double) {\n    layer.bearing(bearing)\n  }\n\n  /**\n   * Adjust the visibility of the pulsing LocationComponent circle.\n   */\n  override fun adjustPulsingCircleLayerVisibility(visible: Boolean) {\n    if (!visible) {\n      layer.emphasisCircleRadius(0.0)\n    }\n  }\n\n  /**\n   * Adjust the visual appearance of the pulsing LocationComponent circle.\n   */\n  override fun updatePulsingUi(\n    @ColorInt\n    pulsingColorInt: Int,\n    radius: Float,\n    opacity: Float?\n  ) {\n    val rgbaArray = colorToRgbaArray(pulsingColorInt)\n    rgbaArray[3] = opacity ?: 1f\n    layer.emphasisCircleRadius(radius.toDouble())\n    layer.emphasisCircleColor(buildRGBAExpression(rgbaArray))\n  }\n\n  companion object {\n\n    private const val TAG = \"LocationPuck2D\"\n\n    fun buildRGBAExpression(colorArray: FloatArray): List<Value> {\n      return arrayListOf(\n        Value(\"rgba\"),\n        Value(colorArray[0].toDouble()),\n        Value(colorArray[1].toDouble()),\n        Value(colorArray[2].toDouble()),\n        Value(colorArray[3].toDouble())\n      )\n    }\n\n    fun colorIntToRgbaExpression(@ColorInt color: Int): List<Value> {\n      val numberFormat =\n        NumberFormat.getNumberInstance(Locale.US)\n      val decimalFormat = numberFormat as DecimalFormat\n      decimalFormat.applyPattern(\"#.###\")\n      val alpha =\n        decimalFormat.format((color shr 24 and 0xFF).toFloat() / 255.0f.toDouble())\n      return arrayListOf(\n        Value(\"rgba\"),\n        Value((color shr 16 and 0xFF).toLong()),\n        Value((color shr 8 and 0xFF).toLong()),\n        Value((color and 0xFF).toLong()),\n        Value(alpha.toDouble())\n      )\n    }\n\n    fun colorToRgbaArray(@ColorInt color: Int): FloatArray {\n      return floatArrayOf(\n        (color shr 16 and 0xFF.toFloat().toInt()).toFloat(), // r (0-255)\n        (color shr 8 and 0xFF.toFloat().toInt()).toFloat(), // g (0-255)\n        (color and 0xFF.toFloat().toInt()).toFloat(), // b (0-255)\n        (color shr 24 and 0xFF) / 255.0f // a (0-1)\n      )\n    }\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationIndicatorLayerWrapper.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class LocationIndicatorLayerWrapper(layerId: String) : LocationLayerWrapper(layerId) {\n\n  init {\n    layerProperties[\"id\"] = Value(layerId)\n    layerProperties[\"type\"] = Value(\"location-indicator\")\n    layerProperties[\"location-transition\"] = buildTransition(delay = 0, duration = 0)\n    layerProperties[\"bearing-transition\"] = buildTransition(delay = 0, duration = 0)\n    layerProperties[\"perspective-compensation\"] = Value(0.9)\n    layerProperties[\"image-pitch-displacement\"] = Value(4.0)\n  }\n\n  private fun buildTransition(delay: Long = 0, duration: Long = 0): Value {\n    val transition = HashMap<String, Value>()\n    transition[\"delay\"] = Value(delay)\n    transition[\"duration\"] = Value(duration)\n    return Value(transition)\n  }\n\n  fun bearing(bearing: Double) = updateProperty(\"bearing\", Value(bearing))\n\n  fun slot(slot: String?) = updateProperty(\"slot\", Value(slot ?: \"\"))\n\n  fun location(location: List<Double>) = updateProperty(\"location\", Value(location.map(::Value)))\n\n  fun accuracyRadiusColor(expression: List<Value>) = updateProperty(\"accuracy-radius-color\", Value(expression))\n\n  fun accuracyRadiusBorderColor(expression: List<Value>) = updateProperty(\"accuracy-radius-border-color\", Value(expression))\n\n  fun shadowImageSize(shadowImageSizeExpression: Value) = updateProperty(\"shadow-image-size\", shadowImageSizeExpression)\n\n  fun bearingImageSize(bearingImageSizeExpression: Value) = updateProperty(\"bearing-image-size\", bearingImageSizeExpression)\n\n  fun topImageSize(topImageSizeExpression: Value) = updateProperty(\"top-image-size\", topImageSizeExpression)\n\n  fun accuracyRadius(accuracyRadius: Double) = updateProperty(\"accuracy-radius\", Value(accuracyRadius))\n\n  fun emphasisCircleRadius(emphasisCircleRadius: Double) = updateProperty(\"emphasis-circle-radius\", Value(emphasisCircleRadius))\n\n  fun emphasisCircleColorTransition(delay: Long = 0, duration: Long = 0) {\n    val transition = buildTransition(delay, duration)\n    updateProperty(\"emphasis-circle-color-transition\", transition)\n  }\n\n  fun emphasisCircleColor(emphasisCircleColorExpression: List<Value>) = updateProperty(\"emphasis-circle-color\", Value(emphasisCircleColorExpression))\n\n  fun topImage(topImage: String) = updateProperty(\"top-image\", Value(topImage))\n\n  fun bearingImage(bearingImage: String) = updateProperty(\"bearing-image\", Value(bearingImage))\n\n  fun shadowImage(shadowImage: String) = updateProperty(\"shadow-image\", Value(shadowImage))\n\n  fun opacity(opacity: Double) = updateProperty(\"location-indicator-opacity\", Value(opacity))\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationLayerRenderer.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport androidx.annotation.ColorInt\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxStyleManager\n\ninternal interface LocationLayerRenderer {\n  fun initializeComponents(style: MapboxStyleManager)\n\n  fun isRendererInitialised(): Boolean\n\n  fun addLayers(positionManager: LocationComponentPositionManager)\n\n  fun removeLayers()\n\n  fun hide()\n\n  fun show()\n\n  fun styleAccuracy(accuracyColor: Int, accuracyBorderColor: Int)\n\n  fun setLatLng(latLng: Point)\n\n  fun setBearing(bearing: Double)\n\n  fun setAccuracyRadius(accuracy: Float)\n\n  fun styleScaling(scaleExpression: Value)\n\n  fun adjustPulsingCircleLayerVisibility(visible: Boolean)\n\n  fun updatePulsingUi(\n    @ColorInt\n    pulsingColorInt: Int,\n    radius: Float,\n    opacity: Float?\n  )\n\n  fun clearBitmaps()\n\n  fun updateStyle(style: MapboxStyleManager)\n\n  fun slot(slot: String?)\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationLayerWrapper.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxLocationComponentException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.logE\n\ninternal open class LocationLayerWrapper(val layerId: String) {\n\n  protected var layerProperties = HashMap<String, Value>()\n  private var style: MapboxStyleManager? = null\n\n  fun updateStyle(style: MapboxStyleManager) {\n    this.style = style\n  }\n\n  fun bindTo(style: MapboxStyleManager, position: LayerPosition? = null) {\n    this.style = style\n    val expected = style.addPersistentStyleLayer(toValue(), position)\n    expected.error?.let {\n      throw MapboxLocationComponentException(\"Add layer failed: $it\")\n    }\n  }\n\n  protected fun updateProperty(propertyName: String, value: Value) {\n    layerProperties[propertyName] = value\n    style?.let { style ->\n      val expected = style.setStyleLayerProperty(layerId, propertyName, value)\n      expected.error?.let {\n        logE(TAG, \"Set layer property \\\"${propertyName}\\\" failed:\\nError: $it\\nValue set: $value\")\n      }\n    }\n  }\n\n  fun toValue() = Value(layerProperties)\n\n  fun visibility(visibility: Boolean) = updateProperty(\"visibility\", Value(if (visibility) \"visible\" else \"none\"))\n\n  companion object {\n    private const val TAG = \"MapboxLocationLayerWrapper\"\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationPuckManager.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.location.LocationError\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.locationcomponent.animators.PuckAnimatorManager\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings\nimport com.mapbox.maps.plugin.locationcomponent.utils.take\nimport java.lang.ref.WeakReference\nimport kotlin.math.abs\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class LocationPuckManager(\n  var settings: LocationComponentSettings,\n  private val weakContext: WeakReference<Context>,\n  private val delegateProvider: MapDelegateProvider,\n  private val positionManager: LocationComponentPositionManager,\n  private val animationManager: PuckAnimatorManager\n) {\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var isHidden = true\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var lastLocation: Point? = null\n\n  private val onLocationUpdated: ((Point) -> Unit) = {\n    lastLocation = it\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var lastBearing: Double = delegateProvider.mapCameraManagerDelegate.cameraState.bearing\n  private val onBearingUpdated: ((Double) -> Unit) = {\n    lastBearing = it\n  }\n\n  private val disablePuckAnimationOnEnd = object : AnimatorListenerAdapter() {\n    override fun onAnimationEnd(animation: Animator) {\n      animationManager.puckAnimationEnabled = false\n      animation.removeListener(this)\n    }\n  }\n\n  private var lastAccuracyRadius: Double = 0.0\n  private val onAccuracyRadiusUpdated: ((Double) -> Unit) = {\n    lastAccuracyRadius = it\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var locationLayerRenderer = getLocationLayerRenderer(settings)\n\n  private fun getLocationLayerRenderer(settings: LocationComponentSettings) = when (val puck = settings.locationPuck) {\n    is LocationPuck2D -> {\n      LayerSourceProvider.getLocationIndicatorLayerRenderer(puck, weakContext)\n    }\n\n    is LocationPuck3D -> {\n      LayerSourceProvider.getModelLayerRenderer(puck)\n    }\n  }\n\n  fun updateStyle(style: MapboxStyleManager) {\n    locationLayerRenderer.updateStyle(style)\n    positionManager.updateStyle(style)\n  }\n\n  fun initialize(style: MapboxStyleManager) {\n    if (!locationLayerRenderer.isRendererInitialised()) {\n      animationManager.setUpdateListeners(\n        onLocationUpdated,\n        onBearingUpdated,\n        onAccuracyRadiusUpdated\n      )\n      animationManager.setLocationLayerRenderer(locationLayerRenderer)\n      animationManager.applySettings(settings)\n      lastLocation?.let {\n        updateCurrentPosition(it)\n      }\n      updateCurrentBearing(lastBearing, forceUpdate = true)\n      locationLayerRenderer.addLayers(positionManager)\n      locationLayerRenderer.initializeComponents(style)\n      styleScaling(settings)\n      if (lastLocation != null && settings.enabled) {\n        show(forceUpdate = true)\n      } else {\n        hide()\n      }\n      if (settings.showAccuracyRing) {\n        updateHorizontalAccuracyRadius(lastAccuracyRadius)\n      }\n    }\n  }\n\n  fun cleanUp() {\n    hide()\n    animationManager.onStop()\n    locationLayerRenderer.clearBitmaps()\n    locationLayerRenderer.removeLayers()\n  }\n\n  fun isLayerInitialised(): Boolean {\n    return locationLayerRenderer.isRendererInitialised()\n  }\n\n  fun updateSettings(settings: LocationComponentSettings) {\n    this.settings = settings\n    positionManager.layerAbove = settings.layerAbove\n    positionManager.layerBelow = settings.layerBelow\n    locationLayerRenderer.clearBitmaps()\n    locationLayerRenderer.removeLayers()\n    locationLayerRenderer = getLocationLayerRenderer(settings)\n    locationLayerRenderer.slot(settings.slot)\n    initialize(delegateProvider.mapStyleManagerDelegate)\n  }\n\n  //\n  // Animations\n  //\n\n  fun onStart() {\n    animationManager.onStart()\n  }\n\n  fun onStop() {\n    animationManager.onStop()\n  }\n\n  fun updateCurrentPosition(vararg points: Point, options: (ValueAnimator.() -> Unit)? = null) {\n    if (settings.enabled) {\n      show()\n    }\n    val targets = lastLocation?.let {\n      arrayOf(it, *points)\n    } ?: arrayOf(*points, *points)\n    animationManager.animatePosition(\n      *targets,\n      options = options\n    )\n  }\n\n  fun updateCurrentBearing(\n    vararg bearings: Double,\n    options: (ValueAnimator.() -> Unit)? = null,\n    forceUpdate: Boolean = false\n  ) {\n    if (settings.puckBearingEnabled) {\n      animationManager.puckAnimationEnabled = true\n      animateToBearing(bearings, options, forceUpdate)\n    } else if (animationManager.puckAnimationEnabled) {\n      animateToBearing(\n        doubleArrayOf(0.0),\n        options = {\n          duration = 0\n          addListener(disablePuckAnimationOnEnd)\n        },\n        forceUpdate\n      )\n    }\n  }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  fun animateToBearing(\n    bearings: DoubleArray,\n    options: (ValueAnimator.() -> Unit)? = null,\n    forceUpdate: Boolean\n  ) {\n    // Skip bearing updates if the change from the lastBearing is too small, thus avoid unnecessary calls to gl-native.\n    if (!forceUpdate && abs(bearings.last() - lastBearing) < BEARING_UPDATE_THRESHOLD) {\n      return\n    }\n    val targets = doubleArrayOf(lastBearing, *bearings)\n    animationManager.animateBearing(\n      *targets,\n      options = options\n    )\n  }\n\n  fun updateHorizontalAccuracyRadius(vararg radius: Double, options: (ValueAnimator.() -> Unit)? = null) {\n    val targets = doubleArrayOf(lastAccuracyRadius, *radius)\n    animationManager.animateAccuracyRadius(\n      *targets,\n      options = options\n    )\n    updateMaxPulsingRadiusToFollowAccuracyRing(radius.last())\n  }\n\n  /**\n   * Update maximum radius for pulsing puck to follow location accuracy radius.\n   * since pulsing radius is in pixels and location accuracy is in meters, we convert meters to pixel using\n   * projection delegate.\n   */\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal fun updateMaxPulsingRadiusToFollowAccuracyRing(radius: Double) {\n    if (settings.pulsingMaxRadius.toInt() == LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY.toInt()) {\n      val metersPerPixelAtLocation =\n        delegateProvider.mapProjectionDelegate.getMetersPerPixelAtLatitude(\n          delegateProvider.mapCameraManagerDelegate.cameraState.center.latitude(),\n          delegateProvider.mapCameraManagerDelegate.cameraState.zoom\n        )\n      animationManager.updatePulsingRadius(radius / metersPerPixelAtLocation, settings)\n    }\n  }\n\n  fun updateLocationAnimator(block: ValueAnimator.() -> Unit) {\n    animationManager.updatePositionAnimator(block)\n  }\n\n  fun updateBearingAnimator(block: ValueAnimator.() -> Unit) {\n    animationManager.updateBearingAnimator(block)\n  }\n\n  fun updateAccuracyRadiusAnimator(block: ValueAnimator.() -> Unit) {\n    animationManager.updateAccuracyRadiusAnimator(block)\n  }\n\n  fun onLocationError(error: LocationError) {\n    logW(TAG, \"Location error: $error\")\n  }\n\n  //\n  // Layer action\n  //\n  fun show(forceUpdate: Boolean = false) {\n    if (forceUpdate || isHidden) {\n      isHidden = false\n      locationLayerRenderer.show()\n    }\n  }\n\n  fun hide() {\n    isHidden = true\n    locationLayerRenderer.hide()\n  }\n\n  /**\n   * Function to set scaling for [LocationPuck].\n   */\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal fun styleScaling(settings: LocationComponentSettings) {\n    when (val puck = settings.locationPuck) {\n      is LocationPuck2D -> {\n        puck.scaleExpression\n      }\n      is LocationPuck3D -> {\n        puck.modelScaleExpression\n      }\n    }?.let {\n      locationLayerRenderer.styleScaling(Value.fromJson(it).take())\n    }\n  }\n\n  private companion object {\n    // Skip bearing updates if the change from the lastBearing is too small, thus avoid unnecessary bearing animations.\n    const val BEARING_UPDATE_THRESHOLD = 1.0\n    const val TAG = \"LocationPuckManager\"\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/ModelLayerRenderer.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.MODEL_LAYER\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.MODEL_SOURCE\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class ModelLayerRenderer(\n  layerSourceProvider: LayerSourceProvider,\n  private val locationModelLayerOptions: LocationPuck3D\n) : LocationLayerRenderer {\n\n  private var style: MapboxStyleManager? = null\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var lastLocation: Point? = null\n  private var lastBearing: Double = 0.0\n  private var modelLayer = layerSourceProvider.getModelLayer(locationModelLayerOptions)\n  private var source = layerSourceProvider.getModelSource(locationModelLayerOptions)\n\n  override fun initializeComponents(style: MapboxStyleManager) {\n    this.style = style\n    source.bindTo(style)\n  }\n\n  override fun isRendererInitialised(): Boolean {\n    return isLayerInitialised() && isSourceInitialised()\n  }\n\n  private fun isLayerInitialised(): Boolean {\n    return style?.styleLayerExists(MODEL_LAYER) ?: false\n  }\n\n  private fun isSourceInitialised(): Boolean {\n    return style?.styleSourceExists(MODEL_SOURCE) ?: false\n  }\n\n  override fun addLayers(positionManager: LocationComponentPositionManager) {\n    positionManager.addLayerToMap(modelLayer)\n  }\n\n  override fun removeLayers() {\n    style?.removeStyleLayer(modelLayer.layerId)\n    style?.removeStyleSource(source.sourceId)\n  }\n\n  override fun hide() {\n    setLayerVisibility(false)\n  }\n\n  override fun show() {\n    setLayerVisibility(true)\n  }\n\n  override fun styleAccuracy(accuracyColor: Int, accuracyBorderColor: Int) {\n  }\n\n  override fun setLatLng(latLng: Point) {\n    setLayerLocation(latLng)\n  }\n\n  override fun setBearing(bearing: Double) {\n    setLayerBearing(bearing)\n  }\n\n  override fun setAccuracyRadius(accuracy: Float) {\n  }\n\n  override fun styleScaling(scaleExpression: Value) {\n    modelLayer.modelScaleExpression(scaleExpression)\n  }\n\n  private fun setLayerVisibility(visible: Boolean) {\n    modelLayer.visibility(visible)\n  }\n\n  private fun setLayerLocation(latLng: Point) {\n    lastLocation = latLng\n    updateLocationOrBearing()\n  }\n\n  private fun setLayerBearing(bearing: Double) {\n    lastBearing = bearing\n    updateLocationOrBearing()\n  }\n\n  private fun updateLocationOrBearing() {\n    lastLocation?.let { location ->\n      val lngLat = listOf(location.longitude(), location.latitude())\n      val orientation = listOf(0.0, 0.0, lastBearing)\n      source.setPositionAndOrientation(lngLat, orientation)\n    }\n  }\n\n  /**\n   * Adjust the visibility of the pulsing LocationComponent circle.\n   */\n  override fun adjustPulsingCircleLayerVisibility(visible: Boolean) {\n  }\n\n  /**\n   * Adjust the visual appearance of the pulsing LocationComponent circle.\n   */\n  override fun updatePulsingUi(pulsingColorInt: Int, radius: Float, opacity: Float?) {\n  }\n\n  override fun clearBitmaps() {\n  }\n\n  override fun slot(slot: String?) {\n    modelLayer.slot(slot)\n  }\n\n  override fun updateStyle(style: MapboxStyleManager) {\n    this.style = style\n    modelLayer.updateStyle(style)\n    source.updateStyle(style)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/ModelLayerWrapper.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.plugin.ModelElevationReference\nimport com.mapbox.maps.plugin.ModelScaleMode\n\n@OptIn(MapboxExperimental::class)\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class ModelLayerWrapper(\n  layerId: String,\n  sourceId: String,\n  modelScale: List<Double>,\n  modelRotation: List<Double>,\n  modelRotationExpression: Value?,\n  modelTranslation: List<Double>,\n  modelCastShadows: Boolean,\n  modelReceiveShadows: Boolean,\n  modelOpacity: Double,\n  modelOpacityExpression: Value?,\n  modelScaleMode: ModelScaleMode,\n  modelEmissiveStrength: Double,\n  modelEmissiveStrengthExpression: Value?,\n  modelColor: Int,\n  modelColorExpression: Value?,\n  modelColorMixIntensity: Double,\n  modelColorMixIntensityExpression: Value?,\n  modelElevationReference: ModelElevationReference,\n) : LocationLayerWrapper(layerId) {\n  init {\n    layerProperties[\"id\"] = Value(layerId)\n    layerProperties[\"type\"] = Value(\"model\")\n    layerProperties[\"source\"] = Value(sourceId)\n    layerProperties[\"model-type\"] = Value(\"location-indicator\")\n    layerProperties[\"model-scale\"] = Value(modelScale.map(::Value))\n    layerProperties[\"model-rotation\"] = modelRotationExpression ?: Value(modelRotation.map(::Value))\n    layerProperties[\"model-translation\"] = Value(modelTranslation.map(::Value))\n    layerProperties[\"model-cast-shadows\"] = Value(modelCastShadows)\n    layerProperties[\"model-receive-shadows\"] = Value(modelReceiveShadows)\n    layerProperties[\"model-opacity\"] = modelOpacityExpression ?: Value(modelOpacity)\n    layerProperties[\"model-scale-mode\"] = Value(modelScaleMode.value)\n    layerProperties[\"model-scale-transition\"] = buildTransition(delay = 0, duration = 0)\n    layerProperties[\"model-rotation-transition\"] = buildTransition(delay = 0, duration = 0)\n    layerProperties[\"model-emissive-strength\"] = modelEmissiveStrengthExpression ?: Value(modelEmissiveStrength)\n    layerProperties[\"model-color\"] = modelColorExpression ?: colorIntToRgbaExpression(modelColor)\n    layerProperties[\"model-color-mix-intensity\"] = modelColorMixIntensityExpression ?: Value(modelColorMixIntensity)\n    layerProperties[\"model-elevation-reference\"] = Value(modelElevationReference.value)\n  }\n\n  private fun buildTransition(delay: Long, duration: Long): Value {\n    val transition = HashMap<String, Value>()\n    transition[\"delay\"] = Value(delay)\n    transition[\"duration\"] = Value(duration)\n    return Value(transition)\n  }\n\n  fun modelScale(scale: List<Double>) = updateProperty(\"model-scale\", Value(scale.map(::Value)))\n\n  fun modelScaleExpression(scaleExpression: Value) = updateProperty(\"model-scale\", scaleExpression)\n\n  fun modelRotation(rotation: List<Double>) = updateProperty(\"model-rotation\", Value(rotation.map(::Value)))\n\n  fun modelTranslation(translation: List<Double>) = updateProperty(\"model-translation\", Value(translation.map(::Value)))\n\n  fun modelOpacity(opacity: Double) = updateProperty(\"model-opacity\", Value(opacity))\n\n  fun modelScaleMode(modelScaleMode: ModelScaleMode) = updateProperty(\"model-scale-mode\", Value(modelScaleMode.value))\n\n  fun modelElevationReference(modelElevationReference: ModelElevationReference) = updateProperty(\"model-elevation-reference\", Value(modelElevationReference.value))\n\n  fun slot(slot: String?) = updateProperty(\"slot\", Value(slot ?: \"\"))\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/ModelSourceWrapper.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxLocationComponentException\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class ModelSourceWrapper(\n  val sourceId: String,\n  private var url: String,\n  position: List<Double>,\n  materialOverrides: List<String>,\n  nodeOverrides: List<String>\n) {\n\n  private var sourceProperties = HashMap<String, Value>()\n  private var style: MapboxStyleManager? = null\n\n  init {\n    val modelProperties = HashMap<String, Value>()\n    modelProperties[URL] = Value(url)\n    modelProperties[POSITION] = Value(position.map(::Value))\n    modelProperties[ORIENTATION] = Value(listOf(0.0, 0.0, 0.0).map(::Value))\n    modelProperties[MATERIAL_OVERRIDES] = Value(materialOverrides.map(::Value))\n    modelProperties[NODE_OVERRIDES] = Value(nodeOverrides.map(::Value))\n\n    val models = HashMap<String, Value>()\n    models[DEFAULT_MODEL_NAME] = Value(modelProperties)\n\n    sourceProperties[\"type\"] = Value(TYPE)\n    sourceProperties[MODELS] = Value(models)\n  }\n\n  fun updateStyle(style: MapboxStyleManager) {\n    this.style = style\n  }\n\n  fun bindTo(style: MapboxStyleManager) {\n    this.style = style\n    val expected = style.addStyleSource(sourceId, toValue())\n    expected.error?.let {\n      logW(TAG, \"Add source failed, $sourceProperties\")\n      throw MapboxLocationComponentException(\"Add source failed: $it\")\n    }\n  }\n\n  fun setPositionAndOrientation(lngLat: List<Double>, orientation: List<Double>) {\n    val property = hashMapOf(\n      POSITION to Value(lngLat.map(::Value)),\n      ORIENTATION to Value(orientation.map(::Value)),\n      URL to Value(url)\n    )\n    val updateModel = hashMapOf(DEFAULT_MODEL_NAME to Value(property))\n    updateProperty(MODELS, Value(updateModel))\n  }\n\n  fun toValue() = Value(sourceProperties)\n\n  private fun updateProperty(propertyName: String, value: Value) {\n    sourceProperties[propertyName] = value\n    style?.let { style ->\n      val expected = style.setStyleSourceProperty(\n        sourceId,\n        propertyName,\n        value\n      )\n      expected.error?.let {\n        logE(TAG, \"Set source property \\\"${propertyName}\\\" failed:\\nError: $it\\nValue set: $value\")\n      }\n    }\n  }\n\n  companion object {\n    /** The name of default model*/\n    const val DEFAULT_MODEL_NAME = \"defaultModel\"\n\n    /** The key for models*/\n    const val MODELS = \"models\"\n\n    /** The key for source type*/\n    const val TYPE = \"model\"\n\n    /** The property key of url*/\n    const val URL = \"uri\"\n\n    /** The property key of position*/\n    const val POSITION = \"position\"\n\n    /** The property key of orientation*/\n    const val ORIENTATION = \"orientation\"\n\n    const val MATERIAL_OVERRIDES = \"materialOverrides\"\n\n    const val NODE_OVERRIDES = \"nodeOverrides\"\n\n    private const val TAG = \"Mbgl-ModelSourceWrapper\"\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/animators/Evaluators.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.animation.TypeEvaluator\nimport com.mapbox.geojson.Point\n\ninternal object Evaluators {\n  /**\n   * Type evaluator for Point data\n   */\n  val POINT = TypeEvaluator<Point> { fraction, startValue, endValue ->\n    val longitude = startValue.longitude() + fraction * (endValue.longitude() - startValue.longitude())\n    val latitude = startValue.latitude() + fraction * (endValue.latitude() - startValue.latitude())\n    if (startValue.hasAltitude() && endValue.hasAltitude()) {\n      Point.fromLngLat(\n        longitude,\n        latitude,\n        startValue.altitude() + fraction * (endValue.altitude() - startValue.altitude()),\n      )\n    } else {\n      Point.fromLngLat(longitude, latitude)\n    }\n  }\n\n  /**\n   * Type evaluator for Double data\n   */\n  val DOUBLE = TypeEvaluator<Double> { fraction, startValue, endValue ->\n    startValue + fraction * (endValue - startValue)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckAccuracyRadiusAnimator.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.graphics.Color\nimport androidx.annotation.ColorInt\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorAccuracyRadiusChangedListener\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class PuckAccuracyRadiusAnimator(private val accuracyRadiusChangedListener: OnIndicatorAccuracyRadiusChangedListener) :\n  PuckAnimator<Double>(Evaluators.DOUBLE) {\n\n  @ColorInt\n  internal var accuracyCircleColor = Color.BLUE\n  @ColorInt\n  internal var accuracyCircleBorderColor = Color.BLUE\n\n  override fun updateLayer(fraction: Float, value: Double) {\n    if (enabled) {\n      val resolvedValue = 0f.coerceAtLeast(value.toFloat())\n      locationRenderer?.setAccuracyRadius(resolvedValue)\n      locationRenderer?.styleAccuracy(accuracyCircleColor, accuracyCircleBorderColor)\n      accuracyRadiusChangedListener.onIndicatorAccuracyRadiusChanged(value)\n    } else {\n      locationRenderer?.setAccuracyRadius(0f)\n    }\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckAnimator.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.TypeEvaluator\nimport android.animation.ValueAnimator\nimport android.annotation.SuppressLint\nimport android.view.animation.LinearInterpolator\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants\nimport com.mapbox.maps.plugin.locationcomponent.LocationLayerRenderer\nimport com.mapbox.maps.threading.AnimationThreadController\n\n@OptIn(MapboxExperimental::class)\n@SuppressLint(\"Recycle\")\ninternal abstract class PuckAnimator<T>(\n  evaluator: TypeEvaluator<T>\n) : ValueAnimator() {\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var updateListener: ((T) -> Unit)? = null\n  @VisibleForTesting(otherwise = PRIVATE)\n  internal var userConfiguredAnimator: ValueAnimator\n  protected var locationRenderer: LocationLayerRenderer? = null\n  internal open var enabled = false\n\n  abstract fun updateLayer(fraction: Float, value: T)\n\n  init {\n    setObjectValues(emptyArray<Any>())\n    setEvaluator(evaluator)\n    addUpdateListener {\n      AnimationThreadController.postOnMainThread {\n        @Suppress(\"UNCHECKED_CAST\")\n        val updatedValue = it.animatedValue as T\n        updateLayer(it.animatedFraction, updatedValue)\n        updateListener?.invoke(updatedValue)\n      }\n    }\n    duration = LocationComponentConstants.DEFAULT_INTERVAL_MILLIS\n    interpolator = DEFAULT_INTERPOLATOR\n    userConfiguredAnimator = clone()\n    // workaround for bug in Android 12 described in\n    // https://github.com/mapbox/mapbox-maps-android/issues/1446\n    userConfiguredAnimator.duration = duration\n  }\n\n  /**\n   * Set the animator object values\n   *\n   * @param values varags of object values\n   */\n  final override fun setObjectValues(vararg values: Any?) {\n    super.setObjectValues(*values)\n  }\n\n  /**\n   * Set the animator evaluator\n   *\n   * @param value the animator type evaluator\n   */\n  final override fun setEvaluator(value: TypeEvaluator<*>?) {\n    super.setEvaluator(value)\n  }\n\n  /**\n   * Adds a listener to the set of listeners that are sent update events through the life of\n   * an animation. This method is called on all listeners for every frame of the animation,\n   * after the values for the animation have been calculated.\n   *\n   * @param listener the listener to be added to the current set of listeners for this animation.\n   */\n  final override fun addUpdateListener(listener: AnimatorUpdateListener?) {\n    super.addUpdateListener(listener)\n  }\n\n  final override fun clone(): ValueAnimator {\n    return super.clone()\n  }\n\n  fun setUpdateListener(updateListener: ((T) -> Unit)) {\n    if (this.updateListener != updateListener) {\n      this.updateListener = updateListener\n    }\n  }\n\n  fun setLocationLayerRenderer(renderer: LocationLayerRenderer) {\n    locationRenderer = renderer\n  }\n\n  fun animate(\n    vararg targets: T,\n    options: (ValueAnimator.() -> Unit)? = null\n  ) {\n    cancelRunning()\n    if (options == null) {\n      setObjectValues(*targets)\n      AnimationThreadController.postOnAnimatorThread {\n        start()\n      }\n    } else {\n      options.invoke(userConfiguredAnimator)\n      userConfiguredAnimator.setObjectValues(*targets)\n      AnimationThreadController.postOnAnimatorThread {\n        userConfiguredAnimator.start()\n      }\n    }\n  }\n\n  fun updateOptions(block: ValueAnimator.() -> Unit) {\n    if (isRunning) {\n      addListener(object : AnimatorListenerAdapter() {\n\n        override fun onAnimationEnd(animation: Animator, isReverse: Boolean) {\n          super.onAnimationEnd(animation, isReverse)\n          block.invoke(this@PuckAnimator)\n          removeListener(this)\n        }\n      })\n    } else {\n      block.invoke(this@PuckAnimator)\n    }\n  }\n\n  fun cancelRunning() {\n    AnimationThreadController.postOnAnimatorThread {\n      if (isRunning) {\n        cancel()\n      }\n      if (userConfiguredAnimator.isRunning) {\n        userConfiguredAnimator.cancel()\n      }\n    }\n  }\n\n  companion object {\n    private val DEFAULT_INTERPOLATOR = LinearInterpolator()\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckAnimatorManager.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport androidx.annotation.VisibleForTesting.Companion.PRIVATE\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.plugin.locationcomponent.*\nimport com.mapbox.maps.plugin.locationcomponent.LocationLayerRenderer\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings\nimport com.mapbox.maps.util.MathUtils\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class PuckAnimatorManager(\n  indicatorPositionChangedListener: OnIndicatorPositionChangedListener,\n  indicatorBearingChangedListener: OnIndicatorBearingChangedListener,\n  indicatorAccuracyRadiusChangedListener: OnIndicatorAccuracyRadiusChangedListener,\n  pixelRatio: Float\n) {\n  private var bearingAnimator = PuckBearingAnimator(indicatorBearingChangedListener)\n  private var positionAnimator = PuckPositionAnimator(indicatorPositionChangedListener)\n  private var accuracyRadiusAnimator =\n    PuckAccuracyRadiusAnimator(indicatorAccuracyRadiusChangedListener)\n  private var pulsingAnimator = PuckPulsingAnimator(pixelRatio)\n\n  internal var puckAnimationEnabled: Boolean\n    get() = bearingAnimator.enabled\n    set(value) {\n      bearingAnimator.enabled = value\n    }\n\n  @VisibleForTesting(otherwise = PRIVATE)\n  constructor(\n    indicatorPositionChangedListener: OnIndicatorPositionChangedListener,\n    indicatorBearingChangedListener: OnIndicatorBearingChangedListener,\n    indicatorAccuracyRadiusChangedListener: OnIndicatorAccuracyRadiusChangedListener,\n    bearingAnimator: PuckBearingAnimator,\n    positionAnimator: PuckPositionAnimator,\n    pulsingAnimator: PuckPulsingAnimator,\n    radiusAnimator: PuckAccuracyRadiusAnimator,\n    pixelRatio: Float\n  ) : this(\n    indicatorPositionChangedListener,\n    indicatorBearingChangedListener,\n    indicatorAccuracyRadiusChangedListener,\n    pixelRatio\n  ) {\n    this.bearingAnimator = bearingAnimator\n    this.positionAnimator = positionAnimator\n    this.pulsingAnimator = pulsingAnimator\n    this.accuracyRadiusAnimator = radiusAnimator\n  }\n\n  fun setLocationLayerRenderer(renderer: LocationLayerRenderer) {\n    bearingAnimator.setLocationLayerRenderer(renderer)\n    positionAnimator.setLocationLayerRenderer(renderer)\n    pulsingAnimator.setLocationLayerRenderer(renderer)\n    accuracyRadiusAnimator.setLocationLayerRenderer(renderer)\n  }\n\n  fun setUpdateListeners(\n    onLocationUpdated: ((Point) -> Unit),\n    onBearingUpdated: ((Double) -> Unit),\n    onAccuracyRadiusUpdated: ((Double) -> Unit)\n  ) {\n    positionAnimator.setUpdateListener(onLocationUpdated)\n    bearingAnimator.setUpdateListener(onBearingUpdated)\n    accuracyRadiusAnimator.setUpdateListener(onAccuracyRadiusUpdated)\n  }\n\n  fun onStart() {\n    if (pulsingAnimator.enabled) {\n      pulsingAnimator.animateInfinite()\n    }\n  }\n\n  fun onStop() {\n    bearingAnimator.cancelRunning()\n    positionAnimator.cancelRunning()\n    pulsingAnimator.cancelRunning()\n    accuracyRadiusAnimator.cancelRunning()\n  }\n\n  fun animateBearing(\n    vararg targets: Double,\n    options: (ValueAnimator.() -> Unit)?\n  ) {\n    bearingAnimator.animate(\n      *MathUtils.prepareOptimalBearingPath(targets).toTypedArray(),\n      options = options\n    )\n  }\n\n  fun animatePosition(\n    vararg targets: Point,\n    options: (ValueAnimator.() -> Unit)?\n  ) {\n    positionAnimator.animate(*targets, options = options)\n  }\n\n  fun animateAccuracyRadius(\n    vararg targets: Double,\n    options: (ValueAnimator.() -> Unit)?\n  ) {\n    accuracyRadiusAnimator.animate(*targets.toTypedArray(), options = options)\n  }\n\n  fun updatePulsingRadius(target: Double, settings: LocationComponentSettings) {\n    pulsingAnimator.apply {\n      enabled = settings.pulsingEnabled\n      if (settings.pulsingEnabled) {\n        maxRadius = target\n        animateInfinite()\n      } else {\n        cancelRunning()\n      }\n    }\n  }\n\n  fun applySettings(settings: LocationComponentSettings) {\n    pulsingAnimator.apply {\n      enabled = settings.pulsingEnabled\n      maxRadius = settings.pulsingMaxRadius.toDouble()\n      pulsingColor = settings.pulsingColor\n      if (settings.pulsingEnabled) {\n        animateInfinite()\n      } else {\n        cancelRunning()\n      }\n    }\n    accuracyRadiusAnimator.apply {\n      enabled = settings.showAccuracyRing\n      accuracyCircleColor = settings.accuracyRingColor\n      accuracyCircleBorderColor = settings.accuracyRingBorderColor\n    }\n  }\n\n  fun updateBearingAnimator(block: ValueAnimator.() -> Unit) {\n    bearingAnimator.updateOptions(block)\n  }\n\n  fun updatePositionAnimator(block: ValueAnimator.() -> Unit) {\n    positionAnimator.updateOptions(block)\n  }\n\n  fun updateAccuracyRadiusAnimator(block: ValueAnimator.() -> Unit) {\n    accuracyRadiusAnimator.updateOptions(block)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckBearingAnimator.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class PuckBearingAnimator(private val indicatorBearingChangedListener: OnIndicatorBearingChangedListener) : PuckAnimator<Double>(Evaluators.DOUBLE) {\n\n  override var enabled = true\n\n  override fun updateLayer(fraction: Float, value: Double) {\n    if (enabled) {\n      locationRenderer?.setBearing(value)\n      indicatorBearingChangedListener.onIndicatorBearingChanged(value)\n    }\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckPositionAnimator.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class PuckPositionAnimator(private val indicatorPositionChangedListener: OnIndicatorPositionChangedListener) : PuckAnimator<Point>(Evaluators.POINT) {\n\n  override fun updateLayer(fraction: Float, value: Point) {\n    locationRenderer?.setLatLng(value)\n    indicatorPositionChangedListener.onIndicatorPositionChanged(value)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckPulsingAnimator.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.graphics.Color\nimport androidx.annotation.ColorInt\nimport androidx.annotation.RestrictTo\nimport androidx.core.view.animation.PathInterpolatorCompat\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class PuckPulsingAnimator(private val pixelRatio: Float = 1.0f) :\n  PuckAnimator<Double>(Evaluators.DOUBLE) {\n  var maxRadius: Double = DEFAULT_RADIUS_DP * pixelRatio\n\n  @ColorInt\n  var pulsingColor: Int = Color.BLUE\n  private var pulseFadeEnabled = true\n\n  init {\n    duration = PULSING_DEFAULT_DURATION\n    repeatMode = RESTART\n    repeatCount = INFINITE\n    interpolator = PULSING_DEFAULT_INTERPOLATOR\n  }\n\n  fun animateInfinite() {\n    if (maxRadius <= 0.0) {\n      maxRadius = DEFAULT_RADIUS_DP * pixelRatio\n    }\n    if (!isRunning) {\n      animate(0.0, maxRadius)\n    }\n    addListener(object : AnimatorListenerAdapter() {\n      override fun onAnimationRepeat(animation: Animator) {\n        super.onAnimationRepeat(animation)\n        setObjectValues(0.0, maxRadius)\n      }\n    })\n  }\n\n  override fun updateLayer(fraction: Float, value: Double) {\n    var opacity = 1.0f\n    if (pulseFadeEnabled) {\n      opacity = (1.0f - (value / maxRadius).toFloat()).coerceIn(0.0f, 1.0f)\n    }\n    locationRenderer?.updatePulsingUi(\n      pulsingColor,\n      value.toFloat(),\n      if (fraction <= 0.1f) 0f else opacity\n    )\n  }\n\n  internal companion object {\n    const val PULSING_DEFAULT_DURATION = 3_000L\n    const val DEFAULT_RADIUS_DP = 10.0\n    private val PULSING_DEFAULT_INTERPOLATOR = PathInterpolatorCompat.create(\n      0.0f,\n      0.0f,\n      0.25f,\n      1.0f\n    )\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentAttributeParser.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.locationcomponent.generated\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport com.mapbox.maps.ImageHolder.Companion.from\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport com.mapbox.maps.plugin.ModelElevationReference\nimport com.mapbox.maps.plugin.ModelScaleMode\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.mapbox.maps.plugin.locationcomponent.R\nimport com.mapbox.maps.plugin.locationcomponent.createDefault2DPuck\n\n/**\n * Utility class for parsing [AttributeSet] to [LocationComponentSettings].\n */\ninternal object LocationComponentAttributeParser {\n  /**\n   * Parse [AttributeSet] to [LocationComponentSettings].\n   *\n   * @param context Context\n   * @param attrs AttributionSet\n   */\n  @OptIn(com.mapbox.maps.MapboxExperimental::class)\n  fun parseLocationComponentSettings(context: Context, attrs: AttributeSet?, pixelRatio: Float = 1.0f): LocationComponentSettings {\n    val typedArray = context.obtainStyledAttributes(attrs, R.styleable.mapbox_MapView, 0, 0)\n    try {\n      val puckBearingEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_locationComponentPuckBearingEnabled, false)\n      return LocationComponentSettings(\n        locationPuck = when (typedArray.getInt(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuck, -1)) {\n          0 -> LocationPuck2D(\n            topImage = typedArray.getResourceId(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck2DTopImage, -1).takeIf { it != -1 }?.let { from(it) },\n            bearingImage = typedArray.getResourceId(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck2DBearingImage, -1).takeIf { it != -1 }?.let { from(it) },\n            shadowImage = typedArray.getResourceId(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck2DShadowImage, -1).takeIf { it != -1 }?.let { from(it) },\n            scaleExpression = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck2DScaleExpression),\n            opacity = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck2DOpacity, 1f),\n          )\n          1 -> LocationPuck3D(\n            modelUri = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelUri)\n              ?: throw IllegalArgumentException(\"model-uri must be specified in order to use 3d location puck.\"),\n            position = listOf(\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DPosition_lon, 0.0f),\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DPosition_lat, 0.0f),\n            ),\n            modelOpacity = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelOpacity, 1f),\n            modelScale = listOf(\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelScale_x, 1.0f),\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelScale_y, 1.0f),\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelScale_z, 1.0f),\n            ),\n            modelScaleExpression = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelScaleExpression),\n            modelTranslation = listOf(\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelTranslation_lon, 0.0f),\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelTranslation_lat, 0.0f),\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelTranslation_z, 0.0f),\n            ),\n            modelRotation = listOf(\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelRotation_x, 0.0f),\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelRotation_y, 0.0f),\n              typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelRotation_z, 90.0f),\n            ),\n            modelCastShadows = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelCastShadows, true),\n            modelReceiveShadows = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelReceiveShadows, true),\n            modelScaleMode = ModelScaleMode.values()[typedArray.getInt(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelScaleMode, ModelScaleMode.VIEWPORT.ordinal)],\n            modelEmissiveStrength = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelEmissiveStrength, 1f),\n            modelEmissiveStrengthExpression = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelEmissiveStrengthExpression),\n            modelOpacityExpression = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelOpacityExpression),\n            modelRotationExpression = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelRotationExpression),\n            modelColor = typedArray.getColor(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelColor, Color.parseColor(\"#ffffff\")),\n            modelColorExpression = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelColorExpression),\n            modelColorMixIntensity = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelColorMixIntensity, 0f),\n            modelColorMixIntensityExpression = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelColorMixIntensityExpression),\n            materialOverrides = try {\n              typedArray.resources.getStringArray(typedArray.getResourceId(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DMaterialOverrides, 0)).toList()\n            } catch (e: Exception) {\n              emptyList()\n            },\n            nodeOverrides = try {\n              typedArray.resources.getStringArray(typedArray.getResourceId(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DNodeOverrides, 0)).toList()\n            } catch (e: Exception) {\n              emptyList()\n            },\n            modelElevationReference = ModelElevationReference.values()[typedArray.getInt(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelElevationReference, ModelElevationReference.GROUND.ordinal)],\n            modelColorUseTheme = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelColorUseTheme) ?: \"default\",\n            modelColorUseThemeExpression = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLocationPuckLocationPuck3DModelColorUseThemeExpression),\n          )\n          else -> createDefault2DPuck(withBearing = puckBearingEnabled)\n        }\n    ) {\n        enabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_locationComponentEnabled, false)\n        pulsingEnabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_locationComponentPulsingEnabled, false)\n        pulsingColor = typedArray.getColor(R.styleable.mapbox_MapView_mapbox_locationComponentPulsingColor, Color.parseColor(\"#4A90E2\"))\n        pulsingMaxRadius = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_locationComponentPulsingMaxRadius, 10f * pixelRatio)\n        showAccuracyRing = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_locationComponentShowAccuracyRing, false)\n        accuracyRingColor = typedArray.getColor(R.styleable.mapbox_MapView_mapbox_locationComponentAccuracyRingColor, Color.parseColor(\"#4d89cff0\"))\n        accuracyRingBorderColor = typedArray.getColor(R.styleable.mapbox_MapView_mapbox_locationComponentAccuracyRingBorderColor, Color.parseColor(\"#4d89cff0\"))\n        layerAbove = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLayerAbove)\n        layerBelow = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentLayerBelow)\n        this.puckBearingEnabled = puckBearingEnabled\n        puckBearing = PuckBearing.values()[typedArray.getInt(R.styleable.mapbox_MapView_mapbox_locationComponentPuckBearing, 0)]\n        slot = typedArray.getString(R.styleable.mapbox_MapView_mapbox_locationComponentSlot)\n      }\n    } finally {\n      typedArray.recycle()\n    }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/model/AnimatableModel.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.model\n\nimport android.annotation.SuppressLint\nimport androidx.annotation.ColorInt\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.extension.style.expressions.dsl.generated.literal\nimport com.mapbox.maps.extension.style.expressions.generated.Expression\nimport com.mapbox.maps.extension.style.utils.ColorUtils\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport com.mapbox.maps.plugin.delegates.MapFeatureStateDelegate\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.MODEL_SOURCE\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentPlugin\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentPluginImpl\nimport com.mapbox.maps.plugin.locationcomponent.ModelSourceWrapper.Companion.DEFAULT_MODEL_NAME\nimport com.mapbox.maps.plugin.locationcomponent.model.AnimatableModel.Companion.DEFAULT_COLOR\nimport com.mapbox.maps.plugin.locationcomponent.model.AnimatableModel.Companion.DEFAULT_COLOR_MIX_INTENSITY\nimport com.mapbox.maps.plugin.locationcomponent.model.AnimatableModel.Companion.DEFAULT_EMISSIVE_STRENGTH\nimport com.mapbox.maps.plugin.locationcomponent.model.AnimatableModel.Companion.DEFAULT_OPACITY\nimport com.mapbox.maps.plugin.locationcomponent.model.AnimatableModel.Companion.DEFAULT_ROTATION\n\n/**\n * Create a [AnimatableModel] with the model uri and [ModelPart] that can be used with the location component.\n *\n * The [ModelPart] can be used separately to style the [AnimatableModel].\n *\n * @param modelUri the model uri\n * @param modelParts a list of [ModelPart] that provides node or material override to the model, which can be styled separately.\n *\n * @return the [AnimatableModel] that can be used to setup the [LocationPuck3D].\n */\n@MapboxExperimental\nfun LocationComponentPlugin.createAnimatableModel(\n  modelUri: String,\n  modelParts: List<ModelPart>,\n): AnimatableModel {\n  val locationComponentImpl = this as LocationComponentPluginImpl\n  return AnimatableModel(\n    modelUri = modelUri,\n    modelParts = modelParts\n  ).also { locationComponentImpl.bindToAnimatableModel(it) }\n}\n\n/**\n * A model part is the base class for either a [ModelMaterialPart] or [ModelNodePart].\n *\n * It contains context of the map, so can be used to interact with map feature states.\n *\n * @param featureStateId the feature state id to drive the associated part overrides.\n */\n@MapboxExperimental\nabstract class ModelPart(val featureStateId: String) {\n  protected var updateFeatureState: (state: Value) -> Boolean = {\n    // default implementation does not apply feature state, and return false to indicate update is not done\n    false\n  }\n\n  internal fun bindTo(\n    mapFeatureStateDelegate: (state: Value) -> Boolean\n  ) {\n    this.updateFeatureState = mapFeatureStateDelegate\n  }\n}\n\n/**\n * Model node part can be transformed, e.g. rotated etc.\n *\n * @param featureStateId the unique feature state id to drive the associated part overrides in [nodeOverrides].\n * @param nodeOverrides the associated node ids from the model that is overridable.\n */\n@MapboxExperimental\nopen class ModelNodePart(\n  featureStateId: String,\n  val nodeOverrides: List<String>,\n) : ModelPart(featureStateId) {\n\n  /**\n   * Construct a simple [ModelNodePart] with one node override id, it will be used as the feature\n   * state id for updating this node.\n   *\n   * @param nodeOverride the associated node id from the model that is overridable.\n   */\n  constructor(nodeOverride: String) : this(nodeOverride, listOf(nodeOverride))\n\n  /**\n   * The rotation of the node overrides. A list of 3 doubles are required, the 3 number represents\n   * the rotation on x, y, z axis in degrees.\n   */\n  @MapboxExperimental\n  var rotation: List<Double> = DEFAULT_ROTATION\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            \"$featureStateId-rotation\" to Value(value.map(::Value))\n          )\n        )\n      )\n    }\n}\n\n/**\n * Model material part can be applied with color or emission effect.\n *\n * @param featureStateId the unique feature state id to drive the associated material part overrides in [materialOverrides].\n * @param materialOverrides the associated material ids from the model that is overridable.\n */\n@MapboxExperimental\nopen class ModelMaterialPart(\n  featureStateId: String,\n  val materialOverrides: List<String>,\n) : ModelPart(featureStateId) {\n\n  /**\n   * Construct a simple [ModelMaterialPart] with only one material override, the material override will\n   * also be used as the feature state id for updating the material.\n   *\n   * @param materialOverride the associated material id from the model that is overridable.\n   */\n  constructor(materialOverride: String) : this(materialOverride, listOf(materialOverride))\n\n  /**\n   * The color of the [ModelMaterialPart].\n   */\n  @MapboxExperimental\n  var color: String = DEFAULT_COLOR\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            \"$featureStateId-color\" to Value(value),\n          )\n        )\n      )\n    }\n\n  /**\n   * The color mix intensity of the [ModelMaterialPart].\n   *\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors.\n   * Higher number will present a higher model-color contribution in mix.\n   * Default value: 0. Value range: [0, 1]\n   */\n  @MapboxExperimental\n  var colorMixIntensity: Double = DEFAULT_COLOR_MIX_INTENSITY\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            \"$featureStateId-color-mix-intensity\" to Value(value)\n          )\n        )\n      )\n    }\n\n  /**\n   * Update color of the [ModelMaterialPart].\n   *\n   * Note: color-mix-intensity will be set to 1.0 automatically when the chosen color is set, you\n   * can overwrite it by specifying [colorMixIntensity] or call [colorMixIntensity] afterwards.\n   *\n   * @param color the color to be set to the [ModelMaterialPart].\n   */\n  @MapboxExperimental\n  fun updateColor(@ColorInt color: Int, colorMixIntensity: Double = 1.0) {\n    this.color = ColorUtils.colorToRgbaString(color)\n    this.colorMixIntensity = colorMixIntensity\n  }\n  /**\n   * Reset the color to the default value.\n   */\n  @MapboxExperimental\n  fun resetColor() {\n    colorMixIntensity = 0.0\n  }\n\n  /**\n   * The color emission of the [ModelMaterialPart].\n   */\n  @MapboxExperimental\n  var emissiveStrength: Double = DEFAULT_EMISSIVE_STRENGTH\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            \"$featureStateId-emission\" to Value(value)\n          )\n        )\n      )\n    }\n\n  /**\n   * The opacity of the [ModelMaterialPart].\n   */\n  @MapboxExperimental\n  var opacity: Double = DEFAULT_OPACITY\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            \"$featureStateId-opacity\" to Value(value)\n          )\n        )\n      )\n    }\n}\n\n/**\n * Animatable model represents a 3D model with customisable [ModelPart]s, it also can be used to\n * setup [LocationPuck3D] to work with location component.\n */\n@MapboxExperimental\nclass AnimatableModel internal constructor(\n  /**\n   * The URI of the model.\n   */\n  val modelUri: String,\n  private val modelParts: List<ModelPart>,\n) {\n\n  private var mapFeatureStateDelegate: MapFeatureStateDelegate? = null\n\n  private fun updateFeatureState(state: Value): Boolean {\n    mapFeatureStateDelegate?.setFeatureState(\n      sourceId = MODEL_SOURCE,\n      featureId = DEFAULT_MODEL_NAME,\n      state = state\n    ) {\n      it.onError {\n        logE(TAG, \"Update feature state error: $it\")\n      }\n    } ?: return false\n    return true\n  }\n\n  internal fun bindTo(\n    mapFeatureStateDelegate: MapFeatureStateDelegate\n  ) {\n    this.mapFeatureStateDelegate = mapFeatureStateDelegate\n    modelParts.forEach {\n      it.bindTo(::updateFeatureState)\n    }\n  }\n\n  /**\n   * The rotation of the model, except for the model parts defined in [ModelNodePart.nodeOverrides].\n   */\n  @MapboxExperimental\n  var rotation: List<Double> = DEFAULT_ROTATION\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            DEFAULT_ROTATION_FEATURE_STATE_KEY to literal(value)\n          )\n        )\n      )\n    }\n\n  /**\n   * The opacity of the model, except for the model parts defined in [ModelMaterialPart.materialOverrides].\n   */\n  @MapboxExperimental\n  var opacity: Double = DEFAULT_OPACITY\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            DEFAULT_OPACITY_FEATURE_STATE_KEY to Value(value)\n          )\n        )\n      )\n    }\n\n  /**\n   * The emissive strength of the model, except for the model parts defined in [ModelMaterialPart.materialOverrides].\n   */\n  @MapboxExperimental\n  var emissiveStrength: Double = DEFAULT_EMISSIVE_STRENGTH\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            DEFAULT_EMISSIVE_STRENGTH_FEATURE_STATE_KEY to Value(value)\n          )\n        )\n      )\n    }\n\n  /**\n   * The color mix intensity of the model, except for the model parts defined in [ModelMaterialPart.materialOverrides].\n   */\n  @MapboxExperimental\n  var colorMixIntensity: Double = DEFAULT_COLOR_MIX_INTENSITY\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            DEFAULT_COLOR_MIX_INTENSITY_FEATURE_STATE_KEY to Value(value)\n          )\n        )\n      )\n    }\n\n  /**\n   * The color of the model, except for the model parts defined in [ModelMaterialPart.materialOverrides].\n   */\n  @MapboxExperimental\n  var color: String = DEFAULT_COLOR\n    set(value) {\n      field = value\n      updateFeatureState(\n        Value(\n          hashMapOf(\n            DEFAULT_COLOR_FEATURE_STATE_KEY to Value(value)\n          )\n        )\n      )\n    }\n\n  /**\n   * Create the [LocationPuck3D] with the model uri and necessary layer properties to\n   * allow updating the [ModelPart] in the runtime.\n   *\n   * Note: You can use [LocationPuck3D.copy] method if you need further customising the [LocationPuck3D]'s\n   * properties, but do not provide overrides to [LocationPuck3D.modelColor], [LocationPuck3D.modelColorMixIntensity],\n   * [LocationPuck3D.modelRotation], [LocationPuck3D.modelEmissiveStrength], [LocationPuck3D.modelOpacity] or their expressions. Otherwise\n   * it might disable the model parts customisation.\n   *\n   * @return [LocationPuck3D]\n   */\n  @SuppressLint(\"IncorrectNumberOfArgumentsInExpression\")\n  @MapboxExperimental\n  fun getLocationPuck3D(): LocationPuck3D {\n    return LocationPuck3D(\n      modelUri = modelUri,\n      modelRotationExpression = Expression.match {\n        get(PART_KEY)\n        modelParts.filterIsInstance<ModelNodePart>().forEach { nodePart ->\n          nodePart.nodeOverrides.forEach {\n            literal(it)\n            switchCase {\n              eq {\n                typeofExpression {\n                  featureState {\n                    literal(\"${nodePart.featureStateId}-rotation\")\n                  }\n                }\n                literal(\"array<number, 3>\")\n              }\n              featureState {\n                literal(\"${nodePart.featureStateId}-rotation\")\n              }\n              literal(nodePart.rotation)\n            }\n          }\n        }\n        switchCase {\n          eq {\n            typeofExpression {\n              featureState {\n                literal(DEFAULT_ROTATION_FEATURE_STATE_KEY)\n              }\n            }\n            literal(\"array<number, 3>\")\n          }\n          featureState {\n            literal(DEFAULT_ROTATION_FEATURE_STATE_KEY)\n          }\n          literal(rotation)\n        }\n      }.toJson(),\n      modelColorExpression = Expression.match {\n        get(PART_KEY)\n        modelParts.filterIsInstance<ModelMaterialPart>().forEach { materialPart ->\n          materialPart.materialOverrides.forEach {\n            literal(it)\n            toColor {\n              featureState {\n                literal(\"${materialPart.featureStateId}-color\")\n              }\n              literal(materialPart.color)\n            }\n          }\n        }\n        toColor {\n          featureState {\n            literal(DEFAULT_COLOR_FEATURE_STATE_KEY)\n          }\n          literal(color)\n        }\n      }.toJson(),\n      modelColorMixIntensityExpression = Expression.match {\n        get(PART_KEY)\n        modelParts.filterIsInstance<ModelMaterialPart>().forEach { materialPart ->\n          materialPart.materialOverrides.forEach {\n            literal(it)\n            number {\n              featureState {\n                literal(\"${materialPart.featureStateId}-color-mix-intensity\")\n              }\n              literal(materialPart.colorMixIntensity)\n            }\n          }\n        }\n        number {\n          featureState {\n            literal(DEFAULT_COLOR_MIX_INTENSITY_FEATURE_STATE_KEY)\n          }\n          literal(colorMixIntensity)\n        }\n      }.toJson(),\n      modelEmissiveStrengthExpression = Expression.match {\n        get(PART_KEY)\n        modelParts.filterIsInstance<ModelMaterialPart>().forEach { materialPart ->\n          materialPart.materialOverrides.forEach {\n            literal(it)\n            number {\n              featureState {\n                literal(\"${materialPart.featureStateId}-emission\")\n              }\n              literal(materialPart.emissiveStrength)\n            }\n          }\n        }\n        number {\n          featureState {\n            literal(DEFAULT_EMISSIVE_STRENGTH_FEATURE_STATE_KEY)\n          }\n          literal(emissiveStrength)\n        }\n      }.toJson(),\n      modelOpacityExpression = Expression.match {\n        get(PART_KEY)\n        modelParts.filterIsInstance<ModelMaterialPart>().forEach { materialPart ->\n          materialPart.materialOverrides.forEach {\n            literal(it)\n            number {\n              featureState {\n                literal(\"${materialPart.featureStateId}-opacity\")\n              }\n              literal(materialPart.opacity)\n            }\n          }\n        }\n        number {\n          featureState {\n            literal(DEFAULT_OPACITY_FEATURE_STATE_KEY)\n          }\n          literal(opacity)\n        }\n      }.toJson(),\n      materialOverrides = modelParts.filterIsInstance<ModelMaterialPart>()\n        .flatMap { it.materialOverrides },\n      nodeOverrides = modelParts.filterIsInstance<ModelNodePart>().flatMap { it.nodeOverrides }\n    )\n  }\n\n  internal companion object {\n    private const val TAG = \"AnimatableModel\"\n    private const val PART_KEY = \"part\"\n    private const val DEFAULT_ROTATION_FEATURE_STATE_KEY = \"MBX_default_rotation\"\n    private const val DEFAULT_OPACITY_FEATURE_STATE_KEY = \"MBX_default_opacity\"\n    private const val DEFAULT_EMISSIVE_STRENGTH_FEATURE_STATE_KEY = \"MBX_default_emissive_strength\"\n    private const val DEFAULT_COLOR_MIX_INTENSITY_FEATURE_STATE_KEY = \"MBX_default_color_mix_intensity\"\n    private const val DEFAULT_COLOR_FEATURE_STATE_KEY = \"MBX_default_color\"\n    internal const val DEFAULT_COLOR = \"#ffffff\"\n    internal const val DEFAULT_COLOR_MIX_INTENSITY = 0.0\n    internal const val DEFAULT_EMISSIVE_STRENGTH = 0.0\n    internal const val DEFAULT_OPACITY = 1.0\n    internal val DEFAULT_ROTATION = listOf(0.0, 0.0, 0.0)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/utils/BitmapUtils.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.utils\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.graphics.drawable.BitmapDrawable\nimport androidx.annotation.DrawableRes\nimport androidx.annotation.VisibleForTesting\nimport androidx.appcompat.content.res.AppCompatResources\nimport java.nio.ByteBuffer\nimport java.util.*\n\n/**\n * Utility class for creating bitmaps\n */\ninternal object BitmapUtils {\n  /**\n   * Extract an underlying bitmap from a drawable\n   *\n   * @param context The context\n   * @param sourceDrawableId The source drawable id\n   * @return The underlying bitmap\n   */\n  fun getBitmapFromDrawableRes(context: Context, @DrawableRes sourceDrawableId: Int): Bitmap? {\n    val sourceDrawable = AppCompatResources.getDrawable(context, sourceDrawableId)\n      ?: return null\n    return if (sourceDrawable is BitmapDrawable) {\n      sourceDrawable.bitmap\n    } else {\n      // copying drawable object to not manipulate on the same reference\n      val constantState = sourceDrawable.constantState ?: return null\n      val drawable = constantState.newDrawable().mutate()\n      val bitmap = Bitmap.createBitmap(\n        drawable.intrinsicWidth, drawable.intrinsicHeight,\n        Bitmap.Config.ARGB_8888\n      )\n      val canvas = Canvas(bitmap)\n      drawable.setBounds(0, 0, canvas.width, canvas.height)\n      drawable.draw(canvas)\n      bitmap\n    }\n  }\n\n  /**\n   * Validates if the bytes of a bitmap matches another\n   *\n   * @param bitmap the bitmap to be compared against\n   * @param other  the bitmap to compare with\n   * @return true if equal\n   */\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  fun equals(bitmap: Bitmap, other: Bitmap): Boolean {\n    val buffer =\n      ByteBuffer.allocate(bitmap.height * bitmap.rowBytes)\n    bitmap.copyPixelsToBuffer(buffer)\n    val bufferOther =\n      ByteBuffer.allocate(other.height * other.rowBytes)\n    other.copyPixelsToBuffer(bufferOther)\n    return Arrays.equals(buffer.array(), bufferOther.array())\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/java/com/mapbox/maps/plugin/locationcomponent/utils/ExpectedUtils.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.utils\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.maps.MapboxLocationComponentException\n\n/**\n * Internal function to check if a method invoke on Value succeeded, throws exception if not.\n */\n@JvmSynthetic\ninternal inline fun <reified T> Expected<String, T>.take(): T {\n  this.also {\n    it.error?.let { err ->\n      throw MapboxLocationComponentException(err)\n    }\n    it.value?.let { v ->\n      return v\n    }\n  }\n  throw MapboxLocationComponentException(\"Error in parsing expression.\")\n}"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_info_bg_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/mapbox_info_icon_selected\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/mapbox_info_icon_default\" />\n</selector>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_info_icon_default.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"21dp\"\n        android:height=\"21dp\"\n        android:viewportHeight=\"24.0\"\n        android:viewportWidth=\"24.0\">\n    <path\n        android:fillColor=\"#FF1E8CAB\"\n        android:pathData=\"M11,17h2v-6h-2v6zm1,-15C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zm0,18c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2V7h-2v2z\"/>\n</vector>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_info_icon_selected.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"21dp\"\n        android:height=\"21dp\"\n        android:viewportHeight=\"24.0\"\n        android:viewportWidth=\"24.0\">\n    <path\n        android:fillColor=\"#551E8CAB\"\n        android:pathData=\"M11,17h2v-6h-2v6zm1,-15C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zm0,18c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2V7h-2v2z\"/>\n</vector>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_mylocation_bg_shape.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n\n    <solid android:color=\"@android:color/white\" />\n\n    <size\n        android:width=\"@dimen/mapbox_my_locationview_outer_circle\"\n        android:height=\"@dimen/mapbox_my_locationview_outer_circle\" />\n</shape>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_popup_window_transparent.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"#00000000\"/>\n    <stroke\n        android:width=\"0dp\"\n        android:color=\"#00000000\"/>\n    <padding\n        android:bottom=\"0dp\"\n        android:left=\"0dp\"\n        android:right=\"0dp\"\n        android:top=\"0dp\"/>\n</shape>"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_rounded_corner.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"#A6FFFFFF\"/>\n    <padding\n            android:left=\"7.5dp\"\n            android:right=\"7.5dp\"\n            android:top=\"2dp\"\n            android:bottom=\"3dp\"/>\n    <corners android:radius=\"7.5dp\"/>\n</shape>"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_user_bearing_icon.xml",
    "content": "<vector\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"44dp\"\n  android:height=\"44dp\"\n  android:viewportHeight=\"36.0\"\n  android:viewportWidth=\"36.0\">\n  <path\n    android:fillColor=\"#4A90E2\"\n    android:pathData=\"M18,0L23,7L13,7L18,0ZM22.8,7C21.33,6.36 19.71,6 18,6C16.29,6 14.67,6.36 13.2,7L22.8,7Z\"/>\n</vector>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_user_icon.xml",
    "content": "<vector\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"14dp\"\n  android:height=\"14dp\"\n  android:viewportHeight=\"14.0\"\n  android:viewportWidth=\"14.0\">\n  <path\n    android:fillColor=\"#4A90E2\"\n    android:pathData=\"M7,7m-7,0a7,7 0,1 1,14 0a7,7 0,1 1,-14 0\"/>\n</vector>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_user_icon_shadow.xml",
    "content": "<layer-list\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:opacity=\"opaque\">\n  <item\n    android:gravity=\"center\">\n    <shape\n      android:shape=\"oval\">\n      <size\n        android:width=\"22dp\"\n        android:height=\"22dp\"/>\n      <gradient\n        android:centerColor=\"#40000000\"\n        android:endColor=\"#00000000\"\n        android:gradientRadius=\"11dp\"\n        android:startColor=\"#40000000\"\n        android:type=\"radial\"/>\n    </shape>\n  </item>\n</layer-list>"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_user_icon_stale.xml",
    "content": "<vector\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"14dp\"\n  android:height=\"14dp\"\n  android:viewportHeight=\"14.0\"\n  android:viewportWidth=\"14.0\">\n  <path\n    android:fillColor=\"#A1B0C0\"\n    android:pathData=\"M7,7m-7,0a7,7 0,1 1,14 0a7,7 0,1 1,-14 0\"/>\n</vector>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_user_puck_icon.xml",
    "content": "<vector\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"75dp\"\n  android:height=\"75dp\"\n  android:viewportHeight=\"75.0\"\n  android:viewportWidth=\"75.0\">\n  <path\n    android:fillAlpha=\"0.16\"\n    android:fillColor=\"#263D57\"\n    android:pathData=\"M37.5,37.5m-37.5,0a37.5,37.5 0,1 1,75 0a37.5,37.5 0,1 1,-75 0\"/>\n  <path\n    android:fillColor=\"#FFFFFF\"\n    android:pathData=\"M37.5,37.5m-28.5,0a28.5,28.5 0,1 1,57 0a28.5,28.5 0,1 1,-57 0\"/>\n  <path\n    android:fillColor=\"#4A90E2\"\n    android:pathData=\"M39.2,28.46C39.01,27.99 38.54,27.68 38.02,27.69C37.5,27.7 37.02,28.01 36.81,28.49L27.05,45.83C26.83,46.32 26.92,46.89 27.28,47.26C27.65,47.64 28.21,47.75 28.71,47.54L37.07,44.03C37.39,43.89 37.75,43.89 38.06,44.02L46.27,47.34C46.75,47.54 47.33,47.42 47.71,47.03C48.09,46.64 48.21,46.07 48,45.59L39.2,28.46Z\"/>\n</vector>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/drawable/mapbox_user_stroke_icon.xml",
    "content": "<vector\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"22dp\"\n  android:height=\"22dp\"\n  android:viewportHeight=\"14.0\"\n  android:viewportWidth=\"14.0\">\n  <path\n    android:fillColor=\"#ffffff\"\n    android:pathData=\"M7,7m-7,0a7,7 0,1 1,14 0a7,7 0,1 1,-14 0\"/>\n</vector>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n    <declare-styleable name=\"mapbox_MapView\">\n        <!-- Whether the user location is visible on the map. -->\n        <attr name=\"mapbox_locationComponentEnabled\" format=\"boolean\"/>\n        <!-- Whether the location puck is pulsing on the map. Works for 2D location puck only. -->\n        <attr name=\"mapbox_locationComponentPulsingEnabled\" format=\"boolean\"/>\n        <!-- The color of the pulsing circle. Works for 2D location puck only. -->\n        <attr name=\"mapbox_locationComponentPulsingColor\" format=\"color\"/>\n        <!-- The maximum radius of the pulsing circle. Works for 2D location puck only. Note: Setting [pulsingMaxRadius] to LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY will set the pulsing circle's maximum radius to follow location accuracy circle. -->\n        <attr name=\"mapbox_locationComponentPulsingMaxRadius\" format=\"dimension\"/>\n        <!-- Whether show accuracy ring with location puck. Works for 2D location puck only. -->\n        <attr name=\"mapbox_locationComponentShowAccuracyRing\" format=\"boolean\"/>\n        <!-- The color of the accuracy ring. Works for 2D location puck only. -->\n        <attr name=\"mapbox_locationComponentAccuracyRingColor\" format=\"color\"/>\n        <!-- The color of the accuracy ring border. Works for 2D location puck only. -->\n        <attr name=\"mapbox_locationComponentAccuracyRingBorderColor\" format=\"color\"/>\n        <!-- Sets the id of the layer that's added above to when placing the component on the map. -->\n        <attr name=\"mapbox_locationComponentLayerAbove\" format=\"string\"/>\n        <!-- Sets the id of the layer that's added below to when placing the component on the map. -->\n        <attr name=\"mapbox_locationComponentLayerBelow\" format=\"string\"/>\n        <!-- Whether the puck rotates to track the bearing source. -->\n        <attr name=\"mapbox_locationComponentPuckBearingEnabled\" format=\"boolean\"/>\n        <!-- The enum controls how the puck is oriented -->\n        <attr name=\"mapbox_locationComponentPuckBearing\" format=\"enum\">\n          <!-- Orients the puck to match the direction in which the device is facing. -->\n          <enum name=\"heading\" value=\"0\"/>\n          <!-- Orients the puck to match the direction in which the device is moving. -->\n          <enum name=\"course\" value=\"1\"/>\n        </attr>\n        <!-- The slot this layer is assigned to. If specified, and a slot with that name exists, it will be placed at that position in the layer order. -->\n        <attr name=\"mapbox_locationComponentSlot\" format=\"string\"/>\n        <!-- Defines what the customised look of the location puck. Note that direct changes to the puck variables won't have any effect, a new puck needs to be set every time. -->\n        <attr name=\"mapbox_locationComponentLocationPuck\" format=\"enum\">\n          <!--  -->\n          <enum name=\"location_puck_2_d\" value=\"0\"/>\n          <!--  -->\n          <enum name=\"location_puck_3_d\" value=\"1\"/>\n        </attr>\n\n        <!-- Location puck definitions for location_puck_2_d.  -->\n\n        <!-- Name of image in sprite to use as the top of the location indicator. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck2DTopImage\" format=\"reference\"/>\n        <!-- Name of image in sprite to use as the middle of the location indicator. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck2DBearingImage\" format=\"reference\"/>\n        <!-- Name of image in sprite to use as the background of the location indicator. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck2DShadowImage\" format=\"reference\"/>\n        <!-- The scale expression of the images. If defined, it will be applied to all the three images. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck2DScaleExpression\" format=\"string\"/>\n        <!-- The opacity of the entire location puck Default value: 1. Value range: [0, 1] -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck2DOpacity\" format=\"float\"/>\n\n        <!-- Location puck definitions for location_puck_3_d.  -->\n\n        <!-- An URL for the model file in gltf format. Default value: null. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelUri\" format=\"string\"/>\n        <!-- The position of the model. Default value: [0,0]. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DPosition_lon\" format=\"float\"/>\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DPosition_lat\" format=\"float\"/>\n        <!-- The opacity of the model. Default value: 1. Value range: [0, 1] -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelOpacity\" format=\"float\"/>\n        <!-- The scale of the model. Default value: [1,1,1]. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScale_x\" format=\"float\"/>\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScale_y\" format=\"float\"/>\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScale_z\" format=\"float\"/>\n        <!-- The scale expression of the model, which will overwrite the default scale expression that keeps the model size constant during zoom. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScaleExpression\" format=\"string\"/>\n        <!-- The translation of the model [lon, lat, z] Default value: [0,0,0]. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelTranslation_lon\" format=\"float\"/>\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelTranslation_lat\" format=\"float\"/>\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelTranslation_z\" format=\"float\"/>\n        <!-- The rotation of the model. Default value: [0,0,90]. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelRotation_x\" format=\"float\"/>\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelRotation_y\" format=\"float\"/>\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelRotation_z\" format=\"float\"/>\n        <!-- Enable/Disable shadow casting for the 3D location puck. Default value: true. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelCastShadows\" format=\"boolean\"/>\n        <!-- Enable/Disable shadow receiving for the 3D location puck. Default value: true. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelReceiveShadows\" format=\"boolean\"/>\n        <!-- Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\". -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScaleMode\" format=\"enum\">\n          <!-- Model is scaled so that it's always the same size relative to other map features. The property model-scale specifies how many meters each unit in the model file should cover. -->\n          <enum name=\"map\" value=\"0\"/>\n          <!-- Model is scaled so that it's always the same size on the screen. The property model-scale specifies how many pixels each unit in model file should cover. -->\n          <enum name=\"viewport\" value=\"1\"/>\n        </attr>\n        <!-- Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 5] -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelEmissiveStrength\" format=\"float\"/>\n        <!-- The emissive strength expression of the model, which will overwrite the default model emissive strength. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelEmissiveStrengthExpression\" format=\"string\"/>\n        <!-- The opacity expression of the model, which will overwrite the default model opacity. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelOpacityExpression\" format=\"string\"/>\n        <!-- The rotation expression of the model, which will overwrite the default model rotation. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelRotationExpression\" format=\"string\"/>\n        <!-- The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\". -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColor\" format=\"color\"/>\n        <!-- The color expression of the model, which will overwrite the default model color. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorExpression\" format=\"string\"/>\n        <!-- Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1] -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorMixIntensity\" format=\"float\"/>\n        <!-- The color mix expression of the model, which will overwrite the default model color mix. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorMixIntensityExpression\" format=\"string\"/>\n        <!-- The material overrides for the model. Default value: []. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DMaterialOverrides\" format=\"reference\"/>\n        <!-- The node overrides for the model. Default value: []. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DNodeOverrides\" format=\"reference\"/>\n        <!-- Selects the base of the model. Some modes might require precomputed elevation data in the tileset. Default value: \"ground\". -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelElevationReference\" format=\"enum\">\n          <!-- Elevated rendering is enabled. Use this mode to elevate lines relative to the sea level. -->\n          <enum name=\"sea\" value=\"0\"/>\n          <!-- Elevated rendering is enabled. Use this mode to elevate lines relative to the ground's height below them. -->\n          <enum name=\"ground\" value=\"1\"/>\n        </attr>\n        <!-- This property defines whether the `modelColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style. Default value: \"default\". -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorUseTheme\" format=\"string\"/>\n        <!-- This property defines whether the `modelColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style. -->\n        <attr name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorUseThemeExpression\" format=\"string\"/>\n    </declare-styleable>\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"mapbox_gray_dark\">#5F5F5F</color>\n    <color name=\"mapbox_gray\">#7D7F80</color>\n    <color name=\"mapbox_blue\">#1E8CAB</color>\n\n    <color name=\"mapbox_location_layer_blue\">#0590E2</color>\n    <color name=\"mapbox_location_layer_gray\">#A1B0C0</color>\n</resources>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"mapbox_my_locationview_outer_circle\">18dp</dimen>\n    <dimen name=\"mapbox_locationComponentTrackingInitialMoveThreshold\">25dp</dimen>\n    <dimen name=\"mapbox_locationComponentTrackingMultiFingerMoveThreshold\">400dp</dimen>\n</resources>\n"
  },
  {
    "path": "plugin-locationcomponent/src/main/res-public/values/public.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n\n    <!-- Whether the user location is visible on the map. -->\n    <public name=\"mapbox_locationComponentEnabled\" type=\"attr\" />\n\n    <!-- Whether the location puck is pulsing on the map. Works for 2D location puck only. -->\n    <public name=\"mapbox_locationComponentPulsingEnabled\" type=\"attr\" />\n\n    <!-- The color of the pulsing circle. Works for 2D location puck only. -->\n    <public name=\"mapbox_locationComponentPulsingColor\" type=\"attr\" />\n\n    <!-- The maximum radius of the pulsing circle. Works for 2D location puck only. Note: Setting [pulsingMaxRadius] to LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY will set the pulsing circle's maximum radius to follow location accuracy circle. -->\n    <public name=\"mapbox_locationComponentPulsingMaxRadius\" type=\"attr\" />\n\n    <!-- Whether show accuracy ring with location puck. Works for 2D location puck only. -->\n    <public name=\"mapbox_locationComponentShowAccuracyRing\" type=\"attr\" />\n\n    <!-- The color of the accuracy ring. Works for 2D location puck only. -->\n    <public name=\"mapbox_locationComponentAccuracyRingColor\" type=\"attr\" />\n\n    <!-- The color of the accuracy ring border. Works for 2D location puck only. -->\n    <public name=\"mapbox_locationComponentAccuracyRingBorderColor\" type=\"attr\" />\n\n    <!-- Sets the id of the layer that's added above to when placing the component on the map. -->\n    <public name=\"mapbox_locationComponentLayerAbove\" type=\"attr\" />\n\n    <!-- Sets the id of the layer that's added below to when placing the component on the map. -->\n    <public name=\"mapbox_locationComponentLayerBelow\" type=\"attr\" />\n\n    <!-- Whether the puck rotates to track the bearing source. -->\n    <public name=\"mapbox_locationComponentPuckBearingEnabled\" type=\"attr\" />\n\n    <!-- The enum controls how the puck is oriented -->\n    <public name=\"mapbox_locationComponentPuckBearing\" type=\"attr\" />\n\n    <!-- The slot this layer is assigned to. If specified, and a slot with that name exists, it will be placed at that position in the layer order. -->\n    <public name=\"mapbox_locationComponentSlot\" type=\"attr\" />\n\n    <!-- Location puck definitions for location_puck_2_d.  -->\n\n    <!-- Name of image in sprite to use as the top of the location indicator. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck2DTopImage\" type=\"attr\" />\n    <!-- Name of image in sprite to use as the middle of the location indicator. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck2DBearingImage\" type=\"attr\" />\n    <!-- Name of image in sprite to use as the background of the location indicator. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck2DShadowImage\" type=\"attr\" />\n    <!-- The scale expression of the images. If defined, it will be applied to all the three images. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck2DScaleExpression\" type=\"attr\" />\n    <!-- The opacity of the entire location puck Default value: 1. Value range: [0, 1] -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck2DOpacity\" type=\"attr\" />\n\n    <!-- Location puck definitions for location_puck_3_d.  -->\n\n    <!-- An URL for the model file in gltf format. Default value: null. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelUri\" type=\"attr\" />\n    <!-- The position of the model. Default value: [0,0]. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DPosition_lon\" type=\"attr\" />\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DPosition_lat\" type=\"attr\" />\n    <!-- The opacity of the model. Default value: 1. Value range: [0, 1] -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelOpacity\" type=\"attr\" />\n    <!-- The scale of the model. Default value: [1,1,1]. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScale_x\" type=\"attr\" />\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScale_y\" type=\"attr\" />\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScale_z\" type=\"attr\" />\n    <!-- The scale expression of the model, which will overwrite the default scale expression that keeps the model size constant during zoom. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScaleExpression\" type=\"attr\" />\n    <!-- The translation of the model [lon, lat, z] Default value: [0,0,0]. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelTranslation_lon\" type=\"attr\" />\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelTranslation_lat\" type=\"attr\" />\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelTranslation_z\" type=\"attr\" />\n    <!-- The rotation of the model. Default value: [0,0,90]. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelRotation_x\" type=\"attr\" />\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelRotation_y\" type=\"attr\" />\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelRotation_z\" type=\"attr\" />\n    <!-- Enable/Disable shadow casting for the 3D location puck. Default value: true. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelCastShadows\" type=\"attr\" />\n    <!-- Enable/Disable shadow receiving for the 3D location puck. Default value: true. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelReceiveShadows\" type=\"attr\" />\n    <!-- Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\". -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelScaleMode\" type=\"attr\" />\n    <!-- Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 5] -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelEmissiveStrength\" type=\"attr\" />\n    <!-- The emissive strength expression of the model, which will overwrite the default model emissive strength. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelEmissiveStrengthExpression\" type=\"attr\" />\n    <!-- The opacity expression of the model, which will overwrite the default model opacity. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelOpacityExpression\" type=\"attr\" />\n    <!-- The rotation expression of the model, which will overwrite the default model rotation. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelRotationExpression\" type=\"attr\" />\n    <!-- The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\". -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColor\" type=\"attr\" />\n    <!-- The color expression of the model, which will overwrite the default model color. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorExpression\" type=\"attr\" />\n    <!-- Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1] -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorMixIntensity\" type=\"attr\" />\n    <!-- The color mix expression of the model, which will overwrite the default model color mix. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorMixIntensityExpression\" type=\"attr\" />\n    <!-- The material overrides for the model. Default value: []. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DMaterialOverrides\" type=\"attr\" />\n    <!-- The node overrides for the model. Default value: []. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DNodeOverrides\" type=\"attr\" />\n    <!-- Selects the base of the model. Some modes might require precomputed elevation data in the tileset. Default value: \"ground\". -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelElevationReference\" type=\"attr\" />\n    <!-- This property defines whether the `modelColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style. Default value: \"default\". -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorUseTheme\" type=\"attr\" />\n    <!-- This property defines whether the `modelColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style. -->\n    <public name=\"mapbox_locationComponentLocationPuckLocationPuck3DModelColorUseThemeExpression\" type=\"attr\" />\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/DefaultLocationProviderTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport com.mapbox.android.core.permissions.PermissionsManager\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.common.Cancelable\nimport com.mapbox.common.location.AccuracyLevel\nimport com.mapbox.common.location.DeviceLocationProvider\nimport com.mapbox.common.location.GetLocationCallback\nimport com.mapbox.common.location.Location\nimport com.mapbox.common.location.LocationError\nimport com.mapbox.common.location.LocationErrorCode.*\nimport com.mapbox.common.location.LocationObserver\nimport com.mapbox.common.location.LocationProviderRequest\nimport com.mapbox.common.location.LocationService\nimport com.mapbox.common.location.LocationServiceFactory\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.PuckBearing\nimport io.mockk.*\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.StandardTestDispatcher\nimport kotlinx.coroutines.test.TestDispatcher\nimport kotlinx.coroutines.test.advanceTimeBy\nimport kotlinx.coroutines.test.advanceUntilIdle\nimport kotlinx.coroutines.test.runTest\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@RunWith(RobolectricTestRunner::class)\nclass DefaultLocationProviderTest {\n  private val context = mockk<Context>(relaxed = true)\n  private val locationService = mockk<LocationService>(relaxed = true)\n  private val deviceLocationProvider = mockk<DeviceLocationProvider>(relaxed = true)\n  private val locationConsumer1 = mockk<LocationConsumer>(relaxed = true)\n  private val locationConsumer2 = mockk<LocationConsumer>(relaxed = true)\n  private val locationCompassEngine = mockk<LocationCompassEngine>(relaxed = true)\n  private val locationEngineRequestSlot = CapturingSlot<LocationProviderRequest>()\n\n  private val location = mockk<Location>(relaxed = true).apply {\n    every { longitude } returns 12.0\n    every { latitude } returns 34.0\n    every { altitude } returns 10.0\n    every { bearing } returns 90.0\n  }\n\n  private lateinit var defaultLocationProvider: DefaultLocationProvider\n\n  private lateinit var dispatcher: TestDispatcher\n\n  @Before\n  fun setup() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    every { logE(any(), any()) } just Runs\n    every { locationService.getDeviceLocationProvider(capture(locationEngineRequestSlot)) } returns ExpectedFactory.createValue(\n      deviceLocationProvider\n    )\n    every { context.applicationContext } returns context\n    dispatcher = StandardTestDispatcher()\n    defaultLocationProvider =\n      DefaultLocationProvider(context, locationCompassEngine, locationService, dispatcher)\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(LocationServiceFactory::class)\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun testAddLocationConsumerWithoutPermission() = runTest(dispatcher) {\n    mockkObject(PermissionsManager)\n    every { PermissionsManager.areLocationPermissionsGranted(context) } returns false\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    try {\n      var areLocationPermissionsGrantedCalls = 0\n      var delayTimeMillis = DefaultLocationProvider.INIT_UPDATE_DELAY\n      repeat(10) {\n        advanceTimeBy(delayTimeMillis)\n        areLocationPermissionsGrantedCalls++\n        delayTimeMillis =\n          (delayTimeMillis * 2).coerceAtMost(DefaultLocationProvider.MAX_UPDATE_DELAY)\n        verify(exactly = areLocationPermissionsGrantedCalls) {\n          PermissionsManager.areLocationPermissionsGranted(context)\n        }\n      }\n\n      verify(exactly = 0) {\n        deviceLocationProvider.addLocationObserver(any())\n      }\n      verify(exactly = 0) {\n        deviceLocationProvider.getLastLocation(any())\n      }\n      verify(exactly = 0) {\n        locationCompassEngine.addCompassListener(any())\n      }\n    } finally {\n      // Always unregister so the shared DefaultLocationProvider.locationUpdatesFlow is freed and\n      // test can complete\n      defaultLocationProvider.unRegisterLocationConsumer(locationConsumer1)\n    }\n  }\n\n  @Test\n  fun testAddLocationConsumerWithPermission() = runTest(dispatcher) {\n    defaultLocationProvider.updatePuckBearing(PuckBearing.HEADING)\n    mockkObject(PermissionsManager)\n    every { PermissionsManager.areLocationPermissionsGranted(context) } returns true\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    advanceUntilIdle()\n    verify(exactly = 1) {\n      deviceLocationProvider.addLocationObserver(any())\n    }\n    val capturedValueMap = locationEngineRequestSlot.captured\n    assertEquals(\n      LocationComponentConstants.DEFAULT_INTERVAL_MILLIS,\n      capturedValueMap.interval!!.interval\n    )\n    assertEquals(\n      LocationComponentConstants.DEFAULT_FASTEST_INTERVAL_MILLIS,\n      capturedValueMap.interval!!.minimumInterval\n    )\n    assertEquals(\n      AccuracyLevel.HIGH,\n      capturedValueMap.accuracy\n    )\n    verify(exactly = 1) {\n      deviceLocationProvider.getLastLocation(any())\n    }\n    verify(exactly = 1) {\n      locationCompassEngine.addCompassListener(any())\n    }\n  }\n\n  @Test\n  fun testAddTwoLocationConsumer() = runTest(dispatcher) {\n    defaultLocationProvider.updatePuckBearing(PuckBearing.HEADING)\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    advanceUntilIdle()\n    defaultLocationProvider.registerLocationConsumer(locationConsumer2)\n    advanceUntilIdle()\n    verify(exactly = 1) {\n      deviceLocationProvider.addLocationObserver(any())\n    }\n    verify(exactly = 1) {\n      deviceLocationProvider.getLastLocation(any())\n    }\n    verify(exactly = 1) {\n      locationCompassEngine.addCompassListener(any())\n    }\n  }\n\n  @Test\n  fun testUpdatePuckBearingWithConsumer() = runTest(dispatcher) {\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    advanceUntilIdle()\n    verify(exactly = 0) {\n      locationCompassEngine.addCompassListener(any())\n    }\n    defaultLocationProvider.updatePuckBearing(PuckBearing.HEADING)\n    advanceUntilIdle()\n    verify(exactly = 1) {\n      locationCompassEngine.addCompassListener(any())\n    }\n  }\n\n  @Test\n  fun testRemoveOneOfTwoLocationConsumers() = runTest(dispatcher) {\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    advanceUntilIdle()\n    defaultLocationProvider.registerLocationConsumer(locationConsumer2)\n    advanceUntilIdle()\n    defaultLocationProvider.unRegisterLocationConsumer(locationConsumer2)\n    advanceUntilIdle()\n    verify(exactly = 0) {\n      deviceLocationProvider.removeLocationObserver(any())\n    }\n    verify(exactly = 0) {\n      locationCompassEngine.addCompassListener(any())\n    }\n  }\n\n  @Test\n  fun testRemoveAllLocationConsumer() = runTest(dispatcher) {\n    defaultLocationProvider.updatePuckBearing(PuckBearing.HEADING)\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    advanceUntilIdle()\n    defaultLocationProvider.registerLocationConsumer(locationConsumer2)\n    advanceUntilIdle()\n    defaultLocationProvider.unRegisterLocationConsumer(locationConsumer2)\n    advanceUntilIdle()\n    defaultLocationProvider.unRegisterLocationConsumer(locationConsumer1)\n    advanceUntilIdle()\n    verify(exactly = 1) {\n      deviceLocationProvider.removeLocationObserver(any())\n    }\n    verify(exactly = 1) {\n      locationCompassEngine.addCompassListener(any())\n    }\n  }\n\n  @Test\n  fun testLocationUpdate() = runTest(dispatcher) {\n    every { deviceLocationProvider.getLastLocation(any()) } returns Cancelable { }\n\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    defaultLocationProvider.registerLocationConsumer(locationConsumer2)\n    // Advance to let the consumers register\n    advanceUntilIdle()\n    verify(exactly = 1) { deviceLocationProvider.addLocationObserver(any()) }\n\n    val getLocationCallbackSlot = CapturingSlot<GetLocationCallback>()\n    verify(exactly = 1) { deviceLocationProvider.getLastLocation(capture(getLocationCallbackSlot)) }\n    getLocationCallbackSlot.captured.run(location)\n    // Advance to let the last location to be send through the Flow\n    advanceUntilIdle()\n\n    verify { locationConsumer1.onLocationUpdated(Point.fromLngLat(12.0, 34.0, 10.0)) }\n    verify { locationConsumer1.onBearingUpdated(90.0) }\n    verify { locationConsumer2.onLocationUpdated(Point.fromLngLat(12.0, 34.0, 10.0)) }\n    verify { locationConsumer2.onBearingUpdated(90.0) }\n  }\n\n  @Test\n  fun `last location is discarded if fresher is received`() = runTest(dispatcher) {\n    var lastLocationCancelled = false\n    every { deviceLocationProvider.getLastLocation(any()) } returns Cancelable {\n      lastLocationCancelled = true\n    }\n\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    // Let the first consumer register\n    advanceUntilIdle()\n\n    val liveTrackingClientObserverSlot = CapturingSlot<LocationObserver>()\n    verify(exactly = 1) { deviceLocationProvider.addLocationObserver(capture(liveTrackingClientObserverSlot)) }\n    advanceUntilIdle()\n\n    verify(exactly = 1) { deviceLocationProvider.getLastLocation(any()) }\n    // Advance to let the last location to be send through the Flow\n    advanceUntilIdle()\n\n    val lastLocationAsPoint =\n      Point.fromLngLat(location.longitude, location.latitude, location.altitude!!)\n    verify(exactly = 0) { locationConsumer1.onLocationUpdated(lastLocationAsPoint) }\n    verify(exactly = 0) { locationConsumer1.onBearingUpdated(90.0) }\n\n    val location2 = mockk<Location>().apply {\n      every { longitude } returns 11.0\n      every { latitude } returns 22.0\n      every { altitude } returns 33.0\n      every { bearing } returns 44.0\n      every { horizontalAccuracy } returns 3.0\n    }\n    // Use the captured live tracking client observer to send a second location\n    liveTrackingClientObserverSlot.captured.onLocationUpdateReceived(listOf(location2))\n    advanceUntilIdle()\n\n    assertTrue(lastLocationCancelled)\n    val location2AsPoint =\n      Point.fromLngLat(location2.longitude, location2.latitude, location2.altitude!!)\n    // Verify that the second location is received by the first consumer\n    verify(exactly = 1) { locationConsumer1.onLocationUpdated(location2AsPoint) }\n    verify(exactly = 1) { locationConsumer1.onBearingUpdated(44.0) }\n  }\n\n  @Test\n  fun `second listener gets only most recent location`() = runTest(dispatcher) {\n    every { deviceLocationProvider.getLastLocation(any()) } returns Cancelable { }\n\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    // Let the first consumer register\n    advanceUntilIdle()\n\n    val liveTrackingClientObserverSlot = CapturingSlot<LocationObserver>()\n    verify(exactly = 1) { deviceLocationProvider.addLocationObserver(capture(liveTrackingClientObserverSlot)) }\n\n    val getLocationCallbackSlot = CapturingSlot<GetLocationCallback>()\n    verify(exactly = 1) { deviceLocationProvider.getLastLocation(capture(getLocationCallbackSlot)) }\n    getLocationCallbackSlot.captured.run(location)\n    // Advance to let the last location to be send through the Flow\n    advanceUntilIdle()\n\n    val locationAsPoint =\n      Point.fromLngLat(location.longitude, location.latitude, location.altitude!!)\n    verify { locationConsumer1.onLocationUpdated(locationAsPoint) }\n    verify { locationConsumer1.onBearingUpdated(90.0) }\n\n    val location2 = mockk<Location>().apply {\n      every { longitude } returns 11.0\n      every { latitude } returns 22.0\n      every { altitude } returns 33.0\n      every { bearing } returns 44.0\n      every { horizontalAccuracy } returns 3.0\n    }\n    // Use the captured live tracking client observer to send a second location\n    liveTrackingClientObserverSlot.captured.onLocationUpdateReceived(listOf(location2))\n    advanceUntilIdle()\n    val location2AsPoint =\n      Point.fromLngLat(location2.longitude, location2.latitude, location2.altitude!!)\n    // Verify that the second location is received by the first consumer\n    verify(exactly = 1) { locationConsumer1.onLocationUpdated(location2AsPoint) }\n    verify(exactly = 1) { locationConsumer1.onBearingUpdated(44.0) }\n\n    // Finally, register the second consumer\n    defaultLocationProvider.registerLocationConsumer(locationConsumer2)\n    advanceUntilIdle()\n    // Verify that getting the last location has not been called a second time\n    verify(exactly = 1) { deviceLocationProvider.getLastLocation(any()) }\n    // Verify that the first location is not received at all by the second consumer\n    verify(exactly = 0) { locationConsumer2.onLocationUpdated(locationAsPoint) }\n    verify(exactly = 0) { locationConsumer2.onBearingUpdated(90.0) }\n    // Verify that the second location is received by the second consumer\n    verify(exactly = 1) { locationConsumer2.onLocationUpdated(location2AsPoint) }\n    verify(exactly = 1) { locationConsumer2.onBearingUpdated(44.0) }\n  }\n\n  @Test\n  fun testLocationUpdateWithCompass() = runTest(dispatcher) {\n    defaultLocationProvider.updatePuckBearing(PuckBearing.HEADING)\n    every { deviceLocationProvider.getLastLocation(any()) } returns Cancelable { }\n\n    defaultLocationProvider.registerLocationConsumer(locationConsumer1)\n    advanceUntilIdle()\n    verify(exactly = 1) { deviceLocationProvider.addLocationObserver(any()) }\n\n    val compassListenerSlot = CapturingSlot<LocationCompassEngine.CompassListener>()\n    verify(exactly = 1) { locationCompassEngine.addCompassListener(capture(compassListenerSlot)) }\n\n    val getLocationCallbackSlot = CapturingSlot<GetLocationCallback>()\n    verify(exactly = 1) { deviceLocationProvider.getLastLocation(capture(getLocationCallbackSlot)) }\n    getLocationCallbackSlot.captured.run(location)\n    // Advance to let the last location to be send through the Flow\n    advanceUntilIdle()\n\n    verify {\n      locationConsumer1.onLocationUpdated(Point.fromLngLat(12.0, 34.0, 10.0))\n    }\n    // We shouldn't have received any bearing update since we're using HEADING puck bearing source\n    verify(exactly = 0) { locationConsumer1.onBearingUpdated(any()) }\n\n    // Using the captured compass listener, check that we emit a bearing update\n    compassListenerSlot.captured.onCompassChanged(91.0f)\n    advanceUntilIdle()\n    verify(exactly = 1) { locationConsumer1.onBearingUpdated(91.0) }\n  }\n\n  @Test\n  fun `live tracking client not available`() = runTest(dispatcher) {\n    val locationService = mockk<LocationService>(relaxed = true)\n    every {\n      locationService.getDeviceLocationProvider(any<LocationProviderRequest>())\n    } returns ExpectedFactory.createError(\n      LocationError(NOT_AVAILABLE, \"Not available\")\n    )\n    var receivedError: LocationError? = null\n    val defaultLocationProvider =\n      DefaultLocationProvider(context, locationCompassEngine, locationService, dispatcher)\n    defaultLocationProvider.registerLocationConsumer(object : EmptyLocationConsumer() {\n      override fun onError(error: LocationError) {\n        receivedError = error\n      }\n    })\n    advanceUntilIdle()\n    assertNotNull(receivedError)\n    assertEquals(\n      LocationError(\n        NOT_AVAILABLE,\n        DefaultLocationProvider.LIVE_TRACKING_CLIENT_NOT_AVAILABLE\n      ),\n      receivedError\n    )\n  }\n}\n\nprivate open class EmptyLocationConsumer : LocationConsumer {\n  override fun onLocationUpdated(vararg location: Point, options: (ValueAnimator.() -> Unit)?) {\n  }\n\n  override fun onBearingUpdated(vararg bearing: Double, options: (ValueAnimator.() -> Unit)?) {\n  }\n\n  override fun onPuckLocationAnimatorDefaultOptionsUpdated(options: ValueAnimator.() -> Unit) {\n  }\n\n  override fun onPuckBearingAnimatorDefaultOptionsUpdated(options: ValueAnimator.() -> Unit) {\n  }\n\n  override fun onError(error: LocationError) {\n  }\n\n  override fun onHorizontalAccuracyRadiusUpdated(\n    vararg radius: Double,\n    options: (ValueAnimator.() -> Unit)?\n  ) {\n  }\n\n  override fun onPuckAccuracyRadiusAnimatorDefaultOptionsUpdated(options: ValueAnimator.() -> Unit) {\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/LayerSourceProviderTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.LOCATION_INDICATOR_LAYER\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.MODEL_LAYER\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.MODEL_SOURCE\nimport io.mockk.mockk\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass LayerSourceProviderTest {\n\n  @Test(expected = RuntimeException::class)\n  fun testGetModelSourceUrlEmpty() {\n    val locationPuck3D = LocationPuck3D(modelUri = \"\")\n    LayerSourceProvider.getModelSource(locationPuck3D)\n  }\n\n  @Test\n  fun testGetModelSource() {\n    val locationPuck3D = LocationPuck3D(modelUri = \"testurl\")\n    val modelSource = LayerSourceProvider.getModelSource(locationPuck3D)\n    assertEquals(MODEL_SOURCE, modelSource.sourceId)\n\n    assertEquals(\n      mapOf(\n        \"models\" to mapOf(\n          \"defaultModel\" to mapOf(\n            \"orientation\" to listOf(0.0, 0.0, 0.0),\n            \"position\" to listOf(0.0, 0.0),\n            \"uri\" to \"testurl\",\n            \"nodeOverrides\" to emptyList<String>(),\n            \"materialOverrides\" to emptyList<String>()\n          )\n        ),\n        \"type\" to \"model\"\n      ).toValue(),\n      modelSource.toValue(),\n    )\n  }\n\n  @Test\n  fun testGetModelLayer() {\n    val locationPuck3D = LocationPuck3D(\n      modelUri = \"testurl\",\n      modelScale = listOf(1f, 2f, 3f),\n      modelRotation = listOf(3f, 2f, 1f),\n      modelCastShadows = true,\n      modelReceiveShadows = true\n    )\n    val modelLayer = LayerSourceProvider.getModelLayer(locationPuck3D)\n    assertEquals(MODEL_LAYER, modelLayer.layerId)\n    assertEquals(\n      hashMapOf(\n        \"model-type\" to \"location-indicator\",\n        \"model-rotation\" to listOf(3.0, 2.0, 1.0),\n        \"id\" to \"mapbox-location-model-layer\",\n        \"source\" to \"mapbox-location-model-source\",\n        \"type\" to \"model\",\n        \"model-opacity\" to 1.0,\n        \"model-scale-mode\" to \"viewport\",\n        \"model-scale\" to listOf(1.0, 2.0, 3.0),\n        \"model-translation\" to listOf(0.0, 0.0, 0.0),\n        \"model-receive-shadows\" to true,\n        \"model-cast-shadows\" to true,\n        \"model-scale-transition\" to hashMapOf(\"duration\" to 0, \"delay\" to 0),\n        \"model-rotation-transition\" to hashMapOf(\"duration\" to 0, \"delay\" to 0),\n        \"model-elevation-reference\" to \"ground\",\n        \"model-emissive-strength\" to 1.0,\n        \"model-color\" to listOf(\"rgba\", 255, 255, 255, 1.0),\n        \"model-color-mix-intensity\" to 0.0,\n        \"model-emissive-strength\" to 1.0\n      ).toValue(),\n      modelLayer.toValue()\n    )\n  }\n\n  @Test\n  fun testGetLocationIndicatorLayer() {\n    val locationIndicatorLayer = LayerSourceProvider.getLocationIndicatorLayer()\n    assertEquals(LOCATION_INDICATOR_LAYER, locationIndicatorLayer.layerId)\n  }\n\n  @Test\n  fun testGetLocationIndicatorLayerRenderer() {\n    val locationPuck2D = LocationPuck2D()\n    val locationIndicatorLayerRenderer = LayerSourceProvider.getLocationIndicatorLayerRenderer(locationPuck2D, mockk())\n    assertNotNull(locationIndicatorLayerRenderer)\n  }\n\n  @Test\n  fun testGetModelLayerRenderer() {\n    val locationPuck3D = LocationPuck3D(modelUri = \"testurl\")\n    val modelLayerRenderer = LayerSourceProvider.getModelLayerRenderer(locationPuck3D)\n    assertNotNull(modelLayerRenderer)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/LocationCompassEngineTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.content.Context\nimport android.hardware.Sensor\nimport android.hardware.SensorManager\nimport android.view.WindowManager\nimport com.mapbox.maps.logW\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass LocationCompassEngineTest {\n  private val windowManager = mockk<WindowManager>()\n  private val sensorManager = mockk<SensorManager>(relaxed = true)\n  private val context = mockk<Context>()\n  private val compassSensor = mockk<Sensor>()\n  private val gravitySensor = mockk<Sensor>()\n  private val magneticFieldSensor = mockk<Sensor>()\n  private val compassListener = mockk<LocationCompassEngine.CompassListener>()\n  private lateinit var locationCompassEngine: LocationCompassEngine\n\n  @Before\n  fun setUp() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n    every { sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) } returns compassSensor\n    every { sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) } returns gravitySensor\n    every { sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) } returns magneticFieldSensor\n    every { context.applicationContext.getSystemService(Context.WINDOW_SERVICE) } returns windowManager\n    every { context.applicationContext.getSystemService(Context.SENSOR_SERVICE) } returns sensorManager\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun supportRotationVectorSensor() {\n    locationCompassEngine = LocationCompassEngine(context)\n    verify(exactly = 1) { sensorManager.getDefaultSensor(any()) }\n    verify(exactly = 0) { sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) }\n    verify(exactly = 0) { sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) }\n  }\n\n  @Test\n  fun notSupportRotationVectorSensor() {\n    every { sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) } returns null\n    locationCompassEngine = LocationCompassEngine(context)\n    verify(exactly = 1) { sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) }\n    verify(exactly = 1) { sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) }\n  }\n\n  @Test\n  fun addListenerWhileSupportRotationVectorSensor() {\n    locationCompassEngine = LocationCompassEngine(context)\n    locationCompassEngine.addCompassListener(compassListener)\n    locationCompassEngine.addCompassListener(compassListener)\n    verify(exactly = 1) { sensorManager.registerListener(any(), compassSensor, any()) }\n    verify(exactly = 0) { sensorManager.registerListener(any(), gravitySensor, any()) }\n    verify(exactly = 0) { sensorManager.registerListener(any(), magneticFieldSensor, any()) }\n  }\n\n  @Test\n  fun removeListenerWhileSupportRotationVectorSensor() {\n    locationCompassEngine = LocationCompassEngine(context)\n    locationCompassEngine.addCompassListener(compassListener)\n    locationCompassEngine.addCompassListener(compassListener)\n    locationCompassEngine.addCompassListener(compassListener)\n    locationCompassEngine.removeCompassListener(compassListener)\n    locationCompassEngine.removeCompassListener(compassListener)\n    verify(exactly = 1) { sensorManager.unregisterListener(any(), compassSensor) }\n    verify(exactly = 0) { sensorManager.unregisterListener(any(), gravitySensor) }\n    verify(exactly = 0) { sensorManager.unregisterListener(any(), magneticFieldSensor) }\n  }\n\n  @Test\n  fun addListenerWhileNotSupportRotationVectorSensor() {\n    every { sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) } returns null\n    locationCompassEngine = LocationCompassEngine(context)\n    locationCompassEngine.addCompassListener(compassListener)\n    locationCompassEngine.addCompassListener(compassListener)\n    verify(exactly = 0) { sensorManager.registerListener(any(), compassSensor, any()) }\n    verify(exactly = 1) { sensorManager.registerListener(any(), gravitySensor, any()) }\n    verify(exactly = 1) { sensorManager.registerListener(any(), magneticFieldSensor, any()) }\n  }\n\n  @Test\n  fun removeListenerWhileNotSupportRotationVectorSensor() {\n    every { sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) } returns null\n    locationCompassEngine = LocationCompassEngine(context)\n    locationCompassEngine.addCompassListener(compassListener)\n    locationCompassEngine.removeCompassListener(compassListener)\n    locationCompassEngine.removeCompassListener(compassListener)\n    verify(exactly = 0) { sensorManager.unregisterListener(any(), compassSensor) }\n    verify(exactly = 1) { sensorManager.unregisterListener(any(), gravitySensor) }\n    verify(exactly = 1) { sensorManager.unregisterListener(any(), magneticFieldSensor) }\n  }\n\n  @Test\n  fun calibrationListenerTest() {\n    val calibrationListener = mockk<LocationCompassCalibrationListener>(relaxed = true)\n    locationCompassEngine = LocationCompassEngine(context)\n    locationCompassEngine.addCalibrationListener(calibrationListener)\n    locationCompassEngine.onAccuracyChanged(mockk(), 100)\n    verify(exactly = 0) { calibrationListener.onCompassCalibrationNeeded() }\n    locationCompassEngine.onAccuracyChanged(mockk(), SensorManager.SENSOR_STATUS_UNRELIABLE)\n    verify(exactly = 1) { calibrationListener.onCompassCalibrationNeeded() }\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/LocationComponentPluginImplTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Color\nimport android.graphics.drawable.Drawable\nimport android.hardware.SensorManager\nimport android.util.AttributeSet\nimport android.view.WindowManager\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.common.location.DeviceLocationProvider\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentAttributeParser\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkObject\nimport io.mockk.mockkStatic\nimport io.mockk.unmockkAll\nimport io.mockk.verify\nimport kotlinx.coroutines.test.advanceUntilIdle\nimport kotlinx.coroutines.test.runTest\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(\n  shadows = [\n    ShadowLocationServiceFactory::class\n  ]\n)\nclass LocationComponentPluginImplTest {\n\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private val locationPuckManager = mockk<LocationPuckManager>(relaxed = true)\n  private val locationProvider = mockk<LocationProvider>(relaxed = true)\n\n  private val style = mockk<MapboxStyleManager>(relaxed = true)\n  private val cameraDelegate = mockk<MapCameraManagerDelegate>(relaxed = true)\n\n  private val context = mockk<Context>(relaxed = true)\n  private val attrs = mockk<AttributeSet>(relaxUnitFun = true)\n  private val typedArray = mockk<TypedArray>(relaxed = true)\n  private val pack = \"com.mapbox.maps\"\n  private val drawable = mockk<Drawable>(relaxed = true)\n  private val windowManager = mockk<WindowManager>(relaxed = true)\n  private val sensorManager = mockk<SensorManager>(relaxed = true)\n  private val deviceLocationProvider = mockk<DeviceLocationProvider>(relaxed = true)\n\n  private lateinit var locationComponentPlugin: LocationComponentPluginImpl\n\n  @Before\n  fun setup() {\n    mockkObject(LocationComponentAttributeParser)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logW(any(), any()) } just Runs\n\n    ShadowLocationServiceFactory.deviceLocationProvider = deviceLocationProvider\n\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { context.packageName } returns pack\n    every { context.applicationContext.applicationContext.applicationContext.getSystemService(Context.WINDOW_SERVICE) } returns windowManager\n    every { context.applicationContext.applicationContext.applicationContext.getSystemService(Context.SENSOR_SERVICE) } returns sensorManager\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getInt(any(), any()) } returns 0\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getColor(any(), any()) } returns Color.BLUE\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getDrawable(any()) } returns drawable\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.hasValue(any()) } returns true\n    every { typedArray.recycle() } returns Unit\n    every { delegateProvider.mapStyleManagerDelegate } returns style\n    every { delegateProvider.mapCameraManagerDelegate } returns cameraDelegate\n\n    locationComponentPlugin = LocationComponentPluginImpl()\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkAll()\n  }\n\n  // Utility function to setup initialise the plugin.\n  private fun preparePluginInitialisationWithEnabled() {\n    every {\n      LocationComponentAttributeParser.parseLocationComponentSettings(\n        context,\n        attrs,\n        1f\n      )\n    } returns LocationComponentSettings(LocationPuck2D()) {\n      enabled = true\n    }\n\n    locationComponentPlugin.bind(context, attrs, 1f, locationProvider, locationPuckManager)\n    locationComponentPlugin.onDelegateProvider(delegateProvider)\n    locationComponentPlugin.onStart()\n  }\n\n  // Utility function to setup initialise the plugin.\n  private fun preparePluginInitialisationWithDisabled() {\n    every {\n      LocationComponentAttributeParser.parseLocationComponentSettings(\n        context,\n        attrs,\n        1f\n      )\n    } returns LocationComponentSettings(LocationPuck2D()) {\n      enabled = false\n    }\n\n    locationComponentPlugin.bind(context, attrs, 1f, locationProvider, locationPuckManager)\n    locationComponentPlugin.onDelegateProvider(delegateProvider)\n    locationComponentPlugin.onStart()\n  }\n\n  @Test\n  fun testBindWithPluginDisabled() {\n    every {\n      LocationComponentAttributeParser.parseLocationComponentSettings(\n        context,\n        attrs,\n        1f\n      )\n    } returns LocationComponentSettings(LocationPuck2D()) {\n      enabled = false\n    }\n    locationComponentPlugin.bind(context, attrs, 1f)\n    assertNull(locationComponentPlugin.getLocationProvider())\n  }\n\n  @Test\n  fun testBindWithPluginEnabled() {\n    every {\n      LocationComponentAttributeParser.parseLocationComponentSettings(\n        context,\n        attrs,\n        1f\n      )\n    } returns LocationComponentSettings(LocationPuck2D()) {\n      enabled = true\n    }\n    locationComponentPlugin.bind(context, attrs, 1f, locationProvider, locationPuckManager)\n    assertNotNull(locationComponentPlugin.getLocationProvider())\n  }\n\n  @Test\n  fun testAddOnIndicatorPositionChangedListener() {\n    val positionListener = mockk<OnIndicatorPositionChangedListener>(relaxed = true)\n    locationComponentPlugin.indicatorPositionChangedListener.onIndicatorPositionChanged(\n      Point.fromLngLat(\n        0.0,\n        0.0\n      )\n    )\n    locationComponentPlugin.addOnIndicatorPositionChangedListener(positionListener)\n    // Verify the newly added listener will get the last updated indicator position\n    verify(exactly = 1) { positionListener.onIndicatorPositionChanged(Point.fromLngLat(0.0, 0.0)) }\n    locationComponentPlugin.indicatorPositionChangedListener.onIndicatorPositionChanged(\n      Point.fromLngLat(\n        1.0,\n        0.0\n      )\n    )\n    // Verify the listener will get notified when new location arrives.\n    verify(exactly = 1) { positionListener.onIndicatorPositionChanged(Point.fromLngLat(1.0, 0.0)) }\n  }\n\n  @Test\n  fun testRemoveOnIndicatorPositionChangedListener() {\n    val positionListener = mockk<OnIndicatorPositionChangedListener>(relaxed = true)\n    locationComponentPlugin.addOnIndicatorPositionChangedListener(positionListener)\n    locationComponentPlugin.removeOnIndicatorPositionChangedListener(positionListener)\n    locationComponentPlugin.indicatorPositionChangedListener.onIndicatorPositionChanged(\n      Point.fromLngLat(\n        0.0,\n        0.0\n      )\n    )\n    verify(exactly = 0) { positionListener.onIndicatorPositionChanged(Point.fromLngLat(0.0, 0.0)) }\n  }\n\n  @Test\n  fun testAddOnIndicatorBearingChangedListener() {\n    val bearingListener = mockk<OnIndicatorBearingChangedListener>(relaxed = true)\n    locationComponentPlugin.indicatorBearingChangedListener.onIndicatorBearingChanged(0.0)\n    locationComponentPlugin.addOnIndicatorBearingChangedListener(bearingListener)\n    // Verify the newly added listener will get the last updated indicator bearing\n    verify(exactly = 1) { bearingListener.onIndicatorBearingChanged(0.0) }\n    // Verify the listener will get notified when new bearing arrives.\n    locationComponentPlugin.indicatorBearingChangedListener.onIndicatorBearingChanged(1.0)\n    verify(exactly = 1) { bearingListener.onIndicatorBearingChanged(1.0) }\n  }\n\n  @Test\n  fun testRemoveOnIndicatorBearingChangedListener() {\n    val bearingListener = mockk<OnIndicatorBearingChangedListener>(relaxed = true)\n    locationComponentPlugin.addOnIndicatorBearingChangedListener(bearingListener)\n    locationComponentPlugin.removeOnIndicatorBearingChangedListener(bearingListener)\n    locationComponentPlugin.indicatorBearingChangedListener.onIndicatorBearingChanged(0.0)\n    verify(exactly = 0) { bearingListener.onIndicatorBearingChanged(0.0) }\n  }\n\n  @Test\n  fun testAddOnIndicatorAccuracyRadiusChangedListener() {\n    val accuracyListener = mockk<OnIndicatorAccuracyRadiusChangedListener>(relaxed = true)\n    locationComponentPlugin.indicatorAccuracyRadiusChangedListener.onIndicatorAccuracyRadiusChanged(0.0)\n    locationComponentPlugin.addOnIndicatorAccuracyRadiusChangedListener(accuracyListener)\n    // Verify the newly added listener will get the last updated indicator accuracy radius\n    verify(exactly = 1) { accuracyListener.onIndicatorAccuracyRadiusChanged(0.0) }\n    // Verify the listener will get notified when new accuracy radius arrives.\n    locationComponentPlugin.indicatorAccuracyRadiusChangedListener.onIndicatorAccuracyRadiusChanged(1.0)\n    verify(exactly = 1) { accuracyListener.onIndicatorAccuracyRadiusChanged(1.0) }\n  }\n\n  @Test\n  fun testRemoveOnIndicatorAccuracyRadiusChangedListener() {\n    val accuracyRadiusListener = mockk<OnIndicatorAccuracyRadiusChangedListener>(relaxed = true)\n    locationComponentPlugin.addOnIndicatorAccuracyRadiusChangedListener(accuracyRadiusListener)\n    locationComponentPlugin.removeOnIndicatorAccuracyRadiusChangedListener(accuracyRadiusListener)\n    locationComponentPlugin.indicatorAccuracyRadiusChangedListener.onIndicatorAccuracyRadiusChanged(.0)\n    verify(exactly = 0) { accuracyRadiusListener.onIndicatorAccuracyRadiusChanged(0.0) }\n  }\n\n  @Test\n  fun testSetLocationProvider() {\n    val mockLocationProvider = mockk<LocationProvider>(relaxed = true)\n    preparePluginInitialisationWithEnabled()\n    verify(exactly = 1) { locationProvider.registerLocationConsumer(any()) }\n    locationComponentPlugin.setLocationProvider(mockLocationProvider)\n    verify(exactly = 1) { locationProvider.unRegisterLocationConsumer(any()) }\n    verify(exactly = 1) { mockLocationProvider.registerLocationConsumer(any()) }\n    assertEquals(mockLocationProvider, locationComponentPlugin.getLocationProvider())\n  }\n\n  @Test\n  fun testSetLocationProviderDeactivated() {\n    val mockLocationProvider = mockk<LocationProvider>(relaxed = true)\n    locationComponentPlugin.locationProvider = locationProvider\n    locationComponentPlugin.setLocationProvider(mockLocationProvider)\n    verify(exactly = 1) { locationProvider.unRegisterLocationConsumer(any()) }\n    verify(exactly = 0) { mockLocationProvider.registerLocationConsumer(any()) }\n    assertEquals(mockLocationProvider, locationComponentPlugin.getLocationProvider())\n  }\n\n  @Test\n  fun testOnStart() = runTest {\n    every { locationPuckManager.isLayerInitialised() } returns false\n    preparePluginInitialisationWithEnabled()\n    advanceUntilIdle()\n    verify(exactly = 1) { locationPuckManager.initialize(style) }\n    verify(exactly = 1) { locationPuckManager.onStart() }\n    verify(exactly = 1) { locationProvider.registerLocationConsumer(any()) }\n    assertTrue(locationComponentPlugin.isLocationComponentActivated)\n  }\n\n  @Test\n  fun testOnStartWithPuckDisabled() {\n    every { locationPuckManager.isLayerInitialised() } returns false\n    preparePluginInitialisationWithDisabled()\n    verify(exactly = 0) { delegateProvider.getStyle(any()) }\n    verify(exactly = 0) { locationPuckManager.initialize(style) }\n    verify(exactly = 0) { locationPuckManager.onStart() }\n    verify(exactly = 0) { locationProvider.registerLocationConsumer(any()) }\n    assertFalse(locationComponentPlugin.isLocationComponentActivated)\n  }\n\n  @Test\n  fun testOnStartWithPuckAlreadyInitialisedAndPluginActivated() {\n    every { locationPuckManager.isLayerInitialised() } returns true\n    locationComponentPlugin.isLocationComponentActivated = true\n    preparePluginInitialisationWithEnabled()\n    verify(exactly = 0) { locationPuckManager.initialize(style) }\n    verify(exactly = 0) { locationPuckManager.onStart() }\n    verify(exactly = 0) { locationProvider.registerLocationConsumer(any()) }\n    assertTrue(locationComponentPlugin.isLocationComponentActivated)\n  }\n\n  @Test\n  fun testOnStop() {\n    preparePluginInitialisationWithEnabled()\n    locationComponentPlugin.onStop()\n    assertFalse(locationComponentPlugin.isLocationComponentActivated)\n    verify { locationPuckManager.onStop() }\n    verify(exactly = 1) { locationProvider.unRegisterLocationConsumer(any()) }\n  }\n\n  @Test\n  fun testOnLocationUpdated() {\n    val valueAnimator = mockk<ValueAnimator.() -> Unit>(relaxed = true)\n    preparePluginInitialisationWithEnabled()\n    locationComponentPlugin.onLocationUpdated(Point.fromLngLat(0.0, 0.0), options = valueAnimator)\n    verify { locationPuckManager.updateCurrentPosition(Point.fromLngLat(0.0, 0.0), options = valueAnimator) }\n  }\n\n  @Test\n  fun testOnBearingUpdated() {\n    val valueAnimator = mockk<ValueAnimator.() -> Unit>(relaxed = true)\n    preparePluginInitialisationWithEnabled()\n    locationComponentPlugin.onBearingUpdated(0.0, options = valueAnimator)\n    verify { locationPuckManager.updateCurrentBearing(0.0, options = valueAnimator) }\n  }\n\n  @Test\n  fun testOnPuckLocationAnimatorDefaultOptionsUpdated() {\n    val valueAnimator = mockk<ValueAnimator.() -> Unit>(relaxed = true)\n    preparePluginInitialisationWithEnabled()\n    locationComponentPlugin.onPuckLocationAnimatorDefaultOptionsUpdated(valueAnimator)\n    verify { locationPuckManager.updateLocationAnimator(valueAnimator) }\n  }\n\n  @Test\n  fun testOnPuckBearingAnimatorDefaultOptionsUpdated() {\n    val valueAnimator = mockk<ValueAnimator.() -> Unit>(relaxed = true)\n    preparePluginInitialisationWithEnabled()\n    locationComponentPlugin.onPuckBearingAnimatorDefaultOptionsUpdated(valueAnimator)\n    verify { locationPuckManager.updateBearingAnimator(valueAnimator) }\n  }\n\n  @Test\n  fun testApplySettingsEnabled() {\n    preparePluginInitialisationWithDisabled()\n    every { locationPuckManager.isLayerInitialised() } returns false\n    locationComponentPlugin.enabled = true\n    verify { locationPuckManager.updateSettings(any()) }\n  }\n\n  @Test\n  fun testApplySettingsDisabled() {\n    preparePluginInitialisationWithEnabled()\n    locationComponentPlugin.enabled = false\n    verify(exactly = 0) { locationPuckManager.updateSettings(any()) }\n    verify { locationPuckManager.cleanUp() }\n    verify(exactly = 1) { locationProvider.unRegisterLocationConsumer(any()) }\n    assertFalse(locationComponentPlugin.isLocationComponentActivated)\n    assertNull(locationComponentPlugin.locationPuckManager)\n  }\n\n  @Test\n  fun testLocationProviderRegisterStopStart() {\n    preparePluginInitialisationWithEnabled()\n\n    verify(exactly = 1) { locationProvider.registerLocationConsumer(any()) }\n    verify(exactly = 0) { locationProvider.unRegisterLocationConsumer(any()) }\n    locationComponentPlugin.onStop()\n    verify(exactly = 1) { locationProvider.registerLocationConsumer(any()) }\n    verify(exactly = 1) { locationProvider.unRegisterLocationConsumer(any()) }\n\n    locationComponentPlugin.onStart()\n    verify(exactly = 2) { locationProvider.registerLocationConsumer(any()) }\n    verify(exactly = 1) { locationProvider.unRegisterLocationConsumer(any()) }\n  }\n\n  @Test\n  fun testLocationProviderRegisterDisableEnable() {\n    every { logE(any(), any()) } just Runs\n    every { style.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns ExpectedFactory.createNone()\n\n    preparePluginInitialisationWithEnabled()\n\n    verify(exactly = 1) { locationProvider.registerLocationConsumer(any()) }\n    verify(exactly = 0) { locationProvider.unRegisterLocationConsumer(any()) }\n    locationComponentPlugin.enabled = false\n    verify(exactly = 1) { locationProvider.registerLocationConsumer(any()) }\n    verify(exactly = 1) { locationProvider.unRegisterLocationConsumer(any()) }\n    verify(exactly = 1) { locationPuckManager.cleanUp() }\n\n    locationComponentPlugin.enabled = true\n    verify(exactly = 2) { style.addPersistentStyleLayer(any(), any()) }\n    verify(exactly = 2) { locationProvider.registerLocationConsumer(any()) }\n    verify(exactly = 1) { locationProvider.unRegisterLocationConsumer(any()) }\n  }\n\n  @Test\n  fun testOnStyleChanged() {\n    val style = mockk<MapboxStyleManager>()\n    preparePluginInitialisationWithEnabled()\n    locationComponentPlugin.onStyleChanged(style)\n    verify { locationPuckManager.updateStyle(style) }\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/LocationComponentPositionManagerTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxStyleManager\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\n\nclass LocationComponentPositionManagerTest {\n\n  private var style: MapboxStyleManager = mockk(relaxed = true)\n  private var layerWrapper: LocationLayerWrapper = mockk(relaxed = true)\n\n  @Test\n  fun update_noChange_null() {\n    val positionManager = LocationComponentPositionManager(style, null, null)\n    val requiresUpdate = positionManager.update(null, null)\n    assertFalse(requiresUpdate)\n  }\n\n  @Test\n  fun update_noChange_above() {\n    val positionManager = LocationComponentPositionManager(style, \"above\", null)\n    val requiresUpdate = positionManager.update(\"above\", null)\n    assertFalse(requiresUpdate)\n  }\n\n  @Test\n  fun update_noChange_below() {\n    val positionManager = LocationComponentPositionManager(style, null, \"below\")\n    val requiresUpdate = positionManager.update(null, \"below\")\n    assertFalse(requiresUpdate)\n  }\n\n  @Test\n  fun update_fromNull_above() {\n    val positionManager = LocationComponentPositionManager(style, null, null)\n    val requiresUpdate = positionManager.update(\"above\", null)\n    assertTrue(requiresUpdate)\n  }\n\n  @Test\n  fun update_fromNull_below() {\n    val positionManager = LocationComponentPositionManager(style, null, null)\n    val requiresUpdate = positionManager.update(null, \"below\")\n    assertTrue(requiresUpdate)\n  }\n\n  @Test\n  fun update_toNull_above() {\n    val positionManager = LocationComponentPositionManager(style, \"above\", null)\n    val requiresUpdate = positionManager.update(null, null)\n    assertTrue(requiresUpdate)\n  }\n\n  @Test\n  fun update_toNull_below() {\n    val positionManager = LocationComponentPositionManager(style, null, \"below\")\n    val requiresUpdate = positionManager.update(null, null)\n    assertTrue(requiresUpdate)\n  }\n\n  @Test\n  fun update_fromValue_above() {\n    val positionManager = LocationComponentPositionManager(style, \"above1\", null)\n    val requiresUpdate = positionManager.update(\"above2\", null)\n    assertTrue(requiresUpdate)\n  }\n\n  @Test\n  fun update_fromValue_below() {\n    val positionManager = LocationComponentPositionManager(style, null, \"below1\")\n    val requiresUpdate = positionManager.update(null, \"below2\")\n    assertTrue(requiresUpdate)\n  }\n\n  @Test\n  fun addLayer_noModifier() {\n    val positionManager = LocationComponentPositionManager(style, null, null)\n    positionManager.addLayerToMap(layerWrapper)\n\n    verify { layerWrapper.bindTo(style, null) }\n  }\n\n  @Test\n  fun addLayer_above() {\n    val positionManager = LocationComponentPositionManager(style, \"above\", null)\n    positionManager.addLayerToMap(layerWrapper)\n\n    verify { layerWrapper.bindTo(style, LayerPosition(\"above\", null, null)) }\n  }\n\n  @Test\n  fun addLayer_below() {\n    val positionManager = LocationComponentPositionManager(style, null, \"below\")\n    positionManager.addLayerToMap(layerWrapper)\n\n    verify { layerWrapper.bindTo(style, LayerPosition(null, \"below\", null)) }\n  }\n\n  @Test\n  fun addLayer_afterUpdate_above() {\n    val positionManager = LocationComponentPositionManager(style, null, null)\n    positionManager.update(\"above\", null)\n    positionManager.addLayerToMap(layerWrapper)\n\n    verify { layerWrapper.bindTo(style, LayerPosition(\"above\", null, null)) }\n  }\n\n  @Test\n  fun addLayer_afterUpdate_below() {\n    val positionManager = LocationComponentPositionManager(style, null, null)\n    positionManager.update(null, \"below\")\n    positionManager.addLayerToMap(layerWrapper)\n\n    verify { layerWrapper.bindTo(style, LayerPosition(null, \"below\", null)) }\n  }\n\n  @Test\n  fun updateStyle() {\n    val positionManager = LocationComponentPositionManager(style, null, null)\n    val newStyle = mockk<MapboxStyleManager>()\n    positionManager.updateStyle(newStyle)\n    positionManager.update(null, \"below\")\n    positionManager.addLayerToMap(layerWrapper)\n    verify(exactly = 0) { layerWrapper.bindTo(style, LayerPosition(null, \"below\", null)) }\n    verify(exactly = 1) { layerWrapper.bindTo(newStyle, LayerPosition(null, \"below\", null)) }\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/LocationIndicatorLayerRendererTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.BEARING_ICON\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.SHADOW_ICON\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentConstants.TOP_ICON\nimport com.mapbox.maps.plugin.locationcomponent.utils.BitmapUtils\nimport io.mockk.*\nimport org.junit.Assert\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport java.lang.ref.WeakReference\n\n@RunWith(RobolectricTestRunner::class)\nclass LocationIndicatorLayerRendererTest {\n\n  private val style: MapboxStyleManager = mockk(relaxed = true)\n  private val layerWrapper: LocationIndicatorLayerWrapper = mockk(relaxed = true)\n  private val expected: Expected<String, None> = mockk(relaxed = true)\n\n  private val expressionSlot = CapturingSlot<List<Value>>()\n  private val doubleListSlot = CapturingSlot<List<Double>>()\n\n  private val puckOptions = mockk<LocationPuck2D>(relaxed = true)\n  private val topBitmap = mockk<Bitmap>(relaxed = true)\n  private val bearingBitmap = mockk<Bitmap>(relaxed = true)\n  private val shadowBitmap = mockk<Bitmap>(relaxed = true)\n  private val topDrawableResId = 1\n  private val bearingDrawableResId = 2\n  private val shadowDrawableResId = 3\n  private val topImageHolder = ImageHolder.from(topDrawableResId)\n  private val bearingImageHolder = ImageHolder.from(bearingDrawableResId)\n  private val shadowImageHolder = ImageHolder.from(shadowDrawableResId)\n\n  private lateinit var locationLayerRenderer: LocationIndicatorLayerRenderer\n\n  @Before\n  fun setup() {\n    mockkObject(BitmapUtils)\n    every { puckOptions.topImage } returns topImageHolder\n    every { puckOptions.bearingImage } returns bearingImageHolder\n    every { puckOptions.shadowImage } returns shadowImageHolder\n    every { puckOptions.opacity } returns 0.5f\n    every { BitmapUtils.getBitmapFromDrawableRes(any(), topDrawableResId) } returns topBitmap\n    every { BitmapUtils.getBitmapFromDrawableRes(any(), bearingDrawableResId) } returns bearingBitmap\n    every { BitmapUtils.getBitmapFromDrawableRes(any(), shadowDrawableResId) } returns shadowBitmap\n    every { style.removeStyleLayer(any()) } returns expected\n    every { style.styleLayerExists(any()) } returns true\n    every { expected.error } returns null\n    mockkObject(LayerSourceProvider)\n    every { LayerSourceProvider.getLocationIndicatorLayer() } returns layerWrapper\n    every { layerWrapper.layerId } returns \"id\"\n\n    locationLayerRenderer = LocationIndicatorLayerRenderer(\n      puckOptions,\n      WeakReference(mockk<Context>(relaxed = true)),\n    )\n    locationLayerRenderer.initializeComponents(style)\n  }\n\n  @Test\n  fun sanity() {\n    Assert.assertNotNull(locationLayerRenderer)\n  }\n\n  /**\n   * Verify that [LocationLayerRenderer.initializeComponents] in above [setup] calls the right\n   * methods.\n   */\n  @Test\n  fun initializeComponents() {\n    verify(exactly = 1) { layerWrapper.topImage(TOP_ICON) }\n    verify(exactly = 1) { style.addImage(TOP_ICON, topBitmap) }\n\n    verify(exactly = 1) { layerWrapper.bearingImage(BEARING_ICON) }\n    verify(exactly = 1) { style.addImage(BEARING_ICON, bearingBitmap) }\n\n    verify(exactly = 1) { layerWrapper.shadowImage(SHADOW_ICON) }\n    verify(exactly = 1) { style.addImage(SHADOW_ICON, shadowBitmap) }\n\n    verify(exactly = 1) { layerWrapper.opacity(eq(0.5)) }\n  }\n\n  @Test\n  fun verifyUseBitmapImage() {\n    val topBitmap2 = mockk<Bitmap>(relaxed = true)\n    val bearingBitmap2 = mockk<Bitmap>(relaxed = true)\n    val shadowBitmap2 = mockk<Bitmap>(relaxed = true)\n    val puckOptions2 = mockk<LocationPuck2D>(relaxed = true) {\n      every { topImage } returns ImageHolder.from(topBitmap2)\n      every { bearingImage } returns ImageHolder.from(bearingBitmap2)\n      every { shadowImage } returns ImageHolder.from(shadowBitmap2)\n      every { opacity } returns 0.3F\n    }\n    val locationLayerRenderer2 = LocationIndicatorLayerRenderer(\n      puckOptions2,\n      WeakReference(mockk<Context>(relaxed = true)),\n    )\n    locationLayerRenderer2.initializeComponents(style)\n\n    verify(exactly = 1) { style.addImage(TOP_ICON, topBitmap2) }\n    verify(exactly = 1) { style.addImage(BEARING_ICON, bearingBitmap2) }\n    verify(exactly = 1) { style.addImage(SHADOW_ICON, shadowBitmap2) }\n  }\n\n  @Test\n  fun initializeComponents_withLocation() {\n    val latLng = Point.fromLngLat(10.0, 20.0)\n    val bearing = 11.0\n    val accuracy = 65f\n    locationLayerRenderer.setLatLng(latLng)\n    locationLayerRenderer.setBearing(bearing)\n    locationLayerRenderer.setAccuracyRadius(accuracy)\n\n    locationLayerRenderer.initializeComponents(style)\n\n    verify { layerWrapper.location(capture(doubleListSlot)) }\n    assertEquals(latLng.toLocationList(), doubleListSlot.captured)\n    verify { layerWrapper.bearing(bearing.toDouble()) }\n    verify { layerWrapper.accuracyRadius(accuracy.toDouble()) }\n  }\n\n  @Test\n  fun addLayers() {\n    val positionManager: LocationComponentPositionManager = mockk(relaxUnitFun = true)\n\n    locationLayerRenderer.addLayers(positionManager)\n\n    verify { positionManager.addLayerToMap(layerWrapper) }\n  }\n\n  @Test\n  fun removeLayers() {\n    locationLayerRenderer.removeLayers()\n\n    verify { style.removeStyleLayer(\"id\") }\n  }\n\n  @Test\n  fun hide() {\n    locationLayerRenderer.hide()\n    verify { layerWrapper.visibility(false) }\n  }\n\n  @Test\n  fun show() {\n    locationLayerRenderer.show()\n\n    verify { layerWrapper.visibility(true) }\n  }\n\n  @Test\n  fun styleAccuracy() {\n    val colorArray: FloatArray = LocationIndicatorLayerRenderer.colorToRgbaArray(Color.RED)\n    colorArray[3] = 1.0f\n    val rgbaExpression = LocationIndicatorLayerRenderer.buildRGBAExpression(colorArray)\n\n    locationLayerRenderer.styleAccuracy(Color.RED, Color.RED)\n\n    verify { layerWrapper.accuracyRadiusColor(capture(expressionSlot)) }\n    assertEquals(rgbaExpression.toString(), expressionSlot.captured.toString())\n    verify { layerWrapper.accuracyRadiusBorderColor(capture(expressionSlot)) }\n    assertEquals(rgbaExpression.toString(), expressionSlot.captured.toString())\n  }\n\n  @Test\n  fun setLatLng() {\n    val latLng = Point.fromLngLat(10.0, 20.0)\n    locationLayerRenderer.setLatLng(latLng)\n\n    verify {\n      layerWrapper.location(latLng.toLocationList())\n    }\n  }\n\n  @Test\n  fun setBearing() {\n    val bearing = 30.0\n    locationLayerRenderer.setBearing(bearing)\n    verify { layerWrapper.bearing(bearing) }\n  }\n\n  @Test\n  fun setAccuracyRadius() {\n    val radius = 40.0\n    locationLayerRenderer.setAccuracyRadius(radius.toFloat())\n\n    verify { layerWrapper.accuracyRadius(radius) }\n  }\n\n  @Test\n  fun styleScaling() {\n    val exp = Value(\"\")\n    locationLayerRenderer.styleScaling(exp)\n\n    verify { layerWrapper.shadowImageSize(exp) }\n    verify { layerWrapper.bearingImageSize(exp) }\n    verify { layerWrapper.topImageSize(exp) }\n  }\n\n  @Test\n  fun testAddBitmaps() {\n    verify {\n      style.addImage(\n        TOP_ICON,\n        any() as Bitmap\n      )\n    }\n    verify(exactly = 1) {\n      style.addImage(\n        BEARING_ICON,\n        any() as Bitmap\n      )\n    }\n    verify {\n      style.addImage(\n        SHADOW_ICON,\n        any() as Bitmap\n      )\n    }\n  }\n\n  @Test\n  fun updateStyle() {\n    val newStyle = mockk<MapboxStyleManager>(relaxed = true)\n    locationLayerRenderer.updateStyle(newStyle)\n    verify { layerWrapper.updateStyle(newStyle) }\n    locationLayerRenderer.removeLayers()\n    verify(exactly = 0) { style.removeStyleLayer(any()) }\n    verify(exactly = 1) { newStyle.removeStyleLayer(any()) }\n  }\n\n  private fun Point.toLocationList() = listOf(latitude(), longitude(), 0.0)\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/LocationIndicatorLayerWrapperTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.logE\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass LocationIndicatorLayerWrapperTest {\n\n  private val style: MapboxStyleManager = mockk(relaxed = true)\n  private val layer = LocationIndicatorLayerWrapper(INDICATOR_LAYER_ID)\n  private val expected: Expected<String, None> = mockk(relaxed = true)\n\n  @Before\n  fun setup() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { style.addPersistentStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { expected.error } returns null\n\n    layer.bindTo(style)\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun testInitialProperties() {\n    val value = layer.toValue()\n    assertEquals(\"{bearing-transition={duration=0, delay=0}, image-pitch-displacement=4.0, location-transition={duration=0, delay=0}, perspective-compensation=0.9, id=indicatorLayerId, type=location-indicator}\", value.toString())\n  }\n\n  @Test\n  fun testBearing() {\n    val bearing = 1.0\n    layer.bearing(bearing)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"bearing\", Value(bearing)) }\n  }\n\n  @Test\n  fun testLocation() {\n    val location = arrayListOf(1.0, 2.0)\n    layer.location(location)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"location\", Value(location.map(::Value))) }\n  }\n\n  @Test\n  fun testAccuracyRadiusColor() {\n    val expression = arrayListOf(Value(\"rgb\"), Value(1), Value(2))\n    layer.accuracyRadiusColor(expression)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"accuracy-radius-color\", Value(expression)) }\n  }\n\n  @Test\n  fun testAccuracyRadiusBorderColor() {\n    val expression = arrayListOf(Value(\"rgb\"), Value(1), Value(2))\n    layer.accuracyRadiusBorderColor(expression)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"accuracy-radius-border-color\", Value(expression)) }\n  }\n\n  @Test\n  fun testShadowImageSize() {\n    val expression = Value(arrayListOf(Value(1.0), Value(2.0)))\n    layer.shadowImageSize(expression)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"shadow-image-size\", expression) }\n  }\n\n  @Test\n  fun testBearingImageSize() {\n    val expression = Value(arrayListOf(Value(1.0), Value(2.0)))\n    layer.bearingImageSize(expression)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"bearing-image-size\", expression) }\n  }\n\n  @Test\n  fun testTopImageSize() {\n    val expression = Value(arrayListOf(Value(1.0), Value(2.0)))\n    layer.topImageSize(expression)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"top-image-size\", expression) }\n  }\n\n  @Test\n  fun testAccuracyRadius() {\n    val radius = 1.0\n    layer.accuracyRadius(radius)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"accuracy-radius\", Value(radius)) }\n  }\n\n  @Test\n  fun testEmphasisCircleRadius() {\n    val radius = 1.0\n    layer.emphasisCircleRadius(radius)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"emphasis-circle-radius\", Value(radius)) }\n  }\n\n  @Test\n  fun testEmphasisCircleColorTransition() {\n    val delay = 1L\n    val duration = 2L\n    layer.emphasisCircleColorTransition(delay = delay, duration = duration)\n    val transition = HashMap<String, Value>()\n    transition[\"delay\"] = Value(delay)\n    transition[\"duration\"] = Value(duration)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"emphasis-circle-color-transition\", Value(transition)) }\n  }\n\n  @Test\n  fun testEmphasisCircleColor() {\n    val expression = arrayListOf(Value(\"rgb\"), Value(1), Value(2))\n    layer.emphasisCircleColor(expression)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"emphasis-circle-color\", Value(expression)) }\n  }\n\n  @Test\n  fun testTopImage() {\n    val topImage = \"topImage\"\n    layer.topImage(topImage)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"top-image\", Value(topImage)) }\n  }\n\n  @Test\n  fun testBearingImage() {\n    val bearingImage = \"bearingImage\"\n    layer.bearingImage(bearingImage)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"bearing-image\", Value(bearingImage)) }\n  }\n\n  @Test\n  fun testShadowImage() {\n    val shadowImage = \"shadowImage\"\n    layer.shadowImage(shadowImage)\n    verify { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"shadow-image\", Value(shadowImage)) }\n  }\n\n  @Test\n  fun testLayerNotReady() {\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns ExpectedFactory.createError(\"error\")\n    val bearing = 1.0\n    layer.bearing(bearing)\n    verify(exactly = 1) { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"bearing\", Value(bearing)) }\n    verify(exactly = 1) { logE(any(), any()) }\n  }\n\n  @Test\n  fun testUpdateStyle() {\n    val newStyle = mockk<MapboxStyleManager>(relaxed = true)\n    every { newStyle.setStyleLayerProperty(any(), any(), any()) } returns expected\n    layer.updateStyle(newStyle)\n    val radius = 1.0\n    layer.accuracyRadius(radius)\n    verify(exactly = 0) { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"accuracy-radius\", any()) }\n    verify(exactly = 1) { newStyle.setStyleLayerProperty(INDICATOR_LAYER_ID, \"accuracy-radius\", any()) }\n  }\n\n  @Test\n  fun testSlot() {\n    val middleSlot = \"middle\"\n    layer.slot(middleSlot)\n    verify(exactly = 1) { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"slot\", Value(middleSlot)) }\n  }\n\n  @Test\n  fun testNullSlot() {\n    layer.slot(null)\n    verify(exactly = 1) { style.setStyleLayerProperty(INDICATOR_LAYER_ID, \"slot\", Value(\"\")) }\n  }\n\n  companion object {\n    private const val INDICATOR_LAYER_ID = \"indicatorLayerId\"\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/LocationLayerWrapperTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.logE\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass LocationLayerWrapperTest {\n  private lateinit var locationLayerWrapper: LocationLayerWrapper\n  private val layerId = \"testLayerId\"\n  private val mapStyleDelegate = mockk<MapboxStyleManager>(relaxed = true)\n\n  @Before\n  fun setup() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    locationLayerWrapper = LocationLayerWrapper(layerId)\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun testBindTo() {\n    every { mapStyleDelegate.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    val position = LayerPosition(\"above\", \"below\", 0)\n    locationLayerWrapper.bindTo(mapStyleDelegate, position)\n    verify { mapStyleDelegate.addPersistentStyleLayer(any(), position) }\n  }\n\n  @Test(expected = RuntimeException::class)\n  fun testBindToAddLayerFailed() {\n    every { mapStyleDelegate.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createError(\"error\")\n    val position = LayerPosition(\"above\", \"below\", 0)\n    locationLayerWrapper.bindTo(mapStyleDelegate, position)\n    verify { mapStyleDelegate.addPersistentStyleLayer(any(), position) }\n  }\n\n  @Test\n  fun testVisibilityWhenLayerExists() {\n    every { mapStyleDelegate.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { mapStyleDelegate.setStyleLayerProperty(layerId, any(), any()) } returns ExpectedFactory.createNone()\n    val position = LayerPosition(\"above\", \"below\", 0)\n    locationLayerWrapper.bindTo(mapStyleDelegate, position)\n    locationLayerWrapper.visibility(true)\n    verify { mapStyleDelegate.setStyleLayerProperty(layerId, \"visibility\", Value(\"visible\")) }\n  }\n\n  fun testVisibilityWhenLayerExistSetPropertyFailed() {\n    every { mapStyleDelegate.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { mapStyleDelegate.setStyleLayerProperty(layerId, any(), any()) } returns ExpectedFactory.createError(\"error\")\n    val position = LayerPosition(\"above\", \"below\", 0)\n    locationLayerWrapper.bindTo(mapStyleDelegate, position)\n    locationLayerWrapper.visibility(true)\n    verify(exactly = 1) { mapStyleDelegate.setStyleLayerProperty(layerId, \"visibility\", Value(\"visible\")) }\n    verify(exactly = 1) { logE(any(), any()) }\n  }\n\n  @Test\n  fun updateStyle() {\n    every { mapStyleDelegate.addPersistentStyleLayer(any(), any()) } returns ExpectedFactory.createNone()\n    every { mapStyleDelegate.setStyleLayerProperty(layerId, any(), any()) } returns ExpectedFactory.createNone()\n    val position = LayerPosition(\"above\", \"below\", 0)\n    locationLayerWrapper.bindTo(mapStyleDelegate, position)\n    val newStyle = mockk<MapboxStyleManager>()\n    every { newStyle.setStyleLayerProperty(layerId, any(), any()) } returns ExpectedFactory.createNone()\n    locationLayerWrapper.updateStyle(newStyle)\n    locationLayerWrapper.visibility(true)\n    verify(exactly = 0) { mapStyleDelegate.setStyleLayerProperty(layerId, \"visibility\", Value(\"visible\")) }\n    verify(exactly = 1) { newStyle.setStyleLayerProperty(layerId, \"visibility\", Value(\"visible\")) }\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/LocationPuckManagerTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.LocationPuck2D\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.locationcomponent.animators.PuckAnimatorManager\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings\nimport com.mapbox.maps.util.captureVararg\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkObject\nimport io.mockk.mockkStatic\nimport io.mockk.runs\nimport io.mockk.unmockkAll\nimport io.mockk.unmockkObject\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport io.mockk.verifyOrder\nimport org.junit.After\nimport org.junit.Assert.assertArrayEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass LocationPuckManagerTest {\n\n  private val settings = mockk<LocationComponentSettings>(relaxed = true)\n  private val delegateProvider = mockk<MapDelegateProvider>(relaxed = true)\n  private val mapCameraDelegate = mockk<MapCameraManagerDelegate>(relaxed = true)\n  private val style = mockk<MapboxStyleManager>(relaxed = true)\n  private val positionManager = mockk<LocationComponentPositionManager>(relaxed = true)\n  private val locationLayerRenderer = mockk<LocationIndicatorLayerRenderer>()\n  private val modelLayerRenderer = mockk<ModelLayerRenderer>()\n  private val animationManager = mockk<PuckAnimatorManager>(relaxed = true)\n\n  private lateinit var locationPuckManager: LocationPuckManager\n\n  @Before\n  fun setup() {\n    mockkStatic(Value::class)\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    mockkObject(LayerSourceProvider)\n    every { LayerSourceProvider.getLocationIndicatorLayerRenderer(any(), any()) } returns locationLayerRenderer\n    every { LayerSourceProvider.getModelLayerRenderer(any()) } returns modelLayerRenderer\n    every { logE(any(), any()) } just runs\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraDelegate\n    every { delegateProvider.mapStyleManagerDelegate } returns style\n    every { mapCameraDelegate.cameraState.bearing } returns 0.0\n    every { mapCameraDelegate.cameraState } returns CameraState(\n      Point.fromLngLat(0.0, 0.0),\n      EdgeInsets(0.0, 0.0, 0.0, 0.0),\n      0.0,\n      0.0,\n      0.0\n    )\n    every { settings.locationPuck } returns LocationPuck2D()\n    every { settings.enabled } returns true\n    every { settings.puckBearingEnabled } returns true\n    every { locationLayerRenderer.clearBitmaps() } just runs\n    every { locationLayerRenderer.isRendererInitialised() } returns false\n    every { locationLayerRenderer.show() } just runs\n    every { locationLayerRenderer.hide() } just runs\n    every { locationLayerRenderer.styleScaling(any()) } just runs\n    every { locationLayerRenderer.addLayers(any()) } just runs\n    every { locationLayerRenderer.removeLayers() } just runs\n    every { locationLayerRenderer.initializeComponents(any()) } just runs\n    every { locationLayerRenderer.updateStyle(any()) } just runs\n    every { locationLayerRenderer.slot(any()) } just runs\n    locationPuckManager = LocationPuckManager(\n      settings,\n      mockk(),\n      delegateProvider,\n      positionManager,\n      animationManager\n    )\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    unmockkStatic(Value::class)\n    unmockkObject(LayerSourceProvider)\n    unmockkAll()\n  }\n\n  @Test\n  fun testInitialise() {\n    locationPuckManager.initialize(style)\n    verify { animationManager.setLocationLayerRenderer(locationLayerRenderer) }\n    verify { animationManager.setUpdateListeners(any(), any(), any()) }\n    verify { locationLayerRenderer.addLayers(positionManager) }\n    verify { locationLayerRenderer.initializeComponents(style) }\n    verify { locationLayerRenderer.hide() }\n  }\n\n  @Test\n  fun testInitialiseWithLocation() {\n    every { settings.showAccuracyRing } returns true\n    locationPuckManager.lastLocation = Point.fromLngLat(0.0, 0.0)\n    locationPuckManager.initialize(style)\n    verify { animationManager.setLocationLayerRenderer(locationLayerRenderer) }\n    verify { animationManager.setUpdateListeners(any(), any(), any()) }\n    verify { animationManager.animateAccuracyRadius(any(), any(), options = any()) }\n    verify { locationLayerRenderer.addLayers(positionManager) }\n    verify { locationLayerRenderer.initializeComponents(style) }\n    verify { locationLayerRenderer.show() }\n  }\n\n  @Test\n  fun testInitialiseSetsBearingAndLocationBeforeAddingLayers() {\n    locationPuckManager.lastLocation = Point.fromLngLat(10.0, 20.0)\n    locationPuckManager.initialize(style)\n\n    val locations = mutableListOf<Point>()\n    val bearings = mutableListOf<Double>()\n\n    verifyOrder {\n      animationManager.animatePosition(targets = captureVararg(locations), options = null)\n      animationManager.animateBearing(\n        targets = captureVararg(bearings).toDoubleArray(),\n        options = null\n      )\n      locationLayerRenderer.initializeComponents(style)\n      locationLayerRenderer.show()\n    }\n\n    assertArrayEquals(\n      locations.toTypedArray(),\n      arrayOf(locationPuckManager.lastLocation, locationPuckManager.lastLocation)\n    )\n    assertArrayEquals(\n      bearings.toTypedArray(),\n      arrayOf(0.0, 0.0)\n    )\n  }\n\n  @Test\n  fun testInitialiseWithDisabled() {\n    every { settings.enabled } returns false\n    locationPuckManager.initialize(style)\n    verify { animationManager.setLocationLayerRenderer(locationLayerRenderer) }\n    verify { locationLayerRenderer.addLayers(positionManager) }\n    verify { locationLayerRenderer.initializeComponents(style) }\n    verify { locationLayerRenderer.hide() }\n  }\n\n  @Test\n  fun testCleanUp() {\n    locationPuckManager.cleanUp()\n    verify { locationLayerRenderer.hide() }\n    assertTrue(locationPuckManager.isHidden)\n    verify { locationLayerRenderer.hide() }\n    verify { locationLayerRenderer.clearBitmaps() }\n    verify { locationLayerRenderer.removeLayers() }\n  }\n\n  @Test\n  fun testIsLayerInitialised() {\n    every { locationLayerRenderer.isRendererInitialised() } returns true\n    assertTrue(locationPuckManager.isLayerInitialised())\n    verify { locationLayerRenderer.isRendererInitialised() }\n  }\n\n  @Test\n  fun testUpdateSettings() {\n    every { settings.layerAbove } returns \"layer-above\"\n    every { settings.layerBelow } returns \"layer-below\"\n    locationPuckManager.updateSettings(settings)\n    verify { positionManager.layerAbove = \"layer-above\" }\n    verify { positionManager.layerBelow = \"layer-below\" }\n    verify { locationLayerRenderer.clearBitmaps() }\n    verify { locationLayerRenderer.removeLayers() }\n    verify { locationLayerRenderer.addLayers(positionManager) }\n    verify { locationLayerRenderer.initializeComponents(style) }\n    verify { locationLayerRenderer.hide() }\n\n    locationPuckManager.lastLocation = Point.fromLngLat(0.0, 0.0)\n    locationPuckManager.updateSettings(settings)\n    locationPuckManager.locationLayerRenderer = locationLayerRenderer\n    verify { locationLayerRenderer.show() }\n  }\n\n  @Test\n  fun testOnStart() {\n    locationPuckManager.onStart()\n    verify { animationManager.onStart() }\n  }\n\n  @Test\n  fun testOnStop() {\n    locationPuckManager.onStop()\n    verify { animationManager.onStop() }\n  }\n\n  @Test\n  fun testUpdateCurrentPosition() {\n    locationPuckManager.updateCurrentPosition(Point.fromLngLat(0.0, 0.0))\n    verify { animationManager.animatePosition(targets = anyVararg(), options = null) }\n  }\n\n  @Test\n  fun testFirstLocationUpdateWhileEnabled() {\n    every { settings.enabled } returns true\n    locationPuckManager.updateCurrentPosition(Point.fromLngLat(0.0, 0.0))\n    verify { animationManager.animatePosition(targets = anyVararg(), options = null) }\n    verify(exactly = 1) { locationLayerRenderer.show() }\n    locationPuckManager.updateCurrentPosition(Point.fromLngLat(10.0, 10.0))\n    verify { animationManager.animatePosition(targets = anyVararg(), options = null) }\n    verify(exactly = 1) { locationLayerRenderer.show() }\n  }\n\n  @Test\n  fun testFirstLocationUpdateWhileDisabled() {\n    every { settings.enabled } returns false\n    locationPuckManager.updateCurrentPosition(Point.fromLngLat(0.0, 0.0))\n    verify { animationManager.animatePosition(targets = anyVararg(), options = null) }\n    verify(exactly = 0) { locationLayerRenderer.show() }\n    locationPuckManager.updateCurrentPosition(Point.fromLngLat(10.0, 10.0))\n    verify { animationManager.animatePosition(targets = anyVararg(), options = null) }\n    verify(exactly = 0) { locationLayerRenderer.show() }\n  }\n\n  @Test\n  fun testUpdateCurrentBearing() {\n    locationPuckManager.updateCurrentBearing(1.0)\n    verify { animationManager.animateBearing(targets = anyDoubleVararg(), options = null) }\n  }\n\n  @Test\n  fun testUpdateCurrentBearingWithinThreshold() {\n    locationPuckManager.updateCurrentBearing(0.005)\n    locationPuckManager.updateCurrentBearing(0.01)\n    locationPuckManager.updateCurrentBearing(0.5)\n    locationPuckManager.updateCurrentBearing(0.9)\n    verify(exactly = 0) {\n      animationManager.animateBearing(\n        targets = anyDoubleVararg(),\n        options = null\n      )\n    }\n  }\n\n  @Test\n  fun testUpdateCurrentBearingWithForceUpdate() {\n    locationPuckManager.updateCurrentBearing(0.005, forceUpdate = true)\n    verify { animationManager.animateBearing(targets = anyDoubleVararg(), options = null) }\n  }\n\n  @Test\n  fun testUpdateLocationAnimator() {\n    locationPuckManager.updateLocationAnimator { }\n    verify { animationManager.updatePositionAnimator(any()) }\n  }\n\n  @Test\n  fun testUpdateBearingAnimator() {\n    locationPuckManager.updateBearingAnimator { }\n    verify { animationManager.updateBearingAnimator(any()) }\n  }\n\n  @Test\n  fun testShow() {\n    locationPuckManager.isHidden = true\n    locationPuckManager.show()\n    verify { locationLayerRenderer.show() }\n    assertFalse(locationPuckManager.isHidden)\n  }\n\n  @Test\n  fun testShowWhileAlreadyShown() {\n    locationPuckManager.isHidden = false\n    locationPuckManager.show()\n    verify(exactly = 0) { locationLayerRenderer.show() }\n    assertFalse(locationPuckManager.isHidden)\n  }\n\n  @Test\n  fun testShowForceUpdate() {\n    locationPuckManager.isHidden = false\n    locationPuckManager.show(forceUpdate = true)\n    verify { locationLayerRenderer.show() }\n    assertFalse(locationPuckManager.isHidden)\n  }\n\n  @Test\n  fun testHide() {\n    locationPuckManager.hide()\n    verify { locationLayerRenderer.hide() }\n    assertTrue(locationPuckManager.isHidden)\n  }\n\n  @Test\n  fun test2DStyleScaling() {\n    every { settings.locationPuck } returns LocationPuck2D(\n      scaleExpression = \"expression\"\n    )\n    every { Value.fromJson(any()) } returns ExpectedFactory.createValue(Value(\"expression\"))\n    locationPuckManager.styleScaling(settings)\n    verify { locationLayerRenderer.styleScaling(Value(\"expression\")) }\n  }\n\n  @Test\n  fun testDefault2DStyleScaling() {\n    every { settings.locationPuck } returns LocationPuck2D()\n    every { Value.fromJson(any()) } returns ExpectedFactory.createValue(Value(\"expression\"))\n    locationPuckManager.styleScaling(settings)\n    verify(exactly = 0) { locationLayerRenderer.styleScaling(any()) }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun test3DStyleScaling() {\n    locationPuckManager.locationLayerRenderer = modelLayerRenderer\n    every { modelLayerRenderer.styleScaling(any()) } just runs\n    every { settings.locationPuck } returns LocationPuck3D(\n      modelUri = \"uri\",\n      modelScaleExpression = \"expression\"\n    )\n    every { Value.fromJson(any()) } returns ExpectedFactory.createValue(Value(\"expression\"))\n    locationPuckManager.styleScaling(settings)\n    verify { modelLayerRenderer.styleScaling(Value(\"expression\")) }\n  }\n\n  @Test\n  fun testDoesntInitialiseIfRendererInitialised() {\n    every { locationLayerRenderer.isRendererInitialised() } returns true\n\n    locationPuckManager.initialize(style)\n\n    verify(exactly = 0) { animationManager.setLocationLayerRenderer(locationLayerRenderer) }\n    verify(exactly = 0) { animationManager.setUpdateListeners(any(), any(), any()) }\n    verify(exactly = 0) { locationLayerRenderer.addLayers(positionManager) }\n    verify(exactly = 0) { locationLayerRenderer.initializeComponents(style) }\n    verify(exactly = 0) { locationLayerRenderer.hide() }\n  }\n\n  @Test\n  fun testUpdateStyle() {\n    val style = mockk<MapboxStyleManager>()\n    locationPuckManager.updateStyle(style)\n    verify {\n      locationLayerRenderer.updateStyle(style)\n      positionManager.updateStyle(style)\n    }\n  }\n\n  @Test\n  fun testMaxPulsingRadiusToFollowAccuracyRing() {\n    every { settings.pulsingMaxRadius } returns -1f\n    locationPuckManager.updateMaxPulsingRadiusToFollowAccuracyRing(10.0)\n    verify { animationManager.updatePulsingRadius(any(), settings) }\n  }\n\n  @Test\n  fun testDefaultMaxPulsingRadiusBehaviour() {\n    every { settings.pulsingMaxRadius } returns 10.0f\n    locationPuckManager.updateMaxPulsingRadiusToFollowAccuracyRing(10.0)\n    verify(exactly = 0) { animationManager.updatePulsingRadius(any(), settings) }\n  }\n\n  @Test\n  fun testDisablePuckBearingSnapsToNorth() {\n    val lastBearing = 180.0\n    val settings = LocationComponentSettings(LocationPuck2D()) {\n      puckBearingEnabled = false\n    }\n    val bearings = mutableListOf<Double>()\n    every { animationManager.puckAnimationEnabled } returns true\n\n    locationPuckManager.lastBearing = lastBearing\n    locationPuckManager.updateSettings(settings)\n\n    verify(exactly = 1) {\n      animationManager.animateBearing(\n        targets = captureVararg(bearings).toDoubleArray(),\n        options = any()\n      )\n    }\n\n    assertArrayEquals(\n      arrayOf(180.0, 0.0),\n      bearings.toTypedArray()\n    )\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/ModelLayerRendererTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.plugin.LocationPuck3D\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.Before\nimport org.junit.Test\n\nclass ModelLayerRendererTest {\n\n  private val style: MapboxStyleManager = mockk(relaxed = true)\n  private val layerSourceProvider: LayerSourceProvider = mockk(relaxed = true)\n  private val layerWrapper: ModelLayerWrapper = mockk(relaxed = true)\n  private val sourceWrapper: ModelSourceWrapper = mockk(relaxUnitFun = true, relaxed = true)\n  private val option: LocationPuck3D = mockk(relaxed = true)\n  private val expected: Expected<String, None> = mockk(relaxed = true)\n\n  private lateinit var locationLayerRenderer: ModelLayerRenderer\n\n  @Before\n  fun setup() {\n    every { style.removeStyleLayer(any()) } returns expected\n    every { style.styleLayerExists(any()) } returns true\n    every { style.styleSourceExists(any()) } returns true\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n    every { expected.error } returns null\n    every { layerSourceProvider.getModelLayer(any()) } returns layerWrapper\n    every { layerSourceProvider.getModelSource(any()) } returns sourceWrapper\n    every { layerWrapper.layerId } returns \"id\"\n    every { option.modelRotation } returns listOf(0.0f, 0.0f, 0.0f)\n    every { option.modelOpacity } returns 0.5f\n    locationLayerRenderer = ModelLayerRenderer(layerSourceProvider, option)\n    locationLayerRenderer.initializeComponents(style)\n  }\n\n  /**\n   * Verify that [LocationLayerRenderer.initializeComponents] in above [setup] calls the right\n   * methods.\n   */\n  @Test\n  fun initializeComponents() {\n    verify(exactly = 1) { sourceWrapper.bindTo(style) }\n  }\n\n  @Test\n  fun initializeComponents_withLocation() {\n    val latLng = Point.fromLngLat(10.0, 20.0)\n    val bearing = 11.0\n    locationLayerRenderer.setLatLng(latLng)\n    locationLayerRenderer.setBearing(bearing)\n\n    locationLayerRenderer.initializeComponents(style)\n\n    verify { sourceWrapper.setPositionAndOrientation(listOf(10.0, 20.0), listOf(0.0, 0.0, 11.0)) }\n    verify(exactly = 0) { layerWrapper.modelRotation(any()) }\n  }\n\n  @Test\n  fun addLayers() {\n    val positionManager: LocationComponentPositionManager = mockk(relaxUnitFun = true)\n\n    locationLayerRenderer.addLayers(positionManager)\n\n    verify { positionManager.addLayerToMap(layerWrapper) }\n  }\n\n  @Test\n  fun removeLayers() {\n    locationLayerRenderer.removeLayers()\n    verify { style.removeStyleLayer(\"id\") }\n  }\n\n  @Test\n  fun hide() {\n    locationLayerRenderer.hide()\n    verify { layerWrapper.visibility(false) }\n  }\n\n  @Test\n  fun show() {\n    locationLayerRenderer.show()\n    verify { layerWrapper.visibility(true) }\n  }\n\n  @Test\n  fun setLatLng() {\n    val latLng = Point.fromLngLat(10.0, 20.0)\n    locationLayerRenderer.setLatLng(latLng)\n\n    verify {\n      sourceWrapper.setPositionAndOrientation(listOf(10.0, 20.0), listOf(0.0, 0.0, 0.0))\n    }\n  }\n\n  @Test\n  fun setBearingWithoutLastLocation() {\n    val bearing = 30.0\n    locationLayerRenderer.show()\n    locationLayerRenderer.setBearing(bearing)\n    verify(exactly = 0) { sourceWrapper.setPositionAndOrientation(any(), any()) }\n  }\n\n  @Test\n  fun setBearingWithLastLocation() {\n    val bearing = 30.0\n    locationLayerRenderer.show()\n    locationLayerRenderer.lastLocation = Point.fromLngLat(0.0, 0.0)\n    locationLayerRenderer.setBearing(bearing)\n    verify(exactly = 1) { sourceWrapper.setPositionAndOrientation(any(), listOf(0.0, 0.0, bearing)) }\n  }\n\n  @Test\n  fun updateStyle() {\n    val newStyle = mockk<MapboxStyleManager>(relaxed = true)\n    locationLayerRenderer.updateStyle(newStyle)\n    verify {\n      sourceWrapper.updateStyle(newStyle)\n      layerWrapper.updateStyle(newStyle)\n    }\n    locationLayerRenderer.removeLayers()\n    verify(exactly = 0) { style.removeStyleLayer(any()) }\n    verify(exactly = 1) { newStyle.removeStyleLayer(any()) }\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/ModelLayerWrapperTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.extension.style.utils.ColorUtils.colorIntToRgbaExpression\nimport com.mapbox.maps.logE\nimport com.mapbox.maps.plugin.ModelElevationReference\nimport com.mapbox.maps.plugin.ModelScaleMode\nimport com.mapbox.maps.plugin.locationcomponent.utils.take\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\n@OptIn(MapboxExperimental::class)\nclass ModelLayerWrapperTest {\n\n  private val style: MapboxStyleManager = mockk(relaxed = true)\n  private val layer = ModelLayerWrapper(\n    layerId = MODEL_LAYER_ID,\n    sourceId = MODEL_SOURCE_ID,\n    modelScale = INITIAL_SCALE,\n    modelRotation = INITIAL_ROTATION,\n    modelRotationExpression = null,\n    modelTranslation = INITIAL_TRANSLATION,\n    modelCastShadows = INITIAL_CAST_SHADOWS,\n    modelReceiveShadows = INITIAL_RECEIVE_SHADOWS,\n    modelOpacity = INITIAL_OPACITY,\n    modelOpacityExpression = null,\n    modelScaleMode = INITIAL_SCALE_MODE,\n    modelEmissiveStrength = INITIAL_MODEL_EMISSIVE_STENGTH,\n    modelEmissiveStrengthExpression = null,\n    modelColor = INITIAL_MODEL_COLOR,\n    modelColorExpression = null,\n    modelColorMixIntensity = INITIAL_MODEL_COLOR_MIX_INTENSITY,\n    modelColorMixIntensityExpression = null,\n    modelElevationReference = INITIAL_MODEL_ELEVATION_REFERENCE,\n  )\n  private val layerWithExpression = ModelLayerWrapper(\n    layerId = MODEL_LAYER_ID,\n    sourceId = MODEL_SOURCE_ID,\n    modelScale = INITIAL_SCALE,\n    modelRotation = INITIAL_ROTATION,\n    modelRotationExpression = INITIAL_ROTATION_EXPRESSION,\n    modelTranslation = INITIAL_TRANSLATION,\n    modelCastShadows = INITIAL_CAST_SHADOWS,\n    modelReceiveShadows = INITIAL_RECEIVE_SHADOWS,\n    modelOpacity = INITIAL_OPACITY,\n    modelOpacityExpression = INITIAL_OPACITY_EXPRESSION,\n    modelScaleMode = INITIAL_SCALE_MODE,\n    modelEmissiveStrength = INITIAL_MODEL_EMISSIVE_STENGTH,\n    modelEmissiveStrengthExpression = INITIAL_MODEL_EMISSIVE_STENGTH_EXPRESSION,\n    modelColor = INITIAL_MODEL_COLOR,\n    modelColorExpression = INITIAL_MODEL_COLOR_EXPRESSION,\n    modelColorMixIntensity = INITIAL_MODEL_COLOR_MIX_INTENSITY,\n    modelColorMixIntensityExpression = INITIAL_MODEL_COLOR_MIX_INTENSITY_EXPRESSION,\n    modelElevationReference = INITIAL_MODEL_ELEVATION_REFERENCE,\n  )\n  private val expected: Expected<String, None> = mockk(relaxed = true)\n\n  @Before\n  fun setup() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { style.addPersistentStyleLayer(any(), any()) } returns expected\n    every { style.setStyleLayerProperty(any(), any(), any()) } returns expected\n    every { expected.error } returns null\n    layer.bindTo(style)\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun testInitialProperties() {\n    assertEquals(\n      hashMapOf(\n        \"model-type\" to \"location-indicator\",\n        \"model-rotation\" to INITIAL_ROTATION,\n        \"model-scale\" to INITIAL_SCALE,\n        \"model-translation\" to INITIAL_TRANSLATION,\n        \"model-opacity\" to INITIAL_OPACITY,\n        \"model-scale-mode\" to INITIAL_SCALE_MODE.value,\n        \"id\" to MODEL_LAYER_ID,\n        \"source\" to MODEL_SOURCE_ID,\n        \"type\" to \"model\",\n        \"model-receive-shadows\" to INITIAL_RECEIVE_SHADOWS,\n        \"model-cast-shadows\" to INITIAL_CAST_SHADOWS,\n        \"model-scale-transition\" to hashMapOf(\"duration\" to 0, \"delay\" to 0),\n        \"model-rotation-transition\" to hashMapOf(\"duration\" to 0, \"delay\" to 0),\n        \"model-emissive-strength\" to INITIAL_MODEL_EMISSIVE_STENGTH,\n        \"model-color\" to colorIntToRgbaExpression(INITIAL_MODEL_COLOR),\n        \"model-color-mix-intensity\" to INITIAL_MODEL_COLOR_MIX_INTENSITY,\n        \"model-elevation-reference\" to INITIAL_MODEL_ELEVATION_REFERENCE.value,\n      ).toValue(),\n      layer.toValue(),\n    )\n  }\n\n  @Test\n  fun testInitialPropertiesWithExpressions() {\n    assertEquals(\n      hashMapOf(\n        \"model-type\" to \"location-indicator\",\n        \"model-rotation\" to INITIAL_ROTATION_EXPRESSION,\n        \"model-scale\" to INITIAL_SCALE,\n        \"model-translation\" to INITIAL_TRANSLATION,\n        \"model-opacity\" to INITIAL_OPACITY_EXPRESSION,\n        \"model-scale-mode\" to INITIAL_SCALE_MODE.value,\n        \"id\" to MODEL_LAYER_ID,\n        \"source\" to MODEL_SOURCE_ID,\n        \"type\" to \"model\",\n        \"model-receive-shadows\" to INITIAL_RECEIVE_SHADOWS,\n        \"model-cast-shadows\" to INITIAL_CAST_SHADOWS,\n        \"model-scale-transition\" to hashMapOf(\"duration\" to 0, \"delay\" to 0),\n        \"model-rotation-transition\" to hashMapOf(\"duration\" to 0, \"delay\" to 0),\n        \"model-emissive-strength\" to INITIAL_MODEL_EMISSIVE_STENGTH_EXPRESSION,\n        \"model-color\" to INITIAL_MODEL_COLOR_EXPRESSION,\n        \"model-color-mix-intensity\" to INITIAL_MODEL_COLOR_MIX_INTENSITY_EXPRESSION,\n        \"model-elevation-reference\" to INITIAL_MODEL_ELEVATION_REFERENCE.value,\n      ).toValue(),\n      layerWithExpression.toValue(),\n    )\n  }\n\n  @Test\n  fun testScale() {\n    val scale = arrayListOf(1.0, 2.0)\n    layer.modelScale(scale)\n    verify { style.setStyleLayerProperty(MODEL_LAYER_ID, \"model-scale\", Value(scale.map(::Value))) }\n  }\n\n  @Test\n  fun testRotation() {\n    val rotation = arrayListOf(1.0, 2.0)\n    layer.modelRotation(rotation)\n    verify {\n      style.setStyleLayerProperty(\n        MODEL_LAYER_ID,\n        \"model-rotation\",\n        Value(rotation.map(::Value))\n      )\n    }\n  }\n\n  @Test\n  fun testTranslation() {\n    val translation = arrayListOf(1.0, 2.0)\n    layer.modelTranslation(translation)\n    verify {\n      style.setStyleLayerProperty(\n        MODEL_LAYER_ID,\n        \"model-translation\",\n        Value(translation.map(::Value))\n      )\n    }\n  }\n\n  @Test\n  fun testLayerNotReady() {\n    every {\n      style.setStyleLayerProperty(\n        any(),\n        any(),\n        any()\n      )\n    } returns ExpectedFactory.createError(\"error\")\n    val scale = arrayListOf(1.0, 2.0)\n    layer.modelScale(scale)\n    verify(exactly = 1) {\n      style.setStyleLayerProperty(\n        MODEL_LAYER_ID,\n        \"model-scale\",\n        Value(scale.map(::Value))\n      )\n    }\n    verify(exactly = 1) { logE(any(), any()) }\n  }\n\n  @Test\n  fun testUpdateStyle() {\n    val newStyle = mockk<MapboxStyleManager>(relaxed = true)\n    every { newStyle.setStyleLayerProperty(any(), any(), any()) } returns expected\n    layer.updateStyle(newStyle)\n    val scale = listOf(1.0, 2.0, 3.0)\n    layer.modelScale(scale)\n    verify(exactly = 0) {\n      style.setStyleLayerProperty(\n        MODEL_LAYER_ID,\n        \"model-scale\",\n        Value(scale.map(::Value))\n      )\n    }\n    verify(exactly = 1) {\n      newStyle.setStyleLayerProperty(\n        MODEL_LAYER_ID,\n        \"model-scale\",\n        Value(scale.map(::Value))\n      )\n    }\n  }\n\n  @Test\n  fun testModelOpacity() {\n    layer.modelOpacity(0.8)\n    verify { style.setStyleLayerProperty(MODEL_LAYER_ID, \"model-opacity\", Value(0.8)) }\n  }\n\n  @Test\n  fun testSlot() {\n    val middleSlot = \"middle\"\n    layer.slot(middleSlot)\n    verify(exactly = 1) { style.setStyleLayerProperty(MODEL_LAYER_ID, \"slot\", Value(middleSlot)) }\n  }\n\n  @Test\n  fun testNullSlot() {\n    layer.slot(null)\n    verify(exactly = 1) { style.setStyleLayerProperty(MODEL_LAYER_ID, \"slot\", Value(\"\")) }\n  }\n\n  @Test\n  fun testModelScaleModeViewPort() {\n    setModelScaleMode(ModelScaleMode.VIEWPORT)\n  }\n\n  @Test\n  fun testModelScaleModeMap() {\n    setModelScaleMode(ModelScaleMode.MAP)\n  }\n\n  @Test\n  fun testModelElevationReferenceGround() {\n    setModelElevationReference(ModelElevationReference.GROUND)\n  }\n\n  @Test\n  fun testModelElevationReferenceSea() {\n    setModelElevationReference(ModelElevationReference.SEA)\n  }\n\n  private fun setModelScaleMode(mode: ModelScaleMode) {\n    layer.modelScaleMode(mode)\n    verify { style.setStyleLayerProperty(MODEL_LAYER_ID, \"model-scale-mode\", Value(mode.value)) }\n  }\n\n  private fun setModelElevationReference(reference: ModelElevationReference) {\n    layer.modelElevationReference(reference)\n    verify { style.setStyleLayerProperty(MODEL_LAYER_ID, \"model-elevation-reference\", Value(reference.value)) }\n  }\n\n  companion object {\n    private const val MODEL_LAYER_ID = \"modelLayerId\"\n    private const val MODEL_SOURCE_ID = \"modelSourceId\"\n    private val INITIAL_SCALE = arrayListOf(6.0)\n    private val INITIAL_ROTATION = arrayListOf(8.0)\n    private val INITIAL_ROTATION_EXPRESSION = Value.fromJson(\n      \"\"\"\n      [\"get\", \"rotation\"]\n    \"\"\".trimIndent()\n    ).take()\n    private val INITIAL_TRANSLATION = arrayListOf(0.0)\n    private val INITIAL_CAST_SHADOWS = true\n    private val INITIAL_RECEIVE_SHADOWS = true\n    private const val INITIAL_OPACITY = 1.0\n    private val INITIAL_OPACITY_EXPRESSION = Value.fromJson(\n      \"\"\"\n      [\"get\", \"opacity\"]\n    \"\"\".trimIndent()\n    ).take()\n    private val INITIAL_SCALE_MODE = ModelScaleMode.VIEWPORT\n    private val INITIAL_MODEL_ELEVATION_REFERENCE = ModelElevationReference.GROUND\n    private val INITIAL_MODEL_EMISSIVE_STENGTH = 1.0\n    private val INITIAL_MODEL_EMISSIVE_STENGTH_EXPRESSION = Value.fromJson(\n      \"\"\"\n      [\"get\", \"emissivelight\"]\n    \"\"\".trimIndent()\n    ).take()\n    private const val INITIAL_MODEL_COLOR = Color.WHITE\n    private val INITIAL_MODEL_COLOR_EXPRESSION = Value.fromJson(\n      \"\"\"\n      [\"get\", \"color\"]\n    \"\"\".trimIndent()\n    ).take()\n    private const val INITIAL_MODEL_COLOR_MIX_INTENSITY = 1.0\n    private val INITIAL_MODEL_COLOR_MIX_INTENSITY_EXPRESSION = Value.fromJson(\n      \"\"\"\n      [\"get\", \"colorMixIntensity\"]\n    \"\"\".trimIndent()\n    ).take()\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/ModelSourceWrapperTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.ExpectedFactory\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.logE\nimport io.mockk.Runs\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass ModelSourceWrapperTest {\n\n  private val style: MapboxStyleManager = mockk(relaxed = true)\n  private val expected: Expected<String, None> = mockk(relaxed = true)\n\n  @Before\n  fun setup() {\n    mockkStatic(\"com.mapbox.maps.MapboxLogger\")\n    every { logE(any(), any()) } just Runs\n    every { style.addStyleSource(any(), any()) } returns expected\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns expected\n    every { expected.error } returns null\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(\"com.mapbox.maps.MapboxLogger\")\n  }\n\n  @Test\n  fun testValue() {\n    val modelSource = ModelSourceWrapper(\n      sourceId = SOURCE_ID,\n      url = \"uri\",\n      position = listOf(1.0, 2.0),\n      nodeOverrides = listOf(\"node1\", \"node2\"),\n      materialOverrides = listOf(\"material1\", \"material2\")\n    )\n    val value = modelSource.toValue()\n    assertEquals(\"{models={defaultModel={orientation=[0.0, 0.0, 0.0], nodeOverrides=[node1, node2], position=[1.0, 2.0], materialOverrides=[material1, material2], uri=uri}}, type=model}\", value.toString())\n  }\n\n  @Test\n  fun testSetPosition() {\n    val modelSource = ModelSourceWrapper(\n      sourceId = SOURCE_ID,\n      url = \"uri\",\n      position = listOf(1.0, 2.0),\n      nodeOverrides = listOf(\"node1\", \"node2\"),\n      materialOverrides = listOf(\"material1\", \"material2\")\n    )\n    modelSource.bindTo(style)\n\n    val position = arrayListOf(5.0, 5.0)\n    val orientation = arrayListOf(0.0, 0.0, 5.0)\n    modelSource.setPositionAndOrientation(position, orientation)\n    val property = hashMapOf(\n      Pair(ModelSourceWrapper.POSITION, Value(position.map(::Value))),\n      Pair(ModelSourceWrapper.ORIENTATION, Value(orientation.map(::Value))),\n      Pair(ModelSourceWrapper.URL, Value(\"uri\"))\n    )\n    val updateModel = hashMapOf(Pair(ModelSourceWrapper.DEFAULT_MODEL_NAME, Value(property)))\n    verify { style.setStyleSourceProperty(SOURCE_ID, ModelSourceWrapper.MODELS, Value(updateModel)) }\n  }\n\n  @Test\n  fun testSetPropertyFailed() {\n    val modelSource = ModelSourceWrapper(\n      sourceId = SOURCE_ID,\n      url = \"uri\",\n      position = listOf(1.0, 2.0),\n      nodeOverrides = listOf(\"node1\", \"node2\"),\n      materialOverrides = listOf(\"material1\", \"material2\")\n    )\n    every { style.setStyleSourceProperty(any(), any(), any()) } returns ExpectedFactory.createError(\"error\")\n    modelSource.bindTo(style)\n\n    val position = arrayListOf(5.0, 5.0)\n    val orientation = arrayListOf(0.0, 0.0, 5.0)\n    modelSource.setPositionAndOrientation(position, orientation)\n    val property = hashMapOf(\n      Pair(ModelSourceWrapper.POSITION, Value(position.map(::Value))),\n      Pair(ModelSourceWrapper.ORIENTATION, Value(orientation.map(::Value))),\n      Pair(ModelSourceWrapper.URL, Value(\"uri\"))\n    )\n    val updateModel = hashMapOf(Pair(ModelSourceWrapper.DEFAULT_MODEL_NAME, Value(property)))\n    verify(exactly = 1) { style.setStyleSourceProperty(SOURCE_ID, ModelSourceWrapper.MODELS, Value(updateModel)) }\n    verify(exactly = 1) { logE(any(), any()) }\n  }\n\n  @Test\n  fun testUpdateStyle() {\n    val modelSource = ModelSourceWrapper(\n      sourceId = SOURCE_ID,\n      url = \"uri\",\n      position = listOf(1.0, 2.0),\n      nodeOverrides = listOf(\"node1\", \"node2\"),\n      materialOverrides = listOf(\"material1\", \"material2\")\n    )\n    modelSource.bindTo(style)\n    val newStyle = mockk<MapboxStyleManager>()\n    every { newStyle.addStyleSource(any(), any()) } returns expected\n    every { newStyle.setStyleSourceProperty(any(), any(), any()) } returns expected\n    modelSource.updateStyle(newStyle)\n    val position = arrayListOf(5.0, 5.0)\n    val orientation = arrayListOf(0.0, 0.0, 5.0)\n    modelSource.setPositionAndOrientation(position, orientation)\n    val property = hashMapOf(\n      Pair(ModelSourceWrapper.POSITION, Value(position.map(::Value))),\n      Pair(ModelSourceWrapper.ORIENTATION, Value(orientation.map(::Value))),\n      Pair(ModelSourceWrapper.URL, Value(\"uri\"))\n    )\n    val updateModel = hashMapOf(Pair(ModelSourceWrapper.DEFAULT_MODEL_NAME, Value(property)))\n    verify(exactly = 0) { style.setStyleSourceProperty(SOURCE_ID, ModelSourceWrapper.MODELS, Value(updateModel)) }\n    verify(exactly = 1) { newStyle.setStyleSourceProperty(SOURCE_ID, ModelSourceWrapper.MODELS, Value(updateModel)) }\n  }\n\n  companion object {\n    private const val SOURCE_ID = \"modelLocationSourceId\"\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/ShadowLocationServiceFactory.java",
    "content": "package com.mapbox.maps.plugin.locationcomponent;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.mapbox.bindgen.Expected;\nimport com.mapbox.bindgen.ExpectedFactory;\nimport com.mapbox.common.location.AccuracyAuthorization;\nimport com.mapbox.common.location.DeviceLocationProvider;\nimport com.mapbox.common.location.DeviceLocationProviderFactory;\nimport com.mapbox.common.location.DeviceLocationProviderType;\nimport com.mapbox.common.location.ExtendedLocationProviderParameters;\nimport com.mapbox.common.location.LocationError;\nimport com.mapbox.common.location.LocationProviderRequest;\nimport com.mapbox.common.location.LocationService;\nimport com.mapbox.common.location.LocationServiceFactory;\nimport com.mapbox.common.location.LocationServiceObserver;\nimport com.mapbox.common.location.PermissionStatus;\n\nimport org.robolectric.annotation.Implementation;\nimport org.robolectric.annotation.Implements;\n\n@Implements(LocationServiceFactory.class)\npublic class ShadowLocationServiceFactory {\n    public static DeviceLocationProvider deviceLocationProvider;\n\n    @Implementation\n    public static LocationService locationService() {\n        return new LocationService() {\n            @NonNull\n            @Override\n            public Expected<LocationError, DeviceLocationProvider> getDeviceLocationProvider(@NonNull ExtendedLocationProviderParameters extendedLocationProviderParameters, @Nullable LocationProviderRequest locationProviderRequest) {\n                return ExpectedFactory.createValue(deviceLocationProvider);\n            }\n\n            @NonNull\n            @Override\n            public Expected<LocationError, DeviceLocationProvider> getDeviceLocationProvider(@NonNull DeviceLocationProviderType deviceLocationProviderType, @Nullable LocationProviderRequest locationProviderRequest, boolean b) {\n                return ExpectedFactory.createValue(deviceLocationProvider);\n            }\n\n            @Override\n            public void setUserDefinedDeviceLocationProviderFactory(@Nullable DeviceLocationProviderFactory deviceLocationProviderFactory) {\n\n            }\n\n            @NonNull\n            @Override\n            public Expected<LocationError, DeviceLocationProvider> getDeviceLocationProvider(@Nullable LocationProviderRequest locationProviderRequest) {\n                return ExpectedFactory.createValue(deviceLocationProvider);\n            }\n\n            @Override\n            public boolean isAvailable() {\n                return false;\n            }\n\n            @NonNull\n            @Override\n            public PermissionStatus getPermissionStatus() {\n                return null;\n            }\n\n            @NonNull\n            @Override\n            public AccuracyAuthorization getAccuracyAuthorization() {\n                return null;\n            }\n\n            @Override\n            public void registerObserver(@NonNull LocationServiceObserver observer) {\n\n            }\n\n            @Override\n            public void unregisterObserver(@NonNull LocationServiceObserver observer) {\n\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/Utils.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.os.Bundle\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.toValue\nimport com.mapbox.maps.plugin.ModelScaleMode\n\nfun Any.toValue(): Value {\n  return when (this) {\n    is Value -> this\n    is Byte -> Value.valueOf(this.toLong())\n    is Int -> Value.valueOf(this.toLong())\n    is Long -> Value.valueOf(this)\n    is Float -> Value.valueOf(this.toDouble())\n    is Double -> Value.valueOf(this)\n    is Boolean -> Value.valueOf(this)\n    is String -> Value.valueOf(this)\n    is List<*> -> Value(this.map { it!!.toValue() })\n    is ModelScaleMode -> Value.valueOf(this.value)\n    is Bundle -> this.toValue()\n    is Enum<*> -> { Value.valueOf(this.ordinal.toLong()) }\n    is Map<*, *> -> {\n      val map = HashMap<String, Value>(this.size)\n      for ((key, value) in this) {\n        if (key is String) {\n          map[key] = value!!.toValue()\n        }\n      }\n      Value(map)\n    }\n    else -> {\n      throw IllegalStateException(\"Can not convert $this of class ${this.javaClass} to value!\")\n    }\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/animators/EvaluatorsTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport com.mapbox.geojson.Point\nimport org.junit.Assert\nimport org.junit.Test\n\nclass EvaluatorsTest {\n\n  @Test\n  fun doubleEvaluatorTest() {\n    val evaluator = Evaluators.DOUBLE\n    Assert.assertEquals(0.0, evaluator.evaluate(0.0f, START_DOUBLE, END_DOUBLE), EPS)\n    Assert.assertEquals(5.0, evaluator.evaluate(0.5f, START_DOUBLE, END_DOUBLE), EPS)\n    Assert.assertEquals(10.0, evaluator.evaluate(1.0f, START_DOUBLE, END_DOUBLE), EPS)\n  }\n\n  @Test\n  fun pointEvaluatorTest() {\n    val evaluator = Evaluators.POINT\n    Assert.assertEquals(\n      Point.fromLngLat(50.0, 50.0),\n      evaluator.evaluate(0.0f, START_POINT, END_POINT)\n    )\n    Assert.assertEquals(\n      Point.fromLngLat(70.0, 70.0),\n      evaluator.evaluate(0.5f, START_POINT, END_POINT)\n    )\n    Assert.assertEquals(\n      Point.fromLngLat(90.0, 90.0),\n      evaluator.evaluate(1.0f, START_POINT, END_POINT)\n    )\n  }\n\n  companion object {\n    private const val EPS = 0.0001\n    private const val START_DOUBLE = 0.0\n    private const val END_DOUBLE = 10.0\n    private val START_POINT = Point.fromLngLat(50.0, 50.0)\n    private val END_POINT = Point.fromLngLat(90.0, 90.0)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckAccuracyRadiusAnimatorTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.animation.ValueAnimator\nimport android.os.Looper\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorAccuracyRadiusChangedListener\nimport io.mockk.*\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.LooperMode\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass PuckAccuracyRadiusAnimatorTest {\n\n  private lateinit var accuracyRadiusAnimator: PuckAccuracyRadiusAnimator\n  private lateinit var userConfiguredAnimator: ValueAnimator\n\n  private val accuracyRadiusChangedListener = mockk<OnIndicatorAccuracyRadiusChangedListener>(relaxed = true)\n\n  @Before\n  fun setUp() {\n    val animator = PuckAccuracyRadiusAnimator(accuracyRadiusChangedListener)\n    userConfiguredAnimator = spyk(animator.clone())\n    animator.userConfiguredAnimator = userConfiguredAnimator\n    accuracyRadiusAnimator = spyk(animator)\n  }\n\n  @Test\n  fun animatePredefined() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    accuracyRadiusAnimator.animate(0.0, 10.0)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { accuracyRadiusAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n    verify(exactly = 1) { accuracyRadiusAnimator.start() }\n    verify(exactly = 0) { userConfiguredAnimator.start() }\n  }\n\n  @Test\n  fun animateCustomAnimatorOptions() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    accuracyRadiusAnimator.animate(0.0, 10.0, options = {})\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { userConfiguredAnimator.start() }\n    verify(exactly = 0) { accuracyRadiusAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n    verify(exactly = 0) { accuracyRadiusAnimator.start() }\n  }\n\n  @Test\n  fun animateInterruptDefaultWithCustom() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    accuracyRadiusAnimator.animate(0.0, 5.0)\n    accuracyRadiusAnimator.animate(\n      0.0, 10.0,\n      options = { duration = 50 }\n    )\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { accuracyRadiusAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n    verify(exactly = 1) { accuracyRadiusAnimator.start() }\n    verify(exactly = 1) { userConfiguredAnimator.start() }\n  }\n\n  @Test\n  fun cancelRunningWhenNotRunning() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    accuracyRadiusAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { accuracyRadiusAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n  }\n\n  @Test\n  fun cancelRunningWhenRunning() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    accuracyRadiusAnimator.animate(0.0, 10.0)\n    accuracyRadiusAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { accuracyRadiusAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n  }\n\n  @Test\n  fun cancelRunningWhenRunningCustom() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    accuracyRadiusAnimator.animate(\n      0.0, 10.0,\n      options = { duration = 50 }\n    )\n    accuracyRadiusAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { accuracyRadiusAnimator.cancel() }\n    verify(exactly = 1) { userConfiguredAnimator.cancel() }\n  }\n\n  @Test\n  fun updateOptions() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    accuracyRadiusAnimator.updateOptions {\n      duration = 2000\n    }\n    accuracyRadiusAnimator.animate(0.0, 10.0)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { accuracyRadiusAnimator.start() }\n    Assert.assertEquals(2000, accuracyRadiusAnimator.duration)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckAnimatorManagerTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.animation.ValueAnimator\nimport android.graphics.Color\nimport android.os.Looper\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.plugin.locationcomponent.LocationLayerRenderer\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.hamcrest.MatcherAssert\nimport org.hamcrest.Matchers\nimport org.junit.Assert\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.LooperMode\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass PuckAnimatorManagerTest {\n\n  private lateinit var puckAnimatorManager: PuckAnimatorManager\n\n  private val bearingAnimator: PuckBearingAnimator = PuckBearingAnimator(mockk(relaxUnitFun = true))\n  private val positionAnimator: PuckPositionAnimator =\n    PuckPositionAnimator(mockk(relaxUnitFun = true))\n  private val accuracyRadiusAnimator: PuckAccuracyRadiusAnimator =\n    PuckAccuracyRadiusAnimator(mockk(relaxUnitFun = true))\n  private val pulsingAnimator: PuckPulsingAnimator = mockk(relaxed = true)\n  private val pixelRatio: Float = 1.0f\n\n  @Before\n  fun setUp() {\n    puckAnimatorManager = PuckAnimatorManager(\n      mockk(),\n      mockk(),\n      mockk(),\n      bearingAnimator,\n      positionAnimator,\n      pulsingAnimator,\n      accuracyRadiusAnimator,\n      pixelRatio\n    )\n  }\n\n  @Test\n  fun setLocationLayerRenderer() {\n    val locationLayerRenderer = mockk<LocationLayerRenderer>()\n    puckAnimatorManager.setLocationLayerRenderer(locationLayerRenderer)\n    verify {\n      bearingAnimator.setLocationLayerRenderer(locationLayerRenderer)\n      positionAnimator.setLocationLayerRenderer(locationLayerRenderer)\n      pulsingAnimator.setLocationLayerRenderer(locationLayerRenderer)\n      accuracyRadiusAnimator.setLocationLayerRenderer(locationLayerRenderer)\n    }\n  }\n\n  @Test\n  fun onStartOne() {\n    every { pulsingAnimator.enabled } returns true\n    puckAnimatorManager.onStart()\n    verify(exactly = 1) { pulsingAnimator.animateInfinite() }\n  }\n\n  @Test\n  fun onStartTwo() {\n    every { pulsingAnimator.enabled } returns false\n    puckAnimatorManager.onStart()\n    verify(exactly = 0) { pulsingAnimator.animateInfinite() }\n  }\n\n  @Test\n  fun onStop() {\n    puckAnimatorManager.onStop()\n    verify {\n      bearingAnimator.cancelRunning()\n      positionAnimator.cancelRunning()\n      pulsingAnimator.cancelRunning()\n      accuracyRadiusAnimator.cancelRunning()\n    }\n  }\n\n  @Test\n  fun setUpdateListeners() {\n    val positionUpdateListener: ((Point) -> Unit) = {}\n    val bearingUpdateListener: ((Double) -> Unit) = {}\n    val accuracyRadiusUpdateListener: ((Double) -> Unit) = {}\n    puckAnimatorManager.setUpdateListeners(\n      positionUpdateListener,\n      bearingUpdateListener,\n      accuracyRadiusUpdateListener\n    )\n    assertEquals(positionUpdateListener, positionAnimator.updateListener)\n    assertEquals(bearingUpdateListener, bearingAnimator.updateListener)\n    assertEquals(accuracyRadiusUpdateListener, accuracyRadiusAnimator.updateListener)\n  }\n\n  @Test\n  fun animateBearing() {\n    val options: (ValueAnimator.() -> Unit) = {}\n    var counter = 0\n    var animatedValue = 0.0\n    val updateListener: ((Double) -> Unit) = {\n      counter++\n      animatedValue = it\n    }\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    puckAnimatorManager.setUpdateListeners({}, updateListener, {})\n    puckAnimatorManager.animateBearing(0.0, 10.0, options = options)\n    verify {\n      bearingAnimator.animate(0.0, 10.0, options = options)\n    }\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    MatcherAssert.assertThat(counter, Matchers.greaterThan(0))\n    assertEquals(10.0, animatedValue, 0.0001)\n  }\n\n  @Test\n  fun animatePosition() {\n    val options: (ValueAnimator.() -> Unit) = {}\n    var counter = 0\n    var animatedValue = START_POINT\n    val updateListener: ((Point) -> Unit) = {\n      counter++\n      animatedValue = it\n    }\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    puckAnimatorManager.setUpdateListeners(updateListener, {}, {})\n    puckAnimatorManager.animatePosition(START_POINT, END_POINT, options = options)\n    verify {\n      positionAnimator.animate(START_POINT, END_POINT, options = options)\n    }\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    MatcherAssert.assertThat(counter, Matchers.greaterThan(0))\n    Assert.assertEquals(END_POINT, animatedValue)\n  }\n\n  @Test\n  fun applyAccuracyRadiusSettingsOne() {\n    val settings = mockk<LocationComponentSettings>(relaxed = true)\n    every { settings.accuracyRingColor } returns Color.BLUE\n    every { settings.showAccuracyRing } returns true\n    puckAnimatorManager.applySettings(settings)\n    assertTrue(accuracyRadiusAnimator.enabled)\n    assertEquals(Color.BLUE, accuracyRadiusAnimator.accuracyCircleColor)\n  }\n\n  @Test\n  fun applyAccuracyRadiusSettingsTwo() {\n    val settings = mockk<LocationComponentSettings>(relaxed = true)\n    every { settings.accuracyRingColor } returns Color.GREEN\n    every { settings.showAccuracyRing } returns false\n    puckAnimatorManager.applySettings(settings)\n    assertFalse(accuracyRadiusAnimator.enabled)\n    assertEquals(Color.GREEN, accuracyRadiusAnimator.accuracyCircleColor)\n  }\n\n  @Test\n  fun applyAnimationSettingsOne() {\n    val settings = mockk<LocationComponentSettings>(relaxed = true)\n    every { settings.pulsingEnabled } returns true\n    every { settings.pulsingMaxRadius } returns 20.0f\n\n    puckAnimatorManager.applySettings(settings)\n    verify {\n      pulsingAnimator.enabled = true\n      pulsingAnimator.maxRadius = 20.0\n      pulsingAnimator.animateInfinite()\n    }\n  }\n\n  @Test\n  fun applyAnimationSettingsTwo() {\n    val settings = mockk<LocationComponentSettings>(relaxed = true)\n    every { settings.pulsingEnabled } returns false\n    every { settings.pulsingMaxRadius } returns 20.0f\n    puckAnimatorManager.applySettings(settings)\n    verify {\n      pulsingAnimator.enabled = false\n      pulsingAnimator.maxRadius = 20.0\n      pulsingAnimator.cancelRunning()\n    }\n  }\n\n  @Test\n  fun updateBearingAnimator() {\n    val options: (ValueAnimator.() -> Unit) = {\n      duration = 5000\n    }\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    puckAnimatorManager.updateBearingAnimator(options)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    Assert.assertEquals(5000, bearingAnimator.duration)\n  }\n\n  @Test\n  fun updatePositionAnimator() {\n    val options: (ValueAnimator.() -> Unit) = {\n      duration = 5000\n    }\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    puckAnimatorManager.updatePositionAnimator(options)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    Assert.assertEquals(5000, positionAnimator.duration)\n  }\n\n  @Test\n  fun updateAccuracyRadiusAnimator() {\n    val options: (ValueAnimator.() -> Unit) = {\n      duration = 5000\n    }\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    puckAnimatorManager.updateAccuracyRadiusAnimator(options)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    assertEquals(5000, accuracyRadiusAnimator.duration)\n  }\n\n  @Test\n  fun testUpdatePulsingPuckRadius() {\n    val updatedRadius = 50.0\n    val settings = mockk<LocationComponentSettings>(relaxed = true)\n    every { settings.pulsingEnabled } returns true\n    every { settings.pulsingMaxRadius } returns updatedRadius.toFloat()\n\n    puckAnimatorManager.updatePulsingRadius(updatedRadius, settings)\n    verify {\n      pulsingAnimator.enabled = true\n      pulsingAnimator.maxRadius = updatedRadius\n      pulsingAnimator.animateInfinite()\n    }\n  }\n\n  @Test\n  fun testUpdatePulsingPuckRadiusFalse() {\n    val updatedRadius = 50.0\n    val settings = mockk<LocationComponentSettings>(relaxed = true)\n    every { settings.pulsingEnabled } returns false\n    every { settings.pulsingMaxRadius } returns updatedRadius.toFloat()\n\n    puckAnimatorManager.updatePulsingRadius(updatedRadius, settings)\n    verify {\n      pulsingAnimator.enabled = false\n      pulsingAnimator.cancelRunning()\n    }\n    verify(exactly = 0) { pulsingAnimator.maxRadius = updatedRadius }\n  }\n\n  companion object {\n    private val START_POINT = Point.fromLngLat(-122.4194, 37.7749)\n    private val END_POINT = Point.fromLngLat(-77.0369, 38.9072)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckBearingAnimatorTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.animation.ValueAnimator\nimport android.os.Looper\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener\nimport io.mockk.*\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.LooperMode\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass PuckBearingAnimatorTest {\n\n  private lateinit var bearingAnimator: PuckBearingAnimator\n  private lateinit var userConfiguredAnimator: ValueAnimator\n\n  private val bearingChangeListener = mockk<OnIndicatorBearingChangedListener>(relaxed = true)\n\n  @Before\n  fun setUp() {\n    val animator = PuckBearingAnimator(bearingChangeListener)\n    userConfiguredAnimator = spyk(animator.clone())\n    animator.userConfiguredAnimator = userConfiguredAnimator\n    bearingAnimator = spyk(animator)\n  }\n\n  @Test\n  fun animateUpdateListener() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.animate(0.0, 10.0)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify {\n      bearingChangeListener.onIndicatorBearingChanged(any())\n    }\n    Assert.assertEquals(10.0, bearingAnimator.animatedValue as Double, 0.0001)\n  }\n\n  @Test\n  fun animatePredefined() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.animate(0.0, 10.0)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { bearingAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n    verify(exactly = 1) { bearingAnimator.start() }\n    verify(exactly = 0) { userConfiguredAnimator.start() }\n  }\n\n  @Test\n  fun animateCustomAnimatorOptions() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.animate(0.0, 10.0, options = {})\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { userConfiguredAnimator.start() }\n    verify(exactly = 0) { bearingAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n    verify(exactly = 0) { bearingAnimator.start() }\n  }\n\n  @Test\n  fun animateInterruptDefaultWithCustom() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.animate(0.0, 5.0)\n    bearingAnimator.animate(\n      0.0, 10.0,\n      options = { duration = 50 }\n    )\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { bearingAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n    verify(exactly = 1) { bearingAnimator.start() }\n    verify(exactly = 1) { userConfiguredAnimator.start() }\n  }\n\n  @Test\n  fun cancelRunningWhenNotRunning() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { bearingAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n  }\n\n  @Test\n  fun cancelRunningWhenRunning() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.animate(0.0, 10.0)\n    bearingAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { bearingAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n  }\n\n  @Test\n  fun cancelRunningWhenRunningCustom() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.animate(\n      0.0, 10.0,\n      options = { duration = 50 }\n    )\n    bearingAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { bearingAnimator.cancel() }\n    verify(exactly = 1) { userConfiguredAnimator.cancel() }\n  }\n\n  @Test\n  fun updateOptions() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    bearingAnimator.updateOptions {\n      duration = 2000\n    }\n    bearingAnimator.animate(0.0, 10.0)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { bearingAnimator.start() }\n    Assert.assertEquals(2000, bearingAnimator.duration)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckPositionAnimatorTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.animation.ValueAnimator\nimport android.os.Looper\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport io.mockk.*\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.LooperMode\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass PuckPositionAnimatorTest {\n\n  private lateinit var positionAnimator: PuckPositionAnimator\n  private lateinit var userConfiguredAnimator: ValueAnimator\n\n  private val positionChangeListener = mockk<OnIndicatorPositionChangedListener>(relaxed = true)\n\n  @Before\n  fun setUp() {\n    val animator = PuckPositionAnimator(positionChangeListener)\n    userConfiguredAnimator = spyk(animator.clone())\n    animator.userConfiguredAnimator = userConfiguredAnimator\n    positionAnimator = spyk(animator)\n  }\n\n  @Test\n  fun animateUpdateListener() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    positionAnimator.animate(START_POINT, END_POINT)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify {\n      positionChangeListener.onIndicatorPositionChanged(any())\n    }\n    Assert.assertEquals(END_POINT, positionAnimator.animatedValue as Point)\n  }\n\n  @Test\n  fun animatePredefined() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    positionAnimator.animate(START_POINT, END_POINT)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { positionAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n    verify(exactly = 1) { positionAnimator.start() }\n    verify(exactly = 0) { userConfiguredAnimator.start() }\n  }\n\n  @Test\n  fun animateCustomAnimatorOptions() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    positionAnimator.animate(START_POINT, END_POINT, options = {})\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { userConfiguredAnimator.start() }\n    verify(exactly = 0) { positionAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n    verify(exactly = 0) { positionAnimator.start() }\n  }\n\n  @Test\n  fun animateInterruptDefaultWithCustom() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    positionAnimator.animate(START_POINT, END_POINT)\n    positionAnimator.animate(\n      START_POINT, END_POINT,\n      options = { duration = 50 }\n    )\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { positionAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n    verify(exactly = 1) { positionAnimator.start() }\n    verify(exactly = 1) { userConfiguredAnimator.start() }\n  }\n\n  @Test\n  fun cancelRunningWhenNotRunning() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    positionAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { positionAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n  }\n\n  @Test\n  fun cancelRunningWhenRunning() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    positionAnimator.animate(START_POINT, END_POINT)\n    positionAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { positionAnimator.cancel() }\n    verify(exactly = 0) { userConfiguredAnimator.cancel() }\n  }\n\n  @Test\n  fun cancelRunningWhenRunningCustom() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    positionAnimator.animate(\n      START_POINT, END_POINT,\n      options = { duration = 50 }\n    )\n    positionAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { positionAnimator.cancel() }\n    verify(exactly = 1) { userConfiguredAnimator.cancel() }\n  }\n\n  @Test\n  fun updateOptions() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    positionAnimator.updateOptions {\n      duration = 2000\n    }\n    positionAnimator.animate(START_POINT, END_POINT)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { positionAnimator.start() }\n    Assert.assertEquals(2000, positionAnimator.duration)\n  }\n\n  companion object {\n    private val START_POINT = Point.fromLngLat(-122.4194, 37.7749)\n    private val END_POINT = Point.fromLngLat(-77.0369, 38.9072)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/animators/PuckPulsingAnimatorTest.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent.animators\n\nimport android.animation.ValueAnimator\nimport android.os.Looper\nimport io.mockk.*\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.LooperMode\n\n@RunWith(RobolectricTestRunner::class)\n@LooperMode(LooperMode.Mode.PAUSED)\nclass PuckPulsingAnimatorTest {\n\n  private lateinit var pulsingAnimator: PuckPulsingAnimator\n\n  @Before\n  fun setUp() {\n    val animator = PuckPulsingAnimator()\n    pulsingAnimator = spyk(animator)\n  }\n\n  @Test\n  fun creation() {\n    Assert.assertEquals(PuckPulsingAnimator.PULSING_DEFAULT_DURATION, pulsingAnimator.duration)\n    Assert.assertEquals(ValueAnimator.RESTART, pulsingAnimator.repeatMode)\n  }\n\n  @Test\n  fun animatePredefined() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    pulsingAnimator.animate(0.0, 10.0)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { pulsingAnimator.cancel() }\n    verify(exactly = 1) { pulsingAnimator.start() }\n  }\n\n  @Test\n  fun animateInfinite() {\n    every { pulsingAnimator.animate(any(), any()) } just Runs\n    pulsingAnimator.animateInfinite()\n    verify(exactly = 1) { pulsingAnimator.animate(0.0, any()) }\n  }\n\n  @Test\n  fun cancelRunningWhenNotRunning() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    pulsingAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 0) { pulsingAnimator.cancel() }\n  }\n\n  @Test\n  fun cancelRunningWhenRunning() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    pulsingAnimator.animate(0.0, 10.0)\n    pulsingAnimator.cancelRunning()\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify(exactly = 1) { pulsingAnimator.cancel() }\n  }\n\n  @Test\n  fun updateOptions() {\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    pulsingAnimator.updateOptions {\n      duration = 2000\n    }\n    pulsingAnimator.animate(0.0, 10.0)\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n    verify { pulsingAnimator.start() }\n    Assert.assertEquals(2000, pulsingAnimator.duration)\n  }\n}"
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.locationcomponent.generated\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport com.mapbox.maps.plugin.PuckBearing\nimport io.mockk.Runs\nimport io.mockk.clearAllMocks\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\n\nclass LocationComponentAttributeParserTest {\n  private val context: Context = mockk(relaxed = true)\n\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n\n  private val typedArray: TypedArray = mockk(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    mockkStatic(Color::class)\n    every { Color.parseColor(any()) } returns Color.WHITE\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getInt(any(), any()) } returns 0\n    every { typedArray.getColor(any(), any()) } returns Color.RED\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getResourceId(any(), -1) } returns 1\n    every { typedArray.hasValue(any()) } returns true\n    every { typedArray.recycle() } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun testTypedArrayRecycle() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun testTypedArrayRecycleWithException() {\n    every { typedArray.getBoolean(any(), any()) }.throws(Exception(\"\"))\n    try {\n      val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    } catch (e: Exception) {\n      // do nothing\n    }\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun enabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.enabled)\n  }\n\n  @Test\n  fun enabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.enabled)\n  }\n\n  @Test\n  fun pulsingEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.pulsingEnabled)\n  }\n\n  @Test\n  fun pulsingEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.pulsingEnabled)\n  }\n  @Test\n  fun pulsingColorTest() {\n    every { typedArray.getColor(any(), any()) } returns Color.parseColor(\"#4A90E2\")\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(Color.parseColor(\"#4A90E2\"), settings.pulsingColor)\n  }\n\n  @Test\n  fun pulsingMaxRadiusTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 10f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.pulsingMaxRadius)\n  }\n\n  @Test\n  fun showAccuracyRingTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.showAccuracyRing)\n  }\n\n  @Test\n  fun showAccuracyRingTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.showAccuracyRing)\n  }\n  @Test\n  fun accuracyRingColorTest() {\n    every { typedArray.getColor(any(), any()) } returns Color.parseColor(\"#4d89cff0\")\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(Color.parseColor(\"#4d89cff0\"), settings.accuracyRingColor)\n  }\n  @Test\n  fun accuracyRingBorderColorTest() {\n    every { typedArray.getColor(any(), any()) } returns Color.parseColor(\"#4d89cff0\")\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(Color.parseColor(\"#4d89cff0\"), settings.accuracyRingBorderColor)\n  }\n\n  @Test\n  fun layerAboveTest() {\n    every { typedArray.getString(any()) } returns null\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(null, settings.layerAbove)\n  }\n\n  @Test\n  fun layerBelowTest() {\n    every { typedArray.getString(any()) } returns null\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(null, settings.layerBelow)\n  }\n\n  @Test\n  fun puckBearingEnabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.puckBearingEnabled)\n  }\n\n  @Test\n  fun puckBearingEnabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.puckBearingEnabled)\n  }\n\n  @Test\n  fun puckBearingTestHEADING() {\n    every { typedArray.getInt(any(), any()) } returns PuckBearing.HEADING.ordinal\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(PuckBearing.HEADING, settings.puckBearing)\n  }\n\n  @Test\n  fun puckBearingTestCOURSE() {\n    every { typedArray.getInt(any(), any()) } returns PuckBearing.COURSE.ordinal\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(PuckBearing.COURSE, settings.puckBearing)\n  }\n\n  @Test\n  fun slotTest() {\n    every { typedArray.getString(any()) } returns null\n    val settings = LocationComponentAttributeParser.parseLocationComponentSettings(context, attrs, 1.2f)\n    assertEquals(null, settings.slot)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-locationcomponent/src/test/java/com/mapbox/maps/util/MockKExtensions.kt",
    "content": "package com.mapbox.maps.util\n\nimport io.mockk.MockKMatcherScope\n\n// vararg capture isn't implemented, here's a workaround to collect it https://github.com/mockk/mockk/issues/432\ninline fun <reified T : Any> MockKMatcherScope.captureVararg(\n  capture: MutableCollection<T>\n) = varargAll<T> {\n  capture.add(it)\n  true\n}"
  },
  {
    "path": "plugin-logo/.gitignore",
    "content": "/build"
  },
  {
    "path": "plugin-logo/README.md",
    "content": "## Mapbox Maps Logo Plugin for Android\n\n### Overview\n\nThe Mapbox Maps Logo Plugin for Android is an public library for displaying logo on top of MapView. By default the plugin will show the Mapbox logo on top of the map at the bottom-left corner. Please visit our [documentation](https://docs.mapbox.com/android/maps/guides/ui-settings/#logo-and-attribution) for more information on displaying the Mapbox Logo.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Logo Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the logo plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-logo:11.22.0-rc.1'\n}\n```\n\n### Example\n\nCustomizing Mapbox Maps Logo Plugin for Android could be done in two ways: by setting the LogoSettings to the logo plugin. This can be achieved with:\n\n```kotlin\nval plugin = mapView.logo\nplugin.logoSettings = LogoSettings(...)\n```\n\nMore concrete examples of the logo plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-logo/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.logo {\n\n  public final class LogoUtils {\n    method public static com.mapbox.maps.plugin.logo.LogoPlugin getLogo(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n  public final class LogoViewImpl extends androidx.appcompat.widget.AppCompatImageView implements com.mapbox.maps.plugin.logo.LogoView {\n    ctor public LogoViewImpl(android.content.Context context);\n    ctor public LogoViewImpl(android.content.Context context, android.util.AttributeSet attrs);\n    ctor public LogoViewImpl(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr);\n    method public boolean getLogoEnabled();\n    method public int getLogoGravity();\n    method public void setLogoEnabled(boolean);\n    method public void setLogoGravity(int);\n    method public void setLogoMargins(int left, int top, int right, int bottom);\n    property public boolean logoEnabled;\n    property public int logoGravity;\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-logo/api/plugin-logo.api",
    "content": "public final class com/mapbox/maps/plugin/logo/LogoUtils {\n\tpublic static final synthetic fun createLogoPlugin ()Lcom/mapbox/maps/plugin/logo/LogoPlugin;\n\tpublic static final fun getLogo (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/logo/LogoPlugin;\n}\n\npublic final class com/mapbox/maps/plugin/logo/LogoViewImpl : androidx/appcompat/widget/AppCompatImageView, com/mapbox/maps/plugin/logo/LogoView {\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;I)V\n\tpublic fun getLogoEnabled ()Z\n\tpublic fun getLogoGravity ()I\n\tpublic fun setLogoEnabled (Z)V\n\tpublic fun setLogoGravity (I)V\n\tpublic fun setLogoMargins (IIII)V\n}\n\n"
  },
  {
    "path": "plugin-logo/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.logo\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-logo\"\n    artifactTitle = \"The logo module for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-logo\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-logo/src/main/java/com/mapbox/maps/plugin/logo/LogoExt.kt",
    "content": "@file:JvmName(\"LogoUtils\")\n\npackage com.mapbox.maps.plugin.logo\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val for MapView to get the Logo View plugin instance.\n */\nval MapPluginProviderDelegate.logo: LogoPlugin\n  @JvmName(\"getLogo\")\n  get() = this.getPlugin(Plugin.MAPBOX_LOGO_PLUGIN_ID)!!\n\n/**\n * Static method to create instance of Mapbox logo plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createLogoPlugin(): LogoPlugin {\n  return LogoViewPlugin()\n}"
  },
  {
    "path": "plugin-logo/src/main/java/com/mapbox/maps/plugin/logo/LogoViewImpl.kt",
    "content": "package com.mapbox.maps.plugin.logo\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport android.view.View\nimport android.view.ViewGroup.LayoutParams.WRAP_CONTENT\nimport android.widget.FrameLayout\nimport androidx.appcompat.widget.AppCompatImageView\nimport androidx.core.content.res.ResourcesCompat\nimport com.mapbox.maps.logW\n\n/**\n * Concrete implementation of LogoView.\n */\nclass LogoViewImpl : LogoView, AppCompatImageView {\n\n  private lateinit var presenter: LogoPlugin\n\n  /**\n   * Constructor with context.\n   *\n   * @param context\n   */\n  constructor(context: Context) : super(context)\n  /**\n   * Constructor with context and attribute set.\n   *\n   * @param context\n   * @param attrs\n   */\n  constructor(context: Context, attrs: AttributeSet) : super(context, attrs)\n  /**\n   * Constructor with context, attribute set and defStyleAttr.\n   *\n   * @param context\n   * @param attrs The attribution set.\n   * @param defStyleAttr An attribute in the current theme that contains a reference to a style\n   *  resource that supplies defaults values for the StyledAttributes. Can be 0 to not look for defaults.\n   */\n  constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(\n    context,\n    attrs,\n    defStyleAttr\n  )\n\n  init {\n    ResourcesCompat.getDrawable(\n      resources,\n      R.drawable.mapbox_logo_icon,\n      null\n    )?.let { setImageDrawable(it) }\n\n    // Layout params\n    val screenDensity = context.resources.displayMetrics.density\n    layoutParams = FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)\n    logoGravity = Gravity.START or Gravity.BOTTOM\n\n    // Default margins\n    val defaultMargin: Int = (4 * screenDensity).toInt()\n    setLogoMargins(defaultMargin, defaultMargin, defaultMargin, defaultMargin)\n  }\n\n  /**\n   * Whether the logo view is enabled.\n   */\n  override var logoEnabled: Boolean\n    get() = visibility == View.VISIBLE\n    set(value) {\n      visibility = if (value) View.VISIBLE else {\n        logW(\"MbxLogo\", context.getString(R.string.mapbox_warning_logo_disabled))\n        View.GONE\n      }\n    }\n\n  /**\n   * Returns the gravity value of the logo view.\n   */\n  override var logoGravity: Int\n    get() = (layoutParams as FrameLayout.LayoutParams).gravity\n    set(value) {\n      (layoutParams as FrameLayout.LayoutParams).gravity = value\n    }\n\n  /**\n   * Set the margins of the logo view.\n   *\n   * @param left Margin to the left in pixel\n   * @param top Margin to the top in pixel\n   * @param right Margin to the right in pixel\n   * @param bottom Margin to the bottom in pixel\n   */\n  override fun setLogoMargins(left: Int, top: Int, right: Int, bottom: Int) {\n    (layoutParams as FrameLayout.LayoutParams).apply {\n      setMargins(left, top, right, bottom)\n      // Support RTL\n      marginStart = left\n      marginEnd = right\n    }\n  }\n\n  internal fun injectPresenter(presenter: LogoPlugin) {\n    this.presenter = presenter\n  }\n}"
  },
  {
    "path": "plugin-logo/src/main/java/com/mapbox/maps/plugin/logo/LogoViewPlugin.kt",
    "content": "package com.mapbox.maps.plugin.logo\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.logo.generated.LogoAttributeParser\nimport com.mapbox.maps.plugin.logo.generated.LogoSettings\nimport com.mapbox.maps.plugin.logo.generated.LogoSettingsBase\n\n/**\n * Concrete implementation of LogoViewPlugin.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class LogoViewPlugin(\n  private val viewImplProvider: (Context) -> LogoViewImpl = { LogoViewImpl(it) }\n) : LogoPlugin, LogoSettingsBase() {\n\n  private lateinit var logoView: LogoView\n\n  override var internalSettings: LogoSettings = LogoSettings { }\n\n  override fun applySettings() {\n    logoView.setLogoMargins(\n      internalSettings.marginLeft.toInt(),\n      internalSettings.marginTop.toInt(),\n      internalSettings.marginRight.toInt(),\n      internalSettings.marginBottom.toInt()\n    )\n    logoView.logoGravity = internalSettings.position\n    logoView.logoEnabled = internalSettings.enabled\n    logoView.requestLayout()\n  }\n\n  /**\n   * Defines whether the plugins is enabled or disabled.\n   */\n  override var enabled: Boolean\n    get() = internalSettings.enabled\n    set(value) {\n      if (internalSettings.enabled != value) {\n        internalSettings = internalSettings.toBuilder().setEnabled(value).build()\n        applySettings()\n        logoView.logoEnabled = value\n      }\n    }\n\n  /**\n   * Bind the ViewPlugin with current map context. This will create a View that\n   * will be added to the MapView.\n   *\n   * @param mapView parent view which can be used to fetch [android.content.Context] or [ViewGroup.LayoutParams]\n   * @return View that will be added to the MapView\n   */\n  override fun bind(mapView: FrameLayout, attrs: AttributeSet?, pixelRatio: Float): View {\n    internalSettings = LogoAttributeParser.parseLogoSettings(mapView.context, attrs, pixelRatio)\n    return viewImplProvider(mapView.context).also {\n      it.injectPresenter(this)\n    }\n  }\n\n  /**\n   * Called when the plugin is first added to the map.\n   */\n  override fun initialize() {\n    applySettings()\n  }\n\n  /**\n   * Provides a view instances returned in [bind] after it's been added to the MapView.\n   *\n   * @param view plugin view\n   */\n  override fun onPluginView(view: View) {\n    logoView = view as? LogoView\n      ?: throw IllegalArgumentException(\"The provided view needs to implement LogoContract.LogoView\")\n  }\n}"
  },
  {
    "path": "plugin-logo/src/main/java/com/mapbox/maps/plugin/logo/generated/LogoAttributeParser.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.logo.generated\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport com.mapbox.maps.plugin.logo.R\n\n/**\n * Utility class for parsing [AttributeSet] to [LogoSettings].\n */\ninternal object LogoAttributeParser {\n  /**\n   * Parse [AttributeSet] to [LogoSettings].\n   *\n   * @param context Context\n   * @param attrs AttributionSet\n   */\n  fun parseLogoSettings(context: Context, attrs: AttributeSet?, pixelRatio: Float = 1.0f): LogoSettings {\n    val typedArray = context.obtainStyledAttributes(attrs, R.styleable.mapbox_MapView, 0, 0)\n    try {\n      return LogoSettings {\n        enabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_logoEnabled, true)\n        position = typedArray.getInt(R.styleable.mapbox_MapView_mapbox_logoGravity, Gravity.BOTTOM or Gravity.START)\n        marginLeft = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_logoMarginLeft, 4f * pixelRatio)\n        marginTop = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_logoMarginTop, 4f * pixelRatio)\n        marginRight = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_logoMarginRight, 4f * pixelRatio)\n        marginBottom = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_logoMarginBottom, 4f * pixelRatio)\n      }\n    } finally {\n      typedArray.recycle()\n    }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-logo/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n    <declare-styleable name=\"mapbox_MapView\">\n        <!-- Whether the logo is visible on the map. -->\n        <attr name=\"mapbox_logoEnabled\" format=\"boolean\"/>\n\n        <!-- Defines where the logo is positioned on the map -->\n        <attr name=\"mapbox_logoGravity\">\n            <!-- Push object to the top of its container, not changing its size. -->\n            <flag name=\"top\" value=\"0x30\" />\n            <!-- Push object to the bottom of its container, not changing its size. -->\n            <flag name=\"bottom\" value=\"0x50\" />\n            <!-- Push object to the left of its container, not changing its size. -->\n            <flag name=\"left\" value=\"0x03\" />\n            <!-- Push object to the right of its container, not changing its size. -->\n            <flag name=\"right\" value=\"0x05\" />\n            <!-- Place object in the vertical center of its container, not changing its size. -->\n            <flag name=\"center_vertical\" value=\"0x10\" />\n            <!-- Grow the vertical size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill_vertical\" value=\"0x70\" />\n            <!-- Place object in the horizontal center of its container, not changing its size. -->\n            <flag name=\"center_horizontal\" value=\"0x01\" />\n            <!-- Grow the horizontal size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill_horizontal\" value=\"0x07\" />\n            <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->\n            <flag name=\"center\" value=\"0x11\" />\n            <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill\" value=\"0x77\" />\n            <!-- Additional option that can be set to have the top and/or bottom edges of\n                 the child clipped to its container's bounds.\n                 The clip will be based on the vertical gravity: a top gravity will clip the bottom\n                 edge, a bottom gravity will clip the top edge, and neither will clip both edges. -->\n            <flag name=\"clip_vertical\" value=\"0x80\" />\n            <!-- Additional option that can be set to have the left and/or right edges of\n                 the child clipped to its container's bounds.\n                 The clip will be based on the horizontal gravity: a left gravity will clip the right\n                 edge, a right gravity will clip the left edge, and neither will clip both edges. -->\n            <flag name=\"clip_horizontal\" value=\"0x08\" />\n            <!-- Push object to the beginning of its container, not changing its size. -->\n            <flag name=\"start\" value=\"0x00800003\" />\n            <!-- Push object to the end of its container, not changing its size. -->\n            <flag name=\"end\" value=\"0x00800005\" />\n        </attr>\n        <!-- Defines the margin to the left that the attribution icon honors. -->\n        <attr name=\"mapbox_logoMarginLeft\" format=\"dimension\"/>\n        <!-- Defines the margin to the top that the attribution icon honors. -->\n        <attr name=\"mapbox_logoMarginTop\" format=\"dimension\"/>\n        <!-- Defines the margin to the right that the attribution icon honors. -->\n        <attr name=\"mapbox_logoMarginRight\" format=\"dimension\"/>\n        <!-- Defines the margin to the bottom that the attribution icon honors. -->\n        <attr name=\"mapbox_logoMarginBottom\" format=\"dimension\"/>\n    </declare-styleable>\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-logo/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">The Mapbox logo wordmark must remain enabled in accordance with our Terms of Service. See https://www.mapbox.com/legal/tos for more details.</string>\n</resources>"
  },
  {
    "path": "plugin-logo/src/main/res/values-ar/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">يجب أن تظل العلامة النصية لشعار Mapbox ممكنة وفقًا لشروط الخدمة الخاصة بنا. راجع https://www.mapbox.com/legal/tos لمزيد من التفاصيل.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-be/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Лагатып Mapbox павінен заставацца бачным у адпаведнасці з нашымі Ўмовамі абслугоўвання. Дадатковая інфармацыя: https://www.mapbox.com/legal/tos.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-bg/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Словната марка на логото на Mapbox трябва да остане активирана в съответствие с нашите Условия за ползване. Вижте https://www.mapbox.com/legal/tos за повече подробности.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-ca/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">El logotip de Mapbox ha de romandre activat d\\'acord amb les nostres Condicions del servei. Consulteu https://www.mapbox.com/legal/tos per obtenir més informació.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-cs/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Slovní znak loga Mapbox musí zůstat aktivní v souladu s našimi smluvními podmínkami. Další podrobnosti najdete na https://www.mapbox.com/legal/tos.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-da/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Mapbox-logoets ordmærke skal forblive aktiveret i overensstemmelse med vores servicevilkår. Se https://www.mapbox.com/legal/tos for flere detaljer.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-de/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Die Mapbox-Logo-Wortmarke muss gemäß unseren Nutzungsbedingungen aktiviert bleiben. Weitere Informationen finden Sie unter https://www.mapbox.com/legal/tos.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-es/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">El logotipo de Mapbox debe permanecer habilitado de acuerdo con nuestros Términos de servicio. Consulte https://www.mapbox.com/legal/tos para obtener más detalles.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-fr/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Le logo du logo Mapbox doit rester activé conformément à nos conditions d\\'utilisation. Voir https://www.mapbox.com/legal/tos pour plus de détails.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-gl/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">O logotipo de Mapbox debe permanecer activado de acordo coas nosas Condicións de servizo. Consulte https://www.mapbox.com/legal/tos para obter máis detalles.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-it/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Il marchio denominativo del logo Mapbox deve rimanere abilitato in conformità con i nostri Termini di servizio. Vedi https://www.mapbox.com/legal/tos per maggiori dettagli.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-iw/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">סימן המילים הלוגו של Mapbox חייב להישאר מופעל בהתאם לתנאים וההגבלות שלנו. ראה https://www.mapbox.com/legal/tos לפרטים נוספים.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-ja/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Mapbox ロゴのワードマークは、サービス利用規約に従って有効にしておく必要があります。詳細については、https://www.mapbox.com/legal/tos を参照してください。</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-ko/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Mapbox 로고 워드마크는 서비스 약관에 따라 활성화된 상태로 유지되어야 합니다. 자세한 내용은 https://www.mapbox.com/legal/tos를 참조하세요.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-lt/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Žodis „Mapbox“ logotipas turi likti įjungtas pagal mūsų paslaugų teikimo sąlygas. Daugiau informacijos rasite adresu https://www.mapbox.com/legal/tos.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-nl/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Het Mapbox-logowoordmerk moet ingeschakeld blijven in overeenstemming met onze Servicevoorwaarden. Zie https://www.mapbox.com/legal/tos voor meer details.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-no/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Mapbox-logoens ordmerke må forbli aktivert i samsvar med våre vilkår for bruk. Se https://www.mapbox.com/legal/tos for mer informasjon.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-pl/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Znak słowny logo Mapbox musi pozostać włączony zgodnie z naszymi Warunkami świadczenia usług. Więcej szczegółów można znaleźć na stronie https://www.mapbox.com/legal/tos.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-pt/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">A marca do logotipo Mapbox deve permanecer habilitada de acordo com nossos Termos de Serviço. Consulte https://www.mapbox.com/legal/tos para obter mais detalhes.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-ru/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Логотип Mapbox должен оставаться видимым в соответствии с нашими Условиями обслуживания. Дополнительная информация: https://www.mapbox.com/legal/tos.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-sv/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Mapbox-logotypens ordmärke måste förbli aktiverat i enlighet med våra användarvillkor. Se https://www.mapbox.com/legal/tos för mer information.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-uk/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Словесний знак логотипа Mapbox має залишатися ввімкненим відповідно до наших Умов використання. Додаткову інформацію див. на сторінці https://www.mapbox.com/legal/tos.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-vi/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">Nhãn từ biểu tượng Mapbox phải luôn được bật theo Điều khoản dịch vụ của chúng tôi. Xem https://www.mapbox.com/legal/tos để biết thêm chi tiết.</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-zh/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">根据我们的服务条款，Mapbox 徽标字标必须保持启用状态。有关更多详细信息，请参阅 https://www.mapbox.com/legal/tos。</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-zh-rCN/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">根据我们的服务条款，Mapbox 徽标字标必须保持启用状态。有关更多详细信息，请参阅 https://www.mapbox.com/legal/tos。</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-zh-rHK/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">根據我們的服務條款，Mapbox 標誌字標必須保持啟用。有關更多詳細信息，請參閱 https://www.mapbox.com/legal/tos。</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res/values-zh-rTW/strings.xml",
    "content": "<resources>\n    <string name=\"mapbox_warning_logo_disabled\">根據我們的服務條款，Mapbox 標誌字標必須保持啟用。有關更多詳細信息，請參閱 https://www.mapbox.com/legal/tos。</string>\n</resources>\n"
  },
  {
    "path": "plugin-logo/src/main/res-public/values/public.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n\n    <!-- Whether the logo is visible on the map. -->\n    <public name=\"mapbox_logoEnabled\" type=\"attr\" />\n\n    <!-- Defines where the logo is positioned on the map -->\n    <public name=\"mapbox_logoGravity\" type=\"attr\" />\n\n    <!-- Defines the margin to the left that the attribution icon honors. -->\n    <public name=\"mapbox_logoMarginLeft\" type=\"attr\" />\n\n    <!-- Defines the margin to the top that the attribution icon honors. -->\n    <public name=\"mapbox_logoMarginTop\" type=\"attr\" />\n\n    <!-- Defines the margin to the right that the attribution icon honors. -->\n    <public name=\"mapbox_logoMarginRight\" type=\"attr\" />\n\n    <!-- Defines the margin to the bottom that the attribution icon honors. -->\n    <public name=\"mapbox_logoMarginBottom\" type=\"attr\" />\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-logo/src/test/java/com/mapbox/maps/plugin/logo/LogoViewImplPluginTest.kt",
    "content": "package com.mapbox.maps.plugin.logo\n\nimport android.view.Gravity\nimport android.widget.FrameLayout\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\n\nclass LogoViewImplPluginTest {\n\n  private lateinit var logoPlugin: LogoPlugin\n  private val logoView = mockk<LogoViewImpl>(relaxUnitFun = true)\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private val mapCameraDelegate = mockk<MapCameraManagerDelegate>(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    logoPlugin = LogoViewPlugin { logoView }\n    every { logoView.logoEnabled } returns true\n    logoPlugin.onPluginView(logoView)\n    logoPlugin.onDelegateProvider(delegateProvider)\n  }\n\n  @Test\n  fun getLogoGravity() {\n    assertEquals(Gravity.BOTTOM or Gravity.START, logoPlugin.position)\n  }\n\n  @Test\n  fun setLogoGravity() {\n    logoPlugin.position = Gravity.BOTTOM\n    verify { logoView.logoGravity = Gravity.BOTTOM }\n  }\n\n  @Test\n  fun getEnabled() {\n    every { logoView.logoEnabled } returns true\n    assertEquals(true, logoPlugin.enabled)\n  }\n\n  @Test\n  fun setEnabled_true() {\n    every { mapCameraDelegate.cameraState.bearing } returns 10.0\n    every { logoView.logoEnabled } returns true\n    logoPlugin.enabled = true\n    // logo is enabled by default so we do not update the logoView with the same state\n    verify(exactly = 0) { logoView.logoEnabled = true }\n  }\n\n  @Test\n  fun setEnabled_false() {\n    every { mapCameraDelegate.cameraState.bearing } returns 0.0\n    every { logoView.logoEnabled } returns true\n    logoPlugin.enabled = false\n    verify { logoView.logoEnabled = false }\n  }\n\n  @Test\n  fun bind() {\n    val mapView = mockk<FrameLayout>()\n    every { mapView.context } returns mockk(relaxed = true)\n    assertEquals(logoView, logoPlugin.bind(mapView, mockk(), 1.0f))\n    verify { logoView.injectPresenter(logoPlugin) }\n  }\n\n  @Test\n  fun setLogoMarginsViaSettings() {\n    logoPlugin.updateSettings {\n      marginLeft = 1f\n      marginTop = 2f\n      marginRight = 3f\n      marginBottom = 4f\n    }\n    verify { logoView.setLogoMargins(1, 2, 3, 4) }\n    verify { logoView.requestLayout() }\n  }\n\n  @Test\n  fun setEnabledViaSettings() {\n    logoPlugin.updateSettings {\n      enabled = false\n    }\n    verify { logoView.logoEnabled = false }\n  }\n\n  @Test\n  fun setLogoGravityViaSettings() {\n    logoPlugin.updateSettings {\n      position = Gravity.BOTTOM\n    }\n    verify { logoView.logoGravity = Gravity.BOTTOM }\n  }\n\n  @Test\n  fun updateOtherSettingsAfterSetEnabled() {\n    every { logoView.logoEnabled } returns true\n    logoPlugin.enabled = false\n\n    logoPlugin.marginBottom = 1.0F\n\n    assertEquals(false, logoPlugin.enabled)\n    verify { logoView.logoEnabled = false }\n  }\n}"
  },
  {
    "path": "plugin-logo/src/test/java/com/mapbox/maps/plugin/logo/generated/LogoAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.logo.generated\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport com.mapbox.maps.plugin.logo.R\nimport io.mockk.Runs\nimport io.mockk.clearAllMocks\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\n\nclass LogoAttributeParserTest {\n  private val context: Context = mockk(relaxed = true)\n\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n\n  private val typedArray: TypedArray = mockk(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getInt(any(), any()) } returns 0\n    every { typedArray.getColor(any(), any()) } returns Color.RED\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getResourceId(any(), -1) } returns 1\n    every { typedArray.hasValue(any()) } returns true\n    every { typedArray.recycle() } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun testTypedArrayRecycle() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = LogoAttributeParser.parseLogoSettings(context, attrs, 1.2f)\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun testTypedArrayRecycleWithException() {\n    every { typedArray.getBoolean(any(), any()) }.throws(Exception(\"\"))\n    try {\n      val settings = LogoAttributeParser.parseLogoSettings(context, attrs, 1.2f)\n    } catch (e: Exception) {\n      // do nothing\n    }\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun enabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = LogoAttributeParser.parseLogoSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.enabled)\n  }\n\n  @Test\n  fun enabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = LogoAttributeParser.parseLogoSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.enabled)\n  }\n\n  @Test\n  fun positionTest() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_logoGravity, any()) } returns 100\n    val settings = LogoAttributeParser.parseLogoSettings(context, attrs, 1.2f)\n    assertEquals(100, settings.position)\n  }\n\n  @Test\n  fun marginLeftTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = LogoAttributeParser.parseLogoSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginLeft)\n  }\n\n  @Test\n  fun marginTopTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = LogoAttributeParser.parseLogoSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginTop)\n  }\n\n  @Test\n  fun marginRightTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = LogoAttributeParser.parseLogoSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginRight)\n  }\n\n  @Test\n  fun marginBottomTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = LogoAttributeParser.parseLogoSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginBottom)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-overlay/.gitignore",
    "content": "/build"
  },
  {
    "path": "plugin-overlay/README.md",
    "content": "## Mapbox Maps MapOverlay Plugin for Android\n\n### Overview\n\nThe Mapbox MapOverlay Plugin for Android is an public library for adding overlays on top of MapView. By registering overlays into MapOverlay Plugin and providing the EdgeInsets(margins) of these overlay views, MapOverlay Plugin can adjust the camera center location and zoom level to make sure all the important POIs(provided by `MapOverlayCoordinatesProvider`) are not covered by these overlays.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n![MapOverlay-plugin](https://user-images.githubusercontent.com/8577318/98535135-8f68b000-22c0-11eb-9b09-c4f4f8664745.gif)\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox MapOverlay Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the MapOverlay plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-overlay:10.8.0'\n}\n```\n\n### Example\n\nCustomizing Mapbox MapOverlay Plugin for Android could be done in two ways: by either providing your own version of the MapOverlay plugin or by using the existing apis of the MapOverlay plugin. The former is documented in [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md), the latter can be achieved with:\n\n```kotlin\nprivate val provider = object : MapOverlayCoordinatesProvider {\n    override fun getShownCoordinates(): List<Point> {\n        // Return the points that will not be covered by overlays\n    }\n}\n\nmapOverlayPlugin = mapView.mapboxOverlay\n// Set displaying area margins if needed\nmapOverlayPlugin.setDisplayingAreaMargins(50, 50, 50, 50)\n\nmapOverlayPlugin.registerMapOverlayCoordinatesProvider(provider)\n// Register a view as a overlays on map\nmapOverlayPlugin.registerOverlay(overlay)\n// Register other overlays if needed\n\n// Reframe MapView when needed.\nmapOverlayPlugin.reframe()\n\n// Reframe MapView with animation when needed.\nmapOverlayPlugin.getReframeCameraOption()?.let {\n    mapboxMap.flyTo(it, 1000)\n}\n```\n\nMore concrete examples of the MapOverlay plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-overlay/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.overlay {\n\n  public final class MapOverlayUtils {\n    method public static com.mapbox.maps.plugin.overlay.MapOverlayPlugin getOverlay(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-overlay/api/plugin-overlay.api",
    "content": "public final class com/mapbox/maps/plugin/overlay/MapOverlayUtils {\n\tpublic static final synthetic fun createOverlayPlugin ()Lcom/mapbox/maps/plugin/overlay/MapOverlayPlugin;\n\tpublic static final fun getOverlay (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/overlay/MapOverlayPlugin;\n}\n\n"
  },
  {
    "path": "plugin-overlay/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.overlay\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-overlay\"\n    artifactTitle = \"The map overlay module for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-overlay\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-overlay/src/main/java/com/mapbox/maps/plugin/overlay/MapOverlayExt.kt",
    "content": "@file:JvmName(\"MapOverlayUtils\")\n\npackage com.mapbox.maps.plugin.overlay\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val for MapView to get the map overlay plugin instance.\n *\n * @return Map overlay plugin instance\n */\nval MapPluginProviderDelegate.mapboxOverlay: MapOverlayPlugin\n  @JvmName(\"getOverlay\")\n  get() = this.getPlugin(Plugin.MAPBOX_MAP_OVERLAY_PLUGIN_ID)!!\n\n/**\n * Static method to create instance of Mapbox overlay plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createOverlayPlugin(): MapOverlayPlugin {\n  return MapOverlayPluginImpl()\n}"
  },
  {
    "path": "plugin-overlay/src/main/java/com/mapbox/maps/plugin/overlay/MapOverlayPluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.overlay\n\nimport android.view.View\nimport androidx.annotation.RestrictTo\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.delegates.*\nimport java.util.*\n\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapOverlayPluginImpl : MapOverlayPlugin {\n  private val mapOverlays = mutableListOf<View>()\n  private var mapOverlayCoordinatesProvider: MapOverlayCoordinatesProvider? = null\n  internal var width: Int = 0\n  internal var height: Int = 0\n  private var marginLeft: Int = 0\n  private var marginTop: Int = 0\n  private var marginRight: Int = 0\n  private var marginBottom: Int = 0\n  private lateinit var mapCameraManagerDelegate: MapCameraManagerDelegate\n\n  /**\n   * Invoked when MapView's width and height have changed.\n   * @param width the width of mapView\n   * @param height the height of mapView\n   */\n  override fun onSizeChanged(width: Int, height: Int) {\n    this.width = width\n    this.height = height\n  }\n\n  /**\n   * To register a MapOverlayCoordinatesProvider instance to the Container\n   */\n  override fun registerMapOverlayCoordinatesProvider(provider: MapOverlayCoordinatesProvider) {\n    mapOverlayCoordinatesProvider = provider\n  }\n\n  /**\n   * Unregister the MapOverlayCoordinatesProvider.\n   */\n  override fun unregisterMapOverlayCoordinatesProvider() {\n    mapOverlayCoordinatesProvider = null\n  }\n\n  /**\n   * Register a MapOverlay instance.\n   * @param overlay the registered overlay view\n   */\n  override fun registerOverlay(overlay: View) {\n    mapOverlays.add(overlay)\n  }\n\n  /**\n   * Register views as overlays\n   * @param overlays the registered overlay view\n   */\n  override fun registerOverlays(overlays: List<View>) {\n    mapOverlays.addAll(overlays)\n  }\n\n  /**\n   * Unregister a MapOverlay instance.\n   * @param overlay the unregistered overlay view\n   */\n  override fun unregisterOverlay(overlay: View) {\n    mapOverlays.remove(overlay)\n  }\n\n  /**\n   * Unregister views.\n   * @param overlays the unregistered overlay views\n   */\n  override fun unregisterOverlays(overlays: List<View>) {\n    overlays.forEach {\n      mapOverlays.remove(it)\n    }\n  }\n\n  /**\n   * Set the margins for the area that is displaying POIs within the overlay bounds.\n   * These margins provide offsets to ensure POIs near the border of the overlay not be hidden or covered.\n   * @param marginLeft the margin on the left, in pixel\n   * @param marginTop the margin on the top, in pixel\n   * @param marginRight the margin on the right, in pixel\n   * @param marginBottom the margin on the bottom, in pixel\n   */\n  override fun setDisplayingAreaMargins(\n    marginTop: Int,\n    marginLeft: Int,\n    marginBottom: Int,\n    marginRight: Int\n  ) {\n    this.marginLeft = marginLeft\n    this.marginTop = marginTop\n    this.marginRight = marginRight\n    this.marginBottom = marginBottom\n  }\n\n  /**\n   * Reframe MapView to a certain zoom and position to make sure every coordinate will be shown\n   * on the MapView and not be covered by registered MapOverlays.\n   * If no onAnimateReframe is provided, MapView will jump to the new CameraOptions directly;\n   * if onAnimateReframe is provided, the new CameraOptions will be return and users can define their\n   * own animation to move the camera.\n   *\n   * @param onReframeFinished the listener to get the CameraOptions\n   */\n  override fun reframe(onReframeFinished: OnReframeFinished?) {\n    reframe { camera ->\n      if (onReframeFinished != null) {\n        onReframeFinished.onReframeFinished(camera)\n      } else {\n        camera?.let {\n          mapCameraManagerDelegate.setCamera(it)\n        }\n      }\n    }\n  }\n\n  /**\n   * Get the CameraOptions that make sure every coordinate will be shown\n   * on the MapView and not be covered by registered MapOverlays.\n   * Users can use their own animation to move the camera with this CameraOptions.\n   *\n   * @param result callback with CameraOptions that MapView should animate to.\n   * Will be null if MapOverlayCoordinatesProvider is not provided.\n   */\n  private fun reframe(result: (CameraOptions?) -> Unit) {\n    mapOverlayCoordinatesProvider?.let {\n      val coordinates = it.getShownCoordinates()\n      var north = -90.0\n      var south = 90.0\n      var west = 180.0\n      var east = -180.0\n      coordinates.forEach { point ->\n        north = maxOf(north, point.latitude())\n        south = minOf(south, point.latitude())\n        west = minOf(west, point.longitude())\n        east = maxOf(east, point.longitude())\n      }\n\n      mapCameraManagerDelegate.cameraForCoordinates(\n        coordinates = listOf(Point.fromLngLat(west, south), Point.fromLngLat(east, north)),\n        camera = cameraOptions { },\n        coordinatesPadding = getEdgeInsets(),\n        maxZoom = null,\n        offset = null,\n        result\n      )\n    } ?: run {\n      result.invoke(null)\n    }\n  }\n\n  private fun getMapOverLayRect(view: View): MapOverLayRect {\n    return MapOverLayRect(view.left, view.top, view.right, view.bottom)\n  }\n\n  /**\n   * Get an EdgeInsets that represent the width and height of overlays\n   */\n  override fun getEdgeInsets(): EdgeInsets {\n    val queue = LinkedList<MapOverLayRect>()\n    queue.push(MapOverLayRect(0, 0, width, height))\n\n    // BFS find all the possible rectangles\n    mapOverlays.map {\n      getMapOverLayRect(it)\n    }.forEach {\n      var size = queue.size\n      while (size > 0) {\n        val subMapRect = queue.pollFirst()!!\n        if (it.isOverLap(subMapRect)) {\n          // insert the new subMapRect\n          if (it.top - subMapRect.top < subMapRect.bottom - it.bottom) {\n            // overlay rect is on the top part of MapRect, create a new MapRect with the bottom part\n            queue.offerLast(subMapRect.updateTop(it.bottom))\n          } else if (it.top - subMapRect.top > subMapRect.bottom - it.bottom) {\n            // overlay rect is on the bottom part of MapRect, create a new MapRect with the top part\n            queue.offerLast(subMapRect.updateBottom(it.top))\n          } else {\n            // overlay rect is on the center of MapRect, create a new MapRect with both the top part and bottom part\n            queue.offerLast(subMapRect.updateTop(it.bottom))\n            queue.offerLast(subMapRect.updateBottom(it.top))\n          }\n\n          if (it.left - subMapRect.left < subMapRect.right - it.right) {\n            // overlay rect is on the left part of MapRect, create a new MapRect with the right part\n            queue.offerLast(subMapRect.updateLeft(it.right))\n          } else if (it.left - subMapRect.left > subMapRect.right - it.right) {\n            // overlay rect is on the right part of MapRect, create a new MapRect with the left part\n            queue.offerLast(subMapRect.updateRight(it.left))\n          } else {\n            // overlay rect is on the center part of MapRect, create a new MapRect with both the left and the right part\n            queue.offerLast(subMapRect.updateLeft(it.right))\n            queue.offerLast(subMapRect.updateRight(it.left))\n          }\n        } else {\n          queue.offerLast(subMapRect)\n        }\n        size--\n      }\n    }\n\n    // Choose the one with max area\n    val mapRect = queue.maxOrNull()\n\n    return if (mapRect == null) {\n      EdgeInsets(\n        marginTop.toDouble(), marginLeft.toDouble(), marginBottom.toDouble(),\n        marginRight.toDouble()\n      )\n    } else {\n      EdgeInsets(\n        mapRect.top.toDouble() + marginTop,\n        mapRect.left.toDouble() + marginLeft,\n        (height - mapRect.bottom + marginBottom).toDouble(),\n        (width - mapRect.right + marginRight).toDouble()\n      )\n    }\n  }\n\n  /**\n   * Class that represents the rectangle of MapOverlays on MapView\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY)\n  internal class MapOverLayRect(\n    var left: Int,\n    var top: Int,\n    var right: Int,\n    var bottom: Int\n  ) : Comparable<MapOverLayRect> {\n\n    /**\n     * Check whether two rectangles are overlap\n     *\n     * @return true if they are overlap\n     */\n    fun isOverLap(reactAnother: MapOverLayRect): Boolean {\n      return !(\n        right <= reactAnother.left ||\n          bottom <= reactAnother.top ||\n          left >= reactAnother.right ||\n          top >= reactAnother.bottom\n        )\n    }\n\n    fun updateTop(newTop: Int): MapOverLayRect {\n      return MapOverLayRect(left, newTop, right, bottom)\n    }\n\n    fun updateLeft(newLeft: Int): MapOverLayRect {\n      return MapOverLayRect(newLeft, top, right, bottom)\n    }\n\n    fun updateRight(newRight: Int): MapOverLayRect {\n      return MapOverLayRect(left, top, newRight, bottom)\n    }\n\n    fun updateBottom(newBottom: Int): MapOverLayRect {\n      return MapOverLayRect(left, top, right, newBottom)\n    }\n\n    override fun compareTo(other: MapOverLayRect): Int {\n      return (((right - left) * (bottom - top)) - ((other.right - other.left) * (other.bottom - other.top)))\n    }\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   */\n  override fun cleanup() {\n    unregisterMapOverlayCoordinatesProvider()\n    mapOverlays.clear()\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    mapCameraManagerDelegate = delegateProvider.mapCameraManagerDelegate\n  }\n}"
  },
  {
    "path": "plugin-overlay/src/test/java/com/mapbox/maps/plugin/overlay/MapOverlayPluginTest.kt",
    "content": "package com.mapbox.maps.plugin.overlay\n\nimport android.view.View\nimport android.widget.FrameLayout\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.util.isEmpty\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass MapOverlayPluginTest {\n\n  private lateinit var mapOverlayPlugin: MapOverlayPluginImpl\n  private val delegateProvider = mockk<MapDelegateProvider>(relaxUnitFun = true)\n  private val mapCameraManagerDelegate = mockk<MapCameraManagerDelegate>()\n  val mapView = mockk<FrameLayout>()\n\n  @Before\n  fun setUp() {\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    mapOverlayPlugin = MapOverlayPluginImpl()\n    mapOverlayPlugin.onDelegateProvider(delegateProvider)\n    assertEquals(0, mapOverlayPlugin.width)\n    assertEquals(0, mapOverlayPlugin.height)\n    mapOverlayPlugin.initialize()\n    mapOverlayPlugin.onSizeChanged(100, 100)\n    assertEquals(100, mapOverlayPlugin.width)\n    assertEquals(100, mapOverlayPlugin.height)\n  }\n\n  @After\n  fun clean() {\n    mapOverlayPlugin.cleanup()\n  }\n\n  @Test\n  fun getEdgeInsets() {\n    var edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(0.0, 0.0, 0.0, 0.0), edgeInsets)\n\n    mapOverlayPlugin.setDisplayingAreaMargins(10, 20, 30, 40)\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(10.0, 20.0, 30.0, 40.0), edgeInsets)\n\n    mapOverlayPlugin.setDisplayingAreaMargins(0, 0, 0, 0)\n\n    val overlay = mockk<View>()\n    every { overlay.top } returns 0\n    every { overlay.left } returns 0\n    every { overlay.bottom } returns 50\n    every { overlay.right } returns 100\n\n    mapOverlayPlugin.registerOverlay(overlay)\n\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(50.0, 0.0, 0.0, 0.0), edgeInsets)\n\n    mapOverlayPlugin.setDisplayingAreaMargins(10, 20, 30, 40)\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(60.0, 20.0, 30.0, 40.0), edgeInsets)\n    mapOverlayPlugin.setDisplayingAreaMargins(0, 0, 0, 0)\n\n    val overlay1 = mockk<View>()\n    every { overlay1.top } returns 50\n    every { overlay1.left } returns 0\n    every { overlay1.bottom } returns 100\n    every { overlay1.right } returns 50\n\n    mapOverlayPlugin.registerOverlay(overlay1)\n\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(50.0, 50.0, 0.0, 0.0), edgeInsets)\n\n    mapOverlayPlugin.unregisterOverlay(overlay)\n    mapOverlayPlugin.unregisterOverlay(overlay1)\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(0.0, 0.0, 0.0, 0.0), edgeInsets)\n  }\n\n  @Test\n  fun getEdgeInsetsMultiOverlays() {\n    var edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(0.0, 0.0, 0.0, 0.0), edgeInsets)\n\n    val overlay = mockk<View>()\n    every { overlay.top } returns 0\n    every { overlay.left } returns 0\n    every { overlay.bottom } returns 50\n    every { overlay.right } returns 100\n\n    val overlay1 = mockk<View>()\n    every { overlay1.top } returns 50\n    every { overlay1.left } returns 0\n    every { overlay1.bottom } returns 100\n    every { overlay1.right } returns 50\n\n    mapOverlayPlugin.registerOverlays(listOf(overlay, overlay1))\n\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(50.0, 50.0, 0.0, 0.0), edgeInsets)\n\n    val overlay2 = mockk<View>()\n    every { overlay2.top } returns 80\n    every { overlay2.left } returns 50\n    every { overlay2.bottom } returns 100\n    every { overlay2.right } returns 100\n\n    val overlay3 = mockk<View>()\n    every { overlay3.top } returns 50\n    every { overlay3.left } returns 80\n    every { overlay3.bottom } returns 80\n    every { overlay3.right } returns 100\n\n    mapOverlayPlugin.registerOverlays(listOf(overlay2, overlay3))\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(50.0, 50.0, 20.0, 20.0), edgeInsets)\n\n    mapOverlayPlugin.unregisterOverlays(listOf(overlay, overlay1, overlay2, overlay3))\n    edgeInsets = mapOverlayPlugin.getEdgeInsets()\n    assertEquals(EdgeInsets(0.0, 0.0, 0.0, 0.0), edgeInsets)\n  }\n\n  @Test\n  fun getReframeCameraOption() {\n    val point = Point.fromLngLat(0.0, 0.0)\n    mapOverlayPlugin.reframe {\n      assertNull(it)\n    }\n    mapOverlayPlugin.registerMapOverlayCoordinatesProvider { listOf(point) }\n\n    val slot = slot<List<Point>>()\n    val cameraOptionsSlot = slot<CameraOptions>()\n    val paddingSlot = slot<EdgeInsets>()\n    every {\n      mapCameraManagerDelegate.cameraForCoordinates(\n        capture(slot),\n        capture(cameraOptionsSlot),\n        capture(paddingSlot),\n        any(),\n        any(),\n        any()\n      )\n    } just Runs\n    mapOverlayPlugin.reframe {\n      assertNotNull(it)\n      assertEquals(point, it!!.center)\n    }\n\n    assertEquals(\n      listOf(Point.fromLngLat(0.0, 0.0), Point.fromLngLat(0.0, 0.0)),\n      slot.captured\n    )\n    assertEquals(EdgeInsets(0.0, 0.0, 0.0, 0.0), paddingSlot.captured)\n    assertTrue(cameraOptionsSlot.captured.isEmpty)\n\n    val cameraSlot = slot<CameraOptions>()\n    every { mapCameraManagerDelegate.setCamera(capture(cameraSlot)) } just Runs\n    mapOverlayPlugin.reframe()\n    mapOverlayPlugin.reframe {\n      assertEquals(it, cameraSlot.captured)\n    }\n\n    mapOverlayPlugin.unregisterMapOverlayCoordinatesProvider()\n    mapOverlayPlugin.reframe {\n      assertNull(it)\n    }\n  }\n}"
  },
  {
    "path": "plugin-scalebar/.gitignore",
    "content": "/build"
  },
  {
    "path": "plugin-scalebar/README.md",
    "content": "## Mapbox Maps ScaleBar Plugin for Android\n\n### Overview\n\nThe Mapbox Maps ScaleBar Plugin for Android is an public library for displaying scale bar on top of MapView. By default the plugin will show a scale bar on top of the map at the top-left corner. Scale bar gets visually updated on MapView zoom level or latitude change.\n\nA full overview of classes and interfaces can be found in our [API documentation](https://docs.mapbox.com/android/beta/maps/guides/).\n\n![scalebar-plugin](https://user-images.githubusercontent.com/8577318/95547874-7e651e80-0a36-11eb-8512-b4256db8f81c.gif)\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps ScaleBar Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the ScaleBar plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-scalebar:11.22.0-rc.1'\n}\n```\n\n### Example\n\nCustomizing Mapbox Maps Scale Plugin for Android could be done in two ways: by either providing your own version of the ScaleBar plugin or by setting the ScaleBarSettings to the ScaleBar plugin. The former is documented in [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md), the latter can be achieved with:\n\n```kotlin\nval scaleBarPlugin = mapView.scalebar\nval settings = scaleBarPlugin.getSettings()\nsettings.textColor = ContextCompat.getColor(this, R.color.primary)\n// Update other properties if needed.\nscaleBarPlugin.updateSettings(settings)\n```\n\nThe ScaleBar plugin can also be configured in layout files:\n\n```xml\n<com.mapbox.maps.MapView\n    android:id=\"@+id/mapView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    mapbox:mapbox_scaleBarBorderWidth=\"1dp\"\n    mapbox:mapbox_scaleBarHeight=\"3dp\"\n    mapbox:mapbox_scaleBarMarginLeft=\"5dp\"\n    mapbox:mapbox_scaleBarMarginTop=\"5dp\"\n    mapbox:mapbox_scaleBarPrimaryColor=\"@color/white\"\n    mapbox:mapbox_scaleBarSecondaryColor=\"@color/design_default_color_on_secondary\"\n    mapbox:mapbox_scaleBarTextBarMargin=\"5dp\"\n    mapbox:mapbox_scaleBarTextBorderWidth=\"1dp\"\n    mapbox:mapbox_scaleBarTextColor=\"@color/accent\"\n    mapbox:mapbox_scaleBarTextSize=\"10dp\" />\n```\nMore concrete examples of the ScaleBar plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-scalebar/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.scalebar {\n\n  public final class LocaleUnitResolver {\n    method public com.mapbox.maps.plugin.DistanceUnits getDistanceUnits();\n    method public boolean isMetricSystem();\n    property public final com.mapbox.maps.plugin.DistanceUnits distanceUnits;\n    property public final boolean isMetricSystem;\n    field public static final com.mapbox.maps.plugin.scalebar.LocaleUnitResolver INSTANCE;\n  }\n\n  public final class ScaleBarConstantKt {\n  }\n\n  public final class ScaleBarImpl extends android.view.View implements com.mapbox.maps.plugin.scalebar.ScaleBar {\n    ctor public ScaleBarImpl(android.content.Context context);\n    ctor public ScaleBarImpl(android.content.Context context, android.util.AttributeSet attrs);\n    ctor public ScaleBarImpl(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr);\n    method public float getDistancePerPixel();\n    method public boolean getEnable();\n    method public float getMapViewWidth();\n    method public float getPixelRatio();\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings getSettings();\n    method public boolean getUseContinuousRendering();\n    method public void setDistancePerPixel(float);\n    method public void setEnable(boolean);\n    method public void setMapViewWidth(float);\n    method public void setPixelRatio(float);\n    method public void setSettings(com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings);\n    method public void setUseContinuousRendering(boolean);\n    property public float distancePerPixel;\n    property public boolean enable;\n    property public float mapViewWidth;\n    property public float pixelRatio;\n    property public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings settings;\n    property public boolean useContinuousRendering;\n    field public static final com.mapbox.maps.plugin.scalebar.ScaleBarImpl.Companion Companion;\n  }\n\n  public static final class ScaleBarImpl.Companion {\n  }\n\n  public final class ScaleBarUtils {\n    method public static com.mapbox.maps.plugin.scalebar.ScaleBarPlugin getScaleBar(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-scalebar/api/plugin-scalebar.api",
    "content": "public final class com/mapbox/maps/plugin/scalebar/LocaleUnitResolver {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/plugin/scalebar/LocaleUnitResolver;\n\tpublic final fun getDistanceUnits ()Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic final fun isMetricSystem ()Z\n}\n\npublic final class com/mapbox/maps/plugin/scalebar/ScaleBarImpl : android/view/View, com/mapbox/maps/plugin/scalebar/ScaleBar {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/scalebar/ScaleBarImpl$Companion;\n\tpublic fun <init> (Landroid/content/Context;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;)V\n\tpublic fun <init> (Landroid/content/Context;Landroid/util/AttributeSet;I)V\n\tpublic fun getDistancePerPixel ()F\n\tpublic fun getEnable ()Z\n\tpublic fun getMapViewWidth ()F\n\tpublic fun getPixelRatio ()F\n\tpublic fun getSettings ()Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;\n\tpublic fun getUseContinuousRendering ()Z\n\tpublic fun setDistancePerPixel (F)V\n\tpublic fun setEnable (Z)V\n\tpublic fun setMapViewWidth (F)V\n\tpublic fun setPixelRatio (F)V\n\tpublic fun setSettings (Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;)V\n\tpublic fun setUseContinuousRendering (Z)V\n}\n\npublic final class com/mapbox/maps/plugin/scalebar/ScaleBarImpl$Companion {\n}\n\npublic final class com/mapbox/maps/plugin/scalebar/ScaleBarUtils {\n\tpublic static final synthetic fun createScaleBarPlugin ()Lcom/mapbox/maps/plugin/scalebar/ScaleBarPlugin;\n\tpublic static final fun getScaleBar (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/scalebar/ScaleBarPlugin;\n}\n\n"
  },
  {
    "path": "plugin-scalebar/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.scalebar\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n  kotlinOptions {\n    jvmTarget = \"1.8\"\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-scalebar\"\n    artifactTitle = \"The scalebar module for the Mapbox Maps SDK for Android\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-scalebar\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-scalebar/src/main/java/com/mapbox/maps/plugin/scalebar/LocaleUnitResolver.kt",
    "content": "package com.mapbox.maps.plugin.scalebar\n\nimport com.mapbox.maps.plugin.DistanceUnits\nimport java.util.*\n\n/**\n * Util object to determine if the user is in a country using the metric system.\n */\nobject LocaleUnitResolver {\n  /**\n   * @return true if user country is using metric, false if imperial\n   */\n  val isMetricSystem: Boolean\n    get() {\n      return when (Locale.getDefault().country.uppercase(Locale.getDefault())) {\n        ImperialCountryCode.US, ImperialCountryCode.LIBERIA, ImperialCountryCode.MYANMAR -> false\n        else -> true\n      }\n    }\n\n  /**\n   * @return distance units for user country\n   */\n  val distanceUnits: DistanceUnits\n    get() {\n      return if (isMetricSystem) DistanceUnits.METRIC else DistanceUnits.IMPERIAL\n    }\n\n  /**\n   * Data class containing uppercase country codes for countries using the imperial system.\n   */\n  internal object ImperialCountryCode {\n    const val US = \"US\"\n    const val MYANMAR = \"MM\"\n    const val LIBERIA = \"LR\"\n  }\n}"
  },
  {
    "path": "plugin-scalebar/src/main/java/com/mapbox/maps/plugin/scalebar/ScaleBarConstant.kt",
    "content": "package com.mapbox.maps.plugin.scalebar\n\nimport android.util.Pair\n\ninternal const val FEET_PER_METER = 3.2808F\ninternal const val KILOMETER = 1000\ninternal const val FEET_PER_MILE = 5280\ninternal const val FEET_PER_FATHOM = 6\ninternal const val FEET_PER_NAUTICAL_MILE = 6076.12F\ninternal const val METER_UNIT = \" m\"\ninternal const val FEET_UNIT = \" ft\"\ninternal const val FATHOM_UNIT = \" fth\"\ninternal const val KILOMETER_UNIT = \" km\"\ninternal const val MILE_UNIT = \" mi\"\ninternal const val NAUTICAL_MILE_UNIT = \" nmi\"\ninternal val metricTable = listOf(\n  Pair(1, 2),\n  Pair(2, 2),\n  Pair(4, 2),\n  Pair(10, 2),\n  Pair(20, 2),\n  Pair(50, 2),\n  Pair(75, 3),\n  Pair(100, 2),\n  Pair(150, 2),\n  Pair(200, 2),\n  Pair(300, 3),\n  Pair(500, 2),\n  Pair(1000, 2),\n  Pair(1500, 2),\n  Pair(3000, 3),\n  Pair(5000, 2),\n  Pair(10000, 2),\n  Pair(20000, 2),\n  Pair(30000, 3),\n  Pair(50000, 2),\n  Pair(100000, 2),\n  Pair(200000, 2),\n  Pair(300000, 3),\n  Pair(400000, 2),\n  Pair(500000, 2),\n  Pair(600000, 3),\n  Pair(800000, 2),\n  Pair(1000000, 2),\n  Pair(2000000, 2),\n  Pair(3000000, 3),\n  Pair(4000000, 2),\n  Pair(5000000, 2),\n  Pair(6000000, 3),\n  Pair(8000000, 2),\n  Pair(10000000, 2),\n  Pair(12000000, 2),\n  Pair(15000000, 2)\n)\ninternal val imperialTable = listOf(\n  Pair(1, 1),\n  Pair(4, 2),\n  Pair(6, 2),\n  Pair(10, 2),\n  Pair(20, 2),\n  Pair(30, 2),\n  Pair(50, 2),\n  Pair(75, 3),\n  Pair(100, 2),\n  Pair(200, 2),\n  Pair(300, 3),\n  Pair(400, 2),\n  Pair(600, 3),\n  Pair(800, 2),\n  Pair(1000, 2),\n  Pair((0.25f * FEET_PER_MILE).toInt(), 2),\n  Pair((0.5f * FEET_PER_MILE).toInt(), 2),\n  Pair(FEET_PER_MILE, 2),\n  Pair(2 * FEET_PER_MILE, 2),\n  Pair(3 * FEET_PER_MILE, 3),\n  Pair(4 * FEET_PER_MILE, 2),\n  Pair(8 * FEET_PER_MILE, 2),\n  Pair(12 * FEET_PER_MILE, 2),\n  Pair(15 * FEET_PER_MILE, 3),\n  Pair(20 * FEET_PER_MILE, 2),\n  Pair(30 * FEET_PER_MILE, 3),\n  Pair(40 * FEET_PER_MILE, 2),\n  Pair(80 * FEET_PER_MILE, 2),\n  Pair(120 * FEET_PER_MILE, 2),\n  Pair(200 * FEET_PER_MILE, 2),\n  Pair(300 * FEET_PER_MILE, 3),\n  Pair(400 * FEET_PER_MILE, 2),\n  Pair(600 * FEET_PER_MILE, 3),\n  Pair(1000 * FEET_PER_MILE, 2),\n  Pair(1500 * FEET_PER_MILE, 3),\n  Pair(2000 * FEET_PER_MILE, 2),\n  Pair(3000 * FEET_PER_MILE, 2),\n  Pair(4000 * FEET_PER_MILE, 2),\n  Pair(5000 * FEET_PER_MILE, 2),\n  Pair(6000 * FEET_PER_MILE, 3),\n  Pair(8000 * FEET_PER_MILE, 2),\n  Pair(10000 * FEET_PER_MILE, 2)\n)\ninternal var nauticalTable = listOf(\n  Pair(1 * FEET_PER_FATHOM, 2),\n  Pair(2 * FEET_PER_FATHOM, 2),\n  Pair(3 * FEET_PER_FATHOM, 3),\n  Pair(5 * FEET_PER_FATHOM, 2),\n  Pair(10 * FEET_PER_FATHOM, 2),\n  Pair(20 * FEET_PER_FATHOM, 2),\n  Pair(30 * FEET_PER_FATHOM, 3),\n  Pair(50 * FEET_PER_FATHOM, 2),\n  Pair(100 * FEET_PER_FATHOM, 2),\n  Pair(200 * FEET_PER_FATHOM, 2),\n  Pair((0.5 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((1 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((2 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((3 * FEET_PER_NAUTICAL_MILE).toInt(), 3),\n  Pair((5 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((10 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((20 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((30 * FEET_PER_NAUTICAL_MILE).toInt(), 3),\n  Pair((50 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((100 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((200 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((300 * FEET_PER_NAUTICAL_MILE).toInt(), 3),\n  Pair((500 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((1000 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((2000 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n  Pair((3000 * FEET_PER_NAUTICAL_MILE).toInt(), 3),\n  Pair((5000 * FEET_PER_NAUTICAL_MILE).toInt(), 2),\n)"
  },
  {
    "path": "plugin-scalebar/src/main/java/com/mapbox/maps/plugin/scalebar/ScaleBarExt.kt",
    "content": "@file:JvmName(\"ScaleBarUtils\")\n\npackage com.mapbox.maps.plugin.scalebar\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val for MapView to get the ScaleBar plugin instance.\n */\nval MapPluginProviderDelegate.scalebar: ScaleBarPlugin\n  @JvmName(\"getScaleBar\")\n  get() = this.getPlugin(Plugin.MAPBOX_SCALEBAR_PLUGIN_ID)!!\n\n/**\n * Static method to create instance of Mapbox scalebar plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createScaleBarPlugin(): ScaleBarPlugin {\n  return ScaleBarPluginImpl()\n}"
  },
  {
    "path": "plugin-scalebar/src/main/java/com/mapbox/maps/plugin/scalebar/ScaleBarImpl.kt",
    "content": "package com.mapbox.maps.plugin.scalebar\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.os.Handler\nimport android.os.Looper\nimport android.os.Message\nimport android.util.AttributeSet\nimport android.util.Pair\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.annotation.VisibleForTesting\nimport androidx.core.util.component1\nimport androidx.core.util.component2\nimport com.mapbox.maps.plugin.DistanceUnits\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings\nimport java.lang.ref.WeakReference\nimport java.text.DecimalFormat\n\n/**\n * Concrete implementation of ScaleBar.\n */\nclass ScaleBarImpl : ScaleBar, View {\n  /**\n   * The scaleTable used for calculating scale bar segments\n   */\n  internal var scaleTable: List<Pair<Int, Int>> = metricTable\n\n  /**\n   * The paint draw distance num and unit\n   */\n  internal val textPaint = Paint()\n\n  /**\n   * The paint draw scale bar\n   */\n  internal val barPaint = Paint()\n\n  /**\n   * The paint draw text border\n   */\n  internal val strokePaint = Paint()\n\n  /**\n   * The unit for distance\n   */\n  internal var unit: String = METER_UNIT\n\n  /**\n   * Defines the width of mapView\n   */\n  override var mapViewWidth = DEFAULT_MAPVIEW_WIDTH\n    set(value) {\n      field = value\n      post(::requestLayout)\n    }\n\n  /**\n   * Defines the pixel ratio in the current display.\n   */\n  override var pixelRatio = DEFAULT_PIXEL_RATIO\n\n  /**\n   * If set to True scale bar will be triggering onDraw depending on [ScaleBarSettings.refreshInterval]\n   * even if actual data did not change. If set to False scale bar will redraw only on demand.\n   *\n   * Defaults to False and should not be changed explicitly in most cases.\n   * Could be set to True to produce correct GPU frame metrics when running gfxinfo command.\n   */\n  override var useContinuousRendering = false\n    set(value) {\n      if (value) {\n        if (!isScaleBarVisible) {\n          visibility = VISIBLE\n        }\n        refreshHandler.removeMessages(MSG_RENDER_ON_DEMAND)\n        refreshHandler.sendEmptyMessage(MSG_RENDER_CONTINUOUS)\n      } else {\n        if (!isScaleBarVisible) {\n          visibility = GONE\n        }\n        refreshHandler.removeMessages(MSG_RENDER_CONTINUOUS)\n        reusableCanvas = null\n      }\n      field = value\n    }\n\n  private val refreshHandler: RefreshHandler\n\n  private val decimalFormat = DecimalFormat(\"0.#\")\n  private var isScaleBarVisible = false\n  private var reusableCanvas: Canvas? = null\n\n  /**\n   * Current settings will be used to draw ScaleBar\n   */\n  override var settings: ScaleBarSettings = ScaleBarSettings { }\n    set(value) {\n      textPaint.color = value.textColor\n      textPaint.textSize = value.textSize\n      strokePaint.textSize = value.textSize\n      scaleTable = when (value.distanceUnits) {\n        DistanceUnits.METRIC -> metricTable\n        DistanceUnits.IMPERIAL -> imperialTable\n        DistanceUnits.NAUTICAL -> nauticalTable\n        else -> metricTable\n      }\n      unit = when (value.distanceUnits) {\n        DistanceUnits.METRIC -> METER_UNIT\n        DistanceUnits.IMPERIAL -> FEET_UNIT\n        DistanceUnits.NAUTICAL -> FATHOM_UNIT\n        else -> METER_UNIT\n      }\n      strokePaint.strokeWidth = if (value.showTextBorder) value.textBorderWidth else 0F\n      enable = value.enabled\n      useContinuousRendering = value.useContinuousRendering\n      if (useContinuousRendering) {\n        reusableCanvas = null\n      } else {\n        if (!refreshHandler.hasMessages(MSG_RENDER_ON_DEMAND)) {\n          refreshHandler.sendEmptyMessageDelayed(MSG_RENDER_ON_DEMAND, value.refreshInterval)\n        }\n      }\n\n      field = value\n      (layoutParams as? FrameLayout.LayoutParams)?.apply {\n        gravity = value.position\n        setMargins(\n          value.marginLeft.toInt(),\n          value.marginTop.toInt(),\n          value.marginRight.toInt(),\n          value.marginBottom.toInt()\n        )\n      }\n      // Refresh mapViewWidth\n      mapViewWidth = mapViewWidth\n    }\n\n  private var currentSegmentsConfiguration: SegmentsConfiguration? = null\n\n  /**\n   * distancePerPixel in current location latitude\n   */\n  override var distancePerPixel = 0F\n    set(value) {\n      // We want to store imperial value but we're getting meters so transform it before checking\n      // if it's different\n      val valueCandidate = when (settings.distanceUnits) {\n        DistanceUnits.METRIC -> value\n        DistanceUnits.IMPERIAL, DistanceUnits.NAUTICAL -> value * FEET_PER_METER\n        else -> value\n      }\n      if (field != valueCandidate) {\n        field = valueCandidate\n        if (useContinuousRendering) {\n          reusableCanvas = null\n        } else {\n          val maxDistance = mapViewWidth * distancePerPixel * settings.ratio\n          val newSegmentsConfiguration = calculateSegmentsConfiguration(\n            maxDistance = maxDistance,\n            distancePerPixel = field,\n            scaleTable = scaleTable,\n            textPaint = textPaint,\n            strokeWidth = strokePaint.strokeWidth,\n            unit = unit,\n            rightMarginPx = width\n          )\n          // Only force a re-draw if the bar UI has changed enough by checking current\n          // `segmentsConfiguration` against new one and in case there isn't the same message\n          // already queued\n          if (newSegmentsConfiguration != currentSegmentsConfiguration &&\n            !refreshHandler.hasMessages(MSG_RENDER_ON_DEMAND)\n          ) {\n            refreshHandler.sendEmptyMessageDelayed(MSG_RENDER_ON_DEMAND, settings.refreshInterval)\n          }\n        }\n      }\n    }\n\n  /**\n   * Whether ScaleBar is enabled or not\n   */\n  override var enable: Boolean\n    get() = isScaleBarVisible\n    set(value) {\n      isScaleBarVisible = value\n      if (!useContinuousRendering) {\n        visibility = if (value) VISIBLE else GONE\n      }\n    }\n\n  /**\n   * Constructor with context.\n   *\n   * @param context\n   */\n  constructor(context: Context) : super(context)\n\n  /**\n   * Constructor with context and attribute set.\n   *\n   * @param context\n   * @param attrs\n   */\n  constructor(context: Context, attrs: AttributeSet) : super(context, attrs)\n\n  /**\n   * Constructor with context, attribute set and defStyleAttr.\n   *\n   * @param context\n   * @param attrs The attribution set.\n   * @param defStyleAttr An attribute in the current theme that contains a reference to a style\n   *  resource that supplies defaults values for the StyledAttributes. Can be 0 to not look for defaults.\n   */\n  constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(\n    context, attrs, defStyleAttr\n  )\n\n  init {\n    textPaint.isAntiAlias = true\n    textPaint.textAlign = Paint.Align.CENTER\n\n    strokePaint.isAntiAlias = true\n    strokePaint.textAlign = Paint.Align.CENTER\n    strokePaint.style = Paint.Style.STROKE\n    strokePaint.color = Color.WHITE\n\n    barPaint.isAntiAlias = true\n    refreshHandler = RefreshHandler(this).apply {\n      if (useContinuousRendering) {\n        sendEmptyMessage(MSG_RENDER_CONTINUOUS)\n      }\n    }\n  }\n\n  override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n    val (viewWidth, viewHeight) = calculateWidthAndHeight()\n    setMeasuredDimension(viewWidth.toInt(), viewHeight.toInt())\n  }\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal fun calculateWidthAndHeight(): Pair<Float, Float> {\n    // Add padding the width to avoid texts being cut off and the end of scalebar.\n    val width = mapViewWidth * settings.ratio + INTERNAL_PADDING_DP * pixelRatio\n    val height = settings.run { textBarMargin + textSize + height + (borderWidth * 2) }\n    return Pair(width, height)\n  }\n\n  /**\n   * Draw ScaleBar with current settings\n   */\n  override fun onDraw(canvas: Canvas) {\n    if (useContinuousRendering) {\n      if (!isScaleBarVisible) {\n        canvas.drawARGB(0, 0, 0, 0)\n        return\n      }\n      if (reusableCanvas != null) {\n        return\n      }\n    }\n    if (distancePerPixel <= 0 || mapViewWidth <= 0 || width <= 0) {\n      return\n    }\n    settings.run {\n      val maxDistance = mapViewWidth * distancePerPixel * ratio\n      if (maxDistance <= 0.1F) {\n        // There's no space to render the smallest distance. Don't render anything.\n        canvas.drawARGB(0, 0, 0, 0)\n        return\n      }\n      val scaleBarUiConfiguration = calculateSegmentsConfiguration(\n        maxDistance = maxDistance,\n        distancePerPixel = distancePerPixel,\n        scaleTable = scaleTable,\n        textPaint = textPaint,\n        strokeWidth = strokePaint.strokeWidth,\n        unit = unit,\n        rightMarginPx = width\n      )\n      currentSegmentsConfiguration = scaleBarUiConfiguration\n\n      // Drawing the surrounding borders\n      barPaint.style = Paint.Style.FILL_AND_STROKE\n      barPaint.color = secondaryColor\n      val barWidth = scaleBarUiConfiguration.unitBarWidth * scaleBarUiConfiguration.rectCount\n      canvas.drawRect(\n        0f,\n        textBarMargin + textSize - (borderWidth * 2),\n        barWidth + (borderWidth * 2),\n        textBarMargin + textSize + height + (borderWidth * 2),\n        barPaint\n      )\n      barPaint.color = primaryColor\n      canvas.drawRect(\n        borderWidth,\n        textBarMargin + textSize - borderWidth,\n        barWidth + borderWidth,\n        textBarMargin + textSize + height + borderWidth,\n        barPaint\n      )\n\n      // Drawing the fill\n      barPaint.style = Paint.Style.FILL\n\n      for (rectIndex in 0..scaleBarUiConfiguration.rectCount) {\n        barPaint.color = if (rectIndex % 2 == 0) primaryColor else secondaryColor\n        val distanceText =\n          scaleBarUiConfiguration.labelTexts[rectIndex]\n        when (rectIndex) {\n          0 -> {\n            textPaint.textAlign = Paint.Align.LEFT\n            strokePaint.textAlign = Paint.Align.LEFT\n          }\n          else -> {\n            textPaint.textAlign = Paint.Align.CENTER\n            strokePaint.textAlign = Paint.Align.CENTER\n          }\n        }\n\n        drawText(\n          canvas = canvas,\n          text = distanceText,\n          x = scaleBarUiConfiguration.labelMarginsAndAnchor[rectIndex].third,\n          y = textSize,\n        )\n\n        if (rectIndex != scaleBarUiConfiguration.rectCount) {\n          canvas.drawRect(\n            (borderWidth * 2) + (scaleBarUiConfiguration.unitBarWidth * rectIndex),\n            textBarMargin + textSize,\n            scaleBarUiConfiguration.unitBarWidth * (1 + rectIndex),\n            textBarMargin + textSize + height,\n            barPaint\n          )\n        }\n      }\n    }\n    if (useContinuousRendering) {\n      reusableCanvas = canvas\n    }\n  }\n\n  private fun drawText(\n    canvas: Canvas,\n    text: String,\n    x: Float,\n    y: Float,\n  ) {\n    if (settings.showTextBorder) {\n      canvas.drawText(text, x, y, strokePaint)\n    }\n    canvas.drawText(text, x, y, textPaint)\n  }\n\n  /**\n   * @return a new configuration holding the values to be able to render the scale bar\n   */\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal fun calculateSegmentsConfiguration(\n    maxDistance: Float,\n    distancePerPixel: Float,\n    scaleTable: List<Pair<Int, Int>>,\n    textPaint: Paint,\n    strokeWidth: Float,\n    unit: String,\n    rightMarginPx: Int\n  ): SegmentsConfiguration {\n    // Find the entry where the distance just fits in the given `maxDistance`\n    val pair =\n      scaleTable.lastOrNull { (distance: Int, _: Int) -> distance <= maxDistance } ?: scaleTable[0]\n\n    var distance: Float = pair.first.toFloat()\n    var rectCount: Int = pair.second\n    var unitDistance: Float = distance / rectCount\n\n    // When maxDistance is small (i.e. high zoom levels near the poles) then\n    // the `distance` might be bigger than maxDistance. This loop will keep removing\n    // bar divisions (rectCount) until it fits\n    while (unitDistance * rectCount > maxDistance && rectCount > 0) {\n      rectCount--\n      distance = unitDistance * rectCount\n    }\n    // In case the unitDistance doesn't fit at all we fallback to maxDistance (rounded to 1\n    // decimal) with 1 division\n    if (rectCount == 0) {\n      unitDistance = maxDistance.toOneDecimal()\n      rectCount = 1\n      distance = unitDistance\n    }\n\n    var overlapDetected = true\n    val labelTexts: MutableList<String> = mutableListOf()\n    val labelMarginsAndAnchor: MutableList<Triple<Float, Float, Float>> = mutableListOf()\n    var unitBarWidth = 0F\n    while (overlapDetected) {\n      unitDistance = distance / rectCount\n      unitBarWidth = (unitDistance / distancePerPixel).toOneDecimal()\n      labelTexts.clear()\n      labelMarginsAndAnchor.clear()\n\n      // Let's create the text label and calculate the position per each one\n      for (idx in 0..rectCount) {\n        labelTexts.add(idx, getDistanceText(unitDistance * idx, unit))\n        labelMarginsAndAnchor.add(\n          idx,\n          calculateTextPositions(\n            labelTexts[idx],\n            unitBarWidth * idx,\n            if (idx == 0) Paint.Align.LEFT else Paint.Align.CENTER,\n            textPaint,\n            strokeWidth,\n            rightMarginPx\n          )\n        )\n      }\n\n      // Figure out if there's an overlap, by comparing each label right position with the next\n      // one left position\n      overlapDetected = false\n      for (idx in 0 until labelMarginsAndAnchor.size - 1) {\n        // `second` is the label right margin, `first` is the left margin\n        if (labelMarginsAndAnchor[idx].second >= labelMarginsAndAnchor[idx + 1].first) {\n          if (rectCount == 1) {\n            // There is a collision and we can't reduce the count, let's hide the `0` label\n            labelTexts[0] = \"\"\n            break\n          }\n          // There's is a collision so reduce the `rectCount` and start all over again\n          rectCount--\n          overlapDetected = true\n          break\n        }\n      }\n    }\n    return SegmentsConfiguration(\n      unitDistance = unitDistance,\n      unitBarWidth = unitBarWidth,\n      rectCount = rectCount,\n      labelTexts = labelTexts.toList(),\n      labelMarginsAndAnchor = labelMarginsAndAnchor.toList()\n    )\n  }\n\n  private fun calculateTextPositions(\n    text: String,\n    anchorXPx: Float,\n    alignment: Paint.Align,\n    textPaint: Paint,\n    strokeWidth: Float,\n    rightMarginPx: Int,\n  ): Triple<Float, Float, Float> {\n    var safeAnchorX = anchorXPx\n\n    val textWidthPx = textPaint.measureText(text)\n    var textRightPx = anchorXPx + strokeWidth / 2F + when (alignment) {\n      Paint.Align.LEFT -> textWidthPx\n      Paint.Align.CENTER -> textWidthPx / 2\n      Paint.Align.RIGHT -> 0F\n    }\n\n    // Check if it goes beyond the right margin of the view\n    if (textRightPx > rightMarginPx) {\n      // Move it away from right margin enough to fit\n      safeAnchorX -= (textRightPx - rightMarginPx)\n    }\n    var textLeftPx = safeAnchorX - strokeWidth / 2F - when (alignment) {\n      Paint.Align.LEFT -> 0F\n      Paint.Align.CENTER -> textWidthPx / 2\n      Paint.Align.RIGHT -> textWidthPx\n    }\n\n    // Check if if the text would fall beyond the left margin\n    if (textLeftPx < 0) {\n      // Shift everything to the right so it fits\n      textLeftPx += strokeWidth / 2\n      safeAnchorX += strokeWidth / 2\n      textRightPx += strokeWidth / 2\n      // At this point it can happen that textRightPx is beyond the rightMarginPx\n      // that means that the text doesn't fit! We can't solve it so we let the text be cut on\n      // the right\n    }\n    return Triple(textLeftPx.toOneDecimal(), textRightPx.toOneDecimal(), safeAnchorX.toOneDecimal())\n  }\n\n  /**\n   * Get the formatted distance text according unit and distance\n   *\n   * @param distance original distance\n   * @param unit the unit to use, either [METER_UNIT] or [FEET_UNIT]\n   * @return Formatted distance text\n   */\n  internal fun getDistanceText(distance: Float, unit: String): String = when {\n    distance == 0F -> \"0\"\n    METER_UNIT == unit -> {\n      if (distance < KILOMETER) decimalFormat.format(distance) + METER_UNIT\n      else decimalFormat.format(distance * 1f / KILOMETER) + KILOMETER_UNIT\n    }\n    FEET_UNIT == unit -> {\n      if (distance < FEET_PER_MILE * 0.2) decimalFormat.format(distance) + FEET_UNIT\n      else decimalFormat.format(distance * 1f / FEET_PER_MILE) + MILE_UNIT\n    }\n    FATHOM_UNIT == unit -> {\n      if (distance < FEET_PER_NAUTICAL_MILE * 0.2) decimalFormat.format(distance / FEET_PER_FATHOM) + FATHOM_UNIT\n      else decimalFormat.format(distance * 1f / FEET_PER_NAUTICAL_MILE) + NAUTICAL_MILE_UNIT\n    }\n    else -> {\n      if (distance < KILOMETER) decimalFormat.format(distance) + METER_UNIT\n      else decimalFormat.format(distance * 1f / KILOMETER) + KILOMETER_UNIT\n    }\n  }\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal fun refreshHandlerHasMessages(what: Int): Boolean = refreshHandler.hasMessages(what)\n\n  /**\n   * Handler class to limit the refresh frequent.\n   */\n  private class RefreshHandler(scaleBarImpl: ScaleBarImpl) : Handler(Looper.getMainLooper()) {\n    private var scaleBarWidgetWeakReference: WeakReference<ScaleBarImpl> =\n      WeakReference(scaleBarImpl)\n\n    override fun handleMessage(msg: Message) {\n      scaleBarWidgetWeakReference.get()?.let {\n        when (msg.what) {\n          MSG_RENDER_CONTINUOUS -> {\n            val reusableCanvas = it.reusableCanvas\n            if (reusableCanvas == null) {\n              it.invalidate()\n            } else {\n              it.draw(reusableCanvas)\n            }\n            sendEmptyMessageDelayed(MSG_RENDER_CONTINUOUS, it.settings.refreshInterval)\n          }\n          MSG_RENDER_ON_DEMAND -> it.invalidate()\n          else -> return\n        }\n      }\n    }\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    internal const val MSG_RENDER_ON_DEMAND = 0\n    internal const val MSG_RENDER_CONTINUOUS = 1\n    internal const val DEFAULT_MAPVIEW_WIDTH = 0F\n    internal const val DEFAULT_PIXEL_RATIO = 1.0F\n    internal const val INTERNAL_PADDING_DP = 10\n  }\n  private fun Float.toOneDecimal(): Float = (this * 10).toInt() / 10.0F\n}\n\ninternal data class SegmentsConfiguration(\n  var unitDistance: Float,\n  var unitBarWidth: Float,\n  var rectCount: Int,\n  var labelTexts: List<String>,\n  /**\n   * A [Triple] that contains per each label:\n   * 1. left margin in pixels\n   * 2. right margin in pixels\n   * 3. anchor X in pixels\n   */\n  var labelMarginsAndAnchor: List<Triple<Float, Float, Float>>,\n)"
  },
  {
    "path": "plugin-scalebar/src/main/java/com/mapbox/maps/plugin/scalebar/ScaleBarPluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.scalebar\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.annotation.RestrictTo\nimport com.mapbox.annotation.MapboxExperimental\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.CameraChangedCoalescedCallback\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.Projection.getMetersPerPixelAtLatitude\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapListenerDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarAttributeParser\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettingsBase\n\n/**\n * Concrete implementation of ScaleBarViewPlugin.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class ScaleBarPluginImpl(\n  private val viewImplProvider: (Context) -> ScaleBarImpl = { ScaleBarImpl(it) }\n) : ScaleBarPlugin, ScaleBarSettingsBase() {\n  private lateinit var scaleBar: ScaleBar\n  private lateinit var mapListenerDelegate: MapListenerDelegate\n  private lateinit var mapTransformDelegate: MapTransformDelegate\n  private lateinit var mapCameraManagerDelegate: MapCameraManagerDelegate\n  override var internalSettings: ScaleBarSettings = ScaleBarSettings { }\n  @OptIn(MapboxExperimental::class)\n  private val cameraChangedCoalescedCallback = CameraChangedCoalescedCallback {\n    invalidateScaleBar(it.cameraState)\n  }\n  private var cancelable: Cancelable? = null\n\n  override fun applySettings() {\n    scaleBar.settings = internalSettings\n    invalidateScaleBar()\n  }\n\n  /**\n   * Invoked when MapView's width and height have changed.\n   * @param width the width of mapView\n   * @param height the height of mapView\n   */\n  override fun onSizeChanged(width: Int, height: Int) {\n    scaleBar.mapViewWidth = width.toFloat()\n    if (enabled) {\n      invalidateScaleBar()\n    }\n  }\n\n  /**\n   * Bind the ViewPlugin with current map context. This will create a View that\n   * will be added to the MapView.\n   *\n   * @param mapView parent view which can be used to fetch [android.content.Context] or [ViewGroup.LayoutParams]\n   * @return View that will be added to the MapView\n   */\n  override fun bind(mapView: FrameLayout, attrs: AttributeSet?, pixelRatio: Float): View {\n    internalSettings =\n      ScaleBarAttributeParser.parseScaleBarSettings(mapView.context, attrs, pixelRatio)\n    val scaleBarImpl = viewImplProvider(mapView.context)\n    (scaleBarImpl as ScaleBar).pixelRatio = pixelRatio\n    return scaleBarImpl\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   */\n  override fun cleanup() {\n    cancelable?.cancel()\n  }\n\n  /**\n   * Called when the plugin is first added to the map.\n   */\n  @OptIn(MapboxExperimental::class)\n  override fun initialize() {\n    applySettings()\n    cancelable = mapListenerDelegate.subscribeCameraChangedCoalesced(cameraChangedCoalescedCallback)\n  }\n\n  /**\n   * Invalid scale bar\n   */\n  private fun invalidateScaleBar(cameraState: CameraState = mapCameraManagerDelegate.cameraState) {\n    val metersPerPixelAtLatitude = getMetersPerPixelAtLatitude(\n      cameraState.center.latitude(),\n      cameraState.zoom\n    )\n    scaleBar.distancePerPixel = (metersPerPixelAtLatitude / scaleBar.pixelRatio).toFloat()\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    mapCameraManagerDelegate = delegateProvider.mapCameraManagerDelegate\n    mapListenerDelegate = delegateProvider.mapListenerDelegate\n    mapTransformDelegate = delegateProvider.mapTransformDelegate\n  }\n\n  /**\n   * Provides a view instances returned in [bind] after it's been added to the MapView.\n   *\n   * @param view plugin view\n   */\n  override fun onPluginView(view: View) {\n    scaleBar = view as? ScaleBar\n      ?: throw IllegalArgumentException(\"The provided view needs to implement ScaleBarContract.ScaleBarView\")\n  }\n\n  /**\n   * Defines whether the plugins is enabled or disabled.\n   */\n  @OptIn(MapboxExperimental::class)\n  override var enabled: Boolean\n    get() = internalSettings.enabled\n    set(value) {\n      if (internalSettings.enabled == value) {\n        // Skip if not changed\n        return\n      }\n      if (value) {\n        cancelable = mapListenerDelegate.subscribeCameraChangedCoalesced(cameraChangedCoalescedCallback)\n        invalidateScaleBar()\n      } else {\n        cancelable?.cancel()\n      }\n      internalSettings = internalSettings.toBuilder().setEnabled(value).build()\n      scaleBar.enable = value\n    }\n\n  /**\n   * How many meters in each pixel.\n   */\n  override var distancePerPixel: Float\n    get() = scaleBar.distancePerPixel\n    set(value) {\n      scaleBar.distancePerPixel = value\n    }\n\n  /**\n   * If set to True scale bar will be triggering onDraw depending on [ScaleBarSettings.refreshInterval]\n   * even if actual data did not change. If set to False scale bar will redraw only on demand.\n   *\n   * Defaults to False and should not be changed explicitly in most cases.\n   * Could be set to True to produce correct GPU frame metrics when running gfxinfo command.\n   */\n  override var useContinuousRendering: Boolean\n    get() = scaleBar.useContinuousRendering\n    set(value) {\n      scaleBar.useContinuousRendering = value\n    }\n}"
  },
  {
    "path": "plugin-scalebar/src/main/java/com/mapbox/maps/plugin/scalebar/generated/ScaleBarAttributeParser.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.scalebar.generated\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport com.mapbox.maps.plugin.DistanceUnits\nimport com.mapbox.maps.plugin.scalebar.LocaleUnitResolver\nimport com.mapbox.maps.plugin.scalebar.R\n\n/**\n * Utility class for parsing [AttributeSet] to [ScaleBarSettings].\n */\ninternal object ScaleBarAttributeParser {\n  /**\n   * Parse [AttributeSet] to [ScaleBarSettings].\n   *\n   * @param context Context\n   * @param attrs AttributionSet\n   */\n  fun parseScaleBarSettings(context: Context, attrs: AttributeSet?, pixelRatio: Float = 1.0f): ScaleBarSettings {\n    val typedArray = context.obtainStyledAttributes(attrs, R.styleable.mapbox_MapView, 0, 0)\n    try {\n      return ScaleBarSettings {\n        enabled = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_scaleBarEnabled, true)\n        position = typedArray.getInt(R.styleable.mapbox_MapView_mapbox_scaleBarGravity, Gravity.TOP or Gravity.START)\n        marginLeft = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_scaleBarMarginLeft, 4f * pixelRatio)\n        marginTop = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_scaleBarMarginTop, 4f * pixelRatio)\n        marginRight = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_scaleBarMarginRight, 4f * pixelRatio)\n        marginBottom = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_scaleBarMarginBottom, 4f * pixelRatio)\n        textColor = typedArray.getColor(R.styleable.mapbox_MapView_mapbox_scaleBarTextColor, Color.BLACK)\n        primaryColor = typedArray.getColor(R.styleable.mapbox_MapView_mapbox_scaleBarPrimaryColor, Color.BLACK)\n        secondaryColor = typedArray.getColor(R.styleable.mapbox_MapView_mapbox_scaleBarSecondaryColor, Color.WHITE)\n        borderWidth = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_scaleBarBorderWidth, 2f * pixelRatio)\n        height = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_scaleBarHeight, 2f * pixelRatio)\n        textBarMargin = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_scaleBarTextBarMargin, 8f * pixelRatio)\n        textBorderWidth = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_scaleBarTextBorderWidth, 2f * pixelRatio)\n        textSize = typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_scaleBarTextSize, 8f * pixelRatio)\n        isMetricUnits = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_scaleBarIsMetricUnits, LocaleUnitResolver.isMetricSystem)\n        distanceUnits = DistanceUnits.values()[typedArray.getInt(R.styleable.mapbox_MapView_mapbox_scaleBarDistanceUnits, LocaleUnitResolver.distanceUnits.ordinal)]\n        refreshInterval = typedArray.getInt(R.styleable.mapbox_MapView_mapbox_scaleBarRefreshInterval, 15).toLong()\n        showTextBorder = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_scaleBarShowTextBorder, true)\n        ratio = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_scaleBarRatio, 0.5f)\n        useContinuousRendering = typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_scaleBarUseContinuousRendering, false)\n      }\n    } finally {\n      typedArray.recycle()\n    }\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-scalebar/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n    <declare-styleable name=\"mapbox_MapView\">\n        <!-- Whether the scale is visible on the map. -->\n        <attr name=\"mapbox_scaleBarEnabled\" format=\"boolean\"/>\n\n        <!-- Defines where the scale bar is positioned on the map -->\n        <attr name=\"mapbox_scaleBarGravity\">\n            <!-- Push object to the top of its container, not changing its size. -->\n            <flag name=\"top\" value=\"0x30\" />\n            <!-- Push object to the bottom of its container, not changing its size. -->\n            <flag name=\"bottom\" value=\"0x50\" />\n            <!-- Push object to the left of its container, not changing its size. -->\n            <flag name=\"left\" value=\"0x03\" />\n            <!-- Push object to the right of its container, not changing its size. -->\n            <flag name=\"right\" value=\"0x05\" />\n            <!-- Place object in the vertical center of its container, not changing its size. -->\n            <flag name=\"center_vertical\" value=\"0x10\" />\n            <!-- Grow the vertical size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill_vertical\" value=\"0x70\" />\n            <!-- Place object in the horizontal center of its container, not changing its size. -->\n            <flag name=\"center_horizontal\" value=\"0x01\" />\n            <!-- Grow the horizontal size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill_horizontal\" value=\"0x07\" />\n            <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->\n            <flag name=\"center\" value=\"0x11\" />\n            <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->\n            <flag name=\"fill\" value=\"0x77\" />\n            <!-- Additional option that can be set to have the top and/or bottom edges of\n                 the child clipped to its container's bounds.\n                 The clip will be based on the vertical gravity: a top gravity will clip the bottom\n                 edge, a bottom gravity will clip the top edge, and neither will clip both edges. -->\n            <flag name=\"clip_vertical\" value=\"0x80\" />\n            <!-- Additional option that can be set to have the left and/or right edges of\n                 the child clipped to its container's bounds.\n                 The clip will be based on the horizontal gravity: a left gravity will clip the right\n                 edge, a right gravity will clip the left edge, and neither will clip both edges. -->\n            <flag name=\"clip_horizontal\" value=\"0x08\" />\n            <!-- Push object to the beginning of its container, not changing its size. -->\n            <flag name=\"start\" value=\"0x00800003\" />\n            <!-- Push object to the end of its container, not changing its size. -->\n            <flag name=\"end\" value=\"0x00800005\" />\n        </attr>\n        <!-- Defines the margin to the left that the scale bar honors. -->\n        <attr name=\"mapbox_scaleBarMarginLeft\" format=\"dimension\"/>\n        <!-- Defines the margin to the top that the scale bar honors. -->\n        <attr name=\"mapbox_scaleBarMarginTop\" format=\"dimension\"/>\n        <!-- Defines the margin to the right that the scale bar honors. -->\n        <attr name=\"mapbox_scaleBarMarginRight\" format=\"dimension\"/>\n        <!-- Defines the margin to the bottom that the scale bar honors. -->\n        <attr name=\"mapbox_scaleBarMarginBottom\" format=\"dimension\"/>\n        <!-- Defines text color of the scale bar. -->\n        <attr name=\"mapbox_scaleBarTextColor\" format=\"color\"/>\n        <!-- Defines primary color of the scale bar. -->\n        <attr name=\"mapbox_scaleBarPrimaryColor\" format=\"color\"/>\n        <!-- Defines secondary color of the scale bar. -->\n        <attr name=\"mapbox_scaleBarSecondaryColor\" format=\"color\"/>\n        <!-- Defines width of the border for the scale bar. -->\n        <attr name=\"mapbox_scaleBarBorderWidth\" format=\"dimension\"/>\n        <!-- Defines height of the scale bar. -->\n        <attr name=\"mapbox_scaleBarHeight\" format=\"dimension\"/>\n        <!-- Defines margin of the text bar of the scale bar. -->\n        <attr name=\"mapbox_scaleBarTextBarMargin\" format=\"dimension\"/>\n        <!-- Defines text border width of the scale bar. -->\n        <attr name=\"mapbox_scaleBarTextBorderWidth\" format=\"dimension\"/>\n        <!-- Defines text size of the scale bar. -->\n        <attr name=\"mapbox_scaleBarTextSize\" format=\"dimension\"/>\n        <!-- Whether the scale bar is using metric unit. True if the scale bar is using metric system, false if the scale bar is using imperial units.\n            {@deprecated Use distanceUnits instead.} -->\n        <attr name=\"mapbox_scaleBarIsMetricUnits\" format=\"boolean\"/>\n        <!-- Supported distance unit types. -->\n        <attr name=\"mapbox_scaleBarDistanceUnits\" format=\"enum\">\n          <!-- Metric units using meters and kilometers. The scale bar will automatically choose between meters and kilometers based on the distance being displayed for optimal readability. -->\n          <enum name=\"metric\" value=\"0\"/>\n          <!-- Imperial units using feet for short distances and miles for longer distances.  The scale bar will display distances in feet for small distances and automatically switch to miles for longer distances. -->\n          <enum name=\"imperial\" value=\"1\"/>\n          <!-- Nautical units using fathoms for short distances and nautical miles for longer distances. The scale bar will display distances in fathoms for small distances and automatically switch to nautical miles for longer distances. Commonly used for marine and aviation navigation. -->\n          <enum name=\"nautical\" value=\"2\"/>\n        </attr>\n        <!-- Configures minimum refresh interval, in millisecond, default is 15. -->\n        <attr name=\"mapbox_scaleBarRefreshInterval\" format=\"integer\"/>\n        <!-- Configures whether to show the text border or not, default is true. -->\n        <attr name=\"mapbox_scaleBarShowTextBorder\" format=\"boolean\"/>\n        <!-- configures ratio of scale bar max width compared with MapView width, default is 0.5. -->\n        <attr name=\"mapbox_scaleBarRatio\" format=\"float\"/>\n        <!-- If set to True scale bar will be triggering onDraw depending on [ScaleBarSettings.refreshInterval] even if actual data did not change. If set to False scale bar will redraw only on demand. Defaults to False and should not be changed explicitly in most cases. Could be set to True to produce correct GPU frame metrics when running gfxinfo command. -->\n        <attr name=\"mapbox_scaleBarUseContinuousRendering\" format=\"boolean\"/>\n    </declare-styleable>\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-scalebar/src/main/res-public/values/public.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file is generated. -->\n<resources>\n\n    <!-- Whether the scale is visible on the map. -->\n    <public name=\"mapbox_scaleBarEnabled\" type=\"attr\" />\n\n    <!-- Defines where the scale bar is positioned on the map -->\n    <public name=\"mapbox_scaleBarGravity\" type=\"attr\" />\n\n    <!-- Defines the margin to the left that the scale bar honors. -->\n    <public name=\"mapbox_scaleBarMarginLeft\" type=\"attr\" />\n\n    <!-- Defines the margin to the top that the scale bar honors. -->\n    <public name=\"mapbox_scaleBarMarginTop\" type=\"attr\" />\n\n    <!-- Defines the margin to the right that the scale bar honors. -->\n    <public name=\"mapbox_scaleBarMarginRight\" type=\"attr\" />\n\n    <!-- Defines the margin to the bottom that the scale bar honors. -->\n    <public name=\"mapbox_scaleBarMarginBottom\" type=\"attr\" />\n\n    <!-- Defines text color of the scale bar. -->\n    <public name=\"mapbox_scaleBarTextColor\" type=\"attr\" />\n\n    <!-- Defines primary color of the scale bar. -->\n    <public name=\"mapbox_scaleBarPrimaryColor\" type=\"attr\" />\n\n    <!-- Defines secondary color of the scale bar. -->\n    <public name=\"mapbox_scaleBarSecondaryColor\" type=\"attr\" />\n\n    <!-- Defines width of the border for the scale bar. -->\n    <public name=\"mapbox_scaleBarBorderWidth\" type=\"attr\" />\n\n    <!-- Defines height of the scale bar. -->\n    <public name=\"mapbox_scaleBarHeight\" type=\"attr\" />\n\n    <!-- Defines margin of the text bar of the scale bar. -->\n    <public name=\"mapbox_scaleBarTextBarMargin\" type=\"attr\" />\n\n    <!-- Defines text border width of the scale bar. -->\n    <public name=\"mapbox_scaleBarTextBorderWidth\" type=\"attr\" />\n\n    <!-- Defines text size of the scale bar. -->\n    <public name=\"mapbox_scaleBarTextSize\" type=\"attr\" />\n\n    <!-- Whether the scale bar is using metric unit. True if the scale bar is using metric system, false if the scale bar is using imperial units.\n         {@deprecated Use distanceUnits instead.} -->\n    <public name=\"mapbox_scaleBarIsMetricUnits\" type=\"attr\" />\n\n    <!-- Supported distance unit types. -->\n    <public name=\"mapbox_scaleBarDistanceUnits\" type=\"attr\" />\n\n    <!-- Configures minimum refresh interval, in millisecond, default is 15. -->\n    <public name=\"mapbox_scaleBarRefreshInterval\" type=\"attr\" />\n\n    <!-- Configures whether to show the text border or not, default is true. -->\n    <public name=\"mapbox_scaleBarShowTextBorder\" type=\"attr\" />\n\n    <!-- configures ratio of scale bar max width compared with MapView width, default is 0.5. -->\n    <public name=\"mapbox_scaleBarRatio\" type=\"attr\" />\n\n    <!-- If set to True scale bar will be triggering onDraw depending on [ScaleBarSettings.refreshInterval] even if actual data did not change. If set to False scale bar will redraw only on demand. Defaults to False and should not be changed explicitly in most cases. Could be set to True to produce correct GPU frame metrics when running gfxinfo command. -->\n    <public name=\"mapbox_scaleBarUseContinuousRendering\" type=\"attr\" />\n</resources>\n<!-- End of generated file. -->"
  },
  {
    "path": "plugin-scalebar/src/test/java/com/mapbox/maps/plugin/scalebar/ScaleBarImplTest.kt",
    "content": "package com.mapbox.maps.plugin.scalebar\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.os.Looper\nimport android.util.Pair\nimport android.view.Gravity\nimport android.widget.FrameLayout\nimport androidx.test.core.app.ApplicationProvider\nimport com.mapbox.maps.plugin.DistanceUnits\nimport com.mapbox.maps.plugin.scalebar.ScaleBarImpl.Companion.MSG_RENDER_CONTINUOUS\nimport com.mapbox.maps.plugin.scalebar.ScaleBarImpl.Companion.MSG_RENDER_ON_DEMAND\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings\nimport io.mockk.mockk\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.ParameterizedRobolectricTestRunner\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.Shadows\nimport org.robolectric.annotation.Config\nimport org.robolectric.annotation.LooperMode\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowProjection::class])\nclass ScaleBarImplTest {\n  private lateinit var scaleBarView: ScaleBarImpl\n  private val scaleBarSettings = ScaleBarSettings {\n    enabled = true\n    position = Gravity.TOP or Gravity.START\n    marginLeft = 4f\n    marginTop = 4f\n    marginRight = 4f\n    marginBottom = 4f\n    textColor = Color.BLACK\n    primaryColor = Color.BLACK\n    secondaryColor = Color.WHITE\n    borderWidth = 2f\n    height = 2f\n    textBarMargin = 8f\n    textBorderWidth = 2f\n    textSize = 8f\n    distanceUnits = DistanceUnits.METRIC\n    refreshInterval = 15\n    showTextBorder = true\n    ratio = 0.5f\n  }\n\n  @Before\n  fun setUp() {\n    val context = ApplicationProvider.getApplicationContext<Context>()\n    scaleBarView = ScaleBarImpl(context)\n    val layoutParams = mockk<FrameLayout.LayoutParams>(relaxed = true)\n    scaleBarView.layoutParams = layoutParams\n    scaleBarView.settings = scaleBarSettings\n  }\n\n  @Test\n  fun calculateWidthAndHeight() {\n    scaleBarView.pixelRatio = 2.0f\n    scaleBarView.mapViewWidth = 100f\n    val viewSize = scaleBarView.calculateWidthAndHeight()\n    // 50 + ScaleBarImpl.DEFAULT_PIXEL_RATIO * 2\n    assertEquals(70.0f, viewSize.first)\n    assertEquals(22.0f, viewSize.second)\n  }\n\n  @Test\n  fun pixelRatio() {\n    assertEquals(ScaleBarImpl.DEFAULT_PIXEL_RATIO, scaleBarView.pixelRatio)\n    scaleBarView.pixelRatio = 2.0f\n    assertEquals(2.0f, scaleBarView.pixelRatio)\n  }\n\n  @Test\n  fun scaleTable() {\n    assertEquals(metricTable, scaleBarView.scaleTable)\n    scaleBarView.settings = scaleBarSettings.toBuilder().setDistanceUnits(DistanceUnits.IMPERIAL).build()\n    assertEquals(imperialTable, scaleBarView.scaleTable)\n    scaleBarView.settings = scaleBarSettings.toBuilder().setDistanceUnits(DistanceUnits.NAUTICAL).build()\n    assertEquals(nauticalTable, scaleBarView.scaleTable)\n  }\n\n  @Test\n  fun textPain() {\n    assertEquals(Color.BLACK, scaleBarView.textPaint.color)\n    assertEquals(8f, scaleBarView.textPaint.textSize)\n  }\n\n  @Test\n  fun barPaint() {\n    assertTrue(scaleBarView.barPaint.isAntiAlias)\n  }\n\n  @Test\n  fun strokePaint() {\n    assertEquals(2f, scaleBarView.strokePaint.strokeWidth)\n    assertEquals(8f, scaleBarView.strokePaint.textSize)\n  }\n\n  @Test\n  fun enabled() {\n    assertEquals(true, scaleBarView.enable)\n    scaleBarView.enable = false\n    assertEquals(false, scaleBarView.enable)\n    scaleBarView.enable = true\n    assertEquals(true, scaleBarView.enable)\n  }\n\n  @Test\n  fun distancePerPixel() {\n    assertEquals(0.0f, scaleBarView.distancePerPixel)\n    scaleBarView.distancePerPixel = 1.0f\n    assertEquals(1.0f, scaleBarView.distancePerPixel)\n  }\n\n  @Test\n  fun useContinuousRendering() {\n    assertEquals(false, scaleBarView.useContinuousRendering)\n    scaleBarView.useContinuousRendering = true\n    assertEquals(true, scaleBarView.useContinuousRendering)\n\n    scaleBarView.settings = ScaleBarSettings { useContinuousRendering = false }\n    assertEquals(false, scaleBarView.useContinuousRendering)\n  }\n\n  @Test\n  @LooperMode(LooperMode.Mode.PAUSED)\n  fun renderingOnDemandTest() {\n    scaleBarView.useContinuousRendering = false\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    scaleBarView.distancePerPixel = 1.0f\n    assertTrue(scaleBarView.refreshHandlerHasMessages(MSG_RENDER_ON_DEMAND))\n    assertFalse(scaleBarView.refreshHandlerHasMessages(MSG_RENDER_CONTINUOUS))\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n  }\n\n  @Test\n  @LooperMode(LooperMode.Mode.PAUSED)\n  fun renderingContinuousTest() {\n    scaleBarView.useContinuousRendering = true\n    Shadows.shadowOf(Looper.getMainLooper()).pause()\n    scaleBarView.distancePerPixel = 1.0f\n    assertFalse(scaleBarView.refreshHandlerHasMessages(MSG_RENDER_ON_DEMAND))\n    assertTrue(scaleBarView.refreshHandlerHasMessages(MSG_RENDER_CONTINUOUS))\n    Shadows.shadowOf(Looper.getMainLooper()).idle()\n  }\n}\n\n@RunWith(ParameterizedRobolectricTestRunner::class)\nclass ScaleBarImplGetDistanceTextTest(\n  private val units: DistanceUnits,\n  private val distance: Float,\n  private val expectedDistanceText: String\n) {\n  private lateinit var scaleBarView: ScaleBarImpl\n\n  @Before\n  fun setUp() {\n    val context = ApplicationProvider.getApplicationContext<Context>()\n    scaleBarView = ScaleBarImpl(context)\n    val layoutParams = mockk<FrameLayout.LayoutParams>(relaxed = true)\n    scaleBarView.layoutParams = layoutParams\n  }\n\n  private companion object {\n    @JvmStatic\n    @ParameterizedRobolectricTestRunner.Parameters(name = \"units: {0}, distance: {1}\")\n    fun data() = listOf(\n      arrayOf(DistanceUnits.METRIC, 0F, \"0\"),\n      arrayOf(DistanceUnits.METRIC, 0.1F, \"0.1 m\"),\n      arrayOf(DistanceUnits.METRIC, 0.5F, \"0.5 m\"),\n      arrayOf(DistanceUnits.METRIC, 100F, \"100 m\"),\n      arrayOf(DistanceUnits.METRIC, 999F, \"999 m\"),\n      arrayOf(DistanceUnits.METRIC, 1000F, \"1 km\"),\n      arrayOf(DistanceUnits.METRIC, 1001F, \"1 km\"),\n      arrayOf(DistanceUnits.METRIC, 4444F, \"4.4 km\"),\n      arrayOf(DistanceUnits.METRIC, 5555F, \"5.6 km\"),\n      arrayOf(DistanceUnits.METRIC, 10000F, \"10 km\"),\n      arrayOf(DistanceUnits.IMPERIAL, 0F, \"0\"),\n      arrayOf(DistanceUnits.IMPERIAL, 0.1F, \"0.1 ft\"),\n      arrayOf(DistanceUnits.IMPERIAL, 0.5F, \"0.5 ft\"),\n      arrayOf(DistanceUnits.IMPERIAL, 100F, \"100 ft\"),\n      arrayOf(DistanceUnits.IMPERIAL, 5279F, \"1 mi\"),\n      arrayOf(DistanceUnits.IMPERIAL, 5280F, \"1 mi\"),\n      arrayOf(DistanceUnits.IMPERIAL, 6000F, \"1.1 mi\"),\n      arrayOf(DistanceUnits.IMPERIAL, 10000F, \"1.9 mi\"),\n      arrayOf(DistanceUnits.IMPERIAL, 10560F, \"2 mi\"),\n      arrayOf(DistanceUnits.IMPERIAL, 52800F, \"10 mi\"),\n      arrayOf(DistanceUnits.NAUTICAL, 0F, \"0\"),\n      arrayOf(DistanceUnits.NAUTICAL, 0.6F, \"0.1 fth\"),\n      arrayOf(DistanceUnits.NAUTICAL, 3F, \"0.5 fth\"),\n      arrayOf(DistanceUnits.NAUTICAL, 600F, \"100 fth\"),\n      arrayOf(DistanceUnits.NAUTICAL, 6075F, \"1 nmi\"),\n      arrayOf(DistanceUnits.NAUTICAL, 6076.12F, \"1 nmi\"),\n      arrayOf(DistanceUnits.NAUTICAL, 6685F, \"1.1 nmi\"),\n      arrayOf(DistanceUnits.NAUTICAL, 11545F, \"1.9 nmi\"),\n      arrayOf(DistanceUnits.NAUTICAL, 12152.24F, \"2 nmi\"),\n      arrayOf(DistanceUnits.NAUTICAL, 60761.2F, \"10 nmi\"),\n      )\n  }\n\n  @Test\n  fun getDistanceText() {\n    val unit = when (units) {\n      DistanceUnits.METRIC -> METER_UNIT\n      DistanceUnits.IMPERIAL -> FEET_UNIT\n      DistanceUnits.NAUTICAL -> FATHOM_UNIT\n      else -> METER_UNIT\n    }\n    assertEquals(expectedDistanceText, scaleBarView.getDistanceText(distance, unit))\n  }\n}\n\n@RunWith(ParameterizedRobolectricTestRunner::class)\nclass ScaleBarImplScaleBarSegmentsTest(\n  private val units: DistanceUnits,\n  private val scaleTable: List<Pair<Int, Int>>,\n) {\n  private lateinit var scaleBarView: ScaleBarImpl\n\n  @Before\n  fun setUp() {\n    val context = ApplicationProvider.getApplicationContext<Context>()\n    scaleBarView = ScaleBarImpl(context)\n    val layoutParams = mockk<FrameLayout.LayoutParams>(relaxed = true)\n    scaleBarView.layoutParams = layoutParams\n  }\n\n  private companion object {\n    @JvmStatic\n    @ParameterizedRobolectricTestRunner.Parameters(name = \"units: {0}\")\n    fun data() = listOf(\n      arrayOf(DistanceUnits.METRIC, metricTable),\n      arrayOf(DistanceUnits.IMPERIAL, imperialTable),\n      arrayOf(DistanceUnits.NAUTICAL, nauticalTable),\n    )\n  }\n\n  @Test\n  fun `verify below and above scale bar segments`() {\n    scaleBarView.settings = scaleBarView.settings.toBuilder().setDistanceUnits(units).build()\n    scaleBarView.distancePerPixel = 0.01F\n    val unit = when (units) {\n      DistanceUnits.METRIC -> METER_UNIT\n      DistanceUnits.IMPERIAL -> FEET_UNIT\n      DistanceUnits.NAUTICAL -> FATHOM_UNIT\n      else -> METER_UNIT\n    }\n    // Special case where max distance is smaller than the first entry segment in the table\n    val belowFirstUnitBarDistance = (scaleTable[0].first.toFloat() / scaleTable[0].second) - 0.1F\n    val result =\n      scaleBarView.calculateSegmentsConfiguration(\n        belowFirstUnitBarDistance,\n        scaleBarView.distancePerPixel,\n        scaleBarView.scaleTable,\n        scaleBarView.textPaint,\n        scaleBarView.strokePaint.strokeWidth,\n        METER_UNIT,\n        Int.MAX_VALUE\n      )\n    assertEquals(belowFirstUnitBarDistance, result.unitDistance, 0.01F)\n    assertEquals(1, result.rectCount)\n\n    for (index in 1 until scaleTable.size) {\n      // We need to adapt the distancePerPixel to the scale entry we're targeting\n      if (index > 20) scaleBarView.distancePerPixel = 10.0F\n      val pair: Pair<Int, Int> = scaleTable[index]\n      val distance = pair.first.toFloat()\n      val rectCount = pair.second\n\n      val maxDistanceBelowCurrent = distance - if (distance < 100) 0.1F else 10F\n      val resultBelow = scaleBarView.calculateSegmentsConfiguration(\n        maxDistanceBelowCurrent,\n        scaleBarView.distancePerPixel,\n        scaleBarView.scaleTable,\n        scaleBarView.textPaint,\n        scaleBarView.strokePaint.strokeWidth,\n        unit,\n        Int.MAX_VALUE\n      )\n      val previousEntry = scaleTable[index - 1]\n      val expectedUnitDistance = previousEntry.first.toFloat() / previousEntry.second\n      assertEquals(expectedUnitDistance, resultBelow.unitDistance, 0.01F)\n      val expectedSegments = previousEntry.second\n      assertEquals(expectedSegments, resultBelow.rectCount)\n\n      val maxDistanceAboveCurrent = distance + if (distance < 100) 0.1F else 10F\n      val resultAbove = scaleBarView.calculateSegmentsConfiguration(\n        maxDistanceAboveCurrent,\n        scaleBarView.distancePerPixel,\n        scaleBarView.scaleTable,\n        scaleBarView.textPaint,\n        scaleBarView.strokePaint.strokeWidth,\n        unit,\n        Int.MAX_VALUE\n      )\n      assertEquals(\"Failed for entry $index\", distance / rectCount, resultAbove.unitDistance, 0.01F)\n      assertEquals(rectCount, resultAbove.rectCount)\n    }\n  }\n}"
  },
  {
    "path": "plugin-scalebar/src/test/java/com/mapbox/maps/plugin/scalebar/ScaleBarPluginTest.kt",
    "content": "package com.mapbox.maps.plugin.scalebar\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Color\nimport android.graphics.drawable.Drawable\nimport android.widget.FrameLayout\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.MapOptions\nimport com.mapbox.maps.Projection\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapListenerDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarAttributeParser\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.mockkObject\nimport io.mockk.mockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(shadows = [ShadowProjection::class])\nclass ScaleBarPluginTest {\n\n  private lateinit var scaleBarPlugin: ScaleBarPluginImpl\n  private val scaleBarView = mockk<ScaleBarImpl>(relaxUnitFun = true)\n  private val delegateProvider = mockk<MapDelegateProvider>(relaxUnitFun = true)\n  private val mapCameraDelegate = mockk<MapCameraManagerDelegate>(relaxed = true)\n  private val mapListenerManagerDelegate = mockk<MapListenerDelegate>(relaxed = true)\n  private val mapTransformDelegate = mockk<MapTransformDelegate>()\n  private val mapOptions = mockk<MapOptions>()\n  private val mapView = mockk<FrameLayout>()\n  private val context: Context = mockk(relaxed = true)\n  private val typedArray: TypedArray = mockk(relaxUnitFun = true)\n  private val drawable = mockk<Drawable>(relaxed = true)\n  private val cancelable = mockk<Cancelable>(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    mockkStatic(Projection::class)\n    every { Projection.getMetersPerPixelAtLatitude(any(), any()) } returns 2.0\n    every { mapTransformDelegate.getMapOptions() } returns mapOptions\n    every { mapOptions.pixelRatio } returns 1.0f\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraDelegate\n    every { delegateProvider.mapListenerDelegate } returns mapListenerManagerDelegate\n    every { delegateProvider.mapTransformDelegate } returns mapTransformDelegate\n    every { mapView.width } returns 1024\n    every { mapView.context } returns context\n    mockkObject(ScaleBarAttributeParser::class)\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getInt(any(), any()) } returns 100\n    every { typedArray.getColor(any(), any()) } returns Color.RED\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getDrawable(any()) } returns drawable\n    every { typedArray.hasValue(any()) } returns true\n    every { scaleBarView.pixelRatio } returns 1.5f\n    every { mapListenerManagerDelegate.subscribeCameraChangedCoalesced(any()) } returns cancelable\n\n    scaleBarPlugin = ScaleBarPluginImpl { scaleBarView }\n    scaleBarPlugin.onDelegateProvider(delegateProvider)\n    scaleBarPlugin.onPluginView(scaleBarView)\n    scaleBarPlugin.initialize()\n  }\n\n  @After\n  fun destroy() {\n    scaleBarPlugin.cleanup()\n  }\n\n  @Test\n  fun getEnabled() {\n    every { scaleBarView.enable } returns true\n    assertEquals(true, scaleBarPlugin.enabled)\n  }\n\n  @Test\n  fun setEnabled_true() {\n    scaleBarPlugin.enabled = true\n    assertEquals(true, scaleBarPlugin.getSettings().enabled)\n    verify(atLeast = 1) { mapListenerManagerDelegate.subscribeCameraChangedCoalesced(any()) }\n  }\n\n  @Test\n  fun setEnabled_false() {\n    scaleBarPlugin.enabled = false\n    assertEquals(false, scaleBarPlugin.getSettings().enabled)\n    verify { cancelable.cancel() }\n  }\n\n  @Test\n  fun get_settings() {\n    val settings = scaleBarPlugin.getSettings()\n    assertEquals(2F, settings.height)\n    assertEquals(Color.BLACK, settings.textColor)\n  }\n\n  @Test\n  fun set_distancePerPixel() {\n    scaleBarPlugin.distancePerPixel = 100F\n    verify { scaleBarPlugin.distancePerPixel = 100F }\n    verify { scaleBarView.distancePerPixel = 100F }\n  }\n\n  @Test\n  fun set_useContinuousRendering() {\n    scaleBarPlugin.useContinuousRendering = true\n    verify { scaleBarPlugin.useContinuousRendering = true }\n    verify { scaleBarView.useContinuousRendering = true }\n  }\n\n  @Test\n  fun updateSettings_disable() {\n    assertEquals(true, scaleBarPlugin.getSettings().enabled)\n    scaleBarPlugin.updateSettings { enabled = false }\n    verify { cancelable.cancel() }\n    verify { scaleBarView.enable = false }\n    assertEquals(false, scaleBarPlugin.getSettings().enabled)\n  }\n\n  @Test\n  fun updateSettings_enable() {\n    scaleBarPlugin.enabled = false\n    scaleBarPlugin.updateSettings { enabled = true }\n    verify(atLeast = 2) { mapListenerManagerDelegate.subscribeCameraChangedCoalesced(any()) }\n    verify { scaleBarView.enable = true }\n    assertEquals(true, scaleBarPlugin.getSettings().enabled)\n  }\n\n  @Test\n  fun updateSettings_enableUnchanged() {\n    assertEquals(true, scaleBarPlugin.getSettings().enabled)\n    scaleBarPlugin.updateSettings { marginLeft = 20f }\n    // listener remains active (only subscribed once during initialize)\n    verify(exactly = 1) { mapListenerManagerDelegate.subscribeCameraChangedCoalesced(any()) }\n    assertEquals(true, scaleBarPlugin.getSettings().enabled)\n  }\n}"
  },
  {
    "path": "plugin-scalebar/src/test/java/com/mapbox/maps/plugin/scalebar/ShadowProjection.java",
    "content": "package com.mapbox.maps.plugin.scalebar;\n\nimport com.mapbox.maps.Projection;\n\nimport org.robolectric.annotation.Implementation;\nimport org.robolectric.annotation.Implements;\n\n/**\n * To avoid calling native method of Projection, this shadow Projection\n * will be used for the Robolectric unit tests.\n */\n@Implements(Projection.class)\npublic class ShadowProjection {\n    @Implementation\n    public static double getMetersPerPixelAtLatitude(double latitude, double zoom) {\n        return 0.0;\n    }\n}\n"
  },
  {
    "path": "plugin-scalebar/src/test/java/com/mapbox/maps/plugin/scalebar/generated/ScaleBarAttributeParserTest.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.scalebar.generated\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport com.mapbox.maps.plugin.DistanceUnits\nimport com.mapbox.maps.plugin.scalebar.R\nimport io.mockk.Runs\nimport io.mockk.clearAllMocks\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\n\nclass ScaleBarAttributeParserTest {\n  private val context: Context = mockk(relaxed = true)\n\n  private val attrs: AttributeSet = mockk(relaxUnitFun = true)\n\n  private val typedArray: TypedArray = mockk(relaxUnitFun = true)\n\n  @Before\n  fun setUp() {\n    every { context.obtainStyledAttributes(any(), any(), 0, 0) } returns typedArray\n    every { typedArray.getString(any()) } returns \"pk.token\"\n    every { typedArray.getBoolean(any(), any()) } returns true\n    every { typedArray.getInt(any(), any()) } returns 0\n    every { typedArray.getColor(any(), any()) } returns Color.RED\n    every { typedArray.getDimension(any(), any()) } returns 10.0f\n    every { typedArray.getFloat(any(), any()) } returns 10.0f\n    every { typedArray.getResourceId(any(), -1) } returns 1\n    every { typedArray.hasValue(any()) } returns true\n    every { typedArray.recycle() } just Runs\n  }\n\n  @After\n  fun cleanUp() {\n    clearAllMocks()\n  }\n\n  @Test\n  fun testTypedArrayRecycle() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun testTypedArrayRecycleWithException() {\n    every { typedArray.getBoolean(any(), any()) }.throws(Exception(\"\"))\n    try {\n      val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    } catch (e: Exception) {\n      // do nothing\n    }\n    verify { typedArray.recycle() }\n  }\n\n  @Test\n  fun enabledTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.enabled)\n  }\n\n  @Test\n  fun enabledTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.enabled)\n  }\n\n  @Test\n  fun positionTest() {\n    every { typedArray.getInt(R.styleable.mapbox_MapView_mapbox_scaleBarGravity, any()) } returns 100\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(100, settings.position)\n  }\n\n  @Test\n  fun marginLeftTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginLeft)\n  }\n\n  @Test\n  fun marginTopTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginTop)\n  }\n\n  @Test\n  fun marginRightTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginRight)\n  }\n\n  @Test\n  fun marginBottomTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 4f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.marginBottom)\n  }\n  @Test\n  fun textColorTest() {\n    every { typedArray.getColor(any(), any()) } returns Color.BLACK\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(Color.BLACK, settings.textColor)\n  }\n  @Test\n  fun primaryColorTest() {\n    every { typedArray.getColor(any(), any()) } returns Color.BLACK\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(Color.BLACK, settings.primaryColor)\n  }\n  @Test\n  fun secondaryColorTest() {\n    every { typedArray.getColor(any(), any()) } returns Color.WHITE\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(Color.WHITE, settings.secondaryColor)\n  }\n\n  @Test\n  fun borderWidthTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 2f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.borderWidth)\n  }\n\n  @Test\n  fun heightTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 2f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.height)\n  }\n\n  @Test\n  fun textBarMarginTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 8f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.textBarMargin)\n  }\n\n  @Test\n  fun textBorderWidthTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 2f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.textBorderWidth)\n  }\n\n  @Test\n  fun textSizeTest() {\n    val pixelRatio = 1.2f\n    val inputValue = 8f\n    every { typedArray.getDimension(any(), pixelRatio * inputValue) } returns pixelRatio * inputValue\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, pixelRatio)\n    assertEquals(pixelRatio * inputValue, settings.textSize)\n  }\n\n  @Test\n  fun isMetricUnitsTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.isMetricUnits)\n  }\n\n  @Test\n  fun isMetricUnitsTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.isMetricUnits)\n  }\n\n  @Test\n  fun distanceUnitsTestMETRIC() {\n    every { typedArray.getInt(any(), any()) } returns DistanceUnits.METRIC.ordinal\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(DistanceUnits.METRIC, settings.distanceUnits)\n  }\n\n  @Test\n  fun distanceUnitsTestIMPERIAL() {\n    every { typedArray.getInt(any(), any()) } returns DistanceUnits.IMPERIAL.ordinal\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(DistanceUnits.IMPERIAL, settings.distanceUnits)\n  }\n\n  @Test\n  fun distanceUnitsTestNAUTICAL() {\n    every { typedArray.getInt(any(), any()) } returns DistanceUnits.NAUTICAL.ordinal\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(DistanceUnits.NAUTICAL, settings.distanceUnits)\n  }\n\n  @Test\n  fun refreshIntervalTest() {\n    every { typedArray.getInt(any(), any()) } returns 2\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(2L, settings.refreshInterval)\n  }\n\n  @Test\n  fun showTextBorderTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.showTextBorder)\n  }\n\n  @Test\n  fun showTextBorderTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.showTextBorder)\n  }\n  @Test\n  fun ratioTest() {\n    every { typedArray.getFloat(any(), any()) } returns 0.5f\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(0.5f, settings.ratio)\n  }\n\n  @Test\n  fun useContinuousRenderingTestTrue() {\n    every { typedArray.getBoolean(any(), any()) } returns true\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(true, settings.useContinuousRendering)\n  }\n\n  @Test\n  fun useContinuousRenderingTestFalse() {\n    every { typedArray.getBoolean(any(), any()) } returns false\n    val settings = ScaleBarAttributeParser.parseScaleBarSettings(context, attrs, 1.2f)\n    assertEquals(false, settings.useContinuousRendering)\n  }\n}\n\n// End of generated file."
  },
  {
    "path": "plugin-viewport/README.md",
    "content": "## Mapbox Maps Viewport Plugin for Android\n\n### Overview\n\nThe Mapbox Maps Viewport Plugin for Android is an public library for tracking objects on a map. Users has the flexibility to customise viewport states and transitions between viewport states.\n\nAt any given time, the viewport is either:\n  - idle (not updating the camera)\n  - in a state (camera is being managed by a ViewportState)\n  - transitioning (camera is being managed by a ViewportTransition)\n\nTwo ViewportState are provided by default that user can create instance from the ViewportPlugin:\n * `viewport.makeFollowPuckViewportState(options): FollowPuckViewportState`\nThis state allows to follow user's location, and syncs the viewport position with the location puck provided by the LocationComponent.\n * `viewport.makeOverviewViewportState(options): OverviewViewportState`\nThis state sets the viewport to cover user provided geometry with configurations.\n\nAnd users are free to add their own ViewportState and use it with the viewport plugin.\n\nTwo ViewportTransition are also provided by default that user can create instance from the ViewportPlugin:\n* `viewport.makeDefaultViewportTransition(options): DefaultViewportTransition`\nThe default viewport transition allows user to transition from one state to another state with the default optimised animations.\n* `viewport.makeImmediateViewportTransition(): ImmediateViewportTransition`\nThe immediate viewport transition allows user to transition from one state to another state immediately without animations.\n\nAnd users are free to add their own ViewportTransition and set to specifically to animate transition from the desired fromState and targetState.\n\nA full overview of classes and interfaces can be found in our [User location guide](https://docs.mapbox.com/android/maps/guides/user-location/#location-tracking) and [API documentation](https://docs.mapbox.com/android/maps/api-reference/).\n\n### Getting Started\n\nThis README is intended for developers who are interested in [contributing](https://github.com/mapbox/mapbox-maps-android/blob/master/CONTRIBUTING.md) to the Mapbox Maps Viewport Plugin for Android. Please visit [DEVELOPING.md](https://github.com/mapbox/mapbox-maps-android/blob/master/DEVELOPING.md) for general information and instructions on how to use the Mapbox Maps Plugin System. To add the viewport plugin to your project, you configure its dependency in your `build.gradle` files.\n\n```groovy\n// In the root build.gradle file\n// The Mapbox access token needs to a scope set to DOWNLOADS:READ\nallprojects {\n    repositories {\n        maven {\n            url 'https://api.mapbox.com/downloads/v2/releases/maven'\n            authentication {\n                basic(BasicAuthentication)\n            }\n            credentials {\n                username = \"mapbox\"\n                password = \"INSERT_MAPBOX_ACCESS_TOKEN_HERE\"\n            }\n        }\n    }\n}\n// In the app build.gradle file\ndependencies {\n  implementation 'com.mapbox.plugin:maps-viewport:11.22.0-rc.1'\n}\n```\n\n### Example\n\n```kotlin\n  val viewportPlugin = mapView.viewport\n  val followPuckViewportState: FollowPuckViewportState = viewportPlugin.makeFollowPuckViewportState(\n      FollowPuckViewportStateOptions.Builder()\n        .bearing(FollowPuckViewportStateBearing.Constant(0.0))\n        .animationDurationMs(500)\n        .padding(EdgeInsets(200.0 * resources.displayMetrics.density, 0.0, 0.0, 0.0))\n        .build()\n    )\n  val overviewViewportState: OverviewViewportState = viewportPlugin.makeOverviewViewportState(\n      OverviewViewportStateOptions.Builder()\n        .geometry(routePoints)\n        .padding(EdgeInsets(100.0, 100.0, 100.0, 100.0))\n        .build()\n    )\n  }\n  val immediateTransition = viewportPlugin.makeImmediateViewportTransition()\n  // transition from idle(the default state) to the created followPuckViewportState with default transition\n  viewportPlugin.transitionTo(followPuckViewportState) { isFinished ->\n    // the transition has been completed with flag to check the finished status\n  }\n  ...\n  // transition from followPuckViewportState to overviewViewportState with immediate transition\n  viewportPlugin.transitionTo(overviewViewportState, immediateTransition) { isFinished ->\n    // the transition has been completed with flag to check the finished status\n  }\n```\n\nMore concrete examples of the viewport plugin can be found in our [test application](https://github.com/mapbox/mapbox-maps-android/tree/master/app/src/main/java/com/mapbox/maps/testapp).\n\n#### Dependencies\n\nView [LICENSE.md](LICENSE.md) for all dependencies used by this plugin.\n"
  },
  {
    "path": "plugin-viewport/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps.plugin.viewport {\n\n  public final class ViewportUtils {\n    method public static com.mapbox.maps.plugin.viewport.ViewportPlugin getViewport(com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.viewport.transition {\n\n  public final class TransitionUtilsKt {\n  }\n\n}\n\n"
  },
  {
    "path": "plugin-viewport/api/plugin-viewport.api",
    "content": "public final class com/mapbox/maps/plugin/viewport/ViewportUtils {\n\tpublic static final synthetic fun createViewportPlugin ()Lcom/mapbox/maps/plugin/viewport/ViewportPlugin;\n\tpublic static final fun getViewport (Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;)Lcom/mapbox/maps/plugin/viewport/ViewportPlugin;\n}\n\n"
  },
  {
    "path": "plugin-viewport/build.gradle.kts",
    "content": "plugins {\n  id(\"com.mapbox.gradle.library\")\n}\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.plugin.viewport\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n  }\n}\n\nmapboxLibrary {\n  publish {\n    group = \"com.mapbox.plugin\"\n    artifactId = \"maps-viewport\"\n    artifactTitle = \"The viewport module for the Mapbox Maps SDK\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-viewport\"\n  }\n}\n\ndependencies {\n  implementation(project(\":sdk-base\"))\n  implementation(project(\":plugin-animation\"))\n  implementation(project(\":plugin-locationcomponent\"))\n  implementation(libs.bundles.base.dependencies)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n  androidTestImplementation(libs.bundles.base.dependenciesAndroidTests)\n}\n\ntasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { kotlinOptions.jvmTarget = \"1.8\" }\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "plugin-viewport/src/main/kotlin/com/mapbox/maps/plugin/viewport/ViewportExt.kt",
    "content": "@file:JvmName(\"ViewportUtils\")\n\npackage com.mapbox.maps.plugin.viewport\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\n\n/**\n * Extension val for MapView to get the [ViewportPlugin] instance.\n *\n * [ViewportPlugin] is a high-level and extensible API for driving the map camera. It\n * provides built-in states for following the location puck and showing an overview of\n * a GeoJSON geometry. Transitions between states can be animated with a built-in\n * default transition and via custom transitions.\n */\nval MapPluginProviderDelegate.viewport: ViewportPlugin\n  @JvmName(\"getViewport\")\n  get() = this.getPlugin(Plugin.MAPBOX_VIEWPORT_PLUGIN_ID)!!\n\n/**\n * Static method to create instance of Mapbox viewport plugin.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n@JvmSynthetic\nfun createViewportPlugin(): ViewportPlugin {\n  return ViewportPluginImpl()\n}"
  },
  {
    "path": "plugin-viewport/src/main/kotlin/com/mapbox/maps/plugin/viewport/ViewportPluginImpl.kt",
    "content": "package com.mapbox.maps.plugin.viewport\n\nimport android.animation.ValueAnimator\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.plugin.animation.CameraAnimationsLifecycleListener\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\nimport com.mapbox.maps.plugin.animation.MapAnimationOwnerRegistry\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.ViewportOptions\nimport com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportStateImpl\nimport com.mapbox.maps.plugin.viewport.state.OverviewViewportState\nimport com.mapbox.maps.plugin.viewport.state.OverviewViewportStateImpl\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.plugin.viewport.transition.DefaultViewportTransition\nimport com.mapbox.maps.plugin.viewport.transition.DefaultViewportTransitionImpl\nimport com.mapbox.maps.plugin.viewport.transition.ImmediateViewportTransition\nimport com.mapbox.maps.plugin.viewport.transition.ViewportTransition\nimport com.mapbox.maps.plugin.viewport.util.ViewportTelemetryEvents\nimport java.util.concurrent.CopyOnWriteArraySet\n\n/**\n * Mapbox default implementation for [ViewportPlugin].\n *\n * The Viewport plugin allows to track objects on a map.\n *\n * It provides a structured approach to organizing camera management logic into states and transitions between them.\n *\n * at any given time, the viewport is either:\n *  - idle (not updating the camera)\n *  - in a state (camera is being managed by a ViewportState)\n *  - transitioning (camera is being managed by a ViewportTransition)\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class ViewportPluginImpl(private val handler: Handler = Handler(Looper.getMainLooper())) :\n  ViewportPlugin {\n  private val registeredStatusObservers = CopyOnWriteArraySet<ViewportStatusObserver>()\n  private var currentCancelable: Cancelable? = null\n  private lateinit var delegateProvider: MapDelegateProvider\n  private lateinit var cameraPlugin: CameraAnimationsPlugin\n\n  private val cameraAnimationsLifecycleListener = object : CameraAnimationsLifecycleListener {\n    override fun onAnimatorStarting(\n      type: CameraAnimatorType,\n      animator: ValueAnimator,\n      owner: String?\n    ) {\n      when (owner) {\n        VIEWPORT_CAMERA_OWNER -> Unit\n        MapAnimationOwnerRegistry.GESTURES -> {\n          if (options.transitionsToIdleUponUserInteraction) {\n            currentCancelable?.cancel()\n            currentCancelable = null\n            updateStatus(\n              ViewportStatus.Idle,\n              ViewportStatusChangeReason.USER_INTERACTION\n            )\n          }\n        }\n      }\n    }\n\n    override fun onAnimatorInterrupting(\n      type: CameraAnimatorType,\n      runningAnimator: ValueAnimator,\n      runningAnimatorOwner: String?,\n      newAnimator: ValueAnimator,\n      newAnimatorOwner: String?\n    ) {\n      // no-ops\n    }\n\n    override fun onAnimatorEnding(\n      type: CameraAnimatorType,\n      animator: ValueAnimator,\n      owner: String?\n    ) {\n      // no-ops\n    }\n\n    override fun onAnimatorCancelling(\n      type: CameraAnimatorType,\n      animator: ValueAnimator,\n      owner: String?\n    ) {\n      // no-ops\n    }\n  }\n\n  /**\n   * Returns current [ViewportStatus].\n   *\n   * @see addStatusObserver\n   */\n  override var status: ViewportStatus = ViewportStatus.Idle\n    private set\n\n  private fun updateStatus(targetStatus: ViewportStatus, reason: ViewportStatusChangeReason) {\n    if (targetStatus != status) {\n      val previousStatus = status\n      status = targetStatus\n      notifyStatusChanged(previousStatus, targetStatus, reason)\n    }\n  }\n\n  /**\n   * Executes a transition to requested state.\n   *\n   * When started, goes to [ViewportTransition]\n   * and to the final [ViewportState] when ended.\n   *\n   * If transition is canceled, state goes to IDLE.\n   *\n   * @param targetState The target [ViewportState] to transition to.\n   * @param transition The [ViewportTransition] that's used to transition to target state, if not specified, the [ViewportPlugin.defaultTransition] will be used.\n   * @param completionListener The listener to observe the completion state.\n   */\n  override fun transitionTo(targetState: ViewportState, transition: ViewportTransition?, completionListener: CompletionListener?) {\n    ViewportTelemetryEvents.stateTransition.increment()\n    with(status) {\n      when (this) {\n        is ViewportStatus.State -> {\n          if (this.state === targetState) {\n            completionListener?.onComplete(true)\n            return\n          }\n        }\n        is ViewportStatus.Transition -> {\n          if (this.toState === targetState) {\n            completionListener?.onComplete(false)\n            return\n          }\n        }\n        is ViewportStatus.Idle -> Unit\n      }\n    }\n    currentCancelable?.cancel()\n    currentCancelable = null\n\n    // get the transition (or default) for the from and to state\n    val viewportTransition = transition ?: defaultTransition\n\n    // run the transition\n    var completionBlockInvoked = false\n    val transitionCancelable = viewportTransition.run(targetState) { isFinished ->\n      completionBlockInvoked = true\n      if (isFinished) {\n        // transfer camera updating responsibility to targetState\n        targetState.startUpdatingCamera()\n        currentCancelable = Cancelable { targetState.stopUpdatingCamera() }\n        updateStatus(\n          ViewportStatus.State(targetState),\n          ViewportStatusChangeReason.TRANSITION_SUCCEEDED\n        )\n      } else {\n        currentCancelable = null\n        updateStatus(ViewportStatus.Idle, ViewportStatusChangeReason.TRANSITION_FAILED)\n      }\n      completionListener?.onComplete(isFinished)\n    }\n    // since it's possible that a transition might invoke its\n    // completion block synchronously, we'll only store the\n    // transition cancelable if the transition is not complete\n    // so that we don't clobber the targetState cancelable.\n    if (!completionBlockInvoked) {\n      currentCancelable = transitionCancelable\n      updateStatus(\n        ViewportStatus.Transition(viewportTransition, targetState),\n        ViewportStatusChangeReason.TRANSITION_STARTED\n      )\n    }\n  }\n\n  /**\n   * Immediately goes to [ViewportStatus.Idle] state canceling all ongoing transitions.\n   */\n  override fun idle() {\n    if (status == ViewportStatus.Idle) return\n    currentCancelable?.cancel()\n    currentCancelable = null\n    updateStatus(ViewportStatus.Idle, ViewportStatusChangeReason.IDLE_REQUESTED)\n  }\n\n  /**\n   * Options that impact the [ViewportPlugin].\n   */\n  override var options: ViewportOptions = ViewportOptions.Builder().build()\n\n  private fun notifyStatusChanged(\n    previousStatus: ViewportStatus,\n    currentStatus: ViewportStatus,\n    reason: ViewportStatusChangeReason\n  ) {\n    registeredStatusObservers.forEach {\n      handler.post {\n        it.onViewportStatusChanged(\n          previousStatus,\n          currentStatus,\n          reason\n        )\n      }\n    }\n  }\n\n  /**\n   * DefaultViewportTransition with default options\n   *\n   * This transition is used unless overridden by one of the registered transitions.\n   */\n  override lateinit var defaultTransition: ViewportTransition\n\n  /**\n   * Adds [ViewportStatusObserver] to observe the status change.\n   */\n  override fun addStatusObserver(viewportStatusObserver: ViewportStatusObserver) {\n    registeredStatusObservers.add(viewportStatusObserver)\n  }\n\n  /**\n   * Removes [ViewportStatusObserver].\n   */\n  override fun removeStatusObserver(viewportStatusObserver: ViewportStatusObserver) {\n    registeredStatusObservers.remove(viewportStatusObserver)\n  }\n\n  // Convenient methods to create the in-stock [ViewportState] and [ViewportTransition].\n\n  /**\n   * Create a [FollowPuckViewportState] instance with provided [FollowPuckViewportStateOptions].\n   *\n   * @param options The desired [FollowPuckViewportStateOptions]\n   */\n  override fun makeFollowPuckViewportState(options: FollowPuckViewportStateOptions): FollowPuckViewportState {\n    ViewportTelemetryEvents.stateFollowPuck.increment()\n    return FollowPuckViewportStateImpl(delegateProvider, options)\n  }\n\n  /**\n   * Create an [OverviewViewportState] instance with provided [OverviewViewportStateOptions].\n   *\n   * @param options The desired [OverviewViewportStateOptions]\n   */\n  override fun makeOverviewViewportState(options: OverviewViewportStateOptions): OverviewViewportState {\n    ViewportTelemetryEvents.stateOverview.increment()\n    return OverviewViewportStateImpl(delegateProvider, options)\n  }\n\n  /**\n   * Create a default [ViewportTransition] instance with provided [DefaultViewportTransitionOptions].\n   *\n   * @param options The desired [DefaultViewportTransitionOptions]\n   */\n  override fun makeDefaultViewportTransition(options: DefaultViewportTransitionOptions): DefaultViewportTransition {\n    return DefaultViewportTransitionImpl(delegateProvider, options)\n  }\n\n  /**\n   * Create a [ViewportTransition] instance that transition to the target [ViewportState] immediately.\n   */\n  override fun makeImmediateViewportTransition(): ViewportTransition {\n    return ImmediateViewportTransition(delegateProvider)\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  override fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    this.delegateProvider = delegateProvider\n    this.cameraPlugin = delegateProvider.mapPluginProviderDelegate.camera\n    cameraPlugin.addCameraAnimationsLifecycleListener(cameraAnimationsLifecycleListener)\n    this.defaultTransition = DefaultViewportTransitionImpl(\n      delegateProvider,\n      DefaultViewportTransitionOptions.Builder().build()\n    )\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   */\n  override fun cleanup() {\n    cameraPlugin.removeCameraAnimationsLifecycleListener(cameraAnimationsLifecycleListener)\n  }\n\n  internal companion object {\n    /**\n     * Constant used to recognize the owner of transitions initiated by the [ViewportPluginImpl].\n     *\n     * @see CameraAnimator.owner\n     */\n    const val VIEWPORT_CAMERA_OWNER = \"VIEWPORT_CAMERA_OWNER\"\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/main/kotlin/com/mapbox/maps/plugin/viewport/state/FollowPuckViewportStateImpl.kt",
    "content": "package com.mapbox.maps.plugin.viewport.state\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.logW\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentPlugin\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.transition.MapboxViewportTransitionFactory\nimport com.mapbox.maps.threading.AnimationThreadController\nimport java.util.concurrent.*\n\n/**\n * The actual implementation of [FollowPuckViewportState] that follows the location component's puck position.\n *\n * Note: [LocationComponentPlugin] should be enabled to use this viewport state.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class FollowPuckViewportStateImpl(\n  mapDelegateProvider: MapDelegateProvider,\n  initialOptions: FollowPuckViewportStateOptions,\n  private val transitionFactory: MapboxViewportTransitionFactory = MapboxViewportTransitionFactory(\n    mapDelegateProvider\n  )\n) : FollowPuckViewportState {\n  private val cleanUpAnimatorListener: Animator.AnimatorListener =\n    object : Animator.AnimatorListener {\n      override fun onAnimationStart(animation: Animator) {}\n\n      override fun onAnimationEnd(animation: Animator) {\n        unregisterRunningAnimationAnimators()\n      }\n\n      override fun onAnimationCancel(animation: Animator) {}\n\n      override fun onAnimationRepeat(animation: Animator) {}\n    }\n\n  private val cameraPlugin = mapDelegateProvider.mapPluginProviderDelegate.camera\n  private val locationComponent = mapDelegateProvider.mapPluginProviderDelegate.location\n  private val dataSourceUpdateObservers = CopyOnWriteArraySet<ViewportStateDataObserver>()\n\n  private var lastLocation: Point? = null\n  private var lastBearing: Double? = null\n\n  private var runningAnimation: AnimatorSet? = null\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var isFollowingStateRunning = false\n  private var isObservingLocationUpdates = false\n\n  private val indicatorPositionChangedListener = OnIndicatorPositionChangedListener { point ->\n    lastLocation = point\n    notifyLatestViewportData()\n  }\n\n  private val indicatorBearingChangedListener = OnIndicatorBearingChangedListener { bearing ->\n    if (options.bearing == FollowPuckViewportStateBearing.SyncWithLocationPuck) {\n      lastBearing = bearing\n      notifyLatestViewportData()\n    }\n  }\n\n  private fun notifyLatestViewportData() {\n    if (shouldNotifyLatestViewportData()) {\n      val viewportData = evaluateViewportData()\n      if (isFollowingStateRunning) {\n        updateFrame(viewportData)\n      }\n      dataSourceUpdateObservers.forEach {\n        notifyViewportStateDataObserver(it, viewportData)\n      }\n    }\n  }\n\n  private fun shouldNotifyLatestViewportData() = lastLocation != null\n\n  private fun notifyViewportStateDataObserver(\n    observer: ViewportStateDataObserver,\n    cameraOptions: CameraOptions\n  ) {\n    if (!observer.onNewData(cameraOptions)) {\n      dataSourceUpdateObservers.remove(observer)\n    }\n  }\n\n  private fun evaluateViewportData(): CameraOptions = with(CameraOptions.Builder()) {\n    center(lastLocation)\n    when (val bearingOptions = options.bearing) {\n      is FollowPuckViewportStateBearing.Constant -> bearing(bearingOptions.bearing)\n      FollowPuckViewportStateBearing.SyncWithLocationPuck -> lastBearing?.let { bearing(it) }\n      else -> {} // don't touch camera bearing\n    }\n    zoom(options.zoom)\n    pitch(options.pitch)\n    padding(options.padding)\n  }.build()\n\n  private fun addIndicatorListenerIfNeeded() {\n    if (!isObservingLocationUpdates) {\n      locationComponent.addOnIndicatorPositionChangedListener(indicatorPositionChangedListener)\n      locationComponent.addOnIndicatorBearingChangedListener(indicatorBearingChangedListener)\n      isObservingLocationUpdates = true\n    }\n  }\n\n  private fun removeIndicatorListenerIfNeeded() {\n    if (isObservingLocationUpdates && dataSourceUpdateObservers.isEmpty() && !isFollowingStateRunning) {\n      locationComponent.removeOnIndicatorPositionChangedListener(indicatorPositionChangedListener)\n      locationComponent.removeOnIndicatorBearingChangedListener(indicatorBearingChangedListener)\n      isObservingLocationUpdates = false\n      // when unsubscribed from the location updates, we don't want to keep an outdated location, so\n      // when user transition to the FollowPuckViewportState, there wouldn't be any unintentional jump.\n      lastBearing = null\n      lastLocation = null\n    }\n  }\n\n  /**\n   * Describes the configuration options of the state.\n   */\n  override var options: FollowPuckViewportStateOptions = initialOptions\n    set(value) {\n      field = value\n      notifyLatestViewportData()\n    }\n\n  /**\n   * Observer the new camera options produced by the [ViewportState], it can be used to get the\n   * latest state [CameraOptions] for [com.mapbox.maps.plugin.viewport.transition.ViewportTransition].\n   *\n   * @param viewportStateDataObserver observer that observe new viewport data.\n   * @return a handle that cancels current observation.\n   */\n  override fun observeDataSource(viewportStateDataObserver: ViewportStateDataObserver): Cancelable {\n    checkLocationComponentEnablement()\n    addIndicatorListenerIfNeeded()\n    dataSourceUpdateObservers.add(viewportStateDataObserver)\n    if (shouldNotifyLatestViewportData()) {\n      notifyViewportStateDataObserver(viewportStateDataObserver, evaluateViewportData())\n    }\n    return Cancelable {\n      dataSourceUpdateObservers.remove(viewportStateDataObserver)\n      removeIndicatorListenerIfNeeded()\n    }\n  }\n\n  private fun checkLocationComponentEnablement() {\n    if (!locationComponent.enabled) {\n      logW(\n        TAG,\n        \"Location component is required to be enabled to use FollowPuckViewportState, otherwise there would be no FollowPuckViewportState updates or ViewportTransition updates towards the FollowPuckViewportState.\"\n      )\n    }\n  }\n\n  /**\n   * Start updating the camera for the current [ViewportState].\n   */\n  override fun startUpdatingCamera() {\n    checkLocationComponentEnablement()\n    addIndicatorListenerIfNeeded()\n    isFollowingStateRunning = true\n  }\n\n  /**\n   * Stop updating the camera for the current [ViewportState].\n   */\n  override fun stopUpdatingCamera() {\n    isFollowingStateRunning = false\n    cancelAnimation()\n    removeIndicatorListenerIfNeeded()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun cancelAnimation() {\n    AnimationThreadController.postOnAnimatorThread {\n      runningAnimation?.apply {\n        // cancel will take care of calling unregisterRunningAnimationAnimators through\n        // the cleanUpAnimatorListener\n        cancel()\n      }\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun startAnimation(animatorSet: AnimatorSet) {\n    cancelAnimation()\n    animatorSet.childAnimations.forEach {\n      cameraPlugin.registerAnimators(it as ValueAnimator)\n    }\n    animatorSet.duration = 0\n    AnimationThreadController.postOnAnimatorThread {\n      animatorSet.start()\n      runningAnimation = animatorSet\n    }\n  }\n\n  private fun unregisterRunningAnimationAnimators() {\n    runningAnimation?.childAnimations?.forEach {\n      cameraPlugin.unregisterAnimators(it as ValueAnimator)\n    }\n    runningAnimation = null\n  }\n\n  private fun updateFrame(cameraOptions: CameraOptions) {\n    startAnimation(\n      // Duration is set to 0 because we want instant animation\n      transitionFactory.transitionLinear(cameraOptions, 0)\n        .apply { addListener(cleanUpAnimatorListener) }\n    )\n  }\n\n  private companion object {\n    const val TAG = \"FollowPuckViewportStateImpl\"\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/main/kotlin/com/mapbox/maps/plugin/viewport/state/OverviewViewportStateImpl.kt",
    "content": "package com.mapbox.maps.plugin.viewport.state\n\nimport android.animation.AnimatorSet\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.VisibleForTesting\nimport androidx.core.animation.doOnEnd\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.GeometryCollection\nimport com.mapbox.geojson.LineString\nimport com.mapbox.geojson.MultiLineString\nimport com.mapbox.geojson.MultiPoint\nimport com.mapbox.geojson.MultiPolygon\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.transition.MapboxViewportTransitionFactory\nimport com.mapbox.maps.threading.AnimationThreadController\nimport java.util.concurrent.CopyOnWriteArraySet\n\n/**\n * The actual implementation of [OverviewViewportState] that shows the overview of a given geometry.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class OverviewViewportStateImpl(\n  mapDelegateProvider: MapDelegateProvider,\n  initialOptions: OverviewViewportStateOptions,\n  private val transitionFactory: MapboxViewportTransitionFactory = MapboxViewportTransitionFactory(\n    mapDelegateProvider\n  )\n) : OverviewViewportState {\n  private val cameraPlugin = mapDelegateProvider.mapPluginProviderDelegate.camera\n  private val cameraDelegate = mapDelegateProvider.mapCameraManagerDelegate\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal val dataSourceUpdateObservers = CopyOnWriteArraySet<ViewportStateDataObserver>()\n  private var runningAnimation: AnimatorSet? = null\n\n  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n  internal var isOverviewStateRunning = false\n\n  private var evaluateViewportDataCancelable: Cancelable? = null\n\n  private var latestViewportData: CameraOptions? = null\n\n  /**\n   * Describes the configuration options of the state.\n   */\n  override var options: OverviewViewportStateOptions = initialOptions\n    set(value) {\n      field = value\n      handleNewData()\n    }\n\n  init {\n    handleNewData()\n  }\n\n  private fun handleNewData() {\n    latestViewportData = null\n    evaluateViewportDataCancelable?.cancel()\n    evaluateViewportDataCancelable = evaluateViewportData { cameraOptions ->\n      latestViewportData = cameraOptions\n      if (isOverviewStateRunning) {\n        updateFrame(cameraOptions, false)\n      }\n      dataSourceUpdateObservers.forEach {\n        if (!it.onNewData(cameraOptions)) {\n          dataSourceUpdateObservers.remove(it)\n        }\n      }\n    }\n  }\n\n  private fun evaluateViewportData(callback: (CameraOptions) -> Unit): Cancelable {\n    var cancelled = false\n    cameraDelegate.cameraForCoordinates(\n      coordinates = options.geometry.extractCoordinates(),\n      camera = cameraOptions {\n        padding(options.padding)\n        bearing(options.bearing)\n        pitch(options.pitch)\n      },\n      coordinatesPadding = options.geometryPadding,\n      maxZoom = options.maxZoom,\n      offset = options.offset\n    ) {\n      if (!cancelled) {\n        callback.invoke(it)\n      }\n    }\n    return Cancelable {\n      cancelled = true\n    }\n  }\n\n  /**\n   * Observer the new camera options produced by the [ViewportState], it can be used to get the\n   * latest state [CameraOptions] for [com.mapbox.maps.plugin.viewport.transition.ViewportTransition].\n   *\n   * @param viewportStateDataObserver observer that observe new viewport data.\n   * @return a handle that cancels current observation.\n   */\n  override fun observeDataSource(viewportStateDataObserver: ViewportStateDataObserver): Cancelable {\n    latestViewportData?.let {\n      if (viewportStateDataObserver.onNewData(it)) {\n        dataSourceUpdateObservers.add(viewportStateDataObserver)\n      }\n    } ?: dataSourceUpdateObservers.add(viewportStateDataObserver)\n\n    return Cancelable {\n      dataSourceUpdateObservers.remove(viewportStateDataObserver)\n    }\n  }\n\n  /**\n   * Start updating the camera for the current [ViewportState].\n   */\n  override fun startUpdatingCamera() {\n    isOverviewStateRunning = true\n  }\n\n  /**\n   * Stop updating the camera for the current [ViewportState].\n   */\n  override fun stopUpdatingCamera() {\n    isOverviewStateRunning = false\n    cancelAnimation()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun cancelAnimation() {\n    runningAnimation?.apply {\n      AnimationThreadController.postOnAnimatorThread {\n        cancel()\n        childAnimations.forEach {\n          cameraPlugin.unregisterAnimators(it as ValueAnimator)\n        }\n      }\n      runningAnimation = null\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun startAnimation(\n    animatorSet: AnimatorSet,\n    instant: Boolean,\n  ) {\n    cancelAnimation()\n    animatorSet.childAnimations.forEach {\n      cameraPlugin.registerAnimators(it as ValueAnimator)\n    }\n    if (instant) {\n      animatorSet.duration = 0\n    }\n    AnimationThreadController.postOnAnimatorThread {\n      animatorSet.start()\n      runningAnimation = animatorSet\n    }\n  }\n\n  private fun finishAnimation(animatorSet: AnimatorSet?) {\n    animatorSet?.childAnimations?.forEach {\n      cameraPlugin.unregisterAnimators(it as ValueAnimator)\n    }\n    if (runningAnimation == animatorSet) {\n      runningAnimation = null\n    }\n  }\n\n  private fun updateFrame(cameraOptions: CameraOptions, instant: Boolean = false) {\n    startAnimation(\n      transitionFactory.transitionLinear(cameraOptions, options.animationDurationMs)\n        .apply { doOnEnd { finishAnimation(this) } },\n      instant\n    )\n  }\n\n  /**\n   * Extract the flattened coordinates from the [Geometry].\n   */\n  private fun Geometry.extractCoordinates(): List<Point> {\n    return when (this) {\n      is Point -> listOf(this)\n      is LineString -> this.coordinates()\n      is Polygon -> this.coordinates().flatten()\n      is MultiPoint -> this.coordinates()\n      is MultiLineString -> this.coordinates().flatten()\n      is MultiPolygon -> this.coordinates().flatten().flatten()\n      is GeometryCollection -> this.geometries().flatMap { it.extractCoordinates() }\n      else -> emptyList()\n    }\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/main/kotlin/com/mapbox/maps/plugin/viewport/transition/DefaultViewportTransitionImpl.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport android.animation.ValueAnimator\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\nimport com.mapbox.maps.plugin.animation.animator.CameraAnimator\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.viewport.CompletionListener\nimport com.mapbox.maps.plugin.viewport.DEFAULT_STATE_ANIMATION_DURATION_MS\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.state.OverviewViewportState\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.threading.AnimationThreadController\nimport com.mapbox.maps.util.MathUtils\n\n/**\n * The implementation of [DefaultViewportTransition] that transitions Viewport from one [ViewportState] to another.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class DefaultViewportTransitionImpl(\n  delegateProvider: MapDelegateProvider,\n  /**\n   * Describes the configuration options for the [DefaultViewportTransition].\n   */\n  override var options: DefaultViewportTransitionOptions,\n  private val transitionFactory: MapboxViewportTransitionFactory = MapboxViewportTransitionFactory(\n    delegateProvider\n  )\n) : DefaultViewportTransition {\n  private val cameraPlugin = delegateProvider.mapPluginProviderDelegate.camera\n  private val cameraDelegate = delegateProvider.mapCameraManagerDelegate\n  private var runningAnimation: AnimatorSet? = null\n  private var cachedAnchor: ScreenCoordinate? = null\n\n  /**\n   * Run the [ViewportTransition] from previous [ViewportState] to the target [ViewportState].\n   *\n   * The completion block contains a Bool that is true if the transition is cancelled and false\n   * if it ran to completion. Implementations must be sure to invoke the completion block with false if\n   * the returned Cancelable is invoked prior to completion. the completion block must be invoked\n   * on the main queue. Transitions must handle the possibility that the \"to\" state might fail to\n   * provide a target camera in a timely manner or might update the target camera multiple times\n   * during the transition (a \"moving target\").\n   *\n   * @param to The target [ViewportState]\n   * @param completionListener The listener to observe the completion state.\n   * @return a handle that can be used to cancel the current [ViewportTransition]\n   */\n  override fun run(\n    to: ViewportState,\n    completionListener: CompletionListener\n  ): Cancelable {\n    var isCancelableCalled = false\n    var animatorSet: AnimatorSet? = null\n    val startCamera = cameraDelegate.cameraState\n    val completedChildAnimators = mutableSetOf<CameraAnimatorType>()\n    var keepObserving = true\n    val cancelable = to.observeDataSource { cameraOptions ->\n      animatorSet?.updateTargetCameraOptions(\n        completedChildAnimators,\n        startCamera,\n        cameraOptions\n      ) ?: kotlin.run {\n        val initialAnimatorSet = createAnimatorSet(to, cameraOptions, options.maxDurationMs)\n          .apply {\n            addListener(\n              object : Animator.AnimatorListener {\n                private var isCanceled = false\n                override fun onAnimationStart(animation: Animator) {\n                  // no-ops\n                }\n\n                override fun onAnimationEnd(animation: Animator) {\n                  keepObserving = false\n                  if (!isCancelableCalled) {\n                    completionListener.onComplete(!isCanceled)\n                  }\n                  finishAnimation(this@apply)\n                }\n\n                override fun onAnimationCancel(animation: Animator) {\n                  isCanceled = true\n                }\n\n                override fun onAnimationRepeat(animation: Animator) {\n                  // no-ops\n                }\n              }\n            )\n          }\n        initialAnimatorSet.childAnimations.forEach {\n          val cameraAnimator = it as CameraAnimator<*>\n          cameraAnimator.addListener(\n            object : Animator.AnimatorListener {\n              private var isCanceled = false\n              override fun onAnimationStart(p0: Animator) {\n                // no-ops\n              }\n\n              override fun onAnimationEnd(p0: Animator) {\n                if (!isCanceled) {\n                  completedChildAnimators.add(cameraAnimator.type)\n                }\n              }\n\n              override fun onAnimationCancel(p0: Animator) {\n                isCanceled = true\n              }\n\n              override fun onAnimationRepeat(p0: Animator) {\n                // no-ops\n              }\n            }\n          )\n        }\n        startAnimation(initialAnimatorSet, instant = false)\n        animatorSet = initialAnimatorSet\n      }\n      keepObserving\n    }\n    return Cancelable {\n      isCancelableCalled = true\n      keepObserving = false\n      cancelAnimation()\n      cancelable.cancel()\n    }\n  }\n\n  private fun createAnimatorSet(\n    targetState: ViewportState,\n    cameraOptions: CameraOptions,\n    maxDurationMs: Long\n  ): AnimatorSet {\n    // If transitioning to OverviewViewportState and user has explicitly customized animationDurationMs,\n    // animate using that value. Otherwise, use default animation logic.\n    if (targetState is OverviewViewportState) {\n      val overviewDuration = targetState.options.animationDurationMs\n\n      // Only use linear animation if user explicitly set a different duration from default.\n      // If user did not customize duration, then we will fallback to default animation logic\n      if (overviewDuration != DEFAULT_STATE_ANIMATION_DURATION_MS) {\n        // Use the state's animation duration, but still respect maxDurationMs as an upper bound\n        val effectiveDuration = minOf(overviewDuration, maxDurationMs)\n        return transitionFactory.transitionLinear(cameraOptions, effectiveDuration)\n      }\n    }\n\n    val currentZoom = cameraDelegate.cameraState.zoom\n    return with(transitionFactory) {\n      if (currentZoom < (cameraOptions.zoom ?: currentZoom)) {\n        transitionFromLowZoomToHighZoom(cameraOptions, maxDurationMs)\n      } else {\n        transitionFromHighZoomToLowZoom(cameraOptions, maxDurationMs)\n      }\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun cancelAnimation() {\n    runningAnimation?.apply {\n      AnimationThreadController.postOnAnimatorThread {\n        cancel()\n        childAnimations.forEach {\n          cameraPlugin.unregisterAnimators(it as ValueAnimator)\n        }\n      }\n      runningAnimation = null\n    }\n  }\n\n  @OptIn(MapboxExperimental::class)\n  private fun startAnimation(\n    animatorSet: AnimatorSet,\n    instant: Boolean,\n  ) {\n    cancelAnimation()\n    // cache the camera plugin's last anchor point, and reset it once transition is ended\n    cachedAnchor = cameraPlugin.anchor\n    // For the viewport transition, the anchor should be set to null to avoid unexpected center shift\n    // caused by the zoom/bearing animators.\n    cameraPlugin.anchor = null\n    animatorSet.childAnimations.forEach {\n      cameraPlugin.registerAnimators(it as ValueAnimator)\n    }\n    if (instant) {\n      animatorSet.duration = 0\n    }\n    AnimationThreadController.postOnAnimatorThread {\n      animatorSet.start()\n      runningAnimation = animatorSet\n    }\n  }\n\n  private fun finishAnimation(animatorSet: AnimatorSet?) {\n    animatorSet?.childAnimations?.forEach {\n      cameraPlugin.unregisterAnimators(it as ValueAnimator)\n    }\n    if (runningAnimation == animatorSet) {\n      runningAnimation = null\n    }\n    cameraPlugin.anchor = cachedAnchor\n  }\n\n  private fun AnimatorSet.updateTargetCameraOptions(\n    completedChildAnimators: Set<CameraAnimatorType>,\n    startCamera: CameraState,\n    targetCamera: CameraOptions\n  ) {\n    childAnimations.forEach {\n      val cameraAnimator = it as CameraAnimator<*>\n      when (cameraAnimator.type) {\n        CameraAnimatorType.ANCHOR -> return@forEach\n        CameraAnimatorType.BEARING ->\n          if (completedChildAnimators.contains(CameraAnimatorType.BEARING)) {\n            cameraDelegate.setCamera(cameraOptions { bearing(targetCamera.bearing) })\n          } else {\n            // calculate shortest rotation for bearing\n            targetCamera.bearing?.let { targetBearing ->\n              val targets = MathUtils.prepareOptimalBearingPath(\n                doubleArrayOf(startCamera.bearing, targetBearing)\n              ).toTypedArray()\n              cameraAnimator.setObjectValues(*targets)\n            }\n          }\n        CameraAnimatorType.CENTER ->\n          if (completedChildAnimators.contains(CameraAnimatorType.CENTER)) {\n            cameraDelegate.setCamera(cameraOptions { center(targetCamera.center) })\n          } else {\n            cameraAnimator.setObjectValues(startCamera.center, targetCamera.center)\n          }\n        CameraAnimatorType.ZOOM ->\n          if (completedChildAnimators.contains(CameraAnimatorType.ZOOM)) {\n            cameraDelegate.setCamera(cameraOptions { zoom(targetCamera.zoom) })\n          } else {\n            cameraAnimator.setObjectValues(startCamera.zoom, targetCamera.zoom)\n          }\n        CameraAnimatorType.PITCH ->\n          if (completedChildAnimators.contains(CameraAnimatorType.PITCH)) {\n            cameraDelegate.setCamera(cameraOptions { pitch(targetCamera.pitch) })\n          } else {\n            cameraAnimator.setObjectValues(startCamera.pitch, targetCamera.pitch)\n          }\n        CameraAnimatorType.PADDING ->\n          if (completedChildAnimators.contains(CameraAnimatorType.PADDING)) {\n            cameraDelegate.setCamera(cameraOptions { padding(targetCamera.padding) })\n          } else {\n            cameraAnimator.setObjectValues(startCamera.padding, targetCamera.padding)\n          }\n      }\n    }\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/main/kotlin/com/mapbox/maps/plugin/viewport/transition/ImmediateViewportTransition.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.viewport.CompletionListener\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.ViewportPluginImpl.Companion.VIEWPORT_CAMERA_OWNER\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\n\n/**\n * The [ViewportTransition] that transition to target [ViewportState] immediately without any animation.\n *\n * Use [ViewportPlugin.makeImmediateViewportTransition] to create instances of ImmediateViewportTransition.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class ImmediateViewportTransition(delegateProvider: MapDelegateProvider) :\n  ViewportTransition {\n  private val cameraPlugin = delegateProvider.mapPluginProviderDelegate.camera\n  private var cachedAnchor: ScreenCoordinate? = null\n\n  /**\n   * Run the [ViewportTransition] from previous [ViewportState] to the target [ViewportState].\n   *\n   * The completion block contains a Bool that is true if the transition is cancelled and false\n   * if it ran to completion. Implementations must be sure to invoke the completion block with false if\n   * the returned Cancelable is invoked prior to completion. the completion block must be invoked\n   * on the main queue. Transitions must handle the possibility that the \"to\" state might fail to\n   * provide a target camera in a timely manner or might update the target camera multiple times\n   * during the transition (a \"moving target\").\n   *\n   * @param to The target [ViewportState]\n   * @param completionListener The listener to observe the completion state.\n   * @return a handle that can be used to cancel the current [ViewportTransition]\n   */\n  override fun run(\n    to: ViewportState,\n    completionListener: CompletionListener\n  ): Cancelable {\n    return to.observeDataSource { cameraOptions ->\n      // cache the camera plugin's last anchor point, and reset it once transition is ended\n      cachedAnchor = cameraPlugin.anchor\n      // For the viewport transition, the anchor should be set to null to avoid unexpected center shift\n      // caused by the zoom/bearing animators.\n      cameraPlugin.anchor = null\n      cameraPlugin.easeTo(\n        cameraOptions,\n        mapAnimationOptions {\n          startDelay(0)\n          duration(0)\n          owner(VIEWPORT_CAMERA_OWNER)\n        }\n      )\n      cameraPlugin.anchor = cachedAnchor\n      completionListener.onComplete(true)\n      false\n    }\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/main/kotlin/com/mapbox/maps/plugin/viewport/transition/MapboxViewportTransitionFactory.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport android.view.animation.Interpolator\nimport androidx.annotation.RestrictTo\nimport androidx.core.view.animation.PathInterpolatorCompat\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion.cameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.viewport.ViewportPluginImpl.Companion.VIEWPORT_CAMERA_OWNER\nimport kotlin.math.abs\n\n/**\n * Helper class that provides default implementation of [ViewportTransition] generators.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninternal class MapboxViewportTransitionFactory(\n  mapDelegateProvider: MapDelegateProvider\n) {\n  private val cameraManager = mapDelegateProvider.mapCameraManagerDelegate\n  private val cameraPlugin = mapDelegateProvider.mapPluginProviderDelegate.camera\n\n  fun transitionFromLowZoomToHighZoom(\n    cameraOptions: CameraOptions,\n    transitionMaxDurationMs: Long\n  ): AnimatorSet {\n    val animators = mutableListOf<Animator>()\n    val currentMapCameraState = cameraManager.cameraState\n\n    var centerDuration = 0L\n    cameraOptions.center?.let { center ->\n      val screenDistanceFromMapCenterToLocation =\n        screenDistanceFromMapCenterToTarget(\n          cameraManager = cameraManager,\n          currentCenter = currentMapCameraState.center,\n          targetCenter = center\n        )\n\n      val centerAnimationRate = 500L\n      centerDuration =\n        ((screenDistanceFromMapCenterToLocation / centerAnimationRate) * 1000L).toLong()\n          .coerceAtMost(MAXIMUM_LOW_TO_HIGH_DURATION_MS)\n      animators += createCenterAnimator(\n        center = center,\n        duration = centerDuration\n      )\n    }\n\n    var zoomDelay = 0L\n    var zoomDuration = 0L\n    cameraOptions.zoom?.let { zoom ->\n      val currentMapCameraZoom = currentMapCameraState.zoom\n      val zoomDelta = abs(zoom - currentMapCameraZoom)\n      val zoomAnimationRate = 2.2\n      zoomDelay = centerDuration / 2L\n      zoomDuration = ((zoomDelta / zoomAnimationRate) * 1000L).toLong()\n        .coerceAtMost(MAXIMUM_LOW_TO_HIGH_DURATION_MS)\n\n      animators += createZoomAnimator(\n        zoom = zoom,\n        startDelay = zoomDelay,\n        duration = zoomDuration\n      )\n    }\n\n    cameraOptions.bearing?.let { bearing ->\n      val bearingDuration = 1800L\n      val bearingDelay = (zoomDelay + zoomDuration - bearingDuration).coerceAtLeast(0L)\n      animators += createBearingAnimator(\n        rotation = normalizeBearing(\n          currentMapCameraState.bearing,\n          bearing\n        ),\n        startDelay = bearingDelay,\n        duration = bearingDuration\n      )\n    }\n\n    val pitchAndPaddingDuration = 1200L\n    val pitchAndPaddingDelay = (zoomDelay + zoomDuration - pitchAndPaddingDuration + 100L)\n      .coerceAtLeast(0L)\n    cameraOptions.pitch?.let { pitch ->\n      animators += createPitchAnimator(\n        pitch = pitch,\n        startDelay = pitchAndPaddingDelay,\n        duration = pitchAndPaddingDuration\n      )\n    }\n\n    cameraOptions.padding?.let { padding ->\n      animators += createPaddingAnimator(\n        padding = padding,\n        startDelay = pitchAndPaddingDelay,\n        duration = pitchAndPaddingDuration\n      )\n    }\n\n    return createAnimatorSet(animators).constrainDurationTo(transitionMaxDurationMs)\n  }\n\n  fun transitionFromHighZoomToLowZoom(\n    cameraOptions: CameraOptions,\n    transitionMaxDurationMs: Long\n  ): AnimatorSet {\n    val animators = mutableListOf<Animator>()\n    val currentMapCameraState = cameraManager.cameraState\n\n    cameraOptions.center?.let { center ->\n      animators += createCenterAnimator(\n        center = center,\n        startDelay = 800L,\n        duration = 1000L\n      )\n    }\n\n    cameraOptions.zoom?.let { zoom ->\n      animators += createZoomAnimator(\n        zoom = zoom,\n        duration = 1800L\n      )\n    }\n\n    cameraOptions.bearing?.let { bearing ->\n      animators += createBearingAnimator(\n        rotation = normalizeBearing(\n          currentMapCameraState.bearing,\n          bearing\n        ),\n        startDelay = 600L,\n        duration = 1200L\n      )\n    }\n\n    cameraOptions.pitch?.let { pitch ->\n      animators += createPitchAnimator(\n        pitch = pitch,\n        duration = 1000L\n      )\n    }\n\n    cameraOptions.padding?.let { padding ->\n      animators += createPaddingAnimator(\n        padding = padding,\n        duration = 1200L\n      )\n    }\n\n    return createAnimatorSet(animators).constrainDurationTo(transitionMaxDurationMs)\n  }\n\n  fun transitionLinear(\n    cameraOptions: CameraOptions,\n    transitionDurationMs: Long\n  ): AnimatorSet {\n    val animators = mutableListOf<Animator>()\n    val currentMapCameraState = cameraManager.cameraState\n\n    cameraOptions.center?.let { center ->\n      animators += createCenterAnimator(\n        center = center,\n        duration = transitionDurationMs,\n        interpolator = LINEAR_INTERPOLATOR\n      )\n    }\n\n    cameraOptions.zoom?.let { zoom ->\n      animators += createZoomAnimator(\n        zoom = zoom,\n        duration = transitionDurationMs,\n        interpolator = LINEAR_INTERPOLATOR\n      )\n    }\n\n    cameraOptions.bearing?.let { bearing ->\n      animators += createBearingAnimator(\n        rotation = normalizeBearing(\n          currentMapCameraState.bearing,\n          bearing\n        ),\n        duration = LINEAR_ANIMATION_DURATION_MS,\n        interpolator = LINEAR_INTERPOLATOR\n      )\n    }\n\n    cameraOptions.pitch?.let { pitch ->\n      animators += createPitchAnimator(\n        pitch = pitch,\n        duration = transitionDurationMs,\n        interpolator = LINEAR_INTERPOLATOR\n      )\n    }\n\n    cameraOptions.padding?.let { padding ->\n      animators += createPaddingAnimator(\n        padding = padding,\n        duration = transitionDurationMs,\n        interpolator = LINEAR_INTERPOLATOR\n      )\n    }\n\n    return createAnimatorSet(animators)\n  }\n\n  private fun createCenterAnimator(\n    center: Point,\n    startDelay: Long = 0L,\n    duration: Long,\n    interpolator: Interpolator = SLOW_OUT_SLOW_IN_INTERPOLATOR\n  ): Animator {\n\n    return cameraPlugin.createCenterAnimator(\n      useShortestPath = true,\n      options = cameraAnimatorOptions(center) { owner(VIEWPORT_CAMERA_OWNER) }\n    ) {\n      this.startDelay = startDelay\n      this.duration = duration\n      this.interpolator = interpolator\n    }\n  }\n\n  private fun createZoomAnimator(\n    zoom: Double,\n    startDelay: Long = 0L,\n    duration: Long,\n    interpolator: Interpolator = SLOW_OUT_SLOW_IN_INTERPOLATOR\n  ): Animator = cameraPlugin.createZoomAnimator(\n    cameraAnimatorOptions(zoom) { owner(VIEWPORT_CAMERA_OWNER) }\n  ) {\n    this.startDelay = startDelay\n    this.duration = duration\n    this.interpolator = interpolator\n  }\n\n  private fun createBearingAnimator(\n    rotation: Double,\n    startDelay: Long = 0L,\n    duration: Long,\n    interpolator: Interpolator = SLOW_OUT_SLOW_IN_INTERPOLATOR\n  ): Animator = cameraPlugin.createBearingAnimator(\n    cameraAnimatorOptions(rotation) { owner(VIEWPORT_CAMERA_OWNER) }\n  ) {\n    this.startDelay = startDelay\n    this.duration = duration\n    this.interpolator = interpolator\n  }\n\n  private fun createPitchAnimator(\n    pitch: Double,\n    startDelay: Long = 0,\n    duration: Long,\n    interpolator: Interpolator = SLOW_OUT_SLOW_IN_INTERPOLATOR\n  ): Animator = cameraPlugin.createPitchAnimator(\n    cameraAnimatorOptions(pitch) { owner(VIEWPORT_CAMERA_OWNER) }\n  ) {\n    this.startDelay = startDelay\n    this.duration = duration\n    this.interpolator = interpolator\n  }\n\n  private fun createPaddingAnimator(\n    padding: EdgeInsets,\n    startDelay: Long = 0L,\n    duration: Long,\n    interpolator: Interpolator = SLOW_OUT_SLOW_IN_INTERPOLATOR\n  ): Animator = cameraPlugin.createPaddingAnimator(\n    cameraAnimatorOptions(padding) { owner(VIEWPORT_CAMERA_OWNER) }\n  ) {\n    this.startDelay = startDelay\n    this.duration = duration\n    this.interpolator = interpolator\n  }\n\n  private companion object {\n    private const val LINEAR_ANIMATION_DURATION_MS: Long = 1000L\n    private const val MAXIMUM_LOW_TO_HIGH_DURATION_MS: Long = 3000L\n    private val LINEAR_INTERPOLATOR: Interpolator = PathInterpolatorCompat.create(0f, 0f, 1f, 1f)\n    private val SLOW_OUT_SLOW_IN_INTERPOLATOR: Interpolator =\n      PathInterpolatorCompat.create(0.4f, 0f, 0.4f, 1f)\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/main/kotlin/com/mapbox/maps/plugin/viewport/transition/TransitionUtils.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport kotlin.math.hypot\nimport kotlin.math.pow\nimport kotlin.math.roundToInt\n\ninternal fun createAnimatorSet(animators: List<Animator>) = AnimatorSet().apply {\n  playTogether(animators)\n}\n\ninternal fun screenDistanceFromMapCenterToTarget(\n  cameraManager: MapCameraManagerDelegate,\n  currentCenter: Point,\n  targetCenter: Point\n): Double {\n  val currentCenterScreenCoordinate = cameraManager.pixelForCoordinate(currentCenter)\n  val locationScreenCoordinate = cameraManager.pixelForCoordinate(targetCenter)\n  return hypot(\n    currentCenterScreenCoordinate.x - locationScreenCoordinate.x,\n    currentCenterScreenCoordinate.y - locationScreenCoordinate.y\n  )\n}\n\n/**\n * Returns a bearing change using the shortest path.\n */\ninternal fun normalizeBearing(currentBearing: Double, targetBearing: Double): Double {\n  /*\n  rounding is a workaround for https://github.com/mapbox/mapbox-maps-android/issues/274\n  it prevents wrapping to 360 degrees for very small, negative numbers and prevents the camera\n  from spinning around unintentionally\n  */\n  return (currentBearing + shortestRotation(currentBearing, targetBearing)).roundTo(6)\n}\n\nprivate fun shortestRotation(from: Double, to: Double): Double {\n  return (to - from + 540) % 360 - 180\n}\n\nprivate fun Double.roundTo(numFractionDigits: Int): Double {\n  val factor = 10.0.pow(numFractionDigits.toDouble())\n  return (this * factor).roundToInt() / factor\n}\n\n/**\n * Takes the longest animation in the set (including delay an duration) and scales the duration\n * down to match the duration constraint if it's exceeded.\n * All other animations are scaled by the same factor which allows to mostly keep the same\n * composition and \"feel\" of the animation set while shortening its duration.\n */\ninternal fun AnimatorSet.constrainDurationTo(maxDuration: Long): AnimatorSet {\n  childAnimations.maxByOrNull { it.startDelay + it.duration }?.let {\n    val longestExecutionTime = it.startDelay + it.duration\n    if (longestExecutionTime > maxDuration) {\n      val factor = maxDuration / (longestExecutionTime).toDouble()\n      childAnimations.forEach { animator ->\n        animator.startDelay = (animator.startDelay * factor).toLong()\n        animator.duration = (animator.duration * factor).toLong()\n      }\n    }\n  }\n  return this\n}"
  },
  {
    "path": "plugin-viewport/src/main/kotlin/com/mapbox/maps/plugin/viewport/util/ViewportTelemetryEvents.kt",
    "content": "package com.mapbox.maps.plugin.viewport.util\n\nimport com.mapbox.maps.module.TelemetryEvent\n\ninternal object ViewportTelemetryEvents {\n  val stateFollowPuck = TelemetryEvent.create(\"viewport/state/follow-puck\")\n  val stateOverview = TelemetryEvent.create(\"viewport/state/overview\")\n  val stateTransition = TelemetryEvent.create(\"viewport/state/transition\")\n}"
  },
  {
    "path": "plugin-viewport/src/test/kotlin/com/mapbox/maps/plugin/viewport/ViewportPluginImplTest.kt",
    "content": "package com.mapbox.maps.plugin.viewport\n\nimport android.os.Handler\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapListenerDelegate\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentPlugin\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.plugin.viewport.transition.ViewportTransition\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.runs\nimport io.mockk.slot\nimport io.mockk.unmockkAll\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport io.mockk.verifyOrder\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass ViewportPluginImplTest {\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private val mapPluginProviderDelegate = mockk<MapPluginProviderDelegate>()\n  private val mapCameraManagerDelegate = mockk<MapCameraManagerDelegate>()\n  private val mapListenerDelegate = mockk<MapListenerDelegate>()\n  private val cameraPlugin = mockk<CameraAnimationsPlugin>()\n  private val locationPlugin = mockk<LocationComponentPlugin>()\n  private val handler = mockk<Handler>()\n  private val completeSlot = slot<CompletionListener>()\n  private val runnableSlot = mutableListOf<Runnable>()\n  private val statusObserver = mockk<ViewportStatusObserver>()\n  private val targetState = mockk<ViewportState>()\n  private val transition = mockk<ViewportTransition>()\n  private val transitionToCompletionListener = mockk<CompletionListener>()\n  private val transitionUpdateCancelable = mockk<Cancelable>()\n  private lateinit var viewportPlugin: ViewportPluginImpl\n\n  @Before\n  fun setup() {\n    every { delegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { delegateProvider.mapListenerDelegate } returns mapListenerDelegate\n    every { mapListenerDelegate.subscribeRenderFrameStarted(any()) } returns mockk()\n    mockkStatic(CAMERA_ANIMATIONS_UTILS)\n    mockkStatic(LOCATION_COMPONENT_UTILS)\n    every { mapPluginProviderDelegate.location } returns locationPlugin\n    every { mapPluginProviderDelegate.camera } returns cameraPlugin\n    every { cameraPlugin.addCameraAnimationsLifecycleListener(any()) } just runs\n    every { cameraPlugin.removeCameraAnimationsLifecycleListener(any()) } just runs\n    every { targetState.startUpdatingCamera() } just runs\n    every { targetState.stopUpdatingCamera() } just runs\n    every { transition.run(any(), any()) } returns transitionUpdateCancelable\n    every { transitionToCompletionListener.onComplete(any()) } just runs\n    every { handler.post(any()) } returns true\n    every { statusObserver.onViewportStatusChanged(any(), any(), any()) } just runs\n    every { transitionUpdateCancelable.cancel() } just runs\n    every { mapCameraManagerDelegate.cameraForCoordinates(any(), any(), any(), any(), any(), any()) } just runs\n    viewportPlugin = ViewportPluginImpl(handler)\n    viewportPlugin.onDelegateProvider(delegateProvider)\n    viewportPlugin.addStatusObserver(statusObserver)\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(CAMERA_ANIMATIONS_UTILS)\n    unmockkStatic(LOCATION_COMPONENT_UTILS)\n    unmockkAll()\n  }\n\n  @Test\n  fun testDelegateProvider() {\n    viewportPlugin.defaultTransition\n    verify { cameraPlugin.addCameraAnimationsLifecycleListener(any()) }\n  }\n\n  @Test\n  fun testCleanUp() {\n    viewportPlugin.cleanup()\n    verify { cameraPlugin.removeCameraAnimationsLifecycleListener(any()) }\n  }\n\n  @Test\n  fun testCreateFollowPuckViewportState() {\n    val followPuckViewportStateOptions = FollowPuckViewportStateOptions.Builder().build()\n    val followPuckState =\n      viewportPlugin.makeFollowPuckViewportState(followPuckViewportStateOptions)\n    assertEquals(followPuckState.options, followPuckViewportStateOptions)\n  }\n\n  @Test(expected = IllegalArgumentException::class)\n  fun testCreateOverviewViewportStateEmptyGeometry() {\n    val overviewViewportStateOptions = OverviewViewportStateOptions.Builder().build()\n    viewportPlugin.makeOverviewViewportState(overviewViewportStateOptions)\n  }\n\n  @Test\n  fun testCreateOverviewViewportState() {\n    val overviewViewportStateOptions =\n      OverviewViewportStateOptions.Builder().geometry(Point.fromLngLat(0.0, 0.0)).build()\n    val overviewState = viewportPlugin.makeOverviewViewportState(overviewViewportStateOptions)\n    assertEquals(overviewState.options, overviewViewportStateOptions)\n  }\n\n  @Test\n  fun testCreateDefaultViewportTransition() {\n    val defaultViewportTransitionOptions = DefaultViewportTransitionOptions.Builder().build()\n    val defaultViewportTransition =\n      viewportPlugin.makeDefaultViewportTransition(defaultViewportTransitionOptions)\n    assertEquals(defaultViewportTransitionOptions, defaultViewportTransition.options)\n  }\n\n  @Test\n  fun testCreateImmediateViewportTransition() {\n    assertNotNull(viewportPlugin.makeImmediateViewportTransition())\n  }\n\n  @Test\n  fun testTransitionToWithDefaultTransition() {\n    viewportPlugin.defaultTransition = transition\n    // enter transition status\n    viewportPlugin.transitionTo(targetState, null, transitionToCompletionListener)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Idle,\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    assertTrue(viewportPlugin.status is ViewportStatus.Transition)\n    verify { transition.run(targetState, capture(completeSlot)) }\n    // complete transition, enter state status\n    completeSlot.captured.onComplete(true)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatus.State(targetState),\n          ViewportStatusChangeReason.TRANSITION_SUCCEEDED\n        )\n      }\n    }\n    assertEquals(viewportPlugin.status, ViewportStatus.State(targetState))\n    verifyOrder {\n      targetState.startUpdatingCamera()\n      transitionToCompletionListener.onComplete(true)\n    }\n  }\n\n  @Test\n  fun testTransitionToWithCustomisedTransition() {\n    val defaultTransition = mockk<ViewportTransition>()\n    viewportPlugin.defaultTransition = defaultTransition\n    // enter transition status\n    viewportPlugin.transitionTo(targetState, transition, transitionToCompletionListener)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Idle,\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    assertTrue(viewportPlugin.status is ViewportStatus.Transition)\n    verify(exactly = 0) { defaultTransition.run(targetState, any()) }\n    verify { transition.run(targetState, capture(completeSlot)) }\n    // complete transition, enter state status\n    completeSlot.captured.onComplete(true)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatus.State(targetState),\n          ViewportStatusChangeReason.TRANSITION_SUCCEEDED\n        )\n      }\n    }\n    assertEquals(viewportPlugin.status, ViewportStatus.State(targetState))\n    verifyOrder {\n      targetState.startUpdatingCamera()\n      transitionToCompletionListener.onComplete(true)\n    }\n  }\n\n  @Test\n  fun testTransitionToWithCanceledTransition() {\n    viewportPlugin.defaultTransition = transition\n    // enter transition status\n    viewportPlugin.transitionTo(targetState, null, transitionToCompletionListener)\n    verify { transition.run(targetState, capture(completeSlot)) }\n    assertTrue(viewportPlugin.status is ViewportStatus.Transition)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Idle,\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    // complete transition with canceled flag\n    completeSlot.captured.onComplete(false)\n    assertEquals(viewportPlugin.status, ViewportStatus.Idle)\n    runHandlerAndTest {\n      runHandlerAndTest {\n        verify {\n          statusObserver.onViewportStatusChanged(\n            ViewportStatus.Transition(transition, targetState),\n            ViewportStatus.Idle,\n            ViewportStatusChangeReason.TRANSITION_FAILED\n          )\n        }\n      }\n    }\n    verify { transitionToCompletionListener.onComplete(false) }\n    verify(exactly = 0) { targetState.startUpdatingCamera() }\n  }\n\n  @Test\n  fun testTransitionToSameStateWhileTransitionStatus() {\n    viewportPlugin.defaultTransition = transition\n    // enter transition status\n    viewportPlugin.transitionTo(targetState)\n    verify { transition.run(targetState, capture(completeSlot)) }\n    assertTrue(viewportPlugin.status is ViewportStatus.Transition)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Idle,\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    // start new transition to the same state\n    viewportPlugin.transitionTo(targetState, null, transitionToCompletionListener)\n    verify { transitionToCompletionListener.onComplete(false) }\n  }\n\n  @Test\n  fun testTransitionToSameStateWhileStateStatus() {\n    viewportPlugin.defaultTransition = transition\n    // enter transition status\n    viewportPlugin.transitionTo(targetState)\n    verify { transition.run(targetState, capture(completeSlot)) }\n    assertTrue(viewportPlugin.status is ViewportStatus.Transition)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Idle,\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    // complete transition, enter state status\n    completeSlot.captured.onComplete(true)\n    assertEquals(viewportPlugin.status, ViewportStatus.State(targetState))\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatus.State(targetState),\n          ViewportStatusChangeReason.TRANSITION_SUCCEEDED\n        )\n      }\n    }\n    verify(exactly = 1) { targetState.startUpdatingCamera() }\n    // start new transition to the same state\n    viewportPlugin.transitionTo(targetState, null, transitionToCompletionListener)\n    verify { transitionToCompletionListener.onComplete(true) }\n    // verify no more startUpdatingCamera is called\n    verify(exactly = 1) { targetState.startUpdatingCamera() }\n  }\n\n  @Test\n  fun testTransitionToDifferentStateWhileInState() {\n    val newState = mockk<ViewportState>()\n    viewportPlugin.defaultTransition = transition\n    // enter transition status\n    viewportPlugin.transitionTo(targetState)\n    assertTrue(viewportPlugin.status is ViewportStatus.Transition)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Idle,\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    verify { transition.run(targetState, capture(completeSlot)) }\n    // complete transition, enter state status\n    completeSlot.captured.onComplete(true)\n    assertEquals(viewportPlugin.status, ViewportStatus.State(targetState))\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatus.State(targetState),\n          ViewportStatusChangeReason.TRANSITION_SUCCEEDED\n        )\n      }\n    }\n    // transition to new state\n    viewportPlugin.transitionTo(newState)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.State(targetState),\n          ViewportStatus.Transition(transition, newState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    verifyOrder {\n      targetState.stopUpdatingCamera()\n      transition.run(newState, any())\n    }\n  }\n\n  @Test\n  fun testTransitionToDifferentStateWhileInTransition() {\n    val newState = mockk<ViewportState>()\n    viewportPlugin.defaultTransition = transition\n    // enter transition status\n    viewportPlugin.transitionTo(targetState)\n    assertTrue(viewportPlugin.status is ViewportStatus.Transition)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Idle,\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    verify { transition.run(targetState, capture(completeSlot)) }\n    // transition to new state\n    viewportPlugin.transitionTo(newState)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatus.Transition(transition, newState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    verifyOrder {\n      transitionUpdateCancelable.cancel()\n      transition.run(newState, any())\n    }\n  }\n\n  @Test\n  fun testIdle() {\n    viewportPlugin.defaultTransition = transition\n    // enter transition status\n    viewportPlugin.transitionTo(targetState)\n    assertTrue(viewportPlugin.status is ViewportStatus.Transition)\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Idle,\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    verify { transition.run(targetState, capture(completeSlot)) }\n    // transition to idle\n    viewportPlugin.idle()\n    runHandlerAndTest {\n      verify {\n        statusObserver.onViewportStatusChanged(\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatus.Idle,\n          ViewportStatusChangeReason.IDLE_REQUESTED\n        )\n      }\n    }\n    verify { transitionUpdateCancelable.cancel() }\n    assertEquals(viewportPlugin.status, ViewportStatus.Idle)\n  }\n\n  @Test\n  fun testAddStatusObserver() {\n    val testObserver = mockk<ViewportStatusObserver> {\n      every { onViewportStatusChanged(any(), any(), any()) } just runs\n    }\n    viewportPlugin.defaultTransition = transition\n    viewportPlugin.addStatusObserver(testObserver)\n    viewportPlugin.transitionTo(targetState)\n    runHandlerAndTest {\n      verify(exactly = 1) {\n        testObserver.onViewportStatusChanged(\n          ViewportStatus.Idle,\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatusChangeReason.TRANSITION_STARTED\n        )\n      }\n    }\n    viewportPlugin.removeStatusObserver(testObserver)\n    viewportPlugin.idle()\n    runHandlerAndTest {\n      verify(exactly = 0) {\n        testObserver.onViewportStatusChanged(\n          ViewportStatus.Transition(transition, targetState),\n          ViewportStatus.Idle,\n          ViewportStatusChangeReason.IDLE_REQUESTED\n        )\n      }\n    }\n  }\n\n  private fun runHandlerAndTest(test: () -> Unit) {\n    verify { handler.post(capture(runnableSlot)) }\n    runnableSlot.last().run()\n    test.invoke()\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/test/kotlin/com/mapbox/maps/plugin/viewport/ViewportTestConstants.kt",
    "content": "package com.mapbox.maps.plugin.viewport\n\ninternal const val TRANSITION_UTILS = \"com.mapbox.maps.plugin.viewport.transition.TransitionUtilsKt\"\ninternal const val CAMERA_ANIMATIONS_UTILS = \"com.mapbox.maps.plugin.animation.CameraAnimationsUtils\"\ninternal const val LOCATION_COMPONENT_UTILS = \"com.mapbox.maps.plugin.locationcomponent.LocationComponentUtils\""
  },
  {
    "path": "plugin-viewport/src/test/kotlin/com/mapbox/maps/plugin/viewport/state/FollowPuckViewportStateImplTest.kt",
    "content": "package com.mapbox.maps.plugin.viewport.state\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport android.animation.ValueAnimator\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentPlugin\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener\nimport com.mapbox.maps.plugin.locationcomponent.location\nimport com.mapbox.maps.plugin.viewport.CAMERA_ANIMATIONS_UTILS\nimport com.mapbox.maps.plugin.viewport.DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH\nimport com.mapbox.maps.plugin.viewport.DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM\nimport com.mapbox.maps.plugin.viewport.LOCATION_COMPONENT_UTILS\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.transition.MapboxViewportTransitionFactory\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass FollowPuckViewportStateImplTest {\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private val mapPluginProviderDelegate = mockk<MapPluginProviderDelegate>()\n  private val cameraPlugin = mockk<CameraAnimationsPlugin>()\n  private val locationPlugin = mockk<LocationComponentPlugin>()\n  private val transitionFactory = mockk<MapboxViewportTransitionFactory>()\n  private lateinit var followingState: FollowPuckViewportStateImpl\n\n  @Before\n  fun setup() {\n    every { delegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    mockkStatic(CAMERA_ANIMATIONS_UTILS)\n    mockkStatic(LOCATION_COMPONENT_UTILS)\n    every { mapPluginProviderDelegate.location } returns locationPlugin\n    every { mapPluginProviderDelegate.camera } returns cameraPlugin\n    every { locationPlugin.addOnIndicatorBearingChangedListener(any()) } just runs\n    every { locationPlugin.addOnIndicatorPositionChangedListener(any()) } just runs\n    every { locationPlugin.removeOnIndicatorPositionChangedListener(any()) } just runs\n    every { locationPlugin.removeOnIndicatorBearingChangedListener(any()) } just runs\n    every { locationPlugin.enabled } returns true\n    followingState = FollowPuckViewportStateImpl(\n      delegateProvider,\n      initialOptions = FollowPuckViewportStateOptions.Builder().build(),\n      transitionFactory\n    )\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(CAMERA_ANIMATIONS_UTILS)\n    unmockkStatic(LOCATION_COMPONENT_UTILS)\n    unmockkAll()\n  }\n\n  @Test\n  fun testObserveDataSourceForFirstDataPoint() {\n    val indicatorBearingChangedListenerSlot = slot<OnIndicatorBearingChangedListener>()\n    val indicatorPositionChangedListenerSlot = slot<OnIndicatorPositionChangedListener>()\n    val dataObserver = mockk<ViewportStateDataObserver>()\n    val testBearing = 10.0\n    var testBearingSent = false\n    val testCenter = Point.fromLngLat(0.0, 0.0)\n\n    // stop observing after the testBearing value has been sent\n    every { dataObserver.onNewData(any()) } answers { !testBearingSent }\n\n    followingState.observeDataSource(dataObserver)\n    verify {\n      locationPlugin.addOnIndicatorBearingChangedListener(\n        capture(\n          indicatorBearingChangedListenerSlot\n        )\n      )\n    }\n    verify {\n      locationPlugin.addOnIndicatorPositionChangedListener(\n        capture(\n          indicatorPositionChangedListenerSlot\n        )\n      )\n    }\n    indicatorPositionChangedListenerSlot.captured.onIndicatorPositionChanged(testCenter)\n    // first new data can already be fired when the first position is given. For example, we might\n    // have a static location with no course.\n    verify(exactly = 1) {\n      dataObserver.onNewData(\n        cameraOptions {\n          center(testCenter)\n          pitch(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH)\n          zoom(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM)\n        }\n      )\n    }\n    testBearingSent = true\n    indicatorBearingChangedListenerSlot.captured.onIndicatorBearingChanged(testBearing)\n    verify(exactly = 1) {\n      dataObserver.onNewData(\n        cameraOptions {\n          bearing(testBearing)\n          center(testCenter)\n          pitch(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH)\n          zoom(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM)\n        }\n      )\n    }\n\n    // more indicator updates after the testBearing update shouldn't be notified.\n    indicatorBearingChangedListenerSlot.captured.onIndicatorBearingChanged(testBearing)\n    indicatorPositionChangedListenerSlot.captured.onIndicatorPositionChanged(testCenter)\n    verify(exactly = 2) {\n      dataObserver.onNewData(any())\n    }\n  }\n\n  @Test\n  fun testObserveDataSourceForFirstDataPointWithConstantBearing() {\n    val indicatorBearingChangedListenerSlot = slot<OnIndicatorBearingChangedListener>()\n    val indicatorPositionChangedListenerSlot = slot<OnIndicatorPositionChangedListener>()\n    val dataObserver = mockk<ViewportStateDataObserver>()\n    val testBearing = 10.0\n    val testCenter = Point.fromLngLat(0.0, 0.0)\n    val constantBearing = 45.0\n\n    // set the bearing to be constant\n    followingState.apply {\n      options =\n        options.toBuilder().bearing(FollowPuckViewportStateBearing.Constant(constantBearing))\n          .build()\n    }\n    // stop observing after the first data point\n    every { dataObserver.onNewData(any()) } returns false\n\n    followingState.observeDataSource(dataObserver)\n    verify {\n      locationPlugin.addOnIndicatorBearingChangedListener(\n        capture(\n          indicatorBearingChangedListenerSlot\n        )\n      )\n    }\n    verify {\n      locationPlugin.addOnIndicatorPositionChangedListener(\n        capture(\n          indicatorPositionChangedListenerSlot\n        )\n      )\n    }\n    indicatorPositionChangedListenerSlot.captured.onIndicatorPositionChanged(testCenter)\n    // first new data be fired when the first position is available, when the bearing is constant.\n    verify(exactly = 1) {\n      dataObserver.onNewData(\n        cameraOptions {\n          center(testCenter)\n          bearing(constantBearing)\n          zoom(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM)\n          pitch(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH)\n        }\n      )\n    }\n    // new bearing updates from location component shouldn't trigger new data.\n    indicatorBearingChangedListenerSlot.captured.onIndicatorBearingChanged(testBearing)\n    verify(exactly = 1) { dataObserver.onNewData(any()) }\n\n    // more indicator updates after the initial update shouldn't be notified.\n    indicatorBearingChangedListenerSlot.captured.onIndicatorBearingChanged(testBearing)\n    indicatorPositionChangedListenerSlot.captured.onIndicatorPositionChanged(testCenter)\n    verify(exactly = 1) {\n      dataObserver.onNewData(any())\n    }\n  }\n\n  @Test\n  fun testObserveDataSourceForFirstDataPointWithNullBearingOption() {\n    val indicatorBearingChangedListenerSlot = slot<OnIndicatorBearingChangedListener>()\n    val indicatorPositionChangedListenerSlot = slot<OnIndicatorPositionChangedListener>()\n    val dataObserver = mockk<ViewportStateDataObserver>()\n    val testBearing = 10.0\n    val testCenter = Point.fromLngLat(0.0, 0.0)\n\n    // set the bearing to be constant\n    followingState.apply {\n      options =\n        options.toBuilder().bearing(null)\n          .build()\n    }\n    every { dataObserver.onNewData(any()) } returns true\n\n    followingState.observeDataSource(dataObserver)\n    verify {\n      locationPlugin.addOnIndicatorBearingChangedListener(\n        capture(indicatorBearingChangedListenerSlot)\n      )\n    }\n    verify {\n      locationPlugin.addOnIndicatorPositionChangedListener(\n        capture(indicatorPositionChangedListenerSlot)\n      )\n    }\n    indicatorPositionChangedListenerSlot.captured.onIndicatorPositionChanged(testCenter)\n    // new bearing updates from location component shouldn't trigger new data.\n    indicatorBearingChangedListenerSlot.captured.onIndicatorBearingChanged(testBearing)\n    // first new data be fired when the first position is available, when the bearing is constant.\n    verify(exactly = 1) {\n      dataObserver.onNewData(\n        cameraOptions {\n          center(testCenter)\n          bearing(null)\n          zoom(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM)\n          pitch(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH)\n        }\n      )\n    }\n    verify(exactly = 1) {\n      dataObserver.onNewData(any())\n    }\n  }\n\n  @Test\n  fun testObserveDataSourceWithOnlyExistingLocation() {\n    val indicatorBearingChangedListenerSlot = slot<OnIndicatorBearingChangedListener>()\n    val indicatorPositionChangedListenerSlot = slot<OnIndicatorPositionChangedListener>()\n    val dataObserver = mockk<ViewportStateDataObserver>()\n    val testBearing = 10.0\n    val testCenter = Point.fromLngLat(0.0, 0.0)\n\n    // keep observing after the first data point\n    every { dataObserver.onNewData(any()) } returns true\n\n    // immediately emmit location update when listener is added.\n    every {\n      locationPlugin.addOnIndicatorBearingChangedListener(\n        capture(\n          indicatorBearingChangedListenerSlot\n        )\n      )\n    } answers {\n      indicatorBearingChangedListenerSlot.captured.onIndicatorBearingChanged(testBearing)\n    }\n    every {\n      locationPlugin.addOnIndicatorPositionChangedListener(\n        capture(\n          indicatorPositionChangedListenerSlot\n        )\n      )\n    } answers {\n      indicatorPositionChangedListenerSlot.captured.onIndicatorPositionChanged(testCenter)\n    }\n\n    followingState.observeDataSource(dataObserver)\n    verify {\n      locationPlugin.addOnIndicatorBearingChangedListener(any())\n    }\n    verify {\n      locationPlugin.addOnIndicatorPositionChangedListener(any())\n    }\n    verify(exactly = 1) {\n      dataObserver.onNewData(\n        cameraOptions {\n          bearing(testBearing)\n          center(testCenter)\n          pitch(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH)\n          zoom(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM)\n        }\n      )\n    }\n\n    // observing the data source again should only emit exactly one data point.\n    followingState.observeDataSource(dataObserver)\n    verify(exactly = 2) {\n      dataObserver.onNewData(\n        cameraOptions {\n          bearing(testBearing)\n          center(testCenter)\n          pitch(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH)\n          zoom(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM)\n        }\n      )\n    }\n  }\n\n  @Test\n  fun testObserveDataSourceContinuously() {\n    val indicatorBearingChangedListenerSlot = slot<OnIndicatorBearingChangedListener>()\n    val indicatorPositionChangedListenerSlot = slot<OnIndicatorPositionChangedListener>()\n    val dataObserver = mockk<ViewportStateDataObserver>()\n    val testBearing = 10.0\n    val testCenter = Point.fromLngLat(0.0, 0.0)\n\n    // keep observing after the first data point\n    every { dataObserver.onNewData(any()) } returns true\n\n    followingState.observeDataSource(dataObserver)\n    verify {\n      locationPlugin.addOnIndicatorBearingChangedListener(\n        capture(\n          indicatorBearingChangedListenerSlot\n        )\n      )\n    }\n    verify {\n      locationPlugin.addOnIndicatorPositionChangedListener(\n        capture(\n          indicatorPositionChangedListenerSlot\n        )\n      )\n    }\n    indicatorBearingChangedListenerSlot.captured.onIndicatorBearingChanged(testBearing)\n    indicatorPositionChangedListenerSlot.captured.onIndicatorPositionChanged(testCenter)\n    verify(exactly = 1) {\n      dataObserver.onNewData(\n        cameraOptions {\n          bearing(testBearing)\n          center(testCenter)\n          pitch(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH)\n          zoom(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM)\n        }\n      )\n    }\n    verify(exactly = 0) { locationPlugin.removeOnIndicatorBearingChangedListener(any()) }\n    verify(exactly = 0) { locationPlugin.removeOnIndicatorPositionChangedListener(any()) }\n    indicatorBearingChangedListenerSlot.captured.onIndicatorBearingChanged(testBearing)\n    indicatorPositionChangedListenerSlot.captured.onIndicatorPositionChanged(testCenter)\n    verify(exactly = 3) {\n      dataObserver.onNewData(\n        cameraOptions {\n          bearing(testBearing)\n          center(testCenter)\n          pitch(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH)\n          zoom(DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM)\n        }\n      )\n    }\n  }\n\n  @Test\n  fun testStartStopUpdatingCamera() {\n    val indicatorBearingChangedListenerSlot = slot<OnIndicatorBearingChangedListener>()\n    val indicatorPositionChangedListenerSlot = slot<OnIndicatorPositionChangedListener>()\n    val testBearing = 10.0\n    val testCenter = Point.fromLngLat(0.0, 0.0)\n    val animatorSet = mockk<AnimatorSet>()\n    val childAnimator = mockk<ValueAnimator>()\n    val animatorListenerSlot = slot<Animator.AnimatorListener>()\n\n    every { transitionFactory.transitionLinear(any(), any()) } returns animatorSet\n    every { animatorSet.addListener(any()) } just runs\n    every { animatorSet.childAnimations } returns arrayListOf(childAnimator)\n    every { animatorSet.start() } just runs\n    every { animatorSet.setDuration(any()) } returns animatorSet\n    // In real implementation when the set is cancel both onAnimationCancel and onAnimationEnd are called\n    every { animatorSet.cancel() } answers {\n      animatorListenerSlot.captured.onAnimationCancel(animatorSet)\n      animatorListenerSlot.captured.onAnimationEnd(animatorSet)\n    }\n    every { cameraPlugin.registerAnimators(any()) } just runs\n    every { cameraPlugin.unregisterAnimators(any()) } just runs\n\n    // test start updating camera\n    followingState.startUpdatingCamera()\n    verify {\n      locationPlugin.addOnIndicatorBearingChangedListener(\n        capture(\n          indicatorBearingChangedListenerSlot\n        )\n      )\n    }\n    verify {\n      locationPlugin.addOnIndicatorPositionChangedListener(\n        capture(\n          indicatorPositionChangedListenerSlot\n        )\n      )\n    }\n    indicatorBearingChangedListenerSlot.captured.onIndicatorBearingChanged(testBearing)\n    indicatorPositionChangedListenerSlot.captured.onIndicatorPositionChanged(testCenter)\n    verifySequence {\n      animatorSet.addListener(capture(animatorListenerSlot))\n      animatorSet.childAnimations\n      cameraPlugin.registerAnimators(childAnimator)\n      animatorSet.duration = 0\n      animatorSet.start()\n    }\n    assertTrue(followingState.isFollowingStateRunning)\n\n    // test stop updating camera\n    followingState.stopUpdatingCamera()\n    verify { animatorSet.cancel() }\n    verify {\n      locationPlugin.removeOnIndicatorBearingChangedListener(\n        indicatorBearingChangedListenerSlot.captured\n      )\n    }\n    verify {\n      locationPlugin.removeOnIndicatorPositionChangedListener(\n        indicatorPositionChangedListenerSlot.captured\n      )\n    }\n    assertFalse(followingState.isFollowingStateRunning)\n    verify { cameraPlugin.unregisterAnimators(childAnimator) }\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/test/kotlin/com/mapbox/maps/plugin/viewport/state/OverviewViewportStateImplTest.kt",
    "content": "package com.mapbox.maps.plugin.viewport.state\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport android.animation.ValueAnimator\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.viewport.CAMERA_ANIMATIONS_UTILS\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.transition.MapboxViewportTransitionFactory\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.runs\nimport io.mockk.slot\nimport io.mockk.unmockkAll\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport io.mockk.verifySequence\nimport org.junit.After\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass OverviewViewportStateImplTest {\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private val mapPluginProviderDelegate = mockk<MapPluginProviderDelegate>()\n  private val mapCameraDelegate = mockk<MapCameraManagerDelegate>()\n  private val cameraPlugin = mockk<CameraAnimationsPlugin>()\n  private val cameraOptions = mockk<CameraOptions>()\n  private val transitionFactory = mockk<MapboxViewportTransitionFactory>()\n  private lateinit var overviewState: OverviewViewportStateImpl\n  private val cameraForCoordinateSlot: MutableList<(CameraOptions) -> Unit> = mutableListOf()\n  private val initialGeometry = Point.fromLngLat(0.0, 0.0)\n\n  @Before\n  fun setup() {\n    every { delegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    mockkStatic(CAMERA_ANIMATIONS_UTILS)\n    every { mapPluginProviderDelegate.camera } returns cameraPlugin\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraDelegate\n    every {\n      mapCameraDelegate.cameraForCoordinates(\n        any(),\n        any(),\n        any(),\n        any(),\n        any(),\n        any()\n      )\n    } just runs\n    every { cameraPlugin.registerAnimators(any()) } just runs\n    every { cameraPlugin.unregisterAnimators(any()) } just runs\n    overviewState = OverviewViewportStateImpl(\n      delegateProvider,\n      initialOptions = OverviewViewportStateOptions.Builder().geometry(initialGeometry)\n        .build(),\n      transitionFactory\n    )\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(CAMERA_ANIMATIONS_UTILS)\n    unmockkAll()\n    cameraForCoordinateSlot.clear()\n  }\n\n  @Test\n  fun testObserveDataSourceForFirstDataPoint() {\n    val dataObserver = mockk<ViewportStateDataObserver>()\n\n    // stop observing after the first data point\n    every { dataObserver.onNewData(any()) } returns false\n\n    verify(exactly = 1) {\n      mapCameraDelegate.cameraForCoordinates(\n        coordinates = listOf(initialGeometry),\n        camera = CameraOptions.Builder().padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n          .bearing(0.0).pitch(0.0).build(),\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = ScreenCoordinate(0.0, 0.0),\n        capture(cameraForCoordinateSlot)\n      )\n    }\n\n    overviewState.observeDataSource(dataObserver)\n\n    cameraForCoordinateSlot.last().invoke(cameraOptions)\n    verify(exactly = 1) {\n      dataObserver.onNewData(cameraOptions)\n    }\n    overviewState.options =\n      overviewState.options.toBuilder().geometry(Point.fromLngLat(1.0, 1.0)).build()\n    verify(exactly = 1) {\n      dataObserver.onNewData(cameraOptions)\n    }\n  }\n\n  @Test\n  fun testObserveDataSourceForFirstDataPointWithCachedCamera() {\n    val dataObserver = mockk<ViewportStateDataObserver>()\n\n    // stop observing after the first data point\n    every { dataObserver.onNewData(any()) } returns false\n\n    verify(exactly = 1) {\n      mapCameraDelegate.cameraForCoordinates(\n        coordinates = listOf(initialGeometry),\n        camera = CameraOptions.Builder().padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n          .bearing(0.0).pitch(0.0).build(),\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = ScreenCoordinate(0.0, 0.0),\n        capture(cameraForCoordinateSlot)\n      )\n    }\n    cameraForCoordinateSlot.last().invoke(cameraOptions)\n\n    overviewState.observeDataSource(dataObserver)\n\n    verify(exactly = 1) {\n      dataObserver.onNewData(cameraOptions)\n    }\n    overviewState.options =\n      overviewState.options.toBuilder().geometry(Point.fromLngLat(1.0, 1.0)).build()\n    verify(exactly = 1) {\n      dataObserver.onNewData(cameraOptions)\n    }\n  }\n\n  @Test\n  fun testObserveDataSourceForFirstDataPointCancelBeforeEvaluateViewportDataResult() {\n    val dataObserver = mockk<ViewportStateDataObserver>()\n\n    // stop observing after the first data point\n    every { dataObserver.onNewData(any()) } returns false\n\n    verify {\n      mapCameraDelegate.cameraForCoordinates(\n        coordinates = listOf(initialGeometry),\n        camera = CameraOptions.Builder().padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n          .bearing(0.0).pitch(0.0).build(),\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = ScreenCoordinate(0.0, 0.0),\n        capture(cameraForCoordinateSlot)\n      )\n    }\n\n    val cancelable = overviewState.observeDataSource(dataObserver)\n    cancelable.cancel()\n\n    assertTrue(overviewState.dataSourceUpdateObservers.isEmpty())\n\n    cameraForCoordinateSlot.last().invoke(cameraOptions)\n    verify(exactly = 0) {\n      dataObserver.onNewData(cameraOptions)\n    }\n    overviewState.options =\n      overviewState.options.toBuilder().geometry(Point.fromLngLat(1.0, 1.0)).build()\n    verify(exactly = 0) {\n      dataObserver.onNewData(cameraOptions)\n    }\n  }\n\n  @Test\n  fun testObserveDataSourceForFirstDataPointNewGeometryBeforeEvaluateViewportDataResult() {\n    val dataObserver = mockk<ViewportStateDataObserver>()\n    val testCameraOptions = cameraOptions { center(initialGeometry) }\n\n    // stop observing after the first data point\n    every { dataObserver.onNewData(any()) } returns false\n    verify(exactly = 1) {\n      mapCameraDelegate.cameraForCoordinates(\n        coordinates = listOf(initialGeometry),\n        camera = CameraOptions.Builder().padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n          .bearing(0.0).pitch(0.0).build(),\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = ScreenCoordinate(0.0, 0.0),\n        capture(cameraForCoordinateSlot)\n      )\n    }\n    overviewState.observeDataSource(dataObserver)\n\n    verify(exactly = 0) {\n      dataObserver.onNewData(cameraOptions)\n    }\n\n    // new geometry set before the async cameraForCoordinates return\n    val newGeometry = Point.fromLngLat(1.0, 1.0)\n    val newCameraOptions = cameraOptions { center(Point.fromLngLat(1.0, 1.0)) }\n    overviewState.options = overviewState.options.toBuilder().geometry(newGeometry).build()\n\n    verify(exactly = 1) {\n      mapCameraDelegate.cameraForCoordinates(\n        coordinates = listOf(newGeometry),\n        camera = CameraOptions.Builder().padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n          .bearing(0.0).pitch(0.0).build(),\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = ScreenCoordinate(0.0, 0.0),\n        capture(cameraForCoordinateSlot)\n      )\n    }\n    // now assuming map is ready and the cameraForCoordinates calls the result callback in sequence:\n    cameraForCoordinateSlot.first().invoke(testCameraOptions)\n    cameraForCoordinateSlot.last().invoke(newCameraOptions)\n\n    // we should only get one viewport data, which is the new camera options\n    verify(exactly = 0) {\n      dataObserver.onNewData(testCameraOptions)\n    }\n    verify(exactly = 1) {\n      dataObserver.onNewData(newCameraOptions)\n    }\n  }\n\n  @Test\n  fun testObserveDataSourceContinuously() {\n    val dataObserver = mockk<ViewportStateDataObserver>()\n\n    // keep observing after the first data point\n    every { dataObserver.onNewData(any()) } returns true\n    verify(exactly = 1) {\n      mapCameraDelegate.cameraForCoordinates(\n        coordinates = listOf(initialGeometry),\n        camera = CameraOptions.Builder().padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n          .bearing(0.0).pitch(0.0).build(),\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = ScreenCoordinate(0.0, 0.0),\n        capture(cameraForCoordinateSlot)\n      )\n    }\n    overviewState.observeDataSource(dataObserver)\n\n    cameraForCoordinateSlot.last().invoke(cameraOptions)\n    verify(exactly = 1) {\n      dataObserver.onNewData(cameraOptions)\n    }\n    overviewState.options =\n      overviewState.options.toBuilder().geometry(Point.fromLngLat(1.0, 1.0)).build()\n    verify(exactly = 1) {\n      mapCameraDelegate.cameraForCoordinates(\n        coordinates = listOf(Point.fromLngLat(1.0, 1.0)),\n        camera = CameraOptions.Builder().padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n          .bearing(0.0).pitch(0.0).build(),\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = ScreenCoordinate(0.0, 0.0),\n        capture(cameraForCoordinateSlot)\n      )\n    }\n    cameraForCoordinateSlot.last().invoke(cameraOptions)\n    verify(exactly = 2) {\n      dataObserver.onNewData(cameraOptions)\n    }\n  }\n\n  @Test\n  fun testStartStopUpdatingCamera() {\n    val animatorSet = mockk<AnimatorSet>()\n    val animator = mockk<ValueAnimator>()\n    val animatorListenerSlot = slot<Animator.AnimatorListener>()\n\n    every { transitionFactory.transitionLinear(any(), any()) } returns animatorSet\n    every { animatorSet.addListener(any()) } just runs\n    every { animatorSet.childAnimations } returns arrayListOf(animator)\n    every { animatorSet.start() } just runs\n    every { animatorSet.cancel() } just runs\n\n    // test start updating camera\n    overviewState.startUpdatingCamera()\n    assertTrue(overviewState.isOverviewStateRunning)\n\n    // test updating overview state option to trigger an animation\n    overviewState.options =\n      overviewState.options.toBuilder().geometry(Point.fromLngLat(1.0, 1.0)).build()\n\n    verify(exactly = 1) {\n      mapCameraDelegate.cameraForCoordinates(\n        coordinates = listOf(Point.fromLngLat(1.0, 1.0)),\n        camera = CameraOptions.Builder().padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n          .bearing(0.0).pitch(0.0).build(),\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = ScreenCoordinate(0.0, 0.0),\n        capture(cameraForCoordinateSlot)\n      )\n    }\n    cameraForCoordinateSlot.last().invoke(cameraOptions)\n\n    verifySequence {\n      animatorSet.addListener(capture(animatorListenerSlot))\n      animatorSet.childAnimations\n      cameraPlugin.registerAnimators(animator)\n      animatorSet.start()\n    }\n\n    // test stop updating camera\n    overviewState.stopUpdatingCamera()\n    assertFalse(overviewState.isOverviewStateRunning)\n    verify { animatorSet.cancel() }\n    verify { cameraPlugin.unregisterAnimators(animator) }\n  }\n\n  @Test\n  fun testStartCancelUpdatingCamera() {\n    val animatorSet = mockk<AnimatorSet>()\n    val animator = mockk<ValueAnimator>()\n    val animatorListenerSlot = slot<Animator.AnimatorListener>()\n\n    every { transitionFactory.transitionLinear(any(), any()) } returns animatorSet\n    every { animatorSet.addListener(any()) } just runs\n    every { animatorSet.childAnimations } returns arrayListOf(animator)\n    every { animatorSet.start() } just runs\n    every { animatorSet.cancel() } just runs\n\n    // test start updating camera\n    overviewState.startUpdatingCamera()\n    assertTrue(overviewState.isOverviewStateRunning)\n\n    // test updating overview state option to trigger an animation\n    overviewState.options =\n      overviewState.options.toBuilder().geometry(Point.fromLngLat(1.0, 1.0)).build()\n\n    verify(exactly = 1) {\n      mapCameraDelegate.cameraForCoordinates(\n        coordinates = listOf(Point.fromLngLat(1.0, 1.0)),\n        camera = CameraOptions.Builder().padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n          .bearing(0.0).pitch(0.0).build(),\n        coordinatesPadding = EdgeInsets(0.0, 0.0, 0.0, 0.0),\n        maxZoom = null,\n        offset = ScreenCoordinate(0.0, 0.0),\n        capture(cameraForCoordinateSlot)\n      )\n    }\n    cameraForCoordinateSlot.last().invoke(cameraOptions)\n\n    verifySequence {\n      animatorSet.addListener(capture(animatorListenerSlot))\n      animatorSet.childAnimations\n      cameraPlugin.registerAnimators(animator)\n      animatorSet.start()\n    }\n\n    // test stop updating camera\n    overviewState.stopUpdatingCamera()\n    assertFalse(overviewState.isOverviewStateRunning)\n    verify { animatorSet.cancel() }\n    verify { cameraPlugin.unregisterAnimators(animator) }\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/test/kotlin/com/mapbox/maps/plugin/viewport/transition/DefaultViewportTransitionImplTest.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.dsl.cameraOptions\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.CameraAnimatorType\nimport com.mapbox.maps.plugin.animation.animator.CameraAnimator\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.viewport.CAMERA_ANIMATIONS_UTILS\nimport com.mapbox.maps.plugin.viewport.CompletionListener\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.plugin.viewport.state.ViewportStateDataObserver\nimport io.mockk.*\nimport org.junit.After\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass DefaultViewportTransitionImplTest {\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private val mapPluginProviderDelegate = mockk<MapPluginProviderDelegate>()\n  private val mapCameraManagerDelegate = mockk<MapCameraManagerDelegate>()\n  private val cameraPlugin = mockk<CameraAnimationsPlugin>()\n  private val transitionFactory = mockk<MapboxViewportTransitionFactory>()\n  private val targetState = mockk<ViewportState>()\n  private val completionListener = mockk<CompletionListener>()\n  private val dataObserverSlot = slot<ViewportStateDataObserver>()\n  private val cancelable = mockk<Cancelable>()\n  private val cameraState =\n    CameraState(Point.fromLngLat(0.0, 0.0), EdgeInsets(0.0, 0.0, 0.0, 0.0), 0.0, 0.0, 0.0)\n  private val cameraOptions = cameraState.toCameraOptions()\n  private val cachedAnchor = mockk<ScreenCoordinate>()\n  private val animatorSet = mockk<AnimatorSet>()\n  private val animator = mockk<CameraAnimator<*>>()\n  private val animatorSetListenerSlot = slot<Animator.AnimatorListener>()\n  private val animatorListenerSlot = slot<Animator.AnimatorListener>()\n  private lateinit var defaultTransition: DefaultViewportTransitionImpl\n\n  @Before\n  fun setup() {\n    every { delegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraManagerDelegate\n    every { mapCameraManagerDelegate.cameraState } returns cameraState\n    every { mapCameraManagerDelegate.setCamera(any<CameraOptions>()) } just runs\n    every { cancelable.cancel() } just runs\n    mockkStatic(CAMERA_ANIMATIONS_UTILS)\n    every { mapPluginProviderDelegate.camera } returns cameraPlugin\n    every { cameraPlugin.anchor } returns cachedAnchor\n    every { cameraPlugin.anchor = any() } just runs\n    every { cameraPlugin.registerAnimators(any()) } just runs\n    every { cameraPlugin.unregisterAnimators(any()) } just runs\n\n    every { transitionFactory.transitionFromHighZoomToLowZoom(any(), any()) } returns animatorSet\n    every { transitionFactory.transitionFromLowZoomToHighZoom(any(), any()) } returns animatorSet\n    every { animatorSet.addListener(any()) } just runs\n    every { animatorSet.childAnimations } returns arrayListOf(animator)\n    every { animatorSet.start() } just runs\n    every { animatorSet.cancel() } just runs\n    every { animator.addListener(any()) } just runs\n    every { animator.type } returns CameraAnimatorType.BEARING\n    every { animator.setObjectValues(0.0, 0.0) } just runs\n\n    defaultTransition = DefaultViewportTransitionImpl(\n      delegateProvider,\n      options = DefaultViewportTransitionOptions.Builder().build(),\n      transitionFactory\n    )\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(CAMERA_ANIMATIONS_UTILS)\n    unmockkAll()\n  }\n\n  @Test\n  fun testRun() {\n    every { transitionFactory.transitionFromHighZoomToLowZoom(any(), any()) } returns animatorSet\n    every { transitionFactory.transitionFromLowZoomToHighZoom(any(), any()) } returns animatorSet\n    every { targetState.observeDataSource(any()) } returns cancelable\n    every { completionListener.onComplete(any()) } just runs\n\n    defaultTransition.run(targetState, completionListener)\n    verify { targetState.observeDataSource(capture(dataObserverSlot)) }\n    // verify the default state keep getting the data point and returned true\n    assertTrue(dataObserverSlot.captured.onNewData(cameraOptions))\n\n    verifySequence {\n      animatorSet.addListener(capture(animatorSetListenerSlot))\n      animatorSet.childAnimations\n      animator.addListener(capture(animatorListenerSlot))\n      cameraPlugin.anchor\n      cameraPlugin.anchor = null\n      animatorSet.childAnimations\n      cameraPlugin.registerAnimators(animator)\n      animatorSet.start()\n    }\n\n    // send second data point, should keep getting more data updates\n    assertTrue(dataObserverSlot.captured.onNewData(cameraOptions))\n    verifyOrder {\n      animator.type\n      animator.setObjectValues(0.0, 0.0)\n    }\n    verify(exactly = 1) { animator.setObjectValues(0.0, 0.0) }\n\n    // finish the animator, should keep getting further data points and setCamera immediately\n    animatorListenerSlot.captured.onAnimationEnd(animator)\n    assertTrue(dataObserverSlot.captured.onNewData(cameraOptions))\n    verify(exactly = 1) { animator.setObjectValues(0.0, 0.0) }\n    verify(exactly = 1) { mapCameraManagerDelegate.setCamera(cameraOptions { bearing(cameraOptions.bearing) }) }\n\n    // try to notify if animation is finished successfully\n    animatorSetListenerSlot.captured.onAnimationEnd(mockk())\n    // should stop observing data source and return false\n    assertFalse(dataObserverSlot.captured.onNewData(cameraOptions))\n    verify(exactly = 2) { mapCameraManagerDelegate.setCamera(cameraOptions { bearing(cameraOptions.bearing) }) }\n    // verify cleanup\n    verify { cameraPlugin.unregisterAnimators(animator) }\n    verify { completionListener.onComplete(true) }\n    verify { cameraPlugin.anchor = cachedAnchor }\n  }\n\n  @Test\n  fun testRunCanceled() {\n    every { transitionFactory.transitionFromHighZoomToLowZoom(any(), any()) } returns animatorSet\n    every { transitionFactory.transitionFromLowZoomToHighZoom(any(), any()) } returns animatorSet\n    every { targetState.observeDataSource(any()) } returns cancelable\n    every { completionListener.onComplete(any()) } just runs\n\n    val transitionCancelable = defaultTransition.run(targetState, completionListener)\n    verify { targetState.observeDataSource(capture(dataObserverSlot)) }\n    // verify the default state keep getting the data point and returned true\n    assertTrue(dataObserverSlot.captured.onNewData(cameraOptions))\n\n    verifySequence {\n      animatorSet.addListener(capture(animatorSetListenerSlot))\n      animatorSet.childAnimations\n      animator.addListener(capture(animatorListenerSlot))\n      cameraPlugin.anchor\n      cameraPlugin.anchor = null\n      animatorSet.childAnimations\n      cameraPlugin.registerAnimators(animator)\n      animatorSet.start()\n    }\n    // try to notify if animation is canceled\n    transitionCancelable.cancel()\n    verify { animatorSet.cancel() }\n    verify { cancelable.cancel() }\n    animatorSetListenerSlot.captured.onAnimationCancel(animator)\n    animatorSetListenerSlot.captured.onAnimationEnd(animator)\n    animatorListenerSlot.captured.onAnimationCancel(animator)\n    animatorListenerSlot.captured.onAnimationEnd(animator)\n    // should stop observing data source and return false\n    assertFalse(dataObserverSlot.captured.onNewData(cameraOptions))\n    verify(exactly = 0) { mapCameraManagerDelegate.setCamera(cameraOptions { bearing(cameraOptions.bearing) }) }\n    verify { cameraPlugin.unregisterAnimators(animator) }\n    verify { cameraPlugin.anchor = cachedAnchor }\n  }\n\n  @Test\n  fun testRunAnimatorInterrupted() {\n    every { transitionFactory.transitionFromHighZoomToLowZoom(any(), any()) } returns animatorSet\n    every { transitionFactory.transitionFromLowZoomToHighZoom(any(), any()) } returns animatorSet\n    every { targetState.observeDataSource(any()) } returns cancelable\n    every { completionListener.onComplete(any()) } just runs\n\n    val cancelable = defaultTransition.run(targetState, completionListener)\n    verify { targetState.observeDataSource(capture(dataObserverSlot)) }\n    // verify the default state keep getting the data point and returned true\n    assertTrue(dataObserverSlot.captured.onNewData(cameraOptions))\n\n    verifySequence {\n      animatorSet.addListener(capture(animatorSetListenerSlot))\n      animatorSet.childAnimations\n      animator.addListener(capture(animatorListenerSlot))\n      cameraPlugin.anchor\n      cameraPlugin.anchor = null\n      animatorSet.childAnimations\n      cameraPlugin.registerAnimators(animator)\n      animatorSet.start()\n    }\n    // try to notify if animation is canceled\n    animatorSetListenerSlot.captured.onAnimationCancel(mockk())\n    animatorSetListenerSlot.captured.onAnimationEnd(mockk())\n    // should stop observing data source and return false\n    assertFalse(dataObserverSlot.captured.onNewData(cameraOptions))\n    verify { cameraPlugin.unregisterAnimators(animator) }\n    verify { completionListener.onComplete(false) }\n    verify { cameraPlugin.anchor = cachedAnchor }\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/test/kotlin/com/mapbox/maps/plugin/viewport/transition/ImmediateViewportTransitionImplTest.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.viewport.CAMERA_ANIMATIONS_UTILS\nimport com.mapbox.maps.plugin.viewport.CompletionListener\nimport com.mapbox.maps.plugin.viewport.ViewportPluginImpl\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.plugin.viewport.state.ViewportStateDataObserver\nimport io.mockk.every\nimport io.mockk.just\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.runs\nimport io.mockk.slot\nimport io.mockk.unmockkAll\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport io.mockk.verifySequence\nimport org.junit.After\nimport org.junit.Assert.assertFalse\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass ImmediateViewportTransitionImplTest {\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private val mapPluginProviderDelegate = mockk<MapPluginProviderDelegate>()\n  private val cameraPlugin = mockk<CameraAnimationsPlugin>()\n  private val targetState = mockk<ViewportState>()\n  private val completionListener = mockk<CompletionListener>()\n  private val dataObserverSlot = slot<ViewportStateDataObserver>()\n  private val cancelable = mockk<Cancelable>()\n  private val cameraOptions = mockk<CameraOptions>()\n  private lateinit var immediateTransition: ImmediateViewportTransition\n\n  @Before\n  fun setup() {\n    every { delegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    every { cancelable.cancel() } just runs\n    mockkStatic(CAMERA_ANIMATIONS_UTILS)\n    every { mapPluginProviderDelegate.camera } returns cameraPlugin\n    every { cameraPlugin.easeTo(any(), any()) } returns Cancelable { }\n    every { cameraPlugin.anchor } returns ScreenCoordinate(0.0, 0.0)\n    every { cameraPlugin.anchor = any() } just runs\n    immediateTransition = ImmediateViewportTransition(delegateProvider)\n  }\n\n  @After\n  fun cleanUp() {\n    unmockkStatic(CAMERA_ANIMATIONS_UTILS)\n    unmockkAll()\n  }\n\n  @Test\n  fun testRun() {\n    every { targetState.observeDataSource(any()) } returns cancelable\n    every { completionListener.onComplete(any()) } just runs\n\n    immediateTransition.run(targetState, completionListener)\n    verify { targetState.observeDataSource(capture(dataObserverSlot)) }\n    // verify the default state only get the first data point and returned false\n    assertFalse(dataObserverSlot.captured.onNewData(cameraOptions))\n\n    verifySequence {\n      cameraPlugin.anchor\n      cameraPlugin.anchor = null\n      cameraPlugin.easeTo(\n        cameraOptions,\n        MapAnimationOptions.mapAnimationOptions {\n          startDelay(0)\n          duration(0)\n          owner(ViewportPluginImpl.VIEWPORT_CAMERA_OWNER)\n        }\n      )\n      cameraPlugin.anchor = ScreenCoordinate(0.0, 0.0)\n    }\n    verify { completionListener.onComplete(true) }\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/test/kotlin/com/mapbox/maps/plugin/viewport/transition/MapboxViewportTransitionFactoryTest.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport android.animation.AnimatorSet\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.camera\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\nimport com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate\nimport com.mapbox.maps.plugin.viewport.CAMERA_ANIMATIONS_UTILS\nimport com.mapbox.maps.plugin.viewport.DEFAULT_STATE_ANIMATION_DURATION_MS\nimport com.mapbox.maps.plugin.viewport.DEFAULT_TRANSITION_MAX_DURATION_MS\nimport com.mapbox.maps.plugin.viewport.TRANSITION_UTILS\nimport io.mockk.every\nimport io.mockk.mockk\nimport io.mockk.mockkStatic\nimport io.mockk.slot\nimport io.mockk.unmockkStatic\nimport io.mockk.verify\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass MapboxViewportTransitionFactoryTest {\n  private val mapCameraDelegate = mockk<MapCameraManagerDelegate>()\n  private val mapPluginProviderDelegate = mockk<MapPluginProviderDelegate>()\n  private val cameraPlugin = mockk<CameraAnimationsPlugin>()\n  private val delegateProvider = mockk<MapDelegateProvider>()\n  private val animatorSet = mockk<AnimatorSet>()\n  private val constrainedSet = mockk<AnimatorSet>()\n  private lateinit var transitionsFactory: MapboxViewportTransitionFactory\n\n  @Before\n  fun setup() {\n    mockkStatic(TRANSITION_UTILS)\n    mockkStatic(CAMERA_ANIMATIONS_UTILS)\n    every { delegateProvider.mapPluginProviderDelegate } returns mapPluginProviderDelegate\n    every { mapPluginProviderDelegate.camera } returns cameraPlugin\n    every { delegateProvider.mapCameraManagerDelegate } returns mapCameraDelegate\n    every { createAnimatorSet(any()) } returns animatorSet\n    every { animatorSet.constrainDurationTo(any()) } returns constrainedSet\n    every { screenDistanceFromMapCenterToTarget(mapCameraDelegate, any(), any()) } returns 1000.0\n    every {\n      cameraPlugin.createCenterAnimator(\n        options = any(),\n        useShortestPath = any(),\n        block = any()\n      )\n    } returns mockk()\n    every { cameraPlugin.createBearingAnimator(any(), any(), any()) } returns mockk()\n    every { cameraPlugin.createPitchAnimator(any(), any()) } returns mockk()\n    every { cameraPlugin.createZoomAnimator(any(), any()) } returns mockk()\n    every { cameraPlugin.createPaddingAnimator(any(), any()) } returns mockk()\n    transitionsFactory = MapboxViewportTransitionFactory(delegateProvider)\n  }\n\n  @Test\n  fun `transitionFromLowZoomToHighZoom - bearing and center is normalized`() {\n    every { mapCameraDelegate.cameraState } returns mockk {\n      every { bearing } returns 10.0\n      every { center } returns Point.fromLngLat(-170.0, 0.0)\n    }\n    val cameraOptions = CameraOptions.Builder()\n      .bearing(350.0)\n      .center(Point.fromLngLat(170.0, 10.0))\n      .build()\n\n    val valueSlot = slot<CameraAnimatorOptions<Double>>()\n    every {\n      cameraPlugin.createBearingAnimator(capture(valueSlot), any(), any())\n    } returns mockk()\n    transitionsFactory.transitionFromLowZoomToHighZoom(\n      cameraOptions,\n      DEFAULT_TRANSITION_MAX_DURATION_MS\n    )\n\n    assertEquals(-10.0, valueSlot.captured.targets.last(), EPS)\n    verify { normalizeBearing(10.0, 350.0) }\n    verify {\n      cameraPlugin.createCenterAnimator(\n        options = any(),\n        useShortestPath = true,\n        block = any()\n      )\n    }\n  }\n\n  @Test\n  fun `transitionFromHighZoomToLowZoom - bearing and center is normalized`() {\n    every { mapCameraDelegate.cameraState } returns mockk {\n      every { bearing } returns 10.0\n      every { center } returns Point.fromLngLat(-170.0, 0.0)\n    }\n\n    val cameraOptions = CameraOptions.Builder()\n      .bearing(350.0)\n      .center(Point.fromLngLat(170.0, 10.0))\n      .build()\n\n    val valueSlot = slot<CameraAnimatorOptions<Double>>()\n    every {\n      cameraPlugin.createBearingAnimator(capture(valueSlot), any(), any())\n    } returns mockk()\n    transitionsFactory.transitionFromHighZoomToLowZoom(\n      cameraOptions,\n      DEFAULT_TRANSITION_MAX_DURATION_MS\n    )\n\n    assertEquals(-10.0, valueSlot.captured.targets.last(), EPS)\n    verify { normalizeBearing(10.0, 350.0) }\n    verify {\n      cameraPlugin.createCenterAnimator(\n        options = any(),\n        useShortestPath = true,\n        block = any()\n      )\n    }\n  }\n\n  @Test\n  fun `transitionLinear - bearing and center is normalized`() {\n    every { mapCameraDelegate.cameraState } returns mockk {\n      every { bearing } returns 10.0\n      every { center } returns Point.fromLngLat(-170.0, 0.0)\n    }\n    val cameraOptions = CameraOptions.Builder()\n      .bearing(350.0)\n      .center(Point.fromLngLat(170.0, 10.0))\n      .build()\n\n    val valueSlot = slot<CameraAnimatorOptions<Double>>()\n    every {\n      cameraPlugin.createBearingAnimator(capture(valueSlot), any(), any())\n    } returns mockk()\n    transitionsFactory.transitionLinear(cameraOptions, DEFAULT_STATE_ANIMATION_DURATION_MS)\n\n    assertEquals(-10.0, valueSlot.captured.targets.last(), EPS)\n    verify { normalizeBearing(10.0, 350.0) }\n    verify {\n      cameraPlugin.createCenterAnimator(\n        options = any(),\n        useShortestPath = true,\n        block = any()\n      )\n    }\n  }\n\n  @Test\n  fun `transitionFromLowZoomToHighZoom - duration constrained`() {\n    every { mapCameraDelegate.cameraState } returns mockk {\n      every { center } returns mockk()\n      every { zoom } returns 0.0\n      every { bearing } returns 0.0\n    }\n\n    val animator =\n      transitionsFactory.transitionFromLowZoomToHighZoom(\n        TEST_CAMERA_OPTIONS,\n        DEFAULT_TRANSITION_MAX_DURATION_MS\n      )\n\n    verify { animatorSet.constrainDurationTo(DEFAULT_TRANSITION_MAX_DURATION_MS) }\n    assertEquals(constrainedSet, animator)\n  }\n\n  @Test\n  fun `transitionFromHighZoomToLowZoom - duration constrained`() {\n    every { mapCameraDelegate.cameraState } returns mockk {\n      every { center } returns mockk()\n      every { zoom } returns 0.0\n      every { bearing } returns 0.0\n    }\n\n    val animator =\n      transitionsFactory.transitionFromHighZoomToLowZoom(\n        TEST_CAMERA_OPTIONS,\n        DEFAULT_TRANSITION_MAX_DURATION_MS\n      )\n\n    verify { animatorSet.constrainDurationTo(DEFAULT_TRANSITION_MAX_DURATION_MS) }\n    assertEquals(constrainedSet, animator)\n  }\n\n  @After\n  fun tearDown() {\n    unmockkStatic(TRANSITION_UTILS)\n    unmockkStatic(CAMERA_ANIMATIONS_UTILS)\n  }\n\n  private companion object {\n    const val EPS = 0.0000000001\n    val TEST_CAMERA_OPTIONS: CameraOptions = CameraOptions.Builder()\n      .center(Point.fromLngLat(0.0, 0.0))\n      .zoom(0.0)\n      .bearing(0.0)\n      .pitch(0.0)\n      .padding(EdgeInsets(0.0, 0.0, 0.0, 0.0))\n      .build()\n  }\n}"
  },
  {
    "path": "plugin-viewport/src/test/kotlin/com/mapbox/maps/plugin/viewport/transition/TransitionUtilsTest.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport android.animation.ValueAnimator\nimport io.mockk.mockk\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.RobolectricTestRunner\n\n@RunWith(RobolectricTestRunner::class)\nclass TransitionUtilsTest {\n  @Test\n  fun `test normalizeBearing 1`() {\n    val expected = 0.0\n\n    val actual = normalizeBearing(\n      currentBearing = 10.0,\n      targetBearing = 0.0\n    )\n\n    assertEquals(expected, actual, EPS)\n  }\n\n  @Test\n  fun `test normalizeBearing 2`() {\n    val expected = 10.0\n\n    val actual = normalizeBearing(\n      currentBearing = 0.0,\n      targetBearing = 10.0\n    )\n\n    assertEquals(expected, actual, EPS)\n  }\n\n  @Test\n  fun `test normalizeBearing 3`() {\n    val expected = -0.5\n\n    val actual = normalizeBearing(\n      currentBearing = 1.0,\n      targetBearing = 359.5\n    )\n\n    assertEquals(expected, actual, EPS)\n  }\n\n  @Test\n  fun `test normalizeBearing 4`() {\n    val expected = 360.0\n\n    val actual = normalizeBearing(\n      currentBearing = 359.5,\n      targetBearing = 0.0\n    )\n\n    assertEquals(expected, actual, EPS)\n  }\n\n  @Test\n  fun `test normalizeBearing 5`() {\n    val expected = 361.0\n\n    val actual = normalizeBearing(\n      currentBearing = 359.5,\n      targetBearing = 1.0\n    )\n\n    assertEquals(expected, actual, EPS)\n  }\n\n  @Test\n  fun `test normalizeBearing 6`() {\n    val expected = 110.0\n\n    val actual = normalizeBearing(\n      currentBearing = 50.0,\n      targetBearing = 110.0\n    )\n\n    assertEquals(expected, actual, EPS)\n  }\n\n  @Test\n  fun `test normalizeBearing 7`() {\n    val expected = 0.0\n\n    val actual = normalizeBearing(\n      currentBearing = -0.0,\n      targetBearing = 360.0\n    )\n\n    assertEquals(expected, actual, EPS)\n  }\n\n  @Test\n  fun `test normalizeBearing 8`() {\n    val expected = -0.0\n\n    val actual = normalizeBearing(\n      currentBearing = -0.0,\n      targetBearing = 0.0\n    )\n\n    assertEquals(expected, actual, EPS)\n  }\n\n  @Test\n  fun `test normalizeBearing 9`() {\n    val expected = 0.0\n\n    val actual = normalizeBearing(\n      currentBearing = 27.254667247679752,\n      targetBearing = 0.0\n    )\n\n    assertEquals(expected, actual, 1E-14)\n  }\n\n  @Test\n  fun `test createAnimatorSet`() {\n    val animators = listOf<Animator>(mockk(), mockk())\n    val expected = AnimatorSet().apply {\n      playTogether(*(animators.toTypedArray()))\n    }.childAnimations\n\n    val actual = createAnimatorSet(animators).childAnimations\n\n    assertEquals(expected, actual)\n  }\n\n  @Test\n  fun `test constraintDurationTo - no adjustments`() {\n    val animators = listOf<Animator>(\n      ValueAnimator.ofFloat().apply {\n        startDelay = 700\n        duration = 1300\n      },\n      ValueAnimator.ofFloat().apply {\n        startDelay = 0\n        duration = 1000\n      }\n    )\n    val expected = createAnimatorSet(animators).childAnimations\n\n    val actual = createAnimatorSet(animators)\n      .constrainDurationTo(2000)\n      .childAnimations\n\n    assertEquals(expected, actual)\n  }\n\n  @Test\n  fun `test constraintDurationTo - adjustment needed`() {\n    val originalAnimators = listOf<Animator>(\n      ValueAnimator.ofFloat().apply {\n        startDelay = 1000\n        duration = 3000\n      },\n      ValueAnimator.ofFloat().apply {\n        startDelay = 0\n        duration = 1000\n      }\n    )\n    val expectedAnimators = listOf<Animator>(\n      ValueAnimator.ofFloat().apply {\n        startDelay = 500\n        duration = 1500\n      },\n      ValueAnimator.ofFloat().apply {\n        startDelay = 0\n        duration = 500\n      }\n    )\n    val expected = createAnimatorSet(expectedAnimators).childAnimations\n\n    val actual = createAnimatorSet(originalAnimators)\n      .constrainDurationTo(2000)\n      .childAnimations\n\n    assertEquals(expected[0].startDelay, actual[0].startDelay)\n    assertEquals(expected[0].duration, actual[0].duration)\n    assertEquals(expected[1].startDelay, actual[1].startDelay)\n    assertEquals(expected[1].duration, actual[1].duration)\n  }\n\n  private companion object {\n    private const val EPS = 0.000001\n  }\n}"
  },
  {
    "path": "scripts/check-permissions.py",
    "content": "#!/usr/bin/env python3\n\nimport argparse\nimport subprocess\nimport json\n\nUSES_PERMISSION = \"uses-permission: name=\"\n\n\ndef load_apk_permissions(args):\n    permissions = []\n    shell = subprocess.Popen([\"aapt\", \"d\", \"permissions\", args.apk], stdout=subprocess.PIPE).stdout\n    for output in shell:\n        line = output.decode('utf-8')\n        if USES_PERMISSION in line:\n            permission = line.partition(USES_PERMISSION)[2].strip()[1:-1]\n            permissions.append(permission)\n    permissions.sort()\n    return permissions\n\n\ndef load_file(args):\n    with open(args.file, \"r\") as read_file:\n        return json.load(read_file)\n\n\ndef update_file(args, permissions):\n    with open(args.file, \"w\") as write_file:\n        json.dump(permissions, write_file, indent=4, sort_keys=True)\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(\n        description=\"Check permission change.\")\n    parser.add_argument(\"--apk\", required=True,\n            help=\"Provide the path to the APK to validate permissions.\")\n    parser.add_argument(\"--file\", default=\"app/permission.json\",\n            help=\"File path to lookup/update stored permissions.\")\n    parser.add_argument(\"--update\", default=False,\n            help=\"Update the permission file\")\n    args = parser.parse_args()\n\n    print(\"Utility to validate permissions of an application\\n\")\n    print(f\"Loading apk permissions {args.apk}:\\n\")\n    permissions = load_apk_permissions(args)\n    print(f\"{json.dumps(permissions, indent=4)}\\n\")\n\n    if args.update:\n        print(f\"Updating permissions file: {args.file}\")\n        update_file(args, permissions)\n    else:\n        print(f\"Checking if permissions file({args.file}) matches\\n\")\n        expected = load_file(args)\n        assert expected == permissions, \"Permission check failed, the permission file is outdated and you need to rerun the script with the --update true to update the baseline file\"\n        print(\"Success, exiting..\")\n"
  },
  {
    "path": "scripts/checksum-base.sh",
    "content": "#!/usr/bin/env bash\n\nRESULT_FILE=$1\nFILES=()\n\nif [ -f $RESULT_FILE ]; then\n  rm $RESULT_FILE\nfi\n\nFILE=\"`basename \"${RESULT_FILE}\"`\"\nDIR=\"`dirname \"${RESULT_FILE}\"`\"\nmkdir -p \"${DIR}\" && touch \"${DIR}/${FILE}\"\n\nadd_files() {\n    find $1 -type f -name $2  -print0 >tmpfile\n    while IFS=  read -r -d $'\\0'; do\n        FILES+=(\"$REPLY\")\n    done <tmpfile\n    rm -f tmpfile\n}\n\nchecksum_file() {\n    echo `openssl md5 $1 | awk '{print $2}'`\n}\n\ngenerate_checksums() {\n    for FILE in ${FILES[@]}; do\n    \techo `checksum_file $FILE` >> $RESULT_FILE\n    done\n\n    sort $RESULT_FILE -o $RESULT_FILE\n\n    echo \"New hash sum file:\"\n    cat $RESULT_FILE\n}\n"
  },
  {
    "path": "scripts/checksum.sh",
    "content": "#!/usr/bin/env bash\nsource scripts/checksum-base.sh\n\nadd_files . build.gradle.kts\nadd_files ./gradle/libs.versions.toml\nadd_files ./gradle/wrapper gradle-wrapper.properties\n\ngenerate_checksums\n"
  },
  {
    "path": "scripts/ci-circleci-start-pipeline.py",
    "content": "#!/usr/bin/env python3\n\n# Implements https://circleci.com/docs/api/v2/#trigger-a-new-pipeline\n\nimport argparse\nimport os\nimport requests\nimport sys\nimport datetime\n\nMAIN_BRANCH_NAME = \"main\"\n\ndef str2bool(v):\n    if isinstance(v, bool):\n        return v\n    if v.lower() in ('yes', 'true', 't', 'y', '1'):\n        return True\n    elif v.lower() in ('no', 'false', 'f', 'n', '0'):\n        return False\n    else:\n        raise argparse.ArgumentTypeError('Boolean value expected.')\n\n\ndef TriggerPipeline(slug, token, branch, params):\n    url = \"https://circleci.com/api/v2/project/github/%s/pipeline\" % (slug)\n\n    headers = {\n        \"Content-Type\": \"application/json\",\n        \"Accept\": \"application/json\",\n    }\n\n    data = {\n        \"parameters\": params\n    }\n\n    if branch:\n        data[\"branch\"] = branch\n\n    r = requests.post(url, auth=(token, \"\"), headers=headers, json=data)\n\n    if r.status_code != 201 and r.status_code != 200:\n        print(\"Error triggering the CircleCI: %s.\" % r.json()[\"message\"])\n        sys.exit(1)\n\n\ndef Main():\n    token = os.getenv(\"CIRCLE_API_TOKEN\")\n    hash = os.getenv(\"CIRCLE_SHA1\", default=\"1234567890\")\n    username = os.getenv(\"CIRCLE_PROJECT_USERNAME\", default=\"username\")\n    project = os.getenv(\"CIRCLE_PROJECT_REPONAME\", default=\"repository\")\n\n    parser = argparse.ArgumentParser(\n        description=\"Creates CircleCI jobs and waits for the result.\")\n\n    parser.add_argument(\"--token\", default=token,\n            help=\"CircleCI token, otherwise environment CIRCLE_API_TOKEN.\")\n    parser.add_argument(\"--origin-slug\", default=\"mapbox/mapbox-gl-native-internal\",\n            help=\"Origin repository, otherwise CIRCLE_PROJECT_USERNAME/CIRCLE_PROJECT_REPONAME.\")\n    parser.add_argument(\"--target-slug\", default=\"\".join((username, '/', project)),\n            help=\"Repository to trigger the pipeline, example: mapbox/mapbox-gl-native-android.\")\n    parser.add_argument(\"--hash\", default=hash,\n            help=\"Commit git hash that triggered the pipeline, otherwise environment CIRCLE_SHA1.\")\n    parser.add_argument(\"--branch\",\n            help=\"Build a specific branch, otherwise it will build the default branch.\")\n    parser.add_argument(\"--current-branch\",\n            help=\"Current branch name.\")\n    parser.add_argument('--created', help=\"Provide a date string in ISO 8601 format (eg. 2030-12-30T09:10:20.304050)\")\n    parser.add_argument(\"--pixel_match_public\", default=True)\n    parser.add_argument('--sync-internal', default=False, help=\"Sync internal CI on merge\")\n\n    args = parser.parse_args()\n\n    if not args.token:\n        print(\"CircleCI token not set. Use --token or set CIRCLE_API_TOKEN.\")\n        sys.exit(1)\n\n    created = args.created\n    if not created:\n        created = datetime.datetime.utcnow().isoformat()\n\n    if args.sync_internal:\n        params = {\n            \"mapbox_sync_branch\": args.current_branch\n        }\n    else:\n        params = {\n            \"mapbox_android_upstream\": True,\n            \"mapbox_android_hash\": args.hash,\n            \"mapbox_merge_main\": args.current_branch == MAIN_BRANCH_NAME,\n            \"benchmark_date\": created,\n            \"pixel_match_public\": str2bool(args.pixel_match_public)\n        }\n    params[\"mapbox_slug\"] = args.origin_slug\n\n    TriggerPipeline(args.target_slug, args.token, args.branch, params)\n    return 0\n\nif __name__ == \"__main__\":\n    Main()"
  },
  {
    "path": "scripts/ci-e2e-job-trigger-checker.sh",
    "content": "#!/usr/bin/env bash\n#\n# Usage:\n#   ./scripts/ci-e2e-job-trigger-checker.sh\n#\n# This script will query information about the current PR when used in CircleCI environment.\n# The information is used to decide whether the end-to-end compatibility testing pipeline needs to be launched.\n#\n\nif [ \"$CIRCLE_TAG\" != \"\" ]; then\n    echo \"We are on tag $CIRCLE_TAG, trigger all the bots.\"\n    exit 0\nfi\n\nexport GITHUB_TOKEN=$(mbx-ci github reader token)\n\nIS_BRANCH_PROTECTED=$(gh api repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/branches/$CIRCLE_BRANCH --jq .protected)\nif [ $IS_BRANCH_PROTECTED != \"false\" ]; then\n    echo \"We are on protected branch, don't trigger the bots.\"\n    exit 1\nfi\n\nif [ -z \"$CIRCLE_PULL_REQUEST\" ]; then\n    echo \"No pull request created yet. Please create pull request in order to finish CI.\"\n    exit 1\nfi\n\necho \"Checking PR $CIRCLE_PULL_REQUEST\"\n\nCOMMIT_MESSAGE=$(gh api repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/commits/$CIRCLE_SHA1 --jq .commit.message)\n#echo $COMMIT_MESSAGE\n\nif [ -z \"${COMMIT_MESSAGE##*\"run_e2e\"*}\"  ]; then\n    echo \"Trigger downstream E2E bots due to run_e2e request in commit.\"\n    exit 0\nfi\n\nLABELS=$(gh pr view --repo $CIRCLE_REPOSITORY_URL $CIRCLE_PULL_REQUEST --json labels)\n#echo $LABELS\n\nif [[ \"$LABELS\" == *\"run_e2e\"* ]]; then\n    echo \"E2E requested in PR labels.\"\n    exit 0\nfi\n\necho \"No need to trigger downstream E2E bots.\"\nexit 1\n"
  },
  {
    "path": "scripts/ci-github-set-commit-status.py",
    "content": "#!/usr/bin/env python3\n\n# Implements https://developer.github.com/v3/repos/statuses/#create-a-status\n\nimport argparse\nimport os\nimport requests\nimport sys\n\n\ndef SetCommitStatus(slug, hash, token, params):\n    url = \"https://api.github.com/repos/%s/statuses/%s\" % (slug, hash)\n\n    headers = {\n        \"Authorization\": \"token %s\" % token\n    }\n\n    r = requests.post(url, headers=headers, json=params)\n\n    if r.status_code != 201:\n        print(\"Error setting commit status: %s.\" % r.status_code)\n        sys.exit(1)\n\n\ndef Main():\n    token = os.getenv(\"GITHUB_ACCESS_TOKEN\")\n    url = os.getenv(\"CIRCLE_BUILD_URL\", default=\"http://mapbox.com\")\n    context = \"internal: \" + os.getenv(\"CIRCLE_JOB\", default=\"default\")\n\n    parser = argparse.ArgumentParser(\n        description=\"Sets the status of a commit on GitHUB.\")\n\n    parser.add_argument(\"--token\", default=token,\n            help=\"GitHub token, otherwise environment GITHUB_API_TOKEN. Needs repo:status scope.\")\n    parser.add_argument(\"--slug\", default=\"mapbox/mapbox-gl-native\",\n            help=\"Repository slug, example: mapbox/mapbox-gl-native.\")\n    parser.add_argument(\"--hash\", required=True,\n            help=\"Commit git hash.\")\n    parser.add_argument(\"--success\", dest=\"success\", action=\"store_true\",\n            help=\"The status of the commit, 'failure' if not set.\")\n    parser.add_argument(\"--pending\", dest=\"pending\", action=\"store_true\",\n            help=\"The status of the commit, 'failure' if not set.\")\n    parser.add_argument(\"--url\", default=url,\n            help=\"URL to associate with this status.\")\n    parser.add_argument(\"--description\",\n            help=\"A short description of the status.\")\n    parser.add_argument(\"--context\", default=context,\n            help=\"A string label to differentiate this status.\")\n\n    args = parser.parse_args()\n\n    if not args.token:\n        print(\"GitHub token not set. Use --token or set GITHUB_ACCESS_TOKEN.\")\n        sys.exit(1)\n\n    state = \"failure\"\n    description = \"Your tests failed on MapboxCI\"\n\n    if args.success:\n        state = \"success\"\n        description = \"Your tests passed on MapboxCI!\"\n    elif args.pending:\n        state = \"pending\"\n        description = \"MapboxCI is running your tests\"\n\n    if args.description:\n        description= args.description\n\n    params = {\n        \"state\": state,\n        \"target_url\": args.url,\n        \"description\": description,\n        \"context\": args.context\n    }\n\n    SetCommitStatus(args.slug, args.hash, args.token, params)\n\n    return 0\n\n\nif __name__ == \"__main__\":\n    Main()\n"
  },
  {
    "path": "scripts/ci-weekly-trigger.py",
    "content": "#!/usr/bin/env python3\n\n# Implements https://circleci.com/docs/api/v2/#trigger-a-new-pipeline\n\nimport argparse\nimport os\nimport requests\nimport sys\n\ndef TriggerPipeline(token, branch):\n    url = \"https://circleci.com/api/v2/project/github/mapbox/mapbox-maps-android/pipeline\"\n    headers = {\n        \"Content-Type\": \"application/json\",\n        \"Accept\": \"application/json\",\n    }\n\n    data = {\n        \"parameters\": {\n            \"weekly\": True\n        }\n    }\n\n    data[\"branch\"] = branch\n\n    r = requests.post(url, auth=(token, \"\"), headers=headers, json=data)\n\n    if r.status_code != 201 and r.status_code != 200:\n        print(\"Error triggering the CircleCI: %s.\" % r.json()[\"message\"])\n        sys.exit(1)\n\n\ndef Main():\n    parser = argparse.ArgumentParser(description=\"Creates CircleCI jobs and waits for the result.\")\n    parser.add_argument(\"--token\", default=os.getenv(\"CIRCLE_API_TOKEN\"),\n            help=\"CircleCI token, otherwise environment CIRCLE_API_TOKEN.\")\n    parser.add_argument(\"--branch\", default=\"main\",\n            help=\"Build a specific branch, otherwise it will build the default branch.\")\n    args = parser.parse_args()\n\n    if not args.token:\n        print(\"CircleCI token not set. Use --token or set CIRCLE_API_TOKEN.\")\n        sys.exit(1)\n\n    TriggerPipeline(args.token, args.branch)\n    return 0\n\nif __name__ == \"__main__\":\n    Main()"
  },
  {
    "path": "scripts/clean.sh",
    "content": "#!/bin/bash -eo pipefail\nrm -rf ./gradle/configuration.gradle \\\n      ./app/build \\\n    \t./app/.cxx \\\n    \t./vendor/mapbox-gl-native-internal/internal/platform/android/sdk/.cxx \\\n    \t./vendor/mapbox-gl-native-internal/internal/platform/android/sdk/build \\\n    \t./vendor/mapbox-gl-native-internal/internal/vendor/common/platform/android/common/.cxx \\\n    \t./vendor/mapbox-gl-native-internal/internal/vendor/common/platform/android/common/build\n# Clean all build files for plugins / modules / sdk / extensions\nfor SUBDIR in $(ls -d */| grep -E 'plugin|extension|module|sdk')\ndo\n  rm -rf ./$SUBDIR/build ./$SUBDIR/.cxx\ndone"
  },
  {
    "path": "scripts/install-pre-commit/install-pre-commit.sh",
    "content": "#!/usr/bin/env bash\n\n#\n# This installs a pre-commit that runs secret-shield.\n#\n\ncp scripts/install-pre-commit/pre-commit.sh ././.git/hooks/pre-commit\nchmod +x ././.git/hooks/pre-commit"
  },
  {
    "path": "scripts/install-pre-commit/pre-commit.sh",
    "content": "#!/usr/bin/env bash\n\n#\n# This file should be copied to .git/hooks/pre-commit by running `scripts/install-pre-commit/install-pre-commit.sh`\n#\n\nif [ -z `which secret-shield` ]; then\n    echo 'Please install secret-shield globally. https://github.com/mapbox/secret-shield'; exit;\nfi\n\nsecret-shield --pre-commit -C verydeep --enable \"Mapbox Public Key\" --disable \"High-entropy base64 string\" \"Short high-entropy string\" \"Long high-entropy string\""
  },
  {
    "path": "scripts/merge-gradle-dependency-output.py",
    "content": "import glob\n\n\ndef add_content(file_name):\n    with open(file_name) as f:\n        data = f.read()\n    return data\n\n\nresult = \"\"\nfiles = glob.glob('*/build/dependencyUpdates/report.txt')\nfor file_name in files:\n    result += add_content(file_name)\n\nwith open('merged_report.txt', 'w') as f:\n    f.write(result)\n"
  },
  {
    "path": "scripts/sanity-test/exclude-sanity-test-gen.json",
    "content": "[\n\n]"
  },
  {
    "path": "scripts/sanity-test/generate-sanity-test.js",
    "content": "'use strict';\n\nconst fs = require('fs');\nconst ejs = require('ejs');\n\nglobal.iff = function (condition, val) {\n  return condition() ? val : \"\";\n}\n\nglobal.camelize = function (str) {\n  return str.replace(/(?:^|-)(.)/g, function (_, x) {\n    return x.toUpperCase();\n  });\n}\n\nconst excludeClasses = JSON.parse(fs.readFileSync('scripts/sanity-test/exclude-sanity-test-gen.json', 'utf8'));\nconst appBasePath = 'app/src/main/java/com/mapbox/maps/testapp';\nconst testBasePath = 'app/src/androidTest/java/com/mapbox/maps/testapp/activity';\nconst subPackages = fs.readdirSync(appBasePath);\nconst ejsConversionTask = ejs.compile(fs.readFileSync('scripts/sanity-test/template-sanity-test.ejs', 'utf8'), {strict: true});\n\nif (!fs.existsSync(testBasePath)){\n  fs.mkdirSync(testBasePath);\n}\n\nconsole.log(\"\\nGenerating test activities:\\n\");\nvar generatedClasses = [];\nvar excludedClasses = [];\nfor(const subPackage of subPackages) {\n  if(!(subPackage.slice(-5) == '.java') && !(subPackage.slice(-3) == '.kt')) {\n    const activities = fs.readdirSync(appBasePath+'/'+subPackage);\n\n    for (const activity of activities) {\n      var activityName;\n      if (activity.slice(-5) === '.java') {\n        // .java file\n        activityName = activity.slice(0, -5);\n      } else {\n        // .kt file\n        activityName = activity.slice(0, -3);\n      }\n\n      // create path for test file\n      const filePath = testBasePath+\"/\"+subPackage+\"/\"+activityName+'Test.kt';\n\n      // try removing previous generated files\n      try {\n        fs.accessSync(filePath, fs.F_OK);\n        fs.unlinkSync(filePath);\n      } catch (e) {\n      }\n\n      // only generate test file if not part of exclude list + if contains Activity in name\n      if ((!(excludeClasses.indexOf(activityName) > -1)) && activityName.includes(\"Activity\")) {\n        // create directories for package\n        if (!fs.existsSync(testBasePath+\"/\"+subPackage)){\n            fs.mkdirSync(testBasePath+\"/\"+subPackage);\n        }\n        // write test\n        fs.writeFileSync(filePath, ejsConversionTask([activityName, subPackage]));\n        generatedClasses.push(activityName);\n      }else{\n        excludedClasses.push(activityName);\n      }\n    }\n  }\n}\n\nfor(const generatedClass of generatedClasses){\n  console.log(generatedClass+\"Test\");\n}\n\nconsole.log(\"\\nFinished generating \" + generatedClasses.length + \" activity sanity tests, excluded \" + excludeClasses.length + \" classes.\\n\");"
  },
  {
    "path": "scripts/sanity-test/template-sanity-test.ejs",
    "content": "<%\n  const activity = locals[0];\n  const subPackage = locals[1];\n-%>\n// This file is generated. Edit scripts/sanity-test/generate-sanity-test.js, then run `make generate-sanity-test`.\npackage com.mapbox.maps.testapp.activity.<%- subPackage %>\n\nimport android.os.Handler\nimport androidx.test.ext.junit.rules.ActivityScenarioRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport com.mapbox.maps.testapp.<%- subPackage %>.<%- activity %>\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.TimeoutException\n\n@RunWith(AndroidJUnit4::class)\n@LargeTest\nclass <%- activity %>Test {\n\n  @get:Rule\n  var activityRule: ActivityScenarioRule<<%- activity %>> =\n    ActivityScenarioRule(<%- activity %>::class.java)\n\n  @Test\n  fun sanity() {\n    val latch = CountDownLatch(1)\n    activityRule.scenario.onActivity {\n      it.runOnUiThread {\n        Handler().postDelayed({\n          latch.countDown()\n        }, 1250)\n      }\n    }\n    if (!latch.await(2500, TimeUnit.MILLISECONDS)) {\n      throw TimeoutException()\n    }\n  }\n}"
  },
  {
    "path": "scripts/semver-check.sh",
    "content": "#!/usr/bin/env bash\n\nset -eo pipefail\n\n#\n# Usage:\n#   ./scripts/semver-check.sh <current release version (empty for branches)> <previous release version> <api compat string (major|minor|patch)>\n#\n\nif [[ $# -ne 3 ]]; then\n    echo \"Incorrect number of parameters\"\n    exit 1\nfi\n\nTAGGED_RELEASE_VERSION=$1\nLAST_VERSION=$2\nAPI_COMPAT_LEVEL=$3\n\necho \"Semver-check TAGGED_RELEASE_VERSION:$TAGGED_RELEASE_VERSION, LAST_VERSION: $LAST_VERSION, API_COMPAT_LEVEL: $API_COMPAT_LEVEL\"\n# Checking if tagged release has API breaks\nif [[ ! -z ${TAGGED_RELEASE_VERSION} ]]; then\n    SEMVER_REGEX=\"(0|[1-9][0-9]*)\\\\.(0|[1-9][0-9]*)\\\\.(0|[1-9][0-9]*)(\\\\-[0-9A-Za-z-]+(\\\\.[0-9A-Za-z-]+)*)?(\\\\+[0-9A-Za-z-]+(\\\\.[0-9A-Za-z-]+)*)?\"\n    if [[ ${TAGGED_RELEASE_VERSION} =~ $SEMVER_REGEX ]]; then\n        newMajor=${BASH_REMATCH[1]}\n        newMinor=${BASH_REMATCH[2]}\n        newPatch=${BASH_REMATCH[3]}\n    else\n        echo \"Could not parse new release version (${TAGGED_RELEASE_VERSION})\" >&2\n        exit 1\n    fi\n\n    if [[ ${LAST_VERSION} =~ $SEMVER_REGEX ]]; then\n        oldMajor=${BASH_REMATCH[1]}\n        oldMinor=${BASH_REMATCH[2]}\n        oldPatch=${BASH_REMATCH[3]}\n    else\n        echo \"Could not parse old release version (${LAST_VERSION})\" >&2\n        exit 1\n    fi\n\n    if [[ ${newMajor} == $((oldMajor + 1)) ]]; then\n        echo \"Major API breaking change.\"\n    elif [[ ${newMajor} > $((oldMajor + 1)) ]] || [[ ${newMajor} < $((oldMajor)) ]] || [[ ${API_COMPAT_LEVEL} == \"major\" && ${newMajor} != $((oldMajor + 1)) ]]; then\n        echo \"Major version number changed incorrectly.\"\n        exit 1\n    elif [[ ${API_COMPAT_LEVEL} != \"major\" ]]; then\n        if [[ ${newMinor} < $((oldMinor)) ]]; then\n            echo \"Minor version must not be smaller than the old minor version.\"\n            exit 1\n        elif [[ ${newMinor} == $((oldMinor)) && ${newPatch} < $((oldPatch)) ]]; then\n            echo \"Patch version number must not be smaller than old patch version.\"\n            exit 1\n        fi\n    fi\nfi\necho \"Release tagged with correct version.\"\n"
  },
  {
    "path": "scripts/start-internal-release-pipeline.py",
    "content": "#!/usr/bin/env python3\n\n# Implements https://circleci.com/docs/api/v2/#trigger-a-new-pipeline\n\nimport argparse\nimport os\nimport requests\nimport sys\nimport datetime\n\ndef triggerPipeline(slug, token, branch, params):\n    url = \"https://circleci.com/api/v2/project/github/%s/pipeline\" % (slug)\n\n    headers = {\n        \"Content-Type\": \"application/json\",\n        \"Accept\": \"application/json\",\n    }\n\n    data = {\n        \"parameters\": params\n    }\n\n    if branch:\n        data[\"branch\"] = branch\n\n    r = requests.post(url, auth=(token, \"\"), headers=headers, json=data)\n\n    if r.status_code != 201 and r.status_code != 200:\n        print(\"Error triggering the CircleCI: %s.\" % r.json()[\"message\"])\n        sys.exit(1)\n\n\ndef main():\n    token = os.getenv(\"CIRCLE_API_TOKEN\")\n    hash = os.getenv(\"CIRCLE_SHA1\", default=\"1234567890\")\n    username = os.getenv(\"CIRCLE_PROJECT_USERNAME\", default=\"username\")\n    project = os.getenv(\"CIRCLE_PROJECT_REPONAME\", default=\"repository\")\n\n    parser = argparse.ArgumentParser(\n        description=\"Creates CircleCI jobs and waits for the result.\")\n\n    parser.add_argument(\"--token\", default=token,\n            help=\"CircleCI token, otherwise environment CIRCLE_API_TOKEN.\")\n    parser.add_argument(\"--origin-slug\", default=\"mapbox/mapbox-maps-android\",\n            help=\"Origin repository, otherwise CIRCLE_PROJECT_USERNAME/CIRCLE_PROJECT_REPONAME.\")\n    parser.add_argument(\"--target-slug\", default=\"\".join((username, '/', project)),\n            help=\"Repository to trigger the pipeline, example: mapbox/mapbox-gl-native-android.\")\n    parser.add_argument(\"--hash\", default=hash,\n            help=\"Commit git hash that triggered the pipeline, otherwise environment CIRCLE_SHA1.\")\n    parser.add_argument(\"--branch\",\n            help=\"Build a specific branch, otherwise it will build the default branch.\")\n    parser.add_argument(\"--release_tag\", required=True,\n            help=\"The release tag name, must provide.\")\n    parser.add_argument('--created', help=\"Provide a date string in ISO 8601 format (eg. 2030-12-30T09:10:20.304050)\")\n\n    args = parser.parse_args()\n\n    if not (args.token or args.token.strip()):\n        print(\"CircleCI token not set. Use --token or set CIRCLE_API_TOKEN.\")\n        sys.exit(1)\n\n    created = args.created\n    if not created:\n        created = datetime.datetime.utcnow().isoformat()\n\n    params = {\n        \"mapbox_android_upstream\": True,\n        \"mapbox_slug\": args.origin_slug,\n        \"mapbox_android_hash\": args.hash,\n        \"mapbox_release_tag\": args.release_tag,\n        \"benchmark_date\": created\n    }\n\n    triggerPipeline(slug = args.target_slug, token = args.token, branch = args.branch, params = params)\n\n    return 0\n\n\nif __name__ == \"__main__\":\n    main()"
  },
  {
    "path": "scripts/trigger-maps-documentation-deploy-steps.sh",
    "content": "#!/usr/bin/env bash\n\nset -euo pipefail\n\nfunction step { >&2 echo -e \"\\033[1m\\033[36m* $@\\033[0m\"; }\nfunction finish { >&2 echo -en \"\\033[0m\"; }\ntrap finish EXIT\n\nSDK_FLAVOR=${SDK_FLAVOR:-\"maps\"}\n\nstep \"Triggering automated site and documentation generation for ${SDK_FLAVOR} SDK ${VERSION_TAG}\"\n\n# No branch specified, so default branch will be used\nrequest_body=\"{\n  \\\"request\\\": {\n    \\\"message\\\": \\\"[${SDK_FLAVOR}] ${VERSION_TAG} automated site and documentation generation\\\",\n    \\\"config\\\": {\n      \\\"merge_mode\\\": \\\"deep_merge\\\",\n      \\\"env\\\": {\n        \\\"SDK_FLAVOR\\\": \\\"${SDK_FLAVOR}\\\",\n        \\\"RELEASE_TAG\\\": \\\"${VERSION_TAG}\\\"\n      }\n    }\n  }\n}\"\n\nstep \"Making request…\"\n\n# Request URL set to docs-sandbox while testing\ncurl -s -X POST \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Travis-API-Version: 3\" \\\n  -H \"Authorization: token ${TRAVISCI_API_TOKEN}\" \\\n  -d \"${request_body}\" \\\n  https://api.travis-ci.com/repo/mapbox%2F${DOCS_REPO}/requests"
  },
  {
    "path": "scripts/update-android-docs.sh",
    "content": "#!/usr/bin/env bash\n\nset -Eeuxo pipefail\n\n#\n# Requirements:\n#   Save github token into gh_token.txt in root directory to access the GitHub API [https://github.com/settings/tokens].\n#   Have following tools installed:\n#     - git        - if you are a developer, you've heard about it [man 1 git].\n#     - gh         - GitHub's official command line tool [https://github.com/cli/cli].\n#     - jq         - command-line JSON processor [https://github.com/stedolan/jq].\n#     - GNU getopt - cli option parser [man 1 getopt], out-of-the-box for GNU/Linux;\n#\n\nreadonly ANDROID_DOCS_DIRECTORY=\"android-docs-repo\"\nreadonly CONSTANTS_FILE=\"./src/constants.json\"\nreadonly MAP_VERSION_NUMBERS_FILE=\"./src/data/map-version-numbers.json\"\nreadonly BRANCH_WITH_DOCUMENTATION=\"publisher-production\"\n\nMAPS_SDK_VERSION=\nREVIEWERS=\n\nPROG=$(basename $0)\nSHORT_OPTS=s:h\nLONG_OPTS=sdk-version:,help\n\nfunction usage() {\n  message=\"Usage: $PROG -s SDK_VERSION \\\n           \\nParameters:\\\n           \\n  -s | --sdk-version       [version]                      Maps SDK version.\\\n           \\n  -h | --help                                             Shows this help message.\"\n  echo -e \"$message\"\n}\n\nif ! getopt --name \"$PROG\" --long $LONG_OPTS --options $SHORT_OPTS -- \"$@\" >/dev/null; then\n  echo \"$PROG: usage error (use -h or --help for help)\" >&2\n  exit 1\nfi\nARGS=$(getopt --name \"$PROG\" --long $LONG_OPTS --options $SHORT_OPTS -- \"$@\")\n\nwhile [ $# -gt 0 ]; do\n  case \"$1\" in\n      -s | --sdk-version) MAPS_SDK_VERSION=\"$2\"; shift;;\n      -r | --reviewers) REVIEWERS=\"$2\"; shift;;\n      -h | --help) usage; exit 0;;\n      --) shift; break;;\n  esac\n  shift\ndone\n\nif [ -z \"$MAPS_SDK_VERSION\" ]; then\n  echo -e \"ERROR: Map SDK version not defined.\\n\"\n  usage\n  exit 1\nfi\n\n#Split version name to remove the \"v\" prefix\nMAPS_SDK_VERSION=${MAPS_SDK_VERSION:1}\nread GITHUB_TOKEN < gh_token.txt\n\nfunction prepare_branch_with_documentation() {\n  INTERIM_BRANCH_WITH_DOCUMENTATION=\"${BRANCH_WITH_DOCUMENTATION}_${1}\"\n  git clone https://x-access-token:\"$GITHUB_TOKEN\"@github.com/mapbox/mapbox-maps-android.git -b $BRANCH_WITH_DOCUMENTATION ~/android-docs\n  unzip -qq -o -d ~/android-docs/release-docs release-docs/dokka-docs.zip\n  mkdir -p ~/android-docs/$1\n  cp -fr ~/android-docs/release-docs/htmlCollector/* ~/android-docs/$1\n  cd ~/android-docs\n  # Create new working branch with version (e.g. `publisher-production_10.999.0`)\n  git checkout -b $INTERIM_BRANCH_WITH_DOCUMENTATION\n  git add $1\n  git commit --quiet -m \"Add $1 API documentation.\"\n  git push --set-upstream origin $INTERIM_BRANCH_WITH_DOCUMENTATION --force\n  cd -\n}\n\nfunction prepare_branch_with_empty() {\n  cd ~/android-docs\n  INTERIM_BRANCH_WITH_DOCUMENTATION=\"${BRANCH_WITH_DOCUMENTATION}_${1}_empty\"\n  git checkout -b $INTERIM_BRANCH_WITH_DOCUMENTATION origin/$BRANCH_WITH_DOCUMENTATION\n  git commit --allow-empty -m \"empty commit\"\n  git push --set-upstream origin $INTERIM_BRANCH_WITH_DOCUMENTATION --force\n  cd -\n}\n\nfunction create_pull_request() {\n  cd ~/android-docs\n  CMD=\"gh pr create --title \\\"${1}\\\" --body \\\"cc: @mapbox/maps-android\\\"\"\n\n  if [ ! -z \"$REVIEWERS\" ]; then\n    CMD+=\" --reviewer ${REVIEWERS}\"\n  fi\n\n  if [ ! -z \"${2:-}\" ]; then\n    CMD+=\" --base ${BRANCH_WITH_DOCUMENTATION}\"\n  fi\n  eval $CMD\n  cd -\n}\n\ngh auth login --with-token < gh_token.txt\n\n# Generate docs, create branch and make PR with API documentation in the SDK repo.\nprepare_branch_with_documentation $MAPS_SDK_VERSION\ncreate_pull_request \"Add ${MAPS_SDK_VERSION} API documentation.\" $BRANCH_WITH_DOCUMENTATION\n\n# Create a pr with empty commit to trigger dos deploy\nprepare_branch_with_empty $MAPS_SDK_VERSION\ncreate_pull_request \"Trigger ${MAPS_SDK_VERSION} deploy.\" $BRANCH_WITH_DOCUMENTATION\n"
  },
  {
    "path": "sdk-base/.gitignore",
    "content": "/build"
  },
  {
    "path": "sdk-base/api/Release/metalava.txt",
    "content": "// Signature format: 3.0\npackage com.mapbox.maps {\n\n  public final class ClickInteraction<T extends com.mapbox.maps.interactions.FeaturesetFeature<?>> extends com.mapbox.maps.MapInteraction {\n    method public static com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction featureset(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction layer(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static operator com.mapbox.maps.ClickInteraction map(kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    field public static final com.mapbox.maps.ClickInteraction.Companion Companion;\n  }\n\n  public static final class ClickInteraction.Companion {\n    method public com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.MapInteraction featureset(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public com.mapbox.maps.MapInteraction layer(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public operator com.mapbox.maps.ClickInteraction map(kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n  }\n\n  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class DragInteraction<T extends com.mapbox.maps.interactions.FeaturesetFeature<?>> extends com.mapbox.maps.MapInteraction {\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static com.mapbox.maps.MapInteraction featureset(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static com.mapbox.maps.MapInteraction layer(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    field public static final com.mapbox.maps.DragInteraction.Companion Companion;\n  }\n\n  public static final class DragInteraction.Companion {\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public com.mapbox.maps.MapInteraction featureset(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @kotlin.jvm.JvmSynthetic public operator com.mapbox.maps.DragInteraction! invoke(kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,? extends java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,? extends kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,? extends kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public com.mapbox.maps.MapInteraction layer(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onDragBegin, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDrag, kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,kotlin.Unit> onDragEnd);\n  }\n\n  public final class ExtensionUtils {\n    method public static com.mapbox.maps.CameraOptions toCameraOptions(com.mapbox.maps.CameraState, com.mapbox.maps.ScreenCoordinate? anchor = null);\n    method public static com.mapbox.maps.CameraOptions toCameraOptions(com.mapbox.maps.CameraState);\n    method @com.mapbox.maps.MapboxDelicateApi public static com.mapbox.maps.Image toMapboxImage(android.graphics.Bitmap);\n  }\n\n  @kotlinx.parcelize.Parcelize public final class ImageHolder implements android.os.Parcelable {\n    method public static com.mapbox.maps.ImageHolder from(@DrawableRes int drawableId);\n    method public static com.mapbox.maps.ImageHolder from(android.graphics.Bitmap bitmap);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static com.mapbox.maps.ImageHolder from(com.mapbox.maps.Image image);\n    method public android.graphics.Bitmap? getBitmap();\n    method public Integer? getDrawableId();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public com.mapbox.maps.Image? getImage();\n    property public final android.graphics.Bitmap? bitmap;\n    property public final Integer? drawableId;\n    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final com.mapbox.maps.Image? image;\n    field public static final com.mapbox.maps.ImageHolder.Companion Companion;\n  }\n\n  public static final class ImageHolder.Companion {\n    method public com.mapbox.maps.ImageHolder from(@DrawableRes int drawableId);\n    method public com.mapbox.maps.ImageHolder from(android.graphics.Bitmap bitmap);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public com.mapbox.maps.ImageHolder from(com.mapbox.maps.Image image);\n  }\n\n  public final class LongClickInteraction<T extends com.mapbox.maps.interactions.FeaturesetFeature<?>> extends com.mapbox.maps.MapInteraction {\n    method public static com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction featureset(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction layer(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static operator com.mapbox.maps.LongClickInteraction map(kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    field public static final com.mapbox.maps.LongClickInteraction.Companion Companion;\n  }\n\n  public static final class LongClickInteraction.Companion {\n    method public com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.MapInteraction featureset(String id, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.MapInteraction featureset(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.MapInteraction layer(String id, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public com.mapbox.maps.MapInteraction layer(String id, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public operator com.mapbox.maps.LongClickInteraction map(kotlin.jvm.functions.Function1<? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n  }\n\n  public abstract class MapInteraction {\n    ctor public MapInteraction();\n  }\n\n  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public fun interface MapLoadingErrorDelegate {\n    method public void sendMapLoadingError(com.mapbox.maps.MapLoadingError error);\n  }\n\n  public final class MapboxAnnotationException extends java.lang.RuntimeException {\n    ctor public MapboxAnnotationException(String? exceptionText);\n  }\n\n  public final class MapboxCameraAnimationException extends java.lang.RuntimeException {\n    ctor public MapboxCameraAnimationException(String? exceptionText);\n  }\n\n  public final class MapboxConcurrentGeometryModificationException extends java.util.ConcurrentModificationException {\n    ctor public MapboxConcurrentGeometryModificationException(String exceptionText, String sourceId);\n  }\n\n  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.WARNING, message=\"This is a delicate API and its use requires care.\" + \" Make sure you fully read and understand documentation of the declaration that is marked as a delicate API.\") @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) public @interface MapboxDelicateApi {\n  }\n\n  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.WARNING, message=\"This API is experimental. It may be changed in the future without notice.\") @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface MapboxExperimental {\n  }\n\n  public interface MapboxLifecycleObserver {\n    method public void onDestroy();\n    method public void onLowMemory();\n    method public default void onResume();\n    method public void onStart();\n    method public void onStop();\n  }\n\n  public final class MapboxLocationComponentException extends java.lang.RuntimeException {\n    ctor public MapboxLocationComponentException(String? exceptionText);\n  }\n\n  public final class MapboxLogger {\n    method public static boolean isLoggableD();\n    method public static void logD(String tag, String message);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static void logD(String tag, String message, com.mapbox.common.LogThrottler? logThrottler);\n    method public static inline void logD(String tag, kotlin.jvm.functions.Function0<java.lang.String> message);\n    method public static void logE(String tag, String message);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static void logE(String tag, String message, com.mapbox.common.LogThrottler? logThrottler);\n    method public static void logI(String tag, String message);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static void logI(String tag, String message, com.mapbox.common.LogThrottler? logThrottler);\n    method public static void logW(String tag, String message);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static void logW(String tag, String message, com.mapbox.common.LogThrottler? logThrottler);\n  }\n\n  public final class MapboxMapException extends java.lang.RuntimeException {\n    ctor public MapboxMapException(String? exceptionText);\n  }\n\n  public final class MapboxStyleException extends java.lang.RuntimeException {\n    ctor public MapboxStyleException(String? exceptionText);\n  }\n\n  public class MapboxStyleManager {\n    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public MapboxStyleManager(com.mapbox.maps.StyleManager styleManager, float pixelRatio, com.mapbox.maps.MapLoadingErrorDelegate mapLoadingErrorDelegate);\n    method @AnyThread @CallSuper public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addGeoJSONSourceFeatures(String sourceId, String dataId, java.util.List<com.mapbox.geojson.Feature> features);\n    method @CallSuper @MainThread public final com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addImage(String imageId, com.mapbox.maps.Image image, boolean sdf);\n    method @CallSuper @MainThread public final com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addImage(String imageId, com.mapbox.maps.Image image);\n    method @CallSuper @MainThread public final com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addImage(String imageId, android.graphics.Bitmap bitmap, boolean sdf);\n    method @CallSuper @MainThread public final com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addImage(String imageId, android.graphics.Bitmap bitmap);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addPersistentStyleCustomLayer(String layerId, com.mapbox.maps.CustomLayerHost layerHost, com.mapbox.maps.LayerPosition? layerPosition);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addPersistentStyleLayer(com.mapbox.bindgen.Value properties, com.mapbox.maps.LayerPosition? layerPosition);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addStyleCustomGeometrySource(String sourceId, com.mapbox.maps.CustomGeometrySourceOptions options);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addStyleCustomLayer(String layerId, com.mapbox.maps.CustomLayerHost layerHost, com.mapbox.maps.LayerPosition? layerPosition);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addStyleCustomRasterSource(String sourceId, com.mapbox.maps.CustomRasterSourceOptions options);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addStyleImage(String imageId, float scale, com.mapbox.maps.Image image, boolean sdf, java.util.List<com.mapbox.maps.ImageStretches> stretchX, java.util.List<com.mapbox.maps.ImageStretches> stretchY, com.mapbox.maps.ImageContent? content);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addStyleImportFromJSON(String importId, String json, java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value>? config, com.mapbox.maps.ImportPosition? importPosition);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addStyleImportFromURI(String importId, String uri, java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value>? config, com.mapbox.maps.ImportPosition? importPosition);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addStyleLayer(com.mapbox.bindgen.Value parameters, com.mapbox.maps.LayerPosition? position);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addStyleModel(String modelId, String modelUri);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> addStyleSource(String sourceId, com.mapbox.bindgen.Value properties);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public java.util.List<com.mapbox.maps.FeaturesetDescriptor> getFeaturesets();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final com.mapbox.maps.MapLoadingErrorDelegate getMapLoadingErrorDelegate();\n    method public final float getPixelRatio();\n    method @CallSuper @MainThread public com.mapbox.maps.StylePropertyValue getStyleAtmosphereProperty(String property);\n    method @CallSuper @MainThread public com.mapbox.maps.CameraOptions getStyleDefaultCamera();\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public String getStyleGlyphURL();\n    method @CallSuper @MainThread public com.mapbox.maps.Image? getStyleImage(String imageId);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,java.util.HashMap<java.lang.String,com.mapbox.maps.StylePropertyValue>> getStyleImportConfigProperties(String importId);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.maps.StylePropertyValue> getStyleImportConfigProperty(String importId, String config);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.Value> getStyleImportSchema(String importId);\n    method @CallSuper @MainThread public java.util.List<com.mapbox.maps.StyleObjectInfo> getStyleImports();\n    method @CallSuper @MainThread public String getStyleJSON();\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.Value> getStyleLayerProperties(String layerId);\n    method @CallSuper @MainThread public com.mapbox.maps.StylePropertyValue getStyleLayerProperty(String layerId, String property);\n    method @CallSuper @MainThread public java.util.List<com.mapbox.maps.StyleObjectInfo> getStyleLayers();\n    method @CallSuper @MainThread public com.mapbox.maps.StylePropertyValue getStyleLightProperty(String id, String property);\n    method @CallSuper @MainThread public java.util.List<com.mapbox.maps.StyleObjectInfo> getStyleLights();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final com.mapbox.maps.StyleManager getStyleManager();\n    method @CallSuper @MainThread public com.mapbox.maps.StylePropertyValue getStyleProjectionProperty(String property);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public final com.mapbox.maps.StylePropertyValue getStyleRainProperty(String property);\n    method @CallSuper @MainThread public java.util.List<java.lang.String> getStyleSlots();\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public final com.mapbox.maps.StylePropertyValue getStyleSnowProperty(String property);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.Value> getStyleSourceProperties(String sourceId);\n    method @CallSuper @MainThread public com.mapbox.maps.StylePropertyValue getStyleSourceProperty(String sourceId, String property);\n    method @CallSuper @MainThread public java.util.List<com.mapbox.maps.StyleObjectInfo> getStyleSources();\n    method @CallSuper @MainThread public com.mapbox.maps.StylePropertyValue getStyleTerrainProperty(String property);\n    method @CallSuper @MainThread public com.mapbox.maps.TransitionOptions getStyleTransition();\n    method @CallSuper @MainThread public String getStyleURI();\n    method @CallSuper @MainThread public boolean hasStyleImage(String imageId);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public boolean hasStyleModel(String modelId);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> invalidateStyleCustomGeometrySourceRegion(String sourceId, com.mapbox.maps.CoordinateBounds coordinateBounds);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> invalidateStyleCustomGeometrySourceTile(String sourceId, com.mapbox.maps.CanonicalTileID tileId);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,java.lang.Boolean> isStyleLayerPersistent(String layerId);\n    method @CallSuper @MainThread public boolean isStyleLoaded();\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> moveStyleImport(String importId, com.mapbox.maps.ImportPosition? importPosition);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> moveStyleLayer(String layerId, com.mapbox.maps.LayerPosition? layerPosition);\n    method @AnyThread @CallSuper public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> removeGeoJSONSourceFeatures(String sourceId, String dataId, java.util.List<java.lang.String> featureIds);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> removeStyleImage(String imageId);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> removeStyleImport(String importId);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> removeStyleLayer(String layerId);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> removeStyleModel(String modelId);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> removeStyleSource(String sourceId);\n    method @CallSuper @MainThread @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> removeStyleSourceUnchecked(String sourceId);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setImportColorTheme(String importId, com.mapbox.maps.ColorTheme? colorTheme);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setImportColorTheme(String importId, String base64);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setImportColorTheme(String importId, android.graphics.Bitmap bitmap);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setImportColorTheme(String importId, com.mapbox.maps.Image image);\n    method @CallSuper @MainThread @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @com.mapbox.maps.MapboxExperimental public void setInitialStyleColorTheme();\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleAtmosphere(com.mapbox.bindgen.Value properties);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleAtmosphereProperty(String property, com.mapbox.bindgen.Value value);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleColorTheme(com.mapbox.maps.ColorTheme? colorTheme);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleColorTheme(String base64);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleColorTheme(android.graphics.Bitmap bitmap);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleColorTheme(com.mapbox.maps.Image image);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleCustomGeometrySourceTileData(String sourceId, com.mapbox.maps.CanonicalTileID tileId, java.util.List<com.mapbox.geojson.Feature> featureCollection);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleCustomRasterSourceTileData(String sourceId, java.util.List<com.mapbox.maps.CustomRasterSourceTileData> tiles);\n    method @AnyThread @CallSuper public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleGeoJSONSourceData(String sourceId, String dataId, com.mapbox.maps.GeoJSONSourceData data);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public void setStyleGlyphURL(String url);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleImportConfigProperties(String importId, java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value> configs);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleImportConfigProperty(String importId, String config, com.mapbox.bindgen.Value value);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleLayerProperties(String layerId, com.mapbox.bindgen.Value properties);\n    method @AnyThread @CallSuper @com.mapbox.maps.MapboxExperimental public com.mapbox.common.Cancelable setStyleLayerPropertiesAsync(String layerId, com.mapbox.bindgen.Value properties, com.mapbox.maps.AsyncOperationResultCallback callback);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleLayerProperty(String layerId, String property, com.mapbox.bindgen.Value value);\n    method @AnyThread @CallSuper @com.mapbox.maps.MapboxExperimental public com.mapbox.common.Cancelable setStyleLayerPropertyAsync(String layerId, String property, com.mapbox.bindgen.Value value, com.mapbox.maps.AsyncOperationResultCallback callback);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleLightProperty(String id, String property, com.mapbox.bindgen.Value value);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleLights(com.mapbox.bindgen.Value lights);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleProjection(com.mapbox.bindgen.Value properties);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleProjectionProperty(String property, com.mapbox.bindgen.Value value);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public final com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleRain(com.mapbox.bindgen.Value properties);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public final com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleRainProperty(String property, com.mapbox.bindgen.Value value);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleSnow(com.mapbox.bindgen.Value properties);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleSnowProperty(String property, com.mapbox.bindgen.Value value);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleSourceProperties(String sourceId, com.mapbox.bindgen.Value properties);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleSourceProperty(String sourceId, String property, com.mapbox.bindgen.Value value);\n    method @CallSuper @MainThread @com.mapbox.maps.MapboxExperimental public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleSourceProperty(String importId, String sourceId, String property, com.mapbox.bindgen.Value value);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleTerrain(com.mapbox.bindgen.Value properties);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setStyleTerrainProperty(String property, com.mapbox.bindgen.Value value);\n    method @CallSuper @MainThread public void setStyleTransition(com.mapbox.maps.TransitionOptions transitionOptions);\n    method @CallSuper @MainThread public boolean styleLayerExists(String layerId);\n    method @CallSuper @MainThread public boolean styleSourceExists(String sourceId);\n    method @AnyThread @CallSuper public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> updateGeoJSONSourceFeatures(String sourceId, String dataId, java.util.List<com.mapbox.geojson.Feature> features);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> updateStyleImageSourceImage(String sourceId, com.mapbox.maps.Image image);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> updateStyleImportWithJSON(String importId, String json, java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value>? config);\n    method @CallSuper @MainThread public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> updateStyleImportWithURI(String importId, String uri, java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value>? config);\n    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final com.mapbox.maps.MapLoadingErrorDelegate mapLoadingErrorDelegate;\n    property public final float pixelRatio;\n    property @CallSuper @MainThread public com.mapbox.maps.CameraOptions styleDefaultCamera;\n    property @CallSuper @MainThread public String styleJSON;\n    property @CallSuper @MainThread public java.util.List<com.mapbox.maps.StyleObjectInfo> styleLayers;\n    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final com.mapbox.maps.StyleManager styleManager;\n    property @CallSuper @MainThread public java.util.List<java.lang.String> styleSlots;\n    property @CallSuper @MainThread public java.util.List<com.mapbox.maps.StyleObjectInfo> styleSources;\n    property @CallSuper @MainThread public String styleURI;\n  }\n\n  public final class MapboxViewAnnotationException extends java.lang.RuntimeException {\n    ctor public MapboxViewAnnotationException(String? exceptionText);\n  }\n\n}\n\npackage com.mapbox.maps.dsl {\n\n  public final class CameraOptionsKtxKt {\n    method public static inline com.mapbox.maps.CameraOptions cameraOptions(kotlin.jvm.functions.Function1<? super com.mapbox.maps.CameraOptions.Builder,kotlin.Unit> block);\n    method public static inline com.mapbox.maps.CameraOptions cameraOptions(com.mapbox.maps.CameraState cameraState, kotlin.jvm.functions.Function1<? super com.mapbox.maps.CameraOptions.Builder,kotlin.Unit> block);\n  }\n\n}\n\npackage com.mapbox.maps.exception {\n\n  public final class WorkerThreadException extends java.lang.RuntimeException {\n    ctor public WorkerThreadException();\n  }\n\n}\n\npackage com.mapbox.maps.extension.observable {\n\n  public final class EventsExtensionKt {\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.CameraChangedEventData toCameraChangedEventData(com.mapbox.maps.CameraChanged);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.MapIdleEventData toMapIdleEventData(com.mapbox.maps.MapIdle);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.MapLoadedEventData toMapLoadedEventData(com.mapbox.maps.MapLoaded);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.MapLoadingErrorEventData toMapLoadingErrorEventData(com.mapbox.maps.MapLoadingError);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.RenderFrameFinishedEventData toRenderFrameFinishedEventData(com.mapbox.maps.RenderFrameFinished);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.RenderFrameStartedEventData toRenderFrameStartedEventData(com.mapbox.maps.RenderFrameStarted);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.SourceAddedEventData toSourceAddedEventData(com.mapbox.maps.SourceAdded);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.SourceDataLoadedEventData toSourceDataLoadedEventData(com.mapbox.maps.SourceDataLoaded);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.SourceRemovedEventData toSourceRemovedEventData(com.mapbox.maps.SourceRemoved);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.StyleDataLoadedEventData toStyleDataLoadedEventData(com.mapbox.maps.StyleDataLoaded);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.StyleImageMissingEventData toStyleImageMissingEventData(com.mapbox.maps.StyleImageMissing);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.StyleImageUnusedEventData toStyleImageUnusedEventData(com.mapbox.maps.StyleImageRemoveUnused);\n    method @Deprecated public static com.mapbox.maps.extension.observable.eventdata.StyleLoadedEventData toStyleLoadedEventData(com.mapbox.maps.StyleLoaded);\n    method @Deprecated public static com.mapbox.maps.extension.observable.model.TileID toTileId(com.mapbox.maps.CanonicalTileID);\n  }\n\n}\n\npackage com.mapbox.maps.extension.observable.eventdata {\n\n  @Deprecated public final class CameraChangedEventData {\n    ctor @Deprecated public CameraChangedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.CameraChangedEventData copy(long begin, Long? end);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    property public final long begin;\n    property public final Long? end;\n  }\n\n  @Deprecated public final class MapIdleEventData {\n    ctor @Deprecated public MapIdleEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.MapIdleEventData copy(long begin, Long? end);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    property public final long begin;\n    property public final Long? end;\n  }\n\n  @Deprecated public final class MapLoadedEventData {\n    ctor @Deprecated public MapLoadedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.MapLoadedEventData copy(long begin, Long? end);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    property public final long begin;\n    property public final Long? end;\n  }\n\n  @Deprecated public final class MapLoadingErrorEventData {\n    ctor @Deprecated public MapLoadingErrorEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end, @com.google.gson.annotations.SerializedName(\"type\") com.mapbox.maps.extension.observable.model.MapLoadErrorType type, @com.google.gson.annotations.SerializedName(\"message\") String message, @com.google.gson.annotations.SerializedName(\"source-id\") String? sourceId, @com.google.gson.annotations.SerializedName(\"tile-id\") com.mapbox.maps.extension.observable.model.TileID? tileId);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.MapLoadErrorType component3();\n    method @Deprecated public String component4();\n    method @Deprecated public String? component5();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.TileID? component6();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.MapLoadingErrorEventData copy(long begin, Long? end, com.mapbox.maps.extension.observable.model.MapLoadErrorType type, String message, String? sourceId, com.mapbox.maps.extension.observable.model.TileID? tileId);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    method @Deprecated public String getMessage();\n    method @Deprecated public String? getSourceId();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.TileID? getTileId();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.MapLoadErrorType getType();\n    property public final long begin;\n    property public final Long? end;\n    property public final String message;\n    property public final String? sourceId;\n    property public final com.mapbox.maps.extension.observable.model.TileID? tileId;\n    property public final com.mapbox.maps.extension.observable.model.MapLoadErrorType type;\n  }\n\n  @Deprecated public final class RenderFrameFinishedEventData {\n    ctor @Deprecated public RenderFrameFinishedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end, @com.google.gson.annotations.SerializedName(\"render-mode\") com.mapbox.maps.extension.observable.model.RenderMode renderMode, @com.google.gson.annotations.SerializedName(\"needs-repaint\") boolean needsRepaint, @com.google.gson.annotations.SerializedName(\"placement-changed\") boolean placementChanged);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.RenderMode component3();\n    method @Deprecated public boolean component4();\n    method @Deprecated public boolean component5();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.RenderFrameFinishedEventData copy(long begin, Long? end, com.mapbox.maps.extension.observable.model.RenderMode renderMode, boolean needsRepaint, boolean placementChanged);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    method @Deprecated public boolean getNeedsRepaint();\n    method @Deprecated public boolean getPlacementChanged();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.RenderMode getRenderMode();\n    property public final long begin;\n    property public final Long? end;\n    property public final boolean needsRepaint;\n    property public final boolean placementChanged;\n    property public final com.mapbox.maps.extension.observable.model.RenderMode renderMode;\n  }\n\n  @Deprecated public final class RenderFrameStartedEventData {\n    ctor @Deprecated public RenderFrameStartedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.RenderFrameStartedEventData copy(long begin, Long? end);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    property public final long begin;\n    property public final Long? end;\n  }\n\n  @Deprecated public final class ResourceEventData {\n    ctor @Deprecated public ResourceEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end, @com.google.gson.annotations.SerializedName(\"data-source\") com.mapbox.maps.extension.observable.model.DataSourceType dataSource, @com.google.gson.annotations.SerializedName(\"request\") com.mapbox.maps.extension.observable.model.Request request, @com.google.gson.annotations.SerializedName(\"response\") com.mapbox.maps.extension.observable.model.Response? response, @com.google.gson.annotations.SerializedName(\"cancelled\") boolean cancelled);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.DataSourceType component3();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.Request component4();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.Response? component5();\n    method @Deprecated public boolean component6();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.ResourceEventData copy(long begin, Long? end, com.mapbox.maps.extension.observable.model.DataSourceType dataSource, com.mapbox.maps.extension.observable.model.Request request, com.mapbox.maps.extension.observable.model.Response? response, boolean cancelled);\n    method @Deprecated public long getBegin();\n    method @Deprecated public boolean getCancelled();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.DataSourceType getDataSource();\n    method @Deprecated public Long? getEnd();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.Request getRequest();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.Response? getResponse();\n    property public final long begin;\n    property public final boolean cancelled;\n    property public final com.mapbox.maps.extension.observable.model.DataSourceType dataSource;\n    property public final Long? end;\n    property public final com.mapbox.maps.extension.observable.model.Request request;\n    property public final com.mapbox.maps.extension.observable.model.Response? response;\n  }\n\n  @Deprecated public final class SourceAddedEventData {\n    ctor @Deprecated public SourceAddedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end, @com.google.gson.annotations.SerializedName(\"id\") String id);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public String component3();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.SourceAddedEventData copy(long begin, Long? end, String id);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    method @Deprecated public String getId();\n    property public final long begin;\n    property public final Long? end;\n    property public final String id;\n  }\n\n  @Deprecated public final class SourceDataLoadedEventData {\n    ctor @Deprecated public SourceDataLoadedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end, @com.google.gson.annotations.SerializedName(\"id\") String id, @com.google.gson.annotations.SerializedName(\"type\") com.mapbox.maps.extension.observable.model.SourceDataType type, @com.google.gson.annotations.SerializedName(\"loaded\") Boolean? loaded, @com.google.gson.annotations.SerializedName(\"tile-id\") com.mapbox.maps.extension.observable.model.TileID? tileID);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public String component3();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.SourceDataType component4();\n    method @Deprecated public Boolean? component5();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.TileID? component6();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.SourceDataLoadedEventData copy(long begin, Long? end, String id, com.mapbox.maps.extension.observable.model.SourceDataType type, Boolean? loaded, com.mapbox.maps.extension.observable.model.TileID? tileID);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    method @Deprecated public String getId();\n    method @Deprecated public Boolean? getLoaded();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.TileID? getTileID();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.SourceDataType getType();\n    property public final long begin;\n    property public final Long? end;\n    property public final String id;\n    property public final Boolean? loaded;\n    property public final com.mapbox.maps.extension.observable.model.TileID? tileID;\n    property public final com.mapbox.maps.extension.observable.model.SourceDataType type;\n  }\n\n  @Deprecated public final class SourceRemovedEventData {\n    ctor @Deprecated public SourceRemovedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end, @com.google.gson.annotations.SerializedName(\"id\") String id);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public String component3();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.SourceRemovedEventData copy(long begin, Long? end, String id);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    method @Deprecated public String getId();\n    property public final long begin;\n    property public final Long? end;\n    property public final String id;\n  }\n\n  @Deprecated public final class StyleDataLoadedEventData {\n    ctor @Deprecated public StyleDataLoadedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end, @com.google.gson.annotations.SerializedName(\"type\") com.mapbox.maps.extension.observable.model.StyleDataType type);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.StyleDataType component3();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.StyleDataLoadedEventData copy(long begin, Long? end, com.mapbox.maps.extension.observable.model.StyleDataType type);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.StyleDataType getType();\n    property public final long begin;\n    property public final Long? end;\n    property public final com.mapbox.maps.extension.observable.model.StyleDataType type;\n  }\n\n  @Deprecated public final class StyleImageMissingEventData {\n    ctor @Deprecated public StyleImageMissingEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end, @com.google.gson.annotations.SerializedName(\"id\") String id);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public String component3();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.StyleImageMissingEventData copy(long begin, Long? end, String id);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    method @Deprecated public String getId();\n    property public final long begin;\n    property public final Long? end;\n    property public final String id;\n  }\n\n  @Deprecated public final class StyleImageUnusedEventData {\n    ctor @Deprecated public StyleImageUnusedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end, @com.google.gson.annotations.SerializedName(\"id\") String id);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public String component3();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.StyleImageUnusedEventData copy(long begin, Long? end, String id);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    method @Deprecated public String getId();\n    property public final long begin;\n    property public final Long? end;\n    property public final String id;\n  }\n\n  @Deprecated public final class StyleLoadedEventData {\n    ctor @Deprecated public StyleLoadedEventData(@com.google.gson.annotations.SerializedName(\"begin\") long begin, @com.google.gson.annotations.SerializedName(\"end\") Long? end);\n    method @Deprecated public long component1();\n    method @Deprecated public Long? component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.eventdata.StyleLoadedEventData copy(long begin, Long? end);\n    method @Deprecated public long getBegin();\n    method @Deprecated public Long? getEnd();\n    property public final long begin;\n    property public final Long? end;\n  }\n\n}\n\npackage com.mapbox.maps.extension.observable.model {\n\n  @Deprecated public enum DataSourceType {\n    method @Deprecated public final String! getValue();\n    property public final String! value;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"asset\") public static final com.mapbox.maps.extension.observable.model.DataSourceType ASSET;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"database\") public static final com.mapbox.maps.extension.observable.model.DataSourceType DATABASE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"file-system\") public static final com.mapbox.maps.extension.observable.model.DataSourceType FILE_SYSTEM;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"network\") public static final com.mapbox.maps.extension.observable.model.DataSourceType NETWORK;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"resource-loader\") public static final com.mapbox.maps.extension.observable.model.DataSourceType RESOURCE_LOADER;\n  }\n\n  @Deprecated public final class Error {\n    ctor @Deprecated public Error(@com.google.gson.annotations.SerializedName(\"reason\") com.mapbox.maps.extension.observable.model.ResponseErrorReason reason, @com.google.gson.annotations.SerializedName(\"message\") String message);\n    method @Deprecated public com.mapbox.maps.extension.observable.model.ResponseErrorReason component1();\n    method @Deprecated public String component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.Error copy(com.mapbox.maps.extension.observable.model.ResponseErrorReason reason, String message);\n    method @Deprecated public String getMessage();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.ResponseErrorReason getReason();\n    property public final String message;\n    property public final com.mapbox.maps.extension.observable.model.ResponseErrorReason reason;\n  }\n\n  @Deprecated public enum MapLoadErrorType {\n    method @Deprecated public final String! getValue();\n    property public final String! value;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"glyphs\") public static final com.mapbox.maps.extension.observable.model.MapLoadErrorType GLYPHS;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"source\") public static final com.mapbox.maps.extension.observable.model.MapLoadErrorType SOURCE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"sprite\") public static final com.mapbox.maps.extension.observable.model.MapLoadErrorType SPRITE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"style\") public static final com.mapbox.maps.extension.observable.model.MapLoadErrorType STYLE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"tile\") public static final com.mapbox.maps.extension.observable.model.MapLoadErrorType TILE;\n  }\n\n  @Deprecated public enum RenderMode {\n    method @Deprecated public final String! getValue();\n    property public final String! value;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"full\") public static final com.mapbox.maps.extension.observable.model.RenderMode FULL;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"partial\") public static final com.mapbox.maps.extension.observable.model.RenderMode PARTIAL;\n  }\n\n  @Deprecated public final class Request {\n    ctor @Deprecated public Request(@com.google.gson.annotations.SerializedName(\"loading-method\") java.util.List<java.lang.String> loadingMethod, @com.google.gson.annotations.SerializedName(\"url\") String url, @com.google.gson.annotations.SerializedName(\"kind\") com.mapbox.maps.extension.observable.model.RequestType kind, @com.google.gson.annotations.SerializedName(\"priority\") com.mapbox.maps.extension.observable.model.RequestPriority priority);\n    method @Deprecated public java.util.List<java.lang.String> component1();\n    method @Deprecated public String component2();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.RequestType component3();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.RequestPriority component4();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.Request copy(java.util.List<java.lang.String> loadingMethod, String url, com.mapbox.maps.extension.observable.model.RequestType kind, com.mapbox.maps.extension.observable.model.RequestPriority priority);\n    method @Deprecated public com.mapbox.maps.extension.observable.model.RequestType getKind();\n    method @Deprecated public java.util.List<java.lang.String> getLoadingMethod();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.RequestPriority getPriority();\n    method @Deprecated public String getUrl();\n    property public final com.mapbox.maps.extension.observable.model.RequestType kind;\n    property public final java.util.List<java.lang.String> loadingMethod;\n    property public final com.mapbox.maps.extension.observable.model.RequestPriority priority;\n    property public final String url;\n  }\n\n  @Deprecated public enum RequestPriority {\n    method @Deprecated public final String! getValue();\n    property public final String! value;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"low\") public static final com.mapbox.maps.extension.observable.model.RequestPriority LOW;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"regular\") public static final com.mapbox.maps.extension.observable.model.RequestPriority REGULAR;\n  }\n\n  @Deprecated public enum RequestType {\n    method @Deprecated public final String! getValue();\n    property public final String! value;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"glyphs\") public static final com.mapbox.maps.extension.observable.model.RequestType GLYPHS;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"image\") public static final com.mapbox.maps.extension.observable.model.RequestType IMAGE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"source\") public static final com.mapbox.maps.extension.observable.model.RequestType SOURCE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"sprite-image\") public static final com.mapbox.maps.extension.observable.model.RequestType SPRITE_IMAGE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"sprite-json\") public static final com.mapbox.maps.extension.observable.model.RequestType SPRITE_JSON;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"style\") public static final com.mapbox.maps.extension.observable.model.RequestType STYLE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"tile\") public static final com.mapbox.maps.extension.observable.model.RequestType TILE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"unknown\") public static final com.mapbox.maps.extension.observable.model.RequestType UNKNOWN;\n  }\n\n  @Deprecated public final class Response {\n    ctor @Deprecated public Response(@com.google.gson.annotations.SerializedName(\"etag\") String? eTag, @com.google.gson.annotations.SerializedName(\"must-revalidate\") boolean mustRevalidate, @com.google.gson.annotations.SerializedName(\"no-content\") boolean noContent, @com.google.gson.annotations.SerializedName(\"modified\") String? modified, @com.google.gson.annotations.SerializedName(\"source\") com.mapbox.maps.extension.observable.model.ResponseSourceType source, @com.google.gson.annotations.SerializedName(\"not-modified\") boolean notModified, @com.google.gson.annotations.SerializedName(\"expires\") String? expires, @com.google.gson.annotations.SerializedName(\"size\") int size, @com.google.gson.annotations.SerializedName(\"error\") com.mapbox.maps.extension.observable.model.Error? error);\n    method @Deprecated public String? component1();\n    method @Deprecated public boolean component2();\n    method @Deprecated public boolean component3();\n    method @Deprecated public String? component4();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.ResponseSourceType component5();\n    method @Deprecated public boolean component6();\n    method @Deprecated public String? component7();\n    method @Deprecated public int component8();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.Error? component9();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.Response copy(String? eTag, boolean mustRevalidate, boolean noContent, String? modified, com.mapbox.maps.extension.observable.model.ResponseSourceType source, boolean notModified, String? expires, int size, com.mapbox.maps.extension.observable.model.Error? error);\n    method @Deprecated public String? getETag();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.Error? getError();\n    method @Deprecated public String? getExpires();\n    method @Deprecated public String? getModified();\n    method @Deprecated public boolean getMustRevalidate();\n    method @Deprecated public boolean getNoContent();\n    method @Deprecated public boolean getNotModified();\n    method @Deprecated public int getSize();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.ResponseSourceType getSource();\n    property public final String? eTag;\n    property public final com.mapbox.maps.extension.observable.model.Error? error;\n    property public final String? expires;\n    property public final String? modified;\n    property public final boolean mustRevalidate;\n    property public final boolean noContent;\n    property public final boolean notModified;\n    property public final int size;\n    property public final com.mapbox.maps.extension.observable.model.ResponseSourceType source;\n  }\n\n  @Deprecated public enum ResponseErrorReason {\n    method @Deprecated public final String! getValue();\n    property public final String! value;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"connection\") public static final com.mapbox.maps.extension.observable.model.ResponseErrorReason CONNECTION;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"in-offline-mode\") public static final com.mapbox.maps.extension.observable.model.ResponseErrorReason IN_OFFLINE_MODE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"not-found\") public static final com.mapbox.maps.extension.observable.model.ResponseErrorReason NOT_FOUND;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"other\") public static final com.mapbox.maps.extension.observable.model.ResponseErrorReason OTHER;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"rate-limit\") public static final com.mapbox.maps.extension.observable.model.ResponseErrorReason RATE_LIMIT;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"server\") public static final com.mapbox.maps.extension.observable.model.ResponseErrorReason SERVER;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"success\") public static final com.mapbox.maps.extension.observable.model.ResponseErrorReason SUCCESS;\n  }\n\n  @Deprecated public enum ResponseSourceType {\n    method @Deprecated public final String! getValue();\n    property public final String! value;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"cache\") public static final com.mapbox.maps.extension.observable.model.ResponseSourceType CACHE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"local-file\") public static final com.mapbox.maps.extension.observable.model.ResponseSourceType LOCAL_FILE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"network\") public static final com.mapbox.maps.extension.observable.model.ResponseSourceType NETWORK;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"tile-store\") public static final com.mapbox.maps.extension.observable.model.ResponseSourceType TILE_STORE;\n  }\n\n  @Deprecated public enum SourceDataType {\n    method @Deprecated public final String! getValue();\n    property public final String! value;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"metadata\") public static final com.mapbox.maps.extension.observable.model.SourceDataType METADATA;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"tile\") public static final com.mapbox.maps.extension.observable.model.SourceDataType TILE;\n  }\n\n  @Deprecated public enum StyleDataType {\n    method @Deprecated public final String! getValue();\n    property public final String! value;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"sources\") public static final com.mapbox.maps.extension.observable.model.StyleDataType SOURCES;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"sprite\") public static final com.mapbox.maps.extension.observable.model.StyleDataType SPRITE;\n    enum_constant @Deprecated @com.google.gson.annotations.SerializedName(\"style\") public static final com.mapbox.maps.extension.observable.model.StyleDataType STYLE;\n  }\n\n  @Deprecated public final class TileID {\n    ctor @Deprecated public TileID(@com.google.gson.annotations.SerializedName(\"z\") long zoom, @com.google.gson.annotations.SerializedName(\"x\") long x, @com.google.gson.annotations.SerializedName(\"y\") long y);\n    method @Deprecated public long component1();\n    method @Deprecated public long component2();\n    method @Deprecated public long component3();\n    method @Deprecated public com.mapbox.maps.extension.observable.model.TileID copy(long zoom, long x, long y);\n    method @Deprecated public long getX();\n    method @Deprecated public long getY();\n    method @Deprecated public long getZoom();\n    property public final long x;\n    property public final long y;\n    property public final long zoom;\n  }\n\n}\n\npackage com.mapbox.maps.extension.style {\n\n  public interface StyleContract {\n  }\n\n  public static fun interface StyleContract.StyleAtmosphereExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  public static interface StyleContract.StyleExtension {\n    method public com.mapbox.maps.extension.style.StyleContract.StyleAtmosphereExtension? getAtmosphere();\n    method public com.mapbox.maps.ColorTheme? getColorTheme();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleLightExtension? getDynamicLight();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleLightExtension? getFlatLight();\n    method public java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleImageExtension> getImages();\n    method public java.util.List<kotlin.Pair<com.mapbox.maps.extension.style.StyleContract.StyleLayerExtension,com.mapbox.maps.LayerPosition>> getLayers();\n    method public java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleModelExtension> getModels();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleProjectionExtension? getProjection();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleRainExtension? getRain();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleSnowExtension? getSnow();\n    method public java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleSourceExtension> getSources();\n    method public String getStyle();\n    method public com.mapbox.maps.extension.style.StyleContract.StyleTerrainExtension? getTerrain();\n    method public com.mapbox.maps.TransitionOptions? getTransition();\n    property public abstract com.mapbox.maps.extension.style.StyleContract.StyleAtmosphereExtension? atmosphere;\n    property public abstract com.mapbox.maps.ColorTheme? colorTheme;\n    property public abstract com.mapbox.maps.extension.style.StyleContract.StyleLightExtension? dynamicLight;\n    property public abstract com.mapbox.maps.extension.style.StyleContract.StyleLightExtension? flatLight;\n    property public abstract java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleImageExtension> images;\n    property public abstract java.util.List<kotlin.Pair<com.mapbox.maps.extension.style.StyleContract.StyleLayerExtension,com.mapbox.maps.LayerPosition>> layers;\n    property public abstract java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleModelExtension> models;\n    property public abstract com.mapbox.maps.extension.style.StyleContract.StyleProjectionExtension? projection;\n    property public abstract com.mapbox.maps.extension.style.StyleContract.StyleRainExtension? rain;\n    property public abstract com.mapbox.maps.extension.style.StyleContract.StyleSnowExtension? snow;\n    property public abstract java.util.List<com.mapbox.maps.extension.style.StyleContract.StyleSourceExtension> sources;\n    property public abstract String style;\n    property public abstract com.mapbox.maps.extension.style.StyleContract.StyleTerrainExtension? terrain;\n    property public abstract com.mapbox.maps.TransitionOptions? transition;\n  }\n\n  public static fun interface StyleContract.StyleImageExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  public static interface StyleContract.StyleLayerExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate, com.mapbox.maps.LayerPosition? position = null);\n  }\n\n  public static fun interface StyleContract.StyleLightExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public static fun interface StyleContract.StyleModelExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  public static fun interface StyleContract.StyleProjectionExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public static fun interface StyleContract.StyleRainExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public static fun interface StyleContract.StyleSnowExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  public static fun interface StyleContract.StyleSourceExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n  public static fun interface StyleContract.StyleTerrainExtension {\n    method public void bindTo(com.mapbox.maps.MapboxStyleManager delegate);\n  }\n\n}\n\npackage com.mapbox.maps.geofencing {\n\n  public interface MapGeofencingConsent {\n    method public boolean getUserConsent();\n    method public void setUserConsent(boolean isConsentGiven, com.mapbox.common.geofencing.GeofencingUtilsUserConsentResponseCallback callback);\n    method public boolean shouldShowConsent();\n  }\n\n}\n\npackage com.mapbox.maps.interactions {\n\n  public class FeatureState {\n    method public final String asJsonString();\n    method public final Boolean? getBooleanState(String stateName);\n    method public final Double? getDoubleState(String stateName);\n    method public final Long? getLongState(String stateName);\n    method public final String? getStringState(String stateName);\n  }\n\n  public static class FeatureState.Builder {\n    ctor public FeatureState.Builder();\n    method public final com.mapbox.maps.interactions.FeatureState.Builder addBooleanState(String stateName, boolean value);\n    method public final com.mapbox.maps.interactions.FeatureState.Builder addDoubleState(String stateName, double value);\n    method public final com.mapbox.maps.interactions.FeatureState.Builder addLongState(String stateName, long value);\n    method public final com.mapbox.maps.interactions.FeatureState.Builder addStringState(String stateName, String value);\n    method public com.mapbox.maps.interactions.FeatureState build();\n    method protected final java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value> getRawStateMap();\n    property protected final java.util.HashMap<java.lang.String,com.mapbox.bindgen.Value> rawStateMap;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public fun interface FeatureStateCallback<FS extends com.mapbox.maps.interactions.FeatureState> {\n    method public void onFeatureState(FS state);\n  }\n\n  public class FeatureStateKey<FS extends com.mapbox.maps.interactions.FeatureState> {\n    method public static final com.mapbox.maps.interactions.FeatureStateKey<com.mapbox.maps.interactions.FeatureState> create(String key);\n    method public final String getKey();\n    property public final String key;\n    field public static final com.mapbox.maps.interactions.FeatureStateKey.Companion Companion;\n  }\n\n  public static final class FeatureStateKey.Companion {\n    method public com.mapbox.maps.interactions.FeatureStateKey<com.mapbox.maps.interactions.FeatureState> create(String key);\n  }\n\n  public final class FeatureStateKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.interactions.FeatureState! FeatureState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.interactions.FeatureState.Builder,? extends kotlin.Unit> init);\n  }\n\n  public class FeaturesetFeature<FS extends com.mapbox.maps.interactions.FeatureState> {\n    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public FeaturesetFeature(com.mapbox.maps.FeaturesetFeatureId? id, com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> descriptor, FS state, com.mapbox.geojson.Feature originalFeature);\n    method public final com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> getDescriptor();\n    method public com.mapbox.geojson.Geometry getGeometry();\n    method public final com.mapbox.maps.FeaturesetFeatureId? getId();\n    method public final org.json.JSONObject getProperties();\n    method public final FS getState();\n    property public final com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> descriptor;\n    property public com.mapbox.geojson.Geometry geometry;\n    property public final com.mapbox.maps.FeaturesetFeatureId? id;\n    property public final org.json.JSONObject properties;\n    property public final FS state;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public fun interface QueryRenderedFeaturesetFeaturesCallback<FF extends com.mapbox.maps.interactions.FeaturesetFeature<?>> {\n    method public void onQueryRenderedFeatures(java.util.List<? extends FF> featuresetFeatures);\n  }\n\n  public abstract class TypedFeaturesetDescriptor<FS extends com.mapbox.maps.interactions.FeatureState, FF extends com.mapbox.maps.interactions.FeaturesetFeature<FS>> {\n    ctor protected TypedFeaturesetDescriptor();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public abstract FS getFeatureState(com.mapbox.bindgen.Value rawState);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public abstract FF getFeaturesetFeature(com.mapbox.geojson.Feature feature, String? featureNamespace, com.mapbox.bindgen.Value rawState);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public abstract com.mapbox.maps.FeaturesetDescriptor toFeaturesetDescriptor();\n  }\n\n  public static final class TypedFeaturesetDescriptor.Featureset extends com.mapbox.maps.interactions.TypedFeaturesetDescriptor<com.mapbox.maps.interactions.FeatureState,com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>> {\n    ctor public TypedFeaturesetDescriptor.Featureset(String featuresetId, String? importId = null);\n    ctor public TypedFeaturesetDescriptor.Featureset(String featuresetId);\n    method public com.mapbox.maps.interactions.FeatureState getFeatureState(com.mapbox.bindgen.Value rawState);\n    method public com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState> getFeaturesetFeature(com.mapbox.geojson.Feature feature, String? featureNamespace, com.mapbox.bindgen.Value rawState);\n    method public String getFeaturesetId();\n    method public String? getImportId();\n    method public com.mapbox.maps.FeaturesetDescriptor toFeaturesetDescriptor();\n    property public final String featuresetId;\n    property public final String? importId;\n  }\n\n  public static final class TypedFeaturesetDescriptor.Layer extends com.mapbox.maps.interactions.TypedFeaturesetDescriptor<com.mapbox.maps.interactions.FeatureState,com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState>> {\n    ctor public TypedFeaturesetDescriptor.Layer(String layerId);\n    method public com.mapbox.maps.interactions.FeatureState getFeatureState(com.mapbox.bindgen.Value rawState);\n    method public com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState> getFeaturesetFeature(com.mapbox.geojson.Feature feature, String? featureNamespace, com.mapbox.bindgen.Value rawState);\n    method public String getLayerId();\n    method public com.mapbox.maps.FeaturesetDescriptor toFeaturesetDescriptor();\n    property public final String layerId;\n  }\n\n}\n\npackage com.mapbox.maps.interactions.standard.generated {\n\n  public final class StandardBuildings extends com.mapbox.maps.interactions.TypedFeaturesetDescriptor<com.mapbox.maps.interactions.standard.generated.StandardBuildingsState,com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature> {\n    ctor public StandardBuildings(String? importId = null);\n    ctor public StandardBuildings();\n    method public com.mapbox.maps.interactions.standard.generated.StandardBuildingsState getFeatureState(com.mapbox.bindgen.Value rawState);\n    method public com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature getFeaturesetFeature(com.mapbox.geojson.Feature feature, String? featureNamespace, com.mapbox.bindgen.Value rawState);\n    method public String? getImportId();\n    method public com.mapbox.maps.FeaturesetDescriptor toFeaturesetDescriptor();\n    property public final String? importId;\n  }\n\n  public final class StandardBuildingsFeature extends com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.standard.generated.StandardBuildingsState> {\n    ctor public StandardBuildingsFeature(com.mapbox.maps.FeaturesetFeatureId? id, String? importId, com.mapbox.geojson.Feature originalFeature, com.mapbox.maps.interactions.standard.generated.StandardBuildingsState state);\n    method public String? getGroup();\n    method public Double? getHeight();\n    method public Double? getMinHeight();\n    property public final String? group;\n    property public final Double? height;\n    property public final Double? minHeight;\n  }\n\n  public final class StandardBuildingsState extends com.mapbox.maps.interactions.FeatureState {\n    method public Boolean? getHighlight();\n    method public Boolean? getSelect();\n    property public final Boolean? highlight;\n    property public final Boolean? select;\n  }\n\n  public static final class StandardBuildingsState.Builder extends com.mapbox.maps.interactions.FeatureState.Builder {\n    ctor public StandardBuildingsState.Builder();\n    method public com.mapbox.maps.interactions.standard.generated.StandardBuildingsState build();\n    method public com.mapbox.maps.interactions.standard.generated.StandardBuildingsState.Builder highlight(boolean highlight);\n    method public com.mapbox.maps.interactions.standard.generated.StandardBuildingsState.Builder select(boolean select);\n  }\n\n  public final class StandardBuildingsStateKey extends com.mapbox.maps.interactions.FeatureStateKey<com.mapbox.maps.interactions.standard.generated.StandardBuildingsState> {\n    field public static final com.mapbox.maps.interactions.standard.generated.StandardBuildingsStateKey.Companion Companion;\n  }\n\n  public static final class StandardBuildingsStateKey.Companion {\n    method @com.mapbox.maps.MapboxDelicateApi public com.mapbox.maps.interactions.standard.generated.StandardBuildingsStateKey create(String key);\n    method public com.mapbox.maps.interactions.standard.generated.StandardBuildingsStateKey getHIGHLIGHT();\n    method public com.mapbox.maps.interactions.standard.generated.StandardBuildingsStateKey getSELECT();\n    property public final com.mapbox.maps.interactions.standard.generated.StandardBuildingsStateKey HIGHLIGHT;\n    property public final com.mapbox.maps.interactions.standard.generated.StandardBuildingsStateKey SELECT;\n  }\n\n  public final class StandardBuildingsStateKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.interactions.standard.generated.StandardBuildingsState! StandardBuildingsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsState.Builder,? extends kotlin.Unit> init);\n  }\n\n  public final class StandardInteractions {\n    method public static com.mapbox.maps.MapInteraction standardBuildings(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardBuildings(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardBuildings(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardBuildings(com.mapbox.maps.ClickInteraction.Companion, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardBuildings(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardBuildings(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardBuildings(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardBuildings(com.mapbox.maps.LongClickInteraction.Companion, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardBuildingsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardLandmarkIcons(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardLandmarkIcons(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardLandmarkIcons(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardLandmarkIcons(com.mapbox.maps.ClickInteraction.Companion, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardLandmarkIcons(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardLandmarkIcons(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardLandmarkIcons(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardLandmarkIcons(com.mapbox.maps.LongClickInteraction.Companion, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardPlaceLabels(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardPlaceLabels(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardPlaceLabels(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardPlaceLabels(com.mapbox.maps.ClickInteraction.Companion, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardPlaceLabels(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardPlaceLabels(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardPlaceLabels(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardPlaceLabels(com.mapbox.maps.LongClickInteraction.Companion, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardPoi(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardPoi(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardPoi(com.mapbox.maps.ClickInteraction.Companion, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardPoi(com.mapbox.maps.ClickInteraction.Companion, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onClick);\n    method public static com.mapbox.maps.MapInteraction standardPoi(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, Double? radius = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardPoi(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, com.mapbox.bindgen.Value? filter = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardPoi(com.mapbox.maps.LongClickInteraction.Companion, String? importId = null, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n    method public static com.mapbox.maps.MapInteraction standardPoi(com.mapbox.maps.LongClickInteraction.Companion, kotlin.jvm.functions.Function2<? super com.mapbox.maps.interactions.standard.generated.StandardPoiFeature,? super com.mapbox.maps.InteractionContext,java.lang.Boolean> onLongClick);\n  }\n\n  public final class StandardLandmarkIcons extends com.mapbox.maps.interactions.TypedFeaturesetDescriptor<com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState,com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature> {\n    ctor public StandardLandmarkIcons(String? importId = null);\n    ctor public StandardLandmarkIcons();\n    method public com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState getFeatureState(com.mapbox.bindgen.Value rawState);\n    method public com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsFeature getFeaturesetFeature(com.mapbox.geojson.Feature feature, String? featureNamespace, com.mapbox.bindgen.Value rawState);\n    method public String? getImportId();\n    method public com.mapbox.maps.FeaturesetDescriptor toFeaturesetDescriptor();\n    property public final String? importId;\n  }\n\n  public final class StandardLandmarkIconsFeature extends com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState> {\n    ctor public StandardLandmarkIconsFeature(com.mapbox.maps.FeaturesetFeatureId? id, String? importId, com.mapbox.geojson.Feature originalFeature, com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState state);\n    method public String? getLandmarkId();\n    method public String? getName();\n    method public String? getNameEn();\n    method public String? getShortName();\n    method public String? getShortNameEn();\n    method public String? getType();\n    property public final String? landmarkId;\n    property public final String? name;\n    property public final String? nameEn;\n    property public final String? shortName;\n    property public final String? shortNameEn;\n    property public final String? type;\n  }\n\n  public final class StandardLandmarkIconsState extends com.mapbox.maps.interactions.FeatureState {\n  }\n\n  public static final class StandardLandmarkIconsState.Builder extends com.mapbox.maps.interactions.FeatureState.Builder {\n    ctor public StandardLandmarkIconsState.Builder();\n    method public com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState build();\n  }\n\n  public final class StandardLandmarkIconsStateKey extends com.mapbox.maps.interactions.FeatureStateKey<com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState> {\n    field public static final com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsStateKey.Companion Companion;\n  }\n\n  public static final class StandardLandmarkIconsStateKey.Companion {\n    method @com.mapbox.maps.MapboxDelicateApi public com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsStateKey create(String key);\n  }\n\n  public final class StandardLandmarkIconsStateKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState! StandardLandmarkIconsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.interactions.standard.generated.StandardLandmarkIconsState.Builder,? extends kotlin.Unit> init);\n  }\n\n  public final class StandardPlaceLabels extends com.mapbox.maps.interactions.TypedFeaturesetDescriptor<com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState,com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature> {\n    ctor public StandardPlaceLabels(String? importId = null);\n    ctor public StandardPlaceLabels();\n    method public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState getFeatureState(com.mapbox.bindgen.Value rawState);\n    method public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsFeature getFeaturesetFeature(com.mapbox.geojson.Feature feature, String? featureNamespace, com.mapbox.bindgen.Value rawState);\n    method public String? getImportId();\n    method public com.mapbox.maps.FeaturesetDescriptor toFeaturesetDescriptor();\n    property public final String? importId;\n  }\n\n  public final class StandardPlaceLabelsFeature extends com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState> {\n    ctor public StandardPlaceLabelsFeature(com.mapbox.maps.FeaturesetFeatureId? id, String? importId, com.mapbox.geojson.Feature originalFeature, com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState state);\n    method public String? getClass();\n    method public com.mapbox.geojson.Point getGeometry();\n    method public String? getName();\n    property public final String? class;\n    property public com.mapbox.geojson.Point geometry;\n    property public final String? name;\n  }\n\n  public final class StandardPlaceLabelsState extends com.mapbox.maps.interactions.FeatureState {\n    method public Boolean? getHide();\n    method public Boolean? getHighlight();\n    method public Boolean? getSelect();\n    property public final Boolean? hide;\n    property public final Boolean? highlight;\n    property public final Boolean? select;\n  }\n\n  public static final class StandardPlaceLabelsState.Builder extends com.mapbox.maps.interactions.FeatureState.Builder {\n    ctor public StandardPlaceLabelsState.Builder();\n    method public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState build();\n    method public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState.Builder hide(boolean hide);\n    method public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState.Builder highlight(boolean highlight);\n    method public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState.Builder select(boolean select);\n  }\n\n  public final class StandardPlaceLabelsStateKey extends com.mapbox.maps.interactions.FeatureStateKey<com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState> {\n    field public static final com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsStateKey.Companion Companion;\n  }\n\n  public static final class StandardPlaceLabelsStateKey.Companion {\n    method @com.mapbox.maps.MapboxDelicateApi public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsStateKey create(String key);\n    method public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsStateKey getHIDE();\n    method public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsStateKey getHIGHLIGHT();\n    method public com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsStateKey getSELECT();\n    property public final com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsStateKey HIDE;\n    property public final com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsStateKey HIGHLIGHT;\n    property public final com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsStateKey SELECT;\n  }\n\n  public final class StandardPlaceLabelsStateKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState! StandardPlaceLabelsState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.interactions.standard.generated.StandardPlaceLabelsState.Builder,? extends kotlin.Unit> init);\n  }\n\n  public final class StandardPoi extends com.mapbox.maps.interactions.TypedFeaturesetDescriptor<com.mapbox.maps.interactions.standard.generated.StandardPoiState,com.mapbox.maps.interactions.standard.generated.StandardPoiFeature> {\n    ctor public StandardPoi(String? importId = null);\n    ctor public StandardPoi();\n    method public com.mapbox.maps.interactions.standard.generated.StandardPoiState getFeatureState(com.mapbox.bindgen.Value rawState);\n    method public com.mapbox.maps.interactions.standard.generated.StandardPoiFeature getFeaturesetFeature(com.mapbox.geojson.Feature feature, String? featureNamespace, com.mapbox.bindgen.Value rawState);\n    method public String? getImportId();\n    method public com.mapbox.maps.FeaturesetDescriptor toFeaturesetDescriptor();\n    property public final String? importId;\n  }\n\n  public final class StandardPoiFeature extends com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.standard.generated.StandardPoiState> {\n    ctor public StandardPoiFeature(com.mapbox.maps.FeaturesetFeatureId? id, String? importId, com.mapbox.geojson.Feature originalFeature, com.mapbox.maps.interactions.standard.generated.StandardPoiState state);\n    method public String? getAirportRef();\n    method public String? getClass();\n    method public com.mapbox.geojson.Point getGeometry();\n    method public String? getGroup();\n    method public String? getMaki();\n    method public String? getName();\n    method public String? getTransitMode();\n    method public String? getTransitNetwork();\n    method public String? getTransitStopType();\n    property public final String? airportRef;\n    property public final String? class;\n    property public com.mapbox.geojson.Point geometry;\n    property public final String? group;\n    property public final String? maki;\n    property public final String? name;\n    property public final String? transitMode;\n    property public final String? transitNetwork;\n    property public final String? transitStopType;\n  }\n\n  public final class StandardPoiState extends com.mapbox.maps.interactions.FeatureState {\n    method public Boolean? getHide();\n    property public final Boolean? hide;\n  }\n\n  public static final class StandardPoiState.Builder extends com.mapbox.maps.interactions.FeatureState.Builder {\n    ctor public StandardPoiState.Builder();\n    method public com.mapbox.maps.interactions.standard.generated.StandardPoiState build();\n    method public com.mapbox.maps.interactions.standard.generated.StandardPoiState.Builder hide(boolean hide);\n  }\n\n  public final class StandardPoiStateKey extends com.mapbox.maps.interactions.FeatureStateKey<com.mapbox.maps.interactions.standard.generated.StandardPoiState> {\n    field public static final com.mapbox.maps.interactions.standard.generated.StandardPoiStateKey.Companion Companion;\n  }\n\n  public static final class StandardPoiStateKey.Companion {\n    method @com.mapbox.maps.MapboxDelicateApi public com.mapbox.maps.interactions.standard.generated.StandardPoiStateKey create(String key);\n    method public com.mapbox.maps.interactions.standard.generated.StandardPoiStateKey getHIDE();\n    property public final com.mapbox.maps.interactions.standard.generated.StandardPoiStateKey HIDE;\n  }\n\n  public final class StandardPoiStateKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.interactions.standard.generated.StandardPoiState! StandardPoiState(kotlin.jvm.functions.Function1<? super com.mapbox.maps.interactions.standard.generated.StandardPoiState.Builder,? extends kotlin.Unit> init);\n  }\n\n}\n\npackage com.mapbox.maps.module {\n\n  public interface MapTelemetry {\n    method public void disableTelemetrySession();\n    method public default boolean getUserTelemetryRequestState();\n    method public void onAppUserTurnstileEvent();\n    method public void onPerformanceEvent(android.os.Bundle?);\n    method public void setUserTelemetryRequestState(boolean);\n  }\n\n}\n\npackage com.mapbox.maps.plugin {\n\n  public fun interface ContextBinder {\n    method public void bind(android.content.Context context, android.util.AttributeSet? attrs, float pixelRatio);\n  }\n\n  @kotlinx.parcelize.Parcelize public final class DistanceUnits implements android.os.Parcelable {\n    ctor public DistanceUnits(String value);\n    method public int getOrdinal();\n    method public String getValue();\n    method public static com.mapbox.maps.plugin.DistanceUnits valueOf(String value);\n    property public final int ordinal;\n    property public final String value;\n    field public static final com.mapbox.maps.plugin.DistanceUnits.Companion Companion;\n    field public static final com.mapbox.maps.plugin.DistanceUnits IMPERIAL;\n    field public static final com.mapbox.maps.plugin.DistanceUnits METRIC;\n    field public static final com.mapbox.maps.plugin.DistanceUnits NAUTICAL;\n  }\n\n  public static final class DistanceUnits.Companion {\n    method public com.mapbox.maps.plugin.DistanceUnits valueOf(String value);\n    method public java.util.List<com.mapbox.maps.plugin.DistanceUnits> values();\n  }\n\n  public final class InvalidPluginConfigurationException extends java.lang.Exception {\n    ctor public InvalidPluginConfigurationException(String exceptionMessage);\n  }\n\n  public interface LifecyclePlugin {\n    method public default void onStart();\n    method public default void onStop();\n  }\n\n  @kotlinx.parcelize.Parcelize public abstract sealed class LocationPuck implements android.os.Parcelable {\n  }\n\n  public final class LocationPuck2D extends com.mapbox.maps.plugin.LocationPuck {\n    ctor public LocationPuck2D(com.mapbox.maps.ImageHolder? topImage = null, com.mapbox.maps.ImageHolder? bearingImage = null, com.mapbox.maps.ImageHolder? shadowImage = null, String? scaleExpression = null, float opacity = 1f);\n    ctor public LocationPuck2D(com.mapbox.maps.ImageHolder? topImage = null, com.mapbox.maps.ImageHolder? bearingImage = null, com.mapbox.maps.ImageHolder? shadowImage = null, String? scaleExpression = null);\n    ctor public LocationPuck2D(com.mapbox.maps.ImageHolder? topImage = null, com.mapbox.maps.ImageHolder? bearingImage = null, com.mapbox.maps.ImageHolder? shadowImage = null);\n    ctor public LocationPuck2D(com.mapbox.maps.ImageHolder? topImage = null, com.mapbox.maps.ImageHolder? bearingImage = null);\n    ctor public LocationPuck2D(com.mapbox.maps.ImageHolder? topImage = null);\n    ctor public LocationPuck2D();\n    method public com.mapbox.maps.ImageHolder? component1();\n    method public com.mapbox.maps.ImageHolder? component2();\n    method public com.mapbox.maps.ImageHolder? component3();\n    method public String? component4();\n    method public float component5();\n    method public com.mapbox.maps.plugin.LocationPuck2D copy(com.mapbox.maps.ImageHolder? topImage, com.mapbox.maps.ImageHolder? bearingImage, com.mapbox.maps.ImageHolder? shadowImage, String? scaleExpression, float opacity);\n    method public com.mapbox.maps.ImageHolder? getBearingImage();\n    method public float getOpacity();\n    method public String? getScaleExpression();\n    method public com.mapbox.maps.ImageHolder? getShadowImage();\n    method public com.mapbox.maps.ImageHolder? getTopImage();\n    method public void setBearingImage(com.mapbox.maps.ImageHolder?);\n    method public void setOpacity(float);\n    method public void setScaleExpression(String?);\n    method public void setShadowImage(com.mapbox.maps.ImageHolder?);\n    method public void setTopImage(com.mapbox.maps.ImageHolder?);\n    property public final com.mapbox.maps.ImageHolder? bearingImage;\n    property public final float opacity;\n    property public final String? scaleExpression;\n    property public final com.mapbox.maps.ImageHolder? shadowImage;\n    property public final com.mapbox.maps.ImageHolder? topImage;\n  }\n\n  public final class LocationPuck3D extends com.mapbox.maps.plugin.LocationPuck {\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null, int modelColor = Color.parseColor(\"#ffffff\"), String? modelColorExpression = null, float modelColorMixIntensity = 0f, String? modelColorMixIntensityExpression = null, @com.mapbox.maps.MapboxExperimental java.util.List<java.lang.String> materialOverrides = emptyList(), @com.mapbox.maps.MapboxExperimental java.util.List<java.lang.String> nodeOverrides = emptyList(), @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelElevationReference modelElevationReference = com.mapbox.maps.plugin.ModelElevationReference.GROUND, @com.mapbox.maps.MapboxExperimental String modelColorUseTheme = \"default\", @com.mapbox.maps.MapboxExperimental String? modelColorUseThemeExpression = null);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null, int modelColor = Color.parseColor(\"#ffffff\"), String? modelColorExpression = null, float modelColorMixIntensity = 0f, String? modelColorMixIntensityExpression = null, @com.mapbox.maps.MapboxExperimental java.util.List<java.lang.String> materialOverrides = emptyList(), @com.mapbox.maps.MapboxExperimental java.util.List<java.lang.String> nodeOverrides = emptyList(), @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelElevationReference modelElevationReference = com.mapbox.maps.plugin.ModelElevationReference.GROUND, @com.mapbox.maps.MapboxExperimental String modelColorUseTheme = \"default\");\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null, int modelColor = Color.parseColor(\"#ffffff\"), String? modelColorExpression = null, float modelColorMixIntensity = 0f, String? modelColorMixIntensityExpression = null, @com.mapbox.maps.MapboxExperimental java.util.List<java.lang.String> materialOverrides = emptyList(), @com.mapbox.maps.MapboxExperimental java.util.List<java.lang.String> nodeOverrides = emptyList(), @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelElevationReference modelElevationReference = com.mapbox.maps.plugin.ModelElevationReference.GROUND);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null, int modelColor = Color.parseColor(\"#ffffff\"), String? modelColorExpression = null, float modelColorMixIntensity = 0f, String? modelColorMixIntensityExpression = null, @com.mapbox.maps.MapboxExperimental java.util.List<java.lang.String> materialOverrides = emptyList(), @com.mapbox.maps.MapboxExperimental java.util.List<java.lang.String> nodeOverrides = emptyList());\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null, int modelColor = Color.parseColor(\"#ffffff\"), String? modelColorExpression = null, float modelColorMixIntensity = 0f, String? modelColorMixIntensityExpression = null, @com.mapbox.maps.MapboxExperimental java.util.List<java.lang.String> materialOverrides = emptyList());\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null, int modelColor = Color.parseColor(\"#ffffff\"), String? modelColorExpression = null, float modelColorMixIntensity = 0f, String? modelColorMixIntensityExpression = null);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null, int modelColor = Color.parseColor(\"#ffffff\"), String? modelColorExpression = null, float modelColorMixIntensity = 0f);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null, int modelColor = Color.parseColor(\"#ffffff\"), String? modelColorExpression = null);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null, int modelColor = Color.parseColor(\"#ffffff\"));\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null, String? modelRotationExpression = null);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null, String? modelOpacityExpression = null);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f, String? modelEmissiveStrengthExpression = null);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT, float modelEmissiveStrength = 1f);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true, @com.mapbox.maps.MapboxExperimental com.mapbox.maps.plugin.ModelScaleMode modelScaleMode = com.mapbox.maps.plugin.ModelScaleMode.VIEWPORT);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true, @com.mapbox.maps.MapboxExperimental boolean modelReceiveShadows = true);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0), @com.mapbox.maps.MapboxExperimental boolean modelCastShadows = true);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0), java.util.List<java.lang.Float> modelRotation = listOf(0.0, 0.0, 90.0));\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null, java.util.List<java.lang.Float> modelTranslation = listOf(0.0, 0.0, 0.0));\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0), String? modelScaleExpression = null);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f, java.util.List<java.lang.Float> modelScale = listOf(1.0, 1.0, 1.0));\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0), float modelOpacity = 1f);\n    ctor public LocationPuck3D(String modelUri, java.util.List<java.lang.Float> position = listOf(0.0, 0.0));\n    ctor public LocationPuck3D(String modelUri);\n    method public String component1();\n    method public com.mapbox.maps.plugin.ModelScaleMode component10();\n    method public float component11();\n    method public String? component12();\n    method public String? component13();\n    method public String? component14();\n    method public int component15();\n    method public String? component16();\n    method public float component17();\n    method public String? component18();\n    method public java.util.List<java.lang.String> component19();\n    method public java.util.List<java.lang.Float> component2();\n    method public java.util.List<java.lang.String> component20();\n    method public com.mapbox.maps.plugin.ModelElevationReference component21();\n    method public String component22();\n    method public String? component23();\n    method public float component3();\n    method public java.util.List<java.lang.Float> component4();\n    method public String? component5();\n    method public java.util.List<java.lang.Float> component6();\n    method public java.util.List<java.lang.Float> component7();\n    method public boolean component8();\n    method public boolean component9();\n    method public com.mapbox.maps.plugin.LocationPuck3D copy(String modelUri, java.util.List<java.lang.Float> position, float modelOpacity, java.util.List<java.lang.Float> modelScale, String? modelScaleExpression, java.util.List<java.lang.Float> modelTranslation, java.util.List<java.lang.Float> modelRotation, boolean modelCastShadows, boolean modelReceiveShadows, com.mapbox.maps.plugin.ModelScaleMode modelScaleMode, float modelEmissiveStrength, String? modelEmissiveStrengthExpression, String? modelOpacityExpression, String? modelRotationExpression, int modelColor, String? modelColorExpression, float modelColorMixIntensity, String? modelColorMixIntensityExpression, java.util.List<java.lang.String> materialOverrides, java.util.List<java.lang.String> nodeOverrides, com.mapbox.maps.plugin.ModelElevationReference modelElevationReference, String modelColorUseTheme, String? modelColorUseThemeExpression);\n    method public java.util.List<java.lang.String> getMaterialOverrides();\n    method public boolean getModelCastShadows();\n    method public int getModelColor();\n    method public String? getModelColorExpression();\n    method public float getModelColorMixIntensity();\n    method public String? getModelColorMixIntensityExpression();\n    method public String getModelColorUseTheme();\n    method public String? getModelColorUseThemeExpression();\n    method public com.mapbox.maps.plugin.ModelElevationReference getModelElevationReference();\n    method public float getModelEmissiveStrength();\n    method public String? getModelEmissiveStrengthExpression();\n    method public float getModelOpacity();\n    method public String? getModelOpacityExpression();\n    method public boolean getModelReceiveShadows();\n    method public java.util.List<java.lang.Float> getModelRotation();\n    method public String? getModelRotationExpression();\n    method public java.util.List<java.lang.Float> getModelScale();\n    method public String? getModelScaleExpression();\n    method public com.mapbox.maps.plugin.ModelScaleMode getModelScaleMode();\n    method public java.util.List<java.lang.Float> getModelTranslation();\n    method public String getModelUri();\n    method public java.util.List<java.lang.String> getNodeOverrides();\n    method public java.util.List<java.lang.Float> getPosition();\n    method public void setMaterialOverrides(java.util.List<java.lang.String>);\n    method public void setModelCastShadows(boolean);\n    method public void setModelColor(int);\n    method public void setModelColorExpression(String?);\n    method public void setModelColorMixIntensity(float);\n    method public void setModelColorMixIntensityExpression(String?);\n    method public void setModelColorUseTheme(String);\n    method public void setModelColorUseThemeExpression(String?);\n    method public void setModelElevationReference(com.mapbox.maps.plugin.ModelElevationReference);\n    method public void setModelEmissiveStrength(float);\n    method public void setModelEmissiveStrengthExpression(String?);\n    method public void setModelOpacity(float);\n    method public void setModelOpacityExpression(String?);\n    method public void setModelReceiveShadows(boolean);\n    method public void setModelRotation(java.util.List<java.lang.Float>);\n    method public void setModelRotationExpression(String?);\n    method public void setModelScale(java.util.List<java.lang.Float>);\n    method public void setModelScaleExpression(String?);\n    method public void setModelScaleMode(com.mapbox.maps.plugin.ModelScaleMode);\n    method public void setModelTranslation(java.util.List<java.lang.Float>);\n    method public void setModelUri(String);\n    method public void setNodeOverrides(java.util.List<java.lang.String>);\n    method public void setPosition(java.util.List<java.lang.Float>);\n    property public final java.util.List<java.lang.String> materialOverrides;\n    property public final boolean modelCastShadows;\n    property public final int modelColor;\n    property public final String? modelColorExpression;\n    property public final float modelColorMixIntensity;\n    property public final String? modelColorMixIntensityExpression;\n    property public final String modelColorUseTheme;\n    property public final String? modelColorUseThemeExpression;\n    property public final com.mapbox.maps.plugin.ModelElevationReference modelElevationReference;\n    property public final float modelEmissiveStrength;\n    property public final String? modelEmissiveStrengthExpression;\n    property public final float modelOpacity;\n    property public final String? modelOpacityExpression;\n    property public final boolean modelReceiveShadows;\n    property public final java.util.List<java.lang.Float> modelRotation;\n    property public final String? modelRotationExpression;\n    property public final java.util.List<java.lang.Float> modelScale;\n    property public final String? modelScaleExpression;\n    property public final com.mapbox.maps.plugin.ModelScaleMode modelScaleMode;\n    property public final java.util.List<java.lang.Float> modelTranslation;\n    property public final String modelUri;\n    property public final java.util.List<java.lang.String> nodeOverrides;\n    property public final java.util.List<java.lang.Float> position;\n  }\n\n  public fun interface MapCameraPlugin extends com.mapbox.maps.plugin.MapPlugin {\n    method public void onCameraMove(com.mapbox.geojson.Point center, double zoom, double pitch, double bearing, com.mapbox.maps.EdgeInsets padding);\n  }\n\n  public interface MapPlugin {\n    method public default void cleanup();\n    method public default void initialize();\n    method public default void onDelegateProvider(com.mapbox.maps.plugin.delegates.MapDelegateProvider delegateProvider);\n  }\n\n  public interface MapSizePlugin {\n    method public default void onSizeChanged(int width, int height);\n  }\n\n  public interface MapStyleObserverPlugin {\n    method public void onStyleChanged(com.mapbox.maps.MapboxStyleManager style);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public enum ModelElevationReference {\n    method public final String! getValue();\n    property public final String! value;\n    enum_constant public static final com.mapbox.maps.plugin.ModelElevationReference GROUND;\n    enum_constant public static final com.mapbox.maps.plugin.ModelElevationReference SEA;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public enum ModelScaleMode {\n    method public final String! getValue();\n    property public final String! value;\n    enum_constant public static final com.mapbox.maps.plugin.ModelScaleMode MAP;\n    enum_constant public static final com.mapbox.maps.plugin.ModelScaleMode VIEWPORT;\n  }\n\n  public abstract sealed class Plugin {\n    method public final String getId();\n    method public final com.mapbox.maps.plugin.MapPlugin? getInstance();\n    property public final String id;\n    property public final com.mapbox.maps.plugin.MapPlugin? instance;\n    field public static final com.mapbox.maps.plugin.Plugin.Companion Companion;\n    field public static final String MAPBOX_ANNOTATION_PLUGIN_ID = \"MAPBOX_ANNOTATION_PLUGIN_ID\";\n    field public static final String MAPBOX_ATTRIBUTION_PLUGIN_ID = \"MAPBOX_ATTRIBUTION_PLUGIN_ID\";\n    field public static final String MAPBOX_CAMERA_PLUGIN_ID = \"MAPBOX_CAMERA_PLUGIN_ID\";\n    field public static final String MAPBOX_COMPASS_PLUGIN_ID = \"MAPBOX_COMPASS_PLUGIN_ID\";\n    field public static final String MAPBOX_GESTURES_PLUGIN_ID = \"MAPBOX_GESTURES_PLUGIN_ID\";\n    field public static final String MAPBOX_INDOOR_SELECTOR_PLUGIN_ID = \"MAPBOX_INDOOR_SELECTOR_PLUGIN_ID\";\n    field public static final String MAPBOX_LIFECYCLE_PLUGIN_ID = \"MAPBOX_LIFECYCLE_PLUGIN_ID\";\n    field public static final String MAPBOX_LOCATION_COMPONENT_PLUGIN_ID = \"MAPBOX_LOCATION_COMPONENT_PLUGIN_ID\";\n    field public static final String MAPBOX_LOGO_PLUGIN_ID = \"MAPBOX_LOGO_PLUGIN_ID\";\n    field public static final String MAPBOX_MAP_OVERLAY_PLUGIN_ID = \"MAPBOX_MAP_OVERLAY_PLUGIN_ID\";\n    field public static final String MAPBOX_SCALEBAR_PLUGIN_ID = \"MAPBOX_SCALEBAR_PLUGIN_ID\";\n    field public static final String MAPBOX_VIEWPORT_PLUGIN_ID = \"MAPBOX_VIEWPORT_PLUGIN_ID\";\n  }\n\n  public static final class Plugin.Companion {\n  }\n\n  public static final class Plugin.Custom extends com.mapbox.maps.plugin.Plugin {\n    ctor public Plugin.Custom(String id, com.mapbox.maps.plugin.MapPlugin instance);\n  }\n\n  public static final class Plugin.Mapbox extends com.mapbox.maps.plugin.Plugin {\n    ctor public Plugin.Mapbox(String id);\n  }\n\n  public enum PuckBearing {\n    method public final String! getValue();\n    property public final String! value;\n    enum_constant public static final com.mapbox.maps.plugin.PuckBearing COURSE;\n    enum_constant public static final com.mapbox.maps.plugin.PuckBearing HEADING;\n  }\n\n  public enum ScrollMode {\n    method public final String! getValue();\n    property public final String! value;\n    enum_constant public static final com.mapbox.maps.plugin.ScrollMode HORIZONTAL;\n    enum_constant public static final com.mapbox.maps.plugin.ScrollMode HORIZONTAL_AND_VERTICAL;\n    enum_constant public static final com.mapbox.maps.plugin.ScrollMode VERTICAL;\n  }\n\n  public fun interface ViewPlugin extends com.mapbox.maps.plugin.MapPlugin {\n    method public android.view.View bind(android.widget.FrameLayout mapView, android.util.AttributeSet? attrs, float pixelRatio);\n    method public default void onPluginView(android.view.View view);\n  }\n\n  public static final class ViewPlugin.Initializer {\n    ctor public ViewPlugin.Initializer(java.lang.ref.WeakReference<android.content.Context> context, android.content.res.TypedArray attributes, float pixelRatio);\n    method public java.lang.ref.WeakReference<android.content.Context> component1();\n    method public android.content.res.TypedArray component2();\n    method public float component3();\n    method public com.mapbox.maps.plugin.ViewPlugin.Initializer copy(java.lang.ref.WeakReference<android.content.Context> context, android.content.res.TypedArray attributes, float pixelRatio);\n    method public android.content.res.TypedArray getAttributes();\n    method public java.lang.ref.WeakReference<android.content.Context> getContext();\n    method public float getPixelRatio();\n    property public final android.content.res.TypedArray attributes;\n    property public final java.lang.ref.WeakReference<android.content.Context> context;\n    property public final float pixelRatio;\n  }\n\n}\n\npackage com.mapbox.maps.plugin.animation {\n\n  public interface CameraAnimationsLifecycleListener {\n    method public void onAnimatorCancelling(com.mapbox.maps.plugin.animation.CameraAnimatorType type, android.animation.ValueAnimator animator, String? owner);\n    method public void onAnimatorEnding(com.mapbox.maps.plugin.animation.CameraAnimatorType type, android.animation.ValueAnimator animator, String? owner);\n    method public void onAnimatorInterrupting(com.mapbox.maps.plugin.animation.CameraAnimatorType type, android.animation.ValueAnimator runningAnimator, String? runningAnimatorOwner, android.animation.ValueAnimator newAnimator, String? newAnimatorOwner);\n    method public void onAnimatorStarting(com.mapbox.maps.plugin.animation.CameraAnimatorType type, android.animation.ValueAnimator animator, String? owner);\n  }\n\n  public interface CameraAnimationsPlugin extends com.mapbox.maps.plugin.MapPlugin {\n    method public void addCameraAnchorChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorNullableChangeListener<com.mapbox.maps.ScreenCoordinate> listener);\n    method public void addCameraAnimationsLifecycleListener(com.mapbox.maps.plugin.animation.CameraAnimationsLifecycleListener listener);\n    method public void addCameraBearingChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<java.lang.Double> listener);\n    method public void addCameraCenterChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<com.mapbox.geojson.Point> listener);\n    method public void addCameraPaddingChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<com.mapbox.maps.EdgeInsets> listener);\n    method public void addCameraPitchChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<java.lang.Double> listener);\n    method public void addCameraZoomChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<java.lang.Double> listener);\n    method public double calculateScaleBy(double amount, double currentZoom);\n    method public void cancelAllAnimators(java.util.List<java.lang.String> exceptOwnerList = emptyList());\n    method public android.animation.ValueAnimator createAnchorAnimator(com.mapbox.maps.plugin.animation.CameraAnimatorOptions<com.mapbox.maps.ScreenCoordinate> options, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? block = null);\n    method public android.animation.ValueAnimator createBearingAnimator(com.mapbox.maps.plugin.animation.CameraAnimatorOptions<java.lang.Double> options, boolean useShortestPath = true, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? block = null);\n    method @Deprecated public default android.animation.ValueAnimator createCenterAnimator(com.mapbox.maps.plugin.animation.CameraAnimatorOptions<com.mapbox.geojson.Point> options, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? block = null);\n    method public android.animation.ValueAnimator createCenterAnimator(com.mapbox.maps.plugin.animation.CameraAnimatorOptions<com.mapbox.geojson.Point> options, boolean useShortestPath, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? block = null);\n    method public android.animation.ValueAnimator createPaddingAnimator(com.mapbox.maps.plugin.animation.CameraAnimatorOptions<com.mapbox.maps.EdgeInsets> options, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? block = null);\n    method public android.animation.ValueAnimator createPitchAnimator(com.mapbox.maps.plugin.animation.CameraAnimatorOptions<java.lang.Double> options, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? block = null);\n    method public android.animation.ValueAnimator createZoomAnimator(com.mapbox.maps.plugin.animation.CameraAnimatorOptions<java.lang.Double> options, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? block = null);\n    method public com.mapbox.common.Cancelable easeTo(com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public com.mapbox.common.Cancelable flyTo(com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public com.mapbox.maps.ScreenCoordinate? getAnchor();\n    method public boolean getDebugMode();\n    method public com.mapbox.common.Cancelable moveBy(com.mapbox.maps.ScreenCoordinate screenCoordinate, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public com.mapbox.common.Cancelable pitchBy(double pitch, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public void playAnimatorsSequentially(android.animation.ValueAnimator... animators);\n    method public void playAnimatorsTogether(android.animation.ValueAnimator... animators);\n    method public void registerAnimators(android.animation.ValueAnimator... cameraAnimators);\n    method public void removeCameraAnchorChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorNullableChangeListener<com.mapbox.maps.ScreenCoordinate> listener);\n    method public void removeCameraAnimationsLifecycleListener(com.mapbox.maps.plugin.animation.CameraAnimationsLifecycleListener listener);\n    method public void removeCameraBearingChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<java.lang.Double> listener);\n    method public void removeCameraCenterChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<com.mapbox.geojson.Point> listener);\n    method public void removeCameraPaddingChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<com.mapbox.maps.EdgeInsets> listener);\n    method public void removeCameraPitchChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<java.lang.Double> listener);\n    method public void removeCameraZoomChangeListener(com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener<java.lang.Double> listener);\n    method public com.mapbox.common.Cancelable rotateBy(com.mapbox.maps.ScreenCoordinate first, com.mapbox.maps.ScreenCoordinate second, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public com.mapbox.common.Cancelable scaleBy(double amount, com.mapbox.maps.ScreenCoordinate? screenCoordinate, com.mapbox.maps.plugin.animation.MapAnimationOptions? animationOptions = null, android.animation.Animator.AnimatorListener? animatorListener = null);\n    method public void setAnchor(com.mapbox.maps.ScreenCoordinate?);\n    method public void setDebugMode(boolean);\n    method public void unregisterAnimators(android.animation.ValueAnimator![] cameraAnimators, boolean cancelAnimators = true);\n    property public abstract com.mapbox.maps.ScreenCoordinate? anchor;\n    property public abstract boolean debugMode;\n  }\n\n  public fun interface CameraAnimatorChangeListener<T> {\n    method public void onChanged(T? updatedValue);\n  }\n\n  public fun interface CameraAnimatorNullableChangeListener<T> {\n    method public void onChanged(T? updatedValue);\n  }\n\n  public final class CameraAnimatorOptions<T> {\n    method public String? getOwner();\n    method public T? getStartValue();\n    method public T![] getTargets();\n    property public final String? owner;\n    property public final T? startValue;\n    property public final T![] targets;\n    field public static final com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion Companion;\n  }\n\n  public static final class CameraAnimatorOptions.Builder<T> {\n    ctor public CameraAnimatorOptions.Builder(T?... targets);\n    method public com.mapbox.maps.plugin.animation.CameraAnimatorOptions<T> build();\n    method public T![] getTargets();\n    method public com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Builder<T> owner(String owner);\n    method public com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Builder<T> startValue(T? startValue);\n    property public final T![] targets;\n  }\n\n  public static final class CameraAnimatorOptions.Companion {\n    method public inline <T> com.mapbox.maps.plugin.animation.CameraAnimatorOptions<T> cameraAnimatorOptions(T![]? targets, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Builder<T>,kotlin.Unit> block = {});\n  }\n\n  public enum CameraAnimatorType {\n    enum_constant public static final com.mapbox.maps.plugin.animation.CameraAnimatorType ANCHOR;\n    enum_constant public static final com.mapbox.maps.plugin.animation.CameraAnimatorType BEARING;\n    enum_constant public static final com.mapbox.maps.plugin.animation.CameraAnimatorType CENTER;\n    enum_constant public static final com.mapbox.maps.plugin.animation.CameraAnimatorType PADDING;\n    enum_constant public static final com.mapbox.maps.plugin.animation.CameraAnimatorType PITCH;\n    enum_constant public static final com.mapbox.maps.plugin.animation.CameraAnimatorType ZOOM;\n  }\n\n  public final class MapAnimationOptions {\n    method public Long? getDuration();\n    method public android.animation.TimeInterpolator? getInterpolator();\n    method public String? getOwner();\n    method public Long? getStartDelay();\n    property public final Long? duration;\n    property public final android.animation.TimeInterpolator? interpolator;\n    property public final String? owner;\n    property public final Long? startDelay;\n    field public static final com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion Companion;\n  }\n\n  public static final class MapAnimationOptions.Builder {\n    ctor public MapAnimationOptions.Builder();\n    method public com.mapbox.maps.plugin.animation.MapAnimationOptions build();\n    method public com.mapbox.maps.plugin.animation.MapAnimationOptions.Builder duration(long duration);\n    method public com.mapbox.maps.plugin.animation.MapAnimationOptions.Builder interpolator(android.animation.TimeInterpolator interpolator);\n    method public com.mapbox.maps.plugin.animation.MapAnimationOptions.Builder owner(String owner);\n    method public com.mapbox.maps.plugin.animation.MapAnimationOptions.Builder startDelay(long startDelay);\n  }\n\n  public static final class MapAnimationOptions.Companion {\n    method public inline com.mapbox.maps.plugin.animation.MapAnimationOptions mapAnimationOptions(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.animation.MapAnimationOptions.Builder,kotlin.Unit> block);\n  }\n\n  public final class MapAnimationOwnerRegistry {\n    field public static final String COMPASS = \"Maps-Compass\";\n    field public static final String GESTURES = \"Maps-Gestures\";\n    field public static final com.mapbox.maps.plugin.animation.MapAnimationOwnerRegistry INSTANCE;\n    field public static final String INTERNAL = \"Maps-CameraInternal\";\n    field public static final String LOCATION = \"Maps-Location\";\n  }\n\n}\n\npackage com.mapbox.maps.plugin.annotation {\n\n  public abstract class Annotation<T extends com.mapbox.geojson.Geometry> {\n    ctor public Annotation(String id, com.google.gson.JsonObject jsonObject, T geometry);\n    method public com.google.gson.JsonElement? getData();\n    method public final T getGeometry();\n    method public final String getId();\n    method protected final com.google.gson.JsonObject getJsonObject();\n    method public final com.google.gson.JsonObject getJsonObjectCopy();\n    method public abstract T? getOffsetGeometry(com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate mapCameraManagerDelegate, com.mapbox.android.gestures.MoveDistancesObject moveDistancesObject);\n    method public abstract com.mapbox.maps.plugin.annotation.AnnotationType getType();\n    method public final boolean isDraggable();\n    method public final boolean isSelected();\n    method public void setData(com.google.gson.JsonElement? jsonElement);\n    method public final void setDraggable(boolean);\n    method public final void setGeometry(T);\n    method public final void setSelected(boolean);\n    method public abstract void setUsedDataDrivenProperties();\n    property public final T geometry;\n    property public final String id;\n    property public final boolean isDraggable;\n    property public final boolean isSelected;\n    property protected final com.google.gson.JsonObject jsonObject;\n    field public static final com.mapbox.maps.plugin.annotation.Annotation.Companion Companion;\n    field public static final String ID_DATA = \"custom_data\";\n    field public static final double MAX_MERCATOR_LATITUDE = 85.05112877980659;\n    field public static final double MIN_MERCATOR_LATITUDE = -85.05112877980659;\n  }\n\n  public static final class Annotation.Companion {\n  }\n\n  public final class AnnotationConfig {\n    ctor public AnnotationConfig(String? belowLayerId = null, String? layerId = null, String? sourceId = null, com.mapbox.maps.plugin.annotation.AnnotationSourceOptions? annotationSourceOptions = null, String? slotName = null);\n    ctor public AnnotationConfig(String? belowLayerId = null, String? layerId = null, String? sourceId = null, com.mapbox.maps.plugin.annotation.AnnotationSourceOptions? annotationSourceOptions = null);\n    ctor public AnnotationConfig(String? belowLayerId = null, String? layerId = null, String? sourceId = null);\n    ctor public AnnotationConfig(String? belowLayerId = null, String? layerId = null);\n    ctor public AnnotationConfig(String? belowLayerId = null);\n    ctor public AnnotationConfig();\n    method public String? component1();\n    method public String? component2();\n    method public String? component3();\n    method public com.mapbox.maps.plugin.annotation.AnnotationSourceOptions? component4();\n    method public String? component5();\n    method public com.mapbox.maps.plugin.annotation.AnnotationConfig copy(String? belowLayerId, String? layerId, String? sourceId, com.mapbox.maps.plugin.annotation.AnnotationSourceOptions? annotationSourceOptions, String? slotName);\n    method public com.mapbox.maps.plugin.annotation.AnnotationSourceOptions? getAnnotationSourceOptions();\n    method public String? getBelowLayerId();\n    method public String? getLayerId();\n    method public String? getSlotName();\n    method public String? getSourceId();\n    property public final com.mapbox.maps.plugin.annotation.AnnotationSourceOptions? annotationSourceOptions;\n    property public final String? belowLayerId;\n    property public final String? layerId;\n    property public final String? slotName;\n    property public final String? sourceId;\n  }\n\n  public interface AnnotationManager<G extends com.mapbox.geojson.Geometry, T extends com.mapbox.maps.plugin.annotation.Annotation<G>, S extends com.mapbox.maps.plugin.annotation.AnnotationOptions<G, T>, D extends com.mapbox.maps.plugin.annotation.OnAnnotationDragListener<? extends T>, U extends com.mapbox.maps.plugin.annotation.OnAnnotationClickListener<T>, V extends com.mapbox.maps.plugin.annotation.OnAnnotationLongClickListener<T>, I extends com.mapbox.maps.plugin.annotation.OnAnnotationInteractionListener<T>> {\n    method public default boolean addClickListener(U u);\n    method public default boolean addDragListener(D d);\n    method public default boolean addInteractionListener(I i);\n    method public default boolean addLongClickListener(V v);\n    method public T create(S option);\n    method public java.util.List<T> create(java.util.List<? extends S> options);\n    method public void delete(T annotation);\n    method public void delete(java.util.List<? extends T> annotations);\n    method public void deleteAll();\n    method public void enableDataDrivenProperty(String property);\n    method public java.util.List<T> getAnnotations();\n    method public java.util.List<U> getClickListeners();\n    method public com.mapbox.maps.plugin.delegates.MapDelegateProvider getDelegateProvider();\n    method public java.util.List<D> getDragListeners();\n    method public java.util.List<I> getInteractionListener();\n    method public java.util.List<V> getLongClickListeners();\n    method public void onDestroy();\n    method public void onSizeChanged(int width, int height);\n    method public default boolean removeClickListener(U u);\n    method public default boolean removeDragListener(D d);\n    method public default boolean removeInteractionListener(I i);\n    method public default boolean removeLongClickListener(V v);\n    method public void selectAnnotation(T annotation);\n    method public void update(T annotation);\n    method public void update(java.util.List<? extends T> annotations);\n    property public abstract java.util.List<T> annotations;\n    property public abstract java.util.List<U> clickListeners;\n    property public abstract com.mapbox.maps.plugin.delegates.MapDelegateProvider delegateProvider;\n    property public abstract java.util.List<D> dragListeners;\n    property public abstract java.util.List<I> interactionListener;\n    property public abstract java.util.List<V> longClickListeners;\n  }\n\n  public fun interface AnnotationOptions<G extends com.mapbox.geojson.Geometry, T extends com.mapbox.maps.plugin.annotation.Annotation<G>> {\n    method public T build(String id, com.mapbox.maps.plugin.annotation.AnnotationManager<G,T,?,?,?,?,?> annotationManager);\n  }\n\n  public interface AnnotationPlugin extends com.mapbox.maps.plugin.MapPlugin com.mapbox.maps.plugin.MapSizePlugin com.mapbox.maps.plugin.MapStyleObserverPlugin {\n    method public com.mapbox.maps.plugin.annotation.AnnotationManager<?,?,?,?,?,?,?> createAnnotationManager(com.mapbox.maps.plugin.annotation.AnnotationType type, com.mapbox.maps.plugin.annotation.AnnotationConfig? annotationConfig);\n    method public void removeAnnotationManager(com.mapbox.maps.plugin.annotation.AnnotationManager<?,?,?,?,?,?,?> annotationManager);\n  }\n\n  public final class AnnotationSourceOptions {\n    ctor public AnnotationSourceOptions(Long? maxZoom = null, Long? buffer = null, Boolean? lineMetrics = null, Double? tolerance = null, com.mapbox.maps.plugin.annotation.ClusterOptions? clusterOptions = null);\n    ctor public AnnotationSourceOptions(Long? maxZoom = null, Long? buffer = null, Boolean? lineMetrics = null, Double? tolerance = null);\n    ctor public AnnotationSourceOptions(Long? maxZoom = null, Long? buffer = null, Boolean? lineMetrics = null);\n    ctor public AnnotationSourceOptions(Long? maxZoom = null, Long? buffer = null);\n    ctor public AnnotationSourceOptions(Long? maxZoom = null);\n    ctor public AnnotationSourceOptions();\n    method public Long? component1();\n    method public Long? component2();\n    method public Boolean? component3();\n    method public Double? component4();\n    method public com.mapbox.maps.plugin.annotation.ClusterOptions? component5();\n    method public com.mapbox.maps.plugin.annotation.AnnotationSourceOptions copy(Long? maxZoom, Long? buffer, Boolean? lineMetrics, Double? tolerance, com.mapbox.maps.plugin.annotation.ClusterOptions? clusterOptions);\n    method public Long? getBuffer();\n    method public com.mapbox.maps.plugin.annotation.ClusterOptions? getClusterOptions();\n    method public Boolean? getLineMetrics();\n    method public Long? getMaxZoom();\n    method public Double? getTolerance();\n    property public final Long? buffer;\n    property public final com.mapbox.maps.plugin.annotation.ClusterOptions? clusterOptions;\n    property public final Boolean? lineMetrics;\n    property public final Long? maxZoom;\n    property public final Double? tolerance;\n  }\n\n  public enum AnnotationType {\n    method public final int getValue();\n    method public final void setValue(int);\n    property public final int value;\n    enum_constant public static final com.mapbox.maps.plugin.annotation.AnnotationType CircleAnnotation;\n    enum_constant public static final com.mapbox.maps.plugin.annotation.AnnotationType PointAnnotation;\n    enum_constant public static final com.mapbox.maps.plugin.annotation.AnnotationType PolygonAnnotation;\n    enum_constant public static final com.mapbox.maps.plugin.annotation.AnnotationType PolylineAnnotation;\n  }\n\n  public interface ClusterAnnotationManager {\n    method public default boolean addClusterClickListener(com.mapbox.maps.plugin.annotation.OnClusterClickListener clusterClickListener);\n    method public default boolean addClusterLongClickListener(com.mapbox.maps.plugin.annotation.OnClusterLongClickListener onClusterLongClickListener);\n    method public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterClickListener> getClusterClickListeners();\n    method public java.util.List<com.mapbox.maps.plugin.annotation.OnClusterLongClickListener> getClusterLongClickListeners();\n    method public default boolean removeClusterClickListener(com.mapbox.maps.plugin.annotation.OnClusterClickListener clusterClickListener);\n    method public default boolean removeClusterLongClickListener(com.mapbox.maps.plugin.annotation.OnClusterLongClickListener onClusterLongClickListener);\n    property public abstract java.util.List<com.mapbox.maps.plugin.annotation.OnClusterClickListener> clusterClickListeners;\n    property public abstract java.util.List<com.mapbox.maps.plugin.annotation.OnClusterLongClickListener> clusterLongClickListeners;\n  }\n\n  public final class ClusterFeature {\n    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public ClusterFeature(com.mapbox.maps.interactions.FeaturesetFeature<com.mapbox.maps.interactions.FeatureState> featuresetFeature);\n    method public String getClusterId();\n    method public com.mapbox.geojson.Feature getOriginalFeature();\n    method public long getPointCount();\n    method public String getPointCountAbbreviated();\n    property public final String clusterId;\n    property public final com.mapbox.geojson.Feature originalFeature;\n    property public final long pointCount;\n    property public final String pointCountAbbreviated;\n  }\n\n  public final class ClusterOptions {\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0, com.mapbox.bindgen.Value? textColorExpression = null, int textColor = -1, com.mapbox.bindgen.Value? textSizeExpression = null, double textSize = 12.0, com.mapbox.bindgen.Value? textField = null, long clusterMaxZoom = 14, long clusterMinPoints = 2L, java.util.List<kotlin.Pair<java.lang.Integer,java.lang.Integer>> colorLevels = listOf(<init>(0, Color.BLUE)), java.util.HashMap<java.lang.String,java.lang.Object>? clusterProperties = null);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0, com.mapbox.bindgen.Value? textColorExpression = null, int textColor = -1, com.mapbox.bindgen.Value? textSizeExpression = null, double textSize = 12.0, com.mapbox.bindgen.Value? textField = null, long clusterMaxZoom = 14, long clusterMinPoints = 2L, java.util.List<kotlin.Pair<java.lang.Integer,java.lang.Integer>> colorLevels = listOf(<init>(0, Color.BLUE)));\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0, com.mapbox.bindgen.Value? textColorExpression = null, int textColor = -1, com.mapbox.bindgen.Value? textSizeExpression = null, double textSize = 12.0, com.mapbox.bindgen.Value? textField = null, long clusterMaxZoom = 14, long clusterMinPoints = 2L);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0, com.mapbox.bindgen.Value? textColorExpression = null, int textColor = -1, com.mapbox.bindgen.Value? textSizeExpression = null, double textSize = 12.0, com.mapbox.bindgen.Value? textField = null, long clusterMaxZoom = 14);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0, com.mapbox.bindgen.Value? textColorExpression = null, int textColor = -1, com.mapbox.bindgen.Value? textSizeExpression = null, double textSize = 12.0, com.mapbox.bindgen.Value? textField = null);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0, com.mapbox.bindgen.Value? textColorExpression = null, int textColor = -1, com.mapbox.bindgen.Value? textSizeExpression = null, double textSize = 12.0);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0, com.mapbox.bindgen.Value? textColorExpression = null, int textColor = -1, com.mapbox.bindgen.Value? textSizeExpression = null);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0, com.mapbox.bindgen.Value? textColorExpression = null, int textColor = -1);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0, com.mapbox.bindgen.Value? textColorExpression = null);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null, double circleRadius = 18.0);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50, com.mapbox.bindgen.Value? circleRadiusExpression = null);\n    ctor public ClusterOptions(boolean cluster = true, long clusterRadius = 50);\n    ctor public ClusterOptions(boolean cluster = true);\n    ctor public ClusterOptions();\n    method public boolean component1();\n    method public long component10();\n    method public long component11();\n    method public java.util.List<kotlin.Pair<java.lang.Integer,java.lang.Integer>> component12();\n    method public java.util.HashMap<java.lang.String,java.lang.Object>? component13();\n    method public long component2();\n    method public com.mapbox.bindgen.Value? component3();\n    method public double component4();\n    method public com.mapbox.bindgen.Value? component5();\n    method public int component6();\n    method public com.mapbox.bindgen.Value? component7();\n    method public double component8();\n    method public com.mapbox.bindgen.Value? component9();\n    method public com.mapbox.maps.plugin.annotation.ClusterOptions copy(boolean cluster, long clusterRadius, com.mapbox.bindgen.Value? circleRadiusExpression, double circleRadius, com.mapbox.bindgen.Value? textColorExpression, int textColor, com.mapbox.bindgen.Value? textSizeExpression, double textSize, com.mapbox.bindgen.Value? textField, long clusterMaxZoom, long clusterMinPoints, java.util.List<kotlin.Pair<java.lang.Integer,java.lang.Integer>> colorLevels, java.util.HashMap<java.lang.String,java.lang.Object>? clusterProperties);\n    method public double getCircleRadius();\n    method public com.mapbox.bindgen.Value? getCircleRadiusExpression();\n    method public boolean getCluster();\n    method public long getClusterMaxZoom();\n    method public long getClusterMinPoints();\n    method public java.util.HashMap<java.lang.String,java.lang.Object>? getClusterProperties();\n    method public long getClusterRadius();\n    method public java.util.List<kotlin.Pair<java.lang.Integer,java.lang.Integer>> getColorLevels();\n    method public int getTextColor();\n    method public com.mapbox.bindgen.Value? getTextColorExpression();\n    method public com.mapbox.bindgen.Value? getTextField();\n    method public double getTextSize();\n    method public com.mapbox.bindgen.Value? getTextSizeExpression();\n    property public final double circleRadius;\n    property public final com.mapbox.bindgen.Value? circleRadiusExpression;\n    property public final boolean cluster;\n    property public final long clusterMaxZoom;\n    property public final long clusterMinPoints;\n    property public final java.util.HashMap<java.lang.String,java.lang.Object>? clusterProperties;\n    property public final long clusterRadius;\n    property public final java.util.List<kotlin.Pair<java.lang.Integer,java.lang.Integer>> colorLevels;\n    property public final int textColor;\n    property public final com.mapbox.bindgen.Value? textColorExpression;\n    property public final com.mapbox.bindgen.Value? textField;\n    property public final double textSize;\n    property public final com.mapbox.bindgen.Value? textSizeExpression;\n  }\n\n  public fun interface OnAnnotationClickListener<T extends com.mapbox.maps.plugin.annotation.Annotation<?>> {\n    method public boolean onAnnotationClick(T annotation);\n  }\n\n  public interface OnAnnotationDragListener<T extends com.mapbox.maps.plugin.annotation.Annotation<?>> {\n    method public void onAnnotationDrag(com.mapbox.maps.plugin.annotation.Annotation<?> annotation);\n    method public void onAnnotationDragFinished(com.mapbox.maps.plugin.annotation.Annotation<?> annotation);\n    method public void onAnnotationDragStarted(com.mapbox.maps.plugin.annotation.Annotation<?> annotation);\n  }\n\n  public interface OnAnnotationInteractionListener<T extends com.mapbox.maps.plugin.annotation.Annotation<?>> {\n    method public void onDeselectAnnotation(T annotation);\n    method public void onSelectAnnotation(T annotation);\n  }\n\n  public fun interface OnAnnotationLongClickListener<T extends com.mapbox.maps.plugin.annotation.Annotation<?>> {\n    method public boolean onAnnotationLongClick(T annotation);\n  }\n\n  public fun interface OnClusterClickListener {\n    method public boolean onClusterClick(com.mapbox.maps.plugin.annotation.ClusterFeature cluster);\n  }\n\n  public fun interface OnClusterLongClickListener {\n    method public boolean onClusterLongClick(com.mapbox.maps.plugin.annotation.ClusterFeature cluster);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.attribution {\n\n  public final class Attribution {\n    ctor public Attribution(String title, String url);\n    method public String component1();\n    method public String component2();\n    method public com.mapbox.maps.plugin.attribution.Attribution copy(String title, String url);\n    method public String getTitle();\n    method public String getTitleAbbreviated();\n    method public String getUrl();\n    property public final String title;\n    property public final String titleAbbreviated;\n    property public final String url;\n    field public static final String ABOUT_MAPS_URL = \"https://www.mapbox.com/about/maps/\";\n    field public static final String ABOUT_TELEMETRY_URL = \"https://www.mapbox.com/telemetry/\";\n    field public static final com.mapbox.maps.plugin.attribution.Attribution.Companion Companion;\n    field public static final String GEOFENCING = \"Mapbox Geofencing\";\n    field public static final String GEOFENCING_URL_MARKER = \"geofencing_url_marker\";\n    field public static final String OSM = \"OpenStreetMap\";\n    field public static final String OSM_ABBR = \"OSM\";\n    field public static final String PRIVACY_POLICY = \"Mapbox Privacy Policy\";\n    field public static final String PRIVACY_POLICY_URL = \"https://www.mapbox.com/legal/privacy#product-privacy-policy/\";\n    field public static final String TELEMETRY_SETTINGS = \"Mapbox Telemetry\";\n  }\n\n  public static final class Attribution.Companion {\n  }\n\n  public interface AttributionDialogManager {\n    method public void onStop();\n    method public void showAttribution(com.mapbox.maps.plugin.delegates.MapAttributionDelegate mapAttributionDelegate);\n  }\n\n  public final class AttributionKt {\n    method @com.mapbox.annotation.MapboxExperimental public static boolean isMapboxFeedback(com.mapbox.maps.plugin.attribution.Attribution);\n  }\n\n  public final class AttributionParserConfig {\n    ctor public AttributionParserConfig(boolean withImproveMap = true, boolean withCopyrightSign = true, boolean withTelemetryAttribution = true, boolean withMapboxAttribution = true, boolean withMapboxPrivacyPolicy = true, boolean withMapboxGeofencingConsent = true);\n    ctor public AttributionParserConfig(boolean withImproveMap = true, boolean withCopyrightSign = true, boolean withTelemetryAttribution = true, boolean withMapboxAttribution = true, boolean withMapboxPrivacyPolicy = true);\n    ctor public AttributionParserConfig(boolean withImproveMap = true, boolean withCopyrightSign = true, boolean withTelemetryAttribution = true, boolean withMapboxAttribution = true);\n    ctor public AttributionParserConfig(boolean withImproveMap = true, boolean withCopyrightSign = true, boolean withTelemetryAttribution = true);\n    ctor public AttributionParserConfig(boolean withImproveMap = true, boolean withCopyrightSign = true);\n    ctor public AttributionParserConfig(boolean withImproveMap = true);\n    ctor public AttributionParserConfig();\n    method public boolean getWithCopyrightSign();\n    method public boolean getWithImproveMap();\n    method public boolean getWithMapboxAttribution();\n    method public boolean getWithMapboxGeofencingConsent();\n    method public boolean getWithMapboxPrivacyPolicy();\n    method public boolean getWithTelemetryAttribution();\n    method public void setWithCopyrightSign(boolean);\n    method public void setWithImproveMap(boolean);\n    method public void setWithMapboxAttribution(boolean);\n    method public void setWithMapboxGeofencingConsent(boolean);\n    method public void setWithMapboxPrivacyPolicy(boolean);\n    method public void setWithTelemetryAttribution(boolean);\n    property public final boolean withCopyrightSign;\n    property public final boolean withImproveMap;\n    property public final boolean withMapboxAttribution;\n    property public final boolean withMapboxGeofencingConsent;\n    property public final boolean withMapboxPrivacyPolicy;\n    property public final boolean withTelemetryAttribution;\n  }\n\n  public interface AttributionPlugin extends com.mapbox.maps.plugin.ViewPlugin com.mapbox.maps.plugin.attribution.generated.AttributionSettingsInterface com.mapbox.maps.plugin.LifecyclePlugin {\n    method public com.mapbox.maps.plugin.delegates.MapAttributionDelegate getMapAttributionDelegate();\n    method public default void setContentDescription(CharSequence? contentDescription);\n    method public void setCustomAttributionDialogManager(com.mapbox.maps.plugin.attribution.AttributionDialogManager dialogManager);\n  }\n\n  public interface AttributionView {\n    method public void requestLayout();\n    method public void setAttributionMargins(@Px int left, @Px int top, @Px int right, @Px int bottom);\n    method public default void setContentDescription(CharSequence? contentDescription);\n    method public void setEnable(boolean enabled);\n    method public void setGravity(int gravity);\n    method public void setIconColor(@ColorInt int color);\n    method public void setViewOnClickListener(android.view.View.OnClickListener listener);\n  }\n\n  public fun interface OnAttributionClickListener {\n    method public void onAttributionClick();\n  }\n\n}\n\npackage com.mapbox.maps.plugin.attribution.generated {\n\n  @kotlinx.parcelize.Parcelize public final class AttributionSettings implements android.os.Parcelable {\n    method public boolean getClickable();\n    method public boolean getEnabled();\n    method public int getIconColor();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder toBuilder();\n    property public final boolean clickable;\n    property public final boolean enabled;\n    property public final int iconColor;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final int position;\n  }\n\n  public static final class AttributionSettings.Builder {\n    ctor public AttributionSettings.Builder();\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings build();\n    method public boolean getClickable();\n    method public boolean getEnabled();\n    method public int getIconColor();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder setClickable(boolean clickable);\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder setEnabled(boolean enabled);\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder setIconColor(int iconColor);\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder setMarginBottom(float marginBottom);\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder setMarginLeft(float marginLeft);\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder setMarginRight(float marginRight);\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder setMarginTop(float marginTop);\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder setPosition(int position);\n    property public final boolean clickable;\n    property public final boolean enabled;\n    property public final int iconColor;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final int position;\n  }\n\n  public abstract class AttributionSettingsBase implements com.mapbox.maps.plugin.attribution.generated.AttributionSettingsInterface {\n    ctor public AttributionSettingsBase();\n    method protected abstract void applySettings();\n    method public boolean getClickable();\n    method public boolean getEnabled();\n    method public int getIconColor();\n    method protected abstract com.mapbox.maps.plugin.attribution.generated.AttributionSettings getInternalSettings();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings getSettings();\n    method public void setClickable(boolean);\n    method public void setEnabled(boolean);\n    method public void setIconColor(int);\n    method protected abstract void setInternalSettings(com.mapbox.maps.plugin.attribution.generated.AttributionSettings);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method public void setPosition(int);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder,kotlin.Unit> block);\n    property public boolean clickable;\n    property public boolean enabled;\n    property public int iconColor;\n    property protected abstract com.mapbox.maps.plugin.attribution.generated.AttributionSettings internalSettings;\n    property public float marginBottom;\n    property public float marginLeft;\n    property public float marginRight;\n    property public float marginTop;\n    property public int position;\n  }\n\n  public interface AttributionSettingsInterface {\n    method public boolean getClickable();\n    method public boolean getEnabled();\n    method public int getIconColor();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.attribution.generated.AttributionSettings getSettings();\n    method public void setClickable(boolean);\n    method public void setEnabled(boolean);\n    method public void setIconColor(int);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method public void setPosition(int);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder,kotlin.Unit> block);\n    property public abstract boolean clickable;\n    property public abstract boolean enabled;\n    property public abstract int iconColor;\n    property public abstract float marginBottom;\n    property public abstract float marginLeft;\n    property public abstract float marginRight;\n    property public abstract float marginTop;\n    property public abstract int position;\n  }\n\n  public final class AttributionSettingsKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.plugin.attribution.generated.AttributionSettings! AttributionSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.attribution.generated.AttributionSettings.Builder,? extends kotlin.Unit> initializer);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.compass {\n\n  public interface CompassPlugin extends com.mapbox.maps.plugin.ViewPlugin com.mapbox.maps.plugin.compass.generated.CompassSettingsInterface com.mapbox.maps.plugin.LifecyclePlugin com.mapbox.maps.plugin.MapCameraPlugin {\n    method public void addCompassClickListener(com.mapbox.maps.plugin.compass.OnCompassClickListener onClickListener);\n    method public void onCompassClicked();\n    method public void removeCompassClickListener(com.mapbox.maps.plugin.compass.OnCompassClickListener onClickListener);\n  }\n\n  public interface CompassView {\n    method public int getCompassGravity();\n    method public android.graphics.drawable.Drawable getCompassImage();\n    method public float getCompassRotation();\n    method public boolean isCompassEnabled();\n    method public boolean isCompassVisible();\n    method public void requestLayout();\n    method public void setCompassAlpha(float float);\n    method public void setCompassEnabled(boolean);\n    method public void setCompassGravity(int);\n    method public void setCompassImage(android.graphics.drawable.Drawable);\n    method public void setCompassMargins(@Px int left, @Px int top, @Px int right, @Px int bottom);\n    method public void setCompassRotation(float);\n    method public void setCompassVisible(boolean);\n    property public abstract int compassGravity;\n    property public abstract android.graphics.drawable.Drawable compassImage;\n    property public abstract float compassRotation;\n    property public abstract boolean isCompassEnabled;\n    property public abstract boolean isCompassVisible;\n  }\n\n  public fun interface OnCompassClickListener {\n    method public void onCompassClick();\n  }\n\n}\n\npackage com.mapbox.maps.plugin.compass.generated {\n\n  @kotlinx.parcelize.Parcelize public final class CompassSettings implements android.os.Parcelable {\n    method public boolean getClickable();\n    method public boolean getEnabled();\n    method public boolean getFadeWhenFacingNorth();\n    method public com.mapbox.maps.ImageHolder? getImage();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public float getOpacity();\n    method public int getPosition();\n    method public float getRotation();\n    method public boolean getVisibility();\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder toBuilder();\n    property public final boolean clickable;\n    property public final boolean enabled;\n    property public final boolean fadeWhenFacingNorth;\n    property public final com.mapbox.maps.ImageHolder? image;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final float opacity;\n    property public final int position;\n    property public final float rotation;\n    property public final boolean visibility;\n  }\n\n  public static final class CompassSettings.Builder {\n    ctor public CompassSettings.Builder();\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings build();\n    method public boolean getClickable();\n    method public boolean getEnabled();\n    method public boolean getFadeWhenFacingNorth();\n    method public com.mapbox.maps.ImageHolder? getImage();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public float getOpacity();\n    method public int getPosition();\n    method public float getRotation();\n    method public boolean getVisibility();\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setClickable(boolean clickable);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setEnabled(boolean enabled);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setFadeWhenFacingNorth(boolean fadeWhenFacingNorth);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setImage(com.mapbox.maps.ImageHolder? image);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setMarginBottom(float marginBottom);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setMarginLeft(float marginLeft);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setMarginRight(float marginRight);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setMarginTop(float marginTop);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setOpacity(float opacity);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setPosition(int position);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setRotation(float rotation);\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder setVisibility(boolean visibility);\n    property public final boolean clickable;\n    property public final boolean enabled;\n    property public final boolean fadeWhenFacingNorth;\n    property public final com.mapbox.maps.ImageHolder? image;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final float opacity;\n    property public final int position;\n    property public final float rotation;\n    property public final boolean visibility;\n  }\n\n  public abstract class CompassSettingsBase implements com.mapbox.maps.plugin.compass.generated.CompassSettingsInterface {\n    ctor public CompassSettingsBase();\n    method protected abstract void applySettings();\n    method public boolean getClickable();\n    method public boolean getEnabled();\n    method public boolean getFadeWhenFacingNorth();\n    method public com.mapbox.maps.ImageHolder? getImage();\n    method protected abstract com.mapbox.maps.plugin.compass.generated.CompassSettings getInternalSettings();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public float getOpacity();\n    method public int getPosition();\n    method public float getRotation();\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings getSettings();\n    method public boolean getVisibility();\n    method public void setClickable(boolean);\n    method public void setEnabled(boolean);\n    method public void setFadeWhenFacingNorth(boolean);\n    method public void setImage(com.mapbox.maps.ImageHolder?);\n    method protected abstract void setInternalSettings(com.mapbox.maps.plugin.compass.generated.CompassSettings);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method public void setOpacity(float);\n    method public void setPosition(int);\n    method public void setRotation(float);\n    method public void setVisibility(boolean);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder,kotlin.Unit> block);\n    property public boolean clickable;\n    property public boolean enabled;\n    property public boolean fadeWhenFacingNorth;\n    property public com.mapbox.maps.ImageHolder? image;\n    property protected abstract com.mapbox.maps.plugin.compass.generated.CompassSettings internalSettings;\n    property public float marginBottom;\n    property public float marginLeft;\n    property public float marginRight;\n    property public float marginTop;\n    property public float opacity;\n    property public int position;\n    property public float rotation;\n    property public boolean visibility;\n  }\n\n  public interface CompassSettingsInterface {\n    method public boolean getClickable();\n    method public boolean getEnabled();\n    method public boolean getFadeWhenFacingNorth();\n    method public com.mapbox.maps.ImageHolder? getImage();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public float getOpacity();\n    method public int getPosition();\n    method public float getRotation();\n    method public com.mapbox.maps.plugin.compass.generated.CompassSettings getSettings();\n    method public boolean getVisibility();\n    method public void setClickable(boolean);\n    method public void setEnabled(boolean);\n    method public void setFadeWhenFacingNorth(boolean);\n    method public void setImage(com.mapbox.maps.ImageHolder?);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method public void setOpacity(float);\n    method public void setPosition(int);\n    method public void setRotation(float);\n    method public void setVisibility(boolean);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder,kotlin.Unit> block);\n    property public abstract boolean clickable;\n    property public abstract boolean enabled;\n    property public abstract boolean fadeWhenFacingNorth;\n    property public abstract com.mapbox.maps.ImageHolder? image;\n    property public abstract float marginBottom;\n    property public abstract float marginLeft;\n    property public abstract float marginRight;\n    property public abstract float marginTop;\n    property public abstract float opacity;\n    property public abstract int position;\n    property public abstract float rotation;\n    property public abstract boolean visibility;\n  }\n\n  public final class CompassSettingsKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.plugin.compass.generated.CompassSettings! CompassSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.compass.generated.CompassSettings.Builder,? extends kotlin.Unit> initializer);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.delegates {\n\n  public interface MapAttributionDelegate {\n    method public String buildMapBoxFeedbackUrl(android.content.Context context);\n    method public com.mapbox.maps.geofencing.MapGeofencingConsent geofencingConsent();\n    method public default java.util.List<com.mapbox.maps.plugin.attribution.Attribution> getExtraAttributions();\n    method public java.util.List<com.mapbox.maps.plugin.attribution.Attribution> parseAttributions(android.content.Context context, com.mapbox.maps.plugin.attribution.AttributionParserConfig config);\n    method public default void setExtraAttributions(java.util.List<com.mapbox.maps.plugin.attribution.Attribution>);\n    method public com.mapbox.maps.module.MapTelemetry telemetry();\n    property public default java.util.List<com.mapbox.maps.plugin.attribution.Attribution> extraAttributions;\n  }\n\n  public interface MapCameraManagerDelegate {\n    method @Deprecated public com.mapbox.maps.CameraOptions cameraForCoordinateBounds(com.mapbox.maps.CoordinateBounds bounds, com.mapbox.maps.EdgeInsets? boundsPadding = null, Double? bearing = null, Double? pitch = null, Double? maxZoom = null, com.mapbox.maps.ScreenCoordinate? offset = null);\n    method @Deprecated public com.mapbox.maps.CameraOptions cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.EdgeInsets? coordinatesPadding = null, Double? bearing = null, Double? pitch = null);\n    method @Deprecated public com.mapbox.maps.CameraOptions cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.CameraOptions camera, com.mapbox.maps.ScreenBox box);\n    method @com.mapbox.maps.MapboxDelicateApi public com.mapbox.maps.CameraOptions cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.CameraOptions camera, com.mapbox.maps.EdgeInsets? coordinatesPadding, Double? maxZoom, com.mapbox.maps.ScreenCoordinate? offset);\n    method public void cameraForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates, com.mapbox.maps.CameraOptions camera, com.mapbox.maps.EdgeInsets? coordinatesPadding, Double? maxZoom, com.mapbox.maps.ScreenCoordinate? offset, kotlin.jvm.functions.Function1<? super com.mapbox.maps.CameraOptions,kotlin.Unit> result);\n    method public com.mapbox.maps.CameraOptions cameraForDrag(com.mapbox.maps.ScreenCoordinate fromPoint, com.mapbox.maps.ScreenCoordinate toPoint);\n    method @Deprecated public com.mapbox.maps.CameraOptions cameraForGeometry(com.mapbox.geojson.Geometry geometry, com.mapbox.maps.EdgeInsets? geometryPadding = null, Double? bearing = null, Double? pitch = null);\n    method public com.mapbox.maps.CoordinateBounds coordinateBoundsForCamera(com.mapbox.maps.CameraOptions camera);\n    method public com.mapbox.maps.CoordinateBounds coordinateBoundsForCameraUnwrapped(com.mapbox.maps.CameraOptions camera);\n    method public com.mapbox.maps.CoordinateBounds coordinateBoundsForRect(android.graphics.RectF rectF);\n    method public com.mapbox.maps.CoordinateBoundsZoom coordinateBoundsZoomForCamera(com.mapbox.maps.CameraOptions camera);\n    method public com.mapbox.maps.CoordinateBoundsZoom coordinateBoundsZoomForCameraUnwrapped(com.mapbox.maps.CameraOptions camera);\n    method public com.mapbox.geojson.Point coordinateForPixel(com.mapbox.maps.ScreenCoordinate pixel);\n    method public com.mapbox.maps.CoordinateInfo coordinateInfoForPixel(com.mapbox.maps.ScreenCoordinate pixel);\n    method public java.util.List<com.mapbox.geojson.Point> coordinatesForPixels(java.util.List<com.mapbox.maps.ScreenCoordinate> pixels);\n    method public java.util.List<com.mapbox.maps.CoordinateInfo> coordinatesInfoForPixels(java.util.List<com.mapbox.maps.ScreenCoordinate> pixels);\n    method public com.mapbox.maps.CameraBounds getBounds();\n    method public com.mapbox.maps.CameraState getCameraState();\n    method public com.mapbox.maps.MapCenterAltitudeMode getCenterAltitudeMode();\n    method public com.mapbox.maps.FreeCameraOptions getFreeCameraOptions();\n    method public com.mapbox.maps.ScreenCoordinate pixelForCoordinate(com.mapbox.geojson.Point coordinate);\n    method public java.util.List<com.mapbox.maps.ScreenCoordinate> pixelsForCoordinates(java.util.List<com.mapbox.geojson.Point> coordinates);\n    method public com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> setBounds(com.mapbox.maps.CameraBoundsOptions options);\n    method public void setCamera(com.mapbox.maps.CameraOptions cameraOptions);\n    method public void setCamera(com.mapbox.maps.FreeCameraOptions freeCameraOptions);\n    method public void setCenterAltitudeMode(com.mapbox.maps.MapCenterAltitudeMode mode);\n    property public abstract com.mapbox.maps.CameraState cameraState;\n  }\n\n  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public interface MapDelegateProvider {\n    method public com.mapbox.maps.IndoorManager getIndoorManager();\n    method public com.mapbox.maps.plugin.delegates.MapAttributionDelegate getMapAttributionDelegate();\n    method public com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate getMapCameraManagerDelegate();\n    method public com.mapbox.maps.plugin.delegates.MapFeatureQueryDelegate getMapFeatureQueryDelegate();\n    method public com.mapbox.maps.plugin.delegates.MapFeatureStateDelegate getMapFeatureStateDelegate();\n    method public com.mapbox.maps.plugin.delegates.MapInteractionDelegate getMapInteractionDelegate();\n    method public com.mapbox.maps.plugin.delegates.MapListenerDelegate getMapListenerDelegate();\n    method public com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate getMapPluginProviderDelegate();\n    method public com.mapbox.maps.plugin.delegates.MapProjectionDelegate getMapProjectionDelegate();\n    method public com.mapbox.maps.MapboxStyleManager getMapStyleManagerDelegate();\n    method public com.mapbox.maps.plugin.delegates.MapTransformDelegate getMapTransformDelegate();\n    method public void getStyle(kotlin.jvm.functions.Function1<? super com.mapbox.maps.MapboxStyleManager,kotlin.Unit> callback);\n    property public abstract com.mapbox.maps.IndoorManager indoorManager;\n    property public abstract com.mapbox.maps.plugin.delegates.MapAttributionDelegate mapAttributionDelegate;\n    property public abstract com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate mapCameraManagerDelegate;\n    property public abstract com.mapbox.maps.plugin.delegates.MapFeatureQueryDelegate mapFeatureQueryDelegate;\n    property public abstract com.mapbox.maps.plugin.delegates.MapFeatureStateDelegate mapFeatureStateDelegate;\n    property public abstract com.mapbox.maps.plugin.delegates.MapInteractionDelegate mapInteractionDelegate;\n    property public abstract com.mapbox.maps.plugin.delegates.MapListenerDelegate mapListenerDelegate;\n    property public abstract com.mapbox.maps.plugin.delegates.MapPluginProviderDelegate mapPluginProviderDelegate;\n    property public abstract com.mapbox.maps.plugin.delegates.MapProjectionDelegate mapProjectionDelegate;\n    property public abstract com.mapbox.maps.MapboxStyleManager mapStyleManagerDelegate;\n    property public abstract com.mapbox.maps.plugin.delegates.MapTransformDelegate mapTransformDelegate;\n  }\n\n  public interface MapFeatureQueryDelegate {\n    method public void executeOnRenderThread(Runnable runnable);\n    method public com.mapbox.common.Cancelable queryRenderedFeatures(com.mapbox.maps.RenderedQueryGeometry geometry, com.mapbox.maps.RenderedQueryOptions options, com.mapbox.maps.QueryRenderedFeaturesCallback callback);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.common.Cancelable queryRenderedRasterValues(com.mapbox.maps.ScreenCoordinate coordinate, com.mapbox.maps.RenderedRasterQueryOptions options, com.mapbox.maps.QueryRenderedRasterValuesCallback callback);\n    method public com.mapbox.common.Cancelable querySourceFeatures(String sourceId, com.mapbox.maps.SourceQueryOptions options, com.mapbox.maps.QuerySourceFeaturesCallback callback);\n  }\n\n  public interface MapFeatureStateDelegate {\n    method public com.mapbox.common.Cancelable getFeatureState(String sourceId, String? sourceLayerId = null, String featureId, com.mapbox.maps.QueryFeatureStateCallback callback);\n    method public com.mapbox.common.Cancelable removeFeatureState(String sourceId, String? sourceLayerId = null, String featureId, String? stateKey = null, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method @com.mapbox.maps.MapboxExperimental public void removeFeatureStateExpression(int featureStateExpressionId, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method @com.mapbox.maps.MapboxExperimental public void resetFeatureStateExpressions(com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n    method public com.mapbox.common.Cancelable resetFeatureStates(String sourceId, String? sourceLayerId = null, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method public com.mapbox.common.Cancelable setFeatureState(String sourceId, String? sourceLayerId = null, String featureId, com.mapbox.bindgen.Value state, com.mapbox.maps.FeatureStateOperationCallback callback);\n    method @com.mapbox.maps.MapboxDelicateApi @com.mapbox.maps.MapboxExperimental public <FS extends com.mapbox.maps.interactions.FeatureState> void setFeatureStateExpression(int featureStateExpressionId, com.mapbox.maps.interactions.TypedFeaturesetDescriptor<FS,?> featureset, com.mapbox.bindgen.Value expression, FS state, com.mapbox.maps.FeatureStateOperationCallback callback = FeatureStateOperationCallback({ var it: com.mapbox.bindgen.Expected<java.lang.String,com.mapbox.bindgen.None> ->\n\n\n}));\n  }\n\n  @com.mapbox.maps.MapboxExperimental public interface MapInteractionDelegate {\n    method public com.mapbox.common.Cancelable addInteraction(com.mapbox.maps.MapInteraction interaction);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void dispatch(com.mapbox.maps.PlatformEventInfo platformEventInfo);\n  }\n\n  public interface MapListenerDelegate {\n    method @Deprecated public void addOnCameraChangeListener(com.mapbox.maps.plugin.delegates.listeners.OnCameraChangeListener onCameraChangeListener);\n    method @Deprecated public void addOnMapIdleListener(com.mapbox.maps.plugin.delegates.listeners.OnMapIdleListener onMapIdleListener);\n    method @Deprecated public void addOnMapLoadErrorListener(com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener onMapLoadErrorListener);\n    method @Deprecated public void addOnMapLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnMapLoadedListener onMapLoadedListener);\n    method @Deprecated public void addOnRenderFrameFinishedListener(com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameFinishedListener onRenderFrameFinishedListener);\n    method @Deprecated public void addOnRenderFrameStartedListener(com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameStartedListener onRenderFrameStartedListener);\n    method @Deprecated public void addOnSourceAddedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceAddedListener onSourceAddedListener);\n    method @Deprecated public void addOnSourceDataLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceDataLoadedListener onSourceDataLoadedListener);\n    method @Deprecated public void addOnSourceRemovedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceRemovedListener onSourceRemovedListener);\n    method @Deprecated public void addOnStyleDataLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleDataLoadedListener onStyleDataLoadedListener);\n    method @Deprecated public void addOnStyleImageMissingListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleImageMissingListener onStyleImageMissingListener);\n    method @Deprecated public void addOnStyleImageUnusedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleImageUnusedListener onStyleImageUnusedListener);\n    method @Deprecated public void addOnStyleLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleLoadedListener onStyleLoadedListener);\n    method @Deprecated public void removeOnCameraChangeListener(com.mapbox.maps.plugin.delegates.listeners.OnCameraChangeListener onCameraChangeListener);\n    method @Deprecated public void removeOnMapIdleListener(com.mapbox.maps.plugin.delegates.listeners.OnMapIdleListener onMapIdleListener);\n    method @Deprecated public void removeOnMapLoadErrorListener(com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener onMapLoadErrorListener);\n    method @Deprecated public void removeOnMapLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnMapLoadedListener onMapLoadedListener);\n    method @Deprecated public void removeOnRenderFrameFinishedListener(com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameFinishedListener onRenderFrameFinishedListener);\n    method @Deprecated public void removeOnRenderFrameStartedListener(com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameStartedListener onRenderFrameStartedListener);\n    method @Deprecated public void removeOnSourceAddedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceAddedListener onSourceAddedListener);\n    method @Deprecated public void removeOnSourceDataLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceDataLoadedListener onSourceDataLoadedListener);\n    method @Deprecated public void removeOnSourceRemovedListener(com.mapbox.maps.plugin.delegates.listeners.OnSourceRemovedListener onSourceRemovedListener);\n    method @Deprecated public void removeOnStyleDataLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleDataLoadedListener onStyleDataLoadedListener);\n    method @Deprecated public void removeOnStyleImageMissingListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleImageMissingListener onStyleImageMissingListener);\n    method @Deprecated public void removeOnStyleImageUnusedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleImageUnusedListener onStyleImageUnusedListener);\n    method @Deprecated public void removeOnStyleLoadedListener(com.mapbox.maps.plugin.delegates.listeners.OnStyleLoadedListener onStyleLoadedListener);\n    method public com.mapbox.common.Cancelable subscribeCameraChanged(com.mapbox.maps.CameraChangedCallback cameraChangedCallback);\n    method @com.mapbox.annotation.MapboxExperimental public com.mapbox.common.Cancelable subscribeCameraChangedCoalesced(com.mapbox.maps.CameraChangedCoalescedCallback cameraChangedCoalescedCallback);\n    method @com.mapbox.maps.MapboxExperimental public com.mapbox.common.Cancelable subscribeGenericEvent(String eventName, com.mapbox.maps.GenericEventCallback genericEventCallback);\n    method public com.mapbox.common.Cancelable subscribeMapIdle(com.mapbox.maps.MapIdleCallback mapIdleCallback);\n    method public com.mapbox.common.Cancelable subscribeMapLoaded(com.mapbox.maps.MapLoadedCallback mapLoadedCallback);\n    method public com.mapbox.common.Cancelable subscribeMapLoadingError(com.mapbox.maps.MapLoadingErrorCallback mapLoadingErrorCallback);\n    method public com.mapbox.common.Cancelable subscribeRenderFrameFinished(com.mapbox.maps.RenderFrameFinishedCallback renderFrameFinishedCallback);\n    method public com.mapbox.common.Cancelable subscribeRenderFrameStarted(com.mapbox.maps.RenderFrameStartedCallback renderFrameStartedCallback);\n    method public com.mapbox.common.Cancelable subscribeResourceRequest(com.mapbox.maps.ResourceRequestCallback resourceRequestCallback);\n    method public com.mapbox.common.Cancelable subscribeSourceAdded(com.mapbox.maps.SourceAddedCallback sourceAddedCallback);\n    method public com.mapbox.common.Cancelable subscribeSourceDataLoaded(com.mapbox.maps.SourceDataLoadedCallback sourceDataLoadedCallback);\n    method public com.mapbox.common.Cancelable subscribeSourceRemoved(com.mapbox.maps.SourceRemovedCallback sourceRemovedCallback);\n    method public com.mapbox.common.Cancelable subscribeStyleDataLoaded(com.mapbox.maps.StyleDataLoadedCallback styleDataLoadedCallback);\n    method public com.mapbox.common.Cancelable subscribeStyleImageMissing(com.mapbox.maps.StyleImageMissingCallback styleImageMissingCallback);\n    method public com.mapbox.common.Cancelable subscribeStyleImageRemoveUnused(com.mapbox.maps.StyleImageRemoveUnusedCallback styleImageRemoveUnusedCallback);\n    method public com.mapbox.common.Cancelable subscribeStyleLoaded(com.mapbox.maps.StyleLoadedCallback styleLoadedCallback);\n  }\n\n  public interface MapPluginExtensionsDelegate {\n    method public Object? cameraAnimationsPlugin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.animation.CameraAnimationsPlugin,?> function);\n    method public Object? gesturesPlugin(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.gestures.GesturesPlugin,?> function);\n  }\n\n  public interface MapPluginProviderDelegate {\n    method public <T extends com.mapbox.maps.plugin.MapPlugin> T? getPlugin(String id);\n  }\n\n  public interface MapProjectionDelegate {\n    method public com.mapbox.geojson.Point coordinateForProjectedMeters(com.mapbox.maps.ProjectedMeters projectedMeters);\n    method public double getMetersPerPixelAtLatitude(double latitude, double zoom);\n    method public double getMetersPerPixelAtLatitude(double latitude);\n    method public com.mapbox.maps.MercatorCoordinate project(com.mapbox.geojson.Point point, double zoomScale);\n    method public com.mapbox.maps.ProjectedMeters projectedMetersForCoordinate(com.mapbox.geojson.Point point);\n    method public com.mapbox.geojson.Point unproject(com.mapbox.maps.MercatorCoordinate coordinate, double zoomScale);\n  }\n\n  public interface MapTransformDelegate {\n    method public com.mapbox.maps.MapOptions getMapOptions();\n    method public com.mapbox.maps.Size getSize();\n    method public boolean isGestureInProgress();\n    method public boolean isUserAnimationInProgress();\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @com.mapbox.maps.MapboxExperimental public void setCameraAnimationHint(com.mapbox.maps.CameraAnimationHint cameraAnimationHint);\n    method public void setConstrainMode(com.mapbox.maps.ConstrainMode constrainMode);\n    method public void setGestureInProgress(boolean inProgress);\n    method public void setNorthOrientation(com.mapbox.maps.NorthOrientation northOrientation);\n    method public void setUserAnimationInProgress(boolean inProgress);\n    method public void setViewportMode(com.mapbox.maps.ViewportMode viewportMode);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.delegates.listeners {\n\n  @Deprecated public fun interface OnCameraChangeListener {\n    method @Deprecated public void onCameraChanged(com.mapbox.maps.extension.observable.eventdata.CameraChangedEventData eventData);\n  }\n\n  @Deprecated public fun interface OnMapIdleListener {\n    method @Deprecated public void onMapIdle(com.mapbox.maps.extension.observable.eventdata.MapIdleEventData eventData);\n  }\n\n  @Deprecated public interface OnMapLoadErrorListener {\n    method @Deprecated public void onMapLoadError(com.mapbox.maps.extension.observable.eventdata.MapLoadingErrorEventData eventData);\n  }\n\n  @Deprecated public fun interface OnMapLoadedListener {\n    method @Deprecated public void onMapLoaded(com.mapbox.maps.extension.observable.eventdata.MapLoadedEventData eventData);\n  }\n\n  @Deprecated public fun interface OnRenderFrameFinishedListener {\n    method @Deprecated public void onRenderFrameFinished(com.mapbox.maps.extension.observable.eventdata.RenderFrameFinishedEventData eventData);\n  }\n\n  @Deprecated public fun interface OnRenderFrameStartedListener {\n    method @Deprecated public void onRenderFrameStarted(com.mapbox.maps.extension.observable.eventdata.RenderFrameStartedEventData eventData);\n  }\n\n  @Deprecated public fun interface OnSourceAddedListener {\n    method @Deprecated public void onSourceAdded(com.mapbox.maps.extension.observable.eventdata.SourceAddedEventData eventData);\n  }\n\n  @Deprecated public fun interface OnSourceDataLoadedListener {\n    method @Deprecated public void onSourceDataLoaded(com.mapbox.maps.extension.observable.eventdata.SourceDataLoadedEventData eventData);\n  }\n\n  @Deprecated public fun interface OnSourceRemovedListener {\n    method @Deprecated public void onSourceRemoved(com.mapbox.maps.extension.observable.eventdata.SourceRemovedEventData eventData);\n  }\n\n  @Deprecated public fun interface OnStyleDataLoadedListener {\n    method @Deprecated public void onStyleDataLoaded(com.mapbox.maps.extension.observable.eventdata.StyleDataLoadedEventData eventData);\n  }\n\n  @Deprecated public fun interface OnStyleImageMissingListener {\n    method @Deprecated public void onStyleImageMissing(com.mapbox.maps.extension.observable.eventdata.StyleImageMissingEventData eventData);\n  }\n\n  @Deprecated public fun interface OnStyleImageUnusedListener {\n    method @Deprecated public void onStyleImageUnused(com.mapbox.maps.extension.observable.eventdata.StyleImageUnusedEventData eventData);\n  }\n\n  @Deprecated public fun interface OnStyleLoadedListener {\n    method @Deprecated public void onStyleLoaded(com.mapbox.maps.extension.observable.eventdata.StyleLoadedEventData eventData);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.gestures {\n\n  public interface GesturesPlugin extends com.mapbox.maps.plugin.MapPlugin com.mapbox.maps.plugin.ContextBinder com.mapbox.maps.plugin.gestures.generated.GesturesSettingsInterface com.mapbox.maps.plugin.MapSizePlugin {\n    method public void addOnFlingListener(com.mapbox.maps.plugin.gestures.OnFlingListener onFlingListener);\n    method public void addOnMapClickListener(com.mapbox.maps.plugin.gestures.OnMapClickListener onMapClickListener);\n    method public void addOnMapLongClickListener(com.mapbox.maps.plugin.gestures.OnMapLongClickListener onMapLongClickListener);\n    method public void addOnMoveListener(com.mapbox.maps.plugin.gestures.OnMoveListener onMoveListener);\n    method public void addOnRotateListener(com.mapbox.maps.plugin.gestures.OnRotateListener onRotateListener);\n    method public void addOnScaleListener(com.mapbox.maps.plugin.gestures.OnScaleListener onScaleListener);\n    method public void addOnShoveListener(com.mapbox.maps.plugin.gestures.OnShoveListener onShoveListener);\n    method public void addProtectedAnimationOwner(String owner);\n    method public com.mapbox.android.gestures.AndroidGesturesManager getGesturesManager();\n    method public boolean onGenericMotionEvent(android.view.MotionEvent event);\n    method public boolean onTouchEvent(android.view.MotionEvent? motionEvent);\n    method public void removeOnFlingListener(com.mapbox.maps.plugin.gestures.OnFlingListener onFlingListener);\n    method public void removeOnMapClickListener(com.mapbox.maps.plugin.gestures.OnMapClickListener onMapClickListener);\n    method public void removeOnMapLongClickListener(com.mapbox.maps.plugin.gestures.OnMapLongClickListener onMapLongClickListener);\n    method public void removeOnMoveListener(com.mapbox.maps.plugin.gestures.OnMoveListener listener);\n    method public void removeOnRotateListener(com.mapbox.maps.plugin.gestures.OnRotateListener listener);\n    method public void removeOnScaleListener(com.mapbox.maps.plugin.gestures.OnScaleListener listener);\n    method public void removeOnShoveListener(com.mapbox.maps.plugin.gestures.OnShoveListener listener);\n    method public void removeProtectedAnimationOwner(String owner);\n    method public void setGesturesManager(com.mapbox.android.gestures.AndroidGesturesManager internalGesturesManager, boolean attachDefaultListeners, boolean setDefaultMutuallyExclusives);\n  }\n\n  public fun interface OnFlingListener {\n    method public void onFling();\n  }\n\n  public fun interface OnMapClickListener {\n    method public boolean onMapClick(com.mapbox.geojson.Point point);\n  }\n\n  public fun interface OnMapLongClickListener {\n    method public boolean onMapLongClick(com.mapbox.geojson.Point point);\n  }\n\n  public interface OnMoveListener {\n    method public boolean onMove(com.mapbox.android.gestures.MoveGestureDetector detector);\n    method public void onMoveBegin(com.mapbox.android.gestures.MoveGestureDetector detector);\n    method public void onMoveEnd(com.mapbox.android.gestures.MoveGestureDetector detector);\n  }\n\n  public interface OnRotateListener {\n    method public void onRotate(com.mapbox.android.gestures.RotateGestureDetector detector);\n    method public void onRotateBegin(com.mapbox.android.gestures.RotateGestureDetector detector);\n    method public void onRotateEnd(com.mapbox.android.gestures.RotateGestureDetector detector);\n  }\n\n  public interface OnScaleListener {\n    method public void onScale(com.mapbox.android.gestures.StandardScaleGestureDetector detector);\n    method public void onScaleBegin(com.mapbox.android.gestures.StandardScaleGestureDetector detector);\n    method public void onScaleEnd(com.mapbox.android.gestures.StandardScaleGestureDetector detector);\n  }\n\n  public interface OnShoveListener {\n    method public void onShove(com.mapbox.android.gestures.ShoveGestureDetector detector);\n    method public void onShoveBegin(com.mapbox.android.gestures.ShoveGestureDetector detector);\n    method public void onShoveEnd(com.mapbox.android.gestures.ShoveGestureDetector detector);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.gestures.generated {\n\n  @kotlinx.parcelize.Parcelize public final class GesturesSettings implements android.os.Parcelable {\n    method public boolean getDoubleTapToZoomInEnabled();\n    method public boolean getDoubleTouchToZoomOutEnabled();\n    method public com.mapbox.maps.ScreenCoordinate? getFocalPoint();\n    method public boolean getIncreasePinchToZoomThresholdWhenRotating();\n    method public boolean getIncreaseRotateThresholdWhenPinchingToZoom();\n    method public boolean getPinchScrollEnabled();\n    method public boolean getPinchToZoomDecelerationEnabled();\n    method public boolean getPinchToZoomEnabled();\n    method public boolean getPitchEnabled();\n    method public boolean getQuickZoomEnabled();\n    method public boolean getRotateDecelerationEnabled();\n    method public boolean getRotateEnabled();\n    method public boolean getScrollDecelerationEnabled();\n    method public boolean getScrollEnabled();\n    method public com.mapbox.maps.plugin.ScrollMode getScrollMode();\n    method public boolean getSimultaneousRotateAndPinchToZoomEnabled();\n    method public float getZoomAnimationAmount();\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder toBuilder();\n    property public final boolean doubleTapToZoomInEnabled;\n    property public final boolean doubleTouchToZoomOutEnabled;\n    property public final com.mapbox.maps.ScreenCoordinate? focalPoint;\n    property public final boolean increasePinchToZoomThresholdWhenRotating;\n    property public final boolean increaseRotateThresholdWhenPinchingToZoom;\n    property public final boolean pinchScrollEnabled;\n    property public final boolean pinchToZoomDecelerationEnabled;\n    property public final boolean pinchToZoomEnabled;\n    property public final boolean pitchEnabled;\n    property public final boolean quickZoomEnabled;\n    property public final boolean rotateDecelerationEnabled;\n    property public final boolean rotateEnabled;\n    property public final boolean scrollDecelerationEnabled;\n    property public final boolean scrollEnabled;\n    property public final com.mapbox.maps.plugin.ScrollMode scrollMode;\n    property public final boolean simultaneousRotateAndPinchToZoomEnabled;\n    property public final float zoomAnimationAmount;\n  }\n\n  public static final class GesturesSettings.Builder {\n    ctor public GesturesSettings.Builder();\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings build();\n    method public boolean getDoubleTapToZoomInEnabled();\n    method public boolean getDoubleTouchToZoomOutEnabled();\n    method public com.mapbox.maps.ScreenCoordinate? getFocalPoint();\n    method public boolean getIncreasePinchToZoomThresholdWhenRotating();\n    method public boolean getIncreaseRotateThresholdWhenPinchingToZoom();\n    method public boolean getPinchScrollEnabled();\n    method public boolean getPinchToZoomDecelerationEnabled();\n    method public boolean getPinchToZoomEnabled();\n    method public boolean getPitchEnabled();\n    method public boolean getQuickZoomEnabled();\n    method public boolean getRotateDecelerationEnabled();\n    method public boolean getRotateEnabled();\n    method public boolean getScrollDecelerationEnabled();\n    method public boolean getScrollEnabled();\n    method public com.mapbox.maps.plugin.ScrollMode getScrollMode();\n    method public boolean getSimultaneousRotateAndPinchToZoomEnabled();\n    method public float getZoomAnimationAmount();\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setDoubleTapToZoomInEnabled(boolean doubleTapToZoomInEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setDoubleTouchToZoomOutEnabled(boolean doubleTouchToZoomOutEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setFocalPoint(com.mapbox.maps.ScreenCoordinate? focalPoint);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setIncreasePinchToZoomThresholdWhenRotating(boolean increasePinchToZoomThresholdWhenRotating);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setIncreaseRotateThresholdWhenPinchingToZoom(boolean increaseRotateThresholdWhenPinchingToZoom);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setPinchScrollEnabled(boolean pinchScrollEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setPinchToZoomDecelerationEnabled(boolean pinchToZoomDecelerationEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setPinchToZoomEnabled(boolean pinchToZoomEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setPitchEnabled(boolean pitchEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setQuickZoomEnabled(boolean quickZoomEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setRotateDecelerationEnabled(boolean rotateDecelerationEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setRotateEnabled(boolean rotateEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setScrollDecelerationEnabled(boolean scrollDecelerationEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setScrollEnabled(boolean scrollEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setScrollMode(com.mapbox.maps.plugin.ScrollMode scrollMode);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setSimultaneousRotateAndPinchToZoomEnabled(boolean simultaneousRotateAndPinchToZoomEnabled);\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder setZoomAnimationAmount(float zoomAnimationAmount);\n    property public final boolean doubleTapToZoomInEnabled;\n    property public final boolean doubleTouchToZoomOutEnabled;\n    property public final com.mapbox.maps.ScreenCoordinate? focalPoint;\n    property public final boolean increasePinchToZoomThresholdWhenRotating;\n    property public final boolean increaseRotateThresholdWhenPinchingToZoom;\n    property public final boolean pinchScrollEnabled;\n    property public final boolean pinchToZoomDecelerationEnabled;\n    property public final boolean pinchToZoomEnabled;\n    property public final boolean pitchEnabled;\n    property public final boolean quickZoomEnabled;\n    property public final boolean rotateDecelerationEnabled;\n    property public final boolean rotateEnabled;\n    property public final boolean scrollDecelerationEnabled;\n    property public final boolean scrollEnabled;\n    property public final com.mapbox.maps.plugin.ScrollMode scrollMode;\n    property public final boolean simultaneousRotateAndPinchToZoomEnabled;\n    property public final float zoomAnimationAmount;\n  }\n\n  public abstract class GesturesSettingsBase implements com.mapbox.maps.plugin.gestures.generated.GesturesSettingsInterface {\n    ctor public GesturesSettingsBase();\n    method protected abstract void applySettings();\n    method public boolean getDoubleTapToZoomInEnabled();\n    method public boolean getDoubleTouchToZoomOutEnabled();\n    method public com.mapbox.maps.ScreenCoordinate? getFocalPoint();\n    method public boolean getIncreasePinchToZoomThresholdWhenRotating();\n    method @Deprecated public boolean getIncreaseRotateThresholdWhenPinchingToZoom();\n    method protected abstract com.mapbox.maps.plugin.gestures.generated.GesturesSettings getInternalSettings();\n    method public boolean getPinchScrollEnabled();\n    method public boolean getPinchToZoomDecelerationEnabled();\n    method public boolean getPinchToZoomEnabled();\n    method public boolean getPitchEnabled();\n    method public boolean getQuickZoomEnabled();\n    method public boolean getRotateDecelerationEnabled();\n    method public boolean getRotateEnabled();\n    method public boolean getScrollDecelerationEnabled();\n    method public boolean getScrollEnabled();\n    method public com.mapbox.maps.plugin.ScrollMode getScrollMode();\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings getSettings();\n    method public boolean getSimultaneousRotateAndPinchToZoomEnabled();\n    method public float getZoomAnimationAmount();\n    method public void setDoubleTapToZoomInEnabled(boolean);\n    method public void setDoubleTouchToZoomOutEnabled(boolean);\n    method public void setFocalPoint(com.mapbox.maps.ScreenCoordinate?);\n    method public void setIncreasePinchToZoomThresholdWhenRotating(boolean);\n    method @Deprecated public void setIncreaseRotateThresholdWhenPinchingToZoom(boolean);\n    method protected abstract void setInternalSettings(com.mapbox.maps.plugin.gestures.generated.GesturesSettings);\n    method public void setPinchScrollEnabled(boolean);\n    method public void setPinchToZoomDecelerationEnabled(boolean);\n    method public void setPinchToZoomEnabled(boolean);\n    method public void setPitchEnabled(boolean);\n    method public void setQuickZoomEnabled(boolean);\n    method public void setRotateDecelerationEnabled(boolean);\n    method public void setRotateEnabled(boolean);\n    method public void setScrollDecelerationEnabled(boolean);\n    method public void setScrollEnabled(boolean);\n    method public void setScrollMode(com.mapbox.maps.plugin.ScrollMode);\n    method public void setSimultaneousRotateAndPinchToZoomEnabled(boolean);\n    method public void setZoomAnimationAmount(float);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder,kotlin.Unit> block);\n    property public boolean doubleTapToZoomInEnabled;\n    property public boolean doubleTouchToZoomOutEnabled;\n    property public com.mapbox.maps.ScreenCoordinate? focalPoint;\n    property public boolean increasePinchToZoomThresholdWhenRotating;\n    property @Deprecated public boolean increaseRotateThresholdWhenPinchingToZoom;\n    property protected abstract com.mapbox.maps.plugin.gestures.generated.GesturesSettings internalSettings;\n    property public boolean pinchScrollEnabled;\n    property public boolean pinchToZoomDecelerationEnabled;\n    property public boolean pinchToZoomEnabled;\n    property public boolean pitchEnabled;\n    property public boolean quickZoomEnabled;\n    property public boolean rotateDecelerationEnabled;\n    property public boolean rotateEnabled;\n    property public boolean scrollDecelerationEnabled;\n    property public boolean scrollEnabled;\n    property public com.mapbox.maps.plugin.ScrollMode scrollMode;\n    property public boolean simultaneousRotateAndPinchToZoomEnabled;\n    property public float zoomAnimationAmount;\n  }\n\n  public interface GesturesSettingsInterface {\n    method public boolean getDoubleTapToZoomInEnabled();\n    method public boolean getDoubleTouchToZoomOutEnabled();\n    method public com.mapbox.maps.ScreenCoordinate? getFocalPoint();\n    method public boolean getIncreasePinchToZoomThresholdWhenRotating();\n    method @Deprecated public boolean getIncreaseRotateThresholdWhenPinchingToZoom();\n    method public boolean getPinchScrollEnabled();\n    method public boolean getPinchToZoomDecelerationEnabled();\n    method public boolean getPinchToZoomEnabled();\n    method public boolean getPitchEnabled();\n    method public boolean getQuickZoomEnabled();\n    method public boolean getRotateDecelerationEnabled();\n    method public boolean getRotateEnabled();\n    method public boolean getScrollDecelerationEnabled();\n    method public boolean getScrollEnabled();\n    method public com.mapbox.maps.plugin.ScrollMode getScrollMode();\n    method public com.mapbox.maps.plugin.gestures.generated.GesturesSettings getSettings();\n    method public boolean getSimultaneousRotateAndPinchToZoomEnabled();\n    method public float getZoomAnimationAmount();\n    method public void setDoubleTapToZoomInEnabled(boolean);\n    method public void setDoubleTouchToZoomOutEnabled(boolean);\n    method public void setFocalPoint(com.mapbox.maps.ScreenCoordinate?);\n    method public void setIncreasePinchToZoomThresholdWhenRotating(boolean);\n    method @Deprecated public void setIncreaseRotateThresholdWhenPinchingToZoom(boolean);\n    method public void setPinchScrollEnabled(boolean);\n    method public void setPinchToZoomDecelerationEnabled(boolean);\n    method public void setPinchToZoomEnabled(boolean);\n    method public void setPitchEnabled(boolean);\n    method public void setQuickZoomEnabled(boolean);\n    method public void setRotateDecelerationEnabled(boolean);\n    method public void setRotateEnabled(boolean);\n    method public void setScrollDecelerationEnabled(boolean);\n    method public void setScrollEnabled(boolean);\n    method public void setScrollMode(com.mapbox.maps.plugin.ScrollMode);\n    method public void setSimultaneousRotateAndPinchToZoomEnabled(boolean);\n    method public void setZoomAnimationAmount(float);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder,kotlin.Unit> block);\n    property public abstract boolean doubleTapToZoomInEnabled;\n    property public abstract boolean doubleTouchToZoomOutEnabled;\n    property public abstract com.mapbox.maps.ScreenCoordinate? focalPoint;\n    property public abstract boolean increasePinchToZoomThresholdWhenRotating;\n    property @Deprecated public abstract boolean increaseRotateThresholdWhenPinchingToZoom;\n    property public abstract boolean pinchScrollEnabled;\n    property public abstract boolean pinchToZoomDecelerationEnabled;\n    property public abstract boolean pinchToZoomEnabled;\n    property public abstract boolean pitchEnabled;\n    property public abstract boolean quickZoomEnabled;\n    property public abstract boolean rotateDecelerationEnabled;\n    property public abstract boolean rotateEnabled;\n    property public abstract boolean scrollDecelerationEnabled;\n    property public abstract boolean scrollEnabled;\n    property public abstract com.mapbox.maps.plugin.ScrollMode scrollMode;\n    property public abstract boolean simultaneousRotateAndPinchToZoomEnabled;\n    property public abstract float zoomAnimationAmount;\n  }\n\n  public final class GesturesSettingsKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.plugin.gestures.generated.GesturesSettings! GesturesSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.gestures.generated.GesturesSettings.Builder,? extends kotlin.Unit> initializer);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.indoorselector {\n\n  @com.mapbox.maps.MapboxExperimental public interface IndoorSelectorPlugin extends com.mapbox.maps.plugin.ViewPlugin com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettingsInterface com.mapbox.maps.plugin.LifecyclePlugin {\n    method @com.mapbox.maps.MapboxExperimental public void addOnFloorSelectedListener(com.mapbox.maps.plugin.indoorselector.OnFloorSelectedListener listener);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) @com.mapbox.maps.MapboxExperimental public void onFloorSelected(String floorId);\n    method @com.mapbox.maps.MapboxExperimental public void removeOnFloorSelectedListener(com.mapbox.maps.plugin.indoorselector.OnFloorSelectedListener listener);\n    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) @com.mapbox.maps.MapboxExperimental public void updateFloors(java.util.List<com.mapbox.maps.IndoorFloor> floors, String? selectedFloorId);\n  }\n\n  @com.mapbox.maps.MapboxExperimental public interface IndoorSelectorView {\n    method public boolean isIndoorSelectorVisible();\n    method public void setIndoorGravity(int gravity);\n    method public void setIndoorSelectorMargins(int left, int top, int right, int bottom);\n    method public void setIndoorSelectorVisible(boolean);\n    method public void updateFloors(java.util.List<com.mapbox.maps.IndoorFloor> floors, String? selectedFloorId);\n    property public abstract boolean isIndoorSelectorVisible;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public fun interface OnFloorSelectedListener {\n    method public void onFloorSelected(String floorId);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.indoorselector.generated {\n\n  @com.mapbox.maps.MapboxExperimental @kotlinx.parcelize.Parcelize public final class IndoorSelectorSettings implements android.os.Parcelable {\n    method public boolean getEnabled();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder toBuilder();\n    property public final boolean enabled;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final int position;\n  }\n\n  public static final class IndoorSelectorSettings.Builder {\n    ctor public IndoorSelectorSettings.Builder();\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings build();\n    method public boolean getEnabled();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder setEnabled(boolean enabled);\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder setMarginBottom(float marginBottom);\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder setMarginLeft(float marginLeft);\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder setMarginRight(float marginRight);\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder setMarginTop(float marginTop);\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder setPosition(int position);\n    property public final boolean enabled;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final int position;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public abstract class IndoorSelectorSettingsBase implements com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettingsInterface {\n    ctor public IndoorSelectorSettingsBase();\n    method protected abstract void applySettings();\n    method public boolean getEnabled();\n    method protected abstract com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings getInternalSettings();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings getSettings();\n    method public void setEnabled(boolean);\n    method protected abstract void setInternalSettings(com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method public void setPosition(int);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder,kotlin.Unit> block);\n    property public boolean enabled;\n    property protected abstract com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings internalSettings;\n    property public float marginBottom;\n    property public float marginLeft;\n    property public float marginRight;\n    property public float marginTop;\n    property public int position;\n  }\n\n  @com.mapbox.maps.MapboxExperimental public interface IndoorSelectorSettingsInterface {\n    method public boolean getEnabled();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings getSettings();\n    method public void setEnabled(boolean);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method public void setPosition(int);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder,kotlin.Unit> block);\n    property public abstract boolean enabled;\n    property public abstract float marginBottom;\n    property public abstract float marginLeft;\n    property public abstract float marginRight;\n    property public abstract float marginTop;\n    property public abstract int position;\n  }\n\n  public final class IndoorSelectorSettingsKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings! IndoorSelectorSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettings.Builder,? extends kotlin.Unit> initializer);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.lifecycle {\n\n  public fun interface MapboxLifecyclePlugin extends com.mapbox.maps.plugin.MapPlugin {\n    method public void registerLifecycleObserver(android.view.View mapView, com.mapbox.maps.MapboxLifecycleObserver observer);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.locationcomponent {\n\n  public interface LocationComponentPlugin extends com.mapbox.maps.plugin.MapPlugin com.mapbox.maps.plugin.ContextBinder com.mapbox.maps.plugin.LifecyclePlugin com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettingsInterface com.mapbox.maps.plugin.MapStyleObserverPlugin {\n    method public void addOnIndicatorAccuracyRadiusChangedListener(com.mapbox.maps.plugin.locationcomponent.OnIndicatorAccuracyRadiusChangedListener listener);\n    method public void addOnIndicatorBearingChangedListener(com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener listener);\n    method public void addOnIndicatorPositionChangedListener(com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener listener);\n    method public com.mapbox.maps.plugin.locationcomponent.LocationProvider? getLocationProvider();\n    method public void isLocatedAt(com.mapbox.geojson.Point point, com.mapbox.maps.plugin.locationcomponent.PuckLocatedAtPointListener listener);\n    method public void removeOnIndicatorAccuracyRadiusChangedListener(com.mapbox.maps.plugin.locationcomponent.OnIndicatorAccuracyRadiusChangedListener listener);\n    method public void removeOnIndicatorBearingChangedListener(com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener listener);\n    method public void removeOnIndicatorPositionChangedListener(com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener listener);\n    method public void setLocationProvider(com.mapbox.maps.plugin.locationcomponent.LocationProvider locationProvider);\n  }\n\n  public interface LocationConsumer {\n    method public void onBearingUpdated(double[] bearing, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? options = null);\n    method public void onError(com.mapbox.common.location.LocationError error);\n    method public void onHorizontalAccuracyRadiusUpdated(double[] radius, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? options = null);\n    method public void onLocationUpdated(com.mapbox.geojson.Point![] location, kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit>? options = null);\n    method public void onPuckAccuracyRadiusAnimatorDefaultOptionsUpdated(kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit> options);\n    method public void onPuckBearingAnimatorDefaultOptionsUpdated(kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit> options);\n    method public void onPuckLocationAnimatorDefaultOptionsUpdated(kotlin.jvm.functions.Function1<? super android.animation.ValueAnimator,kotlin.Unit> options);\n  }\n\n  public interface LocationProvider {\n    method public void registerLocationConsumer(com.mapbox.maps.plugin.locationcomponent.LocationConsumer locationConsumer);\n    method public void unRegisterLocationConsumer(com.mapbox.maps.plugin.locationcomponent.LocationConsumer locationConsumer);\n  }\n\n  public fun interface OnIndicatorAccuracyRadiusChangedListener {\n    method public void onIndicatorAccuracyRadiusChanged(double radius);\n  }\n\n  public fun interface OnIndicatorBearingChangedListener {\n    method public void onIndicatorBearingChanged(double bearing);\n  }\n\n  public fun interface OnIndicatorPositionChangedListener {\n    method public void onIndicatorPositionChanged(com.mapbox.geojson.Point point);\n  }\n\n  public fun interface PuckLocatedAtPointListener {\n    method public void onResult(boolean isPuckLocatedAtPoint);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.locationcomponent.generated {\n\n  @kotlinx.parcelize.Parcelize public final class LocationComponentSettings implements android.os.Parcelable {\n    method public int getAccuracyRingBorderColor();\n    method public int getAccuracyRingColor();\n    method public boolean getEnabled();\n    method public String? getLayerAbove();\n    method public String? getLayerBelow();\n    method public com.mapbox.maps.plugin.LocationPuck getLocationPuck();\n    method public com.mapbox.maps.plugin.PuckBearing getPuckBearing();\n    method public boolean getPuckBearingEnabled();\n    method public int getPulsingColor();\n    method public boolean getPulsingEnabled();\n    method public float getPulsingMaxRadius();\n    method public boolean getShowAccuracyRing();\n    method public String? getSlot();\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder toBuilder();\n    property public final int accuracyRingBorderColor;\n    property public final int accuracyRingColor;\n    property public final boolean enabled;\n    property public final String? layerAbove;\n    property public final String? layerBelow;\n    property public final com.mapbox.maps.plugin.LocationPuck locationPuck;\n    property public final com.mapbox.maps.plugin.PuckBearing puckBearing;\n    property public final boolean puckBearingEnabled;\n    property public final int pulsingColor;\n    property public final boolean pulsingEnabled;\n    property public final float pulsingMaxRadius;\n    property public final boolean showAccuracyRing;\n    property public final String? slot;\n  }\n\n  public static final class LocationComponentSettings.Builder {\n    ctor public LocationComponentSettings.Builder(com.mapbox.maps.plugin.LocationPuck locationPuck);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings build();\n    method public int getAccuracyRingBorderColor();\n    method public int getAccuracyRingColor();\n    method public boolean getEnabled();\n    method public String? getLayerAbove();\n    method public String? getLayerBelow();\n    method public com.mapbox.maps.plugin.PuckBearing getPuckBearing();\n    method public boolean getPuckBearingEnabled();\n    method public int getPulsingColor();\n    method public boolean getPulsingEnabled();\n    method public float getPulsingMaxRadius();\n    method public boolean getShowAccuracyRing();\n    method public String? getSlot();\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setAccuracyRingBorderColor(int accuracyRingBorderColor);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setAccuracyRingColor(int accuracyRingColor);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setEnabled(boolean enabled);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setLayerAbove(String? layerAbove);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setLayerBelow(String? layerBelow);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setLocationPuck(com.mapbox.maps.plugin.LocationPuck locationPuck);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setPuckBearing(com.mapbox.maps.plugin.PuckBearing puckBearing);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setPuckBearingEnabled(boolean puckBearingEnabled);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setPulsingColor(int pulsingColor);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setPulsingEnabled(boolean pulsingEnabled);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setPulsingMaxRadius(float pulsingMaxRadius);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setShowAccuracyRing(boolean showAccuracyRing);\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder setSlot(String? slot);\n    property public final int accuracyRingBorderColor;\n    property public final int accuracyRingColor;\n    property public final boolean enabled;\n    property public final String? layerAbove;\n    property public final String? layerBelow;\n    property public final com.mapbox.maps.plugin.PuckBearing puckBearing;\n    property public final boolean puckBearingEnabled;\n    property public final int pulsingColor;\n    property public final boolean pulsingEnabled;\n    property public final float pulsingMaxRadius;\n    property public final boolean showAccuracyRing;\n    property public final String? slot;\n  }\n\n  public abstract class LocationComponentSettingsBase implements com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettingsInterface {\n    ctor public LocationComponentSettingsBase();\n    method protected abstract void applySettings();\n    method public int getAccuracyRingBorderColor();\n    method public int getAccuracyRingColor();\n    method public boolean getEnabled();\n    method protected abstract com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings getInternalSettings();\n    method public String? getLayerAbove();\n    method public String? getLayerBelow();\n    method public com.mapbox.maps.plugin.LocationPuck getLocationPuck();\n    method public com.mapbox.maps.plugin.PuckBearing getPuckBearing();\n    method public boolean getPuckBearingEnabled();\n    method public int getPulsingColor();\n    method public boolean getPulsingEnabled();\n    method public float getPulsingMaxRadius();\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings getSettings();\n    method public boolean getShowAccuracyRing();\n    method public String? getSlot();\n    method public void setAccuracyRingBorderColor(int);\n    method public void setAccuracyRingColor(int);\n    method public void setEnabled(boolean);\n    method protected abstract void setInternalSettings(com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings);\n    method public void setLayerAbove(String?);\n    method public void setLayerBelow(String?);\n    method public void setLocationPuck(com.mapbox.maps.plugin.LocationPuck);\n    method public void setPuckBearing(com.mapbox.maps.plugin.PuckBearing);\n    method public void setPuckBearingEnabled(boolean);\n    method public void setPulsingColor(int);\n    method public void setPulsingEnabled(boolean);\n    method public void setPulsingMaxRadius(float);\n    method public void setShowAccuracyRing(boolean);\n    method public void setSlot(String?);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder,kotlin.Unit> block);\n    property public int accuracyRingBorderColor;\n    property public int accuracyRingColor;\n    property public boolean enabled;\n    property protected abstract com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings internalSettings;\n    property public String? layerAbove;\n    property public String? layerBelow;\n    property public com.mapbox.maps.plugin.LocationPuck locationPuck;\n    property public com.mapbox.maps.plugin.PuckBearing puckBearing;\n    property public boolean puckBearingEnabled;\n    property public int pulsingColor;\n    property public boolean pulsingEnabled;\n    property public float pulsingMaxRadius;\n    property public boolean showAccuracyRing;\n    property public String? slot;\n  }\n\n  public interface LocationComponentSettingsInterface {\n    method public int getAccuracyRingBorderColor();\n    method public int getAccuracyRingColor();\n    method public boolean getEnabled();\n    method public String? getLayerAbove();\n    method public String? getLayerBelow();\n    method public com.mapbox.maps.plugin.LocationPuck getLocationPuck();\n    method public com.mapbox.maps.plugin.PuckBearing getPuckBearing();\n    method public boolean getPuckBearingEnabled();\n    method public int getPulsingColor();\n    method public boolean getPulsingEnabled();\n    method public float getPulsingMaxRadius();\n    method public com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings getSettings();\n    method public boolean getShowAccuracyRing();\n    method public String? getSlot();\n    method public void setAccuracyRingBorderColor(int);\n    method public void setAccuracyRingColor(int);\n    method public void setEnabled(boolean);\n    method public void setLayerAbove(String?);\n    method public void setLayerBelow(String?);\n    method public void setLocationPuck(com.mapbox.maps.plugin.LocationPuck);\n    method public void setPuckBearing(com.mapbox.maps.plugin.PuckBearing);\n    method public void setPuckBearingEnabled(boolean);\n    method public void setPulsingColor(int);\n    method public void setPulsingEnabled(boolean);\n    method public void setPulsingMaxRadius(float);\n    method public void setShowAccuracyRing(boolean);\n    method public void setSlot(String?);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder,kotlin.Unit> block);\n    property public abstract int accuracyRingBorderColor;\n    property public abstract int accuracyRingColor;\n    property public abstract boolean enabled;\n    property public abstract String? layerAbove;\n    property public abstract String? layerBelow;\n    property public abstract com.mapbox.maps.plugin.LocationPuck locationPuck;\n    property public abstract com.mapbox.maps.plugin.PuckBearing puckBearing;\n    property public abstract boolean puckBearingEnabled;\n    property public abstract int pulsingColor;\n    property public abstract boolean pulsingEnabled;\n    property public abstract float pulsingMaxRadius;\n    property public abstract boolean showAccuracyRing;\n    property public abstract String? slot;\n  }\n\n  public final class LocationComponentSettingsKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings! LocationComponentSettings(com.mapbox.maps.plugin.LocationPuck locationPuck, kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings.Builder,? extends kotlin.Unit> initializer);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.logo {\n\n  public interface LogoPlugin extends com.mapbox.maps.plugin.ViewPlugin com.mapbox.maps.plugin.logo.generated.LogoSettingsInterface {\n  }\n\n  public interface LogoView {\n    method public boolean getLogoEnabled();\n    method public int getLogoGravity();\n    method public void requestLayout();\n    method public void setLogoEnabled(boolean);\n    method public void setLogoGravity(int);\n    method public void setLogoMargins(@Px int left, @Px int top, @Px int right, @Px int bottom);\n    property public abstract boolean logoEnabled;\n    property public abstract int logoGravity;\n  }\n\n}\n\npackage com.mapbox.maps.plugin.logo.generated {\n\n  @kotlinx.parcelize.Parcelize public final class LogoSettings implements android.os.Parcelable {\n    method public boolean getEnabled();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder toBuilder();\n    property public final boolean enabled;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final int position;\n  }\n\n  public static final class LogoSettings.Builder {\n    ctor public LogoSettings.Builder();\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings build();\n    method public boolean getEnabled();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder setEnabled(boolean enabled);\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder setMarginBottom(float marginBottom);\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder setMarginLeft(float marginLeft);\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder setMarginRight(float marginRight);\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder setMarginTop(float marginTop);\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder setPosition(int position);\n    property public final boolean enabled;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final int position;\n  }\n\n  public abstract class LogoSettingsBase implements com.mapbox.maps.plugin.logo.generated.LogoSettingsInterface {\n    ctor public LogoSettingsBase();\n    method protected abstract void applySettings();\n    method public boolean getEnabled();\n    method protected abstract com.mapbox.maps.plugin.logo.generated.LogoSettings getInternalSettings();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings getSettings();\n    method public void setEnabled(boolean);\n    method protected abstract void setInternalSettings(com.mapbox.maps.plugin.logo.generated.LogoSettings);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method public void setPosition(int);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder,kotlin.Unit> block);\n    property public boolean enabled;\n    property protected abstract com.mapbox.maps.plugin.logo.generated.LogoSettings internalSettings;\n    property public float marginBottom;\n    property public float marginLeft;\n    property public float marginRight;\n    property public float marginTop;\n    property public int position;\n  }\n\n  public interface LogoSettingsInterface {\n    method public boolean getEnabled();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public com.mapbox.maps.plugin.logo.generated.LogoSettings getSettings();\n    method public void setEnabled(boolean);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method public void setPosition(int);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder,kotlin.Unit> block);\n    property public abstract boolean enabled;\n    property public abstract float marginBottom;\n    property public abstract float marginLeft;\n    property public abstract float marginRight;\n    property public abstract float marginTop;\n    property public abstract int position;\n  }\n\n  public final class LogoSettingsKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.plugin.logo.generated.LogoSettings! LogoSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.logo.generated.LogoSettings.Builder,? extends kotlin.Unit> initializer);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.overlay {\n\n  public fun interface MapOverlayCoordinatesProvider {\n    method public java.util.List<com.mapbox.geojson.Point> getShownCoordinates();\n  }\n\n  public interface MapOverlayPlugin extends com.mapbox.maps.plugin.MapSizePlugin com.mapbox.maps.plugin.MapPlugin {\n    method public com.mapbox.maps.EdgeInsets getEdgeInsets();\n    method public void reframe(com.mapbox.maps.plugin.overlay.OnReframeFinished? onReframeFinished = null);\n    method public void registerMapOverlayCoordinatesProvider(com.mapbox.maps.plugin.overlay.MapOverlayCoordinatesProvider provider);\n    method public void registerOverlay(android.view.View overlay);\n    method public void registerOverlays(java.util.List<? extends android.view.View> overlays);\n    method public void setDisplayingAreaMargins(int marginTop, int marginLeft, int marginBottom, int marginRight);\n    method public void unregisterMapOverlayCoordinatesProvider();\n    method public void unregisterOverlay(android.view.View overlay);\n    method public void unregisterOverlays(java.util.List<? extends android.view.View> overlays);\n  }\n\n  public fun interface OnReframeFinished {\n    method public void onReframeFinished(com.mapbox.maps.CameraOptions? cameraOptions);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.scalebar {\n\n  public interface ScaleBar {\n    method public float getDistancePerPixel();\n    method public boolean getEnable();\n    method public float getMapViewWidth();\n    method public float getPixelRatio();\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings getSettings();\n    method public boolean getUseContinuousRendering();\n    method public void setDistancePerPixel(float);\n    method public void setEnable(boolean);\n    method public void setMapViewWidth(float);\n    method public void setPixelRatio(float);\n    method public void setSettings(com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings);\n    method public void setUseContinuousRendering(boolean);\n    property public abstract float distancePerPixel;\n    property public abstract boolean enable;\n    property public abstract float mapViewWidth;\n    property public abstract float pixelRatio;\n    property public abstract com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings settings;\n    property public abstract boolean useContinuousRendering;\n  }\n\n  public interface ScaleBarPlugin extends com.mapbox.maps.plugin.ViewPlugin com.mapbox.maps.plugin.MapSizePlugin com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettingsInterface {\n    method public float getDistancePerPixel();\n    method public void setDistancePerPixel(float);\n    property public abstract float distancePerPixel;\n  }\n\n}\n\npackage com.mapbox.maps.plugin.scalebar.generated {\n\n  @kotlinx.parcelize.Parcelize public final class ScaleBarSettings implements android.os.Parcelable {\n    method public float getBorderWidth();\n    method public com.mapbox.maps.plugin.DistanceUnits getDistanceUnits();\n    method public boolean getEnabled();\n    method public float getHeight();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public int getPrimaryColor();\n    method public float getRatio();\n    method public long getRefreshInterval();\n    method public int getSecondaryColor();\n    method public boolean getShowTextBorder();\n    method public float getTextBarMargin();\n    method public float getTextBorderWidth();\n    method public int getTextColor();\n    method public float getTextSize();\n    method public boolean getUseContinuousRendering();\n    method public boolean isMetricUnits();\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder toBuilder();\n    property public final float borderWidth;\n    property public final com.mapbox.maps.plugin.DistanceUnits distanceUnits;\n    property public final boolean enabled;\n    property public final float height;\n    property public final boolean isMetricUnits;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final int position;\n    property public final int primaryColor;\n    property public final float ratio;\n    property public final long refreshInterval;\n    property public final int secondaryColor;\n    property public final boolean showTextBorder;\n    property public final float textBarMargin;\n    property public final float textBorderWidth;\n    property public final int textColor;\n    property public final float textSize;\n    property public final boolean useContinuousRendering;\n  }\n\n  public static final class ScaleBarSettings.Builder {\n    ctor public ScaleBarSettings.Builder();\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings build();\n    method public float getBorderWidth();\n    method public com.mapbox.maps.plugin.DistanceUnits getDistanceUnits();\n    method public boolean getEnabled();\n    method public float getHeight();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public int getPrimaryColor();\n    method public float getRatio();\n    method public long getRefreshInterval();\n    method public int getSecondaryColor();\n    method public boolean getShowTextBorder();\n    method public float getTextBarMargin();\n    method public float getTextBorderWidth();\n    method public int getTextColor();\n    method public float getTextSize();\n    method public boolean getUseContinuousRendering();\n    method public boolean isMetricUnits();\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setBorderWidth(float borderWidth);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setDistanceUnits(com.mapbox.maps.plugin.DistanceUnits units);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setEnabled(boolean enabled);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setHeight(float height);\n    method @Deprecated public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setIsMetricUnits(boolean isMetricUnits);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setMarginBottom(float marginBottom);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setMarginLeft(float marginLeft);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setMarginRight(float marginRight);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setMarginTop(float marginTop);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setPosition(int position);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setPrimaryColor(int primaryColor);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setRatio(float ratio);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setRefreshInterval(long refreshInterval);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setSecondaryColor(int secondaryColor);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setShowTextBorder(boolean showTextBorder);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setTextBarMargin(float textBarMargin);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setTextBorderWidth(float textBorderWidth);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setTextColor(int textColor);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setTextSize(float textSize);\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder setUseContinuousRendering(boolean useContinuousRendering);\n    property public final float borderWidth;\n    property public final com.mapbox.maps.plugin.DistanceUnits distanceUnits;\n    property public final boolean enabled;\n    property public final float height;\n    property public final boolean isMetricUnits;\n    property public final float marginBottom;\n    property public final float marginLeft;\n    property public final float marginRight;\n    property public final float marginTop;\n    property public final int position;\n    property public final int primaryColor;\n    property public final float ratio;\n    property public final long refreshInterval;\n    property public final int secondaryColor;\n    property public final boolean showTextBorder;\n    property public final float textBarMargin;\n    property public final float textBorderWidth;\n    property public final int textColor;\n    property public final float textSize;\n    property public final boolean useContinuousRendering;\n  }\n\n  public abstract class ScaleBarSettingsBase implements com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettingsInterface {\n    ctor public ScaleBarSettingsBase();\n    method protected abstract void applySettings();\n    method public float getBorderWidth();\n    method public com.mapbox.maps.plugin.DistanceUnits getDistanceUnits();\n    method public boolean getEnabled();\n    method public float getHeight();\n    method protected abstract com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings getInternalSettings();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public int getPrimaryColor();\n    method public float getRatio();\n    method public long getRefreshInterval();\n    method public int getSecondaryColor();\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings getSettings();\n    method public boolean getShowTextBorder();\n    method public float getTextBarMargin();\n    method public float getTextBorderWidth();\n    method public int getTextColor();\n    method public float getTextSize();\n    method public boolean getUseContinuousRendering();\n    method @Deprecated public boolean isMetricUnits();\n    method public void setBorderWidth(float);\n    method public void setDistanceUnits(com.mapbox.maps.plugin.DistanceUnits);\n    method public void setEnabled(boolean);\n    method public void setHeight(float);\n    method protected abstract void setInternalSettings(com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method @Deprecated public void setMetricUnits(boolean);\n    method public void setPosition(int);\n    method public void setPrimaryColor(int);\n    method public void setRatio(float);\n    method public void setRefreshInterval(long);\n    method public void setSecondaryColor(int);\n    method public void setShowTextBorder(boolean);\n    method public void setTextBarMargin(float);\n    method public void setTextBorderWidth(float);\n    method public void setTextColor(int);\n    method public void setTextSize(float);\n    method public void setUseContinuousRendering(boolean);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder,kotlin.Unit> block);\n    property public float borderWidth;\n    property public com.mapbox.maps.plugin.DistanceUnits distanceUnits;\n    property public boolean enabled;\n    property public float height;\n    property protected abstract com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings internalSettings;\n    property @Deprecated public boolean isMetricUnits;\n    property public float marginBottom;\n    property public float marginLeft;\n    property public float marginRight;\n    property public float marginTop;\n    property public int position;\n    property public int primaryColor;\n    property public float ratio;\n    property public long refreshInterval;\n    property public int secondaryColor;\n    property public boolean showTextBorder;\n    property public float textBarMargin;\n    property public float textBorderWidth;\n    property public int textColor;\n    property public float textSize;\n    property public boolean useContinuousRendering;\n  }\n\n  public interface ScaleBarSettingsInterface {\n    method public float getBorderWidth();\n    method public com.mapbox.maps.plugin.DistanceUnits getDistanceUnits();\n    method public boolean getEnabled();\n    method public float getHeight();\n    method public float getMarginBottom();\n    method public float getMarginLeft();\n    method public float getMarginRight();\n    method public float getMarginTop();\n    method public int getPosition();\n    method public int getPrimaryColor();\n    method public float getRatio();\n    method public long getRefreshInterval();\n    method public int getSecondaryColor();\n    method public com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings getSettings();\n    method public boolean getShowTextBorder();\n    method public float getTextBarMargin();\n    method public float getTextBorderWidth();\n    method public int getTextColor();\n    method public float getTextSize();\n    method public boolean getUseContinuousRendering();\n    method @Deprecated public boolean isMetricUnits();\n    method public void setBorderWidth(float);\n    method public void setDistanceUnits(com.mapbox.maps.plugin.DistanceUnits);\n    method public void setEnabled(boolean);\n    method public void setHeight(float);\n    method public void setMarginBottom(float);\n    method public void setMarginLeft(float);\n    method public void setMarginRight(float);\n    method public void setMarginTop(float);\n    method @Deprecated public void setMetricUnits(boolean);\n    method public void setPosition(int);\n    method public void setPrimaryColor(int);\n    method public void setRatio(float);\n    method public void setRefreshInterval(long);\n    method public void setSecondaryColor(int);\n    method public void setShowTextBorder(boolean);\n    method public void setTextBarMargin(float);\n    method public void setTextBorderWidth(float);\n    method public void setTextColor(int);\n    method public void setTextSize(float);\n    method public void setUseContinuousRendering(boolean);\n    method public void updateSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder,kotlin.Unit> block);\n    property public abstract float borderWidth;\n    property public abstract com.mapbox.maps.plugin.DistanceUnits distanceUnits;\n    property public abstract boolean enabled;\n    property public abstract float height;\n    property @Deprecated public abstract boolean isMetricUnits;\n    property public abstract float marginBottom;\n    property public abstract float marginLeft;\n    property public abstract float marginRight;\n    property public abstract float marginTop;\n    property public abstract int position;\n    property public abstract int primaryColor;\n    property public abstract float ratio;\n    property public abstract long refreshInterval;\n    property public abstract int secondaryColor;\n    property public abstract boolean showTextBorder;\n    property public abstract float textBarMargin;\n    property public abstract float textBorderWidth;\n    property public abstract int textColor;\n    property public abstract float textSize;\n    property public abstract boolean useContinuousRendering;\n  }\n\n  public final class ScaleBarSettingsKt {\n    method @kotlin.jvm.JvmSynthetic public static com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings! ScaleBarSettings(kotlin.jvm.functions.Function1<? super com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings.Builder,? extends kotlin.Unit> initializer);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.viewport {\n\n  public fun interface CompletionListener {\n    method public void onComplete(boolean isFinished);\n  }\n\n  public final class ViewportConstantsKt {\n    field public static final double DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH = 45.0;\n    field public static final double DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM = 16.35;\n    field public static final long DEFAULT_STATE_ANIMATION_DURATION_MS = 1000L; // 0x3e8L\n    field public static final long DEFAULT_TRANSITION_MAX_DURATION_MS = 3500L; // 0xdacL\n  }\n\n  public interface ViewportPlugin extends com.mapbox.maps.plugin.MapPlugin {\n    method public void addStatusObserver(com.mapbox.maps.plugin.viewport.ViewportStatusObserver viewportStatusObserver);\n    method public com.mapbox.maps.plugin.viewport.transition.ViewportTransition getDefaultTransition();\n    method public com.mapbox.maps.plugin.viewport.data.ViewportOptions getOptions();\n    method public com.mapbox.maps.plugin.viewport.ViewportStatus getStatus();\n    method public void idle();\n    method public com.mapbox.maps.plugin.viewport.transition.DefaultViewportTransition makeDefaultViewportTransition(com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions options = DefaultViewportTransitionOptions.<init>().build());\n    method public com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState makeFollowPuckViewportState(com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions options = FollowPuckViewportStateOptions.<init>().build());\n    method public com.mapbox.maps.plugin.viewport.transition.ViewportTransition makeImmediateViewportTransition();\n    method public com.mapbox.maps.plugin.viewport.state.OverviewViewportState makeOverviewViewportState(com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions options);\n    method public void removeStatusObserver(com.mapbox.maps.plugin.viewport.ViewportStatusObserver viewportStatusObserver);\n    method public void setDefaultTransition(com.mapbox.maps.plugin.viewport.transition.ViewportTransition);\n    method public void setOptions(com.mapbox.maps.plugin.viewport.data.ViewportOptions);\n    method public void transitionTo(com.mapbox.maps.plugin.viewport.state.ViewportState targetState, com.mapbox.maps.plugin.viewport.transition.ViewportTransition? transition = null, com.mapbox.maps.plugin.viewport.CompletionListener? completionListener = null);\n    property public abstract com.mapbox.maps.plugin.viewport.transition.ViewportTransition defaultTransition;\n    property public abstract com.mapbox.maps.plugin.viewport.data.ViewportOptions options;\n    property public abstract com.mapbox.maps.plugin.viewport.ViewportStatus status;\n  }\n\n  public abstract sealed class ViewportStatus {\n  }\n\n  public static final class ViewportStatus.Idle extends com.mapbox.maps.plugin.viewport.ViewportStatus {\n    field public static final com.mapbox.maps.plugin.viewport.ViewportStatus.Idle INSTANCE;\n  }\n\n  public static final class ViewportStatus.State extends com.mapbox.maps.plugin.viewport.ViewportStatus {\n    ctor public ViewportStatus.State(com.mapbox.maps.plugin.viewport.state.ViewportState state);\n    method public com.mapbox.maps.plugin.viewport.state.ViewportState getState();\n    property public final com.mapbox.maps.plugin.viewport.state.ViewportState state;\n  }\n\n  public static final class ViewportStatus.Transition extends com.mapbox.maps.plugin.viewport.ViewportStatus {\n    ctor public ViewportStatus.Transition(com.mapbox.maps.plugin.viewport.transition.ViewportTransition transition, com.mapbox.maps.plugin.viewport.state.ViewportState toState);\n    method public com.mapbox.maps.plugin.viewport.state.ViewportState getToState();\n    method public com.mapbox.maps.plugin.viewport.transition.ViewportTransition getTransition();\n    property public final com.mapbox.maps.plugin.viewport.state.ViewportState toState;\n    property public final com.mapbox.maps.plugin.viewport.transition.ViewportTransition transition;\n  }\n\n  public fun interface ViewportStatusObserver {\n    method public void onViewportStatusChanged(com.mapbox.maps.plugin.viewport.ViewportStatus from, com.mapbox.maps.plugin.viewport.ViewportStatus to, com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason reason);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.viewport.data {\n\n  public final class DefaultViewportTransitionOptions {\n    method public long getMaxDurationMs();\n    method public com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions.Builder toBuilder();\n    property public final long maxDurationMs;\n  }\n\n  public static final class DefaultViewportTransitionOptions.Builder {\n    ctor public DefaultViewportTransitionOptions.Builder();\n    method public com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions build();\n    method public com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions.Builder maxDurationMs(long maxDurationMs);\n  }\n\n  public abstract sealed class FollowPuckViewportStateBearing {\n  }\n\n  public static final class FollowPuckViewportStateBearing.Constant extends com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing {\n    ctor public FollowPuckViewportStateBearing.Constant(double bearing);\n    method public double getBearing();\n    property public final double bearing;\n  }\n\n  public static final class FollowPuckViewportStateBearing.SyncWithLocationPuck extends com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing {\n    field public static final com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing.SyncWithLocationPuck INSTANCE;\n  }\n\n  public final class FollowPuckViewportStateOptions {\n    method public com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing? getBearing();\n    method public com.mapbox.maps.EdgeInsets? getPadding();\n    method public Double? getPitch();\n    method public Double? getZoom();\n    method public com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions.Builder toBuilder();\n    property public final com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing? bearing;\n    property public final com.mapbox.maps.EdgeInsets? padding;\n    property public final Double? pitch;\n    property public final Double? zoom;\n  }\n\n  public static final class FollowPuckViewportStateOptions.Builder {\n    ctor public FollowPuckViewportStateOptions.Builder();\n    method public com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions.Builder bearing(com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing? options);\n    method public com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions build();\n    method public com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions.Builder padding(com.mapbox.maps.EdgeInsets? padding);\n    method public com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions.Builder pitch(Double? pitch);\n    method public com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions.Builder zoom(Double? zoom);\n  }\n\n  public final class OverviewViewportStateOptions {\n    method public long getAnimationDurationMs();\n    method public Double? getBearing();\n    method public com.mapbox.geojson.Geometry getGeometry();\n    method public com.mapbox.maps.EdgeInsets getGeometryPadding();\n    method public Double? getMaxZoom();\n    method public com.mapbox.maps.ScreenCoordinate getOffset();\n    method public com.mapbox.maps.EdgeInsets? getPadding();\n    method public Double? getPitch();\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions.Builder toBuilder();\n    property public final long animationDurationMs;\n    property public final Double? bearing;\n    property public final com.mapbox.geojson.Geometry geometry;\n    property public final com.mapbox.maps.EdgeInsets geometryPadding;\n    property public final Double? maxZoom;\n    property public final com.mapbox.maps.ScreenCoordinate offset;\n    property public final com.mapbox.maps.EdgeInsets? padding;\n    property public final Double? pitch;\n  }\n\n  public static final class OverviewViewportStateOptions.Builder {\n    ctor public OverviewViewportStateOptions.Builder();\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions.Builder animationDurationMs(long duration);\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions.Builder bearing(Double? bearing);\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions build();\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions.Builder geometry(com.mapbox.geojson.Geometry geometry);\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions.Builder geometryPadding(com.mapbox.maps.EdgeInsets geometryPadding);\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions.Builder maxZoom(Double? maxZoom);\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions.Builder offset(com.mapbox.maps.ScreenCoordinate offset);\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions.Builder padding(com.mapbox.maps.EdgeInsets? padding);\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions.Builder pitch(Double? pitch);\n  }\n\n  public final class ViewportOptions {\n    method public boolean getTransitionsToIdleUponUserInteraction();\n    method public com.mapbox.maps.plugin.viewport.data.ViewportOptions.Builder toBuilder();\n    property public final boolean transitionsToIdleUponUserInteraction;\n  }\n\n  public static final class ViewportOptions.Builder {\n    ctor public ViewportOptions.Builder();\n    method public com.mapbox.maps.plugin.viewport.data.ViewportOptions build();\n    method public com.mapbox.maps.plugin.viewport.data.ViewportOptions.Builder transitionsToIdleUponUserInteraction(boolean transitionsToIdleUponUserInteraction);\n  }\n\n  public final class ViewportStatusChangeReason {\n    field public static final com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason.Companion Companion;\n    field public static final com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason IDLE_REQUESTED;\n    field public static final com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason TRANSITION_FAILED;\n    field public static final com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason TRANSITION_STARTED;\n    field public static final com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason TRANSITION_SUCCEEDED;\n    field public static final com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason USER_INTERACTION;\n  }\n\n  public static final class ViewportStatusChangeReason.Companion {\n  }\n\n}\n\npackage com.mapbox.maps.plugin.viewport.state {\n\n  public interface FollowPuckViewportState extends com.mapbox.maps.plugin.viewport.state.ViewportState {\n    method public com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions getOptions();\n    method public void setOptions(com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions);\n    property public abstract com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions options;\n  }\n\n  public interface OverviewViewportState extends com.mapbox.maps.plugin.viewport.state.ViewportState {\n    method public com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions getOptions();\n    method public void setOptions(com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions);\n    property public abstract com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions options;\n  }\n\n  public interface ViewportState {\n    method public com.mapbox.common.Cancelable observeDataSource(com.mapbox.maps.plugin.viewport.state.ViewportStateDataObserver viewportStateDataObserver);\n    method public void startUpdatingCamera();\n    method public void stopUpdatingCamera();\n  }\n\n  public fun interface ViewportStateDataObserver {\n    method public boolean onNewData(com.mapbox.maps.CameraOptions cameraOptions);\n  }\n\n}\n\npackage com.mapbox.maps.plugin.viewport.transition {\n\n  public interface DefaultViewportTransition extends com.mapbox.maps.plugin.viewport.transition.ViewportTransition {\n    method public com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions getOptions();\n    method public void setOptions(com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions);\n    property public abstract com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions options;\n  }\n\n  public fun interface ViewportTransition {\n    method public com.mapbox.common.Cancelable run(com.mapbox.maps.plugin.viewport.state.ViewportState to, com.mapbox.maps.plugin.viewport.CompletionListener completionListener);\n  }\n\n}\n\npackage com.mapbox.maps.threading {\n\n  @com.mapbox.maps.MapboxExperimental public final class AnimationThreadController {\n    method public boolean getUsingBackgroundThread();\n    method public void postOnAnimatorThread(kotlin.jvm.functions.Function0<kotlin.Unit> function);\n    method public void postOnMainThread(kotlin.jvm.functions.Function0<kotlin.Unit> function);\n    method public void useBackgroundThread();\n    method public void useMainThread();\n    property public final boolean usingBackgroundThread;\n    field public static final com.mapbox.maps.threading.AnimationThreadController INSTANCE;\n  }\n\n}\n\npackage com.mapbox.maps.util {\n\n  public final class CameraOptionsUtils {\n    method public static boolean isEmpty(com.mapbox.maps.CameraOptions);\n  }\n\n  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class CoreGesturesHandler {\n    ctor public CoreGesturesHandler(com.mapbox.maps.plugin.delegates.MapTransformDelegate mapTransformDelegate, com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate mapCameraManagerDelegate);\n    method public android.animation.AnimatorListenerAdapter getCoreGestureAnimatorHandler();\n    method public void notifyCoreGestureStarted();\n    method public void notifyCoreTouchEnded();\n    property public final android.animation.AnimatorListenerAdapter coreGestureAnimatorHandler;\n  }\n\n  public final class MathUtils {\n    method public double[] prepareOptimalBearingPath(double[] targets);\n    field public static final com.mapbox.maps.util.MathUtils INSTANCE;\n  }\n\n}\n\n"
  },
  {
    "path": "sdk-base/api/sdk-base.api",
    "content": "public final class com/mapbox/maps/ClickInteraction : com/mapbox/maps/MapInteraction {\n\tpublic static final field Companion Lcom/mapbox/maps/ClickInteraction$Companion;\n\tpublic synthetic fun <init> (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic static final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun featureset (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun featureset (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun layer (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun map (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/ClickInteraction;\n}\n\npublic final class com/mapbox/maps/ClickInteraction$Companion {\n\tpublic final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun featureset (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun featureset (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun featureset$default (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun layer (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun layer$default (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun map (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/ClickInteraction;\n}\n\npublic final class com/mapbox/maps/DragInteraction : com/mapbox/maps/MapInteraction {\n\tpublic static final field Companion Lcom/mapbox/maps/DragInteraction$Companion;\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/FeaturesetDescriptor;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic static final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun featureset (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun featureset (Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun layer (Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n}\n\npublic final class com/mapbox/maps/DragInteraction$Companion {\n\tpublic final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun featureset (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun featureset (Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun featureset$default (Lcom/mapbox/maps/DragInteraction$Companion;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final synthetic fun invoke (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/DragInteraction;\n\tpublic final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun layer (Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun layer$default (Lcom/mapbox/maps/DragInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n}\n\npublic final class com/mapbox/maps/ExtensionUtils {\n\tpublic static final fun toCameraOptions (Lcom/mapbox/maps/CameraState;)Lcom/mapbox/maps/CameraOptions;\n\tpublic static final fun toCameraOptions (Lcom/mapbox/maps/CameraState;Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/CameraOptions;\n\tpublic static synthetic fun toCameraOptions$default (Lcom/mapbox/maps/CameraState;Lcom/mapbox/maps/ScreenCoordinate;ILjava/lang/Object;)Lcom/mapbox/maps/CameraOptions;\n\tpublic static final fun toMapboxImage (Landroid/graphics/Bitmap;)Lcom/mapbox/maps/Image;\n}\n\npublic final class com/mapbox/maps/ImageHolder : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic static final field Companion Lcom/mapbox/maps/ImageHolder$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/Integer;Landroid/graphics/Bitmap;Lcom/mapbox/maps/Image;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun from (I)Lcom/mapbox/maps/ImageHolder;\n\tpublic static final fun from (Landroid/graphics/Bitmap;)Lcom/mapbox/maps/ImageHolder;\n\tpublic static final fun from (Lcom/mapbox/maps/Image;)Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun getBitmap ()Landroid/graphics/Bitmap;\n\tpublic final fun getDrawableId ()Ljava/lang/Integer;\n\tpublic final fun getImage ()Lcom/mapbox/maps/Image;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/ImageHolder$Companion {\n\tpublic final fun from (I)Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun from (Landroid/graphics/Bitmap;)Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun from (Lcom/mapbox/maps/Image;)Lcom/mapbox/maps/ImageHolder;\n}\n\npublic final class com/mapbox/maps/ImageHolder$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/ImageHolder;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/ImageHolder;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/LongClickInteraction : com/mapbox/maps/MapInteraction {\n\tpublic static final field Companion Lcom/mapbox/maps/LongClickInteraction$Companion;\n\tpublic synthetic fun <init> (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic static final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun featureset (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun featureset (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun layer (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun map (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/LongClickInteraction;\n}\n\npublic final class com/mapbox/maps/LongClickInteraction$Companion {\n\tpublic final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun featureset (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun featureset (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun featureset (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun featureset$default (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun layer (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun layer (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun layer$default (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic final fun map (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/LongClickInteraction;\n}\n\npublic abstract class com/mapbox/maps/MapInteraction {\n\tpublic fun <init> ()V\n}\n\npublic abstract interface class com/mapbox/maps/MapLoadingErrorDelegate {\n\tpublic abstract fun sendMapLoadingError (Lcom/mapbox/maps/MapLoadingError;)V\n}\n\npublic final class com/mapbox/maps/MapboxAnnotationException : java/lang/RuntimeException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/MapboxCameraAnimationException : java/lang/RuntimeException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/MapboxConcurrentGeometryModificationException : java/util/ConcurrentModificationException {\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n}\n\npublic abstract interface annotation class com/mapbox/maps/MapboxDelicateApi : java/lang/annotation/Annotation {\n}\n\npublic abstract interface annotation class com/mapbox/maps/MapboxExperimental : java/lang/annotation/Annotation {\n}\n\npublic abstract interface class com/mapbox/maps/MapboxLifecycleObserver {\n\tpublic abstract fun onDestroy ()V\n\tpublic abstract fun onLowMemory ()V\n\tpublic abstract fun onResume ()V\n\tpublic abstract fun onStart ()V\n\tpublic abstract fun onStop ()V\n}\n\npublic final class com/mapbox/maps/MapboxLifecycleObserver$DefaultImpls {\n\tpublic static fun onResume (Lcom/mapbox/maps/MapboxLifecycleObserver;)V\n}\n\npublic final class com/mapbox/maps/MapboxLocationComponentException : java/lang/RuntimeException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/MapboxLogger {\n\tpublic static final fun isLoggableD ()Z\n\tpublic static final fun logD (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic static final fun logD (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/common/LogThrottler;)V\n\tpublic static final fun logD (Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun logE (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic static final fun logE (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/common/LogThrottler;)V\n\tpublic static final fun logI (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic static final fun logI (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/common/LogThrottler;)V\n\tpublic static final fun logW (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic static final fun logW (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/common/LogThrottler;)V\n}\n\npublic final class com/mapbox/maps/MapboxMapException : java/lang/RuntimeException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/MapboxStyleException : java/lang/RuntimeException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic class com/mapbox/maps/MapboxStyleManager {\n\tpublic fun <init> (Lcom/mapbox/maps/StyleManager;FLcom/mapbox/maps/MapLoadingErrorDelegate;)V\n\tpublic fun addGeoJSONSourceFeatures (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic final fun addImage (Ljava/lang/String;Landroid/graphics/Bitmap;)Lcom/mapbox/bindgen/Expected;\n\tpublic final fun addImage (Ljava/lang/String;Landroid/graphics/Bitmap;Z)Lcom/mapbox/bindgen/Expected;\n\tpublic final fun addImage (Ljava/lang/String;Lcom/mapbox/maps/Image;)Lcom/mapbox/bindgen/Expected;\n\tpublic final fun addImage (Ljava/lang/String;Lcom/mapbox/maps/Image;Z)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addPersistentStyleCustomLayer (Ljava/lang/String;Lcom/mapbox/maps/CustomLayerHost;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addPersistentStyleLayer (Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleCustomGeometrySource (Ljava/lang/String;Lcom/mapbox/maps/CustomGeometrySourceOptions;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleCustomLayer (Ljava/lang/String;Lcom/mapbox/maps/CustomLayerHost;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleCustomRasterSource (Ljava/lang/String;Lcom/mapbox/maps/CustomRasterSourceOptions;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleImage (Ljava/lang/String;FLcom/mapbox/maps/Image;ZLjava/util/List;Ljava/util/List;Lcom/mapbox/maps/ImageContent;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleImportFromJSON (Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;Lcom/mapbox/maps/ImportPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleImportFromURI (Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;Lcom/mapbox/maps/ImportPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleLayer (Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleModel (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun addStyleSource (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getFeaturesets ()Ljava/util/List;\n\tpublic final fun getMapLoadingErrorDelegate ()Lcom/mapbox/maps/MapLoadingErrorDelegate;\n\tpublic final fun getPixelRatio ()F\n\tpublic fun getStyleAtmosphereProperty (Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleDefaultCamera ()Lcom/mapbox/maps/CameraOptions;\n\tpublic fun getStyleGlyphURL ()Ljava/lang/String;\n\tpublic fun getStyleImage (Ljava/lang/String;)Lcom/mapbox/maps/Image;\n\tpublic fun getStyleImportConfigProperties (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleImportConfigProperty (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleImportSchema (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleImports ()Ljava/util/List;\n\tpublic fun getStyleJSON ()Ljava/lang/String;\n\tpublic fun getStyleLayerProperties (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleLayerProperty (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleLayers ()Ljava/util/List;\n\tpublic fun getStyleLightProperty (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleLights ()Ljava/util/List;\n\tpublic final fun getStyleManager ()Lcom/mapbox/maps/StyleManager;\n\tpublic fun getStyleProjectionProperty (Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic final fun getStyleRainProperty (Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleSlots ()Ljava/util/List;\n\tpublic final fun getStyleSnowProperty (Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleSourceProperties (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun getStyleSourceProperty (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleSources ()Ljava/util/List;\n\tpublic fun getStyleTerrainProperty (Ljava/lang/String;)Lcom/mapbox/maps/StylePropertyValue;\n\tpublic fun getStyleTransition ()Lcom/mapbox/maps/TransitionOptions;\n\tpublic fun getStyleURI ()Ljava/lang/String;\n\tpublic fun hasStyleImage (Ljava/lang/String;)Z\n\tpublic fun hasStyleModel (Ljava/lang/String;)Z\n\tpublic fun invalidateStyleCustomGeometrySourceRegion (Ljava/lang/String;Lcom/mapbox/maps/CoordinateBounds;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun invalidateStyleCustomGeometrySourceTile (Ljava/lang/String;Lcom/mapbox/maps/CanonicalTileID;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun isStyleLayerPersistent (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun isStyleLoaded ()Z\n\tpublic fun moveStyleImport (Ljava/lang/String;Lcom/mapbox/maps/ImportPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun moveStyleLayer (Ljava/lang/String;Lcom/mapbox/maps/LayerPosition;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeGeoJSONSourceFeatures (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleImage (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleImport (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleLayer (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleModel (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleSource (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun removeStyleSourceUnchecked (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setImportColorTheme (Ljava/lang/String;Landroid/graphics/Bitmap;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setImportColorTheme (Ljava/lang/String;Lcom/mapbox/maps/ColorTheme;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setImportColorTheme (Ljava/lang/String;Lcom/mapbox/maps/Image;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setImportColorTheme (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setInitialStyleColorTheme ()V\n\tpublic fun setStyleAtmosphere (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleAtmosphereProperty (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleColorTheme (Landroid/graphics/Bitmap;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleColorTheme (Lcom/mapbox/maps/ColorTheme;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleColorTheme (Lcom/mapbox/maps/Image;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleColorTheme (Ljava/lang/String;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleCustomGeometrySourceTileData (Ljava/lang/String;Lcom/mapbox/maps/CanonicalTileID;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleCustomRasterSourceTileData (Ljava/lang/String;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleGeoJSONSourceData (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/GeoJSONSourceData;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleGlyphURL (Ljava/lang/String;)V\n\tpublic fun setStyleImportConfigProperties (Ljava/lang/String;Ljava/util/HashMap;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleImportConfigProperty (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleLayerProperties (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleLayerPropertiesAsync (Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/AsyncOperationResultCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun setStyleLayerProperty (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleLayerPropertyAsync (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/AsyncOperationResultCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic fun setStyleLightProperty (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleLights (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleProjection (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleProjectionProperty (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic final fun setStyleRain (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic final fun setStyleRainProperty (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleSnow (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleSnowProperty (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleSourceProperties (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleSourceProperty (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleSourceProperty (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleTerrain (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleTerrainProperty (Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun setStyleTransition (Lcom/mapbox/maps/TransitionOptions;)V\n\tpublic fun styleLayerExists (Ljava/lang/String;)Z\n\tpublic fun styleSourceExists (Ljava/lang/String;)Z\n\tpublic fun updateGeoJSONSourceFeatures (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun updateStyleImageSourceImage (Ljava/lang/String;Lcom/mapbox/maps/Image;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun updateStyleImportWithJSON (Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;)Lcom/mapbox/bindgen/Expected;\n\tpublic fun updateStyleImportWithURI (Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;)Lcom/mapbox/bindgen/Expected;\n}\n\npublic final class com/mapbox/maps/MapboxViewAnnotationException : java/lang/RuntimeException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/ThreadChecker {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/ThreadChecker;\n\tpublic final fun throwIfNotMainThread ()V\n}\n\npublic final class com/mapbox/maps/dsl/CameraOptionsKtxKt {\n\tpublic static final fun cameraOptions (Lcom/mapbox/maps/CameraState;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/CameraOptions;\n\tpublic static final fun cameraOptions (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/CameraOptions;\n}\n\npublic final class com/mapbox/maps/exception/WorkerThreadException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n}\n\npublic final class com/mapbox/maps/extension/observable/EventsExtensionKt {\n\tpublic static final fun toCameraChangedEventData (Lcom/mapbox/maps/CameraChanged;)Lcom/mapbox/maps/extension/observable/eventdata/CameraChangedEventData;\n\tpublic static final fun toMapIdleEventData (Lcom/mapbox/maps/MapIdle;)Lcom/mapbox/maps/extension/observable/eventdata/MapIdleEventData;\n\tpublic static final fun toMapLoadedEventData (Lcom/mapbox/maps/MapLoaded;)Lcom/mapbox/maps/extension/observable/eventdata/MapLoadedEventData;\n\tpublic static final fun toMapLoadingErrorEventData (Lcom/mapbox/maps/MapLoadingError;)Lcom/mapbox/maps/extension/observable/eventdata/MapLoadingErrorEventData;\n\tpublic static final fun toRenderFrameFinishedEventData (Lcom/mapbox/maps/RenderFrameFinished;)Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameFinishedEventData;\n\tpublic static final fun toRenderFrameStartedEventData (Lcom/mapbox/maps/RenderFrameStarted;)Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameStartedEventData;\n\tpublic static final fun toSourceAddedEventData (Lcom/mapbox/maps/SourceAdded;)Lcom/mapbox/maps/extension/observable/eventdata/SourceAddedEventData;\n\tpublic static final fun toSourceDataLoadedEventData (Lcom/mapbox/maps/SourceDataLoaded;)Lcom/mapbox/maps/extension/observable/eventdata/SourceDataLoadedEventData;\n\tpublic static final fun toSourceRemovedEventData (Lcom/mapbox/maps/SourceRemoved;)Lcom/mapbox/maps/extension/observable/eventdata/SourceRemovedEventData;\n\tpublic static final fun toStyleDataLoadedEventData (Lcom/mapbox/maps/StyleDataLoaded;)Lcom/mapbox/maps/extension/observable/eventdata/StyleDataLoadedEventData;\n\tpublic static final fun toStyleImageMissingEventData (Lcom/mapbox/maps/StyleImageMissing;)Lcom/mapbox/maps/extension/observable/eventdata/StyleImageMissingEventData;\n\tpublic static final fun toStyleImageUnusedEventData (Lcom/mapbox/maps/StyleImageRemoveUnused;)Lcom/mapbox/maps/extension/observable/eventdata/StyleImageUnusedEventData;\n\tpublic static final fun toStyleLoadedEventData (Lcom/mapbox/maps/StyleLoaded;)Lcom/mapbox/maps/extension/observable/eventdata/StyleLoadedEventData;\n\tpublic static final fun toTileId (Lcom/mapbox/maps/CanonicalTileID;)Lcom/mapbox/maps/extension/observable/model/TileID;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/CameraChangedEventData {\n\tpublic fun <init> (JLjava/lang/Long;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun copy (JLjava/lang/Long;)Lcom/mapbox/maps/extension/observable/eventdata/CameraChangedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/CameraChangedEventData;JLjava/lang/Long;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/CameraChangedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/MapIdleEventData {\n\tpublic fun <init> (JLjava/lang/Long;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun copy (JLjava/lang/Long;)Lcom/mapbox/maps/extension/observable/eventdata/MapIdleEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/MapIdleEventData;JLjava/lang/Long;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/MapIdleEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/MapLoadedEventData {\n\tpublic fun <init> (JLjava/lang/Long;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun copy (JLjava/lang/Long;)Lcom/mapbox/maps/extension/observable/eventdata/MapLoadedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/MapLoadedEventData;JLjava/lang/Long;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/MapLoadedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/MapLoadingErrorEventData {\n\tpublic fun <init> (JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/observable/model/TileID;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun component6 ()Lcom/mapbox/maps/extension/observable/model/TileID;\n\tpublic final fun copy (JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/observable/model/TileID;)Lcom/mapbox/maps/extension/observable/eventdata/MapLoadingErrorEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/MapLoadingErrorEventData;JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/extension/observable/model/TileID;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/MapLoadingErrorEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic final fun getTileId ()Lcom/mapbox/maps/extension/observable/model/TileID;\n\tpublic final fun getType ()Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/RenderFrameFinishedEventData {\n\tpublic fun <init> (JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/RenderMode;ZZ)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Lcom/mapbox/maps/extension/observable/model/RenderMode;\n\tpublic final fun component4 ()Z\n\tpublic final fun component5 ()Z\n\tpublic final fun copy (JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/RenderMode;ZZ)Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameFinishedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameFinishedEventData;JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/RenderMode;ZZILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameFinishedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic final fun getNeedsRepaint ()Z\n\tpublic final fun getPlacementChanged ()Z\n\tpublic final fun getRenderMode ()Lcom/mapbox/maps/extension/observable/model/RenderMode;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/RenderFrameStartedEventData {\n\tpublic fun <init> (JLjava/lang/Long;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun copy (JLjava/lang/Long;)Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameStartedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameStartedEventData;JLjava/lang/Long;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameStartedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/ResourceEventData {\n\tpublic fun <init> (JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/DataSourceType;Lcom/mapbox/maps/extension/observable/model/Request;Lcom/mapbox/maps/extension/observable/model/Response;Z)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Lcom/mapbox/maps/extension/observable/model/DataSourceType;\n\tpublic final fun component4 ()Lcom/mapbox/maps/extension/observable/model/Request;\n\tpublic final fun component5 ()Lcom/mapbox/maps/extension/observable/model/Response;\n\tpublic final fun component6 ()Z\n\tpublic final fun copy (JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/DataSourceType;Lcom/mapbox/maps/extension/observable/model/Request;Lcom/mapbox/maps/extension/observable/model/Response;Z)Lcom/mapbox/maps/extension/observable/eventdata/ResourceEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/ResourceEventData;JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/DataSourceType;Lcom/mapbox/maps/extension/observable/model/Request;Lcom/mapbox/maps/extension/observable/model/Response;ZILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/ResourceEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getCancelled ()Z\n\tpublic final fun getDataSource ()Lcom/mapbox/maps/extension/observable/model/DataSourceType;\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic final fun getRequest ()Lcom/mapbox/maps/extension/observable/model/Request;\n\tpublic final fun getResponse ()Lcom/mapbox/maps/extension/observable/model/Response;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/SourceAddedEventData {\n\tpublic fun <init> (JLjava/lang/Long;Ljava/lang/String;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (JLjava/lang/Long;Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/eventdata/SourceAddedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/SourceAddedEventData;JLjava/lang/Long;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/SourceAddedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/SourceDataLoadedEventData {\n\tpublic fun <init> (JLjava/lang/Long;Ljava/lang/String;Lcom/mapbox/maps/extension/observable/model/SourceDataType;Ljava/lang/Boolean;Lcom/mapbox/maps/extension/observable/model/TileID;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Lcom/mapbox/maps/extension/observable/model/SourceDataType;\n\tpublic final fun component5 ()Ljava/lang/Boolean;\n\tpublic final fun component6 ()Lcom/mapbox/maps/extension/observable/model/TileID;\n\tpublic final fun copy (JLjava/lang/Long;Ljava/lang/String;Lcom/mapbox/maps/extension/observable/model/SourceDataType;Ljava/lang/Boolean;Lcom/mapbox/maps/extension/observable/model/TileID;)Lcom/mapbox/maps/extension/observable/eventdata/SourceDataLoadedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/SourceDataLoadedEventData;JLjava/lang/Long;Ljava/lang/String;Lcom/mapbox/maps/extension/observable/model/SourceDataType;Ljava/lang/Boolean;Lcom/mapbox/maps/extension/observable/model/TileID;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/SourceDataLoadedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getLoaded ()Ljava/lang/Boolean;\n\tpublic final fun getTileID ()Lcom/mapbox/maps/extension/observable/model/TileID;\n\tpublic final fun getType ()Lcom/mapbox/maps/extension/observable/model/SourceDataType;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/SourceRemovedEventData {\n\tpublic fun <init> (JLjava/lang/Long;Ljava/lang/String;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (JLjava/lang/Long;Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/eventdata/SourceRemovedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/SourceRemovedEventData;JLjava/lang/Long;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/SourceRemovedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/StyleDataLoadedEventData {\n\tpublic fun <init> (JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/StyleDataType;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Lcom/mapbox/maps/extension/observable/model/StyleDataType;\n\tpublic final fun copy (JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/StyleDataType;)Lcom/mapbox/maps/extension/observable/eventdata/StyleDataLoadedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/StyleDataLoadedEventData;JLjava/lang/Long;Lcom/mapbox/maps/extension/observable/model/StyleDataType;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/StyleDataLoadedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic final fun getType ()Lcom/mapbox/maps/extension/observable/model/StyleDataType;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/StyleImageMissingEventData {\n\tpublic fun <init> (JLjava/lang/Long;Ljava/lang/String;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (JLjava/lang/Long;Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/eventdata/StyleImageMissingEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/StyleImageMissingEventData;JLjava/lang/Long;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/StyleImageMissingEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/StyleImageUnusedEventData {\n\tpublic fun <init> (JLjava/lang/Long;Ljava/lang/String;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (JLjava/lang/Long;Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/eventdata/StyleImageUnusedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/StyleImageUnusedEventData;JLjava/lang/Long;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/StyleImageUnusedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/eventdata/StyleLoadedEventData {\n\tpublic fun <init> (JLjava/lang/Long;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun copy (JLjava/lang/Long;)Lcom/mapbox/maps/extension/observable/eventdata/StyleLoadedEventData;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/eventdata/StyleLoadedEventData;JLjava/lang/Long;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/eventdata/StyleLoadedEventData;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBegin ()J\n\tpublic final fun getEnd ()Ljava/lang/Long;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/DataSourceType : java/lang/Enum {\n\tpublic static final field ASSET Lcom/mapbox/maps/extension/observable/model/DataSourceType;\n\tpublic static final field DATABASE Lcom/mapbox/maps/extension/observable/model/DataSourceType;\n\tpublic static final field FILE_SYSTEM Lcom/mapbox/maps/extension/observable/model/DataSourceType;\n\tpublic static final field NETWORK Lcom/mapbox/maps/extension/observable/model/DataSourceType;\n\tpublic static final field RESOURCE_LOADER Lcom/mapbox/maps/extension/observable/model/DataSourceType;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/DataSourceType;\n\tpublic static fun values ()[Lcom/mapbox/maps/extension/observable/model/DataSourceType;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/Error {\n\tpublic fun <init> (Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;Ljava/lang/String;)V\n\tpublic final fun component1 ()Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun copy (Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/Error;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/model/Error;Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/model/Error;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic final fun getReason ()Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/MapLoadErrorType : java/lang/Enum {\n\tpublic static final field GLYPHS Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;\n\tpublic static final field SOURCE Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;\n\tpublic static final field SPRITE Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;\n\tpublic static final field STYLE Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;\n\tpublic static final field TILE Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;\n\tpublic static fun values ()[Lcom/mapbox/maps/extension/observable/model/MapLoadErrorType;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/RenderMode : java/lang/Enum {\n\tpublic static final field FULL Lcom/mapbox/maps/extension/observable/model/RenderMode;\n\tpublic static final field PARTIAL Lcom/mapbox/maps/extension/observable/model/RenderMode;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/RenderMode;\n\tpublic static fun values ()[Lcom/mapbox/maps/extension/observable/model/RenderMode;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/Request {\n\tpublic fun <init> (Ljava/util/List;Ljava/lang/String;Lcom/mapbox/maps/extension/observable/model/RequestType;Lcom/mapbox/maps/extension/observable/model/RequestPriority;)V\n\tpublic final fun component1 ()Ljava/util/List;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic final fun component4 ()Lcom/mapbox/maps/extension/observable/model/RequestPriority;\n\tpublic final fun copy (Ljava/util/List;Ljava/lang/String;Lcom/mapbox/maps/extension/observable/model/RequestType;Lcom/mapbox/maps/extension/observable/model/RequestPriority;)Lcom/mapbox/maps/extension/observable/model/Request;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/model/Request;Ljava/util/List;Ljava/lang/String;Lcom/mapbox/maps/extension/observable/model/RequestType;Lcom/mapbox/maps/extension/observable/model/RequestPriority;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/model/Request;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getKind ()Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic final fun getLoadingMethod ()Ljava/util/List;\n\tpublic final fun getPriority ()Lcom/mapbox/maps/extension/observable/model/RequestPriority;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/RequestPriority : java/lang/Enum {\n\tpublic static final field LOW Lcom/mapbox/maps/extension/observable/model/RequestPriority;\n\tpublic static final field REGULAR Lcom/mapbox/maps/extension/observable/model/RequestPriority;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/RequestPriority;\n\tpublic static fun values ()[Lcom/mapbox/maps/extension/observable/model/RequestPriority;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/RequestType : java/lang/Enum {\n\tpublic static final field GLYPHS Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic static final field IMAGE Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic static final field SOURCE Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic static final field SPRITE_IMAGE Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic static final field SPRITE_JSON Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic static final field STYLE Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic static final field TILE Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic static final field UNKNOWN Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/RequestType;\n\tpublic static fun values ()[Lcom/mapbox/maps/extension/observable/model/RequestType;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/Response {\n\tpublic fun <init> (Ljava/lang/String;ZZLjava/lang/String;Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;ZLjava/lang/String;ILcom/mapbox/maps/extension/observable/model/Error;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Z\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;\n\tpublic final fun component6 ()Z\n\tpublic final fun component7 ()Ljava/lang/String;\n\tpublic final fun component8 ()I\n\tpublic final fun component9 ()Lcom/mapbox/maps/extension/observable/model/Error;\n\tpublic final fun copy (Ljava/lang/String;ZZLjava/lang/String;Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;ZLjava/lang/String;ILcom/mapbox/maps/extension/observable/model/Error;)Lcom/mapbox/maps/extension/observable/model/Response;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/model/Response;Ljava/lang/String;ZZLjava/lang/String;Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;ZLjava/lang/String;ILcom/mapbox/maps/extension/observable/model/Error;ILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/model/Response;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getETag ()Ljava/lang/String;\n\tpublic final fun getError ()Lcom/mapbox/maps/extension/observable/model/Error;\n\tpublic final fun getExpires ()Ljava/lang/String;\n\tpublic final fun getModified ()Ljava/lang/String;\n\tpublic final fun getMustRevalidate ()Z\n\tpublic final fun getNoContent ()Z\n\tpublic final fun getNotModified ()Z\n\tpublic final fun getSize ()I\n\tpublic final fun getSource ()Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/ResponseErrorReason : java/lang/Enum {\n\tpublic static final field CONNECTION Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic static final field IN_OFFLINE_MODE Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic static final field NOT_FOUND Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic static final field OTHER Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic static final field RATE_LIMIT Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic static final field SERVER Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic static final field SUCCESS Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n\tpublic static fun values ()[Lcom/mapbox/maps/extension/observable/model/ResponseErrorReason;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/ResponseSourceType : java/lang/Enum {\n\tpublic static final field CACHE Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;\n\tpublic static final field LOCAL_FILE Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;\n\tpublic static final field NETWORK Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;\n\tpublic static final field TILE_STORE Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;\n\tpublic static fun values ()[Lcom/mapbox/maps/extension/observable/model/ResponseSourceType;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/SourceDataType : java/lang/Enum {\n\tpublic static final field METADATA Lcom/mapbox/maps/extension/observable/model/SourceDataType;\n\tpublic static final field TILE Lcom/mapbox/maps/extension/observable/model/SourceDataType;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/SourceDataType;\n\tpublic static fun values ()[Lcom/mapbox/maps/extension/observable/model/SourceDataType;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/StyleDataType : java/lang/Enum {\n\tpublic static final field SOURCES Lcom/mapbox/maps/extension/observable/model/StyleDataType;\n\tpublic static final field SPRITE Lcom/mapbox/maps/extension/observable/model/StyleDataType;\n\tpublic static final field STYLE Lcom/mapbox/maps/extension/observable/model/StyleDataType;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/extension/observable/model/StyleDataType;\n\tpublic static fun values ()[Lcom/mapbox/maps/extension/observable/model/StyleDataType;\n}\n\npublic final class com/mapbox/maps/extension/observable/model/TileID {\n\tpublic fun <init> (JJJ)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()J\n\tpublic final fun copy (JJJ)Lcom/mapbox/maps/extension/observable/model/TileID;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/extension/observable/model/TileID;JJJILjava/lang/Object;)Lcom/mapbox/maps/extension/observable/model/TileID;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getX ()J\n\tpublic final fun getY ()J\n\tpublic final fun getZoom ()J\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract {\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleAtmosphereExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleExtension {\n\tpublic abstract fun getAtmosphere ()Lcom/mapbox/maps/extension/style/StyleContract$StyleAtmosphereExtension;\n\tpublic abstract fun getColorTheme ()Lcom/mapbox/maps/ColorTheme;\n\tpublic abstract fun getDynamicLight ()Lcom/mapbox/maps/extension/style/StyleContract$StyleLightExtension;\n\tpublic abstract fun getFlatLight ()Lcom/mapbox/maps/extension/style/StyleContract$StyleLightExtension;\n\tpublic abstract fun getImages ()Ljava/util/List;\n\tpublic abstract fun getLayers ()Ljava/util/List;\n\tpublic abstract fun getModels ()Ljava/util/List;\n\tpublic abstract fun getProjection ()Lcom/mapbox/maps/extension/style/StyleContract$StyleProjectionExtension;\n\tpublic abstract fun getRain ()Lcom/mapbox/maps/extension/style/StyleContract$StyleRainExtension;\n\tpublic abstract fun getSnow ()Lcom/mapbox/maps/extension/style/StyleContract$StyleSnowExtension;\n\tpublic abstract fun getSources ()Ljava/util/List;\n\tpublic abstract fun getStyle ()Ljava/lang/String;\n\tpublic abstract fun getTerrain ()Lcom/mapbox/maps/extension/style/StyleContract$StyleTerrainExtension;\n\tpublic abstract fun getTransition ()Lcom/mapbox/maps/TransitionOptions;\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleImageExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleLayerExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/LayerPosition;)V\n}\n\npublic final class com/mapbox/maps/extension/style/StyleContract$StyleLayerExtension$DefaultImpls {\n\tpublic static synthetic fun bindTo$default (Lcom/mapbox/maps/extension/style/StyleContract$StyleLayerExtension;Lcom/mapbox/maps/MapboxStyleManager;Lcom/mapbox/maps/LayerPosition;ILjava/lang/Object;)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleLightExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleModelExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleProjectionExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleRainExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleSnowExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleSourceExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract interface class com/mapbox/maps/extension/style/StyleContract$StyleTerrainExtension {\n\tpublic abstract fun bindTo (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic abstract interface class com/mapbox/maps/geofencing/MapGeofencingConsent {\n\tpublic abstract fun getUserConsent ()Z\n\tpublic abstract fun setUserConsent (ZLcom/mapbox/common/geofencing/GeofencingUtilsUserConsentResponseCallback;)V\n\tpublic abstract fun shouldShowConsent ()Z\n}\n\npublic class com/mapbox/maps/interactions/FeatureState {\n\tpublic final fun asJsonString ()Ljava/lang/String;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBooleanState (Ljava/lang/String;)Ljava/lang/Boolean;\n\tpublic final fun getDoubleState (Ljava/lang/String;)Ljava/lang/Double;\n\tpublic fun getInternalState ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun getLongState (Ljava/lang/String;)Ljava/lang/Long;\n\tpublic final fun getStringState (Ljava/lang/String;)Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic class com/mapbox/maps/interactions/FeatureState$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun addBooleanState (Ljava/lang/String;Z)Lcom/mapbox/maps/interactions/FeatureState$Builder;\n\tpublic final fun addDoubleState (Ljava/lang/String;D)Lcom/mapbox/maps/interactions/FeatureState$Builder;\n\tpublic final fun addLongState (Ljava/lang/String;J)Lcom/mapbox/maps/interactions/FeatureState$Builder;\n\tpublic final fun addStringState (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/interactions/FeatureState$Builder;\n\tpublic fun build ()Lcom/mapbox/maps/interactions/FeatureState;\n\tprotected final fun getRawStateMap ()Ljava/util/HashMap;\n}\n\npublic abstract interface class com/mapbox/maps/interactions/FeatureStateCallback {\n\tpublic abstract fun onFeatureState (Lcom/mapbox/maps/interactions/FeatureState;)V\n}\n\npublic class com/mapbox/maps/interactions/FeatureStateKey {\n\tpublic static final field Companion Lcom/mapbox/maps/interactions/FeatureStateKey$Companion;\n\tpublic static final fun create (Ljava/lang/String;)Lcom/mapbox/maps/interactions/FeatureStateKey;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getKey ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n}\n\npublic final class com/mapbox/maps/interactions/FeatureStateKey$Companion {\n\tpublic final fun create (Ljava/lang/String;)Lcom/mapbox/maps/interactions/FeatureStateKey;\n}\n\npublic final class com/mapbox/maps/interactions/FeatureStateKt {\n\tpublic static final synthetic fun FeatureState (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/interactions/FeatureState;\n}\n\npublic class com/mapbox/maps/interactions/FeaturesetFeature {\n\tpublic fun <init> (Lcom/mapbox/maps/FeaturesetFeatureId;Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/geojson/Feature;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDescriptor ()Lcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;\n\tpublic fun getGeometry ()Lcom/mapbox/geojson/Geometry;\n\tpublic final fun getId ()Lcom/mapbox/maps/FeaturesetFeatureId;\n\tpublic final fun getProperties ()Lorg/json/JSONObject;\n\tpublic final fun getState ()Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun hashCode ()I\n}\n\npublic abstract interface class com/mapbox/maps/interactions/QueryRenderedFeaturesetFeaturesCallback {\n\tpublic abstract fun onQueryRenderedFeatures (Ljava/util/List;)V\n}\n\npublic abstract class com/mapbox/maps/interactions/TypedFeaturesetDescriptor {\n\tprotected fun <init> ()V\n\tpublic abstract fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic abstract fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeaturesetFeature;\n\tpublic abstract fun toFeaturesetDescriptor ()Lcom/mapbox/maps/FeaturesetDescriptor;\n}\n\npublic final class com/mapbox/maps/interactions/TypedFeaturesetDescriptor$Featureset : com/mapbox/maps/interactions/TypedFeaturesetDescriptor {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeaturesetFeature;\n\tpublic final fun getFeaturesetId ()Ljava/lang/String;\n\tpublic final fun getImportId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toFeaturesetDescriptor ()Lcom/mapbox/maps/FeaturesetDescriptor;\n}\n\npublic final class com/mapbox/maps/interactions/TypedFeaturesetDescriptor$Layer : com/mapbox/maps/interactions/TypedFeaturesetDescriptor {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeaturesetFeature;\n\tpublic final fun getLayerId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toFeaturesetDescriptor ()Lcom/mapbox/maps/FeaturesetDescriptor;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardBuildings : com/mapbox/maps/interactions/TypedFeaturesetDescriptor {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsState;\n\tpublic synthetic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeaturesetFeature;\n\tpublic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsFeature;\n\tpublic final fun getImportId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toFeaturesetDescriptor ()Lcom/mapbox/maps/FeaturesetDescriptor;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardBuildingsFeature : com/mapbox/maps/interactions/FeaturesetFeature {\n\tpublic fun <init> (Lcom/mapbox/maps/FeaturesetFeatureId;Ljava/lang/String;Lcom/mapbox/geojson/Feature;Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsState;)V\n\tpublic final fun getGroup ()Ljava/lang/String;\n\tpublic final fun getHeight ()Ljava/lang/Double;\n\tpublic final fun getMinHeight ()Ljava/lang/Double;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardBuildingsState : com/mapbox/maps/interactions/FeatureState {\n\tpublic final fun getHighlight ()Ljava/lang/Boolean;\n\tpublic fun getInternalState ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun getSelect ()Ljava/lang/Boolean;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardBuildingsState$Builder : com/mapbox/maps/interactions/FeatureState$Builder {\n\tpublic fun <init> ()V\n\tpublic synthetic fun build ()Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun build ()Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsState;\n\tpublic final fun highlight (Z)Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsState$Builder;\n\tpublic final fun select (Z)Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsState$Builder;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardBuildingsStateKey : com/mapbox/maps/interactions/FeatureStateKey {\n\tpublic static final field Companion Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsStateKey$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardBuildingsStateKey$Companion {\n\tpublic final fun create (Ljava/lang/String;)Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsStateKey;\n\tpublic final fun getHIGHLIGHT ()Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsStateKey;\n\tpublic final fun getSELECT ()Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsStateKey;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardBuildingsStateKt {\n\tpublic static final synthetic fun StandardBuildingsState (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/interactions/standard/generated/StandardBuildingsState;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardInteractions {\n\tpublic static final fun standardBuildings (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardBuildings (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardBuildings (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardBuildings (Lcom/mapbox/maps/ClickInteraction$Companion;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardBuildings (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardBuildings (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardBuildings (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardBuildings (Lcom/mapbox/maps/LongClickInteraction$Companion;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun standardBuildings$default (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun standardBuildings$default (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardLandmarkIcons (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardLandmarkIcons (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardLandmarkIcons (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardLandmarkIcons (Lcom/mapbox/maps/ClickInteraction$Companion;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardLandmarkIcons (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardLandmarkIcons (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardLandmarkIcons (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardLandmarkIcons (Lcom/mapbox/maps/LongClickInteraction$Companion;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun standardLandmarkIcons$default (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun standardLandmarkIcons$default (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPlaceLabels (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPlaceLabels (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPlaceLabels (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPlaceLabels (Lcom/mapbox/maps/ClickInteraction$Companion;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPlaceLabels (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPlaceLabels (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPlaceLabels (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPlaceLabels (Lcom/mapbox/maps/LongClickInteraction$Companion;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun standardPlaceLabels$default (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun standardPlaceLabels$default (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPoi (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPoi (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPoi (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPoi (Lcom/mapbox/maps/ClickInteraction$Companion;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPoi (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPoi (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPoi (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static final fun standardPoi (Lcom/mapbox/maps/LongClickInteraction$Companion;Lkotlin/jvm/functions/Function2;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun standardPoi$default (Lcom/mapbox/maps/ClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n\tpublic static synthetic fun standardPoi$default (Lcom/mapbox/maps/LongClickInteraction$Companion;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Ljava/lang/Double;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/mapbox/maps/MapInteraction;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardLandmarkIcons : com/mapbox/maps/interactions/TypedFeaturesetDescriptor {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsState;\n\tpublic synthetic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeaturesetFeature;\n\tpublic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsFeature;\n\tpublic final fun getImportId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toFeaturesetDescriptor ()Lcom/mapbox/maps/FeaturesetDescriptor;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsFeature : com/mapbox/maps/interactions/FeaturesetFeature {\n\tpublic fun <init> (Lcom/mapbox/maps/FeaturesetFeatureId;Ljava/lang/String;Lcom/mapbox/geojson/Feature;Lcom/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsState;)V\n\tpublic final fun getLandmarkId ()Ljava/lang/String;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getNameEn ()Ljava/lang/String;\n\tpublic final fun getShortName ()Ljava/lang/String;\n\tpublic final fun getShortNameEn ()Ljava/lang/String;\n\tpublic final fun getType ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsState : com/mapbox/maps/interactions/FeatureState {\n\tpublic fun getInternalState ()Lcom/mapbox/bindgen/Value;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsState$Builder : com/mapbox/maps/interactions/FeatureState$Builder {\n\tpublic fun <init> ()V\n\tpublic synthetic fun build ()Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun build ()Lcom/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsState;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsStateKey : com/mapbox/maps/interactions/FeatureStateKey {\n\tpublic static final field Companion Lcom/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsStateKey$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsStateKey$Companion {\n\tpublic final fun create (Ljava/lang/String;)Lcom/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsStateKey;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsStateKt {\n\tpublic static final synthetic fun StandardLandmarkIconsState (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsState;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPlaceLabels : com/mapbox/maps/interactions/TypedFeaturesetDescriptor {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState;\n\tpublic synthetic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeaturesetFeature;\n\tpublic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsFeature;\n\tpublic final fun getImportId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toFeaturesetDescriptor ()Lcom/mapbox/maps/FeaturesetDescriptor;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsFeature : com/mapbox/maps/interactions/FeaturesetFeature {\n\tpublic fun <init> (Lcom/mapbox/maps/FeaturesetFeatureId;Ljava/lang/String;Lcom/mapbox/geojson/Feature;Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState;)V\n\tpublic final fun getClass ()Ljava/lang/String;\n\tpublic synthetic fun getGeometry ()Lcom/mapbox/geojson/Geometry;\n\tpublic fun getGeometry ()Lcom/mapbox/geojson/Point;\n\tpublic final fun getName ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState : com/mapbox/maps/interactions/FeatureState {\n\tpublic final fun getHide ()Ljava/lang/Boolean;\n\tpublic final fun getHighlight ()Ljava/lang/Boolean;\n\tpublic fun getInternalState ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun getSelect ()Ljava/lang/Boolean;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState$Builder : com/mapbox/maps/interactions/FeatureState$Builder {\n\tpublic fun <init> ()V\n\tpublic synthetic fun build ()Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun build ()Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState;\n\tpublic final fun hide (Z)Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState$Builder;\n\tpublic final fun highlight (Z)Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState$Builder;\n\tpublic final fun select (Z)Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState$Builder;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsStateKey : com/mapbox/maps/interactions/FeatureStateKey {\n\tpublic static final field Companion Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsStateKey$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsStateKey$Companion {\n\tpublic final fun create (Ljava/lang/String;)Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsStateKey;\n\tpublic final fun getHIDE ()Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsStateKey;\n\tpublic final fun getHIGHLIGHT ()Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsStateKey;\n\tpublic final fun getSELECT ()Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsStateKey;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsStateKt {\n\tpublic static final synthetic fun StandardPlaceLabelsState (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPoi : com/mapbox/maps/interactions/TypedFeaturesetDescriptor {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun getFeatureState (Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/standard/generated/StandardPoiState;\n\tpublic synthetic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/FeaturesetFeature;\n\tpublic fun getFeaturesetFeature (Lcom/mapbox/geojson/Feature;Ljava/lang/String;Lcom/mapbox/bindgen/Value;)Lcom/mapbox/maps/interactions/standard/generated/StandardPoiFeature;\n\tpublic final fun getImportId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toFeaturesetDescriptor ()Lcom/mapbox/maps/FeaturesetDescriptor;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPoiFeature : com/mapbox/maps/interactions/FeaturesetFeature {\n\tpublic fun <init> (Lcom/mapbox/maps/FeaturesetFeatureId;Ljava/lang/String;Lcom/mapbox/geojson/Feature;Lcom/mapbox/maps/interactions/standard/generated/StandardPoiState;)V\n\tpublic final fun getAirportRef ()Ljava/lang/String;\n\tpublic final fun getClass ()Ljava/lang/String;\n\tpublic synthetic fun getGeometry ()Lcom/mapbox/geojson/Geometry;\n\tpublic fun getGeometry ()Lcom/mapbox/geojson/Point;\n\tpublic final fun getGroup ()Ljava/lang/String;\n\tpublic final fun getMaki ()Ljava/lang/String;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getTransitMode ()Ljava/lang/String;\n\tpublic final fun getTransitNetwork ()Ljava/lang/String;\n\tpublic final fun getTransitStopType ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPoiState : com/mapbox/maps/interactions/FeatureState {\n\tpublic final fun getHide ()Ljava/lang/Boolean;\n\tpublic fun getInternalState ()Lcom/mapbox/bindgen/Value;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPoiState$Builder : com/mapbox/maps/interactions/FeatureState$Builder {\n\tpublic fun <init> ()V\n\tpublic synthetic fun build ()Lcom/mapbox/maps/interactions/FeatureState;\n\tpublic fun build ()Lcom/mapbox/maps/interactions/standard/generated/StandardPoiState;\n\tpublic final fun hide (Z)Lcom/mapbox/maps/interactions/standard/generated/StandardPoiState$Builder;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPoiStateKey : com/mapbox/maps/interactions/FeatureStateKey {\n\tpublic static final field Companion Lcom/mapbox/maps/interactions/standard/generated/StandardPoiStateKey$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPoiStateKey$Companion {\n\tpublic final fun create (Ljava/lang/String;)Lcom/mapbox/maps/interactions/standard/generated/StandardPoiStateKey;\n\tpublic final fun getHIDE ()Lcom/mapbox/maps/interactions/standard/generated/StandardPoiStateKey;\n}\n\npublic final class com/mapbox/maps/interactions/standard/generated/StandardPoiStateKt {\n\tpublic static final synthetic fun StandardPoiState (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/interactions/standard/generated/StandardPoiState;\n}\n\npublic abstract interface class com/mapbox/maps/module/MapTelemetry {\n\tpublic abstract fun disableTelemetrySession ()V\n\tpublic fun getUserTelemetryRequestState ()Z\n\tpublic abstract fun onAppUserTurnstileEvent ()V\n\tpublic abstract fun onPerformanceEvent (Landroid/os/Bundle;)V\n\tpublic abstract fun setUserTelemetryRequestState (Z)V\n}\n\npublic final class com/mapbox/maps/module/TelemetryEvent {\n\tpublic static final field Companion Lcom/mapbox/maps/module/TelemetryEvent$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun increment ()V\n}\n\npublic final class com/mapbox/maps/module/TelemetryEvent$Companion {\n\tpublic final fun create (Ljava/lang/String;)Lcom/mapbox/maps/module/TelemetryEvent;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/ContextBinder {\n\tpublic abstract fun bind (Landroid/content/Context;Landroid/util/AttributeSet;F)V\n}\n\npublic final class com/mapbox/maps/plugin/DistanceUnits : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/DistanceUnits$Companion;\n\tpublic static final field IMPERIAL Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic static final field METRIC Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic static final field NAUTICAL Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getOrdinal ()I\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/DistanceUnits$Companion {\n\tpublic final fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic final fun values ()Ljava/util/List;\n}\n\npublic final class com/mapbox/maps/plugin/DistanceUnits$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/plugin/InvalidPluginConfigurationException : java/lang/Exception {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/LifecyclePlugin {\n\tpublic abstract fun onStart ()V\n\tpublic abstract fun onStop ()V\n}\n\npublic final class com/mapbox/maps/plugin/LifecyclePlugin$DefaultImpls {\n\tpublic static fun onStart (Lcom/mapbox/maps/plugin/LifecyclePlugin;)V\n\tpublic static fun onStop (Lcom/mapbox/maps/plugin/LifecyclePlugin;)V\n}\n\npublic abstract class com/mapbox/maps/plugin/LocationPuck : android/os/Parcelable {\n}\n\npublic final class com/mapbox/maps/plugin/LocationPuck2D : com/mapbox/maps/plugin/LocationPuck {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lcom/mapbox/maps/ImageHolder;)V\n\tpublic fun <init> (Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;)V\n\tpublic fun <init> (Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;)V\n\tpublic fun <init> (Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Ljava/lang/String;)V\n\tpublic fun <init> (Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Ljava/lang/String;F)V\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Ljava/lang/String;FILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun component2 ()Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun component3 ()Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()F\n\tpublic final fun copy (Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Ljava/lang/String;F)Lcom/mapbox/maps/plugin/LocationPuck2D;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/plugin/LocationPuck2D;Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Lcom/mapbox/maps/ImageHolder;Ljava/lang/String;FILjava/lang/Object;)Lcom/mapbox/maps/plugin/LocationPuck2D;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBearingImage ()Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun getOpacity ()F\n\tpublic final fun getScaleExpression ()Ljava/lang/String;\n\tpublic final fun getShadowImage ()Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun getTopImage ()Lcom/mapbox/maps/ImageHolder;\n\tpublic fun hashCode ()I\n\tpublic final fun setBearingImage (Lcom/mapbox/maps/ImageHolder;)V\n\tpublic final fun setOpacity (F)V\n\tpublic final fun setScaleExpression (Ljava/lang/String;)V\n\tpublic final fun setShadowImage (Lcom/mapbox/maps/ImageHolder;)V\n\tpublic final fun setTopImage (Lcom/mapbox/maps/ImageHolder;)V\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/LocationPuck2D$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/LocationPuck2D;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/LocationPuck2D;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic final class com/mapbox/maps/plugin/LocationPuck3D : com/mapbox/maps/plugin/LocationPuck {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;F)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Z)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZ)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;F)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;F)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;FLjava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;FLjava/lang/String;Ljava/util/List;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;FLjava/lang/String;Ljava/util/List;Ljava/util/List;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;FLjava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/plugin/ModelElevationReference;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;FLjava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/plugin/ModelElevationReference;Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;FLjava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/plugin/ModelElevationReference;Ljava/lang/String;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;FLjava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/plugin/ModelElevationReference;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component10 ()Lcom/mapbox/maps/plugin/ModelScaleMode;\n\tpublic final fun component11 ()F\n\tpublic final fun component12 ()Ljava/lang/String;\n\tpublic final fun component13 ()Ljava/lang/String;\n\tpublic final fun component14 ()Ljava/lang/String;\n\tpublic final fun component15 ()I\n\tpublic final fun component16 ()Ljava/lang/String;\n\tpublic final fun component17 ()F\n\tpublic final fun component18 ()Ljava/lang/String;\n\tpublic final fun component19 ()Ljava/util/List;\n\tpublic final fun component2 ()Ljava/util/List;\n\tpublic final fun component20 ()Ljava/util/List;\n\tpublic final fun component21 ()Lcom/mapbox/maps/plugin/ModelElevationReference;\n\tpublic final fun component22 ()Ljava/lang/String;\n\tpublic final fun component23 ()Ljava/lang/String;\n\tpublic final fun component3 ()F\n\tpublic final fun component4 ()Ljava/util/List;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun component6 ()Ljava/util/List;\n\tpublic final fun component7 ()Ljava/util/List;\n\tpublic final fun component8 ()Z\n\tpublic final fun component9 ()Z\n\tpublic final fun copy (Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;FLjava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/plugin/ModelElevationReference;Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/plugin/LocationPuck3D;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/plugin/LocationPuck3D;Ljava/lang/String;Ljava/util/List;FLjava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ZZLcom/mapbox/maps/plugin/ModelScaleMode;FLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;FLjava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/mapbox/maps/plugin/ModelElevationReference;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/LocationPuck3D;\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getMaterialOverrides ()Ljava/util/List;\n\tpublic final fun getModelCastShadows ()Z\n\tpublic final fun getModelColor ()I\n\tpublic final fun getModelColorExpression ()Ljava/lang/String;\n\tpublic final fun getModelColorMixIntensity ()F\n\tpublic final fun getModelColorMixIntensityExpression ()Ljava/lang/String;\n\tpublic final fun getModelColorUseTheme ()Ljava/lang/String;\n\tpublic final fun getModelColorUseThemeExpression ()Ljava/lang/String;\n\tpublic final fun getModelElevationReference ()Lcom/mapbox/maps/plugin/ModelElevationReference;\n\tpublic final fun getModelEmissiveStrength ()F\n\tpublic final fun getModelEmissiveStrengthExpression ()Ljava/lang/String;\n\tpublic final fun getModelOpacity ()F\n\tpublic final fun getModelOpacityExpression ()Ljava/lang/String;\n\tpublic final fun getModelReceiveShadows ()Z\n\tpublic final fun getModelRotation ()Ljava/util/List;\n\tpublic final fun getModelRotationExpression ()Ljava/lang/String;\n\tpublic final fun getModelScale ()Ljava/util/List;\n\tpublic final fun getModelScaleExpression ()Ljava/lang/String;\n\tpublic final fun getModelScaleMode ()Lcom/mapbox/maps/plugin/ModelScaleMode;\n\tpublic final fun getModelTranslation ()Ljava/util/List;\n\tpublic final fun getModelUri ()Ljava/lang/String;\n\tpublic final fun getNodeOverrides ()Ljava/util/List;\n\tpublic final fun getPosition ()Ljava/util/List;\n\tpublic fun hashCode ()I\n\tpublic final fun setMaterialOverrides (Ljava/util/List;)V\n\tpublic final fun setModelCastShadows (Z)V\n\tpublic final fun setModelColor (I)V\n\tpublic final fun setModelColorExpression (Ljava/lang/String;)V\n\tpublic final fun setModelColorMixIntensity (F)V\n\tpublic final fun setModelColorMixIntensityExpression (Ljava/lang/String;)V\n\tpublic final fun setModelColorUseTheme (Ljava/lang/String;)V\n\tpublic final fun setModelColorUseThemeExpression (Ljava/lang/String;)V\n\tpublic final fun setModelElevationReference (Lcom/mapbox/maps/plugin/ModelElevationReference;)V\n\tpublic final fun setModelEmissiveStrength (F)V\n\tpublic final fun setModelEmissiveStrengthExpression (Ljava/lang/String;)V\n\tpublic final fun setModelOpacity (F)V\n\tpublic final fun setModelOpacityExpression (Ljava/lang/String;)V\n\tpublic final fun setModelReceiveShadows (Z)V\n\tpublic final fun setModelRotation (Ljava/util/List;)V\n\tpublic final fun setModelRotationExpression (Ljava/lang/String;)V\n\tpublic final fun setModelScale (Ljava/util/List;)V\n\tpublic final fun setModelScaleExpression (Ljava/lang/String;)V\n\tpublic final fun setModelScaleMode (Lcom/mapbox/maps/plugin/ModelScaleMode;)V\n\tpublic final fun setModelTranslation (Ljava/util/List;)V\n\tpublic final fun setModelUri (Ljava/lang/String;)V\n\tpublic final fun setNodeOverrides (Ljava/util/List;)V\n\tpublic final fun setPosition (Ljava/util/List;)V\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/LocationPuck3D$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/LocationPuck3D;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/LocationPuck3D;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/MapCameraPlugin : com/mapbox/maps/plugin/MapPlugin {\n\tpublic abstract fun onCameraMove (Lcom/mapbox/geojson/Point;DDDLcom/mapbox/maps/EdgeInsets;)V\n}\n\npublic final class com/mapbox/maps/plugin/MapCameraPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/MapCameraPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/MapCameraPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/MapCameraPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/MapPlugin {\n\tpublic abstract fun cleanup ()V\n\tpublic abstract fun initialize ()V\n\tpublic abstract fun onDelegateProvider (Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n}\n\npublic final class com/mapbox/maps/plugin/MapPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/MapPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/MapPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/MapPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/MapSizePlugin {\n\tpublic abstract fun onSizeChanged (II)V\n}\n\npublic final class com/mapbox/maps/plugin/MapSizePlugin$DefaultImpls {\n\tpublic static fun onSizeChanged (Lcom/mapbox/maps/plugin/MapSizePlugin;II)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/MapStyleObserverPlugin {\n\tpublic abstract fun onStyleChanged (Lcom/mapbox/maps/MapboxStyleManager;)V\n}\n\npublic final class com/mapbox/maps/plugin/ModelElevationReference : java/lang/Enum {\n\tpublic static final field GROUND Lcom/mapbox/maps/plugin/ModelElevationReference;\n\tpublic static final field SEA Lcom/mapbox/maps/plugin/ModelElevationReference;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/plugin/ModelElevationReference;\n\tpublic static fun values ()[Lcom/mapbox/maps/plugin/ModelElevationReference;\n}\n\npublic final class com/mapbox/maps/plugin/ModelScaleMode : java/lang/Enum {\n\tpublic static final field MAP Lcom/mapbox/maps/plugin/ModelScaleMode;\n\tpublic static final field VIEWPORT Lcom/mapbox/maps/plugin/ModelScaleMode;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/plugin/ModelScaleMode;\n\tpublic static fun values ()[Lcom/mapbox/maps/plugin/ModelScaleMode;\n}\n\npublic abstract class com/mapbox/maps/plugin/Plugin {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/Plugin$Companion;\n\tpublic static final field MAPBOX_ANNOTATION_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_ATTRIBUTION_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_CAMERA_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_COMPASS_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_GESTURES_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_INDOOR_SELECTOR_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_LIFECYCLE_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_LOCATION_COMPONENT_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_LOGO_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_MAP_OVERLAY_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_SCALEBAR_PLUGIN_ID Ljava/lang/String;\n\tpublic static final field MAPBOX_VIEWPORT_PLUGIN_ID Ljava/lang/String;\n\tpublic synthetic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/plugin/MapPlugin;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getInstance ()Lcom/mapbox/maps/plugin/MapPlugin;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/Plugin$Companion {\n}\n\npublic final class com/mapbox/maps/plugin/Plugin$Custom : com/mapbox/maps/plugin/Plugin {\n\tpublic fun <init> (Ljava/lang/String;Lcom/mapbox/maps/plugin/MapPlugin;)V\n}\n\npublic final class com/mapbox/maps/plugin/Plugin$Mapbox : com/mapbox/maps/plugin/Plugin {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/plugin/PuckBearing : java/lang/Enum {\n\tpublic static final field COURSE Lcom/mapbox/maps/plugin/PuckBearing;\n\tpublic static final field HEADING Lcom/mapbox/maps/plugin/PuckBearing;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/plugin/PuckBearing;\n\tpublic static fun values ()[Lcom/mapbox/maps/plugin/PuckBearing;\n}\n\npublic final class com/mapbox/maps/plugin/ScrollMode : java/lang/Enum {\n\tpublic static final field HORIZONTAL Lcom/mapbox/maps/plugin/ScrollMode;\n\tpublic static final field HORIZONTAL_AND_VERTICAL Lcom/mapbox/maps/plugin/ScrollMode;\n\tpublic static final field VERTICAL Lcom/mapbox/maps/plugin/ScrollMode;\n\tpublic final fun getValue ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/plugin/ScrollMode;\n\tpublic static fun values ()[Lcom/mapbox/maps/plugin/ScrollMode;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/ViewPlugin : com/mapbox/maps/plugin/MapPlugin {\n\tpublic abstract fun bind (Landroid/widget/FrameLayout;Landroid/util/AttributeSet;F)Landroid/view/View;\n\tpublic abstract fun onPluginView (Landroid/view/View;)V\n}\n\npublic final class com/mapbox/maps/plugin/ViewPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/ViewPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/ViewPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/ViewPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onPluginView (Lcom/mapbox/maps/plugin/ViewPlugin;Landroid/view/View;)V\n}\n\npublic final class com/mapbox/maps/plugin/ViewPlugin$Initializer {\n\tpublic fun <init> (Ljava/lang/ref/WeakReference;Landroid/content/res/TypedArray;F)V\n\tpublic final fun component1 ()Ljava/lang/ref/WeakReference;\n\tpublic final fun component2 ()Landroid/content/res/TypedArray;\n\tpublic final fun component3 ()F\n\tpublic final fun copy (Ljava/lang/ref/WeakReference;Landroid/content/res/TypedArray;F)Lcom/mapbox/maps/plugin/ViewPlugin$Initializer;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/plugin/ViewPlugin$Initializer;Ljava/lang/ref/WeakReference;Landroid/content/res/TypedArray;FILjava/lang/Object;)Lcom/mapbox/maps/plugin/ViewPlugin$Initializer;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAttributes ()Landroid/content/res/TypedArray;\n\tpublic final fun getContext ()Ljava/lang/ref/WeakReference;\n\tpublic final fun getPixelRatio ()F\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/animation/CameraAnimationsLifecycleListener {\n\tpublic abstract fun onAnimatorCancelling (Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;Landroid/animation/ValueAnimator;Ljava/lang/String;)V\n\tpublic abstract fun onAnimatorEnding (Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;Landroid/animation/ValueAnimator;Ljava/lang/String;)V\n\tpublic abstract fun onAnimatorInterrupting (Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;Landroid/animation/ValueAnimator;Ljava/lang/String;Landroid/animation/ValueAnimator;Ljava/lang/String;)V\n\tpublic abstract fun onAnimatorStarting (Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;Landroid/animation/ValueAnimator;Ljava/lang/String;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/animation/CameraAnimationsPlugin : com/mapbox/maps/plugin/MapPlugin {\n\tpublic abstract fun addCameraAnchorChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorNullableChangeListener;)V\n\tpublic abstract fun addCameraAnimationsLifecycleListener (Lcom/mapbox/maps/plugin/animation/CameraAnimationsLifecycleListener;)V\n\tpublic abstract fun addCameraBearingChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun addCameraCenterChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun addCameraPaddingChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun addCameraPitchChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun addCameraZoomChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun calculateScaleBy (DD)D\n\tpublic abstract fun cancelAllAnimators (Ljava/util/List;)V\n\tpublic abstract fun createAnchorAnimator (Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;)Landroid/animation/ValueAnimator;\n\tpublic abstract fun createBearingAnimator (Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;ZLkotlin/jvm/functions/Function1;)Landroid/animation/ValueAnimator;\n\tpublic abstract fun createCenterAnimator (Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;)Landroid/animation/ValueAnimator;\n\tpublic abstract fun createCenterAnimator (Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;ZLkotlin/jvm/functions/Function1;)Landroid/animation/ValueAnimator;\n\tpublic abstract fun createPaddingAnimator (Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;)Landroid/animation/ValueAnimator;\n\tpublic abstract fun createPitchAnimator (Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;)Landroid/animation/ValueAnimator;\n\tpublic abstract fun createZoomAnimator (Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;)Landroid/animation/ValueAnimator;\n\tpublic abstract fun easeTo (Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun flyTo (Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun getAnchor ()Lcom/mapbox/maps/ScreenCoordinate;\n\tpublic abstract fun getDebugMode ()Z\n\tpublic abstract fun moveBy (Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun pitchBy (DLcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun playAnimatorsSequentially ([Landroid/animation/ValueAnimator;)V\n\tpublic abstract fun playAnimatorsTogether ([Landroid/animation/ValueAnimator;)V\n\tpublic abstract fun registerAnimators ([Landroid/animation/ValueAnimator;)V\n\tpublic abstract fun removeCameraAnchorChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorNullableChangeListener;)V\n\tpublic abstract fun removeCameraAnimationsLifecycleListener (Lcom/mapbox/maps/plugin/animation/CameraAnimationsLifecycleListener;)V\n\tpublic abstract fun removeCameraBearingChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun removeCameraCenterChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun removeCameraPaddingChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun removeCameraPitchChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun removeCameraZoomChangeListener (Lcom/mapbox/maps/plugin/animation/CameraAnimatorChangeListener;)V\n\tpublic abstract fun rotateBy (Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun scaleBy (DLcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun setAnchor (Lcom/mapbox/maps/ScreenCoordinate;)V\n\tpublic abstract fun setDebugMode (Z)V\n\tpublic abstract fun unregisterAnimators ([Landroid/animation/ValueAnimator;Z)V\n}\n\npublic final class com/mapbox/maps/plugin/animation/CameraAnimationsPlugin$DefaultImpls {\n\tpublic static synthetic fun cancelAllAnimators$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Ljava/util/List;ILjava/lang/Object;)V\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;)V\n\tpublic static synthetic fun createAnchorAnimator$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroid/animation/ValueAnimator;\n\tpublic static synthetic fun createBearingAnimator$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroid/animation/ValueAnimator;\n\tpublic static fun createCenterAnimator (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;)Landroid/animation/ValueAnimator;\n\tpublic static synthetic fun createCenterAnimator$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroid/animation/ValueAnimator;\n\tpublic static synthetic fun createCenterAnimator$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroid/animation/ValueAnimator;\n\tpublic static synthetic fun createPaddingAnimator$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroid/animation/ValueAnimator;\n\tpublic static synthetic fun createPitchAnimator$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroid/animation/ValueAnimator;\n\tpublic static synthetic fun createZoomAnimator$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroid/animation/ValueAnimator;\n\tpublic static synthetic fun easeTo$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun flyTo$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;)V\n\tpublic static synthetic fun moveBy$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static synthetic fun pitchBy$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;DLcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun rotateBy$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun scaleBy$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;DLcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;Landroid/animation/Animator$AnimatorListener;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun unregisterAnimators$default (Lcom/mapbox/maps/plugin/animation/CameraAnimationsPlugin;[Landroid/animation/ValueAnimator;ZILjava/lang/Object;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/animation/CameraAnimatorChangeListener {\n\tpublic abstract fun onChanged (Ljava/lang/Object;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/animation/CameraAnimatorNullableChangeListener {\n\tpublic abstract fun onChanged (Ljava/lang/Object;)V\n}\n\npublic final class com/mapbox/maps/plugin/animation/CameraAnimatorOptions {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions$Companion;\n\tpublic synthetic fun <init> ([Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getOwner ()Ljava/lang/String;\n\tpublic final fun getStartValue ()Ljava/lang/Object;\n\tpublic final fun getTargets ()[Ljava/lang/Object;\n\tpublic fun hashCode ()I\n}\n\npublic final class com/mapbox/maps/plugin/animation/CameraAnimatorOptions$Builder {\n\tpublic fun <init> ([Ljava/lang/Object;)V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;\n\tpublic final fun getTargets ()[Ljava/lang/Object;\n\tpublic final fun owner (Ljava/lang/String;)Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions$Builder;\n\tpublic final fun startValue (Ljava/lang/Object;)Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions$Builder;\n}\n\npublic final class com/mapbox/maps/plugin/animation/CameraAnimatorOptions$Companion {\n\tpublic final fun cameraAnimatorOptions ([Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;\n\tpublic static synthetic fun cameraAnimatorOptions$default (Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions$Companion;[Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/animation/CameraAnimatorOptions;\n}\n\npublic final class com/mapbox/maps/plugin/animation/CameraAnimatorType : java/lang/Enum {\n\tpublic static final field ANCHOR Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;\n\tpublic static final field BEARING Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;\n\tpublic static final field CENTER Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;\n\tpublic static final field PADDING Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;\n\tpublic static final field PITCH Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;\n\tpublic static final field ZOOM Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;\n\tpublic static fun values ()[Lcom/mapbox/maps/plugin/animation/CameraAnimatorType;\n}\n\npublic final class com/mapbox/maps/plugin/animation/MapAnimationOptions {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/animation/MapAnimationOptions$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Landroid/animation/TimeInterpolator;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDuration ()Ljava/lang/Long;\n\tpublic final fun getInterpolator ()Landroid/animation/TimeInterpolator;\n\tpublic final fun getOwner ()Ljava/lang/String;\n\tpublic final fun getStartDelay ()Ljava/lang/Long;\n\tpublic fun hashCode ()I\n}\n\npublic final class com/mapbox/maps/plugin/animation/MapAnimationOptions$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;\n\tpublic final fun duration (J)Lcom/mapbox/maps/plugin/animation/MapAnimationOptions$Builder;\n\tpublic final fun interpolator (Landroid/animation/TimeInterpolator;)Lcom/mapbox/maps/plugin/animation/MapAnimationOptions$Builder;\n\tpublic final fun owner (Ljava/lang/String;)Lcom/mapbox/maps/plugin/animation/MapAnimationOptions$Builder;\n\tpublic final fun startDelay (J)Lcom/mapbox/maps/plugin/animation/MapAnimationOptions$Builder;\n}\n\npublic final class com/mapbox/maps/plugin/animation/MapAnimationOptions$Companion {\n\tpublic final fun mapAnimationOptions (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/plugin/animation/MapAnimationOptions;\n}\n\npublic final class com/mapbox/maps/plugin/animation/MapAnimationOwnerRegistry {\n\tpublic static final field COMPASS Ljava/lang/String;\n\tpublic static final field GESTURES Ljava/lang/String;\n\tpublic static final field INSTANCE Lcom/mapbox/maps/plugin/animation/MapAnimationOwnerRegistry;\n\tpublic static final field INTERNAL Ljava/lang/String;\n\tpublic static final field LOCATION Ljava/lang/String;\n}\n\npublic abstract class com/mapbox/maps/plugin/annotation/Annotation {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/annotation/Annotation$Companion;\n\tpublic static final field ID_DATA Ljava/lang/String;\n\tpublic static final field MAX_MERCATOR_LATITUDE D\n\tpublic static final field MIN_MERCATOR_LATITUDE D\n\tpublic fun <init> (Ljava/lang/String;Lcom/google/gson/JsonObject;Lcom/mapbox/geojson/Geometry;)V\n\tpublic fun getData ()Lcom/google/gson/JsonElement;\n\tpublic final fun getGeometry ()Lcom/mapbox/geojson/Geometry;\n\tpublic final fun getId ()Ljava/lang/String;\n\tprotected final fun getJsonObject ()Lcom/google/gson/JsonObject;\n\tpublic final fun getJsonObjectCopy ()Lcom/google/gson/JsonObject;\n\tpublic abstract fun getOffsetGeometry (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/android/gestures/MoveDistancesObject;)Lcom/mapbox/geojson/Geometry;\n\tpublic abstract fun getType ()Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic final fun isDraggable ()Z\n\tpublic final fun isSelected ()Z\n\tpublic fun setData (Lcom/google/gson/JsonElement;)V\n\tpublic final fun setDraggable (Z)V\n\tpublic final fun setGeometry (Lcom/mapbox/geojson/Geometry;)V\n\tpublic final fun setSelected (Z)V\n\tpublic abstract fun setUsedDataDrivenProperties ()V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/Annotation$Companion {\n}\n\npublic final class com/mapbox/maps/plugin/annotation/AnnotationConfig {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAnnotationSourceOptions ()Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;\n\tpublic final fun getBelowLayerId ()Ljava/lang/String;\n\tpublic final fun getLayerId ()Ljava/lang/String;\n\tpublic final fun getSlotName ()Ljava/lang/String;\n\tpublic final fun getSourceId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/AnnotationManager {\n\tpublic abstract fun addClickListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationClickListener;)Z\n\tpublic abstract fun addDragListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationDragListener;)Z\n\tpublic abstract fun addInteractionListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener;)Z\n\tpublic abstract fun addLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener;)Z\n\tpublic abstract fun create (Lcom/mapbox/maps/plugin/annotation/AnnotationOptions;)Lcom/mapbox/maps/plugin/annotation/Annotation;\n\tpublic abstract fun create (Ljava/util/List;)Ljava/util/List;\n\tpublic abstract fun delete (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n\tpublic abstract fun delete (Ljava/util/List;)V\n\tpublic abstract fun deleteAll ()V\n\tpublic abstract fun enableDataDrivenProperty (Ljava/lang/String;)V\n\tpublic abstract fun getAnnotations ()Ljava/util/List;\n\tpublic abstract fun getClickListeners ()Ljava/util/List;\n\tpublic abstract fun getDelegateProvider ()Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;\n\tpublic abstract fun getDragListeners ()Ljava/util/List;\n\tpublic abstract fun getInteractionListener ()Ljava/util/List;\n\tpublic abstract fun getLongClickListeners ()Ljava/util/List;\n\tpublic abstract fun onDestroy ()V\n\tpublic abstract fun onSizeChanged (II)V\n\tpublic abstract fun removeClickListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationClickListener;)Z\n\tpublic abstract fun removeDragListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationDragListener;)Z\n\tpublic abstract fun removeInteractionListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener;)Z\n\tpublic abstract fun removeLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener;)Z\n\tpublic abstract fun selectAnnotation (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n\tpublic abstract fun update (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n\tpublic abstract fun update (Ljava/util/List;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/AnnotationManager$DefaultImpls {\n\tpublic static fun addClickListener (Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnAnnotationClickListener;)Z\n\tpublic static fun addDragListener (Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnAnnotationDragListener;)Z\n\tpublic static fun addInteractionListener (Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener;)Z\n\tpublic static fun addLongClickListener (Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener;)Z\n\tpublic static fun removeClickListener (Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnAnnotationClickListener;)Z\n\tpublic static fun removeDragListener (Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnAnnotationDragListener;)Z\n\tpublic static fun removeInteractionListener (Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener;)Z\n\tpublic static fun removeLongClickListener (Lcom/mapbox/maps/plugin/annotation/AnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener;)Z\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/AnnotationOptions {\n\tpublic abstract fun build (Ljava/lang/String;Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)Lcom/mapbox/maps/plugin/annotation/Annotation;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/AnnotationPlugin : com/mapbox/maps/plugin/MapPlugin, com/mapbox/maps/plugin/MapSizePlugin, com/mapbox/maps/plugin/MapStyleObserverPlugin {\n\tpublic abstract fun createAnnotationManager (Lcom/mapbox/maps/plugin/annotation/AnnotationType;Lcom/mapbox/maps/plugin/annotation/AnnotationConfig;)Lcom/mapbox/maps/plugin/annotation/AnnotationManager;\n\tpublic abstract fun removeAnnotationManager (Lcom/mapbox/maps/plugin/annotation/AnnotationManager;)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/AnnotationPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onSizeChanged (Lcom/mapbox/maps/plugin/annotation/AnnotationPlugin;II)V\n}\n\npublic final class com/mapbox/maps/plugin/annotation/AnnotationSourceOptions {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/Long;)V\n\tpublic fun <init> (Ljava/lang/Long;Ljava/lang/Long;)V\n\tpublic fun <init> (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;)V\n\tpublic fun <init> (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Double;)V\n\tpublic fun <init> (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Double;Lcom/mapbox/maps/plugin/annotation/ClusterOptions;)V\n\tpublic synthetic fun <init> (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Double;Lcom/mapbox/maps/plugin/annotation/ClusterOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Ljava/lang/Long;\n\tpublic final fun component2 ()Ljava/lang/Long;\n\tpublic final fun component3 ()Ljava/lang/Boolean;\n\tpublic final fun component4 ()Ljava/lang/Double;\n\tpublic final fun component5 ()Lcom/mapbox/maps/plugin/annotation/ClusterOptions;\n\tpublic final fun copy (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Double;Lcom/mapbox/maps/plugin/annotation/ClusterOptions;)Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Double;Lcom/mapbox/maps/plugin/annotation/ClusterOptions;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/annotation/AnnotationSourceOptions;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBuffer ()Ljava/lang/Long;\n\tpublic final fun getClusterOptions ()Lcom/mapbox/maps/plugin/annotation/ClusterOptions;\n\tpublic final fun getLineMetrics ()Ljava/lang/Boolean;\n\tpublic final fun getMaxZoom ()Ljava/lang/Long;\n\tpublic final fun getTolerance ()Ljava/lang/Double;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/annotation/AnnotationType : java/lang/Enum {\n\tpublic static final field CircleAnnotation Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic static final field PointAnnotation Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic static final field PolygonAnnotation Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic static final field PolylineAnnotation Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic final fun getValue ()I\n\tpublic final fun setValue (I)V\n\tpublic static fun valueOf (Ljava/lang/String;)Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n\tpublic static fun values ()[Lcom/mapbox/maps/plugin/annotation/AnnotationType;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/ClusterAnnotationManager {\n\tpublic abstract fun addClusterClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterClickListener;)Z\n\tpublic abstract fun addClusterLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterLongClickListener;)Z\n\tpublic abstract fun getClusterClickListeners ()Ljava/util/List;\n\tpublic abstract fun getClusterLongClickListeners ()Ljava/util/List;\n\tpublic abstract fun removeClusterClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterClickListener;)Z\n\tpublic abstract fun removeClusterLongClickListener (Lcom/mapbox/maps/plugin/annotation/OnClusterLongClickListener;)Z\n}\n\npublic final class com/mapbox/maps/plugin/annotation/ClusterAnnotationManager$DefaultImpls {\n\tpublic static fun addClusterClickListener (Lcom/mapbox/maps/plugin/annotation/ClusterAnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnClusterClickListener;)Z\n\tpublic static fun addClusterLongClickListener (Lcom/mapbox/maps/plugin/annotation/ClusterAnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnClusterLongClickListener;)Z\n\tpublic static fun removeClusterClickListener (Lcom/mapbox/maps/plugin/annotation/ClusterAnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnClusterClickListener;)Z\n\tpublic static fun removeClusterLongClickListener (Lcom/mapbox/maps/plugin/annotation/ClusterAnnotationManager;Lcom/mapbox/maps/plugin/annotation/OnClusterLongClickListener;)Z\n}\n\npublic final class com/mapbox/maps/plugin/annotation/ClusterFeature {\n\tpublic fun <init> (Lcom/mapbox/maps/interactions/FeaturesetFeature;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getClusterId ()Ljava/lang/String;\n\tpublic final fun getOriginalFeature ()Lcom/mapbox/geojson/Feature;\n\tpublic final fun getPointCount ()J\n\tpublic final fun getPointCountAbbreviated ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n}\n\npublic final class com/mapbox/maps/plugin/annotation/ClusterOptions {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Z)V\n\tpublic fun <init> (ZJ)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;D)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;I)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;D)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;J)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;JJ)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;JJLjava/util/List;)V\n\tpublic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;JJLjava/util/List;Ljava/util/HashMap;)V\n\tpublic synthetic fun <init> (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;JJLjava/util/List;Ljava/util/HashMap;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Z\n\tpublic final fun component10 ()J\n\tpublic final fun component11 ()J\n\tpublic final fun component12 ()Ljava/util/List;\n\tpublic final fun component13 ()Ljava/util/HashMap;\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun component4 ()D\n\tpublic final fun component5 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun component6 ()I\n\tpublic final fun component7 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun component8 ()D\n\tpublic final fun component9 ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun copy (ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;JJLjava/util/List;Ljava/util/HashMap;)Lcom/mapbox/maps/plugin/annotation/ClusterOptions;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/plugin/annotation/ClusterOptions;ZJLcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;ILcom/mapbox/bindgen/Value;DLcom/mapbox/bindgen/Value;JJLjava/util/List;Ljava/util/HashMap;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/annotation/ClusterOptions;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCircleRadius ()D\n\tpublic final fun getCircleRadiusExpression ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun getCluster ()Z\n\tpublic final fun getClusterMaxZoom ()J\n\tpublic final fun getClusterMinPoints ()J\n\tpublic final fun getClusterProperties ()Ljava/util/HashMap;\n\tpublic final fun getClusterRadius ()J\n\tpublic final fun getColorLevels ()Ljava/util/List;\n\tpublic final fun getTextColor ()I\n\tpublic final fun getTextColorExpression ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun getTextField ()Lcom/mapbox/bindgen/Value;\n\tpublic final fun getTextSize ()D\n\tpublic final fun getTextSizeExpression ()Lcom/mapbox/bindgen/Value;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/OnAnnotationClickListener {\n\tpublic abstract fun onAnnotationClick (Lcom/mapbox/maps/plugin/annotation/Annotation;)Z\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/OnAnnotationDragListener {\n\tpublic abstract fun onAnnotationDrag (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n\tpublic abstract fun onAnnotationDragFinished (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n\tpublic abstract fun onAnnotationDragStarted (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener {\n\tpublic abstract fun onDeselectAnnotation (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n\tpublic abstract fun onSelectAnnotation (Lcom/mapbox/maps/plugin/annotation/Annotation;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener {\n\tpublic abstract fun onAnnotationLongClick (Lcom/mapbox/maps/plugin/annotation/Annotation;)Z\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/OnClusterClickListener {\n\tpublic abstract fun onClusterClick (Lcom/mapbox/maps/plugin/annotation/ClusterFeature;)Z\n}\n\npublic abstract interface class com/mapbox/maps/plugin/annotation/OnClusterLongClickListener {\n\tpublic abstract fun onClusterLongClick (Lcom/mapbox/maps/plugin/annotation/ClusterFeature;)Z\n}\n\npublic final class com/mapbox/maps/plugin/attribution/Attribution {\n\tpublic static final field ABOUT_MAPS_URL Ljava/lang/String;\n\tpublic static final field ABOUT_TELEMETRY_URL Ljava/lang/String;\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/attribution/Attribution$Companion;\n\tpublic static final field GEOFENCING Ljava/lang/String;\n\tpublic static final field GEOFENCING_URL_MARKER Ljava/lang/String;\n\tpublic static final field OSM Ljava/lang/String;\n\tpublic static final field OSM_ABBR Ljava/lang/String;\n\tpublic static final field PRIVACY_POLICY Ljava/lang/String;\n\tpublic static final field PRIVACY_POLICY_URL Ljava/lang/String;\n\tpublic static final field TELEMETRY_SETTINGS Ljava/lang/String;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/mapbox/maps/plugin/attribution/Attribution;\n\tpublic static synthetic fun copy$default (Lcom/mapbox/maps/plugin/attribution/Attribution;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/attribution/Attribution;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getTitle ()Ljava/lang/String;\n\tpublic final fun getTitleAbbreviated ()Ljava/lang/String;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/attribution/Attribution$Companion {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/attribution/AttributionDialogManager {\n\tpublic abstract fun onStop ()V\n\tpublic abstract fun showAttribution (Lcom/mapbox/maps/plugin/delegates/MapAttributionDelegate;)V\n}\n\npublic final class com/mapbox/maps/plugin/attribution/AttributionKt {\n\tpublic static final fun isMapboxFeedback (Lcom/mapbox/maps/plugin/attribution/Attribution;)Z\n}\n\npublic final class com/mapbox/maps/plugin/attribution/AttributionParserConfig {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Z)V\n\tpublic fun <init> (ZZ)V\n\tpublic fun <init> (ZZZ)V\n\tpublic fun <init> (ZZZZ)V\n\tpublic fun <init> (ZZZZZ)V\n\tpublic fun <init> (ZZZZZZ)V\n\tpublic synthetic fun <init> (ZZZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getWithCopyrightSign ()Z\n\tpublic final fun getWithImproveMap ()Z\n\tpublic final fun getWithMapboxAttribution ()Z\n\tpublic final fun getWithMapboxGeofencingConsent ()Z\n\tpublic final fun getWithMapboxPrivacyPolicy ()Z\n\tpublic final fun getWithTelemetryAttribution ()Z\n\tpublic final fun setWithCopyrightSign (Z)V\n\tpublic final fun setWithImproveMap (Z)V\n\tpublic final fun setWithMapboxAttribution (Z)V\n\tpublic final fun setWithMapboxGeofencingConsent (Z)V\n\tpublic final fun setWithMapboxPrivacyPolicy (Z)V\n\tpublic final fun setWithTelemetryAttribution (Z)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/attribution/AttributionPlugin : com/mapbox/maps/plugin/LifecyclePlugin, com/mapbox/maps/plugin/ViewPlugin, com/mapbox/maps/plugin/attribution/generated/AttributionSettingsInterface {\n\tpublic abstract fun getMapAttributionDelegate ()Lcom/mapbox/maps/plugin/delegates/MapAttributionDelegate;\n\tpublic abstract fun setContentDescription (Ljava/lang/CharSequence;)V\n\tpublic abstract fun setCustomAttributionDialogManager (Lcom/mapbox/maps/plugin/attribution/AttributionDialogManager;)V\n}\n\npublic final class com/mapbox/maps/plugin/attribution/AttributionPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/attribution/AttributionPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/attribution/AttributionPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/attribution/AttributionPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onPluginView (Lcom/mapbox/maps/plugin/attribution/AttributionPlugin;Landroid/view/View;)V\n\tpublic static fun onStart (Lcom/mapbox/maps/plugin/attribution/AttributionPlugin;)V\n\tpublic static fun onStop (Lcom/mapbox/maps/plugin/attribution/AttributionPlugin;)V\n\tpublic static fun setContentDescription (Lcom/mapbox/maps/plugin/attribution/AttributionPlugin;Ljava/lang/CharSequence;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/attribution/AttributionView {\n\tpublic abstract fun requestLayout ()V\n\tpublic abstract fun setAttributionMargins (IIII)V\n\tpublic abstract fun setContentDescription (Ljava/lang/CharSequence;)V\n\tpublic abstract fun setEnable (Z)V\n\tpublic abstract fun setGravity (I)V\n\tpublic abstract fun setIconColor (I)V\n\tpublic abstract fun setViewOnClickListener (Landroid/view/View$OnClickListener;)V\n}\n\npublic final class com/mapbox/maps/plugin/attribution/AttributionView$DefaultImpls {\n\tpublic static fun setContentDescription (Lcom/mapbox/maps/plugin/attribution/AttributionView;Ljava/lang/CharSequence;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/attribution/OnAttributionClickListener {\n\tpublic abstract fun onAttributionClick ()V\n}\n\npublic final class com/mapbox/maps/plugin/attribution/generated/AttributionSettings : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic synthetic fun <init> (ZIIFFFFZLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getClickable ()Z\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getIconColor ()I\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getPosition ()I\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings;\n\tpublic final fun getClickable ()Z\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getIconColor ()I\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getPosition ()I\n\tpublic final fun setClickable (Z)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder;\n\tpublic final synthetic fun setClickable (Z)V\n\tpublic final fun setEnabled (Z)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder;\n\tpublic final synthetic fun setEnabled (Z)V\n\tpublic final fun setIconColor (I)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder;\n\tpublic final synthetic fun setIconColor (I)V\n\tpublic final fun setMarginBottom (F)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder;\n\tpublic final synthetic fun setMarginBottom (F)V\n\tpublic final fun setMarginLeft (F)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder;\n\tpublic final synthetic fun setMarginLeft (F)V\n\tpublic final fun setMarginRight (F)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder;\n\tpublic final synthetic fun setMarginRight (F)V\n\tpublic final fun setMarginTop (F)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder;\n\tpublic final synthetic fun setMarginTop (F)V\n\tpublic final fun setPosition (I)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings$Builder;\n\tpublic final synthetic fun setPosition (I)V\n}\n\npublic final class com/mapbox/maps/plugin/attribution/generated/AttributionSettings$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract class com/mapbox/maps/plugin/attribution/generated/AttributionSettingsBase : com/mapbox/maps/plugin/attribution/generated/AttributionSettingsInterface {\n\tpublic fun <init> ()V\n\tprotected abstract fun applySettings ()V\n\tpublic fun getClickable ()Z\n\tpublic fun getEnabled ()Z\n\tpublic fun getIconColor ()I\n\tprotected abstract fun getInternalSettings ()Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings;\n\tpublic fun getMarginBottom ()F\n\tpublic fun getMarginLeft ()F\n\tpublic fun getMarginRight ()F\n\tpublic fun getMarginTop ()F\n\tpublic fun getPosition ()I\n\tpublic fun getSettings ()Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings;\n\tpublic fun setClickable (Z)V\n\tpublic fun setEnabled (Z)V\n\tpublic fun setIconColor (I)V\n\tprotected abstract fun setInternalSettings (Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings;)V\n\tpublic fun setMarginBottom (F)V\n\tpublic fun setMarginLeft (F)V\n\tpublic fun setMarginRight (F)V\n\tpublic fun setMarginTop (F)V\n\tpublic fun setPosition (I)V\n\tpublic fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/attribution/generated/AttributionSettingsData$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettingsData;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettingsData;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/attribution/generated/AttributionSettingsInterface {\n\tpublic abstract fun getClickable ()Z\n\tpublic abstract fun getEnabled ()Z\n\tpublic abstract fun getIconColor ()I\n\tpublic abstract fun getMarginBottom ()F\n\tpublic abstract fun getMarginLeft ()F\n\tpublic abstract fun getMarginRight ()F\n\tpublic abstract fun getMarginTop ()F\n\tpublic abstract fun getPosition ()I\n\tpublic abstract fun getSettings ()Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings;\n\tpublic abstract fun setClickable (Z)V\n\tpublic abstract fun setEnabled (Z)V\n\tpublic abstract fun setIconColor (I)V\n\tpublic abstract fun setMarginBottom (F)V\n\tpublic abstract fun setMarginLeft (F)V\n\tpublic abstract fun setMarginRight (F)V\n\tpublic abstract fun setMarginTop (F)V\n\tpublic abstract fun setPosition (I)V\n\tpublic abstract fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/attribution/generated/AttributionSettingsKt {\n\tpublic static final synthetic fun AttributionSettings (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/plugin/attribution/generated/AttributionSettings;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/compass/CompassPlugin : com/mapbox/maps/plugin/LifecyclePlugin, com/mapbox/maps/plugin/MapCameraPlugin, com/mapbox/maps/plugin/ViewPlugin, com/mapbox/maps/plugin/compass/generated/CompassSettingsInterface {\n\tpublic abstract fun addCompassClickListener (Lcom/mapbox/maps/plugin/compass/OnCompassClickListener;)V\n\tpublic abstract fun onCompassClicked ()V\n\tpublic abstract fun removeCompassClickListener (Lcom/mapbox/maps/plugin/compass/OnCompassClickListener;)V\n}\n\npublic final class com/mapbox/maps/plugin/compass/CompassPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/compass/CompassPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/compass/CompassPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/compass/CompassPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onPluginView (Lcom/mapbox/maps/plugin/compass/CompassPlugin;Landroid/view/View;)V\n\tpublic static fun onStart (Lcom/mapbox/maps/plugin/compass/CompassPlugin;)V\n\tpublic static fun onStop (Lcom/mapbox/maps/plugin/compass/CompassPlugin;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/compass/CompassView {\n\tpublic abstract fun getCompassGravity ()I\n\tpublic abstract fun getCompassImage ()Landroid/graphics/drawable/Drawable;\n\tpublic abstract fun getCompassRotation ()F\n\tpublic abstract fun isCompassEnabled ()Z\n\tpublic abstract fun isCompassVisible ()Z\n\tpublic abstract fun requestLayout ()V\n\tpublic abstract fun setCompassAlpha (F)V\n\tpublic abstract fun setCompassEnabled (Z)V\n\tpublic abstract fun setCompassGravity (I)V\n\tpublic abstract fun setCompassImage (Landroid/graphics/drawable/Drawable;)V\n\tpublic abstract fun setCompassMargins (IIII)V\n\tpublic abstract fun setCompassRotation (F)V\n\tpublic abstract fun setCompassVisible (Z)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/compass/OnCompassClickListener {\n\tpublic abstract fun onCompassClick ()V\n}\n\npublic final class com/mapbox/maps/plugin/compass/generated/CompassSettings : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic synthetic fun <init> (ZIFFFFFFZZZLcom/mapbox/maps/ImageHolder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getClickable ()Z\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getFadeWhenFacingNorth ()Z\n\tpublic final fun getImage ()Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getOpacity ()F\n\tpublic final fun getPosition ()I\n\tpublic final fun getRotation ()F\n\tpublic final fun getVisibility ()Z\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/compass/generated/CompassSettings$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/compass/generated/CompassSettings;\n\tpublic final fun getClickable ()Z\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getFadeWhenFacingNorth ()Z\n\tpublic final fun getImage ()Lcom/mapbox/maps/ImageHolder;\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getOpacity ()F\n\tpublic final fun getPosition ()I\n\tpublic final fun getRotation ()F\n\tpublic final fun getVisibility ()Z\n\tpublic final fun setClickable (Z)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setClickable (Z)V\n\tpublic final fun setEnabled (Z)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setEnabled (Z)V\n\tpublic final fun setFadeWhenFacingNorth (Z)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setFadeWhenFacingNorth (Z)V\n\tpublic final fun setImage (Lcom/mapbox/maps/ImageHolder;)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setImage (Lcom/mapbox/maps/ImageHolder;)V\n\tpublic final fun setMarginBottom (F)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setMarginBottom (F)V\n\tpublic final fun setMarginLeft (F)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setMarginLeft (F)V\n\tpublic final fun setMarginRight (F)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setMarginRight (F)V\n\tpublic final fun setMarginTop (F)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setMarginTop (F)V\n\tpublic final fun setOpacity (F)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setOpacity (F)V\n\tpublic final fun setPosition (I)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setPosition (I)V\n\tpublic final fun setRotation (F)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setRotation (F)V\n\tpublic final fun setVisibility (Z)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings$Builder;\n\tpublic final synthetic fun setVisibility (Z)V\n}\n\npublic final class com/mapbox/maps/plugin/compass/generated/CompassSettings$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/compass/generated/CompassSettings;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract class com/mapbox/maps/plugin/compass/generated/CompassSettingsBase : com/mapbox/maps/plugin/compass/generated/CompassSettingsInterface {\n\tpublic fun <init> ()V\n\tprotected abstract fun applySettings ()V\n\tpublic fun getClickable ()Z\n\tpublic fun getEnabled ()Z\n\tpublic fun getFadeWhenFacingNorth ()Z\n\tpublic fun getImage ()Lcom/mapbox/maps/ImageHolder;\n\tprotected abstract fun getInternalSettings ()Lcom/mapbox/maps/plugin/compass/generated/CompassSettings;\n\tpublic fun getMarginBottom ()F\n\tpublic fun getMarginLeft ()F\n\tpublic fun getMarginRight ()F\n\tpublic fun getMarginTop ()F\n\tpublic fun getOpacity ()F\n\tpublic fun getPosition ()I\n\tpublic fun getRotation ()F\n\tpublic fun getSettings ()Lcom/mapbox/maps/plugin/compass/generated/CompassSettings;\n\tpublic fun getVisibility ()Z\n\tpublic fun setClickable (Z)V\n\tpublic fun setEnabled (Z)V\n\tpublic fun setFadeWhenFacingNorth (Z)V\n\tpublic fun setImage (Lcom/mapbox/maps/ImageHolder;)V\n\tprotected abstract fun setInternalSettings (Lcom/mapbox/maps/plugin/compass/generated/CompassSettings;)V\n\tpublic fun setMarginBottom (F)V\n\tpublic fun setMarginLeft (F)V\n\tpublic fun setMarginRight (F)V\n\tpublic fun setMarginTop (F)V\n\tpublic fun setOpacity (F)V\n\tpublic fun setPosition (I)V\n\tpublic fun setRotation (F)V\n\tpublic fun setVisibility (Z)V\n\tpublic fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/compass/generated/CompassSettingsData$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/compass/generated/CompassSettingsData;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/compass/generated/CompassSettingsData;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/compass/generated/CompassSettingsInterface {\n\tpublic abstract fun getClickable ()Z\n\tpublic abstract fun getEnabled ()Z\n\tpublic abstract fun getFadeWhenFacingNorth ()Z\n\tpublic abstract fun getImage ()Lcom/mapbox/maps/ImageHolder;\n\tpublic abstract fun getMarginBottom ()F\n\tpublic abstract fun getMarginLeft ()F\n\tpublic abstract fun getMarginRight ()F\n\tpublic abstract fun getMarginTop ()F\n\tpublic abstract fun getOpacity ()F\n\tpublic abstract fun getPosition ()I\n\tpublic abstract fun getRotation ()F\n\tpublic abstract fun getSettings ()Lcom/mapbox/maps/plugin/compass/generated/CompassSettings;\n\tpublic abstract fun getVisibility ()Z\n\tpublic abstract fun setClickable (Z)V\n\tpublic abstract fun setEnabled (Z)V\n\tpublic abstract fun setFadeWhenFacingNorth (Z)V\n\tpublic abstract fun setImage (Lcom/mapbox/maps/ImageHolder;)V\n\tpublic abstract fun setMarginBottom (F)V\n\tpublic abstract fun setMarginLeft (F)V\n\tpublic abstract fun setMarginRight (F)V\n\tpublic abstract fun setMarginTop (F)V\n\tpublic abstract fun setOpacity (F)V\n\tpublic abstract fun setPosition (I)V\n\tpublic abstract fun setRotation (F)V\n\tpublic abstract fun setVisibility (Z)V\n\tpublic abstract fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/compass/generated/CompassSettingsKt {\n\tpublic static final synthetic fun CompassSettings (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/plugin/compass/generated/CompassSettings;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapAttributionDelegate {\n\tpublic abstract fun buildMapBoxFeedbackUrl (Landroid/content/Context;)Ljava/lang/String;\n\tpublic abstract fun geofencingConsent ()Lcom/mapbox/maps/geofencing/MapGeofencingConsent;\n\tpublic abstract fun getExtraAttributions ()Ljava/util/List;\n\tpublic abstract fun parseAttributions (Landroid/content/Context;Lcom/mapbox/maps/plugin/attribution/AttributionParserConfig;)Ljava/util/List;\n\tpublic abstract fun setExtraAttributions (Ljava/util/List;)V\n\tpublic abstract fun telemetry ()Lcom/mapbox/maps/module/MapTelemetry;\n}\n\npublic final class com/mapbox/maps/plugin/delegates/MapAttributionDelegate$DefaultImpls {\n\tpublic static fun getExtraAttributions (Lcom/mapbox/maps/plugin/delegates/MapAttributionDelegate;)Ljava/util/List;\n\tpublic static fun setExtraAttributions (Lcom/mapbox/maps/plugin/delegates/MapAttributionDelegate;Ljava/util/List;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapCameraManagerDelegate {\n\tpublic abstract fun cameraForCoordinateBounds (Lcom/mapbox/maps/CoordinateBounds;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/CameraOptions;\n\tpublic abstract fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/CameraOptions;\n\tpublic abstract fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;Lkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/CameraOptions;Lcom/mapbox/maps/ScreenBox;)Lcom/mapbox/maps/CameraOptions;\n\tpublic abstract fun cameraForCoordinates (Ljava/util/List;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;)Lcom/mapbox/maps/CameraOptions;\n\tpublic abstract fun cameraForDrag (Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/CameraOptions;\n\tpublic abstract fun cameraForGeometry (Lcom/mapbox/geojson/Geometry;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;)Lcom/mapbox/maps/CameraOptions;\n\tpublic abstract fun coordinateBoundsForCamera (Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/maps/CoordinateBounds;\n\tpublic abstract fun coordinateBoundsForCameraUnwrapped (Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/maps/CoordinateBounds;\n\tpublic abstract fun coordinateBoundsForRect (Landroid/graphics/RectF;)Lcom/mapbox/maps/CoordinateBounds;\n\tpublic abstract fun coordinateBoundsZoomForCamera (Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/maps/CoordinateBoundsZoom;\n\tpublic abstract fun coordinateBoundsZoomForCameraUnwrapped (Lcom/mapbox/maps/CameraOptions;)Lcom/mapbox/maps/CoordinateBoundsZoom;\n\tpublic abstract fun coordinateForPixel (Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/geojson/Point;\n\tpublic abstract fun coordinateInfoForPixel (Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/CoordinateInfo;\n\tpublic abstract fun coordinatesForPixels (Ljava/util/List;)Ljava/util/List;\n\tpublic abstract fun coordinatesInfoForPixels (Ljava/util/List;)Ljava/util/List;\n\tpublic abstract fun getBounds ()Lcom/mapbox/maps/CameraBounds;\n\tpublic abstract fun getCameraState ()Lcom/mapbox/maps/CameraState;\n\tpublic abstract fun getCenterAltitudeMode ()Lcom/mapbox/maps/MapCenterAltitudeMode;\n\tpublic abstract fun getFreeCameraOptions ()Lcom/mapbox/maps/FreeCameraOptions;\n\tpublic abstract fun pixelForCoordinate (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/ScreenCoordinate;\n\tpublic abstract fun pixelsForCoordinates (Ljava/util/List;)Ljava/util/List;\n\tpublic abstract fun setBounds (Lcom/mapbox/maps/CameraBoundsOptions;)Lcom/mapbox/bindgen/Expected;\n\tpublic abstract fun setCamera (Lcom/mapbox/maps/CameraOptions;)V\n\tpublic abstract fun setCamera (Lcom/mapbox/maps/FreeCameraOptions;)V\n\tpublic abstract fun setCenterAltitudeMode (Lcom/mapbox/maps/MapCenterAltitudeMode;)V\n}\n\npublic final class com/mapbox/maps/plugin/delegates/MapCameraManagerDelegate$DefaultImpls {\n\tpublic static synthetic fun cameraForCoordinateBounds$default (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/maps/CoordinateBounds;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;ILjava/lang/Object;)Lcom/mapbox/maps/CameraOptions;\n\tpublic static synthetic fun cameraForCoordinates$default (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Ljava/util/List;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;ILjava/lang/Object;)Lcom/mapbox/maps/CameraOptions;\n\tpublic static synthetic fun cameraForGeometry$default (Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;Lcom/mapbox/geojson/Geometry;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;ILjava/lang/Object;)Lcom/mapbox/maps/CameraOptions;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapDelegateProvider {\n\tpublic abstract fun getIndoorManager ()Lcom/mapbox/maps/IndoorManager;\n\tpublic abstract fun getMapAttributionDelegate ()Lcom/mapbox/maps/plugin/delegates/MapAttributionDelegate;\n\tpublic abstract fun getMapCameraManagerDelegate ()Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;\n\tpublic abstract fun getMapFeatureQueryDelegate ()Lcom/mapbox/maps/plugin/delegates/MapFeatureQueryDelegate;\n\tpublic abstract fun getMapFeatureStateDelegate ()Lcom/mapbox/maps/plugin/delegates/MapFeatureStateDelegate;\n\tpublic abstract fun getMapInteractionDelegate ()Lcom/mapbox/maps/plugin/delegates/MapInteractionDelegate;\n\tpublic abstract fun getMapListenerDelegate ()Lcom/mapbox/maps/plugin/delegates/MapListenerDelegate;\n\tpublic abstract fun getMapPluginProviderDelegate ()Lcom/mapbox/maps/plugin/delegates/MapPluginProviderDelegate;\n\tpublic abstract fun getMapProjectionDelegate ()Lcom/mapbox/maps/plugin/delegates/MapProjectionDelegate;\n\tpublic abstract fun getMapStyleManagerDelegate ()Lcom/mapbox/maps/MapboxStyleManager;\n\tpublic abstract fun getMapTransformDelegate ()Lcom/mapbox/maps/plugin/delegates/MapTransformDelegate;\n\tpublic abstract fun getStyle (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapFeatureQueryDelegate {\n\tpublic abstract fun executeOnRenderThread (Ljava/lang/Runnable;)V\n\tpublic abstract fun queryRenderedFeatures (Lcom/mapbox/maps/RenderedQueryGeometry;Lcom/mapbox/maps/RenderedQueryOptions;Lcom/mapbox/maps/QueryRenderedFeaturesCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun queryRenderedRasterValues (Lcom/mapbox/maps/ScreenCoordinate;Lcom/mapbox/maps/RenderedRasterQueryOptions;Lcom/mapbox/maps/QueryRenderedRasterValuesCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun querySourceFeatures (Ljava/lang/String;Lcom/mapbox/maps/SourceQueryOptions;Lcom/mapbox/maps/QuerySourceFeaturesCallback;)Lcom/mapbox/common/Cancelable;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapFeatureStateDelegate {\n\tpublic abstract fun getFeatureState (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/QueryFeatureStateCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun removeFeatureState (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun removeFeatureStateExpression (ILcom/mapbox/maps/FeatureStateOperationCallback;)V\n\tpublic abstract fun resetFeatureStateExpressions (Lcom/mapbox/maps/FeatureStateOperationCallback;)V\n\tpublic abstract fun resetFeatureStates (Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun setFeatureState (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/FeatureStateOperationCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun setFeatureStateExpression (ILcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/maps/FeatureStateOperationCallback;)V\n}\n\npublic final class com/mapbox/maps/plugin/delegates/MapFeatureStateDelegate$DefaultImpls {\n\tpublic static synthetic fun getFeatureState$default (Lcom/mapbox/maps/plugin/delegates/MapFeatureStateDelegate;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/QueryFeatureStateCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun removeFeatureState$default (Lcom/mapbox/maps/plugin/delegates/MapFeatureStateDelegate;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun removeFeatureStateExpression$default (Lcom/mapbox/maps/plugin/delegates/MapFeatureStateDelegate;ILcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)V\n\tpublic static synthetic fun resetFeatureStateExpressions$default (Lcom/mapbox/maps/plugin/delegates/MapFeatureStateDelegate;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)V\n\tpublic static synthetic fun resetFeatureStates$default (Lcom/mapbox/maps/plugin/delegates/MapFeatureStateDelegate;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun setFeatureState$default (Lcom/mapbox/maps/plugin/delegates/MapFeatureStateDelegate;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)Lcom/mapbox/common/Cancelable;\n\tpublic static synthetic fun setFeatureStateExpression$default (Lcom/mapbox/maps/plugin/delegates/MapFeatureStateDelegate;ILcom/mapbox/maps/interactions/TypedFeaturesetDescriptor;Lcom/mapbox/bindgen/Value;Lcom/mapbox/maps/interactions/FeatureState;Lcom/mapbox/maps/FeatureStateOperationCallback;ILjava/lang/Object;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapInteractionDelegate {\n\tpublic abstract fun addInteraction (Lcom/mapbox/maps/MapInteraction;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun dispatch (Lcom/mapbox/maps/PlatformEventInfo;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapListenerDelegate {\n\tpublic abstract fun addOnCameraChangeListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnCameraChangeListener;)V\n\tpublic abstract fun addOnMapIdleListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapIdleListener;)V\n\tpublic abstract fun addOnMapLoadErrorListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic abstract fun addOnMapLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadedListener;)V\n\tpublic abstract fun addOnRenderFrameFinishedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnRenderFrameFinishedListener;)V\n\tpublic abstract fun addOnRenderFrameStartedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnRenderFrameStartedListener;)V\n\tpublic abstract fun addOnSourceAddedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceAddedListener;)V\n\tpublic abstract fun addOnSourceDataLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceDataLoadedListener;)V\n\tpublic abstract fun addOnSourceRemovedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceRemovedListener;)V\n\tpublic abstract fun addOnStyleDataLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleDataLoadedListener;)V\n\tpublic abstract fun addOnStyleImageMissingListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleImageMissingListener;)V\n\tpublic abstract fun addOnStyleImageUnusedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleImageUnusedListener;)V\n\tpublic abstract fun addOnStyleLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleLoadedListener;)V\n\tpublic abstract fun removeOnCameraChangeListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnCameraChangeListener;)V\n\tpublic abstract fun removeOnMapIdleListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapIdleListener;)V\n\tpublic abstract fun removeOnMapLoadErrorListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener;)V\n\tpublic abstract fun removeOnMapLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnMapLoadedListener;)V\n\tpublic abstract fun removeOnRenderFrameFinishedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnRenderFrameFinishedListener;)V\n\tpublic abstract fun removeOnRenderFrameStartedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnRenderFrameStartedListener;)V\n\tpublic abstract fun removeOnSourceAddedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceAddedListener;)V\n\tpublic abstract fun removeOnSourceDataLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceDataLoadedListener;)V\n\tpublic abstract fun removeOnSourceRemovedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnSourceRemovedListener;)V\n\tpublic abstract fun removeOnStyleDataLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleDataLoadedListener;)V\n\tpublic abstract fun removeOnStyleImageMissingListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleImageMissingListener;)V\n\tpublic abstract fun removeOnStyleImageUnusedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleImageUnusedListener;)V\n\tpublic abstract fun removeOnStyleLoadedListener (Lcom/mapbox/maps/plugin/delegates/listeners/OnStyleLoadedListener;)V\n\tpublic abstract fun subscribeCameraChanged (Lcom/mapbox/maps/CameraChangedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeCameraChangedCoalesced (Lcom/mapbox/maps/CameraChangedCoalescedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeGenericEvent (Ljava/lang/String;Lcom/mapbox/maps/GenericEventCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeMapIdle (Lcom/mapbox/maps/MapIdleCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeMapLoaded (Lcom/mapbox/maps/MapLoadedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeMapLoadingError (Lcom/mapbox/maps/MapLoadingErrorCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeRenderFrameFinished (Lcom/mapbox/maps/RenderFrameFinishedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeRenderFrameStarted (Lcom/mapbox/maps/RenderFrameStartedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeResourceRequest (Lcom/mapbox/maps/ResourceRequestCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeSourceAdded (Lcom/mapbox/maps/SourceAddedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeSourceDataLoaded (Lcom/mapbox/maps/SourceDataLoadedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeSourceRemoved (Lcom/mapbox/maps/SourceRemovedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeStyleDataLoaded (Lcom/mapbox/maps/StyleDataLoadedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeStyleImageMissing (Lcom/mapbox/maps/StyleImageMissingCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeStyleImageRemoveUnused (Lcom/mapbox/maps/StyleImageRemoveUnusedCallback;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun subscribeStyleLoaded (Lcom/mapbox/maps/StyleLoadedCallback;)Lcom/mapbox/common/Cancelable;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate {\n\tpublic abstract fun cameraAnimationsPlugin (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic abstract fun gesturesPlugin (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapPluginProviderDelegate {\n\tpublic abstract fun getPlugin (Ljava/lang/String;)Lcom/mapbox/maps/plugin/MapPlugin;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapProjectionDelegate {\n\tpublic abstract fun coordinateForProjectedMeters (Lcom/mapbox/maps/ProjectedMeters;)Lcom/mapbox/geojson/Point;\n\tpublic abstract fun getMetersPerPixelAtLatitude (D)D\n\tpublic abstract fun getMetersPerPixelAtLatitude (DD)D\n\tpublic abstract fun project (Lcom/mapbox/geojson/Point;D)Lcom/mapbox/maps/MercatorCoordinate;\n\tpublic abstract fun projectedMetersForCoordinate (Lcom/mapbox/geojson/Point;)Lcom/mapbox/maps/ProjectedMeters;\n\tpublic abstract fun unproject (Lcom/mapbox/maps/MercatorCoordinate;D)Lcom/mapbox/geojson/Point;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/MapTransformDelegate {\n\tpublic abstract fun getMapOptions ()Lcom/mapbox/maps/MapOptions;\n\tpublic abstract fun getSize ()Lcom/mapbox/maps/Size;\n\tpublic abstract fun isGestureInProgress ()Z\n\tpublic abstract fun isUserAnimationInProgress ()Z\n\tpublic abstract fun setCameraAnimationHint (Lcom/mapbox/maps/CameraAnimationHint;)V\n\tpublic abstract fun setConstrainMode (Lcom/mapbox/maps/ConstrainMode;)V\n\tpublic abstract fun setGestureInProgress (Z)V\n\tpublic abstract fun setNorthOrientation (Lcom/mapbox/maps/NorthOrientation;)V\n\tpublic abstract fun setUserAnimationInProgress (Z)V\n\tpublic abstract fun setViewportMode (Lcom/mapbox/maps/ViewportMode;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnCameraChangeListener {\n\tpublic abstract fun onCameraChanged (Lcom/mapbox/maps/extension/observable/eventdata/CameraChangedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnMapIdleListener {\n\tpublic abstract fun onMapIdle (Lcom/mapbox/maps/extension/observable/eventdata/MapIdleEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener {\n\tpublic abstract fun onMapLoadError (Lcom/mapbox/maps/extension/observable/eventdata/MapLoadingErrorEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnMapLoadedListener {\n\tpublic abstract fun onMapLoaded (Lcom/mapbox/maps/extension/observable/eventdata/MapLoadedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnRenderFrameFinishedListener {\n\tpublic abstract fun onRenderFrameFinished (Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameFinishedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnRenderFrameStartedListener {\n\tpublic abstract fun onRenderFrameStarted (Lcom/mapbox/maps/extension/observable/eventdata/RenderFrameStartedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnSourceAddedListener {\n\tpublic abstract fun onSourceAdded (Lcom/mapbox/maps/extension/observable/eventdata/SourceAddedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnSourceDataLoadedListener {\n\tpublic abstract fun onSourceDataLoaded (Lcom/mapbox/maps/extension/observable/eventdata/SourceDataLoadedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnSourceRemovedListener {\n\tpublic abstract fun onSourceRemoved (Lcom/mapbox/maps/extension/observable/eventdata/SourceRemovedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnStyleDataLoadedListener {\n\tpublic abstract fun onStyleDataLoaded (Lcom/mapbox/maps/extension/observable/eventdata/StyleDataLoadedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnStyleImageMissingListener {\n\tpublic abstract fun onStyleImageMissing (Lcom/mapbox/maps/extension/observable/eventdata/StyleImageMissingEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnStyleImageUnusedListener {\n\tpublic abstract fun onStyleImageUnused (Lcom/mapbox/maps/extension/observable/eventdata/StyleImageUnusedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/delegates/listeners/OnStyleLoadedListener {\n\tpublic abstract fun onStyleLoaded (Lcom/mapbox/maps/extension/observable/eventdata/StyleLoadedEventData;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/gestures/GesturesPlugin : com/mapbox/maps/plugin/ContextBinder, com/mapbox/maps/plugin/MapPlugin, com/mapbox/maps/plugin/MapSizePlugin, com/mapbox/maps/plugin/gestures/generated/GesturesSettingsInterface {\n\tpublic abstract fun addOnFlingListener (Lcom/mapbox/maps/plugin/gestures/OnFlingListener;)V\n\tpublic abstract fun addOnMapClickListener (Lcom/mapbox/maps/plugin/gestures/OnMapClickListener;)V\n\tpublic abstract fun addOnMapLongClickListener (Lcom/mapbox/maps/plugin/gestures/OnMapLongClickListener;)V\n\tpublic abstract fun addOnMoveListener (Lcom/mapbox/maps/plugin/gestures/OnMoveListener;)V\n\tpublic abstract fun addOnRotateListener (Lcom/mapbox/maps/plugin/gestures/OnRotateListener;)V\n\tpublic abstract fun addOnScaleListener (Lcom/mapbox/maps/plugin/gestures/OnScaleListener;)V\n\tpublic abstract fun addOnShoveListener (Lcom/mapbox/maps/plugin/gestures/OnShoveListener;)V\n\tpublic abstract fun addProtectedAnimationOwner (Ljava/lang/String;)V\n\tpublic abstract fun getGesturesManager ()Lcom/mapbox/android/gestures/AndroidGesturesManager;\n\tpublic abstract fun onGenericMotionEvent (Landroid/view/MotionEvent;)Z\n\tpublic abstract fun onTouchEvent (Landroid/view/MotionEvent;)Z\n\tpublic abstract fun removeOnFlingListener (Lcom/mapbox/maps/plugin/gestures/OnFlingListener;)V\n\tpublic abstract fun removeOnMapClickListener (Lcom/mapbox/maps/plugin/gestures/OnMapClickListener;)V\n\tpublic abstract fun removeOnMapLongClickListener (Lcom/mapbox/maps/plugin/gestures/OnMapLongClickListener;)V\n\tpublic abstract fun removeOnMoveListener (Lcom/mapbox/maps/plugin/gestures/OnMoveListener;)V\n\tpublic abstract fun removeOnRotateListener (Lcom/mapbox/maps/plugin/gestures/OnRotateListener;)V\n\tpublic abstract fun removeOnScaleListener (Lcom/mapbox/maps/plugin/gestures/OnScaleListener;)V\n\tpublic abstract fun removeOnShoveListener (Lcom/mapbox/maps/plugin/gestures/OnShoveListener;)V\n\tpublic abstract fun removeProtectedAnimationOwner (Ljava/lang/String;)V\n\tpublic abstract fun setGesturesManager (Lcom/mapbox/android/gestures/AndroidGesturesManager;ZZ)V\n}\n\npublic final class com/mapbox/maps/plugin/gestures/GesturesPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/gestures/GesturesPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/gestures/GesturesPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/gestures/GesturesPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onSizeChanged (Lcom/mapbox/maps/plugin/gestures/GesturesPlugin;II)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/gestures/OnFlingListener {\n\tpublic abstract fun onFling ()V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/gestures/OnMapClickListener {\n\tpublic abstract fun onMapClick (Lcom/mapbox/geojson/Point;)Z\n}\n\npublic abstract interface class com/mapbox/maps/plugin/gestures/OnMapLongClickListener {\n\tpublic abstract fun onMapLongClick (Lcom/mapbox/geojson/Point;)Z\n}\n\npublic abstract interface class com/mapbox/maps/plugin/gestures/OnMoveListener {\n\tpublic abstract fun onMove (Lcom/mapbox/android/gestures/MoveGestureDetector;)Z\n\tpublic abstract fun onMoveBegin (Lcom/mapbox/android/gestures/MoveGestureDetector;)V\n\tpublic abstract fun onMoveEnd (Lcom/mapbox/android/gestures/MoveGestureDetector;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/gestures/OnRotateListener {\n\tpublic abstract fun onRotate (Lcom/mapbox/android/gestures/RotateGestureDetector;)V\n\tpublic abstract fun onRotateBegin (Lcom/mapbox/android/gestures/RotateGestureDetector;)V\n\tpublic abstract fun onRotateEnd (Lcom/mapbox/android/gestures/RotateGestureDetector;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/gestures/OnScaleListener {\n\tpublic abstract fun onScale (Lcom/mapbox/android/gestures/StandardScaleGestureDetector;)V\n\tpublic abstract fun onScaleBegin (Lcom/mapbox/android/gestures/StandardScaleGestureDetector;)V\n\tpublic abstract fun onScaleEnd (Lcom/mapbox/android/gestures/StandardScaleGestureDetector;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/gestures/OnShoveListener {\n\tpublic abstract fun onShove (Lcom/mapbox/android/gestures/ShoveGestureDetector;)V\n\tpublic abstract fun onShoveBegin (Lcom/mapbox/android/gestures/ShoveGestureDetector;)V\n\tpublic abstract fun onShoveEnd (Lcom/mapbox/android/gestures/ShoveGestureDetector;)V\n}\n\npublic final class com/mapbox/maps/plugin/gestures/generated/GesturesSettings : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic synthetic fun <init> (ZZZZZLcom/mapbox/maps/plugin/ScrollMode;ZZZLcom/mapbox/maps/ScreenCoordinate;ZZZZZFZLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDoubleTapToZoomInEnabled ()Z\n\tpublic final fun getDoubleTouchToZoomOutEnabled ()Z\n\tpublic final fun getFocalPoint ()Lcom/mapbox/maps/ScreenCoordinate;\n\tpublic final fun getIncreasePinchToZoomThresholdWhenRotating ()Z\n\tpublic final fun getIncreaseRotateThresholdWhenPinchingToZoom ()Z\n\tpublic final fun getPinchScrollEnabled ()Z\n\tpublic final fun getPinchToZoomDecelerationEnabled ()Z\n\tpublic final fun getPinchToZoomEnabled ()Z\n\tpublic final fun getPitchEnabled ()Z\n\tpublic final fun getQuickZoomEnabled ()Z\n\tpublic final fun getRotateDecelerationEnabled ()Z\n\tpublic final fun getRotateEnabled ()Z\n\tpublic final fun getScrollDecelerationEnabled ()Z\n\tpublic final fun getScrollEnabled ()Z\n\tpublic final fun getScrollMode ()Lcom/mapbox/maps/plugin/ScrollMode;\n\tpublic final fun getSimultaneousRotateAndPinchToZoomEnabled ()Z\n\tpublic final fun getZoomAnimationAmount ()F\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;\n\tpublic final fun getDoubleTapToZoomInEnabled ()Z\n\tpublic final fun getDoubleTouchToZoomOutEnabled ()Z\n\tpublic final fun getFocalPoint ()Lcom/mapbox/maps/ScreenCoordinate;\n\tpublic final fun getIncreasePinchToZoomThresholdWhenRotating ()Z\n\tpublic final fun getIncreaseRotateThresholdWhenPinchingToZoom ()Z\n\tpublic final fun getPinchScrollEnabled ()Z\n\tpublic final fun getPinchToZoomDecelerationEnabled ()Z\n\tpublic final fun getPinchToZoomEnabled ()Z\n\tpublic final fun getPitchEnabled ()Z\n\tpublic final fun getQuickZoomEnabled ()Z\n\tpublic final fun getRotateDecelerationEnabled ()Z\n\tpublic final fun getRotateEnabled ()Z\n\tpublic final fun getScrollDecelerationEnabled ()Z\n\tpublic final fun getScrollEnabled ()Z\n\tpublic final fun getScrollMode ()Lcom/mapbox/maps/plugin/ScrollMode;\n\tpublic final fun getSimultaneousRotateAndPinchToZoomEnabled ()Z\n\tpublic final fun getZoomAnimationAmount ()F\n\tpublic final fun setDoubleTapToZoomInEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setDoubleTapToZoomInEnabled (Z)V\n\tpublic final fun setDoubleTouchToZoomOutEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setDoubleTouchToZoomOutEnabled (Z)V\n\tpublic final fun setFocalPoint (Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setFocalPoint (Lcom/mapbox/maps/ScreenCoordinate;)V\n\tpublic final fun setIncreasePinchToZoomThresholdWhenRotating (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setIncreasePinchToZoomThresholdWhenRotating (Z)V\n\tpublic final fun setIncreaseRotateThresholdWhenPinchingToZoom (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setIncreaseRotateThresholdWhenPinchingToZoom (Z)V\n\tpublic final fun setPinchScrollEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setPinchScrollEnabled (Z)V\n\tpublic final fun setPinchToZoomDecelerationEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setPinchToZoomDecelerationEnabled (Z)V\n\tpublic final fun setPinchToZoomEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setPinchToZoomEnabled (Z)V\n\tpublic final fun setPitchEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setPitchEnabled (Z)V\n\tpublic final fun setQuickZoomEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setQuickZoomEnabled (Z)V\n\tpublic final fun setRotateDecelerationEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setRotateDecelerationEnabled (Z)V\n\tpublic final fun setRotateEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setRotateEnabled (Z)V\n\tpublic final fun setScrollDecelerationEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setScrollDecelerationEnabled (Z)V\n\tpublic final fun setScrollEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setScrollEnabled (Z)V\n\tpublic final fun setScrollMode (Lcom/mapbox/maps/plugin/ScrollMode;)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setScrollMode (Lcom/mapbox/maps/plugin/ScrollMode;)V\n\tpublic final fun setSimultaneousRotateAndPinchToZoomEnabled (Z)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setSimultaneousRotateAndPinchToZoomEnabled (Z)V\n\tpublic final fun setZoomAnimationAmount (F)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings$Builder;\n\tpublic final synthetic fun setZoomAnimationAmount (F)V\n}\n\npublic final class com/mapbox/maps/plugin/gestures/generated/GesturesSettings$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract class com/mapbox/maps/plugin/gestures/generated/GesturesSettingsBase : com/mapbox/maps/plugin/gestures/generated/GesturesSettingsInterface {\n\tpublic fun <init> ()V\n\tprotected abstract fun applySettings ()V\n\tpublic fun getDoubleTapToZoomInEnabled ()Z\n\tpublic fun getDoubleTouchToZoomOutEnabled ()Z\n\tpublic fun getFocalPoint ()Lcom/mapbox/maps/ScreenCoordinate;\n\tpublic fun getIncreasePinchToZoomThresholdWhenRotating ()Z\n\tpublic fun getIncreaseRotateThresholdWhenPinchingToZoom ()Z\n\tprotected abstract fun getInternalSettings ()Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;\n\tpublic fun getPinchScrollEnabled ()Z\n\tpublic fun getPinchToZoomDecelerationEnabled ()Z\n\tpublic fun getPinchToZoomEnabled ()Z\n\tpublic fun getPitchEnabled ()Z\n\tpublic fun getQuickZoomEnabled ()Z\n\tpublic fun getRotateDecelerationEnabled ()Z\n\tpublic fun getRotateEnabled ()Z\n\tpublic fun getScrollDecelerationEnabled ()Z\n\tpublic fun getScrollEnabled ()Z\n\tpublic fun getScrollMode ()Lcom/mapbox/maps/plugin/ScrollMode;\n\tpublic fun getSettings ()Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;\n\tpublic fun getSimultaneousRotateAndPinchToZoomEnabled ()Z\n\tpublic fun getZoomAnimationAmount ()F\n\tpublic fun setDoubleTapToZoomInEnabled (Z)V\n\tpublic fun setDoubleTouchToZoomOutEnabled (Z)V\n\tpublic fun setFocalPoint (Lcom/mapbox/maps/ScreenCoordinate;)V\n\tpublic fun setIncreasePinchToZoomThresholdWhenRotating (Z)V\n\tpublic fun setIncreaseRotateThresholdWhenPinchingToZoom (Z)V\n\tprotected abstract fun setInternalSettings (Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;)V\n\tpublic fun setPinchScrollEnabled (Z)V\n\tpublic fun setPinchToZoomDecelerationEnabled (Z)V\n\tpublic fun setPinchToZoomEnabled (Z)V\n\tpublic fun setPitchEnabled (Z)V\n\tpublic fun setQuickZoomEnabled (Z)V\n\tpublic fun setRotateDecelerationEnabled (Z)V\n\tpublic fun setRotateEnabled (Z)V\n\tpublic fun setScrollDecelerationEnabled (Z)V\n\tpublic fun setScrollEnabled (Z)V\n\tpublic fun setScrollMode (Lcom/mapbox/maps/plugin/ScrollMode;)V\n\tpublic fun setSimultaneousRotateAndPinchToZoomEnabled (Z)V\n\tpublic fun setZoomAnimationAmount (F)V\n\tpublic fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/gestures/generated/GesturesSettingsData$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettingsData;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettingsData;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/gestures/generated/GesturesSettingsInterface {\n\tpublic abstract fun getDoubleTapToZoomInEnabled ()Z\n\tpublic abstract fun getDoubleTouchToZoomOutEnabled ()Z\n\tpublic abstract fun getFocalPoint ()Lcom/mapbox/maps/ScreenCoordinate;\n\tpublic abstract fun getIncreasePinchToZoomThresholdWhenRotating ()Z\n\tpublic abstract fun getIncreaseRotateThresholdWhenPinchingToZoom ()Z\n\tpublic abstract fun getPinchScrollEnabled ()Z\n\tpublic abstract fun getPinchToZoomDecelerationEnabled ()Z\n\tpublic abstract fun getPinchToZoomEnabled ()Z\n\tpublic abstract fun getPitchEnabled ()Z\n\tpublic abstract fun getQuickZoomEnabled ()Z\n\tpublic abstract fun getRotateDecelerationEnabled ()Z\n\tpublic abstract fun getRotateEnabled ()Z\n\tpublic abstract fun getScrollDecelerationEnabled ()Z\n\tpublic abstract fun getScrollEnabled ()Z\n\tpublic abstract fun getScrollMode ()Lcom/mapbox/maps/plugin/ScrollMode;\n\tpublic abstract fun getSettings ()Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;\n\tpublic abstract fun getSimultaneousRotateAndPinchToZoomEnabled ()Z\n\tpublic abstract fun getZoomAnimationAmount ()F\n\tpublic abstract fun setDoubleTapToZoomInEnabled (Z)V\n\tpublic abstract fun setDoubleTouchToZoomOutEnabled (Z)V\n\tpublic abstract fun setFocalPoint (Lcom/mapbox/maps/ScreenCoordinate;)V\n\tpublic abstract fun setIncreasePinchToZoomThresholdWhenRotating (Z)V\n\tpublic abstract fun setIncreaseRotateThresholdWhenPinchingToZoom (Z)V\n\tpublic abstract fun setPinchScrollEnabled (Z)V\n\tpublic abstract fun setPinchToZoomDecelerationEnabled (Z)V\n\tpublic abstract fun setPinchToZoomEnabled (Z)V\n\tpublic abstract fun setPitchEnabled (Z)V\n\tpublic abstract fun setQuickZoomEnabled (Z)V\n\tpublic abstract fun setRotateDecelerationEnabled (Z)V\n\tpublic abstract fun setRotateEnabled (Z)V\n\tpublic abstract fun setScrollDecelerationEnabled (Z)V\n\tpublic abstract fun setScrollEnabled (Z)V\n\tpublic abstract fun setScrollMode (Lcom/mapbox/maps/plugin/ScrollMode;)V\n\tpublic abstract fun setSimultaneousRotateAndPinchToZoomEnabled (Z)V\n\tpublic abstract fun setZoomAnimationAmount (F)V\n\tpublic abstract fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/gestures/generated/GesturesSettingsKt {\n\tpublic static final synthetic fun GesturesSettings (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/plugin/gestures/generated/GesturesSettings;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin : com/mapbox/maps/plugin/LifecyclePlugin, com/mapbox/maps/plugin/ViewPlugin, com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsInterface {\n\tpublic abstract fun addOnFloorSelectedListener (Lcom/mapbox/maps/plugin/indoorselector/OnFloorSelectedListener;)V\n\tpublic abstract fun onFloorSelected (Ljava/lang/String;)V\n\tpublic abstract fun removeOnFloorSelectedListener (Lcom/mapbox/maps/plugin/indoorselector/OnFloorSelectedListener;)V\n\tpublic abstract fun updateFloors (Ljava/util/List;Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onPluginView (Lcom/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin;Landroid/view/View;)V\n\tpublic static fun onStart (Lcom/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin;)V\n\tpublic static fun onStop (Lcom/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/indoorselector/IndoorSelectorView {\n\tpublic abstract fun isIndoorSelectorVisible ()Z\n\tpublic abstract fun setIndoorGravity (I)V\n\tpublic abstract fun setIndoorSelectorMargins (IIII)V\n\tpublic abstract fun setIndoorSelectorVisible (Z)V\n\tpublic abstract fun updateFloors (Ljava/util/List;Ljava/lang/String;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/indoorselector/OnFloorSelectedListener {\n\tpublic abstract fun onFloorSelected (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic synthetic fun <init> (ZIFFFFLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getPosition ()I\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings;\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getPosition ()I\n\tpublic final fun setEnabled (Z)Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings$Builder;\n\tpublic final synthetic fun setEnabled (Z)V\n\tpublic final fun setMarginBottom (F)Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings$Builder;\n\tpublic final synthetic fun setMarginBottom (F)V\n\tpublic final fun setMarginLeft (F)Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings$Builder;\n\tpublic final synthetic fun setMarginLeft (F)V\n\tpublic final fun setMarginRight (F)Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings$Builder;\n\tpublic final synthetic fun setMarginRight (F)V\n\tpublic final fun setMarginTop (F)Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings$Builder;\n\tpublic final synthetic fun setMarginTop (F)V\n\tpublic final fun setPosition (I)Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings$Builder;\n\tpublic final synthetic fun setPosition (I)V\n}\n\npublic final class com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract class com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsBase : com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsInterface {\n\tpublic fun <init> ()V\n\tprotected abstract fun applySettings ()V\n\tpublic fun getEnabled ()Z\n\tprotected abstract fun getInternalSettings ()Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings;\n\tpublic fun getMarginBottom ()F\n\tpublic fun getMarginLeft ()F\n\tpublic fun getMarginRight ()F\n\tpublic fun getMarginTop ()F\n\tpublic fun getPosition ()I\n\tpublic fun getSettings ()Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings;\n\tpublic fun setEnabled (Z)V\n\tprotected abstract fun setInternalSettings (Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings;)V\n\tpublic fun setMarginBottom (F)V\n\tpublic fun setMarginLeft (F)V\n\tpublic fun setMarginRight (F)V\n\tpublic fun setMarginTop (F)V\n\tpublic fun setPosition (I)V\n\tpublic fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsData$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsData;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsData;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsInterface {\n\tpublic abstract fun getEnabled ()Z\n\tpublic abstract fun getMarginBottom ()F\n\tpublic abstract fun getMarginLeft ()F\n\tpublic abstract fun getMarginRight ()F\n\tpublic abstract fun getMarginTop ()F\n\tpublic abstract fun getPosition ()I\n\tpublic abstract fun getSettings ()Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings;\n\tpublic abstract fun setEnabled (Z)V\n\tpublic abstract fun setMarginBottom (F)V\n\tpublic abstract fun setMarginLeft (F)V\n\tpublic abstract fun setMarginRight (F)V\n\tpublic abstract fun setMarginTop (F)V\n\tpublic abstract fun setPosition (I)V\n\tpublic abstract fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsKt {\n\tpublic static final synthetic fun IndoorSelectorSettings (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/lifecycle/MapboxLifecyclePlugin : com/mapbox/maps/plugin/MapPlugin {\n\tpublic abstract fun registerLifecycleObserver (Landroid/view/View;Lcom/mapbox/maps/MapboxLifecycleObserver;)V\n}\n\npublic final class com/mapbox/maps/plugin/lifecycle/MapboxLifecyclePlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/lifecycle/MapboxLifecyclePlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/lifecycle/MapboxLifecyclePlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/lifecycle/MapboxLifecyclePlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin : com/mapbox/maps/plugin/ContextBinder, com/mapbox/maps/plugin/LifecyclePlugin, com/mapbox/maps/plugin/MapPlugin, com/mapbox/maps/plugin/MapStyleObserverPlugin, com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsInterface {\n\tpublic abstract fun addOnIndicatorAccuracyRadiusChangedListener (Lcom/mapbox/maps/plugin/locationcomponent/OnIndicatorAccuracyRadiusChangedListener;)V\n\tpublic abstract fun addOnIndicatorBearingChangedListener (Lcom/mapbox/maps/plugin/locationcomponent/OnIndicatorBearingChangedListener;)V\n\tpublic abstract fun addOnIndicatorPositionChangedListener (Lcom/mapbox/maps/plugin/locationcomponent/OnIndicatorPositionChangedListener;)V\n\tpublic abstract fun getLocationProvider ()Lcom/mapbox/maps/plugin/locationcomponent/LocationProvider;\n\tpublic abstract fun isLocatedAt (Lcom/mapbox/geojson/Point;Lcom/mapbox/maps/plugin/locationcomponent/PuckLocatedAtPointListener;)V\n\tpublic abstract fun removeOnIndicatorAccuracyRadiusChangedListener (Lcom/mapbox/maps/plugin/locationcomponent/OnIndicatorAccuracyRadiusChangedListener;)V\n\tpublic abstract fun removeOnIndicatorBearingChangedListener (Lcom/mapbox/maps/plugin/locationcomponent/OnIndicatorBearingChangedListener;)V\n\tpublic abstract fun removeOnIndicatorPositionChangedListener (Lcom/mapbox/maps/plugin/locationcomponent/OnIndicatorPositionChangedListener;)V\n\tpublic abstract fun setLocationProvider (Lcom/mapbox/maps/plugin/locationcomponent/LocationProvider;)V\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onStart (Lcom/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin;)V\n\tpublic static fun onStop (Lcom/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/locationcomponent/LocationConsumer {\n\tpublic abstract fun onBearingUpdated ([DLkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun onError (Lcom/mapbox/common/location/LocationError;)V\n\tpublic abstract fun onHorizontalAccuracyRadiusUpdated ([DLkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun onLocationUpdated ([Lcom/mapbox/geojson/Point;Lkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun onPuckAccuracyRadiusAnimatorDefaultOptionsUpdated (Lkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun onPuckBearingAnimatorDefaultOptionsUpdated (Lkotlin/jvm/functions/Function1;)V\n\tpublic abstract fun onPuckLocationAnimatorDefaultOptionsUpdated (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/LocationConsumer$DefaultImpls {\n\tpublic static synthetic fun onBearingUpdated$default (Lcom/mapbox/maps/plugin/locationcomponent/LocationConsumer;[DLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tpublic static synthetic fun onHorizontalAccuracyRadiusUpdated$default (Lcom/mapbox/maps/plugin/locationcomponent/LocationConsumer;[DLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tpublic static synthetic fun onLocationUpdated$default (Lcom/mapbox/maps/plugin/locationcomponent/LocationConsumer;[Lcom/mapbox/geojson/Point;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/locationcomponent/LocationProvider {\n\tpublic abstract fun registerLocationConsumer (Lcom/mapbox/maps/plugin/locationcomponent/LocationConsumer;)V\n\tpublic abstract fun unRegisterLocationConsumer (Lcom/mapbox/maps/plugin/locationcomponent/LocationConsumer;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/locationcomponent/OnIndicatorAccuracyRadiusChangedListener {\n\tpublic abstract fun onIndicatorAccuracyRadiusChanged (D)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/locationcomponent/OnIndicatorBearingChangedListener {\n\tpublic abstract fun onIndicatorBearingChanged (D)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/locationcomponent/OnIndicatorPositionChangedListener {\n\tpublic abstract fun onIndicatorPositionChanged (Lcom/mapbox/geojson/Point;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/locationcomponent/PuckLocatedAtPointListener {\n\tpublic abstract fun onResult (Z)V\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic synthetic fun <init> (ZZIFZIILjava/lang/String;Ljava/lang/String;ZLcom/mapbox/maps/plugin/PuckBearing;Ljava/lang/String;Lcom/mapbox/maps/plugin/LocationPuck;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAccuracyRingBorderColor ()I\n\tpublic final fun getAccuracyRingColor ()I\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getLayerAbove ()Ljava/lang/String;\n\tpublic final fun getLayerBelow ()Ljava/lang/String;\n\tpublic final fun getLocationPuck ()Lcom/mapbox/maps/plugin/LocationPuck;\n\tpublic final fun getPuckBearing ()Lcom/mapbox/maps/plugin/PuckBearing;\n\tpublic final fun getPuckBearingEnabled ()Z\n\tpublic final fun getPulsingColor ()I\n\tpublic final fun getPulsingEnabled ()Z\n\tpublic final fun getPulsingMaxRadius ()F\n\tpublic final fun getShowAccuracyRing ()Z\n\tpublic final fun getSlot ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder {\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/LocationPuck;)V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings;\n\tpublic final fun getAccuracyRingBorderColor ()I\n\tpublic final fun getAccuracyRingColor ()I\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getLayerAbove ()Ljava/lang/String;\n\tpublic final fun getLayerBelow ()Ljava/lang/String;\n\tpublic final fun getLocationPuck ()Lcom/mapbox/maps/plugin/LocationPuck;\n\tpublic final fun getPuckBearing ()Lcom/mapbox/maps/plugin/PuckBearing;\n\tpublic final fun getPuckBearingEnabled ()Z\n\tpublic final fun getPulsingColor ()I\n\tpublic final fun getPulsingEnabled ()Z\n\tpublic final fun getPulsingMaxRadius ()F\n\tpublic final fun getShowAccuracyRing ()Z\n\tpublic final fun getSlot ()Ljava/lang/String;\n\tpublic final fun setAccuracyRingBorderColor (I)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setAccuracyRingBorderColor (I)V\n\tpublic final fun setAccuracyRingColor (I)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setAccuracyRingColor (I)V\n\tpublic final fun setEnabled (Z)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setEnabled (Z)V\n\tpublic final fun setLayerAbove (Ljava/lang/String;)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setLayerAbove (Ljava/lang/String;)V\n\tpublic final fun setLayerBelow (Ljava/lang/String;)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setLayerBelow (Ljava/lang/String;)V\n\tpublic final fun setLocationPuck (Lcom/mapbox/maps/plugin/LocationPuck;)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setLocationPuck (Lcom/mapbox/maps/plugin/LocationPuck;)V\n\tpublic final fun setPuckBearing (Lcom/mapbox/maps/plugin/PuckBearing;)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setPuckBearing (Lcom/mapbox/maps/plugin/PuckBearing;)V\n\tpublic final fun setPuckBearingEnabled (Z)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setPuckBearingEnabled (Z)V\n\tpublic final fun setPulsingColor (I)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setPulsingColor (I)V\n\tpublic final fun setPulsingEnabled (Z)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setPulsingEnabled (Z)V\n\tpublic final fun setPulsingMaxRadius (F)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setPulsingMaxRadius (F)V\n\tpublic final fun setShowAccuracyRing (Z)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setShowAccuracyRing (Z)V\n\tpublic final fun setSlot (Ljava/lang/String;)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Builder;\n\tpublic final synthetic fun setSlot (Ljava/lang/String;)V\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract class com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsBase : com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsInterface {\n\tpublic fun <init> ()V\n\tprotected abstract fun applySettings ()V\n\tpublic fun getAccuracyRingBorderColor ()I\n\tpublic fun getAccuracyRingColor ()I\n\tpublic fun getEnabled ()Z\n\tprotected abstract fun getInternalSettings ()Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings;\n\tpublic fun getLayerAbove ()Ljava/lang/String;\n\tpublic fun getLayerBelow ()Ljava/lang/String;\n\tpublic fun getLocationPuck ()Lcom/mapbox/maps/plugin/LocationPuck;\n\tpublic fun getPuckBearing ()Lcom/mapbox/maps/plugin/PuckBearing;\n\tpublic fun getPuckBearingEnabled ()Z\n\tpublic fun getPulsingColor ()I\n\tpublic fun getPulsingEnabled ()Z\n\tpublic fun getPulsingMaxRadius ()F\n\tpublic fun getSettings ()Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings;\n\tpublic fun getShowAccuracyRing ()Z\n\tpublic fun getSlot ()Ljava/lang/String;\n\tpublic fun setAccuracyRingBorderColor (I)V\n\tpublic fun setAccuracyRingColor (I)V\n\tpublic fun setEnabled (Z)V\n\tprotected abstract fun setInternalSettings (Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings;)V\n\tpublic fun setLayerAbove (Ljava/lang/String;)V\n\tpublic fun setLayerBelow (Ljava/lang/String;)V\n\tpublic fun setLocationPuck (Lcom/mapbox/maps/plugin/LocationPuck;)V\n\tpublic fun setPuckBearing (Lcom/mapbox/maps/plugin/PuckBearing;)V\n\tpublic fun setPuckBearingEnabled (Z)V\n\tpublic fun setPulsingColor (I)V\n\tpublic fun setPulsingEnabled (Z)V\n\tpublic fun setPulsingMaxRadius (F)V\n\tpublic fun setShowAccuracyRing (Z)V\n\tpublic fun setSlot (Ljava/lang/String;)V\n\tpublic fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsData$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsData;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsData;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsInterface {\n\tpublic abstract fun getAccuracyRingBorderColor ()I\n\tpublic abstract fun getAccuracyRingColor ()I\n\tpublic abstract fun getEnabled ()Z\n\tpublic abstract fun getLayerAbove ()Ljava/lang/String;\n\tpublic abstract fun getLayerBelow ()Ljava/lang/String;\n\tpublic abstract fun getLocationPuck ()Lcom/mapbox/maps/plugin/LocationPuck;\n\tpublic abstract fun getPuckBearing ()Lcom/mapbox/maps/plugin/PuckBearing;\n\tpublic abstract fun getPuckBearingEnabled ()Z\n\tpublic abstract fun getPulsingColor ()I\n\tpublic abstract fun getPulsingEnabled ()Z\n\tpublic abstract fun getPulsingMaxRadius ()F\n\tpublic abstract fun getSettings ()Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings;\n\tpublic abstract fun getShowAccuracyRing ()Z\n\tpublic abstract fun getSlot ()Ljava/lang/String;\n\tpublic abstract fun setAccuracyRingBorderColor (I)V\n\tpublic abstract fun setAccuracyRingColor (I)V\n\tpublic abstract fun setEnabled (Z)V\n\tpublic abstract fun setLayerAbove (Ljava/lang/String;)V\n\tpublic abstract fun setLayerBelow (Ljava/lang/String;)V\n\tpublic abstract fun setLocationPuck (Lcom/mapbox/maps/plugin/LocationPuck;)V\n\tpublic abstract fun setPuckBearing (Lcom/mapbox/maps/plugin/PuckBearing;)V\n\tpublic abstract fun setPuckBearingEnabled (Z)V\n\tpublic abstract fun setPulsingColor (I)V\n\tpublic abstract fun setPulsingEnabled (Z)V\n\tpublic abstract fun setPulsingMaxRadius (F)V\n\tpublic abstract fun setShowAccuracyRing (Z)V\n\tpublic abstract fun setSlot (Ljava/lang/String;)V\n\tpublic abstract fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsKt {\n\tpublic static final synthetic fun LocationComponentSettings (Lcom/mapbox/maps/plugin/LocationPuck;Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/logo/LogoPlugin : com/mapbox/maps/plugin/ViewPlugin, com/mapbox/maps/plugin/logo/generated/LogoSettingsInterface {\n}\n\npublic final class com/mapbox/maps/plugin/logo/LogoPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/logo/LogoPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/logo/LogoPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/logo/LogoPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onPluginView (Lcom/mapbox/maps/plugin/logo/LogoPlugin;Landroid/view/View;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/logo/LogoView {\n\tpublic abstract fun getLogoEnabled ()Z\n\tpublic abstract fun getLogoGravity ()I\n\tpublic abstract fun requestLayout ()V\n\tpublic abstract fun setLogoEnabled (Z)V\n\tpublic abstract fun setLogoGravity (I)V\n\tpublic abstract fun setLogoMargins (IIII)V\n}\n\npublic final class com/mapbox/maps/plugin/logo/generated/LogoSettings : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic synthetic fun <init> (ZIFFFFLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getPosition ()I\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/logo/generated/LogoSettings$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/logo/generated/LogoSettings$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/logo/generated/LogoSettings;\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getPosition ()I\n\tpublic final fun setEnabled (Z)Lcom/mapbox/maps/plugin/logo/generated/LogoSettings$Builder;\n\tpublic final synthetic fun setEnabled (Z)V\n\tpublic final fun setMarginBottom (F)Lcom/mapbox/maps/plugin/logo/generated/LogoSettings$Builder;\n\tpublic final synthetic fun setMarginBottom (F)V\n\tpublic final fun setMarginLeft (F)Lcom/mapbox/maps/plugin/logo/generated/LogoSettings$Builder;\n\tpublic final synthetic fun setMarginLeft (F)V\n\tpublic final fun setMarginRight (F)Lcom/mapbox/maps/plugin/logo/generated/LogoSettings$Builder;\n\tpublic final synthetic fun setMarginRight (F)V\n\tpublic final fun setMarginTop (F)Lcom/mapbox/maps/plugin/logo/generated/LogoSettings$Builder;\n\tpublic final synthetic fun setMarginTop (F)V\n\tpublic final fun setPosition (I)Lcom/mapbox/maps/plugin/logo/generated/LogoSettings$Builder;\n\tpublic final synthetic fun setPosition (I)V\n}\n\npublic final class com/mapbox/maps/plugin/logo/generated/LogoSettings$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/logo/generated/LogoSettings;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/logo/generated/LogoSettings;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract class com/mapbox/maps/plugin/logo/generated/LogoSettingsBase : com/mapbox/maps/plugin/logo/generated/LogoSettingsInterface {\n\tpublic fun <init> ()V\n\tprotected abstract fun applySettings ()V\n\tpublic fun getEnabled ()Z\n\tprotected abstract fun getInternalSettings ()Lcom/mapbox/maps/plugin/logo/generated/LogoSettings;\n\tpublic fun getMarginBottom ()F\n\tpublic fun getMarginLeft ()F\n\tpublic fun getMarginRight ()F\n\tpublic fun getMarginTop ()F\n\tpublic fun getPosition ()I\n\tpublic fun getSettings ()Lcom/mapbox/maps/plugin/logo/generated/LogoSettings;\n\tpublic fun setEnabled (Z)V\n\tprotected abstract fun setInternalSettings (Lcom/mapbox/maps/plugin/logo/generated/LogoSettings;)V\n\tpublic fun setMarginBottom (F)V\n\tpublic fun setMarginLeft (F)V\n\tpublic fun setMarginRight (F)V\n\tpublic fun setMarginTop (F)V\n\tpublic fun setPosition (I)V\n\tpublic fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/logo/generated/LogoSettingsData$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/logo/generated/LogoSettingsData;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/logo/generated/LogoSettingsData;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/logo/generated/LogoSettingsInterface {\n\tpublic abstract fun getEnabled ()Z\n\tpublic abstract fun getMarginBottom ()F\n\tpublic abstract fun getMarginLeft ()F\n\tpublic abstract fun getMarginRight ()F\n\tpublic abstract fun getMarginTop ()F\n\tpublic abstract fun getPosition ()I\n\tpublic abstract fun getSettings ()Lcom/mapbox/maps/plugin/logo/generated/LogoSettings;\n\tpublic abstract fun setEnabled (Z)V\n\tpublic abstract fun setMarginBottom (F)V\n\tpublic abstract fun setMarginLeft (F)V\n\tpublic abstract fun setMarginRight (F)V\n\tpublic abstract fun setMarginTop (F)V\n\tpublic abstract fun setPosition (I)V\n\tpublic abstract fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/logo/generated/LogoSettingsKt {\n\tpublic static final synthetic fun LogoSettings (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/plugin/logo/generated/LogoSettings;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/overlay/MapOverlayCoordinatesProvider {\n\tpublic abstract fun getShownCoordinates ()Ljava/util/List;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/overlay/MapOverlayPlugin : com/mapbox/maps/plugin/MapPlugin, com/mapbox/maps/plugin/MapSizePlugin {\n\tpublic abstract fun getEdgeInsets ()Lcom/mapbox/maps/EdgeInsets;\n\tpublic abstract fun reframe (Lcom/mapbox/maps/plugin/overlay/OnReframeFinished;)V\n\tpublic abstract fun registerMapOverlayCoordinatesProvider (Lcom/mapbox/maps/plugin/overlay/MapOverlayCoordinatesProvider;)V\n\tpublic abstract fun registerOverlay (Landroid/view/View;)V\n\tpublic abstract fun registerOverlays (Ljava/util/List;)V\n\tpublic abstract fun setDisplayingAreaMargins (IIII)V\n\tpublic abstract fun unregisterMapOverlayCoordinatesProvider ()V\n\tpublic abstract fun unregisterOverlay (Landroid/view/View;)V\n\tpublic abstract fun unregisterOverlays (Ljava/util/List;)V\n}\n\npublic final class com/mapbox/maps/plugin/overlay/MapOverlayPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/overlay/MapOverlayPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/overlay/MapOverlayPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/overlay/MapOverlayPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onSizeChanged (Lcom/mapbox/maps/plugin/overlay/MapOverlayPlugin;II)V\n\tpublic static synthetic fun reframe$default (Lcom/mapbox/maps/plugin/overlay/MapOverlayPlugin;Lcom/mapbox/maps/plugin/overlay/OnReframeFinished;ILjava/lang/Object;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/overlay/OnReframeFinished {\n\tpublic abstract fun onReframeFinished (Lcom/mapbox/maps/CameraOptions;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/scalebar/ScaleBar {\n\tpublic abstract fun getDistancePerPixel ()F\n\tpublic abstract fun getEnable ()Z\n\tpublic abstract fun getMapViewWidth ()F\n\tpublic abstract fun getPixelRatio ()F\n\tpublic abstract fun getSettings ()Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;\n\tpublic abstract fun getUseContinuousRendering ()Z\n\tpublic abstract fun setDistancePerPixel (F)V\n\tpublic abstract fun setEnable (Z)V\n\tpublic abstract fun setMapViewWidth (F)V\n\tpublic abstract fun setPixelRatio (F)V\n\tpublic abstract fun setSettings (Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;)V\n\tpublic abstract fun setUseContinuousRendering (Z)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/scalebar/ScaleBarPlugin : com/mapbox/maps/plugin/MapSizePlugin, com/mapbox/maps/plugin/ViewPlugin, com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsInterface {\n\tpublic abstract fun getDistancePerPixel ()F\n\tpublic abstract fun setDistancePerPixel (F)V\n}\n\npublic final class com/mapbox/maps/plugin/scalebar/ScaleBarPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/scalebar/ScaleBarPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/scalebar/ScaleBarPlugin;)V\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/scalebar/ScaleBarPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static fun onPluginView (Lcom/mapbox/maps/plugin/scalebar/ScaleBarPlugin;Landroid/view/View;)V\n\tpublic static fun onSizeChanged (Lcom/mapbox/maps/plugin/scalebar/ScaleBarPlugin;II)V\n}\n\npublic final class com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings : android/os/Parcelable {\n\tpublic static final field CREATOR Landroid/os/Parcelable$Creator;\n\tpublic synthetic fun <init> (ZIFFFFIIIFFFFFZJZFZLcom/mapbox/maps/plugin/DistanceUnits;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun describeContents ()I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBorderWidth ()F\n\tpublic final fun getDistanceUnits ()Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getHeight ()F\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getPosition ()I\n\tpublic final fun getPrimaryColor ()I\n\tpublic final fun getRatio ()F\n\tpublic final fun getRefreshInterval ()J\n\tpublic final fun getSecondaryColor ()I\n\tpublic final fun getShowTextBorder ()Z\n\tpublic final fun getTextBarMargin ()F\n\tpublic final fun getTextBorderWidth ()F\n\tpublic final fun getTextColor ()I\n\tpublic final fun getTextSize ()F\n\tpublic final fun getUseContinuousRendering ()Z\n\tpublic fun hashCode ()I\n\tpublic final fun isMetricUnits ()Z\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun writeToParcel (Landroid/os/Parcel;I)V\n}\n\npublic final class com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;\n\tpublic final fun getBorderWidth ()F\n\tpublic final fun getDistanceUnits ()Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic final fun getEnabled ()Z\n\tpublic final fun getHeight ()F\n\tpublic final fun getMarginBottom ()F\n\tpublic final fun getMarginLeft ()F\n\tpublic final fun getMarginRight ()F\n\tpublic final fun getMarginTop ()F\n\tpublic final fun getPosition ()I\n\tpublic final fun getPrimaryColor ()I\n\tpublic final fun getRatio ()F\n\tpublic final fun getRefreshInterval ()J\n\tpublic final fun getSecondaryColor ()I\n\tpublic final fun getShowTextBorder ()Z\n\tpublic final fun getTextBarMargin ()F\n\tpublic final fun getTextBorderWidth ()F\n\tpublic final fun getTextColor ()I\n\tpublic final fun getTextSize ()F\n\tpublic final fun getUseContinuousRendering ()Z\n\tpublic final fun isMetricUnits ()Z\n\tpublic final fun setBorderWidth (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setBorderWidth (F)V\n\tpublic final fun setDistanceUnits (Lcom/mapbox/maps/plugin/DistanceUnits;)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setDistanceUnits (Lcom/mapbox/maps/plugin/DistanceUnits;)V\n\tpublic final fun setEnabled (Z)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setEnabled (Z)V\n\tpublic final fun setHeight (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setHeight (F)V\n\tpublic final fun setIsMetricUnits (Z)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final fun setMarginBottom (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setMarginBottom (F)V\n\tpublic final fun setMarginLeft (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setMarginLeft (F)V\n\tpublic final fun setMarginRight (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setMarginRight (F)V\n\tpublic final fun setMarginTop (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setMarginTop (F)V\n\tpublic final synthetic fun setMetricUnits (Z)V\n\tpublic final fun setPosition (I)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setPosition (I)V\n\tpublic final fun setPrimaryColor (I)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setPrimaryColor (I)V\n\tpublic final fun setRatio (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setRatio (F)V\n\tpublic final fun setRefreshInterval (J)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setRefreshInterval (J)V\n\tpublic final fun setSecondaryColor (I)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setSecondaryColor (I)V\n\tpublic final fun setShowTextBorder (Z)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setShowTextBorder (Z)V\n\tpublic final fun setTextBarMargin (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setTextBarMargin (F)V\n\tpublic final fun setTextBorderWidth (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setTextBorderWidth (F)V\n\tpublic final fun setTextColor (I)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setTextColor (I)V\n\tpublic final fun setTextSize (F)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setTextSize (F)V\n\tpublic final fun setUseContinuousRendering (Z)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Builder;\n\tpublic final synthetic fun setUseContinuousRendering (Z)V\n}\n\npublic final class com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract class com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsBase : com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsInterface {\n\tpublic fun <init> ()V\n\tprotected abstract fun applySettings ()V\n\tpublic fun getBorderWidth ()F\n\tpublic fun getDistanceUnits ()Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic fun getEnabled ()Z\n\tpublic fun getHeight ()F\n\tprotected abstract fun getInternalSettings ()Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;\n\tpublic fun getMarginBottom ()F\n\tpublic fun getMarginLeft ()F\n\tpublic fun getMarginRight ()F\n\tpublic fun getMarginTop ()F\n\tpublic fun getPosition ()I\n\tpublic fun getPrimaryColor ()I\n\tpublic fun getRatio ()F\n\tpublic fun getRefreshInterval ()J\n\tpublic fun getSecondaryColor ()I\n\tpublic fun getSettings ()Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;\n\tpublic fun getShowTextBorder ()Z\n\tpublic fun getTextBarMargin ()F\n\tpublic fun getTextBorderWidth ()F\n\tpublic fun getTextColor ()I\n\tpublic fun getTextSize ()F\n\tpublic fun getUseContinuousRendering ()Z\n\tpublic fun isMetricUnits ()Z\n\tpublic fun setBorderWidth (F)V\n\tpublic fun setDistanceUnits (Lcom/mapbox/maps/plugin/DistanceUnits;)V\n\tpublic fun setEnabled (Z)V\n\tpublic fun setHeight (F)V\n\tprotected abstract fun setInternalSettings (Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;)V\n\tpublic fun setMarginBottom (F)V\n\tpublic fun setMarginLeft (F)V\n\tpublic fun setMarginRight (F)V\n\tpublic fun setMarginTop (F)V\n\tpublic fun setMetricUnits (Z)V\n\tpublic fun setPosition (I)V\n\tpublic fun setPrimaryColor (I)V\n\tpublic fun setRatio (F)V\n\tpublic fun setRefreshInterval (J)V\n\tpublic fun setSecondaryColor (I)V\n\tpublic fun setShowTextBorder (Z)V\n\tpublic fun setTextBarMargin (F)V\n\tpublic fun setTextBorderWidth (F)V\n\tpublic fun setTextColor (I)V\n\tpublic fun setTextSize (F)V\n\tpublic fun setUseContinuousRendering (Z)V\n\tpublic fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsData$Creator : android/os/Parcelable$Creator {\n\tpublic fun <init> ()V\n\tpublic final fun createFromParcel (Landroid/os/Parcel;)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsData;\n\tpublic synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;\n\tpublic final fun newArray (I)[Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsData;\n\tpublic synthetic fun newArray (I)[Ljava/lang/Object;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsInterface {\n\tpublic abstract fun getBorderWidth ()F\n\tpublic abstract fun getDistanceUnits ()Lcom/mapbox/maps/plugin/DistanceUnits;\n\tpublic abstract fun getEnabled ()Z\n\tpublic abstract fun getHeight ()F\n\tpublic abstract fun getMarginBottom ()F\n\tpublic abstract fun getMarginLeft ()F\n\tpublic abstract fun getMarginRight ()F\n\tpublic abstract fun getMarginTop ()F\n\tpublic abstract fun getPosition ()I\n\tpublic abstract fun getPrimaryColor ()I\n\tpublic abstract fun getRatio ()F\n\tpublic abstract fun getRefreshInterval ()J\n\tpublic abstract fun getSecondaryColor ()I\n\tpublic abstract fun getSettings ()Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;\n\tpublic abstract fun getShowTextBorder ()Z\n\tpublic abstract fun getTextBarMargin ()F\n\tpublic abstract fun getTextBorderWidth ()F\n\tpublic abstract fun getTextColor ()I\n\tpublic abstract fun getTextSize ()F\n\tpublic abstract fun getUseContinuousRendering ()Z\n\tpublic abstract fun isMetricUnits ()Z\n\tpublic abstract fun setBorderWidth (F)V\n\tpublic abstract fun setDistanceUnits (Lcom/mapbox/maps/plugin/DistanceUnits;)V\n\tpublic abstract fun setEnabled (Z)V\n\tpublic abstract fun setHeight (F)V\n\tpublic abstract fun setMarginBottom (F)V\n\tpublic abstract fun setMarginLeft (F)V\n\tpublic abstract fun setMarginRight (F)V\n\tpublic abstract fun setMarginTop (F)V\n\tpublic abstract fun setMetricUnits (Z)V\n\tpublic abstract fun setPosition (I)V\n\tpublic abstract fun setPrimaryColor (I)V\n\tpublic abstract fun setRatio (F)V\n\tpublic abstract fun setRefreshInterval (J)V\n\tpublic abstract fun setSecondaryColor (I)V\n\tpublic abstract fun setShowTextBorder (Z)V\n\tpublic abstract fun setTextBarMargin (F)V\n\tpublic abstract fun setTextBorderWidth (F)V\n\tpublic abstract fun setTextColor (I)V\n\tpublic abstract fun setTextSize (F)V\n\tpublic abstract fun setUseContinuousRendering (Z)V\n\tpublic abstract fun updateSettings (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsKt {\n\tpublic static final synthetic fun ScaleBarSettings (Lkotlin/jvm/functions/Function1;)Lcom/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/viewport/CompletionListener {\n\tpublic abstract fun onComplete (Z)V\n}\n\npublic final class com/mapbox/maps/plugin/viewport/ViewportConstantsKt {\n\tpublic static final field DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH D\n\tpublic static final field DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM D\n\tpublic static final field DEFAULT_STATE_ANIMATION_DURATION_MS J\n\tpublic static final field DEFAULT_TRANSITION_MAX_DURATION_MS J\n}\n\npublic abstract interface class com/mapbox/maps/plugin/viewport/ViewportPlugin : com/mapbox/maps/plugin/MapPlugin {\n\tpublic abstract fun addStatusObserver (Lcom/mapbox/maps/plugin/viewport/ViewportStatusObserver;)V\n\tpublic abstract fun getDefaultTransition ()Lcom/mapbox/maps/plugin/viewport/transition/ViewportTransition;\n\tpublic abstract fun getOptions ()Lcom/mapbox/maps/plugin/viewport/data/ViewportOptions;\n\tpublic abstract fun getStatus ()Lcom/mapbox/maps/plugin/viewport/ViewportStatus;\n\tpublic abstract fun idle ()V\n\tpublic abstract fun makeDefaultViewportTransition (Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions;)Lcom/mapbox/maps/plugin/viewport/transition/DefaultViewportTransition;\n\tpublic abstract fun makeFollowPuckViewportState (Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions;)Lcom/mapbox/maps/plugin/viewport/state/FollowPuckViewportState;\n\tpublic abstract fun makeImmediateViewportTransition ()Lcom/mapbox/maps/plugin/viewport/transition/ViewportTransition;\n\tpublic abstract fun makeOverviewViewportState (Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions;)Lcom/mapbox/maps/plugin/viewport/state/OverviewViewportState;\n\tpublic abstract fun removeStatusObserver (Lcom/mapbox/maps/plugin/viewport/ViewportStatusObserver;)V\n\tpublic abstract fun setDefaultTransition (Lcom/mapbox/maps/plugin/viewport/transition/ViewportTransition;)V\n\tpublic abstract fun setOptions (Lcom/mapbox/maps/plugin/viewport/data/ViewportOptions;)V\n\tpublic abstract fun transitionTo (Lcom/mapbox/maps/plugin/viewport/state/ViewportState;Lcom/mapbox/maps/plugin/viewport/transition/ViewportTransition;Lcom/mapbox/maps/plugin/viewport/CompletionListener;)V\n}\n\npublic final class com/mapbox/maps/plugin/viewport/ViewportPlugin$DefaultImpls {\n\tpublic static fun cleanup (Lcom/mapbox/maps/plugin/viewport/ViewportPlugin;)V\n\tpublic static fun initialize (Lcom/mapbox/maps/plugin/viewport/ViewportPlugin;)V\n\tpublic static synthetic fun makeDefaultViewportTransition$default (Lcom/mapbox/maps/plugin/viewport/ViewportPlugin;Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/viewport/transition/DefaultViewportTransition;\n\tpublic static synthetic fun makeFollowPuckViewportState$default (Lcom/mapbox/maps/plugin/viewport/ViewportPlugin;Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions;ILjava/lang/Object;)Lcom/mapbox/maps/plugin/viewport/state/FollowPuckViewportState;\n\tpublic static fun onDelegateProvider (Lcom/mapbox/maps/plugin/viewport/ViewportPlugin;Lcom/mapbox/maps/plugin/delegates/MapDelegateProvider;)V\n\tpublic static synthetic fun transitionTo$default (Lcom/mapbox/maps/plugin/viewport/ViewportPlugin;Lcom/mapbox/maps/plugin/viewport/state/ViewportState;Lcom/mapbox/maps/plugin/viewport/transition/ViewportTransition;Lcom/mapbox/maps/plugin/viewport/CompletionListener;ILjava/lang/Object;)V\n}\n\npublic abstract class com/mapbox/maps/plugin/viewport/ViewportStatus {\n}\n\npublic final class com/mapbox/maps/plugin/viewport/ViewportStatus$Idle : com/mapbox/maps/plugin/viewport/ViewportStatus {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/plugin/viewport/ViewportStatus$Idle;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/ViewportStatus$State : com/mapbox/maps/plugin/viewport/ViewportStatus {\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/viewport/state/ViewportState;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getState ()Lcom/mapbox/maps/plugin/viewport/state/ViewportState;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/ViewportStatus$Transition : com/mapbox/maps/plugin/viewport/ViewportStatus {\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/viewport/transition/ViewportTransition;Lcom/mapbox/maps/plugin/viewport/state/ViewportState;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getToState ()Lcom/mapbox/maps/plugin/viewport/state/ViewportState;\n\tpublic final fun getTransition ()Lcom/mapbox/maps/plugin/viewport/transition/ViewportTransition;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class com/mapbox/maps/plugin/viewport/ViewportStatusObserver {\n\tpublic abstract fun onViewportStatusChanged (Lcom/mapbox/maps/plugin/viewport/ViewportStatus;Lcom/mapbox/maps/plugin/viewport/ViewportStatus;Lcom/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason;)V\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions {\n\tpublic synthetic fun <init> (JLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getMaxDurationMs ()J\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions;\n\tpublic final fun maxDurationMs (J)Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions$Builder;\n}\n\npublic abstract class com/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing {\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing$Constant : com/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing {\n\tpublic fun <init> (D)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBearing ()D\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing$SyncWithLocationPuck : com/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing$SyncWithLocationPuck;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions {\n\tpublic synthetic fun <init> (Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing;Ljava/lang/Double;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBearing ()Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing;\n\tpublic final fun getPadding ()Lcom/mapbox/maps/EdgeInsets;\n\tpublic final fun getPitch ()Ljava/lang/Double;\n\tpublic final fun getZoom ()Ljava/lang/Double;\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun bearing (Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing;)Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions;\n\tpublic final fun padding (Lcom/mapbox/maps/EdgeInsets;)Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions$Builder;\n\tpublic final fun pitch (Ljava/lang/Double;)Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions$Builder;\n\tpublic final fun zoom (Ljava/lang/Double;)Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions$Builder;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions {\n\tpublic synthetic fun <init> (Lcom/mapbox/geojson/Geometry;Lcom/mapbox/maps/EdgeInsets;Lcom/mapbox/maps/EdgeInsets;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;Lcom/mapbox/maps/ScreenCoordinate;JLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAnimationDurationMs ()J\n\tpublic final fun getBearing ()Ljava/lang/Double;\n\tpublic final fun getGeometry ()Lcom/mapbox/geojson/Geometry;\n\tpublic final fun getGeometryPadding ()Lcom/mapbox/maps/EdgeInsets;\n\tpublic final fun getMaxZoom ()Ljava/lang/Double;\n\tpublic final fun getOffset ()Lcom/mapbox/maps/ScreenCoordinate;\n\tpublic final fun getPadding ()Lcom/mapbox/maps/EdgeInsets;\n\tpublic final fun getPitch ()Ljava/lang/Double;\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun animationDurationMs (J)Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder;\n\tpublic final fun bearing (Ljava/lang/Double;)Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder;\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions;\n\tpublic final fun geometry (Lcom/mapbox/geojson/Geometry;)Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder;\n\tpublic final fun geometryPadding (Lcom/mapbox/maps/EdgeInsets;)Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder;\n\tpublic final fun maxZoom (Ljava/lang/Double;)Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder;\n\tpublic final fun offset (Lcom/mapbox/maps/ScreenCoordinate;)Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder;\n\tpublic final fun padding (Lcom/mapbox/maps/EdgeInsets;)Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder;\n\tpublic final fun pitch (Ljava/lang/Double;)Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions$Builder;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/ViewportOptions {\n\tpublic synthetic fun <init> (ZLkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getTransitionsToIdleUponUserInteraction ()Z\n\tpublic fun hashCode ()I\n\tpublic final fun toBuilder ()Lcom/mapbox/maps/plugin/viewport/data/ViewportOptions$Builder;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/ViewportOptions$Builder {\n\tpublic fun <init> ()V\n\tpublic final fun build ()Lcom/mapbox/maps/plugin/viewport/data/ViewportOptions;\n\tpublic final fun transitionsToIdleUponUserInteraction (Z)Lcom/mapbox/maps/plugin/viewport/data/ViewportOptions$Builder;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason {\n\tpublic static final field Companion Lcom/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason$Companion;\n\tpublic static final field IDLE_REQUESTED Lcom/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason;\n\tpublic static final field TRANSITION_FAILED Lcom/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason;\n\tpublic static final field TRANSITION_STARTED Lcom/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason;\n\tpublic static final field TRANSITION_SUCCEEDED Lcom/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason;\n\tpublic static final field USER_INTERACTION Lcom/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class com/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason$Companion {\n}\n\npublic abstract interface class com/mapbox/maps/plugin/viewport/state/FollowPuckViewportState : com/mapbox/maps/plugin/viewport/state/ViewportState {\n\tpublic abstract fun getOptions ()Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions;\n\tpublic abstract fun setOptions (Lcom/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/viewport/state/OverviewViewportState : com/mapbox/maps/plugin/viewport/state/ViewportState {\n\tpublic abstract fun getOptions ()Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions;\n\tpublic abstract fun setOptions (Lcom/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/viewport/state/ViewportState {\n\tpublic abstract fun observeDataSource (Lcom/mapbox/maps/plugin/viewport/state/ViewportStateDataObserver;)Lcom/mapbox/common/Cancelable;\n\tpublic abstract fun startUpdatingCamera ()V\n\tpublic abstract fun stopUpdatingCamera ()V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/viewport/state/ViewportStateDataObserver {\n\tpublic abstract fun onNewData (Lcom/mapbox/maps/CameraOptions;)Z\n}\n\npublic abstract interface class com/mapbox/maps/plugin/viewport/transition/DefaultViewportTransition : com/mapbox/maps/plugin/viewport/transition/ViewportTransition {\n\tpublic abstract fun getOptions ()Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions;\n\tpublic abstract fun setOptions (Lcom/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions;)V\n}\n\npublic abstract interface class com/mapbox/maps/plugin/viewport/transition/ViewportTransition {\n\tpublic abstract fun run (Lcom/mapbox/maps/plugin/viewport/state/ViewportState;Lcom/mapbox/maps/plugin/viewport/CompletionListener;)Lcom/mapbox/common/Cancelable;\n}\n\npublic final class com/mapbox/maps/threading/AnimationThreadController {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/threading/AnimationThreadController;\n\tpublic final fun getUsingBackgroundThread ()Z\n\tpublic final fun postOnAnimatorThread (Lkotlin/jvm/functions/Function0;)V\n\tpublic final fun postOnMainThread (Lkotlin/jvm/functions/Function0;)V\n\tpublic final fun useBackgroundThread ()V\n\tpublic final fun useMainThread ()V\n}\n\npublic final class com/mapbox/maps/util/CameraOptionsUtils {\n\tpublic static final fun isEmpty (Lcom/mapbox/maps/CameraOptions;)Z\n}\n\npublic final class com/mapbox/maps/util/CoreGesturesHandler {\n\tpublic fun <init> (Lcom/mapbox/maps/plugin/delegates/MapTransformDelegate;Lcom/mapbox/maps/plugin/delegates/MapCameraManagerDelegate;)V\n\tpublic final fun getCoreGestureAnimatorHandler ()Landroid/animation/AnimatorListenerAdapter;\n\tpublic final fun notifyCoreGestureStarted ()V\n\tpublic final fun notifyCoreTouchEnded ()V\n}\n\npublic final class com/mapbox/maps/util/MathUtils {\n\tpublic static final field INSTANCE Lcom/mapbox/maps/util/MathUtils;\n\tpublic final fun prepareOptimalBearingPath ([D)[D\n}\n\n"
  },
  {
    "path": "sdk-base/build.gradle.kts",
    "content": "import com.google.devtools.ksp.gradle.KspTaskJvm\nimport java.util.Locale\n\nplugins {\n  id(\"com.mapbox.gradle.library\")\n  id(\"com.jaredsburrows.license\")\n  // id(\"com.mapbox.maps.token\") #mapbox-android-gradle-plugins/issues/29\n  id(\"kotlin-parcelize\")\n  id(\"com.google.devtools.ksp\").version(\"${libs.versions.kotlin.get()}-${libs.versions.ksp.get()}\")\n}\n\nval VERSION_NAME: String by project\n\nandroid {\n  compileSdk = libs.versions.androidCompileSdkVersion.get().toInt()\n  namespace = \"com.mapbox.maps.base\"\n  lint {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  testOptions {\n    targetSdk = libs.versions.androidTargetSdkVersion.get().toInt()\n  }\n  defaultConfig {\n    minSdk = libs.versions.androidMinSdkVersion.get().toInt()\n    testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    buildConfigField(\"String\", \"MAPBOX_SDK_IDENTIFIER\", String.format(\"\\\"%s\\\"\", \"mapbox-maps-android\"))\n    buildConfigField(\"String\", \"MAPBOX_SDK_VERSION\", String.format(\"\\\"%s\\\"\", VERSION_NAME))\n    buildConfigField(\"String\", \"MAPBOX_VERSION_STRING\", String.format(\"\\\"Mapbox/%s\\\"\", VERSION_NAME))\n  }\n\n  // Add the `ksp` folder to each variant. Regardless if it exists or not.\n  sourceSets.all {\n    java.srcDirs(\"src/$name/ksp\")\n  }\n\n  // moving generated KSP files from build folder to `src/<variant_name>/ksp`\n  afterEvaluate {\n    val shouldGenerateKsp = project.hasProperty(\"generate-ksp\")\n\n    tasks.withType(KspTaskJvm::class.java).all {\n      // Make KSP tasks optional - only run when explicitly requested\n      enabled = shouldGenerateKsp\n\n      val generatedKspFilesFolder = destination\n      var lastFolder = generatedKspFilesFolder.toPath().fileName.toString()\n      // We handle \"debug\" and \"release\" build types as equal so remove them\n      buildTypes.names.forEach {\n        lastFolder = lastFolder.replaceFirst(it, \"\", true)\n      }\n      // If it's blank then it means that it should go to the default \"main\" source set\n      if (lastFolder.isBlank()) {\n        lastFolder = \"main\"\n      }\n      lastFolder = lastFolder.replaceFirstChar { it.lowercase(Locale.ROOT) }\n      val destinationPath = projectDir.resolve(\"src/$lastFolder/ksp\")\n      // dropping first 3 symbols which are `ksp`\n      val variantName = name.drop(3)\n\n      val copyTask = tasks.register(\"moveKsp${variantName}Task\", Sync::class.java) {\n        // Only run if KSP generation is enabled\n        enabled = shouldGenerateKsp\n\n        val sourcePath = \"${generatedKspFilesFolder.absolutePath}${File.separator}kotlin\"\n        // make sure we always execute this task when KSP build folder is not empty\n        outputs.upToDateWhen {\n          File(sourcePath).exists().not()\n        }\n        dependsOn(this@all)\n        from(sourcePath)\n        into(destinationPath)\n        doLast {\n          delete(sourcePath)\n          // metalava expects `getKspClassOutputDir` from\n          // https://github.com/google/ksp/blob/main/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt#L90\n          // to contain bytecode BUT all KSP bytecode is actually located in the same place as other bytecode;\n          // so to allow metalava run successfully we simply create an empty dir where metalava expects it\n          generatedKspFilesFolder.resolve(\"classes\").mkdir()\n        }\n      }\n\n      // Always create the classes directory for metalava, regardless of KSP generation\n      val createClassesDirTask = tasks.register(\"createKspClassesDir$variantName\") {\n        doLast {\n          generatedKspFilesFolder.resolve(\"classes\").mkdirs()\n        }\n      }\n\n      if (shouldGenerateKsp) {\n        // If KSP generation is enabled, add the copy task as a dependency to the compile task\n        tasks.findByName(\"compile$variantName\")?.dependsOn(copyTask)\n      } else {\n        // If KSP generation is disabled, still create the classes directory for metalava\n        tasks.findByName(\"compile$variantName\")?.dependsOn(createClassesDirTask)\n      }\n    }\n  }\n}\n\nmapboxLibrary {\n  glNative {\n    configuration = \"api\"\n  }\n  common {\n    configuration = \"api\"\n  }\n  publish {\n    group = \"com.mapbox.maps\"\n    artifactId = \"base\"\n    artifactTitle = \"Mapbox Maps SDK Base\"\n    artifactDescription = artifactTitle\n    sdkName = \"mobile-maps-android-base\"\n  }\n}\n\ndependencies {\n  implementation(libs.kotlin)\n  implementation(libs.mapbox.base)\n  implementation(libs.androidx.annotations)\n  api(libs.mapbox.gestures)\n  // Note that GLNative and Common are brought through the `mapboxLibrary` plugin above\n\n  compileOnly(libs.kotlinDataCompatAnnotation)\n  ksp(libs.kotlinDataCompatProcessor)\n\n  testImplementation(libs.bundles.base.dependenciesTests)\n}\n\nproject.apply {\n  from(\"$rootDir/gradle/ktlint.gradle.kts\")\n  from(\"$rootDir/gradle/lint.gradle\")\n  from(\"$rootDir/gradle/track-public-apis.gradle\")\n  from(\"$rootDir/gradle/dependency-updates.gradle\")\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/common/MapboxMapsAndroidLogger.kt",
    "content": "package com.mapbox.common\n\nimport com.mapbox.maps.base.BuildConfig\n\ninternal object MapboxMapsAndroidLogger {\n\n  init {\n    if (BuildConfig.DEBUG) {\n      try {\n        LogConfiguration.setLoggingLevel(LoggingLevel.DEBUG)\n      } catch (e: UnsatisfiedLinkError) {\n        // NOP\n      }\n    }\n  }\n\n  internal fun internalLogE(tag: String, message: String, logThrottler: LogThrottler? = null) {\n    try {\n      logThrottler?.let {\n        Log.error(message, \"$SDK_IDENTIFIER\\\\$tag\", logThrottler)\n      } ?: run {\n        Log.error(message, \"$SDK_IDENTIFIER\\\\$tag\")\n      }\n    } catch (e: UnsatisfiedLinkError) {\n      android.util.Log.e(\"$SDK_IDENTIFIER\\\\$tag\", message)\n    }\n  }\n\n  internal fun internalLogW(tag: String, message: String, logThrottler: LogThrottler? = null) {\n    try {\n      logThrottler?.let {\n        Log.warning(message, \"$SDK_IDENTIFIER\\\\$tag\", logThrottler)\n      } ?: run {\n        Log.warning(message, \"$SDK_IDENTIFIER\\\\$tag\")\n      }\n    } catch (e: UnsatisfiedLinkError) {\n      android.util.Log.w(\"$SDK_IDENTIFIER\\\\$tag\", message)\n    }\n  }\n\n  internal fun internalLogI(tag: String, message: String, logThrottler: LogThrottler? = null) {\n    try {\n      logThrottler?.let {\n        Log.info(message, \"$SDK_IDENTIFIER\\\\$tag\", logThrottler)\n      } ?: run {\n        Log.info(message, \"$SDK_IDENTIFIER\\\\$tag\")\n      }\n    } catch (e: UnsatisfiedLinkError) {\n      android.util.Log.i(\"$SDK_IDENTIFIER\\\\$tag\", message)\n    }\n  }\n\n  internal fun internalLogD(tag: String, message: String, logThrottler: LogThrottler? = null) {\n    try {\n      logThrottler?.let {\n        Log.debug(message, \"$SDK_IDENTIFIER\\\\$tag\", logThrottler)\n      } ?: run {\n        Log.debug(message, \"$SDK_IDENTIFIER\\\\$tag\")\n      }\n    } catch (e: UnsatisfiedLinkError) {\n      android.util.Log.d(\"$SDK_IDENTIFIER\\\\$tag\", message)\n    }\n  }\n\n  internal fun internalIsLoggableD(): Boolean {\n    return try {\n      LogConfiguration.getLoggingLevel() == LoggingLevel.DEBUG\n    } catch (e: UnsatisfiedLinkError) {\n      false\n    }\n  }\n\n  internal const val SDK_IDENTIFIER = \"maps-android\"\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/ClickInteraction.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.ClickInteraction.Companion.featureset\nimport com.mapbox.maps.ClickInteraction.Companion.invoke\nimport com.mapbox.maps.ClickInteraction.Companion.layer\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.interactions.standard.generated.standardPoi\n\n/**\n * Defines the click interaction.\n *\n * Refer to static factory methods to create the [ClickInteraction]:\n *  1. Mapbox Standard Style interactive features in defined as `ClickInteraction.standard<featureset_name>` (e.g. [ClickInteraction.Companion.standardPoi]).\n *  2. [featureset] to register the click interaction for given `featuresetId` and optional `importId` (when defining the interaction for an imported style).\n *  3. [layer] to register the click interaction for given `layerId`.\n *  4. [invoke] (meaning empty constructor in Kotlin and static method `map` in Java) to register the click interaction for the map surface itself.\n *\n * Click interaction callback requires returning `true` | `false` where `true` means that the interaction\n * has been consumed and other registered click interactions will not have the callback invoked and `false` means\n * that the interactions has not been consumed and other registered click interactions (if any) will have the callback invoked.\n *\n * Click interactions callbacks are fired in determined order:\n *  1. For unique feature sets defined as [FeaturesetDescriptor] - the top most rendered feature will trigger the callback first.\n *  2. [ClickInteraction.invoke] (map surface click interaction outside of all the feature sets) will always get triggered last.\n *  3. When having several [ClickInteraction]s with the same [FeaturesetDescriptor] / map surface (see point 2) - the **last** registered [ClickInteraction] will be triggered **first**.\n */\nclass ClickInteraction<T : FeaturesetFeature<*>> : MapInteraction {\n\n  internal constructor(\n    featureset: FeaturesetDescriptor,\n    filter: Value? = null,\n    radius: Double? = null,\n    onClick: (T, InteractionContext) -> Boolean,\n    featuresetFeatureBuilder: (Feature, FeaturesetFeatureId?, Value) -> T\n  ) {\n    coreInteraction = Interaction(\n      /* featuresetDescriptor */ featureset,\n      /* filter */ filter,\n      InteractionType.CLICK,\n      object : InteractionHandler {\n        override fun handleBegin(feature: QueriedFeature?, context: InteractionContext): Boolean {\n          // it is fine to have the QueriedFeature without an ID but we require the geometry\n          if (feature?.feature?.geometry() != null) {\n            return onClick(\n              featuresetFeatureBuilder(\n                feature.feature,\n                feature.featuresetFeatureId,\n                feature.state\n              ),\n              context\n            )\n          }\n          return false\n        }\n\n        override fun handleChange(context: InteractionContext) {\n          // not needed\n        }\n\n        override fun handleEnd(context: InteractionContext) {\n          // not needed\n        }\n      },\n      radius\n    )\n  }\n\n  private constructor(onClick: (InteractionContext) -> Boolean) {\n    coreInteraction = Interaction(\n      null,\n      null,\n      InteractionType.CLICK,\n      object : InteractionHandler {\n        override fun handleBegin(feature: QueriedFeature?, context: InteractionContext): Boolean {\n          return onClick(context)\n        }\n\n        override fun handleChange(context: InteractionContext) {\n          // not needed\n        }\n\n        override fun handleEnd(context: InteractionContext) {\n          // not needed\n        }\n      },\n      null\n    )\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /**\n     * Create the [ClickInteraction] for given featureset defined with [id] and optional [importId].\n     *\n     * When several [ClickInteraction]s are registered for the same [id] and [importId] - the callbacks will be triggered from last to first.\n     *\n     * @param id mandatory featureset id.\n     * @param importId optional style import id.\n     * @param filter optional filter. Defaults to NULL.\n     * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n     * @param onClick callback triggered when featureset is clicked.\n     */\n    @JvmOverloads\n    @JvmStatic\n    fun featureset(\n      id: String,\n      importId: String? = null,\n      filter: Value? = null,\n      radius: Double? = null,\n      onClick: (FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n    ): MapInteraction {\n      return ClickInteraction(\n        FeaturesetDescriptor(id, importId, null),\n        filter,\n        radius,\n        onClick\n      ) { feature, featuresetFeatureId, state ->\n        FeaturesetFeature(\n          descriptor = TypedFeaturesetDescriptor.Featureset(id, importId),\n          originalFeature = feature,\n          id = featuresetFeatureId,\n          state = FeatureState(state)\n        )\n      }\n    }\n\n    /**\n     * Create the [ClickInteraction] for given [id].\n     *\n     * When several [ClickInteraction]s are registered for the same [id] - the callbacks will be triggered from last to first.\n     *\n     * @param id mandatory layer id.\n     * @param filter optional filter. Defaults to NULL.\n     * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n     * @param onClick callback triggered when layer is clicked.\n     */\n    @JvmOverloads\n    @JvmStatic\n    fun layer(\n      id: String,\n      filter: Value? = null,\n      radius: Double? = null,\n      onClick: (FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n    ): MapInteraction {\n      return ClickInteraction(\n        FeaturesetDescriptor(null, null, id),\n        filter,\n        radius,\n        onClick\n      ) { feature, featuresetFeatureId, state ->\n        FeaturesetFeature(\n          descriptor = TypedFeaturesetDescriptor.Layer(id),\n          originalFeature = feature,\n          id = featuresetFeatureId,\n          state = FeatureState(state)\n        )\n      }\n    }\n\n    /**\n     * Create the [ClickInteraction] for the map surface itself.\n     *\n     * When several map [ClickInteraction]s are registered - the callbacks will be triggered from last to first.\n     *\n     * @param onClick callback triggered when map surface is clicked.\n     */\n    @JvmStatic\n    @JvmName(\"map\")\n    operator fun invoke(onClick: (InteractionContext) -> Boolean): ClickInteraction<Nothing> =\n      ClickInteraction(onClick)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/DragInteraction.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\n\n/**\n * For internal usage.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\nclass DragInteraction<T : FeaturesetFeature<*>> : MapInteraction {\n\n  private constructor(\n    featureset: FeaturesetDescriptor,\n    filter: Value? = null,\n    radius: Double? = null,\n    onDragBegin: (T, InteractionContext) -> Boolean,\n    onDrag: (InteractionContext) -> Unit,\n    onDragEnd: (InteractionContext) -> Unit,\n    featuresetFeatureBuilder: (Feature, FeaturesetFeatureId?, Value) -> T\n  ) {\n    coreInteraction = Interaction(\n      /* featuresetDescriptor */ featureset,\n      /* filter */ filter,\n      InteractionType.DRAG,\n      object : InteractionHandler {\n        override fun handleBegin(feature: QueriedFeature?, context: InteractionContext): Boolean {\n          // it is fine to have the QueriedFeature without an ID but we require the geometry\n          if (feature?.feature?.geometry() != null) {\n            return onDragBegin(\n              featuresetFeatureBuilder(\n                feature.feature,\n                feature.featuresetFeatureId,\n                feature.state\n              ),\n              context\n            )\n          }\n          return false\n        }\n\n        override fun handleChange(context: InteractionContext) {\n          onDrag(context)\n        }\n\n        override fun handleEnd(context: InteractionContext) {\n          onDragEnd(context)\n        }\n      },\n      radius\n    )\n  }\n\n  private constructor(\n    onDragBegin: (InteractionContext) -> Boolean,\n    onDrag: (InteractionContext) -> Unit,\n    onDragEnd: (InteractionContext) -> Unit,\n  ) {\n    coreInteraction = Interaction(\n      null,\n      null,\n      InteractionType.DRAG,\n      object : InteractionHandler {\n        override fun handleBegin(feature: QueriedFeature?, context: InteractionContext): Boolean {\n          return onDragBegin(context)\n        }\n\n        override fun handleChange(context: InteractionContext) {\n          onDrag(context)\n        }\n\n        override fun handleEnd(context: InteractionContext) {\n          onDragEnd(context)\n        }\n      },\n      null\n    )\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /**\n     * For internal usage.\n     */\n    @JvmOverloads\n    @JvmStatic\n    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n    fun featureset(\n      id: String,\n      importId: String? = null,\n      filter: Value? = null,\n      radius: Double? = null,\n      onDragBegin: (FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean,\n      onDrag: (InteractionContext) -> Unit,\n      onDragEnd: (InteractionContext) -> Unit,\n    ): MapInteraction {\n      return DragInteraction(\n        featureset = FeaturesetDescriptor(id, importId, null),\n        filter = filter,\n        radius = radius,\n        onDragBegin,\n        onDrag,\n        onDragEnd\n      ) { feature, featuresetFeatureId, state ->\n        FeaturesetFeature(\n          descriptor = TypedFeaturesetDescriptor.Featureset(id, importId),\n          originalFeature = feature,\n          id = featuresetFeatureId,\n          state = FeatureState(state)\n        )\n      }\n    }\n\n    /**\n     * For internal usage.\n     */\n    @JvmOverloads\n    @JvmStatic\n    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n    fun layer(\n      id: String,\n      filter: Value? = null,\n      onDragBegin: (FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean,\n      onDrag: (InteractionContext) -> Unit,\n      onDragEnd: (InteractionContext) -> Unit,\n    ): MapInteraction {\n      return DragInteraction(\n        featureset = FeaturesetDescriptor(null, null, id),\n        filter = filter,\n        radius = null,\n        onDragBegin,\n        onDrag,\n        onDragEnd\n      ) { feature, featuresetFeatureId, state ->\n        FeaturesetFeature(\n          descriptor = TypedFeaturesetDescriptor.Layer(id),\n          originalFeature = feature,\n          id = featuresetFeatureId,\n          state = FeatureState(state)\n        )\n      }\n    }\n\n    /**\n     * For internal usage.\n     */\n    @JvmSynthetic\n    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\n    operator fun invoke(\n      onDragBegin: (InteractionContext) -> Boolean,\n      onDrag: (InteractionContext) -> Unit,\n      onDragEnd: (InteractionContext) -> Unit,\n    ) = DragInteraction<Nothing>(\n      onDragBegin,\n      onDrag,\n      onDragEnd\n    )\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/ExtensionUtils.kt",
    "content": "@file:JvmName(\"ExtensionUtils\")\n\npackage com.mapbox.maps\n\nimport android.graphics.Bitmap\nimport com.mapbox.bindgen.DataRef\n\n/**\n * Convert [Bitmap] to rendering engine [Image] instance.\n *\n * Important: This will allocate native memory outside the JVM heap. If possible, avoid using it\n * inside loops/animations.\n */\n@MapboxDelicateApi\nfun Bitmap.toMapboxImage(): Image {\n  if (config != Bitmap.Config.ARGB_8888) {\n    throw IllegalArgumentException(\"Only ARGB_8888 bitmap config is supported!\")\n  }\n  val nativeDataRef = DataRef.allocateNative(byteCount)\n  copyPixelsToBuffer(nativeDataRef.buffer)\n  return Image(width, height, nativeDataRef)\n}\n\n/**\n * Extension function to convert [CameraState] to [CameraOptions].\n *\n * If [anchor] is specified - [CameraOptions.center] will be explicitly set to NULL\n * in order for the anchor to apply to the map camera.\n */\n@JvmOverloads\nfun CameraState.toCameraOptions(anchor: ScreenCoordinate? = null): CameraOptions =\n  if (anchor != null) {\n    CameraOptions.Builder()\n      .anchor(anchor)\n      .padding(padding)\n      .zoom(zoom)\n      .pitch(pitch)\n      .bearing(bearing)\n      .build()\n  } else {\n    CameraOptions.Builder()\n      .center(center)\n      .padding(padding)\n      .zoom(zoom)\n      .pitch(pitch)\n      .bearing(bearing)\n      .build()\n  }"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/ImageHolder.kt",
    "content": "package com.mapbox.maps\n\nimport android.graphics.Bitmap\nimport android.os.Parcelable\nimport androidx.annotation.DrawableRes\nimport androidx.annotation.RestrictTo\nimport kotlinx.parcelize.Parcelize\nimport java.util.Objects\n\n/**\n * Class to hold image data either as drawable id or as the [Bitmap].\n */\n@Parcelize\nclass ImageHolder private constructor(\n  /**\n   * Image represented as drawable resource id.\n   */\n  @DrawableRes val drawableId: Int?,\n  /**\n   * Image represented as the bitmap.\n   */\n  val bitmap: Bitmap?,\n  /**\n   * Image represented as the internal Mapbox image.\n   */\n  @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  val image: Image?,\n) : Parcelable {\n\n  /**\n   * Overloaded equals function.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as ImageHolder\n    return drawableId == other.drawableId && bitmap == other.bitmap && image == other.image\n  }\n\n  /**\n   * Overloaded hashCode function based on all class properties.\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(drawableId, bitmap, image)\n  }\n\n  /**\n   * Overloaded toString function.\n   */\n  override fun toString(): String {\n    return \"ImageHolder(bitmap=$bitmap, drawableId=$drawableId, image=$image)\"\n  }\n\n  /**\n   * Static methods to create an instance of [ImageHolder].\n   */\n  companion object {\n    /**\n     * Create an instance of [ImageHolder] from given [DrawableRes] id.\n     */\n    @JvmStatic\n    fun from(@DrawableRes drawableId: Int): ImageHolder {\n      return ImageHolder(drawableId, null, null)\n    }\n\n    /**\n     * Create an instance of [ImageHolder] from given [Bitmap].\n     */\n    @JvmStatic\n    fun from(bitmap: Bitmap): ImageHolder {\n      return ImageHolder(null, bitmap, null)\n    }\n\n    /**\n     * Create an instance of [ImageHolder] from given [Image].\n     */\n    @JvmStatic\n    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n    fun from(image: Image): ImageHolder {\n      return ImageHolder(null, null, image)\n    }\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/LongClickInteraction.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.ClickInteraction.Companion.featureset\nimport com.mapbox.maps.ClickInteraction.Companion.invoke\nimport com.mapbox.maps.ClickInteraction.Companion.layer\nimport com.mapbox.maps.LongClickInteraction.Companion.featureset\nimport com.mapbox.maps.LongClickInteraction.Companion.invoke\nimport com.mapbox.maps.LongClickInteraction.Companion.layer\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.interactions.standard.generated.standardPoi\n\n/**\n * Defines the long click interaction.\n *\n * Refer to static factory methods to create the [LongClickInteraction]:\n *  1. Mapbox Standard Style interactive features in defined as `LongClickInteraction.standard<featureset_name>` (e.g. [LongClickInteraction.Companion.standardPoi]).\n *  2. [featureset] to register the long click interaction for given `featuresetId` and optional `importId` (when defining the interaction for an imported style).\n *  3. [layer] to register the long click interaction for given `layerId`.\n *  4. [invoke] (meaning empty constructor in Kotlin and static method `map` in Java) to register the long click interaction for the map surface itself.\n *\n * Long click interaction callback requires returning `true` | `false` where `true` means that the interaction\n * has been consumed and other registered long click interactions will not have the callback invoked and `false` means\n * that the interactions has not been consumed and other registered long click interactions (if any) will have the callback invoked.\n *\n * Long click interactions callbacks are fired in determined order:\n *  1. For unique feature sets defined as [FeaturesetDescriptor] - the top most rendered feature will trigger the callback first.\n *  2. [LongClickInteraction.invoke] (map surface long click interaction outside of all the feature sets) will always get triggered last.\n *  3. When having several [LongClickInteraction]s with the same [FeaturesetDescriptor] / map surface (see point 2) - the **last** registered [LongClickInteraction] will be triggered **first**.\n */\nclass LongClickInteraction<T : FeaturesetFeature<*>> : MapInteraction {\n\n  internal constructor(\n    featureset: FeaturesetDescriptor,\n    filter: Value? = null,\n    radius: Double? = null,\n    onLongClick: (T, InteractionContext) -> Boolean,\n    featuresetFeatureBuilder: (Feature, FeaturesetFeatureId?, Value) -> T\n  ) {\n    coreInteraction = Interaction(\n      /* featuresetDescriptor */ featureset,\n      /* filter */ filter,\n      InteractionType.LONG_CLICK,\n      object : InteractionHandler {\n        override fun handleBegin(feature: QueriedFeature?, context: InteractionContext): Boolean {\n          // it is fine to have the QueriedFeature without an ID but we require the geometry\n          if (feature?.feature?.geometry() != null) {\n            return onLongClick(\n              featuresetFeatureBuilder(\n                feature.feature,\n                feature.featuresetFeatureId,\n                feature.state\n              ),\n              context\n            )\n          }\n          return false\n        }\n\n        override fun handleChange(context: InteractionContext) {\n          // not needed\n        }\n\n        override fun handleEnd(context: InteractionContext) {\n          // not needed\n        }\n      },\n      radius\n    )\n  }\n\n  private constructor(onLongClick: (InteractionContext) -> Boolean) {\n    coreInteraction = Interaction(\n      null,\n      null,\n      InteractionType.LONG_CLICK,\n      object : InteractionHandler {\n        override fun handleBegin(feature: QueriedFeature?, context: InteractionContext): Boolean {\n          return onLongClick(context)\n        }\n\n        override fun handleChange(context: InteractionContext) {\n          // not needed\n        }\n\n        override fun handleEnd(context: InteractionContext) {\n          // not needed\n        }\n      },\n      null\n    )\n  }\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n\n    /**\n     * Create the [LongClickInteraction] for given featureset defined with [id] and optional [importId].\n     *\n     * When several [LongClickInteraction]s are registered for the same [id] and [importId] - the callbacks will be triggered from last to first.\n     *\n     * @param id mandatory featureset id.\n     * @param importId optional style import id.\n     * @param filter optional filter. Defaults to NULL.\n     * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n     * @param onLongClick callback triggered when featureset is clicked.\n     */\n    @JvmOverloads\n    @JvmStatic\n    fun featureset(\n      id: String,\n      importId: String? = null,\n      filter: Value? = null,\n      radius: Double? = null,\n      onLongClick: (FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n    ): MapInteraction {\n      return LongClickInteraction(\n        FeaturesetDescriptor(id, importId, null),\n        filter,\n        radius,\n        onLongClick\n      ) { feature, featuresetFeatureId, state ->\n        FeaturesetFeature(\n          descriptor = TypedFeaturesetDescriptor.Featureset(id, importId),\n          originalFeature = feature,\n          id = featuresetFeatureId,\n          state = FeatureState(state)\n        )\n      }\n    }\n\n    /**\n     * Create the [LongClickInteraction] for given [id].\n     *\n     * When several [LongClickInteraction]s are registered for the same [id] - the callbacks will be triggered from last to first.\n     *\n     * @param id mandatory layer id.\n     * @param filter optional filter. Defaults to NULL.\n     * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n     * @param onLongClick callback triggered when layer is clicked.\n     */\n    @JvmOverloads\n    @JvmStatic\n    fun layer(\n      id: String,\n      filter: Value? = null,\n      radius: Double? = null,\n      onLongClick: (FeaturesetFeature<FeatureState>, InteractionContext) -> Boolean\n    ): MapInteraction {\n      return LongClickInteraction(\n        FeaturesetDescriptor(null, null, id),\n        filter,\n        radius,\n        onLongClick\n      ) { feature, featuresetFeatureId, state ->\n        FeaturesetFeature(\n          descriptor = TypedFeaturesetDescriptor.Layer(id),\n          originalFeature = feature,\n          id = featuresetFeatureId,\n          state = FeatureState(state)\n        )\n      }\n    }\n\n    /**\n     * Create the [LongClickInteraction] for the map surface itself.\n     *\n     * When several map [LongClickInteraction]s are registered - the callbacks will be triggered from last to first.\n     *\n     * @param onLongClick callback triggered when map surface is clicked.\n     */\n    @JvmStatic\n    @JvmName(\"map\")\n    operator fun invoke(onLongClick: (InteractionContext) -> Boolean): LongClickInteraction<Nothing> =\n      LongClickInteraction(onLongClick)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/MapInteraction.java",
    "content": "package com.mapbox.maps;\n\nimport androidx.annotation.NonNull;\n\n/**\n * Base class for interactions. Should not be used directly.\n */\npublic abstract class MapInteraction {\n\n    /**\n     * Actually initialized in constructor so should never be nullable.\n     */\n    @NonNull\n    Interaction coreInteraction;\n}\n"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/MapLoadingErrorDelegate.kt",
    "content": "package com.mapbox.maps\n\nimport androidx.annotation.RestrictTo\n\n/**\n * For internal usage.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\nfun interface MapLoadingErrorDelegate {\n\n  /**\n   * Send [MapLoadingError].\n   */\n  fun sendMapLoadingError(error: MapLoadingError)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/MapboxDelicateApi.kt",
    "content": "package com.mapbox.maps\n\n/**\n * Marks declarations that are **delicate** &mdash;\n * they have limited use-case and shall be used with care in general code.\n * Any use of a delicate declaration has to be carefully reviewed to make sure it is\n * properly used.\n * Carefully read documentation of any declaration marked as `MapboxDelicateApi`.\n */\n@RequiresOptIn(\n  level = RequiresOptIn.Level.WARNING,\n  message = \"This is a delicate API and its use requires care.\" +\n    \" Make sure you fully read and understand documentation of the declaration that is marked as a delicate API.\"\n)\n@Retention(AnnotationRetention.BINARY)\n@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR)\n@MustBeDocumented\nannotation class MapboxDelicateApi"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/MapboxExceptions.kt",
    "content": "package com.mapbox.maps\n\n/**\n * Mapbox exception class flagging map related [RuntimeException] did occur.\n */\nclass MapboxMapException(\n  exceptionText: String?\n) : RuntimeException(exceptionText)\n\n/**\n * Mapbox exception class flagging view annotation related [RuntimeException] did occur.\n */\nclass MapboxViewAnnotationException(\n  exceptionText: String?\n) : RuntimeException(exceptionText)\n\n/**\n * Mapbox exception class flagging location component plugin related [RuntimeException] did occur.\n */\nclass MapboxLocationComponentException(\n  exceptionText: String?\n) : RuntimeException(exceptionText)\n\n/**\n * Mapbox exception class flagging annotation plugin related [RuntimeException] did occur.\n */\nclass MapboxAnnotationException(\n  exceptionText: String?\n) : RuntimeException(exceptionText)\n\n/**\n * Mapbox exception class flagging camera animation plugin related [RuntimeException] did occur.\n */\nclass MapboxCameraAnimationException(\n  exceptionText: String?\n) : RuntimeException(exceptionText)\n\n/**\n * Mapbox exception class flagging style extension related [RuntimeException] did occur.\n */\nclass MapboxStyleException(\n  exceptionText: String?\n) : RuntimeException(exceptionText)\n\n/**\n * Mapbox exception thrown when any collection used to build GeoJson data is mutated.\n */\nclass MapboxConcurrentGeometryModificationException(\n  exceptionText: String,\n  @Suppress(\"UNUSED_PARAMETER\")\n  sourceId: String\n) : ConcurrentModificationException(exceptionText)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/MapboxExperimental.kt",
    "content": "package com.mapbox.maps\n\n/**\n * Annotation class to mark API as experimental.\n */\n@RequiresOptIn(\n  level = RequiresOptIn.Level.WARNING,\n  message = \"This API is experimental. It may be changed in the future without notice.\"\n)\n@Retention(AnnotationRetention.BINARY)\n@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY)\n@MustBeDocumented\nannotation class MapboxExperimental"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/MapboxLifecycleObserver.kt",
    "content": "package com.mapbox.maps\n\n/**\n * MapboxLifecycleObserver interface defines the lifecycle events that needed by MapView.\n */\ninterface MapboxLifecycleObserver {\n  /**\n   * Called to start rendering\n   */\n  fun onStart()\n\n  /**\n   * Called to stop rendering\n   */\n  fun onStop()\n\n  /**\n   * Called to dispose the renderer\n   */\n  fun onDestroy()\n\n  /**\n   * Called to reduce memory use\n   */\n  fun onLowMemory()\n\n  /**\n   * Called when the activity is resumed\n   */\n  fun onResume() {\n    // Default empty implementation for backward compatibility\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/MapboxLogger.kt",
    "content": "@file:JvmName(\"MapboxLogger\")\n\npackage com.mapbox.maps\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.LogThrottler\nimport com.mapbox.common.MapboxMapsAndroidLogger.SDK_IDENTIFIER\nimport com.mapbox.common.MapboxMapsAndroidLogger.internalIsLoggableD\nimport com.mapbox.common.MapboxMapsAndroidLogger.internalLogD\nimport com.mapbox.common.MapboxMapsAndroidLogger.internalLogE\nimport com.mapbox.common.MapboxMapsAndroidLogger.internalLogI\nimport com.mapbox.common.MapboxMapsAndroidLogger.internalLogW\n\n/**\n * Log Android error entry in the following format: E/Mapbox: [[SDK_IDENTIFIER]\\ [tag]] [message]\n */\nfun logE(tag: String, message: String) = internalLogE(tag, message)\n\n/**\n * Log Android error entry in the following format: E/Mapbox: [[SDK_IDENTIFIER]\\ [tag]] [message]\n * Internal version with optional log throttling support.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\nfun logE(tag: String, message: String, logThrottler: LogThrottler?) = internalLogE(tag, message, logThrottler)\n\n/**\n * Log Android warning entry in the following format: W/Mapbox: [[SDK_IDENTIFIER]\\ [tag]] [message]\n */\nfun logW(tag: String, message: String) = internalLogW(tag, message)\n\n/**\n * Log Android warning entry in the following format: W/Mapbox: [[SDK_IDENTIFIER]\\ [tag]] [message]\n * Internal version with optional log throttling support.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\nfun logW(tag: String, message: String, logThrottler: LogThrottler?) = internalLogW(tag, message, logThrottler)\n\n/**\n * Log Android info entry in the following format: I/Mapbox: [[SDK_IDENTIFIER]\\ [tag]] [message]\n */\nfun logI(tag: String, message: String) = internalLogI(tag, message)\n\n/**\n * Log Android info entry in the following format: I/Mapbox: [[SDK_IDENTIFIER]\\ [tag]] [message]\n * Internal version with optional log throttling support.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\nfun logI(tag: String, message: String, logThrottler: LogThrottler?) = internalLogI(tag, message, logThrottler)\n\n/**\n * Log Android debug entry in the following format: D/Mapbox: [[SDK_IDENTIFIER]\\ [tag]] [message]\n */\nfun logD(tag: String, message: String) = internalLogD(tag, message)\n\n/**\n * Log Android debug entry in the following format: D/Mapbox: [[SDK_IDENTIFIER]\\ [tag]] [message]\n * Internal version with optional log throttling support.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)\nfun logD(tag: String, message: String, logThrottler: LogThrottler?) = internalLogD(tag, message, logThrottler)\n\n/**\n * Log Android debug entry in the following format: D/Mapbox: [[SDK_IDENTIFIER]\\ [tag]] [message]\n * `message` lambda is only evaluated if the `debug` priority is enabled.\n */\ninline fun logD(tag: String, message: () -> String) {\n  if (isLoggableD()) {\n    logD(tag, message())\n  }\n}\n\n/**\n * Check if debug priority logging is enabled.\n *\n * This can be used to conditionally execute expensive operations that are only needed\n * for debug logging, avoiding unnecessary computation when debug logs are disabled.\n */\nfun isLoggableD() = internalIsLoggableD()"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/MapboxStyleManager.kt",
    "content": "package com.mapbox.maps\n\nimport android.graphics.Bitmap\nimport androidx.annotation.AnyThread\nimport androidx.annotation.CallSuper\nimport androidx.annotation.MainThread\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Feature\n\n/**\n * Wrapper class for [StyleManager] allowing to expose style related methods for MapboxMap.\n */\nopen class MapboxStyleManager @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) constructor(\n  /**\n   * Native style manager instance.\n   */\n  @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  val styleManager: StyleManager,\n  /**\n   * Current pixel ratio.\n   */\n  val pixelRatio: Float,\n  /**\n   * For internal usage.\n   */\n  @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  val mapLoadingErrorDelegate: MapLoadingErrorDelegate,\n) {\n  /**\n   * Returns the map style's default camera, if any, or a default camera otherwise.\n   * The map style's default camera is defined as follows:\n   * - [center](https://docs.mapbox.com/mapbox-gl-js/style-spec/#root-center)\n   * - [zoom](https://docs.mapbox.com/mapbox-gl-js/style-spec/#root-zoom)\n   * - [bearing](https://docs.mapbox.com/mapbox-gl-js/style-spec/#root-bearing)\n   * - [pitch](https://docs.mapbox.com/mapbox-gl-js/style-spec/#root-pitch)\n   *\n   * The style default camera is re-evaluated when a new style is loaded.\n   *\n   * @return The default [CameraOptions] of the current style in use.\n   */\n  open val styleDefaultCamera: CameraOptions\n    @CallSuper\n    @MainThread\n    get() {\n      ThreadChecker.throwIfNotMainThread()\n      return styleManager.styleDefaultCamera\n    }\n\n  /**\n   * Get the URI of the current style in use.\n   *\n   * @return A string containing a style URI.\n   */\n  open val styleURI: String\n    @CallSuper\n    @MainThread\n    get() {\n      ThreadChecker.throwIfNotMainThread()\n      return styleManager.styleURI\n    }\n\n  /**\n   * Get the JSON serialization string of the current style in use.\n   *\n   * @return A JSON string containing a serialized style.\n   */\n  open val styleJSON: String\n    @CallSuper\n    @MainThread\n    get() {\n      ThreadChecker.throwIfNotMainThread()\n      return styleManager.styleJSON\n    }\n\n  /**\n   * Returns the existing style layers.\n   *\n   * @return The list containing the information about existing style layer objects.\n   */\n  open val styleLayers: List<StyleObjectInfo>\n    @CallSuper\n    @MainThread\n    get() {\n      ThreadChecker.throwIfNotMainThread()\n      return styleManager.styleLayers\n    }\n\n  /**\n   * Returns the ordered slot identifiers of current style and its imports.\n   *\n   * @return The ordered list of slot identifiers.\n   */\n  @MapboxExperimental\n  open val styleSlots: List<String>\n    @CallSuper\n    @MainThread\n    get() {\n      ThreadChecker.throwIfNotMainThread()\n      return styleManager.styleSlots\n    }\n\n  /**\n   * Returns the existing style sources.\n   *\n   * @return The list containing the information about existing style source objects.\n   */\n  open val styleSources: List<StyleObjectInfo>\n    @CallSuper\n    @MainThread\n    get() {\n      ThreadChecker.throwIfNotMainThread()\n      return styleManager.styleSources\n    }\n\n  /**\n   * Get the glyph URL of the current style in use.\n   *\n   * @return A string containing a glyph URI.\n   */\n  @MapboxExperimental\n  @CallSuper\n  @MainThread\n  open fun getStyleGlyphURL(): String {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.styleGlyphURL\n  }\n\n  /**\n   * Load the style glyphs from a provided URL.\n   *\n   * @param url URL where the glyphs should be loaded from.\n   */\n  @MapboxExperimental\n  @CallSuper\n  @MainThread\n  open fun setStyleGlyphURL(url: String) {\n    ThreadChecker.throwIfNotMainThread()\n    styleManager.styleGlyphURL = url\n  }\n\n  /**\n   * Returns the map style's transition options. By default, the style parser will attempt\n   * to read the style default transition options, if any, fallback-ing to an immediate transition\n   * otherwise. Transition options can be overridden via [setStyleTransition], but the options are\n   * reset once a new style has been loaded.\n   *\n   * The style transition is re-evaluated when a new style is loaded.\n   *\n   * @return The [TransitionOptions] of the current style in use.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleTransition(): TransitionOptions {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.styleTransition\n  }\n\n  /**\n   * Overrides the map style's transition options with user-provided options.\n   *\n   * The style transition is re-evaluated when a new style is loaded.\n   *\n   * @param transitionOptions The [TransitionOptions].\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleTransition(transitionOptions: TransitionOptions) {\n    ThreadChecker.throwIfNotMainThread()\n    styleManager.styleTransition = transitionOptions\n  }\n\n  /**\n   * Returns the existing style imports.\n   *\n   * @return The list containing the information about existing style import objects.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleImports(): List<StyleObjectInfo> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.styleImports\n  }\n\n  /**\n   * Removes an existing style import.\n   *\n   * @param importId An identifier of the style import to remove.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun removeStyleImport(importId: String): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.removeStyleImport(importId)\n  }\n\n  /**\n   * Gets style import schema.\n   *\n   * @param importId A style import identifier.\n   *\n   * @return The style import schema or a string describing an error if the operation was not successful.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleImportSchema(importId: String): Expected<String, Value> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleImportSchema(importId)\n  }\n\n  /**\n   * Gets style import config.\n   *\n   * @return The style import configuration or a string describing an error if the operation was not successful.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleImportConfigProperties(importId: String): Expected<String, HashMap<String, StylePropertyValue>> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleImportConfigProperties(importId)\n  }\n\n  /**\n   * Gets the value of style import config.\n   *\n   * @param importId A style import identifier.\n   * @param config The style import config name.\n   * @return The style import config value.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleImportConfigProperty(\n    importId: String,\n    config: String\n  ): Expected<String, StylePropertyValue> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleImportConfigProperty(importId, config)\n  }\n\n  /**\n   * Sets style import config.\n   * This method can be used to perform batch update for a style import configurations.\n   *\n   * @param importId A style import identifier.\n   * @param configs A map of style import configurations.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleImportConfigProperties(\n    importId: String,\n    configs: HashMap<String, Value>\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleImportConfigProperties(importId, configs)\n  }\n\n  /**\n   * Sets a value to a style import config.\n   *\n   * @param importId A style import identifier.\n   * @param config The style import config name.\n   * @param value The style import config value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleImportConfigProperty(\n    importId: String,\n    config: String,\n    value: Value\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleImportConfigProperty(importId, config, value)\n  }\n\n  /**\n   * Adds new import to current style, loaded from a JSON string.\n   *\n   * @param importId Identifier of import to update.\n   * @param json The JSON string to be loaded directly as the import.\n   * @param config A map containing the configuration options of the import.\n   * @param importPosition The import will be positioned according to the ImportPosition parameters. If not specified, then the import is moved to the top of the import stack.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun addStyleImportFromJSON(\n    importId: String,\n    json: String,\n    config: HashMap<String, Value>?,\n    importPosition: ImportPosition?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addStyleImportFromJSON(importId, json, config, importPosition)\n  }\n\n  /**\n   * Adds new import to current style, loaded from an URI.\n   *\n   * @param importId Identifier of import to update.\n   * @param uri URI of the import.\n   * @param config A map containing the configuration options of the import.\n   * @param importPosition The import will be positioned according to the ImportPosition parameters. If not specified, then the import is moved to the top of the import stack.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun addStyleImportFromURI(\n    importId: String,\n    uri: String,\n    config: HashMap<String, Value>?,\n    importPosition: ImportPosition?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addStyleImportFromURI(importId, uri, config, importPosition)\n  }\n\n  /**\n   * Updates an existing import in the style.\n   * The function replaces the content of the import, with the content loaded from the provided data value.\n   * The configuration values of the import are merged with the configuration provided in the update.\n   *\n   * @param importId Identifier of import to update.\n   * @param json The JSON string to be loaded directly as the import.\n   * @param config A map containing the configuration options of the import.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun updateStyleImportWithJSON(\n    importId: String,\n    json: String,\n    config: HashMap<String, Value>?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.updateStyleImportWithJSON(\n      importId, json, config\n    )\n  }\n\n  /**\n   * Updates an existing import in the style.\n   * The function replaces the content of the import, with the content loaded from the provided URI.\n   * The configuration values of the import are merged with the configuration provided in the update.\n   *\n   * @param importId Identifier of import to update.\n   * @param uri URI of the import.\n   * @param config A map containing the configuration options of the import.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun updateStyleImportWithURI(\n    importId: String,\n    uri: String,\n    config: HashMap<String, Value>?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.updateStyleImportWithURI(importId, uri, config)\n  }\n\n  /**\n   * Moves import to position before another import, specified with `beforeId`. Order of imported styles corresponds to order of their layers.\n   *\n   * @param importId Identifier of import to move.\n   * @param importPosition The import will be positioned according to the ImportPosition parameters. If not specified, then the import is moved to the top of the import stack.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun moveStyleImport(\n    importId: String,\n    importPosition: ImportPosition?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.moveStyleImport(importId, importPosition)\n  }\n\n  /**\n   * Adds a new [style layer](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers).\n   *\n   * Runtime style layers are valid until they are either removed or a new style is loaded.\n   *\n   * @param parameters A map of style layer properties.\n   * @param position If not empty, the new layer will be positioned according to [LayerPosition] parameters.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun addStyleLayer(\n    parameters: Value,\n    position: LayerPosition?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addStyleLayer(parameters, position)\n  }\n\n  /**\n   * Adds a new [style custom layer](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers).\n   *\n   * Runtime style layers are valid until they are either removed or a new style is loaded.\n   *\n   * @param layerId A style layer identifier.\n   * @param layerHost The [CustomLayerHost].\n   * @param layerPosition If not empty, the new layer will be positioned according to [LayerPosition] parameters.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun addStyleCustomLayer(\n    layerId: String,\n    layerHost: CustomLayerHost,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addStyleCustomLayer(layerId, layerHost, layerPosition)\n  }\n\n  /**\n   * Adds a new [style layer](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers).\n   *\n   * Whenever a new style is being parsed and currently used style has persistent layers,\n   * an engine will try to do following:\n   *   - keep the persistent layer at its relative position\n   *   - keep the source used by a persistent layer\n   *   - keep images added through [addStyleImage] method\n   *\n   * In cases when a new style has the same layer, source or image resource, style's resources would be\n   * used instead and [MapLoadingError] event will be emitted.\n   *\n   * @param properties A map of style layer properties.\n   * @param layerPosition If not empty, the new layer will be positioned according to [LayerPosition] parameters.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun addPersistentStyleLayer(\n    properties: Value,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addPersistentStyleLayer(properties, layerPosition)\n  }\n\n  /**\n   * Adds a new [style custom layer](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers).\n   *\n   * Whenever a new style is being parsed and currently used style has persistent layers,\n   * an engine will try to do following:\n   *   - keep the persistent layer at its relative position\n   *   - keep the source used by a persistent layer\n   *   - keep images added through [addStyleImage] method\n   *\n   * In cases when a new style has the same layer, source or image resource, style's resources would be\n   * used instead and [MapLoadingError] event will be emitted.\n   *\n   * @param layerId A style layer identifier.\n   * @param layerHost The [CustomLayerHost].\n   * @param layerPosition If not empty, the new layer will be positioned according to [LayerPosition] parameters.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun addPersistentStyleCustomLayer(\n    layerId: String,\n    layerHost: CustomLayerHost,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addPersistentStyleCustomLayer(layerId, layerHost, layerPosition)\n  }\n\n  /**\n   * Checks if a style layer is persistent.\n   *\n   * @param layerId A style layer identifier.\n   * @return A string describing an error if the operation was not successful, boolean representing state otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun isStyleLayerPersistent(layerId: String): Expected<String, Boolean> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.isStyleLayerPersistent(layerId)\n  }\n\n  /**\n   * Removes an existing style layer.\n   *\n   * @param layerId An identifier of the style layer to remove.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun removeStyleLayer(layerId: String): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.removeStyleLayer(layerId)\n  }\n\n  /**\n   * Moves an existing style layer\n   *\n   * @param layerId Identifier of the style layer to move.\n   * @param layerPosition The layer will be positioned according to the LayerPosition parameters. If an empty LayerPosition\n   *                      is provided then the layer is moved to the top of the layer stack.\n   *\n   * @return A string describing an error if the operation was not successful, or empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun moveStyleLayer(\n    layerId: String,\n    layerPosition: LayerPosition?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.moveStyleLayer(layerId, layerPosition)\n  }\n\n  /**\n   * Checks whether a given style layer exists.\n   *\n   * @param layerId Style layer identifier.\n   *\n   * @return A True value if the given style layer exists, False otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun styleLayerExists(layerId: String): Boolean {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.styleLayerExists(layerId)\n  }\n\n  /**\n   * Gets the value of style layer property.\n   *\n   * @param layerId A style layer identifier.\n   * @param property The style layer property name.\n   * @return The [StylePropertyValue].\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleLayerProperty(layerId: String, property: String): StylePropertyValue {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleLayerProperty(layerId, property)\n  }\n\n  /**\n   * Sets a value to a style layer property.\n   *\n   * @param layerId A style layer identifier.\n   * @param property The style layer property name.\n   * @param value The style layer property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleLayerProperty(\n    layerId: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleLayerProperty(layerId, property, value)\n  }\n\n  /**\n   * Sets a value to a style layer property asynchronously.\n   *\n   * This method provides asynchronous argument parsing which is beneficial when working with\n   * large or complex style expressions that could block the main thread during parsing.\n   * The operation is performed on a background thread and the callback is invoked on the\n   * main thread once the operation completes.\n   *\n   * Values will be applied asynchronously at some moment in the future. If multiple calls\n   * to this method are made, the corresponding values will be applied in the same order\n   * as the calls were made.\n   *\n   * Note: This method should be used only if the given argument is a massive expression\n   * and its parsing would block the main thread otherwise. For simple property values,\n   * prefer the synchronous [setStyleLayerProperty] method.\n   *\n   * If the style is modified during this asynchronous method call, the scheduled layer\n   * property change will still be applied as long as a layer with the original name and\n   * type still exists.\n   *\n   * @param layerId A style layer identifier.\n   * @param property The style layer property name.\n   * @param value The style layer property value.\n   * @param callback Called once the request is complete or an error occurred.\n   *\n   * @return A [Cancelable] object that can be used to cancel the asynchronous operation.\n   */\n  @MapboxExperimental\n  @CallSuper\n  @AnyThread\n  open fun setStyleLayerPropertyAsync(\n    layerId: String,\n    property: String,\n    value: Value,\n    callback: AsyncOperationResultCallback\n  ): Cancelable {\n    return styleManager.setStyleLayerPropertyAsync(layerId, property, value, callback)\n  }\n\n  /**\n   * Gets style layer properties.\n   *\n   * @return The style layer properties or a string describing an error if the operation was not successful.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleLayerProperties(layerId: String): Expected<String, Value> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleLayerProperties(layerId)\n  }\n\n  /**\n   * Sets style layer properties.\n   * This method can be used to perform batch update for a style layer properties. The structure of a\n   * provided [properties] value must conform to a format for a corresponding [layer type](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/).\n   * Modification of a layer [id](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#id) and/or a [layer type] (https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#type) is not allowed.\n   *\n   * @param layerId A style layer identifier.\n   * @param properties A map of style layer properties.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleLayerProperties(layerId: String, properties: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleLayerProperties(layerId, properties)\n  }\n\n  /**\n   * Experimental. Sets style layer properties asynchronously.\n   *\n   * This method can be used to perform batch update for a style layer properties with asynchronous\n   * argument parsing which is beneficial when working with large or complex style expressions that\n   * could block the main thread during parsing. The operation is performed on a background thread\n   * and the callback is invoked on the main thread once the operation completes.\n   *\n   * Properties will be applied asynchronously at some moment in the future. If multiple calls\n   * to this method are made, the corresponding properties will be applied in the same order\n   * as the calls were made.\n   *\n   * Note: This method should be used only if the given arguments contain massive expressions\n   * and their parsing would block the main thread otherwise. For simple property values,\n   * prefer the synchronous [setStyleLayerProperties] method.\n   *\n   * The structure of the provided [properties] value must conform to a format for a corresponding\n   * [layer type](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/).\n   * Modification of a layer [id](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#id) and/or\n   * a [layer type](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#type) is not allowed.\n   *\n   * If the style is modified during this asynchronous method call, the scheduled layer\n   * properties change will still be applied as long as a layer with the original name and\n   * type still exists.\n   *\n   * @param layerId A style layer identifier.\n   * @param properties A map of style layer properties.\n   * @param callback Called once the request is complete or an error occurred.\n   *\n   * @return A [Cancelable] object that can be used to cancel the asynchronous operation.\n   */\n  @CallSuper\n  @AnyThread\n  @MapboxExperimental\n  open fun setStyleLayerPropertiesAsync(\n    layerId: String,\n    properties: Value,\n    callback: AsyncOperationResultCallback\n  ): Cancelable {\n    return styleManager.setStyleLayerPropertiesAsync(layerId, properties, callback)\n  }\n\n  /**\n   * Adds a new [style source](https://docs.mapbox.com/mapbox-gl-js/style-spec/#sources).\n   * Note: When adding a geojson source, this method does not synchronously parse the GeoJSON data.\n   * The events API shall be used to make sure the provided GeoJSON data is valid.\n   * In case the GeoJSON is valid, a [MapLoaded] event will be propagated. In case of errors, a [MapLoadingError] event will be propagated instead.\n   *\n   * @param sourceId An identifier for the style source.\n   * @param properties A map of style source properties.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun addStyleSource(sourceId: String, properties: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addStyleSource(sourceId, properties)\n  }\n\n  /**\n   * Gets the value of style source property.\n   *\n   * @param sourceId A style source identifier.\n   * @param property The style source property name.\n   * @return The [StylePropertyValue] object.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleSourceProperty(sourceId: String, property: String): StylePropertyValue {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleSourceProperty(sourceId, property)\n  }\n\n  /**\n   * Sets a value to a style source property.\n   * Note: When setting the \"data\" property of a geojson source, this method does not synchronously parse the GeoJSON data.\n   * The events API shall be used to make sure the provided GeoJSON data is valid.\n   * In case the GeoJSON is valid, a [MapLoaded] event will be propagated. In case of errors, a [MapLoadingError] event will be propagated instead.\n   *\n   * @param sourceId A style source identifier.\n   * @param property The style source property name.\n   * @param value The style source property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleSourceProperty(\n    sourceId: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleSourceProperty(sourceId, property, value)\n  }\n\n  /**\n   * Sets a value to a style source property for a source that belongs to a specific style import.\n   *\n   * This method allows modification of source properties within imported styles, enabling\n   * fine-grained control over sources from different style fragments or imports.\n   * If `importId` is empty, this method falls back to updating the root style.\n   *\n   * @param importId An identifier of the style import containing the target source.\n   * @param sourceId A style source identifier.\n   * @param property The style source property name.\n   * @param value The style source property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MapboxExperimental\n  @CallSuper\n  @MainThread\n  open fun setStyleSourceProperty(\n    importId: String,\n    sourceId: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleSourceProperty(importId, sourceId, property, value)\n  }\n\n  /**\n   * Gets style source properties.\n   *\n   * @param sourceId A style source identifier.\n   *\n   * @return The style source properties or a string describing an error if the operation was not successful.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleSourceProperties(sourceId: String): Expected<String, Value> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleSourceProperties(sourceId)\n  }\n\n  /**\n   * Sets style source properties.\n   *\n   * This method can be used to perform batch update for a style source properties. The structure of a\n   * provided [properties] value must conform to a format for a corresponding [source type](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/).\n   * Modification of a source [type](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#type) is not allowed.\n   *\n   * @param sourceId A style source identifier.\n   * @param properties A map of Style source properties.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleSourceProperties(\n    sourceId: String,\n    properties: Value\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleSourceProperties(sourceId, properties)\n  }\n\n  /**\n   * Add additional features to a GeoJSON style source.\n   *\n   * This method is thread-safe.\n   *\n   * Note that when calling this method from a thread other than the main thread, the return value does\n   * not contain the actual operation status. To ensure the success of the operation, use the events API,\n   * which will propagate a [MapLoaded] event upon success or a [MapLoadingError] event upon failure.\n   *\n   * Partially updating a GeoJSON source is not compatible with using shared cache and generated IDs.\n   * It is important to ensure that every feature in the GeoJSON style source, as well as the newly added\n   * feature, has a unique ID (or a unique promote ID if in use). Failure to provide unique IDs will result\n   * in a [MapLoadingError].\n   *\n   * The method allows the user to provide a data ID, which will be returned as the dataId parameter in the\n   * [SourceDataLoaded] event. However, it's important to note that multiple partial updates can be queued\n   * for the same GeoJSON source when ongoing source parsing is taking place. In these cases, the partial\n   * updates will be applied to the source in batches. Only the data ID provided in the most recent call within\n   * each batch will be included in the [SourceDataLoaded] event. If no data ID is provided in the most recent\n   * call, the data ID in the [SourceDataLoaded]event will be null.\n   *\n   * @param sourceId The identifier of the style source.\n   * @param dataId An arbitrary string used to track the given GeoJSON data, empty string means null ID.\n   * @param features An array of GeoJSON features to be added to the source.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @AnyThread\n  open fun addGeoJSONSourceFeatures(\n    sourceId: String,\n    dataId: String,\n    features: List<Feature>\n  ): Expected<String, None> {\n    return styleManager.addGeoJSONSourceFeatures(sourceId, dataId, features)\n  }\n\n  /**\n   * Update existing features in a GeoJSON style source.\n   *\n   * This method is thread safe.\n   *\n   * Note that when calling this method from a thread other than the main thread, the return value does\n   * not contain the actual operation status. To ensure the success of the operation, use the events API,\n   * which will propagate a [MapLoaded] event upon success or a [MapLoadingError] event upon failure.\n   *\n   * Partially updating a GeoJSON source is not compatible with using shared cache and generated IDs.\n   * It is important to ensure that every feature in the GeoJSON style source, as well as the newly added\n   * feature, has a unique ID (or a unique promote ID if in use). Failure to provide unique IDs will result\n   * in a [MapLoadingError].\n   *\n   * The method allows the user to provide a data ID, which will be returned as the dataId parameter in the\n   * [SourceDataLoaded] event. However, it's important to note that multiple partial updates can be queued\n   * for the same GeoJSON source when ongoing source parsing is taking place. In these cases, the partial\n   * updates will be applied to the source in batches. Only the data ID provided in the most recent call within\n   * each batch will be included in the [SourceDataLoaded] event. If no data ID is provided in the most recent\n   * call, the data ID in the [SourceDataLoaded]event will be null.\n   *\n   * @param sourceId A style source identifier.\n   * @param dataId An arbitrary string used to track the given GeoJSON data, empty string means null ID.\n   * @param features the GeoJSON features to be updated in the source.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @AnyThread\n  open fun updateGeoJSONSourceFeatures(\n    sourceId: String,\n    dataId: String,\n    features: List<Feature>\n  ): Expected<String, None> {\n    return styleManager.updateGeoJSONSourceFeatures(sourceId, dataId, features)\n  }\n\n  /**\n   * Remove features from a GeoJSON style source.\n   *\n   * Note that when calling this method from a thread other than the main thread, the return value does\n   * not contain the actual operation status. To ensure the success of the operation, use the events API,\n   * which will propagate a [MapLoaded] event upon success or a [MapLoadingError] event upon failure.\n   *\n   * Partially updating a GeoJSON source is not compatible with using shared cache and generated IDs.\n   * It is important to ensure that every feature in the GeoJSON style source, as well as the newly added\n   * feature, has a unique ID (or a unique promote ID if in use). Failure to provide unique IDs will result\n   * in a [MapLoadingError].\n   *\n   * The method allows the user to provide a data ID, which will be returned as the dataId parameter in the\n   * [SourceDataLoaded] event. However, it's important to note that multiple partial updates can be queued\n   * for the same GeoJSON source when ongoing source parsing is taking place. In these cases, the partial\n   * updates will be applied to the source in batches. Only the data ID provided in the most recent call within\n   * each batch will be included in the [SourceDataLoaded] event. If no data ID is provided in the most recent\n   * call, the data ID in the [SourceDataLoaded]event will be null.\n   *\n   * @param sourceId A style source identifier.\n   * @param dataId An arbitrary string used to track the given GeoJSON data, empty string means null ID.\n   * @param featureIds the Ids of the features that need to be removed from the source.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @AnyThread\n  open fun removeGeoJSONSourceFeatures(\n    sourceId: String,\n    dataId: String,\n    featureIds: List<String>\n  ): Expected<String, None> {\n    return styleManager.removeGeoJSONSourceFeatures(sourceId, dataId, featureIds)\n  }\n\n  /**\n   * Updates the image of an [image style source](https://docs.mapbox.com/mapbox-gl-js/style-spec/#sources-image).\n   *\n   * @param sourceId A style source identifier.\n   * @param image An [Image].\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun updateStyleImageSourceImage(sourceId: String, image: Image): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.updateStyleImageSourceImage(sourceId, image)\n  }\n\n  /**\n   * Removes an existing style source.\n   *\n   * @param sourceId An identifier of the style source to remove.\n   */\n  @CallSuper\n  @MainThread\n  open fun removeStyleSource(sourceId: String): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.removeStyleSource(sourceId)\n  }\n\n  /**\n   * Removes an existing style source without checking if it's being used by any other component.\n   *\n   * @param sourceId An identifier of the style source to remove.\n   */\n  @CallSuper\n  @MainThread\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  open fun removeStyleSourceUnchecked(sourceId: String): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.removeStyleSourceUnchecked(sourceId)\n  }\n\n  /**\n   * Checks whether a given style source exists.\n   *\n   * @param sourceId A style source identifier.\n   *\n   * @return True if the given source exists, False otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun styleSourceExists(sourceId: String): Boolean {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.styleSourceExists(sourceId)\n  }\n\n  /**\n   * Sets the style global [atmosphere](https://docs.mapbox.com/mapbox-gl-js/style-spec/#fog) properties.\n   *\n   * @param properties A map of style atmosphere properties values, with their names as a key.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleAtmosphere(properties: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleAtmosphere(properties)\n  }\n\n  /**\n   * Gets the value of a style atmosphere property.\n   *\n   * @param property The style atmosphere property name.\n   * @return The style atmosphere [StylePropertyValue].\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleAtmosphereProperty(property: String): StylePropertyValue {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleAtmosphereProperty(property)\n  }\n\n  /**\n   * Sets a value to the the style atmosphere property.\n   *\n   * @param property The style atmosphere property name.\n   * @param value The style atmosphere property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleAtmosphereProperty(property: String, value: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleAtmosphereProperty(property, value)\n  }\n\n  /**\n   * Experimental. Sets the style global snow properties.\n   *\n   * @param properties A map of style snow properties values, with their names as a key.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setStyleSnow(properties: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleSnow(properties)\n  }\n\n  /**\n   * Gets the value of a style snow property.\n   *\n   * @param property The style snow property name.\n   * @return The style snow property value.\n   */\n  @MainThread\n  @CallSuper\n  @MapboxExperimental\n  fun getStyleSnowProperty(property: String): StylePropertyValue {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleSnowProperty(property)\n  }\n\n  /**\n   * Experimental. Sets the style global snow property.\n   *\n   * @param property the property name\n   * @param value the property value\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setStyleSnowProperty(property: String, value: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleSnowProperty(property, value)\n  }\n\n  /**\n   * Experimental. Sets the style global rain properties.\n   *\n   * @param properties A map of style rain properties values, with their names as a key.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @CallSuper\n  @MapboxExperimental\n  fun setStyleRain(properties: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleRain(properties)\n  }\n\n  /**\n   * Gets the value of a style rain property.\n   *\n   * @param property The style rain property name.\n   * @return The style rain property value.\n   */\n  @MainThread\n  @CallSuper\n  @MapboxExperimental\n  fun getStyleRainProperty(property: String): StylePropertyValue {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleRainProperty(property)\n  }\n\n  /**\n   * Experimental. Sets the style global rain property.\n   *\n   * @param property the property name\n   * @param value the property value\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MainThread\n  @CallSuper\n  @MapboxExperimental\n  fun setStyleRainProperty(property: String, value: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleRainProperty(property, value)\n  }\n\n  /**\n   * Sets the style global [terrain](https://docs.mapbox.com/mapbox-gl-js/style-spec/#terrain) properties.\n   *\n   * @param properties A map of style terrain properties values, with their names as a key.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleTerrain(properties: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleTerrain(properties)\n  }\n\n  /**\n   * Gets the value of a style terrain property.\n   *\n   * @param property The style terrain property name.\n   * @return The style terrain property value.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleTerrainProperty(property: String): StylePropertyValue {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleTerrainProperty(property)\n  }\n\n  /**\n   * Sets a value to the the style terrain property.\n   *\n   * @param property The style terrain property name.\n   * @param value The style terrain property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleTerrainProperty(property: String, value: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleTerrainProperty(property, value)\n  }\n\n  /**\n   * Sets the map's [projection](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/). If called with NULL, the map will reset to Mercator.\n   *\n   * @param properties A map of style projection values, with their names as a key.\n   * Supported projections are:\n   *  * Mercator\n   *  * Globe\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleProjection(properties: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleProjection(properties)\n  }\n\n  /**\n   * Gets the value of a style projection property.\n   *\n   * @param property The style projection property name.\n   * @return The style projection property value.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleProjectionProperty(property: String): StylePropertyValue {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleProjectionProperty(property)\n  }\n\n  /**\n   * Sets a value to the the style projection property.\n   *\n   * @param property The style projection property name.\n   * @param value The style projection property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleProjectionProperty(property: String, value: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleProjectionProperty(property, value)\n  }\n\n  /**\n   * Get an image from the style.\n   *\n   * @param imageId The identifier of the image.\n   *\n   * @return The image for the given [imageId], or empty if no image is associated with the [imageId].\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleImage(imageId: String): Image? {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleImage(imageId)\n  }\n\n  /**\n   * Adds an image to be used in the style. This API can also be used for updating\n   * an image. If the image for a given [imageId] was already added, it gets replaced by the new image.\n   *\n   * The image can be used in [`icon-image`](https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image),\n   * [`fill-pattern`](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern),\n   * [`line-pattern`](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern) and\n   * [`text-field`](https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-text-field) properties.\n   *\n   * @param imageId An identifier of the image.\n   * @param scale The pixel density of the provided image. The image's pixel dimensions are divided\n   * by this value to determine its display size in density-independent pixels. For example, a\n   * 100x100 pixel image with scale=2.0 will be displayed as 50x50 density-independent pixels.\n   * @param image A pixel data of the image.\n   * @param sdf An option to treat whether image is SDF(signed distance field) or not.\n   * @param stretchX An array of two-element arrays, consisting of two numbers that represent\n   * the from position and the to position of areas that can be stretched horizontally.\n   * @param stretchY An array of two-element arrays, consisting of two numbers that represent\n   * the from position and the to position of areas that can be stretched vertically.\n   * @param content An array of four numbers, with the first two specifying the left, top\n   * corner, and the last two specifying the right, bottom corner. If present, and if the\n   * icon uses icon-text-fit, the symbol's text will be fit inside the content box.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun addStyleImage(\n    imageId: String,\n    scale: Float,\n    image: Image,\n    sdf: Boolean,\n    stretchX: List<ImageStretches>,\n    stretchY: List<ImageStretches>,\n    content: ImageContent?\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addStyleImage(imageId, scale, image, sdf, stretchX, stretchY, content)\n  }\n\n  /**\n   * Removes an image from the style.\n   *\n   * @param imageId The identifier of the image to remove.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun removeStyleImage(imageId: String): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.removeStyleImage(imageId)\n  }\n\n  /**\n   * Checks whether an image exists.\n   *\n   * @param imageId The identifier of the image.\n   *\n   * @return True if image exists, false otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun hasStyleImage(imageId: String): Boolean {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.hasStyleImage(imageId)\n  }\n\n  /**\n   * Adds a custom geometry to be used in the style. To add the data, implement the [CustomGeometrySourceOptions.Builder.fetchTile@CallSuper\n  @MainThread\n  open function] callback in the options and call [setStyleCustomGeometrySourceTileData]\n   *\n   * @param sourceId A style source identifier\n   * @param options The [CustomGeometrySourceOptions] for the custom geometry.\n   */\n  @CallSuper\n  @MainThread\n  open fun addStyleCustomGeometrySource(\n    sourceId: String,\n    options: CustomGeometrySourceOptions\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addStyleCustomGeometrySource(sourceId, options)\n  }\n\n  /**\n   * Set tile data of a custom geometry.\n   *\n   * @param sourceId A style source identifier.\n   * @param tileId A [CanonicalTileID] of the tile.\n   * @param featureCollection An array with the features to add.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleCustomGeometrySourceTileData(\n    sourceId: String,\n    tileId: CanonicalTileID,\n    featureCollection: MutableList<Feature>\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleCustomGeometrySourceTileData(sourceId, tileId, featureCollection)\n  }\n\n  /**\n   * Invalidate tile for provided custom geometry source.\n   *\n   * @param sourceId A style source identifier,.\n   * @param tileId A [CanonicalTileID] of the tile.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun invalidateStyleCustomGeometrySourceTile(\n    sourceId: String,\n    tileId: CanonicalTileID\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.invalidateStyleCustomGeometrySourceTile(sourceId, tileId)\n  }\n\n  /**\n   * Invalidate region for provided custom geometry source.\n   *\n   * @param sourceId A style source identifier\n   * @param coordinateBounds A [CoordinateBounds] object.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun invalidateStyleCustomGeometrySourceRegion(\n    sourceId: String,\n    coordinateBounds: CoordinateBounds\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.invalidateStyleCustomGeometrySourceRegion(sourceId, coordinateBounds)\n  }\n\n  /**\n   * Check if the style is completely loaded.\n   *\n   * Note: The style specified sprite would be marked as loaded even with sprite loading error (An error will be emitted via [MapLoadingError]).\n   * Sprite loading error is not fatal and we don't want it to block the map rendering, thus the function will still return True if style and sources are fully loaded.\n   *\n   * @return True if the style JSON contents, the style specified sprite and sources are all loaded, otherwise returns False.\n   *\n   */\n  @CallSuper\n  @MainThread\n  open fun isStyleLoaded(): Boolean {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.isStyleLoaded\n  }\n\n  /**\n   * Note! This is an experimental feature. It can be changed or removed in future versions.\n   *\n   * Adds a custom raster source to be used in the style. To add the data, implement the fetchTileFunction callback in the options and call setStyleCustomRasterSourceTileData()\n   *\n   * @param sourceId A style source identifier\n   * @param options The `custom raster source options` for the custom raster source.\n   */\n  @MapboxExperimental\n  @CallSuper\n  @MainThread\n  open fun addStyleCustomRasterSource(\n    sourceId: String,\n    options: CustomRasterSourceOptions\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addStyleCustomRasterSource(sourceId, options)\n  }\n\n  /**\n   * Note! This is an experimental feature. It can be changed or removed in future versions.\n   *\n   * Set tile data for raster tiles.\n   *\n   * The provided data is not cached, and the implementation will call the fetch callback each time the tile reappears.\n   *\n   * @param sourceId A style source identifier.\n   * @param tiles List with new tile data.\n   */\n  @MapboxExperimental\n  @CallSuper\n  @MainThread\n  open fun setStyleCustomRasterSourceTileData(\n    sourceId: String,\n    tiles: List<CustomRasterSourceTileData>,\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleCustomRasterSourceTileData(sourceId, tiles)\n  }\n\n  /**\n   * Gets the value of the style light property.\n   *\n   * @param id light id.\n   * @param property light property name.\n   *\n   * @return The value of property in the light.\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleLightProperty(id: String, property: String): StylePropertyValue {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.getStyleLightProperty(id, property)\n  }\n\n  /**\n   * Sets a value to the light property.\n   *\n   * @param id light id.\n   * @param property light property name.\n   * @param value light property value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleLightProperty(\n    id: String,\n    property: String,\n    value: Value\n  ): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleLightProperty(id, property, value)\n  }\n\n  /**\n   * Gets added lights to the style.\n   *\n   * @return list of [StyleObjectInfo].\n   */\n  @CallSuper\n  @MainThread\n  open fun getStyleLights(): MutableList<StyleObjectInfo> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.styleLights\n  }\n\n  /**\n   * Sets lights to the style.\n   *\n   * @param lights light value.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  open fun setStyleLights(lights: Value): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleLights(lights)\n  }\n\n  /**\n   * Adds a model to be used in the style. This API can also be used for updating\n   * a model. If the model for a given `modelId` was already added, it gets replaced by the new model.\n   *\n   * The model can be used in `model-id` property in model layer.\n   *\n   * @param modelId An identifier of the model.\n   * @param modelUri A URI for the model.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MapboxExperimental\n  @CallSuper\n  @MainThread\n  open fun addStyleModel(modelId: String, modelUri: String): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.addStyleModel(modelId, modelUri)\n  }\n\n  /**\n   * Removes a model from the style.\n   *\n   * @param modelId The identifier of the model to remove.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @MapboxExperimental\n  @CallSuper\n  @MainThread\n  open fun removeStyleModel(modelId: String): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.removeStyleModel(modelId)\n  }\n\n  /**\n   * Checks whether a model exists.\n   *\n   * @param modelId The identifier of the model.\n   *\n   * @return True if model exists, false otherwise.\n   */\n  @MapboxExperimental\n  @CallSuper\n  @MainThread\n  open fun hasStyleModel(modelId: String): Boolean {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.hasStyleModel(modelId)\n  }\n\n  /**\n   * Set geojson source data.\n   * Call may take significant time for parsing and marshalling depending on the data size.\n   *\n   * Direct method use is not recommended, consider using `GeoJsonSource.geometry`, `GeoJsonSource.feature`, `GeoJsonSource.featureCollection`, `GeoJsonSource.data` instead.\n   *\n   * @param sourceId the id of the GeoJSON source\n   * @param dataId an arbitrary string used to track the given GeoJSON data, empty string means null ID\n   * @param data the GeoJson source data\n   *\n   */\n  @CallSuper\n  @AnyThread\n  open fun setStyleGeoJSONSourceData(\n    sourceId: String,\n    dataId: String,\n    data: GeoJSONSourceData\n  ): Expected<String, None> {\n    return styleManager.setStyleGeoJSONSourceData(sourceId, dataId, data)\n  }\n\n  /**\n   * Adds an image to be used in the style. This API can also be used for updating\n   * an image. If the image id was already added, it gets replaced by the new image.\n   *\n   * The image can be used in `icon-image`, `fill-pattern`, and `line-pattern`.\n   *\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image](https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern)\n   *\n   * The image's pixel dimensions are assumed to match the device's screen density. They are divided\n   * by the screen density to determine the display size in density-independent pixels. To add an\n   * image with a different density, use [addStyleImage] with an explicit scale parameter.\n   *\n   * @param imageId ID of the image.\n   * @param image Pixel data of the image.\n   * @param sdf Option to treat whether image is SDF(signed distance field) or not.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  fun addImage(\n    imageId: String,\n    image: Image,\n    sdf: Boolean\n  ): Expected<String, None> =\n    addStyleImage(imageId, pixelRatio, image, sdf, listOf(), listOf(), null)\n\n  /**\n   * Adds an image to be used in the style. This API can also be used for updating\n   * an image. If the image id was already added, it gets replaced by the new image.\n   *\n   * The image can be used in `icon-image`, `fill-pattern`, and `line-pattern`.\n   *\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image](https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern)\n   *\n   * The image's pixel dimensions are assumed to match the device's screen density. They are divided\n   * by the screen density to determine the display size in density-independent pixels. To add an\n   * image with a different density, use [addStyleImage] with an explicit scale parameter.\n   *\n   * @param imageId ID of the image.\n   * @param image Pixel data of the image.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  fun addImage(\n    imageId: String,\n    image: Image\n  ): Expected<String, None> = addImage(imageId, image, false)\n\n  /**\n   * Adds an image to be used in the style. This API can also be used for updating\n   * an image. If the image id was already added, it gets replaced by the new image.\n   *\n   * The image can be used in `icon-image`, `fill-pattern`, and `line-pattern`.\n   *\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image](https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern)\n   *\n   * The bitmap's pixel dimensions are assumed to match the device's screen density. They are divided\n   * by the screen density to determine the display size in density-independent pixels. To add an\n   * image with a different density, use [addStyleImage] with an explicit scale parameter.\n   *\n   * @param imageId ID of the image.\n   * @param bitmap The bitmap image.\n   * @param sdf Option to treat whether image is SDF(signed distance field) or not.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @OptIn(MapboxDelicateApi::class)\n  @CallSuper\n  @MainThread\n  fun addImage(\n    imageId: String,\n    bitmap: Bitmap,\n    sdf: Boolean\n  ): Expected<String, None> {\n    return addImage(\n      imageId,\n      bitmap.toMapboxImage(),\n      sdf\n    )\n  }\n\n  /**\n   * Adds an image to be used in the style. This API can also be used for updating\n   * an image. If the image id was already added, it gets replaced by the new image.\n   *\n   * The image can be used in `icon-image`, `fill-pattern`, and `line-pattern`.\n   *\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image](https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern)\n   * See [https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern](https://www.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern)\n   *\n   * The bitmap's pixel dimensions are assumed to match the device's screen density. They are divided\n   * by the screen density to determine the display size in density-independent pixels. To add an\n   * image with a different density, use [addStyleImage] with an explicit scale parameter.\n   *\n   * @param imageId ID of the image.\n   * @param bitmap The bitmap image.\n   *\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  fun addImage(\n    imageId: String,\n    bitmap: Bitmap\n  ): Expected<String, None> = addImage(imageId, bitmap, false)\n\n  /**\n   * Returns the available featuresets in the currently loaded style.\n   *\n   * Note: This function should only be called after the style is fully loaded; otherwise, the result may be unreliable.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun getFeaturesets(): List<FeaturesetDescriptor> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.styleFeaturesets\n  }\n\n  /**\n   * Reset color theme to initial color theme.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  open fun setInitialStyleColorTheme() {\n    ThreadChecker.throwIfNotMainThread()\n    styleManager.setInitialStyleColorTheme()\n  }\n\n  /**\n   * Set color theme to style.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param colorTheme for the style. Providing null value deletes the theme.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setStyleColorTheme(colorTheme: ColorTheme?): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setStyleColorTheme(colorTheme)\n  }\n\n  /**\n   * Set color theme to style.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param base64 Base64 encoded representation of an LUT image. The height of the image cannot be more than 32 pixels.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setStyleColorTheme(base64: String): Expected<String, None> {\n    return setStyleColorTheme(\n      ColorTheme.valueOf(\n        StylePropertyValue(\n          Value.valueOf(base64), StylePropertyValueKind.CONSTANT\n        )\n      )\n    )\n  }\n\n  /**\n   * Set color theme to style.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param bitmap The bitmap image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @OptIn(MapboxDelicateApi::class)\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setStyleColorTheme(bitmap: Bitmap): Expected<String, None> {\n    return setStyleColorTheme(ColorTheme.valueOf(bitmap.toMapboxImage()))\n  }\n\n  /**\n   * Set color theme to style.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param image The image data of an LUT image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setStyleColorTheme(image: Image): Expected<String, None> {\n    return setStyleColorTheme(ColorTheme.valueOf(image))\n  }\n\n  /**\n   * Set color theme to style import.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param importId String id of the style import to which the color theme will be applied.\n   * @param colorTheme for the style. Providing null value deletes the theme.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setImportColorTheme(importId: String, colorTheme: ColorTheme?): Expected<String, None> {\n    ThreadChecker.throwIfNotMainThread()\n    return styleManager.setImportColorTheme(importId, colorTheme)\n  }\n\n  /**\n   * Set color theme to style import.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param importId String id of the style import to which the color theme will be applied.\n   * @param base64 Base64 encoded representation of an LUT image. The height of the image cannot be more than 32 pixels.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setImportColorTheme(importId: String, base64: String): Expected<String, None> {\n    return setImportColorTheme(\n      importId,\n      ColorTheme.valueOf(\n        StylePropertyValue(\n          Value.valueOf(base64), StylePropertyValueKind.CONSTANT\n        )\n      )\n    )\n  }\n\n  /**\n   * Set color theme to style import.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param importId String id of the style import to which the color theme will be applied.\n   * @param bitmap The bitmap image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @OptIn(MapboxDelicateApi::class)\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setImportColorTheme(importId: String, bitmap: Bitmap): Expected<String, None> {\n    return setImportColorTheme(importId, ColorTheme.valueOf(bitmap.toMapboxImage()))\n  }\n\n  /**\n   * Set color theme to style import.\n   * Color theme can be used as a global modifier for the colors of the style and style imports.\n   *  In order to use custom color theme you need to provide an image that will represent LUT (color grading lookup table).\n   *  Image height must be less or equal to 32 pixels and width of the image should be equal to the height squared.\n   *  Either image or base64 image representation should be provided. Providing null value deletes the theme.\n   *\n   * @param importId String id of the style import to which the color theme will be applied.\n   * @param image The image data of an LUT image.\n   * @return A string describing an error if the operation was not successful, empty otherwise.\n   */\n  @CallSuper\n  @MainThread\n  @MapboxExperimental\n  open fun setImportColorTheme(importId: String, image: Image): Expected<String, None> {\n    return setImportColorTheme(importId, ColorTheme.valueOf(image))\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/ThreadChecker.kt",
    "content": "package com.mapbox.maps\n\nimport android.content.pm.PackageManager\nimport android.os.Looper\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.MapboxSDKCommon\nimport com.mapbox.maps.exception.WorkerThreadException\n\n/**\n * Utility object to validate correct threading integration.\n * Thread checking executes for debug builds only and can be fully disabled with the manifest\n * configuration shown below.\n *\n * ```xml\n *  <meta-data\n *    android:name=\"com.mapbox.maps.ThreadChecker\"\n *    android:value=\"false\" />\n * ```\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\nobject ThreadChecker {\n\n  // Captures if the consumer application is running in debug\n  private val enabled: Boolean\n\n  // Captures if the consumer application is running in debug\n  private val debug: Boolean\n\n  // Constants\n  private const val TAG = \"ThreadChecker\"\n  private const val DEBUG_FIELD = \"DEBUG\"\n  private const val METADATA_KEY = \"com.mapbox.maps.ThreadChecker\"\n  private const val DEBUG_LOOKUP_FAILED = \"Unable to lookup build config of application.\"\n  private const val METADATA_LOOKUP_FAILED = \"No boolean metadata found for key $METADATA_KEY\"\n\n  init {\n    enabled = resolveEnabledState()\n    debug = resolveDebugState()\n  }\n\n  /**\n   * Perform manifest metadata lookup for boolean value of com.mapbox.maps.ThreadChecker/\n   * Returns true by default.\n   */\n  private fun resolveEnabledState(): Boolean {\n    var enabled = true\n    try {\n      val context = MapboxSDKCommon.getContext()\n      val packageManager: PackageManager = context.packageManager\n      @Suppress(\"DEPRECATION\")\n      val appInfo = packageManager.getApplicationInfo(\n        context.packageName,\n        PackageManager.GET_META_DATA\n      )\n\n      val metaData = appInfo.metaData\n      if (metaData.containsKey(METADATA_KEY)) {\n        enabled = metaData.getBoolean(METADATA_KEY)\n      }\n    } catch (metaLookupException: Exception) {\n      logI(TAG, \"$METADATA_LOOKUP_FAILED ${metaLookupException.localizedMessage}\")\n    }\n    return enabled\n  }\n\n  /**\n   * Perform build config look up to determine if the app is running in debug mode.\n   * Returns false by default if lookup fails.\n   */\n  private fun resolveDebugState(): Boolean {\n    var debug = false\n    try {\n      val packageName = MapboxSDKCommon.getContext().applicationInfo.packageName\n      val buildConfigClass = Class.forName(\"$packageName.BuildConfig\")\n      debug = buildConfigClass.getField(DEBUG_FIELD).getBoolean(null)\n    } catch (exception: Exception) {\n      logW(TAG, \"$DEBUG_LOOKUP_FAILED ${exception.localizedMessage}\")\n    }\n    return debug\n  }\n\n  /**\n   * Perform main thread checking if this is enabled and application is running in debug mode.\n   */\n  fun throwIfNotMainThread() {\n    if (!enabled or !debug) {\n      return\n    }\n\n    if (!isMainThread()) {\n      throw WorkerThreadException()\n    }\n  }\n\n  private fun isMainThread(): Boolean {\n    return Thread.currentThread() == Looper.getMainLooper().thread\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/dsl/CameraOptionsKtx.kt",
    "content": "package com.mapbox.maps.dsl\n\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\n\n/**\n * DSL builder function to create [CameraOptions] object.\n */\ninline fun cameraOptions(block: CameraOptions.Builder.() -> Unit): CameraOptions =\n  CameraOptions.Builder().apply(block).build()\n\n/**\n * DSL builder function to create [CameraOptions] object.\n *\n * @param cameraState existing camera state that is used for a mutation base\n */\ninline fun cameraOptions(\n  cameraState: CameraState,\n  block: CameraOptions.Builder.() -> Unit\n): CameraOptions = CameraOptions.Builder()\n  .padding(cameraState.padding)\n  .center(cameraState.center)\n  .bearing(cameraState.bearing)\n  .zoom(cameraState.zoom)\n  .pitch(cameraState.pitch)\n  .apply(block)\n  .build()"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/exception/WorkerThreadException.kt",
    "content": "package com.mapbox.maps.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Exception thrown when a worker thread calls in a main thread only class.\n */\nclass WorkerThreadException : RuntimeException(\n  \"\"\"\n  The exception that is thrown when an application attempts to \n  perform a map operation on a worker thread.\n  \"\"\".trimIndent()\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/EventsExtension.kt",
    "content": "package com.mapbox.maps.extension.observable\n\nimport com.mapbox.maps.CameraChanged\nimport com.mapbox.maps.CanonicalTileID\nimport com.mapbox.maps.MapIdle\nimport com.mapbox.maps.MapLoaded\nimport com.mapbox.maps.MapLoadingError\nimport com.mapbox.maps.RenderFrameFinished\nimport com.mapbox.maps.RenderFrameStarted\nimport com.mapbox.maps.SourceAdded\nimport com.mapbox.maps.SourceDataLoaded\nimport com.mapbox.maps.SourceRemoved\nimport com.mapbox.maps.StyleDataLoaded\nimport com.mapbox.maps.StyleImageMissing\nimport com.mapbox.maps.StyleImageRemoveUnused\nimport com.mapbox.maps.StyleLoaded\nimport com.mapbox.maps.extension.observable.eventdata.*\nimport com.mapbox.maps.extension.observable.model.*\nimport java.util.*\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [MapLoadedEventData] object.\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun MapLoaded.toMapLoadedEventData() = MapLoadedEventData(\n  begin = this.timeInterval.begin.time,\n  end = this.timeInterval.end.time\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [MapLoadingErrorEventData] object.\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun MapLoadingError.toMapLoadingErrorEventData() = MapLoadingErrorEventData(\n  begin = this.timestamp.time,\n  end = this.timestamp.time,\n  type = MapLoadErrorType.valueOf(this.type.name),\n  message = this.message,\n  sourceId = this.sourceId,\n  tileId = this.tileId?.toTileId()\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [MapIdleEventData] object.\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun MapIdle.toMapIdleEventData() = MapIdleEventData(\n  begin = this.timestamp.time,\n  end = this.timestamp.time\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [StyleDataLoadedEventData] object.\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun StyleDataLoaded.toStyleDataLoadedEventData() = StyleDataLoadedEventData(\n  begin = this.timeInterval.begin.time,\n  end = this.timeInterval.end.time,\n  type = StyleDataType.valueOf(this.type.name)\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [StyleLoadedEventData] object.\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun StyleLoaded.toStyleLoadedEventData() = StyleLoadedEventData(\n  begin = this.timeInterval.begin.time,\n  end = this.timeInterval.end.time,\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [SourceDataLoadedEventData] object.\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun SourceDataLoaded.toSourceDataLoadedEventData() = SourceDataLoadedEventData(\n  begin = this.timeInterval.begin.time,\n  end = this.timeInterval.end.time,\n  id = this.sourceId,\n  type = SourceDataType.valueOf(this.type.name),\n  loaded = this.loaded,\n  tileID = this.tileId?.toTileId()\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [StyleImageMissingEventData].\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun StyleImageMissing.toStyleImageMissingEventData() = StyleImageMissingEventData(\n  begin = this.timestamp.time,\n  end = this.timestamp.time,\n  id = this.imageId\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [StyleImageUnusedEventData].\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun StyleImageRemoveUnused.toStyleImageUnusedEventData() = StyleImageUnusedEventData(\n  begin = this.timestamp.time,\n  end = this.timestamp.time,\n  id = this.imageId\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [SourceAddedEventData].\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun SourceAdded.toSourceAddedEventData() = SourceAddedEventData(\n  begin = this.timestamp.time,\n  end = this.timestamp.time,\n  id = this.sourceId\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [SourceRemovedEventData].\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun SourceRemoved.toSourceRemovedEventData() = SourceRemovedEventData(\n  begin = this.timestamp.time,\n  end = this.timestamp.time,\n  id = this.sourceId\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [RenderFrameStartedEventData].\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\n@Suppress(\"UNCHECKED_CAST\")\nfun RenderFrameStarted.toRenderFrameStartedEventData() = RenderFrameStartedEventData(\n  begin = this.timestamp.time,\n  end = this.timestamp.time\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [RenderFrameFinishedEventData].\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun RenderFrameFinished.toRenderFrameFinishedEventData() = RenderFrameFinishedEventData(\n  begin = this.timeInterval.begin.time,\n  end = this.timeInterval.end.time,\n  renderMode = RenderMode.valueOf(this.renderMode.name),\n  needsRepaint = this.needsRepaint,\n  placementChanged = this.placementChanged\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return a parsed [CameraChangedEventData].\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun CameraChanged.toCameraChangedEventData() = CameraChangedEventData(\n  begin = this.timestamp.time,\n  end = this.timestamp.time\n)\n\n/**\n * Extension function to map the newly introduced event to the legacy one.\n * @return [TileId]\n */\n@Deprecated(\n  message = \"This extension function is deprecated, and will be removed in next major release.\",\n  level = DeprecationLevel.WARNING\n)\nfun CanonicalTileID.toTileId() = TileID(this.z.toLong(), this.x.toLong(), this.y.toLong())"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/CameraChangedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The data class for camera-changed event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"CameraChanged\"),\n  level = DeprecationLevel.WARNING\n)\ndata class CameraChangedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/MapIdleEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The data class for map-idle event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"MapIdle\"),\n  level = DeprecationLevel.WARNING\n)\ndata class MapIdleEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/MapLoadedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The data class for map-loaded event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"MapLoaded\"),\n  level = DeprecationLevel.WARNING\n)\ndata class MapLoadedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/MapLoadingErrorEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\nimport com.mapbox.maps.extension.observable.model.MapLoadErrorType\nimport com.mapbox.maps.extension.observable.model.TileID\n\n/**\n * The data class for map-loading-error event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"MapLoadingError\"),\n  level = DeprecationLevel.WARNING\n)\ndata class MapLoadingErrorEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?,\n  /**\n   * Defines what resource could not be loaded.\n   */\n  @SerializedName(\"type\") val type: MapLoadErrorType,\n  /**\n   * The descriptive error message of the error.\n   */\n  @SerializedName(\"message\") val message: String,\n  /**\n   * In case of `source` or `tile` loading errors, `source-id` will contain the id of the source failing.\n   */\n  @SerializedName(\"source-id\") val sourceId: String?,\n  /**\n   * In case of `tile` loading errors, `tile-id` will contain the id of the tile.\n   */\n  @SerializedName(\"tile-id\") val tileId: TileID?,\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/RenderFrameFinishedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\nimport com.mapbox.maps.extension.observable.model.RenderMode\n\n/**\n * The data class for render-frame-finished event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"RenderFrameFinished\"),\n  level = DeprecationLevel.WARNING\n)\ndata class RenderFrameFinishedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?,\n  /**\n   * The render-mode value tells whether the Map has all data (\"full\") required to render the visible viewport.\n   */\n  @SerializedName(\"render-mode\") val renderMode: RenderMode,\n  /**\n   * The needs-repaint value provides information about ongoing transitions that trigger Map repaint.\n   */\n  @SerializedName(\"needs-repaint\") val needsRepaint: Boolean,\n  /**\n   * The placement-changed value tells if the symbol placement has been changed in the visible viewport.\n   */\n  @SerializedName(\"placement-changed\") val placementChanged: Boolean\n\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/RenderFrameStartedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The data class for render-frame-started event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"RenderFrameStarted\"),\n  level = DeprecationLevel.WARNING\n)\ndata class RenderFrameStartedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/ResourceEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\nimport com.mapbox.maps.extension.observable.model.DataSourceType\nimport com.mapbox.maps.extension.observable.model.Request\nimport com.mapbox.maps.extension.observable.model.Response\n\n/**\n *The data class for event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"ResourceRequest\"),\n  level = DeprecationLevel.WARNING\n)\ndata class ResourceEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?,\n  /**\n   * \"data-source\" property\n   */\n  @SerializedName(\"data-source\") val dataSource: DataSourceType,\n  /**\n   * \"request\" property\n   */\n  @SerializedName(\"request\") val request: Request,\n  /**\n   * \"response\" property\n   */\n  @SerializedName(\"response\") val response: Response?,\n  /**\n   * \"cancelled\" property\n   */\n  @SerializedName(\"cancelled\") val cancelled: Boolean\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/SourceAddedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The data class for source-added event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"SourceAdded\"),\n  level = DeprecationLevel.WARNING\n)\ndata class SourceAddedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?,\n  /**\n   * The ID of the added source.\n   */\n  @SerializedName(\"id\") val id: String\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/SourceDataLoadedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\nimport com.mapbox.maps.extension.observable.model.SourceDataType\nimport com.mapbox.maps.extension.observable.model.TileID\n\n/**\n * The data class for source-data-loaded event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"SourceDataLoaded\"),\n  level = DeprecationLevel.WARNING\n)\ndata class SourceDataLoadedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?,\n  /**\n   * The 'id' property defines the source id.\n   */\n  @SerializedName(\"id\") val id: String,\n\n  /**\n   * The 'type' property defines if source's metadata (e.g., TileJSON) or tile has been loaded.\n   */\n  @SerializedName(\"type\") val type: SourceDataType,\n\n  /**\n   * The 'loaded' property will be set to 'true' if all source's data required for Map's visible viewport, are loaded.\n   */\n  @SerializedName(\"loaded\") val loaded: Boolean?,\n\n  /**\n   * The 'tile-id' property defines the tile id if the 'type' field equals 'tile'.\n   */\n  @SerializedName(\"tile-id\") val tileID: TileID?\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/SourceRemovedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The data class for source-removed event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"SourceRemoved\"),\n  level = DeprecationLevel.WARNING\n)\ndata class SourceRemovedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?,\n  /**\n   * The ID of the removed source.\n   */\n  @SerializedName(\"id\") val id: String\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/StyleDataLoadedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\nimport com.mapbox.maps.extension.observable.model.StyleDataType\n\n/**\n * The data class for style-data-loaded event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"StyleDataLoaded\"),\n  level = DeprecationLevel.WARNING\n)\ndata class StyleDataLoadedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?,\n  /**\n   * The 'type' property defines what kind of style data has been loaded.\n   */\n  @SerializedName(\"type\") val type: StyleDataType\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/StyleImageMissingEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The data class for style-image-missing event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"StyleImageMissing\"),\n  level = DeprecationLevel.WARNING\n)\ndata class StyleImageMissingEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?,\n  /**\n   * The ID of the missing image.\n   */\n  @SerializedName(\"id\") val id: String\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/StyleImageUnusedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The data class for style-image-remove-unused event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"StyleImageRemoveUnused\"),\n  level = DeprecationLevel.WARNING\n)\ndata class StyleImageUnusedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?,\n  /**\n   * The ID of the unused image.\n   */\n  @SerializedName(\"id\") val id: String\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/eventdata/StyleLoadedEventData.kt",
    "content": "package com.mapbox.maps.extension.observable.eventdata\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The data class for style-loaded event data in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"StyleLoaded\"),\n  level = DeprecationLevel.WARNING\n)\ndata class StyleLoadedEventData(\n  /**\n   * Representing timestamp taken at the time of an event creation, in microseconds, since the epoch.\n   */\n  @SerializedName(\"begin\") val begin: Long,\n  /**\n   * For an interval events, an optional `end` property will be present that represents timestamp taken at the time\n   * of an event completion.\n   */\n  @SerializedName(\"end\") val end: Long?\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/DataSourceType.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Describes data source of request for resource-request event.\n * @param value String value of this enum\n */\n@Deprecated(\n  message = \"This eum class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"RequestDataSourceType\"),\n  level = DeprecationLevel.WARNING\n)\nenum class DataSourceType(val value: String) {\n  /**\n   * data source as resource-loader.\n   */\n  @SerializedName(\"resource-loader\")\n  RESOURCE_LOADER(\"resource-loader\"),\n\n  /**\n   * data source as network.\n   */\n  @SerializedName(\"network\")\n  NETWORK(\"network\"),\n\n  /**\n   * data source as database.\n   */\n  @SerializedName(\"database\")\n  DATABASE(\"database\"),\n\n  /**\n   * data source as asset.\n   */\n  @SerializedName(\"asset\")\n  ASSET(\"asset\"),\n\n  /**\n   * data source as file-system.\n   */\n  @SerializedName(\"file-system\")\n  FILE_SYSTEM(\"file-system\"),\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/Error.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n *The data class for error in Observer\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"ResourceRequestError\"),\n  level = DeprecationLevel.WARNING\n)\ndata class Error(\n  /**\n   * \"reason\" property\n   */\n  @SerializedName(\"reason\") val reason: ResponseErrorReason,\n  /**\n   * \"message\" property\n   */\n  @SerializedName(\"message\") val message: String\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/MapLoadErrorType.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Describes an error type while loading the map.\n * Defines what resource could not be loaded.\n * @param value String value of this enum\n */\n@Deprecated(\n  message = \"This enum class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"MapLoadingErrorType\"),\n  level = DeprecationLevel.WARNING\n)\nenum class MapLoadErrorType(val value: String) {\n  /**\n   * An error related to style.\n   */\n  @SerializedName(\"style\")\n  STYLE(\"style\"),\n\n  /**\n   * An error related to sprite.\n   */\n  @SerializedName(\"sprite\")\n  SPRITE(\"sprite\"),\n\n  /**\n   * An error related to source.\n   */\n  @SerializedName(\"source\")\n  SOURCE(\"source\"),\n\n  /**\n   * An error related to tile.\n   */\n  @SerializedName(\"tile\")\n  TILE(\"tile\"),\n\n  /**\n   * An error related to glyphs.\n   */\n  @SerializedName(\"glyphs\")\n  GLYPHS(\"glyphs\")\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/RenderMode.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/** Describes whether a map or frame has been fully rendered or not.\n * @param value String value of this enum\n */\n@Deprecated(\n  message = \"This enum class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"RenderModeType\"),\n  level = DeprecationLevel.WARNING\n)\nenum class RenderMode(val value: String) {\n  /**\n   * The map is partially rendered. Partially rendered map means\n   * that not all data needed to render the map has been arrived\n   * from the network or being parsed.\n   */\n  @SerializedName(\"partial\")\n  PARTIAL(\"partial\"),\n\n  /** The map is fully rendered.  */\n  @SerializedName(\"full\")\n  FULL(\"full\")\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/Request.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The request data class that included in EventData\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"RequestInfo\"),\n  level = DeprecationLevel.WARNING\n)\ndata class Request(\n  /**\n   * \"loading-method\" property\n   */\n  @SerializedName(\"loading-method\") val loadingMethod: List<String>,\n  /**\n   * \"url\" property\n   */\n  @SerializedName(\"url\") val url: String,\n  /**\n   * \"kind\" property\n   */\n  @SerializedName(\"kind\") val kind: RequestType,\n  /**\n   * \"priority\" property\n   */\n  @SerializedName(\"priority\") val priority: RequestPriority\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/RequestPriority.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Describes priority for request object.\n * @param value String value of this enum\n */\n@Deprecated(\n  message = \"This enum class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"RequestPriorityType\"),\n  level = DeprecationLevel.WARNING\n)\nenum class RequestPriority(val value: String) {\n  /** Regular priority. */\n  @SerializedName(\"regular\")\n  REGULAR(\"regular\"),\n\n  /** low priority. */\n  @SerializedName(\"low\")\n  LOW(\"low\")\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/RequestType.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Describes type for request object.\n * @param value String value of this enum\n */\n@Deprecated(\n  message = \"This enum class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"RequestResourceType\"),\n  level = DeprecationLevel.WARNING\n)\nenum class RequestType(val value: String) {\n  /**\n   * Request type unknown.\n   */\n  @SerializedName(\"unknown\")\n  UNKNOWN(\"unknown\"),\n\n  /**\n   * Request type style.\n   */\n  @SerializedName(\"style\")\n  STYLE(\"style\"),\n\n  /**\n   * Request type source.\n   */\n  @SerializedName(\"source\")\n  SOURCE(\"source\"),\n\n  /**\n   * Request type tile.\n   */\n  @SerializedName(\"tile\")\n  TILE(\"tile\"),\n\n  /**\n   * Request type glyphs.\n   */\n  @SerializedName(\"glyphs\")\n  GLYPHS(\"glyphs\"),\n\n  /**\n   * Request type sprite-image.\n   */\n  @SerializedName(\"sprite-image\")\n  SPRITE_IMAGE(\"sprite-image\"),\n\n  /**\n   * Request type sprite-json.\n   */\n  @SerializedName(\"sprite-json\")\n  SPRITE_JSON(\"sprite-json\"),\n\n  /**\n   * Request type image.\n   */\n  @SerializedName(\"image\")\n  IMAGE(\"image\"),\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/Response.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * The response data class that included in EventData\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"ResponseInfo\"),\n  level = DeprecationLevel.WARNING\n)\ndata class Response(\n  /**\n   * \"etag\" property\n   */\n  @SerializedName(\"etag\") val eTag: String?,\n  /**\n   * \"must-revalidate\" property\n   */\n  @SerializedName(\"must-revalidate\") val mustRevalidate: Boolean,\n  /**\n   * \"no-content\" property\n   */\n  @SerializedName(\"no-content\") val noContent: Boolean,\n  /**\n   * \"modified\" property\n   */\n  @SerializedName(\"modified\") val modified: String?,\n  /**\n   * \"source\" property\n   */\n  @SerializedName(\"source\") val source: ResponseSourceType,\n  /**\n   * \"not-modified\" property\n   */\n  @SerializedName(\"not-modified\") val notModified: Boolean,\n  /**\n   * \"expires\" property\n   */\n  @SerializedName(\"expires\") val expires: String?,\n  /**\n   * \"size\" property\n   */\n  @SerializedName(\"size\") val size: Int,\n  /**\n   * \"error\" property\n   */\n  @SerializedName(\"error\") val error: Error?\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/ResponseErrorReason.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Describes the reason of Error for response object.\n * @param value String value of this enum\n */\n@Deprecated(\n  message = \"This enum class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"RequestErrorType\"),\n  level = DeprecationLevel.WARNING\n)\nenum class ResponseErrorReason(val value: String) {\n  /**\n   * Error type success.\n   */\n  @SerializedName(\"success\")\n  SUCCESS(\"success\"),\n\n  /**\n   * Error type not-found.\n   */\n  @SerializedName(\"not-found\")\n  NOT_FOUND(\"not-found\"),\n\n  /**\n   * Error type server.\n   */\n  @SerializedName(\"server\")\n  SERVER(\"server\"),\n\n  /**\n   * Error type connection.\n   */\n  @SerializedName(\"connection\")\n  CONNECTION(\"connection\"),\n\n  /**\n   * Error type rate-limit.\n   */\n  @SerializedName(\"rate-limit\")\n  RATE_LIMIT(\"rate-limit\"),\n\n  /**\n   * Error type in-offline-mode.\n   */\n  @SerializedName(\"in-offline-mode\")\n  IN_OFFLINE_MODE(\"in-offline-mode\"),\n\n  /**\n   * Error type other.\n   */\n  @SerializedName(\"other\")\n  OTHER(\"other\")\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/ResponseSourceType.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Describes source data type for response in resource-request event.\n * @param value String value of this enum\n */\n@Deprecated(\n  message = \"This enum class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"ResponseSourceType\"),\n  level = DeprecationLevel.WARNING\n)\nenum class ResponseSourceType(val value: String) {\n  /**\n   * source type as network.\n   */\n  @SerializedName(\"network\")\n  NETWORK(\"network\"),\n\n  /**\n   * source type as cache.\n   */\n  @SerializedName(\"cache\")\n  CACHE(\"cache\"),\n\n  /**\n   * source type as tile-store.\n   */\n  @SerializedName(\"tile-store\")\n  TILE_STORE(\"tile-store\"),\n\n  /**\n   * source type as local-file.\n   */\n  @SerializedName(\"local-file\")\n  LOCAL_FILE(\"local-file\"),\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/SourceDataType.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Defines what kind of source data has been loaded in a source-data-loaded event.\n * @param value String value of this enum\n */\n@Deprecated(\n  message = \"This enum class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"SourceDataLoadedType\"),\n  level = DeprecationLevel.WARNING\n)\nenum class SourceDataType(val value: String) {\n  /**\n   * The source data loaded event is associated with source metadata.\n   */\n  @SerializedName(\"metadata\")\n  METADATA(\"metadata\"),\n\n  /**\n   * The source data loaded event is associated with source tile.\n   */\n  @SerializedName(\"tile\")\n  TILE(\"tile\")\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/StyleDataType.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Defines what kind of style data has been loaded in a style-data-loaded event.\n * @param value String value of this enum\n */\n@Deprecated(\n  message = \"This enum class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"StyleDataLoadedType\"),\n  level = DeprecationLevel.WARNING\n)\nenum class StyleDataType(val value: String) {\n  /**\n   * The style data loaded event is associated with style.\n   */\n  @SerializedName(\"style\")\n  STYLE(\"style\"),\n\n  /**\n   * The style data loaded event is associated with sprite.\n   */\n  @SerializedName(\"sprite\")\n  SPRITE(\"sprite\"),\n\n  /**\n   * The style data loaded event is associated with sources.\n   */\n  @SerializedName(\"sources\")\n  SOURCES(\"sources\")\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/observable/model/TileID.kt",
    "content": "package com.mapbox.maps.extension.observable.model\n\nimport com.google.gson.annotations.SerializedName\n\n/**\n * Defines the tile id in a source-data-loaded event.\n */\n@Deprecated(\n  message = \"This data class is deprecated, and will be removed in next major release.\",\n  replaceWith = ReplaceWith(\"CanonicalTileID\"),\n  level = DeprecationLevel.WARNING\n)\ndata class TileID(\n  /**\n   * The zoom level.\n   */\n  @SerializedName(\"z\")\n  val zoom: Long,\n  /**\n   * The x coordinate of the tile\n   */\n  @SerializedName(\"x\")\n  val x: Long,\n  /**\n   * The y coordinate of the tile\n   */\n  @SerializedName(\"y\")\n  val y: Long\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/extension/style/StyleContract.kt",
    "content": "package com.mapbox.maps.extension.style\n\nimport com.mapbox.maps.ColorTheme\nimport com.mapbox.maps.LayerPosition\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\nimport com.mapbox.maps.TransitionOptions\n\n/**\n * Define the common interfaces for the Style component.\n */\ninterface StyleContract {\n  /**\n   * Define the interfaces for the Style Extension.\n   */\n  interface StyleExtension {\n    /**\n     * Style represented as JSON or URI.\n     */\n    val style: String\n\n    /**\n     * The sources of the style.\n     */\n    val sources: List<StyleSourceExtension>\n\n    /**\n     * The images of the style.\n     */\n    val images: List<StyleImageExtension>\n\n    /**\n     * The models of the style.\n     */\n    @MapboxExperimental\n    val models: List<StyleModelExtension>\n\n    /**\n     * The layers of the style.\n     */\n    val layers: List<Pair<StyleLayerExtension, LayerPosition>>\n\n    /**\n     * The flat light of the style.\n     */\n    val flatLight: StyleLightExtension?\n\n    /**\n     * The dynamic (directional and ambient) light of the style.\n     */\n    val dynamicLight: StyleLightExtension?\n\n    /**\n     * The 3D terrain of the style.\n     */\n    val terrain: StyleTerrainExtension?\n\n    /**\n     * The atmosphere of the style.\n     */\n    val atmosphere: StyleAtmosphereExtension?\n\n    /**\n     * Map projection of the style.\n     */\n    val projection: StyleProjectionExtension?\n\n    /**\n     * Transition options applied when loading the style.\n     */\n    val transition: TransitionOptions?\n\n    /**\n     * The rain precipitation of the style.\n     */\n    @MapboxExperimental\n    val rain: StyleRainExtension?\n\n    /**\n     * The snow precipitation of the style.\n     */\n    @MapboxExperimental\n    val snow: StyleSnowExtension?\n\n    /**\n     * The color theme of the style.\n     */\n    @MapboxExperimental\n    val colorTheme: ColorTheme?\n  }\n\n  /**\n   * Define the interfaces for the Layer plugin.\n   */\n  interface StyleLayerExtension {\n    /**\n     * Bind the layer to the Style.\n     *\n     * @param delegate The style delegate\n     * @param position the layer position\n     */\n    fun bindTo(delegate: MapboxStyleManager, position: LayerPosition? = null)\n  }\n\n  /**\n   * Define the interfaces for the Light plugin.\n   */\n  fun interface StyleLightExtension {\n    /**\n     * Bind the light to the Style.\n     *\n     * @param delegate The style delegate\n     */\n    fun bindTo(delegate: MapboxStyleManager)\n  }\n\n  /**\n   * Define the interfaces for the Terrain plugin.\n   */\n  fun interface StyleTerrainExtension {\n    /**\n     * Bind the terrain to the Style.\n     *\n     * @param delegate The style delegate\n     */\n    fun bindTo(delegate: MapboxStyleManager)\n  }\n\n  /**\n   * Define the interfaces for the Atmosphere plugin.\n   */\n  fun interface StyleAtmosphereExtension {\n    /**\n     * Bind the atmosphere to the Style.\n     *\n     * @param delegate The style delegate\n     */\n    fun bindTo(delegate: MapboxStyleManager)\n  }\n\n  /**\n   * Define the interfaces for the Projection plugin.\n   */\n  fun interface StyleProjectionExtension {\n    /**\n     * Bind the projection to the Style.\n     *\n     * @param delegate The style delegate\n     */\n    fun bindTo(delegate: MapboxStyleManager)\n  }\n\n  /**\n   * Define the interfaces for the source plugin.\n   */\n  fun interface StyleSourceExtension {\n    /**\n     * Bind the source to the Style.\n     *\n     * @param delegate The style delegate\n     */\n    fun bindTo(delegate: MapboxStyleManager)\n  }\n\n  /**\n   * Define the interfaces for the Image plugin.\n   */\n  fun interface StyleImageExtension {\n    /**\n     * Bind the image to the Style.\n     *\n     * @param delegate The style delegate\n     */\n    fun bindTo(delegate: MapboxStyleManager)\n  }\n\n  /**\n   * Define the interfaces for the model extension.\n   */\n  @MapboxExperimental\n  fun interface StyleModelExtension {\n    /**\n     * Bind the model to the Style.\n     *\n     * @param delegate The style delegate\n     */\n    fun bindTo(delegate: MapboxStyleManager)\n  }\n\n  /**\n   * Define the interfaces for the Snow plugin.\n   */\n  @MapboxExperimental\n  fun interface StyleSnowExtension {\n    /**\n     * Bind the snow to the Style.\n     *\n     * @param delegate The style delegate\n     */\n    fun bindTo(delegate: MapboxStyleManager)\n  }\n\n  /**\n   * Define the interfaces for the Rain plugin.\n   */\n  @MapboxExperimental\n  fun interface StyleRainExtension {\n    /**\n     * Bind the rain to the Style.\n     *\n     * @param delegate The style delegate\n     */\n    fun bindTo(delegate: MapboxStyleManager)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/geofencing/MapGeofencingConsent.kt",
    "content": "package com.mapbox.maps.geofencing\n\nimport com.mapbox.common.geofencing.GeofencingUtilsUserConsentResponseCallback\n\n/**\n * Definition of map Geofencing consent utilities\n */\ninterface MapGeofencingConsent {\n\n  /**\n   * Set the end-user consent for Geofencing to run.\n   *\n   * @param isConsentGiven true if user consents Geofencing, false if not (this will disable Geofencing).\n   * @param callback Callback called when state is updated.\n   */\n  fun setUserConsent(isConsentGiven: Boolean, callback: GeofencingUtilsUserConsentResponseCallback)\n\n  /**\n   * Get the Geofencing user consent state.\n   *\n   * @return `true` if end-user has given consent of Geofencing, `false` otherwise. `true` by default.\n   */\n  fun getUserConsent(): Boolean\n\n  /**\n   * Checks if the Geofencing user consent dialog should be shown.\n   *\n   * @return `true` to show the option to opt-out Geofencing. That is, Geofencing is active or the user revoked the consent.\n   */\n  fun shouldShowConsent(): Boolean\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/FeatureState.kt",
    "content": "package com.mapbox.maps.interactions\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.interactions.FeatureState.Builder\nimport com.mapbox.maps.logW\nimport java.util.Objects\n\n/**\n * Feature state class needed for generic `MapboxMap.setFeatureState` and `MapboxMap.getFeatureState`.\n */\nopen class FeatureState internal constructor(\n  /**\n   * For internal usage.\n   * @suppress\n   */\n  @get:RestrictTo(RestrictTo.Scope.LIBRARY)\n  open val internalState: Value\n) {\n  /**\n   * Returns the state value for [stateName] if it exists\n   * and is a [Boolean] or can be coerced to a [Boolean], or NULL otherwise.\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  fun getBooleanState(stateName: String): Boolean? {\n    return (internalState.contents as HashMap<String, Value>)[stateName]?.contents as? Boolean?\n  }\n\n  /**\n   * Returns the state value for [stateName] if it exists\n   * and is a [String] or can be coerced to a [String], or NULL otherwise.\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  fun getStringState(stateName: String): String? {\n    return (internalState.contents as HashMap<String, Value>)[stateName]?.contents as? String?\n  }\n\n  /**\n   * Returns the state value for [stateName] if it exists\n   * and is a [Long] or can be coerced to a [Long], or NULL otherwise.\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  fun getLongState(stateName: String): Long? {\n    return (internalState.contents as HashMap<String, Value>)[stateName]?.contents as? Long?\n  }\n\n  /**\n   * Returns the state value for [stateName] if it exists\n   * and is a [Double] or can be coerced to a [Double], or NULL otherwise.\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  fun getDoubleState(stateName: String): Double? {\n    return (internalState.contents as HashMap<String, Value>)[stateName]?.contents as? Double?\n  }\n\n  /**\n   * Return state as a JSON string.\n   */\n  fun asJsonString(): String = internalState.toJson()\n\n  /**\n   * Override equals method.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as FeatureState\n\n    return internalState == other.internalState\n  }\n\n  /**\n   * Override hashCode method.\n   */\n  override fun hashCode() = Objects.hash(internalState)\n\n  /**\n   * Override toString method.\n   */\n  override fun toString() = \"FeatureStateValue(state=${internalState.toJson()})\"\n\n  /**\n   * Builder class to build [FeatureState].\n   */\n  open class Builder {\n\n    protected val rawStateMap: HashMap<String, Value> = hashMapOf()\n\n    /**\n     * Add a boolean state for property [stateName].\n     */\n    fun addBooleanState(stateName: String, value: Boolean): Builder {\n      rawStateMap[stateName] = Value.valueOf(value)\n      return this\n    }\n\n    /**\n     * Add a string state for property [stateName].\n     */\n    fun addStringState(stateName: String, value: String): Builder {\n      rawStateMap[stateName] = Value.valueOf(value)\n      return this\n    }\n\n    /**\n     * Add a long state for property [stateName].\n     */\n    fun addLongState(stateName: String, value: Long): Builder {\n      rawStateMap[stateName] = Value.valueOf(value)\n      return this\n    }\n\n    /**\n     * Add a double state for property [stateName].\n     */\n    fun addDoubleState(stateName: String, value: Double): Builder {\n      rawStateMap[stateName] = Value.valueOf(value)\n      return this\n    }\n\n    /**\n     * Build an instance of [FeatureState].\n     */\n    open fun build(): FeatureState {\n      if (rawStateMap.isEmpty()) {\n        logW(TAG, \"Constructing an empty FeatureState. Is this intended?\")\n      }\n      return FeatureState(Value(rawStateMap))\n    }\n  }\n\n  /**\n   * Static variable and functions.\n   */\n  internal companion object {\n    internal const val TAG = \"FeatureState\"\n  }\n}\n\n/**\n * Builder function to create [FeatureState].\n */\n@JvmSynthetic\nfun FeatureState(init: Builder.() -> Unit): FeatureState =\n  Builder().apply(init).build()"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/FeatureStateCallback.kt",
    "content": "package com.mapbox.maps.interactions\n\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Callback for `MapboxMap.getFeatureState`.\n */\n@MapboxExperimental\nfun interface FeatureStateCallback<FS : FeatureState> {\n\n  /**\n   * Triggered when `MapboxMap.getFeatureState` is done.\n   *\n   * Note: this callback is not triggered if `MapboxMap.getFeatureState` was canceled\n   * or an error occurred.\n   */\n  fun onFeatureState(state: FS)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/FeatureStateKey.kt",
    "content": "package com.mapbox.maps.interactions\n\nimport java.util.Objects\n\n/**\n * Base class for holding the typed feature state keys that could be used in `removeFeatureState`.\n *\n * Refer to static [create] method to create an instance of [FeatureStateKey].\n */\nopen class FeatureStateKey<FS : FeatureState> internal constructor(\n  /**\n   * The feature state key to remove from the feature.\n   */\n  val key: String\n) {\n  /**\n   * Override equals method.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as FeatureStateKey<*>\n\n    return key == other.key\n  }\n\n  /**\n   * Override hashCode method.\n   */\n  override fun hashCode(): Int =\n    Objects.hash(key)\n\n  /**\n   * Static methods.\n   */\n  companion object {\n\n    /**\n     * Create an instance of [FeatureStateKey] to be passed to `removeFeatureState`.\n     */\n    @JvmStatic\n    fun create(key: String): FeatureStateKey<FeatureState> = FeatureStateKey(key)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/FeaturesetFeature.kt",
    "content": "package com.mapbox.maps.interactions\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.Point\nimport com.mapbox.geojson.Polygon\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.LongClickInteraction\nimport org.json.JSONObject\nimport java.util.Objects\n\n/**\n * The map interaction result object returned in the callback of:\n *  1. User map interactions ([ClickInteraction], [LongClickInteraction]).\n *  2. Map query methods like `MapboxMap.queryRenderedFeatures`.\n */\nopen class FeaturesetFeature<FS : FeatureState> @RestrictTo(RestrictTo.Scope.LIBRARY) constructor(\n  /**\n   * Optional identifier holding feature id and feature namespace.\n   * It could be NULL when underlying [Feature.id] is null.\n   */\n  val id: FeaturesetFeatureId?,\n  /**\n   * The [TypedFeaturesetDescriptor] this concrete feature comes from.\n   * List of supported featuresets could be found in the nested classes (e.g. [TypedFeaturesetDescriptor.Featureset], [TypedFeaturesetDescriptor.Layer] etc).\n   */\n  val descriptor: TypedFeaturesetDescriptor<FS, *>,\n  /**\n   * Current feature state stored as a concrete instance of [FeatureState].\n   * Important: this state is immutable and represents the feature state at the precise moment of the interaction callback.\n   */\n  val state: FS,\n  /**\n   * For internal usage.\n   */\n  internal val originalFeature: Feature,\n) {\n  /**\n   * Mandatory feature [Geometry].\n   *\n   * Based on the feature type this should be casted to the concrete implementation\n   * like [Point], [Polygon] etc.\n   */\n  open val geometry: Geometry = originalFeature.geometry()!!\n\n  /**\n   * The feature properties stored in [JSONObject].\n   */\n  val properties: JSONObject by lazy {\n    originalFeature.properties()?.let { json ->\n      JSONObject(json.toString())\n    } ?: JSONObject()\n  }\n\n  /**\n   * Override equals method.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as FeaturesetFeature<*>\n\n    if (descriptor != other.descriptor) return false\n    if (originalFeature != other.originalFeature) return false\n    if (state != other.state) return false\n    if (id != other.id) return false\n\n    return true\n  }\n\n  /**\n   * Override hashCode method.\n   */\n  override fun hashCode(): Int =\n    Objects.hash(descriptor, originalFeature, state, id)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/QueryRenderedFeaturesetFeaturesCallback.kt",
    "content": "package com.mapbox.maps.interactions\n\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Callback for `MapboxMap.queryRenderedFeatures`.\n */\n@MapboxExperimental\nfun interface QueryRenderedFeaturesetFeaturesCallback<FF : FeaturesetFeature<*>> {\n\n  /**\n   * Triggered when `MapboxMap.queryRenderedFeatures` is done and there is an actual [featuresetFeatures] list\n   * to return for given [TypedFeaturesetDescriptor]. The features are returned in the order of how they are rendered\n   * on the actual map.\n   *\n   * Note: this callback is not triggered if `MapboxMap.queryRenderedFeatures` was canceled\n   * or an error occurred.\n   */\n  fun onQueryRenderedFeatures(featuresetFeatures: List<FF>)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/TypedFeaturesetDescriptor.kt",
    "content": "package com.mapbox.maps.interactions\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.FeaturesetDescriptor\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.interactions.standard.generated.StandardBuildings\nimport java.util.Objects\n\n/**\n * Base class to differentiate featuresets.\n *\n * See generated predefined featuresets (e.g. [StandardBuildings]) to use with Mapbox Standard Style.\n * See [TypedFeaturesetDescriptor.Featureset] and [TypedFeaturesetDescriptor.Layer] to define a fully custom FeaturesetDescriptor.\n */\nabstract class TypedFeaturesetDescriptor<FS : FeatureState, FF : FeaturesetFeature<FS>> protected constructor() {\n\n  /**\n   * For internal usage.\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY)\n  abstract fun toFeaturesetDescriptor(): FeaturesetDescriptor\n\n  /**\n   * For internal usage.\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY)\n  abstract fun getFeatureState(rawState: Value): FS\n\n  /**\n   * For internal usage.\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY)\n  abstract fun getFeaturesetFeature(\n    feature: Feature,\n    featureNamespace: String?,\n    rawState: Value\n  ): FF\n\n  /**\n   * Represents an actual featureset.\n   *\n   * @param featuresetId mandatory id.\n   * @param importId optional style import id.\n   */\n  class Featureset @JvmOverloads constructor(\n    val featuresetId: String,\n    val importId: String? = null\n  ) : TypedFeaturesetDescriptor<FeatureState, FeaturesetFeature<FeatureState>>() {\n\n    /**\n     * For internal usage.\n     */\n    override fun toFeaturesetDescriptor() = FeaturesetDescriptor(featuresetId, importId, null)\n\n    /**\n     * For internal usage.\n     */\n    override fun getFeatureState(rawState: Value) = FeatureState(rawState)\n\n    /**\n     * For internal usage.\n     */\n    override fun getFeaturesetFeature(\n      feature: Feature,\n      featureNamespace: String?,\n      rawState: Value\n    ) = feature.id()?.let { featureId ->\n      FeaturesetFeature(\n        descriptor = this,\n        id = FeaturesetFeatureId(featureId, featureNamespace),\n        state = getFeatureState(rawState),\n        originalFeature = feature\n      )\n    } ?: FeaturesetFeature(\n      descriptor = this,\n      id = null,\n      state = getFeatureState(rawState),\n      originalFeature = feature\n    )\n\n    /**\n     * Overloaded equals.\n     */\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (javaClass != other?.javaClass) return false\n\n      other as Featureset\n\n      if (featuresetId != other.featuresetId) return false\n      if (importId != other.importId) return false\n\n      return true\n    }\n\n    /**\n     * Overloaded hashcode.\n     */\n    override fun hashCode(): Int {\n      return Objects.hash(featuresetId, importId)\n    }\n  }\n\n  /**\n   * Represents an single style layer.\n   *\n   * @param layerId mandatory id.\n   */\n  class Layer(\n    val layerId: String,\n  ) : TypedFeaturesetDescriptor<FeatureState, FeaturesetFeature<FeatureState>>() {\n\n    /**\n     * For internal usage.\n     */\n    override fun toFeaturesetDescriptor() = FeaturesetDescriptor(null, null, layerId)\n\n    /**\n     * For internal usage.\n     */\n    override fun getFeatureState(rawState: Value) = FeatureState(rawState)\n\n    /**\n     * For internal usage.\n     */\n    override fun getFeaturesetFeature(\n      feature: Feature,\n      featureNamespace: String?,\n      rawState: Value\n    ) = feature.id()?.let { featureId ->\n      FeaturesetFeature(\n        descriptor = this,\n        id = FeaturesetFeatureId(featureId, featureNamespace),\n        state = getFeatureState(rawState),\n        originalFeature = feature\n      )\n    } ?: FeaturesetFeature(\n      descriptor = this,\n      id = null,\n      state = getFeatureState(rawState),\n      originalFeature = feature\n    )\n\n    /**\n     * Overloaded equals.\n     */\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (javaClass != other?.javaClass) return false\n\n      other as Layer\n\n      return layerId == other.layerId\n    }\n\n    /**\n     * Overloaded hashcode.\n     */\n    override fun hashCode(): Int {\n      return layerId.hashCode()\n    }\n  }\n\n  internal companion object {\n    internal const val DEFAULT_IMPORT_ID = \"basemap\"\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardBuildings.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.FeaturesetDescriptor\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\n\n/**\n * Represents a `buildings` featureset from Mapbox Standard Style.\n */\nclass StandardBuildings @JvmOverloads constructor(\n  /**\n   * Optional import id when using Mapbox Standard Style as a style import for another style.\n   */\n  val importId: String? = null,\n) : TypedFeaturesetDescriptor<StandardBuildingsState, StandardBuildingsFeature>() {\n\n  /**\n   * For internal usage.\n   */\n  override fun toFeaturesetDescriptor() =\n    FeaturesetDescriptor(FEATURESET_ID, importId ?: DEFAULT_IMPORT_ID, null)\n\n  /**\n   * For internal usage.\n   */\n  override fun getFeatureState(rawState: Value) = StandardBuildingsState(rawState)\n\n  /**\n   * For internal usage.\n   */\n  override fun getFeaturesetFeature(\n    feature: Feature,\n    featureNamespace: String?,\n    rawState: Value\n  ) = feature.id()?.let { featureId ->\n    StandardBuildingsFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      importId = importId,\n      originalFeature = feature,\n      state = getFeatureState(rawState)\n    )\n  } ?: StandardBuildingsFeature(\n    id = null,\n    importId = importId,\n    originalFeature = feature,\n    state = getFeatureState(rawState)\n  )\n\n  /**\n   * Overloaded equals.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as StandardBuildings\n\n    return importId == other.importId\n  }\n\n  /**\n   * Overloaded hashcode.\n   */\n  override fun hashCode(): Int {\n    return importId.hashCode()\n  }\n\n  internal companion object {\n    internal const val FEATURESET_ID = \"buildings\"\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardBuildingsFeature.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * Featureset describing the buildings.\n *\n * Typed class of [FeaturesetFeature] representing StandardBuildings coming from Mapbox Standard Style.\n * Allows easy access to [Feature] properties.\n */\nclass StandardBuildingsFeature(\n  id: FeaturesetFeatureId?,\n  importId: String?,\n  originalFeature: Feature,\n  state: StandardBuildingsState,\n) : FeaturesetFeature<StandardBuildingsState>(\n  id = id,\n  descriptor = StandardBuildings(importId),\n  originalFeature = originalFeature,\n  state = state\n) {\n\n  /**\n   * A high-level building group like building-2d, building-3d, etc.\n   */\n  val group get(): String? = originalFeature.getStringProperty(\"group\")\n\n  /**\n   * The height in meters of a building or building part (rounded to the nearest integer).\n   */\n  val height get(): Double? = originalFeature.getNumberProperty(\"height\")?.toDouble()\n\n  /**\n   * The height in meters from the ground to the bottom of a building part, for cases where the bottom of the part is not on the ground.\n   */\n  val minHeight get(): Double? = originalFeature.getNumberProperty(\"min_height\")?.toDouble()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardBuildingsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.logW\n\n/**\n * Typed feature state class needed for generic `MapboxMap.setFeatureState` and `MapboxMap.getFeatureState`\n * when working with StandardBuildings in Mapbox Standard Style.\n */\nclass StandardBuildingsState internal constructor(\n  /**\n   * For internal usage.\n   * @suppress\n   */\n  @get:RestrictTo(RestrictTo.Scope.LIBRARY)\n  override val internalState: Value,\n) : FeatureState(internalState) {\n\n  /**\n   * When `true`, the building is highlighted. Use this state to create a temporary effect (e.g. hover).\n   *\n   * Available global configuration(s): \"colorBuildingHighlight\".\n   *\n   * Example of applying \"colorBuildingHighlight\": style.setStyleImportConfigProperty(importId /* \"basemap\" if not specified explicitly */, \"colorBuildingHighlight\", Value.valueOf(newValue))\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  val highlight: Boolean? get() = (internalState.contents as HashMap<String, Value>)[\"highlight\"]?.contents as? Boolean\n\n  /**\n   * When `true`, the building is selected. Use this state to create a permanent effect. Note: the `select` state has a higher priority than `highlight`.\n   *\n   * Available global configuration(s): \"colorBuildingSelect\".\n   *\n   * Example of applying \"colorBuildingSelect\": style.setStyleImportConfigProperty(importId /* \"basemap\" if not specified explicitly */, \"colorBuildingSelect\", Value.valueOf(newValue))\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  val select: Boolean? get() = (internalState.contents as HashMap<String, Value>)[\"select\"]?.contents as? Boolean\n\n  /**\n   * Builder class to build [StandardBuildingsState].\n   */\n  class Builder : FeatureState.Builder() {\n\n    /**\n     * Set state for [highlight]. See the state definition below.\n     *\n     * When `true`, the building is highlighted. Use this state to create a temporary effect (e.g. hover).\n     * Available global configuration(s): \"colorBuildingHighlight\".\n     *\n     * Example of applying \"colorBuildingHighlight\": style.setStyleImportConfigProperty(importId /* \"basemap\" if not specified explicitly */, \"colorBuildingHighlight\", Value.valueOf(newValue))\n     */\n    fun highlight(highlight: Boolean): Builder {\n      rawStateMap[\"highlight\"] = Value.valueOf(highlight)\n      return this\n    }\n\n    /**\n     * Set state for [select]. See the state definition below.\n     *\n     * When `true`, the building is selected. Use this state to create a permanent effect. Note: the `select` state has a higher priority than `highlight`.\n     * Available global configuration(s): \"colorBuildingSelect\".\n     *\n     * Example of applying \"colorBuildingSelect\": style.setStyleImportConfigProperty(importId /* \"basemap\" if not specified explicitly */, \"colorBuildingSelect\", Value.valueOf(newValue))\n     */\n    fun select(select: Boolean): Builder {\n      rawStateMap[\"select\"] = Value.valueOf(select)\n      return this\n    }\n\n    /**\n     * Build an instance of [StandardBuildingsState].\n     */\n    override fun build(): StandardBuildingsState {\n      if (rawStateMap.isEmpty()) {\n        logW(TAG, \"Constructing an empty StandardBuildingsState. Is this intended?\")\n      }\n      return StandardBuildingsState(Value(rawStateMap))\n    }\n  }\n}\n\n/**\n * Builder function to create [StandardBuildingsState].\n */\n@JvmSynthetic\nfun StandardBuildingsState(init: StandardBuildingsState.Builder.() -> Unit): StandardBuildingsState =\n  StandardBuildingsState.Builder().apply(init).build()"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardBuildingsStateKey.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.interactions.FeatureStateKey\n\n/**\n * State keys for [StandardBuildingsState] that should be used in `removeFeatureState`.\n */\nclass StandardBuildingsStateKey private constructor(\n  key: String\n) : FeatureStateKey<StandardBuildingsState>(key) {\n\n  /**\n   * Static states.\n   */\n  companion object {\n\n    /**\n     * State key standing for \"highlight\" feature state.\n     */\n    val HIGHLIGHT: StandardBuildingsStateKey = StandardBuildingsStateKey(\"highlight\")\n\n    /**\n     * State key standing for \"select\" feature state.\n     */\n    val SELECT: StandardBuildingsStateKey = StandardBuildingsStateKey(\"select\")\n\n    /**\n     * Create custom [StandardBuildingsStateKey] from given [key].\n     *\n     * Should not be used in most of the cases as this makes sense only when [StandardBuildingsState]\n     * state was constructed with custom state keys / values.\n     */\n    @MapboxDelicateApi\n    fun create(key: String): StandardBuildingsStateKey = StandardBuildingsStateKey(key)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardInteractionsExt.kt",
    "content": "// This file is generated.\n@file:JvmName(\"StandardInteractions\")\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.ClickInteraction\nimport com.mapbox.maps.FeaturesetDescriptor\nimport com.mapbox.maps.InteractionContext\nimport com.mapbox.maps.LongClickInteraction\nimport com.mapbox.maps.MapInteraction\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\n\n/**\n * Create the [ClickInteraction] for Mapbox Standard Style `poi` featureset and an optional [importId].\n *\n * When several [ClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n *\n * @param importId optional style import id. Defaults to NULL.\n * @param filter optional filter. Defaults to NULL.\n * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n * @param onClick callback triggered when the `poi` featureset is clicked.\n */\n@JvmOverloads\nfun ClickInteraction.Companion.standardPoi(\n  importId: String? = null,\n  filter: Value? = null,\n  radius: Double? = null,\n  onClick: (StandardPoiFeature, InteractionContext) -> Boolean\n): MapInteraction {\n  return ClickInteraction(\n    FeaturesetDescriptor(\n      /* featuresetId */ StandardPoi.FEATURESET_ID,\n      /* importId */ importId ?: TypedFeaturesetDescriptor.DEFAULT_IMPORT_ID,\n      /* layerId */null\n    ),\n    filter,\n    radius,\n    onClick\n  ) { feature, featuresetFeatureId, state ->\n    StandardPoiFeature(\n      id = featuresetFeatureId,\n      importId = importId,\n      originalFeature = feature,\n      state = StandardPoiState(state)\n    )\n  }\n}\n\n/**\n * Create the [LongClickInteraction] for Mapbox Standard Style `poi` featureset and an optional [importId].\n *\n * When several [LongClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n *\n * @param importId optional style import id. Defaults to NULL.\n * @param filter optional filter. Defaults to NULL.\n * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n * @param onLongClick callback triggered when the `poi` featureset is long clicked.\n */\n@JvmOverloads\nfun LongClickInteraction.Companion.standardPoi(\n  importId: String? = null,\n  filter: Value? = null,\n  radius: Double? = null,\n  onLongClick: (StandardPoiFeature, InteractionContext) -> Boolean\n): MapInteraction {\n  return LongClickInteraction(\n    FeaturesetDescriptor(\n      /* featuresetId */ StandardPoi.FEATURESET_ID,\n      /* importId */ importId ?: TypedFeaturesetDescriptor.DEFAULT_IMPORT_ID,\n      /* layerId */null\n    ),\n    filter,\n    radius,\n    onLongClick\n  ) { feature, featuresetFeatureId, state ->\n    StandardPoiFeature(\n      id = featuresetFeatureId,\n      importId = importId,\n      originalFeature = feature,\n      state = StandardPoiState(state)\n    )\n  }\n}\n/**\n * Create the [ClickInteraction] for Mapbox Standard Style `place-labels` featureset and an optional [importId].\n *\n * When several [ClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n *\n * @param importId optional style import id. Defaults to NULL.\n * @param filter optional filter. Defaults to NULL.\n * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n * @param onClick callback triggered when the `place-labels` featureset is clicked.\n */\n@JvmOverloads\nfun ClickInteraction.Companion.standardPlaceLabels(\n  importId: String? = null,\n  filter: Value? = null,\n  radius: Double? = null,\n  onClick: (StandardPlaceLabelsFeature, InteractionContext) -> Boolean\n): MapInteraction {\n  return ClickInteraction(\n    FeaturesetDescriptor(\n      /* featuresetId */ StandardPlaceLabels.FEATURESET_ID,\n      /* importId */ importId ?: TypedFeaturesetDescriptor.DEFAULT_IMPORT_ID,\n      /* layerId */null\n    ),\n    filter,\n    radius,\n    onClick\n  ) { feature, featuresetFeatureId, state ->\n    StandardPlaceLabelsFeature(\n      id = featuresetFeatureId,\n      importId = importId,\n      originalFeature = feature,\n      state = StandardPlaceLabelsState(state)\n    )\n  }\n}\n\n/**\n * Create the [LongClickInteraction] for Mapbox Standard Style `place-labels` featureset and an optional [importId].\n *\n * When several [LongClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n *\n * @param importId optional style import id. Defaults to NULL.\n * @param filter optional filter. Defaults to NULL.\n * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n * @param onLongClick callback triggered when the `place-labels` featureset is long clicked.\n */\n@JvmOverloads\nfun LongClickInteraction.Companion.standardPlaceLabels(\n  importId: String? = null,\n  filter: Value? = null,\n  radius: Double? = null,\n  onLongClick: (StandardPlaceLabelsFeature, InteractionContext) -> Boolean\n): MapInteraction {\n  return LongClickInteraction(\n    FeaturesetDescriptor(\n      /* featuresetId */ StandardPlaceLabels.FEATURESET_ID,\n      /* importId */ importId ?: TypedFeaturesetDescriptor.DEFAULT_IMPORT_ID,\n      /* layerId */null\n    ),\n    filter,\n    radius,\n    onLongClick\n  ) { feature, featuresetFeatureId, state ->\n    StandardPlaceLabelsFeature(\n      id = featuresetFeatureId,\n      importId = importId,\n      originalFeature = feature,\n      state = StandardPlaceLabelsState(state)\n    )\n  }\n}\n/**\n * Create the [ClickInteraction] for Mapbox Standard Style `buildings` featureset and an optional [importId].\n *\n * When several [ClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n *\n * @param importId optional style import id. Defaults to NULL.\n * @param filter optional filter. Defaults to NULL.\n * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n * @param onClick callback triggered when the `buildings` featureset is clicked.\n */\n@JvmOverloads\nfun ClickInteraction.Companion.standardBuildings(\n  importId: String? = null,\n  filter: Value? = null,\n  radius: Double? = null,\n  onClick: (StandardBuildingsFeature, InteractionContext) -> Boolean\n): MapInteraction {\n  return ClickInteraction(\n    FeaturesetDescriptor(\n      /* featuresetId */ StandardBuildings.FEATURESET_ID,\n      /* importId */ importId ?: TypedFeaturesetDescriptor.DEFAULT_IMPORT_ID,\n      /* layerId */null\n    ),\n    filter,\n    radius,\n    onClick\n  ) { feature, featuresetFeatureId, state ->\n    StandardBuildingsFeature(\n      id = featuresetFeatureId,\n      importId = importId,\n      originalFeature = feature,\n      state = StandardBuildingsState(state)\n    )\n  }\n}\n\n/**\n * Create the [LongClickInteraction] for Mapbox Standard Style `buildings` featureset and an optional [importId].\n *\n * When several [LongClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n *\n * @param importId optional style import id. Defaults to NULL.\n * @param filter optional filter. Defaults to NULL.\n * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n * @param onLongClick callback triggered when the `buildings` featureset is long clicked.\n */\n@JvmOverloads\nfun LongClickInteraction.Companion.standardBuildings(\n  importId: String? = null,\n  filter: Value? = null,\n  radius: Double? = null,\n  onLongClick: (StandardBuildingsFeature, InteractionContext) -> Boolean\n): MapInteraction {\n  return LongClickInteraction(\n    FeaturesetDescriptor(\n      /* featuresetId */ StandardBuildings.FEATURESET_ID,\n      /* importId */ importId ?: TypedFeaturesetDescriptor.DEFAULT_IMPORT_ID,\n      /* layerId */null\n    ),\n    filter,\n    radius,\n    onLongClick\n  ) { feature, featuresetFeatureId, state ->\n    StandardBuildingsFeature(\n      id = featuresetFeatureId,\n      importId = importId,\n      originalFeature = feature,\n      state = StandardBuildingsState(state)\n    )\n  }\n}\n/**\n * Create the [ClickInteraction] for Mapbox Standard Style `landmark-icons` featureset and an optional [importId].\n *\n * When several [ClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n *\n * @param importId optional style import id. Defaults to NULL.\n * @param filter optional filter. Defaults to NULL.\n * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n * @param onClick callback triggered when the `landmark-icons` featureset is clicked.\n */\n@JvmOverloads\nfun ClickInteraction.Companion.standardLandmarkIcons(\n  importId: String? = null,\n  filter: Value? = null,\n  radius: Double? = null,\n  onClick: (StandardLandmarkIconsFeature, InteractionContext) -> Boolean\n): MapInteraction {\n  return ClickInteraction(\n    FeaturesetDescriptor(\n      /* featuresetId */ StandardLandmarkIcons.FEATURESET_ID,\n      /* importId */ importId ?: TypedFeaturesetDescriptor.DEFAULT_IMPORT_ID,\n      /* layerId */null\n    ),\n    filter,\n    radius,\n    onClick\n  ) { feature, featuresetFeatureId, state ->\n    StandardLandmarkIconsFeature(\n      id = featuresetFeatureId,\n      importId = importId,\n      originalFeature = feature,\n      state = StandardLandmarkIconsState(state)\n    )\n  }\n}\n\n/**\n * Create the [LongClickInteraction] for Mapbox Standard Style `landmark-icons` featureset and an optional [importId].\n *\n * When several [LongClickInteraction]s are registered for the same [importId] - the callbacks will be triggered from last to first.\n *\n * @param importId optional style import id. Defaults to NULL.\n * @param filter optional filter. Defaults to NULL.\n * @param radius of an extra area around touch in screen pixels. Defaults to NULL meaning 0-radius pixels area.\n * @param onLongClick callback triggered when the `landmark-icons` featureset is long clicked.\n */\n@JvmOverloads\nfun LongClickInteraction.Companion.standardLandmarkIcons(\n  importId: String? = null,\n  filter: Value? = null,\n  radius: Double? = null,\n  onLongClick: (StandardLandmarkIconsFeature, InteractionContext) -> Boolean\n): MapInteraction {\n  return LongClickInteraction(\n    FeaturesetDescriptor(\n      /* featuresetId */ StandardLandmarkIcons.FEATURESET_ID,\n      /* importId */ importId ?: TypedFeaturesetDescriptor.DEFAULT_IMPORT_ID,\n      /* layerId */null\n    ),\n    filter,\n    radius,\n    onLongClick\n  ) { feature, featuresetFeatureId, state ->\n    StandardLandmarkIconsFeature(\n      id = featuresetFeatureId,\n      importId = importId,\n      originalFeature = feature,\n      state = StandardLandmarkIconsState(state)\n    )\n  }\n}\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardLandmarkIcons.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.FeaturesetDescriptor\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\n\n/**\n * Represents a `landmark-icons` featureset from Mapbox Standard Style.\n */\nclass StandardLandmarkIcons @JvmOverloads constructor(\n  /**\n   * Optional import id when using Mapbox Standard Style as a style import for another style.\n   */\n  val importId: String? = null,\n) : TypedFeaturesetDescriptor<StandardLandmarkIconsState, StandardLandmarkIconsFeature>() {\n\n  /**\n   * For internal usage.\n   */\n  override fun toFeaturesetDescriptor() =\n    FeaturesetDescriptor(FEATURESET_ID, importId ?: DEFAULT_IMPORT_ID, null)\n\n  /**\n   * For internal usage.\n   */\n  override fun getFeatureState(rawState: Value) = StandardLandmarkIconsState(rawState)\n\n  /**\n   * For internal usage.\n   */\n  override fun getFeaturesetFeature(\n    feature: Feature,\n    featureNamespace: String?,\n    rawState: Value\n  ) = feature.id()?.let { featureId ->\n    StandardLandmarkIconsFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      importId = importId,\n      originalFeature = feature,\n      state = getFeatureState(rawState)\n    )\n  } ?: StandardLandmarkIconsFeature(\n    id = null,\n    importId = importId,\n    originalFeature = feature,\n    state = getFeatureState(rawState)\n  )\n\n  /**\n   * Overloaded equals.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as StandardLandmarkIcons\n\n    return importId == other.importId\n  }\n\n  /**\n   * Overloaded hashcode.\n   */\n  override fun hashCode(): Int {\n    return importId.hashCode()\n  }\n\n  internal companion object {\n    internal const val FEATURESET_ID = \"landmark-icons\"\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsFeature.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * Icons for landmark buildings\n *\n * Typed class of [FeaturesetFeature] representing StandardLandmarkIcons coming from Mapbox Standard Style.\n * Allows easy access to [Feature] properties.\n */\nclass StandardLandmarkIconsFeature(\n  id: FeaturesetFeatureId?,\n  importId: String?,\n  originalFeature: Feature,\n  state: StandardLandmarkIconsState,\n) : FeaturesetFeature<StandardLandmarkIconsState>(\n  id = id,\n  descriptor = StandardLandmarkIcons(importId),\n  originalFeature = originalFeature,\n  state = state\n) {\n\n  /**\n   * Unique landmark ID.\n   */\n  val landmarkId get(): String? = originalFeature.getStringProperty(\"id\")\n\n  /**\n   * Name of the Landmark in local language.\n   */\n  val name get(): String? = originalFeature.getStringProperty(\"name\")\n\n  /**\n   * Name of the Landmark in English.\n   */\n  val nameEn get(): String? = originalFeature.getStringProperty(\"name_en\")\n\n  /**\n   * Short name of the Landmark in local language.\n   */\n  val shortName get(): String? = originalFeature.getStringProperty(\"short_name\")\n\n  /**\n   * Short name of the Landmark in English.\n   */\n  val shortNameEn get(): String? = originalFeature.getStringProperty(\"short_name_en\")\n\n  /**\n   * Landmark type or building use.\n   */\n  val type get(): String? = originalFeature.getStringProperty(\"type\")\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.logW\n\n/**\n * Typed feature state class needed for generic `MapboxMap.setFeatureState` and `MapboxMap.getFeatureState`\n * when working with StandardLandmarkIcons in Mapbox Standard Style.\n */\nclass StandardLandmarkIconsState internal constructor(\n  /**\n   * For internal usage.\n   * @suppress\n   */\n  @get:RestrictTo(RestrictTo.Scope.LIBRARY)\n  override val internalState: Value,\n) : FeatureState(internalState) {\n\n  /**\n   * Builder class to build [StandardLandmarkIconsState].\n   */\n  class Builder : FeatureState.Builder() {\n\n    /**\n     * Build an instance of [StandardLandmarkIconsState].\n     */\n    override fun build(): StandardLandmarkIconsState {\n      if (rawStateMap.isEmpty()) {\n        logW(TAG, \"Constructing an empty StandardLandmarkIconsState. Is this intended?\")\n      }\n      return StandardLandmarkIconsState(Value(rawStateMap))\n    }\n  }\n}\n\n/**\n * Builder function to create [StandardLandmarkIconsState].\n */\n@JvmSynthetic\nfun StandardLandmarkIconsState(init: StandardLandmarkIconsState.Builder.() -> Unit): StandardLandmarkIconsState =\n  StandardLandmarkIconsState.Builder().apply(init).build()"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardLandmarkIconsStateKey.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.interactions.FeatureStateKey\n\n/**\n * State keys for [StandardLandmarkIconsState] that should be used in `removeFeatureState`.\n */\nclass StandardLandmarkIconsStateKey private constructor(\n  key: String\n) : FeatureStateKey<StandardLandmarkIconsState>(key) {\n\n  /**\n   * Static states.\n   */\n  companion object {\n\n    /**\n     * Create custom [StandardLandmarkIconsStateKey] from given [key].\n     *\n     * Should not be used in most of the cases as this makes sense only when [StandardLandmarkIconsState]\n     * state was constructed with custom state keys / values.\n     */\n    @MapboxDelicateApi\n    fun create(key: String): StandardLandmarkIconsStateKey = StandardLandmarkIconsStateKey(key)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardPlaceLabels.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.FeaturesetDescriptor\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\n\n/**\n * Represents a `place-labels` featureset from Mapbox Standard Style.\n */\nclass StandardPlaceLabels @JvmOverloads constructor(\n  /**\n   * Optional import id when using Mapbox Standard Style as a style import for another style.\n   */\n  val importId: String? = null,\n) : TypedFeaturesetDescriptor<StandardPlaceLabelsState, StandardPlaceLabelsFeature>() {\n\n  /**\n   * For internal usage.\n   */\n  override fun toFeaturesetDescriptor() =\n    FeaturesetDescriptor(FEATURESET_ID, importId ?: DEFAULT_IMPORT_ID, null)\n\n  /**\n   * For internal usage.\n   */\n  override fun getFeatureState(rawState: Value) = StandardPlaceLabelsState(rawState)\n\n  /**\n   * For internal usage.\n   */\n  override fun getFeaturesetFeature(\n    feature: Feature,\n    featureNamespace: String?,\n    rawState: Value\n  ) = feature.id()?.let { featureId ->\n    StandardPlaceLabelsFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      importId = importId,\n      originalFeature = feature,\n      state = getFeatureState(rawState)\n    )\n  } ?: StandardPlaceLabelsFeature(\n    id = null,\n    importId = importId,\n    originalFeature = feature,\n    state = getFeatureState(rawState)\n  )\n\n  /**\n   * Overloaded equals.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as StandardPlaceLabels\n\n    return importId == other.importId\n  }\n\n  /**\n   * Overloaded hashcode.\n   */\n  override fun hashCode(): Int {\n    return importId.hashCode()\n  }\n\n  internal companion object {\n    internal const val FEATURESET_ID = \"place-labels\"\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsFeature.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * Points for labeling places including countries, states, cities, towns, and neighborhoods.\n *\n * Typed class of [FeaturesetFeature] representing StandardPlaceLabels coming from Mapbox Standard Style.\n * Allows easy access to [Feature] properties.\n */\nclass StandardPlaceLabelsFeature(\n  id: FeaturesetFeatureId?,\n  importId: String?,\n  originalFeature: Feature,\n  state: StandardPlaceLabelsState,\n) : FeaturesetFeature<StandardPlaceLabelsState>(\n  id = id,\n  descriptor = StandardPlaceLabels(importId),\n  originalFeature = originalFeature,\n  state = state\n) {\n\n  /**\n   * Name of the place label.\n   */\n  val name get(): String? = originalFeature.getStringProperty(\"name\")\n\n  /**\n   * Provides a broad distinction between place types.\n   */\n  val `class` get(): String? = originalFeature.getStringProperty(\"class\")\n\n  /**\n   * Mandatory feature [Geometry] represented as a [Point].\n   */\n  override val geometry: Point get() = super.geometry as Point\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.logW\n\n/**\n * Typed feature state class needed for generic `MapboxMap.setFeatureState` and `MapboxMap.getFeatureState`\n * when working with StandardPlaceLabels in Mapbox Standard Style.\n */\nclass StandardPlaceLabelsState internal constructor(\n  /**\n   * For internal usage.\n   * @suppress\n   */\n  @get:RestrictTo(RestrictTo.Scope.LIBRARY)\n  override val internalState: Value,\n) : FeatureState(internalState) {\n\n  /**\n   * When `true`, hides the label. Use this state when displaying a custom annotation on top.\n   *\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  val hide: Boolean? get() = (internalState.contents as HashMap<String, Value>)[\"hide\"]?.contents as? Boolean\n\n  /**\n   * When `true`, the feature is highlighted. Use this state to create a temporary effect (e.g. hover).\n   *\n   * Available global configuration(s): \"colorPlaceLabelHighlight\".\n   *\n   * Example of applying \"colorPlaceLabelHighlight\": style.setStyleImportConfigProperty(importId /* \"basemap\" if not specified explicitly */, \"colorPlaceLabelHighlight\", Value.valueOf(newValue))\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  val highlight: Boolean? get() = (internalState.contents as HashMap<String, Value>)[\"highlight\"]?.contents as? Boolean\n\n  /**\n   * When `true`, the feature is selected. Use this state to create a permanent effect. Note: the `select` state has a higher priority than `highlight`.\n   *\n   * Available global configuration(s): \"colorPlaceLabelSelect\".\n   *\n   * Example of applying \"colorPlaceLabelSelect\": style.setStyleImportConfigProperty(importId /* \"basemap\" if not specified explicitly */, \"colorPlaceLabelSelect\", Value.valueOf(newValue))\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  val select: Boolean? get() = (internalState.contents as HashMap<String, Value>)[\"select\"]?.contents as? Boolean\n\n  /**\n   * Builder class to build [StandardPlaceLabelsState].\n   */\n  class Builder : FeatureState.Builder() {\n\n    /**\n     * Set state for [hide]. See the state definition below.\n     *\n     * When `true`, hides the label. Use this state when displaying a custom annotation on top.\n     */\n    fun hide(hide: Boolean): Builder {\n      rawStateMap[\"hide\"] = Value.valueOf(hide)\n      return this\n    }\n\n    /**\n     * Set state for [highlight]. See the state definition below.\n     *\n     * When `true`, the feature is highlighted. Use this state to create a temporary effect (e.g. hover).\n     * Available global configuration(s): \"colorPlaceLabelHighlight\".\n     *\n     * Example of applying \"colorPlaceLabelHighlight\": style.setStyleImportConfigProperty(importId /* \"basemap\" if not specified explicitly */, \"colorPlaceLabelHighlight\", Value.valueOf(newValue))\n     */\n    fun highlight(highlight: Boolean): Builder {\n      rawStateMap[\"highlight\"] = Value.valueOf(highlight)\n      return this\n    }\n\n    /**\n     * Set state for [select]. See the state definition below.\n     *\n     * When `true`, the feature is selected. Use this state to create a permanent effect. Note: the `select` state has a higher priority than `highlight`.\n     * Available global configuration(s): \"colorPlaceLabelSelect\".\n     *\n     * Example of applying \"colorPlaceLabelSelect\": style.setStyleImportConfigProperty(importId /* \"basemap\" if not specified explicitly */, \"colorPlaceLabelSelect\", Value.valueOf(newValue))\n     */\n    fun select(select: Boolean): Builder {\n      rawStateMap[\"select\"] = Value.valueOf(select)\n      return this\n    }\n\n    /**\n     * Build an instance of [StandardPlaceLabelsState].\n     */\n    override fun build(): StandardPlaceLabelsState {\n      if (rawStateMap.isEmpty()) {\n        logW(TAG, \"Constructing an empty StandardPlaceLabelsState. Is this intended?\")\n      }\n      return StandardPlaceLabelsState(Value(rawStateMap))\n    }\n  }\n}\n\n/**\n * Builder function to create [StandardPlaceLabelsState].\n */\n@JvmSynthetic\nfun StandardPlaceLabelsState(init: StandardPlaceLabelsState.Builder.() -> Unit): StandardPlaceLabelsState =\n  StandardPlaceLabelsState.Builder().apply(init).build()"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardPlaceLabelsStateKey.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.interactions.FeatureStateKey\n\n/**\n * State keys for [StandardPlaceLabelsState] that should be used in `removeFeatureState`.\n */\nclass StandardPlaceLabelsStateKey private constructor(\n  key: String\n) : FeatureStateKey<StandardPlaceLabelsState>(key) {\n\n  /**\n   * Static states.\n   */\n  companion object {\n\n    /**\n     * State key standing for \"hide\" feature state.\n     */\n    val HIDE: StandardPlaceLabelsStateKey = StandardPlaceLabelsStateKey(\"hide\")\n\n    /**\n     * State key standing for \"highlight\" feature state.\n     */\n    val HIGHLIGHT: StandardPlaceLabelsStateKey = StandardPlaceLabelsStateKey(\"highlight\")\n\n    /**\n     * State key standing for \"select\" feature state.\n     */\n    val SELECT: StandardPlaceLabelsStateKey = StandardPlaceLabelsStateKey(\"select\")\n\n    /**\n     * Create custom [StandardPlaceLabelsStateKey] from given [key].\n     *\n     * Should not be used in most of the cases as this makes sense only when [StandardPlaceLabelsState]\n     * state was constructed with custom state keys / values.\n     */\n    @MapboxDelicateApi\n    fun create(key: String): StandardPlaceLabelsStateKey = StandardPlaceLabelsStateKey(key)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardPoi.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.FeaturesetDescriptor\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\n\n/**\n * Represents a `poi` featureset from Mapbox Standard Style.\n */\nclass StandardPoi @JvmOverloads constructor(\n  /**\n   * Optional import id when using Mapbox Standard Style as a style import for another style.\n   */\n  val importId: String? = null,\n) : TypedFeaturesetDescriptor<StandardPoiState, StandardPoiFeature>() {\n\n  /**\n   * For internal usage.\n   */\n  override fun toFeaturesetDescriptor() =\n    FeaturesetDescriptor(FEATURESET_ID, importId ?: DEFAULT_IMPORT_ID, null)\n\n  /**\n   * For internal usage.\n   */\n  override fun getFeatureState(rawState: Value) = StandardPoiState(rawState)\n\n  /**\n   * For internal usage.\n   */\n  override fun getFeaturesetFeature(\n    feature: Feature,\n    featureNamespace: String?,\n    rawState: Value\n  ) = feature.id()?.let { featureId ->\n    StandardPoiFeature(\n      id = FeaturesetFeatureId(featureId, featureNamespace),\n      importId = importId,\n      originalFeature = feature,\n      state = getFeatureState(rawState)\n    )\n  } ?: StandardPoiFeature(\n    id = null,\n    importId = importId,\n    originalFeature = feature,\n    state = getFeatureState(rawState)\n  )\n\n  /**\n   * Overloaded equals.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as StandardPoi\n\n    return importId == other.importId\n  }\n\n  /**\n   * Overloaded hashcode.\n   */\n  override fun hashCode(): Int {\n    return importId.hashCode()\n  }\n\n  internal companion object {\n    internal const val FEATURESET_ID = \"poi\"\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardPoiFeature.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.FeaturesetFeatureId\nimport com.mapbox.maps.interactions.FeaturesetFeature\n\n/**\n * A point of interest.\n *\n * Typed class of [FeaturesetFeature] representing StandardPoi coming from Mapbox Standard Style.\n * Allows easy access to [Feature] properties.\n */\nclass StandardPoiFeature(\n  id: FeaturesetFeatureId?,\n  importId: String?,\n  originalFeature: Feature,\n  state: StandardPoiState,\n) : FeaturesetFeature<StandardPoiState>(\n  id = id,\n  descriptor = StandardPoi(importId),\n  originalFeature = originalFeature,\n  state = state\n) {\n\n  /**\n   * Name of the point of interest.\n   */\n  val name get(): String? = originalFeature.getStringProperty(\"name\")\n\n  /**\n   * A high-level category, like POI, airport, transit, etc.\n   */\n  val group get(): String? = originalFeature.getStringProperty(\"group\")\n\n  /**\n   * A broad category of point of interest.\n   */\n  val `class` get(): String? = originalFeature.getStringProperty(\"class\")\n\n  /**\n   * An icon identifier, designed to assign icons using the Maki icon project or other icons that follow the same naming scheme.\n   */\n  val maki get(): String? = originalFeature.getStringProperty(\"maki\")\n\n  /**\n   * Mode of transport served by a stop/station. Expected to be null for non-transit points of interest.\n   */\n  val transitMode get(): String? = originalFeature.getStringProperty(\"transit_mode\")\n\n  /**\n   * A type of transit stop. Expected to be null for non-transit points of interest.\n   */\n  val transitStopType get(): String? = originalFeature.getStringProperty(\"transit_stop_type\")\n\n  /**\n   * A rail station network identifier that is part of specific local or regional transit systems. Expected to be null for non-transit points of interest.\n   */\n  val transitNetwork get(): String? = originalFeature.getStringProperty(\"transit_network\")\n\n  /**\n   * A short identifier code of the airport. Expected to be null for non-airport points of interest\n   */\n  val airportRef get(): String? = originalFeature.getStringProperty(\"airport_ref\")\n\n  /**\n   * Mandatory feature [Geometry] represented as a [Point].\n   */\n  override val geometry: Point get() = super.geometry as Point\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardPoiState.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.bindgen.Value\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.logW\n\n/**\n * Typed feature state class needed for generic `MapboxMap.setFeatureState` and `MapboxMap.getFeatureState`\n * when working with StandardPoi in Mapbox Standard Style.\n */\nclass StandardPoiState internal constructor(\n  /**\n   * For internal usage.\n   * @suppress\n   */\n  @get:RestrictTo(RestrictTo.Scope.LIBRARY)\n  override val internalState: Value,\n) : FeatureState(internalState) {\n\n  /**\n   * When `true`, hides the icon and text. Use this state when displaying a custom annotation on top.\n   *\n   */\n  @Suppress(\"UNCHECKED_CAST\")\n  val hide: Boolean? get() = (internalState.contents as HashMap<String, Value>)[\"hide\"]?.contents as? Boolean\n\n  /**\n   * Builder class to build [StandardPoiState].\n   */\n  class Builder : FeatureState.Builder() {\n\n    /**\n     * Set state for [hide]. See the state definition below.\n     *\n     * When `true`, hides the icon and text. Use this state when displaying a custom annotation on top.\n     */\n    fun hide(hide: Boolean): Builder {\n      rawStateMap[\"hide\"] = Value.valueOf(hide)\n      return this\n    }\n\n    /**\n     * Build an instance of [StandardPoiState].\n     */\n    override fun build(): StandardPoiState {\n      if (rawStateMap.isEmpty()) {\n        logW(TAG, \"Constructing an empty StandardPoiState. Is this intended?\")\n      }\n      return StandardPoiState(Value(rawStateMap))\n    }\n  }\n}\n\n/**\n * Builder function to create [StandardPoiState].\n */\n@JvmSynthetic\nfun StandardPoiState(init: StandardPoiState.Builder.() -> Unit): StandardPoiState =\n  StandardPoiState.Builder().apply(init).build()"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/interactions/standard/generated/StandardPoiStateKey.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.interactions.standard.generated\n\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.interactions.FeatureStateKey\n\n/**\n * State keys for [StandardPoiState] that should be used in `removeFeatureState`.\n */\nclass StandardPoiStateKey private constructor(\n  key: String\n) : FeatureStateKey<StandardPoiState>(key) {\n\n  /**\n   * Static states.\n   */\n  companion object {\n\n    /**\n     * State key standing for \"hide\" feature state.\n     */\n    val HIDE: StandardPoiStateKey = StandardPoiStateKey(\"hide\")\n\n    /**\n     * Create custom [StandardPoiStateKey] from given [key].\n     *\n     * Should not be used in most of the cases as this makes sense only when [StandardPoiState]\n     * state was constructed with custom state keys / values.\n     */\n    @MapboxDelicateApi\n    fun create(key: String): StandardPoiStateKey = StandardPoiStateKey(key)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/module/MapTelemetry.java",
    "content": "package com.mapbox.maps.module;\n\nimport android.os.Bundle;\n\nimport androidx.annotation.Nullable;\n\nimport com.mapbox.common.TelemetryUtils;\n\n/**\n * Definition of map telemetry\n */\npublic interface MapTelemetry {\n\n  /**\n   * Register the app user turnstile event\n   */\n  void onAppUserTurnstileEvent();\n\n  /**\n   * Set the end-user selected state to participate or opt-out in telemetry collection.\n   */\n  void setUserTelemetryRequestState(boolean enabled);\n\n  /**\n   * Disables a started telemetry service for this session only.\n   */\n  void disableTelemetrySession();\n\n  /**\n   * Register a performance event.\n   *\n   * @param data performance event data\n   */\n  void onPerformanceEvent(@Nullable Bundle data);\n\n  /**\n   * Get the end-user selected state to participate or opt-out in telemetry collection.\n   *\n   * @return true if end-user opted-in in telemetry collection, false otherwise.\n   */\n  default boolean getUserTelemetryRequestState() {\n    return TelemetryUtils.getEventsCollectionState();\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/module/TelemetryEvent.kt",
    "content": "package com.mapbox.maps.module\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.FeatureTelemetryCounter\n\n/**\n * Feature telemetry event definition.\n * @suppress\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\nclass TelemetryEvent private constructor(private val name: String) {\n  private val counter: FeatureTelemetryCounter? = try {\n    FeatureTelemetryCounter.create(name)\n  } catch (e: Throwable) {\n    null\n  }\n\n  /**\n   * Static methods.\n   */\n  companion object {\n    fun create(name: String) = TelemetryEvent(\"maps-mobile/$name\")\n  }\n\n  /**\n   * Increment feature telemetry event counter.\n   * @suppress\n   */\n  fun increment() {\n    counter?.increment()\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/ConfigProperties.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin\n\nimport android.graphics.Color\nimport android.os.Parcelable\nimport com.mapbox.maps.ImageHolder\nimport com.mapbox.maps.MapboxExperimental\nimport kotlinx.parcelize.IgnoredOnParcel\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Configures the directions in which the map is allowed to move during a scroll gesture.\n *\n * @param value String value of this property\n */\nenum class ScrollMode(val value: String) {\n  /**\n   * The map may only move horizontally.\n   */\n  HORIZONTAL(\"horizontal\"),\n  /**\n   * The map may only move vertically.\n   */\n  VERTICAL(\"vertical\"),\n  /**\n   * The map may move both horizontally and vertically.\n   */\n  HORIZONTAL_AND_VERTICAL(\"horizontal-and-vertical\"),\n}\n\n/**\n * The enum controls how the puck is oriented\n *\n * @param value String value of this property\n */\nenum class PuckBearing(val value: String) {\n  /**\n   * Orients the puck to match the direction in which the device is facing.\n   */\n  HEADING(\"heading\"),\n  /**\n   * Orients the puck to match the direction in which the device is moving.\n   */\n  COURSE(\"course\"),\n}\n\n/**\n * Sealed class representing a location-puck.\n */\n@Parcelize\nsealed class LocationPuck : Parcelable\n\n/**\n * Definition of a location_puck_2_d.\n */\ndata class LocationPuck2D @JvmOverloads constructor(\n  /**\n   * Name of image in sprite to use as the top of the location indicator.\n   */\n  var topImage: ImageHolder? = null,\n  /**\n   * Name of image in sprite to use as the middle of the location indicator.\n   */\n  var bearingImage: ImageHolder? = null,\n  /**\n   * Name of image in sprite to use as the background of the location indicator.\n   */\n  var shadowImage: ImageHolder? = null,\n  /**\n   * The scale expression of the images. If defined, it will be applied to all the three images.\n   */\n  var scaleExpression: String? = null,\n  /**\n   * The opacity of the entire location puck Default value: 1. Value range: [0, 1]\n   */\n  var opacity: Float = 1f,\n) : LocationPuck()\n\n/**\n * Definition of a location_puck_3_d.\n */\n@OptIn(MapboxExperimental::class)\ndata class LocationPuck3D @JvmOverloads constructor(\n  /**\n   * An URL for the model file in gltf format. Default value: null.\n   */\n  var modelUri: String,\n  /**\n   * The position of the model. Default value: [0,0].\n   */\n  var position: List<Float> = listOf(0f, 0f),\n  /**\n   * The opacity of the model. Default value: 1. Value range: [0, 1]\n   */\n  var modelOpacity: Float = 1f,\n  /**\n   * The scale of the model. Default value: [1,1,1].\n   */\n  var modelScale: List<Float> = listOf(1f, 1f, 1f),\n  /**\n   * The scale expression of the model, which will overwrite the default scale expression that keeps the model size constant during zoom.\n   */\n  var modelScaleExpression: String? = null,\n  /**\n   * The translation of the model [lon, lat, z] Default value: [0,0,0].\n   */\n  var modelTranslation: List<Float> = listOf(0f, 0f, 0f),\n  /**\n   * The rotation of the model. Default value: [0,0,90].\n   */\n  var modelRotation: List<Float> = listOf(0f, 0f, 90f),\n  /**\n   * Enable/Disable shadow casting for the 3D location puck. Default value: true.\n   */\n  @MapboxExperimental\n  var modelCastShadows: Boolean = true,\n  /**\n   * Enable/Disable shadow receiving for the 3D location puck. Default value: true.\n   */\n  @MapboxExperimental\n  var modelReceiveShadows: Boolean = true,\n  /**\n   * Defines scaling mode. Only applies to location-indicator type layers. Default value: \"map\".\n   */\n  @MapboxExperimental\n  var modelScaleMode: ModelScaleMode = ModelScaleMode.VIEWPORT,\n  /**\n   * Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source. Default value: 1. Value range: [0, 5]\n   */\n  var modelEmissiveStrength: Float = 1f,\n  /**\n   * The emissive strength expression of the model, which will overwrite the default model emissive strength.\n   */\n  var modelEmissiveStrengthExpression: String? = null,\n  /**\n   * The opacity expression of the model, which will overwrite the default model opacity.\n   */\n  var modelOpacityExpression: String? = null,\n  /**\n   * The rotation expression of the model, which will overwrite the default model rotation.\n   */\n  var modelRotationExpression: String? = null,\n  /**\n   * The tint color of the model layer. model-color-mix-intensity (defaults to 0) defines tint(mix) intensity - this means that, this color is not used unless model-color-mix-intensity gets value greater than 0. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: \"#ffffff\".\n   */\n  var modelColor: Int = Color.parseColor(\"#ffffff\"),\n  /**\n   * The color expression of the model, which will overwrite the default model color.\n   */\n  var modelColorExpression: String? = null,\n  /**\n   * Intensity of model-color (on a scale from 0 to 1) in color mix with original 3D model's colors. Higher number will present a higher model-color contribution in mix. Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source. Default value: 0. Value range: [0, 1]\n   */\n  var modelColorMixIntensity: Float = 0f,\n  /**\n   * The color mix expression of the model, which will overwrite the default model color mix.\n   */\n  var modelColorMixIntensityExpression: String? = null,\n  /**\n   * The material overrides for the model. Default value: [].\n   */\n  @MapboxExperimental\n  var materialOverrides: List<String> = emptyList(),\n  /**\n   * The node overrides for the model. Default value: [].\n   */\n  @MapboxExperimental\n  var nodeOverrides: List<String> = emptyList(),\n  /**\n   * Selects the base of the model. Some modes might require precomputed elevation data in the tileset. Default value: \"ground\".\n   */\n  @MapboxExperimental\n  var modelElevationReference: ModelElevationReference = ModelElevationReference.GROUND,\n  /**\n   * This property defines whether the `modelColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style. Default value: \"default\".\n   */\n  @MapboxExperimental\n  var modelColorUseTheme: String = \"default\",\n  /**\n   * This property defines whether the `modelColor` uses colorTheme from the style or not. By default it will use color defined by the root theme in the style.\n   */\n  @MapboxExperimental\n  var modelColorUseThemeExpression: String? = null,\n) : LocationPuck()\n\n/**\n * Defines scaling mode. Only applies to location-indicator type layers.\n *\n * @param value String value of this property\n */\n@MapboxExperimental\nenum class ModelScaleMode(val value: String) {\n  /**\n   * Model is scaled so that it's always the same size relative to other map features. The property model-scale specifies how many meters each unit in the model file should cover.\n   */\n  MAP(\"map\"),\n  /**\n   * Model is scaled so that it's always the same size on the screen. The property model-scale specifies how many pixels each unit in model file should cover.\n   */\n  VIEWPORT(\"viewport\"),\n}\n\n/**\n * Selects the base of the model. Some modes might require precomputed elevation data in the tileset.\n *\n * @param value String value of this property\n */\n@MapboxExperimental\nenum class ModelElevationReference(val value: String) {\n  /**\n   * Elevated rendering is enabled. Use this mode to elevate lines relative to the sea level.\n   */\n  SEA(\"sea\"),\n  /**\n   * Elevated rendering is enabled. Use this mode to elevate lines relative to the ground's height below them.\n   */\n  GROUND(\"ground\"),\n}\n\n/**\n * Supported distance unit types.\n *\n * @param value String value of this property\n */\n@Parcelize\nclass DistanceUnits(val value: String) : Parcelable {\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is DistanceUnits &&\n    value == other.value\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = value.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() = \"DistanceUnits(value=$value)\"\n\n  /**\n   * Returns the ordinal of this constant.\n   */\n  @IgnoredOnParcel\n  val ordinal: Int = when (this.value) {\n    \"metric\" -> 0\n    \"imperial\" -> 1\n    \"nautical\" -> 2\n    else -> -1\n  }\n\n  /**\n   * Static methods and variables.\n   */\n  companion object {\n    /**\n     * Metric units using meters and kilometers. The scale bar will automatically choose between meters and kilometers based on the distance being displayed for optimal readability.\n     */\n     @JvmField\n    val METRIC = DistanceUnits(\"metric\")\n    /**\n     * Imperial units using feet for short distances and miles for longer distances.  The scale bar will display distances in feet for small distances and automatically switch to miles for longer distances.\n     */\n     @JvmField\n    val IMPERIAL = DistanceUnits(\"imperial\")\n    /**\n     * Nautical units using fathoms for short distances and nautical miles for longer distances. The scale bar will display distances in fathoms for small distances and automatically switch to nautical miles for longer distances. Commonly used for marine and aviation navigation.\n     */\n     @JvmField\n    val NAUTICAL = DistanceUnits(\"nautical\")\n\n    /**\n     * Utility function to get [DistanceUnits] instance from given [value].\n     */\n    @JvmStatic\n    fun valueOf(value: String): DistanceUnits {\n      return when (value) {\n        \"METRIC\" -> METRIC\n        \"IMPERIAL\" -> IMPERIAL\n        \"NAUTICAL\" -> NAUTICAL\n        else -> throw RuntimeException(\"DistanceUnits.valueOf does not support [$value]\")\n      }\n    }\n\n    /**\n     * Returns an array containing the constants of this type, in the order they're declared. This method may be used to iterate over the constants.\n     */\n     fun values(): List<DistanceUnits> = listOf(METRIC, IMPERIAL, NAUTICAL)\n  }\n }\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/ContextBinder.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport android.content.Context\nimport android.util.AttributeSet\n\n/**\n * Interface to bind a View and underlying context\n */\nfun interface ContextBinder {\n  /**\n   * Bind the ViewPlugin with current map context. This will create a View that\n   * will be added to the MapView.\n   *\n   * @param context The hosting context\n   * @param attrs parent attributes\n   * @param pixelRatio the pixel ratio of the device\n   * @return View that will be added to the MapView\n   */\n  fun bind(context: Context, attrs: AttributeSet?, pixelRatio: Float)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/InvalidPluginConfigurationException.kt",
    "content": "package com.mapbox.maps.plugin\n\n/**\n * Exception thrown when a plugin configuration is invalid.\n */\nclass InvalidPluginConfigurationException(exceptionMessage: String) : Exception(exceptionMessage)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/LifecyclePlugin.kt",
    "content": "package com.mapbox.maps.plugin\n\n/**\n * Interface for plugins interacting with the lifecycle of the hosting context.\n */\ninterface LifecyclePlugin {\n\n  /**\n   * Called whenever activity's/fragment's lifecycle is entering a \"started\" state.\n   */\n  fun onStart() {}\n\n  /**\n   * Called whenever activity's/fragment's lifecycle is entering a \"stopped\" state.\n   */\n  fun onStop() {}\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/MapCameraPlugin.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.EdgeInsets\n\n/**\n * Definition for map camera plugins. The map will constantly push current camera position values.\n */\nfun interface MapCameraPlugin : MapPlugin {\n\n  /**\n   * Called whenever camera position changes.\n   *\n   * @param center camera center\n   * @param zoom zoom\n   * @param pitch pitch in degrees\n   * @param bearing bearing in degrees\n   * @param padding camera padding\n   */\n  fun onCameraMove(\n    center: Point,\n    zoom: Double,\n    pitch: Double,\n    bearing: Double,\n    padding: EdgeInsets\n  )\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/MapPlugin.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\n\n/**\n * Parent definition of all Map plugins.\n */\ninterface MapPlugin {\n  /**\n   * Called when the plugin is first added to the map.\n   */\n  fun initialize() {\n    // optional\n  }\n\n  /**\n   * Called when the map is destroyed. Should be used to cleanup plugin resources for that map.\n   */\n  fun cleanup() {\n    // optional\n  }\n\n  /**\n   * Provides all map delegate instances.\n   */\n  fun onDelegateProvider(delegateProvider: MapDelegateProvider) {\n    // optional\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/MapSizePlugin.kt",
    "content": "package com.mapbox.maps.plugin\n\n/**\n * Plugin interface invoked when the size of map changes.\n */\ninterface MapSizePlugin {\n\n  /**\n   * Invoked when MapView's width and height have changed.\n   * @param width the width of mapView\n   * @param height the height of mapView\n   */\n  fun onSizeChanged(width: Int, height: Int) {\n    // optional\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/MapStyleObserverPlugin.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport com.mapbox.maps.MapboxStyleManager\n\n/**\n * Interface for plugins need to be aware of the style change event.\n */\ninterface MapStyleObserverPlugin {\n  /**\n   * Called when a new Style is loaded.\n   */\n  fun onStyleChanged(style: MapboxStyleManager)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/Plugin.kt",
    "content": "package com.mapbox.maps.plugin\n\n/**\n * Class describing plugin instance.\n *\n * For Mapbox plugins it is enough to provide plugin id from this class without plugin instance.\n * For user-defined plugins both unique id and plugin instance must be provided.\n */\nsealed class Plugin(\n  /**\n   * Unique plugin id.\n   */\n  val id: String,\n  /**\n   * Plugin instance implementing [MapPlugin].\n   * Must be non-null for user-defined plugins or RuntimeException will occur when trying to initiate such plugin.\n   */\n  val instance: MapPlugin?\n) {\n  /**\n   * Should be used to create Mapbox official plugins.\n   *\n   * @param id unique id\n   */\n  class Mapbox(id: String) : Plugin(id, null)\n\n  /**\n   * Should be used to create custom user-defined plugins.\n   *\n   * @param id unique id\n   * @param instance instance of user-defined [MapPlugin]\n   */\n  class Custom(id: String, instance: MapPlugin) : Plugin(id, instance)\n\n  /**\n   * toString implementation.\n   */\n  override fun toString(): String {\n    return \"pluginId = $id, pluginInstance = ${instance?.javaClass}\"\n  }\n\n  /**\n   * Equals implementation taking only id into account.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) {\n      return true\n    }\n    if (other == null || javaClass != other.javaClass) {\n      return false\n    }\n    val that = other as Plugin\n    if (that.id != id) {\n      return false\n    }\n    return true\n  }\n\n  /**\n   * Hash code implementation taking only id into account.\n   */\n  override fun hashCode(): Int {\n    return 31 + id.hashCode()\n  }\n\n  /**\n   * Static ids for Mapbox plugins.\n   */\n  companion object {\n    /**\n     * Id for Mapbox Camera Plugin.\n     */\n    const val MAPBOX_CAMERA_PLUGIN_ID = \"MAPBOX_CAMERA_PLUGIN_ID\"\n    /**\n     * Id for Mapbox Gestures Plugin.\n     */\n    const val MAPBOX_GESTURES_PLUGIN_ID = \"MAPBOX_GESTURES_PLUGIN_ID\"\n    /**\n     * Id for Mapbox Compass Plugin.\n     */\n    const val MAPBOX_COMPASS_PLUGIN_ID = \"MAPBOX_COMPASS_PLUGIN_ID\"\n    /**\n     * Id for Mapbox Logo Plugin.\n     */\n    const val MAPBOX_LOGO_PLUGIN_ID = \"MAPBOX_LOGO_PLUGIN_ID\"\n    /**\n     * Id for Mapbox Attribution Plugin.\n     */\n    const val MAPBOX_ATTRIBUTION_PLUGIN_ID = \"MAPBOX_ATTRIBUTION_PLUGIN_ID\"\n    /**\n     * Id for Mapbox Location Component Plugin.\n     */\n    const val MAPBOX_LOCATION_COMPONENT_PLUGIN_ID = \"MAPBOX_LOCATION_COMPONENT_PLUGIN_ID\"\n    /**\n     * Id for Mapbox Scalebar Plugin.\n     */\n    const val MAPBOX_SCALEBAR_PLUGIN_ID = \"MAPBOX_SCALEBAR_PLUGIN_ID\"\n    /**\n     * Id for Mapbox Annotation Plugin.\n     */\n    const val MAPBOX_ANNOTATION_PLUGIN_ID = \"MAPBOX_ANNOTATION_PLUGIN_ID\"\n    /**\n     * Id for Mapbox Lifecycle Plugin.\n     */\n    const val MAPBOX_LIFECYCLE_PLUGIN_ID = \"MAPBOX_LIFECYCLE_PLUGIN_ID\"\n    /**\n     * Id for Mapbox Map Overlay Plugin.\n     */\n    const val MAPBOX_MAP_OVERLAY_PLUGIN_ID = \"MAPBOX_MAP_OVERLAY_PLUGIN_ID\"\n\n    /**\n     * Id for Mapbox Indoor Floor Selector Plugin.\n     */\n    const val MAPBOX_INDOOR_SELECTOR_PLUGIN_ID = \"MAPBOX_INDOOR_SELECTOR_PLUGIN_ID\"\n\n    /**\n     * Id for Mapbox Map Viewport Plugin.\n     */\n    const val MAPBOX_VIEWPORT_PLUGIN_ID = \"MAPBOX_VIEWPORT_PLUGIN_ID\"\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/ViewPlugin.kt",
    "content": "package com.mapbox.maps.plugin\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.util.AttributeSet\nimport android.view.View\nimport android.widget.FrameLayout\nimport java.lang.ref.WeakReference\n\n/**\n * Defines interface of a ViewPlugin.\n */\nfun interface ViewPlugin : MapPlugin {\n\n  /**\n   * Bind a view instance\n   */\n  fun bind(mapView: FrameLayout, attrs: AttributeSet?, pixelRatio: Float): View\n\n  /**\n   * Provides a view instances returned in [inflate] after it's been added to the MapView.\n   *\n   * @param view plugin view\n   */\n  fun onPluginView(view: View) {\n    // optional\n  }\n\n  /**\n   * Initializer class wraps a bind configuration that can be used during plugin initialisation.\n   *\n   * @param context the context to bind to\n   * @param attributes the attributes to derive configuratio from\n   * @param pixelRatio the device pixel ratio\n   */\n  data class Initializer(val context: WeakReference<Context>, val attributes: TypedArray, val pixelRatio: Float)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsLifecycleListener.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.ValueAnimator\n\n/**\n * Interface responsible to notify about any CameraAnimator lifecycle events registered in [CameraAnimationsPlugin].\n * Those events are:\n *  - animator is about to start\n *  - animator is about to cancel already running animator of same type\n *  - animator is about to end\n *  - animator is about to cancel\n */\ninterface CameraAnimationsLifecycleListener {\n\n  /**\n   * Called when animator is about to start.\n   */\n  fun onAnimatorStarting(type: CameraAnimatorType, animator: ValueAnimator, owner: String?)\n\n  /**\n   * Called when animator is about to cancel already running animator of same [CameraAnimatorType].\n   */\n  fun onAnimatorInterrupting(\n    type: CameraAnimatorType,\n    runningAnimator: ValueAnimator,\n    runningAnimatorOwner: String?,\n    newAnimator: ValueAnimator,\n    newAnimatorOwner: String?\n  )\n\n  /**\n   * Called when animator is about to end.\n   */\n  fun onAnimatorEnding(type: CameraAnimatorType, animator: ValueAnimator, owner: String?)\n\n  /**\n   * Called when [ValueAnimator] is about to cancel.\n   */\n  fun onAnimatorCancelling(type: CameraAnimatorType, animator: ValueAnimator, owner: String?)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPlugin.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.Animator\nimport android.animation.ValueAnimator\nimport com.mapbox.common.Cancelable\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.MapPlugin\n\n/**\n * Interface to interact with Camera Animations plugin\n */\ninterface CameraAnimationsPlugin : MapPlugin {\n\n  /**\n   * If debug mode is enabled extra logs will be written about animation lifecycle and\n   * some other events that may be useful for debugging.\n   */\n  var debugMode: Boolean\n\n  /**\n   * Map camera anchor value.\n   * Default value is NULL meaning center of given map view.\n   * Left-top corner is represented as [ScreenCoordinate] (0.0, 0.0).\n   *\n   * If [anchor] is set to some specific value (set directly or by some running anchor animation)\n   * it will be used as anchor for all upcoming animations even if they do not animate anchor directly.\n   *\n   * **Note**: If anchor animator is started and no start value is specified explicitly\n   * and [anchor] = NULL - then start value will be set to ScreenCoordinate(0.0, 0.0) automatically\n   * and it will be start point for interpolation.\n   */\n  var anchor: ScreenCoordinate?\n\n  /**\n   * Ease the map camera to a given camera options.\n   *\n   * @param cameraOptions The camera options to ease to\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  fun easeTo(\n    cameraOptions: CameraOptions,\n    animationOptions: MapAnimationOptions? = null,\n    animatorListener: Animator.AnimatorListener? = null\n  ): Cancelable\n\n  /**\n   * Scale the map by with optional animation.\n   *\n   * @param amount The amount to scale by\n   * @param screenCoordinate The optional focal point to scale on\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  fun scaleBy(\n    amount: Double,\n    screenCoordinate: ScreenCoordinate?,\n    animationOptions: MapAnimationOptions? = null,\n    animatorListener: Animator.AnimatorListener? = null\n  ): Cancelable\n\n  /**\n   * Move the map by a given screen coordinate with optional animation.\n   *\n   * @param screenCoordinate The screen coordinate distance to move by\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  fun moveBy(\n    screenCoordinate: ScreenCoordinate,\n    animationOptions: MapAnimationOptions? = null,\n    animatorListener: Animator.AnimatorListener? = null\n  ): Cancelable\n\n  /**\n   * Rotate the map by with optional animation.\n   *\n   * @param first The first pointer to rotate on\n   * @param second The second pointer to rotate on\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  fun rotateBy(\n    first: ScreenCoordinate,\n    second: ScreenCoordinate,\n    animationOptions: MapAnimationOptions? = null,\n    animatorListener: Animator.AnimatorListener? = null\n  ): Cancelable\n\n  /**\n   * Pitch the map by with optional animation.\n   *\n   * @param pitch The amount to pitch by\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  fun pitchBy(\n    pitch: Double,\n    animationOptions: MapAnimationOptions? = null,\n    animatorListener: Animator.AnimatorListener? = null\n  ): Cancelable\n\n  /**\n   * Fly the map camera to a given camera options.\n   *\n   * This method implements an “optimal path” animation, as detailed in:\n\n   * Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and\n   * panning.” INFOVIS ’03. pp. 15–22.\n   * [The online documentation](https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5).\n\n   * Where applicable, local variable documentation begins with the associated\n   * variable or function in van Wijk (2003).\n   *\n   * @param cameraOptions The camera options to fly to\n   * @param animationOptions Transition options (animation duration, listeners etc)\n   *\n   * @return [Cancelable] animator set object.\n   */\n  fun flyTo(\n    cameraOptions: CameraOptions,\n    animationOptions: MapAnimationOptions? = null,\n    animatorListener: Animator.AnimatorListener? = null\n  ): Cancelable\n\n  /**\n   * Create CameraZoomAnimator\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  fun createZoomAnimator(\n    options: CameraAnimatorOptions<Double>,\n    block: (ValueAnimator.() -> Unit)? = null\n  ): ValueAnimator\n\n  /**\n   * Create CameraAnchorAnimator\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  fun createAnchorAnimator(\n    options: CameraAnimatorOptions<ScreenCoordinate>,\n    block: (ValueAnimator.() -> Unit)? = null\n  ): ValueAnimator\n\n  /**\n   * Create CameraBearingAnimator. Current map camera option will be applied on animation start if not specified explicitly with [options.startValue].\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param useShortestPath if set to True shortest bearing path will be applied while animating bearing values.\n   * If set to False clock-wise rotation will be used if next target is greater or equal than current one\n   * and counter clock-wise rotation will be used if next target less than current one.\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  fun createBearingAnimator(\n    options: CameraAnimatorOptions<Double>,\n    useShortestPath: Boolean = true,\n    block: (ValueAnimator.() -> Unit)? = null\n  ): ValueAnimator\n\n  /**\n   * Create CameraPitchAnimator. Current map camera option will be applied on animation start if not specified explicitly with [options.startValue].\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  fun createPitchAnimator(\n    options: CameraAnimatorOptions<Double>,\n    block: (ValueAnimator.() -> Unit)? = null\n  ): ValueAnimator\n\n  /**\n   * Create CameraPaddingAnimator. Current map camera option will be applied on animation start if not specified explicitly with [options.startValue].\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  fun createPaddingAnimator(\n    options: CameraAnimatorOptions<EdgeInsets>,\n    block: (ValueAnimator.() -> Unit)? = null\n  ): ValueAnimator\n\n  /**\n   * Create CameraCenterAnimator. Current map camera option will be applied on animation start if not specified explicitly with [options.startValue].\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  @Deprecated(\n    message = \"createCenterAnimator(options, block) is deprecated, please use createCenterAnimator(options, useShortestPath, block) instead.\",\n    replaceWith = ReplaceWith(\"createCenterAnimator(options, useShortestPath, block)\")\n  )\n  fun createCenterAnimator(\n    options: CameraAnimatorOptions<Point>,\n    block: (ValueAnimator.() -> Unit)? = null\n  ): ValueAnimator = createCenterAnimator(options, false, block)\n\n  /**\n   * Create CameraCenterAnimator. Current map camera option will be applied on animation start if not specified explicitly with [options.startValue].\n   *\n   * @param options animator options object to set targets and other non mandatory options\n   * @param useShortestPath if set to True, shortest path will be applied when the start and end camera is across the antimeridian, for example from -170 to 170 longitude.\n   * @param block optional block to apply any [ValueAnimator] parameters\n   */\n  fun createCenterAnimator(\n    options: CameraAnimatorOptions<Point>,\n    useShortestPath: Boolean,\n    block: (ValueAnimator.() -> Unit)? = null\n  ): ValueAnimator\n\n  /**\n   * Register an animator\n   */\n  fun registerAnimators(vararg cameraAnimators: ValueAnimator)\n\n  /**\n   * Cancel all animators except ones owned by [exceptOwnerList] list.\n   */\n  fun cancelAllAnimators(exceptOwnerList: List<String> = emptyList())\n\n  /**\n   * Unregister all animators\n   */\n  fun unregisterAnimators(\n    vararg cameraAnimators: ValueAnimator,\n    cancelAnimators: Boolean = true\n  )\n\n  /**\n   * Utility method to calculate scale by using the amount and current zoom\n   */\n  fun calculateScaleBy(amount: Double, currentZoom: Double): Double\n\n  /**\n   * Add camera bearing change listener\n   *\n   * @param listener to be invoked when camera bearing value changes\n   */\n  fun addCameraBearingChangeListener(listener: CameraAnimatorChangeListener<Double>)\n\n  /**\n   * Add camera pitch change listener\n   *\n   * @param listener to be invoked when camera pitch value changes\n   */\n  fun addCameraPitchChangeListener(listener: CameraAnimatorChangeListener<Double>)\n\n  /**\n   * Add camera zoom change listener\n   *\n   * @param listener to be invoked when camera zoom value changes\n   */\n  fun addCameraZoomChangeListener(listener: CameraAnimatorChangeListener<Double>)\n\n  /**\n   * Remove camera zoom change listener\n   *\n   * @param listener to be invoked when camera zoom value changes\n   */\n  fun removeCameraZoomChangeListener(listener: CameraAnimatorChangeListener<Double>)\n\n  /**\n   * Add camera center change listener\n   *\n   * @param listener to be invoked when camera center value changes\n   */\n  fun addCameraCenterChangeListener(listener: CameraAnimatorChangeListener<Point>)\n\n  /**\n   * Remove camera center change listener\n   *\n   * @param listener to be invoked when camera center value changes\n   */\n  fun removeCameraCenterChangeListener(listener: CameraAnimatorChangeListener<Point>)\n\n  /**\n   * Add camera padding change listener\n   *\n   * @param listener to be invoked when camera padding value changes\n   */\n  fun addCameraPaddingChangeListener(listener: CameraAnimatorChangeListener<EdgeInsets>)\n\n  /**\n   * Remove camera padding change listener\n   *\n   * @param listener to be invoked when camera padding value changes\n   */\n  fun removeCameraPaddingChangeListener(listener: CameraAnimatorChangeListener<EdgeInsets>)\n\n  /**\n   * Add camera anchor change listener\n   *\n   * @param listener to be invoked when camera anchor value changes\n   */\n  fun addCameraAnchorChangeListener(listener: CameraAnimatorNullableChangeListener<ScreenCoordinate?>)\n\n  /**\n   * Remove camera anchor change listener\n   *\n   * @param listener to be invoked when camera anchor value changes\n   */\n  fun removeCameraAnchorChangeListener(listener: CameraAnimatorNullableChangeListener<ScreenCoordinate?>)\n\n  /**\n   * Add camera bearing change listener\n   *\n   * @param listener to be invoked when camera bearing value changes\n   */\n  fun removeCameraBearingChangeListener(listener: CameraAnimatorChangeListener<Double>)\n\n  /**\n   * Remove camera pitch change listener\n   *\n   * @param listener to be invoked when camera pitch value changes\n   */\n  fun removeCameraPitchChangeListener(listener: CameraAnimatorChangeListener<Double>)\n\n  /**\n   * Add given [CameraAnimationsLifecycleListener] for capturing all events about animators lifecycle.\n   *\n   */\n  fun addCameraAnimationsLifecycleListener(listener: CameraAnimationsLifecycleListener)\n\n  /**\n   * Remove given [CameraAnimationsLifecycleListener] for capturing all events about animators lifecycle.\n   *\n   */\n  fun removeCameraAnimationsLifecycleListener(listener: CameraAnimationsLifecycleListener)\n\n  /**\n   * Play given [ValueAnimator]'s together\n   *\n   * @param animators Variable number of [ValueAnimator]'s\n   */\n  fun playAnimatorsTogether(vararg animators: ValueAnimator)\n\n  /**\n   * Play given [ValueAnimator]'s sequentially\n   *\n   * @param animators Variable number of [ValueAnimator]'s\n   */\n  fun playAnimatorsSequentially(vararg animators: ValueAnimator)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorChangeListener.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\n/**\n * Interface to get updated non-nullable animator values.\n */\nfun interface CameraAnimatorChangeListener<T> {\n\n  /**\n   * Called when new animator value has arrived different from previous one.\n   *\n   * @param updatedValue value when given camera property has changed.\n   */\n  fun onChanged(updatedValue: T)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorNullableChangeListener.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\n/**\n * Interface to get updated animator values including nulls.\n */\nfun interface CameraAnimatorNullableChangeListener<T> {\n\n  /**\n   * Called when new animator value has arrived different from previous one.\n   *\n   * @param updatedValue value when given camera property has changed.\n   */\n  fun onChanged(updatedValue: T?)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorOptions.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\n/**\n * Class responsible for storing options used by all CameraAnimator's from [CameraAnimationsPlugin].\n * [CameraAnimatorOptions.Builder] should be used to create options object via DSL function [cameraAnimatorOptions].\n */\nclass CameraAnimatorOptions<T> private constructor(\n  /**\n   * CameraAnimator targets (values between which interpolation will take place).\n   */\n  vararg val targets: T,\n  /**\n   * If specified explicitly - this value will be used as first target.\n   * Otherwise current camera option on animation start will be taken.\n   */\n  val startValue: T?,\n  /**\n   * Optional field indicating who created animator.\n   * Defaults to NULL if not specified explicitly.\n   */\n  val owner: String?\n) {\n\n  /**\n   * Builder class used to construct immutable [CameraAnimatorOptions] object.\n   */\n  class Builder<T>(\n    /**\n     * CameraAnimator targets (values between which interpolation will take place).\n     */\n    vararg val targets: T\n  ) {\n\n    /**\n     * Animator start value.\n     * If specified explicitly - this value will be used as first target.\n     * Otherwise current camera option on animation start will be taken.\n     */\n    private var startValue: T? = null\n\n    /**\n     * Optional field indicating who created animator.\n     * Defaults to NULL if not specified explicitly.\n     */\n    private var owner: String? = null\n\n    /**\n     * Animator start value.\n     * If specified explicitly - this value will be used as first target.\n     * Otherwise current camera option on animation start will be taken.\n     */\n    fun startValue(startValue: T): Builder<T> = apply { this.startValue = startValue }\n\n    /**\n     * Optional field indicating who created animator.\n     * Defaults to NULL if not specified explicitly.\n     */\n    fun owner(owner: String): Builder<T> = apply { this.owner = owner }\n\n    /**\n     * Build an actual [CameraAnimatorOptions] object.\n     */\n    fun build() = CameraAnimatorOptions(targets = targets, startValue = startValue, owner = owner)\n  }\n\n  /**\n   * Hash code method.\n   */\n  override fun hashCode(): Int {\n    var result = targets.contentHashCode()\n    result = 31 * result + (owner?.hashCode() ?: 0)\n    result = 31 * result + (startValue?.hashCode() ?: 0)\n    return result\n  }\n\n  /**\n   * Equals method.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) {\n      return true\n    }\n    if (other == null || javaClass != other.javaClass) {\n      return false\n    }\n    val that = other as CameraAnimatorOptions<*>\n    if (that.owner != owner) {\n      return false\n    }\n    if (!that.targets.contentEquals(targets)) {\n      return false\n    }\n    if (that.startValue != startValue) {\n      return false\n    }\n    return true\n  }\n\n  /**\n   * Static methods.\n   */\n  companion object {\n    /**\n     * Builder DSL function to create [CameraAnimatorOptions] object.\n     */\n    inline fun <T> cameraAnimatorOptions(vararg targets: T, block: (Builder<T>.() -> Unit) = {}) =\n      Builder(targets = targets).apply(block).build()\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorType.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport com.mapbox.maps.CameraOptions\n\n/**\n * Enum class representing all possible camera animator types.\n */\nenum class CameraAnimatorType {\n  /**\n   * Animator responsible for [CameraOptions.center]\n   */\n  CENTER,\n  /**\n   * Animator responsible for [CameraOptions.zoom]\n   */\n  ZOOM,\n  /**\n   * Animator responsible for [CameraOptions.bearing]\n   */\n  BEARING,\n  /**\n   * Animator responsible for [CameraOptions.pitch]\n   */\n  PITCH,\n  /**\n   * Animator responsible for [CameraOptions.anchor]\n   */\n  ANCHOR,\n  /**\n   * Animator responsible for [CameraOptions.padding]\n   */\n  PADDING\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/animation/MapAnimationOptions.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\nimport android.animation.TimeInterpolator\n\n/**\n * Map transition options which are used to configure animation if using high-level API like [CameraAnimationsPlugin.easeTo], [CameraAnimationsPlugin.flyTo] etc\n * [MapAnimationOptions.Builder] should be used to create options object via DSL function [mapAnimationOptions].\n */\nclass MapAnimationOptions private constructor(\n  /**\n   * Owner or creator this animation.\n   */\n  val owner: String?,\n  /**\n   * The duration of the animation in milliseconds.\n   * If not set explicitly default duration will be taken (CameraAnimatorsFactory.DEFAULT_ANIMATION_DURATION_MS if using plugin-animation).\n   */\n  val duration: Long?,\n  /**\n   * The amount of time, in milliseconds, to delay starting the animation after animation start.\n   */\n  val startDelay: Long?,\n  /**\n   * The animation interpolator.\n   * If not set explicitly default interpolator will be taken (CameraAnimatorsFactory.DEFAULT_INTERPOLATOR if using plugin-animation).\n   */\n  val interpolator: TimeInterpolator?,\n) {\n\n  /**\n   * Builder class used to construct immutable [MapAnimationOptions] object.\n   */\n  class Builder {\n\n    /**\n     * Owner or creator this animation.\n     */\n    private var owner: String? = null\n\n    /**\n     * The duration of the animation in milliseconds.\n     */\n    private var duration: Long? = null\n\n    /**\n     * The amount of time, in milliseconds, to delay starting the animation after animation start.\n     */\n    private var startDelay: Long? = null\n\n    /**\n     * The animation interpolator.\n     */\n    private var interpolator: TimeInterpolator? = null\n\n    /**\n     * Set the owner or creator this animation.\n     */\n    fun owner(owner: String): Builder = apply { this.owner = owner }\n\n    /**\n     * Set the duration of the animation in milliseconds.\n     */\n    fun duration(duration: Long): Builder = apply { this.duration = duration }\n\n    /**\n     * Set the start delay of the animation in milliseconds.\n     */\n    fun startDelay(startDelay: Long): Builder = apply { this.startDelay = startDelay }\n\n    /**\n     * Set the animation interpolator.\n     */\n    fun interpolator(interpolator: TimeInterpolator): Builder =\n      apply { this.interpolator = interpolator }\n\n    /**\n     * Build an actual [MapAnimationOptions] object.\n     */\n    fun build(): MapAnimationOptions =\n      MapAnimationOptions(owner, duration, startDelay, interpolator)\n  }\n\n  /**\n   * Equals method.\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as MapAnimationOptions\n\n    if (owner != other.owner) return false\n    if (duration != other.duration) return false\n    if (startDelay != other.startDelay) return false\n    if (interpolator != other.interpolator) return false\n\n    return true\n  }\n\n  /**\n   * Hash code method.\n   */\n  override fun hashCode(): Int {\n    var result = owner?.hashCode() ?: 0\n    result = 31 * result + (duration?.hashCode() ?: 0)\n    result = 31 * result + (startDelay?.hashCode() ?: 0)\n    result = 31 * result + (interpolator?.hashCode() ?: 0)\n    return result\n  }\n\n  /**\n   * Static methods.\n   */\n  companion object {\n    /**\n     * Builder DSL function to create [MapAnimationOptions] object.\n     */\n    inline fun mapAnimationOptions(block: Builder.() -> Unit): MapAnimationOptions =\n      Builder().apply(block).build()\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/animation/MapAnimationOwnerRegistry.kt",
    "content": "package com.mapbox.maps.plugin.animation\n\n/**\n * Registry for all plugins using Camera Animation system.\n * This means that all animations controlled by any plugin will create animators with their owner.\n */\nobject MapAnimationOwnerRegistry {\n  /**\n   * Internal animation system owner.\n   */\n  const val INTERNAL = \"Maps-CameraInternal\"\n  /**\n   * Gestures animator owner.\n   */\n  const val GESTURES = \"Maps-Gestures\"\n  /**\n   * Compass animator owner.\n   */\n  const val COMPASS = \"Maps-Compass\"\n  /**\n   * Location animator owner.\n   */\n  const val LOCATION = \"Maps-Location\"\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/Annotation.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport com.google.gson.JsonElement\nimport com.google.gson.JsonObject\nimport com.mapbox.android.gestures.MoveDistancesObject\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\n\n/**\n * Base class for annotations\n */\nabstract class Annotation<T : Geometry>(\n  /**\n   *  Annotation id generated as UUID.\n   *  This id is used to generate underlying [Feature] for the annotation.\n   */\n  val id: String,\n  /** The jsonObject of annotation, saves all the property values of this annotation */\n  protected val jsonObject: JsonObject,\n  /** The geometry that determines the location/shape of this annotation */\n  var geometry: T\n) {\n\n  /**\n   * Get the type of this annotation\n   */\n  abstract fun getType(): AnnotationType\n\n  /**\n   * Set the used data-driven properties\n   */\n  abstract fun setUsedDataDrivenProperties()\n\n  /**\n   * Get the offset geometry for the touch point\n   */\n  abstract fun getOffsetGeometry(\n    mapCameraManagerDelegate: MapCameraManagerDelegate,\n    moveDistancesObject: MoveDistancesObject\n  ): T?\n\n  /**\n   * Set the arbitrary json data of the annotation.\n   *\n   * @param jsonElement the arbitrary json object data\n   */\n  open fun setData(jsonElement: JsonElement?) {\n    jsonObject.add(ID_DATA, jsonElement)\n  }\n\n  /**\n   * Get the arbitrary json object data of the annotation.\n   *\n   * @return the arbitrary json object data if set, else null\n   */\n  open fun getData(): JsonElement? {\n    return jsonObject[ID_DATA]\n  }\n\n  /**\n   * Get a copy of jsonObject from this annotation\n   */\n  fun getJsonObjectCopy(): JsonObject {\n    return jsonObject.deepCopy()\n  }\n\n  /**\n   * Whether this annotation is draggable\n   */\n  var isDraggable: Boolean = false\n\n  /**\n   * Whether or not this annotation has been selected, either via a tap gesture or programmatically.\n   */\n  var isSelected: Boolean = false\n\n  /**\n   * Static variables and methods.\n   */\n  companion object {\n    /** Key for data */\n    const val ID_DATA = \"custom_data\"\n\n    /**\n     * Maximum latitude value in Mercator projection.\n     */\n    const val MAX_MERCATOR_LATITUDE = 85.05112877980659\n\n    /**\n     * Minimum latitude value in Mercator projection.\n     */\n    const val MIN_MERCATOR_LATITUDE = -85.05112877980659\n\n    private const val FEATURE_IDENTIFIER_PREFIX = \"mapbox_annotation_\"\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/AnnotationConfig.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Config class for annotation plugin to get the annotation manager\n */\ndata class AnnotationConfig @JvmOverloads constructor(\n  /** The id of the layer above the annotation layer*/\n  val belowLayerId: String? = null,\n  /** The layer id for layer inside of annotation manager, if not set will use the default id managed by annotation manager.*/\n  val layerId: String? = null,\n  /** The source id for layer inside of annotation manager, if not set will use the default id managed by annotation manager.*/\n  val sourceId: String? = null,\n  /** The configure for GeoJsonSource inside of AnnotationManager*/\n  val annotationSourceOptions: AnnotationSourceOptions? = null,\n  /** The slot name used to position the annotations layer. If not set, null slot (on top of everything) will be used. */\n  val slotName: String? = null,\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/AnnotationManager.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.plugin.delegates.MapDelegateProvider\n\n/**\n * Interface for annotationManager\n */\ninterface AnnotationManager<\n  G : Geometry,\n  T : Annotation<G>,\n  S : AnnotationOptions<G, T>,\n  D : OnAnnotationDragListener<T>,\n  U : OnAnnotationClickListener<T>,\n  V : OnAnnotationLongClickListener<T>,\n  I : OnAnnotationInteractionListener<T>> {\n\n  /**\n   * Create an annotation with the option\n   */\n  fun create(option: S): T\n\n  /**\n   * Create some annotations with the options\n   */\n  fun create(options: List<S>): List<T>\n\n  /**\n   * Update the annotation\n   */\n  fun update(annotation: T)\n\n  /**\n   * Update annotations in the list\n   */\n  fun update(annotations: List<T>)\n\n  /**\n   * Delete the annotation\n   */\n  fun delete(annotation: T)\n\n  /**\n   * Delete annotations in the list\n   */\n  fun delete(annotations: List<T>)\n\n  /**\n   * Delete all the added annotations\n   */\n  fun deleteAll()\n\n  /**\n   * Invoked when Mapview is destroyed\n   */\n  fun onDestroy()\n\n  /**\n   * Toggles the annotation's selection state.\n   * If the annotation is deselected, it becomes selected.\n   * If the annotation is selected, it becomes deselected.\n   * @param annotation: The annotation to select.\n   */\n  fun selectAnnotation(annotation: T)\n\n  /**\n   * Invoked when MapView's width and height have changed.\n   * @param width the width of mapView\n   * @param height the height of mapView\n   */\n  fun onSizeChanged(width: Int, height: Int)\n\n  /**\n   * The delegateProvider\n   */\n  val delegateProvider: MapDelegateProvider\n\n  /**\n   * The added annotations\n   */\n  val annotations: List<T>\n\n  /**\n   * The added dragListensers\n   */\n  val dragListeners: MutableList<D>\n\n  /**\n   * The Added clickListeners\n   */\n  val clickListeners: MutableList<U>\n\n  /**\n   * The added longClickListeners\n   */\n  val longClickListeners: MutableList<V>\n\n  /**\n   * The added interactionListener\n   */\n  val interactionListener: MutableList<I>\n\n  /**\n   * Add a callback to be invoked when an annotation is dragged.\n   *\n   * @param d the callback to be invoked when an annotation is dragged\n   */\n  fun addDragListener(d: D) = dragListeners.add(d)\n\n  /**\n   * Remove a previously added callback that was to be invoked when an annotation has been dragged.\n   *\n   * @param d the callback to be removed\n   */\n  fun removeDragListener(d: D) = dragListeners.remove(d)\n\n  /**\n   * Add a callback to be invoked when a annotation has been clicked.\n   *\n   * @param u the callback to be invoked when a annotation is clicked\n   */\n  fun addClickListener(u: U) = clickListeners.add(u)\n\n  /**\n   * Remove a previously added callback that was to be invoked when annotation has been clicked.\n   *\n   * @param u the callback to be removed\n   */\n  fun removeClickListener(u: U) = clickListeners.remove(u)\n\n  /**\n   * Add a callback to be invoked when a annotation has been long clicked.\n   *\n   * @param v the callback to be invoked when a annotation is clicked\n   */\n  fun addLongClickListener(v: V) = longClickListeners.add(v)\n\n  /**\n   * Remove a previously added callback that was to be invoked when annotation has been long clicked.\n   *\n   * @param v the callback to be removed\n   */\n  fun removeLongClickListener(v: V) = longClickListeners.remove(v)\n\n  /**\n   * Add a callback to be invoked when a annotation has been selected or deselected.\n   *\n   * @param i the callback to be invoked when a annotation is selected or deselected\n   */\n  fun addInteractionListener(i: I) = interactionListener.add(i)\n\n  /**\n   * Remove a previously added callback that was to be invoked when annotation has been selected or deselected.\n   *\n   * @param i the callback to be removed\n   */\n  fun removeInteractionListener(i: I) = interactionListener.remove(i)\n\n  /**\n   * Enable a data-driven property. Please visit [The online documentation](https://docs.mapbox.com/android/maps/guides/data-driven-styling/) for more details about data-driven-styling\n   */\n  fun enableDataDrivenProperty(property: String)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/AnnotationOptions.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport com.mapbox.geojson.Geometry\n\n/**\n * Options interface for building annotations\n */\nfun interface AnnotationOptions<G : Geometry, T : Annotation<G>> {\n  /**\n   * Build an annotation\n   *\n   * @param id: the id for this annotation\n   * @param annotationManager: the annotationManager that manage this annotation\n   *\n   * @return the annotation that is built\n   */\n  fun build(id: String, annotationManager: AnnotationManager<G, T, *, *, *, *, *>): T\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/AnnotationPlugin.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.MapSizePlugin\nimport com.mapbox.maps.plugin.MapStyleObserverPlugin\n\n/**\n * Plugin interface for the annotation.\n */\ninterface AnnotationPlugin : MapPlugin, MapSizePlugin, MapStyleObserverPlugin {\n  /**\n   * Create an annotation manager.\n   *\n   * @param type The type of the created annotation manager\n   * @param annotationConfig Default is null, used for some custom configs\n   * @return The created annotation manager\n   */\n  fun createAnnotationManager(\n    type: AnnotationType,\n    annotationConfig: AnnotationConfig?\n  ): AnnotationManager<*, *, *, *, *, *, *>\n\n  /**\n   * Removes an annotation manager, this will remove the underlying layer and source from the style.\n   * A removed annotation manager will not be able to reuse anymore, users need to create new annotation manager\n   * to add annotations.\n   */\n  fun removeAnnotationManager(annotationManager: AnnotationManager<*, *, *, *, *, *, *>)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/AnnotationSourceOptions.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Configure class for composing GeoJsonSource objects that included in Annotation\n * @see [The online documentation](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#geojson)\n */\ndata class AnnotationSourceOptions @JvmOverloads constructor(\n  /**\n   * Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom\n   * levels).\n   */\n  val maxZoom: Long? = null,\n\n  /**\n   * Size of the tile buffer on each side. A value of 0 produces no buffer. A\n   * value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer\n   * rendering artifacts near tile edges and slower performance.\n   */\n  val buffer: Long? = null,\n\n  /**\n   * Whether to calculate line distance metrics. This is required for line layers that specify `line-gradient` values.\n   */\n  val lineMetrics: Boolean? = null,\n\n  /**\n   * Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\n   */\n  val tolerance: Double? = null,\n\n  /**\n   * Options to show and configure symbol clustering with using `PointAnnotationManager` or `CircleAnnotationManager`.\n   */\n  val clusterOptions: ClusterOptions? = null\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/AnnotationType.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Enum class for annotation types\n */\nenum class AnnotationType(\n  /** The value of type */\n  var value: Int\n) {\n  /** PolygonAnnotation type */\n  PolygonAnnotation(1),\n\n  /** PolylineAnnotation type */\n  PolylineAnnotation(2),\n\n  /** PointAnnotation type */\n  PointAnnotation(3),\n\n  /** CircleAnnotation type */\n  CircleAnnotation(4),\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/ClusterAnnotationManager.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Interface for annotationManager that supports clustering\n */\ninterface ClusterAnnotationManager {\n\n  /**\n   * The Added clusterClickListeners. To interact with the list you can use [addClusterClickListener] and [removeClusterClickListener] methods.\n   */\n   val clusterClickListeners: MutableList<OnClusterClickListener>\n\n  /**\n   * The Added clusterLongClickListeners. To interact with the list you can use [addClusterLongClickListener] and [removeClusterLongClickListener] methods.\n   */\n  val clusterLongClickListeners: MutableList<OnClusterLongClickListener>\n\n  /**\n   * Add a callback to be invoked when a cluster with annotations has been clicked.\n   *\n   * @param clusterClickListener the callback to be invoked when a cluster is clicked\n   */\n  fun addClusterClickListener(clusterClickListener: OnClusterClickListener) = clusterClickListeners.add(clusterClickListener)\n\n  /**\n   * Remove a previously added callback that was to be invoked when cluster with annotations has been clicked.\n   *\n   * @param clusterClickListener - the callback to be removed\n   */\n  fun removeClusterClickListener(clusterClickListener: OnClusterClickListener) = clusterClickListeners.remove(clusterClickListener)\n\n  /**\n   * Add a callback to be invoked when a cluster with annotations has been long clicked.\n   *\n   * @param onClusterLongClickListener the callback to be invoked when a cluster is long clicked\n   */\n  fun addClusterLongClickListener(onClusterLongClickListener: OnClusterLongClickListener) = clusterLongClickListeners.add(onClusterLongClickListener)\n\n  /**\n   * Remove a previously added callback that was to be invoked when cluster with annotations has been long clicked.\n   *\n   * @param onClusterLongClickListener - the callback to be removed\n   */\n  fun removeClusterLongClickListener(onClusterLongClickListener: OnClusterLongClickListener) = clusterLongClickListeners.remove(onClusterLongClickListener)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/ClusterFeature.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.geojson.Feature\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport java.util.Objects\n\n/**\n * [ClusterFeature] is a strongly typed class with cluster related properties in addition to the underlying [Feature] built from [Point].\n *\n * @param featuresetFeature [FeaturesetFeature<FeatureState>] that holds original feature representing the cluster.\n */\nclass ClusterFeature @RestrictTo(RestrictTo.Scope.LIBRARY) constructor(private val featuresetFeature: FeaturesetFeature<FeatureState>) {\n\n  /**\n   * Original feature representing the cluster built from [Point].\n   */\n  val originalFeature = featuresetFeature.originalFeature\n\n  /**\n   * A unique id for the cluster to be used in conjunction with the cluster inspection methods:\n   * [com.mapbox.maps.MapboxMap.getGeoJsonClusterExpansionZoom], [com.mapbox.maps.MapboxMap.getGeoJsonClusterChildren], [com.mapbox.maps.MapboxMap.getGeoJsonClusterLeaves]\n   * Returns the empty string if no such property exists.\n   */\n  val clusterId: String = featuresetFeature.properties.optString(\"cluster_id\", \"\")\n\n  /**\n   * Number of original points grouped into this cluster.\n   * Returns 0L if no such property exists.\n   */\n  val pointCount: Long = featuresetFeature.properties.optLong(\"point_count\", 0L)\n\n  /**\n   * An abbreviated point count.\n   * It's a human-readable representation of the amount of items in a cluster.\n   * For example, if the cluster has 1823 items [pointCountAbbreviated] would be \"1.8K\"\n   * Returns the empty string if no such property exists.\n   */\n  val pointCountAbbreviated: String = featuresetFeature.properties.optString(\"point_count_abbreviated\", \"\")\n\n  /**\n   * See [Any.equals]\n   */\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n\n    other as ClusterFeature\n\n    if (featuresetFeature != other.featuresetFeature) return false\n    if (originalFeature != other.originalFeature) return false\n    if (clusterId != other.clusterId) return false\n    if (pointCount != other.pointCount) return false\n    if (pointCountAbbreviated != other.pointCountAbbreviated) return false\n\n    return true\n  }\n\n  /**\n   * See [Any.hashCode]\n   */\n  override fun hashCode(): Int {\n    return Objects.hash(featuresetFeature, clusterId, pointCount, pointCountAbbreviated, originalFeature)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/ClusterOptions.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\nimport android.graphics.Color\nimport com.mapbox.bindgen.Value\n\n/**\n * Options to show and configure symbol clustering with using `PointAnnotationManager` or `CircleAnnotationManager`.\n *\n * It exposes a minimal of configuration options, a more advanced setup can be created manually with\n * using CircleLayer and SymbolLayers directly.\n *\n */\ndata class ClusterOptions @JvmOverloads constructor(\n\n  /**\n   * If the data is a collection of point features, setting this to true clusters the points\n   * by radius into groups. Cluster groups become new `Point` features in the source with additional properties:\n   * - `cluster` Is `true` if the point is a cluster\n   * - `cluster_id` A unique id for the cluster to be used in conjunction with the\n   * [cluster inspection methods](https://docs.mapbox.com/mapbox-gl-js/api/sources/#geojsonsource#getclusterexpansionzoom, https://docs.mapbox.com/mapbox-gl-js/api/sources/#geojsonsource#getclusterchildren, https://docs.mapbox.com/mapbox-gl-js/api/sources/#geojsonsource#getclusterleaves)\n   * - `point_count` Number of original points grouped into this cluster\n   * - `point_count_abbreviated` An abbreviated point count\n   */\n  val cluster: Boolean = true,\n\n  /**\n   * Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal\n   * to the width of a tile, 50 by default.\n   */\n  val clusterRadius: Long = 50,\n\n  /**\n   * The circle radius of the cluster items in expression.\n   * Have higher priority than [circleRadius], but will apply [circleRadius] if not set any value.\n   */\n  val circleRadiusExpression: Value? = null,\n\n  /**\n   * The circle radius of the cluster items in expression, literal(18) by default\n   */\n  val circleRadius: Double = 18.0,\n\n  /**\n   * The text color of cluster item in expression.\n   * Have higher priority than [textColor], but will apply [textColor] if not set any value.\n   */\n  val textColorExpression: Value? = null,\n\n  /**\n   * The text color of cluster item in expression. color(Color.WHITE) by default\n   */\n  val textColor: Int = Color.WHITE,\n\n  /**\n   * The text size of cluster item in expression.\n   * Have higher priority than[textSize], but will apply [textSize] if not set any value.\n   */\n  val textSizeExpression: Value? = null,\n\n  /**\n   * The text size of cluster item in expression. literal(12) by default.\n   */\n  val textSize: Double = 12.0,\n\n  /**\n   *  The text field of a cluster item in expression. get(\"point_count\") by default.\n   */\n  val textField: Value? = null,\n\n  /**\n   * Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less\n   * than maxzoom (so that last zoom features are not clustered). Clusters are re-evaluated at integer zoom\n   * levels so setting clusterMaxZoom to 14 means the clusters will be displayed until z15.\n   */\n  val clusterMaxZoom: Long = 14,\n\n  /**\n   * Minimum number of points necessary to form a cluster if clustering is enabled. literal(2) by default.\n    */\n  val clusterMinPoints: Long = 2L,\n\n  /**\n   * The cluster color levels, which a pair constructed with amount of point and a int color value.\n   */\n  val colorLevels: List<Pair<Int, Int>> = listOf(Pair(0, Color.BLUE)),\n\n  /**\n   * An object defining custom properties on the generated clusters if clustering is enabled, aggregating values from\n   * clustered points. Has the form `{\"property_name\": [operator, map_expression]}`. `operator` is any expression function that accepts at\n   * least 2 operands (e.g. `\"+\"` or `\"max\"`) — it accumulates the property value from clusters/points the\n   * cluster contains; `map_expression` produces the value of a single point.\n   *\n   * Example: `{\"sum\": [\"+\", [\"get\", \"scalerank\"]]}`.\n   *\n   * For more advanced use cases, in place of `operator`, you can use a custom reduce expression\n   * that references a special `[\"accumulated\"]` value, e.g.:\n   * `{\"sum\": [[\"+\", [\"accumulated\"], [\"get\", \"sum\"]], [\"get\", \"scalerank\"]]}`\n   */\n  val clusterProperties: HashMap<String, Any>? = null,\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/OnAnnotationClickListener.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Generic interface definition of a callback to be invoked when an annotation has been clicked.\n *\n * @param <T> generic parameter extending from Annotation\n */\nfun interface OnAnnotationClickListener<T : Annotation<*>> {\n  /**\n   * Called when an annotation has been clicked\n   *\n   * @param annotation the annotation clicked.\n   * @return True if this click should be consumed and not passed further to other listeners\n   * registered afterwards, false otherwise.\n   */\n  fun onAnnotationClick(annotation: T): Boolean\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/OnAnnotationDragListener.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Generic interface definition of a callback to be invoked when an annotation is being dragged.\n *\n * @param <T> generic parameter extending from Annotation\n */\ninterface OnAnnotationDragListener<out T : Annotation<*>> {\n  /**\n   * Called when an annotation dragging has started.\n   *\n   * @param annotation the annotation\n   */\n  fun onAnnotationDragStarted(annotation: Annotation<*>)\n\n  /**\n   * Called when an annotation dragging is in progress.\n   *\n   * @param annotation the annotation\n   */\n  fun onAnnotationDrag(annotation: Annotation<*>)\n\n  /**\n   * Called when an annotation dragging has finished.\n   *\n   * @param annotation the annotation\n   */\n  fun onAnnotationDragFinished(annotation: Annotation<*>)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/OnAnnotationInteractionListener.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Generic interface definition of a callback to be invoked when an annotation has been selected or deselected.\n *\n * @param <T> generic parameter extending from Annotation\n */\ninterface OnAnnotationInteractionListener<T : Annotation<*>> {\n  /**\n   * Called when an annotation has been selected\n   *\n   * @param annotation the annotation selected.\n   */\n  fun onSelectAnnotation(annotation: T)\n\n  /**\n   * Called when an annotation has been deselected\n   *\n   * @param annotation the annotation deselected.\n   */\n  fun onDeselectAnnotation(annotation: T)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/OnAnnotationLongClickListener.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Generic fun interface definition of a callback to be invoked when an annotation has been long clicked.\n *\n * @param <T> generic parameter extending from Annotation\n */\nfun interface OnAnnotationLongClickListener<T : Annotation<*>> {\n  /**\n   * Generic fun interface definition of a callback to be invoked when an annotation has been long clicked.\n   *\n   * @param <T> generic parameter extending from Annotation\n   */\n  fun onAnnotationLongClick(annotation: T): Boolean\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/OnClusterClickListener.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Interface definition of a callback to be invoked when cluster with annotations has been clicked.\n */\nfun interface OnClusterClickListener {\n  /**\n   * Called when an cluster has been clicked.\n   *\n   * @param cluster the clicked cluster represented by [ClusterFeature].\n   * @return True if this click should be consumed and not passed further to other listeners\n   * registered afterwards, false otherwise.\n   */\n  fun onClusterClick(cluster: ClusterFeature): Boolean\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/annotation/OnClusterLongClickListener.kt",
    "content": "package com.mapbox.maps.plugin.annotation\n\n/**\n * Interface definition of a callback to be invoked when cluster with annotations has been long clicked.\n **/\nfun interface OnClusterLongClickListener {\n  /**\n   * Called when an cluster has been long clicked.\n   *\n   * @param cluster the long clicked cluster represented by [ClusterFeature].\n   * @return True if this click should be consumed and not passed further to other listeners\n   * registered afterwards, false otherwise.\n   */\n  fun onClusterLongClick(cluster: ClusterFeature): Boolean\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/attribution/Attribution.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport com.mapbox.annotation.MapboxExperimental\n\n/**\n * Attribution model class.\n *\n * @property title the attribution title\n * @property titleAbbreviated the shortened attribution title\n * @property url the attribution URL\n */\ndata class Attribution(val title: String, val url: String) {\n\n  val titleAbbreviated: String\n    get() = if (title == OSM) OSM_ABBR else title\n\n  /**\n   * Attribution constant values\n   *\n   * @property OSM OpenStreetMap\n   * @property OSM_ABBR OpenStreetMap abbreviated as OSM\n   * @property TELEMETRY_SETTINGS Telemetry settings\n   * @property PRIVACY_POLICY Privacy policy\n   * @property GEOFENCING Geofencing Consent\n   * @property ABOUT_MAPS_URL Mapbox about maps URL\n   * @property ABOUT_TELEMETRY_URL Mapbox about telemetry URL\n   * @property PRIVACY_POLICY_URL Mapbox privacy policy URL\n   * @property GEOFENCING_URL_MARKER Geofencing Consent marker URL used to shown the consent dialog\n   *\n   */\n  companion object {\n    const val OSM = \"OpenStreetMap\"\n    const val OSM_ABBR = \"OSM\"\n    const val TELEMETRY_SETTINGS = \"Mapbox Telemetry\"\n    const val PRIVACY_POLICY = \"Mapbox Privacy Policy\"\n    const val GEOFENCING = \"Mapbox Geofencing\"\n    const val ABOUT_MAPS_URL = \"https://www.mapbox.com/about/maps/\"\n    const val ABOUT_TELEMETRY_URL = \"https://www.mapbox.com/telemetry/\"\n    const val PRIVACY_POLICY_URL = \"https://www.mapbox.com/legal/privacy#product-privacy-policy/\"\n    const val GEOFENCING_URL_MARKER = \"geofencing_url_marker\"\n  }\n}\n\n/**\n * Determines if this attribution entry represents a Mapbox feedback link.\n *\n * Mapbox feedback attributions are special entries that allow users to provide feedback\n * about map data and require dynamic URL generation with current map state parameters.\n *\n * ## Implementation Notes\n * This function checks for Mapbox domain and feedback-related keywords in the attribution URL.\n * When true, the URL should be built using [AttributionState.buildMapboxFeedbackUrl()] rather\n * than using the attribution's static URL directly.\n *\n * @return true if this attribution represents a Mapbox feedback link that requires\n * dynamic URL generation, false otherwise.\n */\n@MapboxExperimental\nfun Attribution.isMapboxFeedback(): Boolean {\n  return url.contains(\"mapbox.com\") &&\n    (url.contains(\"feedback\") || url.contains(\"contribute\"))\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/attribution/AttributionDialogManager.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\n\n/**\n * Interface for attribution dialog manager. This interface can be used to implement your\n * own AttributionDialogManager to replace the default attribution dialog.\n */\ninterface AttributionDialogManager {\n\n  /**\n   * Invoked when the map attribution should be shown to the end user\n   *\n   */\n  fun showAttribution(mapAttributionDelegate: MapAttributionDelegate)\n\n  /**\n   * Invoked when the hosting Activity#onStop is called\n   */\n  fun onStop()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/attribution/AttributionParserConfig.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\n/**\n * Config class for Attribution\n */\nclass AttributionParserConfig @JvmOverloads constructor(\n  /**\n   * Whether contains improve map attribution\n   */\n  var withImproveMap: Boolean = true,\n  /**\n   * Whether contains copyright sign\n   */\n  var withCopyrightSign: Boolean = true,\n  /**\n   * Whether contains telemetry\n   */\n  var withTelemetryAttribution: Boolean = true,\n  /**\n   * Whether contains mapbox attribution\n   */\n  var withMapboxAttribution: Boolean = true,\n  /**\n   * Whether contains mapbox privacy policy\n   */\n  var withMapboxPrivacyPolicy: Boolean = true,\n  /**\n   * Whether to show Geofencing entry.\n   * Note that the entry will be shown only if the Geofencing is currently active or the user has\n   * previously opted out.\n   */\n  var withMapboxGeofencingConsent: Boolean = true,\n)"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/attribution/AttributionPlugin.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport com.mapbox.maps.plugin.LifecyclePlugin\nimport com.mapbox.maps.plugin.ViewPlugin\nimport com.mapbox.maps.plugin.attribution.generated.AttributionSettingsInterface\nimport com.mapbox.maps.plugin.delegates.MapAttributionDelegate\n\n/**\n * Presenter interface for the attribution.\n */\ninterface AttributionPlugin : ViewPlugin, LifecyclePlugin, AttributionSettingsInterface {\n\n  /**\n   * Set a custom AttributionDialogManager that is invoked when the attribution view is clicked.\n   */\n  fun setCustomAttributionDialogManager(dialogManager: AttributionDialogManager)\n\n  /**\n   * Set the content description for the attribution view.\n   *\n   * @param contentDescription the content description text\n   */\n  fun setContentDescription(contentDescription: CharSequence?) {\n    // Default empty implementation for backward compatibility\n  }\n\n  /**\n   * Get the instance of MapAttributionDelegate\n   */\n  fun getMapAttributionDelegate(): MapAttributionDelegate\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/attribution/AttributionView.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\nimport android.view.View\nimport androidx.annotation.ColorInt\nimport androidx.annotation.Px\n\n/**\n * Interface for attribution view.\n *\n * The attribution view implementation class should implement both the\n * AttributionView interface and a View class (e.g ImageView).\n */\ninterface AttributionView {\n  /**\n   * Set whether the attribution view is enabled.\n   * @param enabled: the enable state\n   */\n  fun setEnable(enabled: Boolean)\n\n  /**\n   * Set the gravity value of the attribution view.\n   * @param gravity view's gravity\n   */\n  fun setGravity(gravity: Int)\n\n  /**\n   * Set the attribution tint color\n   * @param color the tint color\n   */\n  fun setIconColor(@ColorInt color: Int)\n\n  /**\n   * Set the margins of the attribution view.\n   *\n   * @param left Margin to the left in pixel\n   * @param top Margin to the top in pixel\n   * @param right Margin to the right in pixel\n   * @param bottom Margin to the bottom in pixel\n   */\n  fun setAttributionMargins(@Px left: Int, @Px top: Int, @Px right: Int, @Px bottom: Int)\n\n  /**\n   * Set an [View.OnClickListener] to AttributionView\n   */\n  fun setViewOnClickListener(listener: View.OnClickListener)\n\n  /**\n   * Set the content description for accessibility.\n   *\n   * @param contentDescription the content description text\n   */\n  fun setContentDescription(contentDescription: CharSequence?) {\n    // Default empty implementation for backward compatibility\n  }\n\n  /**\n   * Call this when something has changed which has invalidated the\n   * layout of this view. This will schedule a layout pass of the view\n   * tree.\n   */\n  fun requestLayout()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/attribution/OnAttributionClickListener.kt",
    "content": "package com.mapbox.maps.plugin.attribution\n\n/**\n * Listener to get OnClick event on the view.\n */\nfun interface OnAttributionClickListener {\n\n  /**\n   * Invoked when the attribution is clicked.\n   */\n  fun onAttributionClick()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/attribution/generated/AttributionSettingsBase.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.attribution.generated\n\n/**\n * Abstract settings class for AttributionPlugin.\n *\n * This abstract class exposes all the required public APIs to configure the AttributionPlugin.\n */\nabstract class AttributionSettingsBase : AttributionSettingsInterface {\n  /**\n   * Shows the attribution icon on the map.\n   */\n  protected abstract var internalSettings: AttributionSettings\n\n  /**\n   * Apply the changes to the AttributionSettings to the AttributionPlugin.\n   */\n  protected abstract fun applySettings()\n\n  /**\n   * Get current attribution configuration.\n   *\n   * @return attribution settings\n   */\n  override fun getSettings(): AttributionSettings {\n    return internalSettings.toBuilder().build()\n  }\n\n  /**\n   * Update attribution configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of AttributionSettings\n   */\n  override fun updateSettings(block: AttributionSettings.Builder.() -> Unit) {\n    val newSettings = this.internalSettings.toBuilder().apply(block).build()\n    // Trigger the enabled setter to ensure custom logic (e.g., listener management) is executed\n    this.enabled = newSettings.enabled\n    this.internalSettings = newSettings\n    applySettings()\n  }\n\n  /**\n   * Whether the attribution icon is visible on the map. Default value: true.\n   */\n  override var enabled: Boolean\n    get() {\n      return this.internalSettings.enabled\n    }\n    set(value) {\n      if (this.internalSettings.enabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines text color of the attribution icon. Default value: \"#FF1E8CAB\".\n   */\n  override var iconColor: Int\n    get() {\n      return this.internalSettings.iconColor\n    }\n    set(value) {\n      if (this.internalSettings.iconColor != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setIconColor(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines where the attribution icon is positioned on the map Default value: \"bottom-left\".\n   */\n  override var position: Int\n    get() {\n      return this.internalSettings.position\n    }\n    set(value) {\n      if (this.internalSettings.position != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPosition(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the left that the attribution icon honors. Default value: 92.\n   */\n  override var marginLeft: Float\n    get() {\n      return this.internalSettings.marginLeft\n    }\n    set(value) {\n      if (this.internalSettings.marginLeft != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginLeft(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the top that the attribution icon honors. Default value: 4.\n   */\n  override var marginTop: Float\n    get() {\n      return this.internalSettings.marginTop\n    }\n    set(value) {\n      if (this.internalSettings.marginTop != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginTop(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the right that the attribution icon honors. Default value: 4.\n   */\n  override var marginRight: Float\n    get() {\n      return this.internalSettings.marginRight\n    }\n    set(value) {\n      if (this.internalSettings.marginRight != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginRight(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the bottom that the attribution icon honors. Default value: 4.\n   */\n  override var marginBottom: Float\n    get() {\n      return this.internalSettings.marginBottom\n    }\n    set(value) {\n      if (this.internalSettings.marginBottom != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginBottom(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the attribution can be clicked and click events can be registered. Default value: true.\n   */\n  override var clickable: Boolean\n    get() {\n      return this.internalSettings.clickable\n    }\n    set(value) {\n      if (this.internalSettings.clickable != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setClickable(value).build()\n        applySettings()\n      }\n    }\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/attribution/generated/AttributionSettingsData.kt",
    "content": "// This file is generated.\n// This class is annotated with `DataCompat`.\n// Therefore, it is used to auto-generate `AttributionSettings`.\n\npackage com.mapbox.maps.plugin.attribution.generated\n\nimport android.os.Parcelable\nimport com.tobrun.datacompat.annotation.DataCompat\nimport com.tobrun.datacompat.annotation.Default\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Shows the attribution icon on the map.\n */\n@Parcelize\n@DataCompat(\n    importsForDefaults = [\n        \"android.graphics.Color\",\n        \"android.view.Gravity\",\n    ]\n)\nprivate data class AttributionSettingsData(\n\n  /**\n   * Whether the attribution icon is visible on the map. Default value: true.\n   */\n  @Default(\"true\")\n  var enabled: Boolean,\n\n  /**\n   * Defines text color of the attribution icon. Default value: \"#FF1E8CAB\".\n   */\n  @Default(\"Color.parseColor(\\\"#FF1E8CAB\\\")\")\n  var iconColor: Int,\n\n  /**\n   * Defines where the attribution icon is positioned on the map Default value: \"bottom-left\".\n   */\n  @Default(\"Gravity.BOTTOM or Gravity.START\")\n  var position: Int,\n\n  /**\n   * Defines the margin to the left that the attribution icon honors. Default value: 92. This property is specified in pixels.\n   */\n  @Default(\"92f\")\n  var marginLeft: Float,\n\n  /**\n   * Defines the margin to the top that the attribution icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginTop: Float,\n\n  /**\n   * Defines the margin to the right that the attribution icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginRight: Float,\n\n  /**\n   * Defines the margin to the bottom that the attribution icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginBottom: Float,\n\n  /**\n   * Whether the attribution can be clicked and click events can be registered. Default value: true.\n   */\n  @Default(\"true\")\n  var clickable: Boolean,\n) : Parcelable\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/attribution/generated/AttributionSettingsInterface.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.attribution.generated\n\n/**\n * Interface that defines the public settings interface for AttributionPlugin.\n */\ninterface AttributionSettingsInterface {\n  /**\n   * Get current attribution configuration.\n   *\n   * @return attribution settings\n   */\n  fun getSettings(): AttributionSettings\n\n  /**\n   * Update attribution configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of AttributionSettings\n   */\n  fun updateSettings(block: AttributionSettings.Builder.() -> Unit)\n\n  /**\n   * Whether the attribution icon is visible on the map. Default value: true.\n   */\n  var enabled: Boolean\n\n  /**\n   * Defines text color of the attribution icon. Default value: \"#FF1E8CAB\".\n   */\n  var iconColor: Int\n\n  /**\n   * Defines where the attribution icon is positioned on the map Default value: \"bottom-left\".\n   */\n  var position: Int\n\n  /**\n   * Defines the margin to the left that the attribution icon honors. Default value: 92.\n   */\n  var marginLeft: Float\n\n  /**\n   * Defines the margin to the top that the attribution icon honors. Default value: 4.\n   */\n  var marginTop: Float\n\n  /**\n   * Defines the margin to the right that the attribution icon honors. Default value: 4.\n   */\n  var marginRight: Float\n\n  /**\n   * Defines the margin to the bottom that the attribution icon honors. Default value: 4.\n   */\n  var marginBottom: Float\n\n  /**\n   * Whether the attribution can be clicked and click events can be registered. Default value: true.\n   */\n  var clickable: Boolean\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/compass/CompassPlugin.kt",
    "content": "package com.mapbox.maps.plugin.compass\n\nimport com.mapbox.maps.plugin.LifecyclePlugin\nimport com.mapbox.maps.plugin.MapCameraPlugin\nimport com.mapbox.maps.plugin.ViewPlugin\nimport com.mapbox.maps.plugin.compass.generated.CompassSettingsInterface\n\n/**\n * Presenter interface for the Compass.\n */\ninterface CompassPlugin : ViewPlugin, MapCameraPlugin, LifecyclePlugin, CompassSettingsInterface {\n\n  /**\n   * Add an OnClick listener to the presenter.\n   *\n   * @param onClickListener Listener for OnClick events\n   */\n  fun addCompassClickListener(onClickListener: OnCompassClickListener)\n\n  /**\n   * Remove an OnClick listener from the presenter.\n   *\n   * @param onClickListener Listener for OnClick events\n   */\n  fun removeCompassClickListener(onClickListener: OnCompassClickListener)\n\n  /**\n   * Invoked when the compass view is clicked.\n   */\n  fun onCompassClicked()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/compass/CompassView.kt",
    "content": "package com.mapbox.maps.plugin.compass\n\nimport android.graphics.drawable.Drawable\nimport androidx.annotation.Px\n\n/**\n * Interface for compass view.\n *\n * The compass view implementation class should implement both the\n * CompassView interface and a View class(e.g ImageView).\n */\ninterface CompassView {\n  /**\n   * Whether the compass view is visible.\n   */\n  var isCompassVisible: Boolean\n\n  /**\n   * Whether the compass view is enabled.\n   */\n  var isCompassEnabled: Boolean\n\n  /**\n   * The CompassView image as a Drawable.\n   */\n  var compassImage: Drawable\n\n  /**\n   * Returns the gravity value of the CompassView.\n   */\n  var compassGravity: Int\n\n  /**\n   * The direction of the CompassView.\n   */\n  var compassRotation: Float\n\n  /**\n   * Set the alpha value of the compass.\n   *\n   * @param float the alpha value\n   */\n  fun setCompassAlpha(float: Float)\n\n  /**\n   * Set the margins of the compass view.\n   *\n   * @param left Margin to the left in pixel\n   * @param top Margin to the top in pixel\n   * @param right Margin to the right in pixel\n   * @param bottom Margin to the bottom in pixel\n   */\n  fun setCompassMargins(@Px left: Int, @Px top: Int, @Px right: Int, @Px bottom: Int)\n\n  /**\n   * Call this when something has changed which has invalidated the\n   * layout of this view. This will schedule a layout pass of the view\n   * tree.\n   */\n  fun requestLayout()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/compass/OnCompassClickListener.kt",
    "content": "package com.mapbox.maps.plugin.compass\n\n/**\n * Listener to get OnClick event on the view.\n */\nfun interface OnCompassClickListener {\n\n  /**\n   * Invoked when the compass is clicked.\n   */\n  fun onCompassClick()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/compass/generated/CompassSettingsBase.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.compass.generated\n\nimport com.mapbox.maps.ImageHolder\n\n/**\n * Abstract settings class for CompassPlugin.\n *\n * This abstract class exposes all the required public APIs to configure the CompassPlugin.\n */\nabstract class CompassSettingsBase : CompassSettingsInterface {\n  /**\n   * Shows the compass on the map.\n   */\n  protected abstract var internalSettings: CompassSettings\n\n  /**\n   * Apply the changes to the CompassSettings to the CompassPlugin.\n   */\n  protected abstract fun applySettings()\n\n  /**\n   * Get current compass configuration.\n   *\n   * @return compass settings\n   */\n  override fun getSettings(): CompassSettings {\n    return internalSettings.toBuilder().build()\n  }\n\n  /**\n   * Update compass configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of CompassSettings\n   */\n  override fun updateSettings(block: CompassSettings.Builder.() -> Unit) {\n    val newSettings = this.internalSettings.toBuilder().apply(block).build()\n    // Trigger the enabled setter to ensure custom logic (e.g., listener management) is executed\n    this.enabled = newSettings.enabled\n    this.internalSettings = newSettings\n    applySettings()\n  }\n\n  /**\n   * Whether the compass is visible on the map. Default value: true.\n   */\n  override var enabled: Boolean\n    get() {\n      return this.internalSettings.enabled\n    }\n    set(value) {\n      if (this.internalSettings.enabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines where the compass is positioned on the map Default value: \"top-right\".\n   */\n  override var position: Int\n    get() {\n      return this.internalSettings.position\n    }\n    set(value) {\n      if (this.internalSettings.position != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPosition(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the left that the compass icon honors. Default value: 4.\n   */\n  override var marginLeft: Float\n    get() {\n      return this.internalSettings.marginLeft\n    }\n    set(value) {\n      if (this.internalSettings.marginLeft != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginLeft(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the top that the compass icon honors. Default value: 4.\n   */\n  override var marginTop: Float\n    get() {\n      return this.internalSettings.marginTop\n    }\n    set(value) {\n      if (this.internalSettings.marginTop != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginTop(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the right that the compass icon honors. Default value: 4.\n   */\n  override var marginRight: Float\n    get() {\n      return this.internalSettings.marginRight\n    }\n    set(value) {\n      if (this.internalSettings.marginRight != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginRight(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the bottom that the compass icon honors. Default value: 4.\n   */\n  override var marginBottom: Float\n    get() {\n      return this.internalSettings.marginBottom\n    }\n    set(value) {\n      if (this.internalSettings.marginBottom != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginBottom(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The alpha channel value of the compass image Default value: 1.\n   */\n  override var opacity: Float\n    get() {\n      return this.internalSettings.opacity\n    }\n    set(value) {\n      if (this.internalSettings.opacity != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setOpacity(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The clockwise rotation value in degrees of the compass. Default value: 0.\n   */\n  override var rotation: Float\n    get() {\n      return this.internalSettings.rotation\n    }\n    set(value) {\n      if (this.internalSettings.rotation != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setRotation(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the compass is displayed. Default value: true.\n   */\n  override var visibility: Boolean\n    get() {\n      return this.internalSettings.visibility\n    }\n    set(value) {\n      if (this.internalSettings.visibility != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setVisibility(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the compass fades out to invisible when facing north direction. Default value: true.\n   */\n  override var fadeWhenFacingNorth: Boolean\n    get() {\n      return this.internalSettings.fadeWhenFacingNorth\n    }\n    set(value) {\n      if (this.internalSettings.fadeWhenFacingNorth != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setFadeWhenFacingNorth(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the compass can be clicked and click events can be registered. Default value: true.\n   */\n  override var clickable: Boolean\n    get() {\n      return this.internalSettings.clickable\n    }\n    set(value) {\n      if (this.internalSettings.clickable != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setClickable(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The compass image, the visual representation of the compass.\n   */\n  override var image: ImageHolder?\n    get() {\n      return this.internalSettings.image\n    }\n    set(value) {\n      if (this.internalSettings.image != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setImage(value).build()\n        applySettings()\n      }\n    }\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/compass/generated/CompassSettingsData.kt",
    "content": "// This file is generated.\n// This class is annotated with `DataCompat`.\n// Therefore, it is used to auto-generate `CompassSettings`.\n\npackage com.mapbox.maps.plugin.compass.generated\n\nimport android.os.Parcelable\nimport com.mapbox.maps.ImageHolder\nimport com.tobrun.datacompat.annotation.DataCompat\nimport com.tobrun.datacompat.annotation.Default\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Shows the compass on the map.\n */\n@Parcelize\n@DataCompat(\n    importsForDefaults = [\n        \"android.view.Gravity\",\n    ]\n)\nprivate data class CompassSettingsData(\n\n  /**\n   * Whether the compass is visible on the map. Default value: true.\n   */\n  @Default(\"true\")\n  var enabled: Boolean,\n\n  /**\n   * Defines where the compass is positioned on the map Default value: \"top-right\".\n   */\n  @Default(\"Gravity.TOP or Gravity.END\")\n  var position: Int,\n\n  /**\n   * Defines the margin to the left that the compass icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginLeft: Float,\n\n  /**\n   * Defines the margin to the top that the compass icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginTop: Float,\n\n  /**\n   * Defines the margin to the right that the compass icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginRight: Float,\n\n  /**\n   * Defines the margin to the bottom that the compass icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginBottom: Float,\n\n  /**\n   * The alpha channel value of the compass image Default value: 1.\n   */\n  @Default(\"1f\")\n  var opacity: Float,\n\n  /**\n   * The clockwise rotation value in degrees of the compass. Default value: 0.\n   */\n  @Default(\"0f\")\n  var rotation: Float,\n\n  /**\n   * Whether the compass is displayed. Default value: true.\n   */\n  @Default(\"true\")\n  var visibility: Boolean,\n\n  /**\n   * Whether the compass fades out to invisible when facing north direction. Default value: true.\n   */\n  @Default(\"true\")\n  var fadeWhenFacingNorth: Boolean,\n\n  /**\n   * Whether the compass can be clicked and click events can be registered. Default value: true.\n   */\n  @Default(\"true\")\n  var clickable: Boolean,\n\n  /**\n   * The compass image, the visual representation of the compass.\n   */\n  var image: ImageHolder? = null,\n) : Parcelable\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/compass/generated/CompassSettingsInterface.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.compass.generated\n\nimport com.mapbox.maps.ImageHolder\n\n/**\n * Interface that defines the public settings interface for CompassPlugin.\n */\ninterface CompassSettingsInterface {\n  /**\n   * Get current compass configuration.\n   *\n   * @return compass settings\n   */\n  fun getSettings(): CompassSettings\n\n  /**\n   * Update compass configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of CompassSettings\n   */\n  fun updateSettings(block: CompassSettings.Builder.() -> Unit)\n\n  /**\n   * Whether the compass is visible on the map. Default value: true.\n   */\n  var enabled: Boolean\n\n  /**\n   * Defines where the compass is positioned on the map Default value: \"top-right\".\n   */\n  var position: Int\n\n  /**\n   * Defines the margin to the left that the compass icon honors. Default value: 4.\n   */\n  var marginLeft: Float\n\n  /**\n   * Defines the margin to the top that the compass icon honors. Default value: 4.\n   */\n  var marginTop: Float\n\n  /**\n   * Defines the margin to the right that the compass icon honors. Default value: 4.\n   */\n  var marginRight: Float\n\n  /**\n   * Defines the margin to the bottom that the compass icon honors. Default value: 4.\n   */\n  var marginBottom: Float\n\n  /**\n   * The alpha channel value of the compass image Default value: 1.\n   */\n  var opacity: Float\n\n  /**\n   * The clockwise rotation value in degrees of the compass. Default value: 0.\n   */\n  var rotation: Float\n\n  /**\n   * Whether the compass is displayed. Default value: true.\n   */\n  var visibility: Boolean\n\n  /**\n   * Whether the compass fades out to invisible when facing north direction. Default value: true.\n   */\n  var fadeWhenFacingNorth: Boolean\n\n  /**\n   * Whether the compass can be clicked and click events can be registered. Default value: true.\n   */\n  var clickable: Boolean\n\n  /**\n   * The compass image, the visual representation of the compass.\n   */\n  var image: ImageHolder?\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapAttributionDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport android.content.Context\nimport com.mapbox.maps.geofencing.MapGeofencingConsent\nimport com.mapbox.maps.module.MapTelemetry\nimport com.mapbox.maps.plugin.attribution.Attribution\nimport com.mapbox.maps.plugin.attribution.AttributionParserConfig\n\n/**\n * Map attribution delegates the request to get attribution data from the underlying map style.\n */\ninterface MapAttributionDelegate {\n\n  /**\n   * Called to request an instance of map telemetry.\n   *\n   * @return map telemetry instance\n   */\n  fun telemetry(): MapTelemetry\n\n  /**\n   * Parse attributions with the given config\n   *\n   * @param context the context\n   * @param config configuration for parings\n   *\n   * @return the parsed attributions\n   */\n  fun parseAttributions(context: Context, config: AttributionParserConfig): List<Attribution>\n\n  /**\n   * Build the feedback url\n   *\n   * @param context the context\n   */\n  fun buildMapBoxFeedbackUrl(context: Context): String\n\n  /**\n   * Request an instance of geofencing consent utilities\n   *\n   * @return utilities related to geofencing consent\n   */\n  fun geofencingConsent(): MapGeofencingConsent\n\n  /**\n   * List of extra attributions for the data shown in the map.\n   * Pass empty list to remove any extra attribution.\n   */\n  var extraAttributions: List<Attribution>\n    get() = emptyList()\n    set(_) = throw NotImplementedError()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapCameraManagerDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport android.app.Activity\nimport android.graphics.RectF\nimport com.mapbox.bindgen.Expected\nimport com.mapbox.bindgen.None\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.*\nimport com.mapbox.maps.util.isEmpty\n\n/**\n * Definition of a camera delegate. Any invocation will interact with the map's actual camera.\n */\ninterface MapCameraManagerDelegate {\n\n  /**\n   * Represents current camera state.\n   */\n  val cameraState: CameraState\n\n  /**\n   * Convert the given [bounds], [boundsPadding], [bearing] and [pitch] values to [CameraOptions].\n   * Note that this method takes into account the current map padding in addition to the\n   * [boundsPadding] provided in parameters.\n   *\n   * In order for this method to produce correct results [MapView] must be already\n   * measured and inflated to have correct width and height values.\n   * Calling this method in [Activity.onCreate] will lead to incorrect results.\n   *\n   * @param bounds The [CoordinateBounds] of the camera.\n   * @param boundsPadding The amount of padding in [EdgeInsets] to add to the given bounds.\n   * @param bearing The bearing of the camera.\n   * @param pitch The pitch of the camera.\n   * @param maxZoom The maximum zoom level allowed in the returned camera options.\n   * @param offset The center of the given bounds relative to map center in pixels.\n   *\n   * @return the converted [CameraOptions]. Padding is absent in the returned [CameraOptions]\n   * as the zoom level already accounts for the [boundsPadding] provided.\n   */\n  @Deprecated(\n    message = \"Deprecated\",\n    replaceWith = ReplaceWith(\"cameraForCoordinates(coordinates, camera, coordinatesPadding, maxZoom, offset, result)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun cameraForCoordinateBounds(\n    bounds: CoordinateBounds,\n    boundsPadding: EdgeInsets? = null,\n    bearing: Double? = null,\n    pitch: Double? = null,\n    maxZoom: Double? = null,\n    offset: ScreenCoordinate? = null,\n  ): CameraOptions\n\n  /**\n   * Convenience method that returns the [CameraOptions] object for given parameters.\n   * This method takes into account the current map padding in addition to the padding provided in parameters.\n   *\n   * @param coordinates The `coordinates` representing the bounds of the camera.\n   * @param coordinatesPadding The amount of padding in pixels to add to the given `coordinates`.\n   * @param bearing The bearing of the camera.\n   * @param pitch The pitch of the camera.\n   *\n   * @return The [CameraOptions] object representing the provided parameters. Padding is absent in the returned [CameraOptions] as the zoom level already accounts for the padding.\n   */\n  @Deprecated(\n    message = \"Deprecated\",\n    replaceWith = ReplaceWith(\"cameraForCoordinates(coordinates, camera, coordinatesPadding, maxZoom, offset, result)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun cameraForCoordinates(\n    coordinates: List<Point>,\n    coordinatesPadding: EdgeInsets? = null,\n    bearing: Double? = null,\n    pitch: Double? = null\n  ): CameraOptions\n\n  /**\n   * Convenience method that adjusts the provided [CameraOptions] object for given parameters.\n   *\n   * Returns the provided `camera` options with zoom adjusted to fit `coordinates` into the `box`, so that `coordinates` on the left,\n   * top, right, and bottom of the effective `camera` center at the principal point of the projection (defined by `padding`) fit into the `box`.\n   * Returns the provided `camera` options object unchanged upon an error.\n   *\n   * The method fails if the principal point is positioned outside of the `box`\n   * or if there is no sufficient screen space, defined by principal point and the `box`, to fit the geometry.\n   * Additionally, in cases when the principal point is positioned exactly on one of the edges of the `box`,\n   * any geometry point that spans further than that edge on the same axis cannot possibly be framed and is ignored for zoom level calculation purposes.\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param coordinates The `coordinates` representing the bounds of the camera.\n   * @param camera The [CameraOptions] for which zoom should be adjusted. Note that the `camera.center`, and `camera.zoom` (as fallback) is required.\n   * @param box The [ScreenBox] into which [coordinates] should fit.\n   *\n   * @return The [CameraOptions] object with the zoom level adjusted to fit [coordinates] into the [box].\n   */\n  @Deprecated(\n    message = \"Deprecated\",\n    replaceWith = ReplaceWith(\"cameraForCoordinates(coordinates, camera, coordinatesPadding, maxZoom, offset, result)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun cameraForCoordinates(\n    coordinates: List<Point>,\n    camera: CameraOptions,\n    box: ScreenBox\n  ): CameraOptions\n\n  /**\n   * Convenience method that returns the [CameraOptions] object for given parameters.\n   *\n   * Important: if the render thread did not yet calculate the size of the map (due to initialization or map resizing) - empty [CameraOptions] will be returned.\n   * Emptiness could be checked with [CameraOptions.isEmpty]. Consider using asynchronous overloaded method:\n   *    ```\n   *    fun cameraForCoordinates(\n   *     coordinates: List<Point>,\n   *     camera: CameraOptions,\n   *     coordinatesPadding: EdgeInsets?,\n   *     maxZoom: Double?,\n   *     offset: ScreenCoordinate?,\n   *     result: (CameraOptions) -> Unit\n   *    )\n   *    ```\n   * Consider using this synchronous method ONLY when you are absolutely sure that map is fully ready.\n   *\n   * @param coordinates The `coordinates` representing the bounds of the camera.\n   * @param camera The [CameraOptions] which will be applied before calculating the camera for the coordinates. If any of the fields in [CameraOptions] are not provided then the current value from the map for that field will be used.\n   * @param coordinatesPadding The amount of padding in pixels to add to the given `coordinates`.\n   *                           Note: This padding is not applied to the map but to the coordinates provided. If you want to apply padding to the map use param `camera`.\n   * @param maxZoom The maximum zoom level allowed in the returned camera options.\n   * @param offset The center of the given bounds relative to map center in pixels.\n   *\n   * @return The [CameraOptions] object representing the provided parameters if the map size was calculated and empty [CameraOptions] otherwise, see [CameraOptions.isEmpty].\n   *  Also empty [CameraOptions] are returned in case of an internal error.\n   */\n  @MapboxDelicateApi\n  fun cameraForCoordinates(\n    coordinates: List<Point>,\n    camera: CameraOptions,\n    coordinatesPadding: EdgeInsets?,\n    maxZoom: Double?,\n    offset: ScreenCoordinate?\n  ): CameraOptions\n\n  /**\n   * Convenience method that returns the [CameraOptions] object for given parameters.\n   *\n   * @param coordinates The `coordinates` representing the bounds of the camera.\n   * @param camera The [CameraOptions] which will be applied before calculating the camera for the coordinates. If any of the fields in [CameraOptions] are not provided then the current value from the map for that field will be used.\n   * @param coordinatesPadding The amount of padding in pixels to add to the given `coordinates`.\n   *                           Note: This padding is not applied to the map but to the coordinates provided. If you want to apply padding to the map use param `camera`.\n   * @param maxZoom The maximum zoom level allowed in the returned camera options.\n   * @param offset The center of the given bounds relative to map center in pixels.\n   * @param result Callback returning the [CameraOptions] object representing the provided parameters. Those [CameraOptions] always take into account actual MapView size and may return empty ([CameraOptions.isEmpty]) options only if an internal error has occurred.\n   */\n  fun cameraForCoordinates(\n    coordinates: List<Point>,\n    camera: CameraOptions,\n    coordinatesPadding: EdgeInsets?,\n    maxZoom: Double?,\n    offset: ScreenCoordinate?,\n    result: (CameraOptions) -> Unit\n  )\n\n  /**\n   * Convert the given [geometry], [geometryPadding], [bearing] and [pitch] values to [CameraOptions].\n   * Note that this method takes into account the current map padding in addition to the\n   * [geometryPadding] provided in parameters.\n   *\n   * In order for this method to produce correct results `MapView` must be already\n   * measured and inflated to have correct width and height values.\n   * Calling this method in [Activity.onCreate] will lead to incorrect results.\n   *\n   * @param geometry The [Geometry] to take in account when converting\n   * @param geometryPadding The optional amount of padding in pixels to add to the given [geometry].\n   * @param bearing The optional bearing to take in account when converting\n   * @param pitch The optional pitch to take in account when converting\n   *\n   * @return Returns the converted [CameraOptions]. Padding is absent in the returned\n   * [CameraOptions] as the zoom level already accounts for the [geometryPadding] provided.\n   */\n  @Deprecated(\n    message = \"Deprecated\",\n    replaceWith = ReplaceWith(\"cameraForCoordinates(coordinates, camera, coordinatesPadding, maxZoom, offset, result)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun cameraForGeometry(\n    geometry: Geometry,\n    geometryPadding: EdgeInsets? = null,\n    bearing: Double? = null,\n    pitch: Double? = null\n  ): CameraOptions\n\n  /**\n   * Returns the [CoordinateBounds] for a given camera.\n   *\n   * Note that if the given `camera` shows the antimeridian, the returned wrapped [CoordinateBounds]\n   * might not represent the minimum bounding box.\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param camera The [CameraOptions] to use for calculating [CoordinateBounds].\n   *\n   * @return The [CoordinateBounds] object representing a given `camera`.\n   *\n   */\n  fun coordinateBoundsForCamera(camera: CameraOptions): CoordinateBounds\n\n  /**\n   * Returns the [CoordinateBounds] for a given camera.\n   *\n   * This method is useful if the `camera` shows the antimeridian.\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param camera The [CameraOptions] to use for calculating [CoordinateBounds].\n   *\n   * @return The [CoordinateBounds] object representing a given `camera`.\n   */\n  fun coordinateBoundsForCameraUnwrapped(camera: CameraOptions): CoordinateBounds\n\n  /**\n   * Returns the coordinate bounds and zoom for a given camera.\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param camera The camera information to use\n   *\n   * @return Returns the CoordinateBoundsZoom object representing the provided params\n   *\n   * Note that if the given camera shows the antimeridian, the returned wrapped bounds\n   * might not represent the minimum bounding box.\n   * @sa coordinateBoundsZoomForCameraUnwrapped()\n   */\n  fun coordinateBoundsZoomForCamera(camera: CameraOptions): CoordinateBoundsZoom\n\n  /**\n   * Returns the unwrapped coordinate bounds and zoom for a given camera.\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param camera The camera information to use\n   *\n   * @return Returns the CoordinateBoundsZoom object representing the provided params\n   *\n   * This method is particularly useful, if the camera shows the antimeridian.\n   */\n  fun coordinateBoundsZoomForCameraUnwrapped(camera: CameraOptions): CoordinateBoundsZoom\n\n  /**\n   * Calculates a screen coordinate that corresponds to a geographical coordinate\n   * (i.e., longitude-latitude pair).\n   *\n   * The screen coordinate is in \\link MapOptions#size platform pixels \\endlink relative to the top left\n   * of the map (not of the whole screen).\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param coordinate A geographical coordinate on the map to convert to a screen coordinate.\n   *\n   * @return Returns a screen coordinate on the screen in \\link MapOptions#size platform pixels \\endlink.\n   */\n  fun pixelForCoordinate(coordinate: Point): ScreenCoordinate\n\n  /**\n   * Calculates a geographical coordinate(i.e., longitude-latitude pair) that corresponds\n   * to a screen coordinate.\n   *\n   * The screen coordinate is in \\link MapOptions#size platform pixels \\endlink relative to the top left\n   * of the map (not of the whole screen).\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param pixel A screen coordinate on the screen in \\link MapOptions#size platform pixels \\endlink.\n   *\n   * @return Returns a geographical coordinate corresponding to the ScreenCoordinate\n   * on the screen.\n   */\n  fun coordinateForPixel(pixel: ScreenCoordinate): Point\n\n  /**\n   * Calculates screen coordinates that corresponds to geographical coordinates\n   * (i.e., longitude-latitude pair).\n   *\n   * The screen coordinates are in \\link MapOptions#size platform pixels \\endlink relative to the top left\n   * of the map (not of the whole screen).\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param coordinates A batch of geographical coordinates on the map to convert to screen coordinates.\n   *\n   * @return Returns a batch of screen coordinates on the screen in \\link MapOptions#size platform pixels \\endlink.\n   */\n  fun pixelsForCoordinates(coordinates: List<Point>): List<ScreenCoordinate>\n\n  /**\n   * Calculates geographical coordinates(i.e., longitude-latitude pair) that corresponds\n   * to screen coordinates.\n   *\n   * The screen coordinates are in \\link MapOptions#size platform pixels \\endlink relative to the top left\n   * of the map (not of the whole screen).\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param pixels A batch of screen coordinates on the screen in \\link MapOptions#size platform pixels \\endlink.\n   *\n   * @return Returns a batch of geographical coordinates corresponding to the screen coordinates\n   * on the screen.\n   */\n  fun coordinatesForPixels(pixels: List<ScreenCoordinate>): List<Point>\n\n  /**\n   * Returns the [CoordinateBounds] for given [RectF] defined in screen points.\n   *\n   * The screen points are in `platform pixels` relative to the top left corner\n   * of the map (not of the whole screen).\n   *\n   * This API isn't supported by Globe projection.\n   *\n   * @param rectF rectangle area defined in screen points.\n   * @return [CoordinateBounds] representing given [RectF].\n   * @throws [IllegalArgumentException] if [RectF] is empty\n   */\n  fun coordinateBoundsForRect(rectF: RectF): CoordinateBounds\n\n  /**\n   * Calculates the geographical coordinate information that corresponds to a given screen coordinate.\n   *\n   * The screen coordinate is in platform pixels, relative to the top left corner of the map (not the whole screen).\n   *\n   * The returned coordinate will be the closest position projected onto the map surface,\n   * in case the screen coordinate does not intersect with the map surface.\n   *\n   * @param pixel The screen coordinate on the map, in platform pixels.\n   *\n   * @return A CoordinateInfo record containing information about the geographical coordinate corresponding to the given screen coordinate, including whether it is on the map surface.\n   *\n   */\n  fun coordinateInfoForPixel(pixel: ScreenCoordinate): CoordinateInfo\n\n  /**\n   * Calculates the geographical coordinates information that corresponds to the given screen coordinates.\n   *\n   * The screen coordinates are in platform pixels, relative to the top left corner of the map (not the whole screen).\n   *\n   * The returned coordinate will be the closest position projected onto the map surface,\n   * in case the screen coordinate does not intersect with the map surface.\n   *\n   * @param pixels The list of screen coordinates on the map, in platform pixels.\n   *\n   * @return The CoordinateInfo records containing information about the geographical coordinates corresponding to the given screen coordinates, including whether they are on the map surface.\n   *\n   */\n  fun coordinatesInfoForPixels(pixels: List<ScreenCoordinate>): List<CoordinateInfo>\n\n  /**\n   * Changes the map view by any combination of center, zoom, bearing, and pitch, without an animated transition.\n   * The map will retain its current values for any details not passed via the camera options argument.\n   * It is not guaranteed that the provided CameraOptions will be set, the map may apply constraints resulting in a\n   * different CameraState.\n   *\n   * @param cameraOptions New camera options\n   */\n  fun setCamera(cameraOptions: CameraOptions)\n\n  /**\n   * Sets the map view with the free camera options.\n   *\n   * FreeCameraOptions provides more direct access to the underlying camera entity.\n   * For backwards compatibility the state set using this API must be representable with\n   * `CameraOptions` as well. Parameters are clamped to a valid range or discarded as invalid\n   * if the conversion to the pitch and bearing presentation is ambiguous. For example orientation\n   * can be invalid if it leads to the camera being upside down or the quaternion has zero length.\n   *\n   * @param freeCameraOptions The free camera options to set.\n   */\n  fun setCamera(freeCameraOptions: FreeCameraOptions)\n\n  /**\n   * Gets the map's current free camera options. After mutation, it should be set back to the map.\n   * @return The current free camera options.\n   */\n  fun getFreeCameraOptions(): FreeCameraOptions\n\n  /**\n   * Sets the bounds of the map.\n   *\n   * @param options\n   */\n  fun setBounds(options: CameraBoundsOptions): Expected<String, None>\n\n  /**\n   * Returns the bounds of the map.\n   */\n  fun getBounds(): CameraBounds\n\n  /**\n   * Sets the map [MapCenterAltitudeMode] that defines behavior of the center point\n   * altitude for all subsequent camera manipulations.\n   *\n   * Note: any gesture changing the map camera will set [MapCenterAltitudeMode.TERRAIN]\n   * when finished.\n   */\n  fun setCenterAltitudeMode(mode: MapCenterAltitudeMode)\n\n  /**\n   * Returns the map's [MapCenterAltitudeMode].\n   *\n   * @return The map's [MapCenterAltitudeMode].\n   */\n  fun getCenterAltitudeMode(): MapCenterAltitudeMode\n\n  /**\n   * Calculates a target point where the camera should move after dragging from\n   * a screen coordinate `startCoordinate` to another coordinate `endCoordinate`.\n   *\n   * @param fromPoint The `screen coordinate` to drag the map from, measured in `platform pixels` from top to bottom and from left to right.\n   * @param toPoint The `screen coordinate` to drag the map to, measured in `platform pixels` from top to bottom and from left to right.\n   *\n   * @return The [CameraOptions] object with the center variable set to the computed target location.\n   */\n  fun cameraForDrag(fromPoint: ScreenCoordinate, toPoint: ScreenCoordinate): CameraOptions\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapDelegateProvider.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.IndoorManager\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.MapboxStyleManager\n\n/**\n * Definition of map delegate transporter. Provides hooks to all map delegate instances.\n */\n@RestrictTo(RestrictTo.Scope.LIBRARY)\ninterface MapDelegateProvider {\n\n  /**\n   * Delegate used to interact with map's camera.\n   */\n  val mapCameraManagerDelegate: MapCameraManagerDelegate\n\n  /**\n   * Delegate used to interact with map's projection methods.\n   */\n  val mapProjectionDelegate: MapProjectionDelegate\n\n  /**\n   * Delegate used to interact with map's transform methods.\n   */\n  val mapTransformDelegate: MapTransformDelegate\n\n  /**\n   * Delegate used to interact with map's attribution.\n   */\n  val mapAttributionDelegate: MapAttributionDelegate\n\n  /**\n   * Delegate used to interact with map's style.\n   */\n  fun getStyle(callback: (MapboxStyleManager) -> Unit)\n\n  /**\n   * Delegate used to interact with map's style manager without waiting for style loading events.\n   */\n  val mapStyleManagerDelegate: MapboxStyleManager\n\n  /**\n   * Delegate used to interact with map's plugins.\n   */\n  val mapPluginProviderDelegate: MapPluginProviderDelegate\n\n  /**\n   * Delegate used to feature queries.\n   */\n  val mapFeatureQueryDelegate: MapFeatureQueryDelegate\n\n  /**\n   * Delegate used to manager listeners.\n   */\n  val mapListenerDelegate: MapListenerDelegate\n\n  /**\n   * Delegate used to use feature state APIs.\n   */\n  val mapFeatureStateDelegate: MapFeatureStateDelegate\n\n  /**\n   * Delegate used to manage interactions (click gestures for example).\n   */\n  @MapboxExperimental\n  val mapInteractionDelegate: MapInteractionDelegate\n\n  /**\n   * IndoorManager for controlling indoor map floor display.\n   */\n  @MapboxExperimental\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  val indoorManager: IndoorManager\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapFeatureQueryDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.*\n\n/**\n * Definition of the feature query delegate. Provide interface to query map's features.\n */\ninterface MapFeatureQueryDelegate {\n\n  /**\n   * Queries the map for rendered features.\n   *\n   * @param geometry The `screen pixel coordinates` (point, line string or box) to query for rendered features.\n   * @param options The `render query options` for querying rendered features.\n   * @param callback The `query features callback` called when the query completes.\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  fun queryRenderedFeatures(\n    geometry: RenderedQueryGeometry,\n    options: RenderedQueryOptions,\n    callback: QueryRenderedFeaturesCallback\n  ): Cancelable\n\n  /**\n   * Queries the map for source features.\n   *\n   * @param sourceId Style source identifier used to query for source features.\n   * @param options Options for querying source features.\n   * @param callback Callback called when the query completes\n   */\n  fun querySourceFeatures(\n    sourceId: String,\n    options: SourceQueryOptions,\n    callback: QuerySourceFeaturesCallback\n  ): Cancelable\n\n  /**\n   * Queries the map for rendered raster values at a specific coordinate.\n   *\n   * @param coordinate The position on the screen to query.\n   * @param options The options for configuring the rendered raster value query.\n   * @param callback Callback called when the query completes.\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  @MapboxExperimental\n  fun queryRenderedRasterValues(\n    coordinate: ScreenCoordinate,\n    options: RenderedRasterQueryOptions,\n    callback: QueryRenderedRasterValuesCallback\n  ): Cancelable\n\n  /**\n   * In some cases querying source / render features is expected to be a blocking operation\n   * e.g. performing this action on map click. In this case in order to avoid deadlock on main\n   * thread querying could be performed on render thread and in that case querying result will be also\n   * delivered on render thread not leading to the main thread deadlock. Example:\n   *\n   * fun onMapClick() {\n   *  executeOnRenderThread {\n   *    queryRenderedFeatures(pixel, options) {\n   *      // result callback called, do needed actions\n   *      lock.notify()\n   *    }\n   *  }\n   *  lock.wait()\n   *  return false\n   * }\n   */\n  fun executeOnRenderThread(\n    runnable: Runnable\n  )\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapFeatureStateDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport com.mapbox.bindgen.Value\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.FeatureStateOperationCallback\nimport com.mapbox.maps.MapboxDelicateApi\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.QueryFeatureStateCallback\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\n\n/**\n * Definition of the feature state delegate needed to update the feature state of the map.\n */\ninterface MapFeatureStateDelegate {\n  /**\n   * Updates the state object of a feature within a style source.\n   *\n   * Update entries in the `state` object of a given feature within a style source. Only properties of the\n   * `state` object will be updated. A property in the feature `state` object that is not listed in `state` will\n   * retain its previous value. The properties must be paint properties, layout properties are not supported.\n   *\n   * Note that updates to feature `state` are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`. And the corresponding source needs to be in use to ensure the\n   * feature data it contains can be successfully updated.\n   *\n   * @param sourceId The style source identifier.\n   * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n   * @param featureId The feature identifier of the feature whose state should be updated.\n   * @param state The `state` object with properties to update with their respective new values.\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   *\n   */\n  fun setFeatureState(\n    sourceId: String,\n    sourceLayerId: String? = null,\n    featureId: String,\n    state: Value,\n    callback: FeatureStateOperationCallback,\n  ): Cancelable\n\n  /**\n   * Get the state map of a feature within a style source.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by other methods might not be\n   * immediately visible.\n   *\n   * @param sourceId The style source identifier.\n   * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n   * @param featureId The feature identifier of the feature whose state should be queried.\n   * @param callback The `query feature state callback` called when the query completes.\n   * @return A `cancelable` object that could be used to cancel the pending query.\n   */\n  fun getFeatureState(\n    sourceId: String,\n    sourceLayerId: String? = null,\n    featureId: String,\n    callback: QueryFeatureStateCallback,\n  ): Cancelable\n\n  /**\n   * Removes entries from a feature state object.\n   *\n   * Remove a specified property or all property from a feature's state object, depending on the value of\n   * `stateKey`.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`.\n   *\n   * @param sourceId The style source identifier.\n   * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n   * @param featureId The feature identifier of the feature whose state should be removed.\n   * @param stateKey The key of the property to remove. If `null`, all feature's state object properties are removed.\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   */\n  fun removeFeatureState(\n    sourceId: String,\n    sourceLayerId: String? = null,\n    featureId: String,\n    stateKey: String? = null,\n    callback: FeatureStateOperationCallback,\n  ): Cancelable\n\n  /**\n   * Reset all the feature states within a style source.\n   *\n   * Remove all feature state entries from the specified style source or source layer.\n   *\n   * Note that updates to feature state are asynchronous, so changes made by this method might not be\n   * immediately visible using `getStateFeature`.\n   *\n   * @param sourceId The style source identifier.\n   * @param sourceLayerId The style source layer identifier (for multi-layer sources such as vector sources).\n   * @param callback The `feature state operation callback` called when the operation completes or ends.\n   * @return A `cancelable` object that could be used to cancel the pending operation.\n   */\n  fun resetFeatureStates(\n    sourceId: String,\n    sourceLayerId: String? = null,\n    callback: FeatureStateOperationCallback\n  ): Cancelable\n\n  /**\n   * Sets a feature state expression that applies to features within the specified featureset.\n   *\n   * All feature states with expressions that evaluate to true will be applied to the feature.\n   * Feature states from later added feature state expressions have higher priority. Regular feature states have higher priority than feature state expressions.\n   * The final feature state is determined by applying states in order from lower to higher priority. As a result, multiple expressions that set states with different keys can affect the same features simultaneously.\n   * If an expression is added for a feature set, properties from that feature set are used, not the properties from original sources.\n   *\n   * Note that updates to feature state expressions are asynchronous, so changes made by this method might not be\n   * immediately visible and will have some delay. The displayed data will not be affected immediately.\n   *\n   * @param featureStateExpressionId Unique identifier for the state expression.\n   * @param featureset The featureset descriptor that specifies which featureset the expression applies to.\n   * @param expression The expression to evaluate for the state. Should return boolean.\n   * @param state The `state` object with properties to update with their respective new values.\n   * @param callback The `feature state operation callback` called when the operation completes.\n   *\n   */\n  @MapboxExperimental\n  @MapboxDelicateApi\n  fun <FS : FeatureState> setFeatureStateExpression(\n    featureStateExpressionId: Int,\n    featureset: TypedFeaturesetDescriptor<FS, *>,\n    expression: Value,\n    state: FS,\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { }\n  )\n\n  /**\n   * Removes a specific feature state expression.\n   *\n   * Remove a specific expression from the feature state expressions based on the expression ID.\n   *\n   * Note that updates to feature state expressions are asynchronous, so changes made by this method might not be\n   * immediately visible and will have some delay.\n   *\n   * @param featureStateExpressionId The unique identifier of the expression to remove.\n   * @param callback The `feature state operation callback` called when the operation completes.\n   */\n  @MapboxExperimental\n  fun removeFeatureStateExpression(\n    featureStateExpressionId: Int,\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { }\n  )\n\n  /**\n   * Reset all feature state expressions.\n   *\n   * Note that updates to feature state expressions are asynchronous, so changes made by this method might not be\n   * immediately visible and will have some delay.\n   *\n   * @param callback The `feature state operation callback` called when the operation completes.\n   */\n  @MapboxExperimental\n  fun resetFeatureStateExpressions(\n    callback: FeatureStateOperationCallback = FeatureStateOperationCallback { }\n  )\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapInteractionDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.MapInteraction\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.PlatformEventInfo\n\n/**\n * Definition of the interaction delegate needed to allow adding interactions.\n */\n@MapboxExperimental\ninterface MapInteractionDelegate {\n\n  /**\n   * Add the map interaction (e.g. clicking / long clicking map features or map surface).\n   *\n   * @param interaction any concrete implementation of base [MapInteraction].\n   *\n   * @return [Cancelable] object. Call [Cancelable.cancel] when the interaction is not needed anymore.\n   *  Note: destroying the map will cancel all registered interactions.\n   */\n  fun addInteraction(interaction: MapInteraction): Cancelable\n\n  /**\n   * For internal usage.\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  fun dispatch(platformEventInfo: PlatformEventInfo)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapListenerDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.CameraChangedCallback\nimport com.mapbox.maps.CameraChangedCoalesced\nimport com.mapbox.maps.CameraChangedCoalescedCallback\nimport com.mapbox.maps.GenericEventCallback\nimport com.mapbox.maps.MapIdleCallback\nimport com.mapbox.maps.MapLoadedCallback\nimport com.mapbox.maps.MapLoadingErrorCallback\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.RenderFrameFinishedCallback\nimport com.mapbox.maps.RenderFrameStartedCallback\nimport com.mapbox.maps.ResourceRequestCallback\nimport com.mapbox.maps.SourceAddedCallback\nimport com.mapbox.maps.SourceDataLoadedCallback\nimport com.mapbox.maps.SourceRemovedCallback\nimport com.mapbox.maps.StyleDataLoadedCallback\nimport com.mapbox.maps.StyleImageMissingCallback\nimport com.mapbox.maps.StyleImageRemoveUnusedCallback\nimport com.mapbox.maps.StyleLoadedCallback\nimport com.mapbox.maps.plugin.delegates.listeners.OnCameraChangeListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnMapIdleListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnMapLoadedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameFinishedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnRenderFrameStartedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnSourceAddedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnSourceDataLoadedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnSourceRemovedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnStyleDataLoadedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnStyleImageMissingListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnStyleImageUnusedListener\nimport com.mapbox.maps.plugin.delegates.listeners.OnStyleLoadedListener\n\n/**\n * Definition of a listener manager delegate to manage all kinds of listeners.\n */\ninterface MapListenerDelegate {\n  // Camera Events\n  /**\n   * Add a listener that's going to be invoked whenever map camera changes.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeCameraChange] instead.\",\n    replaceWith = ReplaceWith(\"subscribeCameraChanged(cameraChangedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnCameraChangeListener(onCameraChangeListener: OnCameraChangeListener)\n\n  /**\n   * Remove the camera change listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeCameraChange] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnCameraChangeListener(onCameraChangeListener: OnCameraChangeListener)\n\n  // Map events\n  /**\n   * Add a listener that's going to be invoked whenever map has entered the idle state.\n   *\n   * The Map is in the idle state when there are no ongoing transitions and the Map has rendered all\n   * available tiles.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeMapIdle] instead.\",\n    replaceWith = ReplaceWith(\"subscribeMapIdle(mapIdleCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnMapIdleListener(onMapIdleListener: OnMapIdleListener)\n\n  /**\n   * Remove the map idle listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeMapIdle] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnMapIdleListener(onMapIdleListener: OnMapIdleListener)\n\n  /**\n   * Add a listener that's going to be invoked whenever there's a map load error.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeMapLoadingError] instead.\",\n    replaceWith = ReplaceWith(\"subscribeMapLoadingError(mapLoadingErrorCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnMapLoadErrorListener(onMapLoadErrorListener: OnMapLoadErrorListener)\n\n  /**\n   * Remove the map error listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeMapLoadingError] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnMapLoadErrorListener(onMapLoadErrorListener: OnMapLoadErrorListener)\n\n  /**\n   * Add a listener that's going to be invoked whenever the Map's style has been fully loaded, and\n   * the Map has rendered all visible tiles.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeMapLoaded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeMapLoaded(mapLoadedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnMapLoadedListener(onMapLoadedListener: OnMapLoadedListener)\n\n  /**\n   * Remove the map loaded listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeMapLoaded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnMapLoadedListener(onMapLoadedListener: OnMapLoadedListener)\n\n  // Render frame events\n  /**\n   * Add a listener that's going to be invoked whenever the Map started rendering a frame.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeRenderFrameStarted] instead.\",\n    replaceWith = ReplaceWith(\"subscribeRenderFrameStarted(renderFrameStartedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnRenderFrameStartedListener(onRenderFrameStartedListener: OnRenderFrameStartedListener)\n\n  /**\n   * Remove the render frame started listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeRenderFrameStarted] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnRenderFrameStartedListener(onRenderFrameStartedListener: OnRenderFrameStartedListener)\n\n  /**\n   * Add a listener that's going to be invoked whenever the Map finished rendering a frame.\n   *\n   * The render-mode value tells whether the Map has all data (\"full\") required to render the visible viewport.\n   * The needs-repaint value provides information about ongoing transitions that trigger Map repaint.\n   * The placement-changed value tells if the symbol placement has been changed in the visible viewport.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeRenderFrameFinished] instead.\",\n    replaceWith = ReplaceWith(\"subscribeRenderFrameFinished(renderFrameFinishedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnRenderFrameFinishedListener(onRenderFrameFinishedListener: OnRenderFrameFinishedListener)\n\n  /**\n   * Remove the render frame finished listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeRenderFrameFinished] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnRenderFrameFinishedListener(onRenderFrameFinishedListener: OnRenderFrameFinishedListener)\n\n  // Source events\n  /**\n   * Add a listener that's going to be invoked whenever a source has been added with StyleManager#addStyleSource\n   * runtime API.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeSourceAdded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeSourceAdded(sourceAddedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnSourceAddedListener(onSourceAddedListener: OnSourceAddedListener)\n\n  /**\n   * Remove the source added listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeSourceAdded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnSourceAddedListener(onSourceAddedListener: OnSourceAddedListener)\n\n  /**\n   * Add a listener that's going to be invoked whenever the source data has been loaded.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeSourceDataLoaded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeSourceDataLoaded(sourceDataLoadedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnSourceDataLoadedListener(onSourceDataLoadedListener: OnSourceDataLoadedListener)\n\n  /**\n   * Remove the source data loaded listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeSourceDataLoaded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnSourceDataLoadedListener(onSourceDataLoadedListener: OnSourceDataLoadedListener)\n\n  /**\n   * Add a listener that's going to be invoked whenever a source has been removed with StyleManager#removeStyleSource\n   * runtime API.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeSourceRemoved] instead.\",\n    replaceWith = ReplaceWith(\"subscribeSourceRemoved(sourceRemovedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnSourceRemovedListener(onSourceRemovedListener: OnSourceRemovedListener)\n\n  /**\n   * Remove the source removed listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeSourceRemoved] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnSourceRemovedListener(onSourceRemovedListener: OnSourceRemovedListener)\n\n  // Style events\n  /**\n   * Add a listener that's going to be invoked whenever the requested style data been loaded.\n   * The 'type' property defines what kind of style data has been loaded.\n   *\n   * This event may be useful when application needs to modify style layers or sources and add or remove sources\n   * before style is fully loaded.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeStyleLoaded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeStyleLoaded(styleDataLoadedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnStyleDataLoadedListener(onStyleDataLoadedListener: OnStyleDataLoadedListener)\n\n  /**\n   * Remove the style data loaded listener\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeStyleLoaded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnStyleDataLoadedListener(onStyleDataLoadedListener: OnStyleDataLoadedListener)\n\n  /**\n   * Add a listener that's going to be invoked whenever the requested style has been fully loaded,\n   * including the style specified sprite and sources.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeStyleDataLoaded] instead.\",\n    replaceWith = ReplaceWith(\"subscribeStyleDataLoaded(styleLoadedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnStyleLoadedListener(onStyleLoadedListener: OnStyleLoadedListener)\n\n  /**\n   * Remove the style loaded listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeStyleDataLoaded] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnStyleLoadedListener(onStyleLoadedListener: OnStyleLoadedListener)\n\n  /**\n   * Add a listener that's going to be invoked whenever a style has a missing image.\n   *\n   * This event is emitted when the Map renders visible tiles and one of the required images is\n   * missing in the sprite sheet.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeStyleImageMissing] instead.\",\n    replaceWith = ReplaceWith(\"subscribeStyleImageMissing(styleImageMissingCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnStyleImageMissingListener(onStyleImageMissingListener: OnStyleImageMissingListener)\n\n  /**\n   * Remove the style image missing listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeStyleImageMissing] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnStyleImageMissingListener(onStyleImageMissingListener: OnStyleImageMissingListener)\n\n  /**\n   * Add a listener that's going to be invoked whenever an image added to the Style is no longer\n   * needed and can be removed using StyleManager#removeStyleImage method.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use [subscribeStyleImageRemoveUnused] instead.\",\n    replaceWith = ReplaceWith(\"subscribeStyleImageRemoveUnused(styleImageRemoveUnusedCallback)\"),\n    level = DeprecationLevel.WARNING\n  )\n  fun addOnStyleImageUnusedListener(onStyleImageUnusedListener: OnStyleImageUnusedListener)\n\n  /**\n   * Remove the style image unused listener.\n   */\n  @Deprecated(\n    message = \"This method is deprecated, and will be removed in next major release. use cancelable returned from [subscribeStyleImageRemoveUnused] to remove the listener.\",\n    level = DeprecationLevel.WARNING\n  )\n  fun removeOnStyleImageUnusedListener(onStyleImageUnusedListener: OnStyleImageUnusedListener)\n\n  /**\n   * Subscribes to `CameraChanged` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param cameraChangedCallback\n   */\n  fun subscribeCameraChanged(cameraChangedCallback: CameraChangedCallback): Cancelable\n\n  /**\n   * Subscribes to [CameraChangedCoalesced] event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param cameraChangedCoalescedCallback the callback to be invoked when the camera changes.\n   */\n  @com.mapbox.annotation.MapboxExperimental\n  fun subscribeCameraChangedCoalesced(cameraChangedCoalescedCallback: CameraChangedCoalescedCallback): Cancelable\n\n  /**\n   * Subscribes to `MapLoaded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param mapLoadedCallback\n   */\n  fun subscribeMapLoaded(mapLoadedCallback: MapLoadedCallback): Cancelable\n\n  /**\n   * Subscribes to `MapIdle` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param mapIdleCallback\n   */\n  fun subscribeMapIdle(mapIdleCallback: MapIdleCallback): Cancelable\n\n  /**\n   * Subscribes to `MapLoadingError` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param mapLoadingErrorCallback\n   */\n  fun subscribeMapLoadingError(mapLoadingErrorCallback: MapLoadingErrorCallback): Cancelable\n\n  /**\n   * Subscribes to `StyleLoaded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param styleLoadedCallback\n   */\n  fun subscribeStyleLoaded(styleLoadedCallback: StyleLoadedCallback): Cancelable\n\n  /**\n   * Subscribes to `StyleDataLoaded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param styleDataLoadedCallback\n   */\n  fun subscribeStyleDataLoaded(styleDataLoadedCallback: StyleDataLoadedCallback): Cancelable\n\n  /**\n   * Subscribes to `SourceDataLoaded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param sourceDataLoadedCallback\n   */\n  fun subscribeSourceDataLoaded(sourceDataLoadedCallback: SourceDataLoadedCallback): Cancelable\n\n  /**\n   * Subscribes to `SourceAdded` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param sourceAddedCallback\n   */\n  fun subscribeSourceAdded(sourceAddedCallback: SourceAddedCallback): Cancelable\n\n  /**\n   * Subscribes to `SourceRemoved` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param sourceRemovedCallback\n   */\n  fun subscribeSourceRemoved(sourceRemovedCallback: SourceRemovedCallback): Cancelable\n\n  /**\n   * Subscribes to `StyleImageMissing` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param styleImageMissingCallback\n   */\n  fun subscribeStyleImageMissing(styleImageMissingCallback: StyleImageMissingCallback): Cancelable\n\n  /**\n   * Subscribes to `StyleImageRemoveUnused` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param styleImageRemoveUnusedCallback\n   */\n  fun subscribeStyleImageRemoveUnused(styleImageRemoveUnusedCallback: StyleImageRemoveUnusedCallback): Cancelable\n\n  /**\n   * Subscribes to `RenderFrameStarted` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param renderFrameStartedCallback\n   */\n  fun subscribeRenderFrameStarted(renderFrameStartedCallback: RenderFrameStartedCallback): Cancelable\n\n  /**\n   * Subscribes to `RenderFrameFinished` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param renderFrameFinishedCallback\n   */\n  fun subscribeRenderFrameFinished(renderFrameFinishedCallback: RenderFrameFinishedCallback): Cancelable\n\n  /**\n   * Subscribes to `ResourceRequest` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param resourceRequestCallback\n   */\n  fun subscribeResourceRequest(resourceRequestCallback: ResourceRequestCallback): Cancelable\n\n  /**\n   * Subscribes to an experimental `GenericEvent` event.\n   *\n   * @return cancellable object to unsubscribe from the event.\n   *\n   * @param eventName\n   * @param genericEventCallback\n   */\n  @MapboxExperimental\n  fun subscribeGenericEvent(eventName: String, genericEventCallback: GenericEventCallback): Cancelable\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapPluginExtensionsDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.gestures.GesturesPlugin\n\n/**\n * Definition of the map plugin extensions delegate.\n * Makes possible to call plugin functions directly from MapboxMap.\n */\ninterface MapPluginExtensionsDelegate {\n\n  /**\n   * Call extension function on [CameraAnimationsPlugin].\n   * In most cases should not be called directly.\n   */\n  fun cameraAnimationsPlugin(function: (CameraAnimationsPlugin.() -> Any?)): Any?\n\n  /**\n   * Call extension function on [GesturesPlugin].\n   * In most cases should not be called directly.\n   */\n  fun gesturesPlugin(function: (GesturesPlugin.() -> Any?)): Any?\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapPluginProviderDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport com.mapbox.maps.plugin.MapPlugin\n\n/**\n * Definition of a map plugin provider delegate.\n */\ninterface MapPluginProviderDelegate {\n  /**\n   * Get the plugin instance.\n   *\n   * @param id plugin id\n   * @return created plugin instance or null if no plugin is found for given id.\n   */\n  fun <T : MapPlugin> getPlugin(id: String): T?\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapProjectionDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.MercatorCoordinate\nimport com.mapbox.maps.ProjectedMeters\n\n/**\n * Definition of a map projection delegate.\n */\ninterface MapProjectionDelegate {\n  /**\n   * Calculate distance spanned by one pixel at the specified latitude\n   * and zoom level.\n   *\n   * @param latitude The latitude for which to return the value\n   * @param zoom The zoom level\n   *\n   * @return Returns the distance measured in meters.\n   */\n  fun getMetersPerPixelAtLatitude(latitude: Double, zoom: Double): Double\n\n  /**\n   * Calculate distance spanned by one pixel at the specified latitude\n   * at current zoom level.\n   *\n   * @param latitude The latitude for which to return the value\n   *\n   * @return Returns the distance measured in meters.\n   */\n  fun getMetersPerPixelAtLatitude(latitude: Double): Double\n\n  /**\n   * Calculate Spherical Mercator ProjectedMeters coordinates.\n   *\n   * @param point A longitude-latitude pair for which to calculate\n   * ProjectedMeters coordinates\n   *\n   * @return Returns Spherical Mercator ProjectedMeters coordinates\n   */\n  fun projectedMetersForCoordinate(point: Point): ProjectedMeters\n\n  /**\n   * Calculate a longitude-latitude pair for a Spherical Mercator projected\n   * meters.\n   *\n   * @param projectedMeters Spherical Mercator ProjectedMeters coordinates for\n   * which to calculate a longitude-latitude pair.\n   *\n   * @return Returns a longitude-latitude pair.\n   */\n  fun coordinateForProjectedMeters(projectedMeters: ProjectedMeters): Point\n\n  /**\n   * Calculate a point on the map in Mercator Projection for a given\n   * coordinate at the specified zoom scale.\n   *\n   * @param point The longitude-latitude pair for which to return the value.\n   * @param zoomScale The current zoom factor applied on the map, is used to\n   * calculate the world size as tileSize * zoomScale (i.e., 512 * 2 ^ Zoom level)\n   * where tileSize is the width of a tile in pixels.\n   *\n   * @return Returns a point on the map in Mercator projection.\n   */\n  fun project(point: Point, zoomScale: Double): MercatorCoordinate\n\n  /**\n   * Calculate a coordinate for a given point on the map in Mercator Projection.\n   *\n   * @param coordinate Point on the map in Mercator projection.\n   * @param zoomScale The current zoom factor applied on the map, is used to\n   * calculate the world size as tileSize * zoomScale (i.e., 512 * 2 ^ Zoom level)\n   * where tileSize is the width of a tile in pixels.\n   *\n   * @return Returns a coordinate.\n   */\n  fun unproject(coordinate: MercatorCoordinate, zoomScale: Double): Point\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/MapTransformDelegate.kt",
    "content": "package com.mapbox.maps.plugin.delegates\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.*\n\n/**\n * Definition of a map transform delegate.\n */\ninterface MapTransformDelegate {\n  /**\n   * Tells the map rendering engine that there is currently a gesture in progress. This\n   * affects how the map renders labels, as it will use different texture filters if a gesture\n   * is ongoing.\n   *\n   * @param inProgress The `boolean` value representing if a gesture is in progress.\n   */\n  fun setGestureInProgress(inProgress: Boolean)\n\n  /**\n   * Returns if a gesture is in progress.\n   *\n   * @return Returns if a gesture is in progress\n   */\n  fun isGestureInProgress(): Boolean\n\n  /**\n   * Set the map north orientation\n   *\n   * @param northOrientation The map north orientation to set\n   */\n  fun setNorthOrientation(northOrientation: NorthOrientation)\n\n  /**\n   * Set the map constrain mode\n   *\n   * @param constrainMode The map constraint mode to set\n   */\n  fun setConstrainMode(constrainMode: ConstrainMode)\n\n  /**\n   * Set the map viewport mode\n   *\n   * @param viewportMode The map viewport mode to set\n   */\n  fun setViewportMode(viewportMode: ViewportMode)\n\n  /**\n   * Tells the map rendering engine that the animation is currently performed by the\n   * user (e.g. with a `setCamera()` calls series). It adjusts the engine for the animation use case.\n   * In particular, it brings more stability to symbol placement and rendering.\n   *\n   * @param inProgress Bool representing if user animation is in progress\n   */\n  fun setUserAnimationInProgress(inProgress: Boolean)\n\n  /**\n   * This method provides hints for animations, enabling the rendering engine to pre-process animation\n   * frames and apply performance optimizations.\n   *\n   * The provided data is taken into action on the next\n   * [setUserAnimationInProgress(true)][setUserAnimationInProgress] call.\n   *\n   * @param cameraAnimationHint the camera animation hint\n   */\n  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\n  @MapboxExperimental\n  fun setCameraAnimationHint(cameraAnimationHint: CameraAnimationHint)\n\n  /**\n   * Returns if user animation is currently in progress.\n   *\n   * @return Return true if a user animation is in progress.\n   */\n  fun isUserAnimationInProgress(): Boolean\n\n  /**\n   * Get map options.\n   *\n   * @return Returns map options\n   */\n  fun getMapOptions(): MapOptions\n\n  /**\n   * Gets the size of the map.\n   *\n   * @return size The size of the map in MapOptions#size platform pixels\n   */\n  fun getSize(): Size\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnCameraChangeListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.CameraChangedEventData\nimport com.mapbox.maps.plugin.animation.CameraAnimationsLifecycleListener\nimport com.mapbox.maps.plugin.animation.CameraAnimationsPlugin\nimport com.mapbox.maps.plugin.animation.CameraAnimatorChangeListener\n\n/**\n * Definition for listener invoked whenever the camera position changes.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use CameraChangedCallback instead.\",\n  replaceWith = ReplaceWith(\"CameraChangedCallback\"),\n  level = DeprecationLevel.WARNING\n)\nfun interface OnCameraChangeListener {\n\n  /**\n   * Invoked whenever camera position changes.\n   *\n   * For more precise information about actual map camera animations\n   * please check [CameraAnimationsPlugin], [CameraAnimationsLifecycleListener] and [CameraAnimatorChangeListener]\n   *\n   * @param eventData CameraChangedEventData\n   *\n   */\n  fun onCameraChanged(eventData: CameraChangedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnMapIdleListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.MapIdleEventData\n\n/**\n * Definition for listener invoked whenever the Map has entered the idle state.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use MapIdleCallback instead.\",\n  replaceWith = ReplaceWith(\"MapIdleCallback\"),\n  level = DeprecationLevel.WARNING\n)\nfun interface OnMapIdleListener {\n\n  /**\n   * Invoked when the Map has entered the idle state. The Map is in the idle state when there are no ongoing transitions\n   * and the Map has rendered all available tiles.\n   *\n   * @param eventData MapIdleEventData\n   */\n  fun onMapIdle(eventData: MapIdleEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnMapLoadErrorListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.MapLoadingErrorEventData\nimport com.mapbox.maps.extension.observable.model.MapLoadErrorType\n\n/**\n * Definition for listener invoked whenever the map load errors out.\n * See [MapLoadErrorType].\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use MapLoadingErrorCallback instead.\",\n  replaceWith = ReplaceWith(\"MapLoadingErrorCallback\")\n)\ninterface OnMapLoadErrorListener {\n  /**\n   * Invoked whenever the map load errors out\n   *\n   * @param eventData MapLoadingErrorEventData\n   */\n  fun onMapLoadError(eventData: MapLoadingErrorEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnMapLoadedListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.MapLoadedEventData\n\n/**\n * Definition for listener invoked when the map loading finishes.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use MapLoadedCallback instead.\",\n  replaceWith = ReplaceWith(\"MapLoadedCallback\")\n)\nfun interface OnMapLoadedListener {\n\n  /**\n   * Invoked when the Map's style has been fully loaded, and the Map has rendered all visible tiles.\n   *\n   * @param eventData MapLoadedEventData\n   */\n  fun onMapLoaded(eventData: MapLoadedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnRenderFrameFinishedListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.RenderFrameFinishedEventData\n\n/**\n * Definition for listener invoked whenever the Map finished rendering a frame.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use RenderFrameFinishedCallback instead.\",\n  replaceWith = ReplaceWith(\"RenderFrameFinishedCallback\")\n)\nfun interface OnRenderFrameFinishedListener {\n  /**\n   * Invoked whenever the Map finished rendering a frame.\n   * The render-mode value tells whether the Map has all data (\"full\") required to render the visible viewport.\n   * The needs-repaint value provides information about ongoing transitions that trigger Map repaint.\n   * The placement-changed value tells if the symbol placement has been changed in the visible viewport.\n   *\n   * @param eventData RenderFrameFinishedEventData\n   */\n  fun onRenderFrameFinished(eventData: RenderFrameFinishedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnRenderFrameStartedListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.RenderFrameStartedEventData\n\n/**\n * Definition for listener invoked whenever the Map started rendering a frame.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use RenderFrameStartedCallback instead.\",\n  replaceWith = ReplaceWith(\"RenderFrameStartedCallback\")\n)\nfun interface OnRenderFrameStartedListener {\n  /**\n   * Invoked whenever the Map started rendering a frame.\n   *\n   * @param eventData RenderFrameStartedEventData\n   */\n  fun onRenderFrameStarted(eventData: RenderFrameStartedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnSourceAddedListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.SourceAddedEventData\n\n/**\n * Definition for listener invoked whenever a source is added.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use SourceAddedCallback instead.\",\n  replaceWith = ReplaceWith(\"SourceAddedCallback\")\n)\nfun interface OnSourceAddedListener {\n  /**\n   * Invoked whenever the Source has been added with StyleManager#addStyleSource runtime API.\n   *\n   * @param eventData SourceAddedEventData\n   */\n  fun onSourceAdded(eventData: SourceAddedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnSourceDataLoadedListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.SourceDataLoadedEventData\n\n/**\n * Definition for listener invoked when the requested source data has been loaded.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use SourceDataLoadedCallback instead.\",\n  replaceWith = ReplaceWith(\"SourceDataLoadedCallback\")\n)\nfun interface OnSourceDataLoadedListener {\n\n  /**\n   * Invoked when the requested source data has been loaded.\n   *\n   * @param eventData SourceDataLoadedEventData\n   */\n  fun onSourceDataLoaded(eventData: SourceDataLoadedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnSourceRemovedListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.SourceRemovedEventData\n\n/**\n * Definition for listener invoked whenever a source is removed.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use SourceRemovedCallback instead.\",\n  replaceWith = ReplaceWith(\"SourceRemovedCallback\")\n)\nfun interface OnSourceRemovedListener {\n  /**\n   * Invoked whenever the Source has been removed with StyleManager#removeStyleSource runtime API.\n   *\n   * @param eventData SourceRemovedEventData\n   */\n  fun onSourceRemoved(eventData: SourceRemovedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnStyleDataLoadedListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.StyleDataLoadedEventData\n\n/**\n * Definition for listener invoked when the requested style data has been loaded.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use StyleDataLoadedCallback instead.\",\n  replaceWith = ReplaceWith(\"StyleDataLoadedCallback\")\n)\nfun interface OnStyleDataLoadedListener {\n  /**\n   * Invoked when the requested style data has been loaded.\n   *\n   * @param eventData StyleDataLoadedEventData\n   */\n  fun onStyleDataLoaded(eventData: StyleDataLoadedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnStyleImageMissingListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.StyleImageMissingEventData\n\n/**\n * Definition for listener invoked when the style has a missing image.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use StyleImageMissingCallback instead.\",\n  replaceWith = ReplaceWith(\"StyleImageMissingCallback\")\n)\nfun interface OnStyleImageMissingListener {\n\n  /**\n   * Invoked whenever a style has a missing image. This event is emitted when the Map renders visible tiles and\n   * one of the required images is missing in the sprite sheet. Subscriber has to provide the missing image\n   * by calling StyleManager#addStyleImage method.\n   *\n   * @param eventData StyleImageMissingEventData\n   */\n  fun onStyleImageMissing(eventData: StyleImageMissingEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnStyleImageUnusedListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.StyleImageUnusedEventData\n\n/**\n * Definition for listener invoked when an image added to the Style is no longer needed.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use StyleImageRemoveUnusedCallback instead.\",\n  replaceWith = ReplaceWith(\"StyleImageRemoveUnusedCallback\")\n)\nfun interface OnStyleImageUnusedListener {\n\n  /**\n   * Invoked whenever an image added to the Style is no longer needed and can be removed using StyleManager#removeStyleImage method.\n   *\n   * @param eventData StyleImageUnusedEventData\n   */\n  fun onStyleImageUnused(eventData: StyleImageUnusedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/delegates/listeners/OnStyleLoadedListener.kt",
    "content": "package com.mapbox.maps.plugin.delegates.listeners\n\nimport com.mapbox.maps.extension.observable.eventdata.StyleLoadedEventData\n\n/**\n * Definition for listener invoked when the style is fully loaded.\n */\n@Deprecated(\n  message = \"This listener is deprecated, and will be removed in next major release. use StyleLoadedCallback instead.\",\n  replaceWith = ReplaceWith(\"StyleLoadedCallback\")\n)\nfun interface OnStyleLoadedListener {\n\n  /**\n   * Invoked when the requested style has been fully loaded, including the style, specified sprite and sources' metadata.\n   *\n   * @param eventData StyleLoadedEventData\n   */\n  fun onStyleLoaded(eventData: StyleLoadedEventData)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/gestures/GesturesListeners.kt",
    "content": "package com.mapbox.maps.plugin.gestures\n\nimport com.mapbox.android.gestures.MoveGestureDetector\nimport com.mapbox.android.gestures.RotateGestureDetector\nimport com.mapbox.android.gestures.ShoveGestureDetector\nimport com.mapbox.android.gestures.StandardScaleGestureDetector\nimport com.mapbox.geojson.Point\n\n/**\n * Interface definition for a callback to be invoked when the map is flinged.\n */\nfun interface OnFlingListener {\n  /**\n   * Called when the map is flinged.\n   */\n  fun onFling()\n}\n\n/**\n * Interface definition for a callback to be invoked when the user clicks on the map view.\n */\nfun interface OnMapClickListener {\n  /**\n   * Called when the user clicks on the map view.\n   *\n   * @param point The projected map coordinate the user clicked on.\n   * @return True if this click should be consumed and not passed further to other listeners registered afterwards,\n   * false otherwise.\n   */\n  fun onMapClick(point: Point): Boolean\n}\n\n/**\n * Interface definition for a callback to be invoked when the user long clicks on the map view.\n */\nfun interface OnMapLongClickListener {\n  /**\n   * Called when the user long clicks on the map view.\n   *\n   * @param point The projected map coordinate the user long clicked on.\n   * @return True if this click should be consumed and not passed further to other listeners registered afterwards,\n   * false otherwise.\n   */\n  fun onMapLongClick(point: Point): Boolean\n}\n\n/**\n * Interface definition for a callback to be invoked when the map is moved.\n */\ninterface OnMoveListener {\n  /**\n   * Called when the move gesture is starting.\n   */\n  fun onMoveBegin(detector: MoveGestureDetector)\n\n  /**\n   * Called when the move gesture is executing.\n   *\n   * @return true if the gesture was handled, false otherwise\n   */\n  fun onMove(detector: MoveGestureDetector): Boolean\n\n  /**\n   * Called when the move gesture is ending.\n   */\n  fun onMoveEnd(detector: MoveGestureDetector)\n}\n\n/**\n * Interface definition for a callback to be invoked when the map is rotated.\n */\ninterface OnRotateListener {\n  /**\n   * Called when the rotate gesture is starting.\n   */\n  fun onRotateBegin(detector: RotateGestureDetector)\n\n  /**\n   * Called when the rotate gesture is executing.\n   */\n  fun onRotate(detector: RotateGestureDetector)\n\n  /**\n   * Called when the rotate gesture is ending.\n   */\n  fun onRotateEnd(detector: RotateGestureDetector)\n}\n\n/**\n * Interface definition for a callback to be invoked when the map is scaled.\n */\ninterface OnScaleListener {\n  /**\n   * Called when the scale gesture is starting.\n   */\n  fun onScaleBegin(detector: StandardScaleGestureDetector)\n\n  /**\n   * Called when the scale gesture is executing.\n   */\n  fun onScale(detector: StandardScaleGestureDetector)\n\n  /**\n   * called when the scale gesture has ended.\n   */\n  fun onScaleEnd(detector: StandardScaleGestureDetector)\n}\n\n/**\n * Interface definition for a callback to be invoked when the map is shoved with two fingers.\n */\ninterface OnShoveListener {\n  /**\n   * Called when the shove gesture is starting.\n   */\n  fun onShoveBegin(detector: ShoveGestureDetector)\n\n  /**\n   * Called when the shove gesture is executing.\n   */\n  fun onShove(detector: ShoveGestureDetector)\n\n  /**\n   * Called when the shove gesture has ended.\n   */\n  fun onShoveEnd(detector: ShoveGestureDetector)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/gestures/GesturesPlugin.kt",
    "content": "package com.mapbox.maps.plugin.gestures\n\nimport android.view.MotionEvent\nimport com.mapbox.android.gestures.AndroidGesturesManager\nimport com.mapbox.maps.plugin.ContextBinder\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.MapSizePlugin\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettingsInterface\n\n/**\n * Define the interfaces for the Layer plugin.\n */\ninterface GesturesPlugin : MapPlugin, ContextBinder, MapSizePlugin, GesturesSettingsInterface {\n\n  /**\n   * Called when user touches the screen, all positions are absolute.\n   *\n   * Forwards event to the related gesture detectors.\n   *\n   * @param motionEvent the MotionEvent\n   * @return True if touch event is handled\n   */\n  fun onTouchEvent(motionEvent: MotionEvent?): Boolean\n\n  /**\n   * Called for events that don't fit the other handlers.\n   *\n   * Examples of such events are mouse scroll events, mouse moves, joystick & trackpad.\n   *\n   * @param event The MotionEvent occurred\n   * @return True is the event is handled\n   */\n  fun onGenericMotionEvent(event: MotionEvent): Boolean\n\n  /**\n   * Add a map click listener that is invoked when a map is clicked.\n   *\n   * When several [OnMapClickListener]s are registered - the callbacks will be triggered from first to last.\n   *\n   * @param onMapClickListener The map click listener to be added\n   */\n  fun addOnMapClickListener(onMapClickListener: OnMapClickListener)\n\n  /**\n   * Remove a map click listener that is invoked when a map is clicked.\n   *\n   * @param onMapClickListener The map click listener to be removed\n   */\n  fun removeOnMapClickListener(onMapClickListener: OnMapClickListener)\n\n  /**\n   * Add a map long click listener that is invoked when a map is clicked.\n   *\n   * When several [OnMapLongClickListener]s are registered - the callbacks will be triggered from first to last.\n   *\n   * @param onMapLongClickListener The map long click listener to be added\n   */\n  fun addOnMapLongClickListener(onMapLongClickListener: OnMapLongClickListener)\n\n  /**\n   * Add a map long click listener that is invoked when a map is clicked.\n   *\n   * @param onMapLongClickListener The map long click listener to be removed\n   */\n  fun removeOnMapLongClickListener(onMapLongClickListener: OnMapLongClickListener)\n\n  /**\n   * Set internal gesture manager\n   *\n   * @param internalGesturesManager The gesture manager to override\n   * @param attachDefaultListeners The flag to attach default gesture listeners\n   * @param setDefaultMutuallyExclusives The flag to set default mutually exclusive gestures\n   */\n  fun setGesturesManager(\n    internalGesturesManager: AndroidGesturesManager,\n    attachDefaultListeners: Boolean,\n    setDefaultMutuallyExclusives: Boolean\n  )\n\n  /**\n   * Get the current configured gesture manager\n   */\n  fun getGesturesManager(): AndroidGesturesManager\n\n  /**\n   * Add a rotation gesture listener that is invoked when a map is rotated\n   *\n   * @param onRotateListener The rotate gesture listener to be added\n   */\n  fun addOnRotateListener(onRotateListener: OnRotateListener)\n\n  /**\n   * Remove a rotate gesture listener that is invoked when a map is rotated\n   *\n   * @param listener The rotate gesture listener to be removed\n   */\n  fun removeOnRotateListener(listener: OnRotateListener)\n\n  /**\n   * Add a fling gesture listener that is invoked when a map is flinged\n   *\n   * @param onFlingListener The fling gesture listener to be added\n   */\n  fun addOnFlingListener(onFlingListener: OnFlingListener)\n\n  /**\n   * Remove a fling gesture listener that is invoked when a map is flinged\n   *\n   * @param onFlingListener The fling gesture listener to be removed\n   */\n  fun removeOnFlingListener(onFlingListener: OnFlingListener)\n\n  /**\n   * Add a move gesture listener that is invoked when a map is moved.\n   *\n   * When several [OnMoveListener]s are registered - the callbacks will be triggered from first to last.\n   *\n   * @param onMoveListener The move gesture listener to be added\n   */\n  fun addOnMoveListener(onMoveListener: OnMoveListener)\n\n  /**\n   * Remove a move gesture listener that is invoked when a map is moved\n   *\n   * @param listener The move gesture listener to be removed\n   */\n  fun removeOnMoveListener(listener: OnMoveListener)\n\n  /**\n   * Add a scale gesture listener that is invoked when a map is scaled\n   *\n   * @param onScaleListener The scale gesture listener to be added\n   */\n  fun addOnScaleListener(onScaleListener: OnScaleListener)\n\n  /**\n   * Remove a callback that is invoked when the map is scaled.\n   */\n  fun removeOnScaleListener(listener: OnScaleListener)\n\n  /**\n   * Add a shove gesture listener tha is invoked when a map is shoved\n   *\n   * @param onShoveListener The shove listener to be added\n   */\n  fun addOnShoveListener(onShoveListener: OnShoveListener)\n\n  /**\n   * Remove a shove gesture listener that is invoked wen a map is shoved\n   *\n   * @param listener The shove listener to be removed\n   */\n  fun removeOnShoveListener(listener: OnShoveListener)\n\n  /**\n   * Add animator owner (see [CameraAnimatorOptions.owner] or [MapAnimationOptions.owner]\n   * which animation will not be canceled with when gesture animation is about to start.\n   * When specified, you are responsible for listening to gesture interactions and canceling the specified owners' animations to avoid competing with gestures.\n   */\n  fun addProtectedAnimationOwner(owner: String)\n\n  /**\n   * Remove animator owner (see [CameraAnimatorOptions.owner] or [MapAnimationOptions.owner])\n   * which animation will not be canceled with when gesture animation is about to start.\n   * When specified, you are responsible for listening to gesture interactions and canceling the specified owners' animations to avoid competing with gestures.\n   */\n  fun removeProtectedAnimationOwner(owner: String)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/gestures/generated/GesturesSettingsBase.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.gestures.generated\n\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.ScrollMode\n\n/**\n * Abstract settings class for GesturesPlugin.\n *\n * This abstract class exposes all the required public APIs to configure the GesturesPlugin.\n */\nabstract class GesturesSettingsBase : GesturesSettingsInterface {\n  /**\n   * Gesture configuration allows to control the user touch interaction.\n   */\n  protected abstract var internalSettings: GesturesSettings\n\n  /**\n   * Apply the changes to the GesturesSettings to the GesturesPlugin.\n   */\n  protected abstract fun applySettings()\n\n  /**\n   * Get current gestures configuration.\n   *\n   * @return gestures settings\n   */\n  override fun getSettings(): GesturesSettings {\n    return internalSettings.toBuilder().build()\n  }\n\n  /**\n   * Update gestures configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of GesturesSettings\n   */\n  override fun updateSettings(block: GesturesSettings.Builder.() -> Unit) {\n    val newSettings = this.internalSettings.toBuilder().apply(block).build()\n    this.internalSettings = newSettings\n    applySettings()\n  }\n\n  /**\n   * Whether the rotate gesture is enabled. Default value: true.\n   */\n  override var rotateEnabled: Boolean\n    get() {\n      return this.internalSettings.rotateEnabled\n    }\n    set(value) {\n      if (this.internalSettings.rotateEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setRotateEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the pinch to zoom gesture is enabled. Default value: true.\n   */\n  override var pinchToZoomEnabled: Boolean\n    get() {\n      return this.internalSettings.pinchToZoomEnabled\n    }\n    set(value) {\n      if (this.internalSettings.pinchToZoomEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPinchToZoomEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the single-touch scroll gesture is enabled. Default value: true.\n   */\n  override var scrollEnabled: Boolean\n    get() {\n      return this.internalSettings.scrollEnabled\n    }\n    set(value) {\n      if (this.internalSettings.scrollEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setScrollEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether rotation is enabled for the pinch to zoom gesture. Default value: true.\n   */\n  override var simultaneousRotateAndPinchToZoomEnabled: Boolean\n    get() {\n      return this.internalSettings.simultaneousRotateAndPinchToZoomEnabled\n    }\n    set(value) {\n      if (this.internalSettings.simultaneousRotateAndPinchToZoomEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setSimultaneousRotateAndPinchToZoomEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the pitch gesture is enabled. Default value: true.\n   */\n  override var pitchEnabled: Boolean\n    get() {\n      return this.internalSettings.pitchEnabled\n    }\n    set(value) {\n      if (this.internalSettings.pitchEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPitchEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Configures the directions in which the map is allowed to move during a scroll gesture. Default value: \"horizontal-and-vertical\".\n   */\n  override var scrollMode: ScrollMode\n    get() {\n      return this.internalSettings.scrollMode\n    }\n    set(value) {\n      if (this.internalSettings.scrollMode != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setScrollMode(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether double tapping the map with one touch results in a zoom-in animation. Default value: true.\n   */\n  override var doubleTapToZoomInEnabled: Boolean\n    get() {\n      return this.internalSettings.doubleTapToZoomInEnabled\n    }\n    set(value) {\n      if (this.internalSettings.doubleTapToZoomInEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setDoubleTapToZoomInEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether single tapping the map with two touches results in a zoom-out animation. Default value: true.\n   */\n  override var doubleTouchToZoomOutEnabled: Boolean\n    get() {\n      return this.internalSettings.doubleTouchToZoomOutEnabled\n    }\n    set(value) {\n      if (this.internalSettings.doubleTouchToZoomOutEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setDoubleTouchToZoomOutEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the quick zoom gesture is enabled. Default value: true.\n   */\n  override var quickZoomEnabled: Boolean\n    get() {\n      return this.internalSettings.quickZoomEnabled\n    }\n    set(value) {\n      if (this.internalSettings.quickZoomEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setQuickZoomEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * By default, gestures rotate and zoom around the center of the gesture. Set this property to rotate and zoom around a fixed point instead.\n   */\n  override var focalPoint: ScreenCoordinate?\n    get() {\n      return this.internalSettings.focalPoint\n    }\n    set(value) {\n      if (this.internalSettings.focalPoint != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setFocalPoint(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether a deceleration animation following a pinch-to-zoom gesture is enabled. True by default. Default value: true.\n   */\n  override var pinchToZoomDecelerationEnabled: Boolean\n    get() {\n      return this.internalSettings.pinchToZoomDecelerationEnabled\n    }\n    set(value) {\n      if (this.internalSettings.pinchToZoomDecelerationEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPinchToZoomDecelerationEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether a deceleration animation following a rotate gesture is enabled. True by default. Default value: true.\n   */\n  override var rotateDecelerationEnabled: Boolean\n    get() {\n      return this.internalSettings.rotateDecelerationEnabled\n    }\n    set(value) {\n      if (this.internalSettings.rotateDecelerationEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setRotateDecelerationEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether a deceleration animation following a scroll gesture is enabled. True by default. Default value: true.\n   */\n  override var scrollDecelerationEnabled: Boolean\n    get() {\n      return this.internalSettings.scrollDecelerationEnabled\n    }\n    set(value) {\n      if (this.internalSettings.scrollDecelerationEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setScrollDecelerationEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether rotate threshold increases when pinching to zoom. true by default. Default value: true.\n   */\n  @Deprecated(message = \"This property has no effect\")\n  override var increaseRotateThresholdWhenPinchingToZoom: Boolean\n    get() {\n      return this.internalSettings.increaseRotateThresholdWhenPinchingToZoom\n    }\n    set(value) {\n      if (this.internalSettings.increaseRotateThresholdWhenPinchingToZoom != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setIncreaseRotateThresholdWhenPinchingToZoom(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether pinch to zoom threshold increases when rotating. true by default. Default value: true.\n   */\n  override var increasePinchToZoomThresholdWhenRotating: Boolean\n    get() {\n      return this.internalSettings.increasePinchToZoomThresholdWhenRotating\n    }\n    set(value) {\n      if (this.internalSettings.increasePinchToZoomThresholdWhenRotating != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setIncreasePinchToZoomThresholdWhenRotating(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The amount by which the zoom level increases or decreases during a double-tap-to-zoom-in or double-touch-to-zoom-out gesture. 1.0 by default. Must be positive. Default value: 1.\n   */\n  override var zoomAnimationAmount: Float\n    get() {\n      return this.internalSettings.zoomAnimationAmount\n    }\n    set(value) {\n      if (this.internalSettings.zoomAnimationAmount != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setZoomAnimationAmount(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether pan is enabled for the pinch gesture. Default value: true.\n   */\n  override var pinchScrollEnabled: Boolean\n    get() {\n      return this.internalSettings.pinchScrollEnabled\n    }\n    set(value) {\n      if (this.internalSettings.pinchScrollEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPinchScrollEnabled(value).build()\n        applySettings()\n      }\n    }\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/gestures/generated/GesturesSettingsData.kt",
    "content": "// This file is generated.\n// This class is annotated with `DataCompat`.\n// Therefore, it is used to auto-generate `GesturesSettings`.\n\npackage com.mapbox.maps.plugin.gestures.generated\n\nimport android.os.Parcelable\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.ScrollMode\nimport com.tobrun.datacompat.annotation.DataCompat\nimport com.tobrun.datacompat.annotation.Default\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Gesture configuration allows to control the user touch interaction.\n */\n@Parcelize\n@DataCompat\nprivate data class GesturesSettingsData(\n\n  /**\n   * Whether the rotate gesture is enabled. Default value: true.\n   */\n  @Default(\"true\")\n  var rotateEnabled: Boolean,\n\n  /**\n   * Whether the pinch to zoom gesture is enabled. Default value: true.\n   */\n  @Default(\"true\")\n  var pinchToZoomEnabled: Boolean,\n\n  /**\n   * Whether the single-touch scroll gesture is enabled. Default value: true.\n   */\n  @Default(\"true\")\n  var scrollEnabled: Boolean,\n\n  /**\n   * Whether rotation is enabled for the pinch to zoom gesture. Default value: true.\n   */\n  @Default(\"true\")\n  var simultaneousRotateAndPinchToZoomEnabled: Boolean,\n\n  /**\n   * Whether the pitch gesture is enabled. Default value: true.\n   */\n  @Default(\"true\")\n  var pitchEnabled: Boolean,\n\n  /**\n   * Configures the directions in which the map is allowed to move during a scroll gesture. Default value: \"horizontal-and-vertical\".\n   */\n  @Default(\"ScrollMode.HORIZONTAL_AND_VERTICAL\")\n  var scrollMode: ScrollMode,\n\n  /**\n   * Whether double tapping the map with one touch results in a zoom-in animation. Default value: true.\n   */\n  @Default(\"true\")\n  var doubleTapToZoomInEnabled: Boolean,\n\n  /**\n   * Whether single tapping the map with two touches results in a zoom-out animation. Default value: true.\n   */\n  @Default(\"true\")\n  var doubleTouchToZoomOutEnabled: Boolean,\n\n  /**\n   * Whether the quick zoom gesture is enabled. Default value: true.\n   */\n  @Default(\"true\")\n  var quickZoomEnabled: Boolean,\n\n  /**\n   * By default, gestures rotate and zoom around the center of the gesture. Set this property to rotate and zoom around a fixed point instead.\n   */\n  var focalPoint: ScreenCoordinate? = null,\n\n  /**\n   * Whether a deceleration animation following a pinch-to-zoom gesture is enabled. True by default. Default value: true.\n   */\n  @Default(\"true\")\n  var pinchToZoomDecelerationEnabled: Boolean,\n\n  /**\n   * Whether a deceleration animation following a rotate gesture is enabled. True by default. Default value: true.\n   */\n  @Default(\"true\")\n  var rotateDecelerationEnabled: Boolean,\n\n  /**\n   * Whether a deceleration animation following a scroll gesture is enabled. True by default. Default value: true.\n   */\n  @Default(\"true\")\n  var scrollDecelerationEnabled: Boolean,\n\n  /**\n   * Whether rotate threshold increases when pinching to zoom. true by default. Default value: true.\n   */\n  @Default(\"true\")\n  var increaseRotateThresholdWhenPinchingToZoom: Boolean,\n\n  /**\n   * Whether pinch to zoom threshold increases when rotating. true by default. Default value: true.\n   */\n  @Default(\"true\")\n  var increasePinchToZoomThresholdWhenRotating: Boolean,\n\n  /**\n   * The amount by which the zoom level increases or decreases during a double-tap-to-zoom-in or double-touch-to-zoom-out gesture. 1.0 by default. Must be positive. Default value: 1.\n   */\n  @Default(\"1f\")\n  var zoomAnimationAmount: Float,\n\n  /**\n   * Whether pan is enabled for the pinch gesture. Default value: true.\n   */\n  @Default(\"true\")\n  var pinchScrollEnabled: Boolean,\n) : Parcelable\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/gestures/generated/GesturesSettingsInterface.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.gestures.generated\n\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.ScrollMode\n\n/**\n * Interface that defines the public settings interface for GesturesPlugin.\n */\ninterface GesturesSettingsInterface {\n  /**\n   * Get current gestures configuration.\n   *\n   * @return gestures settings\n   */\n  fun getSettings(): GesturesSettings\n\n  /**\n   * Update gestures configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of GesturesSettings\n   */\n  fun updateSettings(block: GesturesSettings.Builder.() -> Unit)\n\n  /**\n   * Whether the rotate gesture is enabled. Default value: true.\n   */\n  var rotateEnabled: Boolean\n\n  /**\n   * Whether the pinch to zoom gesture is enabled. Default value: true.\n   */\n  var pinchToZoomEnabled: Boolean\n\n  /**\n   * Whether the single-touch scroll gesture is enabled. Default value: true.\n   */\n  var scrollEnabled: Boolean\n\n  /**\n   * Whether rotation is enabled for the pinch to zoom gesture. Default value: true.\n   */\n  var simultaneousRotateAndPinchToZoomEnabled: Boolean\n\n  /**\n   * Whether the pitch gesture is enabled. Default value: true.\n   */\n  var pitchEnabled: Boolean\n\n  /**\n   * Configures the directions in which the map is allowed to move during a scroll gesture. Default value: \"horizontal-and-vertical\".\n   */\n  var scrollMode: ScrollMode\n\n  /**\n   * Whether double tapping the map with one touch results in a zoom-in animation. Default value: true.\n   */\n  var doubleTapToZoomInEnabled: Boolean\n\n  /**\n   * Whether single tapping the map with two touches results in a zoom-out animation. Default value: true.\n   */\n  var doubleTouchToZoomOutEnabled: Boolean\n\n  /**\n   * Whether the quick zoom gesture is enabled. Default value: true.\n   */\n  var quickZoomEnabled: Boolean\n\n  /**\n   * By default, gestures rotate and zoom around the center of the gesture. Set this property to rotate and zoom around a fixed point instead.\n   */\n  var focalPoint: ScreenCoordinate?\n\n  /**\n   * Whether a deceleration animation following a pinch-to-zoom gesture is enabled. True by default. Default value: true.\n   */\n  var pinchToZoomDecelerationEnabled: Boolean\n\n  /**\n   * Whether a deceleration animation following a rotate gesture is enabled. True by default. Default value: true.\n   */\n  var rotateDecelerationEnabled: Boolean\n\n  /**\n   * Whether a deceleration animation following a scroll gesture is enabled. True by default. Default value: true.\n   */\n  var scrollDecelerationEnabled: Boolean\n\n  /**\n   * Whether rotate threshold increases when pinching to zoom. true by default. Default value: true.\n   */\n  @Deprecated(message = \"This property has no effect\")\n  var increaseRotateThresholdWhenPinchingToZoom: Boolean\n\n  /**\n   * Whether pinch to zoom threshold increases when rotating. true by default. Default value: true.\n   */\n  var increasePinchToZoomThresholdWhenRotating: Boolean\n\n  /**\n   * The amount by which the zoom level increases or decreases during a double-tap-to-zoom-in or double-touch-to-zoom-out gesture. 1.0 by default. Must be positive. Default value: 1.\n   */\n  var zoomAnimationAmount: Float\n\n  /**\n   * Whether pan is enabled for the pinch gesture. Default value: true.\n   */\n  var pinchScrollEnabled: Boolean\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/indoorselector/IndoorSelectorPlugin.kt",
    "content": "package com.mapbox.maps.plugin.indoorselector\n\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.IndoorFloor\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.plugin.LifecyclePlugin\nimport com.mapbox.maps.plugin.ViewPlugin\nimport com.mapbox.maps.plugin.indoorselector.generated.IndoorSelectorSettingsInterface\n\n/**\n * Plugin interface for indoor floor selector.\n * Displays a vertical list of floors with navigation controls.\n *\n * The plugin automatically subscribes to IndoorManager events and updates the UI\n * when floor data is available. The UI is automatically shown/hidden based on\n * indoor data availability.\n *\n * Example usage:\n * ```\n * // Configure the plugin (optional - defaults are provided)\n * mapView.indoorSelector.updateSettings {\n *   enabled = true\n * }\n *\n * ```\n */\n@MapboxExperimental\ninterface IndoorSelectorPlugin : ViewPlugin, LifecyclePlugin, IndoorSelectorSettingsInterface {\n\n  /**\n   * Update the list of available floors and the currently selected floor.\n   *\n   * @param floors List of available floors\n   * @param selectedFloorId The ID of the currently selected floor (null if no floor is selected)\n   */\n  @MapboxExperimental\n  @RestrictTo(RestrictTo.Scope.LIBRARY)\n  fun updateFloors(floors: List<IndoorFloor>, selectedFloorId: String?)\n\n  /**\n   * Add a floor selection listener to be notified when user selects a floor.\n   *\n   * @param listener The listener to add\n   */\n  @MapboxExperimental\n  fun addOnFloorSelectedListener(listener: OnFloorSelectedListener)\n\n  /**\n   * Remove a previously added floor selection listener.\n   *\n   * @param listener The listener to remove\n   */\n  @MapboxExperimental\n  fun removeOnFloorSelectedListener(listener: OnFloorSelectedListener)\n\n  /**\n   * Called when a floor is selected by the user.\n   *\n   * @param floorId The ID of the selected floor\n   */\n  @MapboxExperimental\n  @RestrictTo(RestrictTo.Scope.LIBRARY)\n  fun onFloorSelected(floorId: String)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/indoorselector/IndoorSelectorView.kt",
    "content": "package com.mapbox.maps.plugin.indoorselector\n\nimport com.mapbox.maps.IndoorFloor\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Interface for the indoor floor selector view.\n */\n@MapboxExperimental\ninterface IndoorSelectorView {\n\n  /**\n   * Controls the visibility of the indoor selector.\n   */\n  var isIndoorSelectorVisible: Boolean\n\n  /**\n   * Set the gravity/position of the indoor selector on the map.\n   *\n   * @param gravity Gravity constant (e.g., Gravity.TOP | Gravity.END)\n   */\n  fun setIndoorGravity(gravity: Int)\n\n  /**\n   * Set the margins for the indoor selector.\n   *\n   * @param left Left margin in pixels\n   * @param top Top margin in pixels\n   * @param right Right margin in pixels\n   * @param bottom Bottom margin in pixels\n   */\n  fun setIndoorSelectorMargins(left: Int, top: Int, right: Int, bottom: Int)\n\n  /**\n   * Update the floor list and selected floor.\n   *\n   * @param floors List of available floors\n   * @param selectedFloorId ID of the currently selected floor\n   */\n  @OptIn(com.mapbox.annotation.MapboxExperimental::class)\n  fun updateFloors(floors: List<IndoorFloor>, selectedFloorId: String?)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/indoorselector/OnFloorSelectedListener.kt",
    "content": "package com.mapbox.maps.plugin.indoorselector\n\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Listener for floor selection events.\n */\n@MapboxExperimental\nfun interface OnFloorSelectedListener {\n  /**\n   * Called when a floor is selected by the user.\n   *\n   * @param floorId The ID of the selected floor\n   */\n  fun onFloorSelected(floorId: String)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsBase.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.indoorselector.generated\n\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Abstract settings class for IndoorSelectorPlugin.\n *\n * This abstract class exposes all the required public APIs to configure the IndoorSelectorPlugin.\n */\n@MapboxExperimental\nabstract class IndoorSelectorSettingsBase : IndoorSelectorSettingsInterface {\n  /**\n   * Settings for the indoor floor selector.\n   */\n  protected abstract var internalSettings: IndoorSelectorSettings\n\n  /**\n   * Apply the changes to the IndoorSelectorSettings to the IndoorSelectorPlugin.\n   */\n  protected abstract fun applySettings()\n\n  /**\n   * Get current indoorselector configuration.\n   *\n   * @return indoorselector settings\n   */\n  override fun getSettings(): IndoorSelectorSettings {\n    return internalSettings.toBuilder().build()\n  }\n\n  /**\n   * Update indoorselector configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of IndoorSelectorSettings\n   */\n  override fun updateSettings(block: IndoorSelectorSettings.Builder.() -> Unit) {\n    val newSettings = this.internalSettings.toBuilder().apply(block).build()\n    // Trigger the enabled setter to ensure custom logic (e.g., listener management) is executed\n    this.enabled = newSettings.enabled\n    this.internalSettings = newSettings\n    applySettings()\n  }\n\n  /**\n   * Whether the indoor selector is visible on the map. Default value: true.\n   */\n  override var enabled: Boolean\n    get() {\n      return this.internalSettings.enabled\n    }\n    set(value) {\n      if (this.internalSettings.enabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines where the indoor selector is positioned on the map. Default value: \"top-right\".\n   */\n  override var position: Int\n    get() {\n      return this.internalSettings.position\n    }\n    set(value) {\n      if (this.internalSettings.position != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPosition(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the left that the indoor selector honors. Default value: 8.\n   */\n  override var marginLeft: Float\n    get() {\n      return this.internalSettings.marginLeft\n    }\n    set(value) {\n      if (this.internalSettings.marginLeft != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginLeft(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the top that the indoor selector honors. Default value: 60.\n   */\n  override var marginTop: Float\n    get() {\n      return this.internalSettings.marginTop\n    }\n    set(value) {\n      if (this.internalSettings.marginTop != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginTop(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the right that the indoor selector honors. Default value: 8.\n   */\n  override var marginRight: Float\n    get() {\n      return this.internalSettings.marginRight\n    }\n    set(value) {\n      if (this.internalSettings.marginRight != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginRight(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the bottom that the indoor selector honors. Default value: 8.\n   */\n  override var marginBottom: Float\n    get() {\n      return this.internalSettings.marginBottom\n    }\n    set(value) {\n      if (this.internalSettings.marginBottom != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginBottom(value).build()\n        applySettings()\n      }\n    }\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsData.kt",
    "content": "// This file is generated.\n// This class is annotated with `DataCompat`.\n// Therefore, it is used to auto-generate `IndoorSelectorSettings`.\n\npackage com.mapbox.maps.plugin.indoorselector.generated\n\nimport android.os.Parcelable\nimport com.mapbox.maps.MapboxExperimental\nimport com.tobrun.datacompat.annotation.DataCompat\nimport com.tobrun.datacompat.annotation.Default\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Settings for the indoor floor selector.\n */\n@MapboxExperimental\n@Parcelize\n@DataCompat(\n    importsForDefaults = [\n        \"android.view.Gravity\",\n    ]\n)\nprivate data class IndoorSelectorSettingsData(\n\n  /**\n   * Whether the indoor selector is visible on the map. Default value: true.\n   */\n  @Default(\"true\")\n  var enabled: Boolean,\n\n  /**\n   * Defines where the indoor selector is positioned on the map. Default value: \"top-right\".\n   */\n  @Default(\"Gravity.TOP or Gravity.END\")\n  var position: Int,\n\n  /**\n   * Defines the margin to the left that the indoor selector honors. Default value: 8. This property is specified in pixels.\n   */\n  @Default(\"8f\")\n  var marginLeft: Float,\n\n  /**\n   * Defines the margin to the top that the indoor selector honors. Default value: 60. This property is specified in pixels.\n   */\n  @Default(\"60f\")\n  var marginTop: Float,\n\n  /**\n   * Defines the margin to the right that the indoor selector honors. Default value: 8. This property is specified in pixels.\n   */\n  @Default(\"8f\")\n  var marginRight: Float,\n\n  /**\n   * Defines the margin to the bottom that the indoor selector honors. Default value: 8. This property is specified in pixels.\n   */\n  @Default(\"8f\")\n  var marginBottom: Float,\n) : Parcelable\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettingsInterface.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.indoorselector.generated\n\nimport com.mapbox.maps.MapboxExperimental\n\n/**\n * Interface that defines the public settings interface for IndoorSelectorPlugin.\n */\n@MapboxExperimental\ninterface IndoorSelectorSettingsInterface {\n  /**\n   * Get current indoorselector configuration.\n   *\n   * @return indoorselector settings\n   */\n  fun getSettings(): IndoorSelectorSettings\n\n  /**\n   * Update indoorselector configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of IndoorSelectorSettings\n   */\n  fun updateSettings(block: IndoorSelectorSettings.Builder.() -> Unit)\n\n  /**\n   * Whether the indoor selector is visible on the map. Default value: true.\n   */\n  var enabled: Boolean\n\n  /**\n   * Defines where the indoor selector is positioned on the map. Default value: \"top-right\".\n   */\n  var position: Int\n\n  /**\n   * Defines the margin to the left that the indoor selector honors. Default value: 8.\n   */\n  var marginLeft: Float\n\n  /**\n   * Defines the margin to the top that the indoor selector honors. Default value: 60.\n   */\n  var marginTop: Float\n\n  /**\n   * Defines the margin to the right that the indoor selector honors. Default value: 8.\n   */\n  var marginRight: Float\n\n  /**\n   * Defines the margin to the bottom that the indoor selector honors. Default value: 8.\n   */\n  var marginBottom: Float\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/lifecycle/MapboxLifecyclePlugin.kt",
    "content": "package com.mapbox.maps.plugin.lifecycle\n\nimport android.view.View\nimport com.mapbox.maps.MapboxLifecycleObserver\nimport com.mapbox.maps.plugin.MapPlugin\n\n/**\n * Defines interface of a MapViewPlugin.\n */\nfun interface MapboxLifecyclePlugin : MapPlugin {\n\n  /**\n   * Register the MapboxLifecycleObserver to observe lifecycle events from LifecycleOwner\n   *\n   * @param mapView the instance of mapView, will get the LifecycleOwner from mapview's parent\n   * @param observer observer listening to lifecycle events\n   */\n  fun registerLifecycleObserver(mapView: View, observer: MapboxLifecycleObserver)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationComponentPlugin.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.plugin.*\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettingsInterface\n\n/**\n * Define the interfaces for the Location plugin.\n */\ninterface LocationComponentPlugin :\n  MapPlugin,\n  MapStyleObserverPlugin,\n  LifecyclePlugin,\n  ContextBinder,\n  LocationComponentSettingsInterface {\n  /**\n   * Set the LocationProvider, it will replace the default location provider provided by the LocationComponentPlugin.\n   */\n  fun setLocationProvider(locationProvider: LocationProvider)\n\n  /**\n   * Get the current LocationProvider under usage with the LocationComponentPlugin.\n   *\n   * @return The location provider currently under usage, and will return null if the location component plugin is not enabled and not initialised.\n   */\n  fun getLocationProvider(): LocationProvider?\n\n  /**\n   * Adds a listener that gets invoked when indicator position changes.\n   *\n   * @param listener Listener that gets invoked when indicator position changes\n   */\n  fun addOnIndicatorPositionChangedListener(listener: OnIndicatorPositionChangedListener)\n\n  /**\n   * Removes a listener that gets invoked when indicator position changes.\n   *\n   * @param listener Listener that gets invoked when indicator position changes.\n   */\n  fun removeOnIndicatorPositionChangedListener(listener: OnIndicatorPositionChangedListener)\n\n  /**\n   * Adds a listener that gets invoked when indicator bearing changes.\n   *\n   * @param listener Listener that gets invoked when indicator bearing changes\n   */\n  fun addOnIndicatorBearingChangedListener(listener: OnIndicatorBearingChangedListener)\n\n  /**\n   * Removes a listener that gets invoked when indicator bearing changes.\n   *\n   * @param listener Listener that gets invoked when indicator bearing changes.\n   */\n  fun removeOnIndicatorBearingChangedListener(listener: OnIndicatorBearingChangedListener)\n\n  /**\n   * Check whether the rendered location puck is on the given point.\n   *\n   * @param point the point to validate\n   * @param listener Listener that gets invoked when the validation finished.\n   */\n  fun isLocatedAt(point: Point, listener: PuckLocatedAtPointListener)\n\n  /**\n   * Adds a listener that gets invoked when indicator accuracy radius changes.\n   *\n   * @param listener Listener that gets invoked when indicator accuracy radius changes\n   */\n  fun addOnIndicatorAccuracyRadiusChangedListener(listener: OnIndicatorAccuracyRadiusChangedListener)\n\n  /**\n   * Removes a listener that gets invoked when indicator accuracy radius changes.\n   *\n   * @param listener Listener that gets invoked when indicator accuracy radius changes.\n   */\n  fun removeOnIndicatorAccuracyRadiusChangedListener(listener: OnIndicatorAccuracyRadiusChangedListener)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationConsumer.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport android.animation.ValueAnimator\nimport com.mapbox.common.location.LocationError\nimport com.mapbox.geojson.Point\n\n/**\n * Defines the interface for LocationConsumer.\n */\ninterface LocationConsumer {\n\n  /**\n   * Called whenever the location is updated.\n   * @param location supports multiple points to create more complex animations with intermediate points.\n   *  Last [location] value will always be the animator target for next animation.\n   * @param options if specified explicitly will apply current animator option to single location update animation.\n   *  Otherwise default animator options will be used.\n   */\n  fun onLocationUpdated(vararg location: Point, options: (ValueAnimator.() -> Unit)? = null)\n\n  /**\n   * Called whenever the bearing is updated.\n   * @param bearing supports multiple bearing values to create more complex animations with intermediate points.\n   *  Last [bearing] value will always be the animator target for next animation.\n   * @param options if specified explicitly will apply current animator option to single location bearing animation.\n   *  Otherwise default animator options will be used.\n   */\n  fun onBearingUpdated(vararg bearing: Double, options: (ValueAnimator.() -> Unit)? = null)\n\n  /**\n   * Update [ValueAnimator] options that will be used to animate between [Point] updates by default.\n   * This will apply to all upcoming updates.\n   */\n  fun onPuckLocationAnimatorDefaultOptionsUpdated(options: ValueAnimator.() -> Unit)\n\n  /**\n   * Update [ValueAnimator] options that will be used to animate between bearing [Double] updates by default.\n   * This will apply to all upcoming updates.\n   */\n  fun onPuckBearingAnimatorDefaultOptionsUpdated(options: ValueAnimator.() -> Unit)\n\n  /**\n   * Called whenever the horizontal accuracy radius is updated.\n   * @param radius - supports multiple radius value to create more complex animations with intermediate points.\n   *  Last [radius] value will always be the animator target for next animation.\n   * @param options - if specified explicitly will apply current animator option to radius animation.\n   *  Otherwise default animator options will be used.\n   */\n  fun onHorizontalAccuracyRadiusUpdated(\n    vararg radius: Double,\n    options: (ValueAnimator.() -> Unit)? = null\n  )\n\n  /**\n   * Update [ValueAnimator] options that will be used to animate between accuracy radius [Double] updates by default.\n   * This will apply to all upcoming updates.\n   */\n  fun onPuckAccuracyRadiusAnimatorDefaultOptionsUpdated(options: ValueAnimator.() -> Unit)\n\n  /**\n   * Called whenever there is an error.\n   * @param error The actual error\n   */\n  fun onError(error: LocationError)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/LocationProvider.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\n/**\n * Defines the interface for Location Provider.\n */\ninterface LocationProvider {\n  /**\n   * Register the location consumer to the Location Provider.\n   *\n   * The Location Consumer will get location and bearing updates from the Location Provider.\n   *\n   * @param locationConsumer\n   */\n  fun registerLocationConsumer(locationConsumer: LocationConsumer)\n\n  /**\n   * Unregister the location consumer from the Location Provider.\n   *\n   * @param locationConsumer\n   */\n  fun unRegisterLocationConsumer(locationConsumer: LocationConsumer)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/OnIndicatorAccuracyRadiusChangedListener.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\n/**\n * Listener that gets invoked when indicator accuracy radius changes.\n */\nfun interface OnIndicatorAccuracyRadiusChangedListener {\n  /**\n   * This method is called on each accuracy radius change of the location indicator, including each animation frame.\n   *\n   * @param radius indicator's accuracy radius\n   */\n  fun onIndicatorAccuracyRadiusChanged(radius: Double)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/OnIndicatorBearingChangedListener.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\n/**\n * Listener that gets invoked when indicator bearing changes.\n */\nfun interface OnIndicatorBearingChangedListener {\n  /**\n   * This method is called on each bearing change of the location indicator, including each animation frame.\n   *\n   * @param bearing indicator's bearing\n   */\n  fun onIndicatorBearingChanged(bearing: Double)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/OnIndicatorPositionChangedListener.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\nimport com.mapbox.geojson.Point\n\n/**\n * Listener that gets invoked when indicator position changes.\n */\nfun interface OnIndicatorPositionChangedListener {\n  /**\n   * This method is called on each position change of the location indicator, including each animation frame.\n   *\n   * @param point indicator's position\n   */\n  fun onIndicatorPositionChanged(point: Point)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/PuckLocatedAtPointListener.kt",
    "content": "package com.mapbox.maps.plugin.locationcomponent\n\n/**\n * Listener that gets invoked when the is location puck rendered on point validation finished.\n */\nfun interface PuckLocatedAtPointListener {\n  /**\n   * This method is called when the is location puck rendered on point validation finished.\n   *\n   * @param isPuckLocatedAtPoint true if the given point is on the rendered location puck, false otherwise.\n   */\n  fun onResult(isPuckLocatedAtPoint: Boolean)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsBase.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.locationcomponent.generated\n\nimport com.mapbox.maps.plugin.LocationPuck\nimport com.mapbox.maps.plugin.PuckBearing\n\n/**\n * Abstract settings class for LocationComponentPlugin.\n *\n * This abstract class exposes all the required public APIs to configure the LocationComponentPlugin.\n */\nabstract class LocationComponentSettingsBase : LocationComponentSettingsInterface {\n  /**\n   * Shows a location puck on the map.\n   */\n  protected abstract var internalSettings: LocationComponentSettings\n\n  /**\n   * Apply the changes to the LocationComponentSettings to the LocationComponentPlugin.\n   */\n  protected abstract fun applySettings()\n\n  /**\n   * Get current locationcomponent configuration.\n   *\n   * @return locationcomponent settings\n   */\n  override fun getSettings(): LocationComponentSettings {\n    return internalSettings.toBuilder().build()\n  }\n\n  /**\n   * Update locationcomponent configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of LocationComponentSettings\n   */\n  override fun updateSettings(block: LocationComponentSettings.Builder.() -> Unit) {\n    val newSettings = this.internalSettings.toBuilder().apply(block).build()\n    // Trigger the enabled setter to ensure custom logic (e.g., listener management) is executed\n    this.enabled = newSettings.enabled\n    this.internalSettings = newSettings\n    applySettings()\n  }\n\n  /**\n   * Whether the user location is visible on the map. Default value: false.\n   */\n  override var enabled: Boolean\n    get() {\n      return this.internalSettings.enabled\n    }\n    set(value) {\n      if (this.internalSettings.enabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the location puck is pulsing on the map. Works for 2D location puck only. Default value: false.\n   */\n  override var pulsingEnabled: Boolean\n    get() {\n      return this.internalSettings.pulsingEnabled\n    }\n    set(value) {\n      if (this.internalSettings.pulsingEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPulsingEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The color of the pulsing circle. Works for 2D location puck only. Default value: \"#4A90E2\".\n   */\n  override var pulsingColor: Int\n    get() {\n      return this.internalSettings.pulsingColor\n    }\n    set(value) {\n      if (this.internalSettings.pulsingColor != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPulsingColor(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The maximum radius of the pulsing circle. Works for 2D location puck only. Note: Setting [pulsingMaxRadius] to LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY will set the pulsing circle's maximum radius to follow location accuracy circle. Default value: 10.\n   */\n  override var pulsingMaxRadius: Float\n    get() {\n      return this.internalSettings.pulsingMaxRadius\n    }\n    set(value) {\n      if (this.internalSettings.pulsingMaxRadius != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPulsingMaxRadius(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether show accuracy ring with location puck. Works for 2D location puck only. Default value: false.\n   */\n  override var showAccuracyRing: Boolean\n    get() {\n      return this.internalSettings.showAccuracyRing\n    }\n    set(value) {\n      if (this.internalSettings.showAccuracyRing != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setShowAccuracyRing(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The color of the accuracy ring. Works for 2D location puck only. Default value: \"#4d89cff0\".\n   */\n  override var accuracyRingColor: Int\n    get() {\n      return this.internalSettings.accuracyRingColor\n    }\n    set(value) {\n      if (this.internalSettings.accuracyRingColor != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setAccuracyRingColor(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The color of the accuracy ring border. Works for 2D location puck only. Default value: \"#4d89cff0\".\n   */\n  override var accuracyRingBorderColor: Int\n    get() {\n      return this.internalSettings.accuracyRingBorderColor\n    }\n    set(value) {\n      if (this.internalSettings.accuracyRingBorderColor != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setAccuracyRingBorderColor(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Sets the id of the layer that's added above to when placing the component on the map.\n   */\n  override var layerAbove: String?\n    get() {\n      return this.internalSettings.layerAbove\n    }\n    set(value) {\n      if (this.internalSettings.layerAbove != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setLayerAbove(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Sets the id of the layer that's added below to when placing the component on the map.\n   */\n  override var layerBelow: String?\n    get() {\n      return this.internalSettings.layerBelow\n    }\n    set(value) {\n      if (this.internalSettings.layerBelow != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setLayerBelow(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the puck rotates to track the bearing source. Default value: false.\n   */\n  override var puckBearingEnabled: Boolean\n    get() {\n      return this.internalSettings.puckBearingEnabled\n    }\n    set(value) {\n      if (this.internalSettings.puckBearingEnabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPuckBearingEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The enum controls how the puck is oriented Default value: \"heading\".\n   */\n  override var puckBearing: PuckBearing\n    get() {\n      return this.internalSettings.puckBearing\n    }\n    set(value) {\n      if (this.internalSettings.puckBearing != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPuckBearing(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists, it will be placed at that position in the layer order.\n   */\n  override var slot: String?\n    get() {\n      return this.internalSettings.slot\n    }\n    set(value) {\n      if (this.internalSettings.slot != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setSlot(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines what the customised look of the location puck. Note that direct changes to the puck variables won't have any effect, a new puck needs to be set every time.\n   */\n  override var locationPuck: LocationPuck\n    get() {\n      return this.internalSettings.locationPuck\n    }\n    set(value) {\n      if (this.internalSettings.locationPuck != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setLocationPuck(value).build()\n        applySettings()\n      }\n    }\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsData.kt",
    "content": "// This file is generated.\n// This class is annotated with `DataCompat`.\n// Therefore, it is used to auto-generate `LocationComponentSettings`.\n\npackage com.mapbox.maps.plugin.locationcomponent.generated\n\nimport android.os.Parcelable\nimport com.mapbox.maps.plugin.LocationPuck\nimport com.mapbox.maps.plugin.PuckBearing\nimport com.tobrun.datacompat.annotation.DataCompat\nimport com.tobrun.datacompat.annotation.Default\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Shows a location puck on the map.\n */\n@Parcelize\n@DataCompat(\n    importsForDefaults = [\n        \"android.graphics.Color\",\n    ]\n)\nprivate data class LocationComponentSettingsData(\n\n  /**\n   * Whether the user location is visible on the map. Default value: false.\n   */\n  @Default(\"false\")\n  var enabled: Boolean,\n\n  /**\n   * Whether the location puck is pulsing on the map. Works for 2D location puck only. Default value: false.\n   */\n  @Default(\"false\")\n  var pulsingEnabled: Boolean,\n\n  /**\n   * The color of the pulsing circle. Works for 2D location puck only. Default value: \"#4A90E2\".\n   */\n  @Default(\"Color.parseColor(\\\"#4A90E2\\\")\")\n  var pulsingColor: Int,\n\n  /**\n   * The maximum radius of the pulsing circle. Works for 2D location puck only. Note: Setting [pulsingMaxRadius] to LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY will set the pulsing circle's maximum radius to follow location accuracy circle. Default value: 10. This property is specified in pixels.\n   */\n  @Default(\"10f\")\n  var pulsingMaxRadius: Float,\n\n  /**\n   * Whether show accuracy ring with location puck. Works for 2D location puck only. Default value: false.\n   */\n  @Default(\"false\")\n  var showAccuracyRing: Boolean,\n\n  /**\n   * The color of the accuracy ring. Works for 2D location puck only. Default value: \"#4d89cff0\".\n   */\n  @Default(\"Color.parseColor(\\\"#4d89cff0\\\")\")\n  var accuracyRingColor: Int,\n\n  /**\n   * The color of the accuracy ring border. Works for 2D location puck only. Default value: \"#4d89cff0\".\n   */\n  @Default(\"Color.parseColor(\\\"#4d89cff0\\\")\")\n  var accuracyRingBorderColor: Int,\n\n  /**\n   * Sets the id of the layer that's added above to when placing the component on the map.\n   */\n  var layerAbove: String? = null,\n\n  /**\n   * Sets the id of the layer that's added below to when placing the component on the map.\n   */\n  var layerBelow: String? = null,\n\n  /**\n   * Whether the puck rotates to track the bearing source. Default value: false.\n   */\n  @Default(\"false\")\n  var puckBearingEnabled: Boolean,\n\n  /**\n   * The enum controls how the puck is oriented Default value: \"heading\".\n   */\n  @Default(\"PuckBearing.HEADING\")\n  var puckBearing: PuckBearing,\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists, it will be placed at that position in the layer order.\n   */\n  var slot: String? = null,\n\n  /**\n   * Defines what the customised look of the location puck. Note that direct changes to the puck variables won't have any effect, a new puck needs to be set every time.\n   */\n  var locationPuck: LocationPuck,\n) : Parcelable\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettingsInterface.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.locationcomponent.generated\n\nimport com.mapbox.maps.plugin.LocationPuck\nimport com.mapbox.maps.plugin.PuckBearing\n\n/**\n * Interface that defines the public settings interface for LocationComponentPlugin.\n */\ninterface LocationComponentSettingsInterface {\n  /**\n   * Get current locationcomponent configuration.\n   *\n   * @return locationcomponent settings\n   */\n  fun getSettings(): LocationComponentSettings\n\n  /**\n   * Update locationcomponent configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of LocationComponentSettings\n   */\n  fun updateSettings(block: LocationComponentSettings.Builder.() -> Unit)\n\n  /**\n   * Whether the user location is visible on the map. Default value: false.\n   */\n  var enabled: Boolean\n\n  /**\n   * Whether the location puck is pulsing on the map. Works for 2D location puck only. Default value: false.\n   */\n  var pulsingEnabled: Boolean\n\n  /**\n   * The color of the pulsing circle. Works for 2D location puck only. Default value: \"#4A90E2\".\n   */\n  var pulsingColor: Int\n\n  /**\n   * The maximum radius of the pulsing circle. Works for 2D location puck only. Note: Setting [pulsingMaxRadius] to LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY will set the pulsing circle's maximum radius to follow location accuracy circle. Default value: 10.\n   */\n  var pulsingMaxRadius: Float\n\n  /**\n   * Whether show accuracy ring with location puck. Works for 2D location puck only. Default value: false.\n   */\n  var showAccuracyRing: Boolean\n\n  /**\n   * The color of the accuracy ring. Works for 2D location puck only. Default value: \"#4d89cff0\".\n   */\n  var accuracyRingColor: Int\n\n  /**\n   * The color of the accuracy ring border. Works for 2D location puck only. Default value: \"#4d89cff0\".\n   */\n  var accuracyRingBorderColor: Int\n\n  /**\n   * Sets the id of the layer that's added above to when placing the component on the map.\n   */\n  var layerAbove: String?\n\n  /**\n   * Sets the id of the layer that's added below to when placing the component on the map.\n   */\n  var layerBelow: String?\n\n  /**\n   * Whether the puck rotates to track the bearing source. Default value: false.\n   */\n  var puckBearingEnabled: Boolean\n\n  /**\n   * The enum controls how the puck is oriented Default value: \"heading\".\n   */\n  var puckBearing: PuckBearing\n\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists, it will be placed at that position in the layer order.\n   */\n  var slot: String?\n\n  /**\n   * Defines what the customised look of the location puck. Note that direct changes to the puck variables won't have any effect, a new puck needs to be set every time.\n   */\n  var locationPuck: LocationPuck\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/logo/LogoPlugin.kt",
    "content": "package com.mapbox.maps.plugin.logo\n\nimport com.mapbox.maps.plugin.ViewPlugin\nimport com.mapbox.maps.plugin.logo.generated.LogoSettingsInterface\n\n/**\n * Presenter interface for the logo.\n */\ninterface LogoPlugin : ViewPlugin, LogoSettingsInterface"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/logo/LogoView.kt",
    "content": "package com.mapbox.maps.plugin.logo\n\nimport androidx.annotation.Px\n\n/**\n * Interface for logo view.\n *\n * The logo view implementation class should implement both the\n * LogoView interface and a View class (e.g ImageView).\n */\ninterface LogoView {\n  /**\n   * Whether the logo view is enabled.\n   */\n  var logoEnabled: Boolean\n\n  /**\n   * Returns the gravity value of the logo view.\n   */\n  var logoGravity: Int\n\n  /**\n   * Set the margins of the logo view.\n   *\n   * @param left Margin to the left in pixel\n   * @param top Margin to the top in pixel\n   * @param right Margin to the right in pixel\n   * @param bottom Margin to the bottom in pixel\n   */\n  fun setLogoMargins(@Px left: Int, @Px top: Int, @Px right: Int, @Px bottom: Int)\n\n  /**\n   * Call this when something has changed which has invalidated the\n   * layout of this view. This will schedule a layout pass of the view\n   * tree.\n   */\n  fun requestLayout()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/logo/generated/LogoSettingsBase.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.logo.generated\n\n/**\n * Abstract settings class for LogoPlugin.\n *\n * This abstract class exposes all the required public APIs to configure the LogoPlugin.\n */\nabstract class LogoSettingsBase : LogoSettingsInterface {\n  /**\n   * Shows the Mapbox logo on the map.\n   */\n  protected abstract var internalSettings: LogoSettings\n\n  /**\n   * Apply the changes to the LogoSettings to the LogoPlugin.\n   */\n  protected abstract fun applySettings()\n\n  /**\n   * Get current logo configuration.\n   *\n   * @return logo settings\n   */\n  override fun getSettings(): LogoSettings {\n    return internalSettings.toBuilder().build()\n  }\n\n  /**\n   * Update logo configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of LogoSettings\n   */\n  override fun updateSettings(block: LogoSettings.Builder.() -> Unit) {\n    val newSettings = this.internalSettings.toBuilder().apply(block).build()\n    // Trigger the enabled setter to ensure custom logic (e.g., listener management) is executed\n    this.enabled = newSettings.enabled\n    this.internalSettings = newSettings\n    applySettings()\n  }\n\n  /**\n   * Whether the logo is visible on the map. Default value: true.\n   */\n  override var enabled: Boolean\n    get() {\n      return this.internalSettings.enabled\n    }\n    set(value) {\n      if (this.internalSettings.enabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines where the logo is positioned on the map Default value: \"bottom-left\".\n   */\n  override var position: Int\n    get() {\n      return this.internalSettings.position\n    }\n    set(value) {\n      if (this.internalSettings.position != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPosition(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the left that the attribution icon honors. Default value: 4.\n   */\n  override var marginLeft: Float\n    get() {\n      return this.internalSettings.marginLeft\n    }\n    set(value) {\n      if (this.internalSettings.marginLeft != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginLeft(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the top that the attribution icon honors. Default value: 4.\n   */\n  override var marginTop: Float\n    get() {\n      return this.internalSettings.marginTop\n    }\n    set(value) {\n      if (this.internalSettings.marginTop != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginTop(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the right that the attribution icon honors. Default value: 4.\n   */\n  override var marginRight: Float\n    get() {\n      return this.internalSettings.marginRight\n    }\n    set(value) {\n      if (this.internalSettings.marginRight != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginRight(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the bottom that the attribution icon honors. Default value: 4.\n   */\n  override var marginBottom: Float\n    get() {\n      return this.internalSettings.marginBottom\n    }\n    set(value) {\n      if (this.internalSettings.marginBottom != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginBottom(value).build()\n        applySettings()\n      }\n    }\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/logo/generated/LogoSettingsData.kt",
    "content": "// This file is generated.\n// This class is annotated with `DataCompat`.\n// Therefore, it is used to auto-generate `LogoSettings`.\n\npackage com.mapbox.maps.plugin.logo.generated\n\nimport android.os.Parcelable\nimport com.tobrun.datacompat.annotation.DataCompat\nimport com.tobrun.datacompat.annotation.Default\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Shows the Mapbox logo on the map.\n */\n@Parcelize\n@DataCompat(\n    importsForDefaults = [\n        \"android.view.Gravity\",\n    ]\n)\nprivate data class LogoSettingsData(\n\n  /**\n   * Whether the logo is visible on the map. Default value: true.\n   */\n  @Default(\"true\")\n  var enabled: Boolean,\n\n  /**\n   * Defines where the logo is positioned on the map Default value: \"bottom-left\".\n   */\n  @Default(\"Gravity.BOTTOM or Gravity.START\")\n  var position: Int,\n\n  /**\n   * Defines the margin to the left that the attribution icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginLeft: Float,\n\n  /**\n   * Defines the margin to the top that the attribution icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginTop: Float,\n\n  /**\n   * Defines the margin to the right that the attribution icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginRight: Float,\n\n  /**\n   * Defines the margin to the bottom that the attribution icon honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginBottom: Float,\n) : Parcelable\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/logo/generated/LogoSettingsInterface.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.logo.generated\n\n/**\n * Interface that defines the public settings interface for LogoPlugin.\n */\ninterface LogoSettingsInterface {\n  /**\n   * Get current logo configuration.\n   *\n   * @return logo settings\n   */\n  fun getSettings(): LogoSettings\n\n  /**\n   * Update logo configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of LogoSettings\n   */\n  fun updateSettings(block: LogoSettings.Builder.() -> Unit)\n\n  /**\n   * Whether the logo is visible on the map. Default value: true.\n   */\n  var enabled: Boolean\n\n  /**\n   * Defines where the logo is positioned on the map Default value: \"bottom-left\".\n   */\n  var position: Int\n\n  /**\n   * Defines the margin to the left that the attribution icon honors. Default value: 4.\n   */\n  var marginLeft: Float\n\n  /**\n   * Defines the margin to the top that the attribution icon honors. Default value: 4.\n   */\n  var marginTop: Float\n\n  /**\n   * Defines the margin to the right that the attribution icon honors. Default value: 4.\n   */\n  var marginRight: Float\n\n  /**\n   * Defines the margin to the bottom that the attribution icon honors. Default value: 4.\n   */\n  var marginBottom: Float\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/overlay/MapOverlayCoordinatesProvider.kt",
    "content": "package com.mapbox.maps.plugin.overlay\n\nimport com.mapbox.geojson.Point\n\n/**\n * Interface that should be implemented by users to provide all the coordinates that will shown\n * on MapView without covered by overlays.\n */\nfun interface MapOverlayCoordinatesProvider {\n  /**\n   * Get all the coordinates that will shown on MapView\n   * @return return the shown coordinates\n   */\n  fun getShownCoordinates(): List<Point>\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/overlay/MapOverlayPlugin.kt",
    "content": "package com.mapbox.maps.plugin.overlay\n\nimport android.view.View\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.MapSizePlugin\n\n/**\n * Interface for MapOverlay Container that manage MapOverlays.\n */\ninterface MapOverlayPlugin : MapSizePlugin, MapPlugin {\n  /**\n   * To register a [MapOverlayCoordinatesProvider] instance to the Container\n   */\n  fun registerMapOverlayCoordinatesProvider(provider: MapOverlayCoordinatesProvider)\n\n  /**\n   * Unregister the [MapOverlayCoordinatesProvider].\n   */\n  fun unregisterMapOverlayCoordinatesProvider()\n\n  /**\n   * Register a view as overlay.\n   * @param overlay the registered overlay view\n   */\n  fun registerOverlay(overlay: View)\n\n  /**\n   * Register views as overlays\n   * @param overlays the registered overlay view\n   */\n  fun registerOverlays(overlays: List<View>)\n\n  /**\n   * Unregister a view.\n   * @param overlay the unregistered overlay view\n   */\n  fun unregisterOverlay(overlay: View)\n\n  /**\n   * Unregister views.\n   * @param overlays the unregistered overlay views\n   */\n  fun unregisterOverlays(overlays: List<View>)\n\n  /**\n   * Set the margins for the area that is displaying POIs within the overlay bounds.\n   * These margins provide offsets to ensure POIs near the border of the overlay not be hidden or covered.\n   * @param marginTop the margin on the top, in pixel\n   * @param marginLeft the margin on the left, in pixel\n   * @param marginBottom the margin on the bottom, in pixel\n   * @param marginRight the margin on the right, in pixel\n   */\n  fun setDisplayingAreaMargins(marginTop: Int, marginLeft: Int, marginBottom: Int, marginRight: Int)\n\n  /**\n   * Reframe MapView to a certain zoom and position to make sure every coordinate will be shown\n   * on the MapView and not be covered by registered MapOverlays.\n   * If no [OnReframeFinished] object is provided, MapView will jump to the new [CameraOptions] directly;\n   * if [OnReframeFinished] object is provided, the new [CameraOptions] will be return and users can define their\n   * own animation to move the camera.\n   *\n   * @param onReframeFinished the listener to get the CameraOptions\n   */\n  fun reframe(onReframeFinished: OnReframeFinished? = null)\n\n  /**\n   * Get an EdgeInsets that represent the width and height of overlays\n   *\n   * @return the EdgeInsets\n   */\n  fun getEdgeInsets(): EdgeInsets\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/overlay/OnReframeFinished.kt",
    "content": "package com.mapbox.maps.plugin.overlay\n\nimport com.mapbox.maps.CameraOptions\n\n/**\n * Interface invoked after reframe calculations are finished which provides valid [CameraOptions] object\n */\nfun interface OnReframeFinished {\n  /**\n   * Callback method to return the [CameraOptions] object.\n   * @param cameraOptions the [CameraOptions] that refame operation will apply.\n   */\n  fun onReframeFinished(cameraOptions: CameraOptions?)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/scalebar/ScaleBar.kt",
    "content": "package com.mapbox.maps.plugin.scalebar\n\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings\n\n/**\n * Interface for ScaleBar.\n *\n */\ninterface ScaleBar {\n  /**\n   * How many meters in each pixel.\n   */\n  var distancePerPixel: Float\n  /**\n   * Defines whether ScaleBar is enabled or disabled.\n   */\n  var enable: Boolean\n\n  /**\n   * Defines settings fo ScaleBar\n   */\n  var settings: ScaleBarSettings\n\n  /**\n   * Defines the width of mapView\n   */\n  var mapViewWidth: Float\n\n  /**\n   * Defines the pixel ratio in the current display.\n   */\n  var pixelRatio: Float\n\n  /**\n   * If set to True scale bar will be triggering onDraw depending on [ScaleBarSettings.refreshInterval]\n   * even if actual data did not change. If set to False scale bar will redraw only on demand.\n   *\n   * Defaults to False and should not be changed explicitly in most cases.\n   * Could be set to True to produce correct GPU frame metrics when running gfxinfo command.\n   */\n  var useContinuousRendering: Boolean\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/scalebar/ScaleBarPlugin.kt",
    "content": "package com.mapbox.maps.plugin.scalebar\n\nimport com.mapbox.maps.plugin.MapSizePlugin\nimport com.mapbox.maps.plugin.ViewPlugin\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettingsInterface\n\n/**\n * Presenter interface for the ScaleBar.\n */\ninterface ScaleBarPlugin : ViewPlugin, MapSizePlugin, ScaleBarSettingsInterface {\n  /**\n   * How many meters in each pixel.\n   */\n  var distancePerPixel: Float\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsBase.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.scalebar.generated\n\nimport com.mapbox.maps.plugin.DistanceUnits\n\n/**\n * Abstract settings class for ScaleBarPlugin.\n *\n * This abstract class exposes all the required public APIs to configure the ScaleBarPlugin.\n */\nabstract class ScaleBarSettingsBase : ScaleBarSettingsInterface {\n  /**\n   * Shows the scale bar on the map.\n   */\n  protected abstract var internalSettings: ScaleBarSettings\n\n  /**\n   * Apply the changes to the ScaleBarSettings to the ScaleBarPlugin.\n   */\n  protected abstract fun applySettings()\n\n  /**\n   * Get current scalebar configuration.\n   *\n   * @return scalebar settings\n   */\n  override fun getSettings(): ScaleBarSettings {\n    return internalSettings.toBuilder().build()\n  }\n\n  /**\n   * Update scalebar configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of ScaleBarSettings\n   */\n  override fun updateSettings(block: ScaleBarSettings.Builder.() -> Unit) {\n    val newSettings = this.internalSettings.toBuilder().apply(block).build()\n    // Trigger the enabled setter to ensure custom logic (e.g., listener management) is executed\n    this.enabled = newSettings.enabled\n    this.internalSettings = newSettings\n    applySettings()\n  }\n\n  /**\n   * Whether the scale is visible on the map. Default value: true.\n   */\n  override var enabled: Boolean\n    get() {\n      return this.internalSettings.enabled\n    }\n    set(value) {\n      if (this.internalSettings.enabled != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setEnabled(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines where the scale bar is positioned on the map Default value: \"top-left\".\n   */\n  override var position: Int\n    get() {\n      return this.internalSettings.position\n    }\n    set(value) {\n      if (this.internalSettings.position != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPosition(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the left that the scale bar honors. Default value: 4.\n   */\n  override var marginLeft: Float\n    get() {\n      return this.internalSettings.marginLeft\n    }\n    set(value) {\n      if (this.internalSettings.marginLeft != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginLeft(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the top that the scale bar honors. Default value: 4.\n   */\n  override var marginTop: Float\n    get() {\n      return this.internalSettings.marginTop\n    }\n    set(value) {\n      if (this.internalSettings.marginTop != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginTop(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the right that the scale bar honors. Default value: 4.\n   */\n  override var marginRight: Float\n    get() {\n      return this.internalSettings.marginRight\n    }\n    set(value) {\n      if (this.internalSettings.marginRight != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginRight(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines the margin to the bottom that the scale bar honors. Default value: 4.\n   */\n  override var marginBottom: Float\n    get() {\n      return this.internalSettings.marginBottom\n    }\n    set(value) {\n      if (this.internalSettings.marginBottom != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setMarginBottom(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines text color of the scale bar. Default value: \"black\".\n   */\n  override var textColor: Int\n    get() {\n      return this.internalSettings.textColor\n    }\n    set(value) {\n      if (this.internalSettings.textColor != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setTextColor(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines primary color of the scale bar. Default value: \"black\".\n   */\n  override var primaryColor: Int\n    get() {\n      return this.internalSettings.primaryColor\n    }\n    set(value) {\n      if (this.internalSettings.primaryColor != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setPrimaryColor(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines secondary color of the scale bar. Default value: \"white\".\n   */\n  override var secondaryColor: Int\n    get() {\n      return this.internalSettings.secondaryColor\n    }\n    set(value) {\n      if (this.internalSettings.secondaryColor != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setSecondaryColor(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines width of the border for the scale bar. Default value: 2.\n   */\n  override var borderWidth: Float\n    get() {\n      return this.internalSettings.borderWidth\n    }\n    set(value) {\n      if (this.internalSettings.borderWidth != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setBorderWidth(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines height of the scale bar. Default value: 2.\n   */\n  override var height: Float\n    get() {\n      return this.internalSettings.height\n    }\n    set(value) {\n      if (this.internalSettings.height != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setHeight(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines margin of the text bar of the scale bar. Default value: 8.\n   */\n  override var textBarMargin: Float\n    get() {\n      return this.internalSettings.textBarMargin\n    }\n    set(value) {\n      if (this.internalSettings.textBarMargin != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setTextBarMargin(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines text border width of the scale bar. Default value: 2.\n   */\n  override var textBorderWidth: Float\n    get() {\n      return this.internalSettings.textBorderWidth\n    }\n    set(value) {\n      if (this.internalSettings.textBorderWidth != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setTextBorderWidth(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Defines text size of the scale bar. Default value: 8.\n   */\n  override var textSize: Float\n    get() {\n      return this.internalSettings.textSize\n    }\n    set(value) {\n      if (this.internalSettings.textSize != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setTextSize(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Whether the scale bar is using metric unit. True if the scale bar is using metric system, false if the scale bar is using imperial units. Default value: true.\n   */\n  @Deprecated(message = \"Use distanceUnits instead.\")\n  override var isMetricUnits: Boolean\n    get() {\n      return this.internalSettings.isMetricUnits\n    }\n    set(value) {\n      if (this.internalSettings.isMetricUnits != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setIsMetricUnits(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Supported distance unit types. Default value: \"metric\".\n   */\n  override var distanceUnits: DistanceUnits\n    get() {\n      return this.internalSettings.distanceUnits\n    }\n    set(value) {\n      if (this.internalSettings.distanceUnits != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setDistanceUnits(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Configures minimum refresh interval, in millisecond, default is 15. Default value: 15.\n   */\n  override var refreshInterval: Long\n    get() {\n      return this.internalSettings.refreshInterval\n    }\n    set(value) {\n      if (this.internalSettings.refreshInterval != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setRefreshInterval(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * Configures whether to show the text border or not, default is true. Default value: true.\n   */\n  override var showTextBorder: Boolean\n    get() {\n      return this.internalSettings.showTextBorder\n    }\n    set(value) {\n      if (this.internalSettings.showTextBorder != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setShowTextBorder(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * configures ratio of scale bar max width compared with MapView width, default is 0.5. Default value: 0.5.\n   */\n  override var ratio: Float\n    get() {\n      return this.internalSettings.ratio\n    }\n    set(value) {\n      if (this.internalSettings.ratio != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setRatio(value).build()\n        applySettings()\n      }\n    }\n\n  /**\n   * If set to True scale bar will be triggering onDraw depending on [ScaleBarSettings.refreshInterval] even if actual data did not change. If set to False scale bar will redraw only on demand. Defaults to False and should not be changed explicitly in most cases. Could be set to True to produce correct GPU frame metrics when running gfxinfo command. Default value: false.\n   */\n  override var useContinuousRendering: Boolean\n    get() {\n      return this.internalSettings.useContinuousRendering\n    }\n    set(value) {\n      if (this.internalSettings.useContinuousRendering != value) {\n        this.internalSettings = this.internalSettings.toBuilder().setUseContinuousRendering(value).build()\n        applySettings()\n      }\n    }\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsData.kt",
    "content": "// This file is generated.\n// This class is annotated with `DataCompat`.\n// Therefore, it is used to auto-generate `ScaleBarSettings`.\n\npackage com.mapbox.maps.plugin.scalebar.generated\n\nimport android.os.Parcelable\nimport com.mapbox.maps.plugin.DistanceUnits\nimport com.tobrun.datacompat.annotation.DataCompat\nimport com.tobrun.datacompat.annotation.Default\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Shows the scale bar on the map.\n */\n@Parcelize\n@DataCompat(\n    importsForDefaults = [\n        \"android.graphics.Color\",\n        \"android.view.Gravity\",\n    ]\n)\nprivate data class ScaleBarSettingsData(\n\n  /**\n   * Whether the scale is visible on the map. Default value: true.\n   */\n  @Default(\"true\")\n  var enabled: Boolean,\n\n  /**\n   * Defines where the scale bar is positioned on the map Default value: \"top-left\".\n   */\n  @Default(\"Gravity.TOP or Gravity.START\")\n  var position: Int,\n\n  /**\n   * Defines the margin to the left that the scale bar honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginLeft: Float,\n\n  /**\n   * Defines the margin to the top that the scale bar honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginTop: Float,\n\n  /**\n   * Defines the margin to the right that the scale bar honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginRight: Float,\n\n  /**\n   * Defines the margin to the bottom that the scale bar honors. Default value: 4. This property is specified in pixels.\n   */\n  @Default(\"4f\")\n  var marginBottom: Float,\n\n  /**\n   * Defines text color of the scale bar. Default value: \"black\".\n   */\n  @Default(\"Color.BLACK\")\n  var textColor: Int,\n\n  /**\n   * Defines primary color of the scale bar. Default value: \"black\".\n   */\n  @Default(\"Color.BLACK\")\n  var primaryColor: Int,\n\n  /**\n   * Defines secondary color of the scale bar. Default value: \"white\".\n   */\n  @Default(\"Color.WHITE\")\n  var secondaryColor: Int,\n\n  /**\n   * Defines width of the border for the scale bar. Default value: 2. This property is specified in pixels.\n   */\n  @Default(\"2f\")\n  var borderWidth: Float,\n\n  /**\n   * Defines height of the scale bar. Default value: 2. This property is specified in pixels.\n   */\n  @Default(\"2f\")\n  var height: Float,\n\n  /**\n   * Defines margin of the text bar of the scale bar. Default value: 8. This property is specified in pixels.\n   */\n  @Default(\"8f\")\n  var textBarMargin: Float,\n\n  /**\n   * Defines text border width of the scale bar. Default value: 2. This property is specified in pixels.\n   */\n  @Default(\"2f\")\n  var textBorderWidth: Float,\n\n  /**\n   * Defines text size of the scale bar. Default value: 8. This property is specified in pixels.\n   */\n  @Default(\"8f\")\n  var textSize: Float,\n\n  /**\n   * Whether the scale bar is using metric unit. True if the scale bar is using metric system, false if the scale bar is using imperial units. Default value: true.\n   */\n  @Default(\"true\")\n  var isMetricUnits: Boolean,\n\n  /**\n   * Supported distance unit types. Default value: \"metric\".\n   */\n  @Default(\"DistanceUnits.METRIC\")\n  var distanceUnits: DistanceUnits,\n\n  /**\n   * Configures minimum refresh interval, in millisecond, default is 15. Default value: 15.\n   */\n  @Default(\"15\")\n  var refreshInterval: Long,\n\n  /**\n   * Configures whether to show the text border or not, default is true. Default value: true.\n   */\n  @Default(\"true\")\n  var showTextBorder: Boolean,\n\n  /**\n   * configures ratio of scale bar max width compared with MapView width, default is 0.5. Default value: 0.5.\n   */\n  @Default(\"0.5f\")\n  var ratio: Float,\n\n  /**\n   * If set to True scale bar will be triggering onDraw depending on [ScaleBarSettings.refreshInterval] even if actual data did not change. If set to False scale bar will redraw only on demand. Defaults to False and should not be changed explicitly in most cases. Could be set to True to produce correct GPU frame metrics when running gfxinfo command. Default value: false.\n   */\n  @Default(\"false\")\n  var useContinuousRendering: Boolean,\n) : Parcelable\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettingsInterface.kt",
    "content": "// This file is generated.\n\npackage com.mapbox.maps.plugin.scalebar.generated\n\nimport com.mapbox.maps.plugin.DistanceUnits\n\n/**\n * Interface that defines the public settings interface for ScaleBarPlugin.\n */\ninterface ScaleBarSettingsInterface {\n  /**\n   * Get current scalebar configuration.\n   *\n   * @return scalebar settings\n   */\n  fun getSettings(): ScaleBarSettings\n\n  /**\n   * Update scalebar configuration, the update will be applied to the plugin automatically.\n   *\n   * @param block the receiver function of ScaleBarSettings\n   */\n  fun updateSettings(block: ScaleBarSettings.Builder.() -> Unit)\n\n  /**\n   * Whether the scale is visible on the map. Default value: true.\n   */\n  var enabled: Boolean\n\n  /**\n   * Defines where the scale bar is positioned on the map Default value: \"top-left\".\n   */\n  var position: Int\n\n  /**\n   * Defines the margin to the left that the scale bar honors. Default value: 4.\n   */\n  var marginLeft: Float\n\n  /**\n   * Defines the margin to the top that the scale bar honors. Default value: 4.\n   */\n  var marginTop: Float\n\n  /**\n   * Defines the margin to the right that the scale bar honors. Default value: 4.\n   */\n  var marginRight: Float\n\n  /**\n   * Defines the margin to the bottom that the scale bar honors. Default value: 4.\n   */\n  var marginBottom: Float\n\n  /**\n   * Defines text color of the scale bar. Default value: \"black\".\n   */\n  var textColor: Int\n\n  /**\n   * Defines primary color of the scale bar. Default value: \"black\".\n   */\n  var primaryColor: Int\n\n  /**\n   * Defines secondary color of the scale bar. Default value: \"white\".\n   */\n  var secondaryColor: Int\n\n  /**\n   * Defines width of the border for the scale bar. Default value: 2.\n   */\n  var borderWidth: Float\n\n  /**\n   * Defines height of the scale bar. Default value: 2.\n   */\n  var height: Float\n\n  /**\n   * Defines margin of the text bar of the scale bar. Default value: 8.\n   */\n  var textBarMargin: Float\n\n  /**\n   * Defines text border width of the scale bar. Default value: 2.\n   */\n  var textBorderWidth: Float\n\n  /**\n   * Defines text size of the scale bar. Default value: 8.\n   */\n  var textSize: Float\n\n  /**\n   * Whether the scale bar is using metric unit. True if the scale bar is using metric system, false if the scale bar is using imperial units. Default value: true.\n   */\n  @Deprecated(message = \"Use distanceUnits instead.\")\n  var isMetricUnits: Boolean\n\n  /**\n   * Supported distance unit types. Default value: \"metric\".\n   */\n  var distanceUnits: DistanceUnits\n\n  /**\n   * Configures minimum refresh interval, in millisecond, default is 15. Default value: 15.\n   */\n  var refreshInterval: Long\n\n  /**\n   * Configures whether to show the text border or not, default is true. Default value: true.\n   */\n  var showTextBorder: Boolean\n\n  /**\n   * configures ratio of scale bar max width compared with MapView width, default is 0.5. Default value: 0.5.\n   */\n  var ratio: Float\n\n  /**\n   * If set to True scale bar will be triggering onDraw depending on [ScaleBarSettings.refreshInterval] even if actual data did not change. If set to False scale bar will redraw only on demand. Defaults to False and should not be changed explicitly in most cases. Could be set to True to produce correct GPU frame metrics when running gfxinfo command. Default value: false.\n   */\n  var useContinuousRendering: Boolean\n}\n\n// End of generated file."
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/CompletionListener.kt",
    "content": "package com.mapbox.maps.plugin.viewport\n\n/**\n * A listener that's notified when the action is completed.\n */\nfun interface CompletionListener {\n  /**\n   * Notifies the action is completed.\n   *\n   * Transition may end early if they fail or are interrupted(e.g. by another call to [ViewportPlugin.transitionTo]\n   * or [ViewportPlugin.idle]).\n   *\n   * @param isFinished true if the transition ran to completion and false\n   * if it was canceled or interrupted.\n   */\n  fun onComplete(isFinished: Boolean)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/ViewportConstants.kt",
    "content": "package com.mapbox.maps.plugin.viewport\n\n/**\n * The default maximum duration of the generated transitions set for the state transition options,\n * including delays between animators and their respective durations.\n */\nconst val DEFAULT_TRANSITION_MAX_DURATION_MS = 3500L\n\n/**\n * The default duration of the generated transitions set for the frame transition options.\n */\nconst val DEFAULT_STATE_ANIMATION_DURATION_MS = 1000L\n\n/**\n * The default pitch value for the follow puck viewport state.\n */\nconst val DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH = 45.0\n\n/**\n * The default zoom value for the follow puck viewport state.\n */\nconst val DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM = 16.35"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/ViewportPlugin.kt",
    "content": "package com.mapbox.maps.plugin.viewport\n\nimport com.mapbox.maps.plugin.MapPlugin\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.ViewportOptions\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState\nimport com.mapbox.maps.plugin.viewport.state.OverviewViewportState\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.plugin.viewport.transition.DefaultViewportTransition\nimport com.mapbox.maps.plugin.viewport.transition.ViewportTransition\n\n/**\n * The [ViewportPlugin] provides a structured approach to organizing camera management logic into states\n * and transitions between them.\n *\n * At any given time, the viewport is either:\n *  - idle (not updating the camera)\n *  - in a state (camera is being managed by a [ViewportState])\n *  - transitioning (camera is being managed by a [ViewportTransition])\n */\ninterface ViewportPlugin : MapPlugin {\n\n  /**\n   * Returns current [ViewportStatus].\n   *\n   * [ViewportStatus] can not be set directly, use [ViewportPlugin.transitionTo] and [ViewportPlugin.idle]\n   * to transition to a state or to idle.\n   *\n   * Defaults to [ViewportStatus.Idle]\n   *\n   * @see addStatusObserver\n   * @see removeStatusObserver\n   */\n  val status: ViewportStatus\n\n  /**\n   * Executes a transition to requested state.\n   *\n   * When called, the [status] goes to [ViewportTransition] and to the final [ViewportState] when ended.\n   *\n   * Transitioning to state 'x' when the current [status] is 'ViewportStatus.State(x)' invokes [completionListener]\n   * synchronously with true and does not modify [ViewportPlugin.status].\n   *\n   * Transitioning to state 'x' when the current [status] is 'ViewportStatus.Transition(_, x)' invokes\n   * [completionListener] synchronously with false and does not modify [ViewportPlugin.status].\n   *\n   * If transition is failed or canceled, [status] goes to [ViewportStatus.Idle].\n   *\n   * @param targetState The target [ViewportState] to transition to.\n   * @param transition The [ViewportTransition] that's used to transition to target state, if not specified, the [ViewportPlugin.defaultTransition] will be used. Defaults to null.\n   * @param completionListener The listener that's invoked when the transition ends, defaults to null.\n   */\n  fun transitionTo(targetState: ViewportState, transition: ViewportTransition? = null, completionListener: CompletionListener? = null)\n\n  /**\n   * Sets [ViewportPlugin.status] to [ViewportStatus.Idle] synchronously.\n   *\n   * This cancels any active [ViewportState] or [ViewportTransition].\n   */\n  fun idle()\n\n  /**\n   * Configuration options that impact the [ViewportPlugin].\n   */\n  var options: ViewportOptions\n\n  // Transitions\n\n  /**\n   * [ViewportPlugin.transitionTo] uses this transition unless some non-null value is passed to its\n   * transition argument.\n   *\n   * Defaults to [DefaultViewportTransition] with default options.\n   */\n  var defaultTransition: ViewportTransition\n\n  // Observers\n\n  /**\n   * Subscribes [ViewportStatusObserver] to observe the [ViewportStatus] change.\n   *\n   * [ViewportPlugin] keeps a strong reference to registered observers. Adding the same observer again\n   * while it is already subscribed has no effect.\n   *\n   * Note: Observers are notified of status changes asynchronously on the main queue. This means that\n   * by the time the notification is delivered, the status may have already changed again. This behaviour\n   * is necessary to allow observers to trigger further transitions while avoiding out-of-order delivery\n   * of status changed notifications.\n   *\n   * @param viewportStatusObserver the observer that will be notified when the [ViewportPlugin.status] changes.\n   * @see removeStatusObserver\n   */\n  fun addStatusObserver(\n    viewportStatusObserver: ViewportStatusObserver\n  )\n\n  /**\n   * Unsubscribes [ViewportStatusObserver] from [ViewportPlugin.status] changes.\n   *\n   * This causes [ViewportPlugin] to release its strong reference to the observer. Removing an observer\n   * that is not subscribed has no effect.\n   *\n   * @param viewportStatusObserver the observer that should no longer be notified when the [ViewportPlugin.status] changes.\n   * @see addStatusObserver\n   */\n  fun removeStatusObserver(\n    viewportStatusObserver: ViewportStatusObserver\n  )\n\n  // Convenient methods to create the in-stock [ViewportState] and [ViewportTransition].\n\n  /**\n   * Create a new [FollowPuckViewportState] instance with provided [FollowPuckViewportStateOptions].\n   *\n   * @param options The desired [FollowPuckViewportStateOptions], defaults to [FollowPuckViewportStateOptions] that's initialised with default parameters.\n   * @return The newly-created [FollowPuckViewportState] instance.\n   */\n  fun makeFollowPuckViewportState(\n    options: FollowPuckViewportStateOptions = FollowPuckViewportStateOptions.Builder().build()\n  ): FollowPuckViewportState\n\n  /**\n   * Create a new [OverviewViewportState] instance with provided [OverviewViewportStateOptions].\n   *\n   * @param options The desired [OverviewViewportStateOptions]\n   * @return The newly-created [OverviewViewportState] instance.\n   */\n  fun makeOverviewViewportState(options: OverviewViewportStateOptions): OverviewViewportState\n\n  /**\n   * Create a new [DefaultViewportTransition] instance with provided [DefaultViewportTransitionOptions].\n   *\n   * @param options The desired [DefaultViewportTransitionOptions], defaults to [DefaultViewportTransitionOptions] that's initialised with default parameters.\n   * @return The newly-created [DefaultViewportTransition] instance.\n   */\n  fun makeDefaultViewportTransition(\n    options: DefaultViewportTransitionOptions = DefaultViewportTransitionOptions.Builder().build()\n  ): DefaultViewportTransition\n\n  /**\n   * Create a new [ViewportTransition] instance that transition to the target [ViewportState] immediately.\n   *\n   * @return The newly-created ImmediateViewportTransition instance.\n   */\n  fun makeImmediateViewportTransition(): ViewportTransition\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/ViewportStatus.kt",
    "content": "package com.mapbox.maps.plugin.viewport\n\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\nimport com.mapbox.maps.plugin.viewport.transition.ViewportTransition\nimport java.util.*\n\n/**\n * Represents the status of the viewport.\n *\n * It could be either a [ViewportStatus.State], [ViewportStatus.Transition] or [ViewportStatus.Idle].\n *\n * The [ViewportStatus.State] amd [ViewportStatus.Transition] have associated values that are reference\n * types, so equality and hash are implemented in terms of the identities of those objects.\n */\nsealed class ViewportStatus {\n  /**\n   * Represents the current status is a [ViewportState].\n   */\n  class State(\n    /**\n     * The current [ViewportState].\n     */\n    val state: ViewportState\n  ) : ViewportStatus() {\n    /**\n     * Indicates whether some other object is \"equal to\" this one.\n     */\n    override fun equals(other: Any?): Boolean = other is State && other.state === this.state\n\n    /**\n     * Returns a hash code value for the object.\n     */\n    override fun hashCode() = Objects.hash(state)\n\n    /**\n     * Returns a String for the object.\n     */\n    override fun toString() = \"ViewportStatus#State(state=$state)\"\n  }\n\n  /**\n   * Represents the current status is a [ViewportTransition].\n   */\n  class Transition(\n    /**\n     * The current [ViewportTransition].\n     */\n    val transition: ViewportTransition,\n    /**\n     * The target [ViewportState].\n     */\n    val toState: ViewportState\n  ) : ViewportStatus() {\n    /**\n     * Indicates whether some other object is \"equal to\" this one.\n     */\n    override fun equals(other: Any?): Boolean =\n      other is Transition &&\n        other.transition === this.transition &&\n        other.toState === this.toState\n\n    /**\n     * Returns a hash code value for the object.\n     */\n    override fun hashCode() = Objects.hash(transition, toState)\n\n    /**\n     * Returns a String for the object.\n     */\n    override fun toString() =\n      \"ViewportStatus#Transition(transition=$transition, toState=$toState)\"\n  }\n\n  /**\n   * Represents the current status is Idle.\n   */\n  object Idle : ViewportStatus() {\n    /**\n     * Returns a String for the object.\n     */\n    override fun toString() = \"ViewportStatus#Idle\"\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/ViewportStatusObserver.kt",
    "content": "package com.mapbox.maps.plugin.viewport\n\nimport com.mapbox.maps.plugin.viewport.data.ViewportStatusChangeReason\n\n/**\n * Observer that gets notified whenever [ViewportStatus] changes.\n *\n * @see [ViewportPlugin.addStatusObserver]\n * @see [ViewportPlugin.removeStatusObserver]\n */\nfun interface ViewportStatusObserver {\n  /**\n   * Called whenever [ViewportStatus] changes.\n   *\n   * @param from The previous [ViewportStatus]\n   * @param to The current [ViewportStatus].\n   * @param reason The reason that the [ViewportStatus] has been changed.\n   */\n  fun onViewportStatusChanged(from: ViewportStatus, to: ViewportStatus, reason: ViewportStatusChangeReason)\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/data/DefaultViewportTransitionOptions.kt",
    "content": "package com.mapbox.maps.plugin.viewport.data\n\nimport com.mapbox.maps.plugin.viewport.DEFAULT_TRANSITION_MAX_DURATION_MS\nimport com.mapbox.maps.plugin.viewport.transition.DefaultViewportTransition\n\n/**\n * Configuration options that impact the [DefaultViewportTransition].\n */\nclass DefaultViewportTransitionOptions private constructor(\n  /**\n   * The maximum duration of the transitions in milliseconds.\n   *\n   * Defaults to [DEFAULT_TRANSITION_MAX_DURATION_MS] milliseconds.\n   */\n  val maxDurationMs: Long\n) {\n  /**\n   * Returns a builder that created the [DefaultViewportTransitionOptions]\n   */\n  fun toBuilder(): Builder = Builder().maxDurationMs(maxDurationMs)\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is DefaultViewportTransitionOptions &&\n    maxDurationMs == other.maxDurationMs\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = maxDurationMs.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() =\n    \"DefaultViewportTransitionOptions(maxDurationMs=$maxDurationMs)\"\n\n  /**\n   * Builder for [DefaultViewportTransitionOptions]\n   */\n  class Builder {\n    private var maxDurationMs: Long = DEFAULT_TRANSITION_MAX_DURATION_MS\n\n    /**\n     * Sets maximum duration of the generated transitions set in milliseconds.\n     *\n     * Defaults to [DEFAULT_TRANSITION_MAX_DURATION_MS] milliseconds.\n     */\n    fun maxDurationMs(maxDurationMs: Long): Builder = apply {\n      this.maxDurationMs = maxDurationMs\n    }\n\n    /**\n     * Builds [DefaultViewportTransitionOptions]\n     */\n    fun build(): DefaultViewportTransitionOptions = DefaultViewportTransitionOptions(maxDurationMs)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateBearing.kt",
    "content": "package com.mapbox.maps.plugin.viewport.data\n\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState\nimport java.util.Objects\n\n/**\n * Describes different ways that [FollowPuckViewportState] can obtain values to use when setting\n * [CameraOptions.bearing].\n */\nsealed class FollowPuckViewportStateBearing {\n  /**\n   * The [FollowPuckViewportState] sets the camera bearing to the constant value on every frame.\n   *\n   * @param bearing The bearing that the [FollowPuckViewportState] uses to generate camera updates.\n   */\n  class Constant(val bearing: Double) : FollowPuckViewportStateBearing() {\n    /**\n     * Indicates whether some other object is \"equal to\" this one.\n     */\n    override fun equals(other: Any?) = other is Constant && bearing == other.bearing\n\n    /**\n     * Returns a hash code value for the object.\n     */\n    override fun hashCode() = Objects.hash(bearing)\n\n    /**\n     * Returns a String for the object.\n     */\n    override fun toString() = \"FollowPuckViewportStateBearing#Constant(bearing=$bearing)\"\n  }\n\n  /**\n   * The [FollowPuckViewportState] sets the camera bearing to the same as the location puck's bearing.\n   *\n   * When set to this mode, the viewport's bearing is driven by the location, thus guarantees\n   * the synchronization of the location puck and camera position.\n   */\n  object SyncWithLocationPuck : FollowPuckViewportStateBearing() {\n    /**\n     * Indicates whether some other object is \"equal to\" this one.\n     */\n    override fun equals(other: Any?) = other is SyncWithLocationPuck\n\n    /**\n     * Returns a hash code value for the object.\n     */\n    override fun hashCode() = Objects.hash(SyncWithLocationPuck)\n\n    /**\n     * Returns a String for the object.\n     */\n    override fun toString() = \"FollowPuckViewportStateBearing#SyncWithLocationPuck\"\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/data/FollowPuckViewportStateOptions.kt",
    "content": "package com.mapbox.maps.plugin.viewport.data\n\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.plugin.viewport.DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH\nimport com.mapbox.maps.plugin.viewport.DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM\nimport com.mapbox.maps.plugin.viewport.state.FollowPuckViewportState\nimport java.util.Objects\n\n/**\n * Configuration options that impact the [FollowPuckViewportState].\n *\n * Each of the [CameraOptions] related properties is optional, so that the state can be configured\n * to only modify certain aspects of the camera if desired. This can be used, to achieve effects like\n * allowing zoom gestures to work simultaneously with [FollowPuckViewportState].\n *\n * @see [ViewportOptions.transitionsToIdleUponUserInteraction]\n */\nclass FollowPuckViewportStateOptions private constructor(\n  /**\n   * The value to use for setting [CameraOptions.padding]. If null, padding will not be modified by\n   * the [FollowPuckViewportState].\n   *\n   * Defaults to 0 padding.\n   */\n  val padding: EdgeInsets?,\n  /**\n   * The value to use for setting [CameraOptions.zoom]. If null, zoom will not be modified by\n   * the [FollowPuckViewportState].\n   *\n   * Defaults to [DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM].\n   */\n  val zoom: Double?,\n  /**\n   * Indicates how to obtain the value to use for [CameraOptions.bearing] when setting the camera.\n   * If set to null, bearing will not be modified by the [FollowPuckViewportState].\n   *\n   * Defaults to [FollowPuckViewportStateBearing.SyncWithLocationPuck]\n   */\n  val bearing: FollowPuckViewportStateBearing?,\n  /**\n   * The value to use for setting [CameraOptions.pitch]. If null, pitch will not be modified by\n   * the [FollowPuckViewportState].\n   *\n   * Defaults to [DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH] degrees.\n   */\n  val pitch: Double?,\n) {\n  /**\n   * Returns a builder that created the [FollowPuckViewportStateOptions]\n   */\n  fun toBuilder(): Builder = Builder().padding(padding).zoom(zoom).bearing(bearing).pitch(pitch)\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is FollowPuckViewportStateOptions &&\n    padding == other.padding &&\n    Objects.equals(zoom, other.zoom) &&\n    bearing == other.bearing &&\n    Objects.equals(pitch, other.pitch)\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = Objects.hash(padding, zoom, bearing, pitch)\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() =\n    \"FollowPuckViewportStateOptions(padding=$padding, zoom=$zoom, bearing=$bearing, pitch=$pitch)\"\n\n  /**\n   * Builder for [FollowPuckViewportStateOptions]\n   */\n  class Builder {\n    private var padding: EdgeInsets? = null\n    private var zoom: Double? = DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM\n    private var bearing: FollowPuckViewportStateBearing? =\n      FollowPuckViewportStateBearing.SyncWithLocationPuck\n    private var pitch: Double? = DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH\n\n    /**\n     * The value to use for setting [CameraOptions.padding]. If null, padding will not be modified by\n     * the [FollowPuckViewportState].\n     *\n     * Defaults to 0 padding.\n     */\n    fun padding(padding: EdgeInsets?): Builder = apply {\n      this.padding = padding\n    }\n\n    /**\n     * The value to use for setting [CameraOptions.zoom]. If null, zoom will not be modified by\n     * the [FollowPuckViewportState].\n     *\n     * Defaults to [DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_ZOOM].\n     */\n    fun zoom(zoom: Double?): Builder = apply {\n      this.zoom = zoom\n    }\n\n    /**\n     * Indicates how to obtain the value to use for [CameraOptions.bearing] when setting the camera.\n     * If set to null, bearing will not be modified by the [FollowPuckViewportState].\n     *\n     * Defaults to [FollowPuckViewportStateBearing.SyncWithLocationPuck]\n     */\n    fun bearing(options: FollowPuckViewportStateBearing?): Builder = apply {\n      this.bearing = options\n    }\n\n    /**\n     * The value to use for setting [CameraOptions.pitch]. If null, pitch will not be modified by\n     * the [FollowPuckViewportState].\n     *\n     * Defaults to [DEFAULT_FOLLOW_PUCK_VIEWPORT_STATE_PITCH] degrees.\n     */\n    fun pitch(pitch: Double?): Builder = apply {\n      this.pitch = pitch\n    }\n\n    /**\n     * Builds [FollowPuckViewportStateOptions]\n     */\n    fun build(): FollowPuckViewportStateOptions =\n      FollowPuckViewportStateOptions(\n        padding,\n        zoom,\n        bearing,\n        pitch,\n      )\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/data/OverviewViewportStateOptions.kt",
    "content": "package com.mapbox.maps.plugin.viewport.data\n\nimport com.mapbox.geojson.Geometry\nimport com.mapbox.maps.EdgeInsets\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.viewport.DEFAULT_STATE_ANIMATION_DURATION_MS\nimport com.mapbox.maps.plugin.viewport.state.OverviewViewportState\nimport java.lang.IllegalArgumentException\nimport java.util.*\n\n/**\n * Configuration options that impact the [OverviewViewportState].\n */\nclass OverviewViewportStateOptions private constructor(\n  /**\n   * The geometry that the [OverviewViewportState] should use when calculating its camera.\n   */\n  val geometry: Geometry,\n  /**\n   * The amount of padding in pixels to add to the map when calculating its camera.\n   *\n   * Defaults to EdgeInsets(0.0, 0.0, 0.0, 0.0).\n   */\n  val padding: EdgeInsets?,\n  /**\n   * The amount of padding in pixels to add to the given [geometry].\n   *\n   * Note: This padding is not applied to the map but to the provided [geometry]. If you want to apply padding to the map use param [padding].\n   *\n   * Defaults to EdgeInsets(0.0, 0.0, 0.0, 0.0).\n   */\n  val geometryPadding: EdgeInsets,\n  /**\n   * The bearing that [OverviewViewportState] should use when calculating its camera.\n   *\n   * Defaults to 0.\n   */\n  val bearing: Double?,\n  /**\n   * The pitch that [OverviewViewportState] should use when calculating its camera.\n   *\n   * Defaults to 0.\n   */\n  val pitch: Double?,\n  /**\n   * The maximum allowed zoom level when calculating the camera of [OverviewViewportState].\n   *\n   * Defaults to null. That is, there won't be any restriction on the maximum zoom level allowed.\n   */\n  val maxZoom: Double?,\n  /**\n   * The offset to the center of the given geometry relative to map center in pixels, when calculating the camera of [OverviewViewportState].\n   *\n   * Defaults to ScreenCoordinate(0.0, 0.0).\n   */\n  val offset: ScreenCoordinate,\n  /**\n   * The length of the animation performed in milliseconds by [OverviewViewportState] when it starts\n   * updating the camera and anytime [OverviewViewportState.options] is set.\n   *\n   * When set to a custom value, transitions will use fixed-duration linear animations that take\n   * exactly the specified duration regardless of distance. This provides predictable timing but\n   * may result in very fast camera movement for large distances. Consider using longer durations\n   * or keeping the default value if animating over large geographic areas.\n   *\n   * @see [OverviewViewportState.options] for details.\n   *\n   * Defaults to [DEFAULT_STATE_ANIMATION_DURATION_MS] milliseconds\n   */\n  val animationDurationMs: Long\n) {\n  /**\n   * Returns a builder that created the [OverviewViewportStateOptions]\n   */\n  fun toBuilder(): Builder =\n    Builder().geometry(geometry).padding(padding).geometryPadding(geometryPadding)\n      .bearing(bearing).pitch(pitch).maxZoom(maxZoom).offset(offset)\n      .animationDurationMs(animationDurationMs)\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is OverviewViewportStateOptions &&\n    geometry == other.geometry &&\n    padding == other.padding &&\n    geometryPadding == other.geometryPadding &&\n    Objects.equals(bearing, other.bearing) &&\n    Objects.equals(pitch, other.pitch) &&\n    Objects.equals(maxZoom, other.maxZoom) &&\n    offset == other.offset &&\n    animationDurationMs == other.animationDurationMs\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() =\n    Objects.hash(geometry, padding, geometryPadding, bearing, pitch, maxZoom, offset, animationDurationMs)\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() =\n    \"OverviewViewportStateOptions(geometry=$geometry, padding=$padding, geometryPadding=$geometryPadding, bearing=$bearing, pitch=$pitch, maxZoom=$maxZoom, offset=$offset, animationDurationMs=$animationDurationMs)\"\n\n  /**\n   * Builder for [OverviewViewportStateOptions]\n   */\n  class Builder {\n    private var geometry: Geometry? = null\n    private var padding: EdgeInsets? = EdgeInsets(0.0, 0.0, 0.0, 0.0)\n    private var geometryPadding: EdgeInsets = EdgeInsets(0.0, 0.0, 0.0, 0.0)\n    private var bearing: Double? = 0.0\n    private var pitch: Double? = 0.0\n    private var maxZoom: Double? = null\n    private var offset: ScreenCoordinate = ScreenCoordinate(0.0, 0.0)\n    private var animationDurationMs: Long = DEFAULT_STATE_ANIMATION_DURATION_MS\n\n    /**\n     * The geometry that the [OverviewViewportState] should use when calculating its camera.\n     */\n    fun geometry(geometry: Geometry): Builder = apply {\n      this.geometry = geometry\n    }\n\n    /**\n     * The amount of padding in pixels to add to the map when calculating its camera.\n     *\n     * Defaults to EdgeInsets(0.0, 0.0, 0.0, 0.0).\n     */\n    fun padding(padding: EdgeInsets?): Builder = apply {\n      this.padding = padding\n    }\n\n    /**\n     * The amount of padding in pixels to add to the given [geometry].\n     *\n     * Note: This padding is not applied to the map but to the provided [geometry]. If you want to apply padding to the map use param [padding].\n     *\n     * Defaults to EdgeInsets(0.0, 0.0, 0.0, 0.0).\n     */\n    fun geometryPadding(geometryPadding: EdgeInsets): Builder = apply {\n      this.geometryPadding = geometryPadding\n    }\n\n    /**\n     * The bearing that [OverviewViewportState] should use when calculating its camera.\n     *\n     * Defaults to 0.\n     */\n    fun bearing(bearing: Double?): Builder = apply {\n      this.bearing = bearing\n    }\n\n    /**\n     * The pitch that [OverviewViewportState] should use when calculating its camera.\n     *\n     * Defaults to 0.\n     */\n    fun pitch(pitch: Double?): Builder = apply {\n      this.pitch = pitch\n    }\n\n    /**\n     * The maximum allowed zoom level when calculating the camera of [OverviewViewportState].\n     *\n     * Defaults to null. That is, there won't be any restriction on the maximum zoom level allowed.\n     */\n    fun maxZoom(maxZoom: Double?): Builder = apply {\n      this.maxZoom = maxZoom\n    }\n\n    /**\n     * The offset to the center of the given geometry relative to map center in pixels, when calculating the camera of [OverviewViewportState].\n     *\n     * Defaults to ScreenCoordinate(0.0, 0.0).\n     */\n    fun offset(offset: ScreenCoordinate): Builder = apply {\n      this.offset = offset\n    }\n\n    /**\n     * The length of the animation performed by [OverviewViewportState] when it starts updating the\n     * camera and anytime [OverviewViewportState.options] is set.\n     *\n     * When set to a custom value, transitions will use fixed-duration linear animations that take\n     * exactly the specified duration regardless of distance. This provides predictable timing but\n     * may result in very fast camera movement for large distances. Consider using longer durations\n     * or keeping the default value if animating over large geographic areas.\n     *\n     * @see [OverviewViewportState.options] for details.\n     *\n     * Defaults to [DEFAULT_STATE_ANIMATION_DURATION_MS] milliseconds\n     */\n    fun animationDurationMs(duration: Long): Builder = apply {\n      this.animationDurationMs = duration\n    }\n\n    /**\n     * Builds [OverviewViewportStateOptions]\n     */\n    fun build(): OverviewViewportStateOptions = geometry?.let {\n      OverviewViewportStateOptions(\n        geometry = it,\n        padding = padding,\n        geometryPadding = geometryPadding,\n        bearing = bearing,\n        pitch = pitch,\n        maxZoom = maxZoom,\n        offset = offset,\n        animationDurationMs = animationDurationMs\n      )\n    } ?: throw IllegalArgumentException(\"Geometry is required for OverviewViewportStateOptions and shouldn't be null\")\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/data/ViewportOptions.kt",
    "content": "package com.mapbox.maps.plugin.viewport.data\n\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\n\n/**\n * Configuration options that impact the [ViewportPlugin].\n */\nclass ViewportOptions private constructor(\n  /**\n   * Indicates whether the [ViewportPlugin] should idle when user interact with the map using gestures.\n   *\n   * Set this property to false to enable building custom [ViewportState] that can work simultaneously\n   * with certain types of gestures.\n   *\n   * Defaults to true.\n   */\n  val transitionsToIdleUponUserInteraction: Boolean\n) {\n  /**\n   * Returns a builder that created the [ViewportOptions]\n   */\n  fun toBuilder(): Builder = Builder().transitionsToIdleUponUserInteraction(transitionsToIdleUponUserInteraction)\n\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is ViewportOptions &&\n    transitionsToIdleUponUserInteraction == other.transitionsToIdleUponUserInteraction\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = transitionsToIdleUponUserInteraction.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() =\n    \"ViewportPluginOptions(transitionsToIdleUponUserInteraction=$transitionsToIdleUponUserInteraction)\"\n\n  /**\n   * Builder for [ViewportOptions]\n   */\n  class Builder {\n    private var transitionsToIdleUponUserInteraction: Boolean = true\n\n    /**\n     * Indicates whether the [ViewportPlugin] should idle when user interact with the map using gestures.\n     *\n     * Set this property to false to enable building custom [ViewportState] that can work simultaneously\n     * with certain types of gestures.\n     *\n     * Defaults to true.\n     */\n    fun transitionsToIdleUponUserInteraction(transitionsToIdleUponUserInteraction: Boolean): Builder = apply {\n      this.transitionsToIdleUponUserInteraction = transitionsToIdleUponUserInteraction\n    }\n\n    /**\n     * Builds [ViewportOptions]\n     */\n    fun build() = ViewportOptions(transitionsToIdleUponUserInteraction)\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/data/ViewportStatusChangeReason.kt",
    "content": "package com.mapbox.maps.plugin.viewport.data\n\nimport com.mapbox.maps.plugin.viewport.ViewportStatus\n\n/**\n * The reason why the [ViewportStatus] has been changed.\n */\nclass ViewportStatusChangeReason private constructor(\n  /**\n   * The string describing the change reason.\n   */\n  private val reason: String\n) {\n  /**\n   * Indicates whether some other object is \"equal to\" this one.\n   */\n  override fun equals(other: Any?) = other is ViewportStatusChangeReason &&\n    reason == other.reason\n\n  /**\n   * Returns a hash code value for the object.\n   */\n  override fun hashCode() = reason.hashCode()\n\n  /**\n   * Returns a String for the object.\n   */\n  override fun toString() =\n    \"ViewportStatusChangeReason(reason=$reason)\"\n\n  /**\n   * Companion object.\n   */\n  companion object {\n    /**\n     * The [ViewportStatus] is changed by the Idle request.\n     */\n    @JvmField\n    val IDLE_REQUESTED = ViewportStatusChangeReason(\"IDLE_REQUESTED\")\n\n    /**\n     * The [ViewportStatus] is changed by a transition started event.\n     */\n    @JvmField\n    val TRANSITION_STARTED = ViewportStatusChangeReason(\"TRANSITION_STARTED\")\n\n    /**\n     * The [ViewportStatus] is changed by a transition succeeded event.\n     */\n    @JvmField\n    val TRANSITION_SUCCEEDED = ViewportStatusChangeReason(\"TRANSITION_SUCCEEDED\")\n\n    /**\n     * The [ViewportStatus] is changed by a transition failed event.\n     */\n    @JvmField\n    val TRANSITION_FAILED = ViewportStatusChangeReason(\"TRANSITION_FAILED\")\n\n    /**\n     * The [ViewportStatus] is changed by an user interaction event.\n     */\n    @JvmField\n    val USER_INTERACTION = ViewportStatusChangeReason(\"USER_INTERACTION\")\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/state/FollowPuckViewportState.kt",
    "content": "package com.mapbox.maps.plugin.viewport.state\n\nimport com.mapbox.maps.plugin.locationcomponent.LocationComponentPlugin\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\n\n/**\n * The [ViewportState] that tracks the location puck's position.\n *\n * Use [ViewportPlugin.makeFollowPuckViewportState] to create instances of [FollowPuckViewportState].\n *\n * Note: [LocationComponentPlugin] should be enabled to use this viewport state, and Users are\n * responsible to create the viewport states and keep a reference to these states for\n * future operations.\n */\ninterface FollowPuckViewportState : ViewportState {\n  /**\n   * Describes the configuration options of the state.\n   */\n  var options: FollowPuckViewportStateOptions\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/state/OverviewViewportState.kt",
    "content": "package com.mapbox.maps.plugin.viewport.state\n\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\n\n/**\n * The [ViewportState] that shows an overview of the geometry specified by its [OverviewViewportStateOptions.geometry].\n *\n * Use [ViewportPlugin.makeOverviewViewportState] to create instances of [OverviewViewportState].\n *\n * Note: Users are responsible to create the viewport states and keep a reference to these states for\n * future operations.\n */\ninterface OverviewViewportState : ViewportState {\n  /**\n   * Describes the configuration options of the state.\n   *\n   * When set, the viewport reframes the geometry using the new options and update its camera with a\n   * linear camera animation and with duration specified by the new value's [OverviewViewportStateOptions.animationDurationMs].\n   */\n  var options: OverviewViewportStateOptions\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/state/ViewportState.kt",
    "content": "package com.mapbox.maps.plugin.viewport.state\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.transition.ViewportTransition\n\n/**\n * [ViewportState] is used to observe the data source associated with the state and query the camera\n * to keep updating according to current viewport data. [ViewportState] is also used by [ViewportPlugin]\n * to orchestrate transitions to and from different states.\n *\n * The [observeDataSource] allows [ViewportTransition] to consume a stream of camera\n * updates from a target state while executing a transition.\n *\n * The [startUpdatingCamera] and [stopUpdatingCamera] are invoked to tell the state that it should\n * assume or relinquish control of the map's camera. These are typically used by [ViewportPlugin] itself\n * after a successful transition into a state and when exiting a state, respectively.\n *\n * Mapbox provides implementations of [ViewportState] that can be created and configured via methods\n * on [ViewportPlugin]. Applications may also define their own implementations to handle advanced use\n * cases not covered by the provided implementations.\n *\n * [ViewportState] should generally pre-warm their data sources as soon as they are created to minimise\n * delays when they become current. For this reason, only states that are current(or soon-to-be) needed\n * should be kept alive so that unneeded resources(e.g. location services) can be released.\n *\n * Note: Users are responsible to create the viewport states and keep a reference to these states for\n * future operations.\n *\n * @see [FollowPuckViewportState]\n * @see [OverviewViewportState]\n */\ninterface ViewportState {\n  /**\n   * Registers an observer to receive the cameras being generated by this [ViewportState].\n   *\n   * This method is commonly used by [ViewportTransition] implementations to obtain the target camera\n   * for transition animations. Transitions typically cannot start their animations until after the\n   * observer is invoked for the first time, so it's a good idea for [ViewportState] to invoke observer\n   * with the current camera if it's not too stale rather than waiting for the next camera change to\n   * occur. To increase the likelihood that a valid camera exists when an observer is registered, design\n   * [ViewportState] implementations so that they start updating their internal state prior to when they\n   * are passed to [ViewportPlugin.transitionTo].\n   *\n   * The caller may either cancel on the returned [Cancelable] or return false from [ViewportStateDataObserver]\n   * to indicate that it wishes to stop receiving updates. Following either of these events, implementations\n   * must no longer invoke [ViewportStateDataObserver] and must release all strong references to it.\n   *\n   * @param viewportStateDataObserver observer that observe new viewport data.\n   * @return a handle that cancels current observation.\n   */\n  fun observeDataSource(viewportStateDataObserver: ViewportStateDataObserver): Cancelable\n\n  /**\n   * Indicates the current [ViewportState] is now responsible for updating the camera.\n   *\n   * [ViewportPlugin] calls this method at the end of a successful transition into this state.\n   *\n   * @warning Don't call this method directly, instead activate the viewport via [ViewportPlugin.transitionTo].\n   */\n  fun startUpdatingCamera()\n\n  /**\n   * Indicates the current [ViewportState] is no longer responsible for updating the camera.\n   *\n   * [ViewportPlugin] calls this method at the beginning of the transition out of this sate.\n   *\n   * Implementations must stop updating the camera immediately and should typically cancel any ongoing\n   * animations that they started when this method is invoked.\n   *\n   * @warning Don't call this method directly. Instead, use [ViewportPlugin.idle] to stop animations in progress.\n   */\n  fun stopUpdatingCamera()\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/state/ViewportStateDataObserver.kt",
    "content": "package com.mapbox.maps.plugin.viewport.state\n\nimport com.mapbox.maps.CameraOptions\n\n/**\n * Observer that gets notified whenever new viewport data is available.\n */\nfun interface ViewportStateDataObserver {\n  /**\n   * Notifies that new data is available.\n   *\n   * @param cameraOptions The most recent [CameraOptions] from the [ViewportState].\n   * @return true if new data is needed and stay subscribed. returning false will unsubscribe from further data updates.\n   */\n  fun onNewData(cameraOptions: CameraOptions): Boolean\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/transition/DefaultViewportTransition.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\n\n/**\n * The default [ViewportTransition] that transitions viewport to the target [ViewportState].\n *\n * Use [ViewportPlugin.makeDefaultViewportTransition] to create instances of [DefaultViewportTransition].\n *\n * Note: Users are responsible to create the viewport transitions and keep a reference to these transitions for\n * future operations.\n */\ninterface DefaultViewportTransition : ViewportTransition {\n  /**\n   * Describes the configuration options for the [DefaultViewportTransition].\n   *\n   * New values will take effect the next time [ViewportTransition.run] is invoked.\n   */\n  var options: DefaultViewportTransitionOptions\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/plugin/viewport/transition/ViewportTransition.kt",
    "content": "package com.mapbox.maps.plugin.viewport.transition\n\nimport com.mapbox.common.Cancelable\nimport com.mapbox.maps.plugin.viewport.CompletionListener\nimport com.mapbox.maps.plugin.viewport.ViewportPlugin\nimport com.mapbox.maps.plugin.viewport.state.ViewportState\n\n/**\n * Defines how to transition to another [ViewportState].\n *\n * [ViewportTransition] is used by [ViewportPlugin] to orchestrate transitions to and from different\n * [ViewportState].\n *\n * Mapbox provides implementations of [ViewportTransition] that can be created and configured via methods\n * on [ViewportPlugin]. Applications may also define their own implementations to handle advanced use\n * cases not covered by the provided implementations.\n *\n * @see [ViewportPlugin.makeDefaultViewportTransition]\n * @see [ViewportPlugin.makeImmediateViewportTransition]\n */\nfun interface ViewportTransition {\n  /**\n   * Run the [ViewportTransition] from current viewport to the target [ViewportState].\n   *\n   * The completion block must be invoked with true if the transition completes successfully. If the\n   * transition fails, invoke the completion block with false.\n   *\n   * If the returned [Cancelable] is canceled, it's not necessary to invoke the completion block(but\n   * safe to do so, as it will just be ignored.\n   *\n   * Transitions should handle the possibility that [to] state might fail to provide camera in a timely\n   * manner or might update the target camera multiple times during the transition(i.e. a 'moving target').\n   *\n   * @param to The target [ViewportState]\n   * @param completionListener The listener to observe the completion state, it must be invoked on the main queue.\n   * @return a handle that can be used to cancel the current [ViewportTransition]\n   */\n  fun run(\n    to: ViewportState,\n    completionListener: CompletionListener\n  ): Cancelable\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/threading/AnimationThreadController.kt",
    "content": "package com.mapbox.maps.threading\n\nimport android.os.Handler\nimport android.os.HandlerThread\nimport android.os.Looper\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.logW\n\n/**\n * Experimental controller singleton allowing to use background thread for all Mapbox animations.\n * Most likely should not be used directly, calling [useBackgroundThread] should do all the work.\n *\n * By default all Mapbox animations are running on Android Main thread.\n *\n * Following Mapbox plugins are updated to make use of background animation thread:\n *  - plugin-locationcomponent\n *  - plugin-animation\n *  - plugin-viewport\n *\n *  Switching between [useBackgroundThread] and [useMainThread] could be done at any point in runtime.\n *\n *  Using this class is extremely unsafe and error prone, it should be used in very specific use-cases!\n *  Even when it's essential to use it (for example Android Auto use-case on specific devices when locking the device)\n *  it would be safer to use Android Main thread as much as possible and switch to background thread\n *  only when it's needed.\n */\n@MapboxExperimental\nobject AnimationThreadController {\n\n  /**\n   * Indicates if background thread is used now to run Mapbox animators.\n   */\n  @Volatile\n  var usingBackgroundThread = false\n    private set\n  private val mainHandler = Handler(Looper.getMainLooper())\n\n  private var backgroundAnimationThread: HandlerThread? = null\n  private var backgroundAnimationHandler: Handler? = null\n\n  /**\n   * Spawn new animation [HandlerThread] that will be used for all Mapbox animators.\n   * If animation thread is already running - function is no-op.\n   *\n   * Behaviour is undefined if any animators are running when this method is called.\n   */\n  fun useBackgroundThread() {\n    if (usingBackgroundThread) {\n      return\n    }\n    usingBackgroundThread = true\n    backgroundAnimationThread?.quit()\n    backgroundAnimationThread = HandlerThread(BACKGROUND_ANIMATION_THREAD_NAME).apply {\n      start()\n      backgroundAnimationHandler = Handler(looper)\n    }\n  }\n\n  /**\n   * Execute [function] on Android Main thread.\n   *\n   * If called from Android Main thread - will be executed immediately in the same callchain\n   * otherwise will be posted on Android Main thread explicitly.\n   */\n  fun postOnMainThread(function: () -> Unit) {\n    if (Looper.myLooper() == Looper.getMainLooper()) {\n      function.invoke()\n    } else {\n      mainHandler.post { function.invoke() }\n    }\n  }\n\n  /**\n   * Execute [function] on animator thread.\n   *\n   * If called after [useBackgroundThread] from background animator thread - will be executed immediately in the same callchain\n   * otherwise will be posted on background animator thread explicitly.\n   *\n   * If called after [useMainThread] from Android Main thread - will be executed immediately in the same callchain\n   * otherwise will be posted on Android Main thread explicitly.\n   */\n  fun postOnAnimatorThread(function: () -> Unit) {\n    if (usingBackgroundThread) {\n      if (Looper.myLooper() == backgroundAnimationThread?.looper) {\n        function.invoke()\n      } else backgroundAnimationHandler?.let { backgroundHandler ->\n        backgroundHandler.post { function.invoke() }\n      } ?: logW(TAG, \"useBackgroundThread was called but handler is null, animator event is skipped!\")\n    } else {\n      postOnMainThread(function)\n    }\n  }\n\n  /**\n   * If [useBackgroundThread] was called beforehand - kill background animator thread\n   * and use Android Main thread for all Mapbox animators. Otherwise function is no-op.\n   *\n   * Behaviour is undefined if any animators are running when this method is called.\n   */\n  fun useMainThread() {\n    if (usingBackgroundThread) {\n      backgroundAnimationHandler?.removeCallbacksAndMessages(null)\n      backgroundAnimationThread?.quit()\n      usingBackgroundThread = false\n      backgroundAnimationThread = null\n      backgroundAnimationHandler = null\n    }\n  }\n\n  private const val TAG = \"AnimThreadController\"\n  private const val BACKGROUND_ANIMATION_THREAD_NAME = \"MapboxAnimThread\"\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/util/CameraOptionsUtils.kt",
    "content": "@file:JvmName(\"CameraOptionsUtils\")\n\npackage com.mapbox.maps.util\n\nimport com.mapbox.maps.CameraOptions\n\n/**\n * Check whether given [CameraOptions] object is empty.\n */\nval CameraOptions.isEmpty: Boolean\n  get() {\n    if (center != null) return false\n    if (padding != null) return false\n    if (anchor != null) return false\n    if (zoom != null) return false\n    if (bearing != null) return false\n    if (pitch != null) return false\n\n    return true\n  }"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/util/CoreGesturesHandler.kt",
    "content": "package com.mapbox.maps.util\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport androidx.annotation.RestrictTo\nimport com.mapbox.maps.MapCenterAltitudeMode\nimport com.mapbox.maps.MapboxExperimental\nimport com.mapbox.maps.plugin.delegates.MapCameraManagerDelegate\nimport com.mapbox.maps.plugin.delegates.MapTransformDelegate\nimport com.mapbox.maps.threading.AnimationThreadController\n\n/**\n * Internal utility to handle gesture interactions with render engine.\n */\n@OptIn(MapboxExperimental::class)\n@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)\nclass CoreGesturesHandler(\n  private val mapTransformDelegate: MapTransformDelegate,\n  private val mapCameraManagerDelegate: MapCameraManagerDelegate\n) {\n  private var gestureAnimationStarted = false\n  private var gestureStarted = false\n  private var cachedCenterAltitudeMode = mapCameraManagerDelegate.getCenterAltitudeMode()\n\n  /**\n   * We should set the center altitude mode to [MapCenterAltitudeMode.SEA] during gestures to avoid\n   * bumpiness when the terrain is enabled. It's not necessary to update [MapCenterAltitudeMode] if\n   * the user explicitly changed altitude to [MapCenterAltitudeMode.SEA] before the gesture starts.\n   */\n  private fun isSetCenterAltitudeModeNeeded(): Boolean {\n    return cachedCenterAltitudeMode != MapCenterAltitudeMode.SEA\n  }\n\n  /**\n   * Called when the gesture is started, i.e. the point when a gesture is recognised.\n   */\n  fun notifyCoreGestureStarted() {\n    if (!gestureStarted) {\n      AnimationThreadController.postOnMainThread {\n        cachedCenterAltitudeMode = mapCameraManagerDelegate.getCenterAltitudeMode()\n        gestureStarted = true\n        mapTransformDelegate.setGestureInProgress(true)\n        if (isSetCenterAltitudeModeNeeded()) {\n          mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA)\n        }\n      }\n    }\n  }\n\n  /**\n   * Called on ACTION_UP or ACTION_CANCEL touch event. Note that the gesture might not end yet, a fling\n   * or rotate camera animation might still be in progress.\n   */\n  fun notifyCoreTouchEnded() {\n    // ACTION_UP or ACTION_CANCEL may be triggered but there was no actual gesture -\n    // then we don't have to call native functions to avoid triggering extra MAP_IDLE event\n\n    // fling animation starts before ACTION_UP or ACTION_CANCEL so it's important to retain SEA elevation\n    // for the fling to avoid bumpiness\n    if (gestureStarted && !gestureAnimationStarted) {\n      AnimationThreadController.postOnMainThread {\n        if (isSetCenterAltitudeModeNeeded()) {\n          mapCameraManagerDelegate.setCenterAltitudeMode(cachedCenterAltitudeMode)\n        }\n        mapTransformDelegate.setGestureInProgress(false)\n        gestureStarted = false\n      }\n    }\n  }\n\n  /**\n   * Adds handling of gesture driven camera animator listener.\n   * Can be used for fling or scale animation.\n   */\n  val coreGestureAnimatorHandler = object : AnimatorListenerAdapter() {\n    override fun onAnimationStart(animation: Animator) {\n      super.onAnimationStart(animation)\n      AnimationThreadController.postOnMainThread {\n        gestureAnimationStarted = true\n        if (isSetCenterAltitudeModeNeeded()) {\n          mapCameraManagerDelegate.setCenterAltitudeMode(MapCenterAltitudeMode.SEA)\n        }\n      }\n    }\n\n    override fun onAnimationEnd(animation: Animator) {\n      super.onAnimationEnd(animation)\n      AnimationThreadController.postOnMainThread {\n        gestureAnimationStarted = false\n        if (isSetCenterAltitudeModeNeeded()) {\n          mapCameraManagerDelegate.setCenterAltitudeMode(cachedCenterAltitudeMode)\n        }\n        mapTransformDelegate.setGestureInProgress(false)\n      }\n    }\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/java/com/mapbox/maps/util/MathUtils.kt",
    "content": "package com.mapbox.maps.util\n\n/**\n * Math utils class.\n */\nobject MathUtils {\n\n  /**\n   * Util function to transform given bearing values to optimal ones so that shortest path is\n   * always taken.\n   */\n  fun prepareOptimalBearingPath(targets: DoubleArray): DoubleArray {\n    val optimized = DoubleArray(targets.size)\n    targets.apply {\n      for (i in indices) {\n        optimized[i] = if (i == 0)\n          normalize(get(i))\n        else\n          shortestRotation(normalize(get(i)), optimized[i - 1])\n      }\n    }\n    return optimized\n  }\n\n  /**\n   * Util for finding the shortest path from the current rotated degree to the new degree.\n   *\n   * @param targetHeading  the new position of the rotation\n   * @param currentHeading the current position of the rotation\n   * @return the shortest degree of rotation possible\n   */\n  internal fun shortestRotation(targetHeading: Double, currentHeading: Double): Double {\n    val diff = currentHeading - targetHeading\n    return when {\n      diff > 180.0f -> {\n        targetHeading + 360.0f\n      }\n      diff < -180.0f -> {\n        targetHeading - 360.0f\n      }\n      else -> {\n        targetHeading\n      }\n    }\n  }\n\n  /**\n   * Normalizes an angle to be in the [0, 360] range.\n   *\n   * @param angle the provided angle\n   * @return the normalized angle\n   */\n  private fun normalize(angle: Double): Double {\n    return (angle % 360.0 + 360.0) % 360.0\n  }\n}"
  },
  {
    "path": "sdk-base/src/main/ksp/com/mapbox/maps/plugin/attribution/generated/AttributionSettings.kt",
    "content": "@file:Suppress(\"RedundantVisibilityModifier\")\n\npackage com.mapbox.maps.plugin.attribution.generated\n\nimport android.graphics.Color\nimport android.os.Parcelable\nimport android.view.Gravity\nimport java.util.Objects\nimport kotlin.Any\nimport kotlin.Boolean\nimport kotlin.Float\nimport kotlin.Int\nimport kotlin.Unit\nimport kotlin.jvm.JvmSynthetic\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Shows the attribution icon on the map.\n */\n@Parcelize\npublic class AttributionSettings private constructor(\n  /**\n   * Whether the attribution icon is visible on the map. Default value: true.\n   */\n  public val enabled: Boolean,\n  /**\n   * Defines text color of the attribution icon. Default value: \"#FF1E8CAB\".\n   */\n  public val iconColor: Int,\n  /**\n   * Defines where the attribution icon is positioned on the map Default value: \"bottom-left\".\n   */\n  public val position: Int,\n  /**\n   * Defines the margin to the left that the attribution icon honors. Default value: 92. This\n   * property is specified in pixels.\n   */\n  public val marginLeft: Float,\n  /**\n   * Defines the margin to the top that the attribution icon honors. Default value: 4. This property\n   * is specified in pixels.\n   */\n  public val marginTop: Float,\n  /**\n   * Defines the margin to the right that the attribution icon honors. Default value: 4. This\n   * property is specified in pixels.\n   */\n  public val marginRight: Float,\n  /**\n   * Defines the margin to the bottom that the attribution icon honors. Default value: 4. This\n   * property is specified in pixels.\n   */\n  public val marginBottom: Float,\n  /**\n   * Whether the attribution can be clicked and click events can be registered. Default value: true.\n   */\n  public val clickable: Boolean\n) : Parcelable {\n  /**\n   * Overloaded toString function.\n   */\n  public override fun toString() = \"\"\"AttributionSettings(enabled=$enabled, iconColor=$iconColor,\n      position=$position, marginLeft=$marginLeft, marginTop=$marginTop, marginRight=$marginRight,\n      marginBottom=$marginBottom, clickable=$clickable)\"\"\".trimIndent()\n\n  /**\n   * Overloaded equals function.\n   */\n  public override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as AttributionSettings\n    return enabled == other.enabled && iconColor == other.iconColor && position == other.position &&\n        marginLeft.compareTo(other.marginLeft) == 0 && marginTop.compareTo(other.marginTop) == 0 &&\n        marginRight.compareTo(other.marginRight) == 0 &&\n        marginBottom.compareTo(other.marginBottom) == 0 && clickable == other.clickable\n  }\n\n  /**\n   * Overloaded hashCode function based on all class properties.\n   */\n  public override fun hashCode(): Int = Objects.hash(enabled, iconColor, position, marginLeft,\n      marginTop, marginRight, marginBottom, clickable)\n\n  /**\n   * Convert to Builder allowing to change class properties.\n   */\n  public fun toBuilder(): Builder = Builder() .setEnabled(enabled) .setIconColor(iconColor)\n      .setPosition(position) .setMarginLeft(marginLeft) .setMarginTop(marginTop)\n      .setMarginRight(marginRight) .setMarginBottom(marginBottom) .setClickable(clickable)\n\n  /**\n   * Composes and builds a [AttributionSettings] object.\n   *\n   * This is a concrete implementation of the builder design pattern.\n   */\n  public class Builder {\n    /**\n     * Whether the attribution icon is visible on the map. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var enabled: Boolean = true\n\n    /**\n     * Defines text color of the attribution icon. Default value: \"#FF1E8CAB\".\n     */\n    @set:JvmSynthetic\n    public var iconColor: Int = Color.parseColor(\"#FF1E8CAB\")\n\n    /**\n     * Defines where the attribution icon is positioned on the map Default value: \"bottom-left\".\n     */\n    @set:JvmSynthetic\n    public var position: Int = Gravity.BOTTOM or Gravity.START\n\n    /**\n     * Defines the margin to the left that the attribution icon honors. Default value: 92. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginLeft: Float = 92f\n\n    /**\n     * Defines the margin to the top that the attribution icon honors. Default value: 4. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginTop: Float = 4f\n\n    /**\n     * Defines the margin to the right that the attribution icon honors. Default value: 4. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginRight: Float = 4f\n\n    /**\n     * Defines the margin to the bottom that the attribution icon honors. Default value: 4. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginBottom: Float = 4f\n\n    /**\n     * Whether the attribution can be clicked and click events can be registered. Default value:\n     * true.\n     */\n    @set:JvmSynthetic\n    public var clickable: Boolean = true\n\n    /**\n     * Setter for enabled: whether the attribution icon is visible on the map. Default value: true.\n     *\n     * @param enabled\n     * @return Builder\n     */\n    public fun setEnabled(enabled: Boolean): Builder {\n      this.enabled = enabled\n      return this\n    }\n\n    /**\n     * Setter for iconColor: defines text color of the attribution icon. Default value: \"#FF1E8CAB\".\n     *\n     * @param iconColor\n     * @return Builder\n     */\n    public fun setIconColor(iconColor: Int): Builder {\n      this.iconColor = iconColor\n      return this\n    }\n\n    /**\n     * Setter for position: defines where the attribution icon is positioned on the map Default\n     * value: \"bottom-left\".\n     *\n     * @param position\n     * @return Builder\n     */\n    public fun setPosition(position: Int): Builder {\n      this.position = position\n      return this\n    }\n\n    /**\n     * Setter for marginLeft: defines the margin to the left that the attribution icon honors.\n     * Default value: 92. This property is specified in pixels.\n     *\n     * @param marginLeft\n     * @return Builder\n     */\n    public fun setMarginLeft(marginLeft: Float): Builder {\n      this.marginLeft = marginLeft\n      return this\n    }\n\n    /**\n     * Setter for marginTop: defines the margin to the top that the attribution icon honors. Default\n     * value: 4. This property is specified in pixels.\n     *\n     * @param marginTop\n     * @return Builder\n     */\n    public fun setMarginTop(marginTop: Float): Builder {\n      this.marginTop = marginTop\n      return this\n    }\n\n    /**\n     * Setter for marginRight: defines the margin to the right that the attribution icon honors.\n     * Default value: 4. This property is specified in pixels.\n     *\n     * @param marginRight\n     * @return Builder\n     */\n    public fun setMarginRight(marginRight: Float): Builder {\n      this.marginRight = marginRight\n      return this\n    }\n\n    /**\n     * Setter for marginBottom: defines the margin to the bottom that the attribution icon honors.\n     * Default value: 4. This property is specified in pixels.\n     *\n     * @param marginBottom\n     * @return Builder\n     */\n    public fun setMarginBottom(marginBottom: Float): Builder {\n      this.marginBottom = marginBottom\n      return this\n    }\n\n    /**\n     * Setter for clickable: whether the attribution can be clicked and click events can be\n     * registered. Default value: true.\n     *\n     * @param clickable\n     * @return Builder\n     */\n    public fun setClickable(clickable: Boolean): Builder {\n      this.clickable = clickable\n      return this\n    }\n\n    /**\n     * Returns a [AttributionSettings] reference to the object being constructed by the builder.\n     *\n     * @return AttributionSettings\n     */\n    public fun build(): AttributionSettings = AttributionSettings(enabled, iconColor, position,\n        marginLeft, marginTop, marginRight, marginBottom, clickable)\n  }\n}\n\n/**\n * Creates a [AttributionSettings] through a DSL-style builder.\n *\n * @param initializer the initialisation block\n * @return AttributionSettings\n */\n@JvmSynthetic\npublic fun AttributionSettings(initializer: AttributionSettings.Builder.() -> Unit):\n    AttributionSettings = AttributionSettings.Builder().apply(initializer).build()\n"
  },
  {
    "path": "sdk-base/src/main/ksp/com/mapbox/maps/plugin/compass/generated/CompassSettings.kt",
    "content": "@file:Suppress(\"RedundantVisibilityModifier\")\n\npackage com.mapbox.maps.plugin.compass.generated\n\nimport android.os.Parcelable\nimport android.view.Gravity\nimport com.mapbox.maps.ImageHolder\nimport java.util.Objects\nimport kotlin.Any\nimport kotlin.Boolean\nimport kotlin.Float\nimport kotlin.Int\nimport kotlin.Unit\nimport kotlin.jvm.JvmSynthetic\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Shows the compass on the map.\n */\n@Parcelize\npublic class CompassSettings private constructor(\n  /**\n   * Whether the compass is visible on the map. Default value: true.\n   */\n  public val enabled: Boolean,\n  /**\n   * Defines where the compass is positioned on the map Default value: \"top-right\".\n   */\n  public val position: Int,\n  /**\n   * Defines the margin to the left that the compass icon honors. Default value: 4. This property is\n   * specified in pixels.\n   */\n  public val marginLeft: Float,\n  /**\n   * Defines the margin to the top that the compass icon honors. Default value: 4. This property is\n   * specified in pixels.\n   */\n  public val marginTop: Float,\n  /**\n   * Defines the margin to the right that the compass icon honors. Default value: 4. This property\n   * is specified in pixels.\n   */\n  public val marginRight: Float,\n  /**\n   * Defines the margin to the bottom that the compass icon honors. Default value: 4. This property\n   * is specified in pixels.\n   */\n  public val marginBottom: Float,\n  /**\n   * The alpha channel value of the compass image Default value: 1.\n   */\n  public val opacity: Float,\n  /**\n   * The clockwise rotation value in degrees of the compass. Default value: 0.\n   */\n  public val rotation: Float,\n  /**\n   * Whether the compass is displayed. Default value: true.\n   */\n  public val visibility: Boolean,\n  /**\n   * Whether the compass fades out to invisible when facing north direction. Default value: true.\n   */\n  public val fadeWhenFacingNorth: Boolean,\n  /**\n   * Whether the compass can be clicked and click events can be registered. Default value: true.\n   */\n  public val clickable: Boolean,\n  /**\n   * The compass image, the visual representation of the compass.\n   */\n  public val image: ImageHolder?\n) : Parcelable {\n  /**\n   * Overloaded toString function.\n   */\n  public override fun toString() = \"\"\"CompassSettings(enabled=$enabled, position=$position,\n      marginLeft=$marginLeft, marginTop=$marginTop, marginRight=$marginRight,\n      marginBottom=$marginBottom, opacity=$opacity, rotation=$rotation, visibility=$visibility,\n      fadeWhenFacingNorth=$fadeWhenFacingNorth, clickable=$clickable, image=$image)\"\"\".trimIndent()\n\n  /**\n   * Overloaded equals function.\n   */\n  public override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as CompassSettings\n    return enabled == other.enabled && position == other.position &&\n        marginLeft.compareTo(other.marginLeft) == 0 && marginTop.compareTo(other.marginTop) == 0 &&\n        marginRight.compareTo(other.marginRight) == 0 &&\n        marginBottom.compareTo(other.marginBottom) == 0 && opacity.compareTo(other.opacity) == 0 &&\n        rotation.compareTo(other.rotation) == 0 && visibility == other.visibility &&\n        fadeWhenFacingNorth == other.fadeWhenFacingNorth && clickable == other.clickable &&\n        image == other.image\n  }\n\n  /**\n   * Overloaded hashCode function based on all class properties.\n   */\n  public override fun hashCode(): Int = Objects.hash(enabled, position, marginLeft, marginTop,\n      marginRight, marginBottom, opacity, rotation, visibility, fadeWhenFacingNorth, clickable,\n      image)\n\n  /**\n   * Convert to Builder allowing to change class properties.\n   */\n  public fun toBuilder(): Builder = Builder() .setEnabled(enabled) .setPosition(position)\n      .setMarginLeft(marginLeft) .setMarginTop(marginTop) .setMarginRight(marginRight)\n      .setMarginBottom(marginBottom) .setOpacity(opacity) .setRotation(rotation)\n      .setVisibility(visibility) .setFadeWhenFacingNorth(fadeWhenFacingNorth)\n      .setClickable(clickable) .setImage(image)\n\n  /**\n   * Composes and builds a [CompassSettings] object.\n   *\n   * This is a concrete implementation of the builder design pattern.\n   */\n  public class Builder {\n    /**\n     * Whether the compass is visible on the map. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var enabled: Boolean = true\n\n    /**\n     * Defines where the compass is positioned on the map Default value: \"top-right\".\n     */\n    @set:JvmSynthetic\n    public var position: Int = Gravity.TOP or Gravity.END\n\n    /**\n     * Defines the margin to the left that the compass icon honors. Default value: 4. This property\n     * is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginLeft: Float = 4f\n\n    /**\n     * Defines the margin to the top that the compass icon honors. Default value: 4. This property\n     * is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginTop: Float = 4f\n\n    /**\n     * Defines the margin to the right that the compass icon honors. Default value: 4. This property\n     * is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginRight: Float = 4f\n\n    /**\n     * Defines the margin to the bottom that the compass icon honors. Default value: 4. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginBottom: Float = 4f\n\n    /**\n     * The alpha channel value of the compass image Default value: 1.\n     */\n    @set:JvmSynthetic\n    public var opacity: Float = 1f\n\n    /**\n     * The clockwise rotation value in degrees of the compass. Default value: 0.\n     */\n    @set:JvmSynthetic\n    public var rotation: Float = 0f\n\n    /**\n     * Whether the compass is displayed. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var visibility: Boolean = true\n\n    /**\n     * Whether the compass fades out to invisible when facing north direction. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var fadeWhenFacingNorth: Boolean = true\n\n    /**\n     * Whether the compass can be clicked and click events can be registered. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var clickable: Boolean = true\n\n    /**\n     * The compass image, the visual representation of the compass.\n     */\n    @set:JvmSynthetic\n    public var image: ImageHolder? = null\n\n    /**\n     * Setter for enabled: whether the compass is visible on the map. Default value: true.\n     *\n     * @param enabled\n     * @return Builder\n     */\n    public fun setEnabled(enabled: Boolean): Builder {\n      this.enabled = enabled\n      return this\n    }\n\n    /**\n     * Setter for position: defines where the compass is positioned on the map Default value:\n     * \"top-right\".\n     *\n     * @param position\n     * @return Builder\n     */\n    public fun setPosition(position: Int): Builder {\n      this.position = position\n      return this\n    }\n\n    /**\n     * Setter for marginLeft: defines the margin to the left that the compass icon honors. Default\n     * value: 4. This property is specified in pixels.\n     *\n     * @param marginLeft\n     * @return Builder\n     */\n    public fun setMarginLeft(marginLeft: Float): Builder {\n      this.marginLeft = marginLeft\n      return this\n    }\n\n    /**\n     * Setter for marginTop: defines the margin to the top that the compass icon honors. Default\n     * value: 4. This property is specified in pixels.\n     *\n     * @param marginTop\n     * @return Builder\n     */\n    public fun setMarginTop(marginTop: Float): Builder {\n      this.marginTop = marginTop\n      return this\n    }\n\n    /**\n     * Setter for marginRight: defines the margin to the right that the compass icon honors. Default\n     * value: 4. This property is specified in pixels.\n     *\n     * @param marginRight\n     * @return Builder\n     */\n    public fun setMarginRight(marginRight: Float): Builder {\n      this.marginRight = marginRight\n      return this\n    }\n\n    /**\n     * Setter for marginBottom: defines the margin to the bottom that the compass icon honors.\n     * Default value: 4. This property is specified in pixels.\n     *\n     * @param marginBottom\n     * @return Builder\n     */\n    public fun setMarginBottom(marginBottom: Float): Builder {\n      this.marginBottom = marginBottom\n      return this\n    }\n\n    /**\n     * Setter for opacity: the alpha channel value of the compass image Default value: 1.\n     *\n     * @param opacity\n     * @return Builder\n     */\n    public fun setOpacity(opacity: Float): Builder {\n      this.opacity = opacity\n      return this\n    }\n\n    /**\n     * Setter for rotation: the clockwise rotation value in degrees of the compass. Default value:\n     * 0.\n     *\n     * @param rotation\n     * @return Builder\n     */\n    public fun setRotation(rotation: Float): Builder {\n      this.rotation = rotation\n      return this\n    }\n\n    /**\n     * Setter for visibility: whether the compass is displayed. Default value: true.\n     *\n     * @param visibility\n     * @return Builder\n     */\n    public fun setVisibility(visibility: Boolean): Builder {\n      this.visibility = visibility\n      return this\n    }\n\n    /**\n     * Setter for fadeWhenFacingNorth: whether the compass fades out to invisible when facing north\n     * direction. Default value: true.\n     *\n     * @param fadeWhenFacingNorth\n     * @return Builder\n     */\n    public fun setFadeWhenFacingNorth(fadeWhenFacingNorth: Boolean): Builder {\n      this.fadeWhenFacingNorth = fadeWhenFacingNorth\n      return this\n    }\n\n    /**\n     * Setter for clickable: whether the compass can be clicked and click events can be registered.\n     * Default value: true.\n     *\n     * @param clickable\n     * @return Builder\n     */\n    public fun setClickable(clickable: Boolean): Builder {\n      this.clickable = clickable\n      return this\n    }\n\n    /**\n     * Setter for image: the compass image, the visual representation of the compass.\n     *\n     * @param image\n     * @return Builder\n     */\n    public fun setImage(image: ImageHolder?): Builder {\n      this.image = image\n      return this\n    }\n\n    /**\n     * Returns a [CompassSettings] reference to the object being constructed by the builder.\n     *\n     * @return CompassSettings\n     */\n    public fun build(): CompassSettings = CompassSettings(enabled, position, marginLeft, marginTop,\n        marginRight, marginBottom, opacity, rotation, visibility, fadeWhenFacingNorth, clickable,\n        image)\n  }\n}\n\n/**\n * Creates a [CompassSettings] through a DSL-style builder.\n *\n * @param initializer the initialisation block\n * @return CompassSettings\n */\n@JvmSynthetic\npublic fun CompassSettings(initializer: CompassSettings.Builder.() -> Unit): CompassSettings =\n    CompassSettings.Builder().apply(initializer).build()\n"
  },
  {
    "path": "sdk-base/src/main/ksp/com/mapbox/maps/plugin/gestures/generated/GesturesSettings.kt",
    "content": "@file:Suppress(\"RedundantVisibilityModifier\")\n\npackage com.mapbox.maps.plugin.gestures.generated\n\nimport android.os.Parcelable\nimport com.mapbox.maps.ScreenCoordinate\nimport com.mapbox.maps.plugin.ScrollMode\nimport java.util.Objects\nimport kotlin.Any\nimport kotlin.Boolean\nimport kotlin.Float\nimport kotlin.Int\nimport kotlin.Unit\nimport kotlin.jvm.JvmSynthetic\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Gesture configuration allows to control the user touch interaction.\n */\n@Parcelize\npublic class GesturesSettings private constructor(\n  /**\n   * Whether the rotate gesture is enabled. Default value: true.\n   */\n  public val rotateEnabled: Boolean,\n  /**\n   * Whether the pinch to zoom gesture is enabled. Default value: true.\n   */\n  public val pinchToZoomEnabled: Boolean,\n  /**\n   * Whether the single-touch scroll gesture is enabled. Default value: true.\n   */\n  public val scrollEnabled: Boolean,\n  /**\n   * Whether rotation is enabled for the pinch to zoom gesture. Default value: true.\n   */\n  public val simultaneousRotateAndPinchToZoomEnabled: Boolean,\n  /**\n   * Whether the pitch gesture is enabled. Default value: true.\n   */\n  public val pitchEnabled: Boolean,\n  /**\n   * Configures the directions in which the map is allowed to move during a scroll gesture. Default\n   * value: \"horizontal-and-vertical\".\n   */\n  public val scrollMode: ScrollMode,\n  /**\n   * Whether double tapping the map with one touch results in a zoom-in animation. Default value:\n   * true.\n   */\n  public val doubleTapToZoomInEnabled: Boolean,\n  /**\n   * Whether single tapping the map with two touches results in a zoom-out animation. Default value:\n   * true.\n   */\n  public val doubleTouchToZoomOutEnabled: Boolean,\n  /**\n   * Whether the quick zoom gesture is enabled. Default value: true.\n   */\n  public val quickZoomEnabled: Boolean,\n  /**\n   * By default, gestures rotate and zoom around the center of the gesture. Set this property to\n   * rotate and zoom around a fixed point instead.\n   */\n  public val focalPoint: ScreenCoordinate?,\n  /**\n   * Whether a deceleration animation following a pinch-to-zoom gesture is enabled. True by default.\n   * Default value: true.\n   */\n  public val pinchToZoomDecelerationEnabled: Boolean,\n  /**\n   * Whether a deceleration animation following a rotate gesture is enabled. True by default.\n   * Default value: true.\n   */\n  public val rotateDecelerationEnabled: Boolean,\n  /**\n   * Whether a deceleration animation following a scroll gesture is enabled. True by default.\n   * Default value: true.\n   */\n  public val scrollDecelerationEnabled: Boolean,\n  /**\n   * Whether rotate threshold increases when pinching to zoom. true by default. Default value: true.\n   */\n  public val increaseRotateThresholdWhenPinchingToZoom: Boolean,\n  /**\n   * Whether pinch to zoom threshold increases when rotating. true by default. Default value: true.\n   */\n  public val increasePinchToZoomThresholdWhenRotating: Boolean,\n  /**\n   * The amount by which the zoom level increases or decreases during a double-tap-to-zoom-in or\n   * double-touch-to-zoom-out gesture. 1.0 by default. Must be positive. Default value: 1.\n   */\n  public val zoomAnimationAmount: Float,\n  /**\n   * Whether pan is enabled for the pinch gesture. Default value: true.\n   */\n  public val pinchScrollEnabled: Boolean\n) : Parcelable {\n  /**\n   * Overloaded toString function.\n   */\n  public override fun toString() = \"\"\"GesturesSettings(rotateEnabled=$rotateEnabled,\n      pinchToZoomEnabled=$pinchToZoomEnabled, scrollEnabled=$scrollEnabled,\n      simultaneousRotateAndPinchToZoomEnabled=$simultaneousRotateAndPinchToZoomEnabled,\n      pitchEnabled=$pitchEnabled, scrollMode=$scrollMode,\n      doubleTapToZoomInEnabled=$doubleTapToZoomInEnabled,\n      doubleTouchToZoomOutEnabled=$doubleTouchToZoomOutEnabled, quickZoomEnabled=$quickZoomEnabled,\n      focalPoint=$focalPoint, pinchToZoomDecelerationEnabled=$pinchToZoomDecelerationEnabled,\n      rotateDecelerationEnabled=$rotateDecelerationEnabled,\n      scrollDecelerationEnabled=$scrollDecelerationEnabled,\n      increaseRotateThresholdWhenPinchingToZoom=$increaseRotateThresholdWhenPinchingToZoom,\n      increasePinchToZoomThresholdWhenRotating=$increasePinchToZoomThresholdWhenRotating,\n      zoomAnimationAmount=$zoomAnimationAmount,\n      pinchScrollEnabled=$pinchScrollEnabled)\"\"\".trimIndent()\n\n  /**\n   * Overloaded equals function.\n   */\n  public override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as GesturesSettings\n    return rotateEnabled == other.rotateEnabled && pinchToZoomEnabled == other.pinchToZoomEnabled &&\n        scrollEnabled == other.scrollEnabled &&\n        simultaneousRotateAndPinchToZoomEnabled == other.simultaneousRotateAndPinchToZoomEnabled &&\n        pitchEnabled == other.pitchEnabled && scrollMode == other.scrollMode &&\n        doubleTapToZoomInEnabled == other.doubleTapToZoomInEnabled &&\n        doubleTouchToZoomOutEnabled == other.doubleTouchToZoomOutEnabled &&\n        quickZoomEnabled == other.quickZoomEnabled && focalPoint == other.focalPoint &&\n        pinchToZoomDecelerationEnabled == other.pinchToZoomDecelerationEnabled &&\n        rotateDecelerationEnabled == other.rotateDecelerationEnabled &&\n        scrollDecelerationEnabled == other.scrollDecelerationEnabled &&\n        increaseRotateThresholdWhenPinchingToZoom == other.increaseRotateThresholdWhenPinchingToZoom &&\n        increasePinchToZoomThresholdWhenRotating == other.increasePinchToZoomThresholdWhenRotating &&\n        zoomAnimationAmount.compareTo(other.zoomAnimationAmount) == 0 &&\n        pinchScrollEnabled == other.pinchScrollEnabled\n  }\n\n  /**\n   * Overloaded hashCode function based on all class properties.\n   */\n  public override fun hashCode(): Int = Objects.hash(rotateEnabled, pinchToZoomEnabled,\n      scrollEnabled, simultaneousRotateAndPinchToZoomEnabled, pitchEnabled, scrollMode,\n      doubleTapToZoomInEnabled, doubleTouchToZoomOutEnabled, quickZoomEnabled, focalPoint,\n      pinchToZoomDecelerationEnabled, rotateDecelerationEnabled, scrollDecelerationEnabled,\n      increaseRotateThresholdWhenPinchingToZoom, increasePinchToZoomThresholdWhenRotating,\n      zoomAnimationAmount, pinchScrollEnabled)\n\n  /**\n   * Convert to Builder allowing to change class properties.\n   */\n  public fun toBuilder(): Builder = Builder() .setRotateEnabled(rotateEnabled)\n      .setPinchToZoomEnabled(pinchToZoomEnabled) .setScrollEnabled(scrollEnabled)\n      .setSimultaneousRotateAndPinchToZoomEnabled(simultaneousRotateAndPinchToZoomEnabled)\n      .setPitchEnabled(pitchEnabled) .setScrollMode(scrollMode)\n      .setDoubleTapToZoomInEnabled(doubleTapToZoomInEnabled)\n      .setDoubleTouchToZoomOutEnabled(doubleTouchToZoomOutEnabled)\n      .setQuickZoomEnabled(quickZoomEnabled) .setFocalPoint(focalPoint)\n      .setPinchToZoomDecelerationEnabled(pinchToZoomDecelerationEnabled)\n      .setRotateDecelerationEnabled(rotateDecelerationEnabled)\n      .setScrollDecelerationEnabled(scrollDecelerationEnabled)\n      .setIncreaseRotateThresholdWhenPinchingToZoom(increaseRotateThresholdWhenPinchingToZoom)\n      .setIncreasePinchToZoomThresholdWhenRotating(increasePinchToZoomThresholdWhenRotating)\n      .setZoomAnimationAmount(zoomAnimationAmount) .setPinchScrollEnabled(pinchScrollEnabled)\n\n  /**\n   * Composes and builds a [GesturesSettings] object.\n   *\n   * This is a concrete implementation of the builder design pattern.\n   */\n  public class Builder {\n    /**\n     * Whether the rotate gesture is enabled. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var rotateEnabled: Boolean = true\n\n    /**\n     * Whether the pinch to zoom gesture is enabled. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var pinchToZoomEnabled: Boolean = true\n\n    /**\n     * Whether the single-touch scroll gesture is enabled. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var scrollEnabled: Boolean = true\n\n    /**\n     * Whether rotation is enabled for the pinch to zoom gesture. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var simultaneousRotateAndPinchToZoomEnabled: Boolean = true\n\n    /**\n     * Whether the pitch gesture is enabled. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var pitchEnabled: Boolean = true\n\n    /**\n     * Configures the directions in which the map is allowed to move during a scroll gesture.\n     * Default value: \"horizontal-and-vertical\".\n     */\n    @set:JvmSynthetic\n    public var scrollMode: ScrollMode = ScrollMode.HORIZONTAL_AND_VERTICAL\n\n    /**\n     * Whether double tapping the map with one touch results in a zoom-in animation. Default value:\n     * true.\n     */\n    @set:JvmSynthetic\n    public var doubleTapToZoomInEnabled: Boolean = true\n\n    /**\n     * Whether single tapping the map with two touches results in a zoom-out animation. Default\n     * value: true.\n     */\n    @set:JvmSynthetic\n    public var doubleTouchToZoomOutEnabled: Boolean = true\n\n    /**\n     * Whether the quick zoom gesture is enabled. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var quickZoomEnabled: Boolean = true\n\n    /**\n     * By default, gestures rotate and zoom around the center of the gesture. Set this property to\n     * rotate and zoom around a fixed point instead.\n     */\n    @set:JvmSynthetic\n    public var focalPoint: ScreenCoordinate? = null\n\n    /**\n     * Whether a deceleration animation following a pinch-to-zoom gesture is enabled. True by\n     * default. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var pinchToZoomDecelerationEnabled: Boolean = true\n\n    /**\n     * Whether a deceleration animation following a rotate gesture is enabled. True by default.\n     * Default value: true.\n     */\n    @set:JvmSynthetic\n    public var rotateDecelerationEnabled: Boolean = true\n\n    /**\n     * Whether a deceleration animation following a scroll gesture is enabled. True by default.\n     * Default value: true.\n     */\n    @set:JvmSynthetic\n    public var scrollDecelerationEnabled: Boolean = true\n\n    /**\n     * Whether rotate threshold increases when pinching to zoom. true by default. Default value:\n     * true.\n     */\n    @set:JvmSynthetic\n    public var increaseRotateThresholdWhenPinchingToZoom: Boolean = true\n\n    /**\n     * Whether pinch to zoom threshold increases when rotating. true by default. Default value:\n     * true.\n     */\n    @set:JvmSynthetic\n    public var increasePinchToZoomThresholdWhenRotating: Boolean = true\n\n    /**\n     * The amount by which the zoom level increases or decreases during a double-tap-to-zoom-in or\n     * double-touch-to-zoom-out gesture. 1.0 by default. Must be positive. Default value: 1.\n     */\n    @set:JvmSynthetic\n    public var zoomAnimationAmount: Float = 1f\n\n    /**\n     * Whether pan is enabled for the pinch gesture. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var pinchScrollEnabled: Boolean = true\n\n    /**\n     * Setter for rotateEnabled: whether the rotate gesture is enabled. Default value: true.\n     *\n     * @param rotateEnabled\n     * @return Builder\n     */\n    public fun setRotateEnabled(rotateEnabled: Boolean): Builder {\n      this.rotateEnabled = rotateEnabled\n      return this\n    }\n\n    /**\n     * Setter for pinchToZoomEnabled: whether the pinch to zoom gesture is enabled. Default value:\n     * true.\n     *\n     * @param pinchToZoomEnabled\n     * @return Builder\n     */\n    public fun setPinchToZoomEnabled(pinchToZoomEnabled: Boolean): Builder {\n      this.pinchToZoomEnabled = pinchToZoomEnabled\n      return this\n    }\n\n    /**\n     * Setter for scrollEnabled: whether the single-touch scroll gesture is enabled. Default value:\n     * true.\n     *\n     * @param scrollEnabled\n     * @return Builder\n     */\n    public fun setScrollEnabled(scrollEnabled: Boolean): Builder {\n      this.scrollEnabled = scrollEnabled\n      return this\n    }\n\n    /**\n     * Setter for simultaneousRotateAndPinchToZoomEnabled: whether rotation is enabled for the pinch\n     * to zoom gesture. Default value: true.\n     *\n     * @param simultaneousRotateAndPinchToZoomEnabled\n     * @return Builder\n     */\n    public\n        fun setSimultaneousRotateAndPinchToZoomEnabled(simultaneousRotateAndPinchToZoomEnabled: Boolean):\n        Builder {\n      this.simultaneousRotateAndPinchToZoomEnabled = simultaneousRotateAndPinchToZoomEnabled\n      return this\n    }\n\n    /**\n     * Setter for pitchEnabled: whether the pitch gesture is enabled. Default value: true.\n     *\n     * @param pitchEnabled\n     * @return Builder\n     */\n    public fun setPitchEnabled(pitchEnabled: Boolean): Builder {\n      this.pitchEnabled = pitchEnabled\n      return this\n    }\n\n    /**\n     * Setter for scrollMode: configures the directions in which the map is allowed to move during a\n     * scroll gesture. Default value: \"horizontal-and-vertical\".\n     *\n     * @param scrollMode\n     * @return Builder\n     */\n    public fun setScrollMode(scrollMode: ScrollMode): Builder {\n      this.scrollMode = scrollMode\n      return this\n    }\n\n    /**\n     * Setter for doubleTapToZoomInEnabled: whether double tapping the map with one touch results in\n     * a zoom-in animation. Default value: true.\n     *\n     * @param doubleTapToZoomInEnabled\n     * @return Builder\n     */\n    public fun setDoubleTapToZoomInEnabled(doubleTapToZoomInEnabled: Boolean): Builder {\n      this.doubleTapToZoomInEnabled = doubleTapToZoomInEnabled\n      return this\n    }\n\n    /**\n     * Setter for doubleTouchToZoomOutEnabled: whether single tapping the map with two touches\n     * results in a zoom-out animation. Default value: true.\n     *\n     * @param doubleTouchToZoomOutEnabled\n     * @return Builder\n     */\n    public fun setDoubleTouchToZoomOutEnabled(doubleTouchToZoomOutEnabled: Boolean): Builder {\n      this.doubleTouchToZoomOutEnabled = doubleTouchToZoomOutEnabled\n      return this\n    }\n\n    /**\n     * Setter for quickZoomEnabled: whether the quick zoom gesture is enabled. Default value: true.\n     *\n     * @param quickZoomEnabled\n     * @return Builder\n     */\n    public fun setQuickZoomEnabled(quickZoomEnabled: Boolean): Builder {\n      this.quickZoomEnabled = quickZoomEnabled\n      return this\n    }\n\n    /**\n     * Setter for focalPoint: by default, gestures rotate and zoom around the center of the gesture.\n     * Set this property to rotate and zoom around a fixed point instead.\n     *\n     * @param focalPoint\n     * @return Builder\n     */\n    public fun setFocalPoint(focalPoint: ScreenCoordinate?): Builder {\n      this.focalPoint = focalPoint\n      return this\n    }\n\n    /**\n     * Setter for pinchToZoomDecelerationEnabled: whether a deceleration animation following a\n     * pinch-to-zoom gesture is enabled. True by default. Default value: true.\n     *\n     * @param pinchToZoomDecelerationEnabled\n     * @return Builder\n     */\n    public fun setPinchToZoomDecelerationEnabled(pinchToZoomDecelerationEnabled: Boolean): Builder {\n      this.pinchToZoomDecelerationEnabled = pinchToZoomDecelerationEnabled\n      return this\n    }\n\n    /**\n     * Setter for rotateDecelerationEnabled: whether a deceleration animation following a rotate\n     * gesture is enabled. True by default. Default value: true.\n     *\n     * @param rotateDecelerationEnabled\n     * @return Builder\n     */\n    public fun setRotateDecelerationEnabled(rotateDecelerationEnabled: Boolean): Builder {\n      this.rotateDecelerationEnabled = rotateDecelerationEnabled\n      return this\n    }\n\n    /**\n     * Setter for scrollDecelerationEnabled: whether a deceleration animation following a scroll\n     * gesture is enabled. True by default. Default value: true.\n     *\n     * @param scrollDecelerationEnabled\n     * @return Builder\n     */\n    public fun setScrollDecelerationEnabled(scrollDecelerationEnabled: Boolean): Builder {\n      this.scrollDecelerationEnabled = scrollDecelerationEnabled\n      return this\n    }\n\n    /**\n     * Setter for increaseRotateThresholdWhenPinchingToZoom: whether rotate threshold increases when\n     * pinching to zoom. true by default. Default value: true.\n     *\n     * @param increaseRotateThresholdWhenPinchingToZoom\n     * @return Builder\n     */\n    public\n        fun setIncreaseRotateThresholdWhenPinchingToZoom(increaseRotateThresholdWhenPinchingToZoom: Boolean):\n        Builder {\n      this.increaseRotateThresholdWhenPinchingToZoom = increaseRotateThresholdWhenPinchingToZoom\n      return this\n    }\n\n    /**\n     * Setter for increasePinchToZoomThresholdWhenRotating: whether pinch to zoom threshold\n     * increases when rotating. true by default. Default value: true.\n     *\n     * @param increasePinchToZoomThresholdWhenRotating\n     * @return Builder\n     */\n    public\n        fun setIncreasePinchToZoomThresholdWhenRotating(increasePinchToZoomThresholdWhenRotating: Boolean):\n        Builder {\n      this.increasePinchToZoomThresholdWhenRotating = increasePinchToZoomThresholdWhenRotating\n      return this\n    }\n\n    /**\n     * Setter for zoomAnimationAmount: the amount by which the zoom level increases or decreases\n     * during a double-tap-to-zoom-in or double-touch-to-zoom-out gesture. 1.0 by default. Must be\n     * positive. Default value: 1.\n     *\n     * @param zoomAnimationAmount\n     * @return Builder\n     */\n    public fun setZoomAnimationAmount(zoomAnimationAmount: Float): Builder {\n      this.zoomAnimationAmount = zoomAnimationAmount\n      return this\n    }\n\n    /**\n     * Setter for pinchScrollEnabled: whether pan is enabled for the pinch gesture. Default value:\n     * true.\n     *\n     * @param pinchScrollEnabled\n     * @return Builder\n     */\n    public fun setPinchScrollEnabled(pinchScrollEnabled: Boolean): Builder {\n      this.pinchScrollEnabled = pinchScrollEnabled\n      return this\n    }\n\n    /**\n     * Returns a [GesturesSettings] reference to the object being constructed by the builder.\n     *\n     * @return GesturesSettings\n     */\n    public fun build(): GesturesSettings = GesturesSettings(rotateEnabled, pinchToZoomEnabled,\n        scrollEnabled, simultaneousRotateAndPinchToZoomEnabled, pitchEnabled, scrollMode,\n        doubleTapToZoomInEnabled, doubleTouchToZoomOutEnabled, quickZoomEnabled, focalPoint,\n        pinchToZoomDecelerationEnabled, rotateDecelerationEnabled, scrollDecelerationEnabled,\n        increaseRotateThresholdWhenPinchingToZoom, increasePinchToZoomThresholdWhenRotating,\n        zoomAnimationAmount, pinchScrollEnabled)\n  }\n}\n\n/**\n * Creates a [GesturesSettings] through a DSL-style builder.\n *\n * @param initializer the initialisation block\n * @return GesturesSettings\n */\n@JvmSynthetic\npublic fun GesturesSettings(initializer: GesturesSettings.Builder.() -> Unit): GesturesSettings =\n    GesturesSettings.Builder().apply(initializer).build()\n"
  },
  {
    "path": "sdk-base/src/main/ksp/com/mapbox/maps/plugin/indoorselector/generated/IndoorSelectorSettings.kt",
    "content": "@file:Suppress(\"RedundantVisibilityModifier\")\n\npackage com.mapbox.maps.plugin.indoorselector.generated\n\nimport android.os.Parcelable\nimport android.view.Gravity\nimport com.mapbox.maps.MapboxExperimental\nimport java.util.Objects\nimport kotlin.Any\nimport kotlin.Boolean\nimport kotlin.Float\nimport kotlin.Int\nimport kotlin.Unit\nimport kotlin.jvm.JvmSynthetic\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Settings for the indoor floor selector.\n */\n@MapboxExperimental\n@Parcelize\npublic class IndoorSelectorSettings private constructor(\n  /**\n   * Whether the indoor selector is visible on the map. Default value: true.\n   */\n  public val enabled: Boolean,\n  /**\n   * Defines where the indoor selector is positioned on the map. Default value: \"top-right\".\n   */\n  public val position: Int,\n  /**\n   * Defines the margin to the left that the indoor selector honors. Default value: 8. This property\n   * is specified in pixels.\n   */\n  public val marginLeft: Float,\n  /**\n   * Defines the margin to the top that the indoor selector honors. Default value: 60. This property\n   * is specified in pixels.\n   */\n  public val marginTop: Float,\n  /**\n   * Defines the margin to the right that the indoor selector honors. Default value: 8. This\n   * property is specified in pixels.\n   */\n  public val marginRight: Float,\n  /**\n   * Defines the margin to the bottom that the indoor selector honors. Default value: 8. This\n   * property is specified in pixels.\n   */\n  public val marginBottom: Float\n) : Parcelable {\n  /**\n   * Overloaded toString function.\n   */\n  public override fun toString() = \"\"\"IndoorSelectorSettings(enabled=$enabled, position=$position,\n      marginLeft=$marginLeft, marginTop=$marginTop, marginRight=$marginRight,\n      marginBottom=$marginBottom)\"\"\".trimIndent()\n\n  /**\n   * Overloaded equals function.\n   */\n  public override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as IndoorSelectorSettings\n    return enabled == other.enabled && position == other.position &&\n        marginLeft.compareTo(other.marginLeft) == 0 && marginTop.compareTo(other.marginTop) == 0 &&\n        marginRight.compareTo(other.marginRight) == 0 &&\n        marginBottom.compareTo(other.marginBottom) == 0\n  }\n\n  /**\n   * Overloaded hashCode function based on all class properties.\n   */\n  public override fun hashCode(): Int = Objects.hash(enabled, position, marginLeft, marginTop,\n      marginRight, marginBottom)\n\n  /**\n   * Convert to Builder allowing to change class properties.\n   */\n  public fun toBuilder(): Builder = Builder() .setEnabled(enabled) .setPosition(position)\n      .setMarginLeft(marginLeft) .setMarginTop(marginTop) .setMarginRight(marginRight)\n      .setMarginBottom(marginBottom)\n\n  /**\n   * Composes and builds a [IndoorSelectorSettings] object.\n   *\n   * This is a concrete implementation of the builder design pattern.\n   */\n  public class Builder {\n    /**\n     * Whether the indoor selector is visible on the map. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var enabled: Boolean = true\n\n    /**\n     * Defines where the indoor selector is positioned on the map. Default value: \"top-right\".\n     */\n    @set:JvmSynthetic\n    public var position: Int = Gravity.TOP or Gravity.END\n\n    /**\n     * Defines the margin to the left that the indoor selector honors. Default value: 8. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginLeft: Float = 8f\n\n    /**\n     * Defines the margin to the top that the indoor selector honors. Default value: 60. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginTop: Float = 60f\n\n    /**\n     * Defines the margin to the right that the indoor selector honors. Default value: 8. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginRight: Float = 8f\n\n    /**\n     * Defines the margin to the bottom that the indoor selector honors. Default value: 8. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginBottom: Float = 8f\n\n    /**\n     * Setter for enabled: whether the indoor selector is visible on the map. Default value: true.\n     *\n     * @param enabled\n     * @return Builder\n     */\n    public fun setEnabled(enabled: Boolean): Builder {\n      this.enabled = enabled\n      return this\n    }\n\n    /**\n     * Setter for position: defines where the indoor selector is positioned on the map. Default\n     * value: \"top-right\".\n     *\n     * @param position\n     * @return Builder\n     */\n    public fun setPosition(position: Int): Builder {\n      this.position = position\n      return this\n    }\n\n    /**\n     * Setter for marginLeft: defines the margin to the left that the indoor selector honors.\n     * Default value: 8. This property is specified in pixels.\n     *\n     * @param marginLeft\n     * @return Builder\n     */\n    public fun setMarginLeft(marginLeft: Float): Builder {\n      this.marginLeft = marginLeft\n      return this\n    }\n\n    /**\n     * Setter for marginTop: defines the margin to the top that the indoor selector honors. Default\n     * value: 60. This property is specified in pixels.\n     *\n     * @param marginTop\n     * @return Builder\n     */\n    public fun setMarginTop(marginTop: Float): Builder {\n      this.marginTop = marginTop\n      return this\n    }\n\n    /**\n     * Setter for marginRight: defines the margin to the right that the indoor selector honors.\n     * Default value: 8. This property is specified in pixels.\n     *\n     * @param marginRight\n     * @return Builder\n     */\n    public fun setMarginRight(marginRight: Float): Builder {\n      this.marginRight = marginRight\n      return this\n    }\n\n    /**\n     * Setter for marginBottom: defines the margin to the bottom that the indoor selector honors.\n     * Default value: 8. This property is specified in pixels.\n     *\n     * @param marginBottom\n     * @return Builder\n     */\n    public fun setMarginBottom(marginBottom: Float): Builder {\n      this.marginBottom = marginBottom\n      return this\n    }\n\n    /**\n     * Returns a [IndoorSelectorSettings] reference to the object being constructed by the builder.\n     *\n     * @return IndoorSelectorSettings\n     */\n    public fun build(): IndoorSelectorSettings = IndoorSelectorSettings(enabled, position,\n        marginLeft, marginTop, marginRight, marginBottom)\n  }\n}\n\n/**\n * Creates a [IndoorSelectorSettings] through a DSL-style builder.\n *\n * @param initializer the initialisation block\n * @return IndoorSelectorSettings\n */\n@JvmSynthetic\npublic fun IndoorSelectorSettings(initializer: IndoorSelectorSettings.Builder.() -> Unit):\n    IndoorSelectorSettings = IndoorSelectorSettings.Builder().apply(initializer).build()\n"
  },
  {
    "path": "sdk-base/src/main/ksp/com/mapbox/maps/plugin/locationcomponent/generated/LocationComponentSettings.kt",
    "content": "@file:Suppress(\"RedundantVisibilityModifier\")\n\npackage com.mapbox.maps.plugin.locationcomponent.generated\n\nimport android.graphics.Color\nimport android.os.Parcelable\nimport com.mapbox.maps.plugin.LocationPuck\nimport com.mapbox.maps.plugin.PuckBearing\nimport java.util.Objects\nimport kotlin.Any\nimport kotlin.Boolean\nimport kotlin.Float\nimport kotlin.Int\nimport kotlin.String\nimport kotlin.Unit\nimport kotlin.jvm.JvmSynthetic\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Shows a location puck on the map.\n */\n@Parcelize\npublic class LocationComponentSettings private constructor(\n  /**\n   * Whether the user location is visible on the map. Default value: false.\n   */\n  public val enabled: Boolean,\n  /**\n   * Whether the location puck is pulsing on the map. Works for 2D location puck only. Default\n   * value: false.\n   */\n  public val pulsingEnabled: Boolean,\n  /**\n   * The color of the pulsing circle. Works for 2D location puck only. Default value: \"#4A90E2\".\n   */\n  public val pulsingColor: Int,\n  /**\n   * The maximum radius of the pulsing circle. Works for 2D location puck only. Note: Setting\n   * [pulsingMaxRadius] to LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY will set the\n   * pulsing circle's maximum radius to follow location accuracy circle. Default value: 10. This\n   * property is specified in pixels.\n   */\n  public val pulsingMaxRadius: Float,\n  /**\n   * Whether show accuracy ring with location puck. Works for 2D location puck only. Default value:\n   * false.\n   */\n  public val showAccuracyRing: Boolean,\n  /**\n   * The color of the accuracy ring. Works for 2D location puck only. Default value: \"#4d89cff0\".\n   */\n  public val accuracyRingColor: Int,\n  /**\n   * The color of the accuracy ring border. Works for 2D location puck only. Default value:\n   * \"#4d89cff0\".\n   */\n  public val accuracyRingBorderColor: Int,\n  /**\n   * Sets the id of the layer that's added above to when placing the component on the map.\n   */\n  public val layerAbove: String?,\n  /**\n   * Sets the id of the layer that's added below to when placing the component on the map.\n   */\n  public val layerBelow: String?,\n  /**\n   * Whether the puck rotates to track the bearing source. Default value: false.\n   */\n  public val puckBearingEnabled: Boolean,\n  /**\n   * The enum controls how the puck is oriented Default value: \"heading\".\n   */\n  public val puckBearing: PuckBearing,\n  /**\n   * The slot this layer is assigned to. If specified, and a slot with that name exists, it will be\n   * placed at that position in the layer order.\n   */\n  public val slot: String?,\n  /**\n   * Defines what the customised look of the location puck. Note that direct changes to the puck\n   * variables won't have any effect, a new puck needs to be set every time.\n   */\n  public val locationPuck: LocationPuck\n) : Parcelable {\n  /**\n   * Overloaded toString function.\n   */\n  public override fun toString() = \"\"\"LocationComponentSettings(enabled=$enabled,\n      pulsingEnabled=$pulsingEnabled, pulsingColor=$pulsingColor,\n      pulsingMaxRadius=$pulsingMaxRadius, showAccuracyRing=$showAccuracyRing,\n      accuracyRingColor=$accuracyRingColor, accuracyRingBorderColor=$accuracyRingBorderColor,\n      layerAbove=$layerAbove, layerBelow=$layerBelow, puckBearingEnabled=$puckBearingEnabled,\n      puckBearing=$puckBearing, slot=$slot, locationPuck=$locationPuck)\"\"\".trimIndent()\n\n  /**\n   * Overloaded equals function.\n   */\n  public override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as LocationComponentSettings\n    return enabled == other.enabled && pulsingEnabled == other.pulsingEnabled &&\n        pulsingColor == other.pulsingColor &&\n        pulsingMaxRadius.compareTo(other.pulsingMaxRadius) == 0 &&\n        showAccuracyRing == other.showAccuracyRing &&\n        accuracyRingColor == other.accuracyRingColor &&\n        accuracyRingBorderColor == other.accuracyRingBorderColor &&\n        layerAbove == other.layerAbove && layerBelow == other.layerBelow &&\n        puckBearingEnabled == other.puckBearingEnabled && puckBearing == other.puckBearing &&\n        slot == other.slot && locationPuck == other.locationPuck\n  }\n\n  /**\n   * Overloaded hashCode function based on all class properties.\n   */\n  public override fun hashCode(): Int = Objects.hash(enabled, pulsingEnabled, pulsingColor,\n      pulsingMaxRadius, showAccuracyRing, accuracyRingColor, accuracyRingBorderColor, layerAbove,\n      layerBelow, puckBearingEnabled, puckBearing, slot, locationPuck)\n\n  /**\n   * Convert to Builder allowing to change class properties.\n   */\n  public fun toBuilder(): Builder = Builder(locationPuck) .setEnabled(enabled)\n      .setPulsingEnabled(pulsingEnabled) .setPulsingColor(pulsingColor)\n      .setPulsingMaxRadius(pulsingMaxRadius) .setShowAccuracyRing(showAccuracyRing)\n      .setAccuracyRingColor(accuracyRingColor) .setAccuracyRingBorderColor(accuracyRingBorderColor)\n      .setLayerAbove(layerAbove) .setLayerBelow(layerBelow)\n      .setPuckBearingEnabled(puckBearingEnabled) .setPuckBearing(puckBearing) .setSlot(slot)\n      .setLocationPuck(locationPuck)\n\n  /**\n   * Composes and builds a [LocationComponentSettings] object.\n   *\n   * This is a concrete implementation of the builder design pattern.\n   */\n  public class Builder(\n    /**\n     * Defines what the customised look of the location puck. Note that direct changes to the puck\n     * variables won't have any effect, a new puck needs to be set every time.\n     */\n    @set:JvmSynthetic\n    public var locationPuck: LocationPuck\n  ) {\n    /**\n     * Whether the user location is visible on the map. Default value: false.\n     */\n    @set:JvmSynthetic\n    public var enabled: Boolean = false\n\n    /**\n     * Whether the location puck is pulsing on the map. Works for 2D location puck only. Default\n     * value: false.\n     */\n    @set:JvmSynthetic\n    public var pulsingEnabled: Boolean = false\n\n    /**\n     * The color of the pulsing circle. Works for 2D location puck only. Default value: \"#4A90E2\".\n     */\n    @set:JvmSynthetic\n    public var pulsingColor: Int = Color.parseColor(\"#4A90E2\")\n\n    /**\n     * The maximum radius of the pulsing circle. Works for 2D location puck only. Note: Setting\n     * [pulsingMaxRadius] to LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY will set the\n     * pulsing circle's maximum radius to follow location accuracy circle. Default value: 10. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var pulsingMaxRadius: Float = 10f\n\n    /**\n     * Whether show accuracy ring with location puck. Works for 2D location puck only. Default\n     * value: false.\n     */\n    @set:JvmSynthetic\n    public var showAccuracyRing: Boolean = false\n\n    /**\n     * The color of the accuracy ring. Works for 2D location puck only. Default value: \"#4d89cff0\".\n     */\n    @set:JvmSynthetic\n    public var accuracyRingColor: Int = Color.parseColor(\"#4d89cff0\")\n\n    /**\n     * The color of the accuracy ring border. Works for 2D location puck only. Default value:\n     * \"#4d89cff0\".\n     */\n    @set:JvmSynthetic\n    public var accuracyRingBorderColor: Int = Color.parseColor(\"#4d89cff0\")\n\n    /**\n     * Sets the id of the layer that's added above to when placing the component on the map.\n     */\n    @set:JvmSynthetic\n    public var layerAbove: String? = null\n\n    /**\n     * Sets the id of the layer that's added below to when placing the component on the map.\n     */\n    @set:JvmSynthetic\n    public var layerBelow: String? = null\n\n    /**\n     * Whether the puck rotates to track the bearing source. Default value: false.\n     */\n    @set:JvmSynthetic\n    public var puckBearingEnabled: Boolean = false\n\n    /**\n     * The enum controls how the puck is oriented Default value: \"heading\".\n     */\n    @set:JvmSynthetic\n    public var puckBearing: PuckBearing = PuckBearing.HEADING\n\n    /**\n     * The slot this layer is assigned to. If specified, and a slot with that name exists, it will\n     * be placed at that position in the layer order.\n     */\n    @set:JvmSynthetic\n    public var slot: String? = null\n\n    /**\n     * Setter for enabled: whether the user location is visible on the map. Default value: false.\n     *\n     * @param enabled\n     * @return Builder\n     */\n    public fun setEnabled(enabled: Boolean): Builder {\n      this.enabled = enabled\n      return this\n    }\n\n    /**\n     * Setter for pulsingEnabled: whether the location puck is pulsing on the map. Works for 2D\n     * location puck only. Default value: false.\n     *\n     * @param pulsingEnabled\n     * @return Builder\n     */\n    public fun setPulsingEnabled(pulsingEnabled: Boolean): Builder {\n      this.pulsingEnabled = pulsingEnabled\n      return this\n    }\n\n    /**\n     * Setter for pulsingColor: the color of the pulsing circle. Works for 2D location puck only.\n     * Default value: \"#4A90E2\".\n     *\n     * @param pulsingColor\n     * @return Builder\n     */\n    public fun setPulsingColor(pulsingColor: Int): Builder {\n      this.pulsingColor = pulsingColor\n      return this\n    }\n\n    /**\n     * Setter for pulsingMaxRadius: the maximum radius of the pulsing circle. Works for 2D location\n     * puck only. Note: Setting [pulsingMaxRadius] to\n     * LocationComponentConstants.PULSING_MAX_RADIUS_FOLLOW_ACCURACY will set the pulsing circle's\n     * maximum radius to follow location accuracy circle. Default value: 10. This property is specified\n     * in pixels.\n     *\n     * @param pulsingMaxRadius\n     * @return Builder\n     */\n    public fun setPulsingMaxRadius(pulsingMaxRadius: Float): Builder {\n      this.pulsingMaxRadius = pulsingMaxRadius\n      return this\n    }\n\n    /**\n     * Setter for showAccuracyRing: whether show accuracy ring with location puck. Works for 2D\n     * location puck only. Default value: false.\n     *\n     * @param showAccuracyRing\n     * @return Builder\n     */\n    public fun setShowAccuracyRing(showAccuracyRing: Boolean): Builder {\n      this.showAccuracyRing = showAccuracyRing\n      return this\n    }\n\n    /**\n     * Setter for accuracyRingColor: the color of the accuracy ring. Works for 2D location puck\n     * only. Default value: \"#4d89cff0\".\n     *\n     * @param accuracyRingColor\n     * @return Builder\n     */\n    public fun setAccuracyRingColor(accuracyRingColor: Int): Builder {\n      this.accuracyRingColor = accuracyRingColor\n      return this\n    }\n\n    /**\n     * Setter for accuracyRingBorderColor: the color of the accuracy ring border. Works for 2D\n     * location puck only. Default value: \"#4d89cff0\".\n     *\n     * @param accuracyRingBorderColor\n     * @return Builder\n     */\n    public fun setAccuracyRingBorderColor(accuracyRingBorderColor: Int): Builder {\n      this.accuracyRingBorderColor = accuracyRingBorderColor\n      return this\n    }\n\n    /**\n     * Setter for layerAbove: sets the id of the layer that's added above to when placing the\n     * component on the map.\n     *\n     * @param layerAbove\n     * @return Builder\n     */\n    public fun setLayerAbove(layerAbove: String?): Builder {\n      this.layerAbove = layerAbove\n      return this\n    }\n\n    /**\n     * Setter for layerBelow: sets the id of the layer that's added below to when placing the\n     * component on the map.\n     *\n     * @param layerBelow\n     * @return Builder\n     */\n    public fun setLayerBelow(layerBelow: String?): Builder {\n      this.layerBelow = layerBelow\n      return this\n    }\n\n    /**\n     * Setter for puckBearingEnabled: whether the puck rotates to track the bearing source. Default\n     * value: false.\n     *\n     * @param puckBearingEnabled\n     * @return Builder\n     */\n    public fun setPuckBearingEnabled(puckBearingEnabled: Boolean): Builder {\n      this.puckBearingEnabled = puckBearingEnabled\n      return this\n    }\n\n    /**\n     * Setter for puckBearing: the enum controls how the puck is oriented Default value: \"heading\".\n     *\n     * @param puckBearing\n     * @return Builder\n     */\n    public fun setPuckBearing(puckBearing: PuckBearing): Builder {\n      this.puckBearing = puckBearing\n      return this\n    }\n\n    /**\n     * Setter for slot: the slot this layer is assigned to. If specified, and a slot with that name\n     * exists, it will be placed at that position in the layer order.\n     *\n     * @param slot\n     * @return Builder\n     */\n    public fun setSlot(slot: String?): Builder {\n      this.slot = slot\n      return this\n    }\n\n    /**\n     * Setter for locationPuck: defines what the customised look of the location puck. Note that\n     * direct changes to the puck variables won't have any effect, a new puck needs to be set every\n     * time.\n     *\n     * @param locationPuck\n     * @return Builder\n     */\n    public fun setLocationPuck(locationPuck: LocationPuck): Builder {\n      this.locationPuck = locationPuck\n      return this\n    }\n\n    /**\n     * Returns a [LocationComponentSettings] reference to the object being constructed by the\n     * builder.\n     *\n     * @return LocationComponentSettings\n     */\n    public fun build(): LocationComponentSettings = LocationComponentSettings(enabled,\n        pulsingEnabled, pulsingColor, pulsingMaxRadius, showAccuracyRing, accuracyRingColor,\n        accuracyRingBorderColor, layerAbove, layerBelow, puckBearingEnabled, puckBearing, slot,\n        locationPuck)\n  }\n}\n\n/**\n * Creates a [LocationComponentSettings] through a DSL-style builder.\n *\n * @param initializer the initialisation block\n * @return LocationComponentSettings\n */\n@JvmSynthetic\npublic fun LocationComponentSettings(locationPuck: LocationPuck,\n    initializer: LocationComponentSettings.Builder.() -> Unit): LocationComponentSettings =\n    LocationComponentSettings.Builder(locationPuck).apply(initializer).build()\n"
  },
  {
    "path": "sdk-base/src/main/ksp/com/mapbox/maps/plugin/logo/generated/LogoSettings.kt",
    "content": "@file:Suppress(\"RedundantVisibilityModifier\")\n\npackage com.mapbox.maps.plugin.logo.generated\n\nimport android.os.Parcelable\nimport android.view.Gravity\nimport java.util.Objects\nimport kotlin.Any\nimport kotlin.Boolean\nimport kotlin.Float\nimport kotlin.Int\nimport kotlin.Unit\nimport kotlin.jvm.JvmSynthetic\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Shows the Mapbox logo on the map.\n */\n@Parcelize\npublic class LogoSettings private constructor(\n  /**\n   * Whether the logo is visible on the map. Default value: true.\n   */\n  public val enabled: Boolean,\n  /**\n   * Defines where the logo is positioned on the map Default value: \"bottom-left\".\n   */\n  public val position: Int,\n  /**\n   * Defines the margin to the left that the attribution icon honors. Default value: 4. This\n   * property is specified in pixels.\n   */\n  public val marginLeft: Float,\n  /**\n   * Defines the margin to the top that the attribution icon honors. Default value: 4. This property\n   * is specified in pixels.\n   */\n  public val marginTop: Float,\n  /**\n   * Defines the margin to the right that the attribution icon honors. Default value: 4. This\n   * property is specified in pixels.\n   */\n  public val marginRight: Float,\n  /**\n   * Defines the margin to the bottom that the attribution icon honors. Default value: 4. This\n   * property is specified in pixels.\n   */\n  public val marginBottom: Float\n) : Parcelable {\n  /**\n   * Overloaded toString function.\n   */\n  public override fun toString() = \"\"\"LogoSettings(enabled=$enabled, position=$position,\n      marginLeft=$marginLeft, marginTop=$marginTop, marginRight=$marginRight,\n      marginBottom=$marginBottom)\"\"\".trimIndent()\n\n  /**\n   * Overloaded equals function.\n   */\n  public override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as LogoSettings\n    return enabled == other.enabled && position == other.position &&\n        marginLeft.compareTo(other.marginLeft) == 0 && marginTop.compareTo(other.marginTop) == 0 &&\n        marginRight.compareTo(other.marginRight) == 0 &&\n        marginBottom.compareTo(other.marginBottom) == 0\n  }\n\n  /**\n   * Overloaded hashCode function based on all class properties.\n   */\n  public override fun hashCode(): Int = Objects.hash(enabled, position, marginLeft, marginTop,\n      marginRight, marginBottom)\n\n  /**\n   * Convert to Builder allowing to change class properties.\n   */\n  public fun toBuilder(): Builder = Builder() .setEnabled(enabled) .setPosition(position)\n      .setMarginLeft(marginLeft) .setMarginTop(marginTop) .setMarginRight(marginRight)\n      .setMarginBottom(marginBottom)\n\n  /**\n   * Composes and builds a [LogoSettings] object.\n   *\n   * This is a concrete implementation of the builder design pattern.\n   */\n  public class Builder {\n    /**\n     * Whether the logo is visible on the map. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var enabled: Boolean = true\n\n    /**\n     * Defines where the logo is positioned on the map Default value: \"bottom-left\".\n     */\n    @set:JvmSynthetic\n    public var position: Int = Gravity.BOTTOM or Gravity.START\n\n    /**\n     * Defines the margin to the left that the attribution icon honors. Default value: 4. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginLeft: Float = 4f\n\n    /**\n     * Defines the margin to the top that the attribution icon honors. Default value: 4. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginTop: Float = 4f\n\n    /**\n     * Defines the margin to the right that the attribution icon honors. Default value: 4. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginRight: Float = 4f\n\n    /**\n     * Defines the margin to the bottom that the attribution icon honors. Default value: 4. This\n     * property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginBottom: Float = 4f\n\n    /**\n     * Setter for enabled: whether the logo is visible on the map. Default value: true.\n     *\n     * @param enabled\n     * @return Builder\n     */\n    public fun setEnabled(enabled: Boolean): Builder {\n      this.enabled = enabled\n      return this\n    }\n\n    /**\n     * Setter for position: defines where the logo is positioned on the map Default value:\n     * \"bottom-left\".\n     *\n     * @param position\n     * @return Builder\n     */\n    public fun setPosition(position: Int): Builder {\n      this.position = position\n      return this\n    }\n\n    /**\n     * Setter for marginLeft: defines the margin to the left that the attribution icon honors.\n     * Default value: 4. This property is specified in pixels.\n     *\n     * @param marginLeft\n     * @return Builder\n     */\n    public fun setMarginLeft(marginLeft: Float): Builder {\n      this.marginLeft = marginLeft\n      return this\n    }\n\n    /**\n     * Setter for marginTop: defines the margin to the top that the attribution icon honors. Default\n     * value: 4. This property is specified in pixels.\n     *\n     * @param marginTop\n     * @return Builder\n     */\n    public fun setMarginTop(marginTop: Float): Builder {\n      this.marginTop = marginTop\n      return this\n    }\n\n    /**\n     * Setter for marginRight: defines the margin to the right that the attribution icon honors.\n     * Default value: 4. This property is specified in pixels.\n     *\n     * @param marginRight\n     * @return Builder\n     */\n    public fun setMarginRight(marginRight: Float): Builder {\n      this.marginRight = marginRight\n      return this\n    }\n\n    /**\n     * Setter for marginBottom: defines the margin to the bottom that the attribution icon honors.\n     * Default value: 4. This property is specified in pixels.\n     *\n     * @param marginBottom\n     * @return Builder\n     */\n    public fun setMarginBottom(marginBottom: Float): Builder {\n      this.marginBottom = marginBottom\n      return this\n    }\n\n    /**\n     * Returns a [LogoSettings] reference to the object being constructed by the builder.\n     *\n     * @return LogoSettings\n     */\n    public fun build(): LogoSettings = LogoSettings(enabled, position, marginLeft, marginTop,\n        marginRight, marginBottom)\n  }\n}\n\n/**\n * Creates a [LogoSettings] through a DSL-style builder.\n *\n * @param initializer the initialisation block\n * @return LogoSettings\n */\n@JvmSynthetic\npublic fun LogoSettings(initializer: LogoSettings.Builder.() -> Unit): LogoSettings =\n    LogoSettings.Builder().apply(initializer).build()\n"
  },
  {
    "path": "sdk-base/src/main/ksp/com/mapbox/maps/plugin/scalebar/generated/ScaleBarSettings.kt",
    "content": "@file:Suppress(\"RedundantVisibilityModifier\")\n\npackage com.mapbox.maps.plugin.scalebar.generated\n\nimport android.graphics.Color\nimport android.os.Parcelable\nimport android.view.Gravity\nimport com.mapbox.maps.plugin.DistanceUnits\nimport kotlinx.parcelize.Parcelize\nimport java.util.Objects\n\n/**\n * Shows the scale bar on the map.\n */\n@Parcelize\npublic class ScaleBarSettings private constructor(\n  /**\n   * Whether the scale is visible on the map. Default value: true.\n   */\n  public val enabled: Boolean,\n  /**\n   * Defines where the scale bar is positioned on the map Default value: \"top-left\".\n   */\n  public val position: Int,\n  /**\n   * Defines the margin to the left that the scale bar honors. Default value: 4. This property is\n   * specified in pixels.\n   */\n  public val marginLeft: Float,\n  /**\n   * Defines the margin to the top that the scale bar honors. Default value: 4. This property is\n   * specified in pixels.\n   */\n  public val marginTop: Float,\n  /**\n   * Defines the margin to the right that the scale bar honors. Default value: 4. This property is\n   * specified in pixels.\n   */\n  public val marginRight: Float,\n  /**\n   * Defines the margin to the bottom that the scale bar honors. Default value: 4. This property is\n   * specified in pixels.\n   */\n  public val marginBottom: Float,\n  /**\n   * Defines text color of the scale bar. Default value: \"black\".\n   */\n  public val textColor: Int,\n  /**\n   * Defines primary color of the scale bar. Default value: \"black\".\n   */\n  public val primaryColor: Int,\n  /**\n   * Defines secondary color of the scale bar. Default value: \"white\".\n   */\n  public val secondaryColor: Int,\n  /**\n   * Defines width of the border for the scale bar. Default value: 2. This property is specified in\n   * pixels.\n   */\n  public val borderWidth: Float,\n  /**\n   * Defines height of the scale bar. Default value: 2. This property is specified in pixels.\n   */\n  public val height: Float,\n  /**\n   * Defines margin of the text bar of the scale bar. Default value: 8. This property is specified\n   * in pixels.\n   */\n  public val textBarMargin: Float,\n  /**\n   * Defines text border width of the scale bar. Default value: 2. This property is specified in\n   * pixels.\n   */\n  public val textBorderWidth: Float,\n  /**\n   * Defines text size of the scale bar. Default value: 8. This property is specified in pixels.\n   */\n  public val textSize: Float,\n  /**\n   * Whether the scale bar is using metric unit. True if the scale bar is using metric system, false\n   * if the scale bar is using imperial units. Default value: true.\n   */\n  public val isMetricUnits: Boolean,\n  /**\n   * Configures minimum refresh interval, in millisecond, default is 15. Default value: 15.\n   */\n  public val refreshInterval: Long,\n  /**\n   * Configures whether to show the text border or not, default is true. Default value: true.\n   */\n  public val showTextBorder: Boolean,\n  /**\n   * configures ratio of scale bar max width compared with MapView width, default is 0.5. Default\n   * value: 0.5.\n   */\n  public val ratio: Float,\n  /**\n   * If set to True scale bar will be triggering onDraw depending on\n   * [ScaleBarSettings.refreshInterval] even if actual data did not change. If set to False scale bar\n   * will redraw only on demand. Defaults to False and should not be changed explicitly in most cases.\n   * Could be set to True to produce correct GPU frame metrics when running gfxinfo command. Default\n   * value: false.\n   */\n  public val useContinuousRendering: Boolean,\n\n  /**\n   * The type of the distance unit the scale bar displays in. Default value: \"metric\".\n   */\n  public val distanceUnits: DistanceUnits\n) : Parcelable {\n  /**\n   * Overloaded toString function.\n   */\n  public override fun toString() = \"\"\"ScaleBarSettings(enabled=$enabled, position=$position,\n      marginLeft=$marginLeft, marginTop=$marginTop, marginRight=$marginRight,\n      marginBottom=$marginBottom, textColor=$textColor, primaryColor=$primaryColor,\n      secondaryColor=$secondaryColor, borderWidth=$borderWidth, height=$height,\n      textBarMargin=$textBarMargin, textBorderWidth=$textBorderWidth, textSize=$textSize,\n      isMetricUnits=$isMetricUnits, refreshInterval=$refreshInterval,\n      showTextBorder=$showTextBorder, ratio=$ratio,\n      useContinuousRendering=$useContinuousRendering, distanceUnits=$distanceUnits)\"\"\".trimIndent()\n\n  /**\n   * Overloaded equals function.\n   */\n  public override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (javaClass != other?.javaClass) return false\n    other as ScaleBarSettings\n    return enabled == other.enabled && position == other.position &&\n        marginLeft.compareTo(other.marginLeft) == 0 && marginTop.compareTo(other.marginTop) == 0 &&\n        marginRight.compareTo(other.marginRight) == 0 &&\n        marginBottom.compareTo(other.marginBottom) == 0 && textColor == other.textColor &&\n        primaryColor == other.primaryColor && secondaryColor == other.secondaryColor &&\n        borderWidth.compareTo(other.borderWidth) == 0 && height.compareTo(other.height) == 0 &&\n        textBarMargin.compareTo(other.textBarMargin) == 0 &&\n        textBorderWidth.compareTo(other.textBorderWidth) == 0 &&\n        textSize.compareTo(other.textSize) == 0 && isMetricUnits == other.isMetricUnits &&\n        refreshInterval == other.refreshInterval && showTextBorder == other.showTextBorder &&\n        ratio.compareTo(other.ratio) == 0 && useContinuousRendering == other.useContinuousRendering &&\n        distanceUnits == other.distanceUnits\n  }\n\n  /**\n   * Overloaded hashCode function based on all class properties.\n   */\n  public override fun hashCode(): Int = Objects.hash(enabled, position, marginLeft, marginTop,\n      marginRight, marginBottom, textColor, primaryColor, secondaryColor, borderWidth, height,\n      textBarMargin, textBorderWidth, textSize, isMetricUnits, refreshInterval, showTextBorder,\n      ratio, useContinuousRendering, distanceUnits)\n\n  /**\n   * Convert to Builder allowing to change class properties.\n   */\n  public fun toBuilder(): Builder = Builder() .setEnabled(enabled) .setPosition(position)\n      .setMarginLeft(marginLeft) .setMarginTop(marginTop) .setMarginRight(marginRight)\n      .setMarginBottom(marginBottom) .setTextColor(textColor) .setPrimaryColor(primaryColor)\n      .setSecondaryColor(secondaryColor) .setBorderWidth(borderWidth) .setHeight(height)\n      .setTextBarMargin(textBarMargin) .setTextBorderWidth(textBorderWidth) .setTextSize(textSize)\n      .setIsMetricUnits(isMetricUnits) .setRefreshInterval(refreshInterval)\n      .setShowTextBorder(showTextBorder) .setRatio(ratio)\n      .setUseContinuousRendering(useContinuousRendering)\n      .setDistanceUnits(distanceUnits)\n\n  /**\n   * Composes and builds a [ScaleBarSettings] object.\n   *\n   * This is a concrete implementation of the builder design pattern.\n   */\n  public class Builder {\n    /**\n     * Whether the scale is visible on the map. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var enabled: Boolean = true\n\n    /**\n     * Defines where the scale bar is positioned on the map Default value: \"top-left\".\n     */\n    @set:JvmSynthetic\n    public var position: Int = Gravity.TOP or Gravity.START\n\n    /**\n     * Defines the margin to the left that the scale bar honors. Default value: 4. This property is\n     * specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginLeft: Float = 4f\n\n    /**\n     * Defines the margin to the top that the scale bar honors. Default value: 4. This property is\n     * specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginTop: Float = 4f\n\n    /**\n     * Defines the margin to the right that the scale bar honors. Default value: 4. This property is\n     * specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginRight: Float = 4f\n\n    /**\n     * Defines the margin to the bottom that the scale bar honors. Default value: 4. This property\n     * is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var marginBottom: Float = 4f\n\n    /**\n     * Defines text color of the scale bar. Default value: \"black\".\n     */\n    @set:JvmSynthetic\n    public var textColor: Int = Color.BLACK\n\n    /**\n     * Defines primary color of the scale bar. Default value: \"black\".\n     */\n    @set:JvmSynthetic\n    public var primaryColor: Int = Color.BLACK\n\n    /**\n     * Defines secondary color of the scale bar. Default value: \"white\".\n     */\n    @set:JvmSynthetic\n    public var secondaryColor: Int = Color.WHITE\n\n    /**\n     * Defines width of the border for the scale bar. Default value: 2. This property is specified\n     * in pixels.\n     */\n    @set:JvmSynthetic\n    public var borderWidth: Float = 2f\n\n    /**\n     * Defines height of the scale bar. Default value: 2. This property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var height: Float = 2f\n\n    /**\n     * Defines margin of the text bar of the scale bar. Default value: 8. This property is specified\n     * in pixels.\n     */\n    @set:JvmSynthetic\n    public var textBarMargin: Float = 8f\n\n    /**\n     * Defines text border width of the scale bar. Default value: 2. This property is specified in\n     * pixels.\n     */\n    @set:JvmSynthetic\n    public var textBorderWidth: Float = 2f\n\n    /**\n     * Defines text size of the scale bar. Default value: 8. This property is specified in pixels.\n     */\n    @set:JvmSynthetic\n    public var textSize: Float = 8f\n\n    /**\n     * Whether the scale bar is using metric unit. True if the scale bar is using metric system,\n     * false if the scale bar is using imperial units. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var isMetricUnits: Boolean = true\n\n    /**\n     * Configures minimum refresh interval, in millisecond, default is 15. Default value: 15.\n     */\n    @set:JvmSynthetic\n    public var refreshInterval: Long = 15\n\n    /**\n     * Configures whether to show the text border or not, default is true. Default value: true.\n     */\n    @set:JvmSynthetic\n    public var showTextBorder: Boolean = true\n\n    /**\n     * configures ratio of scale bar max width compared with MapView width, default is 0.5. Default\n     * value: 0.5.\n     */\n    @set:JvmSynthetic\n    public var ratio: Float = 0.5f\n\n    /**\n     * If set to True scale bar will be triggering onDraw depending on\n     * [ScaleBarSettings.refreshInterval] even if actual data did not change. If set to False scale bar\n     * will redraw only on demand. Defaults to False and should not be changed explicitly in most\n     * cases. Could be set to True to produce correct GPU frame metrics when running gfxinfo command.\n     * Default value: false.\n     */\n    @set:JvmSynthetic\n    public var useContinuousRendering: Boolean = false\n\n    /**\n     * The type of the distance unit the scale bar displays in. Default value: \"metric\".\n     */\n    @set:JvmSynthetic\n    public var distanceUnits: DistanceUnits = DistanceUnits.METRIC\n\n    /**\n     * Setter for enabled: whether the scale is visible on the map. Default value: true.\n     *\n     * @param enabled\n     * @return Builder\n     */\n    public fun setEnabled(enabled: Boolean): Builder {\n      this.enabled = enabled\n      return this\n    }\n\n    /**\n     * Setter for position: defines where the scale bar is positioned on the map Default value:\n     * \"top-left\".\n     *\n     * @param position\n     * @return Builder\n     */\n    public fun setPosition(position: Int): Builder {\n      this.position = position\n      return this\n    }\n\n    /**\n     * Setter for marginLeft: defines the margin to the left that the scale bar honors. Default\n     * value: 4. This property is specified in pixels.\n     *\n     * @param marginLeft\n     * @return Builder\n     */\n    public fun setMarginLeft(marginLeft: Float): Builder {\n      this.marginLeft = marginLeft\n      return this\n    }\n\n    /**\n     * Setter for marginTop: defines the margin to the top that the scale bar honors. Default value:\n     * 4. This property is specified in pixels.\n     *\n     * @param marginTop\n     * @return Builder\n     */\n    public fun setMarginTop(marginTop: Float): Builder {\n      this.marginTop = marginTop\n      return this\n    }\n\n    /**\n     * Setter for marginRight: defines the margin to the right that the scale bar honors. Default\n     * value: 4. This property is specified in pixels.\n     *\n     * @param marginRight\n     * @return Builder\n     */\n    public fun setMarginRight(marginRight: Float): Builder {\n      this.marginRight = marginRight\n      return this\n    }\n\n    /**\n     * Setter for marginBottom: defines the margin to the bottom that the scale bar honors. Default\n     * value: 4. This property is specified in pixels.\n     *\n     * @param marginBottom\n     * @return Builder\n     */\n    public fun setMarginBottom(marginBottom: Float): Builder {\n      this.marginBottom = marginBottom\n      return this\n    }\n\n    /**\n     * Setter for textColor: defines text color of the scale bar. Default value: \"black\".\n     *\n     * @param textColor\n     * @return Builder\n     */\n    public fun setTextColor(textColor: Int): Builder {\n      this.textColor = textColor\n      return this\n    }\n\n    /**\n     * Setter for primaryColor: defines primary color of the scale bar. Default value: \"black\".\n     *\n     * @param primaryColor\n     * @return Builder\n     */\n    public fun setPrimaryColor(primaryColor: Int): Builder {\n      this.primaryColor = primaryColor\n      return this\n    }\n\n    /**\n     * Setter for secondaryColor: defines secondary color of the scale bar. Default value: \"white\".\n     *\n     * @param secondaryColor\n     * @return Builder\n     */\n    public fun setSecondaryColor(secondaryColor: Int): Builder {\n      this.secondaryColor = secondaryColor\n      return this\n    }\n\n    /**\n     * Setter for borderWidth: defines width of the border for the scale bar. Default value: 2. This\n     * property is specified in pixels.\n     *\n     * @param borderWidth\n     * @return Builder\n     */\n    public fun setBorderWidth(borderWidth: Float): Builder {\n      this.borderWidth = borderWidth\n      return this\n    }\n\n    /**\n     * Setter for height: defines height of the scale bar. Default value: 2. This property is\n     * specified in pixels.\n     *\n     * @param height\n     * @return Builder\n     */\n    public fun setHeight(height: Float): Builder {\n      this.height = height\n      return this\n    }\n\n    /**\n     * Setter for textBarMargin: defines margin of the text bar of the scale bar. Default value: 8.\n     * This property is specified in pixels.\n     *\n     * @param textBarMargin\n     * @return Builder\n     */\n    public fun setTextBarMargin(textBarMargin: Float): Builder {\n      this.textBarMargin = textBarMargin\n      return this\n    }\n\n    /**\n     * Setter for textBorderWidth: defines text border width of the scale bar. Default value: 2.\n     * This property is specified in pixels.\n     *\n     * @param textBorderWidth\n     * @return Builder\n     */\n    public fun setTextBorderWidth(textBorderWidth: Float): Builder {\n      this.textBorderWidth = textBorderWidth\n      return this\n    }\n\n    /**\n     * Setter for textSize: defines text size of the scale bar. Default value: 8. This property is\n     * specified in pixels.\n     *\n     * @param textSize\n     * @return Builder\n     */\n    public fun setTextSize(textSize: Float): Builder {\n      this.textSize = textSize\n      return this\n    }\n\n    /**\n     * Setter for isMetricUnits: whether the scale bar is using metric unit. True if the scale bar\n     * is using metric system, false if the scale bar is using imperial units. Default value: true.\n     *\n     * @param isMetricUnits\n     * @return Builder\n     */\n    @Deprecated(message = \"Use setDistanceUnits() instead.\")\n    public fun setIsMetricUnits(isMetricUnits: Boolean): Builder {\n      this.isMetricUnits = isMetricUnits\n      this.distanceUnits = if (isMetricUnits) DistanceUnits.METRIC else DistanceUnits.IMPERIAL\n      return this\n    }\n\n    /**\n     * Setter for refreshInterval: configures minimum refresh interval, in millisecond, default is\n     * 15. Default value: 15.\n     *\n     * @param refreshInterval\n     * @return Builder\n     */\n    public fun setRefreshInterval(refreshInterval: Long): Builder {\n      this.refreshInterval = refreshInterval\n      return this\n    }\n\n    /**\n     * Setter for showTextBorder: configures whether to show the text border or not, default is\n     * true. Default value: true.\n     *\n     * @param showTextBorder\n     * @return Builder\n     */\n    public fun setShowTextBorder(showTextBorder: Boolean): Builder {\n      this.showTextBorder = showTextBorder\n      return this\n    }\n\n    /**\n     * Setter for ratio: configures ratio of scale bar max width compared with MapView width,\n     * default is 0.5. Default value: 0.5.\n     *\n     * @param ratio\n     * @return Builder\n     */\n    public fun setRatio(ratio: Float): Builder {\n      this.ratio = ratio\n      return this\n    }\n\n    /**\n     * Setter for useContinuousRendering: if set to True scale bar will be triggering onDraw\n     * depending on [ScaleBarSettings.refreshInterval] even if actual data did not change. If set to\n     * False scale bar will redraw only on demand. Defaults to False and should not be changed\n     * explicitly in most cases. Could be set to True to produce correct GPU frame metrics when running\n     * gfxinfo command. Default value: false.\n     *\n     * @param useContinuousRendering\n     * @return Builder\n     */\n    public fun setUseContinuousRendering(useContinuousRendering: Boolean): Builder {\n      this.useContinuousRendering = useContinuousRendering\n      return this\n    }\n\n    /**\n     * The type of the distance unit the scale bar displays in. Default value: \"metric\".\n     *\n     * @param units\n     * @return Builder\n     */\n    public fun setDistanceUnits(units: DistanceUnits): Builder {\n      this.distanceUnits = units\n      this.isMetricUnits = units == DistanceUnits.METRIC\n      return this\n    }\n\n    /**\n     * Returns a [ScaleBarSettings] reference to the object being constructed by the builder.\n     *\n     * @return ScaleBarSettings\n     */\n    public fun build(): ScaleBarSettings = ScaleBarSettings(enabled, position, marginLeft,\n        marginTop, marginRight, marginBottom, textColor, primaryColor, secondaryColor, borderWidth,\n        height, textBarMargin, textBorderWidth, textSize, isMetricUnits, refreshInterval,\n        showTextBorder, ratio, useContinuousRendering, distanceUnits)\n  }\n}\n\n/**\n * Creates a [ScaleBarSettings] through a DSL-style builder.\n *\n * @param initializer the initialisation block\n * @return ScaleBarSettings\n */\n@JvmSynthetic\npublic fun ScaleBarSettings(initializer: ScaleBarSettings.Builder.() -> Unit): ScaleBarSettings =\n    ScaleBarSettings.Builder().apply(initializer).build()\n"
  },
  {
    "path": "sdk-base/src/main/res/values/strings.xml",
    "content": "<resources>\n</resources>"
  },
  {
    "path": "sdk-base/src/test/java/com/mapbox/maps/EqualsHashCodeTest.kt",
    "content": "package com.mapbox.maps\n\nimport com.mapbox.geojson.Feature\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.interactions.FeatureState\nimport com.mapbox.maps.interactions.FeatureStateKey\nimport com.mapbox.maps.interactions.FeaturesetFeature\nimport com.mapbox.maps.interactions.TypedFeaturesetDescriptor\nimport com.mapbox.maps.plugin.Plugin\nimport com.mapbox.maps.plugin.animation.CameraAnimatorOptions\nimport com.mapbox.maps.plugin.animation.MapAnimationOptions\nimport com.mapbox.maps.plugin.annotation.ClusterFeature\nimport com.mapbox.maps.plugin.attribution.generated.AttributionSettings\nimport com.mapbox.maps.plugin.compass.generated.CompassSettings\nimport com.mapbox.maps.plugin.gestures.generated.GesturesSettings\nimport com.mapbox.maps.plugin.locationcomponent.generated.LocationComponentSettings\nimport com.mapbox.maps.plugin.logo.generated.LogoSettings\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings\nimport com.mapbox.maps.plugin.viewport.ViewportStatus\nimport com.mapbox.maps.plugin.viewport.data.DefaultViewportTransitionOptions\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateBearing\nimport com.mapbox.maps.plugin.viewport.data.FollowPuckViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.OverviewViewportStateOptions\nimport com.mapbox.maps.plugin.viewport.data.ViewportOptions\nimport nl.jqno.equalsverifier.EqualsVerifier\nimport nl.jqno.equalsverifier.Warning\nimport org.junit.Test\n\nclass EqualsHashCodeTest {\n  @Test\n  fun `CameraAnimatorOptions hashCode and equals test`() {\n    val clazz = CameraAnimatorOptions::class.java\n    EqualsVerifier.forClass(clazz)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `MapAnimationOptions hashCode and equals test`() {\n    val clazz = MapAnimationOptions::class.java\n    EqualsVerifier.forClass(clazz)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `Plugin hashCode and equals test`() {\n    val clazz = Plugin::class.java\n    EqualsVerifier.forClass(clazz)\n      .withIgnoredFields(\"instance\")\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `DefaultViewportTransitionOptions hashCode and equals test`() {\n    EqualsVerifier.forClass(DefaultViewportTransitionOptions::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `FollowPuckViewportStateOptions hashCode and equals test`() {\n    EqualsVerifier.forClass(FollowPuckViewportStateOptions::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `FollowPuckViewportStateBearing hashCode and equals test`() {\n    EqualsVerifier.forClass(FollowPuckViewportStateBearing::class.java)\n      .usingGetClass()\n      .suppress(Warning.INHERITED_DIRECTLY_FROM_OBJECT)\n      .verify()\n  }\n\n  @Test\n  fun `ViewportStatus hashCode and equals test`() {\n    EqualsVerifier.forClass(ViewportStatus::class.java)\n      .usingGetClass()\n      .suppress(Warning.INHERITED_DIRECTLY_FROM_OBJECT)\n      .verify()\n  }\n\n  @Test\n  fun `OverviewViewportStateOptions hashCode and equals test`() {\n    EqualsVerifier.forClass(OverviewViewportStateOptions::class.java)\n      .usingGetClass()\n      .verify()\n  }\n  @Test\n  fun `ViewportPluginOptions hashCode and equals test`() {\n    EqualsVerifier.forClass(ViewportOptions::class.java)\n      .usingGetClass()\n      .suppress(Warning.INHERITED_DIRECTLY_FROM_OBJECT)\n      .verify()\n  }\n  @Test\n  fun `ImageHolder hashCode and equals test`() {\n    EqualsVerifier.forClass(ImageHolder::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `AttributionSettings hashCode and equals test`() {\n    EqualsVerifier.forClass(AttributionSettings::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `CompassSettings hashCode and equals test`() {\n    EqualsVerifier.forClass(CompassSettings::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `GesturesSettings hashCode and equals test`() {\n    EqualsVerifier.forClass(GesturesSettings::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `LocationComponentSettings hashCode and equals test`() {\n    EqualsVerifier.forClass(LocationComponentSettings::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `LogoSettings hashCode and equals test`() {\n    EqualsVerifier.forClass(LogoSettings::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `ScaleBarSettings hashCode and equals test`() {\n    EqualsVerifier.forClass(ScaleBarSettings::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @Test\n  fun `ClusterFeature hashCode and equals test`() {\n    EqualsVerifier.forClass(ClusterFeature::class.java)\n      .usingGetClass()\n      .withPrefabValues(\n        Feature::class.java,\n        Feature.fromGeometry(Point.fromLngLat(0.0, 0.0)),\n        Feature.fromGeometry(Point.fromLngLat(1.0, 1.0)),\n      )\n      .verify()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun `FeatureState hashCode and equals test`() {\n    EqualsVerifier.forClass(FeatureState::class.java)\n      .usingGetClass()\n      .verify()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun `TypedFeaturesetDescriptor hashCode and equals test`() {\n    EqualsVerifier.forClass(TypedFeaturesetDescriptor::class.java)\n      .usingGetClass()\n      .suppress(Warning.INHERITED_DIRECTLY_FROM_OBJECT)\n      .verify()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun `FeaturesetFeature hashCode and equals test`() {\n    EqualsVerifier.forClass(FeaturesetFeature::class.java)\n      .usingGetClass()\n      .suppress(Warning.INHERITED_DIRECTLY_FROM_OBJECT)\n      // ignore public fields built from Feature\n      .withIgnoredFields(\"geometry\", \"properties\\$delegate\")\n      .withPrefabValues(\n        Feature::class.java,\n        Feature.fromGeometry(Point.fromLngLat(0.0, 0.0)),\n        Feature.fromGeometry(Point.fromLngLat(1.0, 1.0)),\n      ).verify()\n  }\n\n  @OptIn(MapboxExperimental::class)\n  @Test\n  fun `FeatureStateKey hashCode and equals test`() {\n    EqualsVerifier.forClass(FeatureStateKey::class.java)\n      .usingGetClass()\n      .verify()\n  }\n}"
  },
  {
    "path": "sdk-base/src/test/java/com/mapbox/maps/dsl/CameraOptionsKtxTest.kt",
    "content": "package com.mapbox.maps.dsl\n\nimport com.mapbox.geojson.Point\nimport com.mapbox.maps.CameraOptions\nimport com.mapbox.maps.CameraState\nimport com.mapbox.maps.EdgeInsets\nimport org.junit.Assert\nimport org.junit.Test\n\nclass CameraOptionsKtxTest {\n\n  @Test\n  fun `cameraOptions with mutation`() {\n    val expected = CameraState(\n      Point.fromLngLat(10.0, 20.0),\n      EdgeInsets(1.0, 2.0, 3.0, 4.0),\n      5.0,\n      6.0,\n      7.0,\n    )\n\n    val result = cameraOptions {\n      center(expected.center)\n      padding(expected.padding)\n      zoom(expected.zoom)\n      bearing(expected.bearing)\n      pitch(expected.pitch)\n    }\n\n    Assert.assertEquals(expected.center, result.center)\n    Assert.assertEquals(expected.padding, result.padding)\n    Assert.assertEquals(expected.zoom, result.zoom)\n    Assert.assertEquals(expected.bearing, result.bearing)\n    Assert.assertEquals(expected.pitch, result.pitch)\n  }\n\n  @Test\n  fun `cameraOptions without mutation is equal to the base cameraState`() {\n    val expected = CameraState(\n      Point.fromLngLat(10.0, 20.0),\n      EdgeInsets(1.0, 2.0, 3.0, 4.0),\n      5.0,\n      6.0,\n      7.0,\n    )\n\n    val result = cameraOptions(expected) {\n      // no impl\n    }\n\n    Assert.assertEquals(expected.center, result.center)\n    Assert.assertEquals(expected.padding, result.padding)\n    Assert.assertEquals(expected.zoom, result.zoom)\n    Assert.assertEquals(expected.bearing, result.bearing)\n    Assert.assertEquals(expected.pitch, result.pitch)\n  }\n\n  @Test\n  fun `cameraOptions with mutation on a base cameraState`() {\n    val base = CameraState(\n      Point.fromLngLat(10.0, 20.0),\n      EdgeInsets(1.0, 2.0, 3.0, 4.0),\n      5.0,\n      6.0,\n      7.0\n    )\n    val expected = CameraOptions.Builder()\n      .center(Point.fromLngLat(20.0, 30.0))\n      .padding(EdgeInsets(8.0, 9.0, 10.0, 11.0))\n      .zoom(12.0)\n      .bearing(13.0)\n      .pitch(14.0)\n      .build()\n\n    val result = cameraOptions(base) {\n      center(expected.center)\n      padding(expected.padding)\n      zoom(expected.zoom)\n      bearing(expected.bearing)\n      pitch(expected.pitch)\n    }\n\n    Assert.assertEquals(expected, result)\n  }\n}"
  },
  {
    "path": "sdk-base/src/test/java/com/mapbox/maps/plugin/scalebar/ScaleBarSettingsUnitsTest.kt",
    "content": "package com.mapbox.maps.plugin.scalebar\n\nimport com.mapbox.maps.plugin.DistanceUnits\nimport com.mapbox.maps.plugin.scalebar.generated.ScaleBarSettings\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\n\n/**\n * Tests for the interaction between isMetricUnits and units properties in ScaleBarSettings.\n * This ensures backward compatibility with the deprecated isMetricUnits property while\n * supporting the new units property.\n */\nclass ScaleBarSettingsUnitsTest {\n\n  @Test\n  fun testIsMetricUnitsToUnitsInteraction() {\n    val builder = ScaleBarSettings.Builder()\n\n    // Test setting isMetricUnits to true sets units to METRIC\n    builder.setIsMetricUnits(true)\n    val metricSettings = builder.build()\n    assertEquals(\"Setting isMetricUnits to true should set units to METRIC\", DistanceUnits.METRIC, metricSettings.distanceUnits)\n    assertTrue(\"isMetricUnits should remain true\", metricSettings.isMetricUnits)\n\n    // Test setting isMetricUnits to false sets units to IMPERIAL\n    builder.setIsMetricUnits(false)\n    val imperialSettings = builder.build()\n    assertEquals(\"Setting isMetricUnits to false should set units to IMPERIAL\", DistanceUnits.IMPERIAL, imperialSettings.distanceUnits)\n    assertFalse(\"isMetricUnits should remain false\", imperialSettings.isMetricUnits)\n  }\n\n  @Test\n  fun testUnitsToIsMetricUnitsInteraction() {\n    val builder = ScaleBarSettings.Builder()\n\n    // Test setting distanceUnits to METRIC sets isMetricUnits to true\n    builder.setDistanceUnits(DistanceUnits.METRIC)\n    val metricSettings = builder.build()\n    assertTrue(\"Setting distanceUnits to METRIC should set isMetricUnits to true\", metricSettings.isMetricUnits)\n    assertEquals(\"distanceUnits should remain METRIC\", DistanceUnits.METRIC, metricSettings.distanceUnits)\n\n    // Test setting distanceUnits to IMPERIAL sets isMetricUnits to false\n    builder.setDistanceUnits(DistanceUnits.IMPERIAL)\n    val imperialSettings = builder.build()\n    assertFalse(\"Setting distanceUnits to IMPERIAL should set isMetricUnits to false\", imperialSettings.isMetricUnits)\n    assertEquals(\"distanceUnits should remain IMPERIAL\", DistanceUnits.IMPERIAL, imperialSettings.distanceUnits)\n\n    // Test setting distanceUnits to NAUTICAL sets isMetricUnits to false\n    builder.setDistanceUnits(DistanceUnits.NAUTICAL)\n    val nauticalSettings = builder.build()\n    assertFalse(\"Setting distanceUnits to NAUTICAL should set isMetricUnits to false\", nauticalSettings.isMetricUnits)\n    assertEquals(\"distanceUnits should remain NAUTICAL\", DistanceUnits.NAUTICAL, nauticalSettings.distanceUnits)\n  }\n\n  @Test\n  fun testScaleBarSettingsInitialization() {\n    // Test default initialization\n    val defaultBuilder = ScaleBarSettings.Builder()\n    val defaultSettings = defaultBuilder.build()\n    assertEquals(\"Default distanceUnits should be METRIC\", DistanceUnits.METRIC, defaultSettings.distanceUnits)\n    assertTrue(\"Default isMetricUnits should be true for metric distanceUnits\", defaultSettings.isMetricUnits)\n\n    // Test initialization with isMetricUnits false\n    val imperialBuilder = ScaleBarSettings.Builder().setIsMetricUnits(false)\n    val imperialSettings = imperialBuilder.build()\n    assertEquals(\"isMetricUnits false should result in IMPERIAL distanceUnits\", DistanceUnits.IMPERIAL, imperialSettings.distanceUnits)\n    assertFalse(\"isMetricUnits should be false\", imperialSettings.isMetricUnits)\n\n    // Test initialization with explicit distanceUnits\n    val nauticalBuilder = ScaleBarSettings.Builder().setDistanceUnits(DistanceUnits.NAUTICAL)\n    val nauticalSettings = nauticalBuilder.build()\n    assertEquals(\"Explicit distanceUnits should be preserved\", DistanceUnits.NAUTICAL, nauticalSettings.distanceUnits)\n    assertFalse(\"isMetricUnits should be false for nautical distanceUnits\", nauticalSettings.isMetricUnits)\n  }\n\n  @Test\n  fun testScaleBarUnitsBackwardCompatibility() {\n    val builder = ScaleBarSettings.Builder()\n\n    // Simulate legacy code setting isMetricUnits\n    builder.setIsMetricUnits(true)\n    var settings = builder.build()\n    assertEquals(\"Legacy isMetricUnits=true should work with new distanceUnits property\", DistanceUnits.METRIC, settings.distanceUnits)\n\n    builder.setIsMetricUnits(false)\n    settings = builder.build()\n    assertEquals(\"Legacy isMetricUnits=false should work with new distanceUnits property\", DistanceUnits.IMPERIAL, settings.distanceUnits)\n\n    // Simulate new code setting distanceUnits while legacy property exists\n    builder.setDistanceUnits(DistanceUnits.NAUTICAL)\n    settings = builder.build()\n    assertFalse(\"New distanceUnits=NAUTICAL should update legacy isMetricUnits property\", settings.isMetricUnits)\n\n    builder.setDistanceUnits(DistanceUnits.METRIC)\n    settings = builder.build()\n    assertTrue(\"New distanceUnits=METRIC should update legacy isMetricUnits property\", settings.isMetricUnits)\n\n    builder.setDistanceUnits(DistanceUnits.IMPERIAL)\n    settings = builder.build()\n    assertFalse(\"New distanceUnits=IMPERIAL should update legacy isMetricUnits property\", settings.isMetricUnits)\n  }\n\n  @Test\n  fun testChainedBuilderCalls() {\n    // Test that chained builder calls work correctly\n    val settings = ScaleBarSettings.Builder()\n      .setIsMetricUnits(false)\n      .setDistanceUnits(DistanceUnits.NAUTICAL)\n      .build()\n\n    assertEquals(\"Final distanceUnits should be NAUTICAL\", DistanceUnits.NAUTICAL, settings.distanceUnits)\n    assertFalse(\"Final isMetricUnits should be false for nautical distanceUnits\", settings.isMetricUnits)\n  }\n\n  @Test\n  fun testBuilderPropertyConsistency() {\n    val builder = ScaleBarSettings.Builder()\n\n    // Set distanceUnits first, then check builder properties\n    builder.setDistanceUnits(DistanceUnits.IMPERIAL)\n    assertEquals(\"Builder distanceUnits property should be IMPERIAL\", DistanceUnits.IMPERIAL, builder.distanceUnits)\n    assertFalse(\"Builder isMetricUnits property should be false\", builder.isMetricUnits)\n\n    // Set isMetricUnits, then check builder properties\n    builder.setIsMetricUnits(true)\n    assertEquals(\"Builder distanceUnits property should be METRIC\", DistanceUnits.METRIC, builder.distanceUnits)\n    assertTrue(\"Builder isMetricUnits property should be true\", builder.isMetricUnits)\n\n    // Set nautical distanceUnits, then check builder properties\n    builder.setDistanceUnits(DistanceUnits.NAUTICAL)\n    assertEquals(\"Builder distanceUnits property should be NAUTICAL\", DistanceUnits.NAUTICAL, builder.distanceUnits)\n    assertFalse(\"Builder isMetricUnits property should be false for nautical\", builder.isMetricUnits)\n  }\n\n  @Test\n  fun testDSLStyleBuilder() {\n    // Test DSL-style builder with distanceUnits interaction\n    val settings = ScaleBarSettings {\n      isMetricUnits = false\n      distanceUnits = DistanceUnits.NAUTICAL\n    }\n\n    assertEquals(\"DSL builder should result in NAUTICAL distanceUnits\", DistanceUnits.NAUTICAL, settings.distanceUnits)\n    assertFalse(\"DSL builder should result in isMetricUnits=false\", settings.isMetricUnits)\n  }\n\n  @Test\n  fun testToBuilderPreservesUnitsState() {\n    // Create settings with nautical units\n    val originalSettings = ScaleBarSettings.Builder()\n      .setDistanceUnits(DistanceUnits.NAUTICAL)\n      .build()\n\n    // Convert back to builder and build again\n    val newSettings = originalSettings.toBuilder().build()\n\n    assertEquals(\"toBuilder should preserve units\", DistanceUnits.NAUTICAL, newSettings.distanceUnits)\n    assertFalse(\"toBuilder should preserve isMetricUnits\", newSettings.isMetricUnits)\n    assertEquals(\"Settings should be equal\", originalSettings, newSettings)\n  }\n\n  @Test\n  fun testAllUnitsValues() {\n    val builder = ScaleBarSettings.Builder()\n\n    // Test all DistanceUnits enum values\n    for (unit in DistanceUnits.values()) {\n      builder.setDistanceUnits(unit)\n      val settings = builder.build()\n\n      assertEquals(\"DistanceUnits should be set correctly\", unit, settings.distanceUnits)\n\n      val expectedIsMetric = unit == DistanceUnits.METRIC\n      assertEquals(\"isMetricUnits should be correct for $unit\", expectedIsMetric, settings.isMetricUnits)\n    }\n  }\n}"
  },
  {
    "path": "sdk-base/src/test/java/com/mapbox/maps/util/MathUtilsTest.kt",
    "content": "package com.mapbox.maps.util\n\nimport com.mapbox.maps.util.MathUtils.prepareOptimalBearingPath\nimport com.mapbox.maps.util.MathUtils.shortestRotation\nimport org.junit.Assert.assertArrayEquals\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\nprivate const val EPS = 0.0001\n\n@RunWith(Parameterized::class)\nclass PrepareOptimalBearingPathTest(\n  private val inputArray: DoubleArray,\n  private val expectedArray: DoubleArray,\n) {\n\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters\n    fun data() = listOf(\n      arrayOf(\n        doubleArrayOf(-0.0, -10.0, 10.0, 270.0, 560.0),\n        doubleArrayOf(0.0, -10.0, 10.0, -90.0, -160.0)\n      ),\n      arrayOf(doubleArrayOf(0.0, 90.0, 270.0), doubleArrayOf(0.0, 90.0, 270.0)),\n      arrayOf(doubleArrayOf(20.0, 720.0, 0.0), doubleArrayOf(20.0, 0.0, 0.0)),\n    )\n  }\n\n  @Test\n  fun checkPrepareOptimalBearingPath() {\n    val actualArray = prepareOptimalBearingPath(inputArray)\n    assertArrayEquals(expectedArray, actualArray, EPS)\n  }\n}\n\n@RunWith(Parameterized::class)\nclass ShortestRotationTest(private val actual: Double, private val expected: Double) {\n\n  companion object {\n    @JvmStatic\n    @Parameterized.Parameters\n    fun data() = listOf(\n      arrayOf(shortestRotation(0.0, 181.0), 360.0),\n      arrayOf(shortestRotation(0.0, 179.0), 0.0),\n      arrayOf(shortestRotation(0.0, 180.0), 0.0),\n\n      arrayOf(shortestRotation(50.0, 231.0), 410.0),\n      arrayOf(shortestRotation(50.0, 229.0), 50.0),\n      arrayOf(shortestRotation(50.0, 180.0), 50.0),\n    )\n  }\n\n  @Test\n  fun doesReturnValueDistance() {\n    assertEquals(expected, actual, EPS)\n  }\n}"
  },
  {
    "path": "settings.gradle.kts",
    "content": "// needed for Dokka 1.4\npluginManagement {\n  repositories {\n    gradlePluginPortal()\n    mavenCentral()\n  }\n  includeBuild(\"mapbox-convention-plugin\")\n}\n\ndependencyResolutionManagement {\n  versionCatalogs {\n    create(\"commonLibs\") {\n      from(files(\"gradle/commonlibs.versions.toml\"))\n    }\n    create(\"appsLibs\") {\n      from(files(\"gradle/apps.versions.toml\"))\n    }\n  }\n}\n\ninclude(\n  \":android-auto-app\",\n  \":compose-app\",\n  \":app\",\n  \":extension-androidauto\",\n  \":extension-compose\",\n  \":extension-style\",\n  \":extension-style-lint-rules\",\n  \":extension-localization\",\n  \":extension-style-app\",\n  \":plugin-lifecycle-lint-rules\",\n  \":module-telemetry\",\n  \":plugin-animation\",\n  \":plugin-annotation\",\n  \":plugin-attribution\",\n  \":plugin-compass\",\n  \":plugin-gestures\",\n  \":plugin-indoorselector\",\n  \":plugin-lifecycle\",\n  \":plugin-locationcomponent\",\n  \":plugin-logo\",\n  \":plugin-overlay\",\n  \":plugin-scalebar\",\n  \":plugin-viewport\",\n  \":maps-sdk\",\n  \":sdk-base\"\n)\nrootProject.name = \"Mapbox Maps Android\"\nrootProject.buildFileName = \"build.gradle.kts\"\n"
  }
]